diff --git a/components/common/CommonAlert.vue b/components/common/CommonAlert.vue
index 01aaa2d3..dabf780d 100644
--- a/components/common/CommonAlert.vue
+++ b/components/common/CommonAlert.vue
@@ -1,14 +1,10 @@
 <script lang="ts" setup>
-const props = withDefaults(defineProps<{
-  modelValue?: boolean
-}>(), {
-  modelValue: true,
-})
 const emit = defineEmits<{
-  (e: 'update:modelValue', v: boolean): void
   (event: 'close'): void
 }>()
-const visible = useVModel(props, 'modelValue', emit, { passive: true })
+const { modelValue: visible } = defineModel<{
+  modelValue?: boolean
+}>()
 
 function close() {
   emit('close')
diff --git a/components/common/CommonCropImage.vue b/components/common/CommonCropImage.vue
index a0557210..a1eebba4 100644
--- a/components/common/CommonCropImage.vue
+++ b/components/common/CommonCropImage.vue
@@ -4,8 +4,6 @@ import { Cropper } from 'vue-advanced-cropper'
 import 'vue-advanced-cropper/dist/style.css'
 
 export interface Props {
-  /** Images to be cropped */
-  modelValue?: File | null
   /** Crop frame aspect ratio (width/height), default 1/1 */
   stencilAspectRatio?: number
   /** The ratio of the longest edge of the cut box to the length of the cut screen, default 0.9, not more than 1 */
@@ -16,12 +14,11 @@ const props = withDefaults(defineProps<Props>(), {
   stencilSizePercentage: 0.9,
 })
 
-const emit = defineEmits<{
-  (event: 'update:modelValue', value: File): void
+const { modelValue: file } = defineModel<{
+  /** Images to be cropped */
+  modelValue: File | null
 }>()
 
-const vmFile = useVModel(props, 'modelValue', emit, { passive: true })
-
 const cropperDialog = ref(false)
 
 const cropper = ref<InstanceType<typeof Cropper>>()
@@ -40,7 +37,7 @@ const stencilSize = ({ boundaries }: { boundaries: Boundaries }) => {
   }
 }
 
-watch(vmFile, (file, _, onCleanup) => {
+watch(file, (file, _, onCleanup) => {
   let expired = false
   onCleanup(() => expired = true)
 
@@ -59,12 +56,12 @@ watch(vmFile, (file, _, onCleanup) => {
 })
 
 const cropImage = () => {
-  if (cropper.value && vmFile.value) {
+  if (cropper.value && file.value) {
     cropperFlag.value = true
     cropperDialog.value = false
     const { canvas } = cropper.value.getResult()
     canvas?.toBlob((blob) => {
-      vmFile.value = new File([blob as any], `cropped${vmFile.value?.name}` as string, { type: blob?.type })
+      file.value = new File([blob as any], `cropped${file.value?.name}` as string, { type: blob?.type })
     }, cropperImage.type)
   }
 }
diff --git a/components/common/CommonInputImage.vue b/components/common/CommonInputImage.vue
index 3d88734a..595d5786 100644
--- a/components/common/CommonInputImage.vue
+++ b/components/common/CommonInputImage.vue
@@ -3,7 +3,6 @@ import { fileOpen } from 'browser-fs-access'
 import type { FileWithHandle } from 'browser-fs-access'
 
 const props = withDefaults(defineProps<{
-  modelValue?: FileWithHandle | null
   /** The image src before change */
   original?: string
   /** Allowed file types */
@@ -19,12 +18,13 @@ const props = withDefaults(defineProps<{
   allowedFileSize: 1024 * 1024 * 5, // 5 MB
 })
 const emit = defineEmits<{
-  (event: 'update:modelValue', value: FileWithHandle): void
   (event: 'pick', value: FileWithHandle): void
   (event: 'error', code: number, message: string): void
 }>()
 
-const file = useVModel(props, 'modelValue', emit, { passive: true })
+const { modelValue: file } = defineModel<{
+  modelValue: FileWithHandle | null
+}>()
 
 const { t } = useI18n()
 
diff --git a/components/modal/ModalDialog.vue b/components/modal/ModalDialog.vue
index c20696d2..af51f5dc 100644
--- a/components/modal/ModalDialog.vue
+++ b/components/modal/ModalDialog.vue
@@ -2,9 +2,6 @@
 import { useFocusTrap } from '@vueuse/integrations/useFocusTrap'
 
 export interface Props {
-  /** v-model dislog visibility */
-  modelValue: boolean
-
   /**
    * level of depth
    *
@@ -48,11 +45,13 @@ const props = withDefaults(defineProps<Props>(), {
 
 const emit = defineEmits<{
   /** v-model dialog visibility */
-  (event: 'update:modelValue', value: boolean): void
   (event: 'close',): void
 }>()
 
-const visible = useVModel(props, 'modelValue', emit, { passive: true })
+const { modelValue: visible } = defineModel<{
+  /** v-model dislog visibility */
+  modelValue: boolean
+}>()
 
 const deactivated = useDeactivated()
 const route = useRoute()
diff --git a/components/modal/ModalMediaPreviewCarousel.vue b/components/modal/ModalMediaPreviewCarousel.vue
index edad636c..b2e76a5f 100644
--- a/components/modal/ModalMediaPreviewCarousel.vue
+++ b/components/modal/ModalMediaPreviewCarousel.vue
@@ -3,19 +3,20 @@ import { SwipeDirection } from '@vueuse/core'
 import { useReducedMotion } from '@vueuse/motion'
 import type { Attachment } from 'masto'
 
-const props = withDefaults(defineProps<{ media: Attachment[]; threshold?: number; modelValue: number }>(), {
-  media: [] as any,
-  threshold: 20,
-  modelValue: 0,
-})
+const { media = [], threshold = 20 } = defineProps<{
+  media?: Attachment[]
+  threshold?: number
+}>()
 
 const emit = defineEmits<{
-  (e: 'update:modelValue', v: boolean): void
   (event: 'close'): void
 }>()
 
+const { modelValue } = defineModel<{
+  modelValue: number
+}>()
+
 const target = ref()
-const index = useVModel(props, 'modelValue', emit)
 
 const animateTimeout = useTimeout(10)
 const reduceMotion = useReducedMotion()
@@ -28,15 +29,15 @@ const { isSwiping, lengthX, lengthY, direction } = useSwipe(target, {
   passive: false,
   onSwipeEnd(e, direction) {
     // eslint-disable-next-line @typescript-eslint/no-use-before-define
-    if (direction === SwipeDirection.RIGHT && Math.abs(distanceX.value) > props.threshold)
-      index.value = Math.max(0, index.value - 1)
+    if (direction === SwipeDirection.RIGHT && Math.abs(distanceX.value) > threshold)
+      modelValue.value = Math.max(0, modelValue.value - 1)
 
     // eslint-disable-next-line @typescript-eslint/no-use-before-define
-    if (direction === SwipeDirection.LEFT && Math.abs(distanceX.value) > props.threshold)
-      index.value = Math.min(props.media.length - 1, index.value + 1)
+    if (direction === SwipeDirection.LEFT && Math.abs(distanceX.value) > threshold)
+      modelValue.value = Math.min(media.length - 1, modelValue.value + 1)
 
     // eslint-disable-next-line @typescript-eslint/no-use-before-define
-    if (direction === SwipeDirection.UP && Math.abs(distanceY.value) > props.threshold)
+    if (direction === SwipeDirection.UP && Math.abs(distanceY.value) > threshold)
       emit('close')
   },
 })
@@ -46,9 +47,9 @@ const distanceX = computed(() => {
     return 0
 
   if (!isSwiping.value || (direction.value !== SwipeDirection.LEFT && direction.value !== SwipeDirection.RIGHT))
-    return index.value * 100 * -1
+    return modelValue.value * 100 * -1
 
-  return (lengthX.value / width.value) * 100 * -1 + (index.value * 100) * -1
+  return (lengthX.value / width.value) * 100 * -1 + (modelValue.value * 100) * -1
 })
 
 const distanceY = computed(() => {
diff --git a/components/nav/NavBottom.vue b/components/nav/NavBottom.vue
index 24b4543a..8bf68cf5 100644
--- a/components/nav/NavBottom.vue
+++ b/components/nav/NavBottom.vue
@@ -38,12 +38,12 @@ const moreMenuVisible = ref(false)
         <div i-ri:earth-line />
       </NuxtLink>
     </template>
-    <NavBottomMoreMenu v-slot="{ changeShow, show }" v-model="moreMenuVisible" flex flex-row items-center place-content-center h-full flex-1 cursor-pointer>
+    <NavBottomMoreMenu v-slot="{ toggleVisible, show }" v-model="moreMenuVisible" flex flex-row items-center place-content-center h-full flex-1 cursor-pointer>
       <label
         flex items-center place-content-center h-full flex-1 class="select-none"
         :class="show ? '!text-primary' : ''"
       >
-        <input type="checkbox" z="-1" absolute inset-0 opacity-0 @click="changeShow">
+        <input type="checkbox" z="-1" absolute inset-0 opacity-0 @click="toggleVisible">
         <span v-show="show" i-ri:close-fill />
         <span v-show="!show" i-ri:more-fill />
       </label>
diff --git a/components/nav/NavBottomMoreMenu.vue b/components/nav/NavBottomMoreMenu.vue
index 6dd117c9..45799cbc 100644
--- a/components/nav/NavBottomMoreMenu.vue
+++ b/components/nav/NavBottomMoreMenu.vue
@@ -1,24 +1,20 @@
 <script lang="ts" setup>
-const props = defineProps<{
-  modelValue?: boolean
+let { modelValue } = $defineModel<{
+  modelValue: boolean
 }>()
-const emit = defineEmits<{
-  (event: 'update:modelValue', value: boolean): void
-}>()
-const visible = useVModel(props, 'modelValue', emit, { passive: true })
 const colorMode = useColorMode()
 
-function changeShow() {
-  visible.value = !visible.value
+function toggleVisible() {
+  modelValue = !modelValue
 }
 
 const buttonEl = ref<HTMLDivElement>()
 /** Close the drop-down menu if the mouse click is not on the drop-down menu button when the drop-down menu is opened */
 function clickEvent(mouse: MouseEvent) {
   if (mouse.target && !buttonEl.value?.children[0].contains(mouse.target as any)) {
-    if (visible.value) {
+    if (modelValue) {
       document.removeEventListener('click', clickEvent)
-      visible.value = false
+      modelValue = false
     }
   }
 }
@@ -27,7 +23,7 @@ function toggleDark() {
   colorMode.preference = colorMode.value === 'dark' ? 'light' : 'dark'
 }
 
-watch(visible, (val) => {
+watch($$(modelValue), (val) => {
   if (val && typeof document !== 'undefined')
     document.addEventListener('click', clickEvent)
 })
@@ -39,7 +35,7 @@ onBeforeUnmount(() => {
 
 <template>
   <div ref="buttonEl" flex items-center static>
-    <slot :change-show="changeShow" :show="visible" />
+    <slot :toggle-visible="toggleVisible" :show="modelValue" />
 
     <!-- Drawer -->
     <Transition
@@ -51,7 +47,7 @@ onBeforeUnmount(() => {
       leave-to-class="opacity-0 children:(transform translate-y-full)"
     >
       <div
-        v-show="visible"
+        v-show="modelValue"
         absolute inset-x-0 top-auto bottom-full z-20 h-100vh
         flex items-end of-y-scroll of-x-hidden scrollbar-hide overscroll-none
         bg="black/50"
diff --git a/package.json b/package.json
index 768046a7..ac36f67f 100644
--- a/package.json
+++ b/package.json
@@ -86,7 +86,7 @@
     "@types/wicg-file-system-access": "^2020.9.5",
     "@unocss/nuxt": "^0.48.0",
     "@vitejs/plugin-vue": "^3.2.0",
-    "@vue-macros/nuxt": "^0.2.2",
+    "@vue-macros/nuxt": "^0.2.8",
     "@vueuse/nuxt": "^9.9.0",
     "bumpp": "^8.2.1",
     "emoji-mart": "^5.4.0",
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index 6f09d6f4..f06f9834 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -33,7 +33,7 @@ specifiers:
   '@types/wicg-file-system-access': ^2020.9.5
   '@unocss/nuxt': ^0.48.0
   '@vitejs/plugin-vue': ^3.2.0
-  '@vue-macros/nuxt': ^0.2.2
+  '@vue-macros/nuxt': ^0.2.8
   '@vueuse/core': ^9.9.0
   '@vueuse/gesture': 2.0.0-beta.1
   '@vueuse/integrations': ^9.9.0
@@ -146,7 +146,7 @@ devDependencies:
   '@types/wicg-file-system-access': 2020.9.5
   '@unocss/nuxt': 0.48.0
   '@vitejs/plugin-vue': 3.2.0
-  '@vue-macros/nuxt': 0.2.2_3nbxte3dhogb6b7pemmre2vo4m
+  '@vue-macros/nuxt': 0.2.8_3nbxte3dhogb6b7pemmre2vo4m
   '@vueuse/nuxt': 9.9.0_nuxt@3.0.0
   bumpp: 8.2.1
   emoji-mart: 5.4.0
@@ -167,7 +167,7 @@ devDependencies:
   typescript: 4.9.4
   unplugin-auto-import: 0.12.1_@vueuse+core@9.9.0
   vite-plugin-inspect: 0.7.11
-  vite-plugin-pwa: 0.13.3
+  vite-plugin-pwa: 0.13.3_workbox-window@6.5.4
   vitest: 0.26.2_jsdom@20.0.3
   vue-tsc: 1.0.16_typescript@4.9.4
   workbox-window: 6.5.4
@@ -572,6 +572,14 @@ packages:
     dependencies:
       '@babel/types': 7.20.5
 
+  /@babel/parser/7.20.7:
+    resolution: {integrity: sha512-T3Z9oHybU+0vZlY9CiDSJQTD5ZapcW18ZctFMi0MOAl/4BjFF4ul7NVSARLdbGO5vDqy9eQiGTV0LtKfvCYvcg==}
+    engines: {node: '>=6.0.0'}
+    hasBin: true
+    dependencies:
+      '@babel/types': 7.20.7
+    dev: true
+
   /@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/7.18.6_@babel+core@7.20.5:
     resolution: {integrity: sha512-Dgxsyg54Fx1d4Nge8UnvTrED63vrwOdPmyvPzlNN/boaliRP54pm3pGzZD1SJUwrBA+Cs/xdG8kXX6Mn/RfISQ==}
     engines: {node: '>=6.9.0'}
@@ -1454,6 +1462,15 @@ packages:
       '@babel/helper-validator-identifier': 7.19.1
       to-fast-properties: 2.0.0
 
+  /@babel/types/7.20.7:
+    resolution: {integrity: sha512-69OnhBxSSgK0OzTJai4kyPDiKTIe3j+ctaHdIGVbRahTLAT7L3R9oeXHC2aVSuGYt3cVnoAMDmOCgJ2yaiLMvg==}
+    engines: {node: '>=6.9.0'}
+    dependencies:
+      '@babel/helper-string-parser': 7.19.4
+      '@babel/helper-validator-identifier': 7.19.1
+      to-fast-properties: 2.0.0
+    dev: true
+
   /@cloudflare/kv-asset-handler/0.2.0:
     resolution: {integrity: sha512-MVbXLbTcAotOPUj0pAMhVtJ+3/kFkwJqc5qNOleOZTv6QkZZABDMS21dSrSlVswEHwrpWC03e4fWytjqKvuE2A==}
     dependencies:
@@ -3150,12 +3167,25 @@ packages:
       muggle-string: 0.1.0
     dev: true
 
+  /@volar/language-core/1.0.22:
+    resolution: {integrity: sha512-hiJeCOqxNdtG/04FRGLGI9H9DVz2l6cTqPDBzwqplHXAWfMxjzUaGUrn9sfTG7YMFNZUgK4EYxJnRfhqdtbSFQ==}
+    dependencies:
+      '@volar/source-map': 1.0.22
+      muggle-string: 0.1.0
+    dev: true
+
   /@volar/source-map/1.0.16:
     resolution: {integrity: sha512-PKjzmQcg8QOGC/1V9tmGh2jcy6bKLhkW5bGidElSr83iDbCzLvldt2/La/QlDxaRCHYLT0MeyuGJBZIChB1dYQ==}
     dependencies:
       muggle-string: 0.1.0
     dev: true
 
+  /@volar/source-map/1.0.22:
+    resolution: {integrity: sha512-cv4gypHSP4MWVR82ed/+1IpI6794qAl0Q0+KJ+VGMVF8rVugsiF9QbyMCgjel9wNRsssQsazzsf6txOR9vHQiw==}
+    dependencies:
+      muggle-string: 0.1.0
+    dev: true
+
   /@volar/typescript/1.0.16:
     resolution: {integrity: sha512-Yov+n4oO3iYnuMt9QJAFpJabfTRCzc7KvjlAwBaSuZy+Gc/f9611MgtqAh5/SIGmltFN8dXn1Ijno8ro8I4lyw==}
     dependencies:
@@ -3182,31 +3212,31 @@ packages:
       '@volar/vue-language-core': 1.0.16
     dev: true
 
-  /@vue-macros/api/0.2.1:
-    resolution: {integrity: sha512-5tbvjahcvu+LYnm0c6sB1Ax4KyUzl0kIv8nWBdE/PdQOru98ll5rjIxL/OWbpseSzfsqrHpRvZZK8dKDuZ34pQ==}
+  /@vue-macros/api/0.2.3:
+    resolution: {integrity: sha512-T84WwcFvg0Q9E+QHLeLMubYGBoIly5gZaKtBhxbZ7lzYjD5LRi55gKHA5ao8k8DTOulHTpHBLEt25PTldpheJg==}
     engines: {node: '>=14.19.0'}
     dependencies:
-      '@babel/types': 7.20.5
-      '@vue-macros/common': 0.13.5
+      '@babel/types': 7.20.7
+      '@vue-macros/common': 0.13.6
     transitivePeerDependencies:
       - vue
     dev: true
 
-  /@vue-macros/better-define/1.1.1:
-    resolution: {integrity: sha512-f9HqwOHt1mmyoBzVUOKAQ+Z2zLxklPdm9FXjG6M8MAKhlwLgG9horTQKUs/oYce65OVf2c8BpDu+0Y91EIG1rw==}
+  /@vue-macros/better-define/1.1.3:
+    resolution: {integrity: sha512-zudEjFa4bYNyjgVWs6kVTn3CeJRtuNVuo/Ny6nHO+OLi6B2G2aRWAQrbp1YI7uvEJYS3dUdnKrX+58icGf1WmQ==}
     engines: {node: '>=14.19.0'}
     dependencies:
       '@rollup/pluginutils': 5.0.2
-      '@vue-macros/api': 0.2.1
-      '@vue-macros/common': 0.13.5
+      '@vue-macros/api': 0.2.3
+      '@vue-macros/common': 0.13.6
       unplugin: 1.0.1
     transitivePeerDependencies:
       - rollup
       - vue
     dev: true
 
-  /@vue-macros/common/0.13.5:
-    resolution: {integrity: sha512-i8BqdPsc+CR9p9KqwGi7QLmLkT+E1rN6qdw5wYI6BIdrayjyxCCoKyRsCoxA2gooZ1UCW75yknmc89zg8yco+w==}
+  /@vue-macros/common/0.13.6:
+    resolution: {integrity: sha512-KXweBlWTpsWCPy3TLCRCG4mm4zsRoesZLEjxVo7KJdFYqSQBNmCBKprFkBBl36jzq96FqtZIAgQhv8se1R0vqA==}
     engines: {node: '>=14.19.0'}
     peerDependencies:
       vue: ^2.7.0 || ^3.2.25
@@ -3214,14 +3244,14 @@ packages:
       vue:
         optional: true
     dependencies:
-      '@babel/types': 7.20.5
+      '@babel/types': 7.20.7
       '@vue/compiler-sfc': 3.2.45
       local-pkg: 0.4.2
       magic-string: 0.27.0
     dev: true
 
-  /@vue-macros/define-model/1.1.1_@vueuse+core@9.9.0:
-    resolution: {integrity: sha512-P9kY0s68sH4LxD9ziyqSzO2d2soQcM2467rFMQNJtmvwkhEGWZ8Z2P8RsV96km9R4laQMHiQGq5S6j58/b0drg==}
+  /@vue-macros/define-model/1.2.0_@vueuse+core@9.9.0:
+    resolution: {integrity: sha512-VJBDuYqgdqoUB2uFqe/qxFI13D73hqdReFqkxJQu7GulU629CUqYujO51BPnbCrd6pbEvGVaExNfQFBoaHq3xw==}
     engines: {node: '>=14.19.0'}
     peerDependencies:
       '@vueuse/core': ^9.0.0
@@ -3230,7 +3260,7 @@ packages:
         optional: true
     dependencies:
       '@rollup/pluginutils': 5.0.2
-      '@vue-macros/common': 0.13.5
+      '@vue-macros/common': 0.13.6
       '@vueuse/core': 9.9.0
       ast-walker-scope: 0.3.1
       unplugin: 1.0.1
@@ -3239,63 +3269,63 @@ packages:
       - vue
     dev: true
 
-  /@vue-macros/define-props/0.1.1:
-    resolution: {integrity: sha512-IZY7+Q90Ja4CQQYaBTXNgIvqfKGFmcjg4Q3EFf9gN6Z9wGGfpzSe1IVOMlWr07rPFynRRGwJAHFoId8xD3hyFQ==}
+  /@vue-macros/define-props/0.1.2:
+    resolution: {integrity: sha512-E7kjLvXxe+QYfRa331vPh0fACsoyOA73lkGlpnFZvGSV08Jx7gXuUfYYQItXD6eMeOc/dhUFkWRVmP5a6r8lwg==}
     engines: {node: '>=14.19.0'}
     peerDependencies:
       vue: ^3.2.25
     dependencies:
       '@rollup/pluginutils': 5.0.2
-      '@vue-macros/common': 0.13.5
+      '@vue-macros/common': 0.13.6
       unplugin: 1.0.1
     transitivePeerDependencies:
       - rollup
     dev: true
 
-  /@vue-macros/define-render/1.1.1:
-    resolution: {integrity: sha512-BvUVzA3xaqaNX9/++EV+ksBD6c1RjybuRPi2AKmOZ5SrQjDDVuiUSQjRwpzeLj9XQM5fGBun0AOp3bs7z+rEXA==}
+  /@vue-macros/define-render/1.1.2:
+    resolution: {integrity: sha512-f3kxPUz1JRHaHN7feRpH3KGCo4Za0rVvY5GWWBRrj7XNvk27E+AESHXqdM8xkccQXxatx3z/GhRhrxcvsIcuuA==}
     engines: {node: '>=14.19.0'}
     peerDependencies:
       vue: ^2.7.0 || ^3.0.0
     dependencies:
       '@rollup/pluginutils': 5.0.2
-      '@vue-macros/common': 0.13.5
+      '@vue-macros/common': 0.13.6
       unplugin: 1.0.1
     transitivePeerDependencies:
       - rollup
     dev: true
 
-  /@vue-macros/define-slots/0.1.1:
-    resolution: {integrity: sha512-5eTNhcuhiuQhc6fZPDe4RfvhMQQw4AgARn7GNhx6QyLnROwzWVyVKo4YdgKnimv5CO4jcmfEdv6kDEwLDt7zOw==}
+  /@vue-macros/define-slots/0.1.2:
+    resolution: {integrity: sha512-cXN5OXX2brSBW0l6dKYu4cH7pE7VonDnvQdpfwPyxWwvObaGF4S2HzqRr4ilLgr+qBpneZiSuMCf09VXdOk6hw==}
     engines: {node: '>=14.19.0'}
     peerDependencies:
       vue: ^2.7.0 || ^3.0.0
     dependencies:
       '@rollup/pluginutils': 5.0.2
-      '@vue-macros/common': 0.13.5
+      '@vue-macros/common': 0.13.6
       unplugin: 1.0.1
     transitivePeerDependencies:
       - rollup
     dev: true
 
-  /@vue-macros/hoist-static/1.1.1:
-    resolution: {integrity: sha512-K+MZG/UFPYHdipEr+hDcrOFMQhMy7STu2d/C2ytsLImsfovo3YPGejrG97EfB7ed8WWfXRY1X1ORyyRHa6XKsQ==}
+  /@vue-macros/hoist-static/1.1.2:
+    resolution: {integrity: sha512-luuczHBh8P/DzLNmF9js7i56731/Hq/HED4oamE6lZQzqKe3oCrxjoaoyleVrG0dhv0GfEoMja2Q8e6AmbnKnw==}
     engines: {node: '>=14.19.0'}
     dependencies:
       '@rollup/pluginutils': 5.0.2
-      '@vue-macros/common': 0.13.5
+      '@vue-macros/common': 0.13.6
       unplugin: 1.0.1
     transitivePeerDependencies:
       - rollup
       - vue
     dev: true
 
-  /@vue-macros/named-template/0.1.1:
-    resolution: {integrity: sha512-nc7lk2sxaShbT1xLspiN0w/S5P6jOS/VFuVQ4tEjl2A/qOYmY/VRbMQXmImEwTEJXB6fI7D80CEF3xhBiG0nug==}
+  /@vue-macros/named-template/0.1.2:
+    resolution: {integrity: sha512-+xG+5Nwq1BXzdeNCDiE1GMloZqFIl/AR81GCwHFvL8BHKkX/FdWcb62LYnWkPwlGVqvHopnugfq/UhwGRn1Hgw==}
     engines: {node: '>=14.19.0'}
     dependencies:
       '@rollup/pluginutils': 5.0.2
-      '@vue-macros/common': 0.13.5
+      '@vue-macros/common': 0.13.6
       '@vue/compiler-dom': 3.2.45
       unplugin: 1.0.1
     transitivePeerDependencies:
@@ -3303,17 +3333,17 @@ packages:
       - vue
     dev: true
 
-  /@vue-macros/nuxt/0.2.2_3nbxte3dhogb6b7pemmre2vo4m:
-    resolution: {integrity: sha512-z2IwicRGttRjtHHGPSVyFJSRwQHWrF7gRYD2sSz2SctCABR7cLyRpeseDKpqmaSVfEE8oX6al+dUfkB7zfceDw==}
+  /@vue-macros/nuxt/0.2.8_3nbxte3dhogb6b7pemmre2vo4m:
+    resolution: {integrity: sha512-vOMPTGNzBx+pmeZa3nJWRgN9CHYW700EZWVcAMQHrLjgh7vV+JqsA667hoBNnJPjmEBwSe8EzYbc1LFqEZoTZQ==}
     engines: {node: '>=14.19.0'}
     peerDependencies:
       nuxt: ^3.0.0
     dependencies:
       '@nuxt/kit': 3.0.0
-      '@vue-macros/short-vmodel': 1.0.1
-      '@vue-macros/volar': 0.5.6_vue-tsc@1.0.16
+      '@vue-macros/short-vmodel': 1.0.2
+      '@vue-macros/volar': 0.5.9_vue-tsc@1.0.16
       nuxt: 3.0.0_lzzuuodtsqwxnvqeq4g4likcqa
-      unplugin-vue-macros: 1.1.1_@vueuse+core@9.9.0
+      unplugin-vue-macros: 1.3.0_@vueuse+core@9.9.0
     transitivePeerDependencies:
       - '@vueuse/core'
       - esbuild
@@ -3325,12 +3355,26 @@ packages:
       - webpack
     dev: true
 
-  /@vue-macros/setup-block/0.0.2:
-    resolution: {integrity: sha512-kQFbSaw4W2DgPIXcsLMBEpqlknRrh6PT3+Ce2lstrVb3r7uMK4fDjiziLkP9ns7gVjKj+1FBluwuePBJOSSI+A==}
+  /@vue-macros/reactivity-transform-vue2/0.0.3:
+    resolution: {integrity: sha512-0Bquapvk9SMUpoWzd3vcZa2CwIDhjyHEYi80zwnGNKo9m6ut0oUEs+ed4iUXBvqE4ZhfKJhgBVA8NyqnlDgCPQ==}
+    engines: {node: '>=14.19.0'}
+    peerDependencies:
+      vue: ^2.7.0
+    dependencies:
+      '@rollup/pluginutils': 5.0.2
+      '@vue-macros/common': 0.13.6
+      '@vue/reactivity-transform': 3.2.45
+      unplugin: 1.0.1
+    transitivePeerDependencies:
+      - rollup
+    dev: true
+
+  /@vue-macros/setup-block/0.0.3:
+    resolution: {integrity: sha512-1PKUefTDpquISwk9MKB715gdCT2Ogw6lKKwpOtXV37xGlVV12SHB9Uvffj+ovruldG7KKYHvhm+JC3JsTkCKVQ==}
     engines: {node: '>=14.19.0'}
     dependencies:
       '@rollup/pluginutils': 5.0.2
-      '@vue-macros/common': 0.13.5
+      '@vue-macros/common': 0.13.6
       '@vue/compiler-dom': 3.2.45
       unplugin: 1.0.1
     transitivePeerDependencies:
@@ -3338,65 +3382,65 @@ packages:
       - vue
     dev: true
 
-  /@vue-macros/setup-component/0.13.1:
-    resolution: {integrity: sha512-zuMZQ1r8tVeL0FG3cLIazBAaO6UWYBCR7kvLVcspOx6tZyE+Lz0P4Tmb5kvqBIIIqUqn0uLtEzXRj1SzHKWbEg==}
+  /@vue-macros/setup-component/0.13.2:
+    resolution: {integrity: sha512-JXUSTv/11bYmdos78R7IwaDs2tRlIwtnOXMI4JNlJ+Hnhj+e+g8R6mz6ccUpMCsySK078L2lMLcOIEc52fbL5w==}
     engines: {node: '>=14.19.0'}
     dependencies:
       '@rollup/pluginutils': 5.0.2
-      '@vue-macros/common': 0.13.5
+      '@vue-macros/common': 0.13.6
       unplugin: 1.0.1
     transitivePeerDependencies:
       - rollup
       - vue
     dev: true
 
-  /@vue-macros/setup-sfc/0.13.1:
-    resolution: {integrity: sha512-EnDnG1ob6tFfK6cih+qUFzMNnEerwM9PgxHMbgbVNQsoYCh0wAxPu8djdMvVOm+fz7Gg27Lv6MXQCs14tXwAJQ==}
+  /@vue-macros/setup-sfc/0.13.2:
+    resolution: {integrity: sha512-WB2hxcjt1ghrp6Dszg6duVT9ML7h7fXvYQlCPfmTvb1cg8gDF4YUABfFvHx2u0ynUT+MVYBoywZAt/FhTVBOWQ==}
     engines: {node: '>=14.19.0'}
     dependencies:
       '@rollup/pluginutils': 5.0.2
-      '@vue-macros/common': 0.13.5
+      '@vue-macros/common': 0.13.6
       unplugin: 1.0.1
     transitivePeerDependencies:
       - rollup
       - vue
     dev: true
 
-  /@vue-macros/short-emits/1.1.1:
-    resolution: {integrity: sha512-wbEtAl/dQnqyWVRrl0b+GcofNrZqbxYNHKJxdoMZw2YPcumZswVUjARwhdp6sswTbxJPkMKz3ekjxKSuBWnL6g==}
+  /@vue-macros/short-emits/1.1.2:
+    resolution: {integrity: sha512-kFSKKtVs+vm0cAyHZQzK9m1FDyjkjzx3Zc8r4qC8Ol3JI9k3C6nUbcG4i2xe/lxuYkCBhzxQerjcVichhUv4pA==}
     engines: {node: '>=14.19.0'}
     dependencies:
       '@rollup/pluginutils': 5.0.2
-      '@vue-macros/common': 0.13.5
+      '@vue-macros/common': 0.13.6
       unplugin: 1.0.1
     transitivePeerDependencies:
       - rollup
       - vue
     dev: true
 
-  /@vue-macros/short-vmodel/1.0.1:
-    resolution: {integrity: sha512-JNPXMDUxu6YzM89dU1BHog4ocM16oOuMjdyZ3Iypnk6GgG6y2eucNjHLPopT0HKKL26fUmmo1OkgE87ApNF4lQ==}
+  /@vue-macros/short-vmodel/1.0.2:
+    resolution: {integrity: sha512-1HVllcrlOWujul6VxfkJRvd/o3vDybrj7PtU0LzSjFLku93yY/MRoH+2uIVbKsNplA+J5M+6HOXJlEgg2HBLZA==}
     engines: {node: '>=14.19.0'}
     dependencies:
-      '@vue-macros/common': 0.13.5
+      '@vue-macros/common': 0.13.6
       '@vue/compiler-core': 3.2.45
     transitivePeerDependencies:
       - vue
     dev: true
 
-  /@vue-macros/volar/0.5.6_vue-tsc@1.0.16:
-    resolution: {integrity: sha512-TMfqk1PkgqjH+Ox//WCz52GMZr1fVkw9VeXnSIsmwoUcvlTR1ShSGatDuBjN8sMVNnol5tW9LwoElRU6D0npKA==}
+  /@vue-macros/volar/0.5.9_vue-tsc@1.0.16:
+    resolution: {integrity: sha512-SBjgofdn55fDXkPEGwAmjEeUwrupYqC9ZXH+iHMeawQfUwS2BrcvsUHkMnZiAMW0eQPcmwQr2dUJYMswkbp7cw==}
     peerDependencies:
       vue-tsc: ^1.0.9
     peerDependenciesMeta:
       vue-tsc:
         optional: true
     dependencies:
-      '@volar/language-core': 1.0.16
-      '@vue-macros/common': 0.13.5
-      '@vue-macros/define-props': 0.1.1
-      '@vue-macros/short-vmodel': 1.0.1
-      muggle-string: 0.1.0
+      '@volar/language-core': 1.0.22
+      '@vue-macros/common': 0.13.6
+      '@vue-macros/define-props': 0.1.2
+      '@vue-macros/short-vmodel': 1.0.2
+      muggle-string: 0.2.1
       vue-tsc: 1.0.16_typescript@4.9.4
     transitivePeerDependencies:
       - rollup
@@ -3895,8 +3939,8 @@ packages:
     resolution: {integrity: sha512-c+tWaEoA+b4yJp0NUI8/hYKUv1ELqpCMU/fogGazXxu7EXlry37q1wdfhaQqVmQn4l4agMeo4ek76LyKFIxkKA==}
     engines: {node: '>=14.19.0'}
     dependencies:
-      '@babel/parser': 7.20.5
-      '@babel/types': 7.20.5
+      '@babel/parser': 7.20.7
+      '@babel/types': 7.20.7
     dev: true
 
   /astral-regex/2.0.0:
@@ -7269,6 +7313,10 @@ packages:
     resolution: {integrity: sha512-Tr1knR3d2mKvvWthlk7202rywKbiOm4rVFLsfAaSIhJ6dt9o47W4S+JMtWhd/PW9Wrdew2/S2fSvhz3E2gkfEg==}
     dev: true
 
+  /muggle-string/0.2.1:
+    resolution: {integrity: sha512-XVKGP/QTuZQ7y1++6sNLeAALtUSc1nwbupotemZizerLeTCyxrvPRXGfWIIITZaVqrwfIskwawWE0CSHC10X7w==}
+    dev: true
+
   /mute-stream/0.0.8:
     resolution: {integrity: sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==}
     dev: true
@@ -9661,13 +9709,13 @@ packages:
       - rollup
     dev: true
 
-  /unplugin-combine/0.5.2:
-    resolution: {integrity: sha512-FS1wNFpYh5XqFvyq9Nq9gVHjRu+hT5AwU8NzgRe97baROiPjVIoGCMyWGybm+pUq08WcZupQq/M6sSp4S939Iw==}
+  /unplugin-combine/0.5.3:
+    resolution: {integrity: sha512-N3SCmDLOF/ea4dcqLlewNfKBQgBw5asucpsk04eiTdsUrzEvn1vb4Y8bScJ+qD22/rQoZvg64yHjMoai83zCEA==}
     engines: {node: '>=14.19.0'}
     peerDependencies:
       esbuild: '>=0.13'
       rollup: ^3.2.0
-      vite: ^2.3.0 || ^3.0.0
+      vite: ^2.3.0 || ^3.0.0 || ^4.0.0
       webpack: 4 || 5
     peerDependenciesMeta:
       esbuild:
@@ -9683,12 +9731,12 @@ packages:
       unplugin: 1.0.1
     dev: true
 
-  /unplugin-vue-define-options/1.1.1:
-    resolution: {integrity: sha512-E9xCSAQgiGMRaQXBWw7KwXiisPwqO/NfV06TpzEb884U77nlOaSQg1TGxw5YoXMcn1Wu/+bmGyR6V9nIIlLEgQ==}
+  /unplugin-vue-define-options/1.1.2:
+    resolution: {integrity: sha512-PMYp2m2V/AZPoXchSmo4iNuQm1RevRXbnTqpDPznbQ4Byohm/t2zIi2jlqaNI9PI4ORqP5wNPR8vLGOtEM1s5g==}
     engines: {node: '>=14.19.0'}
     dependencies:
       '@rollup/pluginutils': 5.0.2
-      '@vue-macros/common': 0.13.5
+      '@vue-macros/common': 0.13.6
       ast-walker-scope: 0.3.1
       unplugin: 1.0.1
     transitivePeerDependencies:
@@ -9696,27 +9744,28 @@ packages:
       - vue
     dev: true
 
-  /unplugin-vue-macros/1.1.1_@vueuse+core@9.9.0:
-    resolution: {integrity: sha512-3+fgei7ALVUaGseXh5z2HwaVbVRhXjlSD679fLlfFPI9b5y7mHaS/v+GCkoiOEE+PJNIucV/JBXzMxS/iEuGzQ==}
+  /unplugin-vue-macros/1.3.0_@vueuse+core@9.9.0:
+    resolution: {integrity: sha512-pyyVzBckVQ91KLqxlL9MCf15/K4uJxeS/UHqWiDmnz3x7gANf5LkgDiO/JsqIMIWkZWtCga5Ax+lHBWj3OJtmA==}
     engines: {node: '>=14.19.0'}
     peerDependencies:
       vue: ^2.7.0 || ^3.2.25
     dependencies:
       '@rollup/pluginutils': 5.0.2
-      '@vue-macros/better-define': 1.1.1
-      '@vue-macros/common': 0.13.5
-      '@vue-macros/define-model': 1.1.1_@vueuse+core@9.9.0
-      '@vue-macros/define-props': 0.1.1
-      '@vue-macros/define-render': 1.1.1
-      '@vue-macros/define-slots': 0.1.1
-      '@vue-macros/hoist-static': 1.1.1
-      '@vue-macros/named-template': 0.1.1
-      '@vue-macros/setup-block': 0.0.2
-      '@vue-macros/setup-component': 0.13.1
-      '@vue-macros/setup-sfc': 0.13.1
-      '@vue-macros/short-emits': 1.1.1
-      unplugin-combine: 0.5.2
-      unplugin-vue-define-options: 1.1.1
+      '@vue-macros/better-define': 1.1.3
+      '@vue-macros/common': 0.13.6
+      '@vue-macros/define-model': 1.2.0_@vueuse+core@9.9.0
+      '@vue-macros/define-props': 0.1.2
+      '@vue-macros/define-render': 1.1.2
+      '@vue-macros/define-slots': 0.1.2
+      '@vue-macros/hoist-static': 1.1.2
+      '@vue-macros/named-template': 0.1.2
+      '@vue-macros/reactivity-transform-vue2': 0.0.3
+      '@vue-macros/setup-block': 0.0.3
+      '@vue-macros/setup-component': 0.13.2
+      '@vue-macros/setup-sfc': 0.13.2
+      '@vue-macros/short-emits': 1.1.2
+      unplugin-combine: 0.5.3
+      unplugin-vue-define-options: 1.1.2
     transitivePeerDependencies:
       - '@vueuse/core'
       - esbuild
@@ -9925,10 +9974,11 @@ packages:
       - supports-color
     dev: true
 
-  /vite-plugin-pwa/0.13.3:
+  /vite-plugin-pwa/0.13.3_workbox-window@6.5.4:
     resolution: {integrity: sha512-cjWXpZ7slAY14OKz7M8XdgTIi9wjf6OD6NkhiMAc+ogxnbUrecUwLdRtfGPCPsN2ftut5gaN1jTghb11p6IQAA==}
     peerDependencies:
       vite: ^3.1.0
+      workbox-window: ^6.5.4
     dependencies:
       '@rollup/plugin-replace': 4.0.0_rollup@2.79.1
       debug: 4.3.4