From 0a74e9a59c9ee6b6bb0d102668ddc308bf28a4f6 Mon Sep 17 00:00:00 2001 From: susie-laptop Date: Thu, 8 May 2025 19:03:19 -0400 Subject: [PATCH] [dev]sidebar --- index.html | 5 +- package-lock.json | 1821 ++++++++++++++++++++++++++++++---- package.json | 69 +- src/App.css | 42 - src/App.jsx | 28 +- src/assets/logo.png | Bin 0 -> 15045 bytes src/components/Layout.jsx | 29 + src/components/Sidebar.jsx | 169 ++++ src/index.css | 132 +-- src/lib/utils.js | 40 + src/main.jsx | 13 +- src/pages/About.jsx | 29 - src/pages/Home.jsx | 37 +- src/pages/NotFound.jsx | 16 - src/router/index.jsx | 71 ++ src/services/api.js | 55 - src/store/counterSlice.js | 25 - src/store/index.js | 21 - src/styles/custom-theme.scss | 34 + src/styles/sidebar.scss | 142 +++ vite.config.js | 14 +- 21 files changed, 2198 insertions(+), 594 deletions(-) delete mode 100644 src/App.css create mode 100644 src/assets/logo.png create mode 100644 src/components/Layout.jsx create mode 100644 src/components/Sidebar.jsx create mode 100644 src/lib/utils.js delete mode 100644 src/pages/About.jsx delete mode 100644 src/pages/NotFound.jsx create mode 100644 src/router/index.jsx delete mode 100644 src/services/api.js delete mode 100644 src/store/counterSlice.js delete mode 100644 src/store/index.js create mode 100644 src/styles/custom-theme.scss create mode 100644 src/styles/sidebar.scss diff --git a/index.html b/index.html index 0c589ec..af06e28 100644 --- a/index.html +++ b/index.html @@ -4,7 +4,10 @@ - Vite + React + + + + Creator Center
diff --git a/package-lock.json b/package-lock.json index 8fb5b94..a4c25e0 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,24 +1,40 @@ { - "name": "mvp_ooin", + "name": "creator-center-ooin", "version": "0.0.0", "lockfileVersion": 3, "requires": true, "packages": { "": { - "name": "mvp_ooin", + "name": "creator-center-ooin", "version": "0.0.0", "dependencies": { + "@fortawesome/fontawesome-free": "^6.7.2", + "@fortawesome/fontawesome-svg-core": "^6.7.2", + "@fortawesome/free-brands-svg-icons": "^6.7.2", + "@fortawesome/free-regular-svg-icons": "^6.7.2", + "@fortawesome/free-solid-svg-icons": "^6.7.2", + "@fortawesome/react-fontawesome": "^0.2.2", + "@radix-ui/react-dialog": "^1.1.13", + "@radix-ui/react-separator": "^1.1.6", + "@radix-ui/react-slot": "^1.2.2", + "@radix-ui/react-tooltip": "^1.2.6", "@reduxjs/toolkit": "^2.8.1", - "axios": "^1.9.0", + "@tailwindcss/vite": "^4.1.5", + "bootstrap": "^5.3.3", + "class-variance-authority": "^0.7.1", + "clsx": "^2.1.1", + "lucide-react": "^0.508.0", "react": "^19.1.0", + "react-bootstrap": "^2.10.1", "react-dom": "^19.1.0", "react-redux": "^9.2.0", - "react-router-dom": "^7.5.3", - "redux": "^5.0.1", - "sass": "^1.87.0" + "react-router-dom": "^7.6.0", + "tailwind-merge": "^3.2.0", + "tailwindcss": "^4.1.5" }, "devDependencies": { "@eslint/js": "^9.25.0", + "@types/node": "^22.15.17", "@types/react": "^19.1.2", "@types/react-dom": "^19.1.2", "@vitejs/plugin-react": "^4.4.1", @@ -26,6 +42,8 @@ "eslint-plugin-react-hooks": "^5.2.0", "eslint-plugin-react-refresh": "^0.4.19", "globals": "^16.0.0", + "sass": "^1.87.0", + "tw-animate-css": "^1.2.9", "vite": "^6.3.5" } }, @@ -251,6 +269,14 @@ "@babel/core": "^7.0.0-0" } }, + "node_modules/@babel/runtime": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.27.1.tgz", + "integrity": "sha512-1x3D2xEk2fRo3PAhwQwu5UubzgiVWSXTBfWpVd2Mx2AzRqJuDJCsgaDVZ7HB5iGzDW1Hl1sWN2mFyKjmR9uAog==", + "engines": { + "node": ">=6.9.0" + } + }, "node_modules/@babel/template": { "version": "7.27.2", "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.27.2.tgz", @@ -312,7 +338,6 @@ "cpu": [ "ppc64" ], - "dev": true, "optional": true, "os": [ "aix" @@ -328,7 +353,6 @@ "cpu": [ "arm" ], - "dev": true, "optional": true, "os": [ "android" @@ -344,7 +368,6 @@ "cpu": [ "arm64" ], - "dev": true, "optional": true, "os": [ "android" @@ -360,7 +383,6 @@ "cpu": [ "x64" ], - "dev": true, "optional": true, "os": [ "android" @@ -376,7 +398,6 @@ "cpu": [ "arm64" ], - "dev": true, "optional": true, "os": [ "darwin" @@ -392,7 +413,6 @@ "cpu": [ "x64" ], - "dev": true, "optional": true, "os": [ "darwin" @@ -408,7 +428,6 @@ "cpu": [ "arm64" ], - "dev": true, "optional": true, "os": [ "freebsd" @@ -424,7 +443,6 @@ "cpu": [ "x64" ], - "dev": true, "optional": true, "os": [ "freebsd" @@ -440,7 +458,6 @@ "cpu": [ "arm" ], - "dev": true, "optional": true, "os": [ "linux" @@ -456,7 +473,6 @@ "cpu": [ "arm64" ], - "dev": true, "optional": true, "os": [ "linux" @@ -472,7 +488,6 @@ "cpu": [ "ia32" ], - "dev": true, "optional": true, "os": [ "linux" @@ -488,7 +503,6 @@ "cpu": [ "loong64" ], - "dev": true, "optional": true, "os": [ "linux" @@ -504,7 +518,6 @@ "cpu": [ "mips64el" ], - "dev": true, "optional": true, "os": [ "linux" @@ -520,7 +533,6 @@ "cpu": [ "ppc64" ], - "dev": true, "optional": true, "os": [ "linux" @@ -536,7 +548,6 @@ "cpu": [ "riscv64" ], - "dev": true, "optional": true, "os": [ "linux" @@ -552,7 +563,6 @@ "cpu": [ "s390x" ], - "dev": true, "optional": true, "os": [ "linux" @@ -568,7 +578,6 @@ "cpu": [ "x64" ], - "dev": true, "optional": true, "os": [ "linux" @@ -584,7 +593,6 @@ "cpu": [ "arm64" ], - "dev": true, "optional": true, "os": [ "netbsd" @@ -600,7 +608,6 @@ "cpu": [ "x64" ], - "dev": true, "optional": true, "os": [ "netbsd" @@ -616,7 +623,6 @@ "cpu": [ "arm64" ], - "dev": true, "optional": true, "os": [ "openbsd" @@ -632,7 +638,6 @@ "cpu": [ "x64" ], - "dev": true, "optional": true, "os": [ "openbsd" @@ -648,7 +653,6 @@ "cpu": [ "x64" ], - "dev": true, "optional": true, "os": [ "sunos" @@ -664,7 +668,6 @@ "cpu": [ "arm64" ], - "dev": true, "optional": true, "os": [ "win32" @@ -680,7 +683,6 @@ "cpu": [ "ia32" ], - "dev": true, "optional": true, "os": [ "win32" @@ -696,7 +698,6 @@ "cpu": [ "x64" ], - "dev": true, "optional": true, "os": [ "win32" @@ -845,6 +846,112 @@ "node": "^18.18.0 || ^20.9.0 || >=21.1.0" } }, + "node_modules/@floating-ui/core": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.7.0.tgz", + "integrity": "sha512-FRdBLykrPPA6P76GGGqlex/e7fbe0F1ykgxHYNXQsH/iTEtjMj/f9bpY5oQqbjt5VgZvgz/uKXbGuROijh3VLA==", + "dependencies": { + "@floating-ui/utils": "^0.2.9" + } + }, + "node_modules/@floating-ui/dom": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.7.0.tgz", + "integrity": "sha512-lGTor4VlXcesUMh1cupTUTDoCxMb0V6bm3CnxHzQcw8Eaf1jQbgQX4i02fYgT0vJ82tb5MZ4CZk1LRGkktJCzg==", + "dependencies": { + "@floating-ui/core": "^1.7.0", + "@floating-ui/utils": "^0.2.9" + } + }, + "node_modules/@floating-ui/react-dom": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/@floating-ui/react-dom/-/react-dom-2.1.2.tgz", + "integrity": "sha512-06okr5cgPzMNBy+Ycse2A6udMi4bqwW/zgBF/rwjcNqWkyr82Mcg8b0vjX8OJpZFy/FKjJmw6wV7t44kK6kW7A==", + "dependencies": { + "@floating-ui/dom": "^1.0.0" + }, + "peerDependencies": { + "react": ">=16.8.0", + "react-dom": ">=16.8.0" + } + }, + "node_modules/@floating-ui/utils": { + "version": "0.2.9", + "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.2.9.tgz", + "integrity": "sha512-MDWhGtE+eHw5JW7lq4qhc5yRLS11ERl1c7Z6Xd0a58DozHES6EnNNwUWbMiG4J9Cgj053Bhk8zvlhFYKVhULwg==" + }, + "node_modules/@fortawesome/fontawesome-common-types": { + "version": "6.7.2", + "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-common-types/-/fontawesome-common-types-6.7.2.tgz", + "integrity": "sha512-Zs+YeHUC5fkt7Mg1l6XTniei3k4bwG/yo3iFUtZWd/pMx9g3fdvkSK9E0FOC+++phXOka78uJcYb8JaFkW52Xg==", + "engines": { + "node": ">=6" + } + }, + "node_modules/@fortawesome/fontawesome-free": { + "version": "6.7.2", + "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-free/-/fontawesome-free-6.7.2.tgz", + "integrity": "sha512-JUOtgFW6k9u4Y+xeIaEiLr3+cjoUPiAuLXoyKOJSia6Duzb7pq+A76P9ZdPDoAoxHdHzq6gE9/jKBGXlZT8FbA==", + "engines": { + "node": ">=6" + } + }, + "node_modules/@fortawesome/fontawesome-svg-core": { + "version": "6.7.2", + "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-svg-core/-/fontawesome-svg-core-6.7.2.tgz", + "integrity": "sha512-yxtOBWDrdi5DD5o1pmVdq3WMCvnobT0LU6R8RyyVXPvFRd2o79/0NCuQoCjNTeZz9EzA9xS3JxNWfv54RIHFEA==", + "dependencies": { + "@fortawesome/fontawesome-common-types": "6.7.2" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/@fortawesome/free-brands-svg-icons": { + "version": "6.7.2", + "resolved": "https://registry.npmjs.org/@fortawesome/free-brands-svg-icons/-/free-brands-svg-icons-6.7.2.tgz", + "integrity": "sha512-zu0evbcRTgjKfrr77/2XX+bU+kuGfjm0LbajJHVIgBWNIDzrhpRxiCPNT8DW5AdmSsq7Mcf9D1bH0aSeSUSM+Q==", + "dependencies": { + "@fortawesome/fontawesome-common-types": "6.7.2" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/@fortawesome/free-regular-svg-icons": { + "version": "6.7.2", + "resolved": "https://registry.npmjs.org/@fortawesome/free-regular-svg-icons/-/free-regular-svg-icons-6.7.2.tgz", + "integrity": "sha512-7Z/ur0gvCMW8G93dXIQOkQqHo2M5HLhYrRVC0//fakJXxcF1VmMPsxnG6Ee8qEylA8b8Q3peQXWMNZ62lYF28g==", + "dependencies": { + "@fortawesome/fontawesome-common-types": "6.7.2" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/@fortawesome/free-solid-svg-icons": { + "version": "6.7.2", + "resolved": "https://registry.npmjs.org/@fortawesome/free-solid-svg-icons/-/free-solid-svg-icons-6.7.2.tgz", + "integrity": "sha512-GsBrnOzU8uj0LECDfD5zomZJIjrPhIlWU82AHwa2s40FKH+kcxQaBvBo3Z4TxyZHIyX8XTDxsyA33/Vx9eFuQA==", + "dependencies": { + "@fortawesome/fontawesome-common-types": "6.7.2" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/@fortawesome/react-fontawesome": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/@fortawesome/react-fontawesome/-/react-fontawesome-0.2.2.tgz", + "integrity": "sha512-EnkrprPNqI6SXJl//m29hpaNzOp1bruISWaOiRtkMi/xSvHJlzc2j2JAYS7egxt/EbjSNV/k6Xy0AQI6vB2+1g==", + "dependencies": { + "prop-types": "^15.8.1" + }, + "peerDependencies": { + "@fortawesome/fontawesome-svg-core": "~1 || ~6", + "react": ">=16.3" + } + }, "node_modules/@humanfs/core": { "version": "0.19.1", "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.1.tgz", @@ -955,9 +1062,9 @@ } }, "node_modules/@modelcontextprotocol/sdk": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/@modelcontextprotocol/sdk/-/sdk-1.11.0.tgz", - "integrity": "sha512-k/1pb70eD638anoi0e8wUGAlbMJXyvdV4p62Ko+EZ7eBe1xMx8Uhak1R5DgfoofsK5IBBnRwsYGTaLZl+6/+RQ==", + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@modelcontextprotocol/sdk/-/sdk-1.11.1.tgz", + "integrity": "sha512-9LfmxKTb1v+vUS1/emSk1f5ePmTLkb9Le9AxOB5T0XM59EUumwcS45z05h7aiZx3GI0Bl7mjb3FMEglYj+acuQ==", "dev": true, "dependencies": { "content-type": "^1.0.5", @@ -1257,6 +1364,524 @@ "url": "https://opencollective.com/parcel" } }, + "node_modules/@parcel/watcher/node_modules/detect-libc": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz", + "integrity": "sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg==", + "optional": true, + "bin": { + "detect-libc": "bin/detect-libc.js" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/@popperjs/core": { + "version": "2.11.8", + "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.8.tgz", + "integrity": "sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/popperjs" + } + }, + "node_modules/@radix-ui/primitive": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@radix-ui/primitive/-/primitive-1.1.2.tgz", + "integrity": "sha512-XnbHrrprsNqZKQhStrSwgRUQzoCI1glLzdw79xiZPoofhGICeZRSQ3dIxAKH1gb3OHfNf4d6f+vAv3kil2eggA==" + }, + "node_modules/@radix-ui/react-arrow": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/@radix-ui/react-arrow/-/react-arrow-1.1.6.tgz", + "integrity": "sha512-2JMfHJf/eVnwq+2dewT3C0acmCWD3XiVA1Da+jTDqo342UlU13WvXtqHhG+yJw5JeQmu4ue2eMy6gcEArLBlcw==", + "dependencies": { + "@radix-ui/react-primitive": "2.1.2" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-compose-refs": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@radix-ui/react-compose-refs/-/react-compose-refs-1.1.2.tgz", + "integrity": "sha512-z4eqJvfiNnFMHIIvXP3CY57y2WJs5g2v3X0zm9mEJkrkNv4rDxu+sg9Jh8EkXyeqBkB7SOcboo9dMVqhyrACIg==", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-context": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@radix-ui/react-context/-/react-context-1.1.2.tgz", + "integrity": "sha512-jCi/QKUM2r1Ju5a3J64TH2A5SpKAgh0LpknyqdQ4m6DCV0xJ2HG1xARRwNGPQfi1SLdLWZ1OJz6F4OMBBNiGJA==", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-dialog": { + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/@radix-ui/react-dialog/-/react-dialog-1.1.13.tgz", + "integrity": "sha512-ARFmqUyhIVS3+riWzwGTe7JLjqwqgnODBUZdqpWar/z1WFs9z76fuOs/2BOWCR+YboRn4/WN9aoaGVwqNRr8VA==", + "dependencies": { + "@radix-ui/primitive": "1.1.2", + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-dismissable-layer": "1.1.9", + "@radix-ui/react-focus-guards": "1.1.2", + "@radix-ui/react-focus-scope": "1.1.6", + "@radix-ui/react-id": "1.1.1", + "@radix-ui/react-portal": "1.1.8", + "@radix-ui/react-presence": "1.1.4", + "@radix-ui/react-primitive": "2.1.2", + "@radix-ui/react-slot": "1.2.2", + "@radix-ui/react-use-controllable-state": "1.2.2", + "aria-hidden": "^1.2.4", + "react-remove-scroll": "^2.6.3" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-dismissable-layer": { + "version": "1.1.9", + "resolved": "https://registry.npmjs.org/@radix-ui/react-dismissable-layer/-/react-dismissable-layer-1.1.9.tgz", + "integrity": "sha512-way197PiTvNp+WBP7svMJasHl+vibhWGQDb6Mgf5mhEWJkgb85z7Lfl9TUdkqpWsf8GRNmoopx9ZxCyDzmgRMQ==", + "dependencies": { + "@radix-ui/primitive": "1.1.2", + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-primitive": "2.1.2", + "@radix-ui/react-use-callback-ref": "1.1.1", + "@radix-ui/react-use-escape-keydown": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-focus-guards": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@radix-ui/react-focus-guards/-/react-focus-guards-1.1.2.tgz", + "integrity": "sha512-fyjAACV62oPV925xFCrH8DR5xWhg9KYtJT4s3u54jxp+L/hbpTY2kIeEFFbFe+a/HCE94zGQMZLIpVTPVZDhaA==", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-focus-scope": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/@radix-ui/react-focus-scope/-/react-focus-scope-1.1.6.tgz", + "integrity": "sha512-r9zpYNUQY+2jWHWZGyddQLL9YHkM/XvSFHVcWs7bdVuxMAnCwTAuy6Pf47Z4nw7dYcUou1vg/VgjjrrH03VeBw==", + "dependencies": { + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-primitive": "2.1.2", + "@radix-ui/react-use-callback-ref": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-id": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-id/-/react-id-1.1.1.tgz", + "integrity": "sha512-kGkGegYIdQsOb4XjsfM97rXsiHaBwco+hFI66oO4s9LU+PLAC5oJ7khdOVFxkhsmlbpUqDAvXw11CluXP+jkHg==", + "dependencies": { + "@radix-ui/react-use-layout-effect": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-popper": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/@radix-ui/react-popper/-/react-popper-1.2.6.tgz", + "integrity": "sha512-7iqXaOWIjDBfIG7aq8CUEeCSsQMLFdn7VEE8TaFz704DtEzpPHR7w/uuzRflvKgltqSAImgcmxQ7fFX3X7wasg==", + "dependencies": { + "@floating-ui/react-dom": "^2.0.0", + "@radix-ui/react-arrow": "1.1.6", + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-primitive": "2.1.2", + "@radix-ui/react-use-callback-ref": "1.1.1", + "@radix-ui/react-use-layout-effect": "1.1.1", + "@radix-ui/react-use-rect": "1.1.1", + "@radix-ui/react-use-size": "1.1.1", + "@radix-ui/rect": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-portal": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/@radix-ui/react-portal/-/react-portal-1.1.8.tgz", + "integrity": "sha512-hQsTUIn7p7fxCPvao/q6wpbxmCwgLrlz+nOrJgC+RwfZqWY/WN+UMqkXzrtKbPrF82P43eCTl3ekeKuyAQbFeg==", + "dependencies": { + "@radix-ui/react-primitive": "2.1.2", + "@radix-ui/react-use-layout-effect": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-presence": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/@radix-ui/react-presence/-/react-presence-1.1.4.tgz", + "integrity": "sha512-ueDqRbdc4/bkaQT3GIpLQssRlFgWaL/U2z/S31qRwwLWoxHLgry3SIfCwhxeQNbirEUXFa+lq3RL3oBYXtcmIA==", + "dependencies": { + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-use-layout-effect": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-primitive": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-2.1.2.tgz", + "integrity": "sha512-uHa+l/lKfxuDD2zjN/0peM/RhhSmRjr5YWdk/37EnSv1nJ88uvG85DPexSm8HdFQROd2VdERJ6ynXbkCFi+APw==", + "dependencies": { + "@radix-ui/react-slot": "1.2.2" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-separator": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/@radix-ui/react-separator/-/react-separator-1.1.6.tgz", + "integrity": "sha512-Izof3lPpbCfTM7WDta+LRkz31jem890VjEvpVRoWQNKpDUMMVffuyq854XPGP1KYGWWmjmYvHvPFeocWhFCy1w==", + "dependencies": { + "@radix-ui/react-primitive": "2.1.2" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-slot": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.2.2.tgz", + "integrity": "sha512-y7TBO4xN4Y94FvcWIOIh18fM4R1A8S4q1jhoz4PNzOoHsFcN8pogcFmZrTYAm4F9VRUrWP/Mw7xSKybIeRI+CQ==", + "dependencies": { + "@radix-ui/react-compose-refs": "1.1.2" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-tooltip": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/@radix-ui/react-tooltip/-/react-tooltip-1.2.6.tgz", + "integrity": "sha512-zYb+9dc9tkoN2JjBDIIPLQtk3gGyz8FMKoqYTb8EMVQ5a5hBcdHPECrsZVI4NpPAUOixhkoqg7Hj5ry5USowfA==", + "dependencies": { + "@radix-ui/primitive": "1.1.2", + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-dismissable-layer": "1.1.9", + "@radix-ui/react-id": "1.1.1", + "@radix-ui/react-popper": "1.2.6", + "@radix-ui/react-portal": "1.1.8", + "@radix-ui/react-presence": "1.1.4", + "@radix-ui/react-primitive": "2.1.2", + "@radix-ui/react-slot": "1.2.2", + "@radix-ui/react-use-controllable-state": "1.2.2", + "@radix-ui/react-visually-hidden": "1.2.2" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-use-callback-ref": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-callback-ref/-/react-use-callback-ref-1.1.1.tgz", + "integrity": "sha512-FkBMwD+qbGQeMu1cOHnuGB6x4yzPjho8ap5WtbEJ26umhgqVXbhekKUQO+hZEL1vU92a3wHwdp0HAcqAUF5iDg==", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-use-controllable-state": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-controllable-state/-/react-use-controllable-state-1.2.2.tgz", + "integrity": "sha512-BjasUjixPFdS+NKkypcyyN5Pmg83Olst0+c6vGov0diwTEo6mgdqVR6hxcEgFuh4QrAs7Rc+9KuGJ9TVCj0Zzg==", + "dependencies": { + "@radix-ui/react-use-effect-event": "0.0.2", + "@radix-ui/react-use-layout-effect": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-use-effect-event": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-effect-event/-/react-use-effect-event-0.0.2.tgz", + "integrity": "sha512-Qp8WbZOBe+blgpuUT+lw2xheLP8q0oatc9UpmiemEICxGvFLYmHm9QowVZGHtJlGbS6A6yJ3iViad/2cVjnOiA==", + "dependencies": { + "@radix-ui/react-use-layout-effect": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-use-escape-keydown": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-escape-keydown/-/react-use-escape-keydown-1.1.1.tgz", + "integrity": "sha512-Il0+boE7w/XebUHyBjroE+DbByORGR9KKmITzbR7MyQ4akpORYP/ZmbhAr0DG7RmmBqoOnZdy2QlvajJ2QA59g==", + "dependencies": { + "@radix-ui/react-use-callback-ref": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-use-layout-effect": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-layout-effect/-/react-use-layout-effect-1.1.1.tgz", + "integrity": "sha512-RbJRS4UWQFkzHTTwVymMTUv8EqYhOp8dOOviLj2ugtTiXRaRQS7GLGxZTLL1jWhMeoSCf5zmcZkqTl9IiYfXcQ==", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-use-rect": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-rect/-/react-use-rect-1.1.1.tgz", + "integrity": "sha512-QTYuDesS0VtuHNNvMh+CjlKJ4LJickCMUAqjlE3+j8w+RlRpwyX3apEQKGFzbZGdo7XNG1tXa+bQqIE7HIXT2w==", + "dependencies": { + "@radix-ui/rect": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-use-size": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-size/-/react-use-size-1.1.1.tgz", + "integrity": "sha512-ewrXRDTAqAXlkl6t/fkXWNAhFX9I+CkKlw6zjEwk86RSPKwZr3xpBRso655aqYafwtnbpHLj6toFzmd6xdVptQ==", + "dependencies": { + "@radix-ui/react-use-layout-effect": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-visually-hidden": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@radix-ui/react-visually-hidden/-/react-visually-hidden-1.2.2.tgz", + "integrity": "sha512-ORCmRUbNiZIv6uV5mhFrhsIKw4UX/N3syZtyqvry61tbGm4JlgQuSn0hk5TwCARsCjkcnuRkSdCE3xfb+ADHew==", + "dependencies": { + "@radix-ui/react-primitive": "2.1.2" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/rect": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@radix-ui/rect/-/rect-1.1.1.tgz", + "integrity": "sha512-HPwpGIzkl28mWyZqG52jiqDJ12waP11Pa1lGoiyUkIEuMLBP0oeK/C89esbXrxsky5we7dfd8U58nm0SgAWpVw==" + }, + "node_modules/@react-aria/ssr": { + "version": "3.9.8", + "resolved": "https://registry.npmjs.org/@react-aria/ssr/-/ssr-3.9.8.tgz", + "integrity": "sha512-lQDE/c9uTfBSDOjaZUJS8xP2jCKVk4zjQeIlCH90xaLhHDgbpCdns3xvFpJJujfj3nI4Ll9K7A+ONUBDCASOuw==", + "dependencies": { + "@swc/helpers": "^0.5.0" + }, + "engines": { + "node": ">= 12" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" + } + }, "node_modules/@reduxjs/toolkit": { "version": "2.8.1", "resolved": "https://registry.npmjs.org/@reduxjs/toolkit/-/toolkit-2.8.1.tgz", @@ -1282,6 +1907,56 @@ } } }, + "node_modules/@restart/hooks": { + "version": "0.4.16", + "resolved": "https://registry.npmjs.org/@restart/hooks/-/hooks-0.4.16.tgz", + "integrity": "sha512-f7aCv7c+nU/3mF7NWLtVVr0Ra80RqsO89hO72r+Y/nvQr5+q0UFGkocElTH6MJApvReVh6JHUFYn2cw1WdHF3w==", + "dependencies": { + "dequal": "^2.0.3" + }, + "peerDependencies": { + "react": ">=16.8.0" + } + }, + "node_modules/@restart/ui": { + "version": "1.9.4", + "resolved": "https://registry.npmjs.org/@restart/ui/-/ui-1.9.4.tgz", + "integrity": "sha512-N4C7haUc3vn4LTwVUPlkJN8Ach/+yIMvRuTVIhjilNHqegY60SGLrzud6errOMNJwSnmYFnt1J0H/k8FE3A4KA==", + "dependencies": { + "@babel/runtime": "^7.26.0", + "@popperjs/core": "^2.11.8", + "@react-aria/ssr": "^3.5.0", + "@restart/hooks": "^0.5.0", + "@types/warning": "^3.0.3", + "dequal": "^2.0.3", + "dom-helpers": "^5.2.0", + "uncontrollable": "^8.0.4", + "warning": "^4.0.3" + }, + "peerDependencies": { + "react": ">=16.14.0", + "react-dom": ">=16.14.0" + } + }, + "node_modules/@restart/ui/node_modules/@restart/hooks": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/@restart/hooks/-/hooks-0.5.1.tgz", + "integrity": "sha512-EMoH04NHS1pbn07iLTjIjgttuqb7qu4+/EyhAx27MHpoENcB2ZdSsLTNxmKD+WEPnZigo62Qc8zjGnNxoSE/5Q==", + "dependencies": { + "dequal": "^2.0.3" + }, + "peerDependencies": { + "react": ">=16.8.0" + } + }, + "node_modules/@restart/ui/node_modules/uncontrollable": { + "version": "8.0.4", + "resolved": "https://registry.npmjs.org/uncontrollable/-/uncontrollable-8.0.4.tgz", + "integrity": "sha512-ulRWYWHvscPFc0QQXvyJjY6LIXU56f0h8pQFvhxiKk5V1fcI8gp9Ht9leVAhrVjzqMw0BgjspBINx9r6oyJUvQ==", + "peerDependencies": { + "react": ">=16.14.0" + } + }, "node_modules/@rollup/rollup-android-arm-eabi": { "version": "4.40.2", "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.40.2.tgz", @@ -1289,7 +1964,6 @@ "cpu": [ "arm" ], - "dev": true, "optional": true, "os": [ "android" @@ -1302,7 +1976,6 @@ "cpu": [ "arm64" ], - "dev": true, "optional": true, "os": [ "android" @@ -1315,7 +1988,6 @@ "cpu": [ "arm64" ], - "dev": true, "optional": true, "os": [ "darwin" @@ -1328,7 +2000,6 @@ "cpu": [ "x64" ], - "dev": true, "optional": true, "os": [ "darwin" @@ -1341,7 +2012,6 @@ "cpu": [ "arm64" ], - "dev": true, "optional": true, "os": [ "freebsd" @@ -1354,7 +2024,6 @@ "cpu": [ "x64" ], - "dev": true, "optional": true, "os": [ "freebsd" @@ -1367,7 +2036,6 @@ "cpu": [ "arm" ], - "dev": true, "optional": true, "os": [ "linux" @@ -1380,7 +2048,6 @@ "cpu": [ "arm" ], - "dev": true, "optional": true, "os": [ "linux" @@ -1393,7 +2060,6 @@ "cpu": [ "arm64" ], - "dev": true, "optional": true, "os": [ "linux" @@ -1406,7 +2072,6 @@ "cpu": [ "arm64" ], - "dev": true, "optional": true, "os": [ "linux" @@ -1419,7 +2084,6 @@ "cpu": [ "loong64" ], - "dev": true, "optional": true, "os": [ "linux" @@ -1432,7 +2096,6 @@ "cpu": [ "ppc64" ], - "dev": true, "optional": true, "os": [ "linux" @@ -1445,7 +2108,6 @@ "cpu": [ "riscv64" ], - "dev": true, "optional": true, "os": [ "linux" @@ -1458,7 +2120,6 @@ "cpu": [ "riscv64" ], - "dev": true, "optional": true, "os": [ "linux" @@ -1471,7 +2132,6 @@ "cpu": [ "s390x" ], - "dev": true, "optional": true, "os": [ "linux" @@ -1484,7 +2144,6 @@ "cpu": [ "x64" ], - "dev": true, "optional": true, "os": [ "linux" @@ -1497,7 +2156,6 @@ "cpu": [ "x64" ], - "dev": true, "optional": true, "os": [ "linux" @@ -1510,7 +2168,6 @@ "cpu": [ "arm64" ], - "dev": true, "optional": true, "os": [ "win32" @@ -1523,7 +2180,6 @@ "cpu": [ "ia32" ], - "dev": true, "optional": true, "os": [ "win32" @@ -1536,7 +2192,6 @@ "cpu": [ "x64" ], - "dev": true, "optional": true, "os": [ "win32" @@ -1552,6 +2207,253 @@ "resolved": "https://registry.npmjs.org/@standard-schema/utils/-/utils-0.3.0.tgz", "integrity": "sha512-e7Mew686owMaPJVNNLs55PUvgz371nKgwsc4vxE49zsODpJEnxgxRo2y/OKrqueavXgZNMDVj3DdHFlaSAeU8g==" }, + "node_modules/@swc/helpers": { + "version": "0.5.17", + "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.17.tgz", + "integrity": "sha512-5IKx/Y13RsYd+sauPb2x+U/xZikHjolzfuDgTAl/Tdf3Q8rslRvC19NKDLgAJQ6wsqADk10ntlv08nPFw/gO/A==", + "dependencies": { + "tslib": "^2.8.0" + } + }, + "node_modules/@tailwindcss/node": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/@tailwindcss/node/-/node-4.1.5.tgz", + "integrity": "sha512-CBhSWo0vLnWhXIvpD0qsPephiaUYfHUX3U9anwDaHZAeuGpTiB3XmsxPAN6qX7bFhipyGBqOa1QYQVVhkOUGxg==", + "dependencies": { + "enhanced-resolve": "^5.18.1", + "jiti": "^2.4.2", + "lightningcss": "1.29.2", + "tailwindcss": "4.1.5" + } + }, + "node_modules/@tailwindcss/oxide": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide/-/oxide-4.1.5.tgz", + "integrity": "sha512-1n4br1znquEvyW/QuqMKQZlBen+jxAbvyduU87RS8R3tUSvByAkcaMTkJepNIrTlYhD+U25K4iiCIxE6BGdRYA==", + "engines": { + "node": ">= 10" + }, + "optionalDependencies": { + "@tailwindcss/oxide-android-arm64": "4.1.5", + "@tailwindcss/oxide-darwin-arm64": "4.1.5", + "@tailwindcss/oxide-darwin-x64": "4.1.5", + "@tailwindcss/oxide-freebsd-x64": "4.1.5", + "@tailwindcss/oxide-linux-arm-gnueabihf": "4.1.5", + "@tailwindcss/oxide-linux-arm64-gnu": "4.1.5", + "@tailwindcss/oxide-linux-arm64-musl": "4.1.5", + "@tailwindcss/oxide-linux-x64-gnu": "4.1.5", + "@tailwindcss/oxide-linux-x64-musl": "4.1.5", + "@tailwindcss/oxide-wasm32-wasi": "4.1.5", + "@tailwindcss/oxide-win32-arm64-msvc": "4.1.5", + "@tailwindcss/oxide-win32-x64-msvc": "4.1.5" + } + }, + "node_modules/@tailwindcss/oxide-android-arm64": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-android-arm64/-/oxide-android-arm64-4.1.5.tgz", + "integrity": "sha512-LVvM0GirXHED02j7hSECm8l9GGJ1RfgpWCW+DRn5TvSaxVsv28gRtoL4aWKGnXqwvI3zu1GABeDNDVZeDPOQrw==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-darwin-arm64": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-arm64/-/oxide-darwin-arm64-4.1.5.tgz", + "integrity": "sha512-//TfCA3pNrgnw4rRJOqavW7XUk8gsg9ddi8cwcsWXp99tzdBAZW0WXrD8wDyNbqjW316Pk2hiN/NJx/KWHl8oA==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-darwin-x64": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-x64/-/oxide-darwin-x64-4.1.5.tgz", + "integrity": "sha512-XQorp3Q6/WzRd9OalgHgaqgEbjP3qjHrlSUb5k1EuS1Z9NE9+BbzSORraO+ecW432cbCN7RVGGL/lSnHxcd+7Q==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-freebsd-x64": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-freebsd-x64/-/oxide-freebsd-x64-4.1.5.tgz", + "integrity": "sha512-bPrLWbxo8gAo97ZmrCbOdtlz/Dkuy8NK97aFbVpkJ2nJ2Jo/rsCbu0TlGx8joCuA3q6vMWTSn01JY46iwG+clg==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-linux-arm-gnueabihf": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm-gnueabihf/-/oxide-linux-arm-gnueabihf-4.1.5.tgz", + "integrity": "sha512-1gtQJY9JzMAhgAfvd/ZaVOjh/Ju/nCoAsvOVJenWZfs05wb8zq+GOTnZALWGqKIYEtyNpCzvMk+ocGpxwdvaVg==", + "cpu": [ + "arm" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-linux-arm64-gnu": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-gnu/-/oxide-linux-arm64-gnu-4.1.5.tgz", + "integrity": "sha512-dtlaHU2v7MtdxBXoqhxwsWjav7oim7Whc6S9wq/i/uUMTWAzq/gijq1InSgn2yTnh43kR+SFvcSyEF0GCNu1PQ==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-linux-arm64-musl": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-musl/-/oxide-linux-arm64-musl-4.1.5.tgz", + "integrity": "sha512-fg0F6nAeYcJ3CriqDT1iVrqALMwD37+sLzXs8Rjy8Z1ZHshJoYceodfyUwGJEsQoTyWbliFNRs2wMQNXtT7MVA==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-linux-x64-gnu": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-gnu/-/oxide-linux-x64-gnu-4.1.5.tgz", + "integrity": "sha512-SO+F2YEIAHa1AITwc8oPwMOWhgorPzzcbhWEb+4oLi953h45FklDmM8dPSZ7hNHpIk9p/SCZKUYn35t5fjGtHA==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-linux-x64-musl": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-musl/-/oxide-linux-x64-musl-4.1.5.tgz", + "integrity": "sha512-6UbBBplywkk/R+PqqioskUeXfKcBht3KU7juTi1UszJLx0KPXUo10v2Ok04iBJIaDPkIFkUOVboXms5Yxvaz+g==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-wasm32-wasi": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-wasm32-wasi/-/oxide-wasm32-wasi-4.1.5.tgz", + "integrity": "sha512-hwALf2K9FHuiXTPqmo1KeOb83fTRNbe9r/Ixv9ZNQ/R24yw8Ge1HOWDDgTdtzntIaIUJG5dfXCf4g9AD4RiyhQ==", + "bundleDependencies": [ + "@napi-rs/wasm-runtime", + "@emnapi/core", + "@emnapi/runtime", + "@tybys/wasm-util", + "@emnapi/wasi-threads", + "tslib" + ], + "cpu": [ + "wasm32" + ], + "optional": true, + "dependencies": { + "@emnapi/core": "^1.4.3", + "@emnapi/runtime": "^1.4.3", + "@emnapi/wasi-threads": "^1.0.2", + "@napi-rs/wasm-runtime": "^0.2.9", + "@tybys/wasm-util": "^0.9.0", + "tslib": "^2.8.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@tailwindcss/oxide-win32-arm64-msvc": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-arm64-msvc/-/oxide-win32-arm64-msvc-4.1.5.tgz", + "integrity": "sha512-oDKncffWzaovJbkuR7/OTNFRJQVdiw/n8HnzaCItrNQUeQgjy7oUiYpsm9HUBgpmvmDpSSbGaCa2Evzvk3eFmA==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-win32-x64-msvc": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-x64-msvc/-/oxide-win32-x64-msvc-4.1.5.tgz", + "integrity": "sha512-WiR4dtyrFdbb+ov0LK+7XsFOsG+0xs0PKZKkt41KDn9jYpO7baE3bXiudPVkTqUEwNfiglCygQHl2jklvSBi7Q==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/vite": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/@tailwindcss/vite/-/vite-4.1.5.tgz", + "integrity": "sha512-FE1stRoqdHSb7RxesMfCXE8icwI1W6zGE/512ae3ZDrpkQYTTYeSyUJPRCjZd8CwVAhpDUbi1YR8pcZioFJQ/w==", + "dependencies": { + "@tailwindcss/node": "4.1.5", + "@tailwindcss/oxide": "4.1.5", + "tailwindcss": "4.1.5" + }, + "peerDependencies": { + "vite": "^5.2.0 || ^6" + } + }, "node_modules/@types/babel__core": { "version": "7.20.5", "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz", @@ -1596,8 +2498,7 @@ "node_modules/@types/estree": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.7.tgz", - "integrity": "sha512-w28IoSUCJpidD/TGviZwwMJckNESJZXFu7NBZ5YJ4mEUnNraUn9Pm8HSZm/jDF1pDWYKspWE7oVphigUPRakIQ==", - "dev": true + "integrity": "sha512-w28IoSUCJpidD/TGviZwwMJckNESJZXFu7NBZ5YJ4mEUnNraUn9Pm8HSZm/jDF1pDWYKspWE7oVphigUPRakIQ==" }, "node_modules/@types/json-schema": { "version": "7.0.15", @@ -1605,11 +2506,19 @@ "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", "dev": true }, + "node_modules/@types/node": { + "version": "22.15.17", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.15.17.tgz", + "integrity": "sha512-wIX2aSZL5FE+MR0JlvF87BNVrtFWf6AE6rxSE9X7OwnVvoyCQjpzSRJ+M87se/4QCkCiebQAqrJ0y6fwIyi7nw==", + "devOptional": true, + "dependencies": { + "undici-types": "~6.21.0" + } + }, "node_modules/@types/react": { "version": "19.1.3", "resolved": "https://registry.npmjs.org/@types/react/-/react-19.1.3.tgz", "integrity": "sha512-dLWQ+Z0CkIvK1J8+wrDPwGxEYFA4RAyHoZPxHVGspYmFVnwGSNT24cGIhFJrtfRnWVuW8X7NO52gCXmhkVUWGQ==", - "devOptional": true, "dependencies": { "csstype": "^3.0.2" } @@ -1618,16 +2527,29 @@ "version": "19.1.3", "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-19.1.3.tgz", "integrity": "sha512-rJXC08OG0h3W6wDMFxQrZF00Kq6qQvw0djHRdzl3U5DnIERz0MRce3WVc7IS6JYBwtaP/DwYtRRjVlvivNveKg==", - "dev": true, + "devOptional": true, "peerDependencies": { "@types/react": "^19.0.0" } }, + "node_modules/@types/react-transition-group": { + "version": "4.4.12", + "resolved": "https://registry.npmjs.org/@types/react-transition-group/-/react-transition-group-4.4.12.tgz", + "integrity": "sha512-8TV6R3h2j7a91c+1DXdJi3Syo69zzIZbz7Lg5tORM5LEJG7X/E6a1V3drRyBRZq7/utz7A+c4OgYLiLcYGHG6w==", + "peerDependencies": { + "@types/react": "*" + } + }, "node_modules/@types/use-sync-external-store": { "version": "0.0.6", "resolved": "https://registry.npmjs.org/@types/use-sync-external-store/-/use-sync-external-store-0.0.6.tgz", "integrity": "sha512-zFDAD+tlpf2r4asuHEj0XH6pY6i0g5NeAHPn+15wk3BV6JA69eERFXC1gyGThDkVa1zCyKr5jox1+2LbV/AMLg==" }, + "node_modules/@types/warning": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/warning/-/warning-3.0.3.tgz", + "integrity": "sha512-D1XC7WK8K+zZEveUPY+cf4+kgauk8N4eHr/XIHXGlGYkHLud6hK9lYfZk1ry1TNh798cZUCgb6MqGEG8DkJt6Q==" + }, "node_modules/@vitejs/plugin-react": { "version": "4.4.1", "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-4.4.1.tgz", @@ -1718,19 +2640,15 @@ "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", "dev": true }, - "node_modules/asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" - }, - "node_modules/axios": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.9.0.tgz", - "integrity": "sha512-re4CqKTJaURpzbLHtIi6XpDv20/CnpXOtjRY5/CU32L8gU8ek9UIivcfvSWvmKEngmVbrUtPpdDwWDWL7DNHvg==", + "node_modules/aria-hidden": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/aria-hidden/-/aria-hidden-1.2.4.tgz", + "integrity": "sha512-y+CcFFwelSXpLZk/7fMB2mUbGtX9lKycf1MWJ7CaTIERyitVlyQx6C+sxcROU2BAJ24OiZyK+8wj2i8AlBoS3A==", "dependencies": { - "follow-redirects": "^1.15.6", - "form-data": "^4.0.0", - "proxy-from-env": "^1.1.0" + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=10" } }, "node_modules/balanced-match": { @@ -1759,6 +2677,24 @@ "node": ">=18" } }, + "node_modules/bootstrap": { + "version": "5.3.3", + "resolved": "https://registry.npmjs.org/bootstrap/-/bootstrap-5.3.3.tgz", + "integrity": "sha512-8HLCdWgyoMguSO9o+aH+iuZ+aht+mzW0u3HIMzVu7Srrpv7EBBxTnrFlSCskwdY1+EOFQSm7uMJhNQHkdPcmjg==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/twbs" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/bootstrap" + } + ], + "peerDependencies": { + "@popperjs/core": "^2.11.8" + } + }, "node_modules/brace-expansion": { "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", @@ -1826,6 +2762,7 @@ "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, "dependencies": { "es-errors": "^1.3.0", "function-bind": "^1.1.2" @@ -1899,6 +2836,7 @@ "version": "4.0.3", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.3.tgz", "integrity": "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==", + "devOptional": true, "dependencies": { "readdirp": "^4.0.1" }, @@ -1909,6 +2847,30 @@ "url": "https://paulmillr.com/funding/" } }, + "node_modules/class-variance-authority": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/class-variance-authority/-/class-variance-authority-0.7.1.tgz", + "integrity": "sha512-Ka+9Trutv7G8M6WT6SeiRWz792K5qEqIGEGzXKhAE6xOWAY6pPH8U+9IY3oCMv6kqTmLsv7Xh/2w2RigkePMsg==", + "dependencies": { + "clsx": "^2.1.1" + }, + "funding": { + "url": "https://polar.sh/cva" + } + }, + "node_modules/classnames": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/classnames/-/classnames-2.5.1.tgz", + "integrity": "sha512-saHYOzhIQs6wy2sVxTM6bUDsQO4F50V9RQ22qBpEdCW+I+/Wmke2HOl6lS6dTpdxVhb88/I6+Hs+438c3lfUow==" + }, + "node_modules/clsx": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz", + "integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==", + "engines": { + "node": ">=6" + } + }, "node_modules/color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", @@ -1927,17 +2889,6 @@ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, - "node_modules/combined-stream": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", - "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", - "dependencies": { - "delayed-stream": "~1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, "node_modules/concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", @@ -2019,8 +2970,7 @@ "node_modules/csstype": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz", - "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==", - "devOptional": true + "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==" }, "node_modules/debug": { "version": "4.4.0", @@ -2045,14 +2995,6 @@ "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", "dev": true }, - "node_modules/delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", - "engines": { - "node": ">=0.4.0" - } - }, "node_modules/depd": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", @@ -2062,22 +3004,41 @@ "node": ">= 0.8" } }, - "node_modules/detect-libc": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz", - "integrity": "sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg==", - "optional": true, - "bin": { - "detect-libc": "bin/detect-libc.js" - }, + "node_modules/dequal": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", + "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==", "engines": { - "node": ">=0.10" + "node": ">=6" + } + }, + "node_modules/detect-libc": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.4.tgz", + "integrity": "sha512-3UDv+G9CsCKO1WKMGw9fwq/SWJYbI0c5Y7LU1AXYoDdbhE2AHQ6N6Nb34sG8Fj7T5APy8qXDCKuuIHd1BR0tVA==", + "engines": { + "node": ">=8" + } + }, + "node_modules/detect-node-es": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/detect-node-es/-/detect-node-es-1.1.0.tgz", + "integrity": "sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ==" + }, + "node_modules/dom-helpers": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/dom-helpers/-/dom-helpers-5.2.1.tgz", + "integrity": "sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA==", + "dependencies": { + "@babel/runtime": "^7.8.7", + "csstype": "^3.0.2" } }, "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, "dependencies": { "call-bind-apply-helpers": "^1.0.1", "es-errors": "^1.3.0", @@ -2108,10 +3069,23 @@ "node": ">= 0.8" } }, + "node_modules/enhanced-resolve": { + "version": "5.18.1", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.18.1.tgz", + "integrity": "sha512-ZSW3ma5GkcQBIpwZTSRAI8N71Uuwgs93IezB7mf7R60tC8ZbJideoDNKjHn2O9KIlx6rkGTTEk1xUCK2E1Y2Yg==", + "dependencies": { + "graceful-fs": "^4.2.4", + "tapable": "^2.2.0" + }, + "engines": { + "node": ">=10.13.0" + } + }, "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, "engines": { "node": ">= 0.4" } @@ -2120,6 +3094,7 @@ "version": "1.3.0", "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "dev": true, "engines": { "node": ">= 0.4" } @@ -2128,6 +3103,7 @@ "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, "dependencies": { "es-errors": "^1.3.0" }, @@ -2135,25 +3111,10 @@ "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==", - "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/esbuild": { "version": "0.25.4", "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.4.tgz", "integrity": "sha512-8pgjLUcUjcgDg+2Q4NYXnPbo/vncAY4UmyaCm0jZevERqCHZIaWwdJHkf8XQtu4AxSKCdvrUbT0XUr1IdZzI8Q==", - "dev": true, "hasInstallScript": true, "bin": { "esbuild": "bin/esbuild" @@ -2495,7 +3456,6 @@ "version": "6.4.4", "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.4.4.tgz", "integrity": "sha512-1NZP+GK4GfuAv3PqKvxQRDMjdSRZjnkq7KfhlNrCNNlZ0ygQFpebfrnfnq/W7fpUnAv9aGWmY1zKx7FYL3gwhg==", - "dev": true, "peerDependencies": { "picomatch": "^3 || ^4" }, @@ -2581,58 +3541,6 @@ "integrity": "sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==", "dev": true }, - "node_modules/follow-redirects": { - "version": "1.15.9", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.9.tgz", - "integrity": "sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==", - "funding": [ - { - "type": "individual", - "url": "https://github.com/sponsors/RubenVerborgh" - } - ], - "engines": { - "node": ">=4.0" - }, - "peerDependenciesMeta": { - "debug": { - "optional": true - } - } - }, - "node_modules/form-data": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.2.tgz", - "integrity": "sha512-hGfm/slu0ZabnNt4oaRZ6uREyfCj6P4fT/n6A1rGV+Z0VdGXjfOhVUpkn6qVQONHGIFwmveGXyDs75+nr6FM8w==", - "dependencies": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.8", - "es-set-tostringtag": "^2.1.0", - "mime-types": "^2.1.12" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/form-data/node_modules/mime-db": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/form-data/node_modules/mime-types": { - "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", - "dependencies": { - "mime-db": "1.52.0" - }, - "engines": { - "node": ">= 0.6" - } - }, "node_modules/forwarded": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", @@ -2655,7 +3563,6 @@ "version": "2.3.3", "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", - "dev": true, "hasInstallScript": true, "optional": true, "os": [ @@ -2669,6 +3576,7 @@ "version": "1.1.2", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "dev": true, "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -2686,6 +3594,7 @@ "version": "1.3.0", "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", + "dev": true, "dependencies": { "call-bind-apply-helpers": "^1.0.2", "es-define-property": "^1.0.1", @@ -2705,10 +3614,19 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/get-nonce": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-nonce/-/get-nonce-1.0.1.tgz", + "integrity": "sha512-FJhYRoDaiatfEkUK8HKlicmu/3SGFD51q3itKDGoSTysQJBnfOcxU5GxnhE1E6soB76MbT0MBtnKJuXyAx+96Q==", + "engines": { + "node": ">=6" + } + }, "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, "dependencies": { "dunder-proto": "^1.0.1", "es-object-atoms": "^1.0.0" @@ -2745,6 +3663,7 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", + "dev": true, "engines": { "node": ">= 0.4" }, @@ -2752,6 +3671,11 @@ "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==" + }, "node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", @@ -2765,20 +3689,7 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", - "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==", - "dependencies": { - "has-symbols": "^1.0.3" - }, + "dev": true, "engines": { "node": ">= 0.4" }, @@ -2790,6 +3701,7 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "dev": true, "dependencies": { "function-bind": "^1.1.2" }, @@ -2846,7 +3758,8 @@ "node_modules/immutable": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/immutable/-/immutable-5.1.2.tgz", - "integrity": "sha512-qHKXW1q6liAk1Oys6umoaZbDRqjcjgSrbnrifHsfsttza7zcvRAsL7mMV6xWcyhwQy7Xj5v4hhbr6b+iDYwlmQ==" + "integrity": "sha512-qHKXW1q6liAk1Oys6umoaZbDRqjcjgSrbnrifHsfsttza7zcvRAsL7mMV6xWcyhwQy7Xj5v4hhbr6b+iDYwlmQ==", + "devOptional": true }, "node_modules/import-fresh": { "version": "3.3.1", @@ -2879,6 +3792,14 @@ "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", "dev": true }, + "node_modules/invariant": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", + "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==", + "dependencies": { + "loose-envify": "^1.0.0" + } + }, "node_modules/ipaddr.js": { "version": "1.9.1", "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", @@ -2930,11 +3851,18 @@ "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", "dev": true }, + "node_modules/jiti": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-2.4.2.tgz", + "integrity": "sha512-rg9zJN+G4n2nfJl5MW3BMygZX56zKPNVEYYqq7adpmMh4Jn2QNEwhvQlFy6jPVdcod7txZtKHWnyZiA3a0zP7A==", + "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 + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" }, "node_modules/js-yaml": { "version": "4.1.0", @@ -3012,6 +3940,223 @@ "node": ">= 0.8.0" } }, + "node_modules/lightningcss": { + "version": "1.29.2", + "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.29.2.tgz", + "integrity": "sha512-6b6gd/RUXKaw5keVdSEtqFVdzWnU5jMxTUjA2bVcMNPLwSQ08Sv/UodBVtETLCn7k4S1Ibxwh7k68IwLZPgKaA==", + "dependencies": { + "detect-libc": "^2.0.3" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "optionalDependencies": { + "lightningcss-darwin-arm64": "1.29.2", + "lightningcss-darwin-x64": "1.29.2", + "lightningcss-freebsd-x64": "1.29.2", + "lightningcss-linux-arm-gnueabihf": "1.29.2", + "lightningcss-linux-arm64-gnu": "1.29.2", + "lightningcss-linux-arm64-musl": "1.29.2", + "lightningcss-linux-x64-gnu": "1.29.2", + "lightningcss-linux-x64-musl": "1.29.2", + "lightningcss-win32-arm64-msvc": "1.29.2", + "lightningcss-win32-x64-msvc": "1.29.2" + } + }, + "node_modules/lightningcss-darwin-arm64": { + "version": "1.29.2", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.29.2.tgz", + "integrity": "sha512-cK/eMabSViKn/PG8U/a7aCorpeKLMlK0bQeNHmdb7qUnBkNPnL+oV5DjJUo0kqWsJUapZsM4jCfYItbqBDvlcA==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-darwin-x64": { + "version": "1.29.2", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.29.2.tgz", + "integrity": "sha512-j5qYxamyQw4kDXX5hnnCKMf3mLlHvG44f24Qyi2965/Ycz829MYqjrVg2H8BidybHBp9kom4D7DR5VqCKDXS0w==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-freebsd-x64": { + "version": "1.29.2", + "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.29.2.tgz", + "integrity": "sha512-wDk7M2tM78Ii8ek9YjnY8MjV5f5JN2qNVO+/0BAGZRvXKtQrBC4/cn4ssQIpKIPP44YXw6gFdpUF+Ps+RGsCwg==", + "cpu": [ + "x64" + ], + "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.29.2", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.29.2.tgz", + "integrity": "sha512-IRUrOrAF2Z+KExdExe3Rz7NSTuuJ2HvCGlMKoquK5pjvo2JY4Rybr+NrKnq0U0hZnx5AnGsuFHjGnNT14w26sg==", + "cpu": [ + "arm" + ], + "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.29.2", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.29.2.tgz", + "integrity": "sha512-KKCpOlmhdjvUTX/mBuaKemp0oeDIBBLFiU5Fnqxh1/DZ4JPZi4evEH7TKoSBFOSOV3J7iEmmBaw/8dpiUvRKlQ==", + "cpu": [ + "arm64" + ], + "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.29.2", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.29.2.tgz", + "integrity": "sha512-Q64eM1bPlOOUgxFmoPUefqzY1yV3ctFPE6d/Vt7WzLW4rKTv7MyYNky+FWxRpLkNASTnKQUaiMJ87zNODIrrKQ==", + "cpu": [ + "arm64" + ], + "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.29.2", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.29.2.tgz", + "integrity": "sha512-0v6idDCPG6epLXtBH/RPkHvYx74CVziHo6TMYga8O2EiQApnUPZsbR9nFNrg2cgBzk1AYqEd95TlrsL7nYABQg==", + "cpu": [ + "x64" + ], + "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.29.2", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.29.2.tgz", + "integrity": "sha512-rMpz2yawkgGT8RULc5S4WiZopVMOFWjiItBT7aSfDX4NQav6M44rhn5hjtkKzB+wMTRlLLqxkeYEtQ3dd9696w==", + "cpu": [ + "x64" + ], + "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.29.2", + "resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.29.2.tgz", + "integrity": "sha512-nL7zRW6evGQqYVu/bKGK+zShyz8OVzsCotFgc7judbt6wnB2KbiKKJwBE4SGoDBQ1O94RjW4asrCjQL4i8Fhbw==", + "cpu": [ + "arm64" + ], + "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.29.2", + "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.29.2.tgz", + "integrity": "sha512-EdIUW3B2vLuHmv7urfzMI/h2fmlnOQBk1xlsDxkN1tCWKjNFjfLhGxYk8C8mzpSfr+A6jFFIi8fU6LbQGsRWjA==", + "cpu": [ + "x64" + ], + "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", @@ -3033,6 +4178,17 @@ "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", "dev": true }, + "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==", + "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", @@ -3042,10 +4198,19 @@ "yallist": "^3.0.2" } }, + "node_modules/lucide-react": { + "version": "0.508.0", + "resolved": "https://registry.npmjs.org/lucide-react/-/lucide-react-0.508.0.tgz", + "integrity": "sha512-gcP16PnexqtOFrTtv98kVsGzTfnbPekzZiQfByi2S89xfk7E/4uKE1USZqccIp58v42LqkO7MuwpCqshwSrJCg==", + "peerDependencies": { + "react": "^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0" + } + }, "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, "engines": { "node": ">= 0.4" } @@ -3139,7 +4304,6 @@ "version": "3.3.11", "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", - "dev": true, "funding": [ { "type": "github", @@ -3184,7 +4348,6 @@ "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, "engines": { "node": ">=0.10.0" } @@ -3320,14 +4483,12 @@ "node_modules/picocolors": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", - "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", - "dev": true + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==" }, "node_modules/picomatch": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz", "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==", - "dev": true, "engines": { "node": ">=12" }, @@ -3348,7 +4509,6 @@ "version": "8.5.3", "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.3.tgz", "integrity": "sha512-dle9A3yYxlBSrt8Fu+IpjGT8SY8hN0mlaA6GY8t0P5PjIOZemULz/E2Bnm/2dcUOena75OTNkHI76uZBNUUq3A==", - "dev": true, "funding": [ { "type": "opencollective", @@ -3381,6 +4541,28 @@ "node": ">= 0.8.0" } }, + "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==", + "dependencies": { + "loose-envify": "^1.4.0", + "object-assign": "^4.1.1", + "react-is": "^16.13.1" + } + }, + "node_modules/prop-types-extra": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/prop-types-extra/-/prop-types-extra-1.1.1.tgz", + "integrity": "sha512-59+AHNnHYCdiC+vMwY52WmvP5dM3QLeoumYuEyceQDi9aEhtwN9zIQ2ZNo25sMyXnbh32h+P1ezDsUpUH3JAew==", + "dependencies": { + "react-is": "^16.3.2", + "warning": "^4.0.0" + }, + "peerDependencies": { + "react": ">=0.14.0" + } + }, "node_modules/proxy-addr": { "version": "2.0.7", "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", @@ -3394,11 +4576,6 @@ "node": ">= 0.10" } }, - "node_modules/proxy-from-env": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", - "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==" - }, "node_modules/punycode": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", @@ -3455,6 +4632,35 @@ "node": ">=0.10.0" } }, + "node_modules/react-bootstrap": { + "version": "2.10.1", + "resolved": "https://registry.npmjs.org/react-bootstrap/-/react-bootstrap-2.10.1.tgz", + "integrity": "sha512-J3OpRZIvCTQK+Tg/jOkRUvpYLHMdGeU9KqFUBQrV0d/Qr/3nsINpiOJyZMWnM5SJ3ctZdhPA6eCIKpEJR3Ellg==", + "dependencies": { + "@babel/runtime": "^7.22.5", + "@restart/hooks": "^0.4.9", + "@restart/ui": "^1.6.6", + "@types/react-transition-group": "^4.4.6", + "classnames": "^2.3.2", + "dom-helpers": "^5.2.1", + "invariant": "^2.2.4", + "prop-types": "^15.8.1", + "prop-types-extra": "^1.1.0", + "react-transition-group": "^4.4.5", + "uncontrollable": "^7.2.1", + "warning": "^4.0.3" + }, + "peerDependencies": { + "@types/react": ">=16.14.8", + "react": ">=16.14.0", + "react-dom": ">=16.14.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, "node_modules/react-dom": { "version": "19.1.0", "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.1.0.tgz", @@ -3466,6 +4672,16 @@ "react": "^19.1.0" } }, + "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==" + }, + "node_modules/react-lifecycles-compat": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/react-lifecycles-compat/-/react-lifecycles-compat-3.0.4.tgz", + "integrity": "sha512-fBASbA6LnOU9dOU2eW7aQ8xmYBSXUIWr+UmF9b1efZBazGNO+rcXT/icdKnYm2pTwcRylVUYwW7H1PHfLekVzA==" + }, "node_modules/react-redux": { "version": "9.2.0", "resolved": "https://registry.npmjs.org/react-redux/-/react-redux-9.2.0.tgz", @@ -3497,14 +4713,58 @@ "node": ">=0.10.0" } }, + "node_modules/react-remove-scroll": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/react-remove-scroll/-/react-remove-scroll-2.6.3.tgz", + "integrity": "sha512-pnAi91oOk8g8ABQKGF5/M9qxmmOPxaAnopyTHYfqYEwJhyFrbbBtHuSgtKEoH0jpcxx5o3hXqH1mNd9/Oi+8iQ==", + "dependencies": { + "react-remove-scroll-bar": "^2.3.7", + "react-style-singleton": "^2.2.3", + "tslib": "^2.1.0", + "use-callback-ref": "^1.3.3", + "use-sidecar": "^1.1.3" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/react-remove-scroll-bar": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/react-remove-scroll-bar/-/react-remove-scroll-bar-2.3.8.tgz", + "integrity": "sha512-9r+yi9+mgU33AKcj6IbT9oRCO78WriSj6t/cF8DWBZJ9aOGPOTEDvdUDz1FwKim7QXWwmHqtdHnRJfhAxEG46Q==", + "dependencies": { + "react-style-singleton": "^2.2.2", + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, "node_modules/react-router": { - "version": "7.5.3", - "resolved": "https://registry.npmjs.org/react-router/-/react-router-7.5.3.tgz", - "integrity": "sha512-3iUDM4/fZCQ89SXlDa+Ph3MevBrozBAI655OAfWQlTm9nBR0IKlrmNwFow5lPHttbwvITZfkeeeZFP6zt3F7pw==", + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/react-router/-/react-router-7.6.0.tgz", + "integrity": "sha512-GGufuHIVCJDbnIAXP3P9Sxzq3UUsddG3rrI3ut1q6m0FI6vxVBF3JoPQ38+W/blslLH4a5Yutp8drkEpXoddGQ==", "dependencies": { "cookie": "^1.0.1", - "set-cookie-parser": "^2.6.0", - "turbo-stream": "2.4.0" + "set-cookie-parser": "^2.6.0" }, "engines": { "node": ">=20.0.0" @@ -3520,11 +4780,11 @@ } }, "node_modules/react-router-dom": { - "version": "7.5.3", - "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-7.5.3.tgz", - "integrity": "sha512-cK0jSaTyW4jV9SRKAItMIQfWZ/D6WEZafgHuuCb9g+SjhLolY78qc+De4w/Cz9ybjvLzShAmaIMEXt8iF1Cm+A==", + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-7.6.0.tgz", + "integrity": "sha512-DYgm6RDEuKdopSyGOWZGtDfSm7Aofb8CCzgkliTjtu/eDuB0gcsv6qdFhhi8HdtmA+KHkt5MfZ5K2PdzjugYsA==", "dependencies": { - "react-router": "7.5.3" + "react-router": "7.6.0" }, "engines": { "node": ">=20.0.0" @@ -3542,10 +4802,47 @@ "node": ">=18" } }, + "node_modules/react-style-singleton": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/react-style-singleton/-/react-style-singleton-2.2.3.tgz", + "integrity": "sha512-b6jSvxvVnyptAiLjbkWLE/lOnR4lfTtDAl+eUC7RZy+QQWc6wRzIV2CE6xBuMmDxc2qIihtDCZD5NPOFl7fRBQ==", + "dependencies": { + "get-nonce": "^1.0.0", + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/react-transition-group": { + "version": "4.4.5", + "resolved": "https://registry.npmjs.org/react-transition-group/-/react-transition-group-4.4.5.tgz", + "integrity": "sha512-pZcd1MCJoiKiBR2NRxeCRg13uCXbydPnmB4EOeRrY7480qNWO8IIgQG6zlDkm6uRMsURXPuKq0GWtiM59a5Q6g==", + "dependencies": { + "@babel/runtime": "^7.5.5", + "dom-helpers": "^5.0.1", + "loose-envify": "^1.4.0", + "prop-types": "^15.6.2" + }, + "peerDependencies": { + "react": ">=16.6.0", + "react-dom": ">=16.6.0" + } + }, "node_modules/readdirp": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.1.2.tgz", "integrity": "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==", + "devOptional": true, "engines": { "node": ">= 14.18.0" }, @@ -3585,7 +4882,6 @@ "version": "4.40.2", "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.40.2.tgz", "integrity": "sha512-tfUOg6DTP4rhQ3VjOO6B4wyrJnGOX85requAXvqYTHsOgb2TFJdZ3aWpT8W2kPoypSGP7dZUyzxJ9ee4buM5Fg==", - "dev": true, "dependencies": { "@types/estree": "1.0.7" }, @@ -3666,6 +4962,7 @@ "version": "1.87.0", "resolved": "https://registry.npmjs.org/sass/-/sass-1.87.0.tgz", "integrity": "sha512-d0NoFH4v6SjEK7BoX810Jsrhj7IQSYHAHLi/iSpgqKc7LaIDshFRlSg5LOymf9FqQhxEHs2W5ZQXlvy0KD45Uw==", + "devOptional": true, "dependencies": { "chokidar": "^4.0.0", "immutable": "^5.0.2", @@ -3877,11 +5174,32 @@ "node": ">=8" } }, + "node_modules/tailwind-merge": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/tailwind-merge/-/tailwind-merge-3.2.0.tgz", + "integrity": "sha512-FQT/OVqCD+7edmmJpsgCsY820RTD5AkBryuG5IUqR5YQZSdj5xlH5nLgH7YPths7WsLPSpSBNneJdM8aS8aeFA==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/dcastil" + } + }, + "node_modules/tailwindcss": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-4.1.5.tgz", + "integrity": "sha512-nYtSPfWGDiWgCkwQG/m+aX83XCwf62sBgg3bIlNiiOcggnS1x3uVRDAuyelBFL+vJdOPPCGElxv9DjHJjRHiVA==" + }, + "node_modules/tapable": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", + "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==", + "engines": { + "node": ">=6" + } + }, "node_modules/tinyglobby": { "version": "0.2.13", "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.13.tgz", "integrity": "sha512-mEwzpUgrLySlveBwEVDMKk5B57bhLPYovRfPAXD5gA/98Opn0rCDj3GtLwFvCvH5RK9uPCExUROW5NjDwvqkxw==", - "dev": true, "dependencies": { "fdir": "^6.4.4", "picomatch": "^4.0.2" @@ -3914,10 +5232,19 @@ "node": ">=0.6" } }, - "node_modules/turbo-stream": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/turbo-stream/-/turbo-stream-2.4.0.tgz", - "integrity": "sha512-FHncC10WpBd2eOmGwpmQsWLDoK4cqsA/UT/GqNoaKOQnT8uzhtCbg3EoUDMvqpOSAI0S26mr0rkjzbOO6S3v1g==" + "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==" + }, + "node_modules/tw-animate-css": { + "version": "1.2.9", + "resolved": "https://registry.npmjs.org/tw-animate-css/-/tw-animate-css-1.2.9.tgz", + "integrity": "sha512-9O4k1at9pMQff9EAcCEuy1UNO43JmaPQvq+0lwza9Y0BQ6LB38NiMj+qHqjoQf40355MX+gs6wtlR6H9WsSXFg==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/Wombosvideo" + } }, "node_modules/type-check": { "version": "0.4.0", @@ -3945,6 +5272,26 @@ "node": ">= 0.6" } }, + "node_modules/uncontrollable": { + "version": "7.2.1", + "resolved": "https://registry.npmjs.org/uncontrollable/-/uncontrollable-7.2.1.tgz", + "integrity": "sha512-svtcfoTADIB0nT9nltgjujTi7BzVmwjZClOmskKu/E8FW9BXzg9os8OLr4f8Dlnk0rYWJIWr4wv9eKUXiQvQwQ==", + "dependencies": { + "@babel/runtime": "^7.6.3", + "@types/react": ">=16.9.11", + "invariant": "^2.2.4", + "react-lifecycles-compat": "^3.0.4" + }, + "peerDependencies": { + "react": ">=15.0.0" + } + }, + "node_modules/undici-types": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz", + "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==", + "devOptional": true + }, "node_modules/unpipe": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", @@ -3993,6 +5340,47 @@ "punycode": "^2.1.0" } }, + "node_modules/use-callback-ref": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/use-callback-ref/-/use-callback-ref-1.3.3.tgz", + "integrity": "sha512-jQL3lRnocaFtu3V00JToYz/4QkNWswxijDaCVNZRiRTO3HQDLsdu1ZtmIUvV4yPp+rvWm5j0y0TG/S61cuijTg==", + "dependencies": { + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/use-sidecar": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/use-sidecar/-/use-sidecar-1.1.3.tgz", + "integrity": "sha512-Fedw0aZvkhynoPYlA5WXrMCAMm+nSWdZt6lzJQ7Ok8S6Q+VsHmHpRWndVRJ8Be0ZbkfPc5LRYH+5XrzXcEeLRQ==", + "dependencies": { + "detect-node-es": "^1.1.0", + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, "node_modules/use-sync-external-store": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.5.0.tgz", @@ -4014,7 +5402,6 @@ "version": "6.3.5", "resolved": "https://registry.npmjs.org/vite/-/vite-6.3.5.tgz", "integrity": "sha512-cZn6NDFE7wdTpINgs++ZJ4N49W2vRp8LCKrn3Ob1kYNtOo21vfDoaV5GzBfLU4MovSAB8uNRm4jgzVQZ+mBzPQ==", - "dev": true, "dependencies": { "esbuild": "^0.25.0", "fdir": "^6.4.4", @@ -4084,6 +5471,14 @@ } } }, + "node_modules/warning": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/warning/-/warning-4.0.3.tgz", + "integrity": "sha512-rpJyN222KWIvHJ/F53XSZv0Zl/accqHR8et1kpaMTD/fLCRxtV8iX8czMzY7sVZupTI3zcUTg8eycS2kNF9l6w==", + "dependencies": { + "loose-envify": "^1.0.0" + } + }, "node_modules/which": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", diff --git a/package.json b/package.json index e9a947b..518c58c 100644 --- a/package.json +++ b/package.json @@ -1,33 +1,40 @@ { - "name": "mvp_ooin", - "private": true, - "version": "0.0.0", - "type": "module", - "scripts": { - "dev": "vite", - "build": "vite build", - "lint": "eslint .", - "preview": "vite preview" - }, - "dependencies": { - "@reduxjs/toolkit": "^2.8.1", - "axios": "^1.9.0", - "react": "^19.1.0", - "react-dom": "^19.1.0", - "react-redux": "^9.2.0", - "react-router-dom": "^7.5.3", - "redux": "^5.0.1", - "sass": "^1.87.0" - }, - "devDependencies": { - "@eslint/js": "^9.25.0", - "@types/react": "^19.1.2", - "@types/react-dom": "^19.1.2", - "@vitejs/plugin-react": "^4.4.1", - "eslint": "^9.25.0", - "eslint-plugin-react-hooks": "^5.2.0", - "eslint-plugin-react-refresh": "^0.4.19", - "globals": "^16.0.0", - "vite": "^6.3.5" - } + "name": "creator-center-ooin", + "private": true, + "version": "0.0.0", + "type": "module", + "scripts": { + "dev": "vite", + "build": "vite build", + "lint": "eslint .", + "preview": "vite preview" + }, + "dependencies": { + "@fortawesome/fontawesome-free": "^6.7.2", + "@fortawesome/fontawesome-svg-core": "^6.7.2", + "@fortawesome/free-brands-svg-icons": "^6.7.2", + "@fortawesome/free-regular-svg-icons": "^6.7.2", + "@fortawesome/free-solid-svg-icons": "^6.7.2", + "@fortawesome/react-fontawesome": "^0.2.2", + "bootstrap": "^5.3.3", + "lucide-react": "^0.508.0", + "react": "^19.1.0", + "react-bootstrap": "^2.10.1", + "react-dom": "^19.1.0", + "react-redux": "^9.2.0", + "react-router-dom": "^7.6.0" + }, + "devDependencies": { + "@eslint/js": "^9.25.0", + "@types/node": "^22.15.17", + "@types/react": "^19.1.2", + "@types/react-dom": "^19.1.2", + "@vitejs/plugin-react": "^4.4.1", + "eslint": "^9.25.0", + "eslint-plugin-react-hooks": "^5.2.0", + "eslint-plugin-react-refresh": "^0.4.19", + "globals": "^16.0.0", + "sass": "^1.87.0", + "vite": "^6.3.5" + } } diff --git a/src/App.css b/src/App.css deleted file mode 100644 index b9d355d..0000000 --- a/src/App.css +++ /dev/null @@ -1,42 +0,0 @@ -#root { - max-width: 1280px; - margin: 0 auto; - padding: 2rem; - text-align: center; -} - -.logo { - height: 6em; - padding: 1.5em; - will-change: filter; - transition: filter 300ms; -} -.logo:hover { - filter: drop-shadow(0 0 2em #646cffaa); -} -.logo.react:hover { - filter: drop-shadow(0 0 2em #61dafbaa); -} - -@keyframes logo-spin { - from { - transform: rotate(0deg); - } - to { - transform: rotate(360deg); - } -} - -@media (prefers-reduced-motion: no-preference) { - a:nth-of-type(2) .logo { - animation: logo-spin infinite 20s linear; - } -} - -.card { - padding: 2em; -} - -.read-the-docs { - color: #888; -} diff --git a/src/App.jsx b/src/App.jsx index 900e3a8..39a4794 100644 --- a/src/App.jsx +++ b/src/App.jsx @@ -1,27 +1,13 @@ -import { BrowserRouter as Router, Routes, Route } from 'react-router-dom'; -import { Provider } from 'react-redux'; -import store from './store'; -import './App.css'; +import { faTiktok, faYoutube, faInstagram } from '@fortawesome/free-brands-svg-icons'; +import { library } from '@fortawesome/fontawesome-svg-core'; +import { fas } from '@fortawesome/free-solid-svg-icons'; +import Router from './router'; -// Import pages here -import Home from './pages/Home'; -import About from './pages/About'; -import NotFound from './pages/NotFound'; +// Add Font Awesome icons to library +library.add(faTiktok, fas, faYoutube, faInstagram); function App() { - return ( - - -
- - } /> - } /> - } /> - -
-
-
- ); + return ; } export default App; diff --git a/src/assets/logo.png b/src/assets/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..f695f2afbef92a6748221e6bd905c72ae361b026 GIT binary patch literal 15045 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 literal 0 HcmV?d00001 diff --git a/src/components/Layout.jsx b/src/components/Layout.jsx new file mode 100644 index 0000000..795af7a --- /dev/null +++ b/src/components/Layout.jsx @@ -0,0 +1,29 @@ +import React, { useState } from 'react'; +import { Outlet } from 'react-router-dom'; +import { Button } from 'react-bootstrap'; +import { List } from 'lucide-react'; +import Sidebar from './Sidebar'; + +export default function Layout() { + const [showSidebar, setShowSidebar] = useState(true); + + const toggleSidebar = () => { + setShowSidebar(!showSidebar); + }; + + return ( +
+
+ +
+ + + +
+ +
+
+ ); +} diff --git a/src/components/Sidebar.jsx b/src/components/Sidebar.jsx new file mode 100644 index 0000000..80cbdea --- /dev/null +++ b/src/components/Sidebar.jsx @@ -0,0 +1,169 @@ +import React, { useState } from 'react'; +import { Link, useLocation } from 'react-router-dom'; +import { Nav, Accordion } from 'react-bootstrap'; +import { Settings, ChevronDown, Blocks, SquareActivity, LayoutDashboard, Mail, UserSearch, Heart } from 'lucide-react'; +import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'; +import logo from '@/assets/logo.png'; +import '../styles/sidebar.scss'; + +// Organized menu items +const menuItems = [ + { + id: 'creator-discovery', + title: 'Creator Discovery', + path: '/creator-discovery', + icon: , + hasSubmenu: false, + }, + { + id: 'creator-database', + title: 'Creator Database', + path: '/creator-database', + icon: , + hasSubmenu: true, + submenuItems: [ + { + id: 'tiktok', + title: 'TikTok', + path: '/creator-database/tiktok', + icon: , + }, + { + id: 'instagram', + title: 'Instagram', + path: '/creator-database/instagram', + icon: , + }, + { + id: 'youtube', + title: 'YouTube', + path: '/creator-database/youtube', + icon: , + }, + ], + }, + { + id: 'private-creators', + title: 'Private Creators', + path: '/private-creators', + icon: , + hasSubmenu: true, + submenuItems: [], + }, + { + id: 'deep-analysis', + title: 'Deep Analysis', + path: '/deep-analysis', + icon: , + hasSubmenu: false, + }, + { + id: 'brands', + title: 'Brands', + path: '/brands', + icon: , + hasSubmenu: false, + }, + { + id: 'creator-inbox', + title: 'Creator Inbox', + path: '/creator-inbox', + icon: , + hasSubmenu: true, + submenuItems: [], + }, + { + id: 'settings', + title: 'Settings', + path: '/settings', + icon: , + hasSubmenu: false, + }, +]; + +export default function Sidebar() { + const location = useLocation(); + const [expanded, setExpanded] = useState({}); + + // 检查路径是否匹配当前路由 + const isActive = (path) => { + return location.pathname === path || location.pathname.startsWith(`${path}/`); + }; + + // 检查是否有子项是激活状态 + const hasActiveChild = (item) => { + if (!item.submenuItems) return false; + return item.submenuItems.some((subItem) => isActive(subItem.path)); + }; + + // 处理手风琴项的展开/折叠 + const handleAccordionToggle = (id) => { + setExpanded((prev) => ({ + ...prev, + [id]: !prev[id], + })); + }; + + return ( +
+
+ OOIN Logo +
+
OOIN Media
+
Creator Center
+
+
+ + +
+ ); +} diff --git a/src/index.css b/src/index.css index 55788b5..b4e13b6 100644 --- a/src/index.css +++ b/src/index.css @@ -1,125 +1,49 @@ :root { - font-family: Inter, system-ui, Avenir, Helvetica, Arial, sans-serif; - line-height: 1.5; - font-weight: 400; - - color-scheme: light dark; - color: rgba(255, 255, 255, 0.87); - background-color: #242424; - - font-synthesis: none; - text-rendering: optimizeLegibility; - -webkit-font-smoothing: antialiased; - -moz-osx-font-smoothing: grayscale; -} - -* { - box-sizing: border-box; - margin: 0; - padding: 0; + --bs-primary-rgb: 99, 102, 241; /* 必须匹配custom-theme.scss中的$primary */ } body { + font-family: 'Open Sans', -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', 'Oxygen', + 'Ubuntu', 'Cantarell', 'Fira Sans', 'Droid Sans', 'Helvetica Neue', sans-serif; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; margin: 0; - display: flex; - place-items: center; - min-width: 320px; + padding: 0; + font-size: 16px; + line-height: 1.5; + color: #212529; + background-color: #f5f3ff; min-height: 100vh; } a { - font-weight: 500; - color: #646cff; - text-decoration: inherit; + text-decoration: none; } + a:hover { - color: #535bf2; + text-decoration: underline; } -h1 { - font-size: 2.2em; - line-height: 1.1; - margin-bottom: 1rem; +/* Override some Bootstrap defaults */ +.btn:focus, .btn:active:focus { + box-shadow: none; } -h2 { - font-size: 1.5em; - margin-bottom: 0.75rem; +/* Custom scrollbar */ +::-webkit-scrollbar { + width: 8px; + height: 8px; } -button { - border-radius: 8px; - border: 1px solid transparent; - padding: 0.6em 1.2em; - font-size: 1em; - font-weight: 500; - font-family: inherit; - background-color: #1a1a1a; - cursor: pointer; - transition: border-color 0.25s; -} -button:hover { - border-color: #646cff; -} -button:focus, -button:focus-visible { - outline: 4px auto -webkit-focus-ring-color; +::-webkit-scrollbar-track { + background: #f1f1f1; } -.app-container { - max-width: 1280px; - margin: 0 auto; - padding: 2rem; - text-align: center; +::-webkit-scrollbar-thumb { + background: #ccc; + border-radius: 4px; } -.button-group { - display: flex; - gap: 0.5rem; - justify-content: center; - margin: 1rem 0; -} - -.navigation { - margin-top: 2rem; -} - -.home-container, .about-container, .not-found-container { - display: flex; - flex-direction: column; - align-items: center; - justify-content: center; -} - -.counter-section { - margin: 2rem 0; - padding: 1.5rem; - border-radius: 8px; - background-color: #1a1a1a; -} - -.tech-stack { - margin: 2rem 0; - text-align: left; -} - -.tech-stack ul { - list-style-position: inside; - margin-left: 1rem; -} - -@media (prefers-color-scheme: light) { - :root { - color: #213547; - background-color: #ffffff; - } - a:hover { - color: #747bff; - } - button { - background-color: #f9f9f9; - } - .counter-section { - background-color: #f1f1f1; - } -} +::-webkit-scrollbar-thumb:hover { + background: #aaa; +} \ No newline at end of file diff --git a/src/lib/utils.js b/src/lib/utils.js new file mode 100644 index 0000000..ca2033e --- /dev/null +++ b/src/lib/utils.js @@ -0,0 +1,40 @@ +/** + * 格式化日期 + * @param {Date} date - 要格式化的日期对象 + * @param {string} format - 格式字符串 (默认为 'YYYY-MM-DD') + * @returns {string} 格式化后的日期字符串 + */ +export function formatDate(date, format = 'YYYY-MM-DD') { + if (!date) return ''; + + const d = new Date(date); + const year = d.getFullYear(); + const month = String(d.getMonth() + 1).padStart(2, '0'); + const day = String(d.getDate()).padStart(2, '0'); + const hours = String(d.getHours()).padStart(2, '0'); + const minutes = String(d.getMinutes()).padStart(2, '0'); + const seconds = String(d.getSeconds()).padStart(2, '0'); + + return format + .replace('YYYY', year) + .replace('MM', month) + .replace('DD', day) + .replace('HH', hours) + .replace('mm', minutes) + .replace('ss', seconds); +} + +/** + * 格式化数字 + * @param {number} number - 要格式化的数字 + * @param {number} decimals - 小数位数 + * @param {string} decimalPoint - 小数点符号 + * @param {string} thousandsSeparator - 千位分隔符 + * @returns {string} 格式化后的数字字符串 + */ +export function formatNumber(number, decimals = 0, decimalPoint = '.', thousandsSeparator = ',') { + if (isNaN(number)) return '0'; + + const n = Number(number).toFixed(decimals); + return n.toString().replace(/\B(?=(\d{3})+(?!\d))/g, thousandsSeparator); +} diff --git a/src/main.jsx b/src/main.jsx index 5ac7341..4b0e5e2 100644 --- a/src/main.jsx +++ b/src/main.jsx @@ -1,10 +1,11 @@ -import React from 'react'; -import ReactDOM from 'react-dom/client'; -import App from './App.jsx'; +import { StrictMode } from 'react'; +import { createRoot } from 'react-dom/client'; +import '../src/styles/custom-theme.scss'; import './index.css'; +import App from './App.jsx'; -ReactDOM.createRoot(document.getElementById('root')).render( - +createRoot(document.getElementById('root')).render( + - + ); diff --git a/src/pages/About.jsx b/src/pages/About.jsx deleted file mode 100644 index 5f7f0ff..0000000 --- a/src/pages/About.jsx +++ /dev/null @@ -1,29 +0,0 @@ -import { Link } from 'react-router-dom'; - -function About() { - return ( -
-

About 达人工具 MVP

-

This is a React application built with Vite, Redux, and React Router.

-

The application serves as an MVP for talent tools.

- -
-

Tech Stack

-
    -
  • React
  • -
  • Redux (with Redux Toolkit)
  • -
  • React Router
  • -
  • Vite
  • -
  • Axios
  • -
  • SASS
  • -
-
- -
- Back to Home -
-
- ); -} - -export default About; diff --git a/src/pages/Home.jsx b/src/pages/Home.jsx index b80d047..d081b8a 100644 --- a/src/pages/Home.jsx +++ b/src/pages/Home.jsx @@ -1,30 +1,15 @@ -import { useSelector, useDispatch } from 'react-redux'; -import { increment, decrement } from '../store/counterSlice'; -import { Link } from 'react-router-dom'; - -function Home() { - const count = useSelector((state) => state.counter.value); - const dispatch = useDispatch(); +import React from 'react'; +import { Container, Row, Col } from 'react-bootstrap'; +export default function Home() { return ( -
-

达人工具 MVP

-

Welcome to the Talent Tool MVP application

- -
-

Counter Demo

-

Current count: {count}

-
- - -
-
- -
- About Page -
-
+ + + +

Welcome to OOIN Creator Center

+

Select an option from the sidebar to get started.

+ +
+
); } - -export default Home; diff --git a/src/pages/NotFound.jsx b/src/pages/NotFound.jsx deleted file mode 100644 index f9d4ce1..0000000 --- a/src/pages/NotFound.jsx +++ /dev/null @@ -1,16 +0,0 @@ -import { Link } from 'react-router-dom'; - -function NotFound() { - return ( -
-

404 - Page Not Found

-

The page you are looking for does not exist.

- -
- Back to Home -
-
- ); -} - -export default NotFound; diff --git a/src/router/index.jsx b/src/router/index.jsx new file mode 100644 index 0000000..171e2cf --- /dev/null +++ b/src/router/index.jsx @@ -0,0 +1,71 @@ +import { createBrowserRouter, RouterProvider } from 'react-router-dom'; +import Home from '../pages/Home'; +import BootstrapLayout from '../components/Layout'; + +// Routes configuration object +const routes = [ + { + path: '/', + element: , + }, + { + path: '/creator-discovery', + element: , + }, + { + path: '/creator-database', + children: [ + { + path: '', + element: , + }, + { + path: 'tiktok', + element: , + }, + { + path: 'instagram', + element: , + }, + { + path: 'youtube', + element: , + }, + ], + }, + { + path: '/private-creators/*', + element: , + }, + { + path: '/deep-analysis', + element: , + }, + { + path: '/brands', + element: , + }, + { + path: '/creator-inbox/*', + element: , + }, + { + path: '/settings', + element: , + }, +]; + +// Create router with routes wrapped in the layout +const router = createBrowserRouter([ + { + path: '/', + element: , + children: routes, + }, +]); + +export default function Router() { + return ; +} + +export { routes }; diff --git a/src/services/api.js b/src/services/api.js deleted file mode 100644 index 5503d32..0000000 --- a/src/services/api.js +++ /dev/null @@ -1,55 +0,0 @@ -import axios from 'axios'; - -const API_URL = 'https://api.example.com'; // Replace with your actual API URL - -const apiClient = axios.create({ - baseURL: API_URL, - headers: { - 'Content-Type': 'application/json', - }, -}); - -// Add request interceptor for authentication -apiClient.interceptors.request.use( - (config) => { - const token = localStorage.getItem('token'); - if (token) { - config.headers.Authorization = `Bearer ${token}`; - } - return config; - }, - (error) => { - return Promise.reject(error); - } -); - -// Add response interceptor for error handling -apiClient.interceptors.response.use( - (response) => response, - (error) => { - // Handle common errors here - if (error.response && error.response.status === 401) { - // Handle unauthorized access - localStorage.removeItem('token'); - // Redirect to login or show notification - } - return Promise.reject(error); - } -); - -// Example API methods -export const userService = { - login: (credentials) => apiClient.post('/auth/login', credentials), - register: (userData) => apiClient.post('/auth/register', userData), - getProfile: () => apiClient.get('/user/profile'), -}; - -export const contentService = { - getItems: (params) => apiClient.get('/items', { params }), - getItemById: (id) => apiClient.get(`/items/${id}`), - createItem: (data) => apiClient.post('/items', data), - updateItem: (id, data) => apiClient.put(`/items/${id}`, data), - deleteItem: (id) => apiClient.delete(`/items/${id}`), -}; - -export default apiClient; diff --git a/src/store/counterSlice.js b/src/store/counterSlice.js deleted file mode 100644 index 648f7f1..0000000 --- a/src/store/counterSlice.js +++ /dev/null @@ -1,25 +0,0 @@ -import { createSlice } from '@reduxjs/toolkit'; - -const initialState = { - value: 0, -}; - -export const counterSlice = createSlice({ - name: 'counter', - initialState, - reducers: { - increment: (state) => { - state.value += 1; - }, - decrement: (state) => { - state.value -= 1; - }, - incrementByAmount: (state, action) => { - state.value += action.payload; - }, - }, -}); - -export const { increment, decrement, incrementByAmount } = counterSlice.actions; - -export default counterSlice.reducer; \ No newline at end of file diff --git a/src/store/index.js b/src/store/index.js deleted file mode 100644 index 4317e48..0000000 --- a/src/store/index.js +++ /dev/null @@ -1,21 +0,0 @@ -import { configureStore } from '@reduxjs/toolkit'; -import { setupListeners } from '@reduxjs/toolkit/query'; - -// Import reducers -import counterReducer from './counterSlice'; - -export const store = configureStore({ - reducer: { - // Add reducers here - counter: counterReducer, - }, - middleware: (getDefaultMiddleware) => - getDefaultMiddleware().concat([ - // Add middleware here if needed - ]), -}); - -// Enable refetchOnFocus and refetchOnReconnect behaviors -setupListeners(store.dispatch); - -export default store; diff --git a/src/styles/custom-theme.scss b/src/styles/custom-theme.scss new file mode 100644 index 0000000..7e8859e --- /dev/null +++ b/src/styles/custom-theme.scss @@ -0,0 +1,34 @@ +// 在引入Bootstrap前自定义变量 + +// 主题颜色 - 根据需要修改这些值 +$primary: #6366f1; // 靛蓝色 (Indigo) +$secondary: #6c757d; // 灰色 +$success: #198754; // 绿色 +$info: #0dcaf0; // 浅蓝色 +$warning: #ffc107; // 黄色 +$danger: #dc3545; // 红色 +$light: #f8f9fa; // 浅色 +$dark: #212529; // 深色 + +$indigo-50: #eef2ff; +$indigo-100: #e0e7ff; +$indigo-500: #6366f1; +$violet-50: #f5f3ff; +$violet-100: #ede9fe; +$neutral-600: #525252; +$zinc-600: #52525b; +// 字体 +$font-family-sans-serif: 'Open Sans', -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, + sans-serif; +$font-size-base: 1rem; + +// 其他自定义 +$border-radius: 0.375rem; +$box-shadow: 0 0.125rem 0.25rem rgba(0, 0, 0, 0.075); + +// 导入Bootstrap +@import 'bootstrap/scss/bootstrap'; + +#root { + background-color: #f5f3ff; +} diff --git a/src/styles/sidebar.scss b/src/styles/sidebar.scss new file mode 100644 index 0000000..ca81003 --- /dev/null +++ b/src/styles/sidebar.scss @@ -0,0 +1,142 @@ +@import 'custom-theme.scss'; + +.sidebar { + width: 220px; + min-height: 100vh; + position: fixed; + left: 0; + top: 0; + bottom: 0; + box-shadow: none; + z-index: 1000; + transition: all 0.3s ease; + overflow-y: auto; + background: $violet-50; + + .sidebar-header { + } + + .sidebar-nav { + padding: 1rem 0; + + .nav-link { + padding: 0.75rem 1rem; + color: $zinc-600; // neutral-600 + font-size: 1rem; + border-radius: 0; + display: flex; + align-items: center; + text-decoration: none; + font-weight: 500; + + &:hover { + text-decoration: none; + color: var(--bs-primary); + background-color: rgba(var(--bs-primary-rgb), 0.05); + } + + &.active { + color: var(--bs-primary); + font-weight: 600; + border-left: 4px solid var(--bs-primary); + } + + .sidebar-icon { + display: flex; + align-items: center; + justify-content: center; + } + } + } + + .sidebar-accordion { + width: 100%; + + .accordion-item { + background-color: transparent; + } + + .accordion-header { + .accordion-button { + padding: 0.75rem 1rem; + background-color: transparent; + color: $zinc-600; // neutral-600 + font-size: 1rem; + box-shadow: none; + font-weight: 500; + + &:not(.collapsed) { + color: var(--bs-primary); + background-color: rgba(var(--bs-primary-rgb), 0.05); + font-weight: 500; + } + &:hover { + color: var(--bs-primary); + background-color: rgba(var(--bs-primary-rgb), 0.05); + } + &:focus { + box-shadow: none; + border-color: transparent; + } + + &::after { + width: 1rem; + height: 1rem; + background-size: 1rem; + } + + &.active { + font-weight: 600; + color: var(--bs-primary); + } + } + } + + .sidebar-submenu { + .nav-link { + padding: 0.5rem 1rem; + padding-left: 2rem; + } + } + } +} + +// Adjust main content when sidebar is present +.main-content { + padding: 1rem; + margin: 1rem; + margin-left: 220px; + height: 100vh; + transition: all 0.3s ease; + background: #f8f9fa; + border-radius: 8px; +} + +// Responsive sidebar for mobile +@media (max-width: 768px) { + .sidebar { + width: 0; + overflow: hidden; + + &.show { + width: 250px; + } + } + + .main-content { + margin-left: 0; + } +} + +// Toggle button for mobile +.sidebar-toggle { + position: fixed; + top: 1rem; + left: 1rem; + z-index: 1100; + display: none; + + @media (max-width: 768px) { + display: block; + } +} diff --git a/vite.config.js b/vite.config.js index 8b0f57b..e9091eb 100644 --- a/vite.config.js +++ b/vite.config.js @@ -1,7 +1,13 @@ -import { defineConfig } from 'vite' -import react from '@vitejs/plugin-react' +import { defineConfig } from 'vite'; +import react from '@vitejs/plugin-react'; +import path from 'path'; // https://vite.dev/config/ export default defineConfig({ - plugins: [react()], -}) + plugins: [react()], + resolve: { + alias: { + '@': path.resolve(__dirname, './src'), + }, + }, +});