diff --git a/README.md b/README.md
index e215bc4..4828f25 100644
--- a/README.md
+++ b/README.md
@@ -1,36 +1,83 @@
-This is a [Next.js](https://nextjs.org) project bootstrapped with [`create-next-app`](https://nextjs.org/docs/app/api-reference/cli/create-next-app).
-## Getting Started
-
-First, run the development server:
-
-```bash
-npm run dev
-# or
-yarn dev
-# or
-pnpm dev
-# or
-bun dev
```
+aystone
+├─ app
+│ ├─ a-propos
+│ │ └─ page.tsx
+│ ├─ ads
+│ │ └─ page.tsx
+│ ├─ api
+│ │ ├─ auth
+│ │ │ └─ [...nextauth]
+│ │ │ └─ route.ts
+│ │ └─ planning
+│ │ └─ route.ts
+│ ├─ dashboard
+│ │ ├─ Sidebar.tsx
+│ │ ├─ StatCard.tsx
+│ │ ├─ actions.ts
+│ │ ├─ ajouter
+│ │ │ ├─ AddProjectForm.tsx
+│ │ │ └─ page.tsx
+│ │ ├─ layout.tsx
+│ │ ├─ page.tsx
+│ │ ├─ profil
+│ │ │ └─ page.tsx
+│ │ └─ projets
+│ │ ├─ [id]
+│ │ │ ├─ EditProjectForm.tsx
+│ │ │ └─ page.tsx
+│ │ └─ page.tsx
+│ ├─ globals.css
+│ ├─ layout.tsx
+│ ├─ login
+│ │ └─ page.tsx
+│ ├─ maps
+│ │ └─ page.tsx
+│ ├─ page.tsx
+│ └─ providers.tsx
+├─ auth.ts
+├─ components
+│ ├─ AdsGalleryClient.tsx
+│ ├─ AdsSideBanners.tsx
+│ ├─ AvailabilityPlanner.tsx
+│ ├─ Banner.tsx
+│ ├─ Footer.tsx
+│ ├─ MapsClient.tsx
+│ ├─ McSplash.tsx
+│ ├─ MotionHeading.tsx
+│ ├─ Navbar.tsx
+│ ├─ ProjectsTable.tsx
+│ └─ RedstoneParticles.tsx
+├─ eslint.config.mjs
+├─ lib
+│ ├─ getAds.ts
+│ └─ prisma.ts
+├─ middleware.ts
+├─ next.config.ts
+├─ package-lock.json
+├─ package.json
+├─ postcss.config.mjs
+├─ prisma
+│ ├─ migrations
+│ │ ├─ 20250727013821_init
+│ │ │ └─ migration.sql
+│ │ ├─ 20250727025700_add_mcname
+│ │ │ └─ migration.sql
+│ │ ├─ 20250727031005_project
+│ │ │ └─ migration.sql
+│ │ ├─ 20250727203115_add_availability_model
+│ │ │ └─ migration.sql
+│ │ └─ migration_lock.toml
+│ └─ schema.prisma
+├─ public
+│ ├─ ads
+│ │ ├─ riseofkinkdom.jpeg
+│ │ └─ voat.png
+│ ├─ aystone-saison2.png
+│ └─ aystone.png
+├─ tsconfig.json
+└─ types
+ └─ next-auth.d.ts
-Open [http://localhost:3000](http://localhost:3000) with your browser to see the result.
-
-You can start editing the page by modifying `app/page.tsx`. The page auto-updates as you edit the file.
-
-This project uses [`next/font`](https://nextjs.org/docs/app/building-your-application/optimizing/fonts) to automatically optimize and load [Geist](https://vercel.com/font), a new font family for Vercel.
-
-## Learn More
-
-To learn more about Next.js, take a look at the following resources:
-
-- [Next.js Documentation](https://nextjs.org/docs) - learn about Next.js features and API.
-- [Learn Next.js](https://nextjs.org/learn) - an interactive Next.js tutorial.
-
-You can check out [the Next.js GitHub repository](https://github.com/vercel/next.js) - your feedback and contributions are welcome!
-
-## Deploy on Vercel
-
-The easiest way to deploy your Next.js app is to use the [Vercel Platform](https://vercel.com/new?utm_medium=default-template&filter=next.js&utm_source=create-next-app&utm_campaign=create-next-app-readme) from the creators of Next.js.
-
-Check out our [Next.js deployment documentation](https://nextjs.org/docs/app/building-your-application/deploying) for more details.
+```
\ No newline at end of file
diff --git a/app/a-propos/page.tsx b/app/a-propos/page.tsx
new file mode 100644
index 0000000..d879b1f
--- /dev/null
+++ b/app/a-propos/page.tsx
@@ -0,0 +1,87 @@
+'use client';
+
+import { motion } from 'framer-motion';
+
+const TAGS = [
+ { id: 'spawn', label: 'Spawn', cls: 'bg-purple-700/30 text-purple-300' },
+ { id: 'build', label: 'Build', cls: 'bg-emerald-600/25 text-emerald-300' },
+ { id: 'usine', label: 'Usine', cls: 'bg-orange-600/20 text-orange-300' },
+];
+
+export default function AProposPage() {
+ return (
+
+
+
+ À propos
+
+
+
+
+ Cette application web permet à la communauté du serveur
+ Aystone de référencer, suivre
+ et partager ses projets Minecraft dans les différents mondes :
+ Overworld ,
+ Nether ,
+ End .
+
+
+
+ Le tableau liste : joueur, état, monde, nom, description,
+ coordonnées et tags personnalisés. L’interface responsive et
+ épurée garantit une expérience fluide sur mobile comme sur desktop.
+
+
+
+ Sous le capot : Next 15 , React 19 ,
+ Tailwind 4 et Framer Motion pour les
+ animations. Aucune donnée sensible n’est stockée : on se connecte
+ simplement via discord .
+
+ Sur le dashboard, vous pouvez ajouter votre pseudo Minecraft dans la section Infos du compte
+
+
+
+ Légende des tags
+
+ {TAGS.map(t => (
+
+ {t.label}
+
+ ))}
+
+
+
+
+ Code source
+
+ Le projet est entièrement open-source :{" "}
+
+ dépôt GitHub
+ .
+ Déployé sur Coolify .
+
+
+
+
+
+ );
+}
diff --git a/app/ads/page.tsx b/app/ads/page.tsx
new file mode 100644
index 0000000..e3e45a5
--- /dev/null
+++ b/app/ads/page.tsx
@@ -0,0 +1,11 @@
+import AdsGalleryClient from "@/components/AdsGalleryClient";
+import { getAdFiles } from "@/lib/getAds";
+
+export const metadata = {
+ title: "Galerie des publicités – Aystone",
+};
+
+export default async function AdsGalleryPage() {
+ const files = await getAdFiles();
+ return ;
+}
\ No newline at end of file
diff --git a/app/api/auth/[...nextauth]/route.ts b/app/api/auth/[...nextauth]/route.ts
new file mode 100644
index 0000000..020852e
--- /dev/null
+++ b/app/api/auth/[...nextauth]/route.ts
@@ -0,0 +1,3 @@
+import { handlers } from "@/auth";
+
+export const { GET, POST } = handlers;
\ No newline at end of file
diff --git a/app/couleurs/page.tsx b/app/couleurs/page.tsx
new file mode 100644
index 0000000..21aed71
--- /dev/null
+++ b/app/couleurs/page.tsx
@@ -0,0 +1,23 @@
+import Image from "next/image";
+
+export const metadata = {
+ title: "Charte des couleurs Minecraft",
+};
+export default function CouleursPage() {
+ return (
+
+
+ 🎨 Charte des couleurs Minecraft
+
+
+
+
+
+ );
+}
\ No newline at end of file
diff --git a/app/dashboard/Sidebar.tsx b/app/dashboard/Sidebar.tsx
new file mode 100644
index 0000000..bd14a49
--- /dev/null
+++ b/app/dashboard/Sidebar.tsx
@@ -0,0 +1,63 @@
+"use client";
+
+import {
+ LayoutDashboard,
+ PlusCircle,
+ TableProperties,
+ User
+} from "lucide-react";
+import Link from "next/link";
+import { usePathname } from "next/navigation";
+
+const LINKS = [
+ { name: "Tableau", href: "/dashboard", icon: LayoutDashboard },
+ { name: "Profil", href: "/dashboard/profil", icon: User },
+ { name: "Ajouter", href: "/dashboard/ajouter", icon: PlusCircle },
+ { name: "Mes Projets", href: "/dashboard/projets", icon: TableProperties },
+];
+
+export default function Sidebar() {
+ const pathname = usePathname();
+
+ return (
+
+ {/* Liens de navigation */}
+
+ {LINKS.map(({ name, href, icon: Icon }) => {
+ const active = pathname === href;
+ return (
+
+
+
+ {name}
+
+
+ );
+ })}
+
+
+ );
+}
\ No newline at end of file
diff --git a/app/dashboard/StatCard.tsx b/app/dashboard/StatCard.tsx
new file mode 100644
index 0000000..00ed09e
--- /dev/null
+++ b/app/dashboard/StatCard.tsx
@@ -0,0 +1,28 @@
+"use client";
+
+import { motion } from "framer-motion";
+import { ReactNode } from "react";
+
+type Props = {
+ title: string;
+ value: string | number;
+ icon?: ReactNode;
+};
+
+export default function StatCard({ title, value, icon }: Props) {
+ return (
+
+ {icon && (
+
+ {icon}
+
+ )}
+ {title}
+ {value}
+
+ );
+}
\ No newline at end of file
diff --git a/app/dashboard/actions.ts b/app/dashboard/actions.ts
new file mode 100644
index 0000000..5ab2590
--- /dev/null
+++ b/app/dashboard/actions.ts
@@ -0,0 +1,90 @@
+"use server";
+
+import { auth } from "@/auth";
+import { prisma } from "@/lib/prisma";
+import { revalidatePath } from "next/cache";
+import { redirect } from "next/navigation";
+
+export async function createProject(form: FormData) {
+ const session = await auth();
+ if (!session) throw new Error("unauth");
+
+ const currentUser = await prisma.user.findUnique({
+ where: { email: session.user!.email! },
+ });
+
+ const joueur =
+ (form.get("joueur") as string | null)?.trim() ||
+ currentUser?.mcName ||
+ session.user!.name!;
+
+ const coords = form.get("coords")?.toString().trim();
+ const tagsRaw = form.get("tags")?.toString() ?? "";
+
+ const data = {
+ joueur,
+ etat: (form.get("etat") as string) ?? "En cours",
+ monde: (form.get("monde") as string) ?? "Overworld",
+ projet: (form.get("projet") as string).trim(),
+ description: (form.get("description") as string).trim(),
+ coords: coords && coords.length > 0 ? coords : null,
+ tags: tagsRaw
+ .split(",")
+ .map((t) => t.trim())
+ .filter(Boolean),
+ };
+
+ await prisma.project.create({ data });
+ revalidatePath("/dashboard");
+ redirect("/dashboard");
+}
+
+export async function updateProject(projectId: string, form: FormData) {
+ const session = await auth();
+ if (!session) throw new Error("unauth");
+
+ const coords = form.get("coords")?.toString().trim();
+ const tagsRaw = form.get("tags")?.toString() ?? "";
+
+ const data = {
+ etat: (form.get("etat") as string),
+ monde: (form.get("monde") as string),
+ projet: (form.get("projet") as string).trim(),
+ description: (form.get("description") as string).trim(),
+ coords: coords && coords.length > 0 ? coords : null,
+ tags: tagsRaw
+ .split(",")
+ .map((t) => t.trim())
+ .filter(Boolean),
+ };
+
+ await prisma.project.update({
+ where: { id: projectId },
+ data,
+ });
+
+ revalidatePath("/dashboard");
+ redirect("/dashboard");
+}
+
+export async function updateMinecraftName(form: FormData) {
+ const session = await auth();
+ if (!session) throw new Error("unauth");
+
+ const mcName = (form.get("mcName") as string).trim();
+ if (!/^[A-Za-z0-9_]{3,16}$/.test(mcName)) throw new Error("invalid");
+
+ await prisma.user.upsert({
+ where: { email: session.user!.email! },
+ update: { mcName },
+ create: {
+ email: session.user!.email!,
+ name: session.user!.name,
+ image: session.user!.image,
+ mcName,
+ },
+ });
+
+ revalidatePath("/dashboard");
+ revalidatePath("/");
+}
\ No newline at end of file
diff --git a/app/dashboard/ajouter/AddProjectForm.tsx b/app/dashboard/ajouter/AddProjectForm.tsx
new file mode 100644
index 0000000..d1e685c
--- /dev/null
+++ b/app/dashboard/ajouter/AddProjectForm.tsx
@@ -0,0 +1,192 @@
+"use client";
+
+import { motion } from "framer-motion";
+import { Layers3, MapPin, Plus, Tags, User, X } from "lucide-react";
+import { useSession } from "next-auth/react";
+import { useState } from "react";
+import { createProject } from "../actions";
+
+const PREDEF = ["build", "usine", "spawn"] as const;
+type TagColor = (typeof PREDEF)[number];
+
+const palette: Record = {
+ build: "bg-emerald-600/90",
+ usine: "bg-orange-600/90",
+ spawn: "bg-fuchsia-700/90",
+};
+
+const isValidCoord = (value: string) => /^-?\d*$/.test(value);
+
+export default function AddProjectForm() {
+ const { data: session } = useSession();
+ const [tags, setTags] = useState([]);
+ const [tagInput, setInput] = useState("");
+
+ const [x, setX] = useState("");
+ const [y, setY] = useState("");
+ const [z, setZ] = useState("");
+
+ const addTag = (t: string) => {
+ const val = t.trim().toLowerCase();
+ if (!val || tags.includes(val) || tags.length >= 5) return;
+ setTags([...tags, val]);
+ };
+
+ const del = (t: string) => setTags(tags.filter((x) => x !== t));
+
+ const getTagClass = (t: string) => {
+ return palette[t as TagColor] ?? "bg-gray-600";
+ };
+
+ return (
+
+ {/* nom */}
+
+
+
+
+
+ {/* joueur */}
+ {session?.user?.email === "ultralionfr@gmail.com" && (
+
+
+
+
+ )}
+
+ {/* coords */}
+
+ {[
+ { name: "x", value: x, setValue: setX },
+ { name: "y", value: y, setValue: setY },
+ { name: "z", value: z, setValue: setZ },
+ ].map(({ name, value, setValue }) => (
+
+
+ {
+ if (isValidCoord(e.target.value)) setValue(e.target.value);
+ }}
+ className="w-full rounded-lg bg-gray-700 py-2 pl-9 pr-3 text-white placeholder-gray-400 focus:outline-none focus:ring-2 focus:ring-indigo-500"
+ />
+
+ ))}
+
+
+ {/* Tags */}
+
+
+ Tags (max 5)
+
+
+
+ {tags.map((t) => (
+ del(t)}
+ className={`rounded-full px-3 py-1 text-xs ${getTagClass(t)} text-white flex items-center gap-1 hover:opacity-80`}
+ >
+ {t}
+
+ ))}
+
+
+
+
{
+ addTag(e.target.value);
+ e.target.value = "";
+ }}
+ className="w-full sm:w-1/2 rounded-lg bg-gray-700 py-2 px-3 text-white focus:outline-none focus:ring-2 focus:ring-indigo-500"
+ defaultValue=""
+ >
+ Choisir un tag pré-défini
+ {PREDEF.map((t) => (
+ {t}
+ ))}
+
+
+
+
setInput(e.target.value)}
+ onKeyDown={(e) =>
+ e.key === "Enter" && (e.preventDefault(), addTag(tagInput), setInput(""))
+ }
+ placeholder="Ajouter un tag personnalisé"
+ className="w-full rounded-lg bg-gray-700 py-2 pl-3 pr-12 text-white placeholder-gray-400 focus:outline-none focus:ring-2 focus:ring-indigo-500"
+ />
+
{
+ addTag(tagInput);
+ setInput("");
+ }}
+ className="absolute right-1 top-1 rounded-lg bg-indigo-500 hover:bg-indigo-600 p-1"
+ >
+
+
+
+
+
+
+ {/* description */}
+
+
+ {/* état + monde */}
+
+
+ En cours
+ Terminé
+ Pause
+
+
+ Overworld
+ Nether
+ End
+
+
+
+ {/* hidden */}
+
+
+
+ {/* submit */}
+ {
+ const form = (e.target as HTMLButtonElement).form!;
+ const coordsField = form.coords as HTMLInputElement;
+ coordsField.value = [form.x.value, form.y.value, form.z.value].filter(Boolean).join(" ");
+ }}
+ >
+ Ajouter le projet
+
+
+ );
+}
\ No newline at end of file
diff --git a/app/dashboard/ajouter/page.tsx b/app/dashboard/ajouter/page.tsx
new file mode 100644
index 0000000..b23da08
--- /dev/null
+++ b/app/dashboard/ajouter/page.tsx
@@ -0,0 +1,22 @@
+import { auth } from "@/auth";
+import { redirect } from "next/navigation";
+import AddProjectForm from "./AddProjectForm";
+
+export const dynamic = "force-dynamic";
+export const metadata = { title: "Ajouter un projet | Dashboard" };
+
+export default async function AddProjectPage() {
+ const session = await auth();
+ if (!session) redirect("/");
+
+ return (
+
+
+
+ Ajouter un projet
+
+
+
+
+ );
+}
\ No newline at end of file
diff --git a/app/dashboard/layout.tsx b/app/dashboard/layout.tsx
new file mode 100644
index 0000000..475cc4e
--- /dev/null
+++ b/app/dashboard/layout.tsx
@@ -0,0 +1,19 @@
+import Providers from "@/app/providers";
+import Sidebar from "./Sidebar";
+
+export const metadata = { title: "Dashboard | Aystone" };
+
+export default function DashboardLayout({
+ children,
+}: {
+ children: React.ReactNode;
+}) {
+ return (
+
+
+
+ {children}
+
+
+ );
+}
diff --git a/app/dashboard/page.tsx b/app/dashboard/page.tsx
new file mode 100644
index 0000000..59c31a0
--- /dev/null
+++ b/app/dashboard/page.tsx
@@ -0,0 +1,45 @@
+import { auth } from "@/auth";
+import { prisma } from "@/lib/prisma";
+import { Info } from "lucide-react";
+import { redirect } from "next/navigation";
+import StatCard from "./StatCard";
+
+export const dynamic = "force-dynamic";
+export const revalidate = 0;
+
+export default async function DashboardHome() {
+ const session = await auth();
+ if (!session) return redirect("/");
+
+ const user = await prisma.user.findUnique({
+ where: { email: session.user!.email! },
+ });
+
+ const joueur = user?.mcName ?? session.user!.name!;
+
+ const [projectCount, userCount] = await Promise.all([
+ prisma.project.count({ where: { joueur } }),
+ prisma.user.count(),
+ ]);
+
+ return (
+
+
Tableau de bord
+
+
+
+
+
Important
+
+ Pensez à compléter votre profil avec votre pseudo Minecraft pour pouvoir créer et associer vos projets à votre compte.
+
+
+
+
+
+
+
+
+
+ );
+}
\ No newline at end of file
diff --git a/app/dashboard/profil/page.tsx b/app/dashboard/profil/page.tsx
new file mode 100644
index 0000000..59747d9
--- /dev/null
+++ b/app/dashboard/profil/page.tsx
@@ -0,0 +1,77 @@
+import { auth } from "@/auth";
+import { prisma } from "@/lib/prisma";
+import Image from "next/image";
+import { redirect } from "next/navigation";
+import { updateMinecraftName } from "../actions";
+
+export const dynamic = "force-dynamic";
+export const metadata = { title: "Profil | Dashboard" };
+
+export default async function ProfilPage() {
+ const session = await auth();
+ if (!session) redirect("/");
+
+ const user = await prisma.user.findUnique({
+ where: { email: session.user!.email! },
+ });
+
+ return (
+
+ Profil
+
+
+ {/* avatar Discord */}
+
+
+
+
{session.user?.name}
+
{session.user?.email}
+
+
+
+ {/* pseudo Minecraft */}
+
+
+
+ );
+}
diff --git a/app/dashboard/projets/UserProjectsTable.tsx b/app/dashboard/projets/UserProjectsTable.tsx
new file mode 100644
index 0000000..a1aad14
--- /dev/null
+++ b/app/dashboard/projets/UserProjectsTable.tsx
@@ -0,0 +1,106 @@
+"use client";
+
+import { SafeProject } from "@/lib/validators/project";
+import { motion } from "framer-motion";
+import {
+ BadgeCheck,
+ FileText,
+ Globe,
+ MapPin,
+ Pencil,
+ Tag,
+} from "lucide-react";
+import Link from "next/link";
+
+export default function UserProjectsTable({ projects }: { projects: SafeProject[] }) {
+ const headers = [
+ { label: "Projet", icon: FileText },
+ { label: "État", icon: BadgeCheck },
+ { label: "Monde", icon: Globe },
+ { label: "Coordonnées", icon: MapPin },
+ { label: "Tags", icon: Tag },
+ { label: "Actions", icon: Pencil },
+ ];
+
+ return (
+
+
+ Mes projets
+
+ ➕ Ajouter un projet
+
+
+
+ {projects.length === 0 ? (
+ Vous n’avez encore créé aucun projet.
+ ) : (
+
+
+
+
+ {headers.map(({ label, icon: Icon }) => (
+
+
+
+ {label}
+
+
+ ))}
+
+
+
+ {projects.map((p) => (
+
+ {p.projet}
+
+ {p.etat}
+
+
+ {p.monde}
+
+ {p.coords ?? "—"}
+
+
+ {p.tags.map((t, i) => (
+
+ {t}
+
+ ))}
+
+
+
+
+ Modifier
+
+
+
+ ))}
+
+
+
+ )}
+
+ );
+}
diff --git a/app/dashboard/projets/[id]/EditProjectForm.tsx b/app/dashboard/projets/[id]/EditProjectForm.tsx
new file mode 100644
index 0000000..6d84107
--- /dev/null
+++ b/app/dashboard/projets/[id]/EditProjectForm.tsx
@@ -0,0 +1,165 @@
+"use client";
+
+import { motion } from "framer-motion";
+import { Layers3, MapPin, Tags } from "lucide-react";
+import { useState } from "react";
+import { Project } from "../../../../components/ProjectsTable";
+import { updateProject } from "../../actions";
+
+type Props = {
+ project: Project;
+};
+
+/** Formulaire client pour éditer un projet existant */
+export default function EditProjectForm({ project }: Props) {
+ const [tags, setTags] = useState(project.tags ?? []);
+ const [customTag, setCustomTag] = useState("");
+
+ const PREDEF = ["build", "usine", "spawn"] as const;
+
+ const addTag = (t: string) => {
+ const val = t.trim().toLowerCase();
+ if (!val || tags.includes(val) || tags.length >= 5) return;
+ setTags([...tags, val]);
+ };
+
+ const removeTag = (t: string) => {
+ setTags(tags.filter((x) => x !== t));
+ };
+
+ const coordsParts = (project.coords ?? "").split(" ");
+
+ return (
+ updateProject(project.id!, formData)}
+ initial={{ opacity: 0, y: 12 }}
+ animate={{ opacity: 1, y: 0 }}
+ className="space-y-6"
+ >
+ {/* Titre du projet */}
+
+
+
+
+
+ {/* Coordonnées X Y Z */}
+
+ {["X", "Y", "Z"].map((axis, idx) => (
+
+
+
+
+ ))}
+
+
+ {/* Description */}
+
+
+ {/* État & Monde */}
+
+
+ En cours
+ Terminé
+ Pause
+
+
+ Overworld
+ Nether
+ End
+
+
+
+ {/* Tags */}
+
+
+ Tags (max 5)
+
+
+ {tags.map((t) => (
+ removeTag(t)}
+ className="rounded-full bg-slate-700/70 px-2 py-0.5 text-xs hover:bg-red-600/80"
+ >
+ {t} ✕
+
+ ))}
+
+
+ {
+ addTag(e.target.value);
+ e.target.value = "";
+ }}
+ className="input flex-1"
+ defaultValue=""
+ >
+ Tag prédéfini
+ {PREDEF.map((t) => (
+ {t}
+ ))}
+
+ setCustomTag(e.target.value)}
+ onKeyDown={(e) =>
+ e.key === "Enter" &&
+ (e.preventDefault(), addTag(customTag), setCustomTag(""))
+ }
+ placeholder="Ajouter tag..."
+ className="input flex-1"
+ />
+ {
+ addTag(customTag);
+ setCustomTag("");
+ }}
+ className="rounded bg-indigo-600 px-4 py-2 text-sm hover:bg-indigo-700"
+ >
+ Ajouter
+
+
+
+
+ {/* Champs cachés */}
+
+
+
+ {/* Bouton de soumission */}
+ {
+ const f = (e.target as HTMLButtonElement).form!;
+ const x = (f.x as HTMLInputElement).value;
+ const y = (f.y as HTMLInputElement).value;
+ const z = (f.z as HTMLInputElement).value;
+ (f.coords as HTMLInputElement).value = [x, y, z]
+ .filter(Boolean)
+ .join(" ");
+ }}
+ >
+ Mettre à jour le projet
+
+
+ );
+}
diff --git a/app/dashboard/projets/[id]/page.tsx b/app/dashboard/projets/[id]/page.tsx
new file mode 100644
index 0000000..47e3759
--- /dev/null
+++ b/app/dashboard/projets/[id]/page.tsx
@@ -0,0 +1,41 @@
+import { auth } from "@/auth";
+import { prisma } from "@/lib/prisma";
+import { notFound, redirect } from "next/navigation";
+import { z } from "zod";
+import EditProjectForm from "./EditProjectForm";
+
+type Props = { params: { id: string } };
+
+// Définition stricte du schéma
+const ProjectSchema = z.object({
+ id: z.string(),
+ joueur: z.string(),
+ projet: z.string(),
+ description: z.string(),
+ coords: z.string().nullable().transform((val) => val ?? ""),
+ tags: z.string().array(),
+ etat: z.enum(["En cours", "Terminé", "Pause"]),
+ monde: z.enum(["Overworld", "Nether", "End"]),
+ createdAt: z.date(),
+});
+
+export default async function EditProjectPage({ params }: Props) {
+ const session = await auth();
+ if (!session) redirect("/");
+
+ const data = await prisma.project.findUnique({
+ where: { id: params.id },
+ });
+
+ if (!data) notFound();
+
+ // ✅ Cast via zod
+ const project = ProjectSchema.parse(data);
+
+ return (
+
+ );
+}
diff --git a/app/dashboard/projets/page.tsx b/app/dashboard/projets/page.tsx
new file mode 100644
index 0000000..970b45b
--- /dev/null
+++ b/app/dashboard/projets/page.tsx
@@ -0,0 +1,41 @@
+import { auth } from "@/auth";
+import { prisma } from "@/lib/prisma";
+import { redirect } from "next/navigation";
+import { z } from "zod";
+import UserProjectsTable from "./UserProjectsTable";
+
+// Définition stricte du schéma
+const ProjectSchema = z.object({
+ id: z.string(),
+ joueur: z.string(),
+ projet: z.string(),
+ description: z.string(),
+ coords: z.string().nullable(),
+ tags: z.string().array(),
+ etat: z.enum(["En cours", "Terminé", "Pause"]),
+ monde: z.enum(["Overworld", "Nether", "End"]),
+ createdAt: z.date(),
+});
+
+export const dynamic = "force-dynamic";
+
+export default async function UserProjectsPage() {
+ const session = await auth();
+ if (!session) redirect("/");
+
+ const user = await prisma.user.findUnique({
+ where: { email: session.user.email! },
+ });
+
+ const joueur = user?.mcName ?? session.user.name!;
+
+ const projectsRaw = await prisma.project.findMany({
+ where: { joueur },
+ orderBy: { createdAt: "desc" },
+ });
+
+ // ✅ Valide les projets pour forcer le bon typage
+ const projects = projectsRaw.map((p) => ProjectSchema.parse(p));
+
+ return ;
+}
diff --git a/app/favicon.ico b/app/favicon.ico
deleted file mode 100644
index 718d6fe..0000000
Binary files a/app/favicon.ico and /dev/null differ
diff --git a/app/globals.css b/app/globals.css
index e3734be..963c644 100644
--- a/app/globals.css
+++ b/app/globals.css
@@ -1,42 +1,11 @@
-:root {
- --background: #ffffff;
- --foreground: #171717;
-}
+@import "tailwindcss";
-@media (prefers-color-scheme: dark) {
- :root {
- --background: #0a0a0a;
- --foreground: #ededed;
- }
-}
-
-html,
-body {
- max-width: 100vw;
- overflow-x: hidden;
-}
-
-body {
- color: var(--foreground);
- background: var(--background);
- font-family: Arial, Helvetica, sans-serif;
- -webkit-font-smoothing: antialiased;
- -moz-osx-font-smoothing: grayscale;
-}
-
-* {
- box-sizing: border-box;
- padding: 0;
- margin: 0;
-}
-
-a {
- color: inherit;
- text-decoration: none;
-}
-
-@media (prefers-color-scheme: dark) {
- html {
- color-scheme: dark;
- }
+.input {
+ @apply w-full rounded-md bg-[#20222e] px-10 py-2.5 text-sm text-white
+ placeholder-white/40 ring-1 ring-white/10 outline-none
+ focus:ring-2 focus:ring-indigo-500 transition;
}
+.card {
+ @apply rounded-2xl bg-[#111320]/70 p-8 ring-1 ring-white/10 backdrop-blur
+ shadow-[0_6px_20px_rgba(0,0,0,0.45)];
+}
\ No newline at end of file
diff --git a/app/layout.tsx b/app/layout.tsx
index 42fc323..a690d2d 100644
--- a/app/layout.tsx
+++ b/app/layout.tsx
@@ -1,32 +1,30 @@
+import Providers from "@/app/providers";
+import AdsSideBanners from "@/components/AdsSideBanners";
+import Footer from "@/components/Footer";
+import Navbar from "@/components/Navbar";
import type { Metadata } from "next";
-import { Geist, Geist_Mono } from "next/font/google";
import "./globals.css";
-const geistSans = Geist({
- variable: "--font-geist-sans",
- subsets: ["latin"],
-});
-
-const geistMono = Geist_Mono({
- variable: "--font-geist-mono",
- subsets: ["latin"],
-});
-
export const metadata: Metadata = {
- title: "Create Next App",
- description: "Generated by create next app",
+ title: "Aystone - Instance Cobble",
+ description: "Site communautaire Aystone",
};
export default function RootLayout({
children,
-}: Readonly<{
- children: React.ReactNode;
-}>) {
+}: {
+ children: React.ReactNode;
+}) {
return (
-
-
- {children}
+
+
+
+
+
+ {children}
+
+
);
-}
+}
\ No newline at end of file
diff --git a/app/login/page.tsx b/app/login/page.tsx
new file mode 100644
index 0000000..1e47f51
--- /dev/null
+++ b/app/login/page.tsx
@@ -0,0 +1,14 @@
+"use client";
+import { signIn, useSession } from "next-auth/react";
+import { useEffect } from "react";
+
+export default function LoginPage() {
+ const { data: session } = useSession();
+
+ useEffect(() => {
+ if (session) window.location.replace("/dashboard");
+ else signIn("discord", { callbackUrl: "/dashboard" });
+ }, [session]);
+
+ return Redirection vers Discord…
;
+}
\ No newline at end of file
diff --git a/app/maps/page.tsx b/app/maps/page.tsx
new file mode 100644
index 0000000..220980b
--- /dev/null
+++ b/app/maps/page.tsx
@@ -0,0 +1,9 @@
+import MapsClient from "@/components/MapsClient";
+
+export const metadata = {
+ title: "Carte dynamique | Aystone",
+};
+
+export default function MapsPage() {
+ return ;
+}
\ No newline at end of file
diff --git a/app/not-found.tsx b/app/not-found.tsx
new file mode 100644
index 0000000..99c603c
--- /dev/null
+++ b/app/not-found.tsx
@@ -0,0 +1,32 @@
+"use client";
+
+import { motion } from "framer-motion";
+import { Frown } from "lucide-react";
+import Link from "next/link";
+
+export default function NotFound() {
+ return (
+
+
+
+
+
+ 404 — Page introuvable
+
+ La page que tu cherches n'existe pas ou a été déplacée.
+
+
+ Retour à l'accueil
+
+
+
+ );
+}
diff --git a/app/outils/page.tsx b/app/outils/page.tsx
new file mode 100644
index 0000000..705f2cf
--- /dev/null
+++ b/app/outils/page.tsx
@@ -0,0 +1,10 @@
+import OutilsPage from "@/components/OutilsPage";
+import { Metadata } from "next";
+
+export const metadata: Metadata = {
+ title: "Outils | Aystone",
+};
+
+export default function Page() {
+ return ;
+}
\ No newline at end of file
diff --git a/app/page.module.css b/app/page.module.css
deleted file mode 100644
index 58c71af..0000000
--- a/app/page.module.css
+++ /dev/null
@@ -1,167 +0,0 @@
-.page {
- --gray-rgb: 0, 0, 0;
- --gray-alpha-200: rgba(var(--gray-rgb), 0.08);
- --gray-alpha-100: rgba(var(--gray-rgb), 0.05);
-
- --button-primary-hover: #383838;
- --button-secondary-hover: #f2f2f2;
-
- display: grid;
- grid-template-rows: 20px 1fr 20px;
- align-items: center;
- justify-items: center;
- min-height: 100svh;
- padding: 80px;
- gap: 64px;
- font-family: var(--font-geist-sans);
-}
-
-@media (prefers-color-scheme: dark) {
- .page {
- --gray-rgb: 255, 255, 255;
- --gray-alpha-200: rgba(var(--gray-rgb), 0.145);
- --gray-alpha-100: rgba(var(--gray-rgb), 0.06);
-
- --button-primary-hover: #ccc;
- --button-secondary-hover: #1a1a1a;
- }
-}
-
-.main {
- display: flex;
- flex-direction: column;
- gap: 32px;
- grid-row-start: 2;
-}
-
-.main ol {
- font-family: var(--font-geist-mono);
- padding-left: 0;
- margin: 0;
- font-size: 14px;
- line-height: 24px;
- letter-spacing: -0.01em;
- list-style-position: inside;
-}
-
-.main li:not(:last-of-type) {
- margin-bottom: 8px;
-}
-
-.main code {
- font-family: inherit;
- background: var(--gray-alpha-100);
- padding: 2px 4px;
- border-radius: 4px;
- font-weight: 600;
-}
-
-.ctas {
- display: flex;
- gap: 16px;
-}
-
-.ctas a {
- appearance: none;
- border-radius: 128px;
- height: 48px;
- padding: 0 20px;
- border: 1px solid transparent;
- transition:
- background 0.2s,
- color 0.2s,
- border-color 0.2s;
- cursor: pointer;
- display: flex;
- align-items: center;
- justify-content: center;
- font-size: 16px;
- line-height: 20px;
- font-weight: 500;
-}
-
-a.primary {
- background: var(--foreground);
- color: var(--background);
- gap: 8px;
-}
-
-a.secondary {
- border-color: var(--gray-alpha-200);
- min-width: 158px;
-}
-
-.footer {
- grid-row-start: 3;
- display: flex;
- gap: 24px;
-}
-
-.footer a {
- display: flex;
- align-items: center;
- gap: 8px;
-}
-
-.footer img {
- flex-shrink: 0;
-}
-
-/* Enable hover only on non-touch devices */
-@media (hover: hover) and (pointer: fine) {
- a.primary:hover {
- background: var(--button-primary-hover);
- border-color: transparent;
- }
-
- a.secondary:hover {
- background: var(--button-secondary-hover);
- border-color: transparent;
- }
-
- .footer a:hover {
- text-decoration: underline;
- text-underline-offset: 4px;
- }
-}
-
-@media (max-width: 600px) {
- .page {
- padding: 32px;
- padding-bottom: 80px;
- }
-
- .main {
- align-items: center;
- }
-
- .main ol {
- text-align: center;
- }
-
- .ctas {
- flex-direction: column;
- }
-
- .ctas a {
- font-size: 14px;
- height: 40px;
- padding: 0 16px;
- }
-
- a.secondary {
- min-width: auto;
- }
-
- .footer {
- flex-wrap: wrap;
- align-items: center;
- justify-content: center;
- }
-}
-
-@media (prefers-color-scheme: dark) {
- .logo {
- filter: invert();
- }
-}
diff --git a/app/page.tsx b/app/page.tsx
index 52bd15e..9411aaf 100644
--- a/app/page.tsx
+++ b/app/page.tsx
@@ -1,95 +1,31 @@
-import Image from "next/image";
-import styles from "./page.module.css";
+import Banner from "@/components/Banner";
+import ProjectsTable, { Project } from "@/components/ProjectsTable";
+import { prisma } from "@/lib/prisma";
+import MotionHeading from "../components/MotionHeading";
+
+export const dynamic = "force-dynamic";
+
+export default async function Home() {
+ const rawProjects = await prisma.project.findMany({
+ orderBy: { createdAt: "desc" },
+ });
+
+ const projects: Project[] = rawProjects.map((p) => ({
+ id: p.id,
+ joueur: p.joueur,
+ etat: p.etat as Project["etat"],
+ monde: p.monde as Project["monde"],
+ projet: p.projet,
+ description: p.description,
+ coords: p.coords ?? "",
+ tags: p.tags,
+ }));
-export default function Home() {
return (
-
-
-
-
-
- Get started by editing app/page.tsx.
-
- Save and see your changes instantly.
-
-
-
-
-
-
+ <>
+
+
+
+ >
);
-}
+}
\ No newline at end of file
diff --git a/app/providers.tsx b/app/providers.tsx
new file mode 100644
index 0000000..bd42c85
--- /dev/null
+++ b/app/providers.tsx
@@ -0,0 +1,7 @@
+"use client";
+import { SessionProvider } from "next-auth/react";
+import { ReactNode } from "react";
+
+export default function Providers({ children }: { children: ReactNode }) {
+ return {children} ;
+}
\ No newline at end of file
diff --git a/app/user/[username]/page.tsx b/app/user/[username]/page.tsx
new file mode 100644
index 0000000..058594a
--- /dev/null
+++ b/app/user/[username]/page.tsx
@@ -0,0 +1,51 @@
+import { auth } from "@/auth";
+import Banner from "@/components/Banner";
+import ProjectsTable, { Project } from "@/components/ProjectsTable";
+import { prisma } from "@/lib/prisma";
+import { notFound, redirect } from "next/navigation";
+
+type Props = {
+ params: { username: string };
+};
+
+export default async function UserProfilePage({ params }: Props) {
+ const session = await auth();
+ if (!session) return redirect("/");
+
+ const username = params.username;
+ const user = await prisma.user.findUnique({
+ where: { mcName: username },
+ });
+ if (!user) return notFound();
+
+ const rawProjects = await prisma.project.findMany({
+ where: { joueur: username },
+ orderBy: { createdAt: "desc" },
+ });
+
+ const projects: Project[] = rawProjects.map((p) => ({
+ id: p.id,
+ joueur: p.joueur,
+ etat: p.etat as Project["etat"],
+ monde: p.monde as Project["monde"],
+ projet: p.projet,
+ description: p.description,
+ coords: p.coords ?? "",
+ tags: p.tags,
+ }));
+
+ return (
+
+
+
+ Projets de {username}
+
+
+ {projects.length === 0 ? (
+ Aucun projet enregistré.
+ ) : (
+
+ )}
+
+ );
+}
diff --git a/auth.ts b/auth.ts
new file mode 100644
index 0000000..977c488
--- /dev/null
+++ b/auth.ts
@@ -0,0 +1,23 @@
+import NextAuth, { type NextAuthConfig, type Session } from "next-auth";
+import { type JWT } from "next-auth/jwt";
+import Discord from "next-auth/providers/discord";
+
+export const authConfig: NextAuthConfig = {
+ providers: [
+ Discord({
+ clientId: process.env.DISCORD_CLIENT_ID!,
+ clientSecret: process.env.DISCORD_CLIENT_SECRET!,
+ }),
+ ],
+ callbacks: {
+ async session({ session, token }: { session: Session; token: JWT }) {
+ if (token?.sub) {
+ session.user.id = token.sub;
+ }
+ return session;
+ },
+ },
+ trustHost: true,
+};
+
+export const { auth, handlers } = NextAuth(authConfig);
\ No newline at end of file
diff --git a/components/AdsGalleryClient.tsx b/components/AdsGalleryClient.tsx
new file mode 100644
index 0000000..be0d771
--- /dev/null
+++ b/components/AdsGalleryClient.tsx
@@ -0,0 +1,105 @@
+"use client";
+
+import { motion } from "framer-motion";
+import Image from "next/image";
+
+const ADS_COPY: Record = {
+ "riseofkinkdom.jpeg": {
+ title: "Atteignez 50 Millions d’Impuissance !",
+ subtitle: "Rejoignez « Rise of Kink Doms » et dominez vos adversaires.",
+ },
+ "voat.png": {
+ title: "Aymeric Pierre vend votre voiture !",
+ subtitle: "Offre exclusive : 69,42 BTC, garantie World PvP Champion.",
+ },
+};
+
+export default function AdsGalleryClient({ files }: { files: string[] }) {
+ return (
+
+
+
+ Galerie des publicités
+
+
+ {files.length === 0 ? (
+
+ Aucune bannière trouvée dans{" "}
+ /public/ads.
+
+ ) : (
+
+ {files.map((file) => {
+ const copy = ADS_COPY[file];
+ return (
+
+
+
+
+
+ {copy && (
+
+
+ {copy.title.split(/(50 Millions)/).map((part, i) =>
+ part === "50 Millions" ? (
+
+ {part}
+
+ ) : (
+ part
+ )
+ )}
+
+
+ {copy.subtitle}
+
+
+ )}
+
+ {file}
+
+
+ );
+ })}
+
+ )}
+
+
+ );
+}
diff --git a/components/AdsSideBanners.tsx b/components/AdsSideBanners.tsx
new file mode 100644
index 0000000..8f51157
--- /dev/null
+++ b/components/AdsSideBanners.tsx
@@ -0,0 +1,50 @@
+'use client';
+
+import { X } from 'lucide-react';
+import Image from 'next/image';
+import { useEffect, useState } from 'react';
+
+const ADS_IMAGES = [
+ '/ads/riseofkinkdom.jpeg',
+ '/ads/voat.png'
+];
+
+export default function PopupAd() {
+ const [visible, setVisible] = useState(false);
+ const [src, setSrc] = useState(ADS_IMAGES[0]);
+
+ /* choix aléatoire + délai d’apparition */
+ useEffect(() => {
+ setSrc(ADS_IMAGES[Math.floor(Math.random() * ADS_IMAGES.length)]);
+ const id = setTimeout(() => setVisible(true), 5000); // 5 s
+ return () => clearTimeout(id);
+ }, []);
+
+ if (!visible) return null;
+
+ return (
+
+
+ {/* bouton fermer */}
+ setVisible(false)}
+ aria-label="Fermer la pub"
+ className="absolute right-2 top-2 z-10 rounded-full bg-black/40 p-1 hover:bg-black/60"
+ >
+
+
+
+ {/* image de la pub */}
+
+
+
+ );
+}
diff --git a/components/Banner.tsx b/components/Banner.tsx
new file mode 100644
index 0000000..817ec23
--- /dev/null
+++ b/components/Banner.tsx
@@ -0,0 +1,29 @@
+"use client";
+
+import { motion } from "framer-motion";
+import Image from "next/image";
+
+export default function Banner() {
+ return (
+
+ );
+}
\ No newline at end of file
diff --git a/components/Footer.tsx b/components/Footer.tsx
new file mode 100644
index 0000000..946a9a3
--- /dev/null
+++ b/components/Footer.tsx
@@ -0,0 +1,30 @@
+"use client";
+
+import { motion } from "framer-motion";
+import { Heart } from "lucide-react";
+import Link from "next/link";
+
+export default function Footer() {
+ return (
+
+
+
+ © 2025 Aystone Instance Cobble — Projet non affilié à Mojang/Microsoft
+
+
+ Réalisé avec
+
+ par
+
+ UltraLion
+
+
+
+
+ );
+}
diff --git a/components/MapsClient.tsx b/components/MapsClient.tsx
new file mode 100644
index 0000000..709ed62
--- /dev/null
+++ b/components/MapsClient.tsx
@@ -0,0 +1,59 @@
+"use client";
+
+import { motion } from "framer-motion";
+import Link from "next/link";
+
+export default function MapsClient() {
+ return (
+
+
+ Carte dynamique de l’instance
+
+
+
+ Explore la carte interactive ci-dessous ou ouvre-la dans un nouvel onglet.
+
+
+
+
+ Ouvrir la carte dans un nouvel onglet
+
+
+
+
+
+
+
+ );
+}
diff --git a/components/McSplash.tsx b/components/McSplash.tsx
new file mode 100644
index 0000000..c11410a
--- /dev/null
+++ b/components/McSplash.tsx
@@ -0,0 +1,23 @@
+"use client";
+
+import { motion } from "framer-motion";
+
+export default function McSplash() {
+ return (
+
+ Instance Cobble
+
+ );
+}
\ No newline at end of file
diff --git a/components/MotionHeading.tsx b/components/MotionHeading.tsx
new file mode 100644
index 0000000..88d8781
--- /dev/null
+++ b/components/MotionHeading.tsx
@@ -0,0 +1,26 @@
+"use client";
+
+import RedstoneParticles from "@/components/RedstoneParticles";
+import { motion } from "framer-motion";
+
+export default function MotionHeading() {
+ return (
+
+
+
+ Tableau des projets
+
+
+
+
+ );
+}
\ No newline at end of file
diff --git a/components/Navbar.tsx b/components/Navbar.tsx
new file mode 100644
index 0000000..20cab7b
--- /dev/null
+++ b/components/Navbar.tsx
@@ -0,0 +1,186 @@
+/* components/Navbar.tsx */
+"use client";
+
+import McSplash from "@/components/McSplash";
+import RedstoneParticles from "@/components/RedstoneParticles";
+import { AnimatePresence, motion } from "framer-motion";
+import {
+ BookOpen,
+ Home,
+ Info,
+ MapPin,
+ Megaphone,
+ Menu,
+ X,
+} from "lucide-react";
+import { signIn, signOut, useSession } from "next-auth/react";
+import Image from "next/image";
+import Link from "next/link";
+import { useEffect, useState } from "react";
+
+const navLinks = [
+ { name: "Accueil", href: "/", Icon: Home },
+ { name: "Wiki Aystone", href: "https://wiki.aystone.fr", Icon: BookOpen },
+ { name: "BlueMap", href: "/maps", Icon: MapPin },
+ { name: "Espace Publicitaire", href: "/ads", Icon: Megaphone },
+ { name: "Outils", href: "/outils", Icon: Info },
+ { name: "À Propos", href: "/a-propos", Icon: Info },
+];
+
+export default function Navbar() {
+ const { data: session } = useSession();
+ const [open, setOpen] = useState(false);
+ const [scrolled, setScrolled] = useState(false);
+
+ useEffect(() => {
+ const onScroll = () => {
+ setScrolled(window.scrollY > 10);
+ };
+ window.addEventListener("scroll", onScroll);
+ return () => window.removeEventListener("scroll", onScroll);
+ }, []);
+
+ return (
+
+ );
+}
diff --git a/components/OutilsPage.tsx b/components/OutilsPage.tsx
new file mode 100644
index 0000000..f3e0123
--- /dev/null
+++ b/components/OutilsPage.tsx
@@ -0,0 +1,84 @@
+"use client";
+
+import { motion } from "framer-motion";
+import { BookText, ExternalLink, Map, Users, Wrench } from "lucide-react";
+
+const outils = [
+ {
+ label: "Wiki Aystone",
+ href: "https://wiki.aystone.fr/",
+ icon: Map,
+ description: "Wiki du serveur Minecraft Aystone.",
+ },
+ {
+ label: "DynMap",
+ href: "/cobble",
+ icon: Map,
+ description: "Carte dynamique de l'instance Cobble.",
+ },
+ {
+ label: "Liste Colorants Minecraft",
+ href: "/couleurs",
+ icon: BookText,
+ description: "Charte des couleurs Minecraft pour les colorants.",
+ },
+ {
+ label: "Dashboard",
+ href: "/dashboard",
+ icon: BookText,
+ description: "Tableau de bord pour gérer vos projets.",
+ },
+ {
+ label: "Discord d'Aypierre",
+ href: "https://discord.gg/aypierre",
+ icon: Users,
+ description: "Rejoignez la communauté d'aypierre pour discuter avec nous ! :)",
+ },
+ {
+ label: "Espace Publicitaire",
+ href: "/ads",
+ icon: Users,
+ description: "Espace des publicités (Merci Terrone1 pour les pubs :p)",
+ },
+];
+
+export default function OutilsPage() {
+ return (
+
+
+
+
+ Outils & Liens Utiles
+
+
+
+
+ {outils.map((outil, i) => (
+
+
+
+
+ {outil.label}
+
+
+
+ {outil.description}
+
+ ))}
+
+
+ );
+}
diff --git a/components/ProjectsTable.tsx b/components/ProjectsTable.tsx
new file mode 100644
index 0000000..a9a1264
--- /dev/null
+++ b/components/ProjectsTable.tsx
@@ -0,0 +1,241 @@
+"use client";
+
+import { motion } from "framer-motion";
+import {
+ AlignLeft,
+ BadgeCheck,
+ Check,
+ Copy,
+ FileText,
+ Globe,
+ MapPin,
+ Tag,
+ User,
+} from "lucide-react";
+import Image from "next/image";
+import Link from "next/link";
+import { useMemo, useState } from "react";
+
+export type Project = {
+ id?: string;
+ joueur: string;
+ etat: "En cours" | "Terminé" | "Pause";
+ monde: "Overworld" | "Nether" | "End";
+ projet: string;
+ description: string;
+ coords: string;
+ tags: string[];
+};
+
+export default function ProjectTable({
+ data,
+ hidePlayerFilter = false,
+}: {
+ data: Project[];
+ hidePlayerFilter?: boolean;
+}) {
+ const [copied, setCopied] = useState(null);
+ const [search, setSearch] = useState("");
+ const [etat, setEtat] = useState("");
+ const [monde, setMonde] = useState("");
+ const [joueur, setJoueur] = useState("");
+
+ const filtered = useMemo(() => {
+ return data.filter((p) => {
+ const matchesSearch = p.projet.toLowerCase().includes(search.toLowerCase());
+ const matchesEtat = etat ? p.etat === etat : true;
+ const matchesMonde = monde ? p.monde === monde : true;
+ const matchesJoueur = hidePlayerFilter ? true : joueur ? p.joueur === joueur : true;
+ return matchesSearch && matchesEtat && matchesMonde && matchesJoueur;
+ });
+ }, [data, search, etat, monde, joueur, hidePlayerFilter]);
+
+ const joueurs = [...new Set(data.map((p) => p.joueur))];
+ const etats = ["En cours", "Terminé", "Pause"];
+ const mondes = ["Overworld", "Nether", "End"];
+
+ const headers = [
+ { label: "Joueur", icon: User },
+ { label: "État", icon: BadgeCheck },
+ { label: "Monde", icon: Globe },
+ { label: "Projet", icon: FileText },
+ { label: "Description", icon: AlignLeft },
+ { label: "Coordonnées", icon: MapPin },
+ { label: "Tags", icon: Tag },
+ ];
+
+ if (!data.length) {
+ return Aucun projet enregistré pour le moment.
;
+ }
+
+ return (
+
+
+
+ setSearch(e.target.value)}
+ className="rounded-md border border-white/20 bg-white/10 px-3 py-1 text-sm text-white placeholder-white/60 focus:outline-none focus:ring-2 focus:ring-orange-500"
+ />
+ {!hidePlayerFilter && (
+ setJoueur(e.target.value)}
+ className="rounded-md bg-slate-800 text-amber-50 px-3 py-1 text-sm"
+ >
+ Tous les joueurs
+ {joueurs.map((j) => (
+ {j}
+ ))}
+
+ )}
+ setEtat(e.target.value)}
+ className="rounded-md bg-slate-800 text-amber-50 px-3 py-1 text-sm"
+ >
+ Tous les états
+ {etats.map((e) => (
+ {e}
+ ))}
+
+ setMonde(e.target.value)}
+ className="rounded-md bg-slate-800 text-amber-50 px-3 py-1 text-sm"
+ >
+ Tous les mondes
+ {mondes.map((m) => (
+ {m}
+ ))}
+
+
+
+
+
+
+
+ {headers.map(({ label, icon: Icon }) => (
+
+
+
+ {label}
+
+
+ ))}
+
+
+
+ {filtered.map((p, i) => (
+
+
+
+ ((e.target as HTMLImageElement).style.display = "none")}
+ />
+ {hidePlayerFilter ? (
+ {p.joueur}
+ ) : (
+
+ {p.joueur}
+
+ )}
+
+
+
+
+ {p.projet}
+
+
+ {p.description}
+
+
+
+
+
+
{
+ navigator.clipboard.writeText(p.coords);
+ setCopied(i);
+ setTimeout(() => setCopied(null), 1200);
+ }}
+ className="grid h-7 w-7 flex-shrink-0 place-items-center rounded bg-white/10 hover:bg-white/20"
+ >
+ {copied === i ? (
+
+ ) : (
+
+ )}
+
+
+
+
+
+ {p.tags.map((t, idx) => )}
+
+
+
+ ))}
+
+
+
+
+
+ );
+}
+
+function Td({ children }: { children: React.ReactNode }) {
+ return {children} ;
+}
+
+function EtatBadge({ v }: { v: Project["etat"] }) {
+ const cls = v === "En cours"
+ ? "bg-yellow-400/90 text-black"
+ : v === "Terminé"
+ ? "bg-green-600/90"
+ : "bg-red-600/90";
+ return {v} ;
+
+}
+
+function MondeBadge({ v }: { v: Project["monde"] }) {
+ const map = {
+ Overworld: "bg-emerald-700/80",
+ Nether: "bg-red-700/80",
+ End: "bg-violet-800/90",
+ } as const;
+ return {v} ;
+}
+
+function TagBadge({ v }: { v: string }) {
+ const palette: Record = {
+ spawn: "bg-fuchsia-700/90",
+ build: "bg-emerald-700/90",
+ usine: "bg-orange-600/90",
+ };
+ return {v} ;
+}
diff --git a/components/RedstoneParticles.tsx b/components/RedstoneParticles.tsx
new file mode 100644
index 0000000..3a8320d
--- /dev/null
+++ b/components/RedstoneParticles.tsx
@@ -0,0 +1,171 @@
+"use client";
+import { useEffect, useRef } from "react";
+
+interface RedstoneParticlesProps {
+ className?: string;
+ density?: number;
+ maxRadius?: number;
+}
+
+class Star {
+ context: CanvasRenderingContext2D;
+ areaWidth: number;
+ areaHeight: number;
+ position: { x: number; y: number };
+ speed: { x: number; y: number };
+ radius: number;
+ alpha: number;
+ alphaSpeed: number;
+ rgb: string[];
+ selectedColor: number;
+ color: string;
+
+ constructor(args: {
+ context: CanvasRenderingContext2D;
+ areaWidth: number;
+ areaHeight: number;
+ x?: number;
+ y?: number;
+ speedX?: number;
+ speedY?: number;
+ radius: number;
+ alpha?: number;
+ alphaSpeed?: number;
+ }) {
+ this.context = args.context;
+ this.areaWidth = args.areaWidth;
+ this.areaHeight = args.areaHeight;
+ this.position = {
+ x: args.x ?? Math.random() * this.areaWidth,
+ y: args.y ?? Math.random() * this.areaHeight,
+ };
+ this.speed = {
+ x: args.speedX ?? Math.random() * 0.003 - 0.0015,
+ y: args.speedY ?? Math.random() * 0.003 - 0.0015,
+ };
+ this.radius = Math.ceil(Math.random() * args.radius) || 2;
+ this.alpha = args.alpha ?? Math.random() * 0.5 + 0.5;
+ this.alphaSpeed = args.alphaSpeed ?? (Math.random() * 0.04 - 0.02);
+ this.rgb = ["255,0,0", "255,50,50", "200,0,0", "255,80,80"];
+ this.selectedColor = Math.floor(Math.random() * this.rgb.length);
+ this.color = `rgba(${this.rgb[this.selectedColor]},${this.alpha})`;
+ }
+
+ draw() {
+ this.updateCoords();
+ this.updateAlpha();
+ this.context.beginPath();
+ this.context.fillStyle = this.color;
+ this.context.rect(this.position.x, this.position.y, this.radius, this.radius);
+ this.context.fill();
+ this.context.closePath();
+ }
+
+ updateCoords() {
+ this.position.x += this.speed.x;
+ this.position.y -= this.speed.y;
+ if (this.position.x > this.areaWidth + this.radius) this.position.x = 0 - this.radius;
+ if (this.position.y > this.areaHeight + this.radius) this.position.y = 0 - this.radius;
+ if (this.position.x < 0 - this.radius) this.position.x = this.areaWidth + this.radius;
+ if (this.position.y < 0 - this.radius) this.position.y = this.areaHeight + this.radius;
+ }
+
+ updateAlpha() {
+ this.alpha += this.alphaSpeed;
+ if (this.alpha >= 1 || this.alpha <= 0) this.alphaSpeed = -this.alphaSpeed;
+ this.color = `rgba(${this.rgb[this.selectedColor]},${this.alpha})`;
+ }
+}
+
+class Starfield {
+ canvas: HTMLCanvasElement;
+ ctx: CanvasRenderingContext2D;
+ width: number;
+ height: number;
+ stars: Star[];
+ totalStars: number;
+ maxRadius: number;
+
+ constructor(canvas: HTMLCanvasElement, totalStars = 100, maxRadius = 3) {
+ this.canvas = canvas;
+ this.ctx = canvas.getContext("2d")!;
+ this.width = 0;
+ this.height = 0;
+ this.stars = [];
+ this.totalStars = totalStars;
+ this.maxRadius = maxRadius;
+ this.resize();
+ this.setStars();
+ }
+
+ resize() {
+ this.width = this.canvas.clientWidth;
+ this.height = this.canvas.clientHeight;
+ this.canvas.width = this.width * window.devicePixelRatio;
+ this.canvas.height = this.height * window.devicePixelRatio;
+ this.ctx.scale(window.devicePixelRatio, window.devicePixelRatio);
+ }
+
+ setStars() {
+ this.stars = [];
+ for (let i = 0; i < this.totalStars; i++) {
+ this.stars.push(
+ new Star({
+ context: this.ctx,
+ areaWidth: this.width,
+ areaHeight: this.height,
+ radius: this.maxRadius,
+ })
+ );
+ }
+ }
+
+ render() {
+ this.ctx.clearRect(0, 0, this.width, this.height);
+ this.stars.forEach((star) => star.draw());
+ }
+}
+
+export default function RedstoneParticles({ className = "", density = 60, maxRadius = 2 }: RedstoneParticlesProps) {
+ const canvasRef = useRef(null);
+ const starfieldRef = useRef(null);
+ const animationFrameRef = useRef(null);
+
+ useEffect(() => {
+ if (!canvasRef.current) return;
+ starfieldRef.current = new Starfield(canvasRef.current, density, maxRadius);
+
+ const handleResize = () => {
+ starfieldRef.current?.resize();
+ starfieldRef.current?.setStars();
+ };
+ window.addEventListener("resize", handleResize);
+
+ const animate = () => {
+ starfieldRef.current?.render();
+ animationFrameRef.current = requestAnimationFrame(animate);
+ };
+ animate();
+
+ return () => {
+ window.removeEventListener("resize", handleResize);
+ if (animationFrameRef.current) cancelAnimationFrame(animationFrameRef.current);
+ };
+ }, [density, maxRadius]);
+
+ return (
+
+ );
+}
diff --git a/lib/getAds.ts b/lib/getAds.ts
new file mode 100644
index 0000000..5990e1b
--- /dev/null
+++ b/lib/getAds.ts
@@ -0,0 +1,10 @@
+import fs from "node:fs/promises";
+import path from "node:path";
+
+const IMG_EXT = /\.(png|jpe?g|gif|webp|avif|svg)$/i;
+
+export async function getAdFiles(): Promise {
+ const dir = path.join(process.cwd(), "public", "ads");
+ const files = await fs.readdir(dir);
+ return files.filter((f) => IMG_EXT.test(f));
+}
\ No newline at end of file
diff --git a/lib/prisma.ts b/lib/prisma.ts
new file mode 100644
index 0000000..d390dc5
--- /dev/null
+++ b/lib/prisma.ts
@@ -0,0 +1,13 @@
+import { PrismaClient } from "@prisma/client";
+
+const globalForPrisma = globalThis as unknown as {
+ prisma: PrismaClient | undefined;
+};
+
+export const prisma =
+ globalForPrisma.prisma ??
+ new PrismaClient({
+ log: ["error", "warn"],
+ });
+
+if (process.env.NODE_ENV !== "production") globalForPrisma.prisma = prisma;
\ No newline at end of file
diff --git a/lib/validators/project.ts b/lib/validators/project.ts
new file mode 100644
index 0000000..95f3166
--- /dev/null
+++ b/lib/validators/project.ts
@@ -0,0 +1,15 @@
+import { z } from "zod";
+
+export const projectSchema = z.object({
+ id: z.string().uuid(),
+ joueur: z.string(),
+ projet: z.string(),
+ description: z.string(),
+ coords: z.string().nullable(),
+ etat: z.enum(["En cours", "Terminé", "Pause"]),
+ monde: z.enum(["Overworld", "Nether", "End"]),
+ tags: z.array(z.string()),
+ createdAt: z.date().or(z.string().transform((s) => new Date(s))),
+});
+
+export type SafeProject = z.infer;
\ No newline at end of file
diff --git a/middleware.ts b/middleware.ts
new file mode 100644
index 0000000..e2541ae
--- /dev/null
+++ b/middleware.ts
@@ -0,0 +1,23 @@
+import { auth } from "@/auth";
+import { NextResponse } from "next/server";
+
+export default auth((req) => {
+ const { pathname } = req.nextUrl;
+
+ if (pathname.startsWith("/dashboard") && !req.auth) {
+ return Response.redirect(
+ new URL("/api/auth/signin?callbackUrl=/dashboard", req.url)
+ );
+ }
+
+ const res = NextResponse.next();
+
+ res.headers.set("X-Frame-Options", "DENY");
+ res.headers.set("Content-Security-Policy", "frame-ancestors 'none';");
+
+ return res;
+});
+
+export const config = {
+ matcher: ["/((?!_next/static|_next/image|favicon.ico).*)"],
+};
\ No newline at end of file
diff --git a/next.config.ts b/next.config.ts
index e9ffa30..84f6182 100644
--- a/next.config.ts
+++ b/next.config.ts
@@ -1,7 +1,27 @@
import type { NextConfig } from "next";
const nextConfig: NextConfig = {
- /* config options here */
+ images: {
+ remotePatterns: [
+ {
+ protocol: "https",
+ hostname: "cdn.discordapp.com",
+ },
+ {
+ protocol: "https",
+ hostname: "mc-heads.net",
+ },
+ ],
+ },
+ async redirects() {
+ return [
+ {
+ source: "/@:username",
+ destination: "/user/:username",
+ permanent: true,
+ },
+ ];
+ },
};
-export default nextConfig;
+export default nextConfig;
\ No newline at end of file
diff --git a/package-lock.json b/package-lock.json
index 20844bf..beb1a50 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -8,9 +8,21 @@
"name": "aystone",
"version": "0.1.0",
"dependencies": {
+ "@auth/prisma-adapter": "^2.10.0",
+ "@headlessui/react": "^2.2.6",
+ "@prisma/client": "^6.12.0",
+ "@tailwindcss/postcss": "^4.1.11",
+ "auth": "^1.2.3",
+ "framer-motion": "^12.23.9",
+ "lucide-react": "^0.526.0",
"next": "15.4.4",
+ "next-auth": "^5.0.0-beta.29",
+ "postcss": "^8.5.6",
"react": "19.1.0",
- "react-dom": "19.1.0"
+ "react-dom": "19.1.0",
+ "sonner": "^2.0.6",
+ "tailwindcss": "^4.1.11",
+ "zod": "^4.0.10"
},
"devDependencies": {
"@eslint/eslintrc": "^3",
@@ -19,14 +31,80 @@
"@types/react-dom": "^19",
"eslint": "^9",
"eslint-config-next": "15.4.4",
+ "prisma": "^6.12.0",
"typescript": "^5"
}
},
+ "node_modules/@alloc/quick-lru": {
+ "version": "5.2.0",
+ "resolved": "https://registry.npmjs.org/@alloc/quick-lru/-/quick-lru-5.2.0.tgz",
+ "integrity": "sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/@ampproject/remapping": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz",
+ "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@jridgewell/gen-mapping": "^0.3.5",
+ "@jridgewell/trace-mapping": "^0.3.24"
+ },
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/@auth/core": {
+ "version": "0.40.0",
+ "resolved": "https://registry.npmjs.org/@auth/core/-/core-0.40.0.tgz",
+ "integrity": "sha512-n53uJE0RH5SqZ7N1xZoMKekbHfQgjd0sAEyUbE+IYJnmuQkbvuZnXItCU7d+i7Fj8VGOgqvNO7Mw4YfBTlZeQw==",
+ "license": "ISC",
+ "dependencies": {
+ "@panva/hkdf": "^1.2.1",
+ "jose": "^6.0.6",
+ "oauth4webapi": "^3.3.0",
+ "preact": "10.24.3",
+ "preact-render-to-string": "6.5.11"
+ },
+ "peerDependencies": {
+ "@simplewebauthn/browser": "^9.0.1",
+ "@simplewebauthn/server": "^9.0.2",
+ "nodemailer": "^6.8.0"
+ },
+ "peerDependenciesMeta": {
+ "@simplewebauthn/browser": {
+ "optional": true
+ },
+ "@simplewebauthn/server": {
+ "optional": true
+ },
+ "nodemailer": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@auth/prisma-adapter": {
+ "version": "2.10.0",
+ "resolved": "https://registry.npmjs.org/@auth/prisma-adapter/-/prisma-adapter-2.10.0.tgz",
+ "integrity": "sha512-EliOQoTjGK87jWWqnJvlQjbR4PjQZQqtwRwPAe108WwT9ubuuJJIrL68aNnQr4hFESz6P7SEX2bZy+y2yL37Gw==",
+ "license": "ISC",
+ "dependencies": {
+ "@auth/core": "0.40.0"
+ },
+ "peerDependencies": {
+ "@prisma/client": ">=2.26.0 || >=3 || >=4 || >=5 || >=6"
+ }
+ },
"node_modules/@emnapi/core": {
"version": "1.4.5",
"resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.4.5.tgz",
"integrity": "sha512-XsLw1dEOpkSX/WucdqUhPWP7hDxSvZiY+fsUC14h+FtQ2Ifni4znbBt8punRX+Uj2JG/uDb8nEHVKvrVlvdZ5Q==",
- "dev": true,
"license": "MIT",
"optional": true,
"dependencies": {
@@ -48,7 +126,6 @@
"version": "1.0.4",
"resolved": "https://registry.npmjs.org/@emnapi/wasi-threads/-/wasi-threads-1.0.4.tgz",
"integrity": "sha512-PJR+bOmMOPH8AtcTGAyYNiuJ3/Fcoj2XN/gBEWzDIKh254XO+mM9XoXHk5GNEhodxeMznbg7BlRojVbKN+gC6g==",
- "dev": true,
"license": "MIT",
"optional": true,
"dependencies": {
@@ -196,6 +273,79 @@
"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
}
},
+ "node_modules/@floating-ui/core": {
+ "version": "1.7.2",
+ "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.7.2.tgz",
+ "integrity": "sha512-wNB5ooIKHQc+Kui96jE/n69rHFWAVoxn5CAzL1Xdd8FG03cgY3MLO+GF9U3W737fYDSgPWA6MReKhBQBop6Pcw==",
+ "license": "MIT",
+ "dependencies": {
+ "@floating-ui/utils": "^0.2.10"
+ }
+ },
+ "node_modules/@floating-ui/dom": {
+ "version": "1.7.2",
+ "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.7.2.tgz",
+ "integrity": "sha512-7cfaOQuCS27HD7DX+6ib2OrnW+b4ZBwDNnCcT0uTyidcmyWb03FnQqJybDBoCnpdxwBSfA94UAYlRCt7mV+TbA==",
+ "license": "MIT",
+ "dependencies": {
+ "@floating-ui/core": "^1.7.2",
+ "@floating-ui/utils": "^0.2.10"
+ }
+ },
+ "node_modules/@floating-ui/react": {
+ "version": "0.26.28",
+ "resolved": "https://registry.npmjs.org/@floating-ui/react/-/react-0.26.28.tgz",
+ "integrity": "sha512-yORQuuAtVpiRjpMhdc0wJj06b9JFjrYF4qp96j++v2NBpbi6SEGF7donUJ3TMieerQ6qVkAv1tgr7L4r5roTqw==",
+ "license": "MIT",
+ "dependencies": {
+ "@floating-ui/react-dom": "^2.1.2",
+ "@floating-ui/utils": "^0.2.8",
+ "tabbable": "^6.0.0"
+ },
+ "peerDependencies": {
+ "react": ">=16.8.0",
+ "react-dom": ">=16.8.0"
+ }
+ },
+ "node_modules/@floating-ui/react-dom": {
+ "version": "2.1.4",
+ "resolved": "https://registry.npmjs.org/@floating-ui/react-dom/-/react-dom-2.1.4.tgz",
+ "integrity": "sha512-JbbpPhp38UmXDDAu60RJmbeme37Jbgsm7NrHGgzYYFKmblzRUh6Pa641dII6LsjwF4XlScDrde2UAzDo/b9KPw==",
+ "license": "MIT",
+ "dependencies": {
+ "@floating-ui/dom": "^1.7.2"
+ },
+ "peerDependencies": {
+ "react": ">=16.8.0",
+ "react-dom": ">=16.8.0"
+ }
+ },
+ "node_modules/@floating-ui/utils": {
+ "version": "0.2.10",
+ "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.2.10.tgz",
+ "integrity": "sha512-aGTxbpbg8/b5JfU1HXSrbH3wXZuLPJcNEcZQFMxLs3oSzgtVu6nFPkbbGGUvBcUjKV2YyB9Wxxabo+HEH9tcRQ==",
+ "license": "MIT"
+ },
+ "node_modules/@headlessui/react": {
+ "version": "2.2.6",
+ "resolved": "https://registry.npmjs.org/@headlessui/react/-/react-2.2.6.tgz",
+ "integrity": "sha512-gN5CT8Kf4IWwL04GQOjZ/ZnHMFoeFHZmVSFoDKeTmbtmy9oFqQqJMthdBiO3Pl5LXk2w03fGFLpQV6EW84vjjQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@floating-ui/react": "^0.26.16",
+ "@react-aria/focus": "^3.20.2",
+ "@react-aria/interactions": "^3.25.0",
+ "@tanstack/react-virtual": "^3.13.9",
+ "use-sync-external-store": "^1.5.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "peerDependencies": {
+ "react": "^18 || ^19 || ^19.0.0-rc",
+ "react-dom": "^18 || ^19 || ^19.0.0-rc"
+ }
+ },
"node_modules/@humanfs/core": {
"version": "0.19.1",
"resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.1.tgz",
@@ -680,11 +830,277 @@
"url": "https://opencollective.com/libvips"
}
},
+ "node_modules/@inkeep/ai-api": {
+ "version": "0.8.0",
+ "resolved": "https://registry.npmjs.org/@inkeep/ai-api/-/ai-api-0.8.0.tgz",
+ "integrity": "sha512-mMLhLxIj23ta2XlZt7Rz6Q5z1tcDBoeI1SkO/9jMRgL/tfu+t+I4DkXm0FS25AoBjepg4iSzXyZg867YGmjCmA==",
+ "peerDependencies": {
+ "zod": ">= 3"
+ }
+ },
+ "node_modules/@inquirer/checkbox": {
+ "version": "2.5.0",
+ "resolved": "https://registry.npmjs.org/@inquirer/checkbox/-/checkbox-2.5.0.tgz",
+ "integrity": "sha512-sMgdETOfi2dUHT8r7TT1BTKOwNvdDGFDXYWtQ2J69SvlYNntk9I/gJe7r5yvMwwsuKnYbuRs3pNhx4tgNck5aA==",
+ "license": "MIT",
+ "dependencies": {
+ "@inquirer/core": "^9.1.0",
+ "@inquirer/figures": "^1.0.5",
+ "@inquirer/type": "^1.5.3",
+ "ansi-escapes": "^4.3.2",
+ "yoctocolors-cjs": "^2.1.2"
+ },
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@inquirer/confirm": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/@inquirer/confirm/-/confirm-3.2.0.tgz",
+ "integrity": "sha512-oOIwPs0Dvq5220Z8lGL/6LHRTEr9TgLHmiI99Rj1PJ1p1czTys+olrgBqZk4E2qC0YTzeHprxSQmoHioVdJ7Lw==",
+ "license": "MIT",
+ "dependencies": {
+ "@inquirer/core": "^9.1.0",
+ "@inquirer/type": "^1.5.3"
+ },
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@inquirer/core": {
+ "version": "9.2.1",
+ "resolved": "https://registry.npmjs.org/@inquirer/core/-/core-9.2.1.tgz",
+ "integrity": "sha512-F2VBt7W/mwqEU4bL0RnHNZmC/OxzNx9cOYxHqnXX3MP6ruYvZUZAW9imgN9+h/uBT/oP8Gh888J2OZSbjSeWcg==",
+ "license": "MIT",
+ "dependencies": {
+ "@inquirer/figures": "^1.0.6",
+ "@inquirer/type": "^2.0.0",
+ "@types/mute-stream": "^0.0.4",
+ "@types/node": "^22.5.5",
+ "@types/wrap-ansi": "^3.0.0",
+ "ansi-escapes": "^4.3.2",
+ "cli-width": "^4.1.0",
+ "mute-stream": "^1.0.0",
+ "signal-exit": "^4.1.0",
+ "strip-ansi": "^6.0.1",
+ "wrap-ansi": "^6.2.0",
+ "yoctocolors-cjs": "^2.1.2"
+ },
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@inquirer/core/node_modules/@inquirer/type": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/@inquirer/type/-/type-2.0.0.tgz",
+ "integrity": "sha512-XvJRx+2KR3YXyYtPUUy+qd9i7p+GO9Ko6VIIpWlBrpWwXDv8WLFeHTxz35CfQFUiBMLXlGHhGzys7lqit9gWag==",
+ "license": "MIT",
+ "dependencies": {
+ "mute-stream": "^1.0.0"
+ },
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@inquirer/core/node_modules/@types/node": {
+ "version": "22.16.5",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-22.16.5.tgz",
+ "integrity": "sha512-bJFoMATwIGaxxx8VJPeM8TonI8t579oRvgAuT8zFugJsJZgzqv0Fu8Mhp68iecjzG7cnN3mO2dJQ5uUM2EFrgQ==",
+ "license": "MIT",
+ "dependencies": {
+ "undici-types": "~6.21.0"
+ }
+ },
+ "node_modules/@inquirer/editor": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/@inquirer/editor/-/editor-2.2.0.tgz",
+ "integrity": "sha512-9KHOpJ+dIL5SZli8lJ6xdaYLPPzB8xB9GZItg39MBybzhxA16vxmszmQFrRwbOA918WA2rvu8xhDEg/p6LXKbw==",
+ "license": "MIT",
+ "dependencies": {
+ "@inquirer/core": "^9.1.0",
+ "@inquirer/type": "^1.5.3",
+ "external-editor": "^3.1.0"
+ },
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@inquirer/expand": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/@inquirer/expand/-/expand-2.3.0.tgz",
+ "integrity": "sha512-qnJsUcOGCSG1e5DTOErmv2BPQqrtT6uzqn1vI/aYGiPKq+FgslGZmtdnXbhuI7IlT7OByDoEEqdnhUnVR2hhLw==",
+ "license": "MIT",
+ "dependencies": {
+ "@inquirer/core": "^9.1.0",
+ "@inquirer/type": "^1.5.3",
+ "yoctocolors-cjs": "^2.1.2"
+ },
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@inquirer/figures": {
+ "version": "1.0.13",
+ "resolved": "https://registry.npmjs.org/@inquirer/figures/-/figures-1.0.13.tgz",
+ "integrity": "sha512-lGPVU3yO9ZNqA7vTYz26jny41lE7yoQansmqdMLBEfqaGsmdg7V3W9mK9Pvb5IL4EVZ9GnSDGMO/cJXud5dMaw==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@inquirer/input": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/@inquirer/input/-/input-2.3.0.tgz",
+ "integrity": "sha512-XfnpCStx2xgh1LIRqPXrTNEEByqQWoxsWYzNRSEUxJ5c6EQlhMogJ3vHKu8aXuTacebtaZzMAHwEL0kAflKOBw==",
+ "license": "MIT",
+ "dependencies": {
+ "@inquirer/core": "^9.1.0",
+ "@inquirer/type": "^1.5.3"
+ },
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@inquirer/number": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/@inquirer/number/-/number-1.1.0.tgz",
+ "integrity": "sha512-ilUnia/GZUtfSZy3YEErXLJ2Sljo/mf9fiKc08n18DdwdmDbOzRcTv65H1jjDvlsAuvdFXf4Sa/aL7iw/NanVA==",
+ "license": "MIT",
+ "dependencies": {
+ "@inquirer/core": "^9.1.0",
+ "@inquirer/type": "^1.5.3"
+ },
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@inquirer/password": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/@inquirer/password/-/password-2.2.0.tgz",
+ "integrity": "sha512-5otqIpgsPYIshqhgtEwSspBQE40etouR8VIxzpJkv9i0dVHIpyhiivbkH9/dGiMLdyamT54YRdGJLfl8TFnLHg==",
+ "license": "MIT",
+ "dependencies": {
+ "@inquirer/core": "^9.1.0",
+ "@inquirer/type": "^1.5.3",
+ "ansi-escapes": "^4.3.2"
+ },
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@inquirer/prompts": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/@inquirer/prompts/-/prompts-5.1.0.tgz",
+ "integrity": "sha512-3rEwrBnGT9opMCiA3Lij98kH5E+JuXAVLYKlXnlK1qIWDvx7tIfypF+z1oK6m61HZ5NHGPF3HtjhVga80DR1PA==",
+ "license": "MIT",
+ "dependencies": {
+ "@inquirer/checkbox": "^2.3.8",
+ "@inquirer/confirm": "^3.1.12",
+ "@inquirer/editor": "^2.1.12",
+ "@inquirer/expand": "^2.1.12",
+ "@inquirer/input": "^2.1.12",
+ "@inquirer/number": "^1.0.0",
+ "@inquirer/password": "^2.1.12",
+ "@inquirer/rawlist": "^2.1.12",
+ "@inquirer/select": "^2.3.8"
+ },
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@inquirer/rawlist": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/@inquirer/rawlist/-/rawlist-2.3.0.tgz",
+ "integrity": "sha512-zzfNuINhFF7OLAtGHfhwOW2TlYJyli7lOUoJUXw/uyklcwalV6WRXBXtFIicN8rTRK1XTiPWB4UY+YuW8dsnLQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@inquirer/core": "^9.1.0",
+ "@inquirer/type": "^1.5.3",
+ "yoctocolors-cjs": "^2.1.2"
+ },
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@inquirer/select": {
+ "version": "2.5.0",
+ "resolved": "https://registry.npmjs.org/@inquirer/select/-/select-2.5.0.tgz",
+ "integrity": "sha512-YmDobTItPP3WcEI86GvPo+T2sRHkxxOq/kXmsBjHS5BVXUgvgZ5AfJjkvQvZr03T81NnI3KrrRuMzeuYUQRFOA==",
+ "license": "MIT",
+ "dependencies": {
+ "@inquirer/core": "^9.1.0",
+ "@inquirer/figures": "^1.0.5",
+ "@inquirer/type": "^1.5.3",
+ "ansi-escapes": "^4.3.2",
+ "yoctocolors-cjs": "^2.1.2"
+ },
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@inquirer/type": {
+ "version": "1.5.5",
+ "resolved": "https://registry.npmjs.org/@inquirer/type/-/type-1.5.5.tgz",
+ "integrity": "sha512-MzICLu4yS7V8AA61sANROZ9vT1H3ooca5dSmI1FjZkzq7o/koMsRfQSzRtFo+F3Ao4Sf1C0bpLKejpKB/+j6MA==",
+ "license": "MIT",
+ "dependencies": {
+ "mute-stream": "^1.0.0"
+ },
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@isaacs/fs-minipass": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/@isaacs/fs-minipass/-/fs-minipass-4.0.1.tgz",
+ "integrity": "sha512-wgm9Ehl2jpeqP3zw/7mo3kRHFp5MEDhqAdwy1fTGkHAwnkGOVsgpvQhL8B5n1qlb01jV3n/bI0ZfZp5lWA1k4w==",
+ "license": "ISC",
+ "dependencies": {
+ "minipass": "^7.0.4"
+ },
+ "engines": {
+ "node": ">=18.0.0"
+ }
+ },
+ "node_modules/@jridgewell/gen-mapping": {
+ "version": "0.3.12",
+ "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.12.tgz",
+ "integrity": "sha512-OuLGC46TjB5BbN1dH8JULVVZY4WTdkF7tV9Ys6wLL1rubZnCMstOhNHueU5bLCrnRuDhKPDM4g6sw4Bel5Gzqg==",
+ "license": "MIT",
+ "dependencies": {
+ "@jridgewell/sourcemap-codec": "^1.5.0",
+ "@jridgewell/trace-mapping": "^0.3.24"
+ }
+ },
+ "node_modules/@jridgewell/resolve-uri": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz",
+ "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/@jridgewell/sourcemap-codec": {
+ "version": "1.5.4",
+ "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.4.tgz",
+ "integrity": "sha512-VT2+G1VQs/9oz078bLrYbecdZKs912zQlkelYpuf+SXF+QvZDYJlbx/LSx+meSAwdDFnF8FVXW92AVjjkVmgFw==",
+ "license": "MIT"
+ },
+ "node_modules/@jridgewell/trace-mapping": {
+ "version": "0.3.29",
+ "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.29.tgz",
+ "integrity": "sha512-uw6guiW/gcAGPDhLmd77/6lW8QLeiV5RUTsAX46Db6oLhGaVj4lhnPwb184s1bkc8kdVg/+h988dro8GRDpmYQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@jridgewell/resolve-uri": "^3.1.0",
+ "@jridgewell/sourcemap-codec": "^1.4.14"
+ }
+ },
"node_modules/@napi-rs/wasm-runtime": {
"version": "0.2.12",
"resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-0.2.12.tgz",
"integrity": "sha512-ZVWUcfwY4E/yPitQJl481FjFo3K22D6qF0DuFH6Y/nbnE11GY5uguDxZMGXPQ8WQ0128MXQD7TnfHyK4oWoIJQ==",
- "dev": true,
"license": "MIT",
"optional": true,
"dependencies": {
@@ -885,6 +1301,204 @@
"node": ">=12.4.0"
}
},
+ "node_modules/@panva/hkdf": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/@panva/hkdf/-/hkdf-1.2.1.tgz",
+ "integrity": "sha512-6oclG6Y3PiDFcoyk8srjLfVKyMfVCKJ27JwNPViuXziFpmdz+MZnZN/aKY0JGXgYuO/VghU0jcOAZgWXZ1Dmrw==",
+ "license": "MIT",
+ "funding": {
+ "url": "https://github.com/sponsors/panva"
+ }
+ },
+ "node_modules/@prisma/client": {
+ "version": "6.12.0",
+ "resolved": "https://registry.npmjs.org/@prisma/client/-/client-6.12.0.tgz",
+ "integrity": "sha512-wn98bJ3Cj6edlF4jjpgXwbnQIo/fQLqqQHPk2POrZPxTlhY3+n90SSIF3LMRVa8VzRFC/Gec3YKJRxRu+AIGVA==",
+ "hasInstallScript": true,
+ "license": "Apache-2.0",
+ "engines": {
+ "node": ">=18.18"
+ },
+ "peerDependencies": {
+ "prisma": "*",
+ "typescript": ">=5.1.0"
+ },
+ "peerDependenciesMeta": {
+ "prisma": {
+ "optional": true
+ },
+ "typescript": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@prisma/config": {
+ "version": "6.12.0",
+ "resolved": "https://registry.npmjs.org/@prisma/config/-/config-6.12.0.tgz",
+ "integrity": "sha512-HovZWzhWEMedHxmjefQBRZa40P81N7/+74khKFz9e1AFjakcIQdXgMWKgt20HaACzY+d1LRBC+L4tiz71t9fkg==",
+ "devOptional": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "jiti": "2.4.2"
+ }
+ },
+ "node_modules/@prisma/config/node_modules/jiti": {
+ "version": "2.4.2",
+ "resolved": "https://registry.npmjs.org/jiti/-/jiti-2.4.2.tgz",
+ "integrity": "sha512-rg9zJN+G4n2nfJl5MW3BMygZX56zKPNVEYYqq7adpmMh4Jn2QNEwhvQlFy6jPVdcod7txZtKHWnyZiA3a0zP7A==",
+ "devOptional": true,
+ "license": "MIT",
+ "bin": {
+ "jiti": "lib/jiti-cli.mjs"
+ }
+ },
+ "node_modules/@prisma/debug": {
+ "version": "6.12.0",
+ "resolved": "https://registry.npmjs.org/@prisma/debug/-/debug-6.12.0.tgz",
+ "integrity": "sha512-plbz6z72orcqr0eeio7zgUrZj5EudZUpAeWkFTA/DDdXEj28YHDXuiakvR6S7sD6tZi+jiwQEJAPeV6J6m/tEQ==",
+ "devOptional": true,
+ "license": "Apache-2.0"
+ },
+ "node_modules/@prisma/engines": {
+ "version": "6.12.0",
+ "resolved": "https://registry.npmjs.org/@prisma/engines/-/engines-6.12.0.tgz",
+ "integrity": "sha512-4BRZZUaAuB4p0XhTauxelvFs7IllhPmNLvmla0bO1nkECs8n/o1pUvAVbQ/VOrZR5DnF4HED0PrGai+rIOVePA==",
+ "devOptional": true,
+ "hasInstallScript": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@prisma/debug": "6.12.0",
+ "@prisma/engines-version": "6.12.0-15.8047c96bbd92db98a2abc7c9323ce77c02c89dbc",
+ "@prisma/fetch-engine": "6.12.0",
+ "@prisma/get-platform": "6.12.0"
+ }
+ },
+ "node_modules/@prisma/engines-version": {
+ "version": "6.12.0-15.8047c96bbd92db98a2abc7c9323ce77c02c89dbc",
+ "resolved": "https://registry.npmjs.org/@prisma/engines-version/-/engines-version-6.12.0-15.8047c96bbd92db98a2abc7c9323ce77c02c89dbc.tgz",
+ "integrity": "sha512-70vhecxBJlRr06VfahDzk9ow4k1HIaSfVUT3X0/kZoHCMl9zbabut4gEXAyzJZxaCGi5igAA7SyyfBI//mmkbQ==",
+ "devOptional": true,
+ "license": "Apache-2.0"
+ },
+ "node_modules/@prisma/fetch-engine": {
+ "version": "6.12.0",
+ "resolved": "https://registry.npmjs.org/@prisma/fetch-engine/-/fetch-engine-6.12.0.tgz",
+ "integrity": "sha512-EamoiwrK46rpWaEbLX9aqKDPOd8IyLnZAkiYXFNuq0YsU0Z8K09/rH8S7feOWAVJ3xzeSgcEJtBlVDrajM9Sag==",
+ "devOptional": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@prisma/debug": "6.12.0",
+ "@prisma/engines-version": "6.12.0-15.8047c96bbd92db98a2abc7c9323ce77c02c89dbc",
+ "@prisma/get-platform": "6.12.0"
+ }
+ },
+ "node_modules/@prisma/get-platform": {
+ "version": "6.12.0",
+ "resolved": "https://registry.npmjs.org/@prisma/get-platform/-/get-platform-6.12.0.tgz",
+ "integrity": "sha512-nRerTGhTlgyvcBlyWgt8OLNIV7QgJS2XYXMJD1hysorMCuLAjuDDuoxmVt7C2nLxbuxbWPp7OuFRHC23HqD9dA==",
+ "devOptional": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@prisma/debug": "6.12.0"
+ }
+ },
+ "node_modules/@react-aria/focus": {
+ "version": "3.21.0",
+ "resolved": "https://registry.npmjs.org/@react-aria/focus/-/focus-3.21.0.tgz",
+ "integrity": "sha512-7NEGtTPsBy52EZ/ToVKCu0HSelE3kq9qeis+2eEq90XSuJOMaDHUQrA7RC2Y89tlEwQB31bud/kKRi9Qme1dkA==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@react-aria/interactions": "^3.25.4",
+ "@react-aria/utils": "^3.30.0",
+ "@react-types/shared": "^3.31.0",
+ "@swc/helpers": "^0.5.0",
+ "clsx": "^2.0.0"
+ },
+ "peerDependencies": {
+ "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1",
+ "react-dom": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1"
+ }
+ },
+ "node_modules/@react-aria/interactions": {
+ "version": "3.25.4",
+ "resolved": "https://registry.npmjs.org/@react-aria/interactions/-/interactions-3.25.4.tgz",
+ "integrity": "sha512-HBQMxgUPHrW8V63u9uGgBymkMfj6vdWbB0GgUJY49K9mBKMsypcHeWkWM6+bF7kxRO728/IK8bWDV6whDbqjHg==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@react-aria/ssr": "^3.9.10",
+ "@react-aria/utils": "^3.30.0",
+ "@react-stately/flags": "^3.1.2",
+ "@react-types/shared": "^3.31.0",
+ "@swc/helpers": "^0.5.0"
+ },
+ "peerDependencies": {
+ "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1",
+ "react-dom": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1"
+ }
+ },
+ "node_modules/@react-aria/ssr": {
+ "version": "3.9.10",
+ "resolved": "https://registry.npmjs.org/@react-aria/ssr/-/ssr-3.9.10.tgz",
+ "integrity": "sha512-hvTm77Pf+pMBhuBm760Li0BVIO38jv1IBws1xFm1NoL26PU+fe+FMW5+VZWyANR6nYL65joaJKZqOdTQMkO9IQ==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@swc/helpers": "^0.5.0"
+ },
+ "engines": {
+ "node": ">= 12"
+ },
+ "peerDependencies": {
+ "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1"
+ }
+ },
+ "node_modules/@react-aria/utils": {
+ "version": "3.30.0",
+ "resolved": "https://registry.npmjs.org/@react-aria/utils/-/utils-3.30.0.tgz",
+ "integrity": "sha512-ydA6y5G1+gbem3Va2nczj/0G0W7/jUVo/cbN10WA5IizzWIwMP5qhFr7macgbKfHMkZ+YZC3oXnt2NNre5odKw==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@react-aria/ssr": "^3.9.10",
+ "@react-stately/flags": "^3.1.2",
+ "@react-stately/utils": "^3.10.8",
+ "@react-types/shared": "^3.31.0",
+ "@swc/helpers": "^0.5.0",
+ "clsx": "^2.0.0"
+ },
+ "peerDependencies": {
+ "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1",
+ "react-dom": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1"
+ }
+ },
+ "node_modules/@react-stately/flags": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/@react-stately/flags/-/flags-3.1.2.tgz",
+ "integrity": "sha512-2HjFcZx1MyQXoPqcBGALwWWmgFVUk2TuKVIQxCbRq7fPyWXIl6VHcakCLurdtYC2Iks7zizvz0Idv48MQ38DWg==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@swc/helpers": "^0.5.0"
+ }
+ },
+ "node_modules/@react-stately/utils": {
+ "version": "3.10.8",
+ "resolved": "https://registry.npmjs.org/@react-stately/utils/-/utils-3.10.8.tgz",
+ "integrity": "sha512-SN3/h7SzRsusVQjQ4v10LaVsDc81jyyR0DD5HnsQitm/I5WDpaSr2nRHtyloPFU48jlql1XX/S04T2DLQM7Y3g==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@swc/helpers": "^0.5.0"
+ },
+ "peerDependencies": {
+ "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1"
+ }
+ },
+ "node_modules/@react-types/shared": {
+ "version": "3.31.0",
+ "resolved": "https://registry.npmjs.org/@react-types/shared/-/shared-3.31.0.tgz",
+ "integrity": "sha512-ua5U6V66gDcbLZe4P2QeyNgPp4YWD1ymGA6j3n+s8CGExtrCPe64v+g4mvpT8Bnb985R96e4zFT61+m0YCwqMg==",
+ "license": "Apache-2.0",
+ "peerDependencies": {
+ "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1"
+ }
+ },
"node_modules/@rtsao/scc": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/@rtsao/scc/-/scc-1.1.0.tgz",
@@ -908,11 +1522,298 @@
"tslib": "^2.8.0"
}
},
+ "node_modules/@tailwindcss/node": {
+ "version": "4.1.11",
+ "resolved": "https://registry.npmjs.org/@tailwindcss/node/-/node-4.1.11.tgz",
+ "integrity": "sha512-yzhzuGRmv5QyU9qLNg4GTlYI6STedBWRE7NjxP45CsFYYq9taI0zJXZBMqIC/c8fViNLhmrbpSFS57EoxUmD6Q==",
+ "license": "MIT",
+ "dependencies": {
+ "@ampproject/remapping": "^2.3.0",
+ "enhanced-resolve": "^5.18.1",
+ "jiti": "^2.4.2",
+ "lightningcss": "1.30.1",
+ "magic-string": "^0.30.17",
+ "source-map-js": "^1.2.1",
+ "tailwindcss": "4.1.11"
+ }
+ },
+ "node_modules/@tailwindcss/oxide": {
+ "version": "4.1.11",
+ "resolved": "https://registry.npmjs.org/@tailwindcss/oxide/-/oxide-4.1.11.tgz",
+ "integrity": "sha512-Q69XzrtAhuyfHo+5/HMgr1lAiPP/G40OMFAnws7xcFEYqcypZmdW8eGXaOUIeOl1dzPJBPENXgbjsOyhg2nkrg==",
+ "hasInstallScript": true,
+ "license": "MIT",
+ "dependencies": {
+ "detect-libc": "^2.0.4",
+ "tar": "^7.4.3"
+ },
+ "engines": {
+ "node": ">= 10"
+ },
+ "optionalDependencies": {
+ "@tailwindcss/oxide-android-arm64": "4.1.11",
+ "@tailwindcss/oxide-darwin-arm64": "4.1.11",
+ "@tailwindcss/oxide-darwin-x64": "4.1.11",
+ "@tailwindcss/oxide-freebsd-x64": "4.1.11",
+ "@tailwindcss/oxide-linux-arm-gnueabihf": "4.1.11",
+ "@tailwindcss/oxide-linux-arm64-gnu": "4.1.11",
+ "@tailwindcss/oxide-linux-arm64-musl": "4.1.11",
+ "@tailwindcss/oxide-linux-x64-gnu": "4.1.11",
+ "@tailwindcss/oxide-linux-x64-musl": "4.1.11",
+ "@tailwindcss/oxide-wasm32-wasi": "4.1.11",
+ "@tailwindcss/oxide-win32-arm64-msvc": "4.1.11",
+ "@tailwindcss/oxide-win32-x64-msvc": "4.1.11"
+ }
+ },
+ "node_modules/@tailwindcss/oxide-android-arm64": {
+ "version": "4.1.11",
+ "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-android-arm64/-/oxide-android-arm64-4.1.11.tgz",
+ "integrity": "sha512-3IfFuATVRUMZZprEIx9OGDjG3Ou3jG4xQzNTvjDoKmU9JdmoCohQJ83MYd0GPnQIu89YoJqvMM0G3uqLRFtetg==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "android"
+ ],
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/@tailwindcss/oxide-darwin-arm64": {
+ "version": "4.1.11",
+ "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-arm64/-/oxide-darwin-arm64-4.1.11.tgz",
+ "integrity": "sha512-ESgStEOEsyg8J5YcMb1xl8WFOXfeBmrhAwGsFxxB2CxY9evy63+AtpbDLAyRkJnxLy2WsD1qF13E97uQyP1lfQ==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/@tailwindcss/oxide-darwin-x64": {
+ "version": "4.1.11",
+ "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-x64/-/oxide-darwin-x64-4.1.11.tgz",
+ "integrity": "sha512-EgnK8kRchgmgzG6jE10UQNaH9Mwi2n+yw1jWmof9Vyg2lpKNX2ioe7CJdf9M5f8V9uaQxInenZkOxnTVL3fhAw==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/@tailwindcss/oxide-freebsd-x64": {
+ "version": "4.1.11",
+ "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-freebsd-x64/-/oxide-freebsd-x64-4.1.11.tgz",
+ "integrity": "sha512-xdqKtbpHs7pQhIKmqVpxStnY1skuNh4CtbcyOHeX1YBE0hArj2romsFGb6yUmzkq/6M24nkxDqU8GYrKrz+UcA==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "freebsd"
+ ],
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/@tailwindcss/oxide-linux-arm-gnueabihf": {
+ "version": "4.1.11",
+ "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm-gnueabihf/-/oxide-linux-arm-gnueabihf-4.1.11.tgz",
+ "integrity": "sha512-ryHQK2eyDYYMwB5wZL46uoxz2zzDZsFBwfjssgB7pzytAeCCa6glsiJGjhTEddq/4OsIjsLNMAiMlHNYnkEEeg==",
+ "cpu": [
+ "arm"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/@tailwindcss/oxide-linux-arm64-gnu": {
+ "version": "4.1.11",
+ "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-gnu/-/oxide-linux-arm64-gnu-4.1.11.tgz",
+ "integrity": "sha512-mYwqheq4BXF83j/w75ewkPJmPZIqqP1nhoghS9D57CLjsh3Nfq0m4ftTotRYtGnZd3eCztgbSPJ9QhfC91gDZQ==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/@tailwindcss/oxide-linux-arm64-musl": {
+ "version": "4.1.11",
+ "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-musl/-/oxide-linux-arm64-musl-4.1.11.tgz",
+ "integrity": "sha512-m/NVRFNGlEHJrNVk3O6I9ggVuNjXHIPoD6bqay/pubtYC9QIdAMpS+cswZQPBLvVvEF6GtSNONbDkZrjWZXYNQ==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/@tailwindcss/oxide-linux-x64-gnu": {
+ "version": "4.1.11",
+ "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-gnu/-/oxide-linux-x64-gnu-4.1.11.tgz",
+ "integrity": "sha512-YW6sblI7xukSD2TdbbaeQVDysIm/UPJtObHJHKxDEcW2exAtY47j52f8jZXkqE1krdnkhCMGqP3dbniu1Te2Fg==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/@tailwindcss/oxide-linux-x64-musl": {
+ "version": "4.1.11",
+ "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-musl/-/oxide-linux-x64-musl-4.1.11.tgz",
+ "integrity": "sha512-e3C/RRhGunWYNC3aSF7exsQkdXzQ/M+aYuZHKnw4U7KQwTJotnWsGOIVih0s2qQzmEzOFIJ3+xt7iq67K/p56Q==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/@tailwindcss/oxide-wasm32-wasi": {
+ "version": "4.1.11",
+ "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-wasm32-wasi/-/oxide-wasm32-wasi-4.1.11.tgz",
+ "integrity": "sha512-Xo1+/GU0JEN/C/dvcammKHzeM6NqKovG+6921MR6oadee5XPBaKOumrJCXvopJ/Qb5TH7LX/UAywbqrP4lax0g==",
+ "bundleDependencies": [
+ "@napi-rs/wasm-runtime",
+ "@emnapi/core",
+ "@emnapi/runtime",
+ "@tybys/wasm-util",
+ "@emnapi/wasi-threads",
+ "tslib"
+ ],
+ "cpu": [
+ "wasm32"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "@emnapi/core": "^1.4.3",
+ "@emnapi/runtime": "^1.4.3",
+ "@emnapi/wasi-threads": "^1.0.2",
+ "@napi-rs/wasm-runtime": "^0.2.11",
+ "@tybys/wasm-util": "^0.9.0",
+ "tslib": "^2.8.0"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ }
+ },
+ "node_modules/@tailwindcss/oxide-win32-arm64-msvc": {
+ "version": "4.1.11",
+ "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-arm64-msvc/-/oxide-win32-arm64-msvc-4.1.11.tgz",
+ "integrity": "sha512-UgKYx5PwEKrac3GPNPf6HVMNhUIGuUh4wlDFR2jYYdkX6pL/rn73zTq/4pzUm8fOjAn5L8zDeHp9iXmUGOXZ+w==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/@tailwindcss/oxide-win32-x64-msvc": {
+ "version": "4.1.11",
+ "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-x64-msvc/-/oxide-win32-x64-msvc-4.1.11.tgz",
+ "integrity": "sha512-YfHoggn1j0LK7wR82TOucWc5LDCguHnoS879idHekmmiR7g9HUtMw9MI0NHatS28u/Xlkfi9w5RJWgz2Dl+5Qg==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/@tailwindcss/postcss": {
+ "version": "4.1.11",
+ "resolved": "https://registry.npmjs.org/@tailwindcss/postcss/-/postcss-4.1.11.tgz",
+ "integrity": "sha512-q/EAIIpF6WpLhKEuQSEVMZNMIY8KhWoAemZ9eylNAih9jxMGAYPPWBn3I9QL/2jZ+e7OEz/tZkX5HwbBR4HohA==",
+ "license": "MIT",
+ "dependencies": {
+ "@alloc/quick-lru": "^5.2.0",
+ "@tailwindcss/node": "4.1.11",
+ "@tailwindcss/oxide": "4.1.11",
+ "postcss": "^8.4.41",
+ "tailwindcss": "4.1.11"
+ }
+ },
+ "node_modules/@tanstack/react-virtual": {
+ "version": "3.13.12",
+ "resolved": "https://registry.npmjs.org/@tanstack/react-virtual/-/react-virtual-3.13.12.tgz",
+ "integrity": "sha512-Gd13QdxPSukP8ZrkbgS2RwoZseTTbQPLnQEn7HY/rqtM+8Zt95f7xKC7N0EsKs7aoz0WzZ+fditZux+F8EzYxA==",
+ "license": "MIT",
+ "dependencies": {
+ "@tanstack/virtual-core": "3.13.12"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/tannerlinsley"
+ },
+ "peerDependencies": {
+ "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0",
+ "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0"
+ }
+ },
+ "node_modules/@tanstack/virtual-core": {
+ "version": "3.13.12",
+ "resolved": "https://registry.npmjs.org/@tanstack/virtual-core/-/virtual-core-3.13.12.tgz",
+ "integrity": "sha512-1YBOJfRHV4sXUmWsFSf5rQor4Ss82G8dQWLRbnk3GA4jeP8hQt1hxXh0tmflpC0dz3VgEv/1+qwPyLeWkQuPFA==",
+ "license": "MIT",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/tannerlinsley"
+ }
+ },
"node_modules/@tybys/wasm-util": {
"version": "0.10.0",
"resolved": "https://registry.npmjs.org/@tybys/wasm-util/-/wasm-util-0.10.0.tgz",
"integrity": "sha512-VyyPYFlOMNylG45GoAe0xDoLwWuowvf92F9kySqzYh8vmYm7D2u4iUJKa1tOUpS70Ku13ASrOkS4ScXFsTaCNQ==",
- "dev": true,
"license": "MIT",
"optional": true,
"dependencies": {
@@ -940,11 +1841,19 @@
"dev": true,
"license": "MIT"
},
+ "node_modules/@types/mute-stream": {
+ "version": "0.0.4",
+ "resolved": "https://registry.npmjs.org/@types/mute-stream/-/mute-stream-0.0.4.tgz",
+ "integrity": "sha512-CPM9nzrCPPJHQNA9keH9CVkVI+WR5kMa+7XEs5jcGQ0VoAGnLv242w8lIVgwAEfmE4oufJRaTc9PNLQl0ioAow==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/node": "*"
+ }
+ },
"node_modules/@types/node": {
"version": "20.19.9",
"resolved": "https://registry.npmjs.org/@types/node/-/node-20.19.9.tgz",
"integrity": "sha512-cuVNgarYWZqxRJDQHEB58GEONhOK79QVR/qYx4S7kcUObQvUwvFnYxJuuHUKm2aieN9X3yZB4LZsuYNU1Qphsw==",
- "dev": true,
"license": "MIT",
"dependencies": {
"undici-types": "~6.21.0"
@@ -970,6 +1879,12 @@
"@types/react": "^19.0.0"
}
},
+ "node_modules/@types/wrap-ansi": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/@types/wrap-ansi/-/wrap-ansi-3.0.0.tgz",
+ "integrity": "sha512-ltIpx+kM7g/MLRZfkbL7EsCEjfzCcScLpkg37eXEtx5kmrAKBkTJwd1GIAjDSL8wTpM6Hzn5YO4pSb91BEwu1g==",
+ "license": "MIT"
+ },
"node_modules/@typescript-eslint/eslint-plugin": {
"version": "8.38.0",
"resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.38.0.tgz",
@@ -1567,11 +2482,34 @@
"url": "https://github.com/sponsors/epoberezkin"
}
},
+ "node_modules/ansi-escapes": {
+ "version": "4.3.2",
+ "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz",
+ "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==",
+ "license": "MIT",
+ "dependencies": {
+ "type-fest": "^0.21.3"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/ansi-regex": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
+ "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
"node_modules/ansi-styles": {
"version": "4.3.0",
"resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
"integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
- "dev": true,
"license": "MIT",
"dependencies": {
"color-convert": "^2.0.1"
@@ -1777,6 +2715,38 @@
"node": ">= 0.4"
}
},
+ "node_modules/auth": {
+ "version": "1.2.3",
+ "resolved": "https://registry.npmjs.org/auth/-/auth-1.2.3.tgz",
+ "integrity": "sha512-tVnufDZrqh7axvCfgl29y1DuJYaQuidm64VdsxfAlPX7k+i9+TlXbB6hczPSUyKr/7B+X2BdwUFjGpgSbeG3Tw==",
+ "license": "MIT",
+ "dependencies": {
+ "@inkeep/ai-api": "0.8.0",
+ "@inquirer/prompts": "5.1.0",
+ "clipboardy": "4.0.0",
+ "commander": "12.1.0",
+ "open": "10.1.0",
+ "ora": "8.1.0",
+ "prompts": "2.4.2",
+ "yoctocolors": "2.1.1",
+ "zod": "3.23.8"
+ },
+ "bin": {
+ "auth": "index.js"
+ },
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/auth/node_modules/zod": {
+ "version": "3.23.8",
+ "resolved": "https://registry.npmjs.org/zod/-/zod-3.23.8.tgz",
+ "integrity": "sha512-XBx9AXhXktjUqnepgTiE5flcKIYWi/rme0Eaj+5Y0lftuGBq+jyRu/md4WnuxqgP1ubdpNCsYEYPxrzVHD8d6g==",
+ "license": "MIT",
+ "funding": {
+ "url": "https://github.com/sponsors/colinhacks"
+ }
+ },
"node_modules/available-typed-arrays": {
"version": "1.0.7",
"resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz",
@@ -1844,6 +2814,21 @@
"node": ">=8"
}
},
+ "node_modules/bundle-name": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/bundle-name/-/bundle-name-4.1.0.tgz",
+ "integrity": "sha512-tjwM5exMg6BGRI+kNmTntNsvdZS1X8BFYS6tnJ2hdH0kVxM6/eVZ2xy+FqStSWvYmtfFMDLIxurorHwDKfDz5Q==",
+ "license": "MIT",
+ "dependencies": {
+ "run-applescript": "^7.0.0"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
"node_modules/call-bind": {
"version": "1.0.8",
"resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.8.tgz",
@@ -1941,12 +2926,89 @@
"url": "https://github.com/chalk/chalk?sponsor=1"
}
},
+ "node_modules/chardet": {
+ "version": "0.7.0",
+ "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz",
+ "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==",
+ "license": "MIT"
+ },
+ "node_modules/chownr": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/chownr/-/chownr-3.0.0.tgz",
+ "integrity": "sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g==",
+ "license": "BlueOak-1.0.0",
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/cli-cursor": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-5.0.0.tgz",
+ "integrity": "sha512-aCj4O5wKyszjMmDT4tZj93kxyydN/K5zPWSCe6/0AV/AA1pqe5ZBIw0a2ZfPQV7lL5/yb5HsUreJ6UFAF1tEQw==",
+ "license": "MIT",
+ "dependencies": {
+ "restore-cursor": "^5.0.0"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/cli-spinners": {
+ "version": "2.9.2",
+ "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.9.2.tgz",
+ "integrity": "sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/cli-width": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-4.1.0.tgz",
+ "integrity": "sha512-ouuZd4/dm2Sw5Gmqy6bGyNNNe1qt9RpmxveLSO7KcgsTnU7RXfsw+/bukWGo1abgBiMAic068rclZsO4IWmmxQ==",
+ "license": "ISC",
+ "engines": {
+ "node": ">= 12"
+ }
+ },
"node_modules/client-only": {
"version": "0.0.1",
"resolved": "https://registry.npmjs.org/client-only/-/client-only-0.0.1.tgz",
"integrity": "sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==",
"license": "MIT"
},
+ "node_modules/clipboardy": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/clipboardy/-/clipboardy-4.0.0.tgz",
+ "integrity": "sha512-5mOlNS0mhX0707P2I0aZ2V/cmHUEO/fL7VFLqszkhUsxt7RwnmrInf/eEQKlf5GzvYeHIjT+Ov1HRfNmymlG0w==",
+ "license": "MIT",
+ "dependencies": {
+ "execa": "^8.0.1",
+ "is-wsl": "^3.1.0",
+ "is64bit": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/clsx": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz",
+ "integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
"node_modules/color": {
"version": "4.2.3",
"resolved": "https://registry.npmjs.org/color/-/color-4.2.3.tgz",
@@ -1965,7 +3027,6 @@
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
"integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
- "devOptional": true,
"license": "MIT",
"dependencies": {
"color-name": "~1.1.4"
@@ -1978,7 +3039,6 @@
"version": "1.1.4",
"resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
"integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
- "devOptional": true,
"license": "MIT"
},
"node_modules/color-string": {
@@ -1992,6 +3052,15 @@
"simple-swizzle": "^0.2.2"
}
},
+ "node_modules/commander": {
+ "version": "12.1.0",
+ "resolved": "https://registry.npmjs.org/commander/-/commander-12.1.0.tgz",
+ "integrity": "sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=18"
+ }
+ },
"node_modules/concat-map": {
"version": "0.0.1",
"resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
@@ -2003,7 +3072,6 @@
"version": "7.0.6",
"resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz",
"integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==",
- "dev": true,
"license": "MIT",
"dependencies": {
"path-key": "^3.1.0",
@@ -2107,6 +3175,34 @@
"dev": true,
"license": "MIT"
},
+ "node_modules/default-browser": {
+ "version": "5.2.1",
+ "resolved": "https://registry.npmjs.org/default-browser/-/default-browser-5.2.1.tgz",
+ "integrity": "sha512-WY/3TUME0x3KPYdRRxEJJvXRHV4PyPoUsxtZa78lwItwRQRHhd2U9xOscaT/YTf8uCXIAjeJOFBVEh/7FtD8Xg==",
+ "license": "MIT",
+ "dependencies": {
+ "bundle-name": "^4.1.0",
+ "default-browser-id": "^5.0.0"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/default-browser-id": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/default-browser-id/-/default-browser-id-5.0.0.tgz",
+ "integrity": "sha512-A6p/pu/6fyBcA1TRz/GqWYPViplrftcW2gZC9q79ngNCKAeR/X3gcEdXQHl4KNXV+3wgIJ1CPkJQ3IHM6lcsyA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
"node_modules/define-data-property": {
"version": "1.1.4",
"resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz",
@@ -2125,6 +3221,18 @@
"url": "https://github.com/sponsors/ljharb"
}
},
+ "node_modules/define-lazy-prop": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-3.0.0.tgz",
+ "integrity": "sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
"node_modules/define-properties": {
"version": "1.2.1",
"resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz",
@@ -2148,7 +3256,6 @@
"resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.4.tgz",
"integrity": "sha512-3UDv+G9CsCKO1WKMGw9fwq/SWJYbI0c5Y7LU1AXYoDdbhE2AHQ6N6Nb34sG8Fj7T5APy8qXDCKuuIHd1BR0tVA==",
"license": "Apache-2.0",
- "optional": true,
"engines": {
"node": ">=8"
}
@@ -2188,6 +3295,19 @@
"dev": true,
"license": "MIT"
},
+ "node_modules/enhanced-resolve": {
+ "version": "5.18.2",
+ "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.18.2.tgz",
+ "integrity": "sha512-6Jw4sE1maoRJo3q8MsSIn2onJFbLTOjY9hlx4DZXmOKvLRd1Ok2kXmAGXaafL2+ijsJZ1ClYbl/pmqr9+k4iUQ==",
+ "license": "MIT",
+ "dependencies": {
+ "graceful-fs": "^4.2.4",
+ "tapable": "^2.2.0"
+ },
+ "engines": {
+ "node": ">=10.13.0"
+ }
+ },
"node_modules/es-abstract": {
"version": "1.24.0",
"resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.24.0.tgz",
@@ -2804,6 +3924,43 @@
"node": ">=0.10.0"
}
},
+ "node_modules/execa": {
+ "version": "8.0.1",
+ "resolved": "https://registry.npmjs.org/execa/-/execa-8.0.1.tgz",
+ "integrity": "sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==",
+ "license": "MIT",
+ "dependencies": {
+ "cross-spawn": "^7.0.3",
+ "get-stream": "^8.0.1",
+ "human-signals": "^5.0.0",
+ "is-stream": "^3.0.0",
+ "merge-stream": "^2.0.0",
+ "npm-run-path": "^5.1.0",
+ "onetime": "^6.0.0",
+ "signal-exit": "^4.1.0",
+ "strip-final-newline": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=16.17"
+ },
+ "funding": {
+ "url": "https://github.com/sindresorhus/execa?sponsor=1"
+ }
+ },
+ "node_modules/external-editor": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz",
+ "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==",
+ "license": "MIT",
+ "dependencies": {
+ "chardet": "^0.7.0",
+ "iconv-lite": "^0.4.24",
+ "tmp": "^0.0.33"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
"node_modules/fast-deep-equal": {
"version": "3.1.3",
"resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
@@ -2945,6 +4102,33 @@
"url": "https://github.com/sponsors/ljharb"
}
},
+ "node_modules/framer-motion": {
+ "version": "12.23.9",
+ "resolved": "https://registry.npmjs.org/framer-motion/-/framer-motion-12.23.9.tgz",
+ "integrity": "sha512-TqEHXj8LWfQSKqfdr5Y4mYltYLw96deu6/K9kGDd+ysqRJPNwF9nb5mZcrLmybHbU7gcJ+HQar41U3UTGanbbQ==",
+ "license": "MIT",
+ "dependencies": {
+ "motion-dom": "^12.23.9",
+ "motion-utils": "^12.23.6",
+ "tslib": "^2.4.0"
+ },
+ "peerDependencies": {
+ "@emotion/is-prop-valid": "*",
+ "react": "^18.0.0 || ^19.0.0",
+ "react-dom": "^18.0.0 || ^19.0.0"
+ },
+ "peerDependenciesMeta": {
+ "@emotion/is-prop-valid": {
+ "optional": true
+ },
+ "react": {
+ "optional": true
+ },
+ "react-dom": {
+ "optional": true
+ }
+ }
+ },
"node_modules/function-bind": {
"version": "1.1.2",
"resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz",
@@ -2986,6 +4170,18 @@
"url": "https://github.com/sponsors/ljharb"
}
},
+ "node_modules/get-east-asian-width": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/get-east-asian-width/-/get-east-asian-width-1.3.0.tgz",
+ "integrity": "sha512-vpeMIQKxczTD/0s2CdEWHcb0eeJe6TFjxb+J5xgX7hScxqrGuyjmv4c1D4A/gelKfyox0gJJwIHF+fLjeaM8kQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
"node_modules/get-intrinsic": {
"version": "1.3.0",
"resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz",
@@ -3025,6 +4221,18 @@
"node": ">= 0.4"
}
},
+ "node_modules/get-stream": {
+ "version": "8.0.1",
+ "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-8.0.1.tgz",
+ "integrity": "sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=16"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
"node_modules/get-symbol-description": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.1.0.tgz",
@@ -3112,6 +4320,12 @@
"url": "https://github.com/sponsors/ljharb"
}
},
+ "node_modules/graceful-fs": {
+ "version": "4.2.11",
+ "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz",
+ "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==",
+ "license": "ISC"
+ },
"node_modules/graphemer": {
"version": "1.4.0",
"resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz",
@@ -3213,6 +4427,27 @@
"node": ">= 0.4"
}
},
+ "node_modules/human-signals": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-5.0.0.tgz",
+ "integrity": "sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==",
+ "license": "Apache-2.0",
+ "engines": {
+ "node": ">=16.17.0"
+ }
+ },
+ "node_modules/iconv-lite": {
+ "version": "0.4.24",
+ "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz",
+ "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==",
+ "license": "MIT",
+ "dependencies": {
+ "safer-buffer": ">= 2.1.2 < 3"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
"node_modules/ignore": {
"version": "5.3.2",
"resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz",
@@ -3417,6 +4652,21 @@
"url": "https://github.com/sponsors/ljharb"
}
},
+ "node_modules/is-docker": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-3.0.0.tgz",
+ "integrity": "sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==",
+ "license": "MIT",
+ "bin": {
+ "is-docker": "cli.js"
+ },
+ "engines": {
+ "node": "^12.20.0 || ^14.13.1 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
"node_modules/is-extglob": {
"version": "2.1.1",
"resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
@@ -3443,6 +4693,15 @@
"url": "https://github.com/sponsors/ljharb"
}
},
+ "node_modules/is-fullwidth-code-point": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
+ "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
"node_modules/is-generator-function": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.1.0.tgz",
@@ -3475,6 +4734,36 @@
"node": ">=0.10.0"
}
},
+ "node_modules/is-inside-container": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-inside-container/-/is-inside-container-1.0.0.tgz",
+ "integrity": "sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==",
+ "license": "MIT",
+ "dependencies": {
+ "is-docker": "^3.0.0"
+ },
+ "bin": {
+ "is-inside-container": "cli.js"
+ },
+ "engines": {
+ "node": ">=14.16"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/is-interactive": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-2.0.0.tgz",
+ "integrity": "sha512-qP1vozQRI+BMOPcjFzrjXuQvdak2pHNUMZoeG2eRbiSqyvbEf/wQtEOTOX1guk6E3t36RkaqiSt8A/6YElNxLQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
"node_modules/is-map": {
"version": "2.0.3",
"resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.3.tgz",
@@ -3576,6 +4865,18 @@
"url": "https://github.com/sponsors/ljharb"
}
},
+ "node_modules/is-stream": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz",
+ "integrity": "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==",
+ "license": "MIT",
+ "engines": {
+ "node": "^12.20.0 || ^14.13.1 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
"node_modules/is-string": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/is-string/-/is-string-1.1.1.tgz",
@@ -3627,6 +4928,18 @@
"url": "https://github.com/sponsors/ljharb"
}
},
+ "node_modules/is-unicode-supported": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-2.1.0.tgz",
+ "integrity": "sha512-mE00Gnza5EEB3Ds0HfMyllZzbBrmLOX3vfWoj9A9PEnTfratQ/BcaJOuMhnkhjXvb2+FkY3VuHqtAGpTPmglFQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
"node_modules/is-weakmap": {
"version": "2.0.2",
"resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.2.tgz",
@@ -3673,6 +4986,36 @@
"url": "https://github.com/sponsors/ljharb"
}
},
+ "node_modules/is-wsl": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-3.1.0.tgz",
+ "integrity": "sha512-UcVfVfaK4Sc4m7X3dUSoHoozQGBEFeDC+zVo06t98xe8CzHSZZBekNXH+tu0NalHolcJ/QAGqS46Hef7QXBIMw==",
+ "license": "MIT",
+ "dependencies": {
+ "is-inside-container": "^1.0.0"
+ },
+ "engines": {
+ "node": ">=16"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/is64bit": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/is64bit/-/is64bit-2.0.0.tgz",
+ "integrity": "sha512-jv+8jaWCl0g2lSBkNSVXdzfBA0npK1HGC2KtWM9FumFRoGS94g3NbCCLVnCYHLjp4GrW2KZeeSTMo5ddtznmGw==",
+ "license": "MIT",
+ "dependencies": {
+ "system-architecture": "^0.1.0"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
"node_modules/isarray": {
"version": "2.0.5",
"resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz",
@@ -3684,7 +5027,6 @@
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
"integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==",
- "dev": true,
"license": "ISC"
},
"node_modules/iterator.prototype": {
@@ -3705,6 +5047,24 @@
"node": ">= 0.4"
}
},
+ "node_modules/jiti": {
+ "version": "2.5.1",
+ "resolved": "https://registry.npmjs.org/jiti/-/jiti-2.5.1.tgz",
+ "integrity": "sha512-twQoecYPiVA5K/h6SxtORw/Bs3ar+mLUtoPSc7iMXzQzK8d7eJ/R09wmTwAjiamETn1cXYPGfNnu7DMoHgu12w==",
+ "license": "MIT",
+ "bin": {
+ "jiti": "lib/jiti-cli.mjs"
+ }
+ },
+ "node_modules/jose": {
+ "version": "6.0.12",
+ "resolved": "https://registry.npmjs.org/jose/-/jose-6.0.12.tgz",
+ "integrity": "sha512-T8xypXs8CpmiIi78k0E+Lk7T2zlK4zDyg+o1CZ4AkOHgDg98ogdP2BeZ61lTFKFyoEwJ9RgAgN+SdM3iPgNonQ==",
+ "license": "MIT",
+ "funding": {
+ "url": "https://github.com/sponsors/panva"
+ }
+ },
"node_modules/js-tokens": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
@@ -3785,6 +5145,15 @@
"json-buffer": "3.0.1"
}
},
+ "node_modules/kleur": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz",
+ "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
"node_modules/language-subtag-registry": {
"version": "0.3.23",
"resolved": "https://registry.npmjs.org/language-subtag-registry/-/language-subtag-registry-0.3.23.tgz",
@@ -3819,6 +5188,234 @@
"node": ">= 0.8.0"
}
},
+ "node_modules/lightningcss": {
+ "version": "1.30.1",
+ "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.30.1.tgz",
+ "integrity": "sha512-xi6IyHML+c9+Q3W0S4fCQJOym42pyurFiJUHEcEyHS0CeKzia4yZDEsLlqOFykxOdHpNy0NmvVO31vcSqAxJCg==",
+ "license": "MPL-2.0",
+ "dependencies": {
+ "detect-libc": "^2.0.3"
+ },
+ "engines": {
+ "node": ">= 12.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ },
+ "optionalDependencies": {
+ "lightningcss-darwin-arm64": "1.30.1",
+ "lightningcss-darwin-x64": "1.30.1",
+ "lightningcss-freebsd-x64": "1.30.1",
+ "lightningcss-linux-arm-gnueabihf": "1.30.1",
+ "lightningcss-linux-arm64-gnu": "1.30.1",
+ "lightningcss-linux-arm64-musl": "1.30.1",
+ "lightningcss-linux-x64-gnu": "1.30.1",
+ "lightningcss-linux-x64-musl": "1.30.1",
+ "lightningcss-win32-arm64-msvc": "1.30.1",
+ "lightningcss-win32-x64-msvc": "1.30.1"
+ }
+ },
+ "node_modules/lightningcss-darwin-arm64": {
+ "version": "1.30.1",
+ "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.30.1.tgz",
+ "integrity": "sha512-c8JK7hyE65X1MHMN+Viq9n11RRC7hgin3HhYKhrMyaXflk5GVplZ60IxyoVtzILeKr+xAJwg6zK6sjTBJ0FKYQ==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "MPL-2.0",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": ">= 12.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/lightningcss-darwin-x64": {
+ "version": "1.30.1",
+ "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.30.1.tgz",
+ "integrity": "sha512-k1EvjakfumAQoTfcXUcHQZhSpLlkAuEkdMBsI/ivWw9hL+7FtilQc0Cy3hrx0AAQrVtQAbMI7YjCgYgvn37PzA==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MPL-2.0",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": ">= 12.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/lightningcss-freebsd-x64": {
+ "version": "1.30.1",
+ "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.30.1.tgz",
+ "integrity": "sha512-kmW6UGCGg2PcyUE59K5r0kWfKPAVy4SltVeut+umLCFoJ53RdCUWxcRDzO1eTaxf/7Q2H7LTquFHPL5R+Gjyig==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MPL-2.0",
+ "optional": true,
+ "os": [
+ "freebsd"
+ ],
+ "engines": {
+ "node": ">= 12.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/lightningcss-linux-arm-gnueabihf": {
+ "version": "1.30.1",
+ "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.30.1.tgz",
+ "integrity": "sha512-MjxUShl1v8pit+6D/zSPq9S9dQ2NPFSQwGvxBCYaBYLPlCWuPh9/t1MRS8iUaR8i+a6w7aps+B4N0S1TYP/R+Q==",
+ "cpu": [
+ "arm"
+ ],
+ "license": "MPL-2.0",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">= 12.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/lightningcss-linux-arm64-gnu": {
+ "version": "1.30.1",
+ "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.30.1.tgz",
+ "integrity": "sha512-gB72maP8rmrKsnKYy8XUuXi/4OctJiuQjcuqWNlJQ6jZiWqtPvqFziskH3hnajfvKB27ynbVCucKSm2rkQp4Bw==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "MPL-2.0",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">= 12.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/lightningcss-linux-arm64-musl": {
+ "version": "1.30.1",
+ "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.30.1.tgz",
+ "integrity": "sha512-jmUQVx4331m6LIX+0wUhBbmMX7TCfjF5FoOH6SD1CttzuYlGNVpA7QnrmLxrsub43ClTINfGSYyHe2HWeLl5CQ==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "MPL-2.0",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">= 12.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/lightningcss-linux-x64-gnu": {
+ "version": "1.30.1",
+ "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.30.1.tgz",
+ "integrity": "sha512-piWx3z4wN8J8z3+O5kO74+yr6ze/dKmPnI7vLqfSqI8bccaTGY5xiSGVIJBDd5K5BHlvVLpUB3S2YCfelyJ1bw==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MPL-2.0",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">= 12.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/lightningcss-linux-x64-musl": {
+ "version": "1.30.1",
+ "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.30.1.tgz",
+ "integrity": "sha512-rRomAK7eIkL+tHY0YPxbc5Dra2gXlI63HL+v1Pdi1a3sC+tJTcFrHX+E86sulgAXeI7rSzDYhPSeHHjqFhqfeQ==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MPL-2.0",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">= 12.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/lightningcss-win32-arm64-msvc": {
+ "version": "1.30.1",
+ "resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.30.1.tgz",
+ "integrity": "sha512-mSL4rqPi4iXq5YVqzSsJgMVFENoa4nGTT/GjO2c0Yl9OuQfPsIfncvLrEW6RbbB24WtZ3xP/2CCmI3tNkNV4oA==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "MPL-2.0",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">= 12.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/lightningcss-win32-x64-msvc": {
+ "version": "1.30.1",
+ "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.30.1.tgz",
+ "integrity": "sha512-PVqXh48wh4T53F/1CCu8PIPCxLzWyCnn/9T5W1Jpmdy5h9Cwd+0YQS6/LwhHXSafuc61/xg9Lv5OrCby6a++jg==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MPL-2.0",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">= 12.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
"node_modules/locate-path": {
"version": "6.0.0",
"resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz",
@@ -3842,6 +5439,46 @@
"dev": true,
"license": "MIT"
},
+ "node_modules/log-symbols": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-6.0.0.tgz",
+ "integrity": "sha512-i24m8rpwhmPIS4zscNzK6MSEhk0DUWa/8iYQWxhffV8jkI4Phvs3F+quL5xvS0gdQR0FyTCMMH33Y78dDTzzIw==",
+ "license": "MIT",
+ "dependencies": {
+ "chalk": "^5.3.0",
+ "is-unicode-supported": "^1.3.0"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/log-symbols/node_modules/chalk": {
+ "version": "5.4.1",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.4.1.tgz",
+ "integrity": "sha512-zgVZuo2WcZgfUEmsn6eO3kINexW8RAE4maiQ8QNs8CtpPCSyMiYsULR3HQYkm3w8FIA3SberyMJMSldGsW+U3w==",
+ "license": "MIT",
+ "engines": {
+ "node": "^12.17.0 || ^14.13 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/chalk?sponsor=1"
+ }
+ },
+ "node_modules/log-symbols/node_modules/is-unicode-supported": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-1.3.0.tgz",
+ "integrity": "sha512-43r2mRvz+8JRIKnWJ+3j8JtjRKZ6GmjzfaE/qiBJnikNnYv/6bagRJ1kUhNk8R5EX/GkobD+r+sfxCPJsiKBLQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
"node_modules/loose-envify": {
"version": "1.4.0",
"resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz",
@@ -3855,6 +5492,24 @@
"loose-envify": "cli.js"
}
},
+ "node_modules/lucide-react": {
+ "version": "0.526.0",
+ "resolved": "https://registry.npmjs.org/lucide-react/-/lucide-react-0.526.0.tgz",
+ "integrity": "sha512-uGWG/2RKuDLeQHCodn5cmJ9Zij80EstOdcBP+j//B2sr78w7woiEL4aMu6CRlRkyOyJ8sZry8QLhQTmZjynLdA==",
+ "license": "ISC",
+ "peerDependencies": {
+ "react": "^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0"
+ }
+ },
+ "node_modules/magic-string": {
+ "version": "0.30.17",
+ "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.17.tgz",
+ "integrity": "sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==",
+ "license": "MIT",
+ "dependencies": {
+ "@jridgewell/sourcemap-codec": "^1.5.0"
+ }
+ },
"node_modules/math-intrinsics": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz",
@@ -3865,6 +5520,12 @@
"node": ">= 0.4"
}
},
+ "node_modules/merge-stream": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz",
+ "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==",
+ "license": "MIT"
+ },
"node_modules/merge2": {
"version": "1.4.1",
"resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz",
@@ -3889,6 +5550,30 @@
"node": ">=8.6"
}
},
+ "node_modules/mimic-fn": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-4.0.0.tgz",
+ "integrity": "sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/mimic-function": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/mimic-function/-/mimic-function-5.0.1.tgz",
+ "integrity": "sha512-VP79XUPxV2CigYP3jWwAUFSku2aKqBH7uTAapFWCBqutsbmDo96KY5o8uh6U+/YSIn5OxJnXp73beVkpqMIGhA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
"node_modules/minimatch": {
"version": "3.1.2",
"resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
@@ -3912,6 +5597,57 @@
"url": "https://github.com/sponsors/ljharb"
}
},
+ "node_modules/minipass": {
+ "version": "7.1.2",
+ "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz",
+ "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==",
+ "license": "ISC",
+ "engines": {
+ "node": ">=16 || 14 >=14.17"
+ }
+ },
+ "node_modules/minizlib": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-3.0.2.tgz",
+ "integrity": "sha512-oG62iEk+CYt5Xj2YqI5Xi9xWUeZhDI8jjQmC5oThVH5JGCTgIjr7ciJDzC7MBzYd//WvR1OTmP5Q38Q8ShQtVA==",
+ "license": "MIT",
+ "dependencies": {
+ "minipass": "^7.1.2"
+ },
+ "engines": {
+ "node": ">= 18"
+ }
+ },
+ "node_modules/mkdirp": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-3.0.1.tgz",
+ "integrity": "sha512-+NsyUUAZDmo6YVHzL/stxSu3t9YS1iljliy3BSDrXJ/dkn1KYdmtZODGGjLcc9XLgVVpH4KshHB8XmZgMhaBXg==",
+ "license": "MIT",
+ "bin": {
+ "mkdirp": "dist/cjs/src/bin.js"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/motion-dom": {
+ "version": "12.23.9",
+ "resolved": "https://registry.npmjs.org/motion-dom/-/motion-dom-12.23.9.tgz",
+ "integrity": "sha512-6Sv++iWS8XMFCgU1qwKj9l4xuC47Hp4+2jvPfyTXkqDg2tTzSgX6nWKD4kNFXk0k7llO59LZTPuJigza4A2K1A==",
+ "license": "MIT",
+ "dependencies": {
+ "motion-utils": "^12.23.6"
+ }
+ },
+ "node_modules/motion-utils": {
+ "version": "12.23.6",
+ "resolved": "https://registry.npmjs.org/motion-utils/-/motion-utils-12.23.6.tgz",
+ "integrity": "sha512-eAWoPgr4eFEOFfg2WjIsMoqJTW6Z8MTUCgn/GZ3VRpClWBdnbjryiA3ZSNLyxCTmCQx4RmYX6jX1iWHbenUPNQ==",
+ "license": "MIT"
+ },
"node_modules/ms": {
"version": "2.1.3",
"resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
@@ -3919,6 +5655,15 @@
"dev": true,
"license": "MIT"
},
+ "node_modules/mute-stream": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-1.0.0.tgz",
+ "integrity": "sha512-avsJQhyd+680gKXyG/sQc0nXaC6rBkPOfyHYcFb9+hdkqQkR9bdnkJ0AMZhke0oesPqIO+mFFJ+IdBc7mst4IA==",
+ "license": "ISC",
+ "engines": {
+ "node": "^14.17.0 || ^16.13.0 || >=18.0.0"
+ }
+ },
"node_modules/nanoid": {
"version": "3.3.11",
"resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz",
@@ -4012,6 +5757,97 @@
}
}
},
+ "node_modules/next-auth": {
+ "version": "5.0.0-beta.29",
+ "resolved": "https://registry.npmjs.org/next-auth/-/next-auth-5.0.0-beta.29.tgz",
+ "integrity": "sha512-Ukpnuk3NMc/LiOl32njZPySk7pABEzbjhMUFd5/n10I0ZNC7NCuVv8IY2JgbDek2t/PUOifQEoUiOOTLy4os5A==",
+ "license": "ISC",
+ "dependencies": {
+ "@auth/core": "0.40.0"
+ },
+ "peerDependencies": {
+ "@simplewebauthn/browser": "^9.0.1",
+ "@simplewebauthn/server": "^9.0.2",
+ "next": "^14.0.0-0 || ^15.0.0-0",
+ "nodemailer": "^6.6.5",
+ "react": "^18.2.0 || ^19.0.0-0"
+ },
+ "peerDependenciesMeta": {
+ "@simplewebauthn/browser": {
+ "optional": true
+ },
+ "@simplewebauthn/server": {
+ "optional": true
+ },
+ "nodemailer": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/next/node_modules/postcss": {
+ "version": "8.4.31",
+ "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.31.tgz",
+ "integrity": "sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==",
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/postcss/"
+ },
+ {
+ "type": "tidelift",
+ "url": "https://tidelift.com/funding/github/npm/postcss"
+ },
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "nanoid": "^3.3.6",
+ "picocolors": "^1.0.0",
+ "source-map-js": "^1.0.2"
+ },
+ "engines": {
+ "node": "^10 || ^12 || >=14"
+ }
+ },
+ "node_modules/npm-run-path": {
+ "version": "5.3.0",
+ "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.3.0.tgz",
+ "integrity": "sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==",
+ "license": "MIT",
+ "dependencies": {
+ "path-key": "^4.0.0"
+ },
+ "engines": {
+ "node": "^12.20.0 || ^14.13.1 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/npm-run-path/node_modules/path-key": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz",
+ "integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/oauth4webapi": {
+ "version": "3.6.0",
+ "resolved": "https://registry.npmjs.org/oauth4webapi/-/oauth4webapi-3.6.0.tgz",
+ "integrity": "sha512-OwXPTXjKPOldTpAa19oksrX9TYHA0rt+VcUFTkJ7QKwgmevPpNm9Cn5vFZUtIo96FiU6AfPuUUGzoXqgOzibWg==",
+ "license": "MIT",
+ "funding": {
+ "url": "https://github.com/sponsors/panva"
+ }
+ },
"node_modules/object-assign": {
"version": "4.1.1",
"resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
@@ -4135,6 +5971,39 @@
"url": "https://github.com/sponsors/ljharb"
}
},
+ "node_modules/onetime": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/onetime/-/onetime-6.0.0.tgz",
+ "integrity": "sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==",
+ "license": "MIT",
+ "dependencies": {
+ "mimic-fn": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/open": {
+ "version": "10.1.0",
+ "resolved": "https://registry.npmjs.org/open/-/open-10.1.0.tgz",
+ "integrity": "sha512-mnkeQ1qP5Ue2wd+aivTD3NHd/lZ96Lu0jgf0pwktLPtx6cTZiH7tyeGRRHs0zX0rbrahXPnXlUnbeXyaBBuIaw==",
+ "license": "MIT",
+ "dependencies": {
+ "default-browser": "^5.2.1",
+ "define-lazy-prop": "^3.0.0",
+ "is-inside-container": "^1.0.0",
+ "is-wsl": "^3.1.0"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
"node_modules/optionator": {
"version": "0.9.4",
"resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz",
@@ -4153,6 +6022,77 @@
"node": ">= 0.8.0"
}
},
+ "node_modules/ora": {
+ "version": "8.1.0",
+ "resolved": "https://registry.npmjs.org/ora/-/ora-8.1.0.tgz",
+ "integrity": "sha512-GQEkNkH/GHOhPFXcqZs3IDahXEQcQxsSjEkK4KvEEST4t7eNzoMjxTzef+EZ+JluDEV+Raoi3WQ2CflnRdSVnQ==",
+ "license": "MIT",
+ "dependencies": {
+ "chalk": "^5.3.0",
+ "cli-cursor": "^5.0.0",
+ "cli-spinners": "^2.9.2",
+ "is-interactive": "^2.0.0",
+ "is-unicode-supported": "^2.0.0",
+ "log-symbols": "^6.0.0",
+ "stdin-discarder": "^0.2.2",
+ "string-width": "^7.2.0",
+ "strip-ansi": "^7.1.0"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/ora/node_modules/ansi-regex": {
+ "version": "6.1.0",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz",
+ "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/ansi-regex?sponsor=1"
+ }
+ },
+ "node_modules/ora/node_modules/chalk": {
+ "version": "5.4.1",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.4.1.tgz",
+ "integrity": "sha512-zgVZuo2WcZgfUEmsn6eO3kINexW8RAE4maiQ8QNs8CtpPCSyMiYsULR3HQYkm3w8FIA3SberyMJMSldGsW+U3w==",
+ "license": "MIT",
+ "engines": {
+ "node": "^12.17.0 || ^14.13 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/chalk?sponsor=1"
+ }
+ },
+ "node_modules/ora/node_modules/strip-ansi": {
+ "version": "7.1.0",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz",
+ "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==",
+ "license": "MIT",
+ "dependencies": {
+ "ansi-regex": "^6.0.1"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/strip-ansi?sponsor=1"
+ }
+ },
+ "node_modules/os-tmpdir": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz",
+ "integrity": "sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
"node_modules/own-keys": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/own-keys/-/own-keys-1.0.1.tgz",
@@ -4230,7 +6170,6 @@
"version": "3.1.1",
"resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz",
"integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==",
- "dev": true,
"license": "MIT",
"engines": {
"node": ">=8"
@@ -4273,9 +6212,9 @@
}
},
"node_modules/postcss": {
- "version": "8.4.31",
- "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.31.tgz",
- "integrity": "sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==",
+ "version": "8.5.6",
+ "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.6.tgz",
+ "integrity": "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==",
"funding": [
{
"type": "opencollective",
@@ -4292,14 +6231,33 @@
],
"license": "MIT",
"dependencies": {
- "nanoid": "^3.3.6",
- "picocolors": "^1.0.0",
- "source-map-js": "^1.0.2"
+ "nanoid": "^3.3.11",
+ "picocolors": "^1.1.1",
+ "source-map-js": "^1.2.1"
},
"engines": {
"node": "^10 || ^12 || >=14"
}
},
+ "node_modules/preact": {
+ "version": "10.24.3",
+ "resolved": "https://registry.npmjs.org/preact/-/preact-10.24.3.tgz",
+ "integrity": "sha512-Z2dPnBnMUfyQfSQ+GBdsGa16hz35YmLmtTLhM169uW944hYL6xzTYkJjC07j+Wosz733pMWx0fgON3JNw1jJQA==",
+ "license": "MIT",
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/preact"
+ }
+ },
+ "node_modules/preact-render-to-string": {
+ "version": "6.5.11",
+ "resolved": "https://registry.npmjs.org/preact-render-to-string/-/preact-render-to-string-6.5.11.tgz",
+ "integrity": "sha512-ubnauqoGczeGISiOh6RjX0/cdaF8v/oDXIjO85XALCQjwQP+SB4RDXXtvZ6yTYSjG+PC1QRP2AhPgCEsM2EvUw==",
+ "license": "MIT",
+ "peerDependencies": {
+ "preact": ">=10"
+ }
+ },
"node_modules/prelude-ls": {
"version": "1.2.1",
"resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz",
@@ -4310,6 +6268,45 @@
"node": ">= 0.8.0"
}
},
+ "node_modules/prisma": {
+ "version": "6.12.0",
+ "resolved": "https://registry.npmjs.org/prisma/-/prisma-6.12.0.tgz",
+ "integrity": "sha512-pmV7NEqQej9WjizN6RSNIwf7Y+jeh9mY1JEX2WjGxJi4YZWexClhde1yz/FuvAM+cTwzchcMytu2m4I6wPkIzg==",
+ "devOptional": true,
+ "hasInstallScript": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@prisma/config": "6.12.0",
+ "@prisma/engines": "6.12.0"
+ },
+ "bin": {
+ "prisma": "build/index.js"
+ },
+ "engines": {
+ "node": ">=18.18"
+ },
+ "peerDependencies": {
+ "typescript": ">=5.1.0"
+ },
+ "peerDependenciesMeta": {
+ "typescript": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/prompts": {
+ "version": "2.4.2",
+ "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz",
+ "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==",
+ "license": "MIT",
+ "dependencies": {
+ "kleur": "^3.0.3",
+ "sisteransi": "^1.0.5"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
"node_modules/prop-types": {
"version": "15.8.1",
"resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz",
@@ -4466,6 +6463,37 @@
"url": "https://github.com/privatenumber/resolve-pkg-maps?sponsor=1"
}
},
+ "node_modules/restore-cursor": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-5.1.0.tgz",
+ "integrity": "sha512-oMA2dcrw6u0YfxJQXm342bFKX/E4sG9rbTzO9ptUcR/e8A33cHuvStiYOwH7fszkZlZ1z/ta9AAoPk2F4qIOHA==",
+ "license": "MIT",
+ "dependencies": {
+ "onetime": "^7.0.0",
+ "signal-exit": "^4.1.0"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/restore-cursor/node_modules/onetime": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/onetime/-/onetime-7.0.0.tgz",
+ "integrity": "sha512-VXJjc87FScF88uafS3JllDgvAm+c/Slfz06lorj2uAY34rlUu0Nt+v8wreiImcrgAjjIHp1rXpTDlLOGw29WwQ==",
+ "license": "MIT",
+ "dependencies": {
+ "mimic-function": "^5.0.0"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
"node_modules/reusify": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz",
@@ -4477,6 +6505,18 @@
"node": ">=0.10.0"
}
},
+ "node_modules/run-applescript": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/run-applescript/-/run-applescript-7.0.0.tgz",
+ "integrity": "sha512-9by4Ij99JUr/MCFBUkDKLWK3G9HVXmabKz9U5MlIAIuvuzkiOicRYs8XJLxX+xahD+mLiiCYDqF9dKAgtzKP1A==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
"node_modules/run-parallel": {
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz",
@@ -4556,6 +6596,12 @@
"url": "https://github.com/sponsors/ljharb"
}
},
+ "node_modules/safer-buffer": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
+ "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==",
+ "license": "MIT"
+ },
"node_modules/scheduler": {
"version": "0.26.0",
"resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.26.0.tgz",
@@ -4671,7 +6717,6 @@
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz",
"integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==",
- "dev": true,
"license": "MIT",
"dependencies": {
"shebang-regex": "^3.0.0"
@@ -4684,7 +6729,6 @@
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz",
"integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==",
- "dev": true,
"license": "MIT",
"engines": {
"node": ">=8"
@@ -4766,6 +6810,18 @@
"url": "https://github.com/sponsors/ljharb"
}
},
+ "node_modules/signal-exit": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz",
+ "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==",
+ "license": "ISC",
+ "engines": {
+ "node": ">=14"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
"node_modules/simple-swizzle": {
"version": "0.2.2",
"resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz",
@@ -4776,6 +6832,22 @@
"is-arrayish": "^0.3.1"
}
},
+ "node_modules/sisteransi": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz",
+ "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==",
+ "license": "MIT"
+ },
+ "node_modules/sonner": {
+ "version": "2.0.6",
+ "resolved": "https://registry.npmjs.org/sonner/-/sonner-2.0.6.tgz",
+ "integrity": "sha512-yHFhk8T/DK3YxjFQXIrcHT1rGEeTLliVzWbO0xN8GberVun2RiBnxAjXAYpZrqwEVHBG9asI/Li8TAAhN9m59Q==",
+ "license": "MIT",
+ "peerDependencies": {
+ "react": "^18.0.0 || ^19.0.0 || ^19.0.0-rc",
+ "react-dom": "^18.0.0 || ^19.0.0 || ^19.0.0-rc"
+ }
+ },
"node_modules/source-map-js": {
"version": "1.2.1",
"resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz",
@@ -4792,6 +6864,18 @@
"dev": true,
"license": "MIT"
},
+ "node_modules/stdin-discarder": {
+ "version": "0.2.2",
+ "resolved": "https://registry.npmjs.org/stdin-discarder/-/stdin-discarder-0.2.2.tgz",
+ "integrity": "sha512-UhDfHmA92YAlNnCfhmq0VeNL5bDbiZGg7sZ2IvPsXubGkiNa9EC+tUTsjBRsYUAz87btI6/1wf4XoVvQ3uRnmQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
"node_modules/stop-iteration-iterator": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/stop-iteration-iterator/-/stop-iteration-iterator-1.1.0.tgz",
@@ -4806,6 +6890,56 @@
"node": ">= 0.4"
}
},
+ "node_modules/string-width": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz",
+ "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==",
+ "license": "MIT",
+ "dependencies": {
+ "emoji-regex": "^10.3.0",
+ "get-east-asian-width": "^1.0.0",
+ "strip-ansi": "^7.1.0"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/string-width/node_modules/ansi-regex": {
+ "version": "6.1.0",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz",
+ "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/ansi-regex?sponsor=1"
+ }
+ },
+ "node_modules/string-width/node_modules/emoji-regex": {
+ "version": "10.4.0",
+ "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.4.0.tgz",
+ "integrity": "sha512-EC+0oUMY1Rqm4O6LLrgjtYDvcVYTy7chDnM4Q7030tP4Kwj3u/pR6gP9ygnp2CJMK5Gq+9Q2oqmrFJAz01DXjw==",
+ "license": "MIT"
+ },
+ "node_modules/string-width/node_modules/strip-ansi": {
+ "version": "7.1.0",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz",
+ "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==",
+ "license": "MIT",
+ "dependencies": {
+ "ansi-regex": "^6.0.1"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/strip-ansi?sponsor=1"
+ }
+ },
"node_modules/string.prototype.includes": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/string.prototype.includes/-/string.prototype.includes-2.0.1.tgz",
@@ -4919,6 +7053,18 @@
"url": "https://github.com/sponsors/ljharb"
}
},
+ "node_modules/strip-ansi": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
+ "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
+ "license": "MIT",
+ "dependencies": {
+ "ansi-regex": "^5.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
"node_modules/strip-bom": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz",
@@ -4929,6 +7075,18 @@
"node": ">=4"
}
},
+ "node_modules/strip-final-newline": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-3.0.0.tgz",
+ "integrity": "sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
"node_modules/strip-json-comments": {
"version": "3.1.1",
"resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz",
@@ -4991,6 +7149,56 @@
"url": "https://github.com/sponsors/ljharb"
}
},
+ "node_modules/system-architecture": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/system-architecture/-/system-architecture-0.1.0.tgz",
+ "integrity": "sha512-ulAk51I9UVUyJgxlv9M6lFot2WP3e7t8Kz9+IS6D4rVba1tR9kON+Ey69f+1R4Q8cd45Lod6a4IcJIxnzGc/zA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/tabbable": {
+ "version": "6.2.0",
+ "resolved": "https://registry.npmjs.org/tabbable/-/tabbable-6.2.0.tgz",
+ "integrity": "sha512-Cat63mxsVJlzYvN51JmVXIgNoUokrIaT2zLclCXjRd8boZ0004U4KCs/sToJ75C6sdlByWxpYnb5Boif1VSFew==",
+ "license": "MIT"
+ },
+ "node_modules/tailwindcss": {
+ "version": "4.1.11",
+ "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-4.1.11.tgz",
+ "integrity": "sha512-2E9TBm6MDD/xKYe+dvJZAmg3yxIEDNRc0jwlNyDg/4Fil2QcSLjFKGVff0lAf1jjeaArlG/M75Ey/EYr/OJtBA==",
+ "license": "MIT"
+ },
+ "node_modules/tapable": {
+ "version": "2.2.2",
+ "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.2.tgz",
+ "integrity": "sha512-Re10+NauLTMCudc7T5WLFLAwDhQ0JWdrMK+9B2M8zR5hRExKmsRDCBA7/aV/pNJFltmBFO5BAMlQFi/vq3nKOg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/tar": {
+ "version": "7.4.3",
+ "resolved": "https://registry.npmjs.org/tar/-/tar-7.4.3.tgz",
+ "integrity": "sha512-5S7Va8hKfV7W5U6g3aYxXmlPoZVAwUMy9AOKyF2fVuZa2UD3qZjg578OrLRt8PcNN1PleVaL/5/yYATNL0ICUw==",
+ "license": "ISC",
+ "dependencies": {
+ "@isaacs/fs-minipass": "^4.0.0",
+ "chownr": "^3.0.0",
+ "minipass": "^7.1.2",
+ "minizlib": "^3.0.1",
+ "mkdirp": "^3.0.1",
+ "yallist": "^5.0.0"
+ },
+ "engines": {
+ "node": ">=18"
+ }
+ },
"node_modules/tinyglobby": {
"version": "0.2.14",
"resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.14.tgz",
@@ -5036,6 +7244,18 @@
"url": "https://github.com/sponsors/jonschlinkert"
}
},
+ "node_modules/tmp": {
+ "version": "0.0.33",
+ "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz",
+ "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==",
+ "license": "MIT",
+ "dependencies": {
+ "os-tmpdir": "~1.0.2"
+ },
+ "engines": {
+ "node": ">=0.6.0"
+ }
+ },
"node_modules/to-regex-range": {
"version": "5.0.1",
"resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
@@ -5094,6 +7314,18 @@
"node": ">= 0.8.0"
}
},
+ "node_modules/type-fest": {
+ "version": "0.21.3",
+ "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz",
+ "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==",
+ "license": "(MIT OR CC0-1.0)",
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
"node_modules/typed-array-buffer": {
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.3.tgz",
@@ -5176,7 +7408,7 @@
"version": "5.8.3",
"resolved": "https://registry.npmjs.org/typescript/-/typescript-5.8.3.tgz",
"integrity": "sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ==",
- "dev": true,
+ "devOptional": true,
"license": "Apache-2.0",
"bin": {
"tsc": "bin/tsc",
@@ -5209,7 +7441,6 @@
"version": "6.21.0",
"resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz",
"integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==",
- "dev": true,
"license": "MIT"
},
"node_modules/unrs-resolver": {
@@ -5257,11 +7488,19 @@
"punycode": "^2.1.0"
}
},
+ "node_modules/use-sync-external-store": {
+ "version": "1.5.0",
+ "resolved": "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.5.0.tgz",
+ "integrity": "sha512-Rb46I4cGGVBmjamjphe8L/UnvJD+uPPtTkNvX5mZgqdbavhI4EbgIWJiIHXJ8bc/i9EQGPRh4DwEURJ552Do0A==",
+ "license": "MIT",
+ "peerDependencies": {
+ "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0"
+ }
+ },
"node_modules/which": {
"version": "2.0.2",
"resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
"integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
- "dev": true,
"license": "ISC",
"dependencies": {
"isexe": "^2.0.0"
@@ -5372,6 +7611,49 @@
"node": ">=0.10.0"
}
},
+ "node_modules/wrap-ansi": {
+ "version": "6.2.0",
+ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz",
+ "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==",
+ "license": "MIT",
+ "dependencies": {
+ "ansi-styles": "^4.0.0",
+ "string-width": "^4.1.0",
+ "strip-ansi": "^6.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/wrap-ansi/node_modules/emoji-regex": {
+ "version": "8.0.0",
+ "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
+ "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
+ "license": "MIT"
+ },
+ "node_modules/wrap-ansi/node_modules/string-width": {
+ "version": "4.2.3",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
+ "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
+ "license": "MIT",
+ "dependencies": {
+ "emoji-regex": "^8.0.0",
+ "is-fullwidth-code-point": "^3.0.0",
+ "strip-ansi": "^6.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/yallist": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/yallist/-/yallist-5.0.0.tgz",
+ "integrity": "sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw==",
+ "license": "BlueOak-1.0.0",
+ "engines": {
+ "node": ">=18"
+ }
+ },
"node_modules/yocto-queue": {
"version": "0.1.0",
"resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz",
@@ -5384,6 +7666,39 @@
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
+ },
+ "node_modules/yoctocolors": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/yoctocolors/-/yoctocolors-2.1.1.tgz",
+ "integrity": "sha512-GQHQqAopRhwU8Kt1DDM8NjibDXHC8eoh1erhGAJPEyveY9qqVeXvVikNKrDz69sHowPMorbPUrH/mx8c50eiBQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/yoctocolors-cjs": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/yoctocolors-cjs/-/yoctocolors-cjs-2.1.2.tgz",
+ "integrity": "sha512-cYVsTjKl8b+FrnidjibDWskAv7UKOfcwaVZdp/it9n1s9fU3IkgDbhdIRKCW4JDsAlECJY0ytoVPT3sK6kideA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/zod": {
+ "version": "4.0.10",
+ "resolved": "https://registry.npmjs.org/zod/-/zod-4.0.10.tgz",
+ "integrity": "sha512-3vB+UU3/VmLL2lvwcY/4RV2i9z/YU0DTV/tDuYjrwmx5WeJ7hwy+rGEEx8glHp6Yxw7ibRbKSaIFBgReRPe5KA==",
+ "license": "MIT",
+ "funding": {
+ "url": "https://github.com/sponsors/colinhacks"
+ }
}
}
}
diff --git a/package.json b/package.json
index 0ac4b8a..738ac91 100644
--- a/package.json
+++ b/package.json
@@ -9,17 +9,30 @@
"lint": "next lint"
},
"dependencies": {
+ "@auth/prisma-adapter": "^2.10.0",
+ "@headlessui/react": "^2.2.6",
+ "@prisma/client": "^6.12.0",
+ "@tailwindcss/postcss": "^4.1.11",
+ "auth": "^1.2.3",
+ "framer-motion": "^12.23.9",
+ "lucide-react": "^0.526.0",
+ "next": "15.4.4",
+ "next-auth": "^5.0.0-beta.29",
+ "postcss": "^8.5.6",
"react": "19.1.0",
"react-dom": "19.1.0",
- "next": "15.4.4"
+ "sonner": "^2.0.6",
+ "tailwindcss": "^4.1.11",
+ "zod": "^4.0.10"
},
"devDependencies": {
- "typescript": "^5",
+ "@eslint/eslintrc": "^3",
"@types/node": "^20",
"@types/react": "^19",
"@types/react-dom": "^19",
"eslint": "^9",
"eslint-config-next": "15.4.4",
- "@eslint/eslintrc": "^3"
+ "prisma": "^6.12.0",
+ "typescript": "^5"
}
}
diff --git a/postcss.config.mjs b/postcss.config.mjs
new file mode 100644
index 0000000..54e8739
--- /dev/null
+++ b/postcss.config.mjs
@@ -0,0 +1,6 @@
+const config = {
+ plugins: {
+ "@tailwindcss/postcss": {},
+ },
+};
+export default config;
\ No newline at end of file
diff --git a/prisma/migrations/20250727013821_init/migration.sql b/prisma/migrations/20250727013821_init/migration.sql
new file mode 100644
index 0000000..1810cc2
--- /dev/null
+++ b/prisma/migrations/20250727013821_init/migration.sql
@@ -0,0 +1,82 @@
+-- CreateTable
+CREATE TABLE "User" (
+ "id" TEXT NOT NULL,
+ "name" TEXT,
+ "email" TEXT,
+ "emailVerified" TIMESTAMP(3),
+ "image" TEXT,
+
+ CONSTRAINT "User_pkey" PRIMARY KEY ("id")
+);
+
+-- CreateTable
+CREATE TABLE "Account" (
+ "id" TEXT NOT NULL,
+ "userId" TEXT NOT NULL,
+ "type" TEXT NOT NULL,
+ "provider" TEXT NOT NULL,
+ "providerAccountId" TEXT NOT NULL,
+ "refresh_token" TEXT,
+ "access_token" TEXT,
+ "expires_at" INTEGER,
+ "id_token" TEXT,
+ "scope" TEXT,
+ "token_type" TEXT,
+ "session_state" TEXT,
+ "oauth_token_secret" TEXT,
+ "oauth_token" TEXT,
+
+ CONSTRAINT "Account_pkey" PRIMARY KEY ("id")
+);
+
+-- CreateTable
+CREATE TABLE "Session" (
+ "id" TEXT NOT NULL,
+ "sessionToken" TEXT NOT NULL,
+ "userId" TEXT NOT NULL,
+ "expires" TIMESTAMP(3) NOT NULL,
+
+ CONSTRAINT "Session_pkey" PRIMARY KEY ("id")
+);
+
+-- CreateTable
+CREATE TABLE "VerificationToken" (
+ "identifier" TEXT NOT NULL,
+ "token" TEXT NOT NULL,
+ "expires" TIMESTAMP(3) NOT NULL
+);
+
+-- CreateTable
+CREATE TABLE "Post" (
+ "id" TEXT NOT NULL,
+ "title" TEXT NOT NULL,
+ "content" TEXT,
+ "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
+ "authorId" TEXT NOT NULL,
+
+ CONSTRAINT "Post_pkey" PRIMARY KEY ("id")
+);
+
+-- CreateIndex
+CREATE UNIQUE INDEX "User_email_key" ON "User"("email");
+
+-- CreateIndex
+CREATE UNIQUE INDEX "Account_provider_providerAccountId_key" ON "Account"("provider", "providerAccountId");
+
+-- CreateIndex
+CREATE UNIQUE INDEX "Session_sessionToken_key" ON "Session"("sessionToken");
+
+-- CreateIndex
+CREATE UNIQUE INDEX "VerificationToken_token_key" ON "VerificationToken"("token");
+
+-- CreateIndex
+CREATE UNIQUE INDEX "VerificationToken_identifier_token_key" ON "VerificationToken"("identifier", "token");
+
+-- AddForeignKey
+ALTER TABLE "Account" ADD CONSTRAINT "Account_userId_fkey" FOREIGN KEY ("userId") REFERENCES "User"("id") ON DELETE CASCADE ON UPDATE CASCADE;
+
+-- AddForeignKey
+ALTER TABLE "Session" ADD CONSTRAINT "Session_userId_fkey" FOREIGN KEY ("userId") REFERENCES "User"("id") ON DELETE CASCADE ON UPDATE CASCADE;
+
+-- AddForeignKey
+ALTER TABLE "Post" ADD CONSTRAINT "Post_authorId_fkey" FOREIGN KEY ("authorId") REFERENCES "User"("id") ON DELETE CASCADE ON UPDATE CASCADE;
diff --git a/prisma/migrations/20250727025700_add_mcname/migration.sql b/prisma/migrations/20250727025700_add_mcname/migration.sql
new file mode 100644
index 0000000..a76ec63
--- /dev/null
+++ b/prisma/migrations/20250727025700_add_mcname/migration.sql
@@ -0,0 +1,11 @@
+/*
+ Warnings:
+
+ - A unique constraint covering the columns `[mcName]` on the table `User` will be added. If there are existing duplicate values, this will fail.
+
+*/
+-- AlterTable
+ALTER TABLE "User" ADD COLUMN "mcName" TEXT;
+
+-- CreateIndex
+CREATE UNIQUE INDEX "User_mcName_key" ON "User"("mcName");
diff --git a/prisma/migrations/20250727031005_project/migration.sql b/prisma/migrations/20250727031005_project/migration.sql
new file mode 100644
index 0000000..74a911b
--- /dev/null
+++ b/prisma/migrations/20250727031005_project/migration.sql
@@ -0,0 +1,14 @@
+-- CreateTable
+CREATE TABLE "Project" (
+ "id" TEXT NOT NULL,
+ "joueur" TEXT NOT NULL,
+ "etat" TEXT NOT NULL,
+ "monde" TEXT NOT NULL,
+ "projet" TEXT NOT NULL,
+ "description" TEXT NOT NULL,
+ "coords" TEXT NOT NULL,
+ "tags" TEXT[] DEFAULT ARRAY[]::TEXT[],
+ "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
+
+ CONSTRAINT "Project_pkey" PRIMARY KEY ("id")
+);
diff --git a/prisma/migrations/20250727203115_add_availability_model/migration.sql b/prisma/migrations/20250727203115_add_availability_model/migration.sql
new file mode 100644
index 0000000..c34ef4f
--- /dev/null
+++ b/prisma/migrations/20250727203115_add_availability_model/migration.sql
@@ -0,0 +1,15 @@
+-- CreateTable
+CREATE TABLE "Availability" (
+ "id" TEXT NOT NULL,
+ "userId" TEXT NOT NULL,
+ "slots" TEXT[],
+ "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
+
+ CONSTRAINT "Availability_pkey" PRIMARY KEY ("id")
+);
+
+-- CreateIndex
+CREATE UNIQUE INDEX "Availability_userId_key" ON "Availability"("userId");
+
+-- AddForeignKey
+ALTER TABLE "Availability" ADD CONSTRAINT "Availability_userId_fkey" FOREIGN KEY ("userId") REFERENCES "User"("id") ON DELETE CASCADE ON UPDATE CASCADE;
diff --git a/prisma/migrations/20250727203953_add_availability_model/migration.sql b/prisma/migrations/20250727203953_add_availability_model/migration.sql
new file mode 100644
index 0000000..4b37dc6
--- /dev/null
+++ b/prisma/migrations/20250727203953_add_availability_model/migration.sql
@@ -0,0 +1,23 @@
+/*
+ Warnings:
+
+ - You are about to drop the column `slots` on the `Availability` table. All the data in the column will be lost.
+ - Added the required column `day` to the `Availability` table without a default value. This is not possible if the table is not empty.
+ - Added the required column `fromHour` to the `Availability` table without a default value. This is not possible if the table is not empty.
+ - Added the required column `toHour` to the `Availability` table without a default value. This is not possible if the table is not empty.
+
+*/
+-- DropForeignKey
+ALTER TABLE "Availability" DROP CONSTRAINT "Availability_userId_fkey";
+
+-- DropIndex
+DROP INDEX "Availability_userId_key";
+
+-- AlterTable
+ALTER TABLE "Availability" DROP COLUMN "slots",
+ADD COLUMN "day" INTEGER NOT NULL,
+ADD COLUMN "fromHour" INTEGER NOT NULL,
+ADD COLUMN "toHour" INTEGER NOT NULL;
+
+-- AddForeignKey
+ALTER TABLE "Availability" ADD CONSTRAINT "Availability_userId_fkey" FOREIGN KEY ("userId") REFERENCES "User"("id") ON DELETE RESTRICT ON UPDATE CASCADE;
diff --git a/prisma/migrations/migration_lock.toml b/prisma/migrations/migration_lock.toml
new file mode 100644
index 0000000..044d57c
--- /dev/null
+++ b/prisma/migrations/migration_lock.toml
@@ -0,0 +1,3 @@
+# Please do not edit this file manually
+# It should be added in your version-control system (e.g., Git)
+provider = "postgresql"
diff --git a/prisma/schema.prisma b/prisma/schema.prisma
new file mode 100644
index 0000000..fc2d82c
--- /dev/null
+++ b/prisma/schema.prisma
@@ -0,0 +1,95 @@
+datasource db {
+ provider = "postgresql"
+ url = env("DATABASE_URL")
+}
+
+generator client {
+ provider = "prisma-client-js"
+}
+
+/// ---- NextAuth standard models ----
+model User {
+ id String @id @default(cuid())
+ name String?
+ email String? @unique
+ emailVerified DateTime?
+ image String?
+ mcName String? @unique
+ accounts Account[]
+ sessions Session[]
+ posts Post[]
+
+ availability Availability[]
+}
+
+model Account {
+ id String @id @default(cuid())
+ userId String
+ type String
+ provider String
+ providerAccountId String
+ refresh_token String? @db.Text
+ access_token String? @db.Text
+ expires_at Int?
+ id_token String? @db.Text
+ scope String?
+ token_type String?
+ session_state String?
+ oauth_token_secret String?
+ oauth_token String?
+
+ user User @relation(fields: [userId], references: [id], onDelete: Cascade)
+
+ @@unique([provider, providerAccountId])
+}
+
+model Session {
+ id String @id @default(cuid())
+ sessionToken String @unique
+ userId String
+ expires DateTime
+
+ user User @relation(fields: [userId], references: [id], onDelete: Cascade)
+}
+
+model VerificationToken {
+ identifier String
+ token String @unique
+ expires DateTime
+
+ @@unique([identifier, token])
+}
+
+/// ---- Example custom model ----
+model Post {
+ id String @id @default(cuid())
+ title String
+ content String?
+ createdAt DateTime @default(now())
+ authorId String
+
+ author User @relation(fields: [authorId], references: [id], onDelete: Cascade)
+}
+
+model Project {
+ id String @id @default(cuid())
+ joueur String
+ etat String
+ monde String
+ projet String
+ description String
+ coords String?
+ tags String[] @default([])
+ createdAt DateTime @default(now())
+}
+
+model Availability {
+ id String @id @default(cuid())
+ userId String
+ day Int // 0 = Lundi … 6 = Dimanche
+ fromHour Int // 0–23
+ toHour Int // 0–23, > fromHour
+ createdAt DateTime @default(now())
+
+ user User @relation(fields: [userId], references: [id])
+}
\ No newline at end of file
diff --git a/public/ads/riseofkinkdom.jpeg b/public/ads/riseofkinkdom.jpeg
new file mode 100644
index 0000000..bd3711c
Binary files /dev/null and b/public/ads/riseofkinkdom.jpeg differ
diff --git a/public/ads/voat.png b/public/ads/voat.png
new file mode 100644
index 0000000..39baf7a
Binary files /dev/null and b/public/ads/voat.png differ
diff --git a/public/aystone-saison2.png b/public/aystone-saison2.png
new file mode 100644
index 0000000..ba947ba
Binary files /dev/null and b/public/aystone-saison2.png differ
diff --git a/public/aystone.png b/public/aystone.png
new file mode 100644
index 0000000..e1abf00
Binary files /dev/null and b/public/aystone.png differ
diff --git a/public/charte-couleurs.png b/public/charte-couleurs.png
new file mode 100644
index 0000000..42d9ba3
Binary files /dev/null and b/public/charte-couleurs.png differ
diff --git a/public/file.svg b/public/file.svg
deleted file mode 100644
index 004145c..0000000
--- a/public/file.svg
+++ /dev/null
@@ -1 +0,0 @@
-
\ No newline at end of file
diff --git a/public/globe.svg b/public/globe.svg
deleted file mode 100644
index 567f17b..0000000
--- a/public/globe.svg
+++ /dev/null
@@ -1 +0,0 @@
-
\ No newline at end of file
diff --git a/public/next.svg b/public/next.svg
deleted file mode 100644
index 5174b28..0000000
--- a/public/next.svg
+++ /dev/null
@@ -1 +0,0 @@
-
\ No newline at end of file
diff --git a/public/vercel.svg b/public/vercel.svg
deleted file mode 100644
index 7705396..0000000
--- a/public/vercel.svg
+++ /dev/null
@@ -1 +0,0 @@
-
\ No newline at end of file
diff --git a/public/window.svg b/public/window.svg
deleted file mode 100644
index b2b2a44..0000000
--- a/public/window.svg
+++ /dev/null
@@ -1 +0,0 @@
-
\ No newline at end of file
diff --git a/tsconfig.json b/tsconfig.json
index d8b9323..bce0368 100644
--- a/tsconfig.json
+++ b/tsconfig.json
@@ -22,6 +22,6 @@
"@/*": ["./*"]
}
},
- "include": ["next-env.d.ts", "**/*.ts", "**/*.tsx", ".next/types/**/*.ts"],
+ "include": ["next-env.d.ts","next-env.d.ts", "**/*.ts", "**/*.tsx", ".next/types/**/*.ts"],
"exclude": ["node_modules"]
-}
+}
\ No newline at end of file
diff --git a/types/next-auth.d.ts b/types/next-auth.d.ts
new file mode 100644
index 0000000..ce812a6
--- /dev/null
+++ b/types/next-auth.d.ts
@@ -0,0 +1,16 @@
+import "next-auth";
+
+declare module "next-auth" {
+ interface Session {
+ user: {
+ id: string;
+ name?: string | null;
+ email?: string | null;
+ image?: string | null;
+ };
+ }
+
+ interface User {
+ id: string;
+ }
+}
\ No newline at end of file