Ver Fonte

fix:1.按需求修改页面

suwenjiang há 3 dias atrás
pai
commit
8dc600663d

+ 2 - 2
components/HomeIndex/Teachers/index.vue

@@ -71,7 +71,7 @@ const dataList = ref([
   position: absolute;
   left: 20px;
   top: 20px;
-  z-index: 99;
+  z-index: 20;
   width: 40px;
   height: 40px;
   border: 1px solid white;
@@ -101,7 +101,7 @@ const dataList = ref([
   height: 100%;
   left: 0;
   top: 0;
-  z-index: 100;
+  z-index: 20;
   box-sizing: border-box;
   padding: 1rem 1.25rem;
   overflow-y: auto;

+ 3 - 2
locales/en.json

@@ -16,12 +16,13 @@
     "courseCategory": "Course category",
     "phone": "Phone",
     "pleaseEnter": "Please enter",
+    "pleaseSelect": "Please select",
      "pleaseEnterMin": "Please enter the minimum age",
     "pleaseEnterMax": "Please enter the maximum age",
     "sendMessage": "Submit reservation information",
     "pleaseEnterSurname": "Please enter surname",
   "pleaseEnterName": "Please enter name",
-  "pleaseEnterAgeRange": "Please enter age range",
+  "pleaseEnterAgeRange": "Please select age range",
   "pleaseEnterEmail": "Please enter email",
   "pleaseEnterPhone": "Please enter phone",
   "pleaseSelectCourseType": "Please select course type",
@@ -95,7 +96,7 @@
   "graduatedFromNormalUniversity": "Graduated from a normal university.",
   "aspenChouIntroduce": "Teaching Style: Encourage education, enlighten thinking and integrate into life.<br/>Graduated from a normal university.<br/>Possess a Teacher Qualification Certificate and Mandarin Certificate at Level 2, Grade A. <br/>Have rich experience in various competitions and have won awards, such as in business competitions and the 'National English Contest for College Students' and other competitions.<br/> Have three years of one-on-one teaching experience. Be full of love and actively participate in public welfare teaching support activities. <br/>Have a standard pronunciation and intonation, and be good at oral English teaching.<br/>Have strong affinity, and conduct interesting interactions with students in class, creating a relaxed and pleasant classroom atmosphere, which is deeply loved by children.<br/>Teaching Motto:<br/>“Education is not the filling of a pail but the lighting of a fire.”——William Butler Yeats",
   "oliviaHuang": "Olivia Huang",
-  "oliviaHuangIntroduce": "Graduated from the University of Valencia, Spain with a doctorate in linguistics, with TEM-8 Certificate in English and Spanish, Mandarin Level 2A Certificate and the “National Outstanding Teacher”. Has American English pronunciation, places emphasis on practice, and cultivates students' practical application abilities.",
+  "oliviaHuangIntroduce": "Teaching Style:Rigorous scholarship, patient guidance, and individualized instruction.<br/>Graduated from Valencia University of Spain with a doctorate in linguistics, with TEM-8 Certificate in English and Spanish, and a Mandarin Level 2A Certificate.<br/>Has guided students to participate in the National English Competition and received “Excellent Guidance.<br/> Focuses on individualized teaching and can customize detailed learning plans based on individual students, earning numerous praises.<br/> Has American English pronunciation and is hold of the title “Excellent Interpreter”. Focuses on English practice and cultivates students' practical application abilities. <br/>Teaching Motto: <br/>Ignite the light of language to illuminate the path of wisdom.",
   "ourExperts": "Our Team",
   "ourExpertInstructors": "Our Expert Instructors",
   "pleaseSelectRegion": "Please select a area",

+ 3 - 2
locales/zh.json

@@ -15,12 +15,13 @@
   "courseCategory": "课程类别",
   "phone": "电话",
   "pleaseEnter": "请输入",
+  "pleaseSelect": "请选择",
   "pleaseEnterMin": "请输入最小年龄",
   "pleaseEnterMax": "请输入最大年龄",
   "sendMessage": "提交预约信息",
   "pleaseEnterSurname": "请输入姓氏",
   "pleaseEnterName": "请输入名字",
-  "pleaseEnterAgeRange": "请输入年龄段",
+  "pleaseEnterAgeRange": "请选择年龄段",
   "pleaseEnterEmail": "请输入邮箱",
   "pleaseEnterPhone": "请输入电话",
   "pleaseSelectCourseType": "请选择课程类型",
@@ -93,7 +94,7 @@
   "graduatedFromNormalUniversity": "毕业于师范大学。",
   "aspenChouIntroduce": "教学风格:鼓励教育、启迪思考、融入生活。<br/>毕业于师范类院校。<br/>持有教育部教师资格证和二级甲等普通话水平证书,获多竞赛经验奖项,商务、国才杯等。<br/>三年的一对一教学经验,富有爱心,积极参与公益支教活动。<br/>语音语调标准,善于口语教学,亲和力强,课堂多学生趣味互动,氛围轻松愉悦,深受小朋友喜爱。<br/>教育格言:<br/>教育不是注满一桶水,而是点燃一把火。—威廉·巴特勒·叶芝",
   "oliviaHuang": "黄筱雯",
-  "oliviaHuangIntroduce": "毕业于西班牙瓦伦西亚大学,获语言博士学学位,持有英语和西班牙语专业八级证书,普通话二级甲等证书,获“全国优秀教师”称号,美式发音,强调实践,注重培养学习实际应用能力。",
+  "oliviaHuangIntroduce": "教学风格:严谨治学、循循善诱、因材施教。 <br />毕业于西班牙瓦伦西亚语言学博士学位,拥有英语西班牙语专业八级,普通话二级甲等证书。<br />辅导学生参加全国英语竞赛获得优秀指导教师。<br />注重因材施教,可以根据学生个体区分定制细致的学习计划,收获众多好评。 <br />美式英语发音,曾获得“优秀口译者”称号,注重英语实践,培养学生实际运用的能力。<br />教育格言:<br />点燃语言之光,照亮智慧之路。",
   "ourExperts": "我们的团队",
   "ourExpertInstructors": "我们的专业教师",
   "pleaseSelectRegion": "请选择地区",

+ 171 - 81
pages/contact/index.vue

@@ -1,10 +1,13 @@
 <script setup>
-// import { ElButton, ElSelect, ElOption } from 'element-plus'
+import { fa } from 'element-plus/es/locale/index.mjs'
+
 const { t, locale } = useI18n()
 const { $$t } = useStoreI18n()
 
 const areaCodeList = ref([])
 const showCourseType = ref(false)
+const showAge = ref(false)
+const ageIndex = ref(null)
 const loading = ref(false)
 const showAreaCode = ref(false) // 区号
 const showCountryId = ref(false) //地区
@@ -27,6 +30,33 @@ const courseTypeList = ref([
   }
 ])
 
+const ageList = ref([
+  {
+    id: 'old',
+    label: $$t('ageBracket', ['6-9']),
+    minAge: 6,
+    maxAge: 9
+  },
+  {
+    id: 'old',
+    label: $$t('ageBracket', ['6-12']),
+    minAge: 6,
+    maxAge: 12
+  },
+  {
+    id: 'old',
+    label: $$t('ageBracket', ['9-15']),
+    minAge: 9,
+    maxAge: 15
+  },
+  {
+    id: 'old',
+    label: $$t('ageBracket', ['12-18']),
+    minAge: 12,
+    maxAge: 18
+  }
+])
+
 const studentSignUp = ref({
   surname: '',
   name: '',
@@ -47,7 +77,8 @@ const formErrors = ref({
   email: '',
   countryId: '',
   phone: '',
-  courseType: ''
+  courseType: '',
+  areaCode: ''
 })
 // 国家获取区号接口
 async function getAreaCode() {
@@ -74,10 +105,30 @@ const areaCodeLang = computed(() =>
   }))
 )
 
+const rootContainer = ref(null)
+
 onMounted(() => {
   getAreaCode()
-})
 
+  // 监听页面关闭 非 i 标签的事件操作
+  if (rootContainer.value) {
+    document.body.addEventListener('click', (event) => {
+      if (event.target.tagName.toLowerCase() != 'i') {
+        showCourseType.value = false
+        showAge.value = false
+        showAreaCode.value = false // 区号
+        showCountryId.value = false //地区
+        // alert('feii')
+        return
+      }
+
+      // alert('i')
+    })
+  }
+})
+const btnLoading = ref(false)
+// 用于存储定时器 ID
+const timerId = ref(null)
 // 学生报名
 async function submitStudentSignUp() {
   // 清空错误信息
@@ -96,7 +147,7 @@ async function submitStudentSignUp() {
     isValid = false
   }
   if (!studentSignUp.value.countryId) {
-    formErrors.value.countryId = $$t('region')
+    formErrors.value.countryId = $$t('pleaseSelectRegion')
     isValid = false
   }
   if (!studentSignUp.value.minAge && !studentSignUp.value.maxAge) {
@@ -111,6 +162,10 @@ async function submitStudentSignUp() {
     formErrors.value.phone = $$t('pleaseEnterPhone')
     isValid = false
   }
+  if (!studentSignUp.value.areaCode) {
+    formErrors.value.areaCode = $$t('pleaseSelect')
+    isValid = false
+  }
   if (!studentSignUp.value.courseType) {
     formErrors.value.courseType = $$t('pleaseSelectCourseType')
     isValid = false
@@ -134,6 +189,7 @@ async function submitStudentSignUp() {
   body.areaCode = body.areaCode.replace('+', '')
 
   try {
+    btnLoading.value = true
     let res = await request('/education/happyEntry/addHappyEntry', {
       method: 'post',
       body
@@ -141,21 +197,23 @@ async function submitStudentSignUp() {
 
     if (res) {
       ElMessage.success(t('signUpSuccess'))
-      // location.href = '/'
-      // 显示成功提示模态框
-      // const successModal = new bootstrap.Modal(document.getElementById('successModal'))
-      // successModal.show()
-    } else {
-      // 显示错误提示模态框
-      // const errorModal = new bootstrap.Modal(document.getElementById('errorModal'))
-      // errorModal.show()
+
+      timerId.value = setTimeout(() => {
+        btnLoading.value = false
+        location.href = '/'
+      }, 3000)
     }
   } catch (error) {}
 }
 
 function changeValue(name) {
+  console.log(name, 'changeValue  ')
+
   if (studentSignUp.value[name]) {
     formErrors.value[name] = ''
+    if (name == 'maxAge') {
+      formErrors.value.age = ''
+    }
   } else {
     if (!studentSignUp.value.surname) {
       formErrors.value.surname = $$t('pleaseEnterSurname')
@@ -166,10 +224,10 @@ function changeValue(name) {
       return
     }
     if (!studentSignUp.value.countryId) {
-      formErrors.value.countryId = $$t('region')
+      formErrors.value.countryId = $$t('pleaseSelectRegion')
       return
     }
-    if (!studentSignUp.value.minAge && !studentSignUp.value.maxAge) {
+    if (!studentSignUp.value.minAge || !studentSignUp.value.maxAge) {
       formErrors.value.age = $$t('pleaseEnterAgeRange')
       return
     }
@@ -181,12 +239,24 @@ function changeValue(name) {
       formErrors.value.phone = $$t('pleaseEnterPhone')
       return
     }
+    if (!studentSignUp.value.areaCode) {
+      formErrors.value.areaCode = $$t('pleaseSelect')
+      return
+    }
     if (!studentSignUp.value.courseType) {
       formErrors.value.courseType = $$t('pleaseSelectCourseType')
+      showCourseType.value = false
       return
     }
   }
 }
+
+// 清除定时器
+onUnmounted(() => {
+  if (timerId.value) {
+    clearTimeout(timerId.value)
+  }
+})
 </script>
 
 <style lang="css" scoped>
@@ -231,7 +301,7 @@ function changeValue(name) {
 .submenu {
   position: absolute;
   top: 100%;
-  z-index: 11;
+  z-index: 20;
   width: 100%;
   background: var(--white);
   position: absolute;
@@ -293,6 +363,14 @@ function changeValue(name) {
 .contact-header-bg {
   background-color: white;
 }
+
+.iclass {
+  position: absolute;
+  top: 50%;
+  right: 5%;
+  transform: translateY(-50%);
+  cursor: pointer;
+}
 </style>
 <template>
   <Preloader v-if="loading" />
@@ -349,7 +427,7 @@ function changeValue(name) {
         </div>
       </div>
     </div>
-    <section class="contact-section fix section-padding">
+    <section ref="rootContainer" class="contact-section fix section-padding">
       <div class="container">
         <div class="contact-wrapper-2">
           <div class="row g-4 align-items-center">
@@ -405,42 +483,59 @@ function changeValue(name) {
                     </div>
 
                     <div class="col-lg-6 wow fadeInUp" data-wow-delay=".6s">
-                      <div class="form-clt">
+                      <div @click.stop="showAge = !showAge" class="form-clt">
                         <span>
                           {{ $t('childAge') }}
                           <span style="color: red">*</span>
                         </span>
-                        <div class="d-flex justify-content-between">
+                        <div
+                          style="border: 1px solid #e3e3e3; border-radius: 5px; position: relative"
+                          class="d-flex justify-content-between align-items-center"
+                        >
                           <input
-                            style="width: 48%"
+                            style="width: 48%; border: none"
                             type="text"
                             v-model="studentSignUp.minAge"
                             name="minAge"
-                            id="age"
-                            :placeholder="$t('pleaseEnterMin')"
-                            @blur="changeValue('minAge')"
+                            id="minAge"
+                            readonly
+                            :placeholder="$t('pleaseSelect')"
                           />
-                          <!-- <span>
-                        {{ $t('childAge') }}
-                        <span style="color: red">*</span>
-                      </span> -->
+                          <span>--</span>
                           <input
-                            style="width: 48%"
+                            style="width: 48%; border: none"
                             type="text"
                             v-model="studentSignUp.maxAge"
                             name="maxAge"
-                            id="age"
-                            :placeholder="$t('pleaseEnterMax')"
-                            @blur="changeValue('maxAge')"
+                            id="maxAge"
+                            readonly
+                            :placeholder="$t('pleaseSelect')"
                           />
+                          <i :class="`fas iclass ${showAge ? 'fa-angle-up' : 'fa-angle-down'}`"></i>
+                          <ul v-show="showAge" class="submenu">
+                            <li
+                              v-for="(item, index) in ageList"
+                              :key="item.id + index"
+                              :class="`${ageIndex == index ? 'liactive' : ''}`"
+                              @click.stop="
+                                ;(ageIndex = index),
+                                  (studentSignUp.maxAge = item.maxAge),
+                                  (studentSignUp.minAge = item.minAge),
+                                  (showAge = !showAge),
+                                  changeValue('maxAge')
+                              "
+                            >
+                              {{ item.label }}
+                            </li>
+                          </ul>
                         </div>
-                        <p v-if="formErrors.age" class="error">
-                          {{ formErrors.age }}
-                        </p>
                       </div>
+                      <p v-if="formErrors.age" class="error">
+                        {{ formErrors.age }}
+                      </p>
                     </div>
                     <div class="col-lg-6 wow fadeInUp" data-wow-delay=".6s">
-                      <div class="form-clt">
+                      <div @click.stop="showCountryId = !showCountryId" class="form-clt">
                         <span>
                           {{ $t('region') }}
                           <span style="color: red">*</span>
@@ -453,21 +548,9 @@ function changeValue(name) {
                             id="countryId"
                             readonly
                             :placeholder="$t('pleaseSelectRegion')"
-                            @blur="changeValue('countryId')"
                           />
-                          <p v-if="formErrors.countryId" class="error">
-                            {{ formErrors.countryId }}
-                          </p>
                           <i
-                            style="
-                              position: absolute;
-                              top: 50%;
-                              right: 5%;
-                              transform: translateY(-50%);
-                              cursor: pointer;
-                            "
-                            :class="`fas ${showCountryId ? 'fa-angle-up' : 'fa-angle-down'}`"
-                            @click="showCountryId = !showCountryId"
+                            :class="`fas iclass ${showCountryId ? 'fa-angle-up' : 'fa-angle-down'}`"
                           ></i>
 
                           <ul v-show="showCountryId" class="submenu">
@@ -475,9 +558,10 @@ function changeValue(name) {
                               v-for="(item, index) in areaCodeLang"
                               :key="item.id"
                               :class="`${studentSignUp.countryId == item.label ? 'liactive' : ''}`"
-                              @click="
+                              @click.stop="
                                 ;(studentSignUp.countryId = item.label),
-                                  (showCountryId = !showCountryId)
+                                  (showCountryId = !showCountryId),
+                                  changeValue('countryId')
                               "
                             >
                               {{ item.label }}
@@ -485,6 +569,9 @@ function changeValue(name) {
                           </ul>
                         </div>
                       </div>
+                      <p v-if="formErrors.countryId" class="error">
+                        {{ formErrors.countryId }}
+                      </p>
                     </div>
                     <div class="col-lg-6 wow fadeInUp" data-wow-delay=".7s">
                       <div class="form-clt">
@@ -494,25 +581,24 @@ function changeValue(name) {
                         </span>
 
                         <div style="flex-wrap: nowrap" class="d-flex">
-                          <div style="box-sizing: border-box; position: relative; max-width: 150px">
+                          <div
+                            @click.stop="showAreaCode = !showAreaCode"
+                            style="box-sizing: border-box; position: relative; max-width: 150px"
+                          >
                             <input
                               style="width: 100%"
                               type="text"
                               v-model="studentSignUp.areaCode"
-                              name="phone"
-                              id="phone"
-                              :placeholder="$t('pleaseEnter')"
+                              name="areaCode"
+                              id="areaCode"
+                              readonly
+                              :placeholder="$t('pleaseSelect')"
                             />
                             <i
-                              style="
-                                position: absolute;
-                                top: 50%;
-                                transform: translateY(-50%);
-                                right: 10%;
-                                cursor: pointer;
-                              "
-                              :class="`fas ${showAreaCode ? 'fa-angle-up' : 'fa-angle-down'}`"
-                              @click="showAreaCode = !showAreaCode"
+                              :class="`fas iclass ${
+                                showAreaCode ? 'fa-angle-up' : 'fa-angle-down'
+                              }`"
+                              style="right: 10%"
                             ></i>
                             <ul v-show="showAreaCode" style="position: absolute" class="submenu">
                               <li
@@ -521,7 +607,7 @@ function changeValue(name) {
                                 :class="`${
                                   studentSignUp.areaCode == '+' + item.value ? 'liactive' : ''
                                 }`"
-                                @click="
+                                @click.stop="
                                   ;(studentSignUp.areaCode = '+' + item.value),
                                     (showAreaCode = !showAreaCode)
                                 "
@@ -541,13 +627,16 @@ function changeValue(name) {
                             @blur="changeValue('phone')"
                           />
                         </div>
-                        <p v-if="formErrors.phone" class="error">
+                        <p v-if="formErrors.phone || formErrors.areaCode" class="error">
+                          <span style="color: red; font-size: 14px; margin-right: 15%">
+                            {{ formErrors.areaCode }}
+                          </span>
                           {{ formErrors.phone }}
                         </p>
                       </div>
                     </div>
                     <div class="col-lg-6 wow fadeInUp" data-wow-delay=".8s">
-                      <div class="form-clt">
+                      <div @click.stop="showCourseType = !showCourseType" class="form-clt">
                         <span>
                           {{ $t('courseCategory') }}
                           <span style="color: red">*</span>
@@ -560,21 +649,13 @@ function changeValue(name) {
                             id="courseType"
                             readonly
                             :placeholder="$t('pleaseSelectCourseType')"
-                            @blur="changeValue('courseType')"
                           />
-                          <p v-if="formErrors.courseType" class="error">
-                            {{ formErrors.courseType }}
-                          </p>
+                          <!--  @blur="changeValue('courseType')" -->
+
                           <i
-                            style="
-                              position: absolute;
-                              top: 50%;
-                              right: 5%;
-                              transform: translateY(-50%);
-                              cursor: pointer;
-                            "
-                            :class="`fas ${showCourseType ? 'fa-angle-up' : 'fa-angle-down'}`"
-                            @click="showCourseType = !showCourseType"
+                            :class="`fas iclass ${
+                              showCourseType ? 'fa-angle-up' : 'fa-angle-down'
+                            }`"
                           ></i>
 
                           <ul v-show="showCourseType" class="submenu">
@@ -582,9 +663,10 @@ function changeValue(name) {
                               v-for="(item, index) in courseTypeList"
                               :key="item.value"
                               :class="`${studentSignUp.courseType == item.label ? 'liactive' : ''}`"
-                              @click="
+                              @click.stop="
                                 ;(studentSignUp.courseType = item.label),
-                                  (showCourseType = !showCourseType)
+                                  (showCourseType = !showCourseType),
+                                  changeValue('courseType')
                               "
                             >
                               {{ item.label }}
@@ -592,6 +674,9 @@ function changeValue(name) {
                           </ul>
                         </div>
                       </div>
+                      <p v-if="formErrors.courseType" class="error">
+                        {{ formErrors.courseType }}
+                      </p>
                     </div>
                     <div class="col-lg-12 wow fadeInUp" data-wow-delay=".9s">
                       <div class="form-clt">
@@ -617,7 +702,12 @@ function changeValue(name) {
                       class="col-lg-12 wow fadeInUp d-flex justify-content-center align-items-center"
                       data-wow-delay=".9s"
                     >
-                      <button type="submit" class="theme-btn" style="border-radius: 5px">
+                      <button
+                        type="submit"
+                        :disabled="btnLoading"
+                        class="theme-btn"
+                        style="border-radius: 5px"
+                      >
                         {{ $t('sendMessage') }}
                         <i class="fa-solid fa-arrow-right-long"></i>
                       </button>

+ 0 - 1
pages/index/index.client.vue

@@ -3,7 +3,6 @@ const { t, locale, setLocale } = useI18n()
 </script>
 
 <template>
-  <!-- <Preloader /> -->
   <FixArea></FixArea>
   <Header-top-section />
   <TopHeader />

+ 38 - 3
pnpm-lock.yaml

@@ -47,7 +47,7 @@ importers:
         version: 16.0.5(sass@1.85.1)
       unplugin-auto-import:
         specifier: ^19.1.1
-        version: 19.1.1(@nuxt/kit@3.15.4(magicast@0.3.5))(@vueuse/core@9.13.0(vue@3.5.13(typescript@5.8.2)))
+        version: 19.1.1(@nuxt/kit@3.15.4(magicast@0.3.5))(@vueuse/core@13.0.0(vue@3.5.13(typescript@5.8.2)))
       unplugin-vue-components:
         specifier: ^28.4.1
         version: 28.4.1(@babel/parser@7.26.9)(@nuxt/kit@3.15.4(magicast@0.3.5))(vue@3.5.13(typescript@5.8.2))
@@ -1137,6 +1137,9 @@ packages:
   '@types/web-bluetooth@0.0.16':
     resolution: {integrity: sha512-oh8q2Zc32S6gd/j50GowEjKLoOVOwHP/bWVjKJInBwQqdOYMdPrf1oVlelTlyfFK3CKxL1uahMDAr+vy8T7yMQ==}
 
+  '@types/web-bluetooth@0.0.21':
+    resolution: {integrity: sha512-oIQLCGWtcFZy2JW77j9k8nHzAOpqMHLQejDA48XXMWH6tjCQHz5RCFz1bzsmROyL6PUm+LLnUiI4BCn221inxA==}
+
   '@typescript-eslint/scope-manager@8.26.0':
     resolution: {integrity: sha512-E0ntLvsfPqnPwng8b8y4OGuzh/iIOm2z8U3S9zic2TeMLW61u5IH2Q1wu0oSTkfrSzwbDJIB/Lm8O3//8BWMPA==}
     engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
@@ -1259,12 +1262,25 @@ packages:
   '@vue/shared@3.5.13':
     resolution: {integrity: sha512-/hnE/qP5ZoGpol0a5mDi45bOd7t3tjYJBjsgCsivow7D48cJeV5l05RD82lPqi7gRiphZM37rnhW1l6ZoCNNnQ==}
 
+  '@vueuse/core@13.0.0':
+    resolution: {integrity: sha512-rkgb4a8/0b234lMGCT29WkCjPfsX0oxrIRR7FDndRoW3FsaC9NBzefXg/9TLhAgwM11f49XnutshM4LzJBrQ5g==}
+    peerDependencies:
+      vue: ^3.5.0
+
   '@vueuse/core@9.13.0':
     resolution: {integrity: sha512-pujnclbeHWxxPRqXWmdkKV5OX4Wk4YeK7wusHqRwU0Q7EFusHoqNA/aPhB6KCh9hEqJkLAJo7bb0Lh9b+OIVzw==}
 
+  '@vueuse/metadata@13.0.0':
+    resolution: {integrity: sha512-TRNksqmvtvqsuHf7bbgH9OSXEV2b6+M3BSN4LR5oxWKykOFT9gV78+C2/0++Pq9KCp9KQ1OQDPvGlWNQpOb2Mw==}
+
   '@vueuse/metadata@9.13.0':
     resolution: {integrity: sha512-gdU7TKNAUVlXXLbaF+ZCfte8BjRJQWPCa2J55+7/h+yDtzw3vOoGQDRXzI6pyKyo6bXFT5/QoPE4hAknExjRLQ==}
 
+  '@vueuse/shared@13.0.0':
+    resolution: {integrity: sha512-9MiHhAPw+sqCF/RLo8V6HsjRqEdNEWVpDLm2WBRW2G/kSQjb8X901sozXpSCaeLG0f7TEfMrT4XNaA5m1ez7Dg==}
+    peerDependencies:
+      vue: ^3.5.0
+
   '@vueuse/shared@9.13.0':
     resolution: {integrity: sha512-UrnhU+Cnufu4S6JLCPZnkWh0WwZGUp72ktOF2DFptMlOs3TOdVv8xJN53zhHGARmVOsz5KqOls09+J1NR6sBKw==}
 
@@ -5012,6 +5028,9 @@ snapshots:
 
   '@types/web-bluetooth@0.0.16': {}
 
+  '@types/web-bluetooth@0.0.21':
+    optional: true
+
   '@typescript-eslint/scope-manager@8.26.0':
     dependencies:
       '@typescript-eslint/types': 8.26.0
@@ -5223,6 +5242,14 @@ snapshots:
 
   '@vue/shared@3.5.13': {}
 
+  '@vueuse/core@13.0.0(vue@3.5.13(typescript@5.8.2))':
+    dependencies:
+      '@types/web-bluetooth': 0.0.21
+      '@vueuse/metadata': 13.0.0
+      '@vueuse/shared': 13.0.0(vue@3.5.13(typescript@5.8.2))
+      vue: 3.5.13(typescript@5.8.2)
+    optional: true
+
   '@vueuse/core@9.13.0(vue@3.5.13(typescript@5.8.2))':
     dependencies:
       '@types/web-bluetooth': 0.0.16
@@ -5233,8 +5260,16 @@ snapshots:
       - '@vue/composition-api'
       - vue
 
+  '@vueuse/metadata@13.0.0':
+    optional: true
+
   '@vueuse/metadata@9.13.0': {}
 
+  '@vueuse/shared@13.0.0(vue@3.5.13(typescript@5.8.2))':
+    dependencies:
+      vue: 3.5.13(typescript@5.8.2)
+    optional: true
+
   '@vueuse/shared@9.13.0(vue@3.5.13(typescript@5.8.2))':
     dependencies:
       vue-demi: 0.14.10(vue@3.5.13(typescript@5.8.2))
@@ -7686,7 +7721,7 @@ snapshots:
 
   universalify@2.0.1: {}
 
-  unplugin-auto-import@19.1.1(@nuxt/kit@3.15.4(magicast@0.3.5))(@vueuse/core@9.13.0(vue@3.5.13(typescript@5.8.2))):
+  unplugin-auto-import@19.1.1(@nuxt/kit@3.15.4(magicast@0.3.5))(@vueuse/core@13.0.0(vue@3.5.13(typescript@5.8.2))):
     dependencies:
       local-pkg: 1.1.1
       magic-string: 0.30.17
@@ -7696,7 +7731,7 @@ snapshots:
       unplugin-utils: 0.2.4
     optionalDependencies:
       '@nuxt/kit': 3.15.4(magicast@0.3.5)
-      '@vueuse/core': 9.13.0(vue@3.5.13(typescript@5.8.2))
+      '@vueuse/core': 13.0.0(vue@3.5.13(typescript@5.8.2))
 
   unplugin-utils@0.2.4:
     dependencies: