From 0012a10249a05cf45927020bc07ccb602ac4e4c4 Mon Sep 17 00:00:00 2001 From: Kenso Grimm Date: Sun, 18 Jan 2026 17:50:49 +0100 Subject: [PATCH] Convert Server from submodule to normal files --- .gitignore | 28 + Server | 1 - Server/appwrite.json | 3 + Server/backend/package.json | 15 + Server/backend/server.js | 54 + Server/index.html | 13 + Server/package-lock.json | 5634 +++++++++++++++++ Server/package.json | 41 + Server/public/assets/background.png | Bin 0 -> 796631 bytes .../public/assets/logos/logo-horizontal.png | Bin 0 -> 9651 bytes Server/public/assets/logos/logo-square.png | Bin 0 -> 1202 bytes Server/public/assets/logos/logo-vertical.png | Bin 0 -> 2614 bytes Server/src/App.jsx | 376 ++ Server/src/components/dashboard/Dashboard.jsx | 146 + .../dashboard/hooks/usePagination.js | 39 + .../dashboard/hooks/useScrollSnap.js | 41 + .../dashboard/sections/AccountsSection.jsx | 232 + .../dashboard/sections/InsightsSection.jsx | 240 + .../dashboard/sections/OverviewSection.jsx | 211 + .../dashboard/sections/ProductsSection.jsx | 394 ++ .../src/components/dashboard/ui/DataTable.jsx | 36 + .../src/components/dashboard/ui/Filters.jsx | 39 + .../components/dashboard/ui/InsightCard.jsx | 42 + .../src/components/dashboard/ui/KPICard.jsx | 19 + .../components/dashboard/ui/Pagination.jsx | 27 + .../src/components/layout/BackgroundImage.jsx | 19 + .../layout/BackgroundRippleEffect.jsx | 120 + Server/src/components/layout/Logo.jsx | 16 + Server/src/components/layout/LogoSquare.jsx | 15 + Server/src/components/layout/LogoVertical.jsx | 15 + .../components/onboarding/OnboardingGate.jsx | 477 ++ Server/src/components/sidebar/Sidebar.jsx | 151 + .../src/components/sidebar/SidebarHeader.jsx | 199 + Server/src/components/sidebar/index.js | 1 + Server/src/components/ui/LogoutButton.jsx | 83 + Server/src/components/ui/Shuffle.jsx | 392 ++ Server/src/components/ui/colourful-text.jsx | 52 + .../src/components/ui/iphone-notification.jsx | 107 + .../src/components/ui/multi-step-loader.jsx | 97 + .../ui/placeholders-and-vanish-input.jsx | 262 + Server/src/index.css | 43 + Server/src/lib/appwrite.js | 59 + Server/src/lib/routing.js | 39 + Server/src/lib/utils.js | 6 + Server/src/main.jsx | 10 + Server/src/pages/AccountsPage.jsx | 656 ++ Server/src/services/accountService.js | 99 + Server/src/services/accountsService.js | 339 + Server/src/services/dashboardService.js | 301 + Server/src/services/ebayParserService.js | 515 ++ Server/src/services/productsService.js | 258 + Server/vite.config.js | 14 + 52 files changed, 11975 insertions(+), 1 deletion(-) create mode 100644 .gitignore delete mode 160000 Server create mode 100644 Server/appwrite.json create mode 100644 Server/backend/package.json create mode 100644 Server/backend/server.js create mode 100644 Server/index.html create mode 100644 Server/package-lock.json create mode 100644 Server/package.json create mode 100644 Server/public/assets/background.png create mode 100644 Server/public/assets/logos/logo-horizontal.png create mode 100644 Server/public/assets/logos/logo-square.png create mode 100644 Server/public/assets/logos/logo-vertical.png create mode 100644 Server/src/App.jsx create mode 100644 Server/src/components/dashboard/Dashboard.jsx create mode 100644 Server/src/components/dashboard/hooks/usePagination.js create mode 100644 Server/src/components/dashboard/hooks/useScrollSnap.js create mode 100644 Server/src/components/dashboard/sections/AccountsSection.jsx create mode 100644 Server/src/components/dashboard/sections/InsightsSection.jsx create mode 100644 Server/src/components/dashboard/sections/OverviewSection.jsx create mode 100644 Server/src/components/dashboard/sections/ProductsSection.jsx create mode 100644 Server/src/components/dashboard/ui/DataTable.jsx create mode 100644 Server/src/components/dashboard/ui/Filters.jsx create mode 100644 Server/src/components/dashboard/ui/InsightCard.jsx create mode 100644 Server/src/components/dashboard/ui/KPICard.jsx create mode 100644 Server/src/components/dashboard/ui/Pagination.jsx create mode 100644 Server/src/components/layout/BackgroundImage.jsx create mode 100644 Server/src/components/layout/BackgroundRippleEffect.jsx create mode 100644 Server/src/components/layout/Logo.jsx create mode 100644 Server/src/components/layout/LogoSquare.jsx create mode 100644 Server/src/components/layout/LogoVertical.jsx create mode 100644 Server/src/components/onboarding/OnboardingGate.jsx create mode 100644 Server/src/components/sidebar/Sidebar.jsx create mode 100644 Server/src/components/sidebar/SidebarHeader.jsx create mode 100644 Server/src/components/sidebar/index.js create mode 100644 Server/src/components/ui/LogoutButton.jsx create mode 100644 Server/src/components/ui/Shuffle.jsx create mode 100644 Server/src/components/ui/colourful-text.jsx create mode 100644 Server/src/components/ui/iphone-notification.jsx create mode 100644 Server/src/components/ui/multi-step-loader.jsx create mode 100644 Server/src/components/ui/placeholders-and-vanish-input.jsx create mode 100644 Server/src/index.css create mode 100644 Server/src/lib/appwrite.js create mode 100644 Server/src/lib/routing.js create mode 100644 Server/src/lib/utils.js create mode 100644 Server/src/main.jsx create mode 100644 Server/src/pages/AccountsPage.jsx create mode 100644 Server/src/services/accountService.js create mode 100644 Server/src/services/accountsService.js create mode 100644 Server/src/services/dashboardService.js create mode 100644 Server/src/services/ebayParserService.js create mode 100644 Server/src/services/productsService.js create mode 100644 Server/vite.config.js diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..e7a7aed --- /dev/null +++ b/.gitignore @@ -0,0 +1,28 @@ +# Dependencies +node_modules/ +Server/node_modules/ +Server/backend/node_modules/ + +# Build outputs +dist/ +build/ +*.log + +# Environment variables +.env +.env.local +.env.*.local + +# IDE +.vscode/ +.idea/ +*.swp +*.swo +*~ + +# OS +.DS_Store +Thumbs.db + +# Cursor +.cursor/debug.log diff --git a/Server b/Server deleted file mode 160000 index 6100df3..0000000 --- a/Server +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 6100df3f8340ed5df41cc21c4042320d7013a363 diff --git a/Server/appwrite.json b/Server/appwrite.json new file mode 100644 index 0000000..ebc990c --- /dev/null +++ b/Server/appwrite.json @@ -0,0 +1,3 @@ +{ + "projectId": "696b82bb0036d2e547ad" +} diff --git a/Server/backend/package.json b/Server/backend/package.json new file mode 100644 index 0000000..62630b2 --- /dev/null +++ b/Server/backend/package.json @@ -0,0 +1,15 @@ +{ + "name": "eship-backend", + "version": "0.1.0", + "type": "module", + "main": "server.js", + "scripts": { + "dev": "node server.js", + "start": "node server.js" + }, + "dependencies": { + "express": "^4.18.2", + "node-appwrite": "^14.0.0", + "dotenv": "^16.3.1" + } +} diff --git a/Server/backend/server.js b/Server/backend/server.js new file mode 100644 index 0000000..ac12809 --- /dev/null +++ b/Server/backend/server.js @@ -0,0 +1,54 @@ +import express from "express"; +import { Client, Account, Databases } from "node-appwrite"; +import dotenv from "dotenv"; + +dotenv.config(); + +const app = express(); +app.use(express.json()); + +const PORT = process.env.PORT || 3000; + +function makeUserClient(jwt) { + const client = new Client() + .setEndpoint(process.env.APPWRITE_ENDPOINT) + .setProject(process.env.APPWRITE_PROJECT_ID) + .setJWT(jwt); + return client; +} + +function makeAdminClient() { + const client = new Client() + .setEndpoint(process.env.APPWRITE_ENDPOINT) + .setProject(process.env.APPWRITE_PROJECT_ID) + .setKey(process.env.APPWRITE_API_KEY); + return client; +} + +app.post("/api/action", async (req, res) => { + try { + const auth = req.headers.authorization || ""; + const jwt = auth.startsWith("Bearer ") ? auth.slice(7) : ""; + if (!jwt) return res.status(401).json({ ok: false, error: "missing token" }); + + // 1) user token validieren + const userClient = makeUserClient(jwt); + const account = new Account(userClient); + const user = await account.get(); // wirft Fehler, wenn JWT ungueltig/abgelaufen + + // 2) privilegierte Aktion nur serverseitig mit Admin Key + const adminClient = makeAdminClient(); + const db = new Databases(adminClient); + + // Beispiel: lies etwas, das nur du lesen darfst + // const data = await db.listDocuments("dbId", "collectionId"); + + return res.json({ ok: true, userId: user.$id, info: "action allowed" }); + } catch (e) { + return res.status(401).json({ ok: false, error: "unauthorized" }); + } +}); + +app.listen(PORT, () => { + console.log(`Backend server running on port ${PORT}`); +}); diff --git a/Server/index.html b/Server/index.html new file mode 100644 index 0000000..b2cd577 --- /dev/null +++ b/Server/index.html @@ -0,0 +1,13 @@ + + + + + + + EShip - Login + + +
+ + + diff --git a/Server/package-lock.json b/Server/package-lock.json new file mode 100644 index 0000000..45a4a69 --- /dev/null +++ b/Server/package-lock.json @@ -0,0 +1,5634 @@ +{ + "name": "react-starter-kit-for-appwrite", + "version": "0.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "react-starter-kit-for-appwrite", + "version": "0.0.0", + "dependencies": { + "@appwrite.io/pink-icons": "^1.0.0", + "@gsap/react": "^2.1.2", + "@tabler/icons-react": "^3.36.1", + "@tailwindcss/vite": "^4.0.14", + "appwrite": "^21.2.1", + "clsx": "^2.1.1", + "gsap": "^3.14.2", + "motion": "^12.26.2", + "ogl": "^1.0.11", + "react": "^19.0.0", + "react-dom": "^19.0.0", + "styled-components": "^6.3.8", + "tailwind-merge": "^3.4.0", + "tailwindcss": "^4.0.14" + }, + "devDependencies": { + "@eslint/js": "^9.19.0", + "@types/react": "^19.0.8", + "@types/react-dom": "^19.0.3", + "@vitejs/plugin-react": "^4.3.4", + "eslint": "^9.19.0", + "eslint-plugin-react": "^7.37.4", + "eslint-plugin-react-hooks": "^5.0.0", + "eslint-plugin-react-refresh": "^0.4.18", + "globals": "^15.14.0", + "prettier": "3.5.3", + "vite": "^6.1.0" + } + }, + "node_modules/@appwrite.io/pink-icons": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@appwrite.io/pink-icons/-/pink-icons-1.0.0.tgz", + "integrity": "sha512-+zpksP07MvOYwhx9AZDFW0pxXQNC2juKwyOQVRAwAOkN1ACSQKPlyytkI1u2ci6CQPWjJe20CzbvBBuRNXOKjA==", + "license": "ISC" + }, + "node_modules/@babel/code-frame": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.28.6.tgz", + "integrity": "sha512-JYgintcMjRiCvS8mMECzaEn+m3PfoQiyqukOMCCVQtoJGYJw8j/8LBJEiqkHLkfwCcs74E3pbAUFNg7d9VNJ+Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-validator-identifier": "^7.28.5", + "js-tokens": "^4.0.0", + "picocolors": "^1.1.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/compat-data": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.28.6.tgz", + "integrity": "sha512-2lfu57JtzctfIrcGMz992hyLlByuzgIk58+hhGCxjKZ3rWI82NnVLjXcaTqkI2NvlcvOskZaiZ5kjUALo3Lpxg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.28.6.tgz", + "integrity": "sha512-H3mcG6ZDLTlYfaSNi0iOKkigqMFvkTKlGUYlD8GW7nNOYRrevuA46iTypPyv+06V3fEmvvazfntkBU34L0azAw==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@babel/code-frame": "^7.28.6", + "@babel/generator": "^7.28.6", + "@babel/helper-compilation-targets": "^7.28.6", + "@babel/helper-module-transforms": "^7.28.6", + "@babel/helpers": "^7.28.6", + "@babel/parser": "^7.28.6", + "@babel/template": "^7.28.6", + "@babel/traverse": "^7.28.6", + "@babel/types": "^7.28.6", + "@jridgewell/remapping": "^2.3.5", + "convert-source-map": "^2.0.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.3", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@babel/generator": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.28.6.tgz", + "integrity": "sha512-lOoVRwADj8hjf7al89tvQ2a1lf53Z+7tiXMgpZJL3maQPDxh0DgLMN62B2MKUOFcoodBHLMbDM6WAbKgNy5Suw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.28.6", + "@babel/types": "^7.28.6", + "@jridgewell/gen-mapping": "^0.3.12", + "@jridgewell/trace-mapping": "^0.3.28", + "jsesc": "^3.0.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.28.6.tgz", + "integrity": "sha512-JYtls3hqi15fcx5GaSNL7SCTJ2MNmjrkHXg4FSpOA/grxK8KwyZ5bubHsCq8FXCkua6xhuaaBit+3b7+VZRfcA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/compat-data": "^7.28.6", + "@babel/helper-validator-option": "^7.27.1", + "browserslist": "^4.24.0", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-globals": { + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.28.0.tgz", + "integrity": "sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.28.6.tgz", + "integrity": "sha512-l5XkZK7r7wa9LucGw9LwZyyCUscb4x37JWTPz7swwFE/0FMQAGpiWUZn8u9DzkSBWEcK25jmvubfpw2dnAMdbw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.28.6", + "@babel/types": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.28.6.tgz", + "integrity": "sha512-67oXFAYr2cDLDVGLXTEABjdBJZ6drElUSI7WKp70NrpyISso3plG9SAGEF6y7zbha/wOzUByWWTJvEDVNIUGcA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-module-imports": "^7.28.6", + "@babel/helper-validator-identifier": "^7.28.5", + "@babel/traverse": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-plugin-utils": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.28.6.tgz", + "integrity": "sha512-S9gzZ/bz83GRysI7gAD4wPT/AI3uCnY+9xn+Mx/KPs2JwHJIz1W8PZkg2cqyt3RNOBM8ejcXhV6y8Og7ly/Dug==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz", + "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz", + "integrity": "sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-option": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.27.1.tgz", + "integrity": "sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.28.6.tgz", + "integrity": "sha512-xOBvwq86HHdB7WUDTfKfT/Vuxh7gElQ+Sfti2Cy6yIWNW05P8iUslOVcZ4/sKbE+/jQaukQAdz/gf3724kYdqw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/template": "^7.28.6", + "@babel/types": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.28.6.tgz", + "integrity": "sha512-TeR9zWR18BvbfPmGbLampPMW+uW1NZnJlRuuHso8i87QZNq2JRF9i6RgxRqtEq+wQGsS19NNTWr2duhnE49mfQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.28.6" + }, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx-self": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.27.1.tgz", + "integrity": "sha512-6UzkCs+ejGdZ5mFFC/OCUrv028ab2fp1znZmCZjAOBKiBK2jXD1O+BPSfX8X2qjJ75fZBMSnQn3Rq2mrBJK2mw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx-source": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.27.1.tgz", + "integrity": "sha512-zbwoTsBruTeKB9hSq73ha66iFeJHuaFkUbwvqElnygoNbj/jHRsSeokowZFN3CZ64IvEqcmmkVe89OPXc7ldAw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/template": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.28.6.tgz", + "integrity": "sha512-YA6Ma2KsCdGb+WC6UpBVFJGXL58MDA6oyONbjyF/+5sBgxY/dwkhLogbMT2GXXyU84/IhRw/2D1Os1B/giz+BQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.28.6", + "@babel/parser": "^7.28.6", + "@babel/types": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.28.6.tgz", + "integrity": "sha512-fgWX62k02qtjqdSNTAGxmKYY/7FSL9WAS1o2Hu5+I5m9T0yxZzr4cnrfXQ/MX0rIifthCSs6FKTlzYbJcPtMNg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.28.6", + "@babel/generator": "^7.28.6", + "@babel/helper-globals": "^7.28.0", + "@babel/parser": "^7.28.6", + "@babel/template": "^7.28.6", + "@babel/types": "^7.28.6", + "debug": "^4.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/types": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.28.6.tgz", + "integrity": "sha512-0ZrskXVEHSWIqZM/sQZ4EV3jZJXRkio/WCxaqKZP1g//CEWEPSfeZFcms4XeKBCHU0ZKnIkdJeU/kF+eRp5lBg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-string-parser": "^7.27.1", + "@babel/helper-validator-identifier": "^7.28.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@emotion/is-prop-valid": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@emotion/is-prop-valid/-/is-prop-valid-1.4.0.tgz", + "integrity": "sha512-QgD4fyscGcbbKwJmqNvUMSE02OsHUa+lAWKdEUIJKgqe5IwRSKd7+KhibEWdaKwgjLj0DRSHA9biAIqGBk05lw==", + "license": "MIT", + "peer": true, + "dependencies": { + "@emotion/memoize": "^0.9.0" + } + }, + "node_modules/@emotion/memoize": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.9.0.tgz", + "integrity": "sha512-30FAj7/EoJ5mwVPOWhAyCX+FPfMDrVecJAM+Iw9NRoSl4BBAQeqj4cApHHUXOVvIPgLVDsCFoz/hGD+5QQD1GQ==", + "license": "MIT" + }, + "node_modules/@emotion/unitless": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.10.0.tgz", + "integrity": "sha512-dFoMUuQA20zvtVTuxZww6OHoJYgrzfKM1t52mVySDJnMSEa08ruEvdYQbhvyu6soU+NeLVd3yKfTfT0NeV6qGg==", + "license": "MIT" + }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.12.tgz", + "integrity": "sha512-Hhmwd6CInZ3dwpuGTF8fJG6yoWmsToE+vYgD4nytZVxcu1ulHpUQRAB1UJ8+N1Am3Mz4+xOByoQoSZf4D+CpkA==", + "cpu": [ + "ppc64" + ], + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.12.tgz", + "integrity": "sha512-VJ+sKvNA/GE7Ccacc9Cha7bpS8nyzVv0jdVgwNDaR4gDMC/2TTRc33Ip8qrNYUcpkOHUT5OZ0bUcNNVZQ9RLlg==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.12.tgz", + "integrity": "sha512-6AAmLG7zwD1Z159jCKPvAxZd4y/VTO0VkprYy+3N2FtJ8+BQWFXU+OxARIwA46c5tdD9SsKGZ/1ocqBS/gAKHg==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.12.tgz", + "integrity": "sha512-5jbb+2hhDHx5phYR2By8GTWEzn6I9UqR11Kwf22iKbNpYrsmRB18aX/9ivc5cabcUiAT/wM+YIZ6SG9QO6a8kg==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.12.tgz", + "integrity": "sha512-N3zl+lxHCifgIlcMUP5016ESkeQjLj/959RxxNYIthIg+CQHInujFuXeWbWMgnTo4cp5XVHqFPmpyu9J65C1Yg==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.12.tgz", + "integrity": "sha512-HQ9ka4Kx21qHXwtlTUVbKJOAnmG1ipXhdWTmNXiPzPfWKpXqASVcWdnf2bnL73wgjNrFXAa3yYvBSd9pzfEIpA==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.12.tgz", + "integrity": "sha512-gA0Bx759+7Jve03K1S0vkOu5Lg/85dou3EseOGUes8flVOGxbhDDh/iZaoek11Y8mtyKPGF3vP8XhnkDEAmzeg==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.12.tgz", + "integrity": "sha512-TGbO26Yw2xsHzxtbVFGEXBFH0FRAP7gtcPE7P5yP7wGy7cXK2oO7RyOhL5NLiqTlBh47XhmIUXuGciXEqYFfBQ==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.12.tgz", + "integrity": "sha512-lPDGyC1JPDou8kGcywY0YILzWlhhnRjdof3UlcoqYmS9El818LLfJJc3PXXgZHrHCAKs/Z2SeZtDJr5MrkxtOw==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.12.tgz", + "integrity": "sha512-8bwX7a8FghIgrupcxb4aUmYDLp8pX06rGh5HqDT7bB+8Rdells6mHvrFHHW2JAOPZUbnjUpKTLg6ECyzvas2AQ==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.12.tgz", + "integrity": "sha512-0y9KrdVnbMM2/vG8KfU0byhUN+EFCny9+8g202gYqSSVMonbsCfLjUO+rCci7pM0WBEtz+oK/PIwHkzxkyharA==", + "cpu": [ + "ia32" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.12.tgz", + "integrity": "sha512-h///Lr5a9rib/v1GGqXVGzjL4TMvVTv+s1DPoxQdz7l/AYv6LDSxdIwzxkrPW438oUXiDtwM10o9PmwS/6Z0Ng==", + "cpu": [ + "loong64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.12.tgz", + "integrity": "sha512-iyRrM1Pzy9GFMDLsXn1iHUm18nhKnNMWscjmp4+hpafcZjrr2WbT//d20xaGljXDBYHqRcl8HnxbX6uaA/eGVw==", + "cpu": [ + "mips64el" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.12.tgz", + "integrity": "sha512-9meM/lRXxMi5PSUqEXRCtVjEZBGwB7P/D4yT8UG/mwIdze2aV4Vo6U5gD3+RsoHXKkHCfSxZKzmDssVlRj1QQA==", + "cpu": [ + "ppc64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.12.tgz", + "integrity": "sha512-Zr7KR4hgKUpWAwb1f3o5ygT04MzqVrGEGXGLnj15YQDJErYu/BGg+wmFlIDOdJp0PmB0lLvxFIOXZgFRrdjR0w==", + "cpu": [ + "riscv64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.12.tgz", + "integrity": "sha512-MsKncOcgTNvdtiISc/jZs/Zf8d0cl/t3gYWX8J9ubBnVOwlk65UIEEvgBORTiljloIWnBzLs4qhzPkJcitIzIg==", + "cpu": [ + "s390x" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.12.tgz", + "integrity": "sha512-uqZMTLr/zR/ed4jIGnwSLkaHmPjOjJvnm6TVVitAa08SLS9Z0VM8wIRx7gWbJB5/J54YuIMInDquWyYvQLZkgw==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.12.tgz", + "integrity": "sha512-xXwcTq4GhRM7J9A8Gv5boanHhRa/Q9KLVmcyXHCTaM4wKfIpWkdXiMog/KsnxzJ0A1+nD+zoecuzqPmCRyBGjg==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.12.tgz", + "integrity": "sha512-Ld5pTlzPy3YwGec4OuHh1aCVCRvOXdH8DgRjfDy/oumVovmuSzWfnSJg+VtakB9Cm0gxNO9BzWkj6mtO1FMXkQ==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.12.tgz", + "integrity": "sha512-fF96T6KsBo/pkQI950FARU9apGNTSlZGsv1jZBAlcLL1MLjLNIWPBkj5NlSz8aAzYKg+eNqknrUJ24QBybeR5A==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.12.tgz", + "integrity": "sha512-MZyXUkZHjQxUvzK7rN8DJ3SRmrVrke8ZyRusHlP+kuwqTcfWLyqMOE3sScPPyeIXN/mDJIfGXvcMqCgYKekoQw==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openharmony-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.25.12.tgz", + "integrity": "sha512-rm0YWsqUSRrjncSXGA7Zv78Nbnw4XL6/dzr20cyrQf7ZmRcsovpcRBdhD43Nuk3y7XIoW2OxMVvwuRvk9XdASg==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.12.tgz", + "integrity": "sha512-3wGSCDyuTHQUzt0nV7bocDy72r2lI33QL3gkDNGkod22EsYl04sMf0qLb8luNKTOmgF/eDEDP5BFNwoBKH441w==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.12.tgz", + "integrity": "sha512-rMmLrur64A7+DKlnSuwqUdRKyd3UE7oPJZmnljqEptesKM8wx9J8gx5u0+9Pq0fQQW8vqeKebwNXdfOyP+8Bsg==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.12.tgz", + "integrity": "sha512-HkqnmmBoCbCwxUKKNPBixiWDGCpQGVsrQfJoVGYLPT41XWF8lHuE5N6WhVia2n4o5QK5M4tYr21827fNhi4byQ==", + "cpu": [ + "ia32" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.12.tgz", + "integrity": "sha512-alJC0uCZpTFrSL0CCDjcgleBXPnCrEAhTBILpeAp7M/OFgoqtAetfBzX0xM00MUsVVPpVjlPuMbREqnZCXaTnA==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@eslint-community/eslint-utils": { + "version": "4.9.1", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.9.1.tgz", + "integrity": "sha512-phrYmNiYppR7znFEdqgfWHXR6NCkZEK7hwWDHZUjit/2/U0r6XvkDl0SYnoM51Hq7FhCGdLDT6zxCCOY1hexsQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "eslint-visitor-keys": "^3.4.3" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" + } + }, + "node_modules/@eslint-community/eslint-utils/node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint-community/regexpp": { + "version": "4.12.2", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.2.tgz", + "integrity": "sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + } + }, + "node_modules/@eslint/config-array": { + "version": "0.21.1", + "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.21.1.tgz", + "integrity": "sha512-aw1gNayWpdI/jSYVgzN5pL0cfzU02GT3NBpeT/DXbx1/1x7ZKxFPd9bwrzygx/qiwIQiJ1sw/zD8qY/kRvlGHA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@eslint/object-schema": "^2.1.7", + "debug": "^4.3.1", + "minimatch": "^3.1.2" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/config-helpers": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.4.2.tgz", + "integrity": "sha512-gBrxN88gOIf3R7ja5K9slwNayVcZgK6SOUORm2uBzTeIEfeVaIhOpCtTox3P6R7o2jLFwLFTLnC7kU/RGcYEgw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@eslint/core": "^0.17.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/core": { + "version": "0.17.0", + "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.17.0.tgz", + "integrity": "sha512-yL/sLrpmtDaFEiUj1osRP4TI2MDz1AddJL+jZ7KSqvBuliN4xqYY54IfdN8qD8Toa6g1iloph1fxQNkjOxrrpQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@types/json-schema": "^7.0.15" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/eslintrc": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.3.3.tgz", + "integrity": "sha512-Kr+LPIUVKz2qkx1HAMH8q1q6azbqBAsXJUxBl/ODDuVPX45Z9DfwB8tPjTi6nNZ8BuM3nbJxC5zCAg5elnBUTQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^10.0.1", + "globals": "^14.0.0", + "ignore": "^5.2.0", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.1", + "minimatch": "^3.1.2", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint/eslintrc/node_modules/globals": { + "version": "14.0.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz", + "integrity": "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@eslint/js": { + "version": "9.39.2", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.39.2.tgz", + "integrity": "sha512-q1mjIoW1VX4IvSocvM/vbTiveKC4k9eLrajNEuSsmjymSDEbpGddtpfOoN7YGAqBK3NG+uqo8ia4PDTt8buCYA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://eslint.org/donate" + } + }, + "node_modules/@eslint/object-schema": { + "version": "2.1.7", + "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.7.tgz", + "integrity": "sha512-VtAOaymWVfZcmZbp6E2mympDIHvyjXs/12LqWYjVw6qjrfF+VK+fyG33kChz3nnK+SU5/NeHOqrTEHS8sXO3OA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/plugin-kit": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.4.1.tgz", + "integrity": "sha512-43/qtrDUokr7LJqoF2c3+RInu/t4zfrpYdoSDfYyhg52rwLV6TnOvdG4fXm7IkSB3wErkcmJS9iEhjVtOSEjjA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@eslint/core": "^0.17.0", + "levn": "^0.4.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@gsap/react": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/@gsap/react/-/react-2.1.2.tgz", + "integrity": "sha512-JqliybO1837UcgH2hVOM4VO+38APk3ECNrsuSM4MuXp+rbf+/2IG2K1YJiqfTcXQHH7XlA0m3ykniFYstfq0Iw==", + "license": "SEE LICENSE AT https://gsap.com/standard-license", + "peerDependencies": { + "gsap": "^3.12.5", + "react": ">=17" + } + }, + "node_modules/@humanfs/core": { + "version": "0.19.1", + "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.1.tgz", + "integrity": "sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=18.18.0" + } + }, + "node_modules/@humanfs/node": { + "version": "0.16.7", + "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.7.tgz", + "integrity": "sha512-/zUx+yOsIrG4Y43Eh2peDeKCxlRt/gET6aHfaKpuq267qXdYDFViVHfMaLyygZOnl0kGWxFIgsBy8QFuTLUXEQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@humanfs/core": "^0.19.1", + "@humanwhocodes/retry": "^0.4.0" + }, + "engines": { + "node": ">=18.18.0" + } + }, + "node_modules/@humanwhocodes/module-importer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=12.22" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@humanwhocodes/retry": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.3.tgz", + "integrity": "sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=18.18" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.13", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", + "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.0", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/remapping": { + "version": "2.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz", + "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==", + "license": "MIT", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", + "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", + "license": "MIT" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.31", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", + "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@rolldown/pluginutils": { + "version": "1.0.0-beta.27", + "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.0-beta.27.tgz", + "integrity": "sha512-+d0F4MKMCbeVUJwG96uQ4SgAznZNSq93I3V+9NHA4OpvqG8mRCpGdKmK8l/dl02h2CCDHwW2FqilnTyDcAnqjA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@rollup/rollup-android-arm-eabi": { + "version": "4.55.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.55.1.tgz", + "integrity": "sha512-9R0DM/ykwfGIlNu6+2U09ga0WXeZ9MRC2Ter8jnz8415VbuIykVuc6bhdrbORFZANDmTDvq26mJrEVTl8TdnDg==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-android-arm64": { + "version": "4.55.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.55.1.tgz", + "integrity": "sha512-eFZCb1YUqhTysgW3sj/55du5cG57S7UTNtdMjCW7LwVcj3dTTcowCsC8p7uBdzKsZYa8J7IDE8lhMI+HX1vQvg==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-darwin-arm64": { + "version": "4.55.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.55.1.tgz", + "integrity": "sha512-p3grE2PHcQm2e8PSGZdzIhCKbMCw/xi9XvMPErPhwO17vxtvCN5FEA2mSLgmKlCjHGMQTP6phuQTYWUnKewwGg==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-darwin-x64": { + "version": "4.55.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.55.1.tgz", + "integrity": "sha512-rDUjG25C9qoTm+e02Esi+aqTKSBYwVTaoS1wxcN47/Luqef57Vgp96xNANwt5npq9GDxsH7kXxNkJVEsWEOEaQ==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-freebsd-arm64": { + "version": "4.55.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.55.1.tgz", + "integrity": "sha512-+JiU7Jbp5cdxekIgdte0jfcu5oqw4GCKr6i3PJTlXTCU5H5Fvtkpbs4XJHRmWNXF+hKmn4v7ogI5OQPaupJgOg==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-freebsd-x64": { + "version": "4.55.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.55.1.tgz", + "integrity": "sha512-V5xC1tOVWtLLmr3YUk2f6EJK4qksksOYiz/TCsFHu/R+woubcLWdC9nZQmwjOAbmExBIVKsm1/wKmEy4z4u4Bw==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.55.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.55.1.tgz", + "integrity": "sha512-Rn3n+FUk2J5VWx+ywrG/HGPTD9jXNbicRtTM11e/uorplArnXZYsVifnPPqNNP5BsO3roI4n8332ukpY/zN7rQ==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm-musleabihf": { + "version": "4.55.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.55.1.tgz", + "integrity": "sha512-grPNWydeKtc1aEdrJDWk4opD7nFtQbMmV7769hiAaYyUKCT1faPRm2av8CX1YJsZ4TLAZcg9gTR1KvEzoLjXkg==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-gnu": { + "version": "4.55.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.55.1.tgz", + "integrity": "sha512-a59mwd1k6x8tXKcUxSyISiquLwB5pX+fJW9TkWU46lCqD/GRDe9uDN31jrMmVP3feI3mhAdvcCClhV8V5MhJFQ==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-musl": { + "version": "4.55.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.55.1.tgz", + "integrity": "sha512-puS1MEgWX5GsHSoiAsF0TYrpomdvkaXm0CofIMG5uVkP6IBV+ZO9xhC5YEN49nsgYo1DuuMquF9+7EDBVYu4uA==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-loong64-gnu": { + "version": "4.55.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.55.1.tgz", + "integrity": "sha512-r3Wv40in+lTsULSb6nnoudVbARdOwb2u5fpeoOAZjFLznp6tDU8kd+GTHmJoqZ9lt6/Sys33KdIHUaQihFcu7g==", + "cpu": [ + "loong64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-loong64-musl": { + "version": "4.55.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-musl/-/rollup-linux-loong64-musl-4.55.1.tgz", + "integrity": "sha512-MR8c0+UxAlB22Fq4R+aQSPBayvYa3+9DrwG/i1TKQXFYEaoW3B5b/rkSRIypcZDdWjWnpcvxbNaAJDcSbJU3Lw==", + "cpu": [ + "loong64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-ppc64-gnu": { + "version": "4.55.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.55.1.tgz", + "integrity": "sha512-3KhoECe1BRlSYpMTeVrD4sh2Pw2xgt4jzNSZIIPLFEsnQn9gAnZagW9+VqDqAHgm1Xc77LzJOo2LdigS5qZ+gw==", + "cpu": [ + "ppc64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-ppc64-musl": { + "version": "4.55.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-musl/-/rollup-linux-ppc64-musl-4.55.1.tgz", + "integrity": "sha512-ziR1OuZx0vdYZZ30vueNZTg73alF59DicYrPViG0NEgDVN8/Jl87zkAPu4u6VjZST2llgEUjaiNl9JM6HH1Vdw==", + "cpu": [ + "ppc64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-gnu": { + "version": "4.55.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.55.1.tgz", + "integrity": "sha512-uW0Y12ih2XJRERZ4jAfKamTyIHVMPQnTZcQjme2HMVDAHY4amf5u414OqNYC+x+LzRdRcnIG1YodLrrtA8xsxw==", + "cpu": [ + "riscv64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-musl": { + "version": "4.55.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.55.1.tgz", + "integrity": "sha512-u9yZ0jUkOED1BFrqu3BwMQoixvGHGZ+JhJNkNKY/hyoEgOwlqKb62qu+7UjbPSHYjiVy8kKJHvXKv5coH4wDeg==", + "cpu": [ + "riscv64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-s390x-gnu": { + "version": "4.55.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.55.1.tgz", + "integrity": "sha512-/0PenBCmqM4ZUd0190j7J0UsQ/1nsi735iPRakO8iPciE7BQ495Y6msPzaOmvx0/pn+eJVVlZrNrSh4WSYLxNg==", + "cpu": [ + "s390x" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.55.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.55.1.tgz", + "integrity": "sha512-a8G4wiQxQG2BAvo+gU6XrReRRqj+pLS2NGXKm8io19goR+K8lw269eTrPkSdDTALwMmJp4th2Uh0D8J9bEV1vg==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-musl": { + "version": "4.55.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.55.1.tgz", + "integrity": "sha512-bD+zjpFrMpP/hqkfEcnjXWHMw5BIghGisOKPj+2NaNDuVT+8Ds4mPf3XcPHuat1tz89WRL+1wbcxKY3WSbiT7w==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-openbsd-x64": { + "version": "4.55.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openbsd-x64/-/rollup-openbsd-x64-4.55.1.tgz", + "integrity": "sha512-eLXw0dOiqE4QmvikfQ6yjgkg/xDM+MdU9YJuP4ySTibXU0oAvnEWXt7UDJmD4UkYialMfOGFPJnIHSe/kdzPxg==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ] + }, + "node_modules/@rollup/rollup-openharmony-arm64": { + "version": "4.55.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.55.1.tgz", + "integrity": "sha512-xzm44KgEP11te3S2HCSyYf5zIzWmx3n8HDCc7EE59+lTcswEWNpvMLfd9uJvVX8LCg9QWG67Xt75AuHn4vgsXw==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ] + }, + "node_modules/@rollup/rollup-win32-arm64-msvc": { + "version": "4.55.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.55.1.tgz", + "integrity": "sha512-yR6Bl3tMC/gBok5cz/Qi0xYnVbIxGx5Fcf/ca0eB6/6JwOY+SRUcJfI0OpeTpPls7f194as62thCt/2BjxYN8g==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-ia32-msvc": { + "version": "4.55.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.55.1.tgz", + "integrity": "sha512-3fZBidchE0eY0oFZBnekYCfg+5wAB0mbpCBuofh5mZuzIU/4jIVkbESmd2dOsFNS78b53CYv3OAtwqkZZmU5nA==", + "cpu": [ + "ia32" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-gnu": { + "version": "4.55.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.55.1.tgz", + "integrity": "sha512-xGGY5pXj69IxKb4yv/POoocPy/qmEGhimy/FoTpTSVju3FYXUQQMFCaZZXJVidsmGxRioZAwpThl/4zX41gRKg==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.55.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.55.1.tgz", + "integrity": "sha512-SPEpaL6DX4rmcXtnhdrQYgzQ5W2uW3SCJch88lB2zImhJRhIIK44fkUrgIV/Q8yUNfw5oyZ5vkeQsZLhCb06lw==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@tabler/icons": { + "version": "3.36.1", + "resolved": "https://registry.npmjs.org/@tabler/icons/-/icons-3.36.1.tgz", + "integrity": "sha512-f4Jg3Fof/Vru5ioix/UO4GX+sdDsF9wQo47FbtvG+utIYYVQ/QVAC0QYgcBbAjQGfbdOh2CCf0BgiFOF9Ixtjw==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/codecalm" + } + }, + "node_modules/@tabler/icons-react": { + "version": "3.36.1", + "resolved": "https://registry.npmjs.org/@tabler/icons-react/-/icons-react-3.36.1.tgz", + "integrity": "sha512-/8nOXeNeMoze9xY/QyEKG65wuvRhkT3q9aytaur6Gj8bYU2A98YVJyLc9MRmc5nVvpy+bRlrrwK/Ykr8WGyUWg==", + "license": "MIT", + "dependencies": { + "@tabler/icons": "" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/codecalm" + }, + "peerDependencies": { + "react": ">= 16" + } + }, + "node_modules/@tailwindcss/node": { + "version": "4.1.18", + "resolved": "https://registry.npmjs.org/@tailwindcss/node/-/node-4.1.18.tgz", + "integrity": "sha512-DoR7U1P7iYhw16qJ49fgXUlry1t4CpXeErJHnQ44JgTSKMaZUdf17cfn5mHchfJ4KRBZRFA/Coo+MUF5+gOaCQ==", + "license": "MIT", + "dependencies": { + "@jridgewell/remapping": "^2.3.4", + "enhanced-resolve": "^5.18.3", + "jiti": "^2.6.1", + "lightningcss": "1.30.2", + "magic-string": "^0.30.21", + "source-map-js": "^1.2.1", + "tailwindcss": "4.1.18" + } + }, + "node_modules/@tailwindcss/oxide": { + "version": "4.1.18", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide/-/oxide-4.1.18.tgz", + "integrity": "sha512-EgCR5tTS5bUSKQgzeMClT6iCY3ToqE1y+ZB0AKldj809QXk1Y+3jB0upOYZrn9aGIzPtUsP7sX4QQ4XtjBB95A==", + "license": "MIT", + "engines": { + "node": ">= 10" + }, + "optionalDependencies": { + "@tailwindcss/oxide-android-arm64": "4.1.18", + "@tailwindcss/oxide-darwin-arm64": "4.1.18", + "@tailwindcss/oxide-darwin-x64": "4.1.18", + "@tailwindcss/oxide-freebsd-x64": "4.1.18", + "@tailwindcss/oxide-linux-arm-gnueabihf": "4.1.18", + "@tailwindcss/oxide-linux-arm64-gnu": "4.1.18", + "@tailwindcss/oxide-linux-arm64-musl": "4.1.18", + "@tailwindcss/oxide-linux-x64-gnu": "4.1.18", + "@tailwindcss/oxide-linux-x64-musl": "4.1.18", + "@tailwindcss/oxide-wasm32-wasi": "4.1.18", + "@tailwindcss/oxide-win32-arm64-msvc": "4.1.18", + "@tailwindcss/oxide-win32-x64-msvc": "4.1.18" + } + }, + "node_modules/@tailwindcss/oxide-android-arm64": { + "version": "4.1.18", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-android-arm64/-/oxide-android-arm64-4.1.18.tgz", + "integrity": "sha512-dJHz7+Ugr9U/diKJA0W6N/6/cjI+ZTAoxPf9Iz9BFRF2GzEX8IvXxFIi/dZBloVJX/MZGvRuFA9rqwdiIEZQ0Q==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-darwin-arm64": { + "version": "4.1.18", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-arm64/-/oxide-darwin-arm64-4.1.18.tgz", + "integrity": "sha512-Gc2q4Qhs660bhjyBSKgq6BYvwDz4G+BuyJ5H1xfhmDR3D8HnHCmT/BSkvSL0vQLy/nkMLY20PQ2OoYMO15Jd0A==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-darwin-x64": { + "version": "4.1.18", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-x64/-/oxide-darwin-x64-4.1.18.tgz", + "integrity": "sha512-FL5oxr2xQsFrc3X9o1fjHKBYBMD1QZNyc1Xzw/h5Qu4XnEBi3dZn96HcHm41c/euGV+GRiXFfh2hUCyKi/e+yw==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-freebsd-x64": { + "version": "4.1.18", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-freebsd-x64/-/oxide-freebsd-x64-4.1.18.tgz", + "integrity": "sha512-Fj+RHgu5bDodmV1dM9yAxlfJwkkWvLiRjbhuO2LEtwtlYlBgiAT4x/j5wQr1tC3SANAgD+0YcmWVrj8R9trVMA==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-linux-arm-gnueabihf": { + "version": "4.1.18", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm-gnueabihf/-/oxide-linux-arm-gnueabihf-4.1.18.tgz", + "integrity": "sha512-Fp+Wzk/Ws4dZn+LV2Nqx3IilnhH51YZoRaYHQsVq3RQvEl+71VGKFpkfHrLM/Li+kt5c0DJe/bHXK1eHgDmdiA==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-linux-arm64-gnu": { + "version": "4.1.18", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-gnu/-/oxide-linux-arm64-gnu-4.1.18.tgz", + "integrity": "sha512-S0n3jboLysNbh55Vrt7pk9wgpyTTPD0fdQeh7wQfMqLPM/Hrxi+dVsLsPrycQjGKEQk85Kgbx+6+QnYNiHalnw==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-linux-arm64-musl": { + "version": "4.1.18", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-musl/-/oxide-linux-arm64-musl-4.1.18.tgz", + "integrity": "sha512-1px92582HkPQlaaCkdRcio71p8bc8i/ap5807tPRDK/uw953cauQBT8c5tVGkOwrHMfc2Yh6UuxaH4vtTjGvHg==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-linux-x64-gnu": { + "version": "4.1.18", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-gnu/-/oxide-linux-x64-gnu-4.1.18.tgz", + "integrity": "sha512-v3gyT0ivkfBLoZGF9LyHmts0Isc8jHZyVcbzio6Wpzifg/+5ZJpDiRiUhDLkcr7f/r38SWNe7ucxmGW3j3Kb/g==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-linux-x64-musl": { + "version": "4.1.18", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-musl/-/oxide-linux-x64-musl-4.1.18.tgz", + "integrity": "sha512-bhJ2y2OQNlcRwwgOAGMY0xTFStt4/wyU6pvI6LSuZpRgKQwxTec0/3Scu91O8ir7qCR3AuepQKLU/kX99FouqQ==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-wasm32-wasi": { + "version": "4.1.18", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-wasm32-wasi/-/oxide-wasm32-wasi-4.1.18.tgz", + "integrity": "sha512-LffYTvPjODiP6PT16oNeUQJzNVyJl1cjIebq/rWWBF+3eDst5JGEFSc5cWxyRCJ0Mxl+KyIkqRxk1XPEs9x8TA==", + "bundleDependencies": [ + "@napi-rs/wasm-runtime", + "@emnapi/core", + "@emnapi/runtime", + "@tybys/wasm-util", + "@emnapi/wasi-threads", + "tslib" + ], + "cpu": [ + "wasm32" + ], + "license": "MIT", + "optional": true, + "dependencies": { + "@emnapi/core": "^1.7.1", + "@emnapi/runtime": "^1.7.1", + "@emnapi/wasi-threads": "^1.1.0", + "@napi-rs/wasm-runtime": "^1.1.0", + "@tybys/wasm-util": "^0.10.1", + "tslib": "^2.4.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@tailwindcss/oxide-win32-arm64-msvc": { + "version": "4.1.18", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-arm64-msvc/-/oxide-win32-arm64-msvc-4.1.18.tgz", + "integrity": "sha512-HjSA7mr9HmC8fu6bdsZvZ+dhjyGCLdotjVOgLA2vEqxEBZaQo9YTX4kwgEvPCpRh8o4uWc4J/wEoFzhEmjvPbA==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-win32-x64-msvc": { + "version": "4.1.18", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-x64-msvc/-/oxide-win32-x64-msvc-4.1.18.tgz", + "integrity": "sha512-bJWbyYpUlqamC8dpR7pfjA0I7vdF6t5VpUGMWRkXVE3AXgIZjYUYAK7II1GNaxR8J1SSrSrppRar8G++JekE3Q==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/vite": { + "version": "4.1.18", + "resolved": "https://registry.npmjs.org/@tailwindcss/vite/-/vite-4.1.18.tgz", + "integrity": "sha512-jVA+/UpKL1vRLg6Hkao5jldawNmRo7mQYrZtNHMIVpLfLhDml5nMRUo/8MwoX2vNXvnaXNNMedrMfMugAVX1nA==", + "license": "MIT", + "dependencies": { + "@tailwindcss/node": "4.1.18", + "@tailwindcss/oxide": "4.1.18", + "tailwindcss": "4.1.18" + }, + "peerDependencies": { + "vite": "^5.2.0 || ^6 || ^7" + } + }, + "node_modules/@types/babel__core": { + "version": "7.20.5", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz", + "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.20.7", + "@babel/types": "^7.20.7", + "@types/babel__generator": "*", + "@types/babel__template": "*", + "@types/babel__traverse": "*" + } + }, + "node_modules/@types/babel__generator": { + "version": "7.27.0", + "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.27.0.tgz", + "integrity": "sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__template": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz", + "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__traverse": { + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.28.0.tgz", + "integrity": "sha512-8PvcXf70gTDZBgt9ptxJ8elBeBjcLOAcOtoO/mPJjtji1+CdGbHgm77om1GrsPxsiE+uXIpNSK64UYaIwQXd4Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.28.2" + } + }, + "node_modules/@types/estree": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", + "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", + "license": "MIT" + }, + "node_modules/@types/json-schema": { + "version": "7.0.15", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", + "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/react": { + "version": "19.2.8", + "resolved": "https://registry.npmjs.org/@types/react/-/react-19.2.8.tgz", + "integrity": "sha512-3MbSL37jEchWZz2p2mjntRZtPt837ij10ApxKfgmXCTuHWagYg7iA5bqPw6C8BMPfwidlvfPI/fxOc42HLhcyg==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "csstype": "^3.2.2" + } + }, + "node_modules/@types/react-dom": { + "version": "19.2.3", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-19.2.3.tgz", + "integrity": "sha512-jp2L/eY6fn+KgVVQAOqYItbF0VY/YApe5Mz2F0aykSO8gx31bYCZyvSeYxCHKvzHG5eZjc+zyaS5BrBWya2+kQ==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "@types/react": "^19.2.0" + } + }, + "node_modules/@types/stylis": { + "version": "4.2.7", + "resolved": "https://registry.npmjs.org/@types/stylis/-/stylis-4.2.7.tgz", + "integrity": "sha512-VgDNokpBoKF+wrdvhAAfS55OMQpL6QRglwTwNC3kIgBrzZxA4WsFj+2eLfEA/uMUDzBcEhYmjSbwQakn/i3ajA==", + "license": "MIT" + }, + "node_modules/@vitejs/plugin-react": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-4.7.0.tgz", + "integrity": "sha512-gUu9hwfWvvEDBBmgtAowQCojwZmJ5mcLn3aufeCsitijs3+f2NsrPtlAWIR6OPiqljl96GVCUbLe0HyqIpVaoA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.28.0", + "@babel/plugin-transform-react-jsx-self": "^7.27.1", + "@babel/plugin-transform-react-jsx-source": "^7.27.1", + "@rolldown/pluginutils": "1.0.0-beta.27", + "@types/babel__core": "^7.20.5", + "react-refresh": "^0.17.0" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "peerDependencies": { + "vite": "^4.2.0 || ^5.0.0 || ^6.0.0 || ^7.0.0" + } + }, + "node_modules/acorn": { + "version": "8.15.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz", + "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", + "dev": true, + "license": "MIT", + "peer": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/appwrite": { + "version": "21.5.0", + "resolved": "https://registry.npmjs.org/appwrite/-/appwrite-21.5.0.tgz", + "integrity": "sha512-643bMRZVYXMluXvSXbdaLAi9qqTJLWbVGguKH4vH6IdKHur6gGIirhCOqAEt33pV4TOFJ55VBu8c/+Ft1ke2SA==", + "license": "BSD-3-Clause" + }, + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true, + "license": "Python-2.0" + }, + "node_modules/array-buffer-byte-length": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.2.tgz", + "integrity": "sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "is-array-buffer": "^3.0.5" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array-includes": { + "version": "3.1.9", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.9.tgz", + "integrity": "sha512-FmeCCAenzH0KH381SPT5FZmiA/TmpndpcaShhfgEN9eCVjnFBqq3l1xrI42y8+PPLI6hypzou4GXw00WHmPBLQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "define-properties": "^1.2.1", + "es-abstract": "^1.24.0", + "es-object-atoms": "^1.1.1", + "get-intrinsic": "^1.3.0", + "is-string": "^1.1.1", + "math-intrinsics": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.findlast": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/array.prototype.findlast/-/array.prototype.findlast-1.2.5.tgz", + "integrity": "sha512-CVvd6FHg1Z3POpBLxO6E6zr+rSKEQ9L6rZHAaY7lLfhKsWYUBBOuMs0e9o24oopj6H+geRCX0YJ+TJLBK2eHyQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "es-shim-unscopables": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.flat": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.3.tgz", + "integrity": "sha512-rwG/ja1neyLqCuGZ5YYrznA62D4mZXg0i1cIskIUKSiqF3Cje9/wXAls9B9s1Wa2fomMsIv8czB8jZcPmxCXFg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.5", + "es-shim-unscopables": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.flatmap": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.3.tgz", + "integrity": "sha512-Y7Wt51eKJSyi80hFrJCePGGNo5ktJCslFuboqJsbf57CCPcm5zztluPlc4/aD8sWsKvlwatezpV4U1efk8kpjg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.5", + "es-shim-unscopables": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.tosorted": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/array.prototype.tosorted/-/array.prototype.tosorted-1.1.4.tgz", + "integrity": "sha512-p6Fx8B7b7ZhL/gmUsAy0D15WhvDccw3mnGNbZpi3pmeJdxtWsj2jEaI4Y6oo3XiHfzuSgPwKc04MYt6KgvC/wA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.3", + "es-errors": "^1.3.0", + "es-shim-unscopables": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/arraybuffer.prototype.slice": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.4.tgz", + "integrity": "sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "array-buffer-byte-length": "^1.0.1", + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.5", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6", + "is-array-buffer": "^3.0.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/async-function": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/async-function/-/async-function-1.0.0.tgz", + "integrity": "sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/available-typed-arrays": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", + "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "possible-typed-array-names": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true, + "license": "MIT" + }, + "node_modules/baseline-browser-mapping": { + "version": "2.9.15", + "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.9.15.tgz", + "integrity": "sha512-kX8h7K2srmDyYnXRIppo4AH/wYgzWVCs+eKr3RusRSQ5PvRYoEFmR/I0PbdTjKFAoKqp5+kbxnNTFO9jOfSVJg==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "baseline-browser-mapping": "dist/cli.js" + } + }, + "node_modules/brace-expansion": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/browserslist": { + "version": "4.28.1", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.1.tgz", + "integrity": "sha512-ZC5Bd0LgJXgwGqUknZY/vkUQ04r8NXnJZ3yYi4vDmSiZmC/pdSN0NbNRPxZpbtO4uAfDUAFffO8IZoM3Gj8IkA==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "peer": true, + "dependencies": { + "baseline-browser-mapping": "^2.9.0", + "caniuse-lite": "^1.0.30001759", + "electron-to-chromium": "^1.5.263", + "node-releases": "^2.0.27", + "update-browserslist-db": "^1.2.0" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/call-bind": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.8.tgz", + "integrity": "sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.0", + "es-define-property": "^1.0.0", + "get-intrinsic": "^1.2.4", + "set-function-length": "^1.2.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/call-bind-apply-helpers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", + "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/call-bound": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", + "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "get-intrinsic": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/camelize": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/camelize/-/camelize-1.0.1.tgz", + "integrity": "sha512-dU+Tx2fsypxTgtLoE36npi3UqcjSSMNYfkqgmoEhtZrraP5VWq0K7FkWVTYa8eMPtnU/G2txVsfdCJTn9uzpuQ==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001764", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001764.tgz", + "integrity": "sha512-9JGuzl2M+vPL+pz70gtMF9sHdMFbY9FJaQBi186cHKH3pSzDvzoUJUPV6fqiKIMyXbud9ZLg4F3Yza1vJ1+93g==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "CC-BY-4.0" + }, + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/clsx": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz", + "integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true, + "license": "MIT" + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true, + "license": "MIT" + }, + "node_modules/convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "dev": true, + "license": "MIT" + }, + "node_modules/cross-spawn": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", + "dev": true, + "license": "MIT", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/css-color-keywords": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/css-color-keywords/-/css-color-keywords-1.0.0.tgz", + "integrity": "sha512-FyyrDHZKEjXDpNJYvVsV960FiqQyXc/LlYmsxl2BcdMb2WPx0OGRVgTg55rPSyLSNMqP52R9r8geSp7apN3Ofg==", + "license": "ISC", + "engines": { + "node": ">=4" + } + }, + "node_modules/css-to-react-native": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/css-to-react-native/-/css-to-react-native-3.2.0.tgz", + "integrity": "sha512-e8RKaLXMOFii+02mOlqwjbD00KSEKqblnpO9e++1aXS1fPQOpS1YoqdVHBqPjHNoxeF2mimzVqawm2KCbEdtHQ==", + "license": "MIT", + "dependencies": { + "camelize": "^1.0.0", + "css-color-keywords": "^1.0.0", + "postcss-value-parser": "^4.0.2" + } + }, + "node_modules/csstype": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz", + "integrity": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==", + "license": "MIT" + }, + "node_modules/data-view-buffer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.2.tgz", + "integrity": "sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/data-view-byte-length": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/data-view-byte-length/-/data-view-byte-length-1.0.2.tgz", + "integrity": "sha512-tuhGbE6CfTM9+5ANGf+oQb72Ky/0+s3xKUpHvShfiz2RxMFgFPjsXuRLBVMtvMs15awe45SRb83D6wH4ew6wlQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/inspect-js" + } + }, + "node_modules/data-view-byte-offset": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/data-view-byte-offset/-/data-view-byte-offset-1.0.1.tgz", + "integrity": "sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/debug": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/define-data-property": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", + "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "gopd": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/define-properties": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", + "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", + "dev": true, + "license": "MIT", + "dependencies": { + "define-data-property": "^1.0.1", + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/detect-libc": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz", + "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==", + "license": "Apache-2.0", + "engines": { + "node": ">=8" + } + }, + "node_modules/doctrine": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/dunder-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", + "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "es-errors": "^1.3.0", + "gopd": "^1.2.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/electron-to-chromium": { + "version": "1.5.267", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.267.tgz", + "integrity": "sha512-0Drusm6MVRXSOJpGbaSVgcQsuB4hEkMpHXaVstcPmhu5LIedxs1xNK/nIxmQIU/RPC0+1/o0AVZfBTkTNJOdUw==", + "dev": true, + "license": "ISC" + }, + "node_modules/enhanced-resolve": { + "version": "5.18.4", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.18.4.tgz", + "integrity": "sha512-LgQMM4WXU3QI+SYgEc2liRgznaD5ojbmY3sb8LxyguVkIg5FxdpTkvk72te2R38/TGKxH634oLxXRGY6d7AP+Q==", + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.4", + "tapable": "^2.2.0" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/es-abstract": { + "version": "1.24.1", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.24.1.tgz", + "integrity": "sha512-zHXBLhP+QehSSbsS9Pt23Gg964240DPd6QCf8WpkqEXxQ7fhdZzYsocOr5u7apWonsS5EjZDmTF+/slGMyasvw==", + "dev": true, + "license": "MIT", + "dependencies": { + "array-buffer-byte-length": "^1.0.2", + "arraybuffer.prototype.slice": "^1.0.4", + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "data-view-buffer": "^1.0.2", + "data-view-byte-length": "^1.0.2", + "data-view-byte-offset": "^1.0.1", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "es-set-tostringtag": "^2.1.0", + "es-to-primitive": "^1.3.0", + "function.prototype.name": "^1.1.8", + "get-intrinsic": "^1.3.0", + "get-proto": "^1.0.1", + "get-symbol-description": "^1.1.0", + "globalthis": "^1.0.4", + "gopd": "^1.2.0", + "has-property-descriptors": "^1.0.2", + "has-proto": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "internal-slot": "^1.1.0", + "is-array-buffer": "^3.0.5", + "is-callable": "^1.2.7", + "is-data-view": "^1.0.2", + "is-negative-zero": "^2.0.3", + "is-regex": "^1.2.1", + "is-set": "^2.0.3", + "is-shared-array-buffer": "^1.0.4", + "is-string": "^1.1.1", + "is-typed-array": "^1.1.15", + "is-weakref": "^1.1.1", + "math-intrinsics": "^1.1.0", + "object-inspect": "^1.13.4", + "object-keys": "^1.1.1", + "object.assign": "^4.1.7", + "own-keys": "^1.0.1", + "regexp.prototype.flags": "^1.5.4", + "safe-array-concat": "^1.1.3", + "safe-push-apply": "^1.0.0", + "safe-regex-test": "^1.1.0", + "set-proto": "^1.0.0", + "stop-iteration-iterator": "^1.1.0", + "string.prototype.trim": "^1.2.10", + "string.prototype.trimend": "^1.0.9", + "string.prototype.trimstart": "^1.0.8", + "typed-array-buffer": "^1.0.3", + "typed-array-byte-length": "^1.0.3", + "typed-array-byte-offset": "^1.0.4", + "typed-array-length": "^1.0.7", + "unbox-primitive": "^1.1.0", + "which-typed-array": "^1.1.19" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/es-define-property": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", + "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-iterator-helpers": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/es-iterator-helpers/-/es-iterator-helpers-1.2.2.tgz", + "integrity": "sha512-BrUQ0cPTB/IwXj23HtwHjS9n7O4h9FX94b4xc5zlTHxeLgTAdzYUDyy6KdExAl9lbN5rtfe44xpjpmj9grxs5w==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "define-properties": "^1.2.1", + "es-abstract": "^1.24.1", + "es-errors": "^1.3.0", + "es-set-tostringtag": "^2.1.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.3.0", + "globalthis": "^1.0.4", + "gopd": "^1.2.0", + "has-property-descriptors": "^1.0.2", + "has-proto": "^1.2.0", + "has-symbols": "^1.1.0", + "internal-slot": "^1.1.0", + "iterator.prototype": "^1.1.5", + "safe-array-concat": "^1.1.3" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-object-atoms": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", + "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-set-tostringtag": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", + "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-shim-unscopables": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.1.0.tgz", + "integrity": "sha512-d9T8ucsEhh8Bi1woXCf+TIKDIROLG5WCkxg8geBCbvk22kzwC5G2OnXVMO6FUsvQlgUUXQ2itephWDLqDzbeCw==", + "dev": true, + "license": "MIT", + "dependencies": { + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-to-primitive": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.3.0.tgz", + "integrity": "sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-callable": "^1.2.7", + "is-date-object": "^1.0.5", + "is-symbol": "^1.0.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/esbuild": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.12.tgz", + "integrity": "sha512-bbPBYYrtZbkt6Os6FiTLCTFxvq4tt3JKall1vRwshA3fdVztsLAatFaZobhkBC8/BrPetoa0oksYoKXoG4ryJg==", + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.25.12", + "@esbuild/android-arm": "0.25.12", + "@esbuild/android-arm64": "0.25.12", + "@esbuild/android-x64": "0.25.12", + "@esbuild/darwin-arm64": "0.25.12", + "@esbuild/darwin-x64": "0.25.12", + "@esbuild/freebsd-arm64": "0.25.12", + "@esbuild/freebsd-x64": "0.25.12", + "@esbuild/linux-arm": "0.25.12", + "@esbuild/linux-arm64": "0.25.12", + "@esbuild/linux-ia32": "0.25.12", + "@esbuild/linux-loong64": "0.25.12", + "@esbuild/linux-mips64el": "0.25.12", + "@esbuild/linux-ppc64": "0.25.12", + "@esbuild/linux-riscv64": "0.25.12", + "@esbuild/linux-s390x": "0.25.12", + "@esbuild/linux-x64": "0.25.12", + "@esbuild/netbsd-arm64": "0.25.12", + "@esbuild/netbsd-x64": "0.25.12", + "@esbuild/openbsd-arm64": "0.25.12", + "@esbuild/openbsd-x64": "0.25.12", + "@esbuild/openharmony-arm64": "0.25.12", + "@esbuild/sunos-x64": "0.25.12", + "@esbuild/win32-arm64": "0.25.12", + "@esbuild/win32-ia32": "0.25.12", + "@esbuild/win32-x64": "0.25.12" + } + }, + "node_modules/escalade": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint": { + "version": "9.39.2", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.39.2.tgz", + "integrity": "sha512-LEyamqS7W5HB3ujJyvi0HQK/dtVINZvd5mAAp9eT5S/ujByGjiZLCzPcHVzuXbpJDJF/cxwHlfceVUDZ2lnSTw==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@eslint-community/eslint-utils": "^4.8.0", + "@eslint-community/regexpp": "^4.12.1", + "@eslint/config-array": "^0.21.1", + "@eslint/config-helpers": "^0.4.2", + "@eslint/core": "^0.17.0", + "@eslint/eslintrc": "^3.3.1", + "@eslint/js": "9.39.2", + "@eslint/plugin-kit": "^0.4.1", + "@humanfs/node": "^0.16.6", + "@humanwhocodes/module-importer": "^1.0.1", + "@humanwhocodes/retry": "^0.4.2", + "@types/estree": "^1.0.6", + "ajv": "^6.12.4", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.6", + "debug": "^4.3.2", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^8.4.0", + "eslint-visitor-keys": "^4.2.1", + "espree": "^10.4.0", + "esquery": "^1.5.0", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^8.0.0", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "ignore": "^5.2.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.1.2", + "natural-compare": "^1.4.0", + "optionator": "^0.9.3" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://eslint.org/donate" + }, + "peerDependencies": { + "jiti": "*" + }, + "peerDependenciesMeta": { + "jiti": { + "optional": true + } + } + }, + "node_modules/eslint-plugin-react": { + "version": "7.37.5", + "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.37.5.tgz", + "integrity": "sha512-Qteup0SqU15kdocexFNAJMvCJEfa2xUKNV4CC1xsVMrIIqEy3SQ/rqyxCWNzfrd3/ldy6HMlD2e0JDVpDg2qIA==", + "dev": true, + "license": "MIT", + "dependencies": { + "array-includes": "^3.1.8", + "array.prototype.findlast": "^1.2.5", + "array.prototype.flatmap": "^1.3.3", + "array.prototype.tosorted": "^1.1.4", + "doctrine": "^2.1.0", + "es-iterator-helpers": "^1.2.1", + "estraverse": "^5.3.0", + "hasown": "^2.0.2", + "jsx-ast-utils": "^2.4.1 || ^3.0.0", + "minimatch": "^3.1.2", + "object.entries": "^1.1.9", + "object.fromentries": "^2.0.8", + "object.values": "^1.2.1", + "prop-types": "^15.8.1", + "resolve": "^2.0.0-next.5", + "semver": "^6.3.1", + "string.prototype.matchall": "^4.0.12", + "string.prototype.repeat": "^1.0.0" + }, + "engines": { + "node": ">=4" + }, + "peerDependencies": { + "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9.7" + } + }, + "node_modules/eslint-plugin-react-hooks": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-5.2.0.tgz", + "integrity": "sha512-+f15FfK64YQwZdJNELETdn5ibXEUQmW1DZL6KXhNnc2heoy/sg9VJJeT7n8TlMWouzWqSWavFkIhHyIbIAEapg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 || ^9.0.0" + } + }, + "node_modules/eslint-plugin-react-refresh": { + "version": "0.4.26", + "resolved": "https://registry.npmjs.org/eslint-plugin-react-refresh/-/eslint-plugin-react-refresh-0.4.26.tgz", + "integrity": "sha512-1RETEylht2O6FM/MvgnyvT+8K21wLqDNg4qD51Zj3guhjt433XbnnkVttHMyaVyAFD03QSV4LPS5iE3VQmO7XQ==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "eslint": ">=8.40" + } + }, + "node_modules/eslint-scope": { + "version": "8.4.0", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.4.0.tgz", + "integrity": "sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-visitor-keys": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz", + "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/espree": { + "version": "10.4.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-10.4.0.tgz", + "integrity": "sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "acorn": "^8.15.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^4.2.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/esquery": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.7.0.tgz", + "integrity": "sha512-Ap6G0WQwcU/LHsvLwON1fAQX9Zp0A2Y6Y/cJBl9r/JbW90Zyg4/zbG6zzKa2OTALELarYHmKu0GhpM5EO+7T0g==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "estraverse": "^5.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", + "dev": true, + "license": "MIT" + }, + "node_modules/fdir": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", + "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", + "license": "MIT", + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, + "node_modules/file-entry-cache": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz", + "integrity": "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "flat-cache": "^4.0.0" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "license": "MIT", + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/flat-cache": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz", + "integrity": "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==", + "dev": true, + "license": "MIT", + "dependencies": { + "flatted": "^3.2.9", + "keyv": "^4.5.4" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/flatted": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.3.tgz", + "integrity": "sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==", + "dev": true, + "license": "ISC" + }, + "node_modules/for-each": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.5.tgz", + "integrity": "sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-callable": "^1.2.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/framer-motion": { + "version": "12.26.2", + "resolved": "https://registry.npmjs.org/framer-motion/-/framer-motion-12.26.2.tgz", + "integrity": "sha512-lflOQEdjquUi9sCg5Y1LrsZDlsjrHw7m0T9Yedvnk7Bnhqfkc89/Uha10J3CFhkL+TCZVCRw9eUGyM/lyYhXQA==", + "license": "MIT", + "dependencies": { + "motion-dom": "^12.26.2", + "motion-utils": "^12.24.10", + "tslib": "^2.4.0" + }, + "peerDependencies": { + "@emotion/is-prop-valid": "*", + "react": "^18.0.0 || ^19.0.0", + "react-dom": "^18.0.0 || ^19.0.0" + }, + "peerDependenciesMeta": { + "@emotion/is-prop-valid": { + "optional": true + }, + "react": { + "optional": true + }, + "react-dom": { + "optional": true + } + } + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/function.prototype.name": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.8.tgz", + "integrity": "sha512-e5iwyodOHhbMr/yNrc7fDYG4qlbIvI5gajyzPnb5TCwyhjApznQh1BMFou9b30SevY43gCJKXycoCBjMbsuW0Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "define-properties": "^1.2.1", + "functions-have-names": "^1.2.3", + "hasown": "^2.0.2", + "is-callable": "^1.2.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/functions-have-names": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", + "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/generator-function": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/generator-function/-/generator-function-2.0.1.tgz", + "integrity": "sha512-SFdFmIJi+ybC0vjlHN0ZGVGHc3lgE0DxPAT0djjVg+kjOnSqclqmj0KQ7ykTOLP6YxoqOvuAODGdcHJn+43q3g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/get-intrinsic": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", + "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "function-bind": "^1.1.2", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "math-intrinsics": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", + "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", + "dev": true, + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/get-symbol-description": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.1.0.tgz", + "integrity": "sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/globals": { + "version": "15.15.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-15.15.0.tgz", + "integrity": "sha512-7ACyT3wmyp3I61S4fG682L0VA2RGD9otkqGJIwNUMF1SWUombIIk+af1unuDYgMm082aHYwD+mzJvv9Iu8dsgg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/globalthis": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.4.tgz", + "integrity": "sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "define-properties": "^1.2.1", + "gopd": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/gopd": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "license": "ISC" + }, + "node_modules/gsap": { + "version": "3.14.2", + "resolved": "https://registry.npmjs.org/gsap/-/gsap-3.14.2.tgz", + "integrity": "sha512-P8/mMxVLU7o4+55+1TCnQrPmgjPKnwkzkXOK1asnR9Jg2lna4tEY5qBJjMmAaOBDDZWtlRjBXjLa0w53G/uBLA==", + "license": "Standard 'no charge' license: https://gsap.com/standard-license.", + "peer": true + }, + "node_modules/has-bigints": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.1.0.tgz", + "integrity": "sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/has-property-descriptors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", + "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-define-property": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-proto": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.2.0.tgz", + "integrity": "sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-symbols": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-tostringtag": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-symbols": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/ignore": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", + "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/import-fresh": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz", + "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/internal-slot": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.1.0.tgz", + "integrity": "sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "hasown": "^2.0.2", + "side-channel": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/is-array-buffer": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.5.tgz", + "integrity": "sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "get-intrinsic": "^1.2.6" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-async-function": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-async-function/-/is-async-function-2.1.1.tgz", + "integrity": "sha512-9dgM/cZBnNvjzaMYHVoxxfPj2QXt22Ev7SuuPrs+xav0ukGB0S6d4ydZdEiM48kLx5kDV+QBPrpVnFyefL8kkQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "async-function": "^1.0.0", + "call-bound": "^1.0.3", + "get-proto": "^1.0.1", + "has-tostringtag": "^1.0.2", + "safe-regex-test": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-bigint": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.1.0.tgz", + "integrity": "sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-bigints": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-boolean-object": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.2.2.tgz", + "integrity": "sha512-wa56o2/ElJMYqjCjGkXri7it5FbebW5usLw/nPmCMs5DeZ7eziSYZhSmPRn0txqeW4LnAmQQU7FgqLpsEFKM4A==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-callable": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", + "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-core-module": { + "version": "2.16.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz", + "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==", + "dev": true, + "license": "MIT", + "dependencies": { + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-data-view": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-data-view/-/is-data-view-1.0.2.tgz", + "integrity": "sha512-RKtWF8pGmS87i2D6gqQu/l7EYRlVdfzemCJN/P3UOs//x1QE7mfhvzHIApBTRf7axvT6DMGwSwBXYCT0nfB9xw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "get-intrinsic": "^1.2.6", + "is-typed-array": "^1.1.13" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-date-object": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.1.0.tgz", + "integrity": "sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-finalizationregistry": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-finalizationregistry/-/is-finalizationregistry-1.1.1.tgz", + "integrity": "sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-generator-function": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.1.2.tgz", + "integrity": "sha512-upqt1SkGkODW9tsGNG5mtXTXtECizwtS2kA161M+gJPc1xdb/Ax629af6YrTwcOeQHbewrPNlE5Dx7kzvXTizA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.4", + "generator-function": "^2.0.0", + "get-proto": "^1.0.1", + "has-tostringtag": "^1.0.2", + "safe-regex-test": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-map": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.3.tgz", + "integrity": "sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-negative-zero": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.3.tgz", + "integrity": "sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-number-object": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.1.1.tgz", + "integrity": "sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-regex": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.2.1.tgz", + "integrity": "sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "gopd": "^1.2.0", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-set": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.3.tgz", + "integrity": "sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-shared-array-buffer": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.4.tgz", + "integrity": "sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-string": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.1.1.tgz", + "integrity": "sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-symbol": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.1.1.tgz", + "integrity": "sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "has-symbols": "^1.1.0", + "safe-regex-test": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-typed-array": { + "version": "1.1.15", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.15.tgz", + "integrity": "sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "which-typed-array": "^1.1.16" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-weakmap": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.2.tgz", + "integrity": "sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-weakref": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.1.1.tgz", + "integrity": "sha512-6i9mGWSlqzNMEqpCp93KwRS1uUOodk2OJ6b+sq7ZPDSy2WuI5NFIxp/254TytR8ftefexkWn5xNiHUNpPOfSew==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-weakset": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.4.tgz", + "integrity": "sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "get-intrinsic": "^1.2.6" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", + "dev": true, + "license": "MIT" + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true, + "license": "ISC" + }, + "node_modules/iterator.prototype": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/iterator.prototype/-/iterator.prototype-1.1.5.tgz", + "integrity": "sha512-H0dkQoCa3b2VEeKQBOxFph+JAbcrQdE7KC0UkqwpLmv2EC4P41QXP+rqo9wYodACiG5/WM5s9oDApTU8utwj9g==", + "dev": true, + "license": "MIT", + "dependencies": { + "define-data-property": "^1.1.4", + "es-object-atoms": "^1.0.0", + "get-intrinsic": "^1.2.6", + "get-proto": "^1.0.0", + "has-symbols": "^1.1.0", + "set-function-name": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/jiti": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-2.6.1.tgz", + "integrity": "sha512-ekilCSN1jwRvIbgeg/57YFh8qQDNbwDb9xT/qu2DAHbFFZUicIl4ygVaAvzveMhMVr3LnpSKTNnwt8PoOfmKhQ==", + "license": "MIT", + "bin": { + "jiti": "lib/jiti-cli.mjs" + } + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/js-yaml": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.1.tgz", + "integrity": "sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==", + "dev": true, + "license": "MIT", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/jsesc": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", + "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", + "dev": true, + "license": "MIT", + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/json-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true, + "license": "MIT" + }, + "node_modules/json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", + "dev": true, + "license": "MIT" + }, + "node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "dev": true, + "license": "MIT", + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/jsx-ast-utils": { + "version": "3.3.5", + "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.3.5.tgz", + "integrity": "sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "array-includes": "^3.1.6", + "array.prototype.flat": "^1.3.1", + "object.assign": "^4.1.4", + "object.values": "^1.1.6" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/keyv": { + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", + "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", + "dev": true, + "license": "MIT", + "dependencies": { + "json-buffer": "3.0.1" + } + }, + "node_modules/levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/lightningcss": { + "version": "1.30.2", + "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.30.2.tgz", + "integrity": "sha512-utfs7Pr5uJyyvDETitgsaqSyjCb2qNRAtuqUeWIAKztsOYdcACf2KtARYXg2pSvhkt+9NfoaNY7fxjl6nuMjIQ==", + "license": "MPL-2.0", + "dependencies": { + "detect-libc": "^2.0.3" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "optionalDependencies": { + "lightningcss-android-arm64": "1.30.2", + "lightningcss-darwin-arm64": "1.30.2", + "lightningcss-darwin-x64": "1.30.2", + "lightningcss-freebsd-x64": "1.30.2", + "lightningcss-linux-arm-gnueabihf": "1.30.2", + "lightningcss-linux-arm64-gnu": "1.30.2", + "lightningcss-linux-arm64-musl": "1.30.2", + "lightningcss-linux-x64-gnu": "1.30.2", + "lightningcss-linux-x64-musl": "1.30.2", + "lightningcss-win32-arm64-msvc": "1.30.2", + "lightningcss-win32-x64-msvc": "1.30.2" + } + }, + "node_modules/lightningcss-android-arm64": { + "version": "1.30.2", + "resolved": "https://registry.npmjs.org/lightningcss-android-arm64/-/lightningcss-android-arm64-1.30.2.tgz", + "integrity": "sha512-BH9sEdOCahSgmkVhBLeU7Hc9DWeZ1Eb6wNS6Da8igvUwAe0sqROHddIlvU06q3WyXVEOYDZ6ykBZQnjTbmo4+A==", + "cpu": [ + "arm64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-darwin-arm64": { + "version": "1.30.2", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.30.2.tgz", + "integrity": "sha512-ylTcDJBN3Hp21TdhRT5zBOIi73P6/W0qwvlFEk22fkdXchtNTOU4Qc37SkzV+EKYxLouZ6M4LG9NfZ1qkhhBWA==", + "cpu": [ + "arm64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-darwin-x64": { + "version": "1.30.2", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.30.2.tgz", + "integrity": "sha512-oBZgKchomuDYxr7ilwLcyms6BCyLn0z8J0+ZZmfpjwg9fRVZIR5/GMXd7r9RH94iDhld3UmSjBM6nXWM2TfZTQ==", + "cpu": [ + "x64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-freebsd-x64": { + "version": "1.30.2", + "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.30.2.tgz", + "integrity": "sha512-c2bH6xTrf4BDpK8MoGG4Bd6zAMZDAXS569UxCAGcA7IKbHNMlhGQ89eRmvpIUGfKWNVdbhSbkQaWhEoMGmGslA==", + "cpu": [ + "x64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm-gnueabihf": { + "version": "1.30.2", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.30.2.tgz", + "integrity": "sha512-eVdpxh4wYcm0PofJIZVuYuLiqBIakQ9uFZmipf6LF/HRj5Bgm0eb3qL/mr1smyXIS1twwOxNWndd8z0E374hiA==", + "cpu": [ + "arm" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm64-gnu": { + "version": "1.30.2", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.30.2.tgz", + "integrity": "sha512-UK65WJAbwIJbiBFXpxrbTNArtfuznvxAJw4Q2ZGlU8kPeDIWEX1dg3rn2veBVUylA2Ezg89ktszWbaQnxD/e3A==", + "cpu": [ + "arm64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm64-musl": { + "version": "1.30.2", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.30.2.tgz", + "integrity": "sha512-5Vh9dGeblpTxWHpOx8iauV02popZDsCYMPIgiuw97OJ5uaDsL86cnqSFs5LZkG3ghHoX5isLgWzMs+eD1YzrnA==", + "cpu": [ + "arm64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-x64-gnu": { + "version": "1.30.2", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.30.2.tgz", + "integrity": "sha512-Cfd46gdmj1vQ+lR6VRTTadNHu6ALuw2pKR9lYq4FnhvgBc4zWY1EtZcAc6EffShbb1MFrIPfLDXD6Xprbnni4w==", + "cpu": [ + "x64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-x64-musl": { + "version": "1.30.2", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.30.2.tgz", + "integrity": "sha512-XJaLUUFXb6/QG2lGIW6aIk6jKdtjtcffUT0NKvIqhSBY3hh9Ch+1LCeH80dR9q9LBjG3ewbDjnumefsLsP6aiA==", + "cpu": [ + "x64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-win32-arm64-msvc": { + "version": "1.30.2", + "resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.30.2.tgz", + "integrity": "sha512-FZn+vaj7zLv//D/192WFFVA0RgHawIcHqLX9xuWiQt7P0PtdFEVaxgF9rjM/IRYHQXNnk61/H/gb2Ei+kUQ4xQ==", + "cpu": [ + "arm64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-win32-x64-msvc": { + "version": "1.30.2", + "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.30.2.tgz", + "integrity": "sha512-5g1yc73p+iAkid5phb4oVFMB45417DkRevRbt/El/gKXJk4jid+vPFF/AXbxn05Aky8PapwzZrdJShv5C0avjw==", + "cpu": [ + "x64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "js-tokens": "^3.0.0 || ^4.0.0" + }, + "bin": { + "loose-envify": "cli.js" + } + }, + "node_modules/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, + "license": "ISC", + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/magic-string": { + "version": "0.30.21", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz", + "integrity": "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==", + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.5" + } + }, + "node_modules/math-intrinsics": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", + "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/motion": { + "version": "12.26.2", + "resolved": "https://registry.npmjs.org/motion/-/motion-12.26.2.tgz", + "integrity": "sha512-2Q6g0zK1gUJKhGT742DAe42LgietcdiJ3L3OcYAHCQaC1UkLnn6aC8S/obe4CxYTLAgid2asS1QdQ/blYfo5dw==", + "license": "MIT", + "dependencies": { + "framer-motion": "^12.26.2", + "tslib": "^2.4.0" + }, + "peerDependencies": { + "@emotion/is-prop-valid": "*", + "react": "^18.0.0 || ^19.0.0", + "react-dom": "^18.0.0 || ^19.0.0" + }, + "peerDependenciesMeta": { + "@emotion/is-prop-valid": { + "optional": true + }, + "react": { + "optional": true + }, + "react-dom": { + "optional": true + } + } + }, + "node_modules/motion-dom": { + "version": "12.26.2", + "resolved": "https://registry.npmjs.org/motion-dom/-/motion-dom-12.26.2.tgz", + "integrity": "sha512-KLMT1BroY8oKNeliA3JMNJ+nbCIsTKg6hJpDb4jtRAJ7nCKnnpg/LTq/NGqG90Limitz3kdAnAVXecdFVGlWTw==", + "license": "MIT", + "dependencies": { + "motion-utils": "^12.24.10" + } + }, + "node_modules/motion-utils": { + "version": "12.24.10", + "resolved": "https://registry.npmjs.org/motion-utils/-/motion-utils-12.24.10.tgz", + "integrity": "sha512-x5TFgkCIP4pPsRLpKoI86jv/q8t8FQOiM/0E8QKBzfMozWHfkKap2gA1hOki+B5g3IsBNpxbUnfOum1+dgvYww==", + "license": "MIT" + }, + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true, + "license": "MIT" + }, + "node_modules/nanoid": { + "version": "3.3.11", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", + "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", + "dev": true, + "license": "MIT" + }, + "node_modules/node-releases": { + "version": "2.0.27", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.27.tgz", + "integrity": "sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA==", + "dev": true, + "license": "MIT" + }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-inspect": { + "version": "1.13.4", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", + "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.assign": { + "version": "4.1.7", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.7.tgz", + "integrity": "sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0", + "has-symbols": "^1.1.0", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.entries": { + "version": "1.1.9", + "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.9.tgz", + "integrity": "sha512-8u/hfXFRBD1O0hPUjioLhoWFHRmt6tKA4/vZPyckBr18l1KE9uHrFaFaUi8MDRTpi4uak2goyPTSNJLXX2k2Hw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.fromentries": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.8.tgz", + "integrity": "sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.values": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.2.1.tgz", + "integrity": "sha512-gXah6aZrcUxjWg2zR2MwouP2eHlCBzdV4pygudehaKXSGW4v2AsRQUK+lwwXhii6KFZcunEnmSUoYp5CXibxtA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/ogl": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/ogl/-/ogl-1.0.11.tgz", + "integrity": "sha512-kUpC154AFfxi16pmZUK4jk3J+8zxwTWGPo03EoYA8QPbzikHoaC82n6pNTbd+oEaJonaE8aPWBlX7ad9zrqLsA==", + "license": "Unlicense" + }, + "node_modules/optionator": { + "version": "0.9.4", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", + "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", + "dev": true, + "license": "MIT", + "dependencies": { + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0", + "word-wrap": "^1.2.5" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/own-keys": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/own-keys/-/own-keys-1.0.1.tgz", + "integrity": "sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg==", + "dev": true, + "license": "MIT", + "dependencies": { + "get-intrinsic": "^1.2.6", + "object-keys": "^1.1.1", + "safe-push-apply": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, + "license": "MIT", + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true, + "license": "MIT" + }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "license": "ISC" + }, + "node_modules/picomatch": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", + "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", + "license": "MIT", + "peer": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/possible-typed-array-names": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.1.0.tgz", + "integrity": "sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/postcss": { + "version": "8.5.6", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.6.tgz", + "integrity": "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "nanoid": "^3.3.11", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/postcss-value-parser": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", + "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", + "license": "MIT" + }, + "node_modules/prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/prettier": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.5.3.tgz", + "integrity": "sha512-QQtaxnoDJeAkDvDKWCLiwIXkTgRhwYDEQCghU9Z6q03iyek/rxRh/2lC3HB7P8sWT2xC/y5JDctPLBIGzHKbhw==", + "dev": true, + "license": "MIT", + "bin": { + "prettier": "bin/prettier.cjs" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/prettier/prettier?sponsor=1" + } + }, + "node_modules/prop-types": { + "version": "15.8.1", + "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", + "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", + "dev": true, + "license": "MIT", + "dependencies": { + "loose-envify": "^1.4.0", + "object-assign": "^4.1.1", + "react-is": "^16.13.1" + } + }, + "node_modules/punycode": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/react": { + "version": "19.2.3", + "resolved": "https://registry.npmjs.org/react/-/react-19.2.3.tgz", + "integrity": "sha512-Ku/hhYbVjOQnXDZFv2+RibmLFGwFdeeKHFcOTlrt7xplBnya5OGn/hIRDsqDiSUcfORsDC7MPxwork8jBwsIWA==", + "license": "MIT", + "peer": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-dom": { + "version": "19.2.3", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.2.3.tgz", + "integrity": "sha512-yELu4WmLPw5Mr/lmeEpox5rw3RETacE++JgHqQzd2dg+YbJuat3jH4ingc+WPZhxaoFzdv9y33G+F7Nl5O0GBg==", + "license": "MIT", + "peer": true, + "dependencies": { + "scheduler": "^0.27.0" + }, + "peerDependencies": { + "react": "^19.2.3" + } + }, + "node_modules/react-is": { + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/react-refresh": { + "version": "0.17.0", + "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.17.0.tgz", + "integrity": "sha512-z6F7K9bV85EfseRCp2bzrpyQ0Gkw1uLoCel9XBVWPg/TjRj94SkJzUTGfOa4bs7iJvBWtQG0Wq7wnI0syw3EBQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/reflect.getprototypeof": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.10.tgz", + "integrity": "sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.9", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "get-intrinsic": "^1.2.7", + "get-proto": "^1.0.1", + "which-builtin-type": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/regexp.prototype.flags": { + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.4.tgz", + "integrity": "sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-errors": "^1.3.0", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "set-function-name": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve": { + "version": "2.0.0-next.5", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.5.tgz", + "integrity": "sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-core-module": "^2.13.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/rollup": { + "version": "4.55.1", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.55.1.tgz", + "integrity": "sha512-wDv/Ht1BNHB4upNbK74s9usvl7hObDnvVzknxqY/E/O3X6rW1U1rV1aENEfJ54eFZDTNo7zv1f5N4edCluH7+A==", + "license": "MIT", + "dependencies": { + "@types/estree": "1.0.8" + }, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=18.0.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "@rollup/rollup-android-arm-eabi": "4.55.1", + "@rollup/rollup-android-arm64": "4.55.1", + "@rollup/rollup-darwin-arm64": "4.55.1", + "@rollup/rollup-darwin-x64": "4.55.1", + "@rollup/rollup-freebsd-arm64": "4.55.1", + "@rollup/rollup-freebsd-x64": "4.55.1", + "@rollup/rollup-linux-arm-gnueabihf": "4.55.1", + "@rollup/rollup-linux-arm-musleabihf": "4.55.1", + "@rollup/rollup-linux-arm64-gnu": "4.55.1", + "@rollup/rollup-linux-arm64-musl": "4.55.1", + "@rollup/rollup-linux-loong64-gnu": "4.55.1", + "@rollup/rollup-linux-loong64-musl": "4.55.1", + "@rollup/rollup-linux-ppc64-gnu": "4.55.1", + "@rollup/rollup-linux-ppc64-musl": "4.55.1", + "@rollup/rollup-linux-riscv64-gnu": "4.55.1", + "@rollup/rollup-linux-riscv64-musl": "4.55.1", + "@rollup/rollup-linux-s390x-gnu": "4.55.1", + "@rollup/rollup-linux-x64-gnu": "4.55.1", + "@rollup/rollup-linux-x64-musl": "4.55.1", + "@rollup/rollup-openbsd-x64": "4.55.1", + "@rollup/rollup-openharmony-arm64": "4.55.1", + "@rollup/rollup-win32-arm64-msvc": "4.55.1", + "@rollup/rollup-win32-ia32-msvc": "4.55.1", + "@rollup/rollup-win32-x64-gnu": "4.55.1", + "@rollup/rollup-win32-x64-msvc": "4.55.1", + "fsevents": "~2.3.2" + } + }, + "node_modules/safe-array-concat": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.3.tgz", + "integrity": "sha512-AURm5f0jYEOydBj7VQlVvDrjeFgthDdEF5H1dP+6mNpoXOMo1quQqJ4wvJDyRZ9+pO3kGWoOdmV08cSv2aJV6Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.2", + "get-intrinsic": "^1.2.6", + "has-symbols": "^1.1.0", + "isarray": "^2.0.5" + }, + "engines": { + "node": ">=0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/safe-push-apply": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/safe-push-apply/-/safe-push-apply-1.0.0.tgz", + "integrity": "sha512-iKE9w/Z7xCzUMIZqdBsp6pEQvwuEebH4vdpjcDWnyzaI6yl6O9FHvVpmGelvEHNsoY6wGblkxR6Zty/h00WiSA==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "isarray": "^2.0.5" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/safe-regex-test": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.1.0.tgz", + "integrity": "sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "is-regex": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/scheduler": { + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.27.0.tgz", + "integrity": "sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q==", + "license": "MIT" + }, + "node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/set-function-length": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", + "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", + "dev": true, + "license": "MIT", + "dependencies": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/set-function-name": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.2.tgz", + "integrity": "sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "functions-have-names": "^1.2.3", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/set-proto": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/set-proto/-/set-proto-1.0.0.tgz", + "integrity": "sha512-RJRdvCo6IAnPdsvP/7m6bsQqNnn1FCBX5ZNtFL98MmFF/4xAIJTIg1YbHW5DC2W5SKZanrC6i4HsJqlajw/dZw==", + "dev": true, + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/shallowequal": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/shallowequal/-/shallowequal-1.1.0.tgz", + "integrity": "sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ==", + "license": "MIT" + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "license": "MIT", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/side-channel": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz", + "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3", + "side-channel-list": "^1.0.0", + "side-channel-map": "^1.0.1", + "side-channel-weakmap": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-list": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz", + "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-map": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz", + "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-weakmap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", + "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3", + "side-channel-map": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/source-map-js": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/stop-iteration-iterator": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/stop-iteration-iterator/-/stop-iteration-iterator-1.1.0.tgz", + "integrity": "sha512-eLoXW/DHyl62zxY4SCaIgnRhuMr6ri4juEYARS8E6sCEqzKpOiE521Ucofdx+KnDZl5xmvGYaaKCk5FEOxJCoQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "internal-slot": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/string.prototype.matchall": { + "version": "4.0.12", + "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.12.tgz", + "integrity": "sha512-6CC9uyBL+/48dYizRf7H7VAYCMCNTBeM78x/VTUe9bFEaxBepPJDa1Ow99LqI/1yF7kuy7Q3cQsYMrcjGUcskA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.6", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "get-intrinsic": "^1.2.6", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "internal-slot": "^1.1.0", + "regexp.prototype.flags": "^1.5.3", + "set-function-name": "^2.0.2", + "side-channel": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.repeat": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/string.prototype.repeat/-/string.prototype.repeat-1.0.0.tgz", + "integrity": "sha512-0u/TldDbKD8bFCQ/4f5+mNRrXwZ8hg2w7ZR8wa16e8z9XpePWl3eGEcUD0OXpEH/VJH/2G3gjUtR3ZOiBe2S/w==", + "dev": true, + "license": "MIT", + "dependencies": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.5" + } + }, + "node_modules/string.prototype.trim": { + "version": "1.2.10", + "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.10.tgz", + "integrity": "sha512-Rs66F0P/1kedk5lyYyH9uBzuiI/kNRmwJAR9quK6VOtIpZ2G+hMZd+HQbbv25MgCA6gEffoMZYxlTod4WcdrKA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.2", + "define-data-property": "^1.1.4", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.5", + "es-object-atoms": "^1.0.0", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimend": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.9.tgz", + "integrity": "sha512-G7Ok5C6E/j4SGfyLCloXTrngQIQU3PWtXGst3yM7Bea9FRURf1S42ZHlZZtsNque2FN2PoUhfZXYLNWwEr4dLQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.2", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimstart": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz", + "integrity": "sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/styled-components": { + "version": "6.3.8", + "resolved": "https://registry.npmjs.org/styled-components/-/styled-components-6.3.8.tgz", + "integrity": "sha512-Kq/W41AKQloOqKM39zfaMdJ4BcYDw/N5CIq4/GTI0YjU6pKcZ1KKhk6b4du0a+6RA9pIfOP/eu94Ge7cu+PDCA==", + "license": "MIT", + "dependencies": { + "@emotion/is-prop-valid": "1.4.0", + "@emotion/unitless": "0.10.0", + "@types/stylis": "4.2.7", + "css-to-react-native": "3.2.0", + "csstype": "3.2.3", + "postcss": "8.4.49", + "shallowequal": "1.1.0", + "stylis": "4.3.6", + "tslib": "2.8.1" + }, + "engines": { + "node": ">= 16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/styled-components" + }, + "peerDependencies": { + "react": ">= 16.8.0", + "react-dom": ">= 16.8.0" + }, + "peerDependenciesMeta": { + "react-dom": { + "optional": true + } + } + }, + "node_modules/styled-components/node_modules/postcss": { + "version": "8.4.49", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.49.tgz", + "integrity": "sha512-OCVPnIObs4N29kxTjzLfUryOkvZEq+pf8jTF0lg8E7uETuWHA+v7j3c/xJmiqpX450191LlmZfUKkXxkTry7nA==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "nanoid": "^3.3.7", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/stylis": { + "version": "4.3.6", + "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.3.6.tgz", + "integrity": "sha512-yQ3rwFWRfwNUY7H5vpU0wfdkNSnvnJinhF9830Swlaxl03zsOjCfmX0ugac+3LtK0lYSgwL/KXc8oYL3mG4YFQ==", + "license": "MIT" + }, + "node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/tailwind-merge": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/tailwind-merge/-/tailwind-merge-3.4.0.tgz", + "integrity": "sha512-uSaO4gnW+b3Y2aWoWfFpX62vn2sR3skfhbjsEnaBI81WD1wBLlHZe5sWf0AqjksNdYTbGBEd0UasQMT3SNV15g==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/dcastil" + } + }, + "node_modules/tailwindcss": { + "version": "4.1.18", + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-4.1.18.tgz", + "integrity": "sha512-4+Z+0yiYyEtUVCScyfHCxOYP06L5Ne+JiHhY2IjR2KWMIWhJOYZKLSGZaP5HkZ8+bY0cxfzwDE5uOmzFXyIwxw==", + "license": "MIT" + }, + "node_modules/tapable": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.3.0.tgz", + "integrity": "sha512-g9ljZiwki/LfxmQADO3dEY1CbpmXT5Hm2fJ+QaGKwSXUylMybePR7/67YW7jOrrvjEgL1Fmz5kzyAjWVWLlucg==", + "license": "MIT", + "engines": { + "node": ">=6" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/tinyglobby": { + "version": "0.2.15", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.15.tgz", + "integrity": "sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==", + "license": "MIT", + "dependencies": { + "fdir": "^6.5.0", + "picomatch": "^4.0.3" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/SuperchupuDev" + } + }, + "node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "license": "0BSD" + }, + "node_modules/type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dev": true, + "license": "MIT", + "dependencies": { + "prelude-ls": "^1.2.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/typed-array-buffer": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.3.tgz", + "integrity": "sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "is-typed-array": "^1.1.14" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/typed-array-byte-length": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.3.tgz", + "integrity": "sha512-BaXgOuIxz8n8pIq3e7Atg/7s+DpiYrxn4vdot3w9KbnBhcRQq6o3xemQdIfynqSeXeDrF32x+WvfzmOjPiY9lg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "for-each": "^0.3.3", + "gopd": "^1.2.0", + "has-proto": "^1.2.0", + "is-typed-array": "^1.1.14" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typed-array-byte-offset": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.4.tgz", + "integrity": "sha512-bTlAFB/FBYMcuX81gbL4OcpH5PmlFHqlCCpAl8AlEzMz5k53oNDvN8p1PNOWLEmI2x4orp3raOFB51tv9X+MFQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.8", + "for-each": "^0.3.3", + "gopd": "^1.2.0", + "has-proto": "^1.2.0", + "is-typed-array": "^1.1.15", + "reflect.getprototypeof": "^1.0.9" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typed-array-length": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.7.tgz", + "integrity": "sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "is-typed-array": "^1.1.13", + "possible-typed-array-names": "^1.0.0", + "reflect.getprototypeof": "^1.0.6" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/unbox-primitive": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.1.0.tgz", + "integrity": "sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "has-bigints": "^1.0.2", + "has-symbols": "^1.1.0", + "which-boxed-primitive": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/update-browserslist-db": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.2.3.tgz", + "integrity": "sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "escalade": "^3.2.0", + "picocolors": "^1.1.1" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/vite": { + "version": "6.4.1", + "resolved": "https://registry.npmjs.org/vite/-/vite-6.4.1.tgz", + "integrity": "sha512-+Oxm7q9hDoLMyJOYfUYBuHQo+dkAloi33apOPP56pzj+vsdJDzr+j1NISE5pyaAuKL4A3UD34qd0lx5+kfKp2g==", + "license": "MIT", + "peer": true, + "dependencies": { + "esbuild": "^0.25.0", + "fdir": "^6.4.4", + "picomatch": "^4.0.2", + "postcss": "^8.5.3", + "rollup": "^4.34.9", + "tinyglobby": "^0.2.13" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^18.0.0 || ^20.0.0 || >=22.0.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0", + "jiti": ">=1.21.0", + "less": "*", + "lightningcss": "^1.21.0", + "sass": "*", + "sass-embedded": "*", + "stylus": "*", + "sugarss": "*", + "terser": "^5.16.0", + "tsx": "^4.8.1", + "yaml": "^2.4.2" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "jiti": { + "optional": true + }, + "less": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + }, + "tsx": { + "optional": true + }, + "yaml": { + "optional": true + } + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/which-boxed-primitive": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.1.1.tgz", + "integrity": "sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-bigint": "^1.1.0", + "is-boolean-object": "^1.2.1", + "is-number-object": "^1.1.1", + "is-string": "^1.1.1", + "is-symbol": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-builtin-type": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/which-builtin-type/-/which-builtin-type-1.2.1.tgz", + "integrity": "sha512-6iBczoX+kDQ7a3+YJBnh3T+KZRxM/iYNPXicqk66/Qfm1b93iu+yOImkg0zHbj5LNOcNv1TEADiZ0xa34B4q6Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "function.prototype.name": "^1.1.6", + "has-tostringtag": "^1.0.2", + "is-async-function": "^2.0.0", + "is-date-object": "^1.1.0", + "is-finalizationregistry": "^1.1.0", + "is-generator-function": "^1.0.10", + "is-regex": "^1.2.1", + "is-weakref": "^1.0.2", + "isarray": "^2.0.5", + "which-boxed-primitive": "^1.1.0", + "which-collection": "^1.0.2", + "which-typed-array": "^1.1.16" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-collection": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.2.tgz", + "integrity": "sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-map": "^2.0.3", + "is-set": "^2.0.3", + "is-weakmap": "^2.0.2", + "is-weakset": "^2.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-typed-array": { + "version": "1.1.20", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.20.tgz", + "integrity": "sha512-LYfpUkmqwl0h9A2HL09Mms427Q1RZWuOHsukfVcKRq9q95iQxdw0ix1JQrqbcDR9PH1QDwf5Qo8OZb5lksZ8Xg==", + "dev": true, + "license": "MIT", + "dependencies": { + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "for-each": "^0.3.5", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/word-wrap": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", + "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true, + "license": "ISC" + }, + "node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + } + } +} diff --git a/Server/package.json b/Server/package.json new file mode 100644 index 0000000..6aab6b4 --- /dev/null +++ b/Server/package.json @@ -0,0 +1,41 @@ +{ + "name": "react-starter-kit-for-appwrite", + "private": true, + "version": "0.0.0", + "type": "module", + "scripts": { + "dev": "vite", + "build": "vite build", + "lint": "eslint .", + "preview": "vite preview" + }, + "dependencies": { + "@appwrite.io/pink-icons": "^1.0.0", + "@gsap/react": "^2.1.2", + "@tabler/icons-react": "^3.36.1", + "@tailwindcss/vite": "^4.0.14", + "appwrite": "^21.2.1", + "clsx": "^2.1.1", + "gsap": "^3.14.2", + "motion": "^12.26.2", + "ogl": "^1.0.11", + "react": "^19.0.0", + "react-dom": "^19.0.0", + "styled-components": "^6.3.8", + "tailwind-merge": "^3.4.0", + "tailwindcss": "^4.0.14" + }, + "devDependencies": { + "@eslint/js": "^9.19.0", + "@types/react": "^19.0.8", + "@types/react-dom": "^19.0.3", + "@vitejs/plugin-react": "^4.3.4", + "eslint": "^9.19.0", + "eslint-plugin-react": "^7.37.4", + "eslint-plugin-react-hooks": "^5.0.0", + "eslint-plugin-react-refresh": "^0.4.18", + "globals": "^15.14.0", + "prettier": "3.5.3", + "vite": "^6.1.0" + } +} diff --git a/Server/public/assets/background.png b/Server/public/assets/background.png new file mode 100644 index 0000000000000000000000000000000000000000..8f91c6524432b13c6207ad1dcefab5367d08c9b5 GIT binary patch literal 796631 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 z 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 Ml{J;J6ffWWAB!hbNB{r; literal 0 HcmV?d00001 diff --git a/Server/public/assets/logos/logo-horizontal.png b/Server/public/assets/logos/logo-horizontal.png new file mode 100644 index 0000000000000000000000000000000000000000..0d6261deb3f62f38347f15dff88ef077f8924d31 GIT binary patch literal 9651 zcmaKS1xy@3x9;w;xZC1dT#CCb?zU(t#kNS1LUCso*J8z?P$=$Rptu!xDaD~caVZq% za^Fi{@^bUvOlHo^Ir(xjIp3U_Oiq-JmNG6DB^Cexz*SXIfIUlt=Z?TYdmeq!mPW+*Io!m6iRQv6J!MRfpe$wBtT2_NA!yRLO0v@7p_O#P0n4aMviuQH%IfN;RxG z^fHF^|HJegN6!2Ys;TDc&A8Vl&*OP@UL){=iQ7Yvy2m8Kvn@WK_j;RE<}t-=pY+@d zYc}Zib^*S&Np$-l4S|qN**De%Jq6yc|9TY4tV|X6-&4BWBcrt>+@QPt(!4cWs%Pi5 zBpPrlh({|KS#SHfCs|wiCZ!{`lPa&{hTFOOd^+&2uN1Z9x8Q%BPY?Tz)d5FwK4#09 z>sp0-k-Ij--8+o=J;hDH`XG{3e?(%$os54J{R0G}?i9ES2dv7t= z!LHXMWb%){9ioZwH(Q zN@t3B$?@@;&}8A_Ch-&_QI^O zo%_TW5%ILGX9HAOacF40K-#-a_&4tjMwa<1_WaxfkJgi_IR`kfrg5eF_V&^XeP;x7 zk81UlC0o*m=s7Gsc7o!<5(0PT={G47zkYcio(+CD+f>B4MZt-9A$pM47|z$q!${XO z|2Q$_?f!H%e#LA_C1xm`5$g;(O;&amzom)uMTv-~9`KfYro=#?&0|=`{2}a_CO`Ap z!Y?Yt=NGDEczJYmBvU?TKS(vU`WvP0!8k)Tt(0TwK21N4u;FI+c44Gl+_cYLF`KmPcaO@U!ned$yFHrzkaEP`}Be zFQM4iIHme2YVv}h8ng1Czll7Op&1#dhsW>DE*GD1*R9oUR1$3xdsn`@J3G7PS=K-6 z>LDxd$;Lmt#lKK6US3_g&x10GmMnB?C$=`O9ItPN zVUy!Vbc$qrb5r;WauT#}q^y&?JG~kor*m|CZ}ILO>dJAw+bDeS<7Usz#dUrB;~z2G zBV~qQ-}aA^6N$TG4fE1_?;cujZf=}knVR-R5jUGQJ9Hdp`W_6uu6^nP`X4QF~BK{|!R zFNwX&+lMKazmF!Bo-ismC>07^5PY6dtR>UZ)YurMwcApd`fn{rCc7T-gA$kpmizqM zBJrg_P;g}4r(izcrXMj24}0h= zhx6QrmfY3mZ{M!xP&iNs04q6ohDJtwwO7o^Q8`Ed?xYz7)|%Ve+Vp0lv+B7brYON0 z3fF&Kc)PrrGm#reITQ-F6{wxFqQ4KfbrJ%8Q zTkv;TY<5XNY^({N&PZP`(9N!nJYg<5r0Ha3bkkLucR74s77S9g`GQTY)72qf8b;AW zjXh^nQQrB~EVF#O=wKdzA7dd%37l^|`4evzu%r02QzY~Gb%zj@v-}}J(}1u4_Gf2K zy!P#H>4t6N-`jn=ZQYnTw#WDH+-r1eTmrj+h4SeN ze}|s_ep6<(B`|N^#$nIdmL3)XxqVo8(rUk%R!=^wY#XOpbY0%=e!mKEmxpR%__io{ ziH5SsRsRaZ32*JJz1kUM#orj+TtU<$cvVVU?Ssx}_It#>RJ{Bo6zbm1E0!#*k+H$! zBG)yot%@0xRyAs!T#@E$qL>sA9ST=k9#_9(-86Zryig= zaSKZy^MMHG`=14a@%~;8l6`!;yrFr6kdQNSPkv+_!t+GQs>u+)DH@(su)?MY@L$D$8Towj2~C71u<8Y~=|Pe0nk&&4Be zXteKOi@twnuXxq1S6oF?u!~bxwF|8egtncjr!p*>&jJep1;7FZE(Bu@i~v9|U?Dot zcI^E^*!dfZn^kQoxd@vDDxiyCguv4RQgdPX5jDNG_>2ZUh*-#JL&1`-4U@YO3;{|2 z`9kOsynTG36z!@X<)vhQIpr6Si044AGT=YvIPk-iwlp9aGWz%K1$%8mj{61n0G>eV+jgc)yKQGrOA(Wd%7)n6^j09k) zkO$bhbdSMpSwo0WD>0*cb`^C3`*)>4J&S}8O7k8O>HvZk$|Bd+8iWeH+-Dmoy~YLr zFa>DV5O$%2>{4aOdEd2a}yMM@0f!={sJ_g<1 zCl?vcKwKtdN}>gHKFg!^zV1823Dq@o3PnK}0>A{pM0syU^NpNk9gt{942;)6Mufb% zcF&mtc%BH$9qQQ42=Ivu^`^hSkxbw0sbYIlR)XVTl2dg0aN!Ul5t3b2oVzGs$UI;8 zmb(fsm=eG)UKi9P%o%*-fO;u*rcZ$fW&H@HZ;q)4?@BUmY7))|XQO6^7^8=-PJ32{ z$*!Jmr$~}>J%SW_I=qwBsg1ztd~K8VpstW4X)Xj*Qb&Wii`tXTN$WbA?J4LgYa@+5 z@+lIWai%WdV}b(;F`iQ6vAtayVVa1$pBS|`pSr_h^q>+uBU_jBw#r#xL@rR{#SekW zV#H$gX&ZXYF`zD>zIZjL9;gH`IqXMYD=W{fuo(2Rlo(~xhocYZC`&X?{IQ!F5u%pH zX-Pxq%}6h>I?d=gN_1&0n~q0JVs<;TfHvdCA2jUNm5%zsKUTC1nB*)^9|vX^N}`|| zvleBuvlPAh5EoqTqMD_qBXx~e|B8$Wpzgwn-1hVE-1t89k!U`UFv%KFG@!La;@{ z4ee;sBQaEb#t-ln5tC7aUK5!%flfHjJ2Ke9wDZ6e^*Ht2jM>HzX_y3J?CtWp5v5iIFD!ncBr)=KBDk7)mN6Wui1Y_!kQb zDkQihQ9$s@g0kqp^x_5_J^MhJds`H~5g~2acjjafF+J}u+ox=WTqN+xMtK#}#9s5d zA?Zq#)q)IUh@msODa6h}gAzVqXVV@D=J+D{t_WYhuqmkz-lv)5>SWpe+W~|6mqW23 z2u4z5QPQIih^%<4#`AmO2cSyocHuy$T-^<4`S6d%(k{P+f$j&K50KYB*a0i2OKgBP z4680h$vh(3M=3e27lQ6QcA3{*OuFizqtcf$!N*>h1_6J4fCg;(98K3?C}NbYWW9it za8o9T!(>v4W|%)N=AJEU2P)=)KM$9j0fiI`(24{*toUa!4Mx3{?1;{Yxe%$T=cG;yYBGrzUocV#c zsNyy%Tiu=BpP@8s4=|ldwCR2F>^CagAK5a*D^MJvESdb+O_X=MNK7Q7sfvbX$RBkV zTpaC8V?=Ok$)63{iz~rlBvFa!V`ooJXuIlN09%N~(uIo_W`f#!@z;B|BN|8X=4M)H zzO*?$fq#<7C8?(coiVg7|8nCj)lolD1O@r`8qPTa5NohHvLLl%<^?BP?%*vFOtz72 zq2#5Lz&)3)ew@-!U-m^69>Ayrg1C~{81H<-@g{?;fEfh9l_2?<&xTl6!+K~$fMOyvP27}V|T}3E8xxBKW zN&l$a!B5PYMqLg)sM)QPK%XmU+-EYsL-%hCX=VXQR~LZt^=1FtkE_-y>&<>!SzfMY z4%8?DMY!@?>trDp#8v(bYGsJf=5Ow-mj7U&luzPlTq!V0i*i1}zlb-h}aW6TFI|kQ$yE-$jrgaq6zN5L}L&;t&SAJ+>Du zg%SB>Xvb9nhDiHLn0iPTwyHI{fTmh6lV1ELLS%&C|3lXw&Pwbv#POp$d4mV(+D{;g z^9$T?#@ye|GDn$pqt}a2^v6rJ@uQ%eR(jr~6dmB8^);A2EF>XANMV+bD8%Zz8El~S z24OD@HOZyVBOHquHc^zUM-QWLr0Fwpgw*dHwDMppRca6GgZd2Dr-iUTiH`oxDLyNh zb2a>mZ3+~-{g;3iq5nx<=RD>kwR}=_7(qjR9W7xnY2?)*1I8eg{$Ra@FYb;r$!QXq zTt(ZPib^h17@twPJm3@+PV}^-j96y z(6QVsZXlS{4Zhe~_d)mSn<#{@BN}gs2IO?u6TrEY*h&oLEv8#Snv=tA)-YY4YAykv zG3Ju!9hBNp8uj)LHX7_-3>)7hU*Jp_FsJJ_W~Tf=qsgcy6=1AGF%5XT_e$2l2S{H3 zV}2FvpchQu=-^DjeXU|?44ltI@7@f7+yzov@fwAajKT3}&4+mv^!^ch@ckb4+2Ry`&+lWD2d&{sSSKTyQmgu#1en0s7ue^clL5|^$Xo9a z@X@hp#&&=4qX;227^UhVPwMe?`k>v-#BSzF_vk^kjD#btk(&(rv)Xe!nCrUHo@OZB z!@2RqG*GT(mwXHyNI3lEP#{PoaIjoWLz`ifJymYAOxoL$VPf`+Z`B#@i7%R>Ka0+w zDZ0=;f=?vG4pNr}G0dcef2^@^>?TWaR>4p;}4 z!H33$w|~_0f_k-IzcHx_izF#NHWd=KSX_qjr}?}<@v&Z7fe9i2N#^;OcD z^9H|qg+}t;)`r{itmp8BxDiN+86iua^Bt)buo`6MkJ^48eeH@&NxCwm#a)rt^ct~$ zFq1Y!E2-m8zBfC}za9>XyiaNP)F0-^;c9@y9xOL}0wTvTDmW-{39?&T!dV7{TEyQ^ zfXi|+P@n#=;u61Cm)0YPeX9t;qMbwG{D-4b}9+HL(PK>O}?;?yNY3+UQJ+LyaCn|oD%)eY(YRtU_qLn zD!5VR_3h2veT4FHsJ$T6$1_>9nP5Z}7S+(BODCDi%%Z})y#-u!!;l6f4JDQ>3h;;v5`<&Hsp9ZV4mEZ~YUE_2AHBZYDG=+BBxdz%RL?(u zRCcuU*-gAbZUOCxmhWkMx*0W!_&7}Fl&_c86FkD8!~Q!KY4^keo-r&- zul6pJdCL1&rGp`bgxS3Ai6t?{4dx*=D?91v4Oj06`ThtwAq|rKvYZ+znkFm95k)wJp-JOqeg$Ba^SgMOy(*Hz1Yobj z2-K|Yb9KY4)c;<7q%r+blV|m%c-9^Ej(KkTLt+j!h}i6G+yQJrCNw#;g*ZK`f%JV) z;ExTB0I5|Z4}_b{#$Mh^YbYEIz1>_7KCu(X#sKiF>IhIi8{4J4 zMmjeO|kc3TDoN} zM(V(+d&Lqt+ro1ZNTK{m6aW@D-9Pa`R|TuU{Ayyx1-?v=h}^q|wMT_u8*Tn;kWM)l z@7qJQ6w6#{V7OK4pa@ZZ%k>$TKqVJi$pDw*;0E~r8?zzCr70by?J%s@G_ap;g;>hKFY;#&Myfz zKjxCFJ>9=lV&ulwiKJTNc<)-j@)v@!2!#yOmGf&-#v&*Hp}-}nG*hL=gmlJt#JtHK zx-(m9zuKaqq)}=E$yMwc1qt}k^rW*~Hbzl7w|Mp{N&w9ICQ#*8HMTBgW=x3a*Lxi_ zv0xT4f4h0XjHwRC+iSIpPWOHPk}vyNIVzmdpQM36l~yKLu#nrV5|Q0pP88as5K=v&g;(C_okzCX6M+R;kQ z$*Xv-gJ@Wu?pMR|u}byvwNSkx447?nW#Vehfn@{a=~*Z-%RQqkHac_YZE6KPXhe{% zSBEy5hc?_U7)pU$GN-f8M?-8)v2y-Z4)JU$_88%}1kDfW8PPUF9rx)2HSi<)yx(QN z6=hA#8)uD+DhoLo80`$WNqyHJMBCR0JQMpZ51-Q($LBawtDDNp5gn5MZA>8en8qYdCm znEr-C=aX(x#j(rR&7Lo%gNtlemMR(5*J<+gE|Fr=X+DVs(<7Ml8g{>>*sS5QqDYvq z>?VIt-#Zw4Xx0ozK@xL(HCTx5&x>|g2O~9jyk|v? z1fl98Nt76t1wCUpn>^kx4?Y#;>{r1+gc9g!Y5ZF~=^Ogl(yGy!`}x!tdK^BsDU=+z z7zSK&_iocrw}CD@*M9 zI7=gz?sZMn=yIHthDAZT^6d64D$~$S%$-p@tBg0H$(|t`GeNcfr1*6azWsuYt!Jc~ zsValhgEMCA9M0SHj1x?lmQ^XTSS53qh-atWZ<$8q(g|gEDaJZyj^qyeevcI;V3ARs zK-pgfnZimd2ylihIL$*vcQv!v00S-<+!fK->~G$m{(66iK9haoRtPc$zaZ7n{ov~= zrWsm3n!{?15hy5LCY8K!R&R-5BsDe8Yv}Rb^k|R z=tuRseY~K3V;$xZD{-$TYoB}VK7-7`mhx0uo1H8ji;z?M%9DNmC@M`cqaXP-az7ht z8A~yP-ourl|FKrN(rR5po+IUTpy+t9Vab#=g>yx#7%S%9-cxx?5I84fX>b!)V4Y>z za^&RpKEBhk_lViIzM`Qsr^VL z7|G!4zk(i@!lH6D2|n)cBI$5fd^-;wA5e0sp9Y-T=n!Qmb7P#)G57G0?6aH4E1o9S zWTDFXli^R|uh@jL-lbS8y;z{k{KT`L#Iw!uVNtk#uM};)r``P>GOe(z$HLH$x)S5w zN!p$yn$hok8d}cCiNV9Bc41@|Cn>A_*l_EE8Rb+M`TX~!mwu9;pc}Rf>Uv8w96bK| zj~#tHUhCD7%te*+{bc<8NIVKi^7eE4+!H7CO*4w10Sd+M2l>kz^BaY`QRle?I-$u3 z($d}xSOkCJ`yaBL8AXM$vy#Xitj&Qfk72K-rXMi0X|&<($7(!ybfU!zg~jwKu-nMH z&{hgY!wY8AkJq)shfv2f)|gV>aKwuUPj#Wmfi;py%FIA8W2+6v3YvfgD-K)NE2U27 zr?0;nWh6Tjq^_I%WWvAGOJ1#VVv8FgZXtkm=|>4c>4iWn&0$ZBzhbDDEx{zI8pvGo z%9*T0vU*~Batp&eh}-Gog@nY&iXMKIIDh%qdISD`{tW+D)<3hy>nI96-u&3+6=P3E zVL|zWV?q&05N(3)F(=DbRS5Vt2rSv=PB@f0U;9zU@g6w>BT>-zzW(KR&tv*&R0pOy z>Tu${`Mr~Fq-3qWbM@V?+$y2D!ihDJf$oCP!8I@DJZ)_IPbX2|)mZ>6-uQ@*CIdU( zRR8i5vPXF%a4_ro^JcIp#V||kx++$qhR}o5;J?Q~{f@*L?{rhgh^La+0szC*Oet$n z@z==dk>TyTbo-0%Cs99hF4|k)=S^ll#P_p7*^$!#c2q^u<~mlC$j-uTZpLv;m+ZWc zkLLOuqA{OTRn{pYFDf33vA|ml=Hxib+HYEUZ>q8HX323Xmcf!Yzg&g(svg4Enn8#d z8GAb*#nD5TW)SFYE@}x-@-N}~UJSKHCBF6T*LOKRf6>`-w^8ktwetUc`Df2n1$kL6 z1Ra~7%y}hw@#&2{SzQuUg-tjFbf09jj4KQc*ak&PH6Y%49e!R z>=JsigAZSH*8%QQQbW`>=-I^*Y#U@mjP(^Rifsle2fa+?Ifa)187$W`keQsOTpdI!x9 zL0)ncI7@o01;0!z?Q1p##1P_FJl5(z%V`lV-O9uQOB|D+Pk#b(r*G+bf8sNvNBss6 zR@!ThuoQ$Xm$YydWN;Ojr0N!tmJS)$v>b(JWgUOXak`msNLxlXxv;Ns>9Tkz<(2R>b^0Dy3 zCNLyGWs`sBn%q-e{I0SKFFlrmc;tGt8t4_+w!ZOic+HdIe<|qsj}v?>U=ZYm}cSU3Ox0deK;&4~%X93{nTfP(dQKu7Z4NY7vSXO73bwe)oc9n z{{ftw-@dc)`Og4%JY1S*0Nelb;Qr3Z+Rfe4$>o1y1cd&tlUPd%n`aC_RZ&Z!O3otq FzW@Z%2!Q|q literal 0 HcmV?d00001 diff --git a/Server/public/assets/logos/logo-square.png b/Server/public/assets/logos/logo-square.png new file mode 100644 index 0000000000000000000000000000000000000000..e63ad7dbb14006322439eb4aaaeb9312750df6cd GIT binary patch literal 1202 zcmeAS@N?(olHy`uVBq!ia0vp^0zfRm!3HEhFR0}KQVPi)LB0$ORcZ_j4J`}|zkosw zFBlj~4Hy_+B``2p&0t^9bSL=1)l#Ia+`I^S;Z4`=Yz%eo_==5)tT32ryLC3rL>O+9_x# zC9Wp5_!$3<7xE4Piv!K`uDtMiyh_`kYgfRL2G7|73Qm{P8VrILI4_@D{;SSL{yOWi z6`k2OyQ|Mf&Y66t_+gs!-|CI;S1#XKo5J#Qvd`uzVcBiD(eEE!_P2Zd=gIs37hdn@ z_kUA6scLUuY2S8!*(DKLe40zc7=JEy-~as7R7tb@8=vl%-Sg|#>kQcd4Uu2cy~qBY zyK`q<(asvp>8DGVEnBuv=B~l7%j@^csK0XE66MRl)G+_Bk$&~jt5H*Le|y8{_qXiR z+Re+)+uY7D;WL#Izb}7x!@hY(P98k@dGhh@r!}wt?DQu#DI{Iej(H+;#4edVOeOT6eB28tI z^G)08mn>Zd9PcyB*6lCc6%_rywD$IiEvwJ3kKbAGZE0!zj7@PmGBaZ~{av(MpfsEN zc+j7R8=2>>m#baxv!c5D3fn4;wPpQ$Ja3AdvrpQ8P|^-9{IF3}e(lcs)E-lX^7!Yo z^myl4B)j>|>78c#DKGVmwb0vDq9Jo3eV`MKJ%5EU72-IXQ2wqB*jw=-=2I{ zI8>A#vj2ORz+}Z^AxCFzO)`qw<#j%TX@20B+`JD`%Cme-tQeL`1jW7Tn03+4??a)D zj_0mJ%i2!wa+||p=dIx>ZNz+Sf~EU287{^pN(M@DPSclZMCe}QjnFqKwfB6Z@nXiJ z`RvJp+%ubem{|IQo(Np4(r+>A3ykW26cfMX^O+Y?YNam>7Co@?NE29X;MgGe_4?P& z4SA0uTGsW*A6|A-ZT2#q9}~2voJ?vr6Rf=6dPecsq)7iX*`@_k4q0A%Q?VnAQ_Bq3rZ?_3b)4qXxc)1X=F!gUk+1gk3ja@=5WKcPcEOaatfjM6b-#qNt+*C$ z`0ZTUH~9)xbCWgPo{gVMG~dQ^T)AYT=#yj|r^7P$x15Yp4M)Ph(#7Y!%MTstFL=eu z7jw_GG&y6+C$|<>*0TlyKLoafiEtmf@qBvTH|Ia`5BU40J&CE>a5^5CVO2|9BT7;d zOH!?pi&B9UgOP!enXZAMuAzB|fr*u|xs{=Xwt<0_fx&d4YuqRra`RI%(<*Umc;=tC o9jHMAZbM0CZfbE!Vr~JZ9#dn8CFbIy89+S@p00i_>zopr06p9cp#T5? literal 0 HcmV?d00001 diff --git a/Server/public/assets/logos/logo-vertical.png b/Server/public/assets/logos/logo-vertical.png new file mode 100644 index 0000000000000000000000000000000000000000..00e00af1baf7144e21de2bc4274d74df871c0cde GIT binary patch literal 2614 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 J*XcUN{|jeR*WCaB literal 0 HcmV?d00001 diff --git a/Server/src/App.jsx b/Server/src/App.jsx new file mode 100644 index 0000000..dda16f8 --- /dev/null +++ b/Server/src/App.jsx @@ -0,0 +1,376 @@ +"use client"; +import React, { useEffect, useState } from "react"; +import { Sidebar, SidebarBody, SidebarLink } from "./components/sidebar"; +import { + IconArrowLeft, + IconBrandTabler, + IconSettings, + IconUserBolt, + IconShoppingBag, +} from "@tabler/icons-react"; +import { motion } from "motion/react"; +import { cn } from "./lib/utils"; +import { BackgroundRippleEffect } from "./components/layout/BackgroundRippleEffect"; +import { Dashboard } from "./components/dashboard/Dashboard"; +import { AccountsPage } from "./pages/AccountsPage"; +import LogoutButton from "./components/ui/LogoutButton"; +import { OnboardingGate } from "./components/onboarding/OnboardingGate"; +import { SidebarHeader } from "./components/sidebar/SidebarHeader"; +import { useHashRoute } from "./lib/routing"; +import { account, databases, databaseId, usersCollectionId } from "./lib/appwrite"; + +export default function App() { + const { route, navigate } = useHashRoute(); + const [email, setEmail] = useState(""); + const [password, setPassword] = useState(""); + const [status, setStatus] = useState({ loading: true, authed: false, error: "" }); + const [sidebarOpen, setSidebarOpen] = useState(false); + + // Gate-Management State + const [authUser, setAuthUser] = useState(null); + const [hasUserDoc, setHasUserDoc] = useState(false); + const [checkingUserDoc, setCheckingUserDoc] = useState(false); + const [onboardingLoading, setOnboardingLoading] = useState(false); + const [onboardingError, setOnboardingError] = useState(""); + + const showGate = !hasUserDoc && !checkingUserDoc && authUser !== null; + + async function checkUserDocument(userId) { + if (!databases || !databaseId || !usersCollectionId) { + return false; + } + + try { + await databases.getDocument(databaseId, usersCollectionId, userId); + return true; // Dokument existiert + } catch (e) { + // 404 bedeutet, dass das Dokument nicht existiert - das ist OK + if (e.code === 404 || e.type === 'document_not_found') { + return false; // Dokument existiert nicht + } + // Andere Fehler: Loggen, aber nicht als kritischen Fehler behandeln + console.warn('Fehler beim Prüfen des User-Dokuments:', e.message || e); + return false; // Im Zweifel als "nicht vorhanden" behandeln + } + } + + async function refreshAuth() { + setStatus((s) => ({ ...s, loading: true, error: "" })); + setCheckingUserDoc(true); + setOnboardingError(""); + + try { + const user = await account.get(); // wirft Fehler, wenn keine Session + setAuthUser(user); + setStatus({ loading: false, authed: true, error: "" }); + + // Prüfe, ob User-Dokument existiert + const userDocExists = await checkUserDocument(user.$id); + setHasUserDoc(userDocExists); + + await handoffJwtToExtension(); + } catch (e) { + setStatus({ loading: false, authed: false, error: "" }); + setAuthUser(null); + setHasUserDoc(false); + } finally { + setCheckingUserDoc(false); + } + } + + async function login(e) { + e.preventDefault(); + setStatus((s) => ({ ...s, loading: true, error: "" })); + setCheckingUserDoc(true); + setOnboardingError(""); + + try { + await account.createEmailPasswordSession(email, password); + const user = await account.get(); + setAuthUser(user); + setStatus({ loading: false, authed: true, error: "" }); + + // Prüfe, ob User-Dokument existiert + const userDocExists = await checkUserDocument(user.$id); + setHasUserDoc(userDocExists); + + await handoffJwtToExtension(); + } catch (e) { + setStatus({ loading: false, authed: false, error: "Login fehlgeschlagen" }); + setAuthUser(null); + setHasUserDoc(false); + } finally { + setCheckingUserDoc(false); + } + } + + async function handleOnboardingStart() { + if (!authUser || !databases || !databaseId || !usersCollectionId) { + setOnboardingError("Fehler: Konfiguration unvollständig"); + return; + } + + setOnboardingLoading(true); + setOnboardingError(""); + + try { + await databases.createDocument( + databaseId, + usersCollectionId, + authUser.$id, // Document-ID = Auth-User-ID + { + user_name: authUser.name || "User" + } + ); + + // Erfolg: User-Dokument erstellt + setHasUserDoc(true); + setOnboardingError(""); + } catch (e) { + // 409 Conflict bedeutet, dass das Dokument bereits existiert + // Das ist ok, da wir idempotent sein wollen + if (e.code === 409 || e.type === 'document_already_exists') { + setHasUserDoc(true); + setOnboardingError(""); + } else if (e.code === 401 || e.type === 'general_unauthorized_scope') { + // 401 Unauthorized: Permissions nicht richtig gesetzt + setOnboardingError( + "Berechtigung verweigert. Bitte prüfe in Appwrite, ob die users Collection die richtigen Permissions hat. " + + "Siehe setup/USERS_COLLECTION_SETUP.md für Details." + ); + } else { + // Andere Fehler anzeigen + setOnboardingError(e.message || "Fehler beim Erstellen des Profils. Bitte versuche es erneut."); + } + } finally { + setOnboardingLoading(false); + } + } + + async function logout() { + setStatus((s) => ({ ...s, loading: true, error: "" })); + try { + await account.deleteSession("current"); + } catch {} + setStatus({ loading: false, authed: false, error: "" }); + setAuthUser(null); + setHasUserDoc(false); + setOnboardingError(""); + + // Extension informieren: Token weg + sendToExtension({ type: "AUTH_CLEARED" }); + } + + async function handoffJwtToExtension() { + // JWT ist userbezogen und kann serverseitig validiert werden + const jwt = await account.createJWT(); + sendToExtension({ type: "AUTH_JWT", jwt: jwt.jwt }); + } + + function sendToExtension(payload) { + // Sende Nachricht über window.postMessage (keine Extension ID nötig) + // Das Content Script der Extension lauscht darauf + window.postMessage( + { + source: "eship-webapp", + ...payload, + }, + "*" + ); + } + + useEffect(() => { + refreshAuth(); + // eslint-disable-next-line react-hooks/exhaustive-deps + }, []); + + const links = [ + { + label: "Dashboard", + href: "#/", + icon: ( + + ), + onClick: (e) => { + e.preventDefault(); + navigate("/"); + }, + }, + { + label: "Accounts", + href: "#/accounts", + icon: ( + + ), + onClick: (e) => { + e.preventDefault(); + navigate("/accounts"); + }, + }, + { + label: "Profile", + href: "#", + icon: ( + + ), + }, + { + label: "Settings", + href: "#", + icon: ( + + ), + }, + { + label: "Logout", + href: "#", + icon: ( + + ), + onClick: (e) => { + e.preventDefault(); + logout(); + }, + }, + ]; + + // Rendere Content basierend auf Route + const renderContent = () => { + if (route === "/accounts") { + return ; + } + // Default: Dashboard + return ; + }; + + return ( +
    + {!status.authed && ( +
    +
    +
    Login
    +
    Appwrite Session erforderlich
    + +
    + setEmail(e.target.value)} + autoComplete="email" + /> + setPassword(e.target.value)} + autoComplete="current-password" + /> + + {status.error &&
    {status.error}
    } +
    + +
    + Nach Login wird der Sperrbildschirm entfernt und die Extension erhaelt ein JWT. +
    +
    +
    + )} + + {status.authed && ( + <> + {showGate && ( + + )} +
    + +
    + + +
    + +
    + {links.map((link, idx) => ( + + ))} +
    +
    +
    + { + e.preventDefault(); + logout(); + }} /> +
    +
    +
    + {renderContent()} +
    +
    + + )} +
    + ); +} + +const styles = { + page: { + minHeight: "100vh", + background: "#0b0f19", + color: "#e7aaf0", + fontFamily: "system-ui, -apple-system, Segoe UI, Roboto, Arial, sans-serif", + }, + lockOverlay: { + position: "fixed", + inset: 0, + background: "rgba(0,0,0,0.70)", + display: "flex", + alignItems: "center", + justifyContent: "center", + padding: 18, + zIndex: 9999, + }, + card: { + width: "100%", + maxWidth: 420, + background: "rgba(255,255,255,0.07)", + border: "1px solid rgba(255,255,255,0.12)", + borderRadius: 18, + padding: 20, + backdropFilter: "blur(10px)", + }, + title: { fontSize: 20, fontWeight: 800 }, + sub: { marginTop: 6, opacity: 0.8, fontSize: 13 }, + form: { marginTop: 14, display: "grid", gap: 10 }, + input: { + height: 42, + borderRadius: 12, + border: "1px solid rgba(255,255,255,0.16)", + outline: "none", + padding: "0 12px", + background: "rgba(0,0,0,0.20)", + color: "#e7aaf0", + }, + button: { + height: 42, + borderRadius: 12, + border: "0", + cursor: "pointer", + fontWeight: 800, + background: "#e7aaf0", + color: "#0b0f19", + }, + error: { marginTop: 6, color: "#ffb3b3", fontSize: 13 }, + hint: { marginTop: 12, opacity: 0.75, fontSize: 12, lineHeight: 1.4 }, +}; diff --git a/Server/src/components/dashboard/Dashboard.jsx b/Server/src/components/dashboard/Dashboard.jsx new file mode 100644 index 0000000..84ead3a --- /dev/null +++ b/Server/src/components/dashboard/Dashboard.jsx @@ -0,0 +1,146 @@ +import React, { useState, useEffect } from "react"; +import { OverviewSection } from "./sections/OverviewSection"; +import { AccountsSection } from "./sections/AccountsSection"; +import { ProductsSection } from "./sections/ProductsSection"; +import { InsightsSection } from "./sections/InsightsSection"; +import { useScrollSnap } from "./hooks/useScrollSnap"; +import { getAuthUser } from "../../lib/appwrite"; +import { fetchManagedAccounts } from "../../services/accountsService"; +import { resolveActiveAccount } from "../../services/accountService"; +import { useHashRoute } from "../../lib/routing"; + +export const Dashboard = () => { + const { navigate } = useHashRoute(); + const [productFilters, setProductFilters] = useState({}); + const [activeAccountId, setActiveAccountId] = useState(null); + const [hasAccounts, setHasAccounts] = useState(false); + const [loadingAccounts, setLoadingAccounts] = useState(true); + + const sectionIds = ["s1", "s2", "s3", "s4"]; + const { scrollToSection } = useScrollSnap(sectionIds); + + // Accounts laden und aktiven Account auflösen beim Mount und nach Updates + useEffect(() => { + async function loadAccountsAndResolveActive() { + setLoadingAccounts(true); + try { + const authUser = await getAuthUser(); + if (!authUser) { + setHasAccounts(false); + setActiveAccountId(null); + return; + } + + const accounts = await fetchManagedAccounts(authUser.$id); + setHasAccounts(accounts.length > 0); + + const activeAccount = resolveActiveAccount(accounts); + if (activeAccount) { + const accountId = activeAccount.$id || activeAccount.id; + setActiveAccountId(accountId); + } else { + setActiveAccountId(null); + } + } catch (e) { + console.error("Fehler beim Laden der Accounts:", e); + setHasAccounts(false); + setActiveAccountId(null); + } finally { + setLoadingAccounts(false); + } + } + + loadAccountsAndResolveActive(); + + // Listen for accounts update events (e.g., after onboarding) + const handleAccountsUpdated = () => { + loadAccountsAndResolveActive(); + }; + + window.addEventListener('accountsUpdated', handleAccountsUpdated); + + return () => { + window.removeEventListener('accountsUpdated', handleAccountsUpdated); + }; + }, []); + + // Event-Listener für Account-Wechsel + useEffect(() => { + function handleActiveAccountChanged(event) { + const { accountId } = event.detail; + setActiveAccountId(accountId); + // Dashboard-Daten würden hier neu geladen werden (später, wenn Products-Service existiert) + } + + window.addEventListener("activeAccountChanged", handleActiveAccountChanged); + return () => { + window.removeEventListener("activeAccountChanged", handleActiveAccountChanged); + }; + }, []); + + const handleJumpToSection = (sectionId) => { + scrollToSection(sectionId); + }; + + const handleFilterProducts = (filters) => { + setProductFilters(filters); + }; + + // Empty-State wenn kein Account vorhanden + if (!loadingAccounts && !hasAccounts) { + return ( +
    +
    +
    +

    + No account connected +

    +

    + Du musst zuerst einen Account hinzufügen, um das Dashboard zu nutzen. +

    + +
    +
    +
    + ); + } + + return ( +
    +
    +
    +
    + + + + +
    +
    +
    +
    + ); +}; diff --git a/Server/src/components/dashboard/hooks/usePagination.js b/Server/src/components/dashboard/hooks/usePagination.js new file mode 100644 index 0000000..a61c6fe --- /dev/null +++ b/Server/src/components/dashboard/hooks/usePagination.js @@ -0,0 +1,39 @@ +import { useState, useMemo } from "react"; + +export const usePagination = (items, itemsPerPage = 8) => { + const [currentPage, setCurrentPage] = useState(1); + + const totalPages = Math.max(1, Math.ceil(items.length / itemsPerPage)); + const currentPageItems = useMemo(() => { + const start = (currentPage - 1) * itemsPerPage; + return items.slice(start, start + itemsPerPage); + }, [items, currentPage, itemsPerPage]); + + const nextPage = () => { + setCurrentPage(prev => Math.min(prev + 1, totalPages)); + }; + + const prevPage = () => { + setCurrentPage(prev => Math.max(prev - 1, 1)); + }; + + const goToPage = (page) => { + setCurrentPage(Math.max(1, Math.min(page, totalPages))); + }; + + // Reset to page 1 when items change + const resetPage = () => { + setCurrentPage(1); + }; + + return { + currentPage, + totalPages, + currentPageItems, + nextPage, + prevPage, + goToPage, + resetPage, + setCurrentPage + }; +}; diff --git a/Server/src/components/dashboard/hooks/useScrollSnap.js b/Server/src/components/dashboard/hooks/useScrollSnap.js new file mode 100644 index 0000000..3e0730d --- /dev/null +++ b/Server/src/components/dashboard/hooks/useScrollSnap.js @@ -0,0 +1,41 @@ +import { useState, useEffect, useRef } from "react"; + +export const useScrollSnap = (sectionIds) => { + const [activeSection, setActiveSection] = useState(sectionIds[0] || ""); + const containerRef = useRef(null); + + useEffect(() => { + const container = containerRef.current; + if (!container) return; + + const sections = sectionIds.map(id => document.getElementById(id)).filter(Boolean); + + const observer = new IntersectionObserver( + (entries) => { + const visible = entries + .filter(e => e.isIntersecting) + .sort((a, b) => b.intersectionRatio - a.intersectionRatio)[0]; + + if (visible) { + setActiveSection(visible.target.id); + } + }, + { threshold: [0.55, 0.7] } + ); + + sections.forEach(section => observer.observe(section)); + + return () => { + sections.forEach(section => observer.unobserve(section)); + }; + }, [sectionIds]); + + const scrollToSection = (sectionId) => { + const element = document.getElementById(sectionId); + if (element) { + element.scrollIntoView({ behavior: "smooth", block: "start" }); + } + }; + + return { activeSection, scrollToSection, containerRef }; +}; diff --git a/Server/src/components/dashboard/sections/AccountsSection.jsx b/Server/src/components/dashboard/sections/AccountsSection.jsx new file mode 100644 index 0000000..ac71506 --- /dev/null +++ b/Server/src/components/dashboard/sections/AccountsSection.jsx @@ -0,0 +1,232 @@ +import React, { useState, useEffect, useMemo } from "react"; +import { DataTable } from "../ui/DataTable"; +import { Pagination } from "../ui/Pagination"; +import { Filters } from "../ui/Filters"; +import { usePagination } from "../hooks/usePagination"; +import { cn } from "../../../lib/utils"; +import { fetchManagedAccounts } from "../../../services/accountsService"; +import { getActiveAccountId, setActiveAccountId, getAccountDisplayName } from "../../../services/accountService"; +import { getAuthUser } from "../../../lib/appwrite"; + +export const AccountsSection = ({ onJumpToSection, activeAccountId }) => { + const [platformFilter, setPlatformFilter] = useState("all"); + const [loading, setLoading] = useState(true); + const [error, setError] = useState(null); + const [accounts, setAccounts] = useState([]); + + // Lade Accounts beim Mount + useEffect(() => { + async function loadAccounts() { + setLoading(true); + setError(null); + try { + const authUser = await getAuthUser(); + if (!authUser) { + setAccounts([]); + return; + } + + const loadedAccounts = await fetchManagedAccounts(authUser.$id); + setAccounts(loadedAccounts); + } catch (e) { + console.error("Fehler beim Laden der Accounts:", e); + setError(e.message || "Fehler beim Laden der Accounts"); + } finally { + setLoading(false); + } + } + + loadAccounts(); + }, []); + + const filteredAccounts = useMemo(() => { + return accounts.filter((a) => { + if (platformFilter !== "all" && a.account_platform !== platformFilter) return false; + return true; + }); + }, [accounts, platformFilter]); + + const { currentPage, totalPages, currentPageItems, nextPage, prevPage, resetPage } = + usePagination(filteredAccounts, 8); + + const filters = [ + { + id: "platform", + type: "select", + value: platformFilter, + options: [ + { value: "all", label: "Platform: all" }, + { value: "amazon", label: "Platform: amazon" }, + { value: "ebay", label: "Platform: ebay" }, + ], + }, + ]; + + const handleFilterChange = (id, value) => { + if (id === "platform") { + setPlatformFilter(value); + } + resetPage(); + }; + + const handleQuickSwitch = (accountId) => { + setActiveAccountId(accountId); + // Event wird automatisch durch setActiveAccountId getriggert + }; + + const currentActiveId = getActiveAccountId(); + + return ( +
    +
    +
    +

    Accounts

    + + snap page + +
    +
    + + + + +
    +
    + +
    +
    +

    Accounts

    +

    + Managed vs scanned accounts, with quick drill-down. +

    +
    + + {loading && ( + + loading... + + )} +
    + +
    +
    +
    +
    +
    +

    Managed accounts

    +
    +
    + {loading ? ( +
    Loading...
    + ) : error ? ( +
    {error}
    + ) : accounts.length === 0 ? ( +
    No accounts yet
    + ) : ( + <> + { + if (col === "Action") { + const accountId = row.$id || row.id; + const isActive = accountId === currentActiveId; + return ( + + ); + } + if (col === "Shop") { + return getAccountDisplayName(row); + } + if (col === "Platform") { + return row.account_platform || "-"; + } + if (col === "Market") { + return row.account_platform_market || "-"; + } + return row[col.toLowerCase()] || "-"; + }} + /> + + + )} +
    +
    +
    + +
    +
    +
    +

    Account management

    +
    + {currentActiveId + ? `Active account: ${getAccountDisplayName(accounts.find((a) => (a.$id || a.id) === currentActiveId)) || currentActiveId}` + : "No account selected. Use 'Switch' to activate an account."} +
    +
    + +
    {filteredAccounts.length} accounts
    +
    +
    +
    +
    +
    + ); +}; diff --git a/Server/src/components/dashboard/sections/InsightsSection.jsx b/Server/src/components/dashboard/sections/InsightsSection.jsx new file mode 100644 index 0000000..1e86e67 --- /dev/null +++ b/Server/src/components/dashboard/sections/InsightsSection.jsx @@ -0,0 +1,240 @@ +import React, { useState, useEffect } from "react"; +import { InsightCard } from "../ui/InsightCard"; +import { cn } from "../../../lib/utils"; +import { getInsights } from "../../../services/dashboardService"; + +export const InsightsSection = ({ onJumpToSection, onFilterProducts, activeAccountId }) => { + const [loading, setLoading] = useState(true); + const [error, setError] = useState(null); + const [insights, setInsights] = useState(null); + + // Lade Insights wenn activeAccountId sich ändert + useEffect(() => { + if (!activeAccountId) { + setInsights(null); + setLoading(false); + setError(null); + return; + } + + setLoading(true); + setError(null); + + getInsights(activeAccountId) + .then((data) => { + setInsights(data); + }) + .catch((e) => { + console.error("Fehler beim Laden der Insights:", e); + setError(e.message || "Fehler beim Laden der Daten"); + }) + .finally(() => { + setLoading(false); + }); + }, [activeAccountId]); + + + return ( +
    +
    +
    +

    Insights

    + {loading && ( + + loading... + + )} +
    +
    + + + + +
    +
    + +
    +
    +

    Winning / Intelligence

    +

    + Preset insights that jump back into Products. +

    +
    +
    + + {error && ( +
    + Fehler: {error} +
    + )} + + {!activeAccountId && !loading && ( +
    +

    No account selected

    +
    + )} + + {loading && ( +
    + {[1, 2].map((i) => ( +
    + ))} +
    + )} + + {activeAccountId && !loading && !error && insights && ( + <> +
    + ({ + label: item.label, + value: item.value, + }))} + actionButton={{ + element: ( + + ), + info: "View all", + }} + /> + + 0 ? `${insights.priceSpread.length} groups` : "0"} + subtitle="Price variations for similar items" + items={insights.priceSpread.slice(0, 5).map((item) => ({ + label: item.label, + value: item.value, + }))} + actionButton={{ + element: ( + + ), + info: insights.priceSpread.length > 0 ? "Top spread" : "No data", + }} + /> +
    + +
    + ({ + label: item.label, + value: item.value, + }))} + actionButton={{ + element: ( + + ), + info: "Top 5", + }} + /> + + t.product?.product_status === "active").length} + subtitle="Currently active from recent products" + items={insights.trending + .filter((t) => t.product?.product_status === "active") + .slice(0, 5) + .map((item) => ({ + label: item.label, + value: item.value, + }))} + actionButton={{ + element: ( + + ), + info: "Filter: active", + }} + /> +
    + + )} + + {activeAccountId && !loading && !error && insights && + insights.trending.length === 0 && + insights.priceSpread.length === 0 && + insights.categoryShare.length === 0 && ( +
    +

    No insights available yet

    +
    + )} +
    + ); +}; diff --git a/Server/src/components/dashboard/sections/OverviewSection.jsx b/Server/src/components/dashboard/sections/OverviewSection.jsx new file mode 100644 index 0000000..77c5d84 --- /dev/null +++ b/Server/src/components/dashboard/sections/OverviewSection.jsx @@ -0,0 +1,211 @@ +import React, { useState, useEffect } from "react"; +import { KPICard } from "../ui/KPICard"; +import { cn } from "../../../lib/utils"; +import { getOverviewKPIs } from "../../../services/dashboardService"; + +export const OverviewSection = ({ onJumpToSection, activeAccountId }) => { + const [loading, setLoading] = useState(true); + const [error, setError] = useState(null); + const [kpis, setKpis] = useState(null); + const [newestProducts, setNewestProducts] = useState([]); + + // Lade KPIs wenn activeAccountId sich ändert + useEffect(() => { + if (!activeAccountId) { + setKpis(null); + setNewestProducts([]); + setLoading(false); + setError(null); + return; + } + + setLoading(true); + setError(null); + + getOverviewKPIs(activeAccountId) + .then((data) => { + setKpis(data); + setNewestProducts(data.newestProducts || []); + }) + .catch((e) => { + console.error("Fehler beim Laden der KPIs:", e); + setError(e.message || "Fehler beim Laden der Daten"); + }) + .finally(() => { + setLoading(false); + }); + }, [activeAccountId]); + + return ( +
    +
    +
    +

    Dashboard

    + {loading && ( + + loading... + + )} +
    +
    + + + +
    +
    + +
    +
    +

    Overview

    +

    + System health and high-level metrics. +

    +
    +
    + + {error && ( +
    + Fehler: {error} +
    + )} + + {!activeAccountId && !loading && ( +
    +

    No account selected

    +
    + )} + + {activeAccountId && loading && ( +
    + {[1, 2, 3, 4, 5, 6].map((i) => ( +
    + ))} +
    + )} + + {activeAccountId && !loading && !error && kpis && ( + <> +
    + + + + + + 0 ? "Active" : "Empty"} + sub={kpis.totalProducts > 0 ? "Account has products" : "No products yet"} + /> +
    + + )} + + {activeAccountId && !loading && !error && kpis && kpis.totalProducts === 0 && ( +
    +

    No products yet for this account.

    +
    + )} + +
    +
    +
    +
    +

    Product overview

    +
    + {loading ? "Loading..." : kpis ? `${kpis.totalProducts} total products` : "No data"} +
    +
    + +
    +
    +
    + +
    +
    +
    +

    Newest items

    + {loading ? ( +
    Loading...
    + ) : newestProducts.length > 0 ? ( +
    + {newestProducts.map((p) => `- ${p.product_title || p.$id}${p.product_price ? ` EUR ${p.product_price}` : ""}`).join("\n")} +
    + ) : ( +
    No products yet
    + )} +
    + +
    Top 5
    +
    +
    +
    +
    +
    + ); +}; diff --git a/Server/src/components/dashboard/sections/ProductsSection.jsx b/Server/src/components/dashboard/sections/ProductsSection.jsx new file mode 100644 index 0000000..e2ee43b --- /dev/null +++ b/Server/src/components/dashboard/sections/ProductsSection.jsx @@ -0,0 +1,394 @@ +import React, { useState, useEffect } from "react"; +import { DataTable } from "../ui/DataTable"; +import { Pagination } from "../ui/Pagination"; +import { Filters } from "../ui/Filters"; +import { cn } from "../../../lib/utils"; +import { getProductsPage, getProductPreview } from "../../../services/dashboardService"; +import { scanProductsForAccount } from "../../../services/productsService"; +import { AnimatePresence, motion } from "motion/react"; + +export const ProductsSection = ({ onJumpToSection, activeAccountId }) => { + const [statusFilter, setStatusFilter] = useState("all"); + const [searchQuery, setSearchQuery] = useState(""); + const [page, setPage] = useState(1); + const [pageSize] = useState(8); + const [loading, setLoading] = useState(true); + const [error, setError] = useState(null); + const [products, setProducts] = useState([]); + const [total, setTotal] = useState(0); + const [selectedProduct, setSelectedProduct] = useState(null); + const [previewLoading, setPreviewLoading] = useState(false); + const [scanning, setScanning] = useState(false); + const [scanToast, setScanToast] = useState({ show: false, message: "", type: "success" }); + + // Lade Products wenn activeAccountId oder Filter sich ändern + useEffect(() => { + loadProducts(); + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [activeAccountId, page, pageSize, statusFilter, searchQuery]); + + const totalPages = Math.ceil(total / pageSize); + const nextPage = () => { + if (page < totalPages) setPage(page + 1); + }; + const prevPage = () => { + if (page > 1) setPage(page - 1); + }; + + const filters = [ + { + id: "status", + type: "select", + value: statusFilter, + options: [ + { value: "all", label: "Status: all" }, + { value: "active", label: "Active" }, + { value: "ended", label: "Ended" }, + { value: "unknown", label: "Unknown" }, + ], + }, + { + id: "search", + type: "input", + value: searchQuery, + placeholder: "Search title", + }, + ]; + + const handleFilterChange = (id, value) => { + if (id === "status") { + setStatusFilter(value); + setPage(1); // Reset to first page + } else if (id === "search") { + setSearchQuery(value); + setPage(1); // Reset to first page + } + }; + + const handleClearFilters = () => { + setStatusFilter("all"); + setSearchQuery(""); + setPage(1); + }; + + const handleOpenProduct = async (productId) => { + setPreviewLoading(true); + setSelectedProduct(null); + try { + const preview = await getProductPreview(productId); + setSelectedProduct(preview); + } catch (e) { + console.error("Fehler beim Laden des Product Previews:", e); + setError(e.message || "Fehler beim Laden des Previews"); + } finally { + setPreviewLoading(false); + } + }; + + const loadProducts = async () => { + if (!activeAccountId) { + setProducts([]); + setTotal(0); + setLoading(false); + setError(null); + return; + } + + setLoading(true); + setError(null); + + try { + const data = await getProductsPage(activeAccountId, { + page, + pageSize, + filters: { + status: statusFilter !== "all" ? statusFilter : undefined, + search: searchQuery.trim() || undefined, + }, + }); + setProducts(data.items); + setTotal(data.total); + } catch (e) { + console.error("Fehler beim Laden der Products:", e); + setError(e.message || "Fehler beim Laden der Daten"); + } finally { + setLoading(false); + } + }; + + const handleScanProducts = async () => { + if (!activeAccountId || scanning) { + return; + } + + setScanning(true); + setError(null); + + try { + // Führe Scan aus + const result = await scanProductsForAccount(activeAccountId); + + // Refresh Products-Liste + await loadProducts(); + + // Zeige Erfolgs-Toast + const updated = result.updated ?? 0; + setScanToast({ + show: true, + message: `Scan abgeschlossen: ${result.created} neu, ${updated} aktualisiert`, + type: "success", + }); + setTimeout(() => { + setScanToast({ show: false, message: "", type: "success" }); + }, 3000); + } catch (e) { + console.error("Fehler beim Scannen der Produkte:", e); + + // Logge meta für Dev-Debugging + const meta = e.meta || {}; + if (Object.keys(meta).length > 0) { + console.log("[scan meta]", meta); + } + + // Prüfe auf no_items_found oder empty_items + const errorMsg = e.message || "Fehler beim Scannen der Produkte"; + const isNoItems = errorMsg.includes("no_items_found") || errorMsg.includes("empty_items"); + + // Zeige Toast mit spezifischer Meldung für 0 Items + const toastMessage = isNoItems + ? "0 Produkte gefunden. Bitte pruefe, ob die URL auf den Shop/Artikel-Bereich des Sellers zeigt." + : errorMsg; + + setScanToast({ + show: true, + message: toastMessage, + type: "error", + }); + setTimeout(() => { + setScanToast({ show: false, message: "", type: "success" }); + }, 3000); + } finally { + setScanning(false); + } + }; + + return ( +
    +
    +
    +

    Products

    + + explorer + +
    +
    + + + + +
    +
    + +
    +
    +

    Products

    +

    + Filter and page through products. No inner scrolling. +

    +
    +
    + + +
    +
    + +
    +
    +
    +
    +
    +

    Product list

    +
    +
    + {loading ? ( +
    Loading...
    + ) : error ? ( +
    {error}
    + ) : total === 0 && activeAccountId ? ( +
    +

    + Keine Produkte gefunden +

    +

    + Scanne den Account, um Produkte zu importieren. +

    + +
    + ) : !activeAccountId ? ( +
    + No account selected +
    + ) : ( + <> + { + if (col === "Action") { + return ( + + ); + } + if (col === "Title") { + return row.product_title || row.$id; + } + if (col === "Price") { + return row.product_price ? `EUR ${row.product_price}` : "N/A"; + } + if (col === "Status") { + return row.product_status || "unknown"; + } + if (col === "Category") { + return row.product_category || "-"; + } + return row[col.toLowerCase()] || "-"; + }} + /> + + + )} +
    +
    +
    + +
    +
    +
    +

    Product preview

    + {previewLoading ? ( +
    Loading preview...
    + ) : selectedProduct ? ( +
    +
    + Title: {selectedProduct.product_title || selectedProduct.$id} +
    + {selectedProduct.product_price && ( +
    + Price: EUR {selectedProduct.product_price} +
    + )} + {selectedProduct.product_status && ( +
    + Status: {selectedProduct.product_status} +
    + )} + {selectedProduct.product_category && ( +
    + Category: {selectedProduct.product_category} +
    + )} + {selectedProduct.details && ( +
    + Details available +
    + )} +
    + ) : ( +
    + Click "Open" on a product to preview details. +
    + )} +
    + + {selectedProduct && ( +
    Preview loaded
    + )} +
    +
    +
    +
    + + {/* Toast Notification */} + + {scanToast.show && ( + + {scanToast.message} + + )} + +
    + ); +}; diff --git a/Server/src/components/dashboard/ui/DataTable.jsx b/Server/src/components/dashboard/ui/DataTable.jsx new file mode 100644 index 0000000..4e2ae5c --- /dev/null +++ b/Server/src/components/dashboard/ui/DataTable.jsx @@ -0,0 +1,36 @@ +import React from "react"; + +export const DataTable = ({ columns, data, renderCell }) => { + return ( +
    + + + + {columns.map((col, idx) => ( + + ))} + + + + {data.map((row, rowIdx) => ( + + {columns.map((col, colIdx) => ( + + ))} + + ))} + +
    + {col} +
    + {renderCell ? renderCell(col, row, rowIdx) : row[col]} +
    +
    + ); +}; diff --git a/Server/src/components/dashboard/ui/Filters.jsx b/Server/src/components/dashboard/ui/Filters.jsx new file mode 100644 index 0000000..10a52c5 --- /dev/null +++ b/Server/src/components/dashboard/ui/Filters.jsx @@ -0,0 +1,39 @@ +import React from "react"; + +export const Filters = ({ filters, onChange }) => { + return ( +
    + {filters.map((filter, idx) => { + if (filter.type === "select") { + return ( + + ); + } + if (filter.type === "input") { + return ( + onChange(filter.id, e.target.value)} + className="rounded-xl border border-[var(--line)] bg-transparent px-3 py-2.5 text-xs text-[var(--text)] outline-none transition-colors hover:border-[rgba(106,166,255,0.55)]" + /> + ); + } + return null; + })} +
    + ); +}; diff --git a/Server/src/components/dashboard/ui/InsightCard.jsx b/Server/src/components/dashboard/ui/InsightCard.jsx new file mode 100644 index 0000000..5ed4100 --- /dev/null +++ b/Server/src/components/dashboard/ui/InsightCard.jsx @@ -0,0 +1,42 @@ +import React from "react"; + +export const InsightCard = ({ title, value, subtitle, items, actionButton }) => { + return ( +
    +
    +
    +

    {title}

    + {value &&
    {value}
    } + {subtitle &&
    {subtitle}
    } + {items && items.length > 0 && ( +
    + {items.map((item, idx) => ( +
    + {item.label} + {item.value && {item.value}} +
    + ))} +
    + )} + {actionButton && ( +
    +
    + {actionButton.element || actionButton} +
    + {actionButton.info && ( +
    {actionButton.info}
    + )} +
    + )} +
    +
    + ); +}; diff --git a/Server/src/components/dashboard/ui/KPICard.jsx b/Server/src/components/dashboard/ui/KPICard.jsx new file mode 100644 index 0000000..68c0f4e --- /dev/null +++ b/Server/src/components/dashboard/ui/KPICard.jsx @@ -0,0 +1,19 @@ +import React from "react"; + +export const KPICard = ({ title, value, sub }) => { + return ( +
    +
    +
    +

    {title}

    +

    {value}

    + {sub &&

    {sub}

    } +
    +
    + ); +}; diff --git a/Server/src/components/dashboard/ui/Pagination.jsx b/Server/src/components/dashboard/ui/Pagination.jsx new file mode 100644 index 0000000..44dce5d --- /dev/null +++ b/Server/src/components/dashboard/ui/Pagination.jsx @@ -0,0 +1,27 @@ +import React from "react"; + +export const Pagination = ({ currentPage, totalPages, onPrev, onNext, info }) => { + return ( +
    +
    + {info && {info}} +
    +
    + + +
    +
    + ); +}; diff --git a/Server/src/components/layout/BackgroundImage.jsx b/Server/src/components/layout/BackgroundImage.jsx new file mode 100644 index 0000000..a0c9988 --- /dev/null +++ b/Server/src/components/layout/BackgroundImage.jsx @@ -0,0 +1,19 @@ +import React from "react"; + +export const BackgroundImage = () => { + return ( +
    + ); +}; diff --git a/Server/src/components/layout/BackgroundRippleEffect.jsx b/Server/src/components/layout/BackgroundRippleEffect.jsx new file mode 100644 index 0000000..45f96ca --- /dev/null +++ b/Server/src/components/layout/BackgroundRippleEffect.jsx @@ -0,0 +1,120 @@ +"use client"; +import React, { useMemo, useRef, useState, useEffect } from "react"; +import { cn } from "@/lib/utils"; + +export const BackgroundRippleEffect = ({ + cellSize = 56 +}) => { + const [clickedCell, setClickedCell] = useState(null); + const [rippleKey, setRippleKey] = useState(0); + const ref = useRef(null); + const [viewportSize, setViewportSize] = useState({ width: 0, height: 0 }); + + // Calculate dynamic grid size to cover full viewport + useEffect(() => { + const updateSize = () => { + setViewportSize({ width: window.innerWidth, height: window.innerHeight }); + }; + updateSize(); + window.addEventListener('resize', updateSize); + return () => window.removeEventListener('resize', updateSize); + }, []); + + const calculatedCols = viewportSize.width > 0 ? Math.ceil(viewportSize.width / cellSize) + 2 : 27; + const calculatedRows = viewportSize.height > 0 ? Math.ceil(viewportSize.height / cellSize) + 2 : 8; + + return ( +
    +
    +
    + { + setClickedCell({ row, col }); + setRippleKey((k) => k + 1); + }} + interactive /> +
    +
    + ); +}; + +const DivGrid = ({ + className, + rows = 7, + cols = 30, + cellSize = 56, + borderColor = "#3f3f46", + fillColor = "rgba(14,165,233,0.3)", + clickedCell = null, + onCellClick = () => {}, + interactive = true +}) => { + const cells = useMemo(() => Array.from({ length: rows * cols }, (_, idx) => idx), [rows, cols]); + + const gridStyle = { + display: "grid", + gridTemplateColumns: `repeat(${cols}, ${cellSize}px)`, + gridTemplateRows: `repeat(${rows}, ${cellSize}px)`, + width: "100vw", + height: "100vh", + position: "absolute", + top: 0, + left: 0, + right: 0, + bottom: 0, + }; + + return ( +
    + {cells.map((idx) => { + const rowIdx = Math.floor(idx / cols); + const colIdx = idx % cols; + const distance = clickedCell + ? Math.hypot(clickedCell.row - rowIdx, clickedCell.col - colIdx) + : 0; + const delay = clickedCell ? Math.max(0, distance * 55) : 0; // ms + const duration = 200 + distance * 80; // ms + + const style = clickedCell + ? { + "--delay": `${delay}ms`, + "--duration": `${duration}ms`, + } + : {}; + + return ( +
    onCellClick?.(rowIdx, colIdx) : undefined + } /> + ); + })} +
    + ); +}; diff --git a/Server/src/components/layout/Logo.jsx b/Server/src/components/layout/Logo.jsx new file mode 100644 index 0000000..7ecd7c0 --- /dev/null +++ b/Server/src/components/layout/Logo.jsx @@ -0,0 +1,16 @@ +import React from "react"; +import { motion } from "motion/react"; + +export const Logo = () => { + return ( + + Logo + + ); +}; diff --git a/Server/src/components/layout/LogoSquare.jsx b/Server/src/components/layout/LogoSquare.jsx new file mode 100644 index 0000000..9813675 --- /dev/null +++ b/Server/src/components/layout/LogoSquare.jsx @@ -0,0 +1,15 @@ +import React from "react"; + +export const LogoSquare = () => { + return ( + + Logo Square + + ); +}; diff --git a/Server/src/components/layout/LogoVertical.jsx b/Server/src/components/layout/LogoVertical.jsx new file mode 100644 index 0000000..2f577cb --- /dev/null +++ b/Server/src/components/layout/LogoVertical.jsx @@ -0,0 +1,15 @@ +import React from "react"; + +export const LogoVertical = () => { + return ( + + Logo Vertical + + ); +}; diff --git a/Server/src/components/onboarding/OnboardingGate.jsx b/Server/src/components/onboarding/OnboardingGate.jsx new file mode 100644 index 0000000..c311c75 --- /dev/null +++ b/Server/src/components/onboarding/OnboardingGate.jsx @@ -0,0 +1,477 @@ +"use client"; +import React, { useState } from "react"; +import { motion, AnimatePresence } from "motion/react"; +import { BackgroundRippleEffect } from "@/components/layout/BackgroundRippleEffect"; +import Shuffle from "@/components/ui/Shuffle"; +import ColourfulText from "@/components/ui/colourful-text"; +import { PlaceholdersAndVanishInput } from "@/components/ui/placeholders-and-vanish-input"; +import { MultiStepLoader } from "@/components/ui/multi-step-loader"; +import { IPhoneNotification } from "@/components/ui/iphone-notification"; +import { parseEbayAccount } from "@/services/ebayParserService"; +import { createManagedAccount, fetchManagedAccounts } from "@/services/accountsService"; +import { account, databases, databaseId, usersCollectionId } from "@/lib/appwrite"; + +export const OnboardingGate = ({ userName, onStart, loading, error }) => { + const [phase, setPhase] = useState("shuffle"); + const [submitting, setSubmitting] = useState(false); + const [submitError, setSubmitError] = useState(""); + const [showNotification, setShowNotification] = useState(false); + const [notificationMessage, setNotificationMessage] = useState("bitte eine gueltige url verwenden!"); + const [skipHovered, setSkipHovered] = useState(false); + + const loadingStates = [ + { text: "URL wird verarbeitet..." }, + { text: "Account-Daten werden geladen..." }, + { text: "Account wird erstellt..." }, + { text: "Fast fertig..." }, + ]; + + const placeholders = [ + "Gib deine eBay-Account-URL ein...", + "z.B. https://www.ebay.de/str/username", + "Paste deine eBay Shop-URL hier...", + ]; + + const handleOverlayClick = async (e) => { + // Only handle clicks on the overlay itself or when in shuffle phase + if (phase === "shuffle") { + // Create user document first (but don't call onStart, as that would hide the gate) + // We need to create it directly to ensure it exists for account creation later + try { + const authUser = await account.get(); + if (authUser && databases && databaseId && usersCollectionId) { + try { + await databases.createDocument( + databaseId, + usersCollectionId, + authUser.$id, + { + user_name: authUser.name || "User" + } + ); + } catch (docErr) { + // 409 Conflict means document already exists - that's ok + if (docErr.code !== 409 && docErr.type !== 'document_already_exists') { + console.warn("Fehler beim Erstellen des User-Dokuments:", docErr); + } + } + } + } catch (err) { + console.error("Fehler beim Abrufen des Users oder Erstellen des Dokuments:", err); + // Continue anyway - might already exist + } + + // Add small delay to let the shuffle exit animation complete + // Exit animation is 0.5s, so we wait a bit longer to see it fully + setTimeout(() => { + setPhase("input"); + }, 600); // 600ms delay - slightly longer than exit animation (500ms) + } + }; + + const handleSkip = async () => { + // Skip onboarding - directly call onStart to proceed to dashboard + // Must await to ensure User document is created before proceeding + if (onStart) { + await onStart(); + } + }; + + // Validate eBay URL + const isValidEbayUrl = (url) => { + // #region agent log + fetch('http://127.0.0.1:7242/ingest/246fe132-ecc5-435f-bd9c-fe5e8e26089d',{method:'POST',headers:{'Content-Type':'application/json'},body:JSON.stringify({location:'OnboardingGate.jsx:45',message:'isValidEbayUrl: entry',data:{url,hasUrl:!!url,trimmedUrl:url?.trim()},timestamp:Date.now(),sessionId:'debug-session',runId:'run1',hypothesisId:'A'})}).catch(()=>{}); + // #endregion + + if (!url || !url.trim()) { + // #region agent log + fetch('http://127.0.0.1:7242/ingest/246fe132-ecc5-435f-bd9c-fe5e8e26089d',{method:'POST',headers:{'Content-Type':'application/json'},body:JSON.stringify({location:'OnboardingGate.jsx:48',message:'isValidEbayUrl: empty url',data:{},timestamp:Date.now(),sessionId:'debug-session',runId:'run1',hypothesisId:'A'})}).catch(()=>{}); + // #endregion + return false; + } + + // Pattern for hostname only (without protocol/path) + const ebayHostnamePattern = /^(www\.)?(ebay\.(de|com|co\.uk|fr|it|es|nl|at|ch|com\.au|ca)|ebay-kleinanzeigen\.de)$/i; + + try { + const urlObj = new URL(url); + const hostname = urlObj.hostname; + const patternMatches = ebayHostnamePattern.test(hostname); + + // #region agent log + fetch('http://127.0.0.1:7242/ingest/246fe132-ecc5-435f-bd9c-fe5e8e26089d',{method:'POST',headers:{'Content-Type':'application/json'},body:JSON.stringify({location:'OnboardingGate.jsx:62',message:'isValidEbayUrl: validation result',data:{url,hostname,patternMatches,pattern:ebayHostnamePattern.toString()},timestamp:Date.now(),sessionId:'debug-session',runId:'run1',hypothesisId:'A'})}).catch(()=>{}); + // #endregion + + return patternMatches; + } catch (e) { + // Invalid URL format + // #region agent log + fetch('http://127.0.0.1:7242/ingest/246fe132-ecc5-435f-bd9c-fe5e8e26089d',{method:'POST',headers:{'Content-Type':'application/json'},body:JSON.stringify({location:'OnboardingGate.jsx:62',message:'isValidEbayUrl: URL parse error',data:{url,error:e.message},timestamp:Date.now(),sessionId:'debug-session',runId:'run1',hypothesisId:'A'})}).catch(()=>{}); + // #endregion + return false; + } + }; + + const handleAccountSubmit = async (e, url) => { + e.preventDefault(); + + // #region agent log + fetch('http://127.0.0.1:7242/ingest/246fe132-ecc5-435f-bd9c-fe5e8e26089d',{method:'POST',headers:{'Content-Type':'application/json'},body:JSON.stringify({location:'OnboardingGate.jsx:59',message:'handleAccountSubmit: entry',data:{url,hasUrl:!!url,phase},timestamp:Date.now(),sessionId:'debug-session',runId:'run1',hypothesisId:'B'})}).catch(()=>{}); + // #endregion + + if (!url || !url.trim()) { + // #region agent log + fetch('http://127.0.0.1:7242/ingest/246fe132-ecc5-435f-bd9c-fe5e8e26089d',{method:'POST',headers:{'Content-Type':'application/json'},body:JSON.stringify({location:'OnboardingGate.jsx:64',message:'handleAccountSubmit: empty url, showing notification',data:{},timestamp:Date.now(),sessionId:'debug-session',runId:'run1',hypothesisId:'B'})}).catch(()=>{}); + // #endregion + setNotificationMessage("bitte eine gueltige url verwenden!"); + setShowNotification(true); + return; + } + + // Validate eBay URL + const isValid = isValidEbayUrl(url); + // #region agent log + fetch('http://127.0.0.1:7242/ingest/246fe132-ecc5-435f-bd9c-fe5e8e26089d',{method:'POST',headers:{'Content-Type':'application/json'},body:JSON.stringify({location:'OnboardingGate.jsx:71',message:'handleAccountSubmit: validation result',data:{url,isValid},timestamp:Date.now(),sessionId:'debug-session',runId:'run1',hypothesisId:'A'})}).catch(()=>{}); + // #endregion + + if (!isValid) { + // #region agent log + fetch('http://127.0.0.1:7242/ingest/246fe132-ecc5-435f-bd9c-fe5e8e26089d',{method:'POST',headers:{'Content-Type':'application/json'},body:JSON.stringify({location:'OnboardingGate.jsx:76',message:'handleAccountSubmit: invalid url, showing notification',data:{url},timestamp:Date.now(),sessionId:'debug-session',runId:'run1',hypothesisId:'A'})}).catch(()=>{}); + // #endregion + setNotificationMessage("bitte eine gueltige url verwenden!"); + setShowNotification(true); + return; + } + + setSubmitting(true); + setSubmitError(""); + + // Wait 2 seconds for vanish animation, then switch to loading phase + setTimeout(async () => { + // Switch to loading phase first + setPhase("loading"); + + try { + // #region agent log + fetch('http://127.0.0.1:7242/ingest/246fe132-ecc5-435f-bd9c-fe5e8e26089d',{method:'POST',headers:{'Content-Type':'application/json'},body:JSON.stringify({location:'OnboardingGate.jsx:88',message:'handleAccountSubmit: before parseEbayAccount',data:{url},timestamp:Date.now(),sessionId:'debug-session',runId:'run1',hypothesisId:'C'})}).catch(()=>{}); + // #endregion + + // Parse eBay account + const accountData = await parseEbayAccount(url); + + // #region agent log + fetch('http://127.0.0.1:7242/ingest/246fe132-ecc5-435f-bd9c-fe5e8e26089d',{method:'POST',headers:{'Content-Type':'application/json'},body:JSON.stringify({location:'OnboardingGate.jsx:93',message:'handleAccountSubmit: parseEbayAccount success',data:{url,hasAccountData:!!accountData,market:accountData?.market,sellerId:accountData?.sellerId},timestamp:Date.now(),sessionId:'debug-session',runId:'run1',hypothesisId:'C'})}).catch(()=>{}); + // #endregion + + // Validate that sellerId was extracted successfully + if (!accountData.sellerId || accountData.sellerId.trim() === "") { + throw new Error("Die eBay-URL konnte nicht verarbeitet werden. Bitte stelle sicher, dass es eine gültige eBay-Shop-URL ist."); + } + + // Get current user + const authUser = await account.get(); + + // Check for duplicate account before creating + const existingAccounts = await fetchManagedAccounts(authUser.$id); + const duplicateAccount = existingAccounts.find( + (acc) => + acc.account_platform_account_id === accountData.sellerId && + acc.account_platform_market === accountData.market + ); + + if (duplicateAccount) { + throw new Error("Dieser Account ist bereits verbunden."); + } + + // Create account in database + await createManagedAccount(authUser.$id, { + account_platform_market: accountData.market, + account_platform_account_id: accountData.sellerId, + account_shop_name: accountData.shopName || null, + account_url: url, + account_status: accountData.status || "active", + }); + + // Account erstellt erfolgreich, rufe onStart auf + onStart && onStart(); + + // Trigger event to reload Dashboard accounts + // #region agent log + fetch('http://127.0.0.1:7242/ingest/246fe132-ecc5-435f-bd9c-fe5e8e26089d',{method:'POST',headers:{'Content-Type':'application/json'},body:JSON.stringify({location:'OnboardingGate.jsx:142',message:'handleAccountSubmit: account created, triggering reload event',data:{url},timestamp:Date.now(),sessionId:'debug-session',runId:'run1',hypothesisId:'B'})}).catch(()=>{}); + // #endregion + window.dispatchEvent(new CustomEvent('accountsUpdated')); + } catch (err) { + console.error("Fehler beim Erstellen des Accounts:", err); + + // #region agent log + fetch('http://127.0.0.1:7242/ingest/246fe132-ecc5-435f-bd9c-fe5e8e26089d',{method:'POST',headers:{'Content-Type':'application/json'},body:JSON.stringify({location:'OnboardingGate.jsx:106',message:'handleAccountSubmit: error caught',data:{url,errorMessage:err.message,errorCode:err.code,errorType:err.type,errorStack:err.stack?.substring(0,200)},timestamp:Date.now(),sessionId:'debug-session',runId:'run1',hypothesisId:'C'})}).catch(()=>{}); + // #endregion + + // Show notification for URL validation, duplicate, or parsing errors + if ( + err.message?.includes("URL") || + err.message?.includes("ungültig") || + err.message?.includes("invalid") || + err.message?.includes("bereits verbunden") || + err.message?.includes("already") + ) { + // #region agent log + fetch('http://127.0.0.1:7242/ingest/246fe132-ecc5-435f-bd9c-fe5e8e26089d',{method:'POST',headers:{'Content-Type':'application/json'},body:JSON.stringify({location:'OnboardingGate.jsx:205',message:'handleAccountSubmit: URL/duplicate error, showing notification',data:{errorMessage:err.message},timestamp:Date.now(),sessionId:'debug-session',runId:'run1',hypothesisId:'C'})}).catch(()=>{}); + // #endregion + // Use the actual error message or default message + setNotificationMessage(err.message || "bitte eine gueltige url verwenden!"); + setShowNotification(true); + } else { + // #region agent log + fetch('http://127.0.0.1:7242/ingest/246fe132-ecc5-435f-bd9c-fe5e8e26089d',{method:'POST',headers:{'Content-Type':'application/json'},body:JSON.stringify({location:'OnboardingGate.jsx:175',message:'handleAccountSubmit: non-URL error, setting submitError',data:{errorMessage:err.message},timestamp:Date.now(),sessionId:'debug-session',runId:'run1',hypothesisId:'C'})}).catch(()=>{}); + // #endregion + setSubmitError(err.message || "Fehler beim Erstellen des Accounts. Bitte versuche es erneut."); + } + setPhase("input"); + setSubmitting(false); + } + }, 2000); // 2 second delay for vanish animation + }; + + return ( +
    + + + {/* Skip Button - Bottom Left */} + + + {/* iPhone-style Notification */} + setShowNotification(false)} + duration={4000} + /> + + {/* Shuffle and Input Phases - Combined AnimatePresence for smooth transition */} + + {phase === "shuffle" && ( + { + e.stopPropagation(); // Prevent double-triggering + handleOverlayClick(e); + }} + > +
    + + , + +
    +
    + )} + + {phase === "input" && ( + +
    +
    + Gib deine + + ein +
    + + { + setSubmitError(""); + setShowNotification(false); + setNotificationMessage("bitte eine gueltige url verwenden!"); // Reset to default + }} + onSubmit={handleAccountSubmit} + /> + + {(submitError || error) && !showNotification && ( +
    + {submitError || error} +
    + )} +
    +
    + )} +
    + + {/* Loading Phase */} + {phase === "loading" && ( + + )} +
    + ); +}; + +const styles = { + overlay: { + position: "fixed", + inset: 0, + background: "rgba(0,0,0,0.75)", + display: "flex", + alignItems: "center", + justifyContent: "center", + padding: 18, + zIndex: 9998, + overflow: "hidden", + }, + centerContent: { + position: "relative", + zIndex: 10, // Higher than BackgroundRippleEffect (z-[3] = z-index: 3) to ensure input is clickable + display: "flex", + flexDirection: "column", + alignItems: "center", + justifyContent: "center", + width: "100%", + maxWidth: "800px", + padding: "0 20px", + cursor: "default", + }, + shuffleContainer: { + display: "flex", + alignItems: "center", + justifyContent: "center", + flexWrap: "wrap", + gap: "0", + }, + staticComma: { + fontSize: "4rem", + fontWeight: 800, + color: "#e7aaf0", + marginLeft: "0.1em", + marginRight: "0.1em", + display: "inline-block", + }, + inputContainer: { + width: "100%", + maxWidth: "600px", + display: "flex", + flexDirection: "column", + alignItems: "center", + gap: "24px", + }, + colourfulTextContainer: { + display: "flex", + alignItems: "center", + flexWrap: "wrap", + justifyContent: "center", + gap: "4px", + fontSize: "24px", + fontWeight: 600, + color: "#e7aaf0", + marginBottom: "8px", + textAlign: "center", + }, + textPrefix: { + color: "#e7aaf0", + }, + error: { + marginTop: 12, + color: "#ffb3b3", + fontSize: 13, + textAlign: "center", + padding: "8px 16px", + backgroundColor: "rgba(255, 179, 179, 0.1)", + borderRadius: "8px", + border: "1px solid rgba(255, 179, 179, 0.3)", + }, + skipButton: { + position: "fixed", + bottom: 20, + left: 20, + display: "flex", + alignItems: "center", + justifyContent: "flex-start", + width: "32px", + height: "32px", + border: "none", + borderRadius: "50%", + cursor: "pointer", + backgroundColor: "rgb(255, 65, 65)", + boxShadow: "2px 2px 10px rgba(0, 0, 0, 0.199)", + transition: "all 0.3s ease", + overflow: "hidden", + zIndex: 10001, + }, + skipSign: { + width: "100%", + transition: "all 0.3s ease", + display: "flex", + alignItems: "center", + justifyContent: "center", + }, + skipText: { + position: "absolute", + right: "0%", + width: "0%", + opacity: 0, + color: "white", + fontSize: "0.9em", + fontWeight: 600, + transition: "all 0.3s ease", + whiteSpace: "nowrap", + }, +}; diff --git a/Server/src/components/sidebar/Sidebar.jsx b/Server/src/components/sidebar/Sidebar.jsx new file mode 100644 index 0000000..e5bad4b --- /dev/null +++ b/Server/src/components/sidebar/Sidebar.jsx @@ -0,0 +1,151 @@ +"use client"; +import { cn } from "../../lib/utils"; +import React, { useState, createContext, useContext } from "react"; +import { AnimatePresence, motion } from "motion/react"; +import { IconMenu2, IconX } from "@tabler/icons-react"; + +const SidebarContext = createContext(undefined); + +export const useSidebar = () => { + const context = useContext(SidebarContext); + if (!context) { + throw new Error("useSidebar must be used within a SidebarProvider"); + } + return context; +}; + +export const SidebarProvider = ({ + children, + open: openProp, + setOpen: setOpenProp, + animate = true +}) => { + const [openState, setOpenState] = useState(false); + + const open = openProp !== undefined ? openProp : openState; + const setOpen = setOpenProp !== undefined ? setOpenProp : setOpenState; + + return ( + + {children} + + ); +}; + +export const Sidebar = ({ + children, + open, + setOpen, + animate +}) => { + return ( + + {children} + + ); +}; + +export const SidebarBody = (props) => { + return ( + <> + + + + ); +}; + +export const DesktopSidebar = ({ + className, + children, + ...props +}) => { + const { open, setOpen, animate } = useSidebar(); + return ( + <> + + + ); +}; + +export const MobileSidebar = ({ + className, + children, + ...props +}) => { + const { open, setOpen } = useSidebar(); + return ( + <> +
    +
    + setOpen(!open)} /> +
    + + {open && ( + +
    setOpen(!open)}> + +
    + {children} +
    + )} +
    +
    + + ); +}; + +export const SidebarLink = ({ + link, + className, + ...props +}) => { + const { open, animate } = useSidebar(); + return ( + + {link.icon} + + {link.label} + + + ); +}; diff --git a/Server/src/components/sidebar/SidebarHeader.jsx b/Server/src/components/sidebar/SidebarHeader.jsx new file mode 100644 index 0000000..79c3251 --- /dev/null +++ b/Server/src/components/sidebar/SidebarHeader.jsx @@ -0,0 +1,199 @@ +"use client"; +import React, { useState, useEffect, useRef } from "react"; +import { IconChevronDown } from "@tabler/icons-react"; +import { motion, AnimatePresence } from "motion/react"; +import { cn } from "../../lib/utils"; +import { useHashRoute } from "../../lib/routing"; +import { + getActiveAccountId, + setActiveAccountId, + resolveActiveAccount, + getAccountDisplayName, +} from "../../services/accountService"; +import { fetchManagedAccounts } from "../../services/accountsService"; +import { getAuthUser } from "../../lib/appwrite"; + +export const SidebarHeader = () => { + const { navigate } = useHashRoute(); + const [accounts, setAccounts] = useState([]); + const [activeAccount, setActiveAccount] = useState(null); + const [dropdownOpen, setDropdownOpen] = useState(false); + const [loading, setLoading] = useState(true); + const dropdownRef = useRef(null); + + // Accounts laden + useEffect(() => { + async function loadAccounts() { + setLoading(true); + try { + const authUser = await getAuthUser(); + if (!authUser) { + setAccounts([]); + setActiveAccount(null); + return; + } + + const loadedAccounts = await fetchManagedAccounts(authUser.$id); + setAccounts(loadedAccounts); + const active = resolveActiveAccount(loadedAccounts); + setActiveAccount(active); + } catch (e) { + console.error("Fehler beim Laden der Accounts:", e); + setAccounts([]); + setActiveAccount(null); + } finally { + setLoading(false); + } + } + + loadAccounts(); + }, []); + + // Event-Listener für activeAccountChanged (wenn Account in anderer Komponente gewechselt wird) + useEffect(() => { + function handleActiveAccountChanged(event) { + const { accountId } = event.detail; + // Account aus aktueller Liste finden und als aktiv setzen + const foundAccount = accounts.find( + (acc) => acc.$id === accountId || acc.id === accountId + ); + if (foundAccount) { + setActiveAccount(foundAccount); + } + } + + window.addEventListener("activeAccountChanged", handleActiveAccountChanged); + return () => { + window.removeEventListener("activeAccountChanged", handleActiveAccountChanged); + }; + }, [accounts]); + + // Click outside handler für Dropdown + useEffect(() => { + function handleClickOutside(event) { + if (dropdownRef.current && !dropdownRef.current.contains(event.target)) { + setDropdownOpen(false); + } + } + + if (dropdownOpen) { + document.addEventListener("mousedown", handleClickOutside); + return () => { + document.removeEventListener("mousedown", handleClickOutside); + }; + } + }, [dropdownOpen]); + + const handleHeaderClick = () => { + if (accounts.length === 0) { + // Keine Accounts: direkt zu /accounts navigieren + navigate("/accounts"); + } else { + // Accounts existieren: Dropdown öffnen/schließen + setDropdownOpen(!dropdownOpen); + } + }; + + const handleAccountSelect = (account) => { + const accountId = account.$id || account.id; + setActiveAccountId(accountId); + setActiveAccount(account); + setDropdownOpen(false); + }; + + const handleManageAccounts = () => { + setDropdownOpen(false); + navigate("/accounts"); + }; + + const displayText = + accounts.length === 0 + ? "Add Account" + : activeAccount + ? getAccountDisplayName(activeAccount) + : "Add Account"; + + return ( +
    + + + + {dropdownOpen && accounts.length > 0 && ( + +
    + {accounts.map((account) => { + const accountId = account.$id || account.id; + const currentActiveId = getActiveAccountId(); + const isActive = accountId === currentActiveId; + const displayName = getAccountDisplayName(account); + + return ( + + ); + })} + +
    + + +
    + + )} + +
    + ); +}; \ No newline at end of file diff --git a/Server/src/components/sidebar/index.js b/Server/src/components/sidebar/index.js new file mode 100644 index 0000000..a5f8b0b --- /dev/null +++ b/Server/src/components/sidebar/index.js @@ -0,0 +1 @@ +export { Sidebar, SidebarBody, SidebarLink, useSidebar } from "./Sidebar.jsx"; diff --git a/Server/src/components/ui/LogoutButton.jsx b/Server/src/components/ui/LogoutButton.jsx new file mode 100644 index 0000000..a8d1c08 --- /dev/null +++ b/Server/src/components/ui/LogoutButton.jsx @@ -0,0 +1,83 @@ +import React from 'react'; +import styled from 'styled-components'; + +const LogoutButton = ({ onClick }) => { + return ( + + + + ); +} + +const StyledWrapper = styled.div` + .Btn { + display: flex; + align-items: center; + justify-content: flex-start; + width: 32px; + height: 32px; + border: none; + border-radius: 50%; + cursor: pointer; + position: relative; + overflow: hidden; + transition-duration: .3s; + box-shadow: 2px 2px 10px rgba(0, 0, 0, 0.199); + background-color: rgb(255, 65, 65); + } + + /* plus sign */ + .sign { + width: 100%; + transition-duration: .3s; + display: flex; + align-items: center; + justify-content: center; + } + + .sign svg { + width: 12px; + } + + .sign svg path { + fill: white; + } + /* text */ + .text { + position: absolute; + right: 0%; + width: 0%; + opacity: 0; + color: white; + font-size: 0.9em; + font-weight: 600; + transition-duration: .3s; + } + /* hover effect on button width */ + .Btn:hover { + width: 90px; + border-radius: 40px; + transition-duration: .3s; + } + + .Btn:hover .sign { + width: 30%; + transition-duration: .3s; + padding-left: 15px; + } + /* hover effect button's text */ + .Btn:hover .text { + opacity: 1; + width: 70%; + transition-duration: .3s; + padding-right: 8px; + } + /* button click effect*/ + .Btn:active { + transform: translate(2px ,2px); + }`; + +export default LogoutButton; diff --git a/Server/src/components/ui/Shuffle.jsx b/Server/src/components/ui/Shuffle.jsx new file mode 100644 index 0000000..be5e0e7 --- /dev/null +++ b/Server/src/components/ui/Shuffle.jsx @@ -0,0 +1,392 @@ +"use client"; +import React, { useRef, useEffect, useState, useMemo } from 'react'; +import { gsap } from 'gsap'; +import { ScrollTrigger } from 'gsap/ScrollTrigger'; +import { SplitText as GSAPSplitText } from 'gsap/SplitText'; +import { useGSAP } from '@gsap/react'; + +gsap.registerPlugin(ScrollTrigger, GSAPSplitText, useGSAP); + +const Shuffle = ({ + text, + className = '', + style = {}, + shuffleDirection = 'right', + duration = 0.35, + maxDelay = 0, + ease = 'power3.out', + threshold = 0.1, + rootMargin = '-100px', + tag = 'p', + textAlign = 'center', + onShuffleComplete, + shuffleTimes = 1, + animationMode = 'evenodd', + loop = false, + loopDelay = 0, + stagger = 0.03, + scrambleCharset = '', + colorFrom, + colorTo, + triggerOnce = true, + respectReducedMotion = true, + triggerOnHover = true +}) => { + const ref = useRef(null); + const [fontsLoaded, setFontsLoaded] = useState(false); + const [ready, setReady] = useState(false); + + const splitRef = useRef(null); + const wrappersRef = useRef([]); + const tlRef = useRef(null); + const playingRef = useRef(false); + const hoverHandlerRef = useRef(null); + + const userHasFont = useMemo( + () => (style && style.fontFamily) || (className && /font[-[]/i.test(className)), + [style, className] + ); + + const scrollTriggerStart = useMemo(() => { + const startPct = (1 - threshold) * 100; + const mm = /^(-?\d+(?:\.\d+)?)(px|em|rem|%)?$/.exec(rootMargin || ''); + const mv = mm ? parseFloat(mm[1]) : 0; + const mu = mm ? mm[2] || 'px' : 'px'; + const sign = mv === 0 ? '' : mv < 0 ? `-=${Math.abs(mv)}${mu}` : `+=${mv}${mu}`; + return `top ${startPct}%${sign}`; + }, [threshold, rootMargin]); + + useEffect(() => { + if ('fonts' in document) { + if (document.fonts.status === 'loaded') setFontsLoaded(true); + else document.fonts.ready.then(() => setFontsLoaded(true)); + } else setFontsLoaded(true); + }, []); + + useGSAP( + () => { + if (!ref.current || !text || !fontsLoaded) return; + + if (respectReducedMotion && window.matchMedia && window.matchMedia('(prefers-reduced-motion: reduce)').matches) { + onShuffleComplete?.(); + return; + } + + const el = ref.current; + + let computedFont = ''; + if (userHasFont) { + computedFont = style.fontFamily || getComputedStyle(el).fontFamily || ''; + } else { + computedFont = `'Press Start 2P', sans-serif`; + } + + const start = scrollTriggerStart; + + const removeHover = () => { + if (hoverHandlerRef.current && ref.current) { + ref.current.removeEventListener('mouseenter', hoverHandlerRef.current); + hoverHandlerRef.current = null; + } + }; + + const teardown = () => { + if (tlRef.current) { + tlRef.current.kill(); + tlRef.current = null; + } + if (wrappersRef.current.length) { + wrappersRef.current.forEach(wrap => { + const inner = wrap.firstElementChild; + const orig = inner?.querySelector('[data-orig="1"]'); + if (orig && wrap.parentNode) wrap.parentNode.replaceChild(orig, wrap); + }); + wrappersRef.current = []; + } + try { + splitRef.current?.revert(); + } catch { + /* noop */ + } + splitRef.current = null; + playingRef.current = false; + }; + + const build = () => { + teardown(); + + splitRef.current = new GSAPSplitText(el, { + type: 'chars', + charsClass: 'shuffle-char', + wordsClass: 'shuffle-word', + linesClass: 'shuffle-line', + smartWrap: true, + reduceWhiteSpace: false + }); + + const chars = splitRef.current.chars || []; + wrappersRef.current = []; + + const rolls = Math.max(1, Math.floor(shuffleTimes)); + const rand = set => set.charAt(Math.floor(Math.random() * set.length)) || ''; + + chars.forEach(ch => { + const parent = ch.parentElement; + if (!parent) return; + + const w = ch.getBoundingClientRect().width; + const h = ch.getBoundingClientRect().height; + if (!w) return; + + const wrap = document.createElement('span'); + wrap.className = 'inline-block overflow-hidden text-left'; + Object.assign(wrap.style, { + width: w + 'px', + height: shuffleDirection === 'up' || shuffleDirection === 'down' ? h + 'px' : 'auto', + verticalAlign: 'bottom' + }); + + const inner = document.createElement('span'); + inner.className = + 'inline-block will-change-transform origin-left transform-gpu ' + + (shuffleDirection === 'up' || shuffleDirection === 'down' ? 'whitespace-normal' : 'whitespace-nowrap'); + + parent.insertBefore(wrap, ch); + wrap.appendChild(inner); + + const firstOrig = ch.cloneNode(true); + firstOrig.className = + 'text-left ' + (shuffleDirection === 'up' || shuffleDirection === 'down' ? 'block' : 'inline-block'); + Object.assign(firstOrig.style, { width: w + 'px', fontFamily: computedFont }); + + ch.setAttribute('data-orig', '1'); + ch.className = + 'text-left ' + (shuffleDirection === 'up' || shuffleDirection === 'down' ? 'block' : 'inline-block'); + Object.assign(ch.style, { width: w + 'px', fontFamily: computedFont }); + + inner.appendChild(firstOrig); + for (let k = 0; k < rolls; k++) { + const c = ch.cloneNode(true); + if (scrambleCharset) c.textContent = rand(scrambleCharset); + c.className = + 'text-left ' + (shuffleDirection === 'up' || shuffleDirection === 'down' ? 'block' : 'inline-block'); + Object.assign(c.style, { width: w + 'px', fontFamily: computedFont }); + inner.appendChild(c); + } + inner.appendChild(ch); + + const steps = rolls + 1; + + if (shuffleDirection === 'right' || shuffleDirection === 'down') { + const firstCopy = inner.firstElementChild; + const real = inner.lastElementChild; + if (real) inner.insertBefore(real, inner.firstChild); + if (firstCopy) inner.appendChild(firstCopy); + } + + let startX = 0; + let finalX = 0; + let startY = 0; + let finalY = 0; + + if (shuffleDirection === 'right') { + startX = -steps * w; + finalX = 0; + } else if (shuffleDirection === 'left') { + startX = 0; + finalX = -steps * w; + } else if (shuffleDirection === 'down') { + startY = -steps * h; + finalY = 0; + } else if (shuffleDirection === 'up') { + startY = 0; + finalY = -steps * h; + } + + if (shuffleDirection === 'left' || shuffleDirection === 'right') { + gsap.set(inner, { x: startX, y: 0, force3D: true }); + inner.setAttribute('data-start-x', String(startX)); + inner.setAttribute('data-final-x', String(finalX)); + } else { + gsap.set(inner, { x: 0, y: startY, force3D: true }); + inner.setAttribute('data-start-y', String(startY)); + inner.setAttribute('data-final-y', String(finalY)); + } + + if (colorFrom) inner.style.color = colorFrom; + wrappersRef.current.push(wrap); + }); + }; + + const inners = () => wrappersRef.current.map(w => w.firstElementChild); + + const randomizeScrambles = () => { + if (!scrambleCharset) return; + wrappersRef.current.forEach(w => { + const strip = w.firstElementChild; + if (!strip) return; + const kids = Array.from(strip.children); + for (let i = 1; i < kids.length - 1; i++) { + kids[i].textContent = scrambleCharset.charAt(Math.floor(Math.random() * scrambleCharset.length)); + } + }); + }; + + const cleanupToStill = () => { + wrappersRef.current.forEach(w => { + const strip = w.firstElementChild; + if (!strip) return; + const real = strip.querySelector('[data-orig="1"]'); + if (!real) return; + strip.replaceChildren(real); + strip.style.transform = 'none'; + strip.style.willChange = 'auto'; + }); + }; + + const play = () => { + const strips = inners(); + if (!strips.length) return; + + playingRef.current = true; + const isVertical = shuffleDirection === 'up' || shuffleDirection === 'down'; + + const tl = gsap.timeline({ + smoothChildTiming: true, + repeat: loop ? -1 : 0, + repeatDelay: loop ? loopDelay : 0, + onRepeat: () => { + if (scrambleCharset) randomizeScrambles(); + if (isVertical) { + gsap.set(strips, { y: (i, t) => parseFloat(t.getAttribute('data-start-y') || '0') }); + } else { + gsap.set(strips, { x: (i, t) => parseFloat(t.getAttribute('data-start-x') || '0') }); + } + onShuffleComplete?.(); + }, + onComplete: () => { + playingRef.current = false; + if (!loop) { + cleanupToStill(); + if (colorTo) gsap.set(strips, { color: colorTo }); + onShuffleComplete?.(); + armHover(); + } + } + }); + + const addTween = (targets, at) => { + const vars = { + duration, + ease, + force3D: true, + stagger: animationMode === 'evenodd' ? stagger : 0 + }; + if (isVertical) { + vars.y = (i, t) => parseFloat(t.getAttribute('data-final-y') || '0'); + } else { + vars.x = (i, t) => parseFloat(t.getAttribute('data-final-x') || '0'); + } + + tl.to(targets, vars, at); + + if (colorFrom && colorTo) tl.to(targets, { color: colorTo, duration, ease }, at); + }; + + if (animationMode === 'evenodd') { + const odd = strips.filter((_, i) => i % 2 === 1); + const even = strips.filter((_, i) => i % 2 === 0); + const oddTotal = duration + Math.max(0, odd.length - 1) * stagger; + const evenStart = odd.length ? oddTotal * 0.7 : 0; + if (odd.length) addTween(odd, 0); + if (even.length) addTween(even, evenStart); + } else { + strips.forEach(strip => { + const d = Math.random() * maxDelay; + const vars = { + duration, + ease, + force3D: true + }; + if (isVertical) { + vars.y = parseFloat(strip.getAttribute('data-final-y') || '0'); + } else { + vars.x = parseFloat(strip.getAttribute('data-final-x') || '0'); + } + tl.to(strip, vars, d); + if (colorFrom && colorTo) tl.fromTo(strip, { color: colorFrom }, { color: colorTo, duration, ease }, d); + }); + } + + tlRef.current = tl; + }; + + const armHover = () => { + if (!triggerOnHover || !ref.current) return; + removeHover(); + const handler = () => { + if (playingRef.current) return; + build(); + if (scrambleCharset) randomizeScrambles(); + play(); + }; + hoverHandlerRef.current = handler; + ref.current.addEventListener('mouseenter', handler); + }; + + const create = () => { + build(); + if (scrambleCharset) randomizeScrambles(); + play(); + armHover(); + setReady(true); + }; + + const st = ScrollTrigger.create({ trigger: el, start, once: triggerOnce, onEnter: create }); + + return () => { + st.kill(); + removeHover(); + teardown(); + setReady(false); + }; + }, + { + dependencies: [ + text, + duration, + maxDelay, + ease, + scrollTriggerStart, + fontsLoaded, + shuffleDirection, + shuffleTimes, + animationMode, + loop, + loopDelay, + stagger, + scrambleCharset, + colorFrom, + colorTo, + triggerOnce, + respectReducedMotion, + triggerOnHover, + onShuffleComplete, + userHasFont + ], + scope: ref + } + ); + + const baseTw = 'inline-block whitespace-normal break-words will-change-transform uppercase text-[4rem] leading-none'; + const classes = useMemo( + () => `${baseTw} ${ready ? 'visible' : 'invisible'} ${className}`.trim(), + [baseTw, ready, className] + ); + const Tag = tag || 'p'; + const commonStyle = useMemo(() => ({ textAlign, ...style }), [textAlign, style]); + + return React.createElement(Tag, { ref: ref, className: classes, style: commonStyle }, text); +}; + +export default Shuffle; diff --git a/Server/src/components/ui/colourful-text.jsx b/Server/src/components/ui/colourful-text.jsx new file mode 100644 index 0000000..16b0d88 --- /dev/null +++ b/Server/src/components/ui/colourful-text.jsx @@ -0,0 +1,52 @@ +"use client"; +import React from "react"; +import { motion } from "motion/react"; + +export default function ColourfulText({ text }) { + const colors = [ + "rgb(131, 179, 32)", + "rgb(47, 195, 106)", + "rgb(42, 169, 210)", + "rgb(4, 112, 202)", + "rgb(107, 10, 255)", + "rgb(183, 0, 218)", + "rgb(218, 0, 171)", + "rgb(230, 64, 92)", + "rgb(232, 98, 63)", + "rgb(249, 129, 47)", + ]; + + const [currentColors, setCurrentColors] = React.useState(colors); + const [count, setCount] = React.useState(0); + + React.useEffect(() => { + const interval = setInterval(() => { + const shuffled = [...colors].sort(() => Math.random() - 0.5); + setCurrentColors(shuffled); + setCount((prev) => prev + 1); + }, 5000); + + return () => clearInterval(interval); + }, []); + + return text.split("").map((char, index) => ( + + {char} + + )); +} diff --git a/Server/src/components/ui/iphone-notification.jsx b/Server/src/components/ui/iphone-notification.jsx new file mode 100644 index 0000000..0bea74c --- /dev/null +++ b/Server/src/components/ui/iphone-notification.jsx @@ -0,0 +1,107 @@ +"use client"; +import React, { useState } from "react"; +import { motion, AnimatePresence } from "motion/react"; + +export function IPhoneNotification({ show, title, message, onClose, duration = 3000 }) { + const [isHovered, setIsHovered] = useState(false); + + React.useEffect(() => { + if (show && duration > 0) { + const timer = setTimeout(() => { + onClose && onClose(); + }, duration); + + return () => clearTimeout(timer); + } + }, [show, duration, onClose]); + + return ( + + {show && ( + setIsHovered(true)} + onHoverEnd={() => setIsHovered(false)} + whileHover={{ scale: 1.05 }} + > + +
    +
    +

    {title}

    + now +
    +

    {message}

    +
    +
    + )} +
    + ); +} + +const styles = { + card: { + position: "fixed", + top: 20, + left: "50%", + width: "100%", + maxWidth: "290px", + height: "70px", + background: "#27272a", // zinc-800 - same grey as search bar + borderRadius: "20px", + display: "flex", + alignItems: "center", + justifyContent: "left", + backdropFilter: "blur(10px)", + transition: "0.5s ease-in-out", + zIndex: 10000, + cursor: "pointer", + boxShadow: "0 4px 12px rgba(0, 0, 0, 0.5)", + border: "1px solid rgba(231, 170, 240, 0.2)", + }, + img: { + width: "50px", + height: "50px", + marginLeft: "10px", + borderRadius: "10px", + background: "linear-gradient(#d7cfcf, #9198e5)", + transition: "0.5s ease-in-out", + }, + textBox: { + width: "calc(100% - 90px)", + marginLeft: "10px", + color: "#e7aaf0", + fontFamily: "'Poppins', sans-serif", + }, + textContent: { + display: "flex", + alignItems: "center", + justifyContent: "space-between", + }, + span: { + fontSize: "10px", + opacity: 0.7, + }, + h1: { + fontSize: "16px", + fontWeight: "bold", + margin: 0, + }, + p: { + fontSize: "12px", + fontWeight: "lighter", + margin: "4px 0 0 0", + opacity: 0.8, + }, +}; \ No newline at end of file diff --git a/Server/src/components/ui/multi-step-loader.jsx b/Server/src/components/ui/multi-step-loader.jsx new file mode 100644 index 0000000..a5b2d69 --- /dev/null +++ b/Server/src/components/ui/multi-step-loader.jsx @@ -0,0 +1,97 @@ +"use client"; + +import { useState, useEffect } from "react"; +import { AnimatePresence, motion } from "motion/react"; + +function LoaderCore({ loadingStates, value }) { + return ( +
    + {loadingStates.map((state, index) => { + const distance = Math.abs(index - value); + const opacity = Math.max(1 - distance * 0.2, 0); + return ( + +
    + {index > value ? ( + + + + ) : ( + + + + )} +
    + + {state.text} + +
    + ); + })} +
    + ); +} + +export function MultiStepLoader({ + loadingStates, + loading = false, + duration = 2000, + loop = true, +}) { + const [currentValue, setCurrentValue] = useState(0); + + useEffect(() => { + if (!loading) { + setCurrentValue(0); + return; + } + const timer = setTimeout(() => { + setCurrentValue((prev) => + loop + ? prev === loadingStates.length - 1 + ? 0 + : prev + 1 + : Math.min(prev + 1, loadingStates.length - 1) + ); + }, duration); + + return () => clearTimeout(timer); + }, [currentValue, loading, loop, duration, loadingStates.length]); + + return ( + + {loading && ( + +
    + +
    +
    + + )} + + ); +} diff --git a/Server/src/components/ui/placeholders-and-vanish-input.jsx b/Server/src/components/ui/placeholders-and-vanish-input.jsx new file mode 100644 index 0000000..474aac2 --- /dev/null +++ b/Server/src/components/ui/placeholders-and-vanish-input.jsx @@ -0,0 +1,262 @@ +"use client"; + +import { AnimatePresence, motion } from "motion/react"; +import { useCallback, useEffect, useRef, useState } from "react"; +import { cn } from "@/lib/utils"; + +export function PlaceholdersAndVanishInput({ + placeholders, + onChange, + onSubmit +}) { + const [currentPlaceholder, setCurrentPlaceholder] = useState(0); + + const intervalRef = useRef(null); + const startAnimation = () => { + intervalRef.current = setInterval(() => { + setCurrentPlaceholder((prev) => (prev + 1) % placeholders.length); + }, 3000); + }; + const handleVisibilityChange = () => { + if (document.visibilityState !== "visible" && intervalRef.current) { + clearInterval(intervalRef.current); // Clear the interval when the tab is not visible + intervalRef.current = null; + } else if (document.visibilityState === "visible") { + startAnimation(); // Restart the interval when the tab becomes visible + } + }; + + useEffect(() => { + startAnimation(); + document.addEventListener("visibilitychange", handleVisibilityChange); + + return () => { + if (intervalRef.current) { + clearInterval(intervalRef.current); + } + document.removeEventListener("visibilitychange", handleVisibilityChange); + }; + }, [placeholders]); + + const canvasRef = useRef(null); + const newDataRef = useRef([]); + const inputRef = useRef(null); + const [value, setValue] = useState(""); + const [animating, setAnimating] = useState(false); + + const draw = useCallback(() => { + if (!inputRef.current) return; + const canvas = canvasRef.current; + if (!canvas) return; + const ctx = canvas.getContext("2d"); + if (!ctx) return; + + canvas.width = 800; + canvas.height = 800; + ctx.clearRect(0, 0, 800, 800); + const computedStyles = getComputedStyle(inputRef.current); + + const fontSize = parseFloat(computedStyles.getPropertyValue("font-size")); + ctx.font = `${fontSize * 2}px ${computedStyles.fontFamily}`; + ctx.fillStyle = "#FFF"; + ctx.fillText(value, 16, 40); + + const imageData = ctx.getImageData(0, 0, 800, 800); + const pixelData = imageData.data; + const newData = []; + + for (let t = 0; t < 800; t++) { + let i = 4 * t * 800; + for (let n = 0; n < 800; n++) { + let e = i + 4 * n; + if ( + pixelData[e] !== 0 && + pixelData[e + 1] !== 0 && + pixelData[e + 2] !== 0 + ) { + newData.push({ + x: n, + y: t, + color: [ + pixelData[e], + pixelData[e + 1], + pixelData[e + 2], + pixelData[e + 3], + ], + }); + } + } + } + + newDataRef.current = newData.map(({ x, y, color }) => ({ + x, + y, + r: 1, + color: `rgba(${color[0]}, ${color[1]}, ${color[2]}, ${color[3]})`, + })); + }, [value]); + + useEffect(() => { + draw(); + }, [value, draw]); + + const animate = (start) => { + const animateFrame = (pos = 0) => { + requestAnimationFrame(() => { + const newArr = []; + for (let i = 0; i < newDataRef.current.length; i++) { + const current = newDataRef.current[i]; + if (current.x < pos) { + newArr.push(current); + } else { + if (current.r <= 0) { + current.r = 0; + continue; + } + current.x += Math.random() > 0.5 ? 1 : -1; + current.y += Math.random() > 0.5 ? 1 : -1; + current.r -= 0.05 * Math.random(); + newArr.push(current); + } + } + newDataRef.current = newArr; + const ctx = canvasRef.current?.getContext("2d"); + if (ctx) { + ctx.clearRect(pos, 0, 800, 800); + newDataRef.current.forEach((t) => { + const { x: n, y: i, r: s, color: color } = t; + if (n > pos) { + ctx.beginPath(); + ctx.rect(n, i, s, s); + ctx.fillStyle = color; + ctx.strokeStyle = color; + ctx.stroke(); + } + }); + } + if (newDataRef.current.length > 0) { + animateFrame(pos - 8); + } else { + setValue(""); + setAnimating(false); + } + }); + }; + animateFrame(start); + }; + + const handleKeyDown = (e) => { + if (e.key === "Enter" && !animating) { + vanishAndSubmit(); + } + }; + + const vanishAndSubmit = () => { + setAnimating(true); + draw(); + + const value = inputRef.current?.value || ""; + if (value && inputRef.current) { + const maxX = newDataRef.current.reduce((prev, current) => (current.x > prev ? current.x : prev), 0); + animate(maxX); + } + }; + + const handleSubmit = (e) => { + e.preventDefault(); + const url = inputRef.current?.value || ""; + vanishAndSubmit(); + onSubmit && onSubmit(e, url); + }; + return ( +
    + + { + if (!animating) { + setValue(e.target.value); + onChange && onChange(e); + } + }} + onKeyDown={handleKeyDown} + ref={inputRef} + value={value} + type="text" + className={cn( + "w-full relative text-sm sm:text-base z-50 border-none dark:text-white bg-transparent text-black h-full rounded-full focus:outline-none focus:ring-0 pl-4 sm:pl-10 pr-20", + animating && "text-transparent dark:text-transparent" + )} /> + +
    + + {!value && ( + + {placeholders[currentPlaceholder]} + + )} + +
    + + ); +} diff --git a/Server/src/index.css b/Server/src/index.css new file mode 100644 index 0000000..2d493a1 --- /dev/null +++ b/Server/src/index.css @@ -0,0 +1,43 @@ +@import "tailwindcss"; + +:root { + --bg: #0b0d12; + --panel: #121624; + --panel2: #0f1320; + --text: #e8eaf1; + --muted: #9aa3b2; + --line: #22283a; + --accent: #6aa6ff; + --good: #4ade80; + --warn: #fbbf24; + --bad: #f87171; + --shadow: 0 10px 30px rgba(0, 0, 0, 0.35); + --radius: 18px; +} + +/* Hide scrollbar but keep scrolling functionality */ +.hide-scrollbar { + -ms-overflow-style: none; /* IE and Edge */ + scrollbar-width: none; /* Firefox */ +} + +.hide-scrollbar::-webkit-scrollbar { + display: none; /* Chrome, Safari and Opera */ +} + +@theme inline { + --animate-cell-ripple: cell-ripple var(--duration, 200ms) ease-out none 1 + var(--delay, 0ms); + + @keyframes cell-ripple { + 0% { + opacity: 0.4; + } + 50% { + opacity: 0.8; + } + 100% { + opacity: 0.4; + } + } +} diff --git a/Server/src/lib/appwrite.js b/Server/src/lib/appwrite.js new file mode 100644 index 0000000..753a482 --- /dev/null +++ b/Server/src/lib/appwrite.js @@ -0,0 +1,59 @@ +/** + * Zentrales Appwrite Client Setup + * Stellt Client, Account, Databases Instanzen und Helper-Funktionen bereit + */ + +import { Client, Account, Databases } from "appwrite"; + +// Konfiguration aus Environment-Variablen oder Defaults +const endpoint = import.meta.env.VITE_APPWRITE_ENDPOINT || "https://appwrite.webklar.com/v1"; +const projectId = import.meta.env.VITE_APPWRITE_PROJECT_ID || "696b82bb0036d2e547ad"; +const databaseId = import.meta.env.VITE_APPWRITE_DATABASE_ID || "eship-db"; +const usersCollectionId = import.meta.env.VITE_APPWRITE_USERS_COLLECTION_ID || "users"; +const accountsCollectionId = import.meta.env.VITE_APPWRITE_ACCOUNTS_COLLECTION_ID || "accounts"; + +// Client initialisieren +const client = new Client() + .setEndpoint(endpoint) + .setProject(projectId); + +// Service-Instanzen +const account = new Account(client); +const databases = new Databases(client); + +/** + * Gibt den aktuell eingeloggten User zurück + * @returns {Promise} User-Objekt oder null + */ +export async function getAuthUser() { + try { + const user = await account.get(); + return user; + } catch (e) { + // Session nicht vorhanden oder abgelaufen + if (e.code === 401 || e.type === 'general_unauthorized_scope') { + return null; + } + console.warn("Fehler beim Abrufen des Users:", e); + return null; + } +} + +/** + * Prüft ob eine gültige Session existiert und leitet ggf. zum Login um + * @param {Function} navigate - Navigations-Funktion (z.B. von useHashRoute) + * @param {string} loginRoute - Route zum Login (default: "/") + * @returns {Promise} User-Objekt oder null (wenn nicht eingeloggt) + */ +export async function ensureSessionOrRedirect(navigate, loginRoute = "/") { + const user = await getAuthUser(); + if (!user && navigate) { + // Redirect zu Login (aktuell noch kein separater Login-Route, daher "/") + // TODO: Wenn Login-Route existiert, hier verwenden + navigate(loginRoute); + } + return user; +} + +// Exports +export { client, account, databases, databaseId, usersCollectionId, accountsCollectionId }; diff --git a/Server/src/lib/routing.js b/Server/src/lib/routing.js new file mode 100644 index 0000000..ead3b90 --- /dev/null +++ b/Server/src/lib/routing.js @@ -0,0 +1,39 @@ +import { useState, useEffect } from "react"; + +/** + * Einfaches Hash-basiertes Routing System + * Verwendet URL Hash (#/path) für Navigation ohne Page Reload + */ + +export function useHashRoute() { + const [route, setRoute] = useState(() => { + // Initial route aus Hash extrahieren + const hash = window.location.hash.slice(1) || "/"; + return hash.startsWith("/") ? hash : `/${hash}`; + }); + + useEffect(() => { + const handleHashChange = () => { + const hash = window.location.hash.slice(1) || "/"; + const newRoute = hash.startsWith("/") ? hash : `/${hash}`; + setRoute(newRoute); + }; + + // Event Listener für Hash-Änderungen + window.addEventListener("hashchange", handleHashChange); + + // Initial check + handleHashChange(); + + return () => { + window.removeEventListener("hashchange", handleHashChange); + }; + }, []); + + const navigate = (path) => { + const newPath = path.startsWith("/") ? path : `/${path}`; + window.location.hash = newPath; + }; + + return { route, navigate }; +} \ No newline at end of file diff --git a/Server/src/lib/utils.js b/Server/src/lib/utils.js new file mode 100644 index 0000000..378ccef --- /dev/null +++ b/Server/src/lib/utils.js @@ -0,0 +1,6 @@ +import { clsx } from "clsx"; +import { twMerge } from "tailwind-merge"; + +export function cn(...inputs) { + return twMerge(clsx(inputs)); +} diff --git a/Server/src/main.jsx b/Server/src/main.jsx new file mode 100644 index 0000000..89f91e5 --- /dev/null +++ b/Server/src/main.jsx @@ -0,0 +1,10 @@ +import { StrictMode } from 'react' +import { createRoot } from 'react-dom/client' +import App from './App.jsx' +import './index.css' + +createRoot(document.getElementById('root')).render( + + + , +) diff --git a/Server/src/pages/AccountsPage.jsx b/Server/src/pages/AccountsPage.jsx new file mode 100644 index 0000000..7b07de6 --- /dev/null +++ b/Server/src/pages/AccountsPage.jsx @@ -0,0 +1,656 @@ +"use client"; +import React, { useState, useEffect } from "react"; +import { IconPlus, IconChevronDown, IconX, IconRefresh } from "@tabler/icons-react"; +import { motion, AnimatePresence } from "motion/react"; +import { cn } from "../lib/utils"; +import { useHashRoute } from "../lib/routing"; +import { + setActiveAccountId, + getAccountDisplayName, +} from "../services/accountService"; +import { fetchManagedAccounts, createManagedAccount, updateManagedAccount } from "../services/accountsService"; +import { getAuthUser } from "../lib/appwrite"; +import { parseEbayAccount } from "../services/ebayParserService"; +import { DataTable } from "../components/dashboard/ui/DataTable"; + +export const AccountsPage = () => { + const { navigate } = useHashRoute(); + const [accounts, setAccounts] = useState([]); + const [loading, setLoading] = useState(true); + const [showAdvanced, setShowAdvanced] = useState(false); + const [showAddForm, setShowAddForm] = useState(false); + const [formError, setFormError] = useState(""); + const [formSuccess, setFormSuccess] = useState(""); + const [formLoading, setFormLoading] = useState(false); + + // Parse-State für Zwei-Phasen-Flow + const [parsedData, setParsedData] = useState(null); + const [parsing, setParsing] = useState(false); + const [parsingError, setParsingError] = useState(""); + + // Refresh-State pro Account + const [refreshingAccountId, setRefreshingAccountId] = useState(null); + const [refreshToast, setRefreshToast] = useState({ show: false, message: "", type: "success" }); + + // Form-Felder (nur noch URL) + const [formData, setFormData] = useState({ + account_url: "", + }); + + // Accounts laden + useEffect(() => { + loadAccounts(); + }, []); + + async function loadAccounts() { + setLoading(true); + try { + const authUser = await getAuthUser(); + if (!authUser) { + setAccounts([]); + return; + } + + const loadedAccounts = await fetchManagedAccounts(authUser.$id); + setAccounts(loadedAccounts); + } catch (e) { + console.error("Fehler beim Laden der Accounts:", e); + setAccounts([]); + } finally { + setLoading(false); + } + } + + const handleSelectAccount = (account) => { + const accountId = account.$id || account.id; + setActiveAccountId(accountId); + // Navigiere zurück zum Dashboard + navigate("/"); + }; + + const handleRefreshAccount = async (account) => { + const accountId = account.$id || account.id; + const accountUrl = account.account_url; + + if (!accountUrl) { + setRefreshToast({ show: true, message: "Account hat keine URL zum Aktualisieren.", type: "error" }); + setTimeout(() => setRefreshToast({ show: false, message: "", type: "success" }), 3000); + return; + } + + setRefreshingAccountId(accountId); + + try { + // URL erneut parsen + const parsedData = await parseEbayAccount(accountUrl); + + // Account in DB aktualisieren + // WICHTIG: Nur Felder setzen, die nicht leer sind und sich geändert haben + // Leere account_platform_account_id würde Unique-Index-Konflikte verursachen + const updatePayload = {}; + + // Nur market setzen, wenn nicht leer + if (parsedData.market && parsedData.market.trim()) { + updatePayload.account_platform_market = parsedData.market; + } + + // Nur sellerId setzen, wenn nicht leer (verhindert Unique-Index-Konflikte mit leerem String) + if (parsedData.sellerId && parsedData.sellerId.trim()) { + updatePayload.account_platform_account_id = parsedData.sellerId; + } + + // Shop-Name und account_sells können auch leer sein (optional) + updatePayload.account_shop_name = parsedData.shopName || null; + updatePayload.account_sells = parsedData.stats?.itemsSold ?? null; + + // #region agent log + fetch('http://127.0.0.1:7242/ingest/246fe132-ecc5-435f-bd9c-fe5e8e26089d',{method:'POST',headers:{'Content-Type':'application/json'},body:JSON.stringify({location:'AccountsPage.jsx:93',message:'handleRefreshAccount: update payload',data:{payload:updatePayload},timestamp:Date.now(),sessionId:'debug-session',runId:'run1',hypothesisId:'A'})}).catch(()=>{}); + // #endregion + + // account_status wird weggelassen (wie beim Erstellen) + // Grund: Schema-Konflikt - Enum-Feld akzeptiert weder String noch Array im Update + // TODO: Schema in Appwrite prüfen und korrigieren, dann account_status wieder hinzufügen + + await updateManagedAccount(accountId, updatePayload); + + // Accounts-Liste neu laden (in-place Update) + await loadAccounts(); + + // Success-Toast + setRefreshToast({ show: true, message: "Account aktualisiert", type: "success" }); + setTimeout(() => setRefreshToast({ show: false, message: "", type: "success" }), 3000); + } catch (e) { + console.error("Fehler beim Aktualisieren des Accounts:", e); + + let errorMessage = "Update fehlgeschlagen"; + if (e.message?.includes("Parsing") || e.message?.includes("URL")) { + errorMessage = "Parsing fehlgeschlagen"; + } + + setRefreshToast({ show: true, message: errorMessage, type: "error" }); + setTimeout(() => setRefreshToast({ show: false, message: "", type: "success" }), 3000); + } finally { + setRefreshingAccountId(null); + } + }; + + const handleAddAccount = () => { + setShowAddForm(true); + setFormError(""); + setFormSuccess(""); + }; + + const handleCloseForm = () => { + setShowAddForm(false); + setFormError(""); + setFormSuccess(""); + setParsedData(null); + setParsingError(""); + // Form zurücksetzen + setFormData({ + account_url: "", + }); + }; + + const handleFormChange = (field, value) => { + setFormData((prev) => ({ ...prev, [field]: value })); + // Clear errors beim Eingeben + if (formError) setFormError(""); + if (parsingError) setParsingError(""); + }; + + const handleParseUrl = async () => { + const url = formData.account_url?.trim(); + + if (!url) { + setParsingError("Bitte gib eine eBay-URL ein."); + return; + } + + setParsing(true); + setParsingError(""); + setFormError(""); + + try { + const result = await parseEbayAccount(url); + setParsedData(result); + setParsingError(""); + } catch (e) { + setParsingError(e.message || "Bitte gib eine gültige eBay-URL ein."); + setParsedData(null); + } finally { + setParsing(false); + } + }; + + const handleFormSubmit = async (e) => { + e.preventDefault(); + + // Wenn noch nicht geparst, zuerst parsen + if (!parsedData) { + await handleParseUrl(); + return; + } + + // Save-Phase: Account in DB speichern + setFormError(""); + setFormSuccess(""); + setFormLoading(true); + + try { + const authUser = await getAuthUser(); + if (!authUser) { + setFormError("Nicht eingeloggt. Bitte neu anmelden."); + return; + } + + // Payload aus parsedData zusammenstellen + const accountSellsValue = parsedData.stats?.itemsSold ?? null; + // #region agent log + fetch('http://127.0.0.1:7242/ingest/246fe132-ecc5-435f-bd9c-fe5e8e26089d',{method:'POST',headers:{'Content-Type':'application/json'},body:JSON.stringify({location:'AccountsPage.jsx:193',message:'handleFormSubmit: parsedData before save',data:{hasStats:!!parsedData.stats,itemsSold:parsedData.stats?.itemsSold,accountSellsValue},timestamp:Date.now(),sessionId:'debug-session',runId:'run1',hypothesisId:'D'})}).catch(()=>{}); + // #endregion + const newAccount = await createManagedAccount(authUser.$id, { + account_url: formData.account_url.trim(), + account_platform_account_id: parsedData.sellerId, + account_platform_market: parsedData.market, + account_shop_name: parsedData.shopName, + account_sells: accountSellsValue, + // account_status wird nicht mehr gesendet (optional, Schema-Problem in Appwrite) + }); + + // Erfolg: Liste refreshen + await loadAccounts(); + + // Wenn dies das erste Account ist, setze es als aktiv + if (accounts.length === 0) { + setActiveAccountId(newAccount.$id); + } + + setFormSuccess("Account erfolgreich erstellt!"); + setTimeout(() => { + handleCloseForm(); + }, 1500); + } catch (e) { + // Fehlerbehandlung + const errorMessage = + e.message || "Fehler beim Erstellen des Accounts. Bitte versuche es erneut."; + setFormError(errorMessage); + } finally { + setFormLoading(false); + } + }; + + // Spalten für die Tabelle + const columns = [ + "Account Name", + "Platform", + "Platform Account ID", + "Market", + "Account URL", + "Status", + "Last Scan", + ...(showAdvanced ? ["Owner User ID"] : []), + "Action", + ]; + + const renderCell = (col, row) => { + if (col === "Action") { + const accountId = row.$id || row.id; + const isRefreshing = refreshingAccountId === accountId; + + return ( +
    + + +
    + ); + } + + if (col === "Account Name") { + return getAccountDisplayName(row) || "-"; + } + + if (col === "Platform") { + return row.account_platform || "-"; + } + + if (col === "Platform Account ID") { + return row.account_platform_account_id || "-"; + } + + if (col === "Market") { + return row.account_platform_market || "-"; + } + + if (col === "Account URL") { + const url = row.account_url; + if (!url) return "-"; + return ( + + {url.length > 40 ? `${url.substring(0, 40)}...` : url} + + ); + } + + if (col === "Status") { + return row.account_status || "-"; + } + + if (col === "Last Scan") { + const lastScan = row.account_last_scan_at; + if (!lastScan) return "-"; + try { + const date = new Date(lastScan); + return date.toLocaleString("de-DE", { + day: "2-digit", + month: "2-digit", + year: "numeric", + hour: "2-digit", + minute: "2-digit", + }); + } catch (e) { + return "-"; + } + } + + if (col === "Owner User ID") { + return row.account_owner_user_id || "-"; + } + + return "-"; + }; + + return ( +
    +
    + {/* Header */} +
    +
    +

    + Accounts +

    +

    + Verwalte deine Plattform-Accounts +

    +
    + +
    + + {/* Hilfe-Panel */} +
    +
    +
    +

    + Account hinzufügen +

    +
    +
    + + eBay Account URL (Pflichtfeld) + + : Gib einfach die eBay-URL zum Verkäuferprofil oder Shop ein. Alle weiteren Informationen (Market, Seller ID, Shop Name) werden automatisch erkannt. +
    +
    + + Market (Auto) + + : Wird automatisch aus der URL extrahiert (z.B. DE, US, UK). Du musst nichts eingeben. +
    +
    + + eBay Seller ID (Auto) + + : Wird automatisch erkannt. Dies ist die eindeutige Verkäufer-Kennung von eBay und verhindert Duplikate. +
    +
    + + Shop Name (Auto) + + : Öffentlich sichtbarer Name des Shops. Wird automatisch aus der URL/Seite extrahiert. +
    +
    + + Status (Auto) + + : Wird automatisch auf "active" gesetzt. Du musst nichts eingeben. +
    +
    +
    + So funktioniert's:{" "} + Gib einfach die eBay-URL ein und klicke auf "Account hinzufügen". Das System liest alle notwendigen Informationen automatisch aus. Du musst keine technischen Felder manuell ausfüllen. +
    + + {/* Advanced Toggle */} + +
    +
    + + {/* Toast Notification */} + + {refreshToast.show && ( + + {refreshToast.message} + + )} + + + {/* Tabelle */} +
    +
    +
    + {loading ? ( +
    + Loading accounts... +
    + ) : ( + + )} +
    +
    + + {/* Add Account Form Modal */} + + {showAddForm && ( + + e.stopPropagation()} + className="relative w-full max-w-2xl rounded-2xl border border-[var(--line)] bg-white p-6 shadow-xl dark:bg-neutral-800" + > + {/* Close Button */} + + + {/* Form Header */} +

    + Add Account +

    + + {/* Error/Success Messages */} + {parsingError && ( +
    + {parsingError} +
    + )} + {formError && ( +
    + {formError} +
    + )} + {formSuccess && ( +
    + {formSuccess} +
    + )} + + {/* Form */} +
    + {/* Phase 1: URL Input */} +
    + + handleFormChange("account_url", e.target.value)} + placeholder="https://www.ebay.de/usr/..." + required + disabled={parsing || formLoading} + className="w-full rounded-lg border border-[var(--line)] bg-white px-3 py-2 text-sm text-[var(--text)] outline-none transition-colors focus:border-blue-500 disabled:opacity-50 disabled:cursor-not-allowed dark:bg-neutral-900" + /> +

    + Füge den Link zum eBay-Verkäuferprofil oder Shop ein. Wir lesen die Account-Daten automatisch aus. +

    +
    + + {/* Phase 2: Preview (wenn parsedData vorhanden) */} + {parsedData && ( +
    +

    + Account-Informationen (automatisch erkannt) +

    + +
    + + +

    + Automatisch erkannter Marktplatz (z.B. DE oder US). +

    +
    + +
    + + +

    + Eindeutige Verkäufer-ID von eBay. Wird für Abgleich und Duplikat-Erkennung verwendet. +

    +
    + +
    + + +

    + Öffentlich sichtbarer Name des Shops auf eBay. +

    +
    + +
    + + +

    + Automatisch aus dem eBay-Profil gelesen. +

    +
    + +
    + + +

    + Interner Status. Normalerweise "active". +

    +
    +
    + )} + + {/* Form Actions */} +
    + + {parsedData ? ( + + ) : ( + + )} +
    +
    +
    +
    + )} +
    +
    +
    + ); +}; diff --git a/Server/src/services/accountService.js b/Server/src/services/accountService.js new file mode 100644 index 0000000..6ab1508 --- /dev/null +++ b/Server/src/services/accountService.js @@ -0,0 +1,99 @@ +/** + * Account Service + * Verwaltet den aktiven Account über localStorage + */ + +const ACTIVE_ACCOUNT_ID_KEY = "active_account_id"; + +/** + * Gibt die ID des aktiven Accounts aus localStorage zurück + * @returns {string|null} Account ID oder null + */ +export function getActiveAccountId() { + try { + return localStorage.getItem(ACTIVE_ACCOUNT_ID_KEY); + } catch (e) { + console.warn("Fehler beim Lesen von localStorage:", e); + return null; + } +} + +/** + * Speichert die ID des aktiven Accounts in localStorage + * Dispatch ein CustomEvent für sofortigen Sidebar-Refresh + * @param {string} accountId - Account ID + */ +export function setActiveAccountId(accountId) { + try { + if (accountId) { + localStorage.setItem(ACTIVE_ACCOUNT_ID_KEY, accountId); + } else { + localStorage.removeItem(ACTIVE_ACCOUNT_ID_KEY); + } + + // CustomEvent dispatch für Sidebar-Refresh + window.dispatchEvent( + new CustomEvent("activeAccountChanged", { detail: { accountId } }) + ); + } catch (e) { + console.warn("Fehler beim Schreiben in localStorage:", e); + } +} + +/** + * Bestimmt den aktiven Account aus der Liste + * Wenn eine ID in localStorage gespeichert ist und gültig, wird dieser verwendet + * Ansonsten wird der erste Account als Default genommen + * @param {Array} accounts - Liste der Accounts + * @returns {Object|null} Aktiver Account oder null + */ +export function resolveActiveAccount(accounts) { + if (!accounts || accounts.length === 0) { + return null; + } + + const storedId = getActiveAccountId(); + + if (storedId) { + const foundAccount = accounts.find((acc) => acc.$id === storedId || acc.id === storedId); + if (foundAccount) { + return foundAccount; + } + } + + // Fallback: Erster Account als Default + const firstAccount = accounts[0]; + if (firstAccount) { + const accountId = firstAccount.$id || firstAccount.id; + if (accountId) { + setActiveAccountId(accountId); + } + } + + return firstAccount || null; +} + +/** + * Gibt den Display-Namen eines Accounts zurück + * Priorität: account_shop_name > account_platform_account_id + * @param {Object} account - Account Objekt + * @returns {string} Display-Name + */ +export function getAccountDisplayName(account) { + if (!account) return ""; + + if (account.account_shop_name) { + return account.account_shop_name; + } + + if (account.account_platform_account_id) { + return account.account_platform_account_id; + } + + // Fallback für alte Datenstruktur + if (account.shop) { + return account.shop; + } + + return account.id || account.$id || "Unknown Account"; +} \ No newline at end of file diff --git a/Server/src/services/accountsService.js b/Server/src/services/accountsService.js new file mode 100644 index 0000000..be1b1a0 --- /dev/null +++ b/Server/src/services/accountsService.js @@ -0,0 +1,339 @@ +/** + * Accounts Service + * CRUD-Operationen für Accounts aus Appwrite + * Verwaltet nur "Managed Accounts" (account_owner_user_id == authUserId) + */ + +import { databases, databaseId, accountsCollectionId } from "../lib/appwrite"; +import { ID, Query } from "appwrite"; + +/** + * Lädt ein einzelnes Account nach ID + * @param {string} accountId - ID des Accounts + * @returns {Promise} Account-Dokument oder null + */ +export async function getAccountById(accountId) { + if (!accountId) { + console.warn("getAccountById: accountId fehlt"); + return null; + } + + try { + const document = await databases.getDocument( + databaseId, + accountsCollectionId, + accountId + ); + return document; + } catch (e) { + // 404 bedeutet, dass das Dokument nicht existiert + if (e.code === 404 || e.type === 'document_not_found') { + return null; + } + console.error("Fehler beim Laden des Accounts:", e); + throw e; + } +} + +/** + * Leitet den Market-Code aus einem Account ab + * @param {Object} account - Account-Dokument + * @returns {string} Market-Code (z.B. "DE", "US", "UNKNOWN") + */ +export function deriveMarketFromAccount(account) { + if (!account) { + return "UNKNOWN"; + } + + // Priority 1: account_platform_market Feld vorhanden + if (account.account_platform_market && account.account_platform_market.trim()) { + return account.account_platform_market.trim().toUpperCase(); + } + + // Priority 2: Ableitung aus account_url Hostname + if (account.account_url) { + try { + const url = new URL(account.account_url); + const hostname = url.hostname.toLowerCase(); + + // Mapping von Hostname zu Market-Code + const hostnameToMarket = { + "ebay.de": "DE", + "www.ebay.de": "DE", + "ebay.com": "US", + "www.ebay.com": "US", + "ebay.co.uk": "UK", + "www.ebay.co.uk": "UK", + "ebay.fr": "FR", + "www.ebay.fr": "FR", + "ebay.it": "IT", + "www.ebay.it": "IT", + "ebay.es": "ES", + "www.ebay.es": "ES", + "ebay.ca": "CA", + "www.ebay.ca": "CA", + "ebay.com.au": "AU", + "www.ebay.com.au": "AU", + }; + + if (hostnameToMarket[hostname]) { + return hostnameToMarket[hostname]; + } + + // Fallback: Prüfe ob hostname ein bekanntes Pattern enthält + if (hostname.includes("ebay.de")) return "DE"; + if (hostname.includes("ebay.com") && !hostname.includes("ebay.com.au")) return "US"; + if (hostname.includes("ebay.co.uk")) return "UK"; + if (hostname.includes("ebay.fr")) return "FR"; + if (hostname.includes("ebay.it")) return "IT"; + if (hostname.includes("ebay.es")) return "ES"; + if (hostname.includes("ebay.ca")) return "CA"; + if (hostname.includes("ebay.com.au")) return "AU"; + } catch (e) { + // URL parsing fehlgeschlagen + console.debug("Fehler beim Parsen der Account-URL:", e); + } + } + + return "UNKNOWN"; +} + +/** + * Leitet die Währung aus einem Market-Code ab + * @param {string} market - Market-Code (z.B. "DE", "US", "UK") + * @returns {string} Währungscode (z.B. "EUR", "USD", "GBP") + */ +export function deriveCurrencyFromMarket(market) { + if (!market || market === "UNKNOWN") { + return "EUR"; // Fallback + } + + const marketUpper = market.toUpperCase(); + + // Mapping Market -> Currency + const marketToCurrency = { + // EUR Länder + "DE": "EUR", + "FR": "EUR", + "IT": "EUR", + "ES": "EUR", + "NL": "EUR", + "AT": "EUR", + "BE": "EUR", + "IE": "EUR", + // Andere Währungen + "US": "USD", + "UK": "GBP", + "CA": "CAD", + "AU": "AUD", + }; + + return marketToCurrency[marketUpper] || "EUR"; // Fallback zu EUR +} + +/** + * Lädt alle Managed Accounts für einen User + * @param {string} authUserId - ID des eingeloggten Users + * @returns {Promise} Array von Account-Dokumenten + */ +export async function fetchManagedAccounts(authUserId) { + if (!authUserId) { + console.warn("fetchManagedAccounts: authUserId fehlt"); + return []; + } + + try { + const response = await databases.listDocuments( + databaseId, + accountsCollectionId, + [ + Query.equal("account_owner_user_id", authUserId), + Query.orderDesc("$createdAt"), + ] + ); + + return response.documents; + } catch (e) { + console.error("Fehler beim Laden der Accounts:", e); + + // Wenn Collection nicht existiert oder Berechtigungen fehlen + if (e.code === 404 || e.code === 401) { + return []; + } + + throw e; + } +} + +/** + * Erstellt ein neues Managed Account + * @param {string} authUserId - ID des eingeloggten Users + * @param {Object} accountData - Account-Daten + * @param {string} accountData.account_platform_market - Required: Market (z.B. "DE", "US") + * @param {string} accountData.account_platform_account_id - Required: Platform Account ID + * @param {string} [accountData.account_shop_name] - Optional: Shop-Name + * @param {string} [accountData.account_url] - Optional: Account URL + * @param {string} [accountData.account_status] - Optional: Status (z.B. "active", "unknown", "disabled") + * @returns {Promise} Erstelltes Account-Dokument + */ +export async function createManagedAccount(authUserId, accountData) { + if (!authUserId) { + throw new Error("authUserId ist erforderlich"); + } + + // Validierung der Required-Felder + const { account_platform_market, account_platform_account_id } = accountData; + + // account_platform wird IMMER "ebay" gesetzt (eBay-only Tool) + if (!account_platform_market) { + throw new Error("account_platform_market ist erforderlich"); + } + if (!account_platform_account_id) { + throw new Error("account_platform_account_id ist erforderlich"); + } + + // Payload zusammenstellen + const payload = { + account_owner_user_id: authUserId, + account_platform: "ebay", // IMMER "ebay" für über UI erstellte Accounts + account_platform_market, + account_platform_account_id, + account_shop_name: accountData.account_shop_name || null, + account_url: accountData.account_url || null, + account_sells: accountData.account_sells ?? null, + account_managed: true, // Immer true für über die UI erstellte Accounts + }; + // #region agent log + fetch('http://127.0.0.1:7242/ingest/246fe132-ecc5-435f-bd9c-fe5e8e26089d',{method:'POST',headers:{'Content-Type':'application/json'},body:JSON.stringify({location:'accountsService.js:72',message:'createManagedAccount: payload before Appwrite',data:{account_sells:payload.account_sells,accountData_account_sells:accountData.account_sells},timestamp:Date.now(),sessionId:'debug-session',runId:'run1',hypothesisId:'E'})}).catch(()=>{}); + // #endregion + + // account_status ist optional - aufgrund Schema-Konflikt vorerst weglassen + // TODO: Schema in Appwrite prüfen und korrigieren (Enum-Feld sollte String akzeptieren, nicht Array) + // Das Feld wird erst wieder hinzugefügt, wenn das Schema korrekt konfiguriert ist + + // Document-Level Permissions für den User setzen + const permissions = [ + `read("user:${authUserId}")`, + `update("user:${authUserId}")`, + `delete("user:${authUserId}")`, + ]; + + try { + const document = await databases.createDocument( + databaseId, + accountsCollectionId, + ID.unique(), + payload, + permissions + ); + + return document; + } catch (e) { + // Duplicate-Conflict behandeln (falls Unique-Index auf platform+market+platform_account_id existiert) + if (e.code === 409 || e.message?.includes("duplicate") || e.message?.includes("unique")) { + throw new Error( + "Dieser Account ist bereits verbunden." + ); + } + + console.error("Fehler beim Erstellen des Accounts:", e); + throw e; + } +} + +/** + * Aktualisiert ein Managed Account (optional für v1) + * @param {string} accountId - ID des Accounts + * @param {Object} accountData - Zu aktualisierende Account-Daten + * @returns {Promise} Aktualisiertes Account-Dokument + */ +export async function updateManagedAccount(accountId, accountData) { + if (!accountId) { + throw new Error("accountId ist erforderlich"); + } + + try { + // Entferne undefined/null Werte aus accountData (behalte nur geänderte Felder) + const payload = {}; + Object.keys(accountData).forEach((key) => { + if (accountData[key] !== undefined && accountData[key] !== null) { + payload[key] = accountData[key]; + } + }); + + // #region agent log + fetch('http://127.0.0.1:7242/ingest/246fe132-ecc5-435f-bd9c-fe5e8e26089d',{method:'POST',headers:{'Content-Type':'application/json'},body:JSON.stringify({location:'accountsService.js:133',message:'updateManagedAccount: before updateDocument',data:{accountId,payload,payloadKeys:Object.keys(payload)},timestamp:Date.now(),sessionId:'debug-session',runId:'run1',hypothesisId:'A'})}).catch(()=>{}); + // #endregion + + const document = await databases.updateDocument( + databaseId, + accountsCollectionId, + accountId, + payload + ); + + // #region agent log + fetch('http://127.0.0.1:7242/ingest/246fe132-ecc5-435f-bd9c-fe5e8e26089d',{method:'POST',headers:{'Content-Type':'application/json'},body:JSON.stringify({location:'accountsService.js:147',message:'updateManagedAccount: success',data:{accountId},timestamp:Date.now(),sessionId:'debug-session',runId:'run1',hypothesisId:'A'})}).catch(()=>{}); + // #endregion + return document; + } catch (e) { + console.error("Fehler beim Aktualisieren des Accounts:", e); + // #region agent log + fetch('http://127.0.0.1:7242/ingest/246fe132-ecc5-435f-bd9c-fe5e8e26089d',{method:'POST',headers:{'Content-Type':'application/json'},body:JSON.stringify({location:'accountsService.js:149',message:'updateManagedAccount: error',data:{accountId,errorCode:e.code,errorMessage:e.message,errorType:e.type},timestamp:Date.now(),sessionId:'debug-session',runId:'run1',hypothesisId:'C'})}).catch(()=>{}); + // #endregion + throw e; + } +} + +/** + * Aktualisiert das account_last_scan_at Feld eines Accounts + * @param {string} accountId - ID des Accounts + * @param {string} isoString - ISO 8601 Datum-String (z.B. "2026-01-18T12:34:56.000Z") + * @returns {Promise} Aktualisiertes Account-Dokument + */ +export async function updateAccountLastScanAt(accountId, isoString) { + if (!accountId) { + throw new Error("accountId ist erforderlich"); + } + if (!isoString) { + throw new Error("isoString ist erforderlich"); + } + + try { + const document = await databases.updateDocument( + databaseId, + accountsCollectionId, + accountId, + { + account_last_scan_at: isoString, + } + ); + + return document; + } catch (e) { + console.error("Fehler beim Aktualisieren des account_last_scan_at:", e); + throw e; + } +} + +/** + * Löscht ein Managed Account (optional für v1) + * @param {string} accountId - ID des Accounts + * @returns {Promise} + */ +export async function deleteManagedAccount(accountId) { + if (!accountId) { + throw new Error("accountId ist erforderlich"); + } + + try { + await databases.deleteDocument( + databaseId, + accountsCollectionId, + accountId + ); + } catch (e) { + console.error("Fehler beim Löschen des Accounts:", e); + throw e; + } +} diff --git a/Server/src/services/dashboardService.js b/Server/src/services/dashboardService.js new file mode 100644 index 0000000..10eecd3 --- /dev/null +++ b/Server/src/services/dashboardService.js @@ -0,0 +1,301 @@ +/** + * Dashboard Service + * Stellt aggregierte Dashboard-Daten bereit, gescoped nach activeAccountId + * Nutzt productsService und accountsService für Datenabfragen + */ + +import { listProductsByAccount, getProductById } from "./productsService"; +import { databases, databaseId } from "../lib/appwrite"; +import { Query } from "appwrite"; + +const productDetailsCollectionId = + import.meta.env.VITE_APPWRITE_PRODUCT_DETAILS_COLLECTION_ID || "product_details"; + +/** + * Lädt Overview KPIs für einen aktiven Account + * @param {string} activeAccountId - ID des aktiven Accounts + * @returns {Promise<{ totalProducts: number, activeProducts: number, endedProducts: number, avgPrice: number | null, newestProducts: Array }>} + */ +export async function getOverviewKPIs(activeAccountId) { + if (!activeAccountId) { + return { + totalProducts: 0, + activeProducts: 0, + endedProducts: 0, + avgPrice: null, + newestProducts: [], + }; + } + + try { + // Lade bis zu 200 Products für KPI-Berechnung + const products = await listProductsByAccount(activeAccountId, { + limit: 200, + offset: 0, + orderBy: "$createdAt", + orderType: "desc", + }); + + const totalProducts = products.length; + + // Filtere nach Status + const activeProducts = products.filter( + (p) => p.product_status === "active" || p.product_status === "Active" + ); + const endedProducts = products.filter( + (p) => p.product_status === "ended" || p.product_status === "Ended" + ); + + // Berechne Durchschnittspreis für aktive Products + const activeWithPrice = activeProducts.filter( + (p) => p.product_price != null && !isNaN(parseFloat(p.product_price)) + ); + const avgPrice = + activeWithPrice.length > 0 + ? activeWithPrice.reduce((sum, p) => sum + parseFloat(p.product_price), 0) / + activeWithPrice.length + : null; + + // Neueste 5 Products (bereits nach $createdAt desc sortiert) + const newestProducts = products.slice(0, 5); + + return { + totalProducts, + activeProducts: activeProducts.length, + endedProducts: endedProducts.length, + avgPrice: avgPrice ? Math.round(avgPrice * 100) / 100 : null, + newestProducts, + }; + } catch (e) { + console.error("Fehler beim Laden der Overview KPIs:", e); + throw e; + } +} + +/** + * Lädt eine paginierte Seite von Products für einen aktiven Account + * @param {string} activeAccountId - ID des aktiven Accounts + * @param {Object} options - Pagination und Filter-Optionen + * @param {number} options.page - Seitennummer (1-basiert) + * @param {number} options.pageSize - Anzahl Items pro Seite + * @param {Object} [options.filters] - Filter-Optionen + * @param {string} [options.filters.status] - Status-Filter ("active", "ended", etc.) + * @param {string} [options.filters.search] - Suchbegriff für Titel (client-side) + * @returns {Promise<{ items: Array, total: number, page: number, pageSize: number }>} + */ +export async function getProductsPage(activeAccountId, options = {}) { + if (!activeAccountId) { + return { + items: [], + total: 0, + page: 1, + pageSize: options.pageSize || 25, + }; + } + + const { page = 1, pageSize = 25, filters = {} } = options; + const offset = (page - 1) * pageSize; + + try { + // Lade Products mit Pagination + // Für MVP: Lade mehr als nötig (z.B. pageSize * 3) um client-side Filter zu unterstützen + const fetchLimit = Math.max(pageSize * 3, 100); // Mindestens 100, aber mehr wenn pageSize größer + let products = await listProductsByAccount(activeAccountId, { + limit: fetchLimit, + offset: 0, + orderBy: "$createdAt", + orderType: "desc", + }); + + // Client-side Filter anwenden (falls Appwrite Query-Filter nicht unterstützt) + if (filters.status && filters.status !== "all") { + products = products.filter( + (p) => + p.product_status?.toLowerCase() === filters.status.toLowerCase() + ); + } + + if (filters.search && filters.search.trim()) { + const searchLower = filters.search.trim().toLowerCase(); + products = products.filter((p) => + p.product_title?.toLowerCase().includes(searchLower) + ); + } + + const total = products.length; + + // Pagination auf gefilterten Ergebnissen anwenden + const startIndex = offset; + const endIndex = startIndex + pageSize; + const items = products.slice(startIndex, endIndex); + + return { + items, + total, + page, + pageSize, + }; + } catch (e) { + console.error("Fehler beim Laden der Products Page:", e); + throw e; + } +} + +/** + * Lädt ein Product mit optionalen Details aus product_details Collection + * @param {string} productId - ID des Products + * @returns {Promise} Product-Objekt mit optionalen Details + */ +export async function getProductPreview(productId) { + if (!productId) { + throw new Error("productId ist erforderlich"); + } + + try { + // Lade Product + const product = await getProductById(productId); + if (!product) { + return null; + } + + // Versuche product_details zu laden (optional, falls vorhanden) + let details = null; + try { + const detailsResponse = await databases.listDocuments( + databaseId, + productDetailsCollectionId, + [Query.equal("product_detail_product_id", productId), Query.limit(1)] + ); + + if (detailsResponse.documents && detailsResponse.documents.length > 0) { + details = detailsResponse.documents[0]; + } + } catch (detailsError) { + // product_details Collection existiert möglicherweise nicht oder hat keine Permissions + // Das ist OK, Details sind optional + console.debug("product_details konnten nicht geladen werden:", detailsError); + } + + // Kombiniere Product mit Details + return { + ...product, + details, + }; + } catch (e) { + console.error("Fehler beim Laden des Product Previews:", e); + throw e; + } +} + +/** + * Lädt Insights für einen aktiven Account (regelbasiert, MVP) + * @param {string} activeAccountId - ID des aktiven Accounts + * @returns {Promise<{ trending: Array, priceSpread: Array, categoryShare: Array }>} + */ +export async function getInsights(activeAccountId) { + if (!activeAccountId) { + return { + trending: [], + priceSpread: [], + categoryShare: [], + }; + } + + try { + // Lade bis zu 500 Products für Insights-Berechnung + const products = await listProductsByAccount(activeAccountId, { + limit: 500, + offset: 0, + orderBy: "$createdAt", + orderType: "desc", + }); + + // 1. Trending: Neueste 20 Products als "recent" + const trending = products.slice(0, 20).map((p) => ({ + product: p, + label: p.product_title || p.$id, + value: p.product_price ? `EUR ${p.product_price}` : "N/A", + })); + + // 2. Price Spread: Gruppiere nach normalisiertem Titel (lowercase, remove digits) + // Berechne max-min Spread pro Gruppe, Top 5 + const titleGroups = new Map(); + + products.forEach((p) => { + if (!p.product_title || !p.product_price) return; + + // Normalisiere Titel: lowercase, entferne Zahlen + const normalizedTitle = p.product_title + .toLowerCase() + .replace(/\d+/g, "") + .trim(); + + if (!normalizedTitle) return; + + const price = parseFloat(p.product_price); + if (isNaN(price)) return; + + if (!titleGroups.has(normalizedTitle)) { + titleGroups.set(normalizedTitle, { + title: normalizedTitle, + prices: [], + originalTitles: new Set(), + }); + } + + const group = titleGroups.get(normalizedTitle); + group.prices.push(price); + group.originalTitles.add(p.product_title); + }); + + // Berechne Spread für jede Gruppe + const spreads = Array.from(titleGroups.values()) + .map((group) => { + if (group.prices.length < 2) return null; // Mindestens 2 Preise für Spread + + const minPrice = Math.min(...group.prices); + const maxPrice = Math.max(...group.prices); + const spread = maxPrice - minPrice; + + return { + title: Array.from(group.originalTitles)[0], // Erstes Original-Titel als Label + minPrice, + maxPrice, + spread, + count: group.prices.length, + label: `${Array.from(group.originalTitles)[0]} (${group.prices.length}x)`, + value: `EUR ${minPrice.toFixed(2)} - ${maxPrice.toFixed(2)} (Spread: ${spread.toFixed(2)})`, + }; + }) + .filter((s) => s !== null) + .sort((a, b) => b.spread - a.spread) // Sortiere nach Spread (höchster zuerst) + .slice(0, 5); // Top 5 + + // 3. Category Share: Zähle nach product_category, Top 5 + const categoryCounts = new Map(); + + products.forEach((p) => { + const category = p.product_category || "Uncategorized"; + categoryCounts.set(category, (categoryCounts.get(category) || 0) + 1); + }); + + const categoryShare = Array.from(categoryCounts.entries()) + .map(([category, count]) => ({ + category, + count, + label: category, + value: `${count} items`, + })) + .sort((a, b) => b.count - a.count) // Sortiere nach Count (höchster zuerst) + .slice(0, 5); // Top 5 + + return { + trending, + priceSpread: spreads, + categoryShare, + }; + } catch (e) { + console.error("Fehler beim Laden der Insights:", e); + throw e; + } +} \ No newline at end of file diff --git a/Server/src/services/ebayParserService.js b/Server/src/services/ebayParserService.js new file mode 100644 index 0000000..33e9bd1 --- /dev/null +++ b/Server/src/services/ebayParserService.js @@ -0,0 +1,515 @@ +/** + * eBay URL Parser Service (Stub) + * Extrahiert Account-Daten aus eBay-URLs + * + * WICHTIG: Dies ist eine Stub-Implementierung ohne echte Network-Calls. + * Später wird diese Funktion durch einen Call zur Browser-Extension ersetzt. + * + * Regeln: + * - Deterministisch: Gleiche URL → gleiche Daten + * - Keine Network-Calls (kein fetch, kein iframe, kein HTML-Parsing) + * - Ersetzbar durch Extension-Call + */ + +/** + * Einfacher stabiler Hash für deterministische IDs + * @param {string} str - Input string + * @returns {string} - Hash string + */ +function stableHash(str) { + let hash = 0; + for (let i = 0; i < str.length; i++) { + const char = str.charCodeAt(i); + hash = ((hash << 5) - hash) + char; + hash = hash & hash; // Convert to 32bit integer + } + return Math.abs(hash).toString(36).padStart(10, '0'); +} + +/** + * Extrahiert Marktplatz aus eBay-URL (Domain) + * @param {string} url - eBay-URL + * @returns {string} - Market Code (z.B. "DE", "US", "UK") + */ +function extractMarketFromUrl(url) { + try { + const urlObj = new URL(url); + const hostname = urlObj.hostname.toLowerCase(); + + // eBay Domain-Patterns + if (hostname.includes('.de') || hostname.includes('ebay.de')) { + return 'DE'; + } + if (hostname.includes('.com') || hostname.includes('ebay.com')) { + // Prüfe auf US-spezifische Patterns + if (hostname.includes('ebay.com') && !hostname.includes('.uk')) { + return 'US'; + } + } + if (hostname.includes('.uk') || hostname.includes('ebay.co.uk')) { + return 'UK'; + } + if (hostname.includes('.fr') || hostname.includes('ebay.fr')) { + return 'FR'; + } + if (hostname.includes('.it') || hostname.includes('ebay.it')) { + return 'IT'; + } + if (hostname.includes('.es') || hostname.includes('ebay.es')) { + return 'ES'; + } + if (hostname.includes('.nl') || hostname.includes('ebay.nl')) { + return 'NL'; + } + if (hostname.includes('.at') || hostname.includes('ebay.at')) { + return 'AT'; + } + if (hostname.includes('.ch') || hostname.includes('ebay.ch')) { + return 'CH'; + } + + // Fallback: erster Teil der Domain nach "ebay." + const match = hostname.match(/ebay\.([a-z]{2,3})/); + if (match && match[1]) { + return match[1].toUpperCase(); + } + + // Default: US + return 'US'; + } catch (e) { + return 'US'; // Fallback + } +} + +// Extension-ID Cache (gesetzt via postMessage vom Content Script) +let cachedExtensionId = null; + +// Listener für Extension-ID vom Content Script +if (typeof window !== 'undefined') { + window.addEventListener('message', (event) => { + if (event.data?.source === 'eship-extension' && event.data?.type === 'EXTENSION_ID' && event.data?.extensionId) { + cachedExtensionId = event.data.extensionId; + } + }); +} + +/** + * Prüft ob die Browser-Extension verfügbar ist + * @returns {boolean} - true wenn Extension verfügbar + */ +export function isExtensionAvailable() { + if (typeof window === 'undefined') { + return false; + } + + // Prüfe ob Extension-ID gecacht ist (via postMessage empfangen) + if (cachedExtensionId) { + return true; + } + + // Window flag (set by content script) - das ist das Haupt-Kriterium + // Der Content Script setzt window.__EBAY_EXTENSION__ = true wenn er läuft + const flagValue = window.__EBAY_EXTENSION__; + if (flagValue === true) { + return true; + } + + // chrome.runtime.sendMessage allein bedeutet NICHT, dass die Extension verfügbar ist + // (Chrome macht chrome.runtime auch ohne Extension verfügbar, aber ohne Extension-ID können wir sie nicht nutzen) + // Daher: Nur window.__EBAY_EXTENSION__ ist der zuverlässige Indikator + + return false; +} + +/** + * Holt Extension-ID (für externally_connectable messaging) + * @returns {Promise} - Extension-ID oder null + */ +async function getExtensionId() { + try { + // Methode 1: Verwende gecachte Extension-ID (via postMessage vom Content Script empfangen) + if (cachedExtensionId) { + // #region agent log + fetch('http://127.0.0.1:7242/ingest/246fe132-ecc5-435f-bd9c-fe5e8e26089d',{method:'POST',headers:{'Content-Type':'application/json'},body:JSON.stringify({location:'ebayParserService.js:135',message:'getExtensionId: found via cache',data:{cachedExtensionId},timestamp:Date.now(),sessionId:'debug-session',runId:'run1',hypothesisId:'D'})}).catch(()=>{}); + // #endregion + return cachedExtensionId; + } + + // Retry-Mechanismus: Warte auf postMessage vom Content Script + for (let attempt = 0; attempt < 10; attempt++) { + if (cachedExtensionId) { + return cachedExtensionId; + } + + // Warte kurz vor dem nächsten Versuch (außer beim letzten Versuch) + if (attempt < 9) { + await new Promise(resolve => setTimeout(resolve, 200)); // 200ms delay + } + } + + // #region agent log + fetch('http://127.0.0.1:7242/ingest/246fe132-ecc5-435f-bd9c-fe5e8e26089d',{method:'POST',headers:{'Content-Type':'application/json'},body:JSON.stringify({location:'ebayParserService.js:150',message:'getExtensionId: not found after retries',data:{hasWindow:typeof window!=='undefined'},timestamp:Date.now(),sessionId:'debug-session',runId:'run1',hypothesisId:'D'})}).catch(()=>{}); + // #endregion + return null; // Nicht verfügbar + } catch (e) { + return null; + } +} + +/** + * Parst eine eBay-URL über die Browser-Extension + * @param {string} url - eBay-Verkäuferprofil oder Shop-URL + * @returns {Promise<{sellerId: string, shopName: string, market: string, status: "active" | "unknown", stats?: object}>} + * @throws {Error} - "Extension not available" oder andere Fehler + */ +async function parseViaExtension(url) { + // Validierung + if (!url || typeof url !== 'string') { + throw new Error("Invalid URL"); + } + + // Methode 1: chrome.runtime.sendMessage (externally_connectable) + // Versuche zuerst mit Extension-ID, dann ohne (Chrome findet Extension automatisch bei externally_connectable) + if (typeof chrome !== 'undefined' && chrome.runtime && chrome.runtime.sendMessage) { + try { + const extensionId = await getExtensionId(); + + // Versuche chrome.runtime.sendMessage (mit oder ohne Extension-ID) + return new Promise((resolve, reject) => { + const message = { + action: "PARSE_URL", + url: url + }; + + // SendMessage-Callback + const sendMessageCallback = (response) => { + // Check for Chrome runtime errors + if (chrome.runtime.lastError) { + const errorMsg = chrome.runtime.lastError.message || "Extension communication error"; + // #region agent log + fetch('http://127.0.0.1:7242/ingest/246fe132-ecc5-435f-bd9c-fe5e8e26089d',{method:'POST',headers:{'Content-Type':'application/json'},body:JSON.stringify({location:'ebayParserService.js:158',message:'parseViaExtension: chrome.runtime.sendMessage error',data:{error:errorMsg,extensionId},timestamp:Date.now(),sessionId:'debug-session',runId:'run1',hypothesisId:'D'})}).catch(()=>{}); + // #endregion + reject(new Error(errorMsg)); + return; + } + + if (response && response.ok && response.data) { + // Ensure stats object is included (even if empty) + const data = { + sellerId: response.data.sellerId || "", + shopName: response.data.shopName || "", + market: response.data.market || "US", + status: response.data.status || "unknown", + stats: response.data.stats || {} + }; + // #region agent log + fetch('http://127.0.0.1:7242/ingest/246fe132-ecc5-435f-bd9c-fe5e8e26089d',{method:'POST',headers:{'Content-Type':'application/json'},body:JSON.stringify({location:'ebayParserService.js:160',message:'parseViaExtension: response data from extension',data:{hasStats:!!response.data.stats,itemsSold:response.data.stats?.itemsSold,stats:response.data.stats},timestamp:Date.now(),sessionId:'debug-session',runId:'run1',hypothesisId:'D'})}).catch(()=>{}); + // #endregion + resolve(data); + } else { + reject(new Error(response?.error || "Extension parsing failed")); + } + }; + + // Benötigt Extension-ID (sendMessage von Webseiten aus erfordert immer Extension-ID) + if (!extensionId) { + // #region agent log + fetch('http://127.0.0.1:7242/ingest/246fe132-ecc5-435f-bd9c-fe5e8e26089d',{method:'POST',headers:{'Content-Type':'application/json'},body:JSON.stringify({location:'ebayParserService.js:175',message:'parseViaExtension: no extension ID',data:{hasWindowExtensionId:!!(typeof window!=='undefined'&&window.__EBAY_EXTENSION_ID__)},timestamp:Date.now(),sessionId:'debug-session',runId:'run1',hypothesisId:'D'})}).catch(()=>{}); + // #endregion + reject(new Error("Extension ID not available")); + return; + } + + chrome.runtime.sendMessage(extensionId, message, sendMessageCallback); + + // Timeout nach 20s (Extension hat intern 15s, hier etwas mehr Puffer) + setTimeout(() => { + reject(new Error("Extension timeout")); + }, 20000); + }); + } catch (error) { + // Chrome API Fehler: Fallback zu window.postMessage wenn möglich + if (error.message && !error.message.includes("Extension")) { + throw error; + } + // Weiter zu Methode 2 + } + } + + // Methode 2: Window flag + postMessage (falls Content Script Relay vorhanden) + if (window.__EBAY_EXTENSION__ === true) { + return new Promise((resolve, reject) => { + const messageId = `parse_${Date.now()}_${Math.random()}`; + + // Listener für Antwort + const responseHandler = (event) => { + if (event.data?.source !== 'eship-extension' || event.data?.messageId !== messageId) { + return; + } + + window.removeEventListener('message', responseHandler); + + if (event.data?.ok && event.data?.data) { + const data = { + sellerId: event.data.data.sellerId || "", + shopName: event.data.data.shopName || "", + market: event.data.data.market || "US", + status: event.data.data.status || "unknown", + stats: event.data.data.stats || {} + }; + resolve(data); + } else { + reject(new Error(event.data?.error || "Extension parsing failed")); + } + }; + + window.addEventListener('message', responseHandler); + + // Sende Request via postMessage + window.postMessage({ + source: 'eship-webapp', + action: 'PARSE_URL', + url: url, + messageId: messageId + }, '*'); + + // Timeout + setTimeout(() => { + window.removeEventListener('message', responseHandler); + reject(new Error("Extension timeout")); + }, 20000); + }); + } + + // Keine Extension verfügbar + throw new Error("Extension not available"); +} + +/** + * Parst eine eBay-URL über die Browser-Extension für Produkt-Scan + * @param {string} url - eBay-Verkäuferprofil oder Shop-URL + * @param {string} accountId - Account-ID (wird an Extension übergeben) + * @returns {Promise} - Array von Produkt-Items + * @throws {Error} - "Extension not available" oder andere Fehler + */ +export async function parseViaExtensionScanProducts(url, accountId) { + // Validierung + if (!url || typeof url !== 'string') { + throw new Error("Invalid URL"); + } + + if (!accountId || typeof accountId !== 'string') { + throw new Error("Invalid accountId"); + } + + // Methode 1: chrome.runtime.sendMessage (externally_connectable) + if (typeof chrome !== 'undefined' && chrome.runtime && chrome.runtime.sendMessage) { + try { + const extensionId = await getExtensionId(); + + // Versuche chrome.runtime.sendMessage (mit oder ohne Extension-ID) + return new Promise((resolve, reject) => { + const message = { + action: "SCAN_PRODUCTS", + url: url, + accountId: accountId + }; + + // SendMessage-Callback + const sendMessageCallback = (response) => { + // Check for Chrome runtime errors + if (chrome.runtime.lastError) { + const errorMsg = chrome.runtime.lastError.message || "Extension communication error"; + reject(new Error(errorMsg)); + return; + } + + if (response && response.ok && response.data) { + const items = response.data.items || []; + const meta = response.data.meta || response.meta || {}; + + // Wenn items leer oder ok:false, werfe Fehler mit meta + if (!Array.isArray(items) || items.length === 0) { + const errorMsg = response?.error || "no_items_found"; + const error = new Error(`SCAN_PRODUCTS failed: ${errorMsg} (${meta.pageType || "unknown"})`); + error.meta = meta; + reject(error); + return; + } + + // Erfolg: gib items zurück + resolve(items); + } else { + // Fehler: sende error + meta + const meta = response?.meta || {}; + const errorMsg = response?.error || "Extension scanning failed"; + const error = new Error(`SCAN_PRODUCTS failed: ${errorMsg} (${meta.pageType || "unknown"})`); + error.meta = meta; + reject(error); + } + }; + + // Benötigt Extension-ID (sendMessage von Webseiten aus erfordert immer Extension-ID) + if (!extensionId) { + reject(new Error("Extension ID not available")); + return; + } + + chrome.runtime.sendMessage(extensionId, message, sendMessageCallback); + + // Timeout nach 20s (Extension hat intern 20s) + setTimeout(() => { + reject(new Error("Extension timeout")); + }, 20000); + }); + } catch (error) { + // Chrome API Fehler: weiter zu Methode 2 + if (error.message && !error.message.includes("Extension")) { + throw error; + } + // Weiter zu Methode 2 + } + } + + // Methode 2: Window flag + postMessage (falls Content Script Relay vorhanden) + if (typeof window !== 'undefined' && window.__EBAY_EXTENSION__ === true) { + return new Promise((resolve, reject) => { + const messageId = `scan_${Date.now()}_${Math.random()}`; + + // Listener für Antwort + const responseHandler = (event) => { + if (event.data?.source !== 'eship-extension' || event.data?.messageId !== messageId) { + return; + } + + window.removeEventListener('message', responseHandler); + + if (event.data?.ok && event.data?.data) { + const items = event.data.data.items || event.data.items || []; + const meta = event.data.data.meta || event.data.meta || {}; + + // Wenn items leer oder ok:false, werfe Fehler mit meta + if (!Array.isArray(items) || items.length === 0) { + const errorMsg = event.data?.error || "no_items_found"; + const error = new Error(`SCAN_PRODUCTS failed: ${errorMsg} (${meta.pageType || "unknown"})`); + error.meta = meta; + reject(error); + return; + } + + // Erfolg: gib items zurück + resolve(items); + } else { + // Fehler: sende error + meta + const meta = event.data?.meta || event.data?.data?.meta || {}; + const errorMsg = event.data?.error || "Extension scanning failed"; + const error = new Error(`SCAN_PRODUCTS failed: ${errorMsg} (${meta.pageType || "unknown"})`); + error.meta = meta; + reject(error); + } + }; + + window.addEventListener('message', responseHandler); + + // Sende Request via postMessage + window.postMessage({ + source: 'eship-webapp', + action: 'SCAN_PRODUCTS', + url: url, + accountId: accountId, + messageId: messageId + }, '*'); + + // Timeout + setTimeout(() => { + window.removeEventListener('message', responseHandler); + reject(new Error("Extension timeout")); + }, 20000); + }); + } + + // Keine Extension verfügbar - kein Stub für Produkt-Scan (User will echte Daten) + throw new Error("Extension not available"); +} + +/** + * Parst eine eBay-URL mit Stub-Logik (deterministisch, keine Network-Calls) + * @param {string} url - eBay-Verkäuferprofil oder Shop-URL + * @returns {Promise<{sellerId: string, shopName: string, market: string, status: "active" | "unknown"}>} + * @throws {Error} - Wenn URL ungültig ist oder keine eBay-URL + */ +async function parseViaStub(url) { + // Validierung: Muss gültige URL sein + let urlObj; + try { + urlObj = new URL(url); + } catch (e) { + throw new Error("Bitte gib eine gültige URL ein."); + } + + // Validierung: Muss eBay-URL sein + const hostname = urlObj.hostname.toLowerCase(); + if (!hostname.includes('ebay.')) { + throw new Error("Bitte gib eine gültige eBay-URL ein."); + } + + // Stub-Implementierung: Deterministische Daten aus URL generieren + const hash = stableHash(url); + const market = extractMarketFromUrl(url); + + // Seller ID: Deterministic aus URL-Hash + // Format: "ebay_" + hash (first 10 chars) + const sellerId = `ebay_${hash.slice(0, 10)}`; + + // Shop Name: Generiert aus Hash (last 4 chars als Suffix) + const shopNameSuffix = hash.slice(-4); + const shopName = `eBay Seller ${shopNameSuffix}`; + + // Status: Immer "active" für Stub + const status = "active"; + + return { + sellerId, + shopName, + market, + status, + stats: { + itemsSold: null, // Stub liefert keine echten Daten + }, + }; +} + +/** + * Parst eine eBay-URL und extrahiert Account-Daten (Facade) + * Versucht zuerst Extension-Pfad, fällt zurück auf Stub-Implementierung + * @param {string} url - eBay-Verkäuferprofil oder Shop-URL + * @returns {Promise<{sellerId: string, shopName: string, market: string, status: "active" | "unknown", stats?: object}>} + * @throws {Error} - Wenn URL ungültig ist oder keine eBay-URL + */ +export async function parseEbayAccount(url) { + // Versuche IMMER Extension-Pfad zuerst (auch wenn Flag nicht gesetzt) + // parseViaExtension prüft selbst, ob Extension verfügbar ist + // #region agent log + const extAvailable = isExtensionAvailable(); + const hasChromeRuntime = typeof chrome !== 'undefined' && chrome.runtime && chrome.runtime.sendMessage; + fetch('http://127.0.0.1:7242/ingest/246fe132-ecc5-435f-bd9c-fe5e8e26089d',{method:'POST',headers:{'Content-Type':'application/json'},body:JSON.stringify({location:'ebayParserService.js:292',message:'parseEbayAccount: route decision',data:{extAvailable,hasChromeRuntime,url},timestamp:Date.now(),sessionId:'debug-session',runId:'run1',hypothesisId:'D'})}).catch(()=>{}); + // #endregion + + try { + // Versuche Extension zu nutzen (auch wenn Flag nicht gesetzt - parseViaExtension prüft selbst) + return await parseViaExtension(url); + } catch (e) { + // Extension-Fehler: Fallback zu Stub + console.warn("Extension parsing failed, falling back to stub:", e.message); + // #region agent log + fetch('http://127.0.0.1:7242/ingest/246fe132-ecc5-435f-bd9c-fe5e8e26089d',{method:'POST',headers:{'Content-Type':'application/json'},body:JSON.stringify({location:'ebayParserService.js:299',message:'parseEbayAccount: extension error, using stub',data:{error:e.message},timestamp:Date.now(),sessionId:'debug-session',runId:'run1',hypothesisId:'D'})}).catch(()=>{}); + // #endregion + } + + // Fallback: Stub-Implementierung + const stubResult = await parseViaStub(url); + // #region agent log + fetch('http://127.0.0.1:7242/ingest/246fe132-ecc5-435f-bd9c-fe5e8e26089d',{method:'POST',headers:{'Content-Type':'application/json'},body:JSON.stringify({location:'ebayParserService.js:304',message:'parseEbayAccount: stub result',data:{itemsSold:stubResult.stats?.itemsSold},timestamp:Date.now(),sessionId:'debug-session',runId:'run1',hypothesisId:'D'})}).catch(()=>{}); + // #endregion + return stubResult; +} \ No newline at end of file diff --git a/Server/src/services/productsService.js b/Server/src/services/productsService.js new file mode 100644 index 0000000..053e908 --- /dev/null +++ b/Server/src/services/productsService.js @@ -0,0 +1,258 @@ +/** + * Products Service + * CRUD-Operationen für Products aus Appwrite + * Filtert nach product_account_id für Account-Scoping + */ + +import { databases, databaseId } from "../lib/appwrite"; +import { Query, ID } from "appwrite"; +import { getAccountById, deriveMarketFromAccount, deriveCurrencyFromMarket, updateAccountLastScanAt } from "./accountsService"; +import { parseViaExtensionScanProducts } from "./ebayParserService"; + +const productsCollectionId = import.meta.env.VITE_APPWRITE_PRODUCTS_COLLECTION_ID || "products"; + +/** + * Lädt alle Products für einen bestimmten Account + * @param {string} accountId - ID des Accounts (product_account_id) + * @param {Object} [options] - Optionale Parameter + * @param {number} [options.limit] - Maximale Anzahl Ergebnisse (default: 25) + * @param {number} [options.offset] - Offset für Pagination (default: 0) + * @param {string} [options.orderBy] - Feld zum Sortieren (default: "$createdAt") + * @param {string} [options.orderType] - Sortier-Richtung: "asc" oder "desc" (default: "desc") + * @returns {Promise} Array von Product-Dokumenten + */ +export async function listProductsByAccount(accountId, options = {}) { + if (!accountId) { + console.warn("listProductsByAccount: accountId fehlt"); + return []; + } + + const { + limit = 25, + offset = 0, + orderBy = "$createdAt", + orderType = "desc", + } = options; + + try { + const queries = [ + Query.equal("product_account_id", accountId), + Query.orderDesc(orderBy), // orderType wird über Desc/Asc gehandhabt + Query.limit(limit), + Query.offset(offset), + ]; + + // Wenn orderType "asc" ist, verwende orderAsc statt orderDesc + if (orderType === "asc") { + queries[1] = Query.orderAsc(orderBy); + } + + const response = await databases.listDocuments( + databaseId, + productsCollectionId, + queries + ); + + return response.documents; + } catch (e) { + console.error("Fehler beim Laden der Products:", e); + + // Wenn Collection nicht existiert oder Berechtigungen fehlen + if (e.code === 404 || e.code === 401 || e.type === 'collection_not_found') { + // Placeholder: Collection existiert noch nicht + console.warn("Products-Collection existiert noch nicht oder ist nicht verfügbar. Gebe leeres Array zurück."); + return []; + } + + throw e; + } +} + +/** + * Lädt ein einzelnes Product nach ID + * @param {string} productId - ID des Products + * @returns {Promise} Product-Dokument oder null + */ +export async function getProductById(productId) { + if (!productId) { + console.warn("getProductById: productId fehlt"); + return null; + } + + try { + const document = await databases.getDocument( + databaseId, + productsCollectionId, + productId + ); + return document; + } catch (e) { + // 404 bedeutet, dass das Dokument nicht existiert + if (e.code === 404 || e.type === 'document_not_found') { + return null; + } + console.error("Fehler beim Laden des Products:", e); + throw e; + } +} + +/** + * Scannt Produkte für einen Account über die Extension (echte eBay-Daten) + * @param {string} accountId - ID des Accounts + * @returns {Promise<{ created: number, updated: number }>} Anzahl erstellter/aktualisierter Produkte + */ +export async function scanProductsForAccount(accountId) { + if (!accountId) { + throw new Error("accountId ist erforderlich"); + } + + try { + // 1. Lade Account, um URL und andere Daten abzuleiten + const account = await getAccountById(accountId); + if (!account) { + throw new Error("Account nicht gefunden"); + } + + if (!account.account_url) { + throw new Error("Account-URL fehlt. Bitte Account refreshen."); + } + + // 2. Extension aufrufen: scanne Produkte + const items = await parseViaExtensionScanProducts(account.account_url, accountId); + + // 3. Response-Items zu Product-Schema mappen + const mappedProducts = items.map(item => { + // Validiere, dass platformProductId vorhanden ist + if (!item.platformProductId) { + console.warn("Item ohne platformProductId übersprungen:", item); + return null; + } + + return { + product_platform_product_id: item.platformProductId, + product_title: item.title || "", + product_price: item.price ?? undefined, // undefined statt null für Appwrite + product_currency: item.currency ?? undefined, // auto-fill from market if undefined + product_url: item.url || "", + product_status: item.status ?? "unknown", + product_category: item.category ?? "unknown", + product_condition: item.condition ?? "unknown" + }; + }).filter(Boolean); // Entferne null-Einträge + + // 4. upsertProductsForAccount aufrufen + const result = await upsertProductsForAccount(accountId, mappedProducts); + + // 5. account_last_scan_at aktualisieren + await updateAccountLastScanAt(accountId, new Date().toISOString()); + + // 6. Return { created, updated } + return result; + } catch (e) { + console.error("Fehler beim Scannen der Produkte:", e); + throw e; + } +} + +/** + * Erstellt oder aktualisiert Produkte für einen Account (vorbereitet für Extension-Scans) + * @param {string} accountId - ID des Accounts + * @param {Array} products - Array von Produkt-Daten (kann partiell sein) + * @returns {Promise<{ created: number, updated: number }>} Anzahl erstellter/aktualisierter Produkte + */ +export async function upsertProductsForAccount(accountId, products) { + if (!accountId) { + throw new Error("accountId ist erforderlich"); + } + if (!Array.isArray(products) || products.length === 0) { + return { created: 0, updated: 0 }; + } + + try { + // Lade Account, um Market und andere Daten abzuleiten + const account = await getAccountById(accountId); + if (!account) { + throw new Error("Account nicht gefunden"); + } + + // Leite Market und Currency aus Account ab + const market = deriveMarketFromAccount(account); + if (market === "UNKNOWN") { + throw new Error( + "Market konnte nicht erkannt werden. Bitte Account refreshen." + ); + } + + const currency = deriveCurrencyFromMarket(market); + const platform = "ebay"; // Enum-Werte sind lowercase gemäß Fehlermeldung: [amazon], [ebay] + + // Lade bestehende Produkte für Duplikat-Prüfung + const existingProducts = await listProductsByAccount(accountId, { + limit: 1000, + offset: 0, + }); + + // Erstelle Map von platform_product_id -> bestehendes Produkt + const existingProductsMap = new Map(); + existingProducts.forEach((p) => { + if (p.product_platform_product_id) { + existingProductsMap.set(p.product_platform_product_id, p); + } + }); + + let created = 0; + let updated = 0; + + // Verarbeite jedes Produkt + for (const productData of products) { + // Validiere, dass platform_product_id vorhanden ist + if (!productData.product_platform_product_id) { + console.warn("Produkt ohne product_platform_product_id übersprungen:", productData); + continue; + } + + const platformProductId = productData.product_platform_product_id; + const existingProduct = existingProductsMap.get(platformProductId); + + // Ergänze fehlende erforderliche Felder aus Account + const fullProductData = { + product_account_id: accountId, + product_platform: platform, + product_platform_market: market, + product_currency: currency, + ...productData, // Produkt-Daten überschreiben Account-Daten wo vorhanden + }; + + try { + if (existingProduct) { + // Aktualisiere bestehendes Produkt + await databases.updateDocument( + databaseId, + productsCollectionId, + existingProduct.$id, + fullProductData + ); + updated++; + } else { + // Erstelle neues Produkt + await databases.createDocument( + databaseId, + productsCollectionId, + ID.unique(), + fullProductData + ); + created++; + } + } catch (e) { + console.error(`Fehler beim Upsert des Produkts "${platformProductId}":`, e); + // Weiter mit nächstem Produkt + continue; + } + } + + return { created, updated }; + } catch (e) { + console.error("Fehler beim Upsert der Produkte:", e); + throw e; + } +} diff --git a/Server/vite.config.js b/Server/vite.config.js new file mode 100644 index 0000000..0cca23e --- /dev/null +++ b/Server/vite.config.js @@ -0,0 +1,14 @@ +import { defineConfig } from 'vite' +import react from '@vitejs/plugin-react' +import tailwindcss from '@tailwindcss/vite' +import path from 'path' + +// https://vite.dev/config/ +export default defineConfig({ + plugins: [react(), tailwindcss()], + resolve: { + alias: { + '@': path.resolve(__dirname, './src'), + }, + }, +})