diff --git a/.gitignore b/.gitignore
index 5ef6a52..b831ca9 100644
--- a/.gitignore
+++ b/.gitignore
@@ -16,6 +16,7 @@
# next.js
/.next/
/out/
+/dist/
# production
/build
diff --git a/README.md b/README.md
deleted file mode 100644
index eb82ada..0000000
--- a/README.md
+++ /dev/null
@@ -1,90 +0,0 @@
-### 1. Home / Landing
-
-**Goal:** instant context
-
-* Name + role
- *“Software Developer focused on X”*
-* 1-line value statement
- *“I build reliable backend systems and clean UIs.”*
-* Primary CTA: **View Projects** or **GitHub**
-
----
-
-### 2. Projects (most important page)
-
-**This is where hiring decisions start.**
-
-For each project:
-
-* **What it is** (1 sentence)
-* **Tech stack**
-* **Your role** (solo / team / size)
-* **Key challenges & decisions**
-* **What you’d improve next**
-
-Examples:
-
-* “Self-hosted document management system (Docker, Python, PostgreSQL)”
-* “Matrix server setup & federation experiments”
-* “WPF app solving UI threading issues”
-
-👉 3–5 *good* projects beat 10 shallow ones.
-
----
-
-### 3. About (technical, not fluffy)
-
-Think “senior dev intro”, not life story.
-
-Include:
-
-* What kind of problems you enjoy solving
-* How you approach learning & debugging
-* What environments you work best in
-
-Keep it to ~2 short paragraphs.
-
----
-
-### 4. Skills / Tech Stack
-
-**Grouped, not buzzword soup.**
-
-Example:
-
-* **Languages:** …
-* **Frameworks:** …
-* **Infrastructure / DevOps:** Docker, Linux, CI/CD
-* **Databases:** …
-* **Concepts:** REST, async, threading, security basics
-
-Bonus points:
-
-* “Comfortable with” vs “Familiar with”
-
----
-
-### 5. Experience
-
-* Jobs, freelance, serious hobby projects
-* Focus on **impact**, not duties
-
-Example:
-
-> “Maintained and extended internal tooling used by X users”
-
----
-
-### 6. Resume (PDF)
-
-* One click download
-* Matches the portfolio (no contradictions)
-
----
-
-### 7. Contact
-
-* Email
-* GitHub
-* LinkedIn
-* (Optional) location / timezone
\ No newline at end of file
diff --git a/app/about/page.tsx b/app/about/page.tsx
deleted file mode 100644
index a026bca..0000000
--- a/app/about/page.tsx
+++ /dev/null
@@ -1,56 +0,0 @@
-import Link from "next/link";
-
-export default function Page() {
- return (
-
- Über mich
-
- Softwareentwickler:
-
- Bei der Softwareentwicklung ist es mein Anspruch, ein System zu bauen, das nicht einfach nur
- funktioniert, sondern robust, flexibel und zukunftorientiert ist. Mir ist wichtig sicherzustellen,
- das Features auf einem soliden Fundament aufbauen. Dafür bleibe ich immer am Ball, um neue Ansätze
- zu erlernen und die Trends der Branche im Auge zu behalten. Ich verbinde meine Expertise in
- verschiedenen Teilgebieten der Informatik um eine sauber integrierte Lösung für die vor mir
- liegenden Probleme zu finden.
-
- Ich arbeite strukturiert und betrachte das große Ganze, kann mich allerdings auch an Details festbeißen,
- sollte der Bedarf bestehen.
-
- Mein Ziel ist es Software zu bauen, die dem Nutzer aus dem Weg geht und eine Umgebung zu schaffen,
- in der sowohl Endnutzer als auch Entwickler so einfach wie möglich vorran kommen können.
-
- Dies gilt sowohl für meine professionelle Arbeit als auch für side projects.
-
-
- Zu meinen Projekten
-
-
-
-
-
- Motorradfahrer:
-
- Der 1. April ist immer einer der besten Tage im Jahr. Die neue Motorradsaison beginnt. Als Kind fuhr
- ich oft bei anderen mit und wusste immer schon, dass ich einmal den Führerschein machen würde.
- Nach vielen Jahren, in denen ich weder Zeit noch Geld hatte, machte ich 2023 den A-Klasse Schein.
- Mit meiner geliebten Kawa fahre ich häufig meine Haustrecke über den Arber. Seit letztem Jahr auch
- mit Sozia.
-
-
-
- Astrofotograf:
-
- Was als P-Seminar während der Oberstufe begannt, entwickelte sich über die Jahre in ein richtiges
- Hobby. Der Weltraum ist so ein unbegreifliches Konzept, dass es fast surreal erscheint, wie viel
- eine einfache Kamera doch einfangen kann. Viele Nächte verbringe ich mit Stativ und DSLR draußen
- auf einer weiten Wiese, um am nächsten Tag aufgeregt am PC die Ergebnisse zu betrachten. Mein
- Lieblingsmotiv ist der Orion Nebel, da er selbst mit dem bloßen Auge erkennbar ist. Ein so tolles
- Motiv, das auf das untrainierte Auge nur wie ein weiterer Stern aussieht. Für die nächsten Jahre
- habe ich mir vorgenommen, auf ein Teleskop mit Star-Tracker aufzurüsten und so noch viele weitere
- Beobachtungsziele in meinen Katalog aufzunehmen.
-
-
-
- );
-}
diff --git a/app/components/Header.tsx b/app/components/Header.tsx
deleted file mode 100644
index fdeeca2..0000000
--- a/app/components/Header.tsx
+++ /dev/null
@@ -1,9 +0,0 @@
-export default function Header({
- children,
-}: Readonly<{
- children: React.ReactNode;
-}>) {
- return
-}
\ No newline at end of file
diff --git a/app/components/NavItem.tsx b/app/components/NavItem.tsx
deleted file mode 100644
index cd85040..0000000
--- a/app/components/NavItem.tsx
+++ /dev/null
@@ -1,25 +0,0 @@
-'use client'
-import Link from "next/link";
-import { usePathname } from "next/navigation";
-
-export default function NavItem({
- children,
- href
-}: Readonly<{
- children: React.ReactNode;
- href: string;
-}>) {
- const highlighted = usePathname() == href;
- return (
-
- {children}
-
-
- );
-}
\ No newline at end of file
diff --git a/app/components/Navbar.tsx b/app/components/Navbar.tsx
deleted file mode 100644
index 68b8ce8..0000000
--- a/app/components/Navbar.tsx
+++ /dev/null
@@ -1,9 +0,0 @@
-export default function Navbar({
- children,
-}: Readonly<{
- children: React.ReactNode;
-}>) {
- return
- {children}
-
-}
\ No newline at end of file
diff --git a/app/components/Section.tsx b/app/components/Section.tsx
deleted file mode 100644
index 1fa8681..0000000
--- a/app/components/Section.tsx
+++ /dev/null
@@ -1,9 +0,0 @@
-export default function Section({
- children,
-}: Readonly<{
- children: React.ReactNode;
-}>) {
- return
-}
\ No newline at end of file
diff --git a/app/components/SectionContent.tsx b/app/components/SectionContent.tsx
deleted file mode 100644
index 37d96ac..0000000
--- a/app/components/SectionContent.tsx
+++ /dev/null
@@ -1,9 +0,0 @@
-export default function SectionContent({
- children,
-}: Readonly<{
- children: React.ReactNode;
-}>) {
- return
- {children}
-
-}
\ No newline at end of file
diff --git a/app/components/SectionTitle.tsx b/app/components/SectionTitle.tsx
deleted file mode 100644
index 6506326..0000000
--- a/app/components/SectionTitle.tsx
+++ /dev/null
@@ -1,9 +0,0 @@
-export default function SectionTitle({
- children,
-}: Readonly<{
- children: React.ReactNode;
-}>) {
- return
- {children}
-
-}
\ No newline at end of file
diff --git a/app/contact/page.tsx b/app/contact/page.tsx
deleted file mode 100644
index 34d008a..0000000
--- a/app/contact/page.tsx
+++ /dev/null
@@ -1,23 +0,0 @@
-import Link from "next/link";
-
-export default function Page() {
- return (
-
-
- Kontakt
- Github
-
-
- LinkedIn
-
-
- karl.mike2002@gmail.com
-
-
- 01512 2597580
-
-
-
-
- );
-}
diff --git a/app/favicon.ico b/app/favicon.ico
deleted file mode 100644
index 59ae0b0..0000000
Binary files a/app/favicon.ico and /dev/null differ
diff --git a/app/globals.css b/app/globals.css
deleted file mode 100644
index 1c8b4fe..0000000
--- a/app/globals.css
+++ /dev/null
@@ -1,27 +0,0 @@
-@import url('https://fonts.googleapis.com/css2?family=Space+Grotesk:wght@300..700&display=swap');
-@import "tailwindcss";
-
-* {
- box-sizing: border-box;
-}
-
-body {
- min-height: 100vh;
- font-family: "Space Grotesk", sans-serif;
- color: #fff;
- background: #000;
-}
-
-.bg{
- width: 100vw;
- height: 100vh;
- position: fixed;
- top: 0;
- left: 0;
- z-index: -999;
- background:
- radial-gradient(circle at 0% 0%, #da0202 0%, transparent 50%),
- radial-gradient(circle at 25% -5%, #da0202 0%, transparent 40%),
- radial-gradient(circle at 100% 100%, #da0202 0%, transparent 40%),
- #000
-}
\ No newline at end of file
diff --git a/app/images/logo.png b/app/images/logo.png
deleted file mode 100644
index 24c8d97..0000000
Binary files a/app/images/logo.png and /dev/null differ
diff --git a/app/layout.tsx b/app/layout.tsx
deleted file mode 100644
index f8720b7..0000000
--- a/app/layout.tsx
+++ /dev/null
@@ -1,42 +0,0 @@
-import type { Metadata } from "next";
-import "./globals.css";
-import Navbar from "./components/Navbar";
-import NavItem from "./components/NavItem";
-import Header from "./components/Header";
-import Image from "next/image";
-import logo from "./images/logo.png"
-import Link from "next/link";
-import { SpeedInsights } from '@vercel/speed-insights/next';
-import { Analytics } from '@vercel/analytics/next';
-
-export const metadata: Metadata = {
- title: "Portfolio - Mike Karl",
-};
-
-export default function RootLayout({
- children,
-}: Readonly<{
- children: React.ReactNode;
-}>) {
- return (
-
-
-
-
- Home
- Projekte
- About
- Kontakt
-
-
-
-
-
- {children}
-
-
-
-
-
- );
-}
diff --git a/app/not-found.tsx b/app/not-found.tsx
deleted file mode 100644
index 9dd1381..0000000
--- a/app/not-found.tsx
+++ /dev/null
@@ -1,21 +0,0 @@
-import Link from "next/link";
-
-export default function NotFound() {
- return (
-
-
-
404
-
Page Not Found
-
- Sorry, the page you're looking for doesn't exist.
-
-
- Back to Home
-
-
-
- );
-}
diff --git a/app/page.tsx b/app/page.tsx
deleted file mode 100644
index 195e300..0000000
--- a/app/page.tsx
+++ /dev/null
@@ -1,44 +0,0 @@
-'use client'
-import { AnimatePresence, motion } from "framer-motion";
-import Link from "next/link";
-import { useEffect, useState } from "react";
-
-export default function Home() {
- const jobs = ["Software", "Fullstack", "Web", "System", "Rust"];
- const [job, setJob] = useState(0);
-
- useEffect(() => {
- const interval = setInterval(() => {
- setJob((prev) => (prev + 1) % jobs.length);
- }, 3000);
-
- return () => clearInterval(interval);
- }, []);
-
- return (
-
-
- Mike
- Karl
-
-
- {jobs[job]} Entwickler
-
-
- Mein Github
-
-
- Mein LinkedIn
-
-
-
-
- );
-}
\ No newline at end of file
diff --git a/app/projects/page.tsx b/app/projects/page.tsx
deleted file mode 100644
index 03a3e67..0000000
--- a/app/projects/page.tsx
+++ /dev/null
@@ -1,7 +0,0 @@
-export default function Page() {
- return (
-
- Projects
-
- );
-}
diff --git a/next.config.ts b/next.config.ts
index e9ffa30..4b17ba1 100644
--- a/next.config.ts
+++ b/next.config.ts
@@ -1,7 +1,11 @@
import type { NextConfig } from "next";
const nextConfig: NextConfig = {
- /* config options here */
+ output: "export",
+ distDir: "dist",
+ images: {
+ unoptimized: true,
+ },
};
export default nextConfig;
diff --git a/package-lock.json b/package-lock.json
index 477f9a7..0368c18 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -1,27 +1,30 @@
{
"name": "portfolio",
- "version": "0.1.0",
+ "version": "0.0.0",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
"name": "portfolio",
- "version": "0.1.0",
+ "version": "0.0.0",
"dependencies": {
- "@vercel/analytics": "^1.6.1",
- "@vercel/speed-insights": "^1.3.1",
- "framer-motion": "^12.33.0",
- "next": "^15.5.12",
- "react": "19.1.0",
- "react-dom": "19.1.0"
+ "clsx": "^2.1.1",
+ "gsap": "^3.15.0",
+ "lucide-react": "^1.8.0",
+ "next": "^16.2.4",
+ "react": "^19.2.5",
+ "react-dom": "^19.2.5",
+ "tailwind-merge": "^3.5.0",
+ "tailwindcss": "^4.2.4"
},
"devDependencies": {
- "@tailwindcss/postcss": "^4",
- "@types/node": "^20",
- "@types/react": "^19",
- "@types/react-dom": "^19",
- "tailwindcss": "^4",
- "typescript": "^5"
+ "@tailwindcss/postcss": "^4.2.4",
+ "@types/node": "^24.12.2",
+ "@types/react": "^19.2.14",
+ "@types/react-dom": "^19.2.3",
+ "eslint": "^10.2.1",
+ "postcss": "^8.5.0",
+ "typescript": "~6.0.2"
}
},
"node_modules/@alloc/quick-lru": {
@@ -38,19 +41,192 @@
}
},
"node_modules/@emnapi/runtime": {
- "version": "1.5.0",
- "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.5.0.tgz",
- "integrity": "sha512-97/BJ3iXHww3djw6hYIfErCZFee7qCtrneuLa20UXFCOTCfBM2cvQHjWJ2EG0s0MtdNwInarqCTz35i4wWXHsQ==",
+ "version": "1.10.0",
+ "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.10.0.tgz",
+ "integrity": "sha512-ewvYlk86xUoGI0zQRNq/mC+16R1QeDlKQy21Ki3oSYXNgLb45GV1P6A0M+/s6nyCuNDqe5VpaY84BzXGwVbwFA==",
"license": "MIT",
"optional": true,
"dependencies": {
"tslib": "^2.4.0"
}
},
+ "node_modules/@eslint-community/eslint-utils": {
+ "version": "4.9.1",
+ "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.9.1.tgz",
+ "integrity": "sha512-phrYmNiYppR7znFEdqgfWHXR6NCkZEK7hwWDHZUjit/2/U0r6XvkDl0SYnoM51Hq7FhCGdLDT6zxCCOY1hexsQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "eslint-visitor-keys": "^3.4.3"
+ },
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint"
+ },
+ "peerDependencies": {
+ "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0"
+ }
+ },
+ "node_modules/@eslint-community/eslint-utils/node_modules/eslint-visitor-keys": {
+ "version": "3.4.3",
+ "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz",
+ "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint"
+ }
+ },
+ "node_modules/@eslint-community/regexpp": {
+ "version": "4.12.2",
+ "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.2.tgz",
+ "integrity": "sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": "^12.0.0 || ^14.0.0 || >=16.0.0"
+ }
+ },
+ "node_modules/@eslint/config-array": {
+ "version": "0.23.5",
+ "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.23.5.tgz",
+ "integrity": "sha512-Y3kKLvC1dvTOT+oGlqNQ1XLqK6D1HU2YXPc52NmAlJZbMMWDzGYXMiPRJ8TYD39muD/OTjlZmNJ4ib7dvSrMBA==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@eslint/object-schema": "^3.0.5",
+ "debug": "^4.3.1",
+ "minimatch": "^10.2.4"
+ },
+ "engines": {
+ "node": "^20.19.0 || ^22.13.0 || >=24"
+ }
+ },
+ "node_modules/@eslint/config-helpers": {
+ "version": "0.5.5",
+ "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.5.5.tgz",
+ "integrity": "sha512-eIJYKTCECbP/nsKaaruF6LW967mtbQbsw4JTtSVkUQc9MneSkbrgPJAbKl9nWr0ZeowV8BfsarBmPpBzGelA2w==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@eslint/core": "^1.2.1"
+ },
+ "engines": {
+ "node": "^20.19.0 || ^22.13.0 || >=24"
+ }
+ },
+ "node_modules/@eslint/core": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/@eslint/core/-/core-1.2.1.tgz",
+ "integrity": "sha512-MwcE1P+AZ4C6DWlpin/OmOA54mmIZ/+xZuJiQd4SyB29oAJjN30UW9wkKNptW2ctp4cEsvhlLY/CsQ1uoHDloQ==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@types/json-schema": "^7.0.15"
+ },
+ "engines": {
+ "node": "^20.19.0 || ^22.13.0 || >=24"
+ }
+ },
+ "node_modules/@eslint/object-schema": {
+ "version": "3.0.5",
+ "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-3.0.5.tgz",
+ "integrity": "sha512-vqTaUEgxzm+YDSdElad6PiRoX4t8VGDjCtt05zn4nU810UIx/uNEV7/lZJ6KwFThKZOzOxzXy48da+No7HZaMw==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "engines": {
+ "node": "^20.19.0 || ^22.13.0 || >=24"
+ }
+ },
+ "node_modules/@eslint/plugin-kit": {
+ "version": "0.7.1",
+ "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.7.1.tgz",
+ "integrity": "sha512-rZAP3aVgB9ds9KOeUSL+zZ21hPmo8dh6fnIFwRQj5EAZl9gzR7wxYbYXYysAM8CTqGmUGyp2S4kUdV17MnGuWQ==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@eslint/core": "^1.2.1",
+ "levn": "^0.4.1"
+ },
+ "engines": {
+ "node": "^20.19.0 || ^22.13.0 || >=24"
+ }
+ },
+ "node_modules/@humanfs/core": {
+ "version": "0.19.2",
+ "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.2.tgz",
+ "integrity": "sha512-UhXNm+CFMWcbChXywFwkmhqjs3PRCmcSa/hfBgLIb7oQ5HNb1wS0icWsGtSAUNgefHeI+eBrA8I1fxmbHsGdvA==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@humanfs/types": "^0.15.0"
+ },
+ "engines": {
+ "node": ">=18.18.0"
+ }
+ },
+ "node_modules/@humanfs/node": {
+ "version": "0.16.8",
+ "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.8.tgz",
+ "integrity": "sha512-gE1eQNZ3R++kTzFUpdGlpmy8kDZD/MLyHqDwqjkVQI0JMdI1D51sy1H958PNXYkM2rAac7e5/CnIKZrHtPh3BQ==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@humanfs/core": "^0.19.2",
+ "@humanfs/types": "^0.15.0",
+ "@humanwhocodes/retry": "^0.4.0"
+ },
+ "engines": {
+ "node": ">=18.18.0"
+ }
+ },
+ "node_modules/@humanfs/types": {
+ "version": "0.15.0",
+ "resolved": "https://registry.npmjs.org/@humanfs/types/-/types-0.15.0.tgz",
+ "integrity": "sha512-ZZ1w0aoQkwuUuC7Yf+7sdeaNfqQiiLcSRbfI08oAxqLtpXQr9AIVX7Ay7HLDuiLYAaFPu8oBYNq/QIi9URHJ3Q==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "engines": {
+ "node": ">=18.18.0"
+ }
+ },
+ "node_modules/@humanwhocodes/module-importer": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz",
+ "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "engines": {
+ "node": ">=12.22"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/nzakas"
+ }
+ },
+ "node_modules/@humanwhocodes/retry": {
+ "version": "0.4.3",
+ "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.3.tgz",
+ "integrity": "sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "engines": {
+ "node": ">=18.18"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/nzakas"
+ }
+ },
"node_modules/@img/colour": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/@img/colour/-/colour-1.0.0.tgz",
- "integrity": "sha512-A5P/LfWGFSl6nsckYtjw9da+19jB8hkJ6ACTGcDfEJ0aE+l2n2El7dsVM7UVHZQ9s2lmYMWlrS21YLy2IR1LUw==",
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/@img/colour/-/colour-1.1.0.tgz",
+ "integrity": "sha512-Td76q7j57o/tLVdgS746cYARfSyxk8iEfRxewL9h4OMzYhbW4TAcppl0mT4eyqXddh6L/jwoM75mo7ixa/pCeQ==",
"license": "MIT",
"optional": true,
"engines": {
@@ -58,9 +234,9 @@
}
},
"node_modules/@img/sharp-darwin-arm64": {
- "version": "0.34.4",
- "resolved": "https://registry.npmjs.org/@img/sharp-darwin-arm64/-/sharp-darwin-arm64-0.34.4.tgz",
- "integrity": "sha512-sitdlPzDVyvmINUdJle3TNHl+AG9QcwiAMsXmccqsCOMZNIdW2/7S26w0LyU8euiLVzFBL3dXPwVCq/ODnf2vA==",
+ "version": "0.34.5",
+ "resolved": "https://registry.npmjs.org/@img/sharp-darwin-arm64/-/sharp-darwin-arm64-0.34.5.tgz",
+ "integrity": "sha512-imtQ3WMJXbMY4fxb/Ndp6HBTNVtWCUI0WdobyheGf5+ad6xX8VIDO8u2xE4qc/fr08CKG/7dDseFtn6M6g/r3w==",
"cpu": [
"arm64"
],
@@ -76,13 +252,13 @@
"url": "https://opencollective.com/libvips"
},
"optionalDependencies": {
- "@img/sharp-libvips-darwin-arm64": "1.2.3"
+ "@img/sharp-libvips-darwin-arm64": "1.2.4"
}
},
"node_modules/@img/sharp-darwin-x64": {
- "version": "0.34.4",
- "resolved": "https://registry.npmjs.org/@img/sharp-darwin-x64/-/sharp-darwin-x64-0.34.4.tgz",
- "integrity": "sha512-rZheupWIoa3+SOdF/IcUe1ah4ZDpKBGWcsPX6MT0lYniH9micvIU7HQkYTfrx5Xi8u+YqwLtxC/3vl8TQN6rMg==",
+ "version": "0.34.5",
+ "resolved": "https://registry.npmjs.org/@img/sharp-darwin-x64/-/sharp-darwin-x64-0.34.5.tgz",
+ "integrity": "sha512-YNEFAF/4KQ/PeW0N+r+aVVsoIY0/qxxikF2SWdp+NRkmMB7y9LBZAVqQ4yhGCm/H3H270OSykqmQMKLBhBJDEw==",
"cpu": [
"x64"
],
@@ -98,13 +274,13 @@
"url": "https://opencollective.com/libvips"
},
"optionalDependencies": {
- "@img/sharp-libvips-darwin-x64": "1.2.3"
+ "@img/sharp-libvips-darwin-x64": "1.2.4"
}
},
"node_modules/@img/sharp-libvips-darwin-arm64": {
- "version": "1.2.3",
- "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-arm64/-/sharp-libvips-darwin-arm64-1.2.3.tgz",
- "integrity": "sha512-QzWAKo7kpHxbuHqUC28DZ9pIKpSi2ts2OJnoIGI26+HMgq92ZZ4vk8iJd4XsxN+tYfNJxzH6W62X5eTcsBymHw==",
+ "version": "1.2.4",
+ "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-arm64/-/sharp-libvips-darwin-arm64-1.2.4.tgz",
+ "integrity": "sha512-zqjjo7RatFfFoP0MkQ51jfuFZBnVE2pRiaydKJ1G/rHZvnsrHAOcQALIi9sA5co5xenQdTugCvtb1cuf78Vf4g==",
"cpu": [
"arm64"
],
@@ -118,9 +294,9 @@
}
},
"node_modules/@img/sharp-libvips-darwin-x64": {
- "version": "1.2.3",
- "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-x64/-/sharp-libvips-darwin-x64-1.2.3.tgz",
- "integrity": "sha512-Ju+g2xn1E2AKO6YBhxjj+ACcsPQRHT0bhpglxcEf+3uyPY+/gL8veniKoo96335ZaPo03bdDXMv0t+BBFAbmRA==",
+ "version": "1.2.4",
+ "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-x64/-/sharp-libvips-darwin-x64-1.2.4.tgz",
+ "integrity": "sha512-1IOd5xfVhlGwX+zXv2N93k0yMONvUlANylbJw1eTah8K/Jtpi15KC+WSiaX/nBmbm2HxRM1gZ0nSdjSsrZbGKg==",
"cpu": [
"x64"
],
@@ -134,9 +310,9 @@
}
},
"node_modules/@img/sharp-libvips-linux-arm": {
- "version": "1.2.3",
- "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm/-/sharp-libvips-linux-arm-1.2.3.tgz",
- "integrity": "sha512-x1uE93lyP6wEwGvgAIV0gP6zmaL/a0tGzJs/BIDDG0zeBhMnuUPm7ptxGhUbcGs4okDJrk4nxgrmxpib9g6HpA==",
+ "version": "1.2.4",
+ "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm/-/sharp-libvips-linux-arm-1.2.4.tgz",
+ "integrity": "sha512-bFI7xcKFELdiNCVov8e44Ia4u2byA+l3XtsAj+Q8tfCwO6BQ8iDojYdvoPMqsKDkuoOo+X6HZA0s0q11ANMQ8A==",
"cpu": [
"arm"
],
@@ -150,9 +326,9 @@
}
},
"node_modules/@img/sharp-libvips-linux-arm64": {
- "version": "1.2.3",
- "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm64/-/sharp-libvips-linux-arm64-1.2.3.tgz",
- "integrity": "sha512-I4RxkXU90cpufazhGPyVujYwfIm9Nk1QDEmiIsaPwdnm013F7RIceaCc87kAH+oUB1ezqEvC6ga4m7MSlqsJvQ==",
+ "version": "1.2.4",
+ "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm64/-/sharp-libvips-linux-arm64-1.2.4.tgz",
+ "integrity": "sha512-excjX8DfsIcJ10x1Kzr4RcWe1edC9PquDRRPx3YVCvQv+U5p7Yin2s32ftzikXojb1PIFc/9Mt28/y+iRklkrw==",
"cpu": [
"arm64"
],
@@ -166,9 +342,9 @@
}
},
"node_modules/@img/sharp-libvips-linux-ppc64": {
- "version": "1.2.3",
- "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-ppc64/-/sharp-libvips-linux-ppc64-1.2.3.tgz",
- "integrity": "sha512-Y2T7IsQvJLMCBM+pmPbM3bKT/yYJvVtLJGfCs4Sp95SjvnFIjynbjzsa7dY1fRJX45FTSfDksbTp6AGWudiyCg==",
+ "version": "1.2.4",
+ "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-ppc64/-/sharp-libvips-linux-ppc64-1.2.4.tgz",
+ "integrity": "sha512-FMuvGijLDYG6lW+b/UvyilUWu5Ayu+3r2d1S8notiGCIyYU/76eig1UfMmkZ7vwgOrzKzlQbFSuQfgm7GYUPpA==",
"cpu": [
"ppc64"
],
@@ -181,10 +357,26 @@
"url": "https://opencollective.com/libvips"
}
},
+ "node_modules/@img/sharp-libvips-linux-riscv64": {
+ "version": "1.2.4",
+ "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-riscv64/-/sharp-libvips-linux-riscv64-1.2.4.tgz",
+ "integrity": "sha512-oVDbcR4zUC0ce82teubSm+x6ETixtKZBh/qbREIOcI3cULzDyb18Sr/Wcyx7NRQeQzOiHTNbZFF1UwPS2scyGA==",
+ "cpu": [
+ "riscv64"
+ ],
+ "license": "LGPL-3.0-or-later",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ }
+ },
"node_modules/@img/sharp-libvips-linux-s390x": {
- "version": "1.2.3",
- "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-s390x/-/sharp-libvips-linux-s390x-1.2.3.tgz",
- "integrity": "sha512-RgWrs/gVU7f+K7P+KeHFaBAJlNkD1nIZuVXdQv6S+fNA6syCcoboNjsV2Pou7zNlVdNQoQUpQTk8SWDHUA3y/w==",
+ "version": "1.2.4",
+ "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-s390x/-/sharp-libvips-linux-s390x-1.2.4.tgz",
+ "integrity": "sha512-qmp9VrzgPgMoGZyPvrQHqk02uyjA0/QrTO26Tqk6l4ZV0MPWIW6LTkqOIov+J1yEu7MbFQaDpwdwJKhbJvuRxQ==",
"cpu": [
"s390x"
],
@@ -198,9 +390,9 @@
}
},
"node_modules/@img/sharp-libvips-linux-x64": {
- "version": "1.2.3",
- "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-x64/-/sharp-libvips-linux-x64-1.2.3.tgz",
- "integrity": "sha512-3JU7LmR85K6bBiRzSUc/Ff9JBVIFVvq6bomKE0e63UXGeRw2HPVEjoJke1Yx+iU4rL7/7kUjES4dZ/81Qjhyxg==",
+ "version": "1.2.4",
+ "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-x64/-/sharp-libvips-linux-x64-1.2.4.tgz",
+ "integrity": "sha512-tJxiiLsmHc9Ax1bz3oaOYBURTXGIRDODBqhveVHonrHJ9/+k89qbLl0bcJns+e4t4rvaNBxaEZsFtSfAdquPrw==",
"cpu": [
"x64"
],
@@ -214,9 +406,9 @@
}
},
"node_modules/@img/sharp-libvips-linuxmusl-arm64": {
- "version": "1.2.3",
- "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-arm64/-/sharp-libvips-linuxmusl-arm64-1.2.3.tgz",
- "integrity": "sha512-F9q83RZ8yaCwENw1GieztSfj5msz7GGykG/BA+MOUefvER69K/ubgFHNeSyUu64amHIYKGDs4sRCMzXVj8sEyw==",
+ "version": "1.2.4",
+ "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-arm64/-/sharp-libvips-linuxmusl-arm64-1.2.4.tgz",
+ "integrity": "sha512-FVQHuwx1IIuNow9QAbYUzJ+En8KcVm9Lk5+uGUQJHaZmMECZmOlix9HnH7n1TRkXMS0pGxIJokIVB9SuqZGGXw==",
"cpu": [
"arm64"
],
@@ -230,9 +422,9 @@
}
},
"node_modules/@img/sharp-libvips-linuxmusl-x64": {
- "version": "1.2.3",
- "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-x64/-/sharp-libvips-linuxmusl-x64-1.2.3.tgz",
- "integrity": "sha512-U5PUY5jbc45ANM6tSJpsgqmBF/VsL6LnxJmIf11kB7J5DctHgqm0SkuXzVWtIY90GnJxKnC/JT251TDnk1fu/g==",
+ "version": "1.2.4",
+ "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-x64/-/sharp-libvips-linuxmusl-x64-1.2.4.tgz",
+ "integrity": "sha512-+LpyBk7L44ZIXwz/VYfglaX/okxezESc6UxDSoyo2Ks6Jxc4Y7sGjpgU9s4PMgqgjj1gZCylTieNamqA1MF7Dg==",
"cpu": [
"x64"
],
@@ -246,9 +438,9 @@
}
},
"node_modules/@img/sharp-linux-arm": {
- "version": "0.34.4",
- "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm/-/sharp-linux-arm-0.34.4.tgz",
- "integrity": "sha512-Xyam4mlqM0KkTHYVSuc6wXRmM7LGN0P12li03jAnZ3EJWZqj83+hi8Y9UxZUbxsgsK1qOEwg7O0Bc0LjqQVtxA==",
+ "version": "0.34.5",
+ "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm/-/sharp-linux-arm-0.34.5.tgz",
+ "integrity": "sha512-9dLqsvwtg1uuXBGZKsxem9595+ujv0sJ6Vi8wcTANSFpwV/GONat5eCkzQo/1O6zRIkh0m/8+5BjrRr7jDUSZw==",
"cpu": [
"arm"
],
@@ -264,13 +456,13 @@
"url": "https://opencollective.com/libvips"
},
"optionalDependencies": {
- "@img/sharp-libvips-linux-arm": "1.2.3"
+ "@img/sharp-libvips-linux-arm": "1.2.4"
}
},
"node_modules/@img/sharp-linux-arm64": {
- "version": "0.34.4",
- "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm64/-/sharp-linux-arm64-0.34.4.tgz",
- "integrity": "sha512-YXU1F/mN/Wu786tl72CyJjP/Ngl8mGHN1hST4BGl+hiW5jhCnV2uRVTNOcaYPs73NeT/H8Upm3y9582JVuZHrQ==",
+ "version": "0.34.5",
+ "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm64/-/sharp-linux-arm64-0.34.5.tgz",
+ "integrity": "sha512-bKQzaJRY/bkPOXyKx5EVup7qkaojECG6NLYswgktOZjaXecSAeCWiZwwiFf3/Y+O1HrauiE3FVsGxFg8c24rZg==",
"cpu": [
"arm64"
],
@@ -286,13 +478,13 @@
"url": "https://opencollective.com/libvips"
},
"optionalDependencies": {
- "@img/sharp-libvips-linux-arm64": "1.2.3"
+ "@img/sharp-libvips-linux-arm64": "1.2.4"
}
},
"node_modules/@img/sharp-linux-ppc64": {
- "version": "0.34.4",
- "resolved": "https://registry.npmjs.org/@img/sharp-linux-ppc64/-/sharp-linux-ppc64-0.34.4.tgz",
- "integrity": "sha512-F4PDtF4Cy8L8hXA2p3TO6s4aDt93v+LKmpcYFLAVdkkD3hSxZzee0rh6/+94FpAynsuMpLX5h+LRsSG3rIciUQ==",
+ "version": "0.34.5",
+ "resolved": "https://registry.npmjs.org/@img/sharp-linux-ppc64/-/sharp-linux-ppc64-0.34.5.tgz",
+ "integrity": "sha512-7zznwNaqW6YtsfrGGDA6BRkISKAAE1Jo0QdpNYXNMHu2+0dTrPflTLNkpc8l7MUP5M16ZJcUvysVWWrMefZquA==",
"cpu": [
"ppc64"
],
@@ -308,13 +500,35 @@
"url": "https://opencollective.com/libvips"
},
"optionalDependencies": {
- "@img/sharp-libvips-linux-ppc64": "1.2.3"
+ "@img/sharp-libvips-linux-ppc64": "1.2.4"
+ }
+ },
+ "node_modules/@img/sharp-linux-riscv64": {
+ "version": "0.34.5",
+ "resolved": "https://registry.npmjs.org/@img/sharp-linux-riscv64/-/sharp-linux-riscv64-0.34.5.tgz",
+ "integrity": "sha512-51gJuLPTKa7piYPaVs8GmByo7/U7/7TZOq+cnXJIHZKavIRHAP77e3N2HEl3dgiqdD/w0yUfiJnII77PuDDFdw==",
+ "cpu": [
+ "riscv64"
+ ],
+ "license": "Apache-2.0",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": "^18.17.0 || ^20.3.0 || >=21.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ },
+ "optionalDependencies": {
+ "@img/sharp-libvips-linux-riscv64": "1.2.4"
}
},
"node_modules/@img/sharp-linux-s390x": {
- "version": "0.34.4",
- "resolved": "https://registry.npmjs.org/@img/sharp-linux-s390x/-/sharp-linux-s390x-0.34.4.tgz",
- "integrity": "sha512-qVrZKE9Bsnzy+myf7lFKvng6bQzhNUAYcVORq2P7bDlvmF6u2sCmK2KyEQEBdYk+u3T01pVsPrkj943T1aJAsw==",
+ "version": "0.34.5",
+ "resolved": "https://registry.npmjs.org/@img/sharp-linux-s390x/-/sharp-linux-s390x-0.34.5.tgz",
+ "integrity": "sha512-nQtCk0PdKfho3eC5MrbQoigJ2gd1CgddUMkabUj+rBevs8tZ2cULOx46E7oyX+04WGfABgIwmMC0VqieTiR4jg==",
"cpu": [
"s390x"
],
@@ -330,13 +544,13 @@
"url": "https://opencollective.com/libvips"
},
"optionalDependencies": {
- "@img/sharp-libvips-linux-s390x": "1.2.3"
+ "@img/sharp-libvips-linux-s390x": "1.2.4"
}
},
"node_modules/@img/sharp-linux-x64": {
- "version": "0.34.4",
- "resolved": "https://registry.npmjs.org/@img/sharp-linux-x64/-/sharp-linux-x64-0.34.4.tgz",
- "integrity": "sha512-ZfGtcp2xS51iG79c6Vhw9CWqQC8l2Ot8dygxoDoIQPTat/Ov3qAa8qpxSrtAEAJW+UjTXc4yxCjNfxm4h6Xm2A==",
+ "version": "0.34.5",
+ "resolved": "https://registry.npmjs.org/@img/sharp-linux-x64/-/sharp-linux-x64-0.34.5.tgz",
+ "integrity": "sha512-MEzd8HPKxVxVenwAa+JRPwEC7QFjoPWuS5NZnBt6B3pu7EG2Ge0id1oLHZpPJdn3OQK+BQDiw9zStiHBTJQQQQ==",
"cpu": [
"x64"
],
@@ -352,13 +566,13 @@
"url": "https://opencollective.com/libvips"
},
"optionalDependencies": {
- "@img/sharp-libvips-linux-x64": "1.2.3"
+ "@img/sharp-libvips-linux-x64": "1.2.4"
}
},
"node_modules/@img/sharp-linuxmusl-arm64": {
- "version": "0.34.4",
- "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-arm64/-/sharp-linuxmusl-arm64-0.34.4.tgz",
- "integrity": "sha512-8hDVvW9eu4yHWnjaOOR8kHVrew1iIX+MUgwxSuH2XyYeNRtLUe4VNioSqbNkB7ZYQJj9rUTT4PyRscyk2PXFKA==",
+ "version": "0.34.5",
+ "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-arm64/-/sharp-linuxmusl-arm64-0.34.5.tgz",
+ "integrity": "sha512-fprJR6GtRsMt6Kyfq44IsChVZeGN97gTD331weR1ex1c1rypDEABN6Tm2xa1wE6lYb5DdEnk03NZPqA7Id21yg==",
"cpu": [
"arm64"
],
@@ -374,13 +588,13 @@
"url": "https://opencollective.com/libvips"
},
"optionalDependencies": {
- "@img/sharp-libvips-linuxmusl-arm64": "1.2.3"
+ "@img/sharp-libvips-linuxmusl-arm64": "1.2.4"
}
},
"node_modules/@img/sharp-linuxmusl-x64": {
- "version": "0.34.4",
- "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-x64/-/sharp-linuxmusl-x64-0.34.4.tgz",
- "integrity": "sha512-lU0aA5L8QTlfKjpDCEFOZsTYGn3AEiO6db8W5aQDxj0nQkVrZWmN3ZP9sYKWJdtq3PWPhUNlqehWyXpYDcI9Sg==",
+ "version": "0.34.5",
+ "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-x64/-/sharp-linuxmusl-x64-0.34.5.tgz",
+ "integrity": "sha512-Jg8wNT1MUzIvhBFxViqrEhWDGzqymo3sV7z7ZsaWbZNDLXRJZoRGrjulp60YYtV4wfY8VIKcWidjojlLcWrd8Q==",
"cpu": [
"x64"
],
@@ -396,20 +610,20 @@
"url": "https://opencollective.com/libvips"
},
"optionalDependencies": {
- "@img/sharp-libvips-linuxmusl-x64": "1.2.3"
+ "@img/sharp-libvips-linuxmusl-x64": "1.2.4"
}
},
"node_modules/@img/sharp-wasm32": {
- "version": "0.34.4",
- "resolved": "https://registry.npmjs.org/@img/sharp-wasm32/-/sharp-wasm32-0.34.4.tgz",
- "integrity": "sha512-33QL6ZO/qpRyG7woB/HUALz28WnTMI2W1jgX3Nu2bypqLIKx/QKMILLJzJjI+SIbvXdG9fUnmrxR7vbi1sTBeA==",
+ "version": "0.34.5",
+ "resolved": "https://registry.npmjs.org/@img/sharp-wasm32/-/sharp-wasm32-0.34.5.tgz",
+ "integrity": "sha512-OdWTEiVkY2PHwqkbBI8frFxQQFekHaSSkUIJkwzclWZe64O1X4UlUjqqqLaPbUpMOQk6FBu/HtlGXNblIs0huw==",
"cpu": [
"wasm32"
],
"license": "Apache-2.0 AND LGPL-3.0-or-later AND MIT",
"optional": true,
"dependencies": {
- "@emnapi/runtime": "^1.5.0"
+ "@emnapi/runtime": "^1.7.0"
},
"engines": {
"node": "^18.17.0 || ^20.3.0 || >=21.0.0"
@@ -419,9 +633,9 @@
}
},
"node_modules/@img/sharp-win32-arm64": {
- "version": "0.34.4",
- "resolved": "https://registry.npmjs.org/@img/sharp-win32-arm64/-/sharp-win32-arm64-0.34.4.tgz",
- "integrity": "sha512-2Q250do/5WXTwxW3zjsEuMSv5sUU4Tq9VThWKlU2EYLm4MB7ZeMwF+SFJutldYODXF6jzc6YEOC+VfX0SZQPqA==",
+ "version": "0.34.5",
+ "resolved": "https://registry.npmjs.org/@img/sharp-win32-arm64/-/sharp-win32-arm64-0.34.5.tgz",
+ "integrity": "sha512-WQ3AgWCWYSb2yt+IG8mnC6Jdk9Whs7O0gxphblsLvdhSpSTtmu69ZG1Gkb6NuvxsNACwiPV6cNSZNzt0KPsw7g==",
"cpu": [
"arm64"
],
@@ -438,9 +652,9 @@
}
},
"node_modules/@img/sharp-win32-ia32": {
- "version": "0.34.4",
- "resolved": "https://registry.npmjs.org/@img/sharp-win32-ia32/-/sharp-win32-ia32-0.34.4.tgz",
- "integrity": "sha512-3ZeLue5V82dT92CNL6rsal6I2weKw1cYu+rGKm8fOCCtJTR2gYeUfY3FqUnIJsMUPIH68oS5jmZ0NiJ508YpEw==",
+ "version": "0.34.5",
+ "resolved": "https://registry.npmjs.org/@img/sharp-win32-ia32/-/sharp-win32-ia32-0.34.5.tgz",
+ "integrity": "sha512-FV9m/7NmeCmSHDD5j4+4pNI8Cp3aW+JvLoXcTUo0IqyjSfAZJ8dIUmijx1qaJsIiU+Hosw6xM5KijAWRJCSgNg==",
"cpu": [
"ia32"
],
@@ -457,9 +671,9 @@
}
},
"node_modules/@img/sharp-win32-x64": {
- "version": "0.34.4",
- "resolved": "https://registry.npmjs.org/@img/sharp-win32-x64/-/sharp-win32-x64-0.34.4.tgz",
- "integrity": "sha512-xIyj4wpYs8J18sVN3mSQjwrw7fKUqRw+Z5rnHNCy5fYTxigBz81u5mOMPmFumwjcn8+ld1ppptMBCLic1nz6ig==",
+ "version": "0.34.5",
+ "resolved": "https://registry.npmjs.org/@img/sharp-win32-x64/-/sharp-win32-x64-0.34.5.tgz",
+ "integrity": "sha512-+29YMsqY2/9eFEiW93eqWnuLcWcufowXewwSNIT6UwZdUUCrM3oFjMWH/Z6/TMmb4hlFenmfAVbpWeup2jryCw==",
"cpu": [
"x64"
],
@@ -475,19 +689,6 @@
"url": "https://opencollective.com/libvips"
}
},
- "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==",
- "dev": true,
- "license": "ISC",
- "dependencies": {
- "minipass": "^7.0.4"
- },
- "engines": {
- "node": ">=18.0.0"
- }
- },
"node_modules/@jridgewell/gen-mapping": {
"version": "0.3.13",
"resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz",
@@ -539,15 +740,15 @@
}
},
"node_modules/@next/env": {
- "version": "15.5.12",
- "resolved": "https://registry.npmjs.org/@next/env/-/env-15.5.12.tgz",
- "integrity": "sha512-pUvdJN1on574wQHjaBfNGDt9Mz5utDSZFsIIQkMzPgNS8ZvT4H2mwOrOIClwsQOb6EGx5M76/CZr6G8i6pSpLg==",
+ "version": "16.2.4",
+ "resolved": "https://registry.npmjs.org/@next/env/-/env-16.2.4.tgz",
+ "integrity": "sha512-dKkkOzOSwFYe5RX6y26fZgkSpVAlIOJKQHIiydQcrWH6y/97+RceSOAdjZ14Qa3zLduVUy0TXcn+EiM6t4rPgw==",
"license": "MIT"
},
"node_modules/@next/swc-darwin-arm64": {
- "version": "15.5.12",
- "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-15.5.12.tgz",
- "integrity": "sha512-RnRjBtH8S8eXCpUNkQ+543DUc7ys8y15VxmFU9HRqlo9BG3CcBUiwNtF8SNoi2xvGCVJq1vl2yYq+3oISBS0Zg==",
+ "version": "16.2.4",
+ "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-16.2.4.tgz",
+ "integrity": "sha512-OXTFFox5EKN1Ym08vfrz+OXxmCcEjT4SFMbNRsWZE99dMqt2Kcusl5MqPXcW232RYkMLQTy0hqgAMEsfEd/l2A==",
"cpu": [
"arm64"
],
@@ -561,9 +762,9 @@
}
},
"node_modules/@next/swc-darwin-x64": {
- "version": "15.5.12",
- "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-15.5.12.tgz",
- "integrity": "sha512-nqa9/7iQlboF1EFtNhWxQA0rQstmYRSBGxSM6g3GxvxHxcoeqVXfGNr9stJOme674m2V7r4E3+jEhhGvSQhJRA==",
+ "version": "16.2.4",
+ "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-16.2.4.tgz",
+ "integrity": "sha512-XhpVnUfmYWvD3YrXu55XdcAkQtOnvaI6wtQa8fuF5fGoKoxIUZ0kWPtcOfqJEWngFF/lOS9l3+O9CcownhiQxQ==",
"cpu": [
"x64"
],
@@ -577,9 +778,9 @@
}
},
"node_modules/@next/swc-linux-arm64-gnu": {
- "version": "15.5.12",
- "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-15.5.12.tgz",
- "integrity": "sha512-dCzAjqhDHwmoB2M4eYfVKqXs99QdQxNQVpftvP1eGVppamXh/OkDAwV737Zr0KPXEqRUMN4uCjh6mjO+XtF3Mw==",
+ "version": "16.2.4",
+ "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-16.2.4.tgz",
+ "integrity": "sha512-Mx/tjlNA3G8kg14QvuGAJ4xBwPk1tUHq56JxZ8CXnZwz1Etz714soCEzGQQzVMz4bEnGPowzkV6Xrp6wAkEWOQ==",
"cpu": [
"arm64"
],
@@ -593,9 +794,9 @@
}
},
"node_modules/@next/swc-linux-arm64-musl": {
- "version": "15.5.12",
- "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-15.5.12.tgz",
- "integrity": "sha512-+fpGWvQiITgf7PUtbWY1H7qUSnBZsPPLyyq03QuAKpVoTy/QUx1JptEDTQMVvQhvizCEuNLEeghrQUyXQOekuw==",
+ "version": "16.2.4",
+ "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-16.2.4.tgz",
+ "integrity": "sha512-iVMMp14514u7Nup2umQS03nT/bN9HurK8ufylC3FZNykrwjtx7V1A7+4kvhbDSCeonTVqV3Txnv0Lu+m2oDXNg==",
"cpu": [
"arm64"
],
@@ -609,9 +810,9 @@
}
},
"node_modules/@next/swc-linux-x64-gnu": {
- "version": "15.5.12",
- "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-15.5.12.tgz",
- "integrity": "sha512-jSLvgdRRL/hrFAPqEjJf1fFguC719kmcptjNVDJl26BnJIpjL3KH5h6mzR4mAweociLQaqvt4UyzfbFjgAdDcw==",
+ "version": "16.2.4",
+ "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-16.2.4.tgz",
+ "integrity": "sha512-EZOvm1aQWgnI/N/xcWOlnS3RQBk0VtVav5Zo7n4p0A7UKyTDx047k8opDbXgBpHl4CulRqRfbw3QrX2w5UOXMQ==",
"cpu": [
"x64"
],
@@ -625,9 +826,9 @@
}
},
"node_modules/@next/swc-linux-x64-musl": {
- "version": "15.5.12",
- "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-15.5.12.tgz",
- "integrity": "sha512-/uaF0WfmYqQgLfPmN6BvULwxY0dufI2mlN2JbOKqqceZh1G4hjREyi7pg03zjfyS6eqNemHAZPSoP84x17vo6w==",
+ "version": "16.2.4",
+ "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-16.2.4.tgz",
+ "integrity": "sha512-h9FxsngCm9cTBf71AR4fGznDEDx1hS7+kSEiIRjq5kO1oXWm07DxVGZjCvk0SGx7TSjlUqhI8oOyz7NfwAdPoA==",
"cpu": [
"x64"
],
@@ -641,9 +842,9 @@
}
},
"node_modules/@next/swc-win32-arm64-msvc": {
- "version": "15.5.12",
- "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-15.5.12.tgz",
- "integrity": "sha512-xhsL1OvQSfGmlL5RbOmU+FV120urrgFpYLq+6U8C6KIym32gZT6XF/SDE92jKzzlPWskkbjOKCpqk5m4i8PEfg==",
+ "version": "16.2.4",
+ "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-16.2.4.tgz",
+ "integrity": "sha512-3NdJV5OXMSOeJYijX+bjaLge3mJBlh4ybydbT4GFoB/2hAojWHtMhl3CYlYoMrjPuodp0nzFVi4Tj2+WaMg+Ow==",
"cpu": [
"arm64"
],
@@ -657,9 +858,9 @@
}
},
"node_modules/@next/swc-win32-x64-msvc": {
- "version": "15.5.12",
- "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-15.5.12.tgz",
- "integrity": "sha512-Z1Dh6lhFkxvBDH1FoW6OU/L6prYwPSlwjLiZkExIAh8fbP6iI/M7iGTQAJPYJ9YFlWobCZ1PHbchFhFYb2ADkw==",
+ "version": "16.2.4",
+ "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-16.2.4.tgz",
+ "integrity": "sha512-kMVGgsqhO5YTYODD9IPGGhA6iprWidQckK3LmPeW08PIFENRmgfb4MjXHO+p//d+ts2rpjvK5gXWzXSMrPl9cw==",
"cpu": [
"x64"
],
@@ -682,54 +883,49 @@
}
},
"node_modules/@tailwindcss/node": {
- "version": "4.1.14",
- "resolved": "https://registry.npmjs.org/@tailwindcss/node/-/node-4.1.14.tgz",
- "integrity": "sha512-hpz+8vFk3Ic2xssIA3e01R6jkmsAhvkQdXlEbRTk6S10xDAtiQiM3FyvZVGsucefq764euO/b8WUW9ysLdThHw==",
+ "version": "4.2.4",
+ "resolved": "https://registry.npmjs.org/@tailwindcss/node/-/node-4.2.4.tgz",
+ "integrity": "sha512-Ai7+yQPxz3ddrDQzFfBKdHEVBg0w3Zl83jnjuwxnZOsnH9pGn93QHQtpU0p/8rYWxvbFZHneni6p1BSLK4DkGA==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@jridgewell/remapping": "^2.3.4",
- "enhanced-resolve": "^5.18.3",
- "jiti": "^2.6.0",
- "lightningcss": "1.30.1",
- "magic-string": "^0.30.19",
+ "@jridgewell/remapping": "^2.3.5",
+ "enhanced-resolve": "^5.19.0",
+ "jiti": "^2.6.1",
+ "lightningcss": "1.32.0",
+ "magic-string": "^0.30.21",
"source-map-js": "^1.2.1",
- "tailwindcss": "4.1.14"
+ "tailwindcss": "4.2.4"
}
},
"node_modules/@tailwindcss/oxide": {
- "version": "4.1.14",
- "resolved": "https://registry.npmjs.org/@tailwindcss/oxide/-/oxide-4.1.14.tgz",
- "integrity": "sha512-23yx+VUbBwCg2x5XWdB8+1lkPajzLmALEfMb51zZUBYaYVPDQvBSD/WYDqiVyBIo2BZFa3yw1Rpy3G2Jp+K0dw==",
+ "version": "4.2.4",
+ "resolved": "https://registry.npmjs.org/@tailwindcss/oxide/-/oxide-4.2.4.tgz",
+ "integrity": "sha512-9El/iI069DKDSXwTvB9J4BwdO5JhRrOweGaK25taBAvBXyXqJAX+Jqdvs8r8gKpsI/1m0LeJLyQYTf/WLrBT1Q==",
"dev": true,
- "hasInstallScript": true,
"license": "MIT",
- "dependencies": {
- "detect-libc": "^2.0.4",
- "tar": "^7.5.1"
- },
"engines": {
- "node": ">= 10"
+ "node": ">= 20"
},
"optionalDependencies": {
- "@tailwindcss/oxide-android-arm64": "4.1.14",
- "@tailwindcss/oxide-darwin-arm64": "4.1.14",
- "@tailwindcss/oxide-darwin-x64": "4.1.14",
- "@tailwindcss/oxide-freebsd-x64": "4.1.14",
- "@tailwindcss/oxide-linux-arm-gnueabihf": "4.1.14",
- "@tailwindcss/oxide-linux-arm64-gnu": "4.1.14",
- "@tailwindcss/oxide-linux-arm64-musl": "4.1.14",
- "@tailwindcss/oxide-linux-x64-gnu": "4.1.14",
- "@tailwindcss/oxide-linux-x64-musl": "4.1.14",
- "@tailwindcss/oxide-wasm32-wasi": "4.1.14",
- "@tailwindcss/oxide-win32-arm64-msvc": "4.1.14",
- "@tailwindcss/oxide-win32-x64-msvc": "4.1.14"
+ "@tailwindcss/oxide-android-arm64": "4.2.4",
+ "@tailwindcss/oxide-darwin-arm64": "4.2.4",
+ "@tailwindcss/oxide-darwin-x64": "4.2.4",
+ "@tailwindcss/oxide-freebsd-x64": "4.2.4",
+ "@tailwindcss/oxide-linux-arm-gnueabihf": "4.2.4",
+ "@tailwindcss/oxide-linux-arm64-gnu": "4.2.4",
+ "@tailwindcss/oxide-linux-arm64-musl": "4.2.4",
+ "@tailwindcss/oxide-linux-x64-gnu": "4.2.4",
+ "@tailwindcss/oxide-linux-x64-musl": "4.2.4",
+ "@tailwindcss/oxide-wasm32-wasi": "4.2.4",
+ "@tailwindcss/oxide-win32-arm64-msvc": "4.2.4",
+ "@tailwindcss/oxide-win32-x64-msvc": "4.2.4"
}
},
"node_modules/@tailwindcss/oxide-android-arm64": {
- "version": "4.1.14",
- "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-android-arm64/-/oxide-android-arm64-4.1.14.tgz",
- "integrity": "sha512-a94ifZrGwMvbdeAxWoSuGcIl6/DOP5cdxagid7xJv6bwFp3oebp7y2ImYsnZBMTwjn5Ev5xESvS3FFYUGgPODQ==",
+ "version": "4.2.4",
+ "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-android-arm64/-/oxide-android-arm64-4.2.4.tgz",
+ "integrity": "sha512-e7MOr1SAn9U8KlZzPi1ZXGZHeC5anY36qjNwmZv9pOJ8E4Q6jmD1vyEHkQFmNOIN7twGPEMXRHmitN4zCMN03g==",
"cpu": [
"arm64"
],
@@ -740,13 +936,13 @@
"android"
],
"engines": {
- "node": ">= 10"
+ "node": ">= 20"
}
},
"node_modules/@tailwindcss/oxide-darwin-arm64": {
- "version": "4.1.14",
- "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-arm64/-/oxide-darwin-arm64-4.1.14.tgz",
- "integrity": "sha512-HkFP/CqfSh09xCnrPJA7jud7hij5ahKyWomrC3oiO2U9i0UjP17o9pJbxUN0IJ471GTQQmzwhp0DEcpbp4MZTA==",
+ "version": "4.2.4",
+ "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-arm64/-/oxide-darwin-arm64-4.2.4.tgz",
+ "integrity": "sha512-tSC/Kbqpz/5/o/C2sG7QvOxAKqyd10bq+ypZNf+9Fi2TvbVbv1zNpcEptcsU7DPROaSbVgUXmrzKhurFvo5eDg==",
"cpu": [
"arm64"
],
@@ -757,13 +953,13 @@
"darwin"
],
"engines": {
- "node": ">= 10"
+ "node": ">= 20"
}
},
"node_modules/@tailwindcss/oxide-darwin-x64": {
- "version": "4.1.14",
- "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-x64/-/oxide-darwin-x64-4.1.14.tgz",
- "integrity": "sha512-eVNaWmCgdLf5iv6Qd3s7JI5SEFBFRtfm6W0mphJYXgvnDEAZ5sZzqmI06bK6xo0IErDHdTA5/t7d4eTfWbWOFw==",
+ "version": "4.2.4",
+ "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-x64/-/oxide-darwin-x64-4.2.4.tgz",
+ "integrity": "sha512-yPyUXn3yO/ufR6+Kzv0t4fCg2qNr90jxXc5QqBpjlPNd0NqyDXcmQb/6weunH/MEDXW5dhyEi+agTDiqa3WsGg==",
"cpu": [
"x64"
],
@@ -774,13 +970,13 @@
"darwin"
],
"engines": {
- "node": ">= 10"
+ "node": ">= 20"
}
},
"node_modules/@tailwindcss/oxide-freebsd-x64": {
- "version": "4.1.14",
- "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-freebsd-x64/-/oxide-freebsd-x64-4.1.14.tgz",
- "integrity": "sha512-QWLoRXNikEuqtNb0dhQN6wsSVVjX6dmUFzuuiL09ZeXju25dsei2uIPl71y2Ic6QbNBsB4scwBoFnlBfabHkEw==",
+ "version": "4.2.4",
+ "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-freebsd-x64/-/oxide-freebsd-x64-4.2.4.tgz",
+ "integrity": "sha512-BoMIB4vMQtZsXdGLVc2z+P9DbETkiopogfWZKbWwM8b/1Vinbs4YcUwo+kM/KeLkX3Ygrf4/PsRndKaYhS8Eiw==",
"cpu": [
"x64"
],
@@ -791,13 +987,13 @@
"freebsd"
],
"engines": {
- "node": ">= 10"
+ "node": ">= 20"
}
},
"node_modules/@tailwindcss/oxide-linux-arm-gnueabihf": {
- "version": "4.1.14",
- "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm-gnueabihf/-/oxide-linux-arm-gnueabihf-4.1.14.tgz",
- "integrity": "sha512-VB4gjQni9+F0VCASU+L8zSIyjrLLsy03sjcR3bM0V2g4SNamo0FakZFKyUQ96ZVwGK4CaJsc9zd/obQy74o0Fw==",
+ "version": "4.2.4",
+ "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm-gnueabihf/-/oxide-linux-arm-gnueabihf-4.2.4.tgz",
+ "integrity": "sha512-7pIHBLTHYRAlS7V22JNuTh33yLH4VElwKtB3bwchK/UaKUPpQ0lPQiOWcbm4V3WP2I6fNIJ23vABIvoy2izdwA==",
"cpu": [
"arm"
],
@@ -808,13 +1004,13 @@
"linux"
],
"engines": {
- "node": ">= 10"
+ "node": ">= 20"
}
},
"node_modules/@tailwindcss/oxide-linux-arm64-gnu": {
- "version": "4.1.14",
- "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-gnu/-/oxide-linux-arm64-gnu-4.1.14.tgz",
- "integrity": "sha512-qaEy0dIZ6d9vyLnmeg24yzA8XuEAD9WjpM5nIM1sUgQ/Zv7cVkharPDQcmm/t/TvXoKo/0knI3me3AGfdx6w1w==",
+ "version": "4.2.4",
+ "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-gnu/-/oxide-linux-arm64-gnu-4.2.4.tgz",
+ "integrity": "sha512-+E4wxJ0ZGOzSH325reXTWB48l42i93kQqMvDyz5gqfRzRZ7faNhnmvlV4EPGJU3QJM/3Ab5jhJ5pCRUsKn6OQw==",
"cpu": [
"arm64"
],
@@ -825,13 +1021,13 @@
"linux"
],
"engines": {
- "node": ">= 10"
+ "node": ">= 20"
}
},
"node_modules/@tailwindcss/oxide-linux-arm64-musl": {
- "version": "4.1.14",
- "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-musl/-/oxide-linux-arm64-musl-4.1.14.tgz",
- "integrity": "sha512-ISZjT44s59O8xKsPEIesiIydMG/sCXoMBCqsphDm/WcbnuWLxxb+GcvSIIA5NjUw6F8Tex7s5/LM2yDy8RqYBQ==",
+ "version": "4.2.4",
+ "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-musl/-/oxide-linux-arm64-musl-4.2.4.tgz",
+ "integrity": "sha512-bBADEGAbo4ASnppIziaQJelekCxdMaxisrk+fB7Thit72IBnALp9K6ffA2G4ruj90G9XRS2VQ6q2bCKbfFV82g==",
"cpu": [
"arm64"
],
@@ -842,13 +1038,13 @@
"linux"
],
"engines": {
- "node": ">= 10"
+ "node": ">= 20"
}
},
"node_modules/@tailwindcss/oxide-linux-x64-gnu": {
- "version": "4.1.14",
- "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-gnu/-/oxide-linux-x64-gnu-4.1.14.tgz",
- "integrity": "sha512-02c6JhLPJj10L2caH4U0zF8Hji4dOeahmuMl23stk0MU1wfd1OraE7rOloidSF8W5JTHkFdVo/O7uRUJJnUAJg==",
+ "version": "4.2.4",
+ "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-gnu/-/oxide-linux-x64-gnu-4.2.4.tgz",
+ "integrity": "sha512-7Mx25E4WTfnht0TVRTyC00j3i0M+EeFe7wguMDTlX4mRxafznw0CA8WJkFjWYH5BlgELd1kSjuU2JiPnNZbJDA==",
"cpu": [
"x64"
],
@@ -859,13 +1055,13 @@
"linux"
],
"engines": {
- "node": ">= 10"
+ "node": ">= 20"
}
},
"node_modules/@tailwindcss/oxide-linux-x64-musl": {
- "version": "4.1.14",
- "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-musl/-/oxide-linux-x64-musl-4.1.14.tgz",
- "integrity": "sha512-TNGeLiN1XS66kQhxHG/7wMeQDOoL0S33x9BgmydbrWAb9Qw0KYdd8o1ifx4HOGDWhVmJ+Ul+JQ7lyknQFilO3Q==",
+ "version": "4.2.4",
+ "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-musl/-/oxide-linux-x64-musl-4.2.4.tgz",
+ "integrity": "sha512-2wwJRF7nyhOR0hhHoChc04xngV3iS+akccHTGtz965FwF0up4b2lOdo6kI1EbDaEXKgvcrFBYcYQQ/rrnWFVfA==",
"cpu": [
"x64"
],
@@ -876,13 +1072,13 @@
"linux"
],
"engines": {
- "node": ">= 10"
+ "node": ">= 20"
}
},
"node_modules/@tailwindcss/oxide-wasm32-wasi": {
- "version": "4.1.14",
- "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-wasm32-wasi/-/oxide-wasm32-wasi-4.1.14.tgz",
- "integrity": "sha512-uZYAsaW/jS/IYkd6EWPJKW/NlPNSkWkBlaeVBi/WsFQNP05/bzkebUL8FH1pdsqx4f2fH/bWFcUABOM9nfiJkQ==",
+ "version": "4.2.4",
+ "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-wasm32-wasi/-/oxide-wasm32-wasi-4.2.4.tgz",
+ "integrity": "sha512-FQsqApeor8Fo6gUEklzmaa9994orJZZDBAlQpK2Mq+DslRKFJeD6AjHpBQ0kZFQohVr8o85PPh8eOy86VlSCmw==",
"bundleDependencies": [
"@napi-rs/wasm-runtime",
"@emnapi/core",
@@ -898,81 +1094,21 @@
"license": "MIT",
"optional": true,
"dependencies": {
- "@emnapi/core": "^1.5.0",
- "@emnapi/runtime": "^1.5.0",
+ "@emnapi/core": "^1.8.1",
+ "@emnapi/runtime": "^1.8.1",
"@emnapi/wasi-threads": "^1.1.0",
- "@napi-rs/wasm-runtime": "^1.0.5",
+ "@napi-rs/wasm-runtime": "^1.1.1",
"@tybys/wasm-util": "^0.10.1",
- "tslib": "^2.4.0"
+ "tslib": "^2.8.1"
},
"engines": {
"node": ">=14.0.0"
}
},
- "node_modules/@tailwindcss/oxide-wasm32-wasi/node_modules/@emnapi/core": {
- "version": "1.5.0",
- "dev": true,
- "inBundle": true,
- "license": "MIT",
- "optional": true,
- "dependencies": {
- "@emnapi/wasi-threads": "1.1.0",
- "tslib": "^2.4.0"
- }
- },
- "node_modules/@tailwindcss/oxide-wasm32-wasi/node_modules/@emnapi/runtime": {
- "version": "1.5.0",
- "dev": true,
- "inBundle": true,
- "license": "MIT",
- "optional": true,
- "dependencies": {
- "tslib": "^2.4.0"
- }
- },
- "node_modules/@tailwindcss/oxide-wasm32-wasi/node_modules/@emnapi/wasi-threads": {
- "version": "1.1.0",
- "dev": true,
- "inBundle": true,
- "license": "MIT",
- "optional": true,
- "dependencies": {
- "tslib": "^2.4.0"
- }
- },
- "node_modules/@tailwindcss/oxide-wasm32-wasi/node_modules/@napi-rs/wasm-runtime": {
- "version": "1.0.5",
- "dev": true,
- "inBundle": true,
- "license": "MIT",
- "optional": true,
- "dependencies": {
- "@emnapi/core": "^1.5.0",
- "@emnapi/runtime": "^1.5.0",
- "@tybys/wasm-util": "^0.10.1"
- }
- },
- "node_modules/@tailwindcss/oxide-wasm32-wasi/node_modules/@tybys/wasm-util": {
- "version": "0.10.1",
- "dev": true,
- "inBundle": true,
- "license": "MIT",
- "optional": true,
- "dependencies": {
- "tslib": "^2.4.0"
- }
- },
- "node_modules/@tailwindcss/oxide-wasm32-wasi/node_modules/tslib": {
- "version": "2.8.1",
- "dev": true,
- "inBundle": true,
- "license": "0BSD",
- "optional": true
- },
"node_modules/@tailwindcss/oxide-win32-arm64-msvc": {
- "version": "4.1.14",
- "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-arm64-msvc/-/oxide-win32-arm64-msvc-4.1.14.tgz",
- "integrity": "sha512-Az0RnnkcvRqsuoLH2Z4n3JfAef0wElgzHD5Aky/e+0tBUxUhIeIqFBTMNQvmMRSP15fWwmvjBxZ3Q8RhsDnxAA==",
+ "version": "4.2.4",
+ "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-arm64-msvc/-/oxide-win32-arm64-msvc-4.2.4.tgz",
+ "integrity": "sha512-L9BXqxC4ToVgwMFqj3pmZRqyHEztulpUJzCxUtLjobMCzTPsGt1Fa9enKbOpY2iIyVtaHNeNvAK8ERP/64sqGQ==",
"cpu": [
"arm64"
],
@@ -983,13 +1119,13 @@
"win32"
],
"engines": {
- "node": ">= 10"
+ "node": ">= 20"
}
},
"node_modules/@tailwindcss/oxide-win32-x64-msvc": {
- "version": "4.1.14",
- "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-x64-msvc/-/oxide-win32-x64-msvc-4.1.14.tgz",
- "integrity": "sha512-ttblVGHgf68kEE4om1n/n44I0yGPkCPbLsqzjvybhpwa6mKKtgFfAzy6btc3HRmuW7nHe0OOrSeNP9sQmmH9XA==",
+ "version": "4.2.4",
+ "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-x64-msvc/-/oxide-win32-x64-msvc-4.2.4.tgz",
+ "integrity": "sha512-ESlKG0EpVJQwRjXDDa9rLvhEAh0mhP1sF7sap9dNZT0yyl9SAG6T7gdP09EH0vIv0UNTlo6jPWyujD6559fZvw==",
"cpu": [
"x64"
],
@@ -1000,129 +1136,153 @@
"win32"
],
"engines": {
- "node": ">= 10"
+ "node": ">= 20"
}
},
"node_modules/@tailwindcss/postcss": {
- "version": "4.1.14",
- "resolved": "https://registry.npmjs.org/@tailwindcss/postcss/-/postcss-4.1.14.tgz",
- "integrity": "sha512-BdMjIxy7HUNThK87C7BC8I1rE8BVUsfNQSI5siQ4JK3iIa3w0XyVvVL9SXLWO//CtYTcp1v7zci0fYwJOjB+Zg==",
+ "version": "4.2.4",
+ "resolved": "https://registry.npmjs.org/@tailwindcss/postcss/-/postcss-4.2.4.tgz",
+ "integrity": "sha512-wgAVj6nUWAolAu8YFvzT2cTBIElWHkjZwFYovF+xsqKsW2ADxM/X2opxj5NsF/qVccAOjRNe8X2IdPzMsWyHTg==",
"dev": true,
"license": "MIT",
"dependencies": {
"@alloc/quick-lru": "^5.2.0",
- "@tailwindcss/node": "4.1.14",
- "@tailwindcss/oxide": "4.1.14",
- "postcss": "^8.4.41",
- "tailwindcss": "4.1.14"
+ "@tailwindcss/node": "4.2.4",
+ "@tailwindcss/oxide": "4.2.4",
+ "postcss": "^8.5.6",
+ "tailwindcss": "4.2.4"
}
},
+ "node_modules/@types/esrecurse": {
+ "version": "4.3.1",
+ "resolved": "https://registry.npmjs.org/@types/esrecurse/-/esrecurse-4.3.1.tgz",
+ "integrity": "sha512-xJBAbDifo5hpffDBuHl0Y8ywswbiAp/Wi7Y/GtAgSlZyIABppyurxVueOPE8LUQOxdlgi6Zqce7uoEpqNTeiUw==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/@types/estree": {
+ "version": "1.0.8",
+ "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz",
+ "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/@types/json-schema": {
+ "version": "7.0.15",
+ "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz",
+ "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==",
+ "dev": true,
+ "license": "MIT"
+ },
"node_modules/@types/node": {
- "version": "20.19.22",
- "resolved": "https://registry.npmjs.org/@types/node/-/node-20.19.22.tgz",
- "integrity": "sha512-hRnu+5qggKDSyWHlnmThnUqg62l29Aj/6vcYgUaSFL9oc7DVjeWEQN3PRgdSc6F8d9QRMWkf36CLMch1Do/+RQ==",
+ "version": "24.12.2",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-24.12.2.tgz",
+ "integrity": "sha512-A1sre26ke7HDIuY/M23nd9gfB+nrmhtYyMINbjI1zHJxYteKR6qSMX56FsmjMcDb3SMcjJg5BiRRgOCC/yBD0g==",
"dev": true,
"license": "MIT",
"dependencies": {
- "undici-types": "~6.21.0"
+ "undici-types": "~7.16.0"
}
},
"node_modules/@types/react": {
- "version": "19.2.2",
- "resolved": "https://registry.npmjs.org/@types/react/-/react-19.2.2.tgz",
- "integrity": "sha512-6mDvHUFSjyT2B2yeNx2nUgMxh9LtOWvkhIU3uePn2I2oyNymUAX1NIsdgviM4CH+JSrp2D2hsMvJOkxY+0wNRA==",
+ "version": "19.2.14",
+ "resolved": "https://registry.npmjs.org/@types/react/-/react-19.2.14.tgz",
+ "integrity": "sha512-ilcTH/UniCkMdtexkoCN0bI7pMcJDvmQFPvuPvmEaYA/NSfFTAgdUSLAoVjaRJm7+6PvcM+q1zYOwS4wTYMF9w==",
"dev": true,
"license": "MIT",
"dependencies": {
- "csstype": "^3.0.2"
+ "csstype": "^3.2.2"
}
},
"node_modules/@types/react-dom": {
- "version": "19.2.2",
- "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-19.2.2.tgz",
- "integrity": "sha512-9KQPoO6mZCi7jcIStSnlOWn2nEF3mNmyr3rIAsGnAbQKYbRLyqmeSc39EVgtxXVia+LMT8j3knZLAZAh+xLmrw==",
+ "version": "19.2.3",
+ "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-19.2.3.tgz",
+ "integrity": "sha512-jp2L/eY6fn+KgVVQAOqYItbF0VY/YApe5Mz2F0aykSO8gx31bYCZyvSeYxCHKvzHG5eZjc+zyaS5BrBWya2+kQ==",
"dev": true,
"license": "MIT",
"peerDependencies": {
"@types/react": "^19.2.0"
}
},
- "node_modules/@vercel/analytics": {
- "version": "1.6.1",
- "resolved": "https://registry.npmjs.org/@vercel/analytics/-/analytics-1.6.1.tgz",
- "integrity": "sha512-oH9He/bEM+6oKlv3chWuOOcp8Y6fo6/PSro8hEkgCW3pu9/OiCXiUpRUogDh3Fs3LH2sosDrx8CxeOLBEE+afg==",
- "license": "MPL-2.0",
- "peerDependencies": {
- "@remix-run/react": "^2",
- "@sveltejs/kit": "^1 || ^2",
- "next": ">= 13",
- "react": "^18 || ^19 || ^19.0.0-rc",
- "svelte": ">= 4",
- "vue": "^3",
- "vue-router": "^4"
+ "node_modules/acorn": {
+ "version": "8.16.0",
+ "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.16.0.tgz",
+ "integrity": "sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw==",
+ "dev": true,
+ "license": "MIT",
+ "bin": {
+ "acorn": "bin/acorn"
},
- "peerDependenciesMeta": {
- "@remix-run/react": {
- "optional": true
- },
- "@sveltejs/kit": {
- "optional": true
- },
- "next": {
- "optional": true
- },
- "react": {
- "optional": true
- },
- "svelte": {
- "optional": true
- },
- "vue": {
- "optional": true
- },
- "vue-router": {
- "optional": true
- }
+ "engines": {
+ "node": ">=0.4.0"
}
},
- "node_modules/@vercel/speed-insights": {
- "version": "1.3.1",
- "resolved": "https://registry.npmjs.org/@vercel/speed-insights/-/speed-insights-1.3.1.tgz",
- "integrity": "sha512-PbEr7FrMkUrGYvlcLHGkXdCkxnylCWePx7lPxxq36DNdfo9mcUjLOmqOyPDHAOgnfqgGGdmE3XI9L/4+5fr+vQ==",
- "license": "Apache-2.0",
+ "node_modules/acorn-jsx": {
+ "version": "5.3.2",
+ "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz",
+ "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==",
+ "dev": true,
+ "license": "MIT",
"peerDependencies": {
- "@sveltejs/kit": "^1 || ^2",
- "next": ">= 13",
- "react": "^18 || ^19 || ^19.0.0-rc",
- "svelte": ">= 4",
- "vue": "^3",
- "vue-router": "^4"
+ "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0"
+ }
+ },
+ "node_modules/ajv": {
+ "version": "6.14.0",
+ "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.14.0.tgz",
+ "integrity": "sha512-IWrosm/yrn43eiKqkfkHis7QioDleaXQHdDVPKg0FSwwd/DuvyX79TZnFOnYpB7dcsFAMmtFztZuXPDvSePkFw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "fast-deep-equal": "^3.1.1",
+ "fast-json-stable-stringify": "^2.0.0",
+ "json-schema-traverse": "^0.4.1",
+ "uri-js": "^4.2.2"
},
- "peerDependenciesMeta": {
- "@sveltejs/kit": {
- "optional": true
- },
- "next": {
- "optional": true
- },
- "react": {
- "optional": true
- },
- "svelte": {
- "optional": true
- },
- "vue": {
- "optional": true
- },
- "vue-router": {
- "optional": true
- }
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/epoberezkin"
+ }
+ },
+ "node_modules/balanced-match": {
+ "version": "4.0.4",
+ "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz",
+ "integrity": "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": "18 || 20 || >=22"
+ }
+ },
+ "node_modules/baseline-browser-mapping": {
+ "version": "2.10.20",
+ "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.10.20.tgz",
+ "integrity": "sha512-1AaXxEPfXT+GvTBJFuy4yXVHWJBXa4OdbIebGN/wX5DlsIkU0+wzGnd2lOzokSk51d5LUmqjgBLRLlypLUqInQ==",
+ "license": "Apache-2.0",
+ "bin": {
+ "baseline-browser-mapping": "dist/cli.cjs"
+ },
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/brace-expansion": {
+ "version": "5.0.5",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.5.tgz",
+ "integrity": "sha512-VZznLgtwhn+Mact9tfiwx64fA9erHH/MCXEUfB/0bX/6Fz6ny5EGTXYltMocqg4xFAQZtnO3DHWWXi8RiuN7cQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "balanced-match": "^4.0.2"
+ },
+ "engines": {
+ "node": "18 || 20 || >=22"
}
},
"node_modules/caniuse-lite": {
- "version": "1.0.30001751",
- "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001751.tgz",
- "integrity": "sha512-A0QJhug0Ly64Ii3eIqHu5X51ebln3k4yTUkY1j8drqpWHVreg/VLijN48cZ1bYPiqOQuqpkIKnzr/Ul8V+p6Cw==",
+ "version": "1.0.30001790",
+ "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001790.tgz",
+ "integrity": "sha512-bOoxfJPyYo+ds6W0YfptaCWbFnJYjh2Y1Eow5lRv+vI2u8ganPZqNm1JwNh0t2ELQCqIWg4B3dWEusgAmsoyOw==",
"funding": [
{
"type": "opencollective",
@@ -1139,26 +1299,65 @@
],
"license": "CC-BY-4.0"
},
- "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==",
- "dev": true,
- "license": "BlueOak-1.0.0",
- "engines": {
- "node": ">=18"
- }
- },
"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/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/cross-spawn": {
+ "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",
+ "shebang-command": "^2.0.0",
+ "which": "^2.0.1"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
"node_modules/csstype": {
- "version": "3.1.3",
- "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz",
- "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==",
+ "version": "3.2.3",
+ "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz",
+ "integrity": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/debug": {
+ "version": "4.4.3",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz",
+ "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ms": "^2.1.3"
+ },
+ "engines": {
+ "node": ">=6.0"
+ },
+ "peerDependenciesMeta": {
+ "supports-color": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/deep-is": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz",
+ "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==",
"dev": true,
"license": "MIT"
},
@@ -1173,46 +1372,269 @@
}
},
"node_modules/enhanced-resolve": {
- "version": "5.18.3",
- "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.18.3.tgz",
- "integrity": "sha512-d4lC8xfavMeBjzGr2vECC3fsGXziXZQyJxD868h2M/mBI3PwAuODxAkLkq5HYuvrPYcUtiLzsTo8U3PgX3Ocww==",
+ "version": "5.20.1",
+ "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.20.1.tgz",
+ "integrity": "sha512-Qohcme7V1inbAfvjItgw0EaxVX5q2rdVEZHRBrEQdRZTssLDGsL8Lwrznl8oQ/6kuTJONLaDcGjkNP247XEhcA==",
"dev": true,
"license": "MIT",
"dependencies": {
"graceful-fs": "^4.2.4",
- "tapable": "^2.2.0"
+ "tapable": "^2.3.0"
},
"engines": {
"node": ">=10.13.0"
}
},
- "node_modules/framer-motion": {
- "version": "12.33.0",
- "resolved": "https://registry.npmjs.org/framer-motion/-/framer-motion-12.33.0.tgz",
- "integrity": "sha512-ca8d+rRPcDP5iIF+MoT3WNc0KHJMjIyFAbtVLvM9eA7joGSpeqDfiNH/kCs1t4CHi04njYvWyj0jS4QlEK/rJQ==",
+ "node_modules/escape-string-regexp": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz",
+ "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/eslint": {
+ "version": "10.2.1",
+ "resolved": "https://registry.npmjs.org/eslint/-/eslint-10.2.1.tgz",
+ "integrity": "sha512-wiyGaKsDgqXvF40P8mDwiUp/KQjE1FdrIEJsM8PZ3XCiniTMXS3OHWWUe5FI5agoCnr8x4xPrTDZuxsBlNHl+Q==",
+ "dev": true,
"license": "MIT",
"dependencies": {
- "motion-dom": "^12.33.0",
- "motion-utils": "^12.29.2",
- "tslib": "^2.4.0"
+ "@eslint-community/eslint-utils": "^4.8.0",
+ "@eslint-community/regexpp": "^4.12.2",
+ "@eslint/config-array": "^0.23.5",
+ "@eslint/config-helpers": "^0.5.5",
+ "@eslint/core": "^1.2.1",
+ "@eslint/plugin-kit": "^0.7.1",
+ "@humanfs/node": "^0.16.6",
+ "@humanwhocodes/module-importer": "^1.0.1",
+ "@humanwhocodes/retry": "^0.4.2",
+ "@types/estree": "^1.0.6",
+ "ajv": "^6.14.0",
+ "cross-spawn": "^7.0.6",
+ "debug": "^4.3.2",
+ "escape-string-regexp": "^4.0.0",
+ "eslint-scope": "^9.1.2",
+ "eslint-visitor-keys": "^5.0.1",
+ "espree": "^11.2.0",
+ "esquery": "^1.7.0",
+ "esutils": "^2.0.2",
+ "fast-deep-equal": "^3.1.3",
+ "file-entry-cache": "^8.0.0",
+ "find-up": "^5.0.0",
+ "glob-parent": "^6.0.2",
+ "ignore": "^5.2.0",
+ "imurmurhash": "^0.1.4",
+ "is-glob": "^4.0.0",
+ "json-stable-stringify-without-jsonify": "^1.0.1",
+ "minimatch": "^10.2.4",
+ "natural-compare": "^1.4.0",
+ "optionator": "^0.9.3"
+ },
+ "bin": {
+ "eslint": "bin/eslint.js"
+ },
+ "engines": {
+ "node": "^20.19.0 || ^22.13.0 || >=24"
+ },
+ "funding": {
+ "url": "https://eslint.org/donate"
},
"peerDependencies": {
- "@emotion/is-prop-valid": "*",
- "react": "^18.0.0 || ^19.0.0",
- "react-dom": "^18.0.0 || ^19.0.0"
+ "jiti": "*"
},
"peerDependenciesMeta": {
- "@emotion/is-prop-valid": {
- "optional": true
- },
- "react": {
- "optional": true
- },
- "react-dom": {
+ "jiti": {
"optional": true
}
}
},
+ "node_modules/eslint-scope": {
+ "version": "9.1.2",
+ "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-9.1.2.tgz",
+ "integrity": "sha512-xS90H51cKw0jltxmvmHy2Iai1LIqrfbw57b79w/J7MfvDfkIkFZ+kj6zC3BjtUwh150HsSSdxXZcsuv72miDFQ==",
+ "dev": true,
+ "license": "BSD-2-Clause",
+ "dependencies": {
+ "@types/esrecurse": "^4.3.1",
+ "@types/estree": "^1.0.8",
+ "esrecurse": "^4.3.0",
+ "estraverse": "^5.2.0"
+ },
+ "engines": {
+ "node": "^20.19.0 || ^22.13.0 || >=24"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint"
+ }
+ },
+ "node_modules/eslint-visitor-keys": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-5.0.1.tgz",
+ "integrity": "sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "engines": {
+ "node": "^20.19.0 || ^22.13.0 || >=24"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint"
+ }
+ },
+ "node_modules/espree": {
+ "version": "11.2.0",
+ "resolved": "https://registry.npmjs.org/espree/-/espree-11.2.0.tgz",
+ "integrity": "sha512-7p3DrVEIopW1B1avAGLuCSh1jubc01H2JHc8B4qqGblmg5gI9yumBgACjWo4JlIc04ufug4xJ3SQI8HkS/Rgzw==",
+ "dev": true,
+ "license": "BSD-2-Clause",
+ "dependencies": {
+ "acorn": "^8.16.0",
+ "acorn-jsx": "^5.3.2",
+ "eslint-visitor-keys": "^5.0.1"
+ },
+ "engines": {
+ "node": "^20.19.0 || ^22.13.0 || >=24"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint"
+ }
+ },
+ "node_modules/esquery": {
+ "version": "1.7.0",
+ "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.7.0.tgz",
+ "integrity": "sha512-Ap6G0WQwcU/LHsvLwON1fAQX9Zp0A2Y6Y/cJBl9r/JbW90Zyg4/zbG6zzKa2OTALELarYHmKu0GhpM5EO+7T0g==",
+ "dev": true,
+ "license": "BSD-3-Clause",
+ "dependencies": {
+ "estraverse": "^5.1.0"
+ },
+ "engines": {
+ "node": ">=0.10"
+ }
+ },
+ "node_modules/esrecurse": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz",
+ "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==",
+ "dev": true,
+ "license": "BSD-2-Clause",
+ "dependencies": {
+ "estraverse": "^5.2.0"
+ },
+ "engines": {
+ "node": ">=4.0"
+ }
+ },
+ "node_modules/estraverse": {
+ "version": "5.3.0",
+ "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz",
+ "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==",
+ "dev": true,
+ "license": "BSD-2-Clause",
+ "engines": {
+ "node": ">=4.0"
+ }
+ },
+ "node_modules/esutils": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz",
+ "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==",
+ "dev": true,
+ "license": "BSD-2-Clause",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/fast-deep-equal": {
+ "version": "3.1.3",
+ "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
+ "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/fast-json-stable-stringify": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz",
+ "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/fast-levenshtein": {
+ "version": "2.0.6",
+ "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz",
+ "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/file-entry-cache": {
+ "version": "8.0.0",
+ "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz",
+ "integrity": "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "flat-cache": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=16.0.0"
+ }
+ },
+ "node_modules/find-up": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz",
+ "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "locate-path": "^6.0.0",
+ "path-exists": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/flat-cache": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz",
+ "integrity": "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "flatted": "^3.2.9",
+ "keyv": "^4.5.4"
+ },
+ "engines": {
+ "node": ">=16"
+ }
+ },
+ "node_modules/flatted": {
+ "version": "3.4.2",
+ "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.4.2.tgz",
+ "integrity": "sha512-PjDse7RzhcPkIJwy5t7KPWQSZ9cAbzQXcafsetQoD7sOJRQlGikNbx7yZp2OotDnJyrDcbyRq3Ttb18iYOqkxA==",
+ "dev": true,
+ "license": "ISC"
+ },
+ "node_modules/glob-parent": {
+ "version": "6.0.2",
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz",
+ "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "is-glob": "^4.0.3"
+ },
+ "engines": {
+ "node": ">=10.13.0"
+ }
+ },
"node_modules/graceful-fs": {
"version": "4.2.11",
"resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz",
@@ -1220,6 +1642,62 @@
"dev": true,
"license": "ISC"
},
+ "node_modules/gsap": {
+ "version": "3.15.0",
+ "resolved": "https://registry.npmjs.org/gsap/-/gsap-3.15.0.tgz",
+ "integrity": "sha512-dMW4CWBTUK1AEEDeZc1g4xpPGIrSf9fJF960qbTZmN/QwZIWY5wgliS6JWl9/25fpTGJrMRtSjGtOmPnfjZB+A==",
+ "license": "Standard 'no charge' license: https://gsap.com/standard-license."
+ },
+ "node_modules/ignore": {
+ "version": "5.3.2",
+ "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz",
+ "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 4"
+ }
+ },
+ "node_modules/imurmurhash": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz",
+ "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.8.19"
+ }
+ },
+ "node_modules/is-extglob": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
+ "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/is-glob": {
+ "version": "4.0.3",
+ "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz",
+ "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "is-extglob": "^2.1.1"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/isexe": {
+ "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/jiti": {
"version": "2.6.1",
"resolved": "https://registry.npmjs.org/jiti/-/jiti-2.6.1.tgz",
@@ -1230,10 +1708,55 @@
"jiti": "lib/jiti-cli.mjs"
}
},
+ "node_modules/json-buffer": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz",
+ "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/json-schema-traverse": {
+ "version": "0.4.1",
+ "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
+ "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/json-stable-stringify-without-jsonify": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz",
+ "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/keyv": {
+ "version": "4.5.4",
+ "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz",
+ "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "json-buffer": "3.0.1"
+ }
+ },
+ "node_modules/levn": {
+ "version": "0.4.1",
+ "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz",
+ "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "prelude-ls": "^1.2.1",
+ "type-check": "~0.4.0"
+ },
+ "engines": {
+ "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==",
+ "version": "1.32.0",
+ "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.32.0.tgz",
+ "integrity": "sha512-NXYBzinNrblfraPGyrbPoD19C1h9lfI/1mzgWYvXUTe414Gz/X1FD2XBZSZM7rRTrMA8JL3OtAaGifrIKhQ5yQ==",
"dev": true,
"license": "MPL-2.0",
"dependencies": {
@@ -1247,22 +1770,44 @@
"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"
+ "lightningcss-android-arm64": "1.32.0",
+ "lightningcss-darwin-arm64": "1.32.0",
+ "lightningcss-darwin-x64": "1.32.0",
+ "lightningcss-freebsd-x64": "1.32.0",
+ "lightningcss-linux-arm-gnueabihf": "1.32.0",
+ "lightningcss-linux-arm64-gnu": "1.32.0",
+ "lightningcss-linux-arm64-musl": "1.32.0",
+ "lightningcss-linux-x64-gnu": "1.32.0",
+ "lightningcss-linux-x64-musl": "1.32.0",
+ "lightningcss-win32-arm64-msvc": "1.32.0",
+ "lightningcss-win32-x64-msvc": "1.32.0"
+ }
+ },
+ "node_modules/lightningcss-android-arm64": {
+ "version": "1.32.0",
+ "resolved": "https://registry.npmjs.org/lightningcss-android-arm64/-/lightningcss-android-arm64-1.32.0.tgz",
+ "integrity": "sha512-YK7/ClTt4kAK0vo6w3X+Pnm0D2cf2vPHbhOXdoNti1Ga0al1P4TBZhwjATvjNwLEBCnKvjJc2jQgHXH0NEwlAg==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MPL-2.0",
+ "optional": true,
+ "os": [
+ "android"
+ ],
+ "engines": {
+ "node": ">= 12.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
}
},
"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==",
+ "version": "1.32.0",
+ "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.32.0.tgz",
+ "integrity": "sha512-RzeG9Ju5bag2Bv1/lwlVJvBE3q6TtXskdZLLCyfg5pt+HLz9BqlICO7LZM7VHNTTn/5PRhHFBSjk5lc4cmscPQ==",
"cpu": [
"arm64"
],
@@ -1281,9 +1826,9 @@
}
},
"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==",
+ "version": "1.32.0",
+ "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.32.0.tgz",
+ "integrity": "sha512-U+QsBp2m/s2wqpUYT/6wnlagdZbtZdndSmut/NJqlCcMLTWp5muCrID+K5UJ6jqD2BFshejCYXniPDbNh73V8w==",
"cpu": [
"x64"
],
@@ -1302,9 +1847,9 @@
}
},
"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==",
+ "version": "1.32.0",
+ "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.32.0.tgz",
+ "integrity": "sha512-JCTigedEksZk3tHTTthnMdVfGf61Fky8Ji2E4YjUTEQX14xiy/lTzXnu1vwiZe3bYe0q+SpsSH/CTeDXK6WHig==",
"cpu": [
"x64"
],
@@ -1323,9 +1868,9 @@
}
},
"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==",
+ "version": "1.32.0",
+ "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.32.0.tgz",
+ "integrity": "sha512-x6rnnpRa2GL0zQOkt6rts3YDPzduLpWvwAF6EMhXFVZXD4tPrBkEFqzGowzCsIWsPjqSK+tyNEODUBXeeVHSkw==",
"cpu": [
"arm"
],
@@ -1344,9 +1889,9 @@
}
},
"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==",
+ "version": "1.32.0",
+ "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.32.0.tgz",
+ "integrity": "sha512-0nnMyoyOLRJXfbMOilaSRcLH3Jw5z9HDNGfT/gwCPgaDjnx0i8w7vBzFLFR1f6CMLKF8gVbebmkUN3fa/kQJpQ==",
"cpu": [
"arm64"
],
@@ -1365,9 +1910,9 @@
}
},
"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==",
+ "version": "1.32.0",
+ "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.32.0.tgz",
+ "integrity": "sha512-UpQkoenr4UJEzgVIYpI80lDFvRmPVg6oqboNHfoH4CQIfNA+HOrZ7Mo7KZP02dC6LjghPQJeBsvXhJod/wnIBg==",
"cpu": [
"arm64"
],
@@ -1386,9 +1931,9 @@
}
},
"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==",
+ "version": "1.32.0",
+ "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.32.0.tgz",
+ "integrity": "sha512-V7Qr52IhZmdKPVr+Vtw8o+WLsQJYCTd8loIfpDaMRWGUZfBOYEJeyJIkqGIDMZPwPx24pUMfwSxxI8phr/MbOA==",
"cpu": [
"x64"
],
@@ -1407,9 +1952,9 @@
}
},
"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==",
+ "version": "1.32.0",
+ "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.32.0.tgz",
+ "integrity": "sha512-bYcLp+Vb0awsiXg/80uCRezCYHNg1/l3mt0gzHnWV9XP1W5sKa5/TCdGWaR/zBM2PeF/HbsQv/j2URNOiVuxWg==",
"cpu": [
"x64"
],
@@ -1428,9 +1973,9 @@
}
},
"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==",
+ "version": "1.32.0",
+ "resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.32.0.tgz",
+ "integrity": "sha512-8SbC8BR40pS6baCM8sbtYDSwEVQd4JlFTOlaD3gWGHfThTcABnNDBda6eTZeqbofalIJhFx0qKzgHJmcPTnGdw==",
"cpu": [
"arm64"
],
@@ -1449,9 +1994,9 @@
}
},
"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==",
+ "version": "1.32.0",
+ "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.32.0.tgz",
+ "integrity": "sha512-Amq9B/SoZYdDi1kFrojnoqPLxYhQ4Wo5XiL8EVJrVsB8ARoC1PWW6VGtT0WKCemjy8aC+louJnjS7U18x3b06Q==",
"cpu": [
"x64"
],
@@ -1469,52 +2014,62 @@
"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",
+ "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "p-locate": "^5.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/lucide-react": {
+ "version": "1.8.0",
+ "resolved": "https://registry.npmjs.org/lucide-react/-/lucide-react-1.8.0.tgz",
+ "integrity": "sha512-WuvlsjngSk7TnTBJ1hsCy3ql9V9VOdcPkd3PKcSmM34vJD8KG6molxz7m7zbYFgICwsanQWmJ13JlYs4Zp7Arw==",
+ "license": "ISC",
+ "peerDependencies": {
+ "react": "^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0"
+ }
+ },
"node_modules/magic-string": {
- "version": "0.30.19",
- "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.19.tgz",
- "integrity": "sha512-2N21sPY9Ws53PZvsEpVtNuSW+ScYbQdp4b9qUaL+9QkHUrGFKo56Lg9Emg5s9V/qrtNBmiR01sYhUOwu3H+VOw==",
+ "version": "0.30.21",
+ "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz",
+ "integrity": "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==",
"dev": true,
"license": "MIT",
"dependencies": {
"@jridgewell/sourcemap-codec": "^1.5.5"
}
},
- "node_modules/minipass": {
- "version": "7.1.2",
- "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz",
- "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==",
+ "node_modules/minimatch": {
+ "version": "10.2.5",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.5.tgz",
+ "integrity": "sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg==",
"dev": true,
- "license": "ISC",
- "engines": {
- "node": ">=16 || 14 >=14.17"
- }
- },
- "node_modules/minizlib": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-3.1.0.tgz",
- "integrity": "sha512-KZxYo1BUkWD2TVFLr0MQoM8vUUigWD3LlD83a/75BqC+4qE0Hb1Vo5v1FgcfaNXvfXzr+5EhQ6ing/CaBijTlw==",
- "dev": true,
- "license": "MIT",
+ "license": "BlueOak-1.0.0",
"dependencies": {
- "minipass": "^7.1.2"
+ "brace-expansion": "^5.0.5"
},
"engines": {
- "node": ">= 18"
+ "node": "18 || 20 || >=22"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
}
},
- "node_modules/motion-dom": {
- "version": "12.33.0",
- "resolved": "https://registry.npmjs.org/motion-dom/-/motion-dom-12.33.0.tgz",
- "integrity": "sha512-XRPebVypsl0UM+7v0Hr8o9UAj0S2djsQWRdHBd5iVouVpMrQqAI0C/rDAT3QaYnXnHuC5hMcwDHCboNeyYjPoQ==",
- "license": "MIT",
- "dependencies": {
- "motion-utils": "^12.29.2"
- }
- },
- "node_modules/motion-utils": {
- "version": "12.29.2",
- "resolved": "https://registry.npmjs.org/motion-utils/-/motion-utils-12.29.2.tgz",
- "integrity": "sha512-G3kc34H2cX2gI63RqU+cZq+zWRRPSsNIOjpdl9TN4AQwC4sgwYPl/Q/Obf/d53nOm569T0fYK+tcoSV50BWx8A==",
+ "node_modules/ms": {
+ "version": "2.1.3",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
+ "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==",
+ "dev": true,
"license": "MIT"
},
"node_modules/nanoid": {
@@ -1535,14 +2090,22 @@
"node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1"
}
},
+ "node_modules/natural-compare": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz",
+ "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==",
+ "dev": true,
+ "license": "MIT"
+ },
"node_modules/next": {
- "version": "15.5.12",
- "resolved": "https://registry.npmjs.org/next/-/next-15.5.12.tgz",
- "integrity": "sha512-Fi/wQ4Etlrn60rz78bebG1i1SR20QxvV8tVp6iJspjLUSHcZoeUXCt+vmWoEcza85ElZzExK/jJ/F6SvtGktjA==",
+ "version": "16.2.4",
+ "resolved": "https://registry.npmjs.org/next/-/next-16.2.4.tgz",
+ "integrity": "sha512-kPvz56wF5frc+FxlHI5qnklCzbq53HTwORaWBGdT0vNoKh1Aya9XC8aPauH4NJxqtzbWsS5mAbctm4cr+EkQ2Q==",
"license": "MIT",
"dependencies": {
- "@next/env": "15.5.12",
+ "@next/env": "16.2.4",
"@swc/helpers": "0.5.15",
+ "baseline-browser-mapping": "^2.9.19",
"caniuse-lite": "^1.0.30001579",
"postcss": "8.4.31",
"styled-jsx": "5.1.6"
@@ -1551,18 +2114,18 @@
"next": "dist/bin/next"
},
"engines": {
- "node": "^18.18.0 || ^19.8.0 || >= 20.0.0"
+ "node": ">=20.9.0"
},
"optionalDependencies": {
- "@next/swc-darwin-arm64": "15.5.12",
- "@next/swc-darwin-x64": "15.5.12",
- "@next/swc-linux-arm64-gnu": "15.5.12",
- "@next/swc-linux-arm64-musl": "15.5.12",
- "@next/swc-linux-x64-gnu": "15.5.12",
- "@next/swc-linux-x64-musl": "15.5.12",
- "@next/swc-win32-arm64-msvc": "15.5.12",
- "@next/swc-win32-x64-msvc": "15.5.12",
- "sharp": "^0.34.3"
+ "@next/swc-darwin-arm64": "16.2.4",
+ "@next/swc-darwin-x64": "16.2.4",
+ "@next/swc-linux-arm64-gnu": "16.2.4",
+ "@next/swc-linux-arm64-musl": "16.2.4",
+ "@next/swc-linux-x64-gnu": "16.2.4",
+ "@next/swc-linux-x64-musl": "16.2.4",
+ "@next/swc-win32-arm64-msvc": "16.2.4",
+ "@next/swc-win32-x64-msvc": "16.2.4",
+ "sharp": "^0.34.5"
},
"peerDependencies": {
"@opentelemetry/api": "^1.1.0",
@@ -1615,6 +2178,76 @@
"node": "^10 || ^12 || >=14"
}
},
+ "node_modules/optionator": {
+ "version": "0.9.4",
+ "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz",
+ "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "deep-is": "^0.1.3",
+ "fast-levenshtein": "^2.0.6",
+ "levn": "^0.4.1",
+ "prelude-ls": "^1.2.1",
+ "type-check": "^0.4.0",
+ "word-wrap": "^1.2.5"
+ },
+ "engines": {
+ "node": ">= 0.8.0"
+ }
+ },
+ "node_modules/p-limit": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz",
+ "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "yocto-queue": "^0.1.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/p-locate": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz",
+ "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "p-limit": "^3.0.2"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/path-exists": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz",
+ "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/path-key": {
+ "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"
+ }
+ },
"node_modules/picocolors": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz",
@@ -1622,9 +2255,9 @@
"license": "ISC"
},
"node_modules/postcss": {
- "version": "8.5.6",
- "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.6.tgz",
- "integrity": "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==",
+ "version": "8.5.10",
+ "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.10.tgz",
+ "integrity": "sha512-pMMHxBOZKFU6HgAZ4eyGnwXF/EvPGGqUr0MnZ5+99485wwW41kW91A4LOGxSHhgugZmSChL5AlElNdwlNgcnLQ==",
"dev": true,
"funding": [
{
@@ -1650,37 +2283,57 @@
"node": "^10 || ^12 || >=14"
}
},
+ "node_modules/prelude-ls": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz",
+ "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.8.0"
+ }
+ },
+ "node_modules/punycode": {
+ "version": "2.3.1",
+ "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz",
+ "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
"node_modules/react": {
- "version": "19.1.0",
- "resolved": "https://registry.npmjs.org/react/-/react-19.1.0.tgz",
- "integrity": "sha512-FS+XFBNvn3GTAWq26joslQgWNoFu08F4kl0J4CgdNKADkdSGXQyTCnKteIAJy96Br6YbpEU1LSzV5dYtjMkMDg==",
+ "version": "19.2.5",
+ "resolved": "https://registry.npmjs.org/react/-/react-19.2.5.tgz",
+ "integrity": "sha512-llUJLzz1zTUBrskt2pwZgLq59AemifIftw4aB7JxOqf1HY2FDaGDxgwpAPVzHU1kdWabH7FauP4i1oEeer2WCA==",
"license": "MIT",
"engines": {
"node": ">=0.10.0"
}
},
"node_modules/react-dom": {
- "version": "19.1.0",
- "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.1.0.tgz",
- "integrity": "sha512-Xs1hdnE+DyKgeHJeJznQmYMIBG3TKIHJJT95Q58nHLSrElKlGQqDTR2HQ9fx5CN/Gk6Vh/kupBTDLU11/nDk/g==",
+ "version": "19.2.5",
+ "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.2.5.tgz",
+ "integrity": "sha512-J5bAZz+DXMMwW/wV3xzKke59Af6CHY7G4uYLN1OvBcKEsWOs4pQExj86BBKamxl/Ik5bx9whOrvBlSDfWzgSag==",
"license": "MIT",
"dependencies": {
- "scheduler": "^0.26.0"
+ "scheduler": "^0.27.0"
},
"peerDependencies": {
- "react": "^19.1.0"
+ "react": "^19.2.5"
}
},
"node_modules/scheduler": {
- "version": "0.26.0",
- "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.26.0.tgz",
- "integrity": "sha512-NlHwttCI/l5gCPR3D1nNXtWABUmBwvZpEQiD4IXSbIDq8BzLIK/7Ir5gTFSGZDUu37K5cMNp0hFtzO38sC7gWA==",
+ "version": "0.27.0",
+ "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.27.0.tgz",
+ "integrity": "sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q==",
"license": "MIT"
},
"node_modules/semver": {
- "version": "7.7.3",
- "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz",
- "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==",
+ "version": "7.7.4",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz",
+ "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==",
"license": "ISC",
"optional": true,
"bin": {
@@ -1691,16 +2344,16 @@
}
},
"node_modules/sharp": {
- "version": "0.34.4",
- "resolved": "https://registry.npmjs.org/sharp/-/sharp-0.34.4.tgz",
- "integrity": "sha512-FUH39xp3SBPnxWvd5iib1X8XY7J0K0X7d93sie9CJg2PO8/7gmg89Nve6OjItK53/MlAushNNxteBYfM6DEuoA==",
+ "version": "0.34.5",
+ "resolved": "https://registry.npmjs.org/sharp/-/sharp-0.34.5.tgz",
+ "integrity": "sha512-Ou9I5Ft9WNcCbXrU9cMgPBcCK8LiwLqcbywW3t4oDV37n1pzpuNLsYiAV8eODnjbtQlSDwZ2cUEeQz4E54Hltg==",
"hasInstallScript": true,
"license": "Apache-2.0",
"optional": true,
"dependencies": {
"@img/colour": "^1.0.0",
- "detect-libc": "^2.1.0",
- "semver": "^7.7.2"
+ "detect-libc": "^2.1.2",
+ "semver": "^7.7.3"
},
"engines": {
"node": "^18.17.0 || ^20.3.0 || >=21.0.0"
@@ -1709,28 +2362,53 @@
"url": "https://opencollective.com/libvips"
},
"optionalDependencies": {
- "@img/sharp-darwin-arm64": "0.34.4",
- "@img/sharp-darwin-x64": "0.34.4",
- "@img/sharp-libvips-darwin-arm64": "1.2.3",
- "@img/sharp-libvips-darwin-x64": "1.2.3",
- "@img/sharp-libvips-linux-arm": "1.2.3",
- "@img/sharp-libvips-linux-arm64": "1.2.3",
- "@img/sharp-libvips-linux-ppc64": "1.2.3",
- "@img/sharp-libvips-linux-s390x": "1.2.3",
- "@img/sharp-libvips-linux-x64": "1.2.3",
- "@img/sharp-libvips-linuxmusl-arm64": "1.2.3",
- "@img/sharp-libvips-linuxmusl-x64": "1.2.3",
- "@img/sharp-linux-arm": "0.34.4",
- "@img/sharp-linux-arm64": "0.34.4",
- "@img/sharp-linux-ppc64": "0.34.4",
- "@img/sharp-linux-s390x": "0.34.4",
- "@img/sharp-linux-x64": "0.34.4",
- "@img/sharp-linuxmusl-arm64": "0.34.4",
- "@img/sharp-linuxmusl-x64": "0.34.4",
- "@img/sharp-wasm32": "0.34.4",
- "@img/sharp-win32-arm64": "0.34.4",
- "@img/sharp-win32-ia32": "0.34.4",
- "@img/sharp-win32-x64": "0.34.4"
+ "@img/sharp-darwin-arm64": "0.34.5",
+ "@img/sharp-darwin-x64": "0.34.5",
+ "@img/sharp-libvips-darwin-arm64": "1.2.4",
+ "@img/sharp-libvips-darwin-x64": "1.2.4",
+ "@img/sharp-libvips-linux-arm": "1.2.4",
+ "@img/sharp-libvips-linux-arm64": "1.2.4",
+ "@img/sharp-libvips-linux-ppc64": "1.2.4",
+ "@img/sharp-libvips-linux-riscv64": "1.2.4",
+ "@img/sharp-libvips-linux-s390x": "1.2.4",
+ "@img/sharp-libvips-linux-x64": "1.2.4",
+ "@img/sharp-libvips-linuxmusl-arm64": "1.2.4",
+ "@img/sharp-libvips-linuxmusl-x64": "1.2.4",
+ "@img/sharp-linux-arm": "0.34.5",
+ "@img/sharp-linux-arm64": "0.34.5",
+ "@img/sharp-linux-ppc64": "0.34.5",
+ "@img/sharp-linux-riscv64": "0.34.5",
+ "@img/sharp-linux-s390x": "0.34.5",
+ "@img/sharp-linux-x64": "0.34.5",
+ "@img/sharp-linuxmusl-arm64": "0.34.5",
+ "@img/sharp-linuxmusl-x64": "0.34.5",
+ "@img/sharp-wasm32": "0.34.5",
+ "@img/sharp-win32-arm64": "0.34.5",
+ "@img/sharp-win32-ia32": "0.34.5",
+ "@img/sharp-win32-x64": "0.34.5"
+ }
+ },
+ "node_modules/shebang-command": {
+ "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"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/shebang-regex": {
+ "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"
}
},
"node_modules/source-map-js": {
@@ -1765,17 +2443,26 @@
}
}
},
+ "node_modules/tailwind-merge": {
+ "version": "3.5.0",
+ "resolved": "https://registry.npmjs.org/tailwind-merge/-/tailwind-merge-3.5.0.tgz",
+ "integrity": "sha512-I8K9wewnVDkL1NTGoqWmVEIlUcB9gFriAEkXkfCjX5ib8ezGxtR3xD7iZIxrfArjEsH7F1CHD4RFUtxefdqV/A==",
+ "license": "MIT",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/dcastil"
+ }
+ },
"node_modules/tailwindcss": {
- "version": "4.1.14",
- "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-4.1.14.tgz",
- "integrity": "sha512-b7pCxjGO98LnxVkKjaZSDeNuljC4ueKUddjENJOADtubtdo8llTaJy7HwBMeLNSSo2N5QIAgklslK1+Ir8r6CA==",
- "dev": true,
+ "version": "4.2.4",
+ "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-4.2.4.tgz",
+ "integrity": "sha512-HhKppgO81FQof5m6TEnuBWCZGgfRAWbaeOaGT00KOy/Pf/j6oUihdvBpA7ltCeAvZpFhW3j0PTclkxsd4IXYDA==",
"license": "MIT"
},
"node_modules/tapable": {
- "version": "2.3.0",
- "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.3.0.tgz",
- "integrity": "sha512-g9ljZiwki/LfxmQADO3dEY1CbpmXT5Hm2fJ+QaGKwSXUylMybePR7/67YW7jOrrvjEgL1Fmz5kzyAjWVWLlucg==",
+ "version": "2.3.3",
+ "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.3.3.tgz",
+ "integrity": "sha512-uxc/zpqFg6x7C8vOE7lh6Lbda8eEL9zmVm/PLeTPBRhh1xCgdWaQ+J1CUieGpIfm2HdtsUpRv+HshiasBMcc6A==",
"dev": true,
"license": "MIT",
"engines": {
@@ -1786,33 +2473,29 @@
"url": "https://opencollective.com/webpack"
}
},
- "node_modules/tar": {
- "version": "7.5.7",
- "resolved": "https://registry.npmjs.org/tar/-/tar-7.5.7.tgz",
- "integrity": "sha512-fov56fJiRuThVFXD6o6/Q354S7pnWMJIVlDBYijsTNx6jKSE4pvrDTs6lUnmGvNyfJwFQQwWy3owKz1ucIhveQ==",
- "dev": true,
- "license": "BlueOak-1.0.0",
- "dependencies": {
- "@isaacs/fs-minipass": "^4.0.0",
- "chownr": "^3.0.0",
- "minipass": "^7.1.2",
- "minizlib": "^3.1.0",
- "yallist": "^5.0.0"
- },
- "engines": {
- "node": ">=18"
- }
- },
"node_modules/tslib": {
"version": "2.8.1",
"resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz",
"integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==",
"license": "0BSD"
},
+ "node_modules/type-check": {
+ "version": "0.4.0",
+ "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz",
+ "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "prelude-ls": "^1.2.1"
+ },
+ "engines": {
+ "node": ">= 0.8.0"
+ }
+ },
"node_modules/typescript": {
- "version": "5.9.3",
- "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz",
- "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==",
+ "version": "6.0.3",
+ "resolved": "https://registry.npmjs.org/typescript/-/typescript-6.0.3.tgz",
+ "integrity": "sha512-y2TvuxSZPDyQakkFRPZHKFm+KKVqIisdg9/CZwm9ftvKXLP8NRWj38/ODjNbr43SsoXqNuAisEf1GdCxqWcdBw==",
"dev": true,
"license": "Apache-2.0",
"bin": {
@@ -1824,20 +2507,59 @@
}
},
"node_modules/undici-types": {
- "version": "6.21.0",
- "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz",
- "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==",
+ "version": "7.16.0",
+ "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.16.0.tgz",
+ "integrity": "sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw==",
"dev": true,
"license": "MIT"
},
- "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==",
+ "node_modules/uri-js": {
+ "version": "4.4.1",
+ "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz",
+ "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==",
"dev": true,
- "license": "BlueOak-1.0.0",
+ "license": "BSD-2-Clause",
+ "dependencies": {
+ "punycode": "^2.1.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"
+ },
+ "bin": {
+ "node-which": "bin/node-which"
+ },
"engines": {
- "node": ">=18"
+ "node": ">= 8"
+ }
+ },
+ "node_modules/word-wrap": {
+ "version": "1.2.5",
+ "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz",
+ "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/yocto-queue": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz",
+ "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
}
}
}
diff --git a/package.json b/package.json
index 12a7baa..bc23693 100644
--- a/package.json
+++ b/package.json
@@ -1,26 +1,31 @@
{
"name": "portfolio",
- "version": "0.1.0",
"private": true,
+ "version": "0.0.0",
+ "type": "module",
"scripts": {
- "dev": "next dev --turbopack",
- "build": "next build --turbopack",
- "start": "next start"
+ "dev": "next dev",
+ "build": "next build",
+ "start": "next start",
+ "lint": "next lint"
},
"dependencies": {
- "@vercel/analytics": "^1.6.1",
- "@vercel/speed-insights": "^1.3.1",
- "framer-motion": "^12.33.0",
- "next": "^15.5.12",
- "react": "19.1.0",
- "react-dom": "19.1.0"
+ "clsx": "^2.1.1",
+ "gsap": "^3.15.0",
+ "lucide-react": "^1.8.0",
+ "next": "^16.2.4",
+ "react": "^19.2.5",
+ "react-dom": "^19.2.5",
+ "tailwind-merge": "^3.5.0",
+ "tailwindcss": "^4.2.4"
},
"devDependencies": {
- "@tailwindcss/postcss": "^4",
- "@types/node": "^20",
- "@types/react": "^19",
- "@types/react-dom": "^19",
- "tailwindcss": "^4",
- "typescript": "^5"
+ "@tailwindcss/postcss": "^4.2.4",
+ "@types/node": "^24.12.2",
+ "@types/react": "^19.2.14",
+ "@types/react-dom": "^19.2.3",
+ "eslint": "^10.2.1",
+ "postcss": "^8.5.0",
+ "typescript": "~6.0.2"
}
}
diff --git a/postcss.config.mjs b/postcss.config.mjs
index c7bcb4b..79bcf13 100644
--- a/postcss.config.mjs
+++ b/postcss.config.mjs
@@ -1,5 +1,8 @@
+/** @type {import('postcss-load-config').Config} */
const config = {
- plugins: ["@tailwindcss/postcss"],
+ plugins: {
+ "@tailwindcss/postcss": {},
+ },
};
export default config;
diff --git a/public/assets/debugger-view.jpg b/public/assets/debugger-view.jpg
new file mode 100644
index 0000000..0034362
Binary files /dev/null and b/public/assets/debugger-view.jpg differ
diff --git a/public/assets/emulator-display.jpg b/public/assets/emulator-display.jpg
new file mode 100644
index 0000000..9007526
Binary files /dev/null and b/public/assets/emulator-display.jpg differ
diff --git a/public/assets/emulator-screenshot.jpg b/public/assets/emulator-screenshot.jpg
new file mode 100644
index 0000000..d75541c
Binary files /dev/null and b/public/assets/emulator-screenshot.jpg differ
diff --git a/public/assets/raycaster-screenshot.jpg b/public/assets/raycaster-screenshot.jpg
new file mode 100644
index 0000000..1eb1f42
Binary files /dev/null and b/public/assets/raycaster-screenshot.jpg differ
diff --git a/public/assets/raytracer-cornell.jpg b/public/assets/raytracer-cornell.jpg
new file mode 100644
index 0000000..356fe02
Binary files /dev/null and b/public/assets/raytracer-cornell.jpg differ
diff --git a/public/assets/raytracer-metal.jpg b/public/assets/raytracer-metal.jpg
new file mode 100644
index 0000000..a6b23a9
Binary files /dev/null and b/public/assets/raytracer-metal.jpg differ
diff --git a/public/assets/raytracer-render.jpg b/public/assets/raytracer-render.jpg
new file mode 100644
index 0000000..d1a28b9
Binary files /dev/null and b/public/assets/raytracer-render.jpg differ
diff --git a/public/favicon.svg b/public/favicon.svg
new file mode 100644
index 0000000..dcccf4c
--- /dev/null
+++ b/public/favicon.svg
@@ -0,0 +1,4 @@
+
+
+ MK
+
diff --git a/src/app/about/page.tsx b/src/app/about/page.tsx
new file mode 100644
index 0000000..353d9bf
--- /dev/null
+++ b/src/app/about/page.tsx
@@ -0,0 +1,133 @@
+import Link from "next/link";
+import { ArrowRight } from "lucide-react";
+import { values, aboutPage } from "@/data/about";
+import { site } from "@/data/site";
+import { Icon } from "@/lib/icons";
+
+export default function AboutPage() {
+ return (
+
+ {/* Header */}
+
+
+
{aboutPage.label}
+
+ {aboutPage.pageTitle}
+
+
+ {aboutPage.pageSubtitle}
+
+
+
+
+ {/* Content */}
+
+
+
+
+ {aboutPage.philosophyTitle}
+
+
+ {aboutPage.philosophyText[0]}
+
+
+ {aboutPage.philosophyText[1]}
+
+
+
+ {aboutPage.backgroundTitle}
+
+
+ {aboutPage.backgroundText[0]}
+
+
+ {aboutPage.backgroundText[1]}
+
+
+
+
+
+ {aboutPage.linkText}
+
+
+
+
+
+
+
+
+
+ {aboutPage.sidebarFocusTitle}
+
+
+ {aboutPage.sidebarFocusItems.map((item) => (
+ {item}
+ ))}
+
+
+
+
+
+ {aboutPage.sidebarLocationTitle}
+
+
+ {site.location}
+
+
+
+
+
+ {aboutPage.sidebarHobbiesTitle}
+
+
+ {aboutPage.sidebarHobbiesItems.map((item) => (
+ {item}
+ ))}
+
+
+ {aboutPage.sidebarHobbiesLink}
+
+
+
+
+
+
+ {/* Values */}
+
+
+
{aboutPage.valuesTitle}
+
+ {values.map((value) => (
+
+
+
+
+
+ {value.title}
+
+
+ {value.text}
+
+
+ “{value.quote}”
+
+
+ ))}
+
+
+
+
+ );
+}
diff --git a/src/app/contact/page.tsx b/src/app/contact/page.tsx
new file mode 100644
index 0000000..68ad1a0
--- /dev/null
+++ b/src/app/contact/page.tsx
@@ -0,0 +1,93 @@
+import { site } from "@/data/site";
+import { contactContent, contactPage } from "@/data/contact";
+import { Mail } from "lucide-react";
+
+export default function ContactPage() {
+ return (
+
+ {/* Header */}
+
+
+
{contactPage.label}
+
+ {contactContent.heading}
+
+
+ {contactPage.pageSubtitle}
+
+
+
+
+ {/* Content */}
+
+
+
+
+ {contactPage.contentTitle}
+
+
+ {contactContent.text}
+
+
+ {contactPage.contentPlaceholder1}
+
+
+ {contactPage.contentPlaceholder2}
+
+
+
+
+
+
+
+
+
+
+ {contactPage.sidebarSocialTitle}
+
+
+
+
+
+
+
+ );
+}
diff --git a/src/app/globals.css b/src/app/globals.css
new file mode 100644
index 0000000..15a29d2
--- /dev/null
+++ b/src/app/globals.css
@@ -0,0 +1,105 @@
+@import "tailwindcss";
+
+@theme {
+ --color-deep-space: #0f0e0c;
+ --color-charcoal: #1a1917;
+ --color-warm-grey: #2a2926;
+ --color-text-primary: #e8e6e3;
+ --color-text-secondary: #8a8680;
+ --color-amber: #e86101;
+ --color-amber-hover: #FF751A;
+ --color-amber-10: #e861011a;
+ --color-amber-20: #e8610133;
+ --color-amber-30: #e861014d;
+
+ --font-display: var(--font-space-grotesk);
+ --font-body: var(--font-inter);
+ --font-mono: var(--font-ibm-plex-mono);
+}
+
+html {
+ scroll-behavior: smooth;
+}
+
+body {
+ font-family: var(--font-body);
+ background-color: var(--color-deep-space);
+ color: var(--color-text-primary);
+ -webkit-font-smoothing: antialiased;
+ -moz-osx-font-smoothing: grayscale;
+}
+
+::selection {
+ background-color: var(--color-amber-30);
+ color: var(--color-text-primary);
+}
+
+/* Custom scrollbar */
+::-webkit-scrollbar {
+ width: 8px;
+}
+::-webkit-scrollbar-track {
+ background: var(--color-deep-space);
+}
+::-webkit-scrollbar-thumb {
+ background: var(--color-warm-grey);
+ border-radius: 0;
+}
+::-webkit-scrollbar-thumb:hover {
+ background: var(--color-text-secondary);
+}
+
+/* Code block styling */
+.code-block {
+ font-family: var(--font-mono);
+ font-size: 0.875rem;
+ line-height: 1.6;
+}
+.code-block .function { color: var(--color-text-primary); }
+.code-block .type { color: var(--color-text-secondary); }
+.code-block .comment { color: #8a868080; }
+.code-block .string { color: #e86101b3; }
+.code-block .number { color: #e86101cc; }
+.code-block .keyword { color: var(--color-amber); }
+
+/* Chip component */
+.chip {
+ display: inline-block;
+ padding: 0.25rem 0.75rem;
+ font-size: 0.75rem;
+ font-family: var(--font-mono);
+ text-transform: uppercase;
+ letter-spacing: 0.05em;
+ background-color: var(--color-amber-10);
+ border: 1px solid var(--color-amber-20);
+ color: var(--color-amber);
+}
+
+/* Section label */
+.section-label {
+ font-family: var(--font-mono);
+ font-size: 0.875rem;
+ color: var(--color-amber);
+ text-transform: uppercase;
+ letter-spacing: 0.1em;
+}
+
+/* Text link with underline animation */
+.text-link {
+ position: relative;
+ color: var(--color-amber);
+ text-decoration: none;
+}
+.text-link::after {
+ content: '';
+ position: absolute;
+ bottom: -2px;
+ left: 0;
+ width: 0;
+ height: 1px;
+ background-color: var(--color-amber);
+ transition: width 0.3s ease;
+}
+.text-link:hover::after {
+ width: 100%;
+}
diff --git a/src/app/hobbies/page.tsx b/src/app/hobbies/page.tsx
new file mode 100644
index 0000000..f55ad5a
--- /dev/null
+++ b/src/app/hobbies/page.tsx
@@ -0,0 +1,69 @@
+import { hobbies, hobbiesPage } from "@/data/hobbies";
+import { Icon } from "@/lib/icons";
+
+export default function HobbiesPage() {
+ return (
+
+ {/* Header */}
+
+
+
{hobbiesPage.label}
+
+ {hobbiesPage.pageTitle}
+
+
+ {hobbiesPage.pageSubtitle}
+
+
+
+
+ {/* Hobbies Content */}
+
+
+ {hobbies.map((hobby, index) => {
+ const isEven = index % 2 === 0;
+ return (
+
+
+
+
+
+
+ {hobby.title}
+
+
+
+ {hobby.description.map((paragraph, i) => (
+
+ {paragraph}
+
+ ))}
+
+
+ );
+ })}
+
+
+
+ {/* Quote */}
+
+
+
+ “{hobbiesPage.quote}”
+
+
+ {hobbiesPage.quoteAuthor}
+
+
+
+
+ );
+}
diff --git a/src/app/layout.tsx b/src/app/layout.tsx
new file mode 100644
index 0000000..d2fb1a6
--- /dev/null
+++ b/src/app/layout.tsx
@@ -0,0 +1,56 @@
+import type { Metadata } from "next";
+import { Space_Grotesk, Inter, IBM_Plex_Mono } from "next/font/google";
+import "./globals.css";
+import Navigation from "@/components/Navigation";
+import Footer from "@/components/Footer";
+import PreviewBanner from "@/components/PreviewBanner";
+
+const spaceGrotesk = Space_Grotesk({
+ subsets: ["latin"],
+ weight: ["400", "500", "600", "700"],
+ variable: "--font-space-grotesk",
+ display: "swap",
+});
+
+const inter = Inter({
+ subsets: ["latin"],
+ weight: ["400", "500", "600"],
+ variable: "--font-inter",
+ display: "swap",
+});
+
+const ibmPlexMono = IBM_Plex_Mono({
+ subsets: ["latin"],
+ weight: ["400", "500"],
+ variable: "--font-ibm-plex-mono",
+ display: "swap",
+});
+
+export const metadata: Metadata = {
+ title: "Mike Karl — Portfolio",
+ description:
+ "Mike Karl — Systementwickler & Creative Technologist aus Köln. Portfolio mit Projekten aus Systems Programming, Computer Graphics und Low-Level-Entwicklung.",
+ icons: {
+ icon: "/favicon.svg",
+ },
+};
+
+export default function RootLayout({
+ children,
+}: Readonly<{
+ children: React.ReactNode;
+}>) {
+ return (
+
+
+
+
+ {children}
+
+
+
+ );
+}
diff --git a/src/app/page.tsx b/src/app/page.tsx
new file mode 100644
index 0000000..91782b4
--- /dev/null
+++ b/src/app/page.tsx
@@ -0,0 +1,19 @@
+import HeroSection from "@/sections/HeroSection";
+import AboutSection from "@/sections/AboutSection";
+import HobbiesSection from "@/sections/HobbiesSection";
+import ProjectsSection from "@/sections/ProjectsSection";
+import TimelineSection from "@/sections/TimelineSection";
+import ContactSection from "@/sections/ContactSection";
+
+export default function HomePage() {
+ return (
+
+
+
+
+
+
+
+
+ );
+}
diff --git a/src/app/project/emulator/page.tsx b/src/app/project/emulator/page.tsx
new file mode 100644
index 0000000..d3b2720
--- /dev/null
+++ b/src/app/project/emulator/page.tsx
@@ -0,0 +1,23 @@
+import ProjectPageLayout from "@/components/ProjectPageLayout";
+import { emulatorProject } from "@/data/projects";
+
+export default function ProjectEmulatorPage() {
+ return (
+
+ );
+}
diff --git a/src/app/project/raycaster/page.tsx b/src/app/project/raycaster/page.tsx
new file mode 100644
index 0000000..1205de0
--- /dev/null
+++ b/src/app/project/raycaster/page.tsx
@@ -0,0 +1,23 @@
+import ProjectPageLayout from "@/components/ProjectPageLayout";
+import { raycasterProject } from "@/data/projects";
+
+export default function ProjectRaycasterPage() {
+ return (
+
+ );
+}
diff --git a/src/app/project/raytracer/page.tsx b/src/app/project/raytracer/page.tsx
new file mode 100644
index 0000000..d0c4df0
--- /dev/null
+++ b/src/app/project/raytracer/page.tsx
@@ -0,0 +1,23 @@
+import ProjectPageLayout from "@/components/ProjectPageLayout";
+import { raytracerProject } from "@/data/projects";
+
+export default function ProjectRaytracerPage() {
+ return (
+
+ );
+}
diff --git a/src/app/projects/page.tsx b/src/app/projects/page.tsx
new file mode 100644
index 0000000..8d63189
--- /dev/null
+++ b/src/app/projects/page.tsx
@@ -0,0 +1,74 @@
+import Link from "next/link";
+import { projects, projectsPage } from "@/data/projects";
+import { ArrowRight } from "lucide-react";
+
+export default function ProjectsPage() {
+ return (
+
+ {/* Header */}
+
+
+
{projectsPage.pageLabel}
+
+ {projectsPage.pageTitle}
+
+
+ {projectsPage.subtitle}
+
+
+
+
+ {/* Project Grid */}
+
+
+ {projects.map((project) => (
+
+
+
+
+
+
+ {project.tags.map((tag) => (
+
+ {tag}
+
+ ))}
+
+
+ {project.title}
+
+
+ {project.description}
+
+
+ {projectsPage.detailText}
+
+
+
{projectsPage.linkText}
+
+
+
+
+ ))}
+
+
+
+ );
+}
diff --git a/src/app/template.tsx b/src/app/template.tsx
new file mode 100644
index 0000000..729a307
--- /dev/null
+++ b/src/app/template.tsx
@@ -0,0 +1,5 @@
+import PageTransition from "@/components/PageTransition";
+
+export default function Template({ children }: { children: React.ReactNode }) {
+ return {children} ;
+}
diff --git a/src/app/timeline/page.tsx b/src/app/timeline/page.tsx
new file mode 100644
index 0000000..8199b35
--- /dev/null
+++ b/src/app/timeline/page.tsx
@@ -0,0 +1,55 @@
+import { timeline, timelinePage } from "@/data/timeline";
+
+export default function TimelinePage() {
+ return (
+
+ {/* Header */}
+
+
+
{timelinePage.label}
+
+ {timelinePage.pageTitle}
+
+
+ {timelinePage.subtitle}
+
+
+
+
+ {/* Timeline Content */}
+
+
+ {timeline.map((item) => (
+
+
{item.year}
+
+
+ {item.title}
+
+
+ {item.description}
+
+
+ {timelinePage.detailText}
+
+
+ {item.tags.map((tag) => (
+
+ {tag}
+
+ ))}
+
+
+
+ ))}
+
+
+
+ );
+}
diff --git a/src/components/Footer.tsx b/src/components/Footer.tsx
new file mode 100644
index 0000000..0771af4
--- /dev/null
+++ b/src/components/Footer.tsx
@@ -0,0 +1,16 @@
+import { site, footerContent } from "../data/site";
+
+export default function Footer() {
+ return (
+
+ );
+}
diff --git a/src/components/Navigation.tsx b/src/components/Navigation.tsx
new file mode 100644
index 0000000..cbae970
--- /dev/null
+++ b/src/components/Navigation.tsx
@@ -0,0 +1,124 @@
+"use client";
+
+import { useState, useEffect } from "react";
+import Link from "next/link";
+import { usePathname } from "next/navigation";
+import { Menu, X } from "lucide-react";
+import { site, navLinks, socialLinks } from "../data/site";
+import { Icon } from "@/lib/icons";
+
+export default function Navigation() {
+ const [scrolled, setScrolled] = useState(false);
+ const [mobileOpen, setMobileOpen] = useState(false);
+ const pathname = usePathname();
+
+ useEffect(() => {
+ const handleScroll = () => setScrolled(window.scrollY > 50);
+ window.addEventListener("scroll", handleScroll, { passive: true });
+ handleScroll();
+ return () => window.removeEventListener("scroll", handleScroll);
+ }, []);
+
+ useEffect(() => {
+ setMobileOpen(false);
+ window.scrollTo(0, 0);
+ }, [pathname]);
+
+ return (
+
+
+
+ {site.name.toUpperCase()}
+
+
+ {/* Desktop Nav */}
+
+
+ {navLinks.map((link) => {
+ const isActive = pathname === link.href;
+ return (
+
+
+ {link.label}
+
+
+ );
+ })}
+
+
+ {socialLinks.map((link) => (
+
+
+
+ ))}
+
+
+
+ {/* Mobile Menu Button */}
+ setMobileOpen(!mobileOpen)}
+ aria-label="Toggle menu"
+ >
+ {mobileOpen ? : }
+
+
+
+ {/* Mobile Menu */}
+ {mobileOpen && (
+
+
+ {navLinks.map((link) => (
+
+ setMobileOpen(false)}
+ >
+ {link.label}
+
+
+ ))}
+
+
+ {socialLinks.map((link) => (
+
+
+
+ ))}
+
+
+ )}
+
+ );
+}
diff --git a/src/components/PageTransition.tsx b/src/components/PageTransition.tsx
new file mode 100644
index 0000000..1dab2dd
--- /dev/null
+++ b/src/components/PageTransition.tsx
@@ -0,0 +1,38 @@
+"use client";
+
+import { useLayoutEffect, useRef } from "react";
+import gsap from "gsap";
+
+export default function PageTransition({
+ children,
+}: {
+ children: React.ReactNode;
+}) {
+ const containerRef = useRef(null);
+
+ useLayoutEffect(() => {
+ const el = containerRef.current;
+ if (!el) return;
+
+ const prefersReducedMotion = window.matchMedia(
+ "(prefers-reduced-motion: reduce)"
+ ).matches;
+
+ if (prefersReducedMotion) {
+ gsap.set(el, { opacity: 1, y: 0 });
+ return;
+ }
+
+ const ctx = gsap.context(() => {
+ gsap.fromTo(
+ el,
+ { opacity: 0, y: 16 },
+ { opacity: 1, y: 0, duration: 0.55, ease: "power3.out", delay: 0.05 }
+ );
+ });
+
+ return () => ctx.revert();
+ }, []);
+
+ return {children}
;
+}
diff --git a/src/components/ParticleGrid.tsx b/src/components/ParticleGrid.tsx
new file mode 100644
index 0000000..a764ab3
--- /dev/null
+++ b/src/components/ParticleGrid.tsx
@@ -0,0 +1,123 @@
+"use client";
+
+import { useEffect, useRef } from "react";
+
+interface Particle {
+ x: number;
+ y: number;
+ baseX: number;
+ baseY: number;
+ size: number;
+}
+
+export default function ParticleGrid() {
+ const canvasRef = useRef(null);
+ const animRef = useRef(0);
+ const mouseRef = useRef({ x: -1000, y: -1000 });
+
+ useEffect(() => {
+ const canvas = canvasRef.current;
+ if (!canvas) return;
+ const ctx = canvas.getContext("2d");
+ if (!ctx) return;
+
+ let particles: Particle[] = [];
+ let time = 0;
+
+ const init = () => {
+ const dpr = window.devicePixelRatio || 1;
+ const w = window.innerWidth;
+ const h = window.innerHeight;
+ canvas.width = w * dpr;
+ canvas.height = h * dpr;
+ ctx.scale(dpr, dpr);
+
+ const spacing = Math.min(w, h) / 35;
+ const cols = Math.ceil(w / spacing) + 1;
+ const rows = Math.ceil(h / spacing) + 1;
+
+ particles = [];
+ for (let i = 0; i < cols; i++) {
+ for (let j = 0; j < rows; j++) {
+ particles.push({
+ x: i * spacing,
+ y: j * spacing,
+ baseX: i * spacing,
+ baseY: j * spacing,
+ size: 2 + Math.random() * 1.5,
+ });
+ }
+ }
+ };
+
+ const animate = () => {
+ time += 0.015;
+ const w = window.innerWidth;
+ const h = window.innerHeight;
+ ctx.clearRect(0, 0, w, h);
+
+ const mouse = mouseRef.current;
+ const radius = 180;
+
+ for (const p of particles) {
+ const waveX = Math.sin(p.baseY * 0.008 + time) * 8;
+ const waveY = Math.cos(p.baseX * 0.008 + time) * 6;
+ let px = p.baseX + waveX;
+ let py = p.baseY + waveY;
+
+ const dx = px - mouse.x;
+ const dy = py - mouse.y;
+ const dist = Math.sqrt(dx * dx + dy * dy);
+
+ if (dist < radius) {
+ const force = (radius - dist) / radius;
+ const angle = Math.atan2(dy, dx);
+ px += Math.cos(angle) * force * 30;
+ py += Math.sin(angle) * force * 30;
+ }
+
+ const finalDist = Math.sqrt((px - mouse.x) ** 2 + (py - mouse.y) ** 2);
+ const alpha = finalDist < radius ? 0.3 + (1 - finalDist / radius) * 0.5 : 0.25;
+ const sizeMult = finalDist < radius ? 1.5 : 1;
+
+ ctx.beginPath();
+ ctx.arc(px, py, p.size * sizeMult, 0, Math.PI * 2);
+ ctx.fillStyle = `rgba(232, 97, 1, ${alpha})`;
+ ctx.fill();
+ }
+
+ animRef.current = requestAnimationFrame(animate);
+ };
+
+ const handleMouseMove = (e: MouseEvent) => {
+ const rect = canvas.getBoundingClientRect();
+ mouseRef.current = { x: e.clientX - rect.left, y: e.clientY - rect.top };
+ };
+
+ const handleMouseLeave = () => {
+ mouseRef.current = { x: -1000, y: -1000 };
+ };
+
+ init();
+ animate();
+ window.addEventListener("resize", init);
+ canvas.addEventListener("mousemove", handleMouseMove);
+ canvas.addEventListener("mouseleave", handleMouseLeave);
+
+ return () => {
+ cancelAnimationFrame(animRef.current);
+ window.removeEventListener("resize", init);
+ canvas.removeEventListener("mousemove", handleMouseMove);
+ canvas.removeEventListener("mouseleave", handleMouseLeave);
+ };
+ }, []);
+
+ return (
+
+ );
+}
diff --git a/src/components/PreviewBanner.tsx b/src/components/PreviewBanner.tsx
new file mode 100644
index 0000000..42fdfb1
--- /dev/null
+++ b/src/components/PreviewBanner.tsx
@@ -0,0 +1,9 @@
+export default function PreviewBanner() {
+ return (
+
+ );
+}
diff --git a/src/components/ProjectPageLayout.tsx b/src/components/ProjectPageLayout.tsx
new file mode 100644
index 0000000..75cb782
--- /dev/null
+++ b/src/components/ProjectPageLayout.tsx
@@ -0,0 +1,229 @@
+"use client";
+
+import Link from "next/link";
+import { useRouter } from "next/navigation";
+import { ArrowLeft, ArrowRight } from "lucide-react";
+import { useScrollReveal } from "../hooks/useScrollReveal";
+import { projectLayout } from "../data/projects";
+
+interface GalleryItem {
+ src: string;
+ alt: string;
+}
+
+interface Stat {
+ label: string;
+ value: string;
+}
+
+interface Feature {
+ title: string;
+ description: string;
+}
+
+interface AdjacentProject {
+ title: string;
+ link: string;
+}
+
+interface ProjectPageLayoutProps {
+ title: string;
+ subtitle: string;
+ tags: string[];
+ year: string;
+ duration: string;
+ status: string;
+ description: string[];
+ image: string;
+ imageAlt: string;
+ features: Feature[];
+ stats: Stat[];
+ gallery: GalleryItem[];
+ prevProject: AdjacentProject;
+ nextProject: AdjacentProject;
+}
+
+export default function ProjectPageLayout({
+ title,
+ subtitle,
+ tags,
+ year,
+ duration,
+ status,
+ description,
+ image,
+ imageAlt,
+ features,
+ stats,
+ gallery,
+ prevProject,
+ nextProject,
+}: ProjectPageLayoutProps) {
+ const router = useRouter();
+ const heroRef = useScrollReveal({ stagger: 0.1, start: "top 90%" });
+ const descRef = useScrollReveal({ stagger: 0.15 });
+ const techRef = useScrollReveal({ stagger: 0.15 });
+ const galleryRef = useScrollReveal({ stagger: 0.1 });
+
+ return (
+
+ {/* Hero */}
+
+
+
router.back()}
+ className="inline-flex items-center gap-2 text-link text-amber hover:opacity-80 transition-opacity cursor-pointer"
+ >
+
+ {projectLayout.backLabel}
+
+
+
+
+ {title}
+
+
+ {subtitle}
+
+
+
+
+ {tags.map((tag) => (
+
+ {tag}
+
+ ))}
+
+
+
+ {projectLayout.yearLabel}: {year}
+ |
+ {projectLayout.durationLabel}: {duration}
+ |
+ {projectLayout.statusLabel}: {status}
+
+
+
+
+ {/* Project Description */}
+
+
+
+
+ {projectLayout.descriptionTitle}
+
+
+ {description.map((p, i) => (
+
{p}
+ ))}
+
+
+
+
+
+
+
+
+
+ {/* Technical Implementation */}
+
+
+
+ {projectLayout.techTitle}
+
+
+
+ {features.map((feature) => (
+
+
+ {feature.title}
+
+
+ {feature.description}
+
+
+ ))}
+
+
+ {/* Stats */}
+
+ {stats.map((stat) => (
+
+
+ {stat.value}
+
+
+ {stat.label}
+
+
+ ))}
+
+
+
+
+ {/* Gallery */}
+
+
+
+ {projectLayout.galleryTitle}
+
+
+ {gallery.map((item) => (
+
+
+
+ ))}
+
+
+
+
+ {/* Prev / Next Navigation */}
+
+
+
+
+
+
{projectLayout.prevProjectLabel}
+
{prevProject.title}
+
+
+
+
+
+
{projectLayout.nextProjectLabel}
+
{nextProject.title}
+
+
+
+
+
+
+ );
+}
diff --git a/src/data/about.ts b/src/data/about.ts
new file mode 100644
index 0000000..b4964ac
--- /dev/null
+++ b/src/data/about.ts
@@ -0,0 +1,59 @@
+export const values = [
+ {
+ icon: "Crosshair",
+ title: "Precision",
+ text: "Jeder Taktzyklus zählt. Jeder Speicherzugriff ist bewusst. Ich baue Systeme, die ihre Ressourcen kennen und respektieren.",
+ quote: "Effizienz ist nicht Optimierung – es ist gute Architektur.",
+ },
+ {
+ icon: "Search",
+ title: "Curiosity",
+ text: "Vom 6502-Chip bis zum Raytracing-Algorithmus – ich gehe tiefer, bis ich die Ebene verstehe, auf der alles zusammenkommt.",
+ quote: "Verstehen beginnt dort, wo die Abstraktion endet.",
+ },
+ {
+ icon: "Timer",
+ title: "Patience",
+ text: "Gute Software ist wie Astrofotografie: Stunden der Vorbereitung für den einen Moment, in dem alles zusammenkommt.",
+ quote: "Das Beste entsteht in der Zeit, die man ihm gibt.",
+ },
+];
+
+export const aboutContent = {
+ paragraphs: [
+ "Ich baue Systeme – von der Transistor-Ebene bis zur Benutzeroberfläche. Meine Arbeit beginnt dort, wo abstrakte Konzepte auf konkrete Hardware treffen. Ein 6502-Emulator, der jeden Taktzyklus simuliert. Ein Raytracer, der Lichtstrahl für Lichtstrahl berechnet. Ich interessiere mich für die Dinge, die man nicht sieht: Speicherlayout, Cache-Hierarchien, die stille Effizienz guter Architektur.",
+ "Neben dem Code fotografiere ich den Nachthimmel – lange Belichtungszeiten, Tracking-Montierungen, das Sammeln von Licht über Stunden. Das Prinzip ist ähnlich: Geduld, Präzision, das Vertrauen auf einen Prozess, dessen Ergebnis man erst am Ende sieht.",
+ "Ich arbeite am liebsten an Projekten, die verbinden: Low-Level-Performance mit menschlicher Erfahrung, technische Tiefe mit visueller Klarheit. Wenn das klingt, als könnten wir etwas bauen – schreib mir.",
+ ],
+};
+
+export const aboutPage = {
+ label: "01 / About",
+ pageTitle: "Über mich",
+ pageSubtitle:
+ "Systementwickler & Creative Technologist aus Köln. Ich baue Dinge von der Transistor-Ebene bis zur Benutzeroberfläche.",
+ linkText: "Mehr über meine Hobbies",
+ sidebarFocusTitle: "Schwerpunkte",
+ sidebarFocusItems: [
+ "Systems Programming",
+ "Computer Graphics",
+ "Low-Level Optimization",
+ "Emulation & Simulation",
+ "Algorithm Design",
+ ],
+ sidebarLocationTitle: "Standort",
+ sidebarHobbiesTitle: "Hobbies",
+ sidebarHobbiesItems: ["Motorradfahren", "Astrofotografie"],
+ sidebarHobbiesLink: "Details ansehen",
+ valuesTitle: "Werte",
+ philosophyTitle: "Philosophie",
+ philosophyText: [
+ "Hier wird bald eine ausführliche Darstellung meiner Entwicklungsphilosophie stehen – wie ich Systeme angehe, warum ich tiefer gehe als nötig, und welche Prinzipien meine Arbeit leiten.",
+ "Derzeit ist dies ein Platzhalter für zukünftigen Content, der meinen Ansatz zu Software-Architektur, Performance-Bewusstsein und handwerklicher Qualität detailliert beschreibt.",
+ ],
+ backgroundTitle: "Hintergrund",
+ backgroundText: [
+ "Ein weiterer Abschnitt, der meinen Werdegang, meine Motivation und die Schlüsselmomente meiner Entwicklung als Systementwickler beleuchtet.",
+ "Von ersten Schritten in C und C++ über die Faszination für Computergrafik bis hin zur strukturierten Ausbildung – diese Geschichte wird hier bald vollständig erzählt.",
+ ],
+};
diff --git a/src/data/contact.ts b/src/data/contact.ts
new file mode 100644
index 0000000..1b3c76d
--- /dev/null
+++ b/src/data/contact.ts
@@ -0,0 +1,20 @@
+export const contactContent = {
+ heading: "Lass uns bauen.",
+ text: "Ich arbeite gerne an Projekten, die verbinden – Low-Level-Performance mit menschlicher Erfahrung. Wenn du etwas baust, das präzise, schnell oder einfach schön sein soll, schreib mir.",
+ cta: "Kontakt aufnehmen",
+};
+
+export const contactPage = {
+ label: "05 / Kontakt",
+ pageSubtitle:
+ "Ich arbeite gerne an Projekten, die verbinden – Low-Level-Performance mit menschlicher Erfahrung.",
+ contentTitle: "Zusammenarbeit",
+ contentPlaceholder1:
+ "Dieser Bereich wird bald um konkrete Informationen zu meinen Arbeitsweisen, bevorzugten Technologien und dem besten Weg zur Kontaktaufnahme erweitert.",
+ contentPlaceholder2:
+ "Ob du ein Projekt planst, das präzise, schnell oder einfach schön sein soll – hier wird bald stehen, wie wir am besten zusammenfinden.",
+ sidebarEmailTitle: "Email",
+ sidebarSocialTitle: "Social",
+ sidebarSocialGithub: "GitHub",
+ sidebarSocialLinkedin: "LinkedIn",
+};
diff --git a/src/data/hobbies.ts b/src/data/hobbies.ts
new file mode 100644
index 0000000..367eaee
--- /dev/null
+++ b/src/data/hobbies.ts
@@ -0,0 +1,38 @@
+export const hobbiesPage = {
+ label: "02 / Hobbies",
+ sectionSubtitle: "Was ich außerhalb des Terminals mache.",
+ pageTitle: "Außerhalb des Terminals",
+ pageSubtitle:
+ "Motorradfahren und Astrofotografie – zwei Welten, die Geduld, Präzision und das Vertrauen auf einen Prozess verlangen.",
+ linkText: "Mehr erfahren",
+ quote:
+ "Gute Software ist wie Astrofotografie: Stunden der Vorbereitung für den einen Moment, in dem alles zusammenkommt.",
+ quoteAuthor: "— Eines der Prinzipien, die Code und Hobby verbinden",
+};
+
+export const hobbies = [
+ {
+ id: "motorcycle",
+ icon: "Bike",
+ title: "Motorradfahren",
+ shortDescription:
+ "Freiheit auf zwei Rädern. Die Straße als Ausgleich zum Code.",
+ description: [
+ "Motorradfahren ist für mich der perfekte Gegenpol zur Arbeit am Rechner. Während Code abstrakt und gedanklich ist, ist Motorradfahren physisch und unmittelbar – Geschwindigkeit, Kurven, die Reaktion des Fahrwerks auf den Asphalt.",
+ "Die Präzision, die beim Fahren auf der Landstraße gefragt ist, erinnert mich an Low-Level-Programmierung: jedes Input muss bewusst sein, jede Reaktion antizipiert. Es trainiert ein Gespür für Systemverhalten unter Stress.",
+ "Hier wird bald mehr über Touren, die Maschine und die Philosophie hinter dem Fahren stehen.",
+ ],
+ },
+ {
+ id: "astrophotography",
+ icon: "Camera",
+ title: "Astrofotografie",
+ shortDescription:
+ "Licht sammeln über Stunden. Geduld, Präzision, der Moment.",
+ description: [
+ "Astrofotografie ist das Sammeln von Licht über Stunden – lange Belichtungszeiten, Tracking-Montierungen, das Warten auf den perfekten Moment, in dem alles zusammenkommt.",
+ "Das Prinzip ist ähnlich wie bei guter Software: Stunden der Vorbereitung für den einen Moment, in dem alles funktioniert. Geduld, Präzision, das Vertrauen auf einen Prozess, dessen Ergebnis man erst am Ende sieht.",
+ "Hier wird bald mehr über Equipment, Aufnahmetechniken und die besten Orte für den Nachthimmel stehen.",
+ ],
+ },
+];
diff --git a/src/data/projects.ts b/src/data/projects.ts
new file mode 100644
index 0000000..86d4841
--- /dev/null
+++ b/src/data/projects.ts
@@ -0,0 +1,207 @@
+export const projects = [
+ {
+ id: "emulator",
+ title: "6502 Emulator",
+ description:
+ "Cycle-accurate CPU-Simulation in C++ mit eigenem Assembler-Parser.",
+ image: "/assets/emulator-screenshot.jpg",
+ tags: ["C++", "6502 Assembly", "Systems Programming"],
+ link: "/project/emulator",
+ },
+ {
+ id: "raytracer",
+ title: "Software Raytracer",
+ description:
+ "Monte-Carlo-Pfad-Tracing-Renderer in C. Multithreading, BVH-Beschleunigung, sanfte Schatten.",
+ image: "/assets/raytracer-render.jpg",
+ tags: ["C", "Computer Graphics", "Multithreading"],
+ link: "/project/raytracer",
+ },
+ {
+ id: "raycaster",
+ title: "Raycasting Engine",
+ description:
+ "Wolfenstein-3D-Style-Renderer mit DDA-Algorithmus und Textur-Mapping.",
+ image: "/assets/raycaster-screenshot.jpg",
+ tags: ["C++", "Game Dev", "Algorithms"],
+ link: "/project/raycaster",
+ },
+];
+
+export const emulatorProject = {
+ title: "6502 Emulator",
+ subtitle: "Cycle-accurate CPU-Simulation in C++",
+ tags: ["C++", "6502 Assembly", "Systems Programming", "Emulation"],
+ year: "2023",
+ duration: "6 Monate",
+ status: "Abgeschlossen",
+ description: [
+ "Der MOS 6502 ist der Chip, der die Home-Computer-Revolution antrieb: Apple II, Commodore 64, Nintendo Entertainment System. Er hat 3510 Transistoren. Jeder einzelne zählt.",
+ "Mein Emulator simuliert jeden Taktzyklus des 6502 mit Cycle-Accuracy – das bedeutet, dass die Timing-Korrektheit bis auf einen Takt genau stimmt. Das ist entscheidend für Systeme, die auf präzise Hardware-Timing angewiesen sind, wie der C64 mit seinem VIC-II-Grafikchip.",
+ "Der Emulator enthält einen eigenen Assembler-Parser, der 6502-Assembly-Syntax in Maschinencode übersetzt. Keine externen Abhängigkeiten – nur C++, Standardbibliotheken und das Verständnis der Architektur.",
+ ],
+ image: "/assets/emulator-screenshot.jpg",
+ imageAlt: "6502 Emulator Terminal",
+ features: [
+ {
+ title: "Cycle-Accurate Simulation",
+ description:
+ "Jeder Befehl wird mit korrektem Takt-Verbrauch simuliert. Seiten-Effekte, Page-Crossing-Penalties, genaue Adressierungsmodi.",
+ },
+ {
+ title: "Assembler-Parser",
+ description:
+ "Eigener zweipassiger Assembler mit Label-Auflösung, Expression-Evaluation und Fehlerberichterstattung.",
+ },
+ {
+ title: "Speichersystem",
+ description:
+ "64KB Adressraum mit korrekter Memory-Mapping-Logik. RAM, ROM und Memory-Mapped I/O.",
+ },
+ ],
+ stats: [
+ { label: "Transistoren simuliert", value: "3,510" },
+ { label: "Implementierte Befehle", value: "56" },
+ { label: "Adressierungsmodi", value: "13" },
+ { label: "Taktzyklen getestet", value: "1M+" },
+ ],
+ gallery: [
+ { src: "/assets/emulator-screenshot.jpg", alt: "6502 Emulator Terminal" },
+ { src: "/assets/emulator-display.jpg", alt: "Assembler Code" },
+ { src: "/assets/debugger-view.jpg", alt: "Debugger Register State" },
+ ],
+ prevProject: {
+ title: "Raycasting Engine",
+ link: "/project/raycaster",
+ },
+ nextProject: {
+ title: "Software Raytracer",
+ link: "/project/raytracer",
+ },
+};
+
+export const raytracerProject = {
+ title: "Software Raytracer",
+ subtitle: "Monte-Carlo-Pfad-Tracing in C",
+ tags: ["C", "Computer Graphics", "Multithreading"],
+ year: "2024",
+ duration: "8 Monate",
+ status: "Abgeschlossen",
+ description: [
+ "Dieser Raytracer berechnet Licht. Nicht approximiert, nicht geschätzt – simuliert. Jeder Pixel ist das Ergebnis von Millionen Lichtstrahlen, die durch eine Szene bouncen, sich brechen und absorbieren.",
+ "Geschrieben in C von Grund auf. Keine Grafik-Bibliotheken, keine Hardware-Beschleunigung. Nur Mathematik, Speicher und so viele CPU-Kerne, wie das System hergibt.",
+ "Das Projekt war eine Reise in die Computergrafik: von Vektor-Mathematik über Bounding Volume Hierarchies bis hin zur Farbwissenschaft von ACES-Tonemapping.",
+ ],
+ image: "/assets/raytracer-render.jpg",
+ imageAlt: "Raytracer Render Output",
+ features: [
+ {
+ title: "Monte-Carlo-Pfad-Tracing",
+ description:
+ "Rekursive Lichtstrahl-Simulation mit Russian Roulette-Terminierung. Diffuse, spiegelnde und transparente Materialien.",
+ },
+ {
+ title: "BVH-Beschleunigung",
+ description:
+ "Bounding Volume Hierarchy mit SAH-Heuristik für schnelle Ray-Schnitt-Tests. Rendert komplexe Szenen in Sekunden statt Stunden.",
+ },
+ {
+ title: "Multithreading",
+ description:
+ "Thread-Pool mit Work-Stealing-Scheduling. Nahezu lineare Skalierung mit Kernanzahl.",
+ },
+ ],
+ stats: [
+ { label: "Strahlen pro Pixel", value: "1M+" },
+ { label: "CPU-Kerne genutzt", value: "8" },
+ { label: "Externe Bibliotheken", value: "0" },
+ { label: "Rendern komplexer Szene", value: "<2s" },
+ ],
+ gallery: [
+ { src: "/assets/raytracer-render.jpg", alt: "Raytracer Render Output" },
+ { src: "/assets/raytracer-cornell.jpg", alt: "Cornell Box Render" },
+ { src: "/assets/raytracer-metal.jpg", alt: "Metallic Scene Render" },
+ ],
+ prevProject: {
+ title: "6502 Emulator",
+ link: "/project/emulator",
+ },
+ nextProject: {
+ title: "Raycasting Engine",
+ link: "/project/raycaster",
+ },
+};
+
+export const projectLayout = {
+ backLabel: "Zurück",
+ yearLabel: "Jahr",
+ durationLabel: "Dauer",
+ statusLabel: "Status",
+ descriptionTitle: "Das Projekt",
+ techTitle: "Technische Umsetzung",
+ galleryTitle: "Galerie",
+ prevProjectLabel: "Vorheriges Projekt",
+ nextProjectLabel: "Nächstes Projekt",
+};
+
+export const projectsPage = {
+ sectionLabel: "03 / Ausgewählte Projekte",
+ pageLabel: "03 / Projekte",
+ pageTitle: "Ausgewählte Projekte",
+ subtitle:
+ "Systeme, die ich aus der Transistor-Ebene heraus gebaut habe.",
+ caseStudyLabel: "Case Study",
+ detailText:
+ "Dieser Abschnitt wird bald eine detailliertere Beschreibung des Projekts enthalten – Motivation, Herausforderungen, Lernerfahrungen und technische Tiefenblicke, die über die Kurzbeschreibung auf der Startseite hinausgehen.",
+ linkText: "Zur Case Study",
+};
+
+export const raycasterProject = {
+ title: "Raycasting Engine",
+ subtitle: "Wolfenstein-3D-Style-Renderer mit DDA-Algorithmus",
+ tags: ["C++", "Game Dev", "Algorithms"],
+ year: "2021",
+ duration: "3 Monate",
+ status: "Abgeschlossen",
+ description: [
+ "Eine Einführung in Echtzeit-Computergrafik: ein Wolfenstein-3D-Style-Raycaster, der mit dem DDA-Algorithmus Wände findet und mit Texturen füllt.",
+ "Geschrieben in C++ ohne externe Grafik-Engines. Alles von der Bildschirmmaschine bis zum Pixel-Buffer selbst implementiert.",
+ "Das Projekt lehrte mich die Grundlagen der Rasterisierung, der Performance-Optimierung in Spiel-Loops und die Bedeutung fester Zeitschritte in Echtzeit-Systemen.",
+ ],
+ image: "/assets/raycaster-screenshot.jpg",
+ imageAlt: "Raycasting Engine Screenshot",
+ features: [
+ {
+ title: "DDA-Algorithmus",
+ description:
+ "Digital Differential Analysis für präzise Wand-Schnitt-Berechnung auf einem 2D-Gitter. Schnell, deterministisch und elegant.",
+ },
+ {
+ title: "Textur-Mapping",
+ description:
+ "Korrekte perspektivische Textur-Koordinaten für jede Säule. Keine Verzerrung, keine Nahtstellen.",
+ },
+ {
+ title: "Echtzeit-Performance",
+ description:
+ "60 FPS auf moderner Hardware. Das Fundament für ein Verständnis von Frame-Timing und vsync.",
+ },
+ ],
+ stats: [
+ { label: "FPS Ziel", value: "60" },
+ { label: "Texturauflösung", value: "64px" },
+ { label: "Sichtweite", value: "∞" },
+ { label: "Abhängigkeiten", value: "0" },
+ ],
+ gallery: [
+ { src: "/assets/raycaster-screenshot.jpg", alt: "Raycaster Screenshot" },
+ ],
+ prevProject: {
+ title: "Software Raytracer",
+ link: "/project/raytracer",
+ },
+ nextProject: {
+ title: "6502 Emulator",
+ link: "/project/emulator",
+ },
+};
diff --git a/src/data/site.ts b/src/data/site.ts
new file mode 100644
index 0000000..a7b75c1
--- /dev/null
+++ b/src/data/site.ts
@@ -0,0 +1,33 @@
+export const site = {
+ name: "Mike Karl",
+ location: "Grafenau, Germany",
+ email: "karl.mike2002@gmail.com",
+ github: "https://github.com/GoranSalzmann",
+ linkedin: "https://www.linkedin.com/in/mike-karl-a58925381/",
+};
+
+export const navLinks = [
+ { label: "About", href: "/about" },
+ { label: "Hobbies", href: "/hobbies" },
+ { label: "Projekte", href: "/projects" },
+ { label: "Timeline", href: "/timeline" },
+ { label: "Kontakt", href: "/contact" },
+];
+
+export const socialLinks = [
+ { label: "GitHub", href: site.github, icon: "GithubIcon" },
+ { label: "LinkedIn", href: site.linkedin, icon: "LinkedInIcon" },
+ { label: "Email", href: `mailto:${site.email}`, icon: "Mail" },
+];
+
+export const footerContent = {
+ copyright: (year: number, name: string) =>
+ `\u00A9 ${year} ${name}. All rights reserved.`,
+ builtWith: "Built with Next.js, React & Tailwind CSS",
+};
+
+export const heroContent = {
+ subtitle: "Systementwickler",
+ nameFirst: "MIKE",
+ nameLast: "KARL",
+};
diff --git a/src/data/timeline.ts b/src/data/timeline.ts
new file mode 100644
index 0000000..36e29e2
--- /dev/null
+++ b/src/data/timeline.ts
@@ -0,0 +1,59 @@
+export const timelinePage = {
+ label: "04 / Werdegang",
+ subtitle:
+ 'Vom ersten "Hello World" bis zur professionellen Softwareentwicklung.',
+ pageTitle: "Stationen",
+ detailText:
+ "Dieser Abschnitt wird bald um eine detailliertere Reflexion erweitert – welche konkreten Fähigkeiten ich aufgebaut habe, welche Projekte daraus entstanden sind und wie dieser Zeitraum meinen Weg als Entwickler geprägt hat.",
+};
+
+export const timeline = [
+ {
+ year: "2025",
+ title: "Ausbildung zum Fachinformatiker",
+ description:
+ "Ausbildung zum Fachinformatiker für Anwendungsentwicklung. Der strukturierte Einstieg in professionelle Softwareentwicklung.",
+ tags: ["Software Engineering", "System Architecture"],
+ side: "right" as const,
+ },
+ {
+ year: "2024",
+ title: "Raytracer-Projekt",
+ description:
+ "Entwicklung eines Software-Raytracers in C von Grund auf. Monte-Carlo-Pfad-Tracing, BVH-Beschleunigung, Multithreading.",
+ tags: ["C", "Computer Graphics", "Algorithms"],
+ side: "left" as const,
+ },
+ {
+ year: "2023",
+ title: "6502 Emulator",
+ description:
+ "Cycle-accurater 6502-Emulator in C++ mit eigenem Assembler-Parser. Das Projekt, das mein Verständnis von CPU-Architektur verändert hat.",
+ tags: ["C++", "Emulation", "Low-Level"],
+ side: "right" as const,
+ },
+ {
+ year: "2022",
+ title: "Erste Berufserfahrung",
+ description:
+ "Praktikum und erste Projekte in der Webentwicklung. HTML, CSS, JavaScript – und das Verlangen, tiefer zu gehen.",
+ tags: ["Web Development", "JavaScript"],
+ side: "left" as const,
+ },
+ {
+ year: "2021",
+ title: "Raycasting Engine",
+ description:
+ "Wolfenstein-3D-Style-Raycaster mit DDA-Algorithmus und Textur-Mapping. Einführung in Echtzeit-Computergrafik.",
+ tags: ["C++", "Game Dev", "Graphics"],
+ side: "right" as const,
+ },
+ {
+ year: "2020",
+ title: "Beginn der Programmierreise",
+ description:
+ "Erste Schritte in C und C++. Das Gefühl, endlich zu verstehen, was unter der Haube passiert.",
+ tags: ["C", "C++", "Learning"],
+ side: "left" as const,
+ },
+];
diff --git a/src/global.d.ts b/src/global.d.ts
new file mode 100644
index 0000000..444f793
--- /dev/null
+++ b/src/global.d.ts
@@ -0,0 +1,4 @@
+declare module '*.css' {
+ const content: { [className: string]: string };
+ export default content;
+}
diff --git a/src/hooks/useScrollReveal.ts b/src/hooks/useScrollReveal.ts
new file mode 100644
index 0000000..fbfa37c
--- /dev/null
+++ b/src/hooks/useScrollReveal.ts
@@ -0,0 +1,64 @@
+import { useLayoutEffect, useRef } from "react";
+import gsap from "gsap";
+import { ScrollTrigger } from "gsap/ScrollTrigger";
+
+gsap.registerPlugin(ScrollTrigger);
+
+interface ScrollRevealOptions {
+ y?: number;
+ x?: number;
+ duration?: number;
+ delay?: number;
+ stagger?: number;
+ start?: string;
+ ease?: string;
+}
+
+export function useScrollReveal(
+ options: ScrollRevealOptions = {}
+) {
+ const ref = useRef(null);
+
+ useLayoutEffect(() => {
+ const el = ref.current;
+ if (!el) return;
+
+ const {
+ y = 40,
+ x = 0,
+ duration = 0.8,
+ delay = 0,
+ stagger = 0.1,
+ start = "top 85%",
+ ease = "power3.out",
+ } = options;
+
+ const children = el.children.length > 0 ? el.children : [el];
+
+ gsap.set(children, { opacity: 0, y, x });
+
+ const tween = gsap.to(children, {
+ opacity: 1,
+ y: 0,
+ x: 0,
+ duration,
+ delay,
+ stagger,
+ ease,
+ scrollTrigger: {
+ trigger: el,
+ start,
+ toggleActions: "play none none none",
+ },
+ });
+
+ return () => {
+ tween.kill();
+ ScrollTrigger.getAll().forEach((st) => {
+ if (st.trigger === el) st.kill();
+ });
+ };
+ }, []);
+
+ return ref;
+}
diff --git a/src/lib/icons.tsx b/src/lib/icons.tsx
new file mode 100644
index 0000000..93e317f
--- /dev/null
+++ b/src/lib/icons.tsx
@@ -0,0 +1,91 @@
+import {
+ Crosshair,
+ Search,
+ Timer,
+ Mail,
+ Bike,
+ Camera,
+} from "lucide-react";
+import type { ComponentType } from "react";
+
+function GithubIcon({
+ size = 18,
+ className = "",
+}: {
+ size?: number;
+ className?: string;
+}) {
+ return (
+
+
+
+
+ );
+}
+
+function LinkedInIcon({
+ size = 18,
+ className = "",
+}: {
+ size?: number;
+ className?: string;
+}) {
+ return (
+
+
+
+
+
+ );
+}
+
+const iconMap: Record<
+ string,
+ ComponentType<{ size?: number; className?: string }>
+> = {
+ Crosshair,
+ Search,
+ Timer,
+ Mail,
+ Bike,
+ Camera,
+ GithubIcon,
+ LinkedInIcon,
+};
+
+export function Icon({
+ name,
+ size = 18,
+ className = "",
+}: {
+ name: string;
+ size?: number;
+ className?: string;
+}) {
+ const Component = iconMap[name];
+ if (!Component) {
+ console.warn(`Icon "${name}" not found`);
+ return null;
+ }
+ return ;
+}
diff --git a/src/sections/AboutSection.tsx b/src/sections/AboutSection.tsx
new file mode 100644
index 0000000..9117eef
--- /dev/null
+++ b/src/sections/AboutSection.tsx
@@ -0,0 +1,45 @@
+"use client";
+
+import { useScrollReveal } from "../hooks/useScrollReveal";
+import { aboutContent, aboutPage } from "../data/about";
+import { ArrowRight } from "lucide-react";
+
+export default function AboutSection() {
+ const revealRef = useScrollReveal({ stagger: 0.15 });
+
+ const handleProjectsClick = (e: React.MouseEvent) => {
+ e.preventDefault();
+ const target = document.querySelector("#projects");
+ if (target) target.scrollIntoView({ behavior: "smooth" });
+ };
+
+ return (
+
+
+
+
{aboutPage.label}
+
+ {aboutContent.paragraphs.map((p, i) => (
+
{p}
+ ))}
+
+
+
+
+
+ );
+}
diff --git a/src/sections/ContactSection.tsx b/src/sections/ContactSection.tsx
new file mode 100644
index 0000000..80bcdfe
--- /dev/null
+++ b/src/sections/ContactSection.tsx
@@ -0,0 +1,38 @@
+"use client";
+
+import { useScrollReveal } from "../hooks/useScrollReveal";
+import { site } from "../data/site";
+import { contactContent, contactPage } from "../data/contact";
+import { Mail } from "lucide-react";
+
+export default function ContactSection() {
+ const revealRef = useScrollReveal({ stagger: 0.15 });
+
+ return (
+
+ );
+}
diff --git a/src/sections/HeroSection.tsx b/src/sections/HeroSection.tsx
new file mode 100644
index 0000000..e9226d2
--- /dev/null
+++ b/src/sections/HeroSection.tsx
@@ -0,0 +1,103 @@
+"use client";
+
+import { useEffect, useRef } from "react";
+import gsap from "gsap";
+import { ScrollTrigger } from "gsap/ScrollTrigger";
+import ParticleGrid from "../components/ParticleGrid";
+import { heroContent, site } from "../data/site";
+
+gsap.registerPlugin(ScrollTrigger);
+
+export default function HeroSection() {
+ const sectionRef = useRef(null);
+ const contentRef = useRef(null);
+ const bgRef = useRef(null);
+
+ useEffect(() => {
+ const section = sectionRef.current;
+ const content = contentRef.current;
+ const bg = bgRef.current;
+ if (!section || !content || !bg) return;
+
+ const ctx = gsap.context(() => {
+ gsap.to(bg, {
+ opacity: 0,
+ scrollTrigger: {
+ trigger: section,
+ start: "top top",
+ end: "40% top",
+ scrub: true,
+ },
+ });
+
+ gsap.to(content, {
+ opacity: 0,
+ scale: 0.95,
+ y: -50,
+ scrollTrigger: {
+ trigger: section,
+ start: "top top",
+ end: "50% top",
+ scrub: true,
+ },
+ });
+ }, section);
+
+ return () => ctx.revert();
+ }, []);
+
+ return (
+
+ {/* Particle grid background */}
+
+
+ {/* Amber radial gradient from top */}
+
+
+ {/* Bottom fade to deep space */}
+
+
+ {/* Content */}
+
+
+ {heroContent.subtitle}
+
+
+ {heroContent.nameFirst}
+
+ {heroContent.nameLast}
+
+
+
+
+ {site.location}
+
+
+
+
+ );
+}
diff --git a/src/sections/HobbiesSection.tsx b/src/sections/HobbiesSection.tsx
new file mode 100644
index 0000000..7faba00
--- /dev/null
+++ b/src/sections/HobbiesSection.tsx
@@ -0,0 +1,52 @@
+"use client";
+
+import Link from "next/link";
+import { ArrowRight } from "lucide-react";
+import { useScrollReveal } from "../hooks/useScrollReveal";
+import { hobbies, hobbiesPage } from "../data/hobbies";
+import { Icon } from "@/lib/icons";
+
+export default function HobbiesSection() {
+ const revealRef = useScrollReveal({ stagger: 0.2 });
+
+ return (
+
+
+
+
{hobbiesPage.label}
+
+ {hobbiesPage.sectionSubtitle}
+
+
+
+ {hobbies.map((hobby) => (
+
+
+
+
+
+ {hobby.title}
+
+
+ {hobby.shortDescription}
+
+
+
{hobbiesPage.linkText}
+
+
+
+ ))}
+
+
+
+ );
+}
diff --git a/src/sections/ProjectsSection.tsx b/src/sections/ProjectsSection.tsx
new file mode 100644
index 0000000..29da275
--- /dev/null
+++ b/src/sections/ProjectsSection.tsx
@@ -0,0 +1,65 @@
+"use client";
+
+import Link from "next/link";
+import { useScrollReveal } from "../hooks/useScrollReveal";
+import { projects, projectsPage } from "../data/projects";
+import { ArrowRight } from "lucide-react";
+
+export default function ProjectsSection() {
+ const revealRef = useScrollReveal({ stagger: 0.15 });
+
+ return (
+
+
+
+
+
{projectsPage.sectionLabel}
+
+ {projectsPage.subtitle}
+
+
+
+
+ {projects.map((project) => (
+
+
+
+
+
+ {projectsPage.caseStudyLabel}
+
+
+
+
+
+
+ {project.tags.map((tag) => (
+
+ {tag}
+
+ ))}
+
+
+ {project.title}
+
+
+ {project.description}
+
+
+
+ ))}
+
+
+
+
+ );
+}
diff --git a/src/sections/TimelineSection.tsx b/src/sections/TimelineSection.tsx
new file mode 100644
index 0000000..45cfef9
--- /dev/null
+++ b/src/sections/TimelineSection.tsx
@@ -0,0 +1,73 @@
+"use client";
+
+import { useScrollReveal } from "../hooks/useScrollReveal";
+import { timeline, timelinePage } from "../data/timeline";
+
+export default function TimelineSection() {
+ const revealRef = useScrollReveal({ stagger: 0.12 });
+
+ return (
+
+
+
+
{timelinePage.label}
+
+ {timelinePage.subtitle}
+
+
+
+
+ {/* Vertical line */}
+
+
+
+ {timeline.map((item) => {
+ const isLeft = item.side === "left";
+ return (
+
+ {/* Dot */}
+
+
+ {/* Content */}
+
+
+
+ {item.year}
+
+
+ {item.title}
+
+
+ {item.description}
+
+
+ {item.tags.map((tag) => (
+
+ {tag}
+
+ ))}
+
+
+
+
+ );
+ })}
+
+
+
+
+ );
+}
diff --git a/tsconfig.json b/tsconfig.json
index d8b9323..54ba555 100644
--- a/tsconfig.json
+++ b/tsconfig.json
@@ -1,7 +1,10 @@
{
"compilerOptions": {
- "target": "ES2017",
- "lib": ["dom", "dom.iterable", "esnext"],
+ "lib": [
+ "dom",
+ "dom.iterable",
+ "esnext"
+ ],
"allowJs": true,
"skipLibCheck": true,
"strict": true,
@@ -11,7 +14,7 @@
"moduleResolution": "bundler",
"resolveJsonModule": true,
"isolatedModules": true,
- "jsx": "preserve",
+ "jsx": "react-jsx",
"incremental": true,
"plugins": [
{
@@ -19,9 +22,22 @@
}
],
"paths": {
- "@/*": ["./*"]
- }
+ "@/*": [
+ "./src/*"
+ ]
+ },
+ "target": "ES2017"
},
- "include": ["next-env.d.ts", "**/*.ts", "**/*.tsx", ".next/types/**/*.ts"],
- "exclude": ["node_modules"]
+ "include": [
+ "**/*.ts",
+ "**/*.tsx",
+ ".next/types/**/*.ts",
+ "next-env.d.ts",
+ "dist/types/**/*.ts",
+ ".next/dev/types/**/*.ts",
+ "dist/dev/types/**/*.ts"
+ ],
+ "exclude": [
+ "node_modules"
+ ]
}