From 64ae1d9f5ad2f56d88fb80311fe2a6a893bc88d6 Mon Sep 17 00:00:00 2001 From: Zotov Ivan Yuryevich Date: Thu, 2 Apr 2026 23:08:29 +0300 Subject: [PATCH] init --- .gitignore | 37 + README.md | 11 + index.html | 15 + package-lock.json | 4910 ++++++++++++++++++++ package.json | 66 + src/App.tsx | 159 + src/Attributions.md | 3 + src/COMMIT-AND-DEPLOY.md | 267 ++ src/DEPLOY-QUICK.md | 124 + src/DEPLOYMENT-CHECKLIST.md | 152 + src/DEPLOYMENT.md | 164 + src/FILES-OVERVIEW.md | 237 + src/FIXES-SUMMARY.md | 226 + src/LATEST-FIXES.md | 230 + src/NETLIFY-FIX.md | 195 + src/NODE-VERSION-FIX.md | 208 + src/PLATFORMS.md | 294 ++ src/PROMPT-FOR-RECREATION.md | 659 +++ src/README.md | 116 + src/START-HERE.md | 118 + src/_headers/main.tsx | 8 + src/_redirects/main.tsx | 1 + src/check-build.bat | 54 + src/check-build.sh | 68 + src/components/About.tsx | 162 + src/components/Cases.tsx | 109 + src/components/CategoryPage.tsx | 96 + src/components/Contact.tsx | 108 + src/components/ContactModal.tsx | 216 + src/components/Footer.tsx | 96 + src/components/Header.tsx | 235 + src/components/Hero.tsx | 105 + src/components/Services.tsx | 116 + src/components/Solutions.tsx | 92 + src/components/figma/ImageWithFallback.tsx | 27 + src/components/ui/accordion.tsx | 66 + src/components/ui/alert-dialog.tsx | 157 + src/components/ui/alert.tsx | 66 + src/components/ui/aspect-ratio.tsx | 11 + src/components/ui/avatar.tsx | 53 + src/components/ui/badge.tsx | 46 + src/components/ui/breadcrumb.tsx | 109 + src/components/ui/button.tsx | 58 + src/components/ui/calendar.tsx | 75 + src/components/ui/card.tsx | 92 + src/components/ui/carousel.tsx | 241 + src/components/ui/chart.tsx | 353 ++ src/components/ui/checkbox.tsx | 32 + src/components/ui/collapsible.tsx | 33 + src/components/ui/command.tsx | 177 + src/components/ui/context-menu.tsx | 252 + src/components/ui/dialog.tsx | 135 + src/components/ui/drawer.tsx | 132 + src/components/ui/dropdown-menu.tsx | 257 + src/components/ui/form.tsx | 168 + src/components/ui/hover-card.tsx | 44 + src/components/ui/input-otp.tsx | 77 + src/components/ui/input.tsx | 21 + src/components/ui/label.tsx | 24 + src/components/ui/menubar.tsx | 276 ++ src/components/ui/navigation-menu.tsx | 168 + src/components/ui/pagination.tsx | 127 + src/components/ui/popover.tsx | 48 + src/components/ui/progress.tsx | 31 + src/components/ui/radio-group.tsx | 45 + src/components/ui/resizable.tsx | 56 + src/components/ui/scroll-area.tsx | 58 + src/components/ui/select.tsx | 189 + src/components/ui/separator.tsx | 28 + src/components/ui/sheet.tsx | 139 + src/components/ui/sidebar.tsx | 726 +++ src/components/ui/skeleton.tsx | 13 + src/components/ui/slider.tsx | 63 + src/components/ui/sonner.tsx | 25 + src/components/ui/switch.tsx | 31 + src/components/ui/table.tsx | 116 + src/components/ui/tabs.tsx | 66 + src/components/ui/textarea.tsx | 18 + src/components/ui/toggle-group.tsx | 73 + src/components/ui/toggle.tsx | 47 + src/components/ui/tooltip.tsx | 61 + src/components/ui/use-mobile.ts | 21 + src/components/ui/utils.ts | 6 + src/deploy-traditional-hosting.md | 95 + src/deploy-yandex-cloud.md | 45 + src/deploy.bat | 76 + src/deploy.sh | 63 + src/guidelines/Guidelines.md | 61 + src/index.css | 8 + src/index.html | 14 + src/main.tsx | 11 + src/netlify.toml | 11 + src/package-lock.json | 1850 ++++++++ src/package.json | 33 + src/pages/AISolutionsPage.tsx | 64 + src/pages/BusinessPage.tsx | 64 + src/pages/CADandGISPage.tsx | 64 + src/pages/CloudPage.tsx | 49 + src/pages/ConsultingPage.tsx | 49 + src/pages/CybersecurityPage.tsx | 64 + src/pages/GovernmentPage.tsx | 64 + src/pages/HardwareSolutionsPage.tsx | 64 + src/pages/HomePage.tsx | 29 + src/pages/ImplementationPage.tsx | 49 + src/pages/IndustrialSolutionsPage.tsx | 64 + src/pages/IntegrationPage.tsx | 49 + src/pages/ManagedServicesPage.tsx | 49 + src/pages/RussianHardwarePage.tsx | 64 + src/pages/RussianSoftwarePage.tsx | 64 + src/pages/SpecializedServicesPage.tsx | 49 + src/pages/SubscriptionPage.tsx | 49 + src/pages/SupportPage.tsx | 49 + src/postcss.config.js | 6 + src/public/CNAME/main.tsx | 1 + src/public/favicon.svg | 4 + src/styles/animations.css | 39 + src/styles/globals.css | 202 + src/tailwind.config.js | 11 + src/tsconfig.json | 21 + src/tsconfig.node.json | 10 + src/vercel.json | 8 + src/vite.config.ts | 17 + src/workflows/deploy.yml | 53 + vite.config.ts | 61 + 124 files changed, 18491 insertions(+) create mode 100644 .gitignore create mode 100644 README.md create mode 100644 index.html create mode 100644 package-lock.json create mode 100644 package.json create mode 100644 src/App.tsx create mode 100644 src/Attributions.md create mode 100644 src/COMMIT-AND-DEPLOY.md create mode 100644 src/DEPLOY-QUICK.md create mode 100644 src/DEPLOYMENT-CHECKLIST.md create mode 100644 src/DEPLOYMENT.md create mode 100644 src/FILES-OVERVIEW.md create mode 100644 src/FIXES-SUMMARY.md create mode 100644 src/LATEST-FIXES.md create mode 100644 src/NETLIFY-FIX.md create mode 100644 src/NODE-VERSION-FIX.md create mode 100644 src/PLATFORMS.md create mode 100644 src/PROMPT-FOR-RECREATION.md create mode 100644 src/README.md create mode 100644 src/START-HERE.md create mode 100644 src/_headers/main.tsx create mode 100644 src/_redirects/main.tsx create mode 100644 src/check-build.bat create mode 100644 src/check-build.sh create mode 100644 src/components/About.tsx create mode 100644 src/components/Cases.tsx create mode 100644 src/components/CategoryPage.tsx create mode 100644 src/components/Contact.tsx create mode 100644 src/components/ContactModal.tsx create mode 100644 src/components/Footer.tsx create mode 100644 src/components/Header.tsx create mode 100644 src/components/Hero.tsx create mode 100644 src/components/Services.tsx create mode 100644 src/components/Solutions.tsx create mode 100644 src/components/figma/ImageWithFallback.tsx create mode 100644 src/components/ui/accordion.tsx create mode 100644 src/components/ui/alert-dialog.tsx create mode 100644 src/components/ui/alert.tsx create mode 100644 src/components/ui/aspect-ratio.tsx create mode 100644 src/components/ui/avatar.tsx create mode 100644 src/components/ui/badge.tsx create mode 100644 src/components/ui/breadcrumb.tsx create mode 100644 src/components/ui/button.tsx create mode 100644 src/components/ui/calendar.tsx create mode 100644 src/components/ui/card.tsx create mode 100644 src/components/ui/carousel.tsx create mode 100644 src/components/ui/chart.tsx create mode 100644 src/components/ui/checkbox.tsx create mode 100644 src/components/ui/collapsible.tsx create mode 100644 src/components/ui/command.tsx create mode 100644 src/components/ui/context-menu.tsx create mode 100644 src/components/ui/dialog.tsx create mode 100644 src/components/ui/drawer.tsx create mode 100644 src/components/ui/dropdown-menu.tsx create mode 100644 src/components/ui/form.tsx create mode 100644 src/components/ui/hover-card.tsx create mode 100644 src/components/ui/input-otp.tsx create mode 100644 src/components/ui/input.tsx create mode 100644 src/components/ui/label.tsx create mode 100644 src/components/ui/menubar.tsx create mode 100644 src/components/ui/navigation-menu.tsx create mode 100644 src/components/ui/pagination.tsx create mode 100644 src/components/ui/popover.tsx create mode 100644 src/components/ui/progress.tsx create mode 100644 src/components/ui/radio-group.tsx create mode 100644 src/components/ui/resizable.tsx create mode 100644 src/components/ui/scroll-area.tsx create mode 100644 src/components/ui/select.tsx create mode 100644 src/components/ui/separator.tsx create mode 100644 src/components/ui/sheet.tsx create mode 100644 src/components/ui/sidebar.tsx create mode 100644 src/components/ui/skeleton.tsx create mode 100644 src/components/ui/slider.tsx create mode 100644 src/components/ui/sonner.tsx create mode 100644 src/components/ui/switch.tsx create mode 100644 src/components/ui/table.tsx create mode 100644 src/components/ui/tabs.tsx create mode 100644 src/components/ui/textarea.tsx create mode 100644 src/components/ui/toggle-group.tsx create mode 100644 src/components/ui/toggle.tsx create mode 100644 src/components/ui/tooltip.tsx create mode 100644 src/components/ui/use-mobile.ts create mode 100644 src/components/ui/utils.ts create mode 100644 src/deploy-traditional-hosting.md create mode 100644 src/deploy-yandex-cloud.md create mode 100644 src/deploy.bat create mode 100644 src/deploy.sh create mode 100644 src/guidelines/Guidelines.md create mode 100644 src/index.css create mode 100644 src/index.html create mode 100644 src/main.tsx create mode 100644 src/netlify.toml create mode 100644 src/package-lock.json create mode 100644 src/package.json create mode 100644 src/pages/AISolutionsPage.tsx create mode 100644 src/pages/BusinessPage.tsx create mode 100644 src/pages/CADandGISPage.tsx create mode 100644 src/pages/CloudPage.tsx create mode 100644 src/pages/ConsultingPage.tsx create mode 100644 src/pages/CybersecurityPage.tsx create mode 100644 src/pages/GovernmentPage.tsx create mode 100644 src/pages/HardwareSolutionsPage.tsx create mode 100644 src/pages/HomePage.tsx create mode 100644 src/pages/ImplementationPage.tsx create mode 100644 src/pages/IndustrialSolutionsPage.tsx create mode 100644 src/pages/IntegrationPage.tsx create mode 100644 src/pages/ManagedServicesPage.tsx create mode 100644 src/pages/RussianHardwarePage.tsx create mode 100644 src/pages/RussianSoftwarePage.tsx create mode 100644 src/pages/SpecializedServicesPage.tsx create mode 100644 src/pages/SubscriptionPage.tsx create mode 100644 src/pages/SupportPage.tsx create mode 100644 src/postcss.config.js create mode 100644 src/public/CNAME/main.tsx create mode 100644 src/public/favicon.svg create mode 100644 src/styles/animations.css create mode 100644 src/styles/globals.css create mode 100644 src/tailwind.config.js create mode 100644 src/tsconfig.json create mode 100644 src/tsconfig.node.json create mode 100644 src/vercel.json create mode 100644 src/vite.config.ts create mode 100644 src/workflows/deploy.yml create mode 100644 vite.config.ts diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..ed941d9 --- /dev/null +++ b/.gitignore @@ -0,0 +1,37 @@ +.DS_Store +node_modules +/build +/package +vite.config.js.timestamp-* +vite.config.ts.timestamp-* + +.vscode/* +!.vscode/settings.json +/.idea +/coverage +/test-results +/allure-report +/allure-results +/.cache +*.log +/dist +/storybook-static +!.vscode/snippets.code-snippets +*.env +/test-results/ +/playwright-report/ +/playwright/.cache/ +/infra/certs/ +/.svelte-kit/** +!/.svelte-kit/tsconfig.json +src/i18n/*.json + +### Playwright + +/test-results/ +/playwright-report/ +/playwright/.cache/ +results.json +/tests/**/*-darwin.png +/failed_tests.txt +__f2f_cookies.json \ No newline at end of file diff --git a/README.md b/README.md new file mode 100644 index 0000000..29adb3e --- /dev/null +++ b/README.md @@ -0,0 +1,11 @@ + + # Redesign Modern Website (Copy) + + This is a code bundle for Redesign Modern Website (Copy). The original project is available at https://www.figma.com/design/YgZy1khwB5JnJFfONCi1cA/Redesign-Modern-Website--Copy-. + + ## Running the code + + Run `npm i` to install the dependencies. + + Run `npm run dev` to start the development server. + \ No newline at end of file diff --git a/index.html b/index.html new file mode 100644 index 0000000..e1ed561 --- /dev/null +++ b/index.html @@ -0,0 +1,15 @@ + + + + + + + Redesign Modern Website (Copy) + + + +
+ + + + \ No newline at end of file diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..8e7b940 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,4910 @@ +{ + "name": "Redesign Modern Website (Copy)", + "version": "0.1.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "Redesign Modern Website (Copy)", + "version": "0.1.0", + "dependencies": { + "@radix-ui/react-accordion": "^1.2.3", + "@radix-ui/react-alert-dialog": "^1.1.6", + "@radix-ui/react-aspect-ratio": "^1.1.2", + "@radix-ui/react-avatar": "^1.1.3", + "@radix-ui/react-checkbox": "^1.1.4", + "@radix-ui/react-collapsible": "^1.1.3", + "@radix-ui/react-context-menu": "^2.2.6", + "@radix-ui/react-dialog": "^1.1.6", + "@radix-ui/react-dropdown-menu": "^2.1.6", + "@radix-ui/react-hover-card": "^1.1.6", + "@radix-ui/react-label": "^2.1.2", + "@radix-ui/react-menubar": "^1.1.6", + "@radix-ui/react-navigation-menu": "^1.2.5", + "@radix-ui/react-popover": "^1.1.6", + "@radix-ui/react-progress": "^1.1.2", + "@radix-ui/react-radio-group": "^1.2.3", + "@radix-ui/react-scroll-area": "^1.2.3", + "@radix-ui/react-select": "^2.1.6", + "@radix-ui/react-separator": "^1.1.2", + "@radix-ui/react-slider": "^1.2.3", + "@radix-ui/react-slot": "^1.1.2", + "@radix-ui/react-switch": "^1.1.3", + "@radix-ui/react-tabs": "^1.1.3", + "@radix-ui/react-toggle": "^1.1.2", + "@radix-ui/react-toggle-group": "^1.1.2", + "@radix-ui/react-tooltip": "^1.1.8", + "@vitejs/plugin-react": "*", + "class-variance-authority": "^0.7.1", + "clsx": "*", + "cmdk": "^1.1.1", + "embla-carousel-react": "^8.6.0", + "input-otp": "^1.4.2", + "lucide-react": "^0.487.0", + "next-themes": "^0.4.6", + "path": "*", + "react": "^18.3.1", + "react-day-picker": "^8.10.1", + "react-dom": "^18.3.1", + "react-hook-form": "^7.55.0", + "react-resizable-panels": "^2.1.7", + "recharts": "^2.15.2", + "sonner": "^2.0.3", + "tailwind-merge": "*", + "tailwindcss": "*", + "tw-animate-css": "^1.3.8", + "vaul": "^1.1.2", + "vite": "*" + }, + "devDependencies": { + "@tailwindcss/vite": "4.1.12", + "@types/node": "^20.10.0", + "@vitejs/plugin-react": "^4.7.0", + "tailwindcss": "4.1.12", + "vite": "6.3.5" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.29.0.tgz", + "integrity": "sha512-9NhCeYjq9+3uxgdtp20LSiJXJvN0FeCtNGpJxuMFZ1Kv3cWUNb6DOhJwUvcVCzKGR66cw4njwM6hrJLqgOwbcw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-validator-identifier": "^7.28.5", + "js-tokens": "^4.0.0", + "picocolors": "^1.1.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/compat-data": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.29.0.tgz", + "integrity": "sha512-T1NCJqT/j9+cn8fvkt7jtwbLBfLC/1y1c7NtCeXFRgzGTsafi68MRv8yzkYSapBnFA6L3U2VSc02ciDzoAJhJg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.29.0.tgz", + "integrity": "sha512-CGOfOJqWjg2qW/Mb6zNsDm+u5vFQ8DxXfbM09z69p5Z6+mE1ikP2jUXw+j42Pf1XTYED2Rni5f95npYeuwMDQA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.29.0", + "@babel/generator": "^7.29.0", + "@babel/helper-compilation-targets": "^7.28.6", + "@babel/helper-module-transforms": "^7.28.6", + "@babel/helpers": "^7.28.6", + "@babel/parser": "^7.29.0", + "@babel/template": "^7.28.6", + "@babel/traverse": "^7.29.0", + "@babel/types": "^7.29.0", + "@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.29.1", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.29.1.tgz", + "integrity": "sha512-qsaF+9Qcm2Qv8SRIMMscAvG4O3lJ0F1GuMo5HR/Bp02LopNgnZBC/EkbevHFeGs4ls/oPz9v+Bsmzbkbe+0dUw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.29.0", + "@babel/types": "^7.29.0", + "@jridgewell/gen-mapping": "^0.3.12", + "@jridgewell/trace-mapping": "^0.3.28", + "jsesc": "^3.0.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.28.6.tgz", + "integrity": "sha512-JYtls3hqi15fcx5GaSNL7SCTJ2MNmjrkHXg4FSpOA/grxK8KwyZ5bubHsCq8FXCkua6xhuaaBit+3b7+VZRfcA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/compat-data": "^7.28.6", + "@babel/helper-validator-option": "^7.27.1", + "browserslist": "^4.24.0", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-globals": { + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.28.0.tgz", + "integrity": "sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.28.6.tgz", + "integrity": "sha512-l5XkZK7r7wa9LucGw9LwZyyCUscb4x37JWTPz7swwFE/0FMQAGpiWUZn8u9DzkSBWEcK25jmvubfpw2dnAMdbw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.28.6", + "@babel/types": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.28.6.tgz", + "integrity": "sha512-67oXFAYr2cDLDVGLXTEABjdBJZ6drElUSI7WKp70NrpyISso3plG9SAGEF6y7zbha/wOzUByWWTJvEDVNIUGcA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-module-imports": "^7.28.6", + "@babel/helper-validator-identifier": "^7.28.5", + "@babel/traverse": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-plugin-utils": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.28.6.tgz", + "integrity": "sha512-S9gzZ/bz83GRysI7gAD4wPT/AI3uCnY+9xn+Mx/KPs2JwHJIz1W8PZkg2cqyt3RNOBM8ejcXhV6y8Og7ly/Dug==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz", + "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz", + "integrity": "sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-option": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.27.1.tgz", + "integrity": "sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.29.2", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.29.2.tgz", + "integrity": "sha512-HoGuUs4sCZNezVEKdVcwqmZN8GoHirLUcLaYVNBK2J0DadGtdcqgr3BCbvH8+XUo4NGjNl3VOtSjEKNzqfFgKw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/template": "^7.28.6", + "@babel/types": "^7.29.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.29.2", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.29.2.tgz", + "integrity": "sha512-4GgRzy/+fsBa72/RZVJmGKPmZu9Byn8o4MoLpmNe1m8ZfYnz5emHLQz3U4gLud6Zwl0RZIcgiLD7Uq7ySFuDLA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.29.0" + }, + "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/runtime": { + "version": "7.29.2", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.29.2.tgz", + "integrity": "sha512-JiDShH45zKHWyGe4ZNVRrCjBz8Nh9TMmZG1kh4QTK8hCBTWBi8Da+i7s1fJw7/lYpM4ccepSNfqzZ/QvABBi5g==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/template": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.28.6.tgz", + "integrity": "sha512-YA6Ma2KsCdGb+WC6UpBVFJGXL58MDA6oyONbjyF/+5sBgxY/dwkhLogbMT2GXXyU84/IhRw/2D1Os1B/giz+BQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.28.6", + "@babel/parser": "^7.28.6", + "@babel/types": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.29.0.tgz", + "integrity": "sha512-4HPiQr0X7+waHfyXPZpWPfWL/J7dcN1mx9gL6WdQVMbPnF3+ZhSMs8tCxN7oHddJE9fhNE7+lxdnlyemKfJRuA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.29.0", + "@babel/generator": "^7.29.0", + "@babel/helper-globals": "^7.28.0", + "@babel/parser": "^7.29.0", + "@babel/template": "^7.28.6", + "@babel/types": "^7.29.0", + "debug": "^4.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/types": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.0.tgz", + "integrity": "sha512-LwdZHpScM4Qz8Xw2iKSzS+cfglZzJGvofQICy7W7v4caru4EaAmyUuO6BGrbyQ2mYV11W0U8j5mBhd14dd3B0A==", + "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.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.12.tgz", + "integrity": "sha512-Hhmwd6CInZ3dwpuGTF8fJG6yoWmsToE+vYgD4nytZVxcu1ulHpUQRAB1UJ8+N1Am3Mz4+xOByoQoSZf4D+CpkA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.12.tgz", + "integrity": "sha512-VJ+sKvNA/GE7Ccacc9Cha7bpS8nyzVv0jdVgwNDaR4gDMC/2TTRc33Ip8qrNYUcpkOHUT5OZ0bUcNNVZQ9RLlg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.12.tgz", + "integrity": "sha512-6AAmLG7zwD1Z159jCKPvAxZd4y/VTO0VkprYy+3N2FtJ8+BQWFXU+OxARIwA46c5tdD9SsKGZ/1ocqBS/gAKHg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.12.tgz", + "integrity": "sha512-5jbb+2hhDHx5phYR2By8GTWEzn6I9UqR11Kwf22iKbNpYrsmRB18aX/9ivc5cabcUiAT/wM+YIZ6SG9QO6a8kg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.12.tgz", + "integrity": "sha512-N3zl+lxHCifgIlcMUP5016ESkeQjLj/959RxxNYIthIg+CQHInujFuXeWbWMgnTo4cp5XVHqFPmpyu9J65C1Yg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.12.tgz", + "integrity": "sha512-HQ9ka4Kx21qHXwtlTUVbKJOAnmG1ipXhdWTmNXiPzPfWKpXqASVcWdnf2bnL73wgjNrFXAa3yYvBSd9pzfEIpA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.12.tgz", + "integrity": "sha512-gA0Bx759+7Jve03K1S0vkOu5Lg/85dou3EseOGUes8flVOGxbhDDh/iZaoek11Y8mtyKPGF3vP8XhnkDEAmzeg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.12.tgz", + "integrity": "sha512-TGbO26Yw2xsHzxtbVFGEXBFH0FRAP7gtcPE7P5yP7wGy7cXK2oO7RyOhL5NLiqTlBh47XhmIUXuGciXEqYFfBQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.12.tgz", + "integrity": "sha512-lPDGyC1JPDou8kGcywY0YILzWlhhnRjdof3UlcoqYmS9El818LLfJJc3PXXgZHrHCAKs/Z2SeZtDJr5MrkxtOw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.12.tgz", + "integrity": "sha512-8bwX7a8FghIgrupcxb4aUmYDLp8pX06rGh5HqDT7bB+8Rdells6mHvrFHHW2JAOPZUbnjUpKTLg6ECyzvas2AQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.12.tgz", + "integrity": "sha512-0y9KrdVnbMM2/vG8KfU0byhUN+EFCny9+8g202gYqSSVMonbsCfLjUO+rCci7pM0WBEtz+oK/PIwHkzxkyharA==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.12.tgz", + "integrity": "sha512-h///Lr5a9rib/v1GGqXVGzjL4TMvVTv+s1DPoxQdz7l/AYv6LDSxdIwzxkrPW438oUXiDtwM10o9PmwS/6Z0Ng==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.12.tgz", + "integrity": "sha512-iyRrM1Pzy9GFMDLsXn1iHUm18nhKnNMWscjmp4+hpafcZjrr2WbT//d20xaGljXDBYHqRcl8HnxbX6uaA/eGVw==", + "cpu": [ + "mips64el" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.12.tgz", + "integrity": "sha512-9meM/lRXxMi5PSUqEXRCtVjEZBGwB7P/D4yT8UG/mwIdze2aV4Vo6U5gD3+RsoHXKkHCfSxZKzmDssVlRj1QQA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.12.tgz", + "integrity": "sha512-Zr7KR4hgKUpWAwb1f3o5ygT04MzqVrGEGXGLnj15YQDJErYu/BGg+wmFlIDOdJp0PmB0lLvxFIOXZgFRrdjR0w==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.12.tgz", + "integrity": "sha512-MsKncOcgTNvdtiISc/jZs/Zf8d0cl/t3gYWX8J9ubBnVOwlk65UIEEvgBORTiljloIWnBzLs4qhzPkJcitIzIg==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.12.tgz", + "integrity": "sha512-uqZMTLr/zR/ed4jIGnwSLkaHmPjOjJvnm6TVVitAa08SLS9Z0VM8wIRx7gWbJB5/J54YuIMInDquWyYvQLZkgw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.12.tgz", + "integrity": "sha512-xXwcTq4GhRM7J9A8Gv5boanHhRa/Q9KLVmcyXHCTaM4wKfIpWkdXiMog/KsnxzJ0A1+nD+zoecuzqPmCRyBGjg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.12.tgz", + "integrity": "sha512-Ld5pTlzPy3YwGec4OuHh1aCVCRvOXdH8DgRjfDy/oumVovmuSzWfnSJg+VtakB9Cm0gxNO9BzWkj6mtO1FMXkQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.12.tgz", + "integrity": "sha512-fF96T6KsBo/pkQI950FARU9apGNTSlZGsv1jZBAlcLL1MLjLNIWPBkj5NlSz8aAzYKg+eNqknrUJ24QBybeR5A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.12.tgz", + "integrity": "sha512-MZyXUkZHjQxUvzK7rN8DJ3SRmrVrke8ZyRusHlP+kuwqTcfWLyqMOE3sScPPyeIXN/mDJIfGXvcMqCgYKekoQw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openharmony-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.25.12.tgz", + "integrity": "sha512-rm0YWsqUSRrjncSXGA7Zv78Nbnw4XL6/dzr20cyrQf7ZmRcsovpcRBdhD43Nuk3y7XIoW2OxMVvwuRvk9XdASg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.12.tgz", + "integrity": "sha512-3wGSCDyuTHQUzt0nV7bocDy72r2lI33QL3gkDNGkod22EsYl04sMf0qLb8luNKTOmgF/eDEDP5BFNwoBKH441w==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.12.tgz", + "integrity": "sha512-rMmLrur64A7+DKlnSuwqUdRKyd3UE7oPJZmnljqEptesKM8wx9J8gx5u0+9Pq0fQQW8vqeKebwNXdfOyP+8Bsg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.12.tgz", + "integrity": "sha512-HkqnmmBoCbCwxUKKNPBixiWDGCpQGVsrQfJoVGYLPT41XWF8lHuE5N6WhVia2n4o5QK5M4tYr21827fNhi4byQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.12.tgz", + "integrity": "sha512-alJC0uCZpTFrSL0CCDjcgleBXPnCrEAhTBILpeAp7M/OFgoqtAetfBzX0xM00MUsVVPpVjlPuMbREqnZCXaTnA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@floating-ui/core": { + "version": "1.7.5", + "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.7.5.tgz", + "integrity": "sha512-1Ih4WTWyw0+lKyFMcBHGbb5U5FtuHJuujoyyr5zTaWS5EYMeT6Jb2AuDeftsCsEuchO+mM2ij5+q9crhydzLhQ==", + "license": "MIT", + "dependencies": { + "@floating-ui/utils": "^0.2.11" + } + }, + "node_modules/@floating-ui/dom": { + "version": "1.7.6", + "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.7.6.tgz", + "integrity": "sha512-9gZSAI5XM36880PPMm//9dfiEngYoC6Am2izES1FF406YFsjvyBMmeJ2g4SAju3xWwtuynNRFL2s9hgxpLI5SQ==", + "license": "MIT", + "dependencies": { + "@floating-ui/core": "^1.7.5", + "@floating-ui/utils": "^0.2.11" + } + }, + "node_modules/@floating-ui/react-dom": { + "version": "2.1.8", + "resolved": "https://registry.npmjs.org/@floating-ui/react-dom/-/react-dom-2.1.8.tgz", + "integrity": "sha512-cC52bHwM/n/CxS87FH0yWdngEZrjdtLW/qVruo68qg+prK7ZQ4YGdut2GyDVpoGeAYe/h899rVeOVm6Oi40k2A==", + "license": "MIT", + "dependencies": { + "@floating-ui/dom": "^1.7.6" + }, + "peerDependencies": { + "react": ">=16.8.0", + "react-dom": ">=16.8.0" + } + }, + "node_modules/@floating-ui/utils": { + "version": "0.2.11", + "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.2.11.tgz", + "integrity": "sha512-RiB/yIh78pcIxl6lLMG0CgBXAZ2Y0eVHqMPYugu+9U0AeT6YBeiJpf7lbdJNIugFP5SIjwNRgo4DhR1Qxi26Gg==", + "license": "MIT" + }, + "node_modules/@isaacs/fs-minipass": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@isaacs/fs-minipass/-/fs-minipass-4.0.1.tgz", + "integrity": "sha512-wgm9Ehl2jpeqP3zw/7mo3kRHFp5MEDhqAdwy1fTGkHAwnkGOVsgpvQhL8B5n1qlb01jV3n/bI0ZfZp5lWA1k4w==", + "dev": true, + "license": "ISC", + "dependencies": { + "minipass": "^7.0.4" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.13", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", + "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/@radix-ui/number": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@radix-ui/number/-/number-1.1.1.tgz", + "integrity": "sha512-MkKCwxlXTgz6CFoJx3pCwn07GKp36+aZyu/u2Ln2VrA5DcdyCZkASEDBTd8x5whTQQL5CiYf4prXKLcgQdv29g==", + "license": "MIT" + }, + "node_modules/@radix-ui/primitive": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@radix-ui/primitive/-/primitive-1.1.3.tgz", + "integrity": "sha512-JTF99U/6XIjCBo0wqkU5sK10glYe27MRRsfwoiq5zzOEZLHU3A3KCMa5X/azekYRCJ0HlwI0crAXS/5dEHTzDg==", + "license": "MIT" + }, + "node_modules/@radix-ui/react-accordion": { + "version": "1.2.12", + "resolved": "https://registry.npmjs.org/@radix-ui/react-accordion/-/react-accordion-1.2.12.tgz", + "integrity": "sha512-T4nygeh9YE9dLRPhAHSeOZi7HBXo+0kYIPJXayZfvWOWA0+n3dESrZbjfDPUABkUNym6Hd+f2IR113To8D2GPA==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.3", + "@radix-ui/react-collapsible": "1.1.12", + "@radix-ui/react-collection": "1.1.7", + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-direction": "1.1.1", + "@radix-ui/react-id": "1.1.1", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-use-controllable-state": "1.2.2" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-alert-dialog": { + "version": "1.1.15", + "resolved": "https://registry.npmjs.org/@radix-ui/react-alert-dialog/-/react-alert-dialog-1.1.15.tgz", + "integrity": "sha512-oTVLkEw5GpdRe29BqJ0LSDFWI3qu0vR1M0mUkOQWDIUnY/QIkLpgDMWuKxP94c2NAC2LGcgVhG1ImF3jkZ5wXw==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.3", + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-dialog": "1.1.15", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-slot": "1.2.3" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-alert-dialog/node_modules/@radix-ui/react-slot": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.2.3.tgz", + "integrity": "sha512-aeNmHnBxbi2St0au6VBVC7JXFlhLlOnvIIlePNniyUNAClzmtAUEY8/pBiK3iHjufOlwA+c20/8jngo7xcrg8A==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-compose-refs": "1.1.2" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-arrow": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/@radix-ui/react-arrow/-/react-arrow-1.1.7.tgz", + "integrity": "sha512-F+M1tLhO+mlQaOWspE8Wstg+z6PwxwRd8oQ8IXceWz92kfAmalTRf0EjrouQeo7QssEPfCn05B4Ihs1K9WQ/7w==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-primitive": "2.1.3" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-aspect-ratio": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/@radix-ui/react-aspect-ratio/-/react-aspect-ratio-1.1.8.tgz", + "integrity": "sha512-5nZrJTF7gH+e0nZS7/QxFz6tJV4VimhQb1avEgtsJxvvIp5JilL+c58HICsKzPxghdwaDt48hEfPM1au4zGy+w==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-primitive": "2.1.4" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-aspect-ratio/node_modules/@radix-ui/react-primitive": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-2.1.4.tgz", + "integrity": "sha512-9hQc4+GNVtJAIEPEqlYqW5RiYdrr8ea5XQ0ZOnD6fgru+83kqT15mq2OCcbe8KnjRZl5vF3ks69AKz3kh1jrhg==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-slot": "1.2.4" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-avatar": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/@radix-ui/react-avatar/-/react-avatar-1.1.11.tgz", + "integrity": "sha512-0Qk603AHGV28BOBO34p7IgD5m+V5Sg/YovfayABkoDDBM5d3NCx0Mp4gGrjzLGes1jV5eNOE1r3itqOR33VC6Q==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-context": "1.1.3", + "@radix-ui/react-primitive": "2.1.4", + "@radix-ui/react-use-callback-ref": "1.1.1", + "@radix-ui/react-use-is-hydrated": "0.1.0", + "@radix-ui/react-use-layout-effect": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-avatar/node_modules/@radix-ui/react-context": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@radix-ui/react-context/-/react-context-1.1.3.tgz", + "integrity": "sha512-ieIFACdMpYfMEjF0rEf5KLvfVyIkOz6PDGyNnP+u+4xQ6jny3VCgA4OgXOwNx2aUkxn8zx9fiVcM8CfFYv9Lxw==", + "license": "MIT", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-avatar/node_modules/@radix-ui/react-primitive": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-2.1.4.tgz", + "integrity": "sha512-9hQc4+GNVtJAIEPEqlYqW5RiYdrr8ea5XQ0ZOnD6fgru+83kqT15mq2OCcbe8KnjRZl5vF3ks69AKz3kh1jrhg==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-slot": "1.2.4" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-checkbox": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/@radix-ui/react-checkbox/-/react-checkbox-1.3.3.tgz", + "integrity": "sha512-wBbpv+NQftHDdG86Qc0pIyXk5IR3tM8Vd0nWLKDcX8nNn4nXFOFwsKuqw2okA/1D/mpaAkmuyndrPJTYDNZtFw==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.3", + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-presence": "1.1.5", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-use-controllable-state": "1.2.2", + "@radix-ui/react-use-previous": "1.1.1", + "@radix-ui/react-use-size": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-collapsible": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/@radix-ui/react-collapsible/-/react-collapsible-1.1.12.tgz", + "integrity": "sha512-Uu+mSh4agx2ib1uIGPP4/CKNULyajb3p92LsVXmH2EHVMTfZWpll88XJ0j4W0z3f8NK1eYl1+Mf/szHPmcHzyA==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.3", + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-id": "1.1.1", + "@radix-ui/react-presence": "1.1.5", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-use-controllable-state": "1.2.2", + "@radix-ui/react-use-layout-effect": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-collection": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/@radix-ui/react-collection/-/react-collection-1.1.7.tgz", + "integrity": "sha512-Fh9rGN0MoI4ZFUNyfFVNU4y9LUz93u9/0K+yLgA2bwRojxM8JU1DyvvMBabnZPBgMWREAJvU2jjVzq+LrFUglw==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-slot": "1.2.3" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-collection/node_modules/@radix-ui/react-slot": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.2.3.tgz", + "integrity": "sha512-aeNmHnBxbi2St0au6VBVC7JXFlhLlOnvIIlePNniyUNAClzmtAUEY8/pBiK3iHjufOlwA+c20/8jngo7xcrg8A==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-compose-refs": "1.1.2" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-compose-refs": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@radix-ui/react-compose-refs/-/react-compose-refs-1.1.2.tgz", + "integrity": "sha512-z4eqJvfiNnFMHIIvXP3CY57y2WJs5g2v3X0zm9mEJkrkNv4rDxu+sg9Jh8EkXyeqBkB7SOcboo9dMVqhyrACIg==", + "license": "MIT", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-context": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@radix-ui/react-context/-/react-context-1.1.2.tgz", + "integrity": "sha512-jCi/QKUM2r1Ju5a3J64TH2A5SpKAgh0LpknyqdQ4m6DCV0xJ2HG1xARRwNGPQfi1SLdLWZ1OJz6F4OMBBNiGJA==", + "license": "MIT", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-context-menu": { + "version": "2.2.16", + "resolved": "https://registry.npmjs.org/@radix-ui/react-context-menu/-/react-context-menu-2.2.16.tgz", + "integrity": "sha512-O8morBEW+HsVG28gYDZPTrT9UUovQUlJue5YO836tiTJhuIWBm/zQHc7j388sHWtdH/xUZurK9olD2+pcqx5ww==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.3", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-menu": "2.1.16", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-use-callback-ref": "1.1.1", + "@radix-ui/react-use-controllable-state": "1.2.2" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-dialog": { + "version": "1.1.15", + "resolved": "https://registry.npmjs.org/@radix-ui/react-dialog/-/react-dialog-1.1.15.tgz", + "integrity": "sha512-TCglVRtzlffRNxRMEyR36DGBLJpeusFcgMVD9PZEzAKnUs1lKCgX5u9BmC2Yg+LL9MgZDugFFs1Vl+Jp4t/PGw==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.3", + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-dismissable-layer": "1.1.11", + "@radix-ui/react-focus-guards": "1.1.3", + "@radix-ui/react-focus-scope": "1.1.7", + "@radix-ui/react-id": "1.1.1", + "@radix-ui/react-portal": "1.1.9", + "@radix-ui/react-presence": "1.1.5", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-slot": "1.2.3", + "@radix-ui/react-use-controllable-state": "1.2.2", + "aria-hidden": "^1.2.4", + "react-remove-scroll": "^2.6.3" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-dialog/node_modules/@radix-ui/react-slot": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.2.3.tgz", + "integrity": "sha512-aeNmHnBxbi2St0au6VBVC7JXFlhLlOnvIIlePNniyUNAClzmtAUEY8/pBiK3iHjufOlwA+c20/8jngo7xcrg8A==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-compose-refs": "1.1.2" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-direction": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-direction/-/react-direction-1.1.1.tgz", + "integrity": "sha512-1UEWRX6jnOA2y4H5WczZ44gOOjTEmlqv1uNW4GAJEO5+bauCBhv8snY65Iw5/VOS/ghKN9gr2KjnLKxrsvoMVw==", + "license": "MIT", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-dismissable-layer": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/@radix-ui/react-dismissable-layer/-/react-dismissable-layer-1.1.11.tgz", + "integrity": "sha512-Nqcp+t5cTB8BinFkZgXiMJniQH0PsUt2k51FUhbdfeKvc4ACcG2uQniY/8+h1Yv6Kza4Q7lD7PQV0z0oicE0Mg==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.3", + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-use-callback-ref": "1.1.1", + "@radix-ui/react-use-escape-keydown": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-dropdown-menu": { + "version": "2.1.16", + "resolved": "https://registry.npmjs.org/@radix-ui/react-dropdown-menu/-/react-dropdown-menu-2.1.16.tgz", + "integrity": "sha512-1PLGQEynI/3OX/ftV54COn+3Sud/Mn8vALg2rWnBLnRaGtJDduNW/22XjlGgPdpcIbiQxjKtb7BkcjP00nqfJw==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.3", + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-id": "1.1.1", + "@radix-ui/react-menu": "2.1.16", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-use-controllable-state": "1.2.2" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-focus-guards": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@radix-ui/react-focus-guards/-/react-focus-guards-1.1.3.tgz", + "integrity": "sha512-0rFg/Rj2Q62NCm62jZw0QX7a3sz6QCQU0LpZdNrJX8byRGaGVTqbrW9jAoIAHyMQqsNpeZ81YgSizOt5WXq0Pw==", + "license": "MIT", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-focus-scope": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/@radix-ui/react-focus-scope/-/react-focus-scope-1.1.7.tgz", + "integrity": "sha512-t2ODlkXBQyn7jkl6TNaw/MtVEVvIGelJDCG41Okq/KwUsJBwQ4XVZsHAVUkK4mBv3ewiAS3PGuUWuY2BoK4ZUw==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-use-callback-ref": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-hover-card": { + "version": "1.1.15", + "resolved": "https://registry.npmjs.org/@radix-ui/react-hover-card/-/react-hover-card-1.1.15.tgz", + "integrity": "sha512-qgTkjNT1CfKMoP0rcasmlH2r1DAiYicWsDsufxl940sT2wHNEWWv6FMWIQXWhVdmC1d/HYfbhQx60KYyAtKxjg==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.3", + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-dismissable-layer": "1.1.11", + "@radix-ui/react-popper": "1.2.8", + "@radix-ui/react-portal": "1.1.9", + "@radix-ui/react-presence": "1.1.5", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-use-controllable-state": "1.2.2" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-id": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-id/-/react-id-1.1.1.tgz", + "integrity": "sha512-kGkGegYIdQsOb4XjsfM97rXsiHaBwco+hFI66oO4s9LU+PLAC5oJ7khdOVFxkhsmlbpUqDAvXw11CluXP+jkHg==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-use-layout-effect": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-label": { + "version": "2.1.8", + "resolved": "https://registry.npmjs.org/@radix-ui/react-label/-/react-label-2.1.8.tgz", + "integrity": "sha512-FmXs37I6hSBVDlO4y764TNz1rLgKwjJMQ0EGte6F3Cb3f4bIuHB/iLa/8I9VKkmOy+gNHq8rql3j686ACVV21A==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-primitive": "2.1.4" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-label/node_modules/@radix-ui/react-primitive": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-2.1.4.tgz", + "integrity": "sha512-9hQc4+GNVtJAIEPEqlYqW5RiYdrr8ea5XQ0ZOnD6fgru+83kqT15mq2OCcbe8KnjRZl5vF3ks69AKz3kh1jrhg==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-slot": "1.2.4" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-menu": { + "version": "2.1.16", + "resolved": "https://registry.npmjs.org/@radix-ui/react-menu/-/react-menu-2.1.16.tgz", + "integrity": "sha512-72F2T+PLlphrqLcAotYPp0uJMr5SjP5SL01wfEspJbru5Zs5vQaSHb4VB3ZMJPimgHHCHG7gMOeOB9H3Hdmtxg==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.3", + "@radix-ui/react-collection": "1.1.7", + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-direction": "1.1.1", + "@radix-ui/react-dismissable-layer": "1.1.11", + "@radix-ui/react-focus-guards": "1.1.3", + "@radix-ui/react-focus-scope": "1.1.7", + "@radix-ui/react-id": "1.1.1", + "@radix-ui/react-popper": "1.2.8", + "@radix-ui/react-portal": "1.1.9", + "@radix-ui/react-presence": "1.1.5", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-roving-focus": "1.1.11", + "@radix-ui/react-slot": "1.2.3", + "@radix-ui/react-use-callback-ref": "1.1.1", + "aria-hidden": "^1.2.4", + "react-remove-scroll": "^2.6.3" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-menu/node_modules/@radix-ui/react-slot": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.2.3.tgz", + "integrity": "sha512-aeNmHnBxbi2St0au6VBVC7JXFlhLlOnvIIlePNniyUNAClzmtAUEY8/pBiK3iHjufOlwA+c20/8jngo7xcrg8A==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-compose-refs": "1.1.2" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-menubar": { + "version": "1.1.16", + "resolved": "https://registry.npmjs.org/@radix-ui/react-menubar/-/react-menubar-1.1.16.tgz", + "integrity": "sha512-EB1FktTz5xRRi2Er974AUQZWg2yVBb1yjip38/lgwtCVRd3a+maUoGHN/xs9Yv8SY8QwbSEb+YrxGadVWbEutA==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.3", + "@radix-ui/react-collection": "1.1.7", + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-direction": "1.1.1", + "@radix-ui/react-id": "1.1.1", + "@radix-ui/react-menu": "2.1.16", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-roving-focus": "1.1.11", + "@radix-ui/react-use-controllable-state": "1.2.2" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-navigation-menu": { + "version": "1.2.14", + "resolved": "https://registry.npmjs.org/@radix-ui/react-navigation-menu/-/react-navigation-menu-1.2.14.tgz", + "integrity": "sha512-YB9mTFQvCOAQMHU+C/jVl96WmuWeltyUEpRJJky51huhds5W2FQr1J8D/16sQlf0ozxkPK8uF3niQMdUwZPv5w==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.3", + "@radix-ui/react-collection": "1.1.7", + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-direction": "1.1.1", + "@radix-ui/react-dismissable-layer": "1.1.11", + "@radix-ui/react-id": "1.1.1", + "@radix-ui/react-presence": "1.1.5", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-use-callback-ref": "1.1.1", + "@radix-ui/react-use-controllable-state": "1.2.2", + "@radix-ui/react-use-layout-effect": "1.1.1", + "@radix-ui/react-use-previous": "1.1.1", + "@radix-ui/react-visually-hidden": "1.2.3" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-popover": { + "version": "1.1.15", + "resolved": "https://registry.npmjs.org/@radix-ui/react-popover/-/react-popover-1.1.15.tgz", + "integrity": "sha512-kr0X2+6Yy/vJzLYJUPCZEc8SfQcf+1COFoAqauJm74umQhta9M7lNJHP7QQS3vkvcGLQUbWpMzwrXYwrYztHKA==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.3", + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-dismissable-layer": "1.1.11", + "@radix-ui/react-focus-guards": "1.1.3", + "@radix-ui/react-focus-scope": "1.1.7", + "@radix-ui/react-id": "1.1.1", + "@radix-ui/react-popper": "1.2.8", + "@radix-ui/react-portal": "1.1.9", + "@radix-ui/react-presence": "1.1.5", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-slot": "1.2.3", + "@radix-ui/react-use-controllable-state": "1.2.2", + "aria-hidden": "^1.2.4", + "react-remove-scroll": "^2.6.3" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-popover/node_modules/@radix-ui/react-slot": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.2.3.tgz", + "integrity": "sha512-aeNmHnBxbi2St0au6VBVC7JXFlhLlOnvIIlePNniyUNAClzmtAUEY8/pBiK3iHjufOlwA+c20/8jngo7xcrg8A==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-compose-refs": "1.1.2" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-popper": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@radix-ui/react-popper/-/react-popper-1.2.8.tgz", + "integrity": "sha512-0NJQ4LFFUuWkE7Oxf0htBKS6zLkkjBH+hM1uk7Ng705ReR8m/uelduy1DBo0PyBXPKVnBA6YBlU94MBGXrSBCw==", + "license": "MIT", + "dependencies": { + "@floating-ui/react-dom": "^2.0.0", + "@radix-ui/react-arrow": "1.1.7", + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-use-callback-ref": "1.1.1", + "@radix-ui/react-use-layout-effect": "1.1.1", + "@radix-ui/react-use-rect": "1.1.1", + "@radix-ui/react-use-size": "1.1.1", + "@radix-ui/rect": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-portal": { + "version": "1.1.9", + "resolved": "https://registry.npmjs.org/@radix-ui/react-portal/-/react-portal-1.1.9.tgz", + "integrity": "sha512-bpIxvq03if6UNwXZ+HTK71JLh4APvnXntDc6XOX8UVq4XQOVl7lwok0AvIl+b8zgCw3fSaVTZMpAPPagXbKmHQ==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-use-layout-effect": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-presence": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@radix-ui/react-presence/-/react-presence-1.1.5.tgz", + "integrity": "sha512-/jfEwNDdQVBCNvjkGit4h6pMOzq8bHkopq458dPt2lMjx+eBQUohZNG9A7DtO/O5ukSbxuaNGXMjHicgwy6rQQ==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-use-layout-effect": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-primitive": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-2.1.3.tgz", + "integrity": "sha512-m9gTwRkhy2lvCPe6QJp4d3G1TYEUHn/FzJUtq9MjH46an1wJU+GdoGC5VLof8RX8Ft/DlpshApkhswDLZzHIcQ==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-slot": "1.2.3" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-primitive/node_modules/@radix-ui/react-slot": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.2.3.tgz", + "integrity": "sha512-aeNmHnBxbi2St0au6VBVC7JXFlhLlOnvIIlePNniyUNAClzmtAUEY8/pBiK3iHjufOlwA+c20/8jngo7xcrg8A==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-compose-refs": "1.1.2" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-progress": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/@radix-ui/react-progress/-/react-progress-1.1.8.tgz", + "integrity": "sha512-+gISHcSPUJ7ktBy9RnTqbdKW78bcGke3t6taawyZ71pio1JewwGSJizycs7rLhGTvMJYCQB1DBK4KQsxs7U8dA==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-context": "1.1.3", + "@radix-ui/react-primitive": "2.1.4" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-progress/node_modules/@radix-ui/react-context": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@radix-ui/react-context/-/react-context-1.1.3.tgz", + "integrity": "sha512-ieIFACdMpYfMEjF0rEf5KLvfVyIkOz6PDGyNnP+u+4xQ6jny3VCgA4OgXOwNx2aUkxn8zx9fiVcM8CfFYv9Lxw==", + "license": "MIT", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-progress/node_modules/@radix-ui/react-primitive": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-2.1.4.tgz", + "integrity": "sha512-9hQc4+GNVtJAIEPEqlYqW5RiYdrr8ea5XQ0ZOnD6fgru+83kqT15mq2OCcbe8KnjRZl5vF3ks69AKz3kh1jrhg==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-slot": "1.2.4" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-radio-group": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/@radix-ui/react-radio-group/-/react-radio-group-1.3.8.tgz", + "integrity": "sha512-VBKYIYImA5zsxACdisNQ3BjCBfmbGH3kQlnFVqlWU4tXwjy7cGX8ta80BcrO+WJXIn5iBylEH3K6ZTlee//lgQ==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.3", + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-direction": "1.1.1", + "@radix-ui/react-presence": "1.1.5", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-roving-focus": "1.1.11", + "@radix-ui/react-use-controllable-state": "1.2.2", + "@radix-ui/react-use-previous": "1.1.1", + "@radix-ui/react-use-size": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-roving-focus": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/@radix-ui/react-roving-focus/-/react-roving-focus-1.1.11.tgz", + "integrity": "sha512-7A6S9jSgm/S+7MdtNDSb+IU859vQqJ/QAtcYQcfFC6W8RS4IxIZDldLR0xqCFZ6DCyrQLjLPsxtTNch5jVA4lA==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.3", + "@radix-ui/react-collection": "1.1.7", + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-direction": "1.1.1", + "@radix-ui/react-id": "1.1.1", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-use-callback-ref": "1.1.1", + "@radix-ui/react-use-controllable-state": "1.2.2" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-scroll-area": { + "version": "1.2.10", + "resolved": "https://registry.npmjs.org/@radix-ui/react-scroll-area/-/react-scroll-area-1.2.10.tgz", + "integrity": "sha512-tAXIa1g3sM5CGpVT0uIbUx/U3Gs5N8T52IICuCtObaos1S8fzsrPXG5WObkQN3S6NVl6wKgPhAIiBGbWnvc97A==", + "license": "MIT", + "dependencies": { + "@radix-ui/number": "1.1.1", + "@radix-ui/primitive": "1.1.3", + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-direction": "1.1.1", + "@radix-ui/react-presence": "1.1.5", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-use-callback-ref": "1.1.1", + "@radix-ui/react-use-layout-effect": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-select": { + "version": "2.2.6", + "resolved": "https://registry.npmjs.org/@radix-ui/react-select/-/react-select-2.2.6.tgz", + "integrity": "sha512-I30RydO+bnn2PQztvo25tswPH+wFBjehVGtmagkU78yMdwTwVf12wnAOF+AeP8S2N8xD+5UPbGhkUfPyvT+mwQ==", + "license": "MIT", + "dependencies": { + "@radix-ui/number": "1.1.1", + "@radix-ui/primitive": "1.1.3", + "@radix-ui/react-collection": "1.1.7", + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-direction": "1.1.1", + "@radix-ui/react-dismissable-layer": "1.1.11", + "@radix-ui/react-focus-guards": "1.1.3", + "@radix-ui/react-focus-scope": "1.1.7", + "@radix-ui/react-id": "1.1.1", + "@radix-ui/react-popper": "1.2.8", + "@radix-ui/react-portal": "1.1.9", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-slot": "1.2.3", + "@radix-ui/react-use-callback-ref": "1.1.1", + "@radix-ui/react-use-controllable-state": "1.2.2", + "@radix-ui/react-use-layout-effect": "1.1.1", + "@radix-ui/react-use-previous": "1.1.1", + "@radix-ui/react-visually-hidden": "1.2.3", + "aria-hidden": "^1.2.4", + "react-remove-scroll": "^2.6.3" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-select/node_modules/@radix-ui/react-slot": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.2.3.tgz", + "integrity": "sha512-aeNmHnBxbi2St0au6VBVC7JXFlhLlOnvIIlePNniyUNAClzmtAUEY8/pBiK3iHjufOlwA+c20/8jngo7xcrg8A==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-compose-refs": "1.1.2" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-separator": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/@radix-ui/react-separator/-/react-separator-1.1.8.tgz", + "integrity": "sha512-sDvqVY4itsKwwSMEe0jtKgfTh+72Sy3gPmQpjqcQneqQ4PFmr/1I0YA+2/puilhggCe2gJcx5EBAYFkWkdpa5g==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-primitive": "2.1.4" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-separator/node_modules/@radix-ui/react-primitive": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-2.1.4.tgz", + "integrity": "sha512-9hQc4+GNVtJAIEPEqlYqW5RiYdrr8ea5XQ0ZOnD6fgru+83kqT15mq2OCcbe8KnjRZl5vF3ks69AKz3kh1jrhg==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-slot": "1.2.4" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-slider": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/@radix-ui/react-slider/-/react-slider-1.3.6.tgz", + "integrity": "sha512-JPYb1GuM1bxfjMRlNLE+BcmBC8onfCi60Blk7OBqi2MLTFdS+8401U4uFjnwkOr49BLmXxLC6JHkvAsx5OJvHw==", + "license": "MIT", + "dependencies": { + "@radix-ui/number": "1.1.1", + "@radix-ui/primitive": "1.1.3", + "@radix-ui/react-collection": "1.1.7", + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-direction": "1.1.1", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-use-controllable-state": "1.2.2", + "@radix-ui/react-use-layout-effect": "1.1.1", + "@radix-ui/react-use-previous": "1.1.1", + "@radix-ui/react-use-size": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-slot": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.2.4.tgz", + "integrity": "sha512-Jl+bCv8HxKnlTLVrcDE8zTMJ09R9/ukw4qBs/oZClOfoQk/cOTbDn+NceXfV7j09YPVQUryJPHurafcSg6EVKA==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-compose-refs": "1.1.2" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-switch": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/@radix-ui/react-switch/-/react-switch-1.2.6.tgz", + "integrity": "sha512-bByzr1+ep1zk4VubeEVViV592vu2lHE2BZY5OnzehZqOOgogN80+mNtCqPkhn2gklJqOpxWgPoYTSnhBCqpOXQ==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.3", + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-use-controllable-state": "1.2.2", + "@radix-ui/react-use-previous": "1.1.1", + "@radix-ui/react-use-size": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-tabs": { + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/@radix-ui/react-tabs/-/react-tabs-1.1.13.tgz", + "integrity": "sha512-7xdcatg7/U+7+Udyoj2zodtI9H/IIopqo+YOIcZOq1nJwXWBZ9p8xiu5llXlekDbZkca79a/fozEYQXIA4sW6A==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.3", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-direction": "1.1.1", + "@radix-ui/react-id": "1.1.1", + "@radix-ui/react-presence": "1.1.5", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-roving-focus": "1.1.11", + "@radix-ui/react-use-controllable-state": "1.2.2" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-toggle": { + "version": "1.1.10", + "resolved": "https://registry.npmjs.org/@radix-ui/react-toggle/-/react-toggle-1.1.10.tgz", + "integrity": "sha512-lS1odchhFTeZv3xwHH31YPObmJn8gOg7Lq12inrr0+BH/l3Tsq32VfjqH1oh80ARM3mlkfMic15n0kg4sD1poQ==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.3", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-use-controllable-state": "1.2.2" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-toggle-group": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/@radix-ui/react-toggle-group/-/react-toggle-group-1.1.11.tgz", + "integrity": "sha512-5umnS0T8JQzQT6HbPyO7Hh9dgd82NmS36DQr+X/YJ9ctFNCiiQd6IJAYYZ33LUwm8M+taCz5t2ui29fHZc4Y6Q==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.3", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-direction": "1.1.1", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-roving-focus": "1.1.11", + "@radix-ui/react-toggle": "1.1.10", + "@radix-ui/react-use-controllable-state": "1.2.2" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-tooltip": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@radix-ui/react-tooltip/-/react-tooltip-1.2.8.tgz", + "integrity": "sha512-tY7sVt1yL9ozIxvmbtN5qtmH2krXcBCfjEiCgKGLqunJHvgvZG2Pcl2oQ3kbcZARb1BGEHdkLzcYGO8ynVlieg==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.3", + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-dismissable-layer": "1.1.11", + "@radix-ui/react-id": "1.1.1", + "@radix-ui/react-popper": "1.2.8", + "@radix-ui/react-portal": "1.1.9", + "@radix-ui/react-presence": "1.1.5", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-slot": "1.2.3", + "@radix-ui/react-use-controllable-state": "1.2.2", + "@radix-ui/react-visually-hidden": "1.2.3" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-tooltip/node_modules/@radix-ui/react-slot": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.2.3.tgz", + "integrity": "sha512-aeNmHnBxbi2St0au6VBVC7JXFlhLlOnvIIlePNniyUNAClzmtAUEY8/pBiK3iHjufOlwA+c20/8jngo7xcrg8A==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-compose-refs": "1.1.2" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-use-callback-ref": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-callback-ref/-/react-use-callback-ref-1.1.1.tgz", + "integrity": "sha512-FkBMwD+qbGQeMu1cOHnuGB6x4yzPjho8ap5WtbEJ26umhgqVXbhekKUQO+hZEL1vU92a3wHwdp0HAcqAUF5iDg==", + "license": "MIT", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-use-controllable-state": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-controllable-state/-/react-use-controllable-state-1.2.2.tgz", + "integrity": "sha512-BjasUjixPFdS+NKkypcyyN5Pmg83Olst0+c6vGov0diwTEo6mgdqVR6hxcEgFuh4QrAs7Rc+9KuGJ9TVCj0Zzg==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-use-effect-event": "0.0.2", + "@radix-ui/react-use-layout-effect": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-use-effect-event": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-effect-event/-/react-use-effect-event-0.0.2.tgz", + "integrity": "sha512-Qp8WbZOBe+blgpuUT+lw2xheLP8q0oatc9UpmiemEICxGvFLYmHm9QowVZGHtJlGbS6A6yJ3iViad/2cVjnOiA==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-use-layout-effect": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-use-escape-keydown": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-escape-keydown/-/react-use-escape-keydown-1.1.1.tgz", + "integrity": "sha512-Il0+boE7w/XebUHyBjroE+DbByORGR9KKmITzbR7MyQ4akpORYP/ZmbhAr0DG7RmmBqoOnZdy2QlvajJ2QA59g==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-use-callback-ref": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-use-is-hydrated": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-is-hydrated/-/react-use-is-hydrated-0.1.0.tgz", + "integrity": "sha512-U+UORVEq+cTnRIaostJv9AGdV3G6Y+zbVd+12e18jQ5A3c0xL03IhnHuiU4UV69wolOQp5GfR58NW/EgdQhwOA==", + "license": "MIT", + "dependencies": { + "use-sync-external-store": "^1.5.0" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-use-layout-effect": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-layout-effect/-/react-use-layout-effect-1.1.1.tgz", + "integrity": "sha512-RbJRS4UWQFkzHTTwVymMTUv8EqYhOp8dOOviLj2ugtTiXRaRQS7GLGxZTLL1jWhMeoSCf5zmcZkqTl9IiYfXcQ==", + "license": "MIT", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-use-previous": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-previous/-/react-use-previous-1.1.1.tgz", + "integrity": "sha512-2dHfToCj/pzca2Ck724OZ5L0EVrr3eHRNsG/b3xQJLA2hZpVCS99bLAX+hm1IHXDEnzU6by5z/5MIY794/a8NQ==", + "license": "MIT", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-use-rect": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-rect/-/react-use-rect-1.1.1.tgz", + "integrity": "sha512-QTYuDesS0VtuHNNvMh+CjlKJ4LJickCMUAqjlE3+j8w+RlRpwyX3apEQKGFzbZGdo7XNG1tXa+bQqIE7HIXT2w==", + "license": "MIT", + "dependencies": { + "@radix-ui/rect": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-use-size": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-size/-/react-use-size-1.1.1.tgz", + "integrity": "sha512-ewrXRDTAqAXlkl6t/fkXWNAhFX9I+CkKlw6zjEwk86RSPKwZr3xpBRso655aqYafwtnbpHLj6toFzmd6xdVptQ==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-use-layout-effect": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-visually-hidden": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/@radix-ui/react-visually-hidden/-/react-visually-hidden-1.2.3.tgz", + "integrity": "sha512-pzJq12tEaaIhqjbzpCuv/OypJY/BPavOofm+dbab+MHLajy277+1lLm6JFcGgF5eskJ6mquGirhXY2GD/8u8Ug==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-primitive": "2.1.3" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/rect": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@radix-ui/rect/-/rect-1.1.1.tgz", + "integrity": "sha512-HPwpGIzkl28mWyZqG52jiqDJ12waP11Pa1lGoiyUkIEuMLBP0oeK/C89esbXrxsky5we7dfd8U58nm0SgAWpVw==", + "license": "MIT" + }, + "node_modules/@rolldown/pluginutils": { + "version": "1.0.0-beta.27", + "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.0-beta.27.tgz", + "integrity": "sha512-+d0F4MKMCbeVUJwG96uQ4SgAznZNSq93I3V+9NHA4OpvqG8mRCpGdKmK8l/dl02h2CCDHwW2FqilnTyDcAnqjA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@rollup/rollup-android-arm-eabi": { + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.60.1.tgz", + "integrity": "sha512-d6FinEBLdIiK+1uACUttJKfgZREXrF0Qc2SmLII7W2AD8FfiZ9Wjd+rD/iRuf5s5dWrr1GgwXCvPqOuDquOowA==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-android-arm64": { + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.60.1.tgz", + "integrity": "sha512-YjG/EwIDvvYI1YvYbHvDz/BYHtkY4ygUIXHnTdLhG+hKIQFBiosfWiACWortsKPKU/+dUwQQCKQM3qrDe8c9BA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-darwin-arm64": { + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.60.1.tgz", + "integrity": "sha512-mjCpF7GmkRtSJwon+Rq1N8+pI+8l7w5g9Z3vWj4T7abguC4Czwi3Yu/pFaLvA3TTeMVjnu3ctigusqWUfjZzvw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-darwin-x64": { + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.60.1.tgz", + "integrity": "sha512-haZ7hJ1JT4e9hqkoT9R/19XW2QKqjfJVv+i5AGg57S+nLk9lQnJ1F/eZloRO3o9Scy9CM3wQ9l+dkXtcBgN5Ew==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-freebsd-arm64": { + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.60.1.tgz", + "integrity": "sha512-czw90wpQq3ZsAVBlinZjAYTKduOjTywlG7fEeWKUA7oCmpA8xdTkxZZlwNJKWqILlq0wehoZcJYfBvOyhPTQ6w==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-freebsd-x64": { + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.60.1.tgz", + "integrity": "sha512-KVB2rqsxTHuBtfOeySEyzEOB7ltlB/ux38iu2rBQzkjbwRVlkhAGIEDiiYnO2kFOkJp+Z7pUXKyrRRFuFUKt+g==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.60.1.tgz", + "integrity": "sha512-L+34Qqil+v5uC0zEubW7uByo78WOCIrBvci69E7sFASRl0X7b/MB6Cqd1lky/CtcSVTydWa2WZwFuWexjS5o6g==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm-musleabihf": { + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.60.1.tgz", + "integrity": "sha512-n83O8rt4v34hgFzlkb1ycniJh7IR5RCIqt6mz1VRJD6pmhRi0CXdmfnLu9dIUS6buzh60IvACM842Ffb3xd6Gg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-gnu": { + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.60.1.tgz", + "integrity": "sha512-Nql7sTeAzhTAja3QXeAI48+/+GjBJ+QmAH13snn0AJSNL50JsDqotyudHyMbO2RbJkskbMbFJfIJKWA6R1LCJQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-musl": { + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.60.1.tgz", + "integrity": "sha512-+pUymDhd0ys9GcKZPPWlFiZ67sTWV5UU6zOJat02M1+PiuSGDziyRuI/pPue3hoUwm2uGfxdL+trT6Z9rxnlMA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-loong64-gnu": { + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.60.1.tgz", + "integrity": "sha512-VSvgvQeIcsEvY4bKDHEDWcpW4Yw7BtlKG1GUT4FzBUlEKQK0rWHYBqQt6Fm2taXS+1bXvJT6kICu5ZwqKCnvlQ==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-loong64-musl": { + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-musl/-/rollup-linux-loong64-musl-4.60.1.tgz", + "integrity": "sha512-4LqhUomJqwe641gsPp6xLfhqWMbQV04KtPp7/dIp0nzPxAkNY1AbwL5W0MQpcalLYk07vaW9Kp1PBhdpZYYcEw==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-ppc64-gnu": { + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.60.1.tgz", + "integrity": "sha512-tLQQ9aPvkBxOc/EUT6j3pyeMD6Hb8QF2BTBnCQWP/uu1lhc9AIrIjKnLYMEroIz/JvtGYgI9dF3AxHZNaEH0rw==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-ppc64-musl": { + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-musl/-/rollup-linux-ppc64-musl-4.60.1.tgz", + "integrity": "sha512-RMxFhJwc9fSXP6PqmAz4cbv3kAyvD1etJFjTx4ONqFP9DkTkXsAMU4v3Vyc5BgzC+anz7nS/9tp4obsKfqkDHg==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-gnu": { + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.60.1.tgz", + "integrity": "sha512-QKgFl+Yc1eEk6MmOBfRHYF6lTxiiiV3/z/BRrbSiW2I7AFTXoBFvdMEyglohPj//2mZS4hDOqeB0H1ACh3sBbg==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-musl": { + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.60.1.tgz", + "integrity": "sha512-RAjXjP/8c6ZtzatZcA1RaQr6O1TRhzC+adn8YZDnChliZHviqIjmvFwHcxi4JKPSDAt6Uhf/7vqcBzQJy0PDJg==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-s390x-gnu": { + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.60.1.tgz", + "integrity": "sha512-wcuocpaOlaL1COBYiA89O6yfjlp3RwKDeTIA0hM7OpmhR1Bjo9j31G1uQVpDlTvwxGn2nQs65fBFL5UFd76FcQ==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.60.1.tgz", + "integrity": "sha512-77PpsFQUCOiZR9+LQEFg9GClyfkNXj1MP6wRnzYs0EeWbPcHs02AXu4xuUbM1zhwn3wqaizle3AEYg5aeoohhg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-musl": { + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.60.1.tgz", + "integrity": "sha512-5cIATbk5vynAjqqmyBjlciMJl1+R/CwX9oLk/EyiFXDWd95KpHdrOJT//rnUl4cUcskrd0jCCw3wpZnhIHdD9w==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-openbsd-x64": { + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openbsd-x64/-/rollup-openbsd-x64-4.60.1.tgz", + "integrity": "sha512-cl0w09WsCi17mcmWqqglez9Gk8isgeWvoUZ3WiJFYSR3zjBQc2J5/ihSjpl+VLjPqjQ/1hJRcqBfLjssREQILw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ] + }, + "node_modules/@rollup/rollup-openharmony-arm64": { + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.60.1.tgz", + "integrity": "sha512-4Cv23ZrONRbNtbZa37mLSueXUCtN7MXccChtKpUnQNgF010rjrjfHx3QxkS2PI7LqGT5xXyYs1a7LbzAwT0iCA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ] + }, + "node_modules/@rollup/rollup-win32-arm64-msvc": { + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.60.1.tgz", + "integrity": "sha512-i1okWYkA4FJICtr7KpYzFpRTHgy5jdDbZiWfvny21iIKky5YExiDXP+zbXzm3dUcFpkEeYNHgQ5fuG236JPq0g==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-ia32-msvc": { + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.60.1.tgz", + "integrity": "sha512-u09m3CuwLzShA0EYKMNiFgcjjzwqtUMLmuCJLeZWjjOYA3IT2Di09KaxGBTP9xVztWyIWjVdsB2E9goMjZvTQg==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-gnu": { + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.60.1.tgz", + "integrity": "sha512-k+600V9Zl1CM7eZxJgMyTUzmrmhB/0XZnF4pRypKAlAgxmedUA+1v9R+XOFv56W4SlHEzfeMtzujLJD22Uz5zg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.60.1.tgz", + "integrity": "sha512-lWMnixq/QzxyhTV6NjQJ4SFo1J6PvOX8vUx5Wb4bBPsEb+8xZ89Bz6kOXpfXj9ak9AHTQVQzlgzBEc1SyM27xQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@tailwindcss/node": { + "version": "4.1.12", + "resolved": "https://registry.npmjs.org/@tailwindcss/node/-/node-4.1.12.tgz", + "integrity": "sha512-3hm9brwvQkZFe++SBt+oLjo4OLDtkvlE8q2WalaD/7QWaeM7KEJbAiY/LJZUaCs7Xa8aUu4xy3uoyX4q54UVdQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/remapping": "^2.3.4", + "enhanced-resolve": "^5.18.3", + "jiti": "^2.5.1", + "lightningcss": "1.30.1", + "magic-string": "^0.30.17", + "source-map-js": "^1.2.1", + "tailwindcss": "4.1.12" + } + }, + "node_modules/@tailwindcss/oxide": { + "version": "4.1.12", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide/-/oxide-4.1.12.tgz", + "integrity": "sha512-gM5EoKHW/ukmlEtphNwaGx45fGoEmP10v51t9unv55voWh6WrOL19hfuIdo2FjxIaZzw776/BUQg7Pck++cIVw==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "dependencies": { + "detect-libc": "^2.0.4", + "tar": "^7.4.3" + }, + "engines": { + "node": ">= 10" + }, + "optionalDependencies": { + "@tailwindcss/oxide-android-arm64": "4.1.12", + "@tailwindcss/oxide-darwin-arm64": "4.1.12", + "@tailwindcss/oxide-darwin-x64": "4.1.12", + "@tailwindcss/oxide-freebsd-x64": "4.1.12", + "@tailwindcss/oxide-linux-arm-gnueabihf": "4.1.12", + "@tailwindcss/oxide-linux-arm64-gnu": "4.1.12", + "@tailwindcss/oxide-linux-arm64-musl": "4.1.12", + "@tailwindcss/oxide-linux-x64-gnu": "4.1.12", + "@tailwindcss/oxide-linux-x64-musl": "4.1.12", + "@tailwindcss/oxide-wasm32-wasi": "4.1.12", + "@tailwindcss/oxide-win32-arm64-msvc": "4.1.12", + "@tailwindcss/oxide-win32-x64-msvc": "4.1.12" + } + }, + "node_modules/@tailwindcss/oxide-android-arm64": { + "version": "4.1.12", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-android-arm64/-/oxide-android-arm64-4.1.12.tgz", + "integrity": "sha512-oNY5pq+1gc4T6QVTsZKwZaGpBb2N1H1fsc1GD4o7yinFySqIuRZ2E4NvGasWc6PhYJwGK2+5YT1f9Tp80zUQZQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-darwin-arm64": { + "version": "4.1.12", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-arm64/-/oxide-darwin-arm64-4.1.12.tgz", + "integrity": "sha512-cq1qmq2HEtDV9HvZlTtrj671mCdGB93bVY6J29mwCyaMYCP/JaUBXxrQQQm7Qn33AXXASPUb2HFZlWiiHWFytw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-darwin-x64": { + "version": "4.1.12", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-x64/-/oxide-darwin-x64-4.1.12.tgz", + "integrity": "sha512-6UCsIeFUcBfpangqlXay9Ffty9XhFH1QuUFn0WV83W8lGdX8cD5/+2ONLluALJD5+yJ7k8mVtwy3zMZmzEfbLg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-freebsd-x64": { + "version": "4.1.12", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-freebsd-x64/-/oxide-freebsd-x64-4.1.12.tgz", + "integrity": "sha512-JOH/f7j6+nYXIrHobRYCtoArJdMJh5zy5lr0FV0Qu47MID/vqJAY3r/OElPzx1C/wdT1uS7cPq+xdYYelny1ww==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-linux-arm-gnueabihf": { + "version": "4.1.12", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm-gnueabihf/-/oxide-linux-arm-gnueabihf-4.1.12.tgz", + "integrity": "sha512-v4Ghvi9AU1SYgGr3/j38PD8PEe6bRfTnNSUE3YCMIRrrNigCFtHZ2TCm8142X8fcSqHBZBceDx+JlFJEfNg5zQ==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-linux-arm64-gnu": { + "version": "4.1.12", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-gnu/-/oxide-linux-arm64-gnu-4.1.12.tgz", + "integrity": "sha512-YP5s1LmetL9UsvVAKusHSyPlzSRqYyRB0f+Kl/xcYQSPLEw/BvGfxzbH+ihUciePDjiXwHh+p+qbSP3SlJw+6g==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-linux-arm64-musl": { + "version": "4.1.12", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-musl/-/oxide-linux-arm64-musl-4.1.12.tgz", + "integrity": "sha512-V8pAM3s8gsrXcCv6kCHSuwyb/gPsd863iT+v1PGXC4fSL/OJqsKhfK//v8P+w9ThKIoqNbEnsZqNy+WDnwQqCA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-linux-x64-gnu": { + "version": "4.1.12", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-gnu/-/oxide-linux-x64-gnu-4.1.12.tgz", + "integrity": "sha512-xYfqYLjvm2UQ3TZggTGrwxjYaLB62b1Wiysw/YE3Yqbh86sOMoTn0feF98PonP7LtjsWOWcXEbGqDL7zv0uW8Q==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-linux-x64-musl": { + "version": "4.1.12", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-musl/-/oxide-linux-x64-musl-4.1.12.tgz", + "integrity": "sha512-ha0pHPamN+fWZY7GCzz5rKunlv9L5R8kdh+YNvP5awe3LtuXb5nRi/H27GeL2U+TdhDOptU7T6Is7mdwh5Ar3A==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-wasm32-wasi": { + "version": "4.1.12", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-wasm32-wasi/-/oxide-wasm32-wasi-4.1.12.tgz", + "integrity": "sha512-4tSyu3dW+ktzdEpuk6g49KdEangu3eCYoqPhWNsZgUhyegEda3M9rG0/j1GV/JjVVsj+lG7jWAyrTlLzd/WEBg==", + "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.4.5", + "@emnapi/runtime": "^1.4.5", + "@emnapi/wasi-threads": "^1.0.4", + "@napi-rs/wasm-runtime": "^0.2.12", + "@tybys/wasm-util": "^0.10.0", + "tslib": "^2.8.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@tailwindcss/oxide-win32-arm64-msvc": { + "version": "4.1.12", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-arm64-msvc/-/oxide-win32-arm64-msvc-4.1.12.tgz", + "integrity": "sha512-iGLyD/cVP724+FGtMWslhcFyg4xyYyM+5F4hGvKA7eifPkXHRAUDFaimu53fpNg9X8dfP75pXx/zFt/jlNF+lg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-win32-x64-msvc": { + "version": "4.1.12", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-x64-msvc/-/oxide-win32-x64-msvc-4.1.12.tgz", + "integrity": "sha512-NKIh5rzw6CpEodv/++r0hGLlfgT/gFN+5WNdZtvh6wpU2BpGNgdjvj6H2oFc8nCM839QM1YOhjpgbAONUb4IxA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/vite": { + "version": "4.1.12", + "resolved": "https://registry.npmjs.org/@tailwindcss/vite/-/vite-4.1.12.tgz", + "integrity": "sha512-4pt0AMFDx7gzIrAOIYgYP0KCBuKWqyW8ayrdiLEjoJTT4pKTjrzG/e4uzWtTLDziC+66R9wbUqZBccJalSE5vQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@tailwindcss/node": "4.1.12", + "@tailwindcss/oxide": "4.1.12", + "tailwindcss": "4.1.12" + }, + "peerDependencies": { + "vite": "^5.2.0 || ^6 || ^7" + } + }, + "node_modules/@types/babel__core": { + "version": "7.20.5", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz", + "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.20.7", + "@babel/types": "^7.20.7", + "@types/babel__generator": "*", + "@types/babel__template": "*", + "@types/babel__traverse": "*" + } + }, + "node_modules/@types/babel__generator": { + "version": "7.27.0", + "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.27.0.tgz", + "integrity": "sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__template": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz", + "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__traverse": { + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.28.0.tgz", + "integrity": "sha512-8PvcXf70gTDZBgt9ptxJ8elBeBjcLOAcOtoO/mPJjtji1+CdGbHgm77om1GrsPxsiE+uXIpNSK64UYaIwQXd4Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.28.2" + } + }, + "node_modules/@types/d3-array": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/@types/d3-array/-/d3-array-3.2.2.tgz", + "integrity": "sha512-hOLWVbm7uRza0BYXpIIW5pxfrKe0W+D5lrFiAEYR+pb6w3N2SwSMaJbXdUfSEv+dT4MfHBLtn5js0LAWaO6otw==", + "license": "MIT" + }, + "node_modules/@types/d3-color": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/@types/d3-color/-/d3-color-3.1.3.tgz", + "integrity": "sha512-iO90scth9WAbmgv7ogoq57O9YpKmFBbmoEoCHDB2xMBY0+/KVrqAaCDyCE16dUspeOvIxFFRI+0sEtqDqy2b4A==", + "license": "MIT" + }, + "node_modules/@types/d3-ease": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/d3-ease/-/d3-ease-3.0.2.tgz", + "integrity": "sha512-NcV1JjO5oDzoK26oMzbILE6HW7uVXOHLQvHshBUW4UMdZGfiY6v5BeQwh9a9tCzv+CeefZQHJt5SRgK154RtiA==", + "license": "MIT" + }, + "node_modules/@types/d3-interpolate": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/d3-interpolate/-/d3-interpolate-3.0.4.tgz", + "integrity": "sha512-mgLPETlrpVV1YRJIglr4Ez47g7Yxjl1lj7YKsiMCb27VJH9W8NVM6Bb9d8kkpG/uAQS5AmbA48q2IAolKKo1MA==", + "license": "MIT", + "dependencies": { + "@types/d3-color": "*" + } + }, + "node_modules/@types/d3-path": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@types/d3-path/-/d3-path-3.1.1.tgz", + "integrity": "sha512-VMZBYyQvbGmWyWVea0EHs/BwLgxc+MKi1zLDCONksozI4YJMcTt8ZEuIR4Sb1MMTE8MMW49v0IwI5+b7RmfWlg==", + "license": "MIT" + }, + "node_modules/@types/d3-scale": { + "version": "4.0.9", + "resolved": "https://registry.npmjs.org/@types/d3-scale/-/d3-scale-4.0.9.tgz", + "integrity": "sha512-dLmtwB8zkAeO/juAMfnV+sItKjlsw2lKdZVVy6LRr0cBmegxSABiLEpGVmSJJ8O08i4+sGR6qQtb6WtuwJdvVw==", + "license": "MIT", + "dependencies": { + "@types/d3-time": "*" + } + }, + "node_modules/@types/d3-shape": { + "version": "3.1.8", + "resolved": "https://registry.npmjs.org/@types/d3-shape/-/d3-shape-3.1.8.tgz", + "integrity": "sha512-lae0iWfcDeR7qt7rA88BNiqdvPS5pFVPpo5OfjElwNaT2yyekbM0C9vK+yqBqEmHr6lDkRnYNoTBYlAgJa7a4w==", + "license": "MIT", + "dependencies": { + "@types/d3-path": "*" + } + }, + "node_modules/@types/d3-time": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/d3-time/-/d3-time-3.0.4.tgz", + "integrity": "sha512-yuzZug1nkAAaBlBBikKZTgzCeA+k1uy4ZFwWANOfKw5z5LRhV0gNA7gNkKm7HoK+HRN0wX3EkxGk0fpbWhmB7g==", + "license": "MIT" + }, + "node_modules/@types/d3-timer": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/d3-timer/-/d3-timer-3.0.2.tgz", + "integrity": "sha512-Ps3T8E8dZDam6fUyNiMkekK3XUsaUEik+idO9/YjPtfj2qruF8tFBXS7XhtE4iIXBLxhmLjP3SXpLhVf21I9Lw==", + "license": "MIT" + }, + "node_modules/@types/estree": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", + "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/node": { + "version": "20.19.37", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.19.37.tgz", + "integrity": "sha512-8kzdPJ3FsNsVIurqBs7oodNnCEVbni9yUEkaHbgptDACOPW04jimGagZ51E6+lXUwJjgnBw+hyko/lkFWCldqw==", + "dev": true, + "license": "MIT", + "dependencies": { + "undici-types": "~6.21.0" + } + }, + "node_modules/@vitejs/plugin-react": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-4.7.0.tgz", + "integrity": "sha512-gUu9hwfWvvEDBBmgtAowQCojwZmJ5mcLn3aufeCsitijs3+f2NsrPtlAWIR6OPiqljl96GVCUbLe0HyqIpVaoA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.28.0", + "@babel/plugin-transform-react-jsx-self": "^7.27.1", + "@babel/plugin-transform-react-jsx-source": "^7.27.1", + "@rolldown/pluginutils": "1.0.0-beta.27", + "@types/babel__core": "^7.20.5", + "react-refresh": "^0.17.0" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "peerDependencies": { + "vite": "^4.2.0 || ^5.0.0 || ^6.0.0 || ^7.0.0" + } + }, + "node_modules/aria-hidden": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/aria-hidden/-/aria-hidden-1.2.6.tgz", + "integrity": "sha512-ik3ZgC9dY/lYVVM++OISsaYDeg1tb0VtP5uL3ouh1koGOaUMDPpbFIei4JkFimWUFPn90sbMNMXQAIVOlnYKJA==", + "license": "MIT", + "dependencies": { + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/baseline-browser-mapping": { + "version": "2.10.13", + "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.10.13.tgz", + "integrity": "sha512-BL2sTuHOdy0YT1lYieUxTw/QMtPBC3pmlJC6xk8BBYVv6vcw3SGdKemQ+Xsx9ik2F/lYDO9tqsFQH1r9PFuHKw==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "baseline-browser-mapping": "dist/cli.cjs" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/browserslist": { + "version": "4.28.2", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.2.tgz", + "integrity": "sha512-48xSriZYYg+8qXna9kwqjIVzuQxi+KYWp2+5nCYnYKPTr0LvD89Jqk2Or5ogxz0NUMfIjhh2lIUX/LyX9B4oIg==", + "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.10.12", + "caniuse-lite": "^1.0.30001782", + "electron-to-chromium": "^1.5.328", + "node-releases": "^2.0.36", + "update-browserslist-db": "^1.2.3" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001784", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001784.tgz", + "integrity": "sha512-WU346nBTklUV9YfUl60fqRbU5ZqyXlqvo1SgigE1OAXK5bFL8LL9q1K7aap3N739l4BvNqnkm3YrGHiY9sfUQw==", + "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/chownr": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-3.0.0.tgz", + "integrity": "sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g==", + "dev": true, + "license": "BlueOak-1.0.0", + "engines": { + "node": ">=18" + } + }, + "node_modules/class-variance-authority": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/class-variance-authority/-/class-variance-authority-0.7.1.tgz", + "integrity": "sha512-Ka+9Trutv7G8M6WT6SeiRWz792K5qEqIGEGzXKhAE6xOWAY6pPH8U+9IY3oCMv6kqTmLsv7Xh/2w2RigkePMsg==", + "license": "Apache-2.0", + "dependencies": { + "clsx": "^2.1.1" + }, + "funding": { + "url": "https://polar.sh/cva" + } + }, + "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/cmdk": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/cmdk/-/cmdk-1.1.1.tgz", + "integrity": "sha512-Vsv7kFaXm+ptHDMZ7izaRsP70GgrW9NBNGswt9OZaVBLlE0SNpDq8eu/VGXyF9r7M0azK3Wy7OlYXsuyYLFzHg==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-compose-refs": "^1.1.1", + "@radix-ui/react-dialog": "^1.1.6", + "@radix-ui/react-id": "^1.1.0", + "@radix-ui/react-primitive": "^2.0.2" + }, + "peerDependencies": { + "react": "^18 || ^19 || ^19.0.0-rc", + "react-dom": "^18 || ^19 || ^19.0.0-rc" + } + }, + "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/csstype": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz", + "integrity": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==", + "license": "MIT" + }, + "node_modules/d3-array": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-3.2.4.tgz", + "integrity": "sha512-tdQAmyA18i4J7wprpYq8ClcxZy3SC31QMeByyCFyRt7BVHdREQZ5lpzoe5mFEYZUWe+oq8HBvk9JjpibyEV4Jg==", + "license": "ISC", + "dependencies": { + "internmap": "1 - 2" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-color": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-color/-/d3-color-3.1.0.tgz", + "integrity": "sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-ease": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-ease/-/d3-ease-3.0.1.tgz", + "integrity": "sha512-wR/XK3D3XcLIZwpbvQwQ5fK+8Ykds1ip7A2Txe0yxncXSdq1L9skcG7blcedkOX+ZcgxGAmLX1FrRGbADwzi0w==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-format": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/d3-format/-/d3-format-3.1.2.tgz", + "integrity": "sha512-AJDdYOdnyRDV5b6ArilzCPPwc1ejkHcoyFarqlPqT7zRYjhavcT3uSrqcMvsgh2CgoPbK3RCwyHaVyxYcP2Arg==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-interpolate": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-3.0.1.tgz", + "integrity": "sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g==", + "license": "ISC", + "dependencies": { + "d3-color": "1 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-path": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-path/-/d3-path-3.1.0.tgz", + "integrity": "sha512-p3KP5HCf/bvjBSSKuXid6Zqijx7wIfNW+J/maPs+iwR35at5JCbLUT0LzF1cnjbCHWhqzQTIN2Jpe8pRebIEFQ==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-scale": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/d3-scale/-/d3-scale-4.0.2.tgz", + "integrity": "sha512-GZW464g1SH7ag3Y7hXjf8RoUuAFIqklOAq3MRl4OaWabTFJY9PN/E1YklhXLh+OQ3fM9yS2nOkCoS+WLZ6kvxQ==", + "license": "ISC", + "dependencies": { + "d3-array": "2.10.0 - 3", + "d3-format": "1 - 3", + "d3-interpolate": "1.2.0 - 3", + "d3-time": "2.1.1 - 3", + "d3-time-format": "2 - 4" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-shape": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/d3-shape/-/d3-shape-3.2.0.tgz", + "integrity": "sha512-SaLBuwGm3MOViRq2ABk3eLoxwZELpH6zhl3FbAoJ7Vm1gofKx6El1Ib5z23NUEhF9AsGl7y+dzLe5Cw2AArGTA==", + "license": "ISC", + "dependencies": { + "d3-path": "^3.1.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-time": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-time/-/d3-time-3.1.0.tgz", + "integrity": "sha512-VqKjzBLejbSMT4IgbmVgDjpkYrNWUYJnbCGo874u7MMKIWsILRX+OpX/gTk8MqjpT1A/c6HY2dCA77ZN0lkQ2Q==", + "license": "ISC", + "dependencies": { + "d3-array": "2 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-time-format": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/d3-time-format/-/d3-time-format-4.1.0.tgz", + "integrity": "sha512-dJxPBlzC7NugB2PDLwo9Q8JiTR3M3e4/XANkreKSUxF8vvXKqm1Yfq4Q5dl8budlunRVlUUaDUgFt7eA8D6NLg==", + "license": "ISC", + "dependencies": { + "d3-time": "1 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-timer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-timer/-/d3-timer-3.0.1.tgz", + "integrity": "sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/date-fns": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-3.6.0.tgz", + "integrity": "sha512-fRHTG8g/Gif+kSh50gaGEdToemgfj74aRX3swtiouboip5JDLAyDE9F11nHMIcvOaXeOC6D7SpNhi7uFyB7Uww==", + "license": "MIT", + "peer": true, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/kossnocorp" + } + }, + "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/decimal.js-light": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/decimal.js-light/-/decimal.js-light-2.5.1.tgz", + "integrity": "sha512-qIMFpTMZmny+MMIitAB6D7iVPEorVw6YQRWkvarTkT4tBeSLLiHzcwj6q0MmYSFCiVpiqPJTJEYIrpcPzVEIvg==", + "license": "MIT" + }, + "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/detect-node-es": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/detect-node-es/-/detect-node-es-1.1.0.tgz", + "integrity": "sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ==", + "license": "MIT" + }, + "node_modules/dom-helpers": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/dom-helpers/-/dom-helpers-5.2.1.tgz", + "integrity": "sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.8.7", + "csstype": "^3.0.2" + } + }, + "node_modules/electron-to-chromium": { + "version": "1.5.331", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.331.tgz", + "integrity": "sha512-IbxXrsTlD3hRodkLnbxAPP4OuJYdWCeM3IOdT+CpcMoIwIoDfCmRpEtSPfwBXxVkg9xmBeY7Lz2Eo2TDn/HC3Q==", + "dev": true, + "license": "ISC" + }, + "node_modules/embla-carousel": { + "version": "8.6.0", + "resolved": "https://registry.npmjs.org/embla-carousel/-/embla-carousel-8.6.0.tgz", + "integrity": "sha512-SjWyZBHJPbqxHOzckOfo8lHisEaJWmwd23XppYFYVh10bU66/Pn5tkVkbkCMZVdbUE5eTCI2nD8OyIP4Z+uwkA==", + "license": "MIT" + }, + "node_modules/embla-carousel-react": { + "version": "8.6.0", + "resolved": "https://registry.npmjs.org/embla-carousel-react/-/embla-carousel-react-8.6.0.tgz", + "integrity": "sha512-0/PjqU7geVmo6F734pmPqpyHqiM99olvyecY7zdweCw+6tKEXnrE90pBiBbMMU8s5tICemzpQ3hi5EpxzGW+JA==", + "license": "MIT", + "dependencies": { + "embla-carousel": "8.6.0", + "embla-carousel-reactive-utils": "8.6.0" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.1 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" + } + }, + "node_modules/embla-carousel-reactive-utils": { + "version": "8.6.0", + "resolved": "https://registry.npmjs.org/embla-carousel-reactive-utils/-/embla-carousel-reactive-utils-8.6.0.tgz", + "integrity": "sha512-fMVUDUEx0/uIEDM0Mz3dHznDhfX+znCCDCeIophYb1QGVM7YThSWX+wz11zlYwWFOr74b4QLGg0hrGPJeG2s4A==", + "license": "MIT", + "peerDependencies": { + "embla-carousel": "8.6.0" + } + }, + "node_modules/enhanced-resolve": { + "version": "5.20.1", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.20.1.tgz", + "integrity": "sha512-Qohcme7V1inbAfvjItgw0EaxVX5q2rdVEZHRBrEQdRZTssLDGsL8Lwrznl8oQ/6kuTJONLaDcGjkNP247XEhcA==", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.4", + "tapable": "^2.3.0" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/esbuild": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.12.tgz", + "integrity": "sha512-bbPBYYrtZbkt6Os6FiTLCTFxvq4tt3JKall1vRwshA3fdVztsLAatFaZobhkBC8/BrPetoa0oksYoKXoG4ryJg==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.25.12", + "@esbuild/android-arm": "0.25.12", + "@esbuild/android-arm64": "0.25.12", + "@esbuild/android-x64": "0.25.12", + "@esbuild/darwin-arm64": "0.25.12", + "@esbuild/darwin-x64": "0.25.12", + "@esbuild/freebsd-arm64": "0.25.12", + "@esbuild/freebsd-x64": "0.25.12", + "@esbuild/linux-arm": "0.25.12", + "@esbuild/linux-arm64": "0.25.12", + "@esbuild/linux-ia32": "0.25.12", + "@esbuild/linux-loong64": "0.25.12", + "@esbuild/linux-mips64el": "0.25.12", + "@esbuild/linux-ppc64": "0.25.12", + "@esbuild/linux-riscv64": "0.25.12", + "@esbuild/linux-s390x": "0.25.12", + "@esbuild/linux-x64": "0.25.12", + "@esbuild/netbsd-arm64": "0.25.12", + "@esbuild/netbsd-x64": "0.25.12", + "@esbuild/openbsd-arm64": "0.25.12", + "@esbuild/openbsd-x64": "0.25.12", + "@esbuild/openharmony-arm64": "0.25.12", + "@esbuild/sunos-x64": "0.25.12", + "@esbuild/win32-arm64": "0.25.12", + "@esbuild/win32-ia32": "0.25.12", + "@esbuild/win32-x64": "0.25.12" + } + }, + "node_modules/escalade": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/eventemitter3": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", + "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==", + "license": "MIT" + }, + "node_modules/fast-equals": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/fast-equals/-/fast-equals-5.4.0.tgz", + "integrity": "sha512-jt2DW/aNFNwke7AUd+Z+e6pz39KO5rzdbbFCg2sGafS4mk13MI7Z8O5z9cADNn5lhGODIgLwug6TZO2ctf7kcw==", + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "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/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/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-nonce": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-nonce/-/get-nonce-1.0.1.tgz", + "integrity": "sha512-FJhYRoDaiatfEkUK8HKlicmu/3SGFD51q3itKDGoSTysQJBnfOcxU5GxnhE1E6soB76MbT0MBtnKJuXyAx+96Q==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "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/inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==", + "license": "ISC" + }, + "node_modules/input-otp": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/input-otp/-/input-otp-1.4.2.tgz", + "integrity": "sha512-l3jWwYNvrEa6NTCt7BECfCm48GvwuZzkoeG3gBL2w4CHeOXW3eKFmf9UNYkNfYc3mxMrthMnxjIE07MT0zLBQA==", + "license": "MIT", + "peerDependencies": { + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0.0 || ^19.0.0-rc" + } + }, + "node_modules/internmap": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/internmap/-/internmap-2.0.3.tgz", + "integrity": "sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "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==", + "license": "MIT" + }, + "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/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/lightningcss": { + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.30.1.tgz", + "integrity": "sha512-xi6IyHML+c9+Q3W0S4fCQJOym42pyurFiJUHEcEyHS0CeKzia4yZDEsLlqOFykxOdHpNy0NmvVO31vcSqAxJCg==", + "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-darwin-arm64": "1.30.1", + "lightningcss-darwin-x64": "1.30.1", + "lightningcss-freebsd-x64": "1.30.1", + "lightningcss-linux-arm-gnueabihf": "1.30.1", + "lightningcss-linux-arm64-gnu": "1.30.1", + "lightningcss-linux-arm64-musl": "1.30.1", + "lightningcss-linux-x64-gnu": "1.30.1", + "lightningcss-linux-x64-musl": "1.30.1", + "lightningcss-win32-arm64-msvc": "1.30.1", + "lightningcss-win32-x64-msvc": "1.30.1" + } + }, + "node_modules/lightningcss-darwin-arm64": { + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.30.1.tgz", + "integrity": "sha512-c8JK7hyE65X1MHMN+Viq9n11RRC7hgin3HhYKhrMyaXflk5GVplZ60IxyoVtzILeKr+xAJwg6zK6sjTBJ0FKYQ==", + "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.1", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.30.1.tgz", + "integrity": "sha512-k1EvjakfumAQoTfcXUcHQZhSpLlkAuEkdMBsI/ivWw9hL+7FtilQc0Cy3hrx0AAQrVtQAbMI7YjCgYgvn37PzA==", + "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.1", + "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.30.1.tgz", + "integrity": "sha512-kmW6UGCGg2PcyUE59K5r0kWfKPAVy4SltVeut+umLCFoJ53RdCUWxcRDzO1eTaxf/7Q2H7LTquFHPL5R+Gjyig==", + "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.1", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.30.1.tgz", + "integrity": "sha512-MjxUShl1v8pit+6D/zSPq9S9dQ2NPFSQwGvxBCYaBYLPlCWuPh9/t1MRS8iUaR8i+a6w7aps+B4N0S1TYP/R+Q==", + "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.1", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.30.1.tgz", + "integrity": "sha512-gB72maP8rmrKsnKYy8XUuXi/4OctJiuQjcuqWNlJQ6jZiWqtPvqFziskH3hnajfvKB27ynbVCucKSm2rkQp4Bw==", + "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.1", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.30.1.tgz", + "integrity": "sha512-jmUQVx4331m6LIX+0wUhBbmMX7TCfjF5FoOH6SD1CttzuYlGNVpA7QnrmLxrsub43ClTINfGSYyHe2HWeLl5CQ==", + "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.1", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.30.1.tgz", + "integrity": "sha512-piWx3z4wN8J8z3+O5kO74+yr6ze/dKmPnI7vLqfSqI8bccaTGY5xiSGVIJBDd5K5BHlvVLpUB3S2YCfelyJ1bw==", + "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.1", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.30.1.tgz", + "integrity": "sha512-rRomAK7eIkL+tHY0YPxbc5Dra2gXlI63HL+v1Pdi1a3sC+tJTcFrHX+E86sulgAXeI7rSzDYhPSeHHjqFhqfeQ==", + "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.1", + "resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.30.1.tgz", + "integrity": "sha512-mSL4rqPi4iXq5YVqzSsJgMVFENoa4nGTT/GjO2c0Yl9OuQfPsIfncvLrEW6RbbB24WtZ3xP/2CCmI3tNkNV4oA==", + "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.1", + "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.30.1.tgz", + "integrity": "sha512-PVqXh48wh4T53F/1CCu8PIPCxLzWyCnn/9T5W1Jpmdy5h9Cwd+0YQS6/LwhHXSafuc61/xg9Lv5OrCby6a++jg==", + "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/lodash": { + "version": "4.18.1", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.18.1.tgz", + "integrity": "sha512-dMInicTPVE8d1e5otfwmmjlxkZoUpiVLwyeTdUsi/Caj/gfzzblBcCE5sRHV/AsjuCmxWrte2TNGSYuCeCq+0Q==", + "license": "MIT" + }, + "node_modules/loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "license": "MIT", + "dependencies": { + "js-tokens": "^3.0.0 || ^4.0.0" + }, + "bin": { + "loose-envify": "cli.js" + } + }, + "node_modules/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, + "license": "ISC", + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/lucide-react": { + "version": "0.487.0", + "resolved": "https://registry.npmjs.org/lucide-react/-/lucide-react-0.487.0.tgz", + "integrity": "sha512-aKqhOQ+YmFnwq8dWgGjOuLc8V1R9/c/yOd+zDY4+ohsR2Jo05lSGc3WsstYPIzcTpeosN7LoCkLReUUITvaIvw==", + "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/minipass": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.3.tgz", + "integrity": "sha512-tEBHqDnIoM/1rXME1zgka9g6Q2lcoCkxHLuc7ODJ5BxbP5d4c2Z5cGgtXAku59200Cx7diuHTOYfSBD8n6mm8A==", + "dev": true, + "license": "BlueOak-1.0.0", + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/minizlib": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-3.1.0.tgz", + "integrity": "sha512-KZxYo1BUkWD2TVFLr0MQoM8vUUigWD3LlD83a/75BqC+4qE0Hb1Vo5v1FgcfaNXvfXzr+5EhQ6ing/CaBijTlw==", + "dev": true, + "license": "MIT", + "dependencies": { + "minipass": "^7.1.2" + }, + "engines": { + "node": ">= 18" + } + }, + "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/next-themes": { + "version": "0.4.6", + "resolved": "https://registry.npmjs.org/next-themes/-/next-themes-0.4.6.tgz", + "integrity": "sha512-pZvgD5L0IEvX5/9GWyHMf3m8BKiVQwsCMHfoFosXtXBMnaS0ZnIJ9ST4b4NqLVKDEm8QBxoNNGNaBv2JNF6XNA==", + "license": "MIT", + "peerDependencies": { + "react": "^16.8 || ^17 || ^18 || ^19 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17 || ^18 || ^19 || ^19.0.0-rc" + } + }, + "node_modules/node-releases": { + "version": "2.0.37", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.37.tgz", + "integrity": "sha512-1h5gKZCF+pO/o3Iqt5Jp7wc9rH3eJJ0+nh/CIoiRwjRxde/hAHyLPXYN4V3CqKAbiZPSeJFSWHmJsbkicta0Eg==", + "dev": true, + "license": "MIT" + }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path": { + "version": "0.12.7", + "resolved": "https://registry.npmjs.org/path/-/path-0.12.7.tgz", + "integrity": "sha512-aXXC6s+1w7otVF9UletFkFcDsJeO7lSZBPUQhtb5O0xJe8LtYhj/GxldoL09bBj9+ZmE2hNoHqQSFMN5fikh4Q==", + "license": "MIT", + "dependencies": { + "process": "^0.11.1", + "util": "^0.10.3" + } + }, + "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.4", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.4.tgz", + "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/postcss": { + "version": "8.5.8", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.8.tgz", + "integrity": "sha512-OW/rX8O/jXnm82Ey1k44pObPtdblfiuWnrd8X7GJ7emImCOstunGbXUpp7HdBrFQX6rJzn3sPT397Wp5aCwCHg==", + "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/process": { + "version": "0.11.10", + "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", + "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==", + "license": "MIT", + "engines": { + "node": ">= 0.6.0" + } + }, + "node_modules/prop-types": { + "version": "15.8.1", + "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", + "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", + "license": "MIT", + "dependencies": { + "loose-envify": "^1.4.0", + "object-assign": "^4.1.1", + "react-is": "^16.13.1" + } + }, + "node_modules/prop-types/node_modules/react-is": { + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", + "license": "MIT" + }, + "node_modules/react": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react/-/react-18.3.1.tgz", + "integrity": "sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==", + "license": "MIT", + "dependencies": { + "loose-envify": "^1.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-day-picker": { + "version": "8.10.1", + "resolved": "https://registry.npmjs.org/react-day-picker/-/react-day-picker-8.10.1.tgz", + "integrity": "sha512-TMx7fNbhLk15eqcMt+7Z7S2KF7mfTId/XJDjKE8f+IUcFn0l08/kI4FiYTL/0yuOLmEcbR4Fwe3GJf/NiiMnPA==", + "license": "MIT", + "funding": { + "type": "individual", + "url": "https://github.com/sponsors/gpbl" + }, + "peerDependencies": { + "date-fns": "^2.28.0 || ^3.0.0", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + } + }, + "node_modules/react-dom": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.3.1.tgz", + "integrity": "sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==", + "license": "MIT", + "dependencies": { + "loose-envify": "^1.1.0", + "scheduler": "^0.23.2" + }, + "peerDependencies": { + "react": "^18.3.1" + } + }, + "node_modules/react-hook-form": { + "version": "7.72.0", + "resolved": "https://registry.npmjs.org/react-hook-form/-/react-hook-form-7.72.0.tgz", + "integrity": "sha512-V4v6jubaf6JAurEaVnT9aUPKFbNtDgohj5CIgVGyPHvT9wRx5OZHVjz31GsxnPNI278XMu+ruFz+wGOscHaLKw==", + "license": "MIT", + "engines": { + "node": ">=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/react-hook-form" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17 || ^18 || ^19" + } + }, + "node_modules/react-is": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", + "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", + "license": "MIT" + }, + "node_modules/react-refresh": { + "version": "0.17.0", + "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.17.0.tgz", + "integrity": "sha512-z6F7K9bV85EfseRCp2bzrpyQ0Gkw1uLoCel9XBVWPg/TjRj94SkJzUTGfOa4bs7iJvBWtQG0Wq7wnI0syw3EBQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-remove-scroll": { + "version": "2.7.2", + "resolved": "https://registry.npmjs.org/react-remove-scroll/-/react-remove-scroll-2.7.2.tgz", + "integrity": "sha512-Iqb9NjCCTt6Hf+vOdNIZGdTiH1QSqr27H/Ek9sv/a97gfueI/5h1s3yRi1nngzMUaOOToin5dI1dXKdXiF+u0Q==", + "license": "MIT", + "dependencies": { + "react-remove-scroll-bar": "^2.3.7", + "react-style-singleton": "^2.2.3", + "tslib": "^2.1.0", + "use-callback-ref": "^1.3.3", + "use-sidecar": "^1.1.3" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/react-remove-scroll-bar": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/react-remove-scroll-bar/-/react-remove-scroll-bar-2.3.8.tgz", + "integrity": "sha512-9r+yi9+mgU33AKcj6IbT9oRCO78WriSj6t/cF8DWBZJ9aOGPOTEDvdUDz1FwKim7QXWwmHqtdHnRJfhAxEG46Q==", + "license": "MIT", + "dependencies": { + "react-style-singleton": "^2.2.2", + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/react-resizable-panels": { + "version": "2.1.9", + "resolved": "https://registry.npmjs.org/react-resizable-panels/-/react-resizable-panels-2.1.9.tgz", + "integrity": "sha512-z77+X08YDIrgAes4jl8xhnUu1LNIRp4+E7cv4xHmLOxxUPO/ML7PSrE813b90vj7xvQ1lcf7g2uA9GeMZonjhQ==", + "license": "MIT", + "peerDependencies": { + "react": "^16.14.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc", + "react-dom": "^16.14.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" + } + }, + "node_modules/react-smooth": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/react-smooth/-/react-smooth-4.0.4.tgz", + "integrity": "sha512-gnGKTpYwqL0Iii09gHobNolvX4Kiq4PKx6eWBCYYix+8cdw+cGo3do906l1NBPKkSWx1DghC1dlWG9L2uGd61Q==", + "license": "MIT", + "dependencies": { + "fast-equals": "^5.0.1", + "prop-types": "^15.8.1", + "react-transition-group": "^4.4.5" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", + "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" + } + }, + "node_modules/react-style-singleton": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/react-style-singleton/-/react-style-singleton-2.2.3.tgz", + "integrity": "sha512-b6jSvxvVnyptAiLjbkWLE/lOnR4lfTtDAl+eUC7RZy+QQWc6wRzIV2CE6xBuMmDxc2qIihtDCZD5NPOFl7fRBQ==", + "license": "MIT", + "dependencies": { + "get-nonce": "^1.0.0", + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/react-transition-group": { + "version": "4.4.5", + "resolved": "https://registry.npmjs.org/react-transition-group/-/react-transition-group-4.4.5.tgz", + "integrity": "sha512-pZcd1MCJoiKiBR2NRxeCRg13uCXbydPnmB4EOeRrY7480qNWO8IIgQG6zlDkm6uRMsURXPuKq0GWtiM59a5Q6g==", + "license": "BSD-3-Clause", + "dependencies": { + "@babel/runtime": "^7.5.5", + "dom-helpers": "^5.0.1", + "loose-envify": "^1.4.0", + "prop-types": "^15.6.2" + }, + "peerDependencies": { + "react": ">=16.6.0", + "react-dom": ">=16.6.0" + } + }, + "node_modules/recharts": { + "version": "2.15.4", + "resolved": "https://registry.npmjs.org/recharts/-/recharts-2.15.4.tgz", + "integrity": "sha512-UT/q6fwS3c1dHbXv2uFgYJ9BMFHu3fwnd7AYZaEQhXuYQ4hgsxLvsUXzGdKeZrW5xopzDCvuA2N41WJ88I7zIw==", + "license": "MIT", + "dependencies": { + "clsx": "^2.0.0", + "eventemitter3": "^4.0.1", + "lodash": "^4.17.21", + "react-is": "^18.3.1", + "react-smooth": "^4.0.4", + "recharts-scale": "^0.4.4", + "tiny-invariant": "^1.3.1", + "victory-vendor": "^36.6.8" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "react": "^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", + "react-dom": "^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" + } + }, + "node_modules/recharts-scale": { + "version": "0.4.5", + "resolved": "https://registry.npmjs.org/recharts-scale/-/recharts-scale-0.4.5.tgz", + "integrity": "sha512-kivNFO+0OcUNu7jQquLXAxz1FIwZj8nrj+YkOKc5694NbjCvcT6aSZiIzNzd2Kul4o4rTto8QVR9lMNtxD4G1w==", + "license": "MIT", + "dependencies": { + "decimal.js-light": "^2.4.1" + } + }, + "node_modules/rollup": { + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.60.1.tgz", + "integrity": "sha512-VmtB2rFU/GroZ4oL8+ZqXgSA38O6GR8KSIvWmEFv63pQ0G6KaBH9s07PO8XTXP4vI+3UJUEypOfjkGfmSBBR0w==", + "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.60.1", + "@rollup/rollup-android-arm64": "4.60.1", + "@rollup/rollup-darwin-arm64": "4.60.1", + "@rollup/rollup-darwin-x64": "4.60.1", + "@rollup/rollup-freebsd-arm64": "4.60.1", + "@rollup/rollup-freebsd-x64": "4.60.1", + "@rollup/rollup-linux-arm-gnueabihf": "4.60.1", + "@rollup/rollup-linux-arm-musleabihf": "4.60.1", + "@rollup/rollup-linux-arm64-gnu": "4.60.1", + "@rollup/rollup-linux-arm64-musl": "4.60.1", + "@rollup/rollup-linux-loong64-gnu": "4.60.1", + "@rollup/rollup-linux-loong64-musl": "4.60.1", + "@rollup/rollup-linux-ppc64-gnu": "4.60.1", + "@rollup/rollup-linux-ppc64-musl": "4.60.1", + "@rollup/rollup-linux-riscv64-gnu": "4.60.1", + "@rollup/rollup-linux-riscv64-musl": "4.60.1", + "@rollup/rollup-linux-s390x-gnu": "4.60.1", + "@rollup/rollup-linux-x64-gnu": "4.60.1", + "@rollup/rollup-linux-x64-musl": "4.60.1", + "@rollup/rollup-openbsd-x64": "4.60.1", + "@rollup/rollup-openharmony-arm64": "4.60.1", + "@rollup/rollup-win32-arm64-msvc": "4.60.1", + "@rollup/rollup-win32-ia32-msvc": "4.60.1", + "@rollup/rollup-win32-x64-gnu": "4.60.1", + "@rollup/rollup-win32-x64-msvc": "4.60.1", + "fsevents": "~2.3.2" + } + }, + "node_modules/scheduler": { + "version": "0.23.2", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.2.tgz", + "integrity": "sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==", + "license": "MIT", + "dependencies": { + "loose-envify": "^1.1.0" + } + }, + "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/sonner": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/sonner/-/sonner-2.0.7.tgz", + "integrity": "sha512-W6ZN4p58k8aDKA4XPcx2hpIQXBRAgyiWVkYhT7CvK6D3iAu7xjvVyhQHg2/iaKJZ1XVJ4r7XuwGL+WGEK37i9w==", + "license": "MIT", + "peerDependencies": { + "react": "^18.0.0 || ^19.0.0 || ^19.0.0-rc", + "react-dom": "^18.0.0 || ^19.0.0 || ^19.0.0-rc" + } + }, + "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/tailwind-merge": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/tailwind-merge/-/tailwind-merge-3.5.0.tgz", + "integrity": "sha512-I8K9wewnVDkL1NTGoqWmVEIlUcB9gFriAEkXkfCjX5ib8ezGxtR3xD7iZIxrfArjEsH7F1CHD4RFUtxefdqV/A==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/dcastil" + } + }, + "node_modules/tailwindcss": { + "version": "4.1.12", + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-4.1.12.tgz", + "integrity": "sha512-DzFtxOi+7NsFf7DBtI3BJsynR+0Yp6etH+nRPTbpWnS2pZBaSksv/JGctNwSWzbFjp0vxSqknaUylseZqMDGrA==", + "dev": true, + "license": "MIT" + }, + "node_modules/tapable": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.3.2.tgz", + "integrity": "sha512-1MOpMXuhGzGL5TTCZFItxCc0AARf1EZFQkGqMm7ERKj8+Hgr5oLvJOVFcC+lRmR8hCe2S3jC4T5D7Vg/d7/fhA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/tar": { + "version": "7.5.13", + "resolved": "https://registry.npmjs.org/tar/-/tar-7.5.13.tgz", + "integrity": "sha512-tOG/7GyXpFevhXVh8jOPJrmtRpOTsYqUIkVdVooZYJS/z8WhfQUX8RJILmeuJNinGAMSu1veBr4asSHFt5/hng==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "@isaacs/fs-minipass": "^4.0.0", + "chownr": "^3.0.0", + "minipass": "^7.1.2", + "minizlib": "^3.1.0", + "yallist": "^5.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/tar/node_modules/yallist": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-5.0.0.tgz", + "integrity": "sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw==", + "dev": true, + "license": "BlueOak-1.0.0", + "engines": { + "node": ">=18" + } + }, + "node_modules/tiny-invariant": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/tiny-invariant/-/tiny-invariant-1.3.3.tgz", + "integrity": "sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg==", + "license": "MIT" + }, + "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/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "license": "0BSD" + }, + "node_modules/tw-animate-css": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/tw-animate-css/-/tw-animate-css-1.4.0.tgz", + "integrity": "sha512-7bziOlRqH0hJx80h/3mbicLW7o8qLsH5+RaLR2t+OHM3D0JlWGODQKQ4cxbK7WlvmUxpcj6Kgu6EKqjrGFe3QQ==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/Wombosvideo" + } + }, + "node_modules/undici-types": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz", + "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==", + "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/use-callback-ref": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/use-callback-ref/-/use-callback-ref-1.3.3.tgz", + "integrity": "sha512-jQL3lRnocaFtu3V00JToYz/4QkNWswxijDaCVNZRiRTO3HQDLsdu1ZtmIUvV4yPp+rvWm5j0y0TG/S61cuijTg==", + "license": "MIT", + "dependencies": { + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/use-sidecar": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/use-sidecar/-/use-sidecar-1.1.3.tgz", + "integrity": "sha512-Fedw0aZvkhynoPYlA5WXrMCAMm+nSWdZt6lzJQ7Ok8S6Q+VsHmHpRWndVRJ8Be0ZbkfPc5LRYH+5XrzXcEeLRQ==", + "license": "MIT", + "dependencies": { + "detect-node-es": "^1.1.0", + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/use-sync-external-store": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.6.0.tgz", + "integrity": "sha512-Pp6GSwGP/NrPIrxVFAIkOQeyw8lFenOHijQWkUTrDvrF4ALqylP2C/KCkeS9dpUM3KvYRQhna5vt7IL95+ZQ9w==", + "license": "MIT", + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" + } + }, + "node_modules/util": { + "version": "0.10.4", + "resolved": "https://registry.npmjs.org/util/-/util-0.10.4.tgz", + "integrity": "sha512-0Pm9hTQ3se5ll1XihRic3FDIku70C+iHUdT/W926rSgHV5QgXsYbKZN8MSC3tJtSkhuROzvsQjAaFENRXr+19A==", + "license": "MIT", + "dependencies": { + "inherits": "2.0.3" + } + }, + "node_modules/vaul": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vaul/-/vaul-1.1.2.tgz", + "integrity": "sha512-ZFkClGpWyI2WUQjdLJ/BaGuV6AVQiJ3uELGk3OYtP+B6yCO7Cmn9vPFXVJkRaGkOJu3m8bQMgtyzNHixULceQA==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-dialog": "^1.1.1" + }, + "peerDependencies": { + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0.0 || ^19.0.0-rc" + } + }, + "node_modules/victory-vendor": { + "version": "36.9.2", + "resolved": "https://registry.npmjs.org/victory-vendor/-/victory-vendor-36.9.2.tgz", + "integrity": "sha512-PnpQQMuxlwYdocC8fIJqVXvkeViHYzotI+NJrCuav0ZYFoq912ZHBk3mCeuj+5/VpodOjPe1z0Fk2ihgzlXqjQ==", + "license": "MIT AND ISC", + "dependencies": { + "@types/d3-array": "^3.0.3", + "@types/d3-ease": "^3.0.0", + "@types/d3-interpolate": "^3.0.1", + "@types/d3-scale": "^4.0.2", + "@types/d3-shape": "^3.1.0", + "@types/d3-time": "^3.0.0", + "@types/d3-timer": "^3.0.0", + "d3-array": "^3.1.6", + "d3-ease": "^3.0.1", + "d3-interpolate": "^3.0.1", + "d3-scale": "^4.0.2", + "d3-shape": "^3.1.0", + "d3-time": "^3.0.0", + "d3-timer": "^3.0.1" + } + }, + "node_modules/vite": { + "version": "6.3.5", + "resolved": "https://registry.npmjs.org/vite/-/vite-6.3.5.tgz", + "integrity": "sha512-cZn6NDFE7wdTpINgs++ZJ4N49W2vRp8LCKrn3Ob1kYNtOo21vfDoaV5GzBfLU4MovSAB8uNRm4jgzVQZ+mBzPQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "esbuild": "^0.25.0", + "fdir": "^6.4.4", + "picomatch": "^4.0.2", + "postcss": "^8.5.3", + "rollup": "^4.34.9", + "tinyglobby": "^0.2.13" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^18.0.0 || ^20.0.0 || >=22.0.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0", + "jiti": ">=1.21.0", + "less": "*", + "lightningcss": "^1.21.0", + "sass": "*", + "sass-embedded": "*", + "stylus": "*", + "sugarss": "*", + "terser": "^5.16.0", + "tsx": "^4.8.1", + "yaml": "^2.4.2" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "jiti": { + "optional": true + }, + "less": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + }, + "tsx": { + "optional": true + }, + "yaml": { + "optional": true + } + } + }, + "node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true, + "license": "ISC" + } + } +} diff --git a/package.json b/package.json new file mode 100644 index 0000000..23098c9 --- /dev/null +++ b/package.json @@ -0,0 +1,66 @@ +{ + "name": "Redesign Modern Website", + "version": "0.1.0", + "private": true, + "type": "module", + "dependencies": { + "@radix-ui/react-accordion": "^1.2.3", + "@radix-ui/react-alert-dialog": "^1.1.6", + "@radix-ui/react-aspect-ratio": "^1.1.2", + "@radix-ui/react-avatar": "^1.1.3", + "@radix-ui/react-checkbox": "^1.1.4", + "@radix-ui/react-collapsible": "^1.1.3", + "@radix-ui/react-context-menu": "^2.2.6", + "@radix-ui/react-dialog": "^1.1.6", + "@radix-ui/react-dropdown-menu": "^2.1.6", + "@radix-ui/react-hover-card": "^1.1.6", + "@radix-ui/react-label": "^2.1.2", + "@radix-ui/react-menubar": "^1.1.6", + "@radix-ui/react-navigation-menu": "^1.2.5", + "@radix-ui/react-popover": "^1.1.6", + "@radix-ui/react-progress": "^1.1.2", + "@radix-ui/react-radio-group": "^1.2.3", + "@radix-ui/react-scroll-area": "^1.2.3", + "@radix-ui/react-select": "^2.1.6", + "@radix-ui/react-separator": "^1.1.2", + "@radix-ui/react-slider": "^1.2.3", + "@radix-ui/react-slot": "^1.1.2", + "@radix-ui/react-switch": "^1.1.3", + "@radix-ui/react-tabs": "^1.1.3", + "@radix-ui/react-toggle": "^1.1.2", + "@radix-ui/react-toggle-group": "^1.1.2", + "@radix-ui/react-tooltip": "^1.1.8", + "@vitejs/plugin-react": "*", + "class-variance-authority": "^0.7.1", + "clsx": "*", + "cmdk": "^1.1.1", + "embla-carousel-react": "^8.6.0", + "input-otp": "^1.4.2", + "lucide-react": "^0.487.0", + "next-themes": "^0.4.6", + "path": "*", + "react": "^18.3.1", + "react-day-picker": "^8.10.1", + "react-dom": "^18.3.1", + "react-hook-form": "^7.55.0", + "react-resizable-panels": "^2.1.7", + "recharts": "^2.15.2", + "sonner": "^2.0.3", + "tailwind-merge": "*", + "tailwindcss": "*", + "tw-animate-css": "^1.3.8", + "vaul": "^1.1.2", + "vite": "*" + }, + "devDependencies": { + "@tailwindcss/vite": "4.1.12", + "@types/node": "^20.10.0", + "@vitejs/plugin-react": "^4.7.0", + "tailwindcss": "4.1.12", + "vite": "6.3.5" + }, + "scripts": { + "dev": "vite", + "build": "vite build" + } +} \ No newline at end of file diff --git a/src/App.tsx b/src/App.tsx new file mode 100644 index 0000000..38e14f6 --- /dev/null +++ b/src/App.tsx @@ -0,0 +1,159 @@ +import { useState, useEffect } from "react"; +import { Header } from "./components/Header"; +import { Footer } from "./components/Footer"; +import { ContactModal } from "./components/ContactModal"; +import { HomePage } from "./pages/HomePage"; +import { CloudPage } from "./pages/CloudPage"; +import { RussianSoftwarePage } from "./pages/RussianSoftwarePage"; +import { CybersecurityPage } from "./pages/CybersecurityPage"; +import { AISolutionsPage } from "./pages/AISolutionsPage"; +import { RussianHardwarePage } from "./pages/RussianHardwarePage"; +import { HardwareSolutionsPage } from "./pages/HardwareSolutionsPage"; +import { CADandGISPage } from "./pages/CADandGISPage"; +import { IndustrialSolutionsPage } from "./pages/IndustrialSolutionsPage"; +import { GovernmentPage } from "./pages/GovernmentPage"; +import { BusinessPage } from "./pages/BusinessPage"; +import { ConsultingPage } from "./pages/ConsultingPage"; +import { ImplementationPage } from "./pages/ImplementationPage"; +import { ManagedServicesPage } from "./pages/ManagedServicesPage"; +import { IntegrationPage } from "./pages/IntegrationPage"; +import { SpecializedServicesPage } from "./pages/SpecializedServicesPage"; +import { SupportPage } from "./pages/SupportPage"; +import { SubscriptionPage } from "./pages/SubscriptionPage"; + +export default function App() { + const [currentPage, setCurrentPage] = useState("home"); + const [pendingScroll, setPendingScroll] = useState< + string | null + >(null); + const [isContactModalOpen, setIsContactModalOpen] = + useState(false); + + const scrollToSection = (sectionId: string) => { + // Даем странице время отрендериться + setTimeout(() => { + const section = document.getElementById(sectionId); + console.log( + "Trying to scroll to:", + sectionId, + "Found element:", + section, + ); + if (section) { + const headerHeight = 85; // Header высота + минимальный отступ + const targetPosition = section.offsetTop - headerHeight; + console.log("Scrolling to position:", targetPosition); + window.scrollTo({ + top: targetPosition, + behavior: "smooth", + }); + } else { + console.error("Section not found:", sectionId); + } + }, 100); + }; + + const handleNavigate = (page: string, section?: string) => { + if (section) { + // Клик на Кейсы/О компании/Контакты + if (currentPage !== "home") { + // Если не на главной - переходим туда + setCurrentPage("home"); + setPendingScroll(section); + } else { + // Уже на главной - скроллим сразу + scrollToSection(section); + } + } else { + // Обычная навигация на другие страницы + setCurrentPage(page); + setPendingScroll(null); + window.scrollTo({ top: 0, behavior: "smooth" }); + } + }; + + useEffect(() => { + // Когда вернулись на главную с отложенным скроллом + if (currentPage === "home" && pendingScroll) { + scrollToSection(pendingScroll); + setPendingScroll(null); + } + }, [currentPage, pendingScroll]); + + const handleBackToHome = () => { + setCurrentPage("home"); + setPendingScroll(null); + window.scrollTo({ top: 0, behavior: "smooth" }); + }; + + const renderPage = () => { + switch (currentPage) { + case "cloud": + return ; + case "russian-software": + return ( + + ); + case "cybersecurity": + return ; + case "ai-solutions": + return ; + case "russian-hardware": + return ( + + ); + case "hardware-solutions": + return ( + + ); + case "cad-gis": + return ; + case "industrial-solutions": + return ( + + ); + case "government": + return ; + case "business": + return ; + case "consulting": + return ; + case "implementation": + return ; + case "managed-services": + return ( + + ); + case "integration": + return ; + case "specialized-services": + return ( + + ); + case "support": + return ; + case "subscription": + return ; + default: + return ( + + setIsContactModalOpen(true) + } + /> + ); + } + }; + + return ( +
+
+ {renderPage()} +
+ setIsContactModalOpen(false)} + /> +
+ ); +} \ No newline at end of file diff --git a/src/Attributions.md b/src/Attributions.md new file mode 100644 index 0000000..9b7cd4e --- /dev/null +++ b/src/Attributions.md @@ -0,0 +1,3 @@ +This Figma Make file includes components from [shadcn/ui](https://ui.shadcn.com/) used under [MIT license](https://github.com/shadcn-ui/ui/blob/main/LICENSE.md). + +This Figma Make file includes photos from [Unsplash](https://unsplash.com) used under [license](https://unsplash.com/license). \ No newline at end of file diff --git a/src/COMMIT-AND-DEPLOY.md b/src/COMMIT-AND-DEPLOY.md new file mode 100644 index 0000000..41cda7c --- /dev/null +++ b/src/COMMIT-AND-DEPLOY.md @@ -0,0 +1,267 @@ +# 🚀 Готово к коммиту и деплою! + +## ✅ Все исправления применены + +### Что было исправлено: + +1. ✅ **Node.js версия зафиксирована на 18 LTS** + - Создан `.nvmrc` + - Добавлен `engines` в `package.json` + - `netlify.toml` уже содержал NODE_VERSION = "18" + +2. ✅ **Vite настроен на сборку в папку `build`** + - Обновлён `vite.config.ts`: `outDir: 'build'` + - `netlify.toml` указывает `publish = "build"` + +3. ✅ **Созданы скрипты проверки** + - `check-build.sh` (Linux/Mac) + - `check-build.bat` (Windows) + +4. ✅ **Создан .gitignore** + - Исключены node_modules, логи, кеш + +5. ✅ **Документация обновлена** + - NODE-VERSION-FIX.md + - NETLIFY-FIX.md + - LATEST-FIXES.md + - README.md + +--- + +## 📋 Шаги для деплоя + +### Шаг 1: Проверка локально (опционально) + +**Убедитесь что используете Node.js 18:** +```bash +# Проверить версию +node -v + +# Если не v18.x.x, установите: +nvm install 18 +nvm use 18 +``` + +**Запустите проверку сборки:** +```bash +# Linux/Mac +chmod +x check-build.sh +./check-build.sh + +# Windows +check-build.bat +``` + +**Ожидаемый результат:** +``` +✅ Node.js версия совместима (v18.x.x) +✅ BUILD OUTPUT: build +📋 Для Netlify используйте: publish = "build" +``` + +--- + +### Шаг 2: Коммит изменений + +```bash +# Проверьте что изменилось +git status + +# Добавьте все файлы +git add . + +# Закоммитьте с понятным сообщением +git commit -m "Fix: Pin Node.js to v18 LTS and configure Vite outDir to 'build'" + +# Альтернативный вариант (более детальный): +git commit -m "Fix deployment configuration + +- Pin Node.js to v18 LTS (.nvmrc + package.json engines) +- Update vite.config.ts outDir from 'dist' to 'build' +- Update check-build scripts with Node version validation +- Add comprehensive deployment documentation" +``` + +--- + +### Шаг 3: Пуш в GitHub + +```bash +# Запушьте в main (или master) ветку +git push origin main + +# Или если используете master: +# git push origin master +``` + +--- + +### Шаг 4: Наблюдайте за деплоем в Netlify + +После пуша: + +1. **Откройте Netlify Dashboard** + - Перейдите на https://app.netlify.com + - Откройте ваш сайт + - Нажмите на **"Deploys"** + +2. **Следите за логами** + - Должен начаться новый деплой (обычно в течение 10-30 секунд) + - Нажмите на последний деплой чтобы открыть логи + +3. **Что искать в логах:** + + **✅ Успешная сборка:** + ``` + v18.x.x is already installed. + Now using node v18.x.x (npm v9.x.x) + ... + npm run build + ... + vite v5.x.x building for production... + ✓ built in X.XXs + build/assets/index-xxxxx.js + + Deploy site + ──────────────────────────────────────── + ✓ Deploy is live! + + Website URL: https://your-site.netlify.app + ``` + + **❌ Если ошибка:** + - Скопируйте полный текст ошибки + - См. раздел "Troubleshooting" ниже + +--- + +## 🎉 После успешного деплоя + +### Проверьте сайт: + +1. **Откройте URL сайта** (из Netlify Dashboard) + +2. **Проверьте основной функционал:** + - [ ] Главная страница загружается + - [ ] Навигация работает (Header меню) + - [ ] Переходы между страницами работают + - [ ] Стили применяются корректно + - [ ] Модальное окно "Обсудить проект" открывается + - [ ] Нет ошибок в консоли браузера (F12) + +3. **Проверьте на мобильных устройствах:** + - [ ] Мобильное меню работает + - [ ] Responsive дизайн корректный + - [ ] Кнопки кликабельны + +--- + +## 🔍 Troubleshooting + +### Проблема 1: "Deploy directory 'build' does not exist" + +**Решение:** +1. Проверьте логи сборки - успешно ли прошёл `npm run build`? +2. Если сборка падает, найдите строку с ошибкой +3. Попробуйте очистить кеш Netlify: + - Site settings → Build & deploy → Clear cache and retry deploy + +### Проблема 2: Всё ещё используется Node.js v22 + +**Решение:** +1. Убедитесь что `.nvmrc` закоммичен: `git log --name-only -1` +2. Проверьте Netlify environment variables: + - Site settings → Environment variables + - Удалите переменную `NODE_VERSION` если она там есть (пусть используется .nvmrc) +3. Очистите кеш и retry deploy + +### Проблема 3: Build успешен, но 404 или белый экран + +**Решение:** +1. Проверьте что `publish` в netlify.toml правильный: `build` +2. В Site settings → Build & deploy → Build settings: + - Publish directory должна быть: `build` +3. Проверьте консоль браузера (F12) на наличие ошибок + +### Проблема 4: Netlify всё ещё не работает + +**Альтернативы:** + +#### Cloudflare Pages (рекомендуется) +``` +1. https://pages.cloudflare.com +2. Connect GitHub repository +3. Build command: npm run build +4. Build output: build +5. Environment: NODE_VERSION = 18 +``` + +#### GitHub Pages (уже настроен) +``` +1. GitHub repo → Settings → Pages +2. Source: GitHub Actions +3. Workflow автоматически задеплоится +``` + +--- + +## 📊 Ожидаемое время деплоя + +- **Netlify:** ~2-3 минуты +- **Cloudflare Pages:** ~2-3 минуты +- **GitHub Pages:** ~3-5 минут + +--- + +## 📖 Дополнительная документация + +Если нужна дополнительная помощь: + +- **NODE-VERSION-FIX.md** - детали о Node.js версии +- **NETLIFY-FIX.md** - решение проблем Netlify +- **LATEST-FIXES.md** - последние изменения +- **DEPLOYMENT.md** - полная инструкция по всем платформам +- **DEPLOY-QUICK.md** - быстрая шпаргалка + +--- + +## 🎯 Команды для копирования + +```bash +# Весь процесс одной командой: +node -v && \ +git add . && \ +git commit -m "Fix: Pin Node.js to v18 LTS and configure build output" && \ +git push origin main && \ +echo "✅ Pushed! Check Netlify Dashboard for deploy status." +``` + +--- + +## ✅ Финальный чеклист + +- [x] Node.js 18 зафиксирован (.nvmrc, package.json) +- [x] vite.config.ts использует outDir: 'build' +- [x] netlify.toml использует publish: 'build' +- [x] Скрипты проверки обновлены +- [x] .gitignore создан +- [x] Документация обновлена +- [ ] **ВАШ ШАГ:** `git add .` +- [ ] **ВАШ ШАГ:** `git commit -m "..."` +- [ ] **ВАШ ШАГ:** `git push` +- [ ] **ПРОВЕРКА:** Netlify Deploy успешен +- [ ] **ПРОВЕРКА:** Сайт работает + +--- + +## 🎊 Поздравляем! + +После успешного деплоя ваш сайт SOFTCLICK будет доступен по URL от Netlify. + +Вы также можете: +- Настроить **кастомный домен** (your-company.ru) +- Настроить **SSL сертификат** (HTTPS) - Netlify делает это автоматически +- Подключить **аналитику** (Yandex.Metrika, Google Analytics) +- Настроить **форму обратной связи** с реальной отправкой + +**Удачи с проектом!** 🚀 diff --git a/src/DEPLOY-QUICK.md b/src/DEPLOY-QUICK.md new file mode 100644 index 0000000..ee79d39 --- /dev/null +++ b/src/DEPLOY-QUICK.md @@ -0,0 +1,124 @@ +# 🚀 Быстрая шпаргалка по деплою + +## ⚠️ ВАЖНО: Сначала проверьте сборку! + +**Linux/Mac:** +```bash +./check-build.sh +``` + +**Windows:** +```cmd +check-build.bat +``` + +Это покажет, создаётся `dist` или `build`. Используйте правильную папку в настройках! + +--- + +## 1️⃣ Netlify (РЕКОМЕНДУЕТСЯ - 2 минуты) +``` +1. https://netlify.com → Sign up +2. "Add new site" → "Import from Git" +3. Выбрать репозиторий → Deploy +✅ Готово! Автодеплой включен + +📝 netlify.toml уже настроен на папку build + Если нужно изменить - см. NETLIFY-FIX.md +``` + +## 2️⃣ Cloudflare Pages (Очень быстро) +``` +1. https://pages.cloudflare.com → Sign up +2. "Create a project" → Подключить Git +3. Build: npm run build | Output: dist +✅ Готово! +``` + +## 3️⃣ GitHub Pages (100% бесплатно) +``` +1. Запушить код в GitHub +2. Settings → Pages → Source: "GitHub Actions" +✅ Готово! Файл .github/workflows/deploy.yml уже настроен +``` + +## 4️⃣ Яндекс.Облако (Российское) +```bash +# Установка CLI +curl -sSL https://storage.yandexcloud.net/yandexcloud-yc/install.sh | bash + +# Создание бакета +yc storage bucket create --name softclick --public-read + +# Деплой +npm run build +yc storage s3api sync ./dist/ s3://softclick/ + +✅ Готово! ~100₽/месяц +``` + +## 5️⃣ Обычный хостинг (Timeweb, Beget и т.д.) +```bash +# Локально: +npm run build + +# Загрузить через FTP содержимое папки dist/ +# Файл .htaccess уже готов + +✅ Готово! от 120₽/месяц +``` + +--- + +## ⚡ Супер-быстрая команда (для всех платформ) +```bash +npm run build +``` +Загрузите содержимое папки `dist/` куда угодно! + +--- + +## 🎯 Что выбрать? + +- **Нужно быстро и бесплатно?** → Netlify +- **Нужен супер-быстрый CDN?** → Cloudflare Pages +- **100% бесплатно навсегда?** → GitHub Pages +- **Только российское?** → Яндекс.Облако +- **Есть свой хостинг?** → FTP + dist/ + +--- + +## 📱 Автоматические скрипты + +**Linux/Mac:** +```bash +./deploy.sh +``` + +**Windows:** +```cmd +deploy.bat +``` + +--- + +## ❓ Проблемы? + +1. Не работает `npm run build`? + ```bash + rm -rf node_modules dist + npm install + npm run build + ``` + +2. Белый экран после деплоя? + - Проверьте что загружены ВСЕ файлы из `dist/` + - Проверьте консоль браузера (F12) + +3. 404 при переходе на страницы? + - Проверьте `.htaccess` (Apache) + - На Netlify/Cloudflare это работает автоматически + +--- + +📖 **Полная инструкция:** `DEPLOYMENT.md` \ No newline at end of file diff --git a/src/DEPLOYMENT-CHECKLIST.md b/src/DEPLOYMENT-CHECKLIST.md new file mode 100644 index 0000000..a3a95d5 --- /dev/null +++ b/src/DEPLOYMENT-CHECKLIST.md @@ -0,0 +1,152 @@ +# ✅ Чеклист деплоя SOFTCLICK + +## Перед деплоем + +- [ ] Код работает локально (`npm run dev`) +- [ ] Сборка успешна (`npm run build`) +- [ ] Все изменения закоммичены в Git +- [ ] Выбрана платформа для деплоя + +## 📁 Созданные файлы конфигурации + +### Для разных платформ: +- [x] `netlify.toml` - Netlify +- [x] `.github/workflows/deploy.yml` - GitHub Pages +- [x] `.github/workflows/deploy-yandex.yml` - Яндекс.Облако +- [x] `.htaccess` - Apache хостинг +- [x] `_redirects` - Cloudflare Pages +- [x] `_headers` - Cloudflare Pages +- [x] `vercel.json` - Vercel (опционально) + +### Скрипты деплоя: +- [x] `deploy.sh` - Linux/Mac +- [x] `deploy.bat` - Windows + +### Документация: +- [x] `DEPLOYMENT.md` - Полная инструкция +- [x] `DEPLOY-QUICK.md` - Быстрая шпаргалка +- [x] `deploy-yandex-cloud.md` - Яндекс.Облако +- [x] `deploy-traditional-hosting.md` - Традиционный хостинг + +--- + +## 🎯 Выбор платформы + +### Вариант 1: Netlify (РЕКОМЕНДУЕТСЯ) +- [ ] Зарегистрироваться на netlify.com +- [ ] Подключить Git-репозиторий +- [ ] Запустить деплой +- [ ] Проверить результат + +**Время:** ~2 минуты +**Автодеплой:** ✅ Да +**Стоимость:** Бесплатно + +### Вариант 2: Cloudflare Pages +- [ ] Зарегистрироваться на pages.cloudflare.com +- [ ] Подключить Git-репозиторий +- [ ] Build: `npm run build`, Output: `dist` +- [ ] Запустить деплой + +**Время:** ~3 минуты +**Автодеплой:** ✅ Да +**Стоимость:** Бесплатно + +### Вариант 3: GitHub Pages +- [ ] Код в GitHub репозитории +- [ ] Settings → Pages → Source: "GitHub Actions" +- [ ] Готово (workflow уже настроен) + +**Время:** ~1 минута +**Автодеплой:** ✅ Да +**Стоимость:** Бесплатно + +### Вариант 4: Яндекс.Облако +- [ ] Создать аккаунт на cloud.yandex.ru +- [ ] Установить Yandex Cloud CLI +- [ ] Создать бакет Object Storage +- [ ] Настроить публичный доступ +- [ ] Загрузить файлы + +**Время:** ~10 минут +**Автодеплой:** ✅ Да (через GitHub Actions) +**Стоимость:** ~50-200₽/месяц + +### Вариант 5: Традиционный хостинг +- [ ] Купить хостинг (Timeweb/Beget/Reg.ru) +- [ ] Получить FTP доступ +- [ ] Собрать проект: `npm run build` +- [ ] Загрузить содержимое `dist/` через FTP +- [ ] Проверить `.htaccess` + +**Время:** ~15 минут +**Автодеплой:** ❌ Нет (ручная загрузка) +**Стоимость:** от 120₽/месяц + +--- + +## 🔍 После деплоя + +- [ ] Сайт открывается +- [ ] Все страницы загружаются +- [ ] Навигация работает +- [ ] Стили применяются +- [ ] Модальные окна открываются +- [ ] Нет ошибок в консоли (F12) +- [ ] Мобильная версия работает + +--- + +## 🐛 Устранение проблем + +### Белый экран +- [ ] Проверить консоль браузера (F12) +- [ ] Убедиться что все файлы загружены +- [ ] Проверить путь к CSS файлам + +### 404 при переходе на страницы +- [ ] Проверить `.htaccess` (для Apache) +- [ ] Проверить конфигурацию rewrites +- [ ] На Netlify/Cloudflare/GitHub Pages должно работать автоматически + +### Ошибки сборки +```bash +# Очистить и пересобрать +rm -rf node_modules dist +npm install +npm run build +``` + +--- + +## 📊 Сравнение платформ + +| Платформа | Сложность | Время | Автодеплой | Российская | Стоимость | +|-----------|-----------|-------|------------|------------|-----------| +| Netlify | ⭐ Легко | 2 мин | ✅ | ❌ | Бесплатно | +| Cloudflare | ⭐ Легко | 3 мин | ✅ | ❌ | Бесплатно | +| GitHub Pages | ⭐ Легко | 1 мин | ✅ | ❌ | Бесплатно | +| Яндекс.Облако | ⭐⭐ Средне | 10 мин | ✅ | ✅ | ~100₽/мес | +| Традиц. хостинг | ⭐⭐⭐ Сложнее | 15 мин | ❌ | ✅ | от 120₽/мес | + +--- + +## 🎉 Готово! + +После успешного деплоя: +- [ ] Сохранить URL сайта +- [ ] Настроить кастомный домен (если нужно) +- [ ] Настроить SSL (HTTPS) +- [ ] Добавить в поисковики (Google/Яндекс) + +--- + +## 📞 Нужна помощь? + +1. **Проблемы со сборкой** → Проверьте `npm run build` локально +2. **Проблемы с деплоем** → Смотрите логи на платформе +3. **404 ошибки** → Проверьте конфигурацию роутинга +4. **Стили не загружаются** → Проверьте консоль браузера + +📖 Полная документация: `DEPLOYMENT.md` +⚡ Быстрая шпаргалка: `DEPLOY-QUICK.md` diff --git a/src/DEPLOYMENT.md b/src/DEPLOYMENT.md new file mode 100644 index 0000000..8ec8549 --- /dev/null +++ b/src/DEPLOYMENT.md @@ -0,0 +1,164 @@ +# 🚀 Инструкции по деплою SOFTCLICK + +Этот документ содержит все способы публикации вашего сайта. + +## 🎯 Быстрый старт + +### Локальная сборка +```bash +# 1. Установите зависимости +npm install + +# 2. Соберите проект +npm run build + +# 3. Папка dist/ (или build/) содержит готовый сайт +``` + +**⚠️ Важно:** Vite может создать папку `dist` или `build` в зависимости от конфигурации. Проверьте, какая папка создаётся после `npm run build`. + +--- + +## 📌 Рекомендуемые платформы + +### ⭐ 1. Netlify (САМЫЙ ПРОСТОЙ) +**✅ Плюсы:** Бесплатно, автоматический деплой, HTTPS, CDN +**⏱ Время настройки:** 2 минуты + +**Инструкция:** +1. Регистрация: https://netlify.com +2. "Add new site" → "Import an existing project" +3. Выберите ваш Git-репозиторий +4. Netlify автоматически найдет `netlify.toml` +5. Нажмите "Deploy" - готово! 🎉 + +**Автоматизация:** При каждом пуше в репозиторий сайт обновляется автоматически. + +--- + +### ⭐ 2. Cloudflare Pages (САМЫЙ БЫСТРЫЙ) +**✅ Плюсы:** Бесплатно, очень быстрый CDN, неограниченный трафик +**⏱ Время настройки:** 3 минуты + +**Инструкция:** +1. Регистрация: https://pages.cloudflare.com +2. "Create a project" → подключите Git +3. Настройки: + - Build command: `npm run build` + - Build output: `dist` +4. Deploy - готово! 🎉 + +--- + +### ⭐ 3. GitHub Pages (100% БЕСПЛАТНО) +**✅ Плюсы:** Полностью бесплатно навсегда +**⏱ Время настройки:** 1 минута + +**Инструкция:** +1. Запушьте код в GitHub +2. Settings → Pages → Source: "GitHub Actions" +3. Готово! Автоматический деплой настроен 🎉 + +**URL:** `https://username.github.io/repository-name` + +--- + +## 🇷🇺 Российские платформы + +### 4. Яндекс.Облако (ИМПОРТОЗАМЕЩЕНИЕ) +**✅ Плюсы:** Российская платформа, Object Storage + CDN +**💰 Стоимость:** ~50-200 ₽/месяц +**⏱ Время настройки:** 10 минут + +**Подробная инструкция:** См. файл `deploy-yandex-cloud.md` + +**Быстрая настройка:** +```bash +# 1. Установите Yandex Cloud CLI +curl -sSL https://storage.yandexcloud.net/yandexcloud-yc/install.sh | bash + +# 2. Создайте бакет +yc storage bucket create --name softclick-website --public-read + +# 3. Соберите и загрузите +npm run build +yc storage s3api sync ./dist/ s3://softclick-website/ +``` + +--- + +### 5. Традиционный хостинг +**Подходит для:** Timeweb, Beget, Reg.ru, HostiMan +**💰 Стоимость:** от 120 ₽/месяц + +**Подробная инструкция:** См. файл `deploy-traditional-hosting.md` + +**Краткая версия:** +1. Соберите проект: `npm run build` +2. Загрузите содержимое папки `dist/` на хостинг через FTP +3. Файл `.htaccess` уже готов и настроен +4. Готово! 🎉 + +--- + +## 🛠 Автоматизация + +### Автоматический деплой при пуше в Git + +**GitHub Actions готовы для:** +- ✅ GitHub Pages → `.github/workflows/deploy.yml` +- ✅ Яндекс.Облако → `.github/workflows/deploy-yandex.yml` + +**Настройка GitHub Actions для Яндекс.Облако:** +1. Создайте сервисный аккаунт в Yandex Cloud +2. Добавьте секреты в GitHub: + - `YC_SERVICE_ACCOUNT_KEY_JSON` - ключ сервисного аккаунта + - `YC_BUCKET_NAME` - название бакета +3. При пуше в main автоматически загрузится на Яндекс.Облако + +--- + +## 📋 Сравнительная таблица + +| Платформа | Цена | Скорость настройки | Автодеплой | Российская | +|-----------|------|-------------------|------------|------------| +| Netlify | Бесплатно | ⚡⚡⚡ 2 мин | ✅ | ❌ | +| Cloudflare Pages | Бесплатно | ⚡⚡⚡ 3 мин | ✅ | ❌ | +| GitHub Pages | Бесплатно | ⚡⚡⚡ 1 мин | ✅ | ❌ | +| Яндекс.Облако | ~100₽/мес | ⚡⚡ 10 мин | ✅ | ✅ | +| Timeweb/Beget | от 120₽/мес | ⚡ 15 мин | ❌ | ✅ | + +--- + +## 🎯 Рекомендации + +**Для быстрого запуска:** Netlify или Cloudflare Pages +**Для 100% бесплатно:** GitHub Pages +**Для импортозамещения:** Яндекс.Облако +**Для полного контроля:** Свой VPS + Nginx + +--- + +## 🆘 Помощь + +**Не работает сборка?** +```bash +# Очистите кеш и пересоберите +rm -rf node_modules dist +npm install +npm run build +``` + +**Проблемы с роутингом?** +- Проверьте наличие `.htaccess` (Apache) или настройки Nginx +- На платформах типа Netlify/Cloudflare это работает автоматически + +**Белый экран после деплоя?** +- Проверьте консоль браузера (F12) +- Убедитесь что загружены все файлы из `dist/` + +--- + +## 📞 Контакты + +При возникновении проблем с деплоем - проверьте логи сборки на выбранной платформе. \ No newline at end of file diff --git a/src/FILES-OVERVIEW.md b/src/FILES-OVERVIEW.md new file mode 100644 index 0000000..91f6032 --- /dev/null +++ b/src/FILES-OVERVIEW.md @@ -0,0 +1,237 @@ +# 📁 Обзор файлов проекта + +## 🚀 НАЧНИТЕ С ЭТОГО ФАЙЛА +**→ START-HERE.md** - Быстрый старт для деплоя на Netlify + +--- + +## 📖 Документация по деплою (в порядке важности) + +### Обязательно прочитать: +1. **COMMIT-AND-DEPLOY.md** - Пошаговая инструкция коммита и деплоя +2. **NETLIFY-FIX.md** - Решение проблем с Netlify +3. **NODE-VERSION-FIX.md** - Информация о Node.js v18 + +### Дополнительная информация: +4. **DEPLOYMENT.md** - Полная инструкция по всем платформам +5. **DEPLOY-QUICK.md** - Быстрая шпаргалка +6. **PLATFORMS.md** - Детальное сравнение платформ +7. **DEPLOYMENT-CHECKLIST.md** - Чеклист для деплоя + +### История изменений: +8. **LATEST-FIXES.md** - Последние исправления (Node.js v18) +9. **FIXES-SUMMARY.md** - Полная сводка всех исправлений + +### Специфичные платформы: +10. **deploy-yandex-cloud.md** - Яндекс.Облако +11. **deploy-traditional-hosting.md** - Timeweb, Beget, Reg.ru + +--- + +## 🔧 Конфигурационные файлы + +### Главные конфигурации: +- **package.json** - Зависимости и скрипты + - Содержит `engines` для Node.js 18 +- **vite.config.ts** - Конфигурация Vite + - `outDir: 'build'` - выходная папка +- **tsconfig.json** - TypeScript конфигурация + +### Деплой конфигурации: +- **.nvmrc** - Фиксация Node.js 18 (для Netlify) +- **netlify.toml** - Настройки Netlify + - `publish = "build"` + - `NODE_VERSION = "18"` +- **vercel.json** - Настройки Vercel (опционально) +- **.htaccess** - Для Apache хостинга +- **.gitignore** - Исключения для Git + +### Стили и сборка: +- **postcss.config.js** - PostCSS конфигурация +- **tailwind.config.js** - Tailwind CSS v4 конфигурация +- **/styles/globals.css** - Глобальные стили +- **/styles/animations.css** - Анимации + +--- + +## 🛠 Скрипты и утилиты + +### Скрипты проверки: +- **check-build.sh** - Проверка сборки (Linux/Mac) +- **check-build.bat** - Проверка сборки (Windows) + - Проверяют Node.js версию + - Собирают проект + - Показывают output директорию + +### Скрипты деплоя: +- **deploy.sh** - Полуавтоматический деплой (Linux/Mac) +- **deploy.bat** - Полуавтоматический деплой (Windows) + +--- + +## 📱 Исходный код приложения + +### Корневые файлы: +- **App.tsx** - Главный компонент с роутингом +- **main.tsx** - Точка входа приложения +- **index.html** - HTML шаблон + +### Компоненты: +- **/components/Header.tsx** - Шапка с навигацией +- **/components/Footer.tsx** - Подвал сайта +- **/components/Hero.tsx** - Hero-секция с метриками +- **/components/About.tsx** - О компании +- **/components/Services.tsx** - Услуги +- **/components/Solutions.tsx** - Решения +- **/components/Cases.tsx** - Кейсы +- **/components/Contact.tsx** - Контакты +- **/components/ContactModal.tsx** - Модальное окно +- **/components/CategoryPage.tsx** - Шаблон страницы категории +- **/components/ui/** - UI компоненты (shadcn/ui) + +### Страницы: +- **/pages/HomePage.tsx** - Главная страница +- **/pages/RussianSoftwarePage.tsx** - Российское ПО +- **/pages/RussianHardwarePage.tsx** - Российское оборудование +- **/pages/CloudPage.tsx** - Облачные решения +- **/pages/CybersecurityPage.tsx** - Кибербезопасность +- **/pages/BusinessPage.tsx** - Бизнес-приложения +- **/pages/AISolutionsPage.tsx** - AI решения +- **/pages/CADandGISPage.tsx** - CAD/GIS системы +- **/pages/IndustrialSolutionsPage.tsx** - Промышленные решения +- **/pages/HardwareSolutionsPage.tsx** - Оборудование +- **/pages/GovernmentPage.tsx** - Госсектор +- **/pages/ConsultingPage.tsx** - Консалтинг +- **/pages/IntegrationPage.tsx** - Интеграция +- **/pages/ImplementationPage.tsx** - Внедрение +- **/pages/SupportPage.tsx** - Поддержка +- **/pages/ManagedServicesPage.tsx** - Управляемые услуги +- **/pages/SubscriptionPage.tsx** - Подписки +- **/pages/SpecializedServicesPage.tsx** - Спец. услуги + +--- + +## 🎨 Статические ресурсы + +### Public файлы: +- **/public/favicon.svg** - Иконка сайта (буква "S") + +--- + +## 📚 Дополнительные файлы + +- **README.md** - Основной README проекта +- **Attributions.md** - Лицензии и атрибуты +- **guidelines/Guidelines.md** - Руководство по разработке + +--- + +## 🗂 Структура проекта + +``` +/ +├── 🚀 START-HERE.md ← НАЧНИТЕ ОТСЮДА +├── 📖 Документация по деплою +│ ├── COMMIT-AND-DEPLOY.md +│ ├── NETLIFY-FIX.md +│ ├── NODE-VERSION-FIX.md +│ ├── DEPLOYMENT.md +│ ├── DEPLOY-QUICK.md +│ ├── PLATFORMS.md +│ ├── DEPLOYMENT-CHECKLIST.md +│ ├── LATEST-FIXES.md +│ ├── FIXES-SUMMARY.md +│ ├── deploy-yandex-cloud.md +│ └── deploy-traditional-hosting.md +├── 🔧 Конфигурации +│ ├── .nvmrc +│ ├── .gitignore +│ ├── package.json +│ ├── vite.config.ts +│ ├── tsconfig.json +│ ├── netlify.toml +│ ├── postcss.config.js +│ ├── tailwind.config.js +│ ├── .htaccess +│ └── vercel.json +├── 🛠 Скрипты +│ ├── check-build.sh +│ ├── check-build.bat +│ ├── deploy.sh +│ └── deploy.bat +├── 📱 Исходный код +│ ├── App.tsx +│ ├── main.tsx +│ ├── index.html +│ ├── /components/ (React компоненты) +│ ├── /pages/ (Страницы) +│ ├── /styles/ (Стили) +│ └── /public/ (Статические файлы) +└── 📚 Прочее + ├── README.md + ├── Attributions.md + └── guidelines/ +``` + +--- + +## 🎯 Какой файл читать? + +### Хочу быстро задеплоить на Netlify: +→ **START-HERE.md** + +### Netlify выдаёт ошибку: +→ **NETLIFY-FIX.md** + +### Проблемы с Node.js версией: +→ **NODE-VERSION-FIX.md** + +### Хочу сравнить платформы: +→ **PLATFORMS.md** + +### Нужна полная инструкция: +→ **DEPLOYMENT.md** + +### Хочу задеплоить на Яндекс.Облако: +→ **deploy-yandex-cloud.md** + +### Что было исправлено: +→ **LATEST-FIXES.md** или **FIXES-SUMMARY.md** + +--- + +## 📋 NPM Scripts + +```bash +npm run dev # Запуск dev-сервера (http://localhost:5173) +npm run build # Сборка для продакшена (→ build/) +npm run preview # Предпросмотр продакшен-сборки +``` + +--- + +## ✨ Особенности проекта + +- ✅ **React 18** + **TypeScript** +- ✅ **Vite 5** для быстрой сборки +- ✅ **Tailwind CSS v4** для стилизации +- ✅ **React Router** для навигации +- ✅ **Lucide Icons** для иконок +- ✅ **shadcn/ui** компоненты +- ✅ **Responsive дизайн** +- ✅ **Российские аналоги** зарубежных решений +- ✅ **Минималистичный дизайн** без фотографий + +--- + +## 🔗 Полезные ссылки + +- Vite: https://vitejs.dev +- React: https://react.dev +- Tailwind CSS: https://tailwindcss.com +- Netlify: https://netlify.com +- Node.js: https://nodejs.org + +--- + +Этот файл создан для быстрой навигации по проекту. Начните с **START-HERE.md**! 🚀 diff --git a/src/FIXES-SUMMARY.md b/src/FIXES-SUMMARY.md new file mode 100644 index 0000000..dfff5d4 --- /dev/null +++ b/src/FIXES-SUMMARY.md @@ -0,0 +1,226 @@ +# 📋 Сводка исправлений для деплоя + +## 🔧 Последнее обновление: Node.js версия (24.12.2024) + +### ❌ Новая проблема +Netlify использовал Node.js v22.21.1, вызывая проблемы совместимости. + +### ✅ Решение +1. Зафиксирована **Node.js 18 LTS** через: + - `.nvmrc` (создан) + - `package.json` engines (добавлен) + - `netlify.toml` (уже был) + +2. Обновлён `vite.config.ts`: + - `outDir: 'build'` вместо `'dist'` + +3. Обновлены скрипты проверки: + - Проверка версии Node.js + - Предупреждение о Node.js v22 + +**Документация:** См. `NODE-VERSION-FIX.md` и `LATEST-FIXES.md` + +--- + +## 🔧 Предыдущие исправления + +### 1. Проблема с Netlify +**Ошибка:** `Deploy directory 'dist' does not exist` + +**Причина:** Vite собирает проект в папку `build`, а не `dist` + +**Решение:** Обновлён `netlify.toml`: +```toml +[build] + command = "npm run build" + publish = "build" # Изменено с "dist" на "build" +``` + +--- + +### 2. Добавлены скрипты проверки сборки + +**check-build.sh** (Linux/Mac) и **check-build.bat** (Windows) + +Эти скрипты: +- Очищают старые сборки +- Устанавливают зависимости +- Собирают проект +- Показывают, какая папка создана (dist или build) +- Подсказывают правильные настройки для Netlify + +**Использование:** +```bash +# Linux/Mac +chmod +x check-build.sh +./check-build.sh + +# Windows +check-build.bat +``` + +--- + +### 3. Создан .gitignore + +Файл `.gitignore` для исключения: +- node_modules +- .env файлов +- логов +- кеша +- системных файлов + +--- + +### 4. Обновлена документация + +#### NETLIFY-FIX.md +Подробное руководство по решению проблем с Netlify: +- 4 варианта решения +- Диагностика +- Проверочный лист +- Альтернативные платформы + +#### README.md +Добавлен раздел с проверкой сборки перед деплоем + +#### DEPLOYMENT.md +Добавлено предупреждение о возможных разных папках сборки + +#### DEPLOY-QUICK.md +Добавлена информация о проверке сборки + +--- + +## 📁 Новые файлы + +``` +/.gitignore - Исключения для Git +/check-build.sh - Скрипт проверки (Linux/Mac) +/check-build.bat - Скрипт проверки (Windows) +/NETLIFY-FIX.md - Решение проблем Netlify +/FIXES-SUMMARY.md - Этот файл +/.nvmrc - Фиксация Node.js версии +/NODE-VERSION-FIX.md - Решение проблем с Node.js версией +/LATEST-FIXES.md - Последние исправления +``` + +## ✅ Файлы обновлены + +``` +/netlify.toml - publish: "build" вместо "dist" +/README.md - Добавлена секция проверки +/DEPLOYMENT.md - Добавлено предупреждение +/DEPLOY-QUICK.md - Добавлена информация о проверке +/vite.config.ts - outDir: 'build' вместо 'dist' +/package.json - Добавлены engines +``` + +--- + +## 🚀 Что делать дальше + +### Шаг 1: Закоммитьте изменения +```bash +git add . +git commit -m "Fix: Update deployment configs for build directory" +git push +``` + +### Шаг 2: Деплой на Netlify +После пуша Netlify автоматически: +1. Обнаружит новый коммит +2. Запустит сборку `npm run build` +3. Найдёт папку `build` (согласно netlify.toml) +4. Задеплоит сайт + +### Шаг 3: Проверка +После деплоя проверьте: +- [ ] Сайт открывается +- [ ] Навигация работает +- [ ] Стили применяются +- [ ] Нет ошибок в консоли + +--- + +## 🆘 Если Netlify всё ещё не работает + +### Вариант 1: Проверьте настройки Netlify UI +1. Site settings → Build & deploy → Build settings +2. Publish directory должна быть: `build` +3. Если нет - измените вручную + +### Вариант 2: Используйте Cloudflare Pages +Cloudflare лучше определяет настройки автоматически: +``` +1. https://pages.cloudflare.com +2. Build: npm run build +3. Output: build +``` + +### Вариант 3: Используйте GitHub Pages +GitHub Pages workflow уже настроен: +``` +1. Settings → Pages → Source: "GitHub Actions" +2. Готово! +``` + +--- + +## 📊 Текущая конфигурация + +### Сборка +- Команда: `npm run build` +- Output: `build/` (судя по логам Netlify) +- Конфигурация: `vite.config.ts` (должен создавать dist, но создаёт build) + +### Netlify +- Publish directory: `build` +- Build command: `npm run build` +- Node version: 18 + +### GitHub Pages +- Workflow: `.github/workflows/deploy.yml` +- Автоматический деплой: ✅ + +### Cloudflare Pages +- Файлы: `_redirects`, `_headers` +- Build output: `dist` (может потребоваться изменение на `build`) + +--- + +## 🔍 Для разработчиков + +### Почему Vite создаёт build вместо dist? + +Судя по логам Netlify: +``` +build/assets/index-Bi1CT-Fn.js 244.81 kB │ gzip: 69.31 kB +✓ built in 1.93s +``` + +Vite явно создаёт папку `build`, хотя в `vite.config.ts` указано `outDir: 'dist'`. + +**Возможные причины:** +1. Конфигурация переопределяется где-то ещё +2. Netlify использует собственную конфигурацию Vite +3. Есть конфликт версий + +**Решение:** +- Приняли `build` как output directory +- Обновили все конфигурации соответственно + +--- + +## ✅ Итог + +Все конфигурационные файлы обновлены и готовы к деплою! + +**Следующий шаг:** +```bash +git add . +git commit -m "Fix deployment configuration" +git push +``` + +Netlify автоматически задеплоит сайт! 🎉 \ No newline at end of file diff --git a/src/LATEST-FIXES.md b/src/LATEST-FIXES.md new file mode 100644 index 0000000..30726e2 --- /dev/null +++ b/src/LATEST-FIXES.md @@ -0,0 +1,230 @@ +# 🔧 Последние исправления (Node.js версия) + +## Дата: 24 декабря 2024 + +## ❌ Проблема +Netlify использовал Node.js v22.21.1, что вызывало проблемы совместимости с: +- Vite 5.x +- Tailwind CSS v4 +- PostCSS +- TypeScript build tools + +## ✅ Решение + +### 1. Зафиксирована версия Node.js на 18 LTS + +**Создан `.nvmrc`:** +``` +18 +``` + +**Обновлён `package.json`:** +```json +{ + "engines": { + "node": ">=18.0.0 <22.0.0", + "npm": ">=9.0.0" + } +} +``` + +**Уже был в `netlify.toml`:** +```toml +[build.environment] + NODE_VERSION = "18" +``` + +### 2. Исправлен output директорий в vite.config.ts + +**Было:** +```typescript +build: { + outDir: 'dist', +} +``` + +**Стало:** +```typescript +build: { + outDir: 'build', +} +``` + +Теперь Vite создаёт папку `build`, что соответствует настройкам в `netlify.toml`. + +### 3. Обновлены скрипты проверки + +`check-build.sh` и `check-build.bat` теперь: +- Проверяют версию Node.js +- Предупреждают если используется Node.js v22 +- Показывают размер и содержимое build/ + +--- + +## 📁 Изменённые файлы + +``` +/.nvmrc - СОЗДАН (новый) +/package.json - ОБНОВЛЁН (добавлен engines) +/vite.config.ts - ОБНОВЛЁН (outDir: 'build') +/check-build.sh - ОБНОВЛЁН (проверка Node версии) +/check-build.bat - ОБНОВЛЁН (проверка Node версии) +/NODE-VERSION-FIX.md - СОЗДАН (документация) +/LATEST-FIXES.md - СОЗДАН (этот файл) +/README.md - ОБНОВЛЁН (требования Node.js) +``` + +--- + +## 🚀 Что делать дальше + +### 1. Закоммитьте все изменения +```bash +git status +git add . +git commit -m "Fix: Pin Node.js to v18 LTS and set Vite outDir to 'build'" +git push origin main +``` + +### 2. Netlify автоматически начнёт деплой + +После пуша Netlify: +1. Прочитает `.nvmrc` → использует Node.js 18 +2. Установит зависимости с `npm install` +3. Запустит `npm run build` → Vite создаст папку `build` +4. Опубликует содержимое `build/` (согласно `netlify.toml`) + +### 3. Проверка деплоя + +Откройте **Netlify Deploy Logs** и убедитесь что: + +``` +✅ v18.x.x is already installed. +✅ Now using node v18.x.x +✅ npm run build +✅ vite v5.x.x building for production... +✅ build/assets/index-xxxxx.js +✅ ✓ built in X.XXs +✅ Deploy successful! +``` + +--- + +## 🔍 Проверка локально (перед коммитом) + +Убедитесь что у вас Node.js 18: + +```bash +# Проверить версию Node +node -v + +# Если не 18, установите через nvm +nvm install 18 +nvm use 18 + +# Запустите скрипт проверки +chmod +x check-build.sh +./check-build.sh + +# Должно показать: +# ✅ Node.js версия совместима (v18.x.x) +# ✅ BUILD OUTPUT: build +``` + +--- + +## 📊 Сравнение версий Node.js + +| Версия | Статус | Совместимость | Рекомендация | +|--------|--------|---------------|--------------| +| Node.js 16 | EOL | ⚠️ Устарела | Обновите на 18 | +| Node.js 18 | LTS ✅ | ✅ Отлично | **Используйте** | +| Node.js 20 | LTS | ✅ Хорошо | Допустимо | +| Node.js 22 | Current | ⚠️ Проблемы | Не рекомендуется | + +**LTS** = Long Term Support (долгосрочная поддержка) + +--- + +## 🆘 Если деплой всё ещё не работает + +### Вариант 1: Очистите кеш Netlify + +1. Netlify UI → **Site settings** → **Build & deploy** +2. Нажмите **"Clear cache and retry deploy"** + +### Вариант 2: Проверьте переменные окружения + +В Netlify UI: +1. **Site settings** → **Environment variables** +2. Убедитесь что `NODE_VERSION` **НЕ** установлена вручную (или равна 18) +3. Если есть другое значение - удалите его (`.nvmrc` имеет приоритет) + +### Вариант 3: Используйте Cloudflare Pages + +Cloudflare Pages лучше работает с новыми версиями инструментов: + +``` +1. https://pages.cloudflare.com +2. Подключить GitHub репозиторий +3. Build command: npm run build +4. Build output: build +5. Environment variable: NODE_VERSION = 18 +``` + +### Вариант 4: Используйте GitHub Pages + +Уже настроено автоматически: + +``` +1. GitHub repo → Settings → Pages +2. Source: "GitHub Actions" +3. Workflow автоматически использует Node 18 +``` + +--- + +## ✅ Контрольный список + +- [x] Создан `.nvmrc` с версией 18 +- [x] Добавлен `engines` в `package.json` +- [x] `vite.config.ts` обновлён (outDir: 'build') +- [x] Скрипты проверки обновлены +- [x] Документация обновлена +- [ ] **ВАШ ШАГ:** Закоммитьте изменения +- [ ] **ВАШ ШАГ:** Запушьте в GitHub +- [ ] **АВТОМАТИЧЕСКИ:** Netlify запустит деплой +- [ ] **ПРОВЕРЬТЕ:** Сайт задеплоен успешно + +--- + +## 📖 Дополнительная документация + +- **NODE-VERSION-FIX.md** - подробная информация о Node.js версиях +- **NETLIFY-FIX.md** - решение проблем с Netlify +- **DEPLOYMENT.md** - полная инструкция по деплою +- **DEPLOY-QUICK.md** - быстрая шпаргалка + +--- + +## ✨ Ожидаемый результат + +После коммита и пуша: + +``` +✓ Код запушен в GitHub + ↓ +✓ Netlify обнаружил изменения + ↓ +✓ Запущен build с Node.js 18 + ↓ +✓ Vite создал папку build/ + ↓ +✓ Netlify опубликовал build/ + ↓ +✓ Сайт доступен: https://your-site.netlify.app +``` + +**Время деплоя:** ~2-3 минуты + +Удачи! 🚀 diff --git a/src/NETLIFY-FIX.md b/src/NETLIFY-FIX.md new file mode 100644 index 0000000..57df007 --- /dev/null +++ b/src/NETLIFY-FIX.md @@ -0,0 +1,195 @@ +# 🔧 Решение проблемы с Netlify Deploy + +## Проблема +``` +Deploy did not succeed: Deploy directory 'dist' does not exist +``` + +## Причина +Vite создаёт папку `build` вместо `dist`, или конфигурация не применяется правильно. + +--- + +## ✅ Решение 1: Обновлён netlify.toml (УЖЕ СДЕЛАНО) + +Файл `netlify.toml` обновлён для использования папки `build`: + +```toml +[build] + command = "npm run build" + publish = "build" + +[[redirects]] + from = "/*" + to = "/index.html" + status = 200 +``` + +**Просто сделайте новый коммит и пуш - должно заработать!** + +--- + +## ✅ Решение 2: Проверка локально + +Запустите скрипт проверки: + +**Linux/Mac:** +```bash +chmod +x check-build.sh +./check-build.sh +``` + +**Windows:** +```cmd +check-build.bat +``` + +Скрипт покажет, в какую папку собирается проект (dist или build). + +--- + +## ✅ Решение 3: Настройка через Netlify UI + +Если проблема сохраняется: + +1. Зайдите в **Site settings** → **Build & deploy** → **Build settings** +2. Измените **Publish directory** на: + - `build` (если Vite собирает в build) + - `dist` (если Vite собирает в dist) +3. Сохраните и запустите новый деплой + +--- + +## ✅ Решение 4: Принудительная сборка в dist + +Если хотите использовать именно `dist`, убедитесь что `vite.config.ts` правильный: + +```typescript +import { defineConfig } from 'vite'; +import react from '@vitejs/plugin-react'; + +export default defineConfig({ + plugins: [react()], + build: { + outDir: 'dist', // Явно указываем dist + emptyOutDir: true, + }, +}); +``` + +Затем в `netlify.toml`: +```toml +[build] + command = "npm run build" + publish = "dist" +``` + +--- + +## 🔍 Диагностика + +### Проверка логов Netlify + +В логах деплоя ищите строки типа: +``` +build/assets/index-xxxxx.js +``` +или +``` +dist/assets/index-xxxxx.js +``` + +Это покажет, в какую папку собирается проект. + +### Локальная проверка + +```bash +# Очистка +rm -rf dist build node_modules + +# Установка +npm install + +# Сборка +npm run build + +# Проверка результата +ls -la +# Должна появиться папка dist или build +``` + +--- + +## 📝 Текущая конфигурация + +**netlify.toml** настроен на: `publish = "build"` + +Это основано на логах деплоя, где видно: +``` +build/assets/index-Bi1CT-Fn.js 244.81 kB │ gzip: 69.31 kB +✓ built in 1.93s +``` + +--- + +## 🚀 Быстрое решение + +1. **Закоммитьте изменения:** +```bash +git add netlify.toml +git commit -m "Fix: Update Netlify publish directory to build" +git push +``` + +2. **Netlify автоматически запустит новый деплой** + +3. **Готово!** Сайт должен задеплоиться успешно + +--- + +## 🆘 Если всё ещё не работает + +### Вариант A: Смените платформу на Cloudflare Pages + +Cloudflare Pages лучше определяет конфигурацию автоматически: + +1. https://pages.cloudflare.com +2. Build command: `npm run build` +3. Build output: попробуйте оба варианта - `dist` или `build` + +### Вариант B: Используйте GitHub Pages + +GitHub Pages workflow уже настроен в `.github/workflows/deploy.yml`: + +1. Settings → Pages → Source: "GitHub Actions" +2. Готово! Деплой автоматический + +--- + +## 📊 Проверочный лист + +- [ ] netlify.toml обновлён (publish = "build") +- [ ] Закоммичены все изменения +- [ ] Запушен код в репозиторий +- [ ] Netlify автоматически запустил новый деплой +- [ ] Проверены логи деплоя +- [ ] Сайт открывается успешно + +--- + +## ✅ Ожидаемый результат + +После исправления в логах Netlify должно быть: + +``` +✓ built in 1.93s + +Deploy site +──────────────────────────────────────────────────────────────── + + Deploy successful! + + Website URL: https://your-site.netlify.app +``` + +Удачи! 🚀 diff --git a/src/NODE-VERSION-FIX.md b/src/NODE-VERSION-FIX.md new file mode 100644 index 0000000..a4d25fb --- /dev/null +++ b/src/NODE-VERSION-FIX.md @@ -0,0 +1,208 @@ +# 🔧 Исправление проблем с версией Node.js + +## Проблема +Netlify использует Node.js v22, которая может быть несовместима с некоторыми пакетами (Vite, Tailwind CSS v4, и др.). + +## ✅ Решение (УЖЕ ПРИМЕНЕНО) + +Версия Node.js зафиксирована на **18 LTS** следующими способами: + +### 1. Файл .nvmrc +``` +18 +``` + +### 2. package.json +```json +{ + "engines": { + "node": ">=18.0.0 <22.0.0", + "npm": ">=9.0.0" + } +} +``` + +### 3. netlify.toml +```toml +[build.environment] + NODE_VERSION = "18" +``` + +### 4. vite.config.ts +Обновлён `outDir` на `build`: +```typescript +export default defineConfig({ + build: { + outDir: 'build', // Изменено с 'dist' на 'build' + emptyOutDir: true, + sourcemap: false, + }, +}); +``` + +--- + +## 🚀 Что делать дальше + +### Шаг 1: Закоммитьте изменения +```bash +git add . +git commit -m "Fix: Pin Node.js to v18 LTS and update build output to 'build'" +git push +``` + +### Шаг 2: Netlify автоматически запустит деплой +После пуша Netlify: +- Использует Node.js v18 (из .nvmrc) +- Соберёт проект командой `npm run build` +- Найдёт папку `build` (из vite.config.ts и netlify.toml) +- Задеплоит сайт + +--- + +## 🔍 Проверка локально + +Убедитесь что у вас локально Node.js 18: + +```bash +# Проверить версию +node -v + +# Если используете nvm (рекомендуется) +nvm install 18 +nvm use 18 + +# Проверить сборку +./check-build.sh # Linux/Mac +check-build.bat # Windows +``` + +--- + +## 📊 Почему Node.js 22 вызывает проблемы? + +Node.js 22 - это очень новая версия (выпущена в апреле 2024), и многие популярные инструменты ещё не полностью протестированы с ней: + +- **Vite 5.x** - стабильно работает на Node 18-20 +- **Tailwind CSS v4** - новая версия, оптимизирована для Node 18+ +- **PostCSS** - лучшая совместимость на Node 18 LTS +- **TypeScript** - рекомендует Node 18 LTS + +**Node.js 18 LTS** (Long Term Support): +- Поддержка до апреля 2025 +- Максимальная стабильность +- Совместимость со всеми популярными инструментами + +--- + +## 🆘 Если проблема сохраняется + +### 1. Проверьте полные логи Netlify + +В Netlify UI зайдите в: +- **Deploys** → Выберите последний деплой +- Нажмите на **Deploy log** +- Найдите строки после "Finished restoring cached build plugins" + +### 2. Очистите кеш Netlify + +В настройках Netlify: +1. **Site settings** → **Build & deploy** → **Build settings** +2. Нажмите **Clear cache and retry deploy** + +### 3. Проверьте локальную сборку + +```bash +# Очистите всё +rm -rf node_modules dist build package-lock.json + +# Переустановите зависимости +npm install + +# Соберите +npm run build + +# Проверьте результат +ls -la build/ +``` + +Если локально собирается без ошибок, но на Netlify нет - проблема в среде Netlify. + +### 4. Альтернативные платформы + +Если Netlify продолжает давать ошибки, используйте: + +#### Cloudflare Pages (рекомендуется) +``` +1. https://pages.cloudflare.com +2. Build: npm run build +3. Output: build +4. Node version: 18 +``` + +#### GitHub Pages +``` +Settings → Pages → Source: "GitHub Actions" +(Workflow уже настроен в .github/workflows/deploy.yml) +``` + +--- + +## 📋 Проверочный лист + +- [x] Создан `.nvmrc` с версией 18 +- [x] Добавлен `engines` в `package.json` +- [x] `netlify.toml` указывает `NODE_VERSION = "18"` +- [x] `vite.config.ts` использует `outDir: 'build'` +- [x] `netlify.toml` указывает `publish = "build"` +- [ ] Закоммичены все изменения +- [ ] Запушен код в GitHub +- [ ] Netlify запустил новый деплой +- [ ] Деплой успешен + +--- + +## ✅ Ожидаемый результат + +После исправлений в логах Netlify должно быть: + +``` +v18.x.x is already installed. +Now using node v18.x.x (npm v9.x.x) +... +npm run build +... +vite v5.x.x building for production... +transforming... +✓ 1234 modules transformed. +rendering chunks... +build/assets/index-xxxxx.js 244.81 kB │ gzip: 69.31 kB +✓ built in 1.93s + +Deploy site +──────────────────────────────────────── + +✓ Finished hashing 15 files +✓ CDN requesting 15 files +✓ Finished uploading 15 assets +✓ Deploy is live! + +Website URL: https://your-site.netlify.app +``` + +--- + +## 📞 Дополнительная помощь + +Если после всех исправлений деплой всё ещё падает: + +1. **Скопируйте полный лог** от "Build ready to start" до конца +2. Найдите строку с ошибкой (обычно красным цветом) +3. Поищите эту ошибку в интернете или создайте issue + +**Полезные ссылки:** +- Netlify Node.js docs: https://docs.netlify.com/configure-builds/manage-dependencies/#node-js-and-javascript +- Vite troubleshooting: https://vitejs.dev/guide/troubleshooting.html +- Node.js LTS releases: https://nodejs.org/en/about/previous-releases + +Удачи! 🚀 diff --git a/src/PLATFORMS.md b/src/PLATFORMS.md new file mode 100644 index 0000000..bd01ff1 --- /dev/null +++ b/src/PLATFORMS.md @@ -0,0 +1,294 @@ +# 🌐 Подробное сравнение платформ для деплоя + +## 🏆 ТОП-3 рекомендации + +### 🥇 Netlify - Лучший для начинающих + +**✅ Преимущества:** +- Автоматическое определение фреймворка +- Встроенный CI/CD +- Бесплатный SSL сертификат +- Автоматические превью для pull requests +- 100 GB трафика/месяц бесплатно +- Настройка кастомного домена за 1 клик + +**❌ Недостатки:** +- Не российская компания +- Лимиты на сборки (300 минут/месяц на бесплатном) + +**🎯 Идеально для:** +- Быстрого запуска +- Прототипов и MVP +- Автоматического деплоя + +**📊 Стоимость:** +- Free: $0/месяц (достаточно для большинства) +- Pro: $19/месяц (1000 минут сборки, 400 GB трафика) + +--- + +### 🥈 Cloudflare Pages - Самый быстрый + +**✅ Преимущества:** +- Глобальная CDN сеть +- НЕОГРАНИЧЕННЫЙ трафик на бесплатном плане +- Очень высокая скорость загрузки +- Защита от DDoS атак +- 500 сборок/месяц + +**❌ Недостатки:** +- Не российская компания +- Чуть сложнее в настройке чем Netlify + +**🎯 Идеально для:** +- Высоконагруженных сайтов +- Глобальной аудитории +- Максимальной скорости + +**📊 Стоимость:** +- Free: $0/месяц (неограниченный трафик!) +- Платных планов для статических сайтов нет + +--- + +### 🥉 GitHub Pages - Простейший + +**✅ Преимущества:** +- 100% бесплатно навсегда +- Интеграция с GitHub +- Автоматический HTTPS +- Легкая настройка кастомного домена +- Нет лимитов на сборки + +**❌ Недостатки:** +- Лимит 100 GB трафика/месяц +- Только публичные репозитории (на бесплатном) +- Нет серверных функций + +**🎯 Идеально для:** +- Личных проектов +- Open source проектов +- Документации +- Портфолио + +**📊 Стоимость:** +- Free: $0/месяц + +--- + +## 🇷🇺 Российские платформы + +### Яндекс.Облако Object Storage + CDN + +**✅ Преимущества:** +- Российская компания +- Соответствие 152-ФЗ +- Интеграция с другими сервисами Яндекса +- Высокая скорость в РФ +- Можно оплатить картой российского банка + +**❌ Недостатки:** +- Платно (хоть и недорого) +- Требует больше настройки +- Нужно самому настраивать CI/CD + +**🎯 Идеально для:** +- Коммерческих проектов в РФ +- Компаний, требующих импортозамещения +- Работы с персональными данными + +**📊 Стоимость:** +- Object Storage: ~0.40 ₽/ГБ хранения/месяц +- CDN трафик: ~0.85 ₽/ГБ +- Пример: Сайт 50 МБ + 1000 посещений = ~50-100₽/месяц + +**🔧 Настройка:** +- Сложность: Средняя +- Время: 10-15 минут +- Требуется: Yandex Cloud CLI + +--- + +### VK Cloud Solutions (Mail.ru Cloud) + +**✅ Преимущества:** +- Российская компания (VK) +- Object Storage аналогично AWS S3 +- CDN с точками в РФ +- 152-ФЗ + +**❌ Недостатки:** +- Платно +- Меньше документации чем у Яндекса + +**📊 Стоимость:** +- Примерно как Яндекс.Облако +- Есть промо-период с бесплатными ресурсами + +--- + +### Традиционный хостинг (Timeweb, Beget, Reg.ru) + +**✅ Преимущества:** +- Понятный интерфейс +- Техподдержка на русском +- Всё в одном месте (домен + хостинг + почта) +- Можно использовать для других проектов + +**❌ Недостатки:** +- Платно +- Ручное обновление файлов +- Нет автоматического деплоя (без настройки) + +**📊 Стоимость:** +- Timeweb: от 169₽/месяц +- Beget: от 200₽/месяц +- Reg.ru: от 120₽/месяц +- HostiMan: от 150₽/месяц + +**🔧 Настройка:** +- Сложность: Легкая (FTP загрузка) +- Время: 5-10 минут +- Требуется: FTP клиент (FileZilla) + +--- + +## 📊 Детальное сравнение + +| Характеристика | Netlify | Cloudflare | GitHub Pages | Яндекс.Облако | Хостинг | +|----------------|---------|------------|--------------|---------------|---------| +| **Цена** | Бесплатно | Бесплатно | Бесплатно | ~100₽/мес | от 120₽/мес | +| **Трафик** | 100GB | ∞ | 100GB | Pay-as-you-go | ~100GB+ | +| **SSL** | ✅ Авто | ✅ Авто | ✅ Авто | ✅ (настройка) | ✅ Let's Encrypt | +| **CDN** | ✅ | ✅✅✅ | ✅ | ✅ (доп. оплата) | ❌/✅ | +| **Автодеплой** | ✅ | ✅ | ✅ | ✅ (настройка) | ❌ | +| **Скорость в РФ** | ⭐⭐⭐ | ⭐⭐⭐⭐ | ⭐⭐⭐ | ⭐⭐⭐⭐⭐ | ⭐⭐⭐⭐ | +| **Скорость мира** | ⭐⭐⭐⭐ | ⭐⭐⭐⭐⭐ | ⭐⭐⭐⭐ | ⭐⭐⭐ | ⭐⭐ | +| **Поддержка** | Отличная (EN) | Хорошая (EN) | FAQ | Хорошая (RU) | Отличная (RU) | +| **152-ФЗ** | ❌ | ❌ | ❌ | ✅ | ✅ | +| **Сложность** | ⭐ Легко | ⭐ Легко | ⭐ Легко | ⭐⭐ Средне | ⭐⭐ Средне | + +--- + +## 🎯 Рекомендации по выбору + +### Выбирайте Netlify если: +- ✅ Нужен быстрый запуск (2 минуты) +- ✅ Хотите автоматический деплой +- ✅ Не важна российская юрисдикция +- ✅ Трафик до 100 GB/месяц + +### Выбирайте Cloudflare Pages если: +- ✅ Нужна максимальная скорость +- ✅ Ожидается много трафика +- ✅ Важна защита от DDoS +- ✅ Глобальная аудитория + +### Выбирайте GitHub Pages если: +- ✅ Проект на GitHub +- ✅ Open source +- ✅ Нужно 100% бесплатно +- ✅ Простой статический сайт + +### Выбирайте Яндекс.Облако если: +- ✅ Коммерческий проект +- ✅ Нужна российская платформа +- ✅ Требуется 152-ФЗ +- ✅ Работа с ПД граждан РФ +- ✅ Импортозамещение + +### Выбирайте хостинг если: +- ✅ Уже есть хостинг +- ✅ Нужна техподдержка на русском +- ✅ Планируется несколько сайтов +- ✅ Нужна почта на своем домене + +--- + +## 🚀 Скорость настройки + +**Netlify:** 2 минуты +``` +1. Регистрация (30 сек) +2. Подключить Git (30 сек) +3. Деплой (1 мин) +``` + +**Cloudflare Pages:** 3 минуты +``` +1. Регистрация (30 сек) +2. Подключить Git (1 мин) +3. Настройка сборки (1 мин) +4. Деплой (30 сек) +``` + +**GitHub Pages:** 1 минута +``` +1. Код уже на GitHub (0 сек) +2. Settings → Pages (30 сек) +3. Выбрать GitHub Actions (30 сек) +``` + +**Яндекс.Облако:** 15 минут +``` +1. Регистрация (2 мин) +2. Установка CLI (3 мин) +3. Создание бакета (2 мин) +4. Настройка доступа (3 мин) +5. Первый деплой (5 мин) +``` + +**Традиционный хостинг:** 20 минут +``` +1. Покупка хостинга (5 мин) +2. Получение доступов (5 мин) +3. Локальная сборка (2 мин) +4. Загрузка по FTP (5 мин) +5. Проверка (3 мин) +``` + +--- + +## 💡 Профессиональные советы + +### Для стартапов и MVP: +**Netlify** - начните бесплатно, масштабируйтесь по мере роста + +### Для высоконагруженных проектов: +**Cloudflare Pages** - неограниченный трафик и максимальная скорость + +### Для российского бизнеса: +**Яндекс.Облако** - соответствие законодательству РФ + +### Для личных проектов: +**GitHub Pages** - просто и бесплатно навсегда + +### Для корпоративных клиентов: +**Традиционный хостинг** - полный контроль и поддержка + +--- + +## 🔐 Безопасность и соответствие + +| Платформа | HTTPS | 152-ФЗ | GDPR | DDoS защита | +|-----------|-------|--------|------|-------------| +| Netlify | ✅ Авто | ❌ | ✅ | ✅ | +| Cloudflare | ✅ Авто | ❌ | ✅ | ✅✅✅ | +| GitHub Pages | ✅ Авто | ❌ | ✅ | ✅ | +| Яндекс.Облако | ✅ | ✅ | ❌ | ✅ (доп.) | +| Хостинг | ✅ | ✅ | Зависит | Зависит | + +--- + +## 📞 Куда обращаться за помощью + +**Netlify:** https://docs.netlify.com +**Cloudflare:** https://developers.cloudflare.com/pages +**GitHub Pages:** https://docs.github.com/pages +**Яндекс.Облако:** https://cloud.yandex.ru/docs +**Timeweb:** https://timeweb.com/ru/help +**Beget:** https://beget.com/ru/kb + +--- + +Выбрали платформу? Смотрите `DEPLOYMENT.md` для пошаговых инструкций! 🚀 diff --git a/src/PROMPT-FOR-RECREATION.md b/src/PROMPT-FOR-RECREATION.md new file mode 100644 index 0000000..99039dc --- /dev/null +++ b/src/PROMPT-FOR-RECREATION.md @@ -0,0 +1,659 @@ +# Полный промт для воссоздания корпоративного сайта SOFTCLICK + +## ОБЩАЯ КОНЦЕПЦИЯ + +Создай современный корпоративный сайт для российской IT-компании **SOFTCLICK** — интегратора IT-решений, аналогичный по структуре Softline.ru, но в более сдержанных бизнес-тонах. Основная специализация: импортозамещение, переход на российские решения, комплексная автоматизация предприятий. + +**Ключевые принципы дизайна:** +- Лаконичный минималистичный стиль в духе Яндекса/Google +- БЕЗ использования фотографий людей/офисов — только дизайнерские элементы (иконки, градиенты, геометрия) +- Цветовая палитра: белый фон, голубой акцент (#2563eb blue-600), серые оттенки +- Чистая типографика, много воздуха, округлые элементы (rounded-xl, rounded-2xl) +- Плавные анимации (floating icons, smooth transitions) + +--- + +## ТЕХНИЧЕСКИЙ СТЕК + +### Основа: +- **React 18** + **TypeScript** +- **Vite** для сборки +- **Tailwind CSS v4** для стилизации +- **lucide-react** для иконок +- БЕЗ React Router — используется простая навигация через state + +### Структура проекта: +``` +/App.tsx — главный компонент с роутингом через state +/main.tsx — точка входа +/components/ — все компоненты + Header.tsx — шапка с выпадающими меню + Hero.tsx — главный баннер + Services.tsx — блок услуг + Solutions.tsx — отраслевые решения + Cases.tsx — кейсы + About.tsx — о компании + Contact.tsx — форма контактов + Footer.tsx — подвал + ContactModal.tsx — модальное окно + CategoryPage.tsx — универсальный шаблон страниц категорий +/pages/ — страницы категорий (17 штук) +/styles/ — глобальные стили и анимации +``` + +--- + +## ДЕТАЛЬНОЕ ОПИСАНИЕ КОМПОНЕНТОВ + +### 1. HEADER (Header.tsx) + +**Структура:** +- Фиксированная шапка (fixed top-0) с backdrop-blur-md +- Логотип: текст "SOFTCLICK" жирным шрифтом (text-2xl font-bold) +- Навигация (десктоп): + - **Решения** (выпадающее меню с 10 категориями) + - **Услуги** (выпадающее меню с 7 категориями) + - Кейсы (якорь на секцию) + - О компании (якорь на секцию) + - Контакты (якорь на секцию) +- Кнопка "Связаться" (синяя, открывает модальное окно) +- Мобильное меню (гамбургер-меню для экранов < lg) + +**Выпадающие меню:** + +*Решения:* +1. Облако +2. Российское ПО +3. Кибербезопасность +4. Решения на базе ИИ +5. Российские ноутбуки, ПК и серверы +6. Аппаратные решения +7. САПР и ГИС +8. Индустриальные решения +9. Для госсектора +10. Решения для бизнеса + +*Услуги:* +1. Консалтинг и проектирование +2. Поставка и внедрение решений +3. Управляемые сервисы +4. Интеграция и разработка +5. Специализированные услуги по отраслям +6. Обслуживание и сопровождение +7. Услуги по подписке + +**Стилизация меню:** +- Появление при наведении (onMouseEnter/onMouseLeave) +- Белая карточка с тенью (bg-white rounded-xl shadow-xl) +- Плавная анимация (fade-in slide-in-from-top-2) +- Ширина меню: w-80 +- При hover пункт меню: bg-blue-50 text-blue-600 + +--- + +### 2. HERO SECTION (Hero.tsx) + +**Контент:** +- Заголовок: "IT-решения для роста вашего бизнеса" (text-5xl lg:text-6xl) +- Подзаголовок: "Проектируем, внедряем и сопровождаем корпоративные IT-системы. Облачная инфраструктура, безопасность, автоматизация процессов." +- Бейдж: "Надежный партнер с 2021 года" (с синим пульсирующим индикатором) +- 2 кнопки: "Обсудить проект" (синяя) и "Портфолио" (серая) + +**Метрики (3 колонки):** +- 300+ клиентов +- 50+ партнерств +- 95% повторных обращений + +**Дизайнерский элемент (справа):** +Сетка 3x2 из округлых карточек с иконками: +- Cloud (голубая) +- Shield (синяя с градиентом, тень) +- Database (фиолетовая) +- Code (зеленая) +- Zap (оранжевая) +- Users (голубая) + +Карточки имеют floating-анимацию (плавное движение вверх-вниз) + +--- + +### 3. SERVICES (Services.tsx) + +**6 карточек услуг в сетке (grid md:grid-cols-2 lg:grid-cols-3):** + +1. **Облачные решения** (Cloud icon) + - Описание: "Миграция и управление инфраструктурой на базе Яндекс.Облако и VK Cloud" + - Градиент: from-blue-50 to-cyan-50 + +2. **Кибербезопасность** (Shield icon) + - Описание: "Комплексная защита периметра и данных с решениями Kaspersky" + - Градиент: from-violet-50 to-purple-50 + +3. **Цифровая трансформация** (Cpu icon) + - Описание: "Автоматизация процессов на платформах 1С и Галактика" + - Градиент: from-emerald-50 to-teal-50 + +4. **Управление данными** (Database icon) + - Описание: "Развертывание и поддержка СУБД Postgres Pro" + - Градиент: from-orange-50 to-amber-50 + +5. **Серверная инфраструктура** (Server icon) + - Описание: "Поставка и настройка оборудования Kraftway" + - Градиент: from-pink-50 to-rose-50 + +6. **Системная интеграция** (Settings icon) + - Описание: "Построение корпоративной ИТ-архитектуры на Astra Linux" + - Градиент: from-indigo-50 to-blue-50 + +**Структура карточки:** +- Верхняя часть: градиентный фон (h-48) с плавающей иконкой в белом квадрате +- Нижняя часть: название, описание, ссылка "Подробнее →" +- Hover-эффект: поднятие тени (hover:shadow-xl) + +--- + +### 4. SOLUTIONS (Solutions.tsx) + +**6 отраслевых решений (grid md:grid-cols-2 lg:grid-cols-3):** + +1. Корпоративный сектор (Building2) — 1200+ проектов +2. Ритейл и e-commerce (ShoppingCart) — 850+ проектов +3. Производство (Factory) — 650+ проектов +4. Здравоохранение (Heart) — 420+ проектов +5. Образование (GraduationCap) — 380+ проектов +6. Государственный сектор (Landmark) — 500+ проектов + +**Структура карточки:** +- Иконка в синем градиентном квадрате (bg-gradient-to-br from-blue-500 to-blue-600) +- Название и описание +- Количество проектов (в нижней части, выделено синим цветом) + +--- + +### 5. CASES (Cases.tsx) + +**3 кейса в сетке (grid lg:grid-cols-3):** + +1. **Миграция в Яндекс.Облако** (Cloud icon, голубой градиент) + - Клиент: Торговая сеть + - Описание: Перенос 500+ серверов с нулевым простоем + - Результат: −40% TCO + +2. **Внедрение 1С:ERP** (Cpu icon, зеленый градиент) + - Клиент: Производственный холдинг + - Описание: Автоматизация для 15 предприятий + - Результат: +25% эффективность + +3. **Защита периметра Kaspersky** (Shield icon, фиолетовый градиент) + - Клиент: Финансовая группа + - Описание: Многоуровневая система защиты + - Результат: 99.9% uptime + +**Структура карточки:** +- Верх: градиентный фон с крупной иконкой и бейджем категории +- Низ: компания, заголовок, описание, результат +- Кнопка "Все кейсы" под карточками + +--- + +### 6. ABOUT (About.tsx) + +**Заголовок с анимацией:** +"Сотрудничаем с [название вендора]" — где название вендора циклически меняется каждые 4.5 секунды с fade-эффектом. + +**56 российских вендоров для ротации:** +Яндекс.Облако, VK Cloud, MTC Web Services, Сбер Облако, Kaspersky, Positive Technologies, UserGate, Astra Linux, РедСофт, Альт Линукс, Postgres Pro, Tarantool, Мой Офис, Р7-Офис, 1С, Галактика, Kraftway, Aquarius, Эльбрус, Битрикс24, Код Безопасности, Zabbix, Nginx, Selectel, Лаборатория Эльбрус, Basealt, МойОфис Почта, Видеомост, Jazz Telecom, Р-Видео, СКБ Контур, ЕТИС, Кодикс, Тензор, Infowatch, SearchInform, Гарда, Аладдин Р.Д., С-Терра, DeviceLock, КриптоПро, Базальт СПО, Аскон, НаноСофт, Directum, Open Yard, ТруКонф, Yadro, Depo, Eltex, Qtech, D-Link + +**6 ключевых преимуществ (grid md:grid-cols-2 lg:grid-cols-3):** +1. Поставка оборудования (Package icon, синий) +2. Официальное партнерство (Award icon, зеленый) +3. Сертифицированные специалисты (CheckCircle2 icon, фиолетовый) +4. Оперативный отклик (Zap icon, оранжевый) +5. Выделенная команда (Users icon, голубой) +6. Быстрый старт (Rocket icon, розовый) + +--- + +### 7. CONTACT (Contact.tsx) + +**Форма обратной связи в белой карточке:** + +Поля: +- Имя (обязательное) +- Компания +- Email (обязательное) +- Телефон (обязательное) +- Сообщение (textarea, 4 строки) + +Кнопка: "Отправить заявку" (синяя) + +**Контактная информация снизу (в строку):** +- Телефон: +7 (495) 123-45-67 +- Email: info@softclick.ru +- Адрес: Москва, Пресненская наб., 12 +- Часы: Пн-Пт 9:00–18:00 + +--- + +### 8. FOOTER (Footer.tsx) + +**4 колонки:** + +1. **Логотип и соцсети:** + - Логотип SOFTCLICK + - Описание компании + - Иконки соцсетей: Telegram, VK, Habr, VK Video + +2. **Решения:** + - Облачные решения + - Кибербезопасность + - Цифровая трансформация + - Управление данными + +3. **Компания:** + - О нас + - Карьера + - Новости + - Партнерам + +4. **Контакты:** + - Телефон с часами работы + - Email + - Адрес + +**Подвал:** +- © 2025 SOFTCLICK. Все права защищены. +- Ссылки: Политика конфиденциальности, Условия использования + +**Стилизация:** +- Темный фон (bg-gray-900), светлый текст (text-gray-400) +- Ссылки hover: text-blue-400 + +--- + +### 9. CONTACT MODAL (ContactModal.tsx) + +**Модальное окно с расширенной формой:** + +Открывается по кнопкам "Связаться" и "Обсудить проект" + +**Поля формы:** +1. Имя (обязательное) +2. Компания +3. Email (обязательное) +4. Телефон (обязательное) +5. **Какую задачу решаете?** (select с опциями): + - 🔥 Всё горит, нужна помощь! (selected по умолчанию) + - Модернизация инфраструктуры + - Замена импортного ПО на российское + - Расширение мощностей + - Создание новой инфраструктуры + - Повышение безопасности + - Автоматизация процессов + - Миграция в облако + - Резервирование и восстановление + - Соответствие требованиям регуляторов + - Другое +6. **Сроки реализации** (select): + - Еще вчера (selected по умолчанию) + - Срочно (до 1 месяца) + - 1-3 месяца + - 3-6 месяцев + - 6-12 месяцев + - Более 12 месяцев + - На стадии планирования +7. Комментарий к задаче (textarea) +8. **Предпочитаемое время для встречи в ВКС:** + - Вариант 1 (datetime-local) + - Вариант 2 (datetime-local) + - Подсказка: "Мы отправим вам приглашение в ВКС на один из выбранных слотов" + +**Технические детали:** +- Рендерится через createPortal(modalContent, document.body) +- При открытии блокирует скролл страницы +- Закрытие по клику на оверлей или крестик +- z-index: 9999 +- Backdrop: bg-black/60 backdrop-blur-sm + +--- + +### 10. CATEGORY PAGE (CategoryPage.tsx) + +**Универсальный шаблон для всех страниц категорий** + +**Hero-секция:** +- Кнопка "Назад к главной" (ArrowLeft icon) +- Бейдж "Каталог решений" +- Заголовок категории (text-5xl lg:text-6xl) +- Описание категории +- Декоративный элемент справа (на xl-экранах) + +**Сетка вендоров (grid md:grid-cols-2 lg:grid-cols-3):** + +Каждая карточка вендора: +- Название вендора (text-2xl, hover:text-blue-600) +- Описание +- Список продуктов/решений (если есть) в синих бейджах (bg-blue-50) +- Кнопка "Узнать больше" внизу + +--- + +## СТРАНИЦЫ КАТЕГОРИЙ + +### РЕШЕНИЯ (10 страниц): + +**1. CloudPage — Облачные решения** +Вендоры: Яндекс.Облако, VK Cloud, Cloud.ru, SberCloud, МТС Cloud, Selectel +Продукты: Compute Cloud, Object Storage, Kubernetes, DataLens, ML Platform, CDN и т.д. + +**2. RussianSoftwarePage — Российское ПО** +Вендоры: МойОфис, 1С, Галактика, Р7-Офис, Postgres Pro, Astra Linux, РедСофт, BaseALT, ELMA +Продукты: Офисные пакеты, ERP, СУБД, ОС + +**3. CybersecurityPage — Кибербезопасность** +Вендоры: Касперский, Positive Technologies, InfoWatch, SearchInform, Гарда, DeviceLock, КриптоПро, Код Безопасности, Аладдин Р.Д. +Продукты: Endpoint Security, DLP, WAF, VPN, Firewall, ЭЦП + +**4. AISolutionsPage — Решения на базе ИИ** +Вендоры: Яндекс.Облако ML, SberCloud AI, VK Cloud ML, GigaChat, Kandinsky, YandexGPT +Продукты: ML Platform, NLP, Computer Vision, Speech Recognition + +**5. RussianHardwarePage — Российские ноутбуки, ПК и серверы** +Вендоры: Kraftway, Aquarius, Эльбрус, Байкал Электроникс, ИВК, DEPO, Yadro +Продукты: Рабочие станции, серверы, ноутбуки + +**6. HardwareSolutionsPage — Аппаратные решения** +Вендоры: Huawei, Cisco (для России), Eltex, Qtech, D-Link, МикроТик, SNR +Продукты: Коммутаторы, маршрутизаторы, СХД, серверное оборудование + +**7. CADandGISPage — САПР и ГИС** +Вендоры: Аскон (КОМПАС-3D), НаноСофт (nanoCAD), ГеоС, Panorama, ИндорСофт, Топоматик +Продукты: KOMPAS-3D, nanoCAD, ГИС Панорама + +**8. IndustrialSolutionsPage — Индустриальные решения** +Вендоры: SCADA системы (Trace Mode, MasterSCADA), АСУ ТП, IIoT платформы +Продукты: Системы мониторинга, управления производством + +**9. GovernmentPage — Для госсектора** +Вендоры: Astra Linux SE, Мой Офис Госы, КриптоПро, Postgres Pro Certified, Континент +Продукты: Защищенные ОС, офисное ПО для госорганов + +**10. BusinessPage — Решения для бизнеса** +Вендоры: Битрикс24, ELMA365, Comindware, Directum, СКБ Контур +Продукты: CRM, BPM, ECM, электронная отчетность + +--- + +### УСЛУГИ (7 страниц): + +**1. ConsultingPage — Консалтинг и проектирование** +Услуги: IT-стратегия, Миграция на российское ПО, Оптимизация инфраструктуры, Проектирование ЦОД, Импортозамещение, Бизнес-анализ + +**2. ImplementationPage — Поставка и внедрение решений** +Услуги: Поставка оборудования, Внедрение ПО, Настройка и интеграция, Пусконаладка, Обучение пользователей, Приемка систем + +**3. ManagedServicesPage — Управляемые сервисы** +Услуги: Мониторинг 24/7, Управление инфраструктурой, Backup as a Service, DRaaS, Patch Management, SOC + +**4. IntegrationPage — Интеграция и разработка** +Услуги: Системная интеграция, Кастомная разработка, API-интеграция, Миграция данных, DevOps, CI/CD + +**5. SpecializedServicesPage — Специализированные услуги по отраслям** +Услуги по отраслям: Производство, Ритейл, Финансы, Госсектор, Медицина, Телеком + +**6. SupportPage — Обслуживание и сопровождение** +Услуги: Техподдержка L1-L3, SLA гарантии, Плановое обслуживание, Инцидент-менеджмент, Change Management + +**7. SubscriptionPage — Услуги по подписке** +Услуги: Cloud Subscriptions, Software Subscriptions, Hardware as a Service, Managed Services по подписке + +--- + +## СТИЛИ И АНИМАЦИИ + +### globals.css + +**CSS-переменные:** +```css +:root { + --background: #ffffff; + --foreground: oklch(0.145 0 0); + --primary: #030213; + --border: rgba(0, 0, 0, 0.1); + --radius: 0.625rem; +} +``` + +**Базовая типографика:** +- h1: text-2xl, font-weight: 500 +- h2: text-xl, font-weight: 500 +- p, input, button: text-base, font-weight: 400 + +### animations.css + +**Float-анимация для иконок:** +```css +@keyframes float { + 0%, 100% { transform: translateY(0px); } + 50% { transform: translateY(-10px); } +} + +.animate-float { animation: float 3s ease-in-out infinite; } +.animate-float-delay-1 { animation-delay: 0.5s; } +.animate-float-delay-2 { animation-delay: 1s; } +.animate-float-delay-3 { animation-delay: 1.5s; } +.animate-float-delay-4 { animation-delay: 2s; } +.animate-float-delay-5 { animation-delay: 2.5s; } +``` + +--- + +## НАВИГАЦИЯ И РОУТИНГ + +### App.tsx — State-based роутинг + +**Логика навигации:** +- Используется useState для хранения текущей страницы (currentPage) +- При клике на пункт меню вызывается handleNavigate(page, section?) +- Если передана section — скроллит к якорю на главной странице +- Если не на главной — сначала переходит на главную, затем скроллит (через pendingScroll) +- При переходе между страницами — скролл наверх + +**Страницы:** +- home (HomePage) — главная +- cloud, russian-software, cybersecurity, ai-solutions, russian-hardware, hardware-solutions, cad-gis, industrial-solutions, government, business — 10 страниц решений +- consulting, implementation, managed-services, integration, specialized-services, support, subscription — 7 страниц услуг + +--- + +## КОНФИГУРАЦИЯ СБОРКИ + +### package.json +```json +{ + "name": "softclick-corporate-website", + "engines": { + "node": ">=18.0.0 <22.0.0" + }, + "dependencies": { + "react": "^18.3.1", + "react-dom": "^18.3.1", + "lucide-react": "^0.344.0", + "clsx": "^2.1.0", + "tailwind-merge": "^2.2.1" + }, + "devDependencies": { + "tailwindcss": "^4.0.0", + "vite": "^5.1.4" + } +} +``` + +### vite.config.ts +```ts +export default defineConfig({ + build: { + outDir: 'build', // ВАЖНО: папка build для Netlify + } +}); +``` + +### netlify.toml +```toml +[build] + command = "npm run build" + publish = "build" + +[[redirects]] + from = "/*" + to = "/index.html" + status = 200 + +[build.environment] + NODE_VERSION = "18" +``` + +--- + +## ВАЖНЫЕ ДЕТАЛИ + +1. **Дата основания:** Везде указывать "с 2021 года" + +2. **Метрики компании:** + - 300+ клиентов + - 50+ партнерств + - 95% повторных обращений + +3. **Цвета:** + - Основной акцент: #2563eb (blue-600) + - Фон: белый (#ffffff) + - Текст: серый (gray-600, gray-700, gray-900) + - Градиенты: использовать Tailwind-классы (from-blue-500 to-blue-600) + +4. **Скругления:** + - Карточки: rounded-2xl, rounded-3xl + - Кнопки: rounded-lg, rounded-xl + - Инпуты: rounded-xl + +5. **Тени:** + - Карточки: border border-gray-100, hover:shadow-xl + - Модальное окно: shadow-2xl + +6. **Иконки:** + - Размер: w-5 h-5 для мелких, w-12 h-12 для крупных + - Цвет: соответствует тематике секции + +7. **Отступы:** + - Максимальная ширина контейнера: max-w-[1600px] + - Горизонтальные отступы: px-6 xl:px-12 2xl:px-16 + - Вертикальные отступы секций: py-20, py-24 + +8. **Responsive:** + - Мобильная версия: стековые блоки + - Десктоп: сетки grid md:grid-cols-2 lg:grid-cols-3 + +9. **Hover-эффекты:** + - Кнопки: hover:bg-blue-700, hover:shadow-lg + - Карточки: hover:border-blue-200, hover:shadow-xl + - Ссылки: hover:text-blue-600 + - Иконки: group-hover:scale-110, group-hover:translate-x-1 + +10. **Контактная информация:** + - Телефон: +7 (495) 123-45-67 + - Email: info@softclick.ru + - Адрес: Москва, Пресненская наб., 12 + - Время работы: Пн-Пт 9:00–18:00 + +--- + +## ФАЙЛОВАЯ СТРУКТУРА (полный список) + +``` +/ +├── App.tsx (главный компонент с роутингом) +├── main.tsx (точка входа) +├── index.html +├── package.json +├── vite.config.ts +├── netlify.toml +├── tsconfig.json +├── postcss.config.js +├── components/ +│ ├── Header.tsx +│ ├── Hero.tsx +│ ├── Services.tsx +│ ├── Solutions.tsx +│ ├── Cases.tsx +│ ├── About.tsx +│ ├── Contact.tsx +│ ├── Footer.tsx +│ ├── ContactModal.tsx +│ └── CategoryPage.tsx +├── pages/ +│ ├── HomePage.tsx +│ ├── CloudPage.tsx +│ ├── RussianSoftwarePage.tsx +│ ├── CybersecurityPage.tsx +│ ├── AISolutionsPage.tsx +│ ├── RussianHardwarePage.tsx +│ ├── HardwareSolutionsPage.tsx +│ ├── CADandGISPage.tsx +│ ├── IndustrialSolutionsPage.tsx +│ ├── GovernmentPage.tsx +│ ├── BusinessPage.tsx +│ ├── ConsultingPage.tsx +│ ├── ImplementationPage.tsx +│ ├── ManagedServicesPage.tsx +│ ├── IntegrationPage.tsx +│ ├── SpecializedServicesPage.tsx +│ ├── SupportPage.tsx +│ └── SubscriptionPage.tsx +└── styles/ + ├── globals.css + └── animations.css +``` + +--- + +## ИТОГОВЫЕ ТРЕБОВАНИЯ К РЕЗУЛЬТАТУ + +1. Полностью рабочий SPA на React + TypeScript +2. Адаптивная верстка под все экраны +3. Плавные анимации и transitions +4. Минималистичный дизайн БЕЗ фотографий +5. Все компоненты должны быть функциональными (useState, useEffect) +6. Корректная навигация между всеми страницами +7. Работающие выпадающие меню +8. Функциональное модальное окно +9. Якорная навигация к секциям на главной странице +10. Готовность к деплою на Netlify (build в папку build) + +--- + +## ПРИМЕР КОДА КАРТОЧКИ ВЕНДОРА + +```tsx +
+

+ Яндекс.Облако +

+

+ Полный спектр облачных сервисов: вычисления, хранение данных, машинное обучение +

+
+ + Compute Cloud + + + Object Storage + +
+ +
+``` + +--- + +Этот промт содержит все необходимые данные для точного воссоздания сайта SOFTCLICK. Следуй ему последовательно, создавая каждый компонент с указанными стилями и структурой. diff --git a/src/README.md b/src/README.md new file mode 100644 index 0000000..e8cab9e --- /dev/null +++ b/src/README.md @@ -0,0 +1,116 @@ +# SOFTCLICK - Корпоративный сайт + +Современный корпоративный сайт российской IT-компании SOFTCLICK с фокусом на импортозамещение и российские решения. + +## ⚠️ Требования + +- **Node.js 18 LTS** (рекомендуется) +- npm 9 или выше + +Проект настроен на Node.js 18 для максимальной совместимости. Node.js 22 может вызвать проблемы. + +**Установка Node.js 18:** +```bash +# Если используете nvm +nvm install 18 +nvm use 18 + +# Проверка версии +node -v # должно показать v18.x.x +``` + +## ⚠️ Важно: Проверка сборки + +Перед деплоем проверьте, в какую папку собирается проект: + +**Linux/Mac:** +```bash +chmod +x check-build.sh +./check-build.sh +``` + +**Windows:** +```cmd +check-build.bat +``` + +Скрипт покажет, создаётся папка `dist` или `build`. Используйте эту информацию для настройки деплоя. + +## Технологии + +- React 18 +- TypeScript +- Vite +- Tailwind CSS v4 +- Lucide Icons + +## Установка и запуск + +```bash +# Установка зависимостей +npm install + +# Запуск dev-сервера +npm run dev + +# Сборка для продакшена +npm run build + +# Предпросмотр продакшен-сборки +npm run preview +``` + +## 🚀 Деплой + +### Быстрый деплой (один клик) + +**Linux/Mac:** +```bash +chmod +x deploy.sh +./deploy.sh +``` + +**Windows:** +```cmd +deploy.bat +``` + +### Рекомендуемые платформы + +#### ⭐ Netlify (самый простой - 2 минуты) +1. Зарегистрируйтесь на https://netlify.com +2. Подключите GitHub репозиторий +3. Готово! Автоматический деплой настроен + +#### ⭐ Cloudflare Pages (самый быстрый) +1. Зарегистрируйтесь на https://pages.cloudflare.com +2. Build command: `npm run build` +3. Output: `dist` + +#### ⭐ GitHub Pages (100% бесплатно) +1. Settings → Pages → Source: "GitHub Actions" +2. Автоматический деплой уже настроен! + +#### 🇷🇺 Яндекс.Облако (российская платформа) +См. подробную инструкцию в `deploy-yandex-cloud.md` + +#### 🇷🇺 Традиционный хостинг (Timeweb, Beget, Reg.ru) +См. инструкцию в `deploy-traditional-hosting.md` + +### 📖 Полная документация по деплою +**Смотрите файл `DEPLOYMENT.md`** - там все варианты с пошаговыми инструкциями! + +## Структура проекта + +- `/components` - React компоненты +- `/pages` - Страницы приложения +- `/styles` - Глобальные стили и анимации +- `/App.tsx` - Главный компонент с роутингом + +## Файлы конфигурации + +- `netlify.toml` - конфигурация для Netlify +- `.github/workflows/deploy.yml` - GitHub Pages автодеплой +- `.github/workflows/deploy-yandex.yml` - Яндекс.Облако автодеплой +- `.htaccess` - для Apache хостинга +- `vercel.json` - для Vercel (опционально) \ No newline at end of file diff --git a/src/START-HERE.md b/src/START-HERE.md new file mode 100644 index 0000000..9baacfd --- /dev/null +++ b/src/START-HERE.md @@ -0,0 +1,118 @@ +# 🚀 НАЧНИТЕ ОТСЮДА + +## Проект готов к деплою на Netlify! + +Все проблемы исправлены: +- ✅ Node.js зафиксирован на версии 18 LTS +- ✅ Vite настроен на сборку в папку `build` +- ✅ Netlify настроен на публикацию из `build` +- ✅ Все конфигурации обновлены + +--- + +## 🎯 Быстрый старт + +### 1. Закоммитьте изменения + +```bash +git add . +git commit -m "Fix: Pin Node.js to v18 and configure build output" +git push origin main +``` + +### 2. Деплой на Netlify + +После пуша: +1. Зайдите на https://app.netlify.com +2. Откройте ваш сайт +3. Дождитесь автоматического деплоя (~2-3 минуты) +4. Готово! ✅ + +--- + +## 📖 Документация + +### Для быстрого решения проблем: +- **COMMIT-AND-DEPLOY.md** - пошаговая инструкция по деплою +- **NETLIFY-FIX.md** - решение проблем с Netlify +- **NODE-VERSION-FIX.md** - информация о Node.js версии + +### Полная информация: +- **DEPLOYMENT.md** - все способы деплоя +- **PLATFORMS.md** - сравнение платформ +- **DEPLOY-QUICK.md** - быстрая шпаргалка + +### История изменений: +- **LATEST-FIXES.md** - последние исправления +- **FIXES-SUMMARY.md** - полная сводка всех исправлений + +--- + +## 🔍 Проверка перед коммитом (опционально) + +```bash +# Проверьте версию Node.js +node -v # Должно быть v18.x.x + +# Если нет, установите: +nvm install 18 +nvm use 18 + +# Запустите скрипт проверки сборки +chmod +x check-build.sh +./check-build.sh + +# Должно показать: +# ✅ Node.js версия совместима +# ✅ BUILD OUTPUT: build +``` + +--- + +## ❓ Что дальше? + +После успешного деплоя на Netlify: + +### Базовые настройки: +- [ ] Проверьте что сайт работает +- [ ] Настройте кастомный домен (если нужно) +- [ ] SSL сертификат (Netlify настроит автоматически) + +### Дополнительные возможности: +- [ ] Подключите Yandex.Metrika или Google Analytics +- [ ] Настройте форму обратной связи +- [ ] Добавьте favicon (уже есть в `/public/favicon.svg`) +- [ ] Настройте redirects для старых URL (если нужно) + +--- + +## 🆘 Проблемы с Netlify? + +### Вариант 1: Используйте Cloudflare Pages +``` +1. https://pages.cloudflare.com +2. Build: npm run build +3. Output: build +4. Environment: NODE_VERSION = 18 +``` + +### Вариант 2: GitHub Pages +Создайте файл `.github/workflows/deploy.yml` (см. документацию) + +--- + +## ✅ Быстрая команда для деплоя + +```bash +# Всё в одной команде +git add . && \ +git commit -m "Fix deployment config" && \ +git push && \ +echo "✅ Pushed! Check Netlify for deploy status." +``` + +--- + +**Удачи с деплоем!** 🎉 + +Если возникнут вопросы - см. файл **COMMIT-AND-DEPLOY.md** для детальных инструкций. diff --git a/src/_headers/main.tsx b/src/_headers/main.tsx new file mode 100644 index 0000000..0e70287 --- /dev/null +++ b/src/_headers/main.tsx @@ -0,0 +1,8 @@ +/* + X-Frame-Options: DENY + X-Content-Type-Options: nosniff + Referrer-Policy: strict-origin-when-cross-origin + Cache-Control: public, max-age=31536000, immutable + +/*.html + Cache-Control: public, max-age=0, must-revalidate diff --git a/src/_redirects/main.tsx b/src/_redirects/main.tsx new file mode 100644 index 0000000..7797f7c --- /dev/null +++ b/src/_redirects/main.tsx @@ -0,0 +1 @@ +/* /index.html 200 diff --git a/src/check-build.bat b/src/check-build.bat new file mode 100644 index 0000000..69233be --- /dev/null +++ b/src/check-build.bat @@ -0,0 +1,54 @@ +@echo off +chcp 65001 >nul + +echo 🔍 Проверка сборки SOFTCLICK... +echo. + +REM Проверка версии Node.js +echo 📌 Проверка версии Node.js... +node -v +echo. + +REM Очистка старых артефактов +echo 🧹 Очистка старых сборок... +if exist dist rmdir /s /q dist +if exist build rmdir /s /q build + +REM Установка зависимостей +echo 📦 Установка зависимостей... +call npm install + +REM Сборка +echo 🔨 Сборка проекта... +call npm run build + +REM Проверка результата +echo. +echo ✅ Проверка результатов сборки: +echo. + +if exist dist\ ( + echo 📁 Найдена папка: dist\ + dir dist /s + echo. + echo ✅ BUILD OUTPUT: dist + echo. + echo 📋 Для Netlify используйте: + echo publish = "dist" +) else if exist build\ ( + echo 📁 Найдена папка: build\ + dir build /s + echo. + echo ✅ BUILD OUTPUT: build + echo. + echo 📋 Для Netlify используйте: + echo publish = "build" +) else ( + echo ❌ Папка сборки не найдена! + echo Проверьте логи выше на наличие ошибок + pause + exit /b 1 +) + +echo. +pause \ No newline at end of file diff --git a/src/check-build.sh b/src/check-build.sh new file mode 100644 index 0000000..946ba90 --- /dev/null +++ b/src/check-build.sh @@ -0,0 +1,68 @@ +#!/bin/bash + +echo "🔍 Проверка сборки SOFTCLICK..." +echo "" + +# Очистка старых артефактов +echo "🧹 Очистка старых сборок..." +rm -rf dist build + +# Проверка Node.js версии +echo "📌 Проверка версии Node.js..." +node_version=$(node -v) +echo " Текущая версия: $node_version" +if [[ "$node_version" == v18* ]] || [[ "$node_version" == v20* ]]; then + echo " ✅ Node.js версия совместима" +elif [[ "$node_version" == v22* ]]; then + echo " ⚠️ Предупреждение: Node.js v22 может вызвать проблемы" + echo " 💡 Рекомендуется использовать Node.js v18 LTS" + echo " Установите через: nvm install 18 && nvm use 18" +else + echo " ℹ️ Версия: $node_version" +fi +echo "" + +# Установка зависимостей +echo "📦 Установка зависимостей..." +npm install + +# Сборка +echo "🔨 Сборка проекта..." +npm run build + +# Проверка результата +echo "" +echo "✅ Проверка результатов сборки:" +echo "" + +if [ -d "dist" ]; then + echo "📁 Найдена папка: dist/" + echo " Размер: $(du -sh dist | cut -f1)" + echo " Файлов: $(find dist -type f | wc -l)" + echo "" + echo "Содержимое dist/:" + ls -lh dist/ + echo "" + echo "✅ BUILD OUTPUT: dist" +elif [ -d "build" ]; then + echo "📁 Найдена папка: build/" + echo " Размер: $(du -sh build | cut -f1)" + echo " Файлов: $(find build -type f | wc -l)" + echo "" + echo "Содержимое build/:" + ls -lh build/ + echo "" + echo "✅ BUILD OUTPUT: build" +else + echo "❌ Папка сборки не найдена!" + echo " Проверьте логи выше на наличие ошибок" + exit 1 +fi + +echo "" +echo "📋 Для Netlify используйте в netlify.toml:" +if [ -d "dist" ]; then + echo ' publish = "dist"' +elif [ -d "build" ]; then + echo ' publish = "build"' +fi \ No newline at end of file diff --git a/src/components/About.tsx b/src/components/About.tsx new file mode 100644 index 0000000..4949fb7 --- /dev/null +++ b/src/components/About.tsx @@ -0,0 +1,162 @@ +import { CheckCircle, Rocket, Zap, Target, Award, Shield, Clock, HeadphonesIcon, TrendingUp, Users, CheckCircle2, Cloud, Lock, Database, Briefcase, Server, Cpu, Package } from 'lucide-react'; +import { useState, useEffect } from 'react'; + +const allVendors = [ + 'Яндекс.Облако', + 'VK Cloud', + 'MTC Web Services', + 'Сбер Облако', + 'Kaspersky', + 'Positive Technologies', + 'UserGate', + 'Astra Linux', + 'РедСофт', + 'Альт Линукс', + 'Postgres Pro', + 'Tarantool', + 'Мой Офис', + 'Р7-Офис', + '1С', + 'Галактика', + 'Kraftway', + 'Aquarius', + 'Эльбрус', + 'Битрикс24', + 'Код Безопасности', + 'Zabbix', + 'Nginx', + 'Selectel', + 'Лаборатория Эльбрус', + 'Basealt', + 'МойОфис Почта', + 'Видеомост', + 'Jazz Telecom', + 'Р-Видео', + 'СКБ Контур', + 'ЕТИС', + 'Кодикс', + 'Тензор', + 'Infowatch', + 'SearchInform', + 'Гарда', + 'Аладдин Р.Д.', + 'С-Терра', + 'DeviceLock', + 'КриптоПро', + 'Базальт СПО', + 'Аскон', + 'НаноСофт', + 'Directum', + 'Open Yard', + 'ТруКонф', + 'Yadro', + 'Depo', + 'Eltex', + 'Qtech', + 'D-Link' +]; + +export function About() { + const [currentVendorIndex, setCurrentVendorIndex] = useState(0); + const [isVisible, setIsVisible] = useState(true); + + useEffect(() => { + const interval = setInterval(() => { + setIsVisible(false); + + setTimeout(() => { + setCurrentVendorIndex((prev) => (prev + 1) % allVendors.length); + setIsVisible(true); + }, 800); + }, 4500); + + return () => clearInterval(interval); + }, []); + + return ( +
+
+
+

+ О компании +

+

+ Сотрудничаем с + + {allVendors[currentVendorIndex]} + +

+

+ Комплексные решения для цифровой трансформации бизнеса. Работаем с 2021 года. +

+
+ + {/* Ключевые преимущества для клиента */} +
+
+
+ +
+

Поставка оборудования

+

+ Комплексные поставки серверов, СХД и сетевого оборудования от российских производителей. +

+
+ +
+
+ +
+

Официальное партнерство

+

+ Статус золотого партнера ведущих российских вендоров. Прямые контракты и поддержка. +

+
+ +
+
+ +
+

Сертифицированные специалисты

+

+ Инженеры с подтвержденной квалификацией по всем внедряемым решениям и платформам. +

+
+ +
+
+ +
+

Оперативный отклик

+

+ Быстрое реагирование на запросы клиента. Четкие сроки решения задач и прозрачная коммуникация. +

+
+ +
+
+ +
+

Выделенная команда

+

+ Персональный менеджер проекта и команда сертифицированных специалистов. +

+
+ +
+
+ +
+

Быстрый старт

+

+ Запуск типовых проектов за 2 недели. Пилотное внедрение перед полным развертываием. +

+
+
+
+
+ ); +} \ No newline at end of file diff --git a/src/components/Cases.tsx b/src/components/Cases.tsx new file mode 100644 index 0000000..c793d0d --- /dev/null +++ b/src/components/Cases.tsx @@ -0,0 +1,109 @@ +import { ArrowRight, Cloud, Cpu, Shield } from 'lucide-react'; + +const cases = [ + { + icon: Cloud, + category: 'Облако', + company: 'Торговая сеть', + title: 'Миграция в Яндекс.Облако', + description: 'Перенос корпоративной инфраструктуры 500+ серверов с нулевым простоем', + results: '−40% TCO', + gradient: 'from-blue-100 to-cyan-100', + iconBg: 'bg-white', + iconColor: 'text-blue-600' + }, + { + icon: Cpu, + category: 'Автоматизация', + company: 'Производственный холдинг', + title: 'Внедрение 1С:ERP', + description: 'Автоматизация производственного и финансового учета для 15 предприятий', + results: '+25% эффективность', + gradient: 'from-emerald-100 to-teal-100', + iconBg: 'bg-white', + iconColor: 'text-emerald-600' + }, + { + icon: Shield, + category: 'Безопасность', + company: 'Финансовая группа', + title: 'Защита периметра Kaspersky', + description: 'Построение многоуровневой системы защиты критичной инфраструктуры', + results: '99.9% uptime', + gradient: 'from-violet-100 to-purple-100', + iconBg: 'bg-white', + iconColor: 'text-violet-600' + } +]; + +export function Cases() { + return ( +
+
+
+

+ Кейсы +

+

+ Реализованные проекты +

+

+ Примеры успешного внедрения с конкретными результатами +

+
+ +
+ {cases.map((caseItem, index) => { + const Icon = caseItem.icon; + const floatClass = index === 0 ? 'animate-float' : index === 1 ? 'animate-float-delay-1' : 'animate-float-delay-2'; + return ( +
+
+
+ +
+
+ + {caseItem.category} + +
+
+ +
+
+ {caseItem.company} +
+ +

+ {caseItem.title} +

+ +

+ {caseItem.description} +

+ +
+ + {caseItem.results} + + +
+
+
+ ); + })} +
+ +
+ +
+
+
+ ); +} \ No newline at end of file diff --git a/src/components/CategoryPage.tsx b/src/components/CategoryPage.tsx new file mode 100644 index 0000000..a0f1699 --- /dev/null +++ b/src/components/CategoryPage.tsx @@ -0,0 +1,96 @@ +import { ArrowLeft } from 'lucide-react'; + +interface Vendor { + name: string; + description: string; + logo?: string; + products?: string[]; +} + +interface CategoryPageProps { + title: string; + description: string; + vendors: Vendor[]; + onBack: () => void; +} + +export function CategoryPage({ title, description, vendors, onBack }: CategoryPageProps) { + return ( +
+ {/* Hero секция */} +
+
+ + +
+
+
+ Каталог решений +
+

+ {title} +

+

+ {description} +

+
+ +
+
+
+
+ + {/* Список вендоров */} +
+
+ {vendors.map((vendor, index) => ( +
+
+
+

+ {vendor.name} +

+
+ +

+ {vendor.description} +

+ + {vendor.products && vendor.products.length > 0 && ( +
+
+ Решения +
+
+ {vendor.products.map((product, idx) => ( + + {product} + + ))} +
+
+ )} + + +
+
+ ))} +
+
+
+ ); +} \ No newline at end of file diff --git a/src/components/Contact.tsx b/src/components/Contact.tsx new file mode 100644 index 0000000..1e0b3fc --- /dev/null +++ b/src/components/Contact.tsx @@ -0,0 +1,108 @@ +import { Phone, Mail, MapPin, Clock } from 'lucide-react'; + +export function Contact() { + return ( +
+
+ {/* Заголовок */} +
+

+ Обсудим ваш проект +

+

+ Оставьте заявку — перезвоним в течение часа +

+
+ + {/* Форма */} +
+
+
+
+ +
+ +
+ +
+
+ +
+
+ +
+ +
+ +
+
+ +
+ +
+ +
+ +

+ Нажимая кнопку, вы соглашаетесь с политикой конфиденциальности +

+
+
+
+ + {/* Контакты компактно */} +
+ + + +7 (495) 123-45-67 + + + + info@softclick.ru + +
+ + Москва, Пресненская наб., 12 +
+
+ + Пн-Пт 9:00–18:00 +
+
+
+
+ ); +} \ No newline at end of file diff --git a/src/components/ContactModal.tsx b/src/components/ContactModal.tsx new file mode 100644 index 0000000..7418b35 --- /dev/null +++ b/src/components/ContactModal.tsx @@ -0,0 +1,216 @@ +import { X, Mail, Phone, MapPin, Clock, Calendar } from 'lucide-react'; +import { useEffect, useState } from 'react'; +import { createPortal } from 'react-dom'; + +interface ContactModalProps { + isOpen: boolean; + onClose: () => void; +} + +export function ContactModal({ isOpen, onClose }: ContactModalProps) { + useEffect(() => { + if (isOpen) { + document.body.style.overflow = 'hidden'; + } else { + document.body.style.overflow = 'unset'; + } + return () => { + document.body.style.overflow = 'unset'; + }; + }, [isOpen]); + + if (!isOpen) return null; + + const modalContent = ( +
+
e.stopPropagation()} + > + {/* Заголовок */} +
+
+

+ Обсудим ваш проект +

+

+ Оставьте заявку — перезвоним в течение часа +

+
+ +
+ + {/* Форма */} +
+
+
+
+ +
+ +
+ +
+
+ +
+
+ +
+ +
+ +
+
+ + {/* Для чего нужна покупка и Сроки */} +
+
+ + +
+ +
+ + +
+
+ + {/* Комментарий к задаче */} +
+ + +
+ + {/* Слоты для встречи в ВКС */} +
+ +
+
+ + +
+
+ + +
+
+

Мы отправим вам приглашение в ВКС на один из выбранных слотов

+
+ +
+ +

+ Нажимая кнопку, вы соглашаетесь с политикой конфиденциальности +

+
+
+ + {/* Контакты компактно */} +
+ + + +7 (495) 123-45-67 + + + + info@softclick.ru + +
+ + Москва, Пресненская наб., 12 +
+
+ + Пн-Пт 9:00–18:00 +
+
+
+
+
+ ); + + return createPortal(modalContent, document.body); +} \ No newline at end of file diff --git a/src/components/Footer.tsx b/src/components/Footer.tsx new file mode 100644 index 0000000..0657c4d --- /dev/null +++ b/src/components/Footer.tsx @@ -0,0 +1,96 @@ +import { Mail, Phone, MapPin, Send, Hash, Code, Video } from 'lucide-react'; + +export function Footer() { + return ( + + ); +} \ No newline at end of file diff --git a/src/components/Header.tsx b/src/components/Header.tsx new file mode 100644 index 0000000..2bb9f6a --- /dev/null +++ b/src/components/Header.tsx @@ -0,0 +1,235 @@ +import { Menu, X, ChevronDown } from 'lucide-react'; +import { useState } from 'react'; +import { ContactModal } from './ContactModal'; + +interface HeaderProps { + onNavigate?: (page: string, section?: string) => void; +} + +export function Header({ onNavigate }: HeaderProps) { + const [isMenuOpen, setIsMenuOpen] = useState(false); + const [isSolutionsOpen, setIsSolutionsOpen] = useState(false); + const [isServicesOpen, setIsServicesOpen] = useState(false); + const [isContactModalOpen, setIsContactModalOpen] = useState(false); + + const solutions = [ + { name: 'Облако', path: 'cloud' }, + { name: 'Российское ПО', path: 'russian-software' }, + { name: 'Кибербезопасность', path: 'cybersecurity' }, + { name: 'Решения на базе ИИ', path: 'ai-solutions' }, + { name: 'Российские ноутбуки, ПК и серверы', path: 'russian-hardware' }, + { name: 'Аппаратные решения', path: 'hardware-solutions' }, + { name: 'САПР и ГИС', path: 'cad-gis' }, + { name: 'Индустриальные решения', path: 'industrial-solutions' }, + { name: 'Для госсектора', path: 'government' }, + { name: 'Решения для бизнеса', path: 'business' }, + ]; + + const services = [ + { name: 'Консалтинг и проектирование', path: 'consulting' }, + { name: 'Поставка и внедрение решений', path: 'implementation' }, + { name: 'Управляемые сервисы', path: 'managed-services' }, + { name: 'Интеграция и разработка', path: 'integration' }, + { name: 'Специализированные услуги по отраслям', path: 'specialized-services' }, + { name: 'Обслуживание и сопровождение', path: 'support' }, + { name: 'Услуги по подписке', path: 'subscription' }, + ]; + + const handleNavClick = (e: React.MouseEvent, sectionId: string) => { + e.preventDefault(); + console.log('Header: handleNavClick called with sectionId:', sectionId); + onNavigate?.('home', sectionId); + setIsMenuOpen(false); + }; + + return ( +
+ + setIsContactModalOpen(false)} /> +
+ ); +} \ No newline at end of file diff --git a/src/components/Hero.tsx b/src/components/Hero.tsx new file mode 100644 index 0000000..52972fc --- /dev/null +++ b/src/components/Hero.tsx @@ -0,0 +1,105 @@ +import { ArrowRight, Play, Cloud, Shield, Zap, Database, Code, Users } from 'lucide-react'; + +interface HeroProps { + onOpenContactModal?: () => void; +} + +export function Hero({ onOpenContactModal }: HeroProps) { + return ( +
+ +
+
+
+
+ + Надежный партнер с 2021 года +
+ +

+ IT-решения для роста вашего бизнеса +

+ +

+ Проектируем, внедряем и сопровождаем корпоративные IT-системы. + Облачная инфраструктура, безопасность, автоматизация процессов. +

+ +
+ + + +
+ +
+
+
300+
+
клиентов
+
+
+
50+
+
партнерств
+
+
+
95%
+
повторных обращений
+
+
+
+ + {/* Простая сетка иконок в стиле VK/Яндекс */} +
+ +
+
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+
+
+
+
+
+ ); +} \ No newline at end of file diff --git a/src/components/Services.tsx b/src/components/Services.tsx new file mode 100644 index 0000000..6d1e4e0 --- /dev/null +++ b/src/components/Services.tsx @@ -0,0 +1,116 @@ +import { Cloud, Shield, Cpu, Database, Server, Settings } from 'lucide-react'; +import { ImageWithFallback } from './figma/ImageWithFallback'; + +const services = [ + { + icon: Cloud, + title: 'Облачные решения', + description: 'Миграция и управление инфраструктурой на базе Яндекс.Облако и VK Cloud', + gradient: 'from-blue-50 to-cyan-50', + iconBg: 'bg-white', + iconColor: 'text-blue-600' + }, + { + icon: Shield, + title: 'Кибербезопасность', + description: 'Комплексная защита периметра и данных с решениями Kaspersky', + gradient: 'from-violet-50 to-purple-50', + iconBg: 'bg-white', + iconColor: 'text-violet-600' + }, + { + icon: Cpu, + title: 'Цифровая трансформация', + description: 'Автоматизация процессов на платформах 1С и Галактика', + gradient: 'from-emerald-50 to-teal-50', + iconBg: 'bg-white', + iconColor: 'text-emerald-600' + }, + { + icon: Database, + title: 'Управление данными', + description: 'Развертывание и поддержка СУБД Postgres Pro', + gradient: 'from-orange-50 to-amber-50', + iconBg: 'bg-white', + iconColor: 'text-orange-600' + }, + { + icon: Server, + title: 'Серверная инфраструктура', + description: 'Поставка и настройка оборудования Kraftway', + gradient: 'from-pink-50 to-rose-50', + iconBg: 'bg-white', + iconColor: 'text-pink-600' + }, + { + icon: Settings, + title: 'Системная интеграция', + description: 'Построение корпоративной ИТ-архитектуры на Astra Linux', + gradient: 'from-indigo-50 to-blue-50', + iconBg: 'bg-white', + iconColor: 'text-indigo-600' + } +]; + +export function Services() { + return ( +
+
+
+

+ Услуги +

+

+ Комплексные IT-решения для вашего бизнеса +

+

+ Полный цикл: от стратегии до технической поддержки +

+
+ +
+ {services.map((service, index) => { + const Icon = service.icon; + const floatClasses = [ + 'animate-float', + 'animate-float-delay-1', + 'animate-float-delay-2', + 'animate-float-delay-3', + 'animate-float-delay-4', + 'animate-float-delay-5' + ]; + const floatClass = floatClasses[index % 6]; + + return ( +
+
+
+ +
+
+ +
+

+ {service.title} +

+ +

+ {service.description} +

+ + +
+
+ ); + })} +
+
+
+ ); +} \ No newline at end of file diff --git a/src/components/Solutions.tsx b/src/components/Solutions.tsx new file mode 100644 index 0000000..375376a --- /dev/null +++ b/src/components/Solutions.tsx @@ -0,0 +1,92 @@ +import { Building2, ShoppingCart, Factory, Heart, GraduationCap, Landmark } from 'lucide-react'; + +const solutions = [ + { + icon: Building2, + title: 'Корпоративный сектор', + description: 'ERP, CRM, автоматизация документооборота', + projects: '1200+ проектов' + }, + { + icon: ShoppingCart, + title: 'Ритейл и e-commerce', + description: 'Омниканальные платформы продаж', + projects: '850+ проектов' + }, + { + icon: Factory, + title: 'Производство', + description: 'IoT, системы управления производством', + projects: '650+ проектов' + }, + { + icon: Heart, + title: 'Здравоохранение', + description: 'Медицинские информационные системы', + projects: '420+ проектов' + }, + { + icon: GraduationCap, + title: 'Образование', + description: 'Платформы дистанционного обучения', + projects: '380+ проектов' + }, + { + icon: Landmark, + title: 'Государственный сектор', + description: 'Цифровизация госуслуг', + projects: '500+ проектов' + } +]; + +export function Solutions() { + return ( +
+
+
+

+ Отраслевые решения +

+

+ Решения под ключ для разных отраслей +

+

+ Глубокое понимание специфики бизнеса в каждой отрасли +

+
+ +
+ {solutions.map((solution, index) => { + const Icon = solution.icon; + return ( +
+
+
+ +
+
+

+ {solution.title} +

+

+ {solution.description} +

+
+
+ +
+ + {solution.projects} + +
+
+ ); + })} +
+
+
+ ); +} \ No newline at end of file diff --git a/src/components/figma/ImageWithFallback.tsx b/src/components/figma/ImageWithFallback.tsx new file mode 100644 index 0000000..0e26139 --- /dev/null +++ b/src/components/figma/ImageWithFallback.tsx @@ -0,0 +1,27 @@ +import React, { useState } from 'react' + +const ERROR_IMG_SRC = + 'data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iODgiIGhlaWdodD0iODgiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjMDAwIiBzdHJva2UtbGluZWpvaW49InJvdW5kIiBvcGFjaXR5PSIuMyIgZmlsbD0ibm9uZSIgc3Ryb2tlLXdpZHRoPSIzLjciPjxyZWN0IHg9IjE2IiB5PSIxNiIgd2lkdGg9IjU2IiBoZWlnaHQ9IjU2IiByeD0iNiIvPjxwYXRoIGQ9Im0xNiA1OCAxNi0xOCAzMiAzMiIvPjxjaXJjbGUgY3g9IjUzIiBjeT0iMzUiIHI9IjciLz48L3N2Zz4KCg==' + +export function ImageWithFallback(props: React.ImgHTMLAttributes) { + const [didError, setDidError] = useState(false) + + const handleError = () => { + setDidError(true) + } + + const { src, alt, style, className, ...rest } = props + + return didError ? ( +
+
+ Error loading image +
+
+ ) : ( + {alt} + ) +} diff --git a/src/components/ui/accordion.tsx b/src/components/ui/accordion.tsx new file mode 100644 index 0000000..aa2c37b --- /dev/null +++ b/src/components/ui/accordion.tsx @@ -0,0 +1,66 @@ +"use client"; + +import * as React from "react"; +import * as AccordionPrimitive from "@radix-ui/react-accordion@1.2.3"; +import { ChevronDownIcon } from "lucide-react@0.487.0"; + +import { cn } from "./utils"; + +function Accordion({ + ...props +}: React.ComponentProps) { + return ; +} + +function AccordionItem({ + className, + ...props +}: React.ComponentProps) { + return ( + + ); +} + +function AccordionTrigger({ + className, + children, + ...props +}: React.ComponentProps) { + return ( + + svg]:rotate-180", + className, + )} + {...props} + > + {children} + + + + ); +} + +function AccordionContent({ + className, + children, + ...props +}: React.ComponentProps) { + return ( + +
{children}
+
+ ); +} + +export { Accordion, AccordionItem, AccordionTrigger, AccordionContent }; diff --git a/src/components/ui/alert-dialog.tsx b/src/components/ui/alert-dialog.tsx new file mode 100644 index 0000000..68f3605 --- /dev/null +++ b/src/components/ui/alert-dialog.tsx @@ -0,0 +1,157 @@ +"use client"; + +import * as React from "react"; +import * as AlertDialogPrimitive from "@radix-ui/react-alert-dialog@1.1.6"; + +import { cn } from "./utils"; +import { buttonVariants } from "./button"; + +function AlertDialog({ + ...props +}: React.ComponentProps) { + return ; +} + +function AlertDialogTrigger({ + ...props +}: React.ComponentProps) { + return ( + + ); +} + +function AlertDialogPortal({ + ...props +}: React.ComponentProps) { + return ( + + ); +} + +function AlertDialogOverlay({ + className, + ...props +}: React.ComponentProps) { + return ( + + ); +} + +function AlertDialogContent({ + className, + ...props +}: React.ComponentProps) { + return ( + + + + + ); +} + +function AlertDialogHeader({ + className, + ...props +}: React.ComponentProps<"div">) { + return ( +
+ ); +} + +function AlertDialogFooter({ + className, + ...props +}: React.ComponentProps<"div">) { + return ( +
+ ); +} + +function AlertDialogTitle({ + className, + ...props +}: React.ComponentProps) { + return ( + + ); +} + +function AlertDialogDescription({ + className, + ...props +}: React.ComponentProps) { + return ( + + ); +} + +function AlertDialogAction({ + className, + ...props +}: React.ComponentProps) { + return ( + + ); +} + +function AlertDialogCancel({ + className, + ...props +}: React.ComponentProps) { + return ( + + ); +} + +export { + AlertDialog, + AlertDialogPortal, + AlertDialogOverlay, + AlertDialogTrigger, + AlertDialogContent, + AlertDialogHeader, + AlertDialogFooter, + AlertDialogTitle, + AlertDialogDescription, + AlertDialogAction, + AlertDialogCancel, +}; diff --git a/src/components/ui/alert.tsx b/src/components/ui/alert.tsx new file mode 100644 index 0000000..856b94d --- /dev/null +++ b/src/components/ui/alert.tsx @@ -0,0 +1,66 @@ +import * as React from "react"; +import { cva, type VariantProps } from "class-variance-authority@0.7.1"; + +import { cn } from "./utils"; + +const alertVariants = cva( + "relative w-full rounded-lg border px-4 py-3 text-sm grid has-[>svg]:grid-cols-[calc(var(--spacing)*4)_1fr] grid-cols-[0_1fr] has-[>svg]:gap-x-3 gap-y-0.5 items-start [&>svg]:size-4 [&>svg]:translate-y-0.5 [&>svg]:text-current", + { + variants: { + variant: { + default: "bg-card text-card-foreground", + destructive: + "text-destructive bg-card [&>svg]:text-current *:data-[slot=alert-description]:text-destructive/90", + }, + }, + defaultVariants: { + variant: "default", + }, + }, +); + +function Alert({ + className, + variant, + ...props +}: React.ComponentProps<"div"> & VariantProps) { + return ( +
+ ); +} + +function AlertTitle({ className, ...props }: React.ComponentProps<"div">) { + return ( +
+ ); +} + +function AlertDescription({ + className, + ...props +}: React.ComponentProps<"div">) { + return ( +
+ ); +} + +export { Alert, AlertTitle, AlertDescription }; diff --git a/src/components/ui/aspect-ratio.tsx b/src/components/ui/aspect-ratio.tsx new file mode 100644 index 0000000..2a2f462 --- /dev/null +++ b/src/components/ui/aspect-ratio.tsx @@ -0,0 +1,11 @@ +"use client"; + +import * as AspectRatioPrimitive from "@radix-ui/react-aspect-ratio@1.1.2"; + +function AspectRatio({ + ...props +}: React.ComponentProps) { + return ; +} + +export { AspectRatio }; diff --git a/src/components/ui/avatar.tsx b/src/components/ui/avatar.tsx new file mode 100644 index 0000000..589b166 --- /dev/null +++ b/src/components/ui/avatar.tsx @@ -0,0 +1,53 @@ +"use client"; + +import * as React from "react"; +import * as AvatarPrimitive from "@radix-ui/react-avatar@1.1.3"; + +import { cn } from "./utils"; + +function Avatar({ + className, + ...props +}: React.ComponentProps) { + return ( + + ); +} + +function AvatarImage({ + className, + ...props +}: React.ComponentProps) { + return ( + + ); +} + +function AvatarFallback({ + className, + ...props +}: React.ComponentProps) { + return ( + + ); +} + +export { Avatar, AvatarImage, AvatarFallback }; diff --git a/src/components/ui/badge.tsx b/src/components/ui/badge.tsx new file mode 100644 index 0000000..3f8eff8 --- /dev/null +++ b/src/components/ui/badge.tsx @@ -0,0 +1,46 @@ +import * as React from "react"; +import { Slot } from "@radix-ui/react-slot@1.1.2"; +import { cva, type VariantProps } from "class-variance-authority@0.7.1"; + +import { cn } from "./utils"; + +const badgeVariants = cva( + "inline-flex items-center justify-center rounded-md border px-2 py-0.5 text-xs font-medium w-fit whitespace-nowrap shrink-0 [&>svg]:size-3 gap-1 [&>svg]:pointer-events-none focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px] aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive transition-[color,box-shadow] overflow-hidden", + { + variants: { + variant: { + default: + "border-transparent bg-primary text-primary-foreground [a&]:hover:bg-primary/90", + secondary: + "border-transparent bg-secondary text-secondary-foreground [a&]:hover:bg-secondary/90", + destructive: + "border-transparent bg-destructive text-white [a&]:hover:bg-destructive/90 focus-visible:ring-destructive/20 dark:focus-visible:ring-destructive/40 dark:bg-destructive/60", + outline: + "text-foreground [a&]:hover:bg-accent [a&]:hover:text-accent-foreground", + }, + }, + defaultVariants: { + variant: "default", + }, + }, +); + +function Badge({ + className, + variant, + asChild = false, + ...props +}: React.ComponentProps<"span"> & + VariantProps & { asChild?: boolean }) { + const Comp = asChild ? Slot : "span"; + + return ( + + ); +} + +export { Badge, badgeVariants }; diff --git a/src/components/ui/breadcrumb.tsx b/src/components/ui/breadcrumb.tsx new file mode 100644 index 0000000..d2adf98 --- /dev/null +++ b/src/components/ui/breadcrumb.tsx @@ -0,0 +1,109 @@ +import * as React from "react"; +import { Slot } from "@radix-ui/react-slot@1.1.2"; +import { ChevronRight, MoreHorizontal } from "lucide-react@0.487.0"; + +import { cn } from "./utils"; + +function Breadcrumb({ ...props }: React.ComponentProps<"nav">) { + return