diff --git a/.gitignore b/.gitignore
index b2de018..4ac50e3 100644
--- a/.gitignore
+++ b/.gitignore
@@ -13,12 +13,11 @@
/prisma/db.sqlite-journal
db.sqlite
-# next.js
-/.next/
-/out/
-
# production
/build
+/dist
+/.output
+/.tanstack
# misc
.DS_Store
@@ -31,7 +30,6 @@ yarn-error.log*
.pnpm-debug.log*
# local env files
-# do not commit any .env files to git, except for the .env.example file. https://create.t3.gg/en/usage/env-variables#using-environment-variables
.env
.env*.local
@@ -44,4 +42,4 @@ yarn-error.log*
# idea files
.idea
-certificates
\ No newline at end of file
+certificates
diff --git a/Dockerfile b/Dockerfile
index 7d3afaa..90268fa 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -1,52 +1,21 @@
-FROM node:22-alpine AS base
-
-FROM base AS deps
-# Check https://github.com/nodejs/docker-node/tree/b4117f9333da4138b03a546ec926ef50a31506c3#nodealpine to understand why libc6-compat might be needed.
-RUN apk add --no-cache libc6-compat
+FROM node:22-alpine AS deps
WORKDIR /app
+COPY package.json pnpm-lock.yaml ./
+RUN corepack enable && pnpm install --frozen-lockfile
-# Install dependencies based on the preferred package manager
-COPY package.json pnpm-lock.yaml* .npmrc* ./
-RUN corepack enable pnpm && pnpm i --frozen-lockfile
-
-# Rebuild the source code only when needed
-FROM base AS builder
+FROM node:22-alpine AS builder
WORKDIR /app
COPY --from=deps /app/node_modules ./node_modules
COPY . .
+RUN corepack enable && pnpm build
-# Next.js collects completely anonymous telemetry data about general usage.
-# Learn more here: https://nextjs.org/telemetry
-# Uncomment the following line in case you want to disable telemetry during the build.
-# ENV NEXT_TELEMETRY_DISABLED=1
-ENV SKIP_ENV_VALIDATION=true
-
-RUN corepack enable pnpm && pnpm run build
-
-# Production image, copy all the files and run next
-FROM base AS runner
+FROM node:22-alpine AS runner
WORKDIR /app
-
ENV NODE_ENV=production
-# Uncomment the following line in case you want to disable telemetry during runtime.
-# ENV NEXT_TELEMETRY_DISABLED=1
-
-RUN addgroup --system --gid 1001 nodejs
-RUN adduser --system --uid 1001 nextjs
-
-COPY --from=builder /app/public ./public
-
-# Automatically leverage output traces to reduce image size
-# https://nextjs.org/docs/advanced-features/output-file-tracing
-COPY --from=builder --chown=nextjs:nodejs /app/.next/standalone ./
-COPY --from=builder --chown=nextjs:nodejs /app/.next/static ./.next/static
-
-USER nextjs
-
-EXPOSE 3001
-ENV PORT=3001
-
-# server.js is created by next build from the standalone output
-# https://nextjs.org/docs/pages/api-reference/config/next-config-js/output
-ENV HOSTNAME="0.0.0.0"
-CMD ["node", "server.js"]
+ENV PORT=3000
+ENV HOST=0.0.0.0
+COPY --from=builder /app/.output ./.output
+COPY --from=builder /app/node_modules ./node_modules
+COPY --from=builder /app/package.json ./package.json
+EXPOSE 3000
+CMD ["node", ".output/server/index.mjs"]
diff --git a/README.md b/README.md
index 2d0a5d7..3cd2ac3 100644
--- a/README.md
+++ b/README.md
@@ -1,3 +1,26 @@
-# Admin
+# PoliNetwork Admin
-[WIP] Dashboard for admin and members of PoliNetwork APS
+The PoliNetwork operations console, rebuilt with the latest TanStack Start, React 19, Vite, Nitro, Tailwind CSS v4, and shadcn/ui.
+
+## Development
+
+```bash
+pnpm install
+pnpm dev
+```
+
+Open `http://localhost:3001`. The production server is generated with `pnpm build` and starts with `pnpm start`.
+
+The UI uses shadcn's base components with a custom semantic theme in `src/styles.css`. The theme preserves the console's paper canvas, dark navy shell, cobalt `#1156ae` primary, DM Sans body copy, Libre Baskerville headings, and DM Mono metadata while keeping page layout in Tailwind utilities.
+
+## Environment
+
+Set `BACKEND_URL` to the PoliNetwork backend origin. TanStack Start proxies Better Auth at `/api/auth/*`, and server functions forward the request cookie to its tRPC API, so login and live Telegram, grant, and Azure data stay server-side. When the backend is unavailable, data screens present a clear empty state instead of failing the route.
+
+## Checks
+
+```bash
+pnpm typecheck
+pnpm check
+pnpm build
+```
diff --git a/biome.jsonc b/biome.jsonc
index 9e1c810..18a9891 100644
--- a/biome.jsonc
+++ b/biome.jsonc
@@ -7,15 +7,7 @@
},
"files": {
"ignoreUnknown": true,
- "includes": [
- "**",
- "!node_modules",
- "!.next",
- "!dist",
- "!build",
- "!src/app/globals.css", // modified by shadcn
- "!src/components/ui/*" // modified by shadcn
- ]
+ "includes": ["**", "!node_modules", "!dist", "!build", "!.output", "!.tanstack", "!src/routeTree.gen.ts"]
},
"formatter": {
"enabled": true,
@@ -36,29 +28,21 @@
"recommended": true,
"suspicious": {
"noVar": "error"
- // "noUnknownAtRules": "off" // until fix for tailwind rules is released
+ // Project-specific suspicious rules live here.
},
"nursery": {
"noFloatingPromises": "error",
"noMisusedPromises": "error",
"noUnnecessaryConditions": "error",
"noImportCycles": "warn",
- "useSortedClasses": {
- "options": {
- "attributes": ["classList"],
- "functions": ["cn"]
- }
- }
+ "useSortedClasses": "off"
},
"correctness": {
"useJsonImportAttributes": "warn",
"noPrivateImports": "error"
}
},
- "domains": {
- "project": "recommended",
- "next": "recommended"
- }
+ "domains": { "project": "recommended" }
},
"javascript": {
"formatter": {
diff --git a/components.json b/components.json
index 4a9d7a4..ae57d62 100644
--- a/components.json
+++ b/components.json
@@ -1,11 +1,11 @@
{
"$schema": "https://ui.shadcn.com/schema.json",
"style": "base-nova",
- "rsc": true,
+ "rsc": false,
"tsx": true,
"tailwind": {
- "config": "",
- "css": "src/index.css",
+ "config": "tailwind.config.ts",
+ "css": "src/styles.css",
"baseColor": "neutral",
"cssVariables": true,
"prefix": ""
@@ -14,7 +14,7 @@
"rtl": false,
"aliases": {
"components": "@/components",
- "utils": "@/lib/utils/shadcn",
+ "utils": "@/lib/utils",
"ui": "@/components/ui",
"lib": "@/lib",
"hooks": "@/hooks"
diff --git a/next-env.d.ts b/next-env.d.ts
deleted file mode 100644
index 830fb59..0000000
--- a/next-env.d.ts
+++ /dev/null
@@ -1,6 +0,0 @@
-///
-///
-///
-
-// NOTE: This file should not be edited
-// see https://nextjs.org/docs/app/api-reference/config/typescript for more information.
diff --git a/next.config.ts b/next.config.ts
deleted file mode 100644
index 609ecca..0000000
--- a/next.config.ts
+++ /dev/null
@@ -1,19 +0,0 @@
-import type { NextConfig } from "next"
-/**
- * Run `build` or `dev` with `SKIP_ENV_VALIDATION` to skip env validation. This is especially useful
- * for Docker builds.
- */
-import "./src/env.ts"
-
-const config: NextConfig = {
- typescript: {
- ignoreBuildErrors: true,
- },
- output: "standalone",
- transpilePackages: ["@t3-oss/env-nextjs", "@t3-oss/env-core"],
- experimental: {
- reactCompiler: true,
- },
-}
-
-export default config
diff --git a/package.json b/package.json
index cc55384..c2dfa48 100644
--- a/package.json
+++ b/package.json
@@ -4,65 +4,47 @@
"private": true,
"type": "module",
"scripts": {
- "build": "next build",
- "dev": "PORT=3001 next dev --turbo",
+ "dev": "vite dev --port 3001",
+ "build": "vite build",
+ "start": "node .output/server/index.mjs",
+ "preview": "vite preview",
+ "typecheck": "tsc --noEmit",
"check": "biome check",
- "check:fix": "biome check --fix --unsafe",
- "preview": "next build && next start",
- "start": "next start",
- "typecheck": "tsc --noEmit"
+ "check:fix": "biome check --write --unsafe"
},
"dependencies": {
- "@base-ui/react": "^1.3.0",
+ "@base-ui/react": "^1.6.0",
"@better-auth/passkey": "^1.5.5",
- "@hookform/resolvers": "^3.9.1",
"@polinetwork/backend": "^0.16.0",
- "@radix-ui/react-dialog": "^1.1.15",
- "@t3-oss/env-nextjs": "^0.13.10",
- "@tanstack/react-table": "^8.21.2",
+ "@tanstack/react-router": "latest",
+ "@tanstack/react-start": "latest",
+ "@tanstack/react-store": "^0.11.0",
+ "@tanstack/react-table": "9.0.0-beta.38",
"@trpc/client": "11.5.1",
- "@trpc/next": "11.5.1",
- "babel-plugin-react-compiler": "1.0.0",
"better-auth": "^1.5.5",
"class-variance-authority": "^0.7.1",
"clsx": "^2.1.1",
- "cmdk": "^1.1.1",
- "date-fns": "^4.1.0",
- "geist": "^1.3.0",
- "input-otp": "^1.4.2",
- "lucide-react": "^0.525.0",
- "next": "^15.5.18",
- "next-themes": "^0.4.4",
- "postgres": "^3.4.4",
- "radix-ui": "^1.4.3",
- "react": "^18.3.1",
- "react-day-picker": "^9.14.0",
- "react-dom": "^18.3.1",
- "react-error-boundary": "^6.1.0",
- "react-hook-form": "^7.55.0",
- "server-only": "^0.0.1",
- "shadcn": "^4.2.0",
- "sonner": "^2.0.3",
+ "lucide-react": "^0.545.0",
+ "nitro": "latest",
+ "react": "^19.2.0",
+ "react-dom": "^19.2.0",
+ "shadcn": "^4.13.0",
+ "sonner": "^2.0.7",
"superjson": "^2.2.1",
- "tailwind-merge": "^3.0.1",
- "tailwind-scrollbar": "^4.0.2",
- "tailwindcss-animate": "^1.0.7",
+ "tailwind-merge": "^3.6.0",
"tw-animate-css": "^1.4.0",
"zod": "^4.3.5"
},
"devDependencies": {
"@biomejs/biome": "2.3.10",
- "@tailwindcss/postcss": "^4.1.4",
- "@trpc/server": "11.5.1",
- "@types/node": "^20.14.10",
- "@types/react": "^18.3.3",
- "@types/react-dom": "^18.3.0",
- "postcss": "^8.4.39",
- "tailwindcss": "^4.1.4",
- "typescript": "^5.5.3"
+ "@tailwindcss/vite": "^4.3.2",
+ "@types/node": "^22.10.2",
+ "@types/react": "^19.2.0",
+ "@types/react-dom": "^19.2.0",
+ "@vitejs/plugin-react": "^6.0.1",
+ "tailwindcss": "^4.3.2",
+ "typescript": "^6.0.2",
+ "vite": "^8.0.0"
},
- "ct3aMetadata": {
- "initVersion": "7.38.1"
- },
- "packageManager": "pnpm@10.8.1+sha512.c50088ba998c67b8ca8c99df8a5e02fd2ae2e2b29aaf238feaa9e124248d3f48f9fb6db2424949ff901cffbb5e0f0cc1ad6aedb602cd29450751d11c35023677"
+ "packageManager": "pnpm@10.8.1"
}
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index eb0e106..86688ef 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -9,107 +9,62 @@ importers:
.:
dependencies:
'@base-ui/react':
- specifier: ^1.3.0
- version: 1.3.0(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ specifier: ^1.6.0
+ version: 1.6.0(@types/react@19.2.17)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)
'@better-auth/passkey':
specifier: ^1.5.5
- version: 1.5.5(@better-auth/core@1.5.5(@better-auth/utils@0.3.1)(@better-fetch/fetch@1.1.21)(better-call@1.3.2(zod@4.3.6))(jose@6.1.3)(kysely@0.28.12)(nanostores@1.2.0))(@better-auth/utils@0.3.1)(@better-fetch/fetch@1.1.21)(better-auth@1.5.5(mongodb@7.1.0)(next@15.5.18(@babel/core@7.29.0)(babel-plugin-react-compiler@1.0.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(better-call@1.3.2(zod@4.3.5))(nanostores@1.2.0)
- '@hookform/resolvers':
- specifier: ^3.9.1
- version: 3.10.0(react-hook-form@7.55.0(react@18.3.1))
+ version: 1.5.5(@better-auth/core@1.5.5(@better-auth/utils@0.3.1)(@better-fetch/fetch@1.1.21)(better-call@1.3.2(zod@4.3.6))(jose@6.1.3)(kysely@0.28.12)(nanostores@1.2.0))(@better-auth/utils@0.3.1)(@better-fetch/fetch@1.1.21)(better-auth@1.5.5(@tanstack/react-start@1.168.27(crossws@0.4.9(srvx@0.11.21))(react-dom@19.2.7(react@19.2.7))(react@19.2.7)(rolldown@1.1.5)(vite@8.1.4(@types/node@22.20.1)(jiti@2.7.0)))(mongodb@7.1.0)(next@15.5.18(@babel/core@7.29.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.7(react@19.2.7))(react@19.2.7))(react-dom@19.2.7(react@19.2.7))(react@19.2.7)(solid-js@1.9.14))(better-call@1.3.2(zod@4.3.5))(nanostores@1.2.0)
'@polinetwork/backend':
specifier: ^0.16.0
version: 0.16.0
- '@radix-ui/react-dialog':
- specifier: ^1.1.15
- version: 1.1.15(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
- '@t3-oss/env-nextjs':
- specifier: ^0.13.10
- version: 0.13.10(typescript@5.7.3)(zod@4.3.5)
+ '@tanstack/react-router':
+ specifier: latest
+ version: 1.170.17(react-dom@19.2.7(react@19.2.7))(react@19.2.7)
+ '@tanstack/react-start':
+ specifier: latest
+ version: 1.168.27(crossws@0.4.9(srvx@0.11.21))(react-dom@19.2.7(react@19.2.7))(react@19.2.7)(rolldown@1.1.5)(vite@8.1.4(@types/node@22.20.1)(jiti@2.7.0))
+ '@tanstack/react-store':
+ specifier: ^0.11.0
+ version: 0.11.0(react-dom@19.2.7(react@19.2.7))(react@19.2.7)
'@tanstack/react-table':
- specifier: ^8.21.2
- version: 8.21.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ specifier: 9.0.0-beta.38
+ version: 9.0.0-beta.38(react-dom@19.2.7(react@19.2.7))(react@19.2.7)
'@trpc/client':
specifier: 11.5.1
- version: 11.5.1(@trpc/server@11.5.1(typescript@5.7.3))(typescript@5.7.3)
- '@trpc/next':
- specifier: 11.5.1
- version: 11.5.1(@tanstack/react-query@5.90.19(react@18.3.1))(@trpc/client@11.5.1(@trpc/server@11.5.1(typescript@5.7.3))(typescript@5.7.3))(@trpc/react-query@11.5.1(@tanstack/react-query@5.90.19(react@18.3.1))(@trpc/client@11.5.1(@trpc/server@11.5.1(typescript@5.7.3))(typescript@5.7.3))(@trpc/server@11.5.1(typescript@5.7.3))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.7.3))(@trpc/server@11.5.1(typescript@5.7.3))(next@15.5.18(@babel/core@7.29.0)(babel-plugin-react-compiler@1.0.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.7.3)
- babel-plugin-react-compiler:
- specifier: 1.0.0
- version: 1.0.0
+ version: 11.5.1(@trpc/server@11.5.1(typescript@6.0.3))(typescript@6.0.3)
better-auth:
specifier: ^1.5.5
- version: 1.5.5(mongodb@7.1.0)(next@15.5.18(@babel/core@7.29.0)(babel-plugin-react-compiler@1.0.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ version: 1.5.5(@tanstack/react-start@1.168.27(crossws@0.4.9(srvx@0.11.21))(react-dom@19.2.7(react@19.2.7))(react@19.2.7)(rolldown@1.1.5)(vite@8.1.4(@types/node@22.20.1)(jiti@2.7.0)))(mongodb@7.1.0)(next@15.5.18(@babel/core@7.29.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.7(react@19.2.7))(react@19.2.7))(react-dom@19.2.7(react@19.2.7))(react@19.2.7)(solid-js@1.9.14)
class-variance-authority:
specifier: ^0.7.1
version: 0.7.1
clsx:
specifier: ^2.1.1
version: 2.1.1
- cmdk:
- specifier: ^1.1.1
- version: 1.1.1(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
- date-fns:
- specifier: ^4.1.0
- version: 4.1.0
- geist:
- specifier: ^1.3.0
- version: 1.3.1(next@15.5.18(@babel/core@7.29.0)(babel-plugin-react-compiler@1.0.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))
- input-otp:
- specifier: ^1.4.2
- version: 1.4.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
lucide-react:
- specifier: ^0.525.0
- version: 0.525.0(react@18.3.1)
- next:
- specifier: ^15.5.18
- version: 15.5.18(@babel/core@7.29.0)(babel-plugin-react-compiler@1.0.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
- next-themes:
- specifier: ^0.4.4
- version: 0.4.4(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
- postgres:
- specifier: ^3.4.4
- version: 3.4.5
- radix-ui:
- specifier: ^1.4.3
- version: 1.4.3(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ specifier: ^0.545.0
+ version: 0.545.0(react@19.2.7)
+ nitro:
+ specifier: latest
+ version: 3.0.260610-beta(chokidar@5.0.0)(dotenv@17.4.2)(jiti@2.7.0)(mongodb@7.1.0)(vite@8.1.4(@types/node@22.20.1)(jiti@2.7.0))
react:
- specifier: ^18.3.1
- version: 18.3.1
- react-day-picker:
- specifier: ^9.14.0
- version: 9.14.0(react@18.3.1)
+ specifier: ^19.2.0
+ version: 19.2.7
react-dom:
- specifier: ^18.3.1
- version: 18.3.1(react@18.3.1)
- react-error-boundary:
- specifier: ^6.1.0
- version: 6.1.0(react@18.3.1)
- react-hook-form:
- specifier: ^7.55.0
- version: 7.55.0(react@18.3.1)
- server-only:
- specifier: ^0.0.1
- version: 0.0.1
+ specifier: ^19.2.0
+ version: 19.2.7(react@19.2.7)
shadcn:
- specifier: ^4.2.0
- version: 4.2.0(@types/node@20.17.19)(typescript@5.7.3)
+ specifier: ^4.13.0
+ version: 4.13.0(typescript@6.0.3)
sonner:
- specifier: ^2.0.3
- version: 2.0.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ specifier: ^2.0.7
+ version: 2.0.7(react-dom@19.2.7(react@19.2.7))(react@19.2.7)
superjson:
specifier: ^2.2.1
version: 2.2.2
tailwind-merge:
- specifier: ^3.0.1
- version: 3.0.1
- tailwind-scrollbar:
- specifier: ^4.0.2
- version: 4.0.2(react@18.3.1)(tailwindcss@4.1.4)
- tailwindcss-animate:
- specifier: ^1.0.7
- version: 1.0.7(tailwindcss@4.1.4)
+ specifier: ^3.6.0
+ version: 3.6.0
tw-animate-css:
specifier: ^1.4.0
version: 1.4.0
@@ -120,41 +75,45 @@ importers:
'@biomejs/biome':
specifier: 2.3.10
version: 2.3.10
- '@tailwindcss/postcss':
- specifier: ^4.1.4
- version: 4.1.4
- '@trpc/server':
- specifier: 11.5.1
- version: 11.5.1(typescript@5.7.3)
+ '@tailwindcss/vite':
+ specifier: ^4.3.2
+ version: 4.3.2(vite@8.1.4(@types/node@22.20.1)(jiti@2.7.0))
'@types/node':
- specifier: ^20.14.10
- version: 20.17.19
+ specifier: ^22.10.2
+ version: 22.20.1
'@types/react':
- specifier: ^18.3.3
- version: 18.3.18
+ specifier: ^19.2.0
+ version: 19.2.17
'@types/react-dom':
- specifier: ^18.3.0
- version: 18.3.5(@types/react@18.3.18)
- postcss:
- specifier: ^8.4.39
- version: 8.5.2
+ specifier: ^19.2.0
+ version: 19.2.3(@types/react@19.2.17)
+ '@vitejs/plugin-react':
+ specifier: ^6.0.1
+ version: 6.0.3(babel-plugin-react-compiler@1.0.0)(vite@8.1.4(@types/node@22.20.1)(jiti@2.7.0))
tailwindcss:
- specifier: ^4.1.4
- version: 4.1.4
+ specifier: ^4.3.2
+ version: 4.3.2
typescript:
- specifier: ^5.5.3
- version: 5.7.3
+ specifier: ^6.0.2
+ version: 6.0.3
+ vite:
+ specifier: ^8.0.0
+ version: 8.1.4(@types/node@22.20.1)(jiti@2.7.0)
packages:
- '@alloc/quick-lru@5.2.0':
- resolution: {integrity: sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==}
- engines: {node: '>=10'}
+ '@babel/code-frame@7.27.1':
+ resolution: {integrity: sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==}
+ engines: {node: '>=6.9.0'}
'@babel/code-frame@7.29.0':
resolution: {integrity: sha512-9NhCeYjq9+3uxgdtp20LSiJXJvN0FeCtNGpJxuMFZ1Kv3cWUNb6DOhJwUvcVCzKGR66cw4njwM6hrJLqgOwbcw==}
engines: {node: '>=6.9.0'}
+ '@babel/code-frame@7.29.7':
+ resolution: {integrity: sha512-Aup7aUOfpbAUg2ROOJN6Iw5f9DMBlzu0mIkm/malLQFN/YQgO48wCj0Kxa3sEHJvPVFg7siR+qRInwXd2qhQKw==}
+ engines: {node: '>=6.9.0'}
+
'@babel/compat-data@7.29.0':
resolution: {integrity: sha512-T1NCJqT/j9+cn8fvkt7jtwbLBfLC/1y1c7NtCeXFRgzGTsafi68MRv8yzkYSapBnFA6L3U2VSc02ciDzoAJhJg==}
engines: {node: '>=6.9.0'}
@@ -167,16 +126,20 @@ packages:
resolution: {integrity: sha512-qsaF+9Qcm2Qv8SRIMMscAvG4O3lJ0F1GuMo5HR/Bp02LopNgnZBC/EkbevHFeGs4ls/oPz9v+Bsmzbkbe+0dUw==}
engines: {node: '>=6.9.0'}
- '@babel/helper-annotate-as-pure@7.27.3':
- resolution: {integrity: sha512-fXSwMQqitTGeHLBC08Eq5yXz2m37E4pJX1qAU1+2cNedz/ifv/bVXft90VeSav5nFO61EcNgwr0aJxbyPaWBPg==}
+ '@babel/generator@7.29.7':
+ resolution: {integrity: sha512-DkXD5OJQaAQIdZ1bt3UZdEnHAn9Imd3IVBdX03UFe+ony9Ojw5pzr9YVKGDY1jt+Gcn/FnGkNf8r+Vj5NOJWtQ==}
+ engines: {node: '>=6.9.0'}
+
+ '@babel/helper-annotate-as-pure@7.29.7':
+ resolution: {integrity: sha512-OoK6239jHPuSQOoS0kfTVKn0b/rVTk0seKq4Gd2UMLtmOVLjDC0ki3e+c90Trqv2gMfvJFqkiljrr568+qddiw==}
engines: {node: '>=6.9.0'}
'@babel/helper-compilation-targets@7.28.6':
resolution: {integrity: sha512-JYtls3hqi15fcx5GaSNL7SCTJ2MNmjrkHXg4FSpOA/grxK8KwyZ5bubHsCq8FXCkua6xhuaaBit+3b7+VZRfcA==}
engines: {node: '>=6.9.0'}
- '@babel/helper-create-class-features-plugin@7.28.6':
- resolution: {integrity: sha512-dTOdvsjnG3xNT9Y0AUg1wAl38y+4Rl4sf9caSQZOXdNqVn+H+HbbJ4IyyHaIqNR6SW9oJpA/RuRjsjCw2IdIow==}
+ '@babel/helper-create-class-features-plugin@7.29.7':
+ resolution: {integrity: sha512-IY3ZD9Tmooqr3TUhc3DUWxiuo8xx1DWLhd5M7hQ+ZWJamqM2BbalrBJb2MisSLoYorOj75U03qULCxQTY9r3hg==}
engines: {node: '>=6.9.0'}
peerDependencies:
'@babel/core': ^7.0.0
@@ -185,54 +148,76 @@ packages:
resolution: {integrity: sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==}
engines: {node: '>=6.9.0'}
- '@babel/helper-member-expression-to-functions@7.28.5':
- resolution: {integrity: sha512-cwM7SBRZcPCLgl8a7cY0soT1SptSzAlMH39vwiRpOQkJlh53r5hdHwLSCZpQdVLT39sZt+CRpNwYG4Y2v77atg==}
+ '@babel/helper-globals@7.29.7':
+ resolution: {integrity: sha512-3nQVUAtvkKH9zahfWgw96Jc/uFOmjACE1kQz82E2lqWmHBgjzbNlsC22nuQTfahmWeQtTq5nQ/4Nnd2A1wj4zA==}
+ engines: {node: '>=6.9.0'}
+
+ '@babel/helper-member-expression-to-functions@7.29.7':
+ resolution: {integrity: sha512-j+7JYmk1JYDtACIGj0QJqqWZjoUpMoEikQGADMaHgCMCSDqd2+P32rfcibUNrGOMWrlzK1WJBdxrB3JJQZwWtg==}
engines: {node: '>=6.9.0'}
'@babel/helper-module-imports@7.28.6':
resolution: {integrity: sha512-l5XkZK7r7wa9LucGw9LwZyyCUscb4x37JWTPz7swwFE/0FMQAGpiWUZn8u9DzkSBWEcK25jmvubfpw2dnAMdbw==}
engines: {node: '>=6.9.0'}
+ '@babel/helper-module-imports@7.29.7':
+ resolution: {integrity: sha512-ejHwrQQYcm9xnTivShn2IDOlIzInN34AXskvq9QicvCtEzq1Vzclu/tKF8Jq1Cg8JG2GL6/EmjgsCT7lXepE3g==}
+ engines: {node: '>=6.9.0'}
+
'@babel/helper-module-transforms@7.28.6':
resolution: {integrity: sha512-67oXFAYr2cDLDVGLXTEABjdBJZ6drElUSI7WKp70NrpyISso3plG9SAGEF6y7zbha/wOzUByWWTJvEDVNIUGcA==}
engines: {node: '>=6.9.0'}
peerDependencies:
'@babel/core': ^7.0.0
- '@babel/helper-optimise-call-expression@7.27.1':
- resolution: {integrity: sha512-URMGH08NzYFhubNSGJrpUEphGKQwMQYBySzat5cAByY1/YgIRkULnIy3tAMeszlL/so2HbeilYloUmSpd7GdVw==}
+ '@babel/helper-module-transforms@7.29.7':
+ resolution: {integrity: sha512-UPUVSyXbOh627KiCIGQSgwWzGeBKLkaJ9PJEdrngIwMSzxLR4jS4+f1f1jb7VzBbg8nFLaYotvVPFCTqdrmTAg==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0
+
+ '@babel/helper-optimise-call-expression@7.29.7':
+ resolution: {integrity: sha512-+kmGVjcT9RGYzoDwdwEqEvGgKe3BYq+O1iGzjFubaNgZHwYHP6lsF2Yghf4kEuv9BV7tYDZ913aBW9am6YKong==}
engines: {node: '>=6.9.0'}
- '@babel/helper-plugin-utils@7.28.6':
- resolution: {integrity: sha512-S9gzZ/bz83GRysI7gAD4wPT/AI3uCnY+9xn+Mx/KPs2JwHJIz1W8PZkg2cqyt3RNOBM8ejcXhV6y8Og7ly/Dug==}
+ '@babel/helper-plugin-utils@7.29.7':
+ resolution: {integrity: sha512-G7sHYigPY17oO5SYWnfD/0MTBwVR781S/JI643e/JhUYgVgWE/61SoW3NH9KWUKyKq5LVh3npif99Wkt6j86Jw==}
engines: {node: '>=6.9.0'}
- '@babel/helper-replace-supers@7.28.6':
- resolution: {integrity: sha512-mq8e+laIk94/yFec3DxSjCRD2Z0TAjhVbEJY3UQrlwVo15Lmt7C2wAUbK4bjnTs4APkwsYLTahXRraQXhb1WCg==}
+ '@babel/helper-replace-supers@7.29.7':
+ resolution: {integrity: sha512-atfGXWSeCiF4DnKZIfmJfQRkSw9b9gNNXR1kqKjbhG4pGYCOnkp8OcTB8E3NXjBu8NpheSnOeNKz8KT7UNFTmQ==}
engines: {node: '>=6.9.0'}
peerDependencies:
'@babel/core': ^7.0.0
- '@babel/helper-skip-transparent-expression-wrappers@7.27.1':
- resolution: {integrity: sha512-Tub4ZKEXqbPjXgWLl2+3JpQAYBJ8+ikpQ2Ocj/q/r0LwE3UhENh7EUabyHjz2kCEsrRY83ew2DQdHluuiDQFzg==}
+ '@babel/helper-skip-transparent-expression-wrappers@7.29.7':
+ resolution: {integrity: sha512-brcMGQaVzIeUb+6/bs1Av0f8YuNNjKY2JyvfRCsFuFsdKccEQ5Ges2y74D74NZ1Rz8lKJ9ksJkfqwQFJ/iNEyQ==}
engines: {node: '>=6.9.0'}
'@babel/helper-string-parser@7.27.1':
resolution: {integrity: sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==}
engines: {node: '>=6.9.0'}
- '@babel/helper-validator-identifier@7.27.1':
- resolution: {integrity: sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==}
+ '@babel/helper-string-parser@7.29.7':
+ resolution: {integrity: sha512-Pb5ijPrZ89GDH8223L4UP8i6QApWxs04RbPQJTeWDV0/keR2E36MeKnyr6LYmUUvqRRI+Iv87SuF1W6ErINzYw==}
engines: {node: '>=6.9.0'}
'@babel/helper-validator-identifier@7.28.5':
resolution: {integrity: sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==}
engines: {node: '>=6.9.0'}
+ '@babel/helper-validator-identifier@7.29.7':
+ resolution: {integrity: sha512-qehxGkRj55h/ff8EMaJ+cYhyaKlHIxqYDn682wQD7RNp9UujOQsHog2uS0r2vzr4pW+sXf90NeeayjcNaX3fFg==}
+ engines: {node: '>=6.9.0'}
+
'@babel/helper-validator-option@7.27.1':
resolution: {integrity: sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==}
engines: {node: '>=6.9.0'}
+ '@babel/helper-validator-option@7.29.7':
+ resolution: {integrity: sha512-N9ZErrD+yW5geCDtBqnOoxmR8+tNKiGuxKlDpuJxfsqpa2dFcexaziGAE/qoHLiDDreVNMupxGmSoNlyvsA3gw==}
+ engines: {node: '>=6.9.0'}
+
'@babel/helpers@7.29.2':
resolution: {integrity: sha512-HoGuUs4sCZNezVEKdVcwqmZN8GoHirLUcLaYVNBK2J0DadGtdcqgr3BCbvH8+XUo4NGjNl3VOtSjEKNzqfFgKw==}
engines: {node: '>=6.9.0'}
@@ -242,69 +227,88 @@ packages:
engines: {node: '>=6.0.0'}
hasBin: true
- '@babel/plugin-syntax-jsx@7.28.6':
- resolution: {integrity: sha512-wgEmr06G6sIpqr8YDwA2dSRTE3bJ+V0IfpzfSY3Lfgd7YWOaAdlykvJi13ZKBt8cZHfgH1IXN+CL656W3uUa4w==}
+ '@babel/parser@7.29.7':
+ resolution: {integrity: sha512-hnORnjP/1P/zFEndoeX+n+t1RwWRJiJpM/jO7FW32Kn9r5+sJB2JWOdYo4L6k78j15eCwY3Gm/7364B1EMwtNg==}
+ engines: {node: '>=6.0.0'}
+ hasBin: true
+
+ '@babel/plugin-syntax-jsx@7.29.7':
+ resolution: {integrity: sha512-TSu8+mHCoEaaCDEZ0I3+6mvTBYR4PCxQwf2z9/r5Tbztv6NaLR3B9thGTTxX2WGuGHJqRiAbKPeGTJ5XWXVg6A==}
engines: {node: '>=6.9.0'}
peerDependencies:
'@babel/core': ^7.0.0-0
- '@babel/plugin-syntax-typescript@7.28.6':
- resolution: {integrity: sha512-+nDNmQye7nlnuuHDboPbGm00Vqg3oO8niRRL27/4LYHUsHYh0zJ1xWOz0uRwNFmM1Avzk8wZbc6rdiYhomzv/A==}
+ '@babel/plugin-syntax-typescript@7.29.7':
+ resolution: {integrity: sha512-ngr+82Sh0xMz25TPCZi+nC2iTzjfCdWS2ONXTp/PtSCHCgaCNBpdMqgvJ2ccdLlClVZ7sisIgB914j/JFe+RZA==}
engines: {node: '>=6.9.0'}
peerDependencies:
'@babel/core': ^7.0.0-0
- '@babel/plugin-transform-modules-commonjs@7.28.6':
- resolution: {integrity: sha512-jppVbf8IV9iWWwWTQIxJMAJCWBuuKx71475wHwYytrRGQ2CWiDvYlADQno3tcYpS/T2UUWFQp3nVtYfK/YBQrA==}
+ '@babel/plugin-transform-modules-commonjs@7.29.7':
+ resolution: {integrity: sha512-j0vCldybPC5b5dwCQOJ21uKtHzt7hxLygJTg9eF1ScfaikEDNfzn94XoW5Fi+seBR0nCyL23xaBFFkq7dTM8XQ==}
engines: {node: '>=6.9.0'}
peerDependencies:
'@babel/core': ^7.0.0-0
- '@babel/plugin-transform-typescript@7.28.6':
- resolution: {integrity: sha512-0YWL2RFxOqEm9Efk5PvreamxPME8OyY0wM5wh5lHjF+VtVhdneCWGzZeSqzOfiobVqQaNCd2z0tQvnI9DaPWPw==}
+ '@babel/plugin-transform-typescript@7.29.7':
+ resolution: {integrity: sha512-jK52h8LaLc7JarhQV2ofeFMts4H7vnOXnqZNA6fYglBTZewRBE51KWt3BUltW1P+KoPsYkHoJeXePuz4zo2LMw==}
engines: {node: '>=6.9.0'}
peerDependencies:
'@babel/core': ^7.0.0-0
- '@babel/preset-typescript@7.28.5':
- resolution: {integrity: sha512-+bQy5WOI2V6LJZpPVxY+yp66XdZ2yifu0Mc1aP5CQKgjn4QM5IN2i5fAZ4xKop47pr8rpVhiAeu+nDQa12C8+g==}
+ '@babel/preset-typescript@7.29.7':
+ resolution: {integrity: sha512-/Foi8vKY2EVbed/1eZx0gJEEwHAIxogrySI7rULcRIvhZzbvoE/b5qG5Ghc0WKAFKOHA9SD1x7RsFlOYdutIiQ==}
engines: {node: '>=6.9.0'}
peerDependencies:
'@babel/core': ^7.0.0-0
- '@babel/runtime@7.29.2':
- resolution: {integrity: sha512-JiDShH45zKHWyGe4ZNVRrCjBz8Nh9TMmZG1kh4QTK8hCBTWBi8Da+i7s1fJw7/lYpM4ccepSNfqzZ/QvABBi5g==}
+ '@babel/runtime@7.29.7':
+ resolution: {integrity: sha512-Nq8OhGWiZIZGV6hLHoyAKLLcJihP/xFeBMGJoUrxTX2psI8dCifzLhZISFb+VWS3wFMRDmCGw5R+dOySCqPLhw==}
engines: {node: '>=6.9.0'}
'@babel/template@7.28.6':
resolution: {integrity: sha512-YA6Ma2KsCdGb+WC6UpBVFJGXL58MDA6oyONbjyF/+5sBgxY/dwkhLogbMT2GXXyU84/IhRw/2D1Os1B/giz+BQ==}
engines: {node: '>=6.9.0'}
+ '@babel/template@7.29.7':
+ resolution: {integrity: sha512-puq+Gf35oI24FeN11LkoUQFqv9uwNeWpxXZi/Ji3rRIoKAzKnxRaZ+Gkj0vKS9ZCiTESfng1N9LyOyXvo+m+Gg==}
+ engines: {node: '>=6.9.0'}
+
'@babel/traverse@7.29.0':
resolution: {integrity: sha512-4HPiQr0X7+waHfyXPZpWPfWL/J7dcN1mx9gL6WdQVMbPnF3+ZhSMs8tCxN7oHddJE9fhNE7+lxdnlyemKfJRuA==}
engines: {node: '>=6.9.0'}
- '@babel/types@7.28.2':
- resolution: {integrity: sha512-ruv7Ae4J5dUYULmeXw1gmb7rYRz57OWCPM57pHojnLq/3Z1CK2lNSLTCVjxVk1F/TZHwOZZrOWi0ur95BbLxNQ==}
+ '@babel/traverse@7.29.7':
+ resolution: {integrity: sha512-EhlfNQtZ+NK22w5BM61ciuiq1m58ed33Wr1Xan//ZRTy6hgjnwyCffRYwzsGXdASJSUJ1guZILsErh1eQcl+zw==}
engines: {node: '>=6.9.0'}
'@babel/types@7.29.0':
resolution: {integrity: sha512-LwdZHpScM4Qz8Xw2iKSzS+cfglZzJGvofQICy7W7v4caru4EaAmyUuO6BGrbyQ2mYV11W0U8j5mBhd14dd3B0A==}
engines: {node: '>=6.9.0'}
- '@base-ui/react@1.3.0':
- resolution: {integrity: sha512-FwpKqZbPz14AITp1CVgf4AjhKPe1OeeVKSBMdgD10zbFlj3QSWelmtCMLi2+/PFZZcIm3l87G7rwtCZJwHyXWA==}
+ '@babel/types@7.29.7':
+ resolution: {integrity: sha512-4zBIxpPzowiZpusoFkyGVwakdRJUyuH5PxQ/PrqghfdFWWasvnCdPfQXHrenDai+gyLARulZjZowCOj6fjT4pA==}
+ engines: {node: '>=6.9.0'}
+
+ '@base-ui/react@1.6.0':
+ resolution: {integrity: sha512-/jzjTWJYXhRFO45Bev9lc3cHbmjzCMpUqbMZ2AgKy/z25mY9B6shGSNcXcjQar9n5doM0KYW1W8fcFv2jZBuMw==}
engines: {node: '>=14.0.0'}
peerDependencies:
+ '@date-fns/tz': ^1.2.0
'@types/react': ^17 || ^18 || ^19
+ date-fns: ^4.0.0
react: ^17 || ^18 || ^19
react-dom: ^17 || ^18 || ^19
peerDependenciesMeta:
+ '@date-fns/tz':
+ optional: true
'@types/react':
optional: true
+ date-fns:
+ optional: true
- '@base-ui/utils@0.2.6':
- resolution: {integrity: sha512-yQ+qeuqohwhsNpoYDqqXaLllYAkPCP4vYdDrVo8FQXaAPfHWm1pG/Vm+jmGTA5JFS0BAIjookyapuJFY8F9PIw==}
+ '@base-ui/utils@0.3.1':
+ resolution: {integrity: sha512-gFFiltORVmW/N6IILTGxizP3PBpVpysqML1ALY5Vk0mH+7faVkCknOU31goYHN5Aoek2dkjxva1XOD2Ce9WuIg==}
peerDependencies:
'@types/react': ^17 || ^18 || ^19
react: ^17 || ^18 || ^19
@@ -444,40 +448,28 @@ packages:
cpu: [x64]
os: [win32]
- '@date-fns/tz@1.4.1':
- resolution: {integrity: sha512-P5LUNhtbj6YfI3iJjw5EL9eUAG6OitD0W3fWQcpQjDRc/QIsL0tRNuO1PcDvPccWL1fSTXXdE1ds+l95DV/OFA==}
-
- '@dotenvx/dotenvx@1.61.0':
- resolution: {integrity: sha512-utL3cpZoFzflyqUkjYbxYujI6STBTmO5LFn4bbin/NZnRWN6wQ7eErhr3/Vpa5h/jicPFC6kTa42r940mQftJQ==}
+ '@dotenvx/dotenvx@1.75.1':
+ resolution: {integrity: sha512-/BITOC9dmS/edY2zQwZNicQ059O6RKabtQfyEafV0nGtfYRNHYy1DIPiYVcov40+tob9hfmBnbR963dS+EQ1DQ==}
hasBin: true
- '@ecies/ciphers@0.2.6':
- resolution: {integrity: sha512-patgsRPKGkhhoBjETV4XxD0En4ui5fbX0hzayqI3M8tvNMGUoUvmyYAIWwlxBc1KX5cturfqByYdj5bYGRpN9g==}
- engines: {bun: '>=1', deno: '>=2.7.10', node: '>=16'}
- peerDependencies:
- '@noble/ciphers': ^1.0.0
+ '@dotenvx/primitives@0.8.0':
+ resolution: {integrity: sha512-VYJy0uhFm9zTJ1TxBaW/pA8bjbOM/OttaNMwZ1RHG4JKyRG7DhSdiqD1ipQoAyoD22olUtxbP78W9xY3Wd11bg==}
- '@emnapi/runtime@1.10.0':
- resolution: {integrity: sha512-ewvYlk86xUoGI0zQRNq/mC+16R1QeDlKQy21Ki3oSYXNgLb45GV1P6A0M+/s6nyCuNDqe5VpaY84BzXGwVbwFA==}
+ '@emnapi/core@1.11.1':
+ resolution: {integrity: sha512-RSvbQmHzdKzNsLYa/wHrbc3KN4sYLKAdPZxqiM2HATqv/SBk2/ENSHpvXGaLOMcsAyz0poEGqkmmKYG3OWiJEQ==}
- '@floating-ui/core@1.6.9':
- resolution: {integrity: sha512-uMXCuQ3BItDUbAMhIXw7UPXRfAlOAvZzdK9BWpE60MCn+Svt3aLn9jsPTi/WNGlRUu2uI0v5S7JiIUsbsvh3fw==}
+ '@emnapi/runtime@1.11.1':
+ resolution: {integrity: sha512-vgj7R3y3Wgx24IQaGPA/R6YFXLHVMOZ0uVEyIQPaWs+rd1AzfEMXlAC22FYwO1XkKR6NPsq7mUandH8oIRdZFw==}
+
+ '@emnapi/wasi-threads@1.2.2':
+ resolution: {integrity: sha512-c95qOXkHdydNKhscBTebqEC1CVAZpyqOfVfBzQ1qgzyl3gfeldUjIggDbIZgDKsHLgnsM+igH7TJ/eAasaVuMA==}
'@floating-ui/core@1.7.5':
resolution: {integrity: sha512-1Ih4WTWyw0+lKyFMcBHGbb5U5FtuHJuujoyyr5zTaWS5EYMeT6Jb2AuDeftsCsEuchO+mM2ij5+q9crhydzLhQ==}
- '@floating-ui/dom@1.6.13':
- resolution: {integrity: sha512-umqzocjDgNRGTuO7Q8CU32dkHkECqI8ZdMZ5Swb6QAM0t5rnlrN3lGo1hdpscRd3WS8T6DKYK4ephgIH9iRh3w==}
-
'@floating-ui/dom@1.7.6':
resolution: {integrity: sha512-9gZSAI5XM36880PPMm//9dfiEngYoC6Am2izES1FF406YFsjvyBMmeJ2g4SAju3xWwtuynNRFL2s9hgxpLI5SQ==}
- '@floating-ui/react-dom@2.1.2':
- resolution: {integrity: sha512-06okr5cgPzMNBy+Ycse2A6udMi4bqwW/zgBF/rwjcNqWkyr82Mcg8b0vjX8OJpZFy/FKjJmw6wV7t44kK6kW7A==}
- peerDependencies:
- react: '>=16.8.0'
- react-dom: '>=16.8.0'
-
'@floating-ui/react-dom@2.1.8':
resolution: {integrity: sha512-cC52bHwM/n/CxS87FH0yWdngEZrjdtLW/qVruo68qg+prK7ZQ4YGdut2GyDVpoGeAYe/h899rVeOVm6Oi40k2A==}
peerDependencies:
@@ -487,23 +479,15 @@ packages:
'@floating-ui/utils@0.2.11':
resolution: {integrity: sha512-RiB/yIh78pcIxl6lLMG0CgBXAZ2Y0eVHqMPYugu+9U0AeT6YBeiJpf7lbdJNIugFP5SIjwNRgo4DhR1Qxi26Gg==}
- '@floating-ui/utils@0.2.9':
- resolution: {integrity: sha512-MDWhGtE+eHw5JW7lq4qhc5yRLS11ERl1c7Z6Xd0a58DozHES6EnNNwUWbMiG4J9Cgj053Bhk8zvlhFYKVhULwg==}
-
'@hexagon/base64@1.1.28':
resolution: {integrity: sha512-lhqDEAvWixy3bZ+UOYbPwUbBkwBq5C1LAJ/xPC8Oi+lL54oyakv/npbA0aU2hgCsx/1NUd4IBvV03+aUBWxerw==}
- '@hono/node-server@1.19.13':
- resolution: {integrity: sha512-TsQLe4i2gvoTtrHje625ngThGBySOgSK3Xo2XRYOdqGN1teR8+I7vchQC46uLJi8OF62YTYA3AhSpumtkhsaKQ==}
+ '@hono/node-server@1.19.14':
+ resolution: {integrity: sha512-GwtvgtXxnWsucXvbQXkRgqksiH2Qed37H9xHZocE5sA3N8O8O8/8FA3uclQXxXVzc9XBZuEOMK7+r02FmSpHtw==}
engines: {node: '>=18.14.1'}
peerDependencies:
hono: ^4
- '@hookform/resolvers@3.10.0':
- resolution: {integrity: sha512-79Dv+3mDF7i+2ajj7SkypSKHhl1cbln1OGavqrsF7p6mbUv11xpqpacPsGDCTRvCSjEEIez2ef1NveSVL3b0Ag==}
- peerDependencies:
- react-hook-form: ^7.0.0
-
'@img/colour@1.1.0':
resolution: {integrity: sha512-Td76q7j57o/tLVdgS746cYARfSyxk8iEfRxewL9h4OMzYhbW4TAcppl0mT4eyqXddh6L/jwoM75mo7ixa/pCeQ==}
engines: {node: '>=18'}
@@ -641,41 +625,6 @@ packages:
cpu: [x64]
os: [win32]
- '@inquirer/ansi@1.0.2':
- resolution: {integrity: sha512-S8qNSZiYzFd0wAcyG5AXCvUHC5Sr7xpZ9wZ2py9XR88jUz8wooStVx5M6dRzczbBWjic9NP7+rY0Xi7qqK/aMQ==}
- engines: {node: '>=18'}
-
- '@inquirer/confirm@5.1.21':
- resolution: {integrity: sha512-KR8edRkIsUayMXV+o3Gv+q4jlhENF9nMYUZs9PA2HzrXeHI8M5uDag70U7RJn9yyiMZSbtF5/UexBtAVtZGSbQ==}
- engines: {node: '>=18'}
- peerDependencies:
- '@types/node': '>=18'
- peerDependenciesMeta:
- '@types/node':
- optional: true
-
- '@inquirer/core@10.3.2':
- resolution: {integrity: sha512-43RTuEbfP8MbKzedNqBrlhhNKVwoK//vUFNW3Q3vZ88BLcrs4kYpGg+B2mm5p2K/HfygoCxuKwJJiv8PbGmE0A==}
- engines: {node: '>=18'}
- peerDependencies:
- '@types/node': '>=18'
- peerDependenciesMeta:
- '@types/node':
- optional: true
-
- '@inquirer/figures@1.0.15':
- resolution: {integrity: sha512-t2IEY+unGHOzAaVM5Xx6DEWKeXlDDcNPeDyUpsRc6CUhBfU3VQOEl+Vssh7VNp1dR8MdUJBWhuObjXCsVpjN5g==}
- engines: {node: '>=18'}
-
- '@inquirer/type@3.0.10':
- resolution: {integrity: sha512-BvziSRxfz5Ov8ch0z/n3oijRSEcEsHnhggm4xFZe93DHcUCTlutlq9Ox4SVENAfcRD22UQq7T/atg9Wr3k09eA==}
- engines: {node: '>=18'}
- peerDependencies:
- '@types/node': '>=18'
- peerDependenciesMeta:
- '@types/node':
- optional: true
-
'@jridgewell/gen-mapping@0.3.13':
resolution: {integrity: sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==}
@@ -708,9 +657,11 @@ packages:
'@mongodb-js/saslprep@1.4.11':
resolution: {integrity: sha512-o9rAHc0IpIjuPSxRutWpE1F62x7n+4mVS4rCNHkzhIUMQcc18bb6xEq5wd2NdN0WjepIyXIppRshYI2kQDOZVA==}
- '@mswjs/interceptors@0.41.3':
- resolution: {integrity: sha512-cXu86tF4VQVfwz8W1SPbhoRyHJkti6mjH/XJIxp40jhO4j2k1m4KYrEykxqWPkFF3vrK4rgQppBh//AwyGSXPA==}
- engines: {node: '>=18'}
+ '@napi-rs/wasm-runtime@1.1.6':
+ resolution: {integrity: sha512-ZLv/JdUfkvOy9eCnnBaGfiO+XimbjebAeO+MRQqD/B+FR1tnRN0tpKSJHRbE8sFfS6aqsXZ67TQjfwfsxULVbg==}
+ peerDependencies:
+ '@emnapi/core': ^1.7.1
+ '@emnapi/runtime': ^1.7.1
'@next/env@15.5.18':
resolution: {integrity: sha512-hAV85Ckd9QR6RvH04MEKwsfLTksvFpO47j9xwtoIuvuPnlwecpSi+uZTtm8HirVbtlI2Fnz//xpcSTjFdyJk+g==}
@@ -763,22 +714,10 @@ packages:
cpu: [x64]
os: [win32]
- '@noble/ciphers@1.3.0':
- resolution: {integrity: sha512-2I0gnIVPtfnMw9ee9h1dJG7tp81+8Ob3OJb3Mv37rx5L40/b0i7djjCVvGOVqc9AEIQyvyu1i6ypKdFw8R8gQw==}
- engines: {node: ^14.21.3 || >=16}
-
'@noble/ciphers@2.1.1':
resolution: {integrity: sha512-bysYuiVfhxNJuldNXlFEitTVdNnYUc+XNJZd7Qm2a5j1vZHgY+fazadNFWFaMK/2vye0JVlxV3gHmC0WDfAOQw==}
engines: {node: '>= 20.19.0'}
- '@noble/curves@1.9.7':
- resolution: {integrity: sha512-gbKGcRUYIjA3/zCCNaWDciTMFI0dCkvou3TL8Zmy5Nc7sJ47a0jtOeZoTaMxkuqRo9cRhjOdZJXegxYE5FN/xw==}
- engines: {node: ^14.21.3 || >=16}
-
- '@noble/hashes@1.8.0':
- resolution: {integrity: sha512-jCs9ldd7NwzpgXDIf6P3+NrHh9/sD6CQdxHyjQI+h/6rDNo88ypBxxz45UDuZHz9r3tNz7N/VInSVoVdtXEI4A==}
- engines: {node: ^14.21.3 || >=16}
-
'@noble/hashes@2.0.1':
resolution: {integrity: sha512-XlOlEbQcE9fmuXxrVTXCTlG2nlRXa9Rj3rr5Ue/+tX+nmkgbX720YHh0VR3hBF9xDvwnb8D2shVGOwNx+ulArw==}
engines: {node: '>= 20.19.0'}
@@ -795,14 +734,24 @@ packages:
resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==}
engines: {node: '>= 8'}
- '@open-draft/deferred-promise@2.2.0':
- resolution: {integrity: sha512-CecwLWx3rhxVQF6V4bAgPS5t+So2sTbPgAzafKkVizyi7tlwpcFpdFqq+wqF2OwNBmqFuu6tOyouTuxgpMfzmA==}
+ '@oozcitak/dom@2.0.2':
+ resolution: {integrity: sha512-GjpKhkSYC3Mj4+lfwEyI1dqnsKTgwGy48ytZEhm4A/xnH/8z9M3ZVXKr/YGQi3uCLs1AEBS+x5T2JPiueEDW8w==}
+ engines: {node: '>=20.0'}
- '@open-draft/logger@0.3.0':
- resolution: {integrity: sha512-X2g45fzhxH238HKO4xbSr7+wBS8Fvw6ixhTDuvLd5mqh6bJJCFAPwU9mPDxbcrRtfxv4u5IHCEH77BmxvXmmxQ==}
+ '@oozcitak/infra@2.0.2':
+ resolution: {integrity: sha512-2g+E7hoE2dgCz/APPOEK5s3rMhJvNxSMBrP+U+j1OWsIbtSpWxxlUjq1lU8RIsFJNYv7NMlnVsCuHcUzJW+8vA==}
+ engines: {node: '>=20.0'}
- '@open-draft/until@2.1.0':
- resolution: {integrity: sha512-U69T3ItWHvLwGg5eJ0n3I62nWuE6ilHlmz7zM0npLBRvPRd7e6NYmg54vvRtP5mZG7kZqZCFVdsTWo7BPtBujg==}
+ '@oozcitak/url@3.0.0':
+ resolution: {integrity: sha512-ZKfET8Ak1wsLAiLWNfFkZc/BraDccuTJKR6svTYc7sVjbR+Iu0vtXdiDMY4o6jaFl5TW2TlS7jbLl4VovtAJWQ==}
+ engines: {node: '>=20.0'}
+
+ '@oozcitak/util@10.0.0':
+ resolution: {integrity: sha512-hAX0pT/73190NLqBPPWSdBVGtbY6VOhWYK3qqHqtXQ1gK7kS2yz4+ivsN07hpJ6I3aeMtKP6J6npsEKOAzuTLA==}
+ engines: {node: '>=20.0'}
+
+ '@oxc-project/types@0.139.0':
+ resolution: {integrity: sha512-r9gHphtCs+1M7J0pw6Sn/hh/Wpa/iQrOOkrNAlVLF/gHq+/CJmHIWKKUUhdWjcD6CIa8idarspCsASiXCXvFUw==}
'@peculiar/asn1-android@2.6.0':
resolution: {integrity: sha512-cBRCKtYPF7vJGN76/yG8VbxRcHLPF3HnkoHhKOZeHpoVtbMYfY9ROKtH3DtYUY9m8uI1Mh47PRhHf2hSK3xcSQ==}
@@ -844,909 +793,359 @@ packages:
'@polinetwork/backend@0.16.0':
resolution: {integrity: sha512-z/xuzvQv9w8frEtKAw59NvfFEllJnx2lw9YVUwTsP9TXh9tfPu5jP1njVUhFGQe15UE+IxwXH1hV4rO0/9/MLg==}
- '@radix-ui/number@1.1.1':
- resolution: {integrity: sha512-MkKCwxlXTgz6CFoJx3pCwn07GKp36+aZyu/u2Ln2VrA5DcdyCZkASEDBTd8x5whTQQL5CiYf4prXKLcgQdv29g==}
+ '@rolldown/binding-android-arm64@1.1.5':
+ resolution: {integrity: sha512-lZg8fqIv2v7FF237bwMgzGZEJvGL79/s5knJ/i6FmsGF4XXlzccZ4jb+TrFIxtSSxFtIpdsgrPZeMk1I9AFcyQ==}
+ engines: {node: ^20.19.0 || >=22.12.0}
+ cpu: [arm64]
+ os: [android]
- '@radix-ui/primitive@1.1.3':
- resolution: {integrity: sha512-JTF99U/6XIjCBo0wqkU5sK10glYe27MRRsfwoiq5zzOEZLHU3A3KCMa5X/azekYRCJ0HlwI0crAXS/5dEHTzDg==}
+ '@rolldown/binding-darwin-arm64@1.1.5':
+ resolution: {integrity: sha512-51Bnx9pNiMRKSUNtBfySkNJ9vMU9Hh3I1ozDd6gyPPYzaXCfnptUcEZxXGYFn+ul2dtcMUiqGR1Yai2K10uoTw==}
+ engines: {node: ^20.19.0 || >=22.12.0}
+ cpu: [arm64]
+ os: [darwin]
- '@radix-ui/react-accessible-icon@1.1.7':
- resolution: {integrity: sha512-XM+E4WXl0OqUJFovy6GjmxxFyx9opfCAIUku4dlKRd5YEPqt4kALOkQOp0Of6reHuUkJuiPBEc5k0o4z4lTC8A==}
- peerDependencies:
- '@types/react': '*'
- '@types/react-dom': '*'
- react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
- react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
- peerDependenciesMeta:
- '@types/react':
- optional: true
- '@types/react-dom':
- optional: true
+ '@rolldown/binding-darwin-x64@1.1.5':
+ resolution: {integrity: sha512-Tm+gbfC0aHu1tBA/JvKQh32S0K6YgCHkiAF4/W6xX0K0RmNuc94VeK419dJoE65R5aRxmo+noZQSWrAMF6yb6g==}
+ engines: {node: ^20.19.0 || >=22.12.0}
+ cpu: [x64]
+ os: [darwin]
- '@radix-ui/react-accordion@1.2.12':
- resolution: {integrity: sha512-T4nygeh9YE9dLRPhAHSeOZi7HBXo+0kYIPJXayZfvWOWA0+n3dESrZbjfDPUABkUNym6Hd+f2IR113To8D2GPA==}
- peerDependencies:
- '@types/react': '*'
- '@types/react-dom': '*'
- react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
- react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
- peerDependenciesMeta:
- '@types/react':
- optional: true
- '@types/react-dom':
- optional: true
+ '@rolldown/binding-freebsd-x64@1.1.5':
+ resolution: {integrity: sha512-JMzDKCCXq93YccG5gz3hvOs1oXRKAf0XYpfOS88e+wZrC8Iugj6j68867vrYZkvpDDpKn/KoKORThmchMpF6TA==}
+ engines: {node: ^20.19.0 || >=22.12.0}
+ cpu: [x64]
+ os: [freebsd]
+
+ '@rolldown/binding-linux-arm-gnueabihf@1.1.5':
+ resolution: {integrity: sha512-uML21j2K5TfPGutKxub+M+nLjZIrWjXQ5Grx4lCe/nimTj9B4L63zHpjXLl4y0L3mcm2htEQIb06oCG/szerNw==}
+ engines: {node: ^20.19.0 || >=22.12.0}
+ cpu: [arm]
+ os: [linux]
+
+ '@rolldown/binding-linux-arm64-gnu@1.1.5':
+ resolution: {integrity: sha512-navSiuTMogvnQoZoM/v+l3ZWo50/NTwSHSzheABx/RCnmUPaKwq9qSo4Br2OYRs21+Fz8uFqITZM3H4opOB0/Q==}
+ engines: {node: ^20.19.0 || >=22.12.0}
+ cpu: [arm64]
+ os: [linux]
+
+ '@rolldown/binding-linux-arm64-musl@1.1.5':
+ resolution: {integrity: sha512-lAryqH7IteztmCXQXk0etKj4wBQ7Gx5S6LjKhsgp9zb8I5bsuvU/2llH1hDQcjsFeqIsovMVN339/8pUDDBXxA==}
+ engines: {node: ^20.19.0 || >=22.12.0}
+ cpu: [arm64]
+ os: [linux]
+
+ '@rolldown/binding-linux-ppc64-gnu@1.1.5':
+ resolution: {integrity: sha512-fsK/sNBnxzBlL4O1JNrZakVQxPspqpED5dLtNsZS9oOKmtSpdNIzxH2kkol5HYTWJN47sE20ztMJPxfZ89qGOg==}
+ engines: {node: ^20.19.0 || >=22.12.0}
+ cpu: [ppc64]
+ os: [linux]
+
+ '@rolldown/binding-linux-s390x-gnu@1.1.5':
+ resolution: {integrity: sha512-gLYb4BIadlfTOYT5gO503n8zQjXflgzpD0FcyKh0Mzx3rqCZKnHoJWV9xe1KXUJ5lx2JfcSHr/mhzS0PC/McAA==}
+ engines: {node: ^20.19.0 || >=22.12.0}
+ cpu: [s390x]
+ os: [linux]
+
+ '@rolldown/binding-linux-x64-gnu@1.1.5':
+ resolution: {integrity: sha512-FjcpEKUyJygHgs1o50VYNvkt5+7Le/VEdYt0AkRpkL33MnyQfwr8l5mXwMmfmTbyMPr5vJLC+8/Gd9gXnwU1QQ==}
+ engines: {node: ^20.19.0 || >=22.12.0}
+ cpu: [x64]
+ os: [linux]
+
+ '@rolldown/binding-linux-x64-musl@1.1.5':
+ resolution: {integrity: sha512-Me+PfPI2TMeOQk0gYWfLQZtTktrmzbr8cDboqX83XKc7UrgAi55gF+2dUkWdxd19n55Essp2yeca+O9N5rBxHg==}
+ engines: {node: ^20.19.0 || >=22.12.0}
+ cpu: [x64]
+ os: [linux]
+
+ '@rolldown/binding-openharmony-arm64@1.1.5':
+ resolution: {integrity: sha512-yc5WrLzXks6zCQfn9Oxr8pORKyl/pF+QjHmW/Qx3qu0oyrrNC+y2JLTU1E2rcWYAmzlnqngWXHQjy51VzW70Vw==}
+ engines: {node: ^20.19.0 || >=22.12.0}
+ cpu: [arm64]
+ os: [openharmony]
+
+ '@rolldown/binding-wasm32-wasi@1.1.5':
+ resolution: {integrity: sha512-VbQGPX2b4r48TAMIM2cjgluIM1HYutm4pcTEJsle7iEP7sB1dFqtPLBVbdLAZCxy1txCcPxf4QFf4v8uvltPqA==}
+ engines: {node: ^20.19.0 || >=22.12.0}
+ cpu: [wasm32]
+
+ '@rolldown/binding-win32-arm64-msvc@1.1.5':
+ resolution: {integrity: sha512-gHv82k63z4qpV5+Q1y/12KrK0ltWBukVDI8nZcbT7Tt/ZlOIVwppazneq0F93oDxTo3IgAMEDIoQh3E2n6mVsw==}
+ engines: {node: ^20.19.0 || >=22.12.0}
+ cpu: [arm64]
+ os: [win32]
+
+ '@rolldown/binding-win32-x64-msvc@1.1.5':
+ resolution: {integrity: sha512-tTZuDBPw85tEN5PQi1pnEBzDy0Z49HtScLAbD5t6hyeU92A95pRWaSMw1GZZi/RwgSgUIl0xrSlXIT/9QzvYSA==}
+ engines: {node: ^20.19.0 || >=22.12.0}
+ cpu: [x64]
+ os: [win32]
+
+ '@rolldown/pluginutils@1.0.1':
+ resolution: {integrity: sha512-2j9bGt5Jh8hj+vPtgzPtl72j0yRxHAyumoo6TNfAjsLB04UtpSvPbPcDcBMxz7n+9CYB0c1GxQFxYRg2jimqGw==}
+
+ '@sec-ant/readable-stream@0.4.1':
+ resolution: {integrity: sha512-831qok9r2t8AlxLko40y2ebgSDhenenCatLVeW/uBtnHPyhHOvG0C7TvfgecV+wHzIm5KUICgzmVpWS+IMEAeg==}
+
+ '@simplewebauthn/browser@13.2.2':
+ resolution: {integrity: sha512-FNW1oLQpTJyqG5kkDg5ZsotvWgmBaC6jCHR7Ej0qUNep36Wl9tj2eZu7J5rP+uhXgHaLk+QQ3lqcw2vS5MX1IA==}
+
+ '@simplewebauthn/server@13.3.0':
+ resolution: {integrity: sha512-MLHYFrYG8/wK2i+86XMhiecK72nMaHKKt4bo+7Q1TbuG9iGjlSdfkPWKO5ZFE/BX+ygCJ7pr8H/AJeyAj1EaTQ==}
+ engines: {node: '>=20.0.0'}
+
+ '@sindresorhus/merge-streams@4.0.0':
+ resolution: {integrity: sha512-tlqY9xq5ukxTUZBmoOp+m61cqwQD5pHJtFY3Mn8CA8ps6yghLH/Hw8UPdqg4OLmFW3IFlcXnQNmo/dh8HzXYIQ==}
+ engines: {node: '>=18'}
+
+ '@standard-schema/spec@1.1.0':
+ resolution: {integrity: sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w==}
+
+ '@swc/helpers@0.5.15':
+ resolution: {integrity: sha512-JQ5TuMi45Owi4/BIMAJBoSQoOJu12oOk/gADqlcUL9JEdHB8vyjUSsxqeNXnmXHjYKMi2WcYtezGEEhqUI/E2g==}
+
+ '@tailwindcss/node@4.3.2':
+ resolution: {integrity: sha512-yWP/sqEcBLaD8JuA6zNwxoYKr75qxTioYwlRwekj5Jr/I5GXnoJfjetH/psLUIv74cYTH2lBUEzBkinthoYcBg==}
+
+ '@tailwindcss/oxide-android-arm64@4.3.2':
+ resolution: {integrity: sha512-WHxqIuHpvZ5VtdX6GTl1Ik/Vp2YuN42Et+0CdeaVd/frQ9jAvGmvR8vLT+jk3e8/Q3x8kECB9+R17pgpp2BulA==}
+ engines: {node: '>= 20'}
+ cpu: [arm64]
+ os: [android]
+
+ '@tailwindcss/oxide-darwin-arm64@4.3.2':
+ resolution: {integrity: sha512-GZypeUY/IDJW3877KeM+O67vbXr3MBnbtEL4aYhNErv/JWZhye2vGSWWG9tB6iiqR2MqRNkY8IOUy4NdSZV26w==}
+ engines: {node: '>= 20'}
+ cpu: [arm64]
+ os: [darwin]
+
+ '@tailwindcss/oxide-darwin-x64@4.3.2':
+ resolution: {integrity: sha512-UIIzmefR6KO1sDU7MzRqAxC8iBpft/VhkGjTjnhoS6k7Z3rQ9wEgA1ODSiyH/tcSYssulNm4Ci3hOeK1jH7ccQ==}
+ engines: {node: '>= 20'}
+ cpu: [x64]
+ os: [darwin]
+
+ '@tailwindcss/oxide-freebsd-x64@4.3.2':
+ resolution: {integrity: sha512-GN+uAmcI6DNspnCDwtOAZrTz6oukJnp337qZvxqCGLd3BHBzJpO0ZbTLRvJNdztOeAmTzewewGIMPb0tk2R4WA==}
+ engines: {node: '>= 20'}
+ cpu: [x64]
+ os: [freebsd]
+
+ '@tailwindcss/oxide-linux-arm-gnueabihf@4.3.2':
+ resolution: {integrity: sha512-4ABn7qSbdHRwTiDiuWNegCyb5+2FJ4vKIKc3DmKrvAFw7MU1Lm11dIkTPwUaFdTzc7IsOpDbqBrlh0x6y36U/w==}
+ engines: {node: '>= 20'}
+ cpu: [arm]
+ os: [linux]
+
+ '@tailwindcss/oxide-linux-arm64-gnu@4.3.2':
+ resolution: {integrity: sha512-wDgEIGwoM8w8pufh9LVt1PahDgNdKXrLC2qfAnV3vAmococ9RWbxeAw4pxPttd/TsJfwjyLf90Dg1y9y8I6Emw==}
+ engines: {node: '>= 20'}
+ cpu: [arm64]
+ os: [linux]
+
+ '@tailwindcss/oxide-linux-arm64-musl@4.3.2':
+ resolution: {integrity: sha512-J5Nuk0uZQIiMTJj3LEx4sAA9tMFUoXQZFv1J6An+QGYe53HKRJuFDi0rpq/tuouCZeAbOBY3kQ6g8qeD4TUjtA==}
+ engines: {node: '>= 20'}
+ cpu: [arm64]
+ os: [linux]
+
+ '@tailwindcss/oxide-linux-x64-gnu@4.3.2':
+ resolution: {integrity: sha512-kqCZpSKOBEJO4mz7OqWoofBZeXTAwaVGPj0ErAj7CojmhKpWVWVOnrt9dE8odoIraZq4oj3ausM37kXi+Tow8w==}
+ engines: {node: '>= 20'}
+ cpu: [x64]
+ os: [linux]
+
+ '@tailwindcss/oxide-linux-x64-musl@4.3.2':
+ resolution: {integrity: sha512-cixpqbh2toJDmkuCRI68nXA8ZxNmdK9Y+9v5h3MC3ZQKy/0BO8AWzlkWyRM7JAFSGBlfig4YVTPsK6MVgqz1uw==}
+ engines: {node: '>= 20'}
+ cpu: [x64]
+ os: [linux]
+
+ '@tailwindcss/oxide-wasm32-wasi@4.3.2':
+ resolution: {integrity: sha512-4ec2Z/LOmRsAgU23CS4xeJfcJlmRg94A/XrbGRCF1gyU/zdDfRLYDVsS+ynSZCmGNxQ1jQriQOKMQeQxBA3Isw==}
+ engines: {node: '>=14.0.0'}
+ cpu: [wasm32]
+ bundledDependencies:
+ - '@napi-rs/wasm-runtime'
+ - '@emnapi/core'
+ - '@emnapi/runtime'
+ - '@tybys/wasm-util'
+ - '@emnapi/wasi-threads'
+ - tslib
- '@radix-ui/react-alert-dialog@1.1.15':
- resolution: {integrity: sha512-oTVLkEw5GpdRe29BqJ0LSDFWI3qu0vR1M0mUkOQWDIUnY/QIkLpgDMWuKxP94c2NAC2LGcgVhG1ImF3jkZ5wXw==}
+ '@tailwindcss/oxide-win32-arm64-msvc@4.3.2':
+ resolution: {integrity: sha512-Zyr/M0+XcYZu3bZrUytc7TXvrk0ftWfl8gN2MwekNDzhqhKRUucMPSeOzM0o0wH5AWOU49BsKRrfKxI2atCPMQ==}
+ engines: {node: '>= 20'}
+ cpu: [arm64]
+ os: [win32]
+
+ '@tailwindcss/oxide-win32-x64-msvc@4.3.2':
+ resolution: {integrity: sha512-QI9BO7KlNZsp2GuO0jwAAj5jCDABOKXRkCk2XuKTSaNEFSdfzqswYVTtCHBNKHLsqyjFyFkqlDiwkNbTYSssMQ==}
+ engines: {node: '>= 20'}
+ cpu: [x64]
+ os: [win32]
+
+ '@tailwindcss/oxide@4.3.2':
+ resolution: {integrity: sha512-z8ZgnzX8gdNoWLBLqBPoh/sjnxkwvf9ZuWjnO0l0yIzbLa5/9S+eC5QxGZKRobVHIC3/1BoMWjHblqWjcgFgag==}
+ engines: {node: '>= 20'}
+
+ '@tailwindcss/vite@4.3.2':
+ resolution: {integrity: sha512-eHpMeX4JXfVNJDEcsouTeCBubJBTcTLigeaw/NTUW6PB5ATKKXdyonnXgTBX2VuRbjz1hjfz6C5XAhr52ImQXA==}
peerDependencies:
- '@types/react': '*'
- '@types/react-dom': '*'
- react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
- react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
- peerDependenciesMeta:
- '@types/react':
- optional: true
- '@types/react-dom':
- optional: true
+ vite: ^5.2.0 || ^6 || ^7 || ^8
- '@radix-ui/react-arrow@1.1.7':
- resolution: {integrity: sha512-F+M1tLhO+mlQaOWspE8Wstg+z6PwxwRd8oQ8IXceWz92kfAmalTRf0EjrouQeo7QssEPfCn05B4Ihs1K9WQ/7w==}
+ '@tanstack/history@1.162.0':
+ resolution: {integrity: sha512-79pf/RkhteYZTRgcR4F9kbk84P2N8rugQJswxfIqovlbRiT3yI7eBE+5QorIrZaOKktsgzRlXh1l/du/xpl4iA==}
+ engines: {node: '>=20.19'}
+
+ '@tanstack/react-router@1.170.17':
+ resolution: {integrity: sha512-ppLkjCfSMaeug9rmFRYzOd4TIqWV+yTE7tzIny7alJsSnM7w4lzEZm6eqCehG0SPetpZ0R3K+UnanSmBgOAVcQ==}
+ engines: {node: '>=20.19'}
peerDependencies:
- '@types/react': '*'
- '@types/react-dom': '*'
- react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
- react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
- peerDependenciesMeta:
- '@types/react':
- optional: true
- '@types/react-dom':
- optional: true
+ react: '>=18.0.0 || >=19.0.0'
+ react-dom: '>=18.0.0 || >=19.0.0'
- '@radix-ui/react-aspect-ratio@1.1.7':
- resolution: {integrity: sha512-Yq6lvO9HQyPwev1onK1daHCHqXVLzPhSVjmsNjCa2Zcxy2f7uJD2itDtxknv6FzAKCwD1qQkeVDmX/cev13n/g==}
+ '@tanstack/react-start-client@1.168.15':
+ resolution: {integrity: sha512-pW50PHvadgi50iNCw6deUOvqc9rzs30SstyFZY2tcS9z1XlqTlELSvGowjxdu2m0ymtqm1emj1jau1iP7+3+PQ==}
+ engines: {node: '>=22.12.0'}
peerDependencies:
- '@types/react': '*'
- '@types/react-dom': '*'
- react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
- react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
- peerDependenciesMeta:
- '@types/react':
- optional: true
- '@types/react-dom':
- optional: true
+ react: '>=18.0.0 || >=19.0.0'
+ react-dom: '>=18.0.0 || >=19.0.0'
- '@radix-ui/react-avatar@1.1.10':
- resolution: {integrity: sha512-V8piFfWapM5OmNCXTzVQY+E1rDa53zY+MQ4Y7356v4fFz6vqCyUtIz2rUD44ZEdwg78/jKmMJHj07+C/Z/rcog==}
+ '@tanstack/react-start-rsc@0.1.26':
+ resolution: {integrity: sha512-+FMm3qtT1gWsl0i5sG/Q70mh1k7tzZUsPBaqbg4v34zVJZ+XGn1mJb34x2w7z1M0/e7co6GkZfV8BRpczrs8UA==}
+ engines: {node: '>=22.12.0'}
peerDependencies:
- '@types/react': '*'
- '@types/react-dom': '*'
- react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
- react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ '@rspack/core': '>=2.0.0-0'
+ '@vitejs/plugin-rsc': '>=0.5.20'
+ react: '>=18.0.0 || >=19.0.0'
+ react-dom: '>=18.0.0 || >=19.0.0'
+ react-server-dom-rspack: '>=0.0.2'
peerDependenciesMeta:
- '@types/react':
+ '@rspack/core':
optional: true
- '@types/react-dom':
+ '@vitejs/plugin-rsc':
+ optional: true
+ react-server-dom-rspack:
optional: true
- '@radix-ui/react-checkbox@1.3.3':
- resolution: {integrity: sha512-wBbpv+NQftHDdG86Qc0pIyXk5IR3tM8Vd0nWLKDcX8nNn4nXFOFwsKuqw2okA/1D/mpaAkmuyndrPJTYDNZtFw==}
+ '@tanstack/react-start-server@1.167.21':
+ resolution: {integrity: sha512-puJ7eFxaLuDzeM/tiLDJaXCA4uK+PZnEOoIC73zipsFqx865MGzrRS/GSZxeVxjavC5iHU+ZwC+rgI0qYSol1A==}
+ engines: {node: '>=22.12.0'}
peerDependencies:
- '@types/react': '*'
- '@types/react-dom': '*'
- react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
- react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
- peerDependenciesMeta:
- '@types/react':
- optional: true
- '@types/react-dom':
- optional: true
+ react: '>=18.0.0 || >=19.0.0'
+ react-dom: '>=18.0.0 || >=19.0.0'
- '@radix-ui/react-collapsible@1.1.12':
- resolution: {integrity: sha512-Uu+mSh4agx2ib1uIGPP4/CKNULyajb3p92LsVXmH2EHVMTfZWpll88XJ0j4W0z3f8NK1eYl1+Mf/szHPmcHzyA==}
+ '@tanstack/react-start@1.168.27':
+ resolution: {integrity: sha512-rdGFDqfCW71gyofyAxaYxhelNKmeVjpmbpm0uFYbNHORCa///4aBxi7B7ecShibKv9O4GfJ66MPX5F0ozbm+ig==}
+ engines: {node: '>=22.12.0'}
peerDependencies:
- '@types/react': '*'
- '@types/react-dom': '*'
- react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
- react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ '@rsbuild/core': ^2.0.0
+ '@vitejs/plugin-rsc': '*'
+ react: '>=18.0.0 || >=19.0.0'
+ react-dom: '>=18.0.0 || >=19.0.0'
+ vite: '>=7.0.0'
peerDependenciesMeta:
- '@types/react':
+ '@rsbuild/core':
optional: true
- '@types/react-dom':
+ '@vitejs/plugin-rsc':
+ optional: true
+ vite:
optional: true
- '@radix-ui/react-collection@1.1.7':
- resolution: {integrity: sha512-Fh9rGN0MoI4ZFUNyfFVNU4y9LUz93u9/0K+yLgA2bwRojxM8JU1DyvvMBabnZPBgMWREAJvU2jjVzq+LrFUglw==}
+ '@tanstack/react-store@0.11.0':
+ resolution: {integrity: sha512-tX4YXh3PDkmpvGQWkWqKpzs/MSqbtuwY9dWdWhtV9Q50PmO+jOkUKIWIX4G85dwt7lxdHLXsiaEKPdKmC8F41w==}
peerDependencies:
- '@types/react': '*'
- '@types/react-dom': '*'
- react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
- react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
- peerDependenciesMeta:
- '@types/react':
- optional: true
- '@types/react-dom':
- optional: true
+ react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0
+ react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0
- '@radix-ui/react-compose-refs@1.1.1':
- resolution: {integrity: sha512-Y9VzoRDSJtgFMUCoiZBDVo084VQ5hfpXxVE+NgkdNsjiDBByiImMZKKhxMwCbdHvhlENG6a833CbFkOQvTricw==}
+ '@tanstack/react-store@0.9.3':
+ resolution: {integrity: sha512-y2iHd/N9OkoQbFJLUX1T9vbc2O9tjH0pQRgTcx1/Nz4IlwLvkgpuglXUx+mXt0g5ZDFrEeDnONPqkbfxXJKwRg==}
peerDependencies:
- '@types/react': '*'
- react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
- peerDependenciesMeta:
- '@types/react':
- optional: true
+ react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0
+ react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0
- '@radix-ui/react-compose-refs@1.1.2':
- resolution: {integrity: sha512-z4eqJvfiNnFMHIIvXP3CY57y2WJs5g2v3X0zm9mEJkrkNv4rDxu+sg9Jh8EkXyeqBkB7SOcboo9dMVqhyrACIg==}
+ '@tanstack/react-table@9.0.0-beta.38':
+ resolution: {integrity: sha512-FKBVI9SpHqj+Jf8bdxLUNajnfbl3iYt0bhUPAN93kHH2L/XxHF41JPQDKbpqQC40WejbfJEHj4RIUirf3OAmVA==}
+ engines: {node: '>=20'}
peerDependencies:
- '@types/react': '*'
- react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
- peerDependenciesMeta:
- '@types/react':
- optional: true
+ react: '>=18'
- '@radix-ui/react-context-menu@2.2.16':
- resolution: {integrity: sha512-O8morBEW+HsVG28gYDZPTrT9UUovQUlJue5YO836tiTJhuIWBm/zQHc7j388sHWtdH/xUZurK9olD2+pcqx5ww==}
+ '@tanstack/router-core@1.171.14':
+ resolution: {integrity: sha512-Mo3hwx0qB0cJsVYGDjG0+Ouf7VV74h/vsoDMGztdlyzDanp4gBA2s7IVvm6hFrmQM6GpD9F0Z7SqD7OldfLE7g==}
+ engines: {node: '>=20.19'}
+
+ '@tanstack/router-generator@1.167.18':
+ resolution: {integrity: sha512-kFvM4caRds9Q3EXg64bZubJ6rbDxyV0YDSBSGvOGzmKspQPdz5Xrh0uj5T1Ov8avUUg+c761u04VQAaEzSBXRw==}
+ engines: {node: '>=20.19'}
+
+ '@tanstack/router-plugin@1.168.19':
+ resolution: {integrity: sha512-aFglwLc+bbPTgZlkXn3PvOwpjJAfgUyPGSuql4MP3XrqTTh6WkBiy2RYb6oaG5h0s7EKwivEuq85K3Y4V0Mt1g==}
+ engines: {node: '>=20.19'}
peerDependencies:
- '@types/react': '*'
- '@types/react-dom': '*'
- react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
- react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ '@rsbuild/core': '>=1.0.2 || ^2.0.0'
+ '@tanstack/react-router': ^1.170.17
+ vite: '>=5.0.0 || >=6.0.0 || >=7.0.0 || >=8.0.0'
+ vite-plugin-solid: ^2.11.10 || ^3.0.0-0
+ webpack: '>=5.92.0'
peerDependenciesMeta:
- '@types/react':
+ '@rsbuild/core':
optional: true
- '@types/react-dom':
+ '@tanstack/react-router':
optional: true
-
- '@radix-ui/react-context@1.1.2':
- resolution: {integrity: sha512-jCi/QKUM2r1Ju5a3J64TH2A5SpKAgh0LpknyqdQ4m6DCV0xJ2HG1xARRwNGPQfi1SLdLWZ1OJz6F4OMBBNiGJA==}
- peerDependencies:
- '@types/react': '*'
- react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
- peerDependenciesMeta:
- '@types/react':
+ vite:
optional: true
-
- '@radix-ui/react-dialog@1.1.15':
- resolution: {integrity: sha512-TCglVRtzlffRNxRMEyR36DGBLJpeusFcgMVD9PZEzAKnUs1lKCgX5u9BmC2Yg+LL9MgZDugFFs1Vl+Jp4t/PGw==}
- peerDependencies:
- '@types/react': '*'
- '@types/react-dom': '*'
- react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
- react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
- peerDependenciesMeta:
- '@types/react':
+ vite-plugin-solid:
optional: true
- '@types/react-dom':
+ webpack:
optional: true
- '@radix-ui/react-direction@1.1.1':
- resolution: {integrity: sha512-1UEWRX6jnOA2y4H5WczZ44gOOjTEmlqv1uNW4GAJEO5+bauCBhv8snY65Iw5/VOS/ghKN9gr2KjnLKxrsvoMVw==}
- peerDependencies:
- '@types/react': '*'
- react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
- peerDependenciesMeta:
- '@types/react':
- optional: true
+ '@tanstack/router-utils@1.162.2':
+ resolution: {integrity: sha512-hTWqJtqIFFdvuCl8WXNyrodp2L9zo2G37xKRrcVmVRWpAB2h+U1LuRAfS4tsFTiWOIoE/B+WDVFB8JpoEdw6jQ==}
+ engines: {node: '>=20.19'}
+
+ '@tanstack/start-client-core@1.170.13':
+ resolution: {integrity: sha512-o37M3msIK5ec87kPrIYJWXb1XPnjIe5/jrkGLXiXpFuVL99z7mhoBCzftKtVPtzqI8EElnRE/VGFYT9BHNnWcw==}
+ engines: {node: '>=22.12.0'}
- '@radix-ui/react-dismissable-layer@1.1.11':
- resolution: {integrity: sha512-Nqcp+t5cTB8BinFkZgXiMJniQH0PsUt2k51FUhbdfeKvc4ACcG2uQniY/8+h1Yv6Kza4Q7lD7PQV0z0oicE0Mg==}
+ '@tanstack/start-fn-stubs@1.162.0':
+ resolution: {integrity: sha512-QWfUZ3Yo923tdQn38LyKMU8rcTw69zc+T4dAvgTWV4O56SqFRsGfS0lSWIMhJRwXIx/bvdi7nTUBDdZtTHtpTQ==}
+ engines: {node: '>=22.12.0'}
+
+ '@tanstack/start-plugin-core@1.171.19':
+ resolution: {integrity: sha512-+fpW3Z/2vPT8HDV1c5p2WC6/g2k/AV/ujdJVDcn/VFd+gXRtzSX1D/LfozlaDbhDoEsqOnAk/mGwjg60JkUA2Q==}
+ engines: {node: '>=22.12.0'}
peerDependencies:
- '@types/react': '*'
- '@types/react-dom': '*'
- react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
- react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ '@rsbuild/core': ^2.0.0
+ vite: '>=7.0.0'
peerDependenciesMeta:
- '@types/react':
+ '@rsbuild/core':
optional: true
- '@types/react-dom':
+ vite:
optional: true
- '@radix-ui/react-dropdown-menu@2.1.16':
- resolution: {integrity: sha512-1PLGQEynI/3OX/ftV54COn+3Sud/Mn8vALg2rWnBLnRaGtJDduNW/22XjlGgPdpcIbiQxjKtb7BkcjP00nqfJw==}
- peerDependencies:
- '@types/react': '*'
- '@types/react-dom': '*'
- react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
- react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
- peerDependenciesMeta:
- '@types/react':
- optional: true
- '@types/react-dom':
- optional: true
-
- '@radix-ui/react-focus-guards@1.1.3':
- resolution: {integrity: sha512-0rFg/Rj2Q62NCm62jZw0QX7a3sz6QCQU0LpZdNrJX8byRGaGVTqbrW9jAoIAHyMQqsNpeZ81YgSizOt5WXq0Pw==}
- peerDependencies:
- '@types/react': '*'
- react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
- peerDependenciesMeta:
- '@types/react':
- optional: true
-
- '@radix-ui/react-focus-scope@1.1.7':
- resolution: {integrity: sha512-t2ODlkXBQyn7jkl6TNaw/MtVEVvIGelJDCG41Okq/KwUsJBwQ4XVZsHAVUkK4mBv3ewiAS3PGuUWuY2BoK4ZUw==}
- peerDependencies:
- '@types/react': '*'
- '@types/react-dom': '*'
- react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
- react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
- peerDependenciesMeta:
- '@types/react':
- optional: true
- '@types/react-dom':
- optional: true
-
- '@radix-ui/react-form@0.1.8':
- resolution: {integrity: sha512-QM70k4Zwjttifr5a4sZFts9fn8FzHYvQ5PiB19O2HsYibaHSVt9fH9rzB0XZo/YcM+b7t/p7lYCT/F5eOeF5yQ==}
- peerDependencies:
- '@types/react': '*'
- '@types/react-dom': '*'
- react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
- react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
- peerDependenciesMeta:
- '@types/react':
- optional: true
- '@types/react-dom':
- optional: true
-
- '@radix-ui/react-hover-card@1.1.15':
- resolution: {integrity: sha512-qgTkjNT1CfKMoP0rcasmlH2r1DAiYicWsDsufxl940sT2wHNEWWv6FMWIQXWhVdmC1d/HYfbhQx60KYyAtKxjg==}
- peerDependencies:
- '@types/react': '*'
- '@types/react-dom': '*'
- react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
- react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
- peerDependenciesMeta:
- '@types/react':
- optional: true
- '@types/react-dom':
- optional: true
-
- '@radix-ui/react-id@1.1.0':
- resolution: {integrity: sha512-EJUrI8yYh7WOjNOqpoJaf1jlFIH2LvtgAl+YcFqNCa+4hj64ZXmPkAKOFs/ukjz3byN6bdb/AVUqHkI8/uWWMA==}
- peerDependencies:
- '@types/react': '*'
- react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
- peerDependenciesMeta:
- '@types/react':
- optional: true
-
- '@radix-ui/react-id@1.1.1':
- resolution: {integrity: sha512-kGkGegYIdQsOb4XjsfM97rXsiHaBwco+hFI66oO4s9LU+PLAC5oJ7khdOVFxkhsmlbpUqDAvXw11CluXP+jkHg==}
- peerDependencies:
- '@types/react': '*'
- react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
- peerDependenciesMeta:
- '@types/react':
- optional: true
-
- '@radix-ui/react-label@2.1.7':
- resolution: {integrity: sha512-YT1GqPSL8kJn20djelMX7/cTRp/Y9w5IZHvfxQTVHrOqa2yMl7i/UfMqKRU5V7mEyKTrUVgJXhNQPVCG8PBLoQ==}
- peerDependencies:
- '@types/react': '*'
- '@types/react-dom': '*'
- react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
- react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
- peerDependenciesMeta:
- '@types/react':
- optional: true
- '@types/react-dom':
- optional: true
-
- '@radix-ui/react-menu@2.1.16':
- resolution: {integrity: sha512-72F2T+PLlphrqLcAotYPp0uJMr5SjP5SL01wfEspJbru5Zs5vQaSHb4VB3ZMJPimgHHCHG7gMOeOB9H3Hdmtxg==}
- peerDependencies:
- '@types/react': '*'
- '@types/react-dom': '*'
- react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
- react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
- peerDependenciesMeta:
- '@types/react':
- optional: true
- '@types/react-dom':
- optional: true
-
- '@radix-ui/react-menubar@1.1.16':
- resolution: {integrity: sha512-EB1FktTz5xRRi2Er974AUQZWg2yVBb1yjip38/lgwtCVRd3a+maUoGHN/xs9Yv8SY8QwbSEb+YrxGadVWbEutA==}
- peerDependencies:
- '@types/react': '*'
- '@types/react-dom': '*'
- react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
- react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
- peerDependenciesMeta:
- '@types/react':
- optional: true
- '@types/react-dom':
- optional: true
-
- '@radix-ui/react-navigation-menu@1.2.14':
- resolution: {integrity: sha512-YB9mTFQvCOAQMHU+C/jVl96WmuWeltyUEpRJJky51huhds5W2FQr1J8D/16sQlf0ozxkPK8uF3niQMdUwZPv5w==}
- peerDependencies:
- '@types/react': '*'
- '@types/react-dom': '*'
- react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
- react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
- peerDependenciesMeta:
- '@types/react':
- optional: true
- '@types/react-dom':
- optional: true
-
- '@radix-ui/react-one-time-password-field@0.1.8':
- resolution: {integrity: sha512-ycS4rbwURavDPVjCb5iS3aG4lURFDILi6sKI/WITUMZ13gMmn/xGjpLoqBAalhJaDk8I3UbCM5GzKHrnzwHbvg==}
- peerDependencies:
- '@types/react': '*'
- '@types/react-dom': '*'
- react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
- react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
- peerDependenciesMeta:
- '@types/react':
- optional: true
- '@types/react-dom':
- optional: true
-
- '@radix-ui/react-password-toggle-field@0.1.3':
- resolution: {integrity: sha512-/UuCrDBWravcaMix4TdT+qlNdVwOM1Nck9kWx/vafXsdfj1ChfhOdfi3cy9SGBpWgTXwYCuboT/oYpJy3clqfw==}
- peerDependencies:
- '@types/react': '*'
- '@types/react-dom': '*'
- react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
- react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
- peerDependenciesMeta:
- '@types/react':
- optional: true
- '@types/react-dom':
- optional: true
-
- '@radix-ui/react-popover@1.1.15':
- resolution: {integrity: sha512-kr0X2+6Yy/vJzLYJUPCZEc8SfQcf+1COFoAqauJm74umQhta9M7lNJHP7QQS3vkvcGLQUbWpMzwrXYwrYztHKA==}
- peerDependencies:
- '@types/react': '*'
- '@types/react-dom': '*'
- react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
- react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
- peerDependenciesMeta:
- '@types/react':
- optional: true
- '@types/react-dom':
- optional: true
-
- '@radix-ui/react-popper@1.2.8':
- resolution: {integrity: sha512-0NJQ4LFFUuWkE7Oxf0htBKS6zLkkjBH+hM1uk7Ng705ReR8m/uelduy1DBo0PyBXPKVnBA6YBlU94MBGXrSBCw==}
- peerDependencies:
- '@types/react': '*'
- '@types/react-dom': '*'
- react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
- react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
- peerDependenciesMeta:
- '@types/react':
- optional: true
- '@types/react-dom':
- optional: true
-
- '@radix-ui/react-portal@1.1.9':
- resolution: {integrity: sha512-bpIxvq03if6UNwXZ+HTK71JLh4APvnXntDc6XOX8UVq4XQOVl7lwok0AvIl+b8zgCw3fSaVTZMpAPPagXbKmHQ==}
- peerDependencies:
- '@types/react': '*'
- '@types/react-dom': '*'
- react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
- react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
- peerDependenciesMeta:
- '@types/react':
- optional: true
- '@types/react-dom':
- optional: true
-
- '@radix-ui/react-presence@1.1.5':
- resolution: {integrity: sha512-/jfEwNDdQVBCNvjkGit4h6pMOzq8bHkopq458dPt2lMjx+eBQUohZNG9A7DtO/O5ukSbxuaNGXMjHicgwy6rQQ==}
- peerDependencies:
- '@types/react': '*'
- '@types/react-dom': '*'
- react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
- react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
- peerDependenciesMeta:
- '@types/react':
- optional: true
- '@types/react-dom':
- optional: true
-
- '@radix-ui/react-primitive@2.0.2':
- resolution: {integrity: sha512-Ec/0d38EIuvDF+GZjcMU/Ze6MxntVJYO/fRlCPhCaVUyPY9WTalHJw54tp9sXeJo3tlShWpy41vQRgLRGOuz+w==}
- peerDependencies:
- '@types/react': '*'
- '@types/react-dom': '*'
- react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
- react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
- peerDependenciesMeta:
- '@types/react':
- optional: true
- '@types/react-dom':
- optional: true
-
- '@radix-ui/react-primitive@2.1.3':
- resolution: {integrity: sha512-m9gTwRkhy2lvCPe6QJp4d3G1TYEUHn/FzJUtq9MjH46an1wJU+GdoGC5VLof8RX8Ft/DlpshApkhswDLZzHIcQ==}
- peerDependencies:
- '@types/react': '*'
- '@types/react-dom': '*'
- react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
- react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
- peerDependenciesMeta:
- '@types/react':
- optional: true
- '@types/react-dom':
- optional: true
-
- '@radix-ui/react-progress@1.1.7':
- resolution: {integrity: sha512-vPdg/tF6YC/ynuBIJlk1mm7Le0VgW6ub6J2UWnTQ7/D23KXcPI1qy+0vBkgKgd38RCMJavBXpB83HPNFMTb0Fg==}
- peerDependencies:
- '@types/react': '*'
- '@types/react-dom': '*'
- react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
- react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
- peerDependenciesMeta:
- '@types/react':
- optional: true
- '@types/react-dom':
- optional: true
-
- '@radix-ui/react-radio-group@1.3.8':
- resolution: {integrity: sha512-VBKYIYImA5zsxACdisNQ3BjCBfmbGH3kQlnFVqlWU4tXwjy7cGX8ta80BcrO+WJXIn5iBylEH3K6ZTlee//lgQ==}
- peerDependencies:
- '@types/react': '*'
- '@types/react-dom': '*'
- react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
- react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
- peerDependenciesMeta:
- '@types/react':
- optional: true
- '@types/react-dom':
- optional: true
-
- '@radix-ui/react-roving-focus@1.1.11':
- resolution: {integrity: sha512-7A6S9jSgm/S+7MdtNDSb+IU859vQqJ/QAtcYQcfFC6W8RS4IxIZDldLR0xqCFZ6DCyrQLjLPsxtTNch5jVA4lA==}
- peerDependencies:
- '@types/react': '*'
- '@types/react-dom': '*'
- react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
- react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
- peerDependenciesMeta:
- '@types/react':
- optional: true
- '@types/react-dom':
- optional: true
-
- '@radix-ui/react-scroll-area@1.2.10':
- resolution: {integrity: sha512-tAXIa1g3sM5CGpVT0uIbUx/U3Gs5N8T52IICuCtObaos1S8fzsrPXG5WObkQN3S6NVl6wKgPhAIiBGbWnvc97A==}
- peerDependencies:
- '@types/react': '*'
- '@types/react-dom': '*'
- react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
- react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
- peerDependenciesMeta:
- '@types/react':
- optional: true
- '@types/react-dom':
- optional: true
-
- '@radix-ui/react-select@2.2.6':
- resolution: {integrity: sha512-I30RydO+bnn2PQztvo25tswPH+wFBjehVGtmagkU78yMdwTwVf12wnAOF+AeP8S2N8xD+5UPbGhkUfPyvT+mwQ==}
- peerDependencies:
- '@types/react': '*'
- '@types/react-dom': '*'
- react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
- react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
- peerDependenciesMeta:
- '@types/react':
- optional: true
- '@types/react-dom':
- optional: true
-
- '@radix-ui/react-separator@1.1.7':
- resolution: {integrity: sha512-0HEb8R9E8A+jZjvmFCy/J4xhbXy3TV+9XSnGJ3KvTtjlIUy/YQ/p6UYZvi7YbeoeXdyU9+Y3scizK6hkY37baA==}
- peerDependencies:
- '@types/react': '*'
- '@types/react-dom': '*'
- react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
- react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
- peerDependenciesMeta:
- '@types/react':
- optional: true
- '@types/react-dom':
- optional: true
-
- '@radix-ui/react-slider@1.3.6':
- resolution: {integrity: sha512-JPYb1GuM1bxfjMRlNLE+BcmBC8onfCi60Blk7OBqi2MLTFdS+8401U4uFjnwkOr49BLmXxLC6JHkvAsx5OJvHw==}
- peerDependencies:
- '@types/react': '*'
- '@types/react-dom': '*'
- react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
- react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
- peerDependenciesMeta:
- '@types/react':
- optional: true
- '@types/react-dom':
- optional: true
-
- '@radix-ui/react-slot@1.1.2':
- resolution: {integrity: sha512-YAKxaiGsSQJ38VzKH86/BPRC4rh+b1Jpa+JneA5LRE7skmLPNAyeG8kPJj/oo4STLvlrs8vkf/iYyc3A5stYCQ==}
- peerDependencies:
- '@types/react': '*'
- react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
- peerDependenciesMeta:
- '@types/react':
- optional: true
-
- '@radix-ui/react-slot@1.2.3':
- resolution: {integrity: sha512-aeNmHnBxbi2St0au6VBVC7JXFlhLlOnvIIlePNniyUNAClzmtAUEY8/pBiK3iHjufOlwA+c20/8jngo7xcrg8A==}
- peerDependencies:
- '@types/react': '*'
- react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
- peerDependenciesMeta:
- '@types/react':
- optional: true
-
- '@radix-ui/react-switch@1.2.6':
- resolution: {integrity: sha512-bByzr1+ep1zk4VubeEVViV592vu2lHE2BZY5OnzehZqOOgogN80+mNtCqPkhn2gklJqOpxWgPoYTSnhBCqpOXQ==}
- peerDependencies:
- '@types/react': '*'
- '@types/react-dom': '*'
- react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
- react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
- peerDependenciesMeta:
- '@types/react':
- optional: true
- '@types/react-dom':
- optional: true
-
- '@radix-ui/react-tabs@1.1.13':
- resolution: {integrity: sha512-7xdcatg7/U+7+Udyoj2zodtI9H/IIopqo+YOIcZOq1nJwXWBZ9p8xiu5llXlekDbZkca79a/fozEYQXIA4sW6A==}
- peerDependencies:
- '@types/react': '*'
- '@types/react-dom': '*'
- react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
- react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
- peerDependenciesMeta:
- '@types/react':
- optional: true
- '@types/react-dom':
- optional: true
-
- '@radix-ui/react-toast@1.2.15':
- resolution: {integrity: sha512-3OSz3TacUWy4WtOXV38DggwxoqJK4+eDkNMl5Z/MJZaoUPaP4/9lf81xXMe1I2ReTAptverZUpbPY4wWwWyL5g==}
- peerDependencies:
- '@types/react': '*'
- '@types/react-dom': '*'
- react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
- react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
- peerDependenciesMeta:
- '@types/react':
- optional: true
- '@types/react-dom':
- optional: true
-
- '@radix-ui/react-toggle-group@1.1.11':
- resolution: {integrity: sha512-5umnS0T8JQzQT6HbPyO7Hh9dgd82NmS36DQr+X/YJ9ctFNCiiQd6IJAYYZ33LUwm8M+taCz5t2ui29fHZc4Y6Q==}
- peerDependencies:
- '@types/react': '*'
- '@types/react-dom': '*'
- react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
- react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
- peerDependenciesMeta:
- '@types/react':
- optional: true
- '@types/react-dom':
- optional: true
-
- '@radix-ui/react-toggle@1.1.10':
- resolution: {integrity: sha512-lS1odchhFTeZv3xwHH31YPObmJn8gOg7Lq12inrr0+BH/l3Tsq32VfjqH1oh80ARM3mlkfMic15n0kg4sD1poQ==}
- peerDependencies:
- '@types/react': '*'
- '@types/react-dom': '*'
- react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
- react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
- peerDependenciesMeta:
- '@types/react':
- optional: true
- '@types/react-dom':
- optional: true
-
- '@radix-ui/react-toolbar@1.1.11':
- resolution: {integrity: sha512-4ol06/1bLoFu1nwUqzdD4Y5RZ9oDdKeiHIsntug54Hcr1pgaHiPqHFEaXI1IFP/EsOfROQZ8Mig9VTIRza6Tjg==}
- peerDependencies:
- '@types/react': '*'
- '@types/react-dom': '*'
- react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
- react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
- peerDependenciesMeta:
- '@types/react':
- optional: true
- '@types/react-dom':
- optional: true
-
- '@radix-ui/react-tooltip@1.2.8':
- resolution: {integrity: sha512-tY7sVt1yL9ozIxvmbtN5qtmH2krXcBCfjEiCgKGLqunJHvgvZG2Pcl2oQ3kbcZARb1BGEHdkLzcYGO8ynVlieg==}
- peerDependencies:
- '@types/react': '*'
- '@types/react-dom': '*'
- react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
- react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
- peerDependenciesMeta:
- '@types/react':
- optional: true
- '@types/react-dom':
- optional: true
-
- '@radix-ui/react-use-callback-ref@1.1.1':
- resolution: {integrity: sha512-FkBMwD+qbGQeMu1cOHnuGB6x4yzPjho8ap5WtbEJ26umhgqVXbhekKUQO+hZEL1vU92a3wHwdp0HAcqAUF5iDg==}
- peerDependencies:
- '@types/react': '*'
- react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
- peerDependenciesMeta:
- '@types/react':
- optional: true
-
- '@radix-ui/react-use-controllable-state@1.2.2':
- resolution: {integrity: sha512-BjasUjixPFdS+NKkypcyyN5Pmg83Olst0+c6vGov0diwTEo6mgdqVR6hxcEgFuh4QrAs7Rc+9KuGJ9TVCj0Zzg==}
- peerDependencies:
- '@types/react': '*'
- react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
- peerDependenciesMeta:
- '@types/react':
- optional: true
+ '@tanstack/start-server-core@1.169.16':
+ resolution: {integrity: sha512-lvAjQpH3nHJtd4xy0iHIaWbsTbyN9EBxuYCxbtXH0EpeBQPg+TCPhu9GQC9WbbA1rE//s82CpE55oYDQMqkU5A==}
+ engines: {node: '>=22.12.0'}
- '@radix-ui/react-use-effect-event@0.0.2':
- resolution: {integrity: sha512-Qp8WbZOBe+blgpuUT+lw2xheLP8q0oatc9UpmiemEICxGvFLYmHm9QowVZGHtJlGbS6A6yJ3iViad/2cVjnOiA==}
- peerDependencies:
- '@types/react': '*'
- react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
- peerDependenciesMeta:
- '@types/react':
- optional: true
+ '@tanstack/start-storage-context@1.167.16':
+ resolution: {integrity: sha512-zTegxlij4BC1DbCrC6rsVlMOQVMzOuG5IllacZEkrUdhiFwMIMYpk0VWGH+d0ucx5RBkmv8e8GNX3AOVBWclfg==}
+ engines: {node: '>=22.12.0'}
- '@radix-ui/react-use-escape-keydown@1.1.1':
- resolution: {integrity: sha512-Il0+boE7w/XebUHyBjroE+DbByORGR9KKmITzbR7MyQ4akpORYP/ZmbhAr0DG7RmmBqoOnZdy2QlvajJ2QA59g==}
- peerDependencies:
- '@types/react': '*'
- react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
- peerDependenciesMeta:
- '@types/react':
- optional: true
+ '@tanstack/store@0.11.0':
+ resolution: {integrity: sha512-WlzzCt3xi0G6pCAJu1U+2jiECwabETDpQDi3hfkFZvJii9AuZqEKbOiVarX1/bWhTNjU486yQtJCCasi/0q+Cw==}
- '@radix-ui/react-use-is-hydrated@0.1.0':
- resolution: {integrity: sha512-U+UORVEq+cTnRIaostJv9AGdV3G6Y+zbVd+12e18jQ5A3c0xL03IhnHuiU4UV69wolOQp5GfR58NW/EgdQhwOA==}
- peerDependencies:
- '@types/react': '*'
- react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
- peerDependenciesMeta:
- '@types/react':
- optional: true
+ '@tanstack/store@0.9.3':
+ resolution: {integrity: sha512-8reSzl/qGWGGVKhBoxXPMWzATSbZLZFWhwBAFO9NAyp0TxzfBP0mIrGb8CP8KrQTmvzXlR/vFPPUrHTLBGyFyw==}
- '@radix-ui/react-use-layout-effect@1.1.0':
- resolution: {integrity: sha512-+FPE0rOdziWSrH9athwI1R0HDVbWlEhd+FR+aSDk4uWGmSJ9Z54sdZVDQPZAinJhJXwfT+qnj969mCsT2gfm5w==}
- peerDependencies:
- '@types/react': '*'
- react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
- peerDependenciesMeta:
- '@types/react':
- optional: true
-
- '@radix-ui/react-use-layout-effect@1.1.1':
- resolution: {integrity: sha512-RbJRS4UWQFkzHTTwVymMTUv8EqYhOp8dOOviLj2ugtTiXRaRQS7GLGxZTLL1jWhMeoSCf5zmcZkqTl9IiYfXcQ==}
- peerDependencies:
- '@types/react': '*'
- react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
- peerDependenciesMeta:
- '@types/react':
- optional: true
-
- '@radix-ui/react-use-previous@1.1.1':
- resolution: {integrity: sha512-2dHfToCj/pzca2Ck724OZ5L0EVrr3eHRNsG/b3xQJLA2hZpVCS99bLAX+hm1IHXDEnzU6by5z/5MIY794/a8NQ==}
- peerDependencies:
- '@types/react': '*'
- react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
- peerDependenciesMeta:
- '@types/react':
- optional: true
-
- '@radix-ui/react-use-rect@1.1.1':
- resolution: {integrity: sha512-QTYuDesS0VtuHNNvMh+CjlKJ4LJickCMUAqjlE3+j8w+RlRpwyX3apEQKGFzbZGdo7XNG1tXa+bQqIE7HIXT2w==}
- peerDependencies:
- '@types/react': '*'
- react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
- peerDependenciesMeta:
- '@types/react':
- optional: true
-
- '@radix-ui/react-use-size@1.1.1':
- resolution: {integrity: sha512-ewrXRDTAqAXlkl6t/fkXWNAhFX9I+CkKlw6zjEwk86RSPKwZr3xpBRso655aqYafwtnbpHLj6toFzmd6xdVptQ==}
- peerDependencies:
- '@types/react': '*'
- react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
- peerDependenciesMeta:
- '@types/react':
- optional: true
-
- '@radix-ui/react-visually-hidden@1.2.3':
- resolution: {integrity: sha512-pzJq12tEaaIhqjbzpCuv/OypJY/BPavOofm+dbab+MHLajy277+1lLm6JFcGgF5eskJ6mquGirhXY2GD/8u8Ug==}
- peerDependencies:
- '@types/react': '*'
- '@types/react-dom': '*'
- react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
- react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
- peerDependenciesMeta:
- '@types/react':
- optional: true
- '@types/react-dom':
- optional: true
-
- '@radix-ui/rect@1.1.1':
- resolution: {integrity: sha512-HPwpGIzkl28mWyZqG52jiqDJ12waP11Pa1lGoiyUkIEuMLBP0oeK/C89esbXrxsky5we7dfd8U58nm0SgAWpVw==}
-
- '@sec-ant/readable-stream@0.4.1':
- resolution: {integrity: sha512-831qok9r2t8AlxLko40y2ebgSDhenenCatLVeW/uBtnHPyhHOvG0C7TvfgecV+wHzIm5KUICgzmVpWS+IMEAeg==}
-
- '@simplewebauthn/browser@13.2.2':
- resolution: {integrity: sha512-FNW1oLQpTJyqG5kkDg5ZsotvWgmBaC6jCHR7Ej0qUNep36Wl9tj2eZu7J5rP+uhXgHaLk+QQ3lqcw2vS5MX1IA==}
-
- '@simplewebauthn/server@13.3.0':
- resolution: {integrity: sha512-MLHYFrYG8/wK2i+86XMhiecK72nMaHKKt4bo+7Q1TbuG9iGjlSdfkPWKO5ZFE/BX+ygCJ7pr8H/AJeyAj1EaTQ==}
- engines: {node: '>=20.0.0'}
-
- '@sindresorhus/merge-streams@4.0.0':
- resolution: {integrity: sha512-tlqY9xq5ukxTUZBmoOp+m61cqwQD5pHJtFY3Mn8CA8ps6yghLH/Hw8UPdqg4OLmFW3IFlcXnQNmo/dh8HzXYIQ==}
- engines: {node: '>=18'}
-
- '@standard-schema/spec@1.1.0':
- resolution: {integrity: sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w==}
-
- '@swc/helpers@0.5.15':
- resolution: {integrity: sha512-JQ5TuMi45Owi4/BIMAJBoSQoOJu12oOk/gADqlcUL9JEdHB8vyjUSsxqeNXnmXHjYKMi2WcYtezGEEhqUI/E2g==}
-
- '@t3-oss/env-core@0.13.10':
- resolution: {integrity: sha512-NNFfdlJ+HmPHkLi2HKy7nwuat9SIYOxei9K10lO2YlcSObDILY7mHZNSHsieIM3A0/5OOzw/P/b+yLvPdaG52g==}
- peerDependencies:
- arktype: ^2.1.0
- typescript: '>=5.0.0'
- valibot: ^1.0.0-beta.7 || ^1.0.0
- zod: ^3.24.0 || ^4.0.0
- peerDependenciesMeta:
- arktype:
- optional: true
- typescript:
- optional: true
- valibot:
- optional: true
- zod:
- optional: true
-
- '@t3-oss/env-nextjs@0.13.10':
- resolution: {integrity: sha512-JfSA2WXOnvcc/uMdp31paMsfbYhhdvLLRxlwvrnlPE9bwM/n0Z+Qb9xRv48nPpvfMhOrkrTYw1I5Yc06WIKBJQ==}
- peerDependencies:
- arktype: ^2.1.0
- typescript: '>=5.0.0'
- valibot: ^1.0.0-beta.7 || ^1.0.0
- zod: ^3.24.0 || ^4.0.0
- peerDependenciesMeta:
- arktype:
- optional: true
- typescript:
- optional: true
- valibot:
- optional: true
- zod:
- optional: true
-
- '@tabby_ai/hijri-converter@1.0.5':
- resolution: {integrity: sha512-r5bClKrcIusDoo049dSL8CawnHR6mRdDwhlQuIgZRNty68q0x8k3Lf1BtPAMxRf/GgnHBnIO4ujd3+GQdLWzxQ==}
- engines: {node: '>=16.0.0'}
-
- '@tailwindcss/node@4.1.4':
- resolution: {integrity: sha512-MT5118zaiO6x6hNA04OWInuAiP1YISXql8Z+/Y8iisV5nuhM8VXlyhRuqc2PEviPszcXI66W44bCIk500Oolhw==}
-
- '@tailwindcss/oxide-android-arm64@4.1.4':
- resolution: {integrity: sha512-xMMAe/SaCN/vHfQYui3fqaBDEXMu22BVwQ33veLc8ep+DNy7CWN52L+TTG9y1K397w9nkzv+Mw+mZWISiqhmlA==}
- engines: {node: '>= 10'}
- cpu: [arm64]
- os: [android]
-
- '@tailwindcss/oxide-darwin-arm64@4.1.4':
- resolution: {integrity: sha512-JGRj0SYFuDuAGilWFBlshcexev2hOKfNkoX+0QTksKYq2zgF9VY/vVMq9m8IObYnLna0Xlg+ytCi2FN2rOL0Sg==}
- engines: {node: '>= 10'}
- cpu: [arm64]
- os: [darwin]
-
- '@tailwindcss/oxide-darwin-x64@4.1.4':
- resolution: {integrity: sha512-sdDeLNvs3cYeWsEJ4H1DvjOzaGios4QbBTNLVLVs0XQ0V95bffT3+scptzYGPMjm7xv4+qMhCDrkHwhnUySEzA==}
- engines: {node: '>= 10'}
- cpu: [x64]
- os: [darwin]
-
- '@tailwindcss/oxide-freebsd-x64@4.1.4':
- resolution: {integrity: sha512-VHxAqxqdghM83HslPhRsNhHo91McsxRJaEnShJOMu8mHmEj9Ig7ToHJtDukkuLWLzLboh2XSjq/0zO6wgvykNA==}
- engines: {node: '>= 10'}
- cpu: [x64]
- os: [freebsd]
-
- '@tailwindcss/oxide-linux-arm-gnueabihf@4.1.4':
- resolution: {integrity: sha512-OTU/m/eV4gQKxy9r5acuesqaymyeSCnsx1cFto/I1WhPmi5HDxX1nkzb8KYBiwkHIGg7CTfo/AcGzoXAJBxLfg==}
- engines: {node: '>= 10'}
- cpu: [arm]
- os: [linux]
-
- '@tailwindcss/oxide-linux-arm64-gnu@4.1.4':
- resolution: {integrity: sha512-hKlLNvbmUC6z5g/J4H+Zx7f7w15whSVImokLPmP6ff1QqTVE+TxUM9PGuNsjHvkvlHUtGTdDnOvGNSEUiXI1Ww==}
- engines: {node: '>= 10'}
- cpu: [arm64]
- os: [linux]
-
- '@tailwindcss/oxide-linux-arm64-musl@4.1.4':
- resolution: {integrity: sha512-X3As2xhtgPTY/m5edUtddmZ8rCruvBvtxYLMw9OsZdH01L2gS2icsHRwxdU0dMItNfVmrBezueXZCHxVeeb7Aw==}
- engines: {node: '>= 10'}
- cpu: [arm64]
- os: [linux]
-
- '@tailwindcss/oxide-linux-x64-gnu@4.1.4':
- resolution: {integrity: sha512-2VG4DqhGaDSmYIu6C4ua2vSLXnJsb/C9liej7TuSO04NK+JJJgJucDUgmX6sn7Gw3Cs5ZJ9ZLrnI0QRDOjLfNQ==}
- engines: {node: '>= 10'}
- cpu: [x64]
- os: [linux]
-
- '@tailwindcss/oxide-linux-x64-musl@4.1.4':
- resolution: {integrity: sha512-v+mxVgH2kmur/X5Mdrz9m7TsoVjbdYQT0b4Z+dr+I4RvreCNXyCFELZL/DO0M1RsidZTrm6O1eMnV6zlgEzTMQ==}
- engines: {node: '>= 10'}
- cpu: [x64]
- os: [linux]
-
- '@tailwindcss/oxide-wasm32-wasi@4.1.4':
- resolution: {integrity: sha512-2TLe9ir+9esCf6Wm+lLWTMbgklIjiF0pbmDnwmhR9MksVOq+e8aP3TSsXySnBDDvTTVd/vKu1aNttEGj3P6l8Q==}
- engines: {node: '>=14.0.0'}
- cpu: [wasm32]
- bundledDependencies:
- - '@napi-rs/wasm-runtime'
- - '@emnapi/core'
- - '@emnapi/runtime'
- - '@tybys/wasm-util'
- - '@emnapi/wasi-threads'
- - tslib
-
- '@tailwindcss/oxide-win32-arm64-msvc@4.1.4':
- resolution: {integrity: sha512-VlnhfilPlO0ltxW9/BgfLI5547PYzqBMPIzRrk4W7uupgCt8z6Trw/tAj6QUtF2om+1MH281Pg+HHUJoLesmng==}
- engines: {node: '>= 10'}
- cpu: [arm64]
- os: [win32]
-
- '@tailwindcss/oxide-win32-x64-msvc@4.1.4':
- resolution: {integrity: sha512-+7S63t5zhYjslUGb8NcgLpFXD+Kq1F/zt5Xv5qTv7HaFTG/DHyHD9GA6ieNAxhgyA4IcKa/zy7Xx4Oad2/wuhw==}
- engines: {node: '>= 10'}
- cpu: [x64]
- os: [win32]
-
- '@tailwindcss/oxide@4.1.4':
- resolution: {integrity: sha512-p5wOpXyOJx7mKh5MXh5oKk+kqcz8T+bA3z/5VWWeQwFrmuBItGwz8Y2CHk/sJ+dNb9B0nYFfn0rj/cKHZyjahQ==}
- engines: {node: '>= 10'}
-
- '@tailwindcss/postcss@4.1.4':
- resolution: {integrity: sha512-bjV6sqycCEa+AQSt2Kr7wpGF1bOZJ5wsqnLEkqSbM/JEHxx/yhMH8wHmdkPyApF9xhHeMSwnnkDUUMMM/hYnXw==}
-
- '@tanstack/query-core@5.90.19':
- resolution: {integrity: sha512-GLW5sjPVIvH491VV1ufddnfldyVB+teCnpPIvweEfkpRx7CfUmUGhoh9cdcUKBh/KwVxk22aNEDxeTsvmyB/WA==}
-
- '@tanstack/react-query@5.90.19':
- resolution: {integrity: sha512-qTZRZ4QyTzQc+M0IzrbKHxSeISUmRB3RPGmao5bT+sI6ayxSRhn0FXEnT5Hg3as8SBFcRosrXXRFB+yAcxVxJQ==}
- peerDependencies:
- react: ^18 || ^19
-
- '@tanstack/react-table@8.21.2':
- resolution: {integrity: sha512-11tNlEDTdIhMJba2RBH+ecJ9l1zgS2kjmexDPAraulc8jeNA4xocSNeyzextT0XJyASil4XsCYlJmf5jEWAtYg==}
- engines: {node: '>=12'}
- peerDependencies:
- react: '>=16.8'
- react-dom: '>=16.8'
+ '@tanstack/table-core@9.0.0-beta.38':
+ resolution: {integrity: sha512-Sr+jaFelc5CfkyYeVrPYYPL6PQJyP17p5WQHt+ip2vfKzxmhNLXD2mrI66wC8sNYfrhuWt6a5fMiSr4W3dXMDg==}
+ engines: {node: '>=20'}
- '@tanstack/table-core@8.21.2':
- resolution: {integrity: sha512-uvXk/U4cBiFMxt+p9/G7yUWI/UbHYbyghLCjlpWZ3mLeIZiUBSKcUnw9UnKkdRz7Z/N4UBuFLWQdJCjUe7HjvA==}
- engines: {node: '>=12'}
+ '@tanstack/virtual-file-routes@1.162.0':
+ resolution: {integrity: sha512-uhOeFyxLcU41HzvrxsGpiWdcMbScY1EDgbZ5K7DVRMYInbLYWAC0EA/kx9wXAoSM8q82bUG2hRl8+EAjE6XAbA==}
+ engines: {node: '>=20.19'}
'@trpc/client@11.5.1':
resolution: {integrity: sha512-7I6JJ1I1lxv3S87ht3FAIZi0XxQa7hnQ9K+Oo5BH7cGO8ZtWe9Ftq6ItdkuDfpsnsRPcR2h158AMWbNs/iptqg==}
@@ -1754,33 +1153,6 @@ packages:
'@trpc/server': 11.5.1
typescript: '>=5.7.2'
- '@trpc/next@11.5.1':
- resolution: {integrity: sha512-MWb7Jqa0XYx0z2he7Eq7HSILc2z9oDqUtsbWz+S6LWCemewRSRzmG8UuoiZm+ICEoRa452RmqeQH1EYiPCWTUg==}
- peerDependencies:
- '@tanstack/react-query': ^5.59.15
- '@trpc/client': 11.5.1
- '@trpc/react-query': 11.5.1
- '@trpc/server': 11.5.1
- next: '*'
- react: '>=16.8.0'
- react-dom: '>=16.8.0'
- typescript: '>=5.7.2'
- peerDependenciesMeta:
- '@tanstack/react-query':
- optional: true
- '@trpc/react-query':
- optional: true
-
- '@trpc/react-query@11.5.1':
- resolution: {integrity: sha512-Y+e0Lp7na1LAjoYqtHVjxpfayOuvvnuchS723b4dsI/V0h3irBuI+bx38S3m7RgaIh/L1av1SldFrKIauk+r/A==}
- peerDependencies:
- '@tanstack/react-query': ^5.80.3
- '@trpc/client': 11.5.1
- '@trpc/server': 11.5.1
- react: '>=18.2.0'
- react-dom: '>=18.2.0'
- typescript: '>=5.7.2'
-
'@trpc/server@11.5.1':
resolution: {integrity: sha512-KIDzHRS5m8U1ncPwjgtOtPWK9lNO0kYL7b+lnvKXRqowSAQIEC/z6y7g/dkt4Aqv3DKI/STLydt2/afrP1QrxQ==}
peerDependencies:
@@ -1789,25 +1161,19 @@ packages:
'@ts-morph/common@0.27.0':
resolution: {integrity: sha512-Wf29UqxWDpc+i61k3oIOzcUfQt79PIT9y/MWfAGlrkjg6lBC1hwDECLXPVJAhWjiGbfBCxZd65F/LIZF3+jeJQ==}
- '@types/node@20.17.19':
- resolution: {integrity: sha512-LEwC7o1ifqg/6r2gn9Dns0f1rhK+fPFDoMiceTJ6kWmVk6bgXBI/9IOWfVan4WiAavK9pIVWdX0/e3J+eEUh5A==}
+ '@tybys/wasm-util@0.10.3':
+ resolution: {integrity: sha512-F3fo1MYrRJYL3zER0OUOmkutjr1Vp23m7OsSgp7nq4SP6OqX6C/56XFIPAl5bt3zaBRjmW7SGz3u/6LwFpYcOg==}
- '@types/prismjs@1.26.5':
- resolution: {integrity: sha512-AUZTa7hQ2KY5L7AmtSiqxlhWxb4ina0yd8hNbl4TWuqnv/pFP0nDMb3YrfSBf4hJVGLh2YEIBfKaBW/9UEl6IQ==}
+ '@types/node@22.20.1':
+ resolution: {integrity: sha512-EANqOCF9QFyra+4pfxUcX9STKJpCLjMbObVzljIJomAWSnuSIEAvyzEU53GaajbXJEgdh0iEcPL+DGvpUd4k1Q==}
- '@types/prop-types@15.7.14':
- resolution: {integrity: sha512-gNMvNH49DJ7OJYv+KAKn0Xp45p8PLl6zo2YnvDIbTd4J6MER2BmWN49TG7n9LvkyihINxeKW8+3bfS2yDC9dzQ==}
-
- '@types/react-dom@18.3.5':
- resolution: {integrity: sha512-P4t6saawp+b/dFrUr2cvkVsfvPguwsxtH6dNIYRllMsefqFzkZk5UIjzyDOv5g1dXIPdG4Sp1yCR4Z6RCUsG/Q==}
+ '@types/react-dom@19.2.3':
+ resolution: {integrity: sha512-jp2L/eY6fn+KgVVQAOqYItbF0VY/YApe5Mz2F0aykSO8gx31bYCZyvSeYxCHKvzHG5eZjc+zyaS5BrBWya2+kQ==}
peerDependencies:
- '@types/react': ^18.0.0
-
- '@types/react@18.3.18':
- resolution: {integrity: sha512-t4yC+vtgnkYjNSKlFx1jkAhH8LgTo2N/7Qvi83kdEaUtMDiwpbLAktKDaAMlRcJ5eSxZkH74eEGt1ky31d7kfQ==}
+ '@types/react': ^19.2.0
- '@types/statuses@2.0.6':
- resolution: {integrity: sha512-xMAgYwceFhRA2zY+XbEA7mxYbA093wdiW8Vu6gZPGWy9cmOyU9XesH1tNcEWsKFd5Vzrqx5T3D38PWx1FIIXkA==}
+ '@types/react@19.2.17':
+ resolution: {integrity: sha512-MXfmqaVPEVgkBT/aY0aGCkRWWtByiYQXo3xdQ8r5RzuFrPiRn8Gar2tQdXSUQ2GKV3bkXckek89V8wQBY2Q/Aw==}
'@types/validate-npm-package-name@4.0.2':
resolution: {integrity: sha512-lrpDziQipxCEeK5kWxvljWYhUvOiB2A9izZd9B2AFarYAkqZshb4lPbRs7zKEic6eGtH8V/2qJW+dPp9OtF6bw==}
@@ -1818,13 +1184,30 @@ packages:
'@types/whatwg-url@13.0.0':
resolution: {integrity: sha512-N8WXpbE6Wgri7KUSvrmQcqrMllKZ9uxkYWMt+mCSGwNc0Hsw9VQTW7ApqI4XNrx6/SaM2QQJCzMPDEXE058s+Q==}
+ '@vitejs/plugin-react@6.0.3':
+ resolution: {integrity: sha512-vmFvco5/QuC2f9Oj+wTk0+9XeDFkHxSamwZKYc7MxYwKICfvUvlMhqKI0VuICPltGqh1neqBKDvO4kes1ya8vg==}
+ engines: {node: ^20.19.0 || >=22.12.0}
+ peerDependencies:
+ '@rolldown/plugin-babel': ^0.1.7 || ^0.2.0
+ babel-plugin-react-compiler: ^1.0.0
+ vite: ^8.0.0
+ peerDependenciesMeta:
+ '@rolldown/plugin-babel':
+ optional: true
+ babel-plugin-react-compiler:
+ optional: true
+
accepts@2.0.0:
resolution: {integrity: sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng==}
engines: {node: '>= 0.6'}
- agent-base@7.1.4:
- resolution: {integrity: sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==}
- engines: {node: '>= 14'}
+ ajv-formats@2.1.1:
+ resolution: {integrity: sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==}
+ peerDependencies:
+ ajv: ^8.0.0
+ peerDependenciesMeta:
+ ajv:
+ optional: true
ajv-formats@3.0.1:
resolution: {integrity: sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ==}
@@ -1834,8 +1217,12 @@ packages:
ajv:
optional: true
- ajv@8.18.0:
- resolution: {integrity: sha512-PlXPeEWMXMZ7sPYOHqmDyCJzcfNrUr3fGNKtezX14ykXOEIvyK81d+qydx89KY5O71FKMPaQ2vBfBFI5NHR63A==}
+ ajv@8.20.0:
+ resolution: {integrity: sha512-Thbli+OlOj+iMPYFBVBfJ3OmCAnaSyNn4M1vz9T6Gka5Jt9ba/HIR56joy65tY6kx/FCF5VXNB819Y7/GUrBGA==}
+
+ ansi-colors@4.1.3:
+ resolution: {integrity: sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==}
+ engines: {node: '>=6'}
ansi-regex@5.0.1:
resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==}
@@ -1845,17 +1232,13 @@ packages:
resolution: {integrity: sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==}
engines: {node: '>=12'}
- ansi-styles@4.3.0:
- resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==}
- engines: {node: '>=8'}
+ ansis@4.3.1:
+ resolution: {integrity: sha512-BJ8/l4R5LRE7hW9WdSuGYrLSHi2ynxeFpDFbH0K/CgNeY/tyhk+vO6TYxXC5r5CpUhNVX310xzPsN/H9lCdfOA==}
+ engines: {node: '>=14'}
argparse@2.0.1:
resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==}
- aria-hidden@1.2.4:
- resolution: {integrity: sha512-y+CcFFwelSXpLZk/7fMB2mUbGtX9lKycf1MWJ7CaTIERyitVlyQx6C+sxcROU2BAJ24OiZyK+8wj2i8AlBoS3A==}
- engines: {node: '>=10'}
-
asn1js@3.0.7:
resolution: {integrity: sha512-uLvq6KJu04qoQM6gvBfKFjlh6Gl0vOKQuR5cJMDHQkmwfMOQeN3F3SHCv9SNYSL+CRoHvOGFfllDlVz03GQjvQ==}
engines: {node: '>=12.0.0'}
@@ -1864,6 +1247,13 @@ packages:
resolution: {integrity: sha512-6t10qk83GOG8p0vKmaCr8eiilZwO171AvbROMtvvNiwrTly62t+7XkA8RdIIVbpMhCASAsxgAzdRSwh6nw/5Dg==}
engines: {node: '>=4'}
+ atomically@1.7.0:
+ resolution: {integrity: sha512-Xcz9l0z7y9yQ9rdDaxlmaI4uJHf/T8g9hOEzJcsEqX2SjCj4J20uK7+ldkDHMbpJDK76wF7xEIgxc/vSlsfw5w==}
+ engines: {node: '>=10.12.0'}
+
+ babel-dead-code-elimination@1.0.12:
+ resolution: {integrity: sha512-GERT7L2TiYcYDtYk1IpD+ASAYXjKbLTDPhBtYj7X1NuRMDTMtAx9kyBenub1Ev41lo91OHCKdmP+egTDmfQ7Ig==}
+
babel-plugin-react-compiler@1.0.0:
resolution: {integrity: sha512-Ixm8tFfoKKIPYdCCKYTsqv+Fd4IJ0DQqMyEimo+pxUOMUR9cVPlwTrFt9Avu+3cb6Zp3mAzl+t1MrG2fxxKsxw==}
@@ -1946,12 +1336,12 @@ packages:
zod:
optional: true
- body-parser@2.2.2:
- resolution: {integrity: sha512-oP5VkATKlNwcgvxi0vM0p/D3n2C3EReYVX+DNYs5TjZFn/oQt2j+4sVJtSMr18pdRr8wjTcBl6LoV+FUwzPmNA==}
+ body-parser@2.3.0:
+ resolution: {integrity: sha512-2cGmJupaNgg+QUwVLAucDuWuoMZ6EX9iHDRswZ5lsNYEmwPaRknMPCLZz07yTzVq/83p4o/wzbDZbBrTvGGTIw==}
engines: {node: '>=18'}
- brace-expansion@5.0.5:
- resolution: {integrity: sha512-VZznLgtwhn+Mact9tfiwx64fA9erHH/MCXEUfB/0bX/6Fz6ny5EGTXYltMocqg4xFAQZtnO3DHWWXi8RiuN7cQ==}
+ brace-expansion@5.0.7:
+ resolution: {integrity: sha512-7oFy703dxfY3/NLxC1fh2SUCQ0H9rmAY+5EpDVfXjUTTs+HEwR2nYaqLv+GWcTsumwxPfiz6CzCNkwXwBUwqCA==}
engines: {node: 18 || 20 || >=22}
braces@3.0.3:
@@ -1994,6 +1384,10 @@ packages:
resolution: {integrity: sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==}
engines: {node: ^12.17.0 || ^14.13 || >=16.0.0}
+ chokidar@5.0.0:
+ resolution: {integrity: sha512-TQMmc3w+5AxjpL8iIiwebF73dRDF4fBIieAqGn9RGCWaEVwQ6Fb2cGe31Yns0RRIzii5goJ1Y7xbMwo1TxMplw==}
+ engines: {node: '>= 20.19.0'}
+
class-variance-authority@0.7.1:
resolution: {integrity: sha512-Ka+9Trutv7G8M6WT6SeiRWz792K5qEqIGEGzXKhAE6xOWAY6pPH8U+9IY3oCMv6kqTmLsv7Xh/2w2RigkePMsg==}
@@ -2005,37 +1399,16 @@ packages:
resolution: {integrity: sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==}
engines: {node: '>=6'}
- cli-width@4.1.0:
- resolution: {integrity: sha512-ouuZd4/dm2Sw5Gmqy6bGyNNNe1qt9RpmxveLSO7KcgsTnU7RXfsw+/bukWGo1abgBiMAic068rclZsO4IWmmxQ==}
- engines: {node: '>= 12'}
-
client-only@0.0.1:
resolution: {integrity: sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==}
- cliui@8.0.1:
- resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==}
- engines: {node: '>=12'}
-
clsx@2.1.1:
resolution: {integrity: sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==}
engines: {node: '>=6'}
- cmdk@1.1.1:
- resolution: {integrity: sha512-Vsv7kFaXm+ptHDMZ7izaRsP70GgrW9NBNGswt9OZaVBLlE0SNpDq8eu/VGXyF9r7M0azK3Wy7OlYXsuyYLFzHg==}
- peerDependencies:
- react: ^18 || ^19 || ^19.0.0-rc
- react-dom: ^18 || ^19 || ^19.0.0-rc
-
code-block-writer@13.0.3:
resolution: {integrity: sha512-Oofo0pq3IKnsFtuHqSF7TqBfr71aeyZDVJ0HpmqB7FBM2qEigL0iPONSCZSO9pE9dZTAxANe5XHG9Uy0YMv8cg==}
- color-convert@2.0.1:
- resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==}
- engines: {node: '>=7.0.0'}
-
- color-name@1.1.4:
- resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==}
-
commander@11.1.0:
resolution: {integrity: sha512-yPVavfyCcRhmorC7rWlkHn15b4wDVgVmBA7kV4QVBsF7kv/9TKJAbAXVTxvTnwP8HHKjRCJDClKbciiYS7p0DQ==}
engines: {node: '>=16'}
@@ -2044,6 +1417,14 @@ packages:
resolution: {integrity: sha512-H+y0Jo/T1RZ9qPP4Eh1pkcQcLRglraJaSLoyOtHxu6AapkjWVCy2Sit1QQ4x3Dng8qDlSsZEet7g5Pq06MvTgw==}
engines: {node: '>=20'}
+ conf@10.2.0:
+ resolution: {integrity: sha512-8fLl9F04EJqjSqH+QjITQfJF8BrOVaYr1jewVgSRAEWePfxT0sku4w2hrGQ60BC/TNLGQ2pgxNlTbWQmMPFvXg==}
+ engines: {node: '>=12'}
+
+ consola@3.4.2:
+ resolution: {integrity: sha512-5IKcdX0nnYavi6G7TtOhwkYzyjfJlatbjMjuLSfE2kYT5pMDOilZ4OvMhi637CcDICTmz3wARPoyhqyX1Y+XvA==}
+ engines: {node: ^14.18.0 || >=16.10.0}
+
content-disposition@1.1.0:
resolution: {integrity: sha512-5jRCH9Z/+DRP7rkvY83B+yGIGX96OYdJmzngqnw2SBSxqCFPd0w2km3s5iawpGX8krnwSGmF0FW5Nhr0Hfai3g==}
engines: {node: '>=18'}
@@ -2052,9 +1433,16 @@ packages:
resolution: {integrity: sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==}
engines: {node: '>= 0.6'}
+ content-type@2.0.0:
+ resolution: {integrity: sha512-j/O/d7GcZCyNl7/hwZAb606rzqkyvaDctLmckbxLzHvFBzTJHuGEdodATcP3yIRoDrLHkIATJuvzbFlp/ki2cQ==}
+ engines: {node: '>=18'}
+
convert-source-map@2.0.0:
resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==}
+ cookie-es@3.1.1:
+ resolution: {integrity: sha512-UaXxwISYJPTr9hwQxMFYZ7kNhSXboMXP+Z3TRX6f1/NyaGPfuNUZOWP1pUEb75B2HjfklIYLVRfWiFZJyC6Npg==}
+
cookie-signature@1.2.2:
resolution: {integrity: sha512-D76uU73ulSXrD1UXF4KE2TMxVVwhsnCgfAyTg9k8P6KGZjlXKrOLe4dJQKI3Bxi5wjesZoFXJWElNWBjPZMbhg==}
engines: {node: '>=6.6.0'}
@@ -2063,10 +1451,6 @@ packages:
resolution: {integrity: sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==}
engines: {node: '>= 0.6'}
- cookie@1.1.1:
- resolution: {integrity: sha512-ei8Aos7ja0weRpFzJnEA9UHJ/7XQmqglbRwnf2ATjcB9Wq874VKH9kfjjirM6UhU2/E5fFYadylyhFldcqSidQ==}
- engines: {node: '>=18'}
-
copy-anything@3.0.5:
resolution: {integrity: sha512-yCEafptTtb4bk7GLEQoM8KVJpxAfdBJYaXyzQEgQQQgYrZiDp8SJmGKlYza6CYjEDNstAdNdKA3UuoULlEbS6w==}
engines: {node: '>=12.13'}
@@ -2075,8 +1459,8 @@ packages:
resolution: {integrity: sha512-tJtZBBHA6vjIAaF6EnIaq6laBBP9aq/Y3ouVJjEfoHbRBcHBAHYcMh/w8LDrk2PvIMMq8gmopa5D4V8RmbrxGw==}
engines: {node: '>= 0.10'}
- cosmiconfig@9.0.1:
- resolution: {integrity: sha512-hr4ihw+DBqcvrsEDioRO31Z17x71pUYoNe/4h6Z0wB72p7MU7/9gH8Q3s12NFhHPfYBBOV3qyfUxmr/Yn3shnQ==}
+ cosmiconfig@9.0.2:
+ resolution: {integrity: sha512-gtTZxTDau1wL7Y7zifc2dd8jHSK/k6BTx/2Xp/BpdlAdnlYWFVt7qhJqgwi7637yRwRQ3qL4ZidbB4I8tA5VOg==}
engines: {node: '>=14'}
peerDependencies:
typescript: '>=4.9.5'
@@ -2088,23 +1472,48 @@ packages:
resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==}
engines: {node: '>= 8'}
+ crossws@0.4.9:
+ resolution: {integrity: sha512-iWx+1OMSG2aOHpjyf9AESOzkwsVdS49cXM9dVrI2PDhxU5l2RIWE/KG56gk4BbAnsMoycvniJ9OnOxO9LRzHVA==}
+ peerDependencies:
+ srvx: '>=0.11.5'
+ peerDependenciesMeta:
+ srvx:
+ optional: true
+
cssesc@3.0.0:
resolution: {integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==}
engines: {node: '>=4'}
hasBin: true
- csstype@3.1.3:
- resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==}
-
- data-uri-to-buffer@4.0.1:
- resolution: {integrity: sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A==}
- engines: {node: '>= 12'}
+ csstype@3.2.3:
+ resolution: {integrity: sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==}
- date-fns-jalali@4.1.0-0:
- resolution: {integrity: sha512-hTIP/z+t+qKwBDcmmsnmjWTduxCg+5KfdqWQvb2X/8C9+knYY6epN/pfxdDuyVlSVeFz0sM5eEfwIUQ70U4ckg==}
+ db0@0.3.4:
+ resolution: {integrity: sha512-RiXXi4WaNzPTHEOu8UPQKMooIbqOEyqA1t7Z6MsdxSCeb8iUC9ko3LcmsLmeUt2SM5bctfArZKkRQggKZz7JNw==}
+ peerDependencies:
+ '@electric-sql/pglite': '*'
+ '@libsql/client': '*'
+ better-sqlite3: '*'
+ drizzle-orm: '*'
+ mysql2: '*'
+ sqlite3: '*'
+ peerDependenciesMeta:
+ '@electric-sql/pglite':
+ optional: true
+ '@libsql/client':
+ optional: true
+ better-sqlite3:
+ optional: true
+ drizzle-orm:
+ optional: true
+ mysql2:
+ optional: true
+ sqlite3:
+ optional: true
- date-fns@4.1.0:
- resolution: {integrity: sha512-Ukq0owbQXxa/U3EGtsdVBkR1w7KOQ5gIBqdH2hkvknzZPYvBxb/aa6E8L7tmjFtkwZBu3UXBbjIgPo/Ez4xaNg==}
+ debounce-fn@4.0.0:
+ resolution: {integrity: sha512-8pYCQiL9Xdcg0UPSD3d+0KMlOjp+KGU5EPwYddgzQ7DATsg4fuUDjQtsYLmWjnk2obnNHgV3vE2Y4jejSOJVBQ==}
+ engines: {node: '>=10'}
debug@4.4.3:
resolution: {integrity: sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==}
@@ -2135,6 +1544,10 @@ packages:
resolution: {integrity: sha512-H9LMLr5zwIbSxrmvikGuI/5KGhZ8E2zH3stkMgM5LpOWDutGM2JZaj460Udnf1a+946zc7YBgrqEWwbk7zHvGw==}
engines: {node: '>=18'}
+ define-lazy-prop@2.0.0:
+ resolution: {integrity: sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==}
+ engines: {node: '>=8'}
+
define-lazy-prop@3.0.0:
resolution: {integrity: sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==}
engines: {node: '>=12'}
@@ -2150,25 +1563,22 @@ packages:
resolution: {integrity: sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==}
engines: {node: '>=8'}
- detect-node-es@1.1.0:
- resolution: {integrity: sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ==}
-
diff@8.0.4:
resolution: {integrity: sha512-DPi0FmjiSU5EvQV0++GFDOJ9ASQUVFh5kD+OzOnYdi7n3Wpm9hWWGfB/O2blfHcMVTL5WkQXSnRiK9makhrcnw==}
engines: {node: '>=0.3.1'}
- dotenv@17.4.1:
- resolution: {integrity: sha512-k8DaKGP6r1G30Lx8V4+pCsLzKr8vLmV2paqEj1Y55GdAgJuIqpRp5FfajGF8KtwMxCz9qJc6wUIJnm053d/WCw==}
+ dot-prop@6.0.1:
+ resolution: {integrity: sha512-tE7ztYzXHIeyvc7N+hR3oi7FIbf/NIjVP9hmAt3yMXzrQ072/fpjGLx2GxNxGxUl5V73MEqYzioOMoVhGMJ5cA==}
+ engines: {node: '>=10'}
+
+ dotenv@17.4.2:
+ resolution: {integrity: sha512-nI4U3TottKAcAD9LLud4Cb7b2QztQMUEfHbvhTH09bqXTxnSie8WnjPALV/WMCrJZ6UV/qHJ6L03OqO3LcdYZw==}
engines: {node: '>=12'}
dunder-proto@1.0.1:
resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==}
engines: {node: '>= 0.4'}
- eciesjs@0.4.18:
- resolution: {integrity: sha512-wG99Zcfcys9fZux7Cft8BAX/YrOJLJSZ3jyYPfhZHqN2E+Ffx+QXBDsv3gubEgPtV6dTzJMSQUwk1H98/t/0wQ==}
- engines: {bun: '>=1', deno: '>=2', node: '>=16'}
-
ee-first@1.1.1:
resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==}
@@ -2178,21 +1588,40 @@ packages:
emoji-regex@10.6.0:
resolution: {integrity: sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A==}
- emoji-regex@8.0.0:
- resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==}
-
encodeurl@2.0.0:
resolution: {integrity: sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==}
engines: {node: '>= 0.8'}
- enhanced-resolve@5.18.1:
- resolution: {integrity: sha512-ZSW3ma5GkcQBIpwZTSRAI8N71Uuwgs93IezB7mf7R60tC8ZbJideoDNKjHn2O9KIlx6rkGTTEk1xUCK2E1Y2Yg==}
+ enhanced-resolve@5.21.6:
+ resolution: {integrity: sha512-aNnGCvbJ/RIyWo1IuhNdVjnNF+EjH9wpzpNHt+ci/m9He9LJvUN8wrCcXjp9cWsGNAuvSpVFTx/vraAFQ8qGjQ==}
engines: {node: '>=10.13.0'}
+ enquirer@2.4.1:
+ resolution: {integrity: sha512-rRqJg/6gd538VHvR3PSrdRBb/1Vy2YfzHqzvbhGIQpDRKIa4FgV/54b5Q1xYSxOOwKvjXweS26E0Q+nAMwp2pQ==}
+ engines: {node: '>=8.6'}
+
env-paths@2.2.1:
resolution: {integrity: sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==}
engines: {node: '>=6'}
+ env-runner@0.1.16:
+ resolution: {integrity: sha512-2LRJM4P2KLX6J83QZZrMqvgCDt/D5ea7wPcI3yYiy5cG/9rX5QwdwZFx0D7ktWnjdRyZxYjttGGorb5nFqb1CA==}
+ hasBin: true
+ peerDependencies:
+ '@netlify/runtime': ^4.1.23
+ '@vercel/queue': '>=0.2.0'
+ miniflare: ^4.20260515.0
+ wrangler: ^4.0.0
+ peerDependenciesMeta:
+ '@netlify/runtime':
+ optional: true
+ '@vercel/queue':
+ optional: true
+ miniflare:
+ optional: true
+ wrangler:
+ optional: true
+
error-ex@1.3.4:
resolution: {integrity: sha512-sqQamAnR14VgCr1A618A3sGrygcpK+HEbenA/HiEAkkUwcZIIB/tgWqHFxWgOyDh4nB4JCRimh79dR5Ywc9MDQ==}
@@ -2204,8 +1633,8 @@ packages:
resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==}
engines: {node: '>= 0.4'}
- es-object-atoms@1.1.1:
- resolution: {integrity: sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==}
+ es-object-atoms@1.1.2:
+ resolution: {integrity: sha512-HWcBoN6NileqtSydK2FqHbS/LoDd2pqrnQHLyJzBj4kOp/ky2MWMN694xOfkK8/SnUsW2DH7EfyVlydKCsm1Zw==}
engines: {node: '>= 0.4'}
escalade@3.2.0:
@@ -2224,8 +1653,8 @@ packages:
resolution: {integrity: sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==}
engines: {node: '>= 0.6'}
- eventsource-parser@3.0.6:
- resolution: {integrity: sha512-Vo1ab+QXPzZ4tCa8SwIHJFaSzy4R6SHf7BY79rFBDf0idraZWAkYrDjDj8uWaSm3S2TK+hJ7/t1CEmZ7jXw+pg==}
+ eventsource-parser@3.1.0:
+ resolution: {integrity: sha512-kJezFj9YFAMLeORyi7aCLxLbD5/qWMQnoMVlVPyHIll7lgRJCc3JVln9Vgl9nwQi0YkMnhdGTMNn7CkRRAptMg==}
engines: {node: '>=18.0.0'}
eventsource@3.0.7:
@@ -2240,8 +1669,8 @@ packages:
resolution: {integrity: sha512-9Be3ZoN4LmYR90tUoVu2te2BsbzHfhJyfEiAVfz7N5/zv+jduIfLrV2xdQXOHbaD6KgpGdO9PRPM1Y4Q9QkPkA==}
engines: {node: ^18.19.0 || >=20.5.0}
- express-rate-limit@8.3.2:
- resolution: {integrity: sha512-77VmFeJkO0/rvimEDuUC5H30oqUC4EyOhyGccfqoLebB0oiEYfM7nwPrsDsBL1gsTpwfzX8SFy2MT3TDyRq+bg==}
+ express-rate-limit@8.5.2:
+ resolution: {integrity: sha512-5Kb34ipNX694DH48vN9irak1Qx30nb0PLYHXfJgw4YEjiC3ZEmZJhwOp+VfiCYwFzvFTdB9QkArYS5kXa2cx2A==}
engines: {node: '>= 16'}
peerDependencies:
express: '>= 4.11'
@@ -2250,6 +1679,9 @@ packages:
resolution: {integrity: sha512-hIS4idWWai69NezIdRt2xFVofaF4j+6INOpJlVOLDO8zXGpUVEVzIYk12UUi2JzjEzWL3IOAxcTubgz9Po0yXw==}
engines: {node: '>= 18'}
+ exsolve@1.1.0:
+ resolution: {integrity: sha512-D+42+T12DdIlJM3uepa55qGiL3sYdLBOxIl2ifQCzCHz4c7eiolaHsi3BIqEr7JxBzxv2pYZQX9kw16ziMcEmw==}
+
fast-deep-equal@3.1.3:
resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==}
@@ -2257,8 +1689,8 @@ packages:
resolution: {integrity: sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==}
engines: {node: '>=8.6.0'}
- fast-uri@3.1.0:
- resolution: {integrity: sha512-iPeeDKJSWf4IEOasVVrknXpaBV0IApz/gp7S2bb7Z4Lljbl2MGJRqInZiUrQwV16cpzw/D3S5j5Julj/gT52AA==}
+ fast-uri@3.1.3:
+ resolution: {integrity: sha512-i70LwGWUduXqzicKXWshooq+sWL1K3WUU5rKZNG/0i3a1OSoX3HqhH5WbWwTmqWfor4urUakGPiRQcleRZTwOg==}
fastq@1.20.1:
resolution: {integrity: sha512-GGToxJ/w1x32s/D2EKND7kTil4n8OVk/9mycTc4VDza13lOvpUZTGX3mFSCtV9ksdGBVzvsyAVLM6mHFThxXxw==}
@@ -2272,9 +1704,8 @@ packages:
picomatch:
optional: true
- fetch-blob@3.2.0:
- resolution: {integrity: sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ==}
- engines: {node: ^12.20 || >= 14.13}
+ fetchdts@0.1.7:
+ resolution: {integrity: sha512-YoZjBdafyLIop9lSxXVI33oLD5kN31q4Td+CasofLLYeLXRFeOsuOw0Uo+XNRi9PZlbfdlN2GmRtm4tCEQ9/KA==}
figures@6.1.0:
resolution: {integrity: sha512-d+l3qxjSesT4V7v2fh+QnmFnUWv9lSpjarhShNTgBOfA0ttejbQUAlHLitbjkoRiDulW0OPoQPYIGhIC8ohejg==}
@@ -2288,9 +1719,9 @@ packages:
resolution: {integrity: sha512-S8KoZgRZN+a5rNwqTxlZZePjT/4cnm0ROV70LedRHZ0p8u9fRID0hJUZQpkKLzro8LfmC8sx23bY6tVNxv8pQA==}
engines: {node: '>= 18.0.0'}
- formdata-polyfill@4.0.10:
- resolution: {integrity: sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==}
- engines: {node: '>=12.20.0'}
+ find-up@3.0.0:
+ resolution: {integrity: sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==}
+ engines: {node: '>=6'}
forwarded@0.2.0:
resolution: {integrity: sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==}
@@ -2300,41 +1731,33 @@ packages:
resolution: {integrity: sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A==}
engines: {node: '>= 0.8'}
- fs-extra@11.3.4:
- resolution: {integrity: sha512-CTXd6rk/M3/ULNQj8FBqBWHYBVYybQ3VPBw0xGKFe3tuH7ytT6ACnvzpIQ3UZtB8yvUKC2cXn1a+x+5EVQLovA==}
+ fs-extra@11.3.6:
+ resolution: {integrity: sha512-w8ZNZr2mKIc7qeNaQ9AVPT1+iFaI+Avd4xudVOvdDJ8VytREi1Ft5Ih7hd9jjehod8vAM5GMsfQ/TpPf4EyoEA==}
engines: {node: '>=14.14'}
+ fsevents@2.3.3:
+ resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==}
+ engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0}
+ os: [darwin]
+
function-bind@1.1.2:
resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==}
fuzzysort@3.1.0:
resolution: {integrity: sha512-sR9BNCjBg6LNgwvxlBd0sBABvQitkLzoVY9MYYROQVX/FvfJ4Mai9LsGhDgd8qYdds0bY77VzYd5iuB+v5rwQQ==}
- geist@1.3.1:
- resolution: {integrity: sha512-Q4gC1pBVPN+D579pBaz0TRRnGA4p9UK6elDY/xizXdFk/g4EKR5g0I+4p/Kj6gM0SajDBZ/0FvDV9ey9ud7BWw==}
- peerDependencies:
- next: '>=13.2.0'
-
gensync@1.0.0-beta.2:
resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==}
engines: {node: '>=6.9.0'}
- get-caller-file@2.0.5:
- resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==}
- engines: {node: 6.* || 8.* || >= 10.*}
-
- get-east-asian-width@1.5.0:
- resolution: {integrity: sha512-CQ+bEO+Tva/qlmw24dCejulK5pMzVnUOFOijVogd3KQs07HnRIgp8TGipvCCRT06xeYEbpbgwaCxglFyiuIcmA==}
+ get-east-asian-width@1.6.0:
+ resolution: {integrity: sha512-QRbvDIbx6YklUe6RxeTeleMR0yv3cYH6PsPZHcnVn7xv7zO1BHN8r0XETu8n6Ye3Q+ahtSarc3WgtNWmehIBfA==}
engines: {node: '>=18'}
get-intrinsic@1.3.0:
resolution: {integrity: sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==}
engines: {node: '>= 0.4'}
- get-nonce@1.0.1:
- resolution: {integrity: sha512-FJhYRoDaiatfEkUK8HKlicmu/3SGFD51q3itKDGoSTysQJBnfOcxU5GxnhE1E6soB76MbT0MBtnKJuXyAx+96Q==}
- engines: {node: '>=6'}
-
get-own-enumerable-keys@1.0.0:
resolution: {integrity: sha512-PKsK2FSrQCyxcGHsGrLDcK0lx+0Ke+6e8KFFozA9/fIQLhQzPaRvJFdcz7+Axg3jUH/Mq+NI4xa5u/UT2tQskA==}
engines: {node: '>=14.16'}
@@ -2362,32 +1785,47 @@ packages:
graceful-fs@4.2.11:
resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==}
- graphql@16.13.2:
- resolution: {integrity: sha512-5bJ+nf/UCpAjHM8i06fl7eLyVC9iuNAjm9qzkiu2ZGhM0VscSvS6WDPfAwkdkBuoXGM9FJSbKl6wylMwP9Ktig==}
- engines: {node: ^12.22.0 || ^14.16.0 || ^16.0.0 || >=17.0.0}
+ h3@2.0.1-rc.20:
+ resolution: {integrity: sha512-28ljodXuUp0fZovdiSRq4G9OgrxCztrJe5VdYzXAB7ueRvI7pIUqLU14Xi3XqdYJ/khXjfpUOOD2EQa6CmBgsg==}
+ engines: {node: '>=20.11.1'}
+ hasBin: true
+ peerDependencies:
+ crossws: ^0.4.1
+ peerDependenciesMeta:
+ crossws:
+ optional: true
+
+ h3@2.0.1-rc.22:
+ resolution: {integrity: sha512-Esv0DMIuPkCTSWCA0vO73vcTqwzH1wjSrAO1TXNu/K3up1sZHa9EKMapbmxCDYBeymC3fVTk4qxp7ogQWQ+KgA==}
+ engines: {node: '>=20.11.1'}
+ hasBin: true
+ peerDependencies:
+ crossws: ^0.4.1
+ peerDependenciesMeta:
+ crossws:
+ optional: true
has-symbols@1.1.0:
resolution: {integrity: sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==}
engines: {node: '>= 0.4'}
- hasown@2.0.2:
- resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==}
+ hasown@2.0.4:
+ resolution: {integrity: sha512-T2UbfbBEF32wiepXIsMlTW9+dDYC6wMh/t/vYA4tuOMKqWz/n3vr1NFSxQiyP+zk2mXsoMA/i/7qV6LKut1t1A==}
engines: {node: '>= 0.4'}
- headers-polyfill@4.0.3:
- resolution: {integrity: sha512-IScLbePpkvO846sIwOtOTDjutRMWdXdJmXdMvk6gCBHxFO8d+QKOQedyZSxFTTFYRSmlgSTDtXqqq4pcenBXLQ==}
-
- hono@4.12.12:
- resolution: {integrity: sha512-p1JfQMKaceuCbpJKAPKVqyqviZdS0eUxH9v82oWo1kb9xjQ5wA6iP3FNVAPDFlz5/p7d45lO+BpSk1tuSZMF4Q==}
+ hono@4.12.29:
+ resolution: {integrity: sha512-1hNiRjawYrLq/4m3DQQjPGFg0VZkk4RjQJDff/excI6Dm9BiL75qxGrd7/c6YOxPdq6AscP3LiXhQ6fKFC1Waw==}
engines: {node: '>=16.9.0'}
+ hookable@6.1.1:
+ resolution: {integrity: sha512-U9LYDy1CwhMCnprUfeAZWZGByVbhd54hwepegYTK7Pi5NvqEj63ifz5z+xukznehT7i6NIZRu89Ay1AZmRsLEQ==}
+
http-errors@2.0.1:
resolution: {integrity: sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ==}
engines: {node: '>= 0.8'}
- https-proxy-agent@7.0.6:
- resolution: {integrity: sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==}
- engines: {node: '>= 14'}
+ httpxy@0.5.5:
+ resolution: {integrity: sha512-uDjmnPyp1q4Sgzf3w+J/Fc6UqcCEj0x4Wjp7OqK5dGhNeDgpyrAmnS6ey8QWrX3SWDon2DMKf9sBa5X9+CVyMA==}
human-signals@2.1.0:
resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==}
@@ -2397,8 +1835,8 @@ packages:
resolution: {integrity: sha512-eKCa6bwnJhvxj14kZk5NCPc6Hb6BdsU9DZcOnmQKSnO1VKrfV0zCvtttPZUsBvjmNDn8rpcJfpwSYnHBjc95MQ==}
engines: {node: '>=18.18.0'}
- iconv-lite@0.7.2:
- resolution: {integrity: sha512-im9DjEDQ55s9fL4EYzOAv0yMqmMBSZp6G0VvFyTMPKWxiSBHUj9NW/qqLmXUwXrrM7AvqSlTCfvqRb0cM8yYqw==}
+ iconv-lite@0.7.3:
+ resolution: {integrity: sha512-IKXpvIzjnC9XTAUbVBcMfGS0EPaIXtW6v+zr+RRp+hqULEpo0owZax6wyRwPOJbWbzjYspQwusTsfVr0ifh4uQ==}
engines: {node: '>=0.10.0'}
ignore@5.3.2:
@@ -2412,14 +1850,8 @@ packages:
inherits@2.0.4:
resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==}
- input-otp@1.4.2:
- resolution: {integrity: sha512-l3jWwYNvrEa6NTCt7BECfCm48GvwuZzkoeG3gBL2w4CHeOXW3eKFmf9UNYkNfYc3mxMrthMnxjIE07MT0zLBQA==}
- peerDependencies:
- react: ^16.8 || ^17.0 || ^18.0 || ^19.0.0 || ^19.0.0-rc
- react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0.0 || ^19.0.0-rc
-
- ip-address@10.1.0:
- resolution: {integrity: sha512-XXADHxXmvT9+CRxhXg56LJovE+bmWnEWB78LB83VZTprKTmaC5QfruXocxzTZ2Kl0DNwKuBdlIhjL8LeY8Sf8Q==}
+ ip-address@10.2.0:
+ resolution: {integrity: sha512-/+S6j4E9AHvW9SWMSEY9Xfy66O5PWvVEJ08O0y5JGyEKQpojb0K0GKpz/v5HJ/G0vi3D2sjGK78119oXZeE0qA==}
engines: {node: '>= 12'}
ipaddr.js@1.9.1:
@@ -2429,6 +1861,11 @@ packages:
is-arrayish@0.2.1:
resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==}
+ is-docker@2.2.1:
+ resolution: {integrity: sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==}
+ engines: {node: '>=8'}
+ hasBin: true
+
is-docker@3.0.0:
resolution: {integrity: sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==}
engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
@@ -2438,10 +1875,6 @@ packages:
resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==}
engines: {node: '>=0.10.0'}
- is-fullwidth-code-point@3.0.0:
- resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==}
- engines: {node: '>=8'}
-
is-glob@4.0.3:
resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==}
engines: {node: '>=0.10.0'}
@@ -2459,13 +1892,14 @@ packages:
resolution: {integrity: sha512-qP1vozQRI+BMOPcjFzrjXuQvdak2pHNUMZoeG2eRbiSqyvbEf/wQtEOTOX1guk6E3t36RkaqiSt8A/6YElNxLQ==}
engines: {node: '>=12'}
- is-node-process@1.2.0:
- resolution: {integrity: sha512-Vg4o6/fqPxIjtxgUH5QLJhwZ7gW5diGCVlXpuUfELC62CuxM1iHcRe51f2W1FDy04Ai4KJkagKjx3XaqyfRKXw==}
-
is-number@7.0.0:
resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==}
engines: {node: '>=0.12.0'}
+ is-obj@2.0.0:
+ resolution: {integrity: sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==}
+ engines: {node: '>=8'}
+
is-obj@3.0.0:
resolution: {integrity: sha512-IlsXEHOjtKhpN8r/tRFj2nDyTmHvcfNeu/nrRIcXE17ROeatXchkojffa1SpdqW4cr/Fj6QkEf/Gn4zf6KKvEQ==}
engines: {node: '>=12'}
@@ -2501,10 +1935,18 @@ packages:
resolution: {integrity: sha512-ZhMwEosbFJkA0YhFnNDgTM4ZxDRsS6HqTo7qsZM08fehyRYIYa0yHu5R6mgo1n/8MgaPBXiPimPD77baVFYg+A==}
engines: {node: '>=12.13'}
+ is-wsl@2.2.0:
+ resolution: {integrity: sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==}
+ engines: {node: '>=8'}
+
is-wsl@3.1.1:
resolution: {integrity: sha512-e6rvdUCiQCAuumZslxRJWR/Doq4VpPR82kqclvcS0efgt430SlGIk05vdCN58+VrzgtIcfNODjozVielycD4Sw==}
engines: {node: '>=16'}
+ isbot@5.2.0:
+ resolution: {integrity: sha512-gbZiGCb4B5xaoxg9mS7koAyRdvJnArk10VLSHOgz6rtBG93/pi1xOFaVvXMKZ7JXgyZ8zAbNRK5uIBdIUTFSqw==}
+ engines: {node: '>=18'}
+
isexe@2.0.0:
resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==}
@@ -2512,8 +1954,8 @@ packages:
resolution: {integrity: sha512-6B3tLtFqtQS4ekarvLVMZ+X+VlvQekbe4taUkf/rhVO3d/h0M2rfARm/pXLcPEsjjMsFgrFgSrhQIxcSVrBz8w==}
engines: {node: '>=18'}
- jiti@2.4.2:
- resolution: {integrity: sha512-rg9zJN+G4n2nfJl5MW3BMygZX56zKPNVEYYqq7adpmMh4Jn2QNEwhvQlFy6jPVdcod7txZtKHWnyZiA3a0zP7A==}
+ jiti@2.7.0:
+ resolution: {integrity: sha512-AC/7JofJvZGrrneWNaEnJeOLUx+JlGt7tNa0wZiRPT4MY1wmfKjt2+6O2p2uz2+skll8OZZmJMNqeke7kKbNgQ==}
hasBin: true
jose@6.1.3:
@@ -2537,6 +1979,9 @@ packages:
json-schema-traverse@1.0.0:
resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==}
+ json-schema-typed@7.0.3:
+ resolution: {integrity: sha512-7DE8mpG+/fVw+dTpjbxnx47TaMnDfOI1jwft9g1VybltZCduyRQPJPvc+zzKY9WPHxhPWczyFuYa6I8Mw4iU5A==}
+
json-schema-typed@8.0.2:
resolution: {integrity: sha512-fQhoXdcvc3V28x7C7BMs4P5+kNlgUURe2jmUT1T//oBRMDrqy1QPelJimwZGo7Hg9VPV3EQV5Bnq4hbFy2vetA==}
@@ -2545,8 +1990,8 @@ packages:
engines: {node: '>=6'}
hasBin: true
- jsonfile@6.2.0:
- resolution: {integrity: sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg==}
+ jsonfile@6.2.1:
+ resolution: {integrity: sha512-zwOTdL3rFQ/lRdBnntKVOX6k5cKJwEc1HdilT71BWEu7J41gXIB2MRp+vxduPSwZJPWBxEzv4yH1wYLJGUHX4Q==}
kleur@3.0.3:
resolution: {integrity: sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==}
@@ -2560,89 +2005,98 @@ packages:
resolution: {integrity: sha512-kWiueDWXhbCchgiotwXkwdxZE/6h56IHAeFWg4euUfW0YsmO9sxbAxzx1KLLv2lox15EfuuxHQvgJ1qIfZuHGw==}
engines: {node: '>=20.0.0'}
- lightningcss-darwin-arm64@1.29.2:
- resolution: {integrity: sha512-cK/eMabSViKn/PG8U/a7aCorpeKLMlK0bQeNHmdb7qUnBkNPnL+oV5DjJUo0kqWsJUapZsM4jCfYItbqBDvlcA==}
+ lightningcss-android-arm64@1.32.0:
+ resolution: {integrity: sha512-YK7/ClTt4kAK0vo6w3X+Pnm0D2cf2vPHbhOXdoNti1Ga0al1P4TBZhwjATvjNwLEBCnKvjJc2jQgHXH0NEwlAg==}
+ engines: {node: '>= 12.0.0'}
+ cpu: [arm64]
+ os: [android]
+
+ lightningcss-darwin-arm64@1.32.0:
+ resolution: {integrity: sha512-RzeG9Ju5bag2Bv1/lwlVJvBE3q6TtXskdZLLCyfg5pt+HLz9BqlICO7LZM7VHNTTn/5PRhHFBSjk5lc4cmscPQ==}
engines: {node: '>= 12.0.0'}
cpu: [arm64]
os: [darwin]
- lightningcss-darwin-x64@1.29.2:
- resolution: {integrity: sha512-j5qYxamyQw4kDXX5hnnCKMf3mLlHvG44f24Qyi2965/Ycz829MYqjrVg2H8BidybHBp9kom4D7DR5VqCKDXS0w==}
+ lightningcss-darwin-x64@1.32.0:
+ resolution: {integrity: sha512-U+QsBp2m/s2wqpUYT/6wnlagdZbtZdndSmut/NJqlCcMLTWp5muCrID+K5UJ6jqD2BFshejCYXniPDbNh73V8w==}
engines: {node: '>= 12.0.0'}
cpu: [x64]
os: [darwin]
- lightningcss-freebsd-x64@1.29.2:
- resolution: {integrity: sha512-wDk7M2tM78Ii8ek9YjnY8MjV5f5JN2qNVO+/0BAGZRvXKtQrBC4/cn4ssQIpKIPP44YXw6gFdpUF+Ps+RGsCwg==}
+ lightningcss-freebsd-x64@1.32.0:
+ resolution: {integrity: sha512-JCTigedEksZk3tHTTthnMdVfGf61Fky8Ji2E4YjUTEQX14xiy/lTzXnu1vwiZe3bYe0q+SpsSH/CTeDXK6WHig==}
engines: {node: '>= 12.0.0'}
cpu: [x64]
os: [freebsd]
- lightningcss-linux-arm-gnueabihf@1.29.2:
- resolution: {integrity: sha512-IRUrOrAF2Z+KExdExe3Rz7NSTuuJ2HvCGlMKoquK5pjvo2JY4Rybr+NrKnq0U0hZnx5AnGsuFHjGnNT14w26sg==}
+ lightningcss-linux-arm-gnueabihf@1.32.0:
+ resolution: {integrity: sha512-x6rnnpRa2GL0zQOkt6rts3YDPzduLpWvwAF6EMhXFVZXD4tPrBkEFqzGowzCsIWsPjqSK+tyNEODUBXeeVHSkw==}
engines: {node: '>= 12.0.0'}
cpu: [arm]
os: [linux]
- lightningcss-linux-arm64-gnu@1.29.2:
- resolution: {integrity: sha512-KKCpOlmhdjvUTX/mBuaKemp0oeDIBBLFiU5Fnqxh1/DZ4JPZi4evEH7TKoSBFOSOV3J7iEmmBaw/8dpiUvRKlQ==}
+ lightningcss-linux-arm64-gnu@1.32.0:
+ resolution: {integrity: sha512-0nnMyoyOLRJXfbMOilaSRcLH3Jw5z9HDNGfT/gwCPgaDjnx0i8w7vBzFLFR1f6CMLKF8gVbebmkUN3fa/kQJpQ==}
engines: {node: '>= 12.0.0'}
cpu: [arm64]
os: [linux]
- lightningcss-linux-arm64-musl@1.29.2:
- resolution: {integrity: sha512-Q64eM1bPlOOUgxFmoPUefqzY1yV3ctFPE6d/Vt7WzLW4rKTv7MyYNky+FWxRpLkNASTnKQUaiMJ87zNODIrrKQ==}
+ lightningcss-linux-arm64-musl@1.32.0:
+ resolution: {integrity: sha512-UpQkoenr4UJEzgVIYpI80lDFvRmPVg6oqboNHfoH4CQIfNA+HOrZ7Mo7KZP02dC6LjghPQJeBsvXhJod/wnIBg==}
engines: {node: '>= 12.0.0'}
cpu: [arm64]
os: [linux]
- lightningcss-linux-x64-gnu@1.29.2:
- resolution: {integrity: sha512-0v6idDCPG6epLXtBH/RPkHvYx74CVziHo6TMYga8O2EiQApnUPZsbR9nFNrg2cgBzk1AYqEd95TlrsL7nYABQg==}
+ lightningcss-linux-x64-gnu@1.32.0:
+ resolution: {integrity: sha512-V7Qr52IhZmdKPVr+Vtw8o+WLsQJYCTd8loIfpDaMRWGUZfBOYEJeyJIkqGIDMZPwPx24pUMfwSxxI8phr/MbOA==}
engines: {node: '>= 12.0.0'}
cpu: [x64]
os: [linux]
- lightningcss-linux-x64-musl@1.29.2:
- resolution: {integrity: sha512-rMpz2yawkgGT8RULc5S4WiZopVMOFWjiItBT7aSfDX4NQav6M44rhn5hjtkKzB+wMTRlLLqxkeYEtQ3dd9696w==}
+ lightningcss-linux-x64-musl@1.32.0:
+ resolution: {integrity: sha512-bYcLp+Vb0awsiXg/80uCRezCYHNg1/l3mt0gzHnWV9XP1W5sKa5/TCdGWaR/zBM2PeF/HbsQv/j2URNOiVuxWg==}
engines: {node: '>= 12.0.0'}
cpu: [x64]
os: [linux]
- lightningcss-win32-arm64-msvc@1.29.2:
- resolution: {integrity: sha512-nL7zRW6evGQqYVu/bKGK+zShyz8OVzsCotFgc7judbt6wnB2KbiKKJwBE4SGoDBQ1O94RjW4asrCjQL4i8Fhbw==}
+ lightningcss-win32-arm64-msvc@1.32.0:
+ resolution: {integrity: sha512-8SbC8BR40pS6baCM8sbtYDSwEVQd4JlFTOlaD3gWGHfThTcABnNDBda6eTZeqbofalIJhFx0qKzgHJmcPTnGdw==}
engines: {node: '>= 12.0.0'}
cpu: [arm64]
os: [win32]
- lightningcss-win32-x64-msvc@1.29.2:
- resolution: {integrity: sha512-EdIUW3B2vLuHmv7urfzMI/h2fmlnOQBk1xlsDxkN1tCWKjNFjfLhGxYk8C8mzpSfr+A6jFFIi8fU6LbQGsRWjA==}
+ lightningcss-win32-x64-msvc@1.32.0:
+ resolution: {integrity: sha512-Amq9B/SoZYdDi1kFrojnoqPLxYhQ4Wo5XiL8EVJrVsB8ARoC1PWW6VGtT0WKCemjy8aC+louJnjS7U18x3b06Q==}
engines: {node: '>= 12.0.0'}
cpu: [x64]
os: [win32]
- lightningcss@1.29.2:
- resolution: {integrity: sha512-6b6gd/RUXKaw5keVdSEtqFVdzWnU5jMxTUjA2bVcMNPLwSQ08Sv/UodBVtETLCn7k4S1Ibxwh7k68IwLZPgKaA==}
+ lightningcss@1.32.0:
+ resolution: {integrity: sha512-NXYBzinNrblfraPGyrbPoD19C1h9lfI/1mzgWYvXUTe414Gz/X1FD2XBZSZM7rRTrMA8JL3OtAaGifrIKhQ5yQ==}
engines: {node: '>= 12.0.0'}
lines-and-columns@1.2.4:
resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==}
+ locate-path@3.0.0:
+ resolution: {integrity: sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==}
+ engines: {node: '>=6'}
+
log-symbols@6.0.0:
resolution: {integrity: sha512-i24m8rpwhmPIS4zscNzK6MSEhk0DUWa/8iYQWxhffV8jkI4Phvs3F+quL5xvS0gdQR0FyTCMMH33Y78dDTzzIw==}
engines: {node: '>=18'}
- loose-envify@1.4.0:
- resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==}
- hasBin: true
-
lru-cache@5.1.1:
resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==}
- lucide-react@0.525.0:
- resolution: {integrity: sha512-Tm1txJ2OkymCGkvwoHt33Y2JpN5xucVq1slHcgE6Lk0WjDfjgKWor5CdVER8U6DvcfMwh4M8XxmpTiyzfmfDYQ==}
+ lucide-react@0.545.0:
+ resolution: {integrity: sha512-7r1/yUuflQDSt4f1bpn5ZAocyIxcTyVyBBChSVtBKn5M+392cPmI5YJMWOJKk/HUWGm5wg83chlAZtCcGbEZtw==}
peerDependencies:
react: ^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0
+ magic-string@0.30.21:
+ resolution: {integrity: sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==}
+
math-intrinsics@1.1.0:
resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==}
engines: {node: '>= 0.4'}
@@ -2681,6 +2135,10 @@ packages:
resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==}
engines: {node: '>=6'}
+ mimic-fn@3.1.0:
+ resolution: {integrity: sha512-Ysbi9uYW9hFyfrThdDEQuykN4Ey6BuwPD2kpI5ES/nFTDn/98yxYNLZJcgUAKPT/mcrLLKaGzJR9YVxJrIdASQ==}
+ engines: {node: '>=8'}
+
mimic-function@5.0.1:
resolution: {integrity: sha512-VP79XUPxV2CigYP3jWwAUFSku2aKqBH7uTAapFWCBqutsbmDo96KY5o8uh6U+/YSIn5OxJnXp73beVkpqMIGhA==}
engines: {node: '>=18'}
@@ -2726,30 +2184,11 @@ packages:
ms@2.1.3:
resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==}
- msw@2.13.2:
- resolution: {integrity: sha512-go2H1TIERKkC48pXiwec5l6sbNqYuvqOk3/vHGo1Zd+pq/H63oFawDQerH+WQdUw/flJFHDG7F+QdWMwhntA/A==}
- engines: {node: '>=18'}
- hasBin: true
- peerDependencies:
- typescript: '>= 4.8.x'
- peerDependenciesMeta:
- typescript:
- optional: true
-
- mute-stream@2.0.0:
- resolution: {integrity: sha512-WWdIxpyjEn+FhQJQQv9aQAYlHoNVdzIzUySNV1gHUPDSdZJ3yZn7pAAbQcV7B56Mvu881q9FZV+0Vx2xC44VWA==}
- engines: {node: ^18.17.0 || >=20.5.0}
-
nanoid@3.3.12:
resolution: {integrity: sha512-ZB9RH/39qpq5Vu6Y+NmUaFhQR6pp+M2Xt76XBnEwDaGcVAqhlvxrl3B2bKS5D3NH3QR76v3aSrKaF/Kiy7lEtQ==}
engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1}
hasBin: true
- nanoid@3.3.8:
- resolution: {integrity: sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w==}
- engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1}
- hasBin: true
-
nanostores@1.2.0:
resolution: {integrity: sha512-F0wCzbsH80G7XXo0Jd9/AVQC7ouWY6idUCTnMwW5t/Rv9W8qmO6endavDwg7TNp5GbugwSukFMVZqzPSrSMndg==}
engines: {node: ^20.0.0 || >=22.0.0}
@@ -2758,12 +2197,6 @@ packages:
resolution: {integrity: sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg==}
engines: {node: '>= 0.6'}
- next-themes@0.4.4:
- resolution: {integrity: sha512-LDQ2qIOJF0VnuVrrMSMLrWGjRMkq+0mpgl6e0juCLqdJ+oo8Q84JRWT6Wh11VDQKkMMe+dVzDKLWs5n87T+PkQ==}
- peerDependencies:
- react: ^16.8 || ^17 || ^18 || ^19 || ^19.0.0-rc
- react-dom: ^16.8 || ^17 || ^18 || ^19 || ^19.0.0-rc
-
next@15.5.18:
resolution: {integrity: sha512-eKL8zUJkX9Y5lE+RX/2YJoItVdGlIscyVyboeD9wSpp0PaGqjoA4tTpT2qPqz9ax+5IzGESyLSeZ/RCwbSZ2uQ==}
engines: {node: ^18.18.0 || ^19.8.0 || >= 20.0.0}
@@ -2785,14 +2218,39 @@ packages:
sass:
optional: true
- node-domexception@1.0.0:
- resolution: {integrity: sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==}
- engines: {node: '>=10.5.0'}
- deprecated: Use your platform's native DOMException instead
+ nf3@0.3.21:
+ resolution: {integrity: sha512-DJ1Ss/jfUdqETSbouezgAyh6NmD3r2NnpX7Vhwz7nPTc8TvqFddJ/tMgYDwhWU4H/vTOUXDYG3sWsB9vGBX/HA==}
- node-fetch@3.3.2:
- resolution: {integrity: sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA==}
- engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
+ nitro@3.0.260610-beta:
+ resolution: {integrity: sha512-KPb4L5yaF/Rx/xoGMpgHRJvZhbhGiqbRKOwwPLCH9jKTKTsEUHLjnJas85AeCzaswqa8Wi52eQBtRsODC4PS0Q==}
+ engines: {node: ^20.19.0 || >=22.12.0}
+ hasBin: true
+ peerDependencies:
+ '@vercel/queue': ^0.3.0
+ dotenv: '*'
+ giget: '*'
+ jiti: ^2.7.0
+ rollup: ^4.61.1
+ vite: ^7 || ^8
+ xml2js: ^0.6.2
+ zephyr-agent: ^0.2.0
+ peerDependenciesMeta:
+ '@vercel/queue':
+ optional: true
+ dotenv:
+ optional: true
+ giget:
+ optional: true
+ jiti:
+ optional: true
+ rollup:
+ optional: true
+ vite:
+ optional: true
+ xml2js:
+ optional: true
+ zephyr-agent:
+ optional: true
node-releases@2.0.37:
resolution: {integrity: sha512-1h5gKZCF+pO/o3Iqt5Jp7wc9rH3eJJ0+nh/CIoiRwjRxde/hAHyLPXYN4V3CqKAbiZPSeJFSWHmJsbkicta0Eg==}
@@ -2817,6 +2275,15 @@ packages:
resolution: {integrity: sha512-EFVjAYfzWqWsBMRHPMAXLCDIJnpMhdWAqR7xG6M6a2cs6PMFpl/+Z20w9zDW4vkxOFfddegBKq9Rehd0bxWE7A==}
engines: {node: '>= 10'}
+ ocache@0.1.5:
+ resolution: {integrity: sha512-kNNnkkVQup/QDvmTz8Q84wc2ntiyoVHDxa6eHWKt5qdGAmFRBIxy83rxgCYEjW0x06UJ9E3P6VgM2yY4rOBH4w==}
+
+ ofetch@2.0.0-alpha.3:
+ resolution: {integrity: sha512-zpYTCs2byOuft65vI3z43Dd6iSdFbOZZLb9/d21aCpx2rGastVU9dOCv0lu4ykc1Ur1anAYjDi3SUvR0vq50JA==}
+
+ ohash@2.0.11:
+ resolution: {integrity: sha512-RdR9FQrFwNBNXAr4GixM8YaRZRJ5PUWbKYbE5eOsrwAjJW0q2REGcf79oYPsLyskQCZG1PLN+S/K1V00joZAoQ==}
+
on-finished@2.4.1:
resolution: {integrity: sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==}
engines: {node: '>= 0.8'}
@@ -2836,12 +2303,25 @@ packages:
resolution: {integrity: sha512-smsWv2LzFjP03xmvFoJ331ss6h+jixfA4UUV/Bsiyuu4YJPfN+FIQGOIiv4w9/+MoHkfkJ22UIaQWRVFRfH6Vw==}
engines: {node: '>=20'}
+ open@8.4.2:
+ resolution: {integrity: sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==}
+ engines: {node: '>=12'}
+
ora@8.2.0:
resolution: {integrity: sha512-weP+BZ8MVNnlCm8c0Qdc1WSWq4Qn7I+9CJGm7Qali6g44e/PUzbjNqJX5NJ9ljlNMosfJvg1fKEGILklK9cwnw==}
engines: {node: '>=18'}
- outvariant@1.4.3:
- resolution: {integrity: sha512-+Sl2UErvtsoajRDKCE5/dBz4DIvHXQQnAxtQTF04OJxY0+DyZXSo5P5Bb7XYWOh81syohlYL24hbDwxedPUJCA==}
+ p-limit@2.3.0:
+ resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==}
+ engines: {node: '>=6'}
+
+ p-locate@3.0.0:
+ resolution: {integrity: sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==}
+ engines: {node: '>=6'}
+
+ p-try@2.2.0:
+ resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==}
+ engines: {node: '>=6'}
parent-module@1.0.1:
resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==}
@@ -2862,6 +2342,10 @@ packages:
path-browserify@1.0.1:
resolution: {integrity: sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==}
+ path-exists@3.0.0:
+ resolution: {integrity: sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==}
+ engines: {node: '>=4'}
+
path-key@3.1.1:
resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==}
engines: {node: '>=8'}
@@ -2870,12 +2354,12 @@ packages:
resolution: {integrity: sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==}
engines: {node: '>=12'}
- path-to-regexp@6.3.0:
- resolution: {integrity: sha512-Yhpw4T9C6hPpgPeA28us07OJeqZ5EzQTkbfwuhsUg0c237RomFoETJgmp2sa3F/41gfLE6G5cqcYwznmeEeOlQ==}
-
path-to-regexp@8.4.2:
resolution: {integrity: sha512-qRcuIdP69NPm4qbACK+aDogI5CBDMi1jKe0ry5rSQJz8JVLsC7jV8XpiJjGRLLol3N+R5ihGYcrPLTno6pAdBA==}
+ pathe@2.0.3:
+ resolution: {integrity: sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==}
+
picocolors@1.1.1:
resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==}
@@ -2887,43 +2371,43 @@ packages:
resolution: {integrity: sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==}
engines: {node: '>=12'}
+ picomatch@4.0.5:
+ resolution: {integrity: sha512-RvwwcruNjI1ncT5xRakeyS9Lf8lcItv34KD+aif+VH9kduAyfYBipGh12274xtenIPZ119/R9BdTBa8gAwSh0A==}
+ engines: {node: '>=12'}
+
pkce-challenge@5.0.1:
resolution: {integrity: sha512-wQ0b/W4Fr01qtpHlqSqspcj3EhBvimsdh0KlHhH8HRZnMsEa0ea2fTULOXOS9ccQr3om+GcGRk4e+isrZWV8qQ==}
engines: {node: '>=16.20.0'}
- postcss-selector-parser@7.1.1:
- resolution: {integrity: sha512-orRsuYpJVw8LdAwqqLykBj9ecS5/cRHlI5+nvTo8LcCKmzDmqVORXtOIYEEQuL9D4BxtA1lm5isAqzQZCoQ6Eg==}
+ pkg-up@3.1.0:
+ resolution: {integrity: sha512-nDywThFk1i4BQK4twPQ6TA4RT8bDY96yeuCVBWL3ePARCiEKDRSrNGbFIgUJpLp+XeIR65v8ra7WuJOFUBtkMA==}
+ engines: {node: '>=8'}
+
+ postcss-selector-parser@7.1.4:
+ resolution: {integrity: sha512-HeP7D2wyhkR+XaK6v4W8oRF62Dsz4flyuczALJp61GckGm42u1saSSJ/0auvcBqxs3jMRFEcPK34At/0JBKdOg==}
engines: {node: '>=4'}
postcss@8.4.31:
resolution: {integrity: sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==}
engines: {node: ^10 || ^12 || >=14}
- postcss@8.5.2:
- resolution: {integrity: sha512-MjOadfU3Ys9KYoX0AdkBlFEF1Vx37uCCeN4ZHnmwm9FfpbsGWMZeBLMmmpY+6Ocqod7mkdZ0DT31OlbsFrLlkA==}
- engines: {node: ^10 || ^12 || >=14}
-
- postcss@8.5.9:
- resolution: {integrity: sha512-7a70Nsot+EMX9fFU3064K/kdHWZqGVY+BADLyXc8Dfv+mTLLVl6JzJpPaCZ2kQL9gIJvKXSLMHhqdRRjwQeFtw==}
+ postcss@8.5.16:
+ resolution: {integrity: sha512-vuwillviilfKZsg0VGj5R/YwwcHx4SLsIOI/7K6mQkWx+l5cUHTjj5g0AasTBcyXsbfTgrwsUNmVUb5xVwyPwg==}
engines: {node: ^10 || ^12 || >=14}
- postgres@3.4.5:
- resolution: {integrity: sha512-cDWgoah1Gez9rN3H4165peY9qfpEo+SA61oQv65O3cRUE1pOEoJWwddwcqKE8XZYjbblOJlYDlLV4h67HrEVDg==}
- engines: {node: '>=12'}
-
powershell-utils@0.1.0:
resolution: {integrity: sha512-dM0jVuXJPsDN6DvRpea484tCUaMiXWjuCn++HGTqUWzGDjv5tZkEZldAJ/UMlqRYGFrD/etByo4/xOuC/snX2A==}
engines: {node: '>=20'}
+ prettier@3.9.5:
+ resolution: {integrity: sha512-/FVl766LpUfB5vXgCYOYa0MeV/441Ia99AeICQIQFTY/Nw0roZwULcXpku5i1/m5kt/baz+s4Zogspd839HSMg==}
+ engines: {node: '>=14'}
+ hasBin: true
+
pretty-ms@9.3.0:
resolution: {integrity: sha512-gjVS5hOP+M3wMm5nmNOucbIrqudzs9v/57bWRHQWLYklXqoXKrVfYW2W9+glfGsqtPgpiz5WwyEEB+ksXIx3gQ==}
engines: {node: '>=18'}
- prism-react-renderer@2.4.1:
- resolution: {integrity: sha512-ey8Ls/+Di31eqzUxC46h8MksNuGx/n0AAC8uKpwFau4RPDYLuE3EXTp8N8G2vX2N7UC/+IXeNUnlWBGGcAG+Ig==}
- peerDependencies:
- react: '>=16.0.0'
-
prompts@2.4.2:
resolution: {integrity: sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==}
engines: {node: '>= 6'}
@@ -2943,107 +2427,47 @@ packages:
resolution: {integrity: sha512-KTqnxsgGiQ6ZAzZCVlJH5eOjSnvlyEgx1m8bkRJfOhmGRqfo5KLvmAlACQkrjEtOQ4B7wF9TdSLIs9O90MX9xA==}
engines: {node: '>=16.0.0'}
- qs@6.15.1:
- resolution: {integrity: sha512-6YHEFRL9mfgcAvql/XhwTvf5jKcOiiupt2FiJxHkiX1z4j7WL8J/jRHYLluORvc1XxB5rV20KoeK00gVJamspg==}
+ qs@6.15.3:
+ resolution: {integrity: sha512-O9gl3zCl5h5blw1KGUzQKhA5oUXSl8rwUIM5o0S3nCXMliSvy5Dzx7/DJcI+SwgICv+IneSZwhBh1oSyEHA71A==}
engines: {node: '>=0.6'}
queue-microtask@1.2.3:
resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==}
- radix-ui@1.4.3:
- resolution: {integrity: sha512-aWizCQiyeAenIdUbqEpXgRA1ya65P13NKn/W8rWkcN0OPkRDxdBVLWnIEDsS2RpwCK2nobI7oMUSmexzTDyAmA==}
- peerDependencies:
- '@types/react': '*'
- '@types/react-dom': '*'
- react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
- react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
- peerDependenciesMeta:
- '@types/react':
- optional: true
- '@types/react-dom':
- optional: true
-
- range-parser@1.2.1:
- resolution: {integrity: sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==}
+ range-parser@1.3.0:
+ resolution: {integrity: sha512-hek2mFQpPuI4E1BBKrSto+BU3e3x4xuarsbiwr3+lf7p44juvFMV0XFWQAP3xUyqXA4RrXLIoaSUGbSt056ZMw==}
engines: {node: '>= 0.6'}
raw-body@3.0.2:
resolution: {integrity: sha512-K5zQjDllxWkf7Z5xJdV0/B0WTNqx6vxG70zJE4N0kBs4LovmEYWJzQGxC9bS9RAKu3bgM40lrd5zoLJ12MQ5BA==}
engines: {node: '>= 0.10'}
- react-day-picker@9.14.0:
- resolution: {integrity: sha512-tBaoDWjPwe0M5pGrum4H0SR6Lyk+BO9oHnp9JbKpGKW2mlraNPgP9BMfsg5pWpwrssARmeqk7YBl2oXutZTaHA==}
- engines: {node: '>=18'}
- peerDependencies:
- react: '>=16.8.0'
-
- react-dom@18.3.1:
- resolution: {integrity: sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==}
- peerDependencies:
- react: ^18.3.1
-
- react-error-boundary@6.1.0:
- resolution: {integrity: sha512-02k9WQ/mUhdbXir0tC1NiMesGzRPaCsJEWU/4bcFrbY1YMZOtHShtZP6zw0SJrBWA/31H0KT9/FgdL8+sPKgHA==}
- peerDependencies:
- react: ^18.0.0 || ^19.0.0
-
- react-hook-form@7.55.0:
- resolution: {integrity: sha512-XRnjsH3GVMQz1moZTW53MxfoWN7aDpUg/GpVNc4A3eXRVNdGXfbzJ4vM4aLQ8g6XCUh1nIbx70aaNCl7kxnjog==}
- engines: {node: '>=18.0.0'}
- peerDependencies:
- react: ^16.8.0 || ^17 || ^18 || ^19
-
- react-remove-scroll-bar@2.3.8:
- resolution: {integrity: sha512-9r+yi9+mgU33AKcj6IbT9oRCO78WriSj6t/cF8DWBZJ9aOGPOTEDvdUDz1FwKim7QXWwmHqtdHnRJfhAxEG46Q==}
- engines: {node: '>=10'}
- peerDependencies:
- '@types/react': '*'
- react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0
- peerDependenciesMeta:
- '@types/react':
- optional: true
-
- react-remove-scroll@2.6.3:
- resolution: {integrity: sha512-pnAi91oOk8g8ABQKGF5/M9qxmmOPxaAnopyTHYfqYEwJhyFrbbBtHuSgtKEoH0jpcxx5o3hXqH1mNd9/Oi+8iQ==}
- engines: {node: '>=10'}
- peerDependencies:
- '@types/react': '*'
- react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc
- peerDependenciesMeta:
- '@types/react':
- optional: true
-
- react-style-singleton@2.2.3:
- resolution: {integrity: sha512-b6jSvxvVnyptAiLjbkWLE/lOnR4lfTtDAl+eUC7RZy+QQWc6wRzIV2CE6xBuMmDxc2qIihtDCZD5NPOFl7fRBQ==}
- engines: {node: '>=10'}
+ react-dom@19.2.7:
+ resolution: {integrity: sha512-t0BRVXvbiE/o20Hfw669rLbMCDWtYZLvmJigy2f0MxsXF+71pxhR3xOkspmsO8h3ZlNzyibAmtCa3l4lYKk6gQ==}
peerDependencies:
- '@types/react': '*'
- react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc
- peerDependenciesMeta:
- '@types/react':
- optional: true
+ react: ^19.2.7
- react@18.3.1:
- resolution: {integrity: sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==}
+ react@19.2.7:
+ resolution: {integrity: sha512-HNe9WslTbXmFK8o8cmwgAeJFSBvt1bPdHCVKtaaV+WlAN36mpT4hcRpwbf3fY56ar2oIXzsBpOAiIRHAdY0OlQ==}
engines: {node: '>=0.10.0'}
- recast@0.23.11:
- resolution: {integrity: sha512-YTUo+Flmw4ZXiWfQKGcwwc11KnoRAYgzAE2E7mXKCjSviTKShtxBsN6YUUBB2gtaBzKzeKunxhUwNHQuRryhWA==}
+ readdirp@5.0.0:
+ resolution: {integrity: sha512-9u/XQ1pvrQtYyMpZe7DXKv2p5CNvyVwzUB6uhLAnQwHMSgKMBR62lc7AHljaeteeHXn11XTAaLLUVZYVZyuRBQ==}
+ engines: {node: '>= 20.19.0'}
+
+ recast@0.23.12:
+ resolution: {integrity: sha512-dEWRjcINDu/F4l2dYx57ugBtD7HV9KXESyxhzw/MqWLeglJrsjJKqACPyUPg+6AF8mIgm+Zi0dZ3ACoIg+QtpA==}
engines: {node: '>= 4'}
reflect-metadata@0.2.2:
resolution: {integrity: sha512-urBwgfrvVP/eAyXx4hluJivBKzuEbSQs9rKWCrCkbSxNv8mxPcUZKeuoF3Uy4mJl3Lwprp6yy5/39VWigZ4K6Q==}
- require-directory@2.1.1:
- resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==}
- engines: {node: '>=0.10.0'}
-
require-from-string@2.0.2:
resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==}
engines: {node: '>=0.10.0'}
- reselect@5.1.1:
- resolution: {integrity: sha512-K/BG6eIky/SBpzfHZv/dd+9JBFiS4SWV7FIujVyJRux6e45+73RaUHXLmIR1f7WOMaQ0U1km6qwklRQxpJJY0w==}
+ reselect@5.2.0:
+ resolution: {integrity: sha512-AgZ3UOZm3YndfrJ4OYjgrT7bmCm/1iqkjvEfH/oYjzh6PD2qw4QuT3jjnXIrpdt4MTpMXclMT3lXbmRY+XRakw==}
resolve-from@4.0.0:
resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==}
@@ -3053,16 +2477,21 @@ packages:
resolution: {integrity: sha512-oMA2dcrw6u0YfxJQXm342bFKX/E4sG9rbTzO9ptUcR/e8A33cHuvStiYOwH7fszkZlZ1z/ta9AAoPk2F4qIOHA==}
engines: {node: '>=18'}
- rettime@0.10.1:
- resolution: {integrity: sha512-uyDrIlUEH37cinabq0AX4QbgV4HbFZ/gqoiunWQ1UqBtRvTTytwhNYjE++pO/MjPTZL5KQCf2bEoJ/BJNVQ5Kw==}
-
reusify@1.1.0:
resolution: {integrity: sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==}
engines: {iojs: '>=1.0.0', node: '>=0.10.0'}
+ rolldown@1.1.5:
+ resolution: {integrity: sha512-t9z29cJjXf/vxQ8dyhCSpt6H6aSwHTk8cT5I3iy6SMXuFpk5mB6PL6XfC8PCwrPTx93udwKUm9HRteAlTGBLiA==}
+ engines: {node: ^20.19.0 || >=22.12.0}
+ hasBin: true
+
rou3@0.7.12:
resolution: {integrity: sha512-iFE4hLDuloSWcD7mjdCDhx2bKcIsYbtOTpfH5MHHLSKMOUyjqQXTeZVa289uuwEGEKFoE/BAPbhaU4B774nceg==}
+ rou3@0.8.1:
+ resolution: {integrity: sha512-ePa+XGk00/3HuCqrEnK3LxJW7I0SdNg6EFzKUJG73hMAdDcOUC/i/aSz7LSDwLrGr33kal/rqOGydzwl6U7zBA==}
+
router@2.2.0:
resolution: {integrity: sha512-nLTrUKm2UyiL7rlhapu/Zl45FwNgkZGaCpZbIHajDYgwlJCOzLSk+cIPAnsEqV955GjILJnKbdQC1nVPz+gAYQ==}
engines: {node: '>= 18'}
@@ -3077,8 +2506,8 @@ packages:
safer-buffer@2.1.2:
resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==}
- scheduler@0.23.2:
- resolution: {integrity: sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==}
+ scheduler@0.27.0:
+ resolution: {integrity: sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q==}
semver@6.3.1:
resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==}
@@ -3093,21 +2522,29 @@ packages:
resolution: {integrity: sha512-1gnZf7DFcoIcajTjTwjwuDjzuz4PPcY2StKPlsGAQ1+YH20IRVrBaXSWmdjowTJ6u8Rc01PoYOGHXfP1mYcZNQ==}
engines: {node: '>= 18'}
+ seroval-plugins@1.5.5:
+ resolution: {integrity: sha512-+BDhqYM6CEn3x09v44dpa9p6974FuUB2dxk+Ctn04k0cO1Zt6QODTXfmEZK0eBaTe/fJBvP4NMGuNJ+R8T+QMg==}
+ engines: {node: '>=10'}
+ peerDependencies:
+ seroval: ^1.0
+
+ seroval@1.5.5:
+ resolution: {integrity: sha512-bSjOuPcwPKLSJNhr9+bZxA20nQxVle5J5MNsYRVE6cIg7KpRLXGupymePavu0jrxlPiPsr4xGZSB8yUY2sH2sw==}
+ engines: {node: '>=10'}
+
serve-static@2.2.1:
resolution: {integrity: sha512-xRXBn0pPqQTVQiC8wyQrKs2MOlX24zQ0POGaj0kultvoOCstBQM5yvOhAVSUwOMjQtTvsPWoNCHfPGwaaQJhTw==}
engines: {node: '>= 18'}
- server-only@0.0.1:
- resolution: {integrity: sha512-qepMx2JxAa5jjfzxG79yPPq+8BuFToHd1hm7kI+Z4zAq1ftQiP7HcxMhDDItrbtwVeLg/cY2JnKnrcFkmiswNA==}
-
set-cookie-parser@3.0.1:
resolution: {integrity: sha512-n7Z7dXZhJbwuAHhNzkTti6Aw9QDDjZtm3JTpTGATIdNzdQz5GuFs22w90BcvF4INfnrL5xrX3oGsuqO5Dx3A1Q==}
setprototypeof@1.2.0:
resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==}
- shadcn@4.2.0:
- resolution: {integrity: sha512-ZDuV340itidaUd4Gi1BxQX+Y7Ush6BHp6URZBM2RyxUUBZ6yFtOWIr4nVY+Ro+YRSpo82v7JrsmtcU5xoBCMJQ==}
+ shadcn@4.13.0:
+ resolution: {integrity: sha512-5fuJ4jI/GcPeA/iTL4cJivCZuYQGXz/N3bIzyd+Gd/FM6xUCy2MxGG+LaDQuw2cjNy9zGPSFPTEmI048UwPTZA==}
+ engines: {node: '>=20.18.1'}
hasBin: true
sharp@0.34.5:
@@ -3134,8 +2571,8 @@ packages:
resolution: {integrity: sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==}
engines: {node: '>= 0.4'}
- side-channel@1.1.0:
- resolution: {integrity: sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==}
+ side-channel@1.1.1:
+ resolution: {integrity: sha512-6x6dK6zJdpTzF4sQeNYxwtvBzf6Eg4GtlesS94HOvTudUeyK2WXAaIfmDgsyslYrRBeFIlsi54AYsFGUuhmvrQ==}
engines: {node: '>= 0.4'}
signal-exit@3.0.7:
@@ -3148,8 +2585,11 @@ packages:
sisteransi@1.0.5:
resolution: {integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==}
- sonner@2.0.3:
- resolution: {integrity: sha512-njQ4Hht92m0sMqqHVDL32V2Oun9W1+PHO9NDv9FHfJjT3JT22IG4Jpo3FPQy+mouRKCXFWO+r67v6MrHX2zeIA==}
+ solid-js@1.9.14:
+ resolution: {integrity: sha512-sAEXC0Kk0S1EDg+8ysEWJDbYhA3RRoEjwuySUGlKIemeo0I5YZfOyumNjNs9Sv3y2nmhD+0rW66ag2HsMuQiGQ==}
+
+ sonner@2.0.7:
+ resolution: {integrity: sha512-W6ZN4p58k8aDKA4XPcx2hpIQXBRAgyiWVkYhT7CvK6D3iAu7xjvVyhQHg2/iaKJZ1XVJ4r7XuwGL+WGEK37i9w==}
peerDependencies:
react: ^18.0.0 || ^19.0.0 || ^19.0.0-rc
react-dom: ^18.0.0 || ^19.0.0 || ^19.0.0-rc
@@ -3162,9 +2602,18 @@ packages:
resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==}
engines: {node: '>=0.10.0'}
+ source-map@0.7.6:
+ resolution: {integrity: sha512-i5uvt8C3ikiWeNZSVZNWcfZPItFQOsYTUAOkcUPGd8DqDy1uOUikjt5dG+uRlwyvR108Fb9DOd4GvXfT0N2/uQ==}
+ engines: {node: '>= 12'}
+
sparse-bitfield@3.0.3:
resolution: {integrity: sha512-kvzhi7vqKTfkh0PZU+2D2PIllw2ymqJKujUcyPMd9Y75Nv4nPbGJZXNhxsgdQab2BmlDct1YnfQCguEvHr7VsQ==}
+ srvx@0.11.21:
+ resolution: {integrity: sha512-GWTHjKMeekX8CwJf4VU9Oo6mJpSGaflGMddbCvR+Cmmh9sslRMiGbAoqqZacE0r1ncARh6buCEETr2W52F8b1w==}
+ engines: {node: '>=20.16.0'}
+ hasBin: true
+
statuses@2.0.2:
resolution: {integrity: sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==}
engines: {node: '>= 0.8'}
@@ -3173,13 +2622,6 @@ packages:
resolution: {integrity: sha512-UhDfHmA92YAlNnCfhmq0VeNL5bDbiZGg7sZ2IvPsXubGkiNa9EC+tUTsjBRsYUAz87btI6/1wf4XoVvQ3uRnmQ==}
engines: {node: '>=18'}
- strict-event-emitter@0.5.1:
- resolution: {integrity: sha512-vMgjE/GGEPEFnhFub6pa4FmJBRBVOLpIII2hvCZ8Kzb7K0hlHo7mQv6xYrBvCL2LtAIBwFUK8wvuJgTVSQ5MFQ==}
-
- string-width@4.2.3:
- resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==}
- engines: {node: '>=8'}
-
string-width@7.2.0:
resolution: {integrity: sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==}
engines: {node: '>=18'}
@@ -3225,43 +2667,28 @@ packages:
resolution: {integrity: sha512-5JRxVqC8I8NuOUjzBbvVJAKNM8qoVuH0O77h4WInc/qC2q5IreqKxYwgkga3PfA22OayK2ikceb/B26dztPl+Q==}
engines: {node: '>=16'}
- tabbable@6.4.0:
- resolution: {integrity: sha512-05PUHKSNE8ou2dwIxTngl4EzcnsCDZGJ/iCLtDflR/SHB/ny14rXc+qU5P4mG9JkusiV7EivzY9Mhm55AzAvCg==}
-
- tagged-tag@1.0.0:
- resolution: {integrity: sha512-yEFYrVhod+hdNyx7g5Bnkkb0G6si8HJurOoOEgC8B/O0uXLHlaey/65KRv6cuWBNhBgHKAROVpc7QyYqE5gFng==}
- engines: {node: '>=20'}
-
- tailwind-merge@3.0.1:
- resolution: {integrity: sha512-AvzE8FmSoXC7nC+oU5GlQJbip2UO7tmOhOfQyOmPhrStOGXHU08j8mZEHZ4BmCqY5dWTCo4ClWkNyRNx1wpT0g==}
-
- tailwind-scrollbar@4.0.2:
- resolution: {integrity: sha512-wAQiIxAPqk0MNTPptVe/xoyWi27y+NRGnTwvn4PQnbvB9kp8QUBiGl/wsfoVBHnQxTmhXJSNt9NHTmcz9EivFA==}
- engines: {node: '>=12.13.0'}
- peerDependencies:
- tailwindcss: 4.x
+ systeminformation@5.31.15:
+ resolution: {integrity: sha512-7mqCtD28TK5dVdLAQONVa/Do/NBgMH2dxqf49nh6DIKoEWuDg6tkgGBP+dN22VEJVPZa/QqiHomhWNRn4WUNTQ==}
+ engines: {node: '>=8.0.0'}
+ os: [darwin, linux, win32, freebsd, openbsd, netbsd, sunos, android]
+ hasBin: true
- tailwindcss-animate@1.0.7:
- resolution: {integrity: sha512-bl6mpH3T7I3UFxuvDEXLxy/VuFxBk5bbzplh7tXI68mwMokNYd1t9qPBHlnyTwfa4JGC4zP516I1hYYtQ/vspA==}
- peerDependencies:
- tailwindcss: '>=3.0.0 || insiders'
+ tailwind-merge@3.6.0:
+ resolution: {integrity: sha512-uxL7qAVQriqRQPAyK3pj66VqskWqoZ37PW94jwOTwNfq/z9oyu1V+eqrZqtR2+fCiXdYOZe/Modt8GtvqNzu+w==}
- tailwindcss@4.1.4:
- resolution: {integrity: sha512-1ZIUqtPITFbv/DxRmDr5/agPqJwF69d24m9qmM1939TJehgY539CtzeZRjbLt5G6fSy/7YqqYsfvoTEw9xUI2A==}
+ tailwindcss@4.3.2:
+ resolution: {integrity: sha512-WtctNNSH8A9jlMIqxzuYumOHU5uGZyRv0Q5svQl+oEPy5w84YpBxdb7MdqyiSPQge5jTJ6zFQLq0PFygdccSBA==}
- tapable@2.2.1:
- resolution: {integrity: sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==}
+ tapable@2.3.3:
+ resolution: {integrity: sha512-uxc/zpqFg6x7C8vOE7lh6Lbda8eEL9zmVm/PLeTPBRhh1xCgdWaQ+J1CUieGpIfm2HdtsUpRv+HshiasBMcc6A==}
engines: {node: '>=6'}
tiny-invariant@1.3.3:
resolution: {integrity: sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg==}
- tldts-core@7.0.28:
- resolution: {integrity: sha512-7W5Efjhsc3chVdFhqtaU0KtK32J37Zcr9RKtID54nG+tIpcY79CQK/veYPODxtD/LJ4Lue66jvrQzIX2Z2/pUQ==}
-
- tldts@7.0.28:
- resolution: {integrity: sha512-+Zg3vWhRUv8B1maGSTFdev9mjoo8Etn2Ayfs4cnjlD3CsGkxXX4QyW3j2WJ0wdjYcYmy7Lx2RDsZMhgCWafKIw==}
- hasBin: true
+ tinyglobby@0.2.17:
+ resolution: {integrity: sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g==}
+ engines: {node: '>=12.0.0'}
to-regex-range@5.0.1:
resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==}
@@ -3271,10 +2698,6 @@ packages:
resolution: {integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==}
engines: {node: '>=0.6'}
- tough-cookie@6.0.1:
- resolution: {integrity: sha512-LktZQb3IeoUWB9lqR5EWTHgW/VTITCXg4D21M+lvybRVdylLrRMnqaIONLVb5mav8vM19m44HIcGq4qASeu2Qw==}
- engines: {node: '>=16'}
-
tr46@5.1.1:
resolution: {integrity: sha512-hdF5ZgjTqgAntKkklYw0R03MG2x/bSzTtkxmIRw/sTNV8YXsCJ1tfLAX23lhxhHJlEf3CRCOCGGWw3vI3GaSPw==}
engines: {node: '>=18'}
@@ -3299,21 +2722,27 @@ packages:
tw-animate-css@1.4.0:
resolution: {integrity: sha512-7bziOlRqH0hJx80h/3mbicLW7o8qLsH5+RaLR2t+OHM3D0JlWGODQKQ4cxbK7WlvmUxpcj6Kgu6EKqjrGFe3QQ==}
- type-fest@5.5.0:
- resolution: {integrity: sha512-PlBfpQwiUvGViBNX84Yxwjsdhd1TUlXr6zjX7eoirtCPIr08NAmxwa+fcYBTeRQxHo9YC9wwF3m9i700sHma8g==}
- engines: {node: '>=20'}
-
- type-is@2.0.1:
- resolution: {integrity: sha512-OZs6gsjF4vMp32qrCbiVSkrFmXtG/AZhY3t0iAMrMBiAZyV9oALtXO8hsrHbMXF9x6L3grlFuwW2oAz7cav+Gw==}
- engines: {node: '>= 0.6'}
+ type-is@2.1.0:
+ resolution: {integrity: sha512-faYHw0anBbc/kWF3zFTEnxSFOAGUX9GFbOBthvDdLsIlEoWOFOtS0zgCiQYwIskL9iGXZL3kAXD8OoZ4GmMATA==}
+ engines: {node: '>= 18'}
- typescript@5.7.3:
- resolution: {integrity: sha512-84MVSjMEHP+FQRPy3pX9sTVV/INIex71s9TL2Gm5FG/WG1SqXeKyZ0k7/blY/4FdOzI12CBy1vGc4og/eus0fw==}
+ typescript@6.0.3:
+ resolution: {integrity: sha512-y2TvuxSZPDyQakkFRPZHKFm+KKVqIisdg9/CZwm9ftvKXLP8NRWj38/ODjNbr43SsoXqNuAisEf1GdCxqWcdBw==}
engines: {node: '>=14.17'}
hasBin: true
- undici-types@6.19.8:
- resolution: {integrity: sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==}
+ ufo@1.6.4:
+ resolution: {integrity: sha512-JFNbkD1Svwe0KvGi8GOeLcP4kAWQ609twvCdcHxq1oSL8svv39ZuSvajcD8B+5D0eL4+s1Is2D/O6KN3qcTeRA==}
+
+ undici-types@6.21.0:
+ resolution: {integrity: sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==}
+
+ undici@7.28.0:
+ resolution: {integrity: sha512-cRZYrTDwWznlnRiPjggAGxZXanty6M8RV1ff8Wm4LWXBp7/IG8v5DnOm74DtUBp9OONpK75YlPnIjQqX0dBDtA==}
+ engines: {node: '>=20.18.1'}
+
+ unenv@2.0.0-rc.24:
+ resolution: {integrity: sha512-i7qRCmY42zmCwnYlh9H2SvLEypEFGye5iRmEMKjcGi7zk9UquigRjFtTLz0TYqr0ZGLZhaMHl/foy1bZR+Cwlw==}
unicorn-magic@0.3.0:
resolution: {integrity: sha512-+QBBXBCvifc56fsbuxZQ6Sic3wqqc3WWaqxs58gvJrcOuN83HGTCwz3oS5phzU9LthRNE9VrJCFCLUgHeeFnfA==}
@@ -3327,34 +2756,118 @@ packages:
resolution: {integrity: sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==}
engines: {node: '>= 0.8'}
- until-async@3.0.2:
- resolution: {integrity: sha512-IiSk4HlzAMqTUseHHe3VhIGyuFmN90zMTpD3Z3y8jeQbzLIq500MVM7Jq2vUAnTKAFPJrqwkzr6PoTcPhGcOiw==}
-
- update-browserslist-db@1.2.3:
- resolution: {integrity: sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==}
- hasBin: true
- peerDependencies:
- browserslist: '>= 4.21.0'
-
- use-callback-ref@1.3.3:
- resolution: {integrity: sha512-jQL3lRnocaFtu3V00JToYz/4QkNWswxijDaCVNZRiRTO3HQDLsdu1ZtmIUvV4yPp+rvWm5j0y0TG/S61cuijTg==}
- engines: {node: '>=10'}
- peerDependencies:
- '@types/react': '*'
- react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc
+ unplugin@3.3.0:
+ resolution: {integrity: sha512-qa66K+crbfyE6JK10GjvbJeRrOsuC/JpbnHctfyp/i4oBTxWOzJfRZyDiOk1PtErMFRu8JhsU/wPvOdBNWe5Rg==}
+ engines: {node: ^20.19.0 || >=22.12.0}
+ peerDependencies:
+ '@farmfe/core': '*'
+ '@rspack/core': '*'
+ bun-types-no-globals: '*'
+ esbuild: '*'
+ rolldown: '*'
+ rollup: '*'
+ unloader: '*'
+ vite: '*'
+ webpack: '*'
peerDependenciesMeta:
- '@types/react':
+ '@farmfe/core':
+ optional: true
+ '@rspack/core':
+ optional: true
+ bun-types-no-globals:
+ optional: true
+ esbuild:
+ optional: true
+ rolldown:
+ optional: true
+ rollup:
+ optional: true
+ unloader:
+ optional: true
+ vite:
+ optional: true
+ webpack:
optional: true
- use-sidecar@1.1.3:
- resolution: {integrity: sha512-Fedw0aZvkhynoPYlA5WXrMCAMm+nSWdZt6lzJQ7Ok8S6Q+VsHmHpRWndVRJ8Be0ZbkfPc5LRYH+5XrzXcEeLRQ==}
- engines: {node: '>=10'}
+ unstorage@2.0.0-alpha.7:
+ resolution: {integrity: sha512-ELPztchk2zgFJnakyodVY3vJWGW9jy//keJ32IOJVGUMyaPydwcA1FtVvWqT0TNRch9H+cMNEGllfVFfScImog==}
peerDependencies:
- '@types/react': '*'
- react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc
+ '@azure/app-configuration': ^1.11.0
+ '@azure/cosmos': ^4.9.1
+ '@azure/data-tables': ^13.3.2
+ '@azure/identity': ^4.13.0
+ '@azure/keyvault-secrets': ^4.10.0
+ '@azure/storage-blob': ^12.31.0
+ '@capacitor/preferences': ^6 || ^7 || ^8
+ '@deno/kv': '>=0.13.0'
+ '@netlify/blobs': ^6.5.0 || ^7.0.0 || ^8.1.0 || ^9.0.0 || ^10.0.0
+ '@planetscale/database': ^1.19.0
+ '@upstash/redis': ^1.36.2
+ '@vercel/blob': '>=0.27.3'
+ '@vercel/functions': ^2.2.12 || ^3.0.0
+ '@vercel/kv': ^1.0.1
+ aws4fetch: ^1.0.20
+ chokidar: ^4 || ^5
+ db0: '>=0.3.4'
+ idb-keyval: ^6.2.2
+ ioredis: ^5.9.3
+ lru-cache: ^11.2.6
+ mongodb: ^6 || ^7
+ ofetch: '*'
+ uploadthing: ^7.7.4
peerDependenciesMeta:
- '@types/react':
+ '@azure/app-configuration':
+ optional: true
+ '@azure/cosmos':
optional: true
+ '@azure/data-tables':
+ optional: true
+ '@azure/identity':
+ optional: true
+ '@azure/keyvault-secrets':
+ optional: true
+ '@azure/storage-blob':
+ optional: true
+ '@capacitor/preferences':
+ optional: true
+ '@deno/kv':
+ optional: true
+ '@netlify/blobs':
+ optional: true
+ '@planetscale/database':
+ optional: true
+ '@upstash/redis':
+ optional: true
+ '@vercel/blob':
+ optional: true
+ '@vercel/functions':
+ optional: true
+ '@vercel/kv':
+ optional: true
+ aws4fetch:
+ optional: true
+ chokidar:
+ optional: true
+ db0:
+ optional: true
+ idb-keyval:
+ optional: true
+ ioredis:
+ optional: true
+ lru-cache:
+ optional: true
+ mongodb:
+ optional: true
+ ofetch:
+ optional: true
+ uploadthing:
+ optional: true
+
+ update-browserslist-db@1.2.3:
+ resolution: {integrity: sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==}
+ hasBin: true
+ peerDependencies:
+ browserslist: '>= 4.21.0'
use-sync-external-store@1.6.0:
resolution: {integrity: sha512-Pp6GSwGP/NrPIrxVFAIkOQeyw8lFenOHijQWkUTrDvrF4ALqylP2C/KCkeS9dpUM3KvYRQhna5vt7IL95+ZQ9w==}
@@ -3372,14 +2885,64 @@ packages:
resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==}
engines: {node: '>= 0.8'}
- web-streams-polyfill@3.3.3:
- resolution: {integrity: sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw==}
- engines: {node: '>= 8'}
+ vite@8.1.4:
+ resolution: {integrity: sha512-bTT9PsdWO+MQMNG9ZXIP/qM9wGh37DFxTV/sPq9cFpHr3w4jkgef032PkAL9jAqhk3Nz8NQw3O8n6/xFkqO4QQ==}
+ engines: {node: ^20.19.0 || >=22.12.0}
+ hasBin: true
+ peerDependencies:
+ '@types/node': ^20.19.0 || >=22.12.0
+ '@vitejs/devtools': ^0.3.0
+ esbuild: ^0.27.0 || ^0.28.0
+ jiti: '>=1.21.0'
+ less: ^4.0.0
+ sass: ^1.70.0
+ sass-embedded: ^1.70.0
+ stylus: '>=0.54.8'
+ sugarss: ^5.0.0
+ terser: ^5.16.0
+ tsx: ^4.8.1
+ yaml: ^2.4.2
+ peerDependenciesMeta:
+ '@types/node':
+ optional: true
+ '@vitejs/devtools':
+ optional: true
+ esbuild:
+ optional: true
+ jiti:
+ optional: true
+ less:
+ optional: true
+ sass:
+ optional: true
+ sass-embedded:
+ optional: true
+ stylus:
+ optional: true
+ sugarss:
+ optional: true
+ terser:
+ optional: true
+ tsx:
+ optional: true
+ yaml:
+ optional: true
+
+ vitefu@1.1.3:
+ resolution: {integrity: sha512-ub4okH7Z5KLjb6hDyjqrGXqWtWvoYdU3IGm/NorpgHncKoLTCfRIbvlhBm7r0YstIaQRYlp4yEbFqDcKSzXSSg==}
+ peerDependencies:
+ vite: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0
+ peerDependenciesMeta:
+ vite:
+ optional: true
webidl-conversions@7.0.0:
resolution: {integrity: sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==}
engines: {node: '>=12'}
+ webpack-virtual-modules@0.6.2:
+ resolution: {integrity: sha512-66/V2i5hQanC51vBQKPH4aI8NMAcBW59FVBs+rC7eGHupMyfn34q7rZIE+ETlJ+XTevqfUhVVBgSUNSW2flEUQ==}
+
whatwg-url@14.2.0:
resolution: {integrity: sha512-De72GdQZzNTUBBChsXueQUnPKDkg/5A5zp7pFDuQAj5UFoENpiACU0wlCvzpAGnTkj++ihpKwKyYewn/XNUbKw==}
engines: {node: '>=18'}
@@ -3394,14 +2957,6 @@ packages:
engines: {node: ^16.13.0 || >=18.0.0}
hasBin: true
- wrap-ansi@6.2.0:
- resolution: {integrity: sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==}
- engines: {node: '>=8'}
-
- wrap-ansi@7.0.0:
- resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==}
- engines: {node: '>=10'}
-
wrappy@1.0.2:
resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==}
@@ -3409,29 +2964,17 @@ packages:
resolution: {integrity: sha512-g/eziiSUNBSsdDJtCLB8bdYEUMj4jR7AGeUo96p/3dTafgjHhpF4RiCFPiRILwjQoDXx5MqkBr4fwWtR3Ky4Wg==}
engines: {node: '>=20'}
- y18n@5.0.8:
- resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==}
- engines: {node: '>=10'}
+ xmlbuilder2@4.0.3:
+ resolution: {integrity: sha512-bx8Q1STctnNaaDymWnkfQLKofs0mGNN7rLLapJlGuV3VlvegD7Ls4ggMjE3aUSWItCCzU0PEv45lI87iSigiCA==}
+ engines: {node: '>=20.0'}
yallist@3.1.1:
resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==}
- yargs-parser@21.1.1:
- resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==}
- engines: {node: '>=12'}
-
- yargs@17.7.2:
- resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==}
- engines: {node: '>=12'}
-
- yocto-spinner@1.1.0:
- resolution: {integrity: sha512-/BY0AUXnS7IKO354uLLA2eRcWiqDifEbd6unXCsOxkFDAkhgUL3PH9X2bFoaU0YchnDXsF+iKleeTLJGckbXfA==}
+ yocto-spinner@1.2.1:
+ resolution: {integrity: sha512-9cbFWLhbiZp+820O4pkHGNncI7+MrUGzBOjw8NMG+ewsY+aG0DdEXnr19Smxao32YOjLZRMdn1UtaxcrXOYOIg==}
engines: {node: '>=18.19'}
- yoctocolors-cjs@2.1.3:
- resolution: {integrity: sha512-U/PBtDf35ff0D8X8D0jfdzHYEPFxAI7jJlxZXwCSez5M3190m+QobIfh+sWDWSHMCWWJN2AWamkegn6vr6YBTw==}
- engines: {node: '>=18'}
-
yoctocolors@2.1.2:
resolution: {integrity: sha512-CzhO+pFNo8ajLM2d2IW/R93ipy99LWjtwblvC1RsoSUMZgyLbYFr221TnSNT7GjGdYui6P459mw9JH/g/zW2ug==}
engines: {node: '>=18'}
@@ -3450,9 +2993,16 @@ packages:
zod@4.3.6:
resolution: {integrity: sha512-rftlrkhHZOcjDwkGlnUtZZkvaPHCsDATp4pGpuOOMDaTdDDXF91wuVDJoWoPsKX/3YPQ5fHuF3STjcYyKr+Qhg==}
+ zod@4.4.3:
+ resolution: {integrity: sha512-ytENFjIJFl2UwYglde2jchW2Hwm4GJFLDiSXWdTrJQBIN9Fcyp7n4DhxJEiWNAJMV1/BqWfW/kkg71UDcHJyTQ==}
+
snapshots:
- '@alloc/quick-lru@5.2.0': {}
+ '@babel/code-frame@7.27.1':
+ dependencies:
+ '@babel/helper-validator-identifier': 7.28.5
+ js-tokens: 4.0.0
+ picocolors: 1.1.1
'@babel/code-frame@7.29.0':
dependencies:
@@ -3460,6 +3010,12 @@ snapshots:
js-tokens: 4.0.0
picocolors: 1.1.1
+ '@babel/code-frame@7.29.7':
+ dependencies:
+ '@babel/helper-validator-identifier': 7.29.7
+ js-tokens: 4.0.0
+ picocolors: 1.1.1
+
'@babel/compat-data@7.29.0': {}
'@babel/core@7.29.0':
@@ -3490,9 +3046,17 @@ snapshots:
'@jridgewell/trace-mapping': 0.3.31
jsesc: 3.1.0
- '@babel/helper-annotate-as-pure@7.27.3':
+ '@babel/generator@7.29.7':
+ dependencies:
+ '@babel/parser': 7.29.7
+ '@babel/types': 7.29.7
+ '@jridgewell/gen-mapping': 0.3.13
+ '@jridgewell/trace-mapping': 0.3.31
+ jsesc: 3.1.0
+
+ '@babel/helper-annotate-as-pure@7.29.7':
dependencies:
- '@babel/types': 7.28.2
+ '@babel/types': 7.29.7
'@babel/helper-compilation-targets@7.28.6':
dependencies:
@@ -3502,25 +3066,27 @@ snapshots:
lru-cache: 5.1.1
semver: 6.3.1
- '@babel/helper-create-class-features-plugin@7.28.6(@babel/core@7.29.0)':
+ '@babel/helper-create-class-features-plugin@7.29.7(@babel/core@7.29.0)':
dependencies:
'@babel/core': 7.29.0
- '@babel/helper-annotate-as-pure': 7.27.3
- '@babel/helper-member-expression-to-functions': 7.28.5
- '@babel/helper-optimise-call-expression': 7.27.1
- '@babel/helper-replace-supers': 7.28.6(@babel/core@7.29.0)
- '@babel/helper-skip-transparent-expression-wrappers': 7.27.1
- '@babel/traverse': 7.29.0
+ '@babel/helper-annotate-as-pure': 7.29.7
+ '@babel/helper-member-expression-to-functions': 7.29.7
+ '@babel/helper-optimise-call-expression': 7.29.7
+ '@babel/helper-replace-supers': 7.29.7(@babel/core@7.29.0)
+ '@babel/helper-skip-transparent-expression-wrappers': 7.29.7
+ '@babel/traverse': 7.29.7
semver: 6.3.1
transitivePeerDependencies:
- supports-color
'@babel/helper-globals@7.28.0': {}
- '@babel/helper-member-expression-to-functions@7.28.5':
+ '@babel/helper-globals@7.29.7': {}
+
+ '@babel/helper-member-expression-to-functions@7.29.7':
dependencies:
- '@babel/traverse': 7.29.0
- '@babel/types': 7.29.0
+ '@babel/traverse': 7.29.7
+ '@babel/types': 7.29.7
transitivePeerDependencies:
- supports-color
@@ -3531,6 +3097,13 @@ snapshots:
transitivePeerDependencies:
- supports-color
+ '@babel/helper-module-imports@7.29.7':
+ dependencies:
+ '@babel/traverse': 7.29.7
+ '@babel/types': 7.29.7
+ transitivePeerDependencies:
+ - supports-color
+
'@babel/helper-module-transforms@7.28.6(@babel/core@7.29.0)':
dependencies:
'@babel/core': 7.29.0
@@ -3540,36 +3113,49 @@ snapshots:
transitivePeerDependencies:
- supports-color
- '@babel/helper-optimise-call-expression@7.27.1':
+ '@babel/helper-module-transforms@7.29.7(@babel/core@7.29.0)':
+ dependencies:
+ '@babel/core': 7.29.0
+ '@babel/helper-module-imports': 7.29.7
+ '@babel/helper-validator-identifier': 7.29.7
+ '@babel/traverse': 7.29.7
+ transitivePeerDependencies:
+ - supports-color
+
+ '@babel/helper-optimise-call-expression@7.29.7':
dependencies:
- '@babel/types': 7.28.2
+ '@babel/types': 7.29.7
- '@babel/helper-plugin-utils@7.28.6': {}
+ '@babel/helper-plugin-utils@7.29.7': {}
- '@babel/helper-replace-supers@7.28.6(@babel/core@7.29.0)':
+ '@babel/helper-replace-supers@7.29.7(@babel/core@7.29.0)':
dependencies:
'@babel/core': 7.29.0
- '@babel/helper-member-expression-to-functions': 7.28.5
- '@babel/helper-optimise-call-expression': 7.27.1
- '@babel/traverse': 7.29.0
+ '@babel/helper-member-expression-to-functions': 7.29.7
+ '@babel/helper-optimise-call-expression': 7.29.7
+ '@babel/traverse': 7.29.7
transitivePeerDependencies:
- supports-color
- '@babel/helper-skip-transparent-expression-wrappers@7.27.1':
+ '@babel/helper-skip-transparent-expression-wrappers@7.29.7':
dependencies:
- '@babel/traverse': 7.29.0
- '@babel/types': 7.28.2
+ '@babel/traverse': 7.29.7
+ '@babel/types': 7.29.7
transitivePeerDependencies:
- supports-color
'@babel/helper-string-parser@7.27.1': {}
- '@babel/helper-validator-identifier@7.27.1': {}
+ '@babel/helper-string-parser@7.29.7': {}
'@babel/helper-validator-identifier@7.28.5': {}
+ '@babel/helper-validator-identifier@7.29.7': {}
+
'@babel/helper-validator-option@7.27.1': {}
+ '@babel/helper-validator-option@7.29.7': {}
+
'@babel/helpers@7.29.2':
dependencies:
'@babel/template': 7.28.6
@@ -3579,47 +3165,51 @@ snapshots:
dependencies:
'@babel/types': 7.29.0
- '@babel/plugin-syntax-jsx@7.28.6(@babel/core@7.29.0)':
+ '@babel/parser@7.29.7':
+ dependencies:
+ '@babel/types': 7.29.7
+
+ '@babel/plugin-syntax-jsx@7.29.7(@babel/core@7.29.0)':
dependencies:
'@babel/core': 7.29.0
- '@babel/helper-plugin-utils': 7.28.6
+ '@babel/helper-plugin-utils': 7.29.7
- '@babel/plugin-syntax-typescript@7.28.6(@babel/core@7.29.0)':
+ '@babel/plugin-syntax-typescript@7.29.7(@babel/core@7.29.0)':
dependencies:
'@babel/core': 7.29.0
- '@babel/helper-plugin-utils': 7.28.6
+ '@babel/helper-plugin-utils': 7.29.7
- '@babel/plugin-transform-modules-commonjs@7.28.6(@babel/core@7.29.0)':
+ '@babel/plugin-transform-modules-commonjs@7.29.7(@babel/core@7.29.0)':
dependencies:
'@babel/core': 7.29.0
- '@babel/helper-module-transforms': 7.28.6(@babel/core@7.29.0)
- '@babel/helper-plugin-utils': 7.28.6
+ '@babel/helper-module-transforms': 7.29.7(@babel/core@7.29.0)
+ '@babel/helper-plugin-utils': 7.29.7
transitivePeerDependencies:
- supports-color
- '@babel/plugin-transform-typescript@7.28.6(@babel/core@7.29.0)':
+ '@babel/plugin-transform-typescript@7.29.7(@babel/core@7.29.0)':
dependencies:
'@babel/core': 7.29.0
- '@babel/helper-annotate-as-pure': 7.27.3
- '@babel/helper-create-class-features-plugin': 7.28.6(@babel/core@7.29.0)
- '@babel/helper-plugin-utils': 7.28.6
- '@babel/helper-skip-transparent-expression-wrappers': 7.27.1
- '@babel/plugin-syntax-typescript': 7.28.6(@babel/core@7.29.0)
+ '@babel/helper-annotate-as-pure': 7.29.7
+ '@babel/helper-create-class-features-plugin': 7.29.7(@babel/core@7.29.0)
+ '@babel/helper-plugin-utils': 7.29.7
+ '@babel/helper-skip-transparent-expression-wrappers': 7.29.7
+ '@babel/plugin-syntax-typescript': 7.29.7(@babel/core@7.29.0)
transitivePeerDependencies:
- supports-color
- '@babel/preset-typescript@7.28.5(@babel/core@7.29.0)':
+ '@babel/preset-typescript@7.29.7(@babel/core@7.29.0)':
dependencies:
'@babel/core': 7.29.0
- '@babel/helper-plugin-utils': 7.28.6
- '@babel/helper-validator-option': 7.27.1
- '@babel/plugin-syntax-jsx': 7.28.6(@babel/core@7.29.0)
- '@babel/plugin-transform-modules-commonjs': 7.28.6(@babel/core@7.29.0)
- '@babel/plugin-transform-typescript': 7.28.6(@babel/core@7.29.0)
+ '@babel/helper-plugin-utils': 7.29.7
+ '@babel/helper-validator-option': 7.29.7
+ '@babel/plugin-syntax-jsx': 7.29.7(@babel/core@7.29.0)
+ '@babel/plugin-transform-modules-commonjs': 7.29.7(@babel/core@7.29.0)
+ '@babel/plugin-transform-typescript': 7.29.7(@babel/core@7.29.0)
transitivePeerDependencies:
- supports-color
- '@babel/runtime@7.29.2': {}
+ '@babel/runtime@7.29.7': {}
'@babel/template@7.28.6':
dependencies:
@@ -3627,6 +3217,12 @@ snapshots:
'@babel/parser': 7.29.2
'@babel/types': 7.29.0
+ '@babel/template@7.29.7':
+ dependencies:
+ '@babel/code-frame': 7.29.7
+ '@babel/parser': 7.29.7
+ '@babel/types': 7.29.7
+
'@babel/traverse@7.29.0':
dependencies:
'@babel/code-frame': 7.29.0
@@ -3639,39 +3235,50 @@ snapshots:
transitivePeerDependencies:
- supports-color
- '@babel/types@7.28.2':
+ '@babel/traverse@7.29.7':
dependencies:
- '@babel/helper-string-parser': 7.27.1
- '@babel/helper-validator-identifier': 7.27.1
+ '@babel/code-frame': 7.29.7
+ '@babel/generator': 7.29.7
+ '@babel/helper-globals': 7.29.7
+ '@babel/parser': 7.29.7
+ '@babel/template': 7.29.7
+ '@babel/types': 7.29.7
+ debug: 4.4.3
+ transitivePeerDependencies:
+ - supports-color
'@babel/types@7.29.0':
dependencies:
'@babel/helper-string-parser': 7.27.1
'@babel/helper-validator-identifier': 7.28.5
- '@base-ui/react@1.3.0(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)':
+ '@babel/types@7.29.7':
+ dependencies:
+ '@babel/helper-string-parser': 7.29.7
+ '@babel/helper-validator-identifier': 7.29.7
+
+ '@base-ui/react@1.6.0(@types/react@19.2.17)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)':
dependencies:
- '@babel/runtime': 7.29.2
- '@base-ui/utils': 0.2.6(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
- '@floating-ui/react-dom': 2.1.8(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ '@babel/runtime': 7.29.7
+ '@base-ui/utils': 0.3.1(@types/react@19.2.17)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)
+ '@floating-ui/react-dom': 2.1.8(react-dom@19.2.7(react@19.2.7))(react@19.2.7)
'@floating-ui/utils': 0.2.11
- react: 18.3.1
- react-dom: 18.3.1(react@18.3.1)
- tabbable: 6.4.0
- use-sync-external-store: 1.6.0(react@18.3.1)
+ react: 19.2.7
+ react-dom: 19.2.7(react@19.2.7)
+ use-sync-external-store: 1.6.0(react@19.2.7)
optionalDependencies:
- '@types/react': 18.3.18
+ '@types/react': 19.2.17
- '@base-ui/utils@0.2.6(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)':
+ '@base-ui/utils@0.3.1(@types/react@19.2.17)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)':
dependencies:
- '@babel/runtime': 7.29.2
+ '@babel/runtime': 7.29.7
'@floating-ui/utils': 0.2.11
- react: 18.3.1
- react-dom: 18.3.1(react@18.3.1)
- reselect: 5.1.1
- use-sync-external-store: 1.6.0(react@18.3.1)
+ react: 19.2.7
+ react-dom: 19.2.7(react@19.2.7)
+ reselect: 5.2.0
+ use-sync-external-store: 1.6.0(react@19.2.7)
optionalDependencies:
- '@types/react': 18.3.18
+ '@types/react': 19.2.17
'@better-auth/core@1.5.5(@better-auth/utils@0.3.1)(@better-fetch/fetch@1.1.21)(better-call@1.3.2(zod@4.3.6))(jose@6.1.3)(kysely@0.28.12)(nanostores@1.2.0)':
dependencies:
@@ -3706,14 +3313,14 @@ snapshots:
'@better-auth/utils': 0.3.1
mongodb: 7.1.0
- '@better-auth/passkey@1.5.5(@better-auth/core@1.5.5(@better-auth/utils@0.3.1)(@better-fetch/fetch@1.1.21)(better-call@1.3.2(zod@4.3.6))(jose@6.1.3)(kysely@0.28.12)(nanostores@1.2.0))(@better-auth/utils@0.3.1)(@better-fetch/fetch@1.1.21)(better-auth@1.5.5(mongodb@7.1.0)(next@15.5.18(@babel/core@7.29.0)(babel-plugin-react-compiler@1.0.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(better-call@1.3.2(zod@4.3.5))(nanostores@1.2.0)':
+ '@better-auth/passkey@1.5.5(@better-auth/core@1.5.5(@better-auth/utils@0.3.1)(@better-fetch/fetch@1.1.21)(better-call@1.3.2(zod@4.3.6))(jose@6.1.3)(kysely@0.28.12)(nanostores@1.2.0))(@better-auth/utils@0.3.1)(@better-fetch/fetch@1.1.21)(better-auth@1.5.5(@tanstack/react-start@1.168.27(crossws@0.4.9(srvx@0.11.21))(react-dom@19.2.7(react@19.2.7))(react@19.2.7)(rolldown@1.1.5)(vite@8.1.4(@types/node@22.20.1)(jiti@2.7.0)))(mongodb@7.1.0)(next@15.5.18(@babel/core@7.29.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.7(react@19.2.7))(react@19.2.7))(react-dom@19.2.7(react@19.2.7))(react@19.2.7)(solid-js@1.9.14))(better-call@1.3.2(zod@4.3.5))(nanostores@1.2.0)':
dependencies:
'@better-auth/core': 1.5.5(@better-auth/utils@0.3.1)(@better-fetch/fetch@1.1.21)(better-call@1.3.2(zod@4.3.6))(jose@6.1.3)(kysely@0.28.12)(nanostores@1.2.0)
'@better-auth/utils': 0.3.1
'@better-fetch/fetch': 1.1.21
'@simplewebauthn/browser': 13.2.2
'@simplewebauthn/server': 13.3.0
- better-auth: 1.5.5(mongodb@7.1.0)(next@15.5.18(@babel/core@7.29.0)(babel-plugin-react-compiler@1.0.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ better-auth: 1.5.5(@tanstack/react-start@1.168.27(crossws@0.4.9(srvx@0.11.21))(react-dom@19.2.7(react@19.2.7))(react@19.2.7)(rolldown@1.1.5)(vite@8.1.4(@types/node@22.20.1)(jiti@2.7.0)))(mongodb@7.1.0)(next@15.5.18(@babel/core@7.29.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.7(react@19.2.7))(react@19.2.7))(react-dom@19.2.7(react@19.2.7))(react@19.2.7)(solid-js@1.9.14)
better-call: 1.3.2(zod@4.3.5)
nanostores: 1.2.0
zod: 4.3.6
@@ -3768,73 +3375,65 @@ snapshots:
'@biomejs/cli-win32-x64@2.3.10':
optional: true
- '@date-fns/tz@1.4.1': {}
-
- '@dotenvx/dotenvx@1.61.0':
+ '@dotenvx/dotenvx@1.75.1':
dependencies:
+ '@dotenvx/primitives': 0.8.0
commander: 11.1.0
- dotenv: 17.4.1
- eciesjs: 0.4.18
+ conf: 10.2.0
+ dotenv: 17.4.2
+ enquirer: 2.4.1
+ env-paths: 2.2.1
execa: 5.1.1
- fdir: 6.5.0(picomatch@4.0.4)
+ fdir: 6.5.0(picomatch@4.0.5)
ignore: 5.3.2
object-treeify: 1.1.33
- picomatch: 4.0.4
+ open: 8.4.2
+ picomatch: 4.0.5
+ systeminformation: 5.31.15
+ undici: 7.28.0
which: 4.0.0
- yocto-spinner: 1.1.0
+ yocto-spinner: 1.2.1
- '@ecies/ciphers@0.2.6(@noble/ciphers@1.3.0)':
+ '@dotenvx/primitives@0.8.0': {}
+
+ '@emnapi/core@1.11.1':
dependencies:
- '@noble/ciphers': 1.3.0
+ '@emnapi/wasi-threads': 1.2.2
+ tslib: 2.8.1
+ optional: true
- '@emnapi/runtime@1.10.0':
+ '@emnapi/runtime@1.11.1':
dependencies:
tslib: 2.8.1
optional: true
- '@floating-ui/core@1.6.9':
+ '@emnapi/wasi-threads@1.2.2':
dependencies:
- '@floating-ui/utils': 0.2.9
+ tslib: 2.8.1
+ optional: true
'@floating-ui/core@1.7.5':
dependencies:
'@floating-ui/utils': 0.2.11
- '@floating-ui/dom@1.6.13':
- dependencies:
- '@floating-ui/core': 1.6.9
- '@floating-ui/utils': 0.2.9
-
'@floating-ui/dom@1.7.6':
dependencies:
'@floating-ui/core': 1.7.5
'@floating-ui/utils': 0.2.11
- '@floating-ui/react-dom@2.1.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1)':
- dependencies:
- '@floating-ui/dom': 1.6.13
- react: 18.3.1
- react-dom: 18.3.1(react@18.3.1)
-
- '@floating-ui/react-dom@2.1.8(react-dom@18.3.1(react@18.3.1))(react@18.3.1)':
+ '@floating-ui/react-dom@2.1.8(react-dom@19.2.7(react@19.2.7))(react@19.2.7)':
dependencies:
'@floating-ui/dom': 1.7.6
- react: 18.3.1
- react-dom: 18.3.1(react@18.3.1)
+ react: 19.2.7
+ react-dom: 19.2.7(react@19.2.7)
'@floating-ui/utils@0.2.11': {}
- '@floating-ui/utils@0.2.9': {}
-
'@hexagon/base64@1.1.28': {}
- '@hono/node-server@1.19.13(hono@4.12.12)':
- dependencies:
- hono: 4.12.12
-
- '@hookform/resolvers@3.10.0(react-hook-form@7.55.0(react@18.3.1))':
+ '@hono/node-server@1.19.14(hono@4.12.29)':
dependencies:
- react-hook-form: 7.55.0(react@18.3.1)
+ hono: 4.12.29
'@img/colour@1.1.0':
optional: true
@@ -3921,7 +3520,7 @@ snapshots:
'@img/sharp-wasm32@0.34.5':
dependencies:
- '@emnapi/runtime': 1.10.0
+ '@emnapi/runtime': 1.11.1
optional: true
'@img/sharp-win32-arm64@0.34.5':
@@ -3933,34 +3532,6 @@ snapshots:
'@img/sharp-win32-x64@0.34.5':
optional: true
- '@inquirer/ansi@1.0.2': {}
-
- '@inquirer/confirm@5.1.21(@types/node@20.17.19)':
- dependencies:
- '@inquirer/core': 10.3.2(@types/node@20.17.19)
- '@inquirer/type': 3.0.10(@types/node@20.17.19)
- optionalDependencies:
- '@types/node': 20.17.19
-
- '@inquirer/core@10.3.2(@types/node@20.17.19)':
- dependencies:
- '@inquirer/ansi': 1.0.2
- '@inquirer/figures': 1.0.15
- '@inquirer/type': 3.0.10(@types/node@20.17.19)
- cli-width: 4.1.0
- mute-stream: 2.0.0
- signal-exit: 4.1.0
- wrap-ansi: 6.2.0
- yoctocolors-cjs: 2.1.3
- optionalDependencies:
- '@types/node': 20.17.19
-
- '@inquirer/figures@1.0.15': {}
-
- '@inquirer/type@3.0.10(@types/node@20.17.19)':
- optionalDependencies:
- '@types/node': 20.17.19
-
'@jridgewell/gen-mapping@0.3.13':
dependencies:
'@jridgewell/sourcemap-codec': 1.5.5
@@ -3984,17 +3555,17 @@ snapshots:
'@modelcontextprotocol/sdk@1.29.0(zod@3.25.76)':
dependencies:
- '@hono/node-server': 1.19.13(hono@4.12.12)
- ajv: 8.18.0
- ajv-formats: 3.0.1(ajv@8.18.0)
+ '@hono/node-server': 1.19.14(hono@4.12.29)
+ ajv: 8.20.0
+ ajv-formats: 3.0.1(ajv@8.20.0)
content-type: 1.0.5
cors: 2.8.6
cross-spawn: 7.0.6
eventsource: 3.0.7
- eventsource-parser: 3.0.6
+ eventsource-parser: 3.1.0
express: 5.2.1
- express-rate-limit: 8.3.2(express@5.2.1)
- hono: 4.12.12
+ express-rate-limit: 8.5.2(express@5.2.1)
+ hono: 4.12.29
jose: 6.1.3
json-schema-typed: 8.0.2
pkce-challenge: 5.0.1
@@ -4008,16 +3579,15 @@ snapshots:
dependencies:
sparse-bitfield: 3.0.3
- '@mswjs/interceptors@0.41.3':
+ '@napi-rs/wasm-runtime@1.1.6(@emnapi/core@1.11.1)(@emnapi/runtime@1.11.1)':
dependencies:
- '@open-draft/deferred-promise': 2.2.0
- '@open-draft/logger': 0.3.0
- '@open-draft/until': 2.1.0
- is-node-process: 1.2.0
- outvariant: 1.4.3
- strict-event-emitter: 0.5.1
+ '@emnapi/core': 1.11.1
+ '@emnapi/runtime': 1.11.1
+ '@tybys/wasm-util': 0.10.3
+ optional: true
- '@next/env@15.5.18': {}
+ '@next/env@15.5.18':
+ optional: true
'@next/swc-darwin-arm64@15.5.18':
optional: true
@@ -4043,16 +3613,8 @@ snapshots:
'@next/swc-win32-x64-msvc@15.5.18':
optional: true
- '@noble/ciphers@1.3.0': {}
-
'@noble/ciphers@2.1.1': {}
- '@noble/curves@1.9.7':
- dependencies:
- '@noble/hashes': 1.8.0
-
- '@noble/hashes@1.8.0': {}
-
'@noble/hashes@2.0.1': {}
'@nodelib/fs.scandir@2.1.5':
@@ -4067,14 +3629,24 @@ snapshots:
'@nodelib/fs.scandir': 2.1.5
fastq: 1.20.1
- '@open-draft/deferred-promise@2.2.0': {}
+ '@oozcitak/dom@2.0.2':
+ dependencies:
+ '@oozcitak/infra': 2.0.2
+ '@oozcitak/url': 3.0.0
+ '@oozcitak/util': 10.0.0
+
+ '@oozcitak/infra@2.0.2':
+ dependencies:
+ '@oozcitak/util': 10.0.0
- '@open-draft/logger@0.3.0':
+ '@oozcitak/url@3.0.0':
dependencies:
- is-node-process: 1.2.0
- outvariant: 1.4.3
+ '@oozcitak/infra': 2.0.2
+ '@oozcitak/util': 10.0.0
+
+ '@oozcitak/util@10.0.0': {}
- '@open-draft/until@2.1.0': {}
+ '@oxc-project/types@0.139.0': {}
'@peculiar/asn1-android@2.6.0':
dependencies:
@@ -4174,787 +3746,56 @@ snapshots:
'@polinetwork/backend@0.16.0': {}
- '@radix-ui/number@1.1.1': {}
-
- '@radix-ui/primitive@1.1.3': {}
-
- '@radix-ui/react-accessible-icon@1.1.7(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)':
- dependencies:
- '@radix-ui/react-visually-hidden': 1.2.3(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
- react: 18.3.1
- react-dom: 18.3.1(react@18.3.1)
- optionalDependencies:
- '@types/react': 18.3.18
- '@types/react-dom': 18.3.5(@types/react@18.3.18)
-
- '@radix-ui/react-accordion@1.2.12(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)':
- dependencies:
- '@radix-ui/primitive': 1.1.3
- '@radix-ui/react-collapsible': 1.1.12(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
- '@radix-ui/react-collection': 1.1.7(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
- '@radix-ui/react-compose-refs': 1.1.2(@types/react@18.3.18)(react@18.3.1)
- '@radix-ui/react-context': 1.1.2(@types/react@18.3.18)(react@18.3.1)
- '@radix-ui/react-direction': 1.1.1(@types/react@18.3.18)(react@18.3.1)
- '@radix-ui/react-id': 1.1.1(@types/react@18.3.18)(react@18.3.1)
- '@radix-ui/react-primitive': 2.1.3(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
- '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@18.3.18)(react@18.3.1)
- react: 18.3.1
- react-dom: 18.3.1(react@18.3.1)
- optionalDependencies:
- '@types/react': 18.3.18
- '@types/react-dom': 18.3.5(@types/react@18.3.18)
-
- '@radix-ui/react-alert-dialog@1.1.15(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)':
- dependencies:
- '@radix-ui/primitive': 1.1.3
- '@radix-ui/react-compose-refs': 1.1.2(@types/react@18.3.18)(react@18.3.1)
- '@radix-ui/react-context': 1.1.2(@types/react@18.3.18)(react@18.3.1)
- '@radix-ui/react-dialog': 1.1.15(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
- '@radix-ui/react-primitive': 2.1.3(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
- '@radix-ui/react-slot': 1.2.3(@types/react@18.3.18)(react@18.3.1)
- react: 18.3.1
- react-dom: 18.3.1(react@18.3.1)
- optionalDependencies:
- '@types/react': 18.3.18
- '@types/react-dom': 18.3.5(@types/react@18.3.18)
-
- '@radix-ui/react-arrow@1.1.7(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)':
- dependencies:
- '@radix-ui/react-primitive': 2.1.3(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
- react: 18.3.1
- react-dom: 18.3.1(react@18.3.1)
- optionalDependencies:
- '@types/react': 18.3.18
- '@types/react-dom': 18.3.5(@types/react@18.3.18)
-
- '@radix-ui/react-aspect-ratio@1.1.7(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)':
- dependencies:
- '@radix-ui/react-primitive': 2.1.3(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
- react: 18.3.1
- react-dom: 18.3.1(react@18.3.1)
- optionalDependencies:
- '@types/react': 18.3.18
- '@types/react-dom': 18.3.5(@types/react@18.3.18)
-
- '@radix-ui/react-avatar@1.1.10(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)':
- dependencies:
- '@radix-ui/react-context': 1.1.2(@types/react@18.3.18)(react@18.3.1)
- '@radix-ui/react-primitive': 2.1.3(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
- '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@18.3.18)(react@18.3.1)
- '@radix-ui/react-use-is-hydrated': 0.1.0(@types/react@18.3.18)(react@18.3.1)
- '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@18.3.18)(react@18.3.1)
- react: 18.3.1
- react-dom: 18.3.1(react@18.3.1)
- optionalDependencies:
- '@types/react': 18.3.18
- '@types/react-dom': 18.3.5(@types/react@18.3.18)
-
- '@radix-ui/react-checkbox@1.3.3(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)':
- dependencies:
- '@radix-ui/primitive': 1.1.3
- '@radix-ui/react-compose-refs': 1.1.2(@types/react@18.3.18)(react@18.3.1)
- '@radix-ui/react-context': 1.1.2(@types/react@18.3.18)(react@18.3.1)
- '@radix-ui/react-presence': 1.1.5(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
- '@radix-ui/react-primitive': 2.1.3(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
- '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@18.3.18)(react@18.3.1)
- '@radix-ui/react-use-previous': 1.1.1(@types/react@18.3.18)(react@18.3.1)
- '@radix-ui/react-use-size': 1.1.1(@types/react@18.3.18)(react@18.3.1)
- react: 18.3.1
- react-dom: 18.3.1(react@18.3.1)
- optionalDependencies:
- '@types/react': 18.3.18
- '@types/react-dom': 18.3.5(@types/react@18.3.18)
-
- '@radix-ui/react-collapsible@1.1.12(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)':
- dependencies:
- '@radix-ui/primitive': 1.1.3
- '@radix-ui/react-compose-refs': 1.1.2(@types/react@18.3.18)(react@18.3.1)
- '@radix-ui/react-context': 1.1.2(@types/react@18.3.18)(react@18.3.1)
- '@radix-ui/react-id': 1.1.1(@types/react@18.3.18)(react@18.3.1)
- '@radix-ui/react-presence': 1.1.5(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
- '@radix-ui/react-primitive': 2.1.3(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
- '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@18.3.18)(react@18.3.1)
- '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@18.3.18)(react@18.3.1)
- react: 18.3.1
- react-dom: 18.3.1(react@18.3.1)
- optionalDependencies:
- '@types/react': 18.3.18
- '@types/react-dom': 18.3.5(@types/react@18.3.18)
-
- '@radix-ui/react-collection@1.1.7(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)':
- dependencies:
- '@radix-ui/react-compose-refs': 1.1.2(@types/react@18.3.18)(react@18.3.1)
- '@radix-ui/react-context': 1.1.2(@types/react@18.3.18)(react@18.3.1)
- '@radix-ui/react-primitive': 2.1.3(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
- '@radix-ui/react-slot': 1.2.3(@types/react@18.3.18)(react@18.3.1)
- react: 18.3.1
- react-dom: 18.3.1(react@18.3.1)
- optionalDependencies:
- '@types/react': 18.3.18
- '@types/react-dom': 18.3.5(@types/react@18.3.18)
-
- '@radix-ui/react-compose-refs@1.1.1(@types/react@18.3.18)(react@18.3.1)':
- dependencies:
- react: 18.3.1
- optionalDependencies:
- '@types/react': 18.3.18
-
- '@radix-ui/react-compose-refs@1.1.2(@types/react@18.3.18)(react@18.3.1)':
- dependencies:
- react: 18.3.1
- optionalDependencies:
- '@types/react': 18.3.18
-
- '@radix-ui/react-context-menu@2.2.16(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)':
- dependencies:
- '@radix-ui/primitive': 1.1.3
- '@radix-ui/react-context': 1.1.2(@types/react@18.3.18)(react@18.3.1)
- '@radix-ui/react-menu': 2.1.16(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
- '@radix-ui/react-primitive': 2.1.3(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
- '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@18.3.18)(react@18.3.1)
- '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@18.3.18)(react@18.3.1)
- react: 18.3.1
- react-dom: 18.3.1(react@18.3.1)
- optionalDependencies:
- '@types/react': 18.3.18
- '@types/react-dom': 18.3.5(@types/react@18.3.18)
-
- '@radix-ui/react-context@1.1.2(@types/react@18.3.18)(react@18.3.1)':
- dependencies:
- react: 18.3.1
- optionalDependencies:
- '@types/react': 18.3.18
-
- '@radix-ui/react-dialog@1.1.15(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)':
- dependencies:
- '@radix-ui/primitive': 1.1.3
- '@radix-ui/react-compose-refs': 1.1.2(@types/react@18.3.18)(react@18.3.1)
- '@radix-ui/react-context': 1.1.2(@types/react@18.3.18)(react@18.3.1)
- '@radix-ui/react-dismissable-layer': 1.1.11(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
- '@radix-ui/react-focus-guards': 1.1.3(@types/react@18.3.18)(react@18.3.1)
- '@radix-ui/react-focus-scope': 1.1.7(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
- '@radix-ui/react-id': 1.1.1(@types/react@18.3.18)(react@18.3.1)
- '@radix-ui/react-portal': 1.1.9(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
- '@radix-ui/react-presence': 1.1.5(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
- '@radix-ui/react-primitive': 2.1.3(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
- '@radix-ui/react-slot': 1.2.3(@types/react@18.3.18)(react@18.3.1)
- '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@18.3.18)(react@18.3.1)
- aria-hidden: 1.2.4
- react: 18.3.1
- react-dom: 18.3.1(react@18.3.1)
- react-remove-scroll: 2.6.3(@types/react@18.3.18)(react@18.3.1)
- optionalDependencies:
- '@types/react': 18.3.18
- '@types/react-dom': 18.3.5(@types/react@18.3.18)
-
- '@radix-ui/react-direction@1.1.1(@types/react@18.3.18)(react@18.3.1)':
- dependencies:
- react: 18.3.1
- optionalDependencies:
- '@types/react': 18.3.18
-
- '@radix-ui/react-dismissable-layer@1.1.11(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)':
- dependencies:
- '@radix-ui/primitive': 1.1.3
- '@radix-ui/react-compose-refs': 1.1.2(@types/react@18.3.18)(react@18.3.1)
- '@radix-ui/react-primitive': 2.1.3(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
- '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@18.3.18)(react@18.3.1)
- '@radix-ui/react-use-escape-keydown': 1.1.1(@types/react@18.3.18)(react@18.3.1)
- react: 18.3.1
- react-dom: 18.3.1(react@18.3.1)
- optionalDependencies:
- '@types/react': 18.3.18
- '@types/react-dom': 18.3.5(@types/react@18.3.18)
-
- '@radix-ui/react-dropdown-menu@2.1.16(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)':
- dependencies:
- '@radix-ui/primitive': 1.1.3
- '@radix-ui/react-compose-refs': 1.1.2(@types/react@18.3.18)(react@18.3.1)
- '@radix-ui/react-context': 1.1.2(@types/react@18.3.18)(react@18.3.1)
- '@radix-ui/react-id': 1.1.1(@types/react@18.3.18)(react@18.3.1)
- '@radix-ui/react-menu': 2.1.16(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
- '@radix-ui/react-primitive': 2.1.3(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
- '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@18.3.18)(react@18.3.1)
- react: 18.3.1
- react-dom: 18.3.1(react@18.3.1)
- optionalDependencies:
- '@types/react': 18.3.18
- '@types/react-dom': 18.3.5(@types/react@18.3.18)
-
- '@radix-ui/react-focus-guards@1.1.3(@types/react@18.3.18)(react@18.3.1)':
- dependencies:
- react: 18.3.1
- optionalDependencies:
- '@types/react': 18.3.18
-
- '@radix-ui/react-focus-scope@1.1.7(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)':
- dependencies:
- '@radix-ui/react-compose-refs': 1.1.2(@types/react@18.3.18)(react@18.3.1)
- '@radix-ui/react-primitive': 2.1.3(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
- '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@18.3.18)(react@18.3.1)
- react: 18.3.1
- react-dom: 18.3.1(react@18.3.1)
- optionalDependencies:
- '@types/react': 18.3.18
- '@types/react-dom': 18.3.5(@types/react@18.3.18)
-
- '@radix-ui/react-form@0.1.8(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)':
- dependencies:
- '@radix-ui/primitive': 1.1.3
- '@radix-ui/react-compose-refs': 1.1.2(@types/react@18.3.18)(react@18.3.1)
- '@radix-ui/react-context': 1.1.2(@types/react@18.3.18)(react@18.3.1)
- '@radix-ui/react-id': 1.1.1(@types/react@18.3.18)(react@18.3.1)
- '@radix-ui/react-label': 2.1.7(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
- '@radix-ui/react-primitive': 2.1.3(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
- react: 18.3.1
- react-dom: 18.3.1(react@18.3.1)
- optionalDependencies:
- '@types/react': 18.3.18
- '@types/react-dom': 18.3.5(@types/react@18.3.18)
-
- '@radix-ui/react-hover-card@1.1.15(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)':
- dependencies:
- '@radix-ui/primitive': 1.1.3
- '@radix-ui/react-compose-refs': 1.1.2(@types/react@18.3.18)(react@18.3.1)
- '@radix-ui/react-context': 1.1.2(@types/react@18.3.18)(react@18.3.1)
- '@radix-ui/react-dismissable-layer': 1.1.11(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
- '@radix-ui/react-popper': 1.2.8(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
- '@radix-ui/react-portal': 1.1.9(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
- '@radix-ui/react-presence': 1.1.5(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
- '@radix-ui/react-primitive': 2.1.3(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
- '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@18.3.18)(react@18.3.1)
- react: 18.3.1
- react-dom: 18.3.1(react@18.3.1)
- optionalDependencies:
- '@types/react': 18.3.18
- '@types/react-dom': 18.3.5(@types/react@18.3.18)
-
- '@radix-ui/react-id@1.1.0(@types/react@18.3.18)(react@18.3.1)':
- dependencies:
- '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@18.3.18)(react@18.3.1)
- react: 18.3.1
- optionalDependencies:
- '@types/react': 18.3.18
-
- '@radix-ui/react-id@1.1.1(@types/react@18.3.18)(react@18.3.1)':
- dependencies:
- '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@18.3.18)(react@18.3.1)
- react: 18.3.1
- optionalDependencies:
- '@types/react': 18.3.18
-
- '@radix-ui/react-label@2.1.7(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)':
- dependencies:
- '@radix-ui/react-primitive': 2.1.3(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
- react: 18.3.1
- react-dom: 18.3.1(react@18.3.1)
- optionalDependencies:
- '@types/react': 18.3.18
- '@types/react-dom': 18.3.5(@types/react@18.3.18)
-
- '@radix-ui/react-menu@2.1.16(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)':
- dependencies:
- '@radix-ui/primitive': 1.1.3
- '@radix-ui/react-collection': 1.1.7(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
- '@radix-ui/react-compose-refs': 1.1.2(@types/react@18.3.18)(react@18.3.1)
- '@radix-ui/react-context': 1.1.2(@types/react@18.3.18)(react@18.3.1)
- '@radix-ui/react-direction': 1.1.1(@types/react@18.3.18)(react@18.3.1)
- '@radix-ui/react-dismissable-layer': 1.1.11(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
- '@radix-ui/react-focus-guards': 1.1.3(@types/react@18.3.18)(react@18.3.1)
- '@radix-ui/react-focus-scope': 1.1.7(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
- '@radix-ui/react-id': 1.1.1(@types/react@18.3.18)(react@18.3.1)
- '@radix-ui/react-popper': 1.2.8(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
- '@radix-ui/react-portal': 1.1.9(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
- '@radix-ui/react-presence': 1.1.5(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
- '@radix-ui/react-primitive': 2.1.3(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
- '@radix-ui/react-roving-focus': 1.1.11(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
- '@radix-ui/react-slot': 1.2.3(@types/react@18.3.18)(react@18.3.1)
- '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@18.3.18)(react@18.3.1)
- aria-hidden: 1.2.4
- react: 18.3.1
- react-dom: 18.3.1(react@18.3.1)
- react-remove-scroll: 2.6.3(@types/react@18.3.18)(react@18.3.1)
- optionalDependencies:
- '@types/react': 18.3.18
- '@types/react-dom': 18.3.5(@types/react@18.3.18)
-
- '@radix-ui/react-menubar@1.1.16(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)':
- dependencies:
- '@radix-ui/primitive': 1.1.3
- '@radix-ui/react-collection': 1.1.7(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
- '@radix-ui/react-compose-refs': 1.1.2(@types/react@18.3.18)(react@18.3.1)
- '@radix-ui/react-context': 1.1.2(@types/react@18.3.18)(react@18.3.1)
- '@radix-ui/react-direction': 1.1.1(@types/react@18.3.18)(react@18.3.1)
- '@radix-ui/react-id': 1.1.1(@types/react@18.3.18)(react@18.3.1)
- '@radix-ui/react-menu': 2.1.16(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
- '@radix-ui/react-primitive': 2.1.3(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
- '@radix-ui/react-roving-focus': 1.1.11(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
- '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@18.3.18)(react@18.3.1)
- react: 18.3.1
- react-dom: 18.3.1(react@18.3.1)
- optionalDependencies:
- '@types/react': 18.3.18
- '@types/react-dom': 18.3.5(@types/react@18.3.18)
-
- '@radix-ui/react-navigation-menu@1.2.14(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)':
- dependencies:
- '@radix-ui/primitive': 1.1.3
- '@radix-ui/react-collection': 1.1.7(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
- '@radix-ui/react-compose-refs': 1.1.2(@types/react@18.3.18)(react@18.3.1)
- '@radix-ui/react-context': 1.1.2(@types/react@18.3.18)(react@18.3.1)
- '@radix-ui/react-direction': 1.1.1(@types/react@18.3.18)(react@18.3.1)
- '@radix-ui/react-dismissable-layer': 1.1.11(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
- '@radix-ui/react-id': 1.1.1(@types/react@18.3.18)(react@18.3.1)
- '@radix-ui/react-presence': 1.1.5(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
- '@radix-ui/react-primitive': 2.1.3(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
- '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@18.3.18)(react@18.3.1)
- '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@18.3.18)(react@18.3.1)
- '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@18.3.18)(react@18.3.1)
- '@radix-ui/react-use-previous': 1.1.1(@types/react@18.3.18)(react@18.3.1)
- '@radix-ui/react-visually-hidden': 1.2.3(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
- react: 18.3.1
- react-dom: 18.3.1(react@18.3.1)
- optionalDependencies:
- '@types/react': 18.3.18
- '@types/react-dom': 18.3.5(@types/react@18.3.18)
-
- '@radix-ui/react-one-time-password-field@0.1.8(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)':
- dependencies:
- '@radix-ui/number': 1.1.1
- '@radix-ui/primitive': 1.1.3
- '@radix-ui/react-collection': 1.1.7(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
- '@radix-ui/react-compose-refs': 1.1.2(@types/react@18.3.18)(react@18.3.1)
- '@radix-ui/react-context': 1.1.2(@types/react@18.3.18)(react@18.3.1)
- '@radix-ui/react-direction': 1.1.1(@types/react@18.3.18)(react@18.3.1)
- '@radix-ui/react-primitive': 2.1.3(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
- '@radix-ui/react-roving-focus': 1.1.11(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
- '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@18.3.18)(react@18.3.1)
- '@radix-ui/react-use-effect-event': 0.0.2(@types/react@18.3.18)(react@18.3.1)
- '@radix-ui/react-use-is-hydrated': 0.1.0(@types/react@18.3.18)(react@18.3.1)
- '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@18.3.18)(react@18.3.1)
- react: 18.3.1
- react-dom: 18.3.1(react@18.3.1)
- optionalDependencies:
- '@types/react': 18.3.18
- '@types/react-dom': 18.3.5(@types/react@18.3.18)
-
- '@radix-ui/react-password-toggle-field@0.1.3(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)':
- dependencies:
- '@radix-ui/primitive': 1.1.3
- '@radix-ui/react-compose-refs': 1.1.2(@types/react@18.3.18)(react@18.3.1)
- '@radix-ui/react-context': 1.1.2(@types/react@18.3.18)(react@18.3.1)
- '@radix-ui/react-id': 1.1.1(@types/react@18.3.18)(react@18.3.1)
- '@radix-ui/react-primitive': 2.1.3(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
- '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@18.3.18)(react@18.3.1)
- '@radix-ui/react-use-effect-event': 0.0.2(@types/react@18.3.18)(react@18.3.1)
- '@radix-ui/react-use-is-hydrated': 0.1.0(@types/react@18.3.18)(react@18.3.1)
- react: 18.3.1
- react-dom: 18.3.1(react@18.3.1)
- optionalDependencies:
- '@types/react': 18.3.18
- '@types/react-dom': 18.3.5(@types/react@18.3.18)
-
- '@radix-ui/react-popover@1.1.15(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)':
- dependencies:
- '@radix-ui/primitive': 1.1.3
- '@radix-ui/react-compose-refs': 1.1.2(@types/react@18.3.18)(react@18.3.1)
- '@radix-ui/react-context': 1.1.2(@types/react@18.3.18)(react@18.3.1)
- '@radix-ui/react-dismissable-layer': 1.1.11(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
- '@radix-ui/react-focus-guards': 1.1.3(@types/react@18.3.18)(react@18.3.1)
- '@radix-ui/react-focus-scope': 1.1.7(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
- '@radix-ui/react-id': 1.1.1(@types/react@18.3.18)(react@18.3.1)
- '@radix-ui/react-popper': 1.2.8(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
- '@radix-ui/react-portal': 1.1.9(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
- '@radix-ui/react-presence': 1.1.5(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
- '@radix-ui/react-primitive': 2.1.3(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
- '@radix-ui/react-slot': 1.2.3(@types/react@18.3.18)(react@18.3.1)
- '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@18.3.18)(react@18.3.1)
- aria-hidden: 1.2.4
- react: 18.3.1
- react-dom: 18.3.1(react@18.3.1)
- react-remove-scroll: 2.6.3(@types/react@18.3.18)(react@18.3.1)
- optionalDependencies:
- '@types/react': 18.3.18
- '@types/react-dom': 18.3.5(@types/react@18.3.18)
-
- '@radix-ui/react-popper@1.2.8(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)':
- dependencies:
- '@floating-ui/react-dom': 2.1.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
- '@radix-ui/react-arrow': 1.1.7(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
- '@radix-ui/react-compose-refs': 1.1.2(@types/react@18.3.18)(react@18.3.1)
- '@radix-ui/react-context': 1.1.2(@types/react@18.3.18)(react@18.3.1)
- '@radix-ui/react-primitive': 2.1.3(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
- '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@18.3.18)(react@18.3.1)
- '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@18.3.18)(react@18.3.1)
- '@radix-ui/react-use-rect': 1.1.1(@types/react@18.3.18)(react@18.3.1)
- '@radix-ui/react-use-size': 1.1.1(@types/react@18.3.18)(react@18.3.1)
- '@radix-ui/rect': 1.1.1
- react: 18.3.1
- react-dom: 18.3.1(react@18.3.1)
- optionalDependencies:
- '@types/react': 18.3.18
- '@types/react-dom': 18.3.5(@types/react@18.3.18)
-
- '@radix-ui/react-portal@1.1.9(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)':
- dependencies:
- '@radix-ui/react-primitive': 2.1.3(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
- '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@18.3.18)(react@18.3.1)
- react: 18.3.1
- react-dom: 18.3.1(react@18.3.1)
- optionalDependencies:
- '@types/react': 18.3.18
- '@types/react-dom': 18.3.5(@types/react@18.3.18)
-
- '@radix-ui/react-presence@1.1.5(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)':
- dependencies:
- '@radix-ui/react-compose-refs': 1.1.2(@types/react@18.3.18)(react@18.3.1)
- '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@18.3.18)(react@18.3.1)
- react: 18.3.1
- react-dom: 18.3.1(react@18.3.1)
- optionalDependencies:
- '@types/react': 18.3.18
- '@types/react-dom': 18.3.5(@types/react@18.3.18)
-
- '@radix-ui/react-primitive@2.0.2(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)':
- dependencies:
- '@radix-ui/react-slot': 1.1.2(@types/react@18.3.18)(react@18.3.1)
- react: 18.3.1
- react-dom: 18.3.1(react@18.3.1)
- optionalDependencies:
- '@types/react': 18.3.18
- '@types/react-dom': 18.3.5(@types/react@18.3.18)
-
- '@radix-ui/react-primitive@2.1.3(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)':
- dependencies:
- '@radix-ui/react-slot': 1.2.3(@types/react@18.3.18)(react@18.3.1)
- react: 18.3.1
- react-dom: 18.3.1(react@18.3.1)
- optionalDependencies:
- '@types/react': 18.3.18
- '@types/react-dom': 18.3.5(@types/react@18.3.18)
-
- '@radix-ui/react-progress@1.1.7(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)':
- dependencies:
- '@radix-ui/react-context': 1.1.2(@types/react@18.3.18)(react@18.3.1)
- '@radix-ui/react-primitive': 2.1.3(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
- react: 18.3.1
- react-dom: 18.3.1(react@18.3.1)
- optionalDependencies:
- '@types/react': 18.3.18
- '@types/react-dom': 18.3.5(@types/react@18.3.18)
-
- '@radix-ui/react-radio-group@1.3.8(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)':
- dependencies:
- '@radix-ui/primitive': 1.1.3
- '@radix-ui/react-compose-refs': 1.1.2(@types/react@18.3.18)(react@18.3.1)
- '@radix-ui/react-context': 1.1.2(@types/react@18.3.18)(react@18.3.1)
- '@radix-ui/react-direction': 1.1.1(@types/react@18.3.18)(react@18.3.1)
- '@radix-ui/react-presence': 1.1.5(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
- '@radix-ui/react-primitive': 2.1.3(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
- '@radix-ui/react-roving-focus': 1.1.11(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
- '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@18.3.18)(react@18.3.1)
- '@radix-ui/react-use-previous': 1.1.1(@types/react@18.3.18)(react@18.3.1)
- '@radix-ui/react-use-size': 1.1.1(@types/react@18.3.18)(react@18.3.1)
- react: 18.3.1
- react-dom: 18.3.1(react@18.3.1)
- optionalDependencies:
- '@types/react': 18.3.18
- '@types/react-dom': 18.3.5(@types/react@18.3.18)
-
- '@radix-ui/react-roving-focus@1.1.11(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)':
- dependencies:
- '@radix-ui/primitive': 1.1.3
- '@radix-ui/react-collection': 1.1.7(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
- '@radix-ui/react-compose-refs': 1.1.2(@types/react@18.3.18)(react@18.3.1)
- '@radix-ui/react-context': 1.1.2(@types/react@18.3.18)(react@18.3.1)
- '@radix-ui/react-direction': 1.1.1(@types/react@18.3.18)(react@18.3.1)
- '@radix-ui/react-id': 1.1.1(@types/react@18.3.18)(react@18.3.1)
- '@radix-ui/react-primitive': 2.1.3(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
- '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@18.3.18)(react@18.3.1)
- '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@18.3.18)(react@18.3.1)
- react: 18.3.1
- react-dom: 18.3.1(react@18.3.1)
- optionalDependencies:
- '@types/react': 18.3.18
- '@types/react-dom': 18.3.5(@types/react@18.3.18)
-
- '@radix-ui/react-scroll-area@1.2.10(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)':
- dependencies:
- '@radix-ui/number': 1.1.1
- '@radix-ui/primitive': 1.1.3
- '@radix-ui/react-compose-refs': 1.1.2(@types/react@18.3.18)(react@18.3.1)
- '@radix-ui/react-context': 1.1.2(@types/react@18.3.18)(react@18.3.1)
- '@radix-ui/react-direction': 1.1.1(@types/react@18.3.18)(react@18.3.1)
- '@radix-ui/react-presence': 1.1.5(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
- '@radix-ui/react-primitive': 2.1.3(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
- '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@18.3.18)(react@18.3.1)
- '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@18.3.18)(react@18.3.1)
- react: 18.3.1
- react-dom: 18.3.1(react@18.3.1)
- optionalDependencies:
- '@types/react': 18.3.18
- '@types/react-dom': 18.3.5(@types/react@18.3.18)
-
- '@radix-ui/react-select@2.2.6(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)':
- dependencies:
- '@radix-ui/number': 1.1.1
- '@radix-ui/primitive': 1.1.3
- '@radix-ui/react-collection': 1.1.7(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
- '@radix-ui/react-compose-refs': 1.1.2(@types/react@18.3.18)(react@18.3.1)
- '@radix-ui/react-context': 1.1.2(@types/react@18.3.18)(react@18.3.1)
- '@radix-ui/react-direction': 1.1.1(@types/react@18.3.18)(react@18.3.1)
- '@radix-ui/react-dismissable-layer': 1.1.11(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
- '@radix-ui/react-focus-guards': 1.1.3(@types/react@18.3.18)(react@18.3.1)
- '@radix-ui/react-focus-scope': 1.1.7(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
- '@radix-ui/react-id': 1.1.1(@types/react@18.3.18)(react@18.3.1)
- '@radix-ui/react-popper': 1.2.8(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
- '@radix-ui/react-portal': 1.1.9(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
- '@radix-ui/react-primitive': 2.1.3(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
- '@radix-ui/react-slot': 1.2.3(@types/react@18.3.18)(react@18.3.1)
- '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@18.3.18)(react@18.3.1)
- '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@18.3.18)(react@18.3.1)
- '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@18.3.18)(react@18.3.1)
- '@radix-ui/react-use-previous': 1.1.1(@types/react@18.3.18)(react@18.3.1)
- '@radix-ui/react-visually-hidden': 1.2.3(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
- aria-hidden: 1.2.4
- react: 18.3.1
- react-dom: 18.3.1(react@18.3.1)
- react-remove-scroll: 2.6.3(@types/react@18.3.18)(react@18.3.1)
- optionalDependencies:
- '@types/react': 18.3.18
- '@types/react-dom': 18.3.5(@types/react@18.3.18)
-
- '@radix-ui/react-separator@1.1.7(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)':
- dependencies:
- '@radix-ui/react-primitive': 2.1.3(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
- react: 18.3.1
- react-dom: 18.3.1(react@18.3.1)
- optionalDependencies:
- '@types/react': 18.3.18
- '@types/react-dom': 18.3.5(@types/react@18.3.18)
-
- '@radix-ui/react-slider@1.3.6(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)':
- dependencies:
- '@radix-ui/number': 1.1.1
- '@radix-ui/primitive': 1.1.3
- '@radix-ui/react-collection': 1.1.7(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
- '@radix-ui/react-compose-refs': 1.1.2(@types/react@18.3.18)(react@18.3.1)
- '@radix-ui/react-context': 1.1.2(@types/react@18.3.18)(react@18.3.1)
- '@radix-ui/react-direction': 1.1.1(@types/react@18.3.18)(react@18.3.1)
- '@radix-ui/react-primitive': 2.1.3(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
- '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@18.3.18)(react@18.3.1)
- '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@18.3.18)(react@18.3.1)
- '@radix-ui/react-use-previous': 1.1.1(@types/react@18.3.18)(react@18.3.1)
- '@radix-ui/react-use-size': 1.1.1(@types/react@18.3.18)(react@18.3.1)
- react: 18.3.1
- react-dom: 18.3.1(react@18.3.1)
- optionalDependencies:
- '@types/react': 18.3.18
- '@types/react-dom': 18.3.5(@types/react@18.3.18)
+ '@rolldown/binding-android-arm64@1.1.5':
+ optional: true
- '@radix-ui/react-slot@1.1.2(@types/react@18.3.18)(react@18.3.1)':
- dependencies:
- '@radix-ui/react-compose-refs': 1.1.1(@types/react@18.3.18)(react@18.3.1)
- react: 18.3.1
- optionalDependencies:
- '@types/react': 18.3.18
+ '@rolldown/binding-darwin-arm64@1.1.5':
+ optional: true
- '@radix-ui/react-slot@1.2.3(@types/react@18.3.18)(react@18.3.1)':
- dependencies:
- '@radix-ui/react-compose-refs': 1.1.2(@types/react@18.3.18)(react@18.3.1)
- react: 18.3.1
- optionalDependencies:
- '@types/react': 18.3.18
-
- '@radix-ui/react-switch@1.2.6(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)':
- dependencies:
- '@radix-ui/primitive': 1.1.3
- '@radix-ui/react-compose-refs': 1.1.2(@types/react@18.3.18)(react@18.3.1)
- '@radix-ui/react-context': 1.1.2(@types/react@18.3.18)(react@18.3.1)
- '@radix-ui/react-primitive': 2.1.3(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
- '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@18.3.18)(react@18.3.1)
- '@radix-ui/react-use-previous': 1.1.1(@types/react@18.3.18)(react@18.3.1)
- '@radix-ui/react-use-size': 1.1.1(@types/react@18.3.18)(react@18.3.1)
- react: 18.3.1
- react-dom: 18.3.1(react@18.3.1)
- optionalDependencies:
- '@types/react': 18.3.18
- '@types/react-dom': 18.3.5(@types/react@18.3.18)
-
- '@radix-ui/react-tabs@1.1.13(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)':
- dependencies:
- '@radix-ui/primitive': 1.1.3
- '@radix-ui/react-context': 1.1.2(@types/react@18.3.18)(react@18.3.1)
- '@radix-ui/react-direction': 1.1.1(@types/react@18.3.18)(react@18.3.1)
- '@radix-ui/react-id': 1.1.1(@types/react@18.3.18)(react@18.3.1)
- '@radix-ui/react-presence': 1.1.5(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
- '@radix-ui/react-primitive': 2.1.3(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
- '@radix-ui/react-roving-focus': 1.1.11(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
- '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@18.3.18)(react@18.3.1)
- react: 18.3.1
- react-dom: 18.3.1(react@18.3.1)
- optionalDependencies:
- '@types/react': 18.3.18
- '@types/react-dom': 18.3.5(@types/react@18.3.18)
-
- '@radix-ui/react-toast@1.2.15(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)':
- dependencies:
- '@radix-ui/primitive': 1.1.3
- '@radix-ui/react-collection': 1.1.7(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
- '@radix-ui/react-compose-refs': 1.1.2(@types/react@18.3.18)(react@18.3.1)
- '@radix-ui/react-context': 1.1.2(@types/react@18.3.18)(react@18.3.1)
- '@radix-ui/react-dismissable-layer': 1.1.11(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
- '@radix-ui/react-portal': 1.1.9(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
- '@radix-ui/react-presence': 1.1.5(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
- '@radix-ui/react-primitive': 2.1.3(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
- '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@18.3.18)(react@18.3.1)
- '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@18.3.18)(react@18.3.1)
- '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@18.3.18)(react@18.3.1)
- '@radix-ui/react-visually-hidden': 1.2.3(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
- react: 18.3.1
- react-dom: 18.3.1(react@18.3.1)
- optionalDependencies:
- '@types/react': 18.3.18
- '@types/react-dom': 18.3.5(@types/react@18.3.18)
-
- '@radix-ui/react-toggle-group@1.1.11(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)':
- dependencies:
- '@radix-ui/primitive': 1.1.3
- '@radix-ui/react-context': 1.1.2(@types/react@18.3.18)(react@18.3.1)
- '@radix-ui/react-direction': 1.1.1(@types/react@18.3.18)(react@18.3.1)
- '@radix-ui/react-primitive': 2.1.3(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
- '@radix-ui/react-roving-focus': 1.1.11(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
- '@radix-ui/react-toggle': 1.1.10(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
- '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@18.3.18)(react@18.3.1)
- react: 18.3.1
- react-dom: 18.3.1(react@18.3.1)
- optionalDependencies:
- '@types/react': 18.3.18
- '@types/react-dom': 18.3.5(@types/react@18.3.18)
+ '@rolldown/binding-darwin-x64@1.1.5':
+ optional: true
- '@radix-ui/react-toggle@1.1.10(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)':
- dependencies:
- '@radix-ui/primitive': 1.1.3
- '@radix-ui/react-primitive': 2.1.3(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
- '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@18.3.18)(react@18.3.1)
- react: 18.3.1
- react-dom: 18.3.1(react@18.3.1)
- optionalDependencies:
- '@types/react': 18.3.18
- '@types/react-dom': 18.3.5(@types/react@18.3.18)
-
- '@radix-ui/react-toolbar@1.1.11(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)':
- dependencies:
- '@radix-ui/primitive': 1.1.3
- '@radix-ui/react-context': 1.1.2(@types/react@18.3.18)(react@18.3.1)
- '@radix-ui/react-direction': 1.1.1(@types/react@18.3.18)(react@18.3.1)
- '@radix-ui/react-primitive': 2.1.3(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
- '@radix-ui/react-roving-focus': 1.1.11(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
- '@radix-ui/react-separator': 1.1.7(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
- '@radix-ui/react-toggle-group': 1.1.11(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
- react: 18.3.1
- react-dom: 18.3.1(react@18.3.1)
- optionalDependencies:
- '@types/react': 18.3.18
- '@types/react-dom': 18.3.5(@types/react@18.3.18)
-
- '@radix-ui/react-tooltip@1.2.8(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)':
- dependencies:
- '@radix-ui/primitive': 1.1.3
- '@radix-ui/react-compose-refs': 1.1.2(@types/react@18.3.18)(react@18.3.1)
- '@radix-ui/react-context': 1.1.2(@types/react@18.3.18)(react@18.3.1)
- '@radix-ui/react-dismissable-layer': 1.1.11(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
- '@radix-ui/react-id': 1.1.1(@types/react@18.3.18)(react@18.3.1)
- '@radix-ui/react-popper': 1.2.8(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
- '@radix-ui/react-portal': 1.1.9(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
- '@radix-ui/react-presence': 1.1.5(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
- '@radix-ui/react-primitive': 2.1.3(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
- '@radix-ui/react-slot': 1.2.3(@types/react@18.3.18)(react@18.3.1)
- '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@18.3.18)(react@18.3.1)
- '@radix-ui/react-visually-hidden': 1.2.3(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
- react: 18.3.1
- react-dom: 18.3.1(react@18.3.1)
- optionalDependencies:
- '@types/react': 18.3.18
- '@types/react-dom': 18.3.5(@types/react@18.3.18)
+ '@rolldown/binding-freebsd-x64@1.1.5':
+ optional: true
- '@radix-ui/react-use-callback-ref@1.1.1(@types/react@18.3.18)(react@18.3.1)':
- dependencies:
- react: 18.3.1
- optionalDependencies:
- '@types/react': 18.3.18
+ '@rolldown/binding-linux-arm-gnueabihf@1.1.5':
+ optional: true
- '@radix-ui/react-use-controllable-state@1.2.2(@types/react@18.3.18)(react@18.3.1)':
- dependencies:
- '@radix-ui/react-use-effect-event': 0.0.2(@types/react@18.3.18)(react@18.3.1)
- '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@18.3.18)(react@18.3.1)
- react: 18.3.1
- optionalDependencies:
- '@types/react': 18.3.18
+ '@rolldown/binding-linux-arm64-gnu@1.1.5':
+ optional: true
- '@radix-ui/react-use-effect-event@0.0.2(@types/react@18.3.18)(react@18.3.1)':
- dependencies:
- '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@18.3.18)(react@18.3.1)
- react: 18.3.1
- optionalDependencies:
- '@types/react': 18.3.18
+ '@rolldown/binding-linux-arm64-musl@1.1.5':
+ optional: true
- '@radix-ui/react-use-escape-keydown@1.1.1(@types/react@18.3.18)(react@18.3.1)':
- dependencies:
- '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@18.3.18)(react@18.3.1)
- react: 18.3.1
- optionalDependencies:
- '@types/react': 18.3.18
+ '@rolldown/binding-linux-ppc64-gnu@1.1.5':
+ optional: true
- '@radix-ui/react-use-is-hydrated@0.1.0(@types/react@18.3.18)(react@18.3.1)':
- dependencies:
- react: 18.3.1
- use-sync-external-store: 1.6.0(react@18.3.1)
- optionalDependencies:
- '@types/react': 18.3.18
+ '@rolldown/binding-linux-s390x-gnu@1.1.5':
+ optional: true
- '@radix-ui/react-use-layout-effect@1.1.0(@types/react@18.3.18)(react@18.3.1)':
- dependencies:
- react: 18.3.1
- optionalDependencies:
- '@types/react': 18.3.18
+ '@rolldown/binding-linux-x64-gnu@1.1.5':
+ optional: true
- '@radix-ui/react-use-layout-effect@1.1.1(@types/react@18.3.18)(react@18.3.1)':
- dependencies:
- react: 18.3.1
- optionalDependencies:
- '@types/react': 18.3.18
+ '@rolldown/binding-linux-x64-musl@1.1.5':
+ optional: true
- '@radix-ui/react-use-previous@1.1.1(@types/react@18.3.18)(react@18.3.1)':
- dependencies:
- react: 18.3.1
- optionalDependencies:
- '@types/react': 18.3.18
+ '@rolldown/binding-openharmony-arm64@1.1.5':
+ optional: true
- '@radix-ui/react-use-rect@1.1.1(@types/react@18.3.18)(react@18.3.1)':
+ '@rolldown/binding-wasm32-wasi@1.1.5':
dependencies:
- '@radix-ui/rect': 1.1.1
- react: 18.3.1
- optionalDependencies:
- '@types/react': 18.3.18
+ '@emnapi/core': 1.11.1
+ '@emnapi/runtime': 1.11.1
+ '@napi-rs/wasm-runtime': 1.1.6(@emnapi/core@1.11.1)(@emnapi/runtime@1.11.1)
+ optional: true
- '@radix-ui/react-use-size@1.1.1(@types/react@18.3.18)(react@18.3.1)':
- dependencies:
- '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@18.3.18)(react@18.3.1)
- react: 18.3.1
- optionalDependencies:
- '@types/react': 18.3.18
+ '@rolldown/binding-win32-arm64-msvc@1.1.5':
+ optional: true
- '@radix-ui/react-visually-hidden@1.2.3(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)':
- dependencies:
- '@radix-ui/react-primitive': 2.1.3(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
- react: 18.3.1
- react-dom: 18.3.1(react@18.3.1)
- optionalDependencies:
- '@types/react': 18.3.18
- '@types/react-dom': 18.3.5(@types/react@18.3.18)
+ '@rolldown/binding-win32-x64-msvc@1.1.5':
+ optional: true
- '@radix-ui/rect@1.1.1': {}
+ '@rolldown/pluginutils@1.0.1': {}
'@sec-ant/readable-stream@0.4.1': {}
@@ -4978,134 +3819,321 @@ snapshots:
'@swc/helpers@0.5.15':
dependencies:
tslib: 2.8.1
+ optional: true
- '@t3-oss/env-core@0.13.10(typescript@5.7.3)(zod@4.3.5)':
- optionalDependencies:
- typescript: 5.7.3
- zod: 4.3.5
-
- '@t3-oss/env-nextjs@0.13.10(typescript@5.7.3)(zod@4.3.5)':
+ '@tailwindcss/node@4.3.2':
dependencies:
- '@t3-oss/env-core': 0.13.10(typescript@5.7.3)(zod@4.3.5)
- optionalDependencies:
- typescript: 5.7.3
- zod: 4.3.5
+ '@jridgewell/remapping': 2.3.5
+ enhanced-resolve: 5.21.6
+ jiti: 2.7.0
+ lightningcss: 1.32.0
+ magic-string: 0.30.21
+ source-map-js: 1.2.1
+ tailwindcss: 4.3.2
- '@tabby_ai/hijri-converter@1.0.5': {}
+ '@tailwindcss/oxide-android-arm64@4.3.2':
+ optional: true
- '@tailwindcss/node@4.1.4':
- dependencies:
- enhanced-resolve: 5.18.1
- jiti: 2.4.2
- lightningcss: 1.29.2
- tailwindcss: 4.1.4
+ '@tailwindcss/oxide-darwin-arm64@4.3.2':
+ optional: true
- '@tailwindcss/oxide-android-arm64@4.1.4':
+ '@tailwindcss/oxide-darwin-x64@4.3.2':
optional: true
- '@tailwindcss/oxide-darwin-arm64@4.1.4':
+ '@tailwindcss/oxide-freebsd-x64@4.3.2':
optional: true
- '@tailwindcss/oxide-darwin-x64@4.1.4':
+ '@tailwindcss/oxide-linux-arm-gnueabihf@4.3.2':
optional: true
- '@tailwindcss/oxide-freebsd-x64@4.1.4':
+ '@tailwindcss/oxide-linux-arm64-gnu@4.3.2':
optional: true
- '@tailwindcss/oxide-linux-arm-gnueabihf@4.1.4':
+ '@tailwindcss/oxide-linux-arm64-musl@4.3.2':
optional: true
- '@tailwindcss/oxide-linux-arm64-gnu@4.1.4':
+ '@tailwindcss/oxide-linux-x64-gnu@4.3.2':
optional: true
- '@tailwindcss/oxide-linux-arm64-musl@4.1.4':
+ '@tailwindcss/oxide-linux-x64-musl@4.3.2':
optional: true
- '@tailwindcss/oxide-linux-x64-gnu@4.1.4':
+ '@tailwindcss/oxide-wasm32-wasi@4.3.2':
optional: true
- '@tailwindcss/oxide-linux-x64-musl@4.1.4':
+ '@tailwindcss/oxide-win32-arm64-msvc@4.3.2':
optional: true
- '@tailwindcss/oxide-wasm32-wasi@4.1.4':
+ '@tailwindcss/oxide-win32-x64-msvc@4.3.2':
optional: true
- '@tailwindcss/oxide-win32-arm64-msvc@4.1.4':
- optional: true
+ '@tailwindcss/oxide@4.3.2':
+ optionalDependencies:
+ '@tailwindcss/oxide-android-arm64': 4.3.2
+ '@tailwindcss/oxide-darwin-arm64': 4.3.2
+ '@tailwindcss/oxide-darwin-x64': 4.3.2
+ '@tailwindcss/oxide-freebsd-x64': 4.3.2
+ '@tailwindcss/oxide-linux-arm-gnueabihf': 4.3.2
+ '@tailwindcss/oxide-linux-arm64-gnu': 4.3.2
+ '@tailwindcss/oxide-linux-arm64-musl': 4.3.2
+ '@tailwindcss/oxide-linux-x64-gnu': 4.3.2
+ '@tailwindcss/oxide-linux-x64-musl': 4.3.2
+ '@tailwindcss/oxide-wasm32-wasi': 4.3.2
+ '@tailwindcss/oxide-win32-arm64-msvc': 4.3.2
+ '@tailwindcss/oxide-win32-x64-msvc': 4.3.2
+
+ '@tailwindcss/vite@4.3.2(vite@8.1.4(@types/node@22.20.1)(jiti@2.7.0))':
+ dependencies:
+ '@tailwindcss/node': 4.3.2
+ '@tailwindcss/oxide': 4.3.2
+ tailwindcss: 4.3.2
+ vite: 8.1.4(@types/node@22.20.1)(jiti@2.7.0)
+
+ '@tanstack/history@1.162.0': {}
+
+ '@tanstack/react-router@1.170.17(react-dom@19.2.7(react@19.2.7))(react@19.2.7)':
+ dependencies:
+ '@tanstack/history': 1.162.0
+ '@tanstack/react-store': 0.9.3(react-dom@19.2.7(react@19.2.7))(react@19.2.7)
+ '@tanstack/router-core': 1.171.14
+ isbot: 5.2.0
+ react: 19.2.7
+ react-dom: 19.2.7(react@19.2.7)
+
+ '@tanstack/react-start-client@1.168.15(react-dom@19.2.7(react@19.2.7))(react@19.2.7)':
+ dependencies:
+ '@tanstack/react-router': 1.170.17(react-dom@19.2.7(react@19.2.7))(react@19.2.7)
+ '@tanstack/router-core': 1.171.14
+ '@tanstack/start-client-core': 1.170.13
+ react: 19.2.7
+ react-dom: 19.2.7(react@19.2.7)
+
+ '@tanstack/react-start-rsc@0.1.26(crossws@0.4.9(srvx@0.11.21))(react-dom@19.2.7(react@19.2.7))(react@19.2.7)(rolldown@1.1.5)(vite@8.1.4(@types/node@22.20.1)(jiti@2.7.0))':
+ dependencies:
+ '@tanstack/react-router': 1.170.17(react-dom@19.2.7(react@19.2.7))(react@19.2.7)
+ '@tanstack/router-core': 1.171.14
+ '@tanstack/router-utils': 1.162.2
+ '@tanstack/start-client-core': 1.170.13
+ '@tanstack/start-fn-stubs': 1.162.0
+ '@tanstack/start-plugin-core': 1.171.19(@tanstack/react-router@1.170.17(react-dom@19.2.7(react@19.2.7))(react@19.2.7))(crossws@0.4.9(srvx@0.11.21))(rolldown@1.1.5)(vite@8.1.4(@types/node@22.20.1)(jiti@2.7.0))
+ '@tanstack/start-server-core': 1.169.16(crossws@0.4.9(srvx@0.11.21))
+ '@tanstack/start-storage-context': 1.167.16
+ pathe: 2.0.3
+ react: 19.2.7
+ react-dom: 19.2.7(react@19.2.7)
+ transitivePeerDependencies:
+ - '@farmfe/core'
+ - '@rsbuild/core'
+ - bun-types-no-globals
+ - crossws
+ - esbuild
+ - rolldown
+ - rollup
+ - supports-color
+ - unloader
+ - vite
+ - vite-plugin-solid
+ - webpack
+
+ '@tanstack/react-start-server@1.167.21(crossws@0.4.9(srvx@0.11.21))(react-dom@19.2.7(react@19.2.7))(react@19.2.7)':
+ dependencies:
+ '@tanstack/react-router': 1.170.17(react-dom@19.2.7(react@19.2.7))(react@19.2.7)
+ '@tanstack/router-core': 1.171.14
+ '@tanstack/start-server-core': 1.169.16(crossws@0.4.9(srvx@0.11.21))
+ react: 19.2.7
+ react-dom: 19.2.7(react@19.2.7)
+ transitivePeerDependencies:
+ - crossws
+
+ '@tanstack/react-start@1.168.27(crossws@0.4.9(srvx@0.11.21))(react-dom@19.2.7(react@19.2.7))(react@19.2.7)(rolldown@1.1.5)(vite@8.1.4(@types/node@22.20.1)(jiti@2.7.0))':
+ dependencies:
+ '@tanstack/react-router': 1.170.17(react-dom@19.2.7(react@19.2.7))(react@19.2.7)
+ '@tanstack/react-start-client': 1.168.15(react-dom@19.2.7(react@19.2.7))(react@19.2.7)
+ '@tanstack/react-start-rsc': 0.1.26(crossws@0.4.9(srvx@0.11.21))(react-dom@19.2.7(react@19.2.7))(react@19.2.7)(rolldown@1.1.5)(vite@8.1.4(@types/node@22.20.1)(jiti@2.7.0))
+ '@tanstack/react-start-server': 1.167.21(crossws@0.4.9(srvx@0.11.21))(react-dom@19.2.7(react@19.2.7))(react@19.2.7)
+ '@tanstack/router-utils': 1.162.2
+ '@tanstack/start-client-core': 1.170.13
+ '@tanstack/start-plugin-core': 1.171.19(@tanstack/react-router@1.170.17(react-dom@19.2.7(react@19.2.7))(react@19.2.7))(crossws@0.4.9(srvx@0.11.21))(rolldown@1.1.5)(vite@8.1.4(@types/node@22.20.1)(jiti@2.7.0))
+ '@tanstack/start-server-core': 1.169.16(crossws@0.4.9(srvx@0.11.21))
+ pathe: 2.0.3
+ react: 19.2.7
+ react-dom: 19.2.7(react@19.2.7)
+ optionalDependencies:
+ vite: 8.1.4(@types/node@22.20.1)(jiti@2.7.0)
+ transitivePeerDependencies:
+ - '@farmfe/core'
+ - '@rspack/core'
+ - bun-types-no-globals
+ - crossws
+ - esbuild
+ - react-server-dom-rspack
+ - rolldown
+ - rollup
+ - supports-color
+ - unloader
+ - vite-plugin-solid
+ - webpack
+
+ '@tanstack/react-store@0.11.0(react-dom@19.2.7(react@19.2.7))(react@19.2.7)':
+ dependencies:
+ '@tanstack/store': 0.11.0
+ react: 19.2.7
+ react-dom: 19.2.7(react@19.2.7)
+ use-sync-external-store: 1.6.0(react@19.2.7)
+
+ '@tanstack/react-store@0.9.3(react-dom@19.2.7(react@19.2.7))(react@19.2.7)':
+ dependencies:
+ '@tanstack/store': 0.9.3
+ react: 19.2.7
+ react-dom: 19.2.7(react@19.2.7)
+ use-sync-external-store: 1.6.0(react@19.2.7)
+
+ '@tanstack/react-table@9.0.0-beta.38(react-dom@19.2.7(react@19.2.7))(react@19.2.7)':
+ dependencies:
+ '@tanstack/react-store': 0.11.0(react-dom@19.2.7(react@19.2.7))(react@19.2.7)
+ '@tanstack/table-core': 9.0.0-beta.38
+ react: 19.2.7
+ transitivePeerDependencies:
+ - react-dom
+
+ '@tanstack/router-core@1.171.14':
+ dependencies:
+ '@tanstack/history': 1.162.0
+ cookie-es: 3.1.1
+ seroval: 1.5.5
+ seroval-plugins: 1.5.5(seroval@1.5.5)
+
+ '@tanstack/router-generator@1.167.18':
+ dependencies:
+ '@babel/types': 7.29.0
+ '@tanstack/router-core': 1.171.14
+ '@tanstack/router-utils': 1.162.2
+ '@tanstack/virtual-file-routes': 1.162.0
+ jiti: 2.7.0
+ magic-string: 0.30.21
+ prettier: 3.9.5
+ zod: 4.4.3
+ transitivePeerDependencies:
+ - supports-color
+
+ '@tanstack/router-plugin@1.168.19(@tanstack/react-router@1.170.17(react-dom@19.2.7(react@19.2.7))(react@19.2.7))(rolldown@1.1.5)(vite@8.1.4(@types/node@22.20.1)(jiti@2.7.0))':
+ dependencies:
+ '@babel/core': 7.29.0
+ '@babel/template': 7.28.6
+ '@babel/types': 7.29.0
+ '@tanstack/router-core': 1.171.14
+ '@tanstack/router-generator': 1.167.18
+ '@tanstack/router-utils': 1.162.2
+ chokidar: 5.0.0
+ unplugin: 3.3.0(rolldown@1.1.5)(vite@8.1.4(@types/node@22.20.1)(jiti@2.7.0))
+ zod: 4.4.3
+ optionalDependencies:
+ '@tanstack/react-router': 1.170.17(react-dom@19.2.7(react@19.2.7))(react@19.2.7)
+ vite: 8.1.4(@types/node@22.20.1)(jiti@2.7.0)
+ transitivePeerDependencies:
+ - '@farmfe/core'
+ - '@rspack/core'
+ - bun-types-no-globals
+ - esbuild
+ - rolldown
+ - rollup
+ - supports-color
+ - unloader
+
+ '@tanstack/router-utils@1.162.2':
+ dependencies:
+ '@babel/generator': 7.29.1
+ '@babel/parser': 7.29.2
+ '@babel/types': 7.29.0
+ ansis: 4.3.1
+ babel-dead-code-elimination: 1.0.12
+ diff: 8.0.4
+ pathe: 2.0.3
+ tinyglobby: 0.2.17
+ transitivePeerDependencies:
+ - supports-color
+
+ '@tanstack/start-client-core@1.170.13':
+ dependencies:
+ '@tanstack/router-core': 1.171.14
+ '@tanstack/start-fn-stubs': 1.162.0
+ '@tanstack/start-storage-context': 1.167.16
+ seroval: 1.5.5
- '@tailwindcss/oxide-win32-x64-msvc@4.1.4':
- optional: true
+ '@tanstack/start-fn-stubs@1.162.0': {}
- '@tailwindcss/oxide@4.1.4':
+ '@tanstack/start-plugin-core@1.171.19(@tanstack/react-router@1.170.17(react-dom@19.2.7(react@19.2.7))(react@19.2.7))(crossws@0.4.9(srvx@0.11.21))(rolldown@1.1.5)(vite@8.1.4(@types/node@22.20.1)(jiti@2.7.0))':
+ dependencies:
+ '@babel/code-frame': 7.27.1
+ '@babel/core': 7.29.0
+ '@babel/types': 7.29.0
+ '@tanstack/router-core': 1.171.14
+ '@tanstack/router-generator': 1.167.18
+ '@tanstack/router-plugin': 1.168.19(@tanstack/react-router@1.170.17(react-dom@19.2.7(react@19.2.7))(react@19.2.7))(rolldown@1.1.5)(vite@8.1.4(@types/node@22.20.1)(jiti@2.7.0))
+ '@tanstack/router-utils': 1.162.2
+ '@tanstack/start-server-core': 1.169.16(crossws@0.4.9(srvx@0.11.21))
+ exsolve: 1.1.0
+ lightningcss: 1.32.0
+ pathe: 2.0.3
+ picomatch: 4.0.4
+ seroval: 1.5.5
+ source-map: 0.7.6
+ srvx: 0.11.21
+ tinyglobby: 0.2.17
+ ufo: 1.6.4
+ vitefu: 1.1.3(vite@8.1.4(@types/node@22.20.1)(jiti@2.7.0))
+ xmlbuilder2: 4.0.3
+ zod: 4.4.3
optionalDependencies:
- '@tailwindcss/oxide-android-arm64': 4.1.4
- '@tailwindcss/oxide-darwin-arm64': 4.1.4
- '@tailwindcss/oxide-darwin-x64': 4.1.4
- '@tailwindcss/oxide-freebsd-x64': 4.1.4
- '@tailwindcss/oxide-linux-arm-gnueabihf': 4.1.4
- '@tailwindcss/oxide-linux-arm64-gnu': 4.1.4
- '@tailwindcss/oxide-linux-arm64-musl': 4.1.4
- '@tailwindcss/oxide-linux-x64-gnu': 4.1.4
- '@tailwindcss/oxide-linux-x64-musl': 4.1.4
- '@tailwindcss/oxide-wasm32-wasi': 4.1.4
- '@tailwindcss/oxide-win32-arm64-msvc': 4.1.4
- '@tailwindcss/oxide-win32-x64-msvc': 4.1.4
-
- '@tailwindcss/postcss@4.1.4':
- dependencies:
- '@alloc/quick-lru': 5.2.0
- '@tailwindcss/node': 4.1.4
- '@tailwindcss/oxide': 4.1.4
- postcss: 8.5.2
- tailwindcss: 4.1.4
-
- '@tanstack/query-core@5.90.19':
- optional: true
+ vite: 8.1.4(@types/node@22.20.1)(jiti@2.7.0)
+ transitivePeerDependencies:
+ - '@farmfe/core'
+ - '@rspack/core'
+ - '@tanstack/react-router'
+ - bun-types-no-globals
+ - crossws
+ - esbuild
+ - rolldown
+ - rollup
+ - supports-color
+ - unloader
+ - vite-plugin-solid
+ - webpack
+
+ '@tanstack/start-server-core@1.169.16(crossws@0.4.9(srvx@0.11.21))':
+ dependencies:
+ '@tanstack/history': 1.162.0
+ '@tanstack/router-core': 1.171.14
+ '@tanstack/start-client-core': 1.170.13
+ '@tanstack/start-storage-context': 1.167.16
+ fetchdts: 0.1.7
+ h3-v2: h3@2.0.1-rc.20(crossws@0.4.9(srvx@0.11.21))
+ seroval: 1.5.5
+ transitivePeerDependencies:
+ - crossws
- '@tanstack/react-query@5.90.19(react@18.3.1)':
+ '@tanstack/start-storage-context@1.167.16':
dependencies:
- '@tanstack/query-core': 5.90.19
- react: 18.3.1
- optional: true
+ '@tanstack/router-core': 1.171.14
- '@tanstack/react-table@8.21.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1)':
- dependencies:
- '@tanstack/table-core': 8.21.2
- react: 18.3.1
- react-dom: 18.3.1(react@18.3.1)
+ '@tanstack/store@0.11.0': {}
- '@tanstack/table-core@8.21.2': {}
+ '@tanstack/store@0.9.3': {}
- '@trpc/client@11.5.1(@trpc/server@11.5.1(typescript@5.7.3))(typescript@5.7.3)':
+ '@tanstack/table-core@9.0.0-beta.38':
dependencies:
- '@trpc/server': 11.5.1(typescript@5.7.3)
- typescript: 5.7.3
+ '@tanstack/store': 0.11.0
- '@trpc/next@11.5.1(@tanstack/react-query@5.90.19(react@18.3.1))(@trpc/client@11.5.1(@trpc/server@11.5.1(typescript@5.7.3))(typescript@5.7.3))(@trpc/react-query@11.5.1(@tanstack/react-query@5.90.19(react@18.3.1))(@trpc/client@11.5.1(@trpc/server@11.5.1(typescript@5.7.3))(typescript@5.7.3))(@trpc/server@11.5.1(typescript@5.7.3))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.7.3))(@trpc/server@11.5.1(typescript@5.7.3))(next@15.5.18(@babel/core@7.29.0)(babel-plugin-react-compiler@1.0.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.7.3)':
- dependencies:
- '@trpc/client': 11.5.1(@trpc/server@11.5.1(typescript@5.7.3))(typescript@5.7.3)
- '@trpc/server': 11.5.1(typescript@5.7.3)
- next: 15.5.18(@babel/core@7.29.0)(babel-plugin-react-compiler@1.0.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
- react: 18.3.1
- react-dom: 18.3.1(react@18.3.1)
- typescript: 5.7.3
- optionalDependencies:
- '@tanstack/react-query': 5.90.19(react@18.3.1)
- '@trpc/react-query': 11.5.1(@tanstack/react-query@5.90.19(react@18.3.1))(@trpc/client@11.5.1(@trpc/server@11.5.1(typescript@5.7.3))(typescript@5.7.3))(@trpc/server@11.5.1(typescript@5.7.3))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.7.3)
+ '@tanstack/virtual-file-routes@1.162.0': {}
- '@trpc/react-query@11.5.1(@tanstack/react-query@5.90.19(react@18.3.1))(@trpc/client@11.5.1(@trpc/server@11.5.1(typescript@5.7.3))(typescript@5.7.3))(@trpc/server@11.5.1(typescript@5.7.3))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.7.3)':
+ '@trpc/client@11.5.1(@trpc/server@11.5.1(typescript@6.0.3))(typescript@6.0.3)':
dependencies:
- '@tanstack/react-query': 5.90.19(react@18.3.1)
- '@trpc/client': 11.5.1(@trpc/server@11.5.1(typescript@5.7.3))(typescript@5.7.3)
- '@trpc/server': 11.5.1(typescript@5.7.3)
- react: 18.3.1
- react-dom: 18.3.1(react@18.3.1)
- typescript: 5.7.3
- optional: true
+ '@trpc/server': 11.5.1(typescript@6.0.3)
+ typescript: 6.0.3
- '@trpc/server@11.5.1(typescript@5.7.3)':
+ '@trpc/server@11.5.1(typescript@6.0.3)':
dependencies:
- typescript: 5.7.3
+ typescript: 6.0.3
'@ts-morph/common@0.27.0':
dependencies:
@@ -5113,24 +4141,22 @@ snapshots:
minimatch: 10.2.5
path-browserify: 1.0.1
- '@types/node@20.17.19':
+ '@tybys/wasm-util@0.10.3':
dependencies:
- undici-types: 6.19.8
-
- '@types/prismjs@1.26.5': {}
-
- '@types/prop-types@15.7.14': {}
+ tslib: 2.8.1
+ optional: true
- '@types/react-dom@18.3.5(@types/react@18.3.18)':
+ '@types/node@22.20.1':
dependencies:
- '@types/react': 18.3.18
+ undici-types: 6.21.0
- '@types/react@18.3.18':
+ '@types/react-dom@19.2.3(@types/react@19.2.17)':
dependencies:
- '@types/prop-types': 15.7.14
- csstype: 3.1.3
+ '@types/react': 19.2.17
- '@types/statuses@2.0.6': {}
+ '@types/react@19.2.17':
+ dependencies:
+ csstype: 3.2.3
'@types/validate-npm-package-name@4.0.2': {}
@@ -5140,38 +4166,43 @@ snapshots:
dependencies:
'@types/webidl-conversions': 7.0.3
+ '@vitejs/plugin-react@6.0.3(babel-plugin-react-compiler@1.0.0)(vite@8.1.4(@types/node@22.20.1)(jiti@2.7.0))':
+ dependencies:
+ '@rolldown/pluginutils': 1.0.1
+ vite: 8.1.4(@types/node@22.20.1)(jiti@2.7.0)
+ optionalDependencies:
+ babel-plugin-react-compiler: 1.0.0
+
accepts@2.0.0:
dependencies:
mime-types: 3.0.2
negotiator: 1.0.0
- agent-base@7.1.4: {}
+ ajv-formats@2.1.1(ajv@8.20.0):
+ optionalDependencies:
+ ajv: 8.20.0
- ajv-formats@3.0.1(ajv@8.18.0):
+ ajv-formats@3.0.1(ajv@8.20.0):
optionalDependencies:
- ajv: 8.18.0
+ ajv: 8.20.0
- ajv@8.18.0:
+ ajv@8.20.0:
dependencies:
fast-deep-equal: 3.1.3
- fast-uri: 3.1.0
+ fast-uri: 3.1.3
json-schema-traverse: 1.0.0
require-from-string: 2.0.2
+ ansi-colors@4.1.3: {}
+
ansi-regex@5.0.1: {}
ansi-regex@6.2.2: {}
- ansi-styles@4.3.0:
- dependencies:
- color-convert: 2.0.1
+ ansis@4.3.1: {}
argparse@2.0.1: {}
- aria-hidden@1.2.4:
- dependencies:
- tslib: 2.8.1
-
asn1js@3.0.7:
dependencies:
pvtsutils: 1.3.6
@@ -5182,15 +4213,27 @@ snapshots:
dependencies:
tslib: 2.8.1
+ atomically@1.7.0: {}
+
+ babel-dead-code-elimination@1.0.12:
+ dependencies:
+ '@babel/core': 7.29.0
+ '@babel/parser': 7.29.2
+ '@babel/traverse': 7.29.0
+ '@babel/types': 7.29.0
+ transitivePeerDependencies:
+ - supports-color
+
babel-plugin-react-compiler@1.0.0:
dependencies:
- '@babel/types': 7.28.2
+ '@babel/types': 7.29.7
+ optional: true
balanced-match@4.0.4: {}
baseline-browser-mapping@2.10.16: {}
- better-auth@1.5.5(mongodb@7.1.0)(next@15.5.18(@babel/core@7.29.0)(babel-plugin-react-compiler@1.0.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1):
+ better-auth@1.5.5(@tanstack/react-start@1.168.27(crossws@0.4.9(srvx@0.11.21))(react-dom@19.2.7(react@19.2.7))(react@19.2.7)(rolldown@1.1.5)(vite@8.1.4(@types/node@22.20.1)(jiti@2.7.0)))(mongodb@7.1.0)(next@15.5.18(@babel/core@7.29.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.7(react@19.2.7))(react@19.2.7))(react-dom@19.2.7(react@19.2.7))(react@19.2.7)(solid-js@1.9.14):
dependencies:
'@better-auth/core': 1.5.5(@better-auth/utils@0.3.1)(@better-fetch/fetch@1.1.21)(better-call@1.3.2(zod@4.3.6))(jose@6.1.3)(kysely@0.28.12)(nanostores@1.2.0)
'@better-auth/drizzle-adapter': 1.5.5(@better-auth/core@1.5.5(@better-auth/utils@0.3.1)(@better-fetch/fetch@1.1.21)(better-call@1.3.2(zod@4.3.6))(jose@6.1.3)(kysely@0.28.12)(nanostores@1.2.0))(@better-auth/utils@0.3.1)
@@ -5210,10 +4253,12 @@ snapshots:
nanostores: 1.2.0
zod: 4.3.6
optionalDependencies:
+ '@tanstack/react-start': 1.168.27(crossws@0.4.9(srvx@0.11.21))(react-dom@19.2.7(react@19.2.7))(react@19.2.7)(rolldown@1.1.5)(vite@8.1.4(@types/node@22.20.1)(jiti@2.7.0))
mongodb: 7.1.0
- next: 15.5.18(@babel/core@7.29.0)(babel-plugin-react-compiler@1.0.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
- react: 18.3.1
- react-dom: 18.3.1(react@18.3.1)
+ next: 15.5.18(@babel/core@7.29.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)
+ react: 19.2.7
+ react-dom: 19.2.7(react@19.2.7)
+ solid-js: 1.9.14
transitivePeerDependencies:
- '@cloudflare/workers-types'
@@ -5226,21 +4271,21 @@ snapshots:
optionalDependencies:
zod: 4.3.5
- body-parser@2.2.2:
+ body-parser@2.3.0:
dependencies:
bytes: 3.1.2
- content-type: 1.0.5
+ content-type: 2.0.0
debug: 4.4.3
http-errors: 2.0.1
- iconv-lite: 0.7.2
+ iconv-lite: 0.7.3
on-finished: 2.4.1
- qs: 6.15.1
+ qs: 6.15.3
raw-body: 3.0.2
- type-is: 2.0.1
+ type-is: 2.1.0
transitivePeerDependencies:
- supports-color
- brace-expansion@5.0.5:
+ brace-expansion@5.0.7:
dependencies:
balanced-match: 4.0.4
@@ -5280,6 +4325,10 @@ snapshots:
chalk@5.6.2: {}
+ chokidar@5.0.0:
+ dependencies:
+ readdirp: 5.0.0
+
class-variance-authority@0.7.1:
dependencies:
clsx: 2.1.1
@@ -5290,54 +4339,46 @@ snapshots:
cli-spinners@2.9.2: {}
- cli-width@4.1.0: {}
-
- client-only@0.0.1: {}
-
- cliui@8.0.1:
- dependencies:
- string-width: 4.2.3
- strip-ansi: 6.0.1
- wrap-ansi: 7.0.0
+ client-only@0.0.1:
+ optional: true
clsx@2.1.1: {}
- cmdk@1.1.1(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1):
- dependencies:
- '@radix-ui/react-compose-refs': 1.1.1(@types/react@18.3.18)(react@18.3.1)
- '@radix-ui/react-dialog': 1.1.15(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
- '@radix-ui/react-id': 1.1.0(@types/react@18.3.18)(react@18.3.1)
- '@radix-ui/react-primitive': 2.0.2(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
- react: 18.3.1
- react-dom: 18.3.1(react@18.3.1)
- transitivePeerDependencies:
- - '@types/react'
- - '@types/react-dom'
-
code-block-writer@13.0.3: {}
- color-convert@2.0.1:
- dependencies:
- color-name: 1.1.4
-
- color-name@1.1.4: {}
-
commander@11.1.0: {}
commander@14.0.3: {}
+ conf@10.2.0:
+ dependencies:
+ ajv: 8.20.0
+ ajv-formats: 2.1.1(ajv@8.20.0)
+ atomically: 1.7.0
+ debounce-fn: 4.0.0
+ dot-prop: 6.0.1
+ env-paths: 2.2.1
+ json-schema-typed: 7.0.3
+ onetime: 5.1.2
+ pkg-up: 3.1.0
+ semver: 7.8.2
+
+ consola@3.4.2: {}
+
content-disposition@1.1.0: {}
content-type@1.0.5: {}
+ content-type@2.0.0: {}
+
convert-source-map@2.0.0: {}
+ cookie-es@3.1.1: {}
+
cookie-signature@1.2.2: {}
cookie@0.7.2: {}
- cookie@1.1.1: {}
-
copy-anything@3.0.5:
dependencies:
is-what: 4.1.16
@@ -5347,14 +4388,14 @@ snapshots:
object-assign: 4.1.1
vary: 1.1.2
- cosmiconfig@9.0.1(typescript@5.7.3):
+ cosmiconfig@9.0.2(typescript@6.0.3):
dependencies:
env-paths: 2.2.1
import-fresh: 3.3.1
js-yaml: 4.1.1
parse-json: 5.2.0
optionalDependencies:
- typescript: 5.7.3
+ typescript: 6.0.3
cross-spawn@7.0.6:
dependencies:
@@ -5362,15 +4403,19 @@ snapshots:
shebang-command: 2.0.0
which: 2.0.2
- cssesc@3.0.0: {}
+ crossws@0.4.9(srvx@0.11.21):
+ optionalDependencies:
+ srvx: 0.11.21
- csstype@3.1.3: {}
+ cssesc@3.0.0: {}
- data-uri-to-buffer@4.0.1: {}
+ csstype@3.2.3: {}
- date-fns-jalali@4.1.0-0: {}
+ db0@0.3.4: {}
- date-fns@4.1.0: {}
+ debounce-fn@4.0.0:
+ dependencies:
+ mimic-fn: 3.1.0
debug@4.4.3:
dependencies:
@@ -5387,6 +4432,8 @@ snapshots:
bundle-name: 4.1.0
default-browser-id: 5.0.1
+ define-lazy-prop@2.0.0: {}
+
define-lazy-prop@3.0.0: {}
defu@6.1.4: {}
@@ -5395,11 +4442,13 @@ snapshots:
detect-libc@2.1.2: {}
- detect-node-es@1.1.0: {}
-
diff@8.0.4: {}
- dotenv@17.4.1: {}
+ dot-prop@6.0.1:
+ dependencies:
+ is-obj: 2.0.0
+
+ dotenv@17.4.2: {}
dunder-proto@1.0.1:
dependencies:
@@ -5407,30 +4456,33 @@ snapshots:
es-errors: 1.3.0
gopd: 1.2.0
- eciesjs@0.4.18:
- dependencies:
- '@ecies/ciphers': 0.2.6(@noble/ciphers@1.3.0)
- '@noble/ciphers': 1.3.0
- '@noble/curves': 1.9.7
- '@noble/hashes': 1.8.0
-
ee-first@1.1.1: {}
electron-to-chromium@1.5.334: {}
emoji-regex@10.6.0: {}
- emoji-regex@8.0.0: {}
-
encodeurl@2.0.0: {}
- enhanced-resolve@5.18.1:
+ enhanced-resolve@5.21.6:
dependencies:
graceful-fs: 4.2.11
- tapable: 2.2.1
+ tapable: 2.3.3
+
+ enquirer@2.4.1:
+ dependencies:
+ ansi-colors: 4.1.3
+ strip-ansi: 6.0.1
env-paths@2.2.1: {}
+ env-runner@0.1.16:
+ dependencies:
+ crossws: 0.4.9(srvx@0.11.21)
+ exsolve: 1.1.0
+ httpxy: 0.5.5
+ srvx: 0.11.21
+
error-ex@1.3.4:
dependencies:
is-arrayish: 0.2.1
@@ -5439,7 +4491,7 @@ snapshots:
es-errors@1.3.0: {}
- es-object-atoms@1.1.1:
+ es-object-atoms@1.1.2:
dependencies:
es-errors: 1.3.0
@@ -5451,11 +4503,11 @@ snapshots:
etag@1.8.1: {}
- eventsource-parser@3.0.6: {}
+ eventsource-parser@3.1.0: {}
eventsource@3.0.7:
dependencies:
- eventsource-parser: 3.0.6
+ eventsource-parser: 3.1.0
execa@5.1.1:
dependencies:
@@ -5484,15 +4536,15 @@ snapshots:
strip-final-newline: 4.0.0
yoctocolors: 2.1.2
- express-rate-limit@8.3.2(express@5.2.1):
+ express-rate-limit@8.5.2(express@5.2.1):
dependencies:
express: 5.2.1
- ip-address: 10.1.0
+ ip-address: 10.2.0
express@5.2.1:
dependencies:
accepts: 2.0.0
- body-parser: 2.2.2
+ body-parser: 2.3.0
content-disposition: 1.1.0
content-type: 1.0.5
cookie: 0.7.2
@@ -5511,17 +4563,19 @@ snapshots:
once: 1.4.0
parseurl: 1.3.3
proxy-addr: 2.0.7
- qs: 6.15.1
- range-parser: 1.2.1
+ qs: 6.15.3
+ range-parser: 1.3.0
router: 2.2.0
send: 1.2.1
serve-static: 2.2.1
statuses: 2.0.2
- type-is: 2.0.1
+ type-is: 2.1.0
vary: 1.1.2
transitivePeerDependencies:
- supports-color
+ exsolve@1.1.0: {}
+
fast-deep-equal@3.1.3: {}
fast-glob@3.3.3:
@@ -5532,20 +4586,17 @@ snapshots:
merge2: 1.4.1
micromatch: 4.0.8
- fast-uri@3.1.0: {}
+ fast-uri@3.1.3: {}
fastq@1.20.1:
dependencies:
reusify: 1.1.0
- fdir@6.5.0(picomatch@4.0.4):
+ fdir@6.5.0(picomatch@4.0.5):
optionalDependencies:
- picomatch: 4.0.4
+ picomatch: 4.0.5
- fetch-blob@3.2.0:
- dependencies:
- node-domexception: 1.0.0
- web-streams-polyfill: 3.3.3
+ fetchdts@0.1.7: {}
figures@6.1.0:
dependencies:
@@ -5566,55 +4617,50 @@ snapshots:
transitivePeerDependencies:
- supports-color
- formdata-polyfill@4.0.10:
+ find-up@3.0.0:
dependencies:
- fetch-blob: 3.2.0
+ locate-path: 3.0.0
forwarded@0.2.0: {}
fresh@2.0.0: {}
- fs-extra@11.3.4:
+ fs-extra@11.3.6:
dependencies:
graceful-fs: 4.2.11
- jsonfile: 6.2.0
+ jsonfile: 6.2.1
universalify: 2.0.1
+ fsevents@2.3.3:
+ optional: true
+
function-bind@1.1.2: {}
fuzzysort@3.1.0: {}
- geist@1.3.1(next@15.5.18(@babel/core@7.29.0)(babel-plugin-react-compiler@1.0.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)):
- dependencies:
- next: 15.5.18(@babel/core@7.29.0)(babel-plugin-react-compiler@1.0.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
-
gensync@1.0.0-beta.2: {}
- get-caller-file@2.0.5: {}
-
- get-east-asian-width@1.5.0: {}
+ get-east-asian-width@1.6.0: {}
get-intrinsic@1.3.0:
dependencies:
call-bind-apply-helpers: 1.0.2
es-define-property: 1.0.1
es-errors: 1.3.0
- es-object-atoms: 1.1.1
+ es-object-atoms: 1.1.2
function-bind: 1.1.2
get-proto: 1.0.1
gopd: 1.2.0
has-symbols: 1.1.0
- hasown: 2.0.2
+ hasown: 2.0.4
math-intrinsics: 1.1.0
- get-nonce@1.0.1: {}
-
get-own-enumerable-keys@1.0.0: {}
get-proto@1.0.1:
dependencies:
dunder-proto: 1.0.1
- es-object-atoms: 1.1.1
+ es-object-atoms: 1.1.2
get-stream@6.0.1: {}
@@ -5631,17 +4677,29 @@ snapshots:
graceful-fs@4.2.11: {}
- graphql@16.13.2: {}
+ h3@2.0.1-rc.20(crossws@0.4.9(srvx@0.11.21)):
+ dependencies:
+ rou3: 0.8.1
+ srvx: 0.11.21
+ optionalDependencies:
+ crossws: 0.4.9(srvx@0.11.21)
+
+ h3@2.0.1-rc.22(crossws@0.4.9(srvx@0.11.21)):
+ dependencies:
+ rou3: 0.8.1
+ srvx: 0.11.21
+ optionalDependencies:
+ crossws: 0.4.9(srvx@0.11.21)
has-symbols@1.1.0: {}
- hasown@2.0.2:
+ hasown@2.0.4:
dependencies:
function-bind: 1.1.2
- headers-polyfill@4.0.3: {}
+ hono@4.12.29: {}
- hono@4.12.12: {}
+ hookable@6.1.1: {}
http-errors@2.0.1:
dependencies:
@@ -5651,18 +4709,13 @@ snapshots:
statuses: 2.0.2
toidentifier: 1.0.1
- https-proxy-agent@7.0.6:
- dependencies:
- agent-base: 7.1.4
- debug: 4.4.3
- transitivePeerDependencies:
- - supports-color
+ httpxy@0.5.5: {}
human-signals@2.1.0: {}
human-signals@8.0.1: {}
- iconv-lite@0.7.2:
+ iconv-lite@0.7.3:
dependencies:
safer-buffer: 2.1.2
@@ -5675,23 +4728,18 @@ snapshots:
inherits@2.0.4: {}
- input-otp@1.4.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1):
- dependencies:
- react: 18.3.1
- react-dom: 18.3.1(react@18.3.1)
-
- ip-address@10.1.0: {}
+ ip-address@10.2.0: {}
ipaddr.js@1.9.1: {}
is-arrayish@0.2.1: {}
+ is-docker@2.2.1: {}
+
is-docker@3.0.0: {}
is-extglob@2.1.1: {}
- is-fullwidth-code-point@3.0.0: {}
-
is-glob@4.0.3:
dependencies:
is-extglob: 2.1.1
@@ -5704,10 +4752,10 @@ snapshots:
is-interactive@2.0.0: {}
- is-node-process@1.2.0: {}
-
is-number@7.0.0: {}
+ is-obj@2.0.0: {}
+
is-obj@3.0.0: {}
is-plain-obj@4.1.0: {}
@@ -5726,15 +4774,21 @@ snapshots:
is-what@4.1.16: {}
+ is-wsl@2.2.0:
+ dependencies:
+ is-docker: 2.2.1
+
is-wsl@3.1.1:
dependencies:
is-inside-container: 1.0.0
+ isbot@5.2.0: {}
+
isexe@2.0.0: {}
isexe@3.1.5: {}
- jiti@2.4.2: {}
+ jiti@2.7.0: {}
jose@6.1.3: {}
@@ -5750,11 +4804,13 @@ snapshots:
json-schema-traverse@1.0.0: {}
+ json-schema-typed@7.0.3: {}
+
json-schema-typed@8.0.2: {}
json5@2.2.3: {}
- jsonfile@6.2.0:
+ jsonfile@6.2.1:
dependencies:
universalify: 2.0.1
optionalDependencies:
@@ -5766,69 +4822,78 @@ snapshots:
kysely@0.28.12: {}
- lightningcss-darwin-arm64@1.29.2:
+ lightningcss-android-arm64@1.32.0:
+ optional: true
+
+ lightningcss-darwin-arm64@1.32.0:
optional: true
- lightningcss-darwin-x64@1.29.2:
+ lightningcss-darwin-x64@1.32.0:
optional: true
- lightningcss-freebsd-x64@1.29.2:
+ lightningcss-freebsd-x64@1.32.0:
optional: true
- lightningcss-linux-arm-gnueabihf@1.29.2:
+ lightningcss-linux-arm-gnueabihf@1.32.0:
optional: true
- lightningcss-linux-arm64-gnu@1.29.2:
+ lightningcss-linux-arm64-gnu@1.32.0:
optional: true
- lightningcss-linux-arm64-musl@1.29.2:
+ lightningcss-linux-arm64-musl@1.32.0:
optional: true
- lightningcss-linux-x64-gnu@1.29.2:
+ lightningcss-linux-x64-gnu@1.32.0:
optional: true
- lightningcss-linux-x64-musl@1.29.2:
+ lightningcss-linux-x64-musl@1.32.0:
optional: true
- lightningcss-win32-arm64-msvc@1.29.2:
+ lightningcss-win32-arm64-msvc@1.32.0:
optional: true
- lightningcss-win32-x64-msvc@1.29.2:
+ lightningcss-win32-x64-msvc@1.32.0:
optional: true
- lightningcss@1.29.2:
+ lightningcss@1.32.0:
dependencies:
detect-libc: 2.1.2
optionalDependencies:
- lightningcss-darwin-arm64: 1.29.2
- lightningcss-darwin-x64: 1.29.2
- lightningcss-freebsd-x64: 1.29.2
- lightningcss-linux-arm-gnueabihf: 1.29.2
- lightningcss-linux-arm64-gnu: 1.29.2
- lightningcss-linux-arm64-musl: 1.29.2
- lightningcss-linux-x64-gnu: 1.29.2
- lightningcss-linux-x64-musl: 1.29.2
- lightningcss-win32-arm64-msvc: 1.29.2
- lightningcss-win32-x64-msvc: 1.29.2
+ lightningcss-android-arm64: 1.32.0
+ lightningcss-darwin-arm64: 1.32.0
+ lightningcss-darwin-x64: 1.32.0
+ lightningcss-freebsd-x64: 1.32.0
+ lightningcss-linux-arm-gnueabihf: 1.32.0
+ lightningcss-linux-arm64-gnu: 1.32.0
+ lightningcss-linux-arm64-musl: 1.32.0
+ lightningcss-linux-x64-gnu: 1.32.0
+ lightningcss-linux-x64-musl: 1.32.0
+ lightningcss-win32-arm64-msvc: 1.32.0
+ lightningcss-win32-x64-msvc: 1.32.0
lines-and-columns@1.2.4: {}
+ locate-path@3.0.0:
+ dependencies:
+ p-locate: 3.0.0
+ path-exists: 3.0.0
+
log-symbols@6.0.0:
dependencies:
chalk: 5.6.2
is-unicode-supported: 1.3.0
- loose-envify@1.4.0:
- dependencies:
- js-tokens: 4.0.0
-
lru-cache@5.1.1:
dependencies:
yallist: 3.1.1
- lucide-react@0.525.0(react@18.3.1):
+ lucide-react@0.545.0(react@19.2.7):
+ dependencies:
+ react: 19.2.7
+
+ magic-string@0.30.21:
dependencies:
- react: 18.3.1
+ '@jridgewell/sourcemap-codec': 1.5.5
math-intrinsics@1.1.0: {}
@@ -5855,11 +4920,13 @@ snapshots:
mimic-fn@2.1.0: {}
+ mimic-fn@3.1.0: {}
+
mimic-function@5.0.1: {}
minimatch@10.2.5:
dependencies:
- brace-expansion: 5.0.5
+ brace-expansion: 5.0.7
minimist@1.2.8: {}
@@ -5876,55 +4943,21 @@ snapshots:
ms@2.1.3: {}
- msw@2.13.2(@types/node@20.17.19)(typescript@5.7.3):
- dependencies:
- '@inquirer/confirm': 5.1.21(@types/node@20.17.19)
- '@mswjs/interceptors': 0.41.3
- '@open-draft/deferred-promise': 2.2.0
- '@types/statuses': 2.0.6
- cookie: 1.1.1
- graphql: 16.13.2
- headers-polyfill: 4.0.3
- is-node-process: 1.2.0
- outvariant: 1.4.3
- path-to-regexp: 6.3.0
- picocolors: 1.1.1
- rettime: 0.10.1
- statuses: 2.0.2
- strict-event-emitter: 0.5.1
- tough-cookie: 6.0.1
- type-fest: 5.5.0
- until-async: 3.0.2
- yargs: 17.7.2
- optionalDependencies:
- typescript: 5.7.3
- transitivePeerDependencies:
- - '@types/node'
-
- mute-stream@2.0.0: {}
-
nanoid@3.3.12: {}
- nanoid@3.3.8: {}
-
nanostores@1.2.0: {}
negotiator@1.0.0: {}
- next-themes@0.4.4(react-dom@18.3.1(react@18.3.1))(react@18.3.1):
- dependencies:
- react: 18.3.1
- react-dom: 18.3.1(react@18.3.1)
-
- next@15.5.18(@babel/core@7.29.0)(babel-plugin-react-compiler@1.0.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1):
+ next@15.5.18(@babel/core@7.29.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.7(react@19.2.7))(react@19.2.7):
dependencies:
'@next/env': 15.5.18
'@swc/helpers': 0.5.15
caniuse-lite: 1.0.30001797
postcss: 8.4.31
- react: 18.3.1
- react-dom: 18.3.1(react@18.3.1)
- styled-jsx: 5.1.6(@babel/core@7.29.0)(react@18.3.1)
+ react: 19.2.7
+ react-dom: 19.2.7(react@19.2.7)
+ styled-jsx: 5.1.6(@babel/core@7.29.0)(react@19.2.7)
optionalDependencies:
'@next/swc-darwin-arm64': 15.5.18
'@next/swc-darwin-x64': 15.5.18
@@ -5939,14 +4972,61 @@ snapshots:
transitivePeerDependencies:
- '@babel/core'
- babel-plugin-macros
+ optional: true
- node-domexception@1.0.0: {}
-
- node-fetch@3.3.2:
- dependencies:
- data-uri-to-buffer: 4.0.1
- fetch-blob: 3.2.0
- formdata-polyfill: 4.0.10
+ nf3@0.3.21: {}
+
+ nitro@3.0.260610-beta(chokidar@5.0.0)(dotenv@17.4.2)(jiti@2.7.0)(mongodb@7.1.0)(vite@8.1.4(@types/node@22.20.1)(jiti@2.7.0)):
+ dependencies:
+ consola: 3.4.2
+ crossws: 0.4.9(srvx@0.11.21)
+ db0: 0.3.4
+ env-runner: 0.1.16
+ h3: 2.0.1-rc.22(crossws@0.4.9(srvx@0.11.21))
+ hookable: 6.1.1
+ nf3: 0.3.21
+ ocache: 0.1.5
+ ofetch: 2.0.0-alpha.3
+ ohash: 2.0.11
+ rolldown: 1.1.5
+ srvx: 0.11.21
+ unenv: 2.0.0-rc.24
+ unstorage: 2.0.0-alpha.7(chokidar@5.0.0)(db0@0.3.4)(mongodb@7.1.0)(ofetch@2.0.0-alpha.3)
+ optionalDependencies:
+ dotenv: 17.4.2
+ jiti: 2.7.0
+ vite: 8.1.4(@types/node@22.20.1)(jiti@2.7.0)
+ transitivePeerDependencies:
+ - '@azure/app-configuration'
+ - '@azure/cosmos'
+ - '@azure/data-tables'
+ - '@azure/identity'
+ - '@azure/keyvault-secrets'
+ - '@azure/storage-blob'
+ - '@capacitor/preferences'
+ - '@deno/kv'
+ - '@electric-sql/pglite'
+ - '@libsql/client'
+ - '@netlify/blobs'
+ - '@netlify/runtime'
+ - '@planetscale/database'
+ - '@upstash/redis'
+ - '@vercel/blob'
+ - '@vercel/functions'
+ - '@vercel/kv'
+ - aws4fetch
+ - better-sqlite3
+ - chokidar
+ - drizzle-orm
+ - idb-keyval
+ - ioredis
+ - lru-cache
+ - miniflare
+ - mongodb
+ - mysql2
+ - sqlite3
+ - uploadthing
+ - wrangler
node-releases@2.0.37: {}
@@ -5965,6 +5045,14 @@ snapshots:
object-treeify@1.1.33: {}
+ ocache@0.1.5:
+ dependencies:
+ ohash: 2.0.11
+
+ ofetch@2.0.0-alpha.3: {}
+
+ ohash@2.0.11: {}
+
on-finished@2.4.1:
dependencies:
ee-first: 1.1.1
@@ -5990,6 +5078,12 @@ snapshots:
powershell-utils: 0.1.0
wsl-utils: 0.3.1
+ open@8.4.2:
+ dependencies:
+ define-lazy-prop: 2.0.0
+ is-docker: 2.2.1
+ is-wsl: 2.2.0
+
ora@8.2.0:
dependencies:
chalk: 5.6.2
@@ -6002,7 +5096,15 @@ snapshots:
string-width: 7.2.0
strip-ansi: 7.2.0
- outvariant@1.4.3: {}
+ p-limit@2.3.0:
+ dependencies:
+ p-try: 2.2.0
+
+ p-locate@3.0.0:
+ dependencies:
+ p-limit: 2.3.0
+
+ p-try@2.2.0: {}
parent-module@1.0.1:
dependencies:
@@ -6021,23 +5123,31 @@ snapshots:
path-browserify@1.0.1: {}
+ path-exists@3.0.0: {}
+
path-key@3.1.1: {}
path-key@4.0.0: {}
- path-to-regexp@6.3.0: {}
-
path-to-regexp@8.4.2: {}
+ pathe@2.0.3: {}
+
picocolors@1.1.1: {}
picomatch@2.3.2: {}
picomatch@4.0.4: {}
+ picomatch@4.0.5: {}
+
pkce-challenge@5.0.1: {}
- postcss-selector-parser@7.1.1:
+ pkg-up@3.1.0:
+ dependencies:
+ find-up: 3.0.0
+
+ postcss-selector-parser@7.1.4:
dependencies:
cssesc: 3.0.0
util-deprecate: 1.0.2
@@ -6047,33 +5157,22 @@ snapshots:
nanoid: 3.3.12
picocolors: 1.1.1
source-map-js: 1.2.1
+ optional: true
- postcss@8.5.2:
- dependencies:
- nanoid: 3.3.8
- picocolors: 1.1.1
- source-map-js: 1.2.1
-
- postcss@8.5.9:
+ postcss@8.5.16:
dependencies:
nanoid: 3.3.12
picocolors: 1.1.1
source-map-js: 1.2.1
- postgres@3.4.5: {}
-
powershell-utils@0.1.0: {}
+ prettier@3.9.5: {}
+
pretty-ms@9.3.0:
dependencies:
parse-ms: 4.0.0
- prism-react-renderer@2.4.1(react@18.3.1):
- dependencies:
- '@types/prismjs': 1.26.5
- clsx: 2.1.1
- react: 18.3.1
-
prompts@2.4.2:
dependencies:
kleur: 3.0.3
@@ -6092,138 +5191,32 @@ snapshots:
pvutils@1.1.5: {}
- qs@6.15.1:
+ qs@6.15.3:
dependencies:
- side-channel: 1.1.0
+ es-define-property: 1.0.1
+ side-channel: 1.1.1
queue-microtask@1.2.3: {}
- radix-ui@1.4.3(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1):
- dependencies:
- '@radix-ui/primitive': 1.1.3
- '@radix-ui/react-accessible-icon': 1.1.7(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
- '@radix-ui/react-accordion': 1.2.12(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
- '@radix-ui/react-alert-dialog': 1.1.15(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
- '@radix-ui/react-arrow': 1.1.7(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
- '@radix-ui/react-aspect-ratio': 1.1.7(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
- '@radix-ui/react-avatar': 1.1.10(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
- '@radix-ui/react-checkbox': 1.3.3(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
- '@radix-ui/react-collapsible': 1.1.12(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
- '@radix-ui/react-collection': 1.1.7(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
- '@radix-ui/react-compose-refs': 1.1.2(@types/react@18.3.18)(react@18.3.1)
- '@radix-ui/react-context': 1.1.2(@types/react@18.3.18)(react@18.3.1)
- '@radix-ui/react-context-menu': 2.2.16(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
- '@radix-ui/react-dialog': 1.1.15(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
- '@radix-ui/react-direction': 1.1.1(@types/react@18.3.18)(react@18.3.1)
- '@radix-ui/react-dismissable-layer': 1.1.11(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
- '@radix-ui/react-dropdown-menu': 2.1.16(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
- '@radix-ui/react-focus-guards': 1.1.3(@types/react@18.3.18)(react@18.3.1)
- '@radix-ui/react-focus-scope': 1.1.7(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
- '@radix-ui/react-form': 0.1.8(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
- '@radix-ui/react-hover-card': 1.1.15(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
- '@radix-ui/react-label': 2.1.7(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
- '@radix-ui/react-menu': 2.1.16(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
- '@radix-ui/react-menubar': 1.1.16(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
- '@radix-ui/react-navigation-menu': 1.2.14(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
- '@radix-ui/react-one-time-password-field': 0.1.8(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
- '@radix-ui/react-password-toggle-field': 0.1.3(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
- '@radix-ui/react-popover': 1.1.15(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
- '@radix-ui/react-popper': 1.2.8(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
- '@radix-ui/react-portal': 1.1.9(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
- '@radix-ui/react-presence': 1.1.5(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
- '@radix-ui/react-primitive': 2.1.3(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
- '@radix-ui/react-progress': 1.1.7(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
- '@radix-ui/react-radio-group': 1.3.8(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
- '@radix-ui/react-roving-focus': 1.1.11(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
- '@radix-ui/react-scroll-area': 1.2.10(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
- '@radix-ui/react-select': 2.2.6(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
- '@radix-ui/react-separator': 1.1.7(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
- '@radix-ui/react-slider': 1.3.6(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
- '@radix-ui/react-slot': 1.2.3(@types/react@18.3.18)(react@18.3.1)
- '@radix-ui/react-switch': 1.2.6(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
- '@radix-ui/react-tabs': 1.1.13(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
- '@radix-ui/react-toast': 1.2.15(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
- '@radix-ui/react-toggle': 1.1.10(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
- '@radix-ui/react-toggle-group': 1.1.11(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
- '@radix-ui/react-toolbar': 1.1.11(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
- '@radix-ui/react-tooltip': 1.2.8(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
- '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@18.3.18)(react@18.3.1)
- '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@18.3.18)(react@18.3.1)
- '@radix-ui/react-use-effect-event': 0.0.2(@types/react@18.3.18)(react@18.3.1)
- '@radix-ui/react-use-escape-keydown': 1.1.1(@types/react@18.3.18)(react@18.3.1)
- '@radix-ui/react-use-is-hydrated': 0.1.0(@types/react@18.3.18)(react@18.3.1)
- '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@18.3.18)(react@18.3.1)
- '@radix-ui/react-use-size': 1.1.1(@types/react@18.3.18)(react@18.3.1)
- '@radix-ui/react-visually-hidden': 1.2.3(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
- react: 18.3.1
- react-dom: 18.3.1(react@18.3.1)
- optionalDependencies:
- '@types/react': 18.3.18
- '@types/react-dom': 18.3.5(@types/react@18.3.18)
-
- range-parser@1.2.1: {}
+ range-parser@1.3.0: {}
raw-body@3.0.2:
dependencies:
bytes: 3.1.2
http-errors: 2.0.1
- iconv-lite: 0.7.2
+ iconv-lite: 0.7.3
unpipe: 1.0.0
- react-day-picker@9.14.0(react@18.3.1):
- dependencies:
- '@date-fns/tz': 1.4.1
- '@tabby_ai/hijri-converter': 1.0.5
- date-fns: 4.1.0
- date-fns-jalali: 4.1.0-0
- react: 18.3.1
-
- react-dom@18.3.1(react@18.3.1):
- dependencies:
- loose-envify: 1.4.0
- react: 18.3.1
- scheduler: 0.23.2
-
- react-error-boundary@6.1.0(react@18.3.1):
- dependencies:
- react: 18.3.1
-
- react-hook-form@7.55.0(react@18.3.1):
- dependencies:
- react: 18.3.1
-
- react-remove-scroll-bar@2.3.8(@types/react@18.3.18)(react@18.3.1):
- dependencies:
- react: 18.3.1
- react-style-singleton: 2.2.3(@types/react@18.3.18)(react@18.3.1)
- tslib: 2.8.1
- optionalDependencies:
- '@types/react': 18.3.18
-
- react-remove-scroll@2.6.3(@types/react@18.3.18)(react@18.3.1):
+ react-dom@19.2.7(react@19.2.7):
dependencies:
- react: 18.3.1
- react-remove-scroll-bar: 2.3.8(@types/react@18.3.18)(react@18.3.1)
- react-style-singleton: 2.2.3(@types/react@18.3.18)(react@18.3.1)
- tslib: 2.8.1
- use-callback-ref: 1.3.3(@types/react@18.3.18)(react@18.3.1)
- use-sidecar: 1.1.3(@types/react@18.3.18)(react@18.3.1)
- optionalDependencies:
- '@types/react': 18.3.18
+ react: 19.2.7
+ scheduler: 0.27.0
- react-style-singleton@2.2.3(@types/react@18.3.18)(react@18.3.1):
- dependencies:
- get-nonce: 1.0.1
- react: 18.3.1
- tslib: 2.8.1
- optionalDependencies:
- '@types/react': 18.3.18
+ react@19.2.7: {}
- react@18.3.1:
- dependencies:
- loose-envify: 1.4.0
+ readdirp@5.0.0: {}
- recast@0.23.11:
+ recast@0.23.12:
dependencies:
ast-types: 0.16.1
esprima: 4.0.1
@@ -6233,11 +5226,9 @@ snapshots:
reflect-metadata@0.2.2: {}
- require-directory@2.1.1: {}
-
require-from-string@2.0.2: {}
- reselect@5.1.1: {}
+ reselect@5.2.0: {}
resolve-from@4.0.0: {}
@@ -6246,12 +5237,33 @@ snapshots:
onetime: 7.0.0
signal-exit: 4.1.0
- rettime@0.10.1: {}
-
reusify@1.1.0: {}
+ rolldown@1.1.5:
+ dependencies:
+ '@oxc-project/types': 0.139.0
+ '@rolldown/pluginutils': 1.0.1
+ optionalDependencies:
+ '@rolldown/binding-android-arm64': 1.1.5
+ '@rolldown/binding-darwin-arm64': 1.1.5
+ '@rolldown/binding-darwin-x64': 1.1.5
+ '@rolldown/binding-freebsd-x64': 1.1.5
+ '@rolldown/binding-linux-arm-gnueabihf': 1.1.5
+ '@rolldown/binding-linux-arm64-gnu': 1.1.5
+ '@rolldown/binding-linux-arm64-musl': 1.1.5
+ '@rolldown/binding-linux-ppc64-gnu': 1.1.5
+ '@rolldown/binding-linux-s390x-gnu': 1.1.5
+ '@rolldown/binding-linux-x64-gnu': 1.1.5
+ '@rolldown/binding-linux-x64-musl': 1.1.5
+ '@rolldown/binding-openharmony-arm64': 1.1.5
+ '@rolldown/binding-wasm32-wasi': 1.1.5
+ '@rolldown/binding-win32-arm64-msvc': 1.1.5
+ '@rolldown/binding-win32-x64-msvc': 1.1.5
+
rou3@0.7.12: {}
+ rou3@0.8.1: {}
+
router@2.2.0:
dependencies:
debug: 4.4.3
@@ -6270,14 +5282,11 @@ snapshots:
safer-buffer@2.1.2: {}
- scheduler@0.23.2:
- dependencies:
- loose-envify: 1.4.0
+ scheduler@0.27.0: {}
semver@6.3.1: {}
- semver@7.8.2:
- optional: true
+ semver@7.8.2: {}
send@1.2.1:
dependencies:
@@ -6290,11 +5299,17 @@ snapshots:
mime-types: 3.0.2
ms: 2.1.3
on-finished: 2.4.1
- range-parser: 1.2.1
+ range-parser: 1.3.0
statuses: 2.0.2
transitivePeerDependencies:
- supports-color
+ seroval-plugins@1.5.5(seroval@1.5.5):
+ dependencies:
+ seroval: 1.5.5
+
+ seroval@1.5.5: {}
+
serve-static@2.2.1:
dependencies:
encodeurl: 2.0.0
@@ -6304,51 +5319,46 @@ snapshots:
transitivePeerDependencies:
- supports-color
- server-only@0.0.1: {}
-
set-cookie-parser@3.0.1: {}
setprototypeof@1.2.0: {}
- shadcn@4.2.0(@types/node@20.17.19)(typescript@5.7.3):
+ shadcn@4.13.0(typescript@6.0.3):
dependencies:
'@babel/core': 7.29.0
'@babel/parser': 7.29.2
- '@babel/plugin-transform-typescript': 7.28.6(@babel/core@7.29.0)
- '@babel/preset-typescript': 7.28.5(@babel/core@7.29.0)
- '@dotenvx/dotenvx': 1.61.0
+ '@babel/plugin-transform-typescript': 7.29.7(@babel/core@7.29.0)
+ '@babel/preset-typescript': 7.29.7(@babel/core@7.29.0)
+ '@dotenvx/dotenvx': 1.75.1
'@modelcontextprotocol/sdk': 1.29.0(zod@3.25.76)
'@types/validate-npm-package-name': 4.0.2
browserslist: 4.28.2
commander: 14.0.3
- cosmiconfig: 9.0.1(typescript@5.7.3)
+ cosmiconfig: 9.0.2(typescript@6.0.3)
dedent: 1.7.2
deepmerge: 4.3.1
diff: 8.0.4
execa: 9.6.1
fast-glob: 3.3.3
- fs-extra: 11.3.4
+ fs-extra: 11.3.6
fuzzysort: 3.1.0
- https-proxy-agent: 7.0.6
kleur: 4.1.5
- msw: 2.13.2(@types/node@20.17.19)(typescript@5.7.3)
- node-fetch: 3.3.2
open: 11.0.0
ora: 8.2.0
- postcss: 8.5.9
- postcss-selector-parser: 7.1.1
+ postcss: 8.5.16
+ postcss-selector-parser: 7.1.4
prompts: 2.4.2
- recast: 0.23.11
+ recast: 0.23.12
stringify-object: 5.0.0
- tailwind-merge: 3.0.1
+ tailwind-merge: 3.6.0
ts-morph: 26.0.0
tsconfig-paths: 4.2.0
+ undici: 7.28.0
validate-npm-package-name: 7.0.2
zod: 3.25.76
zod-to-json-schema: 3.25.2(zod@3.25.76)
transitivePeerDependencies:
- '@cfworker/json-schema'
- - '@types/node'
- babel-plugin-macros
- supports-color
- typescript
@@ -6411,7 +5421,7 @@ snapshots:
object-inspect: 1.13.4
side-channel-map: 1.0.1
- side-channel@1.1.0:
+ side-channel@1.1.1:
dependencies:
es-errors: 1.3.0
object-inspect: 1.13.4
@@ -6425,35 +5435,38 @@ snapshots:
sisteransi@1.0.5: {}
- sonner@2.0.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1):
+ solid-js@1.9.14:
dependencies:
- react: 18.3.1
- react-dom: 18.3.1(react@18.3.1)
+ csstype: 3.2.3
+ seroval: 1.5.5
+ seroval-plugins: 1.5.5(seroval@1.5.5)
+ optional: true
+
+ sonner@2.0.7(react-dom@19.2.7(react@19.2.7))(react@19.2.7):
+ dependencies:
+ react: 19.2.7
+ react-dom: 19.2.7(react@19.2.7)
source-map-js@1.2.1: {}
source-map@0.6.1: {}
+ source-map@0.7.6: {}
+
sparse-bitfield@3.0.3:
dependencies:
memory-pager: 1.5.0
+ srvx@0.11.21: {}
+
statuses@2.0.2: {}
stdin-discarder@0.2.2: {}
- strict-event-emitter@0.5.1: {}
-
- string-width@4.2.3:
- dependencies:
- emoji-regex: 8.0.0
- is-fullwidth-code-point: 3.0.0
- strip-ansi: 6.0.1
-
string-width@7.2.0:
dependencies:
emoji-regex: 10.6.0
- get-east-asian-width: 1.5.0
+ get-east-asian-width: 1.6.0
strip-ansi: 7.2.0
stringify-object@5.0.0:
@@ -6476,45 +5489,32 @@ snapshots:
strip-final-newline@4.0.0: {}
- styled-jsx@5.1.6(@babel/core@7.29.0)(react@18.3.1):
+ styled-jsx@5.1.6(@babel/core@7.29.0)(react@19.2.7):
dependencies:
client-only: 0.0.1
- react: 18.3.1
+ react: 19.2.7
optionalDependencies:
'@babel/core': 7.29.0
+ optional: true
superjson@2.2.2:
dependencies:
copy-anything: 3.0.5
- tabbable@6.4.0: {}
-
- tagged-tag@1.0.0: {}
-
- tailwind-merge@3.0.1: {}
+ systeminformation@5.31.15: {}
- tailwind-scrollbar@4.0.2(react@18.3.1)(tailwindcss@4.1.4):
- dependencies:
- prism-react-renderer: 2.4.1(react@18.3.1)
- tailwindcss: 4.1.4
- transitivePeerDependencies:
- - react
-
- tailwindcss-animate@1.0.7(tailwindcss@4.1.4):
- dependencies:
- tailwindcss: 4.1.4
+ tailwind-merge@3.6.0: {}
- tailwindcss@4.1.4: {}
+ tailwindcss@4.3.2: {}
- tapable@2.2.1: {}
+ tapable@2.3.3: {}
tiny-invariant@1.3.3: {}
- tldts-core@7.0.28: {}
-
- tldts@7.0.28:
+ tinyglobby@0.2.17:
dependencies:
- tldts-core: 7.0.28
+ fdir: 6.5.0(picomatch@4.0.5)
+ picomatch: 4.0.5
to-regex-range@5.0.1:
dependencies:
@@ -6522,10 +5522,6 @@ snapshots:
toidentifier@1.0.1: {}
- tough-cookie@6.0.1:
- dependencies:
- tldts: 7.0.28
-
tr46@5.1.1:
dependencies:
punycode: 2.3.1
@@ -6551,19 +5547,23 @@ snapshots:
tw-animate-css@1.4.0: {}
- type-fest@5.5.0:
- dependencies:
- tagged-tag: 1.0.0
-
- type-is@2.0.1:
+ type-is@2.1.0:
dependencies:
- content-type: 1.0.5
+ content-type: 2.0.0
media-typer: 1.1.0
mime-types: 3.0.2
- typescript@5.7.3: {}
+ typescript@6.0.3: {}
+
+ ufo@1.6.4: {}
+
+ undici-types@6.21.0: {}
- undici-types@6.19.8: {}
+ undici@7.28.0: {}
+
+ unenv@2.0.0-rc.24:
+ dependencies:
+ pathe: 2.0.3
unicorn-magic@0.3.0: {}
@@ -6571,7 +5571,21 @@ snapshots:
unpipe@1.0.0: {}
- until-async@3.0.2: {}
+ unplugin@3.3.0(rolldown@1.1.5)(vite@8.1.4(@types/node@22.20.1)(jiti@2.7.0)):
+ dependencies:
+ '@jridgewell/remapping': 2.3.5
+ picomatch: 4.0.4
+ webpack-virtual-modules: 0.6.2
+ optionalDependencies:
+ rolldown: 1.1.5
+ vite: 8.1.4(@types/node@22.20.1)(jiti@2.7.0)
+
+ unstorage@2.0.0-alpha.7(chokidar@5.0.0)(db0@0.3.4)(mongodb@7.1.0)(ofetch@2.0.0-alpha.3):
+ optionalDependencies:
+ chokidar: 5.0.0
+ db0: 0.3.4
+ mongodb: 7.1.0
+ ofetch: 2.0.0-alpha.3
update-browserslist-db@1.2.3(browserslist@4.28.2):
dependencies:
@@ -6579,24 +5593,9 @@ snapshots:
escalade: 3.2.0
picocolors: 1.1.1
- use-callback-ref@1.3.3(@types/react@18.3.18)(react@18.3.1):
- dependencies:
- react: 18.3.1
- tslib: 2.8.1
- optionalDependencies:
- '@types/react': 18.3.18
-
- use-sidecar@1.1.3(@types/react@18.3.18)(react@18.3.1):
- dependencies:
- detect-node-es: 1.1.0
- react: 18.3.1
- tslib: 2.8.1
- optionalDependencies:
- '@types/react': 18.3.18
-
- use-sync-external-store@1.6.0(react@18.3.1):
+ use-sync-external-store@1.6.0(react@19.2.7):
dependencies:
- react: 18.3.1
+ react: 19.2.7
util-deprecate@1.0.2: {}
@@ -6604,10 +5603,26 @@ snapshots:
vary@1.1.2: {}
- web-streams-polyfill@3.3.3: {}
+ vite@8.1.4(@types/node@22.20.1)(jiti@2.7.0):
+ dependencies:
+ lightningcss: 1.32.0
+ picomatch: 4.0.5
+ postcss: 8.5.16
+ rolldown: 1.1.5
+ tinyglobby: 0.2.17
+ optionalDependencies:
+ '@types/node': 22.20.1
+ fsevents: 2.3.3
+ jiti: 2.7.0
+
+ vitefu@1.1.3(vite@8.1.4(@types/node@22.20.1)(jiti@2.7.0)):
+ optionalDependencies:
+ vite: 8.1.4(@types/node@22.20.1)(jiti@2.7.0)
webidl-conversions@7.0.0: {}
+ webpack-virtual-modules@0.6.2: {}
+
whatwg-url@14.2.0:
dependencies:
tr46: 5.1.1
@@ -6621,18 +5636,6 @@ snapshots:
dependencies:
isexe: 3.1.5
- wrap-ansi@6.2.0:
- dependencies:
- ansi-styles: 4.3.0
- string-width: 4.2.3
- strip-ansi: 6.0.1
-
- wrap-ansi@7.0.0:
- dependencies:
- ansi-styles: 4.3.0
- string-width: 4.2.3
- strip-ansi: 6.0.1
-
wrappy@1.0.2: {}
wsl-utils@0.3.1:
@@ -6640,28 +5643,19 @@ snapshots:
is-wsl: 3.1.1
powershell-utils: 0.1.0
- y18n@5.0.8: {}
+ xmlbuilder2@4.0.3:
+ dependencies:
+ '@oozcitak/dom': 2.0.2
+ '@oozcitak/infra': 2.0.2
+ '@oozcitak/util': 10.0.0
+ js-yaml: 4.1.1
yallist@3.1.1: {}
- yargs-parser@21.1.1: {}
-
- yargs@17.7.2:
- dependencies:
- cliui: 8.0.1
- escalade: 3.2.0
- get-caller-file: 2.0.5
- require-directory: 2.1.1
- string-width: 4.2.3
- y18n: 5.0.8
- yargs-parser: 21.1.1
-
- yocto-spinner@1.1.0:
+ yocto-spinner@1.2.1:
dependencies:
yoctocolors: 2.1.2
- yoctocolors-cjs@2.1.3: {}
-
yoctocolors@2.1.2: {}
zod-to-json-schema@3.25.2(zod@3.25.76):
@@ -6673,3 +5667,5 @@ snapshots:
zod@4.3.5: {}
zod@4.3.6: {}
+
+ zod@4.4.3: {}
diff --git a/postcss.config.js b/postcss.config.js
deleted file mode 100644
index fb05b56..0000000
--- a/postcss.config.js
+++ /dev/null
@@ -1,5 +0,0 @@
-export default {
- plugins: {
- "@tailwindcss/postcss": {},
- },
-}
diff --git a/src/app/(auth)/layout.tsx b/src/app/(auth)/layout.tsx
deleted file mode 100644
index f7109d7..0000000
--- a/src/app/(auth)/layout.tsx
+++ /dev/null
@@ -1,15 +0,0 @@
-import { Shape } from "@/components/shapes"
-
-export default function Layout({ children }: { children: React.ReactNode }) {
- return (
-
- {children}
-
-
-
-
-
-
-
- )
-}
diff --git a/src/app/(auth)/login/can-i-access.tsx b/src/app/(auth)/login/can-i-access.tsx
deleted file mode 100644
index c95bc4c..0000000
--- a/src/app/(auth)/login/can-i-access.tsx
+++ /dev/null
@@ -1,77 +0,0 @@
-import { Award, Building, Gem, Lock, ShieldUser, Star } from "lucide-react"
-import Image from "next/image"
-import loginSvg1 from "@/assets/svg/login-1.svg"
-import loginSvg2 from "@/assets/svg/login-2.svg"
-import loginSvg3 from "@/assets/svg/login-3.svg"
-import { Card } from "@/components/ui/card"
-import { FeatureBox } from "./what-is"
-
-export function CanIAccess() {
- return (
-
-
-
-
How can I access?
-
-
You can access this dashboard if you have at least one of this role:
-
-
-
-
-
-
-
-
-
When you have checked that you are eligible, these are the steps to access:
-
-
-
-
-
-
1. Login with email
-
We send an OTP to your email
-
-
-
-
-
-
-
-
2. Link your Telegram account
-
This allows to verify your role
-
-
-
-
-
-
-
-
3. Use the dashboard
-
- If your role is not recognized, be patient until the IT team fixes it!
-
-
-
-
-
-
- )
-}
diff --git a/src/app/(auth)/login/login-button.tsx b/src/app/(auth)/login/login-button.tsx
deleted file mode 100644
index 51c6226..0000000
--- a/src/app/(auth)/login/login-button.tsx
+++ /dev/null
@@ -1,18 +0,0 @@
-"use client"
-import { LogInIcon } from "lucide-react"
-import Link from "next/link"
-import { Card, CardContent } from "@/components/ui/card"
-
-export function LoginButton() {
- return (
-
-
-
-
-
- Enter your reserved area
-
-
-
- )
-}
diff --git a/src/app/(auth)/login/login-form.tsx b/src/app/(auth)/login/login-form.tsx
deleted file mode 100644
index e7ccd37..0000000
--- a/src/app/(auth)/login/login-form.tsx
+++ /dev/null
@@ -1,196 +0,0 @@
-"use client"
-
-import { Key, Loader2, Mail } from "lucide-react"
-import { useRouter } from "next/navigation"
-import { useState } from "react"
-import { toast } from "sonner"
-import { Button } from "@/components/ui/button"
-import { FieldSeparator } from "@/components/ui/field"
-import { Input } from "@/components/ui/input"
-import { InputOTP, InputOTPGroup, InputOTPSlot } from "@/components/ui/input-otp"
-import { Label } from "@/components/ui/label"
-import { auth } from "@/lib/auth"
-
-export default function LoginForm() {
- const [email, setEmail] = useState("")
- const [sent, setSent] = useState(false)
-
- return (
-
- {!sent ? (
- setEmail(v)} onSend={() => setSent(true)} />
- ) : (
-
- )}
-
- )
- // Or continue with
- // Login with Passkey
-}
-
-function EmailCard({
- email,
- onChange,
- onSend,
-}: {
- email: string
- onChange: (value: string) => void
- onSend: () => void
-}) {
- const [loading, setLoading] = useState(false)
- const [passkeyLoading, setPasskeyLoading] = useState(false)
- const router = useRouter()
-
- async function sendOtp() {
- const { data, error } = await auth.emailOtp.sendVerificationOtp({
- type: "sign-in",
- email,
- })
-
- if (data?.success) {
- onSend()
- toast.success("OTP sent. Check your inbox and spam!")
- return
- }
-
- if (error?.code === "INVALID_EMAIL") {
- toast.error("Invalid email")
- return
- }
-
- toast.error("There was an unexpected error")
- console.error({ error })
- }
-
- async function passkeyLogin() {
- setPasskeyLoading(true)
- const { data, error } = await auth.signIn.passkey()
- if (error || !data) toast.error("Unable to login with passkey")
- else {
- toast.success("Login successful")
- router.replace("/dashboard")
- }
- setPasskeyLoading(false)
- }
-
- return (
-
-
-
Or continue with
-
- {passkeyLoading ? (
-
- ) : (
- <>
- Login with Passkey
- >
- )}
-
-
- )
-}
-
-function OTPCard({ email }: { email: string }) {
- const router = useRouter()
- const [loading, setLoading] = useState(false)
- const [otp, setOtp] = useState("")
-
- async function verifyOtp() {
- const { data, error } = await auth.signIn.emailOtp({
- email,
- otp,
- fetchOptions: {
- onRequest: () => {
- setLoading(true)
- },
- onResponse: () => {
- setLoading(false)
- },
- },
- })
-
- if (data) {
- toast.success("Successfully logged in!")
- return router.replace("/dashboard")
- }
-
- if (error.code === "INVALID_OTP") toast.error("You entered an invalid OTP")
- else {
- toast.error("There was an unexpected error")
- console.error({ error })
- }
- }
- return (
-
- )
-}
diff --git a/src/app/(auth)/login/page.tsx b/src/app/(auth)/login/page.tsx
deleted file mode 100644
index cd3684f..0000000
--- a/src/app/(auth)/login/page.tsx
+++ /dev/null
@@ -1,25 +0,0 @@
-import { redirect } from "next/navigation"
-import { Card, CardContent, CardDescription, CardHeader, CardTitle } from "@/components/ui/card"
-import { getServerSession } from "@/server/auth"
-import LoginForm from "./login-form"
-
-export default async function Page() {
- const { data: session } = await getServerSession()
- if (session) return redirect("/dashboard")
-
- return (
-
-
-
- Login
-
- Login with Email OTP or Passkey
-
-
-
-
-
-
-
- )
-}
diff --git a/src/app/(auth)/login/what-is.tsx b/src/app/(auth)/login/what-is.tsx
deleted file mode 100644
index c9f34e5..0000000
--- a/src/app/(auth)/login/what-is.tsx
+++ /dev/null
@@ -1,55 +0,0 @@
-import {
- BookOpen,
- Bot,
- CircleEllipsis,
- ClipboardList,
- Gavel,
- HelpCircle,
- LayoutTemplate,
- type LucideIcon,
- PencilLine,
- ShieldCheck,
- Users,
-} from "lucide-react"
-import { Card } from "@/components/ui/card"
-
-export function WhatIs() {
- return (
-
-
-
-
What is this?
-
-
- This is a PoliNetwork's internal tool that allows admins and department staff to perform multiple actions
- via an easy web interface.
-
-
What actions you can perform depends on your role, but some remarkable ones are:
-
-
-
-
-
-
-
-
-
-
-
-
- It's clear that you'll have access to different features depending on your role(s).
-
-
- )
-}
-
-export function FeatureBox({ icon: Icon, feature }: { icon: LucideIcon; feature: string }) {
- return (
-
-
-
- )
-}
diff --git a/src/app/(auth)/onboarding/_layout.tsx b/src/app/(auth)/onboarding/_layout.tsx
deleted file mode 100644
index baf33f4..0000000
--- a/src/app/(auth)/onboarding/_layout.tsx
+++ /dev/null
@@ -1,7 +0,0 @@
-export default function Layout({ children }: { children: React.ReactNode }) {
- return (
-
- {children}
-
- )
-}
diff --git a/src/app/(auth)/onboarding/link/logout.tsx b/src/app/(auth)/onboarding/link/logout.tsx
deleted file mode 100644
index 0b743f8..0000000
--- a/src/app/(auth)/onboarding/link/logout.tsx
+++ /dev/null
@@ -1,32 +0,0 @@
-"use client"
-
-import { useRouter } from "next/navigation"
-import { toast } from "sonner"
-import { auth } from "../../../../lib/auth"
-
-export function Logout({ email }: { email: string }) {
- const router = useRouter()
-
- async function handleLogout() {
- const { data, error } = await auth.signOut()
- if (data?.success || !error) {
- toast.success("Successfully logged out")
- return router.replace("/")
- }
-
- toast.error("There was an unexpected error")
- console.error({ error })
- }
-
- return (
-
-
- Logged in as {email}
-
-
Wrong account? {" "}
-
- Logout
-
-
- )
-}
diff --git a/src/app/(auth)/onboarding/link/page.tsx b/src/app/(auth)/onboarding/link/page.tsx
deleted file mode 100644
index fc3e0ce..0000000
--- a/src/app/(auth)/onboarding/link/page.tsx
+++ /dev/null
@@ -1,38 +0,0 @@
-import Image from "next/image"
-import { redirect } from "next/navigation"
-import loginSvg2 from "@/assets/svg/login-2.svg"
-import { Card } from "@/components/ui/card"
-import { env } from "@/env"
-import { getServerSession } from "@/server/auth"
-import { Logout } from "./logout"
-import { TelegramLink } from "./telegram"
-
-const BOT_USERNAME = env.NODE_ENV === "production" ? "pn_ts_dev_bot" : "pn_ts_devlocal_bot"
-
-export default async function OnboardingLink() {
- const { data: session } = await getServerSession()
- if (!session || session.user.telegramId) redirect("/dashboard")
-
- return (
-
-
-
-
-
-
Link your Telegram account
-
This allows to verify your role
-
-
-
-
-
-
-
-
- )
-}
diff --git a/src/app/(auth)/onboarding/link/telegram.tsx b/src/app/(auth)/onboarding/link/telegram.tsx
deleted file mode 100644
index 86d5e0a..0000000
--- a/src/app/(auth)/onboarding/link/telegram.tsx
+++ /dev/null
@@ -1,225 +0,0 @@
-"use client"
-import { APIError } from "better-auth/api"
-import { CircleCheckBig, ClockAlertIcon } from "lucide-react"
-import { useRouter } from "next/navigation"
-import { useCallback, useEffect, useState } from "react"
-import { toast } from "sonner"
-import { Code } from "@/components/code"
-import { InputWithPrefix } from "@/components/input-prefix"
-import { Button } from "@/components/ui/button"
-import { Label } from "@/components/ui/label"
-import { Progress, ProgressIndicator, ProgressTrack } from "@/components/ui/progress"
-import { Tooltip, TooltipContent, TooltipTrigger } from "@/components/ui/tooltip"
-import { useLocalStorage } from "@/hooks/use-local-storage"
-import { auth, useSession } from "@/lib/auth"
-
-type SavedLink = {
- username: string
- code: string
- ttl: number
- startTime: number
-}
-
-export function TelegramLink({ botUsername }: { botUsername: string }) {
- const router = useRouter()
- const { refetch } = useSession()
- const { data: savedLink, update, remove } = useLocalStorage("linktg")
- const timeLeft = savedLink ? savedLink.ttl - (Date.now() - savedLink.startTime) / 1000 : null
- if (timeLeft !== null && timeLeft <= 0) {
- remove()
- }
-
- const [usernameInput, setUsernameInput] = useState("")
- const [expired, setExpired] = useState(false)
- const [success, setSuccess] = useState(false)
-
- const handleComplete = useCallback(() => {
- setSuccess(true)
- void refetch()
- remove()
-
- setTimeout(() => {
- router.push("/dashboard")
- }, 5000)
- }, [router, refetch, remove])
-
- async function handleSubmit(e: React.FormEvent | React.MouseEvent) {
- e.stopPropagation()
- e.preventDefault()
- if (usernameInput.length === 0) return
- const res = await auth.telegram.link.start({
- telegramUsername: usernameInput,
- })
-
- if (res.error) return console.error("custom error", res.error)
-
- setExpired(false)
- update({
- code: res.data.code,
- startTime: Date.now(),
- ttl: res.data.ttl,
- username: usernameInput,
- })
- }
-
- function reset() {
- setExpired(false)
- setUsernameInput("")
- remove()
- }
-
- useEffect(() => {
- if (savedLink === undefined || savedLink === null) return
- // eslint-disable-next-line @typescript-eslint/no-misused-promises
- const interval = setInterval(async () => {
- const res = await auth.telegram.link.verify({
- query: { code: savedLink.code },
- })
-
- if (res.error) return console.error("custom error", res.error)
- if (res.data instanceof APIError) return console.error("better-auth APIError", res.data)
- if (!("verified" in res.data)) return console.error("unexpected response", res.data)
-
- const data = res.data as { verified: boolean; expired?: boolean }
-
- if (data.verified) {
- clearInterval(interval)
- handleComplete()
- return
- }
-
- if (data.expired) {
- setExpired(true)
- remove()
- clearInterval(interval)
- return
- }
-
- console.log("polling... not verified or expired")
- }, 5000)
- return () => clearInterval(interval)
- }, [savedLink, handleComplete, remove])
-
- if (savedLink === undefined) return null
- if (success)
- return (
-
-
-
Linked successfully!
-
Redirecting you in 5s...
-
- )
-
- if (expired)
- return (
-
-
-
Code Expired!
-
Regenerate
-
- )
-
- return savedLink && timeLeft ? (
-
-
{
- try {
- await navigator.clipboard.writeText(savedLink.code)
- toast.success("Code copied to clipboard!")
- } catch (err) {
- toast.error("Cannot copy code to clipboard")
- console.error(err)
- }
- }}
- >
-
- {savedLink.code.split("").map((c, i) => (
- {c}
- ))}
-
-
-
setExpired(true)} />
-
-
-
-
- Having troubles with this code?{" "}
-
- Click to reset
-
-
-
- ) : (
-
- )
-}
-
-function Timer({ ttl, timeLeft: pTimeLeft, onEnd }: { ttl: number; timeLeft: number; onEnd: () => void }) {
- const ttlMs = ttl * 1000
- const [timeLeft, setTimeLeft] = useState(pTimeLeft * 1000)
-
- const percentage = (timeLeft / ttlMs) * 100
- useEffect(() => {
- if (timeLeft === 0) return
- const interval = setInterval(() => {
- setTimeLeft((prevTime) => {
- if (prevTime <= 100) {
- clearInterval(interval)
- onEnd()
- return 0
- }
- return prevTime - 100
- })
- }, 100)
-
- return () => clearInterval(interval)
- }, [onEnd, timeLeft])
-
- return (
- <>
-
-
-
-
-
-
- Time left:
- {Math.floor(timeLeft / 1000)}s
-
- >
- )
-}
diff --git a/src/app/(auth)/onboarding/no-role/page.tsx b/src/app/(auth)/onboarding/no-role/page.tsx
deleted file mode 100644
index 7146387..0000000
--- a/src/app/(auth)/onboarding/no-role/page.tsx
+++ /dev/null
@@ -1,38 +0,0 @@
-import Image from "next/image"
-import { redirect } from "next/navigation"
-import loginSvg2 from "@/assets/svg/login-2.svg"
-import { Card } from "@/components/ui/card"
-import { getUserRoles } from "@/server/actions/users"
-import { getServerSession } from "@/server/auth"
-import { Logout } from "../link/logout"
-
-export default async function OnboardingNoRole() {
- const { data: session } = await getServerSession()
- if (!session) redirect("/login")
- if (!session.user.telegramId) redirect("/onboarding/link")
-
- const { roles } = await getUserRoles(session.user.telegramId)
- if (roles?.includes("creator")) redirect("/onboarding/unauthorized")
- if (roles && roles.length > 0) redirect("/dashboard")
-
- return (
-
-
-
-
-
-
Your account is not enabled
-
Please contact an IT member
-
-
-
-
-
-
- )
-}
diff --git a/src/app/dashboard/(active)/account/delete-passkey.tsx b/src/app/dashboard/(active)/account/delete-passkey.tsx
deleted file mode 100644
index 0047e80..0000000
--- a/src/app/dashboard/(active)/account/delete-passkey.tsx
+++ /dev/null
@@ -1,51 +0,0 @@
-"use client"
-
-import { Trash2Icon } from "lucide-react"
-import { useRouter } from "next/navigation"
-import { toast } from "sonner"
-import {
- AlertDialog,
- AlertDialogAction,
- AlertDialogCancel,
- AlertDialogContent,
- AlertDialogDescription,
- AlertDialogFooter,
- AlertDialogHeader,
- AlertDialogMedia,
- AlertDialogTitle,
- AlertDialogTrigger,
-} from "@/components/ui/alert-dialog"
-import { Button } from "@/components/ui/button"
-import { auth } from "@/lib/auth"
-
-export function DeletePasskey({ id }: { id: string }) {
- const router = useRouter()
-
- async function deletePasskey() {
- const { data, error } = await auth.passkey.deletePasskey({ id })
- if (!data || error) return toast.error("There was an error")
- toast.success("Passkey deleted!")
- router.refresh()
- }
-
- return (
-
- Delete}>
-
-
-
-
-
- Remove passkey
- Are you sure you want to delete this passkey?
-
-
- Cancel
-
- Confirm
-
-
-
-
- )
-}
diff --git a/src/app/dashboard/(active)/account/loading.tsx b/src/app/dashboard/(active)/account/loading.tsx
deleted file mode 100644
index f67b7c1..0000000
--- a/src/app/dashboard/(active)/account/loading.tsx
+++ /dev/null
@@ -1,34 +0,0 @@
-import { Skeleton } from "@/components/ui/skeleton"
-import { NewPasskeyButton } from "./passkey-button"
-
-export default function Loading() {
- return (
-
- Account
-
-
-
-
-
- Name:
-
-
-
-
- Email:
-
-
-
- Telegram:
-
-
-
-
-
-
Passkeys
-
-
-
-
- )
-}
diff --git a/src/app/dashboard/(active)/account/page.tsx b/src/app/dashboard/(active)/account/page.tsx
deleted file mode 100644
index 0ac592a..0000000
--- a/src/app/dashboard/(active)/account/page.tsx
+++ /dev/null
@@ -1,67 +0,0 @@
-import { Calendar, CircleAlert, KeyIcon } from "lucide-react"
-import { headers } from "next/headers"
-import { auth } from "@/lib/auth"
-import { getServerSession } from "@/server/auth"
-import { DeletePasskey } from "./delete-passkey"
-import { NewPasskeyButton } from "./passkey-button"
-import { ProfilePic } from "./profile-pic"
-import { SetName } from "./set-name"
-import { Telegram } from "./telegram"
-
-export default async function Account() {
- const { data: session } = await getServerSession()
- if (!session) return
-
- const { data: passkeys } = await auth.passkey.listUserPasskeys({
- fetchOptions: {
- headers: await headers(),
- },
- })
-
- const { user } = session
-
- return (
-
- Account
-
-
-
-
-
- {!user.name &&
}
-
Name:
- {user.name ?
{user.name}
:
}
-
-
-
-
Email:
-
{user.email}
-
-
- Telegram:
-
-
-
-
-
-
Passkeys
- {passkeys?.map((p) => (
-
-
-
-
-
-
{p.name}
-
-
- Created on {p.createdAt.toLocaleDateString()}
-
-
-
-
- ))}
-
-
-
- )
-}
diff --git a/src/app/dashboard/(active)/account/passkey-button.tsx b/src/app/dashboard/(active)/account/passkey-button.tsx
deleted file mode 100644
index 0cd4836..0000000
--- a/src/app/dashboard/(active)/account/passkey-button.tsx
+++ /dev/null
@@ -1,35 +0,0 @@
-"use client"
-
-import { useRouter } from "next/navigation"
-import { useState } from "react"
-import { toast } from "sonner"
-import { Button } from "@/components/ui/button"
-import { auth } from "@/lib/auth"
-
-export function NewPasskeyButton() {
- const router = useRouter()
- const [isLoading, setIsLoading] = useState(false)
-
- return (
- {
- setIsLoading(true)
- const { data, error } = await auth.passkey.addPasskey({ name: "default" })
- setIsLoading(false)
- if (error) {
- console.error(error)
- toast.error("There was an unexpected error")
- return
- }
-
- toast.success("Passkey created!")
- console.log("passkey created", { data })
- router.refresh()
- return
- }}
- >
- New Passkey
-
- )
-}
diff --git a/src/app/dashboard/(active)/account/profile-pic.tsx b/src/app/dashboard/(active)/account/profile-pic.tsx
deleted file mode 100644
index 43d17dc..0000000
--- a/src/app/dashboard/(active)/account/profile-pic.tsx
+++ /dev/null
@@ -1,108 +0,0 @@
-"use client"
-
-import type { User } from "better-auth"
-import { Pencil, Upload, UserIcon, X } from "lucide-react"
-import { useRouter } from "next/navigation"
-import { forwardRef, useRef } from "react"
-import { toast } from "sonner"
-import { Avatar, AvatarFallback, AvatarImage } from "@/components/ui/avatar"
-import { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuTrigger } from "@/components/ui/dropdown-menu"
-import { auth, useSession } from "@/lib/auth"
-import { getInitials } from "@/lib/utils"
-import { updateProfilePic } from "@/server/actions/users"
-
-type Props = {
- user: User
-}
-
-export function ProfilePic({ user }: Props) {
- const uploadRef = useRef(null)
- const router = useRouter()
- const { refetch } = useSession()
-
- async function handleRemove() {
- const ok = confirm("Are you sure you want to reset your profile picture?")
- if (!ok) return
-
- const r = await auth.updateUser({ image: null })
- if (r.error) {
- toast.error("There was an error")
- console.error(r.error)
- return
- }
-
- toast.success("Profile picture removed successfully'")
- await refetch()
- router.refresh()
- }
-
- return (
-
-
-
-
-
-
-
- uploadRef.current?.click()}>
- Upload
-
-
- Remove
-
-
-
-
-
-
-
-
- {user.name ? getInitials(user.name) : }
-
-
-
Max 1MB
-
- )
-}
-
-const UploadProfilePicture = forwardRef((_, ref) => {
- const router = useRouter()
- const { refetch } = useSession()
-
- const handleFileChange = async (event: React.ChangeEvent) => {
- const files = event.target.files
- if (files && files.length > 0) {
- const selectedFile = files[0]
- if (!selectedFile) return
-
- if (selectedFile.size > 1024 * 1024) {
- toast.error("The image must be no larger than 1 MB")
- return
- }
-
- if (selectedFile.type !== "image/png" && selectedFile.type !== "image/jpeg") {
- toast.error("The image must be jpeg or png")
- return
- }
-
- const { success } = await updateProfilePic(selectedFile)
- if (success) toast.success("Image changed successfully!")
- else toast.error("There was an error, try again")
- await refetch()
- router.refresh()
- }
- }
- return (
-
- )
-})
diff --git a/src/app/dashboard/(active)/account/set-name.tsx b/src/app/dashboard/(active)/account/set-name.tsx
deleted file mode 100644
index e0c24b9..0000000
--- a/src/app/dashboard/(active)/account/set-name.tsx
+++ /dev/null
@@ -1,64 +0,0 @@
-"use client"
-
-import { useRouter } from "next/navigation"
-import { type FormEvent, useState } from "react"
-import { Button } from "@/components/ui/button"
-import {
- Dialog,
- DialogClose,
- DialogContent,
- DialogDescription,
- DialogFooter,
- DialogHeader,
- DialogTitle,
- DialogTrigger,
-} from "@/components/ui/dialog"
-import { Input } from "@/components/ui/input"
-import { Label } from "@/components/ui/label"
-import { auth } from "@/lib/auth"
-
-export function SetName({ initialName }: { initialName?: string }) {
- const router = useRouter()
- const [name, setName] = useState(initialName ?? "")
- const [open, setOpen] = useState(false)
-
- async function handleUpdate(e: FormEvent) {
- e.preventDefault()
- await auth.updateUser({ name })
- setOpen(false)
- router.refresh()
- }
-
- return (
-
- Set name} />
-
-
- Set your name
- Make changes to your profile here. Click save when you're done.
-
-
-
-
- )
-}
diff --git a/src/app/dashboard/(active)/account/telegram.tsx b/src/app/dashboard/(active)/account/telegram.tsx
deleted file mode 100644
index d573433..0000000
--- a/src/app/dashboard/(active)/account/telegram.tsx
+++ /dev/null
@@ -1,17 +0,0 @@
-import { getUserRoles } from "@/server/actions/users"
-import { getServerSession } from "@/server/auth"
-
-export async function Telegram() {
- const { data } = await getServerSession()
- if (!data || !data.user.telegramId) return null
-
- const { roles } = await getUserRoles(data.user.telegramId)
- const length = roles?.length ?? 0
-
- return (
- <>
- {data.user.telegramUsername ? `@${data.user.telegramUsername}` : data.user.id}
- {roles && length > 0 && (roles: {roles.join(", ")}) }
- >
- )
-}
diff --git a/src/app/dashboard/(active)/azure/members/columns.tsx b/src/app/dashboard/(active)/azure/members/columns.tsx
deleted file mode 100644
index 0673bbf..0000000
--- a/src/app/dashboard/(active)/azure/members/columns.tsx
+++ /dev/null
@@ -1,50 +0,0 @@
-"use client"
-import { createColumnHelper, type Row } from "@tanstack/react-table"
-import { Badge } from "@/components/ui/badge"
-import type { AzureMember } from "@/server/trpc/types"
-import { SetAssocNumberDialog } from "./set-assoc-number-dialog"
-
-const ch = createColumnHelper()
-
-export const columns = [
- ch.accessor("employeeId", {
- id: "number",
- header: "#",
- footer: (props) => props.column.id,
- cell: ({ getValue, row }) => {
- const value = getValue()
- return value ? {value} :
- },
- }),
- ch.accessor("displayName", {
- id: "displayName",
- header: "Full Name",
- cell: ({ getValue, row }) => (
- <>
- {row.original.isMember && Socio }
- {getValue()}
- >
- ),
- }),
- ch.accessor("mail", { id: "mail", header: "Email" }),
- ch.accessor("assignedLicensesIds", {
- id: "licenses",
- header: "Licenses",
- cell: ({ getValue }) => {
- const licenses = getValue().sort((a, b) => a.localeCompare(b))
- return licenses.map((l) => (
-
- {l}
-
- ))
- },
- }),
- ch.group({
- id: "actions",
- cell: (props) => ,
- }),
-]
-
-function RowActions({ row: _ }: { row: Row }) {
- return
-}
diff --git a/src/app/dashboard/(active)/azure/members/create-assoc-member.tsx b/src/app/dashboard/(active)/azure/members/create-assoc-member.tsx
deleted file mode 100644
index 3e741f4..0000000
--- a/src/app/dashboard/(active)/azure/members/create-assoc-member.tsx
+++ /dev/null
@@ -1,140 +0,0 @@
-"use client"
-import { useRouter } from "next/navigation"
-import { useState, useTransition } from "react"
-import { toast } from "sonner"
-import { Button } from "@/components/ui/button"
-import { Input } from "@/components/ui/input"
-import { Label } from "@/components/ui/label"
-import {
- Sheet,
- SheetClose,
- SheetContent,
- SheetFooter,
- SheetHeader,
- SheetTitle,
- SheetTrigger,
-} from "@/components/ui/sheet"
-import { createAzureMember } from "@/server/actions/azure"
-
-export function CreateAssocUser() {
- const [open, setOpen] = useState(false)
- const [firstName, setFirstName] = useState("")
- const [lastName, setLastName] = useState("")
- const [assocNumber, setAssocNumber] = useState("")
- const [sendTo, setSendTo] = useState("")
- const router = useRouter()
-
- function handleOpenChange(v: boolean): void {
- setOpen(v)
- setFirstName("")
- setLastName("")
- setAssocNumber("")
- setSendTo("")
- }
-
- const [pending, startTransition] = useTransition()
-
- async function handleSubmit() {
- if (!assocNumber || Number.isNaN(parseInt(assocNumber, 10))) return
-
- const res = await createAzureMember({
- assocNumber: parseInt(assocNumber, 10),
- firstName,
- lastName,
- sendEmailTo: sendTo,
- }).catch(() => null)
-
- if (!res) {
- toast.error("There was an error")
- return
- }
-
- if (res.error !== null) {
- toast.error(res.error)
- return
- }
-
- console.log("Created user", res)
- toast.success(`User created, email: ${res.email}`, { duration: 10_000 })
- router.refresh()
- handleOpenChange(false)
- }
-
- return (
-
- New Member}>
-
-
- Create new member account
-
-
-
-
- )
-}
diff --git a/src/app/dashboard/(active)/azure/members/loading.tsx b/src/app/dashboard/(active)/azure/members/loading.tsx
deleted file mode 100644
index a6bd30c..0000000
--- a/src/app/dashboard/(active)/azure/members/loading.tsx
+++ /dev/null
@@ -1,9 +0,0 @@
-import { SkeletonAssocTable } from "./table"
-
-export default function Loading() {
- return (
-
-
-
- )
-}
diff --git a/src/app/dashboard/(active)/azure/members/page.tsx b/src/app/dashboard/(active)/azure/members/page.tsx
deleted file mode 100644
index 4a4d975..0000000
--- a/src/app/dashboard/(active)/azure/members/page.tsx
+++ /dev/null
@@ -1,19 +0,0 @@
-import { Suspense } from "react"
-import { ErrorBoundary } from "react-error-boundary"
-import { Spinner } from "@/components/spinner"
-import { getAzureMembers } from "@/server/actions/azure"
-import { AssocTable } from "./table"
-
-export default async function AssocMembers() {
- const members = await getAzureMembers()
-
- return (
-
- Something went wrong
}>
- }>
-
-
-
-
- )
-}
diff --git a/src/app/dashboard/(active)/azure/members/set-assoc-number-dialog.tsx b/src/app/dashboard/(active)/azure/members/set-assoc-number-dialog.tsx
deleted file mode 100644
index ae3e7dc..0000000
--- a/src/app/dashboard/(active)/azure/members/set-assoc-number-dialog.tsx
+++ /dev/null
@@ -1,97 +0,0 @@
-"use client"
-import { useRouter } from "next/navigation"
-import { useState, useTransition } from "react"
-import { toast } from "sonner"
-import { Button } from "@/components/ui/button"
-import {
- Dialog,
- DialogClose,
- DialogContent,
- DialogDescription,
- DialogFooter,
- DialogHeader,
- DialogTitle,
- DialogTrigger,
-} from "@/components/ui/dialog"
-import { Input } from "@/components/ui/input"
-import { Label } from "@/components/ui/label"
-import { wait } from "@/lib/utils"
-import { setAzureMemberNumber } from "@/server/actions/azure"
-
-export function SetAssocNumberDialog({ userId }: { userId: string }) {
- const router = useRouter()
- const [value, setValue] = useState("")
- const [open, setOpen] = useState(false)
-
- function handleOpenChange(v: boolean): void {
- setOpen(v)
- setValue("")
- }
-
- const [pending, startTransition] = useTransition()
-
- async function handleSubmit() {
- if (pending || !value || Number.isNaN(parseInt(value, 10))) return
-
- const loading = toast.loading(`Updating...`)
- const res = await setAzureMemberNumber({ userId, assocNumber: parseInt(value, 10) })
- handleOpenChange(false)
- if (res.error !== null) {
- toast.error("There was an error")
- console.error(res.error)
- return
- }
-
- await wait(2000)
- toast.success(`Updated successfully!`, { id: loading })
- router.refresh()
- console.log("Updated user assocNumber", userId, value)
- }
-
- return (
-
-
- Set
-
- }
- />
-
-
- Set Assoc Number
- This changes the `employeeId` field in the Azure User properties.
-
-
-
-
- )
-}
diff --git a/src/app/dashboard/(active)/azure/members/table.tsx b/src/app/dashboard/(active)/azure/members/table.tsx
deleted file mode 100644
index 2a5bf70..0000000
--- a/src/app/dashboard/(active)/azure/members/table.tsx
+++ /dev/null
@@ -1,76 +0,0 @@
-"use client"
-
-import { useState } from "react"
-import { DataTable } from "@/components/data-table"
-import { Badge } from "@/components/ui/badge"
-import { Skeleton } from "@/components/ui/skeleton"
-import type { AzureMember } from "@/server/trpc/types"
-import { columns } from "./columns"
-import { CreateAssocUser } from "./create-assoc-member"
-
-function sortByAssocNumber(users: AzureMember[]) {
- if (!users || users.length === 0) return users
- if (users.every((u) => !u.employeeId))
- return users.sort((a, b) => (a.displayName ?? "").localeCompare(b.displayName ?? ""))
-
- return users.sort((a, b) => {
- if (a.employeeId && b.employeeId) {
- const aInt = parseInt(a.employeeId, 10)
- const bInt = parseInt(b.employeeId, 10)
- if (Number.isNaN(aInt) && Number.isNaN(bInt)) return 0
- if (Number.isNaN(aInt)) return 1
- if (Number.isNaN(bInt)) return -1
- return aInt - bInt
- }
- if (a.employeeId) return -1
- if (b.employeeId) return 1
- return 0
- })
-}
-
-export function AssocTable({ members }: { members: AzureMember[] }) {
- const [sociFilter, setSociFilter] = useState(false)
- const users = sociFilter ? members.filter((v) => v.isMember) : members
-
- return (
-
-
-
Utenti MS @polinetwork.org
-
setSociFilter((v) => !v)}
- >
- {members.filter((d) => d.isMember).length} Soci
-
-
{members.filter((d) => !d.isMember).length} fuori
-
{users.filter((u) => u.assignedLicensesIds.includes("OFFICE_365")).length} licenze Office
-
-
-
-
-
-
- )
-}
-
-export function SkeletonAssocTable() {
- return (
-
-
-
Utenti MS @polinetwork.org
-
-
-
-
-
-
-
-
-
- )
-}
diff --git a/src/app/dashboard/(active)/breadcrumb.tsx b/src/app/dashboard/(active)/breadcrumb.tsx
deleted file mode 100644
index 17052fe..0000000
--- a/src/app/dashboard/(active)/breadcrumb.tsx
+++ /dev/null
@@ -1,74 +0,0 @@
-"use client"
-import { usePathname } from "next/navigation"
-import { Fragment, useMemo } from "react"
-import { NAV_MAP } from "@/components/dashboard-sidebar/data"
-import {
- BreadcrumbItem as BreadcrumbItemComponent,
- BreadcrumbLink,
- BreadcrumbList,
- BreadcrumbPage,
- Breadcrumb as BreadcrumbRoot,
- BreadcrumbSeparator,
-} from "@/components/ui/breadcrumb"
-
-export type BreadcrumbItem = {
- title: string
- url?: string
-}
-
-export function Breadcrumb({ className, ...props }: React.ComponentProps<"nav">) {
- const pathname = usePathname()
- const items = useMemo(() => getBreadcrumbs(NAV_MAP, pathname), [pathname])
-
- return (
-
-
- {items.map((item, i) => (
-
-
- {i === items.length - 1 ? (
- {item.title}
- ) : item.url ? (
- {item.title}
- ) : (
- item.title
- )}
-
- {i < items.length - 1 && }
-
- ))}
-
-
- )
-}
-
-function getBreadcrumbs(navMap: Map, pathname: string): BreadcrumbItem[] {
- const segments = pathname.split("/").filter(Boolean)
- const breadcrumbs: BreadcrumbItem[] = []
-
- let currentPath = ""
- let i = 0
-
- for (const segment of segments) {
- currentPath += `/${segment}`
- let title = navMap.get(currentPath)
- if (!title) {
- if (isUUIDorId(segment)) {
- title = "Details"
- } else {
- title = segment.charAt(0).toUpperCase() + segment.slice(1)
- }
- }
-
- // note: at the moment we do not plan to make category pages.
- // If such pages are made in the future, this logic can be removed
- breadcrumbs.push({ title, url: i !== 1 ? currentPath : undefined })
- i++
- }
-
- return breadcrumbs
-}
-
-function isUUIDorId(segment: string) {
- return !Number.isNaN(Number(segment)) || segment.length > 20 // Regex custom a seconda dei tuoi ID
-}
diff --git a/src/app/dashboard/(active)/complete-profile.tsx b/src/app/dashboard/(active)/complete-profile.tsx
deleted file mode 100644
index 89fc4ac..0000000
--- a/src/app/dashboard/(active)/complete-profile.tsx
+++ /dev/null
@@ -1,24 +0,0 @@
-"use client"
-
-import { UserRoundPenIcon } from "lucide-react"
-import Link from "next/link"
-import { Button } from "@/components/ui/button"
-import { useSession } from "@/lib/auth"
-
-export function CompleteProfile() {
- const { data, isPending } = useSession()
-
- if (!data || isPending) return null
-
- return (
- !data.user.name && (
-
-
-
Your profile is incomplete, please enter the missing information.
-
-
Go complete
-
-
- )
- )
-}
diff --git a/src/app/dashboard/(active)/layout.tsx b/src/app/dashboard/(active)/layout.tsx
deleted file mode 100644
index 016881d..0000000
--- a/src/app/dashboard/(active)/layout.tsx
+++ /dev/null
@@ -1,50 +0,0 @@
-import { cookies } from "next/headers"
-import { DashboardSidebar } from "@/components/dashboard-sidebar"
-import { SidebarInset, SidebarProvider, SidebarTrigger } from "@/components/ui/sidebar"
-import { COOKIES } from "@/constants"
-import { Breadcrumb } from "./breadcrumb"
-
-function parseCookie(cookie: string) {
- try {
- const parsed = JSON.parse(cookie)
- return parsed
- } catch (_e) {
- return {}
- }
-}
-
-export default async function AdminLayout({ children }: { children: React.ReactNode }) {
- const sidebarCookies = await getSidebarCookies()
-
- return (
-
-
-
-
- {children}
-
-
- )
-}
-
-async function getSidebarCookies() {
- const cookieStore = await cookies()
-
- const sidebarCategoryStateCookie = cookieStore.get(COOKIES.SIDEBAR_CATEGORY_STATE)?.value
- const sidebarOpenCookie = cookieStore.get(COOKIES.SIDEBAR_OPEN)?.value
- const state: Record = sidebarCategoryStateCookie ? parseCookie(sidebarCategoryStateCookie) : {}
- const open: boolean = sidebarOpenCookie !== undefined ? parseCookie(sidebarOpenCookie) : true
-
- return { state, open }
-}
diff --git a/src/app/dashboard/(active)/not-found.tsx b/src/app/dashboard/(active)/not-found.tsx
deleted file mode 100644
index e962605..0000000
--- a/src/app/dashboard/(active)/not-found.tsx
+++ /dev/null
@@ -1,19 +0,0 @@
-import Link from "next/link"
-import { Button } from "@/components/ui/button"
-
-export default function NotFound() {
- return (
-
-
-
404
-
Not found
-
- The resource you're looking for doesn't exist or has been moved.
-
-
-
-
Go Back
-
-
- )
-}
diff --git a/src/app/dashboard/(active)/page.tsx b/src/app/dashboard/(active)/page.tsx
deleted file mode 100644
index a0cb34b..0000000
--- a/src/app/dashboard/(active)/page.tsx
+++ /dev/null
@@ -1,16 +0,0 @@
-import { InfoIcon } from "lucide-react"
-import { Alert, AlertDescription, AlertTitle } from "@/components/ui/alert"
-import { CompleteProfile } from "./complete-profile"
-
-export default function AdminHome() {
- return (
-
-
-
-
- Page under construction
- Use the sidebar to access the sections
-
-
- )
-}
diff --git a/src/app/dashboard/(active)/telegram/grants/delete-grant.tsx b/src/app/dashboard/(active)/telegram/grants/delete-grant.tsx
deleted file mode 100644
index c12558b..0000000
--- a/src/app/dashboard/(active)/telegram/grants/delete-grant.tsx
+++ /dev/null
@@ -1,83 +0,0 @@
-"use client"
-
-import { OctagonX } from "lucide-react"
-import { useRouter } from "next/navigation"
-import { useState } from "react"
-import { toast } from "sonner"
-import {
- AlertDialog,
- AlertDialogAction,
- AlertDialogCancel,
- AlertDialogContent,
- AlertDialogDescription,
- AlertDialogFooter,
- AlertDialogHeader,
- AlertDialogMedia,
- AlertDialogTitle,
- AlertDialogTrigger,
-} from "@/components/ui/alert-dialog"
-import { Button } from "@/components/ui/button"
-import { interruptGrant } from "@/server/actions/grants"
-
-export function DeleteGrant({
- userId,
- // onDelete
-}: {
- userId: number
- // onDelete(): void
-}) {
- const router = useRouter()
- const [open, setOpen] = useState(false)
-
- async function interrupt() {
- try {
- const { error } = await interruptGrant(userId)
-
- if (error === "NOT_FOUND") toast.info("The grant was expired or already interrupted")
- else if (error === "UNAUTHORIZED") toast.error("You don't have enough permission")
- else if (error === "INTERNAL_SERVER_ERROR") toast.error("There was an internal server error")
- else {
- toast.success("Grant interrupted successfully")
- router.refresh()
- // onDelete()
- }
- } catch (err) {
- toast.error("There was an error")
- console.error(err)
- } finally {
- handleOpenChange(false)
- }
- }
-
- function handleOpenChange(v: boolean) {
- setOpen(v)
- }
-
- return (
-
-
-
- Interrupt
-
- }
- >
-
-
-
-
-
- Interrupt Grant
- Are you sure you want to interrupt the grant?
-
-
- Cancel
-
- Confirm
-
-
-
-
- )
-}
diff --git a/src/app/dashboard/(active)/telegram/grants/grant-list.tsx b/src/app/dashboard/(active)/telegram/grants/grant-list.tsx
deleted file mode 100644
index aeb93a0..0000000
--- a/src/app/dashboard/(active)/telegram/grants/grant-list.tsx
+++ /dev/null
@@ -1,42 +0,0 @@
-"use client"
-import { format } from "date-fns"
-import type { ApiOutput } from "@/server/trpc/types"
-import { DeleteGrant } from "./delete-grant"
-
-type Grants = NonNullable
-
-export function GrantList({ grants, isScheduled }: { grants: Grants; isScheduled?: boolean }) {
- return (
-
-
-
Telegram ID
-
Username
-
Start Date
-
End Date
-
Interrupt
-
- {grants.map((r) => (
-
- ))}
- {grants.length === 0 && (
-
- There are no {isScheduled ? "scheduled" : "ongoing"} grants
-
- )}
-
- )
-}
-
-function GrantRow({ row: r }: { row: Grants[number] }) {
- return (
-
-
{r.grant.userId}
-
- {r.user?.username ? `@${r.user.username}` : ``}
-
-
{format(r.grant.validSince, "yyyy/MM/dd HH:mm")}
-
{format(r.grant.validUntil, "yyyy/MM/dd HH:mm")}
-
-
- )
-}
diff --git a/src/app/dashboard/(active)/telegram/grants/loading.tsx b/src/app/dashboard/(active)/telegram/grants/loading.tsx
deleted file mode 100644
index 3d6aca2..0000000
--- a/src/app/dashboard/(active)/telegram/grants/loading.tsx
+++ /dev/null
@@ -1,51 +0,0 @@
-import { Skeleton } from "@/components/ui/skeleton"
-import { Tabs, TabsContent, TabsList, TabsTrigger } from "@/components/ui/tabs"
-import { NewGrant } from "./new-grant"
-
-export default async function Loading() {
- return (
-
-
-
-
-
-
- All
-
- Ongoing
- Scheduled
-
-
-
-
-
-
-
-
-
-
-
-
-
- )
-}
-
-function Content() {
- return (
-
-
-
Telegram ID
-
Username
-
Start Date
-
End Date
-
Interrupt
-
- {new Array(6).fill(0).map((_, i) => (
-
- ))}
-
- )
-}
diff --git a/src/app/dashboard/(active)/telegram/grants/new-grant.tsx b/src/app/dashboard/(active)/telegram/grants/new-grant.tsx
deleted file mode 100644
index 3f839aa..0000000
--- a/src/app/dashboard/(active)/telegram/grants/new-grant.tsx
+++ /dev/null
@@ -1,254 +0,0 @@
-"use client"
-
-import { format } from "date-fns"
-import { ChevronDownIcon, Plus } from "lucide-react"
-import { useRouter } from "next/navigation"
-import { useCallback, useEffect, useState } from "react"
-import { toast } from "sonner"
-import { Button } from "@/components/ui/button"
-import { Calendar } from "@/components/ui/calendar"
-import {
- Dialog,
- DialogClose,
- DialogContent,
- DialogDescription,
- DialogFooter,
- DialogHeader,
- DialogTitle,
- DialogTrigger,
-} from "@/components/ui/dialog"
-import { Field, FieldGroup, FieldLabel } from "@/components/ui/field"
-import { Input } from "@/components/ui/input"
-import { Label } from "@/components/ui/label"
-import { Popover, PopoverContent, PopoverTrigger } from "@/components/ui/popover"
-import {
- Select,
- SelectContent,
- SelectGroup,
- SelectItem,
- SelectLabel,
- SelectSeparator,
- SelectTrigger,
- SelectValue,
-} from "@/components/ui/select"
-import { UserSelect } from "@/components/user-select"
-import { useSession } from "@/lib/auth"
-import { createGrant } from "@/server/actions/grants"
-import type { TgUser } from "@/server/trpc/types"
-
-export function NewGrant() {
- const sesh = useSession()
- const router = useRouter()
- const adderId = sesh.data?.user.telegramId
-
- const [open, setOpen] = useState(false)
- const [user, setUser] = useState(null)
- const [startDate, setStartDate] = useState()
- const [endDate, setEndDate] = useState()
- const [reason, setReason] = useState("")
-
- const disabled = !user || !startDate || !endDate || endDate.getTime() < Date.now()
-
- function handleOpenChange(v: boolean) {
- setOpen(v)
- if (v === false) {
- setUser(null)
- setStartDate(undefined)
- setEndDate(undefined)
- setReason("")
- }
- }
-
- const handleDateSelect = useCallback((date: Date, startTime: number, duration: number) => {
- const startDate = new Date(date.getTime())
- startDate.setHours(startTime)
- startDate.setMinutes(0)
- startDate.setSeconds(0)
- setStartDate(startDate)
-
- const endDate = new Date(startDate.getTime())
- endDate.setTime(endDate.getTime() + duration * 1000)
- endDate.setSeconds(0)
- setEndDate(endDate)
- }, [])
-
- const isPast = endDate && endDate.getTime() < Date.now()
-
- async function create() {
- if (!user || !startDate || !endDate || !adderId) return
- const res = await createGrant({
- userId: user.id,
- since: startDate,
- until: endDate,
- reason: reason || undefined,
- })
-
- if (res.error === "UNAUTHORIZED") toast.error("You don't have permission to create grants.")
- else if (res.error === "ALREADY_EXISTING") toast.error("This user already has an ongoing grant.")
- else if (res.error === "INTERNAL_SERVER_ERROR") toast.error("There was a server error.")
- else {
- toast.success("Grant created successfully!")
- router.refresh()
- }
-
- handleOpenChange(false)
- }
-
- return (
-
-
- New Grant
-
- }
- />
-
-
- New Grant
- Create a grant to allow user to skip the auto moderation stack.
-
-
- setUser(user)} onReset={() => setUser(null)} />
-
-
-
-
-
Start Date: {startDate && format(startDate, "yyyy/MM/dd HH:mm")}
-
End Date: {endDate && format(endDate, "yyyy/MM/dd HH:mm")}
-
- {isPast &&
The end datetime is in the past
}
-
-
-
- Reason
- setReason(v.target.value)}
- placeholder="Reason for the grant..."
- />
-
-
-
- Cancel} />
-
- Confirm
-
-
-
-
- )
-}
-
-function DatePicker({ onSelect }: { onSelect: (date: Date, startTime: number, duration: number) => void }) {
- const [date, setDate] = useState(new Date())
- const [startTime, setStartTime] = useState(null)
- const [duration, setDuration] = useState(null)
- const [open, setOpen] = useState(false)
-
- const hours = [
- { label: "1h", value: 3600 },
- { label: "2h", value: 7200 },
- { label: "6h", value: 21600 },
- { label: "12h", value: 43200 },
- ]
- const days = [
- { label: "1d", value: 86400 },
- { label: "2d", value: 172800 },
- { label: "7d", value: 604800 },
- ]
- const durations = [{ label: "Select...", value: null }, ...hours, ...days]
-
- const times = [
- { label: "Select...", value: null },
- ...Array.from({ length: 13 }, (_, i) => ({
- label: `${String(i + 8).padStart(2, "0")}:00`,
- value: i + 8,
- })),
- ]
-
- useEffect(() => {
- if (date !== undefined && startTime !== null && duration !== null) {
- onSelect(date, startTime, duration)
- }
- }, [date, duration, onSelect, startTime])
-
- return (
-
-
- Date
-
-
- {date ? format(date, "PPP") : "Select date"}
-
-
- }
- />
-
- {
- setDate(date)
- setOpen(false)
- }}
- />
-
-
-
-
- Start Time
-
-
-
-
-
-
- Time
- {times.slice(1).map((item) => (
-
- {item.label}
-
- ))}
-
-
-
-
-
- Duration
-
-
-
-
-
-
- Hours
- {hours.map((item) => (
-
- {item.label}
-
- ))}
-
-
-
- Days
- {days.map((item) => (
-
- {item.label}
-
- ))}
-
-
-
-
-
- )
-}
diff --git a/src/app/dashboard/(active)/telegram/grants/page.tsx b/src/app/dashboard/(active)/telegram/grants/page.tsx
deleted file mode 100644
index 0ca8cb4..0000000
--- a/src/app/dashboard/(active)/telegram/grants/page.tsx
+++ /dev/null
@@ -1,37 +0,0 @@
-import { Tabs, TabsContent, TabsList, TabsTrigger } from "@/components/ui/tabs"
-import { trpc } from "@/server/trpc"
-import { GrantList } from "./grant-list"
-import { NewGrant } from "./new-grant"
-
-export default async function GrantsPage() {
- const { grants: ongoing } = await trpc.tg.grants.getOngoing.query()
- const { grants: scheduled } = await trpc.tg.grants.getScheduled.query()
-
- return (
-
-
-
-
-
-
- All
-
- Ongoing
- Scheduled
-
-
-
-
-
-
-
-
-
-
-
-
- )
-}
diff --git a/src/app/dashboard/(active)/telegram/groups/group-row.tsx b/src/app/dashboard/(active)/telegram/groups/group-row.tsx
deleted file mode 100644
index bfb8006..0000000
--- a/src/app/dashboard/(active)/telegram/groups/group-row.tsx
+++ /dev/null
@@ -1,76 +0,0 @@
-"use client"
-import { Copy } from "lucide-react"
-import { useRouter } from "next/navigation"
-import { toast } from "sonner"
-import { Badge } from "@/components/ui/badge"
-import { Button } from "@/components/ui/button"
-import { setGroupHide } from "@/server/actions/groups"
-import type { TgGroup } from "@/server/trpc/types"
-import { LeaveChat } from "./leave-chat"
-
-export function GroupRow({ row: r }: { row: TgGroup }) {
- const router = useRouter()
-
- async function toggleHide() {
- const ok = await setGroupHide(r.telegramId, !r.hide).catch(() => false)
- if (!ok) {
- toast.error("The field cannot be modified")
- } else {
- toast.success("Hide option toggled!")
- router.refresh()
- }
- }
-
- return (
-
-
{r.telegramId}
-
{r.title}
-
{r.tag ? `@${r.tag}` : ``}
-
- {r.link && (
-
- {r.link}
-
- )}
-
{
- try {
- if (!r.link) return
- await navigator.clipboard.writeText(r.link)
- toast.success("Link copied to clipboard!")
- } catch (err) {
- toast.error("Cannot copy link to clipboard")
- console.error(err)
- }
- }}
- >
-
-
-
-
-
- {r.hide ? (
-
- HIDDEN
-
- ) : (
-
- Visibile
-
- )}
-
-
-
-
- )
-}
diff --git a/src/app/dashboard/(active)/telegram/groups/leave-chat.tsx b/src/app/dashboard/(active)/telegram/groups/leave-chat.tsx
deleted file mode 100644
index 8a8a284..0000000
--- a/src/app/dashboard/(active)/telegram/groups/leave-chat.tsx
+++ /dev/null
@@ -1,84 +0,0 @@
-"use client"
-
-import { OctagonX, Trash2 } from "lucide-react"
-import { useRouter } from "next/navigation"
-import { useState } from "react"
-import { toast } from "sonner"
-import { Spinner } from "@/components/spinner"
-import {
- AlertDialog,
- AlertDialogAction,
- AlertDialogCancel,
- AlertDialogContent,
- AlertDialogDescription,
- AlertDialogFooter,
- AlertDialogHeader,
- AlertDialogMedia,
- AlertDialogTitle,
- AlertDialogTrigger,
-} from "@/components/ui/alert-dialog"
-import { Button } from "@/components/ui/button"
-import { leaveChat } from "@/server/actions/groups"
-
-export function LeaveChat({ chatId }: { chatId: number }) {
- const router = useRouter()
- const [open, setOpen] = useState(false)
- const [pending, setPending] = useState(false)
-
- async function submit() {
- setPending(true)
- try {
- const { error } = await leaveChat(chatId)
-
- if (error === "UNAUTHORIZED") toast.error("You don't have enough permission")
- else if (error === "BOT_ERROR") {
- toast.error("Cannot leave the group")
- } else if (error === "NOT_FOUND") {
- toast.warning("Group left BUT not found in db")
- } else {
- toast.success("Group left and deleted")
- router.refresh()
- }
- } catch (err) {
- toast.error("There was an error")
- console.error(err)
- } finally {
- setPending(false)
- handleOpenChange(false)
- }
- }
-
- function handleOpenChange(v: boolean) {
- setOpen(v)
- }
-
- return (
-
-
-
- Leave
-
- }
- >
-
-
-
-
-
- Leave chat
-
- This will make the bot leave the chat and the backend delete the group from the table.
-
-
-
- Cancel
-
- {pending ? : "Confirm"}
-
-
-
-
- )
-}
diff --git a/src/app/dashboard/(active)/telegram/groups/loading.tsx b/src/app/dashboard/(active)/telegram/groups/loading.tsx
deleted file mode 100644
index b66a765..0000000
--- a/src/app/dashboard/(active)/telegram/groups/loading.tsx
+++ /dev/null
@@ -1,26 +0,0 @@
-import { SearchInput } from "@/components/search-input"
-import { Skeleton } from "@/components/ui/skeleton"
-
-export default async function Loading() {
- return (
-
-
-
-
-
-
Telegram ID
-
Title
-
Tag
-
Invite Link
-
Actions
-
- {new Array(12).fill(0).map((_, i) => (
-
- ))}
-
-
- )
-}
diff --git a/src/app/dashboard/(active)/telegram/groups/page.tsx b/src/app/dashboard/(active)/telegram/groups/page.tsx
deleted file mode 100644
index 47ba9cd..0000000
--- a/src/app/dashboard/(active)/telegram/groups/page.tsx
+++ /dev/null
@@ -1,34 +0,0 @@
-import { SearchInput } from "@/components/search-input"
-import { trpc } from "@/server/trpc"
-import { GroupRow } from "./group-row"
-
-export default async function TgGroups({ searchParams }: { searchParams: Promise<{ q?: string }> }) {
- const { q } = await searchParams
-
- const rows = q
- ? (await trpc.tg.groups.search.query({ limit: 20, query: q, showHidden: true })).groups
- : await trpc.tg.groups.getAll.query()
-
- const sorted = rows.sort((a, b) => a.title.localeCompare(b.title))
-
- return (
-
-
-
- Count: {rows.length}
-
-
-
-
Telegram ID
-
Title
-
Tag
-
Invite Link
-
Actions
-
- {sorted.map((r) => (
-
- ))}
-
-
- )
-}
diff --git a/src/app/dashboard/(active)/telegram/users/[id]/add-role.tsx b/src/app/dashboard/(active)/telegram/users/[id]/add-role.tsx
deleted file mode 100644
index 361ddc1..0000000
--- a/src/app/dashboard/(active)/telegram/users/[id]/add-role.tsx
+++ /dev/null
@@ -1,148 +0,0 @@
-"use client"
-import { USER_ROLE } from "@polinetwork/backend"
-import { Plus } from "lucide-react"
-import { useRouter } from "next/navigation"
-import { useState } from "react"
-import { toast } from "sonner"
-import { Spinner } from "@/components/spinner"
-import { Badge } from "@/components/ui/badge"
-import { Button } from "@/components/ui/button"
-import {
- Dialog,
- DialogClose,
- DialogContent,
- DialogDescription,
- DialogFooter,
- DialogHeader,
- DialogTitle,
- DialogTrigger,
-} from "@/components/ui/dialog"
-import { Select, SelectContent, SelectGroup, SelectItem, SelectTrigger, SelectValue } from "@/components/ui/select"
-import { addUserRole } from "@/server/actions/users"
-import type { TgUser, TgUserRole } from "@/server/trpc/types"
-
-const ARRAY_USER_ROLES = [
- USER_ROLE.ADMIN,
- USER_ROLE.HR,
- USER_ROLE.OWNER,
- USER_ROLE.CREATOR,
- USER_ROLE.DIRETTIVO,
- USER_ROLE.PRESIDENT,
-] as const
-
-export function AddRole({
- user,
- alreadyRoles,
- // onAdd
-}: {
- user: TgUser
- alreadyRoles: TgUserRole[]
- // onAdd(): void
-}) {
- const availableRoles = ARRAY_USER_ROLES.filter((r) => !alreadyRoles.includes(r)).map((g) => ({
- value: g,
- label: `${g.slice(0, 1).toUpperCase()}${g.slice(1)}`,
- }))
-
- const [open, setOpen] = useState(false)
- const [pending, setPending] = useState(false)
- const [selectedRole, setSelectedRole] = useState(null)
-
- const router = useRouter()
-
- async function submit() {
- if (!selectedRole) return toast.warning("No group selected, cannot proceed")
- if (!user) return toast.warning("Invalid user, try restarting the dialog")
-
- setPending(true)
-
- try {
- const { error } = await addUserRole(user.id, selectedRole)
-
- if (error === "UNAUTHORIZED") toast.error("You don't have enough permission")
- else if (error === "INTERNAL_SERVER_ERROR") toast.error("There was an internal server error")
- else if (error === "UNAUTHORIZED_SELF_ASSIGN") toast.error("You cannot add roles to yourself")
- else {
- toast.success(`Role added!`)
- router.refresh()
- // onAdd()
- }
- handleOpenChange(false)
- } catch (err) {
- console.error(err)
- toast.error("There was an error, check logs")
- } finally {
- setPending(false)
- handleOpenChange(false)
- }
- }
-
- function handleOpenChange(v: boolean) {
- setOpen(v)
- if (v === false) {
- setSelectedRole(null)
- }
- }
-
- return (
-
-
- Add Role
-
- }
- />
-
-
- Add Role
- Add a new role to a telegram user
-
- {user && (
-
- Target: {user.firstName} {user.username && `@${user.username}`} [{user.id}]
-
- )}
-
- User roles:
- {alreadyRoles.map((r) => (
- {r}
- ))}
-
-
- setSelectedRole(v)}
- disabled={availableRoles.length === 0}
- >
-
-
-
-
-
- {availableRoles.map((item) => (
-
- {item.label}
-
- ))}
-
-
-
-
-
-
- Cancel
-
- }
- />
-
- {pending ? : "Confirm"}
-
-
-
-
- )
-}
diff --git a/src/app/dashboard/(active)/telegram/users/[id]/card-audit-log.tsx b/src/app/dashboard/(active)/telegram/users/[id]/card-audit-log.tsx
deleted file mode 100644
index 4c412d8..0000000
--- a/src/app/dashboard/(active)/telegram/users/[id]/card-audit-log.tsx
+++ /dev/null
@@ -1,40 +0,0 @@
-import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card"
-import { fmtUser } from "@/lib/utils/telegram"
-import type { getUserDetails } from "@/server/actions/users"
-
-type Data = Awaited>
-type Log = NonNullable["audits"][number]
-
-export function AuditLogCard({ log: m }: { log: Log }) {
- return (
-
-
- {m.type}
-
-
- Chat:
-
- {m.groupTitle && {m.groupTitle} } [{m.groupId}]
-
- Admin ID:
- {m.admin && fmtUser(m.admin)}
-
- {m.createdAt && (
- <>
- Created:
- {m.createdAt.toLocaleString()}
- >
- )}
-
- {m.until && (
- <>
- Until:
- {m.until.toLocaleString()}
- >
- )}
- Reason:
- {m.reason ? {m.reason}
: N/A
}
-
-
- )
-}
diff --git a/src/app/dashboard/(active)/telegram/users/[id]/card-group-admin.tsx b/src/app/dashboard/(active)/telegram/users/[id]/card-group-admin.tsx
deleted file mode 100644
index ea70a93..0000000
--- a/src/app/dashboard/(active)/telegram/users/[id]/card-group-admin.tsx
+++ /dev/null
@@ -1,39 +0,0 @@
-import { Code } from "@/components/code"
-import { Card, CardContent, CardFooter, CardHeader, CardTitle } from "@/components/ui/card"
-import { stripChatId } from "@/lib/utils/telegram"
-import type { ApiOutput } from "@/server/trpc/types"
-import { DeleteGroupAdmin } from "./delete-group-admin"
-
-type User = ApiOutput["tg"]["users"]["getByUsername"]["user"]
-type GroupAdminSingle = NonNullable
-
-export function GroupAdminCard({
- user,
- groupAdminInfo: m,
- // onDelete,
-}: {
- user: NonNullable
- groupAdminInfo: GroupAdminSingle
- // onDelete(): void
-}) {
- return (
-
-
- {m.group.title}
-
-
-
- Chat ID:
- {m.group.id} / {stripChatId(m.group.id)}
-
-
- Added By:
- {m.addedBy.firstName} {m.addedBy.username ? `@${m.addedBy.username}` : ""}
-
-
-
-
-
-
- )
-}
diff --git a/src/app/dashboard/(active)/telegram/users/[id]/card-message.tsx b/src/app/dashboard/(active)/telegram/users/[id]/card-message.tsx
deleted file mode 100644
index 46603cc..0000000
--- a/src/app/dashboard/(active)/telegram/users/[id]/card-message.tsx
+++ /dev/null
@@ -1,50 +0,0 @@
-import { ExternalLinkIcon } from "lucide-react"
-import { Button } from "@/components/ui/button"
-import { Card, CardContent, CardFooter } from "@/components/ui/card"
-import { stripChatId } from "@/lib/utils/telegram"
-import type { ApiOutput } from "@/server/trpc/types"
-
-type Message = NonNullable[number]
-export function MessageCard({ message: m }: { message: Message }) {
- return (
-
-
-
- Chat:
- {m.group && {m.group.title} } [{m.chatId}]
-
-
- Message ID:
- {m.messageId}
-
-
- Timestamp:
- {m.timestamp.toLocaleString()}
-
- Content:
-
- {m.message.slice(0, 40)} {m.message.length >= 40 && "[...]"}
-
-
-
- {m.group?.inviteLink && (
-
-
- Join Chat
-
-
- )}
-
-
- Open
-
-
-
-
- )
-}
diff --git a/src/app/dashboard/(active)/telegram/users/[id]/card-user-grant.tsx b/src/app/dashboard/(active)/telegram/users/[id]/card-user-grant.tsx
deleted file mode 100644
index 7dbeb37..0000000
--- a/src/app/dashboard/(active)/telegram/users/[id]/card-user-grant.tsx
+++ /dev/null
@@ -1,34 +0,0 @@
-"use client"
-import { format } from "date-fns"
-import { Sparkle } from "lucide-react"
-import { Card, CardContent, CardDescription, CardFooter, CardHeader, CardTitle } from "@/components/ui/card"
-import type { TgGrant, TgUser } from "@/server/trpc/types"
-import { DeleteGrant } from "../../grants/delete-grant"
-
-export function UserGrantCard({
- user,
- grant,
- //onDelete
-}: {
- user: TgUser
- grant: TgGrant
- //onDelete(): void
-}) {
- return (
-
-
-
- Ongoing Grant
-
- This user has an ongoing grant
-
-
- Start: {format(grant.validSince, "yyyy/MM/dd HH:mm")}
- End: {format(grant.validUntil, "yyyy/MM/dd HH:mm")}
-
-
-
-
-
- )
-}
diff --git a/src/app/dashboard/(active)/telegram/users/[id]/card-user-info.tsx b/src/app/dashboard/(active)/telegram/users/[id]/card-user-info.tsx
deleted file mode 100644
index 52741df..0000000
--- a/src/app/dashboard/(active)/telegram/users/[id]/card-user-info.tsx
+++ /dev/null
@@ -1,58 +0,0 @@
-"use client"
-import { Star } from "lucide-react"
-import { Badge } from "@/components/ui/badge"
-import { Card, CardContent, CardFooter, CardHeader, CardTitle } from "@/components/ui/card"
-import { useSession } from "@/lib/auth"
-import type { ApiOutput } from "@/server/trpc/types"
-import { AddRole } from "./add-role"
-import { RemoveRole } from "./remove-role"
-
-type User = ApiOutput["tg"]["users"]["getByUsername"]["user"]
-type UserRoles = ApiOutput["tg"]["permissions"]["getRoles"]["roles"]
-
-export function UserInfoCard({
- user,
- roles,
- // onUpdate,
-}: {
- user: NonNullable
- roles: UserRoles
- // onUpdate(): void
-}) {
- const sesh = useSession()
- const seshUserId = sesh.data?.user.telegramId
- const isSelf = seshUserId && seshUserId === user.id
-
- return (
-
-
-
- # User ID: {user.id}{" "}
- {isSelf && (
-
- You
-
- )}
-
-
-
-
- Name:
- {user.firstName} {user.lastName ?? ""}
-
-
- Username:
- {user.username}
-
-
- Roles:
- {roles ? roles.map((r) => {r} ) : "N/A"}
-
-
-
-
-
-
-
- )
-}
diff --git a/src/app/dashboard/(active)/telegram/users/[id]/delete-group-admin.tsx b/src/app/dashboard/(active)/telegram/users/[id]/delete-group-admin.tsx
deleted file mode 100644
index 25b0b36..0000000
--- a/src/app/dashboard/(active)/telegram/users/[id]/delete-group-admin.tsx
+++ /dev/null
@@ -1,88 +0,0 @@
-"use client"
-
-import { Trash2, Trash2Icon } from "lucide-react"
-import { useRouter } from "next/navigation"
-import { useState } from "react"
-import { toast } from "sonner"
-import { Spinner } from "@/components/spinner"
-import {
- AlertDialog,
- AlertDialogAction,
- AlertDialogCancel,
- AlertDialogContent,
- AlertDialogDescription,
- AlertDialogFooter,
- AlertDialogHeader,
- AlertDialogMedia,
- AlertDialogTitle,
- AlertDialogTrigger,
-} from "@/components/ui/alert-dialog"
-import { Button } from "@/components/ui/button"
-import { delGroupAdmin } from "@/server/actions/users"
-
-export function DeleteGroupAdmin({
- userId,
- chatId,
- // onDelete
-}: {
- userId: number
- chatId: number
- // onDelete(): void
-}) {
- const [open, setOpen] = useState(false)
- const [pending, setPending] = useState(false)
-
- const router = useRouter()
-
- async function deleteGroupAdmin() {
- setPending(true)
-
- try {
- const { error } = await delGroupAdmin(userId, chatId)
-
- if (error === "NOT_FOUND") toast.info("User or group admin not found")
- else if (error === "UNAUTHORIZED") toast.error("You don't have enough permission")
- else if (error === "INTERNAL_SERVER_ERROR") toast.error("There was an internal server error")
- else if (error === "UNAUTHORIZED_SELF_ASSIGN") toast.error("You cannot delete on yourself")
- else {
- toast.success("Group Admin deleted!")
- router.refresh()
- // onDelete()
- }
- } catch (err) {
- toast.error("There was an error")
- console.error(err)
- } finally {
- setOpen(false)
- setPending(false)
- }
- }
-
- return (
-
-
-
- Delete
-
- }
- >
-
-
-
-
-
- Remove Group Admin
- Are you sure you want to remove the group admin?
-
-
- Cancel
-
- {pending ? : "Confirm"}
-
-
-
-
- )
-}
diff --git a/src/app/dashboard/(active)/telegram/users/[id]/loading.tsx b/src/app/dashboard/(active)/telegram/users/[id]/loading.tsx
deleted file mode 100644
index be3d0ae..0000000
--- a/src/app/dashboard/(active)/telegram/users/[id]/loading.tsx
+++ /dev/null
@@ -1,37 +0,0 @@
-import { Skeleton } from "@/components/ui/skeleton"
-
-export default async function Loading() {
- return (
-
-
-
-
-
-
-
-
Admin in groups:
-
-
-
-
-
-
-
-
Last messages (max 12):
-
-
-
-
-
-
-
-
Audit log:
-
- {new Array(9).fill(0).map((_, i) => (
-
- ))}
-
-
-
- )
-}
diff --git a/src/app/dashboard/(active)/telegram/users/[id]/new-group-admin.tsx b/src/app/dashboard/(active)/telegram/users/[id]/new-group-admin.tsx
deleted file mode 100644
index 840e20d..0000000
--- a/src/app/dashboard/(active)/telegram/users/[id]/new-group-admin.tsx
+++ /dev/null
@@ -1,163 +0,0 @@
-"use client"
-import { Plus, Search, X } from "lucide-react"
-import { useRouter } from "next/navigation"
-import { useState } from "react"
-import { toast } from "sonner"
-import { Button } from "@/components/ui/button"
-import {
- Dialog,
- DialogClose,
- DialogContent,
- DialogDescription,
- DialogFooter,
- DialogHeader,
- DialogTitle,
- DialogTrigger,
-} from "@/components/ui/dialog"
-import { Input } from "@/components/ui/input"
-import { Label } from "@/components/ui/label"
-import { Select, SelectContent, SelectGroup, SelectItem, SelectTrigger } from "@/components/ui/select"
-import { searchGroup } from "@/server/actions/groups"
-import { addGroupAdmin } from "@/server/actions/users"
-import type { ApiOutput } from "@/server/trpc/types"
-
-type Groups = ApiOutput["tg"]["groups"]["search"]["groups"]
-type User = ApiOutput["tg"]["users"]["getByUsername"]["user"]
-
-export function NewGroupAdmin({
- user,
- alreadyIn,
- // onConfirm
-}: {
- user: User
- alreadyIn: number[]
- // onConfirm(): void
-}) {
- const [open, setOpen] = useState(false)
- const [groupQuery, setGroupQuery] = useState("")
- const [groups, setGroups] = useState([])
- const [selectedGroup, setSelectedGroup] = useState(null)
-
- const router = useRouter()
-
- async function search() {
- const { groups } = await searchGroup(groupQuery)
- setGroups(groups.filter((g) => !alreadyIn.includes(g.telegramId)))
- }
-
- async function submit() {
- if (!selectedGroup) return toast.warning("No group selected, cannot proceed")
- if (!user) return toast.warning("Invalid user, try restarting the dialog")
-
- try {
- const { error } = await addGroupAdmin(user.id, selectedGroup.telegramId)
- if (error) {
- toast.error("You don't have enough permissions")
- } else {
- toast.info(`Group admin added`)
- router.refresh()
- // onConfirm()
- }
- } catch (err) {
- console.error(err)
- toast.error("There was an error, check logs")
- } finally {
- handleOpenChange(false)
- }
- }
-
- function reset() {
- setGroups([])
- setGroupQuery("")
- setSelectedGroup(null)
- }
-
- function handleOpenChange(v: boolean) {
- setOpen(v)
- if (v === false) {
- reset()
- }
- }
-
- return (
-
-
- New
-
- }
- />
-
-
- New Group Admin
- Make the user admin in a group.
-
- {user && (
-
- Target: {user.firstName} {user.username && `@${user.username}`} [{user.id}]
-
- )}
-
-
-
- {groups && (
- ({ value: g, label: g.title }))}
- value={selectedGroup}
- onValueChange={(v) => setSelectedGroup(v)}
- disabled={groups.length === 0}
- >
- {selectedGroup?.title ?? "Select a group"}
-
-
- {groups.map((item) => (
-
- {item.title}
-
- ))}
-
-
-
- )}
-
- Cancel} />
-
- Confirm
-
-
-
-
- )
-}
diff --git a/src/app/dashboard/(active)/telegram/users/[id]/page.tsx b/src/app/dashboard/(active)/telegram/users/[id]/page.tsx
deleted file mode 100644
index bc83ede..0000000
--- a/src/app/dashboard/(active)/telegram/users/[id]/page.tsx
+++ /dev/null
@@ -1,83 +0,0 @@
-import { notFound } from "next/navigation"
-import { Suspense } from "react"
-import { getUserDetails } from "@/server/actions/users"
-import { AuditLogCard } from "./card-audit-log"
-import { GroupAdminCard } from "./card-group-admin"
-import { MessageCard } from "./card-message"
-import { UserGrantCard } from "./card-user-grant"
-import { UserInfoCard } from "./card-user-info"
-import { NewGroupAdmin } from "./new-group-admin"
-
-export default async function TgUserDetails({ params }: { params: Promise<{ id: string }> }) {
- const { id } = await params
- const parsedInt = parseInt(id, 10)
- if (isNaN(parsedInt)) notFound()
- const data = await getUserDetails(parsedInt)
-
- if (!data) notFound()
-
- return (
-
- {data && (
- <>
-
-
- {data.grant && }
-
-
-
-
-
Admin in groups:
-
g?.group.id ?? 0) ?? []} />
-
-
-
- {data.groupAdmin
- .filter((m) => m !== null && m !== undefined)
- .map((m) => (
-
- ))}
-
- {data.groupAdmin.length === 0 && (
-
- This user is not group admin in any group.
-
- )}
-
-
-
-
-
Last messages (max 15):
-
- {data.messages?.map((m) => (
-
- ))}
-
- {data.messages?.length === 0 && (
-
- No recent messages sent by this user
-
- )}
-
-
-
-
-
Audit log:
-
- {data.audits.map((m) => (
-
-
-
- ))}
- {data.audits.length === 0 && (
-
- No audit log found for this user
-
- )}
-
-
- >
- )}
-
- )
-}
diff --git a/src/app/dashboard/(active)/telegram/users/[id]/remove-role.tsx b/src/app/dashboard/(active)/telegram/users/[id]/remove-role.tsx
deleted file mode 100644
index 82ddde0..0000000
--- a/src/app/dashboard/(active)/telegram/users/[id]/remove-role.tsx
+++ /dev/null
@@ -1,152 +0,0 @@
-"use client"
-import { USER_ROLE } from "@polinetwork/backend"
-import { Minus } from "lucide-react"
-import { useRouter } from "next/navigation"
-import { useState } from "react"
-import { toast } from "sonner"
-import { Spinner } from "@/components/spinner"
-import { Badge } from "@/components/ui/badge"
-import { Button } from "@/components/ui/button"
-import {
- Dialog,
- DialogClose,
- DialogContent,
- DialogDescription,
- DialogFooter,
- DialogHeader,
- DialogTitle,
- DialogTrigger,
-} from "@/components/ui/dialog"
-import { Select, SelectContent, SelectGroup, SelectItem, SelectTrigger, SelectValue } from "@/components/ui/select"
-import { useSession } from "@/lib/auth"
-import { delUserRole } from "@/server/actions/users"
-import type { TgUser, TgUserRole } from "@/server/trpc/types"
-
-const ARRAY_USER_ROLES = [
- USER_ROLE.ADMIN,
- USER_ROLE.HR,
- USER_ROLE.OWNER,
- USER_ROLE.CREATOR,
- USER_ROLE.DIRETTIVO,
- USER_ROLE.PRESIDENT,
-] as const
-
-export function RemoveRole({
- user,
- alreadyRoles,
- // onDelete,
-}: {
- user: TgUser
- alreadyRoles: TgUserRole[]
- // onDelete(): void
-}) {
- const sesh = useSession()
- const removerId = sesh.data?.user.telegramId
-
- const userRoles = ARRAY_USER_ROLES.filter((r) => alreadyRoles.includes(r)).map((g) => ({
- value: g,
- label: `${g.slice(0, 1).toUpperCase()}${g.slice(1)}`,
- }))
-
- const [open, setOpen] = useState(false)
- const [pending, setPending] = useState(false)
- const [selectedRole, setSelectedRole] = useState(null)
-
- const router = useRouter()
-
- async function submit() {
- if (!removerId) return toast.warning("Invalid session, try reloading the page")
- if (!selectedRole) return toast.warning("No group selected, cannot proceed")
- if (!user) return toast.warning("Invalid user, try restarting the dialog")
- setPending(true)
-
- try {
- const { error } = await delUserRole(user.id, selectedRole)
-
- if (error === "NOT_FOUND") toast.info("User or role not found")
- else if (error === "UNAUTHORIZED") toast.error("You don't have enough permission")
- else if (error === "INTERNAL_SERVER_ERROR") toast.error("There was an internal server error")
- else if (error === "UNAUTHORIZED_SELF_ASSIGN") toast.error("You cannot delete on yourself")
- else {
- toast.success("Role removed!")
- router.refresh()
- // onDelete()
- }
- } catch (err) {
- console.error(err)
- toast.error("There was an error, check logs")
- } finally {
- setPending(false)
- handleOpenChange(false)
- }
- }
-
- function handleOpenChange(v: boolean) {
- setOpen(v)
- if (v === false) {
- setSelectedRole(null)
- }
- }
-
- return (
-
-
- Remove Role
-
- }
- />
-
-
- Remove Role
- Remove a role from the telegram user
-
- {user && (
-
- Target: {user.firstName} {user.username && `@${user.username}`} [{user.id}]
-
- )}
-
- User roles:
- {alreadyRoles.map((r) => (
- {r}
- ))}
-
-
- setSelectedRole(v)}
- disabled={userRoles.length === 0}
- >
-
-
-
-
-
- {userRoles.map((item) => (
-
- {item.label}
-
- ))}
-
-
-
-
-
-
- Cancel
-
- }
- />
-
- {pending ? : "Confirm"}
-
-
-
-
- )
-}
diff --git a/src/app/dashboard/(active)/telegram/users/loading.tsx b/src/app/dashboard/(active)/telegram/users/loading.tsx
deleted file mode 100644
index e289840..0000000
--- a/src/app/dashboard/(active)/telegram/users/loading.tsx
+++ /dev/null
@@ -1,25 +0,0 @@
-import { SearchInput } from "@/components/search-input"
-import { Skeleton } from "@/components/ui/skeleton"
-
-export default async function Loading() {
- return (
-
-
-
-
-
-
Telegram ID
-
Username
-
Name
-
Actions
-
- {new Array(12).fill(0).map((_, i) => (
-
- ))}
-
-
- )
-}
diff --git a/src/app/dashboard/(active)/telegram/users/page.tsx b/src/app/dashboard/(active)/telegram/users/page.tsx
deleted file mode 100644
index 5a52f6d..0000000
--- a/src/app/dashboard/(active)/telegram/users/page.tsx
+++ /dev/null
@@ -1,56 +0,0 @@
-import { Eye } from "lucide-react"
-import Link from "next/link"
-import { SearchInput } from "@/components/search-input"
-import { Button } from "@/components/ui/button"
-import { trpc } from "@/server/trpc"
-import type { ApiOutput } from "@/server/trpc/types"
-
-type Users = NonNullable
-
-export default async function TgUsers({ searchParams }: { searchParams: Promise<{ q?: string }> }) {
- const { q } = await searchParams
- const { users } = await trpc.tg.users.getAll.query()
-
- const data = (!q ? users : users?.filter((u) => u.username?.toLowerCase().replace("@", "").startsWith(q))) ?? []
-
- return (
-
-
-
- Count: {users?.length}
-
-
-
-
Telegram ID
-
Username
-
Name
-
Actions
-
- {data.length > 0 ? (
- data.map((r) =>
)
- ) : (
-
No users found
- )}
-
-
- )
-}
-
-function UserRow({ row: r }: { row: Users[number] }) {
- return (
-
-
{r.id}
-
{r.username ? `@${r.username}` : ``}
-
- {r.firstName ?? ""} {r.lastName ?? ""}
-
-
-
-
-
-
-
-
-
- )
-}
diff --git a/src/app/dashboard/disabled/page.tsx b/src/app/dashboard/disabled/page.tsx
deleted file mode 100644
index b0c7cba..0000000
--- a/src/app/dashboard/disabled/page.tsx
+++ /dev/null
@@ -1,44 +0,0 @@
-import Image from "next/image"
-import { redirect } from "next/navigation"
-import accountSvg from "@/assets/svg/account_disabled.svg"
-import { LogoutButton } from "@/components/logout-button"
-import { getServerSession } from "@/server/auth"
-// import { USER_ROLE } from "@/constants";
-
-export default async function AdminInactive() {
- const { data: session } = await getServerSession()
- // if (session?.user.role !== USER_ROLE.DISABLED) redirect("/dashboard");
- // TODO
- if (!session) return redirect("/login")
-
- return (
- session && (
-
-
-
-
- Il tuo account è stato disabilitato
-
-
-
- Il tuo account è stato disabilitato in quanto non sei un membro riconosciuto di PoliNetwork.
-
-
Se credi che sia un errore, manda una richiesta di rivalutazione.
-
-
-
-
- {session.user.name}
- {` <${session.user.email}>`}
-
{" "}
-
-
-
- )
- )
-}
diff --git a/src/app/dashboard/inactive/logout.tsx b/src/app/dashboard/inactive/logout.tsx
deleted file mode 100644
index e69de29..0000000
diff --git a/src/app/dashboard/inactive/page.tsx b/src/app/dashboard/inactive/page.tsx
deleted file mode 100644
index 9b36247..0000000
--- a/src/app/dashboard/inactive/page.tsx
+++ /dev/null
@@ -1,53 +0,0 @@
-import Image from "next/image"
-import { redirect } from "next/navigation"
-import accountSvg from "@/assets/svg/account_inactive.svg"
-import { LogoutButton } from "@/components/logout-button"
-import { getServerSession } from "@/server/auth"
-// import { USER_ROLE } from "@/constants";
-
-export default async function AdminInactive() {
- const { data: session } = await getServerSession()
- if (!session) return redirect("/login")
- // if (session?.user.role !== USER_ROLE.INACTIVE) redirect("/dashboard");
- // TODO
-
- return (
- session && (
-
-
-
-
- Il tuo account deve
- essere abilitato da un dashboard IT
-
-
- Per accedere con GitHub, è necessario che l'account venga abilitato da un dashboard IT, in quanto si
- tratta di una dashboard interna di PoliNetwork.
-
-
- Se sei già un socio di PoliNetwork, puoi accedere direttamente con il tuo indirizzo
- nome.cognome@polinetwork.org tramite "Microsoft Entra ID" e il tuo account sarà automaticamente
- verificato.
-
-
- Se sei entrato con il tuo indirizzo nome.cognome@polinetwork.org e il tuo account risulta inattivo, potrebbe
- essere stato disabilitato. Contatta un dashboard IT per ottenere più informazioni.
-
-
-
-
-
- {session.user.name}
- {` <${session.user.email}>`}
-
{" "}
-
-
-
- )
- )
-}
diff --git a/src/app/dashboard/layout.tsx b/src/app/dashboard/layout.tsx
deleted file mode 100644
index 54aee61..0000000
--- a/src/app/dashboard/layout.tsx
+++ /dev/null
@@ -1,24 +0,0 @@
-import { redirect } from "next/navigation"
-import { getServerSession } from "@/server/auth"
-import { trpc } from "@/server/trpc"
-
-export default async function AdminLayout({ children }: { children: React.ReactNode }) {
- const session = await getServerSession()
- // console.log(session)
- if (!session.data) redirect("/login")
-
- const tgId = session.data.user.telegramId
- if (!tgId) redirect("/onboarding/link")
- // if (session?.user.role === USER_ROLE.INACTIVE) ;
- // if (session?.user.role === USER_ROLE.DISABLED) redirect("/dashboard/disabled");
-
- const { roles } = await trpc.tg.permissions.getRoles.query({ userId: tgId })
- if (!roles || roles.length === 0) redirect("/onboarding/no-role")
- if (roles.includes("creator")) redirect("/onboarding/unauthorized")
-
- // temp until we have route-based permissions check
- if (!roles.includes("owner") && !roles.includes("direttivo") && !roles.includes("president"))
- redirect("/onboarding/unauthorized")
-
- return children
-}
diff --git a/src/app/layout.tsx b/src/app/layout.tsx
deleted file mode 100644
index 02c7f72..0000000
--- a/src/app/layout.tsx
+++ /dev/null
@@ -1,53 +0,0 @@
-import type { Metadata } from "next"
-import { Geist, Poppins } from "next/font/google"
-import "@/index.css"
-import { HEADER_HEIGHT } from "@/components/header"
-import { ThemeProvider } from "@/components/theme-provider"
-import { Toaster } from "@/components/ui/sonner"
-import { TooltipProvider } from "@/components/ui/tooltip"
-import { cn } from "@/lib/utils/shadcn"
-
-const geist = Geist({ subsets: ["latin"], variable: "--font-sans" })
-
-const desc = "PoliNetwork Admin Dashboard"
-
-export const metadata: Metadata = {
- title: {
- default: "PoliNetwork Admin",
- template: "%s | PoliNetwork Admin",
- },
- description: desc,
- icons: [{ rel: "icon", url: "/favicon.ico" }],
-}
-
-const poppins = Poppins({ weight: ["100", "200", "300", "400", "500", "600", "700", "800", "900"], subsets: ["latin"] })
-
-export default function RootLayout({ children }: Readonly<{ children: React.ReactNode }>) {
- return (
-
-
-
-
- {children}
-
-
-
-
-
- )
-}
diff --git a/src/app/page.tsx b/src/app/page.tsx
deleted file mode 100644
index a658b62..0000000
--- a/src/app/page.tsx
+++ /dev/null
@@ -1,20 +0,0 @@
-import { redirect } from "next/navigation"
-import { Header } from "@/components/header"
-import { getServerSession } from "@/server/auth"
-import { CanIAccess } from "./(auth)/login/can-i-access"
-import { WhatIs } from "./(auth)/login/what-is"
-
-export default async function IndexPage() {
- const session = await getServerSession()
- if (session.data?.user) redirect("/dashboard")
-
- return (
-
-
-
-
-
-
-
- )
-}
diff --git a/src/app/testtrpc/page.tsx b/src/app/testtrpc/page.tsx
deleted file mode 100644
index 7e284b7..0000000
--- a/src/app/testtrpc/page.tsx
+++ /dev/null
@@ -1,19 +0,0 @@
-import { testDb } from "@/server/actions/test"
-export const dynamic = "force-dynamic"
-
-export default async function TestTRPCPage() {
- const data = await testDb()
-
- return (
-
-
Test with tRPC. Get the table `test.tg`
-
- {data.map((r, i) => (
-
- {r}
-
- ))}
-
-
- )
-}
diff --git a/src/components/app-mark.tsx b/src/components/app-mark.tsx
new file mode 100644
index 0000000..2ac8fa3
--- /dev/null
+++ b/src/components/app-mark.tsx
@@ -0,0 +1,18 @@
+import { Link } from "@tanstack/react-router"
+import logoUrl from "@/assets/logo.png"
+
+export function AppMark({ compact = false }: { compact?: boolean }) {
+ return (
+
+
+ {!compact && (
+
+ PoliNetwork
+
+ ADMIN CONSOLE
+
+
+ )}
+
+ )
+}
diff --git a/src/components/code.tsx b/src/components/code.tsx
deleted file mode 100644
index b0a60f8..0000000
--- a/src/components/code.tsx
+++ /dev/null
@@ -1,77 +0,0 @@
-"use client"
-
-import { type MouseEvent, type ReactNode, useCallback, useRef } from "react"
-import { toast } from "sonner"
-import { cn } from "@/lib/utils/shadcn"
-
-type Props = React.HTMLAttributes & {
- block?: boolean
- copyOnClick?: boolean
- children: ReactNode
-}
-
-export function Code({ block = false, copyOnClick = false, children, className, ...rest }: Props) {
- const ref = useRef(null)
-
- const copy = useCallback(async (e: MouseEvent) => {
- e.preventDefault()
- try {
- if (!ref.current) return
- await navigator.clipboard.writeText(ref.current.innerText)
- toast.success("Copied to clipboard")
- } catch (err) {
- console.error("Failed to copy code:", err)
- toast.error("Failed to copy code")
- }
- }, [])
-
- const InteractiveWrapper = copyOnClick
- ? ({ children: content }: { children: ReactNode }) => (
-
- {content}
-
- )
- : ({ children: content }: { children: ReactNode }) => <>{content}>
-
- if (block) {
- return (
-
-
-
- {children}
-
-
-
- )
- }
-
- return (
-
-
- {children}
-
-
- )
-}
diff --git a/src/components/dashboard-frame.tsx b/src/components/dashboard-frame.tsx
new file mode 100644
index 0000000..8c346df
--- /dev/null
+++ b/src/components/dashboard-frame.tsx
@@ -0,0 +1,171 @@
+import { Link, Outlet, useRouter, useRouterState } from "@tanstack/react-router"
+import { Database, LayoutDashboard, LogOut, Menu, Settings, ShieldCheck, UsersRound, X } from "lucide-react"
+import { useState } from "react"
+import { Button } from "@/components/ui/button"
+import { auth, useSession } from "@/lib/auth"
+import { cn } from "@/lib/utils"
+import type { AdminSession } from "@/server/api.functions"
+import { AppMark } from "./app-mark"
+import { ThemeToggle } from "./theme-toggle"
+
+const navigation = [
+ { label: "Overview", to: "/dashboard", icon: LayoutDashboard },
+ { label: "Telegram users", to: "/dashboard/telegram/users", icon: UsersRound },
+ { label: "Groups", to: "/dashboard/telegram/groups", icon: Database },
+ { label: "Access grants", to: "/dashboard/telegram/grants", icon: ShieldCheck },
+ { label: "Azure members", to: "/dashboard/azure/members", icon: UsersRound },
+] as const
+
+function currentTitle(pathname: string) {
+ return (
+ navigation.find((item) => item.to === pathname)?.label ??
+ (pathname.includes("/account") ? "Account" : "Member profile")
+ )
+}
+
+function initials(name?: string | null, email?: string) {
+ const source = name?.trim() || email?.split("@")[0] || "User"
+ return source
+ .split(/[\s._-]+/)
+ .slice(0, 2)
+ .map((part) => part[0]?.toUpperCase())
+ .join("")
+}
+
+export function DashboardFrame({ initialSession }: { initialSession: AdminSession }) {
+ const [open, setOpen] = useState(false)
+ const [loggingOut, setLoggingOut] = useState(false)
+ const router = useRouter()
+ const sessionQuery = useSession()
+ const session = (sessionQuery.data as AdminSession | null) ?? initialSession
+ const user = session.user
+ const pathname = useRouterState({ select: (state) => state.location.pathname })
+ const title = currentTitle(pathname)
+
+ async function logout() {
+ setLoggingOut(true)
+ await auth.signOut()
+ await router.invalidate()
+ await router.navigate({ to: "/login", replace: true })
+ }
+
+ return (
+
+
+
+
+
setOpen(false)}
+ aria-label="Close navigation"
+ >
+
+
+
+
+
+ WORKSPACE
+
+ {navigation.map(({ label, to, icon: Icon }) => (
+ setOpen(false)}
+ className="flex items-center gap-2.5 border-l-2 border-transparent px-2.5 py-2.5 text-[13px] text-[#b8c5d8] transition-colors hover:bg-white/[0.06] hover:text-white"
+ activeProps={{
+ className:
+ "flex items-center gap-2.5 border-l-2 border-[#75adf4] bg-[#508fe0]/[0.18] px-2.5 py-2.5 text-[13px] text-[#f5f7ec]",
+ }}
+ activeOptions={{ exact: to === "/dashboard" }}
+ >
+
+ {label}
+
+ ))}
+
+
+
setOpen(false)}
+ className="flex items-center gap-2.5 border-l-2 border-transparent px-2.5 py-2.5 text-[13px] text-[#b8c5d8] transition-colors hover:bg-white/[0.06] hover:text-white"
+ activeProps={{
+ className:
+ "flex items-center gap-2.5 border-l-2 border-[#75adf4] bg-[#508fe0]/[0.18] px-2.5 py-2.5 text-[13px] text-[#f5f7ec]",
+ }}
+ >
+
+
Account settings
+
+
+ {user?.image ? (
+
+ ) : (
+
+ {initials(user?.name, user?.email)}
+
+ )}
+
+ {user?.name || "PoliNetwork member"}
+
+ {user?.email || "Authenticated account"}
+
+
+
void logout()}
+ disabled={loggingOut}
+ aria-label="Sign out"
+ title="Sign out"
+ >
+
+
+
+
+
+ {open && (
+
setOpen(false)}
+ />
+ )}
+
+
+
+
setOpen(true)}
+ aria-label="Open navigation"
+ >
+
+
+
+
+ POLINETWORK / {title.toUpperCase()}
+
+
{title}
+
+
+
+
+
+
+
+
+
+ )
+}
diff --git a/src/components/dashboard-sidebar/data.tsx b/src/components/dashboard-sidebar/data.tsx
deleted file mode 100644
index 7401a0c..0000000
--- a/src/components/dashboard-sidebar/data.tsx
+++ /dev/null
@@ -1,41 +0,0 @@
-import { MessageCircleMoreIcon, Sparkle, Users } from "lucide-react"
-import Image from "next/image"
-import azureSvg from "@/assets/svg/azure.svg"
-import telegramSvg from "@/assets/svg/telegram.svg"
-
-export const DSData = {
- mainNav: [
- {
- title: "Telegram",
- icon: ,
- items: [
- { title: "Grants", url: "/dashboard/telegram/grants", icon: },
- { title: "Groups", url: "/dashboard/telegram/groups", icon: },
- { title: "Users", url: "/dashboard/telegram/users", icon: },
- ],
- },
- {
- title: "Azure",
- icon: ,
- items: [{ title: "Members", url: "/dashboard/azure/members", icon: }],
- },
- ],
-}
-
-const flattenNavigation = (): Map => {
- const map = new Map()
- const traverse = (list: { title: string; url?: string }[]) => {
- for (const item of list) {
- if (!item.url) continue
- map.set(item.url, item.title)
- }
- }
- Object.entries(DSData).forEach(([_k, nav]) => {
- nav.forEach((category) => {
- traverse(category.items)
- })
- })
- return map
-}
-
-export const NAV_MAP = flattenNavigation()
diff --git a/src/components/dashboard-sidebar/index.tsx b/src/components/dashboard-sidebar/index.tsx
deleted file mode 100644
index 4fb0080..0000000
--- a/src/components/dashboard-sidebar/index.tsx
+++ /dev/null
@@ -1,45 +0,0 @@
-"use client"
-
-import Link from "next/link"
-import type * as React from "react"
-import {
- Sidebar,
- SidebarContent,
- SidebarFooter,
- SidebarHeader,
- SidebarMenu,
- SidebarMenuButton,
- SidebarMenuItem,
-} from "@/components/ui/sidebar"
-import { Logo } from "../logo"
-import { DSMainNav } from "./main-nav"
-import { DSUserNav } from "./user-nav"
-
-export function DashboardSidebar({
- categoryState,
- ...props
-}: React.ComponentProps & { categoryState: Record }) {
- return (
-
-
-
-
- }>
-
-
- PoliNetwork APS
- Admin Dashboard
-
-
-
-
-
-
-
-
-
-
-
-
- )
-}
diff --git a/src/components/dashboard-sidebar/main-nav.tsx b/src/components/dashboard-sidebar/main-nav.tsx
deleted file mode 100644
index 7b7acf5..0000000
--- a/src/components/dashboard-sidebar/main-nav.tsx
+++ /dev/null
@@ -1,103 +0,0 @@
-"use client"
-import { ChevronRight } from "lucide-react"
-import Link from "next/link"
-import { usePathname } from "next/navigation"
-import { useState } from "react"
-import { COOKIES } from "@/constants"
-import { useCookieStorage } from "@/hooks/use-cookie-storage"
-import { Collapsible, CollapsibleContent, CollapsibleTrigger } from "../ui/collapsible"
-import {
- SidebarGroup,
- SidebarMenu,
- SidebarMenuButton,
- SidebarMenuItem,
- SidebarMenuSub,
- SidebarMenuSubButton,
- SidebarMenuSubItem,
-} from "../ui/sidebar"
-import { DSData } from "./data"
-
-export function DSMainNav({ categoryState }: { categoryState: Record }) {
- const [_, setCategoryState] = useCookieStorage>(
- COOKIES.SIDEBAR_CATEGORY_STATE,
- {},
- { expires: 60 * 60 * 24 * 7 }
- )
-
- return (
-
-
- {DSData.mainNav.map((category) => (
- {
- setCategoryState((state) => ({ ...state, [category.title]: open }))
- }}
- />
- ))}
-
-
- )
-}
-
-function DSMenuCategory({
- category,
- initialOpen,
- onPersistOpen,
-}: {
- category: (typeof DSData)["mainNav"][0]
- initialOpen?: boolean
- onPersistOpen: (open: boolean) => void
-}) {
- const pathname = usePathname()
- const categoryUrl = category.items[0]?.url.split("/").slice(0, 3).join("/")
- const [open, setOpen] = useState(initialOpen ?? (categoryUrl ? pathname.startsWith(categoryUrl) : false))
-
- function handleOpenChange(open: boolean) {
- setOpen(open)
- onPersistOpen(open)
- }
-
- return (
- } open={open} onOpenChange={handleOpenChange} className="group/collapsible">
-
- {category.icon}
- {category.title}
-
-
- }
- />
-
- {category.items?.length ? (
-
- {category.items.map((item) => (
-
- ))}
-
- ) : null}
-
-
- )
-}
-
-function DSMenuItem({ item }: { item: (typeof DSData)["mainNav"][0]["items"][0] }) {
- const path = usePathname()
-
- // NOTE: as of now, we have only 1 level depth of submenu, so using startsWith to
- // match also subroutes is ok.
- // If we go with multiple levels of depth it should be changed accordingly.
- const isActive = path.startsWith(item.url)
-
- return (
-
- }>
- {item.icon}
- {item.title}
-
-
- )
-}
diff --git a/src/components/dashboard-sidebar/user-nav.tsx b/src/components/dashboard-sidebar/user-nav.tsx
deleted file mode 100644
index 580c2cc..0000000
--- a/src/components/dashboard-sidebar/user-nav.tsx
+++ /dev/null
@@ -1,110 +0,0 @@
-"use client"
-
-import { Bell, ChevronsUpDown, LogOut, UserIcon } from "lucide-react"
-import Link from "next/link"
-import { useRouter } from "next/navigation"
-import { toast } from "sonner"
-import { Avatar, AvatarFallback, AvatarImage } from "@/components/ui/avatar"
-import {
- DropdownMenu,
- DropdownMenuContent,
- DropdownMenuGroup,
- DropdownMenuItem,
- DropdownMenuLabel,
- DropdownMenuSeparator,
- DropdownMenuTrigger,
-} from "@/components/ui/dropdown-menu"
-import { SidebarMenu, SidebarMenuButton, SidebarMenuItem, useSidebar } from "@/components/ui/sidebar"
-import { signOut, useSession } from "@/lib/auth"
-import { getInitials } from "@/lib/utils"
-import { Skeleton } from "../ui/skeleton"
-
-export function DSUserNav() {
- const { data } = useSession()
- const { isMobile } = useSidebar()
- const router = useRouter()
-
- const user = data?.user
-
- if (!user) return
-
- return (
-
-
-
-
-
-
-
- {user.name ? getInitials(user.name) : }
-
-
-
- {user.name}
- {user.email}
-
-
-
- }
- />
-
-
-
-
-
-
- {user.name ? getInitials(user.name) : }
-
-
- {user.name}
- {user.email}
-
-
-
-
-
-
-
-
-
- Account
-
-
-
-
- Notifications
-
-
-
-
- signOut({
- fetchOptions: {
- onSuccess: () => {
- toast.success("Logged out!")
- router.refresh()
- },
- },
- })
- }
- >
-
- Log out
-
-
-
-
-
- )
-}
diff --git a/src/components/data-table.tsx b/src/components/data-table.tsx
deleted file mode 100644
index acc07c7..0000000
--- a/src/components/data-table.tsx
+++ /dev/null
@@ -1,63 +0,0 @@
-"use client"
-
-import {
- type ColumnDef,
- flexRender,
- getCoreRowModel,
- getSortedRowModel,
- type RowData,
- useReactTable,
-} from "@tanstack/react-table"
-
-import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow } from "@/components/ui/table"
-
-interface DataTableProps {
- columns: ColumnDef[]
- data: TData[]
-}
-
-export function DataTable({ columns, data }: DataTableProps) {
- const table = useReactTable({
- data,
- columns,
- getCoreRowModel: getCoreRowModel(),
- getSortedRowModel: getSortedRowModel(),
- })
-
- return (
-
-
-
- {table.getHeaderGroups().map((headerGroup) => (
-
- {headerGroup.headers.map((header) => {
- return (
-
- {header.isPlaceholder ? null : flexRender(header.column.columnDef.header, header.getContext())}
-
- )
- })}
-
- ))}
-
-
- {table.getRowModel().rows.length ? (
- table.getRowModel().rows.map((row) => (
-
- {row.getVisibleCells().map((cell) => (
- {flexRender(cell.column.columnDef.cell, cell.getContext())}
- ))}
-
- ))
- ) : (
-
-
- No results.
-
-
- )}
-
-
-
- )
-}
diff --git a/src/components/data-toolbar.tsx b/src/components/data-toolbar.tsx
new file mode 100644
index 0000000..606e48a
--- /dev/null
+++ b/src/components/data-toolbar.tsx
@@ -0,0 +1,74 @@
+import { Plus, Search } from "lucide-react"
+import { type ReactNode, useDeferredValue, useEffect, useId, useRef, useState } from "react"
+import { Button } from "@/components/ui/button"
+import { Input } from "@/components/ui/input"
+
+export function DataToolbar({
+ title,
+ description,
+ count,
+ onSearch,
+ action,
+ onAction,
+ children,
+}: {
+ title: string
+ description: string
+ count: number
+ onSearch?: (value: string) => void
+ action?: string
+ onAction?: () => void
+ children?: ReactNode
+}) {
+ const searchId = useId()
+ const [searchValue, setSearchValue] = useState("")
+ const deferredSearchValue = useDeferredValue(searchValue)
+ const onSearchRef = useRef(onSearch)
+ onSearchRef.current = onSearch
+
+ useEffect(() => {
+ onSearchRef.current?.(deferredSearchValue)
+ }, [deferredSearchValue])
+
+ return (
+ <>
+
+
+
+ DIRECTORY
+
+
{description}
+
+ {action && onAction && (
+
+
+ {action}
+
+ )}
+
+
+ >
+ )
+}
diff --git a/src/components/empty-state.tsx b/src/components/empty-state.tsx
new file mode 100644
index 0000000..5e8e2d7
--- /dev/null
+++ b/src/components/empty-state.tsx
@@ -0,0 +1,16 @@
+import type { LucideIcon } from "lucide-react"
+import { Empty, EmptyDescription, EmptyHeader, EmptyMedia, EmptyTitle } from "@/components/ui/empty"
+
+export function EmptyState({ icon: Icon, title, text }: { icon: LucideIcon; title: string; text: string }) {
+ return (
+
+
+
+
+
+ {title}
+ {text}
+
+
+ )
+}
diff --git a/src/components/header-login-button.tsx b/src/components/header-login-button.tsx
deleted file mode 100644
index ed3dd14..0000000
--- a/src/components/header-login-button.tsx
+++ /dev/null
@@ -1,44 +0,0 @@
-"use client"
-import { LogIn, LogOut } from "lucide-react"
-import Link from "next/link"
-import { usePathname, useRouter } from "next/navigation"
-import { useIsMobile } from "@/hooks/use-mobile"
-import { auth, useSession } from "@/lib/auth"
-import { Button } from "./ui/button"
-import { Skeleton } from "./ui/skeleton"
-
-export function HeaderLoginButton() {
- const { data, isPending } = useSession()
- const pathname = usePathname()
- const isMobile = useIsMobile()
- const router = useRouter()
-
- if (isPending) return
- if (data)
- return (
- {
- await auth.signOut()
- router.refresh()
- }}
- >
- Logout
-
- )
-
- return (
-
-
-
- Login
-
-
- )
-}
diff --git a/src/components/header.tsx b/src/components/header.tsx
deleted file mode 100644
index 55c341e..0000000
--- a/src/components/header.tsx
+++ /dev/null
@@ -1,31 +0,0 @@
-import { GlobeIcon } from "lucide-react"
-import Link from "next/link"
-import { ThemeButton } from "@/components/theme-button"
-import { HeaderLoginButton } from "./header-login-button"
-import { Logo } from "./logo"
-import { Button } from "./ui/button"
-
-export const HEADER_HEIGHT = "3.3rem"
-
-export async function Header() {
- return (
-
- )
-}
diff --git a/src/components/input-prefix.tsx b/src/components/input-prefix.tsx
deleted file mode 100644
index cf3c422..0000000
--- a/src/components/input-prefix.tsx
+++ /dev/null
@@ -1,24 +0,0 @@
-import * as React from "react"
-import { cn } from "@/lib/utils/shadcn"
-import { Input } from "./ui/input"
-
-export interface InputWithPrefixProps extends React.InputHTMLAttributes {
- prefix: string
- containerClassName?: string
-}
-
-const InputWithPrefix = React.forwardRef(
- ({ className, type, prefix, containerClassName, ...props }, ref) => {
- return (
-
- )
- }
-)
-InputWithPrefix.displayName = "InputWithPrefix"
-
-export { InputWithPrefix }
diff --git a/src/components/live-status.tsx b/src/components/live-status.tsx
new file mode 100644
index 0000000..cb1b941
--- /dev/null
+++ b/src/components/live-status.tsx
@@ -0,0 +1,13 @@
+import { CloudOff } from "lucide-react"
+import { Alert, AlertDescription } from "@/components/ui/alert"
+
+export function LiveStatus({ connected, message }: { connected: boolean; message?: string }) {
+ return connected ? null : (
+
+
+
+ {message ?? "Live backend is offline."}
+
+
+ )
+}
diff --git a/src/components/loading-skeleton.tsx b/src/components/loading-skeleton.tsx
new file mode 100644
index 0000000..78276f1
--- /dev/null
+++ b/src/components/loading-skeleton.tsx
@@ -0,0 +1,96 @@
+import { Skeleton } from "@/components/ui/skeleton"
+
+export function DataPageSkeleton({
+ columns = 4,
+ rows = 7,
+ withTabs = false,
+}: {
+ columns?: number
+ rows?: number
+ withTabs?: boolean
+}) {
+ return (
+
+
+
+
+
+
+
+
+
+
+
+ {withTabs && (
+
+
+
+
+
+ )}
+
+
+ {Array.from({ length: columns }, (_, index) => (
+
+ ))}
+
+ {Array.from({ length: rows }, (_, row) => (
+
+ {Array.from({ length: columns }, (_, column) => (
+
+ ))}
+
+ ))}
+
+
+
+ )
+}
+
+export function DetailPageSkeleton() {
+ return (
+
+
+
+
+ {Array.from({ length: 3 }, (_, index) => (
+
+
+
+
+
+
+ ))}
+
+ {Array.from({ length: 3 }, (_, section) => (
+
+ ))}
+
+ )
+}
diff --git a/src/components/logo.tsx b/src/components/logo.tsx
deleted file mode 100644
index f51fb95..0000000
--- a/src/components/logo.tsx
+++ /dev/null
@@ -1,6 +0,0 @@
-import Image, { type ImageProps } from "next/image"
-import logo from "@/assets/logo.svg"
-
-export function Logo({ size, ...props }: { size?: number } & Omit) {
- return
-}
diff --git a/src/components/logout-button.tsx b/src/components/logout-button.tsx
deleted file mode 100644
index 1a6a958..0000000
--- a/src/components/logout-button.tsx
+++ /dev/null
@@ -1,20 +0,0 @@
-import { LogOut } from "lucide-react"
-import { redirect } from "next/navigation"
-import { Button } from "@/components/ui/button"
-import { signOut } from "@/lib/auth"
-
-export function LogoutButton() {
- return (
- {
- await signOut()
- redirect("/login")
- }}
- variant="destructive"
- type="submit"
- >
-
- Logout
-
- )
-}
diff --git a/src/components/navigate-back.tsx b/src/components/navigate-back.tsx
deleted file mode 100644
index 463f442..0000000
--- a/src/components/navigate-back.tsx
+++ /dev/null
@@ -1,21 +0,0 @@
-"use client"
-
-import { ArrowLeft } from "lucide-react"
-import { useRouter } from "next/navigation"
-import { Button } from "./ui/button"
-
-export function NavigateBack() {
- const router = useRouter()
-
- return (
- {
- router.back()
- }}
- >
-
-
- )
-}
diff --git a/src/components/pagination.tsx b/src/components/pagination.tsx
new file mode 100644
index 0000000..dfa92a5
--- /dev/null
+++ b/src/components/pagination.tsx
@@ -0,0 +1,149 @@
+import { ChevronsLeft, ChevronsRight } from "lucide-react"
+import { Fragment } from "react"
+import {
+ PaginationContent,
+ PaginationEllipsis,
+ PaginationItem,
+ PaginationLink,
+ PaginationNext,
+ PaginationPrevious,
+ Pagination as PaginationRoot,
+} from "@/components/ui/pagination"
+
+export function Pagination({
+ page,
+ pageCount,
+ onPageChange,
+ pageSize,
+ pageSizeOptions = [10, 20, 25, 50, 100],
+ onPageSizeChange,
+}: {
+ page: number
+ pageCount: number
+ onPageChange: (page: number) => void
+ pageSize: number
+ pageSizeOptions?: number[]
+ onPageSizeChange: (pageSize: number) => void
+}) {
+ if (pageCount <= 1 && !onPageSizeChange) return null
+
+ const pages = [...new Set([1, page - 1, page, page + 1, pageCount])]
+ .filter((value) => value >= 1 && value <= pageCount)
+ .sort((a, b) => a - b)
+
+ return (
+
+
+ Rows per page
+ onPageSizeChange(Number(event.target.value))}
+ className="h-8 rounded-none border border-border bg-card px-2 font-mono text-[10px] text-foreground outline-none focus:border-primary"
+ >
+ {pageSizeOptions.map((size) => (
+
+ {size}
+
+ ))}
+
+
+ {pageCount > 1 && (
+
+
+
+ {
+ event.preventDefault()
+ if (page > 1) onPageChange(1)
+ }}
+ >
+
+
+
+
+ {
+ event.preventDefault()
+ if (page > 1) onPageChange(page - 1)
+ }}
+ text=""
+ />
+
+ {pages.map((value, index) => (
+
+ {index > 0 && pages[index - 1] !== value - 1 && (
+
+
+
+ )}
+
+ {
+ event.preventDefault()
+ onPageChange(value)
+ }}
+ >
+ {value}
+
+
+
+ ))}
+
+ {
+ event.preventDefault()
+ if (page < pageCount) onPageChange(page + 1)
+ }}
+ text=""
+ />
+
+
+ {
+ event.preventDefault()
+ if (page < pageCount) onPageChange(pageCount)
+ }}
+ >
+
+
+
+
+
+ )}
+
+ )
+}
diff --git a/src/components/search-input.tsx b/src/components/search-input.tsx
deleted file mode 100644
index e0e5a9e..0000000
--- a/src/components/search-input.tsx
+++ /dev/null
@@ -1,47 +0,0 @@
-"use client"
-
-import { RefreshCcw, Search } from "lucide-react"
-import { useRouter, useSearchParams } from "next/navigation"
-import { useEffect, useState } from "react"
-import { Button } from "@/components/ui/button"
-import { Input } from "@/components/ui/input"
-
-export function SearchInput({ disabled }: { disabled?: boolean }) {
- const router = useRouter()
- const searchParams = useSearchParams()
- const q = searchParams.get("q") ?? ""
- const [value, setValue] = useState(q)
-
- const handleSearch = () => {
- const params = new URLSearchParams(searchParams.toString())
- if (value) {
- params.set("q", value)
- } else {
- params.delete("q")
- }
- router.replace(`?${params.toString()}`)
- }
- useEffect(() => {
- setValue(q)
- }, [q])
-
- return (
-
- setValue(e.target.value)}
- onKeyDown={(e) => e.key === "Enter" && handleSearch()}
- placeholder="Search..."
- />
-
-
- Search
-
- router.refresh()} variant="outline" disabled={disabled}>
-
- Refresh
-
-
- )
-}
diff --git a/src/components/shapes.tsx b/src/components/shapes.tsx
deleted file mode 100644
index 3841c6a..0000000
--- a/src/components/shapes.tsx
+++ /dev/null
@@ -1,32 +0,0 @@
-import Image from "next/image"
-import bigBlueSvg from "@/assets/svg/shapes/big-blue.svg"
-import bigTealSvg from "@/assets/svg/shapes/big-teal.svg"
-import looperSvg from "@/assets/svg/shapes/looper.svg"
-import smallBlueSvg from "@/assets/svg/shapes/small-blue.svg"
-import { cn } from "@/lib/utils/shadcn"
-
-export type ShapeVariant = "big-blue" | "big-teal" | "small-blue" | "looper"
-
-export type ShapeProps = {
- variant: ShapeVariant
- className?: string
-}
-
-export const Shape: React.FC = ({ variant, className }) => {
- const getShapeSrc = () => {
- switch (variant) {
- case "big-blue":
- return bigBlueSvg
- case "big-teal":
- return bigTealSvg
- case "small-blue":
- return smallBlueSvg
- case "looper":
- return looperSvg
- default:
- return ""
- }
- }
-
- return
-}
diff --git a/src/components/spinner.tsx b/src/components/spinner.tsx
deleted file mode 100644
index 97e5baf..0000000
--- a/src/components/spinner.tsx
+++ /dev/null
@@ -1,26 +0,0 @@
-import { cn } from "@/lib/utils/shadcn"
-
-export function Spinner({ className }: React.HtmlHTMLAttributes) {
- return (
- // biome-ignore lint/a11y/useSemanticElements: incorrect change suggestion
-
- )
-}
diff --git a/src/components/theme-button.tsx b/src/components/theme-button.tsx
deleted file mode 100644
index cbaa0ad..0000000
--- a/src/components/theme-button.tsx
+++ /dev/null
@@ -1,16 +0,0 @@
-"use client"
-import { MoonIcon, SunIcon } from "lucide-react"
-import { useTheme } from "next-themes"
-import { Button } from "./ui/button"
-
-export function ThemeButton() {
- const { resolvedTheme, setTheme } = useTheme()
-
- // TODO: remove disabled when light theme is ready
- return (
- setTheme(resolvedTheme === "light" ? "dark" : "light")}>
-
-
-
- )
-}
diff --git a/src/components/theme-provider.tsx b/src/components/theme-provider.tsx
deleted file mode 100644
index c655c82..0000000
--- a/src/components/theme-provider.tsx
+++ /dev/null
@@ -1,8 +0,0 @@
-"use client"
-
-import { ThemeProvider as NextThemesProvider } from "next-themes"
-import type * as React from "react"
-
-export function ThemeProvider({ children, ...props }: React.ComponentProps) {
- return {children}
-}
diff --git a/src/components/theme-toggle.tsx b/src/components/theme-toggle.tsx
new file mode 100644
index 0000000..2e83061
--- /dev/null
+++ b/src/components/theme-toggle.tsx
@@ -0,0 +1,41 @@
+import { Moon, Sun } from "lucide-react"
+import { useEffect, useState } from "react"
+import { Button } from "@/components/ui/button"
+
+const storageKey = "polinetwork-theme"
+
+function applyTheme(theme: "light" | "dark") {
+ document.documentElement.classList.toggle("dark", theme === "dark")
+ document.documentElement.style.colorScheme = theme
+}
+
+export function ThemeToggle() {
+ const [dark, setDark] = useState(false)
+
+ useEffect(() => {
+ const stored = window.localStorage.getItem(storageKey)
+ const isDark = stored === "dark" || (!stored && window.matchMedia("(prefers-color-scheme: dark)").matches)
+ setDark(isDark)
+ applyTheme(isDark ? "dark" : "light")
+ }, [])
+
+ function toggle() {
+ const next = !dark
+ setDark(next)
+ window.localStorage.setItem(storageKey, next ? "dark" : "light")
+ applyTheme(next ? "dark" : "light")
+ }
+
+ return (
+
+ {dark ? : }
+
+ )
+}
diff --git a/src/components/ui/alert-dialog.tsx b/src/components/ui/alert-dialog.tsx
deleted file mode 100644
index 75f5309..0000000
--- a/src/components/ui/alert-dialog.tsx
+++ /dev/null
@@ -1,187 +0,0 @@
-"use client"
-
-import * as React from "react"
-import { AlertDialog as AlertDialogPrimitive } from "@base-ui/react/alert-dialog"
-
-import { cn } from "@/lib/utils/shadcn"
-import { Button } from "@/components/ui/button"
-
-function AlertDialog({ ...props }: AlertDialogPrimitive.Root.Props) {
- return
-}
-
-function AlertDialogTrigger({ ...props }: AlertDialogPrimitive.Trigger.Props) {
- return (
-
- )
-}
-
-function AlertDialogPortal({ ...props }: AlertDialogPrimitive.Portal.Props) {
- return (
-
- )
-}
-
-function AlertDialogOverlay({
- className,
- ...props
-}: AlertDialogPrimitive.Backdrop.Props) {
- return (
-
- )
-}
-
-function AlertDialogContent({
- className,
- size = "default",
- ...props
-}: AlertDialogPrimitive.Popup.Props & {
- size?: "default" | "sm"
-}) {
- return (
-
-
-
-
- )
-}
-
-function AlertDialogHeader({
- className,
- ...props
-}: React.ComponentProps<"div">) {
- return (
-
- )
-}
-
-function AlertDialogFooter({
- className,
- ...props
-}: React.ComponentProps<"div">) {
- return (
-
- )
-}
-
-function AlertDialogMedia({
- className,
- ...props
-}: React.ComponentProps<"div">) {
- return (
-
- )
-}
-
-function AlertDialogTitle({
- className,
- ...props
-}: React.ComponentProps) {
- return (
-
- )
-}
-
-function AlertDialogDescription({
- className,
- ...props
-}: React.ComponentProps) {
- return (
-
- )
-}
-
-function AlertDialogAction({
- className,
- ...props
-}: React.ComponentProps) {
- return (
-
- )
-}
-
-function AlertDialogCancel({
- className,
- variant = "outline",
- size = "default",
- ...props
-}: AlertDialogPrimitive.Close.Props &
- Pick, "variant" | "size">) {
- return (
- }
- {...props}
- />
- )
-}
-
-export {
- AlertDialog,
- AlertDialogAction,
- AlertDialogCancel,
- AlertDialogContent,
- AlertDialogDescription,
- AlertDialogFooter,
- AlertDialogHeader,
- AlertDialogMedia,
- AlertDialogOverlay,
- AlertDialogPortal,
- AlertDialogTitle,
- AlertDialogTrigger,
-}
diff --git a/src/components/ui/alert.tsx b/src/components/ui/alert.tsx
index 52a36bc..8fddb41 100644
--- a/src/components/ui/alert.tsx
+++ b/src/components/ui/alert.tsx
@@ -1,7 +1,7 @@
-import * as React from "react"
import { cva, type VariantProps } from "class-variance-authority"
+import type * as React from "react"
-import { cn } from "@/lib/utils/shadcn"
+import { cn } from "@/lib/utils"
const alertVariants = cva(
"group/alert relative grid w-full gap-0.5 rounded-lg border px-2.5 py-2 text-left text-sm has-data-[slot=alert-action]:relative has-data-[slot=alert-action]:pr-18 has-[>svg]:grid-cols-[auto_1fr] has-[>svg]:gap-x-2 *:[svg]:row-span-2 *:[svg]:translate-y-0.5 *:[svg]:text-current *:[svg:not([class*='size-'])]:size-4",
@@ -9,7 +9,6 @@ const alertVariants = cva(
variants: {
variant: {
default: "bg-card text-card-foreground",
- info: "bg-primary/20 text-primary-foreground",
destructive:
"bg-card text-destructive *:data-[slot=alert-description]:text-destructive/90 *:[svg]:text-current",
},
@@ -20,19 +19,8 @@ const alertVariants = cva(
}
)
-function Alert({
- className,
- variant,
- ...props
-}: React.ComponentProps<"div"> & VariantProps) {
- return (
-
- )
+function Alert({ className, variant, ...props }: React.ComponentProps<"div"> & VariantProps) {
+ return
}
function AlertTitle({ className, ...props }: React.ComponentProps<"div">) {
@@ -40,7 +28,7 @@ function AlertTitle({ className, ...props }: React.ComponentProps<"div">) {
svg]/alert:col-start-2 [&_a]:underline [&_a]:underline-offset-3 [&_a]:hover:text-foreground",
+ "font-medium group-has-[>svg]/alert:col-start-2 [&_a]:underline [&_a]:underline-offset-3 [&_a]:hover:text-foreground",
className
)}
{...props}
@@ -48,10 +36,7 @@ function AlertTitle({ className, ...props }: React.ComponentProps<"div">) {
)
}
-function AlertDescription({
- className,
- ...props
-}: React.ComponentProps<"div">) {
+function AlertDescription({ className, ...props }: React.ComponentProps<"div">) {
return (
) {
- return (
-
- )
+ return
}
export { Alert, AlertTitle, AlertDescription, AlertAction }
diff --git a/src/components/ui/avatar.tsx b/src/components/ui/avatar.tsx
index 0de72e0..fdb69b7 100644
--- a/src/components/ui/avatar.tsx
+++ b/src/components/ui/avatar.tsx
@@ -1,9 +1,9 @@
"use client"
-import * as React from "react"
import { Avatar as AvatarPrimitive } from "@base-ui/react/avatar"
+import type * as React from "react"
-import { cn } from "@/lib/utils/shadcn"
+import { cn } from "@/lib/utils"
function Avatar({
className,
@@ -29,19 +29,13 @@ function AvatarImage({ className, ...props }: AvatarPrimitive.Image.Props) {
return (
)
}
-function AvatarFallback({
- className,
- ...props
-}: AvatarPrimitive.Fallback.Props) {
+function AvatarFallback({ className, ...props }: AvatarPrimitive.Fallback.Props) {
return (
) {
)
}
-function AvatarGroupCount({
- className,
- ...props
-}: React.ComponentProps<"div">) {
+function AvatarGroupCount({ className, ...props }: React.ComponentProps<"div">) {
return (
svg]:pointer-events-none [&>svg]:size-3!",
@@ -10,14 +10,11 @@ const badgeVariants = cva(
variants: {
variant: {
default: "bg-primary text-primary-foreground [a]:hover:bg-primary/80",
- secondary:
- "bg-secondary text-secondary-foreground [a]:hover:bg-secondary/80",
+ secondary: "bg-secondary text-secondary-foreground [a]:hover:bg-secondary/80",
destructive:
"bg-destructive/10 text-destructive focus-visible:ring-destructive/20 dark:bg-destructive/20 dark:focus-visible:ring-destructive/40 [a]:hover:bg-destructive/20",
- outline:
- "border-border text-foreground [a]:hover:bg-muted [a]:hover:text-muted-foreground",
- ghost:
- "hover:bg-muted hover:text-muted-foreground dark:hover:bg-muted/50",
+ outline: "border-border text-foreground [a]:hover:bg-muted [a]:hover:text-muted-foreground",
+ ghost: "hover:bg-muted hover:text-muted-foreground dark:hover:bg-muted/50",
link: "text-primary underline-offset-4 hover:underline",
},
},
diff --git a/src/components/ui/breadcrumb.tsx b/src/components/ui/breadcrumb.tsx
deleted file mode 100644
index e0deed4..0000000
--- a/src/components/ui/breadcrumb.tsx
+++ /dev/null
@@ -1,125 +0,0 @@
-import * as React from "react"
-import { mergeProps } from "@base-ui/react/merge-props"
-import { useRender } from "@base-ui/react/use-render"
-
-import { cn } from "@/lib/utils/shadcn"
-import { ChevronRightIcon, MoreHorizontalIcon } from "lucide-react"
-
-function Breadcrumb({ className, ...props }: React.ComponentProps<"nav">) {
- return (
-
- )
-}
-
-function BreadcrumbList({ className, ...props }: React.ComponentProps<"ol">) {
- return (
-
- )
-}
-
-function BreadcrumbItem({ className, ...props }: React.ComponentProps<"li">) {
- return (
-
- )
-}
-
-function BreadcrumbLink({
- className,
- render,
- ...props
-}: useRender.ComponentProps<"a">) {
- return useRender({
- defaultTagName: "a",
- props: mergeProps<"a">(
- {
- className: cn("transition-colors hover:text-foreground", className),
- },
- props
- ),
- render,
- state: {
- slot: "breadcrumb-link",
- },
- })
-}
-
-function BreadcrumbPage({ className, ...props }: React.ComponentProps<"span">) {
- return (
-
- )
-}
-
-function BreadcrumbSeparator({
- children,
- className,
- ...props
-}: React.ComponentProps<"li">) {
- return (
-
svg]:size-3.5", className)}
- {...props}
- >
- {children ?? (
-
- )}
-
- )
-}
-
-function BreadcrumbEllipsis({
- className,
- ...props
-}: React.ComponentProps<"span">) {
- return (
-
svg]:size-4",
- className
- )}
- {...props}
- >
-
- More
-
- )
-}
-
-export {
- Breadcrumb,
- BreadcrumbList,
- BreadcrumbItem,
- BreadcrumbLink,
- BreadcrumbPage,
- BreadcrumbSeparator,
- BreadcrumbEllipsis,
-}
diff --git a/src/components/ui/button.tsx b/src/components/ui/button.tsx
index e696922..5593d7c 100644
--- a/src/components/ui/button.tsx
+++ b/src/components/ui/button.tsx
@@ -1,10 +1,10 @@
import { Button as ButtonPrimitive } from "@base-ui/react/button"
import { cva, type VariantProps } from "class-variance-authority"
-import { cn } from "@/lib/utils/shadcn"
+import { cn } from "@/lib/utils"
const buttonVariants = cva(
- "group/button inline-flex shrink-0 items-center justify-center rounded-lg border border-transparent bg-clip-padding text-sm font-medium whitespace-nowrap transition-all outline-none select-none focus-visible:border-ring focus-visible:ring-3 focus-visible:ring-ring/50 active:not-aria-[haspopup]:translate-y-px disabled:pointer-events-none disabled:opacity-50 aria-invalid:border-destructive aria-invalid:ring-3 aria-invalid:ring-destructive/20 dark:aria-invalid:border-destructive/50 dark:aria-invalid:ring-destructive/40 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4 cursor-pointer",
+ "group/button inline-flex shrink-0 items-center justify-center rounded-lg border border-transparent bg-clip-padding text-sm font-medium whitespace-nowrap transition-all outline-none select-none focus-visible:border-ring focus-visible:ring-3 focus-visible:ring-ring/50 active:not-aria-[haspopup]:translate-y-px disabled:pointer-events-none disabled:opacity-50 aria-invalid:border-destructive aria-invalid:ring-3 aria-invalid:ring-destructive/20 dark:aria-invalid:border-destructive/50 dark:aria-invalid:ring-destructive/40 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4",
{
variants: {
variant: {
@@ -12,25 +12,23 @@ const buttonVariants = cva(
outline:
"border-border bg-background hover:bg-muted hover:text-foreground aria-expanded:bg-muted aria-expanded:text-foreground dark:border-input dark:bg-input/30 dark:hover:bg-input/50",
secondary:
- "bg-secondary text-secondary-foreground hover:bg-secondary/80 aria-expanded:bg-secondary aria-expanded:text-secondary-foreground",
+ "bg-secondary text-secondary-foreground hover:bg-[color-mix(in_oklch,var(--secondary),var(--foreground)_5%)] aria-expanded:bg-secondary aria-expanded:text-secondary-foreground",
ghost:
- "hover:bg-accent hover:text-foreground aria-expanded:bg-accent aria-expanded:text-foreground",
+ "hover:bg-muted hover:text-foreground aria-expanded:bg-muted aria-expanded:text-foreground dark:hover:bg-muted/50",
destructive:
"bg-destructive/10 text-destructive hover:bg-destructive/20 focus-visible:border-destructive/40 focus-visible:ring-destructive/20 dark:bg-destructive/20 dark:hover:bg-destructive/30 dark:focus-visible:ring-destructive/40",
link: "text-primary underline-offset-4 hover:underline",
},
size: {
- default:
- "h-8 gap-1.5 px-2.5 has-data-[icon=inline-end]:pr-2 has-data-[icon=inline-start]:pl-2",
+ default: "h-8 gap-1.5 px-2.5 has-data-[icon=inline-end]:pr-2 has-data-[icon=inline-start]:pl-2",
xs: "h-6 gap-1 rounded-[min(var(--radius-md),10px)] px-2 text-xs in-data-[slot=button-group]:rounded-lg has-data-[icon=inline-end]:pr-1.5 has-data-[icon=inline-start]:pl-1.5 [&_svg:not([class*='size-'])]:size-3",
sm: "h-7 gap-1 rounded-[min(var(--radius-md),12px)] px-2.5 text-[0.8rem] in-data-[slot=button-group]:rounded-lg has-data-[icon=inline-end]:pr-1.5 has-data-[icon=inline-start]:pl-1.5 [&_svg:not([class*='size-'])]:size-3.5",
lg: "h-9 gap-1.5 px-2.5 has-data-[icon=inline-end]:pr-2 has-data-[icon=inline-start]:pl-2",
- icon: "size-8 [&_svg:not([class*='size-'])]:size-4.5",
+ icon: "size-8",
"icon-xs":
"size-6 rounded-[min(var(--radius-md),10px)] in-data-[slot=button-group]:rounded-lg [&_svg:not([class*='size-'])]:size-3",
- "icon-sm":
- "size-7 rounded-[min(var(--radius-md),12px)] in-data-[slot=button-group]:rounded-lg [&_svg:not([class*='size-'])]:size-4",
- "icon-lg": "size-9 [&_svg:not([class*='size-'])]:size-5",
+ "icon-sm": "size-7 rounded-[min(var(--radius-md),12px)] in-data-[slot=button-group]:rounded-lg",
+ "icon-lg": "size-9",
},
},
defaultVariants: {
@@ -46,13 +44,7 @@ function Button({
size = "default",
...props
}: ButtonPrimitive.Props & VariantProps
) {
- return (
-
- )
+ return
}
export { Button, buttonVariants }
diff --git a/src/components/ui/calendar.tsx b/src/components/ui/calendar.tsx
deleted file mode 100644
index 686626b..0000000
--- a/src/components/ui/calendar.tsx
+++ /dev/null
@@ -1,221 +0,0 @@
-"use client"
-
-import * as React from "react"
-import {
- DayPicker,
- getDefaultClassNames,
- type DayButton,
- type Locale,
-} from "react-day-picker"
-
-import { cn } from "@/lib/utils/shadcn"
-import { Button, buttonVariants } from "@/components/ui/button"
-import { ChevronLeftIcon, ChevronRightIcon, ChevronDownIcon } from "lucide-react"
-
-function Calendar({
- className,
- classNames,
- showOutsideDays = true,
- captionLayout = "label",
- buttonVariant = "ghost",
- locale,
- formatters,
- components,
- ...props
-}: React.ComponentProps & {
- buttonVariant?: React.ComponentProps["variant"]
-}) {
- const defaultClassNames = getDefaultClassNames()
-
- return (
- svg]:rotate-180`,
- String.raw`rtl:**:[.rdp-button\_previous>svg]:rotate-180`,
- className
- )}
- captionLayout={captionLayout}
- locale={locale}
- formatters={{
- formatMonthDropdown: (date) =>
- date.toLocaleString(locale?.code, { month: "short" }),
- ...formatters,
- }}
- classNames={{
- root: cn("w-fit", defaultClassNames.root),
- months: cn(
- "relative flex flex-col gap-4 md:flex-row",
- defaultClassNames.months
- ),
- month: cn("flex w-full flex-col gap-4", defaultClassNames.month),
- nav: cn(
- "absolute inset-x-0 top-0 flex w-full items-center justify-between gap-1",
- defaultClassNames.nav
- ),
- button_previous: cn(
- buttonVariants({ variant: buttonVariant }),
- "size-(--cell-size) p-0 select-none aria-disabled:opacity-50",
- defaultClassNames.button_previous
- ),
- button_next: cn(
- buttonVariants({ variant: buttonVariant }),
- "size-(--cell-size) p-0 select-none aria-disabled:opacity-50",
- defaultClassNames.button_next
- ),
- month_caption: cn(
- "flex h-(--cell-size) w-full items-center justify-center px-(--cell-size)",
- defaultClassNames.month_caption
- ),
- dropdowns: cn(
- "flex h-(--cell-size) w-full items-center justify-center gap-1.5 text-sm font-medium",
- defaultClassNames.dropdowns
- ),
- dropdown_root: cn(
- "relative rounded-(--cell-radius)",
- defaultClassNames.dropdown_root
- ),
- dropdown: cn(
- "absolute inset-0 bg-popover opacity-0",
- defaultClassNames.dropdown
- ),
- caption_label: cn(
- "font-medium select-none",
- captionLayout === "label"
- ? "text-sm"
- : "flex items-center gap-1 rounded-(--cell-radius) text-sm [&>svg]:size-3.5 [&>svg]:text-muted-foreground",
- defaultClassNames.caption_label
- ),
- table: "w-full border-collapse",
- weekdays: cn("flex", defaultClassNames.weekdays),
- weekday: cn(
- "flex-1 rounded-(--cell-radius) text-[0.8rem] font-normal text-muted-foreground select-none",
- defaultClassNames.weekday
- ),
- week: cn("mt-2 flex w-full", defaultClassNames.week),
- week_number_header: cn(
- "w-(--cell-size) select-none",
- defaultClassNames.week_number_header
- ),
- week_number: cn(
- "text-[0.8rem] text-muted-foreground select-none",
- defaultClassNames.week_number
- ),
- day: cn(
- "group/day relative aspect-square h-full w-full rounded-(--cell-radius) p-0 text-center select-none [&:last-child[data-selected=true]_button]:rounded-r-(--cell-radius)",
- props.showWeekNumber
- ? "[&:nth-child(2)[data-selected=true]_button]:rounded-l-(--cell-radius)"
- : "[&:first-child[data-selected=true]_button]:rounded-l-(--cell-radius)",
- defaultClassNames.day
- ),
- range_start: cn(
- "relative isolate z-0 rounded-l-(--cell-radius) bg-muted after:absolute after:inset-y-0 after:right-0 after:w-4 after:bg-muted",
- defaultClassNames.range_start
- ),
- range_middle: cn("rounded-none", defaultClassNames.range_middle),
- range_end: cn(
- "relative isolate z-0 rounded-r-(--cell-radius) bg-muted after:absolute after:inset-y-0 after:left-0 after:w-4 after:bg-muted",
- defaultClassNames.range_end
- ),
- today: cn(
- "rounded-(--cell-radius) bg-muted text-foreground data-[selected=true]:rounded-none",
- defaultClassNames.today
- ),
- outside: cn(
- "text-muted-foreground aria-selected:text-muted-foreground",
- defaultClassNames.outside
- ),
- disabled: cn(
- "text-muted-foreground opacity-50",
- defaultClassNames.disabled
- ),
- hidden: cn("invisible", defaultClassNames.hidden),
- ...classNames,
- }}
- components={{
- Root: ({ className, rootRef, ...props }) => {
- return (
-
- )
- },
- Chevron: ({ className, orientation, ...props }) => {
- if (orientation === "left") {
- return (
-
- )
- }
-
- if (orientation === "right") {
- return (
-
- )
- }
-
- return (
-
- )
- },
- DayButton: ({ ...props }) => (
-
- ),
- WeekNumber: ({ children, ...props }) => {
- return (
-
-
- {children}
-
-
- )
- },
- ...components,
- }}
- {...props}
- />
- )
-}
-
-function CalendarDayButton({
- className,
- day,
- modifiers,
- locale,
- ...props
-}: React.ComponentProps & { locale?: Partial }) {
- const defaultClassNames = getDefaultClassNames()
-
- const ref = React.useRef(null)
- React.useEffect(() => {
- if (modifiers.focused) ref.current?.focus()
- }, [modifiers.focused])
-
- return (
- span]:text-xs [&>span]:opacity-70",
- defaultClassNames.day,
- className
- )}
- {...props}
- />
- )
-}
-
-export { Calendar, CalendarDayButton }
diff --git a/src/components/ui/card.tsx b/src/components/ui/card.tsx
index 0c2e676..686a54f 100644
--- a/src/components/ui/card.tsx
+++ b/src/components/ui/card.tsx
@@ -1,18 +1,14 @@
-import * as React from "react"
+import type * as React from "react"
-import { cn } from "@/lib/utils/shadcn"
+import { cn } from "@/lib/utils"
-function Card({
- className,
- size = "default",
- ...props
-}: React.ComponentProps<"div"> & { size?: "default" | "sm" }) {
+function Card({ className, size = "default", ...props }: React.ComponentProps<"div"> & { size?: "default" | "sm" }) {
return (
img:first-child]:pt-0 data-[size=sm]:gap-3 data-[size=sm]:py-3 data-[size=sm]:has-data-[slot=card-footer]:pb-0 *:[img:first-child]:rounded-t-xl *:[img:last-child]:rounded-b-xl",
+ "group/card flex flex-col gap-(--card-spacing) overflow-hidden rounded-xl bg-card py-(--card-spacing) text-sm text-card-foreground ring-1 ring-foreground/10 [--card-spacing:--spacing(4)] has-data-[slot=card-footer]:pb-0 has-[>img:first-child]:pt-0 data-[size=sm]:[--card-spacing:--spacing(3)] data-[size=sm]:has-data-[slot=card-footer]:pb-0 *:[img:first-child]:rounded-t-xl *:[img:last-child]:rounded-b-xl",
className
)}
{...props}
@@ -25,7 +21,7 @@ function CardHeader({ className, ...props }: React.ComponentProps<"div">) {
) {
return (
)
}
function CardDescription({ className, ...props }: React.ComponentProps<"div">) {
- return (
-
- )
+ return
}
function CardAction({ className, ...props }: React.ComponentProps<"div">) {
return (
)
}
function CardContent({ className, ...props }: React.ComponentProps<"div">) {
- return (
-
- )
+ return
}
function CardFooter({ className, ...props }: React.ComponentProps<"div">) {
return (
)
}
-export {
- Card,
- CardHeader,
- CardFooter,
- CardTitle,
- CardAction,
- CardDescription,
- CardContent,
-}
+export { Card, CardHeader, CardFooter, CardTitle, CardAction, CardDescription, CardContent }
diff --git a/src/components/ui/collapsible.tsx b/src/components/ui/collapsible.tsx
deleted file mode 100644
index 488fb33..0000000
--- a/src/components/ui/collapsible.tsx
+++ /dev/null
@@ -1,21 +0,0 @@
-"use client"
-
-import { Collapsible as CollapsiblePrimitive } from "@base-ui/react/collapsible"
-
-function Collapsible({ ...props }: CollapsiblePrimitive.Root.Props) {
- return
-}
-
-function CollapsibleTrigger({ ...props }: CollapsiblePrimitive.Trigger.Props) {
- return (
-
- )
-}
-
-function CollapsibleContent({ ...props }: CollapsiblePrimitive.Panel.Props) {
- return (
-
- )
-}
-
-export { Collapsible, CollapsibleTrigger, CollapsibleContent }
diff --git a/src/components/ui/command.tsx b/src/components/ui/command.tsx
deleted file mode 100644
index b57a702..0000000
--- a/src/components/ui/command.tsx
+++ /dev/null
@@ -1,196 +0,0 @@
-"use client"
-
-import * as React from "react"
-import { Command as CommandPrimitive } from "cmdk"
-
-import { cn } from "@/lib/utils/shadcn"
-import {
- Dialog,
- DialogContent,
- DialogDescription,
- DialogHeader,
- DialogTitle,
-} from "@/components/ui/dialog"
-import {
- InputGroup,
- InputGroupAddon,
-} from "@/components/ui/input-group"
-import { SearchIcon, CheckIcon } from "lucide-react"
-
-function Command({
- className,
- ...props
-}: React.ComponentProps
) {
- return (
-
- )
-}
-
-function CommandDialog({
- title = "Command Palette",
- description = "Search for a command to run...",
- children,
- className,
- showCloseButton = false,
- ...props
-}: Omit, "children"> & {
- title?: string
- description?: string
- className?: string
- showCloseButton?: boolean
- children: React.ReactNode
-}) {
- return (
-
-
- {title}
- {description}
-
-
- {children}
-
-
- )
-}
-
-function CommandInput({
- className,
- ...props
-}: React.ComponentProps) {
- return (
-
-
-
-
-
-
-
-
- )
-}
-
-function CommandList({
- className,
- ...props
-}: React.ComponentProps) {
- return (
-
- )
-}
-
-function CommandEmpty({
- className,
- ...props
-}: React.ComponentProps) {
- return (
-
- )
-}
-
-function CommandGroup({
- className,
- ...props
-}: React.ComponentProps) {
- return (
-
- )
-}
-
-function CommandSeparator({
- className,
- ...props
-}: React.ComponentProps) {
- return (
-
- )
-}
-
-function CommandItem({
- className,
- children,
- ...props
-}: React.ComponentProps) {
- return (
-
- {children}
-
-
- )
-}
-
-function CommandShortcut({
- className,
- ...props
-}: React.ComponentProps<"span">) {
- return (
-
- )
-}
-
-export {
- Command,
- CommandDialog,
- CommandInput,
- CommandList,
- CommandEmpty,
- CommandGroup,
- CommandItem,
- CommandShortcut,
- CommandSeparator,
-}
diff --git a/src/components/ui/dialog.tsx b/src/components/ui/dialog.tsx
index 9bb1f25..a257946 100644
--- a/src/components/ui/dialog.tsx
+++ b/src/components/ui/dialog.tsx
@@ -1,11 +1,10 @@
"use client"
-import * as React from "react"
import { Dialog as DialogPrimitive } from "@base-ui/react/dialog"
-
-import { cn } from "@/lib/utils/shadcn"
-import { Button } from "@/components/ui/button"
import { XIcon } from "lucide-react"
+import type * as React from "react"
+import { Button } from "@/components/ui/button"
+import { cn } from "@/lib/utils"
function Dialog({ ...props }: DialogPrimitive.Root.Props) {
return
@@ -23,10 +22,7 @@ function DialogClose({ ...props }: DialogPrimitive.Close.Props) {
return
}
-function DialogOverlay({
- className,
- ...props
-}: DialogPrimitive.Backdrop.Props) {
+function DialogOverlay({ className, ...props }: DialogPrimitive.Backdrop.Props) {
return (
- }
+ render={ }
>
-
+
Close
)}
@@ -81,13 +70,7 @@ function DialogContent({
}
function DialogHeader({ className, ...props }: React.ComponentProps<"div">) {
- return (
-
- )
+ return
}
function DialogFooter({
@@ -108,11 +91,7 @@ function DialogFooter({
{...props}
>
{children}
- {showCloseButton && (
- }>
- Close
-
- )}
+ {showCloseButton && }>Close}
)
}
@@ -121,19 +100,13 @@ function DialogTitle({ className, ...props }: DialogPrimitive.Title.Props) {
return (
)
}
-function DialogDescription({
- className,
- ...props
-}: DialogPrimitive.Description.Props) {
+function DialogDescription({ className, ...props }: DialogPrimitive.Description.Props) {
return (
-}
-
-function DropdownMenuPortal({ ...props }: MenuPrimitive.Portal.Props) {
- return
-}
-
-function DropdownMenuTrigger({ ...props }: MenuPrimitive.Trigger.Props) {
- return
-}
-
-function DropdownMenuContent({
- align = "start",
- alignOffset = 0,
- side = "bottom",
- sideOffset = 4,
- className,
- ...props
-}: MenuPrimitive.Popup.Props &
- Pick<
- MenuPrimitive.Positioner.Props,
- "align" | "alignOffset" | "side" | "sideOffset"
- >) {
- return (
-
-
-
-
-
- )
-}
-
-function DropdownMenuGroup({ ...props }: MenuPrimitive.Group.Props) {
- return
-}
-
-function DropdownMenuLabel({
- className,
- inset,
- ...props
-}: MenuPrimitive.GroupLabel.Props & {
- inset?: boolean
-}) {
- return (
-
- )
-}
-
-function DropdownMenuItem({
- className,
- inset,
- variant = "default",
- ...props
-}: MenuPrimitive.Item.Props & {
- inset?: boolean
- variant?: "default" | "destructive"
-}) {
- return (
-
- )
-}
-
-function DropdownMenuSub({ ...props }: MenuPrimitive.SubmenuRoot.Props) {
- return
-}
-
-function DropdownMenuSubTrigger({
- className,
- inset,
- children,
- ...props
-}: MenuPrimitive.SubmenuTrigger.Props & {
- inset?: boolean
-}) {
- return (
-
- {children}
-
-
- )
-}
-
-function DropdownMenuSubContent({
- align = "start",
- alignOffset = -3,
- side = "right",
- sideOffset = 0,
- className,
- ...props
-}: React.ComponentProps
) {
- return (
-
- )
-}
-
-function DropdownMenuCheckboxItem({
- className,
- children,
- checked,
- inset,
- ...props
-}: MenuPrimitive.CheckboxItem.Props & {
- inset?: boolean
-}) {
- return (
-
-
-
-
-
-
- {children}
-
- )
-}
-
-function DropdownMenuRadioGroup({ ...props }: MenuPrimitive.RadioGroup.Props) {
- return (
-
- )
-}
-
-function DropdownMenuRadioItem({
- className,
- children,
- inset,
- ...props
-}: MenuPrimitive.RadioItem.Props & {
- inset?: boolean
-}) {
- return (
-
-
-
-
-
-
- {children}
-
- )
-}
-
-function DropdownMenuSeparator({
- className,
- ...props
-}: MenuPrimitive.Separator.Props) {
- return (
-
- )
-}
-
-function DropdownMenuShortcut({
- className,
- ...props
-}: React.ComponentProps<"span">) {
- return (
-
- )
-}
-
-export {
- DropdownMenu,
- DropdownMenuPortal,
- DropdownMenuTrigger,
- DropdownMenuContent,
- DropdownMenuGroup,
- DropdownMenuLabel,
- DropdownMenuItem,
- DropdownMenuCheckboxItem,
- DropdownMenuRadioGroup,
- DropdownMenuRadioItem,
- DropdownMenuSeparator,
- DropdownMenuShortcut,
- DropdownMenuSub,
- DropdownMenuSubTrigger,
- DropdownMenuSubContent,
-}
diff --git a/src/components/ui/empty.tsx b/src/components/ui/empty.tsx
new file mode 100644
index 0000000..a52f67f
--- /dev/null
+++ b/src/components/ui/empty.tsx
@@ -0,0 +1,87 @@
+import { cva, type VariantProps } from "class-variance-authority"
+
+import { cn } from "@/lib/utils"
+
+function Empty({ className, ...props }: React.ComponentProps<"div">) {
+ return (
+
+ )
+}
+
+function EmptyHeader({ className, ...props }: React.ComponentProps<"div">) {
+ return (
+
+ )
+}
+
+const emptyMediaVariants = cva(
+ "mb-2 flex shrink-0 items-center justify-center [&_svg]:pointer-events-none [&_svg]:shrink-0",
+ {
+ variants: {
+ variant: {
+ default: "bg-transparent",
+ icon: "flex size-8 shrink-0 items-center justify-center rounded-lg bg-muted text-foreground [&_svg:not([class*='size-'])]:size-4",
+ },
+ },
+ defaultVariants: {
+ variant: "default",
+ },
+ }
+)
+
+function EmptyMedia({
+ className,
+ variant = "default",
+ ...props
+}: React.ComponentProps<"div"> & VariantProps) {
+ return (
+
+ )
+}
+
+function EmptyTitle({ className, ...props }: React.ComponentProps<"div">) {
+ return (
+
+ )
+}
+
+function EmptyDescription({ className, ...props }: React.ComponentProps<"p">) {
+ return (
+ a]:underline [&>a]:underline-offset-4 [&>a:hover]:text-primary",
+ className
+ )}
+ {...props}
+ />
+ )
+}
+
+function EmptyContent({ className, ...props }: React.ComponentProps<"div">) {
+ return (
+
+ )
+}
+
+export { Empty, EmptyHeader, EmptyTitle, EmptyDescription, EmptyContent, EmptyMedia }
diff --git a/src/components/ui/field.tsx b/src/components/ui/field.tsx
index 50a5514..6dcc6cd 100644
--- a/src/components/ui/field.tsx
+++ b/src/components/ui/field.tsx
@@ -1,238 +1,60 @@
-"use client"
-
-import { useMemo } from "react"
import { cva, type VariantProps } from "class-variance-authority"
-
-import { cn } from "@/lib/utils/shadcn"
import { Label } from "@/components/ui/label"
-import { Separator } from "@/components/ui/separator"
-
-function FieldSet({ className, ...props }: React.ComponentProps<"fieldset">) {
- return (
-
[data-slot=checkbox-group]]:gap-3 has-[>[data-slot=radio-group]]:gap-3",
- className
- )}
- {...props}
- />
- )
-}
-
-function FieldLegend({
- className,
- variant = "legend",
- ...props
-}: React.ComponentProps<"legend"> & { variant?: "legend" | "label" }) {
- return (
-
- )
-}
+import { cn } from "@/lib/utils"
function FieldGroup({ className, ...props }: React.ComponentProps<"div">) {
return (
-
+
)
}
-const fieldVariants = cva(
- "group/field flex w-full gap-2 data-[invalid=true]:text-destructive",
- {
- variants: {
- orientation: {
- vertical: "flex-col *:w-full [&>.sr-only]:w-auto",
- horizontal:
- "flex-row items-center has-[>[data-slot=field-content]]:items-start *:data-[slot=field-label]:flex-auto has-[>[data-slot=field-content]]:[&>[role=checkbox],[role=radio]]:mt-px",
- responsive:
- "flex-col *:w-full @md/field-group:flex-row @md/field-group:items-center @md/field-group:*:w-auto @md/field-group:has-[>[data-slot=field-content]]:items-start @md/field-group:*:data-[slot=field-label]:flex-auto [&>.sr-only]:w-auto @md/field-group:has-[>[data-slot=field-content]]:[&>[role=checkbox],[role=radio]]:mt-px",
- },
+const fieldVariants = cva("group/field flex w-full gap-2 data-[invalid=true]:text-destructive", {
+ variants: {
+ orientation: {
+ vertical: "flex-col *:w-full [&>.sr-only]:w-auto",
+ horizontal: "flex-row items-center",
+ responsive: "flex-col *:w-full @md/field-group:flex-row @md/field-group:items-center @md/field-group:*:w-auto",
},
- defaultVariants: {
- orientation: "vertical",
- },
- }
-)
+ },
+ defaultVariants: { orientation: "vertical" },
+})
function Field({
className,
orientation = "vertical",
...props
-}: React.ComponentProps<"div"> & VariantProps) {
+}: React.ComponentProps<"fieldset"> & VariantProps) {
return (
-
)
}
-function FieldContent({ className, ...props }: React.ComponentProps<"div">) {
- return (
-
- )
-}
-
-function FieldLabel({
- className,
- ...props
-}: React.ComponentProps) {
- return (
- [data-slot=field]]:rounded-lg has-[>[data-slot=field]]:border *:data-[slot=field]:p-2.5 dark:has-data-checked:border-primary/20 dark:has-data-checked:bg-primary/10",
- "has-[>[data-slot=field]]:w-full has-[>[data-slot=field]]:flex-col",
- className
- )}
- {...props}
- />
- )
-}
-
-function FieldTitle({ className, ...props }: React.ComponentProps<"div">) {
- return (
-
- )
+function FieldLabel({ className, ...props }: React.ComponentProps) {
+ return
}
function FieldDescription({ className, ...props }: React.ComponentProps<"p">) {
return (
a]:underline [&>a]:underline-offset-4 [&>a:hover]:text-primary",
- className
- )}
+ className={cn("text-sm leading-normal text-muted-foreground", className)}
{...props}
/>
)
}
-function FieldSeparator({
- children,
- className,
- ...props
-}: React.ComponentProps<"div"> & {
- children?: React.ReactNode
-}) {
- return (
-
-
- {children && (
-
- {children}
-
- )}
-
- )
-}
-
-function FieldError({
- className,
- children,
- errors,
- ...props
-}: React.ComponentProps<"div"> & {
- errors?: Array<{ message?: string } | undefined>
-}) {
- const content = useMemo(() => {
- if (children) {
- return children
- }
-
- if (!errors?.length) {
- return null
- }
-
- const uniqueErrors = [
- ...new Map(errors.map((error) => [error?.message, error])).values(),
- ]
-
- if (uniqueErrors?.length == 1) {
- return uniqueErrors[0]?.message
- }
-
- return (
-
- {uniqueErrors.map(
- (error, index) =>
- error?.message && {error.message}
- )}
-
- )
- }, [children, errors])
-
- if (!content) {
- return null
- }
-
+function FieldError({ className, children, ...props }: React.ComponentProps<"div">) {
+ if (!children) return null
return (
-
- {content}
+
+ {children}
)
}
-export {
- Field,
- FieldLabel,
- FieldDescription,
- FieldError,
- FieldGroup,
- FieldLegend,
- FieldSeparator,
- FieldSet,
- FieldContent,
- FieldTitle,
-}
+export { Field, FieldDescription, FieldError, FieldGroup, FieldLabel }
diff --git a/src/components/ui/form.tsx b/src/components/ui/form.tsx
deleted file mode 100644
index cd03ec1..0000000
--- a/src/components/ui/form.tsx
+++ /dev/null
@@ -1,179 +0,0 @@
-"use client";
-
-import * as React from "react";
-import { type Label as LabelPrimitive, Slot as SlotPrimitive } from "radix-ui";
-
-import {
- Controller,
- type ControllerProps,
- type FieldPath,
- type FieldValues,
- FormProvider,
- useFormContext,
-} from "react-hook-form";
-
-import { cn } from "@/lib/utils/shadcn";
-import { Label } from "@/components/ui/label";
-
-const Form = FormProvider;
-
-type FormFieldContextValue<
- TFieldValues extends FieldValues = FieldValues,
- TName extends FieldPath
= FieldPath,
-> = {
- name: TName;
-};
-
-const FormFieldContext = React.createContext(
- {} as FormFieldContextValue,
-);
-
-const FormField = <
- TFieldValues extends FieldValues = FieldValues,
- TName extends FieldPath = FieldPath,
->({
- ...props
-}: ControllerProps) => {
- return (
-
-
-
- );
-};
-
-const useFormField = () => {
- const fieldContext = React.useContext(FormFieldContext);
- const itemContext = React.useContext(FormItemContext);
- const { getFieldState, formState } = useFormContext();
-
- const fieldState = getFieldState(fieldContext.name, formState);
-
- if (!fieldContext) {
- throw new Error("useFormField should be used within ");
- }
-
- const { id } = itemContext;
-
- return {
- id,
- name: fieldContext.name,
- formItemId: `${id}-form-item`,
- formDescriptionId: `${id}-form-item-description`,
- formMessageId: `${id}-form-item-message`,
- ...fieldState,
- };
-};
-
-type FormItemContextValue = {
- id: string;
-};
-
-const FormItemContext = React.createContext(
- {} as FormItemContextValue,
-);
-
-const FormItem = React.forwardRef<
- HTMLDivElement,
- React.HTMLAttributes
->(({ className, ...props }, ref) => {
- const id = React.useId();
-
- return (
-
-
-
- );
-});
-FormItem.displayName = "FormItem";
-
-const FormLabel = React.forwardRef<
- React.ElementRef,
- React.ComponentPropsWithoutRef
->(({ className, ...props }, ref) => {
- const { error, formItemId } = useFormField();
-
- return (
-
- );
-});
-FormLabel.displayName = "FormLabel";
-
-const FormControl = React.forwardRef<
- React.ElementRef,
- React.ComponentPropsWithoutRef
->(({ ...props }, ref) => {
- const { error, formItemId, formDescriptionId, formMessageId } =
- useFormField();
-
- return (
-
- );
-});
-FormControl.displayName = "FormControl";
-
-const FormDescription = React.forwardRef<
- HTMLParagraphElement,
- React.HTMLAttributes
->(({ className, ...props }, ref) => {
- const { formDescriptionId } = useFormField();
-
- return (
-
- );
-});
-FormDescription.displayName = "FormDescription";
-
-const FormMessage = React.forwardRef<
- HTMLParagraphElement,
- React.HTMLAttributes
->(({ className, children, ...props }, ref) => {
- const { error, formMessageId } = useFormField();
- const body = error ? String(error?.message) : children;
-
- if (!body) {
- return null;
- }
-
- return (
-
- {body}
-
- );
-});
-FormMessage.displayName = "FormMessage";
-
-export {
- useFormField,
- Form,
- FormItem,
- FormLabel,
- FormControl,
- FormDescription,
- FormMessage,
- FormField,
-};
diff --git a/src/components/ui/input-group.tsx b/src/components/ui/input-group.tsx
deleted file mode 100644
index 487a742..0000000
--- a/src/components/ui/input-group.tsx
+++ /dev/null
@@ -1,158 +0,0 @@
-"use client"
-
-import * as React from "react"
-import { cva, type VariantProps } from "class-variance-authority"
-
-import { cn } from "@/lib/utils/shadcn"
-import { Button } from "@/components/ui/button"
-import { Input } from "@/components/ui/input"
-import { Textarea } from "@/components/ui/textarea"
-
-function InputGroup({ className, ...props }: React.ComponentProps<"div">) {
- return (
- [data-align=block-end]]:h-auto has-[>[data-align=block-end]]:flex-col has-[>[data-align=block-start]]:h-auto has-[>[data-align=block-start]]:flex-col has-[>textarea]:h-auto dark:bg-input/30 dark:has-disabled:bg-input/80 dark:has-[[data-slot][aria-invalid=true]]:ring-destructive/40 has-[>[data-align=block-end]]:[&>input]:pt-3 has-[>[data-align=block-start]]:[&>input]:pb-3 has-[>[data-align=inline-end]]:[&>input]:pr-1.5 has-[>[data-align=inline-start]]:[&>input]:pl-1.5",
- className
- )}
- {...props}
- />
- )
-}
-
-const inputGroupAddonVariants = cva(
- "flex h-auto cursor-text items-center justify-center gap-2 py-1.5 text-sm font-medium text-muted-foreground select-none group-data-[disabled=true]/input-group:opacity-50 [&>kbd]:rounded-[calc(var(--radius)-5px)] [&>svg:not([class*='size-'])]:size-4",
- {
- variants: {
- align: {
- "inline-start":
- "order-first pl-2 has-[>button]:ml-[-0.3rem] has-[>kbd]:ml-[-0.15rem]",
- "inline-end":
- "order-last pr-2 has-[>button]:mr-[-0.3rem] has-[>kbd]:mr-[-0.15rem]",
- "block-start":
- "order-first w-full justify-start px-2.5 pt-2 group-has-[>input]/input-group:pt-2 [.border-b]:pb-2",
- "block-end":
- "order-last w-full justify-start px-2.5 pb-2 group-has-[>input]/input-group:pb-2 [.border-t]:pt-2",
- },
- },
- defaultVariants: {
- align: "inline-start",
- },
- }
-)
-
-function InputGroupAddon({
- className,
- align = "inline-start",
- ...props
-}: React.ComponentProps<"div"> & VariantProps
) {
- return (
- {
- if ((e.target as HTMLElement).closest("button")) {
- return
- }
- e.currentTarget.parentElement?.querySelector("input")?.focus()
- }}
- {...props}
- />
- )
-}
-
-const inputGroupButtonVariants = cva(
- "flex items-center gap-2 text-sm shadow-none",
- {
- variants: {
- size: {
- xs: "h-6 gap-1 rounded-[calc(var(--radius)-3px)] px-1.5 [&>svg:not([class*='size-'])]:size-3.5",
- sm: "",
- "icon-xs":
- "size-6 rounded-[calc(var(--radius)-3px)] p-0 has-[>svg]:p-0",
- "icon-sm": "size-8 p-0 has-[>svg]:p-0",
- },
- },
- defaultVariants: {
- size: "xs",
- },
- }
-)
-
-function InputGroupButton({
- className,
- type = "button",
- variant = "ghost",
- size = "xs",
- ...props
-}: Omit
, "size" | "type"> &
- VariantProps & {
- type?: "button" | "submit" | "reset"
- }) {
- return (
-
- )
-}
-
-function InputGroupText({ className, ...props }: React.ComponentProps<"span">) {
- return (
-
- )
-}
-
-function InputGroupInput({
- className,
- ...props
-}: React.ComponentProps<"input">) {
- return (
-
- )
-}
-
-function InputGroupTextarea({
- className,
- ...props
-}: React.ComponentProps<"textarea">) {
- return (
-
- )
-}
-
-export {
- InputGroup,
- InputGroupAddon,
- InputGroupButton,
- InputGroupText,
- InputGroupInput,
- InputGroupTextarea,
-}
diff --git a/src/components/ui/input-otp.tsx b/src/components/ui/input-otp.tsx
deleted file mode 100644
index dcbc966..0000000
--- a/src/components/ui/input-otp.tsx
+++ /dev/null
@@ -1,87 +0,0 @@
-"use client"
-
-import * as React from "react"
-import { OTPInput, OTPInputContext } from "input-otp"
-
-import { cn } from "@/lib/utils/shadcn"
-import { MinusIcon } from "lucide-react"
-
-function InputOTP({
- className,
- containerClassName,
- ...props
-}: React.ComponentProps & {
- containerClassName?: string
-}) {
- return (
-
- )
-}
-
-function InputOTPGroup({ className, ...props }: React.ComponentProps<"div">) {
- return (
-
- )
-}
-
-function InputOTPSlot({
- index,
- className,
- ...props
-}: React.ComponentProps<"div"> & {
- index: number
-}) {
- const inputOTPContext = React.useContext(OTPInputContext)
- const { char, hasFakeCaret, isActive } = inputOTPContext?.slots[index] ?? {}
-
- return (
-
- {char}
- {hasFakeCaret && (
-
- )}
-
- )
-}
-
-function InputOTPSeparator({ ...props }: React.ComponentProps<"div">) {
- return (
-
-
-
- )
-}
-
-export { InputOTP, InputOTPGroup, InputOTPSlot, InputOTPSeparator }
diff --git a/src/components/ui/input.tsx b/src/components/ui/input.tsx
index 8e7a2ca..aeecf87 100644
--- a/src/components/ui/input.tsx
+++ b/src/components/ui/input.tsx
@@ -1,19 +1,9 @@
-import * as React from "react"
import { Input as InputPrimitive } from "@base-ui/react/input"
+import type * as React from "react"
-import { cn } from "@/lib/utils/shadcn"
+import { cn } from "@/lib/utils"
function Input({ className, type, ...props }: React.ComponentProps<"input">) {
-const ignoreManagerAttrs =
- props.autoComplete === "off"
- ? {
- "data-1p-ignore": true, // 1Password
- "data-lpignore": true, // LastPass
- "data-bwignore": true, // Bitwarden
- "data-form-type": "other", // Dashlane
- }
- : {};
-
return (
)
}
diff --git a/src/components/ui/label.tsx b/src/components/ui/label.tsx
index 2366f82..b803ce8 100644
--- a/src/components/ui/label.tsx
+++ b/src/components/ui/label.tsx
@@ -1,12 +1,14 @@
-"use client"
+import type * as React from "react"
-import * as React from "react"
+import { cn } from "@/lib/utils"
-import { cn } from "@/lib/utils/shadcn"
+type LabelProps = Omit, "htmlFor"> & { htmlFor: string }
-function Label({ className, ...props }: React.ComponentProps<"label">) {
+function Label({ className, htmlFor, ...props }: LabelProps) {
return (
+ // biome-ignore lint/a11y/noLabelWithoutControl: Label associates its control through the required htmlFor prop.
) {
+ return (
+
+ )
+}
+
+function PaginationContent({ className, ...props }: React.ComponentProps<"ul">) {
+ return
+}
+
+function PaginationItem({ ...props }: React.ComponentProps<"li">) {
+ return
+}
+
+type PaginationLinkProps = {
+ isActive?: boolean
+} & Pick, "size"> &
+ React.ComponentProps<"a">
+
+function PaginationLink({ className, isActive, size = "icon", ...props }: PaginationLinkProps) {
+ return (
+
+ }
+ />
+ )
+}
+
+function PaginationPrevious({
+ className,
+ text = "Previous",
+ ...props
+}: React.ComponentProps & { text?: string }) {
+ return (
+
+
+ {text}
+
+ )
+}
+
+function PaginationNext({
+ className,
+ text = "Next",
+ ...props
+}: React.ComponentProps & { text?: string }) {
+ return (
+
+ {text}
+
+
+ )
+}
+
+function PaginationEllipsis({ className, ...props }: React.ComponentProps<"span">) {
+ return (
+
+
+ More pages
+
+ )
+}
+
+export {
+ Pagination,
+ PaginationContent,
+ PaginationEllipsis,
+ PaginationItem,
+ PaginationLink,
+ PaginationNext,
+ PaginationPrevious,
+}
diff --git a/src/components/ui/popover.tsx b/src/components/ui/popover.tsx
deleted file mode 100644
index e0f0707..0000000
--- a/src/components/ui/popover.tsx
+++ /dev/null
@@ -1,90 +0,0 @@
-"use client"
-
-import * as React from "react"
-import { Popover as PopoverPrimitive } from "@base-ui/react/popover"
-
-import { cn } from "@/lib/utils/shadcn"
-
-function Popover({ ...props }: PopoverPrimitive.Root.Props) {
- return
-}
-
-function PopoverTrigger({ ...props }: PopoverPrimitive.Trigger.Props) {
- return
-}
-
-function PopoverContent({
- className,
- align = "center",
- alignOffset = 0,
- side = "bottom",
- sideOffset = 4,
- ...props
-}: PopoverPrimitive.Popup.Props &
- Pick<
- PopoverPrimitive.Positioner.Props,
- "align" | "alignOffset" | "side" | "sideOffset"
- >) {
- return (
-
-
-
-
-
- )
-}
-
-function PopoverHeader({ className, ...props }: React.ComponentProps<"div">) {
- return (
-
- )
-}
-
-function PopoverTitle({ className, ...props }: PopoverPrimitive.Title.Props) {
- return (
-
- )
-}
-
-function PopoverDescription({
- className,
- ...props
-}: PopoverPrimitive.Description.Props) {
- return (
-
- )
-}
-
-export {
- Popover,
- PopoverContent,
- PopoverDescription,
- PopoverHeader,
- PopoverTitle,
- PopoverTrigger,
-}
diff --git a/src/components/ui/progress.tsx b/src/components/ui/progress.tsx
deleted file mode 100644
index 5415215..0000000
--- a/src/components/ui/progress.tsx
+++ /dev/null
@@ -1,80 +0,0 @@
-"use client"
-
-import { Progress as ProgressPrimitive } from "@base-ui/react/progress"
-
-import { cn } from "@/lib/utils/shadcn"
-
-function Progress({
- className,
- children,
- value,
- ...props
-}: ProgressPrimitive.Root.Props) {
- return (
-
- {children}
-
- )
-}
-
-function ProgressTrack({ className, ...props }: ProgressPrimitive.Track.Props) {
- return (
-
- )
-}
-
-function ProgressIndicator({
- className,
- ...props
-}: ProgressPrimitive.Indicator.Props) {
- return (
-
- )
-}
-
-function ProgressLabel({ className, ...props }: ProgressPrimitive.Label.Props) {
- return (
-
- )
-}
-
-function ProgressValue({ className, ...props }: ProgressPrimitive.Value.Props) {
- return (
-
- )
-}
-
-export {
- Progress,
- ProgressTrack,
- ProgressIndicator,
- ProgressLabel,
- ProgressValue,
-}
diff --git a/src/components/ui/select.tsx b/src/components/ui/select.tsx
deleted file mode 100644
index bef549b..0000000
--- a/src/components/ui/select.tsx
+++ /dev/null
@@ -1,201 +0,0 @@
-"use client"
-
-import * as React from "react"
-import { Select as SelectPrimitive } from "@base-ui/react/select"
-
-import { cn } from "@/lib/utils/shadcn"
-import { ChevronDownIcon, CheckIcon, ChevronUpIcon } from "lucide-react"
-
-const Select = SelectPrimitive.Root
-
-function SelectGroup({ className, ...props }: SelectPrimitive.Group.Props) {
- return (
-
- )
-}
-
-function SelectValue({ className, ...props }: SelectPrimitive.Value.Props) {
- return (
-
- )
-}
-
-function SelectTrigger({
- className,
- size = "default",
- children,
- ...props
-}: SelectPrimitive.Trigger.Props & {
- size?: "sm" | "default"
-}) {
- return (
-
- {children}
-
- }
- />
-
- )
-}
-
-function SelectContent({
- className,
- children,
- side = "bottom",
- sideOffset = 4,
- align = "center",
- alignOffset = 0,
- alignItemWithTrigger = true,
- ...props
-}: SelectPrimitive.Popup.Props &
- Pick<
- SelectPrimitive.Positioner.Props,
- "align" | "alignOffset" | "side" | "sideOffset" | "alignItemWithTrigger"
- >) {
- return (
-
-
-
-
- {children}
-
-
-
-
- )
-}
-
-function SelectLabel({
- className,
- ...props
-}: SelectPrimitive.GroupLabel.Props) {
- return (
-
- )
-}
-
-function SelectItem({
- className,
- children,
- ...props
-}: SelectPrimitive.Item.Props) {
- return (
-
-
- {children}
-
-
- }
- >
-
-
-
- )
-}
-
-function SelectSeparator({
- className,
- ...props
-}: SelectPrimitive.Separator.Props) {
- return (
-
- )
-}
-
-function SelectScrollUpButton({
- className,
- ...props
-}: React.ComponentProps) {
- return (
-
-
-
- )
-}
-
-function SelectScrollDownButton({
- className,
- ...props
-}: React.ComponentProps) {
- return (
-
-
-
- )
-}
-
-export {
- Select,
- SelectContent,
- SelectGroup,
- SelectItem,
- SelectLabel,
- SelectScrollDownButton,
- SelectScrollUpButton,
- SelectSeparator,
- SelectTrigger,
- SelectValue,
-}
diff --git a/src/components/ui/separator.tsx b/src/components/ui/separator.tsx
index 0616473..740c9da 100644
--- a/src/components/ui/separator.tsx
+++ b/src/components/ui/separator.tsx
@@ -1,14 +1,8 @@
-"use client"
-
import { Separator as SeparatorPrimitive } from "@base-ui/react/separator"
-import { cn } from "@/lib/utils/shadcn"
+import { cn } from "@/lib/utils"
-function Separator({
- className,
- orientation = "horizontal",
- ...props
-}: SeparatorPrimitive.Props) {
+function Separator({ className, orientation = "horizontal", ...props }: SeparatorPrimitive.Props) {
return (
-}
-
-function SheetTrigger({ ...props }: SheetPrimitive.Trigger.Props) {
- return
-}
-
-function SheetClose({ ...props }: SheetPrimitive.Close.Props) {
- return
-}
-
-function SheetPortal({ ...props }: SheetPrimitive.Portal.Props) {
- return
-}
-
-function SheetOverlay({ className, ...props }: SheetPrimitive.Backdrop.Props) {
- return (
-
- )
-}
-
-function SheetContent({
- className,
- children,
- side = "right",
- showCloseButton = true,
- ...props
-}: SheetPrimitive.Popup.Props & {
- side?: "top" | "right" | "bottom" | "left"
- showCloseButton?: boolean
-}) {
- return (
-
-
-
- {children}
- {showCloseButton && (
-
- }
- >
-
- Close
-
- )}
-
-
- )
-}
-
-function SheetHeader({ className, ...props }: React.ComponentProps<"div">) {
- return (
-
- )
-}
-
-function SheetFooter({ className, ...props }: React.ComponentProps<"div">) {
- return (
-
- )
-}
-
-function SheetTitle({ className, ...props }: SheetPrimitive.Title.Props) {
- return (
-
- )
-}
-
-function SheetDescription({
- className,
- ...props
-}: SheetPrimitive.Description.Props) {
- return (
-
- )
-}
-
-export {
- Sheet,
- SheetTrigger,
- SheetClose,
- SheetContent,
- SheetHeader,
- SheetFooter,
- SheetTitle,
- SheetDescription,
-}
diff --git a/src/components/ui/sidebar.tsx b/src/components/ui/sidebar.tsx
deleted file mode 100644
index 3205f8a..0000000
--- a/src/components/ui/sidebar.tsx
+++ /dev/null
@@ -1,727 +0,0 @@
-"use client"
-
-import * as React from "react"
-import { mergeProps } from "@base-ui/react/merge-props"
-import { useRender } from "@base-ui/react/use-render"
-import { cva, type VariantProps } from "class-variance-authority"
-
-import { useIsMobile } from "@/hooks/use-mobile"
-import { cn } from "@/lib/utils/shadcn"
-import { Button } from "@/components/ui/button"
-import { Input } from "@/components/ui/input"
-import { Separator } from "@/components/ui/separator"
-import {
- Sheet,
- SheetContent,
- SheetDescription,
- SheetHeader,
- SheetTitle,
-} from "@/components/ui/sheet"
-import { Skeleton } from "@/components/ui/skeleton"
-import {
- Tooltip,
- TooltipContent,
- TooltipTrigger,
-} from "@/components/ui/tooltip"
-import { PanelLeftIcon } from "lucide-react"
-import { useCookieStorage } from "@/hooks/use-cookie-storage"
-import { COOKIES } from "@/constants"
-
-const SIDEBAR_WIDTH = "16rem"
-const SIDEBAR_WIDTH_MOBILE = "18rem"
-const SIDEBAR_WIDTH_ICON = "3rem"
-const SIDEBAR_KEYBOARD_SHORTCUT = "b"
-
-type SidebarContextProps = {
- state: "expanded" | "collapsed"
- open: boolean
- setOpen: (open: boolean) => void
- openMobile: boolean
- setOpenMobile: (open: boolean) => void
- isMobile: boolean
- toggleSidebar: () => void
-}
-
-const SidebarContext = React.createContext(null)
-
-function useSidebar() {
- const context = React.useContext(SidebarContext)
- if (!context) {
- throw new Error("useSidebar must be used within a SidebarProvider.")
- }
-
- return context
-}
-
-function SidebarProvider({
- defaultOpen = true,
- open: openProp,
- onOpenChange: setOpenProp,
- className,
- style,
- children,
- ...props
-}: React.ComponentProps<"div"> & {
- defaultOpen?: boolean
- open?: boolean
- onOpenChange?: (open: boolean) => void
-}) {
- const isMobile = useIsMobile()
- const [openMobile, setOpenMobile] = React.useState(false)
-
- // This is the internal state of the sidebar.
- // We use openProp and setOpenProp for control from outside the component.
- const [_, setOpenCookie] = useCookieStorage(
- COOKIES.SIDEBAR_OPEN,
- false,
- { expires: 60 * 60 * 24 * 7 }
- )
- const [_open, _setOpen] = React.useState(defaultOpen)
- const open = openProp ?? _open
- const setOpen = React.useCallback(
- (value: boolean | ((value: boolean) => boolean)) => {
- const openState = typeof value === "function" ? value(open) : value
- if (setOpenProp) {
- setOpenProp(openState)
- } else {
- _setOpen(openState)
- }
-
- setOpenCookie(openState)
- },
- [setOpenProp, open]
- )
-
- // Helper to toggle the sidebar.
- const toggleSidebar = React.useCallback(() => {
- return isMobile ? setOpenMobile((open) => !open) : setOpen((open) => !open)
- }, [isMobile, setOpen, setOpenMobile])
-
- // Adds a keyboard shortcut to toggle the sidebar.
- React.useEffect(() => {
- const handleKeyDown = (event: KeyboardEvent) => {
- if (
- event.key === SIDEBAR_KEYBOARD_SHORTCUT &&
- (event.metaKey || event.ctrlKey)
- ) {
- event.preventDefault()
- toggleSidebar()
- }
- }
-
- window.addEventListener("keydown", handleKeyDown)
- return () => window.removeEventListener("keydown", handleKeyDown)
- }, [toggleSidebar])
-
- // We add a state so that we can do data-state="expanded" or "collapsed".
- // This makes it easier to style the sidebar with Tailwind classes.
- const state = open ? "expanded" : "collapsed"
-
- const contextValue = React.useMemo(
- () => ({
- state,
- open,
- setOpen,
- isMobile,
- openMobile,
- setOpenMobile,
- toggleSidebar,
- }),
- [state, open, setOpen, isMobile, openMobile, setOpenMobile, toggleSidebar]
- )
-
- return (
-
-
- {children}
-
-
- )
-}
-
-function Sidebar({
- side = "left",
- variant = "sidebar",
- collapsible = "offcanvas",
- className,
- children,
- dir,
- ...props
-}: React.ComponentProps<"div"> & {
- side?: "left" | "right"
- variant?: "sidebar" | "floating" | "inset"
- collapsible?: "offcanvas" | "icon" | "none"
-}) {
- const { isMobile, state, openMobile, setOpenMobile } = useSidebar()
-
- if (collapsible === "none") {
- return (
-
- {children}
-
- )
- }
-
- if (isMobile) {
- return (
-
-
-
- Sidebar
- Displays the mobile sidebar.
-
- {children}
-
-
- )
- }
-
- return (
-
- {/* This is what handles the sidebar gap on desktop */}
-
-
-
- )
-}
-
-function SidebarTrigger({
- className,
- onClick,
- ...props
-}: React.ComponentProps) {
- const { toggleSidebar } = useSidebar()
-
- return (
- {
- onClick?.(event)
- toggleSidebar()
- }}
- {...props}
- >
-
- Toggle Sidebar
-
- )
-}
-
-function SidebarRail({ className, ...props }: React.ComponentProps<"button">) {
- const { toggleSidebar } = useSidebar()
-
- return (
-
- )
-}
-
-function SidebarInset({ className, ...props }: React.ComponentProps<"main">) {
- return (
-
- )
-}
-
-function SidebarInput({
- className,
- ...props
-}: React.ComponentProps) {
- return (
-
- )
-}
-
-function SidebarHeader({ className, ...props }: React.ComponentProps<"div">) {
- return (
-
- )
-}
-
-function SidebarFooter({ className, ...props }: React.ComponentProps<"div">) {
- return (
-
- )
-}
-
-function SidebarSeparator({
- className,
- ...props
-}: React.ComponentProps) {
- return (
-
- )
-}
-
-function SidebarContent({ className, ...props }: React.ComponentProps<"div">) {
- return (
-
- )
-}
-
-function SidebarGroup({ className, ...props }: React.ComponentProps<"div">) {
- return (
-
- )
-}
-
-function SidebarGroupLabel({
- className,
- render,
- ...props
-}: useRender.ComponentProps<"div"> & React.ComponentProps<"div">) {
- return useRender({
- defaultTagName: "div",
- props: mergeProps<"div">(
- {
- className: cn(
- "flex h-8 shrink-0 items-center rounded-md px-2 text-xs font-medium text-sidebar-foreground/70 ring-sidebar-ring outline-hidden transition-[margin,opacity] duration-200 ease-linear group-data-[collapsible=icon]:-mt-8 group-data-[collapsible=icon]:opacity-0 focus-visible:ring-2 [&>svg]:size-4 [&>svg]:shrink-0",
- className
- ),
- },
- props
- ),
- render,
- state: {
- slot: "sidebar-group-label",
- sidebar: "group-label",
- },
- })
-}
-
-function SidebarGroupAction({
- className,
- render,
- ...props
-}: useRender.ComponentProps<"button"> & React.ComponentProps<"button">) {
- return useRender({
- defaultTagName: "button",
- props: mergeProps<"button">(
- {
- className: cn(
- "absolute top-3.5 right-3 flex aspect-square w-5 items-center justify-center rounded-md p-0 text-sidebar-foreground ring-sidebar-ring outline-hidden transition-transform group-data-[collapsible=icon]:hidden after:absolute after:-inset-2 hover:bg-sidebar-accent hover:text-sidebar-accent-foreground focus-visible:ring-2 md:after:hidden [&>svg]:size-4 [&>svg]:shrink-0",
- className
- ),
- },
- props
- ),
- render,
- state: {
- slot: "sidebar-group-action",
- sidebar: "group-action",
- },
- })
-}
-
-function SidebarGroupContent({
- className,
- ...props
-}: React.ComponentProps<"div">) {
- return (
-
- )
-}
-
-function SidebarMenu({ className, ...props }: React.ComponentProps<"ul">) {
- return (
-
- )
-}
-
-function SidebarMenuItem({ className, ...props }: React.ComponentProps<"li">) {
- return (
-
- )
-}
-
-const sidebarMenuButtonVariants = cva(
- "peer/menu-button group/menu-button flex w-full items-center gap-2 overflow-hidden rounded-md p-2 text-left text-sm ring-sidebar-ring outline-hidden transition-[width,height,padding] group-has-data-[sidebar=menu-action]/menu-item:pr-8 group-data-[collapsible=icon]:size-8! group-data-[collapsible=icon]:p-2! hover:bg-sidebar-accent hover:text-sidebar-accent-foreground focus-visible:ring-2 active:bg-sidebar-accent active:text-sidebar-accent-foreground disabled:pointer-events-none disabled:opacity-50 aria-disabled:pointer-events-none aria-disabled:opacity-50 data-open:hover:bg-sidebar-accent data-open:hover:text-sidebar-accent-foreground data-active:bg-sidebar-accent data-active:font-medium data-active:text-sidebar-accent-foreground [&_svg]:size-4 [&_svg]:shrink-0 [&>span:last-child]:truncate",
- {
- variants: {
- variant: {
- default: "hover:bg-sidebar-accent hover:text-sidebar-accent-foreground",
- outline:
- "bg-background shadow-[0_0_0_1px_var(--sidebar-border)] hover:bg-sidebar-accent hover:text-sidebar-accent-foreground hover:shadow-[0_0_0_1px_var(--sidebar-accent)]",
- },
- size: {
- default: "h-8 text-sm",
- sm: "h-7 text-xs",
- lg: "h-12 text-sm group-data-[collapsible=icon]:p-0!",
- },
- },
- defaultVariants: {
- variant: "default",
- size: "default",
- },
- }
-)
-
-function SidebarMenuButton({
- render,
- isActive = false,
- variant = "default",
- size = "default",
- tooltip,
- className,
- ...props
-}: useRender.ComponentProps<"button"> &
- React.ComponentProps<"button"> & {
- isActive?: boolean
- tooltip?: string | React.ComponentProps
- } & VariantProps) {
- const { isMobile, state } = useSidebar()
- const comp = useRender({
- defaultTagName: "button",
- props: mergeProps<"button">(
- {
- className: cn(sidebarMenuButtonVariants({ variant, size }), className),
- },
- props
- ),
- render: !tooltip ? render : ,
- state: {
- slot: "sidebar-menu-button",
- sidebar: "menu-button",
- size,
- active: isActive,
- },
- })
-
- if (!tooltip) {
- return comp
- }
-
- if (typeof tooltip === "string") {
- tooltip = {
- children: tooltip,
- }
- }
-
- return (
-
- {comp}
-
-
- )
-}
-
-function SidebarMenuAction({
- className,
- render,
- showOnHover = false,
- ...props
-}: useRender.ComponentProps<"button"> &
- React.ComponentProps<"button"> & {
- showOnHover?: boolean
- }) {
- return useRender({
- defaultTagName: "button",
- props: mergeProps<"button">(
- {
- className: cn(
- "absolute top-1.5 right-1 flex aspect-square w-5 items-center justify-center rounded-md p-0 text-sidebar-foreground ring-sidebar-ring outline-hidden transition-transform group-data-[collapsible=icon]:hidden peer-hover/menu-button:text-sidebar-accent-foreground peer-data-[size=default]/menu-button:top-1.5 peer-data-[size=lg]/menu-button:top-2.5 peer-data-[size=sm]/menu-button:top-1 after:absolute after:-inset-2 hover:bg-sidebar-accent hover:text-sidebar-accent-foreground focus-visible:ring-2 md:after:hidden [&>svg]:size-4 [&>svg]:shrink-0",
- showOnHover &&
- "group-focus-within/menu-item:opacity-100 group-hover/menu-item:opacity-100 peer-data-active/menu-button:text-sidebar-accent-foreground aria-expanded:opacity-100 md:opacity-0",
- className
- ),
- },
- props
- ),
- render,
- state: {
- slot: "sidebar-menu-action",
- sidebar: "menu-action",
- },
- })
-}
-
-function SidebarMenuBadge({
- className,
- ...props
-}: React.ComponentProps<"div">) {
- return (
-
- )
-}
-
-function SidebarMenuSkeleton({
- className,
- showIcon = false,
- ...props
-}: React.ComponentProps<"div"> & {
- showIcon?: boolean
-}) {
- // Random width between 50 to 90%.
- const [width] = React.useState(() => {
- return `${Math.floor(Math.random() * 40) + 50}%`
- })
-
- return (
-
- {showIcon && (
-
- )}
-
-
- )
-}
-
-function SidebarMenuSub({ className, ...props }: React.ComponentProps<"ul">) {
- return (
-
- )
-}
-
-function SidebarMenuSubItem({
- className,
- ...props
-}: React.ComponentProps<"li">) {
- return (
-
- )
-}
-
-function SidebarMenuSubButton({
- render,
- size = "md",
- isActive = false,
- className,
- ...props
-}: useRender.ComponentProps<"a"> &
- React.ComponentProps<"a"> & {
- size?: "sm" | "md"
- isActive?: boolean
- }) {
- return useRender({
- defaultTagName: "a",
- props: mergeProps<"a">(
- {
- className: cn(
- "flex h-7 min-w-0 -translate-x-px items-center gap-2 overflow-hidden rounded-md px-2 text-sidebar-foreground ring-sidebar-ring outline-hidden group-data-[collapsible=icon]:hidden hover:bg-sidebar-accent hover:text-sidebar-accent-foreground focus-visible:ring-2 active:bg-sidebar-accent active:text-sidebar-accent-foreground disabled:pointer-events-none disabled:opacity-50 aria-disabled:pointer-events-none aria-disabled:opacity-50 data-[size=md]:text-sm data-[size=sm]:text-xs data-active:bg-sidebar-accent data-active:text-sidebar-accent-foreground [&>span:last-child]:truncate [&>svg]:size-4 [&>svg]:shrink-0 [&>svg]:text-sidebar-accent-foreground",
- className
- ),
- },
- props
- ),
- render,
- state: {
- slot: "sidebar-menu-sub-button",
- sidebar: "menu-sub-button",
- size,
- active: isActive,
- },
- })
-}
-
-export {
- Sidebar,
- SidebarContent,
- SidebarFooter,
- SidebarGroup,
- SidebarGroupAction,
- SidebarGroupContent,
- SidebarGroupLabel,
- SidebarHeader,
- SidebarInput,
- SidebarInset,
- SidebarMenu,
- SidebarMenuAction,
- SidebarMenuBadge,
- SidebarMenuButton,
- SidebarMenuItem,
- SidebarMenuSkeleton,
- SidebarMenuSub,
- SidebarMenuSubButton,
- SidebarMenuSubItem,
- SidebarProvider,
- SidebarRail,
- SidebarSeparator,
- SidebarTrigger,
- useSidebar,
-}
diff --git a/src/components/ui/skeleton.tsx b/src/components/ui/skeleton.tsx
index b1819d1..4b9d88f 100644
--- a/src/components/ui/skeleton.tsx
+++ b/src/components/ui/skeleton.tsx
@@ -1,13 +1,7 @@
-import { cn } from "@/lib/utils/shadcn"
+import { cn } from "@/lib/utils"
function Skeleton({ className, ...props }: React.ComponentProps<"div">) {
- return (
-
- )
+ return
}
export { Skeleton }
diff --git a/src/components/ui/sonner.tsx b/src/components/ui/sonner.tsx
index 9280ee5..be809a4 100644
--- a/src/components/ui/sonner.tsx
+++ b/src/components/ui/sonner.tsx
@@ -1,44 +1,13 @@
-"use client"
-
-import { useTheme } from "next-themes"
import { Toaster as Sonner, type ToasterProps } from "sonner"
-import { CircleCheckIcon, InfoIcon, TriangleAlertIcon, OctagonXIcon, Loader2Icon } from "lucide-react"
const Toaster = ({ ...props }: ToasterProps) => {
- const { theme = "system" } = useTheme()
-
return (
- ),
- info: (
-
- ),
- warning: (
-
- ),
- error: (
-
- ),
- loading: (
-
- ),
- }}
- style={
- {
- "--normal-bg": "var(--popover)",
- "--normal-text": "var(--popover-foreground)",
- "--normal-border": "var(--border)",
- "--border-radius": "var(--radius)",
- } as React.CSSProperties
- }
toastOptions={{
classNames: {
- toast: "cn-toast",
+ toast: "sonner-toast",
},
}}
{...props}
diff --git a/src/components/ui/table.tsx b/src/components/ui/table.tsx
index f71e80e..3a6f0e5 100644
--- a/src/components/ui/table.tsx
+++ b/src/components/ui/table.tsx
@@ -1,52 +1,28 @@
-"use client"
+import type * as React from "react"
-import * as React from "react"
-
-import { cn } from "@/lib/utils/shadcn"
+import { cn } from "@/lib/utils"
function Table({ className, ...props }: React.ComponentProps<"table">) {
return (
-
-
+
)
}
function TableHeader({ className, ...props }: React.ComponentProps<"thead">) {
- return (
-
- )
+ return
}
function TableBody({ className, ...props }: React.ComponentProps<"tbody">) {
- return (
-
- )
+ return
}
function TableFooter({ className, ...props }: React.ComponentProps<"tfoot">) {
return (
tr]:last:border-b-0",
- className
- )}
+ className={cn("border-t bg-muted/50 font-medium [&>tr]:last:border-b-0", className)}
{...props}
/>
)
@@ -82,35 +58,16 @@ function TableCell({ className, ...props }: React.ComponentProps<"td">) {
return (
)
}
-function TableCaption({
- className,
- ...props
-}: React.ComponentProps<"caption">) {
+function TableCaption({ className, ...props }: React.ComponentProps<"caption">) {
return (
-
+
)
}
-export {
- Table,
- TableHeader,
- TableBody,
- TableFooter,
- TableHead,
- TableRow,
- TableCell,
- TableCaption,
-}
+export { Table, TableHeader, TableBody, TableFooter, TableHead, TableRow, TableCell, TableCaption }
diff --git a/src/components/ui/tabs.tsx b/src/components/ui/tabs.tsx
deleted file mode 100644
index c298661..0000000
--- a/src/components/ui/tabs.tsx
+++ /dev/null
@@ -1,82 +0,0 @@
-"use client"
-
-import { Tabs as TabsPrimitive } from "@base-ui/react/tabs"
-import { cva, type VariantProps } from "class-variance-authority"
-
-import { cn } from "@/lib/utils/shadcn"
-
-function Tabs({
- className,
- orientation = "horizontal",
- ...props
-}: TabsPrimitive.Root.Props) {
- return (
-
- )
-}
-
-const tabsListVariants = cva(
- "group/tabs-list inline-flex w-fit items-center justify-center rounded-lg p-[3px] text-muted-foreground group-data-horizontal/tabs:h-8 group-data-vertical/tabs:h-fit group-data-vertical/tabs:flex-col data-[variant=line]:rounded-none",
- {
- variants: {
- variant: {
- default: "bg-background border",
- line: "gap-1 bg-transparent",
- },
- },
- defaultVariants: {
- variant: "default",
- },
- }
-)
-
-function TabsList({
- className,
- variant = "default",
- ...props
-}: TabsPrimitive.List.Props & VariantProps) {
- return (
-
- )
-}
-
-function TabsTrigger({ className, ...props }: TabsPrimitive.Tab.Props) {
- return (
-
- )
-}
-
-function TabsContent({ className, ...props }: TabsPrimitive.Panel.Props) {
- return (
-
- )
-}
-
-export { Tabs, TabsList, TabsTrigger, TabsContent, tabsListVariants }
diff --git a/src/components/ui/textarea.tsx b/src/components/ui/textarea.tsx
deleted file mode 100644
index c0eacbf..0000000
--- a/src/components/ui/textarea.tsx
+++ /dev/null
@@ -1,18 +0,0 @@
-import * as React from "react"
-
-import { cn } from "@/lib/utils/shadcn"
-
-function Textarea({ className, ...props }: React.ComponentProps<"textarea">) {
- return (
-
- )
-}
-
-export { Textarea }
diff --git a/src/components/ui/toggle-group.tsx b/src/components/ui/toggle-group.tsx
index 34d955a..4b6ff1f 100644
--- a/src/components/ui/toggle-group.tsx
+++ b/src/components/ui/toggle-group.tsx
@@ -1,12 +1,11 @@
"use client"
-import * as React from "react"
import { Toggle as TogglePrimitive } from "@base-ui/react/toggle"
import { ToggleGroup as ToggleGroupPrimitive } from "@base-ui/react/toggle-group"
-import { type VariantProps } from "class-variance-authority"
-
-import { cn } from "@/lib/utils/shadcn"
+import type { VariantProps } from "class-variance-authority"
+import * as React from "react"
import { toggleVariants } from "@/components/ui/toggle"
+import { cn } from "@/lib/utils"
const ToggleGroupContext = React.createContext<
VariantProps & {
@@ -16,7 +15,7 @@ const ToggleGroupContext = React.createContext<
>({
size: "default",
variant: "default",
- spacing: 0,
+ spacing: 2,
orientation: "horizontal",
})
@@ -24,7 +23,7 @@ function ToggleGroup({
className,
variant,
size,
- spacing = 0,
+ spacing = 2,
orientation = "horizontal",
children,
...props
@@ -47,9 +46,7 @@ function ToggleGroup({
)}
{...props}
>
-
+
{children}
diff --git a/src/components/ui/toggle.tsx b/src/components/ui/toggle.tsx
index 9ecf9c8..1d47b60 100644
--- a/src/components/ui/toggle.tsx
+++ b/src/components/ui/toggle.tsx
@@ -1,12 +1,10 @@
-"use client"
-
import { Toggle as TogglePrimitive } from "@base-ui/react/toggle"
import { cva, type VariantProps } from "class-variance-authority"
-import { cn } from "@/lib/utils/shadcn"
+import { cn } from "@/lib/utils"
const toggleVariants = cva(
- "group/toggle inline-flex items-center justify-center gap-1 rounded-lg text-sm font-medium whitespace-nowrap transition-all outline-none hover:bg-muted hover:text-foreground focus-visible:border-ring focus-visible:ring-[3px] focus-visible:ring-ring/50 disabled:pointer-events-none disabled:opacity-50 aria-invalid:border-destructive aria-invalid:ring-destructive/20 aria-pressed:bg-primary data-[state=on]:bg-primary dark:aria-invalid:ring-destructive/40 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4",
+ "group/toggle inline-flex items-center justify-center gap-1 rounded-lg text-sm font-medium whitespace-nowrap transition-all outline-none hover:bg-muted hover:text-foreground focus-visible:border-ring focus-visible:ring-[3px] focus-visible:ring-ring/50 disabled:pointer-events-none disabled:opacity-50 aria-invalid:border-destructive aria-invalid:ring-destructive/20 aria-pressed:bg-muted data-[state=on]:bg-muted dark:aria-invalid:ring-destructive/40 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4",
{
variants: {
variant: {
@@ -14,8 +12,7 @@ const toggleVariants = cva(
outline: "border border-input bg-transparent hover:bg-muted",
},
size: {
- default:
- "h-8 min-w-8 px-2.5 has-data-[icon=inline-end]:pr-2 has-data-[icon=inline-start]:pl-2",
+ default: "h-8 min-w-8 px-2.5 has-data-[icon=inline-end]:pr-2 has-data-[icon=inline-start]:pl-2",
sm: "h-7 min-w-7 rounded-[min(var(--radius-md),12px)] px-2.5 text-[0.8rem] has-data-[icon=inline-end]:pr-1.5 has-data-[icon=inline-start]:pl-1.5 [&_svg:not([class*='size-'])]:size-3.5",
lg: "h-9 min-w-9 px-2.5 has-data-[icon=inline-end]:pr-2 has-data-[icon=inline-start]:pl-2",
},
@@ -33,13 +30,7 @@ function Toggle({
size = "default",
...props
}: TogglePrimitive.Props & VariantProps) {
- return (
-
- )
+ return
}
export { Toggle, toggleVariants }
diff --git a/src/components/ui/tooltip.tsx b/src/components/ui/tooltip.tsx
deleted file mode 100644
index b64148d..0000000
--- a/src/components/ui/tooltip.tsx
+++ /dev/null
@@ -1,66 +0,0 @@
-"use client"
-
-import { Tooltip as TooltipPrimitive } from "@base-ui/react/tooltip"
-
-import { cn } from "@/lib/utils/shadcn"
-
-function TooltipProvider({
- delay = 0,
- ...props
-}: TooltipPrimitive.Provider.Props) {
- return (
-
- )
-}
-
-function Tooltip({ ...props }: TooltipPrimitive.Root.Props) {
- return
-}
-
-function TooltipTrigger({ ...props }: TooltipPrimitive.Trigger.Props) {
- return
-}
-
-function TooltipContent({
- className,
- side = "top",
- sideOffset = 4,
- align = "center",
- alignOffset = 0,
- children,
- ...props
-}: TooltipPrimitive.Popup.Props &
- Pick<
- TooltipPrimitive.Positioner.Props,
- "align" | "alignOffset" | "side" | "sideOffset"
- >) {
- return (
-
-
-
- {children}
-
-
-
-
- )
-}
-
-export { Tooltip, TooltipTrigger, TooltipContent, TooltipProvider }
diff --git a/src/components/user-select.tsx b/src/components/user-select.tsx
deleted file mode 100644
index 68b2a14..0000000
--- a/src/components/user-select.tsx
+++ /dev/null
@@ -1,112 +0,0 @@
-"use client"
-
-import { Search, X } from "lucide-react"
-import { useState } from "react"
-import { toast } from "sonner"
-import { fmtUser } from "@/lib/utils/telegram"
-import { getUserInfo, searchUserInfo } from "@/server/actions/users"
-import type { TgUser } from "@/server/trpc/types"
-import { Button } from "./ui/button"
-import { Input } from "./ui/input"
-import { Label } from "./ui/label"
-import { ToggleGroup, ToggleGroupItem } from "./ui/toggle-group"
-
-type Props = {
- onUser(user: TgUser): void
- onReset(): void
-}
-
-export function UserSelect({ onUser, onReset }: Props) {
- const [user, setUser] = useState(null)
- const [searchType, setSearchType] = useState<"username" | "id">("username")
- const [username, setUsername] = useState("")
- const [id, setId] = useState("")
-
- async function search() {
- const user = searchType === "username" ? await searchUserInfo(username) : await getUserInfo(parseInt(id, 10))
- if (!user) return toast.error(`User with this ${searchType === "id" ? "ID" : "username"} not found`)
- setUser(user)
- onUser(user)
- return
- }
-
- async function reset() {
- setUser(null)
- setUsername("")
- setId("")
- onReset()
- }
-
- async function submit(e: React.FormEvent) {
- e.preventDefault()
- await search()
- }
-
- return (
-
-
-
Search User by
-
v[0] && setSearchType(v[0] as "username" | "id")}
- >
-
- @ Username
-
-
- # ID
-
-
-
-
-
-
{user ? fmtUser(user) : ""}
-
- )
-}
diff --git a/src/constants.ts b/src/constants.ts
deleted file mode 100644
index b0d438f..0000000
--- a/src/constants.ts
+++ /dev/null
@@ -1,4 +0,0 @@
-export const COOKIES = {
- SIDEBAR_OPEN: "sidebar_open",
- SIDEBAR_CATEGORY_STATE: "sidebar_category_state",
-} as const
diff --git a/src/env.ts b/src/env.ts
deleted file mode 100644
index dfb523b..0000000
--- a/src/env.ts
+++ /dev/null
@@ -1,43 +0,0 @@
-import { createEnv } from "@t3-oss/env-nextjs"
-import { z } from "zod"
-
-export const env = createEnv({
- /**
- * Specify your server-side environment variables schema here. This way you can ensure the app
- * isn't built with invalid env vars.
- */
- server: {
- BACKEND_URL: z.string().default("http://localhost:3000"),
- ADMIN_ORG_EMAIL: z.string().describe("Email address of admin Azure account."),
- NODE_ENV: z.enum(["development", "test", "production"]).default("development"),
- },
-
- /**
- * Specify your client-side environment variables schema here. This way you can ensure the app
- * isn't built with invalid env vars. To expose them to the client, prefix them with
- * `NEXT_PUBLIC_`.
- */
- client: {
- // NEXT_PUBLIC_CLIENTVAR: z.string(),
- },
-
- /**
- * You can't destruct `process.env` as a regular object in the Next.js edge runtimes (e.g.
- * middlewares) or client-side so we need to destruct manually.
- */
- runtimeEnv: {
- ADMIN_ORG_EMAIL: process.env.ADMIN_ORG_EMAIL,
- BACKEND_URL: process.env.BACKEND_URL,
- NODE_ENV: process.env.NODE_ENV,
- },
- /**
- * Run `build` or `dev` with `SKIP_ENV_VALIDATION` to skip env validation. This is especially
- * useful for Docker builds.
- */
- skipValidation: !!process.env.SKIP_ENV_VALIDATION,
- /**
- * Makes it so that empty strings are treated as undefined. `SOME_VAR: z.string()` and
- * `SOME_VAR=''` will throw an error.
- */
- emptyStringAsUndefined: true,
-})
diff --git a/src/hooks/use-cookie-storage.tsx b/src/hooks/use-cookie-storage.tsx
deleted file mode 100644
index a6339cc..0000000
--- a/src/hooks/use-cookie-storage.tsx
+++ /dev/null
@@ -1,49 +0,0 @@
-import { type Dispatch, type SetStateAction, useCallback, useMemo, useState } from "react"
-import { type CookieOptions, deleteCookie, getCookie, getDefaultCookieOptions, setCookie } from "@/utils/cookies"
-
-export function useCookieStorage(
- key: string,
- initialValue: T,
- options: CookieOptions = {}
-): [T, Dispatch>] {
- const envOptions = useMemo(() => getDefaultCookieOptions(), [])
- const mergedOptions = useMemo(() => ({ ...envOptions, ...options }), [options, envOptions])
-
- const readValue = useCallback((): T => {
- if (typeof document === "undefined") {
- return initialValue
- }
-
- try {
- const item = getCookie(key)
- return item ? (JSON.parse(item) as T) : initialValue
- } catch (error) {
- console.warn(`Error reading cookie "${key}":`, error)
- return initialValue
- }
- }, [key, initialValue])
-
- const [storedValue, setStoredValue] = useState(readValue)
-
- const setValue: Dispatch> = useCallback(
- (value) => {
- try {
- const valueToStore = value instanceof Function ? value(storedValue) : value
- setStoredValue(valueToStore)
-
- if (typeof document !== "undefined") {
- if (valueToStore === null || valueToStore === undefined) {
- deleteCookie(key, { path: mergedOptions.path, domain: mergedOptions.domain })
- } else {
- setCookie(key, JSON.stringify(valueToStore), mergedOptions)
- }
- }
- } catch (error) {
- console.warn(`Error setting cookie "${key}":`, error)
- }
- },
- [key, storedValue, mergedOptions]
- )
-
- return [storedValue, setValue]
-}
diff --git a/src/hooks/use-local-storage.tsx b/src/hooks/use-local-storage.tsx
deleted file mode 100644
index 7c4209e..0000000
--- a/src/hooks/use-local-storage.tsx
+++ /dev/null
@@ -1,31 +0,0 @@
-import { useCallback, useEffect, useState } from "react"
-
-type Return = {
- data: T | null | undefined
- update: (newData: T) => void
- remove: () => void
-}
-
-export function useLocalStorage(key: string): Return {
- const [data, setData] = useState()
-
- useEffect(() => {
- const saved = window.localStorage.getItem(key)
- setData(saved ? (JSON.parse(saved) as T) : null)
- }, [key])
-
- const update = useCallback(
- (newData: T) => {
- setData(newData)
- localStorage.setItem(key, JSON.stringify(newData))
- },
- [key]
- )
-
- const remove = useCallback(() => {
- setData(null)
- localStorage.removeItem(key)
- }, [key])
-
- return { data, update, remove }
-}
diff --git a/src/hooks/use-mobile.ts b/src/hooks/use-mobile.ts
deleted file mode 100644
index 2b0fe1d..0000000
--- a/src/hooks/use-mobile.ts
+++ /dev/null
@@ -1,19 +0,0 @@
-import * as React from "react"
-
-const MOBILE_BREAKPOINT = 768
-
-export function useIsMobile() {
- const [isMobile, setIsMobile] = React.useState(undefined)
-
- React.useEffect(() => {
- const mql = window.matchMedia(`(max-width: ${MOBILE_BREAKPOINT - 1}px)`)
- const onChange = () => {
- setIsMobile(window.innerWidth < MOBILE_BREAKPOINT)
- }
- mql.addEventListener("change", onChange)
- setIsMobile(window.innerWidth < MOBILE_BREAKPOINT)
- return () => mql.removeEventListener("change", onChange)
- }, [])
-
- return !!isMobile
-}
diff --git a/src/hooks/use-mobile.tsx b/src/hooks/use-mobile.tsx
deleted file mode 100644
index 2b0fe1d..0000000
--- a/src/hooks/use-mobile.tsx
+++ /dev/null
@@ -1,19 +0,0 @@
-import * as React from "react"
-
-const MOBILE_BREAKPOINT = 768
-
-export function useIsMobile() {
- const [isMobile, setIsMobile] = React.useState(undefined)
-
- React.useEffect(() => {
- const mql = window.matchMedia(`(max-width: ${MOBILE_BREAKPOINT - 1}px)`)
- const onChange = () => {
- setIsMobile(window.innerWidth < MOBILE_BREAKPOINT)
- }
- mql.addEventListener("change", onChange)
- setIsMobile(window.innerWidth < MOBILE_BREAKPOINT)
- return () => mql.removeEventListener("change", onChange)
- }, [])
-
- return !!isMobile
-}
diff --git a/src/hooks/use-session-storage.tsx b/src/hooks/use-session-storage.tsx
deleted file mode 100644
index b1de618..0000000
--- a/src/hooks/use-session-storage.tsx
+++ /dev/null
@@ -1,39 +0,0 @@
-import { type Dispatch, type SetStateAction, useCallback, useState } from "react"
-
-export function useSessionStorage(key: string, initialValue: T): [T, Dispatch>] {
- // Read from sessionStorage on initialization
- const readValue = useCallback((): T => {
- if (typeof window === "undefined") {
- return initialValue
- }
-
- try {
- const item = window.sessionStorage.getItem(key)
- return item ? (JSON.parse(item) as T) : initialValue
- } catch (error) {
- console.warn(`Error reading sessionStorage key "${key}":`, error)
- return initialValue
- }
- }, [key, initialValue])
-
- const [storedValue, setStoredValue] = useState(readValue)
-
- // Return a memoized setter function
- const setValue: Dispatch> = useCallback(
- (value) => {
- try {
- const valueToStore = value instanceof Function ? value(storedValue) : value
- setStoredValue(valueToStore)
-
- if (typeof window !== "undefined") {
- window.sessionStorage.setItem(key, JSON.stringify(valueToStore))
- }
- } catch (error) {
- console.warn(`Error setting sessionStorage key "${key}":`, error)
- }
- },
- [key, storedValue]
- )
-
- return [storedValue, setValue]
-}
diff --git a/src/index.css b/src/index.css
deleted file mode 100644
index 40bce93..0000000
--- a/src/index.css
+++ /dev/null
@@ -1,181 +0,0 @@
-@import "tailwindcss";
-@import "tw-animate-css";
-@import "shadcn/tailwind.css";
-
-@plugin "tailwindcss-animate";
-@plugin "tailwind-scrollbar" {
- preferredstrategy: "pseudoelements";
- nocompatible: true;
-}
-
-@custom-variant dark (&:is(.dark *));
-@layer base {
- * {
- @apply border-border;
- }
- body {
- @apply bg-background text-foreground;
- }
-}
-
-:root {
- --background: oklch(0.99 0 264.54);
- --foreground: oklch(0.31 0.06 255.87);
- --card: oklch(0.99 0 264.54);
- --card-foreground: oklch(0.31 0.06 255.87);
- --popover: oklch(1 0 0);
- --popover-foreground: oklch(0.36 0.08 255.16);
- --primary: oklch(0.4659 0.1551 257.42);
- --primary-foreground: oklch(1 0 0);
- --secondary: oklch(0.88 0.04 259.29);
- --secondary-foreground: oklch(0.35 0.07 255.46);
- --muted: oklch(0.92 0.02 256.73);
- --muted-foreground: oklch(0.6306 0.0324 255.03);
- --placeholder: oklch(0.7374 0.0489 255.03);
- --accent: oklch(0.91 0.03 258.37);
- --accent-foreground: oklch(0.3 0.09 256.65);
- --destructive: oklch(0.51 0.19 27.08);
- --destructive-foreground: oklch(1 0 0);
- --border: oklch(0.89 0.04 254.88);
- --input: oklch(0.88 0.02 254.92);
- --ring: oklch(0.57 0.18 257.25);
- --chart-1: oklch(0.59 0.18 256.99);
- --chart-2: oklch(0.39 0.23 268.12);
- --chart-3: oklch(0.38 0.04 226.15);
- --chart-4: oklch(0.83 0.12 88.35);
- --chart-5: oklch(0.78 0.13 59);
- --sidebar: oklch(0.93 0.02 255.54);
- --sidebar-foreground: oklch(0.4659 0.1551 257.42);
- --sidebar-primary: oklch(0.4 0.03 285.2);
- --sidebar-primary-foreground: oklch(0.97 0.01 278.64);
- --sidebar-accent: oklch(0.95 0.02 255.53);
- --sidebar-accent-foreground: oklch(0.44 0.14 257.11);
- --sidebar-border: oklch(0.93 0 286.32);
- --sidebar-ring: oklch(0.4659 0.1551 257.42);
- --font-sans: Poppins, sans-serif;
- --font-serif: Libre Baskerville, serif;
- --font-mono: Space Mono, monospace;
- --radius: 0.6rem;
- --shadow-2xs: 0 1.5px 10px 0px hsl(213.91 86.47% 26.08% / 0.07);
- --shadow-xs: 0 1.5px 10px 0px hsl(213.91 86.47% 26.08% / 0.07);
- --shadow-sm: 0 1.5px 10px 0px hsl(213.91 86.47% 26.08% / 0.15), 0 1px 2px -1px hsl(213.91 86.47% 26.08% / 0.15);
- --shadow: 0 1.5px 10px 0px hsl(213.91 86.47% 26.08% / 0.15), 0 1px 2px -1px hsl(213.91 86.47% 26.08% / 0.15);
- --shadow-md: 0 1.5px 10px 0px hsl(213.91 86.47% 26.08% / 0.15), 0 2px 4px -1px hsl(213.91 86.47% 26.08% / 0.15);
- --shadow-lg: 0 1.5px 10px 0px hsl(213.91 86.47% 26.08% / 0.15), 0 4px 6px -1px hsl(213.91 86.47% 26.08% / 0.15);
- --shadow-xl: 0 1.5px 10px 0px hsl(213.91 86.47% 26.08% / 0.15), 0 8px 10px -1px hsl(213.91 86.47% 26.08% / 0.15);
- --shadow-2xl: 0 1.5px 10px 0px hsl(213.91 86.47% 26.08% / 0.38);
-}
-
-.dark {
- --background: oklch(0.19 0.03 256.45);
- --foreground: oklch(0.88 0.03 277.2);
- --card: oklch(0.24 0.03 259.05);
- --card-foreground: oklch(0.9 0.03 255.59);
- --popover: oklch(0.26 0.03 258.31);
- --popover-foreground: oklch(0.96 0.01 278.64);
- --primary: oklch(0.4659 0.1551 257.42);
- --primary-foreground: oklch(0.93 0.03 252.46);
- --secondary: oklch(0.34 0.07 255.44);
- --secondary-foreground: oklch(0.85 0.03 275.09);
- --muted: oklch(0.3045 0.04 254.07);
- --muted-foreground: oklch(0.7077 0.04 280.47);
- --placeholder: oklch(0.5623 0.04 280.47);
- --accent: oklch(0.35 0.04 254.63);
- --accent-foreground: oklch(0.96 0.01 292.8);
- --destructive: oklch(0.61 0.19 27.08);
- --destructive-foreground: oklch(1 0 0);
- --border: oklch(0.35 0.04 254.63);
- --input: oklch(0.3961 0.03 259.05);
- --ring: oklch(0.4659 0.1551 257.42);
- --chart-1: oklch(0.49 0.12 267.94);
- --chart-2: oklch(0.56 0.19 306.86);
- --chart-3: oklch(0.72 0.15 58.79);
- --chart-4: oklch(0.66 0.2 335.4);
- --chart-5: oklch(0.76 0.12 214.15);
- --sidebar: oklch(0.24 0.03 259.05);
- --sidebar-foreground: oklch(0.82 0.02 256.74);
- --sidebar-primary: oklch(0.4659 0.1551 257.42);
- --sidebar-primary-foreground: oklch(0.96 0.01 278.64);
- --sidebar-accent: oklch(0.3 0.03 254.37);
- --sidebar-accent-foreground: oklch(0.96 0.01 292.8);
- --sidebar-border: oklch(0.35 0.04 254.63);
- --sidebar-ring: oklch(0.4659 0.1551 257.42);
- --font-sans: Poppins, sans-serif;
- --font-serif: Libre Baskerville, serif;
- --font-mono: Space Mono, monospace;
- --radius: 0.6rem;
- --shadow-2xs: 0 1.5px 10px 0px hsl(0 0% 0% / 0.07);
- --shadow-xs: 0 1.5px 10px 0px hsl(0 0% 0% / 0.07);
- --shadow-sm: 0 1.5px 10px 0px hsl(0 0% 0% / 0.15), 0 1px 2px -1px hsl(0 0% 0% / 0.15);
- --shadow: 0 1.5px 10px 0px hsl(0 0% 0% / 0.15), 0 1px 2px -1px hsl(0 0% 0% / 0.15);
- --shadow-md: 0 1.5px 10px 0px hsl(0 0% 0% / 0.15), 0 2px 4px -1px hsl(0 0% 0% / 0.15);
- --shadow-lg: 0 1.5px 10px 0px hsl(0 0% 0% / 0.15), 0 4px 6px -1px hsl(0 0% 0% / 0.15);
- --shadow-xl: 0 1.5px 10px 0px hsl(0 0% 0% / 0.15), 0 8px 10px -1px hsl(0 0% 0% / 0.15);
- --shadow-2xl: 0 1.5px 10px 0px hsl(0 0% 0% / 0.38);
-}
-@theme inline {
- --color-background: var(--background);
- --color-foreground: var(--foreground);
- --color-card: var(--card);
- --color-card-foreground: var(--card-foreground);
- --color-popover: var(--popover);
- --color-popover-foreground: var(--popover-foreground);
- --color-primary: var(--primary);
- --color-primary-foreground: var(--primary-foreground);
- --color-secondary: var(--secondary);
- --color-secondary-foreground: var(--secondary-foreground);
- --color-muted: var(--muted);
- --color-muted-foreground: var(--muted-foreground);
- --color-placeholder: var(--placeholder);
- --color-accent: var(--accent);
- --color-accent-foreground: var(--accent-foreground);
- --color-destructive: var(--destructive);
- --color-destructive-foreground: var(--destructive-foreground);
- --color-border: var(--border);
- --color-input: var(--input);
- --color-ring: var(--ring);
- --color-chart-1: var(--chart-1);
- --color-chart-2: var(--chart-2);
- --color-chart-3: var(--chart-3);
- --color-chart-4: var(--chart-4);
- --color-chart-5: var(--chart-5);
- --color-sidebar: var(--sidebar);
- --color-sidebar-foreground: var(--sidebar-foreground);
- --color-sidebar-primary: var(--sidebar-primary);
- --color-sidebar-primary-foreground: var(--sidebar-primary-foreground);
- --color-sidebar-accent: var(--sidebar-accent);
- --color-sidebar-accent-foreground: var(--sidebar-accent-foreground);
- --color-sidebar-border: var(--sidebar-border);
- --color-sidebar-ring: var(--sidebar-ring);
-
- --font-sans: var(--font-sans);
- --font-mono: var(--font-mono);
- --font-serif: var(--font-serif);
-
- --radius-sm: calc(var(--radius) - 4px);
- --radius-md: calc(var(--radius) - 2px);
- --radius-lg: var(--radius);
- --radius-xl: calc(var(--radius) + 4px);
-
- --shadow-2xs: var(--shadow-2xs);
- --shadow-xs: var(--shadow-xs);
- --shadow-sm: var(--shadow-sm);
- --shadow: var(--shadow);
- --shadow-md: var(--shadow-md);
- --shadow-lg: var(--shadow-lg);
- --shadow-xl: var(--shadow-xl);
- --shadow-2xl: var(--shadow-2xl);
- --font-heading: var(--font-sans);
- --radius-2xl: calc(var(--radius) * 1.8);
- --radius-3xl: calc(var(--radius) * 2.2);
- --radius-4xl: calc(var(--radius) * 2.6);
-}
-
-@theme {
- --breakpoint-xs: 30rem;
-}
-
-@utility container {
- margin-inline: auto;
- @apply pb-8 flex flex-col items-start justify-start gap-6;
-}
diff --git a/src/lib/auth.ts b/src/lib/auth.ts
index f00cd8e..d01a5fc 100644
--- a/src/lib/auth.ts
+++ b/src/lib/auth.ts
@@ -2,21 +2,15 @@ import { passkeyClient } from "@better-auth/passkey/client"
import { AUTH_PATH, type TelegramPlugin } from "@polinetwork/backend"
import type { BetterAuthClientPlugin } from "better-auth"
import { emailOTPClient } from "better-auth/client/plugins"
-import { nextCookies } from "better-auth/next-js"
import { createAuthClient } from "better-auth/react"
-import { getBaseUrl } from "./utils"
-const telegramPlugin = () => {
- return {
- id: "telegram",
- $InferServerPlugin: {} as ReturnType,
- } satisfies BetterAuthClientPlugin
-}
+const telegramPlugin = () =>
+ ({ id: "telegram", $InferServerPlugin: {} as ReturnType }) satisfies BetterAuthClientPlugin
export const auth = createAuthClient({
- baseURL: getBaseUrl(),
+ baseURL: typeof window === "undefined" ? undefined : window.location.origin,
basePath: AUTH_PATH,
- plugins: [telegramPlugin(), emailOTPClient(), nextCookies(), passkeyClient()],
+ plugins: [telegramPlugin(), emailOTPClient(), passkeyClient()],
})
-export const { signIn, signOut, getSession, useSession } = auth
+export const { signIn, signOut, useSession } = auth
diff --git a/src/lib/table.ts b/src/lib/table.ts
new file mode 100644
index 0000000..23cf8ea
--- /dev/null
+++ b/src/lib/table.ts
@@ -0,0 +1,31 @@
+import {
+ columnFilteringFeature,
+ createFilteredRowModel,
+ createPaginatedRowModel,
+ createSortedRowModel,
+ createTableHook,
+ filterFns,
+ globalFilteringFeature,
+ rowPaginationFeature,
+ rowSortingFeature,
+ sortFns,
+ tableFeatures,
+} from "@tanstack/react-table"
+
+export const dashboardFeatures = tableFeatures({
+ columnFilteringFeature,
+ globalFilteringFeature,
+ rowSortingFeature,
+ rowPaginationFeature,
+ filteredRowModel: createFilteredRowModel(),
+ sortedRowModel: createSortedRowModel(),
+ paginatedRowModel: createPaginatedRowModel(),
+ filterFns,
+ sortFns,
+})
+
+// One v9 table factory keeps the feature set and column-helper types consistent
+// across every data table in the dashboard.
+export const { useAppTable, createAppColumnHelper } = createTableHook({
+ features: dashboardFeatures,
+})
diff --git a/src/lib/utils/shadcn.ts b/src/lib/utils.ts
similarity index 100%
rename from src/lib/utils/shadcn.ts
rename to src/lib/utils.ts
diff --git a/src/lib/utils/index.ts b/src/lib/utils/index.ts
deleted file mode 100644
index 35a3c3e..0000000
--- a/src/lib/utils/index.ts
+++ /dev/null
@@ -1,17 +0,0 @@
-export function getBaseUrl() {
- if (typeof window !== "undefined") return window.location.origin
- if (process.env.PUBLIC_URL) return process.env.PUBLIC_URL
- return `http://localhost:${process.env.PORT ?? 3000}`
-}
-
-export function getInitials(name: string): string {
- const [first, second] = name.split(" ")
- if (first?.[0] && second?.[0]) return first[0].toUpperCase() + second[0].toUpperCase()
- if (first?.[0] && !second?.[0] && first?.[1]) return first[0].toUpperCase() + first[1].toLowerCase()
-
- return name.slice(0, 2) // fallback
-}
-
-export async function wait(ms: number): Promise {
- return new Promise((res) => setTimeout(res, ms))
-}
diff --git a/src/lib/utils/telegram.ts b/src/lib/utils/telegram.ts
deleted file mode 100644
index a7741cc..0000000
--- a/src/lib/utils/telegram.ts
+++ /dev/null
@@ -1,18 +0,0 @@
-import type { TgUser } from "../../server/trpc/types"
-
-export function stripChatId(chatId: number): number {
- if (chatId > 0) return chatId
- const positive = -chatId
-
- const str = positive.toString()
- if (str.length < 13) return positive
- return parseInt(str.slice(1), 10)
-}
-
-export function fmtUser(user: TgUser, printId: boolean = true) {
- let string = user.firstName
- if (user.lastName) string += ` ${user.lastName}`
- if (user.username) string += ` @${user.username}`
- if (printId) string += ` [${user.id}]`
- return string
-}
diff --git a/src/middleware.ts b/src/middleware.ts
deleted file mode 100644
index 95fd401..0000000
--- a/src/middleware.ts
+++ /dev/null
@@ -1,14 +0,0 @@
-import { AUTH_PATH } from "@polinetwork/backend"
-import type { NextRequest } from "next/server"
-import { NextResponse } from "next/server"
-import { env } from "./env"
-
-export const config = {
- matcher: [`/api/auth/:path*`],
-}
-
-export function middleware(request: NextRequest) {
- if (request.nextUrl.pathname.startsWith(AUTH_PATH)) {
- return NextResponse.rewrite(new URL(request.nextUrl.pathname + request.nextUrl.search, env.BACKEND_URL))
- }
-}
diff --git a/src/routeTree.gen.ts b/src/routeTree.gen.ts
new file mode 100644
index 0000000..8c7a2ae
--- /dev/null
+++ b/src/routeTree.gen.ts
@@ -0,0 +1,313 @@
+/* eslint-disable */
+
+// @ts-nocheck
+
+// noinspection JSUnusedGlobalSymbols
+
+// This file was automatically generated by TanStack Router.
+// You should NOT make any changes in this file as it will be overwritten.
+// Additionally, you should also exclude this file from your linter and/or formatter to prevent it from being checked or modified.
+
+import { Route as rootRouteImport } from './routes/__root'
+import { Route as LoginRouteImport } from './routes/login'
+import { Route as DashboardRouteImport } from './routes/dashboard'
+import { Route as IndexRouteImport } from './routes/index'
+import { Route as DashboardIndexRouteImport } from './routes/dashboard/index'
+import { Route as OnboardingLinkRouteImport } from './routes/onboarding/link'
+import { Route as DashboardAccountRouteImport } from './routes/dashboard/account'
+import { Route as DashboardTelegramGroupsRouteImport } from './routes/dashboard/telegram/groups'
+import { Route as DashboardTelegramGrantsRouteImport } from './routes/dashboard/telegram/grants'
+import { Route as DashboardAzureMembersRouteImport } from './routes/dashboard/azure/members'
+import { Route as ApiAuthSplatRouteImport } from './routes/api/auth/$'
+import { Route as DashboardTelegramUsersIndexRouteImport } from './routes/dashboard/telegram/users/index'
+import { Route as DashboardTelegramUsersUserIdRouteImport } from './routes/dashboard/telegram/users/$userId'
+
+const LoginRoute = LoginRouteImport.update({
+ id: '/login',
+ path: '/login',
+ getParentRoute: () => rootRouteImport,
+} as any)
+const DashboardRoute = DashboardRouteImport.update({
+ id: '/dashboard',
+ path: '/dashboard',
+ getParentRoute: () => rootRouteImport,
+} as any)
+const IndexRoute = IndexRouteImport.update({
+ id: '/',
+ path: '/',
+ getParentRoute: () => rootRouteImport,
+} as any)
+const DashboardIndexRoute = DashboardIndexRouteImport.update({
+ id: '/',
+ path: '/',
+ getParentRoute: () => DashboardRoute,
+} as any)
+const OnboardingLinkRoute = OnboardingLinkRouteImport.update({
+ id: '/onboarding/link',
+ path: '/onboarding/link',
+ getParentRoute: () => rootRouteImport,
+} as any)
+const DashboardAccountRoute = DashboardAccountRouteImport.update({
+ id: '/account',
+ path: '/account',
+ getParentRoute: () => DashboardRoute,
+} as any)
+const DashboardTelegramGroupsRoute = DashboardTelegramGroupsRouteImport.update({
+ id: '/telegram/groups',
+ path: '/telegram/groups',
+ getParentRoute: () => DashboardRoute,
+} as any)
+const DashboardTelegramGrantsRoute = DashboardTelegramGrantsRouteImport.update({
+ id: '/telegram/grants',
+ path: '/telegram/grants',
+ getParentRoute: () => DashboardRoute,
+} as any)
+const DashboardAzureMembersRoute = DashboardAzureMembersRouteImport.update({
+ id: '/azure/members',
+ path: '/azure/members',
+ getParentRoute: () => DashboardRoute,
+} as any)
+const ApiAuthSplatRoute = ApiAuthSplatRouteImport.update({
+ id: '/api/auth/$',
+ path: '/api/auth/$',
+ getParentRoute: () => rootRouteImport,
+} as any)
+const DashboardTelegramUsersIndexRoute =
+ DashboardTelegramUsersIndexRouteImport.update({
+ id: '/telegram/users/',
+ path: '/telegram/users/',
+ getParentRoute: () => DashboardRoute,
+ } as any)
+const DashboardTelegramUsersUserIdRoute =
+ DashboardTelegramUsersUserIdRouteImport.update({
+ id: '/telegram/users/$userId',
+ path: '/telegram/users/$userId',
+ getParentRoute: () => DashboardRoute,
+ } as any)
+
+export interface FileRoutesByFullPath {
+ '/': typeof IndexRoute
+ '/dashboard': typeof DashboardRouteWithChildren
+ '/login': typeof LoginRoute
+ '/dashboard/account': typeof DashboardAccountRoute
+ '/onboarding/link': typeof OnboardingLinkRoute
+ '/dashboard/': typeof DashboardIndexRoute
+ '/api/auth/$': typeof ApiAuthSplatRoute
+ '/dashboard/azure/members': typeof DashboardAzureMembersRoute
+ '/dashboard/telegram/grants': typeof DashboardTelegramGrantsRoute
+ '/dashboard/telegram/groups': typeof DashboardTelegramGroupsRoute
+ '/dashboard/telegram/users/$userId': typeof DashboardTelegramUsersUserIdRoute
+ '/dashboard/telegram/users/': typeof DashboardTelegramUsersIndexRoute
+}
+export interface FileRoutesByTo {
+ '/': typeof IndexRoute
+ '/login': typeof LoginRoute
+ '/dashboard/account': typeof DashboardAccountRoute
+ '/onboarding/link': typeof OnboardingLinkRoute
+ '/dashboard': typeof DashboardIndexRoute
+ '/api/auth/$': typeof ApiAuthSplatRoute
+ '/dashboard/azure/members': typeof DashboardAzureMembersRoute
+ '/dashboard/telegram/grants': typeof DashboardTelegramGrantsRoute
+ '/dashboard/telegram/groups': typeof DashboardTelegramGroupsRoute
+ '/dashboard/telegram/users/$userId': typeof DashboardTelegramUsersUserIdRoute
+ '/dashboard/telegram/users': typeof DashboardTelegramUsersIndexRoute
+}
+export interface FileRoutesById {
+ __root__: typeof rootRouteImport
+ '/': typeof IndexRoute
+ '/dashboard': typeof DashboardRouteWithChildren
+ '/login': typeof LoginRoute
+ '/dashboard/account': typeof DashboardAccountRoute
+ '/onboarding/link': typeof OnboardingLinkRoute
+ '/dashboard/': typeof DashboardIndexRoute
+ '/api/auth/$': typeof ApiAuthSplatRoute
+ '/dashboard/azure/members': typeof DashboardAzureMembersRoute
+ '/dashboard/telegram/grants': typeof DashboardTelegramGrantsRoute
+ '/dashboard/telegram/groups': typeof DashboardTelegramGroupsRoute
+ '/dashboard/telegram/users/$userId': typeof DashboardTelegramUsersUserIdRoute
+ '/dashboard/telegram/users/': typeof DashboardTelegramUsersIndexRoute
+}
+export interface FileRouteTypes {
+ fileRoutesByFullPath: FileRoutesByFullPath
+ fullPaths:
+ | '/'
+ | '/dashboard'
+ | '/login'
+ | '/dashboard/account'
+ | '/onboarding/link'
+ | '/dashboard/'
+ | '/api/auth/$'
+ | '/dashboard/azure/members'
+ | '/dashboard/telegram/grants'
+ | '/dashboard/telegram/groups'
+ | '/dashboard/telegram/users/$userId'
+ | '/dashboard/telegram/users/'
+ fileRoutesByTo: FileRoutesByTo
+ to:
+ | '/'
+ | '/login'
+ | '/dashboard/account'
+ | '/onboarding/link'
+ | '/dashboard'
+ | '/api/auth/$'
+ | '/dashboard/azure/members'
+ | '/dashboard/telegram/grants'
+ | '/dashboard/telegram/groups'
+ | '/dashboard/telegram/users/$userId'
+ | '/dashboard/telegram/users'
+ id:
+ | '__root__'
+ | '/'
+ | '/dashboard'
+ | '/login'
+ | '/dashboard/account'
+ | '/onboarding/link'
+ | '/dashboard/'
+ | '/api/auth/$'
+ | '/dashboard/azure/members'
+ | '/dashboard/telegram/grants'
+ | '/dashboard/telegram/groups'
+ | '/dashboard/telegram/users/$userId'
+ | '/dashboard/telegram/users/'
+ fileRoutesById: FileRoutesById
+}
+export interface RootRouteChildren {
+ IndexRoute: typeof IndexRoute
+ DashboardRoute: typeof DashboardRouteWithChildren
+ LoginRoute: typeof LoginRoute
+ OnboardingLinkRoute: typeof OnboardingLinkRoute
+ ApiAuthSplatRoute: typeof ApiAuthSplatRoute
+}
+
+declare module '@tanstack/react-router' {
+ interface FileRoutesByPath {
+ '/login': {
+ id: '/login'
+ path: '/login'
+ fullPath: '/login'
+ preLoaderRoute: typeof LoginRouteImport
+ parentRoute: typeof rootRouteImport
+ }
+ '/dashboard': {
+ id: '/dashboard'
+ path: '/dashboard'
+ fullPath: '/dashboard'
+ preLoaderRoute: typeof DashboardRouteImport
+ parentRoute: typeof rootRouteImport
+ }
+ '/': {
+ id: '/'
+ path: '/'
+ fullPath: '/'
+ preLoaderRoute: typeof IndexRouteImport
+ parentRoute: typeof rootRouteImport
+ }
+ '/dashboard/': {
+ id: '/dashboard/'
+ path: '/'
+ fullPath: '/dashboard/'
+ preLoaderRoute: typeof DashboardIndexRouteImport
+ parentRoute: typeof DashboardRoute
+ }
+ '/onboarding/link': {
+ id: '/onboarding/link'
+ path: '/onboarding/link'
+ fullPath: '/onboarding/link'
+ preLoaderRoute: typeof OnboardingLinkRouteImport
+ parentRoute: typeof rootRouteImport
+ }
+ '/dashboard/account': {
+ id: '/dashboard/account'
+ path: '/account'
+ fullPath: '/dashboard/account'
+ preLoaderRoute: typeof DashboardAccountRouteImport
+ parentRoute: typeof DashboardRoute
+ }
+ '/dashboard/telegram/groups': {
+ id: '/dashboard/telegram/groups'
+ path: '/telegram/groups'
+ fullPath: '/dashboard/telegram/groups'
+ preLoaderRoute: typeof DashboardTelegramGroupsRouteImport
+ parentRoute: typeof DashboardRoute
+ }
+ '/dashboard/telegram/grants': {
+ id: '/dashboard/telegram/grants'
+ path: '/telegram/grants'
+ fullPath: '/dashboard/telegram/grants'
+ preLoaderRoute: typeof DashboardTelegramGrantsRouteImport
+ parentRoute: typeof DashboardRoute
+ }
+ '/dashboard/azure/members': {
+ id: '/dashboard/azure/members'
+ path: '/azure/members'
+ fullPath: '/dashboard/azure/members'
+ preLoaderRoute: typeof DashboardAzureMembersRouteImport
+ parentRoute: typeof DashboardRoute
+ }
+ '/api/auth/$': {
+ id: '/api/auth/$'
+ path: '/api/auth/$'
+ fullPath: '/api/auth/$'
+ preLoaderRoute: typeof ApiAuthSplatRouteImport
+ parentRoute: typeof rootRouteImport
+ }
+ '/dashboard/telegram/users/': {
+ id: '/dashboard/telegram/users/'
+ path: '/telegram/users'
+ fullPath: '/dashboard/telegram/users/'
+ preLoaderRoute: typeof DashboardTelegramUsersIndexRouteImport
+ parentRoute: typeof DashboardRoute
+ }
+ '/dashboard/telegram/users/$userId': {
+ id: '/dashboard/telegram/users/$userId'
+ path: '/telegram/users/$userId'
+ fullPath: '/dashboard/telegram/users/$userId'
+ preLoaderRoute: typeof DashboardTelegramUsersUserIdRouteImport
+ parentRoute: typeof DashboardRoute
+ }
+ }
+}
+
+interface DashboardRouteChildren {
+ DashboardAccountRoute: typeof DashboardAccountRoute
+ DashboardIndexRoute: typeof DashboardIndexRoute
+ DashboardAzureMembersRoute: typeof DashboardAzureMembersRoute
+ DashboardTelegramGrantsRoute: typeof DashboardTelegramGrantsRoute
+ DashboardTelegramGroupsRoute: typeof DashboardTelegramGroupsRoute
+ DashboardTelegramUsersUserIdRoute: typeof DashboardTelegramUsersUserIdRoute
+ DashboardTelegramUsersIndexRoute: typeof DashboardTelegramUsersIndexRoute
+}
+
+const DashboardRouteChildren: DashboardRouteChildren = {
+ DashboardAccountRoute: DashboardAccountRoute,
+ DashboardIndexRoute: DashboardIndexRoute,
+ DashboardAzureMembersRoute: DashboardAzureMembersRoute,
+ DashboardTelegramGrantsRoute: DashboardTelegramGrantsRoute,
+ DashboardTelegramGroupsRoute: DashboardTelegramGroupsRoute,
+ DashboardTelegramUsersUserIdRoute: DashboardTelegramUsersUserIdRoute,
+ DashboardTelegramUsersIndexRoute: DashboardTelegramUsersIndexRoute,
+}
+
+const DashboardRouteWithChildren = DashboardRoute._addFileChildren(
+ DashboardRouteChildren,
+)
+
+const rootRouteChildren: RootRouteChildren = {
+ IndexRoute: IndexRoute,
+ DashboardRoute: DashboardRouteWithChildren,
+ LoginRoute: LoginRoute,
+ OnboardingLinkRoute: OnboardingLinkRoute,
+ ApiAuthSplatRoute: ApiAuthSplatRoute,
+}
+export const routeTree = rootRouteImport
+ ._addFileChildren(rootRouteChildren)
+ ._addFileTypes()
+
+import type { getRouter } from './router.tsx'
+import type { createStart } from '@tanstack/react-start'
+declare module '@tanstack/react-start' {
+ interface Register {
+ ssr: true
+ router: Awaited>
+ }
+}
diff --git a/src/router.tsx b/src/router.tsx
new file mode 100644
index 0000000..40bb359
--- /dev/null
+++ b/src/router.tsx
@@ -0,0 +1,18 @@
+import { createRouter } from "@tanstack/react-router"
+import { routeTree } from "./routeTree.gen"
+
+export function getRouter() {
+ return createRouter({
+ routeTree,
+ defaultPreload: "intent",
+ defaultPreloadStaleTime: 0,
+ defaultPendingMs: 100,
+ scrollRestoration: true,
+ })
+}
+
+declare module "@tanstack/react-router" {
+ interface Register {
+ router: ReturnType
+ }
+}
diff --git a/src/routes/__root.tsx b/src/routes/__root.tsx
new file mode 100644
index 0000000..4732c43
--- /dev/null
+++ b/src/routes/__root.tsx
@@ -0,0 +1,36 @@
+import { createRootRoute, HeadContent, Scripts } from "@tanstack/react-router"
+import { Toaster } from "../components/ui/sonner"
+import appCss from "../styles.css?url"
+
+export const Route = createRootRoute({
+ head: () => ({
+ meta: [
+ { charSet: "utf-8" },
+ { name: "viewport", content: "width=device-width, initial-scale=1" },
+ { title: "PoliNetwork Admin" },
+ { name: "description", content: "PoliNetwork's internal operations console." },
+ ],
+ links: [{ rel: "stylesheet", href: appCss }],
+ }),
+ shellComponent: RootDocument,
+})
+
+function RootDocument({ children }: { children: React.ReactNode }) {
+ return (
+
+
+
+
+
+
+ {children}
+
+
+
+
+ )
+}
diff --git a/src/routes/api/auth/$.ts b/src/routes/api/auth/$.ts
new file mode 100644
index 0000000..492acb8
--- /dev/null
+++ b/src/routes/api/auth/$.ts
@@ -0,0 +1,25 @@
+import { AUTH_PATH } from "@polinetwork/backend"
+import { createFileRoute } from "@tanstack/react-router"
+
+export const Route = createFileRoute("/api/auth/$")({
+ server: {
+ handlers: {
+ GET: proxyAuth,
+ POST: proxyAuth,
+ PUT: proxyAuth,
+ PATCH: proxyAuth,
+ DELETE: proxyAuth,
+ },
+ },
+})
+
+async function proxyAuth({ request }: { request: Request }) {
+ const incomingUrl = new URL(request.url)
+ const backendOrigin = process.env.BACKEND_URL ?? "http://localhost:3000"
+ const backendUrl = new URL(
+ `${AUTH_PATH}${incomingUrl.pathname.slice(AUTH_PATH.length)}${incomingUrl.search}`,
+ backendOrigin
+ )
+
+ return fetch(new Request(backendUrl, request))
+}
diff --git a/src/routes/dashboard.tsx b/src/routes/dashboard.tsx
new file mode 100644
index 0000000..b940b0f
--- /dev/null
+++ b/src/routes/dashboard.tsx
@@ -0,0 +1,17 @@
+import { createFileRoute, redirect } from "@tanstack/react-router"
+import { DashboardFrame } from "@/components/dashboard-frame"
+import { getCurrentSession } from "@/server/api.functions"
+
+export const Route = createFileRoute("/dashboard")({
+ beforeLoad: async () => {
+ const session = await getCurrentSession()
+ if (!session?.user) throw redirect({ to: "/login" })
+ return { session }
+ },
+ component: DashboardLayout,
+})
+
+function DashboardLayout() {
+ const { session } = Route.useRouteContext()
+ return
+}
diff --git a/src/routes/dashboard/account.tsx b/src/routes/dashboard/account.tsx
new file mode 100644
index 0000000..fa66695
--- /dev/null
+++ b/src/routes/dashboard/account.tsx
@@ -0,0 +1,473 @@
+import { createFileRoute, useRouter } from "@tanstack/react-router"
+import {
+ Calendar,
+ Camera,
+ KeyRound,
+ LoaderCircle,
+ LogOut,
+ Mail,
+ MonitorSmartphone,
+ Shield,
+ Trash2,
+ UserRound,
+} from "lucide-react"
+import { useCallback, useEffect, useRef, useState } from "react"
+import { Avatar, AvatarFallback, AvatarImage } from "@/components/ui/avatar"
+import { Badge } from "@/components/ui/badge"
+import { Button } from "@/components/ui/button"
+import { Card, CardContent, CardDescription, CardHeader, CardTitle } from "@/components/ui/card"
+import { Field, FieldGroup, FieldLabel } from "@/components/ui/field"
+import { Input } from "@/components/ui/input"
+import { Separator } from "@/components/ui/separator"
+import { Skeleton } from "@/components/ui/skeleton"
+import { auth, useSession } from "@/lib/auth"
+import { cn } from "@/lib/utils"
+import type { AdminSession } from "@/server/api.functions"
+import { uploadProfilePicture } from "@/server/api.functions"
+
+type Passkey = { id: string; name?: string | null; createdAt?: Date | string; deviceType?: string }
+type ActiveSession = {
+ id: string
+ token: string
+ userAgent?: string | null
+ ipAddress?: string | null
+ createdAt?: Date | string
+}
+
+export const Route = createFileRoute("/dashboard/account")({ component: Account })
+
+function avatarText(name?: string | null, email?: string) {
+ return (name || email || "U")
+ .split(/[\s.@_-]+/)
+ .slice(0, 2)
+ .map((part) => part[0]?.toUpperCase())
+ .join("")
+}
+
+function Account() {
+ const router = useRouter()
+ const initial = Route.useRouteContext().session as AdminSession
+ const sessionQuery = useSession()
+ const session = (sessionQuery.data as AdminSession | null) ?? initial
+ const user = session.user
+ const fileInput = useRef(null)
+ const [name, setName] = useState(user?.name ?? "")
+ const [passkeys, setPasskeys] = useState([])
+ const [sessions, setSessions] = useState([])
+ const [securityLoading, setSecurityLoading] = useState(true)
+ const [busy, setBusy] = useState(null)
+ const [notice, setNotice] = useState<{ type: "success" | "error"; text: string } | null>(null)
+
+ const refreshSecurityData = useCallback(async () => {
+ try {
+ const [passkeyResult, sessionResult] = await Promise.all([auth.passkey.listUserPasskeys(), auth.listSessions()])
+ setPasskeys((passkeyResult.data ?? []) as Passkey[])
+ setSessions((sessionResult.data ?? []) as ActiveSession[])
+ } finally {
+ setSecurityLoading(false)
+ }
+ }, [])
+
+ useEffect(() => {
+ void refreshSecurityData()
+ }, [refreshSecurityData])
+ useEffect(() => setName(user?.name ?? ""), [user?.name])
+
+ async function updateName(event: React.FormEvent) {
+ event.preventDefault()
+ setBusy("name")
+ setNotice(null)
+ const result = await auth.updateUser({ name: name.trim() })
+ if (result.error) setNotice({ type: "error", text: result.error.message ?? "Could not update your name." })
+ else {
+ await sessionQuery.refetch()
+ setNotice({ type: "success", text: "Profile name updated." })
+ }
+ setBusy(null)
+ }
+
+ async function uploadImage(file?: File) {
+ if (!file) return
+ setNotice(null)
+ if (file.size > 1024 * 1024 || !["image/png", "image/jpeg"].includes(file.type)) {
+ setNotice({ type: "error", text: "Use a PNG or JPEG image smaller than 1 MB." })
+ return
+ }
+ setBusy("image")
+ const formData = new FormData()
+ formData.set("image", file)
+ try {
+ await uploadProfilePicture({ data: formData })
+ await sessionQuery.refetch()
+ setNotice({ type: "success", text: "Profile picture updated." })
+ } catch {
+ setNotice({ type: "error", text: "Could not update your profile picture." })
+ }
+ setBusy(null)
+ }
+
+ async function removeImage() {
+ setBusy("image")
+ setNotice(null)
+ const result = await auth.updateUser({ image: null })
+ if (result.error) setNotice({ type: "error", text: result.error.message ?? "Could not remove the picture." })
+ else {
+ await sessionQuery.refetch()
+ setNotice({ type: "success", text: "Profile picture removed." })
+ }
+ setBusy(null)
+ }
+
+ async function addPasskey() {
+ setBusy("passkey")
+ setNotice(null)
+ const result = await auth.passkey.addPasskey({ name: `Passkey ${passkeys.length + 1}` })
+ if (result.error) setNotice({ type: "error", text: result.error.message ?? "Could not create the passkey." })
+ else {
+ await refreshSecurityData()
+ setNotice({ type: "success", text: "Passkey created." })
+ }
+ setBusy(null)
+ }
+
+ async function deletePasskey(id: string) {
+ setBusy(id)
+ setNotice(null)
+ const result = await auth.passkey.deletePasskey({ id })
+ if (result.error) setNotice({ type: "error", text: result.error.message ?? "Could not delete the passkey." })
+ else {
+ await refreshSecurityData()
+ setNotice({ type: "success", text: "Passkey deleted." })
+ }
+ setBusy(null)
+ }
+
+ async function revokeOtherSessions() {
+ setBusy("sessions")
+ setNotice(null)
+ const result = await auth.revokeOtherSessions()
+ if (result.error) setNotice({ type: "error", text: result.error.message ?? "Could not revoke other sessions." })
+ else {
+ await refreshSecurityData()
+ setNotice({ type: "success", text: "Other sessions signed out." })
+ }
+ setBusy(null)
+ }
+
+ async function logout() {
+ setBusy("logout")
+ await auth.signOut()
+ await router.invalidate()
+ await router.navigate({ to: "/login", replace: true })
+ }
+
+ return (
+
+
+
+ OPERATOR PROFILE
+
+ Manage your profile and authentication methods.
+
+ {notice && (
+
+ {notice.text}
+
+ )}
+
+
+
+
+
+ {user?.image && }
+
+ {avatarText(user?.name, user?.email)}
+
+
+
fileInput.current?.click()}
+ disabled={busy === "image"}
+ aria-label="Upload profile picture"
+ >
+
+
+
void uploadImage(event.target.files?.[0])}
+ />
+
+
+
{user?.name || "Complete your profile"}
+
{user?.email}
+
+ {user?.telegramUsername
+ ? `@${user.telegramUsername}`
+ : user?.telegramId
+ ? `Telegram ID ${user.telegramId}`
+ : "Telegram not linked"}
+
+
+ {user?.image && (
+ void removeImage()}
+ disabled={busy === "image"}
+ >
+ Remove picture
+
+ )}
+
+
+
+
+
+
+
+
+ Profile details
+ Displayed throughout the admin console.
+
+
+
+
+
+
+
+
+
+
+
+ Telegram identity
+ Used to determine roles and permissions.
+
+
+
+
+
+
Username
+ {user?.telegramUsername ? `@${user.telegramUsername}` : "Not available"}
+
+
+
Telegram ID
+ {user?.telegramId ?? "Not linked"}
+
+
+
+
+
+
+
+
+
+
+ Passkeys
+
+ Phishing-resistant access from your trusted devices.
+
+
+
+ void addPasskey()}
+ disabled={busy === "passkey"}
+ >
+ Add passkey
+
+
+
+ {securityLoading ? (
+
+ ) : (
+
+ {passkeys.map((passkey) => (
+
+ Added{" "}
+ {passkey.createdAt ? new Date(passkey.createdAt).toLocaleDateString() : "recently"}
+ {passkey.deviceType ? ` · ${passkey.deviceType}` : ""}
+ >
+ }
+ action={
+ void deletePasskey(passkey.id)}
+ disabled={busy === passkey.id}
+ aria-label="Delete passkey"
+ >
+
+
+ }
+ />
+ ))}
+ {!passkeys.length && (
+ No passkeys registered yet.
+ )}
+
+ )}
+
+
+
+
+
+
+
+
+ Active sessions
+
+ Devices currently signed in to your account.
+
+
+
+ {sessions.length > 1 && (
+ void revokeOtherSessions()}
+ disabled={busy === "sessions"}
+ >
+ Sign out other sessions
+
+ )}
+
+
+ {securityLoading ? (
+
+ ) : (
+
+ {sessions.map((activeSession) => (
+
+ {activeSession.ipAddress || "Unknown IP"}
+ {activeSession.createdAt
+ ? ` · Since ${new Date(activeSession.createdAt).toLocaleDateString()}`
+ : ""}
+ >
+ }
+ action={
+ activeSession.id === session.session?.id ? (
+ Current
+ ) : undefined
+ }
+ />
+ ))}
+
+ )}
+
+ void logout()}
+ disabled={busy === "logout"}
+ >
+ Sign out of this device
+
+
+
+
+
+ )
+}
+
+function SecurityList({ children }: { children: React.ReactNode }) {
+ return {children}
+}
+
+function SecurityLoading({ rows }: { rows: number }) {
+ return (
+
+ {Array.from({ length: rows }, (_, index) => (
+
+ ))}
+
+ )
+}
+
+function SecurityItem({
+ icon: Icon,
+ title,
+ description,
+ action,
+}: {
+ icon: typeof KeyRound
+ title: string
+ description: React.ReactNode
+ action?: React.ReactNode
+}) {
+ return (
+
+
+
+
+
+
{title}
+
{description}
+
+ {action}
+
+ )
+}
diff --git a/src/routes/dashboard/azure/members.tsx b/src/routes/dashboard/azure/members.tsx
new file mode 100644
index 0000000..b8cc3dd
--- /dev/null
+++ b/src/routes/dashboard/azure/members.tsx
@@ -0,0 +1,417 @@
+import { createFileRoute, useRouter } from "@tanstack/react-router"
+import type { Column } from "@tanstack/react-table"
+import { ArrowDown, ArrowUp, Building2, Check, ChevronsUpDown, LoaderCircle, UsersRound } from "lucide-react"
+import { useEffect, useMemo, useState } from "react"
+import { DataToolbar } from "@/components/data-toolbar"
+import { EmptyState } from "@/components/empty-state"
+import { LiveStatus } from "@/components/live-status"
+import { DataPageSkeleton } from "@/components/loading-skeleton"
+import { Pagination } from "@/components/pagination"
+import { Badge } from "@/components/ui/badge"
+import { Button } from "@/components/ui/button"
+import {
+ Dialog,
+ DialogContent,
+ DialogDescription,
+ DialogFooter,
+ DialogHeader,
+ DialogTitle,
+} from "@/components/ui/dialog"
+import { Field, FieldGroup, FieldLabel } from "@/components/ui/field"
+import { Input } from "@/components/ui/input"
+import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow } from "@/components/ui/table"
+import { createAppColumnHelper, type dashboardFeatures, useAppTable } from "@/lib/table"
+import { cn } from "@/lib/utils"
+import { createAzureMember, getAzureMembers, setAzureMemberNumber } from "@/server/api.functions"
+
+type AzureMember = {
+ id: string
+ employeeId?: string | null
+ displayName?: string | null
+ mail?: string | null
+ isMember?: boolean
+ assignedLicensesIds?: string[]
+}
+const memberColumnHelper = createAppColumnHelper()
+type MemberFilter = { query: string; membersOnly: boolean }
+
+export const Route = createFileRoute("/dashboard/azure/members")({
+ loader: () => getAzureMembers(),
+ pendingComponent: () => ,
+ component: AzureMembers,
+})
+
+function AzureMembers() {
+ const response = Route.useLoaderData()
+ const router = useRouter()
+ const [dialog, setDialog] = useState<{ mode: "create" } | { mode: "edit"; member: AzureMember } | null>(null)
+ const loadedMembers = response.data as AzureMember[]
+ const [members, setMembers] = useState(loadedMembers)
+
+ useEffect(() => setMembers(loadedMembers), [loadedMembers])
+
+ const columns = useMemo(() => {
+ const header = (
+ label: string,
+ column: Pick, "getIsSorted" | "getToggleSortingHandler">
+ ) => {
+ const sorted = column.getIsSorted()
+ const Icon = !sorted ? ChevronsUpDown : sorted === "asc" ? ArrowUp : ArrowDown
+ return (
+
+ {label}
+
+
+ )
+ }
+ return memberColumnHelper.columns([
+ memberColumnHelper.accessor((member) => member.employeeId ?? undefined, {
+ id: "employeeId",
+ header: ({ column }) => header("Member ID", column),
+ sortUndefined: "last",
+ sortFn: (rowA, rowB, columnId) => {
+ const a = Number(rowA.getValue(columnId))
+ const b = Number(rowB.getValue(columnId))
+ return a - b
+ },
+ cell: ({ getValue }) => getValue() ?? "—",
+ }),
+ memberColumnHelper.accessor("displayName", {
+ header: ({ column }) => header("Member", column),
+ cell: ({ row }) => {
+ const member = row.original
+ return (
+
+
+ {member.displayName?.[0] ?? "?"}
+
+
+ {member.displayName ?? "Unnamed member"}
+ {member.isMember && (
+ Association member
+ )}
+
+
+ )
+ },
+ }),
+ memberColumnHelper.accessor("mail", {
+ header: ({ column }) => header("Email", column),
+ cell: ({ getValue }) =>
+ getValue() ?? Not assigned ,
+ }),
+ memberColumnHelper.accessor((member) => member.assignedLicensesIds?.length ?? 0, {
+ id: "licenses",
+ header: ({ column }) => header("Licenses", column),
+ cell: ({ row }) => (
+
+ {row.original.assignedLicensesIds?.length ? (
+ row.original.assignedLicensesIds.map((license) => (
+
+ {license.replaceAll("_", " ")}
+
+ ))
+ ) : (
+ No licenses
+ )}
+
+ ),
+ }),
+ memberColumnHelper.display({
+ id: "actions",
+ header: "",
+ cell: ({ row }) => (
+ setDialog({ mode: "edit", member: row.original })}
+ >
+ Manage
+
+ ),
+ }),
+ ])
+ }, [])
+ const table = useAppTable({
+ key: "azure-members",
+ columns,
+ data: members,
+ initialState: {
+ sorting: [{ id: "employeeId", desc: false }],
+ pagination: { pageIndex: 0, pageSize: 25 },
+ globalFilter: { query: "", membersOnly: false },
+ },
+ autoResetPageIndex: false,
+ globalFilterFn: (row, _columnId, value) => {
+ const filter = (value ?? {}) as Partial
+ const member = row.original
+ return (
+ (!filter.membersOnly || !!member.isMember) &&
+ `${member.displayName ?? ""} ${member.mail ?? ""} ${member.employeeId ?? ""}`
+ .toLocaleLowerCase()
+ .includes((filter.query ?? "").toLocaleLowerCase())
+ )
+ },
+ })
+ const memberFilter = table.state.globalFilter as MemberFilter
+ const membersOnly = memberFilter.membersOnly
+
+ return (
+
+
table.setGlobalFilter({ ...memberFilter, query: value })}
+ action="Add member"
+ onAction={() => setDialog({ mode: "create" })}
+ >
+ table.setGlobalFilter({ ...memberFilter, membersOnly: !membersOnly })}
+ >
+ Members only
+
+
+
+
+
+
+
+ {members.filter((member) => member.isMember).length} association members
+
+
+
+
+
+
+ {members.filter((member) => member.assignedLicensesIds?.includes("OFFICE_365")).length}
+ {" "}
+ Office 365 licenses
+
+
+
+ {table.getFilteredRowModel().rows.length ? (
+
+
+
+ {table.getHeaderGroups().map((headerGroup) => (
+
+ {headerGroup.headers.map((header) => (
+
+ {header.isPlaceholder ? null : }
+
+ ))}
+
+ ))}
+
+
+ {table.getRowModel().rows.map((row) => (
+
+ {row.getAllCells().map((cell) => (
+
+
+
+ ))}
+
+ ))}
+
+
+
+ ) : (
+
+ )}
+ {table.getFilteredRowModel().rows.length > 0 && (
+
table.setPageIndex(page - 1)}
+ onPageSizeChange={(pageSize) => table.setPageSize(pageSize)}
+ />
+ )}
+ {dialog && (
+ setDialog(null)}
+ onOptimisticUpdate={(member) => {
+ const previous = members.find((current) => current.id === member.id)
+ setMembers((current) => current.map((item) => (item.id === member.id ? member : item)))
+ return () => {
+ if (previous) setMembers((current) => current.map((item) => (item.id === member.id ? previous : item)))
+ }
+ }}
+ onSaved={async (mode) => {
+ setDialog(null)
+ if (mode === "create") {
+ await new Promise((resolve) => setTimeout(resolve, 1500))
+ await router.invalidate({ sync: true })
+ }
+ }}
+ />
+ )}
+
+ )
+}
+
+function MemberDialog({
+ dialog,
+ onClose,
+ onOptimisticUpdate,
+ onSaved,
+}: {
+ dialog: { mode: "create" } | { mode: "edit"; member: AzureMember }
+ onClose: () => void
+ onOptimisticUpdate: (member: AzureMember) => () => void
+ onSaved: (mode: "create" | "edit") => Promise
+}) {
+ const editing = dialog.mode === "edit"
+ const [firstName, setFirstName] = useState("")
+ const [lastName, setLastName] = useState("")
+ const [email, setEmail] = useState("")
+ const [memberId, setMemberId] = useState(editing ? (dialog.member.employeeId ?? "") : "")
+ const [pending, setPending] = useState(false)
+ const [error, setError] = useState("")
+
+ async function submit(event: React.FormEvent) {
+ event.preventDefault()
+ setPending(true)
+ setError("")
+ const assocNumber = Number.parseInt(memberId, 10)
+ let rollback: (() => void) | undefined
+ try {
+ if (editing) {
+ rollback = onOptimisticUpdate({ ...dialog.member, employeeId: String(assocNumber), isMember: true })
+ await setAzureMemberNumber({ data: { userId: dialog.member.id, assocNumber } })
+ await onSaved("edit")
+ } else {
+ await createAzureMember({ data: { firstName, lastName, assocNumber, sendEmailTo: email } })
+ await onSaved("create")
+ }
+ } catch {
+ rollback?.()
+ setError("The member could not be saved. Check the values and your permissions.")
+ setPending(false)
+ }
+ }
+
+ return (
+ {
+ if (!open) onClose()
+ }}
+ >
+
+
+
+ AZURE DIRECTORY
+
+
+ {editing ? "Set member ID" : "Create a member"}
+
+
+ {editing
+ ? "Update the association number linked to this directory account."
+ : "Create a member association and send a welcome email."}
+
+
+
+
+
+ )
+}
diff --git a/src/routes/dashboard/index.tsx b/src/routes/dashboard/index.tsx
new file mode 100644
index 0000000..82c5000
--- /dev/null
+++ b/src/routes/dashboard/index.tsx
@@ -0,0 +1,118 @@
+import { createFileRoute, Link } from "@tanstack/react-router"
+import { ArrowUpRight, CheckCircle2, Database, ShieldCheck, UsersRound } from "lucide-react"
+import { cn } from "@/lib/utils"
+
+const actionCards = [
+ {
+ title: "Review member directory",
+ text: "Update association numbers and licenses.",
+ to: "/dashboard/azure/members",
+ icon: UsersRound,
+ },
+ {
+ title: "Manage access grants",
+ text: "Check active and scheduled Telegram grants.",
+ to: "/dashboard/telegram/grants",
+ icon: ShieldCheck,
+ },
+ {
+ title: "Browse Telegram groups",
+ text: "Inspect group metadata and visibility settings.",
+ to: "/dashboard/telegram/groups",
+ icon: Database,
+ },
+] as const
+
+export const Route = createFileRoute("/dashboard/")({ component: Overview })
+
+function Overview() {
+ return (
+
+
+
+
+ OPERATIONS CONTROL ROOM
+
+
+ Everything in order.
+
+ Nothing overlooked.
+
+
+ A focused workspace for the people who keep PoliNetwork’s communities, access and membership data moving.
+
+
+
+ Workspace ready for review
+ Last sync — just now
+
+
+
+ {Array.from({ length: 6 }, (_, index) => (
+
+ ))}
+
+
+
+
+
+
+ START HERE
+
+
Choose an operational area
+
+
+ Every workspace is scoped to your administrator role.
+
+
+
+ {actionCards.map(({ title, text, to, icon: Icon }, index) => (
+
+
+
+
+
+ {title}
+ {text}
+
+
+
+ ))}
+
+
+ )
+}
+
+function Metric({ value, label, note }: { value: string; label: string; note: string }) {
+ return (
+
+ {value}
+
+
+ )
+}
diff --git a/src/routes/dashboard/telegram/grants.tsx b/src/routes/dashboard/telegram/grants.tsx
new file mode 100644
index 0000000..cf3254f
--- /dev/null
+++ b/src/routes/dashboard/telegram/grants.tsx
@@ -0,0 +1,174 @@
+import { createFileRoute } from "@tanstack/react-router"
+import { CalendarClock } from "lucide-react"
+import { useState } from "react"
+import { DataToolbar } from "@/components/data-toolbar"
+import { EmptyState } from "@/components/empty-state"
+import { LiveStatus } from "@/components/live-status"
+import { DataPageSkeleton } from "@/components/loading-skeleton"
+import { Pagination } from "@/components/pagination"
+import { Badge } from "@/components/ui/badge"
+import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow } from "@/components/ui/table"
+import { ToggleGroup, ToggleGroupItem } from "@/components/ui/toggle-group"
+import { createAppColumnHelper, useAppTable } from "@/lib/table"
+import { getOngoingGrants, getScheduledGrants } from "@/server/api.functions"
+
+type Grant = {
+ userId: number
+ grantorId?: number
+ role?: string
+ createdAt?: string
+ expiresAt?: string | null
+ scheduledAt?: string | null
+}
+const grantColumnHelper = createAppColumnHelper()
+export const Route = createFileRoute("/dashboard/telegram/grants")({
+ loader: async () => ({ ongoing: await getOngoingGrants(), scheduled: await getScheduledGrants() }),
+ pendingComponent: () => ,
+ component: Grants,
+})
+
+function Grants() {
+ const { ongoing, scheduled } = Route.useLoaderData()
+ const [tab, setTab] = useState<"all" | "ongoing" | "scheduled">("all")
+ const ongoingGrants = (ongoing.data as { grants?: Grant[] }).grants ?? []
+ const scheduledGrants = (scheduled.data as { grants?: Grant[] }).grants ?? []
+ const grants =
+ tab === "ongoing" ? ongoingGrants : tab === "scheduled" ? scheduledGrants : [...ongoingGrants, ...scheduledGrants]
+ const connected = ongoing.connected && scheduled.connected
+ const columns = grantColumnHelper.columns([
+ grantColumnHelper.accessor("userId", { header: "User", cell: ({ getValue }) => getValue() }),
+ grantColumnHelper.accessor("role", {
+ header: "Role",
+ cell: ({ getValue }) => (
+
+ {getValue() ?? "Access grant"}
+
+ ),
+ }),
+ grantColumnHelper.accessor("grantorId", { header: "Granted by", cell: ({ getValue }) => getValue() ?? "—" }),
+ grantColumnHelper.display({
+ id: "schedule",
+ header: "Schedule",
+ cell: ({ row }) => row.original.scheduledAt ?? row.original.createdAt ?? "—",
+ }),
+ grantColumnHelper.display({
+ id: "status",
+ header: "Status",
+ cell: ({ row }) => (
+
+ {row.original.scheduledAt ? "Scheduled" : "Active"}
+
+ ),
+ }),
+ ])
+ const table = useAppTable({
+ key: "telegram-grants",
+ columns,
+ data: grants,
+ initialState: { sorting: [{ id: "userId", desc: false }], pagination: { pageIndex: 0, pageSize: 20 } },
+ globalFilterFn: (row, _columnId, value) => {
+ const grant = row.original
+ const query = String(value ?? "")
+ .trim()
+ .toLocaleLowerCase()
+ return (
+ !query ||
+ `${grant.userId} ${grant.grantorId ?? ""} ${grant.role ?? ""} ${grant.scheduledAt ?? ""} ${grant.createdAt ?? ""}`
+ .toLocaleLowerCase()
+ .includes(query)
+ )
+ },
+ })
+ return (
+
+
table.setGlobalFilter(value)}
+ action="New grant"
+ />
+
+ {
+ const next = value[0]
+ if (next === "all" || next === "ongoing" || next === "scheduled") setTab(next)
+ }}
+ className="my-1"
+ aria-label="Grant status"
+ >
+
+ All {ongoingGrants.length + scheduledGrants.length}
+
+
+ Ongoing {ongoingGrants.length}
+
+
+ Scheduled {scheduledGrants.length}
+
+
+ {table.getFilteredRowModel().rows.length ? (
+
+
+
+ {table.getHeaderGroups().map((headerGroup) => (
+
+ {headerGroup.headers.map((header) => (
+
+ {header.isPlaceholder ? null : }
+
+ ))}
+
+ ))}
+
+
+ {table.getRowModel().rows.map((row) => (
+
+ {row.getAllCells().map((cell) => (
+
+
+
+ ))}
+
+ ))}
+
+
+
+ ) : (
+
+ )}
+ {table.getFilteredRowModel().rows.length > 0 && (
+ table.setPageIndex(page - 1)}
+ onPageSizeChange={(pageSize) => table.setPageSize(pageSize)}
+ />
+ )}
+
+ )
+}
diff --git a/src/routes/dashboard/telegram/groups.tsx b/src/routes/dashboard/telegram/groups.tsx
new file mode 100644
index 0000000..6bb367c
--- /dev/null
+++ b/src/routes/dashboard/telegram/groups.tsx
@@ -0,0 +1,218 @@
+import { createFileRoute, useRouter } from "@tanstack/react-router"
+import { Eye, EyeOff, MessageCircleMore } from "lucide-react"
+import { useEffect, useMemo, useState } from "react"
+import { DataToolbar } from "@/components/data-toolbar"
+import { EmptyState } from "@/components/empty-state"
+import { LiveStatus } from "@/components/live-status"
+import { DataPageSkeleton } from "@/components/loading-skeleton"
+import { Pagination } from "@/components/pagination"
+import { Alert, AlertDescription } from "@/components/ui/alert"
+import { Badge } from "@/components/ui/badge"
+import { Button } from "@/components/ui/button"
+import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow } from "@/components/ui/table"
+import { createAppColumnHelper, useAppTable } from "@/lib/table"
+import { cn } from "@/lib/utils"
+import { getTelegramGroups, setGroupVisibility } from "@/server/api.functions"
+
+type TelegramGroup = {
+ telegramId: number
+ title: string
+ tag?: string | null
+ link?: string | null
+ inviteLink?: string | null
+ hide?: boolean | null
+}
+
+const groupColumnHelper = createAppColumnHelper()
+
+export const Route = createFileRoute("/dashboard/telegram/groups")({
+ loader: () => getTelegramGroups(),
+ pendingComponent: () => ,
+ component: TelegramGroups,
+})
+
+function TelegramGroups() {
+ const response = Route.useLoaderData()
+ const router = useRouter()
+ const loadedGroups = response.data as TelegramGroup[]
+ const [groups, setGroups] = useState(loadedGroups)
+ const [updatingId, setUpdatingId] = useState(null)
+ const [mutationError, setMutationError] = useState("")
+
+ useEffect(() => setGroups(loadedGroups), [loadedGroups])
+
+ async function toggleVisibility(group: TelegramGroup) {
+ if (updatingId !== null) return
+ const hide = !group.hide
+ setUpdatingId(group.telegramId)
+ setMutationError("")
+ setGroups((current) => current.map((item) => (item.telegramId === group.telegramId ? { ...item, hide } : item)))
+
+ try {
+ await setGroupVisibility({ data: { telegramId: group.telegramId, hide } })
+ await router.invalidate({ sync: true })
+ } catch {
+ setGroups((current) => current.map((item) => (item.telegramId === group.telegramId ? group : item)))
+ setMutationError("The visibility setting could not be updated. Check your permissions and try again.")
+ } finally {
+ setUpdatingId(null)
+ }
+ }
+
+ const columns = useMemo(
+ () =>
+ groupColumnHelper.columns([
+ groupColumnHelper.accessor("title", {
+ header: "Group",
+ cell: ({ row }) => (
+
+
+
+
+ {row.original.title}
+
+ ),
+ }),
+ groupColumnHelper.accessor("telegramId", { header: "Telegram ID", cell: ({ getValue }) => getValue() }),
+ groupColumnHelper.accessor("tag", {
+ header: "Tag",
+ cell: ({ getValue }) =>
+ getValue() ? (
+
+ @{getValue()}
+
+ ) : (
+ —
+ ),
+ }),
+ groupColumnHelper.display({
+ id: "visibility",
+ header: "Visibility",
+ cell: ({ row }) => {
+ const group = row.original
+ const pending = updatingId === group.telegramId
+ return (
+ void toggleVisibility(group)}
+ title="Toggle group visibility"
+ >
+ {group.hide ? (
+ <>
+ Hidden
+ >
+ ) : (
+ <>
+ Visible
+ >
+ )}
+
+ )
+ },
+ }),
+ groupColumnHelper.display({
+ id: "invite",
+ header: "Invite",
+ cell: ({ row }) => {
+ const link = row.original.link ?? row.original.inviteLink
+ return link ? (
+
+ Open link
+
+ ) : (
+ Not shared
+ )
+ },
+ }),
+ ]),
+ [updatingId]
+ )
+ const table = useAppTable({
+ key: "telegram-groups",
+ columns,
+ data: groups,
+ initialState: { sorting: [{ id: "title", desc: false }], pagination: { pageIndex: 0, pageSize: 20 } },
+ globalFilterFn: (row, _columnId, value) => {
+ const group = row.original
+ const query = String(value ?? "")
+ .trim()
+ .toLocaleLowerCase()
+ .replace(/^@/, "")
+ return !query || `${group.title}\u0000${group.tag ?? ""}`.toLocaleLowerCase().includes(query)
+ },
+ })
+
+ return (
+
+
table.setGlobalFilter(value)}
+ />
+
+ {mutationError && (
+
+ {mutationError}
+
+ )}
+ {table.getFilteredRowModel().rows.length ? (
+ <>
+
+
+
+ {table.getHeaderGroups().map((headerGroup) => (
+
+ {headerGroup.headers.map((header) => (
+
+ {header.isPlaceholder ? null : }
+
+ ))}
+
+ ))}
+
+
+ {table.getRowModel().rows.map((row) => (
+
+ {row.getAllCells().map((cell) => (
+
+
+
+ ))}
+
+ ))}
+
+
+
+ table.setPageIndex(page - 1)}
+ onPageSizeChange={(pageSize) => table.setPageSize(pageSize)}
+ />
+ >
+ ) : (
+
+ )}
+
+ )
+}
diff --git a/src/routes/dashboard/telegram/users/$userId.tsx b/src/routes/dashboard/telegram/users/$userId.tsx
new file mode 100644
index 0000000..f972a43
--- /dev/null
+++ b/src/routes/dashboard/telegram/users/$userId.tsx
@@ -0,0 +1,423 @@
+import { Combobox } from "@base-ui/react/combobox"
+import { createFileRoute, Link, useRouter } from "@tanstack/react-router"
+import {
+ ArrowLeft,
+ CalendarClock,
+ Check,
+ ChevronDown,
+ ExternalLink,
+ History,
+ LoaderCircle,
+ MessageCircle,
+ ShieldCheck,
+ UserPlus,
+ UserRound,
+ UsersRound,
+} from "lucide-react"
+import { useEffect, useState } from "react"
+import { LiveStatus } from "@/components/live-status"
+import { DetailPageSkeleton } from "@/components/loading-skeleton"
+import { Badge } from "@/components/ui/badge"
+import { Button } from "@/components/ui/button"
+import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card"
+import {
+ Dialog,
+ DialogContent,
+ DialogDescription,
+ DialogFooter,
+ DialogHeader,
+ DialogTitle,
+} from "@/components/ui/dialog"
+import { Field, FieldLabel } from "@/components/ui/field"
+import { addTelegramGroupAdmin, getTelegramUserDetails } from "@/server/api.functions"
+
+export const Route = createFileRoute("/dashboard/telegram/users/$userId")({
+ loader: ({ params }) => getTelegramUserDetails({ data: { userId: Number.parseInt(params.userId, 10) } }),
+ pendingComponent: DetailPageSkeleton,
+ component: UserProfile,
+})
+
+function formatDate(value: Date | string | null | undefined) {
+ if (!value) return "—"
+ return new Intl.DateTimeFormat(undefined, { dateStyle: "medium", timeStyle: "short" }).format(new Date(value))
+}
+
+function messageLink(chatId: number, messageId: number) {
+ return `https://t.me/c/${String(chatId).replace("-100", "")}/${messageId}`
+}
+
+function UserProfile() {
+ const response = Route.useLoaderData()
+ const { userId } = Route.useParams()
+ const router = useRouter()
+ const [adminDialogOpen, setAdminDialogOpen] = useState(false)
+ const data = Array.isArray(response.data) ? null : response.data
+
+ if (!data) {
+ return (
+
+
+
+
+
+
+ User not found
+ No Telegram user exists with ID {userId}.
+
+
+
+ )
+ }
+
+ const { user, roles, groupAdmin, groups, messages, audits, grant } = data
+ const displayName = [user.firstName, user.lastName].filter(Boolean).join(" ") || "Unnamed account"
+
+ return (
+
+
+
+
+ {(user.firstName?.[0] ?? user.username?.[0] ?? String(user.id).slice(-2)).toUpperCase()}
+
+
+
+ TELEGRAM PROFILE · {user.id}
+
+
{displayName}
+
{user.username ? `@${user.username}` : "No Telegram username"}
+
+
+ {roles.length} role{roles.length === 1 ? "" : "s"}
+
+
+
+
+
+
+
+ {user.id}
+
+ {displayName}
+ {user.username ? `@${user.username}` : "—"}
+
+
+
+
+ {roles.length ? (
+ roles.map((role) => (
+
+ {role}
+
+ ))
+ ) : (
+ No assigned roles
+ )}
+
+
+
+ {grant ? (
+
+ {formatDate(grant.validSince)}
+ {formatDate(grant.validUntil)}
+
+ ) : (
+ No ongoing grant
+ )}
+
+
+
+
setAdminDialogOpen(true)}
+ >
+ Add group
+
+ }
+ >
+
+ {groupAdmin
+ .filter((entry) => entry !== null)
+ .map((entry) => (
+
+
+ {entry.group.title}
+ {entry.group.id}
+
+ Added by {entry.addedBy.firstName}
+ {entry.addedBy.username ? ` · @${entry.addedBy.username}` : ""}
+
+
+
+ ))}
+ {!groupAdmin.length &&
}
+
+
+
entry !== null).map((entry) => entry.group.id))}
+ onClose={() => setAdminDialogOpen(false)}
+ onSaved={async () => {
+ setAdminDialogOpen(false)
+ await router.invalidate({ sync: true })
+ }}
+ />
+
+
+ {messages.map((message) => (
+
+
+
+
{message.group?.title ?? `Chat ${message.chatId}`}
+ {formatDate(message.timestamp)}
+
+ {message.message}
+
+ Open message
+
+
+
+ ))}
+ {!messages.length &&
}
+
+
+
+
+ {audits.map((audit) => (
+
+
+
+
{audit.type}
+ {formatDate(audit.createdAt)}
+
+ {audit.reason ?? "No reason provided"}
+ {audit.groupTitle && (
+
+ {audit.groupTitle} · {audit.groupId}
+
+ )}
+
+
+ ))}
+ {!audits.length &&
}
+
+
+
+ )
+}
+
+function BackLink() {
+ return (
+
+ Back to users
+
+ )
+}
+
+function SummaryCard({
+ icon: Icon,
+ label,
+ children,
+}: {
+ icon: typeof UserRound
+ label: string
+ children: React.ReactNode
+}) {
+ return (
+
+
+
+
+ {label}
+
+
+ {children}
+
+ )
+}
+
+function Definition({ label, children }: { label: string; children: React.ReactNode }) {
+ return (
+
+
{label}
+ {children}
+
+ )
+}
+function SectionEmpty({ text }: { text: string }) {
+ return (
+ {text}
+ )
+}
+
+function DetailSection({
+ icon: Icon,
+ title,
+ count,
+ action,
+ children,
+}: {
+ icon: typeof UserRound
+ title: string
+ count: number
+ action?: React.ReactNode
+ children: React.ReactNode
+}) {
+ return (
+
+
+
+
+ {title}
+
+
+ {action}
+ {count}
+
+
+ {children}
+
+ )
+}
+
+function AddGroupAdminDialog({
+ open,
+ userId,
+ groups,
+ administeredGroupIds,
+ onClose,
+ onSaved,
+}: {
+ open: boolean
+ userId: number
+ groups: Array<{ telegramId: number; title: string }>
+ administeredGroupIds: Set
+ onClose: () => void
+ onSaved: () => Promise
+}) {
+ const [groupId, setGroupId] = useState("")
+ const [pending, setPending] = useState(false)
+ const [error, setError] = useState("")
+ const availableGroups = groups.filter((group) => !administeredGroupIds.has(group.telegramId))
+
+ useEffect(() => {
+ if (open) {
+ setGroupId("")
+ setError("")
+ }
+ }, [open])
+
+ async function submit(event: React.FormEvent) {
+ event.preventDefault()
+ if (!groupId) return
+ setPending(true)
+ setError("")
+ try {
+ await addTelegramGroupAdmin({ data: { userId, groupId: Number(groupId) } })
+ await onSaved()
+ } catch {
+ setError("The user could not be added as a group administrator.")
+ setPending(false)
+ }
+ }
+
+ return (
+ !nextOpen && onClose()}>
+
+
+
+ GROUP ADMINISTRATION
+
+
+ Add group administrator
+
+
+ Choose a group this user should administer.
+
+
+
+
+
+ )
+}
diff --git a/src/routes/dashboard/telegram/users/index.tsx b/src/routes/dashboard/telegram/users/index.tsx
new file mode 100644
index 0000000..2eda542
--- /dev/null
+++ b/src/routes/dashboard/telegram/users/index.tsx
@@ -0,0 +1,160 @@
+import { createFileRoute, Link } from "@tanstack/react-router"
+import { Eye, MessageCircle } from "lucide-react"
+import { useMemo } from "react"
+import { DataToolbar } from "@/components/data-toolbar"
+import { EmptyState } from "@/components/empty-state"
+import { LiveStatus } from "@/components/live-status"
+import { DataPageSkeleton } from "@/components/loading-skeleton"
+import { Pagination } from "@/components/pagination"
+import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow } from "@/components/ui/table"
+import { createAppColumnHelper, useAppTable } from "@/lib/table"
+import { getTelegramUsers } from "@/server/api.functions"
+
+type TelegramUser = {
+ id: number
+ username?: string | null
+ firstName?: string | null
+ lastName?: string | null
+ profilePicUrl?: string | null
+}
+
+const userColumnHelper = createAppColumnHelper()
+
+export const Route = createFileRoute("/dashboard/telegram/users/")({
+ loader: () => getTelegramUsers(),
+ pendingComponent: () => ,
+ component: TelegramUsers,
+})
+
+function TelegramUsers() {
+ const response = Route.useLoaderData()
+ const users = (response.data as { users?: TelegramUser[] }).users ?? []
+
+ const columns = useMemo(
+ () =>
+ userColumnHelper.columns([
+ userColumnHelper.accessor("id", {
+ header: "Telegram ID",
+ cell: ({ getValue }) => getValue(),
+ }),
+ userColumnHelper.display({
+ id: "identity",
+ header: "Identity",
+ cell: ({ row }) => {
+ const user = row.original
+ return (
+
+
+ {(user.firstName?.[0] ?? user.username?.[0] ?? "?").toUpperCase()}
+
+ {[user.firstName, user.lastName].filter(Boolean).join(" ") || "Unnamed account"}
+
+ )
+ },
+ }),
+ userColumnHelper.accessor("username", {
+ header: "Username",
+ cell: ({ getValue }) => {
+ const username = getValue()
+ return username ? (
+ @{username}
+ ) : (
+ Not set
+ )
+ },
+ }),
+ userColumnHelper.display({
+ id: "actions",
+ header: "",
+ cell: ({ row }) => (
+
+
+
+ ),
+ }),
+ ]),
+ []
+ )
+ const table = useAppTable({
+ key: "telegram-users",
+ columns,
+ data: users,
+ initialState: { pagination: { pageIndex: 0, pageSize: 25 } },
+ globalFilterFn: (row, _columnId, value) => {
+ const user = row.original
+ const query = String(value ?? "")
+ .trim()
+ .toLocaleLowerCase()
+ .replace(/^@/, "")
+ return (
+ !query ||
+ `${user.username ?? ""}\u0000${user.firstName ?? ""}\u0000${user.lastName ?? ""}`
+ .toLocaleLowerCase()
+ .includes(query)
+ )
+ },
+ })
+
+ return (
+
+
table.setGlobalFilter(value)}
+ />
+
+ {table.getFilteredRowModel().rows.length ? (
+ <>
+
+
+
+ {table.getHeaderGroups().map((headerGroup) => (
+
+ {headerGroup.headers.map((header) => (
+
+ {header.isPlaceholder ? null : }
+
+ ))}
+
+ ))}
+
+
+ {table.getRowModel().rows.map((row) => (
+
+ {row.getAllCells().map((cell) => (
+
+
+
+ ))}
+
+ ))}
+
+
+
+ table.setPageIndex(page - 1)}
+ onPageSizeChange={(pageSize) => table.setPageSize(pageSize)}
+ />
+ >
+ ) : (
+
+ )}
+
+ )
+}
diff --git a/src/routes/index.tsx b/src/routes/index.tsx
new file mode 100644
index 0000000..e753ac4
--- /dev/null
+++ b/src/routes/index.tsx
@@ -0,0 +1,7 @@
+import { createFileRoute, redirect } from "@tanstack/react-router"
+
+export const Route = createFileRoute("/")({
+ beforeLoad: () => {
+ throw redirect({ to: "/dashboard" })
+ },
+})
diff --git a/src/routes/login.tsx b/src/routes/login.tsx
new file mode 100644
index 0000000..f7c8af3
--- /dev/null
+++ b/src/routes/login.tsx
@@ -0,0 +1,228 @@
+import { createFileRoute, Link, redirect, useRouter } from "@tanstack/react-router"
+import { ArrowRight, CheckCircle2, KeyRound, LoaderCircle, Mail, ShieldCheck } from "lucide-react"
+import { useEffect, useState } from "react"
+import { toast } from "sonner"
+import logoUrl from "@/assets/logo.svg"
+import { AppMark } from "@/components/app-mark"
+import { Button } from "@/components/ui/button"
+import { Field, FieldGroup, FieldLabel } from "@/components/ui/field"
+import { Input } from "@/components/ui/input"
+import { auth } from "@/lib/auth"
+import { getCurrentSession, testBackend } from "@/server/api.functions"
+
+export const Route = createFileRoute("/login")({
+ beforeLoad: async () => {
+ if (await getCurrentSession()) throw redirect({ to: "/dashboard" })
+ },
+ component: Login,
+})
+
+function Login() {
+ const [email, setEmail] = useState("")
+ const [otp, setOtp] = useState("")
+ const [sent, setSent] = useState(false)
+ const [busy, setBusy] = useState(false)
+ const [notice, setNotice] = useState("")
+ const router = useRouter()
+
+ async function sendCode() {
+ setBusy(true)
+ setNotice("")
+ const { data, error } = await auth.emailOtp.sendVerificationOtp({ type: "sign-in", email })
+ setBusy(false)
+ if (data?.success) setSent(true)
+ else setNotice(error?.message ?? "We could not send a code. Check your email and try again.")
+ }
+
+ async function verify() {
+ setBusy(true)
+ setNotice("")
+ const { data, error } = await auth.signIn.emailOtp({ email, otp })
+ setBusy(false)
+ if (data) router.navigate({ to: "/dashboard" })
+ else setNotice(error?.message ?? "That code is not valid. Please try again.")
+ }
+
+ async function passkey() {
+ setBusy(true)
+ setNotice("")
+ const { data, error } = await auth.signIn.passkey()
+ setBusy(false)
+ if (data) router.navigate({ to: "/dashboard" })
+ else setNotice(error?.message ?? "Passkey sign in was cancelled or unavailable.")
+ }
+
+ useEffect(() => {
+ void testBackend().then((r) => {
+ if (!r) toast.error("Backend is offline or unavailable")
+ })
+ }, [])
+
+ return (
+
+
+
+
+
+ POLINETWORK ADMIN
+
+
+ The work behind
+
+ the network.
+
+
+ One protected workspace for association members, Telegram communities and the systems that connect them.
+
+
+
+ Role-aware access
+
+
+ Passkey-ready sign in
+
+
+ Auditable operations
+
+
+
+
+
+
+
+
+
+
+
+
+ SECURE ACCESS
+
+
+ {sent ? "Check your inbox" : "Welcome back"}
+
+
+ {sent ? `We sent a six-digit code to ${email}.` : "Use your PoliNetwork email or a saved passkey."}
+
+
+ {!sent ? (
+
+ ) : (
+
+ )}
+
+
+ or
+
+
+ void passkey()}
+ disabled={busy}
+ >
+ Continue with passkey
+
+ {notice && {notice}
}
+
+ Need access? Contact an existing PoliNetwork administrator.
+
+
+
+
+ © PoliNetwork APS
+
+ How access works
+
+
+
+ )
+}
diff --git a/src/routes/onboarding/link.tsx b/src/routes/onboarding/link.tsx
new file mode 100644
index 0000000..955a72d
--- /dev/null
+++ b/src/routes/onboarding/link.tsx
@@ -0,0 +1,34 @@
+import { createFileRoute, Link } from "@tanstack/react-router"
+import { ArrowRight, MessageCircle } from "lucide-react"
+import { Button } from "@/components/ui/button"
+
+export const Route = createFileRoute("/onboarding/link")({ component: LinkTelegram })
+
+function LinkTelegram() {
+ return (
+
+
+
+
+
+
+ ONE LAST STEP
+
+
Link your Telegram account
+
+ We use your Telegram identity to verify the administrative roles that grant access to this workspace.
+
+
+ Connect Telegram
+
+
}
+ >
+ Back to sign in
+
+
+
+ )
+}
diff --git a/src/server/actions/azure.ts b/src/server/actions/azure.ts
deleted file mode 100644
index 5c7594f..0000000
--- a/src/server/actions/azure.ts
+++ /dev/null
@@ -1,23 +0,0 @@
-"use server"
-
-import { requireRole } from "../auth"
-import { trpc } from "../trpc"
-import type { ApiInput } from "../trpc/types"
-
-export async function getAzureMembers() {
- return await trpc.azure.members.getAll.query()
-}
-
-export async function createAzureMember(input: ApiInput["azure"]["members"]["create"]) {
- const { allowed } = await requireRole(["owner", "direttivo", "president"])
- if (!allowed) return { error: "UNAUTHORIZED" }
-
- return await trpc.azure.members.create.mutate(input)
-}
-
-export async function setAzureMemberNumber(input: ApiInput["azure"]["members"]["setAssocNumber"]) {
- const { allowed } = await requireRole(["owner", "direttivo", "president"])
- if (!allowed) return { error: "UNAUTHORIZED" }
-
- return await trpc.azure.members.setAssocNumber.mutate(input)
-}
diff --git a/src/server/actions/grants.ts b/src/server/actions/grants.ts
deleted file mode 100644
index 07f2769..0000000
--- a/src/server/actions/grants.ts
+++ /dev/null
@@ -1,27 +0,0 @@
-"use server"
-
-import { requireRole } from "../auth"
-import { trpc } from "../trpc"
-import type { ApiInput } from "../trpc/types"
-
-export async function getUserGrant(userId: number) {
- return await trpc.tg.grants.checkUser.query({ userId })
-}
-
-export async function createGrant(input: Omit) {
- const { allowed, telegramId } = await requireRole(["owner", "direttivo", "president"])
- if (!allowed) return { success: false, error: "UNAUTHORIZED" }
-
- return await trpc.tg.grants.create.mutate({ ...input, adderId: telegramId, sendTgLog: true })
-}
-
-export async function interruptGrant(userId: number) {
- const { allowed, telegramId } = await requireRole(["owner", "direttivo", "president"])
- if (!allowed)
- return {
- success: false,
- error: "UNAUTHORIZED",
- }
-
- return await trpc.tg.grants.interrupt.mutate({ userId, interruptedById: telegramId, sendTgLog: true })
-}
diff --git a/src/server/actions/groups.ts b/src/server/actions/groups.ts
deleted file mode 100644
index f09c69e..0000000
--- a/src/server/actions/groups.ts
+++ /dev/null
@@ -1,22 +0,0 @@
-"use server"
-
-import { requireRole } from "../auth"
-import { trpc } from "../trpc"
-
-export async function searchGroup(query: string) {
- return trpc.tg.groups.search.query({ query, limit: 20, showHidden: true })
-}
-
-export async function setGroupHide(groupId: number, hide: boolean) {
- const { allowed } = await requireRole(["owner", "direttivo", "president"])
- if (!allowed) return false
-
- return trpc.tg.groups.setHide.mutate({ telegramId: groupId, hide })
-}
-
-export async function leaveChat(chatId: number) {
- const { allowed, telegramId } = await requireRole(["owner", "direttivo", "president"])
- if (!allowed) return { error: "UNAUTHORIZED" }
-
- return trpc.tg.groups.leaveChat.mutate({ chatId, performerId: telegramId })
-}
diff --git a/src/server/actions/test.ts b/src/server/actions/test.ts
deleted file mode 100644
index 3925d43..0000000
--- a/src/server/actions/test.ts
+++ /dev/null
@@ -1,6 +0,0 @@
-"use server"
-import { trpc } from "../trpc"
-
-export async function testDb() {
- return trpc.test.dbQuery.query({ dbName: "tg" })
-}
diff --git a/src/server/actions/users.ts b/src/server/actions/users.ts
deleted file mode 100644
index cb826d6..0000000
--- a/src/server/actions/users.ts
+++ /dev/null
@@ -1,77 +0,0 @@
-"use server"
-import { getServerSession, requireRole } from "../auth"
-import { trpc } from "../trpc"
-import type { ApiOutput, TgUserRole } from "../trpc/types"
-import { getUserGrant } from "./grants"
-
-export async function updateProfilePic(file: File) {
- const session = await getServerSession()
- if (!session.data) return { success: false }
-
- const fd = new FormData()
- fd.set("userId", session.data.user.id)
- fd.set("image", file)
- return await trpc.auth.updateProfilePic.mutate(fd)
-}
-
-export async function getUserInfo(userId: number) {
- return (await trpc.tg.users.get.query({ userId })).user ?? null
-}
-
-export async function getUserRoles(userId: number) {
- return await trpc.tg.permissions.getRoles.query({ userId })
-}
-
-export async function searchUserInfo(username: string) {
- return (await trpc.tg.users.getByUsername.query({ username })).user ?? null
-}
-
-export async function getUserDetails(userId: number) {
- const { user } = await trpc.tg.users.get.query({ userId: userId })
- if (!user) return null
-
- const { roles, groupAdmin } = await trpc.tg.permissions.getRoles.query({ userId: user.id })
- const { messages } = await trpc.tg.messages.getLastByUser.query({ userId: user.id, limit: 15 })
- const audits = await trpc.tg.auditLog.getById.query({ targetId: user.id })
-
- const { grant } = await getUserGrant(user.id)
- return { roles, groupAdmin, user, messages, audits, grant }
-}
-
-export async function addGroupAdmin(userId: number, groupId: number) {
- const { allowed, telegramId } = await requireRole(["owner", "direttivo", "president"])
- if (!allowed) return { error: "UNAUTHORIZED" }
-
- await trpc.tg.permissions.addGroup.mutate({ userId, adderId: telegramId, groupId })
- return { error: null }
-}
-
-export async function delGroupAdmin(
- userId: number,
- groupId: number
-): Promise {
- const { allowed, telegramId } = await requireRole(["owner", "direttivo", "president"])
- if (!allowed) return { error: "UNAUTHORIZED" }
-
- return await trpc.tg.permissions.removeGroup.mutate({ userId, removerId: telegramId, groupId })
-}
-
-export async function addUserRole(
- userId: number,
- role: TgUserRole
-): Promise {
- const { allowed, telegramId } = await requireRole(["owner", "direttivo", "president"])
- if (!allowed) return { roles: null, error: "UNAUTHORIZED" }
-
- return await trpc.tg.permissions.addRole.mutate({ userId, role, adderId: telegramId })
-}
-
-export async function delUserRole(
- userId: number,
- role: TgUserRole
-): Promise {
- const { allowed, telegramId } = await requireRole(["owner", "direttivo", "president"])
- if (!allowed) return { roles: null, error: "UNAUTHORIZED" }
-
- return await trpc.tg.permissions.removeRole.mutate({ userId, role, removerId: telegramId })
-}
diff --git a/src/server/api.functions.ts b/src/server/api.functions.ts
new file mode 100644
index 0000000..186de85
--- /dev/null
+++ b/src/server/api.functions.ts
@@ -0,0 +1,201 @@
+import { type AppRouter, AUTH_PATH, TRPC_PATH } from "@polinetwork/backend"
+import { createServerFn } from "@tanstack/react-start"
+import { getRequestHeader } from "@tanstack/react-start/server"
+import { createTRPCClient, httpBatchLink, httpLink, isNonJsonSerializable, splitLink } from "@trpc/client"
+import SuperJSON from "superjson"
+import { z } from "zod"
+
+export type BackendState = { data: T; connected: boolean; message?: string }
+
+export type AdminSession = {
+ session?: { id?: string; expiresAt?: Date | string }
+ user?: {
+ id: string
+ email?: string
+ name?: string | null
+ image?: string | null
+ telegramId?: number | null
+ telegramUsername?: string | null
+ }
+}
+
+function backendOrigin() {
+ return process.env.BACKEND_URL ?? "http://localhost:3000"
+}
+
+function requestHeaders(): Record {
+ const cookie = getRequestHeader("cookie")
+ return cookie ? { cookie } : {}
+}
+
+function client() {
+ const url = `${backendOrigin()}${TRPC_PATH}`
+ const headers = requestHeaders()
+
+ return createTRPCClient({
+ links: [
+ splitLink({
+ condition: (operation) => isNonJsonSerializable(operation.input),
+ true: httpLink({
+ url,
+ headers,
+ transformer: {
+ serialize: (data) => data,
+ deserialize: (data) => SuperJSON.deserialize(data),
+ },
+ }),
+ false: httpBatchLink({ url, headers, transformer: SuperJSON }),
+ }),
+ ],
+ })
+}
+
+export const testBackend = createServerFn().handler(async () => {
+ try {
+ await client().test.dbQuery.query({ dbName: "web" })
+ return true
+ } catch (e) {
+ console.error("Backend error: ", e)
+ return false
+ }
+})
+
+async function readSession(): Promise {
+ try {
+ const response = await fetch(new URL(`${AUTH_PATH}/get-session`, backendOrigin()), {
+ headers: requestHeaders(),
+ cache: "no-store",
+ })
+
+ if (!response.ok) return null
+ return (await response.json()) as AdminSession
+ } catch {
+ return null
+ }
+}
+
+async function requireSession() {
+ const session = await readSession()
+ if (!session?.user) throw new Error("UNAUTHORIZED")
+ return session
+}
+
+async function requireAdminRole() {
+ const session = await requireSession()
+ const telegramId = session.user?.telegramId
+ if (!telegramId) throw new Error("TELEGRAM_NOT_LINKED")
+
+ const { roles } = await client().tg.permissions.getRoles.query({ userId: telegramId })
+ if (!roles?.some((role) => ["owner", "direttivo", "president"].includes(role))) {
+ throw new Error("UNAUTHORIZED")
+ }
+
+ return { session, telegramId }
+}
+
+async function safely(request: () => Promise): Promise> {
+ try {
+ await requireSession()
+ return { data: await request(), connected: true }
+ } catch (error) {
+ const message =
+ error instanceof Error && error.message === "UNAUTHORIZED"
+ ? "Your session is no longer valid. Sign in again to load this data."
+ : "The PoliNetwork backend is currently unavailable."
+
+ return { data: [], connected: false, message }
+ }
+}
+
+export const getCurrentSession = createServerFn().handler(readSession)
+
+export const getTelegramUsers = createServerFn().handler(() => safely(() => client().tg.users.getAll.query()))
+
+export const getTelegramGroups = createServerFn().handler(() => safely(() => client().tg.groups.getAll.query()))
+
+export const getOngoingGrants = createServerFn().handler(() => safely(() => client().tg.grants.getOngoing.query()))
+
+export const getScheduledGrants = createServerFn().handler(() => safely(() => client().tg.grants.getScheduled.query()))
+
+export const getAzureMembers = createServerFn().handler(() => safely(() => client().azure.members.getAll.query()))
+
+export const getTelegramUserDetails = createServerFn()
+ .validator(z.object({ userId: z.number().int().positive() }))
+ .handler(async ({ data }) => {
+ return safely(async () => {
+ const api = client()
+ const { user } = await api.tg.users.get.query({ userId: data.userId })
+ if (!user) return null
+
+ const [permissions, messages, audits, grant] = await Promise.all([
+ api.tg.permissions.getRoles.query({ userId: user.id }),
+ api.tg.messages.getLastByUser.query({ userId: user.id, limit: 15 }),
+ api.tg.auditLog.getById.query({ targetId: user.id }),
+ api.tg.grants.checkUser.query({ userId: user.id }),
+ ])
+
+ return {
+ user,
+ roles: permissions.roles ?? [],
+ groupAdmin: permissions.groupAdmin.filter(Boolean),
+ groups: await api.tg.groups.getAll.query(),
+ messages: messages.messages ?? [],
+ audits,
+ grant: grant.grant ?? null,
+ }
+ })
+ })
+
+export const setGroupVisibility = createServerFn({ method: "POST" })
+ .validator(z.object({ telegramId: z.number().int(), hide: z.boolean() }))
+ .handler(async ({ data }) => {
+ await requireAdminRole()
+ return client().tg.groups.setHide.mutate(data)
+ })
+
+export const addTelegramGroupAdmin = createServerFn({ method: "POST" })
+ .validator(z.object({ userId: z.number().int().positive(), groupId: z.number().int() }))
+ .handler(async ({ data }) => {
+ const { telegramId } = await requireAdminRole()
+ return client().tg.permissions.addGroup.mutate({ ...data, adderId: telegramId })
+ })
+
+export const createAzureMember = createServerFn({ method: "POST" })
+ .validator(
+ z.object({
+ firstName: z.string().min(1),
+ lastName: z.string().min(1),
+ assocNumber: z.number().int().positive(),
+ sendEmailTo: z.string().email(),
+ })
+ )
+ .handler(async ({ data }) => {
+ await requireAdminRole()
+ const result = await client().azure.members.create.mutate(data)
+ if (result.error) throw new Error(result.error)
+ return result
+ })
+
+export const setAzureMemberNumber = createServerFn({ method: "POST" })
+ .validator(z.object({ userId: z.string().min(1), assocNumber: z.number().int().positive() }))
+ .handler(async ({ data }) => {
+ await requireAdminRole()
+ const result = await client().azure.members.setAssocNumber.mutate(data)
+ if (result.error) throw new Error(result.error)
+ return result
+ })
+
+export const uploadProfilePicture = createServerFn({ method: "POST", strict: false })
+ .validator((data: FormData) => data)
+ .handler(async ({ data }) => {
+ const session = await requireSession()
+ const image = data.get("image")
+ if (!(image instanceof File)) throw new Error("INVALID_IMAGE")
+ if (image.size > 1024 * 1024) throw new Error("IMAGE_TOO_LARGE")
+ if (!["image/png", "image/jpeg"].includes(image.type)) throw new Error("INVALID_IMAGE_TYPE")
+
+ const formData = new FormData()
+ formData.set("userId", session.user?.id ?? "")
+ formData.set("image", image)
+ return client().auth.updateProfilePic.mutate(formData)
+ })
diff --git a/src/server/auth/index.ts b/src/server/auth/index.ts
deleted file mode 100644
index 0c8c534..0000000
--- a/src/server/auth/index.ts
+++ /dev/null
@@ -1,23 +0,0 @@
-import { headers } from "next/headers"
-import { getSession } from "@/lib/auth"
-import { trpc } from "../trpc"
-import type { TgUserRole } from "../trpc/types"
-
-export const getServerSession = async () => {
- const session = await getSession({
- fetchOptions: {
- headers: await headers(),
- },
- })
- // console.log(session);
- return session
-}
-
-export async function requireRole(allowedRoles: TgUserRole[]) {
- const session = await getServerSession()
- const telegramId = session.data?.user.telegramId
- if (!telegramId) return { allowed: false, telegramId: 0 }
-
- const { roles } = await trpc.tg.permissions.getRoles.query({ userId: telegramId })
- return { allowed: roles?.some((s) => allowedRoles.includes(s)), telegramId }
-}
diff --git a/src/server/trpc/index.tsx b/src/server/trpc/index.tsx
deleted file mode 100644
index e53ad45..0000000
--- a/src/server/trpc/index.tsx
+++ /dev/null
@@ -1,28 +0,0 @@
-import "server-only"
-
-import { type AppRouter, TRPC_PATH } from "@polinetwork/backend"
-import { createTRPCClient, httpBatchLink, httpLink, isNonJsonSerializable, splitLink } from "@trpc/client"
-import SuperJSON from "superjson"
-import { env } from "@/env"
-
-const url = env.BACKEND_URL + TRPC_PATH
-export const trpc = createTRPCClient({
- links: [
- splitLink({
- condition: (op) => isNonJsonSerializable(op.input),
- true: httpLink({
- url,
- transformer: {
- // request - convert data before sending to the tRPC server
- serialize: (data) => data,
- // response - convert the tRPC response before using it in client
- deserialize: (data) => SuperJSON.deserialize(data), // or your other transformer
- },
- }),
- false: httpBatchLink({
- url,
- transformer: SuperJSON, // or your other transformer
- }),
- }),
- ],
-})
diff --git a/src/server/trpc/types.tsx b/src/server/trpc/types.tsx
deleted file mode 100644
index 7962e62..0000000
--- a/src/server/trpc/types.tsx
+++ /dev/null
@@ -1,13 +0,0 @@
-import type { AppRouter } from "@polinetwork/backend"
-import type { inferRouterError, inferRouterInputs, inferRouterOutputs } from "@trpc/server"
-
-export type ApiOutput = inferRouterOutputs
-export type ApiInput = inferRouterInputs
-export type ApiError = inferRouterError
-
-export type TgUser = NonNullable
-export type TgGrant = NonNullable
-export type TgGroup = NonNullable
-export type TgUserRole = NonNullable
-
-export type AzureMember = ApiOutput["azure"]["members"]["getAll"][number]
diff --git a/src/styles.css b/src/styles.css
new file mode 100644
index 0000000..10dba25
--- /dev/null
+++ b/src/styles.css
@@ -0,0 +1,324 @@
+@import url("https://fonts.googleapis.com/css2?family=DM+Mono:wght@400;500&family=DM+Sans:opsz,wght@9..40,400;9..40,500;9..40,600;9..40,700&family=Libre+Baskerville:ital,wght@0,400;0,700;1,400&display=swap");
+@import "tailwindcss";
+@import "tw-animate-css";
+@import "shadcn/tailwind.css";
+
+@custom-variant dark (&:is(.dark *));
+
+:root {
+ --ink: #0d1d36;
+ --paper: #f5f7fb;
+ --mist: #e9eef7;
+ --line: #d7deea;
+ --muted-blue: #68778f;
+ --cobalt: #1156ae;
+ --mint: #dce9fa;
+ --sky: #78adf0;
+ --orange: #d86b3f;
+ --white: #ffffff;
+ --toast-success: #18794e;
+ --toast-success-soft: #e4f7ed;
+ --toast-info: #1156ae;
+ --toast-info-soft: #e4effd;
+ --toast-warning: #a15c00;
+ --toast-warning-soft: #fff1d9;
+ --toast-error: #b7472f;
+ --toast-error-soft: #fce8e4;
+
+ --background: var(--paper);
+ --foreground: var(--ink);
+ --card: var(--white);
+ --card-foreground: var(--ink);
+ --popover: var(--white);
+ --popover-foreground: var(--ink);
+ --primary: var(--cobalt);
+ --primary-foreground: #ffffff;
+ --secondary: var(--mist);
+ --secondary-foreground: var(--ink);
+ --muted: var(--mist);
+ --muted-foreground: var(--muted-blue);
+ --accent: var(--mint);
+ --accent-foreground: var(--cobalt);
+ --destructive: #b7472f;
+ --border: var(--line);
+ --input: var(--line);
+ --ring: var(--cobalt);
+ --chart-1: var(--cobalt);
+ --chart-2: var(--sky);
+ --chart-3: var(--ink);
+ --chart-4: var(--orange);
+ --chart-5: var(--muted-blue);
+ --radius: 0.2rem;
+ --sidebar: var(--ink);
+ --sidebar-foreground: #ecf1e9;
+ --sidebar-primary: var(--sky);
+ --sidebar-primary-foreground: var(--ink);
+ --sidebar-accent: #172c4d;
+ --sidebar-accent-foreground: #ffffff;
+ --sidebar-border: rgba(255, 255, 255, 0.12);
+ --sidebar-ring: var(--sky);
+}
+
+.dark {
+ color-scheme: dark;
+ --ink: #edf2f0;
+ --paper: #0a1018;
+ --mist: #141e2b;
+ --line: #253246;
+ --muted-blue: #91a2b8;
+ --cobalt: #78adf0;
+ --mint: #1b3047;
+ --sky: #a5c9f7;
+ --orange: #ed9a70;
+ --white: #121b27;
+ --toast-success: #73d9a0;
+ --toast-success-soft: #112a24;
+ --toast-info: #a5c9f7;
+ --toast-info-soft: #13263b;
+ --toast-warning: #f3b66e;
+ --toast-warning-soft: #332516;
+ --toast-error: #ff9b86;
+ --toast-error-soft: #351d1d;
+
+ --background: var(--paper);
+ --foreground: var(--ink);
+ --card: #101925;
+ --card-foreground: var(--ink);
+ --popover: #141f2d;
+ --popover-foreground: var(--ink);
+ --primary: var(--cobalt);
+ --primary-foreground: #081321;
+ --secondary: #182434;
+ --secondary-foreground: #dbe6f2;
+ --muted: #172332;
+ --muted-foreground: var(--muted-blue);
+ --accent: #192d43;
+ --accent-foreground: var(--sky);
+ --destructive: #ff9b86;
+ --border: var(--line);
+ --input: #2a3a50;
+ --ring: var(--sky);
+ --chart-1: var(--cobalt);
+ --chart-2: var(--sky);
+ --chart-3: #dce7e3;
+ --chart-4: var(--orange);
+ --chart-5: var(--muted-blue);
+ --sidebar: #0d1723;
+ --sidebar-foreground: #e8efec;
+ --sidebar-primary: var(--sky);
+ --sidebar-primary-foreground: #081321;
+ --sidebar-accent: #17283d;
+ --sidebar-accent-foreground: #ffffff;
+ --sidebar-border: rgba(165, 201, 247, 0.16);
+ --sidebar-ring: var(--sky);
+}
+
+@theme inline {
+ --font-sans: "DM Sans", sans-serif;
+ --font-serif: "Libre Baskerville", serif;
+ --font-mono: "DM Mono", monospace;
+ --font-heading: "DM Sans", sans-serif;
+ --color-background: var(--background);
+ --color-foreground: var(--foreground);
+ --color-card: var(--card);
+ --color-card-foreground: var(--card-foreground);
+ --color-popover: var(--popover);
+ --color-popover-foreground: var(--popover-foreground);
+ --color-primary: var(--primary);
+ --color-primary-foreground: var(--primary-foreground);
+ --color-secondary: var(--secondary);
+ --color-secondary-foreground: var(--secondary-foreground);
+ --color-muted: var(--muted);
+ --color-muted-foreground: var(--muted-foreground);
+ --color-accent: var(--accent);
+ --color-accent-foreground: var(--accent-foreground);
+ --color-destructive: var(--destructive);
+ --color-border: var(--border);
+ --color-input: var(--input);
+ --color-ring: var(--ring);
+ --color-sidebar: var(--sidebar);
+ --color-sidebar-foreground: var(--sidebar-foreground);
+ --color-sidebar-primary: var(--sidebar-primary);
+ --color-sidebar-primary-foreground: var(--sidebar-primary-foreground);
+ --color-sidebar-accent: var(--sidebar-accent);
+ --color-sidebar-accent-foreground: var(--sidebar-accent-foreground);
+ --color-sidebar-border: var(--sidebar-border);
+ --color-sidebar-ring: var(--sidebar-ring);
+}
+
+@layer base {
+ * {
+ @apply border-border;
+ }
+
+ html {
+ @apply scroll-smooth;
+ }
+
+ body {
+ @apply min-w-80 bg-background font-sans text-foreground antialiased;
+ font-synthesis: none;
+ }
+
+ [data-sonner-toaster] {
+ --normal-bg: var(--card);
+ --normal-text: var(--foreground);
+ --normal-border: var(--line);
+ }
+
+ [data-sonner-toast].sonner-toast {
+ border: 1px solid var(--line);
+ border-radius: 0.45rem;
+ box-shadow: 0 12px 30px rgb(0 0 0 / 22%);
+ font-family: "DM Sans", sans-serif;
+ }
+
+ [data-sonner-toast][data-type="success"] {
+ background: var(--toast-success-soft);
+ border-color: color-mix(in srgb, var(--toast-success) 28%, var(--card));
+ color: var(--toast-success);
+ }
+
+ [data-sonner-toast][data-type="info"] {
+ background: var(--toast-info-soft);
+ border-color: color-mix(in srgb, var(--toast-info) 28%, var(--card));
+ color: var(--toast-info);
+ }
+
+ [data-sonner-toast][data-type="warning"] {
+ background: var(--toast-warning-soft);
+ border-color: color-mix(in srgb, var(--toast-warning) 28%, var(--card));
+ color: var(--toast-warning);
+ }
+
+ [data-sonner-toast][data-type="error"] {
+ background: var(--toast-error-soft);
+ border-color: color-mix(in srgb, var(--toast-error) 28%, var(--card));
+ color: var(--toast-error);
+ }
+
+ [data-sonner-toast] [data-content] {
+ color: inherit;
+ }
+
+ [data-sonner-toast] [data-description] {
+ color: color-mix(in srgb, currentColor 72%, transparent);
+ }
+
+ button,
+ input {
+ font: inherit;
+ }
+
+ button {
+ @apply cursor-pointer;
+ }
+
+ a {
+ @apply text-inherit no-underline;
+ }
+
+ h1,
+ h2,
+ h3,
+ p {
+ @apply m-0;
+ }
+}
+
+/* Dark mode keeps the cobalt brand as a signal, not a wallpaper. */
+.dark .bg-\[\#efeee7\] {
+ background: #172231;
+}
+
+.dark .hover\:bg-\[\#f6f9fe\]:hover {
+ background: #162231;
+}
+
+.dark .bg-\[\#eaf2fc\] {
+ background: #122337;
+ color: #aabbd0;
+}
+
+.dark .bg-\[\#fff4e8\] {
+ background: #302218;
+}
+
+.dark .text-\[\#895322\] {
+ color: #f0b87a;
+}
+
+.dark .bg-\[\#e5e9df\] {
+ background: #1b2938;
+}
+
+.dark .hover\:bg-\[\#dbe1d4\]:hover {
+ background: #243648;
+}
+
+.dark input.bg-\[\#fffefa\] {
+ background: #0d1723;
+}
+
+.dark input.border-\[\#cbd0c7\] {
+ border-color: #33445a;
+}
+
+.dark .bg-\[\#dbe8ff\] {
+ background: #1e3854;
+}
+
+.dark .bg-\[\#e8edfa\] {
+ background: #1d2d46;
+}
+
+.dark .bg-\[\#e5effc\] {
+ background: #1b3047;
+}
+
+.dark .bg-\[\#e9e8df\] {
+ background: #1b2937;
+}
+
+@media (prefers-reduced-motion: reduce) {
+ *,
+ *::before,
+ *::after {
+ transition-duration: 0.01ms;
+ }
+
+ html {
+ scroll-behavior: auto;
+ }
+
+ .animate-appear,
+ .animate-spin-slow {
+ animation: none;
+ }
+}
+
+@keyframes appear {
+ from {
+ opacity: 0;
+ transform: translateY(9px);
+ }
+
+ to {
+ opacity: 1;
+ transform: translateY(0);
+ }
+}
+
+@keyframes spin {
+ to {
+ transform: rotate(360deg);
+ }
+}
+
+@utility animate-appear {
+ animation: appear 0.45s ease both;
+}
+
+@utility animate-spin-slow {
+ animation: spin 1s linear infinite;
+}
diff --git a/src/utils/cookies.ts b/src/utils/cookies.ts
deleted file mode 100644
index e424ead..0000000
--- a/src/utils/cookies.ts
+++ /dev/null
@@ -1,56 +0,0 @@
-export type CookieOptions = {
- expires?: Date | number // Date or seconds from now
- path?: string
- domain?: string
- secure?: boolean
- sameSite?: "strict" | "lax" | "none"
-}
-
-export function setCookie(name: string, value: string, options: CookieOptions = {}): void {
- if (typeof document === "undefined") return
-
- const { expires, path, domain, secure, sameSite } = options
-
- let cookieString = `${encodeURIComponent(name)}=${encodeURIComponent(value)}`
-
- if (expires !== undefined) {
- const date = expires instanceof Date ? expires : new Date(Date.now() + expires * 1000)
- cookieString += `; expires=${date.toUTCString()}`
- }
-
- if (path) cookieString += `; path=${path}`
- if (domain) cookieString += `; domain=${domain}`
- if (secure) cookieString += "; secure"
- if (sameSite) cookieString += `; samesite=${sameSite}`
-
- // biome-ignore lint/suspicious/noDocumentCookie: same as @/ui/sidebar strategy
- document.cookie = cookieString
-}
-
-export function getCookie(name: string): string | null {
- if (typeof document === "undefined") return null
-
- const match = document.cookie.match(
- new RegExp(`(?:^|; )${encodeURIComponent(name).replace(/[.*+?^${}()|[\]\\]/g, "\\$&")}=([^;]*)`)
- )
-
- return match?.[1] ? decodeURIComponent(match[1]) : null
-}
-
-export function deleteCookie(name: string, options: Pick = {}): void {
- setCookie(name, "", { ...options, expires: new Date(0) })
-}
-
-export function getDefaultCookieOptions(): CookieOptions {
- return process.env.NODE_ENV === "development"
- ? {
- path: "/",
- sameSite: "lax",
- }
- : {
- path: "/",
- domain: ".polinetwork.org",
- secure: true,
- sameSite: "strict",
- }
-}
diff --git a/src/vite-env.d.ts b/src/vite-env.d.ts
new file mode 100644
index 0000000..11f02fe
--- /dev/null
+++ b/src/vite-env.d.ts
@@ -0,0 +1 @@
+///
diff --git a/tailwind.config.ts b/tailwind.config.ts
new file mode 100644
index 0000000..6079bfd
--- /dev/null
+++ b/tailwind.config.ts
@@ -0,0 +1,5 @@
+import type { Config } from "tailwindcss"
+
+export default {
+ content: ["./src/**/*.{ts,tsx}"],
+} satisfies Config
diff --git a/tsconfig.json b/tsconfig.json
index 765e842..0df8c06 100644
--- a/tsconfig.json
+++ b/tsconfig.json
@@ -1,44 +1,23 @@
{
"compilerOptions": {
- /* Base Options: */
- "esModuleInterop": true,
+ "target": "ES2022",
+ "lib": ["DOM", "DOM.Iterable", "ES2023"],
"skipLibCheck": true,
- "target": "es2022",
- "allowJs": true,
- "resolveJsonModule": true,
- "moduleDetection": "force",
- "isolatedModules": true,
- /* Strictness */
"strict": true,
- "noUncheckedIndexedAccess": true,
- "checkJs": true,
- /* Bundled projects */
- "lib": ["dom", "dom.iterable", "ES2022"],
- "noEmit": true,
+ "noUnusedLocals": true,
+ "noUnusedParameters": true,
"module": "ESNext",
"moduleResolution": "Bundler",
- "jsx": "preserve",
- "plugins": [
- {
- "name": "next"
- }
- ],
- "incremental": true,
- /* Path Aliases */
+ "moduleDetection": "force",
+ "jsx": "react-jsx",
+ "noEmit": true,
+ "allowImportingTsExtensions": true,
+ "verbatimModuleSyntax": true,
+ "noUncheckedSideEffectImports": true,
"baseUrl": ".",
- "paths": {
- "@/*": ["./src/*"]
- }
+ "ignoreDeprecations": "6.0",
+ "types": ["vite/client"],
+ "paths": { "@/*": ["./src/*"] }
},
- "include": [
- ".eslintrc.cjs",
- "next-env.d.ts",
- "**/*.ts",
- "**/*.tsx",
- "**/*.cjs",
- "**/*.js",
- ".next/types/**/*.ts",
- ".next/dev/types/**/*.ts"
- ],
- "exclude": ["node_modules"]
+ "include": ["src/**/*", "vite.config.ts", "tailwind.config.ts"]
}
diff --git a/tsr.config.json b/tsr.config.json
new file mode 100644
index 0000000..8b6b6ed
--- /dev/null
+++ b/tsr.config.json
@@ -0,0 +1,3 @@
+{
+ "target": "react"
+}
diff --git a/vite.config.ts b/vite.config.ts
new file mode 100644
index 0000000..fcbd8a9
--- /dev/null
+++ b/vite.config.ts
@@ -0,0 +1,10 @@
+import tailwindcss from "@tailwindcss/vite"
+import { tanstackStart } from "@tanstack/react-start/plugin/vite"
+import viteReact from "@vitejs/plugin-react"
+import { nitro } from "nitro/vite"
+import { defineConfig } from "vite"
+
+export default defineConfig({
+ resolve: { tsconfigPaths: true },
+ plugins: [tailwindcss(), tanstackStart(), nitro(), viteReact()],
+})