From d670921f7460d2f098eb3beff72d836be48634c7 Mon Sep 17 00:00:00 2001 From: safavimohadeseh78 Date: Wed, 9 Sep 2026 17:08:46 +0330 Subject: [PATCH] Initialize the admin app with banner management for app sections. Co-authored-by: Cursor --- .editorconfig | 8 + .env.development | 4 + .env.example | 1 + .gitattributes | 1 + .gitignore | 44 + .oxlintrc.json | 10 + .prettierrc.json | 6 + .vscode/extensions.json | 9 + README.md | 48 + deploy/nginx-admin.conf | 17 + env.d.ts | 2 + eslint.config.ts | 26 + index.html | 13 + package-lock.json | 6297 +++++++++++++++++ package.json | 51 + public/.htaccess | 18 + public/favicon.ico | Bin 0 -> 4286 bytes src/App.vue | 10 + .../iranSans/woff2/IRANSansWeb(FaNum).woff2 | Bin 0 -> 27944 bytes .../woff2/IRANSansWeb(FaNum)_Black.woff2 | Bin 0 -> 25776 bytes .../woff2/IRANSansWeb(FaNum)_Bold.woff2 | Bin 0 -> 27316 bytes .../woff2/IRANSansWeb(FaNum)_Light.woff2 | Bin 0 -> 28400 bytes .../woff2/IRANSansWeb(FaNum)_Medium.woff2 | Bin 0 -> 25784 bytes .../woff2/IRANSansWeb(FaNum)_UltraLight.woff2 | Bin 0 -> 28208 bytes src/assets/styles/admin.css | 702 ++ src/assets/styles/fonts.css | 39 + src/assets/styles/main.css | 195 + src/assets/styles/responsive.css | 414 ++ src/components/BasicPacks/BasicIcon.vue | 77 + .../BasicPacks/tools/icons/icons.json | 67 + src/components/charts/SalesAreaChart.vue | 228 + src/components/icons/AdminIcon.vue | 77 + src/components/layout/AdminHeader.vue | 729 ++ src/components/layout/AdminMobileDrawer.vue | 154 + src/components/layout/AdminSidebar.vue | 139 + src/components/ui/ActiveSwitchCell.vue | 57 + src/components/ui/AdminCurrencyInput.vue | 65 + src/components/ui/AdminImagePicker.vue | 127 + src/components/ui/AdminPageSkeleton.vue | 129 + src/components/ui/AdminSelect.vue | 357 + src/components/ui/BaseEmptyState.vue | 90 + src/components/ui/BaseModal.vue | 180 + src/components/ui/BaseSwitch.vue | 164 + src/components/ui/ConfirmDialog.vue | 45 + src/components/ui/StatusBadge.vue | 32 + src/components/ui/ToastContainer.vue | 171 + src/composables/useAsyncToggle.ts | 56 + src/composables/useBreakpoint.ts | 42 + src/composables/useConfirm.ts | 56 + src/composables/useDashboard.ts | 130 + src/composables/useOrdersPage.ts | 301 + src/composables/useToast.ts | 37 + src/data/mockData.ts | 757 ++ src/layouts/AdminShell.vue | 61 + src/main.ts | 23 + src/router/index.ts | 186 + src/services/api.ts | 628 ++ src/services/authService.ts | 135 + src/services/http.ts | 118 + src/stores/auth.ts | 73 + src/stores/theme.ts | 34 + src/types/auth.ts | 18 + src/types/index.ts | 276 + src/utils/adminLabels.ts | 41 + src/utils/catalogImage.ts | 46 + src/utils/format.ts | 100 + src/utils/inboxLinks.ts | 112 + src/utils/navigation.ts | 38 + src/utils/orderStatus.ts | 88 + src/views/auth/LoginView.vue | 301 + src/views/banners/BannersView.vue | 240 + src/views/brands/BrandsView.vue | 130 + src/views/cash-payments/CashPaymentsView.vue | 250 + .../catalog-requests/CatalogRequestsView.vue | 219 + src/views/catalogs/CatalogsView.vue | 365 + src/views/categories/CategoriesView.vue | 139 + src/views/checks/CheckManagementView.vue | 778 ++ src/views/checks/ChecksListView.vue | 344 + src/views/companies/BankAccountsView.vue | 290 + src/views/companies/CompaniesView.vue | 550 ++ src/views/customers/CustomersView.vue | 498 ++ src/views/dashboard/DashboardView.vue | 9 + .../dashboard/components/CompactDashboard.vue | 116 + .../dashboard/components/DesktopDashboard.vue | 257 + src/views/levels/LevelsView.vue | 146 + src/views/orders/OrderPricingView.vue | 580 ++ src/views/orders/OrdersView.vue | 14 + .../orders/components/CompactOrdersPage.vue | 365 + .../orders/components/DesktopOrdersPage.vue | 416 ++ src/views/orders/components/OrderAddModal.vue | 147 + .../orders/components/OrderDetailContent.vue | 516 ++ src/views/products/ProductsView.vue | 623 ++ src/views/reports/ReportsView.vue | 332 + src/views/settings/SettingsView.vue | 345 + src/views/shipping/ShippingView.vue | 361 + src/views/stock-alerts/StockAlertsView.vue | 84 + src/views/suggestions/SuggestionsView.vue | 147 + src/views/users/UsersView.vue | 321 + tsconfig.app.json | 18 + tsconfig.json | 11 + tsconfig.node.json | 27 + uno.config.ts | 33 + vite.config.ts | 32 + yarn.lock | 2974 ++++++++ 104 files changed, 26137 insertions(+) create mode 100644 .editorconfig create mode 100644 .env.development create mode 100644 .env.example create mode 100644 .gitattributes create mode 100644 .gitignore create mode 100644 .oxlintrc.json create mode 100644 .prettierrc.json create mode 100644 .vscode/extensions.json create mode 100644 README.md create mode 100644 deploy/nginx-admin.conf create mode 100644 env.d.ts create mode 100644 eslint.config.ts create mode 100644 index.html create mode 100644 package-lock.json create mode 100644 package.json create mode 100644 public/.htaccess create mode 100644 public/favicon.ico create mode 100644 src/App.vue create mode 100644 src/assets/fonts/iranSans/woff2/IRANSansWeb(FaNum).woff2 create mode 100644 src/assets/fonts/iranSans/woff2/IRANSansWeb(FaNum)_Black.woff2 create mode 100644 src/assets/fonts/iranSans/woff2/IRANSansWeb(FaNum)_Bold.woff2 create mode 100644 src/assets/fonts/iranSans/woff2/IRANSansWeb(FaNum)_Light.woff2 create mode 100644 src/assets/fonts/iranSans/woff2/IRANSansWeb(FaNum)_Medium.woff2 create mode 100644 src/assets/fonts/iranSans/woff2/IRANSansWeb(FaNum)_UltraLight.woff2 create mode 100644 src/assets/styles/admin.css create mode 100644 src/assets/styles/fonts.css create mode 100644 src/assets/styles/main.css create mode 100644 src/assets/styles/responsive.css create mode 100644 src/components/BasicPacks/BasicIcon.vue create mode 100644 src/components/BasicPacks/tools/icons/icons.json create mode 100644 src/components/charts/SalesAreaChart.vue create mode 100644 src/components/icons/AdminIcon.vue create mode 100644 src/components/layout/AdminHeader.vue create mode 100644 src/components/layout/AdminMobileDrawer.vue create mode 100644 src/components/layout/AdminSidebar.vue create mode 100644 src/components/ui/ActiveSwitchCell.vue create mode 100644 src/components/ui/AdminCurrencyInput.vue create mode 100644 src/components/ui/AdminImagePicker.vue create mode 100644 src/components/ui/AdminPageSkeleton.vue create mode 100644 src/components/ui/AdminSelect.vue create mode 100644 src/components/ui/BaseEmptyState.vue create mode 100644 src/components/ui/BaseModal.vue create mode 100644 src/components/ui/BaseSwitch.vue create mode 100644 src/components/ui/ConfirmDialog.vue create mode 100644 src/components/ui/StatusBadge.vue create mode 100644 src/components/ui/ToastContainer.vue create mode 100644 src/composables/useAsyncToggle.ts create mode 100644 src/composables/useBreakpoint.ts create mode 100644 src/composables/useConfirm.ts create mode 100644 src/composables/useDashboard.ts create mode 100644 src/composables/useOrdersPage.ts create mode 100644 src/composables/useToast.ts create mode 100644 src/data/mockData.ts create mode 100644 src/layouts/AdminShell.vue create mode 100644 src/main.ts create mode 100644 src/router/index.ts create mode 100644 src/services/api.ts create mode 100644 src/services/authService.ts create mode 100644 src/services/http.ts create mode 100644 src/stores/auth.ts create mode 100644 src/stores/theme.ts create mode 100644 src/types/auth.ts create mode 100644 src/types/index.ts create mode 100644 src/utils/adminLabels.ts create mode 100644 src/utils/catalogImage.ts create mode 100644 src/utils/format.ts create mode 100644 src/utils/inboxLinks.ts create mode 100644 src/utils/navigation.ts create mode 100644 src/utils/orderStatus.ts create mode 100644 src/views/auth/LoginView.vue create mode 100644 src/views/banners/BannersView.vue create mode 100644 src/views/brands/BrandsView.vue create mode 100644 src/views/cash-payments/CashPaymentsView.vue create mode 100644 src/views/catalog-requests/CatalogRequestsView.vue create mode 100644 src/views/catalogs/CatalogsView.vue create mode 100644 src/views/categories/CategoriesView.vue create mode 100644 src/views/checks/CheckManagementView.vue create mode 100644 src/views/checks/ChecksListView.vue create mode 100644 src/views/companies/BankAccountsView.vue create mode 100644 src/views/companies/CompaniesView.vue create mode 100644 src/views/customers/CustomersView.vue create mode 100644 src/views/dashboard/DashboardView.vue create mode 100644 src/views/dashboard/components/CompactDashboard.vue create mode 100644 src/views/dashboard/components/DesktopDashboard.vue create mode 100644 src/views/levels/LevelsView.vue create mode 100644 src/views/orders/OrderPricingView.vue create mode 100644 src/views/orders/OrdersView.vue create mode 100644 src/views/orders/components/CompactOrdersPage.vue create mode 100644 src/views/orders/components/DesktopOrdersPage.vue create mode 100644 src/views/orders/components/OrderAddModal.vue create mode 100644 src/views/orders/components/OrderDetailContent.vue create mode 100644 src/views/products/ProductsView.vue create mode 100644 src/views/reports/ReportsView.vue create mode 100644 src/views/settings/SettingsView.vue create mode 100644 src/views/shipping/ShippingView.vue create mode 100644 src/views/stock-alerts/StockAlertsView.vue create mode 100644 src/views/suggestions/SuggestionsView.vue create mode 100644 src/views/users/UsersView.vue create mode 100644 tsconfig.app.json create mode 100644 tsconfig.json create mode 100644 tsconfig.node.json create mode 100644 uno.config.ts create mode 100644 vite.config.ts create mode 100644 yarn.lock diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 0000000..3b510aa --- /dev/null +++ b/.editorconfig @@ -0,0 +1,8 @@ +[*.{js,jsx,mjs,cjs,ts,tsx,mts,cts,vue,css,scss,sass,less,styl}] +charset = utf-8 +indent_size = 2 +indent_style = space +insert_final_newline = true +trim_trailing_whitespace = true +end_of_line = lf +max_line_length = 100 diff --git a/.env.development b/.env.development new file mode 100644 index 0000000..90c7404 --- /dev/null +++ b/.env.development @@ -0,0 +1,4 @@ +# Same-origin in dev (Vite proxies to the real API — avoids CORS) +VITE_API_BASE_URL=/server/api +# بدون سرور هم می‌شود وارد شد +VITE_USE_MOCK_AUTH=true diff --git a/.env.example b/.env.example new file mode 100644 index 0000000..d3d8334 --- /dev/null +++ b/.env.example @@ -0,0 +1 @@ +VITE_API_BASE_URL=https://parche.montest.ir/server/api diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000..6313b56 --- /dev/null +++ b/.gitattributes @@ -0,0 +1 @@ +* text=auto eol=lf diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..79977f6 --- /dev/null +++ b/.gitignore @@ -0,0 +1,44 @@ +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +pnpm-debug.log* +lerna-debug.log* + +node_modules +.DS_Store +dist +dist-ssr +coverage +*.local + +# Editor directories and files +.vscode/* +!.vscode/extensions.json +.idea +*.suo +*.ntvs* +*.njsproj +*.sln +*.sw? + +*.tsbuildinfo + +.eslintcache + +# Cypress +/cypress/videos/ +/cypress/screenshots/ + +# Vitest +__screenshots__/ + +# Vite +*.timestamp-*-*.mjs + +# env +.env +.env.local +.env.*.local diff --git a/.oxlintrc.json b/.oxlintrc.json new file mode 100644 index 0000000..d5648b9 --- /dev/null +++ b/.oxlintrc.json @@ -0,0 +1,10 @@ +{ + "$schema": "./node_modules/oxlint/configuration_schema.json", + "plugins": ["eslint", "typescript", "unicorn", "oxc", "vue"], + "env": { + "browser": true + }, + "categories": { + "correctness": "error" + } +} diff --git a/.prettierrc.json b/.prettierrc.json new file mode 100644 index 0000000..29a2402 --- /dev/null +++ b/.prettierrc.json @@ -0,0 +1,6 @@ +{ + "$schema": "https://json.schemastore.org/prettierrc", + "semi": false, + "singleQuote": true, + "printWidth": 100 +} diff --git a/.vscode/extensions.json b/.vscode/extensions.json new file mode 100644 index 0000000..3f84126 --- /dev/null +++ b/.vscode/extensions.json @@ -0,0 +1,9 @@ +{ + "recommendations": [ + "Vue.volar", + "dbaeumer.vscode-eslint", + "EditorConfig.EditorConfig", + "oxc.oxc-vscode", + "esbenp.prettier-vscode" + ] +} diff --git a/README.md b/README.md new file mode 100644 index 0000000..583dd69 --- /dev/null +++ b/README.md @@ -0,0 +1,48 @@ +# fabric-trade-admin + +This template should help get you started developing with Vue 3 in Vite. + +## Recommended IDE Setup + +[VS Code](https://code.visualstudio.com/) + [Vue (Official)](https://marketplace.visualstudio.com/items?itemName=Vue.volar) (and disable Vetur). + +## Recommended Browser Setup + +- Chromium-based browsers (Chrome, Edge, Brave, etc.): + - [Vue.js devtools](https://chromewebstore.google.com/detail/vuejs-devtools/nhdogjmejiglipccpnnnanhbledajbpd) + - [Turn on Custom Object Formatter in Chrome DevTools](http://bit.ly/object-formatters) +- Firefox: + - [Vue.js devtools](https://addons.mozilla.org/en-US/firefox/addon/vue-js-devtools/) + - [Turn on Custom Object Formatter in Firefox DevTools](https://fxdx.dev/firefox-devtools-custom-object-formatters/) + +## Type Support for `.vue` Imports in TS + +TypeScript cannot handle type information for `.vue` imports by default, so we replace the `tsc` CLI with `vue-tsc` for type checking. In editors, we need [Volar](https://marketplace.visualstudio.com/items?itemName=Vue.volar) to make the TypeScript language service aware of `.vue` types. + +## Customize configuration + +See [Vite Configuration Reference](https://vite.dev/config/). + +## Project Setup + +```sh +npm install +``` + +### Compile and Hot-Reload for Development + +```sh +npm run dev +``` + +### Type-Check, Compile and Minify for Production + +```sh +npm run build +``` + +### Lint with [ESLint](https://eslint.org/) + +```sh +npm run lint +``` diff --git a/deploy/nginx-admin.conf b/deploy/nginx-admin.conf new file mode 100644 index 0000000..748341e --- /dev/null +++ b/deploy/nginx-admin.conf @@ -0,0 +1,17 @@ +# Example: admin panel at https://parche.montech.ir/admin/ +# Place dist/ contents in the server path mapped to /admin/ + +location /admin/ { + alias /var/www/parche/admin/; + try_files $uri $uri/ /admin/index.html; +} + +location ~ ^/admin/assets/ { + alias /var/www/parche/admin/assets/; + expires 7d; + add_header Cache-Control "public, immutable"; + types { + application/javascript js; + text/css css; + } +} diff --git a/env.d.ts b/env.d.ts new file mode 100644 index 0000000..a1b07af --- /dev/null +++ b/env.d.ts @@ -0,0 +1,2 @@ +/// +/// diff --git a/eslint.config.ts b/eslint.config.ts new file mode 100644 index 0000000..89fdc89 --- /dev/null +++ b/eslint.config.ts @@ -0,0 +1,26 @@ +import { globalIgnores } from 'eslint/config' +import { defineConfigWithVueTs, vueTsConfigs } from '@vue/eslint-config-typescript' +import pluginVue from 'eslint-plugin-vue' +import pluginOxlint from 'eslint-plugin-oxlint' +import skipFormatting from 'eslint-config-prettier/flat' + +// To allow more languages other than `ts` in `.vue` files, uncomment the following lines: +// import { configureVueProject } from '@vue/eslint-config-typescript' +// configureVueProject({ scriptLangs: ['ts', 'tsx'] }) +// More info at https://github.com/vuejs/eslint-config-typescript/#advanced-setup + +export default defineConfigWithVueTs( + { + name: 'app/files-to-lint', + files: ['**/*.{vue,ts,mts,tsx}'], + }, + + globalIgnores(['**/dist/**', '**/dist-ssr/**', '**/coverage/**']), + + ...pluginVue.configs['flat/essential'], + vueTsConfigs.recommended, + + ...pluginOxlint.buildFromOxlintConfigFile('.oxlintrc.json'), + + skipFormatting, +) diff --git a/index.html b/index.html new file mode 100644 index 0000000..d810e40 --- /dev/null +++ b/index.html @@ -0,0 +1,13 @@ + + + + + + + پنل مدیریت | پارچه + + +
+ + + diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..da02afa --- /dev/null +++ b/package-lock.json @@ -0,0 +1,6297 @@ +{ + "name": "fabric-trade-admin", + "version": "0.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "fabric-trade-admin", + "version": "0.0.0", + "dependencies": { + "@unocss/vite": "^66.7.5", + "@vueuse/core": "^14.4.0", + "lodash-es": "^4.18.1", + "pinia": "^4.0.2", + "unocss": "^66.7.5", + "vue": "^3.5.40", + "vue-router": "^5.2.0" + }, + "devDependencies": { + "@tsconfig/node24": "^24.0.4", + "@types/lodash-es": "^4.17.12", + "@types/node": "^24.13.3", + "@vitejs/plugin-vue": "^6.0.8", + "@vitejs/plugin-vue-jsx": "^5.1.6", + "@vue/eslint-config-typescript": "^14.9.0", + "@vue/tsconfig": "^0.9.1", + "eslint": "^10.7.0", + "eslint-config-prettier": "^10.1.8", + "eslint-plugin-oxlint": "~1.73.0", + "eslint-plugin-vue": "~10.9.2", + "jiti": "^2.7.0", + "npm-run-all2": "^9.0.2", + "oxlint": "~1.74.0", + "prettier": "3.9.5", + "typescript": "~6.0.0", + "vite": "^8.1.5", + "vite-plugin-vue-devtools": "^8.1.5", + "vue-eslint-parser": "^10.4.1", + "vue-tsc": "^3.3.7" + }, + "engines": { + "node": "^22.18.0 || >=24.12.0" + } + }, + "node_modules/@antfu/install-pkg": { + "version": "1.1.0", + "resolved": "https://registry.npmmirror.com/@antfu/install-pkg/-/install-pkg-1.1.0.tgz", + "integrity": "sha512-MGQsmw10ZyI+EJo45CdSER4zEb+p31LpDAFp2Z3gkSd1yqVZGi0Ebx++YTEMonJy4oChEMLsxZ64j8FH6sSqtQ==", + "license": "MIT", + "dependencies": { + "package-manager-detector": "^1.3.0", + "tinyexec": "^1.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.29.7.tgz", + "integrity": "sha512-Aup7aUOfpbAUg2ROOJN6Iw5f9DMBlzu0mIkm/malLQFN/YQgO48wCj0Kxa3sEHJvPVFg7siR+qRInwXd2qhQKw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-validator-identifier": "^7.29.7", + "js-tokens": "^4.0.0", + "picocolors": "^1.1.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/compat-data": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.29.7.tgz", + "integrity": "sha512-locTkQyKvwIEgBzVrn8693ebc97F2U8ZHjbXwDXJ5Fn2TCpNwTlKcaKLkdHop5c/icOFE7qt7Q9JC5hnKNa6Gg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.29.7.tgz", + "integrity": "sha512-RgHBCvtjbOK2gXSNBNIkNoEc9qoVEtau3hj8gEqKQuL3HZAibKarWFEI3Lfm6EYKkLalOh8eSrj9b+ch9H/VBA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.29.7", + "@babel/generator": "^7.29.7", + "@babel/helper-compilation-targets": "^7.29.7", + "@babel/helper-module-transforms": "^7.29.7", + "@babel/helpers": "^7.29.7", + "@babel/parser": "^7.29.7", + "@babel/template": "^7.29.7", + "@babel/traverse": "^7.29.7", + "@babel/types": "^7.29.7", + "@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.8", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.29.8.tgz", + "integrity": "sha512-gZbepsdh3WDtgZKWL+vTPh71LSBrm/Y4/QDZBVCcYfmeTEEuoOYwlSy+G1StfJg+/Zy550u/3TATbm7qDbbMtg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.29.8", + "@babel/types": "^7.29.8", + "@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-annotate-as-pure": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.29.7.tgz", + "integrity": "sha512-OoK6239jHPuSQOoS0kfTVKn0b/rVTk0seKq4Gd2UMLtmOVLjDC0ki3e+c90Trqv2gMfvJFqkiljrr568+qddiw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.29.7.tgz", + "integrity": "sha512-wem6WaBj4NaVYVdNhLPPVacES6ZJ+KBBfSkTMD3YZxbP3rm3Di85tJU5ljaUNhaOynt+Aj0xruhYuzQBt8n71g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/compat-data": "^7.29.7", + "@babel/helper-validator-option": "^7.29.7", + "browserslist": "^4.24.0", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-create-class-features-plugin": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.29.7.tgz", + "integrity": "sha512-IY3ZD9Tmooqr3TUhc3DUWxiuo8xx1DWLhd5M7hQ+ZWJamqM2BbalrBJb2MisSLoYorOj75U03qULCxQTY9r3hg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.29.7", + "@babel/helper-member-expression-to-functions": "^7.29.7", + "@babel/helper-optimise-call-expression": "^7.29.7", + "@babel/helper-replace-supers": "^7.29.7", + "@babel/helper-skip-transparent-expression-wrappers": "^7.29.7", + "@babel/traverse": "^7.29.7", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-globals": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.29.7.tgz", + "integrity": "sha512-3nQVUAtvkKH9zahfWgw96Jc/uFOmjACE1kQz82E2lqWmHBgjzbNlsC22nuQTfahmWeQtTq5nQ/4Nnd2A1wj4zA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-member-expression-to-functions": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.29.7.tgz", + "integrity": "sha512-j+7JYmk1JYDtACIGj0QJqqWZjoUpMoEikQGADMaHgCMCSDqd2+P32rfcibUNrGOMWrlzK1WJBdxrB3JJQZwWtg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.29.7", + "@babel/types": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.29.7.tgz", + "integrity": "sha512-ejHwrQQYcm9xnTivShn2IDOlIzInN34AXskvq9QicvCtEzq1Vzclu/tKF8Jq1Cg8JG2GL6/EmjgsCT7lXepE3g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.29.7", + "@babel/types": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.29.7.tgz", + "integrity": "sha512-UPUVSyXbOh627KiCIGQSgwWzGeBKLkaJ9PJEdrngIwMSzxLR4jS4+f1f1jb7VzBbg8nFLaYotvVPFCTqdrmTAg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-module-imports": "^7.29.7", + "@babel/helper-validator-identifier": "^7.29.7", + "@babel/traverse": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-optimise-call-expression": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.29.7.tgz", + "integrity": "sha512-+kmGVjcT9RGYzoDwdwEqEvGgKe3BYq+O1iGzjFubaNgZHwYHP6lsF2Yghf4kEuv9BV7tYDZ913aBW9am6YKong==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-plugin-utils": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.29.7.tgz", + "integrity": "sha512-G7sHYigPY17oO5SYWnfD/0MTBwVR781S/JI643e/JhUYgVgWE/61SoW3NH9KWUKyKq5LVh3npif99Wkt6j86Jw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-replace-supers": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.29.7.tgz", + "integrity": "sha512-atfGXWSeCiF4DnKZIfmJfQRkSw9b9gNNXR1kqKjbhG4pGYCOnkp8OcTB8E3NXjBu8NpheSnOeNKz8KT7UNFTmQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-member-expression-to-functions": "^7.29.7", + "@babel/helper-optimise-call-expression": "^7.29.7", + "@babel/traverse": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-skip-transparent-expression-wrappers": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.29.7.tgz", + "integrity": "sha512-brcMGQaVzIeUb+6/bs1Av0f8YuNNjKY2JyvfRCsFuFsdKccEQ5Ges2y74D74NZ1Rz8lKJ9ksJkfqwQFJ/iNEyQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.29.7", + "@babel/types": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.29.7.tgz", + "integrity": "sha512-Pb5ijPrZ89GDH8223L4UP8i6QApWxs04RbPQJTeWDV0/keR2E36MeKnyr6LYmUUvqRRI+Iv87SuF1W6ErINzYw==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.29.7.tgz", + "integrity": "sha512-qehxGkRj55h/ff8EMaJ+cYhyaKlHIxqYDn682wQD7RNp9UujOQsHog2uS0r2vzr4pW+sXf90NeeayjcNaX3fFg==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-option": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.29.7.tgz", + "integrity": "sha512-N9ZErrD+yW5geCDtBqnOoxmR8+tNKiGuxKlDpuJxfsqpa2dFcexaziGAE/qoHLiDDreVNMupxGmSoNlyvsA3gw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.29.7.tgz", + "integrity": "sha512-1k2lAGRMfHTcwuNYcCNUmaUffmQv8KWMfh2iJUUeRlwlwH4FdNG7mfPI10NPfLHJFThE4Tyr4mv7kTNZOiPuBg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/template": "^7.29.7", + "@babel/types": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.29.8", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.29.8.tgz", + "integrity": "sha512-E8lTAYNB1KW+FH+VGJuZM1ioAx2E6oVlvQFRrf5P8ZZmsiJXYAD9vTFV7yyEURNzgh1dFqMZuO6tUwcARbqFCA==", + "license": "MIT", + "dependencies": { + "@babel/types": "^7.29.8" + }, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/plugin-proposal-decorators": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.29.7.tgz", + "integrity": "sha512-EtU0Hi3GvrTqD56xKmZvV/uCXK2ZbwVNPNLAquVItcAZpUhkXwWlo3Fmj0c2LxgSf2I8IDULeAepwNP1OefLXg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.29.7", + "@babel/helper-plugin-utils": "^7.29.7", + "@babel/plugin-syntax-decorators": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-decorators": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.29.7.tgz", + "integrity": "sha512-9MTTLbF39X6sqM92JPEsoI7++26hjZvzkxKZy64aMhWLH2mPkJ/Q3AV4QLmls3R14FpSpkOwQQfUh962JGQxxg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-import-attributes": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.29.7.tgz", + "integrity": "sha512-zGYcYfq/WmZ4V+kBIXQon9dSSc8ircGZqw9ZaNhhGj9nZkeBu1jHLBDQqYYi5WA9uawvA2sIMbry2nCFhf5Djg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-import-meta": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", + "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-jsx": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.29.7.tgz", + "integrity": "sha512-TSu8+mHCoEaaCDEZ0I3+6mvTBYR4PCxQwf2z9/r5Tbztv6NaLR3B9thGTTxX2WGuGHJqRiAbKPeGTJ5XWXVg6A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-typescript": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.29.7.tgz", + "integrity": "sha512-ngr+82Sh0xMz25TPCZi+nC2iTzjfCdWS2ONXTp/PtSCHCgaCNBpdMqgvJ2ccdLlClVZ7sisIgB914j/JFe+RZA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-typescript": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.29.7.tgz", + "integrity": "sha512-jK52h8LaLc7JarhQV2ofeFMts4H7vnOXnqZNA6fYglBTZewRBE51KWt3BUltW1P+KoPsYkHoJeXePuz4zo2LMw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.29.7", + "@babel/helper-create-class-features-plugin": "^7.29.7", + "@babel/helper-plugin-utils": "^7.29.7", + "@babel/helper-skip-transparent-expression-wrappers": "^7.29.7", + "@babel/plugin-syntax-typescript": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/template": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.29.7.tgz", + "integrity": "sha512-puq+Gf35oI24FeN11LkoUQFqv9uwNeWpxXZi/Ji3rRIoKAzKnxRaZ+Gkj0vKS9ZCiTESfng1N9LyOyXvo+m+Gg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.29.7", + "@babel/parser": "^7.29.7", + "@babel/types": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.29.8", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.29.8.tgz", + "integrity": "sha512-I5z7H3bf/41ktsNVLtpN0wAa336HkqIHQ5BuPLEhTkt1jVSyZpeNKIzTgEWmlxjdg81R0IgUCcaE+Ok3NvrfZg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.29.7", + "@babel/generator": "^7.29.8", + "@babel/helper-globals": "^7.29.7", + "@babel/parser": "^7.29.8", + "@babel/template": "^7.29.7", + "@babel/types": "^7.29.8", + "debug": "^4.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/types": { + "version": "7.29.8", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.8.tgz", + "integrity": "sha512-Vj1jF3cPfxg7OAfoI7QnVKLoILlm2JF9pnVHrX8qx7AHMiYWT+NDAA7jChlNgRS4WTLc/fD1lXLmPixluj+3Gg==", + "license": "MIT", + "dependencies": { + "@babel/helper-string-parser": "^7.29.7", + "@babel/helper-validator-identifier": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@emnapi/core": { + "version": "2.0.0-alpha.3", + "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-2.0.0-alpha.3.tgz", + "integrity": "sha512-AZypUeJ/yByuxyS7BlSNRDOMLMlROYtjYdIAuBmJssVz1UJDSeYxLrdizhXCFYhedC5bqd/ASy8EuNXbVVXp9g==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@emnapi/wasi-threads": "2.0.1", + "tslib": "^2.4.0" + } + }, + "node_modules/@emnapi/runtime": { + "version": "2.0.0-alpha.3", + "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-2.0.0-alpha.3.tgz", + "integrity": "sha512-hFPAhMUjJD9BSyCANEISPOogeXC9Zo9ZQl7L6vKnaVsMkCtzznaW/naYypeyl0Gv5rYfWYsZbpixTMpjDJzQeA==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@emnapi/wasi-threads": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@emnapi/wasi-threads/-/wasi-threads-2.0.1.tgz", + "integrity": "sha512-9DsSk+o5NBX0CCJT8s0EROGSGxjR/tKu6aBTaVyq+SjAEQH4XcdcRxPBRzsBLizTTJ49MJjF+jgu3qnO9GLQcQ==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@eslint-community/eslint-utils": { + "version": "4.10.1", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.10.1.tgz", + "integrity": "sha512-cuadcxVFE8sDK6iWJbs8Sn0av2Nrh2QSGQhVlBW9AaAHqHwjWsZHT8LJ4hFGPh7ASBV2deFdM7H/DPjulmh8rg==", + "dev": true, + "license": "MIT", + "dependencies": { + "eslint-visitor-keys": "^3.4.3" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" + } + }, + "node_modules/@eslint-community/regexpp": { + "version": "4.12.2", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.2.tgz", + "integrity": "sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + } + }, + "node_modules/@eslint/config-array": { + "version": "0.23.5", + "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.23.5.tgz", + "integrity": "sha512-Y3kKLvC1dvTOT+oGlqNQ1XLqK6D1HU2YXPc52NmAlJZbMMWDzGYXMiPRJ8TYD39muD/OTjlZmNJ4ib7dvSrMBA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@eslint/object-schema": "^3.0.5", + "debug": "^4.3.1", + "minimatch": "^10.2.4" + }, + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + } + }, + "node_modules/@eslint/config-helpers": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.7.0.tgz", + "integrity": "sha512-DObd/KKUsU+FaFv4PLxSRenpXfQWmPXXP3pPZ6/K1PCrMu2vQpMDMuQe/BqYeoLcz8ro0bVDF1RxOJgfVEdhUw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@eslint/core": "^1.2.1" + }, + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + } + }, + "node_modules/@eslint/core": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@eslint/core/-/core-1.2.1.tgz", + "integrity": "sha512-MwcE1P+AZ4C6DWlpin/OmOA54mmIZ/+xZuJiQd4SyB29oAJjN30UW9wkKNptW2ctp4cEsvhlLY/CsQ1uoHDloQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@types/json-schema": "^7.0.15" + }, + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + } + }, + "node_modules/@eslint/object-schema": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-3.0.5.tgz", + "integrity": "sha512-vqTaUEgxzm+YDSdElad6PiRoX4t8VGDjCtt05zn4nU810UIx/uNEV7/lZJ6KwFThKZOzOxzXy48da+No7HZaMw==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + } + }, + "node_modules/@eslint/plugin-kit": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.7.2.tgz", + "integrity": "sha512-+CNAzxglkrpNf/kKywqQfk74QjtceuOE7Qm+AF8miRvPF/wmmK5+OJOgVh3AVTT3RP2mH3+FOaxlE5v72owk0A==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@eslint/core": "^1.2.1", + "levn": "^0.4.1" + }, + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + } + }, + "node_modules/@humanfs/core": { + "version": "0.19.2", + "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.2.tgz", + "integrity": "sha512-UhXNm+CFMWcbChXywFwkmhqjs3PRCmcSa/hfBgLIb7oQ5HNb1wS0icWsGtSAUNgefHeI+eBrA8I1fxmbHsGdvA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@humanfs/types": "^0.15.0" + }, + "engines": { + "node": ">=18.18.0" + } + }, + "node_modules/@humanfs/node": { + "version": "0.16.8", + "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.8.tgz", + "integrity": "sha512-gE1eQNZ3R++kTzFUpdGlpmy8kDZD/MLyHqDwqjkVQI0JMdI1D51sy1H958PNXYkM2rAac7e5/CnIKZrHtPh3BQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@humanfs/core": "^0.19.2", + "@humanfs/types": "^0.15.0", + "@humanwhocodes/retry": "^0.4.0" + }, + "engines": { + "node": ">=18.18.0" + } + }, + "node_modules/@humanfs/types": { + "version": "0.15.0", + "resolved": "https://registry.npmjs.org/@humanfs/types/-/types-0.15.0.tgz", + "integrity": "sha512-ZZ1w0aoQkwuUuC7Yf+7sdeaNfqQiiLcSRbfI08oAxqLtpXQr9AIVX7Ay7HLDuiLYAaFPu8oBYNq/QIi9URHJ3Q==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=18.18.0" + } + }, + "node_modules/@humanwhocodes/module-importer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=12.22" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@humanwhocodes/retry": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.3.tgz", + "integrity": "sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=18.18" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@iconify/types": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/@iconify/types/-/types-2.0.0.tgz", + "integrity": "sha512-+wluvCrRhXrhyOmRDJ3q8mux9JkKy5SJ/v8ol2tu4FVjyYvtEzkc/3pK15ET6RKg4b4w4BmTk1+gsCUhf21Ykg==", + "license": "MIT" + }, + "node_modules/@iconify/utils": { + "version": "3.1.4", + "resolved": "https://registry.npmmirror.com/@iconify/utils/-/utils-3.1.4.tgz", + "integrity": "sha512-b1S7B1k9ohZ+iNTi2ATxbRYG9fTrJmUT0rc46bvVnNxqNRGW7dyo/vRREwyniI5IRN2RSJHDcm+s3BjWrSAjHw==", + "license": "MIT", + "dependencies": { + "@antfu/install-pkg": "^1.1.0", + "@iconify/types": "^2.0.0", + "import-meta-resolve": "^4.2.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==", + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.0", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/remapping": { + "version": "2.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz", + "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==", + "license": "MIT", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", + "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", + "license": "MIT" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.31", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", + "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@napi-rs/wasm-runtime": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-1.2.2.tgz", + "integrity": "sha512-JfB4kuJQjaoHuCTseIINHtHWeJnvgEcxjwA5t/Y00ZgaOO1Crz3fjT/p8kT28zA/Caz7oiUMn3d6H2yOVCVwuw==", + "license": "MIT", + "optional": true, + "dependencies": { + "@tybys/wasm-util": "^0.10.3" + }, + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=23.5.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/Brooooooklyn" + }, + "peerDependencies": { + "@emnapi/core": "^1.7.1 || ^2.0.0-alpha.3", + "@emnapi/runtime": "^1.7.1 || ^2.0.0-alpha.3" + } + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@oxc-parser/binding-android-arm-eabi": { + "version": "0.131.0", + "resolved": "https://registry.npmmirror.com/@oxc-parser/binding-android-arm-eabi/-/binding-android-arm-eabi-0.131.0.tgz", + "integrity": "sha512-t2xicr9pfzkSRYx5aPqZqlLaayIwJTqgQ81Jor31Xep2nGyL2Aq3d0K5wOfeR7VevaSdxaS9dzSQP9xDwn8fDg==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxc-parser/binding-android-arm64": { + "version": "0.131.0", + "resolved": "https://registry.npmmirror.com/@oxc-parser/binding-android-arm64/-/binding-android-arm64-0.131.0.tgz", + "integrity": "sha512-nlGIod6gw75x1aEDgLS+srj+JRGY0HHm9MI9YgzE/B64l6d6+H3MSP9NOgp0+HTg8tp4vV9rVfgQGgd+TfVZcA==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxc-parser/binding-darwin-arm64": { + "version": "0.131.0", + "resolved": "https://registry.npmmirror.com/@oxc-parser/binding-darwin-arm64/-/binding-darwin-arm64-0.131.0.tgz", + "integrity": "sha512-jukuV6xe5RbQKFo7QD34NDCLDZp4PSOm8rmckhNdH/60ymG5zXbDzGBEyc+nTkuLQNama2aSGCt+CPfpjNTqyw==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxc-parser/binding-darwin-x64": { + "version": "0.131.0", + "resolved": "https://registry.npmmirror.com/@oxc-parser/binding-darwin-x64/-/binding-darwin-x64-0.131.0.tgz", + "integrity": "sha512-g3JOo4khe9rslHm5WYaVDWb0HS/M1MLR3I9S8560MkKIcC96VQY00QjOlsuRyfSj/JDXj8i9T7ryPO2RidiXVg==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxc-parser/binding-freebsd-x64": { + "version": "0.131.0", + "resolved": "https://registry.npmmirror.com/@oxc-parser/binding-freebsd-x64/-/binding-freebsd-x64-0.131.0.tgz", + "integrity": "sha512-1hziITDTxjMePnX+dR9ocVT+EuZkQ8wm4FPAbmbEiKG+Phbo73J1ZnPAA6Y/aGsWF3McOFnQuZIktAFwalkfJQ==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxc-parser/binding-linux-arm-gnueabihf": { + "version": "0.131.0", + "resolved": "https://registry.npmmirror.com/@oxc-parser/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-0.131.0.tgz", + "integrity": "sha512-9uRxfXwyKG9+MwmGQBo2ncPNwZH5HTmCETFM2WiuDBNDCW4NC5ttSQkwCAMrTAWgwMzVBH1CP8pM0v7nebCWXQ==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxc-parser/binding-linux-arm-musleabihf": { + "version": "0.131.0", + "resolved": "https://registry.npmmirror.com/@oxc-parser/binding-linux-arm-musleabihf/-/binding-linux-arm-musleabihf-0.131.0.tgz", + "integrity": "sha512-mgbLvzRShXOLBdWGInf08Af4q+pfj1xD8hSgLClDZ9of/BXkB6+LIhTH7fihiDUipqB3yoSkKBWaZ3Ejlf5Yag==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxc-parser/binding-linux-arm64-gnu": { + "version": "0.131.0", + "resolved": "https://registry.npmmirror.com/@oxc-parser/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-0.131.0.tgz", + "integrity": "sha512-OPT8++4aN6j2GJ8+3IZHS/byXoZP4aSBn+FoG6rgBJ2fKwPKXWF3MqrFMNW7NKHM28FLY579xYLxJSfgobEqPA==", + "cpu": [ + "arm64" + ], + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxc-parser/binding-linux-arm64-musl": { + "version": "0.131.0", + "resolved": "https://registry.npmmirror.com/@oxc-parser/binding-linux-arm64-musl/-/binding-linux-arm64-musl-0.131.0.tgz", + "integrity": "sha512-vtPiwmfVTAXzaxDKsOXG+LwgRAA7WEnaeHzhS5z0GE89gAK18KSXnly7Z6saXXq6L3dVMyK44uoTI03zKxrpmw==", + "cpu": [ + "arm64" + ], + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxc-parser/binding-linux-ppc64-gnu": { + "version": "0.131.0", + "resolved": "https://registry.npmmirror.com/@oxc-parser/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-0.131.0.tgz", + "integrity": "sha512-8AW8L7w5cGHSdZPcyZX2yR0+GUODsT15rbRjfdD54rv6DMbtuEB19ysLOpKJlRGfH6UNYNpCHaU1uJWgTWf1/w==", + "cpu": [ + "ppc64" + ], + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxc-parser/binding-linux-riscv64-gnu": { + "version": "0.131.0", + "resolved": "https://registry.npmmirror.com/@oxc-parser/binding-linux-riscv64-gnu/-/binding-linux-riscv64-gnu-0.131.0.tgz", + "integrity": "sha512-vvpjkjEOUsPcsYf8evE4MO3aGx9+3wodXEBOicGNnOwTuAik8eBONNkgSdhkGsAblQmfVHJyanRnpxglddTXIA==", + "cpu": [ + "riscv64" + ], + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxc-parser/binding-linux-riscv64-musl": { + "version": "0.131.0", + "resolved": "https://registry.npmmirror.com/@oxc-parser/binding-linux-riscv64-musl/-/binding-linux-riscv64-musl-0.131.0.tgz", + "integrity": "sha512-AqmcNC3fClXX+fxQ6VGEN1667xVFiRBkY0CZmDMSiaeFUsv1+UkBPYYi48IUKcA9/ivvoKNRzQl2I4//kT9F/w==", + "cpu": [ + "riscv64" + ], + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxc-parser/binding-linux-s390x-gnu": { + "version": "0.131.0", + "resolved": "https://registry.npmmirror.com/@oxc-parser/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-0.131.0.tgz", + "integrity": "sha512-7d3jOMKy7RSQCcDLIci+ySll2FgsOMl/GiRux4q2JNv0zg4EdhFISa9idvrdN/HEUIQQJNg6dmveUeJl2YErGA==", + "cpu": [ + "s390x" + ], + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxc-parser/binding-linux-x64-gnu": { + "version": "0.131.0", + "resolved": "https://registry.npmmirror.com/@oxc-parser/binding-linux-x64-gnu/-/binding-linux-x64-gnu-0.131.0.tgz", + "integrity": "sha512-JHK/h95qVqVQ+ITER837kcTdwBDFpFaNnOTYGCP0zdUSX/mLKC7tXOoyrTb6vG7iRPwGlcgBil3v2IjYw1FqJA==", + "cpu": [ + "x64" + ], + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxc-parser/binding-linux-x64-musl": { + "version": "0.131.0", + "resolved": "https://registry.npmmirror.com/@oxc-parser/binding-linux-x64-musl/-/binding-linux-x64-musl-0.131.0.tgz", + "integrity": "sha512-b2BO82O8azXAyf7EUgOPKu145nWypbNyk07HbU09fkzhm9lEA5oPvaN/M8Nlo7tOErVTa2WOgS4QbOnxAPXdDQ==", + "cpu": [ + "x64" + ], + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxc-parser/binding-openharmony-arm64": { + "version": "0.131.0", + "resolved": "https://registry.npmmirror.com/@oxc-parser/binding-openharmony-arm64/-/binding-openharmony-arm64-0.131.0.tgz", + "integrity": "sha512-GHO9glZaX7LkX/OGfluEPf1yjg+ehiFbUdowbX6uNWOQhmwKWU4m4+nZ9FJkrHNKuxyI1KKertMdGjVKCApKWA==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxc-parser/binding-wasm32-wasi": { + "version": "0.131.0", + "resolved": "https://registry.npmmirror.com/@oxc-parser/binding-wasm32-wasi/-/binding-wasm32-wasi-0.131.0.tgz", + "integrity": "sha512-3SkikPaEFoih1N83qLVEDLRLeY4nYsf6JT9SnWiMCQ5lGQdKup6bEuKCqkRiG9dD1IIaFeYz9RjlciPmYoFIWA==", + "cpu": [ + "wasm32" + ], + "license": "MIT", + "optional": true, + "dependencies": { + "@emnapi/core": "1.10.0", + "@emnapi/runtime": "1.10.0", + "@napi-rs/wasm-runtime": "^1.1.4" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxc-parser/binding-wasm32-wasi/node_modules/@emnapi/core": { + "version": "1.10.0", + "resolved": "https://registry.npmmirror.com/@emnapi/core/-/core-1.10.0.tgz", + "integrity": "sha512-yq6OkJ4p82CAfPl0u9mQebQHKPJkY7WrIuk205cTYnYe+k2Z8YBh11FrbRG/H6ihirqcacOgl2BIO8oyMQLeXw==", + "license": "MIT", + "optional": true, + "dependencies": { + "@emnapi/wasi-threads": "1.2.1", + "tslib": "^2.4.0" + } + }, + "node_modules/@oxc-parser/binding-wasm32-wasi/node_modules/@emnapi/runtime": { + "version": "1.10.0", + "resolved": "https://registry.npmmirror.com/@emnapi/runtime/-/runtime-1.10.0.tgz", + "integrity": "sha512-ewvYlk86xUoGI0zQRNq/mC+16R1QeDlKQy21Ki3oSYXNgLb45GV1P6A0M+/s6nyCuNDqe5VpaY84BzXGwVbwFA==", + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@oxc-parser/binding-wasm32-wasi/node_modules/@emnapi/wasi-threads": { + "version": "1.2.1", + "resolved": "https://registry.npmmirror.com/@emnapi/wasi-threads/-/wasi-threads-1.2.1.tgz", + "integrity": "sha512-uTII7OYF+/Mes/MrcIOYp5yOtSMLBWSIoLPpcgwipoiKbli6k322tcoFsxoIIxPDqW01SQGAgko4EzZi2BNv2w==", + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@oxc-parser/binding-win32-arm64-msvc": { + "version": "0.131.0", + "resolved": "https://registry.npmmirror.com/@oxc-parser/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-0.131.0.tgz", + "integrity": "sha512-Os5bEhryeA2jkH+ZrnZyAC1EP5gs+X4YB1Fjqml7UPD5kU7ecsK1MPEVMfCrdt/GDNpDbavYXiOXOdyJ5b3OPw==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxc-parser/binding-win32-ia32-msvc": { + "version": "0.131.0", + "resolved": "https://registry.npmmirror.com/@oxc-parser/binding-win32-ia32-msvc/-/binding-win32-ia32-msvc-0.131.0.tgz", + "integrity": "sha512-m+jNz9EuF0NXoiptc6B9h5yompZQVW/a5MJeOu5zojfH5yWk82tvF2ccrHkfhgtrS9h9DD5l1Qv8dWlfY7Nz8g==", + "cpu": [ + "ia32" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxc-parser/binding-win32-x64-msvc": { + "version": "0.131.0", + "resolved": "https://registry.npmmirror.com/@oxc-parser/binding-win32-x64-msvc/-/binding-win32-x64-msvc-0.131.0.tgz", + "integrity": "sha512-o14Hk8dAyiEUMFEWEgmAwFZvBt1RzAYLM3xeQ+5315JXgVYhoemivgYcbYVRbsFkS71ShMGlAFE0kPnr460rww==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxc-project/types": { + "version": "0.142.0", + "resolved": "https://registry.npmjs.org/@oxc-project/types/-/types-0.142.0.tgz", + "integrity": "sha512-7W+2q5AKQVU36fkaryontrHn3YDt1RyUYXatw9i5H8ocYe2sPKSFB6eS8WNPeRKiN1qAWWZUPm7gwFzJGrccqQ==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/Boshen" + } + }, + "node_modules/@oxlint/binding-android-arm-eabi": { + "version": "1.74.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-android-arm-eabi/-/binding-android-arm-eabi-1.74.0.tgz", + "integrity": "sha512-+gHd12muVI9ZLBaWLPkHt3Fj7jihFjgQ1MGtBaRL8vWrWrI0P7dLUty/cHrHS0oqPYIRgQUJsPu2CExQuMcwNw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxlint/binding-android-arm64": { + "version": "1.74.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-android-arm64/-/binding-android-arm64-1.74.0.tgz", + "integrity": "sha512-xjKdoMB+H+RCOByv/7l7nfIGW9mlOisqYdcyC75UqYuQecLpReAeEYUf2CNeDEI3KtmUgxpRw/+c63y4AeF/Bw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxlint/binding-darwin-arm64": { + "version": "1.74.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-darwin-arm64/-/binding-darwin-arm64-1.74.0.tgz", + "integrity": "sha512-iUK7wvc6sejMKsC+Pt67mntoF5weFcyEunhZfLJceU6gL419mexz5wBkSx/EnkFBExMLNtOi9fnDSc5xfK0IzQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxlint/binding-darwin-x64": { + "version": "1.74.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-darwin-x64/-/binding-darwin-x64-1.74.0.tgz", + "integrity": "sha512-ggKc/tn5SJ1u2yG2izC6VKODfYKV8MQ2AicJlNzOjuyrC29udvOef6/JzK2r32xqCnBDLFouR1VCkjzEI0/N9Q==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxlint/binding-freebsd-x64": { + "version": "1.74.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-freebsd-x64/-/binding-freebsd-x64-1.74.0.tgz", + "integrity": "sha512-u++dH/43jy9hTLbneaWlS0gla/Bp1JdwJ2zgevCl8nDFUh6qRCGMxcL0f0lb7By3A9p/LfFr+7cG4HU1hG856g==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxlint/binding-linux-arm-gnueabihf": { + "version": "1.74.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-1.74.0.tgz", + "integrity": "sha512-Sj1zmtFDVTPeIbIz4ZfcXAbFHqCmKCXdCUlAJzvTF7I20NTH1RDpoF2PhkqNODutJzVhJYmm3oz0GwgY+tvE2g==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxlint/binding-linux-arm-musleabihf": { + "version": "1.74.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-arm-musleabihf/-/binding-linux-arm-musleabihf-1.74.0.tgz", + "integrity": "sha512-//PKyQb/tQXcHArx2f7z+oVI/eMS2Jpv+edNuAtOrgIhWdGcpHxogveAxzmF2rpH1AIHp4Hq04RF/rgJdiICnQ==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxlint/binding-linux-arm64-gnu": { + "version": "1.74.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.74.0.tgz", + "integrity": "sha512-/k1Me+aX2tjuH10K62mLS0y8cLkJBHX6Ce0xPK+eWeel4bSdEGZ8dv4+hYMzg0GrSmjwy4yAYsDPeEeKBft/2w==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxlint/binding-linux-arm64-musl": { + "version": "1.74.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.74.0.tgz", + "integrity": "sha512-3tFSjBxc5D8/zvjEuLvOqcA8ZXKD0+6NuaVO/edeamNc49MoAsbfaC9s1UiwODwgF6slGaF8yJA2TPkukd77tg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxlint/binding-linux-ppc64-gnu": { + "version": "1.74.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-1.74.0.tgz", + "integrity": "sha512-9QggtPkSPXOCTu8Szis7auOK/sC7KdQaN+/TujP7YVVhzCAOhgdRfgv8uEz0r2tk5xdgus5rLYUrCDoZNtiRUw==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxlint/binding-linux-riscv64-gnu": { + "version": "1.74.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-riscv64-gnu/-/binding-linux-riscv64-gnu-1.74.0.tgz", + "integrity": "sha512-VM5VPUJ4DJIWiK+AZn8FScUqMr6OFrCAYybMYjEEi7W13ParI64MByiXTkKMqZpBmvQ9zxl9Ebq2VUOiZRJYUg==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxlint/binding-linux-riscv64-musl": { + "version": "1.74.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-riscv64-musl/-/binding-linux-riscv64-musl-1.74.0.tgz", + "integrity": "sha512-SaDY1gh9rOA592J54g+gu5hkOFFQBZsMmIYHs+NRHG+Uq0OxtuuCXMWQ3vu1830Eugv5uMXyjG+bv2Z9y4IXjw==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxlint/binding-linux-s390x-gnu": { + "version": "1.74.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-1.74.0.tgz", + "integrity": "sha512-ZATQeHZCyr6MbDveg0obD5sxLHFOghtOdC5jwVwYlvFWqtFOxctgFEG6Ef/64hYvZrWyhyCckB10AelqLopeDA==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxlint/binding-linux-x64-gnu": { + "version": "1.74.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.74.0.tgz", + "integrity": "sha512-+aIvJyrdeD7LwCQ2WYLMUWNmnbeDRSPb40aBYtPjD9+PTqUwgJnk+HK5yLfSMeqXrMrDhE9uTmtt2y50tvjhHw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxlint/binding-linux-x64-musl": { + "version": "1.74.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-x64-musl/-/binding-linux-x64-musl-1.74.0.tgz", + "integrity": "sha512-XyktaR8lhK2qWiCK0Tk8oYD+/cgn+oHA6ddRnxSSXUKkkojkV78CmShZUxQF+yrBFs0SuW+JBOPG6hecyc/iZg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxlint/binding-openharmony-arm64": { + "version": "1.74.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-openharmony-arm64/-/binding-openharmony-arm64-1.74.0.tgz", + "integrity": "sha512-mzbjrPl4neaVUiJ1fUiEUxTGaSZBoiKtaoB6jmIpz9S+VOA2vDYmJpihQ82w6178V5jxziclTg8Cgj5yF6tTDg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxlint/binding-win32-arm64-msvc": { + "version": "1.74.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.74.0.tgz", + "integrity": "sha512-vUAe9okpS2Oa5+lX67lqHMuNUvfkleRKwrUDJ/WJBsgmddvZ1mrsh2HVmuFDRzqFELhaJhFaCNOuR6a7L3rtIA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxlint/binding-win32-ia32-msvc": { + "version": "1.74.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-win32-ia32-msvc/-/binding-win32-ia32-msvc-1.74.0.tgz", + "integrity": "sha512-yyXXJyYYSXL4I8K8jAWjJs+J3fa9gH2JmEbo4f5adm+1tNC9itseicBNuwK7BDHvqQ5J534s+yDULu89vYL2ZQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxlint/binding-win32-x64-msvc": { + "version": "1.74.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.74.0.tgz", + "integrity": "sha512-VTC9IYTIMrVUk/i6Ms1ohzzDKZFkWn0KU2OBbPBzgmVZ2V30165T/zK4LztTr0Xgp9fZ1qQZ1rsZAu/rEmySlA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@polka/url": { + "version": "1.0.0-next.29", + "resolved": "https://registry.npmjs.org/@polka/url/-/url-1.0.0-next.29.tgz", + "integrity": "sha512-wwQAWhWSuHaag8c4q/KN/vCoeOJYshAIvMQwD4GpSb3OiZklFfvAgmj0VCBBImRpuF/aFgIRzllXlVX93Jevww==", + "license": "MIT" + }, + "node_modules/@quansync/fs": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/@quansync/fs/-/fs-1.0.0.tgz", + "integrity": "sha512-4TJ3DFtlf1L5LDMaM6CanJ/0lckGNtJcMjQ1NAV6zDmA0tEHKZtxNKin8EgPaVX1YzljbxckyT2tJrpQKAtngQ==", + "license": "MIT", + "dependencies": { + "quansync": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sxzz" + } + }, + "node_modules/@quansync/fs/node_modules/quansync": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/quansync/-/quansync-1.0.0.tgz", + "integrity": "sha512-5xZacEEufv3HSTPQuchrvV6soaiACMFnq1H8wkVioctoH3TRha9Sz66lOxRwPK/qZj7HPiSveih9yAyh98gvqA==", + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/antfu" + }, + { + "type": "individual", + "url": "https://github.com/sponsors/sxzz" + } + ], + "license": "MIT" + }, + "node_modules/@rolldown/binding-android-arm64": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@rolldown/binding-android-arm64/-/binding-android-arm64-1.2.1.tgz", + "integrity": "sha512-02hOeOSryYxVrOIphmLAsqnCJWxwlzFk+pEt/N/i6OgT3lShHO7xGCU5cpgchRDHboAEbSjzgGh+O/u1GswQmA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-darwin-arm64": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-arm64/-/binding-darwin-arm64-1.2.1.tgz", + "integrity": "sha512-fMsTOnN0OjFm3CyppWPitKnc8UlliVARUULW6cfU6AIqjdtgmSFWSk9vecHzZduv/yMWIHDlRhM1e8Iff9uAfA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-darwin-x64": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-x64/-/binding-darwin-x64-1.2.1.tgz", + "integrity": "sha512-1wjKdz/XLGKHaTNHjQveQ/B23TKx4ItAqm1JbyVuvNPc4Ze0Fb48s49TAd/2zcplPl8okE/UbTgmlVfwT7eFeQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-freebsd-x64": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@rolldown/binding-freebsd-x64/-/binding-freebsd-x64-1.2.1.tgz", + "integrity": "sha512-Fa0jHR07E7YBN4vOEsbVf2briYNsuOowfLJaXULZM0ldMlaCaj2LJgLMbMe4iacRyZmvR8efFhgR9wKuGclQUg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-arm-gnueabihf": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-1.2.1.tgz", + "integrity": "sha512-pzkgu1SSHGgRRyRZ4fbmSgmajbVt+epaLP99NDjFft69v/ypfTi6swBMiVdh2EkQ0OSnHE1lZDM7DRGkyAzUpA==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-arm64-gnu": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.2.1.tgz", + "integrity": "sha512-QI5SEDY8cbiYWHx0VO4vIc3UlS6a32vXHjU8Qy/17adEmZIPuByJg13UEvo9c/UCiUkdcVWY83C+b+JrwnNyUg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-arm64-musl": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.2.1.tgz", + "integrity": "sha512-Sm41FyCeXqmYcERoYOCbGIL5hNfd8w9LQ7Y61Bev48HkcjaJqV/iiVOaiDxjVTRMS+QKrZmD8cfPt4uMVnvM+A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-ppc64-gnu": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-1.2.1.tgz", + "integrity": "sha512-2x+WhXTGl9yJYPbltW/BSEPTVz9OIWQyER4N+gJEDWkkn904eRcBzELqh/Hf7K0w/ubGbKNMv0ZC+94QK/IFEg==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-s390x-gnu": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-1.2.1.tgz", + "integrity": "sha512-eEjmQpuRQayHPWWnywaWHkFT3ToPbP3RYy42VVd/B9aBGDA+Ol25EIWHxKQST3IiWJjikCWUF7KtbfqwZrzVwQ==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-x64-gnu": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.2.1.tgz", + "integrity": "sha512-/Orga1fZYkLc/56jBICcHrKchl8Z2UKdDSr3LG9ToWO1lQ6a4Livk9Xz+9WN91zsz5QR3XQz2NNoSDEvP6qadw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-x64-musl": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-musl/-/binding-linux-x64-musl-1.2.1.tgz", + "integrity": "sha512-xxBJRL+0q0Kce7orznGWLuylHDY65vuARXZRpX+hPdv+DqK2c3NlCsVA98tlWzWNEE7yPqA/1NQ5nnCrj49Y5A==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-openharmony-arm64": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@rolldown/binding-openharmony-arm64/-/binding-openharmony-arm64-1.2.1.tgz", + "integrity": "sha512-M6AdXIXw3s+/8XpKMzdGDEXGS1S7kwUsy+rcTIUIOx5Ge4nXKCtAFHFV9YKkXvGcC5WMoTjAteLzlsQROVI0Yw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-wasm32-wasi": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@rolldown/binding-wasm32-wasi/-/binding-wasm32-wasi-1.2.1.tgz", + "integrity": "sha512-/TX0SoRGojHzSAHpfVBbavRVSazg5U3h3Y3VXfcc0cdugq6kxdqw8LPGFiPr+/7gE/60zRcsOY2Vi9b9eT0jww==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@emnapi/core": "2.0.0-alpha.3", + "@emnapi/runtime": "2.0.0-alpha.3", + "@napi-rs/wasm-runtime": "^1.2.0" + }, + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=23.5.0" + } + }, + "node_modules/@rolldown/binding-win32-arm64-msvc": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.2.1.tgz", + "integrity": "sha512-EvRrivJieyHG+AO9lleZWgq+g0+S7oV2C51yuqlcyU/R9net+sI4Pj0F+lUoP2bEr6TWX3SqFaaS0SzfLxSzkw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-win32-x64-msvc": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.2.1.tgz", + "integrity": "sha512-Z4eCmn5QJ/5+azF9knpLWKfVd9aidn0mAe9TpJgvBLId9Ax3t0+JVxBmT25Bv7NBbVW1TZyKjQjQReouMeH5UQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/pluginutils": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.1.tgz", + "integrity": "sha512-2j9bGt5Jh8hj+vPtgzPtl72j0yRxHAyumoo6TNfAjsLB04UtpSvPbPcDcBMxz7n+9CYB0c1GxQFxYRg2jimqGw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@tsconfig/node24": { + "version": "24.0.4", + "resolved": "https://registry.npmjs.org/@tsconfig/node24/-/node24-24.0.4.tgz", + "integrity": "sha512-2A933l5P5oCbv6qSxHs7ckKwobs8BDAe9SJ/Xr2Hy+nDlwmLE1GhFh/g/vXGRZWgxBg9nX/5piDtHR9Dkw/XuA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@tybys/wasm-util": { + "version": "0.10.3", + "resolved": "https://registry.npmjs.org/@tybys/wasm-util/-/wasm-util-0.10.3.tgz", + "integrity": "sha512-F3fo1MYrRJYL3zER0OUOmkutjr1Vp23m7OsSgp7nq4SP6OqX6C/56XFIPAl5bt3zaBRjmW7SGz3u/6LwFpYcOg==", + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@types/esrecurse": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/@types/esrecurse/-/esrecurse-4.3.1.tgz", + "integrity": "sha512-xJBAbDifo5hpffDBuHl0Y8ywswbiAp/Wi7Y/GtAgSlZyIABppyurxVueOPE8LUQOxdlgi6Zqce7uoEpqNTeiUw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/estree": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.9.tgz", + "integrity": "sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg==", + "license": "MIT" + }, + "node_modules/@types/jsesc": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@types/jsesc/-/jsesc-2.5.1.tgz", + "integrity": "sha512-9VN+6yxLOPLOav+7PwjZbxiID2bVaeq0ED4qSQmdQTdjnXJSaCVKTR58t15oqH1H5t8Ng2ZX1SabJVoN9Q34bw==", + "license": "MIT" + }, + "node_modules/@types/json-schema": { + "version": "7.0.15", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", + "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/lodash": { + "version": "4.17.25", + "resolved": "https://registry.npmmirror.com/@types/lodash/-/lodash-4.17.25.tgz", + "integrity": "sha512-+K1NIO8I+F9/wNulfVvu23QYd0Pe9/OCqRrim4NoYIf1VoEDL90Ve4ClzpyqBLc7NpGGWRvYNCKZ1BE/Jpf8dQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/lodash-es": { + "version": "4.17.12", + "resolved": "https://registry.npmmirror.com/@types/lodash-es/-/lodash-es-4.17.12.tgz", + "integrity": "sha512-0NgftHUcV4v34VhXm8QBSftKVXtbkBG3ViCjs6+eJ5a6y6Mi/jiFGPc1sC7QK+9BFhWrURE3EOggmWaSxL9OzQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/lodash": "*" + } + }, + "node_modules/@types/node": { + "version": "24.13.3", + "resolved": "https://registry.npmjs.org/@types/node/-/node-24.13.3.tgz", + "integrity": "sha512-Dh8vAsV36ig5wa9OX4pXvMc9D3Veibfw2wix0CUwYODLD8nkj9UsLjASr49nPg+2eKzxhBV+v7L8pXvT4e639Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "undici-types": "~7.18.0" + } + }, + "node_modules/@types/web-bluetooth": { + "version": "0.0.21", + "resolved": "https://registry.npmmirror.com/@types/web-bluetooth/-/web-bluetooth-0.0.21.tgz", + "integrity": "sha512-oIQLCGWtcFZy2JW77j9k8nHzAOpqMHLQejDA48XXMWH6tjCQHz5RCFz1bzsmROyL6PUm+LLnUiI4BCn221inxA==", + "license": "MIT" + }, + "node_modules/@typescript-eslint/eslint-plugin": { + "version": "8.65.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.65.0.tgz", + "integrity": "sha512-IEgob78X12rHpUmtcwFsXhZdVGJtwTVP8FiCLZkR6GlYVrl2PcuB+KhCE5BlVC/eQpQnu8WXRtkHZuPar+gCRA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/regexpp": "^4.12.2", + "@typescript-eslint/scope-manager": "8.65.0", + "@typescript-eslint/type-utils": "8.65.0", + "@typescript-eslint/utils": "8.65.0", + "@typescript-eslint/visitor-keys": "8.65.0", + "ignore": "^7.0.5", + "natural-compare": "^1.4.0", + "ts-api-utils": "^2.5.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "@typescript-eslint/parser": "^8.65.0", + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/@typescript-eslint/eslint-plugin/node_modules/ignore": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.6.tgz", + "integrity": "sha512-BAg6QkE8W+TuQLrrw0Ugr7HegXduRuuj8/ti2kSOc+jz1dmx8/WNcjr6XGnq5YpDWxFwwaavqD0+jIUOKelTsw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/@typescript-eslint/parser": { + "version": "8.65.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.65.0.tgz", + "integrity": "sha512-CZ4nMxWwgu1HEEFNkeaCptra9QCtkmKdgf3sWh1rl1trIhmxLilgTV4cwcbQ4wemnT4sWQN8CaKOmdYx+g2gMA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/scope-manager": "8.65.0", + "@typescript-eslint/types": "8.65.0", + "@typescript-eslint/typescript-estree": "8.65.0", + "@typescript-eslint/visitor-keys": "8.65.0", + "debug": "^4.4.3" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/@typescript-eslint/project-service": { + "version": "8.65.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.65.0.tgz", + "integrity": "sha512-SxnPhbTsGahizDgbu7oqFH/xVtzIqMd/s+WtnSxNxJZJpLbdT5IPdzg8EZxO3+PoKahXmwJLeNQOpKJb3/bi7Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/tsconfig-utils": "^8.65.0", + "@typescript-eslint/types": "^8.65.0", + "debug": "^4.4.3" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/@typescript-eslint/scope-manager": { + "version": "8.65.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.65.0.tgz", + "integrity": "sha512-Esbl8OSYiVxBokYgWPf7VVWg/BE798wXhimnn9ML9Pt5qoDf8bfQlgjlKXR/k98+AcNzlLKYrpCcrcuZ9DZLgg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.65.0", + "@typescript-eslint/visitor-keys": "8.65.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/tsconfig-utils": { + "version": "8.65.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.65.0.tgz", + "integrity": "sha512-j6GzGqCiRdA7Qhur2VVmKZAkBLfnHFQfx4TaJGL9RMveZqCo48jSHHO0DTgizEnGhtWnqmbtCUSrqSkdiY/0Hg==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/@typescript-eslint/type-utils": { + "version": "8.65.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.65.0.tgz", + "integrity": "sha512-YjaZ7PRI5qY7ax2L3PbvX0rRyGtipAReCWs0mhhDBHjH/vl0g0BonaGXrKdKpMbIIsMIwDgbk/xzkBTyAltS5g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.65.0", + "@typescript-eslint/typescript-estree": "8.65.0", + "@typescript-eslint/utils": "8.65.0", + "debug": "^4.4.3", + "ts-api-utils": "^2.5.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/@typescript-eslint/types": { + "version": "8.65.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.65.0.tgz", + "integrity": "sha512-JSSwWNy+H0E/01jJEM+hrX6N0OFDzFzeIhHFSAS01tlVaevpG8cFyYRPhS5yjGOvBUx3sqQHVMjCL1CAZZMxBg==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/typescript-estree": { + "version": "8.65.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.65.0.tgz", + "integrity": "sha512-JboAE2swaYt4tb1fHhHTABE2K+OLy09XfcTbhnk4Pw96f9dd2e9iYsJ28gBggHlo5z5x1rkyWvcPoTuNTd4oGg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/project-service": "8.65.0", + "@typescript-eslint/tsconfig-utils": "8.65.0", + "@typescript-eslint/types": "8.65.0", + "@typescript-eslint/visitor-keys": "8.65.0", + "debug": "^4.4.3", + "minimatch": "^10.2.2", + "semver": "^7.7.3", + "tinyglobby": "^0.2.15", + "ts-api-utils": "^2.5.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/semver": { + "version": "7.8.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.5.tgz", + "integrity": "sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@typescript-eslint/utils": { + "version": "8.65.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.65.0.tgz", + "integrity": "sha512-gXiwIHsYreboxeJucHKPvgwl7dXt50mF8s1/c00cP/WoVTyWKFdtfhRWwZiXYFU5H2O8vVoSLNrexFZjYS/SGA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.9.1", + "@typescript-eslint/scope-manager": "8.65.0", + "@typescript-eslint/types": "8.65.0", + "@typescript-eslint/typescript-estree": "8.65.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/@typescript-eslint/visitor-keys": { + "version": "8.65.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.65.0.tgz", + "integrity": "sha512-8C71BQkGjiMmXtop7pHVJu1l2NNShFdkCyD6a2ezzs5vU/L3LRtb69EtcteFwz0mYMPzIgOw0n6OV4VBUWZd7A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.65.0", + "eslint-visitor-keys": "^5.0.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/visitor-keys/node_modules/eslint-visitor-keys": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-5.0.1.tgz", + "integrity": "sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@unocss/cli": { + "version": "66.7.5", + "resolved": "https://registry.npmmirror.com/@unocss/cli/-/cli-66.7.5.tgz", + "integrity": "sha512-fgWkECRn2LGVo9sEpmjk/KJ3NSKUDitaZCNrJcEYM93DG+ELriTHcL+VWBlF4rcZf9fdGlq1nKbbRHUZirFCHQ==", + "license": "MIT", + "dependencies": { + "@jridgewell/remapping": "^2.3.5", + "@unocss/config": "66.7.5", + "@unocss/core": "66.7.5", + "@unocss/preset-wind3": "66.7.5", + "@unocss/preset-wind4": "66.7.5", + "@unocss/transformer-directives": "66.7.5", + "cac": "^7.0.0", + "chokidar": "^5.0.0", + "colorette": "^2.0.20", + "consola": "^3.4.2", + "magic-string": "^0.30.21", + "pathe": "^2.0.3", + "perfect-debounce": "^2.1.0", + "tinyglobby": "^0.2.17", + "unplugin-utils": "^0.3.1" + }, + "bin": { + "unocss": "bin/unocss.mjs" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/@unocss/config": { + "version": "66.7.5", + "resolved": "https://registry.npmmirror.com/@unocss/config/-/config-66.7.5.tgz", + "integrity": "sha512-dkPl9glhEahJ+Xoja5ZseKKnH+vZaeaKQzg8b0otcKcPPNrHQgu1nu3QgfeOjnXOGrjZIotHwUeVtt4ZA2Skgg==", + "license": "MIT", + "dependencies": { + "@unocss/core": "66.7.5", + "colorette": "^2.0.20", + "consola": "^3.4.2", + "unconfig": "^7.5.0" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/@unocss/core": { + "version": "66.7.5", + "resolved": "https://registry.npmmirror.com/@unocss/core/-/core-66.7.5.tgz", + "integrity": "sha512-UdJb8MiMywcau8QrWEVgUAz0kvoFHyR+sACwYCgmBh/BpKJGyR/zw/Ys3wvysbm0f+i/20VGBex/QQxYVlzdyQ==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/@unocss/extractor-arbitrary-variants": { + "version": "66.7.5", + "resolved": "https://registry.npmmirror.com/@unocss/extractor-arbitrary-variants/-/extractor-arbitrary-variants-66.7.5.tgz", + "integrity": "sha512-5zOkbnLIJc8E749qNjLXfPHl3FdHloop12h706/ojr6idK4ix0KLm43R//uLnphixCehdHJRuHnavnM4C/kQbA==", + "license": "MIT", + "dependencies": { + "@unocss/core": "66.7.5" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/@unocss/inspector": { + "version": "66.7.5", + "resolved": "https://registry.npmmirror.com/@unocss/inspector/-/inspector-66.7.5.tgz", + "integrity": "sha512-WmTJMnj8bmRxvw/wGeShmL2eEHr2/L0BdGTXSxhfzwcO8y5XZEbBmVciLcM7pqaTXQ6JY4+KnITrDUf1urjZxQ==", + "license": "MIT", + "dependencies": { + "@unocss/core": "66.7.5", + "@unocss/rule-utils": "66.7.5", + "colorette": "^2.0.20", + "gzip-size": "^6.0.0", + "sirv": "^3.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/@unocss/preset-attributify": { + "version": "66.7.5", + "resolved": "https://registry.npmmirror.com/@unocss/preset-attributify/-/preset-attributify-66.7.5.tgz", + "integrity": "sha512-1Oi1Cp81pqYJwG3h4+OlP5A0FKyaa07MFBXaXc4Yr3faiTbsI8SKj2TqnZCb+NQvBsEqslEd+jKXGZ3lKzCVOQ==", + "license": "MIT", + "dependencies": { + "@unocss/core": "66.7.5" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/@unocss/preset-icons": { + "version": "66.7.5", + "resolved": "https://registry.npmmirror.com/@unocss/preset-icons/-/preset-icons-66.7.5.tgz", + "integrity": "sha512-ZsxadWnGGtHdANTikuMnjkQaT1qwUFJHZBF4fzVsPMnUiiKGs8rzXukwM9w3Gi9ontM7nbG2FYi9clWETSlpFg==", + "license": "MIT", + "dependencies": { + "@iconify/utils": "^3.1.3", + "@unocss/core": "66.7.5", + "ofetch": "^1.5.1" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/@unocss/preset-mini": { + "version": "66.7.5", + "resolved": "https://registry.npmmirror.com/@unocss/preset-mini/-/preset-mini-66.7.5.tgz", + "integrity": "sha512-o37TSl4ecT0dKu+3/TYuTYht75h82SEwDNl476m9ve0KW4Pv1O2tT/9TWd7N5cutEpySr8/YtjMwtWBD+drxBg==", + "license": "MIT", + "dependencies": { + "@unocss/core": "66.7.5", + "@unocss/extractor-arbitrary-variants": "66.7.5", + "@unocss/rule-utils": "66.7.5" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/@unocss/preset-tagify": { + "version": "66.7.5", + "resolved": "https://registry.npmmirror.com/@unocss/preset-tagify/-/preset-tagify-66.7.5.tgz", + "integrity": "sha512-/8YB1tXVi+WmNKPhsCdtO1xnQKEkshSnWDp6AbvVP3f6qOF7adlMYpAt3kpWCoVUBsfOQ06ZQlnfricMjObyoQ==", + "license": "MIT", + "dependencies": { + "@unocss/core": "66.7.5" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/@unocss/preset-typography": { + "version": "66.7.5", + "resolved": "https://registry.npmmirror.com/@unocss/preset-typography/-/preset-typography-66.7.5.tgz", + "integrity": "sha512-2dxC8LT9KYa29UZT4muDFl7DbIXvKktTfeSMbUGMdZKbHcuMtKSP2U52wti1PL5I9duqp4v+8G33EeVutGTUaQ==", + "license": "MIT", + "dependencies": { + "@unocss/core": "66.7.5", + "@unocss/rule-utils": "66.7.5" + } + }, + "node_modules/@unocss/preset-uno": { + "version": "66.7.5", + "resolved": "https://registry.npmmirror.com/@unocss/preset-uno/-/preset-uno-66.7.5.tgz", + "integrity": "sha512-zaUlYgNngbt50fZA/LbtsEnmPKojPqeiXCyUUiKQMv2uJQhncR32xhLZXVQ+TJD7hlfZ+6FAqlco1NIiAcub9w==", + "license": "MIT", + "dependencies": { + "@unocss/core": "66.7.5", + "@unocss/preset-wind3": "66.7.5" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/@unocss/preset-web-fonts": { + "version": "66.7.5", + "resolved": "https://registry.npmmirror.com/@unocss/preset-web-fonts/-/preset-web-fonts-66.7.5.tgz", + "integrity": "sha512-OLLTK7kswdSu51qxEm6O+AehecgCfS08Ivqo+280lKzFW7V1jXr5okeJ1ty+85oHCprJqzcD9iG1khxNRLomcA==", + "license": "MIT", + "dependencies": { + "@unocss/core": "66.7.5", + "ofetch": "^1.5.1" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/@unocss/preset-wind": { + "version": "66.7.5", + "resolved": "https://registry.npmmirror.com/@unocss/preset-wind/-/preset-wind-66.7.5.tgz", + "integrity": "sha512-LVKgGr0A9Lc7F85xGXrrb71DDXMlHGA8bcj/Kht8BCsuRdBZadNbLlnv5qnSJiHYhi3/blzcgVoaeRor6L9yNA==", + "license": "MIT", + "dependencies": { + "@unocss/core": "66.7.5", + "@unocss/preset-wind3": "66.7.5" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/@unocss/preset-wind3": { + "version": "66.7.5", + "resolved": "https://registry.npmmirror.com/@unocss/preset-wind3/-/preset-wind3-66.7.5.tgz", + "integrity": "sha512-atFe/7Qein+oMdyZs0hEo+3EjV99Av2LVxDbzpCungxIfbS3TnQt70EIuHXMPNCVWLYwrMV+/P1n9Ntb0E3mow==", + "license": "MIT", + "dependencies": { + "@unocss/core": "66.7.5", + "@unocss/preset-mini": "66.7.5", + "@unocss/rule-utils": "66.7.5" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/@unocss/preset-wind4": { + "version": "66.7.5", + "resolved": "https://registry.npmmirror.com/@unocss/preset-wind4/-/preset-wind4-66.7.5.tgz", + "integrity": "sha512-n3jIvQv8x1jXpmWfvNFBIqHNARki4mKZXfxAA31gekpXsRRTg16u1+yC1+PBBJgoEDFEnnmKnG7EZP88S8LVXA==", + "license": "MIT", + "dependencies": { + "@unocss/core": "66.7.5", + "@unocss/extractor-arbitrary-variants": "66.7.5", + "@unocss/rule-utils": "66.7.5" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/@unocss/rule-utils": { + "version": "66.7.5", + "resolved": "https://registry.npmmirror.com/@unocss/rule-utils/-/rule-utils-66.7.5.tgz", + "integrity": "sha512-/AKHBRF6ZOexE3EDDv8ZEYh40P5e2Eha41IYUbE1wjigW7++ssmvimSTdufJzZvU5DGP++E3B3WEsFPprZMjAg==", + "license": "MIT", + "dependencies": { + "@unocss/core": "66.7.5", + "magic-string": "^0.30.21" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/@unocss/transformer-attributify-jsx": { + "version": "66.7.5", + "resolved": "https://registry.npmmirror.com/@unocss/transformer-attributify-jsx/-/transformer-attributify-jsx-66.7.5.tgz", + "integrity": "sha512-r8qDwNSt0eGSwWws3xsuIHb3PZYR2embFdYoE67hD/xlYgLjX1uPy/HUlGCSSh4uLc4vVYjurr0Oq5xF/B8YiA==", + "license": "MIT", + "dependencies": { + "@unocss/core": "66.7.5", + "oxc-parser": "^0.131.0", + "oxc-walker": "^0.7.0" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/@unocss/transformer-compile-class": { + "version": "66.7.5", + "resolved": "https://registry.npmmirror.com/@unocss/transformer-compile-class/-/transformer-compile-class-66.7.5.tgz", + "integrity": "sha512-KuECgsGF7tGe808vIvKViEjI0UCUgYgneJfK+/TWBkjC7s8dLVaUtJzzcP9/r6OfGlgyn/x1YTdRqTaCENa7Xg==", + "license": "MIT", + "dependencies": { + "@unocss/core": "66.7.5" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/@unocss/transformer-directives": { + "version": "66.7.5", + "resolved": "https://registry.npmmirror.com/@unocss/transformer-directives/-/transformer-directives-66.7.5.tgz", + "integrity": "sha512-VMJApXXOwlDubkW+cNMmOkfxLefFupJr+yU23gGYUB2NPsuVltc8H5CDM0gfVebpeL5CUW05evxzEAk2wsju+Q==", + "license": "MIT", + "dependencies": { + "@unocss/core": "66.7.5", + "@unocss/rule-utils": "66.7.5", + "css-tree": "^3.2.1" + } + }, + "node_modules/@unocss/transformer-variant-group": { + "version": "66.7.5", + "resolved": "https://registry.npmmirror.com/@unocss/transformer-variant-group/-/transformer-variant-group-66.7.5.tgz", + "integrity": "sha512-iDmP3mM8J+IxuQf5Uh33zsi528xnGxTpKRJ0c+LCrqBTTkR2tZr4aCzNmJ0g29Js2yEOsyNXRRc8BNTuvgn0AA==", + "license": "MIT", + "dependencies": { + "@unocss/core": "66.7.5" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/@unocss/vite": { + "version": "66.7.5", + "resolved": "https://registry.npmmirror.com/@unocss/vite/-/vite-66.7.5.tgz", + "integrity": "sha512-1z1TBCNJCR2WzjPtjzmCHr8rtzXHosMjLdsCNe6Mzsfwiw044gzzLVuiEZO9vIjkI50lvQ+gIOxOiVQG0hGAeA==", + "license": "MIT", + "dependencies": { + "@jridgewell/remapping": "^2.3.5", + "@unocss/config": "66.7.5", + "@unocss/core": "66.7.5", + "@unocss/inspector": "66.7.5", + "chokidar": "^5.0.0", + "magic-string": "^0.30.21", + "pathe": "^2.0.3", + "tinyglobby": "^0.2.17", + "unplugin-utils": "^0.3.1" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + }, + "peerDependencies": { + "vite": "^5.0.0-0 || ^6.0.0-0 || ^7.0.0-0 || ^8.0.0-0" + } + }, + "node_modules/@vitejs/plugin-vue": { + "version": "6.0.8", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-vue/-/plugin-vue-6.0.8.tgz", + "integrity": "sha512-0ZjgOg7oO6farnNGup7yvoM/YXZV84OZxHAwtflItNa/6zzQyVb5LNxyea3FEKEX2XlagIKzrlH7wwxkKgtiew==", + "dev": true, + "license": "MIT", + "dependencies": { + "@rolldown/pluginutils": "^1.0.1" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "peerDependencies": { + "vite": "^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0", + "vue": "^3.2.25" + } + }, + "node_modules/@vitejs/plugin-vue-jsx": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-vue-jsx/-/plugin-vue-jsx-5.1.6.tgz", + "integrity": "sha512-YXvi4as2clxt6DFw5+a0tTA97ntiQXm/raR8ofNj3aNwwdlVGTiG2gp7EvfZW17P50acL/9bP0ccF4XnqNmlgA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.29.0", + "@babel/plugin-syntax-typescript": "^7.29.7", + "@babel/plugin-transform-typescript": "^7.29.7", + "@rolldown/pluginutils": "^1.0.1", + "@vue/babel-plugin-jsx": "^2.0.1" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "peerDependencies": { + "vite": "^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0", + "vue": "^3.0.0" + } + }, + "node_modules/@volar/language-core": { + "version": "2.4.28", + "resolved": "https://registry.npmjs.org/@volar/language-core/-/language-core-2.4.28.tgz", + "integrity": "sha512-w4qhIJ8ZSitgLAkVay6AbcnC7gP3glYM3fYwKV3srj8m494E3xtrCv6E+bWviiK/8hs6e6t1ij1s2Endql7vzQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@volar/source-map": "2.4.28" + } + }, + "node_modules/@volar/source-map": { + "version": "2.4.28", + "resolved": "https://registry.npmjs.org/@volar/source-map/-/source-map-2.4.28.tgz", + "integrity": "sha512-yX2BDBqJkRXfKw8my8VarTyjv48QwxdJtvRgUpNE5erCsgEUdI2DsLbpa+rOQVAJYshY99szEcRDmyHbF10ggQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@volar/typescript": { + "version": "2.4.28", + "resolved": "https://registry.npmjs.org/@volar/typescript/-/typescript-2.4.28.tgz", + "integrity": "sha512-Ja6yvWrbis2QtN4ClAKreeUZPVYMARDYZl9LMEv1iQ1QdepB6wn0jTRxA9MftYmYa4DQ4k/DaSZpFPUfxl8giw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@volar/language-core": "2.4.28", + "path-browserify": "^1.0.1", + "vscode-uri": "^3.0.8" + } + }, + "node_modules/@vue-macros/common": { + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/@vue-macros/common/-/common-3.1.4.tgz", + "integrity": "sha512-/5Fv+6DgIcM9ajY05ZmKBv+LMX1M9A0X+IUwDRVdt67ciw8OV9bvG2r34p3RiEadlsQybjhKPRKNXDC8Bp23cw==", + "license": "MIT", + "dependencies": { + "@vue/compiler-sfc": "^3.5.22", + "ast-kit": "^2.1.2", + "local-pkg": "^1.1.2", + "magic-string-ast": "^1.0.2", + "unplugin-utils": "^0.3.0" + }, + "engines": { + "node": ">=20.19.0" + }, + "funding": { + "url": "https://github.com/sponsors/vue-macros" + }, + "peerDependencies": { + "vue": "^2.7.0 || ^3.2.25" + }, + "peerDependenciesMeta": { + "vue": { + "optional": true + } + } + }, + "node_modules/@vue/babel-helper-vue-transform-on": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@vue/babel-helper-vue-transform-on/-/babel-helper-vue-transform-on-2.0.1.tgz", + "integrity": "sha512-uZ66EaFbnnZSYqYEyplWvn46GhZ1KuYSThdT68p+am7MgBNbQ3hphTL9L+xSIsWkdktwhPYLwPgVWqo96jDdRA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@vue/babel-plugin-jsx": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@vue/babel-plugin-jsx/-/babel-plugin-jsx-2.0.1.tgz", + "integrity": "sha512-a8CaLQjD/s4PVdhrLD/zT574ZNPnZBOY+IhdtKWRB4HRZ0I2tXBi5ne7d9eCfaYwp5gU5+4KIyFTV1W1YL9xZA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-module-imports": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/plugin-syntax-jsx": "^7.27.1", + "@babel/template": "^7.27.2", + "@babel/traverse": "^7.28.4", + "@babel/types": "^7.28.4", + "@vue/babel-helper-vue-transform-on": "2.0.1", + "@vue/babel-plugin-resolve-type": "2.0.1", + "@vue/shared": "^3.5.22" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + }, + "peerDependenciesMeta": { + "@babel/core": { + "optional": true + } + } + }, + "node_modules/@vue/babel-plugin-resolve-type": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@vue/babel-plugin-resolve-type/-/babel-plugin-resolve-type-2.0.1.tgz", + "integrity": "sha512-ybwgIuRGRRBhOU37GImDoWQoz+TlSqap65qVI6iwg/J7FfLTLmMf97TS7xQH9I7Qtr/gp161kYVdhr1ZMraSYQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.27.1", + "@babel/helper-module-imports": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/parser": "^7.28.4", + "@vue/compiler-sfc": "^3.5.22" + }, + "funding": { + "url": "https://github.com/sponsors/sxzz" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@vue/compiler-core": { + "version": "3.5.40", + "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.5.40.tgz", + "integrity": "sha512-39E8IgOhTbVDnoJFMKc2DvYnypcZwUqgUhQkccva/0m6FUwtIKSGV7n1hpVmYcFaoRAwf9pBcwnKlCEsN63ZEQ==", + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.29.7", + "@vue/shared": "3.5.40", + "entities": "^7.0.1", + "estree-walker": "^2.0.2", + "source-map-js": "^1.2.1" + } + }, + "node_modules/@vue/compiler-dom": { + "version": "3.5.40", + "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.5.40.tgz", + "integrity": "sha512-pwkx4vqlqOspFstrcmzwkKLePVMD3PT65imRzLhanU2V1Fj4K13g6OXjanOyzw3aTAuRk84BOmY8f3rEHqPaVA==", + "license": "MIT", + "dependencies": { + "@vue/compiler-core": "3.5.40", + "@vue/shared": "3.5.40" + } + }, + "node_modules/@vue/compiler-sfc": { + "version": "3.5.40", + "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.5.40.tgz", + "integrity": "sha512-gIf497P4kpuALcvs5n3AEg1Vdn0pSY4XbjASIfHNYF1/MP3T2Mf2STERTubysBxCRxzJGJYtF/O7vwJrxFB3Vw==", + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.29.7", + "@vue/compiler-core": "3.5.40", + "@vue/compiler-dom": "3.5.40", + "@vue/compiler-ssr": "3.5.40", + "@vue/shared": "3.5.40", + "estree-walker": "^2.0.2", + "magic-string": "^0.30.21", + "postcss": "^8.5.19", + "source-map-js": "^1.2.1" + } + }, + "node_modules/@vue/compiler-ssr": { + "version": "3.5.40", + "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.5.40.tgz", + "integrity": "sha512-rrE5xiXG663+vHCHa3J9p2z5OcBRjXmoqenprJxAFQxg5pSshzeBiCE6pu46axapRJ2Adk0YDA2BRZVjiHXnhg==", + "license": "MIT", + "dependencies": { + "@vue/compiler-dom": "3.5.40", + "@vue/shared": "3.5.40" + } + }, + "node_modules/@vue/devtools-api": { + "version": "8.2.1", + "resolved": "https://registry.npmjs.org/@vue/devtools-api/-/devtools-api-8.2.1.tgz", + "integrity": "sha512-6u4vXBlIBAC1wMplIZgpyPn7uh/s4Bf6F5bMzvLv+EdJ0aHs/+4B7Ygv864EStQSjRbsRzTko/kUG1A1IejQ3A==", + "license": "MIT", + "dependencies": { + "@vue/devtools-kit": "^8.2.1" + } + }, + "node_modules/@vue/devtools-core": { + "version": "8.2.1", + "resolved": "https://registry.npmjs.org/@vue/devtools-core/-/devtools-core-8.2.1.tgz", + "integrity": "sha512-s/VfAY9oDTb/kFEWmy461jaFde2MIV1RO/gi1vwM+PAZBZ/Pc2Ndu3BNBdZUze8QDUuyYvElbEEGA83syjJfzA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vue/devtools-kit": "^8.2.1", + "@vue/devtools-shared": "^8.2.1" + }, + "peerDependencies": { + "vue": "^3.0.0" + } + }, + "node_modules/@vue/devtools-kit": { + "version": "8.2.1", + "resolved": "https://registry.npmjs.org/@vue/devtools-kit/-/devtools-kit-8.2.1.tgz", + "integrity": "sha512-FIGIuq3AWReEpbAHY/cRGeHDfI0qOb8OCQ3YjbEAX04uaxIDbGc9rhkbVcG7rnfHPXE3RsU5KrWOu9V/okd8AQ==", + "license": "MIT", + "dependencies": { + "@vue/devtools-shared": "^8.2.1", + "birpc": "^2.6.1", + "hookable": "^5.5.3", + "perfect-debounce": "^2.0.0" + } + }, + "node_modules/@vue/devtools-shared": { + "version": "8.2.1", + "resolved": "https://registry.npmjs.org/@vue/devtools-shared/-/devtools-shared-8.2.1.tgz", + "integrity": "sha512-Fkac7lUdGReh6pVOi3AYPRGe82LQqRmAfThW7RRligOAP0ZA/Z1z9XLHDM9dv34pV2HRc79DK8uKPeG2fLnA/g==", + "license": "MIT" + }, + "node_modules/@vue/eslint-config-typescript": { + "version": "14.9.0", + "resolved": "https://registry.npmjs.org/@vue/eslint-config-typescript/-/eslint-config-typescript-14.9.0.tgz", + "integrity": "sha512-E3j9hDlfVf10F30MRcLTPY2IIhWIx1nsvkVukk14kTcuA+oBVot9zsP1hzsO+PAMDxV3Fd9FimBJtUBNBL5KFA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/utils": "^8.60.0", + "fast-glob": "^3.3.3", + "typescript-eslint": "^8.60.0", + "vue-eslint-parser": "^10.4.0" + }, + "bin": { + "vue-eslint-config-typescript": "dist/bin.js" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "peerDependencies": { + "eslint": "^9.10.0 || ^10.0.0", + "eslint-plugin-vue": "^9.28.0 || ^10.0.0", + "typescript": ">=4.8.4" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@vue/language-core": { + "version": "3.3.9", + "resolved": "https://registry.npmjs.org/@vue/language-core/-/language-core-3.3.9.tgz", + "integrity": "sha512-in/68oAa4BCtVY6n/nkuhLIkV8DHYd2UivedJ6cMZ6UYtlq9jaoaSNUBHYCVO44z3nKg7MdE5OBoHKt5SxeBKQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@volar/language-core": "2.4.28", + "@vue/compiler-dom": "^3.5.0", + "@vue/shared": "^3.5.0", + "alien-signals": "^3.2.1", + "muggle-string": "^0.4.1", + "path-browserify": "^1.0.1", + "picomatch": "^4.0.4" + } + }, + "node_modules/@vue/language-core/node_modules/picomatch": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.5.tgz", + "integrity": "sha512-RvwwcruNjI1ncT5xRakeyS9Lf8lcItv34KD+aif+VH9kduAyfYBipGh12274xtenIPZ119/R9BdTBa8gAwSh0A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/@vue/reactivity": { + "version": "3.5.40", + "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.5.40.tgz", + "integrity": "sha512-B7ot9UlUZOi1zbq61/LvE88ZLTV8IlajTdiZTAEiDQgrnIMIZoPr9kGw0Zw46ObW62O9+H/Be3kMbfb7kYPQZA==", + "license": "MIT", + "dependencies": { + "@vue/shared": "3.5.40" + } + }, + "node_modules/@vue/runtime-core": { + "version": "3.5.40", + "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.5.40.tgz", + "integrity": "sha512-KAZLweuZ6uUJPK1PMSQPgBU5gCjgrrfjUhSglmU9NhH+Zjepa8cnwSydPWDWHDwOgY4g3VcZ+PljbiHlURNCbw==", + "license": "MIT", + "dependencies": { + "@vue/reactivity": "3.5.40", + "@vue/shared": "3.5.40" + } + }, + "node_modules/@vue/runtime-dom": { + "version": "3.5.40", + "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.5.40.tgz", + "integrity": "sha512-ZfrX8ssZQds900L9pr8AuK05ddnMsR4MPMZr8cPN9GoqoPWcXLhjvvbIA2SMv+7a97sJ1vv9pj/zxK0Cq/eEFQ==", + "license": "MIT", + "dependencies": { + "@vue/reactivity": "3.5.40", + "@vue/runtime-core": "3.5.40", + "@vue/shared": "3.5.40", + "csstype": "^3.2.3" + } + }, + "node_modules/@vue/server-renderer": { + "version": "3.5.40", + "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.5.40.tgz", + "integrity": "sha512-XNJym9WpevhTVt1HuwOrCRJ5Q+9z4BjTMrDtjTrvx74SmUll8spNTw6whWJa9mEkO4PKn5TihI/bm/8ds2QVJw==", + "license": "MIT", + "dependencies": { + "@vue/compiler-ssr": "3.5.40", + "@vue/runtime-dom": "3.5.40", + "@vue/shared": "3.5.40" + } + }, + "node_modules/@vue/shared": { + "version": "3.5.40", + "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.5.40.tgz", + "integrity": "sha512-WxnBtruIqOoV3rA4jeKDWzrYI5h7Cp4+pjwDi8kWGHz+IslhiN+wguLVVhtv2l8VoU02rzDCVfDjgCl1lNpZVg==", + "license": "MIT" + }, + "node_modules/@vue/tsconfig": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/@vue/tsconfig/-/tsconfig-0.9.1.tgz", + "integrity": "sha512-buvjm+9NzLCJL29KY1j1991YYJ5e6275OiK+G4jtmfIb+z4POywbdm0wXusT9adVWqe0xqg70TbI7+mRx4uU9w==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "typescript": ">= 5.8", + "vue": "^3.4.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + }, + "vue": { + "optional": true + } + } + }, + "node_modules/@vueuse/core": { + "version": "14.4.0", + "resolved": "https://registry.npmmirror.com/@vueuse/core/-/core-14.4.0.tgz", + "integrity": "sha512-X4WHz1HlCzCBoYXesUkifzzWBAcZgXG8Fi5iNPQg/epdzOB3gu8Fawj3hvuwYR1nGcXGnvxwYYcUC/71++svtQ==", + "license": "MIT", + "dependencies": { + "@types/web-bluetooth": "^0.0.21", + "@vueuse/metadata": "14.4.0", + "@vueuse/shared": "14.4.0" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + }, + "peerDependencies": { + "vue": "^3.5.0" + } + }, + "node_modules/@vueuse/metadata": { + "version": "14.4.0", + "resolved": "https://registry.npmmirror.com/@vueuse/metadata/-/metadata-14.4.0.tgz", + "integrity": "sha512-swx/255R6JyHZFJhx845iz5CRWDZdCfvkZOpACWc5+c5WHcG24mv8gUT1WIdFQaHt6dq79rvILd9QnCWiyVm9g==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/@vueuse/shared": { + "version": "14.4.0", + "resolved": "https://registry.npmmirror.com/@vueuse/shared/-/shared-14.4.0.tgz", + "integrity": "sha512-JRgY90Sz8DDtPMsaDflvPMp9xYk69JZAmbuDvAquUVXKr2gEjqtzGNTTthLfckH0BzBqvnu31gb4a8TGLRe79g==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/antfu" + }, + "peerDependencies": { + "vue": "^3.5.0" + } + }, + "node_modules/acorn": { + "version": "8.18.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.18.0.tgz", + "integrity": "sha512-lGq+9yr1/GuAWaVYIHRjvvySG5/4VfKIvC8EWxStPdcDh/Ka7FG3twP6v4d5BkravUilhIAsG4Qj83t02LWUPQ==", + "license": "MIT", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/ajv": { + "version": "6.15.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.15.0.tgz", + "integrity": "sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/alien-signals": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/alien-signals/-/alien-signals-3.2.1.tgz", + "integrity": "sha512-I8FjmltrfnDFoZedi5CG8DghVYNhzb/Ijluz7tCSJH0xpd0484Kowhbb1XDYOxfJpU1p5wnM2X54dA+IfGyD1g==", + "dev": true, + "license": "MIT" + }, + "node_modules/ansi-styles": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-7.0.0.tgz", + "integrity": "sha512-kKvt3m4uwzqL0wlkPd09CmljPJGOZZ4D0fP65sqFSvPkMRKhNi+74MgIJ5QxE6SxqB4t4KyUFGg8+n5zjo6hew==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=22" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/ansis": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/ansis/-/ansis-4.3.1.tgz", + "integrity": "sha512-BJ8/l4R5LRE7hW9WdSuGYrLSHi2ynxeFpDFbH0K/CgNeY/tyhk+vO6TYxXC5r5CpUhNVX310xzPsN/H9lCdfOA==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=14" + } + }, + "node_modules/ast-kit": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/ast-kit/-/ast-kit-2.2.0.tgz", + "integrity": "sha512-m1Q/RaVOnTp9JxPX+F+Zn7IcLYMzM8kZofDImfsKZd8MbR+ikdOzTeztStWqfrqIxZnYWryyI9ePm3NGjnZgGw==", + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.28.5", + "pathe": "^2.0.3" + }, + "engines": { + "node": ">=20.19.0" + }, + "funding": { + "url": "https://github.com/sponsors/sxzz" + } + }, + "node_modules/ast-walker-scope": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/ast-walker-scope/-/ast-walker-scope-0.9.0.tgz", + "integrity": "sha512-IJdzo2vLiElBxKzwS36VsCue/62d6IdWjnPB2v3nuPKeWGynp6FF/CYoLa5i/3jXH/z97ZDdsXz6abpgM6w07A==", + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.29.2", + "@babel/types": "^7.29.0", + "ast-kit": "^2.2.0" + }, + "engines": { + "node": ">=20.19.0" + }, + "funding": { + "url": "https://github.com/sponsors/sxzz" + } + }, + "node_modules/balanced-match": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz", + "integrity": "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "18 || 20 || >=22" + } + }, + "node_modules/baseline-browser-mapping": { + "version": "2.11.11", + "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.11.11.tgz", + "integrity": "sha512-/yImnXwyTvgMkhgekLHok/Rx5vO6E0BmStWlSqKWMVm2a2ITuZ1Tn+9bgLS+gZRdZmWtd8nxuhHpdmCUOWsTQQ==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "baseline-browser-mapping": "dist/cli.cjs" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/birpc": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/birpc/-/birpc-2.9.0.tgz", + "integrity": "sha512-KrayHS5pBi69Xi9JmvoqrIgYGDkD6mcSe/i6YKi3w5kekCLzrX4+nawcXqrj2tIp50Kw/mT/s3p+GVK0A0sKxw==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/boolbase": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", + "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==", + "dev": true, + "license": "ISC" + }, + "node_modules/brace-expansion": { + "version": "5.0.9", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.9.tgz", + "integrity": "sha512-ScQ4IuvIEF1TMlP7Zt+vjJ//9zlPb2SDcxWxM3bk8s6t6GGdJ7KO1dCcTidOPJKePW30LE/2cT7wCyPho9/Wxg==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^4.0.2" + }, + "engines": { + "node": "20 || >=22" + } + }, + "node_modules/braces": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "dev": true, + "license": "MIT", + "dependencies": { + "fill-range": "^7.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/browserslist": { + "version": "4.28.7", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.7.tgz", + "integrity": "sha512-JxV13hNrFxqjOc8alRbq9dK1MM79NEXYpma2B2J4wAtpWS5zIEIKqWPGCl7N4o7Uc7B7itylh7SuDujATRyyTw==", + "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.44", + "caniuse-lite": "^1.0.30001806", + "electron-to-chromium": "^1.5.393", + "node-releases": "^2.0.51", + "update-browserslist-db": "^1.2.3" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/bundle-name": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/bundle-name/-/bundle-name-4.1.0.tgz", + "integrity": "sha512-tjwM5exMg6BGRI+kNmTntNsvdZS1X8BFYS6tnJ2hdH0kVxM6/eVZ2xy+FqStSWvYmtfFMDLIxurorHwDKfDz5Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "run-applescript": "^7.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cac": { + "version": "7.0.0", + "resolved": "https://registry.npmmirror.com/cac/-/cac-7.0.0.tgz", + "integrity": "sha512-tixWYgm5ZoOD+3g6UTea91eow5z6AAHaho3g0V9CNSNb45gM8SmflpAc+GRd1InC4AqN/07Unrgp56Y94N9hJQ==", + "license": "MIT", + "engines": { + "node": ">=20.19.0" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001806", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001806.tgz", + "integrity": "sha512-72Cuvd95zbSYPKq6Fhg8eDJRlzgWDf7/mtoZv6Qe/DYNCEBdNxoA3+rZAU2ZhGCpZlns3EssFavaZomckT5Uuw==", + "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/chokidar": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-5.0.0.tgz", + "integrity": "sha512-TQMmc3w+5AxjpL8iIiwebF73dRDF4fBIieAqGn9RGCWaEVwQ6Fb2cGe31Yns0RRIzii5goJ1Y7xbMwo1TxMplw==", + "license": "MIT", + "dependencies": { + "readdirp": "^5.0.0" + }, + "engines": { + "node": ">= 20.19.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/colorette": { + "version": "2.0.20", + "resolved": "https://registry.npmmirror.com/colorette/-/colorette-2.0.20.tgz", + "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==", + "license": "MIT" + }, + "node_modules/confbox": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/confbox/-/confbox-0.2.4.tgz", + "integrity": "sha512-ysOGlgTFbN2/Y6Cg3Iye8YKulHw+R2fNXHrgSmXISQdMnomY6eNDprVdW9R5xBguEqI954+S6709UyiO7B+6OQ==", + "license": "MIT" + }, + "node_modules/consola": { + "version": "3.4.2", + "resolved": "https://registry.npmmirror.com/consola/-/consola-3.4.2.tgz", + "integrity": "sha512-5IKcdX0nnYavi6G7TtOhwkYzyjfJlatbjMjuLSfE2kYT5pMDOilZ4OvMhi637CcDICTmz3wARPoyhqyX1Y+XvA==", + "license": "MIT", + "engines": { + "node": "^14.18.0 || >=16.10.0" + } + }, + "node_modules/convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "dev": true, + "license": "MIT" + }, + "node_modules/cross-spawn": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", + "dev": true, + "license": "MIT", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/css-tree": { + "version": "3.2.1", + "resolved": "https://registry.npmmirror.com/css-tree/-/css-tree-3.2.1.tgz", + "integrity": "sha512-X7sjQzceUhu1u7Y/ylrRZFU2FS6LRiFVp6rKLPg23y3x3c3DOKAwuXGDp+PAGjh6CSnCjYeAul8pcT8bAl+lSA==", + "license": "MIT", + "dependencies": { + "mdn-data": "2.27.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0" + } + }, + "node_modules/cssesc": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", + "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", + "dev": true, + "license": "MIT", + "bin": { + "cssesc": "bin/cssesc" + }, + "engines": { + "node": ">=4" + } + }, + "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/debug": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/default-browser": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/default-browser/-/default-browser-5.5.0.tgz", + "integrity": "sha512-H9LMLr5zwIbSxrmvikGuI/5KGhZ8E2zH3stkMgM5LpOWDutGM2JZaj460Udnf1a+946zc7YBgrqEWwbk7zHvGw==", + "dev": true, + "license": "MIT", + "dependencies": { + "bundle-name": "^4.1.0", + "default-browser-id": "^5.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/default-browser-id": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/default-browser-id/-/default-browser-id-5.0.1.tgz", + "integrity": "sha512-x1VCxdX4t+8wVfd1so/9w+vQ4vx7lKd2Qp5tDRutErwmR85OgmfX7RlLRMWafRMY7hbEiXIbudNrjOAPa/hL8Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/define-lazy-prop": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-3.0.0.tgz", + "integrity": "sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/defu": { + "version": "6.1.7", + "resolved": "https://registry.npmmirror.com/defu/-/defu-6.1.7.tgz", + "integrity": "sha512-7z22QmUWiQ/2d0KkdYmANbRUVABpZ9SNYyH5vx6PZ+nE5bcC0l7uFvEfHlyld/HcGBFTL536ClDt3DEcSlEJAQ==", + "license": "MIT" + }, + "node_modules/destr": { + "version": "2.0.5", + "resolved": "https://registry.npmmirror.com/destr/-/destr-2.0.5.tgz", + "integrity": "sha512-ugFTXCtDZunbzasqBxrK93Ik/DRYsO6S/fedkWEMKqt04xZ4csmnmwGDBAb07QWNaGMAmnTIemsYZCksjATwsA==", + "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/duplexer": { + "version": "0.1.2", + "resolved": "https://registry.npmmirror.com/duplexer/-/duplexer-0.1.2.tgz", + "integrity": "sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==", + "license": "MIT" + }, + "node_modules/electron-to-chromium": { + "version": "1.5.399", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.399.tgz", + "integrity": "sha512-lEcqhErbHjXRvd41rnWLpzbyU/IXfIYo7QwaFWmxGeLiLyY2TBCdHnWY88vB+p3ubnihRypDm66panXl7TylLA==", + "dev": true, + "license": "ISC" + }, + "node_modules/entities": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/entities/-/entities-7.0.1.tgz", + "integrity": "sha512-TWrgLOFUQTH994YUyl1yT4uyavY5nNB5muff+RtWaqNVCAK408b5ZnnbNAUEWLTCpum9w6arT70i1XdQ4UeOPA==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/error-stack-parser-es": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/error-stack-parser-es/-/error-stack-parser-es-1.0.5.tgz", + "integrity": "sha512-5qucVt2XcuGMcEGgWI7i+yZpmpByQ8J1lHhcL7PwqCwu9FPP3VUXzT4ltHe5i2z9dePwEHcDVOAfSnHsOlCXRA==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/escalade": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint": { + "version": "10.8.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-10.8.0.tgz", + "integrity": "sha512-nuKKvN+oIBO0koN7Tm7dlkmnkc21mtt0QJLwAKzjLq14y6lRTdVG36MZHJ8eQHwdJMwZbQNMlPOYedMq/oVJvQ==", + "dev": true, + "license": "MIT", + "workspaces": [ + "packages/*" + ], + "dependencies": { + "@eslint-community/eslint-utils": "^4.8.0", + "@eslint-community/regexpp": "^4.12.2", + "@eslint/config-array": "^0.23.5", + "@eslint/config-helpers": "^0.7.0", + "@eslint/core": "^1.2.1", + "@eslint/plugin-kit": "^0.7.2", + "@humanfs/node": "^0.16.6", + "@humanwhocodes/module-importer": "^1.0.1", + "@humanwhocodes/retry": "^0.4.2", + "@types/estree": "^1.0.6", + "ajv": "^6.14.0", + "cross-spawn": "^7.0.6", + "debug": "^4.3.2", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^9.1.2", + "eslint-visitor-keys": "^5.0.1", + "espree": "^11.2.0", + "esquery": "^1.7.0", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^8.0.0", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "ignore": "^5.2.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "minimatch": "^10.2.5", + "natural-compare": "^1.4.0", + "optionator": "^0.9.3" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + }, + "funding": { + "url": "https://eslint.org/donate" + }, + "peerDependencies": { + "jiti": "*" + }, + "peerDependenciesMeta": { + "jiti": { + "optional": true + } + } + }, + "node_modules/eslint-config-prettier": { + "version": "10.1.8", + "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-10.1.8.tgz", + "integrity": "sha512-82GZUjRS0p/jganf6q1rEO25VSoHH0hKPCTrgillPjdI/3bgBhAE1QzHrHTizjpRvy6pGAvKjDJtk2pF9NDq8w==", + "dev": true, + "license": "MIT", + "bin": { + "eslint-config-prettier": "bin/cli.js" + }, + "funding": { + "url": "https://opencollective.com/eslint-config-prettier" + }, + "peerDependencies": { + "eslint": ">=7.0.0" + } + }, + "node_modules/eslint-plugin-oxlint": { + "version": "1.73.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-oxlint/-/eslint-plugin-oxlint-1.73.0.tgz", + "integrity": "sha512-2qsGYkwpas99+jLmB7F3W8Gv+7QkHIr67AMw10UTs/QAMCm2eO0Z8B8ROMvAgyKaWIitkcvH8DwLfTrHMeXzCw==", + "dev": true, + "license": "MIT", + "dependencies": { + "jsonc-parser": "^3.3.1" + }, + "peerDependencies": { + "oxlint": "~1.73.0" + } + }, + "node_modules/eslint-plugin-vue": { + "version": "10.9.2", + "resolved": "https://registry.npmjs.org/eslint-plugin-vue/-/eslint-plugin-vue-10.9.2.tgz", + "integrity": "sha512-4g7ZP3pYcuqd7Zp0pzUKcos0W+RkjBz4EGdhJ92FcYk6v03Ti/GK5NwjgsjxHK+98eXDbHeK7VtX1az7/8doZA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.4.0", + "natural-compare": "^1.4.0", + "nth-check": "^2.1.1", + "postcss-selector-parser": "^7.1.0", + "semver": "^7.6.3", + "xml-name-validator": "^4.0.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "peerDependencies": { + "@stylistic/eslint-plugin": "^2.0.0 || ^3.0.0 || ^4.0.0 || ^5.0.0", + "@typescript-eslint/parser": "^7.0.0 || ^8.0.0", + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "vue-eslint-parser": "^10.3.0" + }, + "peerDependenciesMeta": { + "@stylistic/eslint-plugin": { + "optional": true + }, + "@typescript-eslint/parser": { + "optional": true + } + } + }, + "node_modules/eslint-plugin-vue/node_modules/semver": { + "version": "7.8.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.5.tgz", + "integrity": "sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/eslint-scope": { + "version": "9.1.2", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-9.1.2.tgz", + "integrity": "sha512-xS90H51cKw0jltxmvmHy2Iai1LIqrfbw57b79w/J7MfvDfkIkFZ+kj6zC3BjtUwh150HsSSdxXZcsuv72miDFQ==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "@types/esrecurse": "^4.3.1", + "@types/estree": "^1.0.8", + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint/node_modules/eslint-visitor-keys": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-5.0.1.tgz", + "integrity": "sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/espree": { + "version": "11.2.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-11.2.0.tgz", + "integrity": "sha512-7p3DrVEIopW1B1avAGLuCSh1jubc01H2JHc8B4qqGblmg5gI9yumBgACjWo4JlIc04ufug4xJ3SQI8HkS/Rgzw==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "acorn": "^8.16.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^5.0.1" + }, + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/espree/node_modules/eslint-visitor-keys": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-5.0.1.tgz", + "integrity": "sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/esquery": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.7.0.tgz", + "integrity": "sha512-Ap6G0WQwcU/LHsvLwON1fAQX9Zp0A2Y6Y/cJBl9r/JbW90Zyg4/zbG6zzKa2OTALELarYHmKu0GhpM5EO+7T0g==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "estraverse": "^5.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estree-walker": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", + "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", + "license": "MIT" + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/exsolve": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/exsolve/-/exsolve-1.1.1.tgz", + "integrity": "sha512-9U/jZUgjnSGyntRr6y5Muu1MJcwFl6kPu7k8qLF0IMNfLqvw0NZ4nnVDq0RVoZ0RvCyumib4Ez3KYrVfilrw+g==", + "license": "MIT" + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-glob": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz", + "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.8" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/fast-glob/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", + "dev": true, + "license": "MIT" + }, + "node_modules/fastq": { + "version": "1.20.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.20.1.tgz", + "integrity": "sha512-GGToxJ/w1x32s/D2EKND7kTil4n8OVk/9mycTc4VDza13lOvpUZTGX3mFSCtV9ksdGBVzvsyAVLM6mHFThxXxw==", + "dev": true, + "license": "ISC", + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/fdir": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", + "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", + "license": "MIT", + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, + "node_modules/file-entry-cache": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz", + "integrity": "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "flat-cache": "^4.0.0" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/fill-range": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "dev": true, + "license": "MIT", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "license": "MIT", + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/flat-cache": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz", + "integrity": "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==", + "dev": true, + "license": "MIT", + "dependencies": { + "flatted": "^3.2.9", + "keyv": "^4.5.4" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/flatted": { + "version": "3.4.4", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.4.4.tgz", + "integrity": "sha512-5+ybhBZANEJxaH3X5evAFatUxLfEHSr7n6kYJ+1Qd0mUqr4eu9gIf6GDbWHf8RJijHrjjO8G+la14SlL2SeS1Q==", + "dev": true, + "license": "ISC" + }, + "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/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/gzip-size": { + "version": "6.0.0", + "resolved": "https://registry.npmmirror.com/gzip-size/-/gzip-size-6.0.0.tgz", + "integrity": "sha512-ax7ZYomf6jqPTQ4+XCpUGyXKHk5WweS+e05MBO4/y3WJ5RkmPXNKvX+bx1behVILVwr6JSQvZAku021CHPXG3Q==", + "license": "MIT", + "dependencies": { + "duplexer": "^0.1.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/hookable": { + "version": "5.5.3", + "resolved": "https://registry.npmjs.org/hookable/-/hookable-5.5.3.tgz", + "integrity": "sha512-Yc+BQe8SvoXH1643Qez1zqLRmbA5rCL+sSmk6TVos0LWVfNIB7PGncdlId77WzLGSIB5KaWgTaNTs2lNVEI6VQ==", + "license": "MIT" + }, + "node_modules/ignore": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", + "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/import-meta-resolve": { + "version": "4.2.0", + "resolved": "https://registry.npmmirror.com/import-meta-resolve/-/import-meta-resolve-4.2.0.tgz", + "integrity": "sha512-Iqv2fzaTQN28s/FwZAoFq0ZSs/7hMAHJVX+w8PZl3cY19Pxk6jFFalxQoIfW2826i/fDLXv8IiEZRIT0lDuWcg==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/is-docker": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-3.0.0.tgz", + "integrity": "sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==", + "dev": true, + "license": "MIT", + "bin": { + "is-docker": "cli.js" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-in-ssh": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-in-ssh/-/is-in-ssh-1.0.0.tgz", + "integrity": "sha512-jYa6Q9rH90kR1vKB6NM7qqd1mge3Fx4Dhw5TVlK1MUBqhEOuCagrEHMevNuCcbECmXZ0ThXkRm+Ymr51HwEPAw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-inside-container": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-inside-container/-/is-inside-container-1.0.0.tgz", + "integrity": "sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-docker": "^3.0.0" + }, + "bin": { + "is-inside-container": "cli.js" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-wsl": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-3.1.1.tgz", + "integrity": "sha512-e6rvdUCiQCAuumZslxRJWR/Doq4VpPR82kqclvcS0efgt430SlGIk05vdCN58+VrzgtIcfNODjozVielycD4Sw==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-inside-container": "^1.0.0" + }, + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true, + "license": "ISC" + }, + "node_modules/jiti": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-2.7.0.tgz", + "integrity": "sha512-AC/7JofJvZGrrneWNaEnJeOLUx+JlGt7tNa0wZiRPT4MY1wmfKjt2+6O2p2uz2+skll8OZZmJMNqeke7kKbNgQ==", + "license": "MIT", + "bin": { + "jiti": "lib/jiti-cli.mjs" + } + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/jsesc": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", + "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", + "license": "MIT", + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/json-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/json-parse-even-better-errors": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-6.0.0.tgz", + "integrity": "sha512-2/8adwnK1/+Fdjyts4r6wSpfANWw8zdNhU9U/Llk59c6O+DjSisPWPykwoL8gZmocP9Dy64S7oie2g+Mia123A==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^22.22.2 || ^24.15.0 || >=26.0.0" + } + }, + "node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true, + "license": "MIT" + }, + "node_modules/json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", + "dev": true, + "license": "MIT" + }, + "node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "license": "MIT", + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/jsonc-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.3.1.tgz", + "integrity": "sha512-HUgH65KyejrUFPvHFPbqOY0rsFip3Bo5wb4ngvdi1EpCYWUQDC5V+Y7mZws+DLkr4M//zQJoanu1SP+87Dv1oQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/keyv": { + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", + "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", + "dev": true, + "license": "MIT", + "dependencies": { + "json-buffer": "3.0.1" + } + }, + "node_modules/kolorist": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/kolorist/-/kolorist-1.8.0.tgz", + "integrity": "sha512-Y+60/zizpJ3HRH8DCss+q95yr6145JXZo46OTpFvDZWLfRCE4qChOyk1b26nMaNpfHHgxagk9dXT5OP0Tfe+dQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/lightningcss": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.33.0.tgz", + "integrity": "sha512-WkUDrojuJs0xkgGf2udWxa3yGBRxPtxUkB79i6aCZLRgc7PM8fZe9TosfPDcvEpQZbuFASnHYmRLBLUbmLOIIA==", + "dev": true, + "license": "MPL-2.0", + "dependencies": { + "detect-libc": "^2.0.3" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "optionalDependencies": { + "lightningcss-android-arm64": "1.33.0", + "lightningcss-darwin-arm64": "1.33.0", + "lightningcss-darwin-x64": "1.33.0", + "lightningcss-freebsd-x64": "1.33.0", + "lightningcss-linux-arm-gnueabihf": "1.33.0", + "lightningcss-linux-arm64-gnu": "1.33.0", + "lightningcss-linux-arm64-musl": "1.33.0", + "lightningcss-linux-x64-gnu": "1.33.0", + "lightningcss-linux-x64-musl": "1.33.0", + "lightningcss-win32-arm64-msvc": "1.33.0", + "lightningcss-win32-x64-msvc": "1.33.0" + } + }, + "node_modules/lightningcss-android-arm64": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-android-arm64/-/lightningcss-android-arm64-1.33.0.tgz", + "integrity": "sha512-gEpRTalKdosp4Bb8qWtc2iOgE5SeIHlpS1up9bFq2wAyYhl1UdTObYiHe98zEM9SQvSoqQZ1IQD0JNpg3Ml5pg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-darwin-arm64": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.33.0.tgz", + "integrity": "sha512-Sciaz8eenNTKn9b3t7+xr0ipTp9YxKQY4npwQ3mrRuL0BAVHBLyZxofhaKBAVtzmtRZ/zTyo0/to4B1uWG/Djg==", + "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.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.33.0.tgz", + "integrity": "sha512-Z5UPAxzrjlWNNyGy6i65cJzzvgJ5D3T6wMvs+gWpY9d7qRhANrxqAp6LhxIgZhWEw18RfJTGcRxjuLIBr+m8XQ==", + "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.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.33.0.tgz", + "integrity": "sha512-QQM/Ti/hQajJwCY+RiWuCZ9sdtI/XQk7nDK5vC8kkdwixezOlDgvDx7+RT+QjK6FcFT4MpsuoBnHIo/O3StRRg==", + "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.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.33.0.tgz", + "integrity": "sha512-N7FVBe6iS24MlM6R/4RBTxGhQheZGs7tiQ9U32UtF75NzP5Q7xWPRqLBCKxlRQRk3rY1jCIPLzx7WzOhuUIRLQ==", + "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.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.33.0.tgz", + "integrity": "sha512-j2v/itmy4HlNxlc6voKXYgBqNi0Ng2LShg4z7GufpEgs05P+2suBVyi9I6YHq5uoVFx9ETin3eCEhLVyXGQnKg==", + "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.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.33.0.tgz", + "integrity": "sha512-yiO5ROMuYQgXbC60yjZU5CYSFZGKXL0HFATXt9mHJn1+zW55oCtMI9NfcVhYLMFDL7gV7oBPon/EmMMGg2OvtQ==", + "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.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.33.0.tgz", + "integrity": "sha512-ar+Ju7LmcN0Jo4FpL4hpFybwNG9/3A/Br5KW2n2jyODg3MEZXaDYADdemoNS+BDNfMgKvylJLj4S5tyRActuAg==", + "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.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.33.0.tgz", + "integrity": "sha512-RYiYbkokw0trfKqqzfF55lginwEPrD3OJDfTuJzFs1MK6iFnDenaz1fqLLtX4ITG3OktJQXOeTaw1awrBAlZPw==", + "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.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.33.0.tgz", + "integrity": "sha512-1K+MPfLSFVpphzpdbfkhlWk6wBrTObBzS2T6db10PNOZgR9GoVsAWzwNyuhUYYbTp23j+4RrncfujZ4uAzXvwA==", + "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.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.33.0.tgz", + "integrity": "sha512-OlEICDx/Xl0FqSp4bry8zFnCvGpig3Gl4gCquvYwHuqJKEC1+n9NgDniFvqHGmMv1ZkqDJrDqKKSykTDX+ehuA==", + "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/local-pkg": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/local-pkg/-/local-pkg-1.2.1.tgz", + "integrity": "sha512-++gUqRDEvcnN6Zhqrr+y/CkVEHhlrR96vZn3nZZPYzMcBUyBtTKzB9NadClFIsIVSsu+3i9tfk/erqy9kAmt7Q==", + "license": "MIT", + "dependencies": { + "mlly": "^1.7.4", + "pkg-types": "^2.3.0", + "quansync": "^0.2.11" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lodash-es": { + "version": "4.18.1", + "resolved": "https://registry.npmmirror.com/lodash-es/-/lodash-es-4.18.1.tgz", + "integrity": "sha512-J8xewKD/Gk22OZbhpOVSwcs60zhd95ESDwezOFuA3/099925PdHJ7OFHNTGtajL3AlZkykD32HykiMo+BIBI8A==", + "license": "MIT" + }, + "node_modules/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, + "license": "ISC", + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/magic-regexp": { + "version": "0.10.0", + "resolved": "https://registry.npmmirror.com/magic-regexp/-/magic-regexp-0.10.0.tgz", + "integrity": "sha512-Uly1Bu4lO1hwHUW0CQeSWuRtzCMNO00CmXtS8N6fyvB3B979GOEEeAkiTUDsmbYLAbvpUS/Kt5c4ibosAzVyVg==", + "license": "MIT", + "dependencies": { + "estree-walker": "^3.0.3", + "magic-string": "^0.30.12", + "mlly": "^1.7.2", + "regexp-tree": "^0.1.27", + "type-level-regexp": "~0.1.17", + "ufo": "^1.5.4", + "unplugin": "^2.0.0" + } + }, + "node_modules/magic-regexp/node_modules/estree-walker": { + "version": "3.0.3", + "resolved": "https://registry.npmmirror.com/estree-walker/-/estree-walker-3.0.3.tgz", + "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0" + } + }, + "node_modules/magic-regexp/node_modules/picomatch": { + "version": "4.0.5", + "resolved": "https://registry.npmmirror.com/picomatch/-/picomatch-4.0.5.tgz", + "integrity": "sha512-RvwwcruNjI1ncT5xRakeyS9Lf8lcItv34KD+aif+VH9kduAyfYBipGh12274xtenIPZ119/R9BdTBa8gAwSh0A==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/magic-regexp/node_modules/unplugin": { + "version": "2.3.11", + "resolved": "https://registry.npmmirror.com/unplugin/-/unplugin-2.3.11.tgz", + "integrity": "sha512-5uKD0nqiYVzlmCRs01Fhs2BdkEgBS3SAVP6ndrBsuK42iC2+JHyxM05Rm9G8+5mkmRtzMZGY8Ct5+mliZxU/Ww==", + "license": "MIT", + "dependencies": { + "@jridgewell/remapping": "^2.3.5", + "acorn": "^8.15.0", + "picomatch": "^4.0.3", + "webpack-virtual-modules": "^0.6.2" + }, + "engines": { + "node": ">=18.12.0" + } + }, + "node_modules/magic-string": { + "version": "0.30.21", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz", + "integrity": "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==", + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.5" + } + }, + "node_modules/magic-string-ast": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/magic-string-ast/-/magic-string-ast-1.0.3.tgz", + "integrity": "sha512-CvkkH1i81zl7mmb94DsRiFeG9V2fR2JeuK8yDgS8oiZSFa++wWLEgZ5ufEOyLHbvSbD1gTRKv9NdX69Rnvr9JA==", + "license": "MIT", + "dependencies": { + "magic-string": "^0.30.19" + }, + "engines": { + "node": ">=20.19.0" + }, + "funding": { + "url": "https://github.com/sponsors/sxzz" + } + }, + "node_modules/mdn-data": { + "version": "2.27.1", + "resolved": "https://registry.npmmirror.com/mdn-data/-/mdn-data-2.27.1.tgz", + "integrity": "sha512-9Yubnt3e8A0OKwxYSXyhLymGW4sCufcLG6VdiDdUGVkPhpqLxlvP5vl1983gQjJl3tqbrM731mjaZaP68AgosQ==", + "license": "CC0-1.0" + }, + "node_modules/memorystream": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/memorystream/-/memorystream-0.3.1.tgz", + "integrity": "sha512-S3UwM3yj5mtUSEfP41UZmt/0SCoVYUcU1rkXv+BQ5Ig8ndL4sPoJNBUJERafdPb5jjHJGuMgytgKvKIf58XNBw==", + "dev": true, + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/micromatch": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", + "dev": true, + "license": "MIT", + "dependencies": { + "braces": "^3.0.3", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/minimatch": { + "version": "10.2.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.6.tgz", + "integrity": "sha512-vpLQEs+VLCr1nU0BXS07maYoFwlDAH0gngQuuttxIwutDFEMHq2blX+8vpgxDdK3J1PwjCJiep77OitTZ4Ll1A==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "brace-expansion": "^5.0.8" + }, + "engines": { + "node": "18 || 20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/mlly": { + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/mlly/-/mlly-1.8.2.tgz", + "integrity": "sha512-d+ObxMQFmbt10sretNDytwt85VrbkhhUA/JBGm1MPaWJ65Cl4wOgLaB1NYvJSZ0Ef03MMEU/0xpPMXUIQ29UfA==", + "license": "MIT", + "dependencies": { + "acorn": "^8.16.0", + "pathe": "^2.0.3", + "pkg-types": "^1.3.1", + "ufo": "^1.6.3" + } + }, + "node_modules/mlly/node_modules/confbox": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/confbox/-/confbox-0.1.8.tgz", + "integrity": "sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w==", + "license": "MIT" + }, + "node_modules/mlly/node_modules/pkg-types": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/pkg-types/-/pkg-types-1.3.1.tgz", + "integrity": "sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ==", + "license": "MIT", + "dependencies": { + "confbox": "^0.1.8", + "mlly": "^1.7.4", + "pathe": "^2.0.1" + } + }, + "node_modules/mrmime": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/mrmime/-/mrmime-2.0.1.tgz", + "integrity": "sha512-Y3wQdFg2Va6etvQ5I82yUhGdsKrcYox6p7FfL1LbK2J4V01F9TGlepTIhnK24t7koZibmg82KGglhA1XK5IsLQ==", + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "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/muggle-string": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/muggle-string/-/muggle-string-0.4.1.tgz", + "integrity": "sha512-VNTrAak/KhO2i8dqqnqnAHOa3cYBwXEZe9h+D5h/1ZqFSTEFHdM65lR7RoIqq3tBBYavsOXV84NoHXZ0AkPyqQ==", + "license": "MIT" + }, + "node_modules/nanoid": { + "version": "3.3.16", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.16.tgz", + "integrity": "sha512-bzlKTyNJ7+LdGIIwy8ijFpIqEQIvafahV7eYykJ8Cvh42EdJeODoJ6gUJXpQJvej1BddH8OqTXZNE/KfbWAu8Q==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", + "dev": true, + "license": "MIT" + }, + "node_modules/node-fetch-native": { + "version": "1.6.7", + "resolved": "https://registry.npmmirror.com/node-fetch-native/-/node-fetch-native-1.6.7.tgz", + "integrity": "sha512-g9yhqoedzIUm0nTnTqAQvueMPVOuIY16bqgAJJC8XOOubYFNwz6IER9qs0Gq2Xd0+CecCKFjtdDTMA4u4xG06Q==", + "license": "MIT" + }, + "node_modules/node-releases": { + "version": "2.0.51", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.51.tgz", + "integrity": "sha512-wRNIrw4DmVLKQlbgOMdkMx27Wrpzes2hh5Jtbi2bjPd+4wJstWIqP5A+lscnqbm0xxmT5Bpg8Lec5ItEBwx6BQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/nostics": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/nostics/-/nostics-1.2.0.tgz", + "integrity": "sha512-FGqEfhQjrvo1lL8KFifdTQiNwwQHJxC1jtYE1Rc54qF/jxONUNL+kC9gS1krX8Q65PgrQ5fCqH/I4NhWBvdSqg==", + "license": "MIT" + }, + "node_modules/npm-normalize-package-bin": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/npm-normalize-package-bin/-/npm-normalize-package-bin-6.0.0.tgz", + "integrity": "sha512-tdt4aFn9QamlhdN3HV2D2ccpBwO5/fyjjbXUxYA6uBjyekMZcZvDq0aSj9t5Jo+tih6AYFnt/cuIRn9013e0Uw==", + "dev": true, + "license": "ISC", + "engines": { + "node": "^22.22.2 || ^24.15.0 || >=26.0.0" + } + }, + "node_modules/npm-run-all2": { + "version": "9.0.3", + "resolved": "https://registry.npmjs.org/npm-run-all2/-/npm-run-all2-9.0.3.tgz", + "integrity": "sha512-BQAEdU1PtYc48qYRdghW2BVTQT3VqWCoFQmO87NlM1h1PYwMCKQpUWaNyB20V26caNzFsXQDfyOdznLlHCih6g==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^7.0.0", + "cross-spawn": "^7.0.6", + "memorystream": "^0.3.1", + "picomatch": "^4.0.2", + "pidtree": "^1.0.0", + "read-package-json-fast": "^6.0.0", + "shell-quote": "^1.8.4", + "which": "^7.0.0" + }, + "bin": { + "npm-run-all": "bin/npm-run-all/index.js", + "npm-run-all2": "bin/npm-run-all/index.js", + "run-p": "bin/run-p/index.js", + "run-s": "bin/run-s/index.js" + }, + "engines": { + "node": "^22.22.2 || ^24.15.0 || >=26.0.0", + "npm": ">= 10" + } + }, + "node_modules/npm-run-all2/node_modules/isexe": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-4.0.0.tgz", + "integrity": "sha512-FFUtZMpoZ8RqHS3XeXEmHWLA4thH+ZxCv2lOiPIn1Xc7CxrqhWzNSDzD+/chS/zbYezmiwWLdQC09JdQKmthOw==", + "dev": true, + "license": "BlueOak-1.0.0", + "engines": { + "node": ">=20" + } + }, + "node_modules/npm-run-all2/node_modules/picomatch": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.5.tgz", + "integrity": "sha512-RvwwcruNjI1ncT5xRakeyS9Lf8lcItv34KD+aif+VH9kduAyfYBipGh12274xtenIPZ119/R9BdTBa8gAwSh0A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/npm-run-all2/node_modules/which": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/which/-/which-7.0.0.tgz", + "integrity": "sha512-RancgH2dmbLdHl6LRhEqvklWMgl/Hdnun0Y90KhBOLkMefg8Qa7/Zel8Sm+8HEcP6DEjzsWzpkuBQEZok58isA==", + "dev": true, + "license": "ISC", + "dependencies": { + "isexe": "^4.0.0" + }, + "bin": { + "node-which": "bin/which.js" + }, + "engines": { + "node": "^22.22.2 || ^24.15.0 || >=26.0.0" + } + }, + "node_modules/nth-check": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", + "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "boolbase": "^1.0.0" + }, + "funding": { + "url": "https://github.com/fb55/nth-check?sponsor=1" + } + }, + "node_modules/obug": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/obug/-/obug-2.1.4.tgz", + "integrity": "sha512-4a+OsYv9UktOJKE+l1A4OufDgdRF9PifWj+tJnHURo/P+WOxpG4GzUFL9qCalmWauao6ogiG+QvnCovwPoyAWA==", + "dev": true, + "funding": [ + "https://github.com/sponsors/sxzz", + "https://opencollective.com/debug" + ], + "license": "MIT", + "engines": { + "node": ">=12.20.0" + } + }, + "node_modules/ofetch": { + "version": "1.5.1", + "resolved": "https://registry.npmmirror.com/ofetch/-/ofetch-1.5.1.tgz", + "integrity": "sha512-2W4oUZlVaqAPAil6FUg/difl6YhqhUR7x2eZY4bQCko22UXg3hptq9KLQdqFClV+Wu85UX7hNtdGTngi/1BxcA==", + "license": "MIT", + "dependencies": { + "destr": "^2.0.5", + "node-fetch-native": "^1.6.7", + "ufo": "^1.6.1" + } + }, + "node_modules/ohash": { + "version": "2.0.11", + "resolved": "https://registry.npmjs.org/ohash/-/ohash-2.0.11.tgz", + "integrity": "sha512-RdR9FQrFwNBNXAr4GixM8YaRZRJ5PUWbKYbE5eOsrwAjJW0q2REGcf79oYPsLyskQCZG1PLN+S/K1V00joZAoQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/open": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/open/-/open-11.0.0.tgz", + "integrity": "sha512-smsWv2LzFjP03xmvFoJ331ss6h+jixfA4UUV/Bsiyuu4YJPfN+FIQGOIiv4w9/+MoHkfkJ22UIaQWRVFRfH6Vw==", + "dev": true, + "license": "MIT", + "dependencies": { + "default-browser": "^5.4.0", + "define-lazy-prop": "^3.0.0", + "is-in-ssh": "^1.0.0", + "is-inside-container": "^1.0.0", + "powershell-utils": "^0.1.0", + "wsl-utils": "^0.3.0" + }, + "engines": { + "node": ">=20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/optionator": { + "version": "0.9.4", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", + "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", + "dev": true, + "license": "MIT", + "dependencies": { + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0", + "word-wrap": "^1.2.5" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/oxc-parser": { + "version": "0.131.0", + "resolved": "https://registry.npmmirror.com/oxc-parser/-/oxc-parser-0.131.0.tgz", + "integrity": "sha512-SJ3/7ZPbgie8dr5Z9BI/M51zZbpXba+hRSG0MDzVwMW5CRQg2fjYE0jHGlLX4eeiibGgC/mzoDFKSDHwVZEHRQ==", + "license": "MIT", + "dependencies": { + "@oxc-project/types": "^0.131.0" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "funding": { + "url": "https://github.com/sponsors/Boshen" + }, + "optionalDependencies": { + "@oxc-parser/binding-android-arm-eabi": "0.131.0", + "@oxc-parser/binding-android-arm64": "0.131.0", + "@oxc-parser/binding-darwin-arm64": "0.131.0", + "@oxc-parser/binding-darwin-x64": "0.131.0", + "@oxc-parser/binding-freebsd-x64": "0.131.0", + "@oxc-parser/binding-linux-arm-gnueabihf": "0.131.0", + "@oxc-parser/binding-linux-arm-musleabihf": "0.131.0", + "@oxc-parser/binding-linux-arm64-gnu": "0.131.0", + "@oxc-parser/binding-linux-arm64-musl": "0.131.0", + "@oxc-parser/binding-linux-ppc64-gnu": "0.131.0", + "@oxc-parser/binding-linux-riscv64-gnu": "0.131.0", + "@oxc-parser/binding-linux-riscv64-musl": "0.131.0", + "@oxc-parser/binding-linux-s390x-gnu": "0.131.0", + "@oxc-parser/binding-linux-x64-gnu": "0.131.0", + "@oxc-parser/binding-linux-x64-musl": "0.131.0", + "@oxc-parser/binding-openharmony-arm64": "0.131.0", + "@oxc-parser/binding-wasm32-wasi": "0.131.0", + "@oxc-parser/binding-win32-arm64-msvc": "0.131.0", + "@oxc-parser/binding-win32-ia32-msvc": "0.131.0", + "@oxc-parser/binding-win32-x64-msvc": "0.131.0" + } + }, + "node_modules/oxc-parser/node_modules/@oxc-project/types": { + "version": "0.131.0", + "resolved": "https://registry.npmmirror.com/@oxc-project/types/-/types-0.131.0.tgz", + "integrity": "sha512-PgnWDfV0h+b16XNKbXU7Daib/BFSt/J2mEzfYIBu6JB/wNdlU+kVYXCkGA1A9fWkTbOgbjh4e6NhPeQOYvFhEA==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/Boshen" + } + }, + "node_modules/oxc-walker": { + "version": "0.7.0", + "resolved": "https://registry.npmmirror.com/oxc-walker/-/oxc-walker-0.7.0.tgz", + "integrity": "sha512-54B4KUhrzbzc4sKvKwVYm7E2PgeROpGba0/2nlNZMqfDyca+yOor5IMb4WLGBatGDT0nkzYdYuzylg7n3YfB7A==", + "license": "MIT", + "dependencies": { + "magic-regexp": "^0.10.0" + }, + "peerDependencies": { + "oxc-parser": ">=0.98.0" + } + }, + "node_modules/oxlint": { + "version": "1.74.0", + "resolved": "https://registry.npmjs.org/oxlint/-/oxlint-1.74.0.tgz", + "integrity": "sha512-odGl2s2x5IOJoj3A0v1k0PGBXVFBZeZ2+AK/+K2MJur7Ghi3bkyX5NuLUWHKqa4js1wjep3hJeuTQJOlr+4+dA==", + "dev": true, + "license": "MIT", + "bin": { + "oxlint": "bin/oxlint" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "funding": { + "url": "https://github.com/sponsors/Boshen" + }, + "optionalDependencies": { + "@oxlint/binding-android-arm-eabi": "1.74.0", + "@oxlint/binding-android-arm64": "1.74.0", + "@oxlint/binding-darwin-arm64": "1.74.0", + "@oxlint/binding-darwin-x64": "1.74.0", + "@oxlint/binding-freebsd-x64": "1.74.0", + "@oxlint/binding-linux-arm-gnueabihf": "1.74.0", + "@oxlint/binding-linux-arm-musleabihf": "1.74.0", + "@oxlint/binding-linux-arm64-gnu": "1.74.0", + "@oxlint/binding-linux-arm64-musl": "1.74.0", + "@oxlint/binding-linux-ppc64-gnu": "1.74.0", + "@oxlint/binding-linux-riscv64-gnu": "1.74.0", + "@oxlint/binding-linux-riscv64-musl": "1.74.0", + "@oxlint/binding-linux-s390x-gnu": "1.74.0", + "@oxlint/binding-linux-x64-gnu": "1.74.0", + "@oxlint/binding-linux-x64-musl": "1.74.0", + "@oxlint/binding-openharmony-arm64": "1.74.0", + "@oxlint/binding-win32-arm64-msvc": "1.74.0", + "@oxlint/binding-win32-ia32-msvc": "1.74.0", + "@oxlint/binding-win32-x64-msvc": "1.74.0" + }, + "peerDependencies": { + "oxlint-tsgolint": ">=0.24.0", + "vite-plus": "*" + }, + "peerDependenciesMeta": { + "oxlint-tsgolint": { + "optional": true + }, + "vite-plus": { + "optional": true + } + } + }, + "node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/package-manager-detector": { + "version": "1.8.0", + "resolved": "https://registry.npmmirror.com/package-manager-detector/-/package-manager-detector-1.8.0.tgz", + "integrity": "sha512-yQA4H19AmPEoMUeavPMDIe1higySl/gH/yaQrkT/s07Qp+7pp2hYz30N3z2l5BkjVkF9Ow6o0wjJamm2y7Sn0A==", + "license": "MIT" + }, + "node_modules/path-browserify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-1.0.1.tgz", + "integrity": "sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==", + "dev": true, + "license": "MIT" + }, + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/pathe": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz", + "integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==", + "license": "MIT" + }, + "node_modules/perfect-debounce": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/perfect-debounce/-/perfect-debounce-2.1.0.tgz", + "integrity": "sha512-LjgdTytVFXeUgtHZr9WYViYSM/g8MkcTPYDlPa3cDqMirHjKiSZPYd6DoL7pK8AJQr+uWkQvCjHNdiMqsrJs+g==", + "license": "MIT" + }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "license": "ISC" + }, + "node_modules/picomatch": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.2.tgz", + "integrity": "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pidtree": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/pidtree/-/pidtree-1.0.0.tgz", + "integrity": "sha512-avfAvjB9Dd0wdj3rjJX//yS+G79OO0KrS5pJHFJENjYGX6N4SMgEDBBI/yFy0lloOYSaC6XQxzpOAMPfSYFV/Q==", + "dev": true, + "license": "MIT", + "bin": { + "pidtree": "bin/pidtree.js" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/pinia": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/pinia/-/pinia-4.0.2.tgz", + "integrity": "sha512-yKVVA7bSj5oRZFp/Ab9wLlmyb5gPUYEiIm4ryiWTe/xe7PtkRdMVOp1X1ggvq0c6Uj7Q0Du1HnV2mtAwM0Ks1g==", + "license": "MIT", + "dependencies": { + "nostics": "^1.1.4" + }, + "funding": { + "url": "https://github.com/sponsors/posva" + }, + "peerDependencies": { + "@vue/devtools-api": "^8.1.5", + "typescript": ">=5.6.0", + "vue": "^3.5.11" + }, + "peerDependenciesMeta": { + "@vue/devtools-api": { + "optional": false + }, + "typescript": { + "optional": true + } + } + }, + "node_modules/pkg-types": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/pkg-types/-/pkg-types-2.3.1.tgz", + "integrity": "sha512-y+ichcgc2LrADuhLNAx8DFjVfgz91pRxfZdI3UDhxHvcVEZsenLO+7XaU5vOp0u/7V/wZ+plyuQxtrDlZJ+yeg==", + "license": "MIT", + "dependencies": { + "confbox": "^0.2.4", + "exsolve": "^1.0.8", + "pathe": "^2.0.3" + } + }, + "node_modules/postcss": { + "version": "8.5.25", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.25.tgz", + "integrity": "sha512-DTPx3RWSSnWyzLxQnlH0rJP+EW5ekl16ZU4/psbIhA0e53kJfdgaN5vKM+xP7yJtXVu+nfdVFmlgFDEKAe4Pyw==", + "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.16", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/postcss-selector-parser": { + "version": "7.1.4", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.4.tgz", + "integrity": "sha512-HeP7D2wyhkR+XaK6v4W8oRF62Dsz4flyuczALJp61GckGm42u1saSSJ/0auvcBqxs3jMRFEcPK34At/0JBKdOg==", + "dev": true, + "license": "MIT", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/powershell-utils": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/powershell-utils/-/powershell-utils-0.1.0.tgz", + "integrity": "sha512-dM0jVuXJPsDN6DvRpea484tCUaMiXWjuCn++HGTqUWzGDjv5tZkEZldAJ/UMlqRYGFrD/etByo4/xOuC/snX2A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/prettier": { + "version": "3.9.5", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.9.5.tgz", + "integrity": "sha512-/FVl766LpUfB5vXgCYOYa0MeV/441Ia99AeICQIQFTY/Nw0roZwULcXpku5i1/m5kt/baz+s4Zogspd839HSMg==", + "dev": true, + "license": "MIT", + "bin": { + "prettier": "bin/prettier.cjs" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/prettier/prettier?sponsor=1" + } + }, + "node_modules/punycode": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/quansync": { + "version": "0.2.11", + "resolved": "https://registry.npmjs.org/quansync/-/quansync-0.2.11.tgz", + "integrity": "sha512-AifT7QEbW9Nri4tAwR5M/uzpBuqfZf+zwaEM/QkzEjj7NBuFD2rBuy0K3dE+8wltbezDV7JMA0WfnCPYRSYbXA==", + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/antfu" + }, + { + "type": "individual", + "url": "https://github.com/sponsors/sxzz" + } + ], + "license": "MIT" + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/read-package-json-fast": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/read-package-json-fast/-/read-package-json-fast-6.0.0.tgz", + "integrity": "sha512-PNaGjoCnw9DBA2Kl8D+8po957z778q/HOPuY2u3Bkw/JO3eC8MDx7jn/PgMtSgpcBbs+6UOjDbwReGpXmRvs0g==", + "dev": true, + "license": "ISC", + "dependencies": { + "json-parse-even-better-errors": "^6.0.0", + "npm-normalize-package-bin": "^6.0.0" + }, + "engines": { + "node": "^22.22.2 || ^24.15.0 || >=26.0.0" + } + }, + "node_modules/readdirp": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-5.0.0.tgz", + "integrity": "sha512-9u/XQ1pvrQtYyMpZe7DXKv2p5CNvyVwzUB6uhLAnQwHMSgKMBR62lc7AHljaeteeHXn11XTAaLLUVZYVZyuRBQ==", + "license": "MIT", + "engines": { + "node": ">= 20.19.0" + }, + "funding": { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/regexp-tree": { + "version": "0.1.27", + "resolved": "https://registry.npmmirror.com/regexp-tree/-/regexp-tree-0.1.27.tgz", + "integrity": "sha512-iETxpjK6YoRWJG5o6hXLwvjYAoW+FEZn9os0PD/b6AP6xQwsa/Y7lCVgIixBbUPMfhu+i2LtdeAqVTgGlQarfA==", + "license": "MIT", + "bin": { + "regexp-tree": "bin/regexp-tree" + } + }, + "node_modules/reusify": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz", + "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==", + "dev": true, + "license": "MIT", + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/rolldown": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/rolldown/-/rolldown-1.2.1.tgz", + "integrity": "sha512-4FKJhg8d3OiyQOA6Q1Q0hoFFpW9/OoX+VsHzpECsdsIZoOArrAK90gl59YK/Z+gnDel45bgJZK03ozH/9bCqEw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@oxc-project/types": "=0.142.0", + "@rolldown/pluginutils": "^1.0.0" + }, + "bin": { + "rolldown": "bin/cli.mjs" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "optionalDependencies": { + "@rolldown/binding-android-arm64": "1.2.1", + "@rolldown/binding-darwin-arm64": "1.2.1", + "@rolldown/binding-darwin-x64": "1.2.1", + "@rolldown/binding-freebsd-x64": "1.2.1", + "@rolldown/binding-linux-arm-gnueabihf": "1.2.1", + "@rolldown/binding-linux-arm64-gnu": "1.2.1", + "@rolldown/binding-linux-arm64-musl": "1.2.1", + "@rolldown/binding-linux-ppc64-gnu": "1.2.1", + "@rolldown/binding-linux-s390x-gnu": "1.2.1", + "@rolldown/binding-linux-x64-gnu": "1.2.1", + "@rolldown/binding-linux-x64-musl": "1.2.1", + "@rolldown/binding-openharmony-arm64": "1.2.1", + "@rolldown/binding-wasm32-wasi": "1.2.1", + "@rolldown/binding-win32-arm64-msvc": "1.2.1", + "@rolldown/binding-win32-x64-msvc": "1.2.1" + } + }, + "node_modules/run-applescript": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/run-applescript/-/run-applescript-7.1.0.tgz", + "integrity": "sha512-DPe5pVFaAsinSaV6QjQ6gdiedWDcRCbUuiQfQa2wmWV7+xC9bGulGI8+TdRmoFkAPaBXk8CrAbnlY2ISniJ47Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/scule": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/scule/-/scule-1.3.0.tgz", + "integrity": "sha512-6FtHJEvt+pVMIB9IBY+IcCJ6Z5f1iQnytgyfKMhDKgmzYG+TeH/wx1y3l27rshSbLiSanrR9ffZDrEsmjlQF2g==", + "license": "MIT" + }, + "node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "license": "MIT", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/shell-quote": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.10.0.tgz", + "integrity": "sha512-w1aiOKwKuRgtwAReIIj89puqg+I7GvX4IbLrvmhXbzQsj1+Zwi4VO3+fa6ZF91TWSjIxoEkKnMeHcLEODK5ZXA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/sirv": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/sirv/-/sirv-3.0.2.tgz", + "integrity": "sha512-2wcC/oGxHis/BoHkkPwldgiPSYcpZK3JU28WoMVv55yHJgcZ8rlXvuG9iZggz+sU1d4bRgIGASwyWqjxu3FM0g==", + "license": "MIT", + "dependencies": { + "@polka/url": "^1.0.0-next.24", + "mrmime": "^2.0.0", + "totalist": "^3.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/source-map-js": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/tinyexec": { + "version": "1.3.0", + "resolved": "https://registry.npmmirror.com/tinyexec/-/tinyexec-1.3.0.tgz", + "integrity": "sha512-QKAl9m8gWWGHV8jZcPeym6j+XULi6tOf1mT83WYJ4Lk2ytW/uwAWkrP0uFsdoYMdueVJ0qs26wZ+23xeB4ibNQ==", + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/tinyglobby": { + "version": "0.2.17", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.17.tgz", + "integrity": "sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g==", + "license": "MIT", + "dependencies": { + "fdir": "^6.5.0", + "picomatch": "^4.0.4" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/SuperchupuDev" + } + }, + "node_modules/tinyglobby/node_modules/picomatch": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.5.tgz", + "integrity": "sha512-RvwwcruNjI1ncT5xRakeyS9Lf8lcItv34KD+aif+VH9kduAyfYBipGh12274xtenIPZ119/R9BdTBa8gAwSh0A==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/totalist": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/totalist/-/totalist-3.0.1.tgz", + "integrity": "sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/ts-api-utils": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.5.0.tgz", + "integrity": "sha512-OJ/ibxhPlqrMM0UiNHJ/0CKQkoKF243/AEmplt3qpRgkW8VG7IfOS41h7V8TjITqdByHzrjcS/2si+y4lIh8NA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18.12" + }, + "peerDependencies": { + "typescript": ">=4.8.4" + } + }, + "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", + "optional": true + }, + "node_modules/type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dev": true, + "license": "MIT", + "dependencies": { + "prelude-ls": "^1.2.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/type-level-regexp": { + "version": "0.1.17", + "resolved": "https://registry.npmmirror.com/type-level-regexp/-/type-level-regexp-0.1.17.tgz", + "integrity": "sha512-wTk4DH3cxwk196uGLK/E9pE45aLfeKJacKmcEgEOA/q5dnPGNxXt0cfYdFxb57L+sEpf1oJH4Dnx/pnRcku9jg==", + "license": "MIT" + }, + "node_modules/typescript": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-6.0.3.tgz", + "integrity": "sha512-y2TvuxSZPDyQakkFRPZHKFm+KKVqIisdg9/CZwm9ftvKXLP8NRWj38/ODjNbr43SsoXqNuAisEf1GdCxqWcdBw==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/typescript-eslint": { + "version": "8.65.0", + "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.65.0.tgz", + "integrity": "sha512-/ggrHAwyjENDusvyxbuqxAC2dTnZg/Z8F+fgQtYIz+L6n/9HfSlEZcFGV/NsMNa6CkGk0xUjUAFwC0vHOflvIA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/eslint-plugin": "8.65.0", + "@typescript-eslint/parser": "8.65.0", + "@typescript-eslint/typescript-estree": "8.65.0", + "@typescript-eslint/utils": "8.65.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/ufo": { + "version": "1.6.4", + "resolved": "https://registry.npmjs.org/ufo/-/ufo-1.6.4.tgz", + "integrity": "sha512-JFNbkD1Svwe0KvGi8GOeLcP4kAWQ609twvCdcHxq1oSL8svv39ZuSvajcD8B+5D0eL4+s1Is2D/O6KN3qcTeRA==", + "license": "MIT" + }, + "node_modules/unconfig": { + "version": "7.5.0", + "resolved": "https://registry.npmmirror.com/unconfig/-/unconfig-7.5.0.tgz", + "integrity": "sha512-oi8Qy2JV4D3UQ0PsopR28CzdQ3S/5A1zwsUwp/rosSbfhJ5z7b90bIyTwi/F7hCLD4SGcZVjDzd4XoUQcEanvA==", + "license": "MIT", + "dependencies": { + "@quansync/fs": "^1.0.0", + "defu": "^6.1.4", + "jiti": "^2.6.1", + "quansync": "^1.0.0", + "unconfig-core": "7.5.0" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/unconfig-core": { + "version": "7.5.0", + "resolved": "https://registry.npmmirror.com/unconfig-core/-/unconfig-core-7.5.0.tgz", + "integrity": "sha512-Su3FauozOGP44ZmKdHy2oE6LPjk51M/TRRjHv2HNCWiDvfvCoxC2lno6jevMA91MYAdCdwP05QnWdWpSbncX/w==", + "license": "MIT", + "dependencies": { + "@quansync/fs": "^1.0.0", + "quansync": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/unconfig-core/node_modules/quansync": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/quansync/-/quansync-1.0.0.tgz", + "integrity": "sha512-5xZacEEufv3HSTPQuchrvV6soaiACMFnq1H8wkVioctoH3TRha9Sz66lOxRwPK/qZj7HPiSveih9yAyh98gvqA==", + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/antfu" + }, + { + "type": "individual", + "url": "https://github.com/sponsors/sxzz" + } + ], + "license": "MIT" + }, + "node_modules/unconfig/node_modules/quansync": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/quansync/-/quansync-1.0.0.tgz", + "integrity": "sha512-5xZacEEufv3HSTPQuchrvV6soaiACMFnq1H8wkVioctoH3TRha9Sz66lOxRwPK/qZj7HPiSveih9yAyh98gvqA==", + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/antfu" + }, + { + "type": "individual", + "url": "https://github.com/sponsors/sxzz" + } + ], + "license": "MIT" + }, + "node_modules/undici-types": { + "version": "7.18.2", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.18.2.tgz", + "integrity": "sha512-AsuCzffGHJybSaRrmr5eHr81mwJU3kjw6M+uprWvCXiNeN9SOGwQ3Jn8jb8m3Z6izVgknn1R0FTCEAP2QrLY/w==", + "dev": true, + "license": "MIT" + }, + "node_modules/unocss": { + "version": "66.7.5", + "resolved": "https://registry.npmmirror.com/unocss/-/unocss-66.7.5.tgz", + "integrity": "sha512-nAdmU8TwnQoiLnQjZ6Hm1GmHy9lTexKsAZNEJtZnxN9wyFRc1eLjQgmh9r7UEGxBQMQLD8OZOgmk5HpwObbh0Q==", + "license": "MIT", + "dependencies": { + "@unocss/cli": "66.7.5", + "@unocss/core": "66.7.5", + "@unocss/preset-attributify": "66.7.5", + "@unocss/preset-icons": "66.7.5", + "@unocss/preset-mini": "66.7.5", + "@unocss/preset-tagify": "66.7.5", + "@unocss/preset-typography": "66.7.5", + "@unocss/preset-uno": "66.7.5", + "@unocss/preset-web-fonts": "66.7.5", + "@unocss/preset-wind": "66.7.5", + "@unocss/preset-wind3": "66.7.5", + "@unocss/preset-wind4": "66.7.5", + "@unocss/transformer-attributify-jsx": "66.7.5", + "@unocss/transformer-compile-class": "66.7.5", + "@unocss/transformer-directives": "66.7.5", + "@unocss/transformer-variant-group": "66.7.5", + "@unocss/vite": "66.7.5" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + }, + "peerDependencies": { + "@unocss/astro": "66.7.5", + "@unocss/postcss": "66.7.5", + "@unocss/webpack": "66.7.5" + }, + "peerDependenciesMeta": { + "@unocss/astro": { + "optional": true + }, + "@unocss/postcss": { + "optional": true + }, + "@unocss/webpack": { + "optional": true + } + } + }, + "node_modules/unplugin": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/unplugin/-/unplugin-3.3.0.tgz", + "integrity": "sha512-qa66K+crbfyE6JK10GjvbJeRrOsuC/JpbnHctfyp/i4oBTxWOzJfRZyDiOk1PtErMFRu8JhsU/wPvOdBNWe5Rg==", + "license": "MIT", + "dependencies": { + "@jridgewell/remapping": "^2.3.5", + "picomatch": "^4.0.4", + "webpack-virtual-modules": "^0.6.2" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "peerDependencies": { + "@farmfe/core": "*", + "@rspack/core": "*", + "bun-types-no-globals": "*", + "esbuild": "*", + "rolldown": "*", + "rollup": "*", + "unloader": "*", + "vite": "*", + "webpack": "*" + }, + "peerDependenciesMeta": { + "@farmfe/core": { + "optional": true + }, + "@rspack/core": { + "optional": true + }, + "bun-types-no-globals": { + "optional": true + }, + "esbuild": { + "optional": true + }, + "rolldown": { + "optional": true + }, + "rollup": { + "optional": true + }, + "unloader": { + "optional": true + }, + "vite": { + "optional": true + }, + "webpack": { + "optional": true + } + } + }, + "node_modules/unplugin-utils": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/unplugin-utils/-/unplugin-utils-0.3.2.tgz", + "integrity": "sha512-xVToRh2CTmLk2HnEG7ac4rl1MJTT3RFkpS8B++/SnB0kXvuaavD+n3m/vrzyWQOdJNSZQACnbz01pnppbwV5BA==", + "license": "MIT", + "dependencies": { + "pathe": "^2.0.3", + "picomatch": "^4.0.4" + }, + "engines": { + "node": ">=20.19.0" + }, + "funding": { + "url": "https://github.com/sponsors/sxzz" + } + }, + "node_modules/unplugin-utils/node_modules/picomatch": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.5.tgz", + "integrity": "sha512-RvwwcruNjI1ncT5xRakeyS9Lf8lcItv34KD+aif+VH9kduAyfYBipGh12274xtenIPZ119/R9BdTBa8gAwSh0A==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/unplugin/node_modules/picomatch": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.5.tgz", + "integrity": "sha512-RvwwcruNjI1ncT5xRakeyS9Lf8lcItv34KD+aif+VH9kduAyfYBipGh12274xtenIPZ119/R9BdTBa8gAwSh0A==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/update-browserslist-db": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.2.3.tgz", + "integrity": "sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "escalade": "^3.2.0", + "picocolors": "^1.1.1" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "dev": true, + "license": "MIT" + }, + "node_modules/vite": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/vite/-/vite-8.2.0.tgz", + "integrity": "sha512-pn+CFpM0lwDeKwmOq1ZaBK/9sjorZcgqxki6MbY/jPEVd9vichIlmlD4HmQ5wdP5EgqQCFRaACBxMC7uEGc6lQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "lightningcss": "^1.33.0", + "picomatch": "^4.0.5", + "postcss": "^8.5.23", + "rolldown": "~1.2.0", + "tinyglobby": "^0.2.17" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^20.19.0 || >=22.12.0", + "@vitejs/devtools": "^0.4.0", + "esbuild": "^0.27.0 || ^0.28.0", + "jiti": ">=1.21.0", + "less": "^4.0.0", + "sass": "^1.70.0", + "sass-embedded": "^1.70.0", + "stylus": ">=0.54.8", + "sugarss": "^5.0.0", + "terser": "^5.16.0", + "tsx": "^4.8.1", + "yaml": "^2.4.2" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "@vitejs/devtools": { + "optional": true + }, + "esbuild": { + "optional": true + }, + "jiti": { + "optional": true + }, + "less": { + "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/vite-dev-rpc": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/vite-dev-rpc/-/vite-dev-rpc-2.0.0.tgz", + "integrity": "sha512-yKwbTwdHKSD2k/aGqyWpPHepo45OQc8lH3/6IfT4ZqeKE26ooKvi4WIEKzqWav8v+9Is8u1k8q54hvOmqASazA==", + "dev": true, + "license": "MIT", + "dependencies": { + "birpc": "^4.0.0", + "vite-hot-client": "^2.2.0" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + }, + "peerDependencies": { + "vite": "^2.9.0 || ^3.0.0-0 || ^4.0.0-0 || ^5.0.0-0 || ^6.0.1 || ^7.0.0-0 || ^8.0.0" + } + }, + "node_modules/vite-dev-rpc/node_modules/birpc": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/birpc/-/birpc-4.0.0.tgz", + "integrity": "sha512-LShSxJP0KTmd101b6DRyGBj57LZxSDYWKitQNW/mi8GRMvZb078Uf9+pveax1DrVL89vm7mWe+TovdI/UDOuPw==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/vite-hot-client": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/vite-hot-client/-/vite-hot-client-2.2.0.tgz", + "integrity": "sha512-76Zs9zrHbH7M7wqeyooGQKdX+yg0pQ0xuQ1PbFp4z5a0Lzn2e5IPFoCswnmqZ4GiwqB4Jo3WcDAMO9jARTJl8w==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/antfu" + }, + "peerDependencies": { + "vite": "^2.6.0 || ^3.0.0 || ^4.0.0 || ^5.0.0-0 || ^6.0.0-0 || ^7.0.0-0 || ^8.0.0" + } + }, + "node_modules/vite-plugin-inspect": { + "version": "11.4.1", + "resolved": "https://registry.npmjs.org/vite-plugin-inspect/-/vite-plugin-inspect-11.4.1.tgz", + "integrity": "sha512-ShOFe2PURXGvRS5OrgmOLZOCwDTD7dEBVt0tMpFPKb9AsvqXKCRGM8QgKrUbRbJYFXScHvDPpGRd28rYidC0tA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansis": "^4.3.0", + "error-stack-parser-es": "^1.0.5", + "obug": "^2.1.1", + "ohash": "^2.0.11", + "open": "^11.0.0", + "perfect-debounce": "^2.1.0", + "sirv": "^3.0.2", + "unplugin-utils": "^0.3.1", + "vite-dev-rpc": "^2.0.0" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + }, + "peerDependencies": { + "vite": "^6.0.0 || ^7.0.0-0 || ^8.0.0-0" + }, + "peerDependenciesMeta": { + "@nuxt/kit": { + "optional": true + } + } + }, + "node_modules/vite-plugin-vue-devtools": { + "version": "8.2.1", + "resolved": "https://registry.npmjs.org/vite-plugin-vue-devtools/-/vite-plugin-vue-devtools-8.2.1.tgz", + "integrity": "sha512-5JLxXWWCo5lJMw16/xVeNvJ8k2zLwZPf1vITLzya/2IePrCBeGe/p/iAokgXHZpEi39fcYtPXmO8SaKeXmqCAA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vue/devtools-core": "^8.2.1", + "@vue/devtools-kit": "^8.2.1", + "@vue/devtools-shared": "^8.2.1", + "sirv": "^3.0.2", + "vite-plugin-inspect": "^11.3.3", + "vite-plugin-vue-inspector": "^6.0.0" + }, + "engines": { + "node": ">=v14.21.3" + }, + "peerDependencies": { + "vite": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/vite-plugin-vue-inspector": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/vite-plugin-vue-inspector/-/vite-plugin-vue-inspector-6.0.0.tgz", + "integrity": "sha512-OpyITJLgZNibxlrik1EmRtvXHDjLRxNPsWkGFTERZs2LgMEdG4W0WoFt5GIgp3a3jRou+eJR8U1zOBk/XQgEbw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.23.0", + "@babel/plugin-proposal-decorators": "^7.23.0", + "@babel/plugin-syntax-import-attributes": "^7.22.5", + "@babel/plugin-syntax-import-meta": "^7.10.4", + "@babel/plugin-transform-typescript": "^7.22.15", + "@vue/babel-plugin-jsx": "^1.1.5", + "@vue/compiler-dom": "^3.3.4", + "kolorist": "^1.8.0", + "magic-string": "^0.30.4" + }, + "peerDependencies": { + "vite": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/vite-plugin-vue-inspector/node_modules/@vue/babel-helper-vue-transform-on": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@vue/babel-helper-vue-transform-on/-/babel-helper-vue-transform-on-1.5.0.tgz", + "integrity": "sha512-0dAYkerNhhHutHZ34JtTl2czVQHUNWv6xEbkdF5W+Yrv5pCWsqjeORdOgbtW2I9gWlt+wBmVn+ttqN9ZxR5tzA==", + "dev": true, + "license": "MIT" + }, + "node_modules/vite-plugin-vue-inspector/node_modules/@vue/babel-plugin-jsx": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@vue/babel-plugin-jsx/-/babel-plugin-jsx-1.5.0.tgz", + "integrity": "sha512-mneBhw1oOqCd2247O0Yw/mRwC9jIGACAJUlawkmMBiNmL4dGA2eMzuNZVNqOUfYTa6vqmND4CtOPzmEEEqLKFw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-module-imports": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/plugin-syntax-jsx": "^7.27.1", + "@babel/template": "^7.27.2", + "@babel/traverse": "^7.28.0", + "@babel/types": "^7.28.2", + "@vue/babel-helper-vue-transform-on": "1.5.0", + "@vue/babel-plugin-resolve-type": "1.5.0", + "@vue/shared": "^3.5.18" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + }, + "peerDependenciesMeta": { + "@babel/core": { + "optional": true + } + } + }, + "node_modules/vite-plugin-vue-inspector/node_modules/@vue/babel-plugin-resolve-type": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@vue/babel-plugin-resolve-type/-/babel-plugin-resolve-type-1.5.0.tgz", + "integrity": "sha512-Wm/60o+53JwJODm4Knz47dxJnLDJ9FnKnGZJbUUf8nQRAtt6P+undLUAVU3Ha33LxOJe6IPoifRQ6F/0RrU31w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.27.1", + "@babel/helper-module-imports": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/parser": "^7.28.0", + "@vue/compiler-sfc": "^3.5.18" + }, + "funding": { + "url": "https://github.com/sponsors/sxzz" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/vite/node_modules/picomatch": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.5.tgz", + "integrity": "sha512-RvwwcruNjI1ncT5xRakeyS9Lf8lcItv34KD+aif+VH9kduAyfYBipGh12274xtenIPZ119/R9BdTBa8gAwSh0A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/vscode-uri": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/vscode-uri/-/vscode-uri-3.1.0.tgz", + "integrity": "sha512-/BpdSx+yCQGnCvecbyXdxHDkuk55/G3xwnC0GqY4gmQ3j+A+g8kzzgB4Nk/SINjqn6+waqw3EgbVF2QKExkRxQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/vue": { + "version": "3.5.40", + "resolved": "https://registry.npmjs.org/vue/-/vue-3.5.40.tgz", + "integrity": "sha512-+8PJ4SJXdn/cHGImF4CKdxlWHIN5Dkt7DoufRREM6h6uVCx2m7QxgcEQmmzyOK8A9mcafg7sFbJFYsdFVubTig==", + "license": "MIT", + "dependencies": { + "@vue/compiler-dom": "3.5.40", + "@vue/compiler-sfc": "3.5.40", + "@vue/runtime-dom": "3.5.40", + "@vue/server-renderer": "3.5.40", + "@vue/shared": "3.5.40" + }, + "peerDependencies": { + "typescript": "*" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/vue-eslint-parser": { + "version": "10.4.1", + "resolved": "https://registry.npmjs.org/vue-eslint-parser/-/vue-eslint-parser-10.4.1.tgz", + "integrity": "sha512-Gk6gRDj0n/fkRa3C3l0bBheoBckUq/Rs0F/TvMWIS6nzzx67amAViMe9CkNgsP2tXyQONvGiHQESHwFtZ3aYDA==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^4.4.0", + "eslint-scope": "^8.2.0 || ^9.0.0", + "eslint-visitor-keys": "^4.2.0 || ^5.0.0", + "espree": "^10.3.0 || ^11.0.0", + "esquery": "^1.6.0", + "semver": "^7.6.3" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://github.com/sponsors/mysticatea" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0" + } + }, + "node_modules/vue-eslint-parser/node_modules/eslint-visitor-keys": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz", + "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/vue-eslint-parser/node_modules/semver": { + "version": "7.8.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.5.tgz", + "integrity": "sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/vue-router": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/vue-router/-/vue-router-5.2.0.tgz", + "integrity": "sha512-QAC5i0LEb1GLG0LXDQmHu8L7FX12j0KwU/JTKmLQUJMrn04gQdKP6Du+p0QwpHb3iy71vBlqnHQ8WAfOSAWhqw==", + "license": "MIT", + "dependencies": { + "@babel/generator": "^8.0.0", + "@vue-macros/common": "^3.1.3", + "@vue/devtools-api": "^8.1.5", + "ast-walker-scope": "^0.9.0", + "chokidar": "^5.0.0", + "json5": "^2.2.3", + "local-pkg": "^1.2.1", + "magic-string": "^0.30.21", + "mlly": "^1.8.2", + "muggle-string": "^0.4.1", + "nostics": "^1.1.4", + "pathe": "^2.0.3", + "picomatch": "^4.0.5", + "scule": "^1.3.0", + "tinyglobby": "^0.2.17", + "unplugin": "^3.3.0", + "unplugin-utils": "^0.3.2", + "yaml": "^2.9.0" + }, + "funding": { + "url": "https://github.com/sponsors/posva" + }, + "peerDependencies": { + "@pinia/colada": ">=0.21.2", + "@vue/compiler-sfc": "^3.5.34 || ^4.0.0", + "pinia": "^3.0.4 || ^4.0.2", + "vite": "^7.3.0 || ^8.0.0", + "vue": "^3.5.34 || ^4.0.0" + }, + "peerDependenciesMeta": { + "@pinia/colada": { + "optional": true + }, + "@vue/compiler-sfc": { + "optional": true + }, + "pinia": { + "optional": true + }, + "vite": { + "optional": true + } + } + }, + "node_modules/vue-router/node_modules/@babel/generator": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-8.0.0.tgz", + "integrity": "sha512-NT9NrVwJsbSV6Y2FSstWa71EETOnzrjkL5/wX3D2mYHtKM+qvqB1DvR4D0Setb/gDBsHzRICifwEWMO8CnTF6g==", + "license": "MIT", + "dependencies": { + "@babel/parser": "^8.0.0", + "@babel/types": "^8.0.0", + "@jridgewell/gen-mapping": "^0.3.12", + "@jridgewell/trace-mapping": "^0.3.28", + "@types/jsesc": "^2.5.0", + "jsesc": "^3.0.2" + }, + "engines": { + "node": "^22.18.0 || >=24.11.0" + } + }, + "node_modules/vue-router/node_modules/@babel/helper-string-parser": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-8.0.0.tgz", + "integrity": "sha512-6mJgmFFFIIO82vvoLt9XtRC7/TkzXfts1t/SpRX4IHSzMgqoPYCWesVu1udUPUWioAE/2fcG6WuI8zrkE1gwrg==", + "license": "MIT", + "engines": { + "node": "^22.18.0 || >=24.11.0" + } + }, + "node_modules/vue-router/node_modules/@babel/helper-validator-identifier": { + "version": "8.0.4", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-8.0.4.tgz", + "integrity": "sha512-4wFaiLd0bVo4cIoTXI3zKI038NIWE/cr3jvBjejOVYVxV/m8Ltav1USiGzG1fmS5J2RhgEOgXNNK46cRPnRsrg==", + "license": "MIT", + "engines": { + "node": "^22.18.0 || >=24.11.0" + } + }, + "node_modules/vue-router/node_modules/@babel/parser": { + "version": "8.0.4", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-8.0.4.tgz", + "integrity": "sha512-srpptsAkEbbNIC/q8nT7o+m6CQe8CJUTV/t7MYc9NnWlgYVtHOb7JH6SorxMhN0kuRJjVqXbKClG6xSbPtzz+g==", + "license": "MIT", + "dependencies": { + "@babel/types": "^8.0.4" + }, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": "^22.18.0 || >=24.11.0" + } + }, + "node_modules/vue-router/node_modules/@babel/types": { + "version": "8.0.4", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-8.0.4.tgz", + "integrity": "sha512-eY+Yn3dCqTGmyiq2QRU66lA5FL8lqqqvecHt0fF3uHONIa7ToYsaCiWV8lOKqAs0Rb2SjixiKFROngnulPtt2g==", + "license": "MIT", + "dependencies": { + "@babel/helper-string-parser": "^8.0.0", + "@babel/helper-validator-identifier": "^8.0.4" + }, + "engines": { + "node": "^22.18.0 || >=24.11.0" + } + }, + "node_modules/vue-router/node_modules/picomatch": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.5.tgz", + "integrity": "sha512-RvwwcruNjI1ncT5xRakeyS9Lf8lcItv34KD+aif+VH9kduAyfYBipGh12274xtenIPZ119/R9BdTBa8gAwSh0A==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/vue-tsc": { + "version": "3.3.9", + "resolved": "https://registry.npmjs.org/vue-tsc/-/vue-tsc-3.3.9.tgz", + "integrity": "sha512-TS3Y1ux/IRoE8OCP2PpACAeOseuIs0UvWrcr7u+w3PmfY+SlCfEf8zjrBgnQksHUgLpthi5vHlffcQTQTdPBZA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@volar/typescript": "2.4.28", + "@vue/language-core": "3.3.9" + }, + "bin": { + "vue-tsc": "bin/vue-tsc.js" + }, + "peerDependencies": { + "typescript": ">=5.0.0" + } + }, + "node_modules/webpack-virtual-modules": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/webpack-virtual-modules/-/webpack-virtual-modules-0.6.2.tgz", + "integrity": "sha512-66/V2i5hQanC51vBQKPH4aI8NMAcBW59FVBs+rC7eGHupMyfn34q7rZIE+ETlJ+XTevqfUhVVBgSUNSW2flEUQ==", + "license": "MIT" + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/word-wrap": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", + "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/wsl-utils": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/wsl-utils/-/wsl-utils-0.3.1.tgz", + "integrity": "sha512-g/eziiSUNBSsdDJtCLB8bdYEUMj4jR7AGeUo96p/3dTafgjHhpF4RiCFPiRILwjQoDXx5MqkBr4fwWtR3Ky4Wg==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-wsl": "^3.1.0", + "powershell-utils": "^0.1.0" + }, + "engines": { + "node": ">=20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/xml-name-validator": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-4.0.0.tgz", + "integrity": "sha512-ICP2e+jsHvAj2E2lIHxa5tjXRlKDJo4IdvPvCXbXQGdzSfmSpNVyIKMvoZHjDY9DP0zV17iI85o90vRFXNccRw==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=12" + } + }, + "node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true, + "license": "ISC" + }, + "node_modules/yaml": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.9.0.tgz", + "integrity": "sha512-2AvhNX3mb8zd6Zy7INTtSpl1F15HW6Wnqj0srWlkKLcpYl/gMIMJiyuGq2KeI2YFxUPjdlB+3Lc10seMLtL4cA==", + "license": "ISC", + "bin": { + "yaml": "bin.mjs" + }, + "engines": { + "node": ">= 14.6" + }, + "funding": { + "url": "https://github.com/sponsors/eemeli" + } + }, + "node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + } + } +} diff --git a/package.json b/package.json new file mode 100644 index 0000000..1b7198a --- /dev/null +++ b/package.json @@ -0,0 +1,51 @@ +{ + "name": "fabric-trade-admin", + "version": "0.0.0", + "private": true, + "type": "module", + "scripts": { + "dev": "vite", + "build": "run-p type-check \"build-only {@}\" --", + "preview": "vite preview", + "build-only": "vite build", + "type-check": "vue-tsc --build", + "lint": "run-s \"lint:*\"", + "lint:oxlint": "oxlint . --fix", + "lint:eslint": "eslint . --fix --cache", + "format": "prettier --write --experimental-cli src/" + }, + "dependencies": { + "@unocss/vite": "^66.7.5", + "@vueuse/core": "^14.4.0", + "lodash-es": "^4.18.1", + "pinia": "^4.0.2", + "unocss": "^66.7.5", + "vue": "^3.5.40", + "vue-router": "^5.2.0" + }, + "devDependencies": { + "@tsconfig/node24": "^24.0.4", + "@types/lodash-es": "^4.17.12", + "@types/node": "^24.13.3", + "@vitejs/plugin-vue": "^6.0.8", + "@vitejs/plugin-vue-jsx": "^5.1.6", + "@vue/eslint-config-typescript": "^14.9.0", + "@vue/tsconfig": "^0.9.1", + "eslint": "^10.7.0", + "eslint-config-prettier": "^10.1.8", + "eslint-plugin-oxlint": "~1.73.0", + "eslint-plugin-vue": "~10.9.2", + "jiti": "^2.7.0", + "npm-run-all2": "^9.0.2", + "oxlint": "~1.74.0", + "prettier": "3.9.5", + "typescript": "~6.0.0", + "vite": "^8.1.5", + "vite-plugin-vue-devtools": "^8.1.5", + "vue-eslint-parser": "^10.4.1", + "vue-tsc": "^3.3.7" + }, + "engines": { + "node": "^22.18.0 || >=24.12.0" + } +} diff --git a/public/.htaccess b/public/.htaccess new file mode 100644 index 0000000..ec82b63 --- /dev/null +++ b/public/.htaccess @@ -0,0 +1,18 @@ + + RewriteEngine On + RewriteBase /admin/ + + # Serve existing files and directories + RewriteCond %{REQUEST_FILENAME} -f [OR] + RewriteCond %{REQUEST_FILENAME} -d + RewriteRule ^ - [L] + + # SPA fallback + RewriteRule ^ index.html [L] + + + + AddType application/javascript .js + AddType text/css .css + AddType application/wasm .wasm + diff --git a/public/favicon.ico b/public/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..df36fcfb72584e00488330b560ebcf34a41c64c2 GIT binary patch literal 4286 zcmds*O-Phc6o&64GDVCEQHxsW(p4>LW*W<827=Unuo8sGpRux(DN@jWP-e29Wl%wj zY84_aq9}^Am9-cWTD5GGEo#+5Fi2wX_P*bo+xO!)p*7B;iKlbFd(U~_d(U?#hLj56 zPhFkj-|A6~Qk#@g^#D^U0XT1cu=c-vu1+SElX9NR;kzAUV(q0|dl0|%h|dI$%VICy zJnu2^L*Te9JrJMGh%-P79CL0}dq92RGU6gI{v2~|)p}sG5x0U*z<8U;Ij*hB9z?ei z@g6Xq-pDoPl=MANPiR7%172VA%r)kevtV-_5H*QJKFmd;8yA$98zCxBZYXTNZ#QFk2(TX0;Y2dt&WitL#$96|gJY=3xX zpCoi|YNzgO3R`f@IiEeSmKrPSf#h#Qd<$%Ej^RIeeYfsxhPMOG`S`Pz8q``=511zm zAm)MX5AV^5xIWPyEu7u>qYs?pn$I4nL9J!=K=SGlKLXpE<5x+2cDTXq?brj?n6sp= zphe9;_JHf40^9~}9i08r{XM$7HB!`{Ys~TK0kx<}ZQng`UPvH*11|q7&l9?@FQz;8 zx!=3<4seY*%=OlbCbcae?5^V_}*K>Uo6ZWV8mTyE^B=DKy7-sdLYkR5Z?paTgK-zyIkKjIcpyO z{+uIt&YSa_$QnN_@t~L014dyK(fOOo+W*MIxbA6Ndgr=Y!f#Tokqv}n<7-9qfHkc3 z=>a|HWqcX8fzQCT=dqVbogRq!-S>H%yA{1w#2Pn;=e>JiEj7Hl;zdt-2f+j2%DeVD zsW0Ab)ZK@0cIW%W7z}H{&~yGhn~D;aiP4=;m-HCo`BEI+Kd6 z={Xwx{TKxD#iCLfl2vQGDitKtN>z|-AdCN|$jTFDg0m3O`WLD4_s#$S literal 0 HcmV?d00001 diff --git a/src/App.vue b/src/App.vue new file mode 100644 index 0000000..73bb1a9 --- /dev/null +++ b/src/App.vue @@ -0,0 +1,10 @@ + + + diff --git a/src/assets/fonts/iranSans/woff2/IRANSansWeb(FaNum).woff2 b/src/assets/fonts/iranSans/woff2/IRANSansWeb(FaNum).woff2 new file mode 100644 index 0000000000000000000000000000000000000000..c3dcbab7c5d72d3c549c953c714385043a28566b GIT binary patch literal 27944 zcmV(@K-Rx^Pew8T0RR910BtA$4gdfE0NFqQ0BpZXAkE24Db>1Q84hf~S0e`b-OlS^xny0we>EFa#h4jBf{{Asf5BHzIfU z%SOR%1At!IeycYY$W7M-x&vtmjTfO&QL{LyptAq}|E%Oh#$Z0!cTKIj83ZRKx&xO+ zdEE-xpM^rz%8A6-stQI&!jKdQJC4)zsy9BJ`|@wBW(TGgZt<@0rBDj3P01NW66lxs1Ojah-f=dHjG63+y3_>{pdlM z+y3*PQtFh5lvF5f(qRxKr;H+7BK^rab+UglPKHtjQG(6*wCTV1PLYZ+YDVp{Fmck5 zhC1_0!;FeiG1@sKpV*k#N-GA=3v(*=#$kX6JB-yY{l~!oa{Ny0Ql+My>t%QBn6Zry+rC0la zkenK6(&;9hNhZAvOh@2_AQf%Ycl$zr

Z#+o%W+q9{YBHsREvz2#1k}IV$Kj7fJ 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

9@C?pBz?+Mg) ziQ&%oS2~nCb?FBRc2-r2eQ6P9zv`?hy_O|k*1A2@xCKT9;?@DJ4O1@* zaUz=0Qc&x3U3PxM&|nFD#LdL)1~22I0`TAX;luk(p@dapeumsi$tH^}YEcpGkd%__ za}(3&Iz4(FwZlVZr)FXz64Hy_^}|~V#6*8}DcJMfIGTsnx?b$br_KAZJHuo@!Snov*ExD>CZ8A7Y@?i2>TVZ?>Mc z$-SF1h~bnO(6mrbnO&a9>HN^`lD!eejQA5v{QMYIOf3xyn}<-(xNo;cK0{r~6NMrh z0%WexZ6rUkB9(6;W}}%>0YDs?OxH{LVoA-B8lupY|84D{Hf#Q9-7If;GjrRu-nxsuem)Q$Sd0y~ILD2`Cd#1B{KygbLJflBlM5_Lq6qF;K;-qaGBPaDU4pQNkt) zQ`t_E<{Ux7v5-*!Vr4>*NiIR^v~&!V&x&Pt1n8RrvG@O3h1iNUp&hvj7_1}h!62Cs zk?6bAYZ1UZ)ak((C6~pf@aXG7F-xb{!w|X0v&1ZOQ+Exwt^L`0a_jK+UkVO&C`N3F z`$~agVUy#!k5~pJ6N$dVk%lyUpP?a$d?0F3aEcVN3hFQGr$=@km#-sLj-c~5-^yzO zrH^V;_CTb0rowH#r@mjSaVpvG;dQE}O+N?#Pfp<&`&uH0S=4cF19~fT^Rov9;p|F0 zKQf0W`^u;g&Qq%xg-T%0z$i2vvQWNbraYxE>XtlzA51q#!;m0)!WTWU5Y(jf_H>bgCw;Au8-~Ao8h#@kn=1vq7_$ z0ODTl;+=C^33Sbkpp1>%{k@4MbLD9QFy#NH2ROVcIpfUUi=MmCOI2$>ZELOw0Ut<~97Ub=utJJzoC5{k~@VxG_1 z*U9D-fg?Y0F@HgPQaHnIM<^=6ObPT*Hc!wK&0F?#u-Io}JC+-*l;t&AmR&H?L+o^g zEs_(Gd-MyyuQv7GvqRz>t+<>-WL;I(Zx>4Nrj_WFXol5+$kl+Ulc8ONr-kEaX3jES z_+I=%c$1e(3Lzs3N+z}J{oFmbO(1)*$ zr~JE&w2n>dTx&6wJAJ#{mgC}DkXL|0oogg9VMz7~$v0Wi#7O&hPkY34*amciOb-jZ zCo#8HY~`8~1=+VtFnHyLnpBaw_jqNy3#$%hL);}a0~PQk+tXA*b{J)Y&i=ZZ>zZBwS=z)8*nWa8FQE$W za_iA4tz}RBRH;l<3IuwBzw5+pI zVf`vc4t&7}@0NEVtU;0Rnujs=krSCbv4XF%F>eWhxskTon1V{WvXkdS=n#4b0T1OP zt@ZqhkO6!wI?z22w?bnW1mwbonnk7bi-(ec)cz%6A=?gysuPP-{TCt>)vK)C< zdYKTu=s+;OFJT* zrXE0BcPIXSdE5z!Fqa;QYsu>h(3n;+Ty25I=zI!8(~$1%#Qj{Sf?>G?5?kv@Q-N~Y zPoE0iM0y0#WL+!ND|}{!?aFE4F-jN!`}>8%^&5hl6?!fIh^rvP4KW0H5{eb6Gxof4 zv=+nr;387MRc|XE%ub#Qp+m@R1Tsb+^-#o76T~_32s^%vVa5H=yHvYsgEHa`^w-~0 zUw<3K7;=-I^DxQ|;6|#+1Ew?fvbRj@Ab#6EGKMW@iZl(E0TA^rO=BOvc>#h%!A5UUeB*h@zhO>I+!^ z)&KeZ;mZG4O~Ebj|E;{g|KI-)5+GzXasxfGLL6~=Udw3C=WhLkZOOY%-VY^qf(*`W zP-ejlPnhjERYR03jzp6=*)uiPwNIwbr`IPfQoVy?9l}epQL>j8w13Vmt(q&G>}$!e zWY&RzY90c^=)LeQUA1=9LY=ILCL2nQn-*9Ng39*BtAqvf*1z|JEq)?%I6K_z#yL~$r0>isxx zA3T-m8DUw?=Yp8EXRMCLBNImjO{^Yl93I}6cD--6KQzG^b&Eyh++2Kl$g4_dj~(Z^ zb1-(_cAzW@8T~-Vf@YV0eUhsjGD_X)bYzWdA3SUQ} z@(fvoVZUAEKJM<@o$1l}mXpOd@nz`UyA`6f%j`VkpFH=iIm4{5$&UIKDi8F=Z80OT zs5FK5{`A!eA0mfq_O-#C_bV)3EnBGS&}S;=9l?!9ckwX=I|?EogbIQyBs#?(E~E2l zEPMngL}*Hqub{Rwmg=WW?mtVksSS!+W6SHZ0t(8-LV`NBNRiyThov|Wl`Rj8k?KgL zQFLD*WUDeB9U1jDX&nGDkI&m$+xaVzoGo*z zjGUokycOK+HpVIYPu5-qH}_jAzmi|ApHoE$itDl`f-fmz^(qPK6%vC&RGfL zY?@QnTsS~Yn>yK!R^P^VQ=ggY3;Al@oHBx6T$4Q(yuth)W(AD}bcz9ouE!Z@gh;$~ zljc;u7res{7WPXRNybv-j{7v~J^(jWyLO~nr%a-Iw^dV=0hq?0lVx1wBq`Y{E~X|& zzV#E95zql8e1y{|E_o*Im-Wg~GIP!!9b*=?vcL2<$!hO->R_ZZi1d;Qld+=Xdk zg}Et$lQbv@h&+CebZ0=K{4>|+eD2cs;grk!PiCR!oV-J2TeWPcUBul1JC+^o0+L|24!mY!EYEs>z_zd=k-k^3--hT&ameOwXNlfQ zk?IelrBS0n8&VaZb|1h)1btz;HJha2;~5+o z0skxj)3IZXC4Uj2cfs^-gsSMWhO*Da-T3fQRH)zh6gym~7GZ4O zks0Fg*ss)k;9o6_a%5JLJztYuA>&JxVg*}7+~)Nrbae>yz)dF99H6T$)WlPF%hnUD zU5?FNbvUhG2<>W=t0P*u^N!q)KaR5V8=r2DrTZqHL_9%wp4eChrCJu^T}eOR@$9Xne$QLQua40 zcHKg-&{ZE1Z5~6a2i8T-66C2Z!|u}PfuN=wuh1Q%;J}9zlkQHJ$_|+y@ed1IUX zsGL?sNT&g>hwta+MBiJ_4-F0vQ_*Y2!|xLd@IA3VH~-%L^ZPrr5}TZ+AoY?34y~&p zZz_%PxW1{Rd82jnuVFk5E)q_5wHE0gL^yjR>&%6bk?C0=+^2o=c^^j<&h(!b!}ZO# zB^ky;7u&mBX%Na7iUN9HZ<5d`_crR%T|m08iGp4L*YgK{ z8@DTwiXil%I1un*yMKC@#w{H@A>&jZH^BUtzUbu=L-8msI6&dey*fn$)gY51@O17N zW7x9w%9g^=_GhwkptH-2yYAJ+W;Z-&U@QTzwLViPXC`8K^ARTRZl9>4!6lwPR4 z#|e%ZAe?G`_k6Sxm@VWh%PT@7^KQJ`v5_P*N%`pM_tBKm>jhg1LdzdsiOku@!qa~G zS@?#J?B7Pt=IzzolD+?G^2i5}1BbTVM%22unW3+V#O3_NH!GpK!d+Ld-OsH&2y-Ok zg*0xW!e;vIh%%Rn_tm2Ll5IFX?fmq%-FLfr8uvnwIsgWLbZ0;CyQ}MOSJ>`P!5b_? zv^v`6M)K1wdo>hW@D9qJ!7C=lq7EhMZh8Q4|IIAM&8)~|n8G43%(qw3UKBr-9^sV` zAl~NBgHY~t7eNA-O}|3-U%Pc0u>8Gq<1co8RdKuq_!o$)TJE%|57m`SA z1naC&A8dx6#^Qqm2qZyN`0cPZM>@=xID9~F>K=0Q7?+jajiQE77$R2Ng>;3!&>-29 z_3+EDKd?#QbIaBN15VQ;D8zsp+1ORr#g38cN(8u>8&Wo}c;ZYI!r)!XVjJOZkoNm2 zQdD{4D)s<+AyAm|r-mt-bYO$M_;I3l)R6b=3w#Jm)%W!-I}#bfrm425&FdV}OShk< zu^yii221{Y?L$9K_jHd#{^Ml!wzMZYk>HF1uEwcUdg64sv~Q0&jS-h~pP;bERxG@W z^BFfC*d2nB-B#vVFw@hEQf@{sd_Qon*K9H`9j&ZLanduSyW@Mfa0*AVg8q&S6DA!I z2V9L0-YGyOQk+|;QlFq9VW{diAhGe0XhrlNDN?QJR>oaLB)>_YBlP zoh;$|`V#71*dFx+UsfylO}p2_Wqd= zQPy2m7NSZ@@-#_`Mw{ejQYG?TSrk()ny1clLRwZ0UK;*6DRE)j@2t=Y>#cd%w*PY; z?8$$7J$MfbU+XNv$$*Ox9w!V7tvEDQi&de#HIuGrid+dpJd1}V3PGWAnx)-q74I>K zs>8(}Y0$7+CFuX6cGj zz1=(1Hs*D!uZEfDo(F~yW=4jPnar7^V?5Bx^2?(JHdedFe{xqA*Ue6m@=YE-_l9m+ zA^aPxmlaF0A3`1>&IAV91W^P5n{DmsyLb7vvh4$+-#6y!BfXrgn6Nbs`3*&D#@OfL z_Ra%UZ^Ar|soVtFAP9Q7E7l}`_re~flSN7oGV&c$U{KN?F%IezB5FMTHZNqffFWT! z{51A(1(jPw_zL&#!*{rMgm;YGQeN-M&>HZFwjFs8yRY#cl-fI~o)c@H<^I-MS0lmsS=*=?c1o0B;Wv zg>>!hHP2^3dz0-$bztGmn6v_5JYD_J7IFa#bEYfGN!I1BYZ|0NPG?FfHvu7AFzpY1GS?e6{oo`{= z0HsS%Us2qHupfNx;jhCu8GwbP^H7SU+cBpJtp{T6SMx>McFZ~K)XCVzR%;$Y10J`# z$ZKMx`;uVp4ixPay(U2Tf zSl>(q^M`o@5l78wN{g%S=Z;wJl-Mr3F$ZFQ;@d$5|ZAkdV;U!PnlNX%IYbCJP}<&TI^6 zp_C<%6*1|#g*k~dZkjP?|6Mh~yVHh{_2%GLp@dv|>nGD4CCj}@X!JsjMFmfHoP;^i z#u3@}mHF4JK&IvwI<7x({iS6Uw)@3?s@2wk4K2%o+S%mqoDQ|nPLO@3Mk>nXh;_Aq zu3v#E69ZU_0kf2Wu_CV2$j>IIoHAU;Ck}67|G9YdbCS}~ooIU?4tqV=I|wJik2mGD zN&-o$u5?Y0c}Dw4!TUF_fUeBH^d{)vT_@CdShIbWWaNyl^h5PPgnELMqH1H7D%8zd zPuKRC=}P_lQ$)5E`S8d*KCoy`Tl5A)zmjAXkkF+--sbp{hJ|=&z9>$h13kx zOnGTq^WW`{u*p*w~tU{xa6LWJorxC{_zCMv4s1?Qk6?<7KRrcK1Ju>T>m z{;O*@cqk)MK+*9aHf|}#J8aB5FAF?%LEeBVvQTkbWQ()j+VKpLG`+y4aVb#<;K%jrr+>odOPwCH$JVIRi2Blj|O(C1{?@b1hfh?T+ zaN(}9+DB{Rfb#?DxAMGKLjv)w&k+VNlY)g0DIewm0zFTZCoX`(&vXKrM)YFXH&*iR zXAVC%=3~+_v0=DkkOC}z9~c)r9=d?2ivT=iQW%Yaf`KYT^?HKiB4AfT`?$$)*~_rF zFc$n!m0U?8g zr(>Hcb73EW>CgZ6lb?j=@N8kjP3R05OuGf!an{fs_q~GW!o;qAVM3n6;XL5lmYW+9 zT88zTQhrFgWt-HLv|vVcc9h`n<5b*dtZYD|{TDGwHJzzTh0&??d8I%b!ErJL*kS?SS+Ftdu7(YdwB3ajC2c-w<_F90H75 zk6#5Aweysl)HTO|^%QLac3`~cbWK+ta6%^BCO^)xhfb=N)uOWW9`Rrh#z(8OUB z{0`Wm9CM;wC@Hr_*IqY~KJFEo8LLH>esmurs)W^t#fNdLq?e@;Jr6`BkHVe*bFzfF z7~}xPFQM+T{p2{&!v8=ROzc|Cejxp~-ydT8Zk5T^3)cS>R~O~WCECM|xq89PfAi-c zw|Zw^F(AMHZUBAf%P2c^_%r}_zm7(Q?!_-wK;DC6|DTTHx{YMaqW96iL|*~$k1G}{ z7%*U#9`_;q1)^PTMf>`1*1a3fybODQ4_g;BH8vFY7ttSx8kaw_ZF#sqN!ILHERl<1 z#upq>1k(SyXDaaDunj5zTE0e1mxgx7FV7~L2oN2lP`}LcfAx4K;4=j~>0_n@dn>~2 zq{1B#ihWzyMsC*!cMQF_^490in?w$t+F*v0)Z)>rXXHJ78wnN>$xlwD23e+P+-7t$zNzJ@5ai(Je; zT#oyxELq*)O2(TMfxM=_eCR!@UeSN$Gz0D#4S9BI1%PpM=63q^kYkAvrbICZsOYK&K{=&LXmQ5HTe~;aZ)fJW$z~jcFaK z*jNQj{;Sx~&Lb~cb|t(D?4@Mh@jdLn((``a;<3}zgt7k3#9iFxvXLl;+s?AGTQ4>S zJ1(-)+s^Thbt>lMJLp)lO^6UGf6+9ujul!T)Uj z1l%#BI?xc81K8ZQ`8IPmPYCxkH2wEV3>o#J_ZDZItmdxr0l8{V&%NJt4{v}~j|n=| zrvts}auTs0h_cd87tXLr5p&o=i8Dag`Nq|Pya^^0v6S8=%>|ZL@{0My)zdh-y0~J% zV@yWfdKznzraWS~#@v4rz+Gz|gHUn0y7;vlAAH_NUZ8dDOI=^+IRWoPz1dK;o4{uI zI=(MWaML^SU|Is`8|jxF1k*3*4hjxvzCp%%|J;xl4Em~d|MO)X-KK!5LHjGc} zC^QlfH?geLo`lqm?`A&E#P!vyQ$ilUXvzb6JriZ!^)=Nqd!xR6b9{>FwKeB2qd`F4fvY`RtJXuSe!`%Wt3BsWFDC)QSTc1Z>#HtbMuGy@g@;ksAl*@| z+SOUDEZx>n7v=CdLrwNMneq;7OjNu^L=q@hwF#v!xFB)Uy$m$#i?7B+gUIXBnH}ho zQ9$P(YCPO+71(9ns`WF3DWA*wRe*k1T2)-p+Cf-JMN3Cf#S9ouS#@bOAkoh(xF=hY zCUPM8!~{fT0rY%EgsOb74ukVcD2(n;>{paPee#Lq3RuCIf!^O98tCf1W^>2y1()T2 z0c=ev`tJt1&89Bg#e%n*+jxe)S+x&3yJ_Q{J%zcb?wvQEZiWj}$-(74hrBul7}^TA zb_N#pQBaYr3IR7w(l63{}2z6Yb7$jH+QMUCSm&&0cT5y}%)%jM-$f=c})Q zg4U-aTf5F(yM6-DN(r3~)@yP!;!076wymvIs~V~_p|;-Dd79dqTu}IG3=mRSN-5tr z$sys9YMNuMn#}0tt~JidE!ODc>L?!YsKb)HBl{i2lo?;C{>u@ipqdng^b8+!64-g6 z(Ca7hQ0F$dvHiXdruhfJlH2}>5Q>3lpED>kCe!75Y9ICp>0W%$*#^xOa5n)e;F@fQGxp_5&xDW{r92>TM75~|1|73H9(l>P0ELJc9wuu z?2(qL=&BcsFG_Zow3NhJ>$AcIm=p7y^n5sJJP8bBZ)Ql=I*A4;CGCFe!0+V)y@wh8 zJ0u8psH7^bCHR%yg#MfAh}68VMu@x%Gi>^fFCT z@QVCPbpL#KmyD>mW{g}dpjk_(v^4%+USCyU=>oD{XKmm6w)!l3V^j_elT2se#;rt-{S6(Q@Z^ z=jz3f+-#~ApcLmH2tK}LUh~dlsr?UgPZ@ws0C#HPNQHjxkfCC3NpDzO+UAwPY=R@0 ztc(nHp^D7}5xw^hFAqOxe^9-Abfev)b?@?lW$^#QbQL|ldO~tilGIhuY#IlCw6U#7 zpghjkwW3nOThH$V^teMSV>&wVwwfXp&Q1}le$&_yon9I4`asv7u%$>e&x5c#EwLrW zvnJL=nM7ltQUa~lLUm%stZmY zcEtsw0D0nm?bK35<+FC0X9hE4lrZ9d)rwQB!L&6_m zh=_X`dUu}s4Xbxhlh3<7^^W%;^?$deiXaJ z54~jRBtW1^r%Kt}y3+8dx{_1?@;5fVenFB(Rt9Th<2QBXjbA*>vq|ODz3v}1ACbrw zudq#tx$Eh#6{i}#e1vW$v$9z@*EAH+4wE<{zh=3sYUCHUGPR{$=A? z-Jy3Mt1-XFm`gJ<71U=bYoW$pd*=Qvj1v)b3)$B_TU-?WNC`J|G)!G#iBZk;wFS+P zEFVi=g*q)HEvT4CpJBn1n1loJNe#^WqfWIu*^YBlQqSYV{v;Rql6}Eon!*F5m$I|Z ziVWU9#U`Lt-c8Ip#z`}teEgA7Y{go*Jpg@@p`JbUw0-=-Cm;75`1d|YPuOjZYmmp;9n;UoAm9NnE^z<0b8`{rF5R_E$`-d@IK zpqFQ&i=qvQpLc*j!ck>MG&hZ5gSsd;hy)R63UoRW&GJ0s|3W-=)cWp(F=5Rs!qe? z6lkU7phCUJL4r^Dg}jNKj)>_e!;?AFU<5>kYahcTLsxkhZW7lAng^#z(*!)>IpH7y zN5T!34?Z6RyV8z>9YDSdlhD?YQ1&>SAHJN}wr1M!`3`KkNfGg(hhtl7=TtzkY_k>IeaH2~2k=+)pxwDlFh zTUCF(z6?D5@sI=%#auMfsgY5z5af%MsW_0X6w2rT9|d zn#um-<`X_9bhb+;slpb-Kn)7_aQw-{ zRSDGuZdcZU&Xe=%K+Abr;KY=CE{O-zrQQQPE#K0o zMuFxKZ7fMz8K}l|KFW4}p;&ppr(UFpeY)XZ8Se|l*4N7oDuvs=0saf(bmu zqiqRbSP-9kq$@2vF|0k`AO%)-jrkWm;wl@wu<~%+9{{de4GYO>e(H>dA|MFE%~#t? zLn#8pL1=S%t>J_XaWe@982;Mae3z~*iU{^`%0|G%bWDq6o#v~PI>{iE8liv@!@i#) z;!dj0@@1V=pHM`d#eFB&cNWLi$rn;MgrQLFZO|NmE}u_X$xeYEDVLj| zKr9lKGZ^%@ta;J(GN{uF~0DL568xk%86Z5Z<0jw-gux0P%J<&Mmi5OxoO=rHl{ zq!ggo&Idz-hcZcU+ek=21f{+eFey_xKoAwKK86>lbZJnQR0Voj7FCUp4+RqeG(a!4 zgTqoc4$@oZmH;!g&bl4%6tpRP)d!5EXrF zDkXN~74Z%b27mOr677nO@9IX^u~~Yf2_~JR(xs1}`EV@Wj-=YM+p8UE0KG0>ca}Ky z62)1hOazMTg4CBpp`9}Ny$uD_0+fb3;}KLALZs-7dVDY;Qt;BSE1?N~B7jS1%F6XP zvk2Gmml#Dna+*24IP;W-xm~40j?%f!K*=cON`+FX)G0Metz&->vFr(=K1tcm9P>s|J`y00m>SW7W{PY!8kueAxq((To+|74jH%d0_m9P&2jz zRuws?%Bm3{ytt&FWj<0FUp@rnBgp@T;RR+lu{Yc_&S2yeJdImYS#j}%mq%_-0m9kk z@&0#Q0@R4nSA_I*txnkks5+qfaU{6BKS#~%$M;27GudCbwWclqfEcNNcul^dCahc9 z$cfz?+Y=M6e6AWl+DOPxEm^0vXC+@zU3UN8Mpgl3Z(ek*G8fP0mLj*$Sw+n%9-naw zz#f%7VZT!5eDm&PJv*0f)IO~`3#BAy?Nk3+MdzPc`*3B7o<4okRMjv~NYTppjF$W| z_Hk;QKD|#&TS9<(D~Fm*#Ze_Pd9hMLQec_$D^xKTA!*bYYNQZ=oDe`&O2y@24T01& z*{%Udk?h)6QMTUH)e|uB_Oc#}!{&x70_HoE@L+-%yX8GM_cKpP>(VT%^X=A4Ut?A6`>NKXs%gOl zbH*C>FJ*8yW$!!#Dj7f~9+9F@`tAP2{$}J!B_wz=tH;Rb%$f^klQF_!8w}kW>7z4E z4;1_)muRm70LvAl?PdVcSTWkI``S~Y zR`2oqRImZk*7Zj3iBuAzuQcJNu-d|pd)@>`l>~333@c|;fY_eu;bJ;uVfK3KW#?Vw8JgS%BlSgA2{AnmI9dT3zz^1O$^LItFI0$iMf zIijq5zFuwM8`5XMp9<8Y)h^l+ap2=sAGZY0@AzMP`UL_=zzUyZs5uMw{fAg5E>XgsQ1;8a;_EI2UQMd!cE)yKmSd|+S+iO6ECE#F zd}&{+&0jX{%)^t-Qdf3eBH@axFSM@fqBG)o$`iN9S>L}*dX`hi&ZTr7E51gp(Vvqj zm0v$4J6lFWGiclp(7Nh8?IXJ5L0r*gZ>@UvKn*S{9C823@C1(69dnnc{Nir2fnrgf zFOg69{haJ;@R`i3-$PH1+x?BfpcQs1`=J6|qi$bo(S$b1g|p|U#Pevqjb1~o)9*5q z@j%PwLcPKMhAu10RY9t|7&QPZr@N~Oz$#f&maa>)wF4$lkU-9A0Wj&BJb3{wKMH)f zH34~{LQgUhw+Y*aiSnPn4gHZe zluk$^6T2%%s#I8MN6Df_O1&+qPxLh@M7lXW3ZbSnN>0f_d!?I+byR^GX?ezZA;m2o zElnSrnVWGFTWzn_p?Wmp@tSv9$uI9jH!V`BY0|IKGU=FnqB-wL-Blrdavl6Ieyl2h zXjKQ0$qK`JIGBA&4Mx%l(`uDkoZSHINu|gu8n5e>H?7XISAYE<7gN?;?xf|1nKA0q z#8PfZn+Rb;4OXor?vw0&V7S&gj$u)V9$e`owCbU(e1l?#SYsIWfwHcZ+z+%}bY^D- z$D|_6qOjRggiWX~Hd!3DFDDA5vwQu+y~(enxw(4*!Lvkdo-&;HiiyxMj|s;@(oD;m zCLH@0)%DT}W6yb>k)^GJx}M|E8S5TSbwkBag7H3; zm152$Z)u7+N{hLEZ^-N)vWC;(P}&?eV}&~ZV0nnL7NoVAfYs@LwQG-T1>V%mElN<6 z5+1!f%)0L2rU8R3YjV>nwv5RhW;a~&oe1>j10JZFg5r88oQ={X6puvVZRE#vJXYvh zaJDsVGH@|Qys~zg7$QJv(-JjZ(khCDEo*tk5?cd_HP_o%=Ept6R=5=W! z`iWt4Qq(ZJw(XG8#C*!zP+1+##3`*L*6SCu^^adGAYTsUXrvdT@BEk;+sRBu#lF7l zzWOJtIc)7MU2`xax#0x?+wzU%zHdjF$xEELO$IJBD}F7|9}azi;9gwz zzjfbzql_}#?j3Wuhx-<#PAN)SOSSpi!cglvNgzP@Nj-#95LY?4O!P2Qya@#xMVtWZ0;uJh_y0vZEC-Q zhfl;GjK%el5ZDbQlOX#!CG35NZ6x=B)9EWp^JerC2dT<}6rd_ASLpF>r1^D3X ze((C>&*FvE8di2)`9W$Xz`qi_e*gbkDkD>$;0|4+E@39V5S8*uy&B0ld^b=cW&F`o_Q zh03v4N~SPk{kFi%G(1lzlTTSUSwUu_;cZhuE2O8Bk-rYZ!r8K#Q3j^mt$~t4q?TMw z&ttL+5-=f9v5LG54~%>?Ro^+4emo&WOoz8A1EQD1g!~=z@_v+;X*ET$aT|~Bw3aheH{`q2Z$z*9E3Za>CBv)2w zm6*1a*nre&g@{eBSSrt|9ETT1a~aA?dtGWPvm0Q*bn2BBx9omP2K#z+-951LCc{ra zhyaEJ4C0W0Wa2`Q5OU5uqg11h6+){6V?!6k$uQ0GqO9ts?Rqvix0;w_h@;uz^sjyw zswDu(pXh@T6vGLUq8XOs1yN#WQ^jFuX4ZWBgVAKRSZ#KNsZoqnz1zd-a(lc!ze>>z zbEBI0va+ITx?x%zZgS5zHe^yn+=? zEgd}rBNHDQO5uC}GE=-3VK};>5v2@)h= z$dDm}K!Jis3p}PPIGq5kA=?CiJ)VYhA`pWhL4pJf88T$xo(l*bV$t%vzt`{I=o-#6 zjd?#$d&u$tHS}nO;Czc;pYlVoWWy|5<+Eun6^Wg;mo4Qn@Lk>%vqf`d6F)k|lU-oc z+ETm?6Q@z;V(iQY$6f zaHW(^3Ofl?;B;rz#Tr$B5_>8y1<-Irb!7qoAP}&SQF9gA1=(KkbMjb&g(XxY@F{1zff>1aTZ07fx1kl;9hd%jgg z?zulSZ>?xQ0s=A7%^@9Rl+g@vNpNh@imuQ?f(BAF5ID#X&epWys)R!u3Kc3;(5O*+ zy~~H`%_Rlgb0@$kh5=GK8gO@7U}yV}2vJBX3&$2IQgGzRkwcOX;+Zf`^#(@bda;hE6;atn(^ZXe9_ znLbOP&jg*vhjwD=eVd}PRhT_aBper4SvEhf0E|+`;#1a*>}b>)bEV* zwC_!o+L6DtS5r5(Z@ta%uPRTNlNjxSq?%lw&PekNisdl`Y1-4-`Cmi2hqoh5^RPmS jb&EqU?Ch5)%;z}Y%iQ?ql5(?qOSH$^#(z9|QVswBgnRzM literal 0 HcmV?d00001 diff --git a/src/assets/fonts/iranSans/woff2/IRANSansWeb(FaNum)_Black.woff2 b/src/assets/fonts/iranSans/woff2/IRANSansWeb(FaNum)_Black.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..fc008ef1a5918f5da81c420674cdda32d2ec67b8 GIT binary patch literal 25776 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 literal 0 HcmV?d00001 diff --git a/src/assets/fonts/iranSans/woff2/IRANSansWeb(FaNum)_Bold.woff2 b/src/assets/fonts/iranSans/woff2/IRANSansWeb(FaNum)_Bold.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..69f7c66b32ecc702c0538ebf8af1ae2b8492295e GIT binary patch literal 27316 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�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 HoE=;RIlKi? literal 0 HcmV?d00001 diff --git a/src/assets/fonts/iranSans/woff2/IRANSansWeb(FaNum)_UltraLight.woff2 b/src/assets/fonts/iranSans/woff2/IRANSansWeb(FaNum)_UltraLight.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..8b77d174b7e732d1f2c9e38543c8bc57f416d216 GIT binary patch literal 28208 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 *:not(.admin-modal-backdrop) { + display: none !important; + } + + html.printing-order-detail .admin-modal-backdrop { + position: static !important; + inset: auto !important; + z-index: auto !important; + display: block !important; + padding: 0 !important; + background: transparent !important; + } + + html.printing-order-detail .admin-modal { + width: 100% !important; + max-height: none !important; + overflow: visible !important; + border-radius: 0 !important; + box-shadow: none !important; + background: #fff !important; + color: #111 !important; + } + + html.printing-order-detail .admin-modal__header { + border-bottom-color: #ddd !important; + padding: 0 0 12px !important; + } + + html.printing-order-detail .admin-modal__close, + html.printing-order-detail .admin-modal__footer, + html.printing-order-detail .no-print { + display: none !important; + } + + html.printing-order-detail .admin-modal__body { + overflow: visible !important; + max-height: none !important; + padding: 0 !important; + } + + html.printing-order-detail .admin-modal__title { + color: #111 !important; + } +} diff --git a/src/assets/styles/fonts.css b/src/assets/styles/fonts.css new file mode 100644 index 0000000..7493471 --- /dev/null +++ b/src/assets/styles/fonts.css @@ -0,0 +1,39 @@ +@font-face { + font-family: 'IRANSans'; + src: url('../fonts/iranSans/woff2/IRANSansWeb(FaNum).woff2') format('woff2'); + font-weight: 400; + font-style: normal; + font-display: swap; +} + +@font-face { + font-family: 'IRANSans'; + src: url('../fonts/iranSans/woff2/IRANSansWeb(FaNum)_Light.woff2') format('woff2'); + font-weight: 300; + font-style: normal; + font-display: swap; +} + +@font-face { + font-family: 'IRANSans'; + src: url('../fonts/iranSans/woff2/IRANSansWeb(FaNum)_Medium.woff2') format('woff2'); + font-weight: 500; + font-style: normal; + font-display: swap; +} + +@font-face { + font-family: 'IRANSans'; + src: url('../fonts/iranSans/woff2/IRANSansWeb(FaNum)_Bold.woff2') format('woff2'); + font-weight: 700; + font-style: normal; + font-display: swap; +} + +@font-face { + font-family: 'IRANSans'; + src: url('../fonts/iranSans/woff2/IRANSansWeb(FaNum)_Black.woff2') format('woff2'); + font-weight: 900; + font-style: normal; + font-display: swap; +} diff --git a/src/assets/styles/main.css b/src/assets/styles/main.css new file mode 100644 index 0000000..29c59c3 --- /dev/null +++ b/src/assets/styles/main.css @@ -0,0 +1,195 @@ +@import './fonts.css'; + +:root { + /* Brand — هم‌تراز اپ کاربر (mockups / main.css) */ + --color-primary: #0a353c; + --color-primary-hover: #072a2f; + --color-primary-soft: #e8f4f1; + --color-primary-dark: #062428; + --color-primary-light: #e8f4f1; + --color-primary-rgb: 10, 53, 60; + --color-accent-navy: #1b223c; + --color-sidebar-bg: #0a353c; + --color-sidebar-active: #0e454e; + --color-sidebar-hover: #0e454e; + --color-success: #1b8a5a; + --color-success-light: #eaf8f1; + --color-success-dark: #0d7a4d; + --color-success-soft: #eaf8f1; + --color-warning: #e8a317; + --color-warning-light: #fff6e5; + --color-warning-dark: #d97706; + --color-danger: #dc3545; + --color-danger-light: #fee2e2; + --color-purple: #7c3aed; + --color-purple-light: #ede9fe; + --color-info: #3b6fa0; + --color-info-light: #eef3f7; + --color-bg: #f6f8f7; + --color-surface: #ffffff; + --color-elevated: #ffffff; + --color-border: #e5e9e8; + --color-border-light: #eef1f0; + --color-text: #121212; + --color-text-muted: #6b7280; + --color-text-secondary: #6b7280; + --admin-primary: var(--color-primary); + --admin-muted: var(--color-text-muted); + --admin-surface: var(--color-surface); + --admin-border: var(--color-border); + --admin-soft: var(--color-primary-soft); + --radius-sm: 8px; + --radius-md: 12px; + --radius-lg: 16px; + --shadow-sm: 0 1px 2px rgba(16, 24, 40, 0.04); + --shadow-card: 0 1px 3px rgba(16, 24, 40, 0.06), 0 4px 16px rgba(16, 24, 40, 0.04); + --sidebar-width: 240px; + --header-height: 72px; + --font-family: 'IRANSans', 'Tahoma', sans-serif; + --btn-primary-bg: #0a353c; + --btn-primary-hover: #072a2f; + --admin-desktop-min: 1280px; + --control-height: 40px; + --control-height-sm: 32px; + --space-1: 4px; + --space-2: 8px; + --space-3: 12px; + --space-4: 16px; + --space-5: 20px; + --space-6: 24px; + --transition-fast: 0.15s ease; + --transition-base: 0.18s ease; + --focus-ring: 0 0 0 3px rgba(10, 53, 60, 0.18); +} + +html.dark { + --color-primary: #5eb8ad; + --color-primary-hover: #7ad0c5; + --color-primary-soft: #14353a; + --color-primary-dark: #7ad0c5; + --color-primary-light: #14353a; + --color-primary-rgb: 94, 184, 173; + --color-accent-navy: #9bb0d0; + --color-sidebar-bg: #0b0f14; + --color-sidebar-active: #14353a; + --color-sidebar-hover: #121821; + --color-success: #3dd68c; + --color-success-light: #123528; + --color-success-dark: #6ee7b7; + --color-success-soft: #123528; + --color-warning: #f5c14a; + --color-warning-light: #3a2f14; + --color-warning-dark: #fcd34d; + --color-danger: #f47979; + --color-danger-light: #3f1d22; + --color-purple: #b39afa; + --color-purple-light: #2a2144; + --color-info: #7b9cff; + --color-info-light: #1b2740; + --color-bg: #0b0f14; + --color-surface: #121821; + --color-elevated: #1a2230; + --color-border: #2a3444; + --color-border-light: #1a2230; + --color-text: #eef2f8; + --color-text-muted: #9aa8bc; + --color-text-secondary: #9aa8bc; + --shadow-sm: 0 1px 2px rgba(0, 0, 0, 0.35); + --shadow-card: 0 1px 3px rgba(0, 0, 0, 0.4), 0 4px 16px rgba(0, 0, 0, 0.35); + --btn-primary-bg: #5eb8ad; + --btn-primary-hover: #7ad0c5; + --focus-ring: 0 0 0 3px rgba(94, 184, 173, 0.28); +} + +*, +*::before, +*::after { + box-sizing: border-box; +} + +html { + font-size: 16px; + -webkit-text-size-adjust: 100%; + height: 100%; +} + +body { + margin: 0; + font-family: var(--font-family); + background: var(--color-bg); + color: var(--color-text); + line-height: 1.5; + direction: rtl; + height: 100%; +} + +#app { + height: 100dvh; +} + +/* Hide scrollbars across the admin panel (scroll still works) */ +html, +body, +#app, +#app *, +.admin-modal-backdrop, +.admin-modal-backdrop * { + scrollbar-width: none; + -ms-overflow-style: none; +} + +html::-webkit-scrollbar, +body::-webkit-scrollbar, +#app::-webkit-scrollbar, +#app *::-webkit-scrollbar, +.admin-modal-backdrop::-webkit-scrollbar, +.admin-modal-backdrop *::-webkit-scrollbar { + display: none; + width: 0; + height: 0; + background: transparent; +} + +a { + color: inherit; + text-decoration: none; +} + +button { + font-family: inherit; + cursor: pointer; +} + +button:focus-visible { + outline: 2px solid var(--color-primary); + outline-offset: 2px; +} + +@media (prefers-reduced-motion: reduce) { + *, + *::before, + *::after { + animation-duration: 0.01ms !important; + animation-iteration-count: 1 !important; + transition-duration: 0.01ms !important; + scroll-behavior: auto !important; + } +} + +input, +textarea, +select { + font-family: inherit; +} + +.sr-only { + position: absolute; + width: 1px; + height: 1px; + padding: 0; + margin: -1px; + overflow: hidden; + clip: rect(0, 0, 0, 0); + white-space: nowrap; + border: 0; +} diff --git a/src/assets/styles/responsive.css b/src/assets/styles/responsive.css new file mode 100644 index 0000000..31c86f1 --- /dev/null +++ b/src/assets/styles/responsive.css @@ -0,0 +1,414 @@ +/* Admin responsive breakpoints: + xs (small mobile): below 480px + sm (mobile): 480px – 767px + md (tablet): 768px – 1023px + lg (small desktop): 1024px – 1279px + xl (desktop): 1280px – 1439px + 2xl (large desktop): 1440px+ +*/ + +:root { + --page-padding-mobile: 16px; + --page-padding-tablet: 20px; + --page-padding-desktop: 28px; + --page-padding: var(--page-padding-mobile); + --mobile-nav-height: 0px; + --drawer-width: min(300px, 88vw); + --admin-desktop-min: 1280px; +} + +@media (min-width: 768px) { + :root { + --page-padding: var(--page-padding-tablet); + } +} + +@media (min-width: 1280px) { + :root { + --page-padding: var(--page-padding-desktop); + } +} + +/* Visibility utilities — desktop layout is source of truth at >= 1280px */ +.desktop-only { + display: none !important; +} + +.compact-only { + display: block; +} + +@media (min-width: 1280px) { + .desktop-only { + display: revert !important; + } + + .desktop-only.admin-shell__sidebar, + .desktop-only.admin-sidebar { + display: flex !important; + } + + .desktop-only.orders-page, + .desktop-only.dashboard { + display: block !important; + } + + .compact-only { + display: none !important; + } +} + +/* Mobile drawer overlay */ +.admin-drawer-backdrop { + position: fixed; + inset: 0; + z-index: 900; + background: rgba(15, 23, 42, 0.45); + opacity: 0; + visibility: hidden; + transition: opacity 0.2s, visibility 0.2s; +} + +.admin-drawer-backdrop.open { + opacity: 1; + visibility: visible; +} + +.admin-drawer { + position: fixed; + top: 0; + right: 0; + z-index: 901; + width: var(--drawer-width); + height: 100dvh; + background: var(--color-sidebar-bg); + color: #fff; + transform: translateX(100%); + transition: transform 0.25s ease; + display: flex; + flex-direction: column; + overflow: hidden; +} + +.admin-drawer.open { + transform: translateX(0); +} + +/* Compact card list pattern */ +.admin-card-list { + display: flex; + flex-direction: column; + gap: 10px; +} + +.admin-card-item { + background: var(--color-surface); + border: 1px solid var(--color-border); + border-radius: var(--radius-md); + padding: 14px 16px; + text-align: right; + width: 100%; + transition: border-color 0.15s, background 0.15s; +} + +.admin-card-item:hover { + border-color: #cbd5e1; +} + +.admin-card-item.selected { + border-color: var(--color-primary); + background: var(--color-info-light); +} + +.admin-card-item__header { + display: flex; + align-items: center; + justify-content: space-between; + gap: 10px; + margin-bottom: 8px; +} + +.admin-card-item__header-actions { + display: flex; + align-items: center; + gap: 8px; + flex-shrink: 0; +} + +.admin-card-item__title { + margin: 0; + font-size: 0.875rem; + font-weight: 700; +} + +.admin-card-item__meta { + display: flex; + flex-wrap: wrap; + gap: 8px 16px; + font-size: 0.8125rem; + color: var(--color-text-muted); +} + +.admin-card-item__meta span strong { + color: var(--color-text); + font-weight: 600; +} + +.admin-card-item__actions { + display: flex; + flex-wrap: wrap; + gap: 8px; + margin-top: 12px; + padding-top: 12px; + border-top: 1px solid var(--color-border-light); +} + +/* Full-screen detail panel (mobile) */ +.admin-detail-panel { + position: fixed; + inset: 0; + z-index: 850; + background: var(--color-bg); + display: flex; + flex-direction: column; + transform: translateX(100%); + transition: transform 0.25s ease; +} + +.admin-detail-panel.open { + transform: translateX(0); +} + +.admin-detail-panel__header { + flex-shrink: 0; + display: grid; + grid-template-columns: 40px 1fr 40px; + align-items: center; + gap: 12px; + padding: 12px var(--page-padding); + background: var(--color-surface); + border-bottom: 1px solid var(--color-border); +} + +.admin-detail-panel__back { + width: 40px; + height: 40px; + border: 1px solid var(--color-border); + border-radius: var(--radius-sm); + background: var(--color-surface); + display: flex; + align-items: center; + justify-content: center; + color: var(--color-text); + flex-shrink: 0; + grid-column: 1; + transition: + background var(--transition-fast), + border-color var(--transition-fast); +} + +.admin-detail-panel__back:hover { + background: var(--color-border-light); + border-color: var(--color-border); +} + +.admin-detail-panel__title { + margin: 0; + font-size: 1rem; + font-weight: 700; + text-align: center; + grid-column: 2; +} + +.admin-detail-panel__body { + flex: 1; + overflow-y: auto; + padding: var(--page-padding); +} + +/* Compact page header */ +.compact-page-header { + display: flex; + flex-direction: column; + gap: 12px; + margin-bottom: 16px; +} + +.compact-page-header__row { + display: flex; + align-items: flex-start; + justify-content: space-between; + gap: 12px; +} + +.compact-page-header__title { + margin: 0; + font-size: 1.125rem; + font-weight: 700; +} + +.compact-page-header__actions { + display: flex; + flex-wrap: wrap; + gap: 8px; +} + +@media (min-width: 768px) { + .compact-page-header__row { + align-items: center; + } + + .compact-page-header__actions { + flex-shrink: 0; + } +} + +/* Stat grid for compact dashboard — 4 KPI cards in one row on tablet+ */ +.compact-stats-grid { + display: grid; + grid-template-columns: 1fr; + gap: 12px; + margin-bottom: 16px; +} + +@media (min-width: 480px) { + .compact-stats-grid { + grid-template-columns: repeat(2, 1fr); + } +} + +@media (min-width: 768px) { + .compact-stats-grid { + grid-template-columns: repeat(4, 1fr); + } +} + +.compact-section-grid { + display: flex; + flex-direction: column; + gap: 16px; +} + +.compact-section-card { + background: var(--color-surface); + border: 1px solid var(--color-border); + border-radius: var(--radius-lg); + padding: 16px; + box-shadow: var(--shadow-sm); +} + +.compact-section-card__title { + margin: 0 0 12px; + font-size: 0.9375rem; + font-weight: 700; +} + +/* Tablet / compact desktop: keep multi-column layouts usable in modals */ +@media (max-width: 1279px) { + .admin-shell__content { + padding: var(--page-padding); + } + + .admin-summary-grid { + grid-template-columns: repeat(2, 1fr); + } + + .admin-form-grid { + grid-template-columns: repeat(2, 1fr); + } + + .admin-info-grid { + grid-template-columns: repeat(2, 1fr); + } + + .admin-pagination { + flex-direction: column; + gap: 12px; + align-items: stretch; + } + + .admin-pagination__pages { + justify-content: center; + flex-wrap: wrap; + } + + .admin-tab { + padding: 10px 12px; + font-size: 0.8125rem; + } + + .admin-page-header .admin-action-group { + flex-wrap: wrap; + gap: 8px; + } +} + +/* Phone only: stack to single column / action sheet */ +@media (max-width: 767px) { + :root { + --header-height: 60px; + } + + .admin-page-header { + flex-direction: column; + align-items: stretch; + } + + .admin-page-header .admin-btn, + .admin-page-header .admin-action-group { + width: 100%; + } + + .admin-page-header .admin-action-group .admin-btn { + flex: 1; + min-width: fit-content; + } + + .admin-summary-grid, + .admin-form-grid, + .admin-info-grid { + grid-template-columns: 1fr; + } + + .admin-footer-actions { + flex-direction: column; + } + + .admin-footer-actions .admin-btn { + width: 100%; + } + + .admin-form__row { + grid-template-columns: 1fr; + } + + .admin-tab { + padding: 8px 10px; + font-size: 0.75rem; + } + + .admin-modal-backdrop { + padding: 0; + align-items: flex-end; + } + + .admin-modal { + max-width: 100%; + max-height: 92dvh; + border-radius: var(--radius-lg) var(--radius-lg) 0 0; + } + + .checks-page__footer { + flex-direction: column; + align-items: stretch; + } + + .checks-page__footer .admin-action-group { + flex-direction: column; + width: 100%; + } + + .checks-page__footer .admin-action-group .admin-btn { + width: 100%; + } +} diff --git a/src/components/BasicPacks/BasicIcon.vue b/src/components/BasicPacks/BasicIcon.vue new file mode 100644 index 0000000..88cf004 --- /dev/null +++ b/src/components/BasicPacks/BasicIcon.vue @@ -0,0 +1,77 @@ + + + + + diff --git a/src/components/BasicPacks/tools/icons/icons.json b/src/components/BasicPacks/tools/icons/icons.json new file mode 100644 index 0000000..40c5978 --- /dev/null +++ b/src/components/BasicPacks/tools/icons/icons.json @@ -0,0 +1,67 @@ +{ + "vuesax-linear:add": "\n\n\n\n", + "vuesax-linear:arrow-down": "\n\n\n", + "vuesax-linear:arrow-left-1": "\n\n\n", + "vuesax-linear:arrow-right-1": "\n\n\n", + "vuesax-linear:bag-2": "\n\n\n\n\n\n", + "vuesax-linear:bag-cross": "\n\n\n\n\n\n\n\n", + "vuesax-linear:box-1": "\n\n\n\n\n", + "vuesax-linear:box-remove": "\n\n\n\n\n\n\n\n", + "vuesax-linear:box-search": "\n\n\n\n\n\n\n", + "vuesax-linear:building": "\n\n\n\n\n\n\n\n", + "vuesax-linear:buildings": "\n\n\n\n\n\n\n\n\n", + "vuesax-linear:calendar": "\n\n\n\n\n\n\n\n\n\n\n\n", + "vuesax-linear:call": "\n\n\n", + "vuesax-linear:card": "\n\n\n\n\n\n", + "vuesax-linear:card-receive": "\n\n\n\n\n\n\n\n", + "vuesax-linear:category": "\n\n\n\n\n\n", + "vuesax-linear:chart-2": "\n\n\n\n\n", + "vuesax-linear:clipboard-close": "\n\n\n\n\n\n", + "vuesax-linear:clock": "\n\n\n\n\n\n", + "vuesax-linear:close-circle": "\n\n\n\n\n", + "vuesax-linear:cpu": "\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n", + "vuesax-linear:diamonds": "\n\n\n\n", + "vuesax-linear:document-text": "\n\n\n\n\n\n", + "vuesax-linear:edit-2": "\n\n\n\n\n", + "vuesax-linear:element-3": "\n\n\n\n\n\n", + "vuesax-linear:eye": "\n\n\n\n", + "vuesax-linear:eye-slash": "\n\n\n\n\n\n\n\n", + "vuesax-linear:filter": "\n\n\n\n", + "vuesax-linear:flash": "\n\n\n\n\n\n", + "vuesax-linear:headphone": "\n\n\n", + "vuesax-linear:home": "\n\n\n\n", + "vuesax-linear:info-circle": "\n\n\n\n\n", + "vuesax-linear:lamp-on": "\n\n\n\n", + "vuesax-linear:location": "\n\n\n\n", + "vuesax-linear:lock": "\n\n\n\n\n\n\n", + "vuesax-linear:logout": "\n\n\n\n\n", + "vuesax-linear:menu": "\n\n\n\n\n", + "vuesax-linear:message": "\n\n\n\n\n\n", + "vuesax-linear:mobile": "\n\n\n\n\n", + "vuesax-linear:money-4": "\n\n\n\n\n\n\n\n", + "vuesax-linear:monitor": "\n\n\n\n\n\n", + "vuesax-linear:moon": "\n\n\n", + "vuesax-linear:more": "\n\n\n\n\n", + "vuesax-linear:note-remove": "\n\n\n\n\n\n\n\n\n", + "vuesax-linear:notification": "\n\n\n\n\n", + "vuesax-linear:pen-add": "\n\n\n\n\n\n\n\n\n", + "vuesax-linear:people": "\n\n\n\n\n\n\n\n", + "vuesax-linear:personalcard": "\n\n\n\n\n\n\n\n", + "vuesax-linear:printer": "\n\n\n\n\n\n\n", + "vuesax-linear:profile-2user": "\n\n\n\n\n\n", + "vuesax-linear:profile-circle": "\n\n\n\n\n", + "vuesax-linear:receipt-search": "\n\n\n\n\n\n\n", + "vuesax-linear:search-normal": "\n\n\n\n", + "vuesax-linear:search-status": "\n\n\n\n\n\n", + "vuesax-linear:setting-2": "\n\n\n\n", + "vuesax-linear:shopping-bag": "\n\n\n\n\n", + "vuesax-linear:sms": "\n\n\n\n", + "vuesax-linear:sun-1": "\n\n\n\n", + "vuesax-linear:tick-circle": "\n\n\n\n", + "vuesax-linear:timer-1": "\n\n\n\n\n", + "vuesax-linear:trash": "\n\n\n\n\n\n\n", + "vuesax-linear:truck-time": "\n\n\n\n\n\n\n\n\n", + "vuesax-linear:verify": "\n\n\n\n", + "vuesax-linear:wallet": "\n\n\n\n\n", + "vuesax-linear:warning-2": "\n\n\n\n\n" +} diff --git a/src/components/charts/SalesAreaChart.vue b/src/components/charts/SalesAreaChart.vue new file mode 100644 index 0000000..d9ca9b3 --- /dev/null +++ b/src/components/charts/SalesAreaChart.vue @@ -0,0 +1,228 @@ + + + + + diff --git a/src/components/icons/AdminIcon.vue b/src/components/icons/AdminIcon.vue new file mode 100644 index 0000000..28e4826 --- /dev/null +++ b/src/components/icons/AdminIcon.vue @@ -0,0 +1,77 @@ + + + diff --git a/src/components/layout/AdminHeader.vue b/src/components/layout/AdminHeader.vue new file mode 100644 index 0000000..52a23e8 --- /dev/null +++ b/src/components/layout/AdminHeader.vue @@ -0,0 +1,729 @@ + + + + + diff --git a/src/components/layout/AdminMobileDrawer.vue b/src/components/layout/AdminMobileDrawer.vue new file mode 100644 index 0000000..1fdb7fb --- /dev/null +++ b/src/components/layout/AdminMobileDrawer.vue @@ -0,0 +1,154 @@ + + + + + diff --git a/src/components/layout/AdminSidebar.vue b/src/components/layout/AdminSidebar.vue new file mode 100644 index 0000000..d769d3d --- /dev/null +++ b/src/components/layout/AdminSidebar.vue @@ -0,0 +1,139 @@ + + + + + diff --git a/src/components/ui/ActiveSwitchCell.vue b/src/components/ui/ActiveSwitchCell.vue new file mode 100644 index 0000000..171cf5e --- /dev/null +++ b/src/components/ui/ActiveSwitchCell.vue @@ -0,0 +1,57 @@ + + + diff --git a/src/components/ui/AdminCurrencyInput.vue b/src/components/ui/AdminCurrencyInput.vue new file mode 100644 index 0000000..37569a3 --- /dev/null +++ b/src/components/ui/AdminCurrencyInput.vue @@ -0,0 +1,65 @@ + + + + + diff --git a/src/components/ui/AdminImagePicker.vue b/src/components/ui/AdminImagePicker.vue new file mode 100644 index 0000000..490cc29 --- /dev/null +++ b/src/components/ui/AdminImagePicker.vue @@ -0,0 +1,127 @@ + + + + + diff --git a/src/components/ui/AdminPageSkeleton.vue b/src/components/ui/AdminPageSkeleton.vue new file mode 100644 index 0000000..df037a3 --- /dev/null +++ b/src/components/ui/AdminPageSkeleton.vue @@ -0,0 +1,129 @@ + + + + + diff --git a/src/components/ui/AdminSelect.vue b/src/components/ui/AdminSelect.vue new file mode 100644 index 0000000..5a0b446 --- /dev/null +++ b/src/components/ui/AdminSelect.vue @@ -0,0 +1,357 @@ + + + + + diff --git a/src/components/ui/BaseEmptyState.vue b/src/components/ui/BaseEmptyState.vue new file mode 100644 index 0000000..2fdef95 --- /dev/null +++ b/src/components/ui/BaseEmptyState.vue @@ -0,0 +1,90 @@ + + + + + diff --git a/src/components/ui/BaseModal.vue b/src/components/ui/BaseModal.vue new file mode 100644 index 0000000..f9f03a0 --- /dev/null +++ b/src/components/ui/BaseModal.vue @@ -0,0 +1,180 @@ + + + + + diff --git a/src/components/ui/BaseSwitch.vue b/src/components/ui/BaseSwitch.vue new file mode 100644 index 0000000..a665aef --- /dev/null +++ b/src/components/ui/BaseSwitch.vue @@ -0,0 +1,164 @@ + + + + + diff --git a/src/components/ui/ConfirmDialog.vue b/src/components/ui/ConfirmDialog.vue new file mode 100644 index 0000000..57d644c --- /dev/null +++ b/src/components/ui/ConfirmDialog.vue @@ -0,0 +1,45 @@ + + + + + diff --git a/src/components/ui/StatusBadge.vue b/src/components/ui/StatusBadge.vue new file mode 100644 index 0000000..dc98966 --- /dev/null +++ b/src/components/ui/StatusBadge.vue @@ -0,0 +1,32 @@ + + + + + diff --git a/src/components/ui/ToastContainer.vue b/src/components/ui/ToastContainer.vue new file mode 100644 index 0000000..dc76283 --- /dev/null +++ b/src/components/ui/ToastContainer.vue @@ -0,0 +1,171 @@ + + + + + diff --git a/src/composables/useAsyncToggle.ts b/src/composables/useAsyncToggle.ts new file mode 100644 index 0000000..71e2c20 --- /dev/null +++ b/src/composables/useAsyncToggle.ts @@ -0,0 +1,56 @@ +import { ref } from 'vue' +import { useToast } from '@/composables/useToast' + +export function mockPersistToggle(delayMs = 480): Promise { + return new Promise((resolve) => { + window.setTimeout(resolve, delayMs) + }) +} + +export function useAsyncToggle(options: { + onPersist: (value: boolean) => Promise + successMessage?: (value: boolean) => string + errorMessage?: string + confirmOff?: () => Promise +}) { + const loadingId = ref(null) + const errorId = ref(null) + const toast = useToast() + + async function toggle(id: string, current: boolean): Promise { + if (loadingId.value) return current + + const next = !current + + if (!next && options.confirmOff) { + const confirmed = await options.confirmOff() + if (!confirmed) return current + } + + loadingId.value = id + errorId.value = null + const previous = current + + try { + await options.onPersist(next) + toast.success(options.successMessage?.(next) ?? (next ? 'وضعیت فعال شد.' : 'وضعیت غیرفعال شد.')) + return next + } catch { + errorId.value = id + toast.error(options.errorMessage ?? 'به‌روزرسانی وضعیت انجام نشد.') + return previous + } finally { + loadingId.value = null + } + } + + function isLoading(id: string) { + return loadingId.value === id + } + + function hasError(id: string) { + return errorId.value === id + } + + return { toggle, isLoading, hasError } +} diff --git a/src/composables/useBreakpoint.ts b/src/composables/useBreakpoint.ts new file mode 100644 index 0000000..0be46fa --- /dev/null +++ b/src/composables/useBreakpoint.ts @@ -0,0 +1,42 @@ +import { computed } from 'vue' +import { useWindowSize } from '@vueuse/core' + +export type BreakpointName = 'xs' | 'sm' | 'md' | 'lg' | 'xl' | '2xl' + +const BREAKPOINTS = { + xs: 0, + sm: 480, + md: 768, + lg: 1024, + xl: 1280, + '2xl': 1440, +} as const + +function getBreakpoint(width: number): BreakpointName { + if (width >= BREAKPOINTS['2xl']) return '2xl' + if (width >= BREAKPOINTS.xl) return 'xl' + if (width >= BREAKPOINTS.lg) return 'lg' + if (width >= BREAKPOINTS.md) return 'md' + if (width >= BREAKPOINTS.sm) return 'sm' + return 'xs' +} + +export function useBreakpoint() { + const { width } = useWindowSize() + const breakpoint = computed(() => getBreakpoint(width.value)) + + const isDesktop = () => breakpoint.value === 'xl' || breakpoint.value === '2xl' + const isTablet = () => breakpoint.value === 'md' || breakpoint.value === 'lg' + const isMobile = () => breakpoint.value === 'xs' || breakpoint.value === 'sm' + const isCompact = () => !isDesktop() + + return { + width, + breakpoint, + isDesktop, + isTablet, + isMobile, + isCompact, + BREAKPOINTS, + } +} diff --git a/src/composables/useConfirm.ts b/src/composables/useConfirm.ts new file mode 100644 index 0000000..a9ea294 --- /dev/null +++ b/src/composables/useConfirm.ts @@ -0,0 +1,56 @@ +import { reactive } from 'vue' + +export interface ConfirmOptions { + title: string + message: string + confirmLabel?: string + cancelLabel?: string + tone?: 'danger' | 'primary' +} + +interface ConfirmState extends ConfirmOptions { + open: boolean + loading: boolean + resolve: ((value: boolean) => void) | null +} + +const state = reactive({ + open: false, + loading: false, + title: '', + message: '', + confirmLabel: 'تأیید', + cancelLabel: 'انصراف', + tone: 'primary', + resolve: null, +}) + +export function useConfirmState() { + return state +} + +export function confirm(options: ConfirmOptions): Promise { + return new Promise((resolve) => { + Object.assign(state, { + open: true, + loading: false, + title: options.title, + message: options.message, + confirmLabel: options.confirmLabel ?? 'تأیید', + cancelLabel: options.cancelLabel ?? 'انصراف', + tone: options.tone ?? 'primary', + resolve, + }) + }) +} + +export function resolveConfirm(value: boolean) { + state.resolve?.(value) + state.open = false + state.loading = false + state.resolve = null +} + +export function setConfirmLoading(loading: boolean) { + state.loading = loading +} diff --git a/src/composables/useDashboard.ts b/src/composables/useDashboard.ts new file mode 100644 index 0000000..173611f --- /dev/null +++ b/src/composables/useDashboard.ts @@ -0,0 +1,130 @@ +import { computed, onMounted, ref } from 'vue' +import { useRouter } from 'vue-router' +import { dashboardApi, mapAdminOrder, type DashboardStats } from '@/services/api' +import { ApiError } from '@/services/http' +import { useToast } from '@/composables/useToast' +import type { CheckDeadline, Order } from '@/types' + +export const iconBg: Record = { + info: 'var(--color-info-light)', + warning: 'var(--color-warning-light)', + purple: 'var(--color-purple-light)', + success: 'var(--color-success-light)', +} + +export const iconColor: Record = { + info: 'var(--color-info)', + warning: 'var(--color-warning-dark)', + purple: 'var(--color-purple)', + success: 'var(--color-success)', +} + +const emptyStats = (): DashboardStats => ({ + newOrders: 0, + pendingReview: 0, + pendingCheck: 0, + finalApproval: 0, + todaySales: 0, + todaySalesGrowth: 0, + monthSales: 0, +}) + +export function useDashboard() { + const router = useRouter() + const toast = useToast() + + const dashboardStats = ref(emptyStats()) + const recentOrders = ref([]) + const salesChartData = ref(Array.from({ length: 28 }, () => 0)) + const chartAxisLabels = ref(['۱', '۷', '۱۴', '۲۱', '۲۸']) + const checkDeadlines = ref([]) + const loading = ref(false) + + const statCards = computed(() => [ + { + label: 'سفارش‌های جدید', + value: dashboardStats.value.newOrders, + icon: 'cart', + tone: 'info', + link: '/orders', + }, + { + label: 'در انتظار بررسی', + value: dashboardStats.value.pendingReview, + icon: 'file', + tone: 'warning', + link: '/orders?tab=pending_review', + }, + { + label: 'بررسی چک', + value: dashboardStats.value.pendingCheck, + icon: 'wallet', + tone: 'purple', + link: '/orders?tab=pending_check', + }, + { + label: 'تأیید نهایی شده', + value: dashboardStats.value.finalApproval, + icon: 'check-circle', + tone: 'success', + link: '/orders?tab=final_approval', + }, + ] as const) + + const chartPoints = computed(() => { + const w = 280 + const h = 120 + const data = salesChartData.value + if (!data.length) return '' + const max = Math.max(...data, 0.001) + const step = data.length > 1 ? w / (data.length - 1) : w + return data + .map((v, i) => { + const x = i * step + const y = h - (v / max) * (h - 10) - 5 + return `${x},${y}` + }) + .join(' ') + }) + + async function loadDashboard() { + loading.value = true + try { + const data = await dashboardApi.get() + dashboardStats.value = data.stats + recentOrders.value = (data.recentOrders ?? []).map((o) => mapAdminOrder(o) as Order) + salesChartData.value = data.salesChartData?.length + ? data.salesChartData + : Array.from({ length: 28 }, () => 0) + chartAxisLabels.value = data.chartAxisLabels?.length + ? data.chartAxisLabels + : ['۱', '۷', '۱۴', '۲۱', '۲۸'] + checkDeadlines.value = data.checkDeadlines ?? [] + } catch (err) { + toast.error(err instanceof ApiError ? err.message : 'بارگذاری داشبورد انجام نشد.') + } finally { + loading.value = false + } + } + + onMounted(() => { + void loadDashboard() + }) + + function goOrders() { + router.push('/orders') + } + + return { + checkDeadlines, + dashboardStats, + recentOrders, + chartPoints, + salesChartData, + chartAxisLabels, + statCards, + loading, + goOrders, + loadDashboard, + } +} diff --git a/src/composables/useOrdersPage.ts b/src/composables/useOrdersPage.ts new file mode 100644 index 0000000..a642443 --- /dev/null +++ b/src/composables/useOrdersPage.ts @@ -0,0 +1,301 @@ +import { computed, inject, onMounted, provide, reactive, ref, watch, type InjectionKey } from 'vue' +import { useRoute, useRouter } from 'vue-router' +import { companiesApi, customersApi, mapAdminOrder, ordersApi } from '@/services/api' +import { ApiError } from '@/services/http' +import type { Company, Customer, Order, RawOrderStatus, SettlementMethod } from '@/types' +import { rawStatusLabel } from '@/utils/orderStatus' + +import { useToast } from '@/composables/useToast' + +export function useOrdersPage() { + const route = useRoute() + const router = useRouter() + const toast = useToast() + + const companies = ref([]) + const customers = ref([]) + const orderList = ref([]) + const activeTab = ref('all') + const selectedOrderId = ref('') + const searchQuery = ref('') + const showAddModal = ref(false) + const showDetailPanel = ref(false) + const showDetailModal = ref(false) + const formError = ref('') + const saving = ref(false) + + const emptyForm = () => ({ + customerId: '', + customerName: '', + companyId: companies.value[0]?.id ?? '', + settlementMethod: 'check' as SettlementMethod, + meterage: 1000, + customerPhone: '', + }) + + const form = reactive(emptyForm()) + + const isFormValid = computed( + () => form.customerId.length > 0 && form.companyId.length > 0, + ) + + const activeCustomers = computed(() => { + const list = [...customers.value] + list.sort((a, b) => Number(b.isActive) - Number(a.isActive) || a.name.localeCompare(b.name, 'fa')) + return list + }) + + function applyCustomer(customerId: string) { + const customer = customers.value.find((c) => c.id === customerId) + form.customerId = customerId + form.customerName = customer?.name ?? '' + form.customerPhone = customer?.phone ?? '' + } + + async function loadCustomers() { + try { + customers.value = await customersApi.list() + } catch (err) { + toast.error(err instanceof ApiError ? err.message : 'بارگذاری مشتریان انجام نشد.') + } + } + + const filteredOrders = computed(() => { + let list = orderList.value + if (activeTab.value !== 'all') { + list = list.filter((o) => o.status === activeTab.value) + } + if (searchQuery.value.trim()) { + const q = searchQuery.value.trim() + list = list.filter( + (o) => o.orderNumber.includes(q) || o.customerName.includes(q), + ) + } + return list + }) + + const selectedOrder = computed(() => + orderList.value.find((o) => o.id === selectedOrderId.value) ?? null, + ) + + function findOrderByRef(ref: string): Order | undefined { + const key = ref.trim() + if (!key) return undefined + return orderList.value.find( + (o) => o.id === key || o.orderNumber.toUpperCase() === key.toUpperCase(), + ) + } + + async function applyOrderDeepLink() { + const orderRef = typeof route.query.order === 'string' ? route.query.order : '' + if (!orderRef || !orderList.value.length) return + + const order = findOrderByRef(orderRef) + if (!order) { + searchQuery.value = orderRef + return + } + + const focus = typeof route.query.focus === 'string' ? route.query.focus : '' + if (focus === 'pricing') { + await router.replace(`/orders/${order.id}/pricing`) + return + } + if (focus === 'checks') { + await router.replace(`/orders/${order.id}/checks`) + return + } + + openOrderDetail(order) + searchQuery.value = order.orderNumber + } + + async function loadData() { + try { + const [ordersData, companiesData, customersData] = await Promise.all([ + ordersApi.list(), + companiesApi.list(), + customersApi.list(), + ]) + orderList.value = ordersData.map((o) => mapAdminOrder(o) as Order) + companies.value = companiesData + customers.value = customersData + if (!form.companyId && companiesData[0]) { + form.companyId = companiesData[0].id + } + await applyOrderDeepLink() + } catch (err) { + toast.error(err instanceof ApiError ? err.message : 'بارگذاری سفارش‌ها انجام نشد.') + } + } + + onMounted(() => { + void loadData() + }) + + watch( + () => [route.query.order, route.query.focus] as const, + () => { + void applyOrderDeepLink() + }, + ) + + function selectOrder(order: Order, openDetail = false) { + selectedOrderId.value = order.id + if (openDetail) { + showDetailPanel.value = true + } + } + + function openOrderDetail(order: Order) { + selectedOrderId.value = order.id + showDetailModal.value = true + } + + function closeDetailPanel() { + showDetailPanel.value = false + } + + function closeDetailModal() { + showDetailModal.value = false + } + + function settlementLabel(method?: string | null) { + if (!method) return 'انتخاب‌نشده' + return method === 'check' ? 'چکی' : 'نقدی' + } + + const statusSaving = ref(false) + + async function changeStatus(payload: { + orderId: string + status: RawOrderStatus + note?: string + reason?: string + force?: boolean + }) { + if (statusSaving.value) return null + statusSaving.value = true + try { + const updated = await ordersApi.updateStatus(payload.orderId, { + status: payload.status, + note: payload.note, + reason: payload.reason, + force: payload.force, + }) + const mapped = mapAdminOrder(updated) as Order + const index = orderList.value.findIndex((o) => o.id === payload.orderId) + if (index >= 0) orderList.value[index] = { ...orderList.value[index]!, ...mapped } + toast.success(`وضعیت سفارش به «${rawStatusLabel(payload.status)}» تغییر کرد.`) + return mapped + } catch (err) { + toast.error(err instanceof ApiError ? err.message : 'تغییر وضعیت انجام نشد.') + return null + } finally { + statusSaving.value = false + } + } + + function goPricing(order: Order) { + router.push(`/orders/${order.id}/pricing`) + } + + function goChecks(order: Order) { + router.push(`/orders/${order.id}/checks`) + } + + function goCashReceipt(order: Order) { + router.push({ path: '/cash-payments', query: { order: order.orderNumber } }) + } + + function openAddModal() { + Object.assign(form, emptyForm()) + formError.value = '' + showAddModal.value = true + void loadCustomers() + } + + function closeAddModal() { + showAddModal.value = false + formError.value = '' + } + + async function submitAddOrder() { + if (!isFormValid.value) { + formError.value = 'انتخاب مشتری و شرکت الزامی است.' + return + } + + saving.value = true + try { + const created = await ordersApi.create({ + companyId: form.companyId, + customerId: form.customerId || undefined, + userId: form.customerId || undefined, + customerName: form.customerName.trim(), + customerPhone: form.customerPhone.trim() || undefined, + settlementMethod: form.settlementMethod, + meterage: form.meterage, + }) + const mapped = mapAdminOrder(created) as Order + orderList.value.unshift(mapped) + selectedOrderId.value = mapped.id + toast.success('سفارش جدید ثبت شد.') + closeAddModal() + } catch (err) { + toast.error(err instanceof ApiError ? err.message : 'ثبت سفارش انجام نشد.') + } finally { + saving.value = false + } + } + + return { + companies, + customers, + activeCustomers, + applyCustomer, + loadCustomers, + orderList, + activeTab, + selectedOrderId, + searchQuery, + showAddModal, + showDetailPanel, + showDetailModal, + formError, + form, + isFormValid, + filteredOrders, + selectedOrder, + selectOrder, + openOrderDetail, + closeDetailPanel, + closeDetailModal, + settlementLabel, + changeStatus, + statusSaving, + goPricing, + goChecks, + goCashReceipt, + openAddModal, + closeAddModal, + submitAddOrder, + saving, + } +} + +export type OrdersPageContext = ReturnType + +export const ORDERS_PAGE_KEY: InjectionKey = Symbol('orders-page') + +export function provideOrdersPage() { + const ctx = useOrdersPage() + provide(ORDERS_PAGE_KEY, ctx) + return ctx +} + +export function useOrdersPageContext() { + const ctx = inject(ORDERS_PAGE_KEY) + if (!ctx) throw new Error('Orders page context is missing') + return ctx +} diff --git a/src/composables/useToast.ts b/src/composables/useToast.ts new file mode 100644 index 0000000..7e888bd --- /dev/null +++ b/src/composables/useToast.ts @@ -0,0 +1,37 @@ +import { reactive, toRef } from 'vue' + +export type ToastTone = 'success' | 'error' | 'info' | 'warning' + +export interface ToastItem { + id: string + message: string + tone: ToastTone +} + +const state = reactive<{ items: ToastItem[] }>({ + items: [], +}) + +function push(message: string, tone: ToastTone) { + const id = crypto.randomUUID() + state.items.push({ id, message, tone }) + window.setTimeout(() => dismiss(id), 3200) +} + +function dismiss(id: string) { + const index = state.items.findIndex((item) => item.id === id) + if (index !== -1) { + state.items.splice(index, 1) + } +} + +export function useToast() { + return { + toasts: toRef(state, 'items'), + dismiss, + success: (message: string) => push(message, 'success'), + error: (message: string) => push(message, 'error'), + info: (message: string) => push(message, 'info'), + warning: (message: string) => push(message, 'warning'), + } +} diff --git a/src/data/mockData.ts b/src/data/mockData.ts new file mode 100644 index 0000000..7906a86 --- /dev/null +++ b/src/data/mockData.ts @@ -0,0 +1,757 @@ +import type { + AdminNotification, + AdminUser, + BankAccount, + CashPayment, + Catalog, + Check, + CheckDeadline, + Company, + Customer, + InternalMessage, + Order, + Product, + Shipment, +} from '@/types' + +export const companies: Company[] = [ + { + id: 'company-par', + name: 'شرکت پَر', + description: 'تولید و عرضه انواع پارچه', + displayOrder: 1, + isActive: true, + logoUrl: null, + }, + { + id: 'company-fam-baft', + name: 'شرکت فام بافت', + description: 'تولید و عرضه انواع پارچه', + displayOrder: 2, + isActive: true, + logoUrl: null, + }, +] + +export const bankAccounts: BankAccount[] = [ + { + id: 'ba-1', + companyId: 'company-par', + bankName: '1', + accountNumber: '1234567890', + accountHolder: 'شرکت پَر', + cardNumber: '6104 3378 0077 1234', + iban: 'IR870120000000012345678901', + isActive: true, + displayOrder: 1, + }, + { + id: 'ba-2', + companyId: 'company-par', + bankName: '2', + accountNumber: '9876543210', + accountHolder: 'شرکت پَر', + cardNumber: '6037 9912 3456 7890', + iban: 'IR620190000000098765432101', + isActive: true, + displayOrder: 2, + }, +] + +export const orders: Order[] = [ + { + id: 'ord-1', + orderNumber: 'ORD-1403-1256', + customerName: 'شرکت پَر', + companyName: 'شرکت پَر', + companyId: 'company-par', + settlementMethod: 'check', + totalAmount: 2_450_000_000, + meterage: 4250, + status: 'pending_review', + createdAt: '2024-10-25T10:30:00', + customerPhone: '۰۹۱۲۱۲۳۴۵۶۷', + customerNationalId: '۱۰۱۰۳۴۵۶۷۸۹', + customerType: 'عمده‌فروش', + items: [ + { + id: 'oi-1', + catalogCode: '377', + productName: 'پارچه آبی', + color: 'آبی', + requestedMeterage: 2000, + confirmedMeterage: 2000, + supplyPrice: null, + totalAmount: null, + }, + { + id: 'oi-2', + catalogCode: '377', + productName: 'پارچه مشکی', + color: 'مشکی', + requestedMeterage: 1500, + confirmedMeterage: 1000, + supplyPrice: null, + totalAmount: null, + }, + { + id: 'oi-3', + catalogCode: '378', + productName: 'آبی پشت سفید', + color: 'آبی پشت سفید', + requestedMeterage: 750, + confirmedMeterage: 750, + supplyPrice: null, + totalAmount: null, + }, + ], + }, + { + id: 'ord-2', + orderNumber: 'ORD-1403-1255', + customerName: 'شرکت فام بافت', + companyName: 'شرکت فام بافت', + companyId: 'company-fam-baft', + settlementMethod: 'check', + totalAmount: 1_850_000_000, + meterage: 3200, + status: 'pending_check', + createdAt: '2024-10-24T14:15:00', + }, + { + id: 'ord-3', + orderNumber: 'ORD-1403-1254', + customerName: 'پارچه‌سرای نیکو', + companyName: 'شرکت پَر', + companyId: 'company-par', + settlementMethod: 'cash', + totalAmount: 980_000_000, + meterage: 1800, + status: 'final_approval', + createdAt: '2024-10-23T09:00:00', + }, + { + id: 'ord-4', + orderNumber: 'ORD-1403-1253', + customerName: 'بافت‌آسان', + companyName: 'شرکت فام بافت', + companyId: 'company-fam-baft', + settlementMethod: 'check', + totalAmount: 3_200_000_000, + meterage: 5100, + status: 'check_correction', + createdAt: '2024-10-22T16:45:00', + }, + { + id: 'ord-5', + orderNumber: 'ORD-1403-1252', + customerName: 'شرکت پَر', + companyName: 'شرکت پَر', + companyId: 'company-par', + settlementMethod: 'cash', + totalAmount: 750_000_000, + meterage: 1200, + status: 'delivered', + createdAt: '2024-10-21T11:20:00', + }, + { + id: 'ord-6', + orderNumber: 'ORD-1403-1251', + customerName: 'پارچه‌سرای نیکو', + companyName: 'شرکت پَر', + companyId: 'company-par', + settlementMethod: 'check', + totalAmount: 1_600_000_000, + meterage: 2900, + status: 'pending_review', + createdAt: '2024-10-20T08:30:00', + }, + { + id: 'ord-7', + orderNumber: 'ORD-1403-1250', + customerName: 'بافت‌آسان', + companyName: 'شرکت فام بافت', + companyId: 'company-fam-baft', + settlementMethod: 'check', + totalAmount: 2_100_000_000, + meterage: 3800, + status: 'pending_check', + createdAt: '2024-10-19T13:00:00', + }, +] + +export const checks: Check[] = [ + { + id: 'chk-1', + orderId: 'ord-1', + row: 1, + amount: 1_000_000_000, + bankName: 'ملت', + sayadId: '12345678901234567', + dueDate: '1403/07/30', + status: 'pending_review', + }, + { + id: 'chk-2', + orderId: 'ord-1', + row: 2, + amount: 800_000_000, + bankName: 'ملی', + sayadId: '23456789012345678', + dueDate: '1403/08/05', + status: 'pending_review', + }, + { + id: 'chk-3', + orderId: 'ord-1', + row: 3, + amount: 650_000_000, + bankName: 'ملت', + sayadId: '34567890123456789', + dueDate: '1403/08/10', + status: 'pending_review', + }, +] + +export const checkDeadlines: CheckDeadline[] = [ + { id: 'cd-1', label: 'امروز', tone: 'danger', count: 7, amount: 1_250_000_000 }, + { id: 'cd-2', label: 'فردا', tone: 'warning', count: 5, amount: 820_000_000 }, + { id: 'cd-3', label: '۴ روز دیگر', tone: 'neutral', count: 3, amount: 670_000_000 }, +] + +export const dashboardStats = { + newOrders: 12, + pendingReview: 18, + pendingCheck: 9, + finalApproval: 24, + todaySales: 2_450_000_000, + todaySalesGrowth: 12, + monthSales: 15_860_000_000, +} + +export const salesChartData = [ + 0.4, 0.6, 0.5, 0.8, 0.7, 1.0, 0.9, 1.2, 1.1, 1.4, 1.3, 1.6, 1.5, 1.8, + 1.7, 2.0, 1.9, 1.7, 1.8, 2.0, 1.9, 1.6, 1.8, 2.0, 1.7, 1.9, 1.8, 2.0, +] + +export const internalMessages: InternalMessage[] = [ + { + id: 'msg-1', + senderName: 'سارا احمدی', + subject: 'هماهنگی ارسال سفارش ORD-1403-1256', + preview: 'لطفاً وضعیت باربری سفارش مشتری پارچه‌سرای نیکو را بررسی کنید.', + sentAt: '2024-10-25T09:15:00', + isRead: false, + orderId: 'ord-1', + link: '/shipping?order=ORD-1403-1256', + }, + { + id: 'msg-2', + senderName: 'رضا کریمی', + subject: 'درخواست اصلاح قیمت', + preview: 'مشتری درخواست تخفیف ۵٪ روی متراژ بالای ۳۰۰۰ متر داده است.', + sentAt: '2024-10-25T08:40:00', + isRead: false, + orderId: 'ord-1', + link: '/orders/ord-1/pricing', + }, + { + id: 'msg-3', + senderName: 'مریم حسینی', + subject: 'تأیید چک‌های سفارش ۱۲۵۴', + preview: 'دو فقره چک بررسی شد؛ یک مورد نیاز به اصلاح دارد.', + sentAt: '2024-10-24T16:20:00', + isRead: false, + orderId: 'ord-3', + link: '/orders/ord-3/checks', + }, + { + id: 'msg-4', + senderName: 'امیر نوری', + subject: 'گزارش فروش هفتگی', + preview: 'گزارش فروش واحد تهران برای هفته جاری آماده است.', + sentAt: '2024-10-24T11:00:00', + isRead: false, + link: '/reports', + }, + { + id: 'msg-5', + senderName: 'فاطمه رضایی', + subject: 'ثبت مشتری جدید', + preview: 'مشتری «نساجی آریا» با مدارک کامل ثبت شد.', + sentAt: '2024-10-23T14:30:00', + isRead: false, + link: '/customers', + }, + { + id: 'msg-6', + senderName: 'حسین مرادی', + subject: 'یادآوری جلسه', + preview: 'جلسه هماهنگی انبار فردا ساعت ۱۰ برگزار می‌شود.', + sentAt: '2024-10-22T09:00:00', + isRead: true, + }, +] + +export const adminNotifications: AdminNotification[] = [ + { + id: 'ntf-1', + title: 'سفارش جدید ثبت شد', + body: 'سفارش ORD-1403-1260 از مشتری پارچه‌سرای نیکو در انتظار بررسی است.', + sentAt: '2024-10-25T10:05:00', + isRead: false, + tone: 'info', + link: '/orders?order=ORD-1403-1260', + }, + { + id: 'ntf-2', + title: 'چک در انتظار تأیید', + body: '۳ فقره چک برای سفارش ORD-1403-1254 نیاز به بررسی دارد.', + sentAt: '2024-10-25T09:50:00', + isRead: false, + tone: 'warning', + orderId: 'ord-3', + link: '/orders/ord-3/checks', + }, + { + id: 'ntf-3', + title: 'پیش‌فاکتور ارسال شد', + body: 'پیش‌فاکتور سفارش ORD-1403-1252 برای مشتری ارسال گردید.', + sentAt: '2024-10-25T09:20:00', + isRead: false, + tone: 'success', + orderId: 'ord-5', + link: '/orders/ord-5/pricing', + }, + { + id: 'ntf-4', + title: 'سررسید چک نزدیک است', + body: '۷ فقره چک با سررسید امروز — مجموع ۱٬۲۵۰٬۰۰۰٬۰۰۰ تومان.', + sentAt: '2024-10-25T08:00:00', + isRead: false, + tone: 'danger', + link: '/checks', + }, + { + id: 'ntf-5', + title: 'درخواست اصلاح سفارش', + body: 'مشتری برای سفارش ORD-1403-1248 درخواست تغییر متراژ داده است.', + sentAt: '2024-10-24T17:30:00', + isRead: false, + tone: 'warning', + link: '/orders?order=ORD-1403-1248&focus=pricing', + }, + { + id: 'ntf-6', + title: 'حساب بانکی جدید', + body: 'حساب بانکی جدید برای شرکت فام بافت ثبت شد.', + sentAt: '2024-10-24T15:00:00', + isRead: false, + tone: 'info', + link: '/companies/company-fam-baft/accounts', + }, + { + id: 'ntf-7', + title: 'تأیید نهایی سفارش', + body: 'سفارش ORD-1403-1245 آماده ارسال است.', + sentAt: '2024-10-24T12:45:00', + isRead: false, + tone: 'success', + link: '/shipping?order=ORD-1403-1245', + }, + { + id: 'ntf-8', + title: 'پیامک ارسال نشد', + body: 'ارسال پیامک برای مشتری ۰۹۱۲۱۲۳۴۵۶۷ با خطا مواجه شد.', + sentAt: '2024-10-24T11:20:00', + isRead: false, + tone: 'danger', + link: '/settings', + }, + { + id: 'ntf-9', + title: 'سفارش رد شد', + body: 'سفارش ORD-1403-1240 توسط واحد مالی رد شد.', + sentAt: '2024-10-23T16:00:00', + isRead: false, + tone: 'warning', + link: '/orders?order=ORD-1403-1240', + }, + { + id: 'ntf-10', + title: 'گزارش ماهانه آماده است', + body: 'گزارش فروش مهر ۱۴۰۳ قابل مشاهده است.', + sentAt: '2024-10-23T10:00:00', + isRead: false, + tone: 'info', + link: '/reports', + }, + { + id: 'ntf-11', + title: 'محصول جدید به کاتالوگ اضافه شد', + body: 'کالیته ۴۰۱ با ۱۲ رنگ جدید ثبت شد.', + sentAt: '2024-10-22T14:00:00', + isRead: false, + tone: 'info', + link: '/catalogs', + }, + { + id: 'ntf-12', + title: 'یادآوری پرداخت نقدی', + body: '۲ سفارش نقدی در انتظار تأیید پرداخت هستند.', + sentAt: '2024-10-22T09:30:00', + isRead: false, + tone: 'warning', + link: '/cash-payments', + }, + { + id: 'ntf-13', + title: 'پشتیبان‌گیری موفق', + body: 'پشتیبان‌گیری شبانه سامانه با موفقیت انجام شد.', + sentAt: '2024-10-21T06:00:00', + isRead: true, + tone: 'success', + link: '/settings', + }, +] + +export const customers: Customer[] = [ + { + id: 'cust-1', + name: 'پارچه‌سرای نیکو', + phone: '۰۹۱۲۱۲۳۴۵۶۷', + nationalId: '۱۰۱۰۳۴۵۶۷۸۹', + customerType: 'wholesale', + companyName: 'شرکت پَر', + orderCount: 24, + totalMeterage: 18500, + isActive: true, + registeredAt: '2024-03-12T10:00:00', + }, + { + id: 'cust-2', + name: 'نساجی آریا', + phone: '۰۹۱۳۵۵۵۱۲۳۴', + nationalId: '۱۰۳۰۵۶۷۸۹۰۱', + customerType: 'wholesale', + companyName: 'شرکت فام بافت', + orderCount: 11, + totalMeterage: 9200, + isActive: true, + registeredAt: '2024-05-20T14:30:00', + }, + { + id: 'cust-3', + name: 'فروشگاه پارچه مهر', + phone: '۰۲۱۸۸۷۷۶۶۵۵', + nationalId: '۰۰۱۲۳۴۵۶۷۸', + customerType: 'retail', + companyName: 'شرکت پَر', + orderCount: 6, + totalMeterage: 2100, + isActive: true, + registeredAt: '2024-07-08T09:15:00', + }, + { + id: 'cust-4', + name: 'پوشاک سپهر', + phone: '۰۹۳۶۹۸۷۶۵۴۳', + nationalId: '۱۰۵۰۹۸۷۶۵۴۳', + customerType: 'wholesale', + companyName: 'شرکت پَر', + orderCount: 3, + totalMeterage: 4500, + isActive: false, + registeredAt: '2024-08-01T11:00:00', + }, +] + +export const catalogs: Catalog[] = [ + { + id: 'cat-377', + companyId: 'company-par', + companyName: 'شرکت پَر', + code: '377', + name: 'کالیته ۳۷۷', + displayOrder: 1, + productCount: 8, + isActive: true, + }, + { + id: 'cat-378', + companyId: 'company-par', + companyName: 'شرکت پَر', + code: '378', + name: 'کالیته ۳۷۸', + displayOrder: 2, + productCount: 12, + isActive: true, + }, + { + id: 'cat-379', + companyId: 'company-par', + companyName: 'شرکت پَر', + code: '379', + name: 'کالیته ۳۷۹', + displayOrder: 3, + productCount: 6, + isActive: true, + }, + { + id: 'cat-401', + companyId: 'company-fam-baft', + companyName: 'شرکت فام بافت', + code: '401', + name: 'کالیته ۴۰۱', + displayOrder: 1, + productCount: 10, + isActive: true, + }, + { + id: 'cat-402', + companyId: 'company-fam-baft', + companyName: 'شرکت فام بافت', + code: '402', + name: 'کالیته ۴۰۲', + displayOrder: 2, + productCount: 4, + isActive: false, + }, +] + +export const products: Product[] = [ + { + id: 'prod-1', + catalogId: 'cat-377', + catalogCode: '377', + companyName: 'شرکت پَر', + name: 'پارچه آبی', + color: 'آبی', + productCode: '377-BLU', + minMeterage: 100, + orderStep: 50, + price: 185000, + internalStock: 12000, + isActive: true, + }, + { + id: 'prod-2', + catalogId: 'cat-377', + catalogCode: '377', + companyName: 'شرکت پَر', + name: 'پارچه مشکی', + color: 'مشکی', + productCode: '377-BLK', + minMeterage: 100, + orderStep: 50, + price: 192000, + internalStock: 8500, + isActive: true, + }, + { + id: 'prod-3', + catalogId: 'cat-378', + catalogCode: '378', + companyName: 'شرکت پَر', + name: 'آبی پشت سفید', + color: 'آبی / سفید', + productCode: '378-BW', + minMeterage: 200, + orderStep: 100, + price: 210000, + internalStock: 6000, + isActive: true, + }, + { + id: 'prod-4', + catalogId: 'cat-378', + catalogCode: '378', + companyName: 'شرکت پَر', + name: 'مشکی پشت سفید', + color: 'مشکی / سفید', + productCode: '378-BLKW', + minMeterage: 200, + orderStep: 100, + price: 215000, + internalStock: 4200, + isActive: true, + }, + { + id: 'prod-5', + catalogId: 'cat-401', + catalogCode: '401', + companyName: 'شرکت فام بافت', + name: 'پارچه کرم', + color: 'کرم', + productCode: '401-CRM', + minMeterage: 150, + orderStep: 50, + price: null, + internalStock: 3000, + isActive: true, + }, +] + +export const cashPayments: CashPayment[] = [ + { + id: 'cp-1', + orderId: 'ord-2', + orderNumber: 'ORD-1403-1254', + customerName: 'پارچه‌سرای نیکو', + amount: 1_850_000_000, + paidAmount: 1_850_000_000, + transferDate: '2024-10-25T08:30:00', + trackingCode: '۹۸۷۶۵۴۳۲۱۰', + expiresAt: '2024-10-25T17:00:00', + status: 'pending_review', + }, + { + id: 'cp-2', + orderId: 'ord-3', + orderNumber: 'ORD-1403-1248', + customerName: 'نساجی آریا', + amount: 920_000_000, + paidAmount: 900_000_000, + transferDate: '2024-10-24T15:20:00', + trackingCode: '۱۲۳۴۵۶۷۸۹۰', + expiresAt: '2024-10-24T17:00:00', + status: 'pending_review', + }, + { + id: 'cp-3', + orderId: 'ord-4', + orderNumber: 'ORD-1403-1240', + customerName: 'فروشگاه پارچه مهر', + amount: 450_000_000, + paidAmount: 450_000_000, + transferDate: '2024-10-23T11:00:00', + trackingCode: '۵۵۵۵۱۲۳۴۵۶', + expiresAt: '2024-10-23T17:00:00', + status: 'approved', + }, + { + id: 'cp-4', + orderId: 'ord-5', + orderNumber: 'ORD-1403-1235', + customerName: 'پوشاک سپهر', + amount: 680_000_000, + paidAmount: null, + transferDate: null, + trackingCode: '—', + expiresAt: '2024-10-22T17:00:00', + status: 'expired', + }, +] + +export const shipments: Shipment[] = [ + { + id: 'shp-1', + orderId: 'ord-6', + orderNumber: 'ORD-1403-1220', + customerName: 'پارچه‌سرای نیکو', + carrier: 'باربری تهران-اصفهان', + trackingNumber: 'BR-1403-88901', + meterage: 3200, + status: 'shipped', + shippedAt: '2024-10-24T09:00:00', + deliveredAt: null, + }, + { + id: 'shp-2', + orderId: 'ord-7', + orderNumber: 'ORD-1403-1215', + customerName: 'نساجی آریا', + carrier: 'باربری سریع', + trackingNumber: 'BR-1403-88902', + meterage: 1800, + status: 'ready', + shippedAt: null, + deliveredAt: null, + }, + { + id: 'shp-3', + orderId: 'ord-8', + orderNumber: 'ORD-1403-1208', + customerName: 'فروشگاه پارچه مهر', + carrier: 'پیک داخلی', + trackingNumber: 'PK-1403-0045', + meterage: 950, + status: 'preparing', + shippedAt: null, + deliveredAt: null, + }, + { + id: 'shp-4', + orderId: 'ord-9', + orderNumber: 'ORD-1403-1199', + customerName: 'پارچه‌سرای نیکو', + carrier: 'باربری تهران-مشهد', + trackingNumber: 'BR-1403-88750', + meterage: 4100, + status: 'delivered', + shippedAt: '2024-10-18T10:00:00', + deliveredAt: '2024-10-20T16:30:00', + }, +] + +export const adminUsers: AdminUser[] = [ + { + id: 'usr-1', + fullName: 'علی محمدی', + phone: '۰۹۱۲۱۱۱۲۲۲۲', + email: 'admin@fabrictrade.ir', + role: 'admin', + isActive: true, + lastLoginAt: '2024-10-25T08:00:00', + }, + { + id: 'usr-2', + fullName: 'سارا احمدی', + phone: '۰۹۱۳۳۳۳۴۴۴۴', + email: 'sales@fabrictrade.ir', + role: 'sales', + isActive: true, + lastLoginAt: '2024-10-25T07:45:00', + }, + { + id: 'usr-3', + fullName: 'رضا کریمی', + phone: '۰۹۱۵۵۵۵۶۶۶۶', + email: 'finance@fabrictrade.ir', + role: 'finance', + isActive: true, + lastLoginAt: '2024-10-24T17:10:00', + }, + { + id: 'usr-4', + fullName: 'مریم حسینی', + phone: '۰۹۱۷۷۷۷۸۸۸۸', + email: 'warehouse@fabrictrade.ir', + role: 'warehouse', + isActive: true, + lastLoginAt: '2024-10-24T14:00:00', + }, + { + id: 'usr-5', + fullName: 'امیر نوری', + phone: '۰۹۱۹۹۹۹۰۰۰۰', + email: 'amir.n@fabrictrade.ir', + role: 'sales', + isActive: false, + lastLoginAt: '2024-09-30T11:00:00', + }, +] + +export const reportSalesByCompany = [ + { companyName: 'شرکت پَر', orderCount: 68, totalAmount: 12_450_000_000, meterage: 28500 }, + { companyName: 'شرکت فام بافت', orderCount: 35, totalAmount: 6_820_000_000, meterage: 14200 }, +] + +export const reportOrdersByStatus = [ + { status: 'در انتظار بررسی', count: 18 }, + { status: 'بررسی چک', count: 9 }, + { status: 'نیاز به اصلاح', count: 6 }, + { status: 'تأیید نهایی', count: 24 }, + { status: 'ارسال شده', count: 12 }, + { status: 'تحویل شده', count: 34 }, +] diff --git a/src/layouts/AdminShell.vue b/src/layouts/AdminShell.vue new file mode 100644 index 0000000..d23b596 --- /dev/null +++ b/src/layouts/AdminShell.vue @@ -0,0 +1,61 @@ + + + + + diff --git a/src/main.ts b/src/main.ts new file mode 100644 index 0000000..c4c80a2 --- /dev/null +++ b/src/main.ts @@ -0,0 +1,23 @@ +import { createApp } from 'vue' +import { createPinia } from 'pinia' + +import App from './App.vue' +import router from './router' +import { useAuthStore } from '@/stores/auth' +import { useThemeStore } from '@/stores/theme' + +import 'virtual:uno.css' +import '@/assets/styles/main.css' +import '@/assets/styles/admin.css' +import '@/assets/styles/responsive.css' + +const app = createApp(App) +const pinia = createPinia() + +app.use(pinia) +app.use(router) + +useThemeStore(pinia) +useAuthStore(pinia).hydrate() + +app.mount('#app') diff --git a/src/router/index.ts b/src/router/index.ts new file mode 100644 index 0000000..c10f97f --- /dev/null +++ b/src/router/index.ts @@ -0,0 +1,186 @@ +import { createRouter, createWebHistory } from 'vue-router' +import AdminShell from '@/layouts/AdminShell.vue' +import { useAuthStore } from '@/stores/auth' + +const router = createRouter({ + history: createWebHistory(import.meta.env.BASE_URL), + routes: [ + { + path: '/login', + name: 'login', + component: () => import('@/views/auth/LoginView.vue'), + meta: { public: true, title: 'ورود به پنل مدیریت' }, + }, + { + path: '/', + component: AdminShell, + meta: { requiresAuth: true }, + children: [ + { + path: '', + name: 'dashboard', + component: () => import('@/views/dashboard/DashboardView.vue'), + meta: { title: 'داشبورد مدیریتی' }, + }, + { + path: 'orders', + name: 'orders', + component: () => import('@/views/orders/OrdersView.vue'), + meta: { title: 'سفارش‌ها' }, + }, + { + path: 'orders/:id/pricing', + name: 'order-pricing', + component: () => import('@/views/orders/OrderPricingView.vue'), + meta: { title: 'قیمت‌گذاری سفارش' }, + }, + { + path: 'checks', + name: 'checks', + component: () => import('@/views/checks/ChecksListView.vue'), + meta: { title: 'چک‌ها' }, + }, + { + path: 'orders/:id/checks', + name: 'order-checks', + component: () => import('@/views/checks/CheckManagementView.vue'), + meta: { title: 'مدیریت چک‌های سفارش' }, + }, + { + /* API links often use /orders/:id — open list + detail via query */ + path: 'orders/:id', + name: 'order-detail', + redirect: (to) => ({ + name: 'orders', + query: { order: String(to.params.id) }, + }), + }, + { + path: 'companies', + name: 'companies', + component: () => import('@/views/companies/CompaniesView.vue'), + meta: { title: 'مدیریت شرکت‌ها' }, + }, + { + path: 'companies/:companyId/accounts', + name: 'bank-accounts', + component: () => import('@/views/companies/BankAccountsView.vue'), + meta: { title: 'حساب‌های بانکی' }, + }, + { + path: 'customers', + name: 'customers', + component: () => import('@/views/customers/CustomersView.vue'), + meta: { title: 'مشتریان' }, + }, + { + path: 'products', + name: 'products', + component: () => import('@/views/products/ProductsView.vue'), + meta: { title: 'محصولات' }, + }, + { + path: 'categories', + name: 'categories', + component: () => import('@/views/categories/CategoriesView.vue'), + meta: { title: 'دسته‌بندی‌ها' }, + }, + { + path: 'banners', + name: 'banners', + component: () => import('@/views/banners/BannersView.vue'), + meta: { title: 'بنرها' }, + }, + { + path: 'catalogs', + name: 'catalogs', + component: () => import('@/views/catalogs/CatalogsView.vue'), + meta: { title: 'کالیته‌ها' }, + }, + { + path: 'catalog-requests', + name: 'catalog-requests', + component: () => import('@/views/catalog-requests/CatalogRequestsView.vue'), + meta: { title: 'درخواست کالیته فیزیکی' }, + }, + { + path: 'brands', + name: 'brands', + component: () => import('@/views/brands/BrandsView.vue'), + meta: { title: 'برندها' }, + }, + { + path: 'suggestions', + name: 'suggestions', + component: () => import('@/views/suggestions/SuggestionsView.vue'), + meta: { title: 'پیشنهاد محصول' }, + }, + { + path: 'stock-alerts', + name: 'stock-alerts', + component: () => import('@/views/stock-alerts/StockAlertsView.vue'), + meta: { title: 'خبر موجودی' }, + }, + { + path: 'levels', + name: 'levels', + component: () => import('@/views/levels/LevelsView.vue'), + meta: { title: 'سطوح مشتری' }, + }, + { + path: 'cash-payments', + name: 'cash-payments', + component: () => import('@/views/cash-payments/CashPaymentsView.vue'), + meta: { title: 'پرداخت‌های نقدی' }, + }, + { + path: 'shipping', + name: 'shipping', + component: () => import('@/views/shipping/ShippingView.vue'), + meta: { title: 'ارسال و باربری' }, + }, + { + path: 'reports', + name: 'reports', + component: () => import('@/views/reports/ReportsView.vue'), + meta: { title: 'گزارش‌ها' }, + }, + { + path: 'settings', + name: 'settings', + component: () => import('@/views/settings/SettingsView.vue'), + meta: { title: 'تنظیمات' }, + }, + { + path: 'users', + name: 'users', + component: () => import('@/views/users/UsersView.vue'), + meta: { title: 'کاربران و دسترسی‌ها' }, + }, + ], + }, + ], +}) + +router.beforeEach((to) => { + const auth = useAuthStore() + auth.hydrate() + + if (to.meta.public) { + if (auth.isAuthenticated && to.name === 'login') { + return { name: 'dashboard' } + } + return true + } + + if (to.matched.some((record) => record.meta.requiresAuth) && !auth.isAuthenticated) { + return { + name: 'login', + query: { redirect: to.fullPath }, + } + } + + return true +}) + +export default router diff --git a/src/services/api.ts b/src/services/api.ts new file mode 100644 index 0000000..956ff8d --- /dev/null +++ b/src/services/api.ts @@ -0,0 +1,628 @@ +import { apiRequest } from '@/services/http' +import type { + AdminNotification, + AdminUser, + BankAccount, + CashPayment, + Catalog, + Check, + CheckDeadline, + Company, + Customer, + InternalMessage, + Order, + OrderItem, + OrderStatus, + OrderStatusHistoryItem, + Product, + RawOrderStatus, + SettlementMethod, + Shipment, + ShipmentStatus, + UserRole, +} from '@/types' + +/** Normalize admin list order status badges */ +export function mapAdminOrder< + T extends { + status: string + adminStatus?: string + allowedTransitions?: string[] + settlementMethod?: string | null + settlementType?: string | null + meterage?: number + totalMeterage?: number + }, +>( + order: T, +): T & { + status: OrderStatus + rawStatus: RawOrderStatus + allowedTransitions: RawOrderStatus[] + settlementMethod: SettlementMethod | null + meterage: number +} { + return { + ...order, + status: (order.adminStatus ?? order.status) as OrderStatus, + rawStatus: order.status as RawOrderStatus, + allowedTransitions: (order.allowedTransitions ?? []) as RawOrderStatus[], + settlementMethod: (order.settlementMethod ?? + order.settlementType ?? + null) as SettlementMethod | null, + meterage: order.meterage ?? order.totalMeterage ?? 0, + } +} + +export function slugifyCompanyName(name: string): string { + const slug = name + .trim() + .toLowerCase() + .replace(/\s+/g, '-') + .replace(/[^a-z0-9-]/g, '') + .replace(/-+/g, '-') + .replace(/^-|-$/g, '') + return slug || `c-${Date.now()}` +} + +/* ── Companies ─────────────────────────────────────────────── */ + +export type CreateCompanyPayload = { + name: string + slug: string + description?: string + logoUrl?: string | null + displayOrder?: number + isActive?: boolean +} + +export type UpdateCompanyPayload = Partial> & { + slug?: string +} + +export const companiesApi = { + list: (activeOnly?: boolean) => + apiRequest('/companies', { query: { activeOnly: activeOnly ? 'true' : undefined } }), + get: (id: string) => apiRequest(`/companies/${id}`), + create: (body: CreateCompanyPayload) => apiRequest('/companies', { body }), + update: (id: string, body: UpdateCompanyPayload) => + apiRequest(`/companies/${id}`, { method: 'PATCH', body }), + setActive: (id: string, isActive: boolean) => + apiRequest(`/companies/${id}/active`, { method: 'PATCH', body: { isActive } }), +} + +/* ── Bank accounts ─────────────────────────────────────────── */ + +export type CreateBankAccountPayload = { + bankName: string + accountHolder: string + accountNumber: string + cardNumber: string + iban: string + displayOrder?: number + isActive?: boolean + notes?: string +} + +export type UpdateBankAccountPayload = Partial + +export const bankAccountsApi = { + listByCompany: (companyId: string) => + apiRequest(`/companies/${companyId}/bank-accounts`), + create: (companyId: string, body: CreateBankAccountPayload) => + apiRequest(`/companies/${companyId}/bank-accounts`, { body }), + update: (id: string, body: UpdateBankAccountPayload) => + apiRequest(`/bank-accounts/${id}`, { method: 'PATCH', body }), + setActive: (id: string, isActive: boolean) => + apiRequest(`/bank-accounts/${id}/active`, { method: 'PATCH', body: { isActive } }), +} + +/* ── Catalogs ──────────────────────────────────────────────── */ + +export type CreateCatalogPayload = { + companyId: string + name: string + code: string + description?: string + displayOrder?: number + isActive?: boolean +} + +export type UpdateCatalogPayload = Partial> + +export const catalogsApi = { + list: (params?: { companyId?: string; activeOnly?: boolean }) => + apiRequest('/catalogs', { + query: { + companyId: params?.companyId, + activeOnly: params?.activeOnly ? 'true' : undefined, + }, + }), + create: (body: CreateCatalogPayload) => apiRequest('/catalogs', { body }), + update: (id: string, body: UpdateCatalogPayload) => + apiRequest(`/catalogs/${id}`, { method: 'PATCH', body }), + setActive: (id: string, isActive: boolean) => + apiRequest(`/catalogs/${id}/active`, { method: 'PATCH', body: { isActive } }), +} + +/* ── Products ──────────────────────────────────────────────── */ + +export type CreateProductPayload = { + companyId: string + catalogId: string + name: string + code?: string + productCode?: string + color: string + minMeterage?: number + orderStep?: number + orderMultiplier?: number + price?: number | null + basePrice?: number | null + internalStock?: number | null + stock?: number | null + isActive?: boolean + description?: string + usageCategory?: string + season?: string + composition?: string | null + weaveType?: string | null + subtitle?: string | null + rollMeters?: number + widthCm?: number | null + weightGrams?: number | null + isNew?: boolean + colorsJson?: string[] + imageUrlsJson?: string[] + tagsJson?: string[] +} + +export type UpdateProductPayload = Partial> + +export const productsApi = { + list: (params?: { catalogId?: string; companyId?: string; activeOnly?: boolean }) => + apiRequest('/products', { + query: { + catalogId: params?.catalogId, + companyId: params?.companyId, + activeOnly: params?.activeOnly ? 'true' : undefined, + }, + }), + create: (body: CreateProductPayload) => apiRequest('/products', { body }), + update: (id: string, body: UpdateProductPayload) => + apiRequest(`/products/${id}`, { method: 'PATCH', body }), + setActive: (id: string, isActive: boolean) => + apiRequest(`/products/${id}/active`, { method: 'PATCH', body: { isActive } }), +} + +/* ── Customers ─────────────────────────────────────────────── */ + +export type CreateCustomerPayload = { + name?: string + firstName?: string + lastName?: string + phone: string + nationalId?: string + customerType?: Customer['customerType'] + companyId?: string | null + isActive?: boolean + levelDefId?: string | null + assignedAgentId?: string | null + appRole?: 'customer' | 'agent' + agentCode?: string | null + brandIds?: string[] +} + +export type UpdateCustomerPayload = Partial + +export const customersApi = { + list: (q?: string, appRole?: 'customer' | 'agent') => + apiRequest('/admin/customers', { query: { q, appRole } }), + create: (body: CreateCustomerPayload) => apiRequest('/admin/customers', { body }), + update: (id: string, body: UpdateCustomerPayload) => + apiRequest(`/admin/customers/${id}`, { method: 'PATCH', body }), + setActive: (id: string, isActive: boolean) => + apiRequest(`/admin/customers/${id}/active`, { method: 'PATCH', body: { isActive } }), +} + +/* ── Orders ────────────────────────────────────────────────── */ + +export type AdminCreateOrderPayload = { + companyId: string + customerId?: string + customerName?: string + customerPhone?: string + userId?: string + settlementMethod?: SettlementMethod + settlementType?: SettlementMethod + meterage?: number + notes?: string +} + +export type OrderItemPricingPayload = { + id: string + confirmedMeterage?: number + unitPrice?: number + supplyPrice?: number +} + +export type UpdateOrderPricingPayload = { + items: OrderItemPricingPayload[] + shippingCost?: number + note?: string +} + +export type ApiOrder = Order & { + adminStatus?: string + settlementType?: SettlementMethod | null + totalMeterage?: number + shippingCost?: number | null + finalAmount?: number | null + checkRassDays?: number | null + checkRassDate?: string + items?: OrderItem[] + checks?: Check[] + statusHistory?: OrderStatusHistoryItem[] + /** وضعیت‌های مجاز بعدی از دید ماشین وضعیت سرور */ + allowedTransitions?: string[] + cashReceipt?: { id: string } | null +} + +export type UpdateOrderStatusPayload = { + status: string + note?: string + reason?: string + /** گذر خارج از ماشین وضعیت؛ سرور reason را اجباری می‌کند */ + force?: boolean +} + +export const ordersApi = { + list: (params?: { status?: string; q?: string }) => + apiRequest('/admin/orders', { query: { status: params?.status, q: params?.q } }), + get: (id: string) => apiRequest(`/admin/orders/${id}`), + create: (body: AdminCreateOrderPayload) => apiRequest('/admin/orders', { body }), + updatePricing: (id: string, body: UpdateOrderPricingPayload) => + apiRequest(`/admin/orders/${id}/pricing`, { method: 'PATCH', body }), + updateStatus: (id: string, body: UpdateOrderStatusPayload) => + apiRequest(`/admin/orders/${id}/status`, { method: 'PATCH', body }), +} + +/* ── Checks ────────────────────────────────────────────────── */ + +export const checksApi = { + list: (status?: Check['status']) => + apiRequest('/admin/checks', { query: { status } }), + listByOrder: (orderId: string) => + apiRequest(`/admin/orders/${orderId}/checks`), + updateStatus: (id: string, body: { status: Check['status']; note?: string }) => + apiRequest(`/admin/checks/${id}/status`, { method: 'PATCH', body }), +} + +/* ── Cash payments ─────────────────────────────────────────── */ + +export const cashPaymentsApi = { + list: (status?: CashPayment['status']) => + apiRequest('/admin/cash-payments', { query: { status } }), + updateStatus: (id: string, body: { status: CashPayment['status']; note?: string }) => + apiRequest(`/admin/cash-payments/${id}/status`, { method: 'PATCH', body }), +} + +/* ── Shipments ─────────────────────────────────────────────── */ + +export type CreateShipmentPayload = { + orderId: string + carrier: string + trackingNumber?: string + meterage?: number + status?: ShipmentStatus +} + +export const shipmentsApi = { + list: (status?: ShipmentStatus) => + apiRequest('/admin/shipments', { query: { status } }), + create: (body: CreateShipmentPayload) => apiRequest('/admin/shipments', { body }), + update: (id: string, body: Partial) => + apiRequest(`/admin/shipments/${id}`, { method: 'PATCH', body }), + advanceStatus: (id: string, body?: { status?: ShipmentStatus; trackingNumber?: string }) => + apiRequest(`/admin/shipments/${id}/status`, { method: 'PATCH', body: body ?? {} }), +} + +/* ── Admin users ───────────────────────────────────────────── */ + +export type CreateAdminUserPayload = { + fullName: string + phone: string + email?: string + password?: string + role?: UserRole + isActive?: boolean +} + +export type UpdateAdminUserPayload = Partial + +export const adminUsersApi = { + list: () => apiRequest('/admin/users'), + create: (body: CreateAdminUserPayload) => apiRequest('/admin/users', { body }), + update: (id: string, body: UpdateAdminUserPayload) => + apiRequest(`/admin/users/${id}`, { method: 'PATCH', body }), + setActive: (id: string, isActive: boolean) => + apiRequest(`/admin/users/${id}/active`, { method: 'PATCH', body: { isActive } }), +} + +/* ── Dashboard & reports ───────────────────────────────────── */ + +export type DashboardStats = { + newOrders: number + pendingReview: number + pendingCheck: number + finalApproval: number + todaySales: number + todaySalesGrowth: number + monthSales: number +} + +export type DashboardResponse = { + stats: DashboardStats + recentOrders: ApiOrder[] + salesChartData: number[] + chartAxisLabels: string[] + checkDeadlines: CheckDeadline[] + notifications?: AdminNotification[] + messages?: InternalMessage[] +} + +export type ReportsResponse = { + reportSalesByCompany: { + companyName: string + orderCount: number + totalAmount: number + meterage: number + }[] + reportOrdersByStatus: { status: string; count: number }[] + reportSalesByMonth?: { + month: string + orderCount: number + totalAmount: number + meterage: number + }[] + reportSalesByProduct?: { + productId: string + productName: string + productCode: string + orderCount: number + meterage: number + totalAmount: number + }[] + reportSalesByCustomer?: { + customerName: string + orderCount: number + totalAmount: number + meterage: number + }[] + reportCustomers?: { + active: number + inactive: number + newLast30Days: number + noPurchase: number + noPurchase90Days: number + withAgent: number + } +} + +export const dashboardApi = { + get: () => apiRequest('/admin/dashboard'), + reports: () => apiRequest('/admin/reports'), +} + +/* ── System settings ──────────────────────────────────────── */ + +export type SystemSettings = { + id: string + maxMeteragePerInvoice: number + cashInvoiceValidityHours: number + defaultSettlementCheck: boolean + defaultSettlementCash: boolean + minOrderRollsPerProduct?: number + showCatalogPublicPrice?: boolean + allowAgentPricing?: boolean + agentMinUnitPrice?: number | null + smsOrderRegistered: boolean + smsPricingReady: boolean + smsPaymentReminder: boolean + smsCheckReview: boolean + smsShippingUpdate: boolean + supportPhone: string | null + supportEmail: string | null + categoryImagesJson?: Record + updatedAt: string +} + +export type UpdateSettingsPayload = Partial> + +export const settingsApi = { + get: () => apiRequest('/admin/settings'), + update: (body: UpdateSettingsPayload) => + apiRequest('/admin/settings', { method: 'PATCH', body }), +} + +/* ── Admin notifications ──────────────────────────────────── */ + +export const notificationsApi = { + markRead: (id: string) => + apiRequest<{ ok: boolean }>(`/admin/notifications/${id}/read`, { method: 'PATCH' }), + markAllRead: () => + apiRequest<{ ok: boolean }>('/admin/notifications/read-all', { method: 'PATCH' }), + broadcast: (body: { title: string; body: string; customerIds?: string[]; tone?: string }) => + apiRequest<{ sent: number }>('/admin/notifications/broadcast', { method: 'POST', body }), +} + +/* ── Catalog requests (physical) ──────────────────────────── */ + +export type CatalogRequestRow = { + id: string + customerId: string + customerName: string + customerPhone: string + status: string + note?: string + createdAt: string + items: { + id: string + productId: string + productName: string + productCode: string + quantity: number + holderType: string + holderCustomerId?: string | null + movements?: { + id: string + fromHolder: string + toHolder: string + note?: string + movedAt: string + }[] + }[] +} + +export const catalogRequestsApi = { + list: (status?: string) => + apiRequest('/admin/catalog-requests', { + query: { status }, + }), + updateStatus: (id: string, status: string) => + apiRequest(`/admin/catalog-requests/${id}/status`, { + method: 'PATCH', + body: { status }, + }), + updateHolder: ( + itemId: string, + body: { holderType: string; holderCustomerId?: string | null; note?: string }, + ) => + apiRequest(`/admin/catalog-request-items/${itemId}/holder`, { + method: 'PATCH', + body, + }), +} + +/* ── Brands ───────────────────────────────────────────────── */ + +export type Brand = { + id: string + name: string + slug?: string + description?: string + isActive: boolean + displayOrder: number + customersCount?: number +} + +export type AppBanner = { + id: string + slot: string + title: string + subtitle: string + ctaLabel: string + ctaLink: string + imageUrl: string + displayOrder: number + isActive: boolean +} + +export type BannerPayload = { + slot: string + title: string + subtitle?: string | null + ctaLabel?: string | null + ctaLink?: string | null + imageUrl?: string | null + displayOrder?: number + isActive?: boolean +} + +export const bannersApi = { + list: (slot?: string) => + apiRequest('/admin/banners', { query: { slot } }), + create: (body: BannerPayload) => + apiRequest('/admin/banners', { body }), + update: (id: string, body: Partial) => + apiRequest(`/admin/banners/${id}`, { method: 'PATCH', body }), + remove: (id: string) => + apiRequest<{ ok: boolean }>(`/admin/banners/${id}`, { method: 'DELETE' }), +} + +export const brandsApi = { + list: () => apiRequest('/admin/brands'), + create: (body: Partial & { name: string }) => + apiRequest('/admin/brands', { body }), + update: (id: string, body: Partial) => + apiRequest(`/admin/brands/${id}`, { method: 'PATCH', body }), +} + +/* ── Levels ───────────────────────────────────────────────── */ + +export type CustomerLevel = { + id: string + code: string + label: string + sortOrder: number + isActive: boolean + customersCount: number + benefits: { id?: string; title: string; description?: string }[] +} + +export const levelsApi = { + list: () => apiRequest('/admin/levels'), + create: (body: { + code: string + label: string + sortOrder?: number + benefits?: { title: string; description?: string }[] + }) => apiRequest('/admin/levels', { body }), + update: (id: string, body: Partial & { benefits?: { title: string; description?: string }[] }) => + apiRequest(`/admin/levels/${id}`, { method: 'PATCH', body }), +} + +/* ── Suggestions ──────────────────────────────────────────── */ + +export type ProductSuggestion = { + id: string + customerId: string + customerName: string + productId: string + productName: string + productCode: string + note?: string + isActive: boolean + createdAt: string +} + +export const suggestionsApi = { + list: (customerId?: string) => + apiRequest('/admin/suggestions', { query: { customerId } }), + create: (body: { customerId: string; productId: string; note?: string }) => + apiRequest('/admin/suggestions', { body }), + setActive: (id: string, isActive: boolean) => + apiRequest(`/admin/suggestions/${id}/active`, { + method: 'PATCH', + body: { isActive }, + }), +} + +/* ── Stock alerts ─────────────────────────────────────────── */ + +export type StockAlert = { + id: string + customerName: string + customerPhone: string + productName: string + productCode: string + stock: number | null + active: boolean + createdAt: string +} + +export const stockAlertsApi = { + list: () => apiRequest('/admin/stock-alerts'), + notify: (id: string) => + apiRequest(`/admin/stock-alerts/${id}/notify`, { method: 'PATCH' }), +} diff --git a/src/services/authService.ts b/src/services/authService.ts new file mode 100644 index 0000000..f3bd1ca --- /dev/null +++ b/src/services/authService.ts @@ -0,0 +1,135 @@ +import type { AdminLoginPayload, AdminLoginResult, AdminSession } from '@/types/auth' +import { ApiError, apiRequest, getAccessToken, setAccessToken } from '@/services/http' + +const STORAGE_KEY = 'fabric-admin-session' +const TOKEN_KEY = 'fabric-admin-token' + +const USE_MOCK_AUTH = import.meta.env.VITE_USE_MOCK_AUTH === 'true' + +/** حساب موک توسعه — فقط وقتی VITE_USE_MOCK_AUTH=true */ +export const MOCK_ADMIN = { + phone: '09128081392', + password: '123456', + session: { + id: 'mock-admin-1', + fullName: 'مدیر سیستم (موک)', + phone: '09128081392', + email: 'admin@parche.ir', + role: 'admin' as const, + } satisfies AdminSession, +} + +function readSession(): AdminSession | null { + try { + const raw = localStorage.getItem(STORAGE_KEY) ?? sessionStorage.getItem(STORAGE_KEY) + if (!raw) return null + return JSON.parse(raw) as AdminSession + } catch { + return null + } +} + +function writeSession(session: AdminSession, remember: boolean) { + const payload = JSON.stringify(session) + localStorage.removeItem(STORAGE_KEY) + sessionStorage.removeItem(STORAGE_KEY) + if (remember) { + localStorage.setItem(STORAGE_KEY, payload) + } else { + sessionStorage.setItem(STORAGE_KEY, payload) + } +} + +function clearSession() { + localStorage.removeItem(STORAGE_KEY) + sessionStorage.removeItem(STORAGE_KEY) +} + +function isRememberedToken(): boolean { + return !!localStorage.getItem(TOKEN_KEY) +} + +function toSession(user: AdminSession): AdminSession { + return { + id: user.id, + fullName: user.fullName, + phone: user.phone, + email: user.email, + role: user.role, + } +} + +export function getStoredSession(): AdminSession | null { + return readSession() +} + +export function isMockAuthEnabled() { + return USE_MOCK_AUTH +} + +export async function loginAdmin(payload: AdminLoginPayload): Promise { + const phone = payload.phone.trim() + const password = payload.password + + if (!phone || !password) { + return { success: false, message: 'شماره موبایل و رمز عبور الزامی است.' } + } + + if (USE_MOCK_AUTH) { + if (phone === MOCK_ADMIN.phone && password === MOCK_ADMIN.password) { + setAccessToken('mock-admin-token', payload.remember) + writeSession(MOCK_ADMIN.session, payload.remember) + return { success: true } + } + return { + success: false, + message: `حالت موک: ${MOCK_ADMIN.phone} / ${MOCK_ADMIN.password}`, + } + } + + try { + const data = await apiRequest<{ accessToken: string; user: AdminSession }>( + '/admin/auth/login', + { + method: 'POST', + body: { phone, password }, + auth: false, + }, + ) + + setAccessToken(data.accessToken, payload.remember) + writeSession(toSession(data.user), payload.remember) + return { success: true } + } catch (err) { + if (err instanceof ApiError) { + return { success: false, message: err.message } + } + return { success: false, message: 'ورود انجام نشد.' } + } +} + +/** Refresh session from GET /auth/me when a token exists. */ +export async function refreshAdminSession(): Promise { + const token = getAccessToken() + if (!token) return readSession() + + if (USE_MOCK_AUTH || token === 'mock-admin-token') { + const session = readSession() ?? MOCK_ADMIN.session + writeSession(session, isRememberedToken()) + return session + } + + try { + const user = await apiRequest('/auth/me') + const session = toSession(user) + writeSession(session, isRememberedToken()) + return session + } catch { + return readSession() + } +} + +export function logoutAdmin() { + setAccessToken(null) + clearSession() +} diff --git a/src/services/http.ts b/src/services/http.ts new file mode 100644 index 0000000..d64ceaf --- /dev/null +++ b/src/services/http.ts @@ -0,0 +1,118 @@ +const TOKEN_KEY = 'fabric-admin-token' + +export function getApiBaseUrl(): string { + return (import.meta.env.VITE_API_BASE_URL as string | undefined)?.replace(/\/$/, '') + || 'https://parche.montest.ir/server/api' +} + +export function getAccessToken(): string | null { + return localStorage.getItem(TOKEN_KEY) ?? sessionStorage.getItem(TOKEN_KEY) +} + +export function setAccessToken(token: string | null, remember = true): void { + localStorage.removeItem(TOKEN_KEY) + sessionStorage.removeItem(TOKEN_KEY) + if (!token) return + if (remember) localStorage.setItem(TOKEN_KEY, token) + else sessionStorage.setItem(TOKEN_KEY, token) +} + +export class ApiError extends Error { + status: number + constructor(status: number, message: string) { + super(message) + this.status = status + } +} + +type RequestOptions = { + method?: string + body?: unknown + auth?: boolean + query?: Record +} + +function buildUrl(path: string, query?: RequestOptions['query']): string { + const base = getApiBaseUrl() + const joined = path.startsWith('http') + ? path + : `${base.replace(/\/$/, '')}/${path.replace(/^\//, '')}` + + const url = joined.startsWith('http') + ? new URL(joined) + : new URL(joined, typeof window !== 'undefined' ? window.location.origin : 'http://127.0.0.1') + + if (query) { + for (const [key, value] of Object.entries(query)) { + if (value === undefined || value === null || value === '') continue + url.searchParams.set(key, String(value)) + } + } + return url.toString() +} + +function errorMessageFromBody(data: unknown, status: number): string { + if (typeof data === 'object' && data && 'message' in data) { + const message = (data as { message: unknown }).message + if (Array.isArray(message)) return message.join('، ') + return String(message) + } + if (typeof data === 'string') { + if (/upstream error/i.test(data)) { + return 'سرور API در دسترس نیست. کمی بعد دوباره تلاش کنید.' + } + if (data.trim() && !data.trimStart().startsWith('<')) { + return data.trim().slice(0, 200) + } + } + return `خطای سرور (${status})` +} + +export async function apiRequest(path: string, options: RequestOptions = {}): Promise { + const headers: Record = { + Accept: 'application/json', + } + if (options.body !== undefined) { + headers['Content-Type'] = 'application/json' + } + if (options.auth !== false) { + const token = getAccessToken() + if (token) headers.Authorization = `Bearer ${token}` + } + + let res: Response + try { + res = await fetch(buildUrl(path, options.query), { + method: options.method ?? (options.body !== undefined ? 'POST' : 'GET'), + headers, + body: options.body !== undefined ? JSON.stringify(options.body) : undefined, + signal: AbortSignal.timeout(20_000), + }) + } catch (err) { + const timedOut = + (err instanceof DOMException && err.name === 'TimeoutError') || + (err instanceof Error && err.name === 'TimeoutError') + throw new ApiError( + 0, + timedOut + ? 'پاسخ سرور طول کشید. دوباره تلاش کنید.' + : 'اتصال به سرور برقرار نشد. اینترنت یا آدرس API را بررسی کنید.', + ) + } + + const text = await res.text() + let data: unknown = null + if (text) { + try { + data = JSON.parse(text) + } catch { + data = text + } + } + + if (!res.ok) { + throw new ApiError(res.status, errorMessageFromBody(data, res.status)) + } + + return data as T +} diff --git a/src/stores/auth.ts b/src/stores/auth.ts new file mode 100644 index 0000000..ee3ab0d --- /dev/null +++ b/src/stores/auth.ts @@ -0,0 +1,73 @@ +import { defineStore } from 'pinia' +import { computed, ref } from 'vue' +import type { AdminSession } from '@/types/auth' +import { + getStoredSession, + loginAdmin, + logoutAdmin, + refreshAdminSession, +} from '@/services/authService' + +export const useAuthStore = defineStore('auth', () => { + const session = ref(getStoredSession()) + const loading = ref(false) + const error = ref(null) + + const isAuthenticated = computed(() => !!session.value) + const fullName = computed(() => session.value?.fullName ?? '') + const roleLabel = computed(() => { + const map = { + admin: 'مدیر سیستم', + sales: 'واحد فروش', + finance: 'واحد مالی', + warehouse: 'انبار', + } as const + return session.value ? map[session.value.role] : '' + }) + + function clearError() { + error.value = null + } + + function hydrate() { + session.value = getStoredSession() + void refreshAdminSession().then((refreshed) => { + if (refreshed) session.value = refreshed + }) + } + + async function login(phone: string, password: string, remember: boolean) { + loading.value = true + error.value = null + + const result = await loginAdmin({ phone, password, remember }) + loading.value = false + + if (result.success) { + session.value = getStoredSession() + return true + } + + error.value = result.message ?? 'ورود انجام نشد.' + return false + } + + function logout() { + logoutAdmin() + session.value = null + error.value = null + } + + return { + session, + loading, + error, + isAuthenticated, + fullName, + roleLabel, + clearError, + hydrate, + login, + logout, + } +}) diff --git a/src/stores/theme.ts b/src/stores/theme.ts new file mode 100644 index 0000000..920d00c --- /dev/null +++ b/src/stores/theme.ts @@ -0,0 +1,34 @@ +import { defineStore } from 'pinia' +import { computed, watchEffect } from 'vue' +import { usePreferredDark, useStorage } from '@vueuse/core' + +export type ThemePreference = 'light' | 'dark' | 'system' + +export const useThemeStore = defineStore('theme', () => { + const preference = useStorage('ft_admin_theme', 'system') + const prefersDark = usePreferredDark() + + const resolved = computed<'light' | 'dark'>(() => { + if (preference.value === 'system') return prefersDark.value ? 'dark' : 'light' + return preference.value + }) + + const isDark = computed(() => resolved.value === 'dark') + + watchEffect(() => { + const root = document.documentElement + root.classList.toggle('dark', isDark.value) + root.style.colorScheme = resolved.value + }) + + function setPreference(value: ThemePreference) { + preference.value = value + } + + return { + preference, + resolved, + isDark, + setPreference, + } +}) diff --git a/src/types/auth.ts b/src/types/auth.ts new file mode 100644 index 0000000..b9593b6 --- /dev/null +++ b/src/types/auth.ts @@ -0,0 +1,18 @@ +export interface AdminSession { + id: string + fullName: string + phone: string + email: string + role: 'admin' | 'sales' | 'finance' | 'warehouse' +} + +export interface AdminLoginPayload { + phone: string + password: string + remember: boolean +} + +export interface AdminLoginResult { + success: boolean + message?: string +} diff --git a/src/types/index.ts b/src/types/index.ts new file mode 100644 index 0000000..5c9457d --- /dev/null +++ b/src/types/index.ts @@ -0,0 +1,276 @@ +/** سطل‌های نمایشی پنل ادمین که سرور از وضعیت واقعی سفارش می‌سازد */ +export type OrderStatus = + | 'pending_review' + | 'awaiting_customer' + | 'pending_check' + | 'pending_payment' + | 'needs_correction' + | 'check_correction' + | 'final_approval' + | 'shipped' + | 'delivered' + | 'cancelled' + | 'rejected' + | 'expired' + +/** وضعیت واقعی سفارش در ماشین وضعیت سرور */ +export type RawOrderStatus = + | 'cart' + | 'submitted' + | 'awaiting_review' + | 'pricing' + | 'awaiting_settlement' + | 'awaiting_settlement_fix' + | 'cash_in_progress' + | 'cash_invoice_issued' + | 'awaiting_cash_payment' + | 'cash_payment_submitted' + | 'awaiting_cash_confirmation' + | 'cash_confirmed' + | 'check_in_progress' + | 'awaiting_check_review' + | 'check_needs_fix' + | 'check_rejected' + | 'checks_approved' + | 'final_approved' + | 'preparing' + | 'ready_to_ship' + | 'shipped' + | 'delivered' + | 'needs_correction' + | 'cancelled' + | 'rejected' + | 'expired' + +export type SettlementMethod = 'check' | 'cash' + +export type CheckStatus = 'pending_review' | 'approved' | 'rejected' + +export interface Company { + id: string + name: string + description: string + displayOrder: number + isActive: boolean + logoUrl: string | null +} + +export interface BankAccount { + id: string + companyId: string + bankName: string + accountNumber: string + accountHolder: string + cardNumber: string + iban: string + isActive: boolean + displayOrder: number +} + +export interface OrderItem { + id: string + catalogCode: string + productName: string + color: string + requestedMeterage: number + confirmedMeterage: number | null + supplyPrice: number | null + totalAmount: number | null + companyId?: string + companyName?: string +} + +export interface Order { + id: string + orderNumber: string + customerName: string + companyName: string + companyId: string + settlementMethod: SettlementMethod | null + totalAmount: number | null + meterage: number + status: OrderStatus + rawStatus?: RawOrderStatus + allowedTransitions?: RawOrderStatus[] + createdAt: string + customerPhone?: string + customerNationalId?: string + customerType?: string + items?: OrderItem[] +} + +export interface Check { + id: string + orderId: string + row: number + amount: number + bankName: string + sayadId: string + dueDate: string + status: CheckStatus + checkNumber?: string + ownerNationalId?: string + ownerFirstName?: string + ownerLastName?: string + branchName?: string + frontImage?: string + backImage?: string + notes?: string + mode?: string + createdAt?: string + updatedAt?: string + /** فقط در لیست سراسری چک‌ها */ + orderNumber?: string + customerName?: string + orderStatus?: string + settlementType?: SettlementMethod | null +} + +export interface OrderStatusHistoryItem { + id: string + fromStatus?: string | null + toStatus: string + changedBy: string + note?: string + reason?: string + changedAt: string +} + +export interface CheckDeadline { + id: string + label: string + tone: 'danger' | 'warning' | 'neutral' + count: number + amount: number +} + +export interface NavItem { + name: string + label: string + path: string + icon: string +} + +export interface InternalMessage { + id: string + senderName: string + subject: string + preview: string + sentAt: string + isRead: boolean + link?: string + orderId?: string +} + +export interface AdminNotification { + id: string + title: string + body: string + sentAt: string + isRead: boolean + tone?: 'info' | 'warning' | 'success' | 'danger' + link?: string + orderId?: string +} + +export type CustomerType = 'wholesale' | 'retail' + +export interface Customer { + id: string + name: string + phone: string + nationalId: string + customerType: CustomerType + companyName: string + companyId?: string | null + orderCount: number + totalMeterage: number + isActive: boolean + registeredAt: string + appRole?: 'customer' | 'agent' + agentCode?: string + levelDefId?: string | null + levelCode?: string + levelLabel?: string + assignedAgentId?: string | null + assignedAgentName?: string + brandIds?: string[] + brands?: { id: string; name: string }[] +} + +export interface Catalog { + id: string + companyId: string + companyName: string + code: string + name: string + displayOrder: number + productCount: number + isActive: boolean +} + +export interface Product { + id: string + catalogId: string + catalogCode: string + companyName: string + name: string + color: string + productCode: string + minMeterage: number + orderStep: number + price: number | null + internalStock: number + isActive: boolean + usageCategory?: string + season?: string + composition?: string + weaveType?: string + subtitle?: string + rollMeters?: number + isNew?: boolean + colors?: string[] + imageUrls?: string[] +} + +export type CashPaymentStatus = 'pending_review' | 'approved' | 'rejected' | 'expired' + +export interface CashPayment { + id: string + orderId: string + orderNumber: string + customerName: string + amount: number + paidAmount: number | null + transferDate: string | null + trackingCode: string + expiresAt: string + status: CashPaymentStatus +} + +export type ShipmentStatus = 'preparing' | 'ready' | 'shipped' | 'delivered' + +export interface Shipment { + id: string + orderId: string + orderNumber: string + customerName: string + carrier: string + trackingNumber: string + meterage: number + status: ShipmentStatus + shippedAt: string | null + deliveredAt: string | null +} + +export type UserRole = 'admin' | 'sales' | 'finance' | 'warehouse' + +export interface AdminUser { + id: string + fullName: string + phone: string + email: string + role: UserRole + isActive: boolean + lastLoginAt: string | null +} diff --git a/src/utils/adminLabels.ts b/src/utils/adminLabels.ts new file mode 100644 index 0000000..6a7e595 --- /dev/null +++ b/src/utils/adminLabels.ts @@ -0,0 +1,41 @@ +import type { CashPaymentStatus, CustomerType, ShipmentStatus, UserRole } from '@/types' + +export const CUSTOMER_TYPE_LABELS: Record = { + wholesale: 'عمده‌فروش', + retail: 'خرده‌فروش', +} + +export const USER_ROLE_LABELS: Record = { + admin: 'مدیر سیستم', + sales: 'واحد فروش', + finance: 'واحد مالی', + warehouse: 'انبار', +} + +export const CASH_PAYMENT_STATUS_LABELS: Record = { + pending_review: 'در انتظار تأیید', + approved: 'تأیید شده', + rejected: 'رد شده', + expired: 'منقضی‌شده', +} + +export const CASH_PAYMENT_STATUS_BADGE: Record = { + pending_review: 'admin-badge--warning', + approved: 'admin-badge--success', + rejected: 'admin-badge--danger', + expired: 'admin-badge--neutral', +} + +export const SHIPMENT_STATUS_LABELS: Record = { + preparing: 'در حال آماده‌سازی', + ready: 'آماده ارسال', + shipped: 'ارسال شده', + delivered: 'تحویل شده', +} + +export const SHIPMENT_STATUS_BADGE: Record = { + preparing: 'admin-badge--warning', + ready: 'admin-badge--info', + shipped: 'admin-badge--purple', + delivered: 'admin-badge--success', +} diff --git a/src/utils/catalogImage.ts b/src/utils/catalogImage.ts new file mode 100644 index 0000000..a2049e3 --- /dev/null +++ b/src/utils/catalogImage.ts @@ -0,0 +1,46 @@ +const MAX_EDGE = 960 +const JPEG_QUALITY = 0.82 + +export async function fileToCatalogImage(file: File): Promise { + if (!file.type.startsWith('image/')) { + throw new Error('فقط فایل تصویری مجاز است.') + } + if (file.size > 8 * 1024 * 1024) { + throw new Error('حجم تصویر نباید بیشتر از ۸ مگابایت باشد.') + } + + const dataUrl = await readFileAsDataUrl(file) + return resizeDataUrl(dataUrl) +} + +function readFileAsDataUrl(file: File): Promise { + return new Promise((resolve, reject) => { + const reader = new FileReader() + reader.onload = () => resolve(String(reader.result ?? '')) + reader.onerror = () => reject(new Error('خواندن تصویر ناموفق بود.')) + reader.readAsDataURL(file) + }) +} + +function resizeDataUrl(src: string): Promise { + return new Promise((resolve, reject) => { + const image = new Image() + image.onload = () => { + const scale = Math.min(1, MAX_EDGE / Math.max(image.width, image.height)) + const width = Math.max(1, Math.round(image.width * scale)) + const height = Math.max(1, Math.round(image.height * scale)) + const canvas = document.createElement('canvas') + canvas.width = width + canvas.height = height + const ctx = canvas.getContext('2d') + if (!ctx) { + reject(new Error('پردازش تصویر ناموفق بود.')) + return + } + ctx.drawImage(image, 0, 0, width, height) + resolve(canvas.toDataURL('image/jpeg', JPEG_QUALITY)) + } + image.onerror = () => reject(new Error('تصویر نامعتبر است.')) + image.src = src + }) +} diff --git a/src/utils/format.ts b/src/utils/format.ts new file mode 100644 index 0000000..52b2a3d --- /dev/null +++ b/src/utils/format.ts @@ -0,0 +1,100 @@ +const persianDigits = '۰۱۲۳۴۵۶۷۸۹' +const numberFormatter = new Intl.NumberFormat('fa-IR', { useGrouping: true }) + +export function normalizeDigits(input: string): string { + return input.replace(/[۰-۹]/g, (digit) => String(persianDigits.indexOf(digit))) +} + +export function extractNumericString(input: string): string { + return normalizeDigits(input).replace(/[^\d]/g, '') +} + +export function parseFormattedNumber(value: string): number { + const numeric = extractNumericString(value) + return numeric ? Number(numeric) : 0 +} + +export function formatNumber(value: number): string { + if (!Number.isFinite(value)) return '—' + return numberFormatter.format(value) +} + +export function formatCurrency(value: number): string { + return `${formatNumber(value)} تومان` +} + +export function formatMeterage(value: number): string { + return `${formatNumber(value)} متر` +} + +export function toPersianDigits(input: string | number): string { + return String(input).replace(/\d/g, (d) => persianDigits[Number(d)]!) +} + +const persianDateFormatter = new Intl.DateTimeFormat('fa-IR-u-ca-persian', { + year: 'numeric', + month: '2-digit', + day: '2-digit', +}) + +const persianDateTimeFormatter = new Intl.DateTimeFormat('fa-IR-u-ca-persian', { + year: 'numeric', + month: '2-digit', + day: '2-digit', + hour: '2-digit', + minute: '2-digit', +}) + +/** Detect already-Jalali date strings like 1403/07/30 or 1403-07-30 */ +function isJalaliDateString(value: string): boolean { + const normalized = normalizeDigits(value.trim()).replace(/-/g, '/') + const match = normalized.match(/^(\d{4})\/(\d{1,2})\/(\d{1,2})/) + if (!match) return false + const year = Number(match[1]) + return year >= 1300 && year <= 1500 +} + +function toDateValue(date: string | Date): Date { + if (typeof date !== 'string') return date + const trimmed = date.trim() + // فقط تاریخِ بدون ساعت (YYYY-MM-DD) را به‌صورت تقویم محلی بخوان تا شیفت UTC روز را جابه‌جا نکند. + // رشته‌های دارای ساعت (…T10:30:00 یا … 10:30) باید کامل پارس شوند. + const dateOnly = trimmed.match(/^(\d{4})-(\d{2})-(\d{2})$/) + if (dateOnly && Number(dateOnly[1]) >= 1700) { + return new Date(Number(dateOnly[1]), Number(dateOnly[2]) - 1, Number(dateOnly[3])) + } + const parsed = new Date(trimmed) + if (Number.isNaN(parsed.getTime())) return new Date(NaN) + return parsed +} + +export function formatDate(date: string | Date | null | undefined): string { + if (!date) return '—' + if (typeof date === 'string' && isJalaliDateString(date)) { + const normalized = normalizeDigits(date.trim()).replace(/-/g, '/') + const match = normalized.match(/^(\d{4})\/(\d{1,2})\/(\d{1,2})/) + if (!match) return toPersianDigits(normalized) + const [, y, m, d] = match + return toPersianDigits(`${y}/${m!.padStart(2, '0')}/${d!.padStart(2, '0')}`) + } + const value = toDateValue(date) + if (Number.isNaN(value.getTime())) return '—' + return persianDateFormatter.format(value) +} + +export function formatDateTime(date: string | Date | null | undefined): string { + if (!date) return '—' + if (typeof date === 'string' && isJalaliDateString(date) && !/[T\s]\d/.test(date)) { + return formatDate(date) + } + const value = toDateValue(date) + if (Number.isNaN(value.getTime())) return '—' + return persianDateTimeFormatter.format(value) +} + +export function generateOrderNumber(): string { + const year = new Intl.DateTimeFormat('fa-IR-u-ca-persian', { year: 'numeric' }).format(new Date()) + const persianYear = year.replace(/[^\d]/g, '') || '1403' + const seq = Math.floor(Math.random() * 9000) + 1000 + return `ORD-${persianYear}-${seq}` +} diff --git a/src/utils/inboxLinks.ts b/src/utils/inboxLinks.ts new file mode 100644 index 0000000..a9e07fe --- /dev/null +++ b/src/utils/inboxLinks.ts @@ -0,0 +1,112 @@ +/** Resolve admin header message/notification click targets. */ + +const ORDER_NUMBER_RE = /ORD-?\d{2,4}-?\d{2,6}/i +const BARE_ORDER_PATH_RE = /^\/?(?:admin\/)?orders\/([^/?#]+)\/?$/i +const ORDER_SUBPATH_RE = /^\/?(?:admin\/)?orders\/([^/?#]+)\/(pricing|checks)\/?$/i + +export function extractOrderNumber(text: string): string | null { + const match = text.match(ORDER_NUMBER_RE) + if (!match?.[0]) return null + const digits = match[0].toUpperCase().replace(/^ORD-?/, '').replace(/-/g, '') + if (digits.length < 6) return match[0].toUpperCase() + const year = digits.slice(0, 4) + const seq = digits.slice(4) + return `ORD-${year}-${seq}` +} + +function hasKeyword(text: string, patterns: RegExp[]): boolean { + return patterns.some((pattern) => pattern.test(text)) +} + +/** Rewrite API links to routes that exist in the admin app. */ +export function normalizeAdminInboxLink(link: string): string { + let path = link.trim() + if (!path) return path + + try { + if (/^https?:\/\//i.test(path)) { + const url = new URL(path) + path = `${url.pathname}${url.search}` + } + } catch { + /* keep raw path */ + } + + path = path.replace(/^\/admin(?=\/)/, '') + if (!path.startsWith('/')) path = `/${path}` + + const sub = path.match(ORDER_SUBPATH_RE) + if (sub?.[1] && sub[2]) { + return `/orders/${sub[1]}/${sub[2]}` + } + + const bare = path.match(BARE_ORDER_PATH_RE) + if (bare?.[1]) { + return `/orders?order=${encodeURIComponent(bare[1])}` + } + + return path +} + +export type InboxLinkInput = { + link?: string | null + orderId?: string | null + title?: string | null + body?: string | null +} + +/** + * Prefer explicit `link`, then `orderId` + keywords, then order number / keyword heuristics. + */ +export function resolveAdminInboxLink(input: InboxLinkInput): string | null { + const explicit = input.link?.trim() + if (explicit) return normalizeAdminInboxLink(explicit) + + const title = input.title?.trim() ?? '' + const body = input.body?.trim() ?? '' + const text = `${title} ${body}` + const orderId = input.orderId?.trim() || null + const orderNumber = extractOrderNumber(text) + + const isSms = hasKeyword(text, [/پیامک/]) + const isCheck = hasKeyword(text, [/چک/]) + const isPricing = hasKeyword(text, [/قیمت/, /تخفیف/, /پیش[‌\s]?فاکتور/, /قیمت‌گذاری/, /اصلاح قیمت/]) + const isShipping = !isSms && hasKeyword(text, [/ارسال/, /باربری/, /حمل/, /بارنامه/]) + const isCash = hasKeyword(text, [/نقدی/, /پرداخت نقد/, /رسید پرداخت/]) + const isReport = hasKeyword(text, [/گزارش/]) + const isCustomer = hasKeyword(text, [/مشتری جدید/, /ثبت مشتری/]) + const isCatalog = hasKeyword(text, [/کالیته/]) + const isProduct = hasKeyword(text, [/محصول/]) + const isCompany = hasKeyword(text, [/شرکت/, /حساب بانکی/]) + const isOrderish = hasKeyword(text, [/سفارش/]) + const isSettings = isSms || hasKeyword(text, [/پشتیبان/, /تنظیمات/]) + + if (orderId) { + if (isCheck) return `/orders/${orderId}/checks` + if (isPricing) return `/orders/${orderId}/pricing` + if (isShipping) return `/shipping?order=${encodeURIComponent(orderId)}` + if (isCash) return `/cash-payments?order=${encodeURIComponent(orderId)}` + return `/orders?order=${encodeURIComponent(orderId)}` + } + + if (orderNumber) { + if (isCheck) return `/orders?order=${encodeURIComponent(orderNumber)}&focus=checks` + if (isPricing) return `/orders?order=${encodeURIComponent(orderNumber)}&focus=pricing` + if (isShipping) return `/shipping?order=${encodeURIComponent(orderNumber)}` + if (isCash) return `/cash-payments?order=${encodeURIComponent(orderNumber)}` + return `/orders?order=${encodeURIComponent(orderNumber)}` + } + + if (isCheck) return '/checks' + if (isShipping) return '/shipping' + if (isCash) return '/cash-payments' + if (isReport) return '/reports' + if (isCustomer) return '/customers' + if (isCatalog) return '/catalogs' + if (isProduct) return '/products' + if (isCompany) return '/companies' + if (isSettings) return '/settings' + if (isPricing || isOrderish) return '/orders' + + return null +} diff --git a/src/utils/navigation.ts b/src/utils/navigation.ts new file mode 100644 index 0000000..5ec09b0 --- /dev/null +++ b/src/utils/navigation.ts @@ -0,0 +1,38 @@ +import type { NavItem } from '@/types' + +export const ADMIN_NAV_ITEMS: NavItem[] = [ + { name: 'dashboard', label: 'داشبورد', path: '/', icon: 'home' }, + { name: 'orders', label: 'سفارش‌ها', path: '/orders', icon: 'orders' }, + { name: 'customers', label: 'مشتریان', path: '/customers', icon: 'customers' }, + { name: 'products', label: 'محصولات', path: '/products', icon: 'products' }, + { name: 'categories', label: 'دسته‌بندی‌ها', path: '/categories', icon: 'catalogs' }, + { name: 'banners', label: 'بنرها', path: '/banners', icon: 'image' }, + { name: 'catalogs', label: 'کالیته‌ها', path: '/catalogs', icon: 'catalogs' }, + { + name: 'catalog-requests', + label: 'درخواست کالیته فیزیکی', + path: '/catalog-requests', + icon: 'file', + }, + { name: 'brands', label: 'برندها', path: '/brands', icon: 'building' }, + { name: 'suggestions', label: 'پیشنهاد محصول', path: '/suggestions', icon: 'cart' }, + { name: 'stock-alerts', label: 'خبر موجودی', path: '/stock-alerts', icon: 'bell' }, + { name: 'levels', label: 'سطوح مشتری', path: '/levels', icon: 'users' }, + { name: 'companies', label: 'شرکت‌ها', path: '/companies', icon: 'companies' }, + { name: 'checks', label: 'چک‌ها', path: '/checks', icon: 'checks' }, + { name: 'cash-payments', label: 'پرداخت‌های نقدی', path: '/cash-payments', icon: 'cash' }, + { name: 'shipping', label: 'ارسال و باربری', path: '/shipping', icon: 'shipping' }, + { name: 'reports', label: 'گزارش‌ها', path: '/reports', icon: 'reports' }, + { name: 'settings', label: 'تنظیمات', path: '/settings', icon: 'settings' }, + { name: 'users', label: 'کاربران و دسترسی‌ها', path: '/users', icon: 'users' }, +] + +export function isNavActive(path: string, currentPath: string): boolean { + if (path === '/') return currentPath === '/' + // چک‌های یک سفارش زیر منوی «چک‌ها» فعال می‌شود، نه «سفارش‌ها» + if (/^\/orders\/[^/]+\/checks/.test(currentPath)) { + if (path === '/checks') return true + if (path === '/orders') return false + } + return currentPath === path || currentPath.startsWith(`${path}/`) +} diff --git a/src/utils/orderStatus.ts b/src/utils/orderStatus.ts new file mode 100644 index 0000000..1da7c83 --- /dev/null +++ b/src/utils/orderStatus.ts @@ -0,0 +1,88 @@ +import type { OrderStatus, RawOrderStatus } from '@/types' + +export interface StatusMeta { + label: string + tone: 'warning' | 'purple' | 'success' | 'danger' | 'info' | 'neutral' | 'delivered' +} + +export const ORDER_STATUS_META: Record = { + pending_review: { label: 'در انتظار بررسی', tone: 'warning' }, + awaiting_customer: { label: 'در انتظار مشتری', tone: 'info' }, + pending_check: { label: 'بررسی چک', tone: 'purple' }, + pending_payment: { label: 'بررسی رسید پرداخت', tone: 'purple' }, + needs_correction: { label: 'نیاز به اصلاح', tone: 'danger' }, + check_correction: { label: 'نیاز به اصلاح چک', tone: 'warning' }, + final_approval: { label: 'تأیید نهایی', tone: 'success' }, + shipped: { label: 'ارسال شده', tone: 'info' }, + delivered: { label: 'تحویل شده', tone: 'delivered' }, + cancelled: { label: 'لغو شده', tone: 'neutral' }, + rejected: { label: 'رد شده', tone: 'danger' }, + expired: { label: 'منقضی شده', tone: 'neutral' }, +} + +/** برچسب وضعیت واقعی سفارش؛ باید با ORDER_STATUS_LABELS سرور یکسان بماند. */ +export const RAW_ORDER_STATUS_LABELS: Record = { + cart: 'سبد خرید', + submitted: 'ثبت‌شده', + awaiting_review: 'در انتظار بررسی', + pricing: 'قیمت‌گذاری', + awaiting_settlement: 'در انتظار تسویه', + awaiting_settlement_fix: 'اصلاح تسویه', + cash_in_progress: 'در حال ثبت نقدی', + cash_invoice_issued: 'صدور فاکتور نقدی', + awaiting_cash_payment: 'در انتظار پرداخت نقدی', + cash_payment_submitted: 'رسید نقدی ارسال‌شده', + awaiting_cash_confirmation: 'تأیید پرداخت نقدی', + cash_confirmed: 'پرداخت نقدی تأیید شد', + check_in_progress: 'در حال ثبت چک', + awaiting_check_review: 'بررسی چک', + check_needs_fix: 'اصلاح چک', + check_rejected: 'رد چک', + checks_approved: 'تأیید چک‌ها', + final_approved: 'تأیید نهایی', + preparing: 'آماده‌سازی', + ready_to_ship: 'آماده ارسال', + shipped: 'ارسال‌شده', + delivered: 'تحویل‌شده', + needs_correction: 'نیاز به اصلاح', + cancelled: 'لغو شده', + rejected: 'رد شده', + expired: 'منقضی', +} + +export function rawStatusLabel(status?: string): string { + if (!status) return '—' + return RAW_ORDER_STATUS_LABELS[status as RawOrderStatus] ?? status +} + +/** وضعیت‌هایی که هنوز فاکتور صادر نشده و قیمت‌گذاری اقدام اصلی است. */ +export const PRE_INVOICE_RAW_STATUSES: RawOrderStatus[] = [ + 'cart', + 'submitted', + 'awaiting_review', + 'pricing', + 'needs_correction', +] + +const PRE_INVOICE_ADMIN_STATUSES: OrderStatus[] = ['pending_review', 'needs_correction'] + +export function canPriceOrder(order: { + status: OrderStatus + rawStatus?: RawOrderStatus +}): boolean { + if (order.rawStatus) return PRE_INVOICE_RAW_STATUSES.includes(order.rawStatus) + return PRE_INVOICE_ADMIN_STATUSES.includes(order.status) +} + +export const ORDER_TABS = [ + { key: 'all', label: 'همه' }, + { key: 'pending_review', label: 'در انتظار بررسی' }, + { key: 'awaiting_customer', label: 'در انتظار مشتری' }, + { key: 'pending_check', label: 'بررسی چک' }, + { key: 'pending_payment', label: 'بررسی رسید' }, + { key: 'check_correction', label: 'اصلاح چک' }, + { key: 'needs_correction', label: 'نیاز به اصلاح' }, + { key: 'final_approval', label: 'تأیید نهایی' }, + { key: 'shipped', label: 'ارسال شده' }, + { key: 'delivered', label: 'تحویل شده' }, +] as const diff --git a/src/views/auth/LoginView.vue b/src/views/auth/LoginView.vue new file mode 100644 index 0000000..c224701 --- /dev/null +++ b/src/views/auth/LoginView.vue @@ -0,0 +1,301 @@ + + + + + diff --git a/src/views/banners/BannersView.vue b/src/views/banners/BannersView.vue new file mode 100644 index 0000000..c4ff747 --- /dev/null +++ b/src/views/banners/BannersView.vue @@ -0,0 +1,240 @@ + + + + + diff --git a/src/views/brands/BrandsView.vue b/src/views/brands/BrandsView.vue new file mode 100644 index 0000000..d58c4d8 --- /dev/null +++ b/src/views/brands/BrandsView.vue @@ -0,0 +1,130 @@ + + +