Quellcode durchsuchen

项目初始化

zhaohuanhuan vor 1 Jahr
Commit
1ec7a2baf2
51 geänderte Dateien mit 3987 neuen und 0 gelöschten Zeilen
  1. 7 0
      .env.development
  2. 7 0
      .env.production
  3. 11 0
      .env.sit
  4. 16 0
      .eslintrc.js
  5. 24 0
      .gitignore
  6. 4 0
      .prettierrc
  7. 5 0
      README.md
  8. 7 0
      env.d.ts
  9. 16 0
      index.html
  10. 43 0
      package.json
  11. 18 0
      postcss.config.cjs
  12. 1 0
      public/vite.svg
  13. 6 0
      shims-vue.d.ts
  14. 53 0
      src/App.vue
  15. 11 0
      src/api/basic/index.ts
  16. 12 0
      src/api/login/index.ts
  17. 82 0
      src/api/picking/index.ts
  18. BIN
      src/assets/nodata.png
  19. 1 0
      src/assets/vue.svg
  20. 21 0
      src/components/GlobalLoading.vue
  21. 14 0
      src/components/HelloWorld.vue
  22. 33 0
      src/hooks/basic/index.ts
  23. 20 0
      src/main.ts
  24. 34 0
      src/router/index.ts
  25. 21 0
      src/store/modules/basic.ts
  26. 27 0
      src/store/modules/user.ts
  27. 83 0
      src/style.css
  28. 8 0
      src/types/basic.ts
  29. 4 0
      src/types/login.ts
  30. 101 0
      src/types/picking.ts
  31. 82 0
      src/utils/android.ts
  32. 27 0
      src/utils/dataType.js
  33. 9 0
      src/utils/date.ts
  34. 41 0
      src/utils/keydownListener.js
  35. 65 0
      src/utils/request.ts
  36. 29 0
      src/views/login/login.vue
  37. 76 0
      src/views/outbound/components/ContainerNoInput.vue
  38. 65 0
      src/views/outbound/components/PickingNoInput.vue
  39. 51 0
      src/views/outbound/picking/list/hooks/list.ts
  40. 25 0
      src/views/outbound/picking/list/hooks/lotNum.ts
  41. 588 0
      src/views/outbound/picking/list/index.vue
  42. 23 0
      src/views/outbound/picking/task/hooks/task.ts
  43. 351 0
      src/views/outbound/picking/task/index.vue
  44. 84 0
      src/views/test.vue
  45. 6 0
      src/vite-env.d.ts
  46. 26 0
      tsconfig.app.json
  47. 32 0
      tsconfig.json
  48. 24 0
      tsconfig.node.json
  49. 1 0
      tsconfig.tsbuildinfo
  50. 21 0
      vite.config.ts
  51. 1671 0
      yarn.lock

+ 7 - 0
.env.development

@@ -0,0 +1,7 @@
+# just a flag
+ENV = 'development'
+
+PORT = 80
+# base api
+
+VITE_APP_BASE_API = 'https://api.baoshi56.com/'

+ 7 - 0
.env.production

@@ -0,0 +1,7 @@
+# just a flag
+ENV = 'production'
+
+PORT = 80
+# base api
+
+VITE_APP_BASE_API = 'https://api.baoshi56.com/'

+ 11 - 0
.env.sit

@@ -0,0 +1,11 @@
+NODE_ENV = sit
+
+# just a flag
+ENV = 'sit'
+
+PORT = 80
+
+
+# base api
+VITE_APP_BASE_API = http://sit.api.baoshi56.com/
+

+ 16 - 0
.eslintrc.js

@@ -0,0 +1,16 @@
+module.exports = {
+  parser: '@typescript-eslint/parser',
+  parserOptions: {
+    ecmaVersion: 2020,
+    sourceType: 'module',
+  },
+  extends: [
+    'eslint:recommended',
+    'plugin:vue/vue3-recommended',
+    'plugin:@typescript-eslint/recommended',
+    'plugin:prettier/recommended'
+  ],
+  rules: {
+    // 自定义规则
+  }
+}

+ 24 - 0
.gitignore

@@ -0,0 +1,24 @@
+# Logs
+logs
+*.log
+npm-debug.log*
+yarn-debug.log*
+yarn-error.log*
+pnpm-debug.log*
+lerna-debug.log*
+
+node_modules
+dist
+dist-ssr
+*.local
+
+# Editor directories and files
+.vscode/*
+!.vscode/extensions.json
+.idea
+.DS_Store
+*.suo
+*.ntvs*
+*.njsproj
+*.sln
+*.sw?

+ 4 - 0
.prettierrc

@@ -0,0 +1,4 @@
+{
+  "singleQuote": true,
+  "semi": false
+}

+ 5 - 0
README.md

@@ -0,0 +1,5 @@
+# Vue 3 + TypeScript + Vite
+
+This template should help get you started developing with Vue 3 and TypeScript in Vite. The template uses Vue 3 `<script setup>` SFCs, check out the [script setup docs](https://v3.vuejs.org/api/sfc-script-setup.html#sfc-script-setup) to learn more.
+
+Learn more about the recommended Project Setup and IDE Support in the [Vue Docs TypeScript Guide](https://vuejs.org/guide/typescript/overview.html#project-setup).

+ 7 - 0
env.d.ts

@@ -0,0 +1,7 @@
+interface ImportMetaEnv {
+  VITE_APP_BASE_API: string;
+}
+
+interface ImportMeta {
+  readonly env: ImportMetaEnv;
+}

+ 16 - 0
index.html

@@ -0,0 +1,16 @@
+<!doctype html>
+<html lang="en">
+  <head>
+    <meta charset="UTF-8" />
+    <link rel="icon" type="image/svg+xml" href="/vite.svg" />
+    <meta
+      name="viewport"
+      content="width=device-width, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0, viewport-fit=cover"
+    />
+    <title>h5</title>
+  </head>
+  <body>
+    <div id="app"></div>
+    <script type="module" src="/src/main.ts"></script>
+  </body>
+</html>

+ 43 - 0
package.json

@@ -0,0 +1,43 @@
+{
+  "name": "baoshi-h5",
+  "private": true,
+  "version": "0.0.0",
+  "type": "module",
+  "scripts": {
+    "serve": "vite",
+    "sit": "vite --mode sit",
+    "dev": "vite",
+    "build": "vite build",
+    "preview": "vite preview"
+  },
+  "dependencies": {
+    "axios": "^1.7.9",
+    "lib-flexible": "^0.3.2",
+    "pinia": "^2.3.0",
+    "pinia-plugin-persistedstate": "^4.2.0",
+    "postcss-pxtorem": "^6.1.0",
+    "sass": "^1.83.0",
+    "vant": "^4.9.10",
+    "vue": "^3.5.13",
+    "vue-router": "^4.5.0"
+  },
+  "devDependencies": {
+    "@types/node": "^22.10.2",
+    "@types/vue": "^2.0.0",
+    "@typescript-eslint/eslint-plugin": "^8.18.1",
+    "@typescript-eslint/parser": "^8.18.1",
+    "@vitejs/plugin-vue": "^5.2.1",
+    "@vue/compiler-sfc": "^3.5.13",
+    "@vue/runtime-dom": "^3.5.13",
+    "eslint": "^9.17.0",
+    "eslint-config-prettier": "^9.1.0",
+    "eslint-plugin-prettier": "^5.2.1",
+    "eslint-plugin-vue": "^9.32.0",
+    "postcss-px-to-viewport": "^1.1.1",
+    "prettier": "^3.4.2",
+    "sass-embedded": "^1.83.0",
+    "typescript": "^5.7.2",
+    "vite": "^6.0.1",
+    "vue-tsc": "^2.2.0"
+  }
+}

+ 18 - 0
postcss.config.cjs

@@ -0,0 +1,18 @@
+module.exports = {
+  plugins: [
+    require('postcss-px-to-viewport')({
+      unitToConvert: 'px',          // 要转换的单位,通常是 px
+      viewportWidth: 375,           // 设计稿的宽度,通常为375,适配移动端
+      viewportHeight: 667,          // 可选,设计稿的高度,如果没有,可以省略
+      unitPrecision: 5,             // 转换后的精度,即小数点位数
+      propList: ['*'],              // 要转换的属性,* 表示所有属性都转换
+      viewportUnit: 'vw',           // 使用的视口单位,可以是 vw, vh
+      fontViewportUnit: 'vw',       // 字体使用的视口单位
+      selectorBlackList: ['.ignore', '.hairlines'], // 忽略转换的类名
+      minPixelValue: 1,             // 小于或等于1px的样式不会转换
+      mediaQuery: false,            // 是否在媒体查询中转换px
+      replace: true,                // 是否直接替换原有单位
+      exclude: /node_modules/i      // 排除 node_modules 中的文件
+    })
+  ]
+}

+ 1 - 0
public/vite.svg

@@ -0,0 +1 @@
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" aria-hidden="true" role="img" class="iconify iconify--logos" width="31.88" height="32" preserveAspectRatio="xMidYMid meet" viewBox="0 0 256 257"><defs><linearGradient id="IconifyId1813088fe1fbc01fb466" x1="-.828%" x2="57.636%" y1="7.652%" y2="78.411%"><stop offset="0%" stop-color="#41D1FF"></stop><stop offset="100%" stop-color="#BD34FE"></stop></linearGradient><linearGradient id="IconifyId1813088fe1fbc01fb467" x1="43.376%" x2="50.316%" y1="2.242%" y2="89.03%"><stop offset="0%" stop-color="#FFEA83"></stop><stop offset="8.333%" stop-color="#FFDD35"></stop><stop offset="100%" stop-color="#FFA800"></stop></linearGradient></defs><path fill="url(#IconifyId1813088fe1fbc01fb466)" d="M255.153 37.938L134.897 252.976c-2.483 4.44-8.862 4.466-11.382.048L.875 37.958c-2.746-4.814 1.371-10.646 6.827-9.67l120.385 21.517a6.537 6.537 0 0 0 2.322-.004l117.867-21.483c5.438-.991 9.574 4.796 6.877 9.62Z"></path><path fill="url(#IconifyId1813088fe1fbc01fb467)" d="M185.432.063L96.44 17.501a3.268 3.268 0 0 0-2.634 3.014l-5.474 92.456a3.268 3.268 0 0 0 3.997 3.378l24.777-5.718c2.318-.535 4.413 1.507 3.936 3.838l-7.361 36.047c-.495 2.426 1.782 4.5 4.151 3.78l15.304-4.649c2.372-.72 4.652 1.36 4.15 3.788l-11.698 56.621c-.732 3.542 3.979 5.473 5.943 2.437l1.313-2.028l72.516-144.72c1.215-2.423-.88-5.186-3.54-4.672l-25.505 4.922c-2.396.462-4.435-1.77-3.759-4.114l16.646-57.705c.677-2.35-1.37-4.583-3.769-4.113Z"></path></svg>

+ 6 - 0
shims-vue.d.ts

@@ -0,0 +1,6 @@
+// src/shims-vue.d.ts
+declare module "*.vue" {
+  import { DefineComponent } from 'vue';
+  const component: DefineComponent<{}, {}, any>;
+  export default component;
+}

+ 53 - 0
src/App.vue

@@ -0,0 +1,53 @@
+<template>
+  <div id="app">
+    <router-view />
+  </div>
+</template>
+
+<script lang="ts" setup>
+import { useRouter } from 'vue-router'
+import { closeToast, showLoadingToast } from 'vant'
+
+const router = useRouter()
+
+// 在路由跳转前启动加载动画
+router.beforeEach((to, from, next) => {
+  showLoadingToast({
+    duration: 0,
+    forbidClick: true,
+    message: '加载中...',
+  });
+  next()
+})
+
+// 在路由跳转后隐藏加载动画
+router.afterEach(() => {
+  closeToast();
+})
+</script>
+<style >
+:root:root {
+  --van-nav-bar-background:#1989fa;
+}
+:root:root {
+  --van-nav-bar-text-color:#ffffff;
+}
+:root:root {
+  --van-nav-bar-title-text-color:#ffffff;
+}
+:root:root {
+  --van-nav-bar-icon-color:#ffffff
+}
+:root:root {
+  --van-nav-bar-arrow-size:18px
+}
+:root:root{
+  --van-notice-bar-height: 24px
+}
+:root:root {
+  --van-dialog-header-padding-top:10px
+}
+
+
+
+</style>

+ 11 - 0
src/api/basic/index.ts

@@ -0,0 +1,11 @@
+// @ts-ignore
+import request from '@/utils/request'
+// @ts-ignore
+import { getOwnerTypes } from '@/types/basic'
+
+export function getOwner() {
+  return request({
+    url: 'api/basic/owner/options',
+    method: 'get',
+  })
+}

+ 12 - 0
src/api/login/index.ts

@@ -0,0 +1,12 @@
+// @ts-ignore
+import request from '@/utils/request'
+// @ts-ignore
+import { loginType } from '@/types/login'
+
+export function login(data:loginType) {
+  return request({
+    url: 'api/user/login',
+    method: 'post',
+    data:JSON.stringify(data)
+  })
+}

+ 82 - 0
src/api/picking/index.ts

@@ -0,0 +1,82 @@
+// @ts-ignore
+import request from '@/utils/request'
+// @ts-ignore
+import { getPickingDetailType, getPickingFirstType, getPickingTaskType,getPickingTaskDetailType, createPickingTaskType,setPickingDetailType } from '@/types/picking'
+/**
+ * 获取拣货列表
+ * @param params
+ */
+export function getPickingTask(params:getPickingTaskType) {
+  return request({
+    url: 'api/wms/picking/available-panel/owner-warehouse',
+    method: 'get',
+    params
+  })
+}
+/**
+ * 获取拣货任务详情(大件、特殊、加急、活动)
+ * @param data
+ */
+export function getPickingTaskDetail(data:getPickingTaskDetailType) {
+  return request({
+    url: 'api/wms/picking/available-panel/type-detail',
+    method: 'post',
+    data:JSON.stringify(data)
+  })
+}
+/**
+ * 创建拣货任务
+ * @param data
+ */
+export function createPickingTask(data: createPickingTaskType) {
+  return request({
+    url: 'api/wms/picking/build-by-owner',
+    method: 'post',
+    data:JSON.stringify(data)
+  })
+}
+
+
+
+
+/**
+ * 获取首个拣货任务号
+ * @param params
+ */
+export function getPickingFirst(params:getPickingFirstType) {
+  return request({
+    url: 'api/wms/picking/first',
+    method: 'get',
+    params
+  })
+}
+
+/**
+ * 获取拣货任务明细
+ * @param params
+ */
+export function getPickingDetail(params:getPickingDetailType) {
+  return request({
+    url: 'api/wms/picking/details',
+    method: 'get',
+    params
+  })
+}
+
+/**
+ * 上传拣货信息
+ * @param data
+ */
+export function setPickingDetail(data: any[]) {
+  return request({
+    url: 'api/wms/picking/details',
+    method: 'post',
+    data:JSON.stringify(data)
+  })
+}
+
+
+
+
+
+

BIN
src/assets/nodata.png


+ 1 - 0
src/assets/vue.svg

@@ -0,0 +1 @@
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" aria-hidden="true" role="img" class="iconify iconify--logos" width="37.07" height="36" preserveAspectRatio="xMidYMid meet" viewBox="0 0 256 198"><path fill="#41B883" d="M204.8 0H256L128 220.8L0 0h97.92L128 51.2L157.44 0h47.36Z"></path><path fill="#41B883" d="m0 0l128 220.8L256 0h-51.2L128 132.48L50.56 0H0Z"></path><path fill="#35495E" d="M50.56 0L128 133.12L204.8 0h-47.36L128 51.2L97.92 0H50.56Z"></path></svg>

+ 21 - 0
src/components/GlobalLoading.vue

@@ -0,0 +1,21 @@
+<template>
+  <van-loading v-if="loading" type="spinner" size="32px" />
+</template>
+
+<script setup>
+import { ref } from 'vue'
+
+const loading = ref(false)
+
+ function useLoading() {
+  return {
+    loading,
+  };
+}
+
+// defineExpose({ loading })
+</script>
+
+<style scoped>
+/* 你可以自定义 loading 样式 */
+</style>

+ 14 - 0
src/components/HelloWorld.vue

@@ -0,0 +1,14 @@
+<script setup lang="ts">
+import { ref } from 'vue'
+defineProps<{ msg: string }>()
+
+const count = ref(0)
+</script>
+
+<template>
+  <button type="button" @click="count++">count is {{ count }}</button>
+  <van-button type="primary">主要按钮</van-button>
+</template>
+
+<style scoped>
+</style>

+ 33 - 0
src/hooks/basic/index.ts

@@ -0,0 +1,33 @@
+import { ref } from 'vue';
+// @ts-ignore
+import { showToast } from 'vant'
+// @ts-ignore
+import { getOwner } from '@/api/basic'
+// @ts-ignore
+import { toMap } from '@/utils/dataType'
+// @ts-ignore
+import { basicStore } from '@/store/modules/basic'
+interface ownerDetailResponse {
+  data: any; // API 返回的数据类型
+}
+export const getOwnerList = () => {
+  const ownerList = ref<any>([]);
+  const ownerMap = ref<any>({});
+  // 获取拣货数据的函数
+  const getOwnerData = async () => {
+    const { data }: ownerDetailResponse = await getOwner();
+    // 查询货主
+    ownerList.value = data
+    ownerMap.value = toMap(data,'code','name')
+    //获取货主
+    const basic = basicStore()
+    //保存获取货主到内存
+    basic.setOwner(ownerMap.value)
+  };
+
+  return {
+    ownerList,
+    ownerMap,
+    getOwnerData,
+  };
+};

+ 20 - 0
src/main.ts

@@ -0,0 +1,20 @@
+import { createApp } from 'vue'
+import './style.css'
+import { createPinia } from 'pinia'
+import piniaPersist from 'pinia-plugin-persistedstate';
+
+import router from './router';
+import App from './App.vue'
+// 引入 Vant 组件库
+import Vant from 'vant'
+import { Loading } from 'vant'
+import 'vant/lib/index.css'
+const app = createApp(App)
+// 使用 Vant UI 组件库
+app.use(Vant)
+app.use(Loading)
+app.use(router);
+const pinia = createPinia();
+app.use(pinia)
+pinia.use(piniaPersist);
+app.mount('#app')

+ 34 - 0
src/router/index.ts

@@ -0,0 +1,34 @@
+// src/router/index.ts
+import { createRouter, createWebHashHistory, RouteRecordRaw } from 'vue-router'
+const routes: RouteRecordRaw[] = [
+  // {
+  //   path: '/',
+  //   name: 'Login',
+  //   component: () => import('@/views/test.vue')
+  // },
+  {
+    path: '/login',
+    name: 'Login',
+    component: () => import('@/views/login/login.vue')
+  },
+  {
+    path: '/',
+    name: 'PickingList',
+    component: () => import('@/views/outbound/picking/list/index.vue')
+  },
+  {
+    path: '/picking-task',
+    name: 'PickingTask',
+    component: () => import('@/views/outbound/picking/task/index.vue')
+  }
+];
+
+// 创建路由实例
+const router = createRouter({
+  history:createWebHashHistory(),
+  // history: createWebHistory(import.meta.env.BASE_URL), // 使用 history 模式
+  routes // 路由配置
+});
+
+
+export default router;

+ 21 - 0
src/store/modules/basic.ts

@@ -0,0 +1,21 @@
+import { defineStore } from 'pinia'
+
+interface basicTypes {
+  ownerMap: Object
+}
+
+// @ts-ignore
+export const basicStore = defineStore('basic', {
+  state: (): basicTypes => ({
+    ownerMap: {}
+  }),
+  actions: {
+    setOwner(state: basicTypes) {
+      this.ownerMap = state
+    },
+  },
+  persist: {
+    enabled: true, // 启用持久化
+    storage: localStorage,
+  }
+})

+ 27 - 0
src/store/modules/user.ts

@@ -0,0 +1,27 @@
+import { defineStore } from 'pinia'
+
+interface userInfoType {
+  token: string,
+  warehouse:string,
+}
+
+// @ts-ignore
+export const useStore = defineStore('user', {
+  state: (): userInfoType => ({
+    token: '',
+    warehouse:''
+  }),
+  actions: {
+    setToken(state: userInfoType) {
+      this.token = state.token
+      this.warehouse=state.warehouse
+    },
+    removeToken() {
+      localStorage.removeItem('user')
+    }
+  },
+  persist: {
+    enabled: true, // 启用持久化
+    storage: localStorage,
+  }
+})

+ 83 - 0
src/style.css

@@ -0,0 +1,83 @@
+:root {
+  font-family: Inter, system-ui, Avenir, Helvetica, Arial, sans-serif;
+  line-height: 1.5;
+  font-weight: 400;
+
+  color-scheme: light dark;
+  color: rgba(255, 255, 255, 0.87);
+  background-color: #242424;
+
+  font-synthesis: none;
+  text-rendering: optimizeLegibility;
+  -webkit-font-smoothing: antialiased;
+  -moz-osx-font-smoothing: grayscale;
+}
+
+a {
+  font-weight: 500;
+  color: #646cff;
+  text-decoration: inherit;
+}
+a:hover {
+  color: #535bf2;
+}
+
+body {
+  margin: 0;
+  display: flex;
+  place-items: center;
+  min-width: 320px;
+  min-height: 100vh;
+}
+
+h1 {
+  font-size: 3.2em;
+  line-height: 1.1;
+}
+
+button {
+  border-radius: 8px;
+  border: 1px solid transparent;
+  padding: 0.6em 1.2em;
+  font-size: 1em;
+  font-weight: 500;
+  font-family: inherit;
+  background-color: #1a1a1a;
+  cursor: pointer;
+  transition: border-color 0.25s;
+}
+button:hover {
+  border-color: #646cff;
+}
+button:focus,
+button:focus-visible {
+  outline: 4px auto -webkit-focus-ring-color;
+}
+
+.card {
+  padding: 2em;
+}
+
+#app {
+  max-width: 1280px;
+  height: 100vh;
+  width: 100%;
+  text-align: center;
+}
+.container{
+  height: 100vh;
+  width: 100%;
+}
+
+@media (prefers-color-scheme: light) {
+  :root {
+    color: #213547;
+    background-color: #ffffff;
+  }
+  a:hover {
+    color: #747bff;
+  }
+  button {
+    background-color: #f9f9f9;
+  }
+}

+ 8 - 0
src/types/basic.ts

@@ -0,0 +1,8 @@
+/**
+ * 获取货主
+ * @param warehouse 仓库
+ * @param code 拣货任务号
+ */
+export interface getOwnerTypes {
+  warehouse: string;
+}

+ 4 - 0
src/types/login.ts

@@ -0,0 +1,4 @@
+export interface loginType {
+  username: string;
+  password: string;
+}

+ 101 - 0
src/types/picking.ts

@@ -0,0 +1,101 @@
+
+/**
+ * 获取可生成任务列表
+ * @param warehouse 仓库
+ */
+export interface getPickingTaskType {
+  warehouse: string;
+}
+/**
+ * 获取成任务列表详情
+ * @param warehouse 仓库
+ * @param ruleName 规则
+ * @param issuePartyNameList 店铺
+ * @param carrierList 承运商
+ * @param ownerList 货主
+ * @param type 类型
+ * @param warehouseAttributeList 属性仓
+ */
+export interface getPickingTaskDetailType {
+  warehouse: string;
+  type:string;
+  orderNoList:string[];
+}
+/**
+ * 获取成任务列表详情
+ * @param warehouse 仓库
+ * @param ruleName 规则
+ * @param issuePartyNameList 店铺
+ * @param carrierList 承运商
+ * @param ownerList 货主
+ * @param type 类型
+ * @param warehouseAttributeList 属性仓
+ */
+export interface createPickingTaskType {
+  uid: undefined;
+  count: number;
+  owners: string[] | undefined;
+  carriers: any[];
+  warehouse: string;
+  type: any;
+  orderNoList: any[];
+}
+/**
+ * 获取首个拣货任务
+ * @param warehouse 仓库
+ * @param code 模式
+ * OWNER 按货主
+ * AISLE 按巷道
+ * BULK_AISLE 大件拣货 - 按巷道
+ * BULK_ITEM 大件拣货 - 按商品
+ * MIXED_PICKING 混拣 (多货主/多订单标记类型)
+ */
+export interface getPickingFirstType {
+  warehouse: string;
+  code: string;
+}
+/**
+ * 获取拣货任务明细
+ * @param warehouse 仓库
+ * @param code 拣货任务号
+ */
+export interface getPickingDetailType {
+  warehouse: string;
+  code: string;
+}
+/**
+ * 获取拣货任务明细
+ * @param warehouse 仓库
+ * @param code 拣货任务号
+ */
+export interface setPickingDetailType {
+  code:string,
+  line: string,
+  owner:string,
+  location: string,
+  name: string,
+  barcode:string,
+  barcodeAs:string,
+  lotNumber: string,
+  productionDate: string,
+  expirationDate: string,
+  quality: string,
+  expectedQuantity: string,
+  quantity: string,
+  warehouseAttribute: string,
+  outbound: string,
+  container: string,
+  status: string,
+  aisle: string,
+  operationTime: string,
+  operator: string,
+  allocationId: string,
+  lotNum: string,
+  floor: string,
+  x:string,
+  y: string,
+  binds:string[],
+  product: string
+}
+
+

+ 82 - 0
src/utils/android.ts

@@ -0,0 +1,82 @@
+import { showToast } from 'vant'
+// @ts-ignore
+import { useStore } from '@/store/modules/user'
+const store = useStore()
+/**
+ * 获取请求参数
+ */
+export function getHeader(){
+  try {
+    // @ts-ignore
+    const header = window.android.getHeader();
+    const user=JSON.parse(header)
+    user.token=user.Authorization
+    store.setToken(user);
+  }catch (e){
+    // router.push('/login')
+  }
+}
+
+/**
+ * 登出
+ */
+export function logout(){
+  try {
+    // @ts-ignore
+    window.android.logout()
+    // store.removeToken()
+  }catch (e){
+    showToast(JSON.stringify(e))
+  }
+}
+/**
+ * 关闭当前页面方法(回到首页)
+ */
+export function back(){
+  try {
+    // @ts-ignore
+    window.android.finish()
+    // store.removeToken()
+  }catch (e){
+    history.back();
+  }
+}
+
+
+/**
+ * 播报拣货数量
+ * 播报:需要拣货number
+ * @param number
+ */
+export function playVoicePickNum(number: number) {
+  try {
+    // @ts-ignore
+    window.android.playVoicePickNum(number)
+  }catch (e){
+    showToast(JSON.stringify(e))
+  }
+}
+
+/**
+ * 扫描成功语音
+ */
+export function scanSuccess(){
+  try {
+    // @ts-ignore
+    window.android.scanSuccessVib()
+  }catch (e){
+
+  }
+}
+/**
+ * 扫描失败语音
+ */
+export function scanError(){
+  try {
+    // @ts-ignore
+    window.android.scanErrorVib()
+  }catch (e){
+
+  }
+}
+

+ 27 - 0
src/utils/dataType.js

@@ -0,0 +1,27 @@
+
+export function toMap(data, key, val, optional = {}) {
+  const map = {}
+  if (key === null) {
+    // 如果 key 为 null,直接将数组中的每个元素的值都设为 val
+    data.forEach(item => {
+      map[item] = val;
+    });
+    return map;
+  }
+  data.forEach(item => {
+    // 如果 optional.type 是 String,则处理字符串转换
+    if (optional.type === String) {
+      item[key] = item[key] + '';  // 转为字符串
+      item[key] = item[key].trim(); // 去除空格
+    }
+    // 按照 key 和 val 构建 map
+    map[item[key]] = item[val];
+  });
+  return map;
+}
+ export function barcodeToUpperCase(code){
+   if (/[a-zA-Z]/.test(code)) {
+     return  code.toUpperCase();  // 强制转换为大写字母
+    }
+   return code
+ }

+ 9 - 0
src/utils/date.ts

@@ -0,0 +1,9 @@
+export function formatDateTime(date:any) {
+  const year = date.getFullYear(); // 获取年份
+  const month = String(date.getMonth() + 1).padStart(2, '0'); // 获取月份
+  const day = String(date.getDate()).padStart(2, '0'); // 获取日期
+  const hours = String(date.getHours()).padStart(2, '0'); // 获取小时
+  const minutes = String(date.getMinutes()).padStart(2, '0'); // 获取分钟
+  const seconds = String(date.getSeconds()).padStart(2, '0'); // 获取秒钟
+  return `${year}-${month}-${day} ${hours}:${minutes}:${seconds}`;
+}

+ 41 - 0
src/utils/keydownListener.js

@@ -0,0 +1,41 @@
+import { showToast } from 'vant'
+import { ref } from 'vue'
+let typingTimer = null; // 用来控制防抖
+const barcode = ref('');
+let enterCallback = function() {}
+export function scanInit(callback) {
+  enterCallback = callback
+}
+export function openListener() {
+  console.info('已开启键盘输入监听拦截')
+  window.addEventListener('keydown', handler);
+}
+export function closeListener() {
+  console.info('已关闭键盘输入监听拦截')
+  window.removeEventListener('keydown', handler)
+  if (typingTimer) {
+    clearTimeout(typingTimer); // 清除防抖定时器
+  }
+}
+function handler(event) {
+  const focusedElement = document.activeElement;
+  if (focusedElement.tagName.toLowerCase() === 'input' ) {
+    return; // 如果焦点在输入框内,不处理
+  }
+  if (event.key.length === 1) {
+    barcode.value += event.key;
+    // if (/[a-zA-Z]/.test(barcode.value)) {
+    //   barcode.value =barcode.value.toUpperCase();  // 强制转换为大写字母
+    // }
+    // 如果有一个定时器,清除它,重新计时
+    if (typingTimer) {
+      clearTimeout(typingTimer);
+    }
+    // 设置一个新的定时器,在一定时间后处理条形码
+    typingTimer = setTimeout(() => {
+      // 处理条形码完成逻辑,比如发送请求或其他操作
+      enterCallback(barcode.value)
+      barcode.value = ''; // 清空条形码值(根据实际需要决定是否清空)
+    }, 300)
+    }
+}

+ 65 - 0
src/utils/request.ts

@@ -0,0 +1,65 @@
+// src/utils/resquest.ts
+import axios from 'axios'
+import { useStore } from '../store/modules/user'
+import { showDialog, showToast } from 'vant'
+// @ts-ignore
+import router from '@/router'
+const store = useStore()
+const service = axios.create({
+  baseURL: import.meta.env.VITE_APP_BASE_API,  // 设置基础 API 地址
+  timeout: 10000, // 设置请求超时时间
+});
+// 请求拦截器
+service.interceptors.request.use(
+  (config:any) => {
+    // 在请求发送之前做处理,如添加 token 等
+    if (store.token) {
+      config.headers['Authorization'] =store.token
+    }
+    config.headers['Source'] = 'app'
+    config.headers['Version'] = 'V6'
+    config.headers['timestamp'] = JSON.stringify(Date.now())
+    config.headers['Content-Type'] = 'application/json'
+    return config;
+  },
+  (error:any) => {
+    // 请求错误时做处理
+    return Promise.reject(error);
+  }
+);
+
+// 响应拦截器
+service.interceptors.response.use(
+  (response:any) => {
+    // 处理响应数据
+    console.log(response)
+    const res=response.data
+    if (res.code !== 200) {
+      if (res.code == 600 || res.code == 601) {
+        try {
+          // @ts-ignore
+          window.android.logout()
+        }catch (e) {
+          showDialog({
+            title: '温馨提示',
+            message: '当前登录已过期,请重新登录!',
+          }).then(() => {
+            router.push('/login')
+          });
+        }
+        return
+      }
+      showToast(res)
+      return Promise.reject(res);
+    }
+
+    console.log('Response:', res);
+    return res;
+  },
+  (error:any) => {
+    showToast('网络开小车了,请重试')
+    return Promise.reject(error);
+  }
+);
+
+export default service;

+ 29 - 0
src/views/login/login.vue

@@ -0,0 +1,29 @@
+
+<template>
+  <div class="container">
+    <van-button  type="primary" @click="onConfirm">登录</van-button>
+  </div>
+</template>
+
+<script lang="ts" setup>
+import { ref } from 'vue'
+import { login } from '@/api/login'
+import { loginType } from '@/types/login'
+import { useRouter } from 'vue-router'
+import { useStore } from '@/store/modules/user'
+import { showToast } from 'vant'
+const router = useRouter()
+  const params:loginType={
+    username:'zhaohuanhuan',
+    password:'zhaohuan123'
+  }
+const count = ref(0);
+const store = useStore()
+const onConfirm = async () => {
+  const { data } = await login(params)
+  data.warehouse='WH01'
+  store.setToken(data)
+  router.push('/')
+}
+
+</script>

+ 76 - 0
src/views/outbound/components/ContainerNoInput.vue

@@ -0,0 +1,76 @@
+<template>
+  <div class="container-no-container">
+    <van-dialog v-model:show="containerNoTrueFalseBy"
+                :beforeClose="beforeClose"
+                title="拣货容器"
+                show-cancel-button>
+      <van-field class="code-input"
+                 v-model="containerCode"
+                 ref="containerCodeRef"
+                 @keydown.enter="onKeydown"
+                 clearable
+                 placeholder="请扫描拣货容器号" />
+
+        <div @click="completion">手动补全</div>
+
+    </van-dialog>
+  </div>
+</template>
+<script setup lang="ts">
+import { ref } from 'vue'
+import { showToast } from 'vant'
+  const store = useStore()
+  const warehouse = store.warehouse
+  import { useStore } from '@/store/modules/user'
+  const containerNoTrueFalseBy=ref(false)
+  const containerCodeRef=ref(null)
+  const containerCode=ref('');
+  const scanType=ref(2)
+  const selectTask=ref([])
+  const show = async (code,type,selectTask) => {
+    selectTask.value=selectTask
+    containerNoTrueFalseBy.value = true
+    containerCode.value=code
+    scanType.value=type
+    setTimeout(()=>{
+      containerCodeRef.value?.focus()
+    },200)
+  }
+  //输入拣货容器号
+  const emit = defineEmits()
+  const  beforeClose=  (action) =>
+    new Promise(async (resolve) => {
+      if (action === 'confirm') {
+        if (containerCode.value == '') {
+          showToast('请扫描拣货容器号')
+          return resolve(false)
+        }
+        if(containerCode.value.split('-')[0]!=='JH'){
+          showToast('请使用标准拣货容器')
+          return resolve(false)
+        }
+        emit('setContainer', containerCode.value,scanType.value)
+      }
+      resolve(true)
+    });
+    const onKeydown=()=>{
+      setTimeout(()=>{
+        containerCodeRef.value.blur()
+      },300)
+    }
+    const completion=()=>{
+      containerCode.value=`JH-${warehouse}-`
+      setTimeout(()=>{
+        containerCodeRef.value?.focus()
+      },200)
+      console.log(selectTask.value,"selectTask")
+    }
+    defineExpose({show})
+</script>
+<style scoped lang="sass">
+   .container-no-container
+     .code-input
+       font-size: 22px
+       font-weight: bold
+       border-bottom: 2px solid #0077ff
+</style>

+ 65 - 0
src/views/outbound/components/PickingNoInput.vue

@@ -0,0 +1,65 @@
+<template>
+  <div class="picking-no-container">
+    <van-dialog v-model:show="pickingNoTrueFalseBy"
+                :beforeClose="beforeClose"
+                title="拣货任务号" show-cancel-button>
+      <van-field class="code-input"
+                 v-model="pickingCode"
+                 ref="pickingNoRef"
+                 clearable
+                 @keydown.enter="onKeydown"
+                 placeholder="请扫描拣货任务号" />
+    </van-dialog>
+  </div>
+</template>
+<script setup lang="ts">
+  import { ref } from 'vue'
+  import { showToast } from 'vant'
+  const store = useStore()
+  const warehouse = store.warehouse
+  import { useStore } from '@/store/modules/user'
+  const pickingNoTrueFalseBy=ref(false)
+  const pickingNoRef=ref(null)
+  const pickingCode=ref('');
+  const show = () => {
+    pickingNoTrueFalseBy.value = true
+    pickingCode.value=''
+    setTimeout(()=>{
+      pickingNoRef.value.focus()
+    },300)
+  }
+  //输入拣货任务号查询任务
+  const emit = defineEmits()
+  const  beforeClose=  (action) =>
+    new Promise(async (resolve) => {
+      if (action === 'confirm') {
+        if (pickingCode.value == '') {
+          showToast('请输入拣货任务号')
+          return resolve(false)
+        }
+        emit('loadData', pickingCode.value)
+        // const { taskList } = await getPickingTask(warehouse, pickingCode.value)
+        // if (taskList.value.length > 0) {
+        //
+        //   resolve(true)
+        // } else {
+        //   showToast('当前拣货任务号暂未查询到任务,请重新输入')
+        //   return resolve(false)
+        // }
+      }
+      resolve(true)
+    });
+  const onKeydown=()=>{
+    setTimeout(()=>{
+      pickingNoRef.value.blur()
+    },300)
+  }
+  defineExpose({show})
+</script>
+<style scoped lang="sass">
+    .picking-no-container
+      .code-input
+        font-size: 22px
+        font-weight: bold
+        border-bottom: 2px solid #0077ff
+</style>

+ 51 - 0
src/views/outbound/picking/list/hooks/list.ts

@@ -0,0 +1,51 @@
+import { ref } from 'vue'
+// @ts-ignore
+import { getPickingDetail, getPickingFirst } from '@/api/picking'
+// @ts-ignore
+import router from '@/router'
+import { closeToast, showLoadingToast } from 'vant'
+interface PickingFirstResponse {
+  data?: string; // PickingFirst API 返回的数据类型
+}
+
+interface PickingDetailResponse {
+  data: any; // PickingDetail API 返回的数据类型
+}
+
+export const  fetchPickingData= async(warehouse: string)=> {
+    // 获取第一个拣货码
+    const { data: pickingCode }: PickingFirstResponse = await getPickingFirst({
+      warehouse,
+      code: 'OWNER'
+    });
+    return {
+      pickingCode
+    }
+}
+export const getPickingTask = async (warehouse: string,pickingCode:any) => {
+  const taskList = ref<any>([]); // 用于存储拣货详情
+  const expectedQuantity=ref(0)
+     // 获取拣货数据的函数
+      showLoadingToast({
+        duration: 0,
+        forbidClick: true,
+        message: '加载中...',
+      });
+      // 获取拣货详情
+      const { data: pickingDetails }: PickingDetailResponse = await getPickingDetail({
+        warehouse,
+        code: pickingCode
+      });
+      closeToast()
+      // 更新拣货详情F
+        taskList.value = pickingDetails
+        if(pickingDetails.length>0){
+          expectedQuantity.value= pickingDetails.reduce((sum:number, item:any) => {
+            return sum + (item.expectedQuantity ?? 0)
+          }, 0)
+        }
+      return {
+        taskList,
+        expectedQuantity
+      }
+  }

+ 25 - 0
src/views/outbound/picking/list/hooks/lotNum.ts

@@ -0,0 +1,25 @@
+export function isLot (selectTask:any, params:any){
+  // 存储已拣货的 (container, barcode) -> Set(lotNum)
+  const taskMap = new Map();
+  // 将 container 和 barcode 作为 key,lotNum 使用 Set 存储
+  for (let i = 0; i < selectTask.length; i++) {
+    const { container, barcode, lotNum } = selectTask[i];
+    const key = `${container}_${barcode}`;
+    if (!taskMap.has(key)) {
+      taskMap.set(key, new Set());
+    }
+    taskMap.get(key).add(lotNum);
+  }
+  // 检查数据是否有相同 container 和 barcode 不同 lotNum 的情况
+  for (let i = 0; i < params.length; i++) {
+    const { container, barcode, lotNum } = params[i];
+    const key = `${container}_${barcode}`;
+    if (taskMap.has(key)) {
+      const lotNumSet = taskMap.get(key);
+      if (!lotNumSet.has(lotNum)) {
+        return true;  // 找到不同的 lotNum,返回
+      }
+    }
+  }
+  return false;
+}

+ 588 - 0
src/views/outbound/picking/list/index.vue

@@ -0,0 +1,588 @@
+<template>
+  <div class="container">
+    <van-nav-bar
+      title="拣货任务"
+      left-text="返回"
+      left-arrow
+      fixed
+      placeholder
+      @click-left="back"
+    >
+      <template #right>
+        <div style="color: #fff" @click="onSelectMode({key:'picking'})">开始作业</div>
+        <van-icon name="list-switch" size="20"   @click="onClickRight" />
+      </template>
+    </van-nav-bar>
+    <van-pull-refresh v-model="loading" @refresh="onRefresh" style="min-height: 93.1vh;">
+     <div v-if="locationList.length>0">
+      <div class="code">
+        <div class="code-title">
+          <div>{{ taskItem.length>0?pickingNo:'无效任务' }}</div>
+          <div class="code-tips"><van-notice-bar :background="'none'" :speed="50" :text="tips()" /></div>
+          <div class="code-count"><span>{{ quantity }}</span>/{{ allQuantity }}</div>
+        </div>
+        <van-field class="code-input"
+                   v-model="containerNo"
+                   readonly
+                   @click="onContainerNo(containerNo===''?2:scanType,selectTask)"
+                   placeholder="拣货容器号" >
+          <template #button>
+            <van-button size="mini" type="primary" v-if="containerNo===''" plain  @click="onContainerNo(2,selectTask)" >设置拣货容器</van-button>
+            <van-button size="mini" type="primary" v-else plain  @click="onContainerNo(scanType,selectTask)" >更换拣货容器</van-button>
+          </template>
+        </van-field>
+      </div>
+      <van-row  class="list">
+        <van-col span="7">
+          <div class="left">
+            <div class="item " :class="index==activeIndex?'active':allPicking(location)"
+                 v-for="(location,index) in locationList"
+                 @click="onLocation(index)">
+              {{ location.location }}
+            </div>
+          </div>
+        </van-col>
+        <van-col span="17">
+          <div class="right">
+            <div class="right-list"  v-for="(item,index) in locationList[activeIndex].list"
+                 :class="activeClass(item)">
+              <div>{{ ownerMap[item.owner] || item.owner }}</div>
+              <div class="content">
+                <div class="c-left">
+                  <div class="c-left-count">{{ item.expectedQuantity }}</div>
+                  <div class="c-left-tips">数量</div>
+                </div>
+                <div class="c-right">
+                  <div style="font-weight: bold;">{{ item.barcode }}</div>
+                  <div>{{ item.name }}</div>
+                </div>
+              </div>
+              <van-field class="input" ref="scanCountRef" label-width="50px" v-model="item.count" type="number" :min="1"
+                         :max="item.expectedQuantity"
+                         @keydown.enter="onCount(item,0)"
+                         label="实拣数" placeholder="请输实拣数量"
+                          >
+                <template #button>
+                  <van-button size="mini" type="primary"  plain  @click="jump(item)"  :loading="jumpLoading"  loading-text="加载中...">跳过</van-button>
+                </template>
+              </van-field>
+              <div class="wave">
+                <div v-for="wave in item.binds" class="wave-item">
+                  <div>{{ wave.waveNo }}</div>
+                  <div>格口:{{ wave.bin }},数量:{{ wave.quantity }}</div>
+                </div>
+              </div>
+            </div>
+          </div>
+        </van-col>
+      </van-row>
+     </div>
+      <div v-if="locationList.length==0" >
+        <van-empty
+          image-size="100"
+          description="暂无拣货数据"
+        />
+      </div>
+    </van-pull-refresh>
+    <van-action-sheet
+      v-model:show="modeTrueFalseBy"
+      :actions="actions"
+      cancel-text="取消"
+      close-on-click-action
+      @select="onSelectMode"
+    />
+    <!--    拣货容器号-->
+    <container-no-input ref="containerNoInputRef" @setContainer="setContainer"  />
+    <!--    拣货任务号-->
+    <picking-no-input  ref="pickingNoInputRef" @loadData="loadData" />
+    <van-floating-bubble v-if="locationList.length>0"  gap="50" axis="xy" magnetic="x"  @click="onContainerNo(containerNo===''?2:scanType,selectTask)">容器</van-floating-bubble>
+
+  </div>
+</template>
+<script lang="ts" setup>
+import { computed, nextTick, onMounted, onUnmounted, ref } from 'vue'
+import { showDialog, showToast } from 'vant'
+import { fetchPickingData, getPickingTask } from '@/views/outbound/picking/list/hooks/list'
+import { getOwnerList } from '@/hooks/basic'
+import { useRouter,useRoute } from 'vue-router'
+import { setPickingDetail } from '@/api/picking'
+const router = useRouter()
+const route = useRoute()
+import { useStore } from '@/store/modules/user'
+const store = useStore()
+import { back, getHeader, playVoicePickNum, scanError, scanSuccess } from '@/utils/android'
+import { closeListener, openListener, scanInit } from '@/utils/keydownListener'
+import PickingNoInput from '@/views/outbound/components/PickingNoInput.vue'
+import ContainerNoInput from '@/views/outbound/components/ContainerNoInput.vue'
+import { formatDateTime } from '@/utils/date'
+import { isLot } from '@/views/outbound/picking/list/hooks/lotNum'
+import { barcodeToUpperCase } from '@/utils/dataType'
+onUnmounted(() => {
+  closeListener()
+})
+try {
+  getHeader()
+}catch (error) {
+  router.push('/login')
+}
+const warehouse = store.warehouse
+const containerNo = ref('')
+//容器号ref
+const scanCountRef = ref(null)
+onMounted(() => {
+  openListener()
+  setTimeout(() => {
+    scanInit(_handlerScan)
+  },300)
+})
+const pickingNo=ref('')
+//拣货容器号
+const containerNoTrueFalseBy=ref(false)
+// 操作面板
+const modeTrueFalseBy=ref(false)
+// 获取货主
+const { ownerMap, getOwnerData } = getOwnerList()
+let taskMap = ref({})
+//组合后库位
+let locationList = ref([])
+//默认第一条数据激活
+let activeIndex = ref(0)
+//扫描类型
+const scanType = ref(1)
+//已经拣货任务
+const selectTask=ref([])
+
+const scanBarcode=ref('')
+const taskItem=ref([])
+// 切换容器号
+const containerNoInputRef=ref(null)
+const onContainerNo=(type,task)=>{
+  setTimeout(()=>{
+    containerNoInputRef.value?.show(containerNo.value,type,task)
+  },500)
+}
+const allQuantity=ref(0)
+//加载数据
+const loadData =  async (pickingCode) => {
+  pickingNo.value=pickingCode
+  //获取第一个拣货单号
+  const { taskList,expectedQuantity }=await getPickingTask(warehouse,pickingCode)
+  if(taskList.value.length==0){
+    return
+  }
+  allQuantity.value=expectedQuantity.value
+  taskItem.value=taskList.value
+  // 对数组进行分组
+  taskMap.value = {}
+  taskItem.value.forEach(item => {
+    item.count=''
+    const { location } = item
+    // 使用对象的简写形式初始化分组
+    if (!taskMap.value[location]) {
+      taskMap.value[location] = { location, list: [],scanLocation:'',scanBarcode:'' }
+    }
+    taskMap.value[location].list.push(item)
+  })
+  locationList.value = Object.values(taskMap.value)
+  // 将已拣货的数据放到一个数组
+  selectTask.value = taskItem.value
+    .filter(item => item.operationTime!=null)  // 过滤出有 productionDate 且不为空的对象
+    .map(item => {
+      return {
+        barcode: item.barcode,
+        location: item.location,
+        lotNum:item.lotNum,
+        line:item.line,
+        operationTime: item.operationTime,
+        container: item.container
+      };
+    });
+  if(selectTask.value.length>0){
+    getDefContainer(selectTask.value)
+  }else {
+    // onContainerNo()
+  }
+}
+const setContainer=(code,type)=>{
+  containerNo.value=code
+  onScan(type)
+}
+const getPickingCode= async()=>{
+  const { pickingCode } = await fetchPickingData(warehouse)
+  if(pickingCode!=null){
+    pickingNo.value=pickingCode
+    await loadData(pickingCode)
+  }else {
+    await router.push('/picking-task')
+  }
+}
+
+if(route.query.code){
+  loadData(route.query.code)
+}else {
+  getPickingCode()
+}
+getOwnerData()
+// 计算已成功数量
+const quantity = computed(() => {
+  return taskItem.value.reduce((sum, item) => {
+    return Number(sum) + (Number(item.quantity) ?? 0)
+  }, 0)
+})
+
+//如果有执行过的数据,将时间最近的容器号放到容器里
+const getDefContainer=(selectTask)=>{
+  // 获取当前时间
+  const currentTime = new Date();
+  // 使用 reduce 方法找到距离当前时间最近的 operationTime
+  const closestItem = selectTask.reduce((closest, current) => {
+    const currentOperationTime = new Date(current.operationTime);
+    const closestOperationTime = new Date(closest.operationTime);
+    // 计算当前操作时间与当前时间的差值
+    const currentDiff = Math.abs(currentOperationTime - currentTime);
+    const closestDiff = Math.abs(closestOperationTime - currentTime);
+    // 比较差距,返回差距最小的对象
+    return currentDiff < closestDiff ? current : closest;
+  });
+  containerNo.value=closestItem.container
+  onScan(2)
+}
+const messageTips=ref('')
+const tips = () => {
+  if (scanType.value==1) {
+    return '请扫描容器号'
+  }else if(scanType.value==2){
+    return '请扫描下一拣货库位'
+  }else if(scanType.value==3){
+    return '请扫描商品条码'
+  }else {
+    return messageTips.value
+  }
+}
+//切换不同库位
+const onLocation = (index) => {
+  activeIndex.value = index
+    nextTick(() => {
+      onScan(2)
+    })
+}
+//扫描监听
+const onScan = (type) => {
+  nextTick(() => {
+    scanType.value = type
+  })
+}
+
+const _handlerScan=(code)=> {
+  scanBarcode.value=code
+  const modelLocative=locationList.value[activeIndex.value]
+  if(scanType.value===2){
+    if(containerNo.value == '') {
+      showToast('请先扫描容器号')
+      return
+    }
+    if(taskMap.value[code.toUpperCase()]){
+      activeIndex.value = locationList.value.findIndex(item => item.location === barcodeToUpperCase(code))
+      onScan(3)
+      scanSuccess()
+    }else{
+      scanError()
+      showToast('无效库位!请检查扫描库位')
+    }
+  }
+  if(scanType.value===3){
+    const barcode = [...new Set(
+      modelLocative.list
+        .flatMap(item => [item.barcode, item.barcodeAs])
+        .filter(value => value !== null )
+    )]
+    if (barcode.some(item => barcodeToUpperCase(item) ===  barcodeToUpperCase(code))) {
+        locationList.value[activeIndex.value].list=modelLocative.list.reduce((acc, item) => {
+          if (item.barcode === code) {
+            acc.unshift(item);
+          } else {
+            acc.push(item);
+          }
+          return acc;
+        }, [])
+        playVoicePickNum(locationList.value[activeIndex.value].list[0].expectedQuantity)
+        locationList.value[activeIndex.value].list[0].count=locationList.value[activeIndex.value].list[0].expectedQuantity
+        onScan(4)
+        setTimeout(()=>{
+          onCount(locationList.value[activeIndex.value].list[0],0)
+        },200)
+    }else{
+      scanError()
+      showToast('无效条码!请检查扫描条码')
+    }
+  }
+}
+// 进行条件验证
+const validate = (data) => {
+  if (containerNo.value === '') {
+    showToast('请先扫描拣货容器');
+    return false;
+  }
+  if (scanType.value === 2) {
+    showToast('请先扫描库位');
+    return false;
+  }
+  if (scanType.value === 3) {
+    showToast('请先扫描条码');
+    return false;
+  }
+  if (data.count < 0) {
+    showToast('拣货数量无效');
+    return false;
+  }
+  if (data.count > data.expectedQuantity) {
+    showToast('拣货数量不能大于所需数量');
+    return false;
+  }
+  if (isLot(selectTask.value, [data])) {
+    showToast('当前容器下已有其他批次产品,请更换容器号');
+    return false;
+  }
+  return true;
+}
+//输入数量
+const jumpLoading=ref(false);
+const onCount=(item,type)=>{
+  const data=JSON.parse(JSON.stringify(item))
+  data.container=containerNo.value
+  data.operationTime=formatDateTime(new Date())
+  if(type==0){
+    data.quantity=data.count
+  }else {
+    data.quantity=0
+  }
+  const params=[data]
+  // 验证数据的有效性
+  if (!validate(data)) return;
+  if(type!==0){
+    jumpLoading.value=true
+  }
+  setPickingDetail(params).then((res)=>{
+    jumpLoading.value=false
+    if(!res.data){
+      showDialog({
+        title:'温馨提示',
+        message:'该库位条码存在取消单,任务已被刷新,请将当前货品归还原库位'
+      }).then(() => {
+        loadData(pickingNo.value)
+      })
+      return
+    }
+    if(!selectTask.value.find(task => task.line === data.line)){
+      const task={
+        barcode: data.barcode,
+        location:data.location,
+        lotNum: data.lotNum,
+        line:data.line,
+        operationTime: data.operationTime,
+        container:data.container
+      }
+      selectTask.value.push(task)
+      locationList.value[activeIndex.value].list[0].operationTime=params[0].operationTime
+    }
+    //验证库位里的所有商品是否都存在拣货时间
+    const allOperationTimeExist = locationList.value[activeIndex.value].list.every(item => item.operationTime);
+    if(allOperationTimeExist){
+      onScan(2)
+    }else {
+      onScan(3)
+    }
+    scanSuccess()
+    if(selectTask.value.length===taskItem.value.length){
+      showDialog({
+        title:'温馨提示',
+        message:'任务已经完成,是否回到选择任务界面'
+      }).then(() => {
+        router.push('/picking-task')
+      }).catch(() => {
+        loadData(pickingNo.value)
+      })
+    }
+  }).catch((err)=>{
+    messageTips.value=err.message
+    scanError()
+    jumpLoading.value=false
+  })
+}
+
+// 跳过拣货
+const jump=(item)=>{
+  onCount(item,1)
+}
+
+//切换模式
+const actions = [
+  { name: '任务获取',key:'task' },
+  { name: '任务号作业' ,key:'picking'},
+];
+const onClickRight = () => {
+  modeTrueFalseBy.value=true
+}
+const pickingNoInputRef=ref(null)
+const onSelectMode=(value) => {
+  if(value.key=='task'){
+    router.push('/picking-task')
+  }else if(value.key=='picking'){
+    pickingNoInputRef.value?.show()
+  }
+}
+//库位商品拣货完成高亮 allActive
+const allPicking = (location) => {
+  const all = location.list.every(item => item.operationTime);
+  if(all){
+    return 'allActive'
+  }
+}
+//库位商品高亮
+const activeClass=(item)=>{
+  const modelLocative = locationList.value[activeIndex.value]
+  if (
+    modelLocative.location === item.location &&
+    (
+      barcodeToUpperCase(item.barcode) === barcodeToUpperCase(scanBarcode.value)||
+      (item.barcodeAs=== barcodeToUpperCase(scanBarcode.value) && scanBarcode.value !== '')
+    ) &&
+    item.operationTime === null
+  ) {
+    return 'active'
+  }else if(item.operationTime!=null){
+    return 'allActive'
+  }
+
+}
+//刷新页面
+const loading = ref(false)
+const onRefresh = () => {
+  setTimeout(() => {
+    loadData(pickingNo.value)
+    showToast('刷新成功')
+    loading.value = false
+  }, 1000)
+}
+</script>
+<style scoped lang="sass">
+.container
+  .code
+    height: 67px
+    padding: 5px 10px
+    background: #f2f8fe
+    box-sizing: border-box
+
+    .code-title
+      display: flex
+      justify-content: space-between
+
+      .code-tips
+        color: #ed6a0c
+        flex: 1
+
+      .code-count
+        font-size: 16px
+        font-weight: bold
+
+        span
+          color: #0077ff
+
+    .code-input
+      font-size: 16px
+      font-weight: bold
+      background: #f2f8fe
+      padding: 2px 10px
+      border-bottom: 2px solid #0077ff
+
+  .list
+    overflow: scroll
+
+    .left
+      background: #f2f8fe
+      padding: 2px 5px
+      height: 83.1vh
+      overflow: scroll
+      box-sizing: border-box
+
+      .item
+        font-size: 14px
+        background: #fff
+        padding: 10px 5px
+        margin-bottom: 6px
+        border-radius: 8px 0 0 8px
+        box-sizing: border-box
+        word-wrap: break-word
+        font-weight: bold
+
+      .active
+        background: #1989fa
+        color: #fff
+        position: relative
+        right: -5px
+
+      .allActive
+        background: #72dc41
+        color: #fff
+
+    .right
+      height: 83.1vh
+      overflow: scroll
+      box-sizing: border-box
+      text-align: left
+      padding: 2px 5px
+      .right-list
+        padding: 10px
+        margin-bottom: 5px
+        border-bottom: 1px solid #D3D3D3
+        border-radius: 0 8px 8px 0
+        .content
+          display: flex
+          justify-content: space-between
+          align-items: center
+          .c-left
+            width: 25%
+            text-align: center
+            position: relative
+
+            .c-left-tips
+              position: absolute
+              left: 0
+              right: 0
+              top: 0
+              bottom: 0
+              color: #D3D3D3
+              z-index: -10
+              opacity: .7
+              font-size: 20px
+
+            .c-left-count
+              font-weight: bold
+              font-size: 20px
+          .c-right
+            flex: 0 0 75%
+            max-width: 75%
+      .right-list:last-child
+        border-bottom: none
+      .active
+        background: #c7e3ff
+        opacity: .8
+      .allActive
+        background: #72dc41
+        opacity: .8
+      .wave
+        padding: 5px
+
+        .wave-item
+          display: flex
+          justify-content: space-between
+          font-size: 12px
+
+      .input
+        font-size: 14px
+        font-weight: bold
+        padding: 5px 10px
+        background: none
+        border-bottom: 2px solid #1989fa
+
+</style>

+ 23 - 0
src/views/outbound/picking/task/hooks/task.ts

@@ -0,0 +1,23 @@
+import { ref } from 'vue';
+// @ts-ignore
+import { showToast } from 'vant'
+// @ts-ignore
+import { getPickingTask } from '@/api/picking'
+interface pickingListResponse {
+  data: any; // API 返回的数据类型
+}
+
+export const getTaskList = (warehouse:string) => {
+  const taskList = ref<any>([]);
+  // 获取拣货数据的函数
+  const getTaskData = async () => {
+    const { data }: pickingListResponse = await getPickingTask({ warehouse });
+    // 查询货主
+    taskList.value = data
+  };
+
+  return {
+    taskList,
+    getTaskData,
+  };
+};

+ 351 - 0
src/views/outbound/picking/task/index.vue

@@ -0,0 +1,351 @@
+<template>
+  <div class="container">
+    <van-nav-bar
+      title="任务获取"
+      left-text="返回"
+      left-arrow
+      fixed
+      placeholder
+      @click-left="back"
+      >
+      <template #right>
+        <div style="color: #fff" @click="onClickRight">开始作业</div>
+        <van-icon name="search" size="20"   @click="onClickRight" />
+      </template>
+    </van-nav-bar>
+    <van-pull-refresh v-model="loading" @refresh="onRefresh" style="min-height: 93.1vh;">
+      <table border="1" style="width: 100%;border-collapse: collapse;text-align: center;table-layout: fixed;">
+        <thead>
+        <tr>
+          <th style="width: 100px">货主</th>
+          <th>特殊标记</th>
+          <th>承运商</th>
+          <th>类型</th>
+          <th>数量</th>
+          <th>操作</th>
+        </tr>
+        </thead>
+        <tbody>
+        <tr v-for="(row, rowIndex) in taskList" :key="rowIndex">
+          <td style="word-wrap: break-word" v-if="isFirstInGroup(row, rowIndex)" :rowspan="getRowspan(row, rowIndex)">
+            {{ ownerMap[row.owner] || row.owner }}
+          </td>
+          <td style="word-wrap: break-word;">{{ row.ruleName }}</td>
+          <td style="word-wrap: break-word;">{{ row.carrier }}</td>
+          <td style="word-wrap: break-word;">{{ row.typeDescribe }}</td>
+          <td>{{ row.count }}</td>
+          <td>
+            <van-button type="primary" v-if="row.type=='Y'|| row.type=='N'" @click="onCreateTask(row)">获取</van-button>
+            <van-button type="success" v-else @click="onTaskList(row)">查看</van-button>
+          </td>
+        </tr>
+        </tbody>
+      </table>
+      <van-back-top right="80vw" bottom="10vh" />
+    </van-pull-refresh>
+    <van-dialog v-model:show="orderTrueFalseBy"
+                :title="model.type=='*'?'攒单任务':'订单列表'"
+                :show-cancel-button="model.type!='*'"
+                :show-confirm-button="model.type!='*'"
+                confirm-button-text="生成任务"
+                close-on-click-overlay
+                :beforeClose="onBuildTask"
+    >
+      <div  v-if="model.type!='*'">
+        <van-checkbox  class="order-checkbox" v-model="isCheckAll" :indeterminate="isIndeterminate" @change="checkAllChange">全选</van-checkbox>
+      </div>
+      <div class="order-list">
+        <div v-if="model.type=='*'">
+          <van-cell v-for="(item,index) in taskDetailList" class="order-cell" center
+                    is-link value="获取" @click="onSubCreateTask(item)" >
+            <template #title>
+              <div style="display: flex;justify-content: space-between">
+                <div>{{item.carrierName}}</div>
+                <div>{{item.residualOrderQty}}单</div>
+                <div>{{item.itemQty}}件</div>
+              </div>
+<!--              <span>{{item.carrierName}}:{{item.residualOrderQty}}单</span>-->
+            </template>
+          </van-cell>
+        </div>
+        <div v-else>
+          <van-checkbox-group  v-model="checkedResult" @change="checkedResultChange">
+            <van-checkbox class="order-item" v-for="(item,index) in taskDetailList" :key="index" :name="item">
+              订单号:{{ item.orderNo }}
+            </van-checkbox>
+          </van-checkbox-group>
+        </div>
+      </div>
+    </van-dialog>
+    <van-dialog v-model:show="createTaskTrueFalseBy"
+                :beforeClose="beforeClose"
+                title="生成任务" show-cancel-button  >
+      <van-form>
+        <van-field
+          v-model="count"
+          center
+          border
+          label="获取任务数量"
+          placeholder="请输入数量"
+          type="number"
+          name="pattern"
+          ref="countRef"
+          :rules="[{ pattern, message: '请输入正确数量' }]"
+        >
+        </van-field>
+        <div v-if="model.type" class="tips">
+          <div class="tips-item">货主:{{ownerMap[model.owner]}}</div>
+          <div class="tips-item">承运商:{{model.carrier}}</div>
+          <div class="tips-item">类型:{{model.typeDescribe}}</div>
+          <div class="tips-item" @click="count=modelCount">数量:<span class="all-count">{{modelCount}}</span></div>
+          <div class="tips-item" v-if="model.warehouseAttribute">属性仓:{{model.warehouseAttribute}}</div>
+          <div class="tips-item" v-if="model.issuePartyName">店铺:{{model.issuePartyName}}</div>
+          <div class="tips-item" v-if="model.ruleName">规则:{{model.ruleName}}</div>
+          <div class="tips-item" v-if="model.remark">备注:{{model.remark}}</div>
+        </div>
+      </van-form>
+    </van-dialog>
+    <!--    拣货任务号-->
+    <picking-no-input  ref="pickingNoInputRef" @loadData="loadTask" />
+  </div>
+</template>
+
+<script lang="ts" setup>
+import { useRouter } from 'vue-router'
+import { getTaskList } from '@/views/outbound/picking/task/hooks/task'
+import { computed, nextTick, ref } from 'vue'
+import { showToast } from 'vant'
+import { basicStore } from '@/store/modules/basic'
+import { createPickingTask, getPickingTaskDetail } from '@/api/picking'
+import { useStore } from '@/store/modules/user'
+import { back } from '@/utils/android'
+import PickingNoInput from '@/views/outbound/components/PickingNoInput.vue'
+const router = useRouter()
+const store = basicStore()
+const storeUser = useStore()
+const warehouse = storeUser.warehouse
+const count=ref('')
+const countRef=ref(null)
+const pattern=/^[1-9]\d*$/
+const orderTrueFalseBy = ref(false) //订单子任务
+const createTaskTrueFalseBy = ref(false)//生成数量
+const offset = ref({ x: 100, y: 500 })
+const { taskList, getTaskData } = getTaskList(warehouse)
+const ownerMap = ref({})
+const loadData = async () => {
+  ownerMap.value = store.ownerMap
+  await getTaskData()
+}
+loadData()
+/**
+ * 获取任务列表
+ */
+const isCheckAll = ref(false)
+const checkedResult = ref([])
+const isIndeterminate = ref(false)
+const model=ref({})
+const subModel=ref({})
+const modelCount = computed(() => subModel.value.residualOrderQty?subModel.value.residualOrderQty:model.value.count)
+const taskDetailList=ref([])
+const onTaskList=async (row:Object)=>{
+  model.value=row
+  const params = {
+    warehouse,
+    ownerList:row.owner.split(','),
+    carrierList:row.carrier ? row.carrier.split(',') : [],
+    type:row.type,
+    orderNoList:row.matchedOrderNoList
+  }
+  const { data }: pickingListResponse = await getPickingTaskDetail(params)
+  taskDetailList.value=data
+  isIndeterminate.value=false
+  if(data.length==1){
+    checkedResult.value=data
+  }else {
+    checkedResult.value=[]
+  }
+
+  orderTrueFalseBy.value = true
+}
+/**
+ * 查看任务子列表
+ */
+const checkAllChange = (val: boolean) => {
+  checkedResult.value = val ? taskDetailList.value : []
+  isIndeterminate.value = false
+}
+
+const checkedResultChange = (value: string[]) => {
+  const checkedCount = value.length
+  isCheckAll.value = checkedCount === taskDetailList.value.length
+  isIndeterminate.value = checkedCount > 0 && checkedCount < taskDetailList.value.length
+}
+
+const onBuildTask=(action)=>
+  new Promise((resolve) => {
+    if (action === 'confirm') {
+      if (checkedResult.value.length == 0) {
+        showToast('请先选择订单')
+        return resolve(false)
+      }
+      createPicking()
+    }
+    resolve(true)
+  })
+/**
+ * 确认生成任务
+ * @param action
+ */
+const  beforeClose= (action) =>
+  new Promise((resolve) => {
+    if(action==='confirm'){
+      if(count.value==''){
+        showToast('请输入拣货数量')
+        return resolve(false)
+      }
+      if(Number(count.value)>modelCount.value){
+        showToast('任务数量不能大于最大可生成数量'+modelCount.value)
+        return resolve(false)
+      }
+      orderTrueFalseBy.value=false
+      resolve(true)
+      createPicking()
+    }
+    resolve(true)
+  });
+/**
+ * 创建任务数量
+ * @param row
+ */
+const onCreateTask=(row)=>{
+  subModel.value={}
+  model.value=row
+  createTaskTrueFalseBy.value=true
+    if(row.count<=60){
+      count.value=row.count
+    }else {
+      countRefFocus()
+    }
+}
+const onSubCreateTask=(row)=>{
+  subModel.value=row
+  if(row.residualOrderQty<=60){
+    count.value=row.residualOrderQty
+  }else {
+    countRefFocus()
+  }
+  createTaskTrueFalseBy.value=true
+}
+const countRefFocus=()=>{
+  count.value=''
+  setTimeout(()=>{
+    countRef.value.focus()
+  },300)
+}
+const createPicking = () => {
+  const splitStringIfExists = value => (typeof value === 'string' && value.trim() !== '') ? value.split(',') : undefined;
+
+  let carriers = [];
+  let orderNoList = [];
+  let counts: number = count.value;
+
+  if (['S', 'U', 'M'].includes(model.value.type)) {
+    orderNoList = checkedResult.value.map(item => item.orderNo);
+    carriers = [...new Set(checkedResult.value.map(item => item.carrier))];
+    counts = orderNoList.length;
+  } else {
+    orderNoList=model.value.matchedOrderNoList
+    carriers = subModel.value.carrier
+      ? splitStringIfExists(subModel.value.carrier)
+      : splitStringIfExists(model.value.carrier);
+  }
+  const params = {
+    warehouse,
+    owners: splitStringIfExists(model.value.owner),
+    carriers,
+    type: model.value.type,
+    uid: subModel.value.uid || undefined,
+    orderNoList,
+    count: counts,
+  };
+  createPickingTask(params).then(data => {
+    router.push('/')
+    loadData()
+  })
+};
+const pickingNoInputRef=ref(null)
+const onClickRight = () => {
+  pickingNoInputRef.value?.show()
+};
+const loadTask=(code)=>{
+  router.push({name:'PickingList',query: { code }})
+}
+
+/**
+ * 合并单元格
+ * @param row
+ * @param rowIndex
+ */
+const isFirstInGroup = (row, rowIndex) => {
+  return rowIndex === 0 || taskList.value[rowIndex - 1].owner !== row.owner
+}
+const getRowspan = (row, rowIndex) => {
+  let rowspan = 1
+  for (let i = rowIndex + 1; i < taskList.value.length; i++) {
+    if (taskList.value[i].owner === row.owner) {
+      rowspan++
+    } else {
+      break
+    }
+  }
+  return rowspan
+}
+
+/**
+ * 下拉刷新
+ */
+const loading = ref(false)
+const onRefresh = () => {
+  setTimeout(() => {
+    loadData()
+    showToast('刷新成功')
+    loading.value = false
+  }, 1000)
+}
+</script>
+<style scoped lang="sass">
+::v-deep .order-cell .van-cell__title
+  text-align: left !important
+::v-deep .order-cell .van-cell__value
+  width: 20% !important
+  flex: 0 0 20% !important
+::v-deep .van-field__control
+  font-size: 20px
+.order-checkbox
+  padding: 0 20px
+  background: #fff
+.order-list
+  padding: 5px 20px
+  min-height: 20vh
+  max-height: 50vh
+  overflow: scroll
+  .order-item
+    padding: 5px 0
+  .order-cell
+    padding: 5px 0
+.all-count
+  font-size: 12px
+  color: #0077ff
+  text-decoration-line: underline
+  text-decoration-color: #0077ff
+.tips
+  display: flex
+  justify-content: space-between
+  justify-items: center
+  flex-wrap: wrap
+  padding: 10px 20px
+  font-size: 12px
+  .tips-item
+    width: 50%
+    text-align: left
+</style>

+ 84 - 0
src/views/test.vue

@@ -0,0 +1,84 @@
+<template>
+  <div>
+    <input ref="inputValueRef" v-model="inputValue" placeholder="请输入内容" @keydown.enter="handleInputKeydown" />
+    <p>扫描的条形码值: {{ barcode }}</p>
+  </div>
+</template>
+
+<script>
+import { ref, onMounted, onBeforeUnmount } from 'vue';
+import { showToast } from 'vant'
+
+export default {
+  setup() {
+    const barcode = ref('');
+    const inputValue = ref('');
+    const inputValueRef=ref(null);
+    let typingTimer = null; // 用来控制防抖
+    const debounceDelay = 300; // 防抖延迟,300ms足够让条形码扫描器输入完成
+
+    // 处理全局的键盘事件
+    const handleGlobalKeydown = (event) => {
+      // 判断焦点是否在输入框中
+      const focusedElement = document.activeElement;
+      if (focusedElement.tagName.toLowerCase() === 'input' || focusedElement.tagName.toLowerCase() === 'textarea') {
+        return; // 如果焦点在输入框内,不处理条形码输入
+      }
+      // 处理条形码扫描输入
+      if (event.key.length === 1) { // 只处理字符键
+        barcode.value += event.key;
+
+        // 如果有一个定时器,清除它,重新计时
+        if (typingTimer) {
+          clearTimeout(typingTimer);
+        }
+
+        // 设置一个新的定时器,在一定时间后处理条形码
+        typingTimer = setTimeout(() => {
+          // 处理条形码完成逻辑,比如发送请求或其他操作
+          console.log('扫描完成:', barcode.value);
+          showToast(inputValue.value)
+          // barcode.value = ''; // 清空条形码值(根据实际需要决定是否清空)
+        }, debounceDelay);
+      }
+    };
+
+    // 处理输入框的键盘事件
+    const handleInputKeydown = (event) => {
+        if (event.key === 'Enter') {
+          event.preventDefault();
+          setTimeout(() => {
+            inputValueRef.value?.blur()
+          }, 300)
+        }
+
+
+
+      // 在输入框内,避免条形码输入逻辑
+    };
+
+    // 初始化时绑定全局键盘事件
+    onMounted(() => {
+      window.addEventListener('keydown', handleGlobalKeydown);
+    });
+
+    // 组件销毁时移除全局键盘事件监听
+    onBeforeUnmount(() => {
+      window.removeEventListener('keydown', handleGlobalKeydown);
+      if (typingTimer) {
+        clearTimeout(typingTimer); // 清除防抖定时器
+      }
+    });
+
+    return {
+      barcode,
+      inputValue,  // 输入框的绑定值
+      handleInputKeydown, // 输入框的键盘事件处理
+    };
+  },
+};
+</script>
+
+<style scoped>
+/* 样式部分 */
+</style>

+ 6 - 0
src/vite-env.d.ts

@@ -0,0 +1,6 @@
+/// <reference types="vite/client" />
+declare module"*.vue" {
+  import { DefineComponent } from "vue"
+  const component:DefineComponent<{},{},any>
+  export default component
+}

+ 26 - 0
tsconfig.app.json

@@ -0,0 +1,26 @@
+{
+  "compilerOptions": {
+    "tsBuildInfoFile": "./node_modules/.tmp/tsconfig.app.tsbuildinfo",
+    "target": "ES2020",
+    "useDefineForClassFields": true,
+    "module": "ESNext",
+    "lib": ["ES2020", "DOM", "DOM.Iterable"],
+    "skipLibCheck": true,
+
+    /* Bundler mode */
+    "moduleResolution": "bundler",
+    "allowImportingTsExtensions": true,
+    "isolatedModules": true,
+    "moduleDetection": "force",
+    "noEmit": true,
+    "jsx": "preserve",
+
+    /* Linting */
+    "strict": true,
+    "noUnusedLocals": true,
+    "noUnusedParameters": true,
+    "noFallthroughCasesInSwitch": true,
+    "noUncheckedSideEffectImports": true
+  },
+  "include": ["src/**/*.ts", "src/**/*.tsx", "src/**/*.vue"]
+}

+ 32 - 0
tsconfig.json

@@ -0,0 +1,32 @@
+{
+  "files": [],
+  "references": [
+    { "path": "./tsconfig.app.json" },
+    { "path": "./tsconfig.node.json" }
+  ],
+  "compilerOptions": {
+    "target": "esnext",
+    "module": "esnext",
+    "moduleResolution": "node",
+    "strict": true,
+    "esModuleInterop": true,
+    "skipLibCheck": true,
+    "allowJs": true,
+    "types": ["node", "vue"],
+    "lib": ["dom", "esnext"],
+    "sourceMap": true,
+    "baseUrl": "./", // 确保 baseUrl 指向根目录
+    "paths": {
+      "@/*": ["src/*"] // 配置 @ 别名指向 src 目录
+    }
+  },
+  "include": [
+    "src/**/*.ts",
+    "src/**/*.d.ts",
+    "src/**/*.tsx",
+    "src/**/*.vue"
+  ],
+  "exclude": [
+    "node_modules"
+  ]
+}

+ 24 - 0
tsconfig.node.json

@@ -0,0 +1,24 @@
+{
+  "compilerOptions": {
+    "tsBuildInfoFile": "./node_modules/.tmp/tsconfig.node.tsbuildinfo",
+    "target": "ES2022",
+    "lib": ["ES2023"],
+    "module": "ESNext",
+    "skipLibCheck": true,
+
+    /* Bundler mode */
+    "moduleResolution": "bundler",
+    "allowImportingTsExtensions": true,
+    "isolatedModules": true,
+    "moduleDetection": "force",
+    "noEmit": true,
+
+    /* Linting */
+    "strict": true,
+    "noUnusedLocals": true,
+    "noUnusedParameters": true,
+    "noFallthroughCasesInSwitch": true,
+    "noUncheckedSideEffectImports": true
+  },
+  "include": ["vite.config.ts"]
+}

+ 1 - 0
tsconfig.tsbuildinfo

@@ -0,0 +1 @@
+{"root":["./src/main.ts","./src/vite-env.d.ts","./src/api/basic/index.ts","./src/api/login/index.ts","./src/api/picking/index.ts","./src/hooks/basic/index.ts","./src/router/index.ts","./src/store/modules/basic.ts","./src/store/modules/user.ts","./src/types/basic.ts","./src/types/login.ts","./src/types/picking.ts","./src/utils/android.ts","./src/utils/date.ts","./src/utils/request.ts","./src/views/outbound/picking/list/hooks/list.ts","./src/views/outbound/picking/list/hooks/lotnum.ts","./src/views/outbound/picking/task/hooks/task.ts","./src/app.vue","./src/components/globalloading.vue","./src/components/helloworld.vue","./src/views/test.vue","./src/views/login/login.vue","./src/views/outbound/components/containernoinput.vue","./src/views/outbound/components/pickingnoinput.vue","./src/views/outbound/picking/list/index.vue","./src/views/outbound/picking/task/index.vue"],"errors":true,"version":"5.7.2"}

+ 21 - 0
vite.config.ts

@@ -0,0 +1,21 @@
+import { defineConfig } from 'vite'
+import vue from '@vitejs/plugin-vue'
+export default defineConfig({
+  plugins: [vue()],
+  server: {
+    host: '0.0.0.0', // 允许通过局域网访问
+    port: 5173,  // 修改为你需要的端口号
+  },
+  resolve: {
+    alias: {
+      '@': '/src'
+    }
+  },
+  optimizeDeps: {
+    include: ['vue']
+  },
+  base:'./',
+  build: {
+    sourcemap: process.env.ENV === 'development',
+  },
+})

+ 1671 - 0
yarn.lock

@@ -0,0 +1,1671 @@
+# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.
+# yarn lockfile v1
+
+
+"@ampproject/remapping@^2.2.0":
+  version "2.3.0"
+  resolved "https://registry.npmmirror.com/@ampproject/remapping/-/remapping-2.3.0.tgz#ed441b6fa600072520ce18b43d2c8cc8caecc7f4"
+  integrity sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==
+  dependencies:
+    "@jridgewell/gen-mapping" "^0.3.5"
+    "@jridgewell/trace-mapping" "^0.3.24"
+
+"@babel/code-frame@^7.25.9", "@babel/code-frame@^7.26.0", "@babel/code-frame@^7.26.2":
+  version "7.26.2"
+  resolved "https://registry.npmmirror.com/@babel/code-frame/-/code-frame-7.26.2.tgz#4b5fab97d33338eff916235055f0ebc21e573a85"
+  integrity sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==
+  dependencies:
+    "@babel/helper-validator-identifier" "^7.25.9"
+    js-tokens "^4.0.0"
+    picocolors "^1.0.0"
+
+"@babel/compat-data@^7.25.9":
+  version "7.26.3"
+  resolved "https://registry.npmmirror.com/@babel/compat-data/-/compat-data-7.26.3.tgz#99488264a56b2aded63983abd6a417f03b92ed02"
+  integrity sha512-nHIxvKPniQXpmQLb0vhY3VaFb3S0YrTAwpOWJZh1wn3oJPjJk9Asva204PsBdmAE8vpzfHudT8DB0scYvy9q0g==
+
+"@babel/core@^7.26.0":
+  version "7.26.0"
+  resolved "https://registry.npmmirror.com/@babel/core/-/core-7.26.0.tgz#d78b6023cc8f3114ccf049eb219613f74a747b40"
+  integrity sha512-i1SLeK+DzNnQ3LL/CswPCa/E5u4lh1k6IAEphON8F+cXt0t9euTshDru0q7/IqMa1PMPz5RnHuHscF8/ZJsStg==
+  dependencies:
+    "@ampproject/remapping" "^2.2.0"
+    "@babel/code-frame" "^7.26.0"
+    "@babel/generator" "^7.26.0"
+    "@babel/helper-compilation-targets" "^7.25.9"
+    "@babel/helper-module-transforms" "^7.26.0"
+    "@babel/helpers" "^7.26.0"
+    "@babel/parser" "^7.26.0"
+    "@babel/template" "^7.25.9"
+    "@babel/traverse" "^7.25.9"
+    "@babel/types" "^7.26.0"
+    convert-source-map "^2.0.0"
+    debug "^4.1.0"
+    gensync "^1.0.0-beta.2"
+    json5 "^2.2.3"
+    semver "^6.3.1"
+
+"@babel/generator@^7.26.0", "@babel/generator@^7.26.3":
+  version "7.26.3"
+  resolved "https://registry.npmmirror.com/@babel/generator/-/generator-7.26.3.tgz#ab8d4360544a425c90c248df7059881f4b2ce019"
+  integrity sha512-6FF/urZvD0sTeO7k6/B15pMLC4CHUv1426lzr3N01aHJTl046uCAh9LXW/fzeXXjPNCJ6iABW5XaWOsIZB93aQ==
+  dependencies:
+    "@babel/parser" "^7.26.3"
+    "@babel/types" "^7.26.3"
+    "@jridgewell/gen-mapping" "^0.3.5"
+    "@jridgewell/trace-mapping" "^0.3.25"
+    jsesc "^3.0.2"
+
+"@babel/helper-compilation-targets@^7.25.9":
+  version "7.25.9"
+  resolved "https://registry.npmmirror.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.25.9.tgz#55af025ce365be3cdc0c1c1e56c6af617ce88875"
+  integrity sha512-j9Db8Suy6yV/VHa4qzrj9yZfZxhLWQdVnRlXxmKLYlhWUVB1sB2G5sxuWYXk/whHD9iW76PmNzxZ4UCnTQTVEQ==
+  dependencies:
+    "@babel/compat-data" "^7.25.9"
+    "@babel/helper-validator-option" "^7.25.9"
+    browserslist "^4.24.0"
+    lru-cache "^5.1.1"
+    semver "^6.3.1"
+
+"@babel/helper-module-imports@^7.25.9":
+  version "7.25.9"
+  resolved "https://registry.npmmirror.com/@babel/helper-module-imports/-/helper-module-imports-7.25.9.tgz#e7f8d20602ebdbf9ebbea0a0751fb0f2a4141715"
+  integrity sha512-tnUA4RsrmflIM6W6RFTLFSXITtl0wKjgpnLgXyowocVPrbYrLUXSBXDgTs8BlbmIzIdlBySRQjINYs2BAkiLtw==
+  dependencies:
+    "@babel/traverse" "^7.25.9"
+    "@babel/types" "^7.25.9"
+
+"@babel/helper-module-transforms@^7.26.0":
+  version "7.26.0"
+  resolved "https://registry.npmmirror.com/@babel/helper-module-transforms/-/helper-module-transforms-7.26.0.tgz#8ce54ec9d592695e58d84cd884b7b5c6a2fdeeae"
+  integrity sha512-xO+xu6B5K2czEnQye6BHA7DolFFmS3LB7stHZFaOLb1pAwO1HWLS8fXA+eh0A2yIvltPVmx3eNNDBJA2SLHXFw==
+  dependencies:
+    "@babel/helper-module-imports" "^7.25.9"
+    "@babel/helper-validator-identifier" "^7.25.9"
+    "@babel/traverse" "^7.25.9"
+
+"@babel/helper-string-parser@^7.25.9":
+  version "7.25.9"
+  resolved "https://registry.npmmirror.com/@babel/helper-string-parser/-/helper-string-parser-7.25.9.tgz#1aabb72ee72ed35789b4bbcad3ca2862ce614e8c"
+  integrity sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==
+
+"@babel/helper-validator-identifier@^7.25.9":
+  version "7.25.9"
+  resolved "https://registry.npmmirror.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.25.9.tgz#24b64e2c3ec7cd3b3c547729b8d16871f22cbdc7"
+  integrity sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==
+
+"@babel/helper-validator-option@^7.25.9":
+  version "7.25.9"
+  resolved "https://registry.npmmirror.com/@babel/helper-validator-option/-/helper-validator-option-7.25.9.tgz#86e45bd8a49ab7e03f276577f96179653d41da72"
+  integrity sha512-e/zv1co8pp55dNdEcCynfj9X7nyUKUXoUEwfXqaZt0omVOmDe9oOTdKStH4GmAw6zxMFs50ZayuMfHDKlO7Tfw==
+
+"@babel/helpers@^7.26.0":
+  version "7.26.0"
+  resolved "https://registry.npmmirror.com/@babel/helpers/-/helpers-7.26.0.tgz#30e621f1eba5aa45fe6f4868d2e9154d884119a4"
+  integrity sha512-tbhNuIxNcVb21pInl3ZSjksLCvgdZy9KwJ8brv993QtIVKJBBkYXz4q4ZbAv31GdnC+R90np23L5FbEBlthAEw==
+  dependencies:
+    "@babel/template" "^7.25.9"
+    "@babel/types" "^7.26.0"
+
+"@babel/parser@^7.25.3", "@babel/parser@^7.25.9", "@babel/parser@^7.26.0", "@babel/parser@^7.26.3":
+  version "7.26.3"
+  resolved "https://registry.npmmirror.com/@babel/parser/-/parser-7.26.3.tgz#8c51c5db6ddf08134af1ddbacf16aaab48bac234"
+  integrity sha512-WJ/CvmY8Mea8iDXo6a7RK2wbmJITT5fN3BEkRuFlxVyNx8jOKIIhmC4fSkTcPcf8JyavbBwIe6OpiCOBXt/IcA==
+  dependencies:
+    "@babel/types" "^7.26.3"
+
+"@babel/standalone@^7.26.4":
+  version "7.26.4"
+  resolved "https://registry.npmmirror.com/@babel/standalone/-/standalone-7.26.4.tgz#440d8046929174b463e2c6294fc8f6d49fdea550"
+  integrity sha512-SF+g7S2mhTT1b7CHyfNjDkPU1corxg4LPYsyP0x5KuCl+EbtBQHRLqr9N3q7e7+x7NQ5LYxQf8mJ2PmzebLr0A==
+
+"@babel/template@^7.25.9":
+  version "7.25.9"
+  resolved "https://registry.npmmirror.com/@babel/template/-/template-7.25.9.tgz#ecb62d81a8a6f5dc5fe8abfc3901fc52ddf15016"
+  integrity sha512-9DGttpmPvIxBb/2uwpVo3dqJ+O6RooAFOS+lB+xDqoE2PVCE8nfoHMdZLpfCQRLwvohzXISPZcgxt80xLfsuwg==
+  dependencies:
+    "@babel/code-frame" "^7.25.9"
+    "@babel/parser" "^7.25.9"
+    "@babel/types" "^7.25.9"
+
+"@babel/traverse@^7.25.9":
+  version "7.26.4"
+  resolved "https://registry.npmmirror.com/@babel/traverse/-/traverse-7.26.4.tgz#ac3a2a84b908dde6d463c3bfa2c5fdc1653574bd"
+  integrity sha512-fH+b7Y4p3yqvApJALCPJcwb0/XaOSgtK4pzV6WVjPR5GLFQBRI7pfoX2V2iM48NXvX07NUxxm1Vw98YjqTcU5w==
+  dependencies:
+    "@babel/code-frame" "^7.26.2"
+    "@babel/generator" "^7.26.3"
+    "@babel/parser" "^7.26.3"
+    "@babel/template" "^7.25.9"
+    "@babel/types" "^7.26.3"
+    debug "^4.3.1"
+    globals "^11.1.0"
+
+"@babel/types@^7.25.9", "@babel/types@^7.26.0", "@babel/types@^7.26.3":
+  version "7.26.3"
+  resolved "https://registry.npmmirror.com/@babel/types/-/types-7.26.3.tgz#37e79830f04c2b5687acc77db97fbc75fb81f3c0"
+  integrity sha512-vN5p+1kl59GVKMvTHt55NzzmYVxprfJD+ql7U9NFIfKCBkYE55LYtS+WtPlaYOyzydrKI8Nezd+aZextrd+FMA==
+  dependencies:
+    "@babel/helper-string-parser" "^7.25.9"
+    "@babel/helper-validator-identifier" "^7.25.9"
+
+"@esbuild/aix-ppc64@0.24.0":
+  version "0.24.0"
+  resolved "https://registry.npmmirror.com/@esbuild/aix-ppc64/-/aix-ppc64-0.24.0.tgz#b57697945b50e99007b4c2521507dc613d4a648c"
+  integrity sha512-WtKdFM7ls47zkKHFVzMz8opM7LkcsIp9amDUBIAWirg70RM71WRSjdILPsY5Uv1D42ZpUfaPILDlfactHgsRkw==
+
+"@esbuild/android-arm64@0.24.0":
+  version "0.24.0"
+  resolved "https://registry.npmmirror.com/@esbuild/android-arm64/-/android-arm64-0.24.0.tgz#1add7e0af67acefd556e407f8497e81fddad79c0"
+  integrity sha512-Vsm497xFM7tTIPYK9bNTYJyF/lsP590Qc1WxJdlB6ljCbdZKU9SY8i7+Iin4kyhV/KV5J2rOKsBQbB77Ab7L/w==
+
+"@esbuild/android-arm@0.24.0":
+  version "0.24.0"
+  resolved "https://registry.npmmirror.com/@esbuild/android-arm/-/android-arm-0.24.0.tgz#ab7263045fa8e090833a8e3c393b60d59a789810"
+  integrity sha512-arAtTPo76fJ/ICkXWetLCc9EwEHKaeya4vMrReVlEIUCAUncH7M4bhMQ+M9Vf+FFOZJdTNMXNBrWwW+OXWpSew==
+
+"@esbuild/android-x64@0.24.0":
+  version "0.24.0"
+  resolved "https://registry.npmmirror.com/@esbuild/android-x64/-/android-x64-0.24.0.tgz#e8f8b196cfdfdd5aeaebbdb0110983460440e705"
+  integrity sha512-t8GrvnFkiIY7pa7mMgJd7p8p8qqYIz1NYiAoKc75Zyv73L3DZW++oYMSHPRarcotTKuSs6m3hTOa5CKHaS02TQ==
+
+"@esbuild/darwin-arm64@0.24.0":
+  version "0.24.0"
+  resolved "https://registry.npmmirror.com/@esbuild/darwin-arm64/-/darwin-arm64-0.24.0.tgz#2d0d9414f2acbffd2d86e98253914fca603a53dd"
+  integrity sha512-CKyDpRbK1hXwv79soeTJNHb5EiG6ct3efd/FTPdzOWdbZZfGhpbcqIpiD0+vwmpu0wTIL97ZRPZu8vUt46nBSw==
+
+"@esbuild/darwin-x64@0.24.0":
+  version "0.24.0"
+  resolved "https://registry.npmmirror.com/@esbuild/darwin-x64/-/darwin-x64-0.24.0.tgz#33087aab31a1eb64c89daf3d2cf8ce1775656107"
+  integrity sha512-rgtz6flkVkh58od4PwTRqxbKH9cOjaXCMZgWD905JOzjFKW+7EiUObfd/Kav+A6Gyud6WZk9w+xu6QLytdi2OA==
+
+"@esbuild/freebsd-arm64@0.24.0":
+  version "0.24.0"
+  resolved "https://registry.npmmirror.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.24.0.tgz#bb76e5ea9e97fa3c753472f19421075d3a33e8a7"
+  integrity sha512-6Mtdq5nHggwfDNLAHkPlyLBpE5L6hwsuXZX8XNmHno9JuL2+bg2BX5tRkwjyfn6sKbxZTq68suOjgWqCicvPXA==
+
+"@esbuild/freebsd-x64@0.24.0":
+  version "0.24.0"
+  resolved "https://registry.npmmirror.com/@esbuild/freebsd-x64/-/freebsd-x64-0.24.0.tgz#e0e2ce9249fdf6ee29e5dc3d420c7007fa579b93"
+  integrity sha512-D3H+xh3/zphoX8ck4S2RxKR6gHlHDXXzOf6f/9dbFt/NRBDIE33+cVa49Kil4WUjxMGW0ZIYBYtaGCa2+OsQwQ==
+
+"@esbuild/linux-arm64@0.24.0":
+  version "0.24.0"
+  resolved "https://registry.npmmirror.com/@esbuild/linux-arm64/-/linux-arm64-0.24.0.tgz#d1b2aa58085f73ecf45533c07c82d81235388e75"
+  integrity sha512-TDijPXTOeE3eaMkRYpcy3LarIg13dS9wWHRdwYRnzlwlA370rNdZqbcp0WTyyV/k2zSxfko52+C7jU5F9Tfj1g==
+
+"@esbuild/linux-arm@0.24.0":
+  version "0.24.0"
+  resolved "https://registry.npmmirror.com/@esbuild/linux-arm/-/linux-arm-0.24.0.tgz#8e4915df8ea3e12b690a057e77a47b1d5935ef6d"
+  integrity sha512-gJKIi2IjRo5G6Glxb8d3DzYXlxdEj2NlkixPsqePSZMhLudqPhtZ4BUrpIuTjJYXxvF9njql+vRjB2oaC9XpBw==
+
+"@esbuild/linux-ia32@0.24.0":
+  version "0.24.0"
+  resolved "https://registry.npmmirror.com/@esbuild/linux-ia32/-/linux-ia32-0.24.0.tgz#8200b1110666c39ab316572324b7af63d82013fb"
+  integrity sha512-K40ip1LAcA0byL05TbCQ4yJ4swvnbzHscRmUilrmP9Am7//0UjPreh4lpYzvThT2Quw66MhjG//20mrufm40mA==
+
+"@esbuild/linux-loong64@0.24.0":
+  version "0.24.0"
+  resolved "https://registry.npmmirror.com/@esbuild/linux-loong64/-/linux-loong64-0.24.0.tgz#6ff0c99cf647504df321d0640f0d32e557da745c"
+  integrity sha512-0mswrYP/9ai+CU0BzBfPMZ8RVm3RGAN/lmOMgW4aFUSOQBjA31UP8Mr6DDhWSuMwj7jaWOT0p0WoZ6jeHhrD7g==
+
+"@esbuild/linux-mips64el@0.24.0":
+  version "0.24.0"
+  resolved "https://registry.npmmirror.com/@esbuild/linux-mips64el/-/linux-mips64el-0.24.0.tgz#3f720ccd4d59bfeb4c2ce276a46b77ad380fa1f3"
+  integrity sha512-hIKvXm0/3w/5+RDtCJeXqMZGkI2s4oMUGj3/jM0QzhgIASWrGO5/RlzAzm5nNh/awHE0A19h/CvHQe6FaBNrRA==
+
+"@esbuild/linux-ppc64@0.24.0":
+  version "0.24.0"
+  resolved "https://registry.npmmirror.com/@esbuild/linux-ppc64/-/linux-ppc64-0.24.0.tgz#9d6b188b15c25afd2e213474bf5f31e42e3aa09e"
+  integrity sha512-HcZh5BNq0aC52UoocJxaKORfFODWXZxtBaaZNuN3PUX3MoDsChsZqopzi5UupRhPHSEHotoiptqikjN/B77mYQ==
+
+"@esbuild/linux-riscv64@0.24.0":
+  version "0.24.0"
+  resolved "https://registry.npmmirror.com/@esbuild/linux-riscv64/-/linux-riscv64-0.24.0.tgz#f989fdc9752dfda286c9cd87c46248e4dfecbc25"
+  integrity sha512-bEh7dMn/h3QxeR2KTy1DUszQjUrIHPZKyO6aN1X4BCnhfYhuQqedHaa5MxSQA/06j3GpiIlFGSsy1c7Gf9padw==
+
+"@esbuild/linux-s390x@0.24.0":
+  version "0.24.0"
+  resolved "https://registry.npmmirror.com/@esbuild/linux-s390x/-/linux-s390x-0.24.0.tgz#29ebf87e4132ea659c1489fce63cd8509d1c7319"
+  integrity sha512-ZcQ6+qRkw1UcZGPyrCiHHkmBaj9SiCD8Oqd556HldP+QlpUIe2Wgn3ehQGVoPOvZvtHm8HPx+bH20c9pvbkX3g==
+
+"@esbuild/linux-x64@0.24.0":
+  version "0.24.0"
+  resolved "https://registry.npmmirror.com/@esbuild/linux-x64/-/linux-x64-0.24.0.tgz#4af48c5c0479569b1f359ffbce22d15f261c0cef"
+  integrity sha512-vbutsFqQ+foy3wSSbmjBXXIJ6PL3scghJoM8zCL142cGaZKAdCZHyf+Bpu/MmX9zT9Q0zFBVKb36Ma5Fzfa8xA==
+
+"@esbuild/netbsd-x64@0.24.0":
+  version "0.24.0"
+  resolved "https://registry.npmmirror.com/@esbuild/netbsd-x64/-/netbsd-x64-0.24.0.tgz#1ae73d23cc044a0ebd4f198334416fb26c31366c"
+  integrity sha512-hjQ0R/ulkO8fCYFsG0FZoH+pWgTTDreqpqY7UnQntnaKv95uP5iW3+dChxnx7C3trQQU40S+OgWhUVwCjVFLvg==
+
+"@esbuild/openbsd-arm64@0.24.0":
+  version "0.24.0"
+  resolved "https://registry.npmmirror.com/@esbuild/openbsd-arm64/-/openbsd-arm64-0.24.0.tgz#5d904a4f5158c89859fd902c427f96d6a9e632e2"
+  integrity sha512-MD9uzzkPQbYehwcN583yx3Tu5M8EIoTD+tUgKF982WYL9Pf5rKy9ltgD0eUgs8pvKnmizxjXZyLt0z6DC3rRXg==
+
+"@esbuild/openbsd-x64@0.24.0":
+  version "0.24.0"
+  resolved "https://registry.npmmirror.com/@esbuild/openbsd-x64/-/openbsd-x64-0.24.0.tgz#4c8aa88c49187c601bae2971e71c6dc5e0ad1cdf"
+  integrity sha512-4ir0aY1NGUhIC1hdoCzr1+5b43mw99uNwVzhIq1OY3QcEwPDO3B7WNXBzaKY5Nsf1+N11i1eOfFcq+D/gOS15Q==
+
+"@esbuild/sunos-x64@0.24.0":
+  version "0.24.0"
+  resolved "https://registry.npmmirror.com/@esbuild/sunos-x64/-/sunos-x64-0.24.0.tgz#8ddc35a0ea38575fa44eda30a5ee01ae2fa54dd4"
+  integrity sha512-jVzdzsbM5xrotH+W5f1s+JtUy1UWgjU0Cf4wMvffTB8m6wP5/kx0KiaLHlbJO+dMgtxKV8RQ/JvtlFcdZ1zCPA==
+
+"@esbuild/win32-arm64@0.24.0":
+  version "0.24.0"
+  resolved "https://registry.npmmirror.com/@esbuild/win32-arm64/-/win32-arm64-0.24.0.tgz#6e79c8543f282c4539db684a207ae0e174a9007b"
+  integrity sha512-iKc8GAslzRpBytO2/aN3d2yb2z8XTVfNV0PjGlCxKo5SgWmNXx82I/Q3aG1tFfS+A2igVCY97TJ8tnYwpUWLCA==
+
+"@esbuild/win32-ia32@0.24.0":
+  version "0.24.0"
+  resolved "https://registry.npmmirror.com/@esbuild/win32-ia32/-/win32-ia32-0.24.0.tgz#057af345da256b7192d18b676a02e95d0fa39103"
+  integrity sha512-vQW36KZolfIudCcTnaTpmLQ24Ha1RjygBo39/aLkM2kmjkWmZGEJ5Gn9l5/7tzXA42QGIoWbICfg6KLLkIw6yw==
+
+"@esbuild/win32-x64@0.24.0":
+  version "0.24.0"
+  resolved "https://registry.npmmirror.com/@esbuild/win32-x64/-/win32-x64-0.24.0.tgz#168ab1c7e1c318b922637fad8f339d48b01e1244"
+  integrity sha512-7IAFPrjSQIJrGsK6flwg7NFmwBoSTyF3rl7If0hNUFQU4ilTsEPL6GuMuU9BfIWVVGuRnuIidkSMC+c0Otu8IA==
+
+"@jridgewell/gen-mapping@^0.3.5":
+  version "0.3.8"
+  resolved "https://registry.npmmirror.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.8.tgz#4f0e06362e01362f823d348f1872b08f666d8142"
+  integrity sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==
+  dependencies:
+    "@jridgewell/set-array" "^1.2.1"
+    "@jridgewell/sourcemap-codec" "^1.4.10"
+    "@jridgewell/trace-mapping" "^0.3.24"
+
+"@jridgewell/resolve-uri@^3.1.0":
+  version "3.1.2"
+  resolved "https://registry.npmmirror.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz#7a0ee601f60f99a20c7c7c5ff0c80388c1189bd6"
+  integrity sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==
+
+"@jridgewell/set-array@^1.2.1":
+  version "1.2.1"
+  resolved "https://registry.npmmirror.com/@jridgewell/set-array/-/set-array-1.2.1.tgz#558fb6472ed16a4c850b889530e6b36438c49280"
+  integrity sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==
+
+"@jridgewell/sourcemap-codec@^1.4.10", "@jridgewell/sourcemap-codec@^1.4.14", "@jridgewell/sourcemap-codec@^1.5.0":
+  version "1.5.0"
+  resolved "https://registry.npmmirror.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz#3188bcb273a414b0d215fd22a58540b989b9409a"
+  integrity sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==
+
+"@jridgewell/trace-mapping@^0.3.24", "@jridgewell/trace-mapping@^0.3.25":
+  version "0.3.25"
+  resolved "https://registry.npmmirror.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz#15f190e98895f3fc23276ee14bc76b675c2e50f0"
+  integrity sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==
+  dependencies:
+    "@jridgewell/resolve-uri" "^3.1.0"
+    "@jridgewell/sourcemap-codec" "^1.4.14"
+
+"@nodelib/fs.scandir@2.1.5":
+  version "2.1.5"
+  resolved "https://registry.npmmirror.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz#7619c2eb21b25483f6d167548b4cfd5a7488c3d5"
+  integrity sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==
+  dependencies:
+    "@nodelib/fs.stat" "2.0.5"
+    run-parallel "^1.1.9"
+
+"@nodelib/fs.stat@2.0.5", "@nodelib/fs.stat@^2.0.2":
+  version "2.0.5"
+  resolved "https://registry.npmmirror.com/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz#5bd262af94e9d25bd1e71b05deed44876a222e8b"
+  integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==
+
+"@nodelib/fs.walk@^1.2.3":
+  version "1.2.8"
+  resolved "https://registry.npmmirror.com/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz#e95737e8bb6746ddedf69c556953494f196fe69a"
+  integrity sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==
+  dependencies:
+    "@nodelib/fs.scandir" "2.1.5"
+    fastq "^1.6.0"
+
+"@nuxt/kit@^3.14.1592":
+  version "3.14.1592"
+  resolved "https://registry.npmmirror.com/@nuxt/kit/-/kit-3.14.1592.tgz#f959a269424c1ee313585a46112e474b6ccab3bc"
+  integrity sha512-r9r8bISBBisvfcNgNL3dSIQHSBe0v5YkX5zwNblIC2T0CIEgxEVoM5rq9O5wqgb5OEydsHTtT2hL57vdv6VT2w==
+  dependencies:
+    "@nuxt/schema" "3.14.1592"
+    c12 "^2.0.1"
+    consola "^3.2.3"
+    defu "^6.1.4"
+    destr "^2.0.3"
+    globby "^14.0.2"
+    hash-sum "^2.0.0"
+    ignore "^6.0.2"
+    jiti "^2.4.0"
+    klona "^2.0.6"
+    knitwork "^1.1.0"
+    mlly "^1.7.3"
+    pathe "^1.1.2"
+    pkg-types "^1.2.1"
+    scule "^1.3.0"
+    semver "^7.6.3"
+    ufo "^1.5.4"
+    unctx "^2.3.1"
+    unimport "^3.13.2"
+    untyped "^1.5.1"
+
+"@nuxt/schema@3.14.1592":
+  version "3.14.1592"
+  resolved "https://registry.npmmirror.com/@nuxt/schema/-/schema-3.14.1592.tgz#38c5c0af51d0b95e011db6c332f578aac97c8c82"
+  integrity sha512-A1d/08ueX8stTXNkvGqnr1eEXZgvKn+vj6s7jXhZNWApUSqMgItU4VK28vrrdpKbjIPwq2SwhnGOHUYvN9HwCQ==
+  dependencies:
+    c12 "^2.0.1"
+    compatx "^0.1.8"
+    consola "^3.2.3"
+    defu "^6.1.4"
+    hookable "^5.5.3"
+    pathe "^1.1.2"
+    pkg-types "^1.2.1"
+    scule "^1.3.0"
+    std-env "^3.8.0"
+    ufo "^1.5.4"
+    uncrypto "^0.1.3"
+    unimport "^3.13.2"
+    untyped "^1.5.1"
+
+"@parcel/watcher-android-arm64@2.5.0":
+  version "2.5.0"
+  resolved "https://registry.npmmirror.com/@parcel/watcher-android-arm64/-/watcher-android-arm64-2.5.0.tgz#e32d3dda6647791ee930556aee206fcd5ea0fb7a"
+  integrity sha512-qlX4eS28bUcQCdribHkg/herLe+0A9RyYC+mm2PXpncit8z5b3nSqGVzMNR3CmtAOgRutiZ02eIJJgP/b1iEFQ==
+
+"@parcel/watcher-darwin-arm64@2.5.0":
+  version "2.5.0"
+  resolved "https://registry.npmmirror.com/@parcel/watcher-darwin-arm64/-/watcher-darwin-arm64-2.5.0.tgz#0d9e680b7e9ec1c8f54944f1b945aa8755afb12f"
+  integrity sha512-hyZ3TANnzGfLpRA2s/4U1kbw2ZI4qGxaRJbBH2DCSREFfubMswheh8TeiC1sGZ3z2jUf3s37P0BBlrD3sjVTUw==
+
+"@parcel/watcher-darwin-x64@2.5.0":
+  version "2.5.0"
+  resolved "https://registry.npmmirror.com/@parcel/watcher-darwin-x64/-/watcher-darwin-x64-2.5.0.tgz#f9f1d5ce9d5878d344f14ef1856b7a830c59d1bb"
+  integrity sha512-9rhlwd78saKf18fT869/poydQK8YqlU26TMiNg7AIu7eBp9adqbJZqmdFOsbZ5cnLp5XvRo9wcFmNHgHdWaGYA==
+
+"@parcel/watcher-freebsd-x64@2.5.0":
+  version "2.5.0"
+  resolved "https://registry.npmmirror.com/@parcel/watcher-freebsd-x64/-/watcher-freebsd-x64-2.5.0.tgz#2b77f0c82d19e84ff4c21de6da7f7d096b1a7e82"
+  integrity sha512-syvfhZzyM8kErg3VF0xpV8dixJ+RzbUaaGaeb7uDuz0D3FK97/mZ5AJQ3XNnDsXX7KkFNtyQyFrXZzQIcN49Tw==
+
+"@parcel/watcher-linux-arm-glibc@2.5.0":
+  version "2.5.0"
+  resolved "https://registry.npmmirror.com/@parcel/watcher-linux-arm-glibc/-/watcher-linux-arm-glibc-2.5.0.tgz#92ed322c56dbafa3d2545dcf2803334aee131e42"
+  integrity sha512-0VQY1K35DQET3dVYWpOaPFecqOT9dbuCfzjxoQyif1Wc574t3kOSkKevULddcR9znz1TcklCE7Ht6NIxjvTqLA==
+
+"@parcel/watcher-linux-arm-musl@2.5.0":
+  version "2.5.0"
+  resolved "https://registry.npmmirror.com/@parcel/watcher-linux-arm-musl/-/watcher-linux-arm-musl-2.5.0.tgz#cd48e9bfde0cdbbd2ecd9accfc52967e22f849a4"
+  integrity sha512-6uHywSIzz8+vi2lAzFeltnYbdHsDm3iIB57d4g5oaB9vKwjb6N6dRIgZMujw4nm5r6v9/BQH0noq6DzHrqr2pA==
+
+"@parcel/watcher-linux-arm64-glibc@2.5.0":
+  version "2.5.0"
+  resolved "https://registry.npmmirror.com/@parcel/watcher-linux-arm64-glibc/-/watcher-linux-arm64-glibc-2.5.0.tgz#7b81f6d5a442bb89fbabaf6c13573e94a46feb03"
+  integrity sha512-BfNjXwZKxBy4WibDb/LDCriWSKLz+jJRL3cM/DllnHH5QUyoiUNEp3GmL80ZqxeumoADfCCP19+qiYiC8gUBjA==
+
+"@parcel/watcher-linux-arm64-musl@2.5.0":
+  version "2.5.0"
+  resolved "https://registry.npmmirror.com/@parcel/watcher-linux-arm64-musl/-/watcher-linux-arm64-musl-2.5.0.tgz#dcb8ff01077cdf59a18d9e0a4dff7a0cfe5fd732"
+  integrity sha512-S1qARKOphxfiBEkwLUbHjCY9BWPdWnW9j7f7Hb2jPplu8UZ3nes7zpPOW9bkLbHRvWM0WDTsjdOTUgW0xLBN1Q==
+
+"@parcel/watcher-linux-x64-glibc@2.5.0":
+  version "2.5.0"
+  resolved "https://registry.npmmirror.com/@parcel/watcher-linux-x64-glibc/-/watcher-linux-x64-glibc-2.5.0.tgz#2e254600fda4e32d83942384d1106e1eed84494d"
+  integrity sha512-d9AOkusyXARkFD66S6zlGXyzx5RvY+chTP9Jp0ypSTC9d4lzyRs9ovGf/80VCxjKddcUvnsGwCHWuF2EoPgWjw==
+
+"@parcel/watcher-linux-x64-musl@2.5.0":
+  version "2.5.0"
+  resolved "https://registry.npmmirror.com/@parcel/watcher-linux-x64-musl/-/watcher-linux-x64-musl-2.5.0.tgz#01fcea60fedbb3225af808d3f0a7b11229792eef"
+  integrity sha512-iqOC+GoTDoFyk/VYSFHwjHhYrk8bljW6zOhPuhi5t9ulqiYq1togGJB5e3PwYVFFfeVgc6pbz3JdQyDoBszVaA==
+
+"@parcel/watcher-win32-arm64@2.5.0":
+  version "2.5.0"
+  resolved "https://registry.npmmirror.com/@parcel/watcher-win32-arm64/-/watcher-win32-arm64-2.5.0.tgz#87cdb16e0783e770197e52fb1dc027bb0c847154"
+  integrity sha512-twtft1d+JRNkM5YbmexfcH/N4znDtjgysFaV9zvZmmJezQsKpkfLYJ+JFV3uygugK6AtIM2oADPkB2AdhBrNig==
+
+"@parcel/watcher-win32-ia32@2.5.0":
+  version "2.5.0"
+  resolved "https://registry.npmmirror.com/@parcel/watcher-win32-ia32/-/watcher-win32-ia32-2.5.0.tgz#778c39b56da33e045ba21c678c31a9f9d7c6b220"
+  integrity sha512-+rgpsNRKwo8A53elqbbHXdOMtY/tAtTzManTWShB5Kk54N8Q9mzNWV7tV+IbGueCbcj826MfWGU3mprWtuf1TA==
+
+"@parcel/watcher-win32-x64@2.5.0":
+  version "2.5.0"
+  resolved "https://registry.npmmirror.com/@parcel/watcher-win32-x64/-/watcher-win32-x64-2.5.0.tgz#33873876d0bbc588aacce38e90d1d7480ce81cb7"
+  integrity sha512-lPrxve92zEHdgeff3aiu4gDOIt4u7sJYha6wbdEZDCDUhtjTsOMiaJzG5lMY4GkWH8p0fMmO2Ppq5G5XXG+DQw==
+
+"@parcel/watcher@^2.4.1":
+  version "2.5.0"
+  resolved "https://registry.npmmirror.com/@parcel/watcher/-/watcher-2.5.0.tgz#5c88818b12b8de4307a9d3e6dc3e28eba0dfbd10"
+  integrity sha512-i0GV1yJnm2n3Yq1qw6QrUrd/LI9bE8WEBOTtOkpCXHHdyN3TAGgqAK/DAT05z4fq2x04cARXt2pDmjWjL92iTQ==
+  dependencies:
+    detect-libc "^1.0.3"
+    is-glob "^4.0.3"
+    micromatch "^4.0.5"
+    node-addon-api "^7.0.0"
+  optionalDependencies:
+    "@parcel/watcher-android-arm64" "2.5.0"
+    "@parcel/watcher-darwin-arm64" "2.5.0"
+    "@parcel/watcher-darwin-x64" "2.5.0"
+    "@parcel/watcher-freebsd-x64" "2.5.0"
+    "@parcel/watcher-linux-arm-glibc" "2.5.0"
+    "@parcel/watcher-linux-arm-musl" "2.5.0"
+    "@parcel/watcher-linux-arm64-glibc" "2.5.0"
+    "@parcel/watcher-linux-arm64-musl" "2.5.0"
+    "@parcel/watcher-linux-x64-glibc" "2.5.0"
+    "@parcel/watcher-linux-x64-musl" "2.5.0"
+    "@parcel/watcher-win32-arm64" "2.5.0"
+    "@parcel/watcher-win32-ia32" "2.5.0"
+    "@parcel/watcher-win32-x64" "2.5.0"
+
+"@rollup/pluginutils@^5.1.3":
+  version "5.1.4"
+  resolved "https://registry.npmmirror.com/@rollup/pluginutils/-/pluginutils-5.1.4.tgz#bb94f1f9eaaac944da237767cdfee6c5b2262d4a"
+  integrity sha512-USm05zrsFxYLPdWWq+K3STlWiT/3ELn3RcV5hJMghpeAIhxfsUIg6mt12CBJBInWMV4VneoV7SfGv8xIwo2qNQ==
+  dependencies:
+    "@types/estree" "^1.0.0"
+    estree-walker "^2.0.2"
+    picomatch "^4.0.2"
+
+"@rollup/rollup-android-arm-eabi@4.28.1":
+  version "4.28.1"
+  resolved "https://registry.npmmirror.com/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.28.1.tgz#7f4c4d8cd5ccab6e95d6750dbe00321c1f30791e"
+  integrity sha512-2aZp8AES04KI2dy3Ss6/MDjXbwBzj+i0GqKtWXgw2/Ma6E4jJvujryO6gJAghIRVz7Vwr9Gtl/8na3nDUKpraQ==
+
+"@rollup/rollup-android-arm64@4.28.1":
+  version "4.28.1"
+  resolved "https://registry.npmmirror.com/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.28.1.tgz#17ea71695fb1518c2c324badbe431a0bd1879f2d"
+  integrity sha512-EbkK285O+1YMrg57xVA+Dp0tDBRB93/BZKph9XhMjezf6F4TpYjaUSuPt5J0fZXlSag0LmZAsTmdGGqPp4pQFA==
+
+"@rollup/rollup-darwin-arm64@4.28.1":
+  version "4.28.1"
+  resolved "https://registry.npmmirror.com/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.28.1.tgz#dac0f0d0cfa73e7d5225ae6d303c13c8979e7999"
+  integrity sha512-prduvrMKU6NzMq6nxzQw445zXgaDBbMQvmKSJaxpaZ5R1QDM8w+eGxo6Y/jhT/cLoCvnZI42oEqf9KQNYz1fqQ==
+
+"@rollup/rollup-darwin-x64@4.28.1":
+  version "4.28.1"
+  resolved "https://registry.npmmirror.com/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.28.1.tgz#8f63baa1d31784904a380d2e293fa1ddf53dd4a2"
+  integrity sha512-WsvbOunsUk0wccO/TV4o7IKgloJ942hVFK1CLatwv6TJspcCZb9umQkPdvB7FihmdxgaKR5JyxDjWpCOp4uZlQ==
+
+"@rollup/rollup-freebsd-arm64@4.28.1":
+  version "4.28.1"
+  resolved "https://registry.npmmirror.com/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.28.1.tgz#30ed247e0df6e8858cdc6ae4090e12dbeb8ce946"
+  integrity sha512-HTDPdY1caUcU4qK23FeeGxCdJF64cKkqajU0iBnTVxS8F7H/7BewvYoG+va1KPSL63kQ1PGNyiwKOfReavzvNA==
+
+"@rollup/rollup-freebsd-x64@4.28.1":
+  version "4.28.1"
+  resolved "https://registry.npmmirror.com/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.28.1.tgz#57846f382fddbb508412ae07855b8a04c8f56282"
+  integrity sha512-m/uYasxkUevcFTeRSM9TeLyPe2QDuqtjkeoTpP9SW0XxUWfcYrGDMkO/m2tTw+4NMAF9P2fU3Mw4ahNvo7QmsQ==
+
+"@rollup/rollup-linux-arm-gnueabihf@4.28.1":
+  version "4.28.1"
+  resolved "https://registry.npmmirror.com/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.28.1.tgz#378ca666c9dae5e6f94d1d351e7497c176e9b6df"
+  integrity sha512-QAg11ZIt6mcmzpNE6JZBpKfJaKkqTm1A9+y9O+frdZJEuhQxiugM05gnCWiANHj4RmbgeVJpTdmKRmH/a+0QbA==
+
+"@rollup/rollup-linux-arm-musleabihf@4.28.1":
+  version "4.28.1"
+  resolved "https://registry.npmmirror.com/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.28.1.tgz#a692eff3bab330d5c33a5d5813a090c15374cddb"
+  integrity sha512-dRP9PEBfolq1dmMcFqbEPSd9VlRuVWEGSmbxVEfiq2cs2jlZAl0YNxFzAQS2OrQmsLBLAATDMb3Z6MFv5vOcXg==
+
+"@rollup/rollup-linux-arm64-gnu@4.28.1":
+  version "4.28.1"
+  resolved "https://registry.npmmirror.com/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.28.1.tgz#6b1719b76088da5ac1ae1feccf48c5926b9e3db9"
+  integrity sha512-uGr8khxO+CKT4XU8ZUH1TTEUtlktK6Kgtv0+6bIFSeiSlnGJHG1tSFSjm41uQ9sAO/5ULx9mWOz70jYLyv1QkA==
+
+"@rollup/rollup-linux-arm64-musl@4.28.1":
+  version "4.28.1"
+  resolved "https://registry.npmmirror.com/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.28.1.tgz#865baf5b6f5ff67acb32e5a359508828e8dc5788"
+  integrity sha512-QF54q8MYGAqMLrX2t7tNpi01nvq5RI59UBNx+3+37zoKX5KViPo/gk2QLhsuqok05sSCRluj0D00LzCwBikb0A==
+
+"@rollup/rollup-linux-loongarch64-gnu@4.28.1":
+  version "4.28.1"
+  resolved "https://registry.npmmirror.com/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.28.1.tgz#23c6609ba0f7fa7a7f2038b6b6a08555a5055a87"
+  integrity sha512-vPul4uodvWvLhRco2w0GcyZcdyBfpfDRgNKU+p35AWEbJ/HPs1tOUrkSueVbBS0RQHAf/A+nNtDpvw95PeVKOA==
+
+"@rollup/rollup-linux-powerpc64le-gnu@4.28.1":
+  version "4.28.1"
+  resolved "https://registry.npmmirror.com/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.28.1.tgz#652ef0d9334a9f25b9daf85731242801cb0fc41c"
+  integrity sha512-pTnTdBuC2+pt1Rmm2SV7JWRqzhYpEILML4PKODqLz+C7Ou2apEV52h19CR7es+u04KlqplggmN9sqZlekg3R1A==
+
+"@rollup/rollup-linux-riscv64-gnu@4.28.1":
+  version "4.28.1"
+  resolved "https://registry.npmmirror.com/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.28.1.tgz#1eb6651839ee6ebca64d6cc64febbd299e95e6bd"
+  integrity sha512-vWXy1Nfg7TPBSuAncfInmAI/WZDd5vOklyLJDdIRKABcZWojNDY0NJwruY2AcnCLnRJKSaBgf/GiJfauu8cQZA==
+
+"@rollup/rollup-linux-s390x-gnu@4.28.1":
+  version "4.28.1"
+  resolved "https://registry.npmmirror.com/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.28.1.tgz#015c52293afb3ff2a293cf0936b1d43975c1e9cd"
+  integrity sha512-/yqC2Y53oZjb0yz8PVuGOQQNOTwxcizudunl/tFs1aLvObTclTwZ0JhXF2XcPT/zuaymemCDSuuUPXJJyqeDOg==
+
+"@rollup/rollup-linux-x64-gnu@4.28.1":
+  version "4.28.1"
+  resolved "https://registry.npmmirror.com/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.28.1.tgz#b83001b5abed2bcb5e2dbeec6a7e69b194235c1e"
+  integrity sha512-fzgeABz7rrAlKYB0y2kSEiURrI0691CSL0+KXwKwhxvj92VULEDQLpBYLHpF49MSiPG4sq5CK3qHMnb9tlCjBw==
+
+"@rollup/rollup-linux-x64-musl@4.28.1":
+  version "4.28.1"
+  resolved "https://registry.npmmirror.com/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.28.1.tgz#6cc7c84cd4563737f8593e66f33b57d8e228805b"
+  integrity sha512-xQTDVzSGiMlSshpJCtudbWyRfLaNiVPXt1WgdWTwWz9n0U12cI2ZVtWe/Jgwyv/6wjL7b66uu61Vg0POWVfz4g==
+
+"@rollup/rollup-win32-arm64-msvc@4.28.1":
+  version "4.28.1"
+  resolved "https://registry.npmmirror.com/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.28.1.tgz#631ffeee094d71279fcd1fe8072bdcf25311bc11"
+  integrity sha512-wSXmDRVupJstFP7elGMgv+2HqXelQhuNf+IS4V+nUpNVi/GUiBgDmfwD0UGN3pcAnWsgKG3I52wMOBnk1VHr/A==
+
+"@rollup/rollup-win32-ia32-msvc@4.28.1":
+  version "4.28.1"
+  resolved "https://registry.npmmirror.com/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.28.1.tgz#06d1d60d5b9f718e8a6c4a43f82e3f9e3254587f"
+  integrity sha512-ZkyTJ/9vkgrE/Rk9vhMXhf8l9D+eAhbAVbsGsXKy2ohmJaWg0LPQLnIxRdRp/bKyr8tXuPlXhIoGlEB5XpJnGA==
+
+"@rollup/rollup-win32-x64-msvc@4.28.1":
+  version "4.28.1"
+  resolved "https://registry.npmmirror.com/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.28.1.tgz#4dff5c4259ebe6c5b4a8f2c5bc3829b7a8447ff0"
+  integrity sha512-ZvK2jBafvttJjoIdKm/Q/Bh7IJ1Ose9IBOwpOXcOvW3ikGTQGmKDgxTC6oCAzW6PynbkKP8+um1du81XJHZ0JA==
+
+"@sindresorhus/merge-streams@^2.1.0":
+  version "2.3.0"
+  resolved "https://registry.npmmirror.com/@sindresorhus/merge-streams/-/merge-streams-2.3.0.tgz#719df7fb41766bc143369eaa0dd56d8dc87c9958"
+  integrity sha512-LtoMMhxAlorcGhmFYI+LhPgbPZCkgP6ra1YL604EeF6U98pLlQ3iWIGMdWSC+vWmPBWBNgmDBAhnAobLROJmwg==
+
+"@types/estree@1.0.6", "@types/estree@^1.0.0":
+  version "1.0.6"
+  resolved "https://registry.npmmirror.com/@types/estree/-/estree-1.0.6.tgz#628effeeae2064a1b4e79f78e81d87b7e5fc7b50"
+  integrity sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==
+
+"@vant/popperjs@^1.3.0":
+  version "1.3.0"
+  resolved "https://registry.npmmirror.com/@vant/popperjs/-/popperjs-1.3.0.tgz#e0eff017124b5b2352ef3b36a6df06277f4400f2"
+  integrity sha512-hB+czUG+aHtjhaEmCJDuXOep0YTZjdlRR+4MSmIFnkCQIxJaXLQdSsR90XWvAI2yvKUI7TCGqR8pQg2RtvkMHw==
+
+"@vant/use@^1.6.0":
+  version "1.6.0"
+  resolved "https://registry.npmmirror.com/@vant/use/-/use-1.6.0.tgz#237df3091617255519552ca311ffdfea9de59001"
+  integrity sha512-PHHxeAASgiOpSmMjceweIrv2AxDZIkWXyaczksMoWvKV2YAYEhoizRuk/xFnKF+emUIi46TsQ+rvlm/t2BBCfA==
+
+"@vitejs/plugin-vue@^5.2.1":
+  version "5.2.1"
+  resolved "https://registry.npmmirror.com/@vitejs/plugin-vue/-/plugin-vue-5.2.1.tgz#d1491f678ee3af899f7ae57d9c21dc52a65c7133"
+  integrity sha512-cxh314tzaWwOLqVes2gnnCtvBDcM1UMdn+iFR+UjAn411dPT3tOmqrJjbMd7koZpMAmBM/GqeV4n9ge7JSiJJQ==
+
+"@volar/language-core@2.4.11", "@volar/language-core@~2.4.8":
+  version "2.4.11"
+  resolved "https://registry.npmmirror.com/@volar/language-core/-/language-core-2.4.11.tgz#d95a9ec4f14fbdb41a6a64f9f321d11d23a5291c"
+  integrity sha512-lN2C1+ByfW9/JRPpqScuZt/4OrUUse57GLI6TbLgTIqBVemdl1wNcZ1qYGEo2+Gw8coYLgCy7SuKqn6IrQcQgg==
+  dependencies:
+    "@volar/source-map" "2.4.11"
+
+"@volar/source-map@2.4.11":
+  version "2.4.11"
+  resolved "https://registry.npmmirror.com/@volar/source-map/-/source-map-2.4.11.tgz#5876d4531508129724c2755e295db1df98bd5895"
+  integrity sha512-ZQpmafIGvaZMn/8iuvCFGrW3smeqkq/IIh9F1SdSx9aUl0J4Iurzd6/FhmjNO5g2ejF3rT45dKskgXWiofqlZQ==
+
+"@volar/typescript@~2.4.8":
+  version "2.4.11"
+  resolved "https://registry.npmmirror.com/@volar/typescript/-/typescript-2.4.11.tgz#aafbfa413337654db211bf4d8fb6670c89f6fa57"
+  integrity sha512-2DT+Tdh88Spp5PyPbqhyoYavYCPDsqbHLFwcUI9K1NlY1YgUJvujGdrqUp0zWxnW7KWNTr3xSpMuv2WnaTKDAw==
+  dependencies:
+    "@volar/language-core" "2.4.11"
+    path-browserify "^1.0.1"
+    vscode-uri "^3.0.8"
+
+"@vue/compiler-core@3.5.13":
+  version "3.5.13"
+  resolved "https://registry.npmmirror.com/@vue/compiler-core/-/compiler-core-3.5.13.tgz#b0ae6c4347f60c03e849a05d34e5bf747c9bda05"
+  integrity sha512-oOdAkwqUfW1WqpwSYJce06wvt6HljgY3fGeM9NcVA1HaYOij3mZG9Rkysn0OHuyUAGMbEbARIpsG+LPVlBJ5/Q==
+  dependencies:
+    "@babel/parser" "^7.25.3"
+    "@vue/shared" "3.5.13"
+    entities "^4.5.0"
+    estree-walker "^2.0.2"
+    source-map-js "^1.2.0"
+
+"@vue/compiler-dom@3.5.13", "@vue/compiler-dom@^3.5.0":
+  version "3.5.13"
+  resolved "https://registry.npmmirror.com/@vue/compiler-dom/-/compiler-dom-3.5.13.tgz#bb1b8758dbc542b3658dda973b98a1c9311a8a58"
+  integrity sha512-ZOJ46sMOKUjO3e94wPdCzQ6P1Lx/vhp2RSvfaab88Ajexs0AHeV0uasYhi99WPaogmBlRHNRuly8xV75cNTMDA==
+  dependencies:
+    "@vue/compiler-core" "3.5.13"
+    "@vue/shared" "3.5.13"
+
+"@vue/compiler-sfc@3.5.13":
+  version "3.5.13"
+  resolved "https://registry.npmmirror.com/@vue/compiler-sfc/-/compiler-sfc-3.5.13.tgz#461f8bd343b5c06fac4189c4fef8af32dea82b46"
+  integrity sha512-6VdaljMpD82w6c2749Zhf5T9u5uLBWKnVue6XWxprDobftnletJ8+oel7sexFfM3qIxNmVE7LSFGTpv6obNyaQ==
+  dependencies:
+    "@babel/parser" "^7.25.3"
+    "@vue/compiler-core" "3.5.13"
+    "@vue/compiler-dom" "3.5.13"
+    "@vue/compiler-ssr" "3.5.13"
+    "@vue/shared" "3.5.13"
+    estree-walker "^2.0.2"
+    magic-string "^0.30.11"
+    postcss "^8.4.48"
+    source-map-js "^1.2.0"
+
+"@vue/compiler-ssr@3.5.13":
+  version "3.5.13"
+  resolved "https://registry.npmmirror.com/@vue/compiler-ssr/-/compiler-ssr-3.5.13.tgz#e771adcca6d3d000f91a4277c972a996d07f43ba"
+  integrity sha512-wMH6vrYHxQl/IybKJagqbquvxpWCuVYpoUJfCqFZwa/JY1GdATAQ+TgVtgrwwMZ0D07QhA99rs/EAAWfvG6KpA==
+  dependencies:
+    "@vue/compiler-dom" "3.5.13"
+    "@vue/shared" "3.5.13"
+
+"@vue/compiler-vue2@^2.7.16":
+  version "2.7.16"
+  resolved "https://registry.npmmirror.com/@vue/compiler-vue2/-/compiler-vue2-2.7.16.tgz#2ba837cbd3f1b33c2bc865fbe1a3b53fb611e249"
+  integrity sha512-qYC3Psj9S/mfu9uVi5WvNZIzq+xnXMhOwbTFKKDD7b1lhpnn71jXSFdTQ+WsIEk0ONCd7VV2IMm7ONl6tbQ86A==
+  dependencies:
+    de-indent "^1.0.2"
+    he "^1.2.0"
+
+"@vue/devtools-api@^6.6.3":
+  version "6.6.4"
+  resolved "https://registry.npmmirror.com/@vue/devtools-api/-/devtools-api-6.6.4.tgz#cbe97fe0162b365edc1dba80e173f90492535343"
+  integrity sha512-sGhTPMuXqZ1rVOk32RylztWkfXTRhuS7vgAKv0zjqk8gbsHkJ7xfFf+jbySxt7tWObEJwyKaHMikV/WGDiQm8g==
+
+"@vue/language-core@2.1.10":
+  version "2.1.10"
+  resolved "https://registry.npmmirror.com/@vue/language-core/-/language-core-2.1.10.tgz#5988e9ea155f3e09ccbbb3b2a0ddd530dad912e6"
+  integrity sha512-DAI289d0K3AB5TUG3xDp9OuQ71CnrujQwJrQnfuZDwo6eGNf0UoRlPuaVNO+Zrn65PC3j0oB2i7mNmVPggeGeQ==
+  dependencies:
+    "@volar/language-core" "~2.4.8"
+    "@vue/compiler-dom" "^3.5.0"
+    "@vue/compiler-vue2" "^2.7.16"
+    "@vue/shared" "^3.5.0"
+    alien-signals "^0.2.0"
+    minimatch "^9.0.3"
+    muggle-string "^0.4.1"
+    path-browserify "^1.0.1"
+
+"@vue/reactivity@3.5.13":
+  version "3.5.13"
+  resolved "https://registry.npmmirror.com/@vue/reactivity/-/reactivity-3.5.13.tgz#b41ff2bb865e093899a22219f5b25f97b6fe155f"
+  integrity sha512-NaCwtw8o48B9I6L1zl2p41OHo/2Z4wqYGGIK1Khu5T7yxrn+ATOixn/Udn2m+6kZKB/J7cuT9DbWWhRxqixACg==
+  dependencies:
+    "@vue/shared" "3.5.13"
+
+"@vue/runtime-core@3.5.13":
+  version "3.5.13"
+  resolved "https://registry.npmmirror.com/@vue/runtime-core/-/runtime-core-3.5.13.tgz#1fafa4bf0b97af0ebdd9dbfe98cd630da363a455"
+  integrity sha512-Fj4YRQ3Az0WTZw1sFe+QDb0aXCerigEpw418pw1HBUKFtnQHWzwojaukAs2X/c9DQz4MQ4bsXTGlcpGxU/RCIw==
+  dependencies:
+    "@vue/reactivity" "3.5.13"
+    "@vue/shared" "3.5.13"
+
+"@vue/runtime-dom@3.5.13":
+  version "3.5.13"
+  resolved "https://registry.npmmirror.com/@vue/runtime-dom/-/runtime-dom-3.5.13.tgz#610fc795de9246300e8ae8865930d534e1246215"
+  integrity sha512-dLaj94s93NYLqjLiyFzVs9X6dWhTdAlEAciC3Moq7gzAc13VJUdCnjjRurNM6uTLFATRHexHCTu/Xp3eW6yoog==
+  dependencies:
+    "@vue/reactivity" "3.5.13"
+    "@vue/runtime-core" "3.5.13"
+    "@vue/shared" "3.5.13"
+    csstype "^3.1.3"
+
+"@vue/server-renderer@3.5.13":
+  version "3.5.13"
+  resolved "https://registry.npmmirror.com/@vue/server-renderer/-/server-renderer-3.5.13.tgz#429ead62ee51de789646c22efe908e489aad46f7"
+  integrity sha512-wAi4IRJV/2SAW3htkTlB+dHeRmpTiVIK1OGLWV1yeStVSebSQQOwGwIq0D3ZIoBj2C2qpgz5+vX9iEBkTdk5YA==
+  dependencies:
+    "@vue/compiler-ssr" "3.5.13"
+    "@vue/shared" "3.5.13"
+
+"@vue/shared@3.5.13", "@vue/shared@^3.5.0", "@vue/shared@^3.5.13":
+  version "3.5.13"
+  resolved "https://registry.npmmirror.com/@vue/shared/-/shared-3.5.13.tgz#87b309a6379c22b926e696893237826f64339b6f"
+  integrity sha512-/hnE/qP5ZoGpol0a5mDi45bOd7t3tjYJBjsgCsivow7D48cJeV5l05RD82lPqi7gRiphZM37rnhW1l6ZoCNNnQ==
+
+acorn@^8.14.0:
+  version "8.14.0"
+  resolved "https://registry.npmmirror.com/acorn/-/acorn-8.14.0.tgz#063e2c70cac5fb4f6467f0b11152e04c682795b0"
+  integrity sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==
+
+alien-signals@^0.2.0:
+  version "0.2.2"
+  resolved "https://registry.npmmirror.com/alien-signals/-/alien-signals-0.2.2.tgz#439d09b363dc4d609c0f6ce69362dce068d23197"
+  integrity sha512-cZIRkbERILsBOXTQmMrxc9hgpxglstn69zm+F1ARf4aPAzdAFYd6sBq87ErO0Fj3DV94tglcyHG5kQz9nDC/8A==
+
+balanced-match@^1.0.0:
+  version "1.0.2"
+  resolved "https://registry.npmmirror.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee"
+  integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==
+
+brace-expansion@^2.0.1:
+  version "2.0.1"
+  resolved "https://registry.npmmirror.com/brace-expansion/-/brace-expansion-2.0.1.tgz#1edc459e0f0c548486ecf9fc99f2221364b9a0ae"
+  integrity sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==
+  dependencies:
+    balanced-match "^1.0.0"
+
+braces@^3.0.3:
+  version "3.0.3"
+  resolved "https://registry.npmmirror.com/braces/-/braces-3.0.3.tgz#490332f40919452272d55a8480adc0c441358789"
+  integrity sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==
+  dependencies:
+    fill-range "^7.1.1"
+
+browserslist@^4.24.0:
+  version "4.24.3"
+  resolved "https://registry.npmmirror.com/browserslist/-/browserslist-4.24.3.tgz#5fc2725ca8fb3c1432e13dac278c7cc103e026d2"
+  integrity sha512-1CPmv8iobE2fyRMV97dAcMVegvvWKxmq94hkLiAkUGwKVTyDLw33K+ZxiFrREKmmps4rIw6grcCFCnTMSZ/YiA==
+  dependencies:
+    caniuse-lite "^1.0.30001688"
+    electron-to-chromium "^1.5.73"
+    node-releases "^2.0.19"
+    update-browserslist-db "^1.1.1"
+
+c12@^2.0.1:
+  version "2.0.1"
+  resolved "https://registry.npmmirror.com/c12/-/c12-2.0.1.tgz#5702d280b31a08abba39833494c9b1202f0f5aec"
+  integrity sha512-Z4JgsKXHG37C6PYUtIxCfLJZvo6FyhHJoClwwb9ftUkLpPSkuYqn6Tr+vnaN8hymm0kIbcg6Ey3kv/Q71k5w/A==
+  dependencies:
+    chokidar "^4.0.1"
+    confbox "^0.1.7"
+    defu "^6.1.4"
+    dotenv "^16.4.5"
+    giget "^1.2.3"
+    jiti "^2.3.0"
+    mlly "^1.7.1"
+    ohash "^1.1.4"
+    pathe "^1.1.2"
+    perfect-debounce "^1.0.0"
+    pkg-types "^1.2.0"
+    rc9 "^2.1.2"
+
+caniuse-lite@^1.0.30001688:
+  version "1.0.30001689"
+  resolved "https://registry.npmmirror.com/caniuse-lite/-/caniuse-lite-1.0.30001689.tgz#67ca960dd5f443903e19949aeacc9d28f6e10910"
+  integrity sha512-CmeR2VBycfa+5/jOfnp/NpWPGd06nf1XYiefUvhXFfZE4GkRc9jv+eGPS4nT558WS/8lYCzV8SlANCIPvbWP1g==
+
+chokidar@^4.0.0, chokidar@^4.0.1:
+  version "4.0.2"
+  resolved "https://registry.npmmirror.com/chokidar/-/chokidar-4.0.2.tgz#97b9562c9f59de559177f069eadf5dcc67d24798"
+  integrity sha512-/b57FK+bblSU+dfewfFe0rT1YjVDfOmeLQwCAuC+vwvgLkXboATqqmy+Ipux6JrF6L5joe5CBnFOw+gLWH6yKg==
+  dependencies:
+    readdirp "^4.0.1"
+
+chownr@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.npmmirror.com/chownr/-/chownr-2.0.0.tgz#15bfbe53d2eab4cf70f18a8cd68ebe5b3cb1dece"
+  integrity sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==
+
+citty@^0.1.6:
+  version "0.1.6"
+  resolved "https://registry.npmmirror.com/citty/-/citty-0.1.6.tgz#0f7904da1ed4625e1a9ea7e0fa780981aab7c5e4"
+  integrity sha512-tskPPKEs8D2KPafUypv2gxwJP8h/OaJmC82QQGGDQcHvXX43xF2VDACcJVmZ0EuSxkpO9Kc4MlrA3q0+FG58AQ==
+  dependencies:
+    consola "^3.2.3"
+
+compatx@^0.1.8:
+  version "0.1.8"
+  resolved "https://registry.npmmirror.com/compatx/-/compatx-0.1.8.tgz#af6f61910ade6ce1073c0fdff23c786bcd75c026"
+  integrity sha512-jcbsEAR81Bt5s1qOFymBufmCbXCXbk0Ql+K5ouj6gCyx2yHlu6AgmGIi9HxfKixpUDO5bCFJUHQ5uM6ecbTebw==
+
+confbox@^0.1.7, confbox@^0.1.8:
+  version "0.1.8"
+  resolved "https://registry.npmmirror.com/confbox/-/confbox-0.1.8.tgz#820d73d3b3c82d9bd910652c5d4d599ef8ff8b06"
+  integrity sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w==
+
+consola@^3.2.3:
+  version "3.2.3"
+  resolved "https://registry.npmmirror.com/consola/-/consola-3.2.3.tgz#0741857aa88cfa0d6fd53f1cff0375136e98502f"
+  integrity sha512-I5qxpzLv+sJhTVEoLYNcTW+bThDCPsit0vLNKShZx6rLtpilNpmmeTPaeqJb9ZE9dV3DGaeby6Vuhrw38WjeyQ==
+
+convert-source-map@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.npmmirror.com/convert-source-map/-/convert-source-map-2.0.0.tgz#4b560f649fc4e918dd0ab75cf4961e8bc882d82a"
+  integrity sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==
+
+cross-spawn@^7.0.3:
+  version "7.0.6"
+  resolved "https://registry.npmmirror.com/cross-spawn/-/cross-spawn-7.0.6.tgz#8a58fe78f00dcd70c370451759dfbfaf03e8ee9f"
+  integrity sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==
+  dependencies:
+    path-key "^3.1.0"
+    shebang-command "^2.0.0"
+    which "^2.0.1"
+
+csstype@^3.1.3:
+  version "3.1.3"
+  resolved "https://registry.npmmirror.com/csstype/-/csstype-3.1.3.tgz#d80ff294d114fb0e6ac500fbf85b60137d7eff81"
+  integrity sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==
+
+de-indent@^1.0.2:
+  version "1.0.2"
+  resolved "https://registry.npmmirror.com/de-indent/-/de-indent-1.0.2.tgz#b2038e846dc33baa5796128d0804b455b8c1e21d"
+  integrity sha512-e/1zu3xH5MQryN2zdVaF0OrdNLUbvWxzMbi+iNA6Bky7l1RoP8a2fIbRocyHclXt/arDrrR6lL3TqFD9pMQTsg==
+
+debug@^4.1.0, debug@^4.3.1:
+  version "4.4.0"
+  resolved "https://registry.npmmirror.com/debug/-/debug-4.4.0.tgz#2b3f2aea2ffeb776477460267377dc8710faba8a"
+  integrity sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==
+  dependencies:
+    ms "^2.1.3"
+
+deep-pick-omit@^1.2.1:
+  version "1.2.1"
+  resolved "https://registry.npmmirror.com/deep-pick-omit/-/deep-pick-omit-1.2.1.tgz#c035b27a4c86518b76f60ffa3004e6c61f317032"
+  integrity sha512-2J6Kc/m3irCeqVG42T+SaUMesaK7oGWaedGnQQK/+O0gYc+2SP5bKh/KKTE7d7SJ+GCA9UUE1GRzh6oDe0EnGw==
+
+defu@^6.1.4:
+  version "6.1.4"
+  resolved "https://registry.npmmirror.com/defu/-/defu-6.1.4.tgz#4e0c9cf9ff68fe5f3d7f2765cc1a012dfdcb0479"
+  integrity sha512-mEQCMmwJu317oSz8CwdIOdwf3xMif1ttiM8LTufzc3g6kR+9Pe236twL8j3IYT1F7GfRgGcW6MWxzZjLIkuHIg==
+
+destr@^2.0.3:
+  version "2.0.3"
+  resolved "https://registry.npmmirror.com/destr/-/destr-2.0.3.tgz#7f9e97cb3d16dbdca7be52aca1644ce402cfe449"
+  integrity sha512-2N3BOUU4gYMpTP24s5rF5iP7BDr7uNTCs4ozw3kf/eKfvWSIu93GEBi5m427YoyJoeOzQ5smuu4nNAPGb8idSQ==
+
+detect-libc@^1.0.3:
+  version "1.0.3"
+  resolved "https://registry.npmmirror.com/detect-libc/-/detect-libc-1.0.3.tgz#fa137c4bd698edf55cd5cd02ac559f91a4c4ba9b"
+  integrity sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg==
+
+dotenv@^16.4.5:
+  version "16.4.7"
+  resolved "https://registry.npmmirror.com/dotenv/-/dotenv-16.4.7.tgz#0e20c5b82950140aa99be360a8a5f52335f53c26"
+  integrity sha512-47qPchRCykZC03FhkYAhrvwU4xDBFIj1QPqaarj6mdM/hgUzfPHcpkHJOn3mJAufFeeAxAzeGsr5X0M4k6fLZQ==
+
+electron-to-chromium@^1.5.73:
+  version "1.5.74"
+  resolved "https://registry.npmmirror.com/electron-to-chromium/-/electron-to-chromium-1.5.74.tgz#cb886b504a6467e4c00bea3317edb38393c53413"
+  integrity sha512-ck3//9RC+6oss/1Bh9tiAVFy5vfSKbRHAFh7Z3/eTRkEqJeWgymloShB17Vg3Z4nmDNp35vAd1BZ6CMW4Wt6Iw==
+
+entities@^4.5.0:
+  version "4.5.0"
+  resolved "https://registry.npmmirror.com/entities/-/entities-4.5.0.tgz#5d268ea5e7113ec74c4d033b79ea5a35a488fb48"
+  integrity sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==
+
+esbuild@^0.24.0:
+  version "0.24.0"
+  resolved "https://registry.npmmirror.com/esbuild/-/esbuild-0.24.0.tgz#f2d470596885fcb2e91c21eb3da3b3c89c0b55e7"
+  integrity sha512-FuLPevChGDshgSicjisSooU0cemp/sGXR841D5LHMB7mTVOmsEHcAxaH3irL53+8YDIeVNQEySh4DaYU/iuPqQ==
+  optionalDependencies:
+    "@esbuild/aix-ppc64" "0.24.0"
+    "@esbuild/android-arm" "0.24.0"
+    "@esbuild/android-arm64" "0.24.0"
+    "@esbuild/android-x64" "0.24.0"
+    "@esbuild/darwin-arm64" "0.24.0"
+    "@esbuild/darwin-x64" "0.24.0"
+    "@esbuild/freebsd-arm64" "0.24.0"
+    "@esbuild/freebsd-x64" "0.24.0"
+    "@esbuild/linux-arm" "0.24.0"
+    "@esbuild/linux-arm64" "0.24.0"
+    "@esbuild/linux-ia32" "0.24.0"
+    "@esbuild/linux-loong64" "0.24.0"
+    "@esbuild/linux-mips64el" "0.24.0"
+    "@esbuild/linux-ppc64" "0.24.0"
+    "@esbuild/linux-riscv64" "0.24.0"
+    "@esbuild/linux-s390x" "0.24.0"
+    "@esbuild/linux-x64" "0.24.0"
+    "@esbuild/netbsd-x64" "0.24.0"
+    "@esbuild/openbsd-arm64" "0.24.0"
+    "@esbuild/openbsd-x64" "0.24.0"
+    "@esbuild/sunos-x64" "0.24.0"
+    "@esbuild/win32-arm64" "0.24.0"
+    "@esbuild/win32-ia32" "0.24.0"
+    "@esbuild/win32-x64" "0.24.0"
+
+escalade@^3.2.0:
+  version "3.2.0"
+  resolved "https://registry.npmmirror.com/escalade/-/escalade-3.2.0.tgz#011a3f69856ba189dffa7dc8fcce99d2a87903e5"
+  integrity sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==
+
+escape-string-regexp@^5.0.0:
+  version "5.0.0"
+  resolved "https://registry.npmmirror.com/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz#4683126b500b61762f2dbebace1806e8be31b1c8"
+  integrity sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==
+
+estree-walker@^2.0.2:
+  version "2.0.2"
+  resolved "https://registry.npmmirror.com/estree-walker/-/estree-walker-2.0.2.tgz#52f010178c2a4c117a7757cfe942adb7d2da4cac"
+  integrity sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==
+
+estree-walker@^3.0.3:
+  version "3.0.3"
+  resolved "https://registry.npmmirror.com/estree-walker/-/estree-walker-3.0.3.tgz#67c3e549ec402a487b4fc193d1953a524752340d"
+  integrity sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==
+  dependencies:
+    "@types/estree" "^1.0.0"
+
+execa@^8.0.1:
+  version "8.0.1"
+  resolved "https://registry.npmmirror.com/execa/-/execa-8.0.1.tgz#51f6a5943b580f963c3ca9c6321796db8cc39b8c"
+  integrity sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==
+  dependencies:
+    cross-spawn "^7.0.3"
+    get-stream "^8.0.1"
+    human-signals "^5.0.0"
+    is-stream "^3.0.0"
+    merge-stream "^2.0.0"
+    npm-run-path "^5.1.0"
+    onetime "^6.0.0"
+    signal-exit "^4.1.0"
+    strip-final-newline "^3.0.0"
+
+fast-glob@^3.3.2:
+  version "3.3.2"
+  resolved "https://registry.npmmirror.com/fast-glob/-/fast-glob-3.3.2.tgz#a904501e57cfdd2ffcded45e99a54fef55e46129"
+  integrity sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==
+  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.4"
+
+fastq@^1.6.0:
+  version "1.17.1"
+  resolved "https://registry.npmmirror.com/fastq/-/fastq-1.17.1.tgz#2a523f07a4e7b1e81a42b91b8bf2254107753b47"
+  integrity sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==
+  dependencies:
+    reusify "^1.0.4"
+
+fill-range@^7.1.1:
+  version "7.1.1"
+  resolved "https://registry.npmmirror.com/fill-range/-/fill-range-7.1.1.tgz#44265d3cac07e3ea7dc247516380643754a05292"
+  integrity sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==
+  dependencies:
+    to-regex-range "^5.0.1"
+
+fs-minipass@^2.0.0:
+  version "2.1.0"
+  resolved "https://registry.npmmirror.com/fs-minipass/-/fs-minipass-2.1.0.tgz#7f5036fdbf12c63c169190cbe4199c852271f9fb"
+  integrity sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==
+  dependencies:
+    minipass "^3.0.0"
+
+fsevents@~2.3.2, fsevents@~2.3.3:
+  version "2.3.3"
+  resolved "https://registry.npmmirror.com/fsevents/-/fsevents-2.3.3.tgz#cac6407785d03675a2a5e1a5305c697b347d90d6"
+  integrity sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==
+
+gensync@^1.0.0-beta.2:
+  version "1.0.0-beta.2"
+  resolved "https://registry.npmmirror.com/gensync/-/gensync-1.0.0-beta.2.tgz#32a6ee76c3d7f52d46b2b1ae5d93fea8580a25e0"
+  integrity sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==
+
+get-stream@^8.0.1:
+  version "8.0.1"
+  resolved "https://registry.npmmirror.com/get-stream/-/get-stream-8.0.1.tgz#def9dfd71742cd7754a7761ed43749a27d02eca2"
+  integrity sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==
+
+giget@^1.2.3:
+  version "1.2.3"
+  resolved "https://registry.npmmirror.com/giget/-/giget-1.2.3.tgz#ef6845d1140e89adad595f7f3bb60aa31c672cb6"
+  integrity sha512-8EHPljDvs7qKykr6uw8b+lqLiUc/vUg+KVTI0uND4s63TdsZM2Xus3mflvF0DDG9SiM4RlCkFGL+7aAjRmV7KA==
+  dependencies:
+    citty "^0.1.6"
+    consola "^3.2.3"
+    defu "^6.1.4"
+    node-fetch-native "^1.6.3"
+    nypm "^0.3.8"
+    ohash "^1.1.3"
+    pathe "^1.1.2"
+    tar "^6.2.0"
+
+glob-parent@^5.1.2:
+  version "5.1.2"
+  resolved "https://registry.npmmirror.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4"
+  integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==
+  dependencies:
+    is-glob "^4.0.1"
+
+globals@^11.1.0:
+  version "11.12.0"
+  resolved "https://registry.npmmirror.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e"
+  integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==
+
+globby@^14.0.2:
+  version "14.0.2"
+  resolved "https://registry.npmmirror.com/globby/-/globby-14.0.2.tgz#06554a54ccfe9264e5a9ff8eded46aa1e306482f"
+  integrity sha512-s3Fq41ZVh7vbbe2PN3nrW7yC7U7MFVc5c98/iTl9c2GawNMKx/J648KQRW6WKkuU8GIbbh2IXfIRQjOZnXcTnw==
+  dependencies:
+    "@sindresorhus/merge-streams" "^2.1.0"
+    fast-glob "^3.3.2"
+    ignore "^5.2.4"
+    path-type "^5.0.0"
+    slash "^5.1.0"
+    unicorn-magic "^0.1.0"
+
+hash-sum@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.npmmirror.com/hash-sum/-/hash-sum-2.0.0.tgz#81d01bb5de8ea4a214ad5d6ead1b523460b0b45a"
+  integrity sha512-WdZTbAByD+pHfl/g9QSsBIIwy8IT+EsPiKDs0KNX+zSHhdDLFKdZu0BQHljvO+0QI/BasbMSUa8wYNCZTvhslg==
+
+he@^1.2.0:
+  version "1.2.0"
+  resolved "https://registry.npmmirror.com/he/-/he-1.2.0.tgz#84ae65fa7eafb165fddb61566ae14baf05664f0f"
+  integrity sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==
+
+hookable@^5.5.3:
+  version "5.5.3"
+  resolved "https://registry.npmmirror.com/hookable/-/hookable-5.5.3.tgz#6cfc358984a1ef991e2518cb9ed4a778bbd3215d"
+  integrity sha512-Yc+BQe8SvoXH1643Qez1zqLRmbA5rCL+sSmk6TVos0LWVfNIB7PGncdlId77WzLGSIB5KaWgTaNTs2lNVEI6VQ==
+
+human-signals@^5.0.0:
+  version "5.0.0"
+  resolved "https://registry.npmmirror.com/human-signals/-/human-signals-5.0.0.tgz#42665a284f9ae0dade3ba41ebc37eb4b852f3a28"
+  integrity sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==
+
+ignore@^5.2.4:
+  version "5.3.2"
+  resolved "https://registry.npmmirror.com/ignore/-/ignore-5.3.2.tgz#3cd40e729f3643fd87cb04e50bf0eb722bc596f5"
+  integrity sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==
+
+ignore@^6.0.2:
+  version "6.0.2"
+  resolved "https://registry.npmmirror.com/ignore/-/ignore-6.0.2.tgz#77cccb72a55796af1b6d2f9eb14fa326d24f4283"
+  integrity sha512-InwqeHHN2XpumIkMvpl/DCJVrAHgCsG5+cn1XlnLWGwtZBm8QJfSusItfrwx81CTp5agNZqpKU2J/ccC5nGT4A==
+
+immutable@^5.0.2:
+  version "5.0.3"
+  resolved "https://registry.npmmirror.com/immutable/-/immutable-5.0.3.tgz#aa037e2313ea7b5d400cd9298fa14e404c933db1"
+  integrity sha512-P8IdPQHq3lA1xVeBRi5VPqUm5HDgKnx0Ru51wZz5mjxHr5n3RWhjIpOFU7ybkUxfB+5IToy+OLaHYDBIWsv+uw==
+
+is-extglob@^2.1.1:
+  version "2.1.1"
+  resolved "https://registry.npmmirror.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2"
+  integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==
+
+is-glob@^4.0.1, is-glob@^4.0.3:
+  version "4.0.3"
+  resolved "https://registry.npmmirror.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084"
+  integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==
+  dependencies:
+    is-extglob "^2.1.1"
+
+is-number@^7.0.0:
+  version "7.0.0"
+  resolved "https://registry.npmmirror.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b"
+  integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==
+
+is-stream@^3.0.0:
+  version "3.0.0"
+  resolved "https://registry.npmmirror.com/is-stream/-/is-stream-3.0.0.tgz#e6bfd7aa6bef69f4f472ce9bb681e3e57b4319ac"
+  integrity sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==
+
+isexe@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.npmmirror.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10"
+  integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==
+
+jiti@^2.3.0, jiti@^2.4.0, jiti@^2.4.1:
+  version "2.4.2"
+  resolved "https://registry.npmmirror.com/jiti/-/jiti-2.4.2.tgz#d19b7732ebb6116b06e2038da74a55366faef560"
+  integrity sha512-rg9zJN+G4n2nfJl5MW3BMygZX56zKPNVEYYqq7adpmMh4Jn2QNEwhvQlFy6jPVdcod7txZtKHWnyZiA3a0zP7A==
+
+js-tokens@^4.0.0:
+  version "4.0.0"
+  resolved "https://registry.npmmirror.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499"
+  integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==
+
+js-tokens@^9.0.1:
+  version "9.0.1"
+  resolved "https://registry.npmmirror.com/js-tokens/-/js-tokens-9.0.1.tgz#2ec43964658435296f6761b34e10671c2d9527f4"
+  integrity sha512-mxa9E9ITFOt0ban3j6L5MpjwegGz6lBQmM1IJkWeBZGcMxto50+eWdjC/52xDbS2vy0k7vIMK0Fe2wfL9OQSpQ==
+
+jsesc@^3.0.2:
+  version "3.1.0"
+  resolved "https://registry.npmmirror.com/jsesc/-/jsesc-3.1.0.tgz#74d335a234f67ed19907fdadfac7ccf9d409825d"
+  integrity sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==
+
+json5@^2.2.3:
+  version "2.2.3"
+  resolved "https://registry.npmmirror.com/json5/-/json5-2.2.3.tgz#78cd6f1a19bdc12b73db5ad0c61efd66c1e29283"
+  integrity sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==
+
+klona@^2.0.6:
+  version "2.0.6"
+  resolved "https://registry.npmmirror.com/klona/-/klona-2.0.6.tgz#85bffbf819c03b2f53270412420a4555ef882e22"
+  integrity sha512-dhG34DXATL5hSxJbIexCft8FChFXtmskoZYnoPWjXQuebWYCNkVeV3KkGegCK9CP1oswI/vQibS2GY7Em/sJJA==
+
+knitwork@^1.1.0, knitwork@^1.2.0:
+  version "1.2.0"
+  resolved "https://registry.npmmirror.com/knitwork/-/knitwork-1.2.0.tgz#3cc92e76249aeb35449cfbed3f31c6df8444db3f"
+  integrity sha512-xYSH7AvuQ6nXkq42x0v5S8/Iry+cfulBz/DJQzhIyESdLD7425jXsPy4vn5cCXU+HhRN2kVw51Vd1K6/By4BQg==
+
+lib-flexible@^0.3.2:
+  version "0.3.2"
+  resolved "https://registry.npmmirror.com/lib-flexible/-/lib-flexible-0.3.2.tgz#06f5a74832314a2d35c12039bc9c3ca2daeaa426"
+  integrity sha512-9yowMWA70tKhKdCJDaltY0mNQG4OWo7pWKScnTp9aiSxS7s20ZYlwBRE3335nweOf5qKXVC7sDxJwMPM8/MFZg==
+
+local-pkg@^0.5.1:
+  version "0.5.1"
+  resolved "https://registry.npmmirror.com/local-pkg/-/local-pkg-0.5.1.tgz#69658638d2a95287534d4c2fff757980100dbb6d"
+  integrity sha512-9rrA30MRRP3gBD3HTGnC6cDFpaE1kVDWxWgqWJUN0RvDNAo+Nz/9GxB+nHOH0ifbVFy0hSA1V6vFDvnx54lTEQ==
+  dependencies:
+    mlly "^1.7.3"
+    pkg-types "^1.2.1"
+
+lru-cache@^5.1.1:
+  version "5.1.1"
+  resolved "https://registry.npmmirror.com/lru-cache/-/lru-cache-5.1.1.tgz#1da27e6710271947695daf6848e847f01d84b920"
+  integrity sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==
+  dependencies:
+    yallist "^3.0.2"
+
+magic-string@^0.30.11, magic-string@^0.30.14, magic-string@^0.30.17:
+  version "0.30.17"
+  resolved "https://registry.npmmirror.com/magic-string/-/magic-string-0.30.17.tgz#450a449673d2460e5bbcfba9a61916a1714c7453"
+  integrity sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==
+  dependencies:
+    "@jridgewell/sourcemap-codec" "^1.5.0"
+
+merge-stream@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.npmmirror.com/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60"
+  integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==
+
+merge2@^1.3.0:
+  version "1.4.1"
+  resolved "https://registry.npmmirror.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae"
+  integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==
+
+micromatch@^4.0.4, micromatch@^4.0.5:
+  version "4.0.8"
+  resolved "https://registry.npmmirror.com/micromatch/-/micromatch-4.0.8.tgz#d66fa18f3a47076789320b9b1af32bd86d9fa202"
+  integrity sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==
+  dependencies:
+    braces "^3.0.3"
+    picomatch "^2.3.1"
+
+mimic-fn@^4.0.0:
+  version "4.0.0"
+  resolved "https://registry.npmmirror.com/mimic-fn/-/mimic-fn-4.0.0.tgz#60a90550d5cb0b239cca65d893b1a53b29871ecc"
+  integrity sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==
+
+minimatch@^9.0.3:
+  version "9.0.5"
+  resolved "https://registry.npmmirror.com/minimatch/-/minimatch-9.0.5.tgz#d74f9dd6b57d83d8e98cfb82133b03978bc929e5"
+  integrity sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==
+  dependencies:
+    brace-expansion "^2.0.1"
+
+minipass@^3.0.0:
+  version "3.3.6"
+  resolved "https://registry.npmmirror.com/minipass/-/minipass-3.3.6.tgz#7bba384db3a1520d18c9c0e5251c3444e95dd94a"
+  integrity sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==
+  dependencies:
+    yallist "^4.0.0"
+
+minipass@^5.0.0:
+  version "5.0.0"
+  resolved "https://registry.npmmirror.com/minipass/-/minipass-5.0.0.tgz#3e9788ffb90b694a5d0ec94479a45b5d8738133d"
+  integrity sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==
+
+minizlib@^2.1.1:
+  version "2.1.2"
+  resolved "https://registry.npmmirror.com/minizlib/-/minizlib-2.1.2.tgz#e90d3466ba209b932451508a11ce3d3632145931"
+  integrity sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==
+  dependencies:
+    minipass "^3.0.0"
+    yallist "^4.0.0"
+
+mkdirp@^1.0.3:
+  version "1.0.4"
+  resolved "https://registry.npmmirror.com/mkdirp/-/mkdirp-1.0.4.tgz#3eb5ed62622756d79a5f0e2a221dfebad75c2f7e"
+  integrity sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==
+
+mlly@^1.7.1, mlly@^1.7.2, mlly@^1.7.3:
+  version "1.7.3"
+  resolved "https://registry.npmmirror.com/mlly/-/mlly-1.7.3.tgz#d86c0fcd8ad8e16395eb764a5f4b831590cee48c"
+  integrity sha512-xUsx5n/mN0uQf4V548PKQ+YShA4/IW0KI1dZhrNrPCLG+xizETbHTkOa1f8/xut9JRPp8kQuMnz0oqwkTiLo/A==
+  dependencies:
+    acorn "^8.14.0"
+    pathe "^1.1.2"
+    pkg-types "^1.2.1"
+    ufo "^1.5.4"
+
+ms@^2.1.3:
+  version "2.1.3"
+  resolved "https://registry.npmmirror.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2"
+  integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==
+
+muggle-string@^0.4.1:
+  version "0.4.1"
+  resolved "https://registry.npmmirror.com/muggle-string/-/muggle-string-0.4.1.tgz#3b366bd43b32f809dc20659534dd30e7c8a0d328"
+  integrity sha512-VNTrAak/KhO2i8dqqnqnAHOa3cYBwXEZe9h+D5h/1ZqFSTEFHdM65lR7RoIqq3tBBYavsOXV84NoHXZ0AkPyqQ==
+
+nanoid@^3.3.7:
+  version "3.3.8"
+  resolved "https://registry.npmmirror.com/nanoid/-/nanoid-3.3.8.tgz#b1be3030bee36aaff18bacb375e5cce521684baf"
+  integrity sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w==
+
+node-addon-api@^7.0.0:
+  version "7.1.1"
+  resolved "https://registry.npmmirror.com/node-addon-api/-/node-addon-api-7.1.1.tgz#1aba6693b0f255258a049d621329329322aad558"
+  integrity sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ==
+
+node-fetch-native@^1.6.3:
+  version "1.6.4"
+  resolved "https://registry.npmmirror.com/node-fetch-native/-/node-fetch-native-1.6.4.tgz#679fc8fd8111266d47d7e72c379f1bed9acff06e"
+  integrity sha512-IhOigYzAKHd244OC0JIMIUrjzctirCmPkaIfhDeGcEETWof5zKYUW7e7MYvChGWh/4CJeXEgsRyGzuF334rOOQ==
+
+node-releases@^2.0.19:
+  version "2.0.19"
+  resolved "https://registry.npmmirror.com/node-releases/-/node-releases-2.0.19.tgz#9e445a52950951ec4d177d843af370b411caf314"
+  integrity sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==
+
+npm-run-path@^5.1.0:
+  version "5.3.0"
+  resolved "https://registry.npmmirror.com/npm-run-path/-/npm-run-path-5.3.0.tgz#e23353d0ebb9317f174e93417e4a4d82d0249e9f"
+  integrity sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==
+  dependencies:
+    path-key "^4.0.0"
+
+nypm@^0.3.8:
+  version "0.3.12"
+  resolved "https://registry.npmmirror.com/nypm/-/nypm-0.3.12.tgz#37541bec0af3a37d3acd81d6662c6666e650b22e"
+  integrity sha512-D3pzNDWIvgA+7IORhD/IuWzEk4uXv6GsgOxiid4UU3h9oq5IqV1KtPDi63n4sZJ/xcWlr88c0QM2RgN5VbOhFA==
+  dependencies:
+    citty "^0.1.6"
+    consola "^3.2.3"
+    execa "^8.0.1"
+    pathe "^1.1.2"
+    pkg-types "^1.2.0"
+    ufo "^1.5.4"
+
+ohash@^1.1.3, ohash@^1.1.4:
+  version "1.1.4"
+  resolved "https://registry.npmmirror.com/ohash/-/ohash-1.1.4.tgz#ae8d83014ab81157d2c285abf7792e2995fadd72"
+  integrity sha512-FlDryZAahJmEF3VR3w1KogSEdWX3WhA5GPakFx4J81kEAiHyLMpdLLElS8n8dfNadMgAne/MywcvmogzscVt4g==
+
+onetime@^6.0.0:
+  version "6.0.0"
+  resolved "https://registry.npmmirror.com/onetime/-/onetime-6.0.0.tgz#7c24c18ed1fd2e9bca4bd26806a33613c77d34b4"
+  integrity sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==
+  dependencies:
+    mimic-fn "^4.0.0"
+
+path-browserify@^1.0.1:
+  version "1.0.1"
+  resolved "https://registry.npmmirror.com/path-browserify/-/path-browserify-1.0.1.tgz#d98454a9c3753d5790860f16f68867b9e46be1fd"
+  integrity sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==
+
+path-key@^3.1.0:
+  version "3.1.1"
+  resolved "https://registry.npmmirror.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375"
+  integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==
+
+path-key@^4.0.0:
+  version "4.0.0"
+  resolved "https://registry.npmmirror.com/path-key/-/path-key-4.0.0.tgz#295588dc3aee64154f877adb9d780b81c554bf18"
+  integrity sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==
+
+path-type@^5.0.0:
+  version "5.0.0"
+  resolved "https://registry.npmmirror.com/path-type/-/path-type-5.0.0.tgz#14b01ed7aea7ddf9c7c3f46181d4d04f9c785bb8"
+  integrity sha512-5HviZNaZcfqP95rwpv+1HDgUamezbqdSYTyzjTvwtJSnIH+3vnbmWsItli8OFEndS984VT55M3jduxZbX351gg==
+
+pathe@^1.1.2:
+  version "1.1.2"
+  resolved "https://registry.npmmirror.com/pathe/-/pathe-1.1.2.tgz#6c4cb47a945692e48a1ddd6e4094d170516437ec"
+  integrity sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==
+
+perfect-debounce@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.npmmirror.com/perfect-debounce/-/perfect-debounce-1.0.0.tgz#9c2e8bc30b169cc984a58b7d5b28049839591d2a"
+  integrity sha512-xCy9V055GLEqoFaHoC1SoLIaLmWctgCUaBaWxDZ7/Zx4CTyX7cJQLJOok/orfjZAh9kEYpjJa4d0KcJmCbctZA==
+
+picocolors@^1.0.0, picocolors@^1.1.0, picocolors@^1.1.1:
+  version "1.1.1"
+  resolved "https://registry.npmmirror.com/picocolors/-/picocolors-1.1.1.tgz#3d321af3eab939b083c8f929a1d12cda81c26b6b"
+  integrity sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==
+
+picomatch@^2.3.1:
+  version "2.3.1"
+  resolved "https://registry.npmmirror.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42"
+  integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==
+
+picomatch@^4.0.2:
+  version "4.0.2"
+  resolved "https://registry.npmmirror.com/picomatch/-/picomatch-4.0.2.tgz#77c742931e8f3b8820946c76cd0c1f13730d1dab"
+  integrity sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==
+
+pinia-plugin-persistedstate@^4.2.0:
+  version "4.2.0"
+  resolved "https://registry.npmmirror.com/pinia-plugin-persistedstate/-/pinia-plugin-persistedstate-4.2.0.tgz#31973291b768bd84ce24e55083e7171b2f451ad1"
+  integrity sha512-3buhA7ac+ssbOIx3VRCC8oHkoFwhDM9oHRCjo7nj+O8WUqnW+jRqh7eYT5eS/DNa3H28zp3dYf/nd/Vc8zj8eQ==
+  dependencies:
+    "@nuxt/kit" "^3.14.1592"
+    deep-pick-omit "^1.2.1"
+    defu "^6.1.4"
+    destr "^2.0.3"
+
+pinia@^2.3.0:
+  version "2.3.0"
+  resolved "https://registry.npmmirror.com/pinia/-/pinia-2.3.0.tgz#b81f4ac7da1031af8d8f7007686c4b2799a55b9f"
+  integrity sha512-ohZj3jla0LL0OH5PlLTDMzqKiVw2XARmC1XYLdLWIPBMdhDW/123ZWr4zVAhtJm+aoSkFa13pYXskAvAscIkhQ==
+  dependencies:
+    "@vue/devtools-api" "^6.6.3"
+    vue-demi "^0.14.10"
+
+pkg-types@^1.2.0, pkg-types@^1.2.1:
+  version "1.2.1"
+  resolved "https://registry.npmmirror.com/pkg-types/-/pkg-types-1.2.1.tgz#6ac4e455a5bb4b9a6185c1c79abd544c901db2e5"
+  integrity sha512-sQoqa8alT3nHjGuTjuKgOnvjo4cljkufdtLMnO2LBP/wRwuDlo1tkaEdMxCRhyGRPacv/ztlZgDPm2b7FAmEvw==
+  dependencies:
+    confbox "^0.1.8"
+    mlly "^1.7.2"
+    pathe "^1.1.2"
+
+postcss-pxtorem@^6.1.0:
+  version "6.1.0"
+  resolved "https://registry.npmmirror.com/postcss-pxtorem/-/postcss-pxtorem-6.1.0.tgz#7e6410e30426adef53bad6c4c5f00cd5f586937c"
+  integrity sha512-ROODSNci9ADal3zUcPHOF/K83TiCgNSPXQFSbwyPHNV8ioHIE4SaC+FPOufd8jsr5jV2uIz29v1Uqy1c4ov42g==
+
+postcss@^8.4.48, postcss@^8.4.49:
+  version "8.4.49"
+  resolved "https://registry.npmmirror.com/postcss/-/postcss-8.4.49.tgz#4ea479048ab059ab3ae61d082190fabfd994fe19"
+  integrity sha512-OCVPnIObs4N29kxTjzLfUryOkvZEq+pf8jTF0lg8E7uETuWHA+v7j3c/xJmiqpX450191LlmZfUKkXxkTry7nA==
+  dependencies:
+    nanoid "^3.3.7"
+    picocolors "^1.1.1"
+    source-map-js "^1.2.1"
+
+queue-microtask@^1.2.2:
+  version "1.2.3"
+  resolved "https://registry.npmmirror.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243"
+  integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==
+
+rc9@^2.1.2:
+  version "2.1.2"
+  resolved "https://registry.npmmirror.com/rc9/-/rc9-2.1.2.tgz#6282ff638a50caa0a91a31d76af4a0b9cbd1080d"
+  integrity sha512-btXCnMmRIBINM2LDZoEmOogIZU7Qe7zn4BpomSKZ/ykbLObuBdvG+mFq11DL6fjH1DRwHhrlgtYWG96bJiC7Cg==
+  dependencies:
+    defu "^6.1.4"
+    destr "^2.0.3"
+
+readdirp@^4.0.1:
+  version "4.0.2"
+  resolved "https://registry.npmmirror.com/readdirp/-/readdirp-4.0.2.tgz#388fccb8b75665da3abffe2d8f8ed59fe74c230a"
+  integrity sha512-yDMz9g+VaZkqBYS/ozoBJwaBhTbZo3UNYQHNRw1D3UFQB8oHB4uS/tAODO+ZLjGWmUbKnIlOWO+aaIiAxrUWHA==
+
+reusify@^1.0.4:
+  version "1.0.4"
+  resolved "https://registry.npmmirror.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76"
+  integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==
+
+rollup@^4.23.0:
+  version "4.28.1"
+  resolved "https://registry.npmmirror.com/rollup/-/rollup-4.28.1.tgz#7718ba34d62b449dfc49adbfd2f312b4fe0df4de"
+  integrity sha512-61fXYl/qNVinKmGSTHAZ6Yy8I3YIJC/r2m9feHo6SwVAVcLT5MPwOUFe7EuURA/4m0NR8lXG4BBXuo/IZEsjMg==
+  dependencies:
+    "@types/estree" "1.0.6"
+  optionalDependencies:
+    "@rollup/rollup-android-arm-eabi" "4.28.1"
+    "@rollup/rollup-android-arm64" "4.28.1"
+    "@rollup/rollup-darwin-arm64" "4.28.1"
+    "@rollup/rollup-darwin-x64" "4.28.1"
+    "@rollup/rollup-freebsd-arm64" "4.28.1"
+    "@rollup/rollup-freebsd-x64" "4.28.1"
+    "@rollup/rollup-linux-arm-gnueabihf" "4.28.1"
+    "@rollup/rollup-linux-arm-musleabihf" "4.28.1"
+    "@rollup/rollup-linux-arm64-gnu" "4.28.1"
+    "@rollup/rollup-linux-arm64-musl" "4.28.1"
+    "@rollup/rollup-linux-loongarch64-gnu" "4.28.1"
+    "@rollup/rollup-linux-powerpc64le-gnu" "4.28.1"
+    "@rollup/rollup-linux-riscv64-gnu" "4.28.1"
+    "@rollup/rollup-linux-s390x-gnu" "4.28.1"
+    "@rollup/rollup-linux-x64-gnu" "4.28.1"
+    "@rollup/rollup-linux-x64-musl" "4.28.1"
+    "@rollup/rollup-win32-arm64-msvc" "4.28.1"
+    "@rollup/rollup-win32-ia32-msvc" "4.28.1"
+    "@rollup/rollup-win32-x64-msvc" "4.28.1"
+    fsevents "~2.3.2"
+
+run-parallel@^1.1.9:
+  version "1.2.0"
+  resolved "https://registry.npmmirror.com/run-parallel/-/run-parallel-1.2.0.tgz#66d1368da7bdf921eb9d95bd1a9229e7f21a43ee"
+  integrity sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==
+  dependencies:
+    queue-microtask "^1.2.2"
+
+sass@^1.83.0:
+  version "1.83.0"
+  resolved "https://registry.npmmirror.com/sass/-/sass-1.83.0.tgz#e36842c0b88a94ed336fd16249b878a0541d536f"
+  integrity sha512-qsSxlayzoOjdvXMVLkzF84DJFc2HZEL/rFyGIKbbilYtAvlCxyuzUeff9LawTn4btVnLKg75Z8MMr1lxU1lfGw==
+  dependencies:
+    chokidar "^4.0.0"
+    immutable "^5.0.2"
+    source-map-js ">=0.6.2 <2.0.0"
+  optionalDependencies:
+    "@parcel/watcher" "^2.4.1"
+
+scule@^1.3.0:
+  version "1.3.0"
+  resolved "https://registry.npmmirror.com/scule/-/scule-1.3.0.tgz#6efbd22fd0bb801bdcc585c89266a7d2daa8fbd3"
+  integrity sha512-6FtHJEvt+pVMIB9IBY+IcCJ6Z5f1iQnytgyfKMhDKgmzYG+TeH/wx1y3l27rshSbLiSanrR9ffZDrEsmjlQF2g==
+
+semver@^6.3.1:
+  version "6.3.1"
+  resolved "https://registry.npmmirror.com/semver/-/semver-6.3.1.tgz#556d2ef8689146e46dcea4bfdd095f3434dffcb4"
+  integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==
+
+semver@^7.5.4, semver@^7.6.3:
+  version "7.6.3"
+  resolved "https://registry.npmmirror.com/semver/-/semver-7.6.3.tgz#980f7b5550bc175fb4dc09403085627f9eb33143"
+  integrity sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==
+
+shebang-command@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.npmmirror.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea"
+  integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==
+  dependencies:
+    shebang-regex "^3.0.0"
+
+shebang-regex@^3.0.0:
+  version "3.0.0"
+  resolved "https://registry.npmmirror.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172"
+  integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==
+
+signal-exit@^4.1.0:
+  version "4.1.0"
+  resolved "https://registry.npmmirror.com/signal-exit/-/signal-exit-4.1.0.tgz#952188c1cbd546070e2dd20d0f41c0ae0530cb04"
+  integrity sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==
+
+slash@^5.1.0:
+  version "5.1.0"
+  resolved "https://registry.npmmirror.com/slash/-/slash-5.1.0.tgz#be3adddcdf09ac38eebe8dcdc7b1a57a75b095ce"
+  integrity sha512-ZA6oR3T/pEyuqwMgAKT0/hAv8oAXckzbkmR0UkUosQ+Mc4RxGoJkRmwHgHufaenlyAgE1Mxgpdcrf75y6XcnDg==
+
+"source-map-js@>=0.6.2 <2.0.0", source-map-js@^1.2.0, source-map-js@^1.2.1:
+  version "1.2.1"
+  resolved "https://registry.npmmirror.com/source-map-js/-/source-map-js-1.2.1.tgz#1ce5650fddd87abc099eda37dcff024c2667ae46"
+  integrity sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==
+
+std-env@^3.8.0:
+  version "3.8.0"
+  resolved "https://registry.npmmirror.com/std-env/-/std-env-3.8.0.tgz#b56ffc1baf1a29dcc80a3bdf11d7fca7c315e7d5"
+  integrity sha512-Bc3YwwCB+OzldMxOXJIIvC6cPRWr/LxOp48CdQTOkPyk/t4JWWJbrilwBd7RJzKV8QW7tJkcgAmeuLLJugl5/w==
+
+strip-final-newline@^3.0.0:
+  version "3.0.0"
+  resolved "https://registry.npmmirror.com/strip-final-newline/-/strip-final-newline-3.0.0.tgz#52894c313fbff318835280aed60ff71ebf12b8fd"
+  integrity sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==
+
+strip-literal@^2.1.1:
+  version "2.1.1"
+  resolved "https://registry.npmmirror.com/strip-literal/-/strip-literal-2.1.1.tgz#26906e65f606d49f748454a08084e94190c2e5ad"
+  integrity sha512-631UJ6O00eNGfMiWG78ck80dfBab8X6IVFB51jZK5Icd7XAs60Z5y7QdSd/wGIklnWvRbUNloVzhOKKmutxQ6Q==
+  dependencies:
+    js-tokens "^9.0.1"
+
+tar@^6.2.0:
+  version "6.2.1"
+  resolved "https://registry.npmmirror.com/tar/-/tar-6.2.1.tgz#717549c541bc3c2af15751bea94b1dd068d4b03a"
+  integrity sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==
+  dependencies:
+    chownr "^2.0.0"
+    fs-minipass "^2.0.0"
+    minipass "^5.0.0"
+    minizlib "^2.1.1"
+    mkdirp "^1.0.3"
+    yallist "^4.0.0"
+
+to-regex-range@^5.0.1:
+  version "5.0.1"
+  resolved "https://registry.npmmirror.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4"
+  integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==
+  dependencies:
+    is-number "^7.0.0"
+
+typescript@~5.6.2:
+  version "5.6.3"
+  resolved "https://registry.npmmirror.com/typescript/-/typescript-5.6.3.tgz#5f3449e31c9d94febb17de03cc081dd56d81db5b"
+  integrity sha512-hjcS1mhfuyi4WW8IWtjP7brDrG2cuDZukyrYrSauoXGNgx0S7zceP07adYkJycEr56BOUTNPzbInooiN3fn1qw==
+
+ufo@^1.5.4:
+  version "1.5.4"
+  resolved "https://registry.npmmirror.com/ufo/-/ufo-1.5.4.tgz#16d6949674ca0c9e0fbbae1fa20a71d7b1ded754"
+  integrity sha512-UsUk3byDzKd04EyoZ7U4DOlxQaD14JUKQl6/P7wiX4FNvUfm3XL246n9W5AmqwW5RSFJ27NAuM0iLscAOYUiGQ==
+
+uncrypto@^0.1.3:
+  version "0.1.3"
+  resolved "https://registry.npmmirror.com/uncrypto/-/uncrypto-0.1.3.tgz#e1288d609226f2d02d8d69ee861fa20d8348ef2b"
+  integrity sha512-Ql87qFHB3s/De2ClA9e0gsnS6zXG27SkTiSJwjCc9MebbfapQfuPzumMIUMi38ezPZVNFcHI9sUIepeQfw8J8Q==
+
+unctx@^2.3.1:
+  version "2.4.1"
+  resolved "https://registry.npmmirror.com/unctx/-/unctx-2.4.1.tgz#93346a98d4a38c64cc5861f6098f4ce7c6f8164a"
+  integrity sha512-AbaYw0Nm4mK4qjhns67C+kgxR2YWiwlDBPzxrN8h8C6VtAdCgditAY5Dezu3IJy4XVqAnbrXt9oQJvsn3fyozg==
+  dependencies:
+    acorn "^8.14.0"
+    estree-walker "^3.0.3"
+    magic-string "^0.30.17"
+    unplugin "^2.1.0"
+
+unicorn-magic@^0.1.0:
+  version "0.1.0"
+  resolved "https://registry.npmmirror.com/unicorn-magic/-/unicorn-magic-0.1.0.tgz#1bb9a51c823aaf9d73a8bfcd3d1a23dde94b0ce4"
+  integrity sha512-lRfVq8fE8gz6QMBuDM6a+LO3IAzTi05H6gCVaUpir2E1Rwpo4ZUog45KpNXKC/Mn3Yb9UDuHumeFTo9iV/D9FQ==
+
+unimport@^3.13.2:
+  version "3.14.5"
+  resolved "https://registry.npmmirror.com/unimport/-/unimport-3.14.5.tgz#6433dd21423edad6e225e61fbf8ea969bcc8bde1"
+  integrity sha512-tn890SwFFZxqaJSKQPPd+yygfKSATbM8BZWW1aCR2TJBTs1SDrmLamBueaFtYsGjHtQaRgqEbQflOjN2iW12gA==
+  dependencies:
+    "@rollup/pluginutils" "^5.1.3"
+    acorn "^8.14.0"
+    escape-string-regexp "^5.0.0"
+    estree-walker "^3.0.3"
+    fast-glob "^3.3.2"
+    local-pkg "^0.5.1"
+    magic-string "^0.30.14"
+    mlly "^1.7.3"
+    pathe "^1.1.2"
+    picomatch "^4.0.2"
+    pkg-types "^1.2.1"
+    scule "^1.3.0"
+    strip-literal "^2.1.1"
+    unplugin "^1.16.0"
+
+unplugin@^1.16.0:
+  version "1.16.0"
+  resolved "https://registry.npmmirror.com/unplugin/-/unplugin-1.16.0.tgz#ca0f248bf8798cd752dd02e5b381223b737cef72"
+  integrity sha512-5liCNPuJW8dqh3+DM6uNM2EI3MLLpCKp/KY+9pB5M2S2SR2qvvDHhKgBOaTWEbZTAws3CXfB0rKTIolWKL05VQ==
+  dependencies:
+    acorn "^8.14.0"
+    webpack-virtual-modules "^0.6.2"
+
+unplugin@^2.1.0:
+  version "2.1.0"
+  resolved "https://registry.npmmirror.com/unplugin/-/unplugin-2.1.0.tgz#c093c34bf52812131125b67d0724bd57685c830a"
+  integrity sha512-us4j03/499KhbGP8BU7Hrzrgseo+KdfJYWcbcajCOqsAyb8Gk0Yn2kiUIcZISYCb1JFaZfIuG3b42HmguVOKCQ==
+  dependencies:
+    acorn "^8.14.0"
+    webpack-virtual-modules "^0.6.2"
+
+untyped@^1.5.1:
+  version "1.5.2"
+  resolved "https://registry.npmmirror.com/untyped/-/untyped-1.5.2.tgz#36e892fab34172a9bc1d31004332ac2173b9d694"
+  integrity sha512-eL/8PlhLcMmlMDtNPKhyyz9kEBDS3Uk4yMu/ewlkT2WFbtzScjHWPJLdQLmaGPUKjXzwe9MumOtOgc4Fro96Kg==
+  dependencies:
+    "@babel/core" "^7.26.0"
+    "@babel/standalone" "^7.26.4"
+    "@babel/types" "^7.26.3"
+    citty "^0.1.6"
+    defu "^6.1.4"
+    jiti "^2.4.1"
+    knitwork "^1.2.0"
+    scule "^1.3.0"
+
+update-browserslist-db@^1.1.1:
+  version "1.1.1"
+  resolved "https://registry.npmmirror.com/update-browserslist-db/-/update-browserslist-db-1.1.1.tgz#80846fba1d79e82547fb661f8d141e0945755fe5"
+  integrity sha512-R8UzCaa9Az+38REPiJ1tXlImTJXlVfgHZsglwBD/k6nj76ctsH1E3q4doGrukiLQd3sGQYu56r5+lo5r94l29A==
+  dependencies:
+    escalade "^3.2.0"
+    picocolors "^1.1.0"
+
+vant@^4.9.10:
+  version "4.9.10"
+  resolved "https://registry.npmmirror.com/vant/-/vant-4.9.10.tgz#7c2366ad86ff16a6e2453a147f94ed63fcea429d"
+  integrity sha512-N+QwOuhDxrH2f6+kN05ot6DHBvaM0e1lcoXVvf12rad2KnlybPQ9gjm0d+R+Nz/zydZbe3Fz6bwTssHItri0sw==
+  dependencies:
+    "@vant/popperjs" "^1.3.0"
+    "@vant/use" "^1.6.0"
+    "@vue/shared" "^3.5.13"
+
+vite@^6.0.1:
+  version "6.0.3"
+  resolved "https://registry.npmmirror.com/vite/-/vite-6.0.3.tgz#cc01f403e326a9fc1e064235df8a6de084c8a491"
+  integrity sha512-Cmuo5P0ENTN6HxLSo6IHsjCLn/81Vgrp81oaiFFMRa8gGDj5xEjIcEpf2ZymZtZR8oU0P2JX5WuUp/rlXcHkAw==
+  dependencies:
+    esbuild "^0.24.0"
+    postcss "^8.4.49"
+    rollup "^4.23.0"
+  optionalDependencies:
+    fsevents "~2.3.3"
+
+vscode-uri@^3.0.8:
+  version "3.0.8"
+  resolved "https://registry.npmmirror.com/vscode-uri/-/vscode-uri-3.0.8.tgz#1770938d3e72588659a172d0fd4642780083ff9f"
+  integrity sha512-AyFQ0EVmsOZOlAnxoFOGOq1SQDWAB7C6aqMGS23svWAllfOaxbuFvcT8D1i8z3Gyn8fraVeZNNmN6e9bxxXkKw==
+
+vue-demi@^0.14.10:
+  version "0.14.10"
+  resolved "https://registry.npmmirror.com/vue-demi/-/vue-demi-0.14.10.tgz#afc78de3d6f9e11bf78c55e8510ee12814522f04"
+  integrity sha512-nMZBOwuzabUO0nLgIcc6rycZEebF6eeUfaiQx9+WSk8e29IbLvPU9feI6tqW4kTo3hvoYAJkMh8n8D0fuISphg==
+
+vue-tsc@^2.1.10:
+  version "2.1.10"
+  resolved "https://registry.npmmirror.com/vue-tsc/-/vue-tsc-2.1.10.tgz#4d61a64e5fad763b8b40c1884259fd48986f0b4e"
+  integrity sha512-RBNSfaaRHcN5uqVqJSZh++Gy/YUzryuv9u1aFWhsammDJXNtUiJMNoJ747lZcQ68wUQFx6E73y4FY3D8E7FGMA==
+  dependencies:
+    "@volar/typescript" "~2.4.8"
+    "@vue/language-core" "2.1.10"
+    semver "^7.5.4"
+
+vue@^3.5.13:
+  version "3.5.13"
+  resolved "https://registry.npmmirror.com/vue/-/vue-3.5.13.tgz#9f760a1a982b09c0c04a867903fc339c9f29ec0a"
+  integrity sha512-wmeiSMxkZCSc+PM2w2VRsOYAZC8GdipNFRTsLSfodVqI9mbejKeXEGr8SckuLnrQPGe3oJN5c3K0vpoU9q/wCQ==
+  dependencies:
+    "@vue/compiler-dom" "3.5.13"
+    "@vue/compiler-sfc" "3.5.13"
+    "@vue/runtime-dom" "3.5.13"
+    "@vue/server-renderer" "3.5.13"
+    "@vue/shared" "3.5.13"
+
+webpack-virtual-modules@^0.6.2:
+  version "0.6.2"
+  resolved "https://registry.npmmirror.com/webpack-virtual-modules/-/webpack-virtual-modules-0.6.2.tgz#057faa9065c8acf48f24cb57ac0e77739ab9a7e8"
+  integrity sha512-66/V2i5hQanC51vBQKPH4aI8NMAcBW59FVBs+rC7eGHupMyfn34q7rZIE+ETlJ+XTevqfUhVVBgSUNSW2flEUQ==
+
+which@^2.0.1:
+  version "2.0.2"
+  resolved "https://registry.npmmirror.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1"
+  integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==
+  dependencies:
+    isexe "^2.0.0"
+
+yallist@^3.0.2:
+  version "3.1.1"
+  resolved "https://registry.npmmirror.com/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd"
+  integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==
+
+yallist@^4.0.0:
+  version "4.0.0"
+  resolved "https://registry.npmmirror.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72"
+  integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==