dimensionalpulsar commited on
Commit
8e723d7
·
verified ·
1 Parent(s): 952569a

Upload 32 files

Browse files
app/intranet/page.tsx ADDED
@@ -0,0 +1,116 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ "use client";
2
+
3
+ import React, { useState, useEffect, useRef } from "react";
4
+ import { db, auth } from "@/lib/firebase";
5
+ import { collection, onSnapshot, addDoc, serverTimestamp, query, orderBy, limit } from "firebase/firestore";
6
+ import { Send, User as UserIcon, Bell } from "lucide-react";
7
+ import { motion, AnimatePresence } from "framer-motion";
8
+
9
+ interface Message {
10
+ id: string;
11
+ text: string;
12
+ sender: string;
13
+ senderEmail: string;
14
+ timestamp: any;
15
+ }
16
+
17
+ export default function IntranetPage() {
18
+ const [messages, setMessages] = useState<Message[]>([]);
19
+ const [newMsg, setNewMsg] = useState("");
20
+ const scrollRef = useRef<HTMLDivElement>(null);
21
+
22
+ useEffect(() => {
23
+ const q = query(collection(db, "messages"), orderBy("timestamp", "asc"), limit(50));
24
+ const unsub = onSnapshot(q, (snap) => {
25
+ setMessages(snap.docs.map(doc => ({ id: doc.id, ...doc.data() } as Message)));
26
+ });
27
+ return () => unsub();
28
+ }, []);
29
+
30
+ useEffect(() => {
31
+ scrollRef.current?.scrollIntoView({ behavior: "smooth" });
32
+ }, [messages]);
33
+
34
+ const handleSend = async (e: React.FormEvent) => {
35
+ e.preventDefault();
36
+ if (!newMsg.trim() || !auth.currentUser) return;
37
+ await addDoc(collection(db, "messages"), {
38
+ text: newMsg,
39
+ sender: auth.currentUser.displayName || auth.currentUser.email?.split("@")[0],
40
+ senderEmail: auth.currentUser.email,
41
+ timestamp: serverTimestamp()
42
+ });
43
+ setNewMsg("");
44
+ };
45
+
46
+ return (
47
+ <div className="h-screen flex flex-col p-10">
48
+ <header className="flex justify-between items-center mb-10 shrink-0">
49
+ <div>
50
+ <h1 className="text-4xl font-black tracking-tightest flex items-center gap-4 italic uppercase">
51
+ Staff / Intranet
52
+ <Bell size={24} className="text-gray-700 animate-pulse" />
53
+ </h1>
54
+ <p className="text-gray-500 font-bold text-xs mt-1">Sala de Comunicación Interna Segura</p>
55
+ </div>
56
+ </header>
57
+
58
+ <div className="flex-1 bg-white/5 border border-white/10 rounded-[40px] backdrop-blur-3xl overflow-hidden flex flex-col shadow-2xl">
59
+ {/* Message Feed */}
60
+ <div className="flex-1 overflow-y-auto p-10 space-y-6 no-scrollbar relative">
61
+ <div className="absolute top-0 left-0 w-full h-20 bg-gradient-to-b from-[#0f172a] to-transparent pointer-events-none sticky z-10 opacity-40"></div>
62
+
63
+ <AnimatePresence>
64
+ {messages.map((m) => {
65
+ const isMe = m.senderEmail === auth.currentUser?.email;
66
+ return (
67
+ <motion.div
68
+ key={m.id}
69
+ initial={{ opacity: 0, x: isMe ? 20 : -20 }}
70
+ animate={{ opacity: 1, x: 0 }}
71
+ className={`flex ${isMe ? 'justify-end' : 'justify-start'}`}
72
+ >
73
+ <div className={`max-w-[70%] group flex flex-col ${isMe ? 'items-end' : 'items-start'}`}>
74
+ <div className="flex items-center gap-2 mb-2">
75
+ {!isMe && <div className="w-6 h-6 bg-white/10 rounded-full flex items-center justify-center text-[10px]">👔</div>}
76
+ <span className="text-[10px] text-gray-500 font-black uppercase tracking-widest">{m.sender}</span>
77
+ {isMe && <div className="w-6 h-6 bg-blue-500/20 rounded-full flex items-center justify-center text-[10px] text-blue-400">YO</div>}
78
+ </div>
79
+ <div className={`
80
+ px-6 py-4 rounded-3xl text-sm font-medium shadow-lg transition-all
81
+ ${isMe ? 'bg-blue-600 text-white rounded-tr-none' : 'bg-white/10 text-gray-200 rounded-tl-none border border-white/10'}
82
+ `}>
83
+ {m.text}
84
+ </div>
85
+ <span className="mt-2 text-[8px] text-gray-700 font-black opacity-0 group-hover:opacity-100 transition-opacity uppercase tracking-tighter">
86
+ Enviado hace un momento
87
+ </span>
88
+ </div>
89
+ </motion.div>
90
+ );
91
+ })}
92
+ </AnimatePresence>
93
+ <div ref={scrollRef} />
94
+ </div>
95
+
96
+ {/* Input Bar */}
97
+ <div className="p-8 bg-white/5 border-t border-white/5 backdrop-blur-md">
98
+ <form onSubmit={handleSend} className="relative">
99
+ <input
100
+ value={newMsg}
101
+ onChange={(e) => setNewMsg(e.target.value)}
102
+ placeholder="Escribe un mensaje al equipo..."
103
+ className="w-full bg-white/5 border border-white/10 rounded-full px-10 py-5 outline-none focus:border-blue-500/40 transition-all font-medium pr-20"
104
+ />
105
+ <button
106
+ type="submit"
107
+ className="absolute right-3 top-1/2 -translate-y-1/2 p-4 bg-gradient-to-br from-blue-600 to-indigo-600 rounded-full shadow-lg shadow-blue-900/40 hover:scale-110 active:scale-95 transition-all"
108
+ >
109
+ <Send size={20} />
110
+ </button>
111
+ </form>
112
+ </div>
113
+ </div>
114
+ </div>
115
+ );
116
+ }
app/layout.tsx CHANGED
@@ -9,6 +9,8 @@ export const metadata: Metadata = {
9
  description: "Modern Enterprise Resource Planning system powered by Firebase",
10
  };
11
 
 
 
12
  export default function RootLayout({
13
  children,
14
  }: Readonly<{
@@ -16,7 +18,12 @@ export default function RootLayout({
16
  }>) {
17
  return (
18
  <html lang="es">
19
- <body className={`${inter.className} bg-[#0f172a]`}>{children}</body>
 
 
 
 
 
20
  </html>
21
  );
22
  }
 
9
  description: "Modern Enterprise Resource Planning system powered by Firebase",
10
  };
11
 
12
+ import Sidebar from "@/components/Sidebar";
13
+
14
  export default function RootLayout({
15
  children,
16
  }: Readonly<{
 
18
  }>) {
19
  return (
20
  <html lang="es">
21
+ <body className={`${inter.className} bg-[#0f172a] text-white selection:bg-blue-500/30`}>
22
+ <Sidebar />
23
+ <main className="ml-72 min-h-screen">
24
+ {children}
25
+ </main>
26
+ </body>
27
  </html>
28
  );
29
  }
app/login/page.tsx CHANGED
@@ -54,47 +54,47 @@ export default function LoginPage() {
54
  <div>
55
  <input
56
  type="email"
57
- placeholder="Email corporativo"
58
  required
59
  value={email}
60
  onChange={(e) => setEmail(e.target.value)}
61
- className="w-full bg-white/5 border border-white/10 rounded-2xl px-6 py-4 outline-none focus:border-blue-500/50 focus:bg-white/10 transition-all placeholder:text-gray-600"
62
  />
63
  </div>
64
  <div>
65
  <input
66
  type="password"
67
- placeholder="Contraseña"
68
  required
69
  value={password}
70
  onChange={(e) => setPassword(e.target.value)}
71
- className="w-full bg-white/5 border border-white/10 rounded-2xl px-6 py-4 outline-none focus:border-blue-500/50 focus:bg-white/10 transition-all placeholder:text-gray-600"
72
  />
73
  </div>
74
 
75
  {error && (
76
- <div className="bg-red-500/10 border border-red-500/20 text-red-400 text-xs p-4 rounded-xl animate-shake">
77
  {error}
78
  </div>
79
  )}
80
 
81
- <button
82
- type="submit"
83
- disabled={loading}
84
- className="w-full bg-gradient-to-r from-blue-600 to-indigo-600 hover:from-blue-500 hover:to-indigo-500 text-white font-bold py-4 rounded-2xl shadow-lg shadow-blue-900/20 hover:shadow-blue-900/40 transition-all transform active:scale-95 disabled:opacity-50"
85
- >
86
- {loading ? (
87
- <span className="flex items-center justify-center gap-2">
88
- <svg className="animate-spin h-5 w-5 text-white" xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24">
89
- <circle className="opacity-25" cx="12" cy="12" r="10" stroke="currentColor" strokeWidth="4"></circle>
90
- <path className="opacity-75" fill="currentColor" d="M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z"></path>
91
- </svg>
92
- Autenticando...
93
- </span>
94
- ) : (
95
- "Entrar"
96
- )}
97
- </button>
98
  </form>
99
 
100
  <p className="mt-8 text-center text-xs text-gray-500 font-medium">
 
54
  <div>
55
  <input
56
  type="email"
57
+ placeholder="admin@empresa-erp.com"
58
  required
59
  value={email}
60
  onChange={(e) => setEmail(e.target.value)}
61
+ className="w-full bg-white/5 border border-white/10 rounded-2xl px-6 py-4 outline-none focus:border-blue-500/50 focus:bg-white/10 transition-all placeholder:text-gray-700"
62
  />
63
  </div>
64
  <div>
65
  <input
66
  type="password"
67
+ placeholder="Contraseña (ej: 123456)"
68
  required
69
  value={password}
70
  onChange={(e) => setPassword(e.target.value)}
71
+ className="w-full bg-white/5 border border-white/10 rounded-2xl px-6 py-4 outline-none focus:border-blue-500/50 focus:bg-white/10 transition-all placeholder:text-gray-700"
72
  />
73
  </div>
74
 
75
  {error && (
76
+ <div className="bg-red-500/10 border border-red-500/20 text-red-400 text-xs p-4 rounded-xl">
77
  {error}
78
  </div>
79
  )}
80
 
81
+ <div className="flex flex-col gap-3">
82
+ <button
83
+ type="submit"
84
+ disabled={loading}
85
+ className="w-full bg-gradient-to-r from-blue-600 to-indigo-600 hover:from-blue-500 hover:to-indigo-500 text-white font-bold py-4 rounded-2xl shadow-lg shadow-blue-900/20 hover:shadow-blue-900/40 transition-all transform active:scale-95 disabled:opacity-50"
86
+ >
87
+ {loading ? "Autenticando..." : "Entrar"}
88
+ </button>
89
+
90
+ <button
91
+ type="button"
92
+ onClick={() => { setEmail("admin@empresa-erp.com"); setPassword("123456"); }}
93
+ className="w-full bg-white/5 border border-white/5 text-gray-400 hover:text-white hover:bg-white/10 py-3 rounded-2xl text-[10px] font-black uppercase tracking-widest transition-all"
94
+ >
95
+ Autocompletar Demo Admin
96
+ </button>
97
+ </div>
98
  </form>
99
 
100
  <p className="mt-8 text-center text-xs text-gray-500 font-medium">
app/mind-map/page.tsx ADDED
@@ -0,0 +1,114 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ "use client";
2
+
3
+ import React, { useState } from "react";
4
+ import { motion, AnimatePresence } from "framer-motion";
5
+ import {
6
+ Network,
7
+ Target,
8
+ Rocket,
9
+ Shield,
10
+ Users,
11
+ Zap,
12
+ Heart,
13
+ Briefcase
14
+ } from "lucide-react";
15
+
16
+ const mindMapData = [
17
+ { id: "root", label: "Corporación ERP", icon: Network, color: "text-blue-400", sub: ["mision", "vision", "valores"] },
18
+ { id: "mision", label: "Misión", icon: Target, color: "text-purple-400", sub: ["digitalizar", "automatizar"] },
19
+ { id: "vision", label: "Visión 2030", icon: Rocket, color: "text-orange-400", sub: ["global", "ia"] },
20
+ { id: "valores", label: "Valores", icon: Shield, color: "text-emerald-400", sub: ["etica", "calidad"] },
21
+ { id: "digitalizar", label: "Digitalización", icon: Zap, color: "text-yellow-400", parent: "mision" },
22
+ { id: "automatizar", label: "Automatización", icon: Heart, color: "text-pink-400", parent: "mision" },
23
+ { id: "global", label: "Expansión Global", icon: Briefcase, color: "text-blue-500", parent: "vision" },
24
+ { id: "ia", label: "IA Avanzada", icon: Rocket, color: "text-indigo-400", parent: "vision" },
25
+ ];
26
+
27
+ export default function MindMapPage() {
28
+ const [activeNode, setActiveNode] = useState("root");
29
+
30
+ const currentNode = mindMapData.find(n => n.id === activeNode) || mindMapData[0];
31
+ const children = mindMapData.filter(n => currentNode.sub?.includes(n.id));
32
+ const parent = mindMapData.find(n => n.id === currentNode.parent);
33
+
34
+ return (
35
+ <div className="p-10 min-h-screen relative flex items-center justify-center overflow-hidden">
36
+ <div className="absolute top-10 left-10">
37
+ <h1 className="text-4xl font-black italic mb-2 tracking-tighter">MIND / MAP</h1>
38
+ <p className="text-gray-500 font-bold uppercase text-[10px] tracking-widest">ADN de la Organización</p>
39
+ </div>
40
+
41
+ <AnimatePresence mode="wait">
42
+ <motion.div
43
+ key={activeNode}
44
+ initial={{ opacity: 0, scale: 0.8 }}
45
+ animate={{ opacity: 1, scale: 1 }}
46
+ exit={{ opacity: 0, scale: 1.2 }}
47
+ className="relative flex flex-col items-center"
48
+ >
49
+ {/* Main Node */}
50
+ <div className="relative z-20">
51
+ <NodeUI node={currentNode} size="large" />
52
+
53
+ {/* Parent Link */}
54
+ {parent && (
55
+ <button
56
+ onClick={() => setActiveNode(parent.id)}
57
+ className="absolute -top-32 left-1/2 -translate-x-1/2 px-4 py-2 bg-white/5 border border-white/10 rounded-full text-[10px] font-black uppercase text-gray-500 hover:text-white hover:bg-white/10 transition-all border-dashed"
58
+ >
59
+ ↑ Subir a {parent.label}
60
+ </button>
61
+ )}
62
+ </div>
63
+
64
+ {/* Children Nodes */}
65
+ {children.length > 0 && (
66
+ <div className="mt-40 flex gap-20 relative">
67
+ {children.map((child, i) => (
68
+ <div key={child.id} className="relative group">
69
+ <motion.div
70
+ initial={{ y: 20, opacity: 0 }}
71
+ animate={{ y: 0, opacity: 1 }}
72
+ transition={{ delay: i * 0.1 }}
73
+ onClick={() => setActiveNode(child.id)}
74
+ className="cursor-pointer"
75
+ >
76
+ <NodeUI node={child} size="medium" />
77
+ </motion.div>
78
+ {/* Line */}
79
+ <div className="absolute -top-24 left-1/2 -translate-x-1/2 w-px h-24 bg-gradient-to-t from-white/20 to-transparent"></div>
80
+ </div>
81
+ ))}
82
+ </div>
83
+ )}
84
+ </motion.div>
85
+ </AnimatePresence>
86
+
87
+ <div className="absolute bottom-10 right-10 text-right text-[10px] text-gray-700 font-bold uppercase tracking-widest leading-loose">
88
+ Navegación Interactiva<br/>
89
+ Selecciona un nodo para profundizar<br/>
90
+ Basado en Core-Business Pillars
91
+ </div>
92
+ </div>
93
+ );
94
+ }
95
+
96
+ function NodeUI({ node, size }: { node: any, size: "large" | "medium" }) {
97
+ const Icon = node.icon;
98
+ return (
99
+ <div className={`
100
+ flex flex-col items-center justify-center rounded-[3rem] border backdrop-blur-3xl shadow-2xl group transition-all
101
+ ${size === 'large' ? 'w-64 h-64 bg-blue-600/10 border-blue-500/40' : 'w-48 h-48 bg-white/5 border-white/10 hover:border-white/30 hover:bg-white/10'}
102
+ `}>
103
+ <Icon size={size === 'large' ? 64 : 40} className={`${node.color} mb-6 group-hover:scale-110 transition-transform`} />
104
+ <span className={`font-black uppercase tracking-tighter text-center px-4 ${size === 'large' ? 'text-2xl' : 'text-sm text-gray-400 group-hover:text-white transition-colors'}`}>
105
+ {node.label}
106
+ </span>
107
+ {node.sub && (
108
+ <span className="mt-4 text-[8px] font-black text-blue-500/60 uppercase group-hover:text-blue-400 transition-colors">
109
+ Expandible +
110
+ </span>
111
+ )}
112
+ </div>
113
+ );
114
+ }
app/org-chart/page.tsx ADDED
@@ -0,0 +1,95 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ "use client";
2
+
3
+ import React, { useState, useEffect } from "react";
4
+ import { db } from "@/lib/firebase";
5
+ import { collection, onSnapshot } from "firebase/firestore";
6
+ import { motion } from "framer-motion";
7
+ import { User, ShieldCheck, Briefcase } from "lucide-react";
8
+
9
+ interface Employee {
10
+ id: string;
11
+ name: string;
12
+ position: string;
13
+ department: string;
14
+ }
15
+
16
+ export default function OrgChartPage() {
17
+ const [employees, setEmployees] = useState<Employee[]>([]);
18
+
19
+ useEffect(() => {
20
+ const unsub = onSnapshot(collection(db, "employees"), (snap) => {
21
+ setEmployees(snap.docs.map(doc => ({ id: doc.id, ...doc.data() } as Employee)));
22
+ });
23
+ return () => unsub();
24
+ }, []);
25
+
26
+ return (
27
+ <div className="p-10 min-h-screen">
28
+ <header className="mb-20 text-center">
29
+ <h1 className="text-5xl font-black tracking-widest uppercase mb-4">Structure / Hierarchy</h1>
30
+ <p className="text-gray-500 font-bold">Arquitectura Organizacional en Tiempo Real</p>
31
+ </header>
32
+
33
+ {/* CEO Level */}
34
+ <div className="flex flex-col items-center">
35
+ <OrgNode label="Dirección General" name="CEO Admin" position="Consejo de Administración" type="ceo" />
36
+
37
+ <div className="w-px h-16 bg-gradient-to-b from-blue-500 to-transparent my-2"></div>
38
+
39
+ {/* Departments Level */}
40
+ <div className="grid grid-cols-1 md:grid-cols-3 gap-20 relative">
41
+ {/* Connecting Lines */}
42
+ <div className="hidden md:block absolute top-[2.5rem] left-[15%] right-[15%] h-px bg-white/10"></div>
43
+
44
+ <OrgSection title="Operaciones" icon={<Briefcase size={20} />} employees={employees} />
45
+ <OrgSection title="Tecnología" icon={<ShieldCheck size={20} />} employees={employees} />
46
+ <OrgSection title="Comercial" icon={<User size={20} />} employees={employees} />
47
+ </div>
48
+ </div>
49
+ </div>
50
+ );
51
+ }
52
+
53
+ function OrgSection({ title, icon, employees }: { title: string, icon: React.ReactNode, employees: Employee[] }) {
54
+ return (
55
+ <div className="flex flex-col items-center">
56
+ <div className="bg-white/10 border border-white/20 px-8 py-4 rounded-full flex items-center gap-3 shadow-xl mb-12">
57
+ <div className="text-blue-400">{icon}</div>
58
+ <span className="font-black uppercase text-xs tracking-widest">{title}</span>
59
+ </div>
60
+
61
+ <div className="space-y-6 flex flex-col items-center">
62
+ {employees.length === 0 ? (
63
+ <div className="text-gray-600 text-[10px] uppercase font-bold">Sin asignar</div>
64
+ ) : (
65
+ employees.slice(0, 3).map((emp, i) => (
66
+ <motion.div
67
+ key={emp.id}
68
+ initial={{ y: 20, opacity: 0 }}
69
+ animate={{ y: 0, opacity: 1 }}
70
+ transition={{ delay: i * 0.1 }}
71
+ >
72
+ <OrgNode name={emp.name} position={emp.position} />
73
+ </motion.div>
74
+ ))
75
+ )}
76
+ </div>
77
+ </div>
78
+ );
79
+ }
80
+
81
+ function OrgNode({ label, name, position, type }: { label?: string, name: string, position: string, type?: string }) {
82
+ return (
83
+ <div className={`
84
+ relative group p-6 rounded-[2rem] border min-w-[240px] text-center backdrop-blur-3xl shadow-2xl transition-all
85
+ ${type === 'ceo' ? 'bg-blue-600/20 border-blue-500/40' : 'bg-white/5 border-white/10 hover:border-white/30 hover:bg-white/10'}
86
+ `}>
87
+ {label && <span className="absolute -top-3 left-1/2 -translate-x-1/2 px-4 py-1 bg-blue-600 text-[8px] font-black uppercase rounded-full shadow-lg">{label}</span>}
88
+ <div className={`w-12 h-12 mx-auto mb-4 rounded-2xl flex items-center justify-center ${type === 'ceo' ? 'bg-blue-500 shadow-blue-500/50 shadow-xl' : 'bg-white/10'}`}>
89
+ <User size={24} />
90
+ </div>
91
+ <h4 className="font-bold text-lg mb-1">{name}</h4>
92
+ <p className="text-[10px] font-black text-gray-500 uppercase tracking-widest">{position}</p>
93
+ </div>
94
+ );
95
+ }
app/page.tsx CHANGED
@@ -5,98 +5,104 @@ import { db, auth } from "@/lib/firebase";
5
  import { collection, onSnapshot, query, orderBy, limit } from "firebase/firestore";
6
  import Link from "next/link";
7
 
8
- export default function Dashboard() {
9
- const [stats, setStats] = useState({
10
- products: 0,
11
- clients: 0,
12
- salesCount: 0,
13
- revenue: 0,
14
- });
 
 
 
 
 
15
 
16
- useEffect(() => {
17
- // Real-time stats from Firestore
18
- const unsubProducts = onSnapshot(collection(db, "products"), (snap) => {
19
- setStats((prev) => ({ ...prev, products: snap.size }));
20
- });
 
 
21
 
22
- const unsubClients = onSnapshot(collection(db, "clients"), (snap) => {
23
- setStats((prev) => ({ ...prev, clients: snap.size }));
24
- });
 
 
 
 
 
 
25
 
 
 
 
 
 
 
26
  const unsubSales = onSnapshot(collection(db, "sales"), (snap) => {
27
  let rev = 0;
28
- snap.forEach((doc) => {
29
- rev += doc.data().total || 0;
30
- });
31
- setStats((prev) => ({ ...prev, salesCount: snap.size, revenue: rev }));
32
  });
33
-
34
- return () => {
35
- unsubProducts();
36
- unsubClients();
37
- unsubSales();
38
- };
39
  }, []);
40
 
41
  return (
42
- <div className="min-h-screen bg-[#0f172a] text-white p-6 font-sans">
43
- <header className="flex justify-between items-center mb-10">
44
  <div>
45
- <h1 className="text-4xl font-extrabold bg-gradient-to-r from-blue-400 to-indigo-500 bg-clip-text text-transparent">
46
- ERP Premium Dashboard
47
  </h1>
48
- <p className="text-gray-400 mt-1">Bienvenido al centro de control de tu negocio</p>
49
  </div>
50
- <div className="flex gap-4">
51
- <button
52
- onClick={() => auth.signOut()}
53
- className="px-6 py-2 bg-white/10 hover:bg-white/20 rounded-full border border-white/10 transition-all text-sm font-medium backdrop-blur-md"
54
- >
55
- Cerrar Sesión
56
- </button>
57
  </div>
58
  </header>
59
 
60
- {/* Stats Grid */}
61
- <div className="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-4 gap-6 mb-10">
62
- <StatCard title="Productos" value={stats.products} icon="📦" color="from-blue-500 to-cyan-400" />
63
- <StatCard title="Clientes" value={stats.clients} icon="👥" color="from-purple-500 to-pink-500" />
64
- <StatCard title="Ventas Totales" value={stats.salesCount} icon="🛒" color="from-orange-500 to-yellow-400" />
65
- <StatCard title="Ingresos" value={`$${stats.revenue.toLocaleString()}`} icon="💰" color="from-green-500 to-emerald-400" />
66
  </div>
67
 
68
  <div className="grid grid-cols-1 lg:grid-cols-3 gap-8">
69
- {/* Quick Actions */}
70
- <div className="lg:col-span-1 bg-white/5 border border-white/10 rounded-3xl p-8 backdrop-blur-xl">
71
- <h2 className="text-xl font-bold mb-6">Acciones Rápidas</h2>
72
- <div className="space-y-4">
73
- <QuickAction href="/inventory" label="Nueva Existencia" icon="➕" />
74
- <QuickAction href="/sales" label="Registrar Venta" icon="🏷️" />
75
- <QuickAction href="/clients" label="Añadir Cliente" icon="👤" />
76
- <QuickAction href="/hr" label="Gestionar Personal" icon="👔" />
77
- </div>
 
 
 
 
 
 
 
 
 
78
  </div>
79
 
80
- {/* Charts Mockup / Future Widget */}
81
- <div className="lg:col-span-2 bg-white/5 border border-white/10 rounded-3xl p-8 backdrop-blur-xl relative overflow-hidden group">
82
- <div className="absolute inset-0 bg-gradient-to-br from-blue-600/20 to-transparent opacity-0 group-hover:opacity-100 transition-opacity duration-700"></div>
83
- <div className="relative z-10">
84
- <h2 className="text-xl font-bold mb-6">Rendimiento Semanal</h2>
85
- <div className="h-64 flex items-end justify-between gap-2">
86
- {[60, 45, 80, 55, 95, 70, 85].map((h, i) => (
87
- <div key={i} className="flex-1 flex flex-col items-center">
88
- <div
89
- className="w-full bg-gradient-to-t from-blue-600 to-cyan-400 rounded-t-lg transition-all duration-1000 delay-150"
90
- style={{ height: `${h}%` }}
91
- ></div>
92
- <span className="text-[10px] text-gray-500 mt-2">{['L', 'M', 'X', 'J', 'V', 'S', 'D'][i]}</span>
93
- </div>
94
- ))}
95
- </div>
96
- <p className="mt-8 text-sm text-gray-400 items-center flex gap-2">
97
- <span className="w-2 h-2 rounded-full bg-green-400 animate-pulse"></span>
98
- Actualizado en tiempo real con Firestore
99
- </p>
100
  </div>
101
  </div>
102
  </div>
@@ -104,27 +110,33 @@ export default function Dashboard() {
104
  );
105
  }
106
 
107
- function StatCard({ title, value, icon, color }: { title: string, value: string | number, icon: string, color: string }) {
108
  return (
109
- <div className="bg-white/5 border border-white/10 rounded-3xl p-6 backdrop-blur-md relative overflow-hidden group hover:scale-[1.02] transition-all">
110
- <div className={`absolute -right-4 -top-4 w-24 h-24 bg-gradient-to-br ${color} opacity-20 blur-2xl rounded-full group-hover:opacity-40 transition-opacity`}></div>
111
- <div className="flex items-center gap-4 relative z-10">
112
- <div className="text-3xl">{icon}</div>
113
- <div>
114
- <p className="text-sm text-gray-400 uppercase tracking-wider font-semibold">{title}</p>
115
- <p className="text-2xl font-bold">{value}</p>
116
- </div>
117
  </div>
118
  </div>
119
  );
120
  }
121
 
122
- function QuickAction({ href, label, icon }: { href: string, label: string, icon: string }) {
123
  return (
124
- <Link href={href} className="flex items-center gap-4 p-4 rounded-2xl bg-white/5 border border-white/5 hover:bg-white/10 hover:border-white/20 transition-all group">
125
- <span className="text-xl group-hover:scale-125 transition-transform">{icon}</span>
126
- <span className="font-medium text-gray-200">{label}</span>
127
- <span className="ml-auto opacity-0 group-hover:opacity-100 transition-opacity"></span>
128
- </Link>
 
 
 
 
 
 
 
 
129
  );
130
  }
 
5
  import { collection, onSnapshot, query, orderBy, limit } from "firebase/firestore";
6
  import Link from "next/link";
7
 
8
+ import {
9
+ AreaChart,
10
+ Area,
11
+ XAxis,
12
+ YAxis,
13
+ CartesianGrid,
14
+ Tooltip,
15
+ ResponsiveContainer,
16
+ BarChart,
17
+ Bar,
18
+ Cell
19
+ } from 'recharts';
20
 
21
+ import {
22
+ Package,
23
+ Users,
24
+ ShoppingCart,
25
+ LayoutDashboard
26
+ } from 'lucide-react';
27
+ import { motion } from 'framer-motion';
28
 
29
+ const dummyData = [
30
+ { name: 'Lun', sales: 4000, products: 2400 },
31
+ { name: 'Mar', sales: 3000, products: 1398 },
32
+ { name: 'Mie', sales: 2000, products: 9800 },
33
+ { name: 'Jue', sales: 2780, products: 3908 },
34
+ { name: 'Vie', sales: 1890, products: 4800 },
35
+ { name: 'Sab', sales: 2390, products: 3800 },
36
+ { name: 'Dom', sales: 3490, products: 4300 },
37
+ ];
38
 
39
+ export default function Dashboard() {
40
+ const [stats, setStats] = useState({ products: 0, clients: 0, salesCount: 0, revenue: 0 });
41
+
42
+ useEffect(() => {
43
+ const unsubProducts = onSnapshot(collection(db, "products"), (snap) => setStats((p) => ({ ...p, products: snap.size })));
44
+ const unsubClients = onSnapshot(collection(db, "clients"), (snap) => setStats((p) => ({ ...p, clients: snap.size })));
45
  const unsubSales = onSnapshot(collection(db, "sales"), (snap) => {
46
  let rev = 0;
47
+ snap.forEach((doc) => rev += doc.data().total || 0);
48
+ setStats((p) => ({ ...p, salesCount: snap.size, revenue: rev }));
 
 
49
  });
50
+ return () => { unsubProducts(); unsubClients(); unsubSales(); };
 
 
 
 
 
51
  }, []);
52
 
53
  return (
54
+ <div className="min-h-screen bg-[#0f172a] text-white p-10">
55
+ <header className="flex justify-between items-center mb-16">
56
  <div>
57
+ <h1 className="text-6xl font-black tracking-tighter italic bg-gradient-to-br from-white to-gray-500 bg-clip-text text-transparent">
58
+ ERP / NEXUS
59
  </h1>
60
+ <p className="text-gray-500 font-bold mt-2 uppercase text-xs tracking-widest">Plataforma de Control Empresarial Inteligente</p>
61
  </div>
62
+ <div className="flex border border-white/10 rounded-2xl p-2 backdrop-blur-md bg-white/5">
63
+ <div className="px-4 py-2 bg-blue-600 rounded-xl text-xs font-black uppercase">En Vivo</div>
64
+ <div className="px-4 py-2 text-xs font-bold text-gray-500">Global</div>
 
 
 
 
65
  </div>
66
  </header>
67
 
68
+ {/* Stats Table */}
69
+ <div className="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-4 gap-8 mb-16">
70
+ <StatCard title="Inventario" value={stats.products} icon={<Package />} color="from-blue-600" />
71
+ <StatCard title="Staff Activo" value={stats.clients} icon={<Users />} color="from-purple-600" />
72
+ <StatCard title="Ventas Mes" value={stats.salesCount} icon={<ShoppingCart />} color="from-orange-600" />
73
+ <StatCard title="Ingresos" value={`$${stats.revenue.toLocaleString()}`} icon={<LayoutDashboard />} color="from-emerald-600" />
74
  </div>
75
 
76
  <div className="grid grid-cols-1 lg:grid-cols-3 gap-8">
77
+ {/* Advanced Chart */}
78
+ <div className="lg:col-span-2 bg-white/5 border border-white/10 rounded-[3rem] p-10 h-[450px]">
79
+ <h2 className="text-xl font-black italic uppercase tracking-widest mb-10 text-gray-400">Rendimiento Mensual / <span className="text-white">Revenue</span></h2>
80
+ <ResponsiveContainer width="100%" height="70%">
81
+ <AreaChart data={dummyData}>
82
+ <defs>
83
+ <linearGradient id="colorSales" x1="0" y1="0" x2="0" y2="1">
84
+ <stop offset="5%" stopColor="#3b82f6" stopOpacity={0.3}/>
85
+ <stop offset="95%" stopColor="#3b82f6" stopOpacity={0}/>
86
+ </linearGradient>
87
+ </defs>
88
+ <Tooltip
89
+ contentStyle={{ backgroundColor: '#1e293b', border: 'none', borderRadius: '16px', fontSize: '12px' }}
90
+ itemStyle={{ color: '#fff' }}
91
+ />
92
+ <Area type="monotone" dataKey="sales" stroke="#3b82f6" strokeWidth={4} fillOpacity={1} fill="url(#colorSales)" />
93
+ </AreaChart>
94
+ </ResponsiveContainer>
95
  </div>
96
 
97
+ {/* Inventory Widget */}
98
+ <div className="bg-white/5 border border-white/10 rounded-[3rem] p-10 relative overflow-hidden group">
99
+ <div className="absolute top-0 right-0 p-8 text-6xl opacity-5 group-hover:opacity-10 transition-opacity font-black italic">DATA</div>
100
+ <h2 className="text-xl font-black italic uppercase tracking-widest mb-10 text-gray-400">Distribución / <span className="text-white">Stock</span></h2>
101
+ <div className="space-y-6">
102
+ <ProgressWidget label="Electrónicos" value={78} color="bg-blue-500" />
103
+ <ProgressWidget label="Mobiliario" value={45} color="bg-purple-500" />
104
+ <ProgressWidget label="Insumos" value={92} color="bg-emerald-500" />
105
+ <ProgressWidget label="Servicios" value={23} color="bg-orange-500" />
 
 
 
 
 
 
 
 
 
 
 
106
  </div>
107
  </div>
108
  </div>
 
110
  );
111
  }
112
 
113
+ function StatCard({ title, value, icon, color }: any) {
114
  return (
115
+ <div className="bg-white/5 border border-white/10 rounded-[2.5rem] p-8 backdrop-blur-xl relative group cursor-pointer hover:bg-white/10 transition-all">
116
+ <div className={`absolute top-0 left-0 w-full h-1 bg-gradient-to-r ${color} to-transparent opacity-0 group-hover:opacity-100 transition-opacity`}></div>
117
+ <div className="flex flex-col gap-4">
118
+ <div className="w-12 h-12 bg-white/10 rounded-2xl flex items-center justify-center text-blue-400">{icon}</div>
119
+ <p className="text-[10px] font-black uppercase tracking-[0.2em] text-gray-500">{title}</p>
120
+ <p className="text-4xl font-black italic tracking-tighter">{value}</p>
 
 
121
  </div>
122
  </div>
123
  );
124
  }
125
 
126
+ function ProgressWidget({ label, value, color }: any) {
127
  return (
128
+ <div className="space-y-2">
129
+ <div className="flex justify-between text-[10px] font-black uppercase tracking-widest">
130
+ <span>{label}</span>
131
+ <span className="text-gray-500">{value}%</span>
132
+ </div>
133
+ <div className="w-full h-1.5 bg-white/5 rounded-full overflow-hidden">
134
+ <motion.div
135
+ initial={{ width: 0 }}
136
+ animate={{ width: `${value}%` }}
137
+ className={`h-full ${color}`}
138
+ />
139
+ </div>
140
+ </div>
141
  );
142
  }
app/tasks/page.tsx ADDED
@@ -0,0 +1,126 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ "use client";
2
+
3
+ import React, { useState, useEffect } from "react";
4
+ import { db } from "@/lib/firebase";
5
+ import { collection, onSnapshot, addDoc, updateDoc, deleteDoc, doc, query, orderBy } from "firebase/firestore";
6
+ import { motion, AnimatePresence } from "framer-motion";
7
+ import { Plus, Trash2, CheckCircle2, Circle, Clock } from "lucide-react";
8
+
9
+ interface Task {
10
+ id: string;
11
+ title: string;
12
+ status: "todo" | "doing" | "done";
13
+ priority: "low" | "medium" | "high";
14
+ }
15
+
16
+ export default function TasksPage() {
17
+ const [tasks, setTasks] = useState<Task[]>([]);
18
+ const [newTask, setNewTask] = useState("");
19
+
20
+ useEffect(() => {
21
+ const unsub = onSnapshot(collection(db, "tasks"), (snap) => {
22
+ setTasks(snap.docs.map(doc => ({ id: doc.id, ...doc.data() } as Task)));
23
+ });
24
+ return () => unsub();
25
+ }, []);
26
+
27
+ const addTask = async (e: React.FormEvent) => {
28
+ e.preventDefault();
29
+ if (!newTask.trim()) return;
30
+ await addDoc(collection(db, "tasks"), {
31
+ title: newTask,
32
+ status: "todo",
33
+ priority: "medium",
34
+ createdAt: new Date()
35
+ });
36
+ setNewTask("");
37
+ };
38
+
39
+ const toggleStatus = async (task: Task) => {
40
+ const nextStatus = task.status === "todo" ? "doing" : task.status === "doing" ? "done" : "todo";
41
+ await updateDoc(doc(db, "tasks", task.id), { status: nextStatus });
42
+ };
43
+
44
+ return (
45
+ <div className="p-10 max-w-6xl mx-auto">
46
+ <header className="mb-12">
47
+ <h1 className="text-5xl font-black italic tracking-tighter mb-2">TASKS / SYSTEM</h1>
48
+ <p className="text-gray-500 font-medium">Gestión de flujo de trabajo corporativo</p>
49
+ </header>
50
+
51
+ <form onSubmit={addTask} className="mb-12 relative group">
52
+ <input
53
+ type="text"
54
+ placeholder="Escribe una nueva tarea y pulsa Enter..."
55
+ value={newTask}
56
+ onChange={(e) => setNewTask(e.target.value)}
57
+ className="w-full bg-white/5 border border-white/10 rounded-3xl px-8 py-6 outline-none focus:border-blue-500/40 transition-all text-xl font-medium placeholder:text-gray-700 backdrop-blur-md"
58
+ />
59
+ <button type="submit" className="absolute right-4 top-1/2 -translate-y-1/2 p-3 bg-blue-600 rounded-2xl hover:bg-blue-500 transition-all">
60
+ <Plus size={24} />
61
+ </button>
62
+ </form>
63
+
64
+ <div className="grid grid-cols-1 md:grid-cols-3 gap-8">
65
+ <TaskColumn title="Pendientes" status="todo" tasks={tasks.filter(t => t.status === "todo")} onToggle={toggleStatus} />
66
+ <TaskColumn title="En Proceso" status="doing" tasks={tasks.filter(t => t.status === "doing")} onToggle={toggleStatus} />
67
+ <TaskColumn title="Completadas" status="done" tasks={tasks.filter(t => t.status === "done")} onToggle={toggleStatus} />
68
+ </div>
69
+ </div>
70
+ );
71
+ }
72
+
73
+ function TaskColumn({ title, status, tasks, onToggle }: { title: string, status: string, tasks: Task[], onToggle: (t: Task) => void }) {
74
+ return (
75
+ <div className="space-y-6">
76
+ <div className="flex items-center justify-between px-4">
77
+ <h2 className="text-xs font-black uppercase tracking-[0.2em] text-gray-500">{title}</h2>
78
+ <span className="text-xs font-mono bg-white/10 px-2 py-1 rounded-md">{tasks.length}</span>
79
+ </div>
80
+
81
+ <div className="space-y-4">
82
+ <AnimatePresence mode="popLayout">
83
+ {tasks.map((task) => (
84
+ <motion.div
85
+ key={task.id}
86
+ layout
87
+ initial={{ scale: 0.8, opacity: 0 }}
88
+ animate={{ scale: 1, opacity: 1 }}
89
+ exit={{ scale: 0.8, opacity: 0 }}
90
+ className="bg-white/5 border border-white/5 rounded-2xl p-5 hover:bg-white/10 hover:border-white/20 transition-all cursor-pointer group"
91
+ onClick={() => onToggle(task)}
92
+ >
93
+ <div className="flex items-start gap-4">
94
+ <div className="mt-1">
95
+ {status === "done" ? <CheckCircle2 className="text-green-400" size={18} /> :
96
+ status === "doing" ? <Clock className="text-orange-400" size={18} /> :
97
+ <Circle className="text-gray-600" size={18} />}
98
+ </div>
99
+ <div className="flex-1">
100
+ <p className={`font-semibold text-sm ${status === "done" ? 'line-through text-gray-600' : 'text-gray-200'}`}>
101
+ {task.title}
102
+ </p>
103
+ <div className="flex gap-2 mt-3">
104
+ <span className={`text-[8px] font-black uppercase px-2 py-0.5 rounded-full border ${
105
+ task.priority === 'high' ? 'border-red-500/40 text-red-400 bg-red-500/10' :
106
+ task.priority === 'medium' ? 'border-orange-500/40 text-orange-400 bg-orange-500/10' :
107
+ 'border-gray-500/40 text-gray-400 bg-gray-500/10'
108
+ }`}>
109
+ {task.priority || 'medium'}
110
+ </span>
111
+ </div>
112
+ </div>
113
+ <button
114
+ onClick={(e) => { e.stopPropagation(); deleteDoc(doc(db, "tasks", task.id)); }}
115
+ className="opacity-0 group-hover:opacity-100 p-2 hover:bg-red-500/20 text-red-400 rounded-lg transition-all"
116
+ >
117
+ <Trash2 size={14} />
118
+ </button>
119
+ </div>
120
+ </motion.div>
121
+ ))}
122
+ </AnimatePresence>
123
+ </div>
124
+ </div>
125
+ );
126
+ }
components/Sidebar.tsx ADDED
@@ -0,0 +1,85 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ "use client";
2
+
3
+ import React from "react";
4
+ import Link from "next/link";
5
+ import { usePathname } from "next/navigation";
6
+ import {
7
+ LayoutDashboard,
8
+ Package,
9
+ Users,
10
+ UserSquare2,
11
+ ShoppingCart,
12
+ CheckSquare,
13
+ Network,
14
+ MessageSquare,
15
+ Map as MapIcon,
16
+ LogOut
17
+ } from "lucide-react";
18
+ import { motion } from "framer-motion";
19
+ import { auth } from "@/lib/firebase";
20
+
21
+ const menuItems = [
22
+ { icon: LayoutDashboard, label: "Dashboard", href: "/" },
23
+ { icon: Package, label: "Inventario", href: "/inventory" },
24
+ { icon: ShoppingCart, label: "Ventas", href: "/sales" },
25
+ { icon: Users, label: "Clientes", href: "/clients" },
26
+ { icon: UserSquare2, label: "Personal / RRHH", href: "/hr" },
27
+ { icon: CheckSquare, label: "Tareas", href: "/tasks" },
28
+ { icon: Network, label: "Organigrama", href: "/org-chart" },
29
+ { icon: MessageSquare, label: "Intranet", href: "/intranet" },
30
+ { icon: MapIcon, label: "Mapa Mental", href: "/mind-map" },
31
+ ];
32
+
33
+ export default function Sidebar() {
34
+ const pathname = usePathname();
35
+
36
+ if (pathname === "/login") return null;
37
+
38
+ return (
39
+ <motion.aside
40
+ initial={{ x: -100, opacity: 0 }}
41
+ animate={{ x: 0, opacity: 1 }}
42
+ className="fixed left-6 top-6 bottom-6 w-64 bg-white/5 border border-white/10 rounded-[40px] backdrop-blur-3xl z-40 p-8 flex flex-col shadow-2xl overflow-hidden"
43
+ >
44
+ <div className="absolute top-0 left-0 w-full h-1 bg-gradient-to-r from-blue-500 to-indigo-500"></div>
45
+
46
+ <div className="mb-10 flex items-center gap-3">
47
+ <div className="w-10 h-10 bg-gradient-to-br from-blue-600 to-indigo-600 rounded-2xl flex items-center justify-center shadow-lg shadow-blue-900/40 font-black text-xl">E</div>
48
+ <span className="font-black text-xl tracking-tighter uppercase italic">Premium ERP</span>
49
+ </div>
50
+
51
+ <nav className="flex-1 space-y-2 overflow-y-auto no-scrollbar">
52
+ {menuItems.map((item) => {
53
+ const isActive = pathname === item.href;
54
+ return (
55
+ <Link key={item.href} href={item.href}>
56
+ <div className={`
57
+ flex items-center gap-4 px-4 py-3 rounded-2xl transition-all group relative overflow-hidden
58
+ ${isActive ? 'bg-white/10 text-blue-400' : 'text-gray-400 hover:bg-white/5 hover:text-white'}
59
+ `}>
60
+ {isActive && (
61
+ <motion.div
62
+ layoutId="active-pill"
63
+ className="absolute inset-0 bg-blue-500/10 border border-blue-500/20 rounded-2xl"
64
+ />
65
+ )}
66
+ <item.icon size={20} className={`relative z-10 ${isActive ? 'text-blue-400' : 'group-hover:scale-110 transition-transform'}`} />
67
+ <span className="font-semibold text-sm relative z-10">{item.label}</span>
68
+ </div>
69
+ </Link>
70
+ );
71
+ })}
72
+ </nav>
73
+
74
+ <div className="mt-8 pt-6 border-t border-white/5">
75
+ <button
76
+ onClick={() => auth.signOut()}
77
+ className="flex items-center gap-4 px-4 py-3 w-full text-red-400 hover:bg-red-500/10 rounded-2xl transition-all group"
78
+ >
79
+ <LogOut size={20} className="group-hover:-translate-x-1 transition-transform" />
80
+ <span className="font-bold text-sm">Cerrar Sesión</span>
81
+ </button>
82
+ </div>
83
+ </motion.aside>
84
+ );
85
+ }
package-lock.json CHANGED
@@ -9,9 +9,12 @@
9
  "version": "0.1.0",
10
  "dependencies": {
11
  "firebase": "^12.11.0",
12
- "next": "16.2.1",
13
- "react": "19.2.4",
14
- "react-dom": "19.2.4"
 
 
 
15
  },
16
  "devDependencies": {
17
  "@tailwindcss/postcss": "^4",
@@ -19,7 +22,7 @@
19
  "@types/react": "^19",
20
  "@types/react-dom": "^19",
21
  "eslint": "^9",
22
- "eslint-config-next": "16.2.1",
23
  "tailwindcss": "^4",
24
  "typescript": "^5"
25
  }
@@ -37,246 +40,6 @@
37
  "url": "https://github.com/sponsors/sindresorhus"
38
  }
39
  },
40
- "node_modules/@babel/code-frame": {
41
- "version": "7.29.0",
42
- "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.29.0.tgz",
43
- "integrity": "sha512-9NhCeYjq9+3uxgdtp20LSiJXJvN0FeCtNGpJxuMFZ1Kv3cWUNb6DOhJwUvcVCzKGR66cw4njwM6hrJLqgOwbcw==",
44
- "dev": true,
45
- "license": "MIT",
46
- "dependencies": {
47
- "@babel/helper-validator-identifier": "^7.28.5",
48
- "js-tokens": "^4.0.0",
49
- "picocolors": "^1.1.1"
50
- },
51
- "engines": {
52
- "node": ">=6.9.0"
53
- }
54
- },
55
- "node_modules/@babel/compat-data": {
56
- "version": "7.29.0",
57
- "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.29.0.tgz",
58
- "integrity": "sha512-T1NCJqT/j9+cn8fvkt7jtwbLBfLC/1y1c7NtCeXFRgzGTsafi68MRv8yzkYSapBnFA6L3U2VSc02ciDzoAJhJg==",
59
- "dev": true,
60
- "license": "MIT",
61
- "engines": {
62
- "node": ">=6.9.0"
63
- }
64
- },
65
- "node_modules/@babel/core": {
66
- "version": "7.29.0",
67
- "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.29.0.tgz",
68
- "integrity": "sha512-CGOfOJqWjg2qW/Mb6zNsDm+u5vFQ8DxXfbM09z69p5Z6+mE1ikP2jUXw+j42Pf1XTYED2Rni5f95npYeuwMDQA==",
69
- "dev": true,
70
- "license": "MIT",
71
- "dependencies": {
72
- "@babel/code-frame": "^7.29.0",
73
- "@babel/generator": "^7.29.0",
74
- "@babel/helper-compilation-targets": "^7.28.6",
75
- "@babel/helper-module-transforms": "^7.28.6",
76
- "@babel/helpers": "^7.28.6",
77
- "@babel/parser": "^7.29.0",
78
- "@babel/template": "^7.28.6",
79
- "@babel/traverse": "^7.29.0",
80
- "@babel/types": "^7.29.0",
81
- "@jridgewell/remapping": "^2.3.5",
82
- "convert-source-map": "^2.0.0",
83
- "debug": "^4.1.0",
84
- "gensync": "^1.0.0-beta.2",
85
- "json5": "^2.2.3",
86
- "semver": "^6.3.1"
87
- },
88
- "engines": {
89
- "node": ">=6.9.0"
90
- },
91
- "funding": {
92
- "type": "opencollective",
93
- "url": "https://opencollective.com/babel"
94
- }
95
- },
96
- "node_modules/@babel/generator": {
97
- "version": "7.29.1",
98
- "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.29.1.tgz",
99
- "integrity": "sha512-qsaF+9Qcm2Qv8SRIMMscAvG4O3lJ0F1GuMo5HR/Bp02LopNgnZBC/EkbevHFeGs4ls/oPz9v+Bsmzbkbe+0dUw==",
100
- "dev": true,
101
- "license": "MIT",
102
- "dependencies": {
103
- "@babel/parser": "^7.29.0",
104
- "@babel/types": "^7.29.0",
105
- "@jridgewell/gen-mapping": "^0.3.12",
106
- "@jridgewell/trace-mapping": "^0.3.28",
107
- "jsesc": "^3.0.2"
108
- },
109
- "engines": {
110
- "node": ">=6.9.0"
111
- }
112
- },
113
- "node_modules/@babel/helper-compilation-targets": {
114
- "version": "7.28.6",
115
- "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.28.6.tgz",
116
- "integrity": "sha512-JYtls3hqi15fcx5GaSNL7SCTJ2MNmjrkHXg4FSpOA/grxK8KwyZ5bubHsCq8FXCkua6xhuaaBit+3b7+VZRfcA==",
117
- "dev": true,
118
- "license": "MIT",
119
- "dependencies": {
120
- "@babel/compat-data": "^7.28.6",
121
- "@babel/helper-validator-option": "^7.27.1",
122
- "browserslist": "^4.24.0",
123
- "lru-cache": "^5.1.1",
124
- "semver": "^6.3.1"
125
- },
126
- "engines": {
127
- "node": ">=6.9.0"
128
- }
129
- },
130
- "node_modules/@babel/helper-globals": {
131
- "version": "7.28.0",
132
- "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.28.0.tgz",
133
- "integrity": "sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==",
134
- "dev": true,
135
- "license": "MIT",
136
- "engines": {
137
- "node": ">=6.9.0"
138
- }
139
- },
140
- "node_modules/@babel/helper-module-imports": {
141
- "version": "7.28.6",
142
- "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.28.6.tgz",
143
- "integrity": "sha512-l5XkZK7r7wa9LucGw9LwZyyCUscb4x37JWTPz7swwFE/0FMQAGpiWUZn8u9DzkSBWEcK25jmvubfpw2dnAMdbw==",
144
- "dev": true,
145
- "license": "MIT",
146
- "dependencies": {
147
- "@babel/traverse": "^7.28.6",
148
- "@babel/types": "^7.28.6"
149
- },
150
- "engines": {
151
- "node": ">=6.9.0"
152
- }
153
- },
154
- "node_modules/@babel/helper-module-transforms": {
155
- "version": "7.28.6",
156
- "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.28.6.tgz",
157
- "integrity": "sha512-67oXFAYr2cDLDVGLXTEABjdBJZ6drElUSI7WKp70NrpyISso3plG9SAGEF6y7zbha/wOzUByWWTJvEDVNIUGcA==",
158
- "dev": true,
159
- "license": "MIT",
160
- "dependencies": {
161
- "@babel/helper-module-imports": "^7.28.6",
162
- "@babel/helper-validator-identifier": "^7.28.5",
163
- "@babel/traverse": "^7.28.6"
164
- },
165
- "engines": {
166
- "node": ">=6.9.0"
167
- },
168
- "peerDependencies": {
169
- "@babel/core": "^7.0.0"
170
- }
171
- },
172
- "node_modules/@babel/helper-string-parser": {
173
- "version": "7.27.1",
174
- "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz",
175
- "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==",
176
- "dev": true,
177
- "license": "MIT",
178
- "engines": {
179
- "node": ">=6.9.0"
180
- }
181
- },
182
- "node_modules/@babel/helper-validator-identifier": {
183
- "version": "7.28.5",
184
- "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz",
185
- "integrity": "sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==",
186
- "dev": true,
187
- "license": "MIT",
188
- "engines": {
189
- "node": ">=6.9.0"
190
- }
191
- },
192
- "node_modules/@babel/helper-validator-option": {
193
- "version": "7.27.1",
194
- "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.27.1.tgz",
195
- "integrity": "sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==",
196
- "dev": true,
197
- "license": "MIT",
198
- "engines": {
199
- "node": ">=6.9.0"
200
- }
201
- },
202
- "node_modules/@babel/helpers": {
203
- "version": "7.29.2",
204
- "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.29.2.tgz",
205
- "integrity": "sha512-HoGuUs4sCZNezVEKdVcwqmZN8GoHirLUcLaYVNBK2J0DadGtdcqgr3BCbvH8+XUo4NGjNl3VOtSjEKNzqfFgKw==",
206
- "dev": true,
207
- "license": "MIT",
208
- "dependencies": {
209
- "@babel/template": "^7.28.6",
210
- "@babel/types": "^7.29.0"
211
- },
212
- "engines": {
213
- "node": ">=6.9.0"
214
- }
215
- },
216
- "node_modules/@babel/parser": {
217
- "version": "7.29.2",
218
- "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.29.2.tgz",
219
- "integrity": "sha512-4GgRzy/+fsBa72/RZVJmGKPmZu9Byn8o4MoLpmNe1m8ZfYnz5emHLQz3U4gLud6Zwl0RZIcgiLD7Uq7ySFuDLA==",
220
- "dev": true,
221
- "license": "MIT",
222
- "dependencies": {
223
- "@babel/types": "^7.29.0"
224
- },
225
- "bin": {
226
- "parser": "bin/babel-parser.js"
227
- },
228
- "engines": {
229
- "node": ">=6.0.0"
230
- }
231
- },
232
- "node_modules/@babel/template": {
233
- "version": "7.28.6",
234
- "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.28.6.tgz",
235
- "integrity": "sha512-YA6Ma2KsCdGb+WC6UpBVFJGXL58MDA6oyONbjyF/+5sBgxY/dwkhLogbMT2GXXyU84/IhRw/2D1Os1B/giz+BQ==",
236
- "dev": true,
237
- "license": "MIT",
238
- "dependencies": {
239
- "@babel/code-frame": "^7.28.6",
240
- "@babel/parser": "^7.28.6",
241
- "@babel/types": "^7.28.6"
242
- },
243
- "engines": {
244
- "node": ">=6.9.0"
245
- }
246
- },
247
- "node_modules/@babel/traverse": {
248
- "version": "7.29.0",
249
- "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.29.0.tgz",
250
- "integrity": "sha512-4HPiQr0X7+waHfyXPZpWPfWL/J7dcN1mx9gL6WdQVMbPnF3+ZhSMs8tCxN7oHddJE9fhNE7+lxdnlyemKfJRuA==",
251
- "dev": true,
252
- "license": "MIT",
253
- "dependencies": {
254
- "@babel/code-frame": "^7.29.0",
255
- "@babel/generator": "^7.29.0",
256
- "@babel/helper-globals": "^7.28.0",
257
- "@babel/parser": "^7.29.0",
258
- "@babel/template": "^7.28.6",
259
- "@babel/types": "^7.29.0",
260
- "debug": "^4.3.1"
261
- },
262
- "engines": {
263
- "node": ">=6.9.0"
264
- }
265
- },
266
- "node_modules/@babel/types": {
267
- "version": "7.29.0",
268
- "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.0.tgz",
269
- "integrity": "sha512-LwdZHpScM4Qz8Xw2iKSzS+cfglZzJGvofQICy7W7v4caru4EaAmyUuO6BGrbyQ2mYV11W0U8j5mBhd14dd3B0A==",
270
- "dev": true,
271
- "license": "MIT",
272
- "dependencies": {
273
- "@babel/helper-string-parser": "^7.27.1",
274
- "@babel/helper-validator-identifier": "^7.28.5"
275
- },
276
- "engines": {
277
- "node": ">=6.9.0"
278
- }
279
- },
280
  "node_modules/@emnapi/core": {
281
  "version": "1.9.1",
282
  "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.9.1.tgz",
@@ -600,14 +363,15 @@
600
  "integrity": "sha512-kRVpIl4vVGJ4baogMDINbyrIOtOxqhkZQg4jTq3l8Lw6WSk0xfpEYzezFu+Kl4ve4fbPl79dvwRtaFqAC/ucCw==",
601
  "license": "Apache-2.0"
602
  },
603
- "node_modules/@firebase/auth": {
604
- "version": "1.12.2",
605
- "resolved": "https://registry.npmjs.org/@firebase/auth/-/auth-1.12.2.tgz",
606
- "integrity": "sha512-CZJL8V10Vzibs+pDTXdQF+hot1IigIoqF4a4lA/qr5Deo1srcefiyIfgg28B67Lk7IxZhwfJMuI+1bu2xBmV0A==",
607
  "license": "Apache-2.0",
608
  "dependencies": {
 
 
609
  "@firebase/component": "0.7.2",
610
- "@firebase/logger": "0.5.0",
611
  "@firebase/util": "1.15.0",
612
  "tslib": "^2.1.0"
613
  },
@@ -615,24 +379,17 @@
615
  "node": ">=20.0.0"
616
  },
617
  "peerDependencies": {
618
- "@firebase/app": "0.x",
619
- "@react-native-async-storage/async-storage": "^2.2.0"
620
- },
621
- "peerDependenciesMeta": {
622
- "@react-native-async-storage/async-storage": {
623
- "optional": true
624
- }
625
  }
626
  },
627
- "node_modules/@firebase/auth-compat": {
628
- "version": "0.6.4",
629
- "resolved": "https://registry.npmjs.org/@firebase/auth-compat/-/auth-compat-0.6.4.tgz",
630
- "integrity": "sha512-2pj8m/hnqXvMLfC0Mk+fORVTM5DQPkS6l8JpMgtoAWGVgCmYnoWdFMaNWtKbmCxBEyvMA3FlnCJyzrUSMWTfuA==",
631
  "license": "Apache-2.0",
632
  "dependencies": {
633
- "@firebase/auth": "1.12.2",
634
- "@firebase/auth-types": "0.13.0",
635
  "@firebase/component": "0.7.2",
 
636
  "@firebase/util": "1.15.0",
637
  "tslib": "^2.1.0"
638
  },
@@ -640,7 +397,13 @@
640
  "node": ">=20.0.0"
641
  },
642
  "peerDependencies": {
643
- "@firebase/app-compat": "0.x"
 
 
 
 
 
 
644
  }
645
  },
646
  "node_modules/@firebase/auth-interop-types": {
@@ -1145,20 +908,10 @@
1145
  "url": "https://github.com/sponsors/nzakas"
1146
  }
1147
  },
1148
- "node_modules/@img/colour": {
1149
- "version": "1.1.0",
1150
- "resolved": "https://registry.npmjs.org/@img/colour/-/colour-1.1.0.tgz",
1151
- "integrity": "sha512-Td76q7j57o/tLVdgS746cYARfSyxk8iEfRxewL9h4OMzYhbW4TAcppl0mT4eyqXddh6L/jwoM75mo7ixa/pCeQ==",
1152
- "license": "MIT",
1153
- "optional": true,
1154
- "engines": {
1155
- "node": ">=18"
1156
- }
1157
- },
1158
  "node_modules/@img/sharp-darwin-arm64": {
1159
- "version": "0.34.5",
1160
- "resolved": "https://registry.npmjs.org/@img/sharp-darwin-arm64/-/sharp-darwin-arm64-0.34.5.tgz",
1161
- "integrity": "sha512-imtQ3WMJXbMY4fxb/Ndp6HBTNVtWCUI0WdobyheGf5+ad6xX8VIDO8u2xE4qc/fr08CKG/7dDseFtn6M6g/r3w==",
1162
  "cpu": [
1163
  "arm64"
1164
  ],
@@ -1174,13 +927,13 @@
1174
  "url": "https://opencollective.com/libvips"
1175
  },
1176
  "optionalDependencies": {
1177
- "@img/sharp-libvips-darwin-arm64": "1.2.4"
1178
  }
1179
  },
1180
  "node_modules/@img/sharp-darwin-x64": {
1181
- "version": "0.34.5",
1182
- "resolved": "https://registry.npmjs.org/@img/sharp-darwin-x64/-/sharp-darwin-x64-0.34.5.tgz",
1183
- "integrity": "sha512-YNEFAF/4KQ/PeW0N+r+aVVsoIY0/qxxikF2SWdp+NRkmMB7y9LBZAVqQ4yhGCm/H3H270OSykqmQMKLBhBJDEw==",
1184
  "cpu": [
1185
  "x64"
1186
  ],
@@ -1196,13 +949,13 @@
1196
  "url": "https://opencollective.com/libvips"
1197
  },
1198
  "optionalDependencies": {
1199
- "@img/sharp-libvips-darwin-x64": "1.2.4"
1200
  }
1201
  },
1202
  "node_modules/@img/sharp-libvips-darwin-arm64": {
1203
- "version": "1.2.4",
1204
- "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-arm64/-/sharp-libvips-darwin-arm64-1.2.4.tgz",
1205
- "integrity": "sha512-zqjjo7RatFfFoP0MkQ51jfuFZBnVE2pRiaydKJ1G/rHZvnsrHAOcQALIi9sA5co5xenQdTugCvtb1cuf78Vf4g==",
1206
  "cpu": [
1207
  "arm64"
1208
  ],
@@ -1216,9 +969,9 @@
1216
  }
1217
  },
1218
  "node_modules/@img/sharp-libvips-darwin-x64": {
1219
- "version": "1.2.4",
1220
- "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-x64/-/sharp-libvips-darwin-x64-1.2.4.tgz",
1221
- "integrity": "sha512-1IOd5xfVhlGwX+zXv2N93k0yMONvUlANylbJw1eTah8K/Jtpi15KC+WSiaX/nBmbm2HxRM1gZ0nSdjSsrZbGKg==",
1222
  "cpu": [
1223
  "x64"
1224
  ],
@@ -1232,9 +985,9 @@
1232
  }
1233
  },
1234
  "node_modules/@img/sharp-libvips-linux-arm": {
1235
- "version": "1.2.4",
1236
- "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm/-/sharp-libvips-linux-arm-1.2.4.tgz",
1237
- "integrity": "sha512-bFI7xcKFELdiNCVov8e44Ia4u2byA+l3XtsAj+Q8tfCwO6BQ8iDojYdvoPMqsKDkuoOo+X6HZA0s0q11ANMQ8A==",
1238
  "cpu": [
1239
  "arm"
1240
  ],
@@ -1248,9 +1001,9 @@
1248
  }
1249
  },
1250
  "node_modules/@img/sharp-libvips-linux-arm64": {
1251
- "version": "1.2.4",
1252
- "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm64/-/sharp-libvips-linux-arm64-1.2.4.tgz",
1253
- "integrity": "sha512-excjX8DfsIcJ10x1Kzr4RcWe1edC9PquDRRPx3YVCvQv+U5p7Yin2s32ftzikXojb1PIFc/9Mt28/y+iRklkrw==",
1254
  "cpu": [
1255
  "arm64"
1256
  ],
@@ -1263,42 +1016,10 @@
1263
  "url": "https://opencollective.com/libvips"
1264
  }
1265
  },
1266
- "node_modules/@img/sharp-libvips-linux-ppc64": {
1267
- "version": "1.2.4",
1268
- "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-ppc64/-/sharp-libvips-linux-ppc64-1.2.4.tgz",
1269
- "integrity": "sha512-FMuvGijLDYG6lW+b/UvyilUWu5Ayu+3r2d1S8notiGCIyYU/76eig1UfMmkZ7vwgOrzKzlQbFSuQfgm7GYUPpA==",
1270
- "cpu": [
1271
- "ppc64"
1272
- ],
1273
- "license": "LGPL-3.0-or-later",
1274
- "optional": true,
1275
- "os": [
1276
- "linux"
1277
- ],
1278
- "funding": {
1279
- "url": "https://opencollective.com/libvips"
1280
- }
1281
- },
1282
- "node_modules/@img/sharp-libvips-linux-riscv64": {
1283
- "version": "1.2.4",
1284
- "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-riscv64/-/sharp-libvips-linux-riscv64-1.2.4.tgz",
1285
- "integrity": "sha512-oVDbcR4zUC0ce82teubSm+x6ETixtKZBh/qbREIOcI3cULzDyb18Sr/Wcyx7NRQeQzOiHTNbZFF1UwPS2scyGA==",
1286
- "cpu": [
1287
- "riscv64"
1288
- ],
1289
- "license": "LGPL-3.0-or-later",
1290
- "optional": true,
1291
- "os": [
1292
- "linux"
1293
- ],
1294
- "funding": {
1295
- "url": "https://opencollective.com/libvips"
1296
- }
1297
- },
1298
  "node_modules/@img/sharp-libvips-linux-s390x": {
1299
- "version": "1.2.4",
1300
- "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-s390x/-/sharp-libvips-linux-s390x-1.2.4.tgz",
1301
- "integrity": "sha512-qmp9VrzgPgMoGZyPvrQHqk02uyjA0/QrTO26Tqk6l4ZV0MPWIW6LTkqOIov+J1yEu7MbFQaDpwdwJKhbJvuRxQ==",
1302
  "cpu": [
1303
  "s390x"
1304
  ],
@@ -1312,9 +1033,9 @@
1312
  }
1313
  },
1314
  "node_modules/@img/sharp-libvips-linux-x64": {
1315
- "version": "1.2.4",
1316
- "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-x64/-/sharp-libvips-linux-x64-1.2.4.tgz",
1317
- "integrity": "sha512-tJxiiLsmHc9Ax1bz3oaOYBURTXGIRDODBqhveVHonrHJ9/+k89qbLl0bcJns+e4t4rvaNBxaEZsFtSfAdquPrw==",
1318
  "cpu": [
1319
  "x64"
1320
  ],
@@ -1328,9 +1049,9 @@
1328
  }
1329
  },
1330
  "node_modules/@img/sharp-libvips-linuxmusl-arm64": {
1331
- "version": "1.2.4",
1332
- "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-arm64/-/sharp-libvips-linuxmusl-arm64-1.2.4.tgz",
1333
- "integrity": "sha512-FVQHuwx1IIuNow9QAbYUzJ+En8KcVm9Lk5+uGUQJHaZmMECZmOlix9HnH7n1TRkXMS0pGxIJokIVB9SuqZGGXw==",
1334
  "cpu": [
1335
  "arm64"
1336
  ],
@@ -1344,9 +1065,9 @@
1344
  }
1345
  },
1346
  "node_modules/@img/sharp-libvips-linuxmusl-x64": {
1347
- "version": "1.2.4",
1348
- "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-x64/-/sharp-libvips-linuxmusl-x64-1.2.4.tgz",
1349
- "integrity": "sha512-+LpyBk7L44ZIXwz/VYfglaX/okxezESc6UxDSoyo2Ks6Jxc4Y7sGjpgU9s4PMgqgjj1gZCylTieNamqA1MF7Dg==",
1350
  "cpu": [
1351
  "x64"
1352
  ],
@@ -1360,9 +1081,9 @@
1360
  }
1361
  },
1362
  "node_modules/@img/sharp-linux-arm": {
1363
- "version": "0.34.5",
1364
- "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm/-/sharp-linux-arm-0.34.5.tgz",
1365
- "integrity": "sha512-9dLqsvwtg1uuXBGZKsxem9595+ujv0sJ6Vi8wcTANSFpwV/GONat5eCkzQo/1O6zRIkh0m/8+5BjrRr7jDUSZw==",
1366
  "cpu": [
1367
  "arm"
1368
  ],
@@ -1378,13 +1099,13 @@
1378
  "url": "https://opencollective.com/libvips"
1379
  },
1380
  "optionalDependencies": {
1381
- "@img/sharp-libvips-linux-arm": "1.2.4"
1382
  }
1383
  },
1384
  "node_modules/@img/sharp-linux-arm64": {
1385
- "version": "0.34.5",
1386
- "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm64/-/sharp-linux-arm64-0.34.5.tgz",
1387
- "integrity": "sha512-bKQzaJRY/bkPOXyKx5EVup7qkaojECG6NLYswgktOZjaXecSAeCWiZwwiFf3/Y+O1HrauiE3FVsGxFg8c24rZg==",
1388
  "cpu": [
1389
  "arm64"
1390
  ],
@@ -1400,57 +1121,13 @@
1400
  "url": "https://opencollective.com/libvips"
1401
  },
1402
  "optionalDependencies": {
1403
- "@img/sharp-libvips-linux-arm64": "1.2.4"
1404
- }
1405
- },
1406
- "node_modules/@img/sharp-linux-ppc64": {
1407
- "version": "0.34.5",
1408
- "resolved": "https://registry.npmjs.org/@img/sharp-linux-ppc64/-/sharp-linux-ppc64-0.34.5.tgz",
1409
- "integrity": "sha512-7zznwNaqW6YtsfrGGDA6BRkISKAAE1Jo0QdpNYXNMHu2+0dTrPflTLNkpc8l7MUP5M16ZJcUvysVWWrMefZquA==",
1410
- "cpu": [
1411
- "ppc64"
1412
- ],
1413
- "license": "Apache-2.0",
1414
- "optional": true,
1415
- "os": [
1416
- "linux"
1417
- ],
1418
- "engines": {
1419
- "node": "^18.17.0 || ^20.3.0 || >=21.0.0"
1420
- },
1421
- "funding": {
1422
- "url": "https://opencollective.com/libvips"
1423
- },
1424
- "optionalDependencies": {
1425
- "@img/sharp-libvips-linux-ppc64": "1.2.4"
1426
- }
1427
- },
1428
- "node_modules/@img/sharp-linux-riscv64": {
1429
- "version": "0.34.5",
1430
- "resolved": "https://registry.npmjs.org/@img/sharp-linux-riscv64/-/sharp-linux-riscv64-0.34.5.tgz",
1431
- "integrity": "sha512-51gJuLPTKa7piYPaVs8GmByo7/U7/7TZOq+cnXJIHZKavIRHAP77e3N2HEl3dgiqdD/w0yUfiJnII77PuDDFdw==",
1432
- "cpu": [
1433
- "riscv64"
1434
- ],
1435
- "license": "Apache-2.0",
1436
- "optional": true,
1437
- "os": [
1438
- "linux"
1439
- ],
1440
- "engines": {
1441
- "node": "^18.17.0 || ^20.3.0 || >=21.0.0"
1442
- },
1443
- "funding": {
1444
- "url": "https://opencollective.com/libvips"
1445
- },
1446
- "optionalDependencies": {
1447
- "@img/sharp-libvips-linux-riscv64": "1.2.4"
1448
  }
1449
  },
1450
  "node_modules/@img/sharp-linux-s390x": {
1451
- "version": "0.34.5",
1452
- "resolved": "https://registry.npmjs.org/@img/sharp-linux-s390x/-/sharp-linux-s390x-0.34.5.tgz",
1453
- "integrity": "sha512-nQtCk0PdKfho3eC5MrbQoigJ2gd1CgddUMkabUj+rBevs8tZ2cULOx46E7oyX+04WGfABgIwmMC0VqieTiR4jg==",
1454
  "cpu": [
1455
  "s390x"
1456
  ],
@@ -1466,13 +1143,13 @@
1466
  "url": "https://opencollective.com/libvips"
1467
  },
1468
  "optionalDependencies": {
1469
- "@img/sharp-libvips-linux-s390x": "1.2.4"
1470
  }
1471
  },
1472
  "node_modules/@img/sharp-linux-x64": {
1473
- "version": "0.34.5",
1474
- "resolved": "https://registry.npmjs.org/@img/sharp-linux-x64/-/sharp-linux-x64-0.34.5.tgz",
1475
- "integrity": "sha512-MEzd8HPKxVxVenwAa+JRPwEC7QFjoPWuS5NZnBt6B3pu7EG2Ge0id1oLHZpPJdn3OQK+BQDiw9zStiHBTJQQQQ==",
1476
  "cpu": [
1477
  "x64"
1478
  ],
@@ -1488,13 +1165,13 @@
1488
  "url": "https://opencollective.com/libvips"
1489
  },
1490
  "optionalDependencies": {
1491
- "@img/sharp-libvips-linux-x64": "1.2.4"
1492
  }
1493
  },
1494
  "node_modules/@img/sharp-linuxmusl-arm64": {
1495
- "version": "0.34.5",
1496
- "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-arm64/-/sharp-linuxmusl-arm64-0.34.5.tgz",
1497
- "integrity": "sha512-fprJR6GtRsMt6Kyfq44IsChVZeGN97gTD331weR1ex1c1rypDEABN6Tm2xa1wE6lYb5DdEnk03NZPqA7Id21yg==",
1498
  "cpu": [
1499
  "arm64"
1500
  ],
@@ -1510,13 +1187,13 @@
1510
  "url": "https://opencollective.com/libvips"
1511
  },
1512
  "optionalDependencies": {
1513
- "@img/sharp-libvips-linuxmusl-arm64": "1.2.4"
1514
  }
1515
  },
1516
  "node_modules/@img/sharp-linuxmusl-x64": {
1517
- "version": "0.34.5",
1518
- "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-x64/-/sharp-linuxmusl-x64-0.34.5.tgz",
1519
- "integrity": "sha512-Jg8wNT1MUzIvhBFxViqrEhWDGzqymo3sV7z7ZsaWbZNDLXRJZoRGrjulp60YYtV4wfY8VIKcWidjojlLcWrd8Q==",
1520
  "cpu": [
1521
  "x64"
1522
  ],
@@ -1532,20 +1209,20 @@
1532
  "url": "https://opencollective.com/libvips"
1533
  },
1534
  "optionalDependencies": {
1535
- "@img/sharp-libvips-linuxmusl-x64": "1.2.4"
1536
  }
1537
  },
1538
  "node_modules/@img/sharp-wasm32": {
1539
- "version": "0.34.5",
1540
- "resolved": "https://registry.npmjs.org/@img/sharp-wasm32/-/sharp-wasm32-0.34.5.tgz",
1541
- "integrity": "sha512-OdWTEiVkY2PHwqkbBI8frFxQQFekHaSSkUIJkwzclWZe64O1X4UlUjqqqLaPbUpMOQk6FBu/HtlGXNblIs0huw==",
1542
  "cpu": [
1543
  "wasm32"
1544
  ],
1545
  "license": "Apache-2.0 AND LGPL-3.0-or-later AND MIT",
1546
  "optional": true,
1547
  "dependencies": {
1548
- "@emnapi/runtime": "^1.7.0"
1549
  },
1550
  "engines": {
1551
  "node": "^18.17.0 || ^20.3.0 || >=21.0.0"
@@ -1554,29 +1231,10 @@
1554
  "url": "https://opencollective.com/libvips"
1555
  }
1556
  },
1557
- "node_modules/@img/sharp-win32-arm64": {
1558
- "version": "0.34.5",
1559
- "resolved": "https://registry.npmjs.org/@img/sharp-win32-arm64/-/sharp-win32-arm64-0.34.5.tgz",
1560
- "integrity": "sha512-WQ3AgWCWYSb2yt+IG8mnC6Jdk9Whs7O0gxphblsLvdhSpSTtmu69ZG1Gkb6NuvxsNACwiPV6cNSZNzt0KPsw7g==",
1561
- "cpu": [
1562
- "arm64"
1563
- ],
1564
- "license": "Apache-2.0 AND LGPL-3.0-or-later",
1565
- "optional": true,
1566
- "os": [
1567
- "win32"
1568
- ],
1569
- "engines": {
1570
- "node": "^18.17.0 || ^20.3.0 || >=21.0.0"
1571
- },
1572
- "funding": {
1573
- "url": "https://opencollective.com/libvips"
1574
- }
1575
- },
1576
  "node_modules/@img/sharp-win32-ia32": {
1577
- "version": "0.34.5",
1578
- "resolved": "https://registry.npmjs.org/@img/sharp-win32-ia32/-/sharp-win32-ia32-0.34.5.tgz",
1579
- "integrity": "sha512-FV9m/7NmeCmSHDD5j4+4pNI8Cp3aW+JvLoXcTUo0IqyjSfAZJ8dIUmijx1qaJsIiU+Hosw6xM5KijAWRJCSgNg==",
1580
  "cpu": [
1581
  "ia32"
1582
  ],
@@ -1593,9 +1251,9 @@
1593
  }
1594
  },
1595
  "node_modules/@img/sharp-win32-x64": {
1596
- "version": "0.34.5",
1597
- "resolved": "https://registry.npmjs.org/@img/sharp-win32-x64/-/sharp-win32-x64-0.34.5.tgz",
1598
- "integrity": "sha512-+29YMsqY2/9eFEiW93eqWnuLcWcufowXewwSNIT6UwZdUUCrM3oFjMWH/Z6/TMmb4hlFenmfAVbpWeup2jryCw==",
1599
  "cpu": [
1600
  "x64"
1601
  ],
@@ -1675,15 +1333,15 @@
1675
  }
1676
  },
1677
  "node_modules/@next/env": {
1678
- "version": "16.2.1",
1679
- "resolved": "https://registry.npmjs.org/@next/env/-/env-16.2.1.tgz",
1680
- "integrity": "sha512-n8P/HCkIWW+gVal2Z8XqXJ6aB3J0tuM29OcHpCsobWlChH/SITBs1DFBk/HajgrwDkqqBXPbuUuzgDvUekREPg==",
1681
  "license": "MIT"
1682
  },
1683
  "node_modules/@next/eslint-plugin-next": {
1684
- "version": "16.2.1",
1685
- "resolved": "https://registry.npmjs.org/@next/eslint-plugin-next/-/eslint-plugin-next-16.2.1.tgz",
1686
- "integrity": "sha512-r0epZGo24eT4g08jJlg2OEryBphXqO8aL18oajoTKLzHJ6jVr6P6FI58DLMug04MwD3j8Fj0YK0slyzneKVyzA==",
1687
  "dev": true,
1688
  "license": "MIT",
1689
  "dependencies": {
@@ -1691,9 +1349,9 @@
1691
  }
1692
  },
1693
  "node_modules/@next/swc-darwin-arm64": {
1694
- "version": "16.2.1",
1695
- "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-16.2.1.tgz",
1696
- "integrity": "sha512-BwZ8w8YTaSEr2HIuXLMLxIdElNMPvY9fLqb20LX9A9OMGtJilhHLbCL3ggyd0TwjmMcTxi0XXt+ur1vWUoxj2Q==",
1697
  "cpu": [
1698
  "arm64"
1699
  ],
@@ -1707,9 +1365,9 @@
1707
  }
1708
  },
1709
  "node_modules/@next/swc-darwin-x64": {
1710
- "version": "16.2.1",
1711
- "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-16.2.1.tgz",
1712
- "integrity": "sha512-/vrcE6iQSJq3uL3VGVHiXeaKbn8Es10DGTGRJnRZlkNQQk3kaNtAJg8Y6xuAlrx/6INKVjkfi5rY0iEXorZ6uA==",
1713
  "cpu": [
1714
  "x64"
1715
  ],
@@ -1723,9 +1381,9 @@
1723
  }
1724
  },
1725
  "node_modules/@next/swc-linux-arm64-gnu": {
1726
- "version": "16.2.1",
1727
- "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-16.2.1.tgz",
1728
- "integrity": "sha512-uLn+0BK+C31LTVbQ/QU+UaVrV0rRSJQ8RfniQAHPghDdgE+SlroYqcmFnO5iNjNfVWCyKZHYrs3Nl0mUzWxbBw==",
1729
  "cpu": [
1730
  "arm64"
1731
  ],
@@ -1739,9 +1397,9 @@
1739
  }
1740
  },
1741
  "node_modules/@next/swc-linux-arm64-musl": {
1742
- "version": "16.2.1",
1743
- "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-16.2.1.tgz",
1744
- "integrity": "sha512-ssKq6iMRnHdnycGp9hCuGnXJZ0YPr4/wNwrfE5DbmvEcgl9+yv97/Kq3TPVDfYome1SW5geciLB9aiEqKXQjlQ==",
1745
  "cpu": [
1746
  "arm64"
1747
  ],
@@ -1755,9 +1413,9 @@
1755
  }
1756
  },
1757
  "node_modules/@next/swc-linux-x64-gnu": {
1758
- "version": "16.2.1",
1759
- "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-16.2.1.tgz",
1760
- "integrity": "sha512-HQm7SrHRELJ30T1TSmT706IWovFFSRGxfgUkyWJZF/RKBMdbdRWJuFrcpDdE5vy9UXjFOx6L3mRdqH04Mmx0hg==",
1761
  "cpu": [
1762
  "x64"
1763
  ],
@@ -1771,9 +1429,9 @@
1771
  }
1772
  },
1773
  "node_modules/@next/swc-linux-x64-musl": {
1774
- "version": "16.2.1",
1775
- "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-16.2.1.tgz",
1776
- "integrity": "sha512-aV2iUaC/5HGEpbBkE+4B8aHIudoOy5DYekAKOMSHoIYQ66y/wIVeaRx8MS2ZMdxe/HIXlMho4ubdZs/J8441Tg==",
1777
  "cpu": [
1778
  "x64"
1779
  ],
@@ -1787,9 +1445,9 @@
1787
  }
1788
  },
1789
  "node_modules/@next/swc-win32-arm64-msvc": {
1790
- "version": "16.2.1",
1791
- "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-16.2.1.tgz",
1792
- "integrity": "sha512-IXdNgiDHaSk0ZUJ+xp0OQTdTgnpx1RCfRTalhn3cjOP+IddTMINwA7DXZrwTmGDO8SUr5q2hdP/du4DcrB1GxA==",
1793
  "cpu": [
1794
  "arm64"
1795
  ],
@@ -1803,9 +1461,9 @@
1803
  }
1804
  },
1805
  "node_modules/@next/swc-win32-x64-msvc": {
1806
- "version": "16.2.1",
1807
- "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-16.2.1.tgz",
1808
- "integrity": "sha512-qvU+3a39Hay+ieIztkGSbF7+mccbbg1Tk25hc4JDylf8IHjYmY/Zm64Qq1602yPyQqvie+vf5T/uPwNxDNIoeg==",
1809
  "cpu": [
1810
  "x64"
1811
  ],
@@ -1930,6 +1588,42 @@
1930
  "integrity": "sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==",
1931
  "license": "BSD-3-Clause"
1932
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1933
  "node_modules/@rtsao/scc": {
1934
  "version": "1.1.0",
1935
  "resolved": "https://registry.npmjs.org/@rtsao/scc/-/scc-1.1.0.tgz",
@@ -1937,6 +1631,31 @@
1937
  "dev": true,
1938
  "license": "MIT"
1939
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1940
  "node_modules/@swc/helpers": {
1941
  "version": "0.5.15",
1942
  "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.15.tgz",
@@ -2228,6 +1947,69 @@
2228
  "tslib": "^2.4.0"
2229
  }
2230
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2231
  "node_modules/@types/estree": {
2232
  "version": "1.0.8",
2233
  "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz",
@@ -2262,7 +2044,7 @@
2262
  "version": "19.2.14",
2263
  "resolved": "https://registry.npmjs.org/@types/react/-/react-19.2.14.tgz",
2264
  "integrity": "sha512-ilcTH/UniCkMdtexkoCN0bI7pMcJDvmQFPvuPvmEaYA/NSfFTAgdUSLAoVjaRJm7+6PvcM+q1zYOwS4wTYMF9w==",
2265
- "dev": true,
2266
  "license": "MIT",
2267
  "dependencies": {
2268
  "csstype": "^3.2.2"
@@ -2278,6 +2060,12 @@
2278
  "@types/react": "^19.2.0"
2279
  }
2280
  },
 
 
 
 
 
 
2281
  "node_modules/@typescript-eslint/eslint-plugin": {
2282
  "version": "8.57.2",
2283
  "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.57.2.tgz",
@@ -2505,19 +2293,6 @@
2505
  "url": "https://github.com/sponsors/isaacs"
2506
  }
2507
  },
2508
- "node_modules/@typescript-eslint/typescript-estree/node_modules/semver": {
2509
- "version": "7.7.4",
2510
- "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz",
2511
- "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==",
2512
- "dev": true,
2513
- "license": "ISC",
2514
- "bin": {
2515
- "semver": "bin/semver.js"
2516
- },
2517
- "engines": {
2518
- "node": ">=10"
2519
- }
2520
- },
2521
  "node_modules/@typescript-eslint/utils": {
2522
  "version": "8.57.2",
2523
  "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.57.2.tgz",
@@ -3143,18 +2918,6 @@
3143
  "dev": true,
3144
  "license": "MIT"
3145
  },
3146
- "node_modules/baseline-browser-mapping": {
3147
- "version": "2.10.10",
3148
- "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.10.10.tgz",
3149
- "integrity": "sha512-sUoJ3IMxx4AyRqO4MLeHlnGDkyXRoUG0/AI9fjK+vS72ekpV0yWVY7O0BVjmBcRtkNcsAO2QDZ4tdKKGoI6YaQ==",
3150
- "license": "Apache-2.0",
3151
- "bin": {
3152
- "baseline-browser-mapping": "dist/cli.cjs"
3153
- },
3154
- "engines": {
3155
- "node": ">=6.0.0"
3156
- }
3157
- },
3158
  "node_modules/brace-expansion": {
3159
  "version": "1.1.12",
3160
  "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz",
@@ -3179,38 +2942,15 @@
3179
  "node": ">=8"
3180
  }
3181
  },
3182
- "node_modules/browserslist": {
3183
- "version": "4.28.1",
3184
- "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.1.tgz",
3185
- "integrity": "sha512-ZC5Bd0LgJXgwGqUknZY/vkUQ04r8NXnJZ3yYi4vDmSiZmC/pdSN0NbNRPxZpbtO4uAfDUAFffO8IZoM3Gj8IkA==",
3186
- "dev": true,
3187
- "funding": [
3188
- {
3189
- "type": "opencollective",
3190
- "url": "https://opencollective.com/browserslist"
3191
- },
3192
- {
3193
- "type": "tidelift",
3194
- "url": "https://tidelift.com/funding/github/npm/browserslist"
3195
- },
3196
- {
3197
- "type": "github",
3198
- "url": "https://github.com/sponsors/ai"
3199
- }
3200
- ],
3201
- "license": "MIT",
3202
  "dependencies": {
3203
- "baseline-browser-mapping": "^2.9.0",
3204
- "caniuse-lite": "^1.0.30001759",
3205
- "electron-to-chromium": "^1.5.263",
3206
- "node-releases": "^2.0.27",
3207
- "update-browserslist-db": "^1.2.0"
3208
- },
3209
- "bin": {
3210
- "browserslist": "cli.js"
3211
  },
3212
  "engines": {
3213
- "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7"
3214
  }
3215
  },
3216
  "node_modules/call-bind": {
@@ -3330,6 +3070,29 @@
3330
  "node": ">=12"
3331
  }
3332
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
3333
  "node_modules/color-convert": {
3334
  "version": "2.0.1",
3335
  "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
@@ -3348,6 +3111,17 @@
3348
  "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
3349
  "license": "MIT"
3350
  },
 
 
 
 
 
 
 
 
 
 
 
3351
  "node_modules/concat-map": {
3352
  "version": "0.0.1",
3353
  "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
@@ -3355,13 +3129,6 @@
3355
  "dev": true,
3356
  "license": "MIT"
3357
  },
3358
- "node_modules/convert-source-map": {
3359
- "version": "2.0.0",
3360
- "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz",
3361
- "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==",
3362
- "dev": true,
3363
- "license": "MIT"
3364
- },
3365
  "node_modules/cross-spawn": {
3366
  "version": "7.0.6",
3367
  "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz",
@@ -3381,9 +3148,130 @@
3381
  "version": "3.2.3",
3382
  "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz",
3383
  "integrity": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==",
3384
- "dev": true,
3385
  "license": "MIT"
3386
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
3387
  "node_modules/damerau-levenshtein": {
3388
  "version": "1.0.8",
3389
  "resolved": "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.8.tgz",
@@ -3463,6 +3351,12 @@
3463
  }
3464
  }
3465
  },
 
 
 
 
 
 
3466
  "node_modules/deep-is": {
3467
  "version": "0.1.4",
3468
  "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz",
@@ -3544,13 +3438,6 @@
3544
  "node": ">= 0.4"
3545
  }
3546
  },
3547
- "node_modules/electron-to-chromium": {
3548
- "version": "1.5.321",
3549
- "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.321.tgz",
3550
- "integrity": "sha512-L2C7Q279W2D/J4PLZLk7sebOILDSWos7bMsMNN06rK482umHUrh/3lM8G7IlHFOYip2oAg5nha1rCMxr/rs6ZQ==",
3551
- "dev": true,
3552
- "license": "ISC"
3553
- },
3554
  "node_modules/emoji-regex": {
3555
  "version": "9.2.2",
3556
  "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz",
@@ -3750,6 +3637,16 @@
3750
  "url": "https://github.com/sponsors/ljharb"
3751
  }
3752
  },
 
 
 
 
 
 
 
 
 
 
3753
  "node_modules/escalade": {
3754
  "version": "3.2.0",
3755
  "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz",
@@ -3833,24 +3730,25 @@
3833
  }
3834
  },
3835
  "node_modules/eslint-config-next": {
3836
- "version": "16.2.1",
3837
- "resolved": "https://registry.npmjs.org/eslint-config-next/-/eslint-config-next-16.2.1.tgz",
3838
- "integrity": "sha512-qhabwjQZ1Mk53XzXvmogf8KQ0tG0CQXF0CZ56+2/lVhmObgmaqj7x5A1DSrWdZd3kwI7GTPGUjFne+krRxYmFg==",
3839
  "dev": true,
3840
  "license": "MIT",
3841
  "dependencies": {
3842
- "@next/eslint-plugin-next": "16.2.1",
 
 
 
3843
  "eslint-import-resolver-node": "^0.3.6",
3844
  "eslint-import-resolver-typescript": "^3.5.2",
3845
- "eslint-plugin-import": "^2.32.0",
3846
  "eslint-plugin-jsx-a11y": "^6.10.0",
3847
  "eslint-plugin-react": "^7.37.0",
3848
- "eslint-plugin-react-hooks": "^7.0.0",
3849
- "globals": "16.4.0",
3850
- "typescript-eslint": "^8.46.0"
3851
  },
3852
  "peerDependencies": {
3853
- "eslint": ">=9.0.0",
3854
  "typescript": ">=3.3.1"
3855
  },
3856
  "peerDependenciesMeta": {
@@ -3859,19 +3757,6 @@
3859
  }
3860
  }
3861
  },
3862
- "node_modules/eslint-config-next/node_modules/globals": {
3863
- "version": "16.4.0",
3864
- "resolved": "https://registry.npmjs.org/globals/-/globals-16.4.0.tgz",
3865
- "integrity": "sha512-ob/2LcVVaVGCYN+r14cnwnoDPUufjiYgSqRhiFD0Q1iI4Odora5RE8Iv1D24hAz5oMophRGkGz+yuvQmmUMnMw==",
3866
- "dev": true,
3867
- "license": "MIT",
3868
- "engines": {
3869
- "node": ">=18"
3870
- },
3871
- "funding": {
3872
- "url": "https://github.com/sponsors/sindresorhus"
3873
- }
3874
- },
3875
  "node_modules/eslint-import-resolver-node": {
3876
  "version": "0.3.9",
3877
  "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.9.tgz",
@@ -4001,6 +3886,16 @@
4001
  "ms": "^2.1.1"
4002
  }
4003
  },
 
 
 
 
 
 
 
 
 
 
4004
  "node_modules/eslint-plugin-jsx-a11y": {
4005
  "version": "6.10.2",
4006
  "resolved": "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.10.2.tgz",
@@ -4065,20 +3960,13 @@
4065
  }
4066
  },
4067
  "node_modules/eslint-plugin-react-hooks": {
4068
- "version": "7.0.1",
4069
- "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-7.0.1.tgz",
4070
- "integrity": "sha512-O0d0m04evaNzEPoSW+59Mezf8Qt0InfgGIBJnpC0h3NH/WjUAR7BIKUfysC6todmtiZ/A0oUVS8Gce0WhBrHsA==",
4071
  "dev": true,
4072
  "license": "MIT",
4073
- "dependencies": {
4074
- "@babel/core": "^7.24.4",
4075
- "@babel/parser": "^7.24.4",
4076
- "hermes-parser": "^0.25.1",
4077
- "zod": "^3.25.0 || ^4.0.0",
4078
- "zod-validation-error": "^3.5.0 || ^4.0.0"
4079
- },
4080
  "engines": {
4081
- "node": ">=18"
4082
  },
4083
  "peerDependencies": {
4084
  "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 || ^9.0.0"
@@ -4108,6 +3996,16 @@
4108
  "url": "https://github.com/sponsors/ljharb"
4109
  }
4110
  },
 
 
 
 
 
 
 
 
 
 
4111
  "node_modules/eslint-scope": {
4112
  "version": "8.4.0",
4113
  "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.4.0.tgz",
@@ -4202,6 +4100,12 @@
4202
  "node": ">=0.10.0"
4203
  }
4204
  },
 
 
 
 
 
 
4205
  "node_modules/fast-deep-equal": {
4206
  "version": "3.1.3",
4207
  "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
@@ -4354,6 +4258,30 @@
4354
  "@firebase/util": "1.15.0"
4355
  }
4356
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
4357
  "node_modules/flat-cache": {
4358
  "version": "4.0.1",
4359
  "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz",
@@ -4391,6 +4319,33 @@
4391
  "url": "https://github.com/sponsors/ljharb"
4392
  }
4393
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
4394
  "node_modules/function-bind": {
4395
  "version": "1.1.2",
4396
  "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz",
@@ -4442,16 +4397,6 @@
4442
  "node": ">= 0.4"
4443
  }
4444
  },
4445
- "node_modules/gensync": {
4446
- "version": "1.0.0-beta.2",
4447
- "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz",
4448
- "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==",
4449
- "dev": true,
4450
- "license": "MIT",
4451
- "engines": {
4452
- "node": ">=6.9.0"
4453
- }
4454
- },
4455
  "node_modules/get-caller-file": {
4456
  "version": "2.0.5",
4457
  "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz",
@@ -4688,23 +4633,6 @@
4688
  "node": ">= 0.4"
4689
  }
4690
  },
4691
- "node_modules/hermes-estree": {
4692
- "version": "0.25.1",
4693
- "resolved": "https://registry.npmjs.org/hermes-estree/-/hermes-estree-0.25.1.tgz",
4694
- "integrity": "sha512-0wUoCcLp+5Ev5pDW2OriHC2MJCbwLwuRx+gAqMTOkGKJJiBCLjtrvy4PWUGn6MIVefecRpzoOZ/UV6iGdOr+Cw==",
4695
- "dev": true,
4696
- "license": "MIT"
4697
- },
4698
- "node_modules/hermes-parser": {
4699
- "version": "0.25.1",
4700
- "resolved": "https://registry.npmjs.org/hermes-parser/-/hermes-parser-0.25.1.tgz",
4701
- "integrity": "sha512-6pEjquH3rqaI6cYAXYPcz9MS4rY6R4ngRgrgfDshRptUZIc3lw0MCIJIGDj9++mfySOuPTHB4nrSW99BCvOPIA==",
4702
- "dev": true,
4703
- "license": "MIT",
4704
- "dependencies": {
4705
- "hermes-estree": "0.25.1"
4706
- }
4707
- },
4708
  "node_modules/http-parser-js": {
4709
  "version": "0.5.10",
4710
  "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.10.tgz",
@@ -4727,6 +4655,16 @@
4727
  "node": ">= 4"
4728
  }
4729
  },
 
 
 
 
 
 
 
 
 
 
4730
  "node_modules/import-fresh": {
4731
  "version": "3.3.1",
4732
  "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz",
@@ -4769,6 +4707,15 @@
4769
  "node": ">= 0.4"
4770
  }
4771
  },
 
 
 
 
 
 
 
 
 
4772
  "node_modules/is-array-buffer": {
4773
  "version": "3.0.5",
4774
  "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.5.tgz",
@@ -4787,6 +4734,13 @@
4787
  "url": "https://github.com/sponsors/ljharb"
4788
  }
4789
  },
 
 
 
 
 
 
 
4790
  "node_modules/is-async-function": {
4791
  "version": "2.1.1",
4792
  "resolved": "https://registry.npmjs.org/is-async-function/-/is-async-function-2.1.1.tgz",
@@ -4850,19 +4804,6 @@
4850
  "semver": "^7.7.1"
4851
  }
4852
  },
4853
- "node_modules/is-bun-module/node_modules/semver": {
4854
- "version": "7.7.4",
4855
- "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz",
4856
- "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==",
4857
- "dev": true,
4858
- "license": "ISC",
4859
- "bin": {
4860
- "semver": "bin/semver.js"
4861
- },
4862
- "engines": {
4863
- "node": ">=10"
4864
- }
4865
- },
4866
  "node_modules/is-callable": {
4867
  "version": "1.2.7",
4868
  "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz",
@@ -5255,19 +5196,6 @@
5255
  "js-yaml": "bin/js-yaml.js"
5256
  }
5257
  },
5258
- "node_modules/jsesc": {
5259
- "version": "3.1.0",
5260
- "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz",
5261
- "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==",
5262
- "dev": true,
5263
- "license": "MIT",
5264
- "bin": {
5265
- "jsesc": "bin/jsesc"
5266
- },
5267
- "engines": {
5268
- "node": ">=6"
5269
- }
5270
- },
5271
  "node_modules/json-buffer": {
5272
  "version": "3.0.1",
5273
  "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz",
@@ -5290,16 +5218,16 @@
5290
  "license": "MIT"
5291
  },
5292
  "node_modules/json5": {
5293
- "version": "2.2.3",
5294
- "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz",
5295
- "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==",
5296
  "dev": true,
5297
  "license": "MIT",
 
 
 
5298
  "bin": {
5299
  "json5": "lib/cli.js"
5300
- },
5301
- "engines": {
5302
- "node": ">=6"
5303
  }
5304
  },
5305
  "node_modules/jsx-ast-utils": {
@@ -5671,14 +5599,13 @@
5671
  "loose-envify": "cli.js"
5672
  }
5673
  },
5674
- "node_modules/lru-cache": {
5675
- "version": "5.1.1",
5676
- "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz",
5677
- "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==",
5678
- "dev": true,
5679
  "license": "ISC",
5680
- "dependencies": {
5681
- "yallist": "^3.0.2"
5682
  }
5683
  },
5684
  "node_modules/magic-string": {
@@ -5748,6 +5675,21 @@
5748
  "url": "https://github.com/sponsors/ljharb"
5749
  }
5750
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
5751
  "node_modules/ms": {
5752
  "version": "2.1.3",
5753
  "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
@@ -5797,14 +5739,16 @@
5797
  "license": "MIT"
5798
  },
5799
  "node_modules/next": {
5800
- "version": "16.2.1",
5801
- "resolved": "https://registry.npmjs.org/next/-/next-16.2.1.tgz",
5802
- "integrity": "sha512-VaChzNL7o9rbfdt60HUj8tev4m6d7iC1igAy157526+cJlXOQu5LzsBXNT+xaJnTP/k+utSX5vMv7m0G+zKH+Q==",
 
5803
  "license": "MIT",
5804
  "dependencies": {
5805
- "@next/env": "16.2.1",
 
5806
  "@swc/helpers": "0.5.15",
5807
- "baseline-browser-mapping": "^2.9.19",
5808
  "caniuse-lite": "^1.0.30001579",
5809
  "postcss": "8.4.31",
5810
  "styled-jsx": "5.1.6"
@@ -5813,22 +5757,22 @@
5813
  "next": "dist/bin/next"
5814
  },
5815
  "engines": {
5816
- "node": ">=20.9.0"
5817
  },
5818
  "optionalDependencies": {
5819
- "@next/swc-darwin-arm64": "16.2.1",
5820
- "@next/swc-darwin-x64": "16.2.1",
5821
- "@next/swc-linux-arm64-gnu": "16.2.1",
5822
- "@next/swc-linux-arm64-musl": "16.2.1",
5823
- "@next/swc-linux-x64-gnu": "16.2.1",
5824
- "@next/swc-linux-x64-musl": "16.2.1",
5825
- "@next/swc-win32-arm64-msvc": "16.2.1",
5826
- "@next/swc-win32-x64-msvc": "16.2.1",
5827
- "sharp": "^0.34.5"
5828
  },
5829
  "peerDependencies": {
5830
  "@opentelemetry/api": "^1.1.0",
5831
- "@playwright/test": "^1.51.1",
5832
  "babel-plugin-react-compiler": "*",
5833
  "react": "^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0",
5834
  "react-dom": "^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0",
@@ -5896,12 +5840,15 @@
5896
  "url": "https://github.com/sponsors/ljharb"
5897
  }
5898
  },
5899
- "node_modules/node-releases": {
5900
- "version": "2.0.36",
5901
- "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.36.tgz",
5902
- "integrity": "sha512-TdC8FSgHz8Mwtw9g5L4gR/Sh9XhSP/0DEkQxfEFXOpiul5IiHgHan2VhYYb6agDSfp4KuvltmGApc8HMgUrIkA==",
5903
  "dev": true,
5904
- "license": "MIT"
 
 
 
5905
  },
5906
  "node_modules/object-assign": {
5907
  "version": "4.1.1",
@@ -6214,6 +6161,13 @@
6214
  "react-is": "^16.13.1"
6215
  }
6216
  },
 
 
 
 
 
 
 
6217
  "node_modules/protobufjs": {
6218
  "version": "7.5.4",
6219
  "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-7.5.4.tgz",
@@ -6270,33 +6224,101 @@
6270
  "license": "MIT"
6271
  },
6272
  "node_modules/react": {
6273
- "version": "19.2.4",
6274
- "resolved": "https://registry.npmjs.org/react/-/react-19.2.4.tgz",
6275
- "integrity": "sha512-9nfp2hYpCwOjAN+8TZFGhtWEwgvWHXqESH8qT89AT/lWklpLON22Lc8pEtnpsZz7VmawabSU0gCjnj8aC0euHQ==",
6276
  "license": "MIT",
6277
  "engines": {
6278
  "node": ">=0.10.0"
6279
  }
6280
  },
6281
  "node_modules/react-dom": {
6282
- "version": "19.2.4",
6283
- "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.2.4.tgz",
6284
- "integrity": "sha512-AXJdLo8kgMbimY95O2aKQqsz2iWi9jMgKJhRBAxECE4IFxfcazB2LmzloIoibJI3C12IlY20+KFaLv+71bUJeQ==",
6285
  "license": "MIT",
6286
  "dependencies": {
6287
- "scheduler": "^0.27.0"
6288
  },
6289
  "peerDependencies": {
6290
- "react": "^19.2.4"
6291
  }
6292
  },
6293
  "node_modules/react-is": {
6294
- "version": "16.13.1",
6295
- "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz",
6296
- "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==",
6297
- "dev": true,
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
6298
  "license": "MIT"
6299
  },
 
 
 
 
 
 
 
 
 
6300
  "node_modules/reflect.getprototypeof": {
6301
  "version": "1.0.10",
6302
  "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.10.tgz",
@@ -6350,6 +6372,12 @@
6350
  "node": ">=0.10.0"
6351
  }
6352
  },
 
 
 
 
 
 
6353
  "node_modules/resolve": {
6354
  "version": "1.22.11",
6355
  "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.11.tgz",
@@ -6502,19 +6530,22 @@
6502
  }
6503
  },
6504
  "node_modules/scheduler": {
6505
- "version": "0.27.0",
6506
- "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.27.0.tgz",
6507
- "integrity": "sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q==",
6508
  "license": "MIT"
6509
  },
6510
  "node_modules/semver": {
6511
- "version": "6.3.1",
6512
- "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
6513
- "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
6514
- "dev": true,
6515
  "license": "ISC",
6516
  "bin": {
6517
  "semver": "bin/semver.js"
 
 
 
6518
  }
6519
  },
6520
  "node_modules/set-function-length": {
@@ -6567,16 +6598,16 @@
6567
  }
6568
  },
6569
  "node_modules/sharp": {
6570
- "version": "0.34.5",
6571
- "resolved": "https://registry.npmjs.org/sharp/-/sharp-0.34.5.tgz",
6572
- "integrity": "sha512-Ou9I5Ft9WNcCbXrU9cMgPBcCK8LiwLqcbywW3t4oDV37n1pzpuNLsYiAV8eODnjbtQlSDwZ2cUEeQz4E54Hltg==",
6573
  "hasInstallScript": true,
6574
  "license": "Apache-2.0",
6575
  "optional": true,
6576
  "dependencies": {
6577
- "@img/colour": "^1.0.0",
6578
- "detect-libc": "^2.1.2",
6579
- "semver": "^7.7.3"
6580
  },
6581
  "engines": {
6582
  "node": "^18.17.0 || ^20.3.0 || >=21.0.0"
@@ -6585,43 +6616,25 @@
6585
  "url": "https://opencollective.com/libvips"
6586
  },
6587
  "optionalDependencies": {
6588
- "@img/sharp-darwin-arm64": "0.34.5",
6589
- "@img/sharp-darwin-x64": "0.34.5",
6590
- "@img/sharp-libvips-darwin-arm64": "1.2.4",
6591
- "@img/sharp-libvips-darwin-x64": "1.2.4",
6592
- "@img/sharp-libvips-linux-arm": "1.2.4",
6593
- "@img/sharp-libvips-linux-arm64": "1.2.4",
6594
- "@img/sharp-libvips-linux-ppc64": "1.2.4",
6595
- "@img/sharp-libvips-linux-riscv64": "1.2.4",
6596
- "@img/sharp-libvips-linux-s390x": "1.2.4",
6597
- "@img/sharp-libvips-linux-x64": "1.2.4",
6598
- "@img/sharp-libvips-linuxmusl-arm64": "1.2.4",
6599
- "@img/sharp-libvips-linuxmusl-x64": "1.2.4",
6600
- "@img/sharp-linux-arm": "0.34.5",
6601
- "@img/sharp-linux-arm64": "0.34.5",
6602
- "@img/sharp-linux-ppc64": "0.34.5",
6603
- "@img/sharp-linux-riscv64": "0.34.5",
6604
- "@img/sharp-linux-s390x": "0.34.5",
6605
- "@img/sharp-linux-x64": "0.34.5",
6606
- "@img/sharp-linuxmusl-arm64": "0.34.5",
6607
- "@img/sharp-linuxmusl-x64": "0.34.5",
6608
- "@img/sharp-wasm32": "0.34.5",
6609
- "@img/sharp-win32-arm64": "0.34.5",
6610
- "@img/sharp-win32-ia32": "0.34.5",
6611
- "@img/sharp-win32-x64": "0.34.5"
6612
- }
6613
- },
6614
- "node_modules/sharp/node_modules/semver": {
6615
- "version": "7.7.4",
6616
- "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz",
6617
- "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==",
6618
- "license": "ISC",
6619
- "optional": true,
6620
- "bin": {
6621
- "semver": "bin/semver.js"
6622
- },
6623
- "engines": {
6624
- "node": ">=10"
6625
  }
6626
  },
6627
  "node_modules/shebang-command": {
@@ -6723,6 +6736,16 @@
6723
  "url": "https://github.com/sponsors/ljharb"
6724
  }
6725
  },
 
 
 
 
 
 
 
 
 
 
6726
  "node_modules/source-map-js": {
6727
  "version": "1.2.1",
6728
  "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz",
@@ -6753,6 +6776,14 @@
6753
  "node": ">= 0.4"
6754
  }
6755
  },
 
 
 
 
 
 
 
 
6756
  "node_modules/string-width": {
6757
  "version": "4.2.3",
6758
  "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
@@ -6991,6 +7022,12 @@
6991
  "url": "https://opencollective.com/webpack"
6992
  }
6993
  },
 
 
 
 
 
 
6994
  "node_modules/tinyglobby": {
6995
  "version": "0.2.15",
6996
  "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.15.tgz",
@@ -7078,19 +7115,6 @@
7078
  "strip-bom": "^3.0.0"
7079
  }
7080
  },
7081
- "node_modules/tsconfig-paths/node_modules/json5": {
7082
- "version": "1.0.2",
7083
- "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz",
7084
- "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==",
7085
- "dev": true,
7086
- "license": "MIT",
7087
- "dependencies": {
7088
- "minimist": "^1.2.0"
7089
- },
7090
- "bin": {
7091
- "json5": "lib/cli.js"
7092
- }
7093
- },
7094
  "node_modules/tslib": {
7095
  "version": "2.8.1",
7096
  "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz",
@@ -7202,30 +7226,6 @@
7202
  "node": ">=14.17"
7203
  }
7204
  },
7205
- "node_modules/typescript-eslint": {
7206
- "version": "8.57.2",
7207
- "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.57.2.tgz",
7208
- "integrity": "sha512-VEPQ0iPgWO/sBaZOU1xo4nuNdODVOajPnTIbog2GKYr31nIlZ0fWPoCQgGfF3ETyBl1vn63F/p50Um9Z4J8O8A==",
7209
- "dev": true,
7210
- "license": "MIT",
7211
- "dependencies": {
7212
- "@typescript-eslint/eslint-plugin": "8.57.2",
7213
- "@typescript-eslint/parser": "8.57.2",
7214
- "@typescript-eslint/typescript-estree": "8.57.2",
7215
- "@typescript-eslint/utils": "8.57.2"
7216
- },
7217
- "engines": {
7218
- "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
7219
- },
7220
- "funding": {
7221
- "type": "opencollective",
7222
- "url": "https://opencollective.com/typescript-eslint"
7223
- },
7224
- "peerDependencies": {
7225
- "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0",
7226
- "typescript": ">=4.8.4 <6.0.0"
7227
- }
7228
- },
7229
  "node_modules/unbox-primitive": {
7230
  "version": "1.1.0",
7231
  "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.1.0.tgz",
@@ -7286,37 +7286,6 @@
7286
  "@unrs/resolver-binding-win32-x64-msvc": "1.11.1"
7287
  }
7288
  },
7289
- "node_modules/update-browserslist-db": {
7290
- "version": "1.2.3",
7291
- "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.2.3.tgz",
7292
- "integrity": "sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==",
7293
- "dev": true,
7294
- "funding": [
7295
- {
7296
- "type": "opencollective",
7297
- "url": "https://opencollective.com/browserslist"
7298
- },
7299
- {
7300
- "type": "tidelift",
7301
- "url": "https://tidelift.com/funding/github/npm/browserslist"
7302
- },
7303
- {
7304
- "type": "github",
7305
- "url": "https://github.com/sponsors/ai"
7306
- }
7307
- ],
7308
- "license": "MIT",
7309
- "dependencies": {
7310
- "escalade": "^3.2.0",
7311
- "picocolors": "^1.1.1"
7312
- },
7313
- "bin": {
7314
- "update-browserslist-db": "cli.js"
7315
- },
7316
- "peerDependencies": {
7317
- "browserslist": ">= 4.21.0"
7318
- }
7319
- },
7320
  "node_modules/uri-js": {
7321
  "version": "4.4.1",
7322
  "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz",
@@ -7327,6 +7296,37 @@
7327
  "punycode": "^2.1.0"
7328
  }
7329
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
7330
  "node_modules/web-vitals": {
7331
  "version": "4.2.4",
7332
  "resolved": "https://registry.npmjs.org/web-vitals/-/web-vitals-4.2.4.tgz",
@@ -7497,13 +7497,6 @@
7497
  "node": ">=10"
7498
  }
7499
  },
7500
- "node_modules/yallist": {
7501
- "version": "3.1.1",
7502
- "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz",
7503
- "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==",
7504
- "dev": true,
7505
- "license": "ISC"
7506
- },
7507
  "node_modules/yargs": {
7508
  "version": "17.7.2",
7509
  "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz",
@@ -7543,29 +7536,6 @@
7543
  "funding": {
7544
  "url": "https://github.com/sponsors/sindresorhus"
7545
  }
7546
- },
7547
- "node_modules/zod": {
7548
- "version": "4.3.6",
7549
- "resolved": "https://registry.npmjs.org/zod/-/zod-4.3.6.tgz",
7550
- "integrity": "sha512-rftlrkhHZOcjDwkGlnUtZZkvaPHCsDATp4pGpuOOMDaTdDDXF91wuVDJoWoPsKX/3YPQ5fHuF3STjcYyKr+Qhg==",
7551
- "dev": true,
7552
- "license": "MIT",
7553
- "funding": {
7554
- "url": "https://github.com/sponsors/colinhacks"
7555
- }
7556
- },
7557
- "node_modules/zod-validation-error": {
7558
- "version": "4.0.2",
7559
- "resolved": "https://registry.npmjs.org/zod-validation-error/-/zod-validation-error-4.0.2.tgz",
7560
- "integrity": "sha512-Q6/nZLe6jxuU80qb/4uJ4t5v2VEZ44lzQjPDhYJNztRQ4wyWc6VF3D3Kb/fAuPetZQnhS3hnajCf9CsWesghLQ==",
7561
- "dev": true,
7562
- "license": "MIT",
7563
- "engines": {
7564
- "node": ">=18.0.0"
7565
- },
7566
- "peerDependencies": {
7567
- "zod": "^3.25.0 || ^4.0.0"
7568
- }
7569
  }
7570
  }
7571
  }
 
9
  "version": "0.1.0",
10
  "dependencies": {
11
  "firebase": "^12.11.0",
12
+ "framer-motion": "^12.38.0",
13
+ "lucide-react": "^1.0.1",
14
+ "next": "15.1.4",
15
+ "react": "19.0.0",
16
+ "react-dom": "19.0.0",
17
+ "recharts": "^3.8.0"
18
  },
19
  "devDependencies": {
20
  "@tailwindcss/postcss": "^4",
 
22
  "@types/react": "^19",
23
  "@types/react-dom": "^19",
24
  "eslint": "^9",
25
+ "eslint-config-next": "15.1.4",
26
  "tailwindcss": "^4",
27
  "typescript": "^5"
28
  }
 
40
  "url": "https://github.com/sponsors/sindresorhus"
41
  }
42
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
43
  "node_modules/@emnapi/core": {
44
  "version": "1.9.1",
45
  "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.9.1.tgz",
 
363
  "integrity": "sha512-kRVpIl4vVGJ4baogMDINbyrIOtOxqhkZQg4jTq3l8Lw6WSk0xfpEYzezFu+Kl4ve4fbPl79dvwRtaFqAC/ucCw==",
364
  "license": "Apache-2.0"
365
  },
366
+ "node_modules/@firebase/auth-compat": {
367
+ "version": "0.6.4",
368
+ "resolved": "https://registry.npmjs.org/@firebase/auth-compat/-/auth-compat-0.6.4.tgz",
369
+ "integrity": "sha512-2pj8m/hnqXvMLfC0Mk+fORVTM5DQPkS6l8JpMgtoAWGVgCmYnoWdFMaNWtKbmCxBEyvMA3FlnCJyzrUSMWTfuA==",
370
  "license": "Apache-2.0",
371
  "dependencies": {
372
+ "@firebase/auth": "1.12.2",
373
+ "@firebase/auth-types": "0.13.0",
374
  "@firebase/component": "0.7.2",
 
375
  "@firebase/util": "1.15.0",
376
  "tslib": "^2.1.0"
377
  },
 
379
  "node": ">=20.0.0"
380
  },
381
  "peerDependencies": {
382
+ "@firebase/app-compat": "0.x"
 
 
 
 
 
 
383
  }
384
  },
385
+ "node_modules/@firebase/auth-compat/node_modules/@firebase/auth": {
386
+ "version": "1.12.2",
387
+ "resolved": "https://registry.npmjs.org/@firebase/auth/-/auth-1.12.2.tgz",
388
+ "integrity": "sha512-CZJL8V10Vzibs+pDTXdQF+hot1IigIoqF4a4lA/qr5Deo1srcefiyIfgg28B67Lk7IxZhwfJMuI+1bu2xBmV0A==",
389
  "license": "Apache-2.0",
390
  "dependencies": {
 
 
391
  "@firebase/component": "0.7.2",
392
+ "@firebase/logger": "0.5.0",
393
  "@firebase/util": "1.15.0",
394
  "tslib": "^2.1.0"
395
  },
 
397
  "node": ">=20.0.0"
398
  },
399
  "peerDependencies": {
400
+ "@firebase/app": "0.x",
401
+ "@react-native-async-storage/async-storage": "^2.2.0"
402
+ },
403
+ "peerDependenciesMeta": {
404
+ "@react-native-async-storage/async-storage": {
405
+ "optional": true
406
+ }
407
  }
408
  },
409
  "node_modules/@firebase/auth-interop-types": {
 
908
  "url": "https://github.com/sponsors/nzakas"
909
  }
910
  },
 
 
 
 
 
 
 
 
 
 
911
  "node_modules/@img/sharp-darwin-arm64": {
912
+ "version": "0.33.5",
913
+ "resolved": "https://registry.npmjs.org/@img/sharp-darwin-arm64/-/sharp-darwin-arm64-0.33.5.tgz",
914
+ "integrity": "sha512-UT4p+iz/2H4twwAoLCqfA9UH5pI6DggwKEGuaPy7nCVQ8ZsiY5PIcrRvD1DzuY3qYL07NtIQcWnBSY/heikIFQ==",
915
  "cpu": [
916
  "arm64"
917
  ],
 
927
  "url": "https://opencollective.com/libvips"
928
  },
929
  "optionalDependencies": {
930
+ "@img/sharp-libvips-darwin-arm64": "1.0.4"
931
  }
932
  },
933
  "node_modules/@img/sharp-darwin-x64": {
934
+ "version": "0.33.5",
935
+ "resolved": "https://registry.npmjs.org/@img/sharp-darwin-x64/-/sharp-darwin-x64-0.33.5.tgz",
936
+ "integrity": "sha512-fyHac4jIc1ANYGRDxtiqelIbdWkIuQaI84Mv45KvGRRxSAa7o7d1ZKAOBaYbnepLC1WqxfpimdeWfvqqSGwR2Q==",
937
  "cpu": [
938
  "x64"
939
  ],
 
949
  "url": "https://opencollective.com/libvips"
950
  },
951
  "optionalDependencies": {
952
+ "@img/sharp-libvips-darwin-x64": "1.0.4"
953
  }
954
  },
955
  "node_modules/@img/sharp-libvips-darwin-arm64": {
956
+ "version": "1.0.4",
957
+ "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-arm64/-/sharp-libvips-darwin-arm64-1.0.4.tgz",
958
+ "integrity": "sha512-XblONe153h0O2zuFfTAbQYAX2JhYmDHeWikp1LM9Hul9gVPjFY427k6dFEcOL72O01QxQsWi761svJ/ev9xEDg==",
959
  "cpu": [
960
  "arm64"
961
  ],
 
969
  }
970
  },
971
  "node_modules/@img/sharp-libvips-darwin-x64": {
972
+ "version": "1.0.4",
973
+ "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-x64/-/sharp-libvips-darwin-x64-1.0.4.tgz",
974
+ "integrity": "sha512-xnGR8YuZYfJGmWPvmlunFaWJsb9T/AO2ykoP3Fz/0X5XV2aoYBPkX6xqCQvUTKKiLddarLaxpzNe+b1hjeWHAQ==",
975
  "cpu": [
976
  "x64"
977
  ],
 
985
  }
986
  },
987
  "node_modules/@img/sharp-libvips-linux-arm": {
988
+ "version": "1.0.5",
989
+ "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm/-/sharp-libvips-linux-arm-1.0.5.tgz",
990
+ "integrity": "sha512-gvcC4ACAOPRNATg/ov8/MnbxFDJqf/pDePbBnuBDcjsI8PssmjoKMAz4LtLaVi+OnSb5FK/yIOamqDwGmXW32g==",
991
  "cpu": [
992
  "arm"
993
  ],
 
1001
  }
1002
  },
1003
  "node_modules/@img/sharp-libvips-linux-arm64": {
1004
+ "version": "1.0.4",
1005
+ "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm64/-/sharp-libvips-linux-arm64-1.0.4.tgz",
1006
+ "integrity": "sha512-9B+taZ8DlyyqzZQnoeIvDVR/2F4EbMepXMc/NdVbkzsJbzkUjhXv/70GQJ7tdLA4YJgNP25zukcxpX2/SueNrA==",
1007
  "cpu": [
1008
  "arm64"
1009
  ],
 
1016
  "url": "https://opencollective.com/libvips"
1017
  }
1018
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1019
  "node_modules/@img/sharp-libvips-linux-s390x": {
1020
+ "version": "1.0.4",
1021
+ "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-s390x/-/sharp-libvips-linux-s390x-1.0.4.tgz",
1022
+ "integrity": "sha512-u7Wz6ntiSSgGSGcjZ55im6uvTrOxSIS8/dgoVMoiGE9I6JAfU50yH5BoDlYA1tcuGS7g/QNtetJnxA6QEsCVTA==",
1023
  "cpu": [
1024
  "s390x"
1025
  ],
 
1033
  }
1034
  },
1035
  "node_modules/@img/sharp-libvips-linux-x64": {
1036
+ "version": "1.0.4",
1037
+ "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-x64/-/sharp-libvips-linux-x64-1.0.4.tgz",
1038
+ "integrity": "sha512-MmWmQ3iPFZr0Iev+BAgVMb3ZyC4KeFc3jFxnNbEPas60e1cIfevbtuyf9nDGIzOaW9PdnDciJm+wFFaTlj5xYw==",
1039
  "cpu": [
1040
  "x64"
1041
  ],
 
1049
  }
1050
  },
1051
  "node_modules/@img/sharp-libvips-linuxmusl-arm64": {
1052
+ "version": "1.0.4",
1053
+ "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-arm64/-/sharp-libvips-linuxmusl-arm64-1.0.4.tgz",
1054
+ "integrity": "sha512-9Ti+BbTYDcsbp4wfYib8Ctm1ilkugkA/uscUn6UXK1ldpC1JjiXbLfFZtRlBhjPZ5o1NCLiDbg8fhUPKStHoTA==",
1055
  "cpu": [
1056
  "arm64"
1057
  ],
 
1065
  }
1066
  },
1067
  "node_modules/@img/sharp-libvips-linuxmusl-x64": {
1068
+ "version": "1.0.4",
1069
+ "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-x64/-/sharp-libvips-linuxmusl-x64-1.0.4.tgz",
1070
+ "integrity": "sha512-viYN1KX9m+/hGkJtvYYp+CCLgnJXwiQB39damAO7WMdKWlIhmYTfHjwSbQeUK/20vY154mwezd9HflVFM1wVSw==",
1071
  "cpu": [
1072
  "x64"
1073
  ],
 
1081
  }
1082
  },
1083
  "node_modules/@img/sharp-linux-arm": {
1084
+ "version": "0.33.5",
1085
+ "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm/-/sharp-linux-arm-0.33.5.tgz",
1086
+ "integrity": "sha512-JTS1eldqZbJxjvKaAkxhZmBqPRGmxgu+qFKSInv8moZ2AmT5Yib3EQ1c6gp493HvrvV8QgdOXdyaIBrhvFhBMQ==",
1087
  "cpu": [
1088
  "arm"
1089
  ],
 
1099
  "url": "https://opencollective.com/libvips"
1100
  },
1101
  "optionalDependencies": {
1102
+ "@img/sharp-libvips-linux-arm": "1.0.5"
1103
  }
1104
  },
1105
  "node_modules/@img/sharp-linux-arm64": {
1106
+ "version": "0.33.5",
1107
+ "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm64/-/sharp-linux-arm64-0.33.5.tgz",
1108
+ "integrity": "sha512-JMVv+AMRyGOHtO1RFBiJy/MBsgz0x4AWrT6QoEVVTyh1E39TrCUpTRI7mx9VksGX4awWASxqCYLCV4wBZHAYxA==",
1109
  "cpu": [
1110
  "arm64"
1111
  ],
 
1121
  "url": "https://opencollective.com/libvips"
1122
  },
1123
  "optionalDependencies": {
1124
+ "@img/sharp-libvips-linux-arm64": "1.0.4"
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1125
  }
1126
  },
1127
  "node_modules/@img/sharp-linux-s390x": {
1128
+ "version": "0.33.5",
1129
+ "resolved": "https://registry.npmjs.org/@img/sharp-linux-s390x/-/sharp-linux-s390x-0.33.5.tgz",
1130
+ "integrity": "sha512-y/5PCd+mP4CA/sPDKl2961b+C9d+vPAveS33s6Z3zfASk2j5upL6fXVPZi7ztePZ5CuH+1kW8JtvxgbuXHRa4Q==",
1131
  "cpu": [
1132
  "s390x"
1133
  ],
 
1143
  "url": "https://opencollective.com/libvips"
1144
  },
1145
  "optionalDependencies": {
1146
+ "@img/sharp-libvips-linux-s390x": "1.0.4"
1147
  }
1148
  },
1149
  "node_modules/@img/sharp-linux-x64": {
1150
+ "version": "0.33.5",
1151
+ "resolved": "https://registry.npmjs.org/@img/sharp-linux-x64/-/sharp-linux-x64-0.33.5.tgz",
1152
+ "integrity": "sha512-opC+Ok5pRNAzuvq1AG0ar+1owsu842/Ab+4qvU879ippJBHvyY5n2mxF1izXqkPYlGuP/M556uh53jRLJmzTWA==",
1153
  "cpu": [
1154
  "x64"
1155
  ],
 
1165
  "url": "https://opencollective.com/libvips"
1166
  },
1167
  "optionalDependencies": {
1168
+ "@img/sharp-libvips-linux-x64": "1.0.4"
1169
  }
1170
  },
1171
  "node_modules/@img/sharp-linuxmusl-arm64": {
1172
+ "version": "0.33.5",
1173
+ "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-arm64/-/sharp-linuxmusl-arm64-0.33.5.tgz",
1174
+ "integrity": "sha512-XrHMZwGQGvJg2V/oRSUfSAfjfPxO+4DkiRh6p2AFjLQztWUuY/o8Mq0eMQVIY7HJ1CDQUJlxGGZRw1a5bqmd1g==",
1175
  "cpu": [
1176
  "arm64"
1177
  ],
 
1187
  "url": "https://opencollective.com/libvips"
1188
  },
1189
  "optionalDependencies": {
1190
+ "@img/sharp-libvips-linuxmusl-arm64": "1.0.4"
1191
  }
1192
  },
1193
  "node_modules/@img/sharp-linuxmusl-x64": {
1194
+ "version": "0.33.5",
1195
+ "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-x64/-/sharp-linuxmusl-x64-0.33.5.tgz",
1196
+ "integrity": "sha512-WT+d/cgqKkkKySYmqoZ8y3pxx7lx9vVejxW/W4DOFMYVSkErR+w7mf2u8m/y4+xHe7yY9DAXQMWQhpnMuFfScw==",
1197
  "cpu": [
1198
  "x64"
1199
  ],
 
1209
  "url": "https://opencollective.com/libvips"
1210
  },
1211
  "optionalDependencies": {
1212
+ "@img/sharp-libvips-linuxmusl-x64": "1.0.4"
1213
  }
1214
  },
1215
  "node_modules/@img/sharp-wasm32": {
1216
+ "version": "0.33.5",
1217
+ "resolved": "https://registry.npmjs.org/@img/sharp-wasm32/-/sharp-wasm32-0.33.5.tgz",
1218
+ "integrity": "sha512-ykUW4LVGaMcU9lu9thv85CbRMAwfeadCJHRsg2GmeRa/cJxsVY9Rbd57JcMxBkKHag5U/x7TSBpScF4U8ElVzg==",
1219
  "cpu": [
1220
  "wasm32"
1221
  ],
1222
  "license": "Apache-2.0 AND LGPL-3.0-or-later AND MIT",
1223
  "optional": true,
1224
  "dependencies": {
1225
+ "@emnapi/runtime": "^1.2.0"
1226
  },
1227
  "engines": {
1228
  "node": "^18.17.0 || ^20.3.0 || >=21.0.0"
 
1231
  "url": "https://opencollective.com/libvips"
1232
  }
1233
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1234
  "node_modules/@img/sharp-win32-ia32": {
1235
+ "version": "0.33.5",
1236
+ "resolved": "https://registry.npmjs.org/@img/sharp-win32-ia32/-/sharp-win32-ia32-0.33.5.tgz",
1237
+ "integrity": "sha512-T36PblLaTwuVJ/zw/LaH0PdZkRz5rd3SmMHX8GSmR7vtNSP5Z6bQkExdSK7xGWyxLw4sUknBuugTelgw2faBbQ==",
1238
  "cpu": [
1239
  "ia32"
1240
  ],
 
1251
  }
1252
  },
1253
  "node_modules/@img/sharp-win32-x64": {
1254
+ "version": "0.33.5",
1255
+ "resolved": "https://registry.npmjs.org/@img/sharp-win32-x64/-/sharp-win32-x64-0.33.5.tgz",
1256
+ "integrity": "sha512-MpY/o8/8kj+EcnxwvrP4aTJSWw/aZ7JIGR4aBeZkZw5B7/Jn+tY9/VNwtcoGmdT7GfggGIU4kygOMSbYnOrAbg==",
1257
  "cpu": [
1258
  "x64"
1259
  ],
 
1333
  }
1334
  },
1335
  "node_modules/@next/env": {
1336
+ "version": "15.1.4",
1337
+ "resolved": "https://registry.npmjs.org/@next/env/-/env-15.1.4.tgz",
1338
+ "integrity": "sha512-2fZ5YZjedi5AGaeoaC0B20zGntEHRhi2SdWcu61i48BllODcAmmtj8n7YarSPt4DaTsJaBFdxQAVEVzgmx2Zpw==",
1339
  "license": "MIT"
1340
  },
1341
  "node_modules/@next/eslint-plugin-next": {
1342
+ "version": "15.1.4",
1343
+ "resolved": "https://registry.npmjs.org/@next/eslint-plugin-next/-/eslint-plugin-next-15.1.4.tgz",
1344
+ "integrity": "sha512-HwlEXwCK3sr6zmVGEvWBjW9tBFs1Oe6hTmTLoFQtpm4As5HCdu8jfSE0XJOp7uhfEGLniIx8yrGxEWwNnY0fmQ==",
1345
  "dev": true,
1346
  "license": "MIT",
1347
  "dependencies": {
 
1349
  }
1350
  },
1351
  "node_modules/@next/swc-darwin-arm64": {
1352
+ "version": "15.1.4",
1353
+ "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-15.1.4.tgz",
1354
+ "integrity": "sha512-wBEMBs+np+R5ozN1F8Y8d/Dycns2COhRnkxRc+rvnbXke5uZBHkUGFgWxfTXn5rx7OLijuUhyfB+gC/ap58dDw==",
1355
  "cpu": [
1356
  "arm64"
1357
  ],
 
1365
  }
1366
  },
1367
  "node_modules/@next/swc-darwin-x64": {
1368
+ "version": "15.1.4",
1369
+ "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-15.1.4.tgz",
1370
+ "integrity": "sha512-7sgf5rM7Z81V9w48F02Zz6DgEJulavC0jadab4ZsJ+K2sxMNK0/BtF8J8J3CxnsJN3DGcIdC260wEKssKTukUw==",
1371
  "cpu": [
1372
  "x64"
1373
  ],
 
1381
  }
1382
  },
1383
  "node_modules/@next/swc-linux-arm64-gnu": {
1384
+ "version": "15.1.4",
1385
+ "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-15.1.4.tgz",
1386
+ "integrity": "sha512-JaZlIMNaJenfd55kjaLWMfok+vWBlcRxqnRoZrhFQrhM1uAehP3R0+Aoe+bZOogqlZvAz53nY/k3ZyuKDtT2zQ==",
1387
  "cpu": [
1388
  "arm64"
1389
  ],
 
1397
  }
1398
  },
1399
  "node_modules/@next/swc-linux-arm64-musl": {
1400
+ "version": "15.1.4",
1401
+ "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-15.1.4.tgz",
1402
+ "integrity": "sha512-7EBBjNoyTO2ipMDgCiORpwwOf5tIueFntKjcN3NK+GAQD7OzFJe84p7a2eQUeWdpzZvhVXuAtIen8QcH71ZCOQ==",
1403
  "cpu": [
1404
  "arm64"
1405
  ],
 
1413
  }
1414
  },
1415
  "node_modules/@next/swc-linux-x64-gnu": {
1416
+ "version": "15.1.4",
1417
+ "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-15.1.4.tgz",
1418
+ "integrity": "sha512-9TGEgOycqZFuADyFqwmK/9g6S0FYZ3tphR4ebcmCwhL8Y12FW8pIBKJvSwV+UBjMkokstGNH+9F8F031JZKpHw==",
1419
  "cpu": [
1420
  "x64"
1421
  ],
 
1429
  }
1430
  },
1431
  "node_modules/@next/swc-linux-x64-musl": {
1432
+ "version": "15.1.4",
1433
+ "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-15.1.4.tgz",
1434
+ "integrity": "sha512-0578bLRVDJOh+LdIoKvgNDz77+Bd85c5JrFgnlbI1SM3WmEQvsjxTA8ATu9Z9FCiIS/AliVAW2DV/BDwpXbtiQ==",
1435
  "cpu": [
1436
  "x64"
1437
  ],
 
1445
  }
1446
  },
1447
  "node_modules/@next/swc-win32-arm64-msvc": {
1448
+ "version": "15.1.4",
1449
+ "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-15.1.4.tgz",
1450
+ "integrity": "sha512-JgFCiV4libQavwII+kncMCl30st0JVxpPOtzWcAI2jtum4HjYaclobKhj+JsRu5tFqMtA5CJIa0MvYyuu9xjjQ==",
1451
  "cpu": [
1452
  "arm64"
1453
  ],
 
1461
  }
1462
  },
1463
  "node_modules/@next/swc-win32-x64-msvc": {
1464
+ "version": "15.1.4",
1465
+ "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-15.1.4.tgz",
1466
+ "integrity": "sha512-xxsJy9wzq7FR5SqPCUqdgSXiNXrMuidgckBa8nH9HtjjxsilgcN6VgXF6tZ3uEWuVEadotQJI8/9EQ6guTC4Yw==",
1467
  "cpu": [
1468
  "x64"
1469
  ],
 
1588
  "integrity": "sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==",
1589
  "license": "BSD-3-Clause"
1590
  },
1591
+ "node_modules/@reduxjs/toolkit": {
1592
+ "version": "2.11.2",
1593
+ "resolved": "https://registry.npmjs.org/@reduxjs/toolkit/-/toolkit-2.11.2.tgz",
1594
+ "integrity": "sha512-Kd6kAHTA6/nUpp8mySPqj3en3dm0tdMIgbttnQ1xFMVpufoj+ADi8pXLBsd4xzTRHQa7t/Jv8W5UnCuW4kuWMQ==",
1595
+ "license": "MIT",
1596
+ "dependencies": {
1597
+ "@standard-schema/spec": "^1.0.0",
1598
+ "@standard-schema/utils": "^0.3.0",
1599
+ "immer": "^11.0.0",
1600
+ "redux": "^5.0.1",
1601
+ "redux-thunk": "^3.1.0",
1602
+ "reselect": "^5.1.0"
1603
+ },
1604
+ "peerDependencies": {
1605
+ "react": "^16.9.0 || ^17.0.0 || ^18 || ^19",
1606
+ "react-redux": "^7.2.1 || ^8.1.3 || ^9.0.0"
1607
+ },
1608
+ "peerDependenciesMeta": {
1609
+ "react": {
1610
+ "optional": true
1611
+ },
1612
+ "react-redux": {
1613
+ "optional": true
1614
+ }
1615
+ }
1616
+ },
1617
+ "node_modules/@reduxjs/toolkit/node_modules/immer": {
1618
+ "version": "11.1.4",
1619
+ "resolved": "https://registry.npmjs.org/immer/-/immer-11.1.4.tgz",
1620
+ "integrity": "sha512-XREFCPo6ksxVzP4E0ekD5aMdf8WMwmdNaz6vuvxgI40UaEiu6q3p8X52aU6GdyvLY3XXX/8R7JOTXStz/nBbRw==",
1621
+ "license": "MIT",
1622
+ "funding": {
1623
+ "type": "opencollective",
1624
+ "url": "https://opencollective.com/immer"
1625
+ }
1626
+ },
1627
  "node_modules/@rtsao/scc": {
1628
  "version": "1.1.0",
1629
  "resolved": "https://registry.npmjs.org/@rtsao/scc/-/scc-1.1.0.tgz",
 
1631
  "dev": true,
1632
  "license": "MIT"
1633
  },
1634
+ "node_modules/@rushstack/eslint-patch": {
1635
+ "version": "1.16.1",
1636
+ "resolved": "https://registry.npmjs.org/@rushstack/eslint-patch/-/eslint-patch-1.16.1.tgz",
1637
+ "integrity": "sha512-TvZbIpeKqGQQ7X0zSCvPH9riMSFQFSggnfBjFZ1mEoILW+UuXCKwOoPcgjMwiUtRqFZ8jWhPJc4um14vC6I4ag==",
1638
+ "dev": true,
1639
+ "license": "MIT"
1640
+ },
1641
+ "node_modules/@standard-schema/spec": {
1642
+ "version": "1.1.0",
1643
+ "resolved": "https://registry.npmjs.org/@standard-schema/spec/-/spec-1.1.0.tgz",
1644
+ "integrity": "sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w==",
1645
+ "license": "MIT"
1646
+ },
1647
+ "node_modules/@standard-schema/utils": {
1648
+ "version": "0.3.0",
1649
+ "resolved": "https://registry.npmjs.org/@standard-schema/utils/-/utils-0.3.0.tgz",
1650
+ "integrity": "sha512-e7Mew686owMaPJVNNLs55PUvgz371nKgwsc4vxE49zsODpJEnxgxRo2y/OKrqueavXgZNMDVj3DdHFlaSAeU8g==",
1651
+ "license": "MIT"
1652
+ },
1653
+ "node_modules/@swc/counter": {
1654
+ "version": "0.1.3",
1655
+ "resolved": "https://registry.npmjs.org/@swc/counter/-/counter-0.1.3.tgz",
1656
+ "integrity": "sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ==",
1657
+ "license": "Apache-2.0"
1658
+ },
1659
  "node_modules/@swc/helpers": {
1660
  "version": "0.5.15",
1661
  "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.15.tgz",
 
1947
  "tslib": "^2.4.0"
1948
  }
1949
  },
1950
+ "node_modules/@types/d3-array": {
1951
+ "version": "3.2.2",
1952
+ "resolved": "https://registry.npmjs.org/@types/d3-array/-/d3-array-3.2.2.tgz",
1953
+ "integrity": "sha512-hOLWVbm7uRza0BYXpIIW5pxfrKe0W+D5lrFiAEYR+pb6w3N2SwSMaJbXdUfSEv+dT4MfHBLtn5js0LAWaO6otw==",
1954
+ "license": "MIT"
1955
+ },
1956
+ "node_modules/@types/d3-color": {
1957
+ "version": "3.1.3",
1958
+ "resolved": "https://registry.npmjs.org/@types/d3-color/-/d3-color-3.1.3.tgz",
1959
+ "integrity": "sha512-iO90scth9WAbmgv7ogoq57O9YpKmFBbmoEoCHDB2xMBY0+/KVrqAaCDyCE16dUspeOvIxFFRI+0sEtqDqy2b4A==",
1960
+ "license": "MIT"
1961
+ },
1962
+ "node_modules/@types/d3-ease": {
1963
+ "version": "3.0.2",
1964
+ "resolved": "https://registry.npmjs.org/@types/d3-ease/-/d3-ease-3.0.2.tgz",
1965
+ "integrity": "sha512-NcV1JjO5oDzoK26oMzbILE6HW7uVXOHLQvHshBUW4UMdZGfiY6v5BeQwh9a9tCzv+CeefZQHJt5SRgK154RtiA==",
1966
+ "license": "MIT"
1967
+ },
1968
+ "node_modules/@types/d3-interpolate": {
1969
+ "version": "3.0.4",
1970
+ "resolved": "https://registry.npmjs.org/@types/d3-interpolate/-/d3-interpolate-3.0.4.tgz",
1971
+ "integrity": "sha512-mgLPETlrpVV1YRJIglr4Ez47g7Yxjl1lj7YKsiMCb27VJH9W8NVM6Bb9d8kkpG/uAQS5AmbA48q2IAolKKo1MA==",
1972
+ "license": "MIT",
1973
+ "dependencies": {
1974
+ "@types/d3-color": "*"
1975
+ }
1976
+ },
1977
+ "node_modules/@types/d3-path": {
1978
+ "version": "3.1.1",
1979
+ "resolved": "https://registry.npmjs.org/@types/d3-path/-/d3-path-3.1.1.tgz",
1980
+ "integrity": "sha512-VMZBYyQvbGmWyWVea0EHs/BwLgxc+MKi1zLDCONksozI4YJMcTt8ZEuIR4Sb1MMTE8MMW49v0IwI5+b7RmfWlg==",
1981
+ "license": "MIT"
1982
+ },
1983
+ "node_modules/@types/d3-scale": {
1984
+ "version": "4.0.9",
1985
+ "resolved": "https://registry.npmjs.org/@types/d3-scale/-/d3-scale-4.0.9.tgz",
1986
+ "integrity": "sha512-dLmtwB8zkAeO/juAMfnV+sItKjlsw2lKdZVVy6LRr0cBmegxSABiLEpGVmSJJ8O08i4+sGR6qQtb6WtuwJdvVw==",
1987
+ "license": "MIT",
1988
+ "dependencies": {
1989
+ "@types/d3-time": "*"
1990
+ }
1991
+ },
1992
+ "node_modules/@types/d3-shape": {
1993
+ "version": "3.1.8",
1994
+ "resolved": "https://registry.npmjs.org/@types/d3-shape/-/d3-shape-3.1.8.tgz",
1995
+ "integrity": "sha512-lae0iWfcDeR7qt7rA88BNiqdvPS5pFVPpo5OfjElwNaT2yyekbM0C9vK+yqBqEmHr6lDkRnYNoTBYlAgJa7a4w==",
1996
+ "license": "MIT",
1997
+ "dependencies": {
1998
+ "@types/d3-path": "*"
1999
+ }
2000
+ },
2001
+ "node_modules/@types/d3-time": {
2002
+ "version": "3.0.4",
2003
+ "resolved": "https://registry.npmjs.org/@types/d3-time/-/d3-time-3.0.4.tgz",
2004
+ "integrity": "sha512-yuzZug1nkAAaBlBBikKZTgzCeA+k1uy4ZFwWANOfKw5z5LRhV0gNA7gNkKm7HoK+HRN0wX3EkxGk0fpbWhmB7g==",
2005
+ "license": "MIT"
2006
+ },
2007
+ "node_modules/@types/d3-timer": {
2008
+ "version": "3.0.2",
2009
+ "resolved": "https://registry.npmjs.org/@types/d3-timer/-/d3-timer-3.0.2.tgz",
2010
+ "integrity": "sha512-Ps3T8E8dZDam6fUyNiMkekK3XUsaUEik+idO9/YjPtfj2qruF8tFBXS7XhtE4iIXBLxhmLjP3SXpLhVf21I9Lw==",
2011
+ "license": "MIT"
2012
+ },
2013
  "node_modules/@types/estree": {
2014
  "version": "1.0.8",
2015
  "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz",
 
2044
  "version": "19.2.14",
2045
  "resolved": "https://registry.npmjs.org/@types/react/-/react-19.2.14.tgz",
2046
  "integrity": "sha512-ilcTH/UniCkMdtexkoCN0bI7pMcJDvmQFPvuPvmEaYA/NSfFTAgdUSLAoVjaRJm7+6PvcM+q1zYOwS4wTYMF9w==",
2047
+ "devOptional": true,
2048
  "license": "MIT",
2049
  "dependencies": {
2050
  "csstype": "^3.2.2"
 
2060
  "@types/react": "^19.2.0"
2061
  }
2062
  },
2063
+ "node_modules/@types/use-sync-external-store": {
2064
+ "version": "0.0.6",
2065
+ "resolved": "https://registry.npmjs.org/@types/use-sync-external-store/-/use-sync-external-store-0.0.6.tgz",
2066
+ "integrity": "sha512-zFDAD+tlpf2r4asuHEj0XH6pY6i0g5NeAHPn+15wk3BV6JA69eERFXC1gyGThDkVa1zCyKr5jox1+2LbV/AMLg==",
2067
+ "license": "MIT"
2068
+ },
2069
  "node_modules/@typescript-eslint/eslint-plugin": {
2070
  "version": "8.57.2",
2071
  "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.57.2.tgz",
 
2293
  "url": "https://github.com/sponsors/isaacs"
2294
  }
2295
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
2296
  "node_modules/@typescript-eslint/utils": {
2297
  "version": "8.57.2",
2298
  "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.57.2.tgz",
 
2918
  "dev": true,
2919
  "license": "MIT"
2920
  },
 
 
 
 
 
 
 
 
 
 
 
 
2921
  "node_modules/brace-expansion": {
2922
  "version": "1.1.12",
2923
  "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz",
 
2942
  "node": ">=8"
2943
  }
2944
  },
2945
+ "node_modules/busboy": {
2946
+ "version": "1.6.0",
2947
+ "resolved": "https://registry.npmjs.org/busboy/-/busboy-1.6.0.tgz",
2948
+ "integrity": "sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==",
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2949
  "dependencies": {
2950
+ "streamsearch": "^1.1.0"
 
 
 
 
 
 
 
2951
  },
2952
  "engines": {
2953
+ "node": ">=10.16.0"
2954
  }
2955
  },
2956
  "node_modules/call-bind": {
 
3070
  "node": ">=12"
3071
  }
3072
  },
3073
+ "node_modules/clsx": {
3074
+ "version": "2.1.1",
3075
+ "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz",
3076
+ "integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==",
3077
+ "license": "MIT",
3078
+ "engines": {
3079
+ "node": ">=6"
3080
+ }
3081
+ },
3082
+ "node_modules/color": {
3083
+ "version": "4.2.3",
3084
+ "resolved": "https://registry.npmjs.org/color/-/color-4.2.3.tgz",
3085
+ "integrity": "sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A==",
3086
+ "license": "MIT",
3087
+ "optional": true,
3088
+ "dependencies": {
3089
+ "color-convert": "^2.0.1",
3090
+ "color-string": "^1.9.0"
3091
+ },
3092
+ "engines": {
3093
+ "node": ">=12.5.0"
3094
+ }
3095
+ },
3096
  "node_modules/color-convert": {
3097
  "version": "2.0.1",
3098
  "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
 
3111
  "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
3112
  "license": "MIT"
3113
  },
3114
+ "node_modules/color-string": {
3115
+ "version": "1.9.1",
3116
+ "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.9.1.tgz",
3117
+ "integrity": "sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==",
3118
+ "license": "MIT",
3119
+ "optional": true,
3120
+ "dependencies": {
3121
+ "color-name": "^1.0.0",
3122
+ "simple-swizzle": "^0.2.2"
3123
+ }
3124
+ },
3125
  "node_modules/concat-map": {
3126
  "version": "0.0.1",
3127
  "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
 
3129
  "dev": true,
3130
  "license": "MIT"
3131
  },
 
 
 
 
 
 
 
3132
  "node_modules/cross-spawn": {
3133
  "version": "7.0.6",
3134
  "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz",
 
3148
  "version": "3.2.3",
3149
  "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz",
3150
  "integrity": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==",
3151
+ "devOptional": true,
3152
  "license": "MIT"
3153
  },
3154
+ "node_modules/d3-array": {
3155
+ "version": "3.2.4",
3156
+ "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-3.2.4.tgz",
3157
+ "integrity": "sha512-tdQAmyA18i4J7wprpYq8ClcxZy3SC31QMeByyCFyRt7BVHdREQZ5lpzoe5mFEYZUWe+oq8HBvk9JjpibyEV4Jg==",
3158
+ "license": "ISC",
3159
+ "dependencies": {
3160
+ "internmap": "1 - 2"
3161
+ },
3162
+ "engines": {
3163
+ "node": ">=12"
3164
+ }
3165
+ },
3166
+ "node_modules/d3-color": {
3167
+ "version": "3.1.0",
3168
+ "resolved": "https://registry.npmjs.org/d3-color/-/d3-color-3.1.0.tgz",
3169
+ "integrity": "sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA==",
3170
+ "license": "ISC",
3171
+ "engines": {
3172
+ "node": ">=12"
3173
+ }
3174
+ },
3175
+ "node_modules/d3-ease": {
3176
+ "version": "3.0.1",
3177
+ "resolved": "https://registry.npmjs.org/d3-ease/-/d3-ease-3.0.1.tgz",
3178
+ "integrity": "sha512-wR/XK3D3XcLIZwpbvQwQ5fK+8Ykds1ip7A2Txe0yxncXSdq1L9skcG7blcedkOX+ZcgxGAmLX1FrRGbADwzi0w==",
3179
+ "license": "BSD-3-Clause",
3180
+ "engines": {
3181
+ "node": ">=12"
3182
+ }
3183
+ },
3184
+ "node_modules/d3-format": {
3185
+ "version": "3.1.2",
3186
+ "resolved": "https://registry.npmjs.org/d3-format/-/d3-format-3.1.2.tgz",
3187
+ "integrity": "sha512-AJDdYOdnyRDV5b6ArilzCPPwc1ejkHcoyFarqlPqT7zRYjhavcT3uSrqcMvsgh2CgoPbK3RCwyHaVyxYcP2Arg==",
3188
+ "license": "ISC",
3189
+ "engines": {
3190
+ "node": ">=12"
3191
+ }
3192
+ },
3193
+ "node_modules/d3-interpolate": {
3194
+ "version": "3.0.1",
3195
+ "resolved": "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-3.0.1.tgz",
3196
+ "integrity": "sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g==",
3197
+ "license": "ISC",
3198
+ "dependencies": {
3199
+ "d3-color": "1 - 3"
3200
+ },
3201
+ "engines": {
3202
+ "node": ">=12"
3203
+ }
3204
+ },
3205
+ "node_modules/d3-path": {
3206
+ "version": "3.1.0",
3207
+ "resolved": "https://registry.npmjs.org/d3-path/-/d3-path-3.1.0.tgz",
3208
+ "integrity": "sha512-p3KP5HCf/bvjBSSKuXid6Zqijx7wIfNW+J/maPs+iwR35at5JCbLUT0LzF1cnjbCHWhqzQTIN2Jpe8pRebIEFQ==",
3209
+ "license": "ISC",
3210
+ "engines": {
3211
+ "node": ">=12"
3212
+ }
3213
+ },
3214
+ "node_modules/d3-scale": {
3215
+ "version": "4.0.2",
3216
+ "resolved": "https://registry.npmjs.org/d3-scale/-/d3-scale-4.0.2.tgz",
3217
+ "integrity": "sha512-GZW464g1SH7ag3Y7hXjf8RoUuAFIqklOAq3MRl4OaWabTFJY9PN/E1YklhXLh+OQ3fM9yS2nOkCoS+WLZ6kvxQ==",
3218
+ "license": "ISC",
3219
+ "dependencies": {
3220
+ "d3-array": "2.10.0 - 3",
3221
+ "d3-format": "1 - 3",
3222
+ "d3-interpolate": "1.2.0 - 3",
3223
+ "d3-time": "2.1.1 - 3",
3224
+ "d3-time-format": "2 - 4"
3225
+ },
3226
+ "engines": {
3227
+ "node": ">=12"
3228
+ }
3229
+ },
3230
+ "node_modules/d3-shape": {
3231
+ "version": "3.2.0",
3232
+ "resolved": "https://registry.npmjs.org/d3-shape/-/d3-shape-3.2.0.tgz",
3233
+ "integrity": "sha512-SaLBuwGm3MOViRq2ABk3eLoxwZELpH6zhl3FbAoJ7Vm1gofKx6El1Ib5z23NUEhF9AsGl7y+dzLe5Cw2AArGTA==",
3234
+ "license": "ISC",
3235
+ "dependencies": {
3236
+ "d3-path": "^3.1.0"
3237
+ },
3238
+ "engines": {
3239
+ "node": ">=12"
3240
+ }
3241
+ },
3242
+ "node_modules/d3-time": {
3243
+ "version": "3.1.0",
3244
+ "resolved": "https://registry.npmjs.org/d3-time/-/d3-time-3.1.0.tgz",
3245
+ "integrity": "sha512-VqKjzBLejbSMT4IgbmVgDjpkYrNWUYJnbCGo874u7MMKIWsILRX+OpX/gTk8MqjpT1A/c6HY2dCA77ZN0lkQ2Q==",
3246
+ "license": "ISC",
3247
+ "dependencies": {
3248
+ "d3-array": "2 - 3"
3249
+ },
3250
+ "engines": {
3251
+ "node": ">=12"
3252
+ }
3253
+ },
3254
+ "node_modules/d3-time-format": {
3255
+ "version": "4.1.0",
3256
+ "resolved": "https://registry.npmjs.org/d3-time-format/-/d3-time-format-4.1.0.tgz",
3257
+ "integrity": "sha512-dJxPBlzC7NugB2PDLwo9Q8JiTR3M3e4/XANkreKSUxF8vvXKqm1Yfq4Q5dl8budlunRVlUUaDUgFt7eA8D6NLg==",
3258
+ "license": "ISC",
3259
+ "dependencies": {
3260
+ "d3-time": "1 - 3"
3261
+ },
3262
+ "engines": {
3263
+ "node": ">=12"
3264
+ }
3265
+ },
3266
+ "node_modules/d3-timer": {
3267
+ "version": "3.0.1",
3268
+ "resolved": "https://registry.npmjs.org/d3-timer/-/d3-timer-3.0.1.tgz",
3269
+ "integrity": "sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA==",
3270
+ "license": "ISC",
3271
+ "engines": {
3272
+ "node": ">=12"
3273
+ }
3274
+ },
3275
  "node_modules/damerau-levenshtein": {
3276
  "version": "1.0.8",
3277
  "resolved": "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.8.tgz",
 
3351
  }
3352
  }
3353
  },
3354
+ "node_modules/decimal.js-light": {
3355
+ "version": "2.5.1",
3356
+ "resolved": "https://registry.npmjs.org/decimal.js-light/-/decimal.js-light-2.5.1.tgz",
3357
+ "integrity": "sha512-qIMFpTMZmny+MMIitAB6D7iVPEorVw6YQRWkvarTkT4tBeSLLiHzcwj6q0MmYSFCiVpiqPJTJEYIrpcPzVEIvg==",
3358
+ "license": "MIT"
3359
+ },
3360
  "node_modules/deep-is": {
3361
  "version": "0.1.4",
3362
  "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz",
 
3438
  "node": ">= 0.4"
3439
  }
3440
  },
 
 
 
 
 
 
 
3441
  "node_modules/emoji-regex": {
3442
  "version": "9.2.2",
3443
  "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz",
 
3637
  "url": "https://github.com/sponsors/ljharb"
3638
  }
3639
  },
3640
+ "node_modules/es-toolkit": {
3641
+ "version": "1.45.1",
3642
+ "resolved": "https://registry.npmjs.org/es-toolkit/-/es-toolkit-1.45.1.tgz",
3643
+ "integrity": "sha512-/jhoOj/Fx+A+IIyDNOvO3TItGmlMKhtX8ISAHKE90c4b/k1tqaqEZ+uUqfpU8DMnW5cgNJv606zS55jGvza0Xw==",
3644
+ "license": "MIT",
3645
+ "workspaces": [
3646
+ "docs",
3647
+ "benchmarks"
3648
+ ]
3649
+ },
3650
  "node_modules/escalade": {
3651
  "version": "3.2.0",
3652
  "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz",
 
3730
  }
3731
  },
3732
  "node_modules/eslint-config-next": {
3733
+ "version": "15.1.4",
3734
+ "resolved": "https://registry.npmjs.org/eslint-config-next/-/eslint-config-next-15.1.4.tgz",
3735
+ "integrity": "sha512-u9+7lFmfhKNgGjhQ9tBeyCFsPJyq0SvGioMJBngPC7HXUpR0U+ckEwQR48s7TrRNHra1REm6evGL2ie38agALg==",
3736
  "dev": true,
3737
  "license": "MIT",
3738
  "dependencies": {
3739
+ "@next/eslint-plugin-next": "15.1.4",
3740
+ "@rushstack/eslint-patch": "^1.10.3",
3741
+ "@typescript-eslint/eslint-plugin": "^5.4.2 || ^6.0.0 || ^7.0.0 || ^8.0.0",
3742
+ "@typescript-eslint/parser": "^5.4.2 || ^6.0.0 || ^7.0.0 || ^8.0.0",
3743
  "eslint-import-resolver-node": "^0.3.6",
3744
  "eslint-import-resolver-typescript": "^3.5.2",
3745
+ "eslint-plugin-import": "^2.31.0",
3746
  "eslint-plugin-jsx-a11y": "^6.10.0",
3747
  "eslint-plugin-react": "^7.37.0",
3748
+ "eslint-plugin-react-hooks": "^5.0.0"
 
 
3749
  },
3750
  "peerDependencies": {
3751
+ "eslint": "^7.23.0 || ^8.0.0 || ^9.0.0",
3752
  "typescript": ">=3.3.1"
3753
  },
3754
  "peerDependenciesMeta": {
 
3757
  }
3758
  }
3759
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
3760
  "node_modules/eslint-import-resolver-node": {
3761
  "version": "0.3.9",
3762
  "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.9.tgz",
 
3886
  "ms": "^2.1.1"
3887
  }
3888
  },
3889
+ "node_modules/eslint-plugin-import/node_modules/semver": {
3890
+ "version": "6.3.1",
3891
+ "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
3892
+ "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
3893
+ "dev": true,
3894
+ "license": "ISC",
3895
+ "bin": {
3896
+ "semver": "bin/semver.js"
3897
+ }
3898
+ },
3899
  "node_modules/eslint-plugin-jsx-a11y": {
3900
  "version": "6.10.2",
3901
  "resolved": "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.10.2.tgz",
 
3960
  }
3961
  },
3962
  "node_modules/eslint-plugin-react-hooks": {
3963
+ "version": "5.2.0",
3964
+ "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-5.2.0.tgz",
3965
+ "integrity": "sha512-+f15FfK64YQwZdJNELETdn5ibXEUQmW1DZL6KXhNnc2heoy/sg9VJJeT7n8TlMWouzWqSWavFkIhHyIbIAEapg==",
3966
  "dev": true,
3967
  "license": "MIT",
 
 
 
 
 
 
 
3968
  "engines": {
3969
+ "node": ">=10"
3970
  },
3971
  "peerDependencies": {
3972
  "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 || ^9.0.0"
 
3996
  "url": "https://github.com/sponsors/ljharb"
3997
  }
3998
  },
3999
+ "node_modules/eslint-plugin-react/node_modules/semver": {
4000
+ "version": "6.3.1",
4001
+ "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
4002
+ "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
4003
+ "dev": true,
4004
+ "license": "ISC",
4005
+ "bin": {
4006
+ "semver": "bin/semver.js"
4007
+ }
4008
+ },
4009
  "node_modules/eslint-scope": {
4010
  "version": "8.4.0",
4011
  "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.4.0.tgz",
 
4100
  "node": ">=0.10.0"
4101
  }
4102
  },
4103
+ "node_modules/eventemitter3": {
4104
+ "version": "5.0.4",
4105
+ "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.4.tgz",
4106
+ "integrity": "sha512-mlsTRyGaPBjPedk6Bvw+aqbsXDtoAyAzm5MO7JgU+yVRyMQ5O8bD4Kcci7BS85f93veegeCPkL8R4GLClnjLFw==",
4107
+ "license": "MIT"
4108
+ },
4109
  "node_modules/fast-deep-equal": {
4110
  "version": "3.1.3",
4111
  "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
 
4258
  "@firebase/util": "1.15.0"
4259
  }
4260
  },
4261
+ "node_modules/firebase/node_modules/@firebase/auth": {
4262
+ "version": "1.12.2",
4263
+ "resolved": "https://registry.npmjs.org/@firebase/auth/-/auth-1.12.2.tgz",
4264
+ "integrity": "sha512-CZJL8V10Vzibs+pDTXdQF+hot1IigIoqF4a4lA/qr5Deo1srcefiyIfgg28B67Lk7IxZhwfJMuI+1bu2xBmV0A==",
4265
+ "license": "Apache-2.0",
4266
+ "dependencies": {
4267
+ "@firebase/component": "0.7.2",
4268
+ "@firebase/logger": "0.5.0",
4269
+ "@firebase/util": "1.15.0",
4270
+ "tslib": "^2.1.0"
4271
+ },
4272
+ "engines": {
4273
+ "node": ">=20.0.0"
4274
+ },
4275
+ "peerDependencies": {
4276
+ "@firebase/app": "0.x",
4277
+ "@react-native-async-storage/async-storage": "^2.2.0"
4278
+ },
4279
+ "peerDependenciesMeta": {
4280
+ "@react-native-async-storage/async-storage": {
4281
+ "optional": true
4282
+ }
4283
+ }
4284
+ },
4285
  "node_modules/flat-cache": {
4286
  "version": "4.0.1",
4287
  "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz",
 
4319
  "url": "https://github.com/sponsors/ljharb"
4320
  }
4321
  },
4322
+ "node_modules/framer-motion": {
4323
+ "version": "12.38.0",
4324
+ "resolved": "https://registry.npmjs.org/framer-motion/-/framer-motion-12.38.0.tgz",
4325
+ "integrity": "sha512-rFYkY/pigbcswl1XQSb7q424kSTQ8q6eAC+YUsSKooHQYuLdzdHjrt6uxUC+PRAO++q5IS7+TamgIw1AphxR+g==",
4326
+ "license": "MIT",
4327
+ "dependencies": {
4328
+ "motion-dom": "^12.38.0",
4329
+ "motion-utils": "^12.36.0",
4330
+ "tslib": "^2.4.0"
4331
+ },
4332
+ "peerDependencies": {
4333
+ "@emotion/is-prop-valid": "*",
4334
+ "react": "^18.0.0 || ^19.0.0",
4335
+ "react-dom": "^18.0.0 || ^19.0.0"
4336
+ },
4337
+ "peerDependenciesMeta": {
4338
+ "@emotion/is-prop-valid": {
4339
+ "optional": true
4340
+ },
4341
+ "react": {
4342
+ "optional": true
4343
+ },
4344
+ "react-dom": {
4345
+ "optional": true
4346
+ }
4347
+ }
4348
+ },
4349
  "node_modules/function-bind": {
4350
  "version": "1.1.2",
4351
  "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz",
 
4397
  "node": ">= 0.4"
4398
  }
4399
  },
 
 
 
 
 
 
 
 
 
 
4400
  "node_modules/get-caller-file": {
4401
  "version": "2.0.5",
4402
  "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz",
 
4633
  "node": ">= 0.4"
4634
  }
4635
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
4636
  "node_modules/http-parser-js": {
4637
  "version": "0.5.10",
4638
  "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.10.tgz",
 
4655
  "node": ">= 4"
4656
  }
4657
  },
4658
+ "node_modules/immer": {
4659
+ "version": "10.2.0",
4660
+ "resolved": "https://registry.npmjs.org/immer/-/immer-10.2.0.tgz",
4661
+ "integrity": "sha512-d/+XTN3zfODyjr89gM3mPq1WNX2B8pYsu7eORitdwyA2sBubnTl3laYlBk4sXY5FUa5qTZGBDPJICVbvqzjlbw==",
4662
+ "license": "MIT",
4663
+ "funding": {
4664
+ "type": "opencollective",
4665
+ "url": "https://opencollective.com/immer"
4666
+ }
4667
+ },
4668
  "node_modules/import-fresh": {
4669
  "version": "3.3.1",
4670
  "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz",
 
4707
  "node": ">= 0.4"
4708
  }
4709
  },
4710
+ "node_modules/internmap": {
4711
+ "version": "2.0.3",
4712
+ "resolved": "https://registry.npmjs.org/internmap/-/internmap-2.0.3.tgz",
4713
+ "integrity": "sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg==",
4714
+ "license": "ISC",
4715
+ "engines": {
4716
+ "node": ">=12"
4717
+ }
4718
+ },
4719
  "node_modules/is-array-buffer": {
4720
  "version": "3.0.5",
4721
  "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.5.tgz",
 
4734
  "url": "https://github.com/sponsors/ljharb"
4735
  }
4736
  },
4737
+ "node_modules/is-arrayish": {
4738
+ "version": "0.3.4",
4739
+ "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.4.tgz",
4740
+ "integrity": "sha512-m6UrgzFVUYawGBh1dUsWR5M2Clqic9RVXC/9f8ceNlv2IcO9j9J/z8UoCLPqtsPBFNzEpfR3xftohbfqDx8EQA==",
4741
+ "license": "MIT",
4742
+ "optional": true
4743
+ },
4744
  "node_modules/is-async-function": {
4745
  "version": "2.1.1",
4746
  "resolved": "https://registry.npmjs.org/is-async-function/-/is-async-function-2.1.1.tgz",
 
4804
  "semver": "^7.7.1"
4805
  }
4806
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
4807
  "node_modules/is-callable": {
4808
  "version": "1.2.7",
4809
  "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz",
 
5196
  "js-yaml": "bin/js-yaml.js"
5197
  }
5198
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
5199
  "node_modules/json-buffer": {
5200
  "version": "3.0.1",
5201
  "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz",
 
5218
  "license": "MIT"
5219
  },
5220
  "node_modules/json5": {
5221
+ "version": "1.0.2",
5222
+ "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz",
5223
+ "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==",
5224
  "dev": true,
5225
  "license": "MIT",
5226
+ "dependencies": {
5227
+ "minimist": "^1.2.0"
5228
+ },
5229
  "bin": {
5230
  "json5": "lib/cli.js"
 
 
 
5231
  }
5232
  },
5233
  "node_modules/jsx-ast-utils": {
 
5599
  "loose-envify": "cli.js"
5600
  }
5601
  },
5602
+ "node_modules/lucide-react": {
5603
+ "version": "1.0.1",
5604
+ "resolved": "https://registry.npmjs.org/lucide-react/-/lucide-react-1.0.1.tgz",
5605
+ "integrity": "sha512-lih7tKEczCYOQjVEzpFuxEuNzlwf+1yhvlMlEkGWJM3va8Pugv8bYXc/pRtcjPncaP7k84X0Pt/71ufxvqEPtQ==",
 
5606
  "license": "ISC",
5607
+ "peerDependencies": {
5608
+ "react": "^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0"
5609
  }
5610
  },
5611
  "node_modules/magic-string": {
 
5675
  "url": "https://github.com/sponsors/ljharb"
5676
  }
5677
  },
5678
+ "node_modules/motion-dom": {
5679
+ "version": "12.38.0",
5680
+ "resolved": "https://registry.npmjs.org/motion-dom/-/motion-dom-12.38.0.tgz",
5681
+ "integrity": "sha512-pdkHLD8QYRp8VfiNLb8xIBJis1byQ9gPT3Jnh2jqfFtAsWUA3dEepDlsWe/xMpO8McV+VdpKVcp+E+TGJEtOoA==",
5682
+ "license": "MIT",
5683
+ "dependencies": {
5684
+ "motion-utils": "^12.36.0"
5685
+ }
5686
+ },
5687
+ "node_modules/motion-utils": {
5688
+ "version": "12.36.0",
5689
+ "resolved": "https://registry.npmjs.org/motion-utils/-/motion-utils-12.36.0.tgz",
5690
+ "integrity": "sha512-eHWisygbiwVvf6PZ1vhaHCLamvkSbPIeAYxWUuL3a2PD/TROgE7FvfHWTIH4vMl798QLfMw15nRqIaRDXTlYRg==",
5691
+ "license": "MIT"
5692
+ },
5693
  "node_modules/ms": {
5694
  "version": "2.1.3",
5695
  "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
 
5739
  "license": "MIT"
5740
  },
5741
  "node_modules/next": {
5742
+ "version": "15.1.4",
5743
+ "resolved": "https://registry.npmjs.org/next/-/next-15.1.4.tgz",
5744
+ "integrity": "sha512-mTaq9dwaSuwwOrcu3ebjDYObekkxRnXpuVL21zotM8qE2W0HBOdVIdg2Li9QjMEZrj73LN96LcWcz62V19FjAg==",
5745
+ "deprecated": "This version has a security vulnerability. Please upgrade to a patched version. See https://nextjs.org/blog/CVE-2025-66478 for more details.",
5746
  "license": "MIT",
5747
  "dependencies": {
5748
+ "@next/env": "15.1.4",
5749
+ "@swc/counter": "0.1.3",
5750
  "@swc/helpers": "0.5.15",
5751
+ "busboy": "1.6.0",
5752
  "caniuse-lite": "^1.0.30001579",
5753
  "postcss": "8.4.31",
5754
  "styled-jsx": "5.1.6"
 
5757
  "next": "dist/bin/next"
5758
  },
5759
  "engines": {
5760
+ "node": "^18.18.0 || ^19.8.0 || >= 20.0.0"
5761
  },
5762
  "optionalDependencies": {
5763
+ "@next/swc-darwin-arm64": "15.1.4",
5764
+ "@next/swc-darwin-x64": "15.1.4",
5765
+ "@next/swc-linux-arm64-gnu": "15.1.4",
5766
+ "@next/swc-linux-arm64-musl": "15.1.4",
5767
+ "@next/swc-linux-x64-gnu": "15.1.4",
5768
+ "@next/swc-linux-x64-musl": "15.1.4",
5769
+ "@next/swc-win32-arm64-msvc": "15.1.4",
5770
+ "@next/swc-win32-x64-msvc": "15.1.4",
5771
+ "sharp": "^0.33.5"
5772
  },
5773
  "peerDependencies": {
5774
  "@opentelemetry/api": "^1.1.0",
5775
+ "@playwright/test": "^1.41.2",
5776
  "babel-plugin-react-compiler": "*",
5777
  "react": "^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0",
5778
  "react-dom": "^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0",
 
5840
  "url": "https://github.com/sponsors/ljharb"
5841
  }
5842
  },
5843
+ "node_modules/node-exports-info/node_modules/semver": {
5844
+ "version": "6.3.1",
5845
+ "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
5846
+ "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
5847
  "dev": true,
5848
+ "license": "ISC",
5849
+ "bin": {
5850
+ "semver": "bin/semver.js"
5851
+ }
5852
  },
5853
  "node_modules/object-assign": {
5854
  "version": "4.1.1",
 
6161
  "react-is": "^16.13.1"
6162
  }
6163
  },
6164
+ "node_modules/prop-types/node_modules/react-is": {
6165
+ "version": "16.13.1",
6166
+ "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz",
6167
+ "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==",
6168
+ "dev": true,
6169
+ "license": "MIT"
6170
+ },
6171
  "node_modules/protobufjs": {
6172
  "version": "7.5.4",
6173
  "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-7.5.4.tgz",
 
6224
  "license": "MIT"
6225
  },
6226
  "node_modules/react": {
6227
+ "version": "19.0.0",
6228
+ "resolved": "https://registry.npmjs.org/react/-/react-19.0.0.tgz",
6229
+ "integrity": "sha512-V8AVnmPIICiWpGfm6GLzCR/W5FXLchHop40W4nXBmdlEceh16rCN8O8LNWm5bh5XUX91fh7KpA+W0TgMKmgTpQ==",
6230
  "license": "MIT",
6231
  "engines": {
6232
  "node": ">=0.10.0"
6233
  }
6234
  },
6235
  "node_modules/react-dom": {
6236
+ "version": "19.0.0",
6237
+ "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.0.0.tgz",
6238
+ "integrity": "sha512-4GV5sHFG0e/0AD4X+ySy6UJd3jVl1iNsNHdpad0qhABJ11twS3TTBnseqsKurKcsNqCEFeGL3uLpVChpIO3QfQ==",
6239
  "license": "MIT",
6240
  "dependencies": {
6241
+ "scheduler": "^0.25.0"
6242
  },
6243
  "peerDependencies": {
6244
+ "react": "^19.0.0"
6245
  }
6246
  },
6247
  "node_modules/react-is": {
6248
+ "version": "19.2.4",
6249
+ "resolved": "https://registry.npmjs.org/react-is/-/react-is-19.2.4.tgz",
6250
+ "integrity": "sha512-W+EWGn2v0ApPKgKKCy/7s7WHXkboGcsrXE+2joLyVxkbyVQfO3MUEaUQDHoSmb8TFFrSKYa9mw64WZHNHSDzYA==",
6251
+ "license": "MIT",
6252
+ "peer": true
6253
+ },
6254
+ "node_modules/react-redux": {
6255
+ "version": "9.2.0",
6256
+ "resolved": "https://registry.npmjs.org/react-redux/-/react-redux-9.2.0.tgz",
6257
+ "integrity": "sha512-ROY9fvHhwOD9ySfrF0wmvu//bKCQ6AeZZq1nJNtbDC+kk5DuSuNX/n6YWYF/SYy7bSba4D4FSz8DJeKY/S/r+g==",
6258
+ "license": "MIT",
6259
+ "dependencies": {
6260
+ "@types/use-sync-external-store": "^0.0.6",
6261
+ "use-sync-external-store": "^1.4.0"
6262
+ },
6263
+ "peerDependencies": {
6264
+ "@types/react": "^18.2.25 || ^19",
6265
+ "react": "^18.0 || ^19",
6266
+ "redux": "^5.0.0"
6267
+ },
6268
+ "peerDependenciesMeta": {
6269
+ "@types/react": {
6270
+ "optional": true
6271
+ },
6272
+ "redux": {
6273
+ "optional": true
6274
+ }
6275
+ }
6276
+ },
6277
+ "node_modules/recharts": {
6278
+ "version": "3.8.0",
6279
+ "resolved": "https://registry.npmjs.org/recharts/-/recharts-3.8.0.tgz",
6280
+ "integrity": "sha512-Z/m38DX3L73ExO4Tpc9/iZWHmHnlzWG4njQbxsF5aSjwqmHNDDIm0rdEBArkwsBvR8U6EirlEHiQNYWCVh9sGQ==",
6281
+ "license": "MIT",
6282
+ "workspaces": [
6283
+ "www"
6284
+ ],
6285
+ "dependencies": {
6286
+ "@reduxjs/toolkit": "^1.9.0 || 2.x.x",
6287
+ "clsx": "^2.1.1",
6288
+ "decimal.js-light": "^2.5.1",
6289
+ "es-toolkit": "^1.39.3",
6290
+ "eventemitter3": "^5.0.1",
6291
+ "immer": "^10.1.1",
6292
+ "react-redux": "8.x.x || 9.x.x",
6293
+ "reselect": "5.1.1",
6294
+ "tiny-invariant": "^1.3.3",
6295
+ "use-sync-external-store": "^1.2.2",
6296
+ "victory-vendor": "^37.0.2"
6297
+ },
6298
+ "engines": {
6299
+ "node": ">=18"
6300
+ },
6301
+ "peerDependencies": {
6302
+ "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0",
6303
+ "react-dom": "^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0",
6304
+ "react-is": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0"
6305
+ }
6306
+ },
6307
+ "node_modules/redux": {
6308
+ "version": "5.0.1",
6309
+ "resolved": "https://registry.npmjs.org/redux/-/redux-5.0.1.tgz",
6310
+ "integrity": "sha512-M9/ELqF6fy8FwmkpnF0S3YKOqMyoWJ4+CS5Efg2ct3oY9daQvd/Pc71FpGZsVsbl3Cpb+IIcjBDUnnyBdQbq4w==",
6311
  "license": "MIT"
6312
  },
6313
+ "node_modules/redux-thunk": {
6314
+ "version": "3.1.0",
6315
+ "resolved": "https://registry.npmjs.org/redux-thunk/-/redux-thunk-3.1.0.tgz",
6316
+ "integrity": "sha512-NW2r5T6ksUKXCabzhL9z+h206HQw/NJkcLm1GPImRQ8IzfXwRGqjVhKJGauHirT0DAuyy6hjdnMZaRoAcy0Klw==",
6317
+ "license": "MIT",
6318
+ "peerDependencies": {
6319
+ "redux": "^5.0.0"
6320
+ }
6321
+ },
6322
  "node_modules/reflect.getprototypeof": {
6323
  "version": "1.0.10",
6324
  "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.10.tgz",
 
6372
  "node": ">=0.10.0"
6373
  }
6374
  },
6375
+ "node_modules/reselect": {
6376
+ "version": "5.1.1",
6377
+ "resolved": "https://registry.npmjs.org/reselect/-/reselect-5.1.1.tgz",
6378
+ "integrity": "sha512-K/BG6eIky/SBpzfHZv/dd+9JBFiS4SWV7FIujVyJRux6e45+73RaUHXLmIR1f7WOMaQ0U1km6qwklRQxpJJY0w==",
6379
+ "license": "MIT"
6380
+ },
6381
  "node_modules/resolve": {
6382
  "version": "1.22.11",
6383
  "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.11.tgz",
 
6530
  }
6531
  },
6532
  "node_modules/scheduler": {
6533
+ "version": "0.25.0",
6534
+ "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.25.0.tgz",
6535
+ "integrity": "sha512-xFVuu11jh+xcO7JOAGJNOXld8/TcEHK/4CituBUeUb5hqxJLj9YuemAEuvm9gQ/+pgXYfbQuqAkiYu+u7YEsNA==",
6536
  "license": "MIT"
6537
  },
6538
  "node_modules/semver": {
6539
+ "version": "7.7.4",
6540
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz",
6541
+ "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==",
6542
+ "devOptional": true,
6543
  "license": "ISC",
6544
  "bin": {
6545
  "semver": "bin/semver.js"
6546
+ },
6547
+ "engines": {
6548
+ "node": ">=10"
6549
  }
6550
  },
6551
  "node_modules/set-function-length": {
 
6598
  }
6599
  },
6600
  "node_modules/sharp": {
6601
+ "version": "0.33.5",
6602
+ "resolved": "https://registry.npmjs.org/sharp/-/sharp-0.33.5.tgz",
6603
+ "integrity": "sha512-haPVm1EkS9pgvHrQ/F3Xy+hgcuMV0Wm9vfIBSiwZ05k+xgb0PkBQpGsAA/oWdDobNaZTH5ppvHtzCFbnSEwHVw==",
6604
  "hasInstallScript": true,
6605
  "license": "Apache-2.0",
6606
  "optional": true,
6607
  "dependencies": {
6608
+ "color": "^4.2.3",
6609
+ "detect-libc": "^2.0.3",
6610
+ "semver": "^7.6.3"
6611
  },
6612
  "engines": {
6613
  "node": "^18.17.0 || ^20.3.0 || >=21.0.0"
 
6616
  "url": "https://opencollective.com/libvips"
6617
  },
6618
  "optionalDependencies": {
6619
+ "@img/sharp-darwin-arm64": "0.33.5",
6620
+ "@img/sharp-darwin-x64": "0.33.5",
6621
+ "@img/sharp-libvips-darwin-arm64": "1.0.4",
6622
+ "@img/sharp-libvips-darwin-x64": "1.0.4",
6623
+ "@img/sharp-libvips-linux-arm": "1.0.5",
6624
+ "@img/sharp-libvips-linux-arm64": "1.0.4",
6625
+ "@img/sharp-libvips-linux-s390x": "1.0.4",
6626
+ "@img/sharp-libvips-linux-x64": "1.0.4",
6627
+ "@img/sharp-libvips-linuxmusl-arm64": "1.0.4",
6628
+ "@img/sharp-libvips-linuxmusl-x64": "1.0.4",
6629
+ "@img/sharp-linux-arm": "0.33.5",
6630
+ "@img/sharp-linux-arm64": "0.33.5",
6631
+ "@img/sharp-linux-s390x": "0.33.5",
6632
+ "@img/sharp-linux-x64": "0.33.5",
6633
+ "@img/sharp-linuxmusl-arm64": "0.33.5",
6634
+ "@img/sharp-linuxmusl-x64": "0.33.5",
6635
+ "@img/sharp-wasm32": "0.33.5",
6636
+ "@img/sharp-win32-ia32": "0.33.5",
6637
+ "@img/sharp-win32-x64": "0.33.5"
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
6638
  }
6639
  },
6640
  "node_modules/shebang-command": {
 
6736
  "url": "https://github.com/sponsors/ljharb"
6737
  }
6738
  },
6739
+ "node_modules/simple-swizzle": {
6740
+ "version": "0.2.4",
6741
+ "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.4.tgz",
6742
+ "integrity": "sha512-nAu1WFPQSMNr2Zn9PGSZK9AGn4t/y97lEm+MXTtUDwfP0ksAIX4nO+6ruD9Jwut4C49SB1Ws+fbXsm/yScWOHw==",
6743
+ "license": "MIT",
6744
+ "optional": true,
6745
+ "dependencies": {
6746
+ "is-arrayish": "^0.3.1"
6747
+ }
6748
+ },
6749
  "node_modules/source-map-js": {
6750
  "version": "1.2.1",
6751
  "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz",
 
6776
  "node": ">= 0.4"
6777
  }
6778
  },
6779
+ "node_modules/streamsearch": {
6780
+ "version": "1.1.0",
6781
+ "resolved": "https://registry.npmjs.org/streamsearch/-/streamsearch-1.1.0.tgz",
6782
+ "integrity": "sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==",
6783
+ "engines": {
6784
+ "node": ">=10.0.0"
6785
+ }
6786
+ },
6787
  "node_modules/string-width": {
6788
  "version": "4.2.3",
6789
  "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
 
7022
  "url": "https://opencollective.com/webpack"
7023
  }
7024
  },
7025
+ "node_modules/tiny-invariant": {
7026
+ "version": "1.3.3",
7027
+ "resolved": "https://registry.npmjs.org/tiny-invariant/-/tiny-invariant-1.3.3.tgz",
7028
+ "integrity": "sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg==",
7029
+ "license": "MIT"
7030
+ },
7031
  "node_modules/tinyglobby": {
7032
  "version": "0.2.15",
7033
  "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.15.tgz",
 
7115
  "strip-bom": "^3.0.0"
7116
  }
7117
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
7118
  "node_modules/tslib": {
7119
  "version": "2.8.1",
7120
  "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz",
 
7226
  "node": ">=14.17"
7227
  }
7228
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
7229
  "node_modules/unbox-primitive": {
7230
  "version": "1.1.0",
7231
  "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.1.0.tgz",
 
7286
  "@unrs/resolver-binding-win32-x64-msvc": "1.11.1"
7287
  }
7288
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
7289
  "node_modules/uri-js": {
7290
  "version": "4.4.1",
7291
  "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz",
 
7296
  "punycode": "^2.1.0"
7297
  }
7298
  },
7299
+ "node_modules/use-sync-external-store": {
7300
+ "version": "1.6.0",
7301
+ "resolved": "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.6.0.tgz",
7302
+ "integrity": "sha512-Pp6GSwGP/NrPIrxVFAIkOQeyw8lFenOHijQWkUTrDvrF4ALqylP2C/KCkeS9dpUM3KvYRQhna5vt7IL95+ZQ9w==",
7303
+ "license": "MIT",
7304
+ "peerDependencies": {
7305
+ "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0"
7306
+ }
7307
+ },
7308
+ "node_modules/victory-vendor": {
7309
+ "version": "37.3.6",
7310
+ "resolved": "https://registry.npmjs.org/victory-vendor/-/victory-vendor-37.3.6.tgz",
7311
+ "integrity": "sha512-SbPDPdDBYp+5MJHhBCAyI7wKM3d5ivekigc2Dk2s7pgbZ9wIgIBYGVw4zGHBml/qTFbexrofXW6Gu4noGxrOwQ==",
7312
+ "license": "MIT AND ISC",
7313
+ "dependencies": {
7314
+ "@types/d3-array": "^3.0.3",
7315
+ "@types/d3-ease": "^3.0.0",
7316
+ "@types/d3-interpolate": "^3.0.1",
7317
+ "@types/d3-scale": "^4.0.2",
7318
+ "@types/d3-shape": "^3.1.0",
7319
+ "@types/d3-time": "^3.0.0",
7320
+ "@types/d3-timer": "^3.0.0",
7321
+ "d3-array": "^3.1.6",
7322
+ "d3-ease": "^3.0.1",
7323
+ "d3-interpolate": "^3.0.1",
7324
+ "d3-scale": "^4.0.2",
7325
+ "d3-shape": "^3.1.0",
7326
+ "d3-time": "^3.0.0",
7327
+ "d3-timer": "^3.0.1"
7328
+ }
7329
+ },
7330
  "node_modules/web-vitals": {
7331
  "version": "4.2.4",
7332
  "resolved": "https://registry.npmjs.org/web-vitals/-/web-vitals-4.2.4.tgz",
 
7497
  "node": ">=10"
7498
  }
7499
  },
 
 
 
 
 
 
 
7500
  "node_modules/yargs": {
7501
  "version": "17.7.2",
7502
  "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz",
 
7536
  "funding": {
7537
  "url": "https://github.com/sponsors/sindresorhus"
7538
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
7539
  }
7540
  }
7541
  }
package.json CHANGED
@@ -10,9 +10,12 @@
10
  },
11
  "dependencies": {
12
  "firebase": "^12.11.0",
 
 
13
  "next": "15.1.4",
14
  "react": "19.0.0",
15
- "react-dom": "19.0.0"
 
16
  },
17
  "devDependencies": {
18
  "@tailwindcss/postcss": "^4",
 
10
  },
11
  "dependencies": {
12
  "firebase": "^12.11.0",
13
+ "framer-motion": "^12.38.0",
14
+ "lucide-react": "^1.0.1",
15
  "next": "15.1.4",
16
  "react": "19.0.0",
17
+ "react-dom": "19.0.0",
18
+ "recharts": "^3.8.0"
19
  },
20
  "devDependencies": {
21
  "@tailwindcss/postcss": "^4",