diff --git a/components.json b/components.json
index a577707..899a9fc 100644
--- a/components.json
+++ b/components.json
@@ -10,6 +10,7 @@
"cssVariables": true,
"prefix": ""
},
+ "iconLibrary": "lucide",
"aliases": {
"components": "@/components",
"utils": "@/lib/utils",
@@ -17,5 +18,7 @@
"lib": "@/lib",
"hooks": "@/hooks"
},
- "iconLibrary": "lucide"
-}
\ No newline at end of file
+ "registries": {
+ "@aceternity": "https://ui.aceternity.com/registry/{name}.json"
+ }
+}
diff --git a/messages/de/contact.json b/messages/de/contact.json
new file mode 100644
index 0000000..0ac16cf
--- /dev/null
+++ b/messages/de/contact.json
@@ -0,0 +1,28 @@
+{
+ "subTitle": "Lass uns",
+ "title": "Starten",
+ "form": {
+ "name": {
+ "label": "Name",
+ "placeholder": "Dein name"
+ },
+ "email": {
+ "label": "Email",
+ "placeholder": "Deine email"
+ },
+ "budget": {
+ "label": "Dein Budget",
+ "placeholder": "Select your budget",
+ "options": {
+ "1": "Weniger als €2k",
+ "2": "Mehr als €4k",
+ "3": "Mehr als €6k"
+ }
+ },
+ "message": {
+ "label": "Nachricht",
+ "placeholder": "Deine Nachricht"
+ },
+ "submit": "Absenden"
+ }
+}
diff --git a/messages/de/global.json b/messages/de/global.json
new file mode 100644
index 0000000..541157b
--- /dev/null
+++ b/messages/de/global.json
@@ -0,0 +1,15 @@
+{
+ "and": "und",
+
+ "me": {
+ "name": "Pablo",
+ "role": "Webentwickler",
+ "work": "Verfügbar für Aufträge"
+ },
+
+ "navbar": {
+ "home": "Home",
+ "projects": "Projekte",
+ "work": "Auftrag Anfragen"
+ }
+}
diff --git a/messages/de/home.json b/messages/de/home.json
new file mode 100644
index 0000000..676597d
--- /dev/null
+++ b/messages/de/home.json
@@ -0,0 +1,24 @@
+{
+ "hero": {
+ "slot1": {
+ "label": "Zeitlos",
+ "link": "https://weather.shrt.solutions",
+ "image": "/projects/weather.png"
+ },
+ "slot2": {
+ "label": "Kreativ",
+ "link": "https://vico.shortman.me",
+ "image": "/projects/link-preview-vico.png"
+ },
+ "slot3": {
+ "label": "Einzigartig",
+ "link": "https://ivorygrow.de",
+ "image": "/projects/ivory.png"
+ }
+ },
+ "tech": {
+ "text": "bevorzugte",
+ "technologies": "Technologien",
+ "tools": "Werkzeuge"
+ }
+}
diff --git a/messages/de/legal.json b/messages/de/legal.json
new file mode 100644
index 0000000..5cdb302
--- /dev/null
+++ b/messages/de/legal.json
@@ -0,0 +1,20 @@
+{
+ "legal": {
+ "imprint": {
+ "title": "Impressum",
+ "company": "Firma",
+ "address": "Adresse",
+ "germany": "Deutschland",
+ "contact": "Kontakt"
+ },
+
+ "privacy": {
+ "title": "Datenschutzerklärung"
+ }
+ },
+ "footer": {
+ "copyright": "© {year} Pablo Kurzmann - Portfolio. Alle Rechte vorbehalten.",
+ "imprint": "impressum",
+ "privacy": "datenschutz"
+ }
+}
diff --git a/messages/de/projects.json b/messages/de/projects.json
new file mode 100644
index 0000000..fece4d1
--- /dev/null
+++ b/messages/de/projects.json
@@ -0,0 +1,16 @@
+{
+ "0": {
+ "image": "/projects/ivory.png",
+ "link": { "live": "https://ivorygrow.de" },
+ "title": "Ivory Grow & Headshop",
+ "description": "Modernes Webprojekt für einen nachhaltigen Head- & Growshop. Cleanes Design, DSGVO-konform und performance-optimiert. Umgesetzt mit Webflow, Fokus auf UX und Markenwirkung.",
+ "year": "2025"
+ },
+ "1": {
+ "image": "/projects/weather.png",
+ "link": { "live": "https://weather.shrt.solutions/" },
+ "title": "Wetter App",
+ "description": "Minimalistische Wetter-App mit klarem Fokus auf Übersicht. Echtzeitdaten, responsive UI und moderne API-Integration. Entwickelt mit TypeScript und React für maximale Performance.",
+ "year": "2024"
+ }
+}
diff --git a/messages/en/contact.json b/messages/en/contact.json
new file mode 100644
index 0000000..33caf03
--- /dev/null
+++ b/messages/en/contact.json
@@ -0,0 +1,28 @@
+{
+ "subTitle": "Lets Work",
+ "title": "Together",
+ "form": {
+ "name": {
+ "label": "Name",
+ "placeholder": "Your name"
+ },
+ "email": {
+ "label": "Email",
+ "placeholder": "Your email"
+ },
+ "budget": {
+ "label": "Budget",
+ "placeholder": "Select your budget",
+ "options": {
+ "1": "Less than $2k",
+ "2": "More than $4k",
+ "3": "More than $6k"
+ }
+ },
+ "message": {
+ "label": "Message",
+ "placeholder": "Your message"
+ },
+ "submit": "Send"
+ }
+}
diff --git a/messages/en/global.json b/messages/en/global.json
new file mode 100644
index 0000000..41fa5e6
--- /dev/null
+++ b/messages/en/global.json
@@ -0,0 +1,9 @@
+{
+ "and": "and",
+ "me": {
+ "name": "Pablo",
+ "role": "Webdeveloper",
+ "work": "Available for work"
+ },
+ "navbar": { "home": "Home", "projects": "Projects", "work": "Work with me" }
+}
diff --git a/messages/en/home.json b/messages/en/home.json
new file mode 100644
index 0000000..2de665e
--- /dev/null
+++ b/messages/en/home.json
@@ -0,0 +1,24 @@
+{
+ "hero": {
+ "slot1": {
+ "label": "Timeless",
+ "link": "https://weather.shrt.solutions",
+ "image": "/projects/weather.png"
+ },
+ "slot2": {
+ "label": "Creative",
+ "link": "https://vico.shortman.me",
+ "image": "/projects/link-preview-vico.png"
+ },
+ "slot3": {
+ "label": "Unique",
+ "link": "https://ivorygrow.de",
+ "image": "/projects/ivory.png"
+ }
+ },
+ "tech": {
+ "text": "most liked",
+ "technologies": "technologies",
+ "tools": "tools"
+ }
+}
diff --git a/messages/en/legal.json b/messages/en/legal.json
new file mode 100644
index 0000000..aaff8e5
--- /dev/null
+++ b/messages/en/legal.json
@@ -0,0 +1,19 @@
+{
+ "legal": {
+ "imprint": {
+ "title": "Imprint",
+ "company": "Company",
+ "address": "Address",
+ "germany": "Germany",
+ "contact": "Contact"
+ },
+ "privacy": {
+ "title": "Privacy Policy"
+ }
+ },
+ "footer": {
+ "imprint": "imprint",
+ "privacy": "privacy",
+ "copyright": "© {year} Pablo Kurzmann - Portfolio. All rights reserved."
+ }
+}
diff --git a/messages/en/projects.json b/messages/en/projects.json
new file mode 100644
index 0000000..4452ca5
--- /dev/null
+++ b/messages/en/projects.json
@@ -0,0 +1,16 @@
+{
+ "0": {
+ "image": "/projects/ivory.png",
+ "link": { "live": "https://ivorygrow.de" },
+ "title": "Ivory Grow & Headshop",
+ "description": "Modern web project for a sustainable head & grow shop. Clean design, GDPR-compliant and performance optimized. Built with Webflow, focused on UX and brand impact.",
+ "year": "2025"
+ },
+ "1": {
+ "image": "/projects/weather.png",
+ "link": { "live": "https://weather.shrt.solutions/" },
+ "title": "Weather App",
+ "description": "Minimalist weather app focused on clarity and simplicity. Real-time data, responsive UI, and modern API integration. Built with TypeScript and React for top performance.",
+ "year": "2024"
+ }
+}
diff --git a/messages/index.ts b/messages/index.ts
new file mode 100644
index 0000000..ea9537d
--- /dev/null
+++ b/messages/index.ts
@@ -0,0 +1,30 @@
+/* EN Imports */
+import enGlobal from "./en/global.json";
+import enProjects from "./en/projects.json";
+import enHome from "./en/home.json";
+import enContact from "./en/contact.json";
+import enLegal from "./en/legal.json";
+
+/* DE Imports */
+import deGlobal from "./de/global.json";
+import deProjects from "./de/projects.json";
+import deHome from "./de/home.json";
+import deContact from "./de/contact.json";
+import deLegal from "./de/legal.json";
+
+export const allMessages = {
+ en: {
+ global: enGlobal,
+ projects: enProjects,
+ home: enHome,
+ contact: enContact,
+ legal: enLegal,
+ },
+ de: {
+ global: deGlobal,
+ projects: deProjects,
+ home: deHome,
+ contact: deContact,
+ legal: deLegal,
+ },
+};
diff --git a/next.config.ts b/next.config.ts
index e9ffa30..cef8694 100644
--- a/next.config.ts
+++ b/next.config.ts
@@ -1,7 +1,18 @@
-import type { NextConfig } from "next";
+import { NextConfig } from "next";
+import createNextIntlPlugin from "next-intl/plugin";
const nextConfig: NextConfig = {
- /* config options here */
+ async redirects() {
+ return [
+ // Deutsche Bezeichnungen -> kanonische Pfade
+ { source: "/impressum", destination: "/imprint", permanent: true },
+ { source: "/datenschutz", destination: "/privacy", permanent: true },
+
+ // Optional: Plural/Varianten
+ { source: "/privacy-policy", destination: "/privacy", permanent: true },
+ ];
+ },
};
-export default nextConfig;
+const withNextIntl = createNextIntlPlugin();
+export default withNextIntl(nextConfig);
diff --git a/package.json b/package.json
index fe86272..a4f68a2 100644
--- a/package.json
+++ b/package.json
@@ -10,13 +10,22 @@
},
"dependencies": {
"@hookform/resolvers": "^3.9.1",
+ "@radix-ui/react-dropdown-menu": "^2.1.16",
+ "@radix-ui/react-hover-card": "^1.1.15",
"@radix-ui/react-label": "^2.1.0",
+ "@radix-ui/react-popover": "^1.1.15",
"@radix-ui/react-select": "^2.1.2",
"@radix-ui/react-slot": "^1.1.0",
+ "@types/nodemailer": "^7.0.3",
"class-variance-authority": "^0.7.1",
"clsx": "^2.1.1",
"lucide-react": "^0.462.0",
+ "motion": "^12.23.24",
"next": "15.0.3",
+ "next-intl": "^4.4.0",
+ "next-themes": "^0.4.6",
+ "nodemailer": "^7.0.10",
+ "qss": "^3.0.0",
"react": "19.0.0-rc-66855b96-20241106",
"react-dom": "19.0.0-rc-66855b96-20241106",
"react-hook-form": "^7.53.2",
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index eeaead6..cd0caef 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -11,15 +11,27 @@ importers:
'@hookform/resolvers':
specifier: ^3.9.1
version: 3.9.1(react-hook-form@7.53.2(react@19.0.0-rc-66855b96-20241106))
+ '@radix-ui/react-dropdown-menu':
+ specifier: ^2.1.16
+ version: 2.1.16(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@19.0.0-rc-66855b96-20241106(react@19.0.0-rc-66855b96-20241106))(react@19.0.0-rc-66855b96-20241106)
+ '@radix-ui/react-hover-card':
+ specifier: ^1.1.15
+ version: 1.1.15(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@19.0.0-rc-66855b96-20241106(react@19.0.0-rc-66855b96-20241106))(react@19.0.0-rc-66855b96-20241106)
'@radix-ui/react-label':
specifier: ^2.1.0
version: 2.1.0(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@19.0.0-rc-66855b96-20241106(react@19.0.0-rc-66855b96-20241106))(react@19.0.0-rc-66855b96-20241106)
+ '@radix-ui/react-popover':
+ specifier: ^1.1.15
+ version: 1.1.15(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@19.0.0-rc-66855b96-20241106(react@19.0.0-rc-66855b96-20241106))(react@19.0.0-rc-66855b96-20241106)
'@radix-ui/react-select':
specifier: ^2.1.2
version: 2.1.2(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@19.0.0-rc-66855b96-20241106(react@19.0.0-rc-66855b96-20241106))(react@19.0.0-rc-66855b96-20241106)
'@radix-ui/react-slot':
specifier: ^1.1.0
version: 1.1.0(@types/react@18.3.12)(react@19.0.0-rc-66855b96-20241106)
+ '@types/nodemailer':
+ specifier: ^7.0.3
+ version: 7.0.3
class-variance-authority:
specifier: ^0.7.1
version: 0.7.1
@@ -29,9 +41,24 @@ importers:
lucide-react:
specifier: ^0.462.0
version: 0.462.0(react@19.0.0-rc-66855b96-20241106)
+ motion:
+ specifier: ^12.23.24
+ version: 12.23.24(react-dom@19.0.0-rc-66855b96-20241106(react@19.0.0-rc-66855b96-20241106))(react@19.0.0-rc-66855b96-20241106)
next:
specifier: 15.0.3
version: 15.0.3(react-dom@19.0.0-rc-66855b96-20241106(react@19.0.0-rc-66855b96-20241106))(react@19.0.0-rc-66855b96-20241106)
+ next-intl:
+ specifier: ^4.4.0
+ version: 4.4.0(next@15.0.3(react-dom@19.0.0-rc-66855b96-20241106(react@19.0.0-rc-66855b96-20241106))(react@19.0.0-rc-66855b96-20241106))(react@19.0.0-rc-66855b96-20241106)(typescript@5.7.2)
+ next-themes:
+ specifier: ^0.4.6
+ version: 0.4.6(react-dom@19.0.0-rc-66855b96-20241106(react@19.0.0-rc-66855b96-20241106))(react@19.0.0-rc-66855b96-20241106)
+ nodemailer:
+ specifier: ^7.0.10
+ version: 7.0.10
+ qss:
+ specifier: ^3.0.0
+ version: 3.0.0
react:
specifier: 19.0.0-rc-66855b96-20241106
version: 19.0.0-rc-66855b96-20241106
@@ -82,6 +109,131 @@ packages:
resolution: {integrity: sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==}
engines: {node: '>=10'}
+ '@aws-crypto/sha256-browser@5.2.0':
+ resolution: {integrity: sha512-AXfN/lGotSQwu6HNcEsIASo7kWXZ5HYWvfOmSNKDsEqC4OashTp8alTmaz+F7TC2L083SFv5RdB+qU3Vs1kZqw==}
+
+ '@aws-crypto/sha256-js@5.2.0':
+ resolution: {integrity: sha512-FFQQyu7edu4ufvIZ+OadFpHHOt+eSTBaYaki44c+akjg7qZg9oOQeLlk77F6tSYqjDAFClrHJk9tMf0HdVyOvA==}
+ engines: {node: '>=16.0.0'}
+
+ '@aws-crypto/supports-web-crypto@5.2.0':
+ resolution: {integrity: sha512-iAvUotm021kM33eCdNfwIN//F77/IADDSs58i+MDaOqFrVjZo9bAal0NK7HurRuWLLpF1iLX7gbWrjHjeo+YFg==}
+
+ '@aws-crypto/util@5.2.0':
+ resolution: {integrity: sha512-4RkU9EsI6ZpBve5fseQlGNUWKMa1RLPQ1dnjnQoe07ldfIzcsGb5hC5W0Dm7u423KWzawlrpbjXBrXCEv9zazQ==}
+
+ '@aws-sdk/client-sesv2@3.917.0':
+ resolution: {integrity: sha512-Jwz+3rO9fc2H8JyF4ainL5x06tiQ0n4ewKIpdUeGIauKdndMItYP1aeM0Y8wJQPTF1XEpWFC36cTSDgk/eypxA==}
+ engines: {node: '>=18.0.0'}
+
+ '@aws-sdk/client-sso@3.916.0':
+ resolution: {integrity: sha512-Eu4PtEUL1MyRvboQnoq5YKg0Z9vAni3ccebykJy615xokVZUdA3di2YxHM/hykDQX7lcUC62q9fVIvh0+UNk/w==}
+ engines: {node: '>=18.0.0'}
+
+ '@aws-sdk/core@3.916.0':
+ resolution: {integrity: sha512-1JHE5s6MD5PKGovmx/F1e01hUbds/1y3X8rD+Gvi/gWVfdg5noO7ZCerpRsWgfzgvCMZC9VicopBqNHCKLykZA==}
+ engines: {node: '>=18.0.0'}
+
+ '@aws-sdk/credential-provider-env@3.916.0':
+ resolution: {integrity: sha512-3gDeqOXcBRXGHScc6xb7358Lyf64NRG2P08g6Bu5mv1Vbg9PKDyCAZvhKLkG7hkdfAM8Yc6UJNhbFxr1ud/tCQ==}
+ engines: {node: '>=18.0.0'}
+
+ '@aws-sdk/credential-provider-http@3.916.0':
+ resolution: {integrity: sha512-NmooA5Z4/kPFJdsyoJgDxuqXC1C6oPMmreJjbOPqcwo6E/h2jxaG8utlQFgXe5F9FeJsMx668dtxVxSYnAAqHQ==}
+ engines: {node: '>=18.0.0'}
+
+ '@aws-sdk/credential-provider-ini@3.917.0':
+ resolution: {integrity: sha512-rvQ0QamLySRq+Okc0ZqFHZ3Fbvj3tYuWNIlzyEKklNmw5X5PM1idYKlOJflY2dvUGkIqY3lUC9SC2WL+1s7KIw==}
+ engines: {node: '>=18.0.0'}
+
+ '@aws-sdk/credential-provider-node@3.917.0':
+ resolution: {integrity: sha512-n7HUJ+TgU9wV/Z46yR1rqD9hUjfG50AKi+b5UXTlaDlVD8bckg40i77ROCllp53h32xQj/7H0yBIYyphwzLtmg==}
+ engines: {node: '>=18.0.0'}
+
+ '@aws-sdk/credential-provider-process@3.916.0':
+ resolution: {integrity: sha512-SXDyDvpJ1+WbotZDLJW1lqP6gYGaXfZJrgFSXIuZjHb75fKeNRgPkQX/wZDdUvCwdrscvxmtyJorp2sVYkMcvA==}
+ engines: {node: '>=18.0.0'}
+
+ '@aws-sdk/credential-provider-sso@3.916.0':
+ resolution: {integrity: sha512-gu9D+c+U/Dp1AKBcVxYHNNoZF9uD4wjAKYCjgSN37j4tDsazwMEylbbZLuRNuxfbXtizbo4/TiaxBXDbWM7AkQ==}
+ engines: {node: '>=18.0.0'}
+
+ '@aws-sdk/credential-provider-web-identity@3.917.0':
+ resolution: {integrity: sha512-pZncQhFbwW04pB0jcD5OFv3x2gAddDYCVxyJVixgyhSw7bKCYxqu6ramfq1NxyVpmm+qsw+ijwi/3cCmhUHF/A==}
+ engines: {node: '>=18.0.0'}
+
+ '@aws-sdk/middleware-host-header@3.914.0':
+ resolution: {integrity: sha512-7r9ToySQ15+iIgXMF/h616PcQStByylVkCshmQqcdeynD/lCn2l667ynckxW4+ql0Q+Bo/URljuhJRxVJzydNA==}
+ engines: {node: '>=18.0.0'}
+
+ '@aws-sdk/middleware-logger@3.914.0':
+ resolution: {integrity: sha512-/gaW2VENS5vKvJbcE1umV4Ag3NuiVzpsANxtrqISxT3ovyro29o1RezW/Avz/6oJqjnmgz8soe9J1t65jJdiNg==}
+ engines: {node: '>=18.0.0'}
+
+ '@aws-sdk/middleware-recursion-detection@3.914.0':
+ resolution: {integrity: sha512-yiAjQKs5S2JKYc+GrkvGMwkUvhepXDigEXpSJqUseR/IrqHhvGNuOxDxq+8LbDhM4ajEW81wkiBbU+Jl9G82yQ==}
+ engines: {node: '>=18.0.0'}
+
+ '@aws-sdk/middleware-sdk-s3@3.916.0':
+ resolution: {integrity: sha512-pjmzzjkEkpJObzmTthqJPq/P13KoNFuEi/x5PISlzJtHofCNcyXeVAQ90yvY2dQ6UXHf511Rh1/ytiKy2A8M0g==}
+ engines: {node: '>=18.0.0'}
+
+ '@aws-sdk/middleware-user-agent@3.916.0':
+ resolution: {integrity: sha512-mzF5AdrpQXc2SOmAoaQeHpDFsK2GE6EGcEACeNuoESluPI2uYMpuuNMYrUufdnIAIyqgKlis0NVxiahA5jG42w==}
+ engines: {node: '>=18.0.0'}
+
+ '@aws-sdk/nested-clients@3.916.0':
+ resolution: {integrity: sha512-tgg8e8AnVAer0rcgeWucFJ/uNN67TbTiDHfD+zIOPKep0Z61mrHEoeT/X8WxGIOkEn4W6nMpmS4ii8P42rNtnA==}
+ engines: {node: '>=18.0.0'}
+
+ '@aws-sdk/region-config-resolver@3.914.0':
+ resolution: {integrity: sha512-KlmHhRbn1qdwXUdsdrJ7S/MAkkC1jLpQ11n+XvxUUUCGAJd1gjC7AjxPZUM7ieQ2zcb8bfEzIU7al+Q3ZT0u7Q==}
+ engines: {node: '>=18.0.0'}
+
+ '@aws-sdk/signature-v4-multi-region@3.916.0':
+ resolution: {integrity: sha512-fuzUMo6xU7e0NBzBA6TQ4FUf1gqNbg4woBSvYfxRRsIfKmSMn9/elXXn4sAE5UKvlwVQmYnb6p7dpVRPyFvnQA==}
+ engines: {node: '>=18.0.0'}
+
+ '@aws-sdk/token-providers@3.916.0':
+ resolution: {integrity: sha512-13GGOEgq5etbXulFCmYqhWtpcEQ6WI6U53dvXbheW0guut8fDFJZmEv7tKMTJgiybxh7JHd0rWcL9JQND8DwoQ==}
+ engines: {node: '>=18.0.0'}
+
+ '@aws-sdk/types@3.914.0':
+ resolution: {integrity: sha512-kQWPsRDmom4yvAfyG6L1lMmlwnTzm1XwMHOU+G5IFlsP4YEaMtXidDzW/wiivY0QFrhfCz/4TVmu0a2aPU57ug==}
+ engines: {node: '>=18.0.0'}
+
+ '@aws-sdk/util-arn-parser@3.893.0':
+ resolution: {integrity: sha512-u8H4f2Zsi19DGnwj5FSZzDMhytYF/bCh37vAtBsn3cNDL3YG578X5oc+wSX54pM3tOxS+NY7tvOAo52SW7koUA==}
+ engines: {node: '>=18.0.0'}
+
+ '@aws-sdk/util-endpoints@3.916.0':
+ resolution: {integrity: sha512-bAgUQwvixdsiGNcuZSDAOWbyHlnPtg8G8TyHD6DTfTmKTHUW6tAn+af/ZYJPXEzXhhpwgJqi58vWnsiDhmr7NQ==}
+ engines: {node: '>=18.0.0'}
+
+ '@aws-sdk/util-locate-window@3.893.0':
+ resolution: {integrity: sha512-T89pFfgat6c8nMmpI8eKjBcDcgJq36+m9oiXbcUzeU55MP9ZuGgBomGjGnHaEyF36jenW9gmg3NfZDm0AO2XPg==}
+ engines: {node: '>=18.0.0'}
+
+ '@aws-sdk/util-user-agent-browser@3.914.0':
+ resolution: {integrity: sha512-rMQUrM1ECH4kmIwlGl9UB0BtbHy6ZuKdWFrIknu8yGTRI/saAucqNTh5EI1vWBxZ0ElhK5+g7zOnUuhSmVQYUA==}
+
+ '@aws-sdk/util-user-agent-node@3.916.0':
+ resolution: {integrity: sha512-CwfWV2ch6UdjuSV75ZU99N03seEUb31FIUrXBnwa6oONqj/xqXwrxtlUMLx6WH3OJEE4zI3zt5PjlTdGcVwf4g==}
+ engines: {node: '>=18.0.0'}
+ peerDependencies:
+ aws-crt: '>=1.0.0'
+ peerDependenciesMeta:
+ aws-crt:
+ optional: true
+
+ '@aws-sdk/xml-builder@3.914.0':
+ resolution: {integrity: sha512-k75evsBD5TcIjedycYS7QXQ98AmOtbnxRJOPtCo0IwYRmy7UvqgS/gBL5SmrIqeV6FDSYRQMgdBxSMp6MLmdew==}
+ engines: {node: '>=18.0.0'}
+
+ '@aws/lambda-invoke-store@0.0.1':
+ resolution: {integrity: sha512-ORHRQ2tmvnBXc8t/X9Z8IcSbBA4xTLKuN873FopzklHMeqBst7YG0d+AX97inkvDX+NChYtSr+qGfcqGFaI8Zw==}
+ engines: {node: '>=18.0.0'}
+
'@emnapi/runtime@1.3.1':
resolution: {integrity: sha512-kEBmG8KyqtxJZv+ygbEim+KCGtIq1fC22Ms3S4ziXmYKm8uyoLX0MHONVKwp+9opg390VaKRNt4a7A9NwmpNhw==}
@@ -118,6 +270,24 @@ packages:
'@floating-ui/utils@0.2.8':
resolution: {integrity: sha512-kym7SodPp8/wloecOpcmSnWJsK7M0E5Wg8UcFA+uO4B9s5d0ywXOEro/8HM9x0rW+TljRzul/14UYz3TleT3ig==}
+ '@formatjs/ecma402-abstract@2.3.6':
+ resolution: {integrity: sha512-HJnTFeRM2kVFVr5gr5kH1XP6K0JcJtE7Lzvtr3FS/so5f1kpsqqqxy5JF+FRaO6H2qmcMfAUIox7AJteieRtVw==}
+
+ '@formatjs/fast-memoize@2.2.7':
+ resolution: {integrity: sha512-Yabmi9nSvyOMrlSeGGWDiH7rf3a7sIwplbvo/dlz9WCIjzIQAfy1RMf4S0X3yG724n5Ghu2GmEl5NJIV6O9sZQ==}
+
+ '@formatjs/icu-messageformat-parser@2.11.4':
+ resolution: {integrity: sha512-7kR78cRrPNB4fjGFZg3Rmj5aah8rQj9KPzuLsmcSn4ipLXQvC04keycTI1F7kJYDwIXtT2+7IDEto842CfZBtw==}
+
+ '@formatjs/icu-skeleton-parser@1.8.16':
+ resolution: {integrity: sha512-H13E9Xl+PxBd8D5/6TVUluSpxGNvFSlN/b3coUp0e0JpuWXXnQDiavIpY3NnvSp4xhEMoXyyBvVfdFX8jglOHQ==}
+
+ '@formatjs/intl-localematcher@0.5.10':
+ resolution: {integrity: sha512-af3qATX+m4Rnd9+wHcjJ4w2ijq+rAVP3CCinJQvFv1kgSu1W6jypUmvleJxcewdxmutM8dmIRZFxO/IQBZmP2Q==}
+
+ '@formatjs/intl-localematcher@0.6.2':
+ resolution: {integrity: sha512-XOMO2Hupl0wdd172Y06h6kLpBz6Dv+J4okPLl4LPtzbr8f66WbIoy4ev98EBuZ6ZK4h5ydTN6XneT4QVpD7cdA==}
+
'@hookform/resolvers@3.9.1':
resolution: {integrity: sha512-ud2HqmGBM0P0IABqoskKWI6PEf6ZDDBZkFqe2Vnl+mTHCEHzr3ISjjZyCwTjC/qpL25JC9aIDkloQejvMeq0ug==}
peerDependencies:
@@ -343,6 +513,9 @@ packages:
'@radix-ui/primitive@1.1.0':
resolution: {integrity: sha512-4Z8dn6Upk0qk4P74xBhZ6Hd/w0mPEzOOLxy4xiPXOXqjF7jZS0VAKk7/x/H6FyY2zCkYJqePf1G5KmkmNJ4RBA==}
+ '@radix-ui/primitive@1.1.3':
+ resolution: {integrity: sha512-JTF99U/6XIjCBo0wqkU5sK10glYe27MRRsfwoiq5zzOEZLHU3A3KCMa5X/azekYRCJ0HlwI0crAXS/5dEHTzDg==}
+
'@radix-ui/react-arrow@1.1.0':
resolution: {integrity: sha512-FmlW1rCg7hBpEBwFbjHwCW6AmWLQM6g/v0Sn8XbP9NvmSZ2San1FpQeyPtufzOMSIx7Y4dzjlHoifhp+7NkZhw==}
peerDependencies:
@@ -356,6 +529,19 @@ packages:
'@types/react-dom':
optional: true
+ '@radix-ui/react-arrow@1.1.7':
+ resolution: {integrity: sha512-F+M1tLhO+mlQaOWspE8Wstg+z6PwxwRd8oQ8IXceWz92kfAmalTRf0EjrouQeo7QssEPfCn05B4Ihs1K9WQ/7w==}
+ peerDependencies:
+ '@types/react': '*'
+ '@types/react-dom': '*'
+ react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+ '@types/react-dom':
+ optional: true
+
'@radix-ui/react-collection@1.1.0':
resolution: {integrity: sha512-GZsZslMJEyo1VKm5L1ZJY8tGDxZNPAoUeQUIbKeJfoi7Q4kmig5AsgLMYYuyYbfjd8fBmFORAIwYAkXMnXZgZw==}
peerDependencies:
@@ -369,6 +555,19 @@ packages:
'@types/react-dom':
optional: true
+ '@radix-ui/react-collection@1.1.7':
+ resolution: {integrity: sha512-Fh9rGN0MoI4ZFUNyfFVNU4y9LUz93u9/0K+yLgA2bwRojxM8JU1DyvvMBabnZPBgMWREAJvU2jjVzq+LrFUglw==}
+ peerDependencies:
+ '@types/react': '*'
+ '@types/react-dom': '*'
+ react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+ '@types/react-dom':
+ optional: true
+
'@radix-ui/react-compose-refs@1.1.0':
resolution: {integrity: sha512-b4inOtiaOnYf9KWyO3jAeeCG6FeyfY6ldiEPanbUjWd+xIk5wZeHa8yVwmrJ2vderhu/BQvzCrJI0lHd+wIiqw==}
peerDependencies:
@@ -378,6 +577,15 @@ packages:
'@types/react':
optional: true
+ '@radix-ui/react-compose-refs@1.1.2':
+ resolution: {integrity: sha512-z4eqJvfiNnFMHIIvXP3CY57y2WJs5g2v3X0zm9mEJkrkNv4rDxu+sg9Jh8EkXyeqBkB7SOcboo9dMVqhyrACIg==}
+ peerDependencies:
+ '@types/react': '*'
+ react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+
'@radix-ui/react-context@1.1.0':
resolution: {integrity: sha512-OKrckBy+sMEgYM/sMmqmErVn0kZqrHPJze+Ql3DzYsDDp0hl0L62nx/2122/Bvps1qz645jlcu2tD9lrRSdf8A==}
peerDependencies:
@@ -396,6 +604,15 @@ packages:
'@types/react':
optional: true
+ '@radix-ui/react-context@1.1.2':
+ resolution: {integrity: sha512-jCi/QKUM2r1Ju5a3J64TH2A5SpKAgh0LpknyqdQ4m6DCV0xJ2HG1xARRwNGPQfi1SLdLWZ1OJz6F4OMBBNiGJA==}
+ peerDependencies:
+ '@types/react': '*'
+ react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+
'@radix-ui/react-direction@1.1.0':
resolution: {integrity: sha512-BUuBvgThEiAXh2DWu93XsT+a3aWrGqolGlqqw5VU1kG7p/ZH2cuDlM1sRLNnY3QcBS69UIz2mcKhMxDsdewhjg==}
peerDependencies:
@@ -405,6 +622,15 @@ packages:
'@types/react':
optional: true
+ '@radix-ui/react-direction@1.1.1':
+ resolution: {integrity: sha512-1UEWRX6jnOA2y4H5WczZ44gOOjTEmlqv1uNW4GAJEO5+bauCBhv8snY65Iw5/VOS/ghKN9gr2KjnLKxrsvoMVw==}
+ peerDependencies:
+ '@types/react': '*'
+ react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+
'@radix-ui/react-dismissable-layer@1.1.1':
resolution: {integrity: sha512-QSxg29lfr/xcev6kSz7MAlmDnzbP1eI/Dwn3Tp1ip0KT5CUELsxkekFEMVBEoykI3oV39hKT4TKZzBNMbcTZYQ==}
peerDependencies:
@@ -418,6 +644,32 @@ packages:
'@types/react-dom':
optional: true
+ '@radix-ui/react-dismissable-layer@1.1.11':
+ resolution: {integrity: sha512-Nqcp+t5cTB8BinFkZgXiMJniQH0PsUt2k51FUhbdfeKvc4ACcG2uQniY/8+h1Yv6Kza4Q7lD7PQV0z0oicE0Mg==}
+ peerDependencies:
+ '@types/react': '*'
+ '@types/react-dom': '*'
+ react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+ '@types/react-dom':
+ optional: true
+
+ '@radix-ui/react-dropdown-menu@2.1.16':
+ resolution: {integrity: sha512-1PLGQEynI/3OX/ftV54COn+3Sud/Mn8vALg2rWnBLnRaGtJDduNW/22XjlGgPdpcIbiQxjKtb7BkcjP00nqfJw==}
+ peerDependencies:
+ '@types/react': '*'
+ '@types/react-dom': '*'
+ react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+ '@types/react-dom':
+ optional: true
+
'@radix-ui/react-focus-guards@1.1.1':
resolution: {integrity: sha512-pSIwfrT1a6sIoDASCSpFwOasEwKTZWDw/iBdtnqKO7v6FeOzYJ7U53cPzYFVR3geGGXgVHaH+CdngrrAzqUGxg==}
peerDependencies:
@@ -427,6 +679,15 @@ packages:
'@types/react':
optional: true
+ '@radix-ui/react-focus-guards@1.1.3':
+ resolution: {integrity: sha512-0rFg/Rj2Q62NCm62jZw0QX7a3sz6QCQU0LpZdNrJX8byRGaGVTqbrW9jAoIAHyMQqsNpeZ81YgSizOt5WXq0Pw==}
+ peerDependencies:
+ '@types/react': '*'
+ react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+
'@radix-ui/react-focus-scope@1.1.0':
resolution: {integrity: sha512-200UD8zylvEyL8Bx+z76RJnASR2gRMuxlgFCPAe/Q/679a/r0eK3MBVYMb7vZODZcffZBdob1EGnky78xmVvcA==}
peerDependencies:
@@ -440,6 +701,32 @@ packages:
'@types/react-dom':
optional: true
+ '@radix-ui/react-focus-scope@1.1.7':
+ resolution: {integrity: sha512-t2ODlkXBQyn7jkl6TNaw/MtVEVvIGelJDCG41Okq/KwUsJBwQ4XVZsHAVUkK4mBv3ewiAS3PGuUWuY2BoK4ZUw==}
+ peerDependencies:
+ '@types/react': '*'
+ '@types/react-dom': '*'
+ react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+ '@types/react-dom':
+ optional: true
+
+ '@radix-ui/react-hover-card@1.1.15':
+ resolution: {integrity: sha512-qgTkjNT1CfKMoP0rcasmlH2r1DAiYicWsDsufxl940sT2wHNEWWv6FMWIQXWhVdmC1d/HYfbhQx60KYyAtKxjg==}
+ peerDependencies:
+ '@types/react': '*'
+ '@types/react-dom': '*'
+ react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+ '@types/react-dom':
+ optional: true
+
'@radix-ui/react-id@1.1.0':
resolution: {integrity: sha512-EJUrI8yYh7WOjNOqpoJaf1jlFIH2LvtgAl+YcFqNCa+4hj64ZXmPkAKOFs/ukjz3byN6bdb/AVUqHkI8/uWWMA==}
peerDependencies:
@@ -449,6 +736,15 @@ packages:
'@types/react':
optional: true
+ '@radix-ui/react-id@1.1.1':
+ resolution: {integrity: sha512-kGkGegYIdQsOb4XjsfM97rXsiHaBwco+hFI66oO4s9LU+PLAC5oJ7khdOVFxkhsmlbpUqDAvXw11CluXP+jkHg==}
+ peerDependencies:
+ '@types/react': '*'
+ react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+
'@radix-ui/react-label@2.1.0':
resolution: {integrity: sha512-peLblDlFw/ngk3UWq0VnYaOLy6agTZZ+MUO/WhVfm14vJGML+xH4FAl2XQGLqdefjNb7ApRg6Yn7U42ZhmYXdw==}
peerDependencies:
@@ -462,6 +758,32 @@ packages:
'@types/react-dom':
optional: true
+ '@radix-ui/react-menu@2.1.16':
+ resolution: {integrity: sha512-72F2T+PLlphrqLcAotYPp0uJMr5SjP5SL01wfEspJbru5Zs5vQaSHb4VB3ZMJPimgHHCHG7gMOeOB9H3Hdmtxg==}
+ peerDependencies:
+ '@types/react': '*'
+ '@types/react-dom': '*'
+ react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+ '@types/react-dom':
+ optional: true
+
+ '@radix-ui/react-popover@1.1.15':
+ resolution: {integrity: sha512-kr0X2+6Yy/vJzLYJUPCZEc8SfQcf+1COFoAqauJm74umQhta9M7lNJHP7QQS3vkvcGLQUbWpMzwrXYwrYztHKA==}
+ peerDependencies:
+ '@types/react': '*'
+ '@types/react-dom': '*'
+ react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+ '@types/react-dom':
+ optional: true
+
'@radix-ui/react-popper@1.2.0':
resolution: {integrity: sha512-ZnRMshKF43aBxVWPWvbj21+7TQCvhuULWJ4gNIKYpRlQt5xGRhLx66tMp8pya2UkGHTSlhpXwmjqltDYHhw7Vg==}
peerDependencies:
@@ -475,6 +797,19 @@ packages:
'@types/react-dom':
optional: true
+ '@radix-ui/react-popper@1.2.8':
+ resolution: {integrity: sha512-0NJQ4LFFUuWkE7Oxf0htBKS6zLkkjBH+hM1uk7Ng705ReR8m/uelduy1DBo0PyBXPKVnBA6YBlU94MBGXrSBCw==}
+ peerDependencies:
+ '@types/react': '*'
+ '@types/react-dom': '*'
+ react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+ '@types/react-dom':
+ optional: true
+
'@radix-ui/react-portal@1.1.2':
resolution: {integrity: sha512-WeDYLGPxJb/5EGBoedyJbT0MpoULmwnIPMJMSldkuiMsBAv7N1cRdsTWZWht9vpPOiN3qyiGAtbK2is47/uMFg==}
peerDependencies:
@@ -488,6 +823,32 @@ packages:
'@types/react-dom':
optional: true
+ '@radix-ui/react-portal@1.1.9':
+ resolution: {integrity: sha512-bpIxvq03if6UNwXZ+HTK71JLh4APvnXntDc6XOX8UVq4XQOVl7lwok0AvIl+b8zgCw3fSaVTZMpAPPagXbKmHQ==}
+ peerDependencies:
+ '@types/react': '*'
+ '@types/react-dom': '*'
+ react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+ '@types/react-dom':
+ optional: true
+
+ '@radix-ui/react-presence@1.1.5':
+ resolution: {integrity: sha512-/jfEwNDdQVBCNvjkGit4h6pMOzq8bHkopq458dPt2lMjx+eBQUohZNG9A7DtO/O5ukSbxuaNGXMjHicgwy6rQQ==}
+ peerDependencies:
+ '@types/react': '*'
+ '@types/react-dom': '*'
+ react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+ '@types/react-dom':
+ optional: true
+
'@radix-ui/react-primitive@2.0.0':
resolution: {integrity: sha512-ZSpFm0/uHa8zTvKBDjLFWLo8dkr4MBsiDLz0g3gMUwqgLHz9rTaRRGYDgvZPtBJgYCBKXkS9fzmoySgr8CO6Cw==}
peerDependencies:
@@ -501,6 +862,32 @@ packages:
'@types/react-dom':
optional: true
+ '@radix-ui/react-primitive@2.1.3':
+ resolution: {integrity: sha512-m9gTwRkhy2lvCPe6QJp4d3G1TYEUHn/FzJUtq9MjH46an1wJU+GdoGC5VLof8RX8Ft/DlpshApkhswDLZzHIcQ==}
+ peerDependencies:
+ '@types/react': '*'
+ '@types/react-dom': '*'
+ react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+ '@types/react-dom':
+ optional: true
+
+ '@radix-ui/react-roving-focus@1.1.11':
+ resolution: {integrity: sha512-7A6S9jSgm/S+7MdtNDSb+IU859vQqJ/QAtcYQcfFC6W8RS4IxIZDldLR0xqCFZ6DCyrQLjLPsxtTNch5jVA4lA==}
+ peerDependencies:
+ '@types/react': '*'
+ '@types/react-dom': '*'
+ react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+ '@types/react-dom':
+ optional: true
+
'@radix-ui/react-select@2.1.2':
resolution: {integrity: sha512-rZJtWmorC7dFRi0owDmoijm6nSJH1tVw64QGiNIZ9PNLyBDtG+iAq+XGsya052At4BfarzY/Dhv9wrrUr6IMZA==}
peerDependencies:
@@ -523,6 +910,15 @@ packages:
'@types/react':
optional: true
+ '@radix-ui/react-slot@1.2.3':
+ resolution: {integrity: sha512-aeNmHnBxbi2St0au6VBVC7JXFlhLlOnvIIlePNniyUNAClzmtAUEY8/pBiK3iHjufOlwA+c20/8jngo7xcrg8A==}
+ peerDependencies:
+ '@types/react': '*'
+ react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+
'@radix-ui/react-use-callback-ref@1.1.0':
resolution: {integrity: sha512-CasTfvsy+frcFkbXtSJ2Zu9JHpN8TYKxkgJGWbjiZhFivxaeW7rMeZt7QELGVLaYVfFMsKHjb7Ak0nMEe+2Vfw==}
peerDependencies:
@@ -532,6 +928,15 @@ packages:
'@types/react':
optional: true
+ '@radix-ui/react-use-callback-ref@1.1.1':
+ resolution: {integrity: sha512-FkBMwD+qbGQeMu1cOHnuGB6x4yzPjho8ap5WtbEJ26umhgqVXbhekKUQO+hZEL1vU92a3wHwdp0HAcqAUF5iDg==}
+ peerDependencies:
+ '@types/react': '*'
+ react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+
'@radix-ui/react-use-controllable-state@1.1.0':
resolution: {integrity: sha512-MtfMVJiSr2NjzS0Aa90NPTnvTSg6C/JLCV7ma0W6+OMV78vd8OyRpID+Ng9LxzsPbLeuBnWBA1Nq30AtBIDChw==}
peerDependencies:
@@ -541,6 +946,24 @@ packages:
'@types/react':
optional: true
+ '@radix-ui/react-use-controllable-state@1.2.2':
+ resolution: {integrity: sha512-BjasUjixPFdS+NKkypcyyN5Pmg83Olst0+c6vGov0diwTEo6mgdqVR6hxcEgFuh4QrAs7Rc+9KuGJ9TVCj0Zzg==}
+ peerDependencies:
+ '@types/react': '*'
+ react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+
+ '@radix-ui/react-use-effect-event@0.0.2':
+ resolution: {integrity: sha512-Qp8WbZOBe+blgpuUT+lw2xheLP8q0oatc9UpmiemEICxGvFLYmHm9QowVZGHtJlGbS6A6yJ3iViad/2cVjnOiA==}
+ peerDependencies:
+ '@types/react': '*'
+ react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+
'@radix-ui/react-use-escape-keydown@1.1.0':
resolution: {integrity: sha512-L7vwWlR1kTTQ3oh7g1O0CBF3YCyyTj8NmhLR+phShpyA50HCfBFKVJTpshm9PzLiKmehsrQzTYTpX9HvmC9rhw==}
peerDependencies:
@@ -550,6 +973,15 @@ packages:
'@types/react':
optional: true
+ '@radix-ui/react-use-escape-keydown@1.1.1':
+ resolution: {integrity: sha512-Il0+boE7w/XebUHyBjroE+DbByORGR9KKmITzbR7MyQ4akpORYP/ZmbhAr0DG7RmmBqoOnZdy2QlvajJ2QA59g==}
+ peerDependencies:
+ '@types/react': '*'
+ react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+
'@radix-ui/react-use-layout-effect@1.1.0':
resolution: {integrity: sha512-+FPE0rOdziWSrH9athwI1R0HDVbWlEhd+FR+aSDk4uWGmSJ9Z54sdZVDQPZAinJhJXwfT+qnj969mCsT2gfm5w==}
peerDependencies:
@@ -559,6 +991,15 @@ packages:
'@types/react':
optional: true
+ '@radix-ui/react-use-layout-effect@1.1.1':
+ resolution: {integrity: sha512-RbJRS4UWQFkzHTTwVymMTUv8EqYhOp8dOOviLj2ugtTiXRaRQS7GLGxZTLL1jWhMeoSCf5zmcZkqTl9IiYfXcQ==}
+ peerDependencies:
+ '@types/react': '*'
+ react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+
'@radix-ui/react-use-previous@1.1.0':
resolution: {integrity: sha512-Z/e78qg2YFnnXcW88A4JmTtm4ADckLno6F7OXotmkQfeuCVaKuYzqAATPhVzl3delXE7CxIV8shofPn3jPc5Og==}
peerDependencies:
@@ -577,6 +1018,15 @@ packages:
'@types/react':
optional: true
+ '@radix-ui/react-use-rect@1.1.1':
+ resolution: {integrity: sha512-QTYuDesS0VtuHNNvMh+CjlKJ4LJickCMUAqjlE3+j8w+RlRpwyX3apEQKGFzbZGdo7XNG1tXa+bQqIE7HIXT2w==}
+ peerDependencies:
+ '@types/react': '*'
+ react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+
'@radix-ui/react-use-size@1.1.0':
resolution: {integrity: sha512-XW3/vWuIXHa+2Uwcc2ABSfcCledmXhhQPlGbfcRXbiUQI5Icjcg19BGCZVKKInYbvUCut/ufbbLLPFC5cbb1hw==}
peerDependencies:
@@ -586,6 +1036,15 @@ packages:
'@types/react':
optional: true
+ '@radix-ui/react-use-size@1.1.1':
+ resolution: {integrity: sha512-ewrXRDTAqAXlkl6t/fkXWNAhFX9I+CkKlw6zjEwk86RSPKwZr3xpBRso655aqYafwtnbpHLj6toFzmd6xdVptQ==}
+ peerDependencies:
+ '@types/react': '*'
+ react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+
'@radix-ui/react-visually-hidden@1.1.0':
resolution: {integrity: sha512-N8MDZqtgCgG5S3aV60INAB475osJousYpZ4cTJ2cFbMpdHS5Y6loLTH8LPtkj2QN0x93J30HT/M3qJXM0+lyeQ==}
peerDependencies:
@@ -602,12 +1061,190 @@ packages:
'@radix-ui/rect@1.1.0':
resolution: {integrity: sha512-A9+lCBZoaMJlVKcRBz2YByCG+Cp2t6nAnMnNba+XiWxnj6r4JUFqfsgwocMBZU9LPtdxC6wB56ySYpc7LQIoJg==}
+ '@radix-ui/rect@1.1.1':
+ resolution: {integrity: sha512-HPwpGIzkl28mWyZqG52jiqDJ12waP11Pa1lGoiyUkIEuMLBP0oeK/C89esbXrxsky5we7dfd8U58nm0SgAWpVw==}
+
'@rtsao/scc@1.1.0':
resolution: {integrity: sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g==}
'@rushstack/eslint-patch@1.10.4':
resolution: {integrity: sha512-WJgX9nzTqknM393q1QJDJmoW28kUfEnybeTfVNcNAPnIx210RXm2DiXiHzfNPJNIUUb1tJnz/l4QGtJ30PgWmA==}
+ '@schummar/icu-type-parser@1.21.5':
+ resolution: {integrity: sha512-bXHSaW5jRTmke9Vd0h5P7BtWZG9Znqb8gSDxZnxaGSJnGwPLDPfS+3g0BKzeWqzgZPsIVZkM7m2tbo18cm5HBw==}
+
+ '@smithy/abort-controller@4.2.3':
+ resolution: {integrity: sha512-xWL9Mf8b7tIFuAlpjKtRPnHrR8XVrwTj5NPYO/QwZPtc0SDLsPxb56V5tzi5yspSMytISHybifez+4jlrx0vkQ==}
+ engines: {node: '>=18.0.0'}
+
+ '@smithy/config-resolver@4.4.0':
+ resolution: {integrity: sha512-Kkmz3Mup2PGp/HNJxhCWkLNdlajJORLSjwkcfrj0E7nu6STAEdcMR1ir5P9/xOmncx8xXfru0fbUYLlZog/cFg==}
+ engines: {node: '>=18.0.0'}
+
+ '@smithy/core@3.17.1':
+ resolution: {integrity: sha512-V4Qc2CIb5McABYfaGiIYLTmo/vwNIK7WXI5aGveBd9UcdhbOMwcvIMxIw/DJj1S9QgOMa/7FBkarMdIC0EOTEQ==}
+ engines: {node: '>=18.0.0'}
+
+ '@smithy/credential-provider-imds@4.2.3':
+ resolution: {integrity: sha512-hA1MQ/WAHly4SYltJKitEsIDVsNmXcQfYBRv2e+q04fnqtAX5qXaybxy/fhUeAMCnQIdAjaGDb04fMHQefWRhw==}
+ engines: {node: '>=18.0.0'}
+
+ '@smithy/fetch-http-handler@5.3.4':
+ resolution: {integrity: sha512-bwigPylvivpRLCm+YK9I5wRIYjFESSVwl8JQ1vVx/XhCw0PtCi558NwTnT2DaVCl5pYlImGuQTSwMsZ+pIavRw==}
+ engines: {node: '>=18.0.0'}
+
+ '@smithy/hash-node@4.2.3':
+ resolution: {integrity: sha512-6+NOdZDbfuU6s1ISp3UOk5Rg953RJ2aBLNLLBEcamLjHAg1Po9Ha7QIB5ZWhdRUVuOUrT8BVFR+O2KIPmw027g==}
+ engines: {node: '>=18.0.0'}
+
+ '@smithy/invalid-dependency@4.2.3':
+ resolution: {integrity: sha512-Cc9W5DwDuebXEDMpOpl4iERo8I0KFjTnomK2RMdhhR87GwrSmUmwMxS4P5JdRf+LsjOdIqumcerwRgYMr/tZ9Q==}
+ engines: {node: '>=18.0.0'}
+
+ '@smithy/is-array-buffer@2.2.0':
+ resolution: {integrity: sha512-GGP3O9QFD24uGeAXYUjwSTXARoqpZykHadOmA8G5vfJPK0/DC67qa//0qvqrJzL1xc8WQWX7/yc7fwudjPHPhA==}
+ engines: {node: '>=14.0.0'}
+
+ '@smithy/is-array-buffer@4.2.0':
+ resolution: {integrity: sha512-DZZZBvC7sjcYh4MazJSGiWMI2L7E0oCiRHREDzIxi/M2LY79/21iXt6aPLHge82wi5LsuRF5A06Ds3+0mlh6CQ==}
+ engines: {node: '>=18.0.0'}
+
+ '@smithy/middleware-content-length@4.2.3':
+ resolution: {integrity: sha512-/atXLsT88GwKtfp5Jr0Ks1CSa4+lB+IgRnkNrrYP0h1wL4swHNb0YONEvTceNKNdZGJsye+W2HH8W7olbcPUeA==}
+ engines: {node: '>=18.0.0'}
+
+ '@smithy/middleware-endpoint@4.3.5':
+ resolution: {integrity: sha512-SIzKVTvEudFWJbxAaq7f2GvP3jh2FHDpIFI6/VAf4FOWGFZy0vnYMPSRj8PGYI8Hjt29mvmwSRgKuO3bK4ixDw==}
+ engines: {node: '>=18.0.0'}
+
+ '@smithy/middleware-retry@4.4.5':
+ resolution: {integrity: sha512-DCaXbQqcZ4tONMvvdz+zccDE21sLcbwWoNqzPLFlZaxt1lDtOE2tlVpRSwcTOJrjJSUThdgEYn7HrX5oLGlK9A==}
+ engines: {node: '>=18.0.0'}
+
+ '@smithy/middleware-serde@4.2.3':
+ resolution: {integrity: sha512-8g4NuUINpYccxiCXM5s1/V+uLtts8NcX4+sPEbvYQDZk4XoJfDpq5y2FQxfmUL89syoldpzNzA0R9nhzdtdKnQ==}
+ engines: {node: '>=18.0.0'}
+
+ '@smithy/middleware-stack@4.2.3':
+ resolution: {integrity: sha512-iGuOJkH71faPNgOj/gWuEGS6xvQashpLwWB1HjHq1lNNiVfbiJLpZVbhddPuDbx9l4Cgl0vPLq5ltRfSaHfspA==}
+ engines: {node: '>=18.0.0'}
+
+ '@smithy/node-config-provider@4.3.3':
+ resolution: {integrity: sha512-NzI1eBpBSViOav8NVy1fqOlSfkLgkUjUTlohUSgAEhHaFWA3XJiLditvavIP7OpvTjDp5u2LhtlBhkBlEisMwA==}
+ engines: {node: '>=18.0.0'}
+
+ '@smithy/node-http-handler@4.4.3':
+ resolution: {integrity: sha512-MAwltrDB0lZB/H6/2M5PIsISSwdI5yIh6DaBB9r0Flo9nx3y0dzl/qTMJPd7tJvPdsx6Ks/cwVzheGNYzXyNbQ==}
+ engines: {node: '>=18.0.0'}
+
+ '@smithy/property-provider@4.2.3':
+ resolution: {integrity: sha512-+1EZ+Y+njiefCohjlhyOcy1UNYjT+1PwGFHCxA/gYctjg3DQWAU19WigOXAco/Ql8hZokNehpzLd0/+3uCreqQ==}
+ engines: {node: '>=18.0.0'}
+
+ '@smithy/protocol-http@5.3.3':
+ resolution: {integrity: sha512-Mn7f/1aN2/jecywDcRDvWWWJF4uwg/A0XjFMJtj72DsgHTByfjRltSqcT9NyE9RTdBSN6X1RSXrhn/YWQl8xlw==}
+ engines: {node: '>=18.0.0'}
+
+ '@smithy/querystring-builder@4.2.3':
+ resolution: {integrity: sha512-LOVCGCmwMahYUM/P0YnU/AlDQFjcu+gWbFJooC417QRB/lDJlWSn8qmPSDp+s4YVAHOgtgbNG4sR+SxF/VOcJQ==}
+ engines: {node: '>=18.0.0'}
+
+ '@smithy/querystring-parser@4.2.3':
+ resolution: {integrity: sha512-cYlSNHcTAX/wc1rpblli3aUlLMGgKZ/Oqn8hhjFASXMCXjIqeuQBei0cnq2JR8t4RtU9FpG6uyl6PxyArTiwKA==}
+ engines: {node: '>=18.0.0'}
+
+ '@smithy/service-error-classification@4.2.3':
+ resolution: {integrity: sha512-NkxsAxFWwsPsQiwFG2MzJ/T7uIR6AQNh1SzcxSUnmmIqIQMlLRQDKhc17M7IYjiuBXhrQRjQTo3CxX+DobS93g==}
+ engines: {node: '>=18.0.0'}
+
+ '@smithy/shared-ini-file-loader@4.3.3':
+ resolution: {integrity: sha512-9f9Ixej0hFhroOK2TxZfUUDR13WVa8tQzhSzPDgXe5jGL3KmaM9s8XN7RQwqtEypI82q9KHnKS71CJ+q/1xLtQ==}
+ engines: {node: '>=18.0.0'}
+
+ '@smithy/signature-v4@5.3.3':
+ resolution: {integrity: sha512-CmSlUy+eEYbIEYN5N3vvQTRfqt0lJlQkaQUIf+oizu7BbDut0pozfDjBGecfcfWf7c62Yis4JIEgqQ/TCfodaA==}
+ engines: {node: '>=18.0.0'}
+
+ '@smithy/smithy-client@4.9.1':
+ resolution: {integrity: sha512-Ngb95ryR5A9xqvQFT5mAmYkCwbXvoLavLFwmi7zVg/IowFPCfiqRfkOKnbc/ZRL8ZKJ4f+Tp6kSu6wjDQb8L/g==}
+ engines: {node: '>=18.0.0'}
+
+ '@smithy/types@4.8.0':
+ resolution: {integrity: sha512-QpELEHLO8SsQVtqP+MkEgCYTFW0pleGozfs3cZ183ZBj9z3VC1CX1/wtFMK64p+5bhtZo41SeLK1rBRtd25nHQ==}
+ engines: {node: '>=18.0.0'}
+
+ '@smithy/url-parser@4.2.3':
+ resolution: {integrity: sha512-I066AigYvY3d9VlU3zG9XzZg1yT10aNqvCaBTw9EPgu5GrsEl1aUkcMvhkIXascYH1A8W0LQo3B1Kr1cJNcQEw==}
+ engines: {node: '>=18.0.0'}
+
+ '@smithy/util-base64@4.3.0':
+ resolution: {integrity: sha512-GkXZ59JfyxsIwNTWFnjmFEI8kZpRNIBfxKjv09+nkAWPt/4aGaEWMM04m4sxgNVWkbt2MdSvE3KF/PfX4nFedQ==}
+ engines: {node: '>=18.0.0'}
+
+ '@smithy/util-body-length-browser@4.2.0':
+ resolution: {integrity: sha512-Fkoh/I76szMKJnBXWPdFkQJl2r9SjPt3cMzLdOB6eJ4Pnpas8hVoWPYemX/peO0yrrvldgCUVJqOAjUrOLjbxg==}
+ engines: {node: '>=18.0.0'}
+
+ '@smithy/util-body-length-node@4.2.1':
+ resolution: {integrity: sha512-h53dz/pISVrVrfxV1iqXlx5pRg3V2YWFcSQyPyXZRrZoZj4R4DeWRDo1a7dd3CPTcFi3kE+98tuNyD2axyZReA==}
+ engines: {node: '>=18.0.0'}
+
+ '@smithy/util-buffer-from@2.2.0':
+ resolution: {integrity: sha512-IJdWBbTcMQ6DA0gdNhh/BwrLkDR+ADW5Kr1aZmd4k3DIF6ezMV4R2NIAmT08wQJ3yUK82thHWmC/TnK/wpMMIA==}
+ engines: {node: '>=14.0.0'}
+
+ '@smithy/util-buffer-from@4.2.0':
+ resolution: {integrity: sha512-kAY9hTKulTNevM2nlRtxAG2FQ3B2OR6QIrPY3zE5LqJy1oxzmgBGsHLWTcNhWXKchgA0WHW+mZkQrng/pgcCew==}
+ engines: {node: '>=18.0.0'}
+
+ '@smithy/util-config-provider@4.2.0':
+ resolution: {integrity: sha512-YEjpl6XJ36FTKmD+kRJJWYvrHeUvm5ykaUS5xK+6oXffQPHeEM4/nXlZPe+Wu0lsgRUcNZiliYNh/y7q9c2y6Q==}
+ engines: {node: '>=18.0.0'}
+
+ '@smithy/util-defaults-mode-browser@4.3.4':
+ resolution: {integrity: sha512-qI5PJSW52rnutos8Bln8nwQZRpyoSRN6k2ajyoUHNMUzmWqHnOJCnDELJuV6m5PML0VkHI+XcXzdB+6awiqYUw==}
+ engines: {node: '>=18.0.0'}
+
+ '@smithy/util-defaults-mode-node@4.2.6':
+ resolution: {integrity: sha512-c6M/ceBTm31YdcFpgfgQAJaw3KbaLuRKnAz91iMWFLSrgxRpYm03c3bu5cpYojNMfkV9arCUelelKA7XQT36SQ==}
+ engines: {node: '>=18.0.0'}
+
+ '@smithy/util-endpoints@3.2.3':
+ resolution: {integrity: sha512-aCfxUOVv0CzBIkU10TubdgKSx5uRvzH064kaiPEWfNIvKOtNpu642P4FP1hgOFkjQIkDObrfIDnKMKkeyrejvQ==}
+ engines: {node: '>=18.0.0'}
+
+ '@smithy/util-hex-encoding@4.2.0':
+ resolution: {integrity: sha512-CCQBwJIvXMLKxVbO88IukazJD9a4kQ9ZN7/UMGBjBcJYvatpWk+9g870El4cB8/EJxfe+k+y0GmR9CAzkF+Nbw==}
+ engines: {node: '>=18.0.0'}
+
+ '@smithy/util-middleware@4.2.3':
+ resolution: {integrity: sha512-v5ObKlSe8PWUHCqEiX2fy1gNv6goiw6E5I/PN2aXg3Fb/hse0xeaAnSpXDiWl7x6LamVKq7senB+m5LOYHUAHw==}
+ engines: {node: '>=18.0.0'}
+
+ '@smithy/util-retry@4.2.3':
+ resolution: {integrity: sha512-lLPWnakjC0q9z+OtiXk+9RPQiYPNAovt2IXD3CP4LkOnd9NpUsxOjMx1SnoUVB7Orb7fZp67cQMtTBKMFDvOGg==}
+ engines: {node: '>=18.0.0'}
+
+ '@smithy/util-stream@4.5.4':
+ resolution: {integrity: sha512-+qDxSkiErejw1BAIXUFBSfM5xh3arbz1MmxlbMCKanDDZtVEQ7PSKW9FQS0Vud1eI/kYn0oCTVKyNzRlq+9MUw==}
+ engines: {node: '>=18.0.0'}
+
+ '@smithy/util-uri-escape@4.2.0':
+ resolution: {integrity: sha512-igZpCKV9+E/Mzrpq6YacdTQ0qTiLm85gD6N/IrmyDvQFA4UnU3d5g3m8tMT/6zG/vVkWSU+VxeUyGonL62DuxA==}
+ engines: {node: '>=18.0.0'}
+
+ '@smithy/util-utf8@2.3.0':
+ resolution: {integrity: sha512-R8Rdn8Hy72KKcebgLiv8jQcQkXoLMOGGv5uI1/k0l+snqkOzQ1R0ChUBCxWMlBsFMekWjq0wRudIweFs7sKT5A==}
+ engines: {node: '>=14.0.0'}
+
+ '@smithy/util-utf8@4.2.0':
+ resolution: {integrity: sha512-zBPfuzoI8xyBtR2P6WQj63Rz8i3AmfAaJLuNG8dWsfvPe8lO4aCPYLn879mEgHndZH1zQ2oXmG8O1GGzzaoZiw==}
+ engines: {node: '>=18.0.0'}
+
+ '@smithy/uuid@1.1.0':
+ resolution: {integrity: sha512-4aUIteuyxtBUhVdiQqcDhKFitwfd9hqoSDYY2KRXiWtgoWJ9Bmise+KfEPDiVHWeJepvF8xJO9/9+WDIciMFFw==}
+ engines: {node: '>=18.0.0'}
+
'@swc/counter@0.1.3':
resolution: {integrity: sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ==}
@@ -620,6 +1257,9 @@ packages:
'@types/node@20.17.9':
resolution: {integrity: sha512-0JOXkRyLanfGPE2QRCwgxhzlBAvaRdCNMcvbd7jFfpmD4eEXll7LRwy5ymJmyeZqk7Nh7eD2LeUyQ68BbndmXw==}
+ '@types/nodemailer@7.0.3':
+ resolution: {integrity: sha512-fC8w49YQ868IuPWRXqPfLf+MuTRex5Z1qxMoG8rr70riqqbOp2F5xgOKE9fODEBPzpnvjkJXFgK6IL2xgMSTnA==}
+
'@types/prop-types@15.7.13':
resolution: {integrity: sha512-hCZTSvwbzWGvhqxp/RqVqwU999pBf2vp7hzIjiYOsl8wqOmUxkQ6ddw1cV3l8811+kdUFus/q4d1Y3E3SyEifA==}
@@ -798,6 +1438,9 @@ packages:
resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==}
engines: {node: '>=8'}
+ bowser@2.12.1:
+ resolution: {integrity: sha512-z4rE2Gxh7tvshQ4hluIT7XcFrgLIQaw9X3A+kTTRdovCz5PMukm/0QC/BKSYPj3omF5Qfypn9O/c5kgpmvYUCw==}
+
brace-expansion@1.1.11:
resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==}
@@ -910,6 +1553,9 @@ packages:
supports-color:
optional: true
+ decimal.js@10.6.0:
+ resolution: {integrity: sha512-YpgQiITW3JXGntzdUmyUR1V812Hn8T1YVXhCu+wO3OpS4eU9l4YdD3qjyiKdV6mvV29zapkMeD390UVEf2lkUg==}
+
deep-is@0.1.4:
resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==}
@@ -1119,6 +1765,10 @@ packages:
fast-levenshtein@2.0.6:
resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==}
+ fast-xml-parser@5.2.5:
+ resolution: {integrity: sha512-pfX9uG9Ki0yekDHx2SiuRIyFdyAr1kMIMitPvb0YBo8SUfKvia7w7FIyd/l6av85pFYRhZscS75MwMnbvY+hcQ==}
+ hasBin: true
+
fastq@1.17.1:
resolution: {integrity: sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==}
@@ -1148,6 +1798,20 @@ packages:
resolution: {integrity: sha512-Ld2g8rrAyMYFXBhEqMz8ZAHBi4J4uS1i/CxGMDnjyFWddMXLVcDp051DZfu+t7+ab7Wv6SMqpWmyFIj5UbfFvg==}
engines: {node: '>=14'}
+ framer-motion@12.23.24:
+ resolution: {integrity: sha512-HMi5HRoRCTou+3fb3h9oTLyJGBxHfW+HnNE25tAXOvVx/IvwMHK0cx7IR4a2ZU6sh3IX1Z+4ts32PcYBOqka8w==}
+ peerDependencies:
+ '@emotion/is-prop-valid': '*'
+ react: ^18.0.0 || ^19.0.0
+ react-dom: ^18.0.0 || ^19.0.0
+ peerDependenciesMeta:
+ '@emotion/is-prop-valid':
+ optional: true
+ react:
+ optional: true
+ react-dom:
+ optional: true
+
fs.realpath@1.0.0:
resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==}
@@ -1263,6 +1927,9 @@ packages:
resolution: {integrity: sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g==}
engines: {node: '>= 0.4'}
+ intl-messageformat@10.7.18:
+ resolution: {integrity: sha512-m3Ofv/X/tV8Y3tHXLohcuVuhWKo7BBq62cqY15etqmLxg2DZ34AGGgQDeR+SCta2+zICb1NX83af0GJmbQ1++g==}
+
invariant@2.2.4:
resolution: {integrity: sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==}
@@ -1489,6 +2156,26 @@ packages:
resolution: {integrity: sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==}
engines: {node: '>=16 || 14 >=14.17'}
+ motion-dom@12.23.23:
+ resolution: {integrity: sha512-n5yolOs0TQQBRUFImrRfs/+6X4p3Q4n1dUEqt/H58Vx7OW6RF+foWEgmTVDhIWJIMXOuNNL0apKH2S16en9eiA==}
+
+ motion-utils@12.23.6:
+ resolution: {integrity: sha512-eAWoPgr4eFEOFfg2WjIsMoqJTW6Z8MTUCgn/GZ3VRpClWBdnbjryiA3ZSNLyxCTmCQx4RmYX6jX1iWHbenUPNQ==}
+
+ motion@12.23.24:
+ resolution: {integrity: sha512-Rc5E7oe2YZ72N//S3QXGzbnXgqNrTESv8KKxABR20q2FLch9gHLo0JLyYo2hZ238bZ9Gx6cWhj9VO0IgwbMjCw==}
+ peerDependencies:
+ '@emotion/is-prop-valid': '*'
+ react: ^18.0.0 || ^19.0.0
+ react-dom: ^18.0.0 || ^19.0.0
+ peerDependenciesMeta:
+ '@emotion/is-prop-valid':
+ optional: true
+ react:
+ optional: true
+ react-dom:
+ optional: true
+
ms@2.1.3:
resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==}
@@ -1503,6 +2190,26 @@ packages:
natural-compare@1.4.0:
resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==}
+ negotiator@1.0.0:
+ resolution: {integrity: sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg==}
+ engines: {node: '>= 0.6'}
+
+ next-intl@4.4.0:
+ resolution: {integrity: sha512-QHqnP9V9Pe7Tn0PdVQ7u1Z8k9yCkW5SJKeRy2g5gxzhSt/C01y3B9qNxuj3Fsmup/yreIHe6osxU6sFa+9WIkQ==}
+ peerDependencies:
+ next: ^12.0.0 || ^13.0.0 || ^14.0.0 || ^15.0.0 || ^16.0.0
+ react: ^16.8.0 || ^17.0.0 || ^18.0.0 || >=19.0.0-rc <19.0.0 || ^19.0.0
+ typescript: ^5.0.0
+ peerDependenciesMeta:
+ typescript:
+ optional: true
+
+ next-themes@0.4.6:
+ resolution: {integrity: sha512-pZvgD5L0IEvX5/9GWyHMf3m8BKiVQwsCMHfoFosXtXBMnaS0ZnIJ9ST4b4NqLVKDEm8QBxoNNGNaBv2JNF6XNA==}
+ peerDependencies:
+ react: ^16.8 || ^17 || ^18 || ^19 || ^19.0.0-rc
+ react-dom: ^16.8 || ^17 || ^18 || ^19 || ^19.0.0-rc
+
next@15.0.3:
resolution: {integrity: sha512-ontCbCRKJUIoivAdGB34yCaOcPgYXr9AAkV/IwqFfWWTXEPUgLYkSkqBhIk9KK7gGmgjc64B+RdoeIDM13Irnw==}
engines: {node: ^18.18.0 || ^19.8.0 || >= 20.0.0}
@@ -1524,6 +2231,10 @@ packages:
sass:
optional: true
+ nodemailer@7.0.10:
+ resolution: {integrity: sha512-Us/Se1WtT0ylXgNFfyFSx4LElllVLJXQjWi2Xz17xWw7amDKO2MLtFnVp1WACy7GkVGs+oBlRopVNUzlrGSw1w==}
+ engines: {node: '>=6.0.0'}
+
normalize-path@3.0.0:
resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==}
engines: {node: '>=0.10.0'}
@@ -1680,6 +2391,10 @@ packages:
resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==}
engines: {node: '>=6'}
+ qss@3.0.0:
+ resolution: {integrity: sha512-ZHoCB3M/3Voev64zhLLUOKDtaEdJ/lymsJJ7R3KBusVZ2ovNiIB7XOq3Xh6V1a8O+Vho+g2B5YElq9zW7D8aQw==}
+ engines: {node: '>=4'}
+
queue-microtask@1.2.3:
resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==}
@@ -1707,6 +2422,16 @@ packages:
'@types/react':
optional: true
+ react-remove-scroll-bar@2.3.8:
+ resolution: {integrity: sha512-9r+yi9+mgU33AKcj6IbT9oRCO78WriSj6t/cF8DWBZJ9aOGPOTEDvdUDz1FwKim7QXWwmHqtdHnRJfhAxEG46Q==}
+ engines: {node: '>=10'}
+ peerDependencies:
+ '@types/react': '*'
+ react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+
react-remove-scroll@2.6.0:
resolution: {integrity: sha512-I2U4JVEsQenxDAKaVa3VZ/JeJZe0/2DxPWL8Tj8yLKctQJQiZM52pn/GWFpSp8dftjM3pSAHVJZscAnC/y+ySQ==}
engines: {node: '>=10'}
@@ -1717,6 +2442,16 @@ packages:
'@types/react':
optional: true
+ react-remove-scroll@2.7.1:
+ resolution: {integrity: sha512-HpMh8+oahmIdOuS5aFKKY6Pyog+FNaZV/XyJOq7b4YFwsFHe5yYfdbIalI4k3vU2nSDql7YskmUseHsRrJqIPA==}
+ engines: {node: '>=10'}
+ peerDependencies:
+ '@types/react': '*'
+ react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+
react-style-singleton@2.2.1:
resolution: {integrity: sha512-ZWj0fHEMyWkHzKYUr2Bs/4zU6XLmq9HsgBURm7g5pAVfyn49DgUiNgY2d4lXRlYSiCif9YBGpQleewkcqddc7g==}
engines: {node: '>=10'}
@@ -1727,6 +2462,16 @@ packages:
'@types/react':
optional: true
+ react-style-singleton@2.2.3:
+ resolution: {integrity: sha512-b6jSvxvVnyptAiLjbkWLE/lOnR4lfTtDAl+eUC7RZy+QQWc6wRzIV2CE6xBuMmDxc2qIihtDCZD5NPOFl7fRBQ==}
+ engines: {node: '>=10'}
+ peerDependencies:
+ '@types/react': '*'
+ react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+
react@19.0.0-rc-66855b96-20241106:
resolution: {integrity: sha512-klH7xkT71SxRCx4hb1hly5FJB21Hz0ACyxbXYAECEqssUjtJeFUAaI2U1DgJAzkGEnvEm3DkxuBchMC/9K4ipg==}
engines: {node: '>=0.10.0'}
@@ -1878,6 +2623,9 @@ packages:
resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==}
engines: {node: '>=8'}
+ strnum@2.1.1:
+ resolution: {integrity: sha512-7ZvoFTiCnGxBtDqJ//Cu6fWtZtc7Y3x+QOirG15wztbdngGSkht27o2pyGWrVy0b4WAy3jbKmnoK6g5VlVNUUw==}
+
styled-jsx@5.1.6:
resolution: {integrity: sha512-qSVyDTeMotdvQYoHWLNGwRFJHC+i+ZvdBRYosOFgC+Wg1vx4frN2/RG/NA7SYqqvKNLf39P2LSRA2pu6n0XYZA==}
engines: {node: '>= 12.0.0'}
@@ -1998,6 +2746,21 @@ packages:
'@types/react':
optional: true
+ use-callback-ref@1.3.3:
+ resolution: {integrity: sha512-jQL3lRnocaFtu3V00JToYz/4QkNWswxijDaCVNZRiRTO3HQDLsdu1ZtmIUvV4yPp+rvWm5j0y0TG/S61cuijTg==}
+ engines: {node: '>=10'}
+ peerDependencies:
+ '@types/react': '*'
+ react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+
+ use-intl@4.4.0:
+ resolution: {integrity: sha512-smFekJWtokDRBLC5/ZumlBREzdXOkw06+56Ifj2uRe9266Mk+yWQm2PcJO+EwlOE5sHIXHixOTzN6V8E0RGUbw==}
+ peerDependencies:
+ react: ^17.0.0 || ^18.0.0 || >=19.0.0-rc <19.0.0 || ^19.0.0
+
use-sidecar@1.1.2:
resolution: {integrity: sha512-epTbsLuzZ7lPClpz2TyryBfztm7m+28DlEv2ZCQ3MDr5ssiwyOwGH/e5F9CkfWjJ1t4clvI58yF822/GUkjjhw==}
engines: {node: '>=10'}
@@ -2008,6 +2771,16 @@ packages:
'@types/react':
optional: true
+ use-sidecar@1.1.3:
+ resolution: {integrity: sha512-Fedw0aZvkhynoPYlA5WXrMCAMm+nSWdZt6lzJQ7Ok8S6Q+VsHmHpRWndVRJ8Be0ZbkfPc5LRYH+5XrzXcEeLRQ==}
+ engines: {node: '>=10'}
+ peerDependencies:
+ '@types/react': '*'
+ react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+
util-deprecate@1.0.2:
resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==}
@@ -2062,6 +2835,389 @@ snapshots:
'@alloc/quick-lru@5.2.0': {}
+ '@aws-crypto/sha256-browser@5.2.0':
+ dependencies:
+ '@aws-crypto/sha256-js': 5.2.0
+ '@aws-crypto/supports-web-crypto': 5.2.0
+ '@aws-crypto/util': 5.2.0
+ '@aws-sdk/types': 3.914.0
+ '@aws-sdk/util-locate-window': 3.893.0
+ '@smithy/util-utf8': 2.3.0
+ tslib: 2.8.1
+
+ '@aws-crypto/sha256-js@5.2.0':
+ dependencies:
+ '@aws-crypto/util': 5.2.0
+ '@aws-sdk/types': 3.914.0
+ tslib: 2.8.1
+
+ '@aws-crypto/supports-web-crypto@5.2.0':
+ dependencies:
+ tslib: 2.8.1
+
+ '@aws-crypto/util@5.2.0':
+ dependencies:
+ '@aws-sdk/types': 3.914.0
+ '@smithy/util-utf8': 2.3.0
+ tslib: 2.8.1
+
+ '@aws-sdk/client-sesv2@3.917.0':
+ dependencies:
+ '@aws-crypto/sha256-browser': 5.2.0
+ '@aws-crypto/sha256-js': 5.2.0
+ '@aws-sdk/core': 3.916.0
+ '@aws-sdk/credential-provider-node': 3.917.0
+ '@aws-sdk/middleware-host-header': 3.914.0
+ '@aws-sdk/middleware-logger': 3.914.0
+ '@aws-sdk/middleware-recursion-detection': 3.914.0
+ '@aws-sdk/middleware-user-agent': 3.916.0
+ '@aws-sdk/region-config-resolver': 3.914.0
+ '@aws-sdk/signature-v4-multi-region': 3.916.0
+ '@aws-sdk/types': 3.914.0
+ '@aws-sdk/util-endpoints': 3.916.0
+ '@aws-sdk/util-user-agent-browser': 3.914.0
+ '@aws-sdk/util-user-agent-node': 3.916.0
+ '@smithy/config-resolver': 4.4.0
+ '@smithy/core': 3.17.1
+ '@smithy/fetch-http-handler': 5.3.4
+ '@smithy/hash-node': 4.2.3
+ '@smithy/invalid-dependency': 4.2.3
+ '@smithy/middleware-content-length': 4.2.3
+ '@smithy/middleware-endpoint': 4.3.5
+ '@smithy/middleware-retry': 4.4.5
+ '@smithy/middleware-serde': 4.2.3
+ '@smithy/middleware-stack': 4.2.3
+ '@smithy/node-config-provider': 4.3.3
+ '@smithy/node-http-handler': 4.4.3
+ '@smithy/protocol-http': 5.3.3
+ '@smithy/smithy-client': 4.9.1
+ '@smithy/types': 4.8.0
+ '@smithy/url-parser': 4.2.3
+ '@smithy/util-base64': 4.3.0
+ '@smithy/util-body-length-browser': 4.2.0
+ '@smithy/util-body-length-node': 4.2.1
+ '@smithy/util-defaults-mode-browser': 4.3.4
+ '@smithy/util-defaults-mode-node': 4.2.6
+ '@smithy/util-endpoints': 3.2.3
+ '@smithy/util-middleware': 4.2.3
+ '@smithy/util-retry': 4.2.3
+ '@smithy/util-utf8': 4.2.0
+ tslib: 2.8.1
+ transitivePeerDependencies:
+ - aws-crt
+
+ '@aws-sdk/client-sso@3.916.0':
+ dependencies:
+ '@aws-crypto/sha256-browser': 5.2.0
+ '@aws-crypto/sha256-js': 5.2.0
+ '@aws-sdk/core': 3.916.0
+ '@aws-sdk/middleware-host-header': 3.914.0
+ '@aws-sdk/middleware-logger': 3.914.0
+ '@aws-sdk/middleware-recursion-detection': 3.914.0
+ '@aws-sdk/middleware-user-agent': 3.916.0
+ '@aws-sdk/region-config-resolver': 3.914.0
+ '@aws-sdk/types': 3.914.0
+ '@aws-sdk/util-endpoints': 3.916.0
+ '@aws-sdk/util-user-agent-browser': 3.914.0
+ '@aws-sdk/util-user-agent-node': 3.916.0
+ '@smithy/config-resolver': 4.4.0
+ '@smithy/core': 3.17.1
+ '@smithy/fetch-http-handler': 5.3.4
+ '@smithy/hash-node': 4.2.3
+ '@smithy/invalid-dependency': 4.2.3
+ '@smithy/middleware-content-length': 4.2.3
+ '@smithy/middleware-endpoint': 4.3.5
+ '@smithy/middleware-retry': 4.4.5
+ '@smithy/middleware-serde': 4.2.3
+ '@smithy/middleware-stack': 4.2.3
+ '@smithy/node-config-provider': 4.3.3
+ '@smithy/node-http-handler': 4.4.3
+ '@smithy/protocol-http': 5.3.3
+ '@smithy/smithy-client': 4.9.1
+ '@smithy/types': 4.8.0
+ '@smithy/url-parser': 4.2.3
+ '@smithy/util-base64': 4.3.0
+ '@smithy/util-body-length-browser': 4.2.0
+ '@smithy/util-body-length-node': 4.2.1
+ '@smithy/util-defaults-mode-browser': 4.3.4
+ '@smithy/util-defaults-mode-node': 4.2.6
+ '@smithy/util-endpoints': 3.2.3
+ '@smithy/util-middleware': 4.2.3
+ '@smithy/util-retry': 4.2.3
+ '@smithy/util-utf8': 4.2.0
+ tslib: 2.8.1
+ transitivePeerDependencies:
+ - aws-crt
+
+ '@aws-sdk/core@3.916.0':
+ dependencies:
+ '@aws-sdk/types': 3.914.0
+ '@aws-sdk/xml-builder': 3.914.0
+ '@smithy/core': 3.17.1
+ '@smithy/node-config-provider': 4.3.3
+ '@smithy/property-provider': 4.2.3
+ '@smithy/protocol-http': 5.3.3
+ '@smithy/signature-v4': 5.3.3
+ '@smithy/smithy-client': 4.9.1
+ '@smithy/types': 4.8.0
+ '@smithy/util-base64': 4.3.0
+ '@smithy/util-middleware': 4.2.3
+ '@smithy/util-utf8': 4.2.0
+ tslib: 2.8.1
+
+ '@aws-sdk/credential-provider-env@3.916.0':
+ dependencies:
+ '@aws-sdk/core': 3.916.0
+ '@aws-sdk/types': 3.914.0
+ '@smithy/property-provider': 4.2.3
+ '@smithy/types': 4.8.0
+ tslib: 2.8.1
+
+ '@aws-sdk/credential-provider-http@3.916.0':
+ dependencies:
+ '@aws-sdk/core': 3.916.0
+ '@aws-sdk/types': 3.914.0
+ '@smithy/fetch-http-handler': 5.3.4
+ '@smithy/node-http-handler': 4.4.3
+ '@smithy/property-provider': 4.2.3
+ '@smithy/protocol-http': 5.3.3
+ '@smithy/smithy-client': 4.9.1
+ '@smithy/types': 4.8.0
+ '@smithy/util-stream': 4.5.4
+ tslib: 2.8.1
+
+ '@aws-sdk/credential-provider-ini@3.917.0':
+ dependencies:
+ '@aws-sdk/core': 3.916.0
+ '@aws-sdk/credential-provider-env': 3.916.0
+ '@aws-sdk/credential-provider-http': 3.916.0
+ '@aws-sdk/credential-provider-process': 3.916.0
+ '@aws-sdk/credential-provider-sso': 3.916.0
+ '@aws-sdk/credential-provider-web-identity': 3.917.0
+ '@aws-sdk/nested-clients': 3.916.0
+ '@aws-sdk/types': 3.914.0
+ '@smithy/credential-provider-imds': 4.2.3
+ '@smithy/property-provider': 4.2.3
+ '@smithy/shared-ini-file-loader': 4.3.3
+ '@smithy/types': 4.8.0
+ tslib: 2.8.1
+ transitivePeerDependencies:
+ - aws-crt
+
+ '@aws-sdk/credential-provider-node@3.917.0':
+ dependencies:
+ '@aws-sdk/credential-provider-env': 3.916.0
+ '@aws-sdk/credential-provider-http': 3.916.0
+ '@aws-sdk/credential-provider-ini': 3.917.0
+ '@aws-sdk/credential-provider-process': 3.916.0
+ '@aws-sdk/credential-provider-sso': 3.916.0
+ '@aws-sdk/credential-provider-web-identity': 3.917.0
+ '@aws-sdk/types': 3.914.0
+ '@smithy/credential-provider-imds': 4.2.3
+ '@smithy/property-provider': 4.2.3
+ '@smithy/shared-ini-file-loader': 4.3.3
+ '@smithy/types': 4.8.0
+ tslib: 2.8.1
+ transitivePeerDependencies:
+ - aws-crt
+
+ '@aws-sdk/credential-provider-process@3.916.0':
+ dependencies:
+ '@aws-sdk/core': 3.916.0
+ '@aws-sdk/types': 3.914.0
+ '@smithy/property-provider': 4.2.3
+ '@smithy/shared-ini-file-loader': 4.3.3
+ '@smithy/types': 4.8.0
+ tslib: 2.8.1
+
+ '@aws-sdk/credential-provider-sso@3.916.0':
+ dependencies:
+ '@aws-sdk/client-sso': 3.916.0
+ '@aws-sdk/core': 3.916.0
+ '@aws-sdk/token-providers': 3.916.0
+ '@aws-sdk/types': 3.914.0
+ '@smithy/property-provider': 4.2.3
+ '@smithy/shared-ini-file-loader': 4.3.3
+ '@smithy/types': 4.8.0
+ tslib: 2.8.1
+ transitivePeerDependencies:
+ - aws-crt
+
+ '@aws-sdk/credential-provider-web-identity@3.917.0':
+ dependencies:
+ '@aws-sdk/core': 3.916.0
+ '@aws-sdk/nested-clients': 3.916.0
+ '@aws-sdk/types': 3.914.0
+ '@smithy/property-provider': 4.2.3
+ '@smithy/shared-ini-file-loader': 4.3.3
+ '@smithy/types': 4.8.0
+ tslib: 2.8.1
+ transitivePeerDependencies:
+ - aws-crt
+
+ '@aws-sdk/middleware-host-header@3.914.0':
+ dependencies:
+ '@aws-sdk/types': 3.914.0
+ '@smithy/protocol-http': 5.3.3
+ '@smithy/types': 4.8.0
+ tslib: 2.8.1
+
+ '@aws-sdk/middleware-logger@3.914.0':
+ dependencies:
+ '@aws-sdk/types': 3.914.0
+ '@smithy/types': 4.8.0
+ tslib: 2.8.1
+
+ '@aws-sdk/middleware-recursion-detection@3.914.0':
+ dependencies:
+ '@aws-sdk/types': 3.914.0
+ '@aws/lambda-invoke-store': 0.0.1
+ '@smithy/protocol-http': 5.3.3
+ '@smithy/types': 4.8.0
+ tslib: 2.8.1
+
+ '@aws-sdk/middleware-sdk-s3@3.916.0':
+ dependencies:
+ '@aws-sdk/core': 3.916.0
+ '@aws-sdk/types': 3.914.0
+ '@aws-sdk/util-arn-parser': 3.893.0
+ '@smithy/core': 3.17.1
+ '@smithy/node-config-provider': 4.3.3
+ '@smithy/protocol-http': 5.3.3
+ '@smithy/signature-v4': 5.3.3
+ '@smithy/smithy-client': 4.9.1
+ '@smithy/types': 4.8.0
+ '@smithy/util-config-provider': 4.2.0
+ '@smithy/util-middleware': 4.2.3
+ '@smithy/util-stream': 4.5.4
+ '@smithy/util-utf8': 4.2.0
+ tslib: 2.8.1
+
+ '@aws-sdk/middleware-user-agent@3.916.0':
+ dependencies:
+ '@aws-sdk/core': 3.916.0
+ '@aws-sdk/types': 3.914.0
+ '@aws-sdk/util-endpoints': 3.916.0
+ '@smithy/core': 3.17.1
+ '@smithy/protocol-http': 5.3.3
+ '@smithy/types': 4.8.0
+ tslib: 2.8.1
+
+ '@aws-sdk/nested-clients@3.916.0':
+ dependencies:
+ '@aws-crypto/sha256-browser': 5.2.0
+ '@aws-crypto/sha256-js': 5.2.0
+ '@aws-sdk/core': 3.916.0
+ '@aws-sdk/middleware-host-header': 3.914.0
+ '@aws-sdk/middleware-logger': 3.914.0
+ '@aws-sdk/middleware-recursion-detection': 3.914.0
+ '@aws-sdk/middleware-user-agent': 3.916.0
+ '@aws-sdk/region-config-resolver': 3.914.0
+ '@aws-sdk/types': 3.914.0
+ '@aws-sdk/util-endpoints': 3.916.0
+ '@aws-sdk/util-user-agent-browser': 3.914.0
+ '@aws-sdk/util-user-agent-node': 3.916.0
+ '@smithy/config-resolver': 4.4.0
+ '@smithy/core': 3.17.1
+ '@smithy/fetch-http-handler': 5.3.4
+ '@smithy/hash-node': 4.2.3
+ '@smithy/invalid-dependency': 4.2.3
+ '@smithy/middleware-content-length': 4.2.3
+ '@smithy/middleware-endpoint': 4.3.5
+ '@smithy/middleware-retry': 4.4.5
+ '@smithy/middleware-serde': 4.2.3
+ '@smithy/middleware-stack': 4.2.3
+ '@smithy/node-config-provider': 4.3.3
+ '@smithy/node-http-handler': 4.4.3
+ '@smithy/protocol-http': 5.3.3
+ '@smithy/smithy-client': 4.9.1
+ '@smithy/types': 4.8.0
+ '@smithy/url-parser': 4.2.3
+ '@smithy/util-base64': 4.3.0
+ '@smithy/util-body-length-browser': 4.2.0
+ '@smithy/util-body-length-node': 4.2.1
+ '@smithy/util-defaults-mode-browser': 4.3.4
+ '@smithy/util-defaults-mode-node': 4.2.6
+ '@smithy/util-endpoints': 3.2.3
+ '@smithy/util-middleware': 4.2.3
+ '@smithy/util-retry': 4.2.3
+ '@smithy/util-utf8': 4.2.0
+ tslib: 2.8.1
+ transitivePeerDependencies:
+ - aws-crt
+
+ '@aws-sdk/region-config-resolver@3.914.0':
+ dependencies:
+ '@aws-sdk/types': 3.914.0
+ '@smithy/config-resolver': 4.4.0
+ '@smithy/types': 4.8.0
+ tslib: 2.8.1
+
+ '@aws-sdk/signature-v4-multi-region@3.916.0':
+ dependencies:
+ '@aws-sdk/middleware-sdk-s3': 3.916.0
+ '@aws-sdk/types': 3.914.0
+ '@smithy/protocol-http': 5.3.3
+ '@smithy/signature-v4': 5.3.3
+ '@smithy/types': 4.8.0
+ tslib: 2.8.1
+
+ '@aws-sdk/token-providers@3.916.0':
+ dependencies:
+ '@aws-sdk/core': 3.916.0
+ '@aws-sdk/nested-clients': 3.916.0
+ '@aws-sdk/types': 3.914.0
+ '@smithy/property-provider': 4.2.3
+ '@smithy/shared-ini-file-loader': 4.3.3
+ '@smithy/types': 4.8.0
+ tslib: 2.8.1
+ transitivePeerDependencies:
+ - aws-crt
+
+ '@aws-sdk/types@3.914.0':
+ dependencies:
+ '@smithy/types': 4.8.0
+ tslib: 2.8.1
+
+ '@aws-sdk/util-arn-parser@3.893.0':
+ dependencies:
+ tslib: 2.8.1
+
+ '@aws-sdk/util-endpoints@3.916.0':
+ dependencies:
+ '@aws-sdk/types': 3.914.0
+ '@smithy/types': 4.8.0
+ '@smithy/url-parser': 4.2.3
+ '@smithy/util-endpoints': 3.2.3
+ tslib: 2.8.1
+
+ '@aws-sdk/util-locate-window@3.893.0':
+ dependencies:
+ tslib: 2.8.1
+
+ '@aws-sdk/util-user-agent-browser@3.914.0':
+ dependencies:
+ '@aws-sdk/types': 3.914.0
+ '@smithy/types': 4.8.0
+ bowser: 2.12.1
+ tslib: 2.8.1
+
+ '@aws-sdk/util-user-agent-node@3.916.0':
+ dependencies:
+ '@aws-sdk/middleware-user-agent': 3.916.0
+ '@aws-sdk/types': 3.914.0
+ '@smithy/node-config-provider': 4.3.3
+ '@smithy/types': 4.8.0
+ tslib: 2.8.1
+
+ '@aws-sdk/xml-builder@3.914.0':
+ dependencies:
+ '@smithy/types': 4.8.0
+ fast-xml-parser: 5.2.5
+ tslib: 2.8.1
+
+ '@aws/lambda-invoke-store@0.0.1': {}
+
'@emnapi/runtime@1.3.1':
dependencies:
tslib: 2.8.1
@@ -2107,6 +3263,36 @@ snapshots:
'@floating-ui/utils@0.2.8': {}
+ '@formatjs/ecma402-abstract@2.3.6':
+ dependencies:
+ '@formatjs/fast-memoize': 2.2.7
+ '@formatjs/intl-localematcher': 0.6.2
+ decimal.js: 10.6.0
+ tslib: 2.8.1
+
+ '@formatjs/fast-memoize@2.2.7':
+ dependencies:
+ tslib: 2.8.1
+
+ '@formatjs/icu-messageformat-parser@2.11.4':
+ dependencies:
+ '@formatjs/ecma402-abstract': 2.3.6
+ '@formatjs/icu-skeleton-parser': 1.8.16
+ tslib: 2.8.1
+
+ '@formatjs/icu-skeleton-parser@1.8.16':
+ dependencies:
+ '@formatjs/ecma402-abstract': 2.3.6
+ tslib: 2.8.1
+
+ '@formatjs/intl-localematcher@0.5.10':
+ dependencies:
+ tslib: 2.8.1
+
+ '@formatjs/intl-localematcher@0.6.2':
+ dependencies:
+ tslib: 2.8.1
+
'@hookform/resolvers@3.9.1(react-hook-form@7.53.2(react@19.0.0-rc-66855b96-20241106))':
dependencies:
react-hook-form: 7.53.2(react@19.0.0-rc-66855b96-20241106)
@@ -2275,6 +3461,8 @@ snapshots:
'@radix-ui/primitive@1.1.0': {}
+ '@radix-ui/primitive@1.1.3': {}
+
'@radix-ui/react-arrow@1.1.0(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@19.0.0-rc-66855b96-20241106(react@19.0.0-rc-66855b96-20241106))(react@19.0.0-rc-66855b96-20241106)':
dependencies:
'@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@19.0.0-rc-66855b96-20241106(react@19.0.0-rc-66855b96-20241106))(react@19.0.0-rc-66855b96-20241106)
@@ -2284,6 +3472,15 @@ snapshots:
'@types/react': 18.3.12
'@types/react-dom': 18.3.1
+ '@radix-ui/react-arrow@1.1.7(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@19.0.0-rc-66855b96-20241106(react@19.0.0-rc-66855b96-20241106))(react@19.0.0-rc-66855b96-20241106)':
+ dependencies:
+ '@radix-ui/react-primitive': 2.1.3(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@19.0.0-rc-66855b96-20241106(react@19.0.0-rc-66855b96-20241106))(react@19.0.0-rc-66855b96-20241106)
+ react: 19.0.0-rc-66855b96-20241106
+ react-dom: 19.0.0-rc-66855b96-20241106(react@19.0.0-rc-66855b96-20241106)
+ optionalDependencies:
+ '@types/react': 18.3.12
+ '@types/react-dom': 18.3.1
+
'@radix-ui/react-collection@1.1.0(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@19.0.0-rc-66855b96-20241106(react@19.0.0-rc-66855b96-20241106))(react@19.0.0-rc-66855b96-20241106)':
dependencies:
'@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.12)(react@19.0.0-rc-66855b96-20241106)
@@ -2296,12 +3493,30 @@ snapshots:
'@types/react': 18.3.12
'@types/react-dom': 18.3.1
+ '@radix-ui/react-collection@1.1.7(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@19.0.0-rc-66855b96-20241106(react@19.0.0-rc-66855b96-20241106))(react@19.0.0-rc-66855b96-20241106)':
+ dependencies:
+ '@radix-ui/react-compose-refs': 1.1.2(@types/react@18.3.12)(react@19.0.0-rc-66855b96-20241106)
+ '@radix-ui/react-context': 1.1.2(@types/react@18.3.12)(react@19.0.0-rc-66855b96-20241106)
+ '@radix-ui/react-primitive': 2.1.3(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@19.0.0-rc-66855b96-20241106(react@19.0.0-rc-66855b96-20241106))(react@19.0.0-rc-66855b96-20241106)
+ '@radix-ui/react-slot': 1.2.3(@types/react@18.3.12)(react@19.0.0-rc-66855b96-20241106)
+ react: 19.0.0-rc-66855b96-20241106
+ react-dom: 19.0.0-rc-66855b96-20241106(react@19.0.0-rc-66855b96-20241106)
+ optionalDependencies:
+ '@types/react': 18.3.12
+ '@types/react-dom': 18.3.1
+
'@radix-ui/react-compose-refs@1.1.0(@types/react@18.3.12)(react@19.0.0-rc-66855b96-20241106)':
dependencies:
react: 19.0.0-rc-66855b96-20241106
optionalDependencies:
'@types/react': 18.3.12
+ '@radix-ui/react-compose-refs@1.1.2(@types/react@18.3.12)(react@19.0.0-rc-66855b96-20241106)':
+ dependencies:
+ react: 19.0.0-rc-66855b96-20241106
+ optionalDependencies:
+ '@types/react': 18.3.12
+
'@radix-ui/react-context@1.1.0(@types/react@18.3.12)(react@19.0.0-rc-66855b96-20241106)':
dependencies:
react: 19.0.0-rc-66855b96-20241106
@@ -2314,12 +3529,24 @@ snapshots:
optionalDependencies:
'@types/react': 18.3.12
+ '@radix-ui/react-context@1.1.2(@types/react@18.3.12)(react@19.0.0-rc-66855b96-20241106)':
+ dependencies:
+ react: 19.0.0-rc-66855b96-20241106
+ optionalDependencies:
+ '@types/react': 18.3.12
+
'@radix-ui/react-direction@1.1.0(@types/react@18.3.12)(react@19.0.0-rc-66855b96-20241106)':
dependencies:
react: 19.0.0-rc-66855b96-20241106
optionalDependencies:
'@types/react': 18.3.12
+ '@radix-ui/react-direction@1.1.1(@types/react@18.3.12)(react@19.0.0-rc-66855b96-20241106)':
+ dependencies:
+ react: 19.0.0-rc-66855b96-20241106
+ optionalDependencies:
+ '@types/react': 18.3.12
+
'@radix-ui/react-dismissable-layer@1.1.1(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@19.0.0-rc-66855b96-20241106(react@19.0.0-rc-66855b96-20241106))(react@19.0.0-rc-66855b96-20241106)':
dependencies:
'@radix-ui/primitive': 1.1.0
@@ -2333,12 +3560,46 @@ snapshots:
'@types/react': 18.3.12
'@types/react-dom': 18.3.1
+ '@radix-ui/react-dismissable-layer@1.1.11(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@19.0.0-rc-66855b96-20241106(react@19.0.0-rc-66855b96-20241106))(react@19.0.0-rc-66855b96-20241106)':
+ dependencies:
+ '@radix-ui/primitive': 1.1.3
+ '@radix-ui/react-compose-refs': 1.1.2(@types/react@18.3.12)(react@19.0.0-rc-66855b96-20241106)
+ '@radix-ui/react-primitive': 2.1.3(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@19.0.0-rc-66855b96-20241106(react@19.0.0-rc-66855b96-20241106))(react@19.0.0-rc-66855b96-20241106)
+ '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@18.3.12)(react@19.0.0-rc-66855b96-20241106)
+ '@radix-ui/react-use-escape-keydown': 1.1.1(@types/react@18.3.12)(react@19.0.0-rc-66855b96-20241106)
+ react: 19.0.0-rc-66855b96-20241106
+ react-dom: 19.0.0-rc-66855b96-20241106(react@19.0.0-rc-66855b96-20241106)
+ optionalDependencies:
+ '@types/react': 18.3.12
+ '@types/react-dom': 18.3.1
+
+ '@radix-ui/react-dropdown-menu@2.1.16(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@19.0.0-rc-66855b96-20241106(react@19.0.0-rc-66855b96-20241106))(react@19.0.0-rc-66855b96-20241106)':
+ dependencies:
+ '@radix-ui/primitive': 1.1.3
+ '@radix-ui/react-compose-refs': 1.1.2(@types/react@18.3.12)(react@19.0.0-rc-66855b96-20241106)
+ '@radix-ui/react-context': 1.1.2(@types/react@18.3.12)(react@19.0.0-rc-66855b96-20241106)
+ '@radix-ui/react-id': 1.1.1(@types/react@18.3.12)(react@19.0.0-rc-66855b96-20241106)
+ '@radix-ui/react-menu': 2.1.16(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@19.0.0-rc-66855b96-20241106(react@19.0.0-rc-66855b96-20241106))(react@19.0.0-rc-66855b96-20241106)
+ '@radix-ui/react-primitive': 2.1.3(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@19.0.0-rc-66855b96-20241106(react@19.0.0-rc-66855b96-20241106))(react@19.0.0-rc-66855b96-20241106)
+ '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@18.3.12)(react@19.0.0-rc-66855b96-20241106)
+ react: 19.0.0-rc-66855b96-20241106
+ react-dom: 19.0.0-rc-66855b96-20241106(react@19.0.0-rc-66855b96-20241106)
+ optionalDependencies:
+ '@types/react': 18.3.12
+ '@types/react-dom': 18.3.1
+
'@radix-ui/react-focus-guards@1.1.1(@types/react@18.3.12)(react@19.0.0-rc-66855b96-20241106)':
dependencies:
react: 19.0.0-rc-66855b96-20241106
optionalDependencies:
'@types/react': 18.3.12
+ '@radix-ui/react-focus-guards@1.1.3(@types/react@18.3.12)(react@19.0.0-rc-66855b96-20241106)':
+ dependencies:
+ react: 19.0.0-rc-66855b96-20241106
+ optionalDependencies:
+ '@types/react': 18.3.12
+
'@radix-ui/react-focus-scope@1.1.0(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@19.0.0-rc-66855b96-20241106(react@19.0.0-rc-66855b96-20241106))(react@19.0.0-rc-66855b96-20241106)':
dependencies:
'@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.12)(react@19.0.0-rc-66855b96-20241106)
@@ -2350,6 +3611,34 @@ snapshots:
'@types/react': 18.3.12
'@types/react-dom': 18.3.1
+ '@radix-ui/react-focus-scope@1.1.7(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@19.0.0-rc-66855b96-20241106(react@19.0.0-rc-66855b96-20241106))(react@19.0.0-rc-66855b96-20241106)':
+ dependencies:
+ '@radix-ui/react-compose-refs': 1.1.2(@types/react@18.3.12)(react@19.0.0-rc-66855b96-20241106)
+ '@radix-ui/react-primitive': 2.1.3(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@19.0.0-rc-66855b96-20241106(react@19.0.0-rc-66855b96-20241106))(react@19.0.0-rc-66855b96-20241106)
+ '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@18.3.12)(react@19.0.0-rc-66855b96-20241106)
+ react: 19.0.0-rc-66855b96-20241106
+ react-dom: 19.0.0-rc-66855b96-20241106(react@19.0.0-rc-66855b96-20241106)
+ optionalDependencies:
+ '@types/react': 18.3.12
+ '@types/react-dom': 18.3.1
+
+ '@radix-ui/react-hover-card@1.1.15(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@19.0.0-rc-66855b96-20241106(react@19.0.0-rc-66855b96-20241106))(react@19.0.0-rc-66855b96-20241106)':
+ dependencies:
+ '@radix-ui/primitive': 1.1.3
+ '@radix-ui/react-compose-refs': 1.1.2(@types/react@18.3.12)(react@19.0.0-rc-66855b96-20241106)
+ '@radix-ui/react-context': 1.1.2(@types/react@18.3.12)(react@19.0.0-rc-66855b96-20241106)
+ '@radix-ui/react-dismissable-layer': 1.1.11(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@19.0.0-rc-66855b96-20241106(react@19.0.0-rc-66855b96-20241106))(react@19.0.0-rc-66855b96-20241106)
+ '@radix-ui/react-popper': 1.2.8(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@19.0.0-rc-66855b96-20241106(react@19.0.0-rc-66855b96-20241106))(react@19.0.0-rc-66855b96-20241106)
+ '@radix-ui/react-portal': 1.1.9(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@19.0.0-rc-66855b96-20241106(react@19.0.0-rc-66855b96-20241106))(react@19.0.0-rc-66855b96-20241106)
+ '@radix-ui/react-presence': 1.1.5(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@19.0.0-rc-66855b96-20241106(react@19.0.0-rc-66855b96-20241106))(react@19.0.0-rc-66855b96-20241106)
+ '@radix-ui/react-primitive': 2.1.3(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@19.0.0-rc-66855b96-20241106(react@19.0.0-rc-66855b96-20241106))(react@19.0.0-rc-66855b96-20241106)
+ '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@18.3.12)(react@19.0.0-rc-66855b96-20241106)
+ react: 19.0.0-rc-66855b96-20241106
+ react-dom: 19.0.0-rc-66855b96-20241106(react@19.0.0-rc-66855b96-20241106)
+ optionalDependencies:
+ '@types/react': 18.3.12
+ '@types/react-dom': 18.3.1
+
'@radix-ui/react-id@1.1.0(@types/react@18.3.12)(react@19.0.0-rc-66855b96-20241106)':
dependencies:
'@radix-ui/react-use-layout-effect': 1.1.0(@types/react@18.3.12)(react@19.0.0-rc-66855b96-20241106)
@@ -2357,6 +3646,13 @@ snapshots:
optionalDependencies:
'@types/react': 18.3.12
+ '@radix-ui/react-id@1.1.1(@types/react@18.3.12)(react@19.0.0-rc-66855b96-20241106)':
+ dependencies:
+ '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@18.3.12)(react@19.0.0-rc-66855b96-20241106)
+ react: 19.0.0-rc-66855b96-20241106
+ optionalDependencies:
+ '@types/react': 18.3.12
+
'@radix-ui/react-label@2.1.0(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@19.0.0-rc-66855b96-20241106(react@19.0.0-rc-66855b96-20241106))(react@19.0.0-rc-66855b96-20241106)':
dependencies:
'@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@19.0.0-rc-66855b96-20241106(react@19.0.0-rc-66855b96-20241106))(react@19.0.0-rc-66855b96-20241106)
@@ -2366,6 +3662,55 @@ snapshots:
'@types/react': 18.3.12
'@types/react-dom': 18.3.1
+ '@radix-ui/react-menu@2.1.16(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@19.0.0-rc-66855b96-20241106(react@19.0.0-rc-66855b96-20241106))(react@19.0.0-rc-66855b96-20241106)':
+ dependencies:
+ '@radix-ui/primitive': 1.1.3
+ '@radix-ui/react-collection': 1.1.7(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@19.0.0-rc-66855b96-20241106(react@19.0.0-rc-66855b96-20241106))(react@19.0.0-rc-66855b96-20241106)
+ '@radix-ui/react-compose-refs': 1.1.2(@types/react@18.3.12)(react@19.0.0-rc-66855b96-20241106)
+ '@radix-ui/react-context': 1.1.2(@types/react@18.3.12)(react@19.0.0-rc-66855b96-20241106)
+ '@radix-ui/react-direction': 1.1.1(@types/react@18.3.12)(react@19.0.0-rc-66855b96-20241106)
+ '@radix-ui/react-dismissable-layer': 1.1.11(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@19.0.0-rc-66855b96-20241106(react@19.0.0-rc-66855b96-20241106))(react@19.0.0-rc-66855b96-20241106)
+ '@radix-ui/react-focus-guards': 1.1.3(@types/react@18.3.12)(react@19.0.0-rc-66855b96-20241106)
+ '@radix-ui/react-focus-scope': 1.1.7(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@19.0.0-rc-66855b96-20241106(react@19.0.0-rc-66855b96-20241106))(react@19.0.0-rc-66855b96-20241106)
+ '@radix-ui/react-id': 1.1.1(@types/react@18.3.12)(react@19.0.0-rc-66855b96-20241106)
+ '@radix-ui/react-popper': 1.2.8(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@19.0.0-rc-66855b96-20241106(react@19.0.0-rc-66855b96-20241106))(react@19.0.0-rc-66855b96-20241106)
+ '@radix-ui/react-portal': 1.1.9(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@19.0.0-rc-66855b96-20241106(react@19.0.0-rc-66855b96-20241106))(react@19.0.0-rc-66855b96-20241106)
+ '@radix-ui/react-presence': 1.1.5(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@19.0.0-rc-66855b96-20241106(react@19.0.0-rc-66855b96-20241106))(react@19.0.0-rc-66855b96-20241106)
+ '@radix-ui/react-primitive': 2.1.3(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@19.0.0-rc-66855b96-20241106(react@19.0.0-rc-66855b96-20241106))(react@19.0.0-rc-66855b96-20241106)
+ '@radix-ui/react-roving-focus': 1.1.11(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@19.0.0-rc-66855b96-20241106(react@19.0.0-rc-66855b96-20241106))(react@19.0.0-rc-66855b96-20241106)
+ '@radix-ui/react-slot': 1.2.3(@types/react@18.3.12)(react@19.0.0-rc-66855b96-20241106)
+ '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@18.3.12)(react@19.0.0-rc-66855b96-20241106)
+ aria-hidden: 1.2.4
+ react: 19.0.0-rc-66855b96-20241106
+ react-dom: 19.0.0-rc-66855b96-20241106(react@19.0.0-rc-66855b96-20241106)
+ react-remove-scroll: 2.7.1(@types/react@18.3.12)(react@19.0.0-rc-66855b96-20241106)
+ optionalDependencies:
+ '@types/react': 18.3.12
+ '@types/react-dom': 18.3.1
+
+ '@radix-ui/react-popover@1.1.15(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@19.0.0-rc-66855b96-20241106(react@19.0.0-rc-66855b96-20241106))(react@19.0.0-rc-66855b96-20241106)':
+ dependencies:
+ '@radix-ui/primitive': 1.1.3
+ '@radix-ui/react-compose-refs': 1.1.2(@types/react@18.3.12)(react@19.0.0-rc-66855b96-20241106)
+ '@radix-ui/react-context': 1.1.2(@types/react@18.3.12)(react@19.0.0-rc-66855b96-20241106)
+ '@radix-ui/react-dismissable-layer': 1.1.11(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@19.0.0-rc-66855b96-20241106(react@19.0.0-rc-66855b96-20241106))(react@19.0.0-rc-66855b96-20241106)
+ '@radix-ui/react-focus-guards': 1.1.3(@types/react@18.3.12)(react@19.0.0-rc-66855b96-20241106)
+ '@radix-ui/react-focus-scope': 1.1.7(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@19.0.0-rc-66855b96-20241106(react@19.0.0-rc-66855b96-20241106))(react@19.0.0-rc-66855b96-20241106)
+ '@radix-ui/react-id': 1.1.1(@types/react@18.3.12)(react@19.0.0-rc-66855b96-20241106)
+ '@radix-ui/react-popper': 1.2.8(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@19.0.0-rc-66855b96-20241106(react@19.0.0-rc-66855b96-20241106))(react@19.0.0-rc-66855b96-20241106)
+ '@radix-ui/react-portal': 1.1.9(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@19.0.0-rc-66855b96-20241106(react@19.0.0-rc-66855b96-20241106))(react@19.0.0-rc-66855b96-20241106)
+ '@radix-ui/react-presence': 1.1.5(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@19.0.0-rc-66855b96-20241106(react@19.0.0-rc-66855b96-20241106))(react@19.0.0-rc-66855b96-20241106)
+ '@radix-ui/react-primitive': 2.1.3(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@19.0.0-rc-66855b96-20241106(react@19.0.0-rc-66855b96-20241106))(react@19.0.0-rc-66855b96-20241106)
+ '@radix-ui/react-slot': 1.2.3(@types/react@18.3.12)(react@19.0.0-rc-66855b96-20241106)
+ '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@18.3.12)(react@19.0.0-rc-66855b96-20241106)
+ aria-hidden: 1.2.4
+ react: 19.0.0-rc-66855b96-20241106
+ react-dom: 19.0.0-rc-66855b96-20241106(react@19.0.0-rc-66855b96-20241106)
+ react-remove-scroll: 2.7.1(@types/react@18.3.12)(react@19.0.0-rc-66855b96-20241106)
+ optionalDependencies:
+ '@types/react': 18.3.12
+ '@types/react-dom': 18.3.1
+
'@radix-ui/react-popper@1.2.0(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@19.0.0-rc-66855b96-20241106(react@19.0.0-rc-66855b96-20241106))(react@19.0.0-rc-66855b96-20241106)':
dependencies:
'@floating-ui/react-dom': 2.1.2(react-dom@19.0.0-rc-66855b96-20241106(react@19.0.0-rc-66855b96-20241106))(react@19.0.0-rc-66855b96-20241106)
@@ -2384,6 +3729,24 @@ snapshots:
'@types/react': 18.3.12
'@types/react-dom': 18.3.1
+ '@radix-ui/react-popper@1.2.8(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@19.0.0-rc-66855b96-20241106(react@19.0.0-rc-66855b96-20241106))(react@19.0.0-rc-66855b96-20241106)':
+ dependencies:
+ '@floating-ui/react-dom': 2.1.2(react-dom@19.0.0-rc-66855b96-20241106(react@19.0.0-rc-66855b96-20241106))(react@19.0.0-rc-66855b96-20241106)
+ '@radix-ui/react-arrow': 1.1.7(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@19.0.0-rc-66855b96-20241106(react@19.0.0-rc-66855b96-20241106))(react@19.0.0-rc-66855b96-20241106)
+ '@radix-ui/react-compose-refs': 1.1.2(@types/react@18.3.12)(react@19.0.0-rc-66855b96-20241106)
+ '@radix-ui/react-context': 1.1.2(@types/react@18.3.12)(react@19.0.0-rc-66855b96-20241106)
+ '@radix-ui/react-primitive': 2.1.3(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@19.0.0-rc-66855b96-20241106(react@19.0.0-rc-66855b96-20241106))(react@19.0.0-rc-66855b96-20241106)
+ '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@18.3.12)(react@19.0.0-rc-66855b96-20241106)
+ '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@18.3.12)(react@19.0.0-rc-66855b96-20241106)
+ '@radix-ui/react-use-rect': 1.1.1(@types/react@18.3.12)(react@19.0.0-rc-66855b96-20241106)
+ '@radix-ui/react-use-size': 1.1.1(@types/react@18.3.12)(react@19.0.0-rc-66855b96-20241106)
+ '@radix-ui/rect': 1.1.1
+ react: 19.0.0-rc-66855b96-20241106
+ react-dom: 19.0.0-rc-66855b96-20241106(react@19.0.0-rc-66855b96-20241106)
+ optionalDependencies:
+ '@types/react': 18.3.12
+ '@types/react-dom': 18.3.1
+
'@radix-ui/react-portal@1.1.2(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@19.0.0-rc-66855b96-20241106(react@19.0.0-rc-66855b96-20241106))(react@19.0.0-rc-66855b96-20241106)':
dependencies:
'@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@19.0.0-rc-66855b96-20241106(react@19.0.0-rc-66855b96-20241106))(react@19.0.0-rc-66855b96-20241106)
@@ -2394,6 +3757,26 @@ snapshots:
'@types/react': 18.3.12
'@types/react-dom': 18.3.1
+ '@radix-ui/react-portal@1.1.9(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@19.0.0-rc-66855b96-20241106(react@19.0.0-rc-66855b96-20241106))(react@19.0.0-rc-66855b96-20241106)':
+ dependencies:
+ '@radix-ui/react-primitive': 2.1.3(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@19.0.0-rc-66855b96-20241106(react@19.0.0-rc-66855b96-20241106))(react@19.0.0-rc-66855b96-20241106)
+ '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@18.3.12)(react@19.0.0-rc-66855b96-20241106)
+ react: 19.0.0-rc-66855b96-20241106
+ react-dom: 19.0.0-rc-66855b96-20241106(react@19.0.0-rc-66855b96-20241106)
+ optionalDependencies:
+ '@types/react': 18.3.12
+ '@types/react-dom': 18.3.1
+
+ '@radix-ui/react-presence@1.1.5(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@19.0.0-rc-66855b96-20241106(react@19.0.0-rc-66855b96-20241106))(react@19.0.0-rc-66855b96-20241106)':
+ dependencies:
+ '@radix-ui/react-compose-refs': 1.1.2(@types/react@18.3.12)(react@19.0.0-rc-66855b96-20241106)
+ '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@18.3.12)(react@19.0.0-rc-66855b96-20241106)
+ react: 19.0.0-rc-66855b96-20241106
+ react-dom: 19.0.0-rc-66855b96-20241106(react@19.0.0-rc-66855b96-20241106)
+ optionalDependencies:
+ '@types/react': 18.3.12
+ '@types/react-dom': 18.3.1
+
'@radix-ui/react-primitive@2.0.0(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@19.0.0-rc-66855b96-20241106(react@19.0.0-rc-66855b96-20241106))(react@19.0.0-rc-66855b96-20241106)':
dependencies:
'@radix-ui/react-slot': 1.1.0(@types/react@18.3.12)(react@19.0.0-rc-66855b96-20241106)
@@ -2403,6 +3786,32 @@ snapshots:
'@types/react': 18.3.12
'@types/react-dom': 18.3.1
+ '@radix-ui/react-primitive@2.1.3(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@19.0.0-rc-66855b96-20241106(react@19.0.0-rc-66855b96-20241106))(react@19.0.0-rc-66855b96-20241106)':
+ dependencies:
+ '@radix-ui/react-slot': 1.2.3(@types/react@18.3.12)(react@19.0.0-rc-66855b96-20241106)
+ react: 19.0.0-rc-66855b96-20241106
+ react-dom: 19.0.0-rc-66855b96-20241106(react@19.0.0-rc-66855b96-20241106)
+ optionalDependencies:
+ '@types/react': 18.3.12
+ '@types/react-dom': 18.3.1
+
+ '@radix-ui/react-roving-focus@1.1.11(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@19.0.0-rc-66855b96-20241106(react@19.0.0-rc-66855b96-20241106))(react@19.0.0-rc-66855b96-20241106)':
+ dependencies:
+ '@radix-ui/primitive': 1.1.3
+ '@radix-ui/react-collection': 1.1.7(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@19.0.0-rc-66855b96-20241106(react@19.0.0-rc-66855b96-20241106))(react@19.0.0-rc-66855b96-20241106)
+ '@radix-ui/react-compose-refs': 1.1.2(@types/react@18.3.12)(react@19.0.0-rc-66855b96-20241106)
+ '@radix-ui/react-context': 1.1.2(@types/react@18.3.12)(react@19.0.0-rc-66855b96-20241106)
+ '@radix-ui/react-direction': 1.1.1(@types/react@18.3.12)(react@19.0.0-rc-66855b96-20241106)
+ '@radix-ui/react-id': 1.1.1(@types/react@18.3.12)(react@19.0.0-rc-66855b96-20241106)
+ '@radix-ui/react-primitive': 2.1.3(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@19.0.0-rc-66855b96-20241106(react@19.0.0-rc-66855b96-20241106))(react@19.0.0-rc-66855b96-20241106)
+ '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@18.3.12)(react@19.0.0-rc-66855b96-20241106)
+ '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@18.3.12)(react@19.0.0-rc-66855b96-20241106)
+ react: 19.0.0-rc-66855b96-20241106
+ react-dom: 19.0.0-rc-66855b96-20241106(react@19.0.0-rc-66855b96-20241106)
+ optionalDependencies:
+ '@types/react': 18.3.12
+ '@types/react-dom': 18.3.1
+
'@radix-ui/react-select@2.1.2(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@19.0.0-rc-66855b96-20241106(react@19.0.0-rc-66855b96-20241106))(react@19.0.0-rc-66855b96-20241106)':
dependencies:
'@radix-ui/number': 1.1.0
@@ -2439,12 +3848,25 @@ snapshots:
optionalDependencies:
'@types/react': 18.3.12
+ '@radix-ui/react-slot@1.2.3(@types/react@18.3.12)(react@19.0.0-rc-66855b96-20241106)':
+ dependencies:
+ '@radix-ui/react-compose-refs': 1.1.2(@types/react@18.3.12)(react@19.0.0-rc-66855b96-20241106)
+ react: 19.0.0-rc-66855b96-20241106
+ optionalDependencies:
+ '@types/react': 18.3.12
+
'@radix-ui/react-use-callback-ref@1.1.0(@types/react@18.3.12)(react@19.0.0-rc-66855b96-20241106)':
dependencies:
react: 19.0.0-rc-66855b96-20241106
optionalDependencies:
'@types/react': 18.3.12
+ '@radix-ui/react-use-callback-ref@1.1.1(@types/react@18.3.12)(react@19.0.0-rc-66855b96-20241106)':
+ dependencies:
+ react: 19.0.0-rc-66855b96-20241106
+ optionalDependencies:
+ '@types/react': 18.3.12
+
'@radix-ui/react-use-controllable-state@1.1.0(@types/react@18.3.12)(react@19.0.0-rc-66855b96-20241106)':
dependencies:
'@radix-ui/react-use-callback-ref': 1.1.0(@types/react@18.3.12)(react@19.0.0-rc-66855b96-20241106)
@@ -2452,6 +3874,21 @@ snapshots:
optionalDependencies:
'@types/react': 18.3.12
+ '@radix-ui/react-use-controllable-state@1.2.2(@types/react@18.3.12)(react@19.0.0-rc-66855b96-20241106)':
+ dependencies:
+ '@radix-ui/react-use-effect-event': 0.0.2(@types/react@18.3.12)(react@19.0.0-rc-66855b96-20241106)
+ '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@18.3.12)(react@19.0.0-rc-66855b96-20241106)
+ react: 19.0.0-rc-66855b96-20241106
+ optionalDependencies:
+ '@types/react': 18.3.12
+
+ '@radix-ui/react-use-effect-event@0.0.2(@types/react@18.3.12)(react@19.0.0-rc-66855b96-20241106)':
+ dependencies:
+ '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@18.3.12)(react@19.0.0-rc-66855b96-20241106)
+ react: 19.0.0-rc-66855b96-20241106
+ optionalDependencies:
+ '@types/react': 18.3.12
+
'@radix-ui/react-use-escape-keydown@1.1.0(@types/react@18.3.12)(react@19.0.0-rc-66855b96-20241106)':
dependencies:
'@radix-ui/react-use-callback-ref': 1.1.0(@types/react@18.3.12)(react@19.0.0-rc-66855b96-20241106)
@@ -2459,12 +3896,25 @@ snapshots:
optionalDependencies:
'@types/react': 18.3.12
+ '@radix-ui/react-use-escape-keydown@1.1.1(@types/react@18.3.12)(react@19.0.0-rc-66855b96-20241106)':
+ dependencies:
+ '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@18.3.12)(react@19.0.0-rc-66855b96-20241106)
+ react: 19.0.0-rc-66855b96-20241106
+ optionalDependencies:
+ '@types/react': 18.3.12
+
'@radix-ui/react-use-layout-effect@1.1.0(@types/react@18.3.12)(react@19.0.0-rc-66855b96-20241106)':
dependencies:
react: 19.0.0-rc-66855b96-20241106
optionalDependencies:
'@types/react': 18.3.12
+ '@radix-ui/react-use-layout-effect@1.1.1(@types/react@18.3.12)(react@19.0.0-rc-66855b96-20241106)':
+ dependencies:
+ react: 19.0.0-rc-66855b96-20241106
+ optionalDependencies:
+ '@types/react': 18.3.12
+
'@radix-ui/react-use-previous@1.1.0(@types/react@18.3.12)(react@19.0.0-rc-66855b96-20241106)':
dependencies:
react: 19.0.0-rc-66855b96-20241106
@@ -2478,6 +3928,13 @@ snapshots:
optionalDependencies:
'@types/react': 18.3.12
+ '@radix-ui/react-use-rect@1.1.1(@types/react@18.3.12)(react@19.0.0-rc-66855b96-20241106)':
+ dependencies:
+ '@radix-ui/rect': 1.1.1
+ react: 19.0.0-rc-66855b96-20241106
+ optionalDependencies:
+ '@types/react': 18.3.12
+
'@radix-ui/react-use-size@1.1.0(@types/react@18.3.12)(react@19.0.0-rc-66855b96-20241106)':
dependencies:
'@radix-ui/react-use-layout-effect': 1.1.0(@types/react@18.3.12)(react@19.0.0-rc-66855b96-20241106)
@@ -2485,6 +3942,13 @@ snapshots:
optionalDependencies:
'@types/react': 18.3.12
+ '@radix-ui/react-use-size@1.1.1(@types/react@18.3.12)(react@19.0.0-rc-66855b96-20241106)':
+ dependencies:
+ '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@18.3.12)(react@19.0.0-rc-66855b96-20241106)
+ react: 19.0.0-rc-66855b96-20241106
+ optionalDependencies:
+ '@types/react': 18.3.12
+
'@radix-ui/react-visually-hidden@1.1.0(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@19.0.0-rc-66855b96-20241106(react@19.0.0-rc-66855b96-20241106))(react@19.0.0-rc-66855b96-20241106)':
dependencies:
'@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@19.0.0-rc-66855b96-20241106(react@19.0.0-rc-66855b96-20241106))(react@19.0.0-rc-66855b96-20241106)
@@ -2496,10 +3960,288 @@ snapshots:
'@radix-ui/rect@1.1.0': {}
+ '@radix-ui/rect@1.1.1': {}
+
'@rtsao/scc@1.1.0': {}
'@rushstack/eslint-patch@1.10.4': {}
+ '@schummar/icu-type-parser@1.21.5': {}
+
+ '@smithy/abort-controller@4.2.3':
+ dependencies:
+ '@smithy/types': 4.8.0
+ tslib: 2.8.1
+
+ '@smithy/config-resolver@4.4.0':
+ dependencies:
+ '@smithy/node-config-provider': 4.3.3
+ '@smithy/types': 4.8.0
+ '@smithy/util-config-provider': 4.2.0
+ '@smithy/util-endpoints': 3.2.3
+ '@smithy/util-middleware': 4.2.3
+ tslib: 2.8.1
+
+ '@smithy/core@3.17.1':
+ dependencies:
+ '@smithy/middleware-serde': 4.2.3
+ '@smithy/protocol-http': 5.3.3
+ '@smithy/types': 4.8.0
+ '@smithy/util-base64': 4.3.0
+ '@smithy/util-body-length-browser': 4.2.0
+ '@smithy/util-middleware': 4.2.3
+ '@smithy/util-stream': 4.5.4
+ '@smithy/util-utf8': 4.2.0
+ '@smithy/uuid': 1.1.0
+ tslib: 2.8.1
+
+ '@smithy/credential-provider-imds@4.2.3':
+ dependencies:
+ '@smithy/node-config-provider': 4.3.3
+ '@smithy/property-provider': 4.2.3
+ '@smithy/types': 4.8.0
+ '@smithy/url-parser': 4.2.3
+ tslib: 2.8.1
+
+ '@smithy/fetch-http-handler@5.3.4':
+ dependencies:
+ '@smithy/protocol-http': 5.3.3
+ '@smithy/querystring-builder': 4.2.3
+ '@smithy/types': 4.8.0
+ '@smithy/util-base64': 4.3.0
+ tslib: 2.8.1
+
+ '@smithy/hash-node@4.2.3':
+ dependencies:
+ '@smithy/types': 4.8.0
+ '@smithy/util-buffer-from': 4.2.0
+ '@smithy/util-utf8': 4.2.0
+ tslib: 2.8.1
+
+ '@smithy/invalid-dependency@4.2.3':
+ dependencies:
+ '@smithy/types': 4.8.0
+ tslib: 2.8.1
+
+ '@smithy/is-array-buffer@2.2.0':
+ dependencies:
+ tslib: 2.8.1
+
+ '@smithy/is-array-buffer@4.2.0':
+ dependencies:
+ tslib: 2.8.1
+
+ '@smithy/middleware-content-length@4.2.3':
+ dependencies:
+ '@smithy/protocol-http': 5.3.3
+ '@smithy/types': 4.8.0
+ tslib: 2.8.1
+
+ '@smithy/middleware-endpoint@4.3.5':
+ dependencies:
+ '@smithy/core': 3.17.1
+ '@smithy/middleware-serde': 4.2.3
+ '@smithy/node-config-provider': 4.3.3
+ '@smithy/shared-ini-file-loader': 4.3.3
+ '@smithy/types': 4.8.0
+ '@smithy/url-parser': 4.2.3
+ '@smithy/util-middleware': 4.2.3
+ tslib: 2.8.1
+
+ '@smithy/middleware-retry@4.4.5':
+ dependencies:
+ '@smithy/node-config-provider': 4.3.3
+ '@smithy/protocol-http': 5.3.3
+ '@smithy/service-error-classification': 4.2.3
+ '@smithy/smithy-client': 4.9.1
+ '@smithy/types': 4.8.0
+ '@smithy/util-middleware': 4.2.3
+ '@smithy/util-retry': 4.2.3
+ '@smithy/uuid': 1.1.0
+ tslib: 2.8.1
+
+ '@smithy/middleware-serde@4.2.3':
+ dependencies:
+ '@smithy/protocol-http': 5.3.3
+ '@smithy/types': 4.8.0
+ tslib: 2.8.1
+
+ '@smithy/middleware-stack@4.2.3':
+ dependencies:
+ '@smithy/types': 4.8.0
+ tslib: 2.8.1
+
+ '@smithy/node-config-provider@4.3.3':
+ dependencies:
+ '@smithy/property-provider': 4.2.3
+ '@smithy/shared-ini-file-loader': 4.3.3
+ '@smithy/types': 4.8.0
+ tslib: 2.8.1
+
+ '@smithy/node-http-handler@4.4.3':
+ dependencies:
+ '@smithy/abort-controller': 4.2.3
+ '@smithy/protocol-http': 5.3.3
+ '@smithy/querystring-builder': 4.2.3
+ '@smithy/types': 4.8.0
+ tslib: 2.8.1
+
+ '@smithy/property-provider@4.2.3':
+ dependencies:
+ '@smithy/types': 4.8.0
+ tslib: 2.8.1
+
+ '@smithy/protocol-http@5.3.3':
+ dependencies:
+ '@smithy/types': 4.8.0
+ tslib: 2.8.1
+
+ '@smithy/querystring-builder@4.2.3':
+ dependencies:
+ '@smithy/types': 4.8.0
+ '@smithy/util-uri-escape': 4.2.0
+ tslib: 2.8.1
+
+ '@smithy/querystring-parser@4.2.3':
+ dependencies:
+ '@smithy/types': 4.8.0
+ tslib: 2.8.1
+
+ '@smithy/service-error-classification@4.2.3':
+ dependencies:
+ '@smithy/types': 4.8.0
+
+ '@smithy/shared-ini-file-loader@4.3.3':
+ dependencies:
+ '@smithy/types': 4.8.0
+ tslib: 2.8.1
+
+ '@smithy/signature-v4@5.3.3':
+ dependencies:
+ '@smithy/is-array-buffer': 4.2.0
+ '@smithy/protocol-http': 5.3.3
+ '@smithy/types': 4.8.0
+ '@smithy/util-hex-encoding': 4.2.0
+ '@smithy/util-middleware': 4.2.3
+ '@smithy/util-uri-escape': 4.2.0
+ '@smithy/util-utf8': 4.2.0
+ tslib: 2.8.1
+
+ '@smithy/smithy-client@4.9.1':
+ dependencies:
+ '@smithy/core': 3.17.1
+ '@smithy/middleware-endpoint': 4.3.5
+ '@smithy/middleware-stack': 4.2.3
+ '@smithy/protocol-http': 5.3.3
+ '@smithy/types': 4.8.0
+ '@smithy/util-stream': 4.5.4
+ tslib: 2.8.1
+
+ '@smithy/types@4.8.0':
+ dependencies:
+ tslib: 2.8.1
+
+ '@smithy/url-parser@4.2.3':
+ dependencies:
+ '@smithy/querystring-parser': 4.2.3
+ '@smithy/types': 4.8.0
+ tslib: 2.8.1
+
+ '@smithy/util-base64@4.3.0':
+ dependencies:
+ '@smithy/util-buffer-from': 4.2.0
+ '@smithy/util-utf8': 4.2.0
+ tslib: 2.8.1
+
+ '@smithy/util-body-length-browser@4.2.0':
+ dependencies:
+ tslib: 2.8.1
+
+ '@smithy/util-body-length-node@4.2.1':
+ dependencies:
+ tslib: 2.8.1
+
+ '@smithy/util-buffer-from@2.2.0':
+ dependencies:
+ '@smithy/is-array-buffer': 2.2.0
+ tslib: 2.8.1
+
+ '@smithy/util-buffer-from@4.2.0':
+ dependencies:
+ '@smithy/is-array-buffer': 4.2.0
+ tslib: 2.8.1
+
+ '@smithy/util-config-provider@4.2.0':
+ dependencies:
+ tslib: 2.8.1
+
+ '@smithy/util-defaults-mode-browser@4.3.4':
+ dependencies:
+ '@smithy/property-provider': 4.2.3
+ '@smithy/smithy-client': 4.9.1
+ '@smithy/types': 4.8.0
+ tslib: 2.8.1
+
+ '@smithy/util-defaults-mode-node@4.2.6':
+ dependencies:
+ '@smithy/config-resolver': 4.4.0
+ '@smithy/credential-provider-imds': 4.2.3
+ '@smithy/node-config-provider': 4.3.3
+ '@smithy/property-provider': 4.2.3
+ '@smithy/smithy-client': 4.9.1
+ '@smithy/types': 4.8.0
+ tslib: 2.8.1
+
+ '@smithy/util-endpoints@3.2.3':
+ dependencies:
+ '@smithy/node-config-provider': 4.3.3
+ '@smithy/types': 4.8.0
+ tslib: 2.8.1
+
+ '@smithy/util-hex-encoding@4.2.0':
+ dependencies:
+ tslib: 2.8.1
+
+ '@smithy/util-middleware@4.2.3':
+ dependencies:
+ '@smithy/types': 4.8.0
+ tslib: 2.8.1
+
+ '@smithy/util-retry@4.2.3':
+ dependencies:
+ '@smithy/service-error-classification': 4.2.3
+ '@smithy/types': 4.8.0
+ tslib: 2.8.1
+
+ '@smithy/util-stream@4.5.4':
+ dependencies:
+ '@smithy/fetch-http-handler': 5.3.4
+ '@smithy/node-http-handler': 4.4.3
+ '@smithy/types': 4.8.0
+ '@smithy/util-base64': 4.3.0
+ '@smithy/util-buffer-from': 4.2.0
+ '@smithy/util-hex-encoding': 4.2.0
+ '@smithy/util-utf8': 4.2.0
+ tslib: 2.8.1
+
+ '@smithy/util-uri-escape@4.2.0':
+ dependencies:
+ tslib: 2.8.1
+
+ '@smithy/util-utf8@2.3.0':
+ dependencies:
+ '@smithy/util-buffer-from': 2.2.0
+ tslib: 2.8.1
+
+ '@smithy/util-utf8@4.2.0':
+ dependencies:
+ '@smithy/util-buffer-from': 4.2.0
+ tslib: 2.8.1
+
+ '@smithy/uuid@1.1.0':
+ dependencies:
+ tslib: 2.8.1
+
'@swc/counter@0.1.3': {}
'@swc/helpers@0.5.13':
@@ -2512,6 +4254,13 @@ snapshots:
dependencies:
undici-types: 6.19.8
+ '@types/nodemailer@7.0.3':
+ dependencies:
+ '@aws-sdk/client-sesv2': 3.917.0
+ '@types/node': 20.17.9
+ transitivePeerDependencies:
+ - aws-crt
+
'@types/prop-types@15.7.13': {}
'@types/react-dom@18.3.1':
@@ -2726,6 +4475,8 @@ snapshots:
binary-extensions@2.3.0: {}
+ bowser@2.12.1: {}
+
brace-expansion@1.1.11:
dependencies:
balanced-match: 1.0.2
@@ -2842,6 +4593,8 @@ snapshots:
dependencies:
ms: 2.1.3
+ decimal.js@10.6.0: {}
+
deep-is@0.1.4: {}
define-data-property@1.1.4:
@@ -3203,6 +4956,10 @@ snapshots:
fast-levenshtein@2.0.6: {}
+ fast-xml-parser@5.2.5:
+ dependencies:
+ strnum: 2.1.1
+
fastq@1.17.1:
dependencies:
reusify: 1.0.4
@@ -3237,6 +4994,15 @@ snapshots:
cross-spawn: 7.0.6
signal-exit: 4.1.0
+ framer-motion@12.23.24(react-dom@19.0.0-rc-66855b96-20241106(react@19.0.0-rc-66855b96-20241106))(react@19.0.0-rc-66855b96-20241106):
+ dependencies:
+ motion-dom: 12.23.23
+ motion-utils: 12.23.6
+ tslib: 2.8.1
+ optionalDependencies:
+ react: 19.0.0-rc-66855b96-20241106
+ react-dom: 19.0.0-rc-66855b96-20241106(react@19.0.0-rc-66855b96-20241106)
+
fs.realpath@1.0.0: {}
fsevents@2.3.3:
@@ -3358,6 +5124,13 @@ snapshots:
hasown: 2.0.2
side-channel: 1.0.6
+ intl-messageformat@10.7.18:
+ dependencies:
+ '@formatjs/ecma402-abstract': 2.3.6
+ '@formatjs/fast-memoize': 2.2.7
+ '@formatjs/icu-messageformat-parser': 2.11.4
+ tslib: 2.8.1
+
invariant@2.2.4:
dependencies:
loose-envify: 1.4.0
@@ -3566,6 +5339,20 @@ snapshots:
minipass@7.1.2: {}
+ motion-dom@12.23.23:
+ dependencies:
+ motion-utils: 12.23.6
+
+ motion-utils@12.23.6: {}
+
+ motion@12.23.24(react-dom@19.0.0-rc-66855b96-20241106(react@19.0.0-rc-66855b96-20241106))(react@19.0.0-rc-66855b96-20241106):
+ dependencies:
+ framer-motion: 12.23.24(react-dom@19.0.0-rc-66855b96-20241106(react@19.0.0-rc-66855b96-20241106))(react@19.0.0-rc-66855b96-20241106)
+ tslib: 2.8.1
+ optionalDependencies:
+ react: 19.0.0-rc-66855b96-20241106
+ react-dom: 19.0.0-rc-66855b96-20241106(react@19.0.0-rc-66855b96-20241106)
+
ms@2.1.3: {}
mz@2.7.0:
@@ -3578,6 +5365,23 @@ snapshots:
natural-compare@1.4.0: {}
+ negotiator@1.0.0: {}
+
+ next-intl@4.4.0(next@15.0.3(react-dom@19.0.0-rc-66855b96-20241106(react@19.0.0-rc-66855b96-20241106))(react@19.0.0-rc-66855b96-20241106))(react@19.0.0-rc-66855b96-20241106)(typescript@5.7.2):
+ dependencies:
+ '@formatjs/intl-localematcher': 0.5.10
+ negotiator: 1.0.0
+ next: 15.0.3(react-dom@19.0.0-rc-66855b96-20241106(react@19.0.0-rc-66855b96-20241106))(react@19.0.0-rc-66855b96-20241106)
+ react: 19.0.0-rc-66855b96-20241106
+ use-intl: 4.4.0(react@19.0.0-rc-66855b96-20241106)
+ optionalDependencies:
+ typescript: 5.7.2
+
+ next-themes@0.4.6(react-dom@19.0.0-rc-66855b96-20241106(react@19.0.0-rc-66855b96-20241106))(react@19.0.0-rc-66855b96-20241106):
+ dependencies:
+ react: 19.0.0-rc-66855b96-20241106
+ react-dom: 19.0.0-rc-66855b96-20241106(react@19.0.0-rc-66855b96-20241106)
+
next@15.0.3(react-dom@19.0.0-rc-66855b96-20241106(react@19.0.0-rc-66855b96-20241106))(react@19.0.0-rc-66855b96-20241106):
dependencies:
'@next/env': 15.0.3
@@ -3603,6 +5407,8 @@ snapshots:
- '@babel/core'
- babel-plugin-macros
+ nodemailer@7.0.10: {}
+
normalize-path@3.0.0: {}
object-assign@4.1.1: {}
@@ -3748,6 +5554,8 @@ snapshots:
punycode@2.3.1: {}
+ qss@3.0.0: {}
+
queue-microtask@1.2.3: {}
react-dom@19.0.0-rc-66855b96-20241106(react@19.0.0-rc-66855b96-20241106):
@@ -3769,6 +5577,14 @@ snapshots:
optionalDependencies:
'@types/react': 18.3.12
+ react-remove-scroll-bar@2.3.8(@types/react@18.3.12)(react@19.0.0-rc-66855b96-20241106):
+ dependencies:
+ react: 19.0.0-rc-66855b96-20241106
+ react-style-singleton: 2.2.3(@types/react@18.3.12)(react@19.0.0-rc-66855b96-20241106)
+ tslib: 2.8.1
+ optionalDependencies:
+ '@types/react': 18.3.12
+
react-remove-scroll@2.6.0(@types/react@18.3.12)(react@19.0.0-rc-66855b96-20241106):
dependencies:
react: 19.0.0-rc-66855b96-20241106
@@ -3780,6 +5596,17 @@ snapshots:
optionalDependencies:
'@types/react': 18.3.12
+ react-remove-scroll@2.7.1(@types/react@18.3.12)(react@19.0.0-rc-66855b96-20241106):
+ dependencies:
+ react: 19.0.0-rc-66855b96-20241106
+ react-remove-scroll-bar: 2.3.8(@types/react@18.3.12)(react@19.0.0-rc-66855b96-20241106)
+ react-style-singleton: 2.2.3(@types/react@18.3.12)(react@19.0.0-rc-66855b96-20241106)
+ tslib: 2.8.1
+ use-callback-ref: 1.3.3(@types/react@18.3.12)(react@19.0.0-rc-66855b96-20241106)
+ use-sidecar: 1.1.3(@types/react@18.3.12)(react@19.0.0-rc-66855b96-20241106)
+ optionalDependencies:
+ '@types/react': 18.3.12
+
react-style-singleton@2.2.1(@types/react@18.3.12)(react@19.0.0-rc-66855b96-20241106):
dependencies:
get-nonce: 1.0.1
@@ -3789,6 +5616,14 @@ snapshots:
optionalDependencies:
'@types/react': 18.3.12
+ react-style-singleton@2.2.3(@types/react@18.3.12)(react@19.0.0-rc-66855b96-20241106):
+ dependencies:
+ get-nonce: 1.0.1
+ react: 19.0.0-rc-66855b96-20241106
+ tslib: 2.8.1
+ optionalDependencies:
+ '@types/react': 18.3.12
+
react@19.0.0-rc-66855b96-20241106: {}
read-cache@1.0.0:
@@ -3997,6 +5832,8 @@ snapshots:
strip-json-comments@3.1.1: {}
+ strnum@2.1.1: {}
+
styled-jsx@5.1.6(react@19.0.0-rc-66855b96-20241106):
dependencies:
client-only: 0.0.1
@@ -4143,6 +5980,20 @@ snapshots:
optionalDependencies:
'@types/react': 18.3.12
+ use-callback-ref@1.3.3(@types/react@18.3.12)(react@19.0.0-rc-66855b96-20241106):
+ dependencies:
+ react: 19.0.0-rc-66855b96-20241106
+ tslib: 2.8.1
+ optionalDependencies:
+ '@types/react': 18.3.12
+
+ use-intl@4.4.0(react@19.0.0-rc-66855b96-20241106):
+ dependencies:
+ '@formatjs/fast-memoize': 2.2.7
+ '@schummar/icu-type-parser': 1.21.5
+ intl-messageformat: 10.7.18
+ react: 19.0.0-rc-66855b96-20241106
+
use-sidecar@1.1.2(@types/react@18.3.12)(react@19.0.0-rc-66855b96-20241106):
dependencies:
detect-node-es: 1.1.0
@@ -4151,6 +6002,14 @@ snapshots:
optionalDependencies:
'@types/react': 18.3.12
+ use-sidecar@1.1.3(@types/react@18.3.12)(react@19.0.0-rc-66855b96-20241106):
+ dependencies:
+ detect-node-es: 1.1.0
+ react: 19.0.0-rc-66855b96-20241106
+ tslib: 2.8.1
+ optionalDependencies:
+ '@types/react': 18.3.12
+
util-deprecate@1.0.2: {}
which-boxed-primitive@1.0.2:
diff --git a/public/projects/ivory.png b/public/projects/ivory.png
new file mode 100644
index 0000000..cd43807
Binary files /dev/null and b/public/projects/ivory.png differ
diff --git a/public/projects/link-preview-vico.png b/public/projects/link-preview-vico.png
new file mode 100644
index 0000000..a9a422a
Binary files /dev/null and b/public/projects/link-preview-vico.png differ
diff --git a/public/projects/weather.png b/public/projects/weather.png
new file mode 100644
index 0000000..dc85984
Binary files /dev/null and b/public/projects/weather.png differ
diff --git a/src/app.config.ts b/src/app.config.ts
index 9cabe35..c877bfc 100644
--- a/src/app.config.ts
+++ b/src/app.config.ts
@@ -3,7 +3,7 @@ import { TechIcon } from "./components/setions/tech";
export type SocialIcon = "github" | "discord";
type AppConfig = {
- navigator: { label: string; path: string }[];
+ navigator: { label: string; path: string; isButton?: boolean }[];
socials: { name: string; icon: SocialIcon; link: string }[];
};
@@ -18,25 +18,21 @@ export const appConfig: AppConfig = {
path: "/projects",
},
{
- label: "Contact",
- path: "/contact/#",
+ label: "Work with me",
+ path: "/contact",
+ isButton: true,
},
],
socials: [
{
name: "discord",
icon: "discord",
- link: "https://discord.com",
+ link: "https://discord.gg/njGmuBQrfg",
},
{
name: "github",
icon: "github",
- link: "https://github.com",
- },
- {
- name: "github",
- icon: "github",
- link: "https://github.com",
+ link: "https://github.com/mr-shortman",
},
],
};
diff --git a/src/app/(ROUTING)/(LEGAL)/imprint/page.tsx b/src/app/(ROUTING)/(LEGAL)/imprint/page.tsx
new file mode 100644
index 0000000..9414bdd
--- /dev/null
+++ b/src/app/(ROUTING)/(LEGAL)/imprint/page.tsx
@@ -0,0 +1,58 @@
+import { getLocale, getTranslations } from "next-intl/server";
+import React from "react";
+
+export default async function Page() {
+ const t = await getTranslations("legal");
+ const locale = await getLocale();
+ return (
+
+ {t("legal.imprint.title")}
+ {/* Beispielstruktur – fülle mit deinen Daten */}
+ {locale === "de" && Angaben gemäß § 5 DDG
}
+
+ Pablo Kurzmann
+ Koppoldstr. 1
+ 86551 Aichach
+ {t("legal.imprint.germany")}
+
+
+ {t("legal.imprint.contact")}
+ E-Mail: pablo@shortman.me
+
+ {locale === "de" && (
+ <>
+
+ Verantwortlich für den Inhalt nach § 18 Abs. 2 MStV:
+ Pablo Kurzmann
+
+
+ Haftung für Inhalte
+
+ Die Inhalte dieser Seite wurden mit größter Sorgfalt erstellt. Für
+ die Richtigkeit, Vollständigkeit und Aktualität der Inhalte
+ übernehme ich jedoch keine Gewähr.
+
+
+
+ Haftung für Links
+
+ Diese Website enthält Links zu externen Websites Dritter, auf
+ deren Inhalte ich keinen Einfluss habe. Daher kann ich für diese
+ fremden Inhalte keine Gewähr übernehmen. Für die Inhalte der
+ verlinkten Seiten ist stets der jeweilige Anbieter oder Betreiber
+ verantwortlich.
+
+
+
+ Urheberrecht
+
+ Die durch den Seitenbetreiber erstellten Inhalte und Werke auf
+ dieser Website unterliegen dem deutschen Urheberrecht.
+
+
+ >
+ )}
+ {t("footer.copyright", { year: new Date().getFullYear() })}
+
+ );
+}
diff --git a/src/app/(ROUTING)/(LEGAL)/privacy/page.tsx b/src/app/(ROUTING)/(LEGAL)/privacy/page.tsx
new file mode 100644
index 0000000..cd913de
--- /dev/null
+++ b/src/app/(ROUTING)/(LEGAL)/privacy/page.tsx
@@ -0,0 +1,189 @@
+import { getLocale } from "next-intl/server";
+import React from "react";
+
+const PrivacyDE = (
+
+ Datenschutzerklärung
+
+
+
+ Diese Datenschutzerklärung informiert Sie über die Art, den Umfang und
+ Zweck der Verarbeitung personenbezogener Daten (nachfolgend kurz
+ „Daten“) im Rahmen meines Onlineangebots und der mit ihm verbundenen
+ Webseiten, Funktionen und Inhalte.
+
+
+
+
+ 1. Verantwortlicher
+ Pablo Kurzmann
+ Koppoldstr. 1
+ 86551 Aichach
+ Deutschland
+ E-Mail: pablo@shortman.me
+
+
+
+ 2. Erhobene Daten und Zweck
+
+ Beim Besuch dieser Website werden keine personenbezogenen Daten
+ gespeichert oder an Dritte übermittelt. Es werden keine Cookies,
+ Tracking- oder Analyse-Tools verwendet.
+
+
+ Personenbezogene Daten werden nur dann erhoben, wenn Sie das
+ Kontaktformular nutzen oder mir freiwillig eine E-Mail senden. In diesem
+ Fall werden die übermittelten Daten (z. B. Name, E-Mail-Adresse,
+ Nachricht) ausschließlich zur Bearbeitung Ihrer Anfrage verwendet.
+
+
+
+
+ 3. Rechtsgrundlage
+
+ Die Verarbeitung der Daten erfolgt gemäß Art. 6 Abs. 1 lit. b DSGVO,
+ soweit sie zur Durchführung vorvertraglicher Maßnahmen erforderlich ist,
+ oder gemäß Art. 6 Abs. 1 lit. f DSGVO auf Grundlage meines berechtigten
+ Interesses, Anfragen zu beantworten.
+
+
+
+
+ 4. E-Mail-Kommunikation
+
+ Der Versand und Empfang von E-Mails erfolgt über einen selbst
+ betriebenen Mailserver mit Standort in Deutschland. Die Server werden
+ nach aktuellen Sicherheitsstandards betrieben. Dennoch kann bei der
+ Übertragung von Daten im Internet (z. B. bei der Kommunikation per
+ E-Mail) keine vollständige Sicherheit gewährleistet werden.
+
+
+
+
+ 5. Speicherdauer
+
+ Anfragen, die per E-Mail oder über das Kontaktformular eingehen, werden
+ nur so lange gespeichert, wie sie zur Bearbeitung der Anfrage
+ erforderlich sind. Gesetzliche Aufbewahrungsfristen bleiben unberührt.
+
+
+
+
+ 6. Ihre Rechte
+
+ Sie haben das Recht auf Auskunft über die von mir verarbeiteten Daten
+ (Art. 15 DSGVO), auf Berichtigung (Art. 16 DSGVO), Löschung (Art. 17
+ DSGVO), Einschränkung der Verarbeitung (Art. 18 DSGVO), Widerspruch
+ (Art. 21 DSGVO) sowie auf Datenübertragbarkeit (Art. 20 DSGVO).
+
+
+ Außerdem haben Sie das Recht, sich bei einer Aufsichtsbehörde zu
+ beschweren, wenn Sie der Ansicht sind, dass die Verarbeitung Ihrer Daten
+ gegen die DSGVO verstößt (Art. 77 DSGVO).
+
+
+
+
+ 7. Änderungen dieser Erklärung
+
+ Ich behalte mir vor, diese Datenschutzerklärung bei Änderungen meiner
+ Website oder gesetzlichen Vorgaben anzupassen. Die jeweils aktuelle
+ Fassung finden Sie jederzeit auf dieser Seite.
+
+
+
+ Stand: Oktober 2025
+
+);
+
+const PrivacyEN = (
+
+ Privacy Policy
+
+
+
+ This privacy policy explains how personal data (“data”) is processed
+ when you use this website and its contact form.
+
+
+
+
+ 1. Controller
+ Pablo Kurzmann
+ Koppoldstr. 1
+ 86551 Aichach
+ Germany
+ Email: pablo@shortman.me
+
+
+
+ 2. Data collected and purpose
+
+ No personal data is stored or shared with third parties when visiting
+ this website. No cookies, analytics, or tracking tools are used.
+
+
+ Personal data is only collected when you use the contact form or send an
+ email voluntarily. The data you provide (e.g., name, email address,
+ message) is used solely to respond to your inquiry.
+
+
+
+
+ 3. Legal basis
+
+ Data processing is carried out pursuant to Art. 6 (1)(b) GDPR where it
+ is necessary for pre-contractual steps, or Art. 6 (1)(f) GDPR based on
+ the legitimate interest in responding to inquiries.
+
+
+
+
+ 4. Email communication
+
+ Emails are sent and received via a self-hosted mail server located in
+ Germany. The server is operated according to current security standards.
+ However, data transmission over the internet (e.g., by email) may have
+ security gaps.
+
+
+
+
+ 5. Storage period
+
+ Messages sent by email or contact form are stored only as long as
+ necessary to process your inquiry. Statutory retention periods remain
+ unaffected.
+
+
+
+
+ 6. Your rights
+
+ You have the right to access (Art. 15 GDPR), rectification (Art. 16),
+ erasure (Art. 17), restriction (Art. 18), objection (Art. 21), and data
+ portability (Art. 20 GDPR).
+
+
+ You may also lodge a complaint with a supervisory authority if you
+ believe your data is being processed unlawfully (Art. 77 GDPR).
+
+
+
+
+ 7. Changes
+
+ This privacy policy may be updated to reflect changes in legal
+ requirements or the website itself. The current version is always
+ available on this page.
+
+
+
+ Last updated: October 2025
+
+);
+
+export default async function Page() {
+ const locale = await getLocale();
+ return locale === "de" ? PrivacyDE : PrivacyEN;
+}
diff --git a/src/app/(__PAGES__)/contact/page.tsx b/src/app/(ROUTING)/contact/page.tsx
similarity index 100%
rename from src/app/(__PAGES__)/contact/page.tsx
rename to src/app/(ROUTING)/contact/page.tsx
diff --git a/src/app/(__PAGES__)/layout.tsx b/src/app/(ROUTING)/layout.tsx
similarity index 59%
rename from src/app/(__PAGES__)/layout.tsx
rename to src/app/(ROUTING)/layout.tsx
index 653c80c..8670192 100644
--- a/src/app/(__PAGES__)/layout.tsx
+++ b/src/app/(ROUTING)/layout.tsx
@@ -6,12 +6,7 @@ function Layout({ children }: { children: JSX.Element }) {
return (
-
- {children}
-
- {/*
*/}
-
-
+
{children}
);
diff --git a/src/app/(__PAGES__)/page.tsx b/src/app/(ROUTING)/page.tsx
similarity index 100%
rename from src/app/(__PAGES__)/page.tsx
rename to src/app/(ROUTING)/page.tsx
diff --git a/src/app/(__PAGES__)/projects/page.tsx b/src/app/(ROUTING)/projects/page.tsx
similarity index 100%
rename from src/app/(__PAGES__)/projects/page.tsx
rename to src/app/(ROUTING)/projects/page.tsx
diff --git a/src/app/globals.css b/src/app/globals.css
index 6d1b3f2..9a5ac4c 100644
--- a/src/app/globals.css
+++ b/src/app/globals.css
@@ -14,8 +14,8 @@ body {
--card-foreground: 240 10% 3.9%;
--popover: 0 0% 100%;
--popover-foreground: 240 10% 3.9%;
- --primary: 240 5.9% 10%;
- --primary-foreground: 0 0% 98%;
+ --primary: 142.1 76.2% 36.3%;
+ --primary-foreground: 355.7 100% 97.3%;
--secondary: 240 4.8% 95.9%;
--secondary-foreground: 240 5.9% 10%;
--muted: 240 4.8% 95.9%;
@@ -26,41 +26,59 @@ body {
--destructive-foreground: 0 0% 98%;
--border: 240 5.9% 90%;
--input: 240 5.9% 90%;
- --ring: 240 10% 3.9%;
- --chart-1: 12 76% 61%;
- --chart-2: 173 58% 39%;
- --chart-3: 197 37% 24%;
- --chart-4: 43 74% 66%;
- --chart-5: 27 87% 67%;
-
- /* Border Radius */
+ --ring: 142.1 76.2% 36.3%;
--radius: 0.5rem;
+ --chart-1: 142.1 76.2% 36.3%;
+ --chart-2: 240 4.8% 95.9%;
+ --chart-3: 240 4.8% 95.9%;
+ --chart-4: 240 4.8% 105.9%;
+ --chart-5: 142.1 76.2% 46.3%;
+
+ --sidebar-background: 0 0% 97%;
+ --sidebar-foreground: 240 10% 38%;
+ --sidebar-primary: 142 76% 33%;
+ --sidebar-primary-foreground: 356 100% 100%;
+ --sidebar-accent: 240 5% 75%;
+ --sidebar-accent-foreground: 240 5.9% 10%;
+ --sidebar-border: 240 6% 87%;
+ --sidebar-ring: 142 76% 33%;
}
+
.dark {
- --background: 20 8% 8%;
- --foreground: 0 0% 100%;
- --card: 240 10% 3.9%;
- --card-foreground: 0 0% 98%;
- --popover: 240 10% 3.9%;
- --popover-foreground: 0 0% 98%;
- --primary: 17 90% 59%;
- --primary-foreground: 0 0% 98%;
+ --background: 20 14.3% 4.1%;
+ --foreground: 0 0% 95%;
+ --card: 24 9.8% 10%;
+ --card-foreground: 0 0% 95%;
+ --popover: 0 0% 9%;
+ --popover-foreground: 0 0% 95%;
+ --primary: 142.1 70.6% 45.3%;
+ --primary-foreground: 144.9 80.4% 10%;
--secondary: 240 3.7% 15.9%;
--secondary-foreground: 0 0% 98%;
- --muted: 20 6% 10%;
- --muted-foreground: 0 5% 58%;
- --accent: 240 3.7% 15.9%;
+ --muted: 0 0% 15%;
+ --muted-foreground: 240 5% 64.9%;
+ --accent: 12 6.5% 15.1%;
--accent-foreground: 0 0% 98%;
--destructive: 0 62.8% 30.6%;
- --destructive-foreground: 0 0% 98%;
+ --destructive-foreground: 0 85.7% 97.3%;
--border: 240 3.7% 15.9%;
--input: 240 3.7% 15.9%;
- --ring: 240 4.9% 83.9%;
- --chart-1: 220 70% 50%;
- --chart-2: 160 60% 45%;
- --chart-3: 30 80% 55%;
- --chart-4: 280 65% 60%;
- --chart-5: 340 75% 55%;
+ --ring: 142.4 71.8% 29.2%;
+ --radius: 0.5rem;
+ --chart-1: 142.1 70.6% 45.3%;
+ --chart-2: 240 3.7% 15.9%;
+ --chart-3: 12 6.5% 15.1%;
+ --chart-4: 12 6.5% 25.1%;
+ --chart-5: 142.1 70.6% 55.3%;
+
+ --sidebar-background: 0 0% 0%;
+ --sidebar-foreground: 0 0% 50%;
+ --sidebar-primary: 142 71% 25%;
+ --sidebar-primary-foreground: 145 80% 100%;
+ --sidebar-accent: 12 7% 7%;
+ --sidebar-accent-foreground: 0 0% 98%;
+ --sidebar-border: 240 4% 8%;
+ --sidebar-ring: 142 72% 21%;
}
}
@@ -85,7 +103,7 @@ body {
@apply border-border;
}
body {
- @apply dark bg-background text-foreground;
+ @apply bg-background text-foreground;
}
html {
scroll-behavior: smooth;
@@ -152,3 +170,12 @@ nav.navbar::before {
background: var(--accent);
opacity: 0.2;
}
+
+@layer base {
+ * {
+ @apply border-border;
+ }
+ body {
+ @apply bg-background text-foreground;
+ }
+}
diff --git a/src/app/layout.tsx b/src/app/layout.tsx
index 08f3675..54eb90e 100644
--- a/src/app/layout.tsx
+++ b/src/app/layout.tsx
@@ -1,5 +1,8 @@
import type { Metadata } from "next";
import "./globals.css";
+import { NextIntlClientProvider } from "next-intl";
+import { getRequestConfig } from "next-intl/server";
+import { ThemeProvider } from "@/components/theme-provider";
export const metadata: Metadata = {
title: "Pablo Shortman",
@@ -12,9 +15,16 @@ export default function RootLayout({
children: React.ReactNode;
}>) {
return (
-
+
- {children}
+
+ {children}
+
);
diff --git a/src/components/contact-form.tsx b/src/components/contact-form.tsx
index 0835283..7d64fa7 100644
--- a/src/components/contact-form.tsx
+++ b/src/components/contact-form.tsx
@@ -24,26 +24,22 @@ import {
SelectValue,
} from "@/components/ui/select";
import { cn } from "@/lib/utils";
-
-const formSchema = z.object({
- name: z.string().min(2).max(50),
- email: z.string().email(),
- budget: z.string(),
- message: z.string().max(500),
-});
+import { useTranslations } from "next-intl";
+import { sendContactMail } from "@/lib/server-actions";
+import { contactFormSchema } from "@/lib/zod";
function ContactForm() {
// 1. Define your form.
- const form = useForm>({
- resolver: zodResolver(formSchema),
+ const form = useForm>({
+ resolver: zodResolver(contactFormSchema),
});
// 2. Define a submit handler.
- function onSubmit(values: z.infer) {
- // Do something with the form values.
- // ✅ This will be type-safe and validated.
- console.log(values);
+ async function onSubmit(values: z.infer) {
+ const result = await sendContactMail(values);
+ console.log(result);
}
+ const t = useTranslations();
return (
diff --git a/src/components/footer.tsx b/src/components/footer.tsx
index b78ebba..7c68335 100644
--- a/src/components/footer.tsx
+++ b/src/components/footer.tsx
@@ -1,32 +1,42 @@
import Link from "next/link";
import React from "react";
import { Button } from "./ui/button";
+import LocaleSwitcher from "./locale-switcher";
+import { getTranslations } from "next-intl/server";
+import { ModeToggle } from "./mode-toggle";
+
+export default async function Footer() {
+ const t = await getTranslations("legal.footer");
-function Footer() {
return (
-
-
- Copyright © {new Date().getFullYear()}. All rights reserved.
+
+
+
+ {t("copyright", {
+ year: new Date().getFullYear(),
+ })}
-
+
- Imprint
+ {t("imprint")}
- Privacy
+ {t("privacy")}
+
+
+
+
);
}
-
-export default Footer;
diff --git a/src/components/locale-switcher.tsx b/src/components/locale-switcher.tsx
new file mode 100644
index 0000000..b23c4da
--- /dev/null
+++ b/src/components/locale-switcher.tsx
@@ -0,0 +1,54 @@
+"use client";
+import React from "react";
+import { useLocale } from "next-intl";
+import { useRouter } from "next/navigation";
+import { cn } from "@/lib/utils";
+
+const LocaleButton = ({
+ locale,
+ handleLocaleChange,
+ active,
+}: {
+ locale: string;
+ active?: boolean;
+ handleLocaleChange: (value: string) => void;
+}) => {
+ return (
+ handleLocaleChange(locale)}
+ >
+ {locale}
+
+ );
+};
+
+export default function LocaleSwitcher() {
+ const locale = useLocale();
+
+ const router = useRouter();
+
+ const handleLocaleChange = (value: string) => {
+ const currentLocale = value;
+ document.cookie = `locale=${currentLocale}; path=/`;
+ router.refresh();
+ };
+ return (
+
+
+ {" / "}
+
+
+ );
+}
diff --git a/src/components/me-card.tsx b/src/components/me-card.tsx
index 935611b..3d6b8c2 100644
--- a/src/components/me-card.tsx
+++ b/src/components/me-card.tsx
@@ -3,6 +3,9 @@ import Image from "next/image";
import { cn } from "@/lib/utils";
import Link from "next/link";
import { socials } from "@/app.config";
+import { getTranslations } from "next-intl/server";
+import { GlowEffect } from "./ui/glow-effect";
+import { Tilt } from "./ui/tilt";
const icons = {
github: (props: any) => (
@@ -33,53 +36,68 @@ const icons = {
),
};
-function MeCard({ className }: { className?: string }) {
+export default async function MeCard({ className }: { className?: string }) {
+ const t = await getTranslations();
return (
-
-
-
-
-
+
+ {/*
*/}
+
+
+
+
+
+
-
-
Pablo
-
- Available for work
-
- {/*
+
+
+ {t("global.me.name")}
+
+
+ {t("global.me.work")}
+
+ {/*
{button.label}
*/}
-
- {socials.map((s, idx) => {
- const Icon = icons[s.icon];
- return (
-
-
-
- { }
-
-
-
- );
- })}
-
+
+ {socials.map((s, idx) => {
+ const Icon = icons[s.icon];
+ return (
+
+
+
+ { }
+
+
+
+ );
+ })}
+
+
+
+
+
+ {t("global.me.role")}
+
+
+
+
-
-
- Web Developer
-
-
-
-
+
);
}
-
-export default MeCard;
diff --git a/src/components/mode-toggle.tsx b/src/components/mode-toggle.tsx
new file mode 100644
index 0000000..1ca74d6
--- /dev/null
+++ b/src/components/mode-toggle.tsx
@@ -0,0 +1,40 @@
+"use client";
+
+import * as React from "react";
+import { Moon, Sun } from "lucide-react";
+import { useTheme } from "next-themes";
+
+import { Button } from "@/components/ui/button";
+import {
+ DropdownMenu,
+ DropdownMenuContent,
+ DropdownMenuItem,
+ DropdownMenuTrigger,
+} from "@/components/ui/dropdown-menu";
+
+export function ModeToggle() {
+ const { setTheme } = useTheme();
+
+ return (
+
+
+
+
+
+ Toggle theme
+
+
+
+ setTheme("light")}>
+ Light
+
+ setTheme("dark")}>
+ Dark
+
+ setTheme("system")}>
+ System
+
+
+
+ );
+}
diff --git a/src/components/navbar.tsx b/src/components/navbar.tsx
index 7b733a0..994715c 100644
--- a/src/components/navbar.tsx
+++ b/src/components/navbar.tsx
@@ -11,53 +11,70 @@ import {
BreadcrumbList,
BreadcrumbSeparator,
} from "@/components/ui/breadcrumb";
-import { appNavigator } from "@/app.config";
import { cn } from "@/lib/utils";
+import LocaleSwitcher from "./locale-switcher";
+import { useTranslations } from "next-intl";
-function Navbar() {
+export default function Navbar() {
const pathname = usePathname();
const isActive = (path: string) => pathname === path.replace(/\/#/g, "");
+ const t = useTranslations();
+ const navigation = [
+ {
+ label: t("global.navbar.home"),
+ path: "/",
+ },
+ {
+ label: t("global.navbar.projects"),
+ path: "/projects",
+ },
+ {
+ label: t("global.navbar.work"),
+ path: "/contact",
+ isButton: true,
+ },
+ ];
return (
-
-
-
- {process.env.NEXT_PUBLIC_EMAIL}
-
- {!isActive("/contact") && (
-
- Work with me
-
- )}
+
+
+
-
+
- {appNavigator.map(({ label, path }, idx) => (
-
-
-
- {label}
-
-
- {idx + 1 < appNavigator.length && (
-
- /
-
- )}
-
- ))}
+ {navigation.map(({ label, path, isButton }, idx) => {
+ return (
+
+
+ {isButton ? (
+
+ {label}
+
+ ) : (
+
+ {label}
+
+ )}
+
+ {idx + 1 < navigation.length && (
+
+ /
+
+ )}
+
+ );
+ })}
);
}
-
-export default Navbar;
diff --git a/src/components/setions/contact.tsx b/src/components/setions/contact.tsx
index 6b55bb4..6ff19f9 100644
--- a/src/components/setions/contact.tsx
+++ b/src/components/setions/contact.tsx
@@ -2,19 +2,23 @@ import React from "react";
import MeCard from "../me-card";
import Heading from "../heading";
import ContactForm from "../contact-form";
+import { getTranslations } from "next-intl/server";
-function Contact({ withoutMeCard }: { withoutMeCard?: boolean }) {
+export default async function Contact({
+ withoutMeCard,
+}: {
+ withoutMeCard?: boolean;
+}) {
+ const t = await getTranslations();
return (
{!withoutMeCard && (
)}
-
+
);
}
-
-export default Contact;
diff --git a/src/components/setions/hero.tsx b/src/components/setions/hero.tsx
index a06d365..f179b70 100644
--- a/src/components/setions/hero.tsx
+++ b/src/components/setions/hero.tsx
@@ -1,59 +1,55 @@
-"use client";
-
-import { cn } from "@/lib/utils";
-import Image from "next/image";
import React from "react";
+import { LinkPreview } from "../ui/link-preview";
+import { getTranslations } from "next-intl/server";
+import { cn } from "@/lib/utils";
-function Hero() {
- const [hovered, setHovered] = React.useState("");
-
- const textHover =
- "hover:text-primary hover:scale-105 transition-all duration-300";
+export default async function Hero() {
+ const t = await getTranslations();
+ const items = [
+ {
+ label: t("home.hero.slot1.label"),
+ link: t("home.hero.slot1.link"),
+ image: t("home.hero.slot1.image"),
+ },
+ {
+ label: t("home.hero.slot2.label"),
+ link: t("home.hero.slot2.link"),
+ image: t("home.hero.slot2.image"),
+ },
+ {
+ label: t("home.hero.slot3.label"),
+ link: t("home.hero.slot3.link"),
+ image: t("home.hero.slot3.image"),
+ },
+ ];
return (
- <>
-
-
setHovered("text-1")}
- onMouseLeave={() => setHovered("")}
- >
- Timeless
-
-
-
-
-
-
setHovered("text-2")}
- onMouseLeave={() => setHovered("")}
- >
- Creative
-
-
-
setHovered("text-3")}
- onMouseLeave={() => setHovered("")}
- className={cn(
- `absolute left-4 lg:left-0 top-full ${textHover}`,
- hovered.length ? "text-foreground" : "text-primary",
- hovered === "text-2" && "text-background blur-sm"
- )}
- >
- Unique
-
-
- >
+
+
+ {items[0].label}
+
+
+ {items[1].label}
+
+
+
+ {items[2].label}
+
+ {/*
+ {items[2].label}
+ */}
+
);
}
-export default Hero;
+// export default Hero;
diff --git a/src/components/setions/projects.tsx b/src/components/setions/projects.tsx
index 6a434f3..5ab6f5c 100644
--- a/src/components/setions/projects.tsx
+++ b/src/components/setions/projects.tsx
@@ -1,25 +1,21 @@
-import { Project, projects } from "@/constants";
import { ArrowRight } from "lucide-react";
import Image from "next/image";
import Link from "next/link";
import React from "react";
import MeCard from "../me-card";
import Heading from "../heading";
+import { getTranslations } from "next-intl/server";
+import { GlowEffect } from "../ui/glow-effect";
-const ProjectCard = (p: Project) => (
+const ProjectCard = (p: any) => (
-
+
-
+
{`[ ${p.year} ]`}
-
{p.name}
+
{p.title}
{p.description}
@@ -30,26 +26,34 @@ const ProjectCard = (p: Project) => (
);
-function Projects() {
+export default async function Projects() {
+ const t = await getTranslations();
+ const projects = Array.from({ length: 2 }).map((_, idx) => ({
+ title: t(`projects.${idx}.title` as any),
+ description: t(`projects.${idx}.description` as any),
+ year: t(`projects.${idx}.year` as any),
+ image: t(`projects.${idx}.image` as any),
+ link: t(`projects.${idx}.link.live` as any),
+ }));
return (
-
-
-
-
-
- {projects.map((p) => (
-
-
-
- ))}
-
+ <>
+
+
+
+
+
+ {projects.map((p, idx) => (
+
+
+
+ ))}
+
+
-
+ >
);
}
-
-export default Projects;
diff --git a/src/components/setions/tech.tsx b/src/components/setions/tech.tsx
index 8b0a997..e7295b0 100644
--- a/src/components/setions/tech.tsx
+++ b/src/components/setions/tech.tsx
@@ -1,8 +1,29 @@
+import { getTranslations } from "next-intl/server";
import React from "react";
export type TechIcon = "ts" | "next" | "react" | "tailwind" | "PostgreSQL";
const tech: { label: string; Logo: (props: any) => JSX.Element }[] = [
+ {
+ label: "Webflow",
+ Logo: (props: any) => (
+
+
+
+ ),
+ },
{
label: "Tailwind CSS",
Logo: (props: any) => (
@@ -211,18 +232,20 @@ const tech: { label: string; Logo: (props: any) => JSX.Element }[] = [
},
];
-function Tech() {
+export default async function Tech() {
+ const t = await getTranslations();
return (
- most liked{" "}
- technologies and{" "}
- tools
+ {t("home.tech.text")}{" "}
+ {t("home.tech.technologies")} {" "}
+ {t("global.and")}{" "}
+ {t("home.tech.tools")}
{tech.map(({ Logo, label }, idx) => (
@@ -233,5 +256,3 @@ function Tech() {
);
}
-
-export default Tech;
diff --git a/src/components/theme-provider.tsx b/src/components/theme-provider.tsx
new file mode 100644
index 0000000..189a2b1
--- /dev/null
+++ b/src/components/theme-provider.tsx
@@ -0,0 +1,11 @@
+"use client";
+
+import * as React from "react";
+import { ThemeProvider as NextThemesProvider } from "next-themes";
+
+export function ThemeProvider({
+ children,
+ ...props
+}: React.ComponentProps
) {
+ return {children} ;
+}
diff --git a/src/components/ui/dropdown-menu.tsx b/src/components/ui/dropdown-menu.tsx
new file mode 100644
index 0000000..5a20503
--- /dev/null
+++ b/src/components/ui/dropdown-menu.tsx
@@ -0,0 +1,201 @@
+"use client"
+
+import * as React from "react"
+import * as DropdownMenuPrimitive from "@radix-ui/react-dropdown-menu"
+import { Check, ChevronRight, Circle } from "lucide-react"
+
+import { cn } from "@/lib/utils"
+
+const DropdownMenu = DropdownMenuPrimitive.Root
+
+const DropdownMenuTrigger = DropdownMenuPrimitive.Trigger
+
+const DropdownMenuGroup = DropdownMenuPrimitive.Group
+
+const DropdownMenuPortal = DropdownMenuPrimitive.Portal
+
+const DropdownMenuSub = DropdownMenuPrimitive.Sub
+
+const DropdownMenuRadioGroup = DropdownMenuPrimitive.RadioGroup
+
+const DropdownMenuSubTrigger = React.forwardRef<
+ React.ElementRef,
+ React.ComponentPropsWithoutRef & {
+ inset?: boolean
+ }
+>(({ className, inset, children, ...props }, ref) => (
+
+ {children}
+
+
+))
+DropdownMenuSubTrigger.displayName =
+ DropdownMenuPrimitive.SubTrigger.displayName
+
+const DropdownMenuSubContent = React.forwardRef<
+ React.ElementRef,
+ React.ComponentPropsWithoutRef
+>(({ className, ...props }, ref) => (
+
+))
+DropdownMenuSubContent.displayName =
+ DropdownMenuPrimitive.SubContent.displayName
+
+const DropdownMenuContent = React.forwardRef<
+ React.ElementRef,
+ React.ComponentPropsWithoutRef
+>(({ className, sideOffset = 4, ...props }, ref) => (
+
+
+
+))
+DropdownMenuContent.displayName = DropdownMenuPrimitive.Content.displayName
+
+const DropdownMenuItem = React.forwardRef<
+ React.ElementRef,
+ React.ComponentPropsWithoutRef & {
+ inset?: boolean
+ }
+>(({ className, inset, ...props }, ref) => (
+ svg]:size-4 [&>svg]:shrink-0",
+ inset && "pl-8",
+ className
+ )}
+ {...props}
+ />
+))
+DropdownMenuItem.displayName = DropdownMenuPrimitive.Item.displayName
+
+const DropdownMenuCheckboxItem = React.forwardRef<
+ React.ElementRef,
+ React.ComponentPropsWithoutRef
+>(({ className, children, checked, ...props }, ref) => (
+
+
+
+
+
+
+ {children}
+
+))
+DropdownMenuCheckboxItem.displayName =
+ DropdownMenuPrimitive.CheckboxItem.displayName
+
+const DropdownMenuRadioItem = React.forwardRef<
+ React.ElementRef,
+ React.ComponentPropsWithoutRef
+>(({ className, children, ...props }, ref) => (
+
+
+
+
+
+
+ {children}
+
+))
+DropdownMenuRadioItem.displayName = DropdownMenuPrimitive.RadioItem.displayName
+
+const DropdownMenuLabel = React.forwardRef<
+ React.ElementRef,
+ React.ComponentPropsWithoutRef & {
+ inset?: boolean
+ }
+>(({ className, inset, ...props }, ref) => (
+
+))
+DropdownMenuLabel.displayName = DropdownMenuPrimitive.Label.displayName
+
+const DropdownMenuSeparator = React.forwardRef<
+ React.ElementRef,
+ React.ComponentPropsWithoutRef
+>(({ className, ...props }, ref) => (
+
+))
+DropdownMenuSeparator.displayName = DropdownMenuPrimitive.Separator.displayName
+
+const DropdownMenuShortcut = ({
+ className,
+ ...props
+}: React.HTMLAttributes) => {
+ return (
+
+ )
+}
+DropdownMenuShortcut.displayName = "DropdownMenuShortcut"
+
+export {
+ DropdownMenu,
+ DropdownMenuTrigger,
+ DropdownMenuContent,
+ DropdownMenuItem,
+ DropdownMenuCheckboxItem,
+ DropdownMenuRadioItem,
+ DropdownMenuLabel,
+ DropdownMenuSeparator,
+ DropdownMenuShortcut,
+ DropdownMenuGroup,
+ DropdownMenuPortal,
+ DropdownMenuSub,
+ DropdownMenuSubContent,
+ DropdownMenuSubTrigger,
+ DropdownMenuRadioGroup,
+}
diff --git a/src/components/ui/glow-effect.tsx b/src/components/ui/glow-effect.tsx
new file mode 100644
index 0000000..1be4ebc
--- /dev/null
+++ b/src/components/ui/glow-effect.tsx
@@ -0,0 +1,151 @@
+"use client";
+import { cn } from "@/lib/utils";
+import { motion, Transition } from "motion/react";
+
+export type GlowEffectProps = {
+ className?: string;
+ style?: React.CSSProperties;
+ colors?: string[];
+ mode?:
+ | "rotate"
+ | "pulse"
+ | "breathe"
+ | "colorShift"
+ | "flowHorizontal"
+ | "static";
+ blur?:
+ | number
+ | "softest"
+ | "soft"
+ | "medium"
+ | "strong"
+ | "stronger"
+ | "strongest"
+ | "none";
+ transition?: Transition;
+ scale?: number;
+ duration?: number;
+};
+
+export function GlowEffect({
+ className,
+ style,
+ colors = ["#FF5733", "#33FF57", "#3357FF", "#F1C40F"],
+ mode = "rotate",
+ blur = "medium",
+ transition,
+ scale = 1,
+ duration = 5,
+}: GlowEffectProps) {
+ const BASE_TRANSITION = {
+ repeat: Infinity,
+ duration: duration,
+ ease: "linear",
+ };
+
+ const animations = {
+ rotate: {
+ background: [
+ `conic-gradient(from 0deg at 50% 50%, ${colors.join(", ")})`,
+ `conic-gradient(from 360deg at 50% 50%, ${colors.join(", ")})`,
+ ],
+ transition: {
+ ...(transition ?? BASE_TRANSITION),
+ },
+ },
+ pulse: {
+ background: colors.map(
+ (color) =>
+ `radial-gradient(circle at 50% 50%, ${color} 0%, transparent 100%)`
+ ),
+ scale: [1 * scale, 1.1 * scale, 1 * scale],
+ opacity: [0.5, 0.8, 0.5],
+ transition: {
+ ...(transition ?? {
+ ...BASE_TRANSITION,
+ repeatType: "mirror",
+ }),
+ },
+ },
+ breathe: {
+ background: [
+ ...colors.map(
+ (color) =>
+ `radial-gradient(circle at 50% 50%, ${color} 0%, transparent 100%)`
+ ),
+ ],
+ scale: [1 * scale, 1.05 * scale, 1 * scale],
+ transition: {
+ ...(transition ?? {
+ ...BASE_TRANSITION,
+ repeatType: "mirror",
+ }),
+ },
+ },
+ colorShift: {
+ background: colors.map((color, index) => {
+ const nextColor = colors[(index + 1) % colors.length];
+ return `conic-gradient(from 0deg at 50% 50%, ${color} 0%, ${nextColor} 50%, ${color} 100%)`;
+ }),
+ transition: {
+ ...(transition ?? {
+ ...BASE_TRANSITION,
+ repeatType: "mirror",
+ }),
+ },
+ },
+ flowHorizontal: {
+ background: colors.map((color) => {
+ const nextColor = colors[(colors.indexOf(color) + 1) % colors.length];
+ return `linear-gradient(to right, ${color}, ${nextColor})`;
+ }),
+ transition: {
+ ...(transition ?? {
+ ...BASE_TRANSITION,
+ repeatType: "mirror",
+ }),
+ },
+ },
+ static: {
+ background: `linear-gradient(to right, ${colors.join(", ")})`,
+ },
+ };
+
+ const getBlurClass = (blur: GlowEffectProps["blur"]) => {
+ if (typeof blur === "number") {
+ return `blur-[${blur}px]`;
+ }
+
+ const presets = {
+ softest: "blur-xs",
+ soft: "blur-sm",
+ medium: "blur-md",
+ strong: "blur-lg",
+ stronger: "blur-xl",
+ strongest: "blur-xl",
+ none: "blur-none",
+ };
+
+ return presets[blur as keyof typeof presets];
+ };
+
+ return (
+
+ );
+}
diff --git a/src/components/ui/link-preview.tsx b/src/components/ui/link-preview.tsx
new file mode 100644
index 0000000..2e27b59
--- /dev/null
+++ b/src/components/ui/link-preview.tsx
@@ -0,0 +1,160 @@
+"use client";
+import * as HoverCardPrimitive from "@radix-ui/react-hover-card";
+
+import { encode } from "qss";
+import React from "react";
+import {
+ AnimatePresence,
+ motion,
+ useMotionValue,
+ useSpring,
+} from "motion/react";
+
+import { cn } from "@/lib/utils";
+
+type LinkPreviewProps = {
+ children: React.ReactNode;
+ url: string;
+ className?: string;
+ width?: number;
+ height?: number;
+ quality?: number;
+ layout?: string;
+ newTab?: boolean;
+ classNames?: {
+ image?: string;
+ imageWrapper?: string;
+ };
+ side?: "top" | "bottom" | "left" | "right";
+} & (
+ | { isStatic: true; imageSrc: string }
+ | { isStatic?: false; imageSrc?: never }
+);
+
+export const LinkPreview = ({
+ children,
+ url,
+ className,
+ width = 200,
+ height = 125,
+ quality = 50,
+ layout = "fixed",
+ isStatic = false,
+ imageSrc = "",
+ side = "top",
+ newTab = false,
+ classNames,
+}: LinkPreviewProps) => {
+ let src;
+ if (!isStatic) {
+ const params = encode({
+ url,
+ screenshot: true,
+ meta: false,
+ embed: "screenshot.url",
+ colorScheme: "dark",
+ "viewport.isMobile": true,
+ "viewport.deviceScaleFactor": 1,
+ "viewport.width": width * 3,
+ "viewport.height": height * 3,
+ });
+ src = `https://api.microlink.io/?${params}`;
+ } else {
+ src = imageSrc;
+ }
+
+ const [isOpen, setOpen] = React.useState(false);
+
+ const [isMounted, setIsMounted] = React.useState(false);
+
+ React.useEffect(() => {
+ setIsMounted(true);
+ }, []);
+
+ const springConfig = { stiffness: 100, damping: 15 };
+ const x = useMotionValue(0);
+
+ const translateX = useSpring(x, springConfig);
+
+ const handleMouseMove = (event: any) => {
+ const targetRect = event.target.getBoundingClientRect();
+ const eventOffsetX = event.clientX - targetRect.left;
+ const offsetFromCenter = (eventOffsetX - targetRect.width / 2) / 2; // Reduce the effect to make it subtle
+ x.set(offsetFromCenter);
+ };
+ const target = newTab ? "_blank" : "";
+ return (
+ <>
+ {isMounted ? (
+
+
+
+ ) : null}
+
+ {
+ setOpen(open);
+ }}
+ >
+
+ {children}
+
+
+
+
+ {isOpen && (
+
+
+
+
+
+ )}
+
+
+
+ >
+ );
+};
diff --git a/src/components/ui/tilt.tsx b/src/components/ui/tilt.tsx
new file mode 100644
index 0000000..565a79a
--- /dev/null
+++ b/src/components/ui/tilt.tsx
@@ -0,0 +1,92 @@
+'use client';
+
+import React, { useRef } from 'react';
+import {
+ motion,
+ useMotionTemplate,
+ useMotionValue,
+ useSpring,
+ useTransform,
+ MotionStyle,
+ SpringOptions,
+} from 'motion/react';
+
+export type TiltProps = {
+ children: React.ReactNode;
+ className?: string;
+ style?: MotionStyle;
+ rotationFactor?: number;
+ isRevese?: boolean;
+ springOptions?: SpringOptions;
+};
+
+export function Tilt({
+ children,
+ className,
+ style,
+ rotationFactor = 15,
+ isRevese = false,
+ springOptions,
+}: TiltProps) {
+ const ref = useRef(null);
+
+ const x = useMotionValue(0);
+ const y = useMotionValue(0);
+
+ const xSpring = useSpring(x, springOptions);
+ const ySpring = useSpring(y, springOptions);
+
+ const rotateX = useTransform(
+ ySpring,
+ [-0.5, 0.5],
+ isRevese
+ ? [rotationFactor, -rotationFactor]
+ : [-rotationFactor, rotationFactor]
+ );
+ const rotateY = useTransform(
+ xSpring,
+ [-0.5, 0.5],
+ isRevese
+ ? [-rotationFactor, rotationFactor]
+ : [rotationFactor, -rotationFactor]
+ );
+
+ const transform = useMotionTemplate`perspective(1000px) rotateX(${rotateX}deg) rotateY(${rotateY}deg)`;
+
+ const handleMouseMove = (e: React.MouseEvent) => {
+ if (!ref.current) return;
+
+ const rect = ref.current.getBoundingClientRect();
+ const width = rect.width;
+ const height = rect.height;
+ const mouseX = e.clientX - rect.left;
+ const mouseY = e.clientY - rect.top;
+
+ const xPos = mouseX / width - 0.5;
+ const yPos = mouseY / height - 0.5;
+
+ x.set(xPos);
+ y.set(yPos);
+ };
+
+ const handleMouseLeave = () => {
+ x.set(0);
+ y.set(0);
+ };
+
+ return (
+
+ {children}
+
+ );
+}
diff --git a/src/global.d.ts b/src/global.d.ts
new file mode 100644
index 0000000..cbe652d
--- /dev/null
+++ b/src/global.d.ts
@@ -0,0 +1 @@
+declare module "*.css";
diff --git a/src/i18n/request.ts b/src/i18n/request.ts
new file mode 100644
index 0000000..0207d13
--- /dev/null
+++ b/src/i18n/request.ts
@@ -0,0 +1,45 @@
+import { cookies, headers } from "next/headers";
+import type { AppConfig } from "next-intl";
+import { getRequestConfig } from "next-intl/server";
+import { allMessages } from "../../messages";
+
+const locales = ["en", "de"];
+
+declare module "next-intl" {
+ interface AppConfig {
+ Locale: (typeof locales)[number];
+ Messages: typeof allMessages.en;
+ // Formats: typeof formats;
+ }
+}
+
+const getPreferredLocale = async () => {
+ const h = await headers();
+ const header = h.get("accept-language");
+ if (!header) return "en"; // Fallback
+
+ // Beispiel: "de-DE,de;q=0.9,en-US;q=0.8,en;q=0.7"
+ const languages = header.split(",").map((lang) => {
+ const [code, qValue] = lang.trim().split(";q=");
+ return { code, q: qValue ? parseFloat(qValue) : 1.0 };
+ });
+
+ // Nach Qualität sortieren
+ languages.sort((a, b) => b.q - a.q);
+
+ // Nur den Sprachcode, kein Regionssuffix
+ const top = languages[0]?.code?.split("-")[0] ?? "en";
+ return top;
+};
+
+export default getRequestConfig(async () => {
+ const store = await cookies();
+ const locale: AppConfig["Locale"] =
+ store.get("locale")?.value || (await getPreferredLocale());
+ const messages: AppConfig["Messages"] =
+ locale === "de" ? allMessages.de : allMessages.en;
+ return {
+ locale,
+ messages,
+ };
+});
diff --git a/src/lib/mailer.ts b/src/lib/mailer.ts
new file mode 100644
index 0000000..fda2fd2
--- /dev/null
+++ b/src/lib/mailer.ts
@@ -0,0 +1,32 @@
+import nodemailer from "nodemailer";
+
+export function createTransport() {
+ const host = process.env.SMTP_HOST!;
+ const port = Number(process.env.SMTP_PORT || 465);
+ const user = process.env.SMTP_USER!;
+ const pass = process.env.SMTP_PASS!;
+
+ const transporter = nodemailer.createTransport({
+ host,
+ port,
+ secure: port === 465, // 465 = implicit TLS
+ auth: { user, pass },
+ requireTLS: port !== 465, // bei 587 erzwinge STARTTLS
+ tls: {
+ minVersion: "TLSv1.2",
+ ciphers:
+ "TLS_AES_256_GCM_SHA384:TLS_CHACHA20_POLY1305_SHA256:TLS_AES_128_GCM_SHA256",
+ rejectUnauthorized: true,
+ servername: host, // SNI
+ },
+ // Optional: DKIM-Signatur, falls du einen Selector + Private Key hast
+ // dkim: {
+ // domainName: "shortman.me",
+ // keySelector: "mail",
+ // privateKey: process.env.DKIM_PRIVATE_KEY!,
+ // cacheDir: false,
+ // },
+ });
+
+ return transporter;
+}
diff --git a/src/lib/server-actions.ts b/src/lib/server-actions.ts
new file mode 100644
index 0000000..66a93f6
--- /dev/null
+++ b/src/lib/server-actions.ts
@@ -0,0 +1,84 @@
+"use server";
+
+import { contactFormSchema } from "./zod";
+import { headers } from "next/headers";
+import { z } from "zod";
+import { createTransport } from "./mailer";
+
+export async function sendContactMail(body: z.infer) {
+ const escapeHtml = (s: string) => {
+ return s
+ .replaceAll("&", "&")
+ .replaceAll("<", "<")
+ .replaceAll(">", ">")
+ .replaceAll('"', """)
+ .replaceAll("'", "'");
+ };
+ const parsed = contactFormSchema.safeParse(body);
+ if (!parsed.success) {
+ return false;
+ }
+ const { hp, name, email, message, budget } = parsed.data;
+ // detect spam
+ if (hp && hp.trim().length > 0) {
+ return false;
+ }
+ const transporter = createTransport();
+
+ const h = await headers();
+ const ip = h.get("x-forwarded-for")?.split(",")[0]?.trim() || "unknown";
+
+ try {
+ // Optional: Transport prüfen
+ await transporter.verify();
+
+ const from = process.env.SMTP_FROM!;
+ const to = process.env.SMTP_TO!;
+
+ const subject = `Neue Kontaktanfrage von ${name}`;
+ const text = [
+ `Name: ${name}`,
+ `E-Mail: ${email}`,
+ `IP: ${ip}`,
+ ``,
+ `Nachricht:`,
+ message,
+ ].join("\n");
+
+ const html = `
+
+
Neue Kontaktanfrage
+
Name: ${escapeHtml(name)}
+
E-Mail: ${escapeHtml(email)}
+
Budget: ${escapeHtml(budget)}
+
IP: ${escapeHtml(ip)}
+
+
Message
+
+
${escapeHtml(message)}
+
+ `;
+
+ await transporter.sendMail({
+ from, // MUSS zu deiner Domain passen (SPF/DMARC)
+ to, // du selbst
+ replyTo: email, // damit du direkt antworten kannst
+ subject,
+ text,
+ html,
+ envelope: {
+ from, // technische Absenderadresse (Return-Path aligned)
+ to,
+ },
+ headers: {
+ "X-Contact-Form": "portfolio",
+ },
+ });
+
+ return true;
+ } catch (err) {
+ console.log(err);
+
+ return false;
+ }
+}
diff --git a/src/lib/zod.ts b/src/lib/zod.ts
new file mode 100644
index 0000000..ca1600f
--- /dev/null
+++ b/src/lib/zod.ts
@@ -0,0 +1,9 @@
+import { z } from "zod";
+
+export const contactFormSchema = z.object({
+ name: z.string().min(2).max(50),
+ email: z.string().email(),
+ budget: z.string(),
+ message: z.string().max(500),
+ hp: z.string().optional(),
+});
diff --git a/tailwind.config.ts b/tailwind.config.ts
index 1aae79b..f03d11f 100644
--- a/tailwind.config.ts
+++ b/tailwind.config.ts
@@ -15,9 +15,9 @@ export default {
screens: {
sm: "600px",
md: "728px",
- lg: "984px",
- xl: "1000px",
- "2xl": "1050px",
+ lg: "900px",
+ // xl: "1000px",
+ // "2xl": "1000px",
},
},
colors: {