From fd3e5e512610ddbb0571b0505b3c6c016dbed709 Mon Sep 17 00:00:00 2001 From: safavimohadeseh78 Date: Mon, 3 Aug 2026 09:57:24 +0200 Subject: [PATCH] Initial commit: fabric-trade-user Vue 3 app with mobile and desktop layouts Co-authored-by: Cursor --- .editorconfig | 8 + .gitattributes | 1 + .gitignore | 39 + .oxlintrc.json | 10 + .prettierrc.json | 6 + .vscode/extensions.json | 9 + README.md | 48 + env.d.ts | 1 + eslint.config.ts | 26 + index.html | 14 + package-lock.json | 5167 +++++++++++++++++ package.json | 47 + public/favicon.ico | Bin 0 -> 4286 bytes src/App.vue | 24 + .../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/app-shell.css | 128 + src/assets/styles/desktop-pages.css | 230 + src/assets/styles/desktop.css | 652 +++ src/assets/styles/fonts.css | 55 + src/assets/styles/main.css | 350 ++ src/assets/styles/responsive.css | 362 ++ src/components/icons/IconBell.vue | 20 + src/components/icons/IconBolt.vue | 14 + src/components/icons/IconBuilding.vue | 21 + src/components/icons/IconCart.vue | 30 + src/components/icons/IconCash.vue | 26 + src/components/icons/IconCashSettlement.vue | 20 + src/components/icons/IconCatalog.vue | 19 + src/components/icons/IconCheckBook.vue | 19 + .../icons/IconCheckCircleOutline.vue | 29 + src/components/icons/IconChevronBack.vue | 28 + src/components/icons/IconChevronLeft.vue | 28 + src/components/icons/IconClipboardEmpty.vue | 75 + src/components/icons/IconDiamond.vue | 19 + src/components/icons/IconEditPen.vue | 28 + src/components/icons/IconFamBaftLogo.vue | 17 + src/components/icons/IconFeather.vue | 26 + src/components/icons/IconFilter.vue | 27 + src/components/icons/IconHeadset.vue | 16 + src/components/icons/IconHome.vue | 27 + src/components/icons/IconHourglass.vue | 28 + src/components/icons/IconIdCard.vue | 11 + src/components/icons/IconLayoutGrid.vue | 25 + src/components/icons/IconLightbulb.vue | 26 + src/components/icons/IconLock.vue | 15 + src/components/icons/IconMail.vue | 10 + src/components/icons/IconMapPin.vue | 15 + src/components/icons/IconMoreVertical.vue | 23 + src/components/icons/IconOrders.vue | 41 + src/components/icons/IconParLogo.vue | 26 + src/components/icons/IconPhone.vue | 14 + src/components/icons/IconProfile.vue | 28 + src/components/icons/IconProgressClock.vue | 29 + src/components/icons/IconSearch.vue | 20 + src/components/icons/IconSettings.vue | 15 + src/components/icons/IconShoppingBag.vue | 20 + src/components/icons/IconSuccessCircle.vue | 17 + src/components/icons/IconTrash.vue | 48 + src/components/icons/IconVerified.vue | 16 + src/components/layout/AppLayout.vue | 9 + src/components/layout/BottomNav.vue | 108 + src/components/layout/CheckoutStepper.vue | 141 + src/components/layout/DesktopHeader.vue | 292 + src/components/layout/DesktopSidebar.vue | 296 + src/components/layout/PageHeader.vue | 148 + src/components/orders/OrderStatusHero.vue | 76 + .../orders/OrderTrackingSummary.vue | 87 + .../orders/OrderTrackingTimeline.vue | 167 + src/components/ui/BaseBadge.vue | 52 + src/components/ui/BaseButton.vue | 110 + src/components/ui/BaseInput.vue | 67 + src/components/ui/CapacitySummary.vue | 64 + src/components/ui/CartMeterageFooter.vue | 95 + src/components/ui/CurrencyInput.vue | 84 + src/components/ui/EmptyState.vue | 52 + src/components/ui/FilterTabs.vue | 90 + src/components/ui/FormErrorBanner.vue | 25 + src/components/ui/MeterageBar.vue | 73 + src/components/ui/PersianDateInput.vue | 328 ++ src/components/ui/SearchField.vue | 47 + src/components/ui/StatusBadge.vue | 17 + src/composables/useCartPage.ts | 56 + src/composables/useOrderList.ts | 155 + src/composables/useProductOrdering.ts | 94 + src/data/mockData.ts | 248 + src/layouts/DefaultLayout.vue | 61 + src/main.ts | 18 + src/router/index.ts | 135 + src/services/authService.ts | 130 + src/services/storage.ts | 26 + src/stores/auth.ts | 80 + src/stores/cart.ts | 260 + src/stores/catalog.ts | 66 + src/stores/order.ts | 248 + src/types/index.ts | 204 + src/utils/checkRass.ts | 58 + src/utils/constants.ts | 70 + src/utils/formErrors.ts | 14 + src/utils/format.ts | 88 + src/utils/jalali.ts | 101 + src/utils/navigation.ts | 64 + src/utils/orderStatusGroups.ts | 69 + src/utils/orderTracking.ts | 110 + src/utils/validation.ts | 74 + src/views/OrdersView.vue | 75 + src/views/auth/LoginView.vue | 110 + src/views/auth/OtpView.vue | 100 + src/views/auth/RegisterView.vue | 135 + src/views/cart/CartView.vue | 86 + src/views/cart/components/DesktopCartPage.vue | 608 ++ src/views/cart/components/MobileCartPage.vue | 241 + src/views/catalogs/CatalogListView.vue | 179 + src/views/checkout/CashSettlementView.vue | 295 + src/views/checkout/CheckFormView.vue | 317 + src/views/checkout/CheckListView.vue | 549 ++ src/views/checkout/CheckModeSelectView.vue | 115 + src/views/checkout/SettlementTypeView.vue | 146 + src/views/companies/CompanySelectView.vue | 107 + .../components/DesktopCompanySelect.vue | 102 + .../components/DesktopHomeDashboard.vue | 573 ++ .../components/MobileCompanySelect.vue | 126 + src/views/orders/OrderDetailView.vue | 686 +++ src/views/orders/OrderSuccessView.vue | 84 + .../orders/components/DesktopOrdersPage.vue | 210 + .../orders/components/MobileOrdersPage.vue | 199 + src/views/products/ProductListView.vue | 74 + .../components/DesktopProductPage.vue | 303 + .../products/components/MobileProductPage.vue | 227 + src/views/profile/ProfileChecksView.vue | 7 + src/views/profile/ProfileEditView.vue | 152 + src/views/profile/ProfileView.vue | 19 + .../profile/components/DesktopProfilePage.vue | 723 +++ .../profile/components/MobileProfilePage.vue | 224 + tsconfig.app.json | 18 + tsconfig.json | 11 + tsconfig.node.json | 27 + vite.config.ts | 20 + 142 files changed, 19798 insertions(+) create mode 100644 .editorconfig 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 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/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/app-shell.css create mode 100644 src/assets/styles/desktop-pages.css create mode 100644 src/assets/styles/desktop.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/icons/IconBell.vue create mode 100644 src/components/icons/IconBolt.vue create mode 100644 src/components/icons/IconBuilding.vue create mode 100644 src/components/icons/IconCart.vue create mode 100644 src/components/icons/IconCash.vue create mode 100644 src/components/icons/IconCashSettlement.vue create mode 100644 src/components/icons/IconCatalog.vue create mode 100644 src/components/icons/IconCheckBook.vue create mode 100644 src/components/icons/IconCheckCircleOutline.vue create mode 100644 src/components/icons/IconChevronBack.vue create mode 100644 src/components/icons/IconChevronLeft.vue create mode 100644 src/components/icons/IconClipboardEmpty.vue create mode 100644 src/components/icons/IconDiamond.vue create mode 100644 src/components/icons/IconEditPen.vue create mode 100644 src/components/icons/IconFamBaftLogo.vue create mode 100644 src/components/icons/IconFeather.vue create mode 100644 src/components/icons/IconFilter.vue create mode 100644 src/components/icons/IconHeadset.vue create mode 100644 src/components/icons/IconHome.vue create mode 100644 src/components/icons/IconHourglass.vue create mode 100644 src/components/icons/IconIdCard.vue create mode 100644 src/components/icons/IconLayoutGrid.vue create mode 100644 src/components/icons/IconLightbulb.vue create mode 100644 src/components/icons/IconLock.vue create mode 100644 src/components/icons/IconMail.vue create mode 100644 src/components/icons/IconMapPin.vue create mode 100644 src/components/icons/IconMoreVertical.vue create mode 100644 src/components/icons/IconOrders.vue create mode 100644 src/components/icons/IconParLogo.vue create mode 100644 src/components/icons/IconPhone.vue create mode 100644 src/components/icons/IconProfile.vue create mode 100644 src/components/icons/IconProgressClock.vue create mode 100644 src/components/icons/IconSearch.vue create mode 100644 src/components/icons/IconSettings.vue create mode 100644 src/components/icons/IconShoppingBag.vue create mode 100644 src/components/icons/IconSuccessCircle.vue create mode 100644 src/components/icons/IconTrash.vue create mode 100644 src/components/icons/IconVerified.vue create mode 100644 src/components/layout/AppLayout.vue create mode 100644 src/components/layout/BottomNav.vue create mode 100644 src/components/layout/CheckoutStepper.vue create mode 100644 src/components/layout/DesktopHeader.vue create mode 100644 src/components/layout/DesktopSidebar.vue create mode 100644 src/components/layout/PageHeader.vue create mode 100644 src/components/orders/OrderStatusHero.vue create mode 100644 src/components/orders/OrderTrackingSummary.vue create mode 100644 src/components/orders/OrderTrackingTimeline.vue create mode 100644 src/components/ui/BaseBadge.vue create mode 100644 src/components/ui/BaseButton.vue create mode 100644 src/components/ui/BaseInput.vue create mode 100644 src/components/ui/CapacitySummary.vue create mode 100644 src/components/ui/CartMeterageFooter.vue create mode 100644 src/components/ui/CurrencyInput.vue create mode 100644 src/components/ui/EmptyState.vue create mode 100644 src/components/ui/FilterTabs.vue create mode 100644 src/components/ui/FormErrorBanner.vue create mode 100644 src/components/ui/MeterageBar.vue create mode 100644 src/components/ui/PersianDateInput.vue create mode 100644 src/components/ui/SearchField.vue create mode 100644 src/components/ui/StatusBadge.vue create mode 100644 src/composables/useCartPage.ts create mode 100644 src/composables/useOrderList.ts create mode 100644 src/composables/useProductOrdering.ts create mode 100644 src/data/mockData.ts create mode 100644 src/layouts/DefaultLayout.vue create mode 100644 src/main.ts create mode 100644 src/router/index.ts create mode 100644 src/services/authService.ts create mode 100644 src/services/storage.ts create mode 100644 src/stores/auth.ts create mode 100644 src/stores/cart.ts create mode 100644 src/stores/catalog.ts create mode 100644 src/stores/order.ts create mode 100644 src/types/index.ts create mode 100644 src/utils/checkRass.ts create mode 100644 src/utils/constants.ts create mode 100644 src/utils/formErrors.ts create mode 100644 src/utils/format.ts create mode 100644 src/utils/jalali.ts create mode 100644 src/utils/navigation.ts create mode 100644 src/utils/orderStatusGroups.ts create mode 100644 src/utils/orderTracking.ts create mode 100644 src/utils/validation.ts create mode 100644 src/views/OrdersView.vue create mode 100644 src/views/auth/LoginView.vue create mode 100644 src/views/auth/OtpView.vue create mode 100644 src/views/auth/RegisterView.vue create mode 100644 src/views/cart/CartView.vue create mode 100644 src/views/cart/components/DesktopCartPage.vue create mode 100644 src/views/cart/components/MobileCartPage.vue create mode 100644 src/views/catalogs/CatalogListView.vue create mode 100644 src/views/checkout/CashSettlementView.vue create mode 100644 src/views/checkout/CheckFormView.vue create mode 100644 src/views/checkout/CheckListView.vue create mode 100644 src/views/checkout/CheckModeSelectView.vue create mode 100644 src/views/checkout/SettlementTypeView.vue create mode 100644 src/views/companies/CompanySelectView.vue create mode 100644 src/views/companies/components/DesktopCompanySelect.vue create mode 100644 src/views/companies/components/DesktopHomeDashboard.vue create mode 100644 src/views/companies/components/MobileCompanySelect.vue create mode 100644 src/views/orders/OrderDetailView.vue create mode 100644 src/views/orders/OrderSuccessView.vue create mode 100644 src/views/orders/components/DesktopOrdersPage.vue create mode 100644 src/views/orders/components/MobileOrdersPage.vue create mode 100644 src/views/products/ProductListView.vue create mode 100644 src/views/products/components/DesktopProductPage.vue create mode 100644 src/views/products/components/MobileProductPage.vue create mode 100644 src/views/profile/ProfileChecksView.vue create mode 100644 src/views/profile/ProfileEditView.vue create mode 100644 src/views/profile/ProfileView.vue create mode 100644 src/views/profile/components/DesktopProfilePage.vue create mode 100644 src/views/profile/components/MobileProfilePage.vue create mode 100644 tsconfig.app.json create mode 100644 tsconfig.json create mode 100644 tsconfig.node.json create mode 100644 vite.config.ts 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/.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..cd68f14 --- /dev/null +++ b/.gitignore @@ -0,0 +1,39 @@ +# 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 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..c2c0f87 --- /dev/null +++ b/README.md @@ -0,0 +1,48 @@ +# fabric-trade + +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/env.d.ts b/env.d.ts new file mode 100644 index 0000000..11f02fe --- /dev/null +++ b/env.d.ts @@ -0,0 +1 @@ +/// 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..f7b2849 --- /dev/null +++ b/index.html @@ -0,0 +1,14 @@ + + + + + + + + سامانه سفارش عمده پارچه + + +
+ + + diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..a3b0773 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,5167 @@ +{ + "name": "fabric-trade", + "version": "0.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "fabric-trade", + "version": "0.0.0", + "dependencies": { + "jalaali-js": "^2.0.0", + "pinia": "^4.0.2", + "vue": "^3.5.40", + "vue-router": "^5.2.0" + }, + "devDependencies": { + "@tsconfig/node24": "^24.0.4", + "@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/@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/@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==", + "dev": true, + "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-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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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/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/@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/@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/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.10", + "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.11.10.tgz", + "integrity": "sha512-35JEvJ5/KKlbCHjMCsONI2w6HE88STjVdHk+C7d8LtcFxUjZR1KeLP9izofn2qs0KUxX5r4z73bwH/rd+JHacw==", + "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/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/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/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/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/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/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/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/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/jalaali-js": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/jalaali-js/-/jalaali-js-2.0.0.tgz", + "integrity": "sha512-HkWlwO3KxuYwERP1jsn+5M+QA+EKpIJ+zGesLee5VJNn2d2Melue0uQIvd9C/0QYFR7XVWvfF/uiNEz9Jbr9Hw==", + "license": "MIT", + "engines": { + "node": ">=20" + } + }, + "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==", + "dev": true, + "license": "MIT", + "bin": { + "jiti": "lib/jiti-cli.mjs" + } + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/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/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, + "license": "ISC", + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/magic-string": { + "version": "0.30.21", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz", + "integrity": "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==", + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.5" + } + }, + "node_modules/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/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==", + "dev": true, + "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-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/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/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/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/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==", + "dev": true, + "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/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==", + "dev": true, + "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==", + "dev": true, + "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/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/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/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..a91e206 --- /dev/null +++ b/package.json @@ -0,0 +1,47 @@ +{ + "name": "fabric-trade", + "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": { + "jalaali-js": "^2.0.0", + "pinia": "^4.0.2", + "vue": "^3.5.40", + "vue-router": "^5.2.0" + }, + "devDependencies": { + "@tsconfig/node24": "^24.0.4", + "@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/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..d8a0da8 --- /dev/null +++ b/src/App.vue @@ -0,0 +1,24 @@ + + + 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) 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 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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 768px) ── */ +@media (min-width: 768px) { + .app-shell--with-nav { + background: var(--color-page-background); + } + + .app-shell--with-nav .app-frame { + background: var(--color-page-background); + } + + .app-shell--with-nav .app-main__content { + overflow-y: auto; + } +} + +/* ── Guest pages (login, checkout) ── */ +@media (min-width: 768px) { + .app-shell--no-nav { + align-items: center; + justify-content: center; + padding: 24px; + background: var(--color-page-background); + } + + .app-shell--no-nav .app-layout { + max-width: var(--form-max-width); + width: 100%; + height: auto; + max-height: calc(100dvh - 48px); + } + + .app-shell--no-nav .app-frame { + max-width: var(--form-max-width); + border-radius: var(--radius-lg); + box-shadow: var(--shadow-frame); + max-height: calc(100dvh - 48px); + background: var(--color-surface); + } + + .app-shell--no-nav.app-shell--wide .app-layout, + .app-shell--no-nav.app-shell--wide .app-frame { + max-width: min(var(--content-max-width), calc(100vw - 48px)); + } + + .app-shell--no-nav.app-shell--wide .app-frame { + background: var(--color-bg); + } +} diff --git a/src/assets/styles/desktop-pages.css b/src/assets/styles/desktop-pages.css new file mode 100644 index 0000000..cb36c24 --- /dev/null +++ b/src/assets/styles/desktop-pages.css @@ -0,0 +1,230 @@ +/* Desktop page composition — >= 768px shell, >= 1200px full desktop */ + +@media (min-width: 768px) { + .desktop-page { + flex: 1; + display: flex; + flex-direction: column; + min-height: 0; + width: 100%; + max-width: var(--content-max-width); + margin-inline: auto; + padding: 20px 0 28px; + background: transparent; + } + + .desktop-page__head { + margin-bottom: 20px; + } + + .desktop-page__title { + margin: 0 0 6px; + font-size: 1.375rem; + font-weight: 700; + color: var(--color-text); + } + + .desktop-page__subtitle { + margin: 0; + font-size: 0.875rem; + color: var(--color-text-muted); + } + + .desktop-two-col { + display: grid; + grid-template-columns: minmax(0, 1fr) var(--summary-panel-width, 320px); + gap: 24px; + align-items: start; + } + + .desktop-two-col__main { + min-width: 0; + } + + .desktop-summary-panel { + position: sticky; + top: 16px; + padding: 20px; + background: var(--color-surface); + border: 1px solid var(--color-border); + border-radius: var(--radius-md); + box-shadow: var(--shadow-card); + } + + .desktop-summary-panel__title { + margin: 0 0 16px; + padding-bottom: 12px; + border-bottom: 1px solid var(--color-border); + font-size: 0.9375rem; + font-weight: 700; + } + + .desktop-summary-panel__row { + display: flex; + justify-content: space-between; + align-items: center; + gap: 12px; + padding: 8px 0; + font-size: 0.875rem; + } + + .desktop-summary-panel__row span:first-child { + color: var(--color-text-muted); + } + + .desktop-summary-panel__row strong { + color: var(--color-text); + font-variant-numeric: tabular-nums; + } + + .desktop-summary-panel__action { + margin-top: 16px; + } + + .desktop-table-wrap { + background: var(--color-surface); + border: 1px solid var(--color-border); + border-radius: var(--radius-md); + box-shadow: var(--shadow-card); + overflow: hidden; + } + + .desktop-table-scroll { + overflow-x: auto; + } + + .desktop-table { + width: 100%; + border-collapse: collapse; + font-size: 0.875rem; + min-width: 640px; + } + + .desktop-table th { + padding: 12px 16px; + text-align: start; + font-size: 0.8125rem; + font-weight: 600; + color: var(--color-text-muted); + background: #f8fafc; + border-bottom: 1px solid var(--color-border); + white-space: nowrap; + } + + .desktop-table td { + padding: 14px 16px; + border-bottom: 1px solid #f1f5f9; + color: var(--color-text); + vertical-align: middle; + } + + .desktop-table tbody tr:last-child td { + border-bottom: none; + } + + .desktop-table tbody tr:hover td { + background: #fafbfc; + } + + .desktop-grid-2 { + display: grid; + grid-template-columns: repeat(2, minmax(280px, 1fr)); + gap: 16px; + } + + .desktop-grid-3 { + display: grid; + grid-template-columns: repeat(2, minmax(0, 1fr)); + gap: 16px; + } + + .desktop-grid-4 { + display: grid; + grid-template-columns: repeat(2, minmax(0, 1fr)); + gap: 14px; + } + + .desktop-toolbar { + display: flex; + align-items: center; + justify-content: space-between; + gap: 16px; + margin-bottom: 16px; + flex-wrap: wrap; + } + + .desktop-toolbar__actions { + display: flex; + align-items: center; + gap: 8px; + flex-shrink: 0; + } + + .desktop-btn-compact { + width: auto !important; + min-width: 120px; + padding-inline: 20px !important; + } + + .desktop-form-grid { + display: grid; + grid-template-columns: repeat(2, minmax(0, 1fr)); + gap: 16px; + } + + .desktop-form-grid__full { + grid-column: 1 / -1; + } + + .desktop-checkout-shell { + width: 100%; + max-width: min(var(--content-max-width), calc(100vw - 48px)); + margin-inline: auto; + padding: 24px 0 32px; + } + + .desktop-settlement-grid { + display: grid; + grid-template-columns: repeat(2, minmax(280px, 380px)); + gap: 20px; + justify-content: center; + max-width: 820px; + margin-inline: auto; + } + + .desktop-company-grid { + display: grid; + grid-template-columns: repeat(2, minmax(280px, 400px)); + gap: 20px; + justify-content: center; + max-width: 900px; + margin-inline: auto; + width: 100%; + } +} + +@media (min-width: 1200px) { + .desktop-page { + padding: 24px 0 32px; + } + + .desktop-page__head { + margin-bottom: 24px; + } + + .desktop-grid-3 { + grid-template-columns: repeat(3, minmax(0, 1fr)); + gap: 20px; + } + + .desktop-grid-4 { + grid-template-columns: repeat(4, minmax(0, 1fr)); + gap: 16px; + } +} + +@media (min-width: 1440px) { + .desktop-grid-3 { + grid-template-columns: repeat(4, minmax(0, 1fr)); + } +} diff --git a/src/assets/styles/desktop.css b/src/assets/styles/desktop.css new file mode 100644 index 0000000..2fed109 --- /dev/null +++ b/src/assets/styles/desktop.css @@ -0,0 +1,652 @@ +/* App shell page layouts — 768px and above */ + +@media (min-width: 768px) { + :root { + --page-padding: var(--page-padding-tablet); + --nav-height: 0px; + } + + .page { + padding: 20px var(--page-padding-tablet) 28px; + background: transparent; + max-width: var(--content-max-width); + margin-inline: auto; + width: 100%; + } + + .page__scroll { + overflow: visible; + flex: none; + } + + .page__scroll--with-nav { + padding-bottom: 0; + } + + /* Shared page headings */ + .page-head { + margin-bottom: 20px; + } + + .page-head__title { + margin: 0 0 4px; + font-size: 1.25rem; + font-weight: 700; + color: var(--color-text); + } + + .page-head__subtitle { + margin: 0; + font-size: 0.875rem; + color: var(--color-text-muted); + } + + /* Orders dashboard */ + .orders-page__desktop-head { + margin-bottom: 20px; + } + + .orders-page__desktop-title { + margin: 0 0 6px; + font-size: 1.375rem; + font-weight: 700; + color: var(--color-text); + } + + .orders-page__desktop-subtitle { + margin: 0; + font-size: 0.875rem; + color: var(--color-text-muted); + } + + .orders-stats { + display: grid; + grid-template-columns: repeat(4, minmax(0, 1fr)); + gap: 14px; + margin-bottom: 20px; + } + + .orders-stat-card { + padding: 16px 18px 14px; + background: var(--color-surface); + border-radius: var(--radius-md); + border: 1px solid var(--color-border); + box-shadow: var(--shadow-sm); + display: flex; + flex-direction: column; + align-items: stretch; + gap: 0; + min-height: 0; + } + + .orders-stat-card__head { + display: flex; + align-items: center; + justify-content: space-between; + gap: 10px; + margin-bottom: 10px; + } + + .orders-stat-card__label { + font-size: 0.8125rem; + font-weight: 600; + line-height: 1.4; + } + + .orders-stat-card__label--total, + .orders-stat-card__label--review { + color: var(--color-text); + } + + .orders-stat-card__label--active { + color: #ea580c; + } + + .orders-stat-card__label--done { + color: var(--color-success); + } + + .orders-stat-card__value { + font-size: 1.75rem; + font-weight: 700; + color: var(--color-text); + line-height: 1.15; + margin: 0 0 12px; + font-variant-numeric: tabular-nums; + } + + .orders-stat-card__link { + margin-top: auto; + padding: 0; + border: none; + background: none; + color: var(--color-primary); + font-family: inherit; + font-size: 0.8125rem; + font-weight: 600; + cursor: pointer; + text-decoration: underline; + text-underline-offset: 3px; + align-self: flex-start; + } + + .orders-stat-card__link:hover { + color: var(--color-primary-hover); + } + + .orders-stat-card__icon { + width: 40px; + height: 40px; + border-radius: 50%; + display: flex; + align-items: center; + justify-content: center; + flex-shrink: 0; + } + + .orders-stat-card__icon--total { + background: var(--color-primary-soft); + color: var(--color-primary); + } + + .orders-stat-card__icon--review { + background: var(--color-primary-soft); + color: var(--color-primary); + } + + .orders-stat-card__icon--active { + background: var(--color-warning-light); + color: #ea580c; + } + + .orders-stat-card__icon--done { + background: var(--color-success-soft); + color: var(--color-success); + } + + .orders-toolbar { + display: flex; + align-items: center; + justify-content: space-between; + gap: 16px; + margin-bottom: 16px; + flex-wrap: wrap; + } + + .orders-toolbar__actions { + display: flex; + align-items: center; + gap: 8px; + flex-shrink: 0; + } + + .orders-toolbar__filter-btn { + display: inline-flex; + align-items: center; + gap: 8px; + height: 40px; + padding: 0 18px; + border: none; + border-radius: var(--radius-sm); + background: var(--color-primary); + color: #fff; + font-family: inherit; + font-size: 0.875rem; + font-weight: 600; + cursor: pointer; + white-space: nowrap; + } + + .orders-toolbar__filter-btn:hover { + background: var(--color-primary-hover); + } + + .orders-toolbar__layout-btn { + width: 40px; + height: 40px; + border: 1px solid var(--color-border); + border-radius: var(--radius-sm); + background: var(--color-surface); + color: var(--color-text-muted); + cursor: pointer; + display: flex; + align-items: center; + justify-content: center; + padding: 0; + } + + .orders-toolbar__layout-btn:hover { + border-color: var(--color-primary); + color: var(--color-primary); + } + + .orders-toolbar__pills { + display: flex; + align-items: center; + gap: 8px; + flex-wrap: wrap; + flex: 1; + min-width: 0; + justify-content: flex-end; + } + + .orders-filter-pill { + height: 36px; + padding: 0 16px; + border: 1px solid var(--color-border); + border-radius: 999px; + background: var(--color-surface); + color: var(--color-text-muted); + font-family: inherit; + font-size: 0.8125rem; + font-weight: 500; + cursor: pointer; + white-space: nowrap; + transition: + background 0.15s, + color 0.15s, + border-color 0.15s; + } + + .orders-filter-pill:hover { + border-color: #cbd5e1; + color: var(--color-text); + } + + .orders-filter-pill--active { + background: var(--color-primary-soft); + border-color: #c7d7ff; + color: var(--color-primary); + font-weight: 600; + } + + .orders-table-wrap { + background: var(--color-surface); + border-radius: var(--radius-md); + border: 1px solid var(--color-border); + box-shadow: var(--shadow-card); + overflow: hidden; + } + + .orders-table-scroll { + overflow-x: auto; + } + + .orders-table { + width: 100%; + border-collapse: collapse; + font-size: 0.875rem; + min-width: 720px; + } + + .orders-table th { + padding: 14px 16px; + text-align: start; + font-weight: 600; + font-size: 0.8125rem; + color: var(--color-text-muted); + background: #f8fafc; + border-bottom: 1px solid var(--color-border); + white-space: nowrap; + } + + .orders-table td { + padding: 16px; + border-bottom: 1px solid #f1f5f9; + color: var(--color-text); + vertical-align: middle; + } + + .orders-table tr:last-child td { + border-bottom: none; + } + + .orders-table tbody tr:hover td { + background: #fafbfc; + } + + .orders-table__number { + font-weight: 700; + color: var(--color-text); + white-space: nowrap; + } + + .orders-table__amount { + font-weight: 600; + font-variant-numeric: tabular-nums; + white-space: nowrap; + } + + .orders-table__date { + color: var(--color-text-muted); + font-size: 0.8125rem; + white-space: nowrap; + } + + .orders-table__actions { + display: flex; + align-items: center; + gap: 8px; + } + + .orders-table__action { + padding: 7px 16px; + border: 1px solid var(--color-border); + border-radius: var(--radius-sm); + background: var(--color-surface); + color: var(--color-primary); + font-size: 0.8125rem; + font-weight: 600; + cursor: pointer; + font-family: inherit; + white-space: nowrap; + } + + .orders-table__action:hover { + background: var(--color-primary-soft); + border-color: #c7d7ff; + } + + .orders-table__menu { + width: 34px; + height: 34px; + border: none; + border-radius: var(--radius-sm); + background: transparent; + color: var(--color-text-muted); + cursor: pointer; + display: flex; + align-items: center; + justify-content: center; + padding: 0; + } + + .orders-table__menu:hover { + background: #f1f5f9; + color: var(--color-text); + } + + .orders-pagination { + display: flex; + align-items: center; + justify-content: space-between; + gap: 16px; + padding: 14px 16px; + border-top: 1px solid var(--color-border); + font-size: 0.8125rem; + color: var(--color-text-muted); + flex-wrap: wrap; + } + + .orders-pagination__summary { + white-space: nowrap; + } + + .orders-pagination__controls { + display: flex; + align-items: center; + gap: 4px; + } + + .orders-pagination__arrow { + width: 32px; + height: 32px; + border: 1px solid var(--color-border); + border-radius: var(--radius-sm); + background: var(--color-surface); + cursor: pointer; + display: flex; + align-items: center; + justify-content: center; + padding: 0; + color: var(--color-text); + } + + .orders-pagination__arrow:disabled { + opacity: 0.4; + cursor: not-allowed; + } + + .orders-pagination__arrow:not(:disabled):hover { + border-color: var(--color-primary); + color: var(--color-primary); + } + + .orders-pagination__arrow-icon--prev { + transform: scaleX(-1); + } + + .orders-pagination__arrow-icon--next { + transform: none; + } + + .orders-pagination__ellipsis { + min-width: 24px; + text-align: center; + color: var(--color-text-muted); + } + + .orders-pagination__page { + min-width: 32px; + height: 32px; + padding: 0 6px; + border: 1px solid var(--color-border); + border-radius: var(--radius-sm); + background: var(--color-surface); + cursor: pointer; + font-family: inherit; + font-size: 0.8125rem; + color: var(--color-text); + } + + .orders-pagination__page:hover:not(.orders-pagination__page--active) { + border-color: var(--color-primary); + color: var(--color-primary); + } + + .orders-pagination__page--active { + background: var(--color-primary); + border-color: var(--color-primary); + color: #fff; + font-weight: 600; + } + + /* Product page desktop layout */ + .product-page__layout { + display: grid; + grid-template-columns: minmax(0, 1fr) 300px; + gap: 24px; + align-items: start; + } + + .product-page__main { + min-width: 0; + } + + .product-page__sidebar { + position: sticky; + top: 16px; + } + + .cart-summary-panel { + padding: 20px; + background: var(--color-surface); + border-radius: var(--radius-md); + border: 1px solid var(--color-border); + box-shadow: var(--shadow-card); + } + + .cart-summary-panel__title { + margin: 0 0 16px; + font-size: 0.9375rem; + font-weight: 700; + color: var(--color-text); + padding-bottom: 12px; + border-bottom: 1px solid var(--color-border); + } + + .cart-summary-panel__row { + display: flex; + justify-content: space-between; + align-items: center; + padding: 8px 0; + font-size: 0.875rem; + } + + .cart-summary-panel__row span:first-child { + color: var(--color-text-muted); + } + + .cart-summary-panel__row strong { + color: var(--color-text); + } + + .cart-summary-panel__btn { + margin-top: 16px; + } + + .product-page__scroll { + padding-bottom: 0; + } + + .product-page .sticky-footer { + display: none; + } + + .product-list { + grid-template-columns: repeat(2, minmax(0, 1fr)); + } + + /* Cart desktop */ + .cart-page { + max-width: var(--content-max-width); + margin-inline: auto; + padding: 20px var(--page-padding-tablet) 28px; + background: transparent; + } + + .cart-page__desktop-title { + margin: 0 0 16px; + font-size: 1.25rem; + font-weight: 700; + } + + .cart-page__body { + display: grid; + grid-template-columns: minmax(0, 1fr) minmax(280px, 320px); + gap: 20px 24px; + align-items: start; + } + + .cart-page__company { + grid-column: 1 / -1; + } + + /* Order detail desktop */ + .order-detail-page { + max-width: var(--content-max-width); + margin-inline: auto; + padding: 24px var(--page-padding-desktop) 32px; + background: transparent; + } + + .order-detail-page__tracking { + display: grid; + grid-template-columns: minmax(0, 1fr) 340px; + gap: 24px; + align-items: start; + } + + .order-detail-page__tracking > .status-hero { + grid-column: 1 / -1; + } + + .order-detail-page__tracking > .order-detail-back { + grid-column: 1 / -1; + } + + .order-detail-page__tracking > .tracking-card:first-of-type { + grid-column: 1; + } + + .order-detail-page__tracking > .tracking-summary { + grid-column: 2; + grid-row: 2 / span 2; + position: sticky; + top: 16px; + align-self: start; + } + + .order-detail-back { + display: inline-flex; + align-items: center; + gap: 6px; + margin-bottom: 20px; + padding: 0; + border: none; + background: none; + color: var(--color-primary); + font-family: inherit; + font-size: 0.875rem; + font-weight: 600; + cursor: pointer; + } + + /* Company select desktop */ + .company-select-page { + max-width: var(--content-max-width); + margin-inline: auto; + padding: 24px var(--page-padding-desktop); + background: transparent; + } + + /* Catalog desktop */ + .catalog-page { + background: transparent; + } + + .catalog-list { + grid-template-columns: repeat(3, minmax(0, 1fr)); + } + + /* Profile desktop */ + .profile-page { + background: transparent; + } + + .profile-hero { + border-radius: var(--radius-md); + margin-inline: 0; + } +} + +@media (min-width: 1200px) { + :root { + --page-padding: var(--page-padding-desktop); + } + + .page { + padding: 24px var(--page-padding-desktop) 32px; + } + + .orders-stats { + gap: 16px; + margin-bottom: 24px; + } + + .orders-page__desktop-head { + margin-bottom: 24px; + } + + .orders-toolbar { + margin-bottom: 20px; + } + + .catalog-list { + grid-template-columns: repeat(3, minmax(0, 1fr)); + } + + .product-list { + grid-template-columns: repeat(2, minmax(0, 1fr)); + } +} diff --git a/src/assets/styles/fonts.css b/src/assets/styles/fonts.css new file mode 100644 index 0000000..00e1d03 --- /dev/null +++ b/src/assets/styles/fonts.css @@ -0,0 +1,55 @@ +@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)_UltraLight.woff2') format('woff2'); + font-weight: 200; + 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)_Medium.woff2') format('woff2'); + font-weight: 600; + 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..58dcffa --- /dev/null +++ b/src/assets/styles/main.css @@ -0,0 +1,350 @@ +:root { + --color-primary: #17379f; + --color-primary-hover: #102b83; + --color-primary-soft: #eef3ff; + --color-primary-dark: #102b83; + --color-primary-light: #eef3ff; + --color-success: #159660; + --color-success-light: #eaf8f1; + --color-success-soft: #eaf8f1; + --color-warning: #f59e0b; + --color-warning-light: #fff6e5; + --color-danger: #dc3545; + --color-danger-light: #fee2e2; + --color-purple: #7c3aed; + --color-purple-light: #ede9fe; + --color-info: #17379f; + --color-info-light: #eef3ff; + --color-bg: #f6f7fb; + --color-page-background: #f6f7fb; + --color-shell-bg: #eef0f5; + --color-surface: #ffffff; + --color-border: #e5e8ef; + --color-text: #182033; + --color-text-primary: #182033; + --color-text-muted: #667085; + --color-text-secondary: #667085; + --color-tab-inactive-bg: #f1f5f9; + --color-tab-inactive-text: #64748b; + --color-summary-bg: #f1f5f9; + --radius-sm: 8px; + --radius-md: 12px; + --radius-lg: 16px; + --shadow-sm: 0 1px 2px rgba(16, 24, 40, 0.04); + --shadow-md: 0 4px 16px rgba(16, 24, 40, 0.06); + --shadow-card: 0 1px 2px rgba(16, 24, 40, 0.04), 0 4px 16px rgba(16, 24, 40, 0.04); + --shadow-frame: 0 8px 32px rgba(15, 23, 42, 0.1); + --nav-height: 64px; + --page-padding: 16px; + --page-padding-tablet: 20px; + --page-padding-desktop: 28px; + --page-gap: 12px; + --content-max-width: 1360px; + --form-max-width: 520px; + --auth-form-max-width: 440px; + --summary-panel-width: 320px; + --sidebar-width: 240px; + --sidebar-width-compact: 72px; + --header-height: 70px; + --app-shell-breakpoint: 768px; + --font-family: 'IRANSans', 'Tahoma', sans-serif; + --btn-height: 48px; + --desktop-breakpoint: 1200px; +} + +*, +*::before, +*::after { + box-sizing: border-box; +} + +html { + font-size: 16px; + -webkit-text-size-adjust: 100%; + overflow: hidden; + height: 100%; +} + +body { + margin: 0; + font-family: var(--font-family); + background: var(--color-shell-bg); + color: var(--color-text); + line-height: 1.5; + direction: rtl; + overflow: hidden; + height: 100%; +} + +#app { + height: 100dvh; + overflow: hidden; +} + +* { + scrollbar-width: none; + -ms-overflow-style: none; +} + +*::-webkit-scrollbar { + width: 0; + height: 0; + display: none; +} + +a { + color: var(--color-primary); + text-decoration: none; +} + +button, +input, +select, +textarea { + font-family: inherit; +} + +input[type='number']::-webkit-inner-spin-button, +input[type='number']::-webkit-outer-spin-button { + -webkit-appearance: none; + margin: 0; +} + +input[type='number'] { + -moz-appearance: textfield; +} + +.page { + flex: 1; + display: flex; + flex-direction: column; + min-height: 0; + overflow: hidden; + padding: 12px var(--page-padding) 0; + background: #ffffff; +} + +.page__scroll { + flex: 1; + min-height: 0; + overflow-y: auto; + overscroll-behavior: contain; + -webkit-overflow-scrolling: touch; +} + +.page__scroll--with-nav { + padding-bottom: 12px; +} + +.page-title { + font-size: 1.25rem; + font-weight: 700; + line-height: 1.35; + margin: 0 0 4px; + color: var(--color-text); +} + +.page-subtitle { + font-size: 0.875rem; + color: var(--color-text-muted); + margin: 0; + line-height: 1.5; +} + +.card { + background: var(--color-surface); + border-radius: var(--radius-md); + border: 1px solid var(--color-border); + padding: 16px; + box-shadow: var(--shadow-sm); +} + +.card + .card { + margin-top: var(--page-gap); +} + +.alert { + padding: 12px 14px; + border-radius: var(--radius-sm); + font-size: 0.875rem; + line-height: 1.5; +} + +.alert-info { + background: var(--color-primary-light); + color: var(--color-primary); + border: 1px solid #cbd5e1; +} + +.alert-warning { + background: var(--color-warning-light); + color: #9a3412; + border: 1px solid #fed7aa; +} + +.alert-success { + background: var(--color-success-light); + color: #155724; + border: 1px solid #c3e6cb; +} + +.alert-danger { + background: var(--color-danger-light); + color: #991b1b; + border: 1px solid #fecaca; +} + +.form-group { + margin-bottom: 16px; +} + +.form-label { + display: block; + font-size: 0.875rem; + font-weight: 600; + margin-bottom: 6px; + color: var(--color-text); +} + +.form-hint { + font-size: 0.75rem; + color: var(--color-text-muted); + margin-top: 4px; +} + +.divider { + height: 1px; + background: var(--color-border); + margin: 16px 0; +} + +.text-muted { + color: var(--color-text-muted); +} + +.text-sm { + font-size: 0.875rem; +} + +.text-center { + text-align: center; +} + +.mt-2 { + margin-top: 8px; +} + +.mt-4 { + margin-top: 16px; +} + +.mb-4 { + margin-bottom: 16px; +} + +.flex-between { + display: flex; + justify-content: space-between; + align-items: center; + gap: 8px; +} + +.sticky-footer { + position: fixed; + bottom: var(--nav-height); + inset-inline: 0; + width: 100%; + max-width: 100%; + z-index: 50; + padding-inline: var(--page-padding); + box-sizing: border-box; +} + +.sticky-footer-inner { + max-width: 100%; +} + +.no-nav .page { + padding-bottom: 0; +} + +.no-nav .sticky-footer { + bottom: 0; +} + +.dialog-overlay { + position: fixed; + inset: 0; + background: rgba(15, 23, 42, 0.4); + display: flex; + align-items: center; + justify-content: center; + padding: 24px; + z-index: 200; +} + +.dialog-overlay .dialog { + width: 100%; + max-width: 400px; +} + +.dialog-actions { + display: flex; + flex-direction: column; + gap: 8px; + margin-top: 16px; +} + +/* Responsive visibility */ +.mobile-only, +.mobile-block { + display: block; +} + +.desktop-only { + display: none !important; +} + +.mobile-hidden { + display: block; +} + +.desktop-hidden { + display: none !important; +} + +@media (min-width: 768px) { + .mobile-only, + .mobile-block { + display: none !important; + } + + .desktop-only { + display: block !important; + } + + .mobile-hidden { + display: none !important; + } + + .desktop-hidden { + display: block !important; + } + + .desktop-only-flex { + display: flex !important; + } + + .desktop-only-grid { + display: grid !important; + } + + .page { + padding: 0; + background: transparent; + } + + .page__scroll--with-nav { + padding-bottom: 0; + } +} diff --git a/src/assets/styles/responsive.css b/src/assets/styles/responsive.css new file mode 100644 index 0000000..943f541 --- /dev/null +++ b/src/assets/styles/responsive.css @@ -0,0 +1,362 @@ +/* Responsive breakpoints: + Mobile: < 768px + Tablet: 768px – 1199px + Desktop: >= 1200px + Large desktop: >= 1440px +*/ + +@media (min-width: 768px) { + :root { + --page-padding: var(--page-padding-tablet); + --nav-height: 0px; + } + + html, + body { + overflow: auto; + height: auto; + } + + #app { + height: 100dvh; + overflow: hidden; + } + + * { + scrollbar-width: thin; + scrollbar-color: #cbd5e1 transparent; + } + + *::-webkit-scrollbar { + width: 6px; + height: 6px; + display: block; + } + + *::-webkit-scrollbar-thumb { + background: #cbd5e1; + border-radius: 999px; + } + + .sticky-footer { + bottom: 0; + max-width: min(var(--content-max-width), calc(100% - 2 * var(--page-padding))); + } + + .no-nav .sticky-footer { + bottom: 0; + } + + /* Auth pages */ + .auth-page__scroll { + display: flex; + flex-direction: column; + align-items: center; + padding-top: 48px; + padding-bottom: 48px; + } + + .auth-header, + .auth-page .card, + .auth-footer { + width: 100%; + max-width: var(--form-max-width); + } + + /* Company selection */ + .company-select-page__list { + display: grid; + grid-template-columns: repeat(2, minmax(0, 1fr)); + gap: 20px; + align-content: start; + } + + .company-brand-card { + min-height: 220px; + } + + /* Catalog & product grids */ + .catalog-list { + display: grid; + grid-template-columns: repeat(2, minmax(0, 1fr)); + gap: var(--page-gap); + } + + .product-list { + display: grid; + grid-template-columns: repeat(2, minmax(0, 1fr)); + gap: var(--page-gap); + align-items: start; + } + + .product-page__scroll { + padding-bottom: 88px; + } + + /* Settlement & check mode */ + .settlement-options, + .mode-options { + display: grid; + grid-template-columns: repeat(2, minmax(0, 1fr)); + gap: 20px; + max-width: 720px; + margin-inline: auto; + } + + /* Company page container */ + .company-select-page { + max-width: var(--content-max-width); + margin-inline: auto; + width: 100%; + padding-inline: var(--page-padding); + } + + .company-select-page__header { + max-width: 560px; + margin-inline: auto; + } + + /* Catalog & orders page containers */ + .catalog-page .page__scroll, + .orders-page__scroll, + .product-page .product-page__scroll { + max-width: var(--content-max-width); + margin-inline: auto; + width: 100%; + } + + /* Cart two-column layout */ + .cart-page { + max-width: var(--content-max-width); + margin-inline: auto; + width: 100%; + padding-inline: var(--page-padding); + } + + .cart-page__body { + display: grid; + grid-template-columns: minmax(0, 1fr) minmax(260px, 300px); + grid-template-rows: auto 1fr; + gap: 16px 20px; + align-items: start; + } + + .cart-page__company { + grid-column: 1 / -1; + font-size: 0.9375rem; + margin-bottom: 0; + } + + .cart-page__scroll { + grid-column: 1; + max-height: none; + overflow: visible; + } + + .cart-page__footer { + grid-column: 2; + grid-row: 1 / -1; + position: sticky; + top: 16px; + margin: 0; + padding: 16px; + border-top: none; + box-shadow: var(--shadow-md); + border-radius: var(--radius-md); + border: 1px solid var(--color-border); + } + + .cart-table__head { + position: static; + } + + /* Check list */ + .check-list-page { + max-width: var(--content-max-width); + margin-inline: auto; + width: 100%; + padding-inline: var(--page-padding); + } + + .check-list-page__scroll { + max-width: var(--content-max-width); + margin-inline: auto; + width: 100%; + } + + .summary-cards { + gap: 16px; + } + + .checks-list { + display: grid; + grid-template-columns: repeat(2, minmax(0, 1fr)); + gap: 12px; + align-items: start; + } + + .rass-panel { + max-width: 480px; + margin-inline: auto; + } + + /* Profile */ + .profile-page__scroll { + max-width: var(--content-max-width); + margin-inline: auto; + width: 100%; + } + + .profile-menu { + display: grid; + grid-template-columns: repeat(2, minmax(0, 1fr)); + gap: 12px; + } + + .profile-menu__item { + border-radius: var(--radius-md); + border: 1px solid var(--color-border); + background: var(--color-surface); + box-shadow: var(--shadow-sm); + } + + /* Order detail & tracking */ + .order-detail-page__body { + max-width: var(--content-max-width); + margin-inline: auto; + width: 100%; + } + + .order-detail-page__tracking { + display: grid; + grid-template-columns: minmax(0, 1fr) minmax(280px, 340px); + gap: 20px; + align-items: start; + } + + .order-detail-page__tracking > .status-hero { + grid-column: 1 / -1; + } + + .order-detail-page__tracking > .tracking-card { + grid-column: 1; + } + + .order-detail-page__tracking > .tracking-summary { + grid-column: 2; + grid-row: 2; + position: sticky; + top: 16px; + align-self: start; + } + + .order-detail-page__footer { + max-width: var(--content-max-width); + margin-inline: auto; + width: 100%; + padding-inline: var(--page-padding); + } + + /* Checkout forms */ + .checkout-page__scroll, + .cash-page__scroll, + .settlement-page__scroll, + .check-mode-page__scroll { + max-width: var(--form-max-width); + margin-inline: auto; + width: 100%; + } + + /* Cash settlement desktop */ + .cash-page { + max-width: var(--content-max-width); + margin-inline: auto; + width: 100%; + } + + .cash-page__footer { + max-width: var(--form-max-width); + margin-inline: auto; + width: 100%; + display: grid; + grid-template-columns: 1fr 1fr; + gap: 12px; + border-top: none; + box-shadow: none; + padding-top: 16px; + } + + .accounts-panel { + display: grid; + grid-template-columns: repeat(2, minmax(0, 1fr)); + gap: 12px; + } + + .bank-card + .bank-card { + margin-top: 0; + } + + .cash-page__submit { + margin-top: 0; + } + + .order-info-card { + max-width: 520px; + margin-inline: auto; + } + + /* Profile edit */ + .profile-edit-page .page__scroll { + max-width: var(--form-max-width); + margin-inline: auto; + width: 100%; + } + + /* Success page */ + .success-page__scroll { + display: flex; + flex-direction: column; + align-items: center; + max-width: var(--form-max-width); + margin-inline: auto; + width: 100%; + } + + /* Dialogs */ + .dialog-overlay .dialog, + .dialog-overlay .card.dialog { + max-width: 480px; + width: 100%; + } + + .dialog-actions { + flex-direction: row; + justify-content: flex-end; + } +} + +@media (min-width: 1200px) { + :root { + --page-padding: var(--page-padding-desktop); + } + + .catalog-list { + grid-template-columns: repeat(3, minmax(0, 1fr)); + } + + .checks-list { + grid-template-columns: repeat(2, minmax(0, 1fr)); + } +} + +@media (min-width: 1440px) { + .product-list { + grid-template-columns: repeat(3, minmax(0, 1fr)); + } +} + +@media (min-width: 1920px) { + :root { + --content-max-width: 1120px; + } +} diff --git a/src/components/icons/IconBell.vue b/src/components/icons/IconBell.vue new file mode 100644 index 0000000..ddd7c1d --- /dev/null +++ b/src/components/icons/IconBell.vue @@ -0,0 +1,20 @@ + + + diff --git a/src/components/icons/IconBolt.vue b/src/components/icons/IconBolt.vue new file mode 100644 index 0000000..c445861 --- /dev/null +++ b/src/components/icons/IconBolt.vue @@ -0,0 +1,14 @@ + + + diff --git a/src/components/icons/IconBuilding.vue b/src/components/icons/IconBuilding.vue new file mode 100644 index 0000000..4108e66 --- /dev/null +++ b/src/components/icons/IconBuilding.vue @@ -0,0 +1,21 @@ + + + diff --git a/src/components/icons/IconCart.vue b/src/components/icons/IconCart.vue new file mode 100644 index 0000000..933ac0d --- /dev/null +++ b/src/components/icons/IconCart.vue @@ -0,0 +1,30 @@ + + + diff --git a/src/components/icons/IconCash.vue b/src/components/icons/IconCash.vue new file mode 100644 index 0000000..92b8c12 --- /dev/null +++ b/src/components/icons/IconCash.vue @@ -0,0 +1,26 @@ + + + diff --git a/src/components/icons/IconCashSettlement.vue b/src/components/icons/IconCashSettlement.vue new file mode 100644 index 0000000..5dc53cf --- /dev/null +++ b/src/components/icons/IconCashSettlement.vue @@ -0,0 +1,20 @@ + + + diff --git a/src/components/icons/IconCatalog.vue b/src/components/icons/IconCatalog.vue new file mode 100644 index 0000000..5bc74e6 --- /dev/null +++ b/src/components/icons/IconCatalog.vue @@ -0,0 +1,19 @@ + + + diff --git a/src/components/icons/IconCheckBook.vue b/src/components/icons/IconCheckBook.vue new file mode 100644 index 0000000..3dfd43d --- /dev/null +++ b/src/components/icons/IconCheckBook.vue @@ -0,0 +1,19 @@ + + + diff --git a/src/components/icons/IconCheckCircleOutline.vue b/src/components/icons/IconCheckCircleOutline.vue new file mode 100644 index 0000000..a9bad91 --- /dev/null +++ b/src/components/icons/IconCheckCircleOutline.vue @@ -0,0 +1,29 @@ + + + diff --git a/src/components/icons/IconChevronBack.vue b/src/components/icons/IconChevronBack.vue new file mode 100644 index 0000000..45c145a --- /dev/null +++ b/src/components/icons/IconChevronBack.vue @@ -0,0 +1,28 @@ + + + diff --git a/src/components/icons/IconChevronLeft.vue b/src/components/icons/IconChevronLeft.vue new file mode 100644 index 0000000..521e9c3 --- /dev/null +++ b/src/components/icons/IconChevronLeft.vue @@ -0,0 +1,28 @@ + + + diff --git a/src/components/icons/IconClipboardEmpty.vue b/src/components/icons/IconClipboardEmpty.vue new file mode 100644 index 0000000..b605030 --- /dev/null +++ b/src/components/icons/IconClipboardEmpty.vue @@ -0,0 +1,75 @@ + + + + + diff --git a/src/components/icons/IconDiamond.vue b/src/components/icons/IconDiamond.vue new file mode 100644 index 0000000..5ccd3db --- /dev/null +++ b/src/components/icons/IconDiamond.vue @@ -0,0 +1,19 @@ + + + diff --git a/src/components/icons/IconEditPen.vue b/src/components/icons/IconEditPen.vue new file mode 100644 index 0000000..bda5184 --- /dev/null +++ b/src/components/icons/IconEditPen.vue @@ -0,0 +1,28 @@ + + + diff --git a/src/components/icons/IconFamBaftLogo.vue b/src/components/icons/IconFamBaftLogo.vue new file mode 100644 index 0000000..60b0f1a --- /dev/null +++ b/src/components/icons/IconFamBaftLogo.vue @@ -0,0 +1,17 @@ + + + diff --git a/src/components/icons/IconFeather.vue b/src/components/icons/IconFeather.vue new file mode 100644 index 0000000..9e2b591 --- /dev/null +++ b/src/components/icons/IconFeather.vue @@ -0,0 +1,26 @@ + + + diff --git a/src/components/icons/IconFilter.vue b/src/components/icons/IconFilter.vue new file mode 100644 index 0000000..6f76880 --- /dev/null +++ b/src/components/icons/IconFilter.vue @@ -0,0 +1,27 @@ + + + diff --git a/src/components/icons/IconHeadset.vue b/src/components/icons/IconHeadset.vue new file mode 100644 index 0000000..50d320b --- /dev/null +++ b/src/components/icons/IconHeadset.vue @@ -0,0 +1,16 @@ + + + diff --git a/src/components/icons/IconHome.vue b/src/components/icons/IconHome.vue new file mode 100644 index 0000000..563ddb4 --- /dev/null +++ b/src/components/icons/IconHome.vue @@ -0,0 +1,27 @@ + + + diff --git a/src/components/icons/IconHourglass.vue b/src/components/icons/IconHourglass.vue new file mode 100644 index 0000000..c74e8bf --- /dev/null +++ b/src/components/icons/IconHourglass.vue @@ -0,0 +1,28 @@ + + + diff --git a/src/components/icons/IconIdCard.vue b/src/components/icons/IconIdCard.vue new file mode 100644 index 0000000..4cd9ac0 --- /dev/null +++ b/src/components/icons/IconIdCard.vue @@ -0,0 +1,11 @@ + + + diff --git a/src/components/icons/IconLayoutGrid.vue b/src/components/icons/IconLayoutGrid.vue new file mode 100644 index 0000000..5ef52e1 --- /dev/null +++ b/src/components/icons/IconLayoutGrid.vue @@ -0,0 +1,25 @@ + + + diff --git a/src/components/icons/IconLightbulb.vue b/src/components/icons/IconLightbulb.vue new file mode 100644 index 0000000..dcf03d8 --- /dev/null +++ b/src/components/icons/IconLightbulb.vue @@ -0,0 +1,26 @@ + + + diff --git a/src/components/icons/IconLock.vue b/src/components/icons/IconLock.vue new file mode 100644 index 0000000..08330e1 --- /dev/null +++ b/src/components/icons/IconLock.vue @@ -0,0 +1,15 @@ + + + diff --git a/src/components/icons/IconMail.vue b/src/components/icons/IconMail.vue new file mode 100644 index 0000000..6a51a63 --- /dev/null +++ b/src/components/icons/IconMail.vue @@ -0,0 +1,10 @@ + + + diff --git a/src/components/icons/IconMapPin.vue b/src/components/icons/IconMapPin.vue new file mode 100644 index 0000000..ed3266b --- /dev/null +++ b/src/components/icons/IconMapPin.vue @@ -0,0 +1,15 @@ + + + diff --git a/src/components/icons/IconMoreVertical.vue b/src/components/icons/IconMoreVertical.vue new file mode 100644 index 0000000..1342aea --- /dev/null +++ b/src/components/icons/IconMoreVertical.vue @@ -0,0 +1,23 @@ + + + diff --git a/src/components/icons/IconOrders.vue b/src/components/icons/IconOrders.vue new file mode 100644 index 0000000..ae85291 --- /dev/null +++ b/src/components/icons/IconOrders.vue @@ -0,0 +1,41 @@ + + + diff --git a/src/components/icons/IconParLogo.vue b/src/components/icons/IconParLogo.vue new file mode 100644 index 0000000..652d95f --- /dev/null +++ b/src/components/icons/IconParLogo.vue @@ -0,0 +1,26 @@ + + + diff --git a/src/components/icons/IconPhone.vue b/src/components/icons/IconPhone.vue new file mode 100644 index 0000000..6106975 --- /dev/null +++ b/src/components/icons/IconPhone.vue @@ -0,0 +1,14 @@ + + + diff --git a/src/components/icons/IconProfile.vue b/src/components/icons/IconProfile.vue new file mode 100644 index 0000000..53e6688 --- /dev/null +++ b/src/components/icons/IconProfile.vue @@ -0,0 +1,28 @@ + + + diff --git a/src/components/icons/IconProgressClock.vue b/src/components/icons/IconProgressClock.vue new file mode 100644 index 0000000..b826761 --- /dev/null +++ b/src/components/icons/IconProgressClock.vue @@ -0,0 +1,29 @@ + + + diff --git a/src/components/icons/IconSearch.vue b/src/components/icons/IconSearch.vue new file mode 100644 index 0000000..a24a679 --- /dev/null +++ b/src/components/icons/IconSearch.vue @@ -0,0 +1,20 @@ + + + diff --git a/src/components/icons/IconSettings.vue b/src/components/icons/IconSettings.vue new file mode 100644 index 0000000..406b0a3 --- /dev/null +++ b/src/components/icons/IconSettings.vue @@ -0,0 +1,15 @@ + + + diff --git a/src/components/icons/IconShoppingBag.vue b/src/components/icons/IconShoppingBag.vue new file mode 100644 index 0000000..1950982 --- /dev/null +++ b/src/components/icons/IconShoppingBag.vue @@ -0,0 +1,20 @@ + + + diff --git a/src/components/icons/IconSuccessCircle.vue b/src/components/icons/IconSuccessCircle.vue new file mode 100644 index 0000000..b7af4c7 --- /dev/null +++ b/src/components/icons/IconSuccessCircle.vue @@ -0,0 +1,17 @@ + + + diff --git a/src/components/icons/IconTrash.vue b/src/components/icons/IconTrash.vue new file mode 100644 index 0000000..a91b068 --- /dev/null +++ b/src/components/icons/IconTrash.vue @@ -0,0 +1,48 @@ + + + diff --git a/src/components/icons/IconVerified.vue b/src/components/icons/IconVerified.vue new file mode 100644 index 0000000..504ade9 --- /dev/null +++ b/src/components/icons/IconVerified.vue @@ -0,0 +1,16 @@ + + + diff --git a/src/components/layout/AppLayout.vue b/src/components/layout/AppLayout.vue new file mode 100644 index 0000000..16f8f55 --- /dev/null +++ b/src/components/layout/AppLayout.vue @@ -0,0 +1,9 @@ + + + diff --git a/src/components/layout/BottomNav.vue b/src/components/layout/BottomNav.vue new file mode 100644 index 0000000..36181bd --- /dev/null +++ b/src/components/layout/BottomNav.vue @@ -0,0 +1,108 @@ + + + + + diff --git a/src/components/layout/CheckoutStepper.vue b/src/components/layout/CheckoutStepper.vue new file mode 100644 index 0000000..eb96b1d --- /dev/null +++ b/src/components/layout/CheckoutStepper.vue @@ -0,0 +1,141 @@ + + + + + diff --git a/src/components/layout/DesktopHeader.vue b/src/components/layout/DesktopHeader.vue new file mode 100644 index 0000000..4d5a47b --- /dev/null +++ b/src/components/layout/DesktopHeader.vue @@ -0,0 +1,292 @@ + + + + + diff --git a/src/components/layout/DesktopSidebar.vue b/src/components/layout/DesktopSidebar.vue new file mode 100644 index 0000000..f9ac060 --- /dev/null +++ b/src/components/layout/DesktopSidebar.vue @@ -0,0 +1,296 @@ + + + + + diff --git a/src/components/layout/PageHeader.vue b/src/components/layout/PageHeader.vue new file mode 100644 index 0000000..aa3dca6 --- /dev/null +++ b/src/components/layout/PageHeader.vue @@ -0,0 +1,148 @@ + + + + + diff --git a/src/components/orders/OrderStatusHero.vue b/src/components/orders/OrderStatusHero.vue new file mode 100644 index 0000000..79d4ac0 --- /dev/null +++ b/src/components/orders/OrderStatusHero.vue @@ -0,0 +1,76 @@ + + + + + diff --git a/src/components/orders/OrderTrackingSummary.vue b/src/components/orders/OrderTrackingSummary.vue new file mode 100644 index 0000000..d258271 --- /dev/null +++ b/src/components/orders/OrderTrackingSummary.vue @@ -0,0 +1,87 @@ + + + + + diff --git a/src/components/orders/OrderTrackingTimeline.vue b/src/components/orders/OrderTrackingTimeline.vue new file mode 100644 index 0000000..96f3f81 --- /dev/null +++ b/src/components/orders/OrderTrackingTimeline.vue @@ -0,0 +1,167 @@ + + + + + diff --git a/src/components/ui/BaseBadge.vue b/src/components/ui/BaseBadge.vue new file mode 100644 index 0000000..e1e8b49 --- /dev/null +++ b/src/components/ui/BaseBadge.vue @@ -0,0 +1,52 @@ + + + + + diff --git a/src/components/ui/BaseButton.vue b/src/components/ui/BaseButton.vue new file mode 100644 index 0000000..a656777 --- /dev/null +++ b/src/components/ui/BaseButton.vue @@ -0,0 +1,110 @@ + + + + + diff --git a/src/components/ui/BaseInput.vue b/src/components/ui/BaseInput.vue new file mode 100644 index 0000000..fea2b89 --- /dev/null +++ b/src/components/ui/BaseInput.vue @@ -0,0 +1,67 @@ + + + + + diff --git a/src/components/ui/CapacitySummary.vue b/src/components/ui/CapacitySummary.vue new file mode 100644 index 0000000..0232184 --- /dev/null +++ b/src/components/ui/CapacitySummary.vue @@ -0,0 +1,64 @@ + + + + + diff --git a/src/components/ui/CartMeterageFooter.vue b/src/components/ui/CartMeterageFooter.vue new file mode 100644 index 0000000..8110769 --- /dev/null +++ b/src/components/ui/CartMeterageFooter.vue @@ -0,0 +1,95 @@ + + + + + diff --git a/src/components/ui/CurrencyInput.vue b/src/components/ui/CurrencyInput.vue new file mode 100644 index 0000000..13d02db --- /dev/null +++ b/src/components/ui/CurrencyInput.vue @@ -0,0 +1,84 @@ + + + + + diff --git a/src/components/ui/EmptyState.vue b/src/components/ui/EmptyState.vue new file mode 100644 index 0000000..06583db --- /dev/null +++ b/src/components/ui/EmptyState.vue @@ -0,0 +1,52 @@ + + + + + diff --git a/src/components/ui/FilterTabs.vue b/src/components/ui/FilterTabs.vue new file mode 100644 index 0000000..861e38a --- /dev/null +++ b/src/components/ui/FilterTabs.vue @@ -0,0 +1,90 @@ + + + + + diff --git a/src/components/ui/FormErrorBanner.vue b/src/components/ui/FormErrorBanner.vue new file mode 100644 index 0000000..ad48720 --- /dev/null +++ b/src/components/ui/FormErrorBanner.vue @@ -0,0 +1,25 @@ + + + + + diff --git a/src/components/ui/MeterageBar.vue b/src/components/ui/MeterageBar.vue new file mode 100644 index 0000000..aa36bef --- /dev/null +++ b/src/components/ui/MeterageBar.vue @@ -0,0 +1,73 @@ + + + + + diff --git a/src/components/ui/PersianDateInput.vue b/src/components/ui/PersianDateInput.vue new file mode 100644 index 0000000..d999e12 --- /dev/null +++ b/src/components/ui/PersianDateInput.vue @@ -0,0 +1,328 @@ + + + + + diff --git a/src/components/ui/SearchField.vue b/src/components/ui/SearchField.vue new file mode 100644 index 0000000..9cddb1e --- /dev/null +++ b/src/components/ui/SearchField.vue @@ -0,0 +1,47 @@ + + + + + diff --git a/src/components/ui/StatusBadge.vue b/src/components/ui/StatusBadge.vue new file mode 100644 index 0000000..7d0c6c9 --- /dev/null +++ b/src/components/ui/StatusBadge.vue @@ -0,0 +1,17 @@ + + + diff --git a/src/composables/useCartPage.ts b/src/composables/useCartPage.ts new file mode 100644 index 0000000..17b2274 --- /dev/null +++ b/src/composables/useCartPage.ts @@ -0,0 +1,56 @@ +import { computed, ref, onMounted } from 'vue' +import { useRouter } from 'vue-router' +import { useCartStore } from '@/stores/cart' + +export function useCartPage() { + const router = useRouter() + const cartStore = useCartStore() + const showFullDialog = ref(false) + + const items = computed(() => cartStore.activeCart?.items ?? []) + const isEmpty = computed(() => items.value.length === 0) + const companyName = computed(() => cartStore.activeCart?.companyName ?? '') + + function removeItem(itemId: string) { + cartStore.removeItem(itemId) + } + + function proceedToCheckout() { + if (items.value.length === 0) return + if (cartStore.isFull) { + showFullDialog.value = true + return + } + router.push('/checkout/settlement') + } + + function proceedAnyway() { + showFullDialog.value = false + router.push('/checkout/settlement') + } + + function createNewInvoice() { + cartStore.createNewCartForSameCompany() + showFullDialog.value = false + const companyId = cartStore.activeCart?.companyId + if (companyId) { + router.push(`/companies/${companyId}/catalogs`) + } + } + + onMounted(() => { + cartStore.ensureActiveCartForCartPage() + }) + + return { + cartStore, + items, + isEmpty, + companyName, + showFullDialog, + removeItem, + proceedToCheckout, + proceedAnyway, + createNewInvoice, + } +} diff --git a/src/composables/useOrderList.ts b/src/composables/useOrderList.ts new file mode 100644 index 0000000..ddcbdcd --- /dev/null +++ b/src/composables/useOrderList.ts @@ -0,0 +1,155 @@ +import { computed, ref, watch } from 'vue' +import { useRouter } from 'vue-router' +import { useOrderStore } from '@/stores/order' +import { useAuthStore } from '@/stores/auth' +import { getCompanyById } from '@/data/mockData' +import type { Order } from '@/types' +import { + DELIVERED_STATUSES, + IN_PROGRESS_STATUSES, + REVIEW_STATUSES, + matchesDesktopOrderFilter, + matchesMobileOrderTab, + type DesktopOrderFilterId, +} from '@/utils/orderStatusGroups' + +const DESKTOP_PAGE_SIZE = 5 + +export function useOrderList() { + const router = useRouter() + const orderStore = useOrderStore() + const authStore = useAuthStore() + const currentPage = ref(1) + + const tab = computed({ + get: () => (router.currentRoute.value.query.tab as string) ?? 'all', + set: (v: string) => router.replace({ query: { ...router.currentRoute.value.query, tab: v } }), + }) + + const desktopFilter = computed({ + get: () => (router.currentRoute.value.query.filter as DesktopOrderFilterId) ?? 'all', + set: (v: DesktopOrderFilterId) => + router.replace({ + query: { ...router.currentRoute.value.query, filter: v === 'all' ? undefined : v }, + }), + }) + + const searchQuery = computed(() => (router.currentRoute.value.query.q as string) ?? '') + + const orders = computed(() => { + if (!authStore.user) return [] + return orderStore.userOrders(authStore.user.id) + }) + + const stats = computed(() => ({ + total: orders.value.length, + review: orders.value.filter((o) => REVIEW_STATUSES.includes(o.status)).length, + inProgress: orders.value.filter((o) => IN_PROGRESS_STATUSES.includes(o.status)).length, + done: orders.value.filter((o) => DELIVERED_STATUSES.includes(o.status)).length, + })) + + function matchesSearch(order: Order, q: string): boolean { + if (!q.trim()) return true + const needle = q.trim().toLowerCase() + return ( + order.orderNumber.toLowerCase().includes(needle) || + order.companyName.toLowerCase().includes(needle) + ) + } + + const filteredOrdersMobile = computed(() => + orders.value + .filter((o) => matchesSearch(o, searchQuery.value)) + .filter((o) => matchesMobileOrderTab(o.status, tab.value)), + ) + + const filteredOrdersDesktop = computed(() => + orders.value + .filter((o) => matchesSearch(o, searchQuery.value)) + .filter((o) => matchesDesktopOrderFilter(o.status, desktopFilter.value)), + ) + + const paginatedOrders = computed(() => { + const start = (currentPage.value - 1) * DESKTOP_PAGE_SIZE + return filteredOrdersDesktop.value.slice(start, start + DESKTOP_PAGE_SIZE) + }) + + const totalPages = computed(() => + Math.max(1, Math.ceil(filteredOrdersDesktop.value.length / DESKTOP_PAGE_SIZE)), + ) + + const paginationRange = computed(() => { + if (filteredOrdersDesktop.value.length === 0) return { start: 0, end: 0 } + const start = (currentPage.value - 1) * DESKTOP_PAGE_SIZE + 1 + const end = Math.min(currentPage.value * DESKTOP_PAGE_SIZE, filteredOrdersDesktop.value.length) + return { start, end } + }) + + const visiblePages = computed(() => { + const total = totalPages.value + const current = currentPage.value + if (total <= 7) return Array.from({ length: total }, (_, i) => i + 1) + + const pages: (number | 'ellipsis')[] = [1] + if (current > 3) pages.push('ellipsis') + + const rangeStart = Math.max(2, current - 1) + const rangeEnd = Math.min(total - 1, current + 1) + for (let p = rangeStart; p <= rangeEnd; p += 1) pages.push(p) + + if (current < total - 2) pages.push('ellipsis') + if (total > 1) pages.push(total) + + return pages + }) + + watch([filteredOrdersDesktop, desktopFilter, searchQuery], () => { + currentPage.value = 1 + }) + + function companySlug(order: Order) { + return getCompanyById(order.companyId)?.slug ?? 'par' + } + + function iconVariant(order: Order) { + if (DELIVERED_STATUSES.includes(order.status)) return 'success' + return companySlug(order) === 'fam-baft' ? 'fam-baft' : 'par' + } + + function goToOrder(id: string) { + router.push(`/orders/${id}`) + } + + function setPage(page: number) { + if (page < 1 || page > totalPages.value) return + currentPage.value = page + } + + function setDesktopFilter(filter: DesktopOrderFilterId) { + desktopFilter.value = desktopFilter.value === filter && filter !== 'all' ? 'all' : filter + } + + function viewStatFilter(filter: DesktopOrderFilterId) { + desktopFilter.value = filter + } + + return { + tab, + desktopFilter, + searchQuery, + stats, + filteredOrdersMobile, + filteredOrdersDesktop, + paginatedOrders, + totalPages, + paginationRange, + visiblePages, + currentPage, + companySlug, + iconVariant, + goToOrder, + setPage, + setDesktopFilter, + viewStatFilter, + } +} diff --git a/src/composables/useProductOrdering.ts b/src/composables/useProductOrdering.ts new file mode 100644 index 0000000..f436e23 --- /dev/null +++ b/src/composables/useProductOrdering.ts @@ -0,0 +1,94 @@ +import { ref, computed } from 'vue' +import { useRoute, useRouter } from 'vue-router' +import { useCatalogStore } from '@/stores/catalog' +import { useCartStore } from '@/stores/cart' + +export function useProductOrdering() { + const route = useRoute() + const router = useRouter() + const catalogStore = useCatalogStore() + const cartStore = useCartStore() + + const companyId = computed(() => route.params.companyId as string) + const catalogId = computed(() => route.params.catalogId as string) + const catalog = computed(() => catalogStore.getCatalog(catalogId.value)) + const company = computed(() => catalogStore.getCompany(companyId.value)) + + const colorFilter = ref('all') + const colors = computed(() => ['all', ...catalogStore.getUniqueColors(catalogId.value)]) + const colorLabels: Record = { all: 'همه' } + + const products = computed(() => + catalogStore.fetchProducts( + catalogId.value, + colorFilter.value === 'all' ? undefined : colorFilter.value, + ), + ) + + const meterages = ref>({}) + const errors = ref>({}) + const toast = ref('') + + function getMeterage(productId: string) { + return meterages.value[productId] ?? 0 + } + + function adjustMeterage(productId: string, delta: number, step: number) { + const current = getMeterage(productId) + meterages.value[productId] = Math.max(0, current + delta * step) + } + + function addProduct(productId: string) { + const product = catalogStore.getProduct(productId) + if (!product || !catalog.value) return + + const meterage = getMeterage(productId) + if (meterage <= 0) { + errors.value[productId] = 'متراژ را وارد کنید.' + return + } + + const result = cartStore.addItem(product, catalog.value.code, meterage) + if (result.success) { + errors.value[productId] = '' + toast.value = `${product.name} به سبد اضافه شد.` + setTimeout(() => { + toast.value = '' + }, 2000) + } else { + errors.value[productId] = result.message ?? 'خطا' + } + } + + function setMeterage(productId: string, value: number) { + meterages.value[productId] = Math.max(0, value) + } + + function goToCart() { + router.push('/cart') + } + + function goBack() { + router.push(`/companies/${companyId.value}/catalogs`) + } + + return { + companyId, + catalogId, + catalog, + company, + colorFilter, + colors, + colorLabels, + products, + meterages, + errors, + toast, + cartStore, + adjustMeterage, + setMeterage, + addProduct, + goToCart, + goBack, + } +} diff --git a/src/data/mockData.ts b/src/data/mockData.ts new file mode 100644 index 0000000..398da00 --- /dev/null +++ b/src/data/mockData.ts @@ -0,0 +1,248 @@ +import type { BankAccount, Catalog, Company, Product } from '@/types' + +export const companies: Company[] = [ + { + id: 'company-par', + name: 'شرکت پَر', + slug: 'par', + description: 'تولیدکننده پارچه‌های باکیفیت', + isActive: true, + displayOrder: 1, + maxMeteragePerInvoice: 5000, + cashInvoiceValidityHours: 8, + cashInvoiceValidUntilHour: 17, + }, + { + id: 'company-fam-baft', + name: 'فام‌بافت', + slug: 'fam-baft', + description: 'عرضه پارچه‌های تخصصی', + isActive: true, + displayOrder: 2, + maxMeteragePerInvoice: 5000, + cashInvoiceValidityHours: 8, + cashInvoiceValidUntilHour: 17, + }, +] + +export const bankAccounts: BankAccount[] = [ + { + id: 'ba-par-1', + companyId: 'company-par', + bankName: 'بانک ملی', + accountHolder: 'شرکت پَر', + accountNumber: '0123456789', + cardNumber: '6037-9912-3456-7890', + iban: 'IR120170000000012345678901', + isActive: true, + displayOrder: 1, + }, + { + id: 'ba-par-2', + companyId: 'company-par', + bankName: 'بانک صادرات', + accountHolder: 'شرکت پَر', + accountNumber: '9876543210', + cardNumber: '6037-6912-3456-7891', + iban: 'IR620190000000098765432101', + isActive: true, + displayOrder: 2, + }, + { + id: 'ba-fam-1', + companyId: 'company-fam-baft', + bankName: 'بانک ملت', + accountHolder: 'فام‌بافت', + accountNumber: '1122334455', + cardNumber: '6104-3378-9012-3456', + iban: 'IR450120000000011223344556', + isActive: true, + displayOrder: 1, + }, +] + +export const catalogs: Catalog[] = [ + { + id: 'cat-377', + companyId: 'company-par', + name: 'کالیته ۳۷۷', + code: '377', + displayOrder: 1, + isActive: true, + }, + { + id: 'cat-378', + companyId: 'company-par', + name: 'کالیته ۳۷۸', + code: '378', + displayOrder: 2, + isActive: true, + }, + { + id: 'cat-379', + companyId: 'company-par', + name: 'کالیته ۳۷۹', + code: '379', + displayOrder: 3, + isActive: true, + }, + { + id: 'cat-380', + companyId: 'company-par', + name: 'کالیته ۳۸۰', + code: '380', + displayOrder: 4, + isActive: true, + }, + { + id: 'cat-381', + companyId: 'company-par', + name: 'کالیته ۳۸۱', + code: '381', + displayOrder: 5, + isActive: true, + }, + { + id: 'cat-fam-401', + companyId: 'company-fam-baft', + name: 'کالیته ۴۰۱', + code: '401', + displayOrder: 1, + isActive: true, + }, + { + id: 'cat-fam-402', + companyId: 'company-fam-baft', + name: 'کالیته ۴۰۲', + code: '402', + displayOrder: 2, + isActive: true, + }, +] + +export const products: Product[] = [ + { + id: 'prod-377-blue', + companyId: 'company-par', + catalogId: 'cat-377', + name: 'پارچه آبی', + code: '377-BL', + color: 'آبی', + minMeterage: 30, + orderMultiplier: 10, + isActive: true, + stock: 10000, + }, + { + id: 'prod-377-black', + companyId: 'company-par', + catalogId: 'cat-377', + name: 'پارچه مشکی', + code: '377-BK', + color: 'مشکی', + minMeterage: 30, + orderMultiplier: 10, + isActive: true, + stock: 8000, + }, + { + id: 'prod-378-blue', + companyId: 'company-par', + catalogId: 'cat-378', + name: 'آبی', + code: '378-BL', + color: 'آبی', + minMeterage: 50, + orderMultiplier: 10, + isActive: true, + stock: 5000, + }, + { + id: 'prod-378-black', + companyId: 'company-par', + catalogId: 'cat-378', + name: 'مشکی', + code: '378-BK', + color: 'مشکی', + minMeterage: 50, + orderMultiplier: 10, + isActive: true, + stock: 5000, + }, + { + id: 'prod-378-blue-white', + companyId: 'company-par', + catalogId: 'cat-378', + name: 'آبی پشت سفید', + code: '378-BLW', + color: 'آبی پشت سفید', + minMeterage: 50, + orderMultiplier: 10, + isActive: true, + stock: 3000, + }, + { + id: 'prod-378-black-white', + companyId: 'company-par', + catalogId: 'cat-378', + name: 'مشکی پشت سفید', + code: '378-BKW', + color: 'مشکی پشت سفید', + minMeterage: 50, + orderMultiplier: 10, + isActive: true, + stock: 3000, + }, + { + id: 'prod-fam-401-1', + companyId: 'company-fam-baft', + catalogId: 'cat-fam-401', + name: 'پارچه مخمل', + code: '401-MV', + color: 'سرمه‌ای', + minMeterage: 40, + orderMultiplier: 10, + isActive: true, + stock: 6000, + }, + { + id: 'prod-fam-401-2', + companyId: 'company-fam-baft', + catalogId: 'cat-fam-401', + name: 'پارچه کجراه', + code: '401-KJ', + color: 'کرم', + minMeterage: 40, + orderMultiplier: 10, + isActive: true, + stock: 4000, + }, +] + +export function getCompanyById(id: string): Company | undefined { + return companies.find((c) => c.id === id) +} + +export function getCatalogsByCompany(companyId: string): Catalog[] { + return catalogs + .filter((c) => c.companyId === companyId && c.isActive) + .sort((a, b) => a.displayOrder - b.displayOrder) +} + +export function getProductsByCatalog(catalogId: string): Product[] { + return products.filter((p) => p.catalogId === catalogId && p.isActive) +} + +export function getBankAccountsByCompany(companyId: string): BankAccount[] { + return bankAccounts + .filter((b) => b.companyId === companyId && b.isActive) + .sort((a, b) => a.displayOrder - b.displayOrder) +} + +export function getCatalogById(id: string): Catalog | undefined { + return catalogs.find((c) => c.id === id) +} + +export function getProductById(id: string): Product | undefined { + return products.find((p) => p.id === id) +} diff --git a/src/layouts/DefaultLayout.vue b/src/layouts/DefaultLayout.vue new file mode 100644 index 0000000..98caa5a --- /dev/null +++ b/src/layouts/DefaultLayout.vue @@ -0,0 +1,61 @@ + + + diff --git a/src/main.ts b/src/main.ts new file mode 100644 index 0000000..adea8df --- /dev/null +++ b/src/main.ts @@ -0,0 +1,18 @@ +import { createApp } from 'vue' +import { createPinia } from 'pinia' + +import App from './App.vue' +import router from './router' +import './assets/styles/fonts.css' +import './assets/styles/main.css' +import './assets/styles/app-shell.css' +import './assets/styles/responsive.css' +import './assets/styles/desktop.css' +import './assets/styles/desktop-pages.css' + +const app = createApp(App) + +app.use(createPinia()) +app.use(router) + +app.mount('#app') diff --git a/src/router/index.ts b/src/router/index.ts new file mode 100644 index 0000000..71f89aa --- /dev/null +++ b/src/router/index.ts @@ -0,0 +1,135 @@ +import { createRouter, createWebHistory } from 'vue-router' +import { getCurrentUser } from '@/services/authService' + +const router = createRouter({ + history: createWebHistory(import.meta.env.BASE_URL), + routes: [ + { + path: '/login', + name: 'login', + component: () => import('@/views/auth/LoginView.vue'), + meta: { guest: true, hideNav: true }, + }, + { + path: '/register', + name: 'register', + component: () => import('@/views/auth/RegisterView.vue'), + meta: { guest: true, hideNav: true }, + }, + { + path: '/otp', + name: 'otp', + component: () => import('@/views/auth/OtpView.vue'), + meta: { guest: true, hideNav: true }, + }, + { + path: '/', + name: 'home', + component: () => import('@/views/companies/CompanySelectView.vue'), + meta: { requiresAuth: true }, + }, + { + path: '/companies/:companyId/catalogs', + name: 'catalogs', + component: () => import('@/views/catalogs/CatalogListView.vue'), + meta: { requiresAuth: true }, + }, + { + path: '/companies/:companyId/catalogs/:catalogId/products', + name: 'products', + component: () => import('@/views/products/ProductListView.vue'), + meta: { requiresAuth: true }, + }, + { + path: '/cart', + name: 'cart', + component: () => import('@/views/cart/CartView.vue'), + meta: { requiresAuth: true }, + }, + { + path: '/checkout/settlement', + name: 'settlement', + component: () => import('@/views/checkout/SettlementTypeView.vue'), + meta: { requiresAuth: true, hideNav: true }, + }, + { + path: '/checkout/cash', + name: 'cash-settlement', + component: () => import('@/views/checkout/CashSettlementView.vue'), + meta: { requiresAuth: true, hideNav: true }, + }, + { + path: '/checkout/check-mode', + name: 'check-mode', + component: () => import('@/views/checkout/CheckModeSelectView.vue'), + meta: { requiresAuth: true, hideNav: true }, + }, + { + path: '/checkout/check-form', + name: 'check-form', + component: () => import('@/views/checkout/CheckFormView.vue'), + meta: { requiresAuth: true, hideNav: true }, + }, + { + path: '/checkout/check-list', + name: 'check-list', + component: () => import('@/views/checkout/CheckListView.vue'), + meta: { requiresAuth: true, hideNav: true }, + }, + { + path: '/orders', + name: 'orders', + component: () => import('@/views/OrdersView.vue'), + meta: { requiresAuth: true }, + }, + { + path: '/orders/:id', + name: 'order-detail', + component: () => import('@/views/orders/OrderDetailView.vue'), + meta: { requiresAuth: true }, + }, + { + path: '/orders/:id/success', + name: 'order-success', + component: () => import('@/views/orders/OrderSuccessView.vue'), + meta: { requiresAuth: true, hideNav: true }, + }, + { + path: '/profile', + name: 'profile', + component: () => import('@/views/profile/ProfileView.vue'), + meta: { requiresAuth: true }, + }, + { + path: '/profile/edit', + name: 'profile-edit', + component: () => import('@/views/profile/ProfileEditView.vue'), + meta: { requiresAuth: true }, + }, + { + path: '/profile/checks', + name: 'profile-checks', + component: () => import('@/views/profile/ProfileChecksView.vue'), + meta: { requiresAuth: true }, + }, + ], + scrollBehavior() { + return { top: 0 } + }, +}) + +router.beforeEach((to) => { + const isAuthenticated = !!getCurrentUser() + + if (to.meta.requiresAuth && !isAuthenticated) { + return { name: 'login', query: { redirect: to.fullPath } } + } + + if (to.meta.guest && isAuthenticated) { + return { name: 'home' } + } + + return true +}) + +export default router diff --git a/src/services/authService.ts b/src/services/authService.ts new file mode 100644 index 0000000..1b59aa6 --- /dev/null +++ b/src/services/authService.ts @@ -0,0 +1,130 @@ +import { MOCK_OTP_CODE } from '@/utils/constants' +import { generateId, normalizePhone } from '@/utils/format' +import { getItem, setItem, STORAGE_KEYS } from './storage' +import type { User } from '@/types' + +interface PendingOtp { + phone: string + firstName?: string + lastName?: string + isRegister: boolean + code: string + expiresAt: string +} + +export function getUsers(): User[] { + return getItem(STORAGE_KEYS.users, []) +} + +function saveUsers(users: User[]): void { + setItem(STORAGE_KEYS.users, users) +} + +export function getSessionUserId(): string | null { + return getItem(STORAGE_KEYS.session, null) +} + +export function setSessionUserId(userId: string | null): void { + setItem(STORAGE_KEYS.session, userId) +} + +export function getCurrentUser(): User | null { + const id = getSessionUserId() + if (!id) return null + return getUsers().find((u) => u.id === id) ?? null +} + +export async function sendOtp( + phone: string, + options: { firstName?: string; lastName?: string; isRegister: boolean }, +): Promise<{ success: boolean; message: string }> { + const normalized = normalizePhone(phone) + if (!/^09\d{9}$/.test(normalized)) { + return { success: false, message: 'شماره موبایل معتبر نیست.' } + } + + if (options.isRegister) { + if (!options.firstName?.trim() || !options.lastName?.trim()) { + return { success: false, message: 'نام و نام خانوادگی الزامی است.' } + } + const exists = getUsers().some((u) => u.phone === normalized) + if (exists) { + return { success: false, message: 'این شماره قبلاً ثبت شده است. وارد شوید.' } + } + } else { + const exists = getUsers().some((u) => u.phone === normalized) + if (!exists) { + return { success: false, message: 'کاربری با این شماره یافت نشد. ثبت‌نام کنید.' } + } + } + + const pending: PendingOtp = { + phone: normalized, + firstName: options.firstName, + lastName: options.lastName, + isRegister: options.isRegister, + code: MOCK_OTP_CODE, + expiresAt: new Date(Date.now() + 5 * 60 * 1000).toISOString(), + } + setItem(STORAGE_KEYS.pendingOtp, pending) + + return { + success: true, + message: `کد تأیید ارسال شد. (نسخه آزمایشی: ${MOCK_OTP_CODE})`, + } +} + +export async function verifyOtp( + phone: string, + code: string, +): Promise<{ success: boolean; message: string; user?: User }> { + const pending = getItem(STORAGE_KEYS.pendingOtp, null) + const normalized = normalizePhone(phone) + + if (!pending || pending.phone !== normalized) { + return { success: false, message: 'ابتدا درخواست کد دهید.' } + } + if (new Date(pending.expiresAt) < new Date()) { + return { success: false, message: 'کد منقضی شده است. دوباره درخواست دهید.' } + } + if (code.trim() !== pending.code) { + return { success: false, message: 'کد تأیید نادرست است.' } + } + + let user: User + const users = getUsers() + + if (pending.isRegister) { + user = { + id: generateId(), + firstName: pending.firstName!, + lastName: pending.lastName!, + phone: normalized, + createdAt: new Date().toISOString(), + } + users.push(user) + saveUsers(users) + } else { + user = users.find((u) => u.phone === normalized)! + } + + setSessionUserId(user.id) + setItem(STORAGE_KEYS.pendingOtp, null) + return { success: true, message: 'ورود موفق.', user } +} + +export function logout(): void { + setSessionUserId(null) +} + +export function updateProfile( + userId: string, + data: Partial>, +): User | null { + const users = getUsers() + const index = users.findIndex((u) => u.id === userId) + if (index === -1) return null + users[index] = { ...users[index]!, ...data } + saveUsers(users) + return users[index]! +} diff --git a/src/services/storage.ts b/src/services/storage.ts new file mode 100644 index 0000000..2c4c4d2 --- /dev/null +++ b/src/services/storage.ts @@ -0,0 +1,26 @@ +export function getItem(key: string, fallback: T): T { + try { + const raw = localStorage.getItem(key) + if (!raw) return fallback + return JSON.parse(raw) as T + } catch { + return fallback + } +} + +export function setItem(key: string, value: T): void { + localStorage.setItem(key, JSON.stringify(value)) +} + +export function removeItem(key: string): void { + localStorage.removeItem(key) +} + +export const STORAGE_KEYS = { + users: 'ft_users', + session: 'ft_session', + carts: 'ft_carts', + activeCartId: 'ft_active_cart_id', + orders: 'ft_orders', + pendingOtp: 'ft_pending_otp', +} as const diff --git a/src/stores/auth.ts b/src/stores/auth.ts new file mode 100644 index 0000000..b97a43a --- /dev/null +++ b/src/stores/auth.ts @@ -0,0 +1,80 @@ +import { defineStore } from 'pinia' +import { ref, computed } from 'vue' +import type { User } from '@/types' +import { + getCurrentUser, + logout as authLogout, + sendOtp, + verifyOtp, + updateProfile as authUpdateProfile, +} from '@/services/authService' + +export const useAuthStore = defineStore('auth', () => { + const user = ref(getCurrentUser()) + const loading = ref(false) + const error = ref(null) + + const isAuthenticated = computed(() => !!user.value) + const fullName = computed(() => + user.value ? `${user.value.firstName} ${user.value.lastName}` : '', + ) + + function clearError() { + error.value = null + } + + async function requestOtp( + phone: string, + options: { firstName?: string; lastName?: string; isRegister: boolean }, + ) { + loading.value = true + error.value = null + const result = await sendOtp(phone, options) + loading.value = false + if (!result.success) error.value = result.message + return result + } + + async function confirmOtp(phone: string, code: string) { + loading.value = true + error.value = null + const result = await verifyOtp(phone, code) + loading.value = false + if (result.success && result.user) { + user.value = result.user + } else { + error.value = result.message + } + return result + } + + function logout() { + authLogout() + user.value = null + } + + function updateProfile(data: Partial>) { + if (!user.value) return null + const updated = authUpdateProfile(user.value.id, data) + if (updated) user.value = updated + return updated + } + + function hydrate() { + user.value = getCurrentUser() + } + + return { + user, + loading, + error, + isAuthenticated, + fullName, + clearError, + requestOtp, + confirmOtp, + logout, + updateProfile, + hydrate, + } +}) diff --git a/src/stores/cart.ts b/src/stores/cart.ts new file mode 100644 index 0000000..b99ae2e --- /dev/null +++ b/src/stores/cart.ts @@ -0,0 +1,260 @@ +import { defineStore } from 'pinia' +import { ref, computed } from 'vue' +import type { Cart, CartItem, Company, Product } from '@/types' +import { generateId } from '@/utils/format' +import { validateMeterage } from '@/utils/validation' +import { getItem, setItem, STORAGE_KEYS } from '@/services/storage' +import { getCompanyById } from '@/data/mockData' + +function loadCarts(): Cart[] { + return getItem(STORAGE_KEYS.carts, []) +} + +function saveCarts(carts: Cart[]) { + setItem(STORAGE_KEYS.carts, carts) +} + +function loadActiveCartId(): string | null { + return getItem(STORAGE_KEYS.activeCartId, null) +} + +function saveActiveCartId(id: string | null) { + setItem(STORAGE_KEYS.activeCartId, id) +} + +function getCartTotalMeterage(cart: Cart): number { + return cart.items.reduce((sum, item) => sum + item.meterage, 0) +} + +function findOpenCartForCompany(carts: Cart[], company: Company): Cart | undefined { + return carts.find( + (cart) => + cart.companyId === company.id && + getCartTotalMeterage(cart) < company.maxMeteragePerInvoice, + ) +} + +export const useCartStore = defineStore('cart', () => { + const carts = ref(loadCarts()) + const activeCartId = ref(loadActiveCartId()) + const selectedCompanyId = ref(null) + + const activeCart = computed(() => carts.value.find((c) => c.id === activeCartId.value) ?? null) + + const totalMeterage = computed( + () => activeCart.value?.items.reduce((sum, i) => sum + i.meterage, 0) ?? 0, + ) + + const itemCount = computed(() => activeCart.value?.items.length ?? 0) + + const maxMeterage = computed(() => { + if (!activeCart.value) return 5000 + const company = getCompanyById(activeCart.value.companyId) + return company?.maxMeteragePerInvoice ?? 5000 + }) + + const remainingCapacity = computed(() => Math.max(0, maxMeterage.value - totalMeterage.value)) + + const isFull = computed(() => totalMeterage.value >= maxMeterage.value) + + function persist() { + saveCarts(carts.value) + saveActiveCartId(activeCartId.value) + } + + function initCartForCompany(company: Company): Cart { + const existing = findOpenCartForCompany(carts.value, company) + if (existing) { + activeCartId.value = existing.id + selectedCompanyId.value = company.id + persist() + return existing + } + + const cart: Cart = { + id: generateId(), + companyId: company.id, + companyName: company.name, + items: [], + } + carts.value.push(cart) + activeCartId.value = cart.id + selectedCompanyId.value = company.id + persist() + return cart + } + + function switchCompanyWarning(currentCompanyName: string, newCompanyName: string): string { + return `سبد خرید فعلی مربوط به ${currentCompanyName} است. برای خرید از ${newCompanyName} باید سبد خرید جداگانه‌ای ایجاد کنید.` + } + + function canSwitchToCompany(companyId: string): { allowed: boolean; message?: string } { + if (!activeCart.value || activeCart.value.items.length === 0) { + return { allowed: true } + } + if (activeCart.value.companyId === companyId) { + return { allowed: true } + } + const newCompany = getCompanyById(companyId) + return { + allowed: false, + message: switchCompanyWarning(activeCart.value.companyName, newCompany?.name ?? ''), + } + } + + function createNewCartForSameCompany(): Cart | null { + if (!activeCart.value) return null + const company = getCompanyById(activeCart.value.companyId) + if (!company) return null + const cart: Cart = { + id: generateId(), + companyId: company.id, + companyName: company.name, + items: [], + } + carts.value.push(cart) + activeCartId.value = cart.id + persist() + return cart + } + + function addItem( + product: Product, + catalogCode: string, + meterage: number, + ): { success: boolean; message?: string } { + if (!activeCart.value) { + return { success: false, message: 'ابتدا شرکت را انتخاب کنید.' } + } + + if (activeCart.value.companyId !== product.companyId) { + const currentCompany = activeCart.value.companyName + const newCompany = getCompanyById(product.companyId) + return { + success: false, + message: switchCompanyWarning(currentCompany, newCompany?.name ?? ''), + } + } + + const validation = validateMeterage(meterage, product, totalMeterage.value, maxMeterage.value) + if (!validation.valid) { + return { success: false, message: validation.message } + } + + const existingIndex = activeCart.value.items.findIndex((i) => i.productId === product.id) + if (existingIndex >= 0) { + const existing = activeCart.value.items[existingIndex]! + const revalidation = validateMeterage( + meterage, + product, + totalMeterage.value, + maxMeterage.value, + existing.meterage, + ) + if (!revalidation.valid) { + return { success: false, message: revalidation.message } + } + existing.meterage = meterage + } else { + const item: CartItem = { + id: generateId(), + productId: product.id, + catalogCode, + productName: product.name, + productCode: product.code, + color: product.color, + meterage, + unitPrice: product.basePrice, + } + activeCart.value.items.push(item) + } + + persist() + return { success: true } + } + + function updateItemMeterage( + itemId: string, + meterage: number, + product: Product, + ): { success: boolean; message?: string } { + if (!activeCart.value) return { success: false, message: 'سبد خرید یافت نشد.' } + const item = activeCart.value.items.find((i) => i.id === itemId) + if (!item) return { success: false, message: 'آیتم یافت نشد.' } + + const validation = validateMeterage( + meterage, + product, + totalMeterage.value, + maxMeterage.value, + item.meterage, + ) + if (!validation.valid) { + return { success: false, message: validation.message } + } + + item.meterage = meterage + persist() + return { success: true } + } + + function removeItem(itemId: string) { + if (!activeCart.value) return + activeCart.value.items = activeCart.value.items.filter((i) => i.id !== itemId) + persist() + } + + function setNotes(notes: string) { + if (!activeCart.value) return + activeCart.value.notes = notes + persist() + } + + function clearActiveCart() { + if (!activeCart.value) return + activeCart.value.items = [] + activeCart.value.notes = undefined + persist() + } + + function ensureActiveCartForCartPage() { + if (activeCart.value?.items.length) return + + const cartWithItems = carts.value.find((cart) => cart.items.length > 0) + if (!cartWithItems) return + + activeCartId.value = cartWithItems.id + selectedCompanyId.value = cartWithItems.companyId + persist() + } + + function hydrate() { + carts.value = loadCarts() + activeCartId.value = loadActiveCartId() + if (activeCart.value) { + selectedCompanyId.value = activeCart.value.companyId + } + } + + return { + carts, + activeCartId, + selectedCompanyId, + activeCart, + totalMeterage, + itemCount, + maxMeterage, + remainingCapacity, + isFull, + initCartForCompany, + canSwitchToCompany, + createNewCartForSameCompany, + addItem, + updateItemMeterage, + removeItem, + setNotes, + clearActiveCart, + ensureActiveCartForCartPage, + hydrate, + } +}) diff --git a/src/stores/catalog.ts b/src/stores/catalog.ts new file mode 100644 index 0000000..8a732fe --- /dev/null +++ b/src/stores/catalog.ts @@ -0,0 +1,66 @@ +import { defineStore } from 'pinia' +import { ref } from 'vue' +import { + companies as mockCompanies, + getCatalogsByCompany, + getProductsByCatalog, + getCatalogById, + getProductById, + getCompanyById, +} from '@/data/mockData' +import type { Catalog, Company, Product } from '@/types' + +export const useCatalogStore = defineStore('catalog', () => { + const companies = ref(mockCompanies.filter((c) => c.isActive)) + const searchQuery = ref('') + + function getActiveCompanies(): Company[] { + return [...companies.value].sort((a, b) => a.displayOrder - b.displayOrder) + } + + function getCompany(id: string): Company | undefined { + return getCompanyById(id) + } + + function fetchCatalogs(companyId: string, query = ''): Catalog[] { + let list = getCatalogsByCompany(companyId) + if (query.trim()) { + const q = query.trim() + list = list.filter((c) => c.code.includes(q) || c.name.includes(q)) + } + return list + } + + function fetchProducts(catalogId: string, colorFilter?: string): Product[] { + let list = getProductsByCatalog(catalogId) + if (colorFilter && colorFilter !== 'all') { + list = list.filter((p) => p.color.includes(colorFilter)) + } + return list + } + + function getCatalog(id: string) { + return getCatalogById(id) + } + + function getProduct(id: string) { + return getProductById(id) + } + + function getUniqueColors(catalogId: string): string[] { + const products = getProductsByCatalog(catalogId) + return [...new Set(products.map((p) => p.color))] + } + + return { + companies, + searchQuery, + getActiveCompanies, + getCompany, + fetchCatalogs, + fetchProducts, + getCatalog, + getProduct, + getUniqueColors, + } +}) diff --git a/src/stores/order.ts b/src/stores/order.ts new file mode 100644 index 0000000..f781edc --- /dev/null +++ b/src/stores/order.ts @@ -0,0 +1,248 @@ +import { defineStore } from 'pinia' +import { ref, computed } from 'vue' +import type { + Cart, + CheckData, + CashPaymentReceipt, + Order, + OrderItem, + OrderStatus, + OrderStatusHistoryEntry, + SettlementType, + CheckRegistrationMode, +} from '@/types' +import { generateId, generateOrderNumber } from '@/utils/format' +import { calculateCheckRass } from '@/utils/checkRass' +import { getItem, setItem, STORAGE_KEYS } from '@/services/storage' +import { getCompanyById, getBankAccountsByCompany } from '@/data/mockData' + +function loadOrders(): Order[] { + return getItem(STORAGE_KEYS.orders, []) +} + +function saveOrders(orders: Order[]) { + setItem(STORAGE_KEYS.orders, orders) +} + +function createStatusEntry( + from: OrderStatus | null, + to: OrderStatus, + note?: string, +): OrderStatusHistoryEntry { + return { + id: generateId(), + fromStatus: from, + toStatus: to, + changedAt: new Date().toISOString(), + changedBy: 'customer', + note, + } +} + +function cartToOrderItems(cart: Cart): OrderItem[] { + return cart.items.map((item) => ({ + id: generateId(), + productId: item.productId, + catalogCode: item.catalogCode, + productName: item.productName, + productCode: item.productCode, + color: item.color, + requestedMeterage: item.meterage, + unitPrice: item.unitPrice, + notes: item.notes, + })) +} + +function computeCashExpiry(companyId: string): string { + const company = getCompanyById(companyId) + const now = new Date() + if (company?.cashInvoiceValidUntilHour) { + const expiry = new Date(now) + expiry.setHours(company.cashInvoiceValidUntilHour, 0, 0, 0) + if (expiry <= now) { + expiry.setDate(expiry.getDate() + 1) + } + return expiry.toISOString() + } + const hours = company?.cashInvoiceValidityHours ?? 8 + return new Date(now.getTime() + hours * 60 * 60 * 1000).toISOString() +} + +export const useOrderStore = defineStore('order', () => { + const orders = ref(loadOrders()) + const draftChecks = ref([]) + const draftSettlementType = ref(null) + const draftCheckMode = ref(null) + const checkoutCartId = ref(null) + + const userOrders = computed( + () => (userId: string) => + orders.value + .filter((o) => o.userId === userId) + .sort((a, b) => new Date(b.createdAt).getTime() - new Date(a.createdAt).getTime()), + ) + + function persist() { + saveOrders(orders.value) + } + + function getOrderById(id: string): Order | undefined { + return orders.value.find((o) => o.id === id) + } + + function startCheckout(cart: Cart, settlementType: SettlementType) { + checkoutCartId.value = cart.id + draftSettlementType.value = settlementType + draftChecks.value = [] + draftCheckMode.value = null + } + + function setCheckMode(mode: CheckRegistrationMode) { + draftCheckMode.value = mode + } + + function addDraftCheck(check: Omit) { + draftChecks.value.push({ ...check, id: generateId() }) + } + + function updateDraftCheck(id: string, data: Partial) { + const index = draftChecks.value.findIndex((c) => c.id === id) + if (index >= 0) { + draftChecks.value[index] = { ...draftChecks.value[index]!, ...data } + } + } + + function removeDraftCheck(id: string) { + draftChecks.value = draftChecks.value.filter((c) => c.id !== id) + } + + function getDraftRass(baseDate?: Date) { + return calculateCheckRass(draftChecks.value, baseDate ?? new Date()) + } + + function submitOrder( + userId: string, + cart: Cart, + settlementType: SettlementType, + checks?: CheckData[], + checkMode?: CheckRegistrationMode, + ): Order { + const items = cartToOrderItems(cart) + const totalMeterage = items.reduce((s, i) => s + i.requestedMeterage, 0) + const now = new Date().toISOString() + + let status: OrderStatus = 'awaiting_review' + let checkRassDays: number | undefined + let checkRassDate: string | undefined + let cashInvoiceExpiresAt: string | undefined + + if (settlementType === 'check' && checks && checks.length > 0) { + const rass = calculateCheckRass(checks, new Date()) + checkRassDays = rass.rassDays + checkRassDate = rass.rassDate ?? undefined + status = 'awaiting_review' + } + + if (settlementType === 'cash') { + cashInvoiceExpiresAt = computeCashExpiry(cart.companyId) + status = 'awaiting_review' + } + + const order: Order = { + id: generateId(), + orderNumber: generateOrderNumber(), + userId, + companyId: cart.companyId, + companyName: cart.companyName, + items, + totalMeterage, + settlementType, + checkMode, + checks: checks ? [...checks] : undefined, + checkRassDays, + checkRassDate, + status, + notes: cart.notes, + cashInvoiceExpiresAt, + statusHistory: [ + createStatusEntry(null, 'submitted', 'سفارش ثبت شد'), + createStatusEntry('submitted', status, 'ارسال برای بررسی مدیریت'), + ], + createdAt: now, + updatedAt: now, + } + + orders.value.unshift(order) + persist() + + draftChecks.value = [] + draftSettlementType.value = null + draftCheckMode.value = null + checkoutCartId.value = null + + return order + } + + function submitCashReceipt( + orderId: string, + receipt: Omit, + ) { + const order = getOrderById(orderId) + if (!order) return null + + const fullReceipt: CashPaymentReceipt = { + ...receipt, + id: generateId(), + submittedAt: new Date().toISOString(), + } + + const prevStatus = order.status + order.cashReceipt = fullReceipt + order.status = 'awaiting_cash_confirmation' + order.statusHistory.push( + createStatusEntry(prevStatus, 'awaiting_cash_confirmation', 'رسید پرداخت ثبت شد'), + ) + order.updatedAt = new Date().toISOString() + persist() + return order + } + + function updateOrderChecks(orderId: string, checks: CheckData[]) { + const order = getOrderById(orderId) + if (!order) return null + + const rass = calculateCheckRass(checks, new Date(order.createdAt)) + order.checks = checks + order.checkRassDays = rass.rassDays + order.checkRassDate = rass.rassDate ?? undefined + order.updatedAt = new Date().toISOString() + persist() + return order + } + + function hydrate() { + orders.value = loadOrders() + } + + return { + orders, + draftChecks, + draftSettlementType, + draftCheckMode, + checkoutCartId, + userOrders, + persist, + getOrderById, + startCheckout, + setCheckMode, + addDraftCheck, + updateDraftCheck, + removeDraftCheck, + getDraftRass, + submitOrder, + submitCashReceipt, + updateOrderChecks, + hydrate, + getBankAccountsForCompany: getBankAccountsByCompany, + } +}) diff --git a/src/types/index.ts b/src/types/index.ts new file mode 100644 index 0000000..976aed9 --- /dev/null +++ b/src/types/index.ts @@ -0,0 +1,204 @@ +export type SettlementType = 'cash' | 'check' +export type CheckRegistrationMode = 'full' | 'brief' + +export type OrderStatus = + | 'cart' + | 'awaiting_settlement' + | 'cash_in_progress' + | 'check_in_progress' + | 'submitted' + | 'awaiting_review' + | 'pricing' + | 'needs_correction' + | 'awaiting_settlement_fix' + | 'cash_invoice_issued' + | 'awaiting_cash_payment' + | 'cash_payment_submitted' + | 'awaiting_cash_confirmation' + | 'cash_confirmed' + | 'awaiting_check_review' + | 'check_needs_fix' + | 'check_rejected' + | 'checks_approved' + | 'final_approved' + | 'preparing' + | 'ready_to_ship' + | 'shipped' + | 'delivered' + | 'cancelled' + | 'rejected' + | 'expired' + +export interface User { + id: string + firstName: string + lastName: string + phone: string + nationalId?: string + createdAt: string +} + +export interface Company { + id: string + name: string + slug: string + logo?: string + description: string + isActive: boolean + displayOrder: number + maxMeteragePerInvoice: number + cashInvoiceValidityHours: number + cashInvoiceValidUntilHour?: number +} + +export interface BankAccount { + id: string + companyId: string + bankName: string + accountHolder: string + accountNumber: string + cardNumber: string + iban: string + isActive: boolean + displayOrder: number + notes?: string +} + +export interface Catalog { + id: string + companyId: string + name: string + code: string + description?: string + displayOrder: number + isActive: boolean +} + +export interface Product { + id: string + companyId: string + catalogId: string + name: string + code: string + color: string + description?: string + minMeterage: number + orderMultiplier: number + basePrice?: number + stock?: number + isActive: boolean +} + +export interface CartItem { + id: string + productId: string + catalogCode: string + productName: string + productCode: string + color: string + meterage: number + unitPrice?: number + notes?: string +} + +export interface Cart { + id: string + companyId: string + companyName: string + items: CartItem[] + notes?: string +} + +export interface CheckData { + id: string + amount: number + dueDate: string + sayadId?: string + checkNumber?: string + ownerNationalId?: string + ownerFirstName?: string + ownerLastName?: string + bankName?: string + branchName?: string + frontImage?: string + backImage?: string + notes?: string + mode: CheckRegistrationMode +} + +export interface CashPaymentReceipt { + id: string + amount: number + transferDate: string + transferTime: string + trackingNumber: string + destinationAccountId: string + receiptImage?: string + notes?: string + submittedAt: string +} + +export interface OrderItem { + id: string + productId: string + catalogCode: string + productName: string + productCode: string + color: string + requestedMeterage: number + confirmedMeterage?: number + unitPrice?: number + discount?: number + lineTotal?: number + notes?: string +} + +export interface OrderStatusHistoryEntry { + id: string + fromStatus: OrderStatus | null + toStatus: OrderStatus + changedAt: string + changedBy: string + note?: string + reason?: string +} + +export interface Order { + id: string + orderNumber: string + userId: string + companyId: string + companyName: string + items: OrderItem[] + totalMeterage: number + settlementType: SettlementType + checkMode?: CheckRegistrationMode + checks?: CheckData[] + checkRassDays?: number + checkRassDate?: string + status: OrderStatus + notes?: string + totalAmount?: number + shippingCost?: number + totalDiscount?: number + finalAmount?: number + cashInvoiceExpiresAt?: string + cashReceipt?: CashPaymentReceipt + statusHistory: OrderStatusHistoryEntry[] + createdAt: string + updatedAt: string +} + +export interface CheckRassResult { + checkCount: number + totalAmount: number + nearestDueDate: string | null + farthestDueDate: string | null + rassDays: number + rassDate: string | null +} + +export interface MeterageValidationResult { + valid: boolean + message?: string +} diff --git a/src/utils/checkRass.ts b/src/utils/checkRass.ts new file mode 100644 index 0000000..48a2c11 --- /dev/null +++ b/src/utils/checkRass.ts @@ -0,0 +1,58 @@ +import type { CheckData, CheckRassResult } from '@/types' +import { parseISODate } from '@/utils/jalali' + +export function calculateCheckRass( + checks: CheckData[], + baseDate: Date = new Date(), +): CheckRassResult { + if (checks.length === 0) { + return { + checkCount: 0, + totalAmount: 0, + nearestDueDate: null, + farthestDueDate: null, + rassDays: 0, + rassDate: null, + } + } + + const base = new Date(baseDate) + base.setHours(0, 0, 0, 0) + + let totalAmount = 0 + let weightedDays = 0 + const dueDates: Date[] = [] + + for (const check of checks) { + const due = parseISODate(check.dueDate) + due.setHours(0, 0, 0, 0) + dueDates.push(due) + const diffMs = due.getTime() - base.getTime() + const days = Math.max(0, Math.round(diffMs / (1000 * 60 * 60 * 24))) + totalAmount += check.amount + weightedDays += check.amount * days + } + + const rassDays = totalAmount > 0 ? Math.round(weightedDays / totalAmount) : 0 + const rassDate = new Date(base) + rassDate.setDate(rassDate.getDate() + rassDays) + + dueDates.sort((a, b) => a.getTime() - b.getTime()) + + return { + checkCount: checks.length, + totalAmount, + nearestDueDate: dueDates[0]?.toISOString() ?? null, + farthestDueDate: dueDates[dueDates.length - 1]?.toISOString() ?? null, + rassDays, + rassDate: rassDate.toISOString(), + } +} + +export function daysUntilDue(dueDate: string): number { + const base = new Date() + base.setHours(0, 0, 0, 0) + const due = parseISODate(dueDate) + due.setHours(0, 0, 0, 0) + return Math.max(0, Math.round((due.getTime() - base.getTime()) / (1000 * 60 * 60 * 24))) +} diff --git a/src/utils/constants.ts b/src/utils/constants.ts new file mode 100644 index 0000000..6b0a0cf --- /dev/null +++ b/src/utils/constants.ts @@ -0,0 +1,70 @@ +import type { OrderStatus } from '@/types' + +export const DEFAULT_MAX_METERAGE = 5000 +export const MOCK_OTP_CODE = '123456' + +export const ORDER_STATUS_LABELS: Record = { + cart: 'سبد خرید', + awaiting_settlement: 'در انتظار انتخاب روش تسویه', + cash_in_progress: 'در حال تکمیل اطلاعات نقدی', + check_in_progress: 'در حال ثبت چک‌ها', + submitted: 'سفارش ثبت‌شده', + awaiting_review: 'در انتظار بررسی', + pricing: 'در حال قیمت‌گذاری', + needs_correction: 'نیازمند اصلاح', + awaiting_settlement_fix: 'در انتظار اصلاح تسویه', + cash_invoice_issued: 'فاکتور نقدی صادرشده', + awaiting_cash_payment: 'در انتظار پرداخت نقدی', + cash_payment_submitted: 'پرداخت ثبت‌شده', + awaiting_cash_confirmation: 'در انتظار تأیید پرداخت', + cash_confirmed: 'پرداخت تأییدشده', + awaiting_check_review: 'در انتظار بررسی چک‌ها', + check_needs_fix: 'چک نیازمند اصلاح', + check_rejected: 'چک ردشده', + checks_approved: 'چک‌ها تایید شده', + final_approved: 'تأیید نهایی', + preparing: 'در حال آماده‌سازی', + ready_to_ship: 'آماده ارسال', + shipped: 'ارسال‌شده', + delivered: 'تحویل‌شده', + cancelled: 'لغوشده', + rejected: 'ردشده', + expired: 'منقضی‌شده', +} + +export const ORDER_TRACKING_STEPS: { status: OrderStatus; label: string }[] = [ + { status: 'submitted', label: 'ثبت سفارش' }, + { status: 'awaiting_review', label: 'در انتظار بررسی' }, + { status: 'pricing', label: 'قیمت‌گذاری توسط مدیریت' }, + { status: 'check_in_progress', label: 'ثبت چک' }, + { status: 'awaiting_check_review', label: 'در حال بررسی چک‌ها' }, + { status: 'checks_approved', label: 'چک‌ها تأیید شده' }, + { status: 'final_approved', label: 'تأیید نهایی' }, + { status: 'preparing', label: 'آماده‌سازی' }, + { status: 'ready_to_ship', label: 'آماده ارسال' }, + { status: 'shipped', label: 'ارسال شده' }, + { status: 'delivered', label: 'تحویل شده' }, +] + +export const STATUS_BADGE_VARIANT: Record< + string, + 'warning' | 'success' | 'info' | 'purple' | 'danger' | 'neutral' +> = { + awaiting_review: 'info', + awaiting_check_review: 'info', + pricing: 'warning', + preparing: 'warning', + ready_to_ship: 'warning', + check_in_progress: 'warning', + awaiting_cash_confirmation: 'warning', + checks_approved: 'success', + cash_confirmed: 'success', + final_approved: 'success', + shipped: 'purple', + delivered: 'success', + needs_correction: 'danger', + check_needs_fix: 'danger', + rejected: 'danger', + cancelled: 'neutral', + expired: 'danger', +} diff --git a/src/utils/formErrors.ts b/src/utils/formErrors.ts new file mode 100644 index 0000000..6c416b1 --- /dev/null +++ b/src/utils/formErrors.ts @@ -0,0 +1,14 @@ +export type FieldErrors = Record + +export function hasFieldErrors(errors: FieldErrors): boolean { + return Object.keys(errors).length > 0 +} + +export function clearFieldError(errors: FieldErrors, key: string): FieldErrors { + if (!errors[key]) return errors + const next = { ...errors } + delete next[key] + return next +} + +export const FORM_VALIDATION_SUMMARY = 'لطفاً خطاهای مشخص‌شده در فرم را برطرف کنید.' diff --git a/src/utils/format.ts b/src/utils/format.ts new file mode 100644 index 0000000..b29c70e --- /dev/null +++ b/src/utils/format.ts @@ -0,0 +1,88 @@ +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)} متر` +} + +import { parseISODate } from '@/utils/jalali' + +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', +}) + +function toDateValue(date: string | Date): Date { + if (typeof date !== 'string') return date + if (/^\d{4}-\d{2}-\d{2}$/.test(date)) return parseISODate(date) + return new Date(date) +} + +export function formatDate(date: string | Date): string { + return persianDateFormatter.format(toDateValue(date)) +} + +export function formatDateTime(date: string | Date): string { + return persianDateTimeFormatter.format(toDateValue(date)) +} + +export function formatTime(date: string | Date): string { + const d = typeof date === 'string' ? new Date(date) : date + return new Intl.DateTimeFormat('fa-IR', { + hour: '2-digit', + minute: '2-digit', + }).format(d) +} + +export function toPersianDigits(input: string): string { + return input.replace(/\d/g, (d) => persianDigits[Number(d)]!) +} + +export function normalizePhone(phone: string): string { + const digits = phone.replace(/\D/g, '') + if (digits.startsWith('98')) return '0' + digits.slice(2) + if (digits.startsWith('9') && digits.length === 10) return '0' + digits + return digits +} + +export function generateId(): string { + return crypto.randomUUID() +} + +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/jalali.ts b/src/utils/jalali.ts new file mode 100644 index 0000000..c724465 --- /dev/null +++ b/src/utils/jalali.ts @@ -0,0 +1,101 @@ +import { jalaaliMonthLength, toGregorian, toJalaali } from 'jalaali-js' + +const persianDigits = '۰۱۲۳۴۵۶۷۸۹' + +function toPersianDigits(input: string): string { + return input.replace(/\d/g, (d) => persianDigits[Number(d)]!) +} + +export const JALALI_MONTH_NAMES = [ + 'فروردین', + 'اردیبهشت', + 'خرداد', + 'تیر', + 'مرداد', + 'شهریور', + 'مهر', + 'آبان', + 'آذر', + 'دی', + 'بهمن', + 'اسفند', +] as const + +export const JALALI_WEEKDAY_NAMES = ['ش', 'ی', 'د', 'س', 'چ', 'پ', 'ج'] as const + +export interface JalaliDate { + jy: number + jm: number + jd: number +} + +export function parseISODate(iso: string): Date { + const [year, month, day] = iso.split('-').map(Number) + return new Date(year!, month! - 1, day!) +} + +export function toISODate(date: Date): string { + const year = date.getFullYear() + const month = String(date.getMonth() + 1).padStart(2, '0') + const day = String(date.getDate()).padStart(2, '0') + return `${year}-${month}-${day}` +} + +export function toJalali(date: Date): JalaliDate { + const { jy, jm, jd } = toJalaali(date.getFullYear(), date.getMonth() + 1, date.getDate()) + return { jy, jm, jd } +} + +export function fromJalali(jy: number, jm: number, jd: number): Date { + const { gy, gm, gd } = toGregorian(jy, jm, jd) + return new Date(gy, gm - 1, gd) +} + +export function isoToJalali(iso: string): JalaliDate | null { + if (!iso) return null + return toJalali(parseISODate(iso)) +} + +export function jalaliToISO(jy: number, jm: number, jd: number): string { + return toISODate(fromJalali(jy, jm, jd)) +} + +export function formatJalaliDate(jy: number, jm: number, jd: number): string { + const month = String(jm).padStart(2, '0') + const day = String(jd).padStart(2, '0') + return toPersianDigits(`${jy}/${month}/${day}`) +} + +export function formatJalaliLabel(jy: number, jm: number, jd: number): string { + return `${toPersianDigits(String(jd))} ${JALALI_MONTH_NAMES[jm - 1]} ${toPersianDigits(String(jy))}` +} + +export function getPersianWeekday(jy: number, jm: number, jd: number): number { + const { gy, gm, gd } = toGregorian(jy, jm, jd) + const jsDay = new Date(gy, gm - 1, gd).getDay() + return (jsDay + 1) % 7 +} + +export function getMonthLength(jy: number, jm: number): number { + return jalaaliMonthLength(jy, jm) +} + +export function buildCalendarDays(jy: number, jm: number): Array { + const length = getMonthLength(jy, jm) + const startWeekday = getPersianWeekday(jy, jm, 1) + const cells: Array = Array.from({ length: startWeekday }, () => null) + + for (let day = 1; day <= length; day += 1) { + cells.push(day) + } + + while (cells.length % 7 !== 0) { + cells.push(null) + } + + return cells +} + +export function todayJalali(): JalaliDate { + return toJalali(new Date()) +} diff --git a/src/utils/navigation.ts b/src/utils/navigation.ts new file mode 100644 index 0000000..cf1ea1e --- /dev/null +++ b/src/utils/navigation.ts @@ -0,0 +1,64 @@ +import type { Component } from 'vue' +import IconHome from '@/components/icons/IconHome.vue' +import IconCart from '@/components/icons/IconCart.vue' +import IconOrders from '@/components/icons/IconOrders.vue' +import IconProfile from '@/components/icons/IconProfile.vue' +import IconCatalog from '@/components/icons/IconCatalog.vue' +import IconCheckBook from '@/components/icons/IconCheckBook.vue' + +export interface NavItem { + name: string + path: string + label: string + icon: Component + dynamicPath?: boolean +} + +/** Mobile bottom navigation — unchanged */ +export const MAIN_NAV_ITEMS: NavItem[] = [ + { name: 'home', path: '/', label: 'خانه', icon: IconHome }, + { name: 'cart', path: '/cart', label: 'سبد خرید', icon: IconCart }, + { name: 'orders', path: '/orders', label: 'سفارش‌ها', icon: IconOrders }, + { name: 'profile', path: '/profile', label: 'پروفایل', icon: IconProfile }, +] + +/** Desktop sidebar — matches mockup */ +export const DESKTOP_NAV_ITEMS: NavItem[] = [ + { name: 'home', path: '/', label: 'خانه', icon: IconHome }, + { name: 'ordering', path: '/', label: 'سفارش‌گذاری', icon: IconCatalog, dynamicPath: true }, + { name: 'cart', path: '/cart', label: 'سبد خرید', icon: IconCart }, + { name: 'orders', path: '/orders', label: 'سفارش‌ها', icon: IconOrders }, + { name: 'checks', path: '/profile/checks', label: 'لیست چک‌ها', icon: IconCheckBook }, + { name: 'profile', path: '/profile', label: 'پروفایل', icon: IconProfile }, +] + +export function getOrderingPath(activeCompanyId: string | null | undefined): string { + if (activeCompanyId) return `/companies/${activeCompanyId}/catalogs` + return '/' +} + +export function isNavItemActive(name: string, path: string, currentPath: string): boolean { + if (name === 'ordering') { + return currentPath.startsWith('/companies/') + } + if (name === 'home') { + return currentPath === '/' + } + if (name === 'checks') { + return currentPath.startsWith('/profile/checks') + } + if (name === 'profile') { + return currentPath === '/profile' + } + if (path === '/profile') return currentPath === '/profile' + if (path === '/') return currentPath === '/' + return currentPath.startsWith(path) +} + +export function resolveNavPath( + item: NavItem, + activeCompanyId: string | null | undefined, +): string { + if (item.name === 'ordering') return getOrderingPath(activeCompanyId) + return item.path +} diff --git a/src/utils/orderStatusGroups.ts b/src/utils/orderStatusGroups.ts new file mode 100644 index 0000000..c7b6845 --- /dev/null +++ b/src/utils/orderStatusGroups.ts @@ -0,0 +1,69 @@ +import type { OrderStatus } from '@/types' + +export type DesktopOrderFilterId = + | 'all' + | 'review' + | 'in_progress' + | 'shipped' + | 'delivered' + | 'cancelled' + +export const REVIEW_STATUSES: OrderStatus[] = ['awaiting_review', 'awaiting_check_review'] + +export const IN_PROGRESS_STATUSES: OrderStatus[] = [ + 'submitted', + 'pricing', + 'check_in_progress', + 'awaiting_cash_confirmation', + 'preparing', + 'ready_to_ship', + 'needs_correction', + 'awaiting_settlement_fix', + 'cash_in_progress', + 'awaiting_cash_payment', + 'cash_payment_submitted', + 'check_needs_fix', + 'awaiting_settlement', + 'cash_invoice_issued', +] + +export const SHIPPED_STATUSES: OrderStatus[] = ['shipped'] + +export const DELIVERED_STATUSES: OrderStatus[] = [ + 'delivered', + 'final_approved', + 'checks_approved', + 'cash_confirmed', +] + +export const CANCELLED_STATUSES: OrderStatus[] = ['cancelled', 'rejected', 'expired', 'check_rejected'] + +export const MOBILE_ACTIVE_STATUSES: OrderStatus[] = [ + ...REVIEW_STATUSES, + ...IN_PROGRESS_STATUSES, + ...SHIPPED_STATUSES, +] + +export function matchesDesktopOrderFilter(status: OrderStatus, filter: DesktopOrderFilterId): boolean { + switch (filter) { + case 'review': + return REVIEW_STATUSES.includes(status) + case 'in_progress': + return IN_PROGRESS_STATUSES.includes(status) + case 'shipped': + return SHIPPED_STATUSES.includes(status) + case 'delivered': + return DELIVERED_STATUSES.includes(status) + case 'cancelled': + return CANCELLED_STATUSES.includes(status) + default: + return true + } +} + +export function matchesMobileOrderTab(status: OrderStatus, tabId: string): boolean { + if (tabId === 'active') return MOBILE_ACTIVE_STATUSES.includes(status) + if (tabId === 'done') return DELIVERED_STATUSES.includes(status) + if (tabId === 'cancelled') return CANCELLED_STATUSES.includes(status) + return true +} diff --git a/src/utils/orderTracking.ts b/src/utils/orderTracking.ts new file mode 100644 index 0000000..2156253 --- /dev/null +++ b/src/utils/orderTracking.ts @@ -0,0 +1,110 @@ +import type { Order, OrderStatus } from '@/types' +import { ORDER_TRACKING_STEPS } from '@/utils/constants' + +export type StatusHeroVariant = 'waiting' | 'success' | 'info' | 'none' + +export interface StatusHeroConfig { + variant: StatusHeroVariant + title: string + description?: string +} + +const STATUS_STEP_INDEX: Partial> = { + submitted: 0, + awaiting_review: 1, + pricing: 2, + check_in_progress: 3, + awaiting_check_review: 4, + check_needs_fix: 4, + check_rejected: 4, + checks_approved: 5, + final_approved: 6, + cash_confirmed: 6, + preparing: 7, + ready_to_ship: 8, + shipped: 9, + delivered: 10, +} + +const STATUS_HERO: Partial> = { + awaiting_review: { + variant: 'waiting', + title: 'در انتظار بررسی مدیریت', + description: 'سفارش شما ثبت شده و در صف بررسی مدیریت قرار دارد. پس از بررسی، نتیجه از طریق همین صفحه اطلاع‌رسانی می‌شود.', + }, + pricing: { + variant: 'waiting', + title: 'در حال قیمت‌گذاری', + description: 'مدیریت در حال تعیین مبلغ نهایی فاکتور است. لطفاً کمی صبر کنید.', + }, + awaiting_check_review: { + variant: 'waiting', + title: 'در حال بررسی چک‌ها', + description: 'چک‌های ثبت‌شده در حال بررسی هستند. نتیجه بررسی به‌زودی اعلام می‌شود.', + }, + checks_approved: { + variant: 'success', + title: 'چک‌ها تأیید شده', + description: 'چک‌های شما توسط مدیریت تأیید شد. سفارش وارد مراحل بعدی می‌شود.', + }, + cash_confirmed: { + variant: 'success', + title: 'پرداخت تأیید شد', + description: 'رسید پرداخت شما تأیید شد و سفارش وارد مراحل بعدی می‌شود.', + }, + final_approved: { + variant: 'success', + title: 'تأیید نهایی', + description: 'سفارش شما تأیید نهایی شد و آماده آماده‌سازی است.', + }, + preparing: { + variant: 'info', + title: 'در حال آماده‌سازی', + description: 'سفارش شما در انبار در حال آماده‌سازی است.', + }, + ready_to_ship: { + variant: 'info', + title: 'آماده ارسال', + description: 'سفارش آماده ارسال است و به‌زودی تحویل باربری می‌شود.', + }, + shipped: { + variant: 'info', + title: 'ارسال شده', + description: 'سفارش ارسال شده است. جزئیات بارنامه را می‌توانید مشاهده کنید.', + }, + delivered: { + variant: 'success', + title: 'تحویل شده', + description: 'سفارش با موفقیت تحویل داده شد.', + }, +} + +export function getTrackingStepIndex(status: OrderStatus): number { + return STATUS_STEP_INDEX[status] ?? 1 +} + +export function getStatusHero(status: OrderStatus): StatusHeroConfig | null { + return STATUS_HERO[status] ?? null +} + +export function getStepTimestamp(order: Order, stepStatus: OrderStatus): string | null { + if (stepStatus === 'submitted') { + return order.createdAt + } + + const entry = [...order.statusHistory] + .reverse() + .find((item) => item.toStatus === stepStatus) + + return entry?.changedAt ?? null +} + +export function getTrackingFooterLabel(status: OrderStatus): string { + if (status === 'shipped') return 'مشاهده جزئیات و بارنامه' + if (['checks_approved', 'cash_confirmed', 'delivered', 'final_approved'].includes(status)) { + return 'مشاهده جزئیات' + } + return 'مشاهده جزئیات سفارش' +} + +export { ORDER_TRACKING_STEPS } diff --git a/src/utils/validation.ts b/src/utils/validation.ts new file mode 100644 index 0000000..7598664 --- /dev/null +++ b/src/utils/validation.ts @@ -0,0 +1,74 @@ +import type { MeterageValidationResult, Product } from '@/types' + +export function validateNationalId(nationalId: string): boolean { + if (!/^\d{10}$/.test(nationalId)) return false + if (/^(\d)\1{9}$/.test(nationalId)) return false + const check = Number(nationalId[9]) + let sum = 0 + for (let i = 0; i < 9; i++) { + sum += Number(nationalId[i]) * (10 - i) + } + const remainder = sum % 11 + return remainder < 2 ? check === remainder : check === 11 - remainder +} + +export function validateSayadId(sayadId: string): boolean { + return /^\d{16}$/.test(sayadId.replace(/\s/g, '')) +} + +export function validatePhone(phone: string): boolean { + return /^09\d{9}$/.test(phone.replace(/\D/g, '').replace(/^9/, '09').slice(0, 11)) +} + +export function validateMeterage( + meterage: number, + product: Product, + currentCartTotal: number, + maxMeterage: number, + existingItemMeterage = 0, +): MeterageValidationResult { + if (!Number.isFinite(meterage) || meterage <= 0) { + return { valid: false, message: 'متراژ باید عددی بزرگ‌تر از صفر باشد.' } + } + if (meterage < product.minMeterage) { + return { + valid: false, + message: `حداقل متراژ سفارش برای این محصول ${product.minMeterage} متر است.`, + } + } + if (meterage % product.orderMultiplier !== 0) { + return { + valid: false, + message: `متراژ باید مضربی از ${product.orderMultiplier} باشد.`, + } + } + const newTotal = currentCartTotal - existingItemMeterage + meterage + if (newTotal > maxMeterage) { + const remaining = maxMeterage - (currentCartTotal - existingItemMeterage) + return { + valid: false, + message: `حداکثر متراژ قابل ثبت در هر فاکتور ${maxMeterage} متر است. شما فقط می‌توانید ${Math.max(0, remaining)} متر دیگر به این سفارش اضافه کنید.`, + } + } + return { valid: true } +} + +export function validateImageFile(file: File): { valid: boolean; message?: string } { + const allowed = ['image/jpeg', 'image/png', 'image/webp'] + if (!allowed.includes(file.type)) { + return { valid: false, message: 'فرمت تصویر مجاز نیست. (JPG, PNG, WEBP)' } + } + if (file.size > 5 * 1024 * 1024) { + return { valid: false, message: 'حجم تصویر نباید بیشتر از ۵ مگابایت باشد.' } + } + return { valid: true } +} + +export async function fileToBase64(file: File): Promise { + return new Promise((resolve, reject) => { + const reader = new FileReader() + reader.onload = () => resolve(reader.result as string) + reader.onerror = reject + reader.readAsDataURL(file) + }) +} diff --git a/src/views/OrdersView.vue b/src/views/OrdersView.vue new file mode 100644 index 0000000..30ebce7 --- /dev/null +++ b/src/views/OrdersView.vue @@ -0,0 +1,75 @@ + + + diff --git a/src/views/auth/LoginView.vue b/src/views/auth/LoginView.vue new file mode 100644 index 0000000..10dbeed --- /dev/null +++ b/src/views/auth/LoginView.vue @@ -0,0 +1,110 @@ + + + + + diff --git a/src/views/auth/OtpView.vue b/src/views/auth/OtpView.vue new file mode 100644 index 0000000..c168c14 --- /dev/null +++ b/src/views/auth/OtpView.vue @@ -0,0 +1,100 @@ + + + + + diff --git a/src/views/auth/RegisterView.vue b/src/views/auth/RegisterView.vue new file mode 100644 index 0000000..e1ebe03 --- /dev/null +++ b/src/views/auth/RegisterView.vue @@ -0,0 +1,135 @@ + + + + + diff --git a/src/views/cart/CartView.vue b/src/views/cart/CartView.vue new file mode 100644 index 0000000..72d6aa0 --- /dev/null +++ b/src/views/cart/CartView.vue @@ -0,0 +1,86 @@ + + + + + diff --git a/src/views/cart/components/DesktopCartPage.vue b/src/views/cart/components/DesktopCartPage.vue new file mode 100644 index 0000000..25dbfc1 --- /dev/null +++ b/src/views/cart/components/DesktopCartPage.vue @@ -0,0 +1,608 @@ + + + + + diff --git a/src/views/cart/components/MobileCartPage.vue b/src/views/cart/components/MobileCartPage.vue new file mode 100644 index 0000000..c33a227 --- /dev/null +++ b/src/views/cart/components/MobileCartPage.vue @@ -0,0 +1,241 @@ + + + + + diff --git a/src/views/catalogs/CatalogListView.vue b/src/views/catalogs/CatalogListView.vue new file mode 100644 index 0000000..611254b --- /dev/null +++ b/src/views/catalogs/CatalogListView.vue @@ -0,0 +1,179 @@ + + + + + diff --git a/src/views/checkout/CashSettlementView.vue b/src/views/checkout/CashSettlementView.vue new file mode 100644 index 0000000..8e8900c --- /dev/null +++ b/src/views/checkout/CashSettlementView.vue @@ -0,0 +1,295 @@ + + + + + diff --git a/src/views/checkout/CheckFormView.vue b/src/views/checkout/CheckFormView.vue new file mode 100644 index 0000000..2e8be90 --- /dev/null +++ b/src/views/checkout/CheckFormView.vue @@ -0,0 +1,317 @@ + + + + + diff --git a/src/views/checkout/CheckListView.vue b/src/views/checkout/CheckListView.vue new file mode 100644 index 0000000..17e5de5 --- /dev/null +++ b/src/views/checkout/CheckListView.vue @@ -0,0 +1,549 @@ + + + + + diff --git a/src/views/checkout/CheckModeSelectView.vue b/src/views/checkout/CheckModeSelectView.vue new file mode 100644 index 0000000..21f8cfa --- /dev/null +++ b/src/views/checkout/CheckModeSelectView.vue @@ -0,0 +1,115 @@ + + + + + diff --git a/src/views/checkout/SettlementTypeView.vue b/src/views/checkout/SettlementTypeView.vue new file mode 100644 index 0000000..1262ec8 --- /dev/null +++ b/src/views/checkout/SettlementTypeView.vue @@ -0,0 +1,146 @@ + + + + + diff --git a/src/views/companies/CompanySelectView.vue b/src/views/companies/CompanySelectView.vue new file mode 100644 index 0000000..40b37c5 --- /dev/null +++ b/src/views/companies/CompanySelectView.vue @@ -0,0 +1,107 @@ + + + + + diff --git a/src/views/companies/components/DesktopCompanySelect.vue b/src/views/companies/components/DesktopCompanySelect.vue new file mode 100644 index 0000000..f42e830 --- /dev/null +++ b/src/views/companies/components/DesktopCompanySelect.vue @@ -0,0 +1,102 @@ + + + + + diff --git a/src/views/companies/components/DesktopHomeDashboard.vue b/src/views/companies/components/DesktopHomeDashboard.vue new file mode 100644 index 0000000..11c596b --- /dev/null +++ b/src/views/companies/components/DesktopHomeDashboard.vue @@ -0,0 +1,573 @@ + + + + + diff --git a/src/views/companies/components/MobileCompanySelect.vue b/src/views/companies/components/MobileCompanySelect.vue new file mode 100644 index 0000000..45e92e5 --- /dev/null +++ b/src/views/companies/components/MobileCompanySelect.vue @@ -0,0 +1,126 @@ + + + + + diff --git a/src/views/orders/OrderDetailView.vue b/src/views/orders/OrderDetailView.vue new file mode 100644 index 0000000..beb648c --- /dev/null +++ b/src/views/orders/OrderDetailView.vue @@ -0,0 +1,686 @@ + + + + + diff --git a/src/views/orders/OrderSuccessView.vue b/src/views/orders/OrderSuccessView.vue new file mode 100644 index 0000000..1108f9f --- /dev/null +++ b/src/views/orders/OrderSuccessView.vue @@ -0,0 +1,84 @@ + + + + + diff --git a/src/views/orders/components/DesktopOrdersPage.vue b/src/views/orders/components/DesktopOrdersPage.vue new file mode 100644 index 0000000..263ebba --- /dev/null +++ b/src/views/orders/components/DesktopOrdersPage.vue @@ -0,0 +1,210 @@ + + + diff --git a/src/views/orders/components/MobileOrdersPage.vue b/src/views/orders/components/MobileOrdersPage.vue new file mode 100644 index 0000000..27a5223 --- /dev/null +++ b/src/views/orders/components/MobileOrdersPage.vue @@ -0,0 +1,199 @@ + + + + + diff --git a/src/views/products/ProductListView.vue b/src/views/products/ProductListView.vue new file mode 100644 index 0000000..8713bed --- /dev/null +++ b/src/views/products/ProductListView.vue @@ -0,0 +1,74 @@ + + + diff --git a/src/views/products/components/DesktopProductPage.vue b/src/views/products/components/DesktopProductPage.vue new file mode 100644 index 0000000..e91a3c5 --- /dev/null +++ b/src/views/products/components/DesktopProductPage.vue @@ -0,0 +1,303 @@ + + + + + diff --git a/src/views/products/components/MobileProductPage.vue b/src/views/products/components/MobileProductPage.vue new file mode 100644 index 0000000..e5e66b1 --- /dev/null +++ b/src/views/products/components/MobileProductPage.vue @@ -0,0 +1,227 @@ + + + + + diff --git a/src/views/profile/ProfileChecksView.vue b/src/views/profile/ProfileChecksView.vue new file mode 100644 index 0000000..2394d5c --- /dev/null +++ b/src/views/profile/ProfileChecksView.vue @@ -0,0 +1,7 @@ + + + diff --git a/src/views/profile/ProfileEditView.vue b/src/views/profile/ProfileEditView.vue new file mode 100644 index 0000000..44c1736 --- /dev/null +++ b/src/views/profile/ProfileEditView.vue @@ -0,0 +1,152 @@ + + + + + diff --git a/src/views/profile/ProfileView.vue b/src/views/profile/ProfileView.vue new file mode 100644 index 0000000..a02a20f --- /dev/null +++ b/src/views/profile/ProfileView.vue @@ -0,0 +1,19 @@ + + + diff --git a/src/views/profile/components/DesktopProfilePage.vue b/src/views/profile/components/DesktopProfilePage.vue new file mode 100644 index 0000000..9c7b095 --- /dev/null +++ b/src/views/profile/components/DesktopProfilePage.vue @@ -0,0 +1,723 @@ + + + + + diff --git a/src/views/profile/components/MobileProfilePage.vue b/src/views/profile/components/MobileProfilePage.vue new file mode 100644 index 0000000..d9070ce --- /dev/null +++ b/src/views/profile/components/MobileProfilePage.vue @@ -0,0 +1,224 @@ + + + + + diff --git a/tsconfig.app.json b/tsconfig.app.json new file mode 100644 index 0000000..c0f2d86 --- /dev/null +++ b/tsconfig.app.json @@ -0,0 +1,18 @@ +{ + "extends": "@vue/tsconfig/tsconfig.dom.json", + "include": ["env.d.ts", "src/**/*", "src/**/*.vue"], + "exclude": ["src/**/__tests__/*"], + "compilerOptions": { + // Extra safety for array and object lookups, but may have false positives. + "noUncheckedIndexedAccess": true, + + // Path mapping for cleaner imports. + "paths": { + "@/*": ["./src/*"] + }, + + // `vue-tsc --build` produces a .tsbuildinfo file for incremental type-checking. + // Specified here to keep it out of the root directory. + "tsBuildInfoFile": "./node_modules/.tmp/tsconfig.app.tsbuildinfo" + } +} diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 0000000..66b5e57 --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,11 @@ +{ + "files": [], + "references": [ + { + "path": "./tsconfig.node.json" + }, + { + "path": "./tsconfig.app.json" + } + ] +} diff --git a/tsconfig.node.json b/tsconfig.node.json new file mode 100644 index 0000000..c9b2bad --- /dev/null +++ b/tsconfig.node.json @@ -0,0 +1,27 @@ +// TSConfig for modules that run in Node.js environment via either transpilation or type-stripping. +{ + "extends": "@tsconfig/node24/tsconfig.json", + "include": [ + "vite.config.*", + "vitest.config.*", + "cypress.config.*", + "playwright.config.*", + "eslint.config.*" + ], + "compilerOptions": { + // Most tools use transpilation instead of Node.js's native type-stripping. + // Bundler mode provides a smoother developer experience. + "module": "preserve", + "moduleResolution": "bundler", + + // Include Node.js types and avoid accidentally including other `@types/*` packages. + "types": ["node"], + + // Disable emitting output during `vue-tsc --build`, which is used for type-checking only. + "noEmit": true, + + // `vue-tsc --build` produces a .tsbuildinfo file for incremental type-checking. + // Specified here to keep it out of the root directory. + "tsBuildInfoFile": "./node_modules/.tmp/tsconfig.node.tsbuildinfo" + } +} diff --git a/vite.config.ts b/vite.config.ts new file mode 100644 index 0000000..ace127e --- /dev/null +++ b/vite.config.ts @@ -0,0 +1,20 @@ +import { fileURLToPath, URL } from 'node:url' + +import { defineConfig } from 'vite' +import vue from '@vitejs/plugin-vue' +import vueJsx from '@vitejs/plugin-vue-jsx' +import vueDevTools from 'vite-plugin-vue-devtools' + +// https://vite.dev/config/ +export default defineConfig({ + plugins: [ + vue(), + vueJsx(), + vueDevTools(), + ], + resolve: { + alias: { + '@': fileURLToPath(new URL('./src', import.meta.url)), + }, + }, +})