├── .env.example ├── .github ├── FUNDING.yml └── workflows │ └── code-check.yml ├── .gitignore ├── README.md ├── biome.json ├── components.json ├── next.config.cjs ├── package.json ├── pnpm-lock.yaml ├── postcss.config.cjs ├── prisma └── schema.prisma ├── public ├── favicon.ico ├── googlea0f0548f4347733c.html └── og-image.png ├── src ├── app │ ├── (auth) │ │ ├── auth-callback │ │ │ └── page.tsx │ │ ├── layout.tsx │ │ ├── loading.tsx │ │ ├── signin │ │ │ └── page.tsx │ │ ├── signout │ │ │ └── page.tsx │ │ └── sso-callback │ │ │ └── page.tsx │ ├── (pages) │ │ ├── dashboard │ │ │ └── page.tsx │ │ ├── layout.tsx │ │ └── page.tsx │ ├── _trpc │ │ └── client.ts │ ├── api │ │ └── trpc │ │ │ └── [trpc] │ │ │ └── route.ts │ ├── error.tsx │ ├── layout.tsx │ ├── loading.tsx │ ├── not-found.tsx │ └── robots.ts ├── components │ ├── auth │ │ ├── auth-callback.tsx │ │ ├── logout-button.tsx │ │ ├── oauth-signin.tsx │ │ ├── sso-callback.tsx │ │ └── user-profile.tsx │ ├── code-block.tsx │ ├── copy-button.tsx │ ├── icons.tsx │ ├── layouts │ │ ├── site-footer.tsx │ │ └── site-header.tsx │ ├── profile.tsx │ ├── providers │ │ ├── theme-providers.tsx │ │ └── trpc-provider.tsx │ ├── svg-text.tsx │ ├── text-animation.tsx │ ├── theme-toggle.tsx │ └── ui │ │ ├── avatar.tsx │ │ ├── button.tsx │ │ ├── card.tsx │ │ ├── dropdown-menu.tsx │ │ ├── skeleton.tsx │ │ └── toaster.tsx ├── configs │ └── site.ts ├── db │ └── index.ts ├── env.mjs ├── google-analytics.tsx ├── hooks │ ├── use-mounted.tsx │ └── use-window.tsx ├── lib │ ├── gtags.ts │ └── utils.ts ├── middleware.ts ├── styles │ └── globals.css ├── trpc │ ├── index.ts │ └── trpc.ts └── types │ └── window.d.ts ├── tailwind.config.js ├── tailwind.config.ts └── tsconfig.json /.env.example: -------------------------------------------------------------------------------- 1 | 2 | # read the docs - https://clerk.com/docs/quickstarts/nextjs 3 | NEXT_PUBLIC_CLERK_PUBLISHABLE_KEY= 4 | CLERK_SECRET_KEY= 5 | 6 | 7 | # read the docs - https://www.prisma.io/docs/concepts/database-connectors/postgresql 8 | DATABASE_URL= 9 | 10 | # read this to get your google analytics id - https://support.google.com/analytics/answer/9539598?hl=en 11 | NEXT_PUBLIC_GOOGLE_ID= 12 | -------------------------------------------------------------------------------- /.github/FUNDING.yml: -------------------------------------------------------------------------------- 1 | github: [sujjeee] 2 | custom: ['https://buymeacoff.ee/sujjeee', 'https://www.paypal.me/sujjeee'] -------------------------------------------------------------------------------- /.github/workflows/code-check.yml: -------------------------------------------------------------------------------- 1 | name: Code check 2 | 3 | on: 4 | pull_request: 5 | branches: [ "*" ] 6 | 7 | env: 8 | NEXT_PUBLIC_CLERK_PUBLISHABLE_KEY: "fake" 9 | CLERK_SECRET_KEY: "fake" 10 | DATABASE_URL: "fake" 11 | NEXT_PUBLIC_GOOGLE_ID: "fake" 12 | 13 | jobs: 14 | quality: 15 | runs-on: ubuntu-latest 16 | name: Quality Check 17 | steps: 18 | - name: Checkout 19 | uses: actions/checkout@v4 20 | 21 | - name: Setup Biome 22 | uses: biomejs/setup-biome@v1 23 | with: 24 | version: 1.4.1 25 | 26 | - name: Run Biome 27 | run: biome ci . 28 | 29 | build: 30 | needs: quality 31 | runs-on: ubuntu-latest 32 | name: Build APP 33 | steps: 34 | - uses: actions/checkout@v3 35 | with: 36 | fetch-depth: 0 37 | 38 | - name: Install Node.js 39 | uses: actions/setup-node@v3 40 | with: 41 | node-version: 20 42 | 43 | - uses: pnpm/action-setup@v2.2.4 44 | name: Install pnpm 45 | id: pnpm-install 46 | with: 47 | version: 8.11.0 48 | run_install: false 49 | 50 | - name: Get pnpm store directory 51 | id: pnpm-cache 52 | run: | 53 | echo "pnpm_cache_dir=$(pnpm store path)" >> $GITHUB_OUTPUT 54 | 55 | - uses: actions/cache@v3 56 | name: Setup pnpm cache 57 | with: 58 | path: ${{ steps.pnpm-cache.outputs.pnpm_cache_dir }} 59 | key: ${{ runner.os }}-pnpm-store-${{ hashFiles('**/pnpm-lock.yaml') }} 60 | restore-keys: | 61 | ${{ runner.os }}-pnpm-store- 62 | 63 | - name: Install dependencies 64 | run: pnpm install 65 | 66 | - name: Build APP 67 | run: pnpm run build -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # See https://help.github.com/articles/ignoring-files/ for more about ignoring files. 2 | 3 | # dependencies 4 | /node_modules 5 | /.pnp 6 | .pnp.js 7 | 8 | # testing 9 | /coverage 10 | 11 | # next.js 12 | /.next/ 13 | /out/ 14 | 15 | # production 16 | /build 17 | 18 | # misc 19 | .DS_Store 20 | *.pem 21 | 22 | # debug 23 | npm-debug.log* 24 | yarn-debug.log* 25 | yarn-error.log* 26 | 27 | # local env files 28 | .env*.local 29 | .env 30 | 31 | # vercel 32 | .vercel 33 | 34 | # typescript 35 | *.tsbuildinfo 36 | next-env.d.ts 37 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # [CoDox](https://codox.vercel.app/) - starter template for modern web development ! 2 | 3 | 4 | 5 | CoDox – A starter template for modern web development with nextjs 13 (app route), tailwindcss, typescript, trpc, clerk auth, and prisma. 6 | 7 | 8 | 9 | ### A starter template for modern web development with nextjs 13 (app route), tailwindcss, typescript, trpc, clerk auth, and prisma. 10 | 11 | ## Tech Stacks 💻 12 | 13 | - ⚡ [Next.js](https://nextjs.org) 13 — The React framework with hybrid static & server rendering, and App Router 14 | - 🔥 [TypeScript](https://www.typescriptlang.org) — JavaScript with type safety and enhanced developer experience. 15 | - 💅 [Tailwind CSS](https://tailwindcss.com) — A utility-first CSS framework for rapid UI development 16 | - 🗃 [Shadcn UI](https://ui.shadcn.com/) — A collection of beautiful and accessible components built with Radix UI and Tailwind CSS. 17 | - 🌐 [tRPC](https://trpc.io) — A toolkit for building end-to-end typesafe APIs with Next.js and any database 18 | - 🔒 [Clerk](https://clerk.com?utm_source=github&utm_medium=sponsorship&utm_campaign=nextjs-boilerplate) — A complete user management solution with authentication, profiles, and more 19 | - 📦 [Prisma](https://www.prisma.io/) — A modern ORM for Node.js and TypeScript that simplifies database access 20 | - ♻️ [T3 Env](https://env.t3.gg/) — A library for managing type-safe environment variables in Next.js 21 | - 🛠 [BiomeJS](https://biomejs.dev/) — A tool for formatting, linting, and more in a fraction of a second. 22 | - 📊 [Google Analytics ](https://analytics.google.com/) — A web analytics service that tracks and reports website traffic 23 | 24 | ## Environment Variables 🌎 25 | 26 | To use clerk and analytics you need to add the following environment variables to your .env file: 27 | 28 | ```bash 29 | NEXT_PUBLIC_CLERK_PUBLISHABLE_KEY = 30 | CLERK_SECRET_KEY = 31 | DATABASE_URL = 32 | NEXT_PUBLIC_GOOGLE_ID = 33 | ``` 34 | 35 | ## Setup Locally 🚀 36 | 37 | 1. Clone the repository 38 | 39 | ```bash 40 | git clone https://github.com/sujjeee/codox.git 41 | ``` 42 | 43 | 2. Install dependencies using pnpm 44 | 45 | ```bash 46 | pnpm install 47 | ``` 48 | 49 | 3. Start the development server 50 | 51 | ```bash 52 | pnpm dev 53 | ``` 54 | 55 | ## Preview 👀 56 | 57 | See the preview — CoDox 58 | -------------------------------------------------------------------------------- /biome.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "https://biomejs.dev/schemas/1.4.1/schema.json", 3 | "organizeImports": { 4 | "enabled": true 5 | }, 6 | "overrides": [ 7 | { 8 | "ignore": ["node_modules", "dist"] 9 | } 10 | ], 11 | "linter": { 12 | "enabled": true, 13 | "rules": { 14 | "recommended": true, 15 | "nursery": { 16 | "recommended": true, 17 | "noUnusedImports": "warn", 18 | "useAwait": "warn" 19 | }, 20 | "a11y": { 21 | "noSvgWithoutTitle": "warn", 22 | "useAltText": "warn", 23 | "useButtonType": "warn", 24 | "useKeyWithClickEvents": "warn" 25 | }, 26 | "correctness": { 27 | "useExhaustiveDependencies": "warn" 28 | }, 29 | "performance": { 30 | "noDelete": "warn" 31 | }, 32 | "style": { 33 | "all": false 34 | }, 35 | "suspicious": { 36 | "noArrayIndexKey": "warn", 37 | "noAssignInExpressions": "warn", 38 | "noEmptyInterface": "off", 39 | "noExplicitAny": "warn" 40 | } 41 | } 42 | }, 43 | "vcs": { 44 | "clientKind": "git", 45 | "enabled": true, 46 | "useIgnoreFile": true 47 | }, 48 | "formatter": { 49 | "indentWidth": 2, 50 | "indentStyle": "space" 51 | }, 52 | "javascript": { 53 | "formatter": { 54 | "semicolons": "always", 55 | "trailingComma": "none", 56 | "bracketSpacing": true 57 | } 58 | } 59 | } 60 | -------------------------------------------------------------------------------- /components.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "https://ui.shadcn.com/schema.json", 3 | "style": "default", 4 | "rsc": true, 5 | "tsx": true, 6 | "tailwind": { 7 | "config": "tailwind.config.js", 8 | "css": "app/globals.css", 9 | "baseColor": "zinc", 10 | "cssVariables": true 11 | }, 12 | "aliases": { 13 | "components": "@/components", 14 | "utils": "@/lib/utils" 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /next.config.cjs: -------------------------------------------------------------------------------- 1 | import("./src/env.mjs"); 2 | 3 | /** @type {import('next').NextConfig} */ 4 | const nextConfig = {}; 5 | 6 | module.exports = nextConfig; 7 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "modern-tech-stacks-by-sujjeee", 3 | "version": "0.1.4", 4 | "private": true, 5 | "type": "module", 6 | "scripts": { 7 | "dev": "next dev", 8 | "build": "next build", 9 | "postinstall": "prisma generate", 10 | "start": "next start", 11 | "lint": "biome lint .", 12 | "lint:fix": "biome lint --apply-unsafe .", 13 | "format": "biome format .", 14 | "format:fix": "biome format --write .", 15 | "code-check": "biome check .", 16 | "code-check:fix": "biome check --apply-unsafe .", 17 | "biome:ci": "biome ci ." 18 | }, 19 | "dependencies": { 20 | "@clerk/nextjs": "^4.29.5", 21 | "@clerk/themes": "^1.7.9", 22 | "@clerk/types": "^3.60.0", 23 | "@prisma/client": "5.7.0", 24 | "@radix-ui/react-avatar": "^1.0.4", 25 | "@radix-ui/react-dropdown-menu": "^2.0.6", 26 | "@radix-ui/react-icons": "^1.3.0", 27 | "@radix-ui/react-slot": "^1.0.2", 28 | "@t3-oss/env-nextjs": "^0.7.3", 29 | "@tanstack/react-query": "^4.36.1", 30 | "@trpc/client": "^10.45.0", 31 | "@trpc/next": "^10.45.0", 32 | "@trpc/react-query": "^10.45.0", 33 | "@trpc/server": "^10.45.0", 34 | "class-variance-authority": "^0.7.0", 35 | "clsx": "^2.1.0", 36 | "framer-motion": "^10.18.0", 37 | "lucide-react": "^0.284.0", 38 | "next": "14.0.4", 39 | "next-themes": "^0.2.1", 40 | "react": "^18.2.0", 41 | "react-dom": "^18.2.0", 42 | "sonner": "^1.4.0", 43 | "tailwind-merge": "^1.14.0", 44 | "tailwindcss-animate": "^1.0.7", 45 | "zod": "^3.22.4" 46 | }, 47 | "devDependencies": { 48 | "@biomejs/biome": "^1.5.3", 49 | "@types/node": "^20.11.16", 50 | "@types/react": "^18.2.53", 51 | "@types/react-dom": "^18.2.18", 52 | "autoprefixer": "^10.4.17", 53 | "postcss": "^8.4.33", 54 | "prisma": "^5.9.1", 55 | "tailwindcss": "^3.4.1", 56 | "typescript": "^5.3.3" 57 | } 58 | } 59 | -------------------------------------------------------------------------------- /pnpm-lock.yaml: -------------------------------------------------------------------------------- 1 | lockfileVersion: '6.0' 2 | 3 | settings: 4 | autoInstallPeers: true 5 | excludeLinksFromLockfile: false 6 | 7 | dependencies: 8 | '@clerk/nextjs': 9 | specifier: ^4.29.5 10 | version: 4.29.5(next@14.0.4)(react-dom@18.2.0)(react@18.2.0) 11 | '@clerk/themes': 12 | specifier: ^1.7.9 13 | version: 1.7.9(react@18.2.0) 14 | '@clerk/types': 15 | specifier: ^3.60.0 16 | version: 3.60.0 17 | '@prisma/client': 18 | specifier: 5.7.0 19 | version: 5.7.0(prisma@5.9.1) 20 | '@radix-ui/react-avatar': 21 | specifier: ^1.0.4 22 | version: 1.0.4(@types/react-dom@18.2.18)(@types/react@18.2.53)(react-dom@18.2.0)(react@18.2.0) 23 | '@radix-ui/react-dropdown-menu': 24 | specifier: ^2.0.6 25 | version: 2.0.6(@types/react-dom@18.2.18)(@types/react@18.2.53)(react-dom@18.2.0)(react@18.2.0) 26 | '@radix-ui/react-icons': 27 | specifier: ^1.3.0 28 | version: 1.3.0(react@18.2.0) 29 | '@radix-ui/react-slot': 30 | specifier: ^1.0.2 31 | version: 1.0.2(@types/react@18.2.53)(react@18.2.0) 32 | '@t3-oss/env-nextjs': 33 | specifier: ^0.7.3 34 | version: 0.7.3(typescript@5.3.3)(zod@3.22.4) 35 | '@tanstack/react-query': 36 | specifier: ^4.36.1 37 | version: 4.36.1(react-dom@18.2.0)(react@18.2.0) 38 | '@trpc/client': 39 | specifier: ^10.45.0 40 | version: 10.45.0(@trpc/server@10.45.0) 41 | '@trpc/next': 42 | specifier: ^10.45.0 43 | version: 10.45.0(@tanstack/react-query@4.36.1)(@trpc/client@10.45.0)(@trpc/react-query@10.45.0)(@trpc/server@10.45.0)(next@14.0.4)(react-dom@18.2.0)(react@18.2.0) 44 | '@trpc/react-query': 45 | specifier: ^10.45.0 46 | version: 10.45.0(@tanstack/react-query@4.36.1)(@trpc/client@10.45.0)(@trpc/server@10.45.0)(react-dom@18.2.0)(react@18.2.0) 47 | '@trpc/server': 48 | specifier: ^10.45.0 49 | version: 10.45.0 50 | class-variance-authority: 51 | specifier: ^0.7.0 52 | version: 0.7.0 53 | clsx: 54 | specifier: ^2.1.0 55 | version: 2.1.0 56 | framer-motion: 57 | specifier: ^10.18.0 58 | version: 10.18.0(react-dom@18.2.0)(react@18.2.0) 59 | lucide-react: 60 | specifier: ^0.284.0 61 | version: 0.284.0(react@18.2.0) 62 | next: 63 | specifier: 14.0.4 64 | version: 14.0.4(react-dom@18.2.0)(react@18.2.0) 65 | next-themes: 66 | specifier: ^0.2.1 67 | version: 0.2.1(next@14.0.4)(react-dom@18.2.0)(react@18.2.0) 68 | react: 69 | specifier: ^18.2.0 70 | version: 18.2.0 71 | react-dom: 72 | specifier: ^18.2.0 73 | version: 18.2.0(react@18.2.0) 74 | sonner: 75 | specifier: ^1.4.0 76 | version: 1.4.0(react-dom@18.2.0)(react@18.2.0) 77 | tailwind-merge: 78 | specifier: ^1.14.0 79 | version: 1.14.0 80 | tailwindcss-animate: 81 | specifier: ^1.0.7 82 | version: 1.0.7(tailwindcss@3.4.1) 83 | zod: 84 | specifier: ^3.22.4 85 | version: 3.22.4 86 | 87 | devDependencies: 88 | '@biomejs/biome': 89 | specifier: ^1.5.3 90 | version: 1.5.3 91 | '@types/node': 92 | specifier: ^20.11.16 93 | version: 20.11.16 94 | '@types/react': 95 | specifier: ^18.2.53 96 | version: 18.2.53 97 | '@types/react-dom': 98 | specifier: ^18.2.18 99 | version: 18.2.18 100 | autoprefixer: 101 | specifier: ^10.4.17 102 | version: 10.4.17(postcss@8.4.33) 103 | postcss: 104 | specifier: ^8.4.33 105 | version: 8.4.33 106 | prisma: 107 | specifier: ^5.9.1 108 | version: 5.9.1 109 | tailwindcss: 110 | specifier: ^3.4.1 111 | version: 3.4.1 112 | typescript: 113 | specifier: ^5.3.3 114 | version: 5.3.3 115 | 116 | packages: 117 | 118 | /@alloc/quick-lru@5.2.0: 119 | resolution: {integrity: sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==} 120 | engines: {node: '>=10'} 121 | 122 | /@babel/runtime@7.23.9: 123 | resolution: {integrity: sha512-0CX6F+BI2s9dkUqr08KFrAIZgNFj75rdBU/DjCyYLIaV/quFjkk6T+EJ2LkZHyZTbEV4L5p97mNkUsHl2wLFAw==} 124 | engines: {node: '>=6.9.0'} 125 | dependencies: 126 | regenerator-runtime: 0.14.1 127 | dev: false 128 | 129 | /@biomejs/biome@1.5.3: 130 | resolution: {integrity: sha512-yvZCa/g3akwTaAQ7PCwPWDCkZs3Qa5ONg/fgOUT9e6wAWsPftCjLQFPXBeGxPK30yZSSpgEmRCfpGTmVbUjGgg==} 131 | engines: {node: '>=14.*'} 132 | hasBin: true 133 | requiresBuild: true 134 | optionalDependencies: 135 | '@biomejs/cli-darwin-arm64': 1.5.3 136 | '@biomejs/cli-darwin-x64': 1.5.3 137 | '@biomejs/cli-linux-arm64': 1.5.3 138 | '@biomejs/cli-linux-arm64-musl': 1.5.3 139 | '@biomejs/cli-linux-x64': 1.5.3 140 | '@biomejs/cli-linux-x64-musl': 1.5.3 141 | '@biomejs/cli-win32-arm64': 1.5.3 142 | '@biomejs/cli-win32-x64': 1.5.3 143 | dev: true 144 | 145 | /@biomejs/cli-darwin-arm64@1.5.3: 146 | resolution: {integrity: sha512-ImU7mh1HghEDyqNmxEZBoMPr8SxekkZuYcs+gynKlNW+TALQs7swkERiBLkG9NR0K1B3/2uVzlvYowXrmlW8hw==} 147 | engines: {node: '>=14.*'} 148 | cpu: [arm64] 149 | os: [darwin] 150 | requiresBuild: true 151 | dev: true 152 | optional: true 153 | 154 | /@biomejs/cli-darwin-x64@1.5.3: 155 | resolution: {integrity: sha512-vCdASqYnlpq/swErH7FD6nrFz0czFtK4k/iLgj0/+VmZVjineFPgevOb+Sr9vz0tk0GfdQO60bSpI74zU8M9Dw==} 156 | engines: {node: '>=14.*'} 157 | cpu: [x64] 158 | os: [darwin] 159 | requiresBuild: true 160 | dev: true 161 | optional: true 162 | 163 | /@biomejs/cli-linux-arm64-musl@1.5.3: 164 | resolution: {integrity: sha512-DYuMizUYUBYfS0IHGjDrOP1RGipqWfMGEvNEJ398zdtmCKLXaUvTimiox5dvx4X15mBK5M2m8wgWUgOP1giUpQ==} 165 | engines: {node: '>=14.*'} 166 | cpu: [arm64] 167 | os: [linux] 168 | requiresBuild: true 169 | dev: true 170 | optional: true 171 | 172 | /@biomejs/cli-linux-arm64@1.5.3: 173 | resolution: {integrity: sha512-cupBQv0sNF1OKqBfx7EDWMSsKwRrBUZfjXawT4s6hKV6ALq7p0QzWlxr/sDmbKMLOaLQtw2Qgu/77N9rm+f9Rg==} 174 | engines: {node: '>=14.*'} 175 | cpu: [arm64] 176 | os: [linux] 177 | requiresBuild: true 178 | dev: true 179 | optional: true 180 | 181 | /@biomejs/cli-linux-x64-musl@1.5.3: 182 | resolution: {integrity: sha512-UUHiAnlDqr2Y/LpvshBFhUYMWkl2/Jn+bi3U6jKuav0qWbbBKU/ByHgR4+NBxpKBYoCtWxhnmatfH1bpPIuZMw==} 183 | engines: {node: '>=14.*'} 184 | cpu: [x64] 185 | os: [linux] 186 | requiresBuild: true 187 | dev: true 188 | optional: true 189 | 190 | /@biomejs/cli-linux-x64@1.5.3: 191 | resolution: {integrity: sha512-YQrSArQvcv4FYsk7Q91Yv4uuu5F8hJyORVcv3zsjCLGkjIjx2RhjYLpTL733SNL7v33GmOlZY0eFR1ko38tuUw==} 192 | engines: {node: '>=14.*'} 193 | cpu: [x64] 194 | os: [linux] 195 | requiresBuild: true 196 | dev: true 197 | optional: true 198 | 199 | /@biomejs/cli-win32-arm64@1.5.3: 200 | resolution: {integrity: sha512-HxatYH7vf/kX9nrD+pDYuV2GI9GV8EFo6cfKkahAecTuZLPxryHx1WEfJthp5eNsE0+09STGkKIKjirP0ufaZA==} 201 | engines: {node: '>=14.*'} 202 | cpu: [arm64] 203 | os: [win32] 204 | requiresBuild: true 205 | dev: true 206 | optional: true 207 | 208 | /@biomejs/cli-win32-x64@1.5.3: 209 | resolution: {integrity: sha512-fMvbSouZEASU7mZH8SIJSANDm5OqsjgtVXlbUqxwed6BP7uuHRSs396Aqwh2+VoW8fwTpp6ybIUoC9FrzB0kyA==} 210 | engines: {node: '>=14.*'} 211 | cpu: [x64] 212 | os: [win32] 213 | requiresBuild: true 214 | dev: true 215 | optional: true 216 | 217 | /@clerk/backend@0.37.3(react@18.2.0): 218 | resolution: {integrity: sha512-ZfYacm4wNRf4Qe4fRVgfMUaQROryL6CT+Sg/qqfutoeJUXDORAMyu5Mm2kHZ+s+n1MSXnLRegDjWhILlKniUyw==} 219 | engines: {node: '>=14'} 220 | dependencies: 221 | '@clerk/shared': 1.3.1(react@18.2.0) 222 | '@clerk/types': 3.60.0 223 | '@peculiar/webcrypto': 1.4.1 224 | '@types/node': 16.18.6 225 | cookie: 0.5.0 226 | deepmerge: 4.2.2 227 | node-fetch-native: 1.0.1 228 | snakecase-keys: 5.4.4 229 | tslib: 2.4.1 230 | transitivePeerDependencies: 231 | - react 232 | dev: false 233 | 234 | /@clerk/clerk-react@4.30.3(react@18.2.0): 235 | resolution: {integrity: sha512-bX4fUxGXUrMl8A50TpeUM8PHFKbMHmt7UfJ/NnUQMBN54h9N/NF2eSE2omY1+lDxBJmh/V9EiJZV8S6MwDflzw==} 236 | engines: {node: '>=14'} 237 | peerDependencies: 238 | react: '>=16' 239 | dependencies: 240 | '@clerk/shared': 1.3.1(react@18.2.0) 241 | '@clerk/types': 3.60.0 242 | react: 18.2.0 243 | tslib: 2.4.1 244 | dev: false 245 | 246 | /@clerk/clerk-sdk-node@4.13.7(react@18.2.0): 247 | resolution: {integrity: sha512-vSczVwNroifH0rC1HY1zg0O4IqiD2OjXHOY0M5zvQbS3b7L1SIRnwBKtQUxUgGHsnxC8lr0XYQeLyOraa83OhQ==} 248 | engines: {node: '>=14'} 249 | dependencies: 250 | '@clerk/backend': 0.37.3(react@18.2.0) 251 | '@clerk/shared': 1.3.1(react@18.2.0) 252 | '@clerk/types': 3.60.0 253 | '@types/cookies': 0.7.7 254 | '@types/express': 4.17.14 255 | '@types/node-fetch': 2.6.2 256 | camelcase-keys: 6.2.2 257 | snakecase-keys: 3.2.1 258 | tslib: 2.4.1 259 | transitivePeerDependencies: 260 | - react 261 | dev: false 262 | 263 | /@clerk/nextjs@4.29.5(next@14.0.4)(react-dom@18.2.0)(react@18.2.0): 264 | resolution: {integrity: sha512-6hNaqKsg/B6HuauyMOgnhES/YWt4g/43/fbS/IHmCKgmhhLkaNpRuOspDOOoUaz3wvtb9TP/t6trgqF4W7cylA==} 265 | engines: {node: '>=14'} 266 | peerDependencies: 267 | next: '>=10' 268 | react: ^17.0.2 || ^18.0.0-0 269 | react-dom: ^17.0.2 || ^18.0.0-0 270 | dependencies: 271 | '@clerk/backend': 0.37.3(react@18.2.0) 272 | '@clerk/clerk-react': 4.30.3(react@18.2.0) 273 | '@clerk/clerk-sdk-node': 4.13.7(react@18.2.0) 274 | '@clerk/shared': 1.3.1(react@18.2.0) 275 | '@clerk/types': 3.60.0 276 | next: 14.0.4(react-dom@18.2.0)(react@18.2.0) 277 | path-to-regexp: 6.2.1 278 | react: 18.2.0 279 | react-dom: 18.2.0(react@18.2.0) 280 | tslib: 2.4.1 281 | dev: false 282 | 283 | /@clerk/shared@1.3.1(react@18.2.0): 284 | resolution: {integrity: sha512-nzv4+uA90I/eQp55zfK9a1Po9VgCYlzlNhuZnKqyRsPyJ38l4gpIf3B3qSHHdN0+MTx9cWGFrik1CnpftdOBXQ==} 285 | peerDependencies: 286 | react: '>=16' 287 | peerDependenciesMeta: 288 | react: 289 | optional: true 290 | dependencies: 291 | glob-to-regexp: 0.4.1 292 | js-cookie: 3.0.1 293 | react: 18.2.0 294 | swr: 2.2.0(react@18.2.0) 295 | dev: false 296 | 297 | /@clerk/themes@1.7.9(react@18.2.0): 298 | resolution: {integrity: sha512-9hXxgoPuUSlZ7sH9diJEK1rTWEnk0zGKBYw4Tqaqp0RA1dtB+OHE02DK5pnTypZTnreBJYac3VmxFVTxVV35xg==} 299 | engines: {node: '>=14'} 300 | peerDependencies: 301 | react: '>=16' 302 | dependencies: 303 | react: 18.2.0 304 | dev: false 305 | 306 | /@clerk/types@3.60.0: 307 | resolution: {integrity: sha512-f1A16wFh5MtikxEo7o6vAVX7FxpqC1YmzA6c4ugwq5MH8J2mvIM/LwNVIHgNpZkn/s/G+BUhBcJJmUXqajDK2Q==} 308 | engines: {node: '>=14'} 309 | dependencies: 310 | csstype: 3.1.1 311 | dev: false 312 | 313 | /@emotion/is-prop-valid@0.8.8: 314 | resolution: {integrity: sha512-u5WtneEAr5IDG2Wv65yhunPSMLIpuKsbuOktRojfrEiEvRyC85LgPMZI63cr7NUqT8ZIGdSVg8ZKGxIug4lXcA==} 315 | requiresBuild: true 316 | dependencies: 317 | '@emotion/memoize': 0.7.4 318 | dev: false 319 | optional: true 320 | 321 | /@emotion/memoize@0.7.4: 322 | resolution: {integrity: sha512-Ja/Vfqe3HpuzRsG1oBtWTHk2PGZ7GR+2Vz5iYGelAw8dx32K0y7PjVuxK6z1nMpZOqAFsRUPCkK1YjJ56qJlgw==} 323 | requiresBuild: true 324 | dev: false 325 | optional: true 326 | 327 | /@floating-ui/core@1.6.0: 328 | resolution: {integrity: sha512-PcF++MykgmTj3CIyOQbKA/hDzOAiqI3mhuoN44WRCopIs1sgoDoU4oty4Jtqaj/y3oDU6fnVSm4QG0a3t5i0+g==} 329 | dependencies: 330 | '@floating-ui/utils': 0.2.1 331 | dev: false 332 | 333 | /@floating-ui/dom@1.6.1: 334 | resolution: {integrity: sha512-iA8qE43/H5iGozC3W0YSnVSW42Vh522yyM1gj+BqRwVsTNOyr231PsXDaV04yT39PsO0QL2QpbI/M0ZaLUQgRQ==} 335 | dependencies: 336 | '@floating-ui/core': 1.6.0 337 | '@floating-ui/utils': 0.2.1 338 | dev: false 339 | 340 | /@floating-ui/react-dom@2.0.8(react-dom@18.2.0)(react@18.2.0): 341 | resolution: {integrity: sha512-HOdqOt3R3OGeTKidaLvJKcgg75S6tibQ3Tif4eyd91QnIJWr0NLvoXFpJA/j8HqkFSL68GDca9AuyWEHlhyClw==} 342 | peerDependencies: 343 | react: '>=16.8.0' 344 | react-dom: '>=16.8.0' 345 | dependencies: 346 | '@floating-ui/dom': 1.6.1 347 | react: 18.2.0 348 | react-dom: 18.2.0(react@18.2.0) 349 | dev: false 350 | 351 | /@floating-ui/utils@0.2.1: 352 | resolution: {integrity: sha512-9TANp6GPoMtYzQdt54kfAyMmz1+osLlXdg2ENroU7zzrtflTLrrC/lgrIfaSe+Wu0b89GKccT7vxXA0MoAIO+Q==} 353 | dev: false 354 | 355 | /@isaacs/cliui@8.0.2: 356 | resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} 357 | engines: {node: '>=12'} 358 | dependencies: 359 | string-width: 5.1.2 360 | string-width-cjs: /string-width@4.2.3 361 | strip-ansi: 7.1.0 362 | strip-ansi-cjs: /strip-ansi@6.0.1 363 | wrap-ansi: 8.1.0 364 | wrap-ansi-cjs: /wrap-ansi@7.0.0 365 | 366 | /@jridgewell/gen-mapping@0.3.3: 367 | resolution: {integrity: sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==} 368 | engines: {node: '>=6.0.0'} 369 | dependencies: 370 | '@jridgewell/set-array': 1.1.2 371 | '@jridgewell/sourcemap-codec': 1.4.15 372 | '@jridgewell/trace-mapping': 0.3.22 373 | 374 | /@jridgewell/resolve-uri@3.1.1: 375 | resolution: {integrity: sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==} 376 | engines: {node: '>=6.0.0'} 377 | 378 | /@jridgewell/set-array@1.1.2: 379 | resolution: {integrity: sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==} 380 | engines: {node: '>=6.0.0'} 381 | 382 | /@jridgewell/sourcemap-codec@1.4.15: 383 | resolution: {integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==} 384 | 385 | /@jridgewell/trace-mapping@0.3.22: 386 | resolution: {integrity: sha512-Wf963MzWtA2sjrNt+g18IAln9lKnlRp+K2eH4jjIoF1wYeq3aMREpG09xhlhdzS0EjwU7qmUJYangWa+151vZw==} 387 | dependencies: 388 | '@jridgewell/resolve-uri': 3.1.1 389 | '@jridgewell/sourcemap-codec': 1.4.15 390 | 391 | /@next/env@14.0.4: 392 | resolution: {integrity: sha512-irQnbMLbUNQpP1wcE5NstJtbuA/69kRfzBrpAD7Gsn8zm/CY6YQYc3HQBz8QPxwISG26tIm5afvvVbu508oBeQ==} 393 | dev: false 394 | 395 | /@next/swc-darwin-arm64@14.0.4: 396 | resolution: {integrity: sha512-mF05E/5uPthWzyYDyptcwHptucf/jj09i2SXBPwNzbgBNc+XnwzrL0U6BmPjQeOL+FiB+iG1gwBeq7mlDjSRPg==} 397 | engines: {node: '>= 10'} 398 | cpu: [arm64] 399 | os: [darwin] 400 | requiresBuild: true 401 | dev: false 402 | optional: true 403 | 404 | /@next/swc-darwin-x64@14.0.4: 405 | resolution: {integrity: sha512-IZQ3C7Bx0k2rYtrZZxKKiusMTM9WWcK5ajyhOZkYYTCc8xytmwSzR1skU7qLgVT/EY9xtXDG0WhY6fyujnI3rw==} 406 | engines: {node: '>= 10'} 407 | cpu: [x64] 408 | os: [darwin] 409 | requiresBuild: true 410 | dev: false 411 | optional: true 412 | 413 | /@next/swc-linux-arm64-gnu@14.0.4: 414 | resolution: {integrity: sha512-VwwZKrBQo/MGb1VOrxJ6LrKvbpo7UbROuyMRvQKTFKhNaXjUmKTu7wxVkIuCARAfiI8JpaWAnKR+D6tzpCcM4w==} 415 | engines: {node: '>= 10'} 416 | cpu: [arm64] 417 | os: [linux] 418 | requiresBuild: true 419 | dev: false 420 | optional: true 421 | 422 | /@next/swc-linux-arm64-musl@14.0.4: 423 | resolution: {integrity: sha512-8QftwPEW37XxXoAwsn+nXlodKWHfpMaSvt81W43Wh8dv0gkheD+30ezWMcFGHLI71KiWmHK5PSQbTQGUiidvLQ==} 424 | engines: {node: '>= 10'} 425 | cpu: [arm64] 426 | os: [linux] 427 | requiresBuild: true 428 | dev: false 429 | optional: true 430 | 431 | /@next/swc-linux-x64-gnu@14.0.4: 432 | resolution: {integrity: sha512-/s/Pme3VKfZAfISlYVq2hzFS8AcAIOTnoKupc/j4WlvF6GQ0VouS2Q2KEgPuO1eMBwakWPB1aYFIA4VNVh667A==} 433 | engines: {node: '>= 10'} 434 | cpu: [x64] 435 | os: [linux] 436 | requiresBuild: true 437 | dev: false 438 | optional: true 439 | 440 | /@next/swc-linux-x64-musl@14.0.4: 441 | resolution: {integrity: sha512-m8z/6Fyal4L9Bnlxde5g2Mfa1Z7dasMQyhEhskDATpqr+Y0mjOBZcXQ7G5U+vgL22cI4T7MfvgtrM2jdopqWaw==} 442 | engines: {node: '>= 10'} 443 | cpu: [x64] 444 | os: [linux] 445 | requiresBuild: true 446 | dev: false 447 | optional: true 448 | 449 | /@next/swc-win32-arm64-msvc@14.0.4: 450 | resolution: {integrity: sha512-7Wv4PRiWIAWbm5XrGz3D8HUkCVDMMz9igffZG4NB1p4u1KoItwx9qjATHz88kwCEal/HXmbShucaslXCQXUM5w==} 451 | engines: {node: '>= 10'} 452 | cpu: [arm64] 453 | os: [win32] 454 | requiresBuild: true 455 | dev: false 456 | optional: true 457 | 458 | /@next/swc-win32-ia32-msvc@14.0.4: 459 | resolution: {integrity: sha512-zLeNEAPULsl0phfGb4kdzF/cAVIfaC7hY+kt0/d+y9mzcZHsMS3hAS829WbJ31DkSlVKQeHEjZHIdhN+Pg7Gyg==} 460 | engines: {node: '>= 10'} 461 | cpu: [ia32] 462 | os: [win32] 463 | requiresBuild: true 464 | dev: false 465 | optional: true 466 | 467 | /@next/swc-win32-x64-msvc@14.0.4: 468 | resolution: {integrity: sha512-yEh2+R8qDlDCjxVpzOTEpBLQTEFAcP2A8fUFLaWNap9GitYKkKv1//y2S6XY6zsR4rCOPRpU7plYDR+az2n30A==} 469 | engines: {node: '>= 10'} 470 | cpu: [x64] 471 | os: [win32] 472 | requiresBuild: true 473 | dev: false 474 | optional: true 475 | 476 | /@nodelib/fs.scandir@2.1.5: 477 | resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} 478 | engines: {node: '>= 8'} 479 | dependencies: 480 | '@nodelib/fs.stat': 2.0.5 481 | run-parallel: 1.2.0 482 | 483 | /@nodelib/fs.stat@2.0.5: 484 | resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} 485 | engines: {node: '>= 8'} 486 | 487 | /@nodelib/fs.walk@1.2.8: 488 | resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} 489 | engines: {node: '>= 8'} 490 | dependencies: 491 | '@nodelib/fs.scandir': 2.1.5 492 | fastq: 1.17.0 493 | 494 | /@peculiar/asn1-schema@2.3.8: 495 | resolution: {integrity: sha512-ULB1XqHKx1WBU/tTFIA+uARuRoBVZ4pNdOA878RDrRbBfBGcSzi5HBkdScC6ZbHn8z7L8gmKCgPC1LHRrP46tA==} 496 | dependencies: 497 | asn1js: 3.0.5 498 | pvtsutils: 1.3.5 499 | tslib: 2.6.2 500 | dev: false 501 | 502 | /@peculiar/json-schema@1.1.12: 503 | resolution: {integrity: sha512-coUfuoMeIB7B8/NMekxaDzLhaYmp0HZNPEjYRm9goRou8UZIC3z21s0sL9AWoCw4EG876QyO3kYrc61WNF9B/w==} 504 | engines: {node: '>=8.0.0'} 505 | dependencies: 506 | tslib: 2.4.1 507 | dev: false 508 | 509 | /@peculiar/webcrypto@1.4.1: 510 | resolution: {integrity: sha512-eK4C6WTNYxoI7JOabMoZICiyqRRtJB220bh0Mbj5RwRycleZf9BPyZoxsTvpP0FpmVS2aS13NKOuh5/tN3sIRw==} 511 | engines: {node: '>=10.12.0'} 512 | dependencies: 513 | '@peculiar/asn1-schema': 2.3.8 514 | '@peculiar/json-schema': 1.1.12 515 | pvtsutils: 1.3.5 516 | tslib: 2.4.1 517 | webcrypto-core: 1.7.8 518 | dev: false 519 | 520 | /@pkgjs/parseargs@0.11.0: 521 | resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} 522 | engines: {node: '>=14'} 523 | requiresBuild: true 524 | optional: true 525 | 526 | /@prisma/client@5.7.0(prisma@5.9.1): 527 | resolution: {integrity: sha512-cZmglCrfNbYpzUtz7HscVHl38e9CrUs31nrVoGUK1nIPXGgt8hT4jj2s657UXcNdQ/jBUxDgGmHyu2Nyrq1txg==} 528 | engines: {node: '>=16.13'} 529 | requiresBuild: true 530 | peerDependencies: 531 | prisma: '*' 532 | peerDependenciesMeta: 533 | prisma: 534 | optional: true 535 | dependencies: 536 | prisma: 5.9.1 537 | dev: false 538 | 539 | /@prisma/debug@5.9.1: 540 | resolution: {integrity: sha512-yAHFSFCg8KVoL0oRUno3m60GAjsUKYUDkQ+9BA2X2JfVR3kRVSJFc/GpQ2fSORi4pSHZR9orfM4UC9OVXIFFTA==} 541 | 542 | /@prisma/engines-version@5.9.0-32.23fdc5965b1e05fc54e5f26ed3de66776b93de64: 543 | resolution: {integrity: sha512-HFl7275yF0FWbdcNvcSRbbu9JCBSLMcurYwvWc8WGDnpu7APxQo2ONtZrUggU3WxLxUJ2uBX+0GOFIcJeVeOOQ==} 544 | 545 | /@prisma/engines@5.9.1: 546 | resolution: {integrity: sha512-gkdXmjxQ5jktxWNdDA5aZZ6R8rH74JkoKq6LD5mACSvxd2vbqWeWIOV0Py5wFC8vofOYShbt6XUeCIUmrOzOnQ==} 547 | requiresBuild: true 548 | dependencies: 549 | '@prisma/debug': 5.9.1 550 | '@prisma/engines-version': 5.9.0-32.23fdc5965b1e05fc54e5f26ed3de66776b93de64 551 | '@prisma/fetch-engine': 5.9.1 552 | '@prisma/get-platform': 5.9.1 553 | 554 | /@prisma/fetch-engine@5.9.1: 555 | resolution: {integrity: sha512-l0goQOMcNVOJs1kAcwqpKq3ylvkD9F04Ioe1oJoCqmz05mw22bNAKKGWuDd3zTUoUZr97va0c/UfLNru+PDmNA==} 556 | dependencies: 557 | '@prisma/debug': 5.9.1 558 | '@prisma/engines-version': 5.9.0-32.23fdc5965b1e05fc54e5f26ed3de66776b93de64 559 | '@prisma/get-platform': 5.9.1 560 | 561 | /@prisma/get-platform@5.9.1: 562 | resolution: {integrity: sha512-6OQsNxTyhvG+T2Ksr8FPFpuPeL4r9u0JF0OZHUBI/Uy9SS43sPyAIutt4ZEAyqWQt104ERh70EZedkHZKsnNbg==} 563 | dependencies: 564 | '@prisma/debug': 5.9.1 565 | 566 | /@radix-ui/primitive@1.0.1: 567 | resolution: {integrity: sha512-yQ8oGX2GVsEYMWGxcovu1uGWPCxV5BFfeeYxqPmuAzUyLT9qmaMXSAhXpb0WrspIeqYzdJpkh2vHModJPgRIaw==} 568 | dependencies: 569 | '@babel/runtime': 7.23.9 570 | dev: false 571 | 572 | /@radix-ui/react-arrow@1.0.3(@types/react-dom@18.2.18)(@types/react@18.2.53)(react-dom@18.2.0)(react@18.2.0): 573 | resolution: {integrity: sha512-wSP+pHsB/jQRaL6voubsQ/ZlrGBHHrOjmBnr19hxYgtS0WvAFwZhK2WP/YY5yF9uKECCEEDGxuLxq1NBK51wFA==} 574 | peerDependencies: 575 | '@types/react': '*' 576 | '@types/react-dom': '*' 577 | react: ^16.8 || ^17.0 || ^18.0 578 | react-dom: ^16.8 || ^17.0 || ^18.0 579 | peerDependenciesMeta: 580 | '@types/react': 581 | optional: true 582 | '@types/react-dom': 583 | optional: true 584 | dependencies: 585 | '@babel/runtime': 7.23.9 586 | '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.18)(@types/react@18.2.53)(react-dom@18.2.0)(react@18.2.0) 587 | '@types/react': 18.2.53 588 | '@types/react-dom': 18.2.18 589 | react: 18.2.0 590 | react-dom: 18.2.0(react@18.2.0) 591 | dev: false 592 | 593 | /@radix-ui/react-avatar@1.0.4(@types/react-dom@18.2.18)(@types/react@18.2.53)(react-dom@18.2.0)(react@18.2.0): 594 | resolution: {integrity: sha512-kVK2K7ZD3wwj3qhle0ElXhOjbezIgyl2hVvgwfIdexL3rN6zJmy5AqqIf+D31lxVppdzV8CjAfZ6PklkmInZLw==} 595 | peerDependencies: 596 | '@types/react': '*' 597 | '@types/react-dom': '*' 598 | react: ^16.8 || ^17.0 || ^18.0 599 | react-dom: ^16.8 || ^17.0 || ^18.0 600 | peerDependenciesMeta: 601 | '@types/react': 602 | optional: true 603 | '@types/react-dom': 604 | optional: true 605 | dependencies: 606 | '@babel/runtime': 7.23.9 607 | '@radix-ui/react-context': 1.0.1(@types/react@18.2.53)(react@18.2.0) 608 | '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.18)(@types/react@18.2.53)(react-dom@18.2.0)(react@18.2.0) 609 | '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.2.53)(react@18.2.0) 610 | '@radix-ui/react-use-layout-effect': 1.0.1(@types/react@18.2.53)(react@18.2.0) 611 | '@types/react': 18.2.53 612 | '@types/react-dom': 18.2.18 613 | react: 18.2.0 614 | react-dom: 18.2.0(react@18.2.0) 615 | dev: false 616 | 617 | /@radix-ui/react-collection@1.0.3(@types/react-dom@18.2.18)(@types/react@18.2.53)(react-dom@18.2.0)(react@18.2.0): 618 | resolution: {integrity: sha512-3SzW+0PW7yBBoQlT8wNcGtaxaD0XSu0uLUFgrtHY08Acx05TaHaOmVLR73c0j/cqpDy53KBMO7s0dx2wmOIDIA==} 619 | peerDependencies: 620 | '@types/react': '*' 621 | '@types/react-dom': '*' 622 | react: ^16.8 || ^17.0 || ^18.0 623 | react-dom: ^16.8 || ^17.0 || ^18.0 624 | peerDependenciesMeta: 625 | '@types/react': 626 | optional: true 627 | '@types/react-dom': 628 | optional: true 629 | dependencies: 630 | '@babel/runtime': 7.23.9 631 | '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.53)(react@18.2.0) 632 | '@radix-ui/react-context': 1.0.1(@types/react@18.2.53)(react@18.2.0) 633 | '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.18)(@types/react@18.2.53)(react-dom@18.2.0)(react@18.2.0) 634 | '@radix-ui/react-slot': 1.0.2(@types/react@18.2.53)(react@18.2.0) 635 | '@types/react': 18.2.53 636 | '@types/react-dom': 18.2.18 637 | react: 18.2.0 638 | react-dom: 18.2.0(react@18.2.0) 639 | dev: false 640 | 641 | /@radix-ui/react-compose-refs@1.0.1(@types/react@18.2.53)(react@18.2.0): 642 | resolution: {integrity: sha512-fDSBgd44FKHa1FRMU59qBMPFcl2PZE+2nmqunj+BWFyYYjnhIDWL2ItDs3rrbJDQOtzt5nIebLCQc4QRfz6LJw==} 643 | peerDependencies: 644 | '@types/react': '*' 645 | react: ^16.8 || ^17.0 || ^18.0 646 | peerDependenciesMeta: 647 | '@types/react': 648 | optional: true 649 | dependencies: 650 | '@babel/runtime': 7.23.9 651 | '@types/react': 18.2.53 652 | react: 18.2.0 653 | dev: false 654 | 655 | /@radix-ui/react-context@1.0.1(@types/react@18.2.53)(react@18.2.0): 656 | resolution: {integrity: sha512-ebbrdFoYTcuZ0v4wG5tedGnp9tzcV8awzsxYph7gXUyvnNLuTIcCk1q17JEbnVhXAKG9oX3KtchwiMIAYp9NLg==} 657 | peerDependencies: 658 | '@types/react': '*' 659 | react: ^16.8 || ^17.0 || ^18.0 660 | peerDependenciesMeta: 661 | '@types/react': 662 | optional: true 663 | dependencies: 664 | '@babel/runtime': 7.23.9 665 | '@types/react': 18.2.53 666 | react: 18.2.0 667 | dev: false 668 | 669 | /@radix-ui/react-direction@1.0.1(@types/react@18.2.53)(react@18.2.0): 670 | resolution: {integrity: sha512-RXcvnXgyvYvBEOhCBuddKecVkoMiI10Jcm5cTI7abJRAHYfFxeu+FBQs/DvdxSYucxR5mna0dNsL6QFlds5TMA==} 671 | peerDependencies: 672 | '@types/react': '*' 673 | react: ^16.8 || ^17.0 || ^18.0 674 | peerDependenciesMeta: 675 | '@types/react': 676 | optional: true 677 | dependencies: 678 | '@babel/runtime': 7.23.9 679 | '@types/react': 18.2.53 680 | react: 18.2.0 681 | dev: false 682 | 683 | /@radix-ui/react-dismissable-layer@1.0.5(@types/react-dom@18.2.18)(@types/react@18.2.53)(react-dom@18.2.0)(react@18.2.0): 684 | resolution: {integrity: sha512-aJeDjQhywg9LBu2t/At58hCvr7pEm0o2Ke1x33B+MhjNmmZ17sy4KImo0KPLgsnc/zN7GPdce8Cnn0SWvwZO7g==} 685 | peerDependencies: 686 | '@types/react': '*' 687 | '@types/react-dom': '*' 688 | react: ^16.8 || ^17.0 || ^18.0 689 | react-dom: ^16.8 || ^17.0 || ^18.0 690 | peerDependenciesMeta: 691 | '@types/react': 692 | optional: true 693 | '@types/react-dom': 694 | optional: true 695 | dependencies: 696 | '@babel/runtime': 7.23.9 697 | '@radix-ui/primitive': 1.0.1 698 | '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.53)(react@18.2.0) 699 | '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.18)(@types/react@18.2.53)(react-dom@18.2.0)(react@18.2.0) 700 | '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.2.53)(react@18.2.0) 701 | '@radix-ui/react-use-escape-keydown': 1.0.3(@types/react@18.2.53)(react@18.2.0) 702 | '@types/react': 18.2.53 703 | '@types/react-dom': 18.2.18 704 | react: 18.2.0 705 | react-dom: 18.2.0(react@18.2.0) 706 | dev: false 707 | 708 | /@radix-ui/react-dropdown-menu@2.0.6(@types/react-dom@18.2.18)(@types/react@18.2.53)(react-dom@18.2.0)(react@18.2.0): 709 | resolution: {integrity: sha512-i6TuFOoWmLWq+M/eCLGd/bQ2HfAX1RJgvrBQ6AQLmzfvsLdefxbWu8G9zczcPFfcSPehz9GcpF6K9QYreFV8hA==} 710 | peerDependencies: 711 | '@types/react': '*' 712 | '@types/react-dom': '*' 713 | react: ^16.8 || ^17.0 || ^18.0 714 | react-dom: ^16.8 || ^17.0 || ^18.0 715 | peerDependenciesMeta: 716 | '@types/react': 717 | optional: true 718 | '@types/react-dom': 719 | optional: true 720 | dependencies: 721 | '@babel/runtime': 7.23.9 722 | '@radix-ui/primitive': 1.0.1 723 | '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.53)(react@18.2.0) 724 | '@radix-ui/react-context': 1.0.1(@types/react@18.2.53)(react@18.2.0) 725 | '@radix-ui/react-id': 1.0.1(@types/react@18.2.53)(react@18.2.0) 726 | '@radix-ui/react-menu': 2.0.6(@types/react-dom@18.2.18)(@types/react@18.2.53)(react-dom@18.2.0)(react@18.2.0) 727 | '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.18)(@types/react@18.2.53)(react-dom@18.2.0)(react@18.2.0) 728 | '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.2.53)(react@18.2.0) 729 | '@types/react': 18.2.53 730 | '@types/react-dom': 18.2.18 731 | react: 18.2.0 732 | react-dom: 18.2.0(react@18.2.0) 733 | dev: false 734 | 735 | /@radix-ui/react-focus-guards@1.0.1(@types/react@18.2.53)(react@18.2.0): 736 | resolution: {integrity: sha512-Rect2dWbQ8waGzhMavsIbmSVCgYxkXLxxR3ZvCX79JOglzdEy4JXMb98lq4hPxUbLr77nP0UOGf4rcMU+s1pUA==} 737 | peerDependencies: 738 | '@types/react': '*' 739 | react: ^16.8 || ^17.0 || ^18.0 740 | peerDependenciesMeta: 741 | '@types/react': 742 | optional: true 743 | dependencies: 744 | '@babel/runtime': 7.23.9 745 | '@types/react': 18.2.53 746 | react: 18.2.0 747 | dev: false 748 | 749 | /@radix-ui/react-focus-scope@1.0.4(@types/react-dom@18.2.18)(@types/react@18.2.53)(react-dom@18.2.0)(react@18.2.0): 750 | resolution: {integrity: sha512-sL04Mgvf+FmyvZeYfNu1EPAaaxD+aw7cYeIB9L9Fvq8+urhltTRaEo5ysKOpHuKPclsZcSUMKlN05x4u+CINpA==} 751 | peerDependencies: 752 | '@types/react': '*' 753 | '@types/react-dom': '*' 754 | react: ^16.8 || ^17.0 || ^18.0 755 | react-dom: ^16.8 || ^17.0 || ^18.0 756 | peerDependenciesMeta: 757 | '@types/react': 758 | optional: true 759 | '@types/react-dom': 760 | optional: true 761 | dependencies: 762 | '@babel/runtime': 7.23.9 763 | '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.53)(react@18.2.0) 764 | '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.18)(@types/react@18.2.53)(react-dom@18.2.0)(react@18.2.0) 765 | '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.2.53)(react@18.2.0) 766 | '@types/react': 18.2.53 767 | '@types/react-dom': 18.2.18 768 | react: 18.2.0 769 | react-dom: 18.2.0(react@18.2.0) 770 | dev: false 771 | 772 | /@radix-ui/react-icons@1.3.0(react@18.2.0): 773 | resolution: {integrity: sha512-jQxj/0LKgp+j9BiTXz3O3sgs26RNet2iLWmsPyRz2SIcR4q/4SbazXfnYwbAr+vLYKSfc7qxzyGQA1HLlYiuNw==} 774 | peerDependencies: 775 | react: ^16.x || ^17.x || ^18.x 776 | dependencies: 777 | react: 18.2.0 778 | dev: false 779 | 780 | /@radix-ui/react-id@1.0.1(@types/react@18.2.53)(react@18.2.0): 781 | resolution: {integrity: sha512-tI7sT/kqYp8p96yGWY1OAnLHrqDgzHefRBKQ2YAkBS5ja7QLcZ9Z/uY7bEjPUatf8RomoXM8/1sMj1IJaE5UzQ==} 782 | peerDependencies: 783 | '@types/react': '*' 784 | react: ^16.8 || ^17.0 || ^18.0 785 | peerDependenciesMeta: 786 | '@types/react': 787 | optional: true 788 | dependencies: 789 | '@babel/runtime': 7.23.9 790 | '@radix-ui/react-use-layout-effect': 1.0.1(@types/react@18.2.53)(react@18.2.0) 791 | '@types/react': 18.2.53 792 | react: 18.2.0 793 | dev: false 794 | 795 | /@radix-ui/react-menu@2.0.6(@types/react-dom@18.2.18)(@types/react@18.2.53)(react-dom@18.2.0)(react@18.2.0): 796 | resolution: {integrity: sha512-BVkFLS+bUC8HcImkRKPSiVumA1VPOOEC5WBMiT+QAVsPzW1FJzI9KnqgGxVDPBcql5xXrHkD3JOVoXWEXD8SYA==} 797 | peerDependencies: 798 | '@types/react': '*' 799 | '@types/react-dom': '*' 800 | react: ^16.8 || ^17.0 || ^18.0 801 | react-dom: ^16.8 || ^17.0 || ^18.0 802 | peerDependenciesMeta: 803 | '@types/react': 804 | optional: true 805 | '@types/react-dom': 806 | optional: true 807 | dependencies: 808 | '@babel/runtime': 7.23.9 809 | '@radix-ui/primitive': 1.0.1 810 | '@radix-ui/react-collection': 1.0.3(@types/react-dom@18.2.18)(@types/react@18.2.53)(react-dom@18.2.0)(react@18.2.0) 811 | '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.53)(react@18.2.0) 812 | '@radix-ui/react-context': 1.0.1(@types/react@18.2.53)(react@18.2.0) 813 | '@radix-ui/react-direction': 1.0.1(@types/react@18.2.53)(react@18.2.0) 814 | '@radix-ui/react-dismissable-layer': 1.0.5(@types/react-dom@18.2.18)(@types/react@18.2.53)(react-dom@18.2.0)(react@18.2.0) 815 | '@radix-ui/react-focus-guards': 1.0.1(@types/react@18.2.53)(react@18.2.0) 816 | '@radix-ui/react-focus-scope': 1.0.4(@types/react-dom@18.2.18)(@types/react@18.2.53)(react-dom@18.2.0)(react@18.2.0) 817 | '@radix-ui/react-id': 1.0.1(@types/react@18.2.53)(react@18.2.0) 818 | '@radix-ui/react-popper': 1.1.3(@types/react-dom@18.2.18)(@types/react@18.2.53)(react-dom@18.2.0)(react@18.2.0) 819 | '@radix-ui/react-portal': 1.0.4(@types/react-dom@18.2.18)(@types/react@18.2.53)(react-dom@18.2.0)(react@18.2.0) 820 | '@radix-ui/react-presence': 1.0.1(@types/react-dom@18.2.18)(@types/react@18.2.53)(react-dom@18.2.0)(react@18.2.0) 821 | '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.18)(@types/react@18.2.53)(react-dom@18.2.0)(react@18.2.0) 822 | '@radix-ui/react-roving-focus': 1.0.4(@types/react-dom@18.2.18)(@types/react@18.2.53)(react-dom@18.2.0)(react@18.2.0) 823 | '@radix-ui/react-slot': 1.0.2(@types/react@18.2.53)(react@18.2.0) 824 | '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.2.53)(react@18.2.0) 825 | '@types/react': 18.2.53 826 | '@types/react-dom': 18.2.18 827 | aria-hidden: 1.2.3 828 | react: 18.2.0 829 | react-dom: 18.2.0(react@18.2.0) 830 | react-remove-scroll: 2.5.5(@types/react@18.2.53)(react@18.2.0) 831 | dev: false 832 | 833 | /@radix-ui/react-popper@1.1.3(@types/react-dom@18.2.18)(@types/react@18.2.53)(react-dom@18.2.0)(react@18.2.0): 834 | resolution: {integrity: sha512-cKpopj/5RHZWjrbF2846jBNacjQVwkP068DfmgrNJXpvVWrOvlAmE9xSiy5OqeE+Gi8D9fP+oDhUnPqNMY8/5w==} 835 | peerDependencies: 836 | '@types/react': '*' 837 | '@types/react-dom': '*' 838 | react: ^16.8 || ^17.0 || ^18.0 839 | react-dom: ^16.8 || ^17.0 || ^18.0 840 | peerDependenciesMeta: 841 | '@types/react': 842 | optional: true 843 | '@types/react-dom': 844 | optional: true 845 | dependencies: 846 | '@babel/runtime': 7.23.9 847 | '@floating-ui/react-dom': 2.0.8(react-dom@18.2.0)(react@18.2.0) 848 | '@radix-ui/react-arrow': 1.0.3(@types/react-dom@18.2.18)(@types/react@18.2.53)(react-dom@18.2.0)(react@18.2.0) 849 | '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.53)(react@18.2.0) 850 | '@radix-ui/react-context': 1.0.1(@types/react@18.2.53)(react@18.2.0) 851 | '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.18)(@types/react@18.2.53)(react-dom@18.2.0)(react@18.2.0) 852 | '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.2.53)(react@18.2.0) 853 | '@radix-ui/react-use-layout-effect': 1.0.1(@types/react@18.2.53)(react@18.2.0) 854 | '@radix-ui/react-use-rect': 1.0.1(@types/react@18.2.53)(react@18.2.0) 855 | '@radix-ui/react-use-size': 1.0.1(@types/react@18.2.53)(react@18.2.0) 856 | '@radix-ui/rect': 1.0.1 857 | '@types/react': 18.2.53 858 | '@types/react-dom': 18.2.18 859 | react: 18.2.0 860 | react-dom: 18.2.0(react@18.2.0) 861 | dev: false 862 | 863 | /@radix-ui/react-portal@1.0.4(@types/react-dom@18.2.18)(@types/react@18.2.53)(react-dom@18.2.0)(react@18.2.0): 864 | resolution: {integrity: sha512-Qki+C/EuGUVCQTOTD5vzJzJuMUlewbzuKyUy+/iHM2uwGiru9gZeBJtHAPKAEkB5KWGi9mP/CHKcY0wt1aW45Q==} 865 | peerDependencies: 866 | '@types/react': '*' 867 | '@types/react-dom': '*' 868 | react: ^16.8 || ^17.0 || ^18.0 869 | react-dom: ^16.8 || ^17.0 || ^18.0 870 | peerDependenciesMeta: 871 | '@types/react': 872 | optional: true 873 | '@types/react-dom': 874 | optional: true 875 | dependencies: 876 | '@babel/runtime': 7.23.9 877 | '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.18)(@types/react@18.2.53)(react-dom@18.2.0)(react@18.2.0) 878 | '@types/react': 18.2.53 879 | '@types/react-dom': 18.2.18 880 | react: 18.2.0 881 | react-dom: 18.2.0(react@18.2.0) 882 | dev: false 883 | 884 | /@radix-ui/react-presence@1.0.1(@types/react-dom@18.2.18)(@types/react@18.2.53)(react-dom@18.2.0)(react@18.2.0): 885 | resolution: {integrity: sha512-UXLW4UAbIY5ZjcvzjfRFo5gxva8QirC9hF7wRE4U5gz+TP0DbRk+//qyuAQ1McDxBt1xNMBTaciFGvEmJvAZCg==} 886 | peerDependencies: 887 | '@types/react': '*' 888 | '@types/react-dom': '*' 889 | react: ^16.8 || ^17.0 || ^18.0 890 | react-dom: ^16.8 || ^17.0 || ^18.0 891 | peerDependenciesMeta: 892 | '@types/react': 893 | optional: true 894 | '@types/react-dom': 895 | optional: true 896 | dependencies: 897 | '@babel/runtime': 7.23.9 898 | '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.53)(react@18.2.0) 899 | '@radix-ui/react-use-layout-effect': 1.0.1(@types/react@18.2.53)(react@18.2.0) 900 | '@types/react': 18.2.53 901 | '@types/react-dom': 18.2.18 902 | react: 18.2.0 903 | react-dom: 18.2.0(react@18.2.0) 904 | dev: false 905 | 906 | /@radix-ui/react-primitive@1.0.3(@types/react-dom@18.2.18)(@types/react@18.2.53)(react-dom@18.2.0)(react@18.2.0): 907 | resolution: {integrity: sha512-yi58uVyoAcK/Nq1inRY56ZSjKypBNKTa/1mcL8qdl6oJeEaDbOldlzrGn7P6Q3Id5d+SYNGc5AJgc4vGhjs5+g==} 908 | peerDependencies: 909 | '@types/react': '*' 910 | '@types/react-dom': '*' 911 | react: ^16.8 || ^17.0 || ^18.0 912 | react-dom: ^16.8 || ^17.0 || ^18.0 913 | peerDependenciesMeta: 914 | '@types/react': 915 | optional: true 916 | '@types/react-dom': 917 | optional: true 918 | dependencies: 919 | '@babel/runtime': 7.23.9 920 | '@radix-ui/react-slot': 1.0.2(@types/react@18.2.53)(react@18.2.0) 921 | '@types/react': 18.2.53 922 | '@types/react-dom': 18.2.18 923 | react: 18.2.0 924 | react-dom: 18.2.0(react@18.2.0) 925 | dev: false 926 | 927 | /@radix-ui/react-roving-focus@1.0.4(@types/react-dom@18.2.18)(@types/react@18.2.53)(react-dom@18.2.0)(react@18.2.0): 928 | resolution: {integrity: sha512-2mUg5Mgcu001VkGy+FfzZyzbmuUWzgWkj3rvv4yu+mLw03+mTzbxZHvfcGyFp2b8EkQeMkpRQ5FiA2Vr2O6TeQ==} 929 | peerDependencies: 930 | '@types/react': '*' 931 | '@types/react-dom': '*' 932 | react: ^16.8 || ^17.0 || ^18.0 933 | react-dom: ^16.8 || ^17.0 || ^18.0 934 | peerDependenciesMeta: 935 | '@types/react': 936 | optional: true 937 | '@types/react-dom': 938 | optional: true 939 | dependencies: 940 | '@babel/runtime': 7.23.9 941 | '@radix-ui/primitive': 1.0.1 942 | '@radix-ui/react-collection': 1.0.3(@types/react-dom@18.2.18)(@types/react@18.2.53)(react-dom@18.2.0)(react@18.2.0) 943 | '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.53)(react@18.2.0) 944 | '@radix-ui/react-context': 1.0.1(@types/react@18.2.53)(react@18.2.0) 945 | '@radix-ui/react-direction': 1.0.1(@types/react@18.2.53)(react@18.2.0) 946 | '@radix-ui/react-id': 1.0.1(@types/react@18.2.53)(react@18.2.0) 947 | '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.18)(@types/react@18.2.53)(react-dom@18.2.0)(react@18.2.0) 948 | '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.2.53)(react@18.2.0) 949 | '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.2.53)(react@18.2.0) 950 | '@types/react': 18.2.53 951 | '@types/react-dom': 18.2.18 952 | react: 18.2.0 953 | react-dom: 18.2.0(react@18.2.0) 954 | dev: false 955 | 956 | /@radix-ui/react-slot@1.0.2(@types/react@18.2.53)(react@18.2.0): 957 | resolution: {integrity: sha512-YeTpuq4deV+6DusvVUW4ivBgnkHwECUu0BiN43L5UCDFgdhsRUWAghhTF5MbvNTPzmiFOx90asDSUjWuCNapwg==} 958 | peerDependencies: 959 | '@types/react': '*' 960 | react: ^16.8 || ^17.0 || ^18.0 961 | peerDependenciesMeta: 962 | '@types/react': 963 | optional: true 964 | dependencies: 965 | '@babel/runtime': 7.23.9 966 | '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.53)(react@18.2.0) 967 | '@types/react': 18.2.53 968 | react: 18.2.0 969 | dev: false 970 | 971 | /@radix-ui/react-use-callback-ref@1.0.1(@types/react@18.2.53)(react@18.2.0): 972 | resolution: {integrity: sha512-D94LjX4Sp0xJFVaoQOd3OO9k7tpBYNOXdVhkltUbGv2Qb9OXdrg/CpsjlZv7ia14Sylv398LswWBVVu5nqKzAQ==} 973 | peerDependencies: 974 | '@types/react': '*' 975 | react: ^16.8 || ^17.0 || ^18.0 976 | peerDependenciesMeta: 977 | '@types/react': 978 | optional: true 979 | dependencies: 980 | '@babel/runtime': 7.23.9 981 | '@types/react': 18.2.53 982 | react: 18.2.0 983 | dev: false 984 | 985 | /@radix-ui/react-use-controllable-state@1.0.1(@types/react@18.2.53)(react@18.2.0): 986 | resolution: {integrity: sha512-Svl5GY5FQeN758fWKrjM6Qb7asvXeiZltlT4U2gVfl8Gx5UAv2sMR0LWo8yhsIZh2oQ0eFdZ59aoOOMV7b47VA==} 987 | peerDependencies: 988 | '@types/react': '*' 989 | react: ^16.8 || ^17.0 || ^18.0 990 | peerDependenciesMeta: 991 | '@types/react': 992 | optional: true 993 | dependencies: 994 | '@babel/runtime': 7.23.9 995 | '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.2.53)(react@18.2.0) 996 | '@types/react': 18.2.53 997 | react: 18.2.0 998 | dev: false 999 | 1000 | /@radix-ui/react-use-escape-keydown@1.0.3(@types/react@18.2.53)(react@18.2.0): 1001 | resolution: {integrity: sha512-vyL82j40hcFicA+M4Ex7hVkB9vHgSse1ZWomAqV2Je3RleKGO5iM8KMOEtfoSB0PnIelMd2lATjTGMYqN5ylTg==} 1002 | peerDependencies: 1003 | '@types/react': '*' 1004 | react: ^16.8 || ^17.0 || ^18.0 1005 | peerDependenciesMeta: 1006 | '@types/react': 1007 | optional: true 1008 | dependencies: 1009 | '@babel/runtime': 7.23.9 1010 | '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.2.53)(react@18.2.0) 1011 | '@types/react': 18.2.53 1012 | react: 18.2.0 1013 | dev: false 1014 | 1015 | /@radix-ui/react-use-layout-effect@1.0.1(@types/react@18.2.53)(react@18.2.0): 1016 | resolution: {integrity: sha512-v/5RegiJWYdoCvMnITBkNNx6bCj20fiaJnWtRkU18yITptraXjffz5Qbn05uOiQnOvi+dbkznkoaMltz1GnszQ==} 1017 | peerDependencies: 1018 | '@types/react': '*' 1019 | react: ^16.8 || ^17.0 || ^18.0 1020 | peerDependenciesMeta: 1021 | '@types/react': 1022 | optional: true 1023 | dependencies: 1024 | '@babel/runtime': 7.23.9 1025 | '@types/react': 18.2.53 1026 | react: 18.2.0 1027 | dev: false 1028 | 1029 | /@radix-ui/react-use-rect@1.0.1(@types/react@18.2.53)(react@18.2.0): 1030 | resolution: {integrity: sha512-Cq5DLuSiuYVKNU8orzJMbl15TXilTnJKUCltMVQg53BQOF1/C5toAaGrowkgksdBQ9H+SRL23g0HDmg9tvmxXw==} 1031 | peerDependencies: 1032 | '@types/react': '*' 1033 | react: ^16.8 || ^17.0 || ^18.0 1034 | peerDependenciesMeta: 1035 | '@types/react': 1036 | optional: true 1037 | dependencies: 1038 | '@babel/runtime': 7.23.9 1039 | '@radix-ui/rect': 1.0.1 1040 | '@types/react': 18.2.53 1041 | react: 18.2.0 1042 | dev: false 1043 | 1044 | /@radix-ui/react-use-size@1.0.1(@types/react@18.2.53)(react@18.2.0): 1045 | resolution: {integrity: sha512-ibay+VqrgcaI6veAojjofPATwledXiSmX+C0KrBk/xgpX9rBzPV3OsfwlhQdUOFbh+LKQorLYT+xTXW9V8yd0g==} 1046 | peerDependencies: 1047 | '@types/react': '*' 1048 | react: ^16.8 || ^17.0 || ^18.0 1049 | peerDependenciesMeta: 1050 | '@types/react': 1051 | optional: true 1052 | dependencies: 1053 | '@babel/runtime': 7.23.9 1054 | '@radix-ui/react-use-layout-effect': 1.0.1(@types/react@18.2.53)(react@18.2.0) 1055 | '@types/react': 18.2.53 1056 | react: 18.2.0 1057 | dev: false 1058 | 1059 | /@radix-ui/rect@1.0.1: 1060 | resolution: {integrity: sha512-fyrgCaedtvMg9NK3en0pnOYJdtfwxUcNolezkNPUsoX57X8oQk+NkqcvzHXD2uKNij6GXmWU9NDru2IWjrO4BQ==} 1061 | dependencies: 1062 | '@babel/runtime': 7.23.9 1063 | dev: false 1064 | 1065 | /@swc/helpers@0.5.2: 1066 | resolution: {integrity: sha512-E4KcWTpoLHqwPHLxidpOqQbcrZVgi0rsmmZXUle1jXmJfuIf/UWpczUJ7MZZ5tlxytgJXyp0w4PGkkeLiuIdZw==} 1067 | dependencies: 1068 | tslib: 2.6.2 1069 | dev: false 1070 | 1071 | /@t3-oss/env-core@0.7.3(typescript@5.3.3)(zod@3.22.4): 1072 | resolution: {integrity: sha512-hhtj59TKC6TKVdwJ0CcbKsvkr9R8Pc/SNKd4IgGUIC9T9X6moB8EZZ3FTJdABA/h9UABCK4J+KsF8gzmvMvHPg==} 1073 | peerDependencies: 1074 | typescript: '>=4.7.2' 1075 | zod: ^3.0.0 1076 | peerDependenciesMeta: 1077 | typescript: 1078 | optional: true 1079 | dependencies: 1080 | typescript: 5.3.3 1081 | zod: 3.22.4 1082 | dev: false 1083 | 1084 | /@t3-oss/env-nextjs@0.7.3(typescript@5.3.3)(zod@3.22.4): 1085 | resolution: {integrity: sha512-90TNffS17vjkQwfYyMUb4Zw9yqHwFV40f78qFug4JiQa5+N6DydTdlLOpzOcj8Cna/qpAVDwMSypofF/TVQDuA==} 1086 | peerDependencies: 1087 | typescript: '>=4.7.2' 1088 | zod: ^3.0.0 1089 | peerDependenciesMeta: 1090 | typescript: 1091 | optional: true 1092 | dependencies: 1093 | '@t3-oss/env-core': 0.7.3(typescript@5.3.3)(zod@3.22.4) 1094 | typescript: 5.3.3 1095 | zod: 3.22.4 1096 | dev: false 1097 | 1098 | /@tanstack/query-core@4.36.1: 1099 | resolution: {integrity: sha512-DJSilV5+ytBP1FbFcEJovv4rnnm/CokuVvrBEtW/Va9DvuJ3HksbXUJEpI0aV1KtuL4ZoO9AVE6PyNLzF7tLeA==} 1100 | dev: false 1101 | 1102 | /@tanstack/react-query@4.36.1(react-dom@18.2.0)(react@18.2.0): 1103 | resolution: {integrity: sha512-y7ySVHFyyQblPl3J3eQBWpXZkliroki3ARnBKsdJchlgt7yJLRDUcf4B8soufgiYt3pEQIkBWBx1N9/ZPIeUWw==} 1104 | peerDependencies: 1105 | react: ^16.8.0 || ^17.0.0 || ^18.0.0 1106 | react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 1107 | react-native: '*' 1108 | peerDependenciesMeta: 1109 | react-dom: 1110 | optional: true 1111 | react-native: 1112 | optional: true 1113 | dependencies: 1114 | '@tanstack/query-core': 4.36.1 1115 | react: 18.2.0 1116 | react-dom: 18.2.0(react@18.2.0) 1117 | use-sync-external-store: 1.2.0(react@18.2.0) 1118 | dev: false 1119 | 1120 | /@trpc/client@10.45.0(@trpc/server@10.45.0): 1121 | resolution: {integrity: sha512-m091R1qte9rvkvL8N1e/mzrbb8S4gb+Q4ZNJnEGDgd7kic/6a8DFgSciBTiCoSp0YwOTVhyQzSrrA/sZI6PhBg==} 1122 | peerDependencies: 1123 | '@trpc/server': 10.45.0 1124 | dependencies: 1125 | '@trpc/server': 10.45.0 1126 | dev: false 1127 | 1128 | /@trpc/next@10.45.0(@tanstack/react-query@4.36.1)(@trpc/client@10.45.0)(@trpc/react-query@10.45.0)(@trpc/server@10.45.0)(next@14.0.4)(react-dom@18.2.0)(react@18.2.0): 1129 | resolution: {integrity: sha512-saXajAb5GBpos9BNEtq/BeTOxmM4oCP3kyuGlMopNtHoacr71xHCItFnLsPWffM4DVW88uOXCFWaOtpOs5ThBw==} 1130 | peerDependencies: 1131 | '@tanstack/react-query': ^4.18.0 1132 | '@trpc/client': 10.45.0 1133 | '@trpc/react-query': 10.45.0 1134 | '@trpc/server': 10.45.0 1135 | next: '*' 1136 | react: '>=16.8.0' 1137 | react-dom: '>=16.8.0' 1138 | dependencies: 1139 | '@tanstack/react-query': 4.36.1(react-dom@18.2.0)(react@18.2.0) 1140 | '@trpc/client': 10.45.0(@trpc/server@10.45.0) 1141 | '@trpc/react-query': 10.45.0(@tanstack/react-query@4.36.1)(@trpc/client@10.45.0)(@trpc/server@10.45.0)(react-dom@18.2.0)(react@18.2.0) 1142 | '@trpc/server': 10.45.0 1143 | next: 14.0.4(react-dom@18.2.0)(react@18.2.0) 1144 | react: 18.2.0 1145 | react-dom: 18.2.0(react@18.2.0) 1146 | dev: false 1147 | 1148 | /@trpc/react-query@10.45.0(@tanstack/react-query@4.36.1)(@trpc/client@10.45.0)(@trpc/server@10.45.0)(react-dom@18.2.0)(react@18.2.0): 1149 | resolution: {integrity: sha512-MMc2pLwoaLZVwvLQyzJv3uEmdG3lORhifhVzR/drtavwDYwt+OEvH0w3s1zC7RaDdFpc6Nj2kkpHmdoU7BlAAw==} 1150 | peerDependencies: 1151 | '@tanstack/react-query': ^4.18.0 1152 | '@trpc/client': 10.45.0 1153 | '@trpc/server': 10.45.0 1154 | react: '>=16.8.0' 1155 | react-dom: '>=16.8.0' 1156 | dependencies: 1157 | '@tanstack/react-query': 4.36.1(react-dom@18.2.0)(react@18.2.0) 1158 | '@trpc/client': 10.45.0(@trpc/server@10.45.0) 1159 | '@trpc/server': 10.45.0 1160 | react: 18.2.0 1161 | react-dom: 18.2.0(react@18.2.0) 1162 | dev: false 1163 | 1164 | /@trpc/server@10.45.0: 1165 | resolution: {integrity: sha512-2Fwzv6nqpE0Ie/G7PeS0EVR89zLm+c1Mw7T+RAGtU807j4oaUx0zGkBXTu5u9AI+j+BYNN2GZxJcuDTAecbr1A==} 1166 | dev: false 1167 | 1168 | /@types/body-parser@1.19.5: 1169 | resolution: {integrity: sha512-fB3Zu92ucau0iQ0JMCFQE7b/dv8Ot07NI3KaZIkIUNXq82k4eBAqUaneXfleGY9JWskeS9y+u0nXMyspcuQrCg==} 1170 | dependencies: 1171 | '@types/connect': 3.4.38 1172 | '@types/node': 20.11.16 1173 | dev: false 1174 | 1175 | /@types/connect@3.4.38: 1176 | resolution: {integrity: sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==} 1177 | dependencies: 1178 | '@types/node': 20.11.16 1179 | dev: false 1180 | 1181 | /@types/cookies@0.7.7: 1182 | resolution: {integrity: sha512-h7BcvPUogWbKCzBR2lY4oqaZbO3jXZksexYJVFvkrFeLgbZjQkU4x8pRq6eg2MHXQhY0McQdqmmsxRWlVAHooA==} 1183 | dependencies: 1184 | '@types/connect': 3.4.38 1185 | '@types/express': 4.17.14 1186 | '@types/keygrip': 1.0.6 1187 | '@types/node': 20.11.16 1188 | dev: false 1189 | 1190 | /@types/express-serve-static-core@4.17.43: 1191 | resolution: {integrity: sha512-oaYtiBirUOPQGSWNGPWnzyAFJ0BP3cwvN4oWZQY+zUBwpVIGsKUkpBpSztp74drYcjavs7SKFZ4DX1V2QeN8rg==} 1192 | dependencies: 1193 | '@types/node': 20.11.16 1194 | '@types/qs': 6.9.11 1195 | '@types/range-parser': 1.2.7 1196 | '@types/send': 0.17.4 1197 | dev: false 1198 | 1199 | /@types/express@4.17.14: 1200 | resolution: {integrity: sha512-TEbt+vaPFQ+xpxFLFssxUDXj5cWCxZJjIcB7Yg0k0GMHGtgtQgpvx/MUQUeAkNbA9AAGrwkAsoeItdTgS7FMyg==} 1201 | dependencies: 1202 | '@types/body-parser': 1.19.5 1203 | '@types/express-serve-static-core': 4.17.43 1204 | '@types/qs': 6.9.11 1205 | '@types/serve-static': 1.15.5 1206 | dev: false 1207 | 1208 | /@types/http-errors@2.0.4: 1209 | resolution: {integrity: sha512-D0CFMMtydbJAegzOyHjtiKPLlvnm3iTZyZRSZoLq2mRhDdmLfIWOCYPfQJ4cu2erKghU++QvjcUjp/5h7hESpA==} 1210 | dev: false 1211 | 1212 | /@types/keygrip@1.0.6: 1213 | resolution: {integrity: sha512-lZuNAY9xeJt7Bx4t4dx0rYCDqGPW8RXhQZK1td7d4H6E9zYbLoOtjBvfwdTKpsyxQI/2jv+armjX/RW+ZNpXOQ==} 1214 | dev: false 1215 | 1216 | /@types/mime@1.3.5: 1217 | resolution: {integrity: sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==} 1218 | dev: false 1219 | 1220 | /@types/mime@3.0.4: 1221 | resolution: {integrity: sha512-iJt33IQnVRkqeqC7PzBHPTC6fDlRNRW8vjrgqtScAhrmMwe8c4Eo7+fUGTa+XdWrpEgpyKWMYmi2dIwMAYRzPw==} 1222 | dev: false 1223 | 1224 | /@types/node-fetch@2.6.2: 1225 | resolution: {integrity: sha512-DHqhlq5jeESLy19TYhLakJ07kNumXWjcDdxXsLUMJZ6ue8VZJj4kLPQVE/2mdHh3xZziNF1xppu5lwmS53HR+A==} 1226 | dependencies: 1227 | '@types/node': 20.11.16 1228 | form-data: 3.0.1 1229 | dev: false 1230 | 1231 | /@types/node@16.18.6: 1232 | resolution: {integrity: sha512-vmYJF0REqDyyU0gviezF/KHq/fYaUbFhkcNbQCuPGFQj6VTbXuHZoxs/Y7mutWe73C8AC6l9fFu8mSYiBAqkGA==} 1233 | dev: false 1234 | 1235 | /@types/node@20.11.16: 1236 | resolution: {integrity: sha512-gKb0enTmRCzXSSUJDq6/sPcqrfCv2mkkG6Jt/clpn5eiCbKTY+SgZUxo+p8ZKMof5dCp9vHQUAB7wOUTod22wQ==} 1237 | dependencies: 1238 | undici-types: 5.26.5 1239 | 1240 | /@types/prop-types@15.7.11: 1241 | resolution: {integrity: sha512-ga8y9v9uyeiLdpKddhxYQkxNDrfvuPrlFb0N1qnZZByvcElJaXthF1UhvCh9TLWJBEHeNtdnbysW7Y6Uq8CVng==} 1242 | 1243 | /@types/qs@6.9.11: 1244 | resolution: {integrity: sha512-oGk0gmhnEJK4Yyk+oI7EfXsLayXatCWPHary1MtcmbAifkobT9cM9yutG/hZKIseOU0MqbIwQ/u2nn/Gb+ltuQ==} 1245 | dev: false 1246 | 1247 | /@types/range-parser@1.2.7: 1248 | resolution: {integrity: sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==} 1249 | dev: false 1250 | 1251 | /@types/react-dom@18.2.18: 1252 | resolution: {integrity: sha512-TJxDm6OfAX2KJWJdMEVTwWke5Sc/E/RlnPGvGfS0W7+6ocy2xhDVQVh/KvC2Uf7kACs+gDytdusDSdWfWkaNzw==} 1253 | dependencies: 1254 | '@types/react': 18.2.53 1255 | 1256 | /@types/react@18.2.53: 1257 | resolution: {integrity: sha512-52IHsMDT8qATp9B9zoOyobW8W3/0QhaJQTw1HwRj0UY2yBpCAQ7+S/CqHYQ8niAm3p4ji+rWUQ9UCib0GxQ60w==} 1258 | dependencies: 1259 | '@types/prop-types': 15.7.11 1260 | '@types/scheduler': 0.16.8 1261 | csstype: 3.1.3 1262 | 1263 | /@types/scheduler@0.16.8: 1264 | resolution: {integrity: sha512-WZLiwShhwLRmeV6zH+GkbOFT6Z6VklCItrDioxUnv+u4Ll+8vKeFySoFyK/0ctcRpOmwAicELfmys1sDc/Rw+A==} 1265 | 1266 | /@types/send@0.17.4: 1267 | resolution: {integrity: sha512-x2EM6TJOybec7c52BX0ZspPodMsQUd5L6PRwOunVyVUhXiBSKf3AezDL8Dgvgt5o0UfKNfuA0eMLr2wLT4AiBA==} 1268 | dependencies: 1269 | '@types/mime': 1.3.5 1270 | '@types/node': 20.11.16 1271 | dev: false 1272 | 1273 | /@types/serve-static@1.15.5: 1274 | resolution: {integrity: sha512-PDRk21MnK70hja/YF8AHfC7yIsiQHn1rcXx7ijCFBX/k+XQJhQT/gw3xekXKJvx+5SXaMMS8oqQy09Mzvz2TuQ==} 1275 | dependencies: 1276 | '@types/http-errors': 2.0.4 1277 | '@types/mime': 3.0.4 1278 | '@types/node': 20.11.16 1279 | dev: false 1280 | 1281 | /ansi-regex@5.0.1: 1282 | resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} 1283 | engines: {node: '>=8'} 1284 | 1285 | /ansi-regex@6.0.1: 1286 | resolution: {integrity: sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==} 1287 | engines: {node: '>=12'} 1288 | 1289 | /ansi-styles@4.3.0: 1290 | resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} 1291 | engines: {node: '>=8'} 1292 | dependencies: 1293 | color-convert: 2.0.1 1294 | 1295 | /ansi-styles@6.2.1: 1296 | resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==} 1297 | engines: {node: '>=12'} 1298 | 1299 | /any-promise@1.3.0: 1300 | resolution: {integrity: sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==} 1301 | 1302 | /anymatch@3.1.3: 1303 | resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} 1304 | engines: {node: '>= 8'} 1305 | dependencies: 1306 | normalize-path: 3.0.0 1307 | picomatch: 2.3.1 1308 | 1309 | /arg@5.0.2: 1310 | resolution: {integrity: sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==} 1311 | 1312 | /aria-hidden@1.2.3: 1313 | resolution: {integrity: sha512-xcLxITLe2HYa1cnYnwCjkOO1PqUHQpozB8x9AR0OgWN2woOBi5kSDVxKfd0b7sb1hw5qFeJhXm9H1nu3xSfLeQ==} 1314 | engines: {node: '>=10'} 1315 | dependencies: 1316 | tslib: 2.6.2 1317 | dev: false 1318 | 1319 | /asn1js@3.0.5: 1320 | resolution: {integrity: sha512-FVnvrKJwpt9LP2lAMl8qZswRNm3T4q9CON+bxldk2iwk3FFpuwhx2FfinyitizWHsVYyaY+y5JzDR0rCMV5yTQ==} 1321 | engines: {node: '>=12.0.0'} 1322 | dependencies: 1323 | pvtsutils: 1.3.5 1324 | pvutils: 1.1.3 1325 | tslib: 2.6.2 1326 | dev: false 1327 | 1328 | /asynckit@0.4.0: 1329 | resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} 1330 | dev: false 1331 | 1332 | /autoprefixer@10.4.17(postcss@8.4.33): 1333 | resolution: {integrity: sha512-/cpVNRLSfhOtcGflT13P2794gVSgmPgTR+erw5ifnMLZb0UnSlkK4tquLmkd3BhA+nLo5tX8Cu0upUsGKvKbmg==} 1334 | engines: {node: ^10 || ^12 || >=14} 1335 | hasBin: true 1336 | peerDependencies: 1337 | postcss: ^8.1.0 1338 | dependencies: 1339 | browserslist: 4.22.3 1340 | caniuse-lite: 1.0.30001583 1341 | fraction.js: 4.3.7 1342 | normalize-range: 0.1.2 1343 | picocolors: 1.0.0 1344 | postcss: 8.4.33 1345 | postcss-value-parser: 4.2.0 1346 | dev: true 1347 | 1348 | /balanced-match@1.0.2: 1349 | resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} 1350 | 1351 | /binary-extensions@2.2.0: 1352 | resolution: {integrity: sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==} 1353 | engines: {node: '>=8'} 1354 | 1355 | /brace-expansion@2.0.1: 1356 | resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} 1357 | dependencies: 1358 | balanced-match: 1.0.2 1359 | 1360 | /braces@3.0.2: 1361 | resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==} 1362 | engines: {node: '>=8'} 1363 | dependencies: 1364 | fill-range: 7.0.1 1365 | 1366 | /browserslist@4.22.3: 1367 | resolution: {integrity: sha512-UAp55yfwNv0klWNapjs/ktHoguxuQNGnOzxYmfnXIS+8AsRDZkSDxg7R1AX3GKzn078SBI5dzwzj/Yx0Or0e3A==} 1368 | engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} 1369 | hasBin: true 1370 | dependencies: 1371 | caniuse-lite: 1.0.30001583 1372 | electron-to-chromium: 1.4.656 1373 | node-releases: 2.0.14 1374 | update-browserslist-db: 1.0.13(browserslist@4.22.3) 1375 | dev: true 1376 | 1377 | /busboy@1.6.0: 1378 | resolution: {integrity: sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==} 1379 | engines: {node: '>=10.16.0'} 1380 | dependencies: 1381 | streamsearch: 1.1.0 1382 | dev: false 1383 | 1384 | /camelcase-css@2.0.1: 1385 | resolution: {integrity: sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==} 1386 | engines: {node: '>= 6'} 1387 | 1388 | /camelcase-keys@6.2.2: 1389 | resolution: {integrity: sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg==} 1390 | engines: {node: '>=8'} 1391 | dependencies: 1392 | camelcase: 5.3.1 1393 | map-obj: 4.3.0 1394 | quick-lru: 4.0.1 1395 | dev: false 1396 | 1397 | /camelcase@5.3.1: 1398 | resolution: {integrity: sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==} 1399 | engines: {node: '>=6'} 1400 | dev: false 1401 | 1402 | /caniuse-lite@1.0.30001583: 1403 | resolution: {integrity: sha512-acWTYaha8xfhA/Du/z4sNZjHUWjkiuoAi2LM+T/aL+kemKQgPT1xBb/YKjlQ0Qo8gvbHsGNplrEJ+9G3gL7i4Q==} 1404 | 1405 | /chokidar@3.5.3: 1406 | resolution: {integrity: sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==} 1407 | engines: {node: '>= 8.10.0'} 1408 | dependencies: 1409 | anymatch: 3.1.3 1410 | braces: 3.0.2 1411 | glob-parent: 5.1.2 1412 | is-binary-path: 2.1.0 1413 | is-glob: 4.0.3 1414 | normalize-path: 3.0.0 1415 | readdirp: 3.6.0 1416 | optionalDependencies: 1417 | fsevents: 2.3.3 1418 | 1419 | /class-variance-authority@0.7.0: 1420 | resolution: {integrity: sha512-jFI8IQw4hczaL4ALINxqLEXQbWcNjoSkloa4IaufXCJr6QawJyw7tuRysRsrE8w2p/4gGaxKIt/hX3qz/IbD1A==} 1421 | dependencies: 1422 | clsx: 2.0.0 1423 | dev: false 1424 | 1425 | /client-only@0.0.1: 1426 | resolution: {integrity: sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==} 1427 | dev: false 1428 | 1429 | /clsx@2.0.0: 1430 | resolution: {integrity: sha512-rQ1+kcj+ttHG0MKVGBUXwayCCF1oh39BF5COIpRzuCEv8Mwjv0XucrI2ExNTOn9IlLifGClWQcU9BrZORvtw6Q==} 1431 | engines: {node: '>=6'} 1432 | dev: false 1433 | 1434 | /clsx@2.1.0: 1435 | resolution: {integrity: sha512-m3iNNWpd9rl3jvvcBnu70ylMdrXt8Vlq4HYadnU5fwcOtvkSQWPmj7amUcDT2qYI7risszBjI5AUIUox9D16pg==} 1436 | engines: {node: '>=6'} 1437 | dev: false 1438 | 1439 | /color-convert@2.0.1: 1440 | resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} 1441 | engines: {node: '>=7.0.0'} 1442 | dependencies: 1443 | color-name: 1.1.4 1444 | 1445 | /color-name@1.1.4: 1446 | resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} 1447 | 1448 | /combined-stream@1.0.8: 1449 | resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} 1450 | engines: {node: '>= 0.8'} 1451 | dependencies: 1452 | delayed-stream: 1.0.0 1453 | dev: false 1454 | 1455 | /commander@4.1.1: 1456 | resolution: {integrity: sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==} 1457 | engines: {node: '>= 6'} 1458 | 1459 | /cookie@0.5.0: 1460 | resolution: {integrity: sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==} 1461 | engines: {node: '>= 0.6'} 1462 | dev: false 1463 | 1464 | /cross-spawn@7.0.3: 1465 | resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} 1466 | engines: {node: '>= 8'} 1467 | dependencies: 1468 | path-key: 3.1.1 1469 | shebang-command: 2.0.0 1470 | which: 2.0.2 1471 | 1472 | /cssesc@3.0.0: 1473 | resolution: {integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==} 1474 | engines: {node: '>=4'} 1475 | hasBin: true 1476 | 1477 | /csstype@3.1.1: 1478 | resolution: {integrity: sha512-DJR/VvkAvSZW9bTouZue2sSxDwdTN92uHjqeKVm+0dAqdfNykRzQ95tay8aXMBAAPpUiq4Qcug2L7neoRh2Egw==} 1479 | dev: false 1480 | 1481 | /csstype@3.1.3: 1482 | resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==} 1483 | 1484 | /deepmerge@4.2.2: 1485 | resolution: {integrity: sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg==} 1486 | engines: {node: '>=0.10.0'} 1487 | dev: false 1488 | 1489 | /delayed-stream@1.0.0: 1490 | resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} 1491 | engines: {node: '>=0.4.0'} 1492 | dev: false 1493 | 1494 | /detect-node-es@1.1.0: 1495 | resolution: {integrity: sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ==} 1496 | dev: false 1497 | 1498 | /didyoumean@1.2.2: 1499 | resolution: {integrity: sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==} 1500 | 1501 | /dlv@1.1.3: 1502 | resolution: {integrity: sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==} 1503 | 1504 | /dot-case@3.0.4: 1505 | resolution: {integrity: sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==} 1506 | dependencies: 1507 | no-case: 3.0.4 1508 | tslib: 2.4.1 1509 | dev: false 1510 | 1511 | /eastasianwidth@0.2.0: 1512 | resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} 1513 | 1514 | /electron-to-chromium@1.4.656: 1515 | resolution: {integrity: sha512-9AQB5eFTHyR3Gvt2t/NwR0le2jBSUNwCnMbUCejFWHD+so4tH40/dRLgoE+jxlPeWS43XJewyvCv+I8LPMl49Q==} 1516 | dev: true 1517 | 1518 | /emoji-regex@8.0.0: 1519 | resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} 1520 | 1521 | /emoji-regex@9.2.2: 1522 | resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} 1523 | 1524 | /escalade@3.1.1: 1525 | resolution: {integrity: sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==} 1526 | engines: {node: '>=6'} 1527 | dev: true 1528 | 1529 | /fast-glob@3.3.2: 1530 | resolution: {integrity: sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==} 1531 | engines: {node: '>=8.6.0'} 1532 | dependencies: 1533 | '@nodelib/fs.stat': 2.0.5 1534 | '@nodelib/fs.walk': 1.2.8 1535 | glob-parent: 5.1.2 1536 | merge2: 1.4.1 1537 | micromatch: 4.0.5 1538 | 1539 | /fastq@1.17.0: 1540 | resolution: {integrity: sha512-zGygtijUMT7jnk3h26kUms3BkSDp4IfIKjmnqI2tvx6nuBfiF1UqOxbnLfzdv+apBy+53oaImsKtMw/xYbW+1w==} 1541 | dependencies: 1542 | reusify: 1.0.4 1543 | 1544 | /fill-range@7.0.1: 1545 | resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==} 1546 | engines: {node: '>=8'} 1547 | dependencies: 1548 | to-regex-range: 5.0.1 1549 | 1550 | /foreground-child@3.1.1: 1551 | resolution: {integrity: sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==} 1552 | engines: {node: '>=14'} 1553 | dependencies: 1554 | cross-spawn: 7.0.3 1555 | signal-exit: 4.1.0 1556 | 1557 | /form-data@3.0.1: 1558 | resolution: {integrity: sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg==} 1559 | engines: {node: '>= 6'} 1560 | dependencies: 1561 | asynckit: 0.4.0 1562 | combined-stream: 1.0.8 1563 | mime-types: 2.1.35 1564 | dev: false 1565 | 1566 | /fraction.js@4.3.7: 1567 | resolution: {integrity: sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==} 1568 | dev: true 1569 | 1570 | /framer-motion@10.18.0(react-dom@18.2.0)(react@18.2.0): 1571 | resolution: {integrity: sha512-oGlDh1Q1XqYPksuTD/usb0I70hq95OUzmL9+6Zd+Hs4XV0oaISBa/UUMSjYiq6m8EUF32132mOJ8xVZS+I0S6w==} 1572 | peerDependencies: 1573 | react: ^18.0.0 1574 | react-dom: ^18.0.0 1575 | peerDependenciesMeta: 1576 | react: 1577 | optional: true 1578 | react-dom: 1579 | optional: true 1580 | dependencies: 1581 | react: 18.2.0 1582 | react-dom: 18.2.0(react@18.2.0) 1583 | tslib: 2.6.2 1584 | optionalDependencies: 1585 | '@emotion/is-prop-valid': 0.8.8 1586 | dev: false 1587 | 1588 | /fsevents@2.3.3: 1589 | resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} 1590 | engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} 1591 | os: [darwin] 1592 | requiresBuild: true 1593 | optional: true 1594 | 1595 | /function-bind@1.1.2: 1596 | resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} 1597 | 1598 | /get-nonce@1.0.1: 1599 | resolution: {integrity: sha512-FJhYRoDaiatfEkUK8HKlicmu/3SGFD51q3itKDGoSTysQJBnfOcxU5GxnhE1E6soB76MbT0MBtnKJuXyAx+96Q==} 1600 | engines: {node: '>=6'} 1601 | dev: false 1602 | 1603 | /glob-parent@5.1.2: 1604 | resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} 1605 | engines: {node: '>= 6'} 1606 | dependencies: 1607 | is-glob: 4.0.3 1608 | 1609 | /glob-parent@6.0.2: 1610 | resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} 1611 | engines: {node: '>=10.13.0'} 1612 | dependencies: 1613 | is-glob: 4.0.3 1614 | 1615 | /glob-to-regexp@0.4.1: 1616 | resolution: {integrity: sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==} 1617 | dev: false 1618 | 1619 | /glob@10.3.10: 1620 | resolution: {integrity: sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g==} 1621 | engines: {node: '>=16 || 14 >=14.17'} 1622 | hasBin: true 1623 | dependencies: 1624 | foreground-child: 3.1.1 1625 | jackspeak: 2.3.6 1626 | minimatch: 9.0.3 1627 | minipass: 7.0.4 1628 | path-scurry: 1.10.1 1629 | 1630 | /graceful-fs@4.2.11: 1631 | resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} 1632 | dev: false 1633 | 1634 | /hasown@2.0.0: 1635 | resolution: {integrity: sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==} 1636 | engines: {node: '>= 0.4'} 1637 | dependencies: 1638 | function-bind: 1.1.2 1639 | 1640 | /invariant@2.2.4: 1641 | resolution: {integrity: sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==} 1642 | dependencies: 1643 | loose-envify: 1.4.0 1644 | dev: false 1645 | 1646 | /is-binary-path@2.1.0: 1647 | resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} 1648 | engines: {node: '>=8'} 1649 | dependencies: 1650 | binary-extensions: 2.2.0 1651 | 1652 | /is-core-module@2.13.1: 1653 | resolution: {integrity: sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==} 1654 | dependencies: 1655 | hasown: 2.0.0 1656 | 1657 | /is-extglob@2.1.1: 1658 | resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} 1659 | engines: {node: '>=0.10.0'} 1660 | 1661 | /is-fullwidth-code-point@3.0.0: 1662 | resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} 1663 | engines: {node: '>=8'} 1664 | 1665 | /is-glob@4.0.3: 1666 | resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} 1667 | engines: {node: '>=0.10.0'} 1668 | dependencies: 1669 | is-extglob: 2.1.1 1670 | 1671 | /is-number@7.0.0: 1672 | resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} 1673 | engines: {node: '>=0.12.0'} 1674 | 1675 | /isexe@2.0.0: 1676 | resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} 1677 | 1678 | /jackspeak@2.3.6: 1679 | resolution: {integrity: sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ==} 1680 | engines: {node: '>=14'} 1681 | dependencies: 1682 | '@isaacs/cliui': 8.0.2 1683 | optionalDependencies: 1684 | '@pkgjs/parseargs': 0.11.0 1685 | 1686 | /jiti@1.21.0: 1687 | resolution: {integrity: sha512-gFqAIbuKyyso/3G2qhiO2OM6shY6EPP/R0+mkDbyspxKazh8BXDC5FiFsUjlczgdNz/vfra0da2y+aHrusLG/Q==} 1688 | hasBin: true 1689 | 1690 | /js-cookie@3.0.1: 1691 | resolution: {integrity: sha512-+0rgsUXZu4ncpPxRL+lNEptWMOWl9etvPHc/koSRp6MPwpRYAhmk0dUG00J4bxVV3r9uUzfo24wW0knS07SKSw==} 1692 | engines: {node: '>=12'} 1693 | dev: false 1694 | 1695 | /js-tokens@4.0.0: 1696 | resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} 1697 | dev: false 1698 | 1699 | /lilconfig@2.1.0: 1700 | resolution: {integrity: sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==} 1701 | engines: {node: '>=10'} 1702 | 1703 | /lilconfig@3.0.0: 1704 | resolution: {integrity: sha512-K2U4W2Ff5ibV7j7ydLr+zLAkIg5JJ4lPn1Ltsdt+Tz/IjQ8buJ55pZAxoP34lqIiwtF9iAvtLv3JGv7CAyAg+g==} 1705 | engines: {node: '>=14'} 1706 | 1707 | /lines-and-columns@1.2.4: 1708 | resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} 1709 | 1710 | /loose-envify@1.4.0: 1711 | resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} 1712 | hasBin: true 1713 | dependencies: 1714 | js-tokens: 4.0.0 1715 | dev: false 1716 | 1717 | /lower-case@2.0.2: 1718 | resolution: {integrity: sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==} 1719 | dependencies: 1720 | tslib: 2.4.1 1721 | dev: false 1722 | 1723 | /lru-cache@10.2.0: 1724 | resolution: {integrity: sha512-2bIM8x+VAf6JT4bKAljS1qUWgMsqZRPGJS6FSahIMPVvctcNhyVp7AJu7quxOW9jwkryBReKZY5tY5JYv2n/7Q==} 1725 | engines: {node: 14 || >=16.14} 1726 | 1727 | /lucide-react@0.284.0(react@18.2.0): 1728 | resolution: {integrity: sha512-dVSMHYAya/TeY3+vsk+VQJEKNQN2AhIo0+Dp09B2qpzvcBuu93H98YZykFcjIAfmanFiDd8nqfXFR38L757cyQ==} 1729 | peerDependencies: 1730 | react: ^16.5.1 || ^17.0.0 || ^18.0.0 1731 | dependencies: 1732 | react: 18.2.0 1733 | dev: false 1734 | 1735 | /map-obj@4.3.0: 1736 | resolution: {integrity: sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ==} 1737 | engines: {node: '>=8'} 1738 | dev: false 1739 | 1740 | /merge2@1.4.1: 1741 | resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} 1742 | engines: {node: '>= 8'} 1743 | 1744 | /micromatch@4.0.5: 1745 | resolution: {integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==} 1746 | engines: {node: '>=8.6'} 1747 | dependencies: 1748 | braces: 3.0.2 1749 | picomatch: 2.3.1 1750 | 1751 | /mime-db@1.52.0: 1752 | resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} 1753 | engines: {node: '>= 0.6'} 1754 | dev: false 1755 | 1756 | /mime-types@2.1.35: 1757 | resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} 1758 | engines: {node: '>= 0.6'} 1759 | dependencies: 1760 | mime-db: 1.52.0 1761 | dev: false 1762 | 1763 | /minimatch@9.0.3: 1764 | resolution: {integrity: sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==} 1765 | engines: {node: '>=16 || 14 >=14.17'} 1766 | dependencies: 1767 | brace-expansion: 2.0.1 1768 | 1769 | /minipass@7.0.4: 1770 | resolution: {integrity: sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==} 1771 | engines: {node: '>=16 || 14 >=14.17'} 1772 | 1773 | /mz@2.7.0: 1774 | resolution: {integrity: sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==} 1775 | dependencies: 1776 | any-promise: 1.3.0 1777 | object-assign: 4.1.1 1778 | thenify-all: 1.6.0 1779 | 1780 | /nanoid@3.3.7: 1781 | resolution: {integrity: sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==} 1782 | engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} 1783 | hasBin: true 1784 | 1785 | /next-themes@0.2.1(next@14.0.4)(react-dom@18.2.0)(react@18.2.0): 1786 | resolution: {integrity: sha512-B+AKNfYNIzh0vqQQKqQItTS8evEouKD7H5Hj3kmuPERwddR2TxvDSFZuTj6T7Jfn1oyeUyJMydPl1Bkxkh0W7A==} 1787 | peerDependencies: 1788 | next: '*' 1789 | react: '*' 1790 | react-dom: '*' 1791 | dependencies: 1792 | next: 14.0.4(react-dom@18.2.0)(react@18.2.0) 1793 | react: 18.2.0 1794 | react-dom: 18.2.0(react@18.2.0) 1795 | dev: false 1796 | 1797 | /next@14.0.4(react-dom@18.2.0)(react@18.2.0): 1798 | resolution: {integrity: sha512-qbwypnM7327SadwFtxXnQdGiKpkuhaRLE2uq62/nRul9cj9KhQ5LhHmlziTNqUidZotw/Q1I9OjirBROdUJNgA==} 1799 | engines: {node: '>=18.17.0'} 1800 | hasBin: true 1801 | peerDependencies: 1802 | '@opentelemetry/api': ^1.1.0 1803 | react: ^18.2.0 1804 | react-dom: ^18.2.0 1805 | sass: ^1.3.0 1806 | peerDependenciesMeta: 1807 | '@opentelemetry/api': 1808 | optional: true 1809 | sass: 1810 | optional: true 1811 | dependencies: 1812 | '@next/env': 14.0.4 1813 | '@swc/helpers': 0.5.2 1814 | busboy: 1.6.0 1815 | caniuse-lite: 1.0.30001583 1816 | graceful-fs: 4.2.11 1817 | postcss: 8.4.31 1818 | react: 18.2.0 1819 | react-dom: 18.2.0(react@18.2.0) 1820 | styled-jsx: 5.1.1(react@18.2.0) 1821 | watchpack: 2.4.0 1822 | optionalDependencies: 1823 | '@next/swc-darwin-arm64': 14.0.4 1824 | '@next/swc-darwin-x64': 14.0.4 1825 | '@next/swc-linux-arm64-gnu': 14.0.4 1826 | '@next/swc-linux-arm64-musl': 14.0.4 1827 | '@next/swc-linux-x64-gnu': 14.0.4 1828 | '@next/swc-linux-x64-musl': 14.0.4 1829 | '@next/swc-win32-arm64-msvc': 14.0.4 1830 | '@next/swc-win32-ia32-msvc': 14.0.4 1831 | '@next/swc-win32-x64-msvc': 14.0.4 1832 | transitivePeerDependencies: 1833 | - '@babel/core' 1834 | - babel-plugin-macros 1835 | dev: false 1836 | 1837 | /no-case@3.0.4: 1838 | resolution: {integrity: sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==} 1839 | dependencies: 1840 | lower-case: 2.0.2 1841 | tslib: 2.4.1 1842 | dev: false 1843 | 1844 | /node-fetch-native@1.0.1: 1845 | resolution: {integrity: sha512-VzW+TAk2wE4X9maiKMlT+GsPU4OMmR1U9CrHSmd3DFLn2IcZ9VJ6M6BBugGfYUnPCLSYxXdZy17M0BEJyhUTwg==} 1846 | dev: false 1847 | 1848 | /node-releases@2.0.14: 1849 | resolution: {integrity: sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==} 1850 | dev: true 1851 | 1852 | /normalize-path@3.0.0: 1853 | resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} 1854 | engines: {node: '>=0.10.0'} 1855 | 1856 | /normalize-range@0.1.2: 1857 | resolution: {integrity: sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==} 1858 | engines: {node: '>=0.10.0'} 1859 | dev: true 1860 | 1861 | /object-assign@4.1.1: 1862 | resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} 1863 | engines: {node: '>=0.10.0'} 1864 | 1865 | /object-hash@3.0.0: 1866 | resolution: {integrity: sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==} 1867 | engines: {node: '>= 6'} 1868 | 1869 | /path-key@3.1.1: 1870 | resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} 1871 | engines: {node: '>=8'} 1872 | 1873 | /path-parse@1.0.7: 1874 | resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} 1875 | 1876 | /path-scurry@1.10.1: 1877 | resolution: {integrity: sha512-MkhCqzzBEpPvxxQ71Md0b1Kk51W01lrYvlMzSUaIzNsODdd7mqhiimSZlr+VegAz5Z6Vzt9Xg2ttE//XBhH3EQ==} 1878 | engines: {node: '>=16 || 14 >=14.17'} 1879 | dependencies: 1880 | lru-cache: 10.2.0 1881 | minipass: 7.0.4 1882 | 1883 | /path-to-regexp@6.2.1: 1884 | resolution: {integrity: sha512-JLyh7xT1kizaEvcaXOQwOc2/Yhw6KZOvPf1S8401UyLk86CU79LN3vl7ztXGm/pZ+YjoyAJ4rxmHwbkBXJX+yw==} 1885 | dev: false 1886 | 1887 | /picocolors@1.0.0: 1888 | resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==} 1889 | 1890 | /picomatch@2.3.1: 1891 | resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} 1892 | engines: {node: '>=8.6'} 1893 | 1894 | /pify@2.3.0: 1895 | resolution: {integrity: sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==} 1896 | engines: {node: '>=0.10.0'} 1897 | 1898 | /pirates@4.0.6: 1899 | resolution: {integrity: sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==} 1900 | engines: {node: '>= 6'} 1901 | 1902 | /postcss-import@15.1.0(postcss@8.4.33): 1903 | resolution: {integrity: sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==} 1904 | engines: {node: '>=14.0.0'} 1905 | peerDependencies: 1906 | postcss: ^8.0.0 1907 | dependencies: 1908 | postcss: 8.4.33 1909 | postcss-value-parser: 4.2.0 1910 | read-cache: 1.0.0 1911 | resolve: 1.22.8 1912 | 1913 | /postcss-js@4.0.1(postcss@8.4.33): 1914 | resolution: {integrity: sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==} 1915 | engines: {node: ^12 || ^14 || >= 16} 1916 | peerDependencies: 1917 | postcss: ^8.4.21 1918 | dependencies: 1919 | camelcase-css: 2.0.1 1920 | postcss: 8.4.33 1921 | 1922 | /postcss-load-config@4.0.2(postcss@8.4.33): 1923 | resolution: {integrity: sha512-bSVhyJGL00wMVoPUzAVAnbEoWyqRxkjv64tUl427SKnPrENtq6hJwUojroMz2VB+Q1edmi4IfrAPpami5VVgMQ==} 1924 | engines: {node: '>= 14'} 1925 | peerDependencies: 1926 | postcss: '>=8.0.9' 1927 | ts-node: '>=9.0.0' 1928 | peerDependenciesMeta: 1929 | postcss: 1930 | optional: true 1931 | ts-node: 1932 | optional: true 1933 | dependencies: 1934 | lilconfig: 3.0.0 1935 | postcss: 8.4.33 1936 | yaml: 2.3.4 1937 | 1938 | /postcss-nested@6.0.1(postcss@8.4.33): 1939 | resolution: {integrity: sha512-mEp4xPMi5bSWiMbsgoPfcP74lsWLHkQbZc3sY+jWYd65CUwXrUaTp0fmNpa01ZcETKlIgUdFN/MpS2xZtqL9dQ==} 1940 | engines: {node: '>=12.0'} 1941 | peerDependencies: 1942 | postcss: ^8.2.14 1943 | dependencies: 1944 | postcss: 8.4.33 1945 | postcss-selector-parser: 6.0.15 1946 | 1947 | /postcss-selector-parser@6.0.15: 1948 | resolution: {integrity: sha512-rEYkQOMUCEMhsKbK66tbEU9QVIxbhN18YiniAwA7XQYTVBqrBy+P2p5JcdqsHgKM2zWylp8d7J6eszocfds5Sw==} 1949 | engines: {node: '>=4'} 1950 | dependencies: 1951 | cssesc: 3.0.0 1952 | util-deprecate: 1.0.2 1953 | 1954 | /postcss-value-parser@4.2.0: 1955 | resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==} 1956 | 1957 | /postcss@8.4.31: 1958 | resolution: {integrity: sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==} 1959 | engines: {node: ^10 || ^12 || >=14} 1960 | dependencies: 1961 | nanoid: 3.3.7 1962 | picocolors: 1.0.0 1963 | source-map-js: 1.0.2 1964 | dev: false 1965 | 1966 | /postcss@8.4.33: 1967 | resolution: {integrity: sha512-Kkpbhhdjw2qQs2O2DGX+8m5OVqEcbB9HRBvuYM9pgrjEFUg30A9LmXNlTAUj4S9kgtGyrMbTzVjH7E+s5Re2yg==} 1968 | engines: {node: ^10 || ^12 || >=14} 1969 | dependencies: 1970 | nanoid: 3.3.7 1971 | picocolors: 1.0.0 1972 | source-map-js: 1.0.2 1973 | 1974 | /prisma@5.9.1: 1975 | resolution: {integrity: sha512-Hy/8KJZz0ELtkw4FnG9MS9rNWlXcJhf98Z2QMqi0QiVMoS8PzsBkpla0/Y5hTlob8F3HeECYphBjqmBxrluUrQ==} 1976 | engines: {node: '>=16.13'} 1977 | hasBin: true 1978 | requiresBuild: true 1979 | dependencies: 1980 | '@prisma/engines': 5.9.1 1981 | 1982 | /pvtsutils@1.3.5: 1983 | resolution: {integrity: sha512-ARvb14YB9Nm2Xi6nBq1ZX6dAM0FsJnuk+31aUp4TrcZEdKUlSqOqsxJHUPJDNE3qiIp+iUPEIeR6Je/tgV7zsA==} 1984 | dependencies: 1985 | tslib: 2.6.2 1986 | dev: false 1987 | 1988 | /pvutils@1.1.3: 1989 | resolution: {integrity: sha512-pMpnA0qRdFp32b1sJl1wOJNxZLQ2cbQx+k6tjNtZ8CpvVhNqEPRgivZ2WOUev2YMajecdH7ctUPDvEe87nariQ==} 1990 | engines: {node: '>=6.0.0'} 1991 | dev: false 1992 | 1993 | /queue-microtask@1.2.3: 1994 | resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} 1995 | 1996 | /quick-lru@4.0.1: 1997 | resolution: {integrity: sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g==} 1998 | engines: {node: '>=8'} 1999 | dev: false 2000 | 2001 | /react-dom@18.2.0(react@18.2.0): 2002 | resolution: {integrity: sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==} 2003 | peerDependencies: 2004 | react: ^18.2.0 2005 | dependencies: 2006 | loose-envify: 1.4.0 2007 | react: 18.2.0 2008 | scheduler: 0.23.0 2009 | dev: false 2010 | 2011 | /react-remove-scroll-bar@2.3.4(@types/react@18.2.53)(react@18.2.0): 2012 | resolution: {integrity: sha512-63C4YQBUt0m6ALadE9XV56hV8BgJWDmmTPY758iIJjfQKt2nYwoUrPk0LXRXcB/yIj82T1/Ixfdpdk68LwIB0A==} 2013 | engines: {node: '>=10'} 2014 | peerDependencies: 2015 | '@types/react': ^16.8.0 || ^17.0.0 || ^18.0.0 2016 | react: ^16.8.0 || ^17.0.0 || ^18.0.0 2017 | peerDependenciesMeta: 2018 | '@types/react': 2019 | optional: true 2020 | dependencies: 2021 | '@types/react': 18.2.53 2022 | react: 18.2.0 2023 | react-style-singleton: 2.2.1(@types/react@18.2.53)(react@18.2.0) 2024 | tslib: 2.6.2 2025 | dev: false 2026 | 2027 | /react-remove-scroll@2.5.5(@types/react@18.2.53)(react@18.2.0): 2028 | resolution: {integrity: sha512-ImKhrzJJsyXJfBZ4bzu8Bwpka14c/fQt0k+cyFp/PBhTfyDnU5hjOtM4AG/0AMyy8oKzOTR0lDgJIM7pYXI0kw==} 2029 | engines: {node: '>=10'} 2030 | peerDependencies: 2031 | '@types/react': ^16.8.0 || ^17.0.0 || ^18.0.0 2032 | react: ^16.8.0 || ^17.0.0 || ^18.0.0 2033 | peerDependenciesMeta: 2034 | '@types/react': 2035 | optional: true 2036 | dependencies: 2037 | '@types/react': 18.2.53 2038 | react: 18.2.0 2039 | react-remove-scroll-bar: 2.3.4(@types/react@18.2.53)(react@18.2.0) 2040 | react-style-singleton: 2.2.1(@types/react@18.2.53)(react@18.2.0) 2041 | tslib: 2.6.2 2042 | use-callback-ref: 1.3.1(@types/react@18.2.53)(react@18.2.0) 2043 | use-sidecar: 1.1.2(@types/react@18.2.53)(react@18.2.0) 2044 | dev: false 2045 | 2046 | /react-style-singleton@2.2.1(@types/react@18.2.53)(react@18.2.0): 2047 | resolution: {integrity: sha512-ZWj0fHEMyWkHzKYUr2Bs/4zU6XLmq9HsgBURm7g5pAVfyn49DgUiNgY2d4lXRlYSiCif9YBGpQleewkcqddc7g==} 2048 | engines: {node: '>=10'} 2049 | peerDependencies: 2050 | '@types/react': ^16.8.0 || ^17.0.0 || ^18.0.0 2051 | react: ^16.8.0 || ^17.0.0 || ^18.0.0 2052 | peerDependenciesMeta: 2053 | '@types/react': 2054 | optional: true 2055 | dependencies: 2056 | '@types/react': 18.2.53 2057 | get-nonce: 1.0.1 2058 | invariant: 2.2.4 2059 | react: 18.2.0 2060 | tslib: 2.6.2 2061 | dev: false 2062 | 2063 | /react@18.2.0: 2064 | resolution: {integrity: sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==} 2065 | engines: {node: '>=0.10.0'} 2066 | dependencies: 2067 | loose-envify: 1.4.0 2068 | dev: false 2069 | 2070 | /read-cache@1.0.0: 2071 | resolution: {integrity: sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==} 2072 | dependencies: 2073 | pify: 2.3.0 2074 | 2075 | /readdirp@3.6.0: 2076 | resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} 2077 | engines: {node: '>=8.10.0'} 2078 | dependencies: 2079 | picomatch: 2.3.1 2080 | 2081 | /regenerator-runtime@0.14.1: 2082 | resolution: {integrity: sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==} 2083 | dev: false 2084 | 2085 | /resolve@1.22.8: 2086 | resolution: {integrity: sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==} 2087 | hasBin: true 2088 | dependencies: 2089 | is-core-module: 2.13.1 2090 | path-parse: 1.0.7 2091 | supports-preserve-symlinks-flag: 1.0.0 2092 | 2093 | /reusify@1.0.4: 2094 | resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} 2095 | engines: {iojs: '>=1.0.0', node: '>=0.10.0'} 2096 | 2097 | /run-parallel@1.2.0: 2098 | resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} 2099 | dependencies: 2100 | queue-microtask: 1.2.3 2101 | 2102 | /scheduler@0.23.0: 2103 | resolution: {integrity: sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==} 2104 | dependencies: 2105 | loose-envify: 1.4.0 2106 | dev: false 2107 | 2108 | /shebang-command@2.0.0: 2109 | resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} 2110 | engines: {node: '>=8'} 2111 | dependencies: 2112 | shebang-regex: 3.0.0 2113 | 2114 | /shebang-regex@3.0.0: 2115 | resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} 2116 | engines: {node: '>=8'} 2117 | 2118 | /signal-exit@4.1.0: 2119 | resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} 2120 | engines: {node: '>=14'} 2121 | 2122 | /snake-case@3.0.4: 2123 | resolution: {integrity: sha512-LAOh4z89bGQvl9pFfNF8V146i7o7/CqFPbqzYgP+yYzDIDeS9HaNFtXABamRW+AQzEVODcvE79ljJ+8a9YSdMg==} 2124 | dependencies: 2125 | dot-case: 3.0.4 2126 | tslib: 2.4.1 2127 | dev: false 2128 | 2129 | /snakecase-keys@3.2.1: 2130 | resolution: {integrity: sha512-CjU5pyRfwOtaOITYv5C8DzpZ8XA/ieRsDpr93HI2r6e3YInC6moZpSQbmUtg8cTk58tq2x3jcG2gv+p1IZGmMA==} 2131 | engines: {node: '>=8'} 2132 | dependencies: 2133 | map-obj: 4.3.0 2134 | to-snake-case: 1.0.0 2135 | dev: false 2136 | 2137 | /snakecase-keys@5.4.4: 2138 | resolution: {integrity: sha512-YTywJG93yxwHLgrYLZjlC75moVEX04LZM4FHfihjHe1FCXm+QaLOFfSf535aXOAd0ArVQMWUAe8ZPm4VtWyXaA==} 2139 | engines: {node: '>=12'} 2140 | dependencies: 2141 | map-obj: 4.3.0 2142 | snake-case: 3.0.4 2143 | type-fest: 2.19.0 2144 | dev: false 2145 | 2146 | /sonner@1.4.0(react-dom@18.2.0)(react@18.2.0): 2147 | resolution: {integrity: sha512-nvkTsIuOmi9e5Wz5If8ldasJjZNVfwiXYijBi2dbijvTQnQppvMcXTFNxL/NUFWlI2yJ1JX7TREDsg+gYm9WyA==} 2148 | peerDependencies: 2149 | react: ^18.0.0 2150 | react-dom: ^18.0.0 2151 | dependencies: 2152 | react: 18.2.0 2153 | react-dom: 18.2.0(react@18.2.0) 2154 | dev: false 2155 | 2156 | /source-map-js@1.0.2: 2157 | resolution: {integrity: sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==} 2158 | engines: {node: '>=0.10.0'} 2159 | 2160 | /streamsearch@1.1.0: 2161 | resolution: {integrity: sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==} 2162 | engines: {node: '>=10.0.0'} 2163 | dev: false 2164 | 2165 | /string-width@4.2.3: 2166 | resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} 2167 | engines: {node: '>=8'} 2168 | dependencies: 2169 | emoji-regex: 8.0.0 2170 | is-fullwidth-code-point: 3.0.0 2171 | strip-ansi: 6.0.1 2172 | 2173 | /string-width@5.1.2: 2174 | resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} 2175 | engines: {node: '>=12'} 2176 | dependencies: 2177 | eastasianwidth: 0.2.0 2178 | emoji-regex: 9.2.2 2179 | strip-ansi: 7.1.0 2180 | 2181 | /strip-ansi@6.0.1: 2182 | resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} 2183 | engines: {node: '>=8'} 2184 | dependencies: 2185 | ansi-regex: 5.0.1 2186 | 2187 | /strip-ansi@7.1.0: 2188 | resolution: {integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==} 2189 | engines: {node: '>=12'} 2190 | dependencies: 2191 | ansi-regex: 6.0.1 2192 | 2193 | /styled-jsx@5.1.1(react@18.2.0): 2194 | resolution: {integrity: sha512-pW7uC1l4mBZ8ugbiZrcIsiIvVx1UmTfw7UkC3Um2tmfUq9Bhk8IiyEIPl6F8agHgjzku6j0xQEZbfA5uSgSaCw==} 2195 | engines: {node: '>= 12.0.0'} 2196 | peerDependencies: 2197 | '@babel/core': '*' 2198 | babel-plugin-macros: '*' 2199 | react: '>= 16.8.0 || 17.x.x || ^18.0.0-0' 2200 | peerDependenciesMeta: 2201 | '@babel/core': 2202 | optional: true 2203 | babel-plugin-macros: 2204 | optional: true 2205 | dependencies: 2206 | client-only: 0.0.1 2207 | react: 18.2.0 2208 | dev: false 2209 | 2210 | /sucrase@3.35.0: 2211 | resolution: {integrity: sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA==} 2212 | engines: {node: '>=16 || 14 >=14.17'} 2213 | hasBin: true 2214 | dependencies: 2215 | '@jridgewell/gen-mapping': 0.3.3 2216 | commander: 4.1.1 2217 | glob: 10.3.10 2218 | lines-and-columns: 1.2.4 2219 | mz: 2.7.0 2220 | pirates: 4.0.6 2221 | ts-interface-checker: 0.1.13 2222 | 2223 | /supports-preserve-symlinks-flag@1.0.0: 2224 | resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} 2225 | engines: {node: '>= 0.4'} 2226 | 2227 | /swr@2.2.0(react@18.2.0): 2228 | resolution: {integrity: sha512-AjqHOv2lAhkuUdIiBu9xbuettzAzWXmCEcLONNKJRba87WAefz8Ca9d6ds/SzrPc235n1IxWYdhJ2zF3MNUaoQ==} 2229 | peerDependencies: 2230 | react: ^16.11.0 || ^17.0.0 || ^18.0.0 2231 | dependencies: 2232 | react: 18.2.0 2233 | use-sync-external-store: 1.2.0(react@18.2.0) 2234 | dev: false 2235 | 2236 | /tailwind-merge@1.14.0: 2237 | resolution: {integrity: sha512-3mFKyCo/MBcgyOTlrY8T7odzZFx+w+qKSMAmdFzRvqBfLlSigU6TZnlFHK0lkMwj9Bj8OYU+9yW9lmGuS0QEnQ==} 2238 | dev: false 2239 | 2240 | /tailwindcss-animate@1.0.7(tailwindcss@3.4.1): 2241 | resolution: {integrity: sha512-bl6mpH3T7I3UFxuvDEXLxy/VuFxBk5bbzplh7tXI68mwMokNYd1t9qPBHlnyTwfa4JGC4zP516I1hYYtQ/vspA==} 2242 | peerDependencies: 2243 | tailwindcss: '>=3.0.0 || insiders' 2244 | dependencies: 2245 | tailwindcss: 3.4.1 2246 | dev: false 2247 | 2248 | /tailwindcss@3.4.1: 2249 | resolution: {integrity: sha512-qAYmXRfk3ENzuPBakNK0SRrUDipP8NQnEY6772uDhflcQz5EhRdD7JNZxyrFHVQNCwULPBn6FNPp9brpO7ctcA==} 2250 | engines: {node: '>=14.0.0'} 2251 | hasBin: true 2252 | dependencies: 2253 | '@alloc/quick-lru': 5.2.0 2254 | arg: 5.0.2 2255 | chokidar: 3.5.3 2256 | didyoumean: 1.2.2 2257 | dlv: 1.1.3 2258 | fast-glob: 3.3.2 2259 | glob-parent: 6.0.2 2260 | is-glob: 4.0.3 2261 | jiti: 1.21.0 2262 | lilconfig: 2.1.0 2263 | micromatch: 4.0.5 2264 | normalize-path: 3.0.0 2265 | object-hash: 3.0.0 2266 | picocolors: 1.0.0 2267 | postcss: 8.4.33 2268 | postcss-import: 15.1.0(postcss@8.4.33) 2269 | postcss-js: 4.0.1(postcss@8.4.33) 2270 | postcss-load-config: 4.0.2(postcss@8.4.33) 2271 | postcss-nested: 6.0.1(postcss@8.4.33) 2272 | postcss-selector-parser: 6.0.15 2273 | resolve: 1.22.8 2274 | sucrase: 3.35.0 2275 | transitivePeerDependencies: 2276 | - ts-node 2277 | 2278 | /thenify-all@1.6.0: 2279 | resolution: {integrity: sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==} 2280 | engines: {node: '>=0.8'} 2281 | dependencies: 2282 | thenify: 3.3.1 2283 | 2284 | /thenify@3.3.1: 2285 | resolution: {integrity: sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==} 2286 | dependencies: 2287 | any-promise: 1.3.0 2288 | 2289 | /to-no-case@1.0.2: 2290 | resolution: {integrity: sha512-Z3g735FxuZY8rodxV4gH7LxClE4H0hTIyHNIHdk+vpQxjLm0cwnKXq/OFVZ76SOQmto7txVcwSCwkU5kqp+FKg==} 2291 | dev: false 2292 | 2293 | /to-regex-range@5.0.1: 2294 | resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} 2295 | engines: {node: '>=8.0'} 2296 | dependencies: 2297 | is-number: 7.0.0 2298 | 2299 | /to-snake-case@1.0.0: 2300 | resolution: {integrity: sha512-joRpzBAk1Bhi2eGEYBjukEWHOe/IvclOkiJl3DtA91jV6NwQ3MwXA4FHYeqk8BNp/D8bmi9tcNbRu/SozP0jbQ==} 2301 | dependencies: 2302 | to-space-case: 1.0.0 2303 | dev: false 2304 | 2305 | /to-space-case@1.0.0: 2306 | resolution: {integrity: sha512-rLdvwXZ39VOn1IxGL3V6ZstoTbwLRckQmn/U8ZDLuWwIXNpuZDhQ3AiRUlhTbOXFVE9C+dR51wM0CBDhk31VcA==} 2307 | dependencies: 2308 | to-no-case: 1.0.2 2309 | dev: false 2310 | 2311 | /ts-interface-checker@0.1.13: 2312 | resolution: {integrity: sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==} 2313 | 2314 | /tslib@2.4.1: 2315 | resolution: {integrity: sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==} 2316 | dev: false 2317 | 2318 | /tslib@2.6.2: 2319 | resolution: {integrity: sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==} 2320 | dev: false 2321 | 2322 | /type-fest@2.19.0: 2323 | resolution: {integrity: sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==} 2324 | engines: {node: '>=12.20'} 2325 | dev: false 2326 | 2327 | /typescript@5.3.3: 2328 | resolution: {integrity: sha512-pXWcraxM0uxAS+tN0AG/BF2TyqmHO014Z070UsJ+pFvYuRSq8KH8DmWpnbXe0pEPDHXZV3FcAbJkijJ5oNEnWw==} 2329 | engines: {node: '>=14.17'} 2330 | hasBin: true 2331 | 2332 | /undici-types@5.26.5: 2333 | resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==} 2334 | 2335 | /update-browserslist-db@1.0.13(browserslist@4.22.3): 2336 | resolution: {integrity: sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==} 2337 | hasBin: true 2338 | peerDependencies: 2339 | browserslist: '>= 4.21.0' 2340 | dependencies: 2341 | browserslist: 4.22.3 2342 | escalade: 3.1.1 2343 | picocolors: 1.0.0 2344 | dev: true 2345 | 2346 | /use-callback-ref@1.3.1(@types/react@18.2.53)(react@18.2.0): 2347 | resolution: {integrity: sha512-Lg4Vx1XZQauB42Hw3kK7JM6yjVjgFmFC5/Ab797s79aARomD2nEErc4mCgM8EZrARLmmbWpi5DGCadmK50DcAQ==} 2348 | engines: {node: '>=10'} 2349 | peerDependencies: 2350 | '@types/react': ^16.8.0 || ^17.0.0 || ^18.0.0 2351 | react: ^16.8.0 || ^17.0.0 || ^18.0.0 2352 | peerDependenciesMeta: 2353 | '@types/react': 2354 | optional: true 2355 | dependencies: 2356 | '@types/react': 18.2.53 2357 | react: 18.2.0 2358 | tslib: 2.6.2 2359 | dev: false 2360 | 2361 | /use-sidecar@1.1.2(@types/react@18.2.53)(react@18.2.0): 2362 | resolution: {integrity: sha512-epTbsLuzZ7lPClpz2TyryBfztm7m+28DlEv2ZCQ3MDr5ssiwyOwGH/e5F9CkfWjJ1t4clvI58yF822/GUkjjhw==} 2363 | engines: {node: '>=10'} 2364 | peerDependencies: 2365 | '@types/react': ^16.9.0 || ^17.0.0 || ^18.0.0 2366 | react: ^16.8.0 || ^17.0.0 || ^18.0.0 2367 | peerDependenciesMeta: 2368 | '@types/react': 2369 | optional: true 2370 | dependencies: 2371 | '@types/react': 18.2.53 2372 | detect-node-es: 1.1.0 2373 | react: 18.2.0 2374 | tslib: 2.6.2 2375 | dev: false 2376 | 2377 | /use-sync-external-store@1.2.0(react@18.2.0): 2378 | resolution: {integrity: sha512-eEgnFxGQ1Ife9bzYs6VLi8/4X6CObHMw9Qr9tPY43iKwsPw8xE8+EFsf/2cFZ5S3esXgpWgtSCtLNS41F+sKPA==} 2379 | peerDependencies: 2380 | react: ^16.8.0 || ^17.0.0 || ^18.0.0 2381 | dependencies: 2382 | react: 18.2.0 2383 | dev: false 2384 | 2385 | /util-deprecate@1.0.2: 2386 | resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} 2387 | 2388 | /watchpack@2.4.0: 2389 | resolution: {integrity: sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==} 2390 | engines: {node: '>=10.13.0'} 2391 | dependencies: 2392 | glob-to-regexp: 0.4.1 2393 | graceful-fs: 4.2.11 2394 | dev: false 2395 | 2396 | /webcrypto-core@1.7.8: 2397 | resolution: {integrity: sha512-eBR98r9nQXTqXt/yDRtInszPMjTaSAMJAFDg2AHsgrnczawT1asx9YNBX6k5p+MekbPF4+s/UJJrr88zsTqkSg==} 2398 | dependencies: 2399 | '@peculiar/asn1-schema': 2.3.8 2400 | '@peculiar/json-schema': 1.1.12 2401 | asn1js: 3.0.5 2402 | pvtsutils: 1.3.5 2403 | tslib: 2.6.2 2404 | dev: false 2405 | 2406 | /which@2.0.2: 2407 | resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} 2408 | engines: {node: '>= 8'} 2409 | hasBin: true 2410 | dependencies: 2411 | isexe: 2.0.0 2412 | 2413 | /wrap-ansi@7.0.0: 2414 | resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} 2415 | engines: {node: '>=10'} 2416 | dependencies: 2417 | ansi-styles: 4.3.0 2418 | string-width: 4.2.3 2419 | strip-ansi: 6.0.1 2420 | 2421 | /wrap-ansi@8.1.0: 2422 | resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==} 2423 | engines: {node: '>=12'} 2424 | dependencies: 2425 | ansi-styles: 6.2.1 2426 | string-width: 5.1.2 2427 | strip-ansi: 7.1.0 2428 | 2429 | /yaml@2.3.4: 2430 | resolution: {integrity: sha512-8aAvwVUSHpfEqTQ4w/KMlf3HcRdt50E5ODIQJBw1fQ5RL34xabzxtUlzTXVqc4rkZsPbvrXKWnABCD7kWSmocA==} 2431 | engines: {node: '>= 14'} 2432 | 2433 | /zod@3.22.4: 2434 | resolution: {integrity: sha512-iC+8Io04lddc+mVqQ9AZ7OQ2MrUKGN+oIQyq1vemgt46jwCwLfhq7/pwnBnNXXXZb8VTVLKwp9EDkx+ryxIWmg==} 2435 | dev: false 2436 | -------------------------------------------------------------------------------- /postcss.config.cjs: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | plugins: { 3 | tailwindcss: {}, 4 | autoprefixer: {} 5 | } 6 | }; 7 | -------------------------------------------------------------------------------- /prisma/schema.prisma: -------------------------------------------------------------------------------- 1 | // This is your Prisma schema file, 2 | // learn more about it in the docs: https://pris.ly/d/prisma-schema 3 | 4 | generator client { 5 | provider = "prisma-client-js" 6 | } 7 | 8 | datasource db { 9 | provider = "postgresql" 10 | url = env("DATABASE_URL") 11 | } 12 | 13 | model User { 14 | id String @id @unique 15 | fullname String? 16 | username String? 17 | email String @unique 18 | image String? 19 | createdAt DateTime @default(now()) @map(name: "created_at") 20 | updatedAt DateTime @default(now()) @map(name: "updated_at") 21 | } 22 | -------------------------------------------------------------------------------- /public/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sujjeee/codox/4fbd6526e9b9df9380bafd69510ca32ecef30ce6/public/favicon.ico -------------------------------------------------------------------------------- /public/googlea0f0548f4347733c.html: -------------------------------------------------------------------------------- 1 | google-site-verification: googlea0f0548f4347733c.html -------------------------------------------------------------------------------- /public/og-image.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sujjeee/codox/4fbd6526e9b9df9380bafd69510ca32ecef30ce6/public/og-image.png -------------------------------------------------------------------------------- /src/app/(auth)/auth-callback/page.tsx: -------------------------------------------------------------------------------- 1 | import AuthCallback from "@/components/auth/auth-callback"; 2 | 3 | export default function AuthCallbackPage() { 4 | return ( 5 |
6 | 7 |
8 | ); 9 | } 10 | -------------------------------------------------------------------------------- /src/app/(auth)/layout.tsx: -------------------------------------------------------------------------------- 1 | interface AuthLayoutProps { 2 | children: React.ReactNode; 3 | } 4 | 5 | export default function AuthLayout({ children }: AuthLayoutProps) { 6 | return
{children}
; 7 | } 8 | -------------------------------------------------------------------------------- /src/app/(auth)/loading.tsx: -------------------------------------------------------------------------------- 1 | import { Skeleton } from "@/components/ui/skeleton"; 2 | 3 | export default function AuthLoading() { 4 | return ( 5 |
6 | 7 |
8 | ); 9 | } 10 | -------------------------------------------------------------------------------- /src/app/(auth)/signin/page.tsx: -------------------------------------------------------------------------------- 1 | import OAuthSignin from "@/components/auth/oauth-signin"; 2 | import { Icons } from "@/components/icons"; 3 | import { buttonVariants } from "@/components/ui/button"; 4 | import { cn } from "@/lib/utils"; 5 | import { currentUser } from "@clerk/nextjs"; 6 | import { ChevronLeft } from "lucide-react"; 7 | import Link from "next/link"; 8 | import { redirect } from "next/navigation"; 9 | 10 | export default async function Signin() { 11 | const user = await currentUser(); 12 | if (user) redirect("/"); 13 | return ( 14 |
15 | 22 | <> 23 | 24 | Back 25 | 26 | 27 |
28 |
29 | 30 |

31 | Continue to CoDox 32 |

33 |
34 | 35 |
36 |
37 | ); 38 | } 39 | -------------------------------------------------------------------------------- /src/app/(auth)/signout/page.tsx: -------------------------------------------------------------------------------- 1 | import { LogOutButtons } from "@/components/auth/logout-button"; 2 | import { Icons } from "@/components/icons"; 3 | import { buttonVariants } from "@/components/ui/button"; 4 | import { cn } from "@/lib/utils"; 5 | import { currentUser } from "@clerk/nextjs"; 6 | import { ChevronLeft } from "lucide-react"; 7 | import Link from "next/link"; 8 | import { redirect } from "next/navigation"; 9 | 10 | export default async function Signout() { 11 | const user = await currentUser(); 12 | if (!user) redirect("/signin"); 13 | return ( 14 |
15 | 22 | <> 23 | 24 | Back 25 | 26 | 27 |
28 |
29 | 30 |

31 | Are you sure? 32 |

33 |
34 | 35 |
36 |
37 | ); 38 | } 39 | -------------------------------------------------------------------------------- /src/app/(auth)/sso-callback/page.tsx: -------------------------------------------------------------------------------- 1 | import type { HandleOAuthCallbackParams } from "@clerk/types"; 2 | 3 | import SSOCallback from "@/components/auth/sso-callback"; 4 | 5 | export interface SSOCallbackPageProps { 6 | searchParams: HandleOAuthCallbackParams; 7 | } 8 | 9 | export default function SSOCallbackPage({ 10 | searchParams 11 | }: SSOCallbackPageProps) { 12 | return ( 13 |
14 | 15 |
16 | ); 17 | } 18 | -------------------------------------------------------------------------------- /src/app/(pages)/dashboard/page.tsx: -------------------------------------------------------------------------------- 1 | import CodeBlock from "@/components/code-block"; 2 | import SvgText from "@/components/svg-text"; 3 | import { db } from "@/db"; 4 | import { getUserEmail } from "@/lib/utils"; 5 | import { currentUser } from "@clerk/nextjs"; 6 | import { revalidatePath } from "next/cache"; 7 | import { redirect } from "next/navigation"; 8 | 9 | export async function generateMetadata() { 10 | const user = await currentUser(); 11 | return { 12 | title: `${user?.firstName}'s` 13 | }; 14 | } 15 | 16 | export default async function page() { 17 | const user = await currentUser(); 18 | if (!user || !user.id) redirect("/auth-callback?origin=/"); 19 | 20 | const email = getUserEmail(user); 21 | 22 | const dbUser = await db.user.findUnique({ 23 | where: { 24 | email: email 25 | } 26 | }); 27 | 28 | if (!dbUser) redirect("/auth-callback?origin=/dashboard"); 29 | 30 | revalidatePath("/auth-callback"); 31 | return ( 32 |
33 |

34 | Hi {user ? user?.firstName : "Guest"}! 35 |

36 |

37 | Are you excited to build something amazing using{" "} 38 | {
} the latest libraries and the stacks? 39 |

40 |
41 | 42 |
43 | 44 |
45 |
46 |
47 | ); 48 | } 49 | -------------------------------------------------------------------------------- /src/app/(pages)/layout.tsx: -------------------------------------------------------------------------------- 1 | import SiteFooter from "@/components/layouts/site-footer"; 2 | import SiteHeader from "@/components/layouts/site-header"; 3 | 4 | interface AuthLayoutProps { 5 | children: React.ReactNode; 6 | } 7 | 8 | export default function PagesLayout({ children }: AuthLayoutProps) { 9 | return ( 10 |
11 | 12 | {children} 13 | 14 |
15 | ); 16 | } 17 | -------------------------------------------------------------------------------- /src/app/(pages)/page.tsx: -------------------------------------------------------------------------------- 1 | import CodeBlock from "@/components/code-block"; 2 | import TextAnimation from "@/components/text-animation"; 3 | 4 | export default function Home() { 5 | const TextArray = [ 6 | "NextJS", 7 | "ShadcnUI", 8 | "Tailwind", 9 | "Typescript", 10 | "tRPC", 11 | "Clerk", 12 | "Prisma" 13 | ]; 14 | return ( 15 |
16 |
17 |
18 | Modern web development {
} 19 | 20 | with 21 | 25 | 26 |
27 |
28 | 29 |
30 |
31 |
32 | ); 33 | } 34 | -------------------------------------------------------------------------------- /src/app/_trpc/client.ts: -------------------------------------------------------------------------------- 1 | import type { AppRouter } from "@/trpc"; 2 | import { createTRPCReact } from "@trpc/react-query"; 3 | 4 | export const trpc = createTRPCReact({}); 5 | -------------------------------------------------------------------------------- /src/app/api/trpc/[trpc]/route.ts: -------------------------------------------------------------------------------- 1 | import { appRouter } from "@/trpc"; 2 | import { fetchRequestHandler } from "@trpc/server/adapters/fetch"; 3 | 4 | const handler = (req: Request) => 5 | fetchRequestHandler({ 6 | endpoint: "/api/trpc", 7 | req, 8 | router: appRouter, 9 | createContext: () => ({}) 10 | }); 11 | 12 | export { handler as GET, handler as POST }; 13 | -------------------------------------------------------------------------------- /src/app/error.tsx: -------------------------------------------------------------------------------- 1 | "use client"; 2 | 3 | import { useEffect } from "react"; 4 | 5 | // biome-ignore lint: "TODO: Fix this later" 6 | export default function Error({ 7 | error, 8 | reset 9 | }: { 10 | error: Error & { digest?: string }; 11 | reset: () => void; 12 | }) { 13 | useEffect(() => { 14 | // Log the error to an error reporting service 15 | console.error(error); 16 | }, [error]); 17 | 18 | return ( 19 |
20 |

21 | Sorry, something went wrong! 22 |

23 |
24 | ); 25 | } 26 | -------------------------------------------------------------------------------- /src/app/layout.tsx: -------------------------------------------------------------------------------- 1 | import { ThemeProvider } from "@/components/providers/theme-providers"; 2 | import TrpcProvider from "@/components/providers/trpc-provider"; 3 | import { Toaster } from "@/components/ui/toaster"; 4 | import { siteConfig } from "@/configs/site"; 5 | import GoogleAnalytics from "@/google-analytics"; 6 | import "@/styles/globals.css"; 7 | import { ClerkProvider } from "@clerk/nextjs"; 8 | import { dark } from "@clerk/themes"; 9 | import type { Metadata, Viewport } from "next"; 10 | import { Inter } from "next/font/google"; 11 | 12 | const inter = Inter({ subsets: ["latin"] }); 13 | 14 | export const metadata: Metadata = { 15 | metadataBase: new URL(siteConfig.url), 16 | title: { 17 | default: siteConfig.name, 18 | template: `%s - CoDox` 19 | }, 20 | description: siteConfig.description, 21 | // added new keywords for SEO 22 | keywords: [ 23 | "clerk auth", 24 | "prisma", 25 | "prisma io", 26 | "prisma postgres", 27 | "nextjs 13", 28 | "tailwind nextjs", 29 | "prisma nextjs", 30 | "trpc nextjs", 31 | "trpc", 32 | "trpc api", 33 | "tailwindcss", 34 | "t3 app", 35 | "web development tech stack", 36 | "modern tech stacks", 37 | "tech stacks", 38 | "nextjs with trpc", 39 | "t3 stack", 40 | "typescript", 41 | "clerk with prisma", 42 | "trpc with prisma", 43 | "web development", 44 | "codox" 45 | ], 46 | authors: [ 47 | { 48 | name: siteConfig.author.name, 49 | url: siteConfig.author.github 50 | } 51 | ], 52 | creator: siteConfig.author.name, 53 | openGraph: { 54 | type: "website", 55 | locale: "en_US", 56 | url: siteConfig.url, 57 | title: siteConfig.name, 58 | description: siteConfig.description, 59 | images: [`${siteConfig.url}/og-image.png`], 60 | siteName: siteConfig.name 61 | }, 62 | twitter: { 63 | card: "summary_large_image", 64 | title: siteConfig.name, 65 | description: siteConfig.description, 66 | images: [`${siteConfig.url}/og-image.png`], 67 | creator: "@sujjeeee" 68 | }, 69 | icons: { 70 | icon: "/favicon.ico" 71 | } 72 | }; 73 | 74 | export const viewport: Viewport = { 75 | colorScheme: "dark light", 76 | themeColor: [ 77 | { media: "(prefers-color-scheme: light)", color: "white" }, 78 | { media: "(prefers-color-scheme: dark)", color: "black" } 79 | ] 80 | }; 81 | 82 | export default function RootLayout({ 83 | children 84 | }: { 85 | children: React.ReactNode; 86 | }) { 87 | return ( 88 | 93 | 94 | 95 | 96 | 102 | {children} 103 | 104 | 105 | 106 | 107 | 108 | 109 | 110 | ); 111 | } 112 | -------------------------------------------------------------------------------- /src/app/loading.tsx: -------------------------------------------------------------------------------- 1 | import { Skeleton } from "@/components/ui/skeleton"; 2 | 3 | export default function Loading() { 4 | return ( 5 | <> 6 |
7 |
8 | 9 |
10 | 11 | 12 | 13 |
14 |
15 |
16 |
17 | 18 |
19 | 20 | ); 21 | } 22 | -------------------------------------------------------------------------------- /src/app/not-found.tsx: -------------------------------------------------------------------------------- 1 | export default function NotFound() { 2 | return ( 3 |
4 |

5 | Oops, page not found. 6 |

7 |
8 | ); 9 | } 10 | -------------------------------------------------------------------------------- /src/app/robots.ts: -------------------------------------------------------------------------------- 1 | import type { MetadataRoute } from "next"; 2 | 3 | export default function robots(): MetadataRoute.Robots { 4 | return { 5 | rules: { 6 | userAgent: "*", 7 | allow: "/" 8 | } 9 | }; 10 | } 11 | -------------------------------------------------------------------------------- /src/components/auth/auth-callback.tsx: -------------------------------------------------------------------------------- 1 | "use client"; 2 | 3 | import { trpc } from "@/app/_trpc/client"; 4 | import { Icons } from "@/components/icons"; 5 | import { useRouter, useSearchParams } from "next/navigation"; 6 | import { toast } from "sonner"; 7 | 8 | export default function AuthCallback() { 9 | const router = useRouter(); 10 | 11 | const searchParams = useSearchParams(); 12 | const origin = searchParams.get("origin"); 13 | trpc.authCallback.useQuery(undefined, { 14 | onSuccess: ({ success }) => { 15 | if (success) { 16 | router.push(origin ? `${origin}` : "/"); 17 | } 18 | }, 19 | onError: (err) => { 20 | toast.error("AuthCallBack: Something went wrong!"); 21 | if (err.data?.code === "UNAUTHORIZED") { 22 | router.push("/signin"); 23 | } 24 | }, 25 | retry: false 26 | }); 27 | 28 | return ( 29 |
30 |
42 | ); 43 | } 44 | -------------------------------------------------------------------------------- /src/components/auth/logout-button.tsx: -------------------------------------------------------------------------------- 1 | "use client"; 2 | 3 | import { SignOutButton } from "@clerk/nextjs"; 4 | import { useRouter } from "next/navigation"; 5 | import * as React from "react"; 6 | 7 | import { Icons } from "@/components/icons"; 8 | import { Button, buttonVariants } from "@/components/ui/button"; 9 | import { Skeleton } from "@/components/ui/skeleton"; 10 | import { useMounted } from "@/hooks/use-mounted"; 11 | import { cn } from "@/lib/utils"; 12 | 13 | export function LogOutButtons() { 14 | const router = useRouter(); 15 | const mounted = useMounted(); 16 | const [isPending, startTransition] = React.useTransition(); 17 | 18 | return ( 19 |
20 | {mounted ? ( 21 | 23 | startTransition(() => { 24 | router.push(`${window.location.origin}/?redirect=false`); 25 | }) 26 | } 27 | > 28 | 39 | 40 | ) : ( 41 | 47 | Log out 48 | 49 | )} 50 | 60 |
61 | ); 62 | } 63 | -------------------------------------------------------------------------------- /src/components/auth/oauth-signin.tsx: -------------------------------------------------------------------------------- 1 | "use client"; 2 | 3 | import { Icons } from "@/components/icons"; 4 | import { Button } from "@/components/ui/button"; 5 | import { isClerkAPIResponseError, useSignIn } from "@clerk/nextjs"; 6 | import type { OAuthStrategy } from "@clerk/types"; 7 | import React from "react"; 8 | import { toast } from "sonner"; 9 | 10 | const oauthProviders = [ 11 | { name: "Google", strategy: "oauth_google", icon: "google" }, 12 | { name: "Github", strategy: "oauth_github", icon: "gitHub" } 13 | ] satisfies { 14 | name: string; 15 | icon: keyof typeof Icons; 16 | strategy: OAuthStrategy; 17 | }[]; 18 | 19 | interface OAuthSigninProps {} 20 | 21 | const OAuthSignin: React.FC = () => { 22 | const [isLoading, setIsLoading] = React.useState(null); 23 | const { signIn, isLoaded: signInLoaded } = useSignIn(); 24 | 25 | async function oauthSignIn(provider: OAuthStrategy) { 26 | if (!signInLoaded) return null; 27 | try { 28 | setIsLoading(provider); 29 | await signIn.authenticateWithRedirect({ 30 | strategy: provider, 31 | redirectUrl: "/sso-callback", 32 | redirectUrlComplete: "/dashboard" 33 | }); 34 | } catch (error) { 35 | setIsLoading(null); 36 | 37 | const unknownError = "Something went wrong, please try again."; 38 | 39 | isClerkAPIResponseError(error) 40 | ? toast.error(error.errors[0]?.longMessage ?? unknownError) 41 | : toast.error(unknownError); 42 | } 43 | } 44 | return ( 45 |
46 | {oauthProviders.map((provider) => { 47 | const Icon = Icons[provider.icon]; 48 | 49 | return ( 50 | 68 | ); 69 | })} 70 |
71 | ); 72 | }; 73 | 74 | export default OAuthSignin; 75 | -------------------------------------------------------------------------------- /src/components/auth/sso-callback.tsx: -------------------------------------------------------------------------------- 1 | "use client"; 2 | 3 | import { useClerk } from "@clerk/nextjs"; 4 | import * as React from "react"; 5 | 6 | import type { SSOCallbackPageProps } from "@/app/(auth)/sso-callback/page"; 7 | import { Icons } from "@/components/icons"; 8 | 9 | export default function SSOCallback({ searchParams }: SSOCallbackPageProps) { 10 | const { handleRedirectCallback } = useClerk(); 11 | 12 | React.useEffect(() => { 13 | void handleRedirectCallback(searchParams); 14 | }, [searchParams, handleRedirectCallback]); 15 | 16 | return ( 17 |
23 |
25 | ); 26 | } 27 | -------------------------------------------------------------------------------- /src/components/auth/user-profile.tsx: -------------------------------------------------------------------------------- 1 | "use client"; 2 | 3 | import { Button } from "@/components/ui/button"; 4 | import { UserProfile as ClerkUserProfile } from "@clerk/nextjs"; 5 | import { Cross1Icon } from "@radix-ui/react-icons"; 6 | 7 | interface UserProfileProps { 8 | onCloseUserProfile: () => void; // Define the type of onCloseUserProfile 9 | } 10 | 11 | export function UserProfile({ onCloseUserProfile }: UserProfileProps) { 12 | return ( 13 | <> 14 |
15 |
16 | 24 | 25 |
26 | 27 | ); 28 | } 29 | -------------------------------------------------------------------------------- /src/components/code-block.tsx: -------------------------------------------------------------------------------- 1 | import { CopyButton } from "@/components/copy-button"; 2 | 3 | export default function CodeBlock() { 4 | return ( 5 |
 6 |       
 7 |         $
 8 | 
 9 |         
10 |           gh repo clone {""}
11 | 
12 |           sujjeee/codox
13 |         
14 |       
15 | 
16 |       
17 |     
18 | ); 19 | } 20 | -------------------------------------------------------------------------------- /src/components/copy-button.tsx: -------------------------------------------------------------------------------- 1 | "use client"; 2 | 3 | import { Button } from "@/components/ui/button"; 4 | import { 5 | DropdownMenu, 6 | DropdownMenuContent, 7 | DropdownMenuItem, 8 | DropdownMenuTrigger 9 | } from "@/components/ui/dropdown-menu"; 10 | import { event } from "@/lib/gtags"; 11 | import { CheckIcon, CopyIcon } from "@radix-ui/react-icons"; 12 | import * as React from "react"; 13 | import { toast } from "sonner"; 14 | 15 | interface CTCProps { 16 | text: string; 17 | label: string; 18 | } 19 | 20 | export function CopyButton() { 21 | const [isCopied, setIsCopied] = React.useState(false); 22 | 23 | function copytoclipboard({ text, label }: CTCProps) { 24 | if (typeof window === "undefined") return; 25 | setIsCopied(true); 26 | void window.navigator.clipboard.writeText(text?.toString() ?? ""); 27 | setTimeout(() => setIsCopied(false), 2000); 28 | toast.success("Copied to clipboard"); 29 | event({ 30 | category: "Copy Clicks", 31 | action: "clicks", 32 | label: label 33 | }); 34 | } 35 | 36 | return ( 37 | 38 | 39 | 51 | 52 | 53 | 55 | copytoclipboard({ 56 | text: "https://github.com/sujjeee/codox.git", 57 | label: "https_copy_click" 58 | }) 59 | } 60 | > 61 | Https 62 | 63 | 65 | copytoclipboard({ 66 | text: "gh repo clone sujjeee/codox", 67 | label: "ghcli_copy_click" 68 | }) 69 | } 70 | > 71 | GitHub CLI 72 | 73 | 75 | copytoclipboard({ 76 | text: "npx codox", 77 | label: "npx_codox" 78 | }) 79 | } 80 | > 81 | npx 82 | 83 | 84 | 85 | ); 86 | } 87 | -------------------------------------------------------------------------------- /src/components/icons.tsx: -------------------------------------------------------------------------------- 1 | type IconProps = React.HTMLAttributes; 2 | 3 | export const Icons = { 4 | logo: (props: IconProps) => ( 5 | 12 | logo 13 | 17 | 18 | ), 19 | nextjs: (props: IconProps) => ( 20 | 21 | logo 22 | 26 | 27 | ), 28 | gitHub: (props: IconProps) => ( 29 | 30 | logo 31 | 35 | 36 | ), 37 | google: ({ ...props }: IconProps) => ( 38 | 39 | logo 40 | 44 | 45 | ), 46 | twitter: (props: IconProps) => ( 47 | 48 | logo 49 | 50 | 51 | ), 52 | spinner: (props: IconProps) => ( 53 | 63 | logo 64 | 65 | 66 | ), 67 | configure: (props: IconProps) => ( 68 | 75 | logo 76 | 77 | 85 | 93 | 101 | 109 | 110 | 111 | 119 | 127 | 135 | 143 | 144 | 145 | 153 | 161 | 169 | 177 | 178 | 179 | ) 180 | }; 181 | -------------------------------------------------------------------------------- /src/components/layouts/site-footer.tsx: -------------------------------------------------------------------------------- 1 | export default function SiteFooter() { 2 | return ( 3 |
4 |
5 |
6 | Built by{" "} 7 | 13 | Sujjeee 14 | 15 | . 16 |
17 |
18 |
19 | ); 20 | } 21 | -------------------------------------------------------------------------------- /src/components/layouts/site-header.tsx: -------------------------------------------------------------------------------- 1 | "use client"; 2 | 3 | import Profile from "@/components/profile"; 4 | import { ThemeToggle } from "@/components/theme-toggle"; 5 | import { Button, buttonVariants } from "@/components/ui/button"; 6 | import useWindow from "@/hooks/use-window"; 7 | import { useUser } from "@clerk/nextjs"; 8 | import { Github } from "lucide-react"; 9 | import Link from "next/link"; 10 | import { usePathname } from "next/navigation"; 11 | 12 | export default function SiteHeader() { 13 | const { isDesktop } = useWindow(); 14 | const path = usePathname(); 15 | const { isSignedIn, user } = useUser(); 16 | return ( 17 |
18 | 58 |
59 | ); 60 | } 61 | -------------------------------------------------------------------------------- /src/components/profile.tsx: -------------------------------------------------------------------------------- 1 | // source : https://github.com/sadmann7/skateshop/blob/main/src/components/layouts/site-header.tsx 2 | 3 | "use client"; 4 | 5 | import { UserProfile } from "@/components/auth/user-profile"; 6 | import { Avatar, AvatarFallback, AvatarImage } from "@/components/ui/avatar"; 7 | import { Button } from "@/components/ui/button"; 8 | import { 9 | DropdownMenu, 10 | DropdownMenuContent, 11 | DropdownMenuGroup, 12 | DropdownMenuItem, 13 | DropdownMenuLabel, 14 | DropdownMenuSeparator, 15 | DropdownMenuShortcut, 16 | DropdownMenuTrigger 17 | } from "@/components/ui/dropdown-menu"; 18 | import { getUserEmail } from "@/lib/utils"; 19 | import type { UserResource } from "@clerk/types"; 20 | import { Home, LogOut, Settings, User2 } from "lucide-react"; 21 | import Link from "next/link"; 22 | import React from "react"; 23 | 24 | interface ProfileProps { 25 | user: UserResource | null; 26 | } 27 | 28 | export default function Profile({ user }: ProfileProps) { 29 | const initials = `${user?.firstName?.charAt(0) ?? ""} ${ 30 | user?.lastName?.charAt(0) ?? "" 31 | }`; 32 | 33 | const email = getUserEmail(user); 34 | 35 | const [showUserProfile, setShowUserProfile] = React.useState(false); 36 | 37 | const handleUserProfileClose = () => { 38 | setShowUserProfile(false); 39 | }; 40 | 41 | return ( 42 | <> 43 | {showUserProfile ? ( 44 | 45 | ) : null} 46 | 47 | 48 | 63 | 64 | 65 | 66 |
67 |

68 | {user?.firstName} {user?.lastName} 69 |

70 |

71 | {email} 72 |

73 |
74 |
75 | 76 | 77 | 78 | 87 | 88 | 89 | 90 | 95 | 96 | 97 | 102 | 103 | 104 | 105 | 106 | 111 |
112 |
113 | 114 | ); 115 | } 116 | -------------------------------------------------------------------------------- /src/components/providers/theme-providers.tsx: -------------------------------------------------------------------------------- 1 | "use client"; 2 | 3 | import { ThemeProvider as NextThemesProvider } from "next-themes"; 4 | import type { ThemeProviderProps } from "next-themes/dist/types"; 5 | 6 | export function ThemeProvider({ children, ...props }: ThemeProviderProps) { 7 | return {children}; 8 | } 9 | -------------------------------------------------------------------------------- /src/components/providers/trpc-provider.tsx: -------------------------------------------------------------------------------- 1 | "use client"; 2 | 3 | import { trpc } from "@/app/_trpc/client"; 4 | import { QueryClient, QueryClientProvider } from "@tanstack/react-query"; 5 | import { httpBatchLink } from "@trpc/client"; 6 | import { type PropsWithChildren, useState } from "react"; 7 | 8 | const TrpcProvider = ({ children }: PropsWithChildren) => { 9 | const getBaseUrl = () => { 10 | if (typeof window !== "undefined") return ""; // browser should use relative url 11 | if (process.env.VERCEL_URL) return `https://${process.env.VERCEL_URL}`; // SSR should use vercel url 12 | return `http://localhost:${process.env.PORT ?? 3000}`; // dev SSR should use localhost 13 | }; 14 | 15 | const [queryClient] = useState(() => new QueryClient()); 16 | const [trpcClient] = useState(() => 17 | trpc.createClient({ 18 | links: [ 19 | httpBatchLink({ 20 | url: `${getBaseUrl()}/api/trpc` 21 | }) 22 | ] 23 | }) 24 | ); 25 | 26 | return ( 27 | 28 | {children} 29 | 30 | ); 31 | }; 32 | 33 | export default TrpcProvider; 34 | -------------------------------------------------------------------------------- /src/components/svg-text.tsx: -------------------------------------------------------------------------------- 1 | export default function SvgText() { 2 | return ( 3 | 10 | Text 11 | 18 | 19 | 20 | 26 | 27 | 28 | 34 | 35 | 36 | 42 | 43 | 44 | 45 | 46 | 57 | Clone the repository and 58 | 59 | 70 | start coding. 71 | 72 | 73 | 74 | ); 75 | } 76 | -------------------------------------------------------------------------------- /src/components/text-animation.tsx: -------------------------------------------------------------------------------- 1 | "use client"; 2 | 3 | import { cn } from "@/lib/utils"; 4 | import { AnimatePresence, motion } from "framer-motion"; 5 | import React from "react"; 6 | 7 | type TextAnimationProps = { 8 | words: string[]; 9 | interval?: number; 10 | className?: string; 11 | }; 12 | export default function TextAnimation({ 13 | words, 14 | interval = 3000, 15 | className 16 | }: TextAnimationProps) { 17 | const [index, setIndex] = React.useState(0); 18 | 19 | // biome-ignore lint: "TODO: Fix this later" 20 | React.useEffect(() => { 21 | const animationInterval = setInterval(() => { 22 | setIndex((prevIndex) => (prevIndex + 1) % words.length); 23 | }, interval); 24 | 25 | // Clean up interval on unmount 26 | return () => clearInterval(animationInterval); 27 | // eslint-disable-next-line react-hooks/exhaustive-deps 28 | }, []); 29 | 30 | return ( 31 | 32 | 40 | {words[index]} 41 | 42 | 43 | ); 44 | } 45 | -------------------------------------------------------------------------------- /src/components/theme-toggle.tsx: -------------------------------------------------------------------------------- 1 | "use client"; 2 | 3 | import { Button } from "@/components/ui/button"; 4 | import { Moon, Sun } from "lucide-react"; 5 | import { useTheme } from "next-themes"; 6 | 7 | export function ThemeToggle() { 8 | const { setTheme, theme } = useTheme(); 9 | 10 | return ( 11 | 26 | ); 27 | } 28 | -------------------------------------------------------------------------------- /src/components/ui/avatar.tsx: -------------------------------------------------------------------------------- 1 | "use client"; 2 | 3 | import * as AvatarPrimitive from "@radix-ui/react-avatar"; 4 | import * as React from "react"; 5 | 6 | import { cn } from "@/lib/utils"; 7 | 8 | const Avatar = React.forwardRef< 9 | React.ElementRef, 10 | React.ComponentPropsWithoutRef 11 | >(({ className, ...props }, ref) => ( 12 | 20 | )); 21 | Avatar.displayName = AvatarPrimitive.Root.displayName; 22 | 23 | const AvatarImage = React.forwardRef< 24 | React.ElementRef, 25 | React.ComponentPropsWithoutRef 26 | >(({ className, ...props }, ref) => ( 27 | 32 | )); 33 | AvatarImage.displayName = AvatarPrimitive.Image.displayName; 34 | 35 | const AvatarFallback = React.forwardRef< 36 | React.ElementRef, 37 | React.ComponentPropsWithoutRef 38 | >(({ className, ...props }, ref) => ( 39 | 47 | )); 48 | AvatarFallback.displayName = AvatarPrimitive.Fallback.displayName; 49 | 50 | export { Avatar, AvatarImage, AvatarFallback }; 51 | -------------------------------------------------------------------------------- /src/components/ui/button.tsx: -------------------------------------------------------------------------------- 1 | import { Slot } from "@radix-ui/react-slot"; 2 | import { type VariantProps, cva } from "class-variance-authority"; 3 | import * as React from "react"; 4 | 5 | import { cn } from "@/lib/utils"; 6 | 7 | const buttonVariants = cva( 8 | "inline-flex items-center justify-center rounded-md text-sm font-medium ring-offset-background transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50", 9 | { 10 | variants: { 11 | variant: { 12 | default: "bg-primary text-primary-foreground hover:bg-primary/90", 13 | destructive: 14 | "bg-destructive text-destructive-foreground hover:bg-destructive/90", 15 | outline: 16 | "border border-input bg-background hover:bg-accent hover:text-accent-foreground", 17 | secondary: 18 | "bg-secondary text-secondary-foreground hover:bg-secondary/80", 19 | ghost: "hover:bg-accent hover:text-accent-foreground", 20 | link: "text-primary underline-offset-4 hover:underline" 21 | }, 22 | size: { 23 | default: "h-10 px-4 py-2", 24 | sm: "h-9 rounded-md px-3", 25 | lg: "h-11 rounded-md px-8", 26 | icon: "h-10 w-10" 27 | } 28 | }, 29 | defaultVariants: { 30 | variant: "default", 31 | size: "default" 32 | } 33 | } 34 | ); 35 | 36 | export interface ButtonProps 37 | extends React.ButtonHTMLAttributes, 38 | VariantProps { 39 | asChild?: boolean; 40 | } 41 | 42 | const Button = React.forwardRef( 43 | ({ className, variant, size, asChild = false, ...props }, ref) => { 44 | const Comp = asChild ? Slot : "button"; 45 | return ( 46 | 51 | ); 52 | } 53 | ); 54 | Button.displayName = "Button"; 55 | 56 | export { Button, buttonVariants }; 57 | -------------------------------------------------------------------------------- /src/components/ui/card.tsx: -------------------------------------------------------------------------------- 1 | import * as React from "react"; 2 | 3 | import { cn } from "@/lib/utils"; 4 | 5 | const Card = React.forwardRef< 6 | HTMLDivElement, 7 | React.HTMLAttributes 8 | >(({ className, ...props }, ref) => ( 9 |
17 | )); 18 | Card.displayName = "Card"; 19 | 20 | const CardHeader = React.forwardRef< 21 | HTMLDivElement, 22 | React.HTMLAttributes 23 | >(({ className, ...props }, ref) => ( 24 |
29 | )); 30 | CardHeader.displayName = "CardHeader"; 31 | 32 | const CardTitle = React.forwardRef< 33 | HTMLParagraphElement, 34 | React.HTMLAttributes 35 | >(({ className, ...props }, ref) => ( 36 |

44 | )); 45 | CardTitle.displayName = "CardTitle"; 46 | 47 | const CardDescription = React.forwardRef< 48 | HTMLParagraphElement, 49 | React.HTMLAttributes 50 | >(({ className, ...props }, ref) => ( 51 |

56 | )); 57 | CardDescription.displayName = "CardDescription"; 58 | 59 | const CardContent = React.forwardRef< 60 | HTMLDivElement, 61 | React.HTMLAttributes 62 | >(({ className, ...props }, ref) => ( 63 |

64 | )); 65 | CardContent.displayName = "CardContent"; 66 | 67 | const CardFooter = React.forwardRef< 68 | HTMLDivElement, 69 | React.HTMLAttributes 70 | >(({ className, ...props }, ref) => ( 71 |
76 | )); 77 | CardFooter.displayName = "CardFooter"; 78 | 79 | export { 80 | Card, 81 | CardHeader, 82 | CardFooter, 83 | CardTitle, 84 | CardDescription, 85 | CardContent 86 | }; 87 | -------------------------------------------------------------------------------- /src/components/ui/dropdown-menu.tsx: -------------------------------------------------------------------------------- 1 | "use client"; 2 | 3 | import * as DropdownMenuPrimitive from "@radix-ui/react-dropdown-menu"; 4 | import { Check, ChevronRight, Circle } from "lucide-react"; 5 | import * as React from "react"; 6 | 7 | import { cn } from "@/lib/utils"; 8 | 9 | const DropdownMenu = DropdownMenuPrimitive.Root; 10 | 11 | const DropdownMenuTrigger = DropdownMenuPrimitive.Trigger; 12 | 13 | const DropdownMenuGroup = DropdownMenuPrimitive.Group; 14 | 15 | const DropdownMenuPortal = DropdownMenuPrimitive.Portal; 16 | 17 | const DropdownMenuSub = DropdownMenuPrimitive.Sub; 18 | 19 | const DropdownMenuRadioGroup = DropdownMenuPrimitive.RadioGroup; 20 | 21 | const DropdownMenuSubTrigger = React.forwardRef< 22 | React.ElementRef, 23 | React.ComponentPropsWithoutRef & { 24 | inset?: boolean; 25 | } 26 | >(({ className, inset, children, ...props }, ref) => ( 27 | 36 | {children} 37 | 38 | 39 | )); 40 | DropdownMenuSubTrigger.displayName = 41 | DropdownMenuPrimitive.SubTrigger.displayName; 42 | 43 | const DropdownMenuSubContent = React.forwardRef< 44 | React.ElementRef, 45 | React.ComponentPropsWithoutRef 46 | >(({ className, ...props }, ref) => ( 47 | 55 | )); 56 | DropdownMenuSubContent.displayName = 57 | DropdownMenuPrimitive.SubContent.displayName; 58 | 59 | const DropdownMenuContent = React.forwardRef< 60 | React.ElementRef, 61 | React.ComponentPropsWithoutRef 62 | >(({ className, sideOffset = 4, ...props }, ref) => ( 63 | 64 | 73 | 74 | )); 75 | DropdownMenuContent.displayName = DropdownMenuPrimitive.Content.displayName; 76 | 77 | const DropdownMenuItem = React.forwardRef< 78 | React.ElementRef, 79 | React.ComponentPropsWithoutRef & { 80 | inset?: boolean; 81 | } 82 | >(({ className, inset, ...props }, ref) => ( 83 | 92 | )); 93 | DropdownMenuItem.displayName = DropdownMenuPrimitive.Item.displayName; 94 | 95 | const DropdownMenuCheckboxItem = React.forwardRef< 96 | React.ElementRef, 97 | React.ComponentPropsWithoutRef 98 | >(({ className, children, checked, ...props }, ref) => ( 99 | 108 | 109 | 110 | 111 | 112 | 113 | {children} 114 | 115 | )); 116 | DropdownMenuCheckboxItem.displayName = 117 | DropdownMenuPrimitive.CheckboxItem.displayName; 118 | 119 | const DropdownMenuRadioItem = React.forwardRef< 120 | React.ElementRef, 121 | React.ComponentPropsWithoutRef 122 | >(({ className, children, ...props }, ref) => ( 123 | 131 | 132 | 133 | 134 | 135 | 136 | {children} 137 | 138 | )); 139 | DropdownMenuRadioItem.displayName = DropdownMenuPrimitive.RadioItem.displayName; 140 | 141 | const DropdownMenuLabel = React.forwardRef< 142 | React.ElementRef, 143 | React.ComponentPropsWithoutRef & { 144 | inset?: boolean; 145 | } 146 | >(({ className, inset, ...props }, ref) => ( 147 | 156 | )); 157 | DropdownMenuLabel.displayName = DropdownMenuPrimitive.Label.displayName; 158 | 159 | const DropdownMenuSeparator = React.forwardRef< 160 | React.ElementRef, 161 | React.ComponentPropsWithoutRef 162 | >(({ className, ...props }, ref) => ( 163 | 168 | )); 169 | DropdownMenuSeparator.displayName = DropdownMenuPrimitive.Separator.displayName; 170 | 171 | const DropdownMenuShortcut = ({ 172 | className, 173 | ...props 174 | }: React.HTMLAttributes) => { 175 | return ( 176 | 180 | ); 181 | }; 182 | DropdownMenuShortcut.displayName = "DropdownMenuShortcut"; 183 | 184 | export { 185 | DropdownMenu, 186 | DropdownMenuTrigger, 187 | DropdownMenuContent, 188 | DropdownMenuItem, 189 | DropdownMenuCheckboxItem, 190 | DropdownMenuRadioItem, 191 | DropdownMenuLabel, 192 | DropdownMenuSeparator, 193 | DropdownMenuShortcut, 194 | DropdownMenuGroup, 195 | DropdownMenuPortal, 196 | DropdownMenuSub, 197 | DropdownMenuSubContent, 198 | DropdownMenuSubTrigger, 199 | DropdownMenuRadioGroup 200 | }; 201 | -------------------------------------------------------------------------------- /src/components/ui/skeleton.tsx: -------------------------------------------------------------------------------- 1 | import { cn } from "@/lib/utils"; 2 | 3 | function Skeleton({ 4 | className, 5 | ...props 6 | }: React.HTMLAttributes) { 7 | return ( 8 |
12 | ); 13 | } 14 | 15 | export { Skeleton }; 16 | -------------------------------------------------------------------------------- /src/components/ui/toaster.tsx: -------------------------------------------------------------------------------- 1 | "use client"; 2 | 3 | import { Toaster as RadToaster } from "sonner"; 4 | 5 | export function Toaster() { 6 | return ( 7 | 17 | ); 18 | } 19 | -------------------------------------------------------------------------------- /src/configs/site.ts: -------------------------------------------------------------------------------- 1 | export type SiteConfig = typeof siteConfig; 2 | 3 | export const siteConfig = { 4 | name: "Web Development Stacks", 5 | description: 6 | "A starter template for modern web development with nextjs 13 (app route), tailwindcss, typescript, trpc, clerk auth, and prisma.", 7 | url: "https://codox.vercel.app/", 8 | ogImage: "https://codox.vercel.app/opengraph-image.png", 9 | author: { 10 | name: "sujjeee", 11 | twitter: "https://twitter.com/sujjeeee", 12 | github: "https://github.com/sujjeee" 13 | } 14 | }; 15 | -------------------------------------------------------------------------------- /src/db/index.ts: -------------------------------------------------------------------------------- 1 | import { PrismaClient } from "@prisma/client"; 2 | 3 | declare global { 4 | // eslint-disable-next-line no-var 5 | var cachedPrisma: PrismaClient; 6 | } 7 | 8 | let prisma: PrismaClient; 9 | if (process.env.NODE_ENV === "production") { 10 | prisma = new PrismaClient(); 11 | } else { 12 | if (!global.cachedPrisma) { 13 | global.cachedPrisma = new PrismaClient(); 14 | } 15 | prisma = global.cachedPrisma; 16 | } 17 | 18 | export const db = prisma; 19 | -------------------------------------------------------------------------------- /src/env.mjs: -------------------------------------------------------------------------------- 1 | import { createEnv } from "@t3-oss/env-nextjs"; 2 | import { z } from "zod"; 3 | 4 | export const env = createEnv({ 5 | server: { 6 | DATABASE_URL: z.string().url(), 7 | CLERK_SECRET_KEY: z.string() 8 | }, 9 | 10 | client: { 11 | NEXT_PUBLIC_CLERK_PUBLISHABLE_KEY: z.string(), 12 | NEXT_PUBLIC_GOOGLE_ID: z.string() 13 | }, 14 | runtimeEnv: { 15 | NEXT_PUBLIC_CLERK_PUBLISHABLE_KEY: 16 | process.env.NEXT_PUBLIC_CLERK_PUBLISHABLE_KEY, 17 | CLERK_SECRET_KEY: process.env.CLERK_SECRET_KEY, 18 | DATABASE_URL: process.env.DATABASE_URL, 19 | NEXT_PUBLIC_GOOGLE_ID: process.env.NEXT_PUBLIC_GOOGLE_ID 20 | } 21 | }); 22 | -------------------------------------------------------------------------------- /src/google-analytics.tsx: -------------------------------------------------------------------------------- 1 | // original: https://dany-rivera.medium.com/how-to-integrate-google-analytics-on-your-next-js-13-app-easy-guide-c7389666831c 2 | 3 | "use client"; 4 | 5 | import * as gtags from "@/lib/gtags"; 6 | import Script from "next/script"; 7 | 8 | const GoogleAnalytics = () => { 9 | return ( 10 | <> 11 |