From 32663e63249792ad2d046da50d1456815e1bfcea Mon Sep 17 00:00:00 2001 From: dmolinari Date: Thu, 18 Dec 2025 13:32:50 -0300 Subject: [PATCH] CheckPoint: Avances Varios --- frontend/admin-panel/package-lock.json | 587 ++- frontend/admin-panel/package.json | 1 + frontend/admin-panel/postcss.config.js | 2 +- frontend/admin-panel/public/vite.svg | 1 - frontend/admin-panel/src/App.tsx | 6 + frontend/admin-panel/src/index.css | 8 +- .../src/layouts/ProtectedLayout.tsx | 58 +- .../src/pages/Categories/CategoryManager.tsx | 97 +- .../src/pages/Categories/OperationManager.tsx | 2 +- .../src/pages/Diagram/DiagramPage.tsx | 72 + .../src/pages/Pricing/PricingManager.tsx | 142 + .../src/pages/Pricing/PromotionsManager.tsx | 232 + .../src/pages/Users/UserManager.tsx | 27 +- frontend/admin-panel/src/services/api.ts | 4 +- .../src/services/attributeService.ts | 2 +- .../src/services/categoryService.ts | 2 +- .../admin-panel/src/services/exportService.ts | 20 + .../src/services/operationService.ts | 2 +- .../admin-panel/src/services/userService.ts | 22 +- frontend/counter-panel/.gitignore | 24 + frontend/counter-panel/README.md | 73 + frontend/counter-panel/eslint.config.js | 23 + frontend/counter-panel/index.html | 13 + frontend/counter-panel/package-lock.json | 4290 +++++++++++++++++ frontend/counter-panel/package.json | 40 + frontend/counter-panel/postcss.config.js | 6 + frontend/counter-panel/src/App.css | 42 + frontend/counter-panel/src/App.tsx | 19 + .../src/assets/react.svg | 0 .../counter-panel/src/hooks/useDebounce.ts | 24 + frontend/counter-panel/src/index.css | 18 + .../src/layouts/CounterLayout.tsx | 76 + frontend/counter-panel/src/main.tsx | 10 + .../src/pages/CashRegisterPage.tsx | 39 + .../counter-panel/src/pages/FastEntryPage.tsx | 385 ++ frontend/counter-panel/src/services/api.ts | 15 + frontend/counter-panel/tsconfig.app.json | 28 + frontend/counter-panel/tsconfig.json | 7 + frontend/counter-panel/tsconfig.node.json | 26 + frontend/counter-panel/vite.config.ts | 7 + frontend/public-web/.gitignore | 24 + frontend/public-web/README.md | 73 + frontend/public-web/eslint.config.js | 23 + frontend/public-web/index.html | 13 + frontend/public-web/package-lock.json | 4246 ++++++++++++++++ frontend/public-web/package.json | 40 + frontend/public-web/postcss.config.js | 6 + frontend/public-web/src/App.css | 42 + frontend/public-web/src/App.tsx | 42 + .../public-web/src/components/ListingCard.tsx | 45 + .../public-web/src/components/SearchBar.tsx | 35 + frontend/public-web/src/index.css | 17 + frontend/public-web/src/main.tsx | 10 + frontend/public-web/src/pages/HomePage.tsx | 94 + .../src/pages/ListingDetailPage.tsx | 118 + frontend/public-web/src/services/api.ts | 7 + .../public-web/src/services/publicService.ts | 26 + frontend/public-web/src/types/index.ts | 41 + frontend/public-web/tailwind.config.js | 24 + frontend/public-web/tsconfig.app.json | 28 + frontend/public-web/tsconfig.json | 7 + frontend/public-web/tsconfig.node.json | 26 + frontend/public-web/vite.config.ts | 7 + frontend/publish-wizard/package-lock.json | 587 ++- frontend/publish-wizard/package.json | 1 + frontend/publish-wizard/postcss.config.js | 2 +- frontend/publish-wizard/public/vite.svg | 1 - frontend/publish-wizard/src/assets/react.svg | 1 - frontend/publish-wizard/src/index.css | 13 +- frontend/publish-wizard/src/services/api.ts | 4 +- .../Controllers/ExportsController.cs | 52 + src/SIGCM.API/Controllers/ImagesController.cs | 32 +- .../Controllers/ListingsController.cs | 27 +- .../Controllers/PricingController.cs | 88 + src/SIGCM.API/Controllers/UsersController.cs | 2 +- src/SIGCM.API/Program.cs | 49 +- .../a174fb99-a710-4512-a1fd-67fa22ffded2.jpg | Bin 0 -> 183690 bytes src/SIGCM.Application/Class1.cs | 6 - src/SIGCM.Application/DTOs/ListingDtos.cs | 30 +- src/SIGCM.Application/DTOs/PricingDtos.cs | 24 + src/SIGCM.Domain/Class1.cs | 6 - src/SIGCM.Domain/Entities/CategoryPricing.cs | 14 + src/SIGCM.Domain/Entities/Listing.cs | 19 +- src/SIGCM.Domain/Entities/Promotion.cs | 13 + .../Interfaces/IListingRepository.cs | 6 +- src/SIGCM.Domain/Models/ListingDetail.cs | 15 + src/SIGCM.Infrastructure/Class1.cs | 6 - .../Data/DbInitializer.cs | 73 +- .../DependencyInjection.cs | 7 +- .../Repositories/ListingRepository.cs | 95 +- .../Repositories/PricingRepository.cs | 94 + .../Services/PricingService.cs | 111 + 92 files changed, 12629 insertions(+), 195 deletions(-) delete mode 100644 frontend/admin-panel/public/vite.svg create mode 100644 frontend/admin-panel/src/pages/Diagram/DiagramPage.tsx create mode 100644 frontend/admin-panel/src/pages/Pricing/PricingManager.tsx create mode 100644 frontend/admin-panel/src/pages/Pricing/PromotionsManager.tsx create mode 100644 frontend/admin-panel/src/services/exportService.ts create mode 100644 frontend/counter-panel/.gitignore create mode 100644 frontend/counter-panel/README.md create mode 100644 frontend/counter-panel/eslint.config.js create mode 100644 frontend/counter-panel/index.html create mode 100644 frontend/counter-panel/package-lock.json create mode 100644 frontend/counter-panel/package.json create mode 100644 frontend/counter-panel/postcss.config.js create mode 100644 frontend/counter-panel/src/App.css create mode 100644 frontend/counter-panel/src/App.tsx rename frontend/{admin-panel => counter-panel}/src/assets/react.svg (100%) create mode 100644 frontend/counter-panel/src/hooks/useDebounce.ts create mode 100644 frontend/counter-panel/src/index.css create mode 100644 frontend/counter-panel/src/layouts/CounterLayout.tsx create mode 100644 frontend/counter-panel/src/main.tsx create mode 100644 frontend/counter-panel/src/pages/CashRegisterPage.tsx create mode 100644 frontend/counter-panel/src/pages/FastEntryPage.tsx create mode 100644 frontend/counter-panel/src/services/api.ts create mode 100644 frontend/counter-panel/tsconfig.app.json create mode 100644 frontend/counter-panel/tsconfig.json create mode 100644 frontend/counter-panel/tsconfig.node.json create mode 100644 frontend/counter-panel/vite.config.ts create mode 100644 frontend/public-web/.gitignore create mode 100644 frontend/public-web/README.md create mode 100644 frontend/public-web/eslint.config.js create mode 100644 frontend/public-web/index.html create mode 100644 frontend/public-web/package-lock.json create mode 100644 frontend/public-web/package.json create mode 100644 frontend/public-web/postcss.config.js create mode 100644 frontend/public-web/src/App.css create mode 100644 frontend/public-web/src/App.tsx create mode 100644 frontend/public-web/src/components/ListingCard.tsx create mode 100644 frontend/public-web/src/components/SearchBar.tsx create mode 100644 frontend/public-web/src/index.css create mode 100644 frontend/public-web/src/main.tsx create mode 100644 frontend/public-web/src/pages/HomePage.tsx create mode 100644 frontend/public-web/src/pages/ListingDetailPage.tsx create mode 100644 frontend/public-web/src/services/api.ts create mode 100644 frontend/public-web/src/services/publicService.ts create mode 100644 frontend/public-web/src/types/index.ts create mode 100644 frontend/public-web/tailwind.config.js create mode 100644 frontend/public-web/tsconfig.app.json create mode 100644 frontend/public-web/tsconfig.json create mode 100644 frontend/public-web/tsconfig.node.json create mode 100644 frontend/public-web/vite.config.ts delete mode 100644 frontend/publish-wizard/public/vite.svg delete mode 100644 frontend/publish-wizard/src/assets/react.svg create mode 100644 src/SIGCM.API/Controllers/ExportsController.cs create mode 100644 src/SIGCM.API/Controllers/PricingController.cs create mode 100644 src/SIGCM.API/wwwroot/uploads/listings/2/a174fb99-a710-4512-a1fd-67fa22ffded2.jpg delete mode 100644 src/SIGCM.Application/Class1.cs create mode 100644 src/SIGCM.Application/DTOs/PricingDtos.cs delete mode 100644 src/SIGCM.Domain/Class1.cs create mode 100644 src/SIGCM.Domain/Entities/CategoryPricing.cs create mode 100644 src/SIGCM.Domain/Entities/Promotion.cs create mode 100644 src/SIGCM.Domain/Models/ListingDetail.cs delete mode 100644 src/SIGCM.Infrastructure/Class1.cs create mode 100644 src/SIGCM.Infrastructure/Repositories/PricingRepository.cs create mode 100644 src/SIGCM.Infrastructure/Services/PricingService.cs diff --git a/frontend/admin-panel/package-lock.json b/frontend/admin-panel/package-lock.json index f2e13a5..da1dced 100644 --- a/frontend/admin-panel/package-lock.json +++ b/frontend/admin-panel/package-lock.json @@ -8,6 +8,7 @@ "name": "admin-panel", "version": "0.0.0", "dependencies": { + "@tailwindcss/postcss": "^4.1.18", "axios": "^1.13.2", "clsx": "^2.1.1", "lucide-react": "^0.561.0", @@ -35,6 +36,18 @@ "vite": "^7.2.4" } }, + "node_modules/@alloc/quick-lru": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@alloc/quick-lru/-/quick-lru-5.2.0.tgz", + "integrity": "sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/@babel/code-frame": { "version": "7.27.1", "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.27.1.tgz", @@ -972,7 +985,6 @@ "version": "0.3.13", "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", - "dev": true, "license": "MIT", "dependencies": { "@jridgewell/sourcemap-codec": "^1.5.0", @@ -983,7 +995,6 @@ "version": "2.3.5", "resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz", "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==", - "dev": true, "license": "MIT", "dependencies": { "@jridgewell/gen-mapping": "^0.3.5", @@ -994,7 +1005,6 @@ "version": "3.1.2", "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", - "dev": true, "license": "MIT", "engines": { "node": ">=6.0.0" @@ -1004,14 +1014,12 @@ "version": "1.5.5", "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", - "dev": true, "license": "MIT" }, "node_modules/@jridgewell/trace-mapping": { "version": "0.3.31", "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", - "dev": true, "license": "MIT", "dependencies": { "@jridgewell/resolve-uri": "^3.1.0", @@ -1333,6 +1341,262 @@ "win32" ] }, + "node_modules/@tailwindcss/node": { + "version": "4.1.18", + "resolved": "https://registry.npmjs.org/@tailwindcss/node/-/node-4.1.18.tgz", + "integrity": "sha512-DoR7U1P7iYhw16qJ49fgXUlry1t4CpXeErJHnQ44JgTSKMaZUdf17cfn5mHchfJ4KRBZRFA/Coo+MUF5+gOaCQ==", + "license": "MIT", + "dependencies": { + "@jridgewell/remapping": "^2.3.4", + "enhanced-resolve": "^5.18.3", + "jiti": "^2.6.1", + "lightningcss": "1.30.2", + "magic-string": "^0.30.21", + "source-map-js": "^1.2.1", + "tailwindcss": "4.1.18" + } + }, + "node_modules/@tailwindcss/oxide": { + "version": "4.1.18", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide/-/oxide-4.1.18.tgz", + "integrity": "sha512-EgCR5tTS5bUSKQgzeMClT6iCY3ToqE1y+ZB0AKldj809QXk1Y+3jB0upOYZrn9aGIzPtUsP7sX4QQ4XtjBB95A==", + "license": "MIT", + "engines": { + "node": ">= 10" + }, + "optionalDependencies": { + "@tailwindcss/oxide-android-arm64": "4.1.18", + "@tailwindcss/oxide-darwin-arm64": "4.1.18", + "@tailwindcss/oxide-darwin-x64": "4.1.18", + "@tailwindcss/oxide-freebsd-x64": "4.1.18", + "@tailwindcss/oxide-linux-arm-gnueabihf": "4.1.18", + "@tailwindcss/oxide-linux-arm64-gnu": "4.1.18", + "@tailwindcss/oxide-linux-arm64-musl": "4.1.18", + "@tailwindcss/oxide-linux-x64-gnu": "4.1.18", + "@tailwindcss/oxide-linux-x64-musl": "4.1.18", + "@tailwindcss/oxide-wasm32-wasi": "4.1.18", + "@tailwindcss/oxide-win32-arm64-msvc": "4.1.18", + "@tailwindcss/oxide-win32-x64-msvc": "4.1.18" + } + }, + "node_modules/@tailwindcss/oxide-android-arm64": { + "version": "4.1.18", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-android-arm64/-/oxide-android-arm64-4.1.18.tgz", + "integrity": "sha512-dJHz7+Ugr9U/diKJA0W6N/6/cjI+ZTAoxPf9Iz9BFRF2GzEX8IvXxFIi/dZBloVJX/MZGvRuFA9rqwdiIEZQ0Q==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-darwin-arm64": { + "version": "4.1.18", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-arm64/-/oxide-darwin-arm64-4.1.18.tgz", + "integrity": "sha512-Gc2q4Qhs660bhjyBSKgq6BYvwDz4G+BuyJ5H1xfhmDR3D8HnHCmT/BSkvSL0vQLy/nkMLY20PQ2OoYMO15Jd0A==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-darwin-x64": { + "version": "4.1.18", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-x64/-/oxide-darwin-x64-4.1.18.tgz", + "integrity": "sha512-FL5oxr2xQsFrc3X9o1fjHKBYBMD1QZNyc1Xzw/h5Qu4XnEBi3dZn96HcHm41c/euGV+GRiXFfh2hUCyKi/e+yw==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-freebsd-x64": { + "version": "4.1.18", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-freebsd-x64/-/oxide-freebsd-x64-4.1.18.tgz", + "integrity": "sha512-Fj+RHgu5bDodmV1dM9yAxlfJwkkWvLiRjbhuO2LEtwtlYlBgiAT4x/j5wQr1tC3SANAgD+0YcmWVrj8R9trVMA==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-linux-arm-gnueabihf": { + "version": "4.1.18", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm-gnueabihf/-/oxide-linux-arm-gnueabihf-4.1.18.tgz", + "integrity": "sha512-Fp+Wzk/Ws4dZn+LV2Nqx3IilnhH51YZoRaYHQsVq3RQvEl+71VGKFpkfHrLM/Li+kt5c0DJe/bHXK1eHgDmdiA==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-linux-arm64-gnu": { + "version": "4.1.18", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-gnu/-/oxide-linux-arm64-gnu-4.1.18.tgz", + "integrity": "sha512-S0n3jboLysNbh55Vrt7pk9wgpyTTPD0fdQeh7wQfMqLPM/Hrxi+dVsLsPrycQjGKEQk85Kgbx+6+QnYNiHalnw==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-linux-arm64-musl": { + "version": "4.1.18", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-musl/-/oxide-linux-arm64-musl-4.1.18.tgz", + "integrity": "sha512-1px92582HkPQlaaCkdRcio71p8bc8i/ap5807tPRDK/uw953cauQBT8c5tVGkOwrHMfc2Yh6UuxaH4vtTjGvHg==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-linux-x64-gnu": { + "version": "4.1.18", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-gnu/-/oxide-linux-x64-gnu-4.1.18.tgz", + "integrity": "sha512-v3gyT0ivkfBLoZGF9LyHmts0Isc8jHZyVcbzio6Wpzifg/+5ZJpDiRiUhDLkcr7f/r38SWNe7ucxmGW3j3Kb/g==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-linux-x64-musl": { + "version": "4.1.18", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-musl/-/oxide-linux-x64-musl-4.1.18.tgz", + "integrity": "sha512-bhJ2y2OQNlcRwwgOAGMY0xTFStt4/wyU6pvI6LSuZpRgKQwxTec0/3Scu91O8ir7qCR3AuepQKLU/kX99FouqQ==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-wasm32-wasi": { + "version": "4.1.18", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-wasm32-wasi/-/oxide-wasm32-wasi-4.1.18.tgz", + "integrity": "sha512-LffYTvPjODiP6PT16oNeUQJzNVyJl1cjIebq/rWWBF+3eDst5JGEFSc5cWxyRCJ0Mxl+KyIkqRxk1XPEs9x8TA==", + "bundleDependencies": [ + "@napi-rs/wasm-runtime", + "@emnapi/core", + "@emnapi/runtime", + "@tybys/wasm-util", + "@emnapi/wasi-threads", + "tslib" + ], + "cpu": [ + "wasm32" + ], + "license": "MIT", + "optional": true, + "dependencies": { + "@emnapi/core": "^1.7.1", + "@emnapi/runtime": "^1.7.1", + "@emnapi/wasi-threads": "^1.1.0", + "@napi-rs/wasm-runtime": "^1.1.0", + "@tybys/wasm-util": "^0.10.1", + "tslib": "^2.4.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@tailwindcss/oxide-win32-arm64-msvc": { + "version": "4.1.18", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-arm64-msvc/-/oxide-win32-arm64-msvc-4.1.18.tgz", + "integrity": "sha512-HjSA7mr9HmC8fu6bdsZvZ+dhjyGCLdotjVOgLA2vEqxEBZaQo9YTX4kwgEvPCpRh8o4uWc4J/wEoFzhEmjvPbA==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-win32-x64-msvc": { + "version": "4.1.18", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-x64-msvc/-/oxide-win32-x64-msvc-4.1.18.tgz", + "integrity": "sha512-bJWbyYpUlqamC8dpR7pfjA0I7vdF6t5VpUGMWRkXVE3AXgIZjYUYAK7II1GNaxR8J1SSrSrppRar8G++JekE3Q==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/postcss": { + "version": "4.1.18", + "resolved": "https://registry.npmjs.org/@tailwindcss/postcss/-/postcss-4.1.18.tgz", + "integrity": "sha512-Ce0GFnzAOuPyfV5SxjXGn0CubwGcuDB0zcdaPuCSzAa/2vII24JTkH+I6jcbXLb1ctjZMZZI6OjDaLPJQL1S0g==", + "license": "MIT", + "dependencies": { + "@alloc/quick-lru": "^5.2.0", + "@tailwindcss/node": "4.1.18", + "@tailwindcss/oxide": "4.1.18", + "postcss": "^8.4.41", + "tailwindcss": "4.1.18" + } + }, "node_modules/@types/babel__core": { "version": "7.20.5", "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz", @@ -2076,6 +2340,15 @@ "node": ">=0.4.0" } }, + "node_modules/detect-libc": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz", + "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==", + "license": "Apache-2.0", + "engines": { + "node": ">=8" + } + }, "node_modules/dunder-proto": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", @@ -2097,6 +2370,19 @@ "dev": true, "license": "ISC" }, + "node_modules/enhanced-resolve": { + "version": "5.18.4", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.18.4.tgz", + "integrity": "sha512-LgQMM4WXU3QI+SYgEc2liRgznaD5ojbmY3sb8LxyguVkIg5FxdpTkvk72te2R38/TGKxH634oLxXRGY6d7AP+Q==", + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.4", + "tapable": "^2.2.0" + }, + "engines": { + "node": ">=10.13.0" + } + }, "node_modules/es-define-property": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", @@ -2640,6 +2926,12 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "license": "ISC" + }, "node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", @@ -2773,6 +3065,15 @@ "dev": true, "license": "ISC" }, + "node_modules/jiti": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-2.6.1.tgz", + "integrity": "sha512-ekilCSN1jwRvIbgeg/57YFh8qQDNbwDb9xT/qu2DAHbFFZUicIl4ygVaAvzveMhMVr3LnpSKTNnwt8PoOfmKhQ==", + "license": "MIT", + "bin": { + "jiti": "lib/jiti-cli.mjs" + } + }, "node_modules/js-tokens": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", @@ -2864,6 +3165,255 @@ "node": ">= 0.8.0" } }, + "node_modules/lightningcss": { + "version": "1.30.2", + "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.30.2.tgz", + "integrity": "sha512-utfs7Pr5uJyyvDETitgsaqSyjCb2qNRAtuqUeWIAKztsOYdcACf2KtARYXg2pSvhkt+9NfoaNY7fxjl6nuMjIQ==", + "license": "MPL-2.0", + "dependencies": { + "detect-libc": "^2.0.3" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "optionalDependencies": { + "lightningcss-android-arm64": "1.30.2", + "lightningcss-darwin-arm64": "1.30.2", + "lightningcss-darwin-x64": "1.30.2", + "lightningcss-freebsd-x64": "1.30.2", + "lightningcss-linux-arm-gnueabihf": "1.30.2", + "lightningcss-linux-arm64-gnu": "1.30.2", + "lightningcss-linux-arm64-musl": "1.30.2", + "lightningcss-linux-x64-gnu": "1.30.2", + "lightningcss-linux-x64-musl": "1.30.2", + "lightningcss-win32-arm64-msvc": "1.30.2", + "lightningcss-win32-x64-msvc": "1.30.2" + } + }, + "node_modules/lightningcss-android-arm64": { + "version": "1.30.2", + "resolved": "https://registry.npmjs.org/lightningcss-android-arm64/-/lightningcss-android-arm64-1.30.2.tgz", + "integrity": "sha512-BH9sEdOCahSgmkVhBLeU7Hc9DWeZ1Eb6wNS6Da8igvUwAe0sqROHddIlvU06q3WyXVEOYDZ6ykBZQnjTbmo4+A==", + "cpu": [ + "arm64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-darwin-arm64": { + "version": "1.30.2", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.30.2.tgz", + "integrity": "sha512-ylTcDJBN3Hp21TdhRT5zBOIi73P6/W0qwvlFEk22fkdXchtNTOU4Qc37SkzV+EKYxLouZ6M4LG9NfZ1qkhhBWA==", + "cpu": [ + "arm64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-darwin-x64": { + "version": "1.30.2", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.30.2.tgz", + "integrity": "sha512-oBZgKchomuDYxr7ilwLcyms6BCyLn0z8J0+ZZmfpjwg9fRVZIR5/GMXd7r9RH94iDhld3UmSjBM6nXWM2TfZTQ==", + "cpu": [ + "x64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-freebsd-x64": { + "version": "1.30.2", + "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.30.2.tgz", + "integrity": "sha512-c2bH6xTrf4BDpK8MoGG4Bd6zAMZDAXS569UxCAGcA7IKbHNMlhGQ89eRmvpIUGfKWNVdbhSbkQaWhEoMGmGslA==", + "cpu": [ + "x64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm-gnueabihf": { + "version": "1.30.2", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.30.2.tgz", + "integrity": "sha512-eVdpxh4wYcm0PofJIZVuYuLiqBIakQ9uFZmipf6LF/HRj5Bgm0eb3qL/mr1smyXIS1twwOxNWndd8z0E374hiA==", + "cpu": [ + "arm" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm64-gnu": { + "version": "1.30.2", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.30.2.tgz", + "integrity": "sha512-UK65WJAbwIJbiBFXpxrbTNArtfuznvxAJw4Q2ZGlU8kPeDIWEX1dg3rn2veBVUylA2Ezg89ktszWbaQnxD/e3A==", + "cpu": [ + "arm64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm64-musl": { + "version": "1.30.2", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.30.2.tgz", + "integrity": "sha512-5Vh9dGeblpTxWHpOx8iauV02popZDsCYMPIgiuw97OJ5uaDsL86cnqSFs5LZkG3ghHoX5isLgWzMs+eD1YzrnA==", + "cpu": [ + "arm64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-x64-gnu": { + "version": "1.30.2", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.30.2.tgz", + "integrity": "sha512-Cfd46gdmj1vQ+lR6VRTTadNHu6ALuw2pKR9lYq4FnhvgBc4zWY1EtZcAc6EffShbb1MFrIPfLDXD6Xprbnni4w==", + "cpu": [ + "x64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-x64-musl": { + "version": "1.30.2", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.30.2.tgz", + "integrity": "sha512-XJaLUUFXb6/QG2lGIW6aIk6jKdtjtcffUT0NKvIqhSBY3hh9Ch+1LCeH80dR9q9LBjG3ewbDjnumefsLsP6aiA==", + "cpu": [ + "x64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-win32-arm64-msvc": { + "version": "1.30.2", + "resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.30.2.tgz", + "integrity": "sha512-FZn+vaj7zLv//D/192WFFVA0RgHawIcHqLX9xuWiQt7P0PtdFEVaxgF9rjM/IRYHQXNnk61/H/gb2Ei+kUQ4xQ==", + "cpu": [ + "arm64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-win32-x64-msvc": { + "version": "1.30.2", + "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.30.2.tgz", + "integrity": "sha512-5g1yc73p+iAkid5phb4oVFMB45417DkRevRbt/El/gKXJk4jid+vPFF/AXbxn05Aky8PapwzZrdJShv5C0avjw==", + "cpu": [ + "x64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, "node_modules/locate-path": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", @@ -2906,6 +3456,15 @@ "react": "^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0" } }, + "node_modules/magic-string": { + "version": "0.30.21", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz", + "integrity": "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==", + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.5" + } + }, "node_modules/math-intrinsics": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", @@ -2960,7 +3519,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", @@ -3076,7 +3634,6 @@ "version": "1.1.1", "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", - "dev": true, "license": "ISC" }, "node_modules/picomatch": { @@ -3096,7 +3653,6 @@ "version": "8.5.6", "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.6.tgz", "integrity": "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==", - "dev": true, "funding": [ { "type": "opencollective", @@ -3324,7 +3880,6 @@ "version": "1.2.1", "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", - "dev": true, "license": "BSD-3-Clause", "engines": { "node": ">=0.10.0" @@ -3370,9 +3925,21 @@ "version": "4.1.18", "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-4.1.18.tgz", "integrity": "sha512-4+Z+0yiYyEtUVCScyfHCxOYP06L5Ne+JiHhY2IjR2KWMIWhJOYZKLSGZaP5HkZ8+bY0cxfzwDE5uOmzFXyIwxw==", - "dev": true, "license": "MIT" }, + "node_modules/tapable": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.3.0.tgz", + "integrity": "sha512-g9ljZiwki/LfxmQADO3dEY1CbpmXT5Hm2fJ+QaGKwSXUylMybePR7/67YW7jOrrvjEgL1Fmz5kzyAjWVWLlucg==", + "license": "MIT", + "engines": { + "node": ">=6" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, "node_modules/tinyglobby": { "version": "0.2.15", "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.15.tgz", diff --git a/frontend/admin-panel/package.json b/frontend/admin-panel/package.json index c866fec..958533b 100644 --- a/frontend/admin-panel/package.json +++ b/frontend/admin-panel/package.json @@ -10,6 +10,7 @@ "preview": "vite preview" }, "dependencies": { + "@tailwindcss/postcss": "^4.1.18", "axios": "^1.13.2", "clsx": "^2.1.1", "lucide-react": "^0.561.0", diff --git a/frontend/admin-panel/postcss.config.js b/frontend/admin-panel/postcss.config.js index 2e7af2b..1c87846 100644 --- a/frontend/admin-panel/postcss.config.js +++ b/frontend/admin-panel/postcss.config.js @@ -1,6 +1,6 @@ export default { plugins: { - tailwindcss: {}, + '@tailwindcss/postcss': {}, autoprefixer: {}, }, } diff --git a/frontend/admin-panel/public/vite.svg b/frontend/admin-panel/public/vite.svg deleted file mode 100644 index e7b8dfb..0000000 --- a/frontend/admin-panel/public/vite.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/frontend/admin-panel/src/App.tsx b/frontend/admin-panel/src/App.tsx index 3492f54..dc574a3 100644 --- a/frontend/admin-panel/src/App.tsx +++ b/frontend/admin-panel/src/App.tsx @@ -5,6 +5,9 @@ import ProtectedLayout from './layouts/ProtectedLayout'; import CategoryManager from './pages/Categories/CategoryManager'; import UserManager from './pages/Users/UserManager'; +import DiagramPage from './pages/Diagram/DiagramPage'; +import PricingManager from './pages/Pricing/PricingManager'; +import PromotionsManager from './pages/Pricing/PromotionsManager'; function App() { return ( @@ -16,6 +19,9 @@ function App() { } /> } /> } /> + } /> + } /> + } /> diff --git a/frontend/admin-panel/src/index.css b/frontend/admin-panel/src/index.css index b5c61c9..c64b66c 100644 --- a/frontend/admin-panel/src/index.css +++ b/frontend/admin-panel/src/index.css @@ -1,3 +1,5 @@ -@tailwind base; -@tailwind components; -@tailwind utilities; +@import "tailwindcss"; + +@theme { + /* Aquí puedes definir tus variables si las necesitas */ +} \ No newline at end of file diff --git a/frontend/admin-panel/src/layouts/ProtectedLayout.tsx b/frontend/admin-panel/src/layouts/ProtectedLayout.tsx index 5e80d7c..6a8bfd4 100644 --- a/frontend/admin-panel/src/layouts/ProtectedLayout.tsx +++ b/frontend/admin-panel/src/layouts/ProtectedLayout.tsx @@ -1,6 +1,6 @@ import { Navigate, Outlet } from 'react-router-dom'; import { useAuthStore } from '../store/authStore'; -import { LogOut } from 'lucide-react'; +import { LogOut, LayoutDashboard, FolderTree, Users, FileText, DollarSign, Percent } from 'lucide-react'; export default function ProtectedLayout() { const { isAuthenticated, logout } = useAuthStore(); @@ -11,28 +11,58 @@ export default function ProtectedLayout() { return (
- {/* Sidebar minimalista por ahora */} -
+ + {/* Attributes Configuration Modal (ESTO FALTABA EN EL JSX) */} + setIsAttrModalOpen(false)} + title={`Atributos de: ${configuringCategory?.name}`} + > +
+ {/* List Existing Attributes */} +
+

Atributos Actuales

+ {attributes.length === 0 ? ( +

No hay atributos definidos.

+ ) : ( +
+ {attributes.map(attr => ( +
+
+ {attr.name} + ({attr.dataType}) + {attr.required && *Req} +
+ +
+ ))} +
+ )} +
+ + {/* Add New Attribute Form */} +
+

Agregar Atributo

+
+ setNewAttrData({ ...newAttrData, name: e.target.value })} + required + /> + +
+
+ + +
+
+
+
); - -} +} \ No newline at end of file diff --git a/frontend/admin-panel/src/pages/Categories/OperationManager.tsx b/frontend/admin-panel/src/pages/Categories/OperationManager.tsx index d2ea6d1..13058e4 100644 --- a/frontend/admin-panel/src/pages/Categories/OperationManager.tsx +++ b/frontend/admin-panel/src/pages/Categories/OperationManager.tsx @@ -1,5 +1,5 @@ import { useState, useEffect } from 'react'; -import { type Operation } from '../../types/Operation'; // ID: type-import-fix +import { type Operation } from '../../types/Operation'; import { operationService } from '../../services/operationService'; import { Plus, Trash2 } from 'lucide-react'; diff --git a/frontend/admin-panel/src/pages/Diagram/DiagramPage.tsx b/frontend/admin-panel/src/pages/Diagram/DiagramPage.tsx new file mode 100644 index 0000000..5ae41ce --- /dev/null +++ b/frontend/admin-panel/src/pages/Diagram/DiagramPage.tsx @@ -0,0 +1,72 @@ +import { useState } from 'react'; +import { exportService } from '../../services/exportService'; +import { FileText, Download, Calendar } from 'lucide-react'; + +export default function DiagramPage() { + // Fecha por defecto: Mañana + const tomorrow = new Date(); + tomorrow.setDate(tomorrow.getDate() + 1); + const [date, setDate] = useState(tomorrow.toISOString().split('T')[0]); + const [loading, setLoading] = useState(false); + + const handleDownload = async () => { + setLoading(true); + try { + await exportService.downloadDiagram(date); + } catch (error) { + console.error(error); + alert('Error descargando el diagrama'); + } finally { + setLoading(false); + } + }; + + return ( +
+

+ + Módulo de Diagramación +

+ +
+

+ Seleccione la fecha de edición para generar el archivo XML de exportación. + Este archivo contiene todos los avisos activos para el día seleccionado, agrupados por rubro. +

+ +
+
+ +
+ setDate(e.target.value)} + className="w-full p-3 pl-10 border border-gray-300 rounded-lg focus:ring-2 focus:ring-blue-500 outline-none" + /> + +
+
+ + +
+ +
+ Nota: Solo se exportarán los avisos que tengan texto de impresión definido y cuyo rango de fechas cubra el día seleccionado. +
+
+
+ ); +} \ No newline at end of file diff --git a/frontend/admin-panel/src/pages/Pricing/PricingManager.tsx b/frontend/admin-panel/src/pages/Pricing/PricingManager.tsx new file mode 100644 index 0000000..2e7e719 --- /dev/null +++ b/frontend/admin-panel/src/pages/Pricing/PricingManager.tsx @@ -0,0 +1,142 @@ +import { useState, useEffect } from 'react'; +import api from '../../services/api'; +import { Save, DollarSign } from 'lucide-react'; + +interface PricingConfig { + basePrice: number; + baseWordCount: number; + extraWordPrice: number; + specialChars: string; + specialCharPrice: number; + boldSurcharge: number; + frameSurcharge: number; +} + +interface Category { id: number; name: string; } + +export default function PricingManager() { + const [categories, setCategories] = useState([]); + const [selectedCat, setSelectedCat] = useState(null); + const [config, setConfig] = useState({ + basePrice: 0, baseWordCount: 15, extraWordPrice: 0, + specialChars: '!', specialCharPrice: 0, boldSurcharge: 0, frameSurcharge: 0 + }); + const [loading, setLoading] = useState(false); + + useEffect(() => { + // Cargar categorías + api.get('/categories').then(res => setCategories(res.data)); + }, []); + + useEffect(() => { + if (selectedCat) { + // Cargar config existente + api.get(`/pricing/${selectedCat}`).then(res => { + if (res.data) setConfig(res.data); + else setConfig({ // Default si no existe + basePrice: 0, baseWordCount: 15, extraWordPrice: 0, + specialChars: '!', specialCharPrice: 0, boldSurcharge: 0, frameSurcharge: 0 + }); + }); + } + }, [selectedCat]); + + const handleSave = async () => { + if (!selectedCat) return; + setLoading(true); + try { + await api.post('/pricing', { ...config, categoryId: selectedCat }); + alert('Configuración guardada correctamente.'); + } catch (e) { + alert('Error al guardar.'); + } finally { + setLoading(false); + } + }; + + return ( +
+

+ + Gestor de Tarifas y Reglas +

+ +
+ + +
+ + {selectedCat && ( +
+

Reglas de Precio

+ +
+ {/* Tarifa Base */} +
+

Base

+
+ + setConfig({ ...config, basePrice: parseFloat(e.target.value) })} /> +
+
+ + setConfig({ ...config, baseWordCount: parseInt(e.target.value) })} /> +
+
+ + setConfig({ ...config, extraWordPrice: parseFloat(e.target.value) })} /> +
+
+ + {/* Extras y Estilos */} +
+

Extras y Recargos

+
+ + setConfig({ ...config, specialChars: e.target.value })} /> +
+
+ + setConfig({ ...config, specialCharPrice: parseFloat(e.target.value) })} /> +
+
+
+ + setConfig({ ...config, boldSurcharge: parseFloat(e.target.value) })} /> +
+
+ + setConfig({ ...config, frameSurcharge: parseFloat(e.target.value) })} /> +
+
+
+
+ +
+ +
+
+ )} +
+ ); +} \ No newline at end of file diff --git a/frontend/admin-panel/src/pages/Pricing/PromotionsManager.tsx b/frontend/admin-panel/src/pages/Pricing/PromotionsManager.tsx new file mode 100644 index 0000000..f2684d1 --- /dev/null +++ b/frontend/admin-panel/src/pages/Pricing/PromotionsManager.tsx @@ -0,0 +1,232 @@ +import { useState, useEffect } from 'react'; +import api from '../../services/api'; +import Modal from '../../components/Modal'; +import { Percent, Trash2, Plus, Edit, CalendarClock } from 'lucide-react'; + +interface Promotion { + id: number; + name: string; + categoryId: number | null; + minDays: number; + daysOfWeek: string; // "0,6" (Domingo, Sabado) + discountPercentage: number; + discountFixedAmount: number; + isActive: boolean; +} + +interface Category { id: number; name: string; } + +export default function PromotionsManager() { + const [promotions, setPromotions] = useState([]); + const [categories, setCategories] = useState([]); + const [isModalOpen, setIsModalOpen] = useState(false); + const [editingId, setEditingId] = useState(null); + + const [formData, setFormData] = useState>({ + name: '', categoryId: null, minDays: 0, daysOfWeek: '', + discountPercentage: 0, discountFixedAmount: 0, isActive: true + }); + + // Helper para días de la semana + const daysOptions = [ + { val: 1, label: 'Lun' }, { val: 2, label: 'Mar' }, { val: 3, label: 'Mié' }, + { val: 4, label: 'Jue' }, { val: 5, label: 'Vie' }, { val: 6, label: 'Sáb' }, { val: 0, label: 'Dom' } + ]; + + useEffect(() => { + loadData(); + }, []); + + const loadData = async () => { + const [promosRes, catRes] = await Promise.all([ + api.get('/pricing/promotions'), + api.get('/categories') + ]); + setPromotions(promosRes.data); + setCategories(catRes.data); + }; + + const handleEdit = (promo: Promotion) => { + setEditingId(promo.id); + setFormData(promo); + setIsModalOpen(true); + }; + + const handleCreate = () => { + setEditingId(null); + setFormData({ + name: '', categoryId: null, minDays: 0, daysOfWeek: '', + discountPercentage: 0, discountFixedAmount: 0, isActive: true + }); + setIsModalOpen(true); + }; + + const handleDelete = async (id: number) => { + if (!confirm("¿Eliminar promoción?")) return; + await api.delete(`/pricing/promotions/${id}`); + loadData(); + }; + + const handleSubmit = async (e: React.FormEvent) => { + e.preventDefault(); + + // Convertir categoryId 0 a null para el backend + const payload = { + ...formData, + categoryId: formData.categoryId === 0 ? null : formData.categoryId + }; + + try { + if (editingId) { + await api.put(`/pricing/promotions/${editingId}`, payload); + } else { + await api.post('/pricing/promotions', payload); + } + setIsModalOpen(false); + loadData(); + } catch (e) { + alert("Error al guardar"); + } + }; + + const toggleDay = (dayVal: number) => { + const current = formData.daysOfWeek ? formData.daysOfWeek.split(',').map(Number) : []; + let newDays; + if (current.includes(dayVal)) { + newDays = current.filter(d => d !== dayVal); + } else { + newDays = [...current, dayVal]; + } + setFormData({ ...formData, daysOfWeek: newDays.join(',') }); + }; + + return ( +
+
+

+ + Gestión de Promociones +

+ +
+ +
+ + + + + + + + + + + + + {promotions.map(p => ( + + + + + + + + + ))} + +
NombreRubroCondición DíasDescuentoEstadoAcciones
{p.name} + {p.categoryId ? categories.find(c => c.id === p.categoryId)?.name : 'Todos'} + + {p.minDays > 0 ? `Mínimo ${p.minDays} días` : 'Sin mínimo'} + {p.daysOfWeek && ( +
+ + {p.daysOfWeek.split(',').map(d => daysOptions.find(o => o.val === Number(d))?.label).join(', ')} +
+ )} +
+ {p.discountPercentage > 0 ? `-${p.discountPercentage}%` : `-$${p.discountFixedAmount}`} + + + {p.isActive ? 'Activa' : 'Inactiva'} + + + + +
+
+ + setIsModalOpen(false)} title={editingId ? 'Editar Promo' : 'Nueva Promo'}> +
+
+ + setFormData({ ...formData, name: e.target.value })} /> +
+ +
+
+ + +
+
+ + setFormData({ ...formData, minDays: parseInt(e.target.value) })} /> +
+
+ +
+ +
+ {daysOptions.map(day => { + const isSelected = formData.daysOfWeek?.split(',').includes(day.val.toString()); + return ( + + ) + })} +
+
+ +
+
+ + setFormData({ ...formData, discountPercentage: parseFloat(e.target.value) })} /> +
+
+ + setFormData({ ...formData, discountFixedAmount: parseFloat(e.target.value) })} /> +
+
+ +
+ setFormData({ ...formData, isActive: e.target.checked })} /> + +
+ +
+ + +
+
+
+
+ ); +} \ No newline at end of file diff --git a/frontend/admin-panel/src/pages/Users/UserManager.tsx b/frontend/admin-panel/src/pages/Users/UserManager.tsx index 5b7d88a..0554596 100644 --- a/frontend/admin-panel/src/pages/Users/UserManager.tsx +++ b/frontend/admin-panel/src/pages/Users/UserManager.tsx @@ -1,7 +1,7 @@ import { useState, useEffect } from 'react'; // @ts-ignore -import { User } from '../../types/User'; -import { userService } from '../../services/userService'; +import { type User } from '../../types/User'; +import { userService, type CreateUserDto } from '../../services/userService'; import Modal from '../../components/Modal'; import { Plus, Edit, Trash2, Shield, User as UserIcon } from 'lucide-react'; @@ -43,10 +43,9 @@ export default function UserManager() { // @ts-ignore const handleEdit = (user: User) => { setEditingId(user.id); - // Password left empty intentionally setFormData({ username: user.username, - password: '', + password: '', // Password vacío al editar role: user.role, email: user.email || '' }); @@ -66,15 +65,29 @@ export default function UserManager() { const handleSubmit = async (e: React.FormEvent) => { e.preventDefault(); try { + // Validar password obligatorio al crear + if (!editingId && !formData.password) { + alert("La contraseña es obligatoria para nuevos usuarios"); + return; + } + + const payload: CreateUserDto = { + username: formData.username, + role: formData.role, + email: formData.email, + password: formData.password || undefined // Enviar undefined si está vacío en edit + }; + if (editingId) { - await userService.update(editingId, formData); + await userService.update(editingId, payload); } else { - await userService.create(formData as any); + // En create, password es string (ya validado arriba) + await userService.create(payload as CreateUserDto); } setIsModalOpen(false); loadUsers(); } catch (error) { - alert('Error guardando usuario'); + alert('Error procesando usuario'); } }; diff --git a/frontend/admin-panel/src/services/api.ts b/frontend/admin-panel/src/services/api.ts index 670cdda..d72471a 100644 --- a/frontend/admin-panel/src/services/api.ts +++ b/frontend/admin-panel/src/services/api.ts @@ -1,7 +1,7 @@ import axios from 'axios'; const api = axios.create({ - baseURL: 'https://localhost:7034/api', // Puerto HTTPS obtenido de launchSettings.json + baseURL: import.meta.env.VITE_API_URL, // Usa la variable de entorno }); api.interceptors.request.use((config) => { @@ -12,4 +12,4 @@ api.interceptors.request.use((config) => { return config; }); -export default api; +export default api; \ No newline at end of file diff --git a/frontend/admin-panel/src/services/attributeService.ts b/frontend/admin-panel/src/services/attributeService.ts index 24e0d19..8b45403 100644 --- a/frontend/admin-panel/src/services/attributeService.ts +++ b/frontend/admin-panel/src/services/attributeService.ts @@ -1,5 +1,5 @@ import api from './api'; -import { AttributeDefinition } from '../types/AttributeDefinition'; +import { type AttributeDefinition } from '../types/AttributeDefinition'; export const attributeService = { getByCategoryId: async (categoryId: number): Promise => { diff --git a/frontend/admin-panel/src/services/categoryService.ts b/frontend/admin-panel/src/services/categoryService.ts index 4ce8782..e5d53ee 100644 --- a/frontend/admin-panel/src/services/categoryService.ts +++ b/frontend/admin-panel/src/services/categoryService.ts @@ -1,5 +1,5 @@ import api from './api'; -import { Category } from '../types/Category'; +import { type Category } from '../types/Category'; export const categoryService = { getAll: async (): Promise => { diff --git a/frontend/admin-panel/src/services/exportService.ts b/frontend/admin-panel/src/services/exportService.ts new file mode 100644 index 0000000..3aa5090 --- /dev/null +++ b/frontend/admin-panel/src/services/exportService.ts @@ -0,0 +1,20 @@ +import api from './api'; + +export const exportService = { + downloadDiagram: async (date: string) => { + // Axios necesita config especial para descargar archivos (blob) + const response = await api.get('/exports/diagram', { + params: { date }, + responseType: 'blob' + }); + + // Truco para forzar la descarga en el navegador + const url = window.URL.createObjectURL(new Blob([response.data])); + const link = document.createElement('a'); + link.href = url; + link.setAttribute('download', `diagrama_${date}.xml`); + document.body.appendChild(link); + link.click(); + link.remove(); + } +}; \ No newline at end of file diff --git a/frontend/admin-panel/src/services/operationService.ts b/frontend/admin-panel/src/services/operationService.ts index 48101e2..b91236d 100644 --- a/frontend/admin-panel/src/services/operationService.ts +++ b/frontend/admin-panel/src/services/operationService.ts @@ -1,5 +1,5 @@ import api from './api'; -import { Operation } from '../types/Operation'; // ID: type-import-fix +import { type Operation } from '../types/Operation'; export const operationService = { getAll: async (): Promise => { diff --git a/frontend/admin-panel/src/services/userService.ts b/frontend/admin-panel/src/services/userService.ts index 5bac64f..401d46c 100644 --- a/frontend/admin-panel/src/services/userService.ts +++ b/frontend/admin-panel/src/services/userService.ts @@ -1,25 +1,17 @@ import api from './api'; -// @ts-ignore -import type { User } from '../types/User'; +import { type User } from '../types/User'; -interface CreateUserDto { +// DTOs específicos para creación/edición para no usar 'any' +export interface CreateUserDto { username: string; - password: string; + password?: string; // Opcional en update, requerido en create (validar en UI) role: string; - email?: string; -} - -interface UpdateUserDto { - username: string; - password?: string; - role: string; - email?: string; + email: string; } export const userService = { getAll: async (): Promise => { const response = await api.get('/users'); - // @ts-ignore return response.data; }, @@ -27,11 +19,11 @@ export const userService = { await api.post('/users', user); }, - update: async (id: number, user: UpdateUserDto): Promise => { + update: async (id: number, user: CreateUserDto): Promise => { await api.put(`/users/${id}`, user); }, delete: async (id: number): Promise => { await api.delete(`/users/${id}`); } -}; +}; \ No newline at end of file diff --git a/frontend/counter-panel/.gitignore b/frontend/counter-panel/.gitignore new file mode 100644 index 0000000..a547bf3 --- /dev/null +++ b/frontend/counter-panel/.gitignore @@ -0,0 +1,24 @@ +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +pnpm-debug.log* +lerna-debug.log* + +node_modules +dist +dist-ssr +*.local + +# Editor directories and files +.vscode/* +!.vscode/extensions.json +.idea +.DS_Store +*.suo +*.ntvs* +*.njsproj +*.sln +*.sw? diff --git a/frontend/counter-panel/README.md b/frontend/counter-panel/README.md new file mode 100644 index 0000000..d2e7761 --- /dev/null +++ b/frontend/counter-panel/README.md @@ -0,0 +1,73 @@ +# React + TypeScript + Vite + +This template provides a minimal setup to get React working in Vite with HMR and some ESLint rules. + +Currently, two official plugins are available: + +- [@vitejs/plugin-react](https://github.com/vitejs/vite-plugin-react/blob/main/packages/plugin-react) uses [Babel](https://babeljs.io/) (or [oxc](https://oxc.rs) when used in [rolldown-vite](https://vite.dev/guide/rolldown)) for Fast Refresh +- [@vitejs/plugin-react-swc](https://github.com/vitejs/vite-plugin-react/blob/main/packages/plugin-react-swc) uses [SWC](https://swc.rs/) for Fast Refresh + +## React Compiler + +The React Compiler is not enabled on this template because of its impact on dev & build performances. To add it, see [this documentation](https://react.dev/learn/react-compiler/installation). + +## Expanding the ESLint configuration + +If you are developing a production application, we recommend updating the configuration to enable type-aware lint rules: + +```js +export default defineConfig([ + globalIgnores(['dist']), + { + files: ['**/*.{ts,tsx}'], + extends: [ + // Other configs... + + // Remove tseslint.configs.recommended and replace with this + tseslint.configs.recommendedTypeChecked, + // Alternatively, use this for stricter rules + tseslint.configs.strictTypeChecked, + // Optionally, add this for stylistic rules + tseslint.configs.stylisticTypeChecked, + + // Other configs... + ], + languageOptions: { + parserOptions: { + project: ['./tsconfig.node.json', './tsconfig.app.json'], + tsconfigRootDir: import.meta.dirname, + }, + // other options... + }, + }, +]) +``` + +You can also install [eslint-plugin-react-x](https://github.com/Rel1cx/eslint-react/tree/main/packages/plugins/eslint-plugin-react-x) and [eslint-plugin-react-dom](https://github.com/Rel1cx/eslint-react/tree/main/packages/plugins/eslint-plugin-react-dom) for React-specific lint rules: + +```js +// eslint.config.js +import reactX from 'eslint-plugin-react-x' +import reactDom from 'eslint-plugin-react-dom' + +export default defineConfig([ + globalIgnores(['dist']), + { + files: ['**/*.{ts,tsx}'], + extends: [ + // Other configs... + // Enable lint rules for React + reactX.configs['recommended-typescript'], + // Enable lint rules for React DOM + reactDom.configs.recommended, + ], + languageOptions: { + parserOptions: { + project: ['./tsconfig.node.json', './tsconfig.app.json'], + tsconfigRootDir: import.meta.dirname, + }, + // other options... + }, + }, +]) +``` diff --git a/frontend/counter-panel/eslint.config.js b/frontend/counter-panel/eslint.config.js new file mode 100644 index 0000000..5e6b472 --- /dev/null +++ b/frontend/counter-panel/eslint.config.js @@ -0,0 +1,23 @@ +import js from '@eslint/js' +import globals from 'globals' +import reactHooks from 'eslint-plugin-react-hooks' +import reactRefresh from 'eslint-plugin-react-refresh' +import tseslint from 'typescript-eslint' +import { defineConfig, globalIgnores } from 'eslint/config' + +export default defineConfig([ + globalIgnores(['dist']), + { + files: ['**/*.{ts,tsx}'], + extends: [ + js.configs.recommended, + tseslint.configs.recommended, + reactHooks.configs.flat.recommended, + reactRefresh.configs.vite, + ], + languageOptions: { + ecmaVersion: 2020, + globals: globals.browser, + }, + }, +]) diff --git a/frontend/counter-panel/index.html b/frontend/counter-panel/index.html new file mode 100644 index 0000000..0ee678e --- /dev/null +++ b/frontend/counter-panel/index.html @@ -0,0 +1,13 @@ + + + + + + + counter-panel + + +
+ + + diff --git a/frontend/counter-panel/package-lock.json b/frontend/counter-panel/package-lock.json new file mode 100644 index 0000000..308128b --- /dev/null +++ b/frontend/counter-panel/package-lock.json @@ -0,0 +1,4290 @@ +{ + "name": "counter-panel", + "version": "0.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "counter-panel", + "version": "0.0.0", + "dependencies": { + "axios": "^1.13.2", + "clsx": "^2.1.1", + "lucide-react": "^0.561.0", + "react": "^19.2.0", + "react-dom": "^19.2.0", + "react-router-dom": "^7.11.0", + "tailwind-merge": "^3.4.0", + "zustand": "^5.0.9" + }, + "devDependencies": { + "@eslint/js": "^9.39.1", + "@tailwindcss/postcss": "^4.1.18", + "@types/node": "^24.10.1", + "@types/react": "^19.2.5", + "@types/react-dom": "^19.2.3", + "@vitejs/plugin-react": "^5.1.1", + "autoprefixer": "^10.4.23", + "eslint": "^9.39.1", + "eslint-plugin-react-hooks": "^7.0.1", + "eslint-plugin-react-refresh": "^0.4.24", + "globals": "^16.5.0", + "postcss": "^8.5.6", + "tailwindcss": "^4.1.18", + "typescript": "~5.9.3", + "typescript-eslint": "^8.46.4", + "vite": "^7.2.4" + } + }, + "node_modules/@alloc/quick-lru": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@alloc/quick-lru/-/quick-lru-5.2.0.tgz", + "integrity": "sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.27.1.tgz", + "integrity": "sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-validator-identifier": "^7.27.1", + "js-tokens": "^4.0.0", + "picocolors": "^1.1.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/compat-data": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.28.5.tgz", + "integrity": "sha512-6uFXyCayocRbqhZOB+6XcuZbkMNimwfVGFji8CTZnCzOHVGvDqzvitu1re2AU5LROliz7eQPhB8CpAMvnx9EjA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.28.5.tgz", + "integrity": "sha512-e7jT4DxYvIDLk1ZHmU/m/mB19rex9sv0c2ftBtjSBv+kVM/902eh0fINUzD7UwLLNR+jU585GxUJ8/EBfAM5fw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.27.1", + "@babel/generator": "^7.28.5", + "@babel/helper-compilation-targets": "^7.27.2", + "@babel/helper-module-transforms": "^7.28.3", + "@babel/helpers": "^7.28.4", + "@babel/parser": "^7.28.5", + "@babel/template": "^7.27.2", + "@babel/traverse": "^7.28.5", + "@babel/types": "^7.28.5", + "@jridgewell/remapping": "^2.3.5", + "convert-source-map": "^2.0.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.3", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@babel/generator": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.28.5.tgz", + "integrity": "sha512-3EwLFhZ38J4VyIP6WNtt2kUdW9dokXA9Cr4IVIFHuCpZ3H8/YFOl5JjZHisrn1fATPBmKKqXzDFvh9fUwHz6CQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.28.5", + "@babel/types": "^7.28.5", + "@jridgewell/gen-mapping": "^0.3.12", + "@jridgewell/trace-mapping": "^0.3.28", + "jsesc": "^3.0.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets": { + "version": "7.27.2", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.27.2.tgz", + "integrity": "sha512-2+1thGUUWWjLTYTHZWK1n8Yga0ijBz1XAhUXcKy81rd5g6yh7hGqMp45v7cadSbEHc9G3OTv45SyneRN3ps4DQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/compat-data": "^7.27.2", + "@babel/helper-validator-option": "^7.27.1", + "browserslist": "^4.24.0", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-globals": { + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.28.0.tgz", + "integrity": "sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.27.1.tgz", + "integrity": "sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.27.1", + "@babel/types": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.28.3", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.28.3.tgz", + "integrity": "sha512-gytXUbs8k2sXS9PnQptz5o0QnpLL51SwASIORY6XaBKF88nsOT0Zw9szLqlSGQDP/4TljBAD5y98p2U1fqkdsw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-module-imports": "^7.27.1", + "@babel/helper-validator-identifier": "^7.27.1", + "@babel/traverse": "^7.28.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-plugin-utils": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.27.1.tgz", + "integrity": "sha512-1gn1Up5YXka3YYAHGKpbideQ5Yjf1tDa9qYcgysz+cNCXukyLl6DjPXhD3VRwSb8c0J9tA4b2+rHEZtc6R0tlw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz", + "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz", + "integrity": "sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-option": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.27.1.tgz", + "integrity": "sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.28.4", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.28.4.tgz", + "integrity": "sha512-HFN59MmQXGHVyYadKLVumYsA9dBFun/ldYxipEjzA4196jpLZd8UjEEBLkbEkvfYreDqJhZxYAWFPtrfhNpj4w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/template": "^7.27.2", + "@babel/types": "^7.28.4" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.28.5.tgz", + "integrity": "sha512-KKBU1VGYR7ORr3At5HAtUQ+TV3SzRCXmA/8OdDZiLDBIZxVyzXuztPjfLd3BV1PRAQGCMWWSHYhL0F8d5uHBDQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.28.5" + }, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx-self": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.27.1.tgz", + "integrity": "sha512-6UzkCs+ejGdZ5mFFC/OCUrv028ab2fp1znZmCZjAOBKiBK2jXD1O+BPSfX8X2qjJ75fZBMSnQn3Rq2mrBJK2mw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx-source": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.27.1.tgz", + "integrity": "sha512-zbwoTsBruTeKB9hSq73ha66iFeJHuaFkUbwvqElnygoNbj/jHRsSeokowZFN3CZ64IvEqcmmkVe89OPXc7ldAw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/template": { + "version": "7.27.2", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.27.2.tgz", + "integrity": "sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.27.1", + "@babel/parser": "^7.27.2", + "@babel/types": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.28.5.tgz", + "integrity": "sha512-TCCj4t55U90khlYkVV/0TfkJkAkUg3jZFA3Neb7unZT8CPok7iiRfaX0F+WnqWqt7OxhOn0uBKXCw4lbL8W0aQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.27.1", + "@babel/generator": "^7.28.5", + "@babel/helper-globals": "^7.28.0", + "@babel/parser": "^7.28.5", + "@babel/template": "^7.27.2", + "@babel/types": "^7.28.5", + "debug": "^4.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/types": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.28.5.tgz", + "integrity": "sha512-qQ5m48eI/MFLQ5PxQj4PFaprjyCTLI37ElWMmNs0K8Lk3dVeOdNpB3ks8jc7yM5CDmVC73eMVk/trk3fgmrUpA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-string-parser": "^7.27.1", + "@babel/helper-validator-identifier": "^7.28.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.27.2.tgz", + "integrity": "sha512-GZMB+a0mOMZs4MpDbj8RJp4cw+w1WV5NYD6xzgvzUJ5Ek2jerwfO2eADyI6ExDSUED+1X8aMbegahsJi+8mgpw==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.27.2.tgz", + "integrity": "sha512-DVNI8jlPa7Ujbr1yjU2PfUSRtAUZPG9I1RwW4F4xFB1Imiu2on0ADiI/c3td+KmDtVKNbi+nffGDQMfcIMkwIA==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.27.2.tgz", + "integrity": "sha512-pvz8ZZ7ot/RBphf8fv60ljmaoydPU12VuXHImtAs0XhLLw+EXBi2BLe3OYSBslR4rryHvweW5gmkKFwTiFy6KA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.27.2.tgz", + "integrity": "sha512-z8Ank4Byh4TJJOh4wpz8g2vDy75zFL0TlZlkUkEwYXuPSgX8yzep596n6mT7905kA9uHZsf/o2OJZubl2l3M7A==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.27.2.tgz", + "integrity": "sha512-davCD2Zc80nzDVRwXTcQP/28fiJbcOwvdolL0sOiOsbwBa72kegmVU0Wrh1MYrbuCL98Omp5dVhQFWRKR2ZAlg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.27.2.tgz", + "integrity": "sha512-ZxtijOmlQCBWGwbVmwOF/UCzuGIbUkqB1faQRf5akQmxRJ1ujusWsb3CVfk/9iZKr2L5SMU5wPBi1UWbvL+VQA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.27.2.tgz", + "integrity": "sha512-lS/9CN+rgqQ9czogxlMcBMGd+l8Q3Nj1MFQwBZJyoEKI50XGxwuzznYdwcav6lpOGv5BqaZXqvBSiB/kJ5op+g==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.27.2.tgz", + "integrity": "sha512-tAfqtNYb4YgPnJlEFu4c212HYjQWSO/w/h/lQaBK7RbwGIkBOuNKQI9tqWzx7Wtp7bTPaGC6MJvWI608P3wXYA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.27.2.tgz", + "integrity": "sha512-vWfq4GaIMP9AIe4yj1ZUW18RDhx6EPQKjwe7n8BbIecFtCQG4CfHGaHuh7fdfq+y3LIA2vGS/o9ZBGVxIDi9hw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.27.2.tgz", + "integrity": "sha512-hYxN8pr66NsCCiRFkHUAsxylNOcAQaxSSkHMMjcpx0si13t1LHFphxJZUiGwojB1a/Hd5OiPIqDdXONia6bhTw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.27.2.tgz", + "integrity": "sha512-MJt5BRRSScPDwG2hLelYhAAKh9imjHK5+NE/tvnRLbIqUWa+0E9N4WNMjmp/kXXPHZGqPLxggwVhz7QP8CTR8w==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.27.2.tgz", + "integrity": "sha512-lugyF1atnAT463aO6KPshVCJK5NgRnU4yb3FUumyVz+cGvZbontBgzeGFO1nF+dPueHD367a2ZXe1NtUkAjOtg==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.27.2.tgz", + "integrity": "sha512-nlP2I6ArEBewvJ2gjrrkESEZkB5mIoaTswuqNFRv/WYd+ATtUpe9Y09RnJvgvdag7he0OWgEZWhviS1OTOKixw==", + "cpu": [ + "mips64el" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.27.2.tgz", + "integrity": "sha512-C92gnpey7tUQONqg1n6dKVbx3vphKtTHJaNG2Ok9lGwbZil6DrfyecMsp9CrmXGQJmZ7iiVXvvZH6Ml5hL6XdQ==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.27.2.tgz", + "integrity": "sha512-B5BOmojNtUyN8AXlK0QJyvjEZkWwy/FKvakkTDCziX95AowLZKR6aCDhG7LeF7uMCXEJqwa8Bejz5LTPYm8AvA==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.27.2.tgz", + "integrity": "sha512-p4bm9+wsPwup5Z8f4EpfN63qNagQ47Ua2znaqGH6bqLlmJ4bx97Y9JdqxgGZ6Y8xVTixUnEkoKSHcpRlDnNr5w==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.27.2.tgz", + "integrity": "sha512-uwp2Tip5aPmH+NRUwTcfLb+W32WXjpFejTIOWZFw/v7/KnpCDKG66u4DLcurQpiYTiYwQ9B7KOeMJvLCu/OvbA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-arm64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.27.2.tgz", + "integrity": "sha512-Kj6DiBlwXrPsCRDeRvGAUb/LNrBASrfqAIok+xB0LxK8CHqxZ037viF13ugfsIpePH93mX7xfJp97cyDuTZ3cw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.27.2.tgz", + "integrity": "sha512-HwGDZ0VLVBY3Y+Nw0JexZy9o/nUAWq9MlV7cahpaXKW6TOzfVno3y3/M8Ga8u8Yr7GldLOov27xiCnqRZf0tCA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-arm64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.27.2.tgz", + "integrity": "sha512-DNIHH2BPQ5551A7oSHD0CKbwIA/Ox7+78/AWkbS5QoRzaqlev2uFayfSxq68EkonB+IKjiuxBFoV8ESJy8bOHA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.27.2.tgz", + "integrity": "sha512-/it7w9Nb7+0KFIzjalNJVR5bOzA9Vay+yIPLVHfIQYG/j+j9VTH84aNB8ExGKPU4AzfaEvN9/V4HV+F+vo8OEg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openharmony-arm64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.27.2.tgz", + "integrity": "sha512-LRBbCmiU51IXfeXk59csuX/aSaToeG7w48nMwA6049Y4J4+VbWALAuXcs+qcD04rHDuSCSRKdmY63sruDS5qag==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.27.2.tgz", + "integrity": "sha512-kMtx1yqJHTmqaqHPAzKCAkDaKsffmXkPHThSfRwZGyuqyIeBvf08KSsYXl+abf5HDAPMJIPnbBfXvP2ZC2TfHg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.27.2.tgz", + "integrity": "sha512-Yaf78O/B3Kkh+nKABUF++bvJv5Ijoy9AN1ww904rOXZFLWVc5OLOfL56W+C8F9xn5JQZa3UX6m+IktJnIb1Jjg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.27.2.tgz", + "integrity": "sha512-Iuws0kxo4yusk7sw70Xa2E2imZU5HoixzxfGCdxwBdhiDgt9vX9VUCBhqcwY7/uh//78A1hMkkROMJq9l27oLQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.27.2.tgz", + "integrity": "sha512-sRdU18mcKf7F+YgheI/zGf5alZatMUTKj/jNS6l744f9u3WFu4v7twcUI9vu4mknF4Y9aDlblIie0IM+5xxaqQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@eslint-community/eslint-utils": { + "version": "4.9.0", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.9.0.tgz", + "integrity": "sha512-ayVFHdtZ+hsq1t2Dy24wCmGXGe4q9Gu3smhLYALJrr473ZH27MsnSL+LKUlimp4BWJqMDMLmPpx/Q9R3OAlL4g==", + "dev": true, + "license": "MIT", + "dependencies": { + "eslint-visitor-keys": "^3.4.3" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" + } + }, + "node_modules/@eslint-community/eslint-utils/node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint-community/regexpp": { + "version": "4.12.2", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.2.tgz", + "integrity": "sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + } + }, + "node_modules/@eslint/config-array": { + "version": "0.21.1", + "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.21.1.tgz", + "integrity": "sha512-aw1gNayWpdI/jSYVgzN5pL0cfzU02GT3NBpeT/DXbx1/1x7ZKxFPd9bwrzygx/qiwIQiJ1sw/zD8qY/kRvlGHA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@eslint/object-schema": "^2.1.7", + "debug": "^4.3.1", + "minimatch": "^3.1.2" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/config-helpers": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.4.2.tgz", + "integrity": "sha512-gBrxN88gOIf3R7ja5K9slwNayVcZgK6SOUORm2uBzTeIEfeVaIhOpCtTox3P6R7o2jLFwLFTLnC7kU/RGcYEgw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@eslint/core": "^0.17.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/core": { + "version": "0.17.0", + "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.17.0.tgz", + "integrity": "sha512-yL/sLrpmtDaFEiUj1osRP4TI2MDz1AddJL+jZ7KSqvBuliN4xqYY54IfdN8qD8Toa6g1iloph1fxQNkjOxrrpQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@types/json-schema": "^7.0.15" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/eslintrc": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.3.3.tgz", + "integrity": "sha512-Kr+LPIUVKz2qkx1HAMH8q1q6azbqBAsXJUxBl/ODDuVPX45Z9DfwB8tPjTi6nNZ8BuM3nbJxC5zCAg5elnBUTQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^10.0.1", + "globals": "^14.0.0", + "ignore": "^5.2.0", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.1", + "minimatch": "^3.1.2", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint/eslintrc/node_modules/globals": { + "version": "14.0.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz", + "integrity": "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@eslint/js": { + "version": "9.39.2", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.39.2.tgz", + "integrity": "sha512-q1mjIoW1VX4IvSocvM/vbTiveKC4k9eLrajNEuSsmjymSDEbpGddtpfOoN7YGAqBK3NG+uqo8ia4PDTt8buCYA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://eslint.org/donate" + } + }, + "node_modules/@eslint/object-schema": { + "version": "2.1.7", + "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.7.tgz", + "integrity": "sha512-VtAOaymWVfZcmZbp6E2mympDIHvyjXs/12LqWYjVw6qjrfF+VK+fyG33kChz3nnK+SU5/NeHOqrTEHS8sXO3OA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/plugin-kit": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.4.1.tgz", + "integrity": "sha512-43/qtrDUokr7LJqoF2c3+RInu/t4zfrpYdoSDfYyhg52rwLV6TnOvdG4fXm7IkSB3wErkcmJS9iEhjVtOSEjjA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@eslint/core": "^0.17.0", + "levn": "^0.4.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@humanfs/core": { + "version": "0.19.1", + "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.1.tgz", + "integrity": "sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=18.18.0" + } + }, + "node_modules/@humanfs/node": { + "version": "0.16.7", + "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.7.tgz", + "integrity": "sha512-/zUx+yOsIrG4Y43Eh2peDeKCxlRt/gET6aHfaKpuq267qXdYDFViVHfMaLyygZOnl0kGWxFIgsBy8QFuTLUXEQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@humanfs/core": "^0.19.1", + "@humanwhocodes/retry": "^0.4.0" + }, + "engines": { + "node": ">=18.18.0" + } + }, + "node_modules/@humanwhocodes/module-importer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=12.22" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@humanwhocodes/retry": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.3.tgz", + "integrity": "sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=18.18" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.13", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", + "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.0", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/remapping": { + "version": "2.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz", + "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", + "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", + "dev": true, + "license": "MIT" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.31", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", + "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@rolldown/pluginutils": { + "version": "1.0.0-beta.53", + "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.0-beta.53.tgz", + "integrity": "sha512-vENRlFU4YbrwVqNDZ7fLvy+JR1CRkyr01jhSiDpE1u6py3OMzQfztQU2jxykW3ALNxO4kSlqIDeYyD0Y9RcQeQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@rollup/rollup-android-arm-eabi": { + "version": "4.53.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.53.5.tgz", + "integrity": "sha512-iDGS/h7D8t7tvZ1t6+WPK04KD0MwzLZrG0se1hzBjSi5fyxlsiggoJHwh18PCFNn7tG43OWb6pdZ6Y+rMlmyNQ==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-android-arm64": { + "version": "4.53.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.53.5.tgz", + "integrity": "sha512-wrSAViWvZHBMMlWk6EJhvg8/rjxzyEhEdgfMMjREHEq11EtJ6IP6yfcCH57YAEca2Oe3FNCE9DSTgU70EIGmVw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-darwin-arm64": { + "version": "4.53.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.53.5.tgz", + "integrity": "sha512-S87zZPBmRO6u1YXQLwpveZm4JfPpAa6oHBX7/ghSiGH3rz/KDgAu1rKdGutV+WUI6tKDMbaBJomhnT30Y2t4VQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-darwin-x64": { + "version": "4.53.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.53.5.tgz", + "integrity": "sha512-YTbnsAaHo6VrAczISxgpTva8EkfQus0VPEVJCEaboHtZRIb6h6j0BNxRBOwnDciFTZLDPW5r+ZBmhL/+YpTZgA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-freebsd-arm64": { + "version": "4.53.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.53.5.tgz", + "integrity": "sha512-1T8eY2J8rKJWzaznV7zedfdhD1BqVs1iqILhmHDq/bqCUZsrMt+j8VCTHhP0vdfbHK3e1IQ7VYx3jlKqwlf+vw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-freebsd-x64": { + "version": "4.53.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.53.5.tgz", + "integrity": "sha512-sHTiuXyBJApxRn+VFMaw1U+Qsz4kcNlxQ742snICYPrY+DDL8/ZbaC4DVIB7vgZmp3jiDaKA0WpBdP0aqPJoBQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.53.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.53.5.tgz", + "integrity": "sha512-dV3T9MyAf0w8zPVLVBptVlzaXxka6xg1f16VAQmjg+4KMSTWDvhimI/Y6mp8oHwNrmnmVl9XxJ/w/mO4uIQONA==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm-musleabihf": { + "version": "4.53.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.53.5.tgz", + "integrity": "sha512-wIGYC1x/hyjP+KAu9+ewDI+fi5XSNiUi9Bvg6KGAh2TsNMA3tSEs+Sh6jJ/r4BV/bx/CyWu2ue9kDnIdRyafcQ==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-gnu": { + "version": "4.53.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.53.5.tgz", + "integrity": "sha512-Y+qVA0D9d0y2FRNiG9oM3Hut/DgODZbU9I8pLLPwAsU0tUKZ49cyV1tzmB/qRbSzGvY8lpgGkJuMyuhH7Ma+Vg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-musl": { + "version": "4.53.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.53.5.tgz", + "integrity": "sha512-juaC4bEgJsyFVfqhtGLz8mbopaWD+WeSOYr5E16y+1of6KQjc0BpwZLuxkClqY1i8sco+MdyoXPNiCkQou09+g==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-loong64-gnu": { + "version": "4.53.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.53.5.tgz", + "integrity": "sha512-rIEC0hZ17A42iXtHX+EPJVL/CakHo+tT7W0pbzdAGuWOt2jxDFh7A/lRhsNHBcqL4T36+UiAgwO8pbmn3dE8wA==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-ppc64-gnu": { + "version": "4.53.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.53.5.tgz", + "integrity": "sha512-T7l409NhUE552RcAOcmJHj3xyZ2h7vMWzcwQI0hvn5tqHh3oSoclf9WgTl+0QqffWFG8MEVZZP1/OBglKZx52Q==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-gnu": { + "version": "4.53.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.53.5.tgz", + "integrity": "sha512-7OK5/GhxbnrMcxIFoYfhV/TkknarkYC1hqUw1wU2xUN3TVRLNT5FmBv4KkheSG2xZ6IEbRAhTooTV2+R5Tk0lQ==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-musl": { + "version": "4.53.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.53.5.tgz", + "integrity": "sha512-GwuDBE/PsXaTa76lO5eLJTyr2k8QkPipAyOrs4V/KJufHCZBJ495VCGJol35grx9xryk4V+2zd3Ri+3v7NPh+w==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-s390x-gnu": { + "version": "4.53.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.53.5.tgz", + "integrity": "sha512-IAE1Ziyr1qNfnmiQLHBURAD+eh/zH1pIeJjeShleII7Vj8kyEm2PF77o+lf3WTHDpNJcu4IXJxNO0Zluro8bOw==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.53.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.53.5.tgz", + "integrity": "sha512-Pg6E+oP7GvZ4XwgRJBuSXZjcqpIW3yCBhK4BcsANvb47qMvAbCjR6E+1a/U2WXz1JJxp9/4Dno3/iSJLcm5auw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-musl": { + "version": "4.53.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.53.5.tgz", + "integrity": "sha512-txGtluxDKTxaMDzUduGP0wdfng24y1rygUMnmlUJ88fzCCULCLn7oE5kb2+tRB+MWq1QDZT6ObT5RrR8HFRKqg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-openharmony-arm64": { + "version": "4.53.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.53.5.tgz", + "integrity": "sha512-3DFiLPnTxiOQV993fMc+KO8zXHTcIjgaInrqlG8zDp1TlhYl6WgrOHuJkJQ6M8zHEcntSJsUp1XFZSY8C1DYbg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ] + }, + "node_modules/@rollup/rollup-win32-arm64-msvc": { + "version": "4.53.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.53.5.tgz", + "integrity": "sha512-nggc/wPpNTgjGg75hu+Q/3i32R00Lq1B6N1DO7MCU340MRKL3WZJMjA9U4K4gzy3dkZPXm9E1Nc81FItBVGRlA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-ia32-msvc": { + "version": "4.53.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.53.5.tgz", + "integrity": "sha512-U/54pTbdQpPLBdEzCT6NBCFAfSZMvmjr0twhnD9f4EIvlm9wy3jjQ38yQj1AGznrNO65EWQMgm/QUjuIVrYF9w==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-gnu": { + "version": "4.53.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.53.5.tgz", + "integrity": "sha512-2NqKgZSuLH9SXBBV2dWNRCZmocgSOx8OJSdpRaEcRlIfX8YrKxUT6z0F1NpvDVhOsl190UFTRh2F2WDWWCYp3A==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.53.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.53.5.tgz", + "integrity": "sha512-JRpZUhCfhZ4keB5v0fe02gQJy05GqboPOaxvjugW04RLSYYoB/9t2lx2u/tMs/Na/1NXfY8QYjgRljRpN+MjTQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@tailwindcss/node": { + "version": "4.1.18", + "resolved": "https://registry.npmjs.org/@tailwindcss/node/-/node-4.1.18.tgz", + "integrity": "sha512-DoR7U1P7iYhw16qJ49fgXUlry1t4CpXeErJHnQ44JgTSKMaZUdf17cfn5mHchfJ4KRBZRFA/Coo+MUF5+gOaCQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/remapping": "^2.3.4", + "enhanced-resolve": "^5.18.3", + "jiti": "^2.6.1", + "lightningcss": "1.30.2", + "magic-string": "^0.30.21", + "source-map-js": "^1.2.1", + "tailwindcss": "4.1.18" + } + }, + "node_modules/@tailwindcss/oxide": { + "version": "4.1.18", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide/-/oxide-4.1.18.tgz", + "integrity": "sha512-EgCR5tTS5bUSKQgzeMClT6iCY3ToqE1y+ZB0AKldj809QXk1Y+3jB0upOYZrn9aGIzPtUsP7sX4QQ4XtjBB95A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 10" + }, + "optionalDependencies": { + "@tailwindcss/oxide-android-arm64": "4.1.18", + "@tailwindcss/oxide-darwin-arm64": "4.1.18", + "@tailwindcss/oxide-darwin-x64": "4.1.18", + "@tailwindcss/oxide-freebsd-x64": "4.1.18", + "@tailwindcss/oxide-linux-arm-gnueabihf": "4.1.18", + "@tailwindcss/oxide-linux-arm64-gnu": "4.1.18", + "@tailwindcss/oxide-linux-arm64-musl": "4.1.18", + "@tailwindcss/oxide-linux-x64-gnu": "4.1.18", + "@tailwindcss/oxide-linux-x64-musl": "4.1.18", + "@tailwindcss/oxide-wasm32-wasi": "4.1.18", + "@tailwindcss/oxide-win32-arm64-msvc": "4.1.18", + "@tailwindcss/oxide-win32-x64-msvc": "4.1.18" + } + }, + "node_modules/@tailwindcss/oxide-android-arm64": { + "version": "4.1.18", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-android-arm64/-/oxide-android-arm64-4.1.18.tgz", + "integrity": "sha512-dJHz7+Ugr9U/diKJA0W6N/6/cjI+ZTAoxPf9Iz9BFRF2GzEX8IvXxFIi/dZBloVJX/MZGvRuFA9rqwdiIEZQ0Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-darwin-arm64": { + "version": "4.1.18", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-arm64/-/oxide-darwin-arm64-4.1.18.tgz", + "integrity": "sha512-Gc2q4Qhs660bhjyBSKgq6BYvwDz4G+BuyJ5H1xfhmDR3D8HnHCmT/BSkvSL0vQLy/nkMLY20PQ2OoYMO15Jd0A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-darwin-x64": { + "version": "4.1.18", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-x64/-/oxide-darwin-x64-4.1.18.tgz", + "integrity": "sha512-FL5oxr2xQsFrc3X9o1fjHKBYBMD1QZNyc1Xzw/h5Qu4XnEBi3dZn96HcHm41c/euGV+GRiXFfh2hUCyKi/e+yw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-freebsd-x64": { + "version": "4.1.18", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-freebsd-x64/-/oxide-freebsd-x64-4.1.18.tgz", + "integrity": "sha512-Fj+RHgu5bDodmV1dM9yAxlfJwkkWvLiRjbhuO2LEtwtlYlBgiAT4x/j5wQr1tC3SANAgD+0YcmWVrj8R9trVMA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-linux-arm-gnueabihf": { + "version": "4.1.18", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm-gnueabihf/-/oxide-linux-arm-gnueabihf-4.1.18.tgz", + "integrity": "sha512-Fp+Wzk/Ws4dZn+LV2Nqx3IilnhH51YZoRaYHQsVq3RQvEl+71VGKFpkfHrLM/Li+kt5c0DJe/bHXK1eHgDmdiA==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-linux-arm64-gnu": { + "version": "4.1.18", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-gnu/-/oxide-linux-arm64-gnu-4.1.18.tgz", + "integrity": "sha512-S0n3jboLysNbh55Vrt7pk9wgpyTTPD0fdQeh7wQfMqLPM/Hrxi+dVsLsPrycQjGKEQk85Kgbx+6+QnYNiHalnw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-linux-arm64-musl": { + "version": "4.1.18", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-musl/-/oxide-linux-arm64-musl-4.1.18.tgz", + "integrity": "sha512-1px92582HkPQlaaCkdRcio71p8bc8i/ap5807tPRDK/uw953cauQBT8c5tVGkOwrHMfc2Yh6UuxaH4vtTjGvHg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-linux-x64-gnu": { + "version": "4.1.18", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-gnu/-/oxide-linux-x64-gnu-4.1.18.tgz", + "integrity": "sha512-v3gyT0ivkfBLoZGF9LyHmts0Isc8jHZyVcbzio6Wpzifg/+5ZJpDiRiUhDLkcr7f/r38SWNe7ucxmGW3j3Kb/g==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-linux-x64-musl": { + "version": "4.1.18", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-musl/-/oxide-linux-x64-musl-4.1.18.tgz", + "integrity": "sha512-bhJ2y2OQNlcRwwgOAGMY0xTFStt4/wyU6pvI6LSuZpRgKQwxTec0/3Scu91O8ir7qCR3AuepQKLU/kX99FouqQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-wasm32-wasi": { + "version": "4.1.18", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-wasm32-wasi/-/oxide-wasm32-wasi-4.1.18.tgz", + "integrity": "sha512-LffYTvPjODiP6PT16oNeUQJzNVyJl1cjIebq/rWWBF+3eDst5JGEFSc5cWxyRCJ0Mxl+KyIkqRxk1XPEs9x8TA==", + "bundleDependencies": [ + "@napi-rs/wasm-runtime", + "@emnapi/core", + "@emnapi/runtime", + "@tybys/wasm-util", + "@emnapi/wasi-threads", + "tslib" + ], + "cpu": [ + "wasm32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@emnapi/core": "^1.7.1", + "@emnapi/runtime": "^1.7.1", + "@emnapi/wasi-threads": "^1.1.0", + "@napi-rs/wasm-runtime": "^1.1.0", + "@tybys/wasm-util": "^0.10.1", + "tslib": "^2.4.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@tailwindcss/oxide-win32-arm64-msvc": { + "version": "4.1.18", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-arm64-msvc/-/oxide-win32-arm64-msvc-4.1.18.tgz", + "integrity": "sha512-HjSA7mr9HmC8fu6bdsZvZ+dhjyGCLdotjVOgLA2vEqxEBZaQo9YTX4kwgEvPCpRh8o4uWc4J/wEoFzhEmjvPbA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-win32-x64-msvc": { + "version": "4.1.18", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-x64-msvc/-/oxide-win32-x64-msvc-4.1.18.tgz", + "integrity": "sha512-bJWbyYpUlqamC8dpR7pfjA0I7vdF6t5VpUGMWRkXVE3AXgIZjYUYAK7II1GNaxR8J1SSrSrppRar8G++JekE3Q==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/postcss": { + "version": "4.1.18", + "resolved": "https://registry.npmjs.org/@tailwindcss/postcss/-/postcss-4.1.18.tgz", + "integrity": "sha512-Ce0GFnzAOuPyfV5SxjXGn0CubwGcuDB0zcdaPuCSzAa/2vII24JTkH+I6jcbXLb1ctjZMZZI6OjDaLPJQL1S0g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@alloc/quick-lru": "^5.2.0", + "@tailwindcss/node": "4.1.18", + "@tailwindcss/oxide": "4.1.18", + "postcss": "^8.4.41", + "tailwindcss": "4.1.18" + } + }, + "node_modules/@types/babel__core": { + "version": "7.20.5", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz", + "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.20.7", + "@babel/types": "^7.20.7", + "@types/babel__generator": "*", + "@types/babel__template": "*", + "@types/babel__traverse": "*" + } + }, + "node_modules/@types/babel__generator": { + "version": "7.27.0", + "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.27.0.tgz", + "integrity": "sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__template": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz", + "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__traverse": { + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.28.0.tgz", + "integrity": "sha512-8PvcXf70gTDZBgt9ptxJ8elBeBjcLOAcOtoO/mPJjtji1+CdGbHgm77om1GrsPxsiE+uXIpNSK64UYaIwQXd4Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.28.2" + } + }, + "node_modules/@types/estree": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", + "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/json-schema": { + "version": "7.0.15", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", + "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/node": { + "version": "24.10.4", + "resolved": "https://registry.npmjs.org/@types/node/-/node-24.10.4.tgz", + "integrity": "sha512-vnDVpYPMzs4wunl27jHrfmwojOGKya0xyM3sH+UE5iv5uPS6vX7UIoh6m+vQc5LGBq52HBKPIn/zcSZVzeDEZg==", + "dev": true, + "license": "MIT", + "dependencies": { + "undici-types": "~7.16.0" + } + }, + "node_modules/@types/react": { + "version": "19.2.7", + "resolved": "https://registry.npmjs.org/@types/react/-/react-19.2.7.tgz", + "integrity": "sha512-MWtvHrGZLFttgeEj28VXHxpmwYbor/ATPYbBfSFZEIRK0ecCFLl2Qo55z52Hss+UV9CRN7trSeq1zbgx7YDWWg==", + "devOptional": true, + "license": "MIT", + "dependencies": { + "csstype": "^3.2.2" + } + }, + "node_modules/@types/react-dom": { + "version": "19.2.3", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-19.2.3.tgz", + "integrity": "sha512-jp2L/eY6fn+KgVVQAOqYItbF0VY/YApe5Mz2F0aykSO8gx31bYCZyvSeYxCHKvzHG5eZjc+zyaS5BrBWya2+kQ==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "@types/react": "^19.2.0" + } + }, + "node_modules/@typescript-eslint/eslint-plugin": { + "version": "8.50.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.50.0.tgz", + "integrity": "sha512-O7QnmOXYKVtPrfYzMolrCTfkezCJS9+ljLdKW/+DCvRsc3UAz+sbH6Xcsv7p30+0OwUbeWfUDAQE0vpabZ3QLg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/regexpp": "^4.10.0", + "@typescript-eslint/scope-manager": "8.50.0", + "@typescript-eslint/type-utils": "8.50.0", + "@typescript-eslint/utils": "8.50.0", + "@typescript-eslint/visitor-keys": "8.50.0", + "ignore": "^7.0.0", + "natural-compare": "^1.4.0", + "ts-api-utils": "^2.1.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "@typescript-eslint/parser": "^8.50.0", + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/eslint-plugin/node_modules/ignore": { + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.5.tgz", + "integrity": "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/@typescript-eslint/parser": { + "version": "8.50.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.50.0.tgz", + "integrity": "sha512-6/cmF2piao+f6wSxUsJLZjck7OQsYyRtcOZS02k7XINSNlz93v6emM8WutDQSXnroG2xwYlEVHJI+cPA7CPM3Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/scope-manager": "8.50.0", + "@typescript-eslint/types": "8.50.0", + "@typescript-eslint/typescript-estree": "8.50.0", + "@typescript-eslint/visitor-keys": "8.50.0", + "debug": "^4.3.4" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/project-service": { + "version": "8.50.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.50.0.tgz", + "integrity": "sha512-Cg/nQcL1BcoTijEWyx4mkVC56r8dj44bFDvBdygifuS20f3OZCHmFbjF34DPSi07kwlFvqfv/xOLnJ5DquxSGQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/tsconfig-utils": "^8.50.0", + "@typescript-eslint/types": "^8.50.0", + "debug": "^4.3.4" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/scope-manager": { + "version": "8.50.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.50.0.tgz", + "integrity": "sha512-xCwfuCZjhIqy7+HKxBLrDVT5q/iq7XBVBXLn57RTIIpelLtEIZHXAF/Upa3+gaCpeV1NNS5Z9A+ID6jn50VD4A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.50.0", + "@typescript-eslint/visitor-keys": "8.50.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/tsconfig-utils": { + "version": "8.50.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.50.0.tgz", + "integrity": "sha512-vxd3G/ybKTSlm31MOA96gqvrRGv9RJ7LGtZCn2Vrc5htA0zCDvcMqUkifcjrWNNKXHUU3WCkYOzzVSFBd0wa2w==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/type-utils": { + "version": "8.50.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.50.0.tgz", + "integrity": "sha512-7OciHT2lKCewR0mFoBrvZJ4AXTMe/sYOe87289WAViOocEmDjjv8MvIOT2XESuKj9jp8u3SZYUSh89QA4S1kQw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.50.0", + "@typescript-eslint/typescript-estree": "8.50.0", + "@typescript-eslint/utils": "8.50.0", + "debug": "^4.3.4", + "ts-api-utils": "^2.1.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/types": { + "version": "8.50.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.50.0.tgz", + "integrity": "sha512-iX1mgmGrXdANhhITbpp2QQM2fGehBse9LbTf0sidWK6yg/NE+uhV5dfU1g6EYPlcReYmkE9QLPq/2irKAmtS9w==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/typescript-estree": { + "version": "8.50.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.50.0.tgz", + "integrity": "sha512-W7SVAGBR/IX7zm1t70Yujpbk+zdPq/u4soeFSknWFdXIFuWsBGBOUu/Tn/I6KHSKvSh91OiMuaSnYp3mtPt5IQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/project-service": "8.50.0", + "@typescript-eslint/tsconfig-utils": "8.50.0", + "@typescript-eslint/types": "8.50.0", + "@typescript-eslint/visitor-keys": "8.50.0", + "debug": "^4.3.4", + "minimatch": "^9.0.4", + "semver": "^7.6.0", + "tinyglobby": "^0.2.15", + "ts-api-utils": "^2.1.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/brace-expansion": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", + "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/semver": { + "version": "7.7.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", + "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@typescript-eslint/utils": { + "version": "8.50.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.50.0.tgz", + "integrity": "sha512-87KgUXET09CRjGCi2Ejxy3PULXna63/bMYv72tCAlDJC3Yqwln0HiFJ3VJMst2+mEtNtZu5oFvX4qJGjKsnAgg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.7.0", + "@typescript-eslint/scope-manager": "8.50.0", + "@typescript-eslint/types": "8.50.0", + "@typescript-eslint/typescript-estree": "8.50.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/visitor-keys": { + "version": "8.50.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.50.0.tgz", + "integrity": "sha512-Xzmnb58+Db78gT/CCj/PVCvK+zxbnsw6F+O1oheYszJbBSdEjVhQi3C/Xttzxgi/GLmpvOggRs1RFpiJ8+c34Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.50.0", + "eslint-visitor-keys": "^4.2.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@vitejs/plugin-react": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-5.1.2.tgz", + "integrity": "sha512-EcA07pHJouywpzsoTUqNh5NwGayl2PPVEJKUSinGGSxFGYn+shYbqMGBg6FXDqgXum9Ou/ecb+411ssw8HImJQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.28.5", + "@babel/plugin-transform-react-jsx-self": "^7.27.1", + "@babel/plugin-transform-react-jsx-source": "^7.27.1", + "@rolldown/pluginutils": "1.0.0-beta.53", + "@types/babel__core": "^7.20.5", + "react-refresh": "^0.18.0" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "peerDependencies": { + "vite": "^4.2.0 || ^5.0.0 || ^6.0.0 || ^7.0.0" + } + }, + "node_modules/acorn": { + "version": "8.15.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz", + "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", + "dev": true, + "license": "MIT", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true, + "license": "Python-2.0" + }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", + "license": "MIT" + }, + "node_modules/autoprefixer": { + "version": "10.4.23", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.23.tgz", + "integrity": "sha512-YYTXSFulfwytnjAPlw8QHncHJmlvFKtczb8InXaAx9Q0LbfDnfEYDE55omerIJKihhmU61Ft+cAOSzQVaBUmeA==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/autoprefixer" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "browserslist": "^4.28.1", + "caniuse-lite": "^1.0.30001760", + "fraction.js": "^5.3.4", + "picocolors": "^1.1.1", + "postcss-value-parser": "^4.2.0" + }, + "bin": { + "autoprefixer": "bin/autoprefixer" + }, + "engines": { + "node": "^10 || ^12 || >=14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/axios": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.13.2.tgz", + "integrity": "sha512-VPk9ebNqPcy5lRGuSlKx752IlDatOjT9paPlm8A7yOuW2Fbvp4X3JznJtT4f0GzGLLiWE9W8onz51SqLYwzGaA==", + "license": "MIT", + "dependencies": { + "follow-redirects": "^1.15.6", + "form-data": "^4.0.4", + "proxy-from-env": "^1.1.0" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true, + "license": "MIT" + }, + "node_modules/baseline-browser-mapping": { + "version": "2.9.9", + "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.9.9.tgz", + "integrity": "sha512-V8fbOCSeOFvlDj7LLChUcqbZrdKD9RU/VR260piF1790vT0mfLSwGc/Qzxv3IqiTukOpNtItePa0HBpMAj7MDg==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "baseline-browser-mapping": "dist/cli.js" + } + }, + "node_modules/brace-expansion": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/browserslist": { + "version": "4.28.1", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.1.tgz", + "integrity": "sha512-ZC5Bd0LgJXgwGqUknZY/vkUQ04r8NXnJZ3yYi4vDmSiZmC/pdSN0NbNRPxZpbtO4uAfDUAFffO8IZoM3Gj8IkA==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "baseline-browser-mapping": "^2.9.0", + "caniuse-lite": "^1.0.30001759", + "electron-to-chromium": "^1.5.263", + "node-releases": "^2.0.27", + "update-browserslist-db": "^1.2.0" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/call-bind-apply-helpers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", + "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001760", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001760.tgz", + "integrity": "sha512-7AAMPcueWELt1p3mi13HR/LHH0TJLT11cnwDJEs3xA4+CK/PLKeO9Kl1oru24htkyUKtkGCvAx4ohB0Ttry8Dw==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "CC-BY-4.0" + }, + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/clsx": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz", + "integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true, + "license": "MIT" + }, + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "license": "MIT", + "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", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true, + "license": "MIT" + }, + "node_modules/convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "dev": true, + "license": "MIT" + }, + "node_modules/cookie": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-1.1.1.tgz", + "integrity": "sha512-ei8Aos7ja0weRpFzJnEA9UHJ/7XQmqglbRwnf2ATjcB9Wq874VKH9kfjjirM6UhU2/E5fFYadylyhFldcqSidQ==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/cross-spawn": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", + "dev": true, + "license": "MIT", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/csstype": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz", + "integrity": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==", + "devOptional": true, + "license": "MIT" + }, + "node_modules/debug": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "license": "MIT", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/detect-libc": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz", + "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=8" + } + }, + "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==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "es-errors": "^1.3.0", + "gopd": "^1.2.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/electron-to-chromium": { + "version": "1.5.267", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.267.tgz", + "integrity": "sha512-0Drusm6MVRXSOJpGbaSVgcQsuB4hEkMpHXaVstcPmhu5LIedxs1xNK/nIxmQIU/RPC0+1/o0AVZfBTkTNJOdUw==", + "dev": true, + "license": "ISC" + }, + "node_modules/enhanced-resolve": { + "version": "5.18.4", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.18.4.tgz", + "integrity": "sha512-LgQMM4WXU3QI+SYgEc2liRgznaD5ojbmY3sb8LxyguVkIg5FxdpTkvk72te2R38/TGKxH634oLxXRGY6d7AP+Q==", + "dev": true, + "license": "MIT", + "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==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-object-atoms": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", + "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-set-tostringtag": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", + "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/esbuild": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.27.2.tgz", + "integrity": "sha512-HyNQImnsOC7X9PMNaCIeAm4ISCQXs5a5YasTXVliKv4uuBo1dKrG0A+uQS8M5eXjVMnLg3WgXaKvprHlFJQffw==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.27.2", + "@esbuild/android-arm": "0.27.2", + "@esbuild/android-arm64": "0.27.2", + "@esbuild/android-x64": "0.27.2", + "@esbuild/darwin-arm64": "0.27.2", + "@esbuild/darwin-x64": "0.27.2", + "@esbuild/freebsd-arm64": "0.27.2", + "@esbuild/freebsd-x64": "0.27.2", + "@esbuild/linux-arm": "0.27.2", + "@esbuild/linux-arm64": "0.27.2", + "@esbuild/linux-ia32": "0.27.2", + "@esbuild/linux-loong64": "0.27.2", + "@esbuild/linux-mips64el": "0.27.2", + "@esbuild/linux-ppc64": "0.27.2", + "@esbuild/linux-riscv64": "0.27.2", + "@esbuild/linux-s390x": "0.27.2", + "@esbuild/linux-x64": "0.27.2", + "@esbuild/netbsd-arm64": "0.27.2", + "@esbuild/netbsd-x64": "0.27.2", + "@esbuild/openbsd-arm64": "0.27.2", + "@esbuild/openbsd-x64": "0.27.2", + "@esbuild/openharmony-arm64": "0.27.2", + "@esbuild/sunos-x64": "0.27.2", + "@esbuild/win32-arm64": "0.27.2", + "@esbuild/win32-ia32": "0.27.2", + "@esbuild/win32-x64": "0.27.2" + } + }, + "node_modules/escalade": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint": { + "version": "9.39.2", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.39.2.tgz", + "integrity": "sha512-LEyamqS7W5HB3ujJyvi0HQK/dtVINZvd5mAAp9eT5S/ujByGjiZLCzPcHVzuXbpJDJF/cxwHlfceVUDZ2lnSTw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.8.0", + "@eslint-community/regexpp": "^4.12.1", + "@eslint/config-array": "^0.21.1", + "@eslint/config-helpers": "^0.4.2", + "@eslint/core": "^0.17.0", + "@eslint/eslintrc": "^3.3.1", + "@eslint/js": "9.39.2", + "@eslint/plugin-kit": "^0.4.1", + "@humanfs/node": "^0.16.6", + "@humanwhocodes/module-importer": "^1.0.1", + "@humanwhocodes/retry": "^0.4.2", + "@types/estree": "^1.0.6", + "ajv": "^6.12.4", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.6", + "debug": "^4.3.2", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^8.4.0", + "eslint-visitor-keys": "^4.2.1", + "espree": "^10.4.0", + "esquery": "^1.5.0", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^8.0.0", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "ignore": "^5.2.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.1.2", + "natural-compare": "^1.4.0", + "optionator": "^0.9.3" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://eslint.org/donate" + }, + "peerDependencies": { + "jiti": "*" + }, + "peerDependenciesMeta": { + "jiti": { + "optional": true + } + } + }, + "node_modules/eslint-plugin-react-hooks": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-7.0.1.tgz", + "integrity": "sha512-O0d0m04evaNzEPoSW+59Mezf8Qt0InfgGIBJnpC0h3NH/WjUAR7BIKUfysC6todmtiZ/A0oUVS8Gce0WhBrHsA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.24.4", + "@babel/parser": "^7.24.4", + "hermes-parser": "^0.25.1", + "zod": "^3.25.0 || ^4.0.0", + "zod-validation-error": "^3.5.0 || ^4.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 || ^9.0.0" + } + }, + "node_modules/eslint-plugin-react-refresh": { + "version": "0.4.26", + "resolved": "https://registry.npmjs.org/eslint-plugin-react-refresh/-/eslint-plugin-react-refresh-0.4.26.tgz", + "integrity": "sha512-1RETEylht2O6FM/MvgnyvT+8K21wLqDNg4qD51Zj3guhjt433XbnnkVttHMyaVyAFD03QSV4LPS5iE3VQmO7XQ==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "eslint": ">=8.40" + } + }, + "node_modules/eslint-scope": { + "version": "8.4.0", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.4.0.tgz", + "integrity": "sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-visitor-keys": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz", + "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/espree": { + "version": "10.4.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-10.4.0.tgz", + "integrity": "sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "acorn": "^8.15.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^4.2.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/esquery": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz", + "integrity": "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "estraverse": "^5.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", + "dev": true, + "license": "MIT" + }, + "node_modules/fdir": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", + "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, + "node_modules/file-entry-cache": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz", + "integrity": "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "flat-cache": "^4.0.0" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "license": "MIT", + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/flat-cache": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz", + "integrity": "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==", + "dev": true, + "license": "MIT", + "dependencies": { + "flatted": "^3.2.9", + "keyv": "^4.5.4" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/flatted": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.3.tgz", + "integrity": "sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==", + "dev": true, + "license": "ISC" + }, + "node_modules/follow-redirects": { + "version": "1.15.11", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.11.tgz", + "integrity": "sha512-deG2P0JfjrTxl50XGCDyfI97ZGVCxIpfKYmfyrQ54n5FO/0gfIES8C/Psl6kWVDolizcaaxZJnTS0QSMxvnsBQ==", + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "license": "MIT", + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, + "node_modules/form-data": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.5.tgz", + "integrity": "sha512-8RipRLol37bNs2bhoV67fiTEvdTrbMUYcFTiy3+wuuOnUog2QBHCZWXDRijWQfAkhBj2Uf5UnVaiWwA5vdd82w==", + "license": "MIT", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "es-set-tostringtag": "^2.1.0", + "hasown": "^2.0.2", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/fraction.js": { + "version": "5.3.4", + "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-5.3.4.tgz", + "integrity": "sha512-1X1NTtiJphryn/uLQz3whtY6jK3fTqoE3ohKs0tT+Ujr1W59oopxmoEh7Lu5p6vBaPbgoM0bzveAW4Qi5RyWDQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": "*" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/rawify" + } + }, + "node_modules/fsevents": { + "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, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/get-intrinsic": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", + "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "function-bind": "^1.1.2", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "math-intrinsics": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", + "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/globals": { + "version": "16.5.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-16.5.0.tgz", + "integrity": "sha512-c/c15i26VrJ4IRt5Z89DnIzCGDn9EcebibhAOjw5ibqEHsE1wLUgkPn9RDmNcUKyU87GeaL633nyJ+pplFR2ZQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/gopd": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/has-symbols": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-tostringtag": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", + "license": "MIT", + "dependencies": { + "has-symbols": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/hermes-estree": { + "version": "0.25.1", + "resolved": "https://registry.npmjs.org/hermes-estree/-/hermes-estree-0.25.1.tgz", + "integrity": "sha512-0wUoCcLp+5Ev5pDW2OriHC2MJCbwLwuRx+gAqMTOkGKJJiBCLjtrvy4PWUGn6MIVefecRpzoOZ/UV6iGdOr+Cw==", + "dev": true, + "license": "MIT" + }, + "node_modules/hermes-parser": { + "version": "0.25.1", + "resolved": "https://registry.npmjs.org/hermes-parser/-/hermes-parser-0.25.1.tgz", + "integrity": "sha512-6pEjquH3rqaI6cYAXYPcz9MS4rY6R4ngRgrgfDshRptUZIc3lw0MCIJIGDj9++mfySOuPTHB4nrSW99BCvOPIA==", + "dev": true, + "license": "MIT", + "dependencies": { + "hermes-estree": "0.25.1" + } + }, + "node_modules/ignore": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", + "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/import-fresh": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz", + "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true, + "license": "ISC" + }, + "node_modules/jiti": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-2.6.1.tgz", + "integrity": "sha512-ekilCSN1jwRvIbgeg/57YFh8qQDNbwDb9xT/qu2DAHbFFZUicIl4ygVaAvzveMhMVr3LnpSKTNnwt8PoOfmKhQ==", + "dev": true, + "license": "MIT", + "bin": { + "jiti": "lib/jiti-cli.mjs" + } + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/js-yaml": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.1.tgz", + "integrity": "sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==", + "dev": true, + "license": "MIT", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/jsesc": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", + "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", + "dev": true, + "license": "MIT", + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/json-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true, + "license": "MIT" + }, + "node_modules/json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", + "dev": true, + "license": "MIT" + }, + "node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "dev": true, + "license": "MIT", + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/keyv": { + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", + "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", + "dev": true, + "license": "MIT", + "dependencies": { + "json-buffer": "3.0.1" + } + }, + "node_modules/levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/lightningcss": { + "version": "1.30.2", + "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.30.2.tgz", + "integrity": "sha512-utfs7Pr5uJyyvDETitgsaqSyjCb2qNRAtuqUeWIAKztsOYdcACf2KtARYXg2pSvhkt+9NfoaNY7fxjl6nuMjIQ==", + "dev": true, + "license": "MPL-2.0", + "dependencies": { + "detect-libc": "^2.0.3" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "optionalDependencies": { + "lightningcss-android-arm64": "1.30.2", + "lightningcss-darwin-arm64": "1.30.2", + "lightningcss-darwin-x64": "1.30.2", + "lightningcss-freebsd-x64": "1.30.2", + "lightningcss-linux-arm-gnueabihf": "1.30.2", + "lightningcss-linux-arm64-gnu": "1.30.2", + "lightningcss-linux-arm64-musl": "1.30.2", + "lightningcss-linux-x64-gnu": "1.30.2", + "lightningcss-linux-x64-musl": "1.30.2", + "lightningcss-win32-arm64-msvc": "1.30.2", + "lightningcss-win32-x64-msvc": "1.30.2" + } + }, + "node_modules/lightningcss-android-arm64": { + "version": "1.30.2", + "resolved": "https://registry.npmjs.org/lightningcss-android-arm64/-/lightningcss-android-arm64-1.30.2.tgz", + "integrity": "sha512-BH9sEdOCahSgmkVhBLeU7Hc9DWeZ1Eb6wNS6Da8igvUwAe0sqROHddIlvU06q3WyXVEOYDZ6ykBZQnjTbmo4+A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-darwin-arm64": { + "version": "1.30.2", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.30.2.tgz", + "integrity": "sha512-ylTcDJBN3Hp21TdhRT5zBOIi73P6/W0qwvlFEk22fkdXchtNTOU4Qc37SkzV+EKYxLouZ6M4LG9NfZ1qkhhBWA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-darwin-x64": { + "version": "1.30.2", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.30.2.tgz", + "integrity": "sha512-oBZgKchomuDYxr7ilwLcyms6BCyLn0z8J0+ZZmfpjwg9fRVZIR5/GMXd7r9RH94iDhld3UmSjBM6nXWM2TfZTQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-freebsd-x64": { + "version": "1.30.2", + "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.30.2.tgz", + "integrity": "sha512-c2bH6xTrf4BDpK8MoGG4Bd6zAMZDAXS569UxCAGcA7IKbHNMlhGQ89eRmvpIUGfKWNVdbhSbkQaWhEoMGmGslA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm-gnueabihf": { + "version": "1.30.2", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.30.2.tgz", + "integrity": "sha512-eVdpxh4wYcm0PofJIZVuYuLiqBIakQ9uFZmipf6LF/HRj5Bgm0eb3qL/mr1smyXIS1twwOxNWndd8z0E374hiA==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm64-gnu": { + "version": "1.30.2", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.30.2.tgz", + "integrity": "sha512-UK65WJAbwIJbiBFXpxrbTNArtfuznvxAJw4Q2ZGlU8kPeDIWEX1dg3rn2veBVUylA2Ezg89ktszWbaQnxD/e3A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm64-musl": { + "version": "1.30.2", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.30.2.tgz", + "integrity": "sha512-5Vh9dGeblpTxWHpOx8iauV02popZDsCYMPIgiuw97OJ5uaDsL86cnqSFs5LZkG3ghHoX5isLgWzMs+eD1YzrnA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-x64-gnu": { + "version": "1.30.2", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.30.2.tgz", + "integrity": "sha512-Cfd46gdmj1vQ+lR6VRTTadNHu6ALuw2pKR9lYq4FnhvgBc4zWY1EtZcAc6EffShbb1MFrIPfLDXD6Xprbnni4w==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-x64-musl": { + "version": "1.30.2", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.30.2.tgz", + "integrity": "sha512-XJaLUUFXb6/QG2lGIW6aIk6jKdtjtcffUT0NKvIqhSBY3hh9Ch+1LCeH80dR9q9LBjG3ewbDjnumefsLsP6aiA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-win32-arm64-msvc": { + "version": "1.30.2", + "resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.30.2.tgz", + "integrity": "sha512-FZn+vaj7zLv//D/192WFFVA0RgHawIcHqLX9xuWiQt7P0PtdFEVaxgF9rjM/IRYHQXNnk61/H/gb2Ei+kUQ4xQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-win32-x64-msvc": { + "version": "1.30.2", + "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.30.2.tgz", + "integrity": "sha512-5g1yc73p+iAkid5phb4oVFMB45417DkRevRbt/El/gKXJk4jid+vPFF/AXbxn05Aky8PapwzZrdJShv5C0avjw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, + "license": "ISC", + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/lucide-react": { + "version": "0.561.0", + "resolved": "https://registry.npmjs.org/lucide-react/-/lucide-react-0.561.0.tgz", + "integrity": "sha512-Y59gMY38tl4/i0qewcqohPdEbieBy7SovpBL9IFebhc2mDd8x4PZSOsiFRkpPcOq6bj1r/mjH/Rk73gSlIJP2A==", + "license": "ISC", + "peerDependencies": { + "react": "^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0" + } + }, + "node_modules/magic-string": { + "version": "0.30.21", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz", + "integrity": "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.5" + } + }, + "node_modules/math-intrinsics": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", + "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "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==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "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==", + "license": "MIT", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true, + "license": "MIT" + }, + "node_modules/nanoid": { + "version": "3.3.11", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", + "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", + "dev": true, + "license": "MIT" + }, + "node_modules/node-releases": { + "version": "2.0.27", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.27.tgz", + "integrity": "sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA==", + "dev": true, + "license": "MIT" + }, + "node_modules/optionator": { + "version": "0.9.4", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", + "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", + "dev": true, + "license": "MIT", + "dependencies": { + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0", + "word-wrap": "^1.2.5" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, + "license": "MIT", + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "dev": true, + "license": "ISC" + }, + "node_modules/picomatch": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", + "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/postcss": { + "version": "8.5.6", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.6.tgz", + "integrity": "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "nanoid": "^3.3.11", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/postcss-value-parser": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", + "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/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==", + "license": "MIT" + }, + "node_modules/punycode": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/react": { + "version": "19.2.3", + "resolved": "https://registry.npmjs.org/react/-/react-19.2.3.tgz", + "integrity": "sha512-Ku/hhYbVjOQnXDZFv2+RibmLFGwFdeeKHFcOTlrt7xplBnya5OGn/hIRDsqDiSUcfORsDC7MPxwork8jBwsIWA==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-dom": { + "version": "19.2.3", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.2.3.tgz", + "integrity": "sha512-yELu4WmLPw5Mr/lmeEpox5rw3RETacE++JgHqQzd2dg+YbJuat3jH4ingc+WPZhxaoFzdv9y33G+F7Nl5O0GBg==", + "license": "MIT", + "dependencies": { + "scheduler": "^0.27.0" + }, + "peerDependencies": { + "react": "^19.2.3" + } + }, + "node_modules/react-refresh": { + "version": "0.18.0", + "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.18.0.tgz", + "integrity": "sha512-QgT5//D3jfjJb6Gsjxv0Slpj23ip+HtOpnNgnb2S5zU3CB26G/IDPGoy4RJB42wzFE46DRsstbW6tKHoKbhAxw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-router": { + "version": "7.11.0", + "resolved": "https://registry.npmjs.org/react-router/-/react-router-7.11.0.tgz", + "integrity": "sha512-uI4JkMmjbWCZc01WVP2cH7ZfSzH91JAZUDd7/nIprDgWxBV1TkkmLToFh7EbMTcMak8URFRa2YoBL/W8GWnCTQ==", + "license": "MIT", + "dependencies": { + "cookie": "^1.0.1", + "set-cookie-parser": "^2.6.0" + }, + "engines": { + "node": ">=20.0.0" + }, + "peerDependencies": { + "react": ">=18", + "react-dom": ">=18" + }, + "peerDependenciesMeta": { + "react-dom": { + "optional": true + } + } + }, + "node_modules/react-router-dom": { + "version": "7.11.0", + "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-7.11.0.tgz", + "integrity": "sha512-e49Ir/kMGRzFOOrYQBdoitq3ULigw4lKbAyKusnvtDu2t4dBX4AGYPrzNvorXmVuOyeakai6FUPW5MmibvVG8g==", + "license": "MIT", + "dependencies": { + "react-router": "7.11.0" + }, + "engines": { + "node": ">=20.0.0" + }, + "peerDependencies": { + "react": ">=18", + "react-dom": ">=18" + } + }, + "node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/rollup": { + "version": "4.53.5", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.53.5.tgz", + "integrity": "sha512-iTNAbFSlRpcHeeWu73ywU/8KuU/LZmNCSxp6fjQkJBD3ivUb8tpDrXhIxEzA05HlYMEwmtaUnb3RP+YNv162OQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "1.0.8" + }, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=18.0.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "@rollup/rollup-android-arm-eabi": "4.53.5", + "@rollup/rollup-android-arm64": "4.53.5", + "@rollup/rollup-darwin-arm64": "4.53.5", + "@rollup/rollup-darwin-x64": "4.53.5", + "@rollup/rollup-freebsd-arm64": "4.53.5", + "@rollup/rollup-freebsd-x64": "4.53.5", + "@rollup/rollup-linux-arm-gnueabihf": "4.53.5", + "@rollup/rollup-linux-arm-musleabihf": "4.53.5", + "@rollup/rollup-linux-arm64-gnu": "4.53.5", + "@rollup/rollup-linux-arm64-musl": "4.53.5", + "@rollup/rollup-linux-loong64-gnu": "4.53.5", + "@rollup/rollup-linux-ppc64-gnu": "4.53.5", + "@rollup/rollup-linux-riscv64-gnu": "4.53.5", + "@rollup/rollup-linux-riscv64-musl": "4.53.5", + "@rollup/rollup-linux-s390x-gnu": "4.53.5", + "@rollup/rollup-linux-x64-gnu": "4.53.5", + "@rollup/rollup-linux-x64-musl": "4.53.5", + "@rollup/rollup-openharmony-arm64": "4.53.5", + "@rollup/rollup-win32-arm64-msvc": "4.53.5", + "@rollup/rollup-win32-ia32-msvc": "4.53.5", + "@rollup/rollup-win32-x64-gnu": "4.53.5", + "@rollup/rollup-win32-x64-msvc": "4.53.5", + "fsevents": "~2.3.2" + } + }, + "node_modules/scheduler": { + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.27.0.tgz", + "integrity": "sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q==", + "license": "MIT" + }, + "node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/set-cookie-parser": { + "version": "2.7.2", + "resolved": "https://registry.npmjs.org/set-cookie-parser/-/set-cookie-parser-2.7.2.tgz", + "integrity": "sha512-oeM1lpU/UvhTxw+g3cIfxXHyJRc/uidd3yK1P242gzHds0udQBYzs3y8j4gCCW+ZJ7ad0yctld8RYO+bdurlvw==", + "license": "MIT" + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "license": "MIT", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/source-map-js": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/tailwind-merge": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/tailwind-merge/-/tailwind-merge-3.4.0.tgz", + "integrity": "sha512-uSaO4gnW+b3Y2aWoWfFpX62vn2sR3skfhbjsEnaBI81WD1wBLlHZe5sWf0AqjksNdYTbGBEd0UasQMT3SNV15g==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/dcastil" + } + }, + "node_modules/tailwindcss": { + "version": "4.1.18", + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-4.1.18.tgz", + "integrity": "sha512-4+Z+0yiYyEtUVCScyfHCxOYP06L5Ne+JiHhY2IjR2KWMIWhJOYZKLSGZaP5HkZ8+bY0cxfzwDE5uOmzFXyIwxw==", + "dev": true, + "license": "MIT" + }, + "node_modules/tapable": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.3.0.tgz", + "integrity": "sha512-g9ljZiwki/LfxmQADO3dEY1CbpmXT5Hm2fJ+QaGKwSXUylMybePR7/67YW7jOrrvjEgL1Fmz5kzyAjWVWLlucg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/tinyglobby": { + "version": "0.2.15", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.15.tgz", + "integrity": "sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "fdir": "^6.5.0", + "picomatch": "^4.0.3" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/SuperchupuDev" + } + }, + "node_modules/ts-api-utils": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.1.0.tgz", + "integrity": "sha512-CUgTZL1irw8u29bzrOD/nH85jqyc74D6SshFgujOIA7osm2Rz7dYH77agkx7H4FBNxDq7Cjf+IjaX/8zwFW+ZQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18.12" + }, + "peerDependencies": { + "typescript": ">=4.8.4" + } + }, + "node_modules/type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dev": true, + "license": "MIT", + "dependencies": { + "prelude-ls": "^1.2.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/typescript": { + "version": "5.9.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", + "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/typescript-eslint": { + "version": "8.50.0", + "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.50.0.tgz", + "integrity": "sha512-Q1/6yNUmCpH94fbgMUMg2/BSAr/6U7GBk61kZTv1/asghQOWOjTlp9K8mixS5NcJmm2creY+UFfGeW/+OcA64A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/eslint-plugin": "8.50.0", + "@typescript-eslint/parser": "8.50.0", + "@typescript-eslint/typescript-estree": "8.50.0", + "@typescript-eslint/utils": "8.50.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/undici-types": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.16.0.tgz", + "integrity": "sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw==", + "dev": true, + "license": "MIT" + }, + "node_modules/update-browserslist-db": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.2.3.tgz", + "integrity": "sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "escalade": "^3.2.0", + "picocolors": "^1.1.1" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/vite": { + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/vite/-/vite-7.3.0.tgz", + "integrity": "sha512-dZwN5L1VlUBewiP6H9s2+B3e3Jg96D0vzN+Ry73sOefebhYr9f94wwkMNN/9ouoU8pV1BqA1d1zGk8928cx0rg==", + "dev": true, + "license": "MIT", + "dependencies": { + "esbuild": "^0.27.0", + "fdir": "^6.5.0", + "picomatch": "^4.0.3", + "postcss": "^8.5.6", + "rollup": "^4.43.0", + "tinyglobby": "^0.2.15" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^20.19.0 || >=22.12.0", + "jiti": ">=1.21.0", + "less": "^4.0.0", + "lightningcss": "^1.21.0", + "sass": "^1.70.0", + "sass-embedded": "^1.70.0", + "stylus": ">=0.54.8", + "sugarss": "^5.0.0", + "terser": "^5.16.0", + "tsx": "^4.8.1", + "yaml": "^2.4.2" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "jiti": { + "optional": true + }, + "less": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + }, + "tsx": { + "optional": true + }, + "yaml": { + "optional": true + } + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/word-wrap": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", + "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true, + "license": "ISC" + }, + "node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/zod": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/zod/-/zod-4.2.1.tgz", + "integrity": "sha512-0wZ1IRqGGhMP76gLqz8EyfBXKk0J2qo2+H3fi4mcUP/KtTocoX08nmIAHl1Z2kJIZbZee8KOpBCSNPRgauucjw==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/colinhacks" + } + }, + "node_modules/zod-validation-error": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/zod-validation-error/-/zod-validation-error-4.0.2.tgz", + "integrity": "sha512-Q6/nZLe6jxuU80qb/4uJ4t5v2VEZ44lzQjPDhYJNztRQ4wyWc6VF3D3Kb/fAuPetZQnhS3hnajCf9CsWesghLQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18.0.0" + }, + "peerDependencies": { + "zod": "^3.25.0 || ^4.0.0" + } + }, + "node_modules/zustand": { + "version": "5.0.9", + "resolved": "https://registry.npmjs.org/zustand/-/zustand-5.0.9.tgz", + "integrity": "sha512-ALBtUj0AfjJt3uNRQoL1tL2tMvj6Gp/6e39dnfT6uzpelGru8v1tPOGBzayOWbPJvujM8JojDk3E1LxeFisBNg==", + "license": "MIT", + "engines": { + "node": ">=12.20.0" + }, + "peerDependencies": { + "@types/react": ">=18.0.0", + "immer": ">=9.0.6", + "react": ">=18.0.0", + "use-sync-external-store": ">=1.2.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "immer": { + "optional": true + }, + "react": { + "optional": true + }, + "use-sync-external-store": { + "optional": true + } + } + } + } +} diff --git a/frontend/counter-panel/package.json b/frontend/counter-panel/package.json new file mode 100644 index 0000000..a680a32 --- /dev/null +++ b/frontend/counter-panel/package.json @@ -0,0 +1,40 @@ +{ + "name": "counter-panel", + "private": true, + "version": "0.0.0", + "type": "module", + "scripts": { + "dev": "vite", + "build": "tsc -b && vite build", + "lint": "eslint .", + "preview": "vite preview" + }, + "dependencies": { + "axios": "^1.13.2", + "clsx": "^2.1.1", + "lucide-react": "^0.561.0", + "react": "^19.2.0", + "react-dom": "^19.2.0", + "react-router-dom": "^7.11.0", + "tailwind-merge": "^3.4.0", + "zustand": "^5.0.9" + }, + "devDependencies": { + "@eslint/js": "^9.39.1", + "@tailwindcss/postcss": "^4.1.18", + "@types/node": "^24.10.1", + "@types/react": "^19.2.5", + "@types/react-dom": "^19.2.3", + "@vitejs/plugin-react": "^5.1.1", + "autoprefixer": "^10.4.23", + "eslint": "^9.39.1", + "eslint-plugin-react-hooks": "^7.0.1", + "eslint-plugin-react-refresh": "^0.4.24", + "globals": "^16.5.0", + "postcss": "^8.5.6", + "tailwindcss": "^4.1.18", + "typescript": "~5.9.3", + "typescript-eslint": "^8.46.4", + "vite": "^7.2.4" + } +} diff --git a/frontend/counter-panel/postcss.config.js b/frontend/counter-panel/postcss.config.js new file mode 100644 index 0000000..af9d8dc --- /dev/null +++ b/frontend/counter-panel/postcss.config.js @@ -0,0 +1,6 @@ +export default { + plugins: { + '@tailwindcss/postcss': {}, + autoprefixer: {}, + }, +} \ No newline at end of file diff --git a/frontend/counter-panel/src/App.css b/frontend/counter-panel/src/App.css new file mode 100644 index 0000000..b9d355d --- /dev/null +++ b/frontend/counter-panel/src/App.css @@ -0,0 +1,42 @@ +#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/frontend/counter-panel/src/App.tsx b/frontend/counter-panel/src/App.tsx new file mode 100644 index 0000000..30f03a7 --- /dev/null +++ b/frontend/counter-panel/src/App.tsx @@ -0,0 +1,19 @@ +import { BrowserRouter, Routes, Route } from 'react-router-dom'; +import CounterLayout from './layouts/CounterLayout'; +import FastEntryPage from './pages/FastEntryPage'; +import CashRegisterPage from './pages/CashRegisterPage'; + +function App() { + return ( + + + }> + } /> + } /> + + + + ); +} + +export default App; \ No newline at end of file diff --git a/frontend/admin-panel/src/assets/react.svg b/frontend/counter-panel/src/assets/react.svg similarity index 100% rename from frontend/admin-panel/src/assets/react.svg rename to frontend/counter-panel/src/assets/react.svg diff --git a/frontend/counter-panel/src/hooks/useDebounce.ts b/frontend/counter-panel/src/hooks/useDebounce.ts new file mode 100644 index 0000000..082c1d5 --- /dev/null +++ b/frontend/counter-panel/src/hooks/useDebounce.ts @@ -0,0 +1,24 @@ +import { useState, useEffect } from 'react'; + +/** + * Hook para retrasar la actualización de un valor hasta que pase un tiempo de espera. + * Útil para búsquedas o cálculos en tiempo real. + */ +export function useDebounce(value: T, delay: number): T { + const [debouncedValue, setDebouncedValue] = useState(value); + + useEffect(() => { + // Configurar el timer + const handler = setTimeout(() => { + setDebouncedValue(value); + }, delay); + + // Limpiar el timer si el valor cambia antes de que termine el delay + // (esto es lo que evita llamadas excesivas) + return () => { + clearTimeout(handler); + }; + }, [value, delay]); + + return debouncedValue; +} \ No newline at end of file diff --git a/frontend/counter-panel/src/index.css b/frontend/counter-panel/src/index.css new file mode 100644 index 0000000..50af285 --- /dev/null +++ b/frontend/counter-panel/src/index.css @@ -0,0 +1,18 @@ +@import "tailwindcss"; + +@import url('https://fonts.googleapis.com/css2?family=Roboto+Mono:wght@400;500;700&family=Inter:wght@400;600&display=swap'); + +@theme { + --font-sans: 'Inter', sans-serif; + --font-mono: 'Roboto Mono', monospace; + --color-slate-850: #1e293b; +} + +body { + @apply bg-gray-100 text-slate-900 font-sans antialiased; +} + +/* Estilos para simular terminal/ticket */ +.ticket-font { + font-family: 'Roboto Mono', monospace; +} \ No newline at end of file diff --git a/frontend/counter-panel/src/layouts/CounterLayout.tsx b/frontend/counter-panel/src/layouts/CounterLayout.tsx new file mode 100644 index 0000000..533f69f --- /dev/null +++ b/frontend/counter-panel/src/layouts/CounterLayout.tsx @@ -0,0 +1,76 @@ +import { useEffect } from 'react'; +import { Outlet, useNavigate, useLocation } from 'react-router-dom'; +import { Monitor, LogOut } from 'lucide-react'; + +export default function CounterLayout() { + const navigate = useNavigate(); + const location = useLocation(); + + useEffect(() => { + const handleKeyDown = (e: KeyboardEvent) => { + // Evitar conflictos si el usuario está escribiendo en un input, + // excepto para F-Keys que suelen ser globales + + switch (e.key) { + case 'F2': + e.preventDefault(); + navigate('/'); + break; + case 'F4': + e.preventDefault(); + navigate('/cash-register'); + break; + case 'Escape': + // Lógica para cancelar o volver + break; + } + }; + + window.addEventListener('keydown', handleKeyDown); + return () => window.removeEventListener('keydown', handleKeyDown); + }, [navigate]); + + return ( +
+ {/* Header tipo Sistema Legacy pero moderno */} +
+
+
+ + SIG-CM MOSTRADOR v1.0 +
+
+
+ Sucursal: CENTRAL | Caja: 01 +
+
+ + +
+ + {/* Main Content Area */} +
+ +
+ + {/* Footer con Barra de Atajos */} +
+ + + + +
+
+ ); +} + +function ShortcutKey({ k, label, active = false }: { k: string, label: string, active?: boolean }) { + return ( +
+ {k} + {label} +
+ ); +} \ No newline at end of file diff --git a/frontend/counter-panel/src/main.tsx b/frontend/counter-panel/src/main.tsx new file mode 100644 index 0000000..bef5202 --- /dev/null +++ b/frontend/counter-panel/src/main.tsx @@ -0,0 +1,10 @@ +import { StrictMode } from 'react' +import { createRoot } from 'react-dom/client' +import './index.css' +import App from './App.tsx' + +createRoot(document.getElementById('root')!).render( + + + , +) diff --git a/frontend/counter-panel/src/pages/CashRegisterPage.tsx b/frontend/counter-panel/src/pages/CashRegisterPage.tsx new file mode 100644 index 0000000..ae5df49 --- /dev/null +++ b/frontend/counter-panel/src/pages/CashRegisterPage.tsx @@ -0,0 +1,39 @@ +export default function CashRegisterPage() { + return ( +
+

Caja Diaria

+
+
+
Total Efectivo
+
$ 15,400.00
+
+
+
Avisos Cobrados
+
12
+
+
+ +
+ + + + + + + + + + + + + + + + + {/* Más filas mock */} + +
HoraConceptoUsuarioMonto
09:15Aviso Automotores x3 díascajero1$ 4,500.00
+
+
+ ); +} \ No newline at end of file diff --git a/frontend/counter-panel/src/pages/FastEntryPage.tsx b/frontend/counter-panel/src/pages/FastEntryPage.tsx new file mode 100644 index 0000000..e9ccbfe --- /dev/null +++ b/frontend/counter-panel/src/pages/FastEntryPage.tsx @@ -0,0 +1,385 @@ +import { useState, useEffect, useRef } from 'react'; +import api from '../services/api'; +import { useDebounce } from '../hooks/useDebounce'; +import { + Printer, Save, CheckSquare, Square, Tag, + AlignLeft, AlignCenter, AlignRight, AlignJustify, + Type +} from 'lucide-react'; +import clsx from 'clsx'; + +interface Category { id: number; name: string; } +interface Operation { id: number; name: string; } + +interface PricingResult { + totalPrice: number; + baseCost: number; + extraCost: number; + surcharges: number; + discount: number; + wordCount: number; + specialCharCount: number; + details: string; + appliedPromotion: string; +} + +export default function FastEntryPage() { + const [categories, setCategories] = useState([]); + const [operations, setOperations] = useState([]); + + const [formData, setFormData] = useState({ + categoryId: '', + operationId: '', + text: '', + days: 3, + clientName: '', + }); + + const [options, setOptions] = useState({ + isBold: false, + isFrame: false, + fontSize: 'normal', // 'small', 'normal', 'large', 'extra' + alignment: 'left' // 'left', 'center', 'right', 'justify' + }); + + const [pricing, setPricing] = useState({ + totalPrice: 0, baseCost: 0, extraCost: 0, surcharges: 0, discount: 0, + wordCount: 0, specialCharCount: 0, details: '', appliedPromotion: '' + }); + + const textInputRef = useRef(null); + const debouncedText = useDebounce(formData.text, 500); + + useEffect(() => { + const fetchData = async () => { + try { + const [catRes, opRes] = await Promise.all([ + api.get('/categories'), + api.get('/operations') + ]); + setCategories(catRes.data); + setOperations(opRes.data); + } catch (error) { + console.error("Error cargando datos base", error); + } + }; + fetchData(); + }, []); + + useEffect(() => { + if (!formData.categoryId || !formData.text) { + setPricing(prev => ({ ...prev, totalPrice: 0, details: '' })); + return; + } + + const calculatePrice = async () => { + try { + const res = await api.post('/pricing/calculate', { + categoryId: parseInt(formData.categoryId), + text: formData.text, + days: formData.days, + isBold: options.isBold, + isFrame: options.isFrame, + startDate: new Date().toISOString() + }); + setPricing(res.data); + } catch (error) { + console.error("Error calculando precio", error); + } + }; + + calculatePrice(); + }, [debouncedText, formData.categoryId, formData.days, options]); + + const handleSubmit = async () => { + if (!formData.categoryId || !formData.operationId || !formData.text) { + alert("Faltan datos obligatorios."); + return; + } + + if (!confirm(`¿Confirmar cobro de $${pricing.totalPrice.toLocaleString()}?`)) return; + + try { + const startDate = new Date(); + startDate.setDate(startDate.getDate() + 1); + + await api.post('/listings', { + categoryId: parseInt(formData.categoryId), + operationId: parseInt(formData.operationId), + title: formData.text.substring(0, 40) + (formData.text.length > 40 ? '...' : ''), + description: formData.text, + price: 0, + currency: 'ARS', + status: 'Published', + userId: null, + printText: formData.text, + printStartDate: startDate.toISOString(), + printDaysCount: formData.days, + isBold: options.isBold, + isFrame: options.isFrame, + printFontSize: options.fontSize, + printAlignment: options.alignment + }); + + alert('✅ Aviso guardado y ticket generado.'); + setFormData({ ...formData, text: '', clientName: '' }); + setOptions({ isBold: false, isFrame: false, fontSize: 'normal', alignment: 'left' }); + textInputRef.current?.focus(); + + } catch (err) { + console.error(err); + alert('❌ Error al procesar el cobro.'); + } + }; + + // Helper para clases de Tailwind según estado + const getFontSizeClass = (size: string) => { + switch (size) { + case 'small': return 'text-xs'; + case 'large': return 'text-lg'; + case 'extra': return 'text-xl'; + default: return 'text-sm'; + } + }; + + const getAlignClass = (align: string) => { + switch (align) { + case 'center': return 'text-center'; + case 'right': return 'text-right'; + case 'justify': return 'text-justify'; + default: return 'text-left'; + } + }; + + return ( +
+ + {/* --- COLUMNA IZQUIERDA: INPUTS --- */} +
+
+

Nueva Publicación (F2)

+ ID TERMINAL: T-01 +
+ +
+
+
+ + +
+
+ + +
+
+ +
+ + + {/* --- Textarea limpio sin estilos condicionales --- */} + + +
+
+ Palabras: {pricing.wordCount} + {pricing.specialCharCount > 0 && Signos (+$$): {pricing.specialCharCount}} +
+ Escribir en Mayúsculas recomendado +
+
+ +
+
+ + setFormData({ ...formData, days: Math.max(1, parseInt(e.target.value) || 0) })} + min={1} + /> +
+
+ + setFormData({ ...formData, clientName: e.target.value })} + /> +
+
+
+
+ + {/* --- COLUMNA DERECHA: TOTALES Y OPCIONES --- */} +
+ + {/* Panel de Totales */} +
+
+
Total a Cobrar
+
+ ${pricing.totalPrice.toLocaleString()} +
+ +
+
+ Base ({formData.days} días) + ${pricing.baseCost.toLocaleString()} +
+ + {pricing.extraCost > 0 && ( +
+ Excedentes + +${pricing.extraCost.toLocaleString()} +
+ )} + + {pricing.surcharges > 0 && ( +
+ Adicionales (Estilo) + +${pricing.surcharges.toLocaleString()} +
+ )} + + {pricing.discount > 0 && ( +
+ Descuento + -${pricing.discount.toLocaleString()} +
+ )} +
+ + {pricing.appliedPromotion && ( +
+ ¡{pricing.appliedPromotion}! +
+ )} +
+
+ + {/* --- NUEVA BARRA DE HERRAMIENTAS (TOOLBAR) --- */} +
+ + {/* Alineación */} +
+ + + + +
+ +
+ + {/* Tamaño de Fuente */} +
+ + + +
+ +
+ + {/* Vista Previa Papel */} +
+

+ Vista Previa Impresión (Papel) +

+
+ {formData.text || "(Texto vacío)"} +
+
+ + {/* Botones Estilo Rápido (Negrita/Recuadro) */} +
+ + + +
+ + +
+
+ ); +} \ No newline at end of file diff --git a/frontend/counter-panel/src/services/api.ts b/frontend/counter-panel/src/services/api.ts new file mode 100644 index 0000000..d72471a --- /dev/null +++ b/frontend/counter-panel/src/services/api.ts @@ -0,0 +1,15 @@ +import axios from 'axios'; + +const api = axios.create({ + baseURL: import.meta.env.VITE_API_URL, // Usa la variable de entorno +}); + +api.interceptors.request.use((config) => { + const token = localStorage.getItem('token'); + if (token) { + config.headers.Authorization = `Bearer ${token}`; + } + return config; +}); + +export default api; \ No newline at end of file diff --git a/frontend/counter-panel/tsconfig.app.json b/frontend/counter-panel/tsconfig.app.json new file mode 100644 index 0000000..a9b5a59 --- /dev/null +++ b/frontend/counter-panel/tsconfig.app.json @@ -0,0 +1,28 @@ +{ + "compilerOptions": { + "tsBuildInfoFile": "./node_modules/.tmp/tsconfig.app.tsbuildinfo", + "target": "ES2022", + "useDefineForClassFields": true, + "lib": ["ES2022", "DOM", "DOM.Iterable"], + "module": "ESNext", + "types": ["vite/client"], + "skipLibCheck": true, + + /* Bundler mode */ + "moduleResolution": "bundler", + "allowImportingTsExtensions": true, + "verbatimModuleSyntax": true, + "moduleDetection": "force", + "noEmit": true, + "jsx": "react-jsx", + + /* Linting */ + "strict": true, + "noUnusedLocals": true, + "noUnusedParameters": true, + "erasableSyntaxOnly": true, + "noFallthroughCasesInSwitch": true, + "noUncheckedSideEffectImports": true + }, + "include": ["src"] +} diff --git a/frontend/counter-panel/tsconfig.json b/frontend/counter-panel/tsconfig.json new file mode 100644 index 0000000..1ffef60 --- /dev/null +++ b/frontend/counter-panel/tsconfig.json @@ -0,0 +1,7 @@ +{ + "files": [], + "references": [ + { "path": "./tsconfig.app.json" }, + { "path": "./tsconfig.node.json" } + ] +} diff --git a/frontend/counter-panel/tsconfig.node.json b/frontend/counter-panel/tsconfig.node.json new file mode 100644 index 0000000..8a67f62 --- /dev/null +++ b/frontend/counter-panel/tsconfig.node.json @@ -0,0 +1,26 @@ +{ + "compilerOptions": { + "tsBuildInfoFile": "./node_modules/.tmp/tsconfig.node.tsbuildinfo", + "target": "ES2023", + "lib": ["ES2023"], + "module": "ESNext", + "types": ["node"], + "skipLibCheck": true, + + /* Bundler mode */ + "moduleResolution": "bundler", + "allowImportingTsExtensions": true, + "verbatimModuleSyntax": true, + "moduleDetection": "force", + "noEmit": true, + + /* Linting */ + "strict": true, + "noUnusedLocals": true, + "noUnusedParameters": true, + "erasableSyntaxOnly": true, + "noFallthroughCasesInSwitch": true, + "noUncheckedSideEffectImports": true + }, + "include": ["vite.config.ts"] +} diff --git a/frontend/counter-panel/vite.config.ts b/frontend/counter-panel/vite.config.ts new file mode 100644 index 0000000..8b0f57b --- /dev/null +++ b/frontend/counter-panel/vite.config.ts @@ -0,0 +1,7 @@ +import { defineConfig } from 'vite' +import react from '@vitejs/plugin-react' + +// https://vite.dev/config/ +export default defineConfig({ + plugins: [react()], +}) diff --git a/frontend/public-web/.gitignore b/frontend/public-web/.gitignore new file mode 100644 index 0000000..a547bf3 --- /dev/null +++ b/frontend/public-web/.gitignore @@ -0,0 +1,24 @@ +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +pnpm-debug.log* +lerna-debug.log* + +node_modules +dist +dist-ssr +*.local + +# Editor directories and files +.vscode/* +!.vscode/extensions.json +.idea +.DS_Store +*.suo +*.ntvs* +*.njsproj +*.sln +*.sw? diff --git a/frontend/public-web/README.md b/frontend/public-web/README.md new file mode 100644 index 0000000..d2e7761 --- /dev/null +++ b/frontend/public-web/README.md @@ -0,0 +1,73 @@ +# React + TypeScript + Vite + +This template provides a minimal setup to get React working in Vite with HMR and some ESLint rules. + +Currently, two official plugins are available: + +- [@vitejs/plugin-react](https://github.com/vitejs/vite-plugin-react/blob/main/packages/plugin-react) uses [Babel](https://babeljs.io/) (or [oxc](https://oxc.rs) when used in [rolldown-vite](https://vite.dev/guide/rolldown)) for Fast Refresh +- [@vitejs/plugin-react-swc](https://github.com/vitejs/vite-plugin-react/blob/main/packages/plugin-react-swc) uses [SWC](https://swc.rs/) for Fast Refresh + +## React Compiler + +The React Compiler is not enabled on this template because of its impact on dev & build performances. To add it, see [this documentation](https://react.dev/learn/react-compiler/installation). + +## Expanding the ESLint configuration + +If you are developing a production application, we recommend updating the configuration to enable type-aware lint rules: + +```js +export default defineConfig([ + globalIgnores(['dist']), + { + files: ['**/*.{ts,tsx}'], + extends: [ + // Other configs... + + // Remove tseslint.configs.recommended and replace with this + tseslint.configs.recommendedTypeChecked, + // Alternatively, use this for stricter rules + tseslint.configs.strictTypeChecked, + // Optionally, add this for stylistic rules + tseslint.configs.stylisticTypeChecked, + + // Other configs... + ], + languageOptions: { + parserOptions: { + project: ['./tsconfig.node.json', './tsconfig.app.json'], + tsconfigRootDir: import.meta.dirname, + }, + // other options... + }, + }, +]) +``` + +You can also install [eslint-plugin-react-x](https://github.com/Rel1cx/eslint-react/tree/main/packages/plugins/eslint-plugin-react-x) and [eslint-plugin-react-dom](https://github.com/Rel1cx/eslint-react/tree/main/packages/plugins/eslint-plugin-react-dom) for React-specific lint rules: + +```js +// eslint.config.js +import reactX from 'eslint-plugin-react-x' +import reactDom from 'eslint-plugin-react-dom' + +export default defineConfig([ + globalIgnores(['dist']), + { + files: ['**/*.{ts,tsx}'], + extends: [ + // Other configs... + // Enable lint rules for React + reactX.configs['recommended-typescript'], + // Enable lint rules for React DOM + reactDom.configs.recommended, + ], + languageOptions: { + parserOptions: { + project: ['./tsconfig.node.json', './tsconfig.app.json'], + tsconfigRootDir: import.meta.dirname, + }, + // other options... + }, + }, +]) +``` diff --git a/frontend/public-web/eslint.config.js b/frontend/public-web/eslint.config.js new file mode 100644 index 0000000..5e6b472 --- /dev/null +++ b/frontend/public-web/eslint.config.js @@ -0,0 +1,23 @@ +import js from '@eslint/js' +import globals from 'globals' +import reactHooks from 'eslint-plugin-react-hooks' +import reactRefresh from 'eslint-plugin-react-refresh' +import tseslint from 'typescript-eslint' +import { defineConfig, globalIgnores } from 'eslint/config' + +export default defineConfig([ + globalIgnores(['dist']), + { + files: ['**/*.{ts,tsx}'], + extends: [ + js.configs.recommended, + tseslint.configs.recommended, + reactHooks.configs.flat.recommended, + reactRefresh.configs.vite, + ], + languageOptions: { + ecmaVersion: 2020, + globals: globals.browser, + }, + }, +]) diff --git a/frontend/public-web/index.html b/frontend/public-web/index.html new file mode 100644 index 0000000..9f36079 --- /dev/null +++ b/frontend/public-web/index.html @@ -0,0 +1,13 @@ + + + + + + + public-web + + +
+ + + diff --git a/frontend/public-web/package-lock.json b/frontend/public-web/package-lock.json new file mode 100644 index 0000000..f0e723a --- /dev/null +++ b/frontend/public-web/package-lock.json @@ -0,0 +1,4246 @@ +{ + "name": "public-web", + "version": "0.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "public-web", + "version": "0.0.0", + "dependencies": { + "@tailwindcss/postcss": "^4.1.18", + "axios": "^1.13.2", + "clsx": "^2.1.1", + "lucide-react": "^0.561.0", + "react": "^19.2.0", + "react-dom": "^19.2.0", + "react-router-dom": "^7.11.0", + "tailwind-merge": "^3.4.0", + "zustand": "^5.0.9" + }, + "devDependencies": { + "@eslint/js": "^9.39.1", + "@types/node": "^24.10.1", + "@types/react": "^19.2.5", + "@types/react-dom": "^19.2.3", + "@vitejs/plugin-react": "^5.1.1", + "autoprefixer": "^10.4.23", + "eslint": "^9.39.1", + "eslint-plugin-react-hooks": "^7.0.1", + "eslint-plugin-react-refresh": "^0.4.24", + "globals": "^16.5.0", + "postcss": "^8.5.6", + "tailwindcss": "^4.1.18", + "typescript": "~5.9.3", + "typescript-eslint": "^8.46.4", + "vite": "^7.2.4" + } + }, + "node_modules/@alloc/quick-lru": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@alloc/quick-lru/-/quick-lru-5.2.0.tgz", + "integrity": "sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.27.1.tgz", + "integrity": "sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-validator-identifier": "^7.27.1", + "js-tokens": "^4.0.0", + "picocolors": "^1.1.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/compat-data": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.28.5.tgz", + "integrity": "sha512-6uFXyCayocRbqhZOB+6XcuZbkMNimwfVGFji8CTZnCzOHVGvDqzvitu1re2AU5LROliz7eQPhB8CpAMvnx9EjA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.28.5.tgz", + "integrity": "sha512-e7jT4DxYvIDLk1ZHmU/m/mB19rex9sv0c2ftBtjSBv+kVM/902eh0fINUzD7UwLLNR+jU585GxUJ8/EBfAM5fw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.27.1", + "@babel/generator": "^7.28.5", + "@babel/helper-compilation-targets": "^7.27.2", + "@babel/helper-module-transforms": "^7.28.3", + "@babel/helpers": "^7.28.4", + "@babel/parser": "^7.28.5", + "@babel/template": "^7.27.2", + "@babel/traverse": "^7.28.5", + "@babel/types": "^7.28.5", + "@jridgewell/remapping": "^2.3.5", + "convert-source-map": "^2.0.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.3", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@babel/generator": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.28.5.tgz", + "integrity": "sha512-3EwLFhZ38J4VyIP6WNtt2kUdW9dokXA9Cr4IVIFHuCpZ3H8/YFOl5JjZHisrn1fATPBmKKqXzDFvh9fUwHz6CQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.28.5", + "@babel/types": "^7.28.5", + "@jridgewell/gen-mapping": "^0.3.12", + "@jridgewell/trace-mapping": "^0.3.28", + "jsesc": "^3.0.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets": { + "version": "7.27.2", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.27.2.tgz", + "integrity": "sha512-2+1thGUUWWjLTYTHZWK1n8Yga0ijBz1XAhUXcKy81rd5g6yh7hGqMp45v7cadSbEHc9G3OTv45SyneRN3ps4DQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/compat-data": "^7.27.2", + "@babel/helper-validator-option": "^7.27.1", + "browserslist": "^4.24.0", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-globals": { + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.28.0.tgz", + "integrity": "sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.27.1.tgz", + "integrity": "sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.27.1", + "@babel/types": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.28.3", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.28.3.tgz", + "integrity": "sha512-gytXUbs8k2sXS9PnQptz5o0QnpLL51SwASIORY6XaBKF88nsOT0Zw9szLqlSGQDP/4TljBAD5y98p2U1fqkdsw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-module-imports": "^7.27.1", + "@babel/helper-validator-identifier": "^7.27.1", + "@babel/traverse": "^7.28.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-plugin-utils": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.27.1.tgz", + "integrity": "sha512-1gn1Up5YXka3YYAHGKpbideQ5Yjf1tDa9qYcgysz+cNCXukyLl6DjPXhD3VRwSb8c0J9tA4b2+rHEZtc6R0tlw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz", + "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz", + "integrity": "sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-option": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.27.1.tgz", + "integrity": "sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.28.4", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.28.4.tgz", + "integrity": "sha512-HFN59MmQXGHVyYadKLVumYsA9dBFun/ldYxipEjzA4196jpLZd8UjEEBLkbEkvfYreDqJhZxYAWFPtrfhNpj4w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/template": "^7.27.2", + "@babel/types": "^7.28.4" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.28.5.tgz", + "integrity": "sha512-KKBU1VGYR7ORr3At5HAtUQ+TV3SzRCXmA/8OdDZiLDBIZxVyzXuztPjfLd3BV1PRAQGCMWWSHYhL0F8d5uHBDQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.28.5" + }, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx-self": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.27.1.tgz", + "integrity": "sha512-6UzkCs+ejGdZ5mFFC/OCUrv028ab2fp1znZmCZjAOBKiBK2jXD1O+BPSfX8X2qjJ75fZBMSnQn3Rq2mrBJK2mw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx-source": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.27.1.tgz", + "integrity": "sha512-zbwoTsBruTeKB9hSq73ha66iFeJHuaFkUbwvqElnygoNbj/jHRsSeokowZFN3CZ64IvEqcmmkVe89OPXc7ldAw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/template": { + "version": "7.27.2", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.27.2.tgz", + "integrity": "sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.27.1", + "@babel/parser": "^7.27.2", + "@babel/types": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.28.5.tgz", + "integrity": "sha512-TCCj4t55U90khlYkVV/0TfkJkAkUg3jZFA3Neb7unZT8CPok7iiRfaX0F+WnqWqt7OxhOn0uBKXCw4lbL8W0aQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.27.1", + "@babel/generator": "^7.28.5", + "@babel/helper-globals": "^7.28.0", + "@babel/parser": "^7.28.5", + "@babel/template": "^7.27.2", + "@babel/types": "^7.28.5", + "debug": "^4.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/types": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.28.5.tgz", + "integrity": "sha512-qQ5m48eI/MFLQ5PxQj4PFaprjyCTLI37ElWMmNs0K8Lk3dVeOdNpB3ks8jc7yM5CDmVC73eMVk/trk3fgmrUpA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-string-parser": "^7.27.1", + "@babel/helper-validator-identifier": "^7.28.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.27.2.tgz", + "integrity": "sha512-GZMB+a0mOMZs4MpDbj8RJp4cw+w1WV5NYD6xzgvzUJ5Ek2jerwfO2eADyI6ExDSUED+1X8aMbegahsJi+8mgpw==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.27.2.tgz", + "integrity": "sha512-DVNI8jlPa7Ujbr1yjU2PfUSRtAUZPG9I1RwW4F4xFB1Imiu2on0ADiI/c3td+KmDtVKNbi+nffGDQMfcIMkwIA==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.27.2.tgz", + "integrity": "sha512-pvz8ZZ7ot/RBphf8fv60ljmaoydPU12VuXHImtAs0XhLLw+EXBi2BLe3OYSBslR4rryHvweW5gmkKFwTiFy6KA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.27.2.tgz", + "integrity": "sha512-z8Ank4Byh4TJJOh4wpz8g2vDy75zFL0TlZlkUkEwYXuPSgX8yzep596n6mT7905kA9uHZsf/o2OJZubl2l3M7A==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.27.2.tgz", + "integrity": "sha512-davCD2Zc80nzDVRwXTcQP/28fiJbcOwvdolL0sOiOsbwBa72kegmVU0Wrh1MYrbuCL98Omp5dVhQFWRKR2ZAlg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.27.2.tgz", + "integrity": "sha512-ZxtijOmlQCBWGwbVmwOF/UCzuGIbUkqB1faQRf5akQmxRJ1ujusWsb3CVfk/9iZKr2L5SMU5wPBi1UWbvL+VQA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.27.2.tgz", + "integrity": "sha512-lS/9CN+rgqQ9czogxlMcBMGd+l8Q3Nj1MFQwBZJyoEKI50XGxwuzznYdwcav6lpOGv5BqaZXqvBSiB/kJ5op+g==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.27.2.tgz", + "integrity": "sha512-tAfqtNYb4YgPnJlEFu4c212HYjQWSO/w/h/lQaBK7RbwGIkBOuNKQI9tqWzx7Wtp7bTPaGC6MJvWI608P3wXYA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.27.2.tgz", + "integrity": "sha512-vWfq4GaIMP9AIe4yj1ZUW18RDhx6EPQKjwe7n8BbIecFtCQG4CfHGaHuh7fdfq+y3LIA2vGS/o9ZBGVxIDi9hw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.27.2.tgz", + "integrity": "sha512-hYxN8pr66NsCCiRFkHUAsxylNOcAQaxSSkHMMjcpx0si13t1LHFphxJZUiGwojB1a/Hd5OiPIqDdXONia6bhTw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.27.2.tgz", + "integrity": "sha512-MJt5BRRSScPDwG2hLelYhAAKh9imjHK5+NE/tvnRLbIqUWa+0E9N4WNMjmp/kXXPHZGqPLxggwVhz7QP8CTR8w==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.27.2.tgz", + "integrity": "sha512-lugyF1atnAT463aO6KPshVCJK5NgRnU4yb3FUumyVz+cGvZbontBgzeGFO1nF+dPueHD367a2ZXe1NtUkAjOtg==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.27.2.tgz", + "integrity": "sha512-nlP2I6ArEBewvJ2gjrrkESEZkB5mIoaTswuqNFRv/WYd+ATtUpe9Y09RnJvgvdag7he0OWgEZWhviS1OTOKixw==", + "cpu": [ + "mips64el" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.27.2.tgz", + "integrity": "sha512-C92gnpey7tUQONqg1n6dKVbx3vphKtTHJaNG2Ok9lGwbZil6DrfyecMsp9CrmXGQJmZ7iiVXvvZH6Ml5hL6XdQ==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.27.2.tgz", + "integrity": "sha512-B5BOmojNtUyN8AXlK0QJyvjEZkWwy/FKvakkTDCziX95AowLZKR6aCDhG7LeF7uMCXEJqwa8Bejz5LTPYm8AvA==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.27.2.tgz", + "integrity": "sha512-p4bm9+wsPwup5Z8f4EpfN63qNagQ47Ua2znaqGH6bqLlmJ4bx97Y9JdqxgGZ6Y8xVTixUnEkoKSHcpRlDnNr5w==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.27.2.tgz", + "integrity": "sha512-uwp2Tip5aPmH+NRUwTcfLb+W32WXjpFejTIOWZFw/v7/KnpCDKG66u4DLcurQpiYTiYwQ9B7KOeMJvLCu/OvbA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-arm64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.27.2.tgz", + "integrity": "sha512-Kj6DiBlwXrPsCRDeRvGAUb/LNrBASrfqAIok+xB0LxK8CHqxZ037viF13ugfsIpePH93mX7xfJp97cyDuTZ3cw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.27.2.tgz", + "integrity": "sha512-HwGDZ0VLVBY3Y+Nw0JexZy9o/nUAWq9MlV7cahpaXKW6TOzfVno3y3/M8Ga8u8Yr7GldLOov27xiCnqRZf0tCA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-arm64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.27.2.tgz", + "integrity": "sha512-DNIHH2BPQ5551A7oSHD0CKbwIA/Ox7+78/AWkbS5QoRzaqlev2uFayfSxq68EkonB+IKjiuxBFoV8ESJy8bOHA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.27.2.tgz", + "integrity": "sha512-/it7w9Nb7+0KFIzjalNJVR5bOzA9Vay+yIPLVHfIQYG/j+j9VTH84aNB8ExGKPU4AzfaEvN9/V4HV+F+vo8OEg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openharmony-arm64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.27.2.tgz", + "integrity": "sha512-LRBbCmiU51IXfeXk59csuX/aSaToeG7w48nMwA6049Y4J4+VbWALAuXcs+qcD04rHDuSCSRKdmY63sruDS5qag==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.27.2.tgz", + "integrity": "sha512-kMtx1yqJHTmqaqHPAzKCAkDaKsffmXkPHThSfRwZGyuqyIeBvf08KSsYXl+abf5HDAPMJIPnbBfXvP2ZC2TfHg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.27.2.tgz", + "integrity": "sha512-Yaf78O/B3Kkh+nKABUF++bvJv5Ijoy9AN1ww904rOXZFLWVc5OLOfL56W+C8F9xn5JQZa3UX6m+IktJnIb1Jjg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.27.2.tgz", + "integrity": "sha512-Iuws0kxo4yusk7sw70Xa2E2imZU5HoixzxfGCdxwBdhiDgt9vX9VUCBhqcwY7/uh//78A1hMkkROMJq9l27oLQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.27.2.tgz", + "integrity": "sha512-sRdU18mcKf7F+YgheI/zGf5alZatMUTKj/jNS6l744f9u3WFu4v7twcUI9vu4mknF4Y9aDlblIie0IM+5xxaqQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@eslint-community/eslint-utils": { + "version": "4.9.0", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.9.0.tgz", + "integrity": "sha512-ayVFHdtZ+hsq1t2Dy24wCmGXGe4q9Gu3smhLYALJrr473ZH27MsnSL+LKUlimp4BWJqMDMLmPpx/Q9R3OAlL4g==", + "dev": true, + "license": "MIT", + "dependencies": { + "eslint-visitor-keys": "^3.4.3" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" + } + }, + "node_modules/@eslint-community/eslint-utils/node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint-community/regexpp": { + "version": "4.12.2", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.2.tgz", + "integrity": "sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + } + }, + "node_modules/@eslint/config-array": { + "version": "0.21.1", + "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.21.1.tgz", + "integrity": "sha512-aw1gNayWpdI/jSYVgzN5pL0cfzU02GT3NBpeT/DXbx1/1x7ZKxFPd9bwrzygx/qiwIQiJ1sw/zD8qY/kRvlGHA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@eslint/object-schema": "^2.1.7", + "debug": "^4.3.1", + "minimatch": "^3.1.2" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/config-helpers": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.4.2.tgz", + "integrity": "sha512-gBrxN88gOIf3R7ja5K9slwNayVcZgK6SOUORm2uBzTeIEfeVaIhOpCtTox3P6R7o2jLFwLFTLnC7kU/RGcYEgw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@eslint/core": "^0.17.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/core": { + "version": "0.17.0", + "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.17.0.tgz", + "integrity": "sha512-yL/sLrpmtDaFEiUj1osRP4TI2MDz1AddJL+jZ7KSqvBuliN4xqYY54IfdN8qD8Toa6g1iloph1fxQNkjOxrrpQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@types/json-schema": "^7.0.15" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/eslintrc": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.3.3.tgz", + "integrity": "sha512-Kr+LPIUVKz2qkx1HAMH8q1q6azbqBAsXJUxBl/ODDuVPX45Z9DfwB8tPjTi6nNZ8BuM3nbJxC5zCAg5elnBUTQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^10.0.1", + "globals": "^14.0.0", + "ignore": "^5.2.0", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.1", + "minimatch": "^3.1.2", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint/eslintrc/node_modules/globals": { + "version": "14.0.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz", + "integrity": "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@eslint/js": { + "version": "9.39.2", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.39.2.tgz", + "integrity": "sha512-q1mjIoW1VX4IvSocvM/vbTiveKC4k9eLrajNEuSsmjymSDEbpGddtpfOoN7YGAqBK3NG+uqo8ia4PDTt8buCYA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://eslint.org/donate" + } + }, + "node_modules/@eslint/object-schema": { + "version": "2.1.7", + "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.7.tgz", + "integrity": "sha512-VtAOaymWVfZcmZbp6E2mympDIHvyjXs/12LqWYjVw6qjrfF+VK+fyG33kChz3nnK+SU5/NeHOqrTEHS8sXO3OA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/plugin-kit": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.4.1.tgz", + "integrity": "sha512-43/qtrDUokr7LJqoF2c3+RInu/t4zfrpYdoSDfYyhg52rwLV6TnOvdG4fXm7IkSB3wErkcmJS9iEhjVtOSEjjA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@eslint/core": "^0.17.0", + "levn": "^0.4.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@humanfs/core": { + "version": "0.19.1", + "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.1.tgz", + "integrity": "sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=18.18.0" + } + }, + "node_modules/@humanfs/node": { + "version": "0.16.7", + "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.7.tgz", + "integrity": "sha512-/zUx+yOsIrG4Y43Eh2peDeKCxlRt/gET6aHfaKpuq267qXdYDFViVHfMaLyygZOnl0kGWxFIgsBy8QFuTLUXEQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@humanfs/core": "^0.19.1", + "@humanwhocodes/retry": "^0.4.0" + }, + "engines": { + "node": ">=18.18.0" + } + }, + "node_modules/@humanwhocodes/module-importer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=12.22" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@humanwhocodes/retry": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.3.tgz", + "integrity": "sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=18.18" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.13", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", + "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.0", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/remapping": { + "version": "2.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz", + "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==", + "license": "MIT", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", + "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", + "license": "MIT" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.31", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", + "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@rolldown/pluginutils": { + "version": "1.0.0-beta.53", + "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.0-beta.53.tgz", + "integrity": "sha512-vENRlFU4YbrwVqNDZ7fLvy+JR1CRkyr01jhSiDpE1u6py3OMzQfztQU2jxykW3ALNxO4kSlqIDeYyD0Y9RcQeQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@rollup/rollup-android-arm-eabi": { + "version": "4.53.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.53.5.tgz", + "integrity": "sha512-iDGS/h7D8t7tvZ1t6+WPK04KD0MwzLZrG0se1hzBjSi5fyxlsiggoJHwh18PCFNn7tG43OWb6pdZ6Y+rMlmyNQ==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-android-arm64": { + "version": "4.53.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.53.5.tgz", + "integrity": "sha512-wrSAViWvZHBMMlWk6EJhvg8/rjxzyEhEdgfMMjREHEq11EtJ6IP6yfcCH57YAEca2Oe3FNCE9DSTgU70EIGmVw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-darwin-arm64": { + "version": "4.53.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.53.5.tgz", + "integrity": "sha512-S87zZPBmRO6u1YXQLwpveZm4JfPpAa6oHBX7/ghSiGH3rz/KDgAu1rKdGutV+WUI6tKDMbaBJomhnT30Y2t4VQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-darwin-x64": { + "version": "4.53.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.53.5.tgz", + "integrity": "sha512-YTbnsAaHo6VrAczISxgpTva8EkfQus0VPEVJCEaboHtZRIb6h6j0BNxRBOwnDciFTZLDPW5r+ZBmhL/+YpTZgA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-freebsd-arm64": { + "version": "4.53.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.53.5.tgz", + "integrity": "sha512-1T8eY2J8rKJWzaznV7zedfdhD1BqVs1iqILhmHDq/bqCUZsrMt+j8VCTHhP0vdfbHK3e1IQ7VYx3jlKqwlf+vw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-freebsd-x64": { + "version": "4.53.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.53.5.tgz", + "integrity": "sha512-sHTiuXyBJApxRn+VFMaw1U+Qsz4kcNlxQ742snICYPrY+DDL8/ZbaC4DVIB7vgZmp3jiDaKA0WpBdP0aqPJoBQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.53.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.53.5.tgz", + "integrity": "sha512-dV3T9MyAf0w8zPVLVBptVlzaXxka6xg1f16VAQmjg+4KMSTWDvhimI/Y6mp8oHwNrmnmVl9XxJ/w/mO4uIQONA==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm-musleabihf": { + "version": "4.53.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.53.5.tgz", + "integrity": "sha512-wIGYC1x/hyjP+KAu9+ewDI+fi5XSNiUi9Bvg6KGAh2TsNMA3tSEs+Sh6jJ/r4BV/bx/CyWu2ue9kDnIdRyafcQ==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-gnu": { + "version": "4.53.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.53.5.tgz", + "integrity": "sha512-Y+qVA0D9d0y2FRNiG9oM3Hut/DgODZbU9I8pLLPwAsU0tUKZ49cyV1tzmB/qRbSzGvY8lpgGkJuMyuhH7Ma+Vg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-musl": { + "version": "4.53.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.53.5.tgz", + "integrity": "sha512-juaC4bEgJsyFVfqhtGLz8mbopaWD+WeSOYr5E16y+1of6KQjc0BpwZLuxkClqY1i8sco+MdyoXPNiCkQou09+g==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-loong64-gnu": { + "version": "4.53.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.53.5.tgz", + "integrity": "sha512-rIEC0hZ17A42iXtHX+EPJVL/CakHo+tT7W0pbzdAGuWOt2jxDFh7A/lRhsNHBcqL4T36+UiAgwO8pbmn3dE8wA==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-ppc64-gnu": { + "version": "4.53.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.53.5.tgz", + "integrity": "sha512-T7l409NhUE552RcAOcmJHj3xyZ2h7vMWzcwQI0hvn5tqHh3oSoclf9WgTl+0QqffWFG8MEVZZP1/OBglKZx52Q==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-gnu": { + "version": "4.53.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.53.5.tgz", + "integrity": "sha512-7OK5/GhxbnrMcxIFoYfhV/TkknarkYC1hqUw1wU2xUN3TVRLNT5FmBv4KkheSG2xZ6IEbRAhTooTV2+R5Tk0lQ==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-musl": { + "version": "4.53.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.53.5.tgz", + "integrity": "sha512-GwuDBE/PsXaTa76lO5eLJTyr2k8QkPipAyOrs4V/KJufHCZBJ495VCGJol35grx9xryk4V+2zd3Ri+3v7NPh+w==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-s390x-gnu": { + "version": "4.53.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.53.5.tgz", + "integrity": "sha512-IAE1Ziyr1qNfnmiQLHBURAD+eh/zH1pIeJjeShleII7Vj8kyEm2PF77o+lf3WTHDpNJcu4IXJxNO0Zluro8bOw==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.53.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.53.5.tgz", + "integrity": "sha512-Pg6E+oP7GvZ4XwgRJBuSXZjcqpIW3yCBhK4BcsANvb47qMvAbCjR6E+1a/U2WXz1JJxp9/4Dno3/iSJLcm5auw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-musl": { + "version": "4.53.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.53.5.tgz", + "integrity": "sha512-txGtluxDKTxaMDzUduGP0wdfng24y1rygUMnmlUJ88fzCCULCLn7oE5kb2+tRB+MWq1QDZT6ObT5RrR8HFRKqg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-openharmony-arm64": { + "version": "4.53.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.53.5.tgz", + "integrity": "sha512-3DFiLPnTxiOQV993fMc+KO8zXHTcIjgaInrqlG8zDp1TlhYl6WgrOHuJkJQ6M8zHEcntSJsUp1XFZSY8C1DYbg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ] + }, + "node_modules/@rollup/rollup-win32-arm64-msvc": { + "version": "4.53.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.53.5.tgz", + "integrity": "sha512-nggc/wPpNTgjGg75hu+Q/3i32R00Lq1B6N1DO7MCU340MRKL3WZJMjA9U4K4gzy3dkZPXm9E1Nc81FItBVGRlA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-ia32-msvc": { + "version": "4.53.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.53.5.tgz", + "integrity": "sha512-U/54pTbdQpPLBdEzCT6NBCFAfSZMvmjr0twhnD9f4EIvlm9wy3jjQ38yQj1AGznrNO65EWQMgm/QUjuIVrYF9w==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-gnu": { + "version": "4.53.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.53.5.tgz", + "integrity": "sha512-2NqKgZSuLH9SXBBV2dWNRCZmocgSOx8OJSdpRaEcRlIfX8YrKxUT6z0F1NpvDVhOsl190UFTRh2F2WDWWCYp3A==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.53.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.53.5.tgz", + "integrity": "sha512-JRpZUhCfhZ4keB5v0fe02gQJy05GqboPOaxvjugW04RLSYYoB/9t2lx2u/tMs/Na/1NXfY8QYjgRljRpN+MjTQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@tailwindcss/node": { + "version": "4.1.18", + "resolved": "https://registry.npmjs.org/@tailwindcss/node/-/node-4.1.18.tgz", + "integrity": "sha512-DoR7U1P7iYhw16qJ49fgXUlry1t4CpXeErJHnQ44JgTSKMaZUdf17cfn5mHchfJ4KRBZRFA/Coo+MUF5+gOaCQ==", + "license": "MIT", + "dependencies": { + "@jridgewell/remapping": "^2.3.4", + "enhanced-resolve": "^5.18.3", + "jiti": "^2.6.1", + "lightningcss": "1.30.2", + "magic-string": "^0.30.21", + "source-map-js": "^1.2.1", + "tailwindcss": "4.1.18" + } + }, + "node_modules/@tailwindcss/oxide": { + "version": "4.1.18", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide/-/oxide-4.1.18.tgz", + "integrity": "sha512-EgCR5tTS5bUSKQgzeMClT6iCY3ToqE1y+ZB0AKldj809QXk1Y+3jB0upOYZrn9aGIzPtUsP7sX4QQ4XtjBB95A==", + "license": "MIT", + "engines": { + "node": ">= 10" + }, + "optionalDependencies": { + "@tailwindcss/oxide-android-arm64": "4.1.18", + "@tailwindcss/oxide-darwin-arm64": "4.1.18", + "@tailwindcss/oxide-darwin-x64": "4.1.18", + "@tailwindcss/oxide-freebsd-x64": "4.1.18", + "@tailwindcss/oxide-linux-arm-gnueabihf": "4.1.18", + "@tailwindcss/oxide-linux-arm64-gnu": "4.1.18", + "@tailwindcss/oxide-linux-arm64-musl": "4.1.18", + "@tailwindcss/oxide-linux-x64-gnu": "4.1.18", + "@tailwindcss/oxide-linux-x64-musl": "4.1.18", + "@tailwindcss/oxide-wasm32-wasi": "4.1.18", + "@tailwindcss/oxide-win32-arm64-msvc": "4.1.18", + "@tailwindcss/oxide-win32-x64-msvc": "4.1.18" + } + }, + "node_modules/@tailwindcss/oxide-android-arm64": { + "version": "4.1.18", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-android-arm64/-/oxide-android-arm64-4.1.18.tgz", + "integrity": "sha512-dJHz7+Ugr9U/diKJA0W6N/6/cjI+ZTAoxPf9Iz9BFRF2GzEX8IvXxFIi/dZBloVJX/MZGvRuFA9rqwdiIEZQ0Q==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-darwin-arm64": { + "version": "4.1.18", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-arm64/-/oxide-darwin-arm64-4.1.18.tgz", + "integrity": "sha512-Gc2q4Qhs660bhjyBSKgq6BYvwDz4G+BuyJ5H1xfhmDR3D8HnHCmT/BSkvSL0vQLy/nkMLY20PQ2OoYMO15Jd0A==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-darwin-x64": { + "version": "4.1.18", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-x64/-/oxide-darwin-x64-4.1.18.tgz", + "integrity": "sha512-FL5oxr2xQsFrc3X9o1fjHKBYBMD1QZNyc1Xzw/h5Qu4XnEBi3dZn96HcHm41c/euGV+GRiXFfh2hUCyKi/e+yw==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-freebsd-x64": { + "version": "4.1.18", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-freebsd-x64/-/oxide-freebsd-x64-4.1.18.tgz", + "integrity": "sha512-Fj+RHgu5bDodmV1dM9yAxlfJwkkWvLiRjbhuO2LEtwtlYlBgiAT4x/j5wQr1tC3SANAgD+0YcmWVrj8R9trVMA==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-linux-arm-gnueabihf": { + "version": "4.1.18", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm-gnueabihf/-/oxide-linux-arm-gnueabihf-4.1.18.tgz", + "integrity": "sha512-Fp+Wzk/Ws4dZn+LV2Nqx3IilnhH51YZoRaYHQsVq3RQvEl+71VGKFpkfHrLM/Li+kt5c0DJe/bHXK1eHgDmdiA==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-linux-arm64-gnu": { + "version": "4.1.18", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-gnu/-/oxide-linux-arm64-gnu-4.1.18.tgz", + "integrity": "sha512-S0n3jboLysNbh55Vrt7pk9wgpyTTPD0fdQeh7wQfMqLPM/Hrxi+dVsLsPrycQjGKEQk85Kgbx+6+QnYNiHalnw==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-linux-arm64-musl": { + "version": "4.1.18", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-musl/-/oxide-linux-arm64-musl-4.1.18.tgz", + "integrity": "sha512-1px92582HkPQlaaCkdRcio71p8bc8i/ap5807tPRDK/uw953cauQBT8c5tVGkOwrHMfc2Yh6UuxaH4vtTjGvHg==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-linux-x64-gnu": { + "version": "4.1.18", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-gnu/-/oxide-linux-x64-gnu-4.1.18.tgz", + "integrity": "sha512-v3gyT0ivkfBLoZGF9LyHmts0Isc8jHZyVcbzio6Wpzifg/+5ZJpDiRiUhDLkcr7f/r38SWNe7ucxmGW3j3Kb/g==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-linux-x64-musl": { + "version": "4.1.18", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-musl/-/oxide-linux-x64-musl-4.1.18.tgz", + "integrity": "sha512-bhJ2y2OQNlcRwwgOAGMY0xTFStt4/wyU6pvI6LSuZpRgKQwxTec0/3Scu91O8ir7qCR3AuepQKLU/kX99FouqQ==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-wasm32-wasi": { + "version": "4.1.18", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-wasm32-wasi/-/oxide-wasm32-wasi-4.1.18.tgz", + "integrity": "sha512-LffYTvPjODiP6PT16oNeUQJzNVyJl1cjIebq/rWWBF+3eDst5JGEFSc5cWxyRCJ0Mxl+KyIkqRxk1XPEs9x8TA==", + "bundleDependencies": [ + "@napi-rs/wasm-runtime", + "@emnapi/core", + "@emnapi/runtime", + "@tybys/wasm-util", + "@emnapi/wasi-threads", + "tslib" + ], + "cpu": [ + "wasm32" + ], + "license": "MIT", + "optional": true, + "dependencies": { + "@emnapi/core": "^1.7.1", + "@emnapi/runtime": "^1.7.1", + "@emnapi/wasi-threads": "^1.1.0", + "@napi-rs/wasm-runtime": "^1.1.0", + "@tybys/wasm-util": "^0.10.1", + "tslib": "^2.4.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@tailwindcss/oxide-win32-arm64-msvc": { + "version": "4.1.18", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-arm64-msvc/-/oxide-win32-arm64-msvc-4.1.18.tgz", + "integrity": "sha512-HjSA7mr9HmC8fu6bdsZvZ+dhjyGCLdotjVOgLA2vEqxEBZaQo9YTX4kwgEvPCpRh8o4uWc4J/wEoFzhEmjvPbA==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-win32-x64-msvc": { + "version": "4.1.18", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-x64-msvc/-/oxide-win32-x64-msvc-4.1.18.tgz", + "integrity": "sha512-bJWbyYpUlqamC8dpR7pfjA0I7vdF6t5VpUGMWRkXVE3AXgIZjYUYAK7II1GNaxR8J1SSrSrppRar8G++JekE3Q==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/postcss": { + "version": "4.1.18", + "resolved": "https://registry.npmjs.org/@tailwindcss/postcss/-/postcss-4.1.18.tgz", + "integrity": "sha512-Ce0GFnzAOuPyfV5SxjXGn0CubwGcuDB0zcdaPuCSzAa/2vII24JTkH+I6jcbXLb1ctjZMZZI6OjDaLPJQL1S0g==", + "license": "MIT", + "dependencies": { + "@alloc/quick-lru": "^5.2.0", + "@tailwindcss/node": "4.1.18", + "@tailwindcss/oxide": "4.1.18", + "postcss": "^8.4.41", + "tailwindcss": "4.1.18" + } + }, + "node_modules/@types/babel__core": { + "version": "7.20.5", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz", + "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.20.7", + "@babel/types": "^7.20.7", + "@types/babel__generator": "*", + "@types/babel__template": "*", + "@types/babel__traverse": "*" + } + }, + "node_modules/@types/babel__generator": { + "version": "7.27.0", + "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.27.0.tgz", + "integrity": "sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__template": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz", + "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__traverse": { + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.28.0.tgz", + "integrity": "sha512-8PvcXf70gTDZBgt9ptxJ8elBeBjcLOAcOtoO/mPJjtji1+CdGbHgm77om1GrsPxsiE+uXIpNSK64UYaIwQXd4Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.28.2" + } + }, + "node_modules/@types/estree": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", + "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/json-schema": { + "version": "7.0.15", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", + "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/node": { + "version": "24.10.4", + "resolved": "https://registry.npmjs.org/@types/node/-/node-24.10.4.tgz", + "integrity": "sha512-vnDVpYPMzs4wunl27jHrfmwojOGKya0xyM3sH+UE5iv5uPS6vX7UIoh6m+vQc5LGBq52HBKPIn/zcSZVzeDEZg==", + "dev": true, + "license": "MIT", + "dependencies": { + "undici-types": "~7.16.0" + } + }, + "node_modules/@types/react": { + "version": "19.2.7", + "resolved": "https://registry.npmjs.org/@types/react/-/react-19.2.7.tgz", + "integrity": "sha512-MWtvHrGZLFttgeEj28VXHxpmwYbor/ATPYbBfSFZEIRK0ecCFLl2Qo55z52Hss+UV9CRN7trSeq1zbgx7YDWWg==", + "devOptional": true, + "license": "MIT", + "dependencies": { + "csstype": "^3.2.2" + } + }, + "node_modules/@types/react-dom": { + "version": "19.2.3", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-19.2.3.tgz", + "integrity": "sha512-jp2L/eY6fn+KgVVQAOqYItbF0VY/YApe5Mz2F0aykSO8gx31bYCZyvSeYxCHKvzHG5eZjc+zyaS5BrBWya2+kQ==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "@types/react": "^19.2.0" + } + }, + "node_modules/@typescript-eslint/eslint-plugin": { + "version": "8.50.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.50.0.tgz", + "integrity": "sha512-O7QnmOXYKVtPrfYzMolrCTfkezCJS9+ljLdKW/+DCvRsc3UAz+sbH6Xcsv7p30+0OwUbeWfUDAQE0vpabZ3QLg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/regexpp": "^4.10.0", + "@typescript-eslint/scope-manager": "8.50.0", + "@typescript-eslint/type-utils": "8.50.0", + "@typescript-eslint/utils": "8.50.0", + "@typescript-eslint/visitor-keys": "8.50.0", + "ignore": "^7.0.0", + "natural-compare": "^1.4.0", + "ts-api-utils": "^2.1.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "@typescript-eslint/parser": "^8.50.0", + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/eslint-plugin/node_modules/ignore": { + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.5.tgz", + "integrity": "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/@typescript-eslint/parser": { + "version": "8.50.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.50.0.tgz", + "integrity": "sha512-6/cmF2piao+f6wSxUsJLZjck7OQsYyRtcOZS02k7XINSNlz93v6emM8WutDQSXnroG2xwYlEVHJI+cPA7CPM3Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/scope-manager": "8.50.0", + "@typescript-eslint/types": "8.50.0", + "@typescript-eslint/typescript-estree": "8.50.0", + "@typescript-eslint/visitor-keys": "8.50.0", + "debug": "^4.3.4" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/project-service": { + "version": "8.50.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.50.0.tgz", + "integrity": "sha512-Cg/nQcL1BcoTijEWyx4mkVC56r8dj44bFDvBdygifuS20f3OZCHmFbjF34DPSi07kwlFvqfv/xOLnJ5DquxSGQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/tsconfig-utils": "^8.50.0", + "@typescript-eslint/types": "^8.50.0", + "debug": "^4.3.4" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/scope-manager": { + "version": "8.50.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.50.0.tgz", + "integrity": "sha512-xCwfuCZjhIqy7+HKxBLrDVT5q/iq7XBVBXLn57RTIIpelLtEIZHXAF/Upa3+gaCpeV1NNS5Z9A+ID6jn50VD4A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.50.0", + "@typescript-eslint/visitor-keys": "8.50.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/tsconfig-utils": { + "version": "8.50.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.50.0.tgz", + "integrity": "sha512-vxd3G/ybKTSlm31MOA96gqvrRGv9RJ7LGtZCn2Vrc5htA0zCDvcMqUkifcjrWNNKXHUU3WCkYOzzVSFBd0wa2w==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/type-utils": { + "version": "8.50.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.50.0.tgz", + "integrity": "sha512-7OciHT2lKCewR0mFoBrvZJ4AXTMe/sYOe87289WAViOocEmDjjv8MvIOT2XESuKj9jp8u3SZYUSh89QA4S1kQw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.50.0", + "@typescript-eslint/typescript-estree": "8.50.0", + "@typescript-eslint/utils": "8.50.0", + "debug": "^4.3.4", + "ts-api-utils": "^2.1.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/types": { + "version": "8.50.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.50.0.tgz", + "integrity": "sha512-iX1mgmGrXdANhhITbpp2QQM2fGehBse9LbTf0sidWK6yg/NE+uhV5dfU1g6EYPlcReYmkE9QLPq/2irKAmtS9w==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/typescript-estree": { + "version": "8.50.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.50.0.tgz", + "integrity": "sha512-W7SVAGBR/IX7zm1t70Yujpbk+zdPq/u4soeFSknWFdXIFuWsBGBOUu/Tn/I6KHSKvSh91OiMuaSnYp3mtPt5IQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/project-service": "8.50.0", + "@typescript-eslint/tsconfig-utils": "8.50.0", + "@typescript-eslint/types": "8.50.0", + "@typescript-eslint/visitor-keys": "8.50.0", + "debug": "^4.3.4", + "minimatch": "^9.0.4", + "semver": "^7.6.0", + "tinyglobby": "^0.2.15", + "ts-api-utils": "^2.1.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/brace-expansion": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", + "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/semver": { + "version": "7.7.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", + "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@typescript-eslint/utils": { + "version": "8.50.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.50.0.tgz", + "integrity": "sha512-87KgUXET09CRjGCi2Ejxy3PULXna63/bMYv72tCAlDJC3Yqwln0HiFJ3VJMst2+mEtNtZu5oFvX4qJGjKsnAgg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.7.0", + "@typescript-eslint/scope-manager": "8.50.0", + "@typescript-eslint/types": "8.50.0", + "@typescript-eslint/typescript-estree": "8.50.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/visitor-keys": { + "version": "8.50.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.50.0.tgz", + "integrity": "sha512-Xzmnb58+Db78gT/CCj/PVCvK+zxbnsw6F+O1oheYszJbBSdEjVhQi3C/Xttzxgi/GLmpvOggRs1RFpiJ8+c34Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.50.0", + "eslint-visitor-keys": "^4.2.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@vitejs/plugin-react": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-5.1.2.tgz", + "integrity": "sha512-EcA07pHJouywpzsoTUqNh5NwGayl2PPVEJKUSinGGSxFGYn+shYbqMGBg6FXDqgXum9Ou/ecb+411ssw8HImJQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.28.5", + "@babel/plugin-transform-react-jsx-self": "^7.27.1", + "@babel/plugin-transform-react-jsx-source": "^7.27.1", + "@rolldown/pluginutils": "1.0.0-beta.53", + "@types/babel__core": "^7.20.5", + "react-refresh": "^0.18.0" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "peerDependencies": { + "vite": "^4.2.0 || ^5.0.0 || ^6.0.0 || ^7.0.0" + } + }, + "node_modules/acorn": { + "version": "8.15.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz", + "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", + "dev": true, + "license": "MIT", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true, + "license": "Python-2.0" + }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", + "license": "MIT" + }, + "node_modules/autoprefixer": { + "version": "10.4.23", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.23.tgz", + "integrity": "sha512-YYTXSFulfwytnjAPlw8QHncHJmlvFKtczb8InXaAx9Q0LbfDnfEYDE55omerIJKihhmU61Ft+cAOSzQVaBUmeA==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/autoprefixer" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "browserslist": "^4.28.1", + "caniuse-lite": "^1.0.30001760", + "fraction.js": "^5.3.4", + "picocolors": "^1.1.1", + "postcss-value-parser": "^4.2.0" + }, + "bin": { + "autoprefixer": "bin/autoprefixer" + }, + "engines": { + "node": "^10 || ^12 || >=14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/axios": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.13.2.tgz", + "integrity": "sha512-VPk9ebNqPcy5lRGuSlKx752IlDatOjT9paPlm8A7yOuW2Fbvp4X3JznJtT4f0GzGLLiWE9W8onz51SqLYwzGaA==", + "license": "MIT", + "dependencies": { + "follow-redirects": "^1.15.6", + "form-data": "^4.0.4", + "proxy-from-env": "^1.1.0" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true, + "license": "MIT" + }, + "node_modules/baseline-browser-mapping": { + "version": "2.9.9", + "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.9.9.tgz", + "integrity": "sha512-V8fbOCSeOFvlDj7LLChUcqbZrdKD9RU/VR260piF1790vT0mfLSwGc/Qzxv3IqiTukOpNtItePa0HBpMAj7MDg==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "baseline-browser-mapping": "dist/cli.js" + } + }, + "node_modules/brace-expansion": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/browserslist": { + "version": "4.28.1", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.1.tgz", + "integrity": "sha512-ZC5Bd0LgJXgwGqUknZY/vkUQ04r8NXnJZ3yYi4vDmSiZmC/pdSN0NbNRPxZpbtO4uAfDUAFffO8IZoM3Gj8IkA==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "baseline-browser-mapping": "^2.9.0", + "caniuse-lite": "^1.0.30001759", + "electron-to-chromium": "^1.5.263", + "node-releases": "^2.0.27", + "update-browserslist-db": "^1.2.0" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/call-bind-apply-helpers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", + "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001760", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001760.tgz", + "integrity": "sha512-7AAMPcueWELt1p3mi13HR/LHH0TJLT11cnwDJEs3xA4+CK/PLKeO9Kl1oru24htkyUKtkGCvAx4ohB0Ttry8Dw==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "CC-BY-4.0" + }, + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/clsx": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz", + "integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true, + "license": "MIT" + }, + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "license": "MIT", + "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", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true, + "license": "MIT" + }, + "node_modules/convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "dev": true, + "license": "MIT" + }, + "node_modules/cookie": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-1.1.1.tgz", + "integrity": "sha512-ei8Aos7ja0weRpFzJnEA9UHJ/7XQmqglbRwnf2ATjcB9Wq874VKH9kfjjirM6UhU2/E5fFYadylyhFldcqSidQ==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/cross-spawn": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", + "dev": true, + "license": "MIT", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/csstype": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz", + "integrity": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==", + "devOptional": true, + "license": "MIT" + }, + "node_modules/debug": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "license": "MIT", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/detect-libc": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz", + "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==", + "license": "Apache-2.0", + "engines": { + "node": ">=8" + } + }, + "node_modules/dunder-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", + "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "es-errors": "^1.3.0", + "gopd": "^1.2.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/electron-to-chromium": { + "version": "1.5.267", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.267.tgz", + "integrity": "sha512-0Drusm6MVRXSOJpGbaSVgcQsuB4hEkMpHXaVstcPmhu5LIedxs1xNK/nIxmQIU/RPC0+1/o0AVZfBTkTNJOdUw==", + "dev": true, + "license": "ISC" + }, + "node_modules/enhanced-resolve": { + "version": "5.18.4", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.18.4.tgz", + "integrity": "sha512-LgQMM4WXU3QI+SYgEc2liRgznaD5ojbmY3sb8LxyguVkIg5FxdpTkvk72te2R38/TGKxH634oLxXRGY6d7AP+Q==", + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.4", + "tapable": "^2.2.0" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/es-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==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-object-atoms": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", + "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-set-tostringtag": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", + "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/esbuild": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.27.2.tgz", + "integrity": "sha512-HyNQImnsOC7X9PMNaCIeAm4ISCQXs5a5YasTXVliKv4uuBo1dKrG0A+uQS8M5eXjVMnLg3WgXaKvprHlFJQffw==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.27.2", + "@esbuild/android-arm": "0.27.2", + "@esbuild/android-arm64": "0.27.2", + "@esbuild/android-x64": "0.27.2", + "@esbuild/darwin-arm64": "0.27.2", + "@esbuild/darwin-x64": "0.27.2", + "@esbuild/freebsd-arm64": "0.27.2", + "@esbuild/freebsd-x64": "0.27.2", + "@esbuild/linux-arm": "0.27.2", + "@esbuild/linux-arm64": "0.27.2", + "@esbuild/linux-ia32": "0.27.2", + "@esbuild/linux-loong64": "0.27.2", + "@esbuild/linux-mips64el": "0.27.2", + "@esbuild/linux-ppc64": "0.27.2", + "@esbuild/linux-riscv64": "0.27.2", + "@esbuild/linux-s390x": "0.27.2", + "@esbuild/linux-x64": "0.27.2", + "@esbuild/netbsd-arm64": "0.27.2", + "@esbuild/netbsd-x64": "0.27.2", + "@esbuild/openbsd-arm64": "0.27.2", + "@esbuild/openbsd-x64": "0.27.2", + "@esbuild/openharmony-arm64": "0.27.2", + "@esbuild/sunos-x64": "0.27.2", + "@esbuild/win32-arm64": "0.27.2", + "@esbuild/win32-ia32": "0.27.2", + "@esbuild/win32-x64": "0.27.2" + } + }, + "node_modules/escalade": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint": { + "version": "9.39.2", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.39.2.tgz", + "integrity": "sha512-LEyamqS7W5HB3ujJyvi0HQK/dtVINZvd5mAAp9eT5S/ujByGjiZLCzPcHVzuXbpJDJF/cxwHlfceVUDZ2lnSTw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.8.0", + "@eslint-community/regexpp": "^4.12.1", + "@eslint/config-array": "^0.21.1", + "@eslint/config-helpers": "^0.4.2", + "@eslint/core": "^0.17.0", + "@eslint/eslintrc": "^3.3.1", + "@eslint/js": "9.39.2", + "@eslint/plugin-kit": "^0.4.1", + "@humanfs/node": "^0.16.6", + "@humanwhocodes/module-importer": "^1.0.1", + "@humanwhocodes/retry": "^0.4.2", + "@types/estree": "^1.0.6", + "ajv": "^6.12.4", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.6", + "debug": "^4.3.2", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^8.4.0", + "eslint-visitor-keys": "^4.2.1", + "espree": "^10.4.0", + "esquery": "^1.5.0", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^8.0.0", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "ignore": "^5.2.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.1.2", + "natural-compare": "^1.4.0", + "optionator": "^0.9.3" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://eslint.org/donate" + }, + "peerDependencies": { + "jiti": "*" + }, + "peerDependenciesMeta": { + "jiti": { + "optional": true + } + } + }, + "node_modules/eslint-plugin-react-hooks": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-7.0.1.tgz", + "integrity": "sha512-O0d0m04evaNzEPoSW+59Mezf8Qt0InfgGIBJnpC0h3NH/WjUAR7BIKUfysC6todmtiZ/A0oUVS8Gce0WhBrHsA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.24.4", + "@babel/parser": "^7.24.4", + "hermes-parser": "^0.25.1", + "zod": "^3.25.0 || ^4.0.0", + "zod-validation-error": "^3.5.0 || ^4.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 || ^9.0.0" + } + }, + "node_modules/eslint-plugin-react-refresh": { + "version": "0.4.26", + "resolved": "https://registry.npmjs.org/eslint-plugin-react-refresh/-/eslint-plugin-react-refresh-0.4.26.tgz", + "integrity": "sha512-1RETEylht2O6FM/MvgnyvT+8K21wLqDNg4qD51Zj3guhjt433XbnnkVttHMyaVyAFD03QSV4LPS5iE3VQmO7XQ==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "eslint": ">=8.40" + } + }, + "node_modules/eslint-scope": { + "version": "8.4.0", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.4.0.tgz", + "integrity": "sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-visitor-keys": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz", + "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/espree": { + "version": "10.4.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-10.4.0.tgz", + "integrity": "sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "acorn": "^8.15.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^4.2.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/esquery": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz", + "integrity": "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "estraverse": "^5.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", + "dev": true, + "license": "MIT" + }, + "node_modules/fdir": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", + "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, + "node_modules/file-entry-cache": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz", + "integrity": "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "flat-cache": "^4.0.0" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "license": "MIT", + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/flat-cache": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz", + "integrity": "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==", + "dev": true, + "license": "MIT", + "dependencies": { + "flatted": "^3.2.9", + "keyv": "^4.5.4" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/flatted": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.3.tgz", + "integrity": "sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==", + "dev": true, + "license": "ISC" + }, + "node_modules/follow-redirects": { + "version": "1.15.11", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.11.tgz", + "integrity": "sha512-deG2P0JfjrTxl50XGCDyfI97ZGVCxIpfKYmfyrQ54n5FO/0gfIES8C/Psl6kWVDolizcaaxZJnTS0QSMxvnsBQ==", + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "license": "MIT", + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, + "node_modules/form-data": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.5.tgz", + "integrity": "sha512-8RipRLol37bNs2bhoV67fiTEvdTrbMUYcFTiy3+wuuOnUog2QBHCZWXDRijWQfAkhBj2Uf5UnVaiWwA5vdd82w==", + "license": "MIT", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "es-set-tostringtag": "^2.1.0", + "hasown": "^2.0.2", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/fraction.js": { + "version": "5.3.4", + "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-5.3.4.tgz", + "integrity": "sha512-1X1NTtiJphryn/uLQz3whtY6jK3fTqoE3ohKs0tT+Ujr1W59oopxmoEh7Lu5p6vBaPbgoM0bzveAW4Qi5RyWDQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": "*" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/rawify" + } + }, + "node_modules/fsevents": { + "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, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/get-intrinsic": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", + "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "function-bind": "^1.1.2", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "math-intrinsics": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", + "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/globals": { + "version": "16.5.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-16.5.0.tgz", + "integrity": "sha512-c/c15i26VrJ4IRt5Z89DnIzCGDn9EcebibhAOjw5ibqEHsE1wLUgkPn9RDmNcUKyU87GeaL633nyJ+pplFR2ZQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/gopd": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "license": "ISC" + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/has-symbols": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-tostringtag": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", + "license": "MIT", + "dependencies": { + "has-symbols": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/hermes-estree": { + "version": "0.25.1", + "resolved": "https://registry.npmjs.org/hermes-estree/-/hermes-estree-0.25.1.tgz", + "integrity": "sha512-0wUoCcLp+5Ev5pDW2OriHC2MJCbwLwuRx+gAqMTOkGKJJiBCLjtrvy4PWUGn6MIVefecRpzoOZ/UV6iGdOr+Cw==", + "dev": true, + "license": "MIT" + }, + "node_modules/hermes-parser": { + "version": "0.25.1", + "resolved": "https://registry.npmjs.org/hermes-parser/-/hermes-parser-0.25.1.tgz", + "integrity": "sha512-6pEjquH3rqaI6cYAXYPcz9MS4rY6R4ngRgrgfDshRptUZIc3lw0MCIJIGDj9++mfySOuPTHB4nrSW99BCvOPIA==", + "dev": true, + "license": "MIT", + "dependencies": { + "hermes-estree": "0.25.1" + } + }, + "node_modules/ignore": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", + "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/import-fresh": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz", + "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true, + "license": "ISC" + }, + "node_modules/jiti": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-2.6.1.tgz", + "integrity": "sha512-ekilCSN1jwRvIbgeg/57YFh8qQDNbwDb9xT/qu2DAHbFFZUicIl4ygVaAvzveMhMVr3LnpSKTNnwt8PoOfmKhQ==", + "license": "MIT", + "bin": { + "jiti": "lib/jiti-cli.mjs" + } + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/js-yaml": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.1.tgz", + "integrity": "sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==", + "dev": true, + "license": "MIT", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/jsesc": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", + "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", + "dev": true, + "license": "MIT", + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/json-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true, + "license": "MIT" + }, + "node_modules/json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", + "dev": true, + "license": "MIT" + }, + "node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "dev": true, + "license": "MIT", + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/keyv": { + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", + "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", + "dev": true, + "license": "MIT", + "dependencies": { + "json-buffer": "3.0.1" + } + }, + "node_modules/levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/lightningcss": { + "version": "1.30.2", + "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.30.2.tgz", + "integrity": "sha512-utfs7Pr5uJyyvDETitgsaqSyjCb2qNRAtuqUeWIAKztsOYdcACf2KtARYXg2pSvhkt+9NfoaNY7fxjl6nuMjIQ==", + "license": "MPL-2.0", + "dependencies": { + "detect-libc": "^2.0.3" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "optionalDependencies": { + "lightningcss-android-arm64": "1.30.2", + "lightningcss-darwin-arm64": "1.30.2", + "lightningcss-darwin-x64": "1.30.2", + "lightningcss-freebsd-x64": "1.30.2", + "lightningcss-linux-arm-gnueabihf": "1.30.2", + "lightningcss-linux-arm64-gnu": "1.30.2", + "lightningcss-linux-arm64-musl": "1.30.2", + "lightningcss-linux-x64-gnu": "1.30.2", + "lightningcss-linux-x64-musl": "1.30.2", + "lightningcss-win32-arm64-msvc": "1.30.2", + "lightningcss-win32-x64-msvc": "1.30.2" + } + }, + "node_modules/lightningcss-android-arm64": { + "version": "1.30.2", + "resolved": "https://registry.npmjs.org/lightningcss-android-arm64/-/lightningcss-android-arm64-1.30.2.tgz", + "integrity": "sha512-BH9sEdOCahSgmkVhBLeU7Hc9DWeZ1Eb6wNS6Da8igvUwAe0sqROHddIlvU06q3WyXVEOYDZ6ykBZQnjTbmo4+A==", + "cpu": [ + "arm64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-darwin-arm64": { + "version": "1.30.2", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.30.2.tgz", + "integrity": "sha512-ylTcDJBN3Hp21TdhRT5zBOIi73P6/W0qwvlFEk22fkdXchtNTOU4Qc37SkzV+EKYxLouZ6M4LG9NfZ1qkhhBWA==", + "cpu": [ + "arm64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-darwin-x64": { + "version": "1.30.2", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.30.2.tgz", + "integrity": "sha512-oBZgKchomuDYxr7ilwLcyms6BCyLn0z8J0+ZZmfpjwg9fRVZIR5/GMXd7r9RH94iDhld3UmSjBM6nXWM2TfZTQ==", + "cpu": [ + "x64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-freebsd-x64": { + "version": "1.30.2", + "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.30.2.tgz", + "integrity": "sha512-c2bH6xTrf4BDpK8MoGG4Bd6zAMZDAXS569UxCAGcA7IKbHNMlhGQ89eRmvpIUGfKWNVdbhSbkQaWhEoMGmGslA==", + "cpu": [ + "x64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm-gnueabihf": { + "version": "1.30.2", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.30.2.tgz", + "integrity": "sha512-eVdpxh4wYcm0PofJIZVuYuLiqBIakQ9uFZmipf6LF/HRj5Bgm0eb3qL/mr1smyXIS1twwOxNWndd8z0E374hiA==", + "cpu": [ + "arm" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm64-gnu": { + "version": "1.30.2", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.30.2.tgz", + "integrity": "sha512-UK65WJAbwIJbiBFXpxrbTNArtfuznvxAJw4Q2ZGlU8kPeDIWEX1dg3rn2veBVUylA2Ezg89ktszWbaQnxD/e3A==", + "cpu": [ + "arm64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm64-musl": { + "version": "1.30.2", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.30.2.tgz", + "integrity": "sha512-5Vh9dGeblpTxWHpOx8iauV02popZDsCYMPIgiuw97OJ5uaDsL86cnqSFs5LZkG3ghHoX5isLgWzMs+eD1YzrnA==", + "cpu": [ + "arm64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-x64-gnu": { + "version": "1.30.2", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.30.2.tgz", + "integrity": "sha512-Cfd46gdmj1vQ+lR6VRTTadNHu6ALuw2pKR9lYq4FnhvgBc4zWY1EtZcAc6EffShbb1MFrIPfLDXD6Xprbnni4w==", + "cpu": [ + "x64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-x64-musl": { + "version": "1.30.2", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.30.2.tgz", + "integrity": "sha512-XJaLUUFXb6/QG2lGIW6aIk6jKdtjtcffUT0NKvIqhSBY3hh9Ch+1LCeH80dR9q9LBjG3ewbDjnumefsLsP6aiA==", + "cpu": [ + "x64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-win32-arm64-msvc": { + "version": "1.30.2", + "resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.30.2.tgz", + "integrity": "sha512-FZn+vaj7zLv//D/192WFFVA0RgHawIcHqLX9xuWiQt7P0PtdFEVaxgF9rjM/IRYHQXNnk61/H/gb2Ei+kUQ4xQ==", + "cpu": [ + "arm64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-win32-x64-msvc": { + "version": "1.30.2", + "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.30.2.tgz", + "integrity": "sha512-5g1yc73p+iAkid5phb4oVFMB45417DkRevRbt/El/gKXJk4jid+vPFF/AXbxn05Aky8PapwzZrdJShv5C0avjw==", + "cpu": [ + "x64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, + "license": "ISC", + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/lucide-react": { + "version": "0.561.0", + "resolved": "https://registry.npmjs.org/lucide-react/-/lucide-react-0.561.0.tgz", + "integrity": "sha512-Y59gMY38tl4/i0qewcqohPdEbieBy7SovpBL9IFebhc2mDd8x4PZSOsiFRkpPcOq6bj1r/mjH/Rk73gSlIJP2A==", + "license": "ISC", + "peerDependencies": { + "react": "^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0" + } + }, + "node_modules/magic-string": { + "version": "0.30.21", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz", + "integrity": "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==", + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.5" + } + }, + "node_modules/math-intrinsics": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", + "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "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==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "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==", + "license": "MIT", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true, + "license": "MIT" + }, + "node_modules/nanoid": { + "version": "3.3.11", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", + "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", + "dev": true, + "license": "MIT" + }, + "node_modules/node-releases": { + "version": "2.0.27", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.27.tgz", + "integrity": "sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA==", + "dev": true, + "license": "MIT" + }, + "node_modules/optionator": { + "version": "0.9.4", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", + "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", + "dev": true, + "license": "MIT", + "dependencies": { + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0", + "word-wrap": "^1.2.5" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, + "license": "MIT", + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "license": "ISC" + }, + "node_modules/picomatch": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", + "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/postcss": { + "version": "8.5.6", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.6.tgz", + "integrity": "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "nanoid": "^3.3.11", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/postcss-value-parser": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", + "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/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==", + "license": "MIT" + }, + "node_modules/punycode": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/react": { + "version": "19.2.3", + "resolved": "https://registry.npmjs.org/react/-/react-19.2.3.tgz", + "integrity": "sha512-Ku/hhYbVjOQnXDZFv2+RibmLFGwFdeeKHFcOTlrt7xplBnya5OGn/hIRDsqDiSUcfORsDC7MPxwork8jBwsIWA==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-dom": { + "version": "19.2.3", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.2.3.tgz", + "integrity": "sha512-yELu4WmLPw5Mr/lmeEpox5rw3RETacE++JgHqQzd2dg+YbJuat3jH4ingc+WPZhxaoFzdv9y33G+F7Nl5O0GBg==", + "license": "MIT", + "dependencies": { + "scheduler": "^0.27.0" + }, + "peerDependencies": { + "react": "^19.2.3" + } + }, + "node_modules/react-refresh": { + "version": "0.18.0", + "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.18.0.tgz", + "integrity": "sha512-QgT5//D3jfjJb6Gsjxv0Slpj23ip+HtOpnNgnb2S5zU3CB26G/IDPGoy4RJB42wzFE46DRsstbW6tKHoKbhAxw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-router": { + "version": "7.11.0", + "resolved": "https://registry.npmjs.org/react-router/-/react-router-7.11.0.tgz", + "integrity": "sha512-uI4JkMmjbWCZc01WVP2cH7ZfSzH91JAZUDd7/nIprDgWxBV1TkkmLToFh7EbMTcMak8URFRa2YoBL/W8GWnCTQ==", + "license": "MIT", + "dependencies": { + "cookie": "^1.0.1", + "set-cookie-parser": "^2.6.0" + }, + "engines": { + "node": ">=20.0.0" + }, + "peerDependencies": { + "react": ">=18", + "react-dom": ">=18" + }, + "peerDependenciesMeta": { + "react-dom": { + "optional": true + } + } + }, + "node_modules/react-router-dom": { + "version": "7.11.0", + "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-7.11.0.tgz", + "integrity": "sha512-e49Ir/kMGRzFOOrYQBdoitq3ULigw4lKbAyKusnvtDu2t4dBX4AGYPrzNvorXmVuOyeakai6FUPW5MmibvVG8g==", + "license": "MIT", + "dependencies": { + "react-router": "7.11.0" + }, + "engines": { + "node": ">=20.0.0" + }, + "peerDependencies": { + "react": ">=18", + "react-dom": ">=18" + } + }, + "node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/rollup": { + "version": "4.53.5", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.53.5.tgz", + "integrity": "sha512-iTNAbFSlRpcHeeWu73ywU/8KuU/LZmNCSxp6fjQkJBD3ivUb8tpDrXhIxEzA05HlYMEwmtaUnb3RP+YNv162OQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "1.0.8" + }, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=18.0.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "@rollup/rollup-android-arm-eabi": "4.53.5", + "@rollup/rollup-android-arm64": "4.53.5", + "@rollup/rollup-darwin-arm64": "4.53.5", + "@rollup/rollup-darwin-x64": "4.53.5", + "@rollup/rollup-freebsd-arm64": "4.53.5", + "@rollup/rollup-freebsd-x64": "4.53.5", + "@rollup/rollup-linux-arm-gnueabihf": "4.53.5", + "@rollup/rollup-linux-arm-musleabihf": "4.53.5", + "@rollup/rollup-linux-arm64-gnu": "4.53.5", + "@rollup/rollup-linux-arm64-musl": "4.53.5", + "@rollup/rollup-linux-loong64-gnu": "4.53.5", + "@rollup/rollup-linux-ppc64-gnu": "4.53.5", + "@rollup/rollup-linux-riscv64-gnu": "4.53.5", + "@rollup/rollup-linux-riscv64-musl": "4.53.5", + "@rollup/rollup-linux-s390x-gnu": "4.53.5", + "@rollup/rollup-linux-x64-gnu": "4.53.5", + "@rollup/rollup-linux-x64-musl": "4.53.5", + "@rollup/rollup-openharmony-arm64": "4.53.5", + "@rollup/rollup-win32-arm64-msvc": "4.53.5", + "@rollup/rollup-win32-ia32-msvc": "4.53.5", + "@rollup/rollup-win32-x64-gnu": "4.53.5", + "@rollup/rollup-win32-x64-msvc": "4.53.5", + "fsevents": "~2.3.2" + } + }, + "node_modules/scheduler": { + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.27.0.tgz", + "integrity": "sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q==", + "license": "MIT" + }, + "node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/set-cookie-parser": { + "version": "2.7.2", + "resolved": "https://registry.npmjs.org/set-cookie-parser/-/set-cookie-parser-2.7.2.tgz", + "integrity": "sha512-oeM1lpU/UvhTxw+g3cIfxXHyJRc/uidd3yK1P242gzHds0udQBYzs3y8j4gCCW+ZJ7ad0yctld8RYO+bdurlvw==", + "license": "MIT" + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "license": "MIT", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/source-map-js": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/tailwind-merge": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/tailwind-merge/-/tailwind-merge-3.4.0.tgz", + "integrity": "sha512-uSaO4gnW+b3Y2aWoWfFpX62vn2sR3skfhbjsEnaBI81WD1wBLlHZe5sWf0AqjksNdYTbGBEd0UasQMT3SNV15g==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/dcastil" + } + }, + "node_modules/tailwindcss": { + "version": "4.1.18", + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-4.1.18.tgz", + "integrity": "sha512-4+Z+0yiYyEtUVCScyfHCxOYP06L5Ne+JiHhY2IjR2KWMIWhJOYZKLSGZaP5HkZ8+bY0cxfzwDE5uOmzFXyIwxw==", + "license": "MIT" + }, + "node_modules/tapable": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.3.0.tgz", + "integrity": "sha512-g9ljZiwki/LfxmQADO3dEY1CbpmXT5Hm2fJ+QaGKwSXUylMybePR7/67YW7jOrrvjEgL1Fmz5kzyAjWVWLlucg==", + "license": "MIT", + "engines": { + "node": ">=6" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/tinyglobby": { + "version": "0.2.15", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.15.tgz", + "integrity": "sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "fdir": "^6.5.0", + "picomatch": "^4.0.3" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/SuperchupuDev" + } + }, + "node_modules/ts-api-utils": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.1.0.tgz", + "integrity": "sha512-CUgTZL1irw8u29bzrOD/nH85jqyc74D6SshFgujOIA7osm2Rz7dYH77agkx7H4FBNxDq7Cjf+IjaX/8zwFW+ZQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18.12" + }, + "peerDependencies": { + "typescript": ">=4.8.4" + } + }, + "node_modules/type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dev": true, + "license": "MIT", + "dependencies": { + "prelude-ls": "^1.2.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/typescript": { + "version": "5.9.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", + "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/typescript-eslint": { + "version": "8.50.0", + "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.50.0.tgz", + "integrity": "sha512-Q1/6yNUmCpH94fbgMUMg2/BSAr/6U7GBk61kZTv1/asghQOWOjTlp9K8mixS5NcJmm2creY+UFfGeW/+OcA64A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/eslint-plugin": "8.50.0", + "@typescript-eslint/parser": "8.50.0", + "@typescript-eslint/typescript-estree": "8.50.0", + "@typescript-eslint/utils": "8.50.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/undici-types": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.16.0.tgz", + "integrity": "sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw==", + "dev": true, + "license": "MIT" + }, + "node_modules/update-browserslist-db": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.2.3.tgz", + "integrity": "sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "escalade": "^3.2.0", + "picocolors": "^1.1.1" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/vite": { + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/vite/-/vite-7.3.0.tgz", + "integrity": "sha512-dZwN5L1VlUBewiP6H9s2+B3e3Jg96D0vzN+Ry73sOefebhYr9f94wwkMNN/9ouoU8pV1BqA1d1zGk8928cx0rg==", + "dev": true, + "license": "MIT", + "dependencies": { + "esbuild": "^0.27.0", + "fdir": "^6.5.0", + "picomatch": "^4.0.3", + "postcss": "^8.5.6", + "rollup": "^4.43.0", + "tinyglobby": "^0.2.15" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^20.19.0 || >=22.12.0", + "jiti": ">=1.21.0", + "less": "^4.0.0", + "lightningcss": "^1.21.0", + "sass": "^1.70.0", + "sass-embedded": "^1.70.0", + "stylus": ">=0.54.8", + "sugarss": "^5.0.0", + "terser": "^5.16.0", + "tsx": "^4.8.1", + "yaml": "^2.4.2" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "jiti": { + "optional": true + }, + "less": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + }, + "tsx": { + "optional": true + }, + "yaml": { + "optional": true + } + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/word-wrap": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", + "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true, + "license": "ISC" + }, + "node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/zod": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/zod/-/zod-4.2.1.tgz", + "integrity": "sha512-0wZ1IRqGGhMP76gLqz8EyfBXKk0J2qo2+H3fi4mcUP/KtTocoX08nmIAHl1Z2kJIZbZee8KOpBCSNPRgauucjw==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/colinhacks" + } + }, + "node_modules/zod-validation-error": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/zod-validation-error/-/zod-validation-error-4.0.2.tgz", + "integrity": "sha512-Q6/nZLe6jxuU80qb/4uJ4t5v2VEZ44lzQjPDhYJNztRQ4wyWc6VF3D3Kb/fAuPetZQnhS3hnajCf9CsWesghLQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18.0.0" + }, + "peerDependencies": { + "zod": "^3.25.0 || ^4.0.0" + } + }, + "node_modules/zustand": { + "version": "5.0.9", + "resolved": "https://registry.npmjs.org/zustand/-/zustand-5.0.9.tgz", + "integrity": "sha512-ALBtUj0AfjJt3uNRQoL1tL2tMvj6Gp/6e39dnfT6uzpelGru8v1tPOGBzayOWbPJvujM8JojDk3E1LxeFisBNg==", + "license": "MIT", + "engines": { + "node": ">=12.20.0" + }, + "peerDependencies": { + "@types/react": ">=18.0.0", + "immer": ">=9.0.6", + "react": ">=18.0.0", + "use-sync-external-store": ">=1.2.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "immer": { + "optional": true + }, + "react": { + "optional": true + }, + "use-sync-external-store": { + "optional": true + } + } + } + } +} diff --git a/frontend/public-web/package.json b/frontend/public-web/package.json new file mode 100644 index 0000000..a185bbe --- /dev/null +++ b/frontend/public-web/package.json @@ -0,0 +1,40 @@ +{ + "name": "public-web", + "private": true, + "version": "0.0.0", + "type": "module", + "scripts": { + "dev": "vite", + "build": "tsc -b && vite build", + "lint": "eslint .", + "preview": "vite preview" + }, + "dependencies": { + "@tailwindcss/postcss": "^4.1.18", + "axios": "^1.13.2", + "clsx": "^2.1.1", + "lucide-react": "^0.561.0", + "react": "^19.2.0", + "react-dom": "^19.2.0", + "react-router-dom": "^7.11.0", + "tailwind-merge": "^3.4.0", + "zustand": "^5.0.9" + }, + "devDependencies": { + "@eslint/js": "^9.39.1", + "@types/node": "^24.10.1", + "@types/react": "^19.2.5", + "@types/react-dom": "^19.2.3", + "@vitejs/plugin-react": "^5.1.1", + "autoprefixer": "^10.4.23", + "eslint": "^9.39.1", + "eslint-plugin-react-hooks": "^7.0.1", + "eslint-plugin-react-refresh": "^0.4.24", + "globals": "^16.5.0", + "postcss": "^8.5.6", + "tailwindcss": "^4.1.18", + "typescript": "~5.9.3", + "typescript-eslint": "^8.46.4", + "vite": "^7.2.4" + } +} diff --git a/frontend/public-web/postcss.config.js b/frontend/public-web/postcss.config.js new file mode 100644 index 0000000..1c87846 --- /dev/null +++ b/frontend/public-web/postcss.config.js @@ -0,0 +1,6 @@ +export default { + plugins: { + '@tailwindcss/postcss': {}, + autoprefixer: {}, + }, +} diff --git a/frontend/public-web/src/App.css b/frontend/public-web/src/App.css new file mode 100644 index 0000000..b9d355d --- /dev/null +++ b/frontend/public-web/src/App.css @@ -0,0 +1,42 @@ +#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/frontend/public-web/src/App.tsx b/frontend/public-web/src/App.tsx new file mode 100644 index 0000000..bbcf153 --- /dev/null +++ b/frontend/public-web/src/App.tsx @@ -0,0 +1,42 @@ +import { BrowserRouter, Routes, Route } from 'react-router-dom'; +import HomePage from './pages/HomePage'; +import ListingDetailPage from './pages/ListingDetailPage'; + +function App() { + return ( + +
+
+ +
+ + + } /> + } /> + + +
+
+

© 2024 SIG-CM Clasificados Multicanal.

+
+
+
+
+ ); +} + +export default App; \ No newline at end of file diff --git a/frontend/public-web/src/components/ListingCard.tsx b/frontend/public-web/src/components/ListingCard.tsx new file mode 100644 index 0000000..4628eeb --- /dev/null +++ b/frontend/public-web/src/components/ListingCard.tsx @@ -0,0 +1,45 @@ +import type { Listing } from '../types'; +import { MapPin } from 'lucide-react'; +import { Link } from 'react-router-dom'; + +export default function ListingCard({ listing }: { listing: Listing }) { + const baseUrl = import.meta.env.VITE_BASE_URL; + + // Lógica de imagen: Si viene del backend, la usamos. Si no, placeholder local o remoto. + const imageUrl = listing.mainImageUrl + ? `${baseUrl}${listing.mainImageUrl}` + : 'https://placehold.co/400x300?text=Sin+Foto'; // placehold.co es más rápido y fiable que via.placeholder + + return ( + +
+
+ {listing.title} { + // Fallback si la imagen falla al cargar + e.currentTarget.src = 'https://placehold.co/400x300?text=Error+Carga'; + }} + /> +
+ Ver +
+
+
+
+ {listing.currency} {listing.price.toLocaleString()} +
+

+ {listing.title} +

+
+ + Ver detalles +
+
+
+ + ); +} \ No newline at end of file diff --git a/frontend/public-web/src/components/SearchBar.tsx b/frontend/public-web/src/components/SearchBar.tsx new file mode 100644 index 0000000..98e2fef --- /dev/null +++ b/frontend/public-web/src/components/SearchBar.tsx @@ -0,0 +1,35 @@ +import { Search } from 'lucide-react'; +import { useState } from 'react'; + +interface SearchBarProps { + onSearch?: (query: string) => void; +} + +export default function SearchBar({ onSearch }: SearchBarProps) { + const [query, setQuery] = useState(''); + + const handleSearch = (e: React.FormEvent) => { + e.preventDefault(); + if (onSearch) { + onSearch(query); + } + }; + + return ( +
+ setQuery(e.target.value)} + /> + +
+ ); +} \ No newline at end of file diff --git a/frontend/public-web/src/index.css b/frontend/public-web/src/index.css new file mode 100644 index 0000000..1089f03 --- /dev/null +++ b/frontend/public-web/src/index.css @@ -0,0 +1,17 @@ +@import "tailwindcss"; + +@import url('https://fonts.googleapis.com/css2?family=Inter:wght@300;400;500;600;700&display=swap'); + +@theme { + --font-sans: 'Inter', sans-serif; + --color-primary-50: #f0f9ff; + --color-primary-100: #e0f2fe; + --color-primary-500: #0ea5e9; + --color-primary-600: #0284c7; + --color-primary-900: #0c4a6e; +} + +body { + /* En v4 @apply funciona, pero requiere que el import esté arriba */ + @apply bg-gray-50 text-gray-900 font-sans; +} \ No newline at end of file diff --git a/frontend/public-web/src/main.tsx b/frontend/public-web/src/main.tsx new file mode 100644 index 0000000..bef5202 --- /dev/null +++ b/frontend/public-web/src/main.tsx @@ -0,0 +1,10 @@ +import { StrictMode } from 'react' +import { createRoot } from 'react-dom/client' +import './index.css' +import App from './App.tsx' + +createRoot(document.getElementById('root')!).render( + + + , +) diff --git a/frontend/public-web/src/pages/HomePage.tsx b/frontend/public-web/src/pages/HomePage.tsx new file mode 100644 index 0000000..9fa42c7 --- /dev/null +++ b/frontend/public-web/src/pages/HomePage.tsx @@ -0,0 +1,94 @@ +import { useEffect, useState } from 'react'; +import SearchBar from '../components/SearchBar'; +import ListingCard from '../components/ListingCard'; +import { publicService } from '../services/publicService'; +import type { Listing, Category } from '../types'; + +export default function HomePage() { + const [listings, setListings] = useState([]); + const [categories, setCategories] = useState([]); + const [loading, setLoading] = useState(true); + + useEffect(() => { + loadInitialData(); + }, []); + + const loadInitialData = async () => { + setLoading(true); + try { + const [latestListings, cats] = await Promise.all([ + publicService.getLatestListings(), + publicService.getCategories() + ]); + setListings(latestListings); + setCategories(cats); + } catch (e) { + console.error(e); + } finally { + setLoading(false); + } + }; + + const handleSearch = async (query: string) => { + setLoading(true); + try { + const results = await publicService.searchListings(query); + setListings(results); + } catch (e) { + console.error(e); + } finally { + setLoading(false); + } + }; + + const mainCategories = categories.filter(c => !c.parentId); + + return ( +
+ {/* Hero Section */} +
+
+
+

Encuentra tu próximo objetivo

+

Clasificados verificados de Autos, Propiedades y más.

+
+ +
+
+
+ + {/* Categories Quick Links */} +
+
+ {mainCategories.map(cat => ( + + ))} +
+
+ + {/* Latest Listings */} +
+

+ {loading ? 'Cargando...' : 'Resultados Recientes'} +

+ + {!loading && listings.length === 0 && ( +
+ No se encontraron avisos con esos criterios. +
+ )} + +
+ {listings.map(listing => ( + + ))} +
+
+
+ ); +} \ No newline at end of file diff --git a/frontend/public-web/src/pages/ListingDetailPage.tsx b/frontend/public-web/src/pages/ListingDetailPage.tsx new file mode 100644 index 0000000..4aca27f --- /dev/null +++ b/frontend/public-web/src/pages/ListingDetailPage.tsx @@ -0,0 +1,118 @@ +import { useEffect, useState } from 'react'; +import { useParams } from 'react-router-dom'; +import { publicService } from '../services/publicService'; +import type { ListingDetail } from '../types'; +import { Calendar, Tag, ChevronLeft } from 'lucide-react'; + +export default function ListingDetailPage() { + const { id } = useParams(); + const [detail, setDetail] = useState(null); + const [loading, setLoading] = useState(true); + const [activeImage, setActiveImage] = useState(''); + + useEffect(() => { + if (id) { + publicService.getListingDetail(parseInt(id)) + .then(data => { + setDetail(data); + if (data.images.length > 0) { + setActiveImage(data.images[0].url); + } + }) + .catch(err => console.error(err)) + .finally(() => setLoading(false)); + } + }, [id]); + + if (loading) return
Cargando...
; + if (!detail) return
Aviso no encontrado.
; + + const { listing, attributes, images } = detail; + const baseUrl = import.meta.env.VITE_BASE_URL; // Ajustar puerto según backend launchSettings + + return ( +
+ + Volver al listado + + +
+ {/* Galería de Fotos */} +
+
+ {activeImage ? ( + {listing.title} + ) : ( +
Sin imágenes
+ )} +
+ {images.length > 1 && ( +
+ {images.map(img => ( + + ))} +
+ )} +
+ + {/* Información Principal */} +
+
+
+ + Clasificado #{listing.id} + + + + {new Date(listing.createdAt).toLocaleDateString()} + +
+ +

{listing.title}

+
+ {listing.currency} {listing.price.toLocaleString()} +
+ + + +
+ + {/* Atributos Dinámicos */} +
+

+ + Características +

+
+ {attributes.map(attr => ( +
+ {attr.attributeName} + {attr.value} +
+ ))} + {attributes.length === 0 &&

Sin características adicionales.

} +
+
+ +
+

Descripción

+

+ {listing.description || "Sin descripción proporcionada."} +

+
+
+
+
+ ); +} \ No newline at end of file diff --git a/frontend/public-web/src/services/api.ts b/frontend/public-web/src/services/api.ts new file mode 100644 index 0000000..f62cb5a --- /dev/null +++ b/frontend/public-web/src/services/api.ts @@ -0,0 +1,7 @@ +import axios from 'axios'; + +const api = axios.create({ + baseURL: import.meta.env.VITE_API_URL, // Usa la variable de entorno +}); + +export default api; \ No newline at end of file diff --git a/frontend/public-web/src/services/publicService.ts b/frontend/public-web/src/services/publicService.ts new file mode 100644 index 0000000..9c20608 --- /dev/null +++ b/frontend/public-web/src/services/publicService.ts @@ -0,0 +1,26 @@ +import api from './api'; +import type { Listing, Category, ListingDetail } from '../types'; + +export const publicService = { + getLatestListings: async (): Promise => { + const response = await api.get('/listings'); + return response.data; + }, + + searchListings: async (query: string): Promise => { + const response = await api.get('/listings', { + params: { q: query } + }); + return response.data; + }, + + getListingDetail: async (id: number): Promise => { + const response = await api.get(`/listings/${id}`); + return response.data; + }, + + getCategories: async (): Promise => { + const response = await api.get('/categories'); + return response.data; + } +}; \ No newline at end of file diff --git a/frontend/public-web/src/types/index.ts b/frontend/public-web/src/types/index.ts new file mode 100644 index 0000000..cef30c6 --- /dev/null +++ b/frontend/public-web/src/types/index.ts @@ -0,0 +1,41 @@ +export interface Listing { + id: number; + title: string; + description: string; + price: number; + currency: string; + categoryId: number; + operationId: number; + createdAt: string; + mainImageUrl?: string; + images?: ListingImage[]; +} + +export interface ListingAttribute { + id: number; + listingId: number; + attributeDefinitionId: number; + value: string; + attributeName: string; +} + +export interface ListingImage { + id: number; + listingId: number; + url: string; + isMainInfo: boolean; + displayOrder: number; +} + +export interface ListingDetail { + listing: Listing; + attributes: ListingAttribute[]; + images: ListingImage[]; +} + +export interface Category { + id: number; + name: string; + parentId?: number; + subcategories?: Category[]; +} \ No newline at end of file diff --git a/frontend/public-web/tailwind.config.js b/frontend/public-web/tailwind.config.js new file mode 100644 index 0000000..1c6aa6c --- /dev/null +++ b/frontend/public-web/tailwind.config.js @@ -0,0 +1,24 @@ +/** @type {import('tailwindcss').Config} */ +export default { + content: [ + "./index.html", + "./src/**/*.{js,ts,jsx,tsx}", + ], + theme: { + extend: { + colors: { + primary: { + 50: '#f0f9ff', + 100: '#e0f2fe', + 500: '#0ea5e9', + 600: '#0284c7', + 900: '#0c4a6e', + } + }, + fontFamily: { + sans: ['Inter', 'sans-serif'], + } + }, + }, + plugins: [], +} diff --git a/frontend/public-web/tsconfig.app.json b/frontend/public-web/tsconfig.app.json new file mode 100644 index 0000000..a9b5a59 --- /dev/null +++ b/frontend/public-web/tsconfig.app.json @@ -0,0 +1,28 @@ +{ + "compilerOptions": { + "tsBuildInfoFile": "./node_modules/.tmp/tsconfig.app.tsbuildinfo", + "target": "ES2022", + "useDefineForClassFields": true, + "lib": ["ES2022", "DOM", "DOM.Iterable"], + "module": "ESNext", + "types": ["vite/client"], + "skipLibCheck": true, + + /* Bundler mode */ + "moduleResolution": "bundler", + "allowImportingTsExtensions": true, + "verbatimModuleSyntax": true, + "moduleDetection": "force", + "noEmit": true, + "jsx": "react-jsx", + + /* Linting */ + "strict": true, + "noUnusedLocals": true, + "noUnusedParameters": true, + "erasableSyntaxOnly": true, + "noFallthroughCasesInSwitch": true, + "noUncheckedSideEffectImports": true + }, + "include": ["src"] +} diff --git a/frontend/public-web/tsconfig.json b/frontend/public-web/tsconfig.json new file mode 100644 index 0000000..1ffef60 --- /dev/null +++ b/frontend/public-web/tsconfig.json @@ -0,0 +1,7 @@ +{ + "files": [], + "references": [ + { "path": "./tsconfig.app.json" }, + { "path": "./tsconfig.node.json" } + ] +} diff --git a/frontend/public-web/tsconfig.node.json b/frontend/public-web/tsconfig.node.json new file mode 100644 index 0000000..8a67f62 --- /dev/null +++ b/frontend/public-web/tsconfig.node.json @@ -0,0 +1,26 @@ +{ + "compilerOptions": { + "tsBuildInfoFile": "./node_modules/.tmp/tsconfig.node.tsbuildinfo", + "target": "ES2023", + "lib": ["ES2023"], + "module": "ESNext", + "types": ["node"], + "skipLibCheck": true, + + /* Bundler mode */ + "moduleResolution": "bundler", + "allowImportingTsExtensions": true, + "verbatimModuleSyntax": true, + "moduleDetection": "force", + "noEmit": true, + + /* Linting */ + "strict": true, + "noUnusedLocals": true, + "noUnusedParameters": true, + "erasableSyntaxOnly": true, + "noFallthroughCasesInSwitch": true, + "noUncheckedSideEffectImports": true + }, + "include": ["vite.config.ts"] +} diff --git a/frontend/public-web/vite.config.ts b/frontend/public-web/vite.config.ts new file mode 100644 index 0000000..8b0f57b --- /dev/null +++ b/frontend/public-web/vite.config.ts @@ -0,0 +1,7 @@ +import { defineConfig } from 'vite' +import react from '@vitejs/plugin-react' + +// https://vite.dev/config/ +export default defineConfig({ + plugins: [react()], +}) diff --git a/frontend/publish-wizard/package-lock.json b/frontend/publish-wizard/package-lock.json index 2cbf0f7..d08df9c 100644 --- a/frontend/publish-wizard/package-lock.json +++ b/frontend/publish-wizard/package-lock.json @@ -8,6 +8,7 @@ "name": "publish-wizard", "version": "0.0.0", "dependencies": { + "@tailwindcss/postcss": "^4.1.18", "axios": "^1.13.2", "clsx": "^2.1.1", "framer-motion": "^12.23.26", @@ -36,6 +37,18 @@ "vite": "^7.2.4" } }, + "node_modules/@alloc/quick-lru": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@alloc/quick-lru/-/quick-lru-5.2.0.tgz", + "integrity": "sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/@babel/code-frame": { "version": "7.27.1", "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.27.1.tgz", @@ -973,7 +986,6 @@ "version": "0.3.13", "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", - "dev": true, "license": "MIT", "dependencies": { "@jridgewell/sourcemap-codec": "^1.5.0", @@ -984,7 +996,6 @@ "version": "2.3.5", "resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz", "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==", - "dev": true, "license": "MIT", "dependencies": { "@jridgewell/gen-mapping": "^0.3.5", @@ -995,7 +1006,6 @@ "version": "3.1.2", "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", - "dev": true, "license": "MIT", "engines": { "node": ">=6.0.0" @@ -1005,14 +1015,12 @@ "version": "1.5.5", "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", - "dev": true, "license": "MIT" }, "node_modules/@jridgewell/trace-mapping": { "version": "0.3.31", "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", - "dev": true, "license": "MIT", "dependencies": { "@jridgewell/resolve-uri": "^3.1.0", @@ -1334,6 +1342,262 @@ "win32" ] }, + "node_modules/@tailwindcss/node": { + "version": "4.1.18", + "resolved": "https://registry.npmjs.org/@tailwindcss/node/-/node-4.1.18.tgz", + "integrity": "sha512-DoR7U1P7iYhw16qJ49fgXUlry1t4CpXeErJHnQ44JgTSKMaZUdf17cfn5mHchfJ4KRBZRFA/Coo+MUF5+gOaCQ==", + "license": "MIT", + "dependencies": { + "@jridgewell/remapping": "^2.3.4", + "enhanced-resolve": "^5.18.3", + "jiti": "^2.6.1", + "lightningcss": "1.30.2", + "magic-string": "^0.30.21", + "source-map-js": "^1.2.1", + "tailwindcss": "4.1.18" + } + }, + "node_modules/@tailwindcss/oxide": { + "version": "4.1.18", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide/-/oxide-4.1.18.tgz", + "integrity": "sha512-EgCR5tTS5bUSKQgzeMClT6iCY3ToqE1y+ZB0AKldj809QXk1Y+3jB0upOYZrn9aGIzPtUsP7sX4QQ4XtjBB95A==", + "license": "MIT", + "engines": { + "node": ">= 10" + }, + "optionalDependencies": { + "@tailwindcss/oxide-android-arm64": "4.1.18", + "@tailwindcss/oxide-darwin-arm64": "4.1.18", + "@tailwindcss/oxide-darwin-x64": "4.1.18", + "@tailwindcss/oxide-freebsd-x64": "4.1.18", + "@tailwindcss/oxide-linux-arm-gnueabihf": "4.1.18", + "@tailwindcss/oxide-linux-arm64-gnu": "4.1.18", + "@tailwindcss/oxide-linux-arm64-musl": "4.1.18", + "@tailwindcss/oxide-linux-x64-gnu": "4.1.18", + "@tailwindcss/oxide-linux-x64-musl": "4.1.18", + "@tailwindcss/oxide-wasm32-wasi": "4.1.18", + "@tailwindcss/oxide-win32-arm64-msvc": "4.1.18", + "@tailwindcss/oxide-win32-x64-msvc": "4.1.18" + } + }, + "node_modules/@tailwindcss/oxide-android-arm64": { + "version": "4.1.18", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-android-arm64/-/oxide-android-arm64-4.1.18.tgz", + "integrity": "sha512-dJHz7+Ugr9U/diKJA0W6N/6/cjI+ZTAoxPf9Iz9BFRF2GzEX8IvXxFIi/dZBloVJX/MZGvRuFA9rqwdiIEZQ0Q==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-darwin-arm64": { + "version": "4.1.18", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-arm64/-/oxide-darwin-arm64-4.1.18.tgz", + "integrity": "sha512-Gc2q4Qhs660bhjyBSKgq6BYvwDz4G+BuyJ5H1xfhmDR3D8HnHCmT/BSkvSL0vQLy/nkMLY20PQ2OoYMO15Jd0A==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-darwin-x64": { + "version": "4.1.18", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-x64/-/oxide-darwin-x64-4.1.18.tgz", + "integrity": "sha512-FL5oxr2xQsFrc3X9o1fjHKBYBMD1QZNyc1Xzw/h5Qu4XnEBi3dZn96HcHm41c/euGV+GRiXFfh2hUCyKi/e+yw==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-freebsd-x64": { + "version": "4.1.18", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-freebsd-x64/-/oxide-freebsd-x64-4.1.18.tgz", + "integrity": "sha512-Fj+RHgu5bDodmV1dM9yAxlfJwkkWvLiRjbhuO2LEtwtlYlBgiAT4x/j5wQr1tC3SANAgD+0YcmWVrj8R9trVMA==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-linux-arm-gnueabihf": { + "version": "4.1.18", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm-gnueabihf/-/oxide-linux-arm-gnueabihf-4.1.18.tgz", + "integrity": "sha512-Fp+Wzk/Ws4dZn+LV2Nqx3IilnhH51YZoRaYHQsVq3RQvEl+71VGKFpkfHrLM/Li+kt5c0DJe/bHXK1eHgDmdiA==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-linux-arm64-gnu": { + "version": "4.1.18", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-gnu/-/oxide-linux-arm64-gnu-4.1.18.tgz", + "integrity": "sha512-S0n3jboLysNbh55Vrt7pk9wgpyTTPD0fdQeh7wQfMqLPM/Hrxi+dVsLsPrycQjGKEQk85Kgbx+6+QnYNiHalnw==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-linux-arm64-musl": { + "version": "4.1.18", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-musl/-/oxide-linux-arm64-musl-4.1.18.tgz", + "integrity": "sha512-1px92582HkPQlaaCkdRcio71p8bc8i/ap5807tPRDK/uw953cauQBT8c5tVGkOwrHMfc2Yh6UuxaH4vtTjGvHg==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-linux-x64-gnu": { + "version": "4.1.18", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-gnu/-/oxide-linux-x64-gnu-4.1.18.tgz", + "integrity": "sha512-v3gyT0ivkfBLoZGF9LyHmts0Isc8jHZyVcbzio6Wpzifg/+5ZJpDiRiUhDLkcr7f/r38SWNe7ucxmGW3j3Kb/g==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-linux-x64-musl": { + "version": "4.1.18", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-musl/-/oxide-linux-x64-musl-4.1.18.tgz", + "integrity": "sha512-bhJ2y2OQNlcRwwgOAGMY0xTFStt4/wyU6pvI6LSuZpRgKQwxTec0/3Scu91O8ir7qCR3AuepQKLU/kX99FouqQ==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-wasm32-wasi": { + "version": "4.1.18", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-wasm32-wasi/-/oxide-wasm32-wasi-4.1.18.tgz", + "integrity": "sha512-LffYTvPjODiP6PT16oNeUQJzNVyJl1cjIebq/rWWBF+3eDst5JGEFSc5cWxyRCJ0Mxl+KyIkqRxk1XPEs9x8TA==", + "bundleDependencies": [ + "@napi-rs/wasm-runtime", + "@emnapi/core", + "@emnapi/runtime", + "@tybys/wasm-util", + "@emnapi/wasi-threads", + "tslib" + ], + "cpu": [ + "wasm32" + ], + "license": "MIT", + "optional": true, + "dependencies": { + "@emnapi/core": "^1.7.1", + "@emnapi/runtime": "^1.7.1", + "@emnapi/wasi-threads": "^1.1.0", + "@napi-rs/wasm-runtime": "^1.1.0", + "@tybys/wasm-util": "^0.10.1", + "tslib": "^2.4.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@tailwindcss/oxide-win32-arm64-msvc": { + "version": "4.1.18", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-arm64-msvc/-/oxide-win32-arm64-msvc-4.1.18.tgz", + "integrity": "sha512-HjSA7mr9HmC8fu6bdsZvZ+dhjyGCLdotjVOgLA2vEqxEBZaQo9YTX4kwgEvPCpRh8o4uWc4J/wEoFzhEmjvPbA==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-win32-x64-msvc": { + "version": "4.1.18", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-x64-msvc/-/oxide-win32-x64-msvc-4.1.18.tgz", + "integrity": "sha512-bJWbyYpUlqamC8dpR7pfjA0I7vdF6t5VpUGMWRkXVE3AXgIZjYUYAK7II1GNaxR8J1SSrSrppRar8G++JekE3Q==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/postcss": { + "version": "4.1.18", + "resolved": "https://registry.npmjs.org/@tailwindcss/postcss/-/postcss-4.1.18.tgz", + "integrity": "sha512-Ce0GFnzAOuPyfV5SxjXGn0CubwGcuDB0zcdaPuCSzAa/2vII24JTkH+I6jcbXLb1ctjZMZZI6OjDaLPJQL1S0g==", + "license": "MIT", + "dependencies": { + "@alloc/quick-lru": "^5.2.0", + "@tailwindcss/node": "4.1.18", + "@tailwindcss/oxide": "4.1.18", + "postcss": "^8.4.41", + "tailwindcss": "4.1.18" + } + }, "node_modules/@types/babel__core": { "version": "7.20.5", "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz", @@ -2073,6 +2337,15 @@ "node": ">=0.4.0" } }, + "node_modules/detect-libc": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz", + "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==", + "license": "Apache-2.0", + "engines": { + "node": ">=8" + } + }, "node_modules/dunder-proto": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", @@ -2094,6 +2367,19 @@ "dev": true, "license": "ISC" }, + "node_modules/enhanced-resolve": { + "version": "5.18.4", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.18.4.tgz", + "integrity": "sha512-LgQMM4WXU3QI+SYgEc2liRgznaD5ojbmY3sb8LxyguVkIg5FxdpTkvk72te2R38/TGKxH634oLxXRGY6d7AP+Q==", + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.4", + "tapable": "^2.2.0" + }, + "engines": { + "node": ">=10.13.0" + } + }, "node_modules/es-define-property": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", @@ -2676,6 +2962,12 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "license": "ISC" + }, "node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", @@ -2809,6 +3101,15 @@ "dev": true, "license": "ISC" }, + "node_modules/jiti": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-2.6.1.tgz", + "integrity": "sha512-ekilCSN1jwRvIbgeg/57YFh8qQDNbwDb9xT/qu2DAHbFFZUicIl4ygVaAvzveMhMVr3LnpSKTNnwt8PoOfmKhQ==", + "license": "MIT", + "bin": { + "jiti": "lib/jiti-cli.mjs" + } + }, "node_modules/js-tokens": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", @@ -2899,6 +3200,255 @@ "node": ">= 0.8.0" } }, + "node_modules/lightningcss": { + "version": "1.30.2", + "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.30.2.tgz", + "integrity": "sha512-utfs7Pr5uJyyvDETitgsaqSyjCb2qNRAtuqUeWIAKztsOYdcACf2KtARYXg2pSvhkt+9NfoaNY7fxjl6nuMjIQ==", + "license": "MPL-2.0", + "dependencies": { + "detect-libc": "^2.0.3" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "optionalDependencies": { + "lightningcss-android-arm64": "1.30.2", + "lightningcss-darwin-arm64": "1.30.2", + "lightningcss-darwin-x64": "1.30.2", + "lightningcss-freebsd-x64": "1.30.2", + "lightningcss-linux-arm-gnueabihf": "1.30.2", + "lightningcss-linux-arm64-gnu": "1.30.2", + "lightningcss-linux-arm64-musl": "1.30.2", + "lightningcss-linux-x64-gnu": "1.30.2", + "lightningcss-linux-x64-musl": "1.30.2", + "lightningcss-win32-arm64-msvc": "1.30.2", + "lightningcss-win32-x64-msvc": "1.30.2" + } + }, + "node_modules/lightningcss-android-arm64": { + "version": "1.30.2", + "resolved": "https://registry.npmjs.org/lightningcss-android-arm64/-/lightningcss-android-arm64-1.30.2.tgz", + "integrity": "sha512-BH9sEdOCahSgmkVhBLeU7Hc9DWeZ1Eb6wNS6Da8igvUwAe0sqROHddIlvU06q3WyXVEOYDZ6ykBZQnjTbmo4+A==", + "cpu": [ + "arm64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-darwin-arm64": { + "version": "1.30.2", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.30.2.tgz", + "integrity": "sha512-ylTcDJBN3Hp21TdhRT5zBOIi73P6/W0qwvlFEk22fkdXchtNTOU4Qc37SkzV+EKYxLouZ6M4LG9NfZ1qkhhBWA==", + "cpu": [ + "arm64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-darwin-x64": { + "version": "1.30.2", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.30.2.tgz", + "integrity": "sha512-oBZgKchomuDYxr7ilwLcyms6BCyLn0z8J0+ZZmfpjwg9fRVZIR5/GMXd7r9RH94iDhld3UmSjBM6nXWM2TfZTQ==", + "cpu": [ + "x64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-freebsd-x64": { + "version": "1.30.2", + "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.30.2.tgz", + "integrity": "sha512-c2bH6xTrf4BDpK8MoGG4Bd6zAMZDAXS569UxCAGcA7IKbHNMlhGQ89eRmvpIUGfKWNVdbhSbkQaWhEoMGmGslA==", + "cpu": [ + "x64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm-gnueabihf": { + "version": "1.30.2", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.30.2.tgz", + "integrity": "sha512-eVdpxh4wYcm0PofJIZVuYuLiqBIakQ9uFZmipf6LF/HRj5Bgm0eb3qL/mr1smyXIS1twwOxNWndd8z0E374hiA==", + "cpu": [ + "arm" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm64-gnu": { + "version": "1.30.2", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.30.2.tgz", + "integrity": "sha512-UK65WJAbwIJbiBFXpxrbTNArtfuznvxAJw4Q2ZGlU8kPeDIWEX1dg3rn2veBVUylA2Ezg89ktszWbaQnxD/e3A==", + "cpu": [ + "arm64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm64-musl": { + "version": "1.30.2", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.30.2.tgz", + "integrity": "sha512-5Vh9dGeblpTxWHpOx8iauV02popZDsCYMPIgiuw97OJ5uaDsL86cnqSFs5LZkG3ghHoX5isLgWzMs+eD1YzrnA==", + "cpu": [ + "arm64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-x64-gnu": { + "version": "1.30.2", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.30.2.tgz", + "integrity": "sha512-Cfd46gdmj1vQ+lR6VRTTadNHu6ALuw2pKR9lYq4FnhvgBc4zWY1EtZcAc6EffShbb1MFrIPfLDXD6Xprbnni4w==", + "cpu": [ + "x64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-x64-musl": { + "version": "1.30.2", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.30.2.tgz", + "integrity": "sha512-XJaLUUFXb6/QG2lGIW6aIk6jKdtjtcffUT0NKvIqhSBY3hh9Ch+1LCeH80dR9q9LBjG3ewbDjnumefsLsP6aiA==", + "cpu": [ + "x64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-win32-arm64-msvc": { + "version": "1.30.2", + "resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.30.2.tgz", + "integrity": "sha512-FZn+vaj7zLv//D/192WFFVA0RgHawIcHqLX9xuWiQt7P0PtdFEVaxgF9rjM/IRYHQXNnk61/H/gb2Ei+kUQ4xQ==", + "cpu": [ + "arm64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-win32-x64-msvc": { + "version": "1.30.2", + "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.30.2.tgz", + "integrity": "sha512-5g1yc73p+iAkid5phb4oVFMB45417DkRevRbt/El/gKXJk4jid+vPFF/AXbxn05Aky8PapwzZrdJShv5C0avjw==", + "cpu": [ + "x64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, "node_modules/locate-path": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", @@ -2953,6 +3503,15 @@ "react": "^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0" } }, + "node_modules/magic-string": { + "version": "0.30.21", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz", + "integrity": "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==", + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.5" + } + }, "node_modules/math-intrinsics": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", @@ -3022,7 +3581,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", @@ -3147,7 +3705,6 @@ "version": "1.1.1", "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", - "dev": true, "license": "ISC" }, "node_modules/picomatch": { @@ -3167,7 +3724,6 @@ "version": "8.5.6", "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.6.tgz", "integrity": "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==", - "dev": true, "funding": [ { "type": "opencollective", @@ -3385,7 +3941,6 @@ "version": "1.2.1", "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", - "dev": true, "license": "BSD-3-Clause", "engines": { "node": ">=0.10.0" @@ -3431,9 +3986,21 @@ "version": "4.1.18", "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-4.1.18.tgz", "integrity": "sha512-4+Z+0yiYyEtUVCScyfHCxOYP06L5Ne+JiHhY2IjR2KWMIWhJOYZKLSGZaP5HkZ8+bY0cxfzwDE5uOmzFXyIwxw==", - "dev": true, "license": "MIT" }, + "node_modules/tapable": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.3.0.tgz", + "integrity": "sha512-g9ljZiwki/LfxmQADO3dEY1CbpmXT5Hm2fJ+QaGKwSXUylMybePR7/67YW7jOrrvjEgL1Fmz5kzyAjWVWLlucg==", + "license": "MIT", + "engines": { + "node": ">=6" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, "node_modules/tinyglobby": { "version": "0.2.15", "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.15.tgz", diff --git a/frontend/publish-wizard/package.json b/frontend/publish-wizard/package.json index 80255ea..9ad710b 100644 --- a/frontend/publish-wizard/package.json +++ b/frontend/publish-wizard/package.json @@ -10,6 +10,7 @@ "preview": "vite preview" }, "dependencies": { + "@tailwindcss/postcss": "^4.1.18", "axios": "^1.13.2", "clsx": "^2.1.1", "framer-motion": "^12.23.26", diff --git a/frontend/publish-wizard/postcss.config.js b/frontend/publish-wizard/postcss.config.js index 2e7af2b..1c87846 100644 --- a/frontend/publish-wizard/postcss.config.js +++ b/frontend/publish-wizard/postcss.config.js @@ -1,6 +1,6 @@ export default { plugins: { - tailwindcss: {}, + '@tailwindcss/postcss': {}, autoprefixer: {}, }, } diff --git a/frontend/publish-wizard/public/vite.svg b/frontend/publish-wizard/public/vite.svg deleted file mode 100644 index e7b8dfb..0000000 --- a/frontend/publish-wizard/public/vite.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/frontend/publish-wizard/src/assets/react.svg b/frontend/publish-wizard/src/assets/react.svg deleted file mode 100644 index 6c87de9..0000000 --- a/frontend/publish-wizard/src/assets/react.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/frontend/publish-wizard/src/index.css b/frontend/publish-wizard/src/index.css index 8916fea..0ea3710 100644 --- a/frontend/publish-wizard/src/index.css +++ b/frontend/publish-wizard/src/index.css @@ -1,8 +1,15 @@ +@import "tailwindcss"; + @import url('https://fonts.googleapis.com/css2?family=Inter:wght@300;400;500;600;700&display=swap'); -@tailwind base; -@tailwind components; -@tailwind utilities; +@theme { + --font-sans: 'Inter', sans-serif; + --color-brand-50: #f0f9ff; + --color-brand-100: #e0f2fe; + --color-brand-500: #0ea5e9; + --color-brand-600: #0284c7; + --color-brand-900: #0c4a6e; +} body { @apply bg-slate-50 text-slate-900 font-sans; diff --git a/frontend/publish-wizard/src/services/api.ts b/frontend/publish-wizard/src/services/api.ts index eb1bd63..f62cb5a 100644 --- a/frontend/publish-wizard/src/services/api.ts +++ b/frontend/publish-wizard/src/services/api.ts @@ -1,7 +1,7 @@ import axios from 'axios'; const api = axios.create({ - baseURL: 'https://localhost:7034/api', // Backend URL + baseURL: import.meta.env.VITE_API_URL, // Usa la variable de entorno }); -export default api; +export default api; \ No newline at end of file diff --git a/src/SIGCM.API/Controllers/ExportsController.cs b/src/SIGCM.API/Controllers/ExportsController.cs new file mode 100644 index 0000000..f5f12a4 --- /dev/null +++ b/src/SIGCM.API/Controllers/ExportsController.cs @@ -0,0 +1,52 @@ +using System.Text; +using System.Xml.Linq; +using Microsoft.AspNetCore.Authorization; +using Microsoft.AspNetCore.Mvc; +using SIGCM.Domain.Interfaces; + +namespace SIGCM.API.Controllers; + +[ApiController] +[Route("api/[controller]")] +[Authorize(Roles = "Admin,Diagramador")] +public class ExportsController : ControllerBase +{ + private readonly IListingRepository _repository; + + public ExportsController(IListingRepository repository) + { + _repository = repository; + } + + [HttpGet("diagram")] + public async Task DownloadDiagram([FromQuery] DateTime date) + { + var listings = await _repository.GetListingsForPrintAsync(date); + + // Agrupar por Rubro + var grouped = listings.GroupBy(l => l.CategoryName ?? "Varios"); + + // Construir XML usando XDocument (más seguro y limpio que StringBuilder) + var doc = new XDocument( + new XElement("Edition", + new XAttribute("date", date.ToString("yyyy-MM-dd")), + from g in grouped + select new XElement("Category", + new XAttribute("name", g.Key), + from l in g + select new XElement("Ad", + new XAttribute("id", l.Id), + // Usamos CDATA para proteger caracteres especiales en el texto + new XCData(l.PrintText ?? l.Description ?? "") + ) + ) + ) + ); + + // Convertir a bytes + var xmlBytes = Encoding.UTF8.GetBytes(doc.ToString()); + var fileName = $"diagrama_{date:yyyy-MM-dd}.xml"; + + return File(xmlBytes, "application/xml", fileName); + } +} \ No newline at end of file diff --git a/src/SIGCM.API/Controllers/ImagesController.cs b/src/SIGCM.API/Controllers/ImagesController.cs index b9e4d50..1e280cc 100644 --- a/src/SIGCM.API/Controllers/ImagesController.cs +++ b/src/SIGCM.API/Controllers/ImagesController.cs @@ -22,16 +22,24 @@ public class ImagesController : ControllerBase { if (file == null || file.Length == 0) return BadRequest("File is empty"); - // Basic validation + // Validaciones básicas var allowedExtensions = new[] { ".jpg", ".jpeg", ".png", ".webp" }; var ext = Path.GetExtension(file.FileName).ToLowerInvariant(); if (!allowedExtensions.Contains(ext)) return BadRequest("Invalid file type"); - // Ensure directory exists - var uploadDir = Path.Combine(_env.WebRootPath, "uploads", "listings", listingId.ToString()); - Directory.CreateDirectory(uploadDir); + // Si WebRootPath es nulo, construimos la ruta manualmente apuntando a la raíz del contenido + wwwroot + string webRootPath = _env.WebRootPath ?? Path.Combine(Directory.GetCurrentDirectory(), "wwwroot"); - // Save file + // Ruta física donde se guarda + var uploadDir = Path.Combine(webRootPath, "uploads", "listings", listingId.ToString()); + + // Asegurar que la carpeta exista (esto crea toda la estructura si falta) + if (!Directory.Exists(uploadDir)) + { + Directory.CreateDirectory(uploadDir); + } + + // Guardar archivo var fileName = $"{Guid.NewGuid()}{ext}"; var filePath = Path.Combine(uploadDir, fileName); @@ -40,14 +48,16 @@ public class ImagesController : ControllerBase await file.CopyToAsync(stream); } - // Save metadata + // Guardar metadata en BD + // Ojo: La URL que guardamos en BD debe ser relativa para que el navegador la entienda var relativeUrl = $"/uploads/listings/{listingId}/{fileName}"; - var image = new ListingImage - { - ListingId = listingId, + + var image = new ListingImage + { + ListingId = listingId, Url = relativeUrl, - IsMainInfo = false, // Logic to set first as main could be added here - DisplayOrder = 0 + IsMainInfo = false, + DisplayOrder = 0 }; await _repository.AddAsync(image); diff --git a/src/SIGCM.API/Controllers/ListingsController.cs b/src/SIGCM.API/Controllers/ListingsController.cs index 6a1de53..bced9d9 100644 --- a/src/SIGCM.API/Controllers/ListingsController.cs +++ b/src/SIGCM.API/Controllers/ListingsController.cs @@ -28,7 +28,7 @@ public class ListingsController : ControllerBase Price = dto.Price, Currency = dto.Currency, UserId = dto.UserId, - Status = "Draft", + Status = "Published", // Auto publish for now CreatedAt = DateTime.UtcNow }; @@ -36,11 +36,28 @@ public class ListingsController : ControllerBase return Ok(new { id }); } + [HttpGet] + public async Task GetAll([FromQuery] string? q, [FromQuery] int? categoryId) + { + if (string.IsNullOrEmpty(q) && !categoryId.HasValue) + { + var listings = await _repository.GetAllAsync(); + + // Populate images for list view (simplified N+1 for now, fix later with JOIN) + // Ideally Repo returns a DTO with MainImage + // We will fetch images separately in frontend or update repo later for performance. + return Ok(listings); + } + + var results = await _repository.SearchAsync(q, categoryId); + return Ok(results); + } + [HttpGet("{id}")] public async Task Get(int id) { - var listing = await _repository.GetByIdAsync(id); - if (listing == null) return NotFound(); - return Ok(listing); + var listingDetail = await _repository.GetDetailByIdAsync(id); + if (listingDetail == null) return NotFound(); + return Ok(listingDetail); } -} +} \ No newline at end of file diff --git a/src/SIGCM.API/Controllers/PricingController.cs b/src/SIGCM.API/Controllers/PricingController.cs new file mode 100644 index 0000000..2a6d0b7 --- /dev/null +++ b/src/SIGCM.API/Controllers/PricingController.cs @@ -0,0 +1,88 @@ +using Microsoft.AspNetCore.Authorization; +using Microsoft.AspNetCore.Mvc; +using SIGCM.Application.DTOs; +using SIGCM.Domain.Entities; +using SIGCM.Infrastructure.Repositories; +using SIGCM.Infrastructure.Services; + +namespace SIGCM.API.Controllers; + +[ApiController] +[Route("api/[controller]")] +[Authorize] // Requiere login, pero permite Admin y Cajero por defecto +public class PricingController : ControllerBase +{ + private readonly PricingService _service; + private readonly PricingRepository _repository; + + public PricingController(PricingService service, PricingRepository repository) + { + _service = service; + _repository = repository; + } + + // Usado por: Panel Mostrador (Cajero) y Admin + [HttpPost("calculate")] + public async Task Calculate(CalculatePriceRequest request) + { + var result = await _service.CalculateAsync(request); + return Ok(result); + } + + // --- Endpoints de Configuración (Solo Admin) --- + + // Obtener reglas de un rubro específico + [HttpGet("{categoryId}")] + [Authorize(Roles = "Admin")] + public async Task GetConfig(int categoryId) + { + var config = await _repository.GetByCategoryIdAsync(categoryId); + return Ok(config); + } + + // Guardar/Actualizar reglas + [HttpPost] + [Authorize(Roles = "Admin")] + public async Task SaveConfig(CategoryPricing pricing) + { + if (pricing.CategoryId == 0) return BadRequest("CategoryId es requerido"); + + await _repository.UpsertPricingAsync(pricing); + return Ok(new { message = "Configuración guardada exitosamente" }); + } + + // --- ENDPOINTS DE PROMOCIONES --- + + [HttpGet("promotions")] + [Authorize(Roles = "Admin")] + public async Task GetPromotions() + { + var promos = await _repository.GetAllPromotionsAsync(); + return Ok(promos); + } + + [HttpPost("promotions")] + [Authorize(Roles = "Admin")] + public async Task CreatePromotion(Promotion promo) + { + var id = await _repository.CreatePromotionAsync(promo); + return Ok(new { id }); + } + + [HttpPut("promotions/{id}")] + [Authorize(Roles = "Admin")] + public async Task UpdatePromotion(int id, Promotion promo) + { + if (id != promo.Id) return BadRequest(); + await _repository.UpdatePromotionAsync(promo); + return NoContent(); + } + + [HttpDelete("promotions/{id}")] + [Authorize(Roles = "Admin")] + public async Task DeletePromotion(int id) + { + await _repository.DeletePromotionAsync(id); + return NoContent(); + } +} \ No newline at end of file diff --git a/src/SIGCM.API/Controllers/UsersController.cs b/src/SIGCM.API/Controllers/UsersController.cs index bea1596..66739bc 100644 --- a/src/SIGCM.API/Controllers/UsersController.cs +++ b/src/SIGCM.API/Controllers/UsersController.cs @@ -8,7 +8,7 @@ namespace SIGCM.API.Controllers; [ApiController] [Route("api/[controller]")] -[Authorize(Roles = "Admin")] // Only admins can manage users +[Authorize(Roles = "Admin")] public class UsersController : ControllerBase { private readonly IUserRepository _repository; diff --git a/src/SIGCM.API/Program.cs b/src/SIGCM.API/Program.cs index 3b6c6b0..8803d69 100644 --- a/src/SIGCM.API/Program.cs +++ b/src/SIGCM.API/Program.cs @@ -1,21 +1,55 @@ +using System.Text; +using Microsoft.AspNetCore.Authentication.JwtBearer; +using Microsoft.IdentityModel.Tokens; using SIGCM.Infrastructure; using SIGCM.Infrastructure.Data; var builder = WebApplication.CreateBuilder(args); -// Add services to the container. +// 1. Agregar servicios al contenedor. builder.Services.AddControllers(); builder.Services.AddEndpointsApiExplorer(); builder.Services.AddSwaggerGen(); +// 2. Configurar Autenticación JWT +var key = Encoding.ASCII.GetBytes(builder.Configuration["Jwt:Key"]!); + +builder.Services.AddAuthentication(options => +{ + options.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme; + options.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme; +}) +.AddJwtBearer(options => +{ + options.RequireHttpsMetadata = false; + options.SaveToken = true; + options.TokenValidationParameters = new TokenValidationParameters + { + ValidateIssuerSigningKey = true, + IssuerSigningKey = new SymmetricSecurityKey(key), + ValidateIssuer = true, + ValidIssuer = builder.Configuration["Jwt:Issuer"], + ValidateAudience = true, + ValidAudience = builder.Configuration["Jwt:Audience"], + ValidateLifetime = true, + ClockSkew = TimeSpan.Zero + }; +}); + +// 3. Agregar Capa de Infraestructura builder.Services.AddInfrastructure(); +// 4. Configurar CORS builder.Services.AddCors(options => { options.AddPolicy("AllowFrontend", policy => { - policy.WithOrigins("http://localhost:5173", "http://localhost:5174", "http://localhost:5175") + policy.WithOrigins( + "http://localhost:5173", + "http://localhost:5174", + "http://localhost:5175", + "http://localhost:5177") .AllowAnyHeader() .AllowAnyMethod(); }); @@ -23,7 +57,8 @@ builder.Services.AddCors(options => var app = builder.Build(); -// Configure the HTTP request pipeline. +// --- Configuración del Pipeline HTTP --- + if (app.Environment.IsDevelopment()) { app.UseSwagger(); @@ -31,19 +66,21 @@ if (app.Environment.IsDevelopment()) } app.UseHttpsRedirection(); -app.UseStaticFiles(); // Enable static files for images +app.UseStaticFiles(); // Para servir imágenes app.UseCors("AllowFrontend"); +// IMPORTANTE: El orden importa aquí +app.UseAuthentication(); // <- Esto faltaba app.UseAuthorization(); app.MapControllers(); -// Initialize DB +// Inicializar BD using (var scope = app.Services.CreateScope()) { var initializer = scope.ServiceProvider.GetRequiredService(); await initializer.InitializeAsync(); } -app.Run(); +app.Run(); \ No newline at end of file diff --git a/src/SIGCM.API/wwwroot/uploads/listings/2/a174fb99-a710-4512-a1fd-67fa22ffded2.jpg b/src/SIGCM.API/wwwroot/uploads/listings/2/a174fb99-a710-4512-a1fd-67fa22ffded2.jpg new file mode 100644 index 0000000000000000000000000000000000000000..8f8c04b034ff8322c9885f21aa11f2086b4bbec7 GIT binary patch literal 183690 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 ILVF+o*}lI_HUIzs literal 0 HcmV?d00001 diff --git a/src/SIGCM.Application/Class1.cs b/src/SIGCM.Application/Class1.cs deleted file mode 100644 index d0159fe..0000000 --- a/src/SIGCM.Application/Class1.cs +++ /dev/null @@ -1,6 +0,0 @@ -namespace SIGCM.Application; - -public class Class1 -{ - -} diff --git a/src/SIGCM.Application/DTOs/ListingDtos.cs b/src/SIGCM.Application/DTOs/ListingDtos.cs index d4daf06..315d8df 100644 --- a/src/SIGCM.Application/DTOs/ListingDtos.cs +++ b/src/SIGCM.Application/DTOs/ListingDtos.cs @@ -9,14 +9,38 @@ public class CreateListingDto public decimal Price { get; set; } public string Currency { get; set; } = "ARS"; public int? UserId { get; set; } - - // Dictionary of AttributeDefinitionId -> Value public Dictionary Attributes { get; set; } = new(); + public string? PrintText { get; set; } + public string? PrintFontSize { get; set; } + public string? PrintAlignment { get; set; } + public int PrintDaysCount { get; set; } } public class ListingDto : CreateListingDto { public int Id { get; set; } public DateTime CreatedAt { get; set; } - public string Status { get; set; } + public required string Status { get; set; } } + +public class ListingDetailDto : ListingDto +{ + public IEnumerable AttributeValues { get; set; } = new List(); + public IEnumerable Images { get; set; } = new List(); +} + +public class ListingAttributeDto +{ + public int ListingId { get; set; } + public int AttributeDefinitionId { get; set; } + public required string AttributeName { get; set; } + public required string Value { get; set; } +} + +public class ListingImageDto +{ + public int Id { get; set; } + public required string Url { get; set; } + public bool IsMainInfo { get; set; } + public int DisplayOrder { get; set; } +} \ No newline at end of file diff --git a/src/SIGCM.Application/DTOs/PricingDtos.cs b/src/SIGCM.Application/DTOs/PricingDtos.cs new file mode 100644 index 0000000..ce0b60a --- /dev/null +++ b/src/SIGCM.Application/DTOs/PricingDtos.cs @@ -0,0 +1,24 @@ +namespace SIGCM.Application.DTOs; + +public class CalculatePriceRequest +{ + public int CategoryId { get; set; } + public required string Text { get; set; } + public int Days { get; set; } + public bool IsBold { get; set; } + public bool IsFrame { get; set; } + public DateTime StartDate { get; set; } +} + +public class CalculatePriceResponse +{ + public decimal TotalPrice { get; set; } + public int WordCount { get; set; } + public int SpecialCharCount { get; set; } + public decimal BaseCost { get; set; } + public decimal ExtraCost { get; set; } + public decimal Surcharges { get; set; } + public decimal Discount { get; set; } + public string Details { get; set; } = string.Empty; + public string AppliedPromotion { get; set; } = string.Empty; +} \ No newline at end of file diff --git a/src/SIGCM.Domain/Class1.cs b/src/SIGCM.Domain/Class1.cs deleted file mode 100644 index 46b2bdb..0000000 --- a/src/SIGCM.Domain/Class1.cs +++ /dev/null @@ -1,6 +0,0 @@ -namespace SIGCM.Domain; - -public class Class1 -{ - -} diff --git a/src/SIGCM.Domain/Entities/CategoryPricing.cs b/src/SIGCM.Domain/Entities/CategoryPricing.cs new file mode 100644 index 0000000..8439210 --- /dev/null +++ b/src/SIGCM.Domain/Entities/CategoryPricing.cs @@ -0,0 +1,14 @@ +namespace SIGCM.Domain.Entities; + +public class CategoryPricing +{ + public int Id { get; set; } + public int CategoryId { get; set; } + public decimal BasePrice { get; set; } + public int BaseWordCount { get; set; } + public decimal ExtraWordPrice { get; set; } + public string SpecialChars { get; set; } = "!"; + public decimal SpecialCharPrice { get; set; } + public decimal BoldSurcharge { get; set; } + public decimal FrameSurcharge { get; set; } +} \ No newline at end of file diff --git a/src/SIGCM.Domain/Entities/Listing.cs b/src/SIGCM.Domain/Entities/Listing.cs index 2bc9314..0f4e5ad 100644 --- a/src/SIGCM.Domain/Entities/Listing.cs +++ b/src/SIGCM.Domain/Entities/Listing.cs @@ -8,10 +8,19 @@ public class Listing public required string Title { get; set; } public string? Description { get; set; } public decimal Price { get; set; } - public string Currency { get; set; } = "ARS"; // ARS, USD + public string Currency { get; set; } = "ARS"; public DateTime CreatedAt { get; set; } = DateTime.UtcNow; - public string Status { get; set; } = "Draft"; // Draft, Published, Sold, Paused + public string Status { get; set; } = "Draft"; public int? UserId { get; set; } - - // Navigation properties logic will be handled manually via repositories in Dapper -} + + // Propiedades para impresión + public string? PrintText { get; set; } + public DateTime? PrintStartDate { get; set; } + public int PrintDaysCount { get; set; } + public string PrintFontSize { get; set; } = "normal"; + public string PrintAlignment { get; set; } = "left"; + + // Propiedades auxiliares (no están en la tabla Listings, vienen de Joins/Subqueries) + public string? CategoryName { get; set; } + public string? MainImageUrl { get; set; } +} \ No newline at end of file diff --git a/src/SIGCM.Domain/Entities/Promotion.cs b/src/SIGCM.Domain/Entities/Promotion.cs new file mode 100644 index 0000000..154c35f --- /dev/null +++ b/src/SIGCM.Domain/Entities/Promotion.cs @@ -0,0 +1,13 @@ +namespace SIGCM.Domain.Entities; + +public class Promotion +{ + public int Id { get; set; } + public string Name { get; set; } = string.Empty; + public int? CategoryId { get; set; } + public int MinDays { get; set; } + public string? DaysOfWeek { get; set; } // "0,6" + public decimal DiscountPercentage { get; set; } + public decimal DiscountFixedAmount { get; set; } + public bool IsActive { get; set; } +} \ No newline at end of file diff --git a/src/SIGCM.Domain/Interfaces/IListingRepository.cs b/src/SIGCM.Domain/Interfaces/IListingRepository.cs index b153918..ecc27a8 100644 --- a/src/SIGCM.Domain/Interfaces/IListingRepository.cs +++ b/src/SIGCM.Domain/Interfaces/IListingRepository.cs @@ -1,3 +1,4 @@ +using SIGCM.Domain.Models; using SIGCM.Domain.Entities; namespace SIGCM.Domain.Interfaces; @@ -6,5 +7,8 @@ public interface IListingRepository { Task CreateAsync(Listing listing, Dictionary attributes); Task GetByIdAsync(int id); + Task GetDetailByIdAsync(int id); Task> GetAllAsync(); -} + Task> SearchAsync(string? query, int? categoryId); + Task> GetListingsForPrintAsync(DateTime date); +} \ No newline at end of file diff --git a/src/SIGCM.Domain/Models/ListingDetail.cs b/src/SIGCM.Domain/Models/ListingDetail.cs new file mode 100644 index 0000000..658f8a2 --- /dev/null +++ b/src/SIGCM.Domain/Models/ListingDetail.cs @@ -0,0 +1,15 @@ +using SIGCM.Domain.Entities; + +namespace SIGCM.Domain.Models; + +public class ListingDetail +{ + public required Listing Listing { get; set; } + public required IEnumerable Attributes { get; set; } + public required IEnumerable Images { get; set; } +} + +public class ListingAttributeValueWithName : ListingAttributeValue +{ + public required string AttributeName { get; set; } +} \ No newline at end of file diff --git a/src/SIGCM.Infrastructure/Class1.cs b/src/SIGCM.Infrastructure/Class1.cs deleted file mode 100644 index c98680d..0000000 --- a/src/SIGCM.Infrastructure/Class1.cs +++ /dev/null @@ -1,6 +0,0 @@ -namespace SIGCM.Infrastructure; - -public class Class1 -{ - -} diff --git a/src/SIGCM.Infrastructure/Data/DbInitializer.cs b/src/SIGCM.Infrastructure/Data/DbInitializer.cs index 4679c4e..79e2dcf 100644 --- a/src/SIGCM.Infrastructure/Data/DbInitializer.cs +++ b/src/SIGCM.Infrastructure/Data/DbInitializer.cs @@ -1,4 +1,6 @@ using Dapper; +// Asegúrate de que BCrypt.Net esté instalado en este proyecto o referenciado +// Si no te reconoce BCrypt, avísame, pero debería funcionar porque ya se usa en AuthService. namespace SIGCM.Infrastructure.Data; @@ -14,60 +16,7 @@ public class DbInitializer public async Task InitializeAsync() { using var connection = _connectionFactory.CreateConnection(); - - var sql = @" -IF NOT EXISTS (SELECT * FROM sys.tables WHERE name = 'Users') -BEGIN - CREATE TABLE Users ( - Id INT IDENTITY(1,1) PRIMARY KEY, - Username NVARCHAR(50) NOT NULL UNIQUE, - PasswordHash NVARCHAR(255) NOT NULL, - Role NVARCHAR(20) NOT NULL, - Email NVARCHAR(100) NULL, - CreatedAt DATETIME DEFAULT GETUTCDATE() - ); - -- Seed generic admin (password: admin123) - -- Hash created with BCrypt - INSERT INTO Users (Username, PasswordHash, Role) - VALUES ('admin', '$2a$11$u.w..ExampleHashPlaceholder...', 'Admin'); -END - -IF NOT EXISTS (SELECT * FROM sys.tables WHERE name = 'Categories') -BEGIN - CREATE TABLE Categories ( - Id INT IDENTITY(1,1) PRIMARY KEY, - ParentId INT NULL, - Name NVARCHAR(100) NOT NULL, - Slug NVARCHAR(100) NOT NULL, - Active BIT DEFAULT 1, - FOREIGN KEY (ParentId) REFERENCES Categories(Id) - ); -END - -IF NOT EXISTS (SELECT * FROM sys.tables WHERE name = 'Operations') -BEGIN - CREATE TABLE Operations ( - Id INT IDENTITY(1,1) PRIMARY KEY, - Name NVARCHAR(50) NOT NULL UNIQUE - ); -END - -IF NOT EXISTS (SELECT * FROM sys.tables WHERE name = 'CategoryOperations') -BEGIN - CREATE TABLE CategoryOperations ( - CategoryId INT NOT NULL, - OperationId INT NOT NULL, - PRIMARY KEY (CategoryId, OperationId), - FOREIGN KEY (CategoryId) REFERENCES Categories(Id) ON DELETE CASCADE, - FOREIGN KEY (OperationId) REFERENCES Operations(Id) ON DELETE CASCADE - ); -END -"; - // Fixing the placeholder hash to a valid one might be necessary if I want to login immediately. - // I will update the hash command later or create a small utility to generate one. - // For now, I'll remove the INSERT or comment it out until I can generate a real hash in C#. - var schemaSql = @" IF NOT EXISTS (SELECT * FROM sys.tables WHERE name = 'Users') BEGIN @@ -167,6 +116,22 @@ BEGIN ); END "; + // Ejecutar creación de tablas await connection.ExecuteAsync(schemaSql); + + // --- SEED DE DATOS (Usuario Admin) --- + var adminCount = await connection.ExecuteScalarAsync("SELECT COUNT(1) FROM Users WHERE Username = 'admin'"); + + if (adminCount == 0) + { + // Creamos el hash válido para la clave del usuario usando la librería del proyecto + var passwordHash = BCrypt.Net.BCrypt.HashPassword("Diagonal423"); + + var insertAdminSql = @" + INSERT INTO Users (Username, PasswordHash, Role, Email) + VALUES ('admin', @PasswordHash, 'Admin', 'admin@sigcm.com')"; + + await connection.ExecuteAsync(insertAdminSql, new { PasswordHash = passwordHash }); + } } -} +} \ No newline at end of file diff --git a/src/SIGCM.Infrastructure/DependencyInjection.cs b/src/SIGCM.Infrastructure/DependencyInjection.cs index b80daa1..013714f 100644 --- a/src/SIGCM.Infrastructure/DependencyInjection.cs +++ b/src/SIGCM.Infrastructure/DependencyInjection.cs @@ -3,6 +3,7 @@ using SIGCM.Domain.Interfaces; using SIGCM.Application.Interfaces; using SIGCM.Infrastructure.Data; using SIGCM.Infrastructure.Repositories; +using SIGCM.Infrastructure.Services; namespace SIGCM.Infrastructure; @@ -15,11 +16,13 @@ public static class DependencyInjection services.AddScoped(); services.AddScoped(); services.AddScoped(); - services.AddScoped(); - services.AddScoped(); + services.AddScoped(); + services.AddScoped(); services.AddScoped(); services.AddScoped(); services.AddScoped(); + services.AddScoped(); + services.AddScoped(); return services; } } diff --git a/src/SIGCM.Infrastructure/Repositories/ListingRepository.cs b/src/SIGCM.Infrastructure/Repositories/ListingRepository.cs index e699b5b..eacf487 100644 --- a/src/SIGCM.Infrastructure/Repositories/ListingRepository.cs +++ b/src/SIGCM.Infrastructure/Repositories/ListingRepository.cs @@ -25,8 +25,16 @@ public class ListingRepository : IListingRepository try { var sqlListing = @" - INSERT INTO Listings (CategoryId, OperationId, Title, Description, Price, Currency, CreatedAt, Status, UserId) - VALUES (@CategoryId, @OperationId, @Title, @Description, @Price, @Currency, @CreatedAt, @Status, @UserId); + INSERT INTO Listings ( + CategoryId, OperationId, Title, Description, Price, Currency, + CreatedAt, Status, UserId, PrintText, PrintStartDate, PrintDaysCount, + IsBold, IsFrame, PrintFontSize, PrintAlignment + ) + VALUES ( + @CategoryId, @OperationId, @Title, @Description, @Price, @Currency, + @CreatedAt, @Status, @UserId, @PrintText, @PrintStartDate, @PrintDaysCount, + @IsBold, @IsFrame, @PrintFontSize, @PrintAlignment + ); SELECT CAST(SCOPE_IDENTITY() as int);"; var listingId = await conn.QuerySingleAsync(sqlListing, listing, transaction); @@ -59,15 +67,90 @@ public class ListingRepository : IListingRepository return await conn.QuerySingleOrDefaultAsync("SELECT * FROM Listings WHERE Id = @Id", new { Id = id }); } + public async Task GetDetailByIdAsync(int id) + { + using var conn = _connectionFactory.CreateConnection(); + var sql = @" + SELECT * FROM Listings WHERE Id = @Id; + + SELECT lav.*, ad.Name as AttributeName + FROM ListingAttributeValues lav + JOIN AttributeDefinitions ad ON lav.AttributeDefinitionId = ad.Id + WHERE lav.ListingId = @Id; + + SELECT * FROM ListingImages WHERE ListingId = @Id ORDER BY DisplayOrder; + "; + + using var multi = await conn.QueryMultipleAsync(sql, new { Id = id }); + var listing = await multi.ReadSingleOrDefaultAsync(); + if (listing == null) return null; + + var attributes = await multi.ReadAsync(); + var images = await multi.ReadAsync(); + + return new SIGCM.Domain.Models.ListingDetail + { + Listing = listing, + Attributes = attributes, + Images = images + }; + } + public async Task> GetAllAsync() { using var conn = _connectionFactory.CreateConnection(); - // A simple query for now + // Subquery para obtener la imagen principal var sql = @" - SELECT l.* + SELECT TOP 20 l.*, + (SELECT TOP 1 Url FROM ListingImages li WHERE li.ListingId = l.Id ORDER BY IsMainInfo DESC, DisplayOrder ASC) as MainImageUrl FROM Listings l ORDER BY l.CreatedAt DESC"; - + return await conn.QueryAsync(sql); } -} + + public async Task> SearchAsync(string? query, int? categoryId) + { + using var conn = _connectionFactory.CreateConnection(); + var sql = @" + SELECT l.*, + (SELECT TOP 1 Url FROM ListingImages li WHERE li.ListingId = l.Id ORDER BY IsMainInfo DESC, DisplayOrder ASC) as MainImageUrl + FROM Listings l + WHERE 1=1"; + + var parameters = new DynamicParameters(); + + if (!string.IsNullOrEmpty(query)) + { + sql += " AND (l.Title LIKE @Query OR l.Description LIKE @Query)"; + parameters.Add("Query", $"%{query}%"); + } + + if (categoryId.HasValue) + { + sql += " AND l.CategoryId = @CategoryId"; + parameters.Add("CategoryId", categoryId); + } + + sql += " ORDER BY l.CreatedAt DESC"; + + return await conn.QueryAsync(sql, parameters); + } + + public async Task> GetListingsForPrintAsync(DateTime targetDate) + { + using var conn = _connectionFactory.CreateConnection(); + // La lógica: El aviso debe haber empezado antes o en la fecha target + // Y la fecha target debe ser menor a la fecha de inicio + duración + var sql = @" + SELECT l.*, c.Name as CategoryName + FROM Listings l + JOIN Categories c ON l.CategoryId = c.Id + WHERE l.PrintStartDate IS NOT NULL + AND @TargetDate >= CAST(l.PrintStartDate AS DATE) + AND @TargetDate < DATEADD(day, l.PrintDaysCount, CAST(l.PrintStartDate AS DATE)) + ORDER BY c.Name, l.Title"; // Ordenado por Rubro y luego alfabético + + return await conn.QueryAsync(sql, new { TargetDate = targetDate.Date }); + } +} \ No newline at end of file diff --git a/src/SIGCM.Infrastructure/Repositories/PricingRepository.cs b/src/SIGCM.Infrastructure/Repositories/PricingRepository.cs new file mode 100644 index 0000000..eca9f6e --- /dev/null +++ b/src/SIGCM.Infrastructure/Repositories/PricingRepository.cs @@ -0,0 +1,94 @@ +using Dapper; +using SIGCM.Domain.Entities; +using SIGCM.Infrastructure.Data; + +namespace SIGCM.Infrastructure.Repositories; + +public class PricingRepository +{ + private readonly IDbConnectionFactory _db; + + public PricingRepository(IDbConnectionFactory db) + { + _db = db; + } + + public async Task GetByCategoryIdAsync(int categoryId) + { + using var conn = _db.CreateConnection(); + return await conn.QuerySingleOrDefaultAsync( + "SELECT * FROM CategoryPricing WHERE CategoryId = @Id", new { Id = categoryId }); + } + + public async Task UpsertPricingAsync(CategoryPricing pricing) + { + using var conn = _db.CreateConnection(); + // Lógica de "Si existe actualiza, sino inserta" + var exists = await conn.ExecuteScalarAsync( + "SELECT COUNT(1) FROM CategoryPricing WHERE CategoryId = @CategoryId", new { pricing.CategoryId }); + + if (exists > 0) + { + var updateSql = @" + UPDATE CategoryPricing + SET BasePrice = @BasePrice, BaseWordCount = @BaseWordCount, + ExtraWordPrice = @ExtraWordPrice, SpecialChars = @SpecialChars, + SpecialCharPrice = @SpecialCharPrice, BoldSurcharge = @BoldSurcharge, + FrameSurcharge = @FrameSurcharge + WHERE CategoryId = @CategoryId"; + await conn.ExecuteAsync(updateSql, pricing); + } + else + { + var insertSql = @" + INSERT INTO CategoryPricing + (CategoryId, BasePrice, BaseWordCount, ExtraWordPrice, SpecialChars, SpecialCharPrice, BoldSurcharge, FrameSurcharge) + VALUES + (@CategoryId, @BasePrice, @BaseWordCount, @ExtraWordPrice, @SpecialChars, @SpecialCharPrice, @BoldSurcharge, @FrameSurcharge)"; + await conn.ExecuteAsync(insertSql, pricing); + } + } + + public async Task> GetActivePromotionsAsync() + { + using var conn = _db.CreateConnection(); + return await conn.QueryAsync( + "SELECT * FROM Promotions WHERE IsActive = 1"); + } + + // --- SECCIÓN PROMOCIONES --- + + public async Task> GetAllPromotionsAsync() + { + using var conn = _db.CreateConnection(); + return await conn.QueryAsync("SELECT * FROM Promotions ORDER BY Id DESC"); + } + + public async Task CreatePromotionAsync(Promotion promo) + { + using var conn = _db.CreateConnection(); + var sql = @" + INSERT INTO Promotions (Name, CategoryId, MinDays, DaysOfWeek, DiscountPercentage, DiscountFixedAmount, IsActive) + VALUES (@Name, @CategoryId, @MinDays, @DaysOfWeek, @DiscountPercentage, @DiscountFixedAmount, @IsActive); + SELECT CAST(SCOPE_IDENTITY() as int);"; + return await conn.QuerySingleAsync(sql, promo); + } + + public async Task UpdatePromotionAsync(Promotion promo) + { + using var conn = _db.CreateConnection(); + var sql = @" + UPDATE Promotions + SET Name = @Name, CategoryId = @CategoryId, MinDays = @MinDays, + DaysOfWeek = @DaysOfWeek, DiscountPercentage = @DiscountPercentage, + DiscountFixedAmount = @DiscountFixedAmount, IsActive = @IsActive + WHERE Id = @Id"; + await conn.ExecuteAsync(sql, promo); + } + + public async Task DeletePromotionAsync(int id) + { + using var conn = _db.CreateConnection(); + await conn.ExecuteAsync("DELETE FROM Promotions WHERE Id = @Id", new { Id = id }); + } +} \ No newline at end of file diff --git a/src/SIGCM.Infrastructure/Services/PricingService.cs b/src/SIGCM.Infrastructure/Services/PricingService.cs new file mode 100644 index 0000000..b3879f3 --- /dev/null +++ b/src/SIGCM.Infrastructure/Services/PricingService.cs @@ -0,0 +1,111 @@ +using SIGCM.Application.DTOs; // Asegúrate de crear este DTO (ver abajo) +using SIGCM.Domain.Entities; +using SIGCM.Infrastructure.Repositories; +using System.Text.RegularExpressions; + +namespace SIGCM.Infrastructure.Services; + +public class PricingService +{ + private readonly PricingRepository _repo; + + public PricingService(PricingRepository repo) + { + _repo = repo; + } + + public async Task CalculateAsync(CalculatePriceRequest request) + { + // 1. Obtener Reglas + var pricing = await _repo.GetByCategoryIdAsync(request.CategoryId); + + // Si no hay configuración para este rubro, devolvemos 0 o un default seguro + if (pricing == null) return new CalculatePriceResponse + { + TotalPrice = 0, + Details = "No hay tarifas configuradas para este rubro." + }; + + // 2. Análisis del Texto + var words = request.Text.Split(new[] { ' ', '\n', '\r' }, StringSplitOptions.RemoveEmptyEntries); + int realWordCount = words.Length; + + // Contar caracteres especiales configurados en BD (ej: "!") + // Escapamos los caracteres por seguridad en Regex + string escapedSpecialChars = Regex.Escape(pricing.SpecialChars ?? "!"); + int specialCharCount = Regex.Matches(request.Text, $"[{escapedSpecialChars}]").Count; + + // 3. Costo Base y Excedente + decimal currentCost = pricing.BasePrice; // Precio base incluye N palabras + + // ¿Cuántas palabras extra cobramos? + // Nota: Los caracteres especiales se cobran aparte según tu requerimiento, + // o suman al conteo de palabras. Aquí implemento: Se cobran APARTE. + + int extraWords = Math.Max(0, realWordCount - pricing.BaseWordCount); + decimal extraWordCost = extraWords * pricing.ExtraWordPrice; + decimal specialCharCost = specialCharCount * pricing.SpecialCharPrice; + + currentCost += extraWordCost + specialCharCost; + + // 4. Estilos (Negrita / Recuadro) - Se suman al precio unitario diario + if (request.IsBold) currentCost += pricing.BoldSurcharge; + if (request.IsFrame) currentCost += pricing.FrameSurcharge; + + // 5. Multiplicar por Días + decimal totalBeforeDiscount = currentCost * request.Days; + + // 6. Motor de Promociones + var promotions = await _repo.GetActivePromotionsAsync(); + decimal totalDiscount = 0; + List appliedPromos = new(); + + foreach (var promo in promotions) + { + // Filtro por Categoría + if (promo.CategoryId.HasValue && promo.CategoryId != request.CategoryId) continue; + + // Filtro por Cantidad de Días + if (promo.MinDays > 0 && request.Days < promo.MinDays) continue; + + // Filtro por Días de la Semana + if (!string.IsNullOrEmpty(promo.DaysOfWeek)) + { + var targetDays = promo.DaysOfWeek.Split(',').Select(int.Parse).ToList(); + bool hitsDay = false; + // Revisamos cada día que durará el aviso + for (int i = 0; i < request.Days; i++) + { + var currentDay = (int)request.StartDate.AddDays(i).DayOfWeek; + if (targetDays.Contains(currentDay)) hitsDay = true; + } + if (!hitsDay) continue; // No cae en ningún día de promo + } + + // Aplicar Descuento + if (promo.DiscountPercentage > 0) + { + decimal discountVal = totalBeforeDiscount * (promo.DiscountPercentage / 100m); + totalDiscount += discountVal; + appliedPromos.Add($"{promo.Name} (-{promo.DiscountPercentage}%)"); + } + if (promo.DiscountFixedAmount > 0) + { + totalDiscount += promo.DiscountFixedAmount; + appliedPromos.Add($"{promo.Name} (-${promo.DiscountFixedAmount})"); + } + } + + return new CalculatePriceResponse + { + TotalPrice = Math.Max(0, totalBeforeDiscount - totalDiscount), + BaseCost = pricing.BasePrice, + ExtraCost = extraWordCost + specialCharCost, + Surcharges = (request.IsBold ? pricing.BoldSurcharge : 0) + (request.IsFrame ? pricing.FrameSurcharge : 0), + Discount = totalDiscount, + WordCount = realWordCount, + SpecialCharCount = specialCharCount, + Details = $"Base: ${pricing.BasePrice} | Extras: ${extraWordCost + specialCharCost} | Desc: -${totalDiscount} ({string.Join(", ", appliedPromos)})" + }; + } +} \ No newline at end of file