From 4eb083cd8f71a01f85dff1083585ba235906d500 Mon Sep 17 00:00:00 2001 From: v0 Date: Thu, 15 Jan 2026 16:52:50 +0000 Subject: [PATCH] Initialized repository for chat Frontend 2FA tool Co-authored-by: Simon <85533298+handsomezhuzhu@users.noreply.github.com> --- .gitignore | 27 + README.md | 30 + app/globals.css | 125 ++ app/layout.tsx | 37 + app/loading.tsx | 3 + app/page.tsx | 1097 +++++++++++ components.json | 21 + components/theme-provider.tsx | 12 + components/ui/badge.tsx | 46 + components/ui/button.tsx | 60 + components/ui/card.tsx | 92 + components/ui/dialog.tsx | 143 ++ components/ui/dropdown-menu.tsx | 257 +++ components/ui/input.tsx | 21 + components/ui/label.tsx | 24 + components/ui/progress.tsx | 31 + components/ui/select.tsx | 185 ++ components/ui/switch.tsx | 31 + components/ui/tabs.tsx | 66 + components/ui/toast.tsx | 129 ++ components/ui/toaster.tsx | 35 + hooks/use-toast.ts | 191 ++ lib/i18n.tsx | 253 +++ lib/utils.ts | 6 + next.config.mjs | 12 + package.json | 73 + pnpm-lock.yaml | 3225 +++++++++++++++++++++++++++++++ postcss.config.mjs | 8 + public/apple-icon.png | Bin 0 -> 2626 bytes public/icon-dark-32x32.png | Bin 0 -> 585 bytes public/icon-light-32x32.png | Bin 0 -> 566 bytes public/icon.svg | 26 + public/images/beian.png | Bin 0 -> 1403 bytes public/images/logo.jpg | Bin 0 -> 72205 bytes public/placeholder-logo.png | Bin 0 -> 568 bytes public/placeholder-logo.svg | 1 + public/placeholder-user.jpg | Bin 0 -> 1635 bytes public/placeholder.jpg | Bin 0 -> 1064 bytes public/placeholder.svg | 1 + styles/globals.css | 125 ++ tsconfig.json | 27 + 41 files changed, 6420 insertions(+) create mode 100644 .gitignore create mode 100644 README.md create mode 100644 app/globals.css create mode 100644 app/layout.tsx create mode 100644 app/loading.tsx create mode 100644 app/page.tsx create mode 100644 components.json create mode 100644 components/theme-provider.tsx create mode 100644 components/ui/badge.tsx create mode 100644 components/ui/button.tsx create mode 100644 components/ui/card.tsx create mode 100644 components/ui/dialog.tsx create mode 100644 components/ui/dropdown-menu.tsx create mode 100644 components/ui/input.tsx create mode 100644 components/ui/label.tsx create mode 100644 components/ui/progress.tsx create mode 100644 components/ui/select.tsx create mode 100644 components/ui/switch.tsx create mode 100644 components/ui/tabs.tsx create mode 100644 components/ui/toast.tsx create mode 100644 components/ui/toaster.tsx create mode 100644 hooks/use-toast.ts create mode 100644 lib/i18n.tsx create mode 100644 lib/utils.ts create mode 100644 next.config.mjs create mode 100644 package.json create mode 100644 pnpm-lock.yaml create mode 100644 postcss.config.mjs create mode 100644 public/apple-icon.png create mode 100644 public/icon-dark-32x32.png create mode 100644 public/icon-light-32x32.png create mode 100644 public/icon.svg create mode 100644 public/images/beian.png create mode 100644 public/images/logo.jpg create mode 100644 public/placeholder-logo.png create mode 100644 public/placeholder-logo.svg create mode 100644 public/placeholder-user.jpg create mode 100644 public/placeholder.jpg create mode 100644 public/placeholder.svg create mode 100644 styles/globals.css create mode 100644 tsconfig.json diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..f650315 --- /dev/null +++ b/.gitignore @@ -0,0 +1,27 @@ +# See https://help.github.com/articles/ignoring-files/ for more about ignoring files. + +# dependencies +/node_modules + +# next.js +/.next/ +/out/ + +# production +/build + +# debug +npm-debug.log* +yarn-debug.log* +yarn-error.log* +.pnpm-debug.log* + +# env files +.env* + +# vercel +.vercel + +# typescript +*.tsbuildinfo +next-env.d.ts \ No newline at end of file diff --git a/README.md b/README.md new file mode 100644 index 0000000..8c6e960 --- /dev/null +++ b/README.md @@ -0,0 +1,30 @@ +# Frontend 2FA tool + +*Automatically synced with your [v0.app](https://v0.app) deployments* + +[![Deployed on Vercel](https://img.shields.io/badge/Deployed%20on-Vercel-black?style=for-the-badge&logo=vercel)](https://vercel.com/kdaugh14-4907s-projects/v0-frontend-2-fa-tool) +[![Built with v0](https://img.shields.io/badge/Built%20with-v0.app-black?style=for-the-badge)](https://v0.app/chat/cHtdgE8H6EW) + +## Overview + +This repository will stay in sync with your deployed chats on [v0.app](https://v0.app). +Any changes you make to your deployed app will be automatically pushed to this repository from [v0.app](https://v0.app). + +## Deployment + +Your project is live at: + +**[https://vercel.com/kdaugh14-4907s-projects/v0-frontend-2-fa-tool](https://vercel.com/kdaugh14-4907s-projects/v0-frontend-2-fa-tool)** + +## Build your app + +Continue building your app on: + +**[https://v0.app/chat/cHtdgE8H6EW](https://v0.app/chat/cHtdgE8H6EW)** + +## How It Works + +1. Create and modify your project using [v0.app](https://v0.app) +2. Deploy your chats from the v0 interface +3. Changes are automatically pushed to this repository +4. Vercel deploys the latest version from this repository \ No newline at end of file diff --git a/app/globals.css b/app/globals.css new file mode 100644 index 0000000..dc2aea1 --- /dev/null +++ b/app/globals.css @@ -0,0 +1,125 @@ +@import 'tailwindcss'; +@import 'tw-animate-css'; + +@custom-variant dark (&:is(.dark *)); + +:root { + --background: oklch(1 0 0); + --foreground: oklch(0.145 0 0); + --card: oklch(1 0 0); + --card-foreground: oklch(0.145 0 0); + --popover: oklch(1 0 0); + --popover-foreground: oklch(0.145 0 0); + --primary: oklch(0.205 0 0); + --primary-foreground: oklch(0.985 0 0); + --secondary: oklch(0.97 0 0); + --secondary-foreground: oklch(0.205 0 0); + --muted: oklch(0.97 0 0); + --muted-foreground: oklch(0.556 0 0); + --accent: oklch(0.97 0 0); + --accent-foreground: oklch(0.205 0 0); + --destructive: oklch(0.577 0.245 27.325); + --destructive-foreground: oklch(0.577 0.245 27.325); + --border: oklch(0.922 0 0); + --input: oklch(0.922 0 0); + --ring: oklch(0.708 0 0); + --chart-1: oklch(0.646 0.222 41.116); + --chart-2: oklch(0.6 0.118 184.704); + --chart-3: oklch(0.398 0.07 227.392); + --chart-4: oklch(0.828 0.189 84.429); + --chart-5: oklch(0.769 0.188 70.08); + --radius: 0.625rem; + --sidebar: oklch(0.985 0 0); + --sidebar-foreground: oklch(0.145 0 0); + --sidebar-primary: oklch(0.205 0 0); + --sidebar-primary-foreground: oklch(0.985 0 0); + --sidebar-accent: oklch(0.97 0 0); + --sidebar-accent-foreground: oklch(0.205 0 0); + --sidebar-border: oklch(0.922 0 0); + --sidebar-ring: oklch(0.708 0 0); +} + +.dark { + --background: oklch(0.145 0 0); + --foreground: oklch(0.985 0 0); + --card: oklch(0.145 0 0); + --card-foreground: oklch(0.985 0 0); + --popover: oklch(0.145 0 0); + --popover-foreground: oklch(0.985 0 0); + --primary: oklch(0.985 0 0); + --primary-foreground: oklch(0.205 0 0); + --secondary: oklch(0.269 0 0); + --secondary-foreground: oklch(0.985 0 0); + --muted: oklch(0.269 0 0); + --muted-foreground: oklch(0.708 0 0); + --accent: oklch(0.269 0 0); + --accent-foreground: oklch(0.985 0 0); + --destructive: oklch(0.396 0.141 25.723); + --destructive-foreground: oklch(0.637 0.237 25.331); + --border: oklch(0.269 0 0); + --input: oklch(0.269 0 0); + --ring: oklch(0.439 0 0); + --chart-1: oklch(0.488 0.243 264.376); + --chart-2: oklch(0.696 0.17 162.48); + --chart-3: oklch(0.769 0.188 70.08); + --chart-4: oklch(0.627 0.265 303.9); + --chart-5: oklch(0.645 0.246 16.439); + --sidebar: oklch(0.205 0 0); + --sidebar-foreground: oklch(0.985 0 0); + --sidebar-primary: oklch(0.488 0.243 264.376); + --sidebar-primary-foreground: oklch(0.985 0 0); + --sidebar-accent: oklch(0.269 0 0); + --sidebar-accent-foreground: oklch(0.985 0 0); + --sidebar-border: oklch(0.269 0 0); + --sidebar-ring: oklch(0.439 0 0); +} + +@theme inline { + --font-sans: 'Geist', 'Geist Fallback'; + --font-mono: 'Geist Mono', 'Geist Mono Fallback'; + --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-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); + --radius-sm: calc(var(--radius) - 4px); + --radius-md: calc(var(--radius) - 2px); + --radius-lg: var(--radius); + --radius-xl: calc(var(--radius) + 4px); + --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 outline-ring/50; + } + body { + @apply bg-background text-foreground; + } +} diff --git a/app/layout.tsx b/app/layout.tsx new file mode 100644 index 0000000..bdeedff --- /dev/null +++ b/app/layout.tsx @@ -0,0 +1,37 @@ +import type React from "react" +import type { Metadata } from "next" +import { Geist, Geist_Mono } from "next/font/google" +import { Analytics } from "@vercel/analytics/next" +import { ThemeProvider } from "@/components/theme-provider" +import { LanguageProvider } from "@/lib/i18n" +import "./globals.css" + +const _geist = Geist({ subsets: ["latin"] }) +const _geistMono = Geist_Mono({ subsets: ["latin"] }) + +export const metadata: Metadata = { + title: "2FA 验证器 - 安全的双因素认证工具", + description: "纯前端双因素认证工具,支持导入密钥、扫码、上传图片等功能", + generator: "v0.app", + icons: { + icon: "/images/logo.jpg", + apple: "/images/logo.jpg", + }, +} + +export default function RootLayout({ + children, +}: Readonly<{ + children: React.ReactNode +}>) { + return ( + + + + {children} + + + + + ) +} diff --git a/app/loading.tsx b/app/loading.tsx new file mode 100644 index 0000000..f15322a --- /dev/null +++ b/app/loading.tsx @@ -0,0 +1,3 @@ +export default function Loading() { + return null +} diff --git a/app/page.tsx b/app/page.tsx new file mode 100644 index 0000000..c88cfeb --- /dev/null +++ b/app/page.tsx @@ -0,0 +1,1097 @@ +"use client" + +import type React from "react" + +import { useState, useEffect, useRef, useCallback } from "react" +import { + Plus, + Camera, + Upload, + Settings, + Copy, + Trash2, + Edit2, + QrCode, + Key, + Clock, + Search, + ChevronDown, + ChevronUp, + Eye, + EyeOff, + Download, + MoreVertical, + Sun, + Moon, + Monitor, + Languages, +} from "lucide-react" +import { Button } from "@/components/ui/button" +import { Input } from "@/components/ui/input" +import { Label } from "@/components/ui/label" +import { Card, CardContent, CardDescription, CardHeader, CardTitle } from "@/components/ui/card" +import { + Dialog, + DialogContent, + DialogDescription, + DialogFooter, + DialogHeader, + DialogTitle, + DialogTrigger, +} from "@/components/ui/dialog" +import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from "@/components/ui/select" +import { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuTrigger } from "@/components/ui/dropdown-menu" +import { Tabs, TabsContent, TabsList, TabsTrigger } from "@/components/ui/tabs" +import { Switch } from "@/components/ui/switch" +import { Badge } from "@/components/ui/badge" +import { Progress } from "@/components/ui/progress" +import { Toaster } from "@/components/ui/toaster" +import { useToast } from "@/hooks/use-toast" +import { useTheme } from "@/components/theme-provider" +import { useLanguage } from "@/lib/i18n" + +interface TOTPToken { + id: string + name: string + issuer: string + secret: string + algorithm: "SHA1" | "SHA256" | "SHA512" + digits: 6 | 8 + period: number + createdAt: number +} + +interface AppSettings { + showCodes: boolean + autoRefresh: boolean + compactMode: boolean + sortBy: "name" | "issuer" | "recent" +} + +// TOTP Generation functions +function base32Decode(encoded: string): Uint8Array { + const alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZ234567" + const cleanedInput = encoded.toUpperCase().replace(/[^A-Z2-7]/g, "") + + let bits = "" + for (const char of cleanedInput) { + const val = alphabet.indexOf(char) + if (val === -1) continue + bits += val.toString(2).padStart(5, "0") + } + + const bytes = new Uint8Array(Math.floor(bits.length / 8)) + for (let i = 0; i < bytes.length; i++) { + bytes[i] = Number.parseInt(bits.slice(i * 8, (i + 1) * 8), 2) + } + + return bytes +} + +async function hmacSha(algorithm: string, key: Uint8Array, message: Uint8Array): Promise { + const cryptoKey = await crypto.subtle.importKey("raw", key, { name: "HMAC", hash: algorithm }, false, ["sign"]) + const signature = await crypto.subtle.sign("HMAC", cryptoKey, message) + return new Uint8Array(signature) +} + +async function generateTOTP( + secret: string, + algorithm: "SHA1" | "SHA256" | "SHA512" = "SHA1", + digits: 6 | 8 = 6, + period = 30, +): Promise { + const key = base32Decode(secret) + const time = Math.floor(Date.now() / 1000 / period) + + const timeBuffer = new ArrayBuffer(8) + const timeView = new DataView(timeBuffer) + timeView.setBigUint64(0, BigInt(time), false) + + const hashAlgorithm = algorithm === "SHA1" ? "SHA-1" : algorithm === "SHA256" ? "SHA-256" : "SHA-512" + const hmac = await hmacSha(hashAlgorithm, key, new Uint8Array(timeBuffer)) + + const offset = hmac[hmac.length - 1] & 0x0f + const binary = + ((hmac[offset] & 0x7f) << 24) | + ((hmac[offset + 1] & 0xff) << 16) | + ((hmac[offset + 2] & 0xff) << 8) | + (hmac[offset + 3] & 0xff) + + const otp = binary % Math.pow(10, digits) + return otp.toString().padStart(digits, "0") +} + +function parseOTPAuthURI(uri: string): Partial | null { + try { + const url = new URL(uri) + if (url.protocol !== "otpauth:") return null + if (url.host !== "totp") return null + + const path = decodeURIComponent(url.pathname.slice(1)) + const params = url.searchParams + + let issuer = params.get("issuer") || "" + let name = path + + if (path.includes(":")) { + const [iss, n] = path.split(":") + issuer = issuer || iss + name = n + } + + return { + name, + issuer, + secret: params.get("secret") || "", + algorithm: (params.get("algorithm")?.toUpperCase() as "SHA1" | "SHA256" | "SHA512") || "SHA1", + digits: Number.parseInt(params.get("digits") || "6") as 6 | 8, + period: Number.parseInt(params.get("period") || "30"), + } + } catch { + return null + } +} + +export default function TwoFactorAuth() { + const [tokens, setTokens] = useState([]) + const [codes, setCodes] = useState>({}) + const [timeLeft, setTimeLeft] = useState(30) + const [searchQuery, setSearchQuery] = useState("") + const [isAddDialogOpen, setIsAddDialogOpen] = useState(false) + const [isCameraOpen, setIsCameraOpen] = useState(false) + const [isSettingsOpen, setIsSettingsOpen] = useState(false) + const [editingToken, setEditingToken] = useState(null) + const [showAdvanced, setShowAdvanced] = useState(false) + const videoRef = useRef(null) + const canvasRef = useRef(null) + const fileInputRef = useRef(null) + const streamRef = useRef(null) + const { toast } = useToast() + const { theme, setTheme } = useTheme() + const { language, setLanguage, t } = useLanguage() + + const [newToken, setNewToken] = useState({ + name: "", + issuer: "", + secret: "", + algorithm: "SHA1" as "SHA1" | "SHA256" | "SHA512", + digits: 6 as 6 | 8, + period: 30, + }) + + const [settings, setSettings] = useState({ + showCodes: true, + autoRefresh: true, + compactMode: false, + sortBy: "name", + }) + + // Load tokens and settings from localStorage + useEffect(() => { + const savedTokens = localStorage.getItem("2fa-tokens") + const savedSettings = localStorage.getItem("2fa-settings") + if (savedTokens) { + setTokens(JSON.parse(savedTokens)) + } + if (savedSettings) { + setSettings(JSON.parse(savedSettings)) + } + }, []) + + // Save tokens to localStorage + useEffect(() => { + localStorage.setItem("2fa-tokens", JSON.stringify(tokens)) + }, [tokens]) + + // Save settings to localStorage + useEffect(() => { + localStorage.setItem("2fa-settings", JSON.stringify(settings)) + }, [settings]) + + // Generate codes for all tokens + const generateAllCodes = useCallback(async () => { + const newCodes: Record = {} + for (const token of tokens) { + try { + newCodes[token.id] = await generateTOTP(token.secret, token.algorithm, token.digits, token.period) + } catch { + newCodes[token.id] = "Error" + } + } + setCodes(newCodes) + }, [tokens]) + + // Timer for TOTP refresh + useEffect(() => { + generateAllCodes() + + const interval = setInterval(() => { + const now = Math.floor(Date.now() / 1000) + const remaining = 30 - (now % 30) + setTimeLeft(remaining) + + if (remaining === 30) { + generateAllCodes() + } + }, 1000) + + return () => clearInterval(interval) + }, [generateAllCodes]) + + const addToken = () => { + if (!newToken.name || !newToken.secret) { + toast({ + title: t.error, + description: t.fillRequired, + variant: "destructive", + }) + return + } + + const cleanSecret = newToken.secret.replace(/\s/g, "").toUpperCase() + + const token: TOTPToken = { + id: crypto.randomUUID(), + name: newToken.name, + issuer: newToken.issuer, + secret: cleanSecret, + algorithm: newToken.algorithm, + digits: newToken.digits, + period: newToken.period, + createdAt: Date.now(), + } + + setTokens([...tokens, token]) + setNewToken({ + name: "", + issuer: "", + secret: "", + algorithm: "SHA1", + digits: 6, + period: 30, + }) + setShowAdvanced(false) + setIsAddDialogOpen(false) + + toast({ + title: t.addSuccess, + description: `${t.added} ${token.name}`, + }) + } + + const deleteToken = (id: string) => { + const token = tokens.find((t) => t.id === id) + setTokens(tokens.filter((t) => t.id !== id)) + toast({ + title: t.deleted, + description: `${t.deleted} ${token?.name}`, + }) + } + + const updateToken = () => { + if (!editingToken) return + setTokens(tokens.map((tk) => (tk.id === editingToken.id ? editingToken : tk))) + setEditingToken(null) + toast({ + title: t.updated, + description: t.tokenUpdated, + }) + } + + const copyCode = (code: string, name: string) => { + navigator.clipboard.writeText(code) + toast({ + title: t.copied, + description: `${name} ${t.codeCopied}`, + }) + } + + // QR Code scanning from camera + const startCamera = async () => { + try { + const stream = await navigator.mediaDevices.getUserMedia({ + video: { facingMode: "environment" }, + }) + streamRef.current = stream + if (videoRef.current) { + videoRef.current.srcObject = stream + videoRef.current.play() + } + setIsCameraOpen(true) + scanQRCode() + } catch (error) { + toast({ + title: t.cameraFailed, + description: t.cameraPermission, + variant: "destructive", + }) + } + } + + const stopCamera = () => { + if (streamRef.current) { + streamRef.current.getTracks().forEach((track) => track.stop()) + streamRef.current = null + } + setIsCameraOpen(false) + } + + const scanQRCode = async () => { + if (!videoRef.current || !canvasRef.current) return + + const video = videoRef.current + const canvas = canvasRef.current + const ctx = canvas.getContext("2d") + + if (!ctx) return + + const scan = async () => { + if (!isCameraOpen && !streamRef.current) return + + if (video.readyState === video.HAVE_ENOUGH_DATA) { + canvas.width = video.videoWidth + canvas.height = video.videoHeight + ctx.drawImage(video, 0, 0, canvas.width, canvas.height) + + const imageData = ctx.getImageData(0, 0, canvas.width, canvas.height) + + // Simple QR detection - in production, use a library like jsQR + // For now, we'll rely on image upload for QR codes + } + + if (streamRef.current) { + requestAnimationFrame(scan) + } + } + + scan() + } + + // Handle image upload for QR scanning + const handleImageUpload = async (event: React.ChangeEvent) => { + const file = event.target.files?.[0] + if (!file) return + + const img = new Image() + img.crossOrigin = "anonymous" + img.onload = async () => { + const canvas = document.createElement("canvas") + canvas.width = img.width + canvas.height = img.height + const ctx = canvas.getContext("2d") + if (!ctx) return + + ctx.drawImage(img, 0, 0) + + toast({ + title: t.imageUploaded, + description: t.imageUploadedHint, + }) + } + img.src = URL.createObjectURL(file) + + // Reset file input + if (fileInputRef.current) { + fileInputRef.current.value = "" + } + } + + // Handle URI paste + const handleURIPaste = (uri: string) => { + const parsed = parseOTPAuthURI(uri) + if (parsed) { + setNewToken({ + name: parsed.name || "", + issuer: parsed.issuer || "", + secret: parsed.secret || "", + algorithm: parsed.algorithm || "SHA1", + digits: parsed.digits || 6, + period: parsed.period || 30, + }) + toast({ + title: t.parseSuccess, + description: t.extractedInfo, + }) + } else { + toast({ + title: t.parseFailed, + description: t.invalidUri, + variant: "destructive", + }) + } + } + + // Export tokens + const exportTokens = () => { + const data = JSON.stringify(tokens, null, 2) + const blob = new Blob([data], { type: "application/json" }) + const url = URL.createObjectURL(blob) + const a = document.createElement("a") + a.href = url + a.download = "2fa-tokens-backup.json" + a.click() + URL.revokeObjectURL(url) + toast({ + title: t.exportSuccess, + description: t.exportedJson, + }) + } + + // Import tokens + const importTokens = (event: React.ChangeEvent) => { + const file = event.target.files?.[0] + if (!file) return + + const reader = new FileReader() + reader.onload = (e) => { + try { + const imported = JSON.parse(e.target?.result as string) + if (Array.isArray(imported)) { + setTokens([...tokens, ...imported]) + toast({ + title: t.importSuccess, + description: `${t.added} ${imported.length} ${t.importedTokens}`, + }) + } + } catch { + toast({ + title: t.importFailed, + description: t.invalidFormat, + variant: "destructive", + }) + } + } + reader.readAsText(file) + } + + // Filter and sort tokens + const filteredTokens = tokens + .filter( + (t) => + t.name.toLowerCase().includes(searchQuery.toLowerCase()) || + t.issuer.toLowerCase().includes(searchQuery.toLowerCase()), + ) + .sort((a, b) => { + switch (settings.sortBy) { + case "name": + return a.name.localeCompare(b.name) + case "issuer": + return a.issuer.localeCompare(b.issuer) + case "recent": + return b.createdAt - a.createdAt + default: + return 0 + } + }) + + return ( +
+ {/* Header */} +
+
+
+
+
+ +
+
+

{t.appName}

+

{t.appDescription}

+
+
+
+ + + + + + setTheme("light")}> + + {t.themeLight} + + setTheme("dark")}> + + {t.themeDark} + + setTheme("system")}> + + {t.themeSystem} + + + + + + + + + + setLanguage("zh")}>中文 {language === "zh" && "✓"} + setLanguage("en")}> + English {language === "en" && "✓"} + + + + + + + + + + + {t.settings} + {t.settingsDesc} + +
+
+
+ +

{t.showCodesDesc}

+
+ setSettings({ ...settings, showCodes: checked })} + /> +
+
+
+ +

{t.compactModeDesc}

+
+ setSettings({ ...settings, compactMode: checked })} + /> +
+
+ + +
+
+ +
+ + +
+
+
+
+
+
+
+
+
+ + {/* Main Content */} +
+ {/* Timer Progress */} +
+
+
+ + {t.nextRefresh} +
+ {timeLeft}s +
+ +
+ + {/* Search and Actions */} +
+
+ + setSearchQuery(e.target.value)} + className="pl-10" + /> +
+
+ + + + + + + {t.addNewToken} + {t.addNewTokenDesc} + + + + + + {t.manualInput} + + + + {t.scanQr} + + + + {t.uploadImage} + + + + +
+ + handleURIPaste(e.target.value)} /> +

{t.otpauthUriHint}

+
+
+ + setNewToken({ ...newToken, name: e.target.value })} + /> +
+
+ + setNewToken({ ...newToken, issuer: e.target.value })} + /> +
+
+ + setNewToken({ ...newToken, secret: e.target.value })} + className="font-mono" + /> +
+ + {/* Advanced Settings */} +
+ + + {showAdvanced && ( +
+
+ + +
+
+ + +
+
+ + + setNewToken({ ...newToken, period: Number.parseInt(e.target.value) || 30 }) + } + /> +
+
+ )} +
+
+ + +
+ {!isCameraOpen ? ( +
+ + +
+ ) : ( +
+
+ + + +
+
fileInputRef.current?.click()} + > + +
+

{t.uploadHint}

+

{t.uploadFormats}

+
+
+ +
+
+ + + + + + +
+
+
+ + {/* Tokens List */} + {filteredTokens.length === 0 ? ( + + + +

{t.noTokens}

+

{t.noTokensHint}

+ +
+
+ ) : ( +
+ {filteredTokens.map((token) => ( + copyCode(codes[token.id], token.name)} + onEdit={() => setEditingToken(token)} + onDelete={() => deleteToken(token.id)} + t={t} + /> + ))} +
+ )} +
+ + {/* Edit Dialog */} + !open && setEditingToken(null)}> + + + {t.editToken} + + {editingToken && ( +
+
+ + setEditingToken({ ...editingToken, name: e.target.value })} + /> +
+
+ + setEditingToken({ ...editingToken, issuer: e.target.value })} + /> +
+
+ )} + + + + +
+
+ + {/* Footer */} + + + +
+ ) +} + +interface TokenCardProps { + token: TOTPToken + code: string + timeLeft: number + showCode: boolean + compact: boolean + onCopy: () => void + onEdit: () => void + onDelete: () => void + t: Record +} + +function TokenCard({ token, code, timeLeft, showCode, compact, onCopy, onEdit, onDelete, t }: TokenCardProps) { + const [visible, setVisible] = useState(showCode) + + useEffect(() => { + setVisible(showCode) + }, [showCode]) + + const formattedCode = + code.length === 6 + ? `${code.slice(0, 3)} ${code.slice(3)}` + : code.length === 8 + ? `${code.slice(0, 4)} ${code.slice(4)}` + : code + + if (compact) { + return ( + + +
+
+
+ {token.name.charAt(0).toUpperCase()} +
+
+

{token.name}

+ {token.issuer &&

{token.issuer}

} +
+
+
+ + + {visible ? formattedCode : "••• •••"} + + + + + + + + + {t.copy} + + + + {t.edit} + + + + {t.delete} + + + +
+
+
+
+ ) + } + + return ( + + +
+
+
+ {token.name.charAt(0).toUpperCase()} +
+
+ {token.name} + {token.issuer && {token.issuer}} +
+
+ + + + + + + + {t.copyCode} + + + + {t.edit} + + + + {t.delete} + + + +
+
+ +
+
+ + + {visible ? formattedCode : "••• •••"} + +
+ +
+
+ + {timeLeft}s +
+ {(token.algorithm !== "SHA1" || token.digits !== 6 || token.period !== 30) && ( +
+ {token.algorithm !== "SHA1" && ( + + {token.algorithm} + + )} + {token.digits !== 6 && ( + + {token.digits} + {t.digits8?.includes("digits") ? " digits" : "位"} + + )} + {token.period !== 30 && ( + + {token.period}s + + )} +
+ )} +
+
+ ) +} diff --git a/components.json b/components.json new file mode 100644 index 0000000..4ee62ee --- /dev/null +++ b/components.json @@ -0,0 +1,21 @@ +{ + "$schema": "https://ui.shadcn.com/schema.json", + "style": "new-york", + "rsc": true, + "tsx": true, + "tailwind": { + "config": "", + "css": "app/globals.css", + "baseColor": "neutral", + "cssVariables": true, + "prefix": "" + }, + "aliases": { + "components": "@/components", + "utils": "@/lib/utils", + "ui": "@/components/ui", + "lib": "@/lib", + "hooks": "@/hooks" + }, + "iconLibrary": "lucide" +} diff --git a/components/theme-provider.tsx b/components/theme-provider.tsx new file mode 100644 index 0000000..20feb83 --- /dev/null +++ b/components/theme-provider.tsx @@ -0,0 +1,12 @@ +"use client" + +import type * as React from "react" +import { ThemeProvider as NextThemesProvider } from "next-themes" + +export { useTheme } from "next-themes" + +type ThemeProviderProps = React.ComponentProps + +export function ThemeProvider({ children, ...props }: ThemeProviderProps) { + return {children} +} diff --git a/components/ui/badge.tsx b/components/ui/badge.tsx new file mode 100644 index 0000000..fc4126b --- /dev/null +++ b/components/ui/badge.tsx @@ -0,0 +1,46 @@ +import * as React from 'react' +import { Slot } from '@radix-ui/react-slot' +import { cva, type VariantProps } from 'class-variance-authority' + +import { cn } from '@/lib/utils' + +const badgeVariants = cva( + 'inline-flex items-center justify-center rounded-md border px-2 py-0.5 text-xs font-medium w-fit whitespace-nowrap shrink-0 [&>svg]:size-3 gap-1 [&>svg]:pointer-events-none focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px] aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive transition-[color,box-shadow] overflow-hidden', + { + variants: { + variant: { + default: + 'border-transparent bg-primary text-primary-foreground [a&]:hover:bg-primary/90', + secondary: + 'border-transparent bg-secondary text-secondary-foreground [a&]:hover:bg-secondary/90', + destructive: + 'border-transparent bg-destructive text-white [a&]:hover:bg-destructive/90 focus-visible:ring-destructive/20 dark:focus-visible:ring-destructive/40 dark:bg-destructive/60', + outline: + 'text-foreground [a&]:hover:bg-accent [a&]:hover:text-accent-foreground', + }, + }, + defaultVariants: { + variant: 'default', + }, + }, +) + +function Badge({ + className, + variant, + asChild = false, + ...props +}: React.ComponentProps<'span'> & + VariantProps & { asChild?: boolean }) { + const Comp = asChild ? Slot : 'span' + + return ( + + ) +} + +export { Badge, badgeVariants } diff --git a/components/ui/button.tsx b/components/ui/button.tsx new file mode 100644 index 0000000..f64632d --- /dev/null +++ b/components/ui/button.tsx @@ -0,0 +1,60 @@ +import * as React from 'react' +import { Slot } from '@radix-ui/react-slot' +import { cva, type VariantProps } from 'class-variance-authority' + +import { cn } from '@/lib/utils' + +const buttonVariants = cva( + "inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium transition-all disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg:not([class*='size-'])]:size-4 shrink-0 [&_svg]:shrink-0 outline-none focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px] aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive", + { + variants: { + variant: { + default: 'bg-primary text-primary-foreground hover:bg-primary/90', + destructive: + 'bg-destructive text-white hover:bg-destructive/90 focus-visible:ring-destructive/20 dark:focus-visible:ring-destructive/40 dark:bg-destructive/60', + outline: + 'border bg-background shadow-xs hover:bg-accent hover:text-accent-foreground dark:bg-input/30 dark:border-input dark:hover:bg-input/50', + secondary: + 'bg-secondary text-secondary-foreground hover:bg-secondary/80', + ghost: + 'hover:bg-accent hover:text-accent-foreground dark:hover:bg-accent/50', + link: 'text-primary underline-offset-4 hover:underline', + }, + size: { + default: 'h-9 px-4 py-2 has-[>svg]:px-3', + sm: 'h-8 rounded-md gap-1.5 px-3 has-[>svg]:px-2.5', + lg: 'h-10 rounded-md px-6 has-[>svg]:px-4', + icon: 'size-9', + 'icon-sm': 'size-8', + 'icon-lg': 'size-10', + }, + }, + defaultVariants: { + variant: 'default', + size: 'default', + }, + }, +) + +function Button({ + className, + variant, + size, + asChild = false, + ...props +}: React.ComponentProps<'button'> & + VariantProps & { + asChild?: boolean + }) { + const Comp = asChild ? Slot : 'button' + + return ( + + ) +} + +export { Button, buttonVariants } diff --git a/components/ui/card.tsx b/components/ui/card.tsx new file mode 100644 index 0000000..db7dd3c --- /dev/null +++ b/components/ui/card.tsx @@ -0,0 +1,92 @@ +import * as React from 'react' + +import { cn } from '@/lib/utils' + +function Card({ className, ...props }: React.ComponentProps<'div'>) { + return ( +
+ ) +} + +function CardHeader({ className, ...props }: React.ComponentProps<'div'>) { + return ( +
+ ) +} + +function CardTitle({ className, ...props }: React.ComponentProps<'div'>) { + return ( +
+ ) +} + +function CardDescription({ className, ...props }: React.ComponentProps<'div'>) { + return ( +
+ ) +} + +function CardAction({ className, ...props }: React.ComponentProps<'div'>) { + return ( +
+ ) +} + +function CardContent({ className, ...props }: React.ComponentProps<'div'>) { + return ( +
+ ) +} + +function CardFooter({ className, ...props }: React.ComponentProps<'div'>) { + return ( +
+ ) +} + +export { + Card, + CardHeader, + CardFooter, + CardTitle, + CardAction, + CardDescription, + CardContent, +} diff --git a/components/ui/dialog.tsx b/components/ui/dialog.tsx new file mode 100644 index 0000000..243fb19 --- /dev/null +++ b/components/ui/dialog.tsx @@ -0,0 +1,143 @@ +'use client' + +import * as React from 'react' +import * as DialogPrimitive from '@radix-ui/react-dialog' +import { XIcon } from 'lucide-react' + +import { cn } from '@/lib/utils' + +function Dialog({ + ...props +}: React.ComponentProps) { + return +} + +function DialogTrigger({ + ...props +}: React.ComponentProps) { + return +} + +function DialogPortal({ + ...props +}: React.ComponentProps) { + return +} + +function DialogClose({ + ...props +}: React.ComponentProps) { + return +} + +function DialogOverlay({ + className, + ...props +}: React.ComponentProps) { + return ( + + ) +} + +function DialogContent({ + className, + children, + showCloseButton = true, + ...props +}: React.ComponentProps & { + showCloseButton?: boolean +}) { + return ( + + + + {children} + {showCloseButton && ( + + + Close + + )} + + + ) +} + +function DialogHeader({ className, ...props }: React.ComponentProps<'div'>) { + return ( +
+ ) +} + +function DialogFooter({ className, ...props }: React.ComponentProps<'div'>) { + return ( +
+ ) +} + +function DialogTitle({ + className, + ...props +}: React.ComponentProps) { + return ( + + ) +} + +function DialogDescription({ + className, + ...props +}: React.ComponentProps) { + return ( + + ) +} + +export { + Dialog, + DialogClose, + DialogContent, + DialogDescription, + DialogFooter, + DialogHeader, + DialogOverlay, + DialogPortal, + DialogTitle, + DialogTrigger, +} diff --git a/components/ui/dropdown-menu.tsx b/components/ui/dropdown-menu.tsx new file mode 100644 index 0000000..a2096fa --- /dev/null +++ b/components/ui/dropdown-menu.tsx @@ -0,0 +1,257 @@ +'use client' + +import * as React from 'react' +import * as DropdownMenuPrimitive from '@radix-ui/react-dropdown-menu' +import { CheckIcon, ChevronRightIcon, CircleIcon } from 'lucide-react' + +import { cn } from '@/lib/utils' + +function DropdownMenu({ + ...props +}: React.ComponentProps) { + return +} + +function DropdownMenuPortal({ + ...props +}: React.ComponentProps) { + return ( + + ) +} + +function DropdownMenuTrigger({ + ...props +}: React.ComponentProps) { + return ( + + ) +} + +function DropdownMenuContent({ + className, + sideOffset = 4, + ...props +}: React.ComponentProps) { + return ( + + + + ) +} + +function DropdownMenuGroup({ + ...props +}: React.ComponentProps) { + return ( + + ) +} + +function DropdownMenuItem({ + className, + inset, + variant = 'default', + ...props +}: React.ComponentProps & { + inset?: boolean + variant?: 'default' | 'destructive' +}) { + return ( + + ) +} + +function DropdownMenuCheckboxItem({ + className, + children, + checked, + ...props +}: React.ComponentProps) { + return ( + + + + + + + {children} + + ) +} + +function DropdownMenuRadioGroup({ + ...props +}: React.ComponentProps) { + return ( + + ) +} + +function DropdownMenuRadioItem({ + className, + children, + ...props +}: React.ComponentProps) { + return ( + + + + + + + {children} + + ) +} + +function DropdownMenuLabel({ + className, + inset, + ...props +}: React.ComponentProps & { + inset?: boolean +}) { + return ( + + ) +} + +function DropdownMenuSeparator({ + className, + ...props +}: React.ComponentProps) { + return ( + + ) +} + +function DropdownMenuShortcut({ + className, + ...props +}: React.ComponentProps<'span'>) { + return ( + + ) +} + +function DropdownMenuSub({ + ...props +}: React.ComponentProps) { + return +} + +function DropdownMenuSubTrigger({ + className, + inset, + children, + ...props +}: React.ComponentProps & { + inset?: boolean +}) { + return ( + + {children} + + + ) +} + +function DropdownMenuSubContent({ + className, + ...props +}: React.ComponentProps) { + return ( + + ) +} + +export { + DropdownMenu, + DropdownMenuPortal, + DropdownMenuTrigger, + DropdownMenuContent, + DropdownMenuGroup, + DropdownMenuLabel, + DropdownMenuItem, + DropdownMenuCheckboxItem, + DropdownMenuRadioGroup, + DropdownMenuRadioItem, + DropdownMenuSeparator, + DropdownMenuShortcut, + DropdownMenuSub, + DropdownMenuSubTrigger, + DropdownMenuSubContent, +} diff --git a/components/ui/input.tsx b/components/ui/input.tsx new file mode 100644 index 0000000..f199a06 --- /dev/null +++ b/components/ui/input.tsx @@ -0,0 +1,21 @@ +import * as React from 'react' + +import { cn } from '@/lib/utils' + +function Input({ className, type, ...props }: React.ComponentProps<'input'>) { + return ( + + ) +} + +export { Input } diff --git a/components/ui/label.tsx b/components/ui/label.tsx new file mode 100644 index 0000000..5d66da2 --- /dev/null +++ b/components/ui/label.tsx @@ -0,0 +1,24 @@ +'use client' + +import * as React from 'react' +import * as LabelPrimitive from '@radix-ui/react-label' + +import { cn } from '@/lib/utils' + +function Label({ + className, + ...props +}: React.ComponentProps) { + return ( + + ) +} + +export { Label } diff --git a/components/ui/progress.tsx b/components/ui/progress.tsx new file mode 100644 index 0000000..ab38305 --- /dev/null +++ b/components/ui/progress.tsx @@ -0,0 +1,31 @@ +'use client' + +import * as React from 'react' +import * as ProgressPrimitive from '@radix-ui/react-progress' + +import { cn } from '@/lib/utils' + +function Progress({ + className, + value, + ...props +}: React.ComponentProps) { + return ( + + + + ) +} + +export { Progress } diff --git a/components/ui/select.tsx b/components/ui/select.tsx new file mode 100644 index 0000000..5db0bca --- /dev/null +++ b/components/ui/select.tsx @@ -0,0 +1,185 @@ +'use client' + +import * as React from 'react' +import * as SelectPrimitive from '@radix-ui/react-select' +import { CheckIcon, ChevronDownIcon, ChevronUpIcon } from 'lucide-react' + +import { cn } from '@/lib/utils' + +function Select({ + ...props +}: React.ComponentProps) { + return +} + +function SelectGroup({ + ...props +}: React.ComponentProps) { + return +} + +function SelectValue({ + ...props +}: React.ComponentProps) { + return +} + +function SelectTrigger({ + className, + size = 'default', + children, + ...props +}: React.ComponentProps & { + size?: 'sm' | 'default' +}) { + return ( + + {children} + + + + + ) +} + +function SelectContent({ + className, + children, + position = 'popper', + ...props +}: React.ComponentProps) { + return ( + + + + + {children} + + + + + ) +} + +function SelectLabel({ + className, + ...props +}: React.ComponentProps) { + return ( + + ) +} + +function SelectItem({ + className, + children, + ...props +}: React.ComponentProps) { + return ( + + + + + + + {children} + + ) +} + +function SelectSeparator({ + className, + ...props +}: React.ComponentProps) { + 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/components/ui/switch.tsx b/components/ui/switch.tsx new file mode 100644 index 0000000..3c4cfa3 --- /dev/null +++ b/components/ui/switch.tsx @@ -0,0 +1,31 @@ +'use client' + +import * as React from 'react' +import * as SwitchPrimitive from '@radix-ui/react-switch' + +import { cn } from '@/lib/utils' + +function Switch({ + className, + ...props +}: React.ComponentProps) { + return ( + + + + ) +} + +export { Switch } diff --git a/components/ui/tabs.tsx b/components/ui/tabs.tsx new file mode 100644 index 0000000..ff67104 --- /dev/null +++ b/components/ui/tabs.tsx @@ -0,0 +1,66 @@ +'use client' + +import * as React from 'react' +import * as TabsPrimitive from '@radix-ui/react-tabs' + +import { cn } from '@/lib/utils' + +function Tabs({ + className, + ...props +}: React.ComponentProps) { + return ( + + ) +} + +function TabsList({ + className, + ...props +}: React.ComponentProps) { + return ( + + ) +} + +function TabsTrigger({ + className, + ...props +}: React.ComponentProps) { + return ( + + ) +} + +function TabsContent({ + className, + ...props +}: React.ComponentProps) { + return ( + + ) +} + +export { Tabs, TabsList, TabsTrigger, TabsContent } diff --git a/components/ui/toast.tsx b/components/ui/toast.tsx new file mode 100644 index 0000000..40eedf5 --- /dev/null +++ b/components/ui/toast.tsx @@ -0,0 +1,129 @@ +'use client' + +import * as React from 'react' +import * as ToastPrimitives from '@radix-ui/react-toast' +import { cva, type VariantProps } from 'class-variance-authority' +import { X } from 'lucide-react' + +import { cn } from '@/lib/utils' + +const ToastProvider = ToastPrimitives.Provider + +const ToastViewport = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + +)) +ToastViewport.displayName = ToastPrimitives.Viewport.displayName + +const toastVariants = cva( + 'group pointer-events-auto relative flex w-full items-center justify-between space-x-4 overflow-hidden rounded-md border p-6 pr-8 shadow-lg transition-all data-[swipe=cancel]:translate-x-0 data-[swipe=end]:translate-x-[var(--radix-toast-swipe-end-x)] data-[swipe=move]:translate-x-[var(--radix-toast-swipe-move-x)] data-[swipe=move]:transition-none data-[state=open]:animate-in data-[state=closed]:animate-out data-[swipe=end]:animate-out data-[state=closed]:fade-out-80 data-[state=closed]:slide-out-to-right-full data-[state=open]:slide-in-from-top-full data-[state=open]:sm:slide-in-from-bottom-full', + { + variants: { + variant: { + default: 'border bg-background text-foreground', + destructive: + 'destructive group border-destructive bg-destructive text-destructive-foreground', + }, + }, + defaultVariants: { + variant: 'default', + }, + }, +) + +const Toast = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef & + VariantProps +>(({ className, variant, ...props }, ref) => { + return ( + + ) +}) +Toast.displayName = ToastPrimitives.Root.displayName + +const ToastAction = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + +)) +ToastAction.displayName = ToastPrimitives.Action.displayName + +const ToastClose = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + + + +)) +ToastClose.displayName = ToastPrimitives.Close.displayName + +const ToastTitle = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + +)) +ToastTitle.displayName = ToastPrimitives.Title.displayName + +const ToastDescription = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + +)) +ToastDescription.displayName = ToastPrimitives.Description.displayName + +type ToastProps = React.ComponentPropsWithoutRef + +type ToastActionElement = React.ReactElement + +export { + type ToastProps, + type ToastActionElement, + ToastProvider, + ToastViewport, + Toast, + ToastTitle, + ToastDescription, + ToastClose, + ToastAction, +} diff --git a/components/ui/toaster.tsx b/components/ui/toaster.tsx new file mode 100644 index 0000000..3b91885 --- /dev/null +++ b/components/ui/toaster.tsx @@ -0,0 +1,35 @@ +'use client' + +import { useToast } from '@/hooks/use-toast' +import { + Toast, + ToastClose, + ToastDescription, + ToastProvider, + ToastTitle, + ToastViewport, +} from '@/components/ui/toast' + +export function Toaster() { + const { toasts } = useToast() + + return ( + + {toasts.map(function ({ id, title, description, action, ...props }) { + return ( + +
+ {title && {title}} + {description && ( + {description} + )} +
+ {action} + +
+ ) + })} + +
+ ) +} diff --git a/hooks/use-toast.ts b/hooks/use-toast.ts new file mode 100644 index 0000000..8932bc5 --- /dev/null +++ b/hooks/use-toast.ts @@ -0,0 +1,191 @@ +'use client' + +// Inspired by react-hot-toast library +import * as React from 'react' + +import type { ToastActionElement, ToastProps } from '@/components/ui/toast' + +const TOAST_LIMIT = 1 +const TOAST_REMOVE_DELAY = 1000000 + +type ToasterToast = ToastProps & { + id: string + title?: React.ReactNode + description?: React.ReactNode + action?: ToastActionElement +} + +const actionTypes = { + ADD_TOAST: 'ADD_TOAST', + UPDATE_TOAST: 'UPDATE_TOAST', + DISMISS_TOAST: 'DISMISS_TOAST', + REMOVE_TOAST: 'REMOVE_TOAST', +} as const + +let count = 0 + +function genId() { + count = (count + 1) % Number.MAX_SAFE_INTEGER + return count.toString() +} + +type ActionType = typeof actionTypes + +type Action = + | { + type: ActionType['ADD_TOAST'] + toast: ToasterToast + } + | { + type: ActionType['UPDATE_TOAST'] + toast: Partial + } + | { + type: ActionType['DISMISS_TOAST'] + toastId?: ToasterToast['id'] + } + | { + type: ActionType['REMOVE_TOAST'] + toastId?: ToasterToast['id'] + } + +interface State { + toasts: ToasterToast[] +} + +const toastTimeouts = new Map>() + +const addToRemoveQueue = (toastId: string) => { + if (toastTimeouts.has(toastId)) { + return + } + + const timeout = setTimeout(() => { + toastTimeouts.delete(toastId) + dispatch({ + type: 'REMOVE_TOAST', + toastId: toastId, + }) + }, TOAST_REMOVE_DELAY) + + toastTimeouts.set(toastId, timeout) +} + +export const reducer = (state: State, action: Action): State => { + switch (action.type) { + case 'ADD_TOAST': + return { + ...state, + toasts: [action.toast, ...state.toasts].slice(0, TOAST_LIMIT), + } + + case 'UPDATE_TOAST': + return { + ...state, + toasts: state.toasts.map((t) => + t.id === action.toast.id ? { ...t, ...action.toast } : t, + ), + } + + case 'DISMISS_TOAST': { + const { toastId } = action + + // ! Side effects ! - This could be extracted into a dismissToast() action, + // but I'll keep it here for simplicity + if (toastId) { + addToRemoveQueue(toastId) + } else { + state.toasts.forEach((toast) => { + addToRemoveQueue(toast.id) + }) + } + + return { + ...state, + toasts: state.toasts.map((t) => + t.id === toastId || toastId === undefined + ? { + ...t, + open: false, + } + : t, + ), + } + } + case 'REMOVE_TOAST': + if (action.toastId === undefined) { + return { + ...state, + toasts: [], + } + } + return { + ...state, + toasts: state.toasts.filter((t) => t.id !== action.toastId), + } + } +} + +const listeners: Array<(state: State) => void> = [] + +let memoryState: State = { toasts: [] } + +function dispatch(action: Action) { + memoryState = reducer(memoryState, action) + listeners.forEach((listener) => { + listener(memoryState) + }) +} + +type Toast = Omit + +function toast({ ...props }: Toast) { + const id = genId() + + const update = (props: ToasterToast) => + dispatch({ + type: 'UPDATE_TOAST', + toast: { ...props, id }, + }) + const dismiss = () => dispatch({ type: 'DISMISS_TOAST', toastId: id }) + + dispatch({ + type: 'ADD_TOAST', + toast: { + ...props, + id, + open: true, + onOpenChange: (open) => { + if (!open) dismiss() + }, + }, + }) + + return { + id: id, + dismiss, + update, + } +} + +function useToast() { + const [state, setState] = React.useState(memoryState) + + React.useEffect(() => { + listeners.push(setState) + return () => { + const index = listeners.indexOf(setState) + if (index > -1) { + listeners.splice(index, 1) + } + } + }, [state]) + + return { + ...state, + toast, + dismiss: (toastId?: string) => dispatch({ type: 'DISMISS_TOAST', toastId }), + } +} + +export { useToast, toast } diff --git a/lib/i18n.tsx b/lib/i18n.tsx new file mode 100644 index 0000000..ac394ba --- /dev/null +++ b/lib/i18n.tsx @@ -0,0 +1,253 @@ +"use client" + +import type React from "react" +import { createContext, useContext, useState, useEffect } from "react" + +type Language = "zh" | "en" + +const translations = { + zh: { + // Header + appName: "2FA 验证器", + appDescription: "安全的双因素认证工具", + + // Timer + nextRefresh: "下次刷新", + + // Search + searchPlaceholder: "搜索令牌...", + + // Add token + addToken: "添加令牌", + addNewToken: "添加新令牌", + addNewTokenDesc: "手动输入密钥或扫描二维码", + manualInput: "手动输入", + scanQr: "扫码", + uploadImage: "上传图片", + otpauthUri: "otpauth URI (可选)", + otpauthUriHint: "粘贴完整的 URI 可自动填充以下信息", + name: "名称", + namePlaceholder: "例如:GitHub", + issuer: "发行者", + issuerPlaceholder: "例如:GitHub Inc.", + secretKey: "密钥", + advancedSettings: "高级设置", + algorithm: "算法", + algorithmDefault: "SHA-1 (默认)", + digits: "验证码位数", + digitsDefault: "6 位 (默认)", + digits8: "8 位", + period: "刷新周期 (秒)", + cancel: "取消", + add: "添加", + save: "保存", + + // Camera + startCamera: "启动相机", + closeCamera: "关闭相机", + scanHint: "将二维码对准框内即可自动识别", + + // Upload + uploadHint: "点击上传二维码图片", + uploadFormats: "支持 PNG, JPG, GIF", + + // Token card + copyCode: "复制验证码", + edit: "编辑", + delete: "删除", + copy: "复制", + + // Empty state + noTokens: "暂无令牌", + noTokensHint: "点击“添加令牌”开始添加您的第一个 2FA 令牌", + + // Edit dialog + editToken: "编辑令牌", + + // Settings + settings: "设置", + settingsDesc: "自定义您的 2FA 验证器", + showCodes: "显示验证码", + showCodesDesc: "默认显示或隐藏验证码", + compactMode: "紧凑模式", + compactModeDesc: "使用更紧凑的列表布局", + sortBy: "排序方式", + sortByName: "按名称", + sortByIssuer: "按发行者", + sortByRecent: "按添加时间", + dataManagement: "数据管理", + exportBackup: "导出备份", + importBackup: "导入备份", + theme: "主题", + themeLight: "浅色", + themeDark: "深色", + themeSystem: "跟随系统", + language: "语言", + + // Toast messages + error: "错误", + fillRequired: "请填写名称和密钥", + addSuccess: "添加成功", + added: "已添加", + deleted: "已删除", + updated: "已更新", + tokenUpdated: "令牌信息已更新", + copied: "已复制", + codeCopied: "的验证码已复制到剪贴板", + cameraFailed: "相机访问失败", + cameraPermission: "请确保已授予相机权限", + imageUploaded: "图片已上传", + imageUploadedHint: "请手动输入二维码中的 otpauth:// URI", + parseSuccess: "解析成功", + extractedInfo: "已从 URI 中提取信息", + parseFailed: "解析失败", + invalidUri: "无效的 otpauth URI", + exportSuccess: "导出成功", + exportedJson: "令牌已导出为 JSON 文件", + importSuccess: "导入成功", + importedTokens: "个令牌", + importFailed: "导入失败", + invalidFormat: "无效的文件格式", + }, + en: { + // Header + appName: "2FA Authenticator", + appDescription: "Secure two-factor authentication tool", + + // Timer + nextRefresh: "Next refresh", + + // Search + searchPlaceholder: "Search tokens...", + + // Add token + addToken: "Add Token", + addNewToken: "Add New Token", + addNewTokenDesc: "Enter secret key manually or scan QR code", + manualInput: "Manual", + scanQr: "Scan", + uploadImage: "Upload", + otpauthUri: "otpauth URI (optional)", + otpauthUriHint: "Paste full URI to auto-fill the form", + name: "Name", + namePlaceholder: "e.g., GitHub", + issuer: "Issuer", + issuerPlaceholder: "e.g., GitHub Inc.", + secretKey: "Secret Key", + advancedSettings: "Advanced Settings", + algorithm: "Algorithm", + algorithmDefault: "SHA-1 (default)", + digits: "Code Length", + digitsDefault: "6 digits (default)", + digits8: "8 digits", + period: "Refresh Period (seconds)", + cancel: "Cancel", + add: "Add", + save: "Save", + + // Camera + startCamera: "Start Camera", + closeCamera: "Close Camera", + scanHint: "Align QR code within the frame", + + // Upload + uploadHint: "Click to upload QR code image", + uploadFormats: "Supports PNG, JPG, GIF", + + // Token card + copyCode: "Copy Code", + edit: "Edit", + delete: "Delete", + copy: "Copy", + + // Empty state + noTokens: "No Tokens", + noTokensHint: 'Click "Add Token" to add your first 2FA token', + + // Edit dialog + editToken: "Edit Token", + + // Settings + settings: "Settings", + settingsDesc: "Customize your 2FA Authenticator", + showCodes: "Show Codes", + showCodesDesc: "Show or hide codes by default", + compactMode: "Compact Mode", + compactModeDesc: "Use a more compact list layout", + sortBy: "Sort By", + sortByName: "By Name", + sortByIssuer: "By Issuer", + sortByRecent: "By Date Added", + dataManagement: "Data Management", + exportBackup: "Export Backup", + importBackup: "Import Backup", + theme: "Theme", + themeLight: "Light", + themeDark: "Dark", + themeSystem: "System", + language: "Language", + + // Toast messages + error: "Error", + fillRequired: "Please fill in name and secret key", + addSuccess: "Success", + added: "Added", + deleted: "Deleted", + updated: "Updated", + tokenUpdated: "Token info updated", + copied: "Copied", + codeCopied: "'s code copied to clipboard", + cameraFailed: "Camera access failed", + cameraPermission: "Please grant camera permission", + imageUploaded: "Image uploaded", + imageUploadedHint: "Please manually enter the otpauth:// URI from the QR code", + parseSuccess: "Parsed successfully", + extractedInfo: "Extracted info from URI", + parseFailed: "Parse failed", + invalidUri: "Invalid otpauth URI", + exportSuccess: "Export successful", + exportedJson: "Tokens exported as JSON file", + importSuccess: "Import successful", + importedTokens: "tokens", + importFailed: "Import failed", + invalidFormat: "Invalid file format", + }, +} + +type Translations = typeof translations.zh + +interface LanguageContextType { + language: Language + setLanguage: (lang: Language) => void + t: Translations +} + +const LanguageContext = createContext(undefined) + +export function LanguageProvider({ children }: { children: React.ReactNode }) { + const [language, setLanguageState] = useState("zh") + + useEffect(() => { + const stored = localStorage.getItem("2fa-language") as Language | null + if (stored) { + setLanguageState(stored) + } + }, []) + + const setLanguage = (lang: Language) => { + localStorage.setItem("2fa-language", lang) + setLanguageState(lang) + } + + const t = translations[language] + + return {children} +} + +export function useLanguage() { + const context = useContext(LanguageContext) + if (!context) { + throw new Error("useLanguage must be used within a LanguageProvider") + } + return context +} diff --git a/lib/utils.ts b/lib/utils.ts new file mode 100644 index 0000000..fed2fe9 --- /dev/null +++ b/lib/utils.ts @@ -0,0 +1,6 @@ +import { clsx, type ClassValue } from 'clsx' +import { twMerge } from 'tailwind-merge' + +export function cn(...inputs: ClassValue[]) { + return twMerge(clsx(inputs)) +} diff --git a/next.config.mjs b/next.config.mjs new file mode 100644 index 0000000..5501ef9 --- /dev/null +++ b/next.config.mjs @@ -0,0 +1,12 @@ +/** @type {import('next').NextConfig} */ +const nextConfig = { + typescript: { + ignoreBuildErrors: true, + }, + images: { + unoptimized: true, + }, + +} + +export default nextConfig \ No newline at end of file diff --git a/package.json b/package.json new file mode 100644 index 0000000..60cce49 --- /dev/null +++ b/package.json @@ -0,0 +1,73 @@ +{ + "name": "my-v0-project", + "version": "0.1.0", + "private": true, + "scripts": { + "build": "next build", + "dev": "next dev", + "lint": "eslint .", + "start": "next start" + }, + "dependencies": { + "@hookform/resolvers": "^3.10.0", + "@radix-ui/react-accordion": "1.2.2", + "@radix-ui/react-alert-dialog": "1.1.4", + "@radix-ui/react-aspect-ratio": "1.1.1", + "@radix-ui/react-avatar": "1.1.2", + "@radix-ui/react-checkbox": "1.1.3", + "@radix-ui/react-collapsible": "1.1.2", + "@radix-ui/react-context-menu": "2.2.4", + "@radix-ui/react-dialog": "1.1.4", + "@radix-ui/react-dropdown-menu": "2.1.4", + "@radix-ui/react-hover-card": "1.1.4", + "@radix-ui/react-label": "2.1.1", + "@radix-ui/react-menubar": "1.1.4", + "@radix-ui/react-navigation-menu": "1.2.3", + "@radix-ui/react-popover": "1.1.4", + "@radix-ui/react-progress": "1.1.1", + "@radix-ui/react-radio-group": "1.2.2", + "@radix-ui/react-scroll-area": "1.2.2", + "@radix-ui/react-select": "2.1.4", + "@radix-ui/react-separator": "1.1.1", + "@radix-ui/react-slider": "1.2.2", + "@radix-ui/react-slot": "1.1.1", + "@radix-ui/react-switch": "1.1.2", + "@radix-ui/react-tabs": "1.1.2", + "@radix-ui/react-toast": "1.2.4", + "@radix-ui/react-toggle": "1.1.1", + "@radix-ui/react-toggle-group": "1.1.1", + "@radix-ui/react-tooltip": "1.1.6", + "@vercel/analytics": "1.3.1", + "autoprefixer": "^10.4.20", + "class-variance-authority": "^0.7.1", + "clsx": "^2.1.1", + "cmdk": "1.0.4", + "date-fns": "4.1.0", + "embla-carousel-react": "8.5.1", + "input-otp": "1.4.1", + "lucide-react": "^0.454.0", + "next": "16.0.10", + "next-themes": "^0.4.6", + "react": "19.2.0", + "react-day-picker": "9.8.0", + "react-dom": "19.2.0", + "react-hook-form": "^7.60.0", + "react-resizable-panels": "^2.1.7", + "recharts": "2.15.4", + "sonner": "^1.7.4", + "tailwind-merge": "^3.3.1", + "tailwindcss-animate": "^1.0.7", + "vaul": "^1.1.2", + "zod": "3.25.76" + }, + "devDependencies": { + "@tailwindcss/postcss": "^4.1.9", + "@types/node": "^22", + "@types/react": "^19", + "@types/react-dom": "^19", + "postcss": "^8.5", + "tailwindcss": "^4.1.9", + "tw-animate-css": "1.3.3", + "typescript": "^5" + } +} \ No newline at end of file diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml new file mode 100644 index 0000000..213f3e0 --- /dev/null +++ b/pnpm-lock.yaml @@ -0,0 +1,3225 @@ +lockfileVersion: '9.0' + +settings: + autoInstallPeers: true + excludeLinksFromLockfile: false + +importers: + + .: + dependencies: + '@hookform/resolvers': + specifier: ^3.10.0 + version: 3.10.0(react-hook-form@7.60.0(react@19.2.0)) + '@radix-ui/react-accordion': + specifier: 1.2.2 + version: 1.2.2(@types/react-dom@19.0.0)(@types/react@19.0.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-alert-dialog': + specifier: 1.1.4 + version: 1.1.4(@types/react-dom@19.0.0)(@types/react@19.0.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-aspect-ratio': + specifier: 1.1.1 + version: 1.1.1(@types/react-dom@19.0.0)(@types/react@19.0.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-avatar': + specifier: 1.1.2 + version: 1.1.2(@types/react-dom@19.0.0)(@types/react@19.0.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-checkbox': + specifier: 1.1.3 + version: 1.1.3(@types/react-dom@19.0.0)(@types/react@19.0.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-collapsible': + specifier: 1.1.2 + version: 1.1.2(@types/react-dom@19.0.0)(@types/react@19.0.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-context-menu': + specifier: 2.2.4 + version: 2.2.4(@types/react-dom@19.0.0)(@types/react@19.0.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-dialog': + specifier: 1.1.4 + version: 1.1.4(@types/react-dom@19.0.0)(@types/react@19.0.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-dropdown-menu': + specifier: 2.1.4 + version: 2.1.4(@types/react-dom@19.0.0)(@types/react@19.0.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-hover-card': + specifier: 1.1.4 + version: 1.1.4(@types/react-dom@19.0.0)(@types/react@19.0.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-label': + specifier: 2.1.1 + version: 2.1.1(@types/react-dom@19.0.0)(@types/react@19.0.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-menubar': + specifier: 1.1.4 + version: 1.1.4(@types/react-dom@19.0.0)(@types/react@19.0.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-navigation-menu': + specifier: 1.2.3 + version: 1.2.3(@types/react-dom@19.0.0)(@types/react@19.0.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-popover': + specifier: 1.1.4 + version: 1.1.4(@types/react-dom@19.0.0)(@types/react@19.0.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-progress': + specifier: 1.1.1 + version: 1.1.1(@types/react-dom@19.0.0)(@types/react@19.0.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-radio-group': + specifier: 1.2.2 + version: 1.2.2(@types/react-dom@19.0.0)(@types/react@19.0.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-scroll-area': + specifier: 1.2.2 + version: 1.2.2(@types/react-dom@19.0.0)(@types/react@19.0.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-select': + specifier: 2.1.4 + version: 2.1.4(@types/react-dom@19.0.0)(@types/react@19.0.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-separator': + specifier: 1.1.1 + version: 1.1.1(@types/react-dom@19.0.0)(@types/react@19.0.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-slider': + specifier: 1.2.2 + version: 1.2.2(@types/react-dom@19.0.0)(@types/react@19.0.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-slot': + specifier: 1.1.1 + version: 1.1.1(@types/react@19.0.0)(react@19.2.0) + '@radix-ui/react-switch': + specifier: 1.1.2 + version: 1.1.2(@types/react-dom@19.0.0)(@types/react@19.0.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-tabs': + specifier: 1.1.2 + version: 1.1.2(@types/react-dom@19.0.0)(@types/react@19.0.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-toast': + specifier: 1.2.4 + version: 1.2.4(@types/react-dom@19.0.0)(@types/react@19.0.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-toggle': + specifier: 1.1.1 + version: 1.1.1(@types/react-dom@19.0.0)(@types/react@19.0.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-toggle-group': + specifier: 1.1.1 + version: 1.1.1(@types/react-dom@19.0.0)(@types/react@19.0.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-tooltip': + specifier: 1.1.6 + version: 1.1.6(@types/react-dom@19.0.0)(@types/react@19.0.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@vercel/analytics': + specifier: 1.3.1 + version: 1.3.1(next@16.0.10(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react@19.2.0) + autoprefixer: + specifier: ^10.4.20 + version: 10.4.20(postcss@8.5.0) + class-variance-authority: + specifier: ^0.7.1 + version: 0.7.1 + clsx: + specifier: ^2.1.1 + version: 2.1.1 + cmdk: + specifier: 1.0.4 + version: 1.0.4(@types/react-dom@19.0.0)(@types/react@19.0.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + date-fns: + specifier: 4.1.0 + version: 4.1.0 + embla-carousel-react: + specifier: 8.5.1 + version: 8.5.1(react@19.2.0) + input-otp: + specifier: 1.4.1 + version: 1.4.1(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + lucide-react: + specifier: ^0.454.0 + version: 0.454.0(react@19.2.0) + next: + specifier: 16.0.10 + version: 16.0.10(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + next-themes: + specifier: ^0.4.6 + version: 0.4.6(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + react: + specifier: 19.2.0 + version: 19.2.0 + react-day-picker: + specifier: 9.8.0 + version: 9.8.0(react@19.2.0) + react-dom: + specifier: 19.2.0 + version: 19.2.0(react@19.2.0) + react-hook-form: + specifier: ^7.60.0 + version: 7.60.0(react@19.2.0) + react-resizable-panels: + specifier: ^2.1.7 + version: 2.1.7(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + recharts: + specifier: 2.15.4 + version: 2.15.4(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + sonner: + specifier: ^1.7.4 + version: 1.7.4(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + tailwind-merge: + specifier: ^3.3.1 + version: 3.3.1 + tailwindcss-animate: + specifier: ^1.0.7 + version: 1.0.7(tailwindcss@4.1.9) + vaul: + specifier: ^1.1.2 + version: 1.1.2(@types/react-dom@19.0.0)(@types/react@19.0.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + zod: + specifier: 3.25.76 + version: 3.25.76 + devDependencies: + '@tailwindcss/postcss': + specifier: ^4.1.9 + version: 4.1.9 + '@types/node': + specifier: ^22 + version: 22.0.0 + '@types/react': + specifier: ^19 + version: 19.0.0 + '@types/react-dom': + specifier: ^19 + version: 19.0.0 + postcss: + specifier: ^8.5 + version: 8.5.0 + tailwindcss: + specifier: ^4.1.9 + version: 4.1.9 + tw-animate-css: + specifier: 1.3.3 + version: 1.3.3 + typescript: + specifier: ^5 + version: 5.0.2 + +packages: + + '@alloc/quick-lru@5.2.0': + resolution: {integrity: sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==} + engines: {node: '>=10'} + + '@ampproject/remapping@2.3.0': + resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==} + engines: {node: '>=6.0.0'} + + '@babel/runtime@7.28.6': + resolution: {integrity: sha512-05WQkdpL9COIMz4LjTxGpPNCdlpyimKppYNoJ5Di5EUObifl8t4tuLuUBBZEpoLYOmfvIWrsp9fCl0HoPRVTdA==} + engines: {node: '>=6.9.0'} + + '@date-fns/tz@1.2.0': + resolution: {integrity: sha512-LBrd7MiJZ9McsOgxqWX7AaxrDjcFVjWH/tIKJd7pnR7McaslGYOP1QmmiBXdJH/H/yLCT+rcQ7FaPBUxRGUtrg==} + + '@emnapi/runtime@1.8.1': + resolution: {integrity: sha512-mehfKSMWjjNol8659Z8KxEMrdSJDDot5SXMq00dM8BN4o+CLNXQ0xH2V7EchNHV4RmbZLmmPdEaXZc5H2FXmDg==} + + '@floating-ui/core@1.7.3': + resolution: {integrity: sha512-sGnvb5dmrJaKEZ+LDIpguvdX3bDlEllmv4/ClQ9awcmCZrlx5jQyyMWFM5kBI+EyNOCDDiKk8il0zeuX3Zlg/w==} + + '@floating-ui/dom@1.7.4': + resolution: {integrity: sha512-OOchDgh4F2CchOX94cRVqhvy7b3AFb+/rQXyswmzmGakRfkMgoWVjfnLWkRirfLEfuD4ysVW16eXzwt3jHIzKA==} + + '@floating-ui/react-dom@2.1.6': + resolution: {integrity: sha512-4JX6rEatQEvlmgU80wZyq9RT96HZJa88q8hp0pBd+LrczeDI4o6uA2M+uvxngVHo4Ihr8uibXxH6+70zhAFrVw==} + peerDependencies: + react: '>=16.8.0' + react-dom: '>=16.8.0' + + '@floating-ui/utils@0.2.10': + resolution: {integrity: sha512-aGTxbpbg8/b5JfU1HXSrbH3wXZuLPJcNEcZQFMxLs3oSzgtVu6nFPkbbGGUvBcUjKV2YyB9Wxxabo+HEH9tcRQ==} + + '@hookform/resolvers@3.10.0': + resolution: {integrity: sha512-79Dv+3mDF7i+2ajj7SkypSKHhl1cbln1OGavqrsF7p6mbUv11xpqpacPsGDCTRvCSjEEIez2ef1NveSVL3b0Ag==} + peerDependencies: + react-hook-form: ^7.0.0 + + '@img/colour@1.0.0': + resolution: {integrity: sha512-A5P/LfWGFSl6nsckYtjw9da+19jB8hkJ6ACTGcDfEJ0aE+l2n2El7dsVM7UVHZQ9s2lmYMWlrS21YLy2IR1LUw==} + engines: {node: '>=18'} + + '@img/sharp-darwin-arm64@0.34.5': + resolution: {integrity: sha512-imtQ3WMJXbMY4fxb/Ndp6HBTNVtWCUI0WdobyheGf5+ad6xX8VIDO8u2xE4qc/fr08CKG/7dDseFtn6M6g/r3w==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [arm64] + os: [darwin] + + '@img/sharp-darwin-x64@0.34.5': + resolution: {integrity: sha512-YNEFAF/4KQ/PeW0N+r+aVVsoIY0/qxxikF2SWdp+NRkmMB7y9LBZAVqQ4yhGCm/H3H270OSykqmQMKLBhBJDEw==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [x64] + os: [darwin] + + '@img/sharp-libvips-darwin-arm64@1.2.4': + resolution: {integrity: sha512-zqjjo7RatFfFoP0MkQ51jfuFZBnVE2pRiaydKJ1G/rHZvnsrHAOcQALIi9sA5co5xenQdTugCvtb1cuf78Vf4g==} + cpu: [arm64] + os: [darwin] + + '@img/sharp-libvips-darwin-x64@1.2.4': + resolution: {integrity: sha512-1IOd5xfVhlGwX+zXv2N93k0yMONvUlANylbJw1eTah8K/Jtpi15KC+WSiaX/nBmbm2HxRM1gZ0nSdjSsrZbGKg==} + cpu: [x64] + os: [darwin] + + '@img/sharp-libvips-linux-arm64@1.2.4': + resolution: {integrity: sha512-excjX8DfsIcJ10x1Kzr4RcWe1edC9PquDRRPx3YVCvQv+U5p7Yin2s32ftzikXojb1PIFc/9Mt28/y+iRklkrw==} + cpu: [arm64] + os: [linux] + + '@img/sharp-libvips-linux-arm@1.2.4': + resolution: {integrity: sha512-bFI7xcKFELdiNCVov8e44Ia4u2byA+l3XtsAj+Q8tfCwO6BQ8iDojYdvoPMqsKDkuoOo+X6HZA0s0q11ANMQ8A==} + cpu: [arm] + os: [linux] + + '@img/sharp-libvips-linux-ppc64@1.2.4': + resolution: {integrity: sha512-FMuvGijLDYG6lW+b/UvyilUWu5Ayu+3r2d1S8notiGCIyYU/76eig1UfMmkZ7vwgOrzKzlQbFSuQfgm7GYUPpA==} + cpu: [ppc64] + os: [linux] + + '@img/sharp-libvips-linux-riscv64@1.2.4': + resolution: {integrity: sha512-oVDbcR4zUC0ce82teubSm+x6ETixtKZBh/qbREIOcI3cULzDyb18Sr/Wcyx7NRQeQzOiHTNbZFF1UwPS2scyGA==} + cpu: [riscv64] + os: [linux] + + '@img/sharp-libvips-linux-s390x@1.2.4': + resolution: {integrity: sha512-qmp9VrzgPgMoGZyPvrQHqk02uyjA0/QrTO26Tqk6l4ZV0MPWIW6LTkqOIov+J1yEu7MbFQaDpwdwJKhbJvuRxQ==} + cpu: [s390x] + os: [linux] + + '@img/sharp-libvips-linux-x64@1.2.4': + resolution: {integrity: sha512-tJxiiLsmHc9Ax1bz3oaOYBURTXGIRDODBqhveVHonrHJ9/+k89qbLl0bcJns+e4t4rvaNBxaEZsFtSfAdquPrw==} + cpu: [x64] + os: [linux] + + '@img/sharp-libvips-linuxmusl-arm64@1.2.4': + resolution: {integrity: sha512-FVQHuwx1IIuNow9QAbYUzJ+En8KcVm9Lk5+uGUQJHaZmMECZmOlix9HnH7n1TRkXMS0pGxIJokIVB9SuqZGGXw==} + cpu: [arm64] + os: [linux] + + '@img/sharp-libvips-linuxmusl-x64@1.2.4': + resolution: {integrity: sha512-+LpyBk7L44ZIXwz/VYfglaX/okxezESc6UxDSoyo2Ks6Jxc4Y7sGjpgU9s4PMgqgjj1gZCylTieNamqA1MF7Dg==} + cpu: [x64] + os: [linux] + + '@img/sharp-linux-arm64@0.34.5': + resolution: {integrity: sha512-bKQzaJRY/bkPOXyKx5EVup7qkaojECG6NLYswgktOZjaXecSAeCWiZwwiFf3/Y+O1HrauiE3FVsGxFg8c24rZg==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [arm64] + os: [linux] + + '@img/sharp-linux-arm@0.34.5': + resolution: {integrity: sha512-9dLqsvwtg1uuXBGZKsxem9595+ujv0sJ6Vi8wcTANSFpwV/GONat5eCkzQo/1O6zRIkh0m/8+5BjrRr7jDUSZw==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [arm] + os: [linux] + + '@img/sharp-linux-ppc64@0.34.5': + resolution: {integrity: sha512-7zznwNaqW6YtsfrGGDA6BRkISKAAE1Jo0QdpNYXNMHu2+0dTrPflTLNkpc8l7MUP5M16ZJcUvysVWWrMefZquA==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [ppc64] + os: [linux] + + '@img/sharp-linux-riscv64@0.34.5': + resolution: {integrity: sha512-51gJuLPTKa7piYPaVs8GmByo7/U7/7TZOq+cnXJIHZKavIRHAP77e3N2HEl3dgiqdD/w0yUfiJnII77PuDDFdw==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [riscv64] + os: [linux] + + '@img/sharp-linux-s390x@0.34.5': + resolution: {integrity: sha512-nQtCk0PdKfho3eC5MrbQoigJ2gd1CgddUMkabUj+rBevs8tZ2cULOx46E7oyX+04WGfABgIwmMC0VqieTiR4jg==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [s390x] + os: [linux] + + '@img/sharp-linux-x64@0.34.5': + resolution: {integrity: sha512-MEzd8HPKxVxVenwAa+JRPwEC7QFjoPWuS5NZnBt6B3pu7EG2Ge0id1oLHZpPJdn3OQK+BQDiw9zStiHBTJQQQQ==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [x64] + os: [linux] + + '@img/sharp-linuxmusl-arm64@0.34.5': + resolution: {integrity: sha512-fprJR6GtRsMt6Kyfq44IsChVZeGN97gTD331weR1ex1c1rypDEABN6Tm2xa1wE6lYb5DdEnk03NZPqA7Id21yg==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [arm64] + os: [linux] + + '@img/sharp-linuxmusl-x64@0.34.5': + resolution: {integrity: sha512-Jg8wNT1MUzIvhBFxViqrEhWDGzqymo3sV7z7ZsaWbZNDLXRJZoRGrjulp60YYtV4wfY8VIKcWidjojlLcWrd8Q==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [x64] + os: [linux] + + '@img/sharp-wasm32@0.34.5': + resolution: {integrity: sha512-OdWTEiVkY2PHwqkbBI8frFxQQFekHaSSkUIJkwzclWZe64O1X4UlUjqqqLaPbUpMOQk6FBu/HtlGXNblIs0huw==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [wasm32] + + '@img/sharp-win32-arm64@0.34.5': + resolution: {integrity: sha512-WQ3AgWCWYSb2yt+IG8mnC6Jdk9Whs7O0gxphblsLvdhSpSTtmu69ZG1Gkb6NuvxsNACwiPV6cNSZNzt0KPsw7g==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [arm64] + os: [win32] + + '@img/sharp-win32-ia32@0.34.5': + resolution: {integrity: sha512-FV9m/7NmeCmSHDD5j4+4pNI8Cp3aW+JvLoXcTUo0IqyjSfAZJ8dIUmijx1qaJsIiU+Hosw6xM5KijAWRJCSgNg==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [ia32] + os: [win32] + + '@img/sharp-win32-x64@0.34.5': + resolution: {integrity: sha512-+29YMsqY2/9eFEiW93eqWnuLcWcufowXewwSNIT6UwZdUUCrM3oFjMWH/Z6/TMmb4hlFenmfAVbpWeup2jryCw==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [x64] + os: [win32] + + '@isaacs/fs-minipass@4.0.1': + resolution: {integrity: sha512-wgm9Ehl2jpeqP3zw/7mo3kRHFp5MEDhqAdwy1fTGkHAwnkGOVsgpvQhL8B5n1qlb01jV3n/bI0ZfZp5lWA1k4w==} + engines: {node: '>=18.0.0'} + + '@jridgewell/gen-mapping@0.3.13': + resolution: {integrity: sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==} + + '@jridgewell/resolve-uri@3.1.2': + resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} + engines: {node: '>=6.0.0'} + + '@jridgewell/sourcemap-codec@1.5.5': + resolution: {integrity: sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==} + + '@jridgewell/trace-mapping@0.3.31': + resolution: {integrity: sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==} + + '@next/env@16.0.10': + resolution: {integrity: sha512-8tuaQkyDVgeONQ1MeT9Mkk8pQmZapMKFh5B+OrFUlG3rVmYTXcXlBetBgTurKXGaIZvkoqRT9JL5K3phXcgang==} + + '@next/swc-darwin-arm64@16.0.10': + resolution: {integrity: sha512-4XgdKtdVsaflErz+B5XeG0T5PeXKDdruDf3CRpnhN+8UebNa5N2H58+3GDgpn/9GBurrQ1uWW768FfscwYkJRg==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [darwin] + + '@next/swc-darwin-x64@16.0.10': + resolution: {integrity: sha512-spbEObMvRKkQ3CkYVOME+ocPDFo5UqHb8EMTS78/0mQ+O1nqE8toHJVioZo4TvebATxgA8XMTHHrScPrn68OGw==} + engines: {node: '>= 10'} + cpu: [x64] + os: [darwin] + + '@next/swc-linux-arm64-gnu@16.0.10': + resolution: {integrity: sha512-uQtWE3X0iGB8apTIskOMi2w/MKONrPOUCi5yLO+v3O8Mb5c7K4Q5KD1jvTpTF5gJKa3VH/ijKjKUq9O9UhwOYw==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [linux] + + '@next/swc-linux-arm64-musl@16.0.10': + resolution: {integrity: sha512-llA+hiDTrYvyWI21Z0L1GiXwjQaanPVQQwru5peOgtooeJ8qx3tlqRV2P7uH2pKQaUfHxI/WVarvI5oYgGxaTw==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [linux] + + '@next/swc-linux-x64-gnu@16.0.10': + resolution: {integrity: sha512-AK2q5H0+a9nsXbeZ3FZdMtbtu9jxW4R/NgzZ6+lrTm3d6Zb7jYrWcgjcpM1k8uuqlSy4xIyPR2YiuUr+wXsavA==} + engines: {node: '>= 10'} + cpu: [x64] + os: [linux] + + '@next/swc-linux-x64-musl@16.0.10': + resolution: {integrity: sha512-1TDG9PDKivNw5550S111gsO4RGennLVl9cipPhtkXIFVwo31YZ73nEbLjNC8qG3SgTz/QZyYyaFYMeY4BKZR/g==} + engines: {node: '>= 10'} + cpu: [x64] + os: [linux] + + '@next/swc-win32-arm64-msvc@16.0.10': + resolution: {integrity: sha512-aEZIS4Hh32xdJQbHz121pyuVZniSNoqDVx1yIr2hy+ZwJGipeqnMZBJHyMxv2tiuAXGx6/xpTcQJ6btIiBjgmg==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [win32] + + '@next/swc-win32-x64-msvc@16.0.10': + resolution: {integrity: sha512-E+njfCoFLb01RAFEnGZn6ERoOqhK1Gl3Lfz1Kjnj0Ulfu7oJbuMyvBKNj/bw8XZnenHDASlygTjZICQW+rYW1Q==} + engines: {node: '>= 10'} + cpu: [x64] + os: [win32] + + '@radix-ui/number@1.1.0': + resolution: {integrity: sha512-V3gRzhVNU1ldS5XhAPTom1fOIo4ccrjjJgmE+LI2h/WaFpHmx0MQApT+KZHnx8abG6Avtfcz4WoEciMnpFT3HQ==} + + '@radix-ui/primitive@1.1.1': + resolution: {integrity: sha512-SJ31y+Q/zAyShtXJc8x83i9TYdbAfHZ++tUZnvjJJqFjzsdUnKsxPL6IEtBlxKkU7yzer//GQtZSV4GbldL3YA==} + + '@radix-ui/react-accordion@1.2.2': + resolution: {integrity: sha512-b1oh54x4DMCdGsB4/7ahiSrViXxaBwRPotiZNnYXjLha9vfuURSAZErki6qjDoSIV0eXx5v57XnTGVtGwnfp2g==} + 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-alert-dialog@1.1.4': + resolution: {integrity: sha512-A6Kh23qZDLy3PSU4bh2UJZznOrUdHImIXqF8YtUa6CN73f8EOO9XlXSCd9IHyPvIquTaa/kwaSWzZTtUvgXVGw==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-arrow@1.1.1': + resolution: {integrity: sha512-NaVpZfmv8SKeZbn4ijN2V3jlHA9ngBG16VnIIm22nUR0Yk8KUALyBxT3KYEUnNuch9sTE8UTsS3whzBgKOL30w==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-aspect-ratio@1.1.1': + resolution: {integrity: sha512-kNU4FIpcFMBLkOUcgeIteH06/8JLBcYY6Le1iKenDGCYNYFX3TQqCZjzkOsz37h7r94/99GTb7YhEr98ZBJibw==} + 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-avatar@1.1.2': + resolution: {integrity: sha512-GaC7bXQZ5VgZvVvsJ5mu/AEbjYLnhhkoidOboC50Z6FFlLA03wG2ianUoH+zgDQ31/9gCF59bE4+2bBgTyMiig==} + 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-checkbox@1.1.3': + resolution: {integrity: sha512-HD7/ocp8f1B3e6OHygH0n7ZKjONkhciy1Nh0yuBgObqThc3oyx+vuMfFHKAknXRHHWVE9XvXStxJFyjUmB8PIw==} + 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-collapsible@1.1.2': + resolution: {integrity: sha512-PliMB63vxz7vggcyq0IxNYk8vGDrLXVWw4+W4B8YnwI1s18x7YZYqlG9PLX7XxAJUi0g2DxP4XKJMFHh/iVh9A==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-collection@1.1.1': + resolution: {integrity: sha512-LwT3pSho9Dljg+wY2KN2mrrh6y3qELfftINERIzBUO9e0N+t0oMTyn3k9iv+ZqgrwGkRnLpNJrsMv9BZlt2yuA==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-compose-refs@1.1.1': + resolution: {integrity: sha512-Y9VzoRDSJtgFMUCoiZBDVo084VQ5hfpXxVE+NgkdNsjiDBByiImMZKKhxMwCbdHvhlENG6a833CbFkOQvTricw==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-compose-refs@1.1.2': + resolution: {integrity: sha512-z4eqJvfiNnFMHIIvXP3CY57y2WJs5g2v3X0zm9mEJkrkNv4rDxu+sg9Jh8EkXyeqBkB7SOcboo9dMVqhyrACIg==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-context-menu@2.2.4': + resolution: {integrity: sha512-ap4wdGwK52rJxGkwukU1NrnEodsUFQIooANKu+ey7d6raQ2biTcEf8za1zr0mgFHieevRTB2nK4dJeN8pTAZGQ==} + 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-context@1.1.1': + resolution: {integrity: sha512-UASk9zi+crv9WteK/NU4PLvOoL3OuE6BWVKNF6hPRBtYBDXQ2u5iu3O59zUlJiTVvkyuycnqrztsHVJwcK9K+Q==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-dialog@1.1.4': + resolution: {integrity: sha512-Ur7EV1IwQGCyaAuyDRiOLA5JIUZxELJljF+MbM/2NC0BYwfuRrbpS30BiQBJrVruscgUkieKkqXYDOoByaxIoA==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-direction@1.1.0': + resolution: {integrity: sha512-BUuBvgThEiAXh2DWu93XsT+a3aWrGqolGlqqw5VU1kG7p/ZH2cuDlM1sRLNnY3QcBS69UIz2mcKhMxDsdewhjg==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-dismissable-layer@1.1.3': + resolution: {integrity: sha512-onrWn/72lQoEucDmJnr8uczSNTujT0vJnA/X5+3AkChVPowr8n1yvIKIabhWyMQeMvvmdpsvcyDqx3X1LEXCPg==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-dropdown-menu@2.1.4': + resolution: {integrity: sha512-iXU1Ab5ecM+yEepGAWK8ZhMyKX4ubFdCNtol4sT9D0OVErG9PNElfx3TQhjw7n7BC5nFVz68/5//clWy+8TXzA==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-focus-guards@1.1.1': + resolution: {integrity: sha512-pSIwfrT1a6sIoDASCSpFwOasEwKTZWDw/iBdtnqKO7v6FeOzYJ7U53cPzYFVR3geGGXgVHaH+CdngrrAzqUGxg==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-focus-scope@1.1.1': + resolution: {integrity: sha512-01omzJAYRxXdG2/he/+xy+c8a8gCydoQ1yOxnWNcRhrrBW5W+RQJ22EK1SaO8tb3WoUsuEw7mJjBozPzihDFjA==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-hover-card@1.1.4': + resolution: {integrity: sha512-QSUUnRA3PQ2UhvoCv3eYvMnCAgGQW+sTu86QPuNb+ZMi+ZENd6UWpiXbcWDQ4AEaKF9KKpCHBeaJz9Rw6lRlaQ==} + 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.1': + resolution: {integrity: sha512-UUw5E4e/2+4kFMH7+YxORXGWggtY6sM8WIwh5RZchhLuUg2H1hc98Py+pr8HMz6rdaYrK2t296ZEjYLOCO5uUw==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-menu@2.1.4': + resolution: {integrity: sha512-BnOgVoL6YYdHAG6DtXONaR29Eq4nvbi8rutrV/xlr3RQCMMb3yqP85Qiw/3NReozrSW+4dfLkK+rc1hb4wPU/A==} + 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.4': + resolution: {integrity: sha512-+KMpi7VAZuB46+1LD7a30zb5IxyzLgC8m8j42gk3N4TUCcViNQdX8FhoH1HDvYiA8quuqcek4R4bYpPn/SY1GA==} + 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.3': + resolution: {integrity: sha512-IQWAsQ7dsLIYDrn0WqPU+cdM7MONTv9nqrLVYoie3BPiabSfUVDe6Fr+oEt0Cofsr9ONDcDe9xhmJbL1Uq1yKg==} + 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.4': + resolution: {integrity: sha512-aUACAkXx8LaFymDma+HQVji7WhvEhpFJ7+qPz17Nf4lLZqtreGOFRiNQWQmhzp7kEWg9cOyyQJpdIMUMPc/CPw==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-popper@1.2.1': + resolution: {integrity: sha512-3kn5Me69L+jv82EKRuQCXdYyf1DqHwD2U/sxoNgBGCB7K9TRc3bQamQ+5EPM9EvyPdli0W41sROd+ZU1dTCztw==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-portal@1.1.3': + resolution: {integrity: sha512-NciRqhXnGojhT93RPyDaMPfLH3ZSl4jjIFbZQ1b/vxvZEdHsBZ49wP9w8L3HzUQwep01LcWtkUvm0OVB5JAHTw==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-presence@1.1.2': + resolution: {integrity: sha512-18TFr80t5EVgL9x1SwF/YGtfG+l0BS0PRAlCWBDoBEiDQjeKgnNZRVJp/oVBl24sr3Gbfwc/Qpj4OcWTQMsAEg==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-primitive@2.0.1': + resolution: {integrity: sha512-sHCWTtxwNn3L3fH8qAfnF3WbUZycW93SM1j3NFDzXBiz8D6F5UTTy8G1+WFEaiCdvCVRJWj6N2R4Xq6HdiHmDg==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-primitive@2.1.4': + resolution: {integrity: sha512-9hQc4+GNVtJAIEPEqlYqW5RiYdrr8ea5XQ0ZOnD6fgru+83kqT15mq2OCcbe8KnjRZl5vF3ks69AKz3kh1jrhg==} + 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.1': + resolution: {integrity: sha512-6diOawA84f/eMxFHcWut0aE1C2kyE9dOyCTQOMRR2C/qPiXz/X0SaiA/RLbapQaXUCmy0/hLMf9meSccD1N0pA==} + 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.2.2': + resolution: {integrity: sha512-E0MLLGfOP0l8P/NxgVzfXJ8w3Ch8cdO6UDzJfDChu4EJDy+/WdO5LqpdY8PYnCErkmZH3gZhDL1K7kQ41fAHuQ==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-roving-focus@1.1.1': + resolution: {integrity: sha512-QE1RoxPGJ/Nm8Qmk0PxP8ojmoaS67i0s7hVssS7KuI2FQoc/uzVlZsqKfQvxPE6D8hICCPHJ4D88zNhT3OOmkw==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-scroll-area@1.2.2': + resolution: {integrity: sha512-EFI1N/S3YxZEW/lJ/H1jY3njlvTd8tBmgKEn4GHi51+aMm94i6NmAJstsm5cu3yJwYqYc93gpCPm21FeAbFk6g==} + 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.1.4': + resolution: {integrity: sha512-pOkb2u8KgO47j/h7AylCj7dJsm69BXcjkrvTqMptFqsE2i0p8lHkfgneXKjAgPzBMivnoMyt8o4KiV4wYzDdyQ==} + 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.1': + resolution: {integrity: sha512-RRiNRSrD8iUiXriq/Y5n4/3iE8HzqgLHsusUSg5jVpU2+3tqcUFPJXHDymwEypunc2sWxDUS3UC+rkZRlHedsw==} + 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.2.2': + resolution: {integrity: sha512-sNlU06ii1/ZcbHf8I9En54ZPW0Vil/yPVg4vQMcFNjrIx51jsHbFl1HYHQvCIWJSr1q0ZmA+iIs/ZTv8h7HHSA==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-slot@1.1.1': + resolution: {integrity: sha512-RApLLOcINYJA+dMVbOju7MYv1Mb2EBp2nH4HdDzXTSyaR5optlm6Otrz1euW3HbdOR8UmmFK06TD+A9frYWv+g==} + peerDependencies: + '@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.4': + resolution: {integrity: sha512-Jl+bCv8HxKnlTLVrcDE8zTMJ09R9/ukw4qBs/oZClOfoQk/cOTbDn+NceXfV7j09YPVQUryJPHurafcSg6EVKA==} + 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.1.2': + resolution: {integrity: sha512-zGukiWHjEdBCRyXvKR6iXAQG6qXm2esuAD6kDOi9Cn+1X6ev3ASo4+CsYaD6Fov9r/AQFekqnD/7+V0Cs6/98g==} + 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.2': + resolution: {integrity: sha512-9u/tQJMcC2aGq7KXpGivMm1mgq7oRJKXphDwdypPd/j21j/2znamPU8WkXgnhUaTrSFNIt8XhOyCAupg8/GbwQ==} + 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.4': + resolution: {integrity: sha512-Sch9idFJHJTMH9YNpxxESqABcAFweJG4tKv+0zo0m5XBvUSL8FM5xKcJLFLXononpePs8IclyX1KieL5SDUNgA==} + 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.1': + resolution: {integrity: sha512-OgDLZEA30Ylyz8YSXvnGqIHtERqnUt1KUYTKdw/y8u7Ci6zGiJfXc02jahmcSNK3YcErqioj/9flWC9S1ihfwg==} + 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.1': + resolution: {integrity: sha512-i77tcgObYr743IonC1hrsnnPmszDRn8p+EGUsUt+5a/JFn28fxaM88Py6V2mc8J5kELMWishI0rLnuGLFD/nnQ==} + 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.1.6': + resolution: {integrity: sha512-TLB5D8QLExS1uDn7+wH/bjEmRurNMTzNrtq7IjaS4kjion9NtzsTGkvR5+i7yc9q01Pi2KMM2cN3f8UG4IvvXA==} + 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.0': + resolution: {integrity: sha512-CasTfvsy+frcFkbXtSJ2Zu9JHpN8TYKxkgJGWbjiZhFivxaeW7rMeZt7QELGVLaYVfFMsKHjb7Ak0nMEe+2Vfw==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-use-controllable-state@1.1.0': + resolution: {integrity: sha512-MtfMVJiSr2NjzS0Aa90NPTnvTSg6C/JLCV7ma0W6+OMV78vd8OyRpID+Ng9LxzsPbLeuBnWBA1Nq30AtBIDChw==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-use-escape-keydown@1.1.0': + resolution: {integrity: sha512-L7vwWlR1kTTQ3oh7g1O0CBF3YCyyTj8NmhLR+phShpyA50HCfBFKVJTpshm9PzLiKmehsrQzTYTpX9HvmC9rhw==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-use-layout-effect@1.1.0': + resolution: {integrity: sha512-+FPE0rOdziWSrH9athwI1R0HDVbWlEhd+FR+aSDk4uWGmSJ9Z54sdZVDQPZAinJhJXwfT+qnj969mCsT2gfm5w==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-use-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.0': + resolution: {integrity: sha512-Z/e78qg2YFnnXcW88A4JmTtm4ADckLno6F7OXotmkQfeuCVaKuYzqAATPhVzl3delXE7CxIV8shofPn3jPc5Og==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-use-rect@1.1.0': + resolution: {integrity: sha512-0Fmkebhr6PiseyZlYAOtLS+nb7jLmpqTrJyv61Pe68MKYW6OWdRE2kI70TaYY27u7H0lajqM3hSMMLFq18Z7nQ==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-use-size@1.1.0': + resolution: {integrity: sha512-XW3/vWuIXHa+2Uwcc2ABSfcCledmXhhQPlGbfcRXbiUQI5Icjcg19BGCZVKKInYbvUCut/ufbbLLPFC5cbb1hw==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-visually-hidden@1.1.1': + resolution: {integrity: sha512-vVfA2IZ9q/J+gEamvj761Oq1FpWgCDaNOOIfbPVp2MVPLEomUr5+Vf7kJGwQ24YxZSlQVar7Bes8kyTo5Dshpg==} + 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.0': + resolution: {integrity: sha512-A9+lCBZoaMJlVKcRBz2YByCG+Cp2t6nAnMnNba+XiWxnj6r4JUFqfsgwocMBZU9LPtdxC6wB56ySYpc7LQIoJg==} + + '@swc/helpers@0.5.15': + resolution: {integrity: sha512-JQ5TuMi45Owi4/BIMAJBoSQoOJu12oOk/gADqlcUL9JEdHB8vyjUSsxqeNXnmXHjYKMi2WcYtezGEEhqUI/E2g==} + + '@tailwindcss/node@4.1.9': + resolution: {integrity: sha512-ZFsgw6lbtcZKYPWvf6zAuCVSuer7UQ2Z5P8BETHcpA4x/3NwOjAIXmRnYfG77F14f9bPeuR4GaNz3ji1JkQMeQ==} + + '@tailwindcss/oxide-android-arm64@4.1.9': + resolution: {integrity: sha512-X4mBUUJ3DPqODhtdT5Ju55feJwBN+hP855Z7c0t11Jzece9KRtdM41ljMrCcureKMh96mcOh2gxahkp1yE+BOQ==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [android] + + '@tailwindcss/oxide-darwin-arm64@4.1.9': + resolution: {integrity: sha512-jnWnqz71ZLXUbJLW53m9dSQakLBfaWxAd9TAibimrNdQfZKyie+xGppdDCZExtYwUdflt3kOT9y1JUgYXVEQmw==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [darwin] + + '@tailwindcss/oxide-darwin-x64@4.1.9': + resolution: {integrity: sha512-+Ui6LlvZ6aCPvSwv3l16nYb6gu1N6RamFz7hSu5aqaiPrDQqD1LPT/e8r2/laSVwFjRyOZxQQ/gvGxP3ihA2rw==} + engines: {node: '>= 10'} + cpu: [x64] + os: [darwin] + + '@tailwindcss/oxide-freebsd-x64@4.1.9': + resolution: {integrity: sha512-BWqCh0uoXMprwWfG7+oyPW53VCh6G08pxY0IIN/i5DQTpPnCJ4zm2W8neH9kW1v1f6RXP3b2qQjAzrAcnQ5e9w==} + engines: {node: '>= 10'} + cpu: [x64] + os: [freebsd] + + '@tailwindcss/oxide-linux-arm-gnueabihf@4.1.9': + resolution: {integrity: sha512-U8itjQb5TVc80aV5Yo+JtKo+qS95CV4XLrKEtSLQFoTD/c9j3jk4WZipYT+9Jxqem29qCMRPxjEZ3s+wTT4XCw==} + engines: {node: '>= 10'} + cpu: [arm] + os: [linux] + + '@tailwindcss/oxide-linux-arm64-gnu@4.1.9': + resolution: {integrity: sha512-dKlGraoNvyTrR7ovLw3Id9yTwc+l0NYg8bwOkYqk+zltvGns8bPvVr6PH5jATdc75kCGd6kDRmP4p1LwqCnPJQ==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [linux] + + '@tailwindcss/oxide-linux-arm64-musl@4.1.9': + resolution: {integrity: sha512-qCZ4QTrZaBEgNM13pGjvakdmid1Kw3CUCEQzgVAn64Iud7zSxOGwK1usg+hrwrOfFH7vXZZr8OhzC8fJTRq5NA==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [linux] + + '@tailwindcss/oxide-linux-x64-gnu@4.1.9': + resolution: {integrity: sha512-bmzkAWQjRlY9udmg/a1bOtZpV14ZCdrB74PZrd7Oz/wK62Rk+m9+UV3BsgGfOghyO5Qu5ZDciADzDMZbi9n1+g==} + engines: {node: '>= 10'} + cpu: [x64] + os: [linux] + + '@tailwindcss/oxide-linux-x64-musl@4.1.9': + resolution: {integrity: sha512-NpvPQsXj1raDHhd+g2SUvZQoTPWfYAsyYo9h4ZqV7EOmR+aj7LCAE5hnXNnrJ5Egy/NiO3Hs7BNpSbsPEOpORg==} + engines: {node: '>= 10'} + cpu: [x64] + os: [linux] + + '@tailwindcss/oxide-wasm32-wasi@4.1.9': + resolution: {integrity: sha512-G93Yuf3xrpTxDUCSh685d1dvOkqOB0Gy+Bchv9Zy3k+lNw/9SEgsHit50xdvp1/p9yRH2TeDHJeDLUiV4mlTkA==} + 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.9': + resolution: {integrity: sha512-Eq9FZzZe/NPkUiSMY+eY7r5l7msuFlm6wC6lnV11m8885z0vs9zx48AKTfw0UbVecTRV5wMxKb3Kmzx2LoUIWg==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [win32] + + '@tailwindcss/oxide-win32-x64-msvc@4.1.9': + resolution: {integrity: sha512-oZ4zkthMXMJN2w/vu3jEfuqWTW7n8giGYDV/SfhBGRNehNMOBqh3YUAEv+8fv2YDJEzL4JpXTNTiSXW3UiUwBw==} + engines: {node: '>= 10'} + cpu: [x64] + os: [win32] + + '@tailwindcss/oxide@4.1.9': + resolution: {integrity: sha512-oqjNxOBt1iNRAywjiH+VFsfovx/hVt4mxe0kOkRMAbbcCwbJg5e2AweFqyGN7gtmE1TJXnvnyX7RWTR1l72ciQ==} + engines: {node: '>= 10'} + + '@tailwindcss/postcss@4.1.9': + resolution: {integrity: sha512-v3DKzHibZO8ioVDmuVHCW1PR0XSM7nS40EjZFJEA1xPuvTuQPaR5flE1LyikU3hu2u1KNWBtEaSe8qsQjX3tyg==} + + '@types/d3-array@3.2.2': + resolution: {integrity: sha512-hOLWVbm7uRza0BYXpIIW5pxfrKe0W+D5lrFiAEYR+pb6w3N2SwSMaJbXdUfSEv+dT4MfHBLtn5js0LAWaO6otw==} + + '@types/d3-color@3.1.3': + resolution: {integrity: sha512-iO90scth9WAbmgv7ogoq57O9YpKmFBbmoEoCHDB2xMBY0+/KVrqAaCDyCE16dUspeOvIxFFRI+0sEtqDqy2b4A==} + + '@types/d3-ease@3.0.2': + resolution: {integrity: sha512-NcV1JjO5oDzoK26oMzbILE6HW7uVXOHLQvHshBUW4UMdZGfiY6v5BeQwh9a9tCzv+CeefZQHJt5SRgK154RtiA==} + + '@types/d3-interpolate@3.0.4': + resolution: {integrity: sha512-mgLPETlrpVV1YRJIglr4Ez47g7Yxjl1lj7YKsiMCb27VJH9W8NVM6Bb9d8kkpG/uAQS5AmbA48q2IAolKKo1MA==} + + '@types/d3-path@3.1.1': + resolution: {integrity: sha512-VMZBYyQvbGmWyWVea0EHs/BwLgxc+MKi1zLDCONksozI4YJMcTt8ZEuIR4Sb1MMTE8MMW49v0IwI5+b7RmfWlg==} + + '@types/d3-scale@4.0.9': + resolution: {integrity: sha512-dLmtwB8zkAeO/juAMfnV+sItKjlsw2lKdZVVy6LRr0cBmegxSABiLEpGVmSJJ8O08i4+sGR6qQtb6WtuwJdvVw==} + + '@types/d3-shape@3.1.8': + resolution: {integrity: sha512-lae0iWfcDeR7qt7rA88BNiqdvPS5pFVPpo5OfjElwNaT2yyekbM0C9vK+yqBqEmHr6lDkRnYNoTBYlAgJa7a4w==} + + '@types/d3-time@3.0.4': + resolution: {integrity: sha512-yuzZug1nkAAaBlBBikKZTgzCeA+k1uy4ZFwWANOfKw5z5LRhV0gNA7gNkKm7HoK+HRN0wX3EkxGk0fpbWhmB7g==} + + '@types/d3-timer@3.0.2': + resolution: {integrity: sha512-Ps3T8E8dZDam6fUyNiMkekK3XUsaUEik+idO9/YjPtfj2qruF8tFBXS7XhtE4iIXBLxhmLjP3SXpLhVf21I9Lw==} + + '@types/node@22.0.0': + resolution: {integrity: sha512-VT7KSYudcPOzP5Q0wfbowyNLaVR8QWUdw+088uFWwfvpY6uCWaXpqV6ieLAu9WBcnTa7H4Z5RLK8I5t2FuOcqw==} + + '@types/react-dom@19.0.0': + resolution: {integrity: sha512-1KfiQKsH1o00p9m5ag12axHQSb3FOU9H20UTrujVSkNhuCrRHiQWFqgEnTNK5ZNfnzZv8UWrnXVqCmCF9fgY3w==} + + '@types/react@19.0.0': + resolution: {integrity: sha512-MY3oPudxvMYyesqs/kW1Bh8y9VqSmf+tzqw3ae8a9DZW68pUe3zAdHeI1jc6iAysuRdACnVknHP8AhwD4/dxtg==} + + '@vercel/analytics@1.3.1': + resolution: {integrity: sha512-xhSlYgAuJ6Q4WQGkzYTLmXwhYl39sWjoMA3nHxfkvG+WdBT25c563a7QhwwKivEOZtPJXifYHR1m2ihoisbWyA==} + peerDependencies: + next: '>= 13' + react: ^18 || ^19 + peerDependenciesMeta: + next: + optional: true + react: + optional: true + + aria-hidden@1.2.6: + resolution: {integrity: sha512-ik3ZgC9dY/lYVVM++OISsaYDeg1tb0VtP5uL3ouh1koGOaUMDPpbFIei4JkFimWUFPn90sbMNMXQAIVOlnYKJA==} + engines: {node: '>=10'} + + autoprefixer@10.4.20: + resolution: {integrity: sha512-XY25y5xSv/wEoqzDyXXME4AFfkZI0P23z6Fs3YgymDnKJkCGOnkL0iTxCa85UTqaSgfcqyf3UA6+c7wUvx/16g==} + engines: {node: ^10 || ^12 || >=14} + hasBin: true + peerDependencies: + postcss: ^8.1.0 + + baseline-browser-mapping@2.9.14: + resolution: {integrity: sha512-B0xUquLkiGLgHhpPBqvl7GWegWBUNuujQ6kXd/r1U38ElPT6Ok8KZ8e+FpUGEc2ZoRQUzq/aUnaKFc/svWUGSg==} + hasBin: true + + browserslist@4.28.1: + resolution: {integrity: sha512-ZC5Bd0LgJXgwGqUknZY/vkUQ04r8NXnJZ3yYi4vDmSiZmC/pdSN0NbNRPxZpbtO4uAfDUAFffO8IZoM3Gj8IkA==} + engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} + hasBin: true + + caniuse-lite@1.0.30001764: + resolution: {integrity: sha512-9JGuzl2M+vPL+pz70gtMF9sHdMFbY9FJaQBi186cHKH3pSzDvzoUJUPV6fqiKIMyXbud9ZLg4F3Yza1vJ1+93g==} + + chownr@3.0.0: + resolution: {integrity: sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g==} + engines: {node: '>=18'} + + class-variance-authority@0.7.1: + resolution: {integrity: sha512-Ka+9Trutv7G8M6WT6SeiRWz792K5qEqIGEGzXKhAE6xOWAY6pPH8U+9IY3oCMv6kqTmLsv7Xh/2w2RigkePMsg==} + + client-only@0.0.1: + resolution: {integrity: sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==} + + clsx@2.1.1: + resolution: {integrity: sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==} + engines: {node: '>=6'} + + cmdk@1.0.4: + resolution: {integrity: sha512-AnsjfHyHpQ/EFeAnG216WY7A5LiYCoZzCSygiLvfXC3H3LFGCprErteUcszaVluGOhuOTbJS3jWHrSDYPBBygg==} + peerDependencies: + react: ^18 || ^19 || ^19.0.0-rc + react-dom: ^18 || ^19 || ^19.0.0-rc + + csstype@3.2.3: + resolution: {integrity: sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==} + + d3-array@3.2.4: + resolution: {integrity: sha512-tdQAmyA18i4J7wprpYq8ClcxZy3SC31QMeByyCFyRt7BVHdREQZ5lpzoe5mFEYZUWe+oq8HBvk9JjpibyEV4Jg==} + engines: {node: '>=12'} + + d3-color@3.1.0: + resolution: {integrity: sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA==} + engines: {node: '>=12'} + + d3-ease@3.0.1: + resolution: {integrity: sha512-wR/XK3D3XcLIZwpbvQwQ5fK+8Ykds1ip7A2Txe0yxncXSdq1L9skcG7blcedkOX+ZcgxGAmLX1FrRGbADwzi0w==} + engines: {node: '>=12'} + + d3-format@3.1.2: + resolution: {integrity: sha512-AJDdYOdnyRDV5b6ArilzCPPwc1ejkHcoyFarqlPqT7zRYjhavcT3uSrqcMvsgh2CgoPbK3RCwyHaVyxYcP2Arg==} + engines: {node: '>=12'} + + d3-interpolate@3.0.1: + resolution: {integrity: sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g==} + engines: {node: '>=12'} + + d3-path@3.1.0: + resolution: {integrity: sha512-p3KP5HCf/bvjBSSKuXid6Zqijx7wIfNW+J/maPs+iwR35at5JCbLUT0LzF1cnjbCHWhqzQTIN2Jpe8pRebIEFQ==} + engines: {node: '>=12'} + + d3-scale@4.0.2: + resolution: {integrity: sha512-GZW464g1SH7ag3Y7hXjf8RoUuAFIqklOAq3MRl4OaWabTFJY9PN/E1YklhXLh+OQ3fM9yS2nOkCoS+WLZ6kvxQ==} + engines: {node: '>=12'} + + d3-shape@3.2.0: + resolution: {integrity: sha512-SaLBuwGm3MOViRq2ABk3eLoxwZELpH6zhl3FbAoJ7Vm1gofKx6El1Ib5z23NUEhF9AsGl7y+dzLe5Cw2AArGTA==} + engines: {node: '>=12'} + + d3-time-format@4.1.0: + resolution: {integrity: sha512-dJxPBlzC7NugB2PDLwo9Q8JiTR3M3e4/XANkreKSUxF8vvXKqm1Yfq4Q5dl8budlunRVlUUaDUgFt7eA8D6NLg==} + engines: {node: '>=12'} + + d3-time@3.1.0: + resolution: {integrity: sha512-VqKjzBLejbSMT4IgbmVgDjpkYrNWUYJnbCGo874u7MMKIWsILRX+OpX/gTk8MqjpT1A/c6HY2dCA77ZN0lkQ2Q==} + engines: {node: '>=12'} + + d3-timer@3.0.1: + resolution: {integrity: sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA==} + engines: {node: '>=12'} + + date-fns-jalali@4.1.0-0: + resolution: {integrity: sha512-hTIP/z+t+qKwBDcmmsnmjWTduxCg+5KfdqWQvb2X/8C9+knYY6epN/pfxdDuyVlSVeFz0sM5eEfwIUQ70U4ckg==} + + date-fns@4.1.0: + resolution: {integrity: sha512-Ukq0owbQXxa/U3EGtsdVBkR1w7KOQ5gIBqdH2hkvknzZPYvBxb/aa6E8L7tmjFtkwZBu3UXBbjIgPo/Ez4xaNg==} + + decimal.js-light@2.5.1: + resolution: {integrity: sha512-qIMFpTMZmny+MMIitAB6D7iVPEorVw6YQRWkvarTkT4tBeSLLiHzcwj6q0MmYSFCiVpiqPJTJEYIrpcPzVEIvg==} + + detect-libc@2.1.2: + resolution: {integrity: sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==} + engines: {node: '>=8'} + + detect-node-es@1.1.0: + resolution: {integrity: sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ==} + + dom-helpers@5.2.1: + resolution: {integrity: sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA==} + + electron-to-chromium@1.5.267: + resolution: {integrity: sha512-0Drusm6MVRXSOJpGbaSVgcQsuB4hEkMpHXaVstcPmhu5LIedxs1xNK/nIxmQIU/RPC0+1/o0AVZfBTkTNJOdUw==} + + embla-carousel-react@8.5.1: + resolution: {integrity: sha512-z9Y0K84BJvhChXgqn2CFYbfEi6AwEr+FFVVKm/MqbTQ2zIzO1VQri6w67LcfpVF0AjbhwVMywDZqY4alYkjW5w==} + peerDependencies: + react: ^16.8.0 || ^17.0.1 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc + + embla-carousel-reactive-utils@8.5.1: + resolution: {integrity: sha512-n7VSoGIiiDIc4MfXF3ZRTO59KDp820QDuyBDGlt5/65+lumPHxX2JLz0EZ23hZ4eg4vZGUXwMkYv02fw2JVo/A==} + peerDependencies: + embla-carousel: 8.5.1 + + embla-carousel@8.5.1: + resolution: {integrity: sha512-JUb5+FOHobSiWQ2EJNaueCNT/cQU9L6XWBbWmorWPQT9bkbk+fhsuLr8wWrzXKagO3oWszBO7MSx+GfaRk4E6A==} + + enhanced-resolve@5.18.4: + resolution: {integrity: sha512-LgQMM4WXU3QI+SYgEc2liRgznaD5ojbmY3sb8LxyguVkIg5FxdpTkvk72te2R38/TGKxH634oLxXRGY6d7AP+Q==} + engines: {node: '>=10.13.0'} + + escalade@3.2.0: + resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} + engines: {node: '>=6'} + + eventemitter3@4.0.7: + resolution: {integrity: sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==} + + fast-equals@5.4.0: + resolution: {integrity: sha512-jt2DW/aNFNwke7AUd+Z+e6pz39KO5rzdbbFCg2sGafS4mk13MI7Z8O5z9cADNn5lhGODIgLwug6TZO2ctf7kcw==} + engines: {node: '>=6.0.0'} + + fraction.js@4.3.7: + resolution: {integrity: sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==} + + get-nonce@1.0.1: + resolution: {integrity: sha512-FJhYRoDaiatfEkUK8HKlicmu/3SGFD51q3itKDGoSTysQJBnfOcxU5GxnhE1E6soB76MbT0MBtnKJuXyAx+96Q==} + engines: {node: '>=6'} + + graceful-fs@4.2.11: + resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} + + input-otp@1.4.1: + resolution: {integrity: sha512-+yvpmKYKHi9jIGngxagY9oWiiblPB7+nEO75F2l2o4vs+6vpPZZmUl4tBNYuTCvQjhvEIbdNeJu70bhfYP2nbw==} + 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 + + internmap@2.0.3: + resolution: {integrity: sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg==} + engines: {node: '>=12'} + + jiti@2.6.1: + resolution: {integrity: sha512-ekilCSN1jwRvIbgeg/57YFh8qQDNbwDb9xT/qu2DAHbFFZUicIl4ygVaAvzveMhMVr3LnpSKTNnwt8PoOfmKhQ==} + hasBin: true + + js-tokens@4.0.0: + resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} + + lightningcss-darwin-arm64@1.30.1: + resolution: {integrity: sha512-c8JK7hyE65X1MHMN+Viq9n11RRC7hgin3HhYKhrMyaXflk5GVplZ60IxyoVtzILeKr+xAJwg6zK6sjTBJ0FKYQ==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [darwin] + + lightningcss-darwin-x64@1.30.1: + resolution: {integrity: sha512-k1EvjakfumAQoTfcXUcHQZhSpLlkAuEkdMBsI/ivWw9hL+7FtilQc0Cy3hrx0AAQrVtQAbMI7YjCgYgvn37PzA==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [darwin] + + lightningcss-freebsd-x64@1.30.1: + resolution: {integrity: sha512-kmW6UGCGg2PcyUE59K5r0kWfKPAVy4SltVeut+umLCFoJ53RdCUWxcRDzO1eTaxf/7Q2H7LTquFHPL5R+Gjyig==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [freebsd] + + lightningcss-linux-arm-gnueabihf@1.30.1: + resolution: {integrity: sha512-MjxUShl1v8pit+6D/zSPq9S9dQ2NPFSQwGvxBCYaBYLPlCWuPh9/t1MRS8iUaR8i+a6w7aps+B4N0S1TYP/R+Q==} + engines: {node: '>= 12.0.0'} + cpu: [arm] + os: [linux] + + lightningcss-linux-arm64-gnu@1.30.1: + resolution: {integrity: sha512-gB72maP8rmrKsnKYy8XUuXi/4OctJiuQjcuqWNlJQ6jZiWqtPvqFziskH3hnajfvKB27ynbVCucKSm2rkQp4Bw==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [linux] + + lightningcss-linux-arm64-musl@1.30.1: + resolution: {integrity: sha512-jmUQVx4331m6LIX+0wUhBbmMX7TCfjF5FoOH6SD1CttzuYlGNVpA7QnrmLxrsub43ClTINfGSYyHe2HWeLl5CQ==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [linux] + + lightningcss-linux-x64-gnu@1.30.1: + resolution: {integrity: sha512-piWx3z4wN8J8z3+O5kO74+yr6ze/dKmPnI7vLqfSqI8bccaTGY5xiSGVIJBDd5K5BHlvVLpUB3S2YCfelyJ1bw==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [linux] + + lightningcss-linux-x64-musl@1.30.1: + resolution: {integrity: sha512-rRomAK7eIkL+tHY0YPxbc5Dra2gXlI63HL+v1Pdi1a3sC+tJTcFrHX+E86sulgAXeI7rSzDYhPSeHHjqFhqfeQ==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [linux] + + lightningcss-win32-arm64-msvc@1.30.1: + resolution: {integrity: sha512-mSL4rqPi4iXq5YVqzSsJgMVFENoa4nGTT/GjO2c0Yl9OuQfPsIfncvLrEW6RbbB24WtZ3xP/2CCmI3tNkNV4oA==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [win32] + + lightningcss-win32-x64-msvc@1.30.1: + resolution: {integrity: sha512-PVqXh48wh4T53F/1CCu8PIPCxLzWyCnn/9T5W1Jpmdy5h9Cwd+0YQS6/LwhHXSafuc61/xg9Lv5OrCby6a++jg==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [win32] + + lightningcss@1.30.1: + resolution: {integrity: sha512-xi6IyHML+c9+Q3W0S4fCQJOym42pyurFiJUHEcEyHS0CeKzia4yZDEsLlqOFykxOdHpNy0NmvVO31vcSqAxJCg==} + engines: {node: '>= 12.0.0'} + + lodash@4.17.21: + resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} + + loose-envify@1.4.0: + resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} + hasBin: true + + lucide-react@0.454.0: + resolution: {integrity: sha512-hw7zMDwykCLnEzgncEEjHeA6+45aeEzRYuKHuyRSOPkhko+J3ySGjGIzu+mmMfDFG1vazHepMaYFYHbTFAZAAQ==} + peerDependencies: + react: ^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0-rc + + magic-string@0.30.21: + resolution: {integrity: sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==} + + minipass@7.1.2: + resolution: {integrity: sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==} + engines: {node: '>=16 || 14 >=14.17'} + + minizlib@3.1.0: + resolution: {integrity: sha512-KZxYo1BUkWD2TVFLr0MQoM8vUUigWD3LlD83a/75BqC+4qE0Hb1Vo5v1FgcfaNXvfXzr+5EhQ6ing/CaBijTlw==} + engines: {node: '>= 18'} + + nanoid@3.3.11: + resolution: {integrity: sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==} + engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} + hasBin: true + + next-themes@0.4.6: + resolution: {integrity: sha512-pZvgD5L0IEvX5/9GWyHMf3m8BKiVQwsCMHfoFosXtXBMnaS0ZnIJ9ST4b4NqLVKDEm8QBxoNNGNaBv2JNF6XNA==} + peerDependencies: + react: ^16.8 || ^17 || ^18 || ^19 || ^19.0.0-rc + react-dom: ^16.8 || ^17 || ^18 || ^19 || ^19.0.0-rc + + next@16.0.10: + resolution: {integrity: sha512-RtWh5PUgI+vxlV3HdR+IfWA1UUHu0+Ram/JBO4vWB54cVPentCD0e+lxyAYEsDTqGGMg7qpjhKh6dc6aW7W/sA==} + engines: {node: '>=20.9.0'} + hasBin: true + peerDependencies: + '@opentelemetry/api': ^1.1.0 + '@playwright/test': ^1.51.1 + babel-plugin-react-compiler: '*' + react: ^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0 + react-dom: ^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0 + sass: ^1.3.0 + peerDependenciesMeta: + '@opentelemetry/api': + optional: true + '@playwright/test': + optional: true + babel-plugin-react-compiler: + optional: true + sass: + optional: true + + node-releases@2.0.27: + resolution: {integrity: sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA==} + + normalize-range@0.1.2: + resolution: {integrity: sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==} + engines: {node: '>=0.10.0'} + + object-assign@4.1.1: + resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} + engines: {node: '>=0.10.0'} + + picocolors@1.1.1: + resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} + + postcss-value-parser@4.2.0: + resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==} + + postcss@8.4.31: + resolution: {integrity: sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==} + engines: {node: ^10 || ^12 || >=14} + + postcss@8.5.0: + resolution: {integrity: sha512-27VKOqrYfPncKA2NrFOVhP5MGAfHKLYn/Q0mz9cNQyRAKYi3VNHwYU2qKKqPCqgBmeeJ0uAFB56NumXZ5ZReXg==} + engines: {node: ^10 || ^12 || >=14} + + prop-types@15.8.1: + resolution: {integrity: sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==} + + react-day-picker@9.8.0: + resolution: {integrity: sha512-E0yhhg7R+pdgbl/2toTb0xBhsEAtmAx1l7qjIWYfcxOy8w4rTSVfbtBoSzVVhPwKP/5E9iL38LivzoE3AQDhCQ==} + engines: {node: '>=18'} + peerDependencies: + react: '>=16.8.0' + + react-dom@19.2.0: + resolution: {integrity: sha512-UlbRu4cAiGaIewkPyiRGJk0imDN2T3JjieT6spoL2UeSf5od4n5LB/mQ4ejmxhCFT1tYe8IvaFulzynWovsEFQ==} + peerDependencies: + react: ^19.2.0 + + react-hook-form@7.60.0: + resolution: {integrity: sha512-SBrYOvMbDB7cV8ZfNpaiLcgjH/a1c7aK0lK+aNigpf4xWLO8q+o4tcvVurv3c4EOyzn/3dCsYt4GKD42VvJ/+A==} + engines: {node: '>=18.0.0'} + peerDependencies: + react: ^16.8.0 || ^17 || ^18 || ^19 + + react-is@16.13.1: + resolution: {integrity: sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==} + + react-is@18.3.1: + resolution: {integrity: sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==} + + 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.7.2: + resolution: {integrity: sha512-Iqb9NjCCTt6Hf+vOdNIZGdTiH1QSqr27H/Ek9sv/a97gfueI/5h1s3yRi1nngzMUaOOToin5dI1dXKdXiF+u0Q==} + 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-resizable-panels@2.1.7: + resolution: {integrity: sha512-JtT6gI+nURzhMYQYsx8DKkx6bSoOGFp7A3CwMrOb8y5jFHFyqwo9m68UhmXRw57fRVJksFn1TSlm3ywEQ9vMgA==} + peerDependencies: + react: ^16.14.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc + react-dom: ^16.14.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc + + react-smooth@4.0.4: + resolution: {integrity: sha512-gnGKTpYwqL0Iii09gHobNolvX4Kiq4PKx6eWBCYYix+8cdw+cGo3do906l1NBPKkSWx1DghC1dlWG9L2uGd61Q==} + peerDependencies: + 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 + + react-style-singleton@2.2.3: + resolution: {integrity: sha512-b6jSvxvVnyptAiLjbkWLE/lOnR4lfTtDAl+eUC7RZy+QQWc6wRzIV2CE6xBuMmDxc2qIihtDCZD5NPOFl7fRBQ==} + engines: {node: '>=10'} + peerDependencies: + '@types/react': '*' + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + react-transition-group@4.4.5: + resolution: {integrity: sha512-pZcd1MCJoiKiBR2NRxeCRg13uCXbydPnmB4EOeRrY7480qNWO8IIgQG6zlDkm6uRMsURXPuKq0GWtiM59a5Q6g==} + peerDependencies: + react: '>=16.6.0' + react-dom: '>=16.6.0' + + react@19.2.0: + resolution: {integrity: sha512-tmbWg6W31tQLeB5cdIBOicJDJRR2KzXsV7uSK9iNfLWQ5bIZfxuPEHp7M8wiHyHnn0DD1i7w3Zmin0FtkrwoCQ==} + engines: {node: '>=0.10.0'} + + recharts-scale@0.4.5: + resolution: {integrity: sha512-kivNFO+0OcUNu7jQquLXAxz1FIwZj8nrj+YkOKc5694NbjCvcT6aSZiIzNzd2Kul4o4rTto8QVR9lMNtxD4G1w==} + + recharts@2.15.4: + resolution: {integrity: sha512-UT/q6fwS3c1dHbXv2uFgYJ9BMFHu3fwnd7AYZaEQhXuYQ4hgsxLvsUXzGdKeZrW5xopzDCvuA2N41WJ88I7zIw==} + engines: {node: '>=14'} + peerDependencies: + react: ^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + react-dom: ^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + + scheduler@0.27.0: + resolution: {integrity: sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q==} + + semver@7.7.3: + resolution: {integrity: sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==} + engines: {node: '>=10'} + hasBin: true + + server-only@0.0.1: + resolution: {integrity: sha512-qepMx2JxAa5jjfzxG79yPPq+8BuFToHd1hm7kI+Z4zAq1ftQiP7HcxMhDDItrbtwVeLg/cY2JnKnrcFkmiswNA==} + + sharp@0.34.5: + resolution: {integrity: sha512-Ou9I5Ft9WNcCbXrU9cMgPBcCK8LiwLqcbywW3t4oDV37n1pzpuNLsYiAV8eODnjbtQlSDwZ2cUEeQz4E54Hltg==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + + sonner@1.7.4: + resolution: {integrity: sha512-DIS8z4PfJRbIyfVFDVnK9rO3eYDtse4Omcm6bt0oEr5/jtLgysmjuBl1frJ9E/EQZrFmKx2A8m/s5s9CRXIzhw==} + peerDependencies: + react: ^18.0.0 || ^19.0.0 || ^19.0.0-rc + react-dom: ^18.0.0 || ^19.0.0 || ^19.0.0-rc + + source-map-js@1.2.1: + resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} + engines: {node: '>=0.10.0'} + + styled-jsx@5.1.6: + resolution: {integrity: sha512-qSVyDTeMotdvQYoHWLNGwRFJHC+i+ZvdBRYosOFgC+Wg1vx4frN2/RG/NA7SYqqvKNLf39P2LSRA2pu6n0XYZA==} + engines: {node: '>= 12.0.0'} + peerDependencies: + '@babel/core': '*' + babel-plugin-macros: '*' + react: '>= 16.8.0 || 17.x.x || ^18.0.0-0 || ^19.0.0-0' + peerDependenciesMeta: + '@babel/core': + optional: true + babel-plugin-macros: + optional: true + + tailwind-merge@3.3.1: + resolution: {integrity: sha512-gBXpgUm/3rp1lMZZrM/w7D8GKqshif0zAymAhbCyIt8KMe+0v9DQ7cdYLR4FHH/cKpdTXb+A/tKKU3eolfsI+g==} + + tailwindcss-animate@1.0.7: + resolution: {integrity: sha512-bl6mpH3T7I3UFxuvDEXLxy/VuFxBk5bbzplh7tXI68mwMokNYd1t9qPBHlnyTwfa4JGC4zP516I1hYYtQ/vspA==} + peerDependencies: + tailwindcss: '>=3.0.0 || insiders' + + tailwindcss@4.1.9: + resolution: {integrity: sha512-anBZRcvfNMsQdHB9XSGzAtIQWlhs49uK75jfkwrqjRUbjt4d7q9RE1wR1xWyfYZhLFnFX4ahWp88Au2lcEw5IQ==} + + tapable@2.3.0: + resolution: {integrity: sha512-g9ljZiwki/LfxmQADO3dEY1CbpmXT5Hm2fJ+QaGKwSXUylMybePR7/67YW7jOrrvjEgL1Fmz5kzyAjWVWLlucg==} + engines: {node: '>=6'} + + tar@7.5.2: + resolution: {integrity: sha512-7NyxrTE4Anh8km8iEy7o0QYPs+0JKBTj5ZaqHg6B39erLg0qYXN3BijtShwbsNSvQ+LN75+KV+C4QR/f6Gwnpg==} + engines: {node: '>=18'} + + tiny-invariant@1.3.3: + resolution: {integrity: sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg==} + + tslib@2.8.1: + resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} + + tw-animate-css@1.3.3: + resolution: {integrity: sha512-tXE2TRWrskc4TU3RDd7T8n8Np/wCfoeH9gz22c7PzYqNPQ9FBGFbWWzwL0JyHcFp+jHozmF76tbHfPAx22ua2Q==} + + typescript@5.0.2: + resolution: {integrity: sha512-wVORMBGO/FAs/++blGNeAVdbNKtIh1rbBL2EyQ1+J9lClJ93KiiKe8PmFIVdXhHcyv44SL9oglmfeSsndo0jRw==} + engines: {node: '>=12.20'} + hasBin: true + + undici-types@6.11.1: + resolution: {integrity: sha512-mIDEX2ek50x0OlRgxryxsenE5XaQD4on5U2inY7RApK3SOJpofyw7uW2AyfMKkhAxXIceo2DeWGVGwyvng1GNQ==} + + 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 + peerDependenciesMeta: + '@types/react': + optional: true + + use-sidecar@1.1.3: + resolution: {integrity: sha512-Fedw0aZvkhynoPYlA5WXrMCAMm+nSWdZt6lzJQ7Ok8S6Q+VsHmHpRWndVRJ8Be0ZbkfPc5LRYH+5XrzXcEeLRQ==} + engines: {node: '>=10'} + peerDependencies: + '@types/react': '*' + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + use-sync-external-store@1.6.0: + resolution: {integrity: sha512-Pp6GSwGP/NrPIrxVFAIkOQeyw8lFenOHijQWkUTrDvrF4ALqylP2C/KCkeS9dpUM3KvYRQhna5vt7IL95+ZQ9w==} + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + + vaul@1.1.2: + resolution: {integrity: sha512-ZFkClGpWyI2WUQjdLJ/BaGuV6AVQiJ3uELGk3OYtP+B6yCO7Cmn9vPFXVJkRaGkOJu3m8bQMgtyzNHixULceQA==} + 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 + + victory-vendor@36.9.2: + resolution: {integrity: sha512-PnpQQMuxlwYdocC8fIJqVXvkeViHYzotI+NJrCuav0ZYFoq912ZHBk3mCeuj+5/VpodOjPe1z0Fk2ihgzlXqjQ==} + + yallist@5.0.0: + resolution: {integrity: sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw==} + engines: {node: '>=18'} + + zod@3.25.76: + resolution: {integrity: sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==} + +snapshots: + + '@alloc/quick-lru@5.2.0': {} + + '@ampproject/remapping@2.3.0': + dependencies: + '@jridgewell/gen-mapping': 0.3.13 + '@jridgewell/trace-mapping': 0.3.31 + + '@babel/runtime@7.28.6': {} + + '@date-fns/tz@1.2.0': {} + + '@emnapi/runtime@1.8.1': + dependencies: + tslib: 2.8.1 + optional: true + + '@floating-ui/core@1.7.3': + dependencies: + '@floating-ui/utils': 0.2.10 + + '@floating-ui/dom@1.7.4': + dependencies: + '@floating-ui/core': 1.7.3 + '@floating-ui/utils': 0.2.10 + + '@floating-ui/react-dom@2.1.6(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': + dependencies: + '@floating-ui/dom': 1.7.4 + react: 19.2.0 + react-dom: 19.2.0(react@19.2.0) + + '@floating-ui/utils@0.2.10': {} + + '@hookform/resolvers@3.10.0(react-hook-form@7.60.0(react@19.2.0))': + dependencies: + react-hook-form: 7.60.0(react@19.2.0) + + '@img/colour@1.0.0': + optional: true + + '@img/sharp-darwin-arm64@0.34.5': + optionalDependencies: + '@img/sharp-libvips-darwin-arm64': 1.2.4 + optional: true + + '@img/sharp-darwin-x64@0.34.5': + optionalDependencies: + '@img/sharp-libvips-darwin-x64': 1.2.4 + optional: true + + '@img/sharp-libvips-darwin-arm64@1.2.4': + optional: true + + '@img/sharp-libvips-darwin-x64@1.2.4': + optional: true + + '@img/sharp-libvips-linux-arm64@1.2.4': + optional: true + + '@img/sharp-libvips-linux-arm@1.2.4': + optional: true + + '@img/sharp-libvips-linux-ppc64@1.2.4': + optional: true + + '@img/sharp-libvips-linux-riscv64@1.2.4': + optional: true + + '@img/sharp-libvips-linux-s390x@1.2.4': + optional: true + + '@img/sharp-libvips-linux-x64@1.2.4': + optional: true + + '@img/sharp-libvips-linuxmusl-arm64@1.2.4': + optional: true + + '@img/sharp-libvips-linuxmusl-x64@1.2.4': + optional: true + + '@img/sharp-linux-arm64@0.34.5': + optionalDependencies: + '@img/sharp-libvips-linux-arm64': 1.2.4 + optional: true + + '@img/sharp-linux-arm@0.34.5': + optionalDependencies: + '@img/sharp-libvips-linux-arm': 1.2.4 + optional: true + + '@img/sharp-linux-ppc64@0.34.5': + optionalDependencies: + '@img/sharp-libvips-linux-ppc64': 1.2.4 + optional: true + + '@img/sharp-linux-riscv64@0.34.5': + optionalDependencies: + '@img/sharp-libvips-linux-riscv64': 1.2.4 + optional: true + + '@img/sharp-linux-s390x@0.34.5': + optionalDependencies: + '@img/sharp-libvips-linux-s390x': 1.2.4 + optional: true + + '@img/sharp-linux-x64@0.34.5': + optionalDependencies: + '@img/sharp-libvips-linux-x64': 1.2.4 + optional: true + + '@img/sharp-linuxmusl-arm64@0.34.5': + optionalDependencies: + '@img/sharp-libvips-linuxmusl-arm64': 1.2.4 + optional: true + + '@img/sharp-linuxmusl-x64@0.34.5': + optionalDependencies: + '@img/sharp-libvips-linuxmusl-x64': 1.2.4 + optional: true + + '@img/sharp-wasm32@0.34.5': + dependencies: + '@emnapi/runtime': 1.8.1 + optional: true + + '@img/sharp-win32-arm64@0.34.5': + optional: true + + '@img/sharp-win32-ia32@0.34.5': + optional: true + + '@img/sharp-win32-x64@0.34.5': + optional: true + + '@isaacs/fs-minipass@4.0.1': + dependencies: + minipass: 7.1.2 + + '@jridgewell/gen-mapping@0.3.13': + dependencies: + '@jridgewell/sourcemap-codec': 1.5.5 + '@jridgewell/trace-mapping': 0.3.31 + + '@jridgewell/resolve-uri@3.1.2': {} + + '@jridgewell/sourcemap-codec@1.5.5': {} + + '@jridgewell/trace-mapping@0.3.31': + dependencies: + '@jridgewell/resolve-uri': 3.1.2 + '@jridgewell/sourcemap-codec': 1.5.5 + + '@next/env@16.0.10': {} + + '@next/swc-darwin-arm64@16.0.10': + optional: true + + '@next/swc-darwin-x64@16.0.10': + optional: true + + '@next/swc-linux-arm64-gnu@16.0.10': + optional: true + + '@next/swc-linux-arm64-musl@16.0.10': + optional: true + + '@next/swc-linux-x64-gnu@16.0.10': + optional: true + + '@next/swc-linux-x64-musl@16.0.10': + optional: true + + '@next/swc-win32-arm64-msvc@16.0.10': + optional: true + + '@next/swc-win32-x64-msvc@16.0.10': + optional: true + + '@radix-ui/number@1.1.0': {} + + '@radix-ui/primitive@1.1.1': {} + + '@radix-ui/react-accordion@1.2.2(@types/react-dom@19.0.0)(@types/react@19.0.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': + dependencies: + '@radix-ui/primitive': 1.1.1 + '@radix-ui/react-collapsible': 1.1.2(@types/react-dom@19.0.0)(@types/react@19.0.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-collection': 1.1.1(@types/react-dom@19.0.0)(@types/react@19.0.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-compose-refs': 1.1.1(@types/react@19.0.0)(react@19.2.0) + '@radix-ui/react-context': 1.1.1(@types/react@19.0.0)(react@19.2.0) + '@radix-ui/react-direction': 1.1.0(@types/react@19.0.0)(react@19.2.0) + '@radix-ui/react-id': 1.1.0(@types/react@19.0.0)(react@19.2.0) + '@radix-ui/react-primitive': 2.0.1(@types/react-dom@19.0.0)(@types/react@19.0.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@19.0.0)(react@19.2.0) + react: 19.2.0 + react-dom: 19.2.0(react@19.2.0) + optionalDependencies: + '@types/react': 19.0.0 + '@types/react-dom': 19.0.0 + + '@radix-ui/react-alert-dialog@1.1.4(@types/react-dom@19.0.0)(@types/react@19.0.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': + dependencies: + '@radix-ui/primitive': 1.1.1 + '@radix-ui/react-compose-refs': 1.1.1(@types/react@19.0.0)(react@19.2.0) + '@radix-ui/react-context': 1.1.1(@types/react@19.0.0)(react@19.2.0) + '@radix-ui/react-dialog': 1.1.4(@types/react-dom@19.0.0)(@types/react@19.0.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-primitive': 2.0.1(@types/react-dom@19.0.0)(@types/react@19.0.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-slot': 1.1.1(@types/react@19.0.0)(react@19.2.0) + react: 19.2.0 + react-dom: 19.2.0(react@19.2.0) + optionalDependencies: + '@types/react': 19.0.0 + '@types/react-dom': 19.0.0 + + '@radix-ui/react-arrow@1.1.1(@types/react-dom@19.0.0)(@types/react@19.0.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': + dependencies: + '@radix-ui/react-primitive': 2.0.1(@types/react-dom@19.0.0)(@types/react@19.0.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + react: 19.2.0 + react-dom: 19.2.0(react@19.2.0) + optionalDependencies: + '@types/react': 19.0.0 + '@types/react-dom': 19.0.0 + + '@radix-ui/react-aspect-ratio@1.1.1(@types/react-dom@19.0.0)(@types/react@19.0.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': + dependencies: + '@radix-ui/react-primitive': 2.0.1(@types/react-dom@19.0.0)(@types/react@19.0.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + react: 19.2.0 + react-dom: 19.2.0(react@19.2.0) + optionalDependencies: + '@types/react': 19.0.0 + '@types/react-dom': 19.0.0 + + '@radix-ui/react-avatar@1.1.2(@types/react-dom@19.0.0)(@types/react@19.0.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': + dependencies: + '@radix-ui/react-context': 1.1.1(@types/react@19.0.0)(react@19.2.0) + '@radix-ui/react-primitive': 2.0.1(@types/react-dom@19.0.0)(@types/react@19.0.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@19.0.0)(react@19.2.0) + '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@19.0.0)(react@19.2.0) + react: 19.2.0 + react-dom: 19.2.0(react@19.2.0) + optionalDependencies: + '@types/react': 19.0.0 + '@types/react-dom': 19.0.0 + + '@radix-ui/react-checkbox@1.1.3(@types/react-dom@19.0.0)(@types/react@19.0.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': + dependencies: + '@radix-ui/primitive': 1.1.1 + '@radix-ui/react-compose-refs': 1.1.1(@types/react@19.0.0)(react@19.2.0) + '@radix-ui/react-context': 1.1.1(@types/react@19.0.0)(react@19.2.0) + '@radix-ui/react-presence': 1.1.2(@types/react-dom@19.0.0)(@types/react@19.0.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-primitive': 2.0.1(@types/react-dom@19.0.0)(@types/react@19.0.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@19.0.0)(react@19.2.0) + '@radix-ui/react-use-previous': 1.1.0(@types/react@19.0.0)(react@19.2.0) + '@radix-ui/react-use-size': 1.1.0(@types/react@19.0.0)(react@19.2.0) + react: 19.2.0 + react-dom: 19.2.0(react@19.2.0) + optionalDependencies: + '@types/react': 19.0.0 + '@types/react-dom': 19.0.0 + + '@radix-ui/react-collapsible@1.1.2(@types/react-dom@19.0.0)(@types/react@19.0.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': + dependencies: + '@radix-ui/primitive': 1.1.1 + '@radix-ui/react-compose-refs': 1.1.1(@types/react@19.0.0)(react@19.2.0) + '@radix-ui/react-context': 1.1.1(@types/react@19.0.0)(react@19.2.0) + '@radix-ui/react-id': 1.1.0(@types/react@19.0.0)(react@19.2.0) + '@radix-ui/react-presence': 1.1.2(@types/react-dom@19.0.0)(@types/react@19.0.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-primitive': 2.0.1(@types/react-dom@19.0.0)(@types/react@19.0.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@19.0.0)(react@19.2.0) + '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@19.0.0)(react@19.2.0) + react: 19.2.0 + react-dom: 19.2.0(react@19.2.0) + optionalDependencies: + '@types/react': 19.0.0 + '@types/react-dom': 19.0.0 + + '@radix-ui/react-collection@1.1.1(@types/react-dom@19.0.0)(@types/react@19.0.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': + dependencies: + '@radix-ui/react-compose-refs': 1.1.1(@types/react@19.0.0)(react@19.2.0) + '@radix-ui/react-context': 1.1.1(@types/react@19.0.0)(react@19.2.0) + '@radix-ui/react-primitive': 2.0.1(@types/react-dom@19.0.0)(@types/react@19.0.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-slot': 1.1.1(@types/react@19.0.0)(react@19.2.0) + react: 19.2.0 + react-dom: 19.2.0(react@19.2.0) + optionalDependencies: + '@types/react': 19.0.0 + '@types/react-dom': 19.0.0 + + '@radix-ui/react-compose-refs@1.1.1(@types/react@19.0.0)(react@19.2.0)': + dependencies: + react: 19.2.0 + optionalDependencies: + '@types/react': 19.0.0 + + '@radix-ui/react-compose-refs@1.1.2(@types/react@19.0.0)(react@19.2.0)': + dependencies: + react: 19.2.0 + optionalDependencies: + '@types/react': 19.0.0 + + '@radix-ui/react-context-menu@2.2.4(@types/react-dom@19.0.0)(@types/react@19.0.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': + dependencies: + '@radix-ui/primitive': 1.1.1 + '@radix-ui/react-context': 1.1.1(@types/react@19.0.0)(react@19.2.0) + '@radix-ui/react-menu': 2.1.4(@types/react-dom@19.0.0)(@types/react@19.0.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-primitive': 2.0.1(@types/react-dom@19.0.0)(@types/react@19.0.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@19.0.0)(react@19.2.0) + '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@19.0.0)(react@19.2.0) + react: 19.2.0 + react-dom: 19.2.0(react@19.2.0) + optionalDependencies: + '@types/react': 19.0.0 + '@types/react-dom': 19.0.0 + + '@radix-ui/react-context@1.1.1(@types/react@19.0.0)(react@19.2.0)': + dependencies: + react: 19.2.0 + optionalDependencies: + '@types/react': 19.0.0 + + '@radix-ui/react-dialog@1.1.4(@types/react-dom@19.0.0)(@types/react@19.0.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': + dependencies: + '@radix-ui/primitive': 1.1.1 + '@radix-ui/react-compose-refs': 1.1.1(@types/react@19.0.0)(react@19.2.0) + '@radix-ui/react-context': 1.1.1(@types/react@19.0.0)(react@19.2.0) + '@radix-ui/react-dismissable-layer': 1.1.3(@types/react-dom@19.0.0)(@types/react@19.0.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-focus-guards': 1.1.1(@types/react@19.0.0)(react@19.2.0) + '@radix-ui/react-focus-scope': 1.1.1(@types/react-dom@19.0.0)(@types/react@19.0.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-id': 1.1.0(@types/react@19.0.0)(react@19.2.0) + '@radix-ui/react-portal': 1.1.3(@types/react-dom@19.0.0)(@types/react@19.0.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-presence': 1.1.2(@types/react-dom@19.0.0)(@types/react@19.0.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-primitive': 2.0.1(@types/react-dom@19.0.0)(@types/react@19.0.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-slot': 1.1.1(@types/react@19.0.0)(react@19.2.0) + '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@19.0.0)(react@19.2.0) + aria-hidden: 1.2.6 + react: 19.2.0 + react-dom: 19.2.0(react@19.2.0) + react-remove-scroll: 2.7.2(@types/react@19.0.0)(react@19.2.0) + optionalDependencies: + '@types/react': 19.0.0 + '@types/react-dom': 19.0.0 + + '@radix-ui/react-direction@1.1.0(@types/react@19.0.0)(react@19.2.0)': + dependencies: + react: 19.2.0 + optionalDependencies: + '@types/react': 19.0.0 + + '@radix-ui/react-dismissable-layer@1.1.3(@types/react-dom@19.0.0)(@types/react@19.0.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': + dependencies: + '@radix-ui/primitive': 1.1.1 + '@radix-ui/react-compose-refs': 1.1.1(@types/react@19.0.0)(react@19.2.0) + '@radix-ui/react-primitive': 2.0.1(@types/react-dom@19.0.0)(@types/react@19.0.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@19.0.0)(react@19.2.0) + '@radix-ui/react-use-escape-keydown': 1.1.0(@types/react@19.0.0)(react@19.2.0) + react: 19.2.0 + react-dom: 19.2.0(react@19.2.0) + optionalDependencies: + '@types/react': 19.0.0 + '@types/react-dom': 19.0.0 + + '@radix-ui/react-dropdown-menu@2.1.4(@types/react-dom@19.0.0)(@types/react@19.0.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': + dependencies: + '@radix-ui/primitive': 1.1.1 + '@radix-ui/react-compose-refs': 1.1.1(@types/react@19.0.0)(react@19.2.0) + '@radix-ui/react-context': 1.1.1(@types/react@19.0.0)(react@19.2.0) + '@radix-ui/react-id': 1.1.0(@types/react@19.0.0)(react@19.2.0) + '@radix-ui/react-menu': 2.1.4(@types/react-dom@19.0.0)(@types/react@19.0.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-primitive': 2.0.1(@types/react-dom@19.0.0)(@types/react@19.0.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@19.0.0)(react@19.2.0) + react: 19.2.0 + react-dom: 19.2.0(react@19.2.0) + optionalDependencies: + '@types/react': 19.0.0 + '@types/react-dom': 19.0.0 + + '@radix-ui/react-focus-guards@1.1.1(@types/react@19.0.0)(react@19.2.0)': + dependencies: + react: 19.2.0 + optionalDependencies: + '@types/react': 19.0.0 + + '@radix-ui/react-focus-scope@1.1.1(@types/react-dom@19.0.0)(@types/react@19.0.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': + dependencies: + '@radix-ui/react-compose-refs': 1.1.1(@types/react@19.0.0)(react@19.2.0) + '@radix-ui/react-primitive': 2.0.1(@types/react-dom@19.0.0)(@types/react@19.0.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@19.0.0)(react@19.2.0) + react: 19.2.0 + react-dom: 19.2.0(react@19.2.0) + optionalDependencies: + '@types/react': 19.0.0 + '@types/react-dom': 19.0.0 + + '@radix-ui/react-hover-card@1.1.4(@types/react-dom@19.0.0)(@types/react@19.0.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': + dependencies: + '@radix-ui/primitive': 1.1.1 + '@radix-ui/react-compose-refs': 1.1.1(@types/react@19.0.0)(react@19.2.0) + '@radix-ui/react-context': 1.1.1(@types/react@19.0.0)(react@19.2.0) + '@radix-ui/react-dismissable-layer': 1.1.3(@types/react-dom@19.0.0)(@types/react@19.0.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-popper': 1.2.1(@types/react-dom@19.0.0)(@types/react@19.0.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-portal': 1.1.3(@types/react-dom@19.0.0)(@types/react@19.0.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-presence': 1.1.2(@types/react-dom@19.0.0)(@types/react@19.0.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-primitive': 2.0.1(@types/react-dom@19.0.0)(@types/react@19.0.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@19.0.0)(react@19.2.0) + react: 19.2.0 + react-dom: 19.2.0(react@19.2.0) + optionalDependencies: + '@types/react': 19.0.0 + '@types/react-dom': 19.0.0 + + '@radix-ui/react-id@1.1.0(@types/react@19.0.0)(react@19.2.0)': + dependencies: + '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@19.0.0)(react@19.2.0) + react: 19.2.0 + optionalDependencies: + '@types/react': 19.0.0 + + '@radix-ui/react-id@1.1.1(@types/react@19.0.0)(react@19.2.0)': + dependencies: + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.0.0)(react@19.2.0) + react: 19.2.0 + optionalDependencies: + '@types/react': 19.0.0 + + '@radix-ui/react-label@2.1.1(@types/react-dom@19.0.0)(@types/react@19.0.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': + dependencies: + '@radix-ui/react-primitive': 2.0.1(@types/react-dom@19.0.0)(@types/react@19.0.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + react: 19.2.0 + react-dom: 19.2.0(react@19.2.0) + optionalDependencies: + '@types/react': 19.0.0 + '@types/react-dom': 19.0.0 + + '@radix-ui/react-menu@2.1.4(@types/react-dom@19.0.0)(@types/react@19.0.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': + dependencies: + '@radix-ui/primitive': 1.1.1 + '@radix-ui/react-collection': 1.1.1(@types/react-dom@19.0.0)(@types/react@19.0.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-compose-refs': 1.1.1(@types/react@19.0.0)(react@19.2.0) + '@radix-ui/react-context': 1.1.1(@types/react@19.0.0)(react@19.2.0) + '@radix-ui/react-direction': 1.1.0(@types/react@19.0.0)(react@19.2.0) + '@radix-ui/react-dismissable-layer': 1.1.3(@types/react-dom@19.0.0)(@types/react@19.0.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-focus-guards': 1.1.1(@types/react@19.0.0)(react@19.2.0) + '@radix-ui/react-focus-scope': 1.1.1(@types/react-dom@19.0.0)(@types/react@19.0.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-id': 1.1.0(@types/react@19.0.0)(react@19.2.0) + '@radix-ui/react-popper': 1.2.1(@types/react-dom@19.0.0)(@types/react@19.0.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-portal': 1.1.3(@types/react-dom@19.0.0)(@types/react@19.0.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-presence': 1.1.2(@types/react-dom@19.0.0)(@types/react@19.0.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-primitive': 2.0.1(@types/react-dom@19.0.0)(@types/react@19.0.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-roving-focus': 1.1.1(@types/react-dom@19.0.0)(@types/react@19.0.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-slot': 1.1.1(@types/react@19.0.0)(react@19.2.0) + '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@19.0.0)(react@19.2.0) + aria-hidden: 1.2.6 + react: 19.2.0 + react-dom: 19.2.0(react@19.2.0) + react-remove-scroll: 2.7.2(@types/react@19.0.0)(react@19.2.0) + optionalDependencies: + '@types/react': 19.0.0 + '@types/react-dom': 19.0.0 + + '@radix-ui/react-menubar@1.1.4(@types/react-dom@19.0.0)(@types/react@19.0.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': + dependencies: + '@radix-ui/primitive': 1.1.1 + '@radix-ui/react-collection': 1.1.1(@types/react-dom@19.0.0)(@types/react@19.0.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-compose-refs': 1.1.1(@types/react@19.0.0)(react@19.2.0) + '@radix-ui/react-context': 1.1.1(@types/react@19.0.0)(react@19.2.0) + '@radix-ui/react-direction': 1.1.0(@types/react@19.0.0)(react@19.2.0) + '@radix-ui/react-id': 1.1.0(@types/react@19.0.0)(react@19.2.0) + '@radix-ui/react-menu': 2.1.4(@types/react-dom@19.0.0)(@types/react@19.0.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-primitive': 2.0.1(@types/react-dom@19.0.0)(@types/react@19.0.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-roving-focus': 1.1.1(@types/react-dom@19.0.0)(@types/react@19.0.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@19.0.0)(react@19.2.0) + react: 19.2.0 + react-dom: 19.2.0(react@19.2.0) + optionalDependencies: + '@types/react': 19.0.0 + '@types/react-dom': 19.0.0 + + '@radix-ui/react-navigation-menu@1.2.3(@types/react-dom@19.0.0)(@types/react@19.0.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': + dependencies: + '@radix-ui/primitive': 1.1.1 + '@radix-ui/react-collection': 1.1.1(@types/react-dom@19.0.0)(@types/react@19.0.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-compose-refs': 1.1.1(@types/react@19.0.0)(react@19.2.0) + '@radix-ui/react-context': 1.1.1(@types/react@19.0.0)(react@19.2.0) + '@radix-ui/react-direction': 1.1.0(@types/react@19.0.0)(react@19.2.0) + '@radix-ui/react-dismissable-layer': 1.1.3(@types/react-dom@19.0.0)(@types/react@19.0.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-id': 1.1.0(@types/react@19.0.0)(react@19.2.0) + '@radix-ui/react-presence': 1.1.2(@types/react-dom@19.0.0)(@types/react@19.0.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-primitive': 2.0.1(@types/react-dom@19.0.0)(@types/react@19.0.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@19.0.0)(react@19.2.0) + '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@19.0.0)(react@19.2.0) + '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@19.0.0)(react@19.2.0) + '@radix-ui/react-use-previous': 1.1.0(@types/react@19.0.0)(react@19.2.0) + '@radix-ui/react-visually-hidden': 1.1.1(@types/react-dom@19.0.0)(@types/react@19.0.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + react: 19.2.0 + react-dom: 19.2.0(react@19.2.0) + optionalDependencies: + '@types/react': 19.0.0 + '@types/react-dom': 19.0.0 + + '@radix-ui/react-popover@1.1.4(@types/react-dom@19.0.0)(@types/react@19.0.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': + dependencies: + '@radix-ui/primitive': 1.1.1 + '@radix-ui/react-compose-refs': 1.1.1(@types/react@19.0.0)(react@19.2.0) + '@radix-ui/react-context': 1.1.1(@types/react@19.0.0)(react@19.2.0) + '@radix-ui/react-dismissable-layer': 1.1.3(@types/react-dom@19.0.0)(@types/react@19.0.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-focus-guards': 1.1.1(@types/react@19.0.0)(react@19.2.0) + '@radix-ui/react-focus-scope': 1.1.1(@types/react-dom@19.0.0)(@types/react@19.0.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-id': 1.1.0(@types/react@19.0.0)(react@19.2.0) + '@radix-ui/react-popper': 1.2.1(@types/react-dom@19.0.0)(@types/react@19.0.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-portal': 1.1.3(@types/react-dom@19.0.0)(@types/react@19.0.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-presence': 1.1.2(@types/react-dom@19.0.0)(@types/react@19.0.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-primitive': 2.0.1(@types/react-dom@19.0.0)(@types/react@19.0.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-slot': 1.1.1(@types/react@19.0.0)(react@19.2.0) + '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@19.0.0)(react@19.2.0) + aria-hidden: 1.2.6 + react: 19.2.0 + react-dom: 19.2.0(react@19.2.0) + react-remove-scroll: 2.7.2(@types/react@19.0.0)(react@19.2.0) + optionalDependencies: + '@types/react': 19.0.0 + '@types/react-dom': 19.0.0 + + '@radix-ui/react-popper@1.2.1(@types/react-dom@19.0.0)(@types/react@19.0.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': + dependencies: + '@floating-ui/react-dom': 2.1.6(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-arrow': 1.1.1(@types/react-dom@19.0.0)(@types/react@19.0.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-compose-refs': 1.1.1(@types/react@19.0.0)(react@19.2.0) + '@radix-ui/react-context': 1.1.1(@types/react@19.0.0)(react@19.2.0) + '@radix-ui/react-primitive': 2.0.1(@types/react-dom@19.0.0)(@types/react@19.0.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@19.0.0)(react@19.2.0) + '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@19.0.0)(react@19.2.0) + '@radix-ui/react-use-rect': 1.1.0(@types/react@19.0.0)(react@19.2.0) + '@radix-ui/react-use-size': 1.1.0(@types/react@19.0.0)(react@19.2.0) + '@radix-ui/rect': 1.1.0 + react: 19.2.0 + react-dom: 19.2.0(react@19.2.0) + optionalDependencies: + '@types/react': 19.0.0 + '@types/react-dom': 19.0.0 + + '@radix-ui/react-portal@1.1.3(@types/react-dom@19.0.0)(@types/react@19.0.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': + dependencies: + '@radix-ui/react-primitive': 2.0.1(@types/react-dom@19.0.0)(@types/react@19.0.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@19.0.0)(react@19.2.0) + react: 19.2.0 + react-dom: 19.2.0(react@19.2.0) + optionalDependencies: + '@types/react': 19.0.0 + '@types/react-dom': 19.0.0 + + '@radix-ui/react-presence@1.1.2(@types/react-dom@19.0.0)(@types/react@19.0.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': + dependencies: + '@radix-ui/react-compose-refs': 1.1.1(@types/react@19.0.0)(react@19.2.0) + '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@19.0.0)(react@19.2.0) + react: 19.2.0 + react-dom: 19.2.0(react@19.2.0) + optionalDependencies: + '@types/react': 19.0.0 + '@types/react-dom': 19.0.0 + + '@radix-ui/react-primitive@2.0.1(@types/react-dom@19.0.0)(@types/react@19.0.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': + dependencies: + '@radix-ui/react-slot': 1.1.1(@types/react@19.0.0)(react@19.2.0) + react: 19.2.0 + react-dom: 19.2.0(react@19.2.0) + optionalDependencies: + '@types/react': 19.0.0 + '@types/react-dom': 19.0.0 + + '@radix-ui/react-primitive@2.1.4(@types/react-dom@19.0.0)(@types/react@19.0.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': + dependencies: + '@radix-ui/react-slot': 1.2.4(@types/react@19.0.0)(react@19.2.0) + react: 19.2.0 + react-dom: 19.2.0(react@19.2.0) + optionalDependencies: + '@types/react': 19.0.0 + '@types/react-dom': 19.0.0 + + '@radix-ui/react-progress@1.1.1(@types/react-dom@19.0.0)(@types/react@19.0.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': + dependencies: + '@radix-ui/react-context': 1.1.1(@types/react@19.0.0)(react@19.2.0) + '@radix-ui/react-primitive': 2.0.1(@types/react-dom@19.0.0)(@types/react@19.0.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + react: 19.2.0 + react-dom: 19.2.0(react@19.2.0) + optionalDependencies: + '@types/react': 19.0.0 + '@types/react-dom': 19.0.0 + + '@radix-ui/react-radio-group@1.2.2(@types/react-dom@19.0.0)(@types/react@19.0.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': + dependencies: + '@radix-ui/primitive': 1.1.1 + '@radix-ui/react-compose-refs': 1.1.1(@types/react@19.0.0)(react@19.2.0) + '@radix-ui/react-context': 1.1.1(@types/react@19.0.0)(react@19.2.0) + '@radix-ui/react-direction': 1.1.0(@types/react@19.0.0)(react@19.2.0) + '@radix-ui/react-presence': 1.1.2(@types/react-dom@19.0.0)(@types/react@19.0.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-primitive': 2.0.1(@types/react-dom@19.0.0)(@types/react@19.0.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-roving-focus': 1.1.1(@types/react-dom@19.0.0)(@types/react@19.0.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@19.0.0)(react@19.2.0) + '@radix-ui/react-use-previous': 1.1.0(@types/react@19.0.0)(react@19.2.0) + '@radix-ui/react-use-size': 1.1.0(@types/react@19.0.0)(react@19.2.0) + react: 19.2.0 + react-dom: 19.2.0(react@19.2.0) + optionalDependencies: + '@types/react': 19.0.0 + '@types/react-dom': 19.0.0 + + '@radix-ui/react-roving-focus@1.1.1(@types/react-dom@19.0.0)(@types/react@19.0.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': + dependencies: + '@radix-ui/primitive': 1.1.1 + '@radix-ui/react-collection': 1.1.1(@types/react-dom@19.0.0)(@types/react@19.0.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-compose-refs': 1.1.1(@types/react@19.0.0)(react@19.2.0) + '@radix-ui/react-context': 1.1.1(@types/react@19.0.0)(react@19.2.0) + '@radix-ui/react-direction': 1.1.0(@types/react@19.0.0)(react@19.2.0) + '@radix-ui/react-id': 1.1.0(@types/react@19.0.0)(react@19.2.0) + '@radix-ui/react-primitive': 2.0.1(@types/react-dom@19.0.0)(@types/react@19.0.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@19.0.0)(react@19.2.0) + '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@19.0.0)(react@19.2.0) + react: 19.2.0 + react-dom: 19.2.0(react@19.2.0) + optionalDependencies: + '@types/react': 19.0.0 + '@types/react-dom': 19.0.0 + + '@radix-ui/react-scroll-area@1.2.2(@types/react-dom@19.0.0)(@types/react@19.0.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': + dependencies: + '@radix-ui/number': 1.1.0 + '@radix-ui/primitive': 1.1.1 + '@radix-ui/react-compose-refs': 1.1.1(@types/react@19.0.0)(react@19.2.0) + '@radix-ui/react-context': 1.1.1(@types/react@19.0.0)(react@19.2.0) + '@radix-ui/react-direction': 1.1.0(@types/react@19.0.0)(react@19.2.0) + '@radix-ui/react-presence': 1.1.2(@types/react-dom@19.0.0)(@types/react@19.0.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-primitive': 2.0.1(@types/react-dom@19.0.0)(@types/react@19.0.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@19.0.0)(react@19.2.0) + '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@19.0.0)(react@19.2.0) + react: 19.2.0 + react-dom: 19.2.0(react@19.2.0) + optionalDependencies: + '@types/react': 19.0.0 + '@types/react-dom': 19.0.0 + + '@radix-ui/react-select@2.1.4(@types/react-dom@19.0.0)(@types/react@19.0.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': + dependencies: + '@radix-ui/number': 1.1.0 + '@radix-ui/primitive': 1.1.1 + '@radix-ui/react-collection': 1.1.1(@types/react-dom@19.0.0)(@types/react@19.0.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-compose-refs': 1.1.1(@types/react@19.0.0)(react@19.2.0) + '@radix-ui/react-context': 1.1.1(@types/react@19.0.0)(react@19.2.0) + '@radix-ui/react-direction': 1.1.0(@types/react@19.0.0)(react@19.2.0) + '@radix-ui/react-dismissable-layer': 1.1.3(@types/react-dom@19.0.0)(@types/react@19.0.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-focus-guards': 1.1.1(@types/react@19.0.0)(react@19.2.0) + '@radix-ui/react-focus-scope': 1.1.1(@types/react-dom@19.0.0)(@types/react@19.0.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-id': 1.1.0(@types/react@19.0.0)(react@19.2.0) + '@radix-ui/react-popper': 1.2.1(@types/react-dom@19.0.0)(@types/react@19.0.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-portal': 1.1.3(@types/react-dom@19.0.0)(@types/react@19.0.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-primitive': 2.0.1(@types/react-dom@19.0.0)(@types/react@19.0.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-slot': 1.1.1(@types/react@19.0.0)(react@19.2.0) + '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@19.0.0)(react@19.2.0) + '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@19.0.0)(react@19.2.0) + '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@19.0.0)(react@19.2.0) + '@radix-ui/react-use-previous': 1.1.0(@types/react@19.0.0)(react@19.2.0) + '@radix-ui/react-visually-hidden': 1.1.1(@types/react-dom@19.0.0)(@types/react@19.0.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + aria-hidden: 1.2.6 + react: 19.2.0 + react-dom: 19.2.0(react@19.2.0) + react-remove-scroll: 2.7.2(@types/react@19.0.0)(react@19.2.0) + optionalDependencies: + '@types/react': 19.0.0 + '@types/react-dom': 19.0.0 + + '@radix-ui/react-separator@1.1.1(@types/react-dom@19.0.0)(@types/react@19.0.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': + dependencies: + '@radix-ui/react-primitive': 2.0.1(@types/react-dom@19.0.0)(@types/react@19.0.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + react: 19.2.0 + react-dom: 19.2.0(react@19.2.0) + optionalDependencies: + '@types/react': 19.0.0 + '@types/react-dom': 19.0.0 + + '@radix-ui/react-slider@1.2.2(@types/react-dom@19.0.0)(@types/react@19.0.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': + dependencies: + '@radix-ui/number': 1.1.0 + '@radix-ui/primitive': 1.1.1 + '@radix-ui/react-collection': 1.1.1(@types/react-dom@19.0.0)(@types/react@19.0.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-compose-refs': 1.1.1(@types/react@19.0.0)(react@19.2.0) + '@radix-ui/react-context': 1.1.1(@types/react@19.0.0)(react@19.2.0) + '@radix-ui/react-direction': 1.1.0(@types/react@19.0.0)(react@19.2.0) + '@radix-ui/react-primitive': 2.0.1(@types/react-dom@19.0.0)(@types/react@19.0.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@19.0.0)(react@19.2.0) + '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@19.0.0)(react@19.2.0) + '@radix-ui/react-use-previous': 1.1.0(@types/react@19.0.0)(react@19.2.0) + '@radix-ui/react-use-size': 1.1.0(@types/react@19.0.0)(react@19.2.0) + react: 19.2.0 + react-dom: 19.2.0(react@19.2.0) + optionalDependencies: + '@types/react': 19.0.0 + '@types/react-dom': 19.0.0 + + '@radix-ui/react-slot@1.1.1(@types/react@19.0.0)(react@19.2.0)': + dependencies: + '@radix-ui/react-compose-refs': 1.1.1(@types/react@19.0.0)(react@19.2.0) + react: 19.2.0 + optionalDependencies: + '@types/react': 19.0.0 + + '@radix-ui/react-slot@1.2.4(@types/react@19.0.0)(react@19.2.0)': + dependencies: + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.0.0)(react@19.2.0) + react: 19.2.0 + optionalDependencies: + '@types/react': 19.0.0 + + '@radix-ui/react-switch@1.1.2(@types/react-dom@19.0.0)(@types/react@19.0.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': + dependencies: + '@radix-ui/primitive': 1.1.1 + '@radix-ui/react-compose-refs': 1.1.1(@types/react@19.0.0)(react@19.2.0) + '@radix-ui/react-context': 1.1.1(@types/react@19.0.0)(react@19.2.0) + '@radix-ui/react-primitive': 2.0.1(@types/react-dom@19.0.0)(@types/react@19.0.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@19.0.0)(react@19.2.0) + '@radix-ui/react-use-previous': 1.1.0(@types/react@19.0.0)(react@19.2.0) + '@radix-ui/react-use-size': 1.1.0(@types/react@19.0.0)(react@19.2.0) + react: 19.2.0 + react-dom: 19.2.0(react@19.2.0) + optionalDependencies: + '@types/react': 19.0.0 + '@types/react-dom': 19.0.0 + + '@radix-ui/react-tabs@1.1.2(@types/react-dom@19.0.0)(@types/react@19.0.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': + dependencies: + '@radix-ui/primitive': 1.1.1 + '@radix-ui/react-context': 1.1.1(@types/react@19.0.0)(react@19.2.0) + '@radix-ui/react-direction': 1.1.0(@types/react@19.0.0)(react@19.2.0) + '@radix-ui/react-id': 1.1.0(@types/react@19.0.0)(react@19.2.0) + '@radix-ui/react-presence': 1.1.2(@types/react-dom@19.0.0)(@types/react@19.0.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-primitive': 2.0.1(@types/react-dom@19.0.0)(@types/react@19.0.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-roving-focus': 1.1.1(@types/react-dom@19.0.0)(@types/react@19.0.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@19.0.0)(react@19.2.0) + react: 19.2.0 + react-dom: 19.2.0(react@19.2.0) + optionalDependencies: + '@types/react': 19.0.0 + '@types/react-dom': 19.0.0 + + '@radix-ui/react-toast@1.2.4(@types/react-dom@19.0.0)(@types/react@19.0.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': + dependencies: + '@radix-ui/primitive': 1.1.1 + '@radix-ui/react-collection': 1.1.1(@types/react-dom@19.0.0)(@types/react@19.0.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-compose-refs': 1.1.1(@types/react@19.0.0)(react@19.2.0) + '@radix-ui/react-context': 1.1.1(@types/react@19.0.0)(react@19.2.0) + '@radix-ui/react-dismissable-layer': 1.1.3(@types/react-dom@19.0.0)(@types/react@19.0.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-portal': 1.1.3(@types/react-dom@19.0.0)(@types/react@19.0.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-presence': 1.1.2(@types/react-dom@19.0.0)(@types/react@19.0.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-primitive': 2.0.1(@types/react-dom@19.0.0)(@types/react@19.0.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@19.0.0)(react@19.2.0) + '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@19.0.0)(react@19.2.0) + '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@19.0.0)(react@19.2.0) + '@radix-ui/react-visually-hidden': 1.1.1(@types/react-dom@19.0.0)(@types/react@19.0.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + react: 19.2.0 + react-dom: 19.2.0(react@19.2.0) + optionalDependencies: + '@types/react': 19.0.0 + '@types/react-dom': 19.0.0 + + '@radix-ui/react-toggle-group@1.1.1(@types/react-dom@19.0.0)(@types/react@19.0.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': + dependencies: + '@radix-ui/primitive': 1.1.1 + '@radix-ui/react-context': 1.1.1(@types/react@19.0.0)(react@19.2.0) + '@radix-ui/react-direction': 1.1.0(@types/react@19.0.0)(react@19.2.0) + '@radix-ui/react-primitive': 2.0.1(@types/react-dom@19.0.0)(@types/react@19.0.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-roving-focus': 1.1.1(@types/react-dom@19.0.0)(@types/react@19.0.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-toggle': 1.1.1(@types/react-dom@19.0.0)(@types/react@19.0.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@19.0.0)(react@19.2.0) + react: 19.2.0 + react-dom: 19.2.0(react@19.2.0) + optionalDependencies: + '@types/react': 19.0.0 + '@types/react-dom': 19.0.0 + + '@radix-ui/react-toggle@1.1.1(@types/react-dom@19.0.0)(@types/react@19.0.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': + dependencies: + '@radix-ui/primitive': 1.1.1 + '@radix-ui/react-primitive': 2.0.1(@types/react-dom@19.0.0)(@types/react@19.0.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@19.0.0)(react@19.2.0) + react: 19.2.0 + react-dom: 19.2.0(react@19.2.0) + optionalDependencies: + '@types/react': 19.0.0 + '@types/react-dom': 19.0.0 + + '@radix-ui/react-tooltip@1.1.6(@types/react-dom@19.0.0)(@types/react@19.0.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': + dependencies: + '@radix-ui/primitive': 1.1.1 + '@radix-ui/react-compose-refs': 1.1.1(@types/react@19.0.0)(react@19.2.0) + '@radix-ui/react-context': 1.1.1(@types/react@19.0.0)(react@19.2.0) + '@radix-ui/react-dismissable-layer': 1.1.3(@types/react-dom@19.0.0)(@types/react@19.0.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-id': 1.1.0(@types/react@19.0.0)(react@19.2.0) + '@radix-ui/react-popper': 1.2.1(@types/react-dom@19.0.0)(@types/react@19.0.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-portal': 1.1.3(@types/react-dom@19.0.0)(@types/react@19.0.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-presence': 1.1.2(@types/react-dom@19.0.0)(@types/react@19.0.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-primitive': 2.0.1(@types/react-dom@19.0.0)(@types/react@19.0.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-slot': 1.1.1(@types/react@19.0.0)(react@19.2.0) + '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@19.0.0)(react@19.2.0) + '@radix-ui/react-visually-hidden': 1.1.1(@types/react-dom@19.0.0)(@types/react@19.0.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + react: 19.2.0 + react-dom: 19.2.0(react@19.2.0) + optionalDependencies: + '@types/react': 19.0.0 + '@types/react-dom': 19.0.0 + + '@radix-ui/react-use-callback-ref@1.1.0(@types/react@19.0.0)(react@19.2.0)': + dependencies: + react: 19.2.0 + optionalDependencies: + '@types/react': 19.0.0 + + '@radix-ui/react-use-controllable-state@1.1.0(@types/react@19.0.0)(react@19.2.0)': + dependencies: + '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@19.0.0)(react@19.2.0) + react: 19.2.0 + optionalDependencies: + '@types/react': 19.0.0 + + '@radix-ui/react-use-escape-keydown@1.1.0(@types/react@19.0.0)(react@19.2.0)': + dependencies: + '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@19.0.0)(react@19.2.0) + react: 19.2.0 + optionalDependencies: + '@types/react': 19.0.0 + + '@radix-ui/react-use-layout-effect@1.1.0(@types/react@19.0.0)(react@19.2.0)': + dependencies: + react: 19.2.0 + optionalDependencies: + '@types/react': 19.0.0 + + '@radix-ui/react-use-layout-effect@1.1.1(@types/react@19.0.0)(react@19.2.0)': + dependencies: + react: 19.2.0 + optionalDependencies: + '@types/react': 19.0.0 + + '@radix-ui/react-use-previous@1.1.0(@types/react@19.0.0)(react@19.2.0)': + dependencies: + react: 19.2.0 + optionalDependencies: + '@types/react': 19.0.0 + + '@radix-ui/react-use-rect@1.1.0(@types/react@19.0.0)(react@19.2.0)': + dependencies: + '@radix-ui/rect': 1.1.0 + react: 19.2.0 + optionalDependencies: + '@types/react': 19.0.0 + + '@radix-ui/react-use-size@1.1.0(@types/react@19.0.0)(react@19.2.0)': + dependencies: + '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@19.0.0)(react@19.2.0) + react: 19.2.0 + optionalDependencies: + '@types/react': 19.0.0 + + '@radix-ui/react-visually-hidden@1.1.1(@types/react-dom@19.0.0)(@types/react@19.0.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': + dependencies: + '@radix-ui/react-primitive': 2.0.1(@types/react-dom@19.0.0)(@types/react@19.0.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + react: 19.2.0 + react-dom: 19.2.0(react@19.2.0) + optionalDependencies: + '@types/react': 19.0.0 + '@types/react-dom': 19.0.0 + + '@radix-ui/rect@1.1.0': {} + + '@swc/helpers@0.5.15': + dependencies: + tslib: 2.8.1 + + '@tailwindcss/node@4.1.9': + dependencies: + '@ampproject/remapping': 2.3.0 + enhanced-resolve: 5.18.4 + jiti: 2.6.1 + lightningcss: 1.30.1 + magic-string: 0.30.21 + source-map-js: 1.2.1 + tailwindcss: 4.1.9 + + '@tailwindcss/oxide-android-arm64@4.1.9': + optional: true + + '@tailwindcss/oxide-darwin-arm64@4.1.9': + optional: true + + '@tailwindcss/oxide-darwin-x64@4.1.9': + optional: true + + '@tailwindcss/oxide-freebsd-x64@4.1.9': + optional: true + + '@tailwindcss/oxide-linux-arm-gnueabihf@4.1.9': + optional: true + + '@tailwindcss/oxide-linux-arm64-gnu@4.1.9': + optional: true + + '@tailwindcss/oxide-linux-arm64-musl@4.1.9': + optional: true + + '@tailwindcss/oxide-linux-x64-gnu@4.1.9': + optional: true + + '@tailwindcss/oxide-linux-x64-musl@4.1.9': + optional: true + + '@tailwindcss/oxide-wasm32-wasi@4.1.9': + optional: true + + '@tailwindcss/oxide-win32-arm64-msvc@4.1.9': + optional: true + + '@tailwindcss/oxide-win32-x64-msvc@4.1.9': + optional: true + + '@tailwindcss/oxide@4.1.9': + dependencies: + detect-libc: 2.1.2 + tar: 7.5.2 + optionalDependencies: + '@tailwindcss/oxide-android-arm64': 4.1.9 + '@tailwindcss/oxide-darwin-arm64': 4.1.9 + '@tailwindcss/oxide-darwin-x64': 4.1.9 + '@tailwindcss/oxide-freebsd-x64': 4.1.9 + '@tailwindcss/oxide-linux-arm-gnueabihf': 4.1.9 + '@tailwindcss/oxide-linux-arm64-gnu': 4.1.9 + '@tailwindcss/oxide-linux-arm64-musl': 4.1.9 + '@tailwindcss/oxide-linux-x64-gnu': 4.1.9 + '@tailwindcss/oxide-linux-x64-musl': 4.1.9 + '@tailwindcss/oxide-wasm32-wasi': 4.1.9 + '@tailwindcss/oxide-win32-arm64-msvc': 4.1.9 + '@tailwindcss/oxide-win32-x64-msvc': 4.1.9 + + '@tailwindcss/postcss@4.1.9': + dependencies: + '@alloc/quick-lru': 5.2.0 + '@tailwindcss/node': 4.1.9 + '@tailwindcss/oxide': 4.1.9 + postcss: 8.5.0 + tailwindcss: 4.1.9 + + '@types/d3-array@3.2.2': {} + + '@types/d3-color@3.1.3': {} + + '@types/d3-ease@3.0.2': {} + + '@types/d3-interpolate@3.0.4': + dependencies: + '@types/d3-color': 3.1.3 + + '@types/d3-path@3.1.1': {} + + '@types/d3-scale@4.0.9': + dependencies: + '@types/d3-time': 3.0.4 + + '@types/d3-shape@3.1.8': + dependencies: + '@types/d3-path': 3.1.1 + + '@types/d3-time@3.0.4': {} + + '@types/d3-timer@3.0.2': {} + + '@types/node@22.0.0': + dependencies: + undici-types: 6.11.1 + + '@types/react-dom@19.0.0': + dependencies: + '@types/react': 19.0.0 + + '@types/react@19.0.0': + dependencies: + csstype: 3.2.3 + + '@vercel/analytics@1.3.1(next@16.0.10(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react@19.2.0)': + dependencies: + server-only: 0.0.1 + optionalDependencies: + next: 16.0.10(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + react: 19.2.0 + + aria-hidden@1.2.6: + dependencies: + tslib: 2.8.1 + + autoprefixer@10.4.20(postcss@8.5.0): + dependencies: + browserslist: 4.28.1 + caniuse-lite: 1.0.30001764 + fraction.js: 4.3.7 + normalize-range: 0.1.2 + picocolors: 1.1.1 + postcss: 8.5.0 + postcss-value-parser: 4.2.0 + + baseline-browser-mapping@2.9.14: {} + + browserslist@4.28.1: + dependencies: + baseline-browser-mapping: 2.9.14 + caniuse-lite: 1.0.30001764 + electron-to-chromium: 1.5.267 + node-releases: 2.0.27 + update-browserslist-db: 1.2.3(browserslist@4.28.1) + + caniuse-lite@1.0.30001764: {} + + chownr@3.0.0: {} + + class-variance-authority@0.7.1: + dependencies: + clsx: 2.1.1 + + client-only@0.0.1: {} + + clsx@2.1.1: {} + + cmdk@1.0.4(@types/react-dom@19.0.0)(@types/react@19.0.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0): + dependencies: + '@radix-ui/react-dialog': 1.1.4(@types/react-dom@19.0.0)(@types/react@19.0.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-id': 1.1.1(@types/react@19.0.0)(react@19.2.0) + '@radix-ui/react-primitive': 2.1.4(@types/react-dom@19.0.0)(@types/react@19.0.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + react: 19.2.0 + react-dom: 19.2.0(react@19.2.0) + use-sync-external-store: 1.6.0(react@19.2.0) + transitivePeerDependencies: + - '@types/react' + - '@types/react-dom' + + csstype@3.2.3: {} + + d3-array@3.2.4: + dependencies: + internmap: 2.0.3 + + d3-color@3.1.0: {} + + d3-ease@3.0.1: {} + + d3-format@3.1.2: {} + + d3-interpolate@3.0.1: + dependencies: + d3-color: 3.1.0 + + d3-path@3.1.0: {} + + d3-scale@4.0.2: + dependencies: + d3-array: 3.2.4 + d3-format: 3.1.2 + d3-interpolate: 3.0.1 + d3-time: 3.1.0 + d3-time-format: 4.1.0 + + d3-shape@3.2.0: + dependencies: + d3-path: 3.1.0 + + d3-time-format@4.1.0: + dependencies: + d3-time: 3.1.0 + + d3-time@3.1.0: + dependencies: + d3-array: 3.2.4 + + d3-timer@3.0.1: {} + + date-fns-jalali@4.1.0-0: {} + + date-fns@4.1.0: {} + + decimal.js-light@2.5.1: {} + + detect-libc@2.1.2: {} + + detect-node-es@1.1.0: {} + + dom-helpers@5.2.1: + dependencies: + '@babel/runtime': 7.28.6 + csstype: 3.2.3 + + electron-to-chromium@1.5.267: {} + + embla-carousel-react@8.5.1(react@19.2.0): + dependencies: + embla-carousel: 8.5.1 + embla-carousel-reactive-utils: 8.5.1(embla-carousel@8.5.1) + react: 19.2.0 + + embla-carousel-reactive-utils@8.5.1(embla-carousel@8.5.1): + dependencies: + embla-carousel: 8.5.1 + + embla-carousel@8.5.1: {} + + enhanced-resolve@5.18.4: + dependencies: + graceful-fs: 4.2.11 + tapable: 2.3.0 + + escalade@3.2.0: {} + + eventemitter3@4.0.7: {} + + fast-equals@5.4.0: {} + + fraction.js@4.3.7: {} + + get-nonce@1.0.1: {} + + graceful-fs@4.2.11: {} + + input-otp@1.4.1(react-dom@19.2.0(react@19.2.0))(react@19.2.0): + dependencies: + react: 19.2.0 + react-dom: 19.2.0(react@19.2.0) + + internmap@2.0.3: {} + + jiti@2.6.1: {} + + js-tokens@4.0.0: {} + + lightningcss-darwin-arm64@1.30.1: + optional: true + + lightningcss-darwin-x64@1.30.1: + optional: true + + lightningcss-freebsd-x64@1.30.1: + optional: true + + lightningcss-linux-arm-gnueabihf@1.30.1: + optional: true + + lightningcss-linux-arm64-gnu@1.30.1: + optional: true + + lightningcss-linux-arm64-musl@1.30.1: + optional: true + + lightningcss-linux-x64-gnu@1.30.1: + optional: true + + lightningcss-linux-x64-musl@1.30.1: + optional: true + + lightningcss-win32-arm64-msvc@1.30.1: + optional: true + + lightningcss-win32-x64-msvc@1.30.1: + optional: true + + lightningcss@1.30.1: + dependencies: + detect-libc: 2.1.2 + optionalDependencies: + lightningcss-darwin-arm64: 1.30.1 + lightningcss-darwin-x64: 1.30.1 + lightningcss-freebsd-x64: 1.30.1 + lightningcss-linux-arm-gnueabihf: 1.30.1 + lightningcss-linux-arm64-gnu: 1.30.1 + lightningcss-linux-arm64-musl: 1.30.1 + lightningcss-linux-x64-gnu: 1.30.1 + lightningcss-linux-x64-musl: 1.30.1 + lightningcss-win32-arm64-msvc: 1.30.1 + lightningcss-win32-x64-msvc: 1.30.1 + + lodash@4.17.21: {} + + loose-envify@1.4.0: + dependencies: + js-tokens: 4.0.0 + + lucide-react@0.454.0(react@19.2.0): + dependencies: + react: 19.2.0 + + magic-string@0.30.21: + dependencies: + '@jridgewell/sourcemap-codec': 1.5.5 + + minipass@7.1.2: {} + + minizlib@3.1.0: + dependencies: + minipass: 7.1.2 + + nanoid@3.3.11: {} + + next-themes@0.4.6(react-dom@19.2.0(react@19.2.0))(react@19.2.0): + dependencies: + react: 19.2.0 + react-dom: 19.2.0(react@19.2.0) + + next@16.0.10(react-dom@19.2.0(react@19.2.0))(react@19.2.0): + dependencies: + '@next/env': 16.0.10 + '@swc/helpers': 0.5.15 + caniuse-lite: 1.0.30001764 + postcss: 8.4.31 + react: 19.2.0 + react-dom: 19.2.0(react@19.2.0) + styled-jsx: 5.1.6(react@19.2.0) + optionalDependencies: + '@next/swc-darwin-arm64': 16.0.10 + '@next/swc-darwin-x64': 16.0.10 + '@next/swc-linux-arm64-gnu': 16.0.10 + '@next/swc-linux-arm64-musl': 16.0.10 + '@next/swc-linux-x64-gnu': 16.0.10 + '@next/swc-linux-x64-musl': 16.0.10 + '@next/swc-win32-arm64-msvc': 16.0.10 + '@next/swc-win32-x64-msvc': 16.0.10 + sharp: 0.34.5 + transitivePeerDependencies: + - '@babel/core' + - babel-plugin-macros + + node-releases@2.0.27: {} + + normalize-range@0.1.2: {} + + object-assign@4.1.1: {} + + picocolors@1.1.1: {} + + postcss-value-parser@4.2.0: {} + + postcss@8.4.31: + dependencies: + nanoid: 3.3.11 + picocolors: 1.1.1 + source-map-js: 1.2.1 + + postcss@8.5.0: + dependencies: + nanoid: 3.3.11 + picocolors: 1.1.1 + source-map-js: 1.2.1 + + prop-types@15.8.1: + dependencies: + loose-envify: 1.4.0 + object-assign: 4.1.1 + react-is: 16.13.1 + + react-day-picker@9.8.0(react@19.2.0): + dependencies: + '@date-fns/tz': 1.2.0 + date-fns: 4.1.0 + date-fns-jalali: 4.1.0-0 + react: 19.2.0 + + react-dom@19.2.0(react@19.2.0): + dependencies: + react: 19.2.0 + scheduler: 0.27.0 + + react-hook-form@7.60.0(react@19.2.0): + dependencies: + react: 19.2.0 + + react-is@16.13.1: {} + + react-is@18.3.1: {} + + react-remove-scroll-bar@2.3.8(@types/react@19.0.0)(react@19.2.0): + dependencies: + react: 19.2.0 + react-style-singleton: 2.2.3(@types/react@19.0.0)(react@19.2.0) + tslib: 2.8.1 + optionalDependencies: + '@types/react': 19.0.0 + + react-remove-scroll@2.7.2(@types/react@19.0.0)(react@19.2.0): + dependencies: + react: 19.2.0 + react-remove-scroll-bar: 2.3.8(@types/react@19.0.0)(react@19.2.0) + react-style-singleton: 2.2.3(@types/react@19.0.0)(react@19.2.0) + tslib: 2.8.1 + use-callback-ref: 1.3.3(@types/react@19.0.0)(react@19.2.0) + use-sidecar: 1.1.3(@types/react@19.0.0)(react@19.2.0) + optionalDependencies: + '@types/react': 19.0.0 + + react-resizable-panels@2.1.7(react-dom@19.2.0(react@19.2.0))(react@19.2.0): + dependencies: + react: 19.2.0 + react-dom: 19.2.0(react@19.2.0) + + react-smooth@4.0.4(react-dom@19.2.0(react@19.2.0))(react@19.2.0): + dependencies: + fast-equals: 5.4.0 + prop-types: 15.8.1 + react: 19.2.0 + react-dom: 19.2.0(react@19.2.0) + react-transition-group: 4.4.5(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + + react-style-singleton@2.2.3(@types/react@19.0.0)(react@19.2.0): + dependencies: + get-nonce: 1.0.1 + react: 19.2.0 + tslib: 2.8.1 + optionalDependencies: + '@types/react': 19.0.0 + + react-transition-group@4.4.5(react-dom@19.2.0(react@19.2.0))(react@19.2.0): + dependencies: + '@babel/runtime': 7.28.6 + dom-helpers: 5.2.1 + loose-envify: 1.4.0 + prop-types: 15.8.1 + react: 19.2.0 + react-dom: 19.2.0(react@19.2.0) + + react@19.2.0: {} + + recharts-scale@0.4.5: + dependencies: + decimal.js-light: 2.5.1 + + recharts@2.15.4(react-dom@19.2.0(react@19.2.0))(react@19.2.0): + dependencies: + clsx: 2.1.1 + eventemitter3: 4.0.7 + lodash: 4.17.21 + react: 19.2.0 + react-dom: 19.2.0(react@19.2.0) + react-is: 18.3.1 + react-smooth: 4.0.4(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + recharts-scale: 0.4.5 + tiny-invariant: 1.3.3 + victory-vendor: 36.9.2 + + scheduler@0.27.0: {} + + semver@7.7.3: + optional: true + + server-only@0.0.1: {} + + sharp@0.34.5: + dependencies: + '@img/colour': 1.0.0 + detect-libc: 2.1.2 + semver: 7.7.3 + optionalDependencies: + '@img/sharp-darwin-arm64': 0.34.5 + '@img/sharp-darwin-x64': 0.34.5 + '@img/sharp-libvips-darwin-arm64': 1.2.4 + '@img/sharp-libvips-darwin-x64': 1.2.4 + '@img/sharp-libvips-linux-arm': 1.2.4 + '@img/sharp-libvips-linux-arm64': 1.2.4 + '@img/sharp-libvips-linux-ppc64': 1.2.4 + '@img/sharp-libvips-linux-riscv64': 1.2.4 + '@img/sharp-libvips-linux-s390x': 1.2.4 + '@img/sharp-libvips-linux-x64': 1.2.4 + '@img/sharp-libvips-linuxmusl-arm64': 1.2.4 + '@img/sharp-libvips-linuxmusl-x64': 1.2.4 + '@img/sharp-linux-arm': 0.34.5 + '@img/sharp-linux-arm64': 0.34.5 + '@img/sharp-linux-ppc64': 0.34.5 + '@img/sharp-linux-riscv64': 0.34.5 + '@img/sharp-linux-s390x': 0.34.5 + '@img/sharp-linux-x64': 0.34.5 + '@img/sharp-linuxmusl-arm64': 0.34.5 + '@img/sharp-linuxmusl-x64': 0.34.5 + '@img/sharp-wasm32': 0.34.5 + '@img/sharp-win32-arm64': 0.34.5 + '@img/sharp-win32-ia32': 0.34.5 + '@img/sharp-win32-x64': 0.34.5 + optional: true + + sonner@1.7.4(react-dom@19.2.0(react@19.2.0))(react@19.2.0): + dependencies: + react: 19.2.0 + react-dom: 19.2.0(react@19.2.0) + + source-map-js@1.2.1: {} + + styled-jsx@5.1.6(react@19.2.0): + dependencies: + client-only: 0.0.1 + react: 19.2.0 + + tailwind-merge@3.3.1: {} + + tailwindcss-animate@1.0.7(tailwindcss@4.1.9): + dependencies: + tailwindcss: 4.1.9 + + tailwindcss@4.1.9: {} + + tapable@2.3.0: {} + + tar@7.5.2: + dependencies: + '@isaacs/fs-minipass': 4.0.1 + chownr: 3.0.0 + minipass: 7.1.2 + minizlib: 3.1.0 + yallist: 5.0.0 + + tiny-invariant@1.3.3: {} + + tslib@2.8.1: {} + + tw-animate-css@1.3.3: {} + + typescript@5.0.2: {} + + undici-types@6.11.1: {} + + update-browserslist-db@1.2.3(browserslist@4.28.1): + dependencies: + browserslist: 4.28.1 + escalade: 3.2.0 + picocolors: 1.1.1 + + use-callback-ref@1.3.3(@types/react@19.0.0)(react@19.2.0): + dependencies: + react: 19.2.0 + tslib: 2.8.1 + optionalDependencies: + '@types/react': 19.0.0 + + use-sidecar@1.1.3(@types/react@19.0.0)(react@19.2.0): + dependencies: + detect-node-es: 1.1.0 + react: 19.2.0 + tslib: 2.8.1 + optionalDependencies: + '@types/react': 19.0.0 + + use-sync-external-store@1.6.0(react@19.2.0): + dependencies: + react: 19.2.0 + + vaul@1.1.2(@types/react-dom@19.0.0)(@types/react@19.0.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0): + dependencies: + '@radix-ui/react-dialog': 1.1.4(@types/react-dom@19.0.0)(@types/react@19.0.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + react: 19.2.0 + react-dom: 19.2.0(react@19.2.0) + transitivePeerDependencies: + - '@types/react' + - '@types/react-dom' + + victory-vendor@36.9.2: + dependencies: + '@types/d3-array': 3.2.2 + '@types/d3-ease': 3.0.2 + '@types/d3-interpolate': 3.0.4 + '@types/d3-scale': 4.0.9 + '@types/d3-shape': 3.1.8 + '@types/d3-time': 3.0.4 + '@types/d3-timer': 3.0.2 + d3-array: 3.2.4 + d3-ease: 3.0.1 + d3-interpolate: 3.0.1 + d3-scale: 4.0.2 + d3-shape: 3.2.0 + d3-time: 3.1.0 + d3-timer: 3.0.1 + + yallist@5.0.0: {} + + zod@3.25.76: {} diff --git a/postcss.config.mjs b/postcss.config.mjs new file mode 100644 index 0000000..a869506 --- /dev/null +++ b/postcss.config.mjs @@ -0,0 +1,8 @@ +/** @type {import('postcss-load-config').Config} */ +const config = { + plugins: { + '@tailwindcss/postcss': {}, + }, +} + +export default config diff --git a/public/apple-icon.png b/public/apple-icon.png new file mode 100644 index 0000000000000000000000000000000000000000..f9418b406bdb93a28dfc30c2ea61bef97b9d7c22 GIT binary patch literal 2626 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 literal 0 HcmV?d00001 diff --git a/public/icon-dark-32x32.png b/public/icon-dark-32x32.png new file mode 100644 index 0000000000000000000000000000000000000000..12c825a109e3c3b7941d957d8a2ac936d5717c5b GIT binary patch literal 585 zcmV-P0=E5$P)F5K@I)Y9hkG8}6|W~i?1A`6NlJRKhy3zE`f!keoG%R0 zLjeJTG%_U3XczECJ+W9Ul%E@hL8fWaWHO=AXw-HPJ%Obz83z};-L7?CU4%tZlvbfq zEBjzx9^1A}Dr6sIBaY)TBdrV^4u?`@rFb@*wbXi^SI_f8Vm_bOV-;zd3J%)H1n!X; z$~%U-YUfcD(Q37#N6E6R%!<5wkR(aNuWGW6j0n4%|2!eXNTrO$5-O@GSb5HORaRJwL>*7H%p)jeV2su!r z*f@A&t;!dLE_1aH@a~o88UniJApD$%1pw?uB>;9y@TUdjc`mp(TLJ*rORM9l437xC z26nfAN`%~~s)g__*G88?fQq|*4;+uj@<@)yW8#!H=FnjF`+euV)9JL?f=~SaAo&vl z3erab0bit#2t{b|MNE2l9}WhCgfDLYy6X?0V`ueA*$pRw#5ZO?_MS6vLWbO% z$;=!eG9lP9wu((Y*{a{QLvkP)fYfDCmppnQxw1r&haSk4i4VSf(V24@8gKNI90B=3 z4FQro;+;IhyMRx660$6_KCkPV4u=D6w_7@$PFA0%l+-00k4HI~OnUFNNf-n{V+uC4 zx)0{{@n*9j8+0E;V>}+ye!uTWU^E&vDizl2bx&;^$L+ijLgsnij%`s1!%$XLWkiCH z%J6yDcMNrE=Nv9dl7#LBlQ&V(cMq^|!_TM!kWZ)6)_Jj5P!vVEk`@SLyjG)<)q5a61F@a{Ty3(#Ng3V>Zh{;&W(Q@PvidIB)VXKp+Pfz3D^*|nX!x6ubJS7JZlAMP9Jr_FRH=9>9Cn9I^!T + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/images/beian.png b/public/images/beian.png new file mode 100644 index 0000000000000000000000000000000000000000..2a13ba2f4b92c4b531945a66e3e35e3ead3739f9 GIT binary patch literal 1403 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 \ No newline at end of file diff --git a/public/placeholder-user.jpg b/public/placeholder-user.jpg new file mode 100644 index 0000000000000000000000000000000000000000..6fa7543d38ed8fdb38f03b5c0f40ad2d66827d4a GIT binary patch literal 1635 zcmex=cRarq{jAqGJXh7$}Ym>C5bm;@P_1sVSzVUPwol9>?*7~p`Fjh%&&i5Vyo`r#xP0%qgXfnHy zn7E>$Lug{-LIb0a!ifhj3W%7RB^MNLx}>0_tP&7BY4IaqjBo(siP4_n_ky5FEmL(` zmhdc@Jb`OxUUPQK!#sq(C`ZJd3YCA-U zh)gnS;tOzhJ@#Yf$SRGl2DVF#R;SL@d2ijhdh5m?{S3~XPpnp*$)2k2D4JJuYTMD;n0K36=Y8OJ z-mS1ZZC1 z49BdqoLoM_v$9v)Hm?5W<`Stp{n4{)u7wjb{~fvi z!T;47&))dGMoGtVj(5+GENxwrz4z{INB>V}1-4JUxp@DgJ8LKAUAQWhoR~X5%Wp!~ z=~v%IB`XWv>j>XTei(%h-3q0fm1bY5udCHKmu^f&G@&$==-St!-gGk?J$~inXs)aj#q07WR4- zM=rxkFUy8C!QJtD_bgKux*|B+dhW6{-z2Xe?@~0Ks(ijMro-3a&Mj#N$xpGBRnmWt zTsUxz-_bhtPjF={K-%Z^57b<}UkWR&Lo)qWhnrV2yD?(SL?Q-l9d; zHS6^j9!_Ejaqqemoyn}=@ptvvS-S7I7N7FZ5}(WNv3l;#-@XTLOmcJGRz1a7FhcBC z-nPY(UsETGE4&Rdme=pC+jj2j;!j+6o-!m}7oD?jz2dGcAvK4%qSmfE=U+z7Z+`#j z$Mx4a@1yJ$R+zt@y0z(yW_ISH^4k|<^!Al@?-M=r`gz3ehXgqVyM1>}k-Q}GF<-;) z*LLGyVd)Qk|Ji$(J?dTY-07-((_=n_`3T&d5FiH|guzja;wny>q}tw+C34*a{8 zfJ9i0DbumfeTVp1E#|(wudjdSJE%AnL@H&$nSBB{^D;34Gp|fN9u>e68m!_b0O__- AD*ylh literal 0 HcmV?d00001 diff --git a/public/placeholder.jpg b/public/placeholder.jpg new file mode 100644 index 0000000000000000000000000000000000000000..6bfe96336dbe567f5f1e9129f5bccdc78b114bba GIT binary patch literal 1064 zcmb7@Nla5w6o$`zL;Ko7c&|)~7+MC)5J;K9giwZ-mWToZDl29|7tA;;v?z!g5*b9% zRSP(-1ZOwO;J6Z;05{Ybq6y%HZtA^{7Ghj^Zu0K`Ud}o9eCM5OpR~^apJ^}|03iS) zUSPLDyMAv~1wd97gaQBuEK&lE6~YUU53r&J$VBT_bS?^Z_)q|CRlqoW3h_=1XC~2( zowlIWj23Fe8(HX8O~UM7AR)W5x}mzhvbshU9ifGUR8tm1vSSl)WSJzz{QQ zmi2yKNVU))a_#4eg7^#He zB=v{_T40oFHqzanm!#xGc@)^&2;D-M({g?EZs?j~+jH z`uxSqSCdoIGw \ No newline at end of file diff --git a/styles/globals.css b/styles/globals.css new file mode 100644 index 0000000..dc2aea1 --- /dev/null +++ b/styles/globals.css @@ -0,0 +1,125 @@ +@import 'tailwindcss'; +@import 'tw-animate-css'; + +@custom-variant dark (&:is(.dark *)); + +:root { + --background: oklch(1 0 0); + --foreground: oklch(0.145 0 0); + --card: oklch(1 0 0); + --card-foreground: oklch(0.145 0 0); + --popover: oklch(1 0 0); + --popover-foreground: oklch(0.145 0 0); + --primary: oklch(0.205 0 0); + --primary-foreground: oklch(0.985 0 0); + --secondary: oklch(0.97 0 0); + --secondary-foreground: oklch(0.205 0 0); + --muted: oklch(0.97 0 0); + --muted-foreground: oklch(0.556 0 0); + --accent: oklch(0.97 0 0); + --accent-foreground: oklch(0.205 0 0); + --destructive: oklch(0.577 0.245 27.325); + --destructive-foreground: oklch(0.577 0.245 27.325); + --border: oklch(0.922 0 0); + --input: oklch(0.922 0 0); + --ring: oklch(0.708 0 0); + --chart-1: oklch(0.646 0.222 41.116); + --chart-2: oklch(0.6 0.118 184.704); + --chart-3: oklch(0.398 0.07 227.392); + --chart-4: oklch(0.828 0.189 84.429); + --chart-5: oklch(0.769 0.188 70.08); + --radius: 0.625rem; + --sidebar: oklch(0.985 0 0); + --sidebar-foreground: oklch(0.145 0 0); + --sidebar-primary: oklch(0.205 0 0); + --sidebar-primary-foreground: oklch(0.985 0 0); + --sidebar-accent: oklch(0.97 0 0); + --sidebar-accent-foreground: oklch(0.205 0 0); + --sidebar-border: oklch(0.922 0 0); + --sidebar-ring: oklch(0.708 0 0); +} + +.dark { + --background: oklch(0.145 0 0); + --foreground: oklch(0.985 0 0); + --card: oklch(0.145 0 0); + --card-foreground: oklch(0.985 0 0); + --popover: oklch(0.145 0 0); + --popover-foreground: oklch(0.985 0 0); + --primary: oklch(0.985 0 0); + --primary-foreground: oklch(0.205 0 0); + --secondary: oklch(0.269 0 0); + --secondary-foreground: oklch(0.985 0 0); + --muted: oklch(0.269 0 0); + --muted-foreground: oklch(0.708 0 0); + --accent: oklch(0.269 0 0); + --accent-foreground: oklch(0.985 0 0); + --destructive: oklch(0.396 0.141 25.723); + --destructive-foreground: oklch(0.637 0.237 25.331); + --border: oklch(0.269 0 0); + --input: oklch(0.269 0 0); + --ring: oklch(0.439 0 0); + --chart-1: oklch(0.488 0.243 264.376); + --chart-2: oklch(0.696 0.17 162.48); + --chart-3: oklch(0.769 0.188 70.08); + --chart-4: oklch(0.627 0.265 303.9); + --chart-5: oklch(0.645 0.246 16.439); + --sidebar: oklch(0.205 0 0); + --sidebar-foreground: oklch(0.985 0 0); + --sidebar-primary: oklch(0.488 0.243 264.376); + --sidebar-primary-foreground: oklch(0.985 0 0); + --sidebar-accent: oklch(0.269 0 0); + --sidebar-accent-foreground: oklch(0.985 0 0); + --sidebar-border: oklch(0.269 0 0); + --sidebar-ring: oklch(0.439 0 0); +} + +@theme inline { + --font-sans: 'Geist', 'Geist Fallback'; + --font-mono: 'Geist Mono', 'Geist Mono Fallback'; + --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-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); + --radius-sm: calc(var(--radius) - 4px); + --radius-md: calc(var(--radius) - 2px); + --radius-lg: var(--radius); + --radius-xl: calc(var(--radius) + 4px); + --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 outline-ring/50; + } + body { + @apply bg-background text-foreground; + } +} diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 0000000..4b2dc7b --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,27 @@ +{ + "compilerOptions": { + "lib": ["dom", "dom.iterable", "esnext"], + "allowJs": true, + "target": "ES6", + "skipLibCheck": true, + "strict": true, + "noEmit": true, + "esModuleInterop": true, + "module": "esnext", + "moduleResolution": "bundler", + "resolveJsonModule": true, + "isolatedModules": true, + "jsx": "preserve", + "incremental": true, + "plugins": [ + { + "name": "next" + } + ], + "paths": { + "@/*": ["./*"] + } + }, + "include": ["next-env.d.ts", "**/*.ts", "**/*.tsx", ".next/types/**/*.ts"], + "exclude": ["node_modules"] +}