@hg2/dataview-core 2.0.2 → 2.0.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (128) hide show
  1. package/LICENSE +21 -0
  2. package/dist/{ColorList-f583b4da.js → ColorList-ea7fa843.js} +3 -3
  3. package/dist/{ColorList-f583b4da.js.map → ColorList-ea7fa843.js.map} +1 -1
  4. package/dist/{SizeSetting.vue_vue_type_script_setup_true_lang-d60457b9.js → SizeSetting.vue_vue_type_script_setup_true_lang-8eea1525.js} +4 -4
  5. package/dist/{SizeSetting.vue_vue_type_script_setup_true_lang-d60457b9.js.map → SizeSetting.vue_vue_type_script_setup_true_lang-8eea1525.js.map} +1 -1
  6. package/dist/{StylesSetting-3a2f09cb.js → StylesSetting-ee713728.js} +4 -4
  7. package/dist/{StylesSetting-3a2f09cb.js.map → StylesSetting-ee713728.js.map} +1 -1
  8. package/dist/{StylesSetting.vue_vue_type_style_index_0_scoped_2c848e43_lang-218ee765.js → StylesSetting.vue_vue_type_style_index_0_scoped_2c848e43_lang-83299b27.js} +2 -2
  9. package/dist/{StylesSetting.vue_vue_type_style_index_0_scoped_2c848e43_lang-218ee765.js.map → StylesSetting.vue_vue_type_style_index_0_scoped_2c848e43_lang-83299b27.js.map} +1 -1
  10. package/dist/{chart-23862487.js → chart-2793886d.js} +2 -2
  11. package/dist/{chart-23862487.js.map → chart-2793886d.js.map} +1 -1
  12. package/dist/{config-8a924b9b.js → config-3589149b.js} +8 -8
  13. package/dist/{config-8a924b9b.js.map → config-3589149b.js.map} +1 -1
  14. package/dist/{config-6f4a666a.js → config-3be34cf4.js} +8 -8
  15. package/dist/{config-6f4a666a.js.map → config-3be34cf4.js.map} +1 -1
  16. package/dist/{config-29c91c17.js → config-3e53b49a.js} +8 -8
  17. package/dist/{config-29c91c17.js.map → config-3e53b49a.js.map} +1 -1
  18. package/dist/{config-cd9efa95.js → config-485a64ba.js} +4 -4
  19. package/dist/{config-cd9efa95.js.map → config-485a64ba.js.map} +1 -1
  20. package/dist/{config-ab6a73ec.js → config-4af1f86f.js} +8 -8
  21. package/dist/{config-ab6a73ec.js.map → config-4af1f86f.js.map} +1 -1
  22. package/dist/{config-5611455a.js → config-7d66f2de.js} +8 -8
  23. package/dist/{config-5611455a.js.map → config-7d66f2de.js.map} +1 -1
  24. package/dist/{config-6301e301.js → config-81386edc.js} +4 -4
  25. package/dist/{config-6301e301.js.map → config-81386edc.js.map} +1 -1
  26. package/dist/{config-82195189.js → config-85135869.js} +4 -4
  27. package/dist/{config-82195189.js.map → config-85135869.js.map} +1 -1
  28. package/dist/{config-171978d5.js → config-909166e5.js} +8 -8
  29. package/dist/{config-171978d5.js.map → config-909166e5.js.map} +1 -1
  30. package/dist/{config-daec24c5.js → config-a0401d6a.js} +8 -8
  31. package/dist/{config-daec24c5.js.map → config-a0401d6a.js.map} +1 -1
  32. package/dist/{config-1b85b132.js → config-b4c92718.js} +8 -8
  33. package/dist/{config-1b85b132.js.map → config-b4c92718.js.map} +1 -1
  34. package/dist/{config-82178551.js → config-d06d3dba.js} +8 -8
  35. package/dist/{config-82178551.js.map → config-d06d3dba.js.map} +1 -1
  36. package/dist/{config-0cfd8541.js → config-da24a46f.js} +8 -8
  37. package/dist/{config-0cfd8541.js.map → config-da24a46f.js.map} +1 -1
  38. package/dist/{config-bdf34646.js → config-f2e421ca.js} +8 -8
  39. package/dist/{config-bdf34646.js.map → config-f2e421ca.js.map} +1 -1
  40. package/dist/{config-169340f0.js → config-fe93b035.js} +8 -8
  41. package/dist/{config-169340f0.js.map → config-fe93b035.js.map} +1 -1
  42. package/dist/{designSetting-d5ac854f.js → designSetting-420dbd75.js} +19 -19
  43. package/dist/designSetting-420dbd75.js.map +1 -0
  44. package/dist/enums/httpEnum.d.ts +1 -1
  45. package/dist/{index-b01a3eb8.js → index-00787591.js} +6 -6
  46. package/dist/{index-b01a3eb8.js.map → index-00787591.js.map} +1 -1
  47. package/dist/{index-65e18d49.js → index-07cf85cb.js} +9 -9
  48. package/dist/{index-65e18d49.js.map → index-07cf85cb.js.map} +1 -1
  49. package/dist/{index-104a2622.js → index-0c1cb75c.js} +2 -2
  50. package/dist/{index-104a2622.js.map → index-0c1cb75c.js.map} +1 -1
  51. package/dist/{index-fbc57d2a.js → index-12237fd2.js} +11 -11
  52. package/dist/{index-fbc57d2a.js.map → index-12237fd2.js.map} +1 -1
  53. package/dist/{index-798f8f8b.js → index-1a1d8e82.js} +12 -12
  54. package/dist/{index-798f8f8b.js.map → index-1a1d8e82.js.map} +1 -1
  55. package/dist/{index-be653c26.js → index-1e502de3.js} +12 -12
  56. package/dist/{index-be653c26.js.map → index-1e502de3.js.map} +1 -1
  57. package/dist/{index-4e7762ee.js → index-227ada16.js} +3 -3
  58. package/dist/{index-4e7762ee.js.map → index-227ada16.js.map} +1 -1
  59. package/dist/{index-80509d43.js → index-657b732c.js} +10 -10
  60. package/dist/{index-80509d43.js.map → index-657b732c.js.map} +1 -1
  61. package/dist/{index-2f57bca8.js → index-6657c41c.js} +10 -10
  62. package/dist/{index-2f57bca8.js.map → index-6657c41c.js.map} +1 -1
  63. package/dist/{index-9abc2fea.js → index-71001515.js} +12 -12
  64. package/dist/{index-9abc2fea.js.map → index-71001515.js.map} +1 -1
  65. package/dist/{index-1ae147a2.js → index-7279ca05.js} +12 -12
  66. package/dist/{index-1ae147a2.js.map → index-7279ca05.js.map} +1 -1
  67. package/dist/{index-34b4bbc5.js → index-746b469a.js} +12 -12
  68. package/dist/{index-34b4bbc5.js.map → index-746b469a.js.map} +1 -1
  69. package/dist/{index-c719ea31.js → index-74c46481.js} +9 -9
  70. package/dist/{index-c719ea31.js.map → index-74c46481.js.map} +1 -1
  71. package/dist/{index-a1ceba24.js → index-7aad8920.js} +2 -2
  72. package/dist/{index-a1ceba24.js.map → index-7aad8920.js.map} +1 -1
  73. package/dist/{index-f2c2f4d8.js → index-7e3f71d5.js} +9 -9
  74. package/dist/{index-f2c2f4d8.js.map → index-7e3f71d5.js.map} +1 -1
  75. package/dist/{index-ad575add.js → index-90d01963.js} +11 -11
  76. package/dist/{index-ad575add.js.map → index-90d01963.js.map} +1 -1
  77. package/dist/{index-f3ad1572.js → index-9481af80.js} +361 -359
  78. package/dist/index-9481af80.js.map +1 -0
  79. package/dist/{index-67c5f6a7.js → index-9710a4c3.js} +2 -2
  80. package/dist/{index-67c5f6a7.js.map → index-9710a4c3.js.map} +1 -1
  81. package/dist/{index-ce178901.js → index-9af13a71.js} +10 -10
  82. package/dist/{index-ce178901.js.map → index-9af13a71.js.map} +1 -1
  83. package/dist/{index-de02b823.js → index-b9d38391.js} +50 -50
  84. package/dist/index-b9d38391.js.map +1 -0
  85. package/dist/{index-57797674.js → index-bd6d1ea4.js} +8 -8
  86. package/dist/{index-57797674.js.map → index-bd6d1ea4.js.map} +1 -1
  87. package/dist/{index-bc30291e.js → index-c3dfa3d4.js} +9 -9
  88. package/dist/{index-bc30291e.js.map → index-c3dfa3d4.js.map} +1 -1
  89. package/dist/{index-68accd28.js → index-c3e27080.js} +11 -11
  90. package/dist/{index-68accd28.js.map → index-c3e27080.js.map} +1 -1
  91. package/dist/{index-85816403.js → index-cfdb6350.js} +5 -5
  92. package/dist/{index-85816403.js.map → index-cfdb6350.js.map} +1 -1
  93. package/dist/{index-83e0f570.js → index-e49c232d.js} +9 -9
  94. package/dist/{index-83e0f570.js.map → index-e49c232d.js.map} +1 -1
  95. package/dist/{index-8648ed77.js → index-ee2bbc1c.js} +10 -10
  96. package/dist/{index-8648ed77.js.map → index-ee2bbc1c.js.map} +1 -1
  97. package/dist/index.js +9 -9
  98. package/dist/pick-7307d7b0.js +431 -0
  99. package/dist/pick-7307d7b0.js.map +1 -0
  100. package/dist/{plugin-ec84fd96.js → plugin-a2249fc5.js} +3 -3
  101. package/dist/{plugin-ec84fd96.js.map → plugin-a2249fc5.js.map} +1 -1
  102. package/dist/{pondIndex.vue_vue_type_style_index_0_scoped_4bff5632_lang-d29a410a.js → pondIndex.vue_vue_type_style_index_0_scoped_4bff5632_lang-955a4733.js} +387 -351
  103. package/dist/pondIndex.vue_vue_type_style_index_0_scoped_4bff5632_lang-955a4733.js.map +1 -0
  104. package/dist/published/chartItemSetting.js +6 -6
  105. package/dist/published/designSetting.js +1 -1
  106. package/dist/published/hooks.js +4 -4
  107. package/dist/published/plugins.js +3 -3
  108. package/dist/published/public.js +4 -4
  109. package/dist/published/store.js +7 -7
  110. package/dist/published/utils.js +4 -4
  111. package/dist/store/modules/chartEditStore/chartEditStore.d.ts +10 -3
  112. package/dist/{store-06d0fc5f.js → store-7c31860c.js} +8 -8
  113. package/dist/{store-06d0fc5f.js.map → store-7c31860c.js.map} +1 -1
  114. package/dist/style.css +1 -1
  115. package/dist/{useChartDataFetch.hook-900fd72a.js → useChartDataFetch.hook-d7b1b438.js} +460 -462
  116. package/dist/useChartDataFetch.hook-d7b1b438.js.map +1 -0
  117. package/dist/{useSyncUpdate.hook-f4af3d43.js → useSyncUpdate.hook-d2ae52a3.js} +5 -5
  118. package/dist/{useSyncUpdate.hook-f4af3d43.js.map → useSyncUpdate.hook-d2ae52a3.js.map} +1 -1
  119. package/dist/{useTargetData.hook-7495fa0a.js → useTargetData.hook-f9fb6b8f.js} +2 -2
  120. package/dist/{useTargetData.hook-7495fa0a.js.map → useTargetData.hook-f9fb6b8f.js.map} +1 -1
  121. package/package.json +5 -5
  122. package/dist/designSetting-d5ac854f.js.map +0 -1
  123. package/dist/index-de02b823.js.map +0 -1
  124. package/dist/index-f3ad1572.js.map +0 -1
  125. package/dist/pick-3a770d78.js +0 -427
  126. package/dist/pick-3a770d78.js.map +0 -1
  127. package/dist/pondIndex.vue_vue_type_style_index_0_scoped_4bff5632_lang-d29a410a.js.map +0 -1
  128. package/dist/useChartDataFetch.hook-900fd72a.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"index-9abc2fea.js","sources":["../src/components/GoThemeSelect/index.vue","../src/i18n/zh/index.ts","../src/i18n/en/index.ts","../src/i18n/index.ts","../src/components/GoLangSelect/index.vue","../src/assets/images/exception/theme-color.png","../../../node_modules/.pnpm/@vueuse+shared@7.7.1_vue@3.5.16_typescript@5.4.5_/node_modules/@vueuse/shared/index.mjs","../../../node_modules/.pnpm/@vueuse+core@7.7.1_vue@3.5.16_typescript@5.4.5_/node_modules/@vueuse/core/index.mjs","../src/components/Pages/ThemeColorSelect/index.vue","../src/layout/components/LayoutHeader/index.vue","../src/layout/components/LayoutHeaderPro/index.vue","../src/views/chart/hooks/useContextMenu.hook.ts","../src/views/chart/index.vue","../src/store/modules/chartLayoutStore/chartLayoutStore.d.ts","../src/store/modules/chartLayoutStore/chartLayoutStore.ts","../src/views/chart/hooks/useSync.hook.ts","../src/lib/GoViewEditor.vue","../src/views/preview/utils/style.ts","../src/views/preview/utils/storage.ts","../src/views/preview/utils/keyboard.ts","../src/views/preview/utils/drag.ts","../src/views/preview/components/PreviewRenderGroup/index.vue","../src/views/preview/components/PreviewRenderList/index.vue","../src/views/preview/hooks/useComInstall.hook.ts","../src/views/preview/hooks/useScale.hook.ts","../src/views/preview/hooks/useStore.hook.ts","../src/views/preview/suspenseIndex.vue","../src/lib/GoViewPreview.vue","../src/runtime.ts","../src/lib/skills/registry.ts","../src/lib/index.ts"],"sourcesContent":["<template>\n <el-button text @click=\"changeTheme\" title=\"主题\">\n <el-icon :size=\"20\">\n <moon-icon v-if=\"designStore.darkTheme\"></moon-icon>\n <sunny-icon v-else></sunny-icon>\n </el-icon>\n </el-button>\n</template>\n\n<script lang=\"ts\" setup>\nimport { useDesignStore } from '@core/store/modules/designStore/designStore'\nimport { setHtmlTheme } from '@core/utils'\nimport { icon } from '@core/plugins'\nconst { MoonIcon, SunnyIcon } = icon.ionicons5\nconst designStore = useDesignStore()\n\n// 改变样式\nconst changeTheme = () => {\n designStore.changeTheme()\n setHtmlTheme()\n}\n</script>\n","const global = {\n doc_addr: '文档地址',\n code_addr: '仓库地址',\n // 头部\n doc: '说明文档',\n help: '帮助中心',\n contact: '关于软件',\n // 系统设置\n sys_set: '系统设置',\n lang_set: '语言设置',\n // 功能键\n r_edit: '编辑',\n r_preview: '预览',\n r_copy: '克隆',\n r_rename: '重命名',\n r_publish: '发布',\n r_unpublish: '取消发布',\n r_download: '下载',\n r_delete: '删除',\n r_more: '更多',\n}\n\nexport default {\n global\n}\n","const global = {\n doc_addr: 'Document',\n code_addr: 'Code',\n // header\n doc: 'Document',\n help: 'Help',\n contact: 'About Software',\n // system setting\n sys_set: 'System Setting',\n lang_set: 'Language Setting',\n // right key\n r_edit: 'Edit',\n r_preview: 'Preview',\n r_copy: 'Clone',\n r_rename: 'Rename',\n r_publish: 'Publish',\n r_unpublish: 'Unpublish',\n r_download: 'Download',\n r_delete: 'Delete',\n r_more: 'More',\n}\n\nexport default {\n global\n}\n","//语言\nimport { lang } from '@core/settings/designSetting'\nimport { createI18n } from 'vue-i18n' //引入vue-i18n组件\nimport { getLocalStorage } from '@core/utils'\nimport { StorageEnum }from '@core/enums/storageEnum'\nimport { LangEnum } from '@core/enums/styleEnum'\nimport { LangStateType } from '@core/store/modules/langStore/langStore.d'\nimport zh from './zh/index'\nimport en from './en/index'\n\nconst langStorage: LangStateType = getLocalStorage(StorageEnum.GO_LANG_STORE)\n\n// 语言数组\nexport const langList = [\n {\n label: '中文',\n key: LangEnum.ZH\n },\n {\n label: 'English',\n key: LangEnum.EN\n }\n]\n\nconst i18n = createI18n({\n legacy: false,\n globalInjection:true,\n locale: langStorage?.lang || lang,\n fallbackLocale: langStorage?.lang || lang,\n messages: {\n [LangEnum.ZH]: zh,\n [LangEnum.EN]: en\n }\n})\n\nexport default i18n\n","<template>\n <el-dropdown\n trigger=\"hover\"\n @command=\"handleSelect\"\n >\n <el-button text>\n <el-icon :size=\"20\">\n <language-icon></language-icon>\n </el-icon>\n </el-button>\n <template #dropdown>\n <el-dropdown-menu>\n <el-dropdown-item\n v-for=\"item in options\"\n :key=\"item.key\"\n :command=\"item.key\"\n >\n {{ item.label }}\n </el-dropdown-item>\n </el-dropdown-menu>\n </template>\n </el-dropdown>\n</template>\n\n<script lang=\"ts\" setup>\nimport { useI18n } from \"vue-i18n\";\nimport { useLangStore } from '@core/store/modules/langStore/langStore'\nimport { langList } from '@core/i18n/index'\nimport { LangEnum } from '@core/enums/styleEnum'\nimport { icon } from '@core/plugins'\n\nconst { LanguageIcon } = icon.ionicons5\nconst { locale } = useI18n();\nconst langStore = useLangStore()\nconst options = langList\n\nconst handleSelect = (key: LangEnum) => {\n locale.value = key;\n langStore.changeLang(key)\n}\n</script>\n","export default \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADcAAAHfCAMAAADDZbAvAAAF6WlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNS42LWMxNDggNzkuMTY0MDM2LCAyMDE5LzA4LzEzLTAxOjA2OjU3ICAgICAgICAiPiA8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPiA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtbG5zOmRjPSJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyIgeG1sbnM6cGhvdG9zaG9wPSJodHRwOi8vbnMuYWRvYmUuY29tL3Bob3Rvc2hvcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RFdnQ9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZUV2ZW50IyIgeG1wOkNyZWF0b3JUb29sPSJBZG9iZSBQaG90b3Nob3AgMjEuMCAoTWFjaW50b3NoKSIgeG1wOkNyZWF0ZURhdGU9IjIwMjAtMDYtMTJUMTA6NDg6MzgrMDg6MDAiIHhtcDpNb2RpZnlEYXRlPSIyMDIwLTA2LTEyVDEwOjU2OjA0KzA4OjAwIiB4bXA6TWV0YWRhdGFEYXRlPSIyMDIwLTA2LTEyVDEwOjU2OjA0KzA4OjAwIiBkYzpmb3JtYXQ9ImltYWdlL3BuZyIgcGhvdG9zaG9wOkNvbG9yTW9kZT0iMyIgcGhvdG9zaG9wOklDQ1Byb2ZpbGU9InNSR0IgSUVDNjE5NjYtMi4xIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOjY4YjE2YjFlLTk4YWEtNDFhMS1iNTc2LWIzY2FjMzJlZjgy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\"","import { computed, unref, watch, ref, customRef, isVue3, isRef, effectScope, getCurrentScope, onScopeDispose, shallowRef, watchEffect, readonly, reactive, toRefs as toRefs$1, toRef, isVue2, set as set$1, getCurrentInstance, onBeforeUnmount, onMounted, nextTick, onUnmounted } from 'vue-demi';\n\nfunction and(...args) {\n return computed(() => args.every((i) => unref(i)));\n}\n\nfunction biSyncRef(a, b) {\n const flush = \"sync\";\n const stop1 = watch(a, (newValue) => {\n b.value = newValue;\n }, {\n flush,\n immediate: true\n });\n const stop2 = watch(b, (newValue) => {\n a.value = newValue;\n }, {\n flush,\n immediate: true\n });\n return () => {\n stop1();\n stop2();\n };\n}\n\nfunction controlledComputed(source, fn) {\n let v = void 0;\n let track;\n let trigger;\n const dirty = ref(true);\n watch(source, () => {\n dirty.value = true;\n trigger();\n }, { flush: \"sync\" });\n return customRef((_track, _trigger) => {\n track = _track;\n trigger = _trigger;\n return {\n get() {\n if (dirty.value) {\n v = fn();\n dirty.value = false;\n }\n track();\n return v;\n },\n set() {\n }\n };\n });\n}\n\nfunction __onlyVue3(name = \"this function\") {\n if (isVue3)\n return;\n throw new Error(`[VueUse] ${name} is only works on Vue 3.`);\n}\n\nfunction extendRef(ref, extend, { enumerable = false, unwrap = true } = {}) {\n __onlyVue3();\n for (const [key, value] of Object.entries(extend)) {\n if (key === \"value\")\n continue;\n if (isRef(value) && unwrap) {\n Object.defineProperty(ref, key, {\n get() {\n return value.value;\n },\n set(v) {\n value.value = v;\n },\n enumerable\n });\n } else {\n Object.defineProperty(ref, key, { value, enumerable });\n }\n }\n return ref;\n}\n\nfunction controlledRef(initial, options = {}) {\n let source = initial;\n let track;\n let trigger;\n const ref = customRef((_track, _trigger) => {\n track = _track;\n trigger = _trigger;\n return {\n get() {\n return get();\n },\n set(v) {\n set(v);\n }\n };\n });\n function get(tracking = true) {\n if (tracking)\n track();\n return source;\n }\n function set(value, triggering = true) {\n var _a, _b;\n if (value === source)\n return;\n const old = source;\n if (((_a = options.onBeforeChange) == null ? void 0 : _a.call(options, value, old)) === false)\n return;\n source = value;\n (_b = options.onChanged) == null ? void 0 : _b.call(options, value, old);\n if (triggering)\n trigger();\n }\n const untrackedGet = () => get(false);\n const silentSet = (v) => set(v, false);\n const peek = () => get(false);\n const lay = (v) => set(v, false);\n return extendRef(ref, {\n get,\n set,\n untrackedGet,\n silentSet,\n peek,\n lay\n }, { enumerable: true });\n}\n\nfunction createEventHook() {\n const fns = [];\n const off = (fn) => {\n const index = fns.indexOf(fn);\n if (index !== -1)\n fns.splice(index, 1);\n };\n const on = (fn) => {\n fns.push(fn);\n return {\n off: () => off(fn)\n };\n };\n const trigger = (param) => {\n fns.forEach((fn) => fn(param));\n };\n return {\n on,\n off,\n trigger\n };\n}\n\nfunction createGlobalState(stateFactory) {\n let initialized = false;\n let state;\n const scope = effectScope(true);\n return () => {\n if (!initialized) {\n state = scope.run(stateFactory);\n initialized = true;\n }\n return state;\n };\n}\n\nfunction reactify(fn) {\n return function(...args) {\n return computed(() => fn.apply(this, args.map((i) => unref(i))));\n };\n}\n\nfunction tryOnScopeDispose(fn) {\n if (getCurrentScope()) {\n onScopeDispose(fn);\n return true;\n }\n return false;\n}\n\nfunction createSharedComposable(composable) {\n let subscribers = 0;\n let state;\n let scope;\n const dispose = () => {\n subscribers -= 1;\n if (scope && subscribers <= 0) {\n scope.stop();\n state = void 0;\n scope = void 0;\n }\n };\n return (...args) => {\n subscribers += 1;\n if (!state) {\n scope = effectScope(true);\n state = scope.run(() => composable(...args));\n }\n tryOnScopeDispose(dispose);\n return state;\n };\n}\n\nconst isClient = typeof window !== \"undefined\";\nconst isDef = (val) => typeof val !== \"undefined\";\nconst assert = (condition, ...infos) => {\n if (!condition)\n console.warn(...infos);\n};\nconst toString = Object.prototype.toString;\nconst isBoolean = (val) => typeof val === \"boolean\";\nconst isFunction = (val) => typeof val === \"function\";\nconst isNumber = (val) => typeof val === \"number\";\nconst isString = (val) => typeof val === \"string\";\nconst isObject = (val) => toString.call(val) === \"[object Object]\";\nconst isWindow = (val) => typeof window !== \"undefined\" && toString.call(val) === \"[object Window]\";\nconst now = () => Date.now();\nconst timestamp = () => +Date.now();\nconst clamp = (n, min, max) => Math.min(max, Math.max(min, n));\nconst noop = () => {\n};\nconst rand = (min, max) => {\n min = Math.ceil(min);\n max = Math.floor(max);\n return Math.floor(Math.random() * (max - min + 1)) + min;\n};\n\nfunction createFilterWrapper(filter, fn) {\n function wrapper(...args) {\n filter(() => fn.apply(this, args), { fn, thisArg: this, args });\n }\n return wrapper;\n}\nconst bypassFilter = (invoke) => {\n return invoke();\n};\nfunction debounceFilter(ms, options = {}) {\n let timer;\n let maxTimer;\n const filter = (invoke) => {\n const duration = unref(ms);\n const maxDuration = unref(options.maxWait);\n if (timer)\n clearTimeout(timer);\n if (duration <= 0 || maxDuration !== void 0 && maxDuration <= 0) {\n if (maxTimer) {\n clearTimeout(maxTimer);\n maxTimer = null;\n }\n return invoke();\n }\n if (maxDuration && !maxTimer) {\n maxTimer = setTimeout(() => {\n if (timer)\n clearTimeout(timer);\n maxTimer = null;\n invoke();\n }, maxDuration);\n }\n timer = setTimeout(() => {\n if (maxTimer)\n clearTimeout(maxTimer);\n maxTimer = null;\n invoke();\n }, duration);\n };\n return filter;\n}\nfunction throttleFilter(ms, trailing = true, leading = true) {\n let lastExec = 0;\n let timer;\n let preventLeading = !leading;\n const clear = () => {\n if (timer) {\n clearTimeout(timer);\n timer = void 0;\n }\n };\n const filter = (invoke) => {\n const duration = unref(ms);\n const elapsed = Date.now() - lastExec;\n clear();\n if (duration <= 0) {\n lastExec = Date.now();\n return invoke();\n }\n if (elapsed > duration) {\n lastExec = Date.now();\n if (preventLeading)\n preventLeading = false;\n else\n invoke();\n }\n if (trailing) {\n timer = setTimeout(() => {\n lastExec = Date.now();\n if (!leading)\n preventLeading = true;\n clear();\n invoke();\n }, duration);\n }\n if (!leading && !timer)\n timer = setTimeout(() => preventLeading = true, duration);\n };\n return filter;\n}\nfunction pausableFilter(extendFilter = bypassFilter) {\n const isActive = ref(true);\n function pause() {\n isActive.value = false;\n }\n function resume() {\n isActive.value = true;\n }\n const eventFilter = (...args) => {\n if (isActive.value)\n extendFilter(...args);\n };\n return { isActive, pause, resume, eventFilter };\n}\n\nfunction promiseTimeout(ms, throwOnTimeout = false, reason = \"Timeout\") {\n return new Promise((resolve, reject) => {\n if (throwOnTimeout)\n setTimeout(() => reject(reason), ms);\n else\n setTimeout(resolve, ms);\n });\n}\nfunction identity(arg) {\n return arg;\n}\nfunction createSingletonPromise(fn) {\n let _promise;\n function wrapper() {\n if (!_promise)\n _promise = fn();\n return _promise;\n }\n wrapper.reset = async () => {\n const _prev = _promise;\n _promise = void 0;\n if (_prev)\n await _prev;\n };\n return wrapper;\n}\nfunction invoke(fn) {\n return fn();\n}\nfunction containsProp(obj, ...props) {\n return props.some((k) => k in obj);\n}\nfunction increaseWithUnit(target, delta) {\n var _a;\n if (typeof target === \"number\")\n return target + delta;\n const value = ((_a = target.match(/^-?[0-9]+\\.?[0-9]*/)) == null ? void 0 : _a[0]) || \"\";\n const unit = target.slice(value.length);\n const result = parseFloat(value) + delta;\n if (Number.isNaN(result))\n return target;\n return result + unit;\n}\nfunction objectPick(obj, keys, omitUndefined = false) {\n return keys.reduce((n, k) => {\n if (k in obj) {\n if (!omitUndefined || !obj[k] === void 0)\n n[k] = obj[k];\n }\n return n;\n }, {});\n}\n\nfunction useDebounceFn(fn, ms = 200, options = {}) {\n return createFilterWrapper(debounceFilter(ms, options), fn);\n}\n\nfunction useDebounce(value, ms = 200, options = {}) {\n if (ms <= 0)\n return value;\n const debounced = ref(value.value);\n const updater = useDebounceFn(() => {\n debounced.value = value.value;\n }, ms, options);\n watch(value, () => updater());\n return debounced;\n}\n\nvar __getOwnPropSymbols$a = Object.getOwnPropertySymbols;\nvar __hasOwnProp$a = Object.prototype.hasOwnProperty;\nvar __propIsEnum$a = Object.prototype.propertyIsEnumerable;\nvar __objRest$5 = (source, exclude) => {\n var target = {};\n for (var prop in source)\n if (__hasOwnProp$a.call(source, prop) && exclude.indexOf(prop) < 0)\n target[prop] = source[prop];\n if (source != null && __getOwnPropSymbols$a)\n for (var prop of __getOwnPropSymbols$a(source)) {\n if (exclude.indexOf(prop) < 0 && __propIsEnum$a.call(source, prop))\n target[prop] = source[prop];\n }\n return target;\n};\nfunction watchWithFilter(source, cb, options = {}) {\n const _a = options, {\n eventFilter = bypassFilter\n } = _a, watchOptions = __objRest$5(_a, [\n \"eventFilter\"\n ]);\n return watch(source, createFilterWrapper(eventFilter, cb), watchOptions);\n}\n\nvar __defProp$8 = Object.defineProperty;\nvar __defProps$5 = Object.defineProperties;\nvar __getOwnPropDescs$5 = Object.getOwnPropertyDescriptors;\nvar __getOwnPropSymbols$9 = Object.getOwnPropertySymbols;\nvar __hasOwnProp$9 = Object.prototype.hasOwnProperty;\nvar __propIsEnum$9 = Object.prototype.propertyIsEnumerable;\nvar __defNormalProp$8 = (obj, key, value) => key in obj ? __defProp$8(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;\nvar __spreadValues$8 = (a, b) => {\n for (var prop in b || (b = {}))\n if (__hasOwnProp$9.call(b, prop))\n __defNormalProp$8(a, prop, b[prop]);\n if (__getOwnPropSymbols$9)\n for (var prop of __getOwnPropSymbols$9(b)) {\n if (__propIsEnum$9.call(b, prop))\n __defNormalProp$8(a, prop, b[prop]);\n }\n return a;\n};\nvar __spreadProps$5 = (a, b) => __defProps$5(a, __getOwnPropDescs$5(b));\nvar __objRest$4 = (source, exclude) => {\n var target = {};\n for (var prop in source)\n if (__hasOwnProp$9.call(source, prop) && exclude.indexOf(prop) < 0)\n target[prop] = source[prop];\n if (source != null && __getOwnPropSymbols$9)\n for (var prop of __getOwnPropSymbols$9(source)) {\n if (exclude.indexOf(prop) < 0 && __propIsEnum$9.call(source, prop))\n target[prop] = source[prop];\n }\n return target;\n};\nfunction debouncedWatch(source, cb, options = {}) {\n const _a = options, {\n debounce = 0\n } = _a, watchOptions = __objRest$4(_a, [\n \"debounce\"\n ]);\n return watchWithFilter(source, cb, __spreadProps$5(__spreadValues$8({}, watchOptions), {\n eventFilter: debounceFilter(debounce)\n }));\n}\n\nvar __defProp$7 = Object.defineProperty;\nvar __defProps$4 = Object.defineProperties;\nvar __getOwnPropDescs$4 = Object.getOwnPropertyDescriptors;\nvar __getOwnPropSymbols$8 = Object.getOwnPropertySymbols;\nvar __hasOwnProp$8 = Object.prototype.hasOwnProperty;\nvar __propIsEnum$8 = Object.prototype.propertyIsEnumerable;\nvar __defNormalProp$7 = (obj, key, value) => key in obj ? __defProp$7(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;\nvar __spreadValues$7 = (a, b) => {\n for (var prop in b || (b = {}))\n if (__hasOwnProp$8.call(b, prop))\n __defNormalProp$7(a, prop, b[prop]);\n if (__getOwnPropSymbols$8)\n for (var prop of __getOwnPropSymbols$8(b)) {\n if (__propIsEnum$8.call(b, prop))\n __defNormalProp$7(a, prop, b[prop]);\n }\n return a;\n};\nvar __spreadProps$4 = (a, b) => __defProps$4(a, __getOwnPropDescs$4(b));\nfunction eagerComputed(fn, options) {\n var _a;\n const result = shallowRef();\n watchEffect(() => {\n result.value = fn();\n }, __spreadProps$4(__spreadValues$7({}, options), {\n flush: (_a = options == null ? void 0 : options.flush) != null ? _a : \"sync\"\n }));\n return readonly(result);\n}\n\nfunction get(obj, key) {\n if (key == null)\n return unref(obj);\n return unref(obj)[key];\n}\n\nvar __defProp$6 = Object.defineProperty;\nvar __defProps$3 = Object.defineProperties;\nvar __getOwnPropDescs$3 = Object.getOwnPropertyDescriptors;\nvar __getOwnPropSymbols$7 = Object.getOwnPropertySymbols;\nvar __hasOwnProp$7 = Object.prototype.hasOwnProperty;\nvar __propIsEnum$7 = Object.prototype.propertyIsEnumerable;\nvar __defNormalProp$6 = (obj, key, value) => key in obj ? __defProp$6(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;\nvar __spreadValues$6 = (a, b) => {\n for (var prop in b || (b = {}))\n if (__hasOwnProp$7.call(b, prop))\n __defNormalProp$6(a, prop, b[prop]);\n if (__getOwnPropSymbols$7)\n for (var prop of __getOwnPropSymbols$7(b)) {\n if (__propIsEnum$7.call(b, prop))\n __defNormalProp$6(a, prop, b[prop]);\n }\n return a;\n};\nvar __spreadProps$3 = (a, b) => __defProps$3(a, __getOwnPropDescs$3(b));\nvar __objRest$3 = (source, exclude) => {\n var target = {};\n for (var prop in source)\n if (__hasOwnProp$7.call(source, prop) && exclude.indexOf(prop) < 0)\n target[prop] = source[prop];\n if (source != null && __getOwnPropSymbols$7)\n for (var prop of __getOwnPropSymbols$7(source)) {\n if (exclude.indexOf(prop) < 0 && __propIsEnum$7.call(source, prop))\n target[prop] = source[prop];\n }\n return target;\n};\nfunction ignorableWatch(source, cb, options = {}) {\n const _a = options, {\n eventFilter = bypassFilter\n } = _a, watchOptions = __objRest$3(_a, [\n \"eventFilter\"\n ]);\n const filteredCb = createFilterWrapper(eventFilter, cb);\n let ignoreUpdates;\n let ignorePrevAsyncUpdates;\n let stop;\n if (watchOptions.flush === \"sync\") {\n const ignore = ref(false);\n ignorePrevAsyncUpdates = () => {\n };\n ignoreUpdates = (updater) => {\n ignore.value = true;\n updater();\n ignore.value = false;\n };\n stop = watch(source, (...args) => {\n if (!ignore.value)\n filteredCb(...args);\n }, watchOptions);\n } else {\n const disposables = [];\n const ignoreCounter = ref(0);\n const syncCounter = ref(0);\n ignorePrevAsyncUpdates = () => {\n ignoreCounter.value = syncCounter.value;\n };\n disposables.push(watch(source, () => {\n syncCounter.value++;\n }, __spreadProps$3(__spreadValues$6({}, watchOptions), { flush: \"sync\" })));\n ignoreUpdates = (updater) => {\n const syncCounterPrev = syncCounter.value;\n updater();\n ignoreCounter.value += syncCounter.value - syncCounterPrev;\n };\n disposables.push(watch(source, (...args) => {\n const ignore = ignoreCounter.value > 0 && ignoreCounter.value === syncCounter.value;\n ignoreCounter.value = 0;\n syncCounter.value = 0;\n if (ignore)\n return;\n filteredCb(...args);\n }, watchOptions));\n stop = () => {\n disposables.forEach((fn) => fn());\n };\n }\n return { stop, ignoreUpdates, ignorePrevAsyncUpdates };\n}\n\nfunction isDefined(v) {\n return unref(v) != null;\n}\n\nvar __defProp$5 = Object.defineProperty;\nvar __getOwnPropSymbols$6 = Object.getOwnPropertySymbols;\nvar __hasOwnProp$6 = Object.prototype.hasOwnProperty;\nvar __propIsEnum$6 = Object.prototype.propertyIsEnumerable;\nvar __defNormalProp$5 = (obj, key, value) => key in obj ? __defProp$5(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;\nvar __spreadValues$5 = (a, b) => {\n for (var prop in b || (b = {}))\n if (__hasOwnProp$6.call(b, prop))\n __defNormalProp$5(a, prop, b[prop]);\n if (__getOwnPropSymbols$6)\n for (var prop of __getOwnPropSymbols$6(b)) {\n if (__propIsEnum$6.call(b, prop))\n __defNormalProp$5(a, prop, b[prop]);\n }\n return a;\n};\nfunction makeDestructurable(obj, arr) {\n if (typeof Symbol !== \"undefined\") {\n const clone = __spreadValues$5({}, obj);\n Object.defineProperty(clone, Symbol.iterator, {\n enumerable: false,\n value() {\n let index = 0;\n return {\n next: () => ({\n value: arr[index++],\n done: index > arr.length\n })\n };\n }\n });\n return clone;\n } else {\n return Object.assign([...arr], obj);\n }\n}\n\nfunction not(v) {\n return computed(() => !unref(v));\n}\n\nfunction or(...args) {\n return computed(() => args.some((i) => unref(i)));\n}\n\nvar __defProp$4 = Object.defineProperty;\nvar __defProps$2 = Object.defineProperties;\nvar __getOwnPropDescs$2 = Object.getOwnPropertyDescriptors;\nvar __getOwnPropSymbols$5 = Object.getOwnPropertySymbols;\nvar __hasOwnProp$5 = Object.prototype.hasOwnProperty;\nvar __propIsEnum$5 = Object.prototype.propertyIsEnumerable;\nvar __defNormalProp$4 = (obj, key, value) => key in obj ? __defProp$4(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;\nvar __spreadValues$4 = (a, b) => {\n for (var prop in b || (b = {}))\n if (__hasOwnProp$5.call(b, prop))\n __defNormalProp$4(a, prop, b[prop]);\n if (__getOwnPropSymbols$5)\n for (var prop of __getOwnPropSymbols$5(b)) {\n if (__propIsEnum$5.call(b, prop))\n __defNormalProp$4(a, prop, b[prop]);\n }\n return a;\n};\nvar __spreadProps$2 = (a, b) => __defProps$2(a, __getOwnPropDescs$2(b));\nvar __objRest$2 = (source, exclude) => {\n var target = {};\n for (var prop in source)\n if (__hasOwnProp$5.call(source, prop) && exclude.indexOf(prop) < 0)\n target[prop] = source[prop];\n if (source != null && __getOwnPropSymbols$5)\n for (var prop of __getOwnPropSymbols$5(source)) {\n if (exclude.indexOf(prop) < 0 && __propIsEnum$5.call(source, prop))\n target[prop] = source[prop];\n }\n return target;\n};\nfunction pausableWatch(source, cb, options = {}) {\n const _a = options, {\n eventFilter: filter\n } = _a, watchOptions = __objRest$2(_a, [\n \"eventFilter\"\n ]);\n const { eventFilter, pause, resume, isActive } = pausableFilter(filter);\n const stop = watchWithFilter(source, cb, __spreadProps$2(__spreadValues$4({}, watchOptions), {\n eventFilter\n }));\n return { stop, pause, resume, isActive };\n}\n\nfunction reactifyObject(obj, optionsOrKeys = {}) {\n let keys = [];\n if (Array.isArray(optionsOrKeys)) {\n keys = optionsOrKeys;\n } else {\n const { includeOwnProperties = true } = optionsOrKeys;\n keys.push(...Object.keys(obj));\n if (includeOwnProperties)\n keys.push(...Object.getOwnPropertyNames(obj));\n }\n return Object.fromEntries(keys.map((key) => {\n const value = obj[key];\n return [\n key,\n typeof value === \"function\" ? reactify(value.bind(obj)) : value\n ];\n }));\n}\n\nfunction toReactive(objectRef) {\n if (!isRef(objectRef))\n return reactive(objectRef);\n const proxy = new Proxy({}, {\n get(_, p, receiver) {\n return unref(Reflect.get(objectRef.value, p, receiver));\n },\n set(_, p, value) {\n if (isRef(objectRef.value[p]) && !isRef(value))\n objectRef.value[p].value = value;\n else\n objectRef.value[p] = value;\n return true;\n },\n deleteProperty(_, p) {\n return Reflect.deleteProperty(objectRef.value, p);\n },\n has(_, p) {\n return Reflect.has(objectRef.value, p);\n },\n ownKeys() {\n return Object.keys(objectRef.value);\n },\n getOwnPropertyDescriptor() {\n return {\n enumerable: true,\n configurable: true\n };\n }\n });\n return reactive(proxy);\n}\n\nfunction reactiveComputed(fn) {\n return toReactive(computed(fn));\n}\n\nfunction reactiveOmit(obj, ...keys) {\n return reactiveComputed(() => Object.fromEntries(Object.entries(toRefs$1(obj)).filter((e) => !keys.includes(e[0]))));\n}\n\nfunction reactivePick(obj, ...keys) {\n return reactive(Object.fromEntries(keys.map((k) => [k, toRef(obj, k)])));\n}\n\nfunction refDefault(source, defaultValue) {\n return computed({\n get() {\n var _a;\n return (_a = source.value) != null ? _a : defaultValue;\n },\n set(value) {\n source.value = value;\n }\n });\n}\n\nfunction set(...args) {\n if (args.length === 2) {\n const [ref, value] = args;\n ref.value = value;\n }\n if (args.length === 3) {\n if (isVue2) {\n set$1(...args);\n } else {\n const [target, key, value] = args;\n target[key] = value;\n }\n }\n}\n\nfunction syncRef(source, targets, {\n flush = \"sync\",\n deep = false,\n immediate = true\n} = {}) {\n if (!Array.isArray(targets))\n targets = [targets];\n return watch(source, (newValue) => targets.forEach((target) => target.value = newValue), { flush, deep, immediate });\n}\n\nfunction useThrottleFn(fn, ms = 200, trailing = true, leading = true) {\n return createFilterWrapper(throttleFilter(ms, trailing, leading), fn);\n}\n\nfunction useThrottle(value, delay = 200, trailing = true, leading = true) {\n if (delay <= 0)\n return value;\n const throttled = ref(value.value);\n const updater = useThrottleFn(() => {\n throttled.value = value.value;\n }, delay, trailing, leading);\n watch(value, () => updater());\n return throttled;\n}\n\nvar __defProp$3 = Object.defineProperty;\nvar __defProps$1 = Object.defineProperties;\nvar __getOwnPropDescs$1 = Object.getOwnPropertyDescriptors;\nvar __getOwnPropSymbols$4 = Object.getOwnPropertySymbols;\nvar __hasOwnProp$4 = Object.prototype.hasOwnProperty;\nvar __propIsEnum$4 = Object.prototype.propertyIsEnumerable;\nvar __defNormalProp$3 = (obj, key, value) => key in obj ? __defProp$3(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;\nvar __spreadValues$3 = (a, b) => {\n for (var prop in b || (b = {}))\n if (__hasOwnProp$4.call(b, prop))\n __defNormalProp$3(a, prop, b[prop]);\n if (__getOwnPropSymbols$4)\n for (var prop of __getOwnPropSymbols$4(b)) {\n if (__propIsEnum$4.call(b, prop))\n __defNormalProp$3(a, prop, b[prop]);\n }\n return a;\n};\nvar __spreadProps$1 = (a, b) => __defProps$1(a, __getOwnPropDescs$1(b));\nvar __objRest$1 = (source, exclude) => {\n var target = {};\n for (var prop in source)\n if (__hasOwnProp$4.call(source, prop) && exclude.indexOf(prop) < 0)\n target[prop] = source[prop];\n if (source != null && __getOwnPropSymbols$4)\n for (var prop of __getOwnPropSymbols$4(source)) {\n if (exclude.indexOf(prop) < 0 && __propIsEnum$4.call(source, prop))\n target[prop] = source[prop];\n }\n return target;\n};\nfunction throttledWatch(source, cb, options = {}) {\n const _a = options, {\n throttle = 0,\n trailing = true,\n leading = true\n } = _a, watchOptions = __objRest$1(_a, [\n \"throttle\",\n \"trailing\",\n \"leading\"\n ]);\n return watchWithFilter(source, cb, __spreadProps$1(__spreadValues$3({}, watchOptions), {\n eventFilter: throttleFilter(throttle, trailing, leading)\n }));\n}\n\nvar __defProp$2 = Object.defineProperty;\nvar __defProps = Object.defineProperties;\nvar __getOwnPropDescs = Object.getOwnPropertyDescriptors;\nvar __getOwnPropSymbols$3 = Object.getOwnPropertySymbols;\nvar __hasOwnProp$3 = Object.prototype.hasOwnProperty;\nvar __propIsEnum$3 = Object.prototype.propertyIsEnumerable;\nvar __defNormalProp$2 = (obj, key, value) => key in obj ? __defProp$2(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;\nvar __spreadValues$2 = (a, b) => {\n for (var prop in b || (b = {}))\n if (__hasOwnProp$3.call(b, prop))\n __defNormalProp$2(a, prop, b[prop]);\n if (__getOwnPropSymbols$3)\n for (var prop of __getOwnPropSymbols$3(b)) {\n if (__propIsEnum$3.call(b, prop))\n __defNormalProp$2(a, prop, b[prop]);\n }\n return a;\n};\nvar __spreadProps = (a, b) => __defProps(a, __getOwnPropDescs(b));\nfunction toRefs(objectRef) {\n if (!isRef(objectRef))\n return toRefs$1(objectRef);\n const result = Array.isArray(objectRef.value) ? new Array(objectRef.value.length) : {};\n for (const key in objectRef.value) {\n result[key] = customRef(() => ({\n get() {\n return objectRef.value[key];\n },\n set(v) {\n if (Array.isArray(objectRef.value)) {\n const copy = [...objectRef.value];\n copy[key] = v;\n objectRef.value = copy;\n } else {\n objectRef.value = __spreadProps(__spreadValues$2({}, objectRef.value), { [key]: v });\n }\n }\n }));\n }\n return result;\n}\n\nfunction tryOnBeforeUnmount(fn) {\n if (getCurrentInstance())\n onBeforeUnmount(fn);\n}\n\nfunction tryOnMounted(fn, sync = true) {\n if (getCurrentInstance())\n onMounted(fn);\n else if (sync)\n fn();\n else\n nextTick(fn);\n}\n\nfunction tryOnUnmounted(fn) {\n if (getCurrentInstance())\n onUnmounted(fn);\n}\n\nfunction until(r) {\n let isNot = false;\n function toMatch(condition, { flush = \"sync\", deep = false, timeout, throwOnTimeout } = {}) {\n let stop = null;\n const watcher = new Promise((resolve) => {\n stop = watch(r, (v) => {\n if (condition(v) === !isNot) {\n stop == null ? void 0 : stop();\n resolve();\n }\n }, {\n flush,\n deep,\n immediate: true\n });\n });\n const promises = [watcher];\n if (timeout) {\n promises.push(promiseTimeout(timeout, throwOnTimeout).finally(() => {\n stop == null ? void 0 : stop();\n }));\n }\n return Promise.race(promises);\n }\n function toBe(value, options) {\n return toMatch((v) => v === unref(value), options);\n }\n function toBeTruthy(options) {\n return toMatch((v) => Boolean(v), options);\n }\n function toBeNull(options) {\n return toBe(null, options);\n }\n function toBeUndefined(options) {\n return toBe(void 0, options);\n }\n function toBeNaN(options) {\n return toMatch(Number.isNaN, options);\n }\n function toContains(value, options) {\n return toMatch((v) => {\n const array = Array.from(v);\n return array.includes(value) || array.includes(unref(value));\n }, options);\n }\n function changed(options) {\n return changedTimes(1, options);\n }\n function changedTimes(n = 1, options) {\n let count = -1;\n return toMatch(() => {\n count += 1;\n return count >= n;\n }, options);\n }\n if (Array.isArray(unref(r))) {\n const instance = {\n toMatch,\n toContains,\n changed,\n changedTimes,\n get not() {\n isNot = !isNot;\n return this;\n }\n };\n return instance;\n } else {\n const instance = {\n toMatch,\n toBe,\n toBeTruthy,\n toBeNull,\n toBeNaN,\n toBeUndefined,\n changed,\n changedTimes,\n get not() {\n isNot = !isNot;\n return this;\n }\n };\n return instance;\n }\n}\n\nfunction useCounter(initialValue = 0, options = {}) {\n const count = ref(initialValue);\n const {\n max = Infinity,\n min = -Infinity\n } = options;\n const inc = (delta = 1) => count.value = Math.min(max, count.value + delta);\n const dec = (delta = 1) => count.value = Math.max(min, count.value - delta);\n const get = () => count.value;\n const set = (val) => count.value = val;\n const reset = (val = initialValue) => {\n initialValue = val;\n return set(val);\n };\n return { count, inc, dec, get, set, reset };\n}\n\nfunction useIntervalFn(cb, interval = 1e3, options = {}) {\n const {\n immediate = true,\n immediateCallback = false\n } = options;\n let timer = null;\n const isActive = ref(false);\n function clean() {\n if (timer) {\n clearInterval(timer);\n timer = null;\n }\n }\n function pause() {\n isActive.value = false;\n clean();\n }\n function resume() {\n if (interval <= 0)\n return;\n isActive.value = true;\n if (immediateCallback)\n cb();\n clean();\n timer = setInterval(cb, unref(interval));\n }\n if (immediate && isClient)\n resume();\n if (isRef(interval)) {\n const stopWatch = watch(interval, () => {\n if (immediate && isClient)\n resume();\n });\n tryOnScopeDispose(stopWatch);\n }\n tryOnScopeDispose(pause);\n return {\n isActive,\n pause,\n resume\n };\n}\n\nvar __defProp$1 = Object.defineProperty;\nvar __getOwnPropSymbols$2 = Object.getOwnPropertySymbols;\nvar __hasOwnProp$2 = Object.prototype.hasOwnProperty;\nvar __propIsEnum$2 = Object.prototype.propertyIsEnumerable;\nvar __defNormalProp$1 = (obj, key, value) => key in obj ? __defProp$1(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;\nvar __spreadValues$1 = (a, b) => {\n for (var prop in b || (b = {}))\n if (__hasOwnProp$2.call(b, prop))\n __defNormalProp$1(a, prop, b[prop]);\n if (__getOwnPropSymbols$2)\n for (var prop of __getOwnPropSymbols$2(b)) {\n if (__propIsEnum$2.call(b, prop))\n __defNormalProp$1(a, prop, b[prop]);\n }\n return a;\n};\nfunction useInterval(interval = 1e3, options = {}) {\n const {\n controls: exposeControls = false,\n immediate = true\n } = options;\n const counter = ref(0);\n const controls = useIntervalFn(() => counter.value += 1, interval, { immediate });\n if (exposeControls) {\n return __spreadValues$1({\n counter\n }, controls);\n } else {\n return counter;\n }\n}\n\nfunction useLastChanged(source, options = {}) {\n var _a;\n const ms = ref((_a = options.initialValue) != null ? _a : null);\n watch(source, () => ms.value = timestamp(), options);\n return ms;\n}\n\nfunction useTimeoutFn(cb, interval, options = {}) {\n const {\n immediate = true\n } = options;\n const isPending = ref(false);\n let timer = null;\n function clear() {\n if (timer) {\n clearTimeout(timer);\n timer = null;\n }\n }\n function stop() {\n isPending.value = false;\n clear();\n }\n function start(...args) {\n clear();\n isPending.value = true;\n timer = setTimeout(() => {\n isPending.value = false;\n timer = null;\n cb(...args);\n }, unref(interval));\n }\n if (immediate) {\n isPending.value = true;\n if (isClient)\n start();\n }\n tryOnScopeDispose(stop);\n return {\n isPending,\n start,\n stop\n };\n}\n\nvar __defProp = Object.defineProperty;\nvar __getOwnPropSymbols$1 = Object.getOwnPropertySymbols;\nvar __hasOwnProp$1 = Object.prototype.hasOwnProperty;\nvar __propIsEnum$1 = Object.prototype.propertyIsEnumerable;\nvar __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;\nvar __spreadValues = (a, b) => {\n for (var prop in b || (b = {}))\n if (__hasOwnProp$1.call(b, prop))\n __defNormalProp(a, prop, b[prop]);\n if (__getOwnPropSymbols$1)\n for (var prop of __getOwnPropSymbols$1(b)) {\n if (__propIsEnum$1.call(b, prop))\n __defNormalProp(a, prop, b[prop]);\n }\n return a;\n};\nfunction useTimeout(interval = 1e3, options = {}) {\n const {\n controls: exposeControls = false\n } = options;\n const controls = useTimeoutFn(noop, interval, options);\n const ready = computed(() => !controls.isPending.value);\n if (exposeControls) {\n return __spreadValues({\n ready\n }, controls);\n } else {\n return ready;\n }\n}\n\nfunction useToggle(initialValue = false) {\n if (isRef(initialValue)) {\n return (value) => {\n initialValue.value = typeof value === \"boolean\" ? value : !initialValue.value;\n return initialValue.value;\n };\n } else {\n const boolean = ref(initialValue);\n const toggle = (value) => {\n boolean.value = typeof value === \"boolean\" ? value : !boolean.value;\n return boolean.value;\n };\n return [boolean, toggle];\n }\n}\n\nvar __getOwnPropSymbols = Object.getOwnPropertySymbols;\nvar __hasOwnProp = Object.prototype.hasOwnProperty;\nvar __propIsEnum = Object.prototype.propertyIsEnumerable;\nvar __objRest = (source, exclude) => {\n var target = {};\n for (var prop in source)\n if (__hasOwnProp.call(source, prop) && exclude.indexOf(prop) < 0)\n target[prop] = source[prop];\n if (source != null && __getOwnPropSymbols)\n for (var prop of __getOwnPropSymbols(source)) {\n if (exclude.indexOf(prop) < 0 && __propIsEnum.call(source, prop))\n target[prop] = source[prop];\n }\n return target;\n};\nfunction watchAtMost(source, cb, options) {\n const _a = options, {\n count\n } = _a, watchOptions = __objRest(_a, [\n \"count\"\n ]);\n const current = ref(0);\n const stop = watchWithFilter(source, (...args) => {\n current.value += 1;\n if (current.value >= unref(count))\n nextTick(() => stop());\n cb(...args);\n }, watchOptions);\n return { count: current, stop };\n}\n\nfunction watchOnce(source, cb, options) {\n const stop = watch(source, (...args) => {\n nextTick(() => stop());\n return cb(...args);\n }, options);\n}\n\nfunction whenever(source, cb, options) {\n return watch(source, (v, ov, onInvalidate) => {\n if (v)\n cb(v, ov, onInvalidate);\n }, options);\n}\n\nexport { and, assert, biSyncRef, bypassFilter, clamp, containsProp, controlledComputed, controlledRef, createEventHook, createFilterWrapper, createGlobalState, reactify as createReactiveFn, createSharedComposable, createSingletonPromise, debounceFilter, useDebounce as debouncedRef, debouncedWatch, eagerComputed, extendRef, get, identity, ignorableWatch, increaseWithUnit, invoke, isBoolean, isClient, isDef, isDefined, isFunction, isNumber, isObject, isString, isWindow, makeDestructurable, noop, not, now, objectPick, or, pausableFilter, pausableWatch, promiseTimeout, rand, reactify, reactifyObject, reactiveComputed, reactiveOmit, reactivePick, refDefault, set, syncRef, throttleFilter, useThrottle as throttledRef, throttledWatch, timestamp, toReactive, toRefs, tryOnBeforeUnmount, tryOnMounted, tryOnScopeDispose, tryOnUnmounted, until, useCounter, useDebounce, useDebounceFn, useInterval, useIntervalFn, useLastChanged, useThrottle, useThrottleFn, useTimeout, useTimeoutFn, useToggle, watchAtMost, watchOnce, watchWithFilter, whenever };\n","import { noop, isClient, isString, tryOnScopeDispose, tryOnMounted, promiseTimeout, increaseWithUnit, clamp, useTimeoutFn, watchWithFilter, createEventHook, isFunction, timestamp, pausableFilter, ignorableWatch, debounceFilter, createFilterWrapper, bypassFilter, createSingletonPromise, toRefs, containsProp, until, throttleFilter, useDebounceFn, useThrottleFn, isObject, isNumber, useIntervalFn, objectPick, tryOnUnmounted, identity, pausableWatch } from '@vueuse/shared';\nexport * from '@vueuse/shared';\nimport { isRef, ref, watchEffect, computed, customRef, unref, inject, watch, getCurrentInstance, onUpdated, reactive, shallowRef, markRaw, getCurrentScope, isVue2, set, del, onMounted, readonly, onBeforeUpdate } from 'vue-demi';\nimport { unrefElement as unrefElement$1, useEventListener as useEventListener$1, useClamp as useClamp$1, biSyncRef, noop as noop$1 } from '@vueuse/core';\n\nfunction asyncComputed(evaluationCallback, initialState, optionsOrRef) {\n let options;\n if (isRef(optionsOrRef)) {\n options = {\n evaluating: optionsOrRef\n };\n } else {\n options = optionsOrRef || {};\n }\n const {\n lazy = false,\n evaluating = void 0,\n onError = noop\n } = options;\n const started = ref(!lazy);\n const current = ref(initialState);\n let counter = 0;\n watchEffect(async (onInvalidate) => {\n if (!started.value)\n return;\n counter++;\n const counterAtBeginning = counter;\n let hasFinished = false;\n if (evaluating) {\n Promise.resolve().then(() => {\n evaluating.value = true;\n });\n }\n try {\n const result = await evaluationCallback((cancelCallback) => {\n onInvalidate(() => {\n if (evaluating)\n evaluating.value = false;\n if (!hasFinished)\n cancelCallback();\n });\n });\n if (counterAtBeginning === counter)\n current.value = result;\n } catch (e) {\n onError(e);\n } finally {\n if (evaluating)\n evaluating.value = false;\n hasFinished = true;\n }\n });\n if (lazy) {\n return computed(() => {\n started.value = true;\n return current.value;\n });\n } else {\n return current;\n }\n}\n\nfunction autoResetRef(defaultValue, afterMs = 1e4) {\n return customRef((track, trigger) => {\n let value = defaultValue;\n let timer;\n const resetAfter = () => setTimeout(() => {\n value = defaultValue;\n trigger();\n }, unref(afterMs));\n return {\n get() {\n track();\n return value;\n },\n set(newValue) {\n value = newValue;\n trigger();\n clearTimeout(timer);\n timer = resetAfter();\n }\n };\n });\n}\n\nfunction computedInject(key, options, defaultSource, treatDefaultAsFactory) {\n let source = inject(key);\n if (defaultSource)\n source = inject(key, defaultSource);\n if (treatDefaultAsFactory)\n source = inject(key, defaultSource, treatDefaultAsFactory);\n if (typeof options === \"function\") {\n return computed((ctx) => options(source, ctx));\n } else {\n return computed({\n get: (ctx) => options.get(source, ctx),\n set: options.set\n });\n }\n}\n\nconst createUnrefFn = (fn) => {\n return function(...args) {\n return fn.apply(this, args.map((i) => unref(i)));\n };\n};\n\nfunction unrefElement(elRef) {\n var _a;\n const plain = unref(elRef);\n return (_a = plain == null ? void 0 : plain.$el) != null ? _a : plain;\n}\n\nconst defaultWindow = isClient ? window : void 0;\nconst defaultDocument = isClient ? window.document : void 0;\nconst defaultNavigator = isClient ? window.navigator : void 0;\nconst defaultLocation = isClient ? window.location : void 0;\n\nfunction useEventListener(...args) {\n let target;\n let event;\n let listener;\n let options;\n if (isString(args[0])) {\n [event, listener, options] = args;\n target = defaultWindow;\n } else {\n [target, event, listener, options] = args;\n }\n if (!target)\n return noop;\n let cleanup = noop;\n const stopWatch = watch(() => unref(target), (el) => {\n cleanup();\n if (!el)\n return;\n el.addEventListener(event, listener, options);\n cleanup = () => {\n el.removeEventListener(event, listener, options);\n cleanup = noop;\n };\n }, { immediate: true, flush: \"post\" });\n const stop = () => {\n stopWatch();\n cleanup();\n };\n tryOnScopeDispose(stop);\n return stop;\n}\n\nfunction onClickOutside(target, handler, options = {}) {\n const { window = defaultWindow, ignore } = options;\n if (!window)\n return;\n const shouldListen = ref(true);\n const listener = (event) => {\n const el = unrefElement(target);\n const composedPath = event.composedPath();\n if (!el || el === event.target || composedPath.includes(el) || !shouldListen.value)\n return;\n if (ignore && ignore.length > 0) {\n if (ignore.some((target2) => {\n const el2 = unrefElement(target2);\n return el2 && (event.target === el2 || composedPath.includes(el2));\n }))\n return;\n }\n handler(event);\n };\n const cleanup = [\n useEventListener(window, \"click\", listener, { passive: true, capture: true }),\n useEventListener(window, \"pointerdown\", (e) => {\n const el = unrefElement(target);\n shouldListen.value = !!el && !e.composedPath().includes(el);\n }, { passive: true })\n ];\n const stop = () => cleanup.forEach((fn) => fn());\n return stop;\n}\n\nvar __defProp$h = Object.defineProperty;\nvar __defProps$9 = Object.defineProperties;\nvar __getOwnPropDescs$9 = Object.getOwnPropertyDescriptors;\nvar __getOwnPropSymbols$j = Object.getOwnPropertySymbols;\nvar __hasOwnProp$j = Object.prototype.hasOwnProperty;\nvar __propIsEnum$j = Object.prototype.propertyIsEnumerable;\nvar __defNormalProp$h = (obj, key, value) => key in obj ? __defProp$h(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;\nvar __spreadValues$h = (a, b) => {\n for (var prop in b || (b = {}))\n if (__hasOwnProp$j.call(b, prop))\n __defNormalProp$h(a, prop, b[prop]);\n if (__getOwnPropSymbols$j)\n for (var prop of __getOwnPropSymbols$j(b)) {\n if (__propIsEnum$j.call(b, prop))\n __defNormalProp$h(a, prop, b[prop]);\n }\n return a;\n};\nvar __spreadProps$9 = (a, b) => __defProps$9(a, __getOwnPropDescs$9(b));\nconst createKeyPredicate = (keyFilter) => {\n if (typeof keyFilter === \"function\")\n return keyFilter;\n else if (typeof keyFilter === \"string\")\n return (event) => event.key === keyFilter;\n else if (Array.isArray(keyFilter))\n return (event) => keyFilter.includes(event.key);\n else if (keyFilter)\n return () => true;\n else\n return () => false;\n};\nfunction onKeyStroke(key, handler, options = {}) {\n const { target = defaultWindow, eventName = \"keydown\", passive = false } = options;\n const predicate = createKeyPredicate(key);\n const listener = (e) => {\n if (predicate(e))\n handler(e);\n };\n return useEventListener(target, eventName, listener, passive);\n}\nfunction onKeyDown(key, handler, options = {}) {\n return onKeyStroke(key, handler, __spreadProps$9(__spreadValues$h({}, options), { eventName: \"keydown\" }));\n}\nfunction onKeyPressed(key, handler, options = {}) {\n return onKeyStroke(key, handler, __spreadProps$9(__spreadValues$h({}, options), { eventName: \"keypress\" }));\n}\nfunction onKeyUp(key, handler, options = {}) {\n return onKeyStroke(key, handler, __spreadProps$9(__spreadValues$h({}, options), { eventName: \"keyup\" }));\n}\n\nconst DEFAULT_DELAY = 500;\nfunction onLongPress(target, handler, options) {\n const elementRef = computed(() => unrefElement$1(target));\n let timeout = null;\n function clear() {\n if (timeout != null) {\n clearTimeout(timeout);\n timeout = null;\n }\n }\n function onDown(ev) {\n var _a;\n clear();\n timeout = setTimeout(() => handler(ev), (_a = options == null ? void 0 : options.delay) != null ? _a : DEFAULT_DELAY);\n }\n useEventListener$1(elementRef, \"pointerdown\", onDown);\n useEventListener$1(elementRef, \"pointerup\", clear);\n useEventListener$1(elementRef, \"pointerleave\", clear);\n}\n\nconst isFocusedElementEditable = () => {\n const { activeElement, body } = document;\n if (!activeElement)\n return false;\n if (activeElement === body)\n return false;\n switch (activeElement.tagName) {\n case \"INPUT\":\n case \"TEXTAREA\":\n return true;\n }\n return activeElement.hasAttribute(\"contenteditable\");\n};\nconst isTypedCharValid = ({\n keyCode,\n metaKey,\n ctrlKey,\n altKey\n}) => {\n if (metaKey || ctrlKey || altKey)\n return false;\n if (keyCode >= 48 && keyCode <= 57 || keyCode >= 96 && keyCode <= 105)\n return true;\n if (keyCode >= 65 && keyCode <= 90)\n return true;\n return false;\n};\nfunction onStartTyping(callback, options = {}) {\n const { document: document2 = defaultDocument } = options;\n const keydown = (event) => {\n !isFocusedElementEditable() && isTypedCharValid(event) && callback(event);\n };\n if (document2)\n useEventListener(document2, \"keydown\", keydown, { passive: true });\n}\n\nfunction templateRef(key, initialValue = null) {\n const instance = getCurrentInstance();\n let _trigger = () => {\n };\n const element = customRef((track, trigger) => {\n _trigger = trigger;\n return {\n get() {\n var _a, _b;\n track();\n return (_b = (_a = instance == null ? void 0 : instance.proxy) == null ? void 0 : _a.$refs[key]) != null ? _b : initialValue;\n },\n set() {\n }\n };\n });\n tryOnMounted(_trigger);\n onUpdated(_trigger);\n return element;\n}\n\nfunction useActiveElement(options = {}) {\n const { window = defaultWindow } = options;\n const counter = ref(0);\n if (window) {\n useEventListener(window, \"blur\", () => counter.value += 1, true);\n useEventListener(window, \"focus\", () => counter.value += 1, true);\n }\n return computed(() => {\n counter.value;\n return window == null ? void 0 : window.document.activeElement;\n });\n}\n\nfunction useAsyncQueue(tasks, options = {}) {\n const {\n interrupt = true,\n onError = noop,\n onFinished = noop\n } = options;\n const promiseState = {\n pending: \"pending\",\n rejected: \"rejected\",\n fulfilled: \"fulfilled\"\n };\n const initialResult = Array.from(new Array(tasks.length), () => ({ state: promiseState.pending, data: null }));\n const result = reactive(initialResult);\n const activeIndex = ref(-1);\n if (!tasks || tasks.length === 0) {\n onFinished();\n return {\n activeIndex,\n result\n };\n }\n function updateResult(state, res) {\n activeIndex.value++;\n result[activeIndex.value].data = res;\n result[activeIndex.value].state = state;\n }\n tasks.reduce((prev, curr) => {\n return prev.then((prevRes) => {\n var _a;\n if (((_a = result[activeIndex.value]) == null ? void 0 : _a.state) === promiseState.rejected && interrupt) {\n onFinished();\n return;\n }\n return curr(prevRes).then((currentRes) => {\n updateResult(promiseState.fulfilled, currentRes);\n activeIndex.value === tasks.length - 1 && onFinished();\n return currentRes;\n });\n }).catch((e) => {\n updateResult(promiseState.rejected, e);\n onError();\n return e;\n });\n }, Promise.resolve());\n return {\n activeIndex,\n result\n };\n}\n\nfunction useAsyncState(promise, initialState, options) {\n const {\n immediate = true,\n delay = 0,\n onError = noop,\n resetOnExecute = true,\n shallow = true\n } = options != null ? options : {};\n const state = shallow ? shallowRef(initialState) : ref(initialState);\n const isReady = ref(false);\n const isLoading = ref(false);\n const error = ref(void 0);\n async function execute(delay2 = 0, ...args) {\n if (resetOnExecute)\n state.value = initialState;\n error.value = void 0;\n isReady.value = false;\n isLoading.value = true;\n if (delay2 > 0)\n await promiseTimeout(delay2);\n const _promise = typeof promise === \"function\" ? promise(...args) : promise;\n try {\n const data = await _promise;\n state.value = data;\n isReady.value = true;\n } catch (e) {\n error.value = e;\n onError(e);\n }\n isLoading.value = false;\n return state.value;\n }\n if (immediate)\n execute(delay);\n return {\n state,\n isReady,\n isLoading,\n error,\n execute\n };\n}\n\nfunction useBase64(target, options) {\n const base64 = ref(\"\");\n const promise = ref();\n function execute() {\n if (!isClient)\n return;\n promise.value = new Promise((resolve, reject) => {\n try {\n const _target = unref(target);\n if (_target === void 0 || _target === null) {\n resolve(\"\");\n } else if (typeof _target === \"string\") {\n resolve(blobToBase64(new Blob([_target], { type: \"text/plain\" })));\n } else if (_target instanceof Blob) {\n resolve(blobToBase64(_target));\n } else if (_target instanceof ArrayBuffer) {\n resolve(window.btoa(String.fromCharCode(...new Uint8Array(_target))));\n } else if (_target instanceof HTMLCanvasElement) {\n resolve(_target.toDataURL(options == null ? void 0 : options.type, options == null ? void 0 : options.quality));\n } else if (_target instanceof HTMLImageElement) {\n const img = _target.cloneNode(false);\n img.crossOrigin = \"Anonymous\";\n imgLoaded(img).then(() => {\n const canvas = document.createElement(\"canvas\");\n const ctx = canvas.getContext(\"2d\");\n canvas.width = img.width;\n canvas.height = img.height;\n ctx.drawImage(img, 0, 0, canvas.width, canvas.height);\n resolve(canvas.toDataURL(options == null ? void 0 : options.type, options == null ? void 0 : options.quality));\n }).catch(reject);\n } else {\n reject(new Error(\"target is unsupported types\"));\n }\n } catch (error) {\n reject(error);\n }\n });\n promise.value.then((res) => base64.value = res);\n return promise.value;\n }\n watch(target, execute, { immediate: true });\n return {\n base64,\n promise,\n execute\n };\n}\nfunction imgLoaded(img) {\n return new Promise((resolve, reject) => {\n if (!img.complete) {\n img.onload = () => {\n resolve();\n };\n img.onerror = reject;\n } else {\n resolve();\n }\n });\n}\nfunction blobToBase64(blob) {\n return new Promise((resolve, reject) => {\n const fr = new FileReader();\n fr.onload = (e) => {\n resolve(e.target.result);\n };\n fr.onerror = reject;\n fr.readAsDataURL(blob);\n });\n}\n\nfunction useBattery({ navigator = defaultNavigator } = {}) {\n const events = [\"chargingchange\", \"chargingtimechange\", \"dischargingtimechange\", \"levelchange\"];\n const isSupported = navigator && \"getBattery\" in navigator;\n const charging = ref(false);\n const chargingTime = ref(0);\n const dischargingTime = ref(0);\n const level = ref(1);\n let battery;\n function updateBatteryInfo() {\n charging.value = this.charging;\n chargingTime.value = this.chargingTime || 0;\n dischargingTime.value = this.dischargingTime || 0;\n level.value = this.level;\n }\n if (isSupported) {\n navigator.getBattery().then((_battery) => {\n battery = _battery;\n updateBatteryInfo.call(battery);\n for (const event of events)\n useEventListener(battery, event, updateBatteryInfo, { passive: true });\n });\n }\n return {\n isSupported,\n charging,\n chargingTime,\n dischargingTime,\n level\n };\n}\n\nfunction useMediaQuery(query, options = {}) {\n const { window = defaultWindow } = options;\n let mediaQuery;\n const matches = ref(false);\n const update = () => {\n if (!window)\n return;\n if (!mediaQuery)\n mediaQuery = window.matchMedia(query);\n matches.value = mediaQuery.matches;\n };\n tryOnMounted(() => {\n update();\n if (!mediaQuery)\n return;\n if (\"addEventListener\" in mediaQuery)\n mediaQuery.addEventListener(\"change\", update);\n else\n mediaQuery.addListener(update);\n tryOnScopeDispose(() => {\n if (\"removeEventListener\" in update)\n mediaQuery.removeEventListener(\"change\", update);\n else\n mediaQuery.removeListener(update);\n });\n });\n return matches;\n}\n\nconst breakpointsTailwind = {\n \"sm\": 640,\n \"md\": 768,\n \"lg\": 1024,\n \"xl\": 1280,\n \"2xl\": 1536\n};\nconst breakpointsBootstrapV5 = {\n sm: 576,\n md: 768,\n lg: 992,\n xl: 1200,\n xxl: 1400\n};\nconst breakpointsVuetify = {\n xs: 600,\n sm: 960,\n md: 1264,\n lg: 1904\n};\nconst breakpointsAntDesign = {\n xs: 480,\n sm: 576,\n md: 768,\n lg: 992,\n xl: 1200,\n xxl: 1600\n};\nconst breakpointsQuasar = {\n xs: 600,\n sm: 1024,\n md: 1440,\n lg: 1920\n};\nconst breakpointsSematic = {\n mobileS: 320,\n mobileM: 375,\n mobileL: 425,\n tablet: 768,\n laptop: 1024,\n laptopL: 1440,\n desktop4K: 2560\n};\n\nvar __defProp$g = Object.defineProperty;\nvar __getOwnPropSymbols$i = Object.getOwnPropertySymbols;\nvar __hasOwnProp$i = Object.prototype.hasOwnProperty;\nvar __propIsEnum$i = Object.prototype.propertyIsEnumerable;\nvar __defNormalProp$g = (obj, key, value) => key in obj ? __defProp$g(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;\nvar __spreadValues$g = (a, b) => {\n for (var prop in b || (b = {}))\n if (__hasOwnProp$i.call(b, prop))\n __defNormalProp$g(a, prop, b[prop]);\n if (__getOwnPropSymbols$i)\n for (var prop of __getOwnPropSymbols$i(b)) {\n if (__propIsEnum$i.call(b, prop))\n __defNormalProp$g(a, prop, b[prop]);\n }\n return a;\n};\nfunction useBreakpoints(breakpoints, options = {}) {\n function getValue(k, delta) {\n let v = breakpoints[k];\n if (delta != null)\n v = increaseWithUnit(v, delta);\n if (typeof v === \"number\")\n v = `${v}px`;\n return v;\n }\n const { window = defaultWindow } = options;\n function match(query) {\n if (!window)\n return false;\n return window.matchMedia(query).matches;\n }\n const greater = (k) => {\n return useMediaQuery(`(min-width: ${getValue(k)})`, options);\n };\n const shortcutMethods = Object.keys(breakpoints).reduce((shortcuts, k) => {\n Object.defineProperty(shortcuts, k, {\n get: () => greater(k),\n enumerable: true,\n configurable: true\n });\n return shortcuts;\n }, {});\n return __spreadValues$g({\n greater,\n smaller(k) {\n return useMediaQuery(`(max-width: ${getValue(k, -0.1)})`, options);\n },\n between(a, b) {\n return useMediaQuery(`(min-width: ${getValue(a)}) and (max-width: ${getValue(b, -0.1)})`, options);\n },\n isGreater(k) {\n return match(`(min-width: ${getValue(k)})`);\n },\n isSmaller(k) {\n return match(`(max-width: ${getValue(k, -0.1)})`);\n },\n isInBetween(a, b) {\n return match(`(min-width: ${getValue(a)}) and (max-width: ${getValue(b, -0.1)})`);\n }\n }, shortcutMethods);\n}\n\nconst useBroadcastChannel = (options) => {\n const {\n name,\n window = defaultWindow\n } = options;\n const isSupported = window && \"BroadcastChannel\" in window;\n const isClosed = ref(false);\n const channel = ref();\n const data = ref();\n const error = ref(null);\n const post = (data2) => {\n if (channel.value)\n channel.value.postMessage(data2);\n };\n const close = () => {\n if (channel.value)\n channel.value.close();\n isClosed.value = true;\n };\n if (isSupported) {\n tryOnMounted(() => {\n error.value = null;\n channel.value = new BroadcastChannel(name);\n channel.value.addEventListener(\"message\", (e) => {\n data.value = e.data;\n }, { passive: true });\n channel.value.addEventListener(\"messageerror\", (e) => {\n error.value = e;\n }, { passive: true });\n channel.value.addEventListener(\"close\", () => {\n isClosed.value = true;\n });\n });\n }\n tryOnScopeDispose(() => {\n close();\n });\n return {\n isSupported,\n channel,\n data,\n post,\n close,\n error,\n isClosed\n };\n};\n\nfunction useBrowserLocation({ window = defaultWindow } = {}) {\n const buildState = (trigger) => {\n const { state: state2, length } = (window == null ? void 0 : window.history) || {};\n const { hash, host, hostname, href, origin, pathname, port, protocol, search } = (window == null ? void 0 : window.location) || {};\n return {\n trigger,\n state: state2,\n length,\n hash,\n host,\n hostname,\n href,\n origin,\n pathname,\n port,\n protocol,\n search\n };\n };\n const state = ref(buildState(\"load\"));\n if (window) {\n useEventListener(window, \"popstate\", () => state.value = buildState(\"popstate\"), { passive: true });\n useEventListener(window, \"hashchange\", () => state.value = buildState(\"hashchange\"), { passive: true });\n }\n return state;\n}\n\nfunction useCached(refValue, comparator = (a, b) => a === b, watchOptions) {\n const cachedValue = ref(refValue.value);\n watch(() => refValue.value, (value) => {\n if (!comparator(value, cachedValue.value))\n cachedValue.value = value;\n }, watchOptions);\n return cachedValue;\n}\n\nfunction useClamp(value, min, max) {\n const _value = ref(value);\n return computed({\n get() {\n return _value.value = clamp(_value.value, unref(min), unref(max));\n },\n set(value2) {\n _value.value = clamp(value2, unref(min), unref(max));\n }\n });\n}\n\nfunction useClipboard(options = {}) {\n const {\n navigator = defaultNavigator,\n read = false,\n source,\n copiedDuring = 1500\n } = options;\n const events = [\"copy\", \"cut\"];\n const isSupported = Boolean(navigator && \"clipboard\" in navigator);\n const text = ref(\"\");\n const copied = ref(false);\n const timeout = useTimeoutFn(() => copied.value = false, copiedDuring);\n function updateText() {\n navigator.clipboard.readText().then((value) => {\n text.value = value;\n });\n }\n if (isSupported && read) {\n for (const event of events)\n useEventListener(event, updateText);\n }\n async function copy(value = unref(source)) {\n if (isSupported && value != null) {\n await navigator.clipboard.writeText(value);\n text.value = value;\n copied.value = true;\n timeout.start();\n }\n }\n return {\n isSupported,\n text,\n copied,\n copy\n };\n}\n\nconst _global = typeof globalThis !== \"undefined\" ? globalThis : typeof window !== \"undefined\" ? window : typeof global !== \"undefined\" ? global : typeof self !== \"undefined\" ? self : {};\nconst globalKey = \"__vueuse_ssr_handlers__\";\n_global[globalKey] = _global[globalKey] || {};\nconst handlers = _global[globalKey];\nfunction getSSRHandler(key, fallback) {\n return handlers[key] || fallback;\n}\nfunction setSSRHandler(key, fn) {\n handlers[key] = fn;\n}\n\nfunction guessSerializerType(rawInit) {\n return rawInit == null ? \"any\" : rawInit instanceof Set ? \"set\" : rawInit instanceof Map ? \"map\" : typeof rawInit === \"boolean\" ? \"boolean\" : typeof rawInit === \"string\" ? \"string\" : typeof rawInit === \"object\" ? \"object\" : Array.isArray(rawInit) ? \"object\" : !Number.isNaN(rawInit) ? \"number\" : \"any\";\n}\n\nconst StorageSerializers = {\n boolean: {\n read: (v) => v === \"true\",\n write: (v) => String(v)\n },\n object: {\n read: (v) => JSON.parse(v),\n write: (v) => JSON.stringify(v)\n },\n number: {\n read: (v) => Number.parseFloat(v),\n write: (v) => String(v)\n },\n any: {\n read: (v) => v,\n write: (v) => String(v)\n },\n string: {\n read: (v) => v,\n write: (v) => String(v)\n },\n map: {\n read: (v) => new Map(JSON.parse(v)),\n write: (v) => JSON.stringify(Array.from(v.entries()))\n },\n set: {\n read: (v) => new Set(JSON.parse(v)),\n write: (v) => JSON.stringify(Array.from(v.entries()))\n }\n};\nfunction useStorage(key, initialValue, storage, options = {}) {\n var _a;\n const {\n flush = \"pre\",\n deep = true,\n listenToStorageChanges = true,\n writeDefaults = true,\n shallow,\n window = defaultWindow,\n eventFilter,\n onError = (e) => {\n console.error(e);\n }\n } = options;\n const rawInit = unref(initialValue);\n const type = guessSerializerType(rawInit);\n const data = (shallow ? shallowRef : ref)(initialValue);\n const serializer = (_a = options.serializer) != null ? _a : StorageSerializers[type];\n if (!storage) {\n try {\n storage = getSSRHandler(\"getDefaultStorage\", () => {\n var _a2;\n return (_a2 = defaultWindow) == null ? void 0 : _a2.localStorage;\n })();\n } catch (e) {\n onError(e);\n }\n }\n function read(event) {\n if (!storage || event && event.key !== key)\n return;\n try {\n const rawValue = event ? event.newValue : storage.getItem(key);\n if (rawValue == null) {\n data.value = rawInit;\n if (writeDefaults && rawInit !== null)\n storage.setItem(key, serializer.write(rawInit));\n } else if (typeof rawValue !== \"string\") {\n data.value = rawValue;\n } else {\n data.value = serializer.read(rawValue);\n }\n } catch (e) {\n onError(e);\n }\n }\n read();\n if (window && listenToStorageChanges)\n useEventListener(window, \"storage\", (e) => setTimeout(() => read(e), 0));\n if (storage) {\n watchWithFilter(data, () => {\n try {\n if (data.value == null)\n storage.removeItem(key);\n else\n storage.setItem(key, serializer.write(data.value));\n } catch (e) {\n onError(e);\n }\n }, {\n flush,\n deep,\n eventFilter\n });\n }\n return data;\n}\n\nfunction usePreferredDark(options) {\n return useMediaQuery(\"(prefers-color-scheme: dark)\", options);\n}\n\nvar __defProp$f = Object.defineProperty;\nvar __getOwnPropSymbols$h = Object.getOwnPropertySymbols;\nvar __hasOwnProp$h = Object.prototype.hasOwnProperty;\nvar __propIsEnum$h = Object.prototype.propertyIsEnumerable;\nvar __defNormalProp$f = (obj, key, value) => key in obj ? __defProp$f(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;\nvar __spreadValues$f = (a, b) => {\n for (var prop in b || (b = {}))\n if (__hasOwnProp$h.call(b, prop))\n __defNormalProp$f(a, prop, b[prop]);\n if (__getOwnPropSymbols$h)\n for (var prop of __getOwnPropSymbols$h(b)) {\n if (__propIsEnum$h.call(b, prop))\n __defNormalProp$f(a, prop, b[prop]);\n }\n return a;\n};\nfunction useColorMode(options = {}) {\n const {\n selector = \"html\",\n attribute = \"class\",\n window = defaultWindow,\n storage,\n storageKey = \"vueuse-color-scheme\",\n listenToStorageChanges = true,\n storageRef\n } = options;\n const modes = __spreadValues$f({\n auto: \"\",\n light: \"light\",\n dark: \"dark\"\n }, options.modes || {});\n const preferredDark = usePreferredDark({ window });\n const preferredMode = computed(() => preferredDark.value ? \"dark\" : \"light\");\n const store = storageRef || (storageKey == null ? ref(\"auto\") : useStorage(storageKey, \"auto\", storage, { window, listenToStorageChanges }));\n const state = computed({\n get() {\n return store.value === \"auto\" ? preferredMode.value : store.value;\n },\n set(v) {\n store.value = v;\n }\n });\n const updateHTMLAttrs = getSSRHandler(\"updateHTMLAttrs\", (selector2, attribute2, value) => {\n const el = window == null ? void 0 : window.document.querySelector(selector2);\n if (!el)\n return;\n if (attribute2 === \"class\") {\n const current = value.split(/\\s/g);\n Object.values(modes).flatMap((i) => (i || \"\").split(/\\s/g)).filter(Boolean).forEach((v) => {\n if (current.includes(v))\n el.classList.add(v);\n else\n el.classList.remove(v);\n });\n } else {\n el.setAttribute(attribute2, value);\n }\n });\n function defaultOnChanged(mode) {\n var _a;\n updateHTMLAttrs(selector, attribute, (_a = modes[mode]) != null ? _a : mode);\n }\n function onChanged(mode) {\n if (options.onChanged)\n options.onChanged(mode, defaultOnChanged);\n else\n defaultOnChanged(mode);\n }\n watch(state, onChanged, { flush: \"post\", immediate: true });\n tryOnMounted(() => onChanged(state.value));\n return state;\n}\n\nfunction useConfirmDialog(revealed = ref(false)) {\n const confirmHook = createEventHook();\n const cancelHook = createEventHook();\n const revealHook = createEventHook();\n let _resolve = noop;\n const reveal = (data) => {\n revealHook.trigger(data);\n revealed.value = true;\n return new Promise((resolve) => {\n _resolve = resolve;\n });\n };\n const confirm = (data) => {\n revealed.value = false;\n confirmHook.trigger(data);\n _resolve({ data, isCanceled: false });\n };\n const cancel = (data) => {\n revealed.value = false;\n cancelHook.trigger(data);\n _resolve({ data, isCanceled: true });\n };\n return {\n isRevealed: computed(() => revealed.value),\n reveal,\n confirm,\n cancel,\n onReveal: revealHook.on,\n onConfirm: confirmHook.on,\n onCancel: cancelHook.on\n };\n}\n\nfunction useCssVar(prop, target, { window = defaultWindow } = {}) {\n const variable = ref(\"\");\n const elRef = computed(() => {\n var _a;\n return unrefElement(target) || ((_a = window == null ? void 0 : window.document) == null ? void 0 : _a.documentElement);\n });\n watch([elRef, () => unref(prop)], ([el, prop2]) => {\n if (el && window)\n variable.value = window.getComputedStyle(el).getPropertyValue(prop2);\n }, { immediate: true });\n watch(variable, (val) => {\n var _a;\n if ((_a = elRef.value) == null ? void 0 : _a.style)\n elRef.value.style.setProperty(unref(prop), val);\n });\n return variable;\n}\n\nfunction useCycleList(list, options) {\n var _a;\n const state = shallowRef((_a = options == null ? void 0 : options.initialValue) != null ? _a : list[0]);\n const index = computed({\n get() {\n var _a2;\n let index2 = (options == null ? void 0 : options.getIndexOf) ? options.getIndexOf(state.value, list) : list.indexOf(state.value);\n if (index2 < 0)\n index2 = (_a2 = options == null ? void 0 : options.fallbackIndex) != null ? _a2 : 0;\n return index2;\n },\n set(v) {\n set(v);\n }\n });\n function set(i) {\n const length = list.length;\n const index2 = (i % length + length) % length;\n const value = list[index2];\n state.value = value;\n return value;\n }\n function shift(delta = 1) {\n return set(index.value + delta);\n }\n function next(n = 1) {\n return shift(n);\n }\n function prev(n = 1) {\n return shift(-n);\n }\n return {\n state,\n index,\n next,\n prev\n };\n}\n\nvar __defProp$e = Object.defineProperty;\nvar __defProps$8 = Object.defineProperties;\nvar __getOwnPropDescs$8 = Object.getOwnPropertyDescriptors;\nvar __getOwnPropSymbols$g = Object.getOwnPropertySymbols;\nvar __hasOwnProp$g = Object.prototype.hasOwnProperty;\nvar __propIsEnum$g = Object.prototype.propertyIsEnumerable;\nvar __defNormalProp$e = (obj, key, value) => key in obj ? __defProp$e(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;\nvar __spreadValues$e = (a, b) => {\n for (var prop in b || (b = {}))\n if (__hasOwnProp$g.call(b, prop))\n __defNormalProp$e(a, prop, b[prop]);\n if (__getOwnPropSymbols$g)\n for (var prop of __getOwnPropSymbols$g(b)) {\n if (__propIsEnum$g.call(b, prop))\n __defNormalProp$e(a, prop, b[prop]);\n }\n return a;\n};\nvar __spreadProps$8 = (a, b) => __defProps$8(a, __getOwnPropDescs$8(b));\nfunction useDark(options = {}) {\n const {\n valueDark = \"dark\",\n valueLight = \"\",\n window = defaultWindow\n } = options;\n const mode = useColorMode(__spreadProps$8(__spreadValues$e({}, options), {\n onChanged: (mode2, defaultHandler) => {\n var _a;\n if (options.onChanged)\n (_a = options.onChanged) == null ? void 0 : _a.call(options, mode2 === \"dark\");\n else\n defaultHandler(mode2);\n },\n modes: {\n dark: valueDark,\n light: valueLight\n }\n }));\n const preferredDark = usePreferredDark({ window });\n const isDark = computed({\n get() {\n return mode.value === \"dark\";\n },\n set(v) {\n if (v === preferredDark.value)\n mode.value = \"auto\";\n else\n mode.value = v ? \"dark\" : \"light\";\n }\n });\n return isDark;\n}\n\nconst fnClone = (v) => JSON.parse(JSON.stringify(v));\nconst fnBypass = (v) => v;\nconst fnSetSource = (source, value) => source.value = value;\nfunction defaultDump(clone) {\n return clone ? isFunction(clone) ? clone : fnClone : fnBypass;\n}\nfunction defaultParse(clone) {\n return clone ? isFunction(clone) ? clone : fnClone : fnBypass;\n}\nfunction useManualRefHistory(source, options = {}) {\n const {\n clone = false,\n dump = defaultDump(clone),\n parse = defaultParse(clone),\n setSource = fnSetSource\n } = options;\n function _createHistoryRecord() {\n return markRaw({\n snapshot: dump(source.value),\n timestamp: timestamp()\n });\n }\n const last = ref(_createHistoryRecord());\n const undoStack = ref([]);\n const redoStack = ref([]);\n const _setSource = (record) => {\n setSource(source, parse(record.snapshot));\n last.value = record;\n };\n const commit = () => {\n undoStack.value.unshift(last.value);\n last.value = _createHistoryRecord();\n if (options.capacity && undoStack.value.length > options.capacity)\n undoStack.value.splice(options.capacity, Infinity);\n if (redoStack.value.length)\n redoStack.value.splice(0, redoStack.value.length);\n };\n const clear = () => {\n undoStack.value.splice(0, undoStack.value.length);\n redoStack.value.splice(0, redoStack.value.length);\n };\n const undo = () => {\n const state = undoStack.value.shift();\n if (state) {\n redoStack.value.unshift(last.value);\n _setSource(state);\n }\n };\n const redo = () => {\n const state = redoStack.value.shift();\n if (state) {\n undoStack.value.unshift(last.value);\n _setSource(state);\n }\n };\n const reset = () => {\n _setSource(last.value);\n };\n const history = computed(() => [last.value, ...undoStack.value]);\n const canUndo = computed(() => undoStack.value.length > 0);\n const canRedo = computed(() => redoStack.value.length > 0);\n return {\n source,\n undoStack,\n redoStack,\n last,\n history,\n canUndo,\n canRedo,\n clear,\n commit,\n reset,\n undo,\n redo\n };\n}\n\nvar __defProp$d = Object.defineProperty;\nvar __defProps$7 = Object.defineProperties;\nvar __getOwnPropDescs$7 = Object.getOwnPropertyDescriptors;\nvar __getOwnPropSymbols$f = Object.getOwnPropertySymbols;\nvar __hasOwnProp$f = Object.prototype.hasOwnProperty;\nvar __propIsEnum$f = Object.prototype.propertyIsEnumerable;\nvar __defNormalProp$d = (obj, key, value) => key in obj ? __defProp$d(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;\nvar __spreadValues$d = (a, b) => {\n for (var prop in b || (b = {}))\n if (__hasOwnProp$f.call(b, prop))\n __defNormalProp$d(a, prop, b[prop]);\n if (__getOwnPropSymbols$f)\n for (var prop of __getOwnPropSymbols$f(b)) {\n if (__propIsEnum$f.call(b, prop))\n __defNormalProp$d(a, prop, b[prop]);\n }\n return a;\n};\nvar __spreadProps$7 = (a, b) => __defProps$7(a, __getOwnPropDescs$7(b));\nfunction useRefHistory(source, options = {}) {\n const {\n deep = false,\n flush = \"pre\",\n eventFilter\n } = options;\n const {\n eventFilter: composedFilter,\n pause,\n resume: resumeTracking,\n isActive: isTracking\n } = pausableFilter(eventFilter);\n const {\n ignoreUpdates,\n ignorePrevAsyncUpdates,\n stop\n } = ignorableWatch(source, commit, { deep, flush, eventFilter: composedFilter });\n function setSource(source2, value) {\n ignorePrevAsyncUpdates();\n ignoreUpdates(() => {\n source2.value = value;\n });\n }\n const manualHistory = useManualRefHistory(source, __spreadProps$7(__spreadValues$d({}, options), { clone: options.clone || deep, setSource }));\n const { clear, commit: manualCommit } = manualHistory;\n function commit() {\n ignorePrevAsyncUpdates();\n manualCommit();\n }\n function resume(commitNow) {\n resumeTracking();\n if (commitNow)\n commit();\n }\n function batch(fn) {\n let canceled = false;\n const cancel = () => canceled = true;\n ignoreUpdates(() => {\n fn(cancel);\n });\n if (!canceled)\n commit();\n }\n function dispose() {\n stop();\n clear();\n }\n return __spreadProps$7(__spreadValues$d({}, manualHistory), {\n isTracking,\n pause,\n resume,\n commit,\n batch,\n dispose\n });\n}\n\nvar __defProp$c = Object.defineProperty;\nvar __defProps$6 = Object.defineProperties;\nvar __getOwnPropDescs$6 = Object.getOwnPropertyDescriptors;\nvar __getOwnPropSymbols$e = Object.getOwnPropertySymbols;\nvar __hasOwnProp$e = Object.prototype.hasOwnProperty;\nvar __propIsEnum$e = Object.prototype.propertyIsEnumerable;\nvar __defNormalProp$c = (obj, key, value) => key in obj ? __defProp$c(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;\nvar __spreadValues$c = (a, b) => {\n for (var prop in b || (b = {}))\n if (__hasOwnProp$e.call(b, prop))\n __defNormalProp$c(a, prop, b[prop]);\n if (__getOwnPropSymbols$e)\n for (var prop of __getOwnPropSymbols$e(b)) {\n if (__propIsEnum$e.call(b, prop))\n __defNormalProp$c(a, prop, b[prop]);\n }\n return a;\n};\nvar __spreadProps$6 = (a, b) => __defProps$6(a, __getOwnPropDescs$6(b));\nfunction useDebouncedRefHistory(source, options = {}) {\n const filter = options.debounce ? debounceFilter(options.debounce) : void 0;\n const history = useRefHistory(source, __spreadProps$6(__spreadValues$c({}, options), { eventFilter: filter }));\n return __spreadValues$c({}, history);\n}\n\nfunction useDeviceMotion(options = {}) {\n const {\n window = defaultWindow,\n eventFilter = bypassFilter\n } = options;\n const acceleration = ref({ x: null, y: null, z: null });\n const rotationRate = ref({ alpha: null, beta: null, gamma: null });\n const interval = ref(0);\n const accelerationIncludingGravity = ref({\n x: null,\n y: null,\n z: null\n });\n if (window) {\n const onDeviceMotion = createFilterWrapper(eventFilter, (event) => {\n acceleration.value = event.acceleration;\n accelerationIncludingGravity.value = event.accelerationIncludingGravity;\n rotationRate.value = event.rotationRate;\n interval.value = event.interval;\n });\n useEventListener(window, \"devicemotion\", onDeviceMotion);\n }\n return {\n acceleration,\n accelerationIncludingGravity,\n rotationRate,\n interval\n };\n}\n\nfunction useDeviceOrientation(options = {}) {\n const { window = defaultWindow } = options;\n const isSupported = Boolean(window && \"DeviceOrientationEvent\" in window);\n const isAbsolute = ref(false);\n const alpha = ref(null);\n const beta = ref(null);\n const gamma = ref(null);\n if (window && isSupported) {\n useEventListener(window, \"deviceorientation\", (event) => {\n isAbsolute.value = event.absolute;\n alpha.value = event.alpha;\n beta.value = event.beta;\n gamma.value = event.gamma;\n });\n }\n return {\n isSupported,\n isAbsolute,\n alpha,\n beta,\n gamma\n };\n}\n\nconst DEVICE_PIXEL_RATIO_SCALES = [\n 1,\n 1.325,\n 1.4,\n 1.5,\n 1.8,\n 2,\n 2.4,\n 2.5,\n 2.75,\n 3,\n 3.5,\n 4\n];\nfunction useDevicePixelRatio({\n window = defaultWindow\n} = {}) {\n if (!window) {\n return {\n pixelRatio: ref(1)\n };\n }\n const pixelRatio = ref(window.devicePixelRatio);\n const handleDevicePixelRatio = () => {\n pixelRatio.value = window.devicePixelRatio;\n };\n useEventListener(window, \"resize\", handleDevicePixelRatio, { passive: true });\n DEVICE_PIXEL_RATIO_SCALES.forEach((dppx) => {\n const mqlMin = useMediaQuery(`screen and (min-resolution: ${dppx}dppx)`);\n const mqlMax = useMediaQuery(`screen and (max-resolution: ${dppx}dppx)`);\n watch([mqlMin, mqlMax], handleDevicePixelRatio);\n });\n return { pixelRatio };\n}\n\nfunction usePermission(permissionDesc, options = {}) {\n const {\n controls = false,\n navigator = defaultNavigator\n } = options;\n const isSupported = Boolean(navigator && \"permissions\" in navigator);\n let permissionStatus;\n const desc = typeof permissionDesc === \"string\" ? { name: permissionDesc } : permissionDesc;\n const state = ref();\n const onChange = () => {\n if (permissionStatus)\n state.value = permissionStatus.state;\n };\n const query = createSingletonPromise(async () => {\n if (!isSupported)\n return;\n if (!permissionStatus) {\n try {\n permissionStatus = await navigator.permissions.query(desc);\n useEventListener(permissionStatus, \"change\", onChange);\n onChange();\n } catch (e) {\n state.value = \"prompt\";\n }\n }\n return permissionStatus;\n });\n query();\n if (controls) {\n return {\n state,\n isSupported,\n query\n };\n } else {\n return state;\n }\n}\n\nfunction useDevicesList(options = {}) {\n const {\n navigator = defaultNavigator,\n requestPermissions = false,\n constraints = { audio: true, video: true },\n onUpdated\n } = options;\n const devices = ref([]);\n const videoInputs = computed(() => devices.value.filter((i) => i.kind === \"videoinput\"));\n const audioInputs = computed(() => devices.value.filter((i) => i.kind === \"audioinput\"));\n const audioOutputs = computed(() => devices.value.filter((i) => i.kind === \"audiooutput\"));\n let isSupported = false;\n const permissionGranted = ref(false);\n async function update() {\n if (!isSupported)\n return;\n devices.value = await navigator.mediaDevices.enumerateDevices();\n onUpdated == null ? void 0 : onUpdated(devices.value);\n }\n async function ensurePermissions() {\n if (!isSupported)\n return false;\n if (permissionGranted.value)\n return true;\n const { state, query } = usePermission(\"camera\", { controls: true });\n await query();\n if (state.value !== \"granted\") {\n const stream = await navigator.mediaDevices.getUserMedia(constraints);\n stream.getTracks().forEach((t) => t.stop());\n update();\n permissionGranted.value = true;\n } else {\n permissionGranted.value = true;\n }\n return permissionGranted.value;\n }\n if (navigator) {\n isSupported = Boolean(navigator.mediaDevices && navigator.mediaDevices.enumerateDevices);\n if (isSupported) {\n if (requestPermissions)\n ensurePermissions();\n useEventListener(navigator.mediaDevices, \"devicechange\", update);\n update();\n }\n }\n return {\n devices,\n ensurePermissions,\n permissionGranted,\n videoInputs,\n audioInputs,\n audioOutputs,\n isSupported\n };\n}\n\nfunction useDisplayMedia(options = {}) {\n var _a, _b;\n const enabled = ref((_a = options.enabled) != null ? _a : false);\n const video = options.video;\n const audio = options.audio;\n const { navigator = defaultNavigator } = options;\n const isSupported = Boolean((_b = navigator == null ? void 0 : navigator.mediaDevices) == null ? void 0 : _b.getDisplayMedia);\n const constraint = { audio, video };\n const stream = shallowRef();\n async function _start() {\n if (!isSupported || stream.value)\n return;\n stream.value = await navigator.mediaDevices.getDisplayMedia(constraint);\n return stream.value;\n }\n async function _stop() {\n var _a2;\n (_a2 = stream.value) == null ? void 0 : _a2.getTracks().forEach((t) => t.stop());\n stream.value = void 0;\n }\n function stop() {\n _stop();\n enabled.value = false;\n }\n async function start() {\n await _start();\n if (stream.value)\n enabled.value = true;\n return stream.value;\n }\n watch(enabled, (v) => {\n if (v)\n _start();\n else\n _stop();\n }, { immediate: true });\n return {\n isSupported,\n stream,\n start,\n stop,\n enabled\n };\n}\n\nfunction useDocumentVisibility({ document = defaultDocument } = {}) {\n if (!document)\n return ref(\"visible\");\n const visibility = ref(document.visibilityState);\n useEventListener(document, \"visibilitychange\", () => {\n visibility.value = document.visibilityState;\n });\n return visibility;\n}\n\nvar __defProp$b = Object.defineProperty;\nvar __defProps$5 = Object.defineProperties;\nvar __getOwnPropDescs$5 = Object.getOwnPropertyDescriptors;\nvar __getOwnPropSymbols$d = Object.getOwnPropertySymbols;\nvar __hasOwnProp$d = Object.prototype.hasOwnProperty;\nvar __propIsEnum$d = Object.prototype.propertyIsEnumerable;\nvar __defNormalProp$b = (obj, key, value) => key in obj ? __defProp$b(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;\nvar __spreadValues$b = (a, b) => {\n for (var prop in b || (b = {}))\n if (__hasOwnProp$d.call(b, prop))\n __defNormalProp$b(a, prop, b[prop]);\n if (__getOwnPropSymbols$d)\n for (var prop of __getOwnPropSymbols$d(b)) {\n if (__propIsEnum$d.call(b, prop))\n __defNormalProp$b(a, prop, b[prop]);\n }\n return a;\n};\nvar __spreadProps$5 = (a, b) => __defProps$5(a, __getOwnPropDescs$5(b));\nfunction useDraggable(target, options = {}) {\n var _a, _b;\n const draggingElement = (_a = options.draggingElement) != null ? _a : defaultWindow;\n const position = ref((_b = options.initialValue) != null ? _b : { x: 0, y: 0 });\n const pressedDelta = ref();\n const filterEvent = (e) => {\n if (options.pointerTypes)\n return options.pointerTypes.includes(e.pointerType);\n return true;\n };\n const preventDefault = (e) => {\n if (unref(options.preventDefault))\n e.preventDefault();\n };\n const start = (e) => {\n var _a2;\n if (!filterEvent(e))\n return;\n if (unref(options.exact) && e.target !== unref(target))\n return;\n const rect = unref(target).getBoundingClientRect();\n const pos = {\n x: e.pageX - rect.left,\n y: e.pageY - rect.top\n };\n if (((_a2 = options.onStart) == null ? void 0 : _a2.call(options, pos, e)) === false)\n return;\n pressedDelta.value = pos;\n preventDefault(e);\n };\n const move = (e) => {\n var _a2;\n if (!filterEvent(e))\n return;\n if (!pressedDelta.value)\n return;\n position.value = {\n x: e.pageX - pressedDelta.value.x,\n y: e.pageY - pressedDelta.value.y\n };\n (_a2 = options.onMove) == null ? void 0 : _a2.call(options, position.value, e);\n preventDefault(e);\n };\n const end = (e) => {\n var _a2;\n if (!filterEvent(e))\n return;\n if (!pressedDelta.value)\n return;\n pressedDelta.value = void 0;\n (_a2 = options.onEnd) == null ? void 0 : _a2.call(options, position.value, e);\n preventDefault(e);\n };\n if (isClient) {\n useEventListener(target, \"pointerdown\", start, true);\n useEventListener(draggingElement, \"pointermove\", move, true);\n useEventListener(draggingElement, \"pointerup\", end, true);\n }\n return __spreadProps$5(__spreadValues$b({}, toRefs(position)), {\n position,\n isDragging: computed(() => !!pressedDelta.value),\n style: computed(() => `left:${position.value.x}px;top:${position.value.y}px;`)\n });\n}\n\nvar __getOwnPropSymbols$c = Object.getOwnPropertySymbols;\nvar __hasOwnProp$c = Object.prototype.hasOwnProperty;\nvar __propIsEnum$c = Object.prototype.propertyIsEnumerable;\nvar __objRest$2 = (source, exclude) => {\n var target = {};\n for (var prop in source)\n if (__hasOwnProp$c.call(source, prop) && exclude.indexOf(prop) < 0)\n target[prop] = source[prop];\n if (source != null && __getOwnPropSymbols$c)\n for (var prop of __getOwnPropSymbols$c(source)) {\n if (exclude.indexOf(prop) < 0 && __propIsEnum$c.call(source, prop))\n target[prop] = source[prop];\n }\n return target;\n};\nfunction useResizeObserver(target, callback, options = {}) {\n const _a = options, { window = defaultWindow } = _a, observerOptions = __objRest$2(_a, [\"window\"]);\n let observer;\n const isSupported = window && \"ResizeObserver\" in window;\n const cleanup = () => {\n if (observer) {\n observer.disconnect();\n observer = void 0;\n }\n };\n const stopWatch = watch(() => unrefElement(target), (el) => {\n cleanup();\n if (isSupported && window && el) {\n observer = new window.ResizeObserver(callback);\n observer.observe(el, observerOptions);\n }\n }, { immediate: true, flush: \"post\" });\n const stop = () => {\n cleanup();\n stopWatch();\n };\n tryOnScopeDispose(stop);\n return {\n isSupported,\n stop\n };\n}\n\nfunction useElementBounding(target) {\n const height = ref(0);\n const bottom = ref(0);\n const left = ref(0);\n const right = ref(0);\n const top = ref(0);\n const width = ref(0);\n const x = ref(0);\n const y = ref(0);\n function update() {\n const el = unrefElement(target);\n if (!el) {\n height.value = 0;\n bottom.value = 0;\n left.value = 0;\n right.value = 0;\n top.value = 0;\n width.value = 0;\n x.value = 0;\n y.value = 0;\n return;\n }\n const rect = el.getBoundingClientRect();\n height.value = rect.height;\n bottom.value = rect.bottom;\n left.value = rect.left;\n right.value = rect.right;\n top.value = rect.top;\n width.value = rect.width;\n x.value = rect.x;\n y.value = rect.y;\n }\n useEventListener(\"scroll\", update, true);\n useResizeObserver(target, update);\n watch(() => unrefElement(target), (ele) => !ele && update());\n return {\n height,\n bottom,\n left,\n right,\n top,\n width,\n x,\n y,\n update\n };\n}\n\nfunction useRafFn(fn, options = {}) {\n const {\n immediate = true,\n window = defaultWindow\n } = options;\n const isActive = ref(false);\n function loop() {\n if (!isActive.value || !window)\n return;\n fn();\n window.requestAnimationFrame(loop);\n }\n function resume() {\n if (!isActive.value && window) {\n isActive.value = true;\n loop();\n }\n }\n function pause() {\n isActive.value = false;\n }\n if (immediate)\n resume();\n tryOnScopeDispose(pause);\n return {\n isActive,\n pause,\n resume\n };\n}\n\nvar __defProp$a = Object.defineProperty;\nvar __getOwnPropSymbols$b = Object.getOwnPropertySymbols;\nvar __hasOwnProp$b = Object.prototype.hasOwnProperty;\nvar __propIsEnum$b = Object.prototype.propertyIsEnumerable;\nvar __defNormalProp$a = (obj, key, value) => key in obj ? __defProp$a(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;\nvar __spreadValues$a = (a, b) => {\n for (var prop in b || (b = {}))\n if (__hasOwnProp$b.call(b, prop))\n __defNormalProp$a(a, prop, b[prop]);\n if (__getOwnPropSymbols$b)\n for (var prop of __getOwnPropSymbols$b(b)) {\n if (__propIsEnum$b.call(b, prop))\n __defNormalProp$a(a, prop, b[prop]);\n }\n return a;\n};\nfunction useElementByPoint(options) {\n const element = ref(null);\n const { x, y } = options;\n const controls = useRafFn(() => {\n element.value = document.elementFromPoint(unref(x), unref(y));\n });\n return __spreadValues$a({\n element\n }, controls);\n}\n\nfunction useElementHover(el) {\n const isHovered = ref(false);\n useEventListener(el, \"mouseenter\", () => isHovered.value = true);\n useEventListener(el, \"mouseleave\", () => isHovered.value = false);\n return isHovered;\n}\n\nfunction useElementSize(target, initialSize = { width: 0, height: 0 }, options = {}) {\n const width = ref(initialSize.width);\n const height = ref(initialSize.height);\n useResizeObserver(target, ([entry]) => {\n width.value = entry.contentRect.width;\n height.value = entry.contentRect.height;\n }, options);\n watch(() => unrefElement(target), (ele) => {\n width.value = ele ? initialSize.width : 0;\n height.value = ele ? initialSize.height : 0;\n });\n return {\n width,\n height\n };\n}\n\nfunction useElementVisibility(element, { window = defaultWindow, scrollTarget } = {}) {\n const elementIsVisible = ref(false);\n const testBounding = () => {\n if (!window)\n return;\n const document = window.document;\n if (!element.value) {\n elementIsVisible.value = false;\n } else {\n const rect = element.value.getBoundingClientRect();\n elementIsVisible.value = rect.top <= (window.innerHeight || document.documentElement.clientHeight) && rect.left <= (window.innerWidth || document.documentElement.clientWidth) && rect.bottom >= 0 && rect.right >= 0;\n }\n };\n tryOnMounted(testBounding);\n if (window)\n tryOnMounted(() => useEventListener((scrollTarget == null ? void 0 : scrollTarget.value) || window, \"scroll\", testBounding, { capture: false, passive: true }));\n return elementIsVisible;\n}\n\nconst events = /* @__PURE__ */ new Map();\n\nfunction useEventBus(key) {\n const scope = getCurrentScope();\n function on(listener) {\n const listeners = events.get(key) || [];\n listeners.push(listener);\n events.set(key, listeners);\n const _off = () => off(listener);\n scope == null ? void 0 : scope.cleanups.push(_off);\n return _off;\n }\n function once(listener) {\n function _listener(...args) {\n off(_listener);\n listener(...args);\n }\n return on(_listener);\n }\n function off(listener) {\n const listeners = events.get(key);\n if (!listeners)\n return;\n const index = listeners.indexOf(listener);\n if (index > -1)\n listeners.splice(index, 1);\n if (!listeners.length)\n events.delete(key);\n }\n function reset() {\n events.delete(key);\n }\n function emit(event, payload) {\n var _a;\n (_a = events.get(key)) == null ? void 0 : _a.forEach((v) => v(event, payload));\n }\n return { on, once, off, emit, reset };\n}\n\nfunction useEventSource(url, events = [], options = {}) {\n const event = ref(null);\n const data = ref(null);\n const status = ref(\"CONNECTING\");\n const eventSource = ref(null);\n const error = ref(null);\n const {\n withCredentials = false\n } = options;\n const close = () => {\n if (eventSource.value) {\n eventSource.value.close();\n eventSource.value = null;\n status.value = \"CLOSED\";\n }\n };\n const es = new EventSource(url, { withCredentials });\n eventSource.value = es;\n es.onopen = () => {\n status.value = \"OPEN\";\n error.value = null;\n };\n es.onerror = (e) => {\n status.value = \"CLOSED\";\n error.value = e;\n };\n es.onmessage = (e) => {\n event.value = null;\n data.value = e.data;\n };\n for (const event_name of events) {\n useEventListener(es, event_name, (e) => {\n event.value = event_name;\n data.value = e.data || null;\n });\n }\n tryOnScopeDispose(() => {\n close();\n });\n return {\n eventSource,\n event,\n data,\n status,\n error,\n close\n };\n}\n\nfunction useEyeDropper(options = {}) {\n const { initialValue = \"\" } = options;\n const isSupported = Boolean(typeof window !== \"undefined\" && \"EyeDropper\" in window);\n const sRGBHex = ref(initialValue);\n async function open(openOptions) {\n if (!isSupported)\n return;\n const eyeDropper = new window.EyeDropper();\n const result = await eyeDropper.open(openOptions);\n sRGBHex.value = result.sRGBHex;\n return result;\n }\n return { isSupported, sRGBHex, open };\n}\n\nfunction useFavicon(newIcon = null, options = {}) {\n const {\n baseUrl = \"\",\n rel = \"icon\",\n document = defaultDocument\n } = options;\n const favicon = isRef(newIcon) ? newIcon : ref(newIcon);\n const applyIcon = (icon) => {\n document == null ? void 0 : document.head.querySelectorAll(`link[rel*=\"${rel}\"]`).forEach((el) => el.href = `${baseUrl}${icon}`);\n };\n watch(favicon, (i, o) => {\n if (isString(i) && i !== o)\n applyIcon(i);\n }, { immediate: true });\n return favicon;\n}\n\nvar __defProp$9 = Object.defineProperty;\nvar __defProps$4 = Object.defineProperties;\nvar __getOwnPropDescs$4 = Object.getOwnPropertyDescriptors;\nvar __getOwnPropSymbols$a = Object.getOwnPropertySymbols;\nvar __hasOwnProp$a = Object.prototype.hasOwnProperty;\nvar __propIsEnum$a = Object.prototype.propertyIsEnumerable;\nvar __defNormalProp$9 = (obj, key, value) => key in obj ? __defProp$9(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;\nvar __spreadValues$9 = (a, b) => {\n for (var prop in b || (b = {}))\n if (__hasOwnProp$a.call(b, prop))\n __defNormalProp$9(a, prop, b[prop]);\n if (__getOwnPropSymbols$a)\n for (var prop of __getOwnPropSymbols$a(b)) {\n if (__propIsEnum$a.call(b, prop))\n __defNormalProp$9(a, prop, b[prop]);\n }\n return a;\n};\nvar __spreadProps$4 = (a, b) => __defProps$4(a, __getOwnPropDescs$4(b));\nconst payloadMapping = {\n json: \"application/json\",\n text: \"text/plain\",\n formData: \"multipart/form-data\"\n};\nfunction isFetchOptions(obj) {\n return containsProp(obj, \"immediate\", \"refetch\", \"initialData\", \"timeout\", \"beforeFetch\", \"afterFetch\", \"onFetchError\");\n}\nfunction headersToObject(headers) {\n if (headers instanceof Headers)\n return Object.fromEntries([...headers.entries()]);\n return headers;\n}\nfunction createFetch(config = {}) {\n const _options = config.options || {};\n const _fetchOptions = config.fetchOptions || {};\n function useFactoryFetch(url, ...args) {\n const computedUrl = computed(() => config.baseUrl ? joinPaths(unref(config.baseUrl), unref(url)) : unref(url));\n let options = _options;\n let fetchOptions = _fetchOptions;\n if (args.length > 0) {\n if (isFetchOptions(args[0])) {\n options = __spreadValues$9(__spreadValues$9({}, options), args[0]);\n } else {\n fetchOptions = __spreadProps$4(__spreadValues$9(__spreadValues$9({}, fetchOptions), args[0]), {\n headers: __spreadValues$9(__spreadValues$9({}, headersToObject(fetchOptions.headers) || {}), headersToObject(args[0].headers) || {})\n });\n }\n }\n if (args.length > 1 && isFetchOptions(args[1]))\n options = __spreadValues$9(__spreadValues$9({}, options), args[1]);\n return useFetch(computedUrl, fetchOptions, options);\n }\n return useFactoryFetch;\n}\nfunction useFetch(url, ...args) {\n var _a;\n const supportsAbort = typeof AbortController === \"function\";\n let fetchOptions = {};\n let options = { immediate: true, refetch: false, timeout: 0 };\n const config = {\n method: \"get\",\n type: \"text\",\n payload: void 0\n };\n if (args.length > 0) {\n if (isFetchOptions(args[0]))\n options = __spreadValues$9(__spreadValues$9({}, options), args[0]);\n else\n fetchOptions = args[0];\n }\n if (args.length > 1) {\n if (isFetchOptions(args[1]))\n options = __spreadValues$9(__spreadValues$9({}, options), args[1]);\n }\n const {\n fetch = (_a = defaultWindow) == null ? void 0 : _a.fetch,\n initialData,\n timeout\n } = options;\n const responseEvent = createEventHook();\n const errorEvent = createEventHook();\n const finallyEvent = createEventHook();\n const isFinished = ref(false);\n const isFetching = ref(false);\n const aborted = ref(false);\n const statusCode = ref(null);\n const response = shallowRef(null);\n const error = shallowRef(null);\n const data = shallowRef(initialData);\n const canAbort = computed(() => supportsAbort && isFetching.value);\n let controller;\n let timer;\n const abort = () => {\n if (supportsAbort && controller)\n controller.abort();\n };\n const loading = (isLoading) => {\n isFetching.value = isLoading;\n isFinished.value = !isLoading;\n };\n if (timeout)\n timer = useTimeoutFn(abort, timeout, { immediate: false });\n const execute = async (throwOnFailed = false) => {\n var _a2;\n loading(true);\n error.value = null;\n statusCode.value = null;\n aborted.value = false;\n controller = void 0;\n if (supportsAbort) {\n controller = new AbortController();\n controller.signal.onabort = () => aborted.value = true;\n fetchOptions = __spreadProps$4(__spreadValues$9({}, fetchOptions), {\n signal: controller.signal\n });\n }\n const defaultFetchOptions = {\n method: config.method,\n headers: {}\n };\n if (config.payload) {\n const headers = headersToObject(defaultFetchOptions.headers);\n if (config.payloadType)\n headers[\"Content-Type\"] = (_a2 = payloadMapping[config.payloadType]) != null ? _a2 : config.payloadType;\n defaultFetchOptions.body = config.payloadType === \"json\" ? JSON.stringify(unref(config.payload)) : unref(config.payload);\n }\n let isCanceled = false;\n const context = { url: unref(url), options: fetchOptions, cancel: () => {\n isCanceled = true;\n } };\n if (options.beforeFetch)\n Object.assign(context, await options.beforeFetch(context));\n if (isCanceled || !fetch) {\n loading(false);\n return Promise.resolve(null);\n }\n let responseData = null;\n if (timer)\n timer.start();\n return new Promise((resolve, reject) => {\n var _a3;\n fetch(context.url, __spreadProps$4(__spreadValues$9(__spreadValues$9({}, defaultFetchOptions), context.options), {\n headers: __spreadValues$9(__spreadValues$9({}, headersToObject(defaultFetchOptions.headers)), headersToObject((_a3 = context.options) == null ? void 0 : _a3.headers))\n })).then(async (fetchResponse) => {\n response.value = fetchResponse;\n statusCode.value = fetchResponse.status;\n responseData = await fetchResponse[config.type]();\n if (options.afterFetch && statusCode.value >= 200 && statusCode.value < 300)\n ({ data: responseData } = await options.afterFetch({ data: responseData, response: fetchResponse }));\n data.value = responseData;\n if (!fetchResponse.ok)\n throw new Error(fetchResponse.statusText);\n responseEvent.trigger(fetchResponse);\n return resolve(fetchResponse);\n }).catch(async (fetchError) => {\n let errorData = fetchError.message || fetchError.name;\n if (options.onFetchError)\n ({ data: responseData, error: errorData } = await options.onFetchError({ data: responseData, error: fetchError }));\n data.value = responseData;\n error.value = errorData;\n errorEvent.trigger(fetchError);\n if (throwOnFailed)\n return reject(fetchError);\n return resolve(null);\n }).finally(() => {\n loading(false);\n if (timer)\n timer.stop();\n finallyEvent.trigger(null);\n });\n });\n };\n watch(() => [\n unref(url),\n unref(options.refetch)\n ], () => unref(options.refetch) && execute(), { deep: true });\n const shell = {\n isFinished,\n statusCode,\n response,\n error,\n data,\n isFetching,\n canAbort,\n aborted,\n abort,\n execute,\n onFetchResponse: responseEvent.on,\n onFetchError: errorEvent.on,\n onFetchFinally: finallyEvent.on,\n get: setMethod(\"get\"),\n put: setMethod(\"put\"),\n post: setMethod(\"post\"),\n delete: setMethod(\"delete\"),\n patch: setMethod(\"patch\"),\n head: setMethod(\"head\"),\n options: setMethod(\"options\"),\n json: setType(\"json\"),\n text: setType(\"text\"),\n blob: setType(\"blob\"),\n arrayBuffer: setType(\"arrayBuffer\"),\n formData: setType(\"formData\")\n };\n function setMethod(method) {\n return (payload, payloadType) => {\n if (!isFetching.value) {\n config.method = method;\n config.payload = payload;\n config.payloadType = payloadType;\n if (isRef(config.payload)) {\n watch(() => [\n unref(config.payload),\n unref(options.refetch)\n ], () => unref(options.refetch) && execute(), { deep: true });\n }\n if (!payloadType && unref(payload) && Object.getPrototypeOf(unref(payload)) === Object.prototype)\n config.payloadType = \"json\";\n return shell;\n }\n return void 0;\n };\n }\n function waitUntilFinished() {\n return new Promise((resolve, reject) => {\n until(isFinished).toBe(true).then(() => resolve(shell)).catch((error2) => reject(error2));\n });\n }\n function setType(type) {\n return () => {\n if (!isFetching.value) {\n config.type = type;\n return __spreadProps$4(__spreadValues$9({}, shell), {\n then(onFulfilled, onRejected) {\n return waitUntilFinished().then(onFulfilled, onRejected);\n }\n });\n }\n return void 0;\n };\n }\n if (options.immediate)\n setTimeout(execute, 0);\n return __spreadProps$4(__spreadValues$9({}, shell), {\n then(onFulfilled, onRejected) {\n return waitUntilFinished().then(onFulfilled, onRejected);\n }\n });\n}\nfunction joinPaths(start, end) {\n if (!start.endsWith(\"/\") && !end.startsWith(\"/\"))\n return `${start}/${end}`;\n return `${start}${end}`;\n}\n\nfunction useFocus(options = {}) {\n const {\n initialValue = false\n } = options;\n const activeElement = useActiveElement(options);\n const target = computed(() => unrefElement(options.target));\n const focused = computed({\n get() {\n return activeElement.value === target.value;\n },\n set(value) {\n var _a, _b;\n if (!value && focused.value)\n (_a = target.value) == null ? void 0 : _a.blur();\n if (value && !focused.value)\n (_b = target.value) == null ? void 0 : _b.focus();\n }\n });\n watch(target, () => {\n focused.value = initialValue;\n }, { immediate: true, flush: \"post\" });\n return { focused };\n}\n\nfunction useFocusWithin(target, options = {}) {\n const activeElement = useActiveElement(options);\n const targetElement = computed(() => unrefElement(target));\n const focused = computed(() => targetElement.value && activeElement.value ? targetElement.value.contains(activeElement.value) : false);\n return { focused };\n}\n\nfunction useFps(options) {\n var _a;\n const fps = ref(0);\n if (typeof performance === \"undefined\")\n return fps;\n const every = (_a = options == null ? void 0 : options.every) != null ? _a : 10;\n let last = performance.now();\n let ticks = 0;\n useRafFn(() => {\n ticks += 1;\n if (ticks >= every) {\n const now = performance.now();\n const diff = now - last;\n fps.value = Math.round(1e3 / (diff / ticks));\n last = now;\n ticks = 0;\n }\n });\n return fps;\n}\n\nconst functionsMap = [\n [\n \"requestFullscreen\",\n \"exitFullscreen\",\n \"fullscreenElement\",\n \"fullscreenEnabled\",\n \"fullscreenchange\",\n \"fullscreenerror\"\n ],\n [\n \"webkitRequestFullscreen\",\n \"webkitExitFullscreen\",\n \"webkitFullscreenElement\",\n \"webkitFullscreenEnabled\",\n \"webkitfullscreenchange\",\n \"webkitfullscreenerror\"\n ],\n [\n \"webkitRequestFullScreen\",\n \"webkitCancelFullScreen\",\n \"webkitCurrentFullScreenElement\",\n \"webkitCancelFullScreen\",\n \"webkitfullscreenchange\",\n \"webkitfullscreenerror\"\n ],\n [\n \"mozRequestFullScreen\",\n \"mozCancelFullScreen\",\n \"mozFullScreenElement\",\n \"mozFullScreenEnabled\",\n \"mozfullscreenchange\",\n \"mozfullscreenerror\"\n ],\n [\n \"msRequestFullscreen\",\n \"msExitFullscreen\",\n \"msFullscreenElement\",\n \"msFullscreenEnabled\",\n \"MSFullscreenChange\",\n \"MSFullscreenError\"\n ]\n];\nfunction useFullscreen(target, options = {}) {\n const { document = defaultDocument, autoExit = false } = options;\n const targetRef = target || (document == null ? void 0 : document.querySelector(\"html\"));\n const isFullscreen = ref(false);\n let isSupported = false;\n let map = functionsMap[0];\n if (!document) {\n isSupported = false;\n } else {\n for (const m of functionsMap) {\n if (m[1] in document) {\n map = m;\n isSupported = true;\n break;\n }\n }\n }\n const [REQUEST, EXIT, ELEMENT, , EVENT] = map;\n async function exit() {\n if (!isSupported)\n return;\n if (document == null ? void 0 : document[ELEMENT])\n await document[EXIT]();\n isFullscreen.value = false;\n }\n async function enter() {\n if (!isSupported)\n return;\n await exit();\n const target2 = unrefElement(targetRef);\n if (target2) {\n await target2[REQUEST]();\n isFullscreen.value = true;\n }\n }\n async function toggle() {\n if (isFullscreen.value)\n await exit();\n else\n await enter();\n }\n if (document) {\n useEventListener(document, EVENT, () => {\n isFullscreen.value = !!(document == null ? void 0 : document[ELEMENT]);\n }, false);\n }\n if (autoExit)\n tryOnScopeDispose(exit);\n return {\n isSupported,\n isFullscreen,\n enter,\n exit,\n toggle\n };\n}\n\nfunction useGeolocation(options = {}) {\n const {\n enableHighAccuracy = true,\n maximumAge = 3e4,\n timeout = 27e3,\n navigator = defaultNavigator\n } = options;\n const isSupported = navigator && \"geolocation\" in navigator;\n const locatedAt = ref(null);\n const error = ref(null);\n const coords = ref({\n accuracy: 0,\n latitude: Infinity,\n longitude: Infinity,\n altitude: null,\n altitudeAccuracy: null,\n heading: null,\n speed: null\n });\n function updatePosition(position) {\n locatedAt.value = position.timestamp;\n coords.value = position.coords;\n error.value = null;\n }\n let watcher;\n if (isSupported) {\n watcher = navigator.geolocation.watchPosition(updatePosition, (err) => error.value = err, {\n enableHighAccuracy,\n maximumAge,\n timeout\n });\n }\n tryOnScopeDispose(() => {\n if (watcher && navigator)\n navigator.geolocation.clearWatch(watcher);\n });\n return {\n isSupported,\n coords,\n locatedAt,\n error\n };\n}\n\nconst defaultEvents$1 = [\"mousemove\", \"mousedown\", \"resize\", \"keydown\", \"touchstart\", \"wheel\"];\nconst oneMinute = 6e4;\nfunction useIdle(timeout = oneMinute, options = {}) {\n const {\n initialState = false,\n listenForVisibilityChange = true,\n events = defaultEvents$1,\n window = defaultWindow,\n eventFilter = throttleFilter(50)\n } = options;\n const idle = ref(initialState);\n const lastActive = ref(timestamp());\n let timer;\n const onEvent = createFilterWrapper(eventFilter, () => {\n idle.value = false;\n lastActive.value = timestamp();\n clearTimeout(timer);\n timer = setTimeout(() => idle.value = true, timeout);\n });\n if (window) {\n const document = window.document;\n for (const event of events)\n useEventListener(window, event, onEvent, { passive: true });\n if (listenForVisibilityChange) {\n useEventListener(document, \"visibilitychange\", () => {\n if (!document.hidden)\n onEvent();\n });\n }\n }\n timer = setTimeout(() => idle.value = true, timeout);\n return { idle, lastActive };\n}\n\nfunction useScroll(element, options = {}) {\n const {\n throttle = 0,\n idle = 200,\n onStop = noop,\n onScroll = noop,\n offset = {\n left: 0,\n right: 0,\n top: 0,\n bottom: 0\n },\n eventListenerOptions = {\n capture: false,\n passive: true\n }\n } = options;\n const x = ref(0);\n const y = ref(0);\n const isScrolling = ref(false);\n const arrivedState = reactive({\n left: true,\n right: false,\n top: true,\n bottom: false\n });\n const directions = reactive({\n left: false,\n right: false,\n top: false,\n bottom: false\n });\n if (element) {\n const onScrollEnd = useDebounceFn((e) => {\n isScrolling.value = false;\n directions.left = false;\n directions.right = false;\n directions.top = false;\n directions.bottom = false;\n onStop(e);\n }, throttle + idle);\n const onScrollHandler = (e) => {\n const eventTarget = e.target === document ? e.target.documentElement : e.target;\n const scrollLeft = eventTarget.scrollLeft;\n directions.left = scrollLeft < x.value;\n directions.right = scrollLeft > x.value;\n arrivedState.left = scrollLeft <= 0 + (offset.left || 0);\n arrivedState.right = scrollLeft + eventTarget.clientWidth >= eventTarget.scrollWidth - (offset.right || 0);\n x.value = scrollLeft;\n const scrollTop = eventTarget.scrollTop;\n directions.top = scrollTop < y.value;\n directions.bottom = scrollTop > y.value;\n arrivedState.top = scrollTop <= 0 + (offset.top || 0);\n arrivedState.bottom = scrollTop + eventTarget.clientHeight >= eventTarget.scrollHeight - (offset.bottom || 0);\n y.value = scrollTop;\n isScrolling.value = true;\n onScrollEnd(e);\n onScroll(e);\n };\n useEventListener(element, \"scroll\", throttle ? useThrottleFn(onScrollHandler, throttle) : onScrollHandler, eventListenerOptions);\n }\n return {\n x,\n y,\n isScrolling,\n arrivedState,\n directions\n };\n}\n\nvar __defProp$8 = Object.defineProperty;\nvar __defProps$3 = Object.defineProperties;\nvar __getOwnPropDescs$3 = Object.getOwnPropertyDescriptors;\nvar __getOwnPropSymbols$9 = Object.getOwnPropertySymbols;\nvar __hasOwnProp$9 = Object.prototype.hasOwnProperty;\nvar __propIsEnum$9 = Object.prototype.propertyIsEnumerable;\nvar __defNormalProp$8 = (obj, key, value) => key in obj ? __defProp$8(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;\nvar __spreadValues$8 = (a, b) => {\n for (var prop in b || (b = {}))\n if (__hasOwnProp$9.call(b, prop))\n __defNormalProp$8(a, prop, b[prop]);\n if (__getOwnPropSymbols$9)\n for (var prop of __getOwnPropSymbols$9(b)) {\n if (__propIsEnum$9.call(b, prop))\n __defNormalProp$8(a, prop, b[prop]);\n }\n return a;\n};\nvar __spreadProps$3 = (a, b) => __defProps$3(a, __getOwnPropDescs$3(b));\nfunction useInfiniteScroll(element, onLoadMore, options = {}) {\n var _a;\n const state = reactive(useScroll(element, __spreadProps$3(__spreadValues$8({}, options), {\n offset: __spreadValues$8({\n bottom: (_a = options.distance) != null ? _a : 0\n }, options.offset)\n })));\n watch(() => state.arrivedState.bottom, (v) => {\n if (v)\n onLoadMore(state);\n });\n}\n\nfunction useIntersectionObserver(target, callback, options = {}) {\n const {\n root,\n rootMargin = \"0px\",\n threshold = 0.1,\n window = defaultWindow\n } = options;\n const isSupported = window && \"IntersectionObserver\" in window;\n let cleanup = noop;\n const stopWatch = isSupported ? watch(() => ({\n el: unrefElement(target),\n root: unrefElement(root)\n }), ({ el, root: root2 }) => {\n cleanup();\n if (!el)\n return;\n const observer = new window.IntersectionObserver(callback, {\n root: root2,\n rootMargin,\n threshold\n });\n observer.observe(el);\n cleanup = () => {\n observer.disconnect();\n cleanup = noop;\n };\n }, { immediate: true, flush: \"post\" }) : noop;\n const stop = () => {\n cleanup();\n stopWatch();\n };\n tryOnScopeDispose(stop);\n return {\n isSupported,\n stop\n };\n}\n\nconst defaultEvents = [\"mousedown\", \"mouseup\", \"keydown\", \"keyup\"];\nfunction useKeyModifier(modifier, options = {}) {\n const {\n events = defaultEvents,\n document = defaultDocument,\n initial = null\n } = options;\n const state = ref(initial);\n if (document) {\n events.forEach((listenerEvent) => {\n useEventListener(document, listenerEvent, (evt) => {\n state.value = evt.getModifierState(modifier);\n });\n });\n }\n return state;\n}\n\nfunction useLocalStorage(key, initialValue, options = {}) {\n const { window = defaultWindow } = options;\n return useStorage(key, initialValue, window == null ? void 0 : window.localStorage, options);\n}\n\nconst DefaultMagicKeysAliasMap = {\n ctrl: \"control\",\n command: \"meta\",\n cmd: \"meta\",\n option: \"alt\",\n up: \"arrowup\",\n down: \"arrowdown\",\n left: \"arrowleft\",\n right: \"arrowright\"\n};\n\nfunction useMagicKeys(options = {}) {\n const {\n reactive: useReactive = false,\n target = defaultWindow,\n aliasMap = DefaultMagicKeysAliasMap,\n passive = true,\n onEventFired = noop\n } = options;\n const current = reactive(/* @__PURE__ */ new Set());\n const obj = { toJSON() {\n return {};\n }, current };\n const refs = useReactive ? reactive(obj) : obj;\n function updateRefs(e, value) {\n var _a, _b;\n const key = (_a = e.key) == null ? void 0 : _a.toLowerCase();\n const code = (_b = e.code) == null ? void 0 : _b.toLowerCase();\n const values = [code, key].filter(Boolean);\n if (code) {\n if (value)\n current.add(e.code);\n else\n current.delete(e.code);\n }\n for (const key2 of values) {\n if (key2 in refs) {\n if (useReactive)\n refs[key2] = value;\n else\n refs[key2].value = value;\n }\n }\n }\n if (target) {\n useEventListener(target, \"keydown\", (e) => {\n updateRefs(e, true);\n return onEventFired(e);\n }, { passive });\n useEventListener(target, \"keyup\", (e) => {\n updateRefs(e, false);\n return onEventFired(e);\n }, { passive });\n }\n const proxy = new Proxy(refs, {\n get(target2, prop, rec) {\n if (typeof prop !== \"string\")\n return Reflect.get(target2, prop, rec);\n prop = prop.toLowerCase();\n if (prop in aliasMap)\n prop = aliasMap[prop];\n if (!(prop in refs)) {\n if (/[+_-]/.test(prop)) {\n const keys = prop.split(/[+_-]/g).map((i) => i.trim());\n refs[prop] = computed(() => keys.every((key) => unref(proxy[key])));\n } else {\n refs[prop] = ref(false);\n }\n }\n const r = Reflect.get(target2, prop, rec);\n return useReactive ? unref(r) : r;\n }\n });\n return proxy;\n}\n\nvar __defProp$7 = Object.defineProperty;\nvar __getOwnPropSymbols$8 = Object.getOwnPropertySymbols;\nvar __hasOwnProp$8 = Object.prototype.hasOwnProperty;\nvar __propIsEnum$8 = Object.prototype.propertyIsEnumerable;\nvar __defNormalProp$7 = (obj, key, value) => key in obj ? __defProp$7(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;\nvar __spreadValues$7 = (a, b) => {\n for (var prop in b || (b = {}))\n if (__hasOwnProp$8.call(b, prop))\n __defNormalProp$7(a, prop, b[prop]);\n if (__getOwnPropSymbols$8)\n for (var prop of __getOwnPropSymbols$8(b)) {\n if (__propIsEnum$8.call(b, prop))\n __defNormalProp$7(a, prop, b[prop]);\n }\n return a;\n};\nfunction usingElRef(source, cb) {\n if (unref(source))\n cb(unref(source));\n}\nfunction timeRangeToArray(timeRanges) {\n let ranges = [];\n for (let i = 0; i < timeRanges.length; ++i)\n ranges = [...ranges, [timeRanges.start(i), timeRanges.end(i)]];\n return ranges;\n}\nfunction tracksToArray(tracks) {\n return Array.from(tracks).map(({ label, kind, language, mode, activeCues, cues, inBandMetadataTrackDispatchType }, id) => ({ id, label, kind, language, mode, activeCues, cues, inBandMetadataTrackDispatchType }));\n}\nconst defaultOptions = {\n src: \"\",\n tracks: []\n};\nfunction useMediaControls(target, options = {}) {\n options = __spreadValues$7(__spreadValues$7({}, defaultOptions), options);\n const {\n document = defaultDocument\n } = options;\n const currentTime = ref(0);\n const duration = ref(0);\n const seeking = ref(false);\n const volume = ref(1);\n const waiting = ref(false);\n const ended = ref(false);\n const playing = ref(false);\n const rate = ref(1);\n const stalled = ref(false);\n const buffered = ref([]);\n const tracks = ref([]);\n const selectedTrack = ref(-1);\n const isPictureInPicture = ref(false);\n const muted = ref(false);\n const supportsPictureInPicture = document && \"pictureInPictureEnabled\" in document;\n const sourceErrorEvent = createEventHook();\n const disableTrack = (track) => {\n usingElRef(target, (el) => {\n if (track) {\n const id = isNumber(track) ? track : track.id;\n el.textTracks[id].mode = \"disabled\";\n } else {\n for (let i = 0; i < el.textTracks.length; ++i)\n el.textTracks[i].mode = \"disabled\";\n }\n selectedTrack.value = -1;\n });\n };\n const enableTrack = (track, disableTracks = true) => {\n usingElRef(target, (el) => {\n const id = isNumber(track) ? track : track.id;\n if (disableTracks)\n disableTrack();\n el.textTracks[id].mode = \"showing\";\n selectedTrack.value = id;\n });\n };\n const togglePictureInPicture = () => {\n return new Promise((resolve, reject) => {\n usingElRef(target, async (el) => {\n if (supportsPictureInPicture) {\n if (!isPictureInPicture.value) {\n el.requestPictureInPicture().then(resolve).catch(reject);\n } else {\n document.exitPictureInPicture().then(resolve).catch(reject);\n }\n }\n });\n });\n };\n watchEffect(() => {\n if (!document)\n return;\n const el = unref(target);\n if (!el)\n return;\n const src = unref(options.src);\n let sources = [];\n if (!src)\n return;\n if (isString(src))\n sources = [{ src }];\n else if (Array.isArray(src))\n sources = src;\n else if (isObject(src))\n sources = [src];\n el.querySelectorAll(\"source\").forEach((e) => {\n e.removeEventListener(\"error\", sourceErrorEvent.trigger);\n e.remove();\n });\n sources.forEach(({ src: src2, type }) => {\n const source = document.createElement(\"source\");\n source.setAttribute(\"src\", src2);\n source.setAttribute(\"type\", type || \"\");\n source.addEventListener(\"error\", sourceErrorEvent.trigger);\n el.appendChild(source);\n });\n el.load();\n });\n tryOnScopeDispose(() => {\n const el = unref(target);\n if (!el)\n return;\n el.querySelectorAll(\"source\").forEach((e) => e.removeEventListener(\"error\", sourceErrorEvent.trigger));\n });\n watch(volume, (vol) => {\n const el = unref(target);\n if (!el)\n return;\n el.volume = vol;\n });\n watch(muted, (mute) => {\n const el = unref(target);\n if (!el)\n return;\n el.muted = mute;\n });\n watch(rate, (rate2) => {\n const el = unref(target);\n if (!el)\n return;\n el.playbackRate = rate2;\n });\n watchEffect(() => {\n if (!document)\n return;\n const textTracks = unref(options.tracks);\n const el = unref(target);\n if (!textTracks || !textTracks.length || !el)\n return;\n el.querySelectorAll(\"track\").forEach((e) => e.remove());\n textTracks.forEach(({ default: isDefault, kind, label, src, srcLang }, i) => {\n const track = document.createElement(\"track\");\n track.default = isDefault || false;\n track.kind = kind;\n track.label = label;\n track.src = src;\n track.srclang = srcLang;\n if (track.default)\n selectedTrack.value = i;\n el.appendChild(track);\n });\n });\n const { ignoreUpdates: ignoreCurrentTimeUpdates } = ignorableWatch(currentTime, (time) => {\n const el = unref(target);\n if (!el)\n return;\n el.currentTime = time;\n });\n const { ignoreUpdates: ignorePlayingUpdates } = ignorableWatch(playing, (isPlaying) => {\n const el = unref(target);\n if (!el)\n return;\n isPlaying ? el.play() : el.pause();\n });\n useEventListener(target, \"timeupdate\", () => ignoreCurrentTimeUpdates(() => currentTime.value = unref(target).currentTime));\n useEventListener(target, \"durationchange\", () => duration.value = unref(target).duration);\n useEventListener(target, \"progress\", () => buffered.value = timeRangeToArray(unref(target).buffered));\n useEventListener(target, \"seeking\", () => seeking.value = true);\n useEventListener(target, \"seeked\", () => seeking.value = false);\n useEventListener(target, \"waiting\", () => waiting.value = true);\n useEventListener(target, \"playing\", () => waiting.value = false);\n useEventListener(target, \"ratechange\", () => rate.value = unref(target).playbackRate);\n useEventListener(target, \"stalled\", () => stalled.value = true);\n useEventListener(target, \"ended\", () => ended.value = true);\n useEventListener(target, \"pause\", () => ignorePlayingUpdates(() => playing.value = false));\n useEventListener(target, \"play\", () => ignorePlayingUpdates(() => playing.value = true));\n useEventListener(target, \"enterpictureinpicture\", () => isPictureInPicture.value = true);\n useEventListener(target, \"leavepictureinpicture\", () => isPictureInPicture.value = false);\n useEventListener(target, \"volumechange\", () => {\n const el = unref(target);\n if (!el)\n return;\n volume.value = el.volume;\n muted.value = el.muted;\n });\n const listeners = [];\n const stop = watch([target], () => {\n const el = unref(target);\n if (!el)\n return;\n stop();\n listeners[0] = useEventListener(el.textTracks, \"addtrack\", () => tracks.value = tracksToArray(el.textTracks));\n listeners[1] = useEventListener(el.textTracks, \"removetrack\", () => tracks.value = tracksToArray(el.textTracks));\n listeners[2] = useEventListener(el.textTracks, \"change\", () => tracks.value = tracksToArray(el.textTracks));\n });\n tryOnScopeDispose(() => listeners.forEach((listener) => listener()));\n return {\n currentTime,\n duration,\n waiting,\n seeking,\n ended,\n stalled,\n buffered,\n playing,\n rate,\n volume,\n muted,\n tracks,\n selectedTrack,\n enableTrack,\n disableTrack,\n supportsPictureInPicture,\n togglePictureInPicture,\n isPictureInPicture,\n onSourceError: sourceErrorEvent.on\n };\n}\n\nconst getMapVue2Compat = () => {\n const data = reactive({});\n return {\n get: (key) => data[key],\n set: (key, value) => set(data, key, value),\n has: (key) => Object.prototype.hasOwnProperty.call(data, key),\n delete: (key) => del(data, key),\n clear: () => {\n Object.keys(data).forEach((key) => {\n del(data, key);\n });\n }\n };\n};\nfunction useMemoize(resolver, options) {\n const initCache = () => {\n if (options == null ? void 0 : options.cache)\n return reactive(options.cache);\n if (isVue2)\n return getMapVue2Compat();\n return reactive(/* @__PURE__ */ new Map());\n };\n const cache = initCache();\n const generateKey = (...args) => (options == null ? void 0 : options.getKey) ? options.getKey(...args) : JSON.stringify(args);\n const _loadData = (key, ...args) => {\n cache.set(key, resolver(...args));\n return cache.get(key);\n };\n const loadData = (...args) => _loadData(generateKey(...args), ...args);\n const deleteData = (...args) => {\n cache.delete(generateKey(...args));\n };\n const clearData = () => {\n cache.clear();\n };\n const memoized = (...args) => {\n const key = generateKey(...args);\n if (cache.has(key))\n return cache.get(key);\n return _loadData(key, ...args);\n };\n memoized.load = loadData;\n memoized.delete = deleteData;\n memoized.clear = clearData;\n memoized.generateKey = generateKey;\n memoized.cache = cache;\n return memoized;\n}\n\nfunction useMemory(options = {}) {\n const memory = ref();\n const isSupported = typeof performance !== \"undefined\" && \"memory\" in performance;\n if (isSupported) {\n const { interval = 1e3 } = options;\n useIntervalFn(() => {\n memory.value = performance.memory;\n }, interval, { immediate: options.immediate, immediateCallback: options.immediateCallback });\n }\n return { isSupported, memory };\n}\n\nfunction useMounted() {\n const isMounted = ref(false);\n onMounted(() => {\n isMounted.value = true;\n });\n return isMounted;\n}\n\nfunction useMouse(options = {}) {\n const {\n type = \"page\",\n touch = true,\n resetOnTouchEnds = false,\n initialValue = { x: 0, y: 0 },\n window = defaultWindow,\n eventFilter\n } = options;\n const x = ref(initialValue.x);\n const y = ref(initialValue.y);\n const sourceType = ref(null);\n const mouseHandler = (event) => {\n if (type === \"page\") {\n x.value = event.pageX;\n y.value = event.pageY;\n } else if (type === \"client\") {\n x.value = event.clientX;\n y.value = event.clientY;\n }\n sourceType.value = \"mouse\";\n };\n const reset = () => {\n x.value = initialValue.x;\n y.value = initialValue.y;\n };\n const touchHandler = (event) => {\n if (event.touches.length > 0) {\n const touch2 = event.touches[0];\n if (type === \"page\") {\n x.value = touch2.pageX;\n y.value = touch2.pageY;\n } else if (type === \"client\") {\n x.value = touch2.clientX;\n y.value = touch2.clientY;\n }\n sourceType.value = \"touch\";\n }\n };\n const mouseHandlerWrapper = (event) => {\n return eventFilter === void 0 ? mouseHandler(event) : eventFilter(() => mouseHandler(event), {});\n };\n const touchHandlerWrapper = (event) => {\n return eventFilter === void 0 ? touchHandler(event) : eventFilter(() => touchHandler(event), {});\n };\n if (window) {\n useEventListener(window, \"mousemove\", mouseHandlerWrapper, { passive: true });\n useEventListener(window, \"dragover\", mouseHandlerWrapper, { passive: true });\n if (touch) {\n useEventListener(window, \"touchstart\", touchHandlerWrapper, { passive: true });\n useEventListener(window, \"touchmove\", touchHandlerWrapper, { passive: true });\n if (resetOnTouchEnds)\n useEventListener(window, \"touchend\", reset, { passive: true });\n }\n }\n return {\n x,\n y,\n sourceType\n };\n}\n\nfunction useMouseInElement(target, options = {}) {\n const {\n handleOutside = true,\n window = defaultWindow\n } = options;\n const { x, y, sourceType } = useMouse(options);\n const targetRef = ref(target != null ? target : window == null ? void 0 : window.document.body);\n const elementX = ref(0);\n const elementY = ref(0);\n const elementPositionX = ref(0);\n const elementPositionY = ref(0);\n const elementHeight = ref(0);\n const elementWidth = ref(0);\n const isOutside = ref(false);\n let stop = () => {\n };\n if (window) {\n stop = watch([targetRef, x, y], () => {\n const el = unrefElement(targetRef);\n if (!el)\n return;\n const {\n left,\n top,\n width,\n height\n } = el.getBoundingClientRect();\n elementPositionX.value = left + window.pageXOffset;\n elementPositionY.value = top + window.pageYOffset;\n elementHeight.value = height;\n elementWidth.value = width;\n const elX = x.value - elementPositionX.value;\n const elY = y.value - elementPositionY.value;\n isOutside.value = elX < 0 || elY < 0 || elX > elementWidth.value || elY > elementHeight.value;\n if (handleOutside || !isOutside.value) {\n elementX.value = elX;\n elementY.value = elY;\n }\n }, { immediate: true });\n }\n return {\n x,\n y,\n sourceType,\n elementX,\n elementY,\n elementPositionX,\n elementPositionY,\n elementHeight,\n elementWidth,\n isOutside,\n stop\n };\n}\n\nfunction useMousePressed(options = {}) {\n const {\n touch = true,\n drag = true,\n initialValue = false,\n window = defaultWindow\n } = options;\n const pressed = ref(initialValue);\n const sourceType = ref(null);\n if (!window) {\n return {\n pressed,\n sourceType\n };\n }\n const onPressed = (srcType) => () => {\n pressed.value = true;\n sourceType.value = srcType;\n };\n const onReleased = () => {\n pressed.value = false;\n sourceType.value = null;\n };\n const target = computed(() => unrefElement(options.target) || window);\n useEventListener(target, \"mousedown\", onPressed(\"mouse\"), { passive: true });\n useEventListener(window, \"mouseleave\", onReleased, { passive: true });\n useEventListener(window, \"mouseup\", onReleased, { passive: true });\n if (drag) {\n useEventListener(target, \"dragstart\", onPressed(\"mouse\"), { passive: true });\n useEventListener(window, \"drop\", onReleased, { passive: true });\n useEventListener(window, \"dragend\", onReleased, { passive: true });\n }\n if (touch) {\n useEventListener(target, \"touchstart\", onPressed(\"touch\"), { passive: true });\n useEventListener(window, \"touchend\", onReleased, { passive: true });\n useEventListener(window, \"touchcancel\", onReleased, { passive: true });\n }\n return {\n pressed,\n sourceType\n };\n}\n\nvar __getOwnPropSymbols$7 = Object.getOwnPropertySymbols;\nvar __hasOwnProp$7 = Object.prototype.hasOwnProperty;\nvar __propIsEnum$7 = Object.prototype.propertyIsEnumerable;\nvar __objRest$1 = (source, exclude) => {\n var target = {};\n for (var prop in source)\n if (__hasOwnProp$7.call(source, prop) && exclude.indexOf(prop) < 0)\n target[prop] = source[prop];\n if (source != null && __getOwnPropSymbols$7)\n for (var prop of __getOwnPropSymbols$7(source)) {\n if (exclude.indexOf(prop) < 0 && __propIsEnum$7.call(source, prop))\n target[prop] = source[prop];\n }\n return target;\n};\nfunction useMutationObserver(target, callback, options = {}) {\n const _a = options, { window = defaultWindow } = _a, mutationOptions = __objRest$1(_a, [\"window\"]);\n let observer;\n const isSupported = window && \"IntersectionObserver\" in window;\n const cleanup = () => {\n if (observer) {\n observer.disconnect();\n observer = void 0;\n }\n };\n const stopWatch = watch(() => unrefElement(target), (el) => {\n cleanup();\n if (isSupported && window && el) {\n observer = new window.MutationObserver(callback);\n observer.observe(el, mutationOptions);\n }\n }, { immediate: true });\n const stop = () => {\n cleanup();\n stopWatch();\n };\n tryOnScopeDispose(stop);\n return {\n isSupported,\n stop\n };\n}\n\nconst useNavigatorLanguage = (options = {}) => {\n const { window = defaultWindow } = options;\n const navigator = window == null ? void 0 : window.navigator;\n const isSupported = Boolean(navigator && \"language\" in navigator);\n const language = ref(navigator == null ? void 0 : navigator.language);\n useEventListener(window, \"languagechange\", () => {\n if (navigator)\n language.value = navigator.language;\n });\n return {\n isSupported,\n language\n };\n};\n\nfunction useNetwork(options = {}) {\n const { window = defaultWindow } = options;\n const navigator = window == null ? void 0 : window.navigator;\n const isSupported = Boolean(navigator && \"connection\" in navigator);\n const isOnline = ref(true);\n const saveData = ref(false);\n const offlineAt = ref(void 0);\n const downlink = ref(void 0);\n const downlinkMax = ref(void 0);\n const rtt = ref(void 0);\n const effectiveType = ref(void 0);\n const type = ref(\"unknown\");\n const connection = isSupported && navigator.connection;\n function updateNetworkInformation() {\n if (!navigator)\n return;\n isOnline.value = navigator.onLine;\n offlineAt.value = isOnline.value ? void 0 : Date.now();\n if (connection) {\n downlink.value = connection.downlink;\n downlinkMax.value = connection.downlinkMax;\n effectiveType.value = connection.effectiveType;\n rtt.value = connection.rtt;\n saveData.value = connection.saveData;\n type.value = connection.type;\n }\n }\n if (window) {\n useEventListener(window, \"offline\", () => {\n isOnline.value = false;\n offlineAt.value = Date.now();\n });\n useEventListener(window, \"online\", () => {\n isOnline.value = true;\n });\n }\n if (connection)\n useEventListener(connection, \"change\", updateNetworkInformation, false);\n updateNetworkInformation();\n return {\n isSupported,\n isOnline,\n saveData,\n offlineAt,\n downlink,\n downlinkMax,\n effectiveType,\n rtt,\n type\n };\n}\n\nvar __defProp$6 = Object.defineProperty;\nvar __getOwnPropSymbols$6 = Object.getOwnPropertySymbols;\nvar __hasOwnProp$6 = Object.prototype.hasOwnProperty;\nvar __propIsEnum$6 = Object.prototype.propertyIsEnumerable;\nvar __defNormalProp$6 = (obj, key, value) => key in obj ? __defProp$6(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;\nvar __spreadValues$6 = (a, b) => {\n for (var prop in b || (b = {}))\n if (__hasOwnProp$6.call(b, prop))\n __defNormalProp$6(a, prop, b[prop]);\n if (__getOwnPropSymbols$6)\n for (var prop of __getOwnPropSymbols$6(b)) {\n if (__propIsEnum$6.call(b, prop))\n __defNormalProp$6(a, prop, b[prop]);\n }\n return a;\n};\nfunction useNow(options = {}) {\n const {\n controls: exposeControls = false,\n interval = \"requestAnimationFrame\"\n } = options;\n const now = ref(new Date());\n const update = () => now.value = new Date();\n const controls = interval === \"requestAnimationFrame\" ? useRafFn(update, { immediate: true }) : useIntervalFn(update, interval, { immediate: true });\n if (exposeControls) {\n return __spreadValues$6({\n now\n }, controls);\n } else {\n return now;\n }\n}\n\nfunction useOffsetPagination(options) {\n const {\n total = Infinity,\n pageSize = 10,\n page = 1,\n onPageChange = noop$1,\n onPageSizeChange = noop$1,\n onPageCountChange = noop$1\n } = options;\n const currentPageSize = useClamp$1(pageSize, 1, Infinity);\n const pageCount = computed(() => Math.ceil(unref(total) / unref(currentPageSize)));\n const currentPage = useClamp$1(page, 1, pageCount);\n const isFirstPage = computed(() => currentPage.value === 1);\n const isLastPage = computed(() => currentPage.value === pageCount.value);\n if (isRef(page))\n biSyncRef(page, currentPage);\n if (isRef(pageSize))\n biSyncRef(pageSize, currentPageSize);\n function prev() {\n currentPage.value--;\n }\n function next() {\n currentPage.value++;\n }\n const returnValue = {\n currentPage,\n currentPageSize,\n pageCount,\n isFirstPage,\n isLastPage,\n prev,\n next\n };\n watch(currentPage, () => {\n onPageChange(reactive(returnValue));\n });\n watch(currentPageSize, () => {\n onPageSizeChange(reactive(returnValue));\n });\n watch(pageCount, () => {\n onPageCountChange(reactive(returnValue));\n });\n return returnValue;\n}\n\nfunction useOnline(options = {}) {\n const { isOnline } = useNetwork(options);\n return isOnline;\n}\n\nfunction usePageLeave(options = {}) {\n const { window = defaultWindow } = options;\n const isLeft = ref(false);\n const handler = (event) => {\n if (!window)\n return;\n event = event || window.event;\n const from = event.relatedTarget || event.toElement;\n isLeft.value = !from;\n };\n if (window) {\n useEventListener(window, \"mouseout\", handler, { passive: true });\n useEventListener(window.document, \"mouseleave\", handler, { passive: true });\n useEventListener(window.document, \"mouseenter\", handler, { passive: true });\n }\n return isLeft;\n}\n\nfunction useParallax(target, options = {}) {\n const {\n deviceOrientationTiltAdjust = (i) => i,\n deviceOrientationRollAdjust = (i) => i,\n mouseTiltAdjust = (i) => i,\n mouseRollAdjust = (i) => i,\n window = defaultWindow\n } = options;\n const orientation = reactive(useDeviceOrientation({ window }));\n const {\n elementX: x,\n elementY: y,\n elementWidth: width,\n elementHeight: height\n } = useMouseInElement(target, { handleOutside: false, window });\n const source = computed(() => {\n if (orientation.isSupported && (orientation.alpha != null && orientation.alpha !== 0 || orientation.gamma != null && orientation.gamma !== 0))\n return \"deviceOrientation\";\n return \"mouse\";\n });\n const roll = computed(() => {\n if (source.value === \"deviceOrientation\") {\n const value = -orientation.beta / 90;\n return deviceOrientationRollAdjust(value);\n } else {\n const value = -(y.value - height.value / 2) / height.value;\n return mouseRollAdjust(value);\n }\n });\n const tilt = computed(() => {\n if (source.value === \"deviceOrientation\") {\n const value = orientation.gamma / 90;\n return deviceOrientationTiltAdjust(value);\n } else {\n const value = (x.value - width.value / 2) / width.value;\n return mouseTiltAdjust(value);\n }\n });\n return { roll, tilt, source };\n}\n\nvar __defProp$5 = Object.defineProperty;\nvar __defProps$2 = Object.defineProperties;\nvar __getOwnPropDescs$2 = Object.getOwnPropertyDescriptors;\nvar __getOwnPropSymbols$5 = Object.getOwnPropertySymbols;\nvar __hasOwnProp$5 = Object.prototype.hasOwnProperty;\nvar __propIsEnum$5 = Object.prototype.propertyIsEnumerable;\nvar __defNormalProp$5 = (obj, key, value) => key in obj ? __defProp$5(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;\nvar __spreadValues$5 = (a, b) => {\n for (var prop in b || (b = {}))\n if (__hasOwnProp$5.call(b, prop))\n __defNormalProp$5(a, prop, b[prop]);\n if (__getOwnPropSymbols$5)\n for (var prop of __getOwnPropSymbols$5(b)) {\n if (__propIsEnum$5.call(b, prop))\n __defNormalProp$5(a, prop, b[prop]);\n }\n return a;\n};\nvar __spreadProps$2 = (a, b) => __defProps$2(a, __getOwnPropDescs$2(b));\nconst defaultState = {\n x: 0,\n y: 0,\n pointerId: 0,\n pressure: 0,\n tiltX: 0,\n tiltY: 0,\n width: 0,\n height: 0,\n twist: 0,\n pointerType: null\n};\nconst keys = /* @__PURE__ */ Object.keys(defaultState);\nfunction usePointer(options = {}) {\n const {\n target = defaultWindow\n } = options;\n const isInside = ref(false);\n const state = ref(options.initialValue || {});\n Object.assign(state.value, defaultState, state.value);\n const handler = (event) => {\n isInside.value = true;\n if (options.pointerTypes && !options.pointerTypes.includes(event.pointerType))\n return;\n state.value = objectPick(event, keys, false);\n };\n if (target) {\n useEventListener(target, \"pointerdown\", handler, { passive: true });\n useEventListener(target, \"pointermove\", handler, { passive: true });\n useEventListener(target, \"pointerleave\", () => isInside.value = false, { passive: true });\n }\n return __spreadProps$2(__spreadValues$5({}, toRefs(state)), {\n isInside\n });\n}\n\nvar SwipeDirection = /* @__PURE__ */ ((SwipeDirection2) => {\n SwipeDirection2[\"UP\"] = \"UP\";\n SwipeDirection2[\"RIGHT\"] = \"RIGHT\";\n SwipeDirection2[\"DOWN\"] = \"DOWN\";\n SwipeDirection2[\"LEFT\"] = \"LEFT\";\n SwipeDirection2[\"NONE\"] = \"NONE\";\n return SwipeDirection2;\n})(SwipeDirection || {});\nfunction useSwipe(target, options = {}) {\n const {\n threshold = 50,\n onSwipe,\n onSwipeEnd,\n onSwipeStart,\n passive = true,\n window = defaultWindow\n } = options;\n const coordsStart = reactive({ x: 0, y: 0 });\n const coordsEnd = reactive({ x: 0, y: 0 });\n const diffX = computed(() => coordsStart.x - coordsEnd.x);\n const diffY = computed(() => coordsStart.y - coordsEnd.y);\n const { max, abs } = Math;\n const isThresholdExceeded = computed(() => max(abs(diffX.value), abs(diffY.value)) >= threshold);\n const isSwiping = ref(false);\n const direction = computed(() => {\n if (!isThresholdExceeded.value)\n return \"NONE\" /* NONE */;\n if (abs(diffX.value) > abs(diffY.value)) {\n return diffX.value > 0 ? \"LEFT\" /* LEFT */ : \"RIGHT\" /* RIGHT */;\n } else {\n return diffY.value > 0 ? \"UP\" /* UP */ : \"DOWN\" /* DOWN */;\n }\n });\n const getTouchEventCoords = (e) => [e.touches[0].clientX, e.touches[0].clientY];\n const updateCoordsStart = (x, y) => {\n coordsStart.x = x;\n coordsStart.y = y;\n };\n const updateCoordsEnd = (x, y) => {\n coordsEnd.x = x;\n coordsEnd.y = y;\n };\n let listenerOptions;\n const isPassiveEventSupported = checkPassiveEventSupport(window == null ? void 0 : window.document);\n if (!passive)\n listenerOptions = isPassiveEventSupported ? { passive: false, capture: true } : { capture: true };\n else\n listenerOptions = isPassiveEventSupported ? { passive: true } : { capture: false };\n const onTouchEnd = (e) => {\n if (isSwiping.value)\n onSwipeEnd == null ? void 0 : onSwipeEnd(e, direction.value);\n isSwiping.value = false;\n };\n const stops = [\n useEventListener(target, \"touchstart\", (e) => {\n if (listenerOptions.capture && !listenerOptions.passive)\n e.preventDefault();\n const [x, y] = getTouchEventCoords(e);\n updateCoordsStart(x, y);\n updateCoordsEnd(x, y);\n onSwipeStart == null ? void 0 : onSwipeStart(e);\n }, listenerOptions),\n useEventListener(target, \"touchmove\", (e) => {\n const [x, y] = getTouchEventCoords(e);\n updateCoordsEnd(x, y);\n if (!isSwiping.value && isThresholdExceeded.value)\n isSwiping.value = true;\n if (isSwiping.value)\n onSwipe == null ? void 0 : onSwipe(e);\n }, listenerOptions),\n useEventListener(target, \"touchend\", onTouchEnd, listenerOptions),\n useEventListener(target, \"touchcancel\", onTouchEnd, listenerOptions)\n ];\n const stop = () => stops.forEach((s) => s());\n return {\n isPassiveEventSupported,\n isSwiping,\n direction,\n coordsStart,\n coordsEnd,\n lengthX: diffX,\n lengthY: diffY,\n stop\n };\n}\nfunction checkPassiveEventSupport(document) {\n if (!document)\n return false;\n let supportsPassive = false;\n const optionsBlock = {\n get passive() {\n supportsPassive = true;\n return false;\n }\n };\n document.addEventListener(\"x\", noop, optionsBlock);\n document.removeEventListener(\"x\", noop);\n return supportsPassive;\n}\n\nfunction usePointerSwipe(target, options = {}) {\n const targetRef = ref(target);\n const {\n threshold = 50,\n onSwipe,\n onSwipeEnd,\n onSwipeStart\n } = options;\n const posStart = reactive({ x: 0, y: 0 });\n const updatePosStart = (x, y) => {\n posStart.x = x;\n posStart.y = y;\n };\n const posEnd = reactive({ x: 0, y: 0 });\n const updatePosEnd = (x, y) => {\n posEnd.x = x;\n posEnd.y = y;\n };\n const distanceX = computed(() => posStart.x - posEnd.x);\n const distanceY = computed(() => posStart.y - posEnd.y);\n const { max, abs } = Math;\n const isThresholdExceeded = computed(() => max(abs(distanceX.value), abs(distanceY.value)) >= threshold);\n const isSwiping = ref(false);\n const isPointerDown = ref(false);\n const direction = computed(() => {\n if (!isThresholdExceeded.value)\n return SwipeDirection.NONE;\n if (abs(distanceX.value) > abs(distanceY.value)) {\n return distanceX.value > 0 ? SwipeDirection.LEFT : SwipeDirection.RIGHT;\n } else {\n return distanceY.value > 0 ? SwipeDirection.UP : SwipeDirection.DOWN;\n }\n });\n const filterEvent = (e) => {\n if (options.pointerTypes)\n return options.pointerTypes.includes(e.pointerType);\n return true;\n };\n const stops = [\n useEventListener(target, \"pointerdown\", (e) => {\n var _a, _b;\n if (!filterEvent(e))\n return;\n isPointerDown.value = true;\n (_b = (_a = targetRef.value) == null ? void 0 : _a.style) == null ? void 0 : _b.setProperty(\"touch-action\", \"none\");\n const eventTarget = e.target;\n eventTarget == null ? void 0 : eventTarget.setPointerCapture(e.pointerId);\n const { clientX: x, clientY: y } = e;\n updatePosStart(x, y);\n updatePosEnd(x, y);\n onSwipeStart == null ? void 0 : onSwipeStart(e);\n }),\n useEventListener(target, \"pointermove\", (e) => {\n if (!filterEvent(e))\n return;\n if (!isPointerDown.value)\n return;\n const { clientX: x, clientY: y } = e;\n updatePosEnd(x, y);\n if (!isSwiping.value && isThresholdExceeded.value)\n isSwiping.value = true;\n if (isSwiping.value)\n onSwipe == null ? void 0 : onSwipe(e);\n }),\n useEventListener(target, \"pointerup\", (e) => {\n var _a, _b;\n if (!filterEvent(e))\n return;\n if (isSwiping.value)\n onSwipeEnd == null ? void 0 : onSwipeEnd(e, direction.value);\n isPointerDown.value = false;\n isSwiping.value = false;\n (_b = (_a = targetRef.value) == null ? void 0 : _a.style) == null ? void 0 : _b.setProperty(\"touch-action\", \"initial\");\n })\n ];\n const stop = () => stops.forEach((s) => s());\n return {\n isSwiping: readonly(isSwiping),\n direction: readonly(direction),\n posStart: readonly(posStart),\n posEnd: readonly(posEnd),\n distanceX,\n distanceY,\n stop\n };\n}\n\nfunction usePreferredColorScheme(options) {\n const isLight = useMediaQuery(\"(prefers-color-scheme: light)\", options);\n const isDark = useMediaQuery(\"(prefers-color-scheme: dark)\", options);\n return computed(() => {\n if (isDark.value)\n return \"dark\";\n if (isLight.value)\n return \"light\";\n return \"no-preference\";\n });\n}\n\nfunction usePreferredLanguages(options = {}) {\n const { window = defaultWindow } = options;\n if (!window)\n return ref([\"en\"]);\n const navigator = window.navigator;\n const value = ref(navigator.languages);\n useEventListener(window, \"languagechange\", () => {\n value.value = navigator.languages;\n });\n return value;\n}\n\nconst topVarName = \"--vueuse-safe-area-top\";\nconst rightVarName = \"--vueuse-safe-area-right\";\nconst bottomVarName = \"--vueuse-safe-area-bottom\";\nconst leftVarName = \"--vueuse-safe-area-left\";\nfunction useScreenSafeArea() {\n const top = ref(\"\");\n const right = ref(\"\");\n const bottom = ref(\"\");\n const left = ref(\"\");\n if (isClient) {\n const topCssVar = useCssVar(topVarName);\n const rightCssVar = useCssVar(rightVarName);\n const bottomCssVar = useCssVar(bottomVarName);\n const leftCssVar = useCssVar(leftVarName);\n topCssVar.value = \"env(safe-area-inset-top, 0px)\";\n rightCssVar.value = \"env(safe-area-inset-right, 0px)\";\n bottomCssVar.value = \"env(safe-area-inset-bottom, 0px)\";\n leftCssVar.value = \"env(safe-area-inset-left, 0px)\";\n update();\n useEventListener(\"resize\", useDebounceFn(update));\n }\n function update() {\n top.value = getValue(topVarName);\n right.value = getValue(rightVarName);\n bottom.value = getValue(bottomVarName);\n left.value = getValue(leftVarName);\n }\n return {\n top,\n right,\n bottom,\n left,\n update\n };\n}\nfunction getValue(position) {\n return getComputedStyle(document.documentElement).getPropertyValue(position);\n}\n\nfunction useScriptTag(src, onLoaded = noop, options = {}) {\n const {\n immediate = true,\n manual = false,\n type = \"text/javascript\",\n async = true,\n crossOrigin,\n referrerPolicy,\n noModule,\n defer,\n document = defaultDocument,\n attrs = {}\n } = options;\n const scriptTag = ref(null);\n let _promise = null;\n const loadScript = (waitForScriptLoad) => new Promise((resolve, reject) => {\n const resolveWithElement = (el2) => {\n scriptTag.value = el2;\n resolve(el2);\n return el2;\n };\n if (!document) {\n resolve(false);\n return;\n }\n let shouldAppend = false;\n let el = document.querySelector(`script[src=\"${src}\"]`);\n if (!el) {\n el = document.createElement(\"script\");\n el.type = type;\n el.async = async;\n el.src = unref(src);\n if (defer)\n el.defer = defer;\n if (crossOrigin)\n el.crossOrigin = crossOrigin;\n if (noModule)\n el.noModule = noModule;\n if (referrerPolicy)\n el.referrerPolicy = referrerPolicy;\n for (const attr in attrs)\n el[attr] = attrs[attr];\n shouldAppend = true;\n } else if (el.hasAttribute(\"data-loaded\")) {\n resolveWithElement(el);\n }\n el.addEventListener(\"error\", (event) => reject(event));\n el.addEventListener(\"abort\", (event) => reject(event));\n el.addEventListener(\"load\", () => {\n el.setAttribute(\"data-loaded\", \"true\");\n onLoaded(el);\n resolveWithElement(el);\n });\n if (shouldAppend)\n el = document.head.appendChild(el);\n if (!waitForScriptLoad)\n resolveWithElement(el);\n });\n const load = (waitForScriptLoad = true) => {\n if (!_promise)\n _promise = loadScript(waitForScriptLoad);\n return _promise;\n };\n const unload = () => {\n if (!document)\n return;\n _promise = null;\n if (scriptTag.value)\n scriptTag.value = null;\n const el = document.querySelector(`script[src=\"${src}\"]`);\n if (el)\n document.head.removeChild(el);\n };\n if (immediate && !manual)\n tryOnMounted(load);\n if (!manual)\n tryOnUnmounted(unload);\n return { scriptTag, load, unload };\n}\n\nvar _a, _b;\nfunction preventDefault(rawEvent) {\n const e = rawEvent || window.event;\n if (e.touches.length > 1)\n return true;\n if (e.preventDefault)\n e.preventDefault();\n return false;\n}\nconst isIOS = isClient && (window == null ? void 0 : window.navigator) && ((_a = window == null ? void 0 : window.navigator) == null ? void 0 : _a.platform) && /iP(ad|hone|od)/.test((_b = window == null ? void 0 : window.navigator) == null ? void 0 : _b.platform);\nfunction useScrollLock(element, initialState = false) {\n const isLocked = ref(initialState);\n let touchMoveListener = null;\n let initialOverflow;\n watch(() => unref(element), (el) => {\n if (el) {\n const ele = el;\n initialOverflow = ele.style.overflow;\n if (isLocked.value)\n ele.style.overflow = \"hidden\";\n }\n }, {\n immediate: true\n });\n const lock = () => {\n const ele = unref(element);\n if (!ele || isLocked.value)\n return;\n if (isIOS) {\n touchMoveListener = useEventListener(document, \"touchmove\", preventDefault, { passive: false });\n }\n ele.style.overflow = \"hidden\";\n isLocked.value = true;\n };\n const unlock = () => {\n const ele = unref(element);\n if (!ele || !isLocked.value)\n return;\n isIOS && (touchMoveListener == null ? void 0 : touchMoveListener());\n ele.style.overflow = initialOverflow;\n isLocked.value = false;\n };\n return computed({\n get() {\n return isLocked.value;\n },\n set(v) {\n if (v)\n lock();\n else\n unlock();\n }\n });\n}\n\nfunction useSessionStorage(key, initialValue, options = {}) {\n const { window = defaultWindow } = options;\n return useStorage(key, initialValue, window == null ? void 0 : window.sessionStorage, options);\n}\n\nvar __defProp$4 = Object.defineProperty;\nvar __getOwnPropSymbols$4 = Object.getOwnPropertySymbols;\nvar __hasOwnProp$4 = Object.prototype.hasOwnProperty;\nvar __propIsEnum$4 = Object.prototype.propertyIsEnumerable;\nvar __defNormalProp$4 = (obj, key, value) => key in obj ? __defProp$4(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;\nvar __spreadValues$4 = (a, b) => {\n for (var prop in b || (b = {}))\n if (__hasOwnProp$4.call(b, prop))\n __defNormalProp$4(a, prop, b[prop]);\n if (__getOwnPropSymbols$4)\n for (var prop of __getOwnPropSymbols$4(b)) {\n if (__propIsEnum$4.call(b, prop))\n __defNormalProp$4(a, prop, b[prop]);\n }\n return a;\n};\nfunction useShare(shareOptions = {}, options = {}) {\n const { navigator = defaultNavigator } = options;\n const _navigator = navigator;\n const isSupported = _navigator && \"canShare\" in _navigator;\n const share = async (overrideOptions = {}) => {\n if (isSupported) {\n const data = __spreadValues$4(__spreadValues$4({}, unref(shareOptions)), unref(overrideOptions));\n let granted = true;\n if (data.files && _navigator.canShare)\n granted = _navigator.canShare({ files: data.files });\n if (granted)\n return _navigator.share(data);\n }\n };\n return {\n isSupported,\n share\n };\n}\n\nfunction useSpeechRecognition(options = {}) {\n const {\n interimResults = true,\n continuous = true,\n window = defaultWindow\n } = options;\n const lang = ref(options.lang || \"en-US\");\n const isListening = ref(false);\n const isFinal = ref(false);\n const result = ref(\"\");\n const error = shallowRef(void 0);\n const toggle = (value = !isListening.value) => {\n isListening.value = value;\n };\n const start = () => {\n isListening.value = true;\n };\n const stop = () => {\n isListening.value = false;\n };\n const SpeechRecognition = window && (window.SpeechRecognition || window.webkitSpeechRecognition);\n const isSupported = Boolean(SpeechRecognition);\n let recognition;\n if (isSupported) {\n recognition = new SpeechRecognition();\n recognition.continuous = continuous;\n recognition.interimResults = interimResults;\n recognition.lang = unref(lang);\n recognition.onstart = () => {\n isFinal.value = false;\n };\n watch(lang, (lang2) => {\n if (recognition && !isListening.value)\n recognition.lang = lang2;\n });\n recognition.onresult = (event) => {\n const transcript = Array.from(event.results).map((result2) => {\n isFinal.value = result2.isFinal;\n return result2[0];\n }).map((result2) => result2.transcript).join(\"\");\n result.value = transcript;\n error.value = void 0;\n };\n recognition.onerror = (event) => {\n error.value = event;\n };\n recognition.onend = () => {\n isListening.value = false;\n recognition.lang = unref(lang);\n };\n watch(isListening, () => {\n if (isListening.value)\n recognition.start();\n else\n recognition.stop();\n });\n }\n tryOnScopeDispose(() => {\n isListening.value = false;\n });\n return {\n isSupported,\n isListening,\n isFinal,\n recognition,\n result,\n error,\n toggle,\n start,\n stop\n };\n}\n\nfunction useSpeechSynthesis(text, options = {}) {\n var _a, _b;\n const {\n pitch = 1,\n rate = 1,\n volume = 1,\n window = defaultWindow\n } = options;\n const synth = window && window.speechSynthesis;\n const isSupported = Boolean(synth);\n const isPlaying = ref(false);\n const status = ref(\"init\");\n const voiceInfo = {\n lang: ((_a = options.voice) == null ? void 0 : _a.lang) || \"default\",\n name: ((_b = options.voice) == null ? void 0 : _b.name) || \"\"\n };\n const spokenText = ref(text || \"\");\n const lang = ref(options.lang || \"en-US\");\n const error = shallowRef(void 0);\n const toggle = (value = !isPlaying.value) => {\n isPlaying.value = value;\n };\n const bindEventsForUtterance = (utterance2) => {\n utterance2.lang = unref(lang);\n options.voice && (utterance2.voice = options.voice);\n utterance2.pitch = pitch;\n utterance2.rate = rate;\n utterance2.volume = volume;\n utterance2.onstart = () => {\n isPlaying.value = true;\n status.value = \"play\";\n };\n utterance2.onpause = () => {\n isPlaying.value = false;\n status.value = \"pause\";\n };\n utterance2.onresume = () => {\n isPlaying.value = true;\n status.value = \"play\";\n };\n utterance2.onend = () => {\n isPlaying.value = false;\n status.value = \"end\";\n };\n utterance2.onerror = (event) => {\n error.value = event;\n };\n utterance2.onend = () => {\n isPlaying.value = false;\n utterance2.lang = unref(lang);\n };\n };\n const utterance = computed(() => {\n isPlaying.value = false;\n status.value = \"init\";\n const newUtterance = new SpeechSynthesisUtterance(spokenText.value);\n bindEventsForUtterance(newUtterance);\n return newUtterance;\n });\n const speak = () => {\n synth.cancel();\n utterance && synth.speak(utterance.value);\n };\n if (isSupported) {\n bindEventsForUtterance(utterance.value);\n watch(lang, (lang2) => {\n if (utterance.value && !isPlaying.value)\n utterance.value.lang = lang2;\n });\n watch(isPlaying, () => {\n if (isPlaying.value)\n synth.resume();\n else\n synth.pause();\n });\n }\n tryOnScopeDispose(() => {\n isPlaying.value = false;\n });\n return {\n isSupported,\n isPlaying,\n status,\n voiceInfo,\n utterance,\n error,\n toggle,\n speak\n };\n}\n\nfunction useStorageAsync(key, initialValue, storage, options = {}) {\n var _a;\n const {\n flush = \"pre\",\n deep = true,\n listenToStorageChanges = true,\n writeDefaults = true,\n shallow,\n window = defaultWindow,\n eventFilter,\n onError = (e) => {\n console.error(e);\n }\n } = options;\n const rawInit = unref(initialValue);\n const type = guessSerializerType(rawInit);\n const data = (shallow ? shallowRef : ref)(initialValue);\n const serializer = (_a = options.serializer) != null ? _a : StorageSerializers[type];\n if (!storage) {\n try {\n storage = getSSRHandler(\"getDefaultStorage\", () => {\n var _a2;\n return (_a2 = defaultWindow) == null ? void 0 : _a2.localStorage;\n })();\n } catch (e) {\n onError(e);\n }\n }\n async function read(event) {\n if (!storage || event && event.key !== key)\n return;\n try {\n const rawValue = event ? event.newValue : await storage.getItem(key);\n if (rawValue == null) {\n data.value = rawInit;\n if (writeDefaults && rawInit !== null)\n await storage.setItem(key, await serializer.write(rawInit));\n } else {\n data.value = await serializer.read(rawValue);\n }\n } catch (e) {\n onError(e);\n }\n }\n read();\n if (window && listenToStorageChanges)\n useEventListener(window, \"storage\", (e) => setTimeout(() => read(e), 0));\n if (storage) {\n watchWithFilter(data, async () => {\n try {\n if (data.value == null)\n await storage.removeItem(key);\n else\n await storage.setItem(key, await serializer.write(data.value));\n } catch (e) {\n onError(e);\n }\n }, {\n flush,\n deep,\n eventFilter\n });\n }\n return data;\n}\n\nlet _id = 0;\nfunction useStyleTag(css, options = {}) {\n const isLoaded = ref(false);\n const {\n document = defaultDocument,\n immediate = true,\n manual = false,\n id = `vueuse_styletag_${++_id}`\n } = options;\n const cssRef = ref(css);\n let stop = () => {\n };\n const load = () => {\n if (!document)\n return;\n const el = document.getElementById(id) || document.createElement(\"style\");\n el.type = \"text/css\";\n el.id = id;\n if (options.media)\n el.media = options.media;\n document.head.appendChild(el);\n if (isLoaded.value)\n return;\n stop = watch(cssRef, (value) => {\n el.innerText = value;\n }, { immediate: true });\n isLoaded.value = true;\n };\n const unload = () => {\n if (!document || !isLoaded.value)\n return;\n stop();\n document.head.removeChild(document.getElementById(id));\n isLoaded.value = false;\n };\n if (immediate && !manual)\n load();\n if (!manual)\n tryOnScopeDispose(unload);\n return {\n id,\n css: cssRef,\n unload,\n load,\n isLoaded: readonly(isLoaded)\n };\n}\n\nfunction useTemplateRefsList() {\n const refs = ref([]);\n refs.value.set = (el) => {\n if (el)\n refs.value.push(el);\n };\n onBeforeUpdate(() => {\n refs.value.length = 0;\n });\n return refs;\n}\n\nvar __defProp$3 = Object.defineProperty;\nvar __defProps$1 = Object.defineProperties;\nvar __getOwnPropDescs$1 = Object.getOwnPropertyDescriptors;\nvar __getOwnPropSymbols$3 = Object.getOwnPropertySymbols;\nvar __hasOwnProp$3 = Object.prototype.hasOwnProperty;\nvar __propIsEnum$3 = Object.prototype.propertyIsEnumerable;\nvar __defNormalProp$3 = (obj, key, value) => key in obj ? __defProp$3(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;\nvar __spreadValues$3 = (a, b) => {\n for (var prop in b || (b = {}))\n if (__hasOwnProp$3.call(b, prop))\n __defNormalProp$3(a, prop, b[prop]);\n if (__getOwnPropSymbols$3)\n for (var prop of __getOwnPropSymbols$3(b)) {\n if (__propIsEnum$3.call(b, prop))\n __defNormalProp$3(a, prop, b[prop]);\n }\n return a;\n};\nvar __spreadProps$1 = (a, b) => __defProps$1(a, __getOwnPropDescs$1(b));\nconst initialRect = {\n top: 0,\n left: 0,\n bottom: 0,\n right: 0,\n height: 0,\n width: 0\n};\nconst initialState = __spreadValues$3({\n text: \"\"\n}, initialRect);\nfunction getRectFromSelection(selection) {\n if (!selection || selection.rangeCount < 1)\n return initialRect;\n const range = selection.getRangeAt(0);\n const { height, width, top, left, right, bottom } = range.getBoundingClientRect();\n return {\n height,\n width,\n top,\n left,\n right,\n bottom\n };\n}\nfunction useTextSelection(element) {\n var _a;\n const state = ref(initialState);\n if (!((_a = defaultWindow) == null ? void 0 : _a.getSelection))\n return state;\n const onMouseup = () => {\n var _a2;\n const text = (_a2 = window.getSelection()) == null ? void 0 : _a2.toString();\n if (text) {\n const rect = getRectFromSelection(window.getSelection());\n state.value = __spreadProps$1(__spreadValues$3(__spreadValues$3({}, state.value), rect), {\n text\n });\n }\n };\n const onMousedown = () => {\n var _a2;\n state.value.text && (state.value = initialState);\n (_a2 = window.getSelection()) == null ? void 0 : _a2.removeAllRanges();\n };\n useEventListener(element != null ? element : document, \"mouseup\", onMouseup);\n useEventListener(document, \"mousedown\", onMousedown);\n return state;\n}\n\nvar __defProp$2 = Object.defineProperty;\nvar __defProps = Object.defineProperties;\nvar __getOwnPropDescs = Object.getOwnPropertyDescriptors;\nvar __getOwnPropSymbols$2 = Object.getOwnPropertySymbols;\nvar __hasOwnProp$2 = Object.prototype.hasOwnProperty;\nvar __propIsEnum$2 = Object.prototype.propertyIsEnumerable;\nvar __defNormalProp$2 = (obj, key, value) => key in obj ? __defProp$2(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;\nvar __spreadValues$2 = (a, b) => {\n for (var prop in b || (b = {}))\n if (__hasOwnProp$2.call(b, prop))\n __defNormalProp$2(a, prop, b[prop]);\n if (__getOwnPropSymbols$2)\n for (var prop of __getOwnPropSymbols$2(b)) {\n if (__propIsEnum$2.call(b, prop))\n __defNormalProp$2(a, prop, b[prop]);\n }\n return a;\n};\nvar __spreadProps = (a, b) => __defProps(a, __getOwnPropDescs(b));\nfunction useThrottledRefHistory(source, options = {}) {\n const { throttle = 200, trailing = true } = options;\n const filter = throttleFilter(throttle, trailing);\n const history = useRefHistory(source, __spreadProps(__spreadValues$2({}, options), { eventFilter: filter }));\n return __spreadValues$2({}, history);\n}\n\nvar __defProp$1 = Object.defineProperty;\nvar __getOwnPropSymbols$1 = Object.getOwnPropertySymbols;\nvar __hasOwnProp$1 = Object.prototype.hasOwnProperty;\nvar __propIsEnum$1 = Object.prototype.propertyIsEnumerable;\nvar __defNormalProp$1 = (obj, key, value) => key in obj ? __defProp$1(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;\nvar __spreadValues$1 = (a, b) => {\n for (var prop in b || (b = {}))\n if (__hasOwnProp$1.call(b, prop))\n __defNormalProp$1(a, prop, b[prop]);\n if (__getOwnPropSymbols$1)\n for (var prop of __getOwnPropSymbols$1(b)) {\n if (__propIsEnum$1.call(b, prop))\n __defNormalProp$1(a, prop, b[prop]);\n }\n return a;\n};\nvar __objRest = (source, exclude) => {\n var target = {};\n for (var prop in source)\n if (__hasOwnProp$1.call(source, prop) && exclude.indexOf(prop) < 0)\n target[prop] = source[prop];\n if (source != null && __getOwnPropSymbols$1)\n for (var prop of __getOwnPropSymbols$1(source)) {\n if (exclude.indexOf(prop) < 0 && __propIsEnum$1.call(source, prop))\n target[prop] = source[prop];\n }\n return target;\n};\nconst UNITS = [\n { max: 6e4, value: 1e3, name: \"second\" },\n { max: 276e4, value: 6e4, name: \"minute\" },\n { max: 72e6, value: 36e5, name: \"hour\" },\n { max: 5184e5, value: 864e5, name: \"day\" },\n { max: 24192e5, value: 6048e5, name: \"week\" },\n { max: 28512e6, value: 2592e6, name: \"month\" },\n { max: Infinity, value: 31536e6, name: \"year\" }\n];\nconst DEFAULT_MESSAGES = {\n justNow: \"just now\",\n past: (n) => n.match(/\\d/) ? `${n} ago` : n,\n future: (n) => n.match(/\\d/) ? `in ${n}` : n,\n month: (n, past) => n === 1 ? past ? \"last month\" : \"next month\" : `${n} month${n > 1 ? \"s\" : \"\"}`,\n year: (n, past) => n === 1 ? past ? \"last year\" : \"next year\" : `${n} year${n > 1 ? \"s\" : \"\"}`,\n day: (n, past) => n === 1 ? past ? \"yesterday\" : \"tomorrow\" : `${n} day${n > 1 ? \"s\" : \"\"}`,\n week: (n, past) => n === 1 ? past ? \"last week\" : \"next week\" : `${n} week${n > 1 ? \"s\" : \"\"}`,\n hour: (n) => `${n} hour${n > 1 ? \"s\" : \"\"}`,\n minute: (n) => `${n} minute${n > 1 ? \"s\" : \"\"}`,\n second: (n) => `${n} second${n > 1 ? \"s\" : \"\"}`\n};\nconst DEFAULT_FORMATTER = (date) => date.toISOString().slice(0, 10);\nfunction useTimeAgo(time, options = {}) {\n const {\n controls: exposeControls = false,\n max,\n updateInterval = 3e4,\n messages = DEFAULT_MESSAGES,\n fullDateFormatter = DEFAULT_FORMATTER\n } = options;\n const { abs, round } = Math;\n const _a = useNow({ interval: updateInterval, controls: true }), { now } = _a, controls = __objRest(_a, [\"now\"]);\n function getTimeago(from, now2) {\n var _a2;\n const diff = +now2 - +from;\n const absDiff = abs(diff);\n if (absDiff < 6e4)\n return messages.justNow;\n if (typeof max === \"number\" && absDiff > max)\n return fullDateFormatter(new Date(from));\n if (typeof max === \"string\") {\n const unitMax = (_a2 = UNITS.find((i) => i.name === max)) == null ? void 0 : _a2.max;\n if (unitMax && absDiff > unitMax)\n return fullDateFormatter(new Date(from));\n }\n for (const unit of UNITS) {\n if (absDiff < unit.max)\n return format(diff, unit);\n }\n }\n function applyFormat(name, val, isPast) {\n const formatter = messages[name];\n if (typeof formatter === \"function\")\n return formatter(val, isPast);\n return formatter.replace(\"{0}\", val.toString());\n }\n function format(diff, unit) {\n const val = round(abs(diff) / unit.value);\n const past = diff > 0;\n const str = applyFormat(unit.name, val, past);\n return applyFormat(past ? \"past\" : \"future\", str, past);\n }\n const timeAgo = computed(() => getTimeago(new Date(unref(time)), unref(now.value)));\n if (exposeControls) {\n return __spreadValues$1({\n timeAgo\n }, controls);\n } else {\n return timeAgo;\n }\n}\n\nvar __defProp = Object.defineProperty;\nvar __getOwnPropSymbols = Object.getOwnPropertySymbols;\nvar __hasOwnProp = Object.prototype.hasOwnProperty;\nvar __propIsEnum = Object.prototype.propertyIsEnumerable;\nvar __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;\nvar __spreadValues = (a, b) => {\n for (var prop in b || (b = {}))\n if (__hasOwnProp.call(b, prop))\n __defNormalProp(a, prop, b[prop]);\n if (__getOwnPropSymbols)\n for (var prop of __getOwnPropSymbols(b)) {\n if (__propIsEnum.call(b, prop))\n __defNormalProp(a, prop, b[prop]);\n }\n return a;\n};\nfunction useTimestamp(options = {}) {\n const {\n controls: exposeControls = false,\n offset = 0,\n immediate = true,\n interval = \"requestAnimationFrame\"\n } = options;\n const ts = ref(timestamp() + offset);\n const update = () => ts.value = timestamp() + offset;\n const controls = interval === \"requestAnimationFrame\" ? useRafFn(update, { immediate }) : useIntervalFn(update, interval, { immediate });\n if (exposeControls) {\n return __spreadValues({\n timestamp: ts\n }, controls);\n } else {\n return ts;\n }\n}\n\nfunction useTitle(newTitle = null, options = {}) {\n var _a, _b;\n const {\n document = defaultDocument,\n observe = false,\n titleTemplate = \"%s\"\n } = options;\n const title = ref((_a = newTitle != null ? newTitle : document == null ? void 0 : document.title) != null ? _a : null);\n watch(title, (t, o) => {\n if (isString(t) && t !== o && document)\n document.title = titleTemplate.replace(\"%s\", t);\n }, { immediate: true });\n if (observe && document) {\n useMutationObserver((_b = document.head) == null ? void 0 : _b.querySelector(\"title\"), () => {\n if (document && document.title !== title.value)\n title.value = titleTemplate.replace(\"%s\", document.title);\n }, { childList: true });\n }\n return title;\n}\n\nconst TransitionPresets = {\n linear: identity,\n easeInSine: [0.12, 0, 0.39, 0],\n easeOutSine: [0.61, 1, 0.88, 1],\n easeInOutSine: [0.37, 0, 0.63, 1],\n easeInQuad: [0.11, 0, 0.5, 0],\n easeOutQuad: [0.5, 1, 0.89, 1],\n easeInOutQuad: [0.45, 0, 0.55, 1],\n easeInCubic: [0.32, 0, 0.67, 0],\n easeOutCubic: [0.33, 1, 0.68, 1],\n easeInOutCubic: [0.65, 0, 0.35, 1],\n easeInQuart: [0.5, 0, 0.75, 0],\n easeOutQuart: [0.25, 1, 0.5, 1],\n easeInOutQuart: [0.76, 0, 0.24, 1],\n easeInQuint: [0.64, 0, 0.78, 0],\n easeOutQuint: [0.22, 1, 0.36, 1],\n easeInOutQuint: [0.83, 0, 0.17, 1],\n easeInExpo: [0.7, 0, 0.84, 0],\n easeOutExpo: [0.16, 1, 0.3, 1],\n easeInOutExpo: [0.87, 0, 0.13, 1],\n easeInCirc: [0.55, 0, 1, 0.45],\n easeOutCirc: [0, 0.55, 0.45, 1],\n easeInOutCirc: [0.85, 0, 0.15, 1],\n easeInBack: [0.36, 0, 0.66, -0.56],\n easeOutBack: [0.34, 1.56, 0.64, 1],\n easeInOutBack: [0.68, -0.6, 0.32, 1.6]\n};\nfunction createEasingFunction([p0, p1, p2, p3]) {\n const a = (a1, a2) => 1 - 3 * a2 + 3 * a1;\n const b = (a1, a2) => 3 * a2 - 6 * a1;\n const c = (a1) => 3 * a1;\n const calcBezier = (t, a1, a2) => ((a(a1, a2) * t + b(a1, a2)) * t + c(a1)) * t;\n const getSlope = (t, a1, a2) => 3 * a(a1, a2) * t * t + 2 * b(a1, a2) * t + c(a1);\n const getTforX = (x) => {\n let aGuessT = x;\n for (let i = 0; i < 4; ++i) {\n const currentSlope = getSlope(aGuessT, p0, p2);\n if (currentSlope === 0)\n return aGuessT;\n const currentX = calcBezier(aGuessT, p0, p2) - x;\n aGuessT -= currentX / currentSlope;\n }\n return aGuessT;\n };\n return (x) => p0 === p1 && p2 === p3 ? x : calcBezier(getTforX(x), p1, p3);\n}\nfunction useTransition(source, options = {}) {\n const {\n delay = 0,\n disabled = false,\n duration = 1e3,\n onFinished = noop,\n onStarted = noop,\n transition = identity\n } = options;\n const currentTransition = computed(() => {\n const t = unref(transition);\n return isFunction(t) ? t : createEasingFunction(t);\n });\n const sourceValue = computed(() => {\n const s = unref(source);\n return isNumber(s) ? s : s.map(unref);\n });\n const sourceVector = computed(() => isNumber(sourceValue.value) ? [sourceValue.value] : sourceValue.value);\n const outputVector = ref(sourceVector.value.slice(0));\n let currentDuration;\n let diffVector;\n let endAt;\n let startAt;\n let startVector;\n const { resume, pause } = useRafFn(() => {\n const now = Date.now();\n const progress = clamp(1 - (endAt - now) / currentDuration, 0, 1);\n outputVector.value = startVector.map((val, i) => {\n var _a;\n return val + ((_a = diffVector[i]) != null ? _a : 0) * currentTransition.value(progress);\n });\n if (progress >= 1) {\n pause();\n onFinished();\n }\n }, { immediate: false });\n const start = () => {\n pause();\n currentDuration = unref(duration);\n diffVector = outputVector.value.map((n, i) => {\n var _a, _b;\n return ((_a = sourceVector.value[i]) != null ? _a : 0) - ((_b = outputVector.value[i]) != null ? _b : 0);\n });\n startVector = outputVector.value.slice(0);\n startAt = Date.now();\n endAt = startAt + currentDuration;\n resume();\n onStarted();\n };\n const timeout = useTimeoutFn(start, delay, { immediate: false });\n watch(sourceVector, () => {\n if (unref(disabled)) {\n outputVector.value = sourceVector.value.slice(0);\n } else {\n if (unref(delay) <= 0)\n start();\n else\n timeout.start();\n }\n }, { deep: true });\n return computed(() => {\n const targetVector = unref(disabled) ? sourceVector : outputVector;\n return isNumber(sourceValue.value) ? targetVector.value[0] : targetVector.value;\n });\n}\n\nfunction useUrlSearchParams(mode = \"history\", options = {}) {\n const {\n initialValue = {},\n removeNullishValues = true,\n removeFalsyValues = false,\n window = defaultWindow\n } = options;\n if (!window)\n return reactive(initialValue);\n const state = reactive(initialValue);\n function getRawParams() {\n if (mode === \"history\") {\n return window.location.search || \"\";\n } else if (mode === \"hash\") {\n const hash = window.location.hash || \"\";\n const index = hash.indexOf(\"?\");\n return index > 0 ? hash.slice(index) : \"\";\n } else {\n return (window.location.hash || \"\").replace(/^#/, \"\");\n }\n }\n function constructQuery(params) {\n const stringified = params.toString();\n if (mode === \"history\")\n return `${stringified ? `?${stringified}` : \"\"}${location.hash || \"\"}`;\n if (mode === \"hash-params\")\n return `${location.search || \"\"}${stringified ? `#${stringified}` : \"\"}`;\n const hash = window.location.hash || \"#\";\n const index = hash.indexOf(\"?\");\n if (index > 0)\n return `${hash.slice(0, index)}${stringified ? `?${stringified}` : \"\"}`;\n return `${hash}${stringified ? `?${stringified}` : \"\"}`;\n }\n function read() {\n return new URLSearchParams(getRawParams());\n }\n function updateState(params) {\n const unusedKeys = new Set(Object.keys(state));\n for (const key of params.keys()) {\n const paramsForKey = params.getAll(key);\n state[key] = paramsForKey.length > 1 ? paramsForKey : params.get(key) || \"\";\n unusedKeys.delete(key);\n }\n Array.from(unusedKeys).forEach((key) => delete state[key]);\n }\n const { pause, resume } = pausableWatch(state, () => {\n const params = new URLSearchParams(\"\");\n Object.keys(state).forEach((key) => {\n const mapEntry = state[key];\n if (Array.isArray(mapEntry))\n mapEntry.forEach((value) => params.append(key, value));\n else if (removeNullishValues && mapEntry == null)\n params.delete(key);\n else if (removeFalsyValues && !mapEntry)\n params.delete(key);\n else\n params.set(key, mapEntry);\n });\n write(params);\n }, { deep: true });\n function write(params, shouldUpdate) {\n pause();\n if (shouldUpdate)\n updateState(params);\n window.history.replaceState({}, \"\", window.location.pathname + constructQuery(params));\n resume();\n }\n function onChanged() {\n write(read(), true);\n }\n useEventListener(window, \"popstate\", onChanged, false);\n if (mode !== \"history\")\n useEventListener(window, \"hashchange\", onChanged, false);\n updateState(read());\n return state;\n}\n\nfunction useUserMedia(options = {}) {\n var _a, _b, _c;\n const enabled = ref((_a = options.enabled) != null ? _a : false);\n const autoSwitch = ref((_b = options.autoSwitch) != null ? _b : true);\n const videoDeviceId = ref(options.videoDeviceId);\n const audioDeviceId = ref(options.audioDeviceId);\n const { navigator = defaultNavigator } = options;\n const isSupported = Boolean((_c = navigator == null ? void 0 : navigator.mediaDevices) == null ? void 0 : _c.getUserMedia);\n const stream = shallowRef();\n function getDeviceOptions(device) {\n if (device.value === \"none\" || device.value === false)\n return false;\n if (device.value == null)\n return true;\n return {\n deviceId: device.value\n };\n }\n async function _start() {\n if (!isSupported || stream.value)\n return;\n stream.value = await navigator.mediaDevices.getUserMedia({\n video: getDeviceOptions(videoDeviceId),\n audio: getDeviceOptions(audioDeviceId)\n });\n return stream.value;\n }\n async function _stop() {\n var _a2;\n (_a2 = stream.value) == null ? void 0 : _a2.getTracks().forEach((t) => t.stop());\n stream.value = void 0;\n }\n function stop() {\n _stop();\n enabled.value = false;\n }\n async function start() {\n await _start();\n if (stream.value)\n enabled.value = true;\n return stream.value;\n }\n async function restart() {\n _stop();\n return await start();\n }\n watch(enabled, (v) => {\n if (v)\n _start();\n else\n _stop();\n }, { immediate: true });\n watch([videoDeviceId, audioDeviceId], () => {\n if (autoSwitch.value && stream.value)\n restart();\n }, { immediate: true });\n return {\n isSupported,\n stream,\n start,\n stop,\n restart,\n videoDeviceId,\n audioDeviceId,\n enabled,\n autoSwitch\n };\n}\n\nfunction useVModel(props, key, emit, options = {}) {\n var _a, _b, _c;\n const {\n passive = false,\n eventName,\n deep = false\n } = options;\n const vm = getCurrentInstance();\n const _emit = emit || (vm == null ? void 0 : vm.emit) || ((_a = vm == null ? void 0 : vm.$emit) == null ? void 0 : _a.bind(vm));\n let event = eventName;\n if (!key) {\n if (isVue2) {\n const modelOptions = (_c = (_b = vm == null ? void 0 : vm.proxy) == null ? void 0 : _b.$options) == null ? void 0 : _c.model;\n key = (modelOptions == null ? void 0 : modelOptions.value) || \"value\";\n if (!eventName)\n event = (modelOptions == null ? void 0 : modelOptions.event) || \"input\";\n } else {\n key = \"modelValue\";\n }\n }\n event = eventName || event || `update:${key}`;\n if (passive) {\n const proxy = ref(props[key]);\n watch(() => props[key], (v) => proxy.value = v);\n watch(proxy, (v) => {\n if (v !== props[key] || deep)\n _emit(event, v);\n }, {\n deep\n });\n return proxy;\n } else {\n return computed({\n get() {\n return props[key];\n },\n set(value) {\n _emit(event, value);\n }\n });\n }\n}\n\nfunction useVModels(props, emit, options = {}) {\n const ret = {};\n for (const key in props)\n ret[key] = useVModel(props, key, emit, options);\n return ret;\n}\n\nfunction useVibrate(options) {\n const {\n pattern = [],\n interval = 0,\n navigator = defaultNavigator\n } = options || {};\n const isSupported = typeof navigator !== \"undefined\" && \"vibrate\" in navigator;\n const patternRef = ref(pattern);\n let intervalControls;\n const vibrate = (pattern2 = patternRef.value) => {\n if (isSupported)\n navigator.vibrate(pattern2);\n };\n const stop = () => {\n if (isSupported)\n navigator.vibrate(0);\n intervalControls == null ? void 0 : intervalControls.pause();\n };\n if (interval > 0) {\n intervalControls = useIntervalFn(vibrate, interval, {\n immediate: false,\n immediateCallback: false\n });\n }\n return {\n isSupported,\n pattern,\n intervalControls,\n vibrate,\n stop\n };\n}\n\nfunction useVirtualList(list, options) {\n const containerRef = ref();\n const size = useElementSize(containerRef);\n const currentList = ref([]);\n const source = shallowRef(list);\n const state = ref({ start: 0, end: 10 });\n const { itemHeight, overscan = 5 } = options;\n const getViewCapacity = (containerHeight) => {\n if (typeof itemHeight === \"number\")\n return Math.ceil(containerHeight / itemHeight);\n const { start = 0 } = state.value;\n let sum = 0;\n let capacity = 0;\n for (let i = start; i < source.value.length; i++) {\n const height = itemHeight(i);\n sum += height;\n if (sum >= containerHeight) {\n capacity = i;\n break;\n }\n }\n return capacity - start;\n };\n const getOffset = (scrollTop) => {\n if (typeof itemHeight === \"number\")\n return Math.floor(scrollTop / itemHeight) + 1;\n let sum = 0;\n let offset = 0;\n for (let i = 0; i < source.value.length; i++) {\n const height = itemHeight(i);\n sum += height;\n if (sum >= scrollTop) {\n offset = i;\n break;\n }\n }\n return offset + 1;\n };\n const calculateRange = () => {\n const element = containerRef.value;\n if (element) {\n const offset = getOffset(element.scrollTop);\n const viewCapacity = getViewCapacity(element.clientHeight);\n const from = offset - overscan;\n const to = offset + viewCapacity + overscan;\n state.value = {\n start: from < 0 ? 0 : from,\n end: to > source.value.length ? source.value.length : to\n };\n currentList.value = source.value.slice(state.value.start, state.value.end).map((ele, index) => ({\n data: ele,\n index: index + state.value.start\n }));\n }\n };\n watch([size.width, size.height, list], () => {\n calculateRange();\n });\n const totalHeight = computed(() => {\n if (typeof itemHeight === \"number\")\n return source.value.length * itemHeight;\n return source.value.reduce((sum, _, index) => sum + itemHeight(index), 0);\n });\n const getDistanceTop = (index) => {\n if (typeof itemHeight === \"number\") {\n const height2 = index * itemHeight;\n return height2;\n }\n const height = source.value.slice(0, index).reduce((sum, _, i) => sum + itemHeight(i), 0);\n return height;\n };\n const scrollTo = (index) => {\n if (containerRef.value) {\n containerRef.value.scrollTop = getDistanceTop(index);\n calculateRange();\n }\n };\n const offsetTop = computed(() => getDistanceTop(state.value.start));\n const wrapperProps = computed(() => {\n return {\n style: {\n width: \"100%\",\n height: `${totalHeight.value - offsetTop.value}px`,\n marginTop: `${offsetTop.value}px`\n }\n };\n });\n const containerStyle = { overflowY: \"auto\" };\n return {\n list: currentList,\n scrollTo,\n containerProps: {\n ref: containerRef,\n onScroll: () => {\n calculateRange();\n },\n style: containerStyle\n },\n wrapperProps\n };\n}\n\nconst useWakeLock = (options = {}) => {\n const {\n navigator = defaultNavigator,\n document = defaultDocument\n } = options;\n let wakeLock;\n const isSupported = navigator && \"wakeLock\" in navigator;\n const isActive = ref(false);\n async function onVisibilityChange() {\n if (!isSupported || !wakeLock)\n return;\n if (document && document.visibilityState === \"visible\")\n wakeLock = await navigator.wakeLock.request(\"screen\");\n isActive.value = !wakeLock.released;\n }\n if (document)\n useEventListener(document, \"visibilitychange\", onVisibilityChange, { passive: true });\n async function request(type) {\n if (!isSupported)\n return;\n wakeLock = await navigator.wakeLock.request(type);\n isActive.value = !wakeLock.released;\n }\n async function release() {\n if (!isSupported || !wakeLock)\n return;\n await wakeLock.release();\n isActive.value = !wakeLock.released;\n wakeLock = null;\n }\n return {\n isSupported,\n isActive,\n request,\n release\n };\n};\n\nconst useWebNotification = (defaultOptions = {}) => {\n const {\n window = defaultWindow\n } = defaultOptions;\n const isSupported = !!window && \"Notification\" in window;\n const notification = ref(null);\n const requestPermission = async () => {\n if (!isSupported)\n return;\n if (\"permission\" in Notification && Notification.permission !== \"denied\")\n await Notification.requestPermission();\n };\n const onClick = createEventHook();\n const onShow = createEventHook();\n const onError = createEventHook();\n const onClose = createEventHook();\n const show = async (overrides) => {\n if (!isSupported)\n return;\n await requestPermission();\n const options = Object.assign({}, defaultOptions, overrides);\n notification.value = new Notification(options.title || \"\", options);\n notification.value.onclick = (event) => onClick.trigger(event);\n notification.value.onshow = (event) => onShow.trigger(event);\n notification.value.onerror = (event) => onError.trigger(event);\n notification.value.onclose = (event) => onClose.trigger(event);\n return notification.value;\n };\n const close = () => {\n if (notification.value)\n notification.value.close();\n notification.value = null;\n };\n tryOnMounted(async () => {\n if (isSupported)\n await requestPermission();\n });\n tryOnScopeDispose(close);\n if (isSupported && window) {\n const document = window.document;\n useEventListener(document, \"visibilitychange\", (e) => {\n e.preventDefault();\n if (document.visibilityState === \"visible\") {\n close();\n }\n });\n }\n return {\n isSupported,\n notification,\n show,\n close,\n onClick,\n onShow,\n onError,\n onClose\n };\n};\n\nfunction resolveNestedOptions(options) {\n if (options === true)\n return {};\n return options;\n}\nfunction useWebSocket(url, options = {}) {\n const {\n onConnected,\n onDisconnected,\n onError,\n onMessage,\n immediate = true,\n autoClose = true,\n protocols = []\n } = options;\n const data = ref(null);\n const status = ref(\"CONNECTING\");\n const wsRef = ref();\n let heartbeatPause;\n let heartbeatResume;\n let explicitlyClosed = false;\n let retried = 0;\n let bufferedData = [];\n const close = (code = 1e3, reason) => {\n if (!wsRef.value)\n return;\n explicitlyClosed = true;\n heartbeatPause == null ? void 0 : heartbeatPause();\n wsRef.value.close(code, reason);\n };\n const _sendBuffer = () => {\n if (bufferedData.length && wsRef.value && status.value === \"OPEN\") {\n for (const buffer of bufferedData)\n wsRef.value.send(buffer);\n bufferedData = [];\n }\n };\n const send = (data2, useBuffer = true) => {\n if (!wsRef.value || status.value !== \"OPEN\") {\n if (useBuffer)\n bufferedData.push(data2);\n return false;\n }\n _sendBuffer();\n wsRef.value.send(data2);\n return true;\n };\n const _init = () => {\n const ws = new WebSocket(url, protocols);\n wsRef.value = ws;\n status.value = \"CONNECTING\";\n explicitlyClosed = false;\n ws.onopen = () => {\n status.value = \"OPEN\";\n onConnected == null ? void 0 : onConnected(ws);\n heartbeatResume == null ? void 0 : heartbeatResume();\n _sendBuffer();\n };\n ws.onclose = (ev) => {\n status.value = \"CLOSED\";\n wsRef.value = void 0;\n onDisconnected == null ? void 0 : onDisconnected(ws, ev);\n if (!explicitlyClosed && options.autoReconnect) {\n const {\n retries = -1,\n delay = 1e3,\n onFailed\n } = resolveNestedOptions(options.autoReconnect);\n retried += 1;\n if (retries < 0 || retried < retries)\n setTimeout(_init, delay);\n else\n onFailed == null ? void 0 : onFailed();\n }\n };\n ws.onerror = (e) => {\n onError == null ? void 0 : onError(ws, e);\n };\n ws.onmessage = (e) => {\n data.value = e.data;\n onMessage == null ? void 0 : onMessage(ws, e);\n };\n };\n if (options.heartbeat) {\n const {\n message = \"ping\",\n interval = 1e3\n } = resolveNestedOptions(options.heartbeat);\n const { pause, resume } = useIntervalFn(() => send(message, false), interval, { immediate: false });\n heartbeatPause = pause;\n heartbeatResume = resume;\n }\n if (immediate)\n _init();\n if (autoClose) {\n useEventListener(window, \"beforeunload\", () => close());\n tryOnScopeDispose(close);\n }\n const open = () => {\n close();\n retried = 0;\n _init();\n };\n return {\n data,\n status,\n close,\n send,\n open,\n ws: wsRef\n };\n}\n\nfunction useWebWorker(url, workerOptions, options = {}) {\n const {\n window = defaultWindow\n } = options;\n const data = ref(null);\n const worker = shallowRef();\n const post = function post2(val) {\n if (!worker.value)\n return;\n worker.value.postMessage(val);\n };\n const terminate = function terminate2() {\n if (!worker.value)\n return;\n worker.value.terminate();\n };\n if (window) {\n worker.value = new window.Worker(url, workerOptions);\n worker.value.onmessage = (e) => {\n data.value = e.data;\n };\n tryOnScopeDispose(() => {\n if (worker.value)\n worker.value.terminate();\n });\n }\n return {\n data,\n post,\n terminate,\n worker\n };\n}\n\nconst jobRunner = (userFunc) => (e) => {\n const userFuncArgs = e.data[0];\n return Promise.resolve(userFunc.apply(void 0, userFuncArgs)).then((result) => {\n postMessage([\"SUCCESS\", result]);\n }).catch((error) => {\n postMessage([\"ERROR\", error]);\n });\n};\n\nconst depsParser = (deps) => {\n if (deps.length === 0)\n return \"\";\n const depsString = deps.map((dep) => `'${dep}'`).toString();\n return `importScripts(${depsString})`;\n};\n\nconst createWorkerBlobUrl = (fn, deps) => {\n const blobCode = `${depsParser(deps)}; onmessage=(${jobRunner})(${fn})`;\n const blob = new Blob([blobCode], { type: \"text/javascript\" });\n const url = URL.createObjectURL(blob);\n return url;\n};\n\nconst useWebWorkerFn = (fn, options = {}) => {\n const {\n dependencies = [],\n timeout,\n window = defaultWindow\n } = options;\n const worker = ref();\n const workerStatus = ref(\"PENDING\");\n const promise = ref({});\n const timeoutId = ref();\n const workerTerminate = (status = \"PENDING\") => {\n if (worker.value && worker.value._url && window) {\n worker.value.terminate();\n URL.revokeObjectURL(worker.value._url);\n promise.value = {};\n worker.value = void 0;\n window.clearTimeout(timeoutId.value);\n workerStatus.value = status;\n }\n };\n workerTerminate();\n tryOnScopeDispose(workerTerminate);\n const generateWorker = () => {\n const blobUrl = createWorkerBlobUrl(fn, dependencies);\n const newWorker = new Worker(blobUrl);\n newWorker._url = blobUrl;\n newWorker.onmessage = (e) => {\n const { resolve = () => {\n }, reject = () => {\n } } = promise.value;\n const [status, result] = e.data;\n switch (status) {\n case \"SUCCESS\":\n resolve(result);\n workerTerminate(status);\n break;\n default:\n reject(result);\n workerTerminate(\"ERROR\");\n break;\n }\n };\n newWorker.onerror = (e) => {\n const { reject = () => {\n } } = promise.value;\n reject(e);\n workerTerminate(\"ERROR\");\n };\n if (timeout) {\n timeoutId.value = setTimeout(() => workerTerminate(\"TIMEOUT_EXPIRED\"), timeout);\n }\n return newWorker;\n };\n const callWorker = (...fnArgs) => new Promise((resolve, reject) => {\n promise.value = {\n resolve,\n reject\n };\n worker.value && worker.value.postMessage([[...fnArgs]]);\n workerStatus.value = \"RUNNING\";\n });\n const workerFn = (...fnArgs) => {\n if (workerStatus.value === \"RUNNING\") {\n console.error(\"[useWebWorkerFn] You can only run one instance of the worker at a time.\");\n return Promise.reject();\n }\n worker.value = generateWorker();\n return callWorker(...fnArgs);\n };\n return {\n workerFn,\n workerStatus,\n workerTerminate\n };\n};\n\nfunction useWindowFocus({ window = defaultWindow } = {}) {\n if (!window)\n return ref(false);\n const focused = ref(window.document.hasFocus());\n useEventListener(window, \"blur\", () => {\n focused.value = false;\n });\n useEventListener(window, \"focus\", () => {\n focused.value = true;\n });\n return focused;\n}\n\nfunction useWindowScroll({ window = defaultWindow } = {}) {\n if (!window) {\n return {\n x: ref(0),\n y: ref(0)\n };\n }\n const x = ref(window.pageXOffset);\n const y = ref(window.pageYOffset);\n useEventListener(\"scroll\", () => {\n x.value = window.pageXOffset;\n y.value = window.pageYOffset;\n }, {\n capture: false,\n passive: true\n });\n return { x, y };\n}\n\nfunction useWindowSize({ window = defaultWindow, initialWidth = Infinity, initialHeight = Infinity } = {}) {\n const width = ref(initialWidth);\n const height = ref(initialHeight);\n const update = () => {\n if (window) {\n width.value = window.innerWidth;\n height.value = window.innerHeight;\n }\n };\n update();\n tryOnMounted(update);\n useEventListener(\"resize\", update, { passive: true });\n return { width, height };\n}\n\nexport { DefaultMagicKeysAliasMap, StorageSerializers, SwipeDirection, TransitionPresets, asyncComputed, autoResetRef, breakpointsAntDesign, breakpointsBootstrapV5, breakpointsQuasar, breakpointsSematic, breakpointsTailwind, breakpointsVuetify, computedInject, createFetch, createUnrefFn, defaultDocument, defaultLocation, defaultNavigator, defaultWindow, getSSRHandler, onClickOutside, onKeyDown, onKeyPressed, onKeyStroke, onKeyUp, onLongPress, onStartTyping, setSSRHandler, templateRef, unrefElement, useActiveElement, useAsyncQueue, useAsyncState, useBase64, useBattery, useBreakpoints, useBroadcastChannel, useBrowserLocation, useCached, useClamp, useClipboard, useColorMode, useConfirmDialog, useCssVar, useCycleList, useDark, useDebouncedRefHistory, useDeviceMotion, useDeviceOrientation, useDevicePixelRatio, useDevicesList, useDisplayMedia, useDocumentVisibility, useDraggable, useElementBounding, useElementByPoint, useElementHover, useElementSize, useElementVisibility, useEventBus, useEventListener, useEventSource, useEyeDropper, useFavicon, useFetch, useFocus, useFocusWithin, useFps, useFullscreen, useGeolocation, useIdle, useInfiniteScroll, useIntersectionObserver, useKeyModifier, useLocalStorage, useMagicKeys, useManualRefHistory, useMediaControls, useMediaQuery, useMemoize, useMemory, useMounted, useMouse, useMouseInElement, useMousePressed, useMutationObserver, useNavigatorLanguage, useNetwork, useNow, useOffsetPagination, useOnline, usePageLeave, useParallax, usePermission, usePointer, usePointerSwipe, usePreferredColorScheme, usePreferredDark, usePreferredLanguages, useRafFn, useRefHistory, useResizeObserver, useScreenSafeArea, useScriptTag, useScroll, useScrollLock, useSessionStorage, useShare, useSpeechRecognition, useSpeechSynthesis, useStorage, useStorageAsync, useStyleTag, useSwipe, useTemplateRefsList, useTextSelection, useThrottledRefHistory, useTimeAgo, useTimestamp, useTitle, useTransition, useUrlSearchParams, useUserMedia, useVModel, useVModels, useVibrate, useVirtualList, useWakeLock, useWebNotification, useWebSocket, useWebWorker, useWebWorkerFn, useWindowFocus, useWindowScroll, useWindowSize };\n","<template>\n <el-button text @click=\"modelShow = true\" title=\"颜色\">\n <el-icon :size=\"20\">\n <color-wand-icon></color-wand-icon>\n </el-icon>\n </el-button>\n <el-dialog \n v-model=\"modelShow\" \n :show-close=\"false\" \n width=\"90%\"\n class=\"theme-color-dialog\"\n >\n <div class=\"go-system-color-setting\">\n <div class=\"header-row\">\n <h3 class=\"title\">主题颜色选择</h3>\n <el-icon :size=\"20\" class=\"go-cursor-pointer\" @click=\"modelShow = false\">\n <close-icon></close-icon>\n </el-icon>\n </div>\n <el-divider></el-divider>\n <div class=\"model-content\" ref=\"contentLeftRef\">\n <div class=\"content-left\" v-if=\"modelShow\">\n <color-list :designColor=\"designColorSplit\" @colorSelectHandle=\"colorSelectHandle\"></color-list>\n </div>\n <div class=\"content-right\">\n <div class=\"color-name-detail\">\n <span v-if=\"appThemeDetail\" class=\"color-name\">{{ appThemeDetail.name }}</span>\n <span v-else class=\"color-name\">中国色</span>\n <span\n v-if=\"appThemeDetail\"\n class=\"color-name-Pinyin\"\n >{{ appThemeDetail.pinyin.toUpperCase() }}</span>\n <div\n v-if=\"appThemeDetail\"\n class=\"select-color\"\n :style=\"{ backgroundColor: designStore.appTheme }\"\n ></div>\n </div>\n <img :src=\"themeColorLogo\" />\n </div>\n </div>\n <div class=\"model-footer\">\n 中国色列表来自于:\n <el-link href=\"http://zhongguose.com\" target=\"_blank\">http://zhongguose.com</el-link>\n </div>\n </div>\n </el-dialog>\n</template>\n\n<script lang=\"ts\" setup>\nimport { ref, computed, watch, toRefs } from 'vue'\nimport { useDesignStore } from '@core/store/modules/designStore/designStore'\nimport { AppThemeColorType } from '@core/store/modules/designStore/designStore.d'\nimport { icon } from '@core/plugins'\nimport themeColorLogo from '@core/assets/images/exception/theme-color.png'\nimport { loadAsyncComponent } from '@core/utils'\nimport { useScroll } from '@vueuse/core'\nimport designColor from '@core/settings/designColor.json'\n\nconst ColorList = loadAsyncComponent(() =>\n import('./components/ColorList.vue')\n)\nconst { ColorWandIcon, CloseIcon } = icon.ionicons5\n\nlet splitNumber = 50\n\nconst designStore = useDesignStore()\nconst modelShow = ref(false)\nconst contentLeftRef = ref<HTMLElement | null>(null)\nconst designColorSplit = ref(designColor.slice(0, splitNumber))\n\nconst { arrivedState } = useScroll(contentLeftRef, {\n offset: { bottom: 200 },\n})\nconst { bottom } = toRefs(arrivedState)\n\nconst appThemeDetail = computed(() => {\n return designStore.getAppThemeDetail\n})\n\nconst colorSelectHandle = (color: AppThemeColorType) => {\n designStore.setAppColor(color)\n}\n\nwatch(() => bottom.value, (newData: boolean) => {\n if (newData) {\n splitNumber = splitNumber + 50\n designColorSplit.value = designColor.slice(0, splitNumber)\n }\n})\n\nwatch(() => modelShow.value, (modelShow: boolean) => {\n if (!modelShow) {\n splitNumber = 50\n }\n})\n</script>\n\n<style lang=\"scss\" scoped>\n$height: 85vh;\n@include go(\"system-color-setting\") {\n position: relative;\n display: flex;\n flex-direction: column;\n width: 100%;\n height: $height;\n overflow: hidden;\n \n .header-row {\n display: flex;\n justify-content: space-between;\n align-items: center;\n }\n \n .title {\n margin: 0;\n }\n .model-content {\n flex: 1;\n height: calc(#{$height} - 40px - 48px - 36px);\n overflow: auto;\n /* 右侧 */\n .content-right {\n position: absolute;\n display: flex;\n align-items: center;\n justify-content: flex-end;\n width: 300px;\n height: 100%;\n right: 50px;\n top: 0px;\n .color-name-detail {\n display: flex;\n flex-direction: column;\n align-items: center;\n margin-right: 40px;\n .go-flex-items-center {\n flex-direction: column;\n }\n .select-color {\n margin-top: 20px;\n width: 100px;\n height: 20px;\n border-radius: 3px;\n background-image: url(\"@core/assets/images/exception/texture.png\");\n }\n .color-name {\n font-family: serif;\n font-size: 80px;\n color: var(--el-text-color-primary);\n margin: 0 auto;\n display: block;\n width: 110px;\n text-align: center;\n background-position: center top;\n background-repeat: no-repeat;\n }\n .color-name-Pinyin {\n text-align: center;\n font-family: Georgia;\n font-size: 16px;\n color: var(--el-text-color-secondary);\n }\n }\n }\n }\n .model-footer {\n z-index: 1;\n text-align: end;\n }\n}\n</style>\n\n<style lang=\"scss\">\n.theme-color-dialog {\n min-width: 1000px;\n \n .el-dialog__header {\n display: none;\n }\n \n .el-dialog__body {\n padding: 20px 25px;\n @extend .go-background-filter;\n border-radius: 15px;\n }\n}\n</style>\n","<template>\n <el-header class=\"go-header\" style=\"border-bottom: 1px solid var(--el-border-color);\">\n <header class=\"go-header-box\">\n <div class=\"header-item left\">\n <el-space>\n <slot name=\"left\"></slot>\n </el-space>\n </div>\n <div class=\"header-item center\">\n <slot name=\"center\"></slot>\n </div>\n <div class=\"header-item right\">\n <el-space>\n <slot name=\"ri-left\"> </slot>\n <go-lang-select></go-lang-select>\n <theme-color-select></theme-color-select>\n <go-theme-select></go-theme-select>\n <slot name=\"ri-right\"> </slot>\n </el-space>\n </div>\n </header>\n </el-header>\n</template>\n\n<script setup lang=\"ts\">\nimport { GoThemeSelect } from '@core/components/GoThemeSelect'\nimport { GoLangSelect } from '@core/components/GoLangSelect'\nimport { ThemeColorSelect } from '@core/components/Pages/ThemeColorSelect'\n</script>\n\n<style lang=\"scss\" scoped>\n@include go(header) {\n &-box {\n display: flex;\n justify-content: space-between;\n .header-item {\n display: flex;\n align-items: center;\n &.left {\n justify-content: start;\n }\n &.center {\n justify-content: center;\n }\n &.right {\n justify-content: end;\n }\n }\n height: $--header-height;\n padding: 0 20px 0 60px;\n }\n}\n</style>\n","<template>\n <layout-header>\n <template #left>\n <slot name=\"left\"></slot>\n </template>\n <template #center>\n <slot name=\"center\"></slot>\n </template>\n <template #ri-left>\n <slot name=\"ri-left\"></slot>\n </template>\n <template #ri-right>\n <slot name=\"ri-right\"></slot>\n </template>\n </layout-header>\n</template>\n<script setup lang=\"ts\">\nimport { LayoutHeader } from '@core/layout/components/LayoutHeader'\n</script>\n","import { ref, nextTick, toRaw } from 'vue'\nimport { useChartEditStore } from '@core/store/modules/chartEditStore/chartEditStore'\nimport { CreateComponentType, CreateComponentGroupType } from '@core/packages/index.d'\nimport { renderIcon, loadingError } from '@core/utils'\nimport { icon } from '@core/plugins'\nimport { MenuOptionsItemType } from './useContextMenu.hook.d'\nimport { MenuEnum } from '@core/enums/editPageEnum'\nimport cloneDeep from 'lodash/cloneDeep'\n\nconst {\n CopyIcon,\n CutIcon,\n ClipboardOutlineIcon,\n TrashIcon,\n ChevronDownIcon,\n ChevronUpIcon,\n LockOpenOutlineIcon,\n LockClosedOutlineIcon,\n EyeOutlineIcon,\n EyeOffOutlineIcon\n} = icon.ionicons5\nconst { UpToTopIcon, DownToBottomIcon, PaintBrushIcon, Carbon3DSoftwareIcon, Carbon3DCursorIcon } = icon.carbon\n\n/**\n * 分割线\n * @param {number} n > 2\n * @returns\n */\nexport const divider = (n: number = 3) => {\n return {\n type: 'divider',\n key: `d${n}`\n }\n}\n\n// * 默认单组件选项(使用函数返回以延迟获取store)\nexport const getDefaultOptions = (): MenuOptionsItemType[] => {\n const chartEditStore = useChartEditStore()\n return [\n {\n label: '锁定',\n key: MenuEnum.LOCK,\n icon: renderIcon(LockClosedOutlineIcon),\n fnHandle: chartEditStore.setLock\n },\n {\n label: '解锁',\n key: MenuEnum.UNLOCK,\n icon: renderIcon(LockOpenOutlineIcon),\n fnHandle: chartEditStore.setUnLock\n },\n {\n label: '隐藏',\n key: MenuEnum.HIDE,\n icon: renderIcon(EyeOffOutlineIcon),\n fnHandle: chartEditStore.setHide\n },\n {\n label: '显示',\n key: MenuEnum.SHOW,\n icon: renderIcon(EyeOutlineIcon),\n fnHandle: chartEditStore.setShow\n },\n {\n type: 'divider',\n key: 'd0'\n },\n {\n label: '复制',\n key: MenuEnum.COPY,\n icon: renderIcon(CopyIcon),\n fnHandle: chartEditStore.setCopy\n },\n {\n label: '剪切',\n key: MenuEnum.CUT,\n icon: renderIcon(CutIcon),\n fnHandle: chartEditStore.setCut\n },\n {\n label: '粘贴',\n key: MenuEnum.PARSE,\n icon: renderIcon(ClipboardOutlineIcon),\n fnHandle: chartEditStore.setParse\n },\n {\n type: 'divider',\n key: 'd1'\n },\n {\n label: '置顶',\n key: MenuEnum.TOP,\n icon: renderIcon(UpToTopIcon),\n fnHandle: chartEditStore.setTop\n },\n {\n label: '置底',\n key: MenuEnum.BOTTOM,\n icon: renderIcon(DownToBottomIcon),\n fnHandle: chartEditStore.setBottom\n },\n {\n label: '上移',\n key: MenuEnum.UP,\n icon: renderIcon(ChevronUpIcon),\n fnHandle: chartEditStore.setUp\n },\n {\n label: '下移',\n key: MenuEnum.DOWN,\n icon: renderIcon(ChevronDownIcon),\n fnHandle: chartEditStore.setDown\n },\n {\n type: 'divider',\n key: 'd2'\n },\n {\n label: '清空剪贴板',\n key: MenuEnum.CLEAR,\n icon: renderIcon(PaintBrushIcon),\n fnHandle: chartEditStore.setRecordChart\n },\n {\n label: '删除',\n key: MenuEnum.DELETE,\n icon: renderIcon(TrashIcon),\n fnHandle: chartEditStore.removeComponentList\n }\n ]\n}\n\n// * 默认多选组件选项(使用函数返回以延迟获取store)\nexport const getDefaultMultiSelectOptions = (): MenuOptionsItemType[] => {\n const chartEditStore = useChartEditStore()\n return [\n {\n label: '创建分组',\n key: MenuEnum.GROUP,\n icon: renderIcon(Carbon3DSoftwareIcon),\n fnHandle: chartEditStore.setGroup\n },\n {\n label: '解除分组',\n key: MenuEnum.UN_GROUP,\n icon: renderIcon(Carbon3DCursorIcon),\n fnHandle: chartEditStore.setUnGroup\n }\n ]\n}\n\n// * 无数据传递拥有的选项\nconst defaultNoItemKeys = [MenuEnum.PARSE, MenuEnum.CLEAR]\n\n/**\n * * 挑选选项\n * @param options\n * @param pickList\n * @returns\n */\nconst pickOption = (options: MenuOptionsItemType[], pickList?: MenuEnum[]) => {\n if (!pickList) return options\n const list: MenuOptionsItemType[] = []\n pickList.forEach(e => {\n list.push(...options.filter(op => op.key === e))\n })\n return list\n}\n\n/**\n * * 去除选项\n * @param options\n * @param hideList\n * @returns\n */\nconst hideOption = (options: MenuOptionsItemType[], hideList?: MenuEnum[]) => {\n if (!hideList) return options\n return options.filter((op: MenuOptionsItemType) => {\n return hideList.findIndex((e: MenuEnum) => e !== op.key) !== -1\n })\n}\n\n// * 右键内容\nconst menuOptions = ref<MenuOptionsItemType[]>([])\n\n// * 右键处理\nconst handleContextMenu = (\n e: MouseEvent,\n // 右键对象\n targetInstance?: CreateComponentType | CreateComponentGroupType,\n // 判断函数\n optionsHandle?: Function,\n // 隐藏选项列表\n hideOptionsList?: MenuEnum[],\n // 挑选选项列表\n pickOptionsList?: MenuEnum[]\n) => {\n e.stopPropagation()\n e.preventDefault()\n\n const chartEditStore = useChartEditStore()\n const defaultOptions = getDefaultOptions()\n const defaultMultiSelectOptions = getDefaultMultiSelectOptions()\n\n let target = e.target\n while (target instanceof SVGElement) {\n target = target.parentNode\n }\n\n chartEditStore.setTargetSelectChart(targetInstance && targetInstance.id)\n\n // 隐藏旧列表\n chartEditStore.setRightMenuShow(false)\n\n // * 多选默认选项\n if (chartEditStore.getTargetChart.selectId.length > 1) {\n menuOptions.value = defaultMultiSelectOptions\n } else {\n // * 单选默认选项\n menuOptions.value = defaultOptions\n }\n\n if (!targetInstance) {\n menuOptions.value = pickOption(toRaw(menuOptions.value), defaultNoItemKeys)\n }\n if (hideOptionsList) {\n menuOptions.value = hideOption([...defaultMultiSelectOptions, divider(), ...defaultOptions], hideOptionsList)\n }\n if (pickOptionsList) {\n menuOptions.value = pickOption([...defaultMultiSelectOptions, divider(), ...defaultOptions], pickOptionsList)\n }\n if (optionsHandle) {\n // 自定义函数能够拿到当前选项和所有选项\n menuOptions.value = optionsHandle(\n cloneDeep(toRaw(menuOptions.value)),\n [...defaultMultiSelectOptions, ...defaultOptions],\n targetInstance\n )\n }\n nextTick().then(() => {\n chartEditStore.setMousePosition(e.clientX, e.clientY)\n chartEditStore.setRightMenuShow(true)\n })\n}\n\n/**\n * * 右键hook\n * @param menuConfig\n * @returns\n */\nexport const useContextMenu = () => {\n const chartEditStore = useChartEditStore()\n const defaultOptions = getDefaultOptions()\n const defaultMultiSelectOptions = getDefaultMultiSelectOptions()\n \n // 设置默认项\n menuOptions.value = defaultOptions\n\n // * 失焦\n const onClickOutSide = () => {\n chartEditStore.setRightMenuShow(false)\n }\n\n // * 事件处理\n const handleMenuSelect = (key: string) => {\n chartEditStore.setRightMenuShow(false)\n const targetItem: MenuOptionsItemType[] = menuOptions.value.filter((e: MenuOptionsItemType) => e.key === key)\n\n menuOptions.value.forEach((e: MenuOptionsItemType) => {\n if (e.key === key) {\n if (e.fnHandle) {\n e.fnHandle()\n return\n }\n if (!targetItem) loadingError()\n }\n })\n }\n\n return {\n menuOptions,\n defaultOptions,\n defaultMultiSelectOptions,\n handleContextMenu,\n onClickOutSide,\n handleMenuSelect,\n mousePosition: chartEditStore.getMousePosition\n }\n}\n","<template>\n <!-- 工作台相关 -->\n <div class=\"go-chart\">\n <el-container class=\"chart-layout\">\n <el-header class=\"chart-header\" height=\"auto\">\n <layout-header-pro>\n <template #left>\n <slot name=\"left\">\n <header-left-btn></header-left-btn>\n </slot>\n </template>\n <template #center>\n <slot name=\"center\">\n <header-title></header-title>\n </slot>\n </template>\n <template #ri-left>\n <slot name=\"ri-left\">\n <header-right-btn></header-right-btn>\n </slot>\n </template>\n </layout-header-pro>\n </el-header>\n <el-main class=\"chart-main\">\n <content-charts></content-charts>\n <content-layers></content-layers>\n <content-configurations></content-configurations>\n </el-main>\n </el-container>\n </div>\n <!-- 右键 -->\n <div v-show=\"chartEditStore.getRightMenuShow\" ref=\"dropdownRef\" class=\"context-menu\"\n :style=\"{ left: mousePosition.x + 'px', top: mousePosition.y + 'px' }\" v-click-outside=\"onClickOutSide\">\n <el-menu @select=\"handleMenuSelect\">\n <template v-for=\"item in menuOptionsWithChildren\" :key=\"item.key\">\n <!-- 分割线 -->\n <el-divider v-if=\"item.type === 'divider'\" class=\"menu-divider\" />\n <!-- 普通菜单项 -->\n <el-menu-item v-else-if=\"!item.children || !item.children.length\" :index=\"item.key\">\n <el-icon v-if=\"item.icon\">\n <component :is=\"item.icon\" />\n </el-icon>\n <span>{{ item.label }}</span>\n </el-menu-item>\n <!-- 子菜单 -->\n <el-sub-menu v-else :index=\"item.key\">\n <template #title>\n <el-icon v-if=\"item.icon\">\n <component :is=\"item.icon\" />\n </el-icon>\n <span>{{ item.label }}</span>\n </template>\n <el-menu-item v-for=\"child in item.children || []\" :key=\"child.key\" :index=\"child.key\">\n <el-icon v-if=\"child.icon\">\n <component :is=\"child.icon\" />\n </el-icon>\n <span>{{ child.label }}</span>\n </el-menu-item>\n </el-sub-menu>\n </template>\n </el-menu>\n </div>\n <!-- 加载蒙层 -->\n <content-load></content-load>\n</template>\n\n<script setup lang=\"ts\">\nimport { computed, ref } from 'vue'\nimport { ClickOutside as vClickOutside } from 'element-plus'\nimport { loadAsyncComponent } from '@core/utils'\nimport { LayoutHeaderPro } from '@core/layout/components/LayoutHeaderPro'\nimport { useContextMenu } from './hooks/useContextMenu.hook'\nimport { useChartEditStore } from '@core/store/modules/chartEditStore/chartEditStore'\nimport { useChartHistoryStore } from '@core/store/modules/chartHistoryStore/chartHistoryStore'\nimport type { MenuOptionsItemType } from './hooks/useContextMenu.hook.d'\n\nconst chartHistoryStoreStore = useChartHistoryStore()\nconst chartEditStore = useChartEditStore()\n\n// 记录初始化\nchartHistoryStoreStore.canvasInit(chartEditStore.getEditCanvas)\n\nconst HeaderLeftBtn = loadAsyncComponent(() => import('./ContentHeader/headerLeftBtn/index.vue'))\nconst HeaderRightBtn = loadAsyncComponent(() => import('./ContentHeader/headerRightBtn/index.vue'))\nconst HeaderTitle = loadAsyncComponent(() => import('./ContentHeader/headerTitle/index.vue'))\nconst ContentLayers = loadAsyncComponent(() => import('./ContentLayers/index.vue'))\nconst ContentCharts = loadAsyncComponent(() => import('./ContentCharts/index.vue'))\nconst ContentEdit = loadAsyncComponent(() => import('./ContentEdit/index.vue'))\nconst ContentConfigurations = loadAsyncComponent(() => import('./ContentConfigurations/index.vue'))\nconst ContentLoad = loadAsyncComponent(() => import('./ContentLoad/index.vue'))\n\n// 右键\nconst {\n menuOptions,\n onClickOutSide,\n mousePosition,\n handleMenuSelect\n} = useContextMenu()\n\nconst dropdownRef = ref()\n\ntype MenuOptionsItemWithChildren = MenuOptionsItemType & {\n children?: MenuOptionsItemType[]\n}\n\nconst menuOptionsWithChildren = computed<MenuOptionsItemWithChildren[]>(() => {\n return ((menuOptions.value ?? []) as MenuOptionsItemWithChildren[]).filter(\n item => item && typeof item === 'object'\n )\n})\n</script>\n\n<style lang=\"scss\" scoped>\n@include go(\"chart\") {\n height: 100vh;\n width: 100vw;\n overflow: hidden;\n @include background-image(\"background-image\");\n}\n\n.chart-layout {\n height: 100%;\n flex-direction: column;\n}\n\n.chart-header {\n padding: 0;\n}\n\n.chart-main {\n padding: 0;\n overflow: hidden;\n display: flex;\n}\n\n.context-menu {\n position: fixed;\n z-index: 9999;\n background: var(--el-bg-color);\n border: 1px solid var(--el-border-color);\n border-radius: 4px;\n box-shadow: var(--el-box-shadow-light);\n padding: 4px 0;\n\n .menu-divider {\n margin: 4px 8px;\n }\n\n :deep(.el-menu) {\n border: none;\n background: transparent;\n\n .el-menu-item,\n .el-sub-menu__title {\n height: 32px;\n line-height: 32px;\n font-size: 12px;\n padding: 0 16px;\n\n .el-icon {\n margin-right: 8px;\n }\n }\n\n .el-menu-item:hover,\n .el-sub-menu__title:hover {\n background-color: var(--el-fill-color-light);\n }\n }\n}\n</style>\n","export enum ChartModeEnum {\n SINGLE = 'single',\n DOUBLE = 'double'\n}\n\nexport enum LayerModeEnum {\n THUMBNAIL = 'thumbnail',\n TEXT = 'text'\n}\n\nexport enum ChartLayoutStoreEnum {\n LAYERS = 'layers',\n CHARTS = 'charts',\n DETAILS = 'details',\n Chart_TYPE = 'chartType',\n LAYER_TYPE = 'layerType',\n PERCENTAGE = 'percentage',\n RE_POSITION_CANVAS = 'rePositionCanvas'\n}\n\nexport interface ChartLayoutType {\n // 图层控制\n [ChartLayoutStoreEnum.LAYERS]: boolean\n // 图表组件\n [ChartLayoutStoreEnum.CHARTS]: boolean\n // 详情设置\n [ChartLayoutStoreEnum.DETAILS]: boolean\n // 组件展示方式\n [ChartLayoutStoreEnum.Chart_TYPE]: ChartModeEnum\n // 层级展示方式\n [ChartLayoutStoreEnum.LAYER_TYPE]: LayerModeEnum\n // 当前正在加载的数量\n [ChartLayoutStoreEnum.PERCENTAGE]: number\n // 是否重置当前画布位置\n [ChartLayoutStoreEnum.RE_POSITION_CANVAS]: boolean\n}\n","import { defineStore } from 'pinia'\r\nimport { ChartLayoutType, LayerModeEnum, ChartModeEnum } from './chartLayoutStore.d'\r\nimport { setLocalStorage, getLocalStorage } from '@core/utils'\r\nimport { StorageEnum } from '@core/enums/storageEnum'\r\nimport { useChartEditStore } from '@core/store/modules/chartEditStore/chartEditStore'\r\n\r\n// 移除模块级别的 store 调用,在需要时才获取\r\n// const chartEditStore = useChartEditStore()\r\n\r\nconst { GO_CHART_LAYOUT_STORE } = StorageEnum\r\n\r\nconst storageChartLayout: Partial<ChartLayoutType> = getLocalStorage(GO_CHART_LAYOUT_STORE)\r\n\r\n// 编辑区域布局和静态设置\r\nexport const useChartLayoutStore = defineStore({\r\n id: 'useChartLayoutStore',\r\n state: (): ChartLayoutType => {\r\n // 合并存储的配置,但强制 details 为 false(默认展开)\r\n const baseState = {\r\n // 图层控制\r\n layers: true,\r\n // 图表组件\r\n charts: true,\r\n // 详情设置(收缩为true)- 默认展开\r\n details: false,\r\n // 组件列表展示类型(默认单列)\r\n chartType: ChartModeEnum.SINGLE,\r\n // 图层类型(默认图片)\r\n layerType: LayerModeEnum.THUMBNAIL,\r\n // 当前加载数量\r\n percentage: 0,\r\n // 是否重置当前画布位置\r\n rePositionCanvas: false,\r\n // 合并存储的配置\r\n ...storageChartLayout,\r\n }\r\n // 强制 details 为 false(默认展开)\r\n baseState.details = false\r\n return baseState\r\n },\r\n getters: {\r\n getLayers(): boolean {\r\n return this.layers\r\n },\r\n getCharts(): boolean {\r\n return this.charts\r\n },\r\n getDetails(): boolean {\r\n return this.details\r\n },\r\n getChartType(): ChartModeEnum {\r\n return this.chartType\r\n },\r\n getLayerType(): LayerModeEnum {\r\n return this.layerType\r\n },\r\n getPercentage(): number {\r\n return this.percentage\r\n },\r\n getRePositionCanvas(): boolean {\r\n return this.rePositionCanvas\r\n }\r\n },\r\n actions: {\r\n setItem<T extends keyof ChartLayoutType, K extends ChartLayoutType[T]>(\r\n key: T,\r\n value: K,\r\n computedScale = true\r\n ): void {\r\n this.$patch(state => {\r\n state[key] = value\r\n })\r\n // 存储本地\r\n setLocalStorage(GO_CHART_LAYOUT_STORE, this.$state)\r\n // 这里需要标记重置画布位置\r\n this.rePositionCanvas = true;\r\n // 重新计算拖拽区域缩放比例\r\n if (computedScale) {\r\n setTimeout(() => {\r\n const chartEditStore = useChartEditStore()\r\n chartEditStore.computedScale()\r\n }, 500)\r\n }\r\n },\r\n setItemUnHandle<T extends keyof ChartLayoutType, K extends ChartLayoutType[T]>(key: T, value: K): void {\r\n this.$patch(state => {\r\n state[key] = value\r\n })\r\n }\r\n }\r\n})\r\n","import { getUUID } from '@core/utils'\nimport { useChartEditStore } from '@core/store/modules/chartEditStore/chartEditStore'\nimport { ChartEditStoreEnum, ChartEditStorage } from '@core/store/modules/chartEditStore/chartEditStore.d'\nimport { useChartHistoryStore } from '@core/store/modules/chartHistoryStore/chartHistoryStore'\nimport { useChartLayoutStore } from '@core/store/modules/chartLayoutStore/chartLayoutStore'\nimport { ChartLayoutStoreEnum } from '@core/store/modules/chartLayoutStore/chartLayoutStore.d'\nimport { ensureRegisteredComponent, createComponent } from '@core/packages/index'\nimport { CreateComponentType, CreateComponentGroupType, ConfigType } from '@core/packages/index.d'\nimport { BaseEvent, EventLife } from '@core/enums/eventEnum'\nimport { PublicGroupConfigClass } from '@core/packages/public/publicConfig'\nimport { MissingComponentConfig } from '@core/packages/components/Informations/Mores/MissingComponent'\nimport merge from 'lodash/merge'\n\n/**\n * * 画布-版本升级对旧数据无法兼容的补丁\n * @param object\n */\nconst canvasVersionUpdatePolyfill = (object: any) => {\n return object\n}\n\n/**\n * * 组件-版本升级对旧数据无法兼容的补丁\n * @param newObject\n * @param sources\n */\nconst componentVersionUpdatePolyfill = (newObject: any, sources: any) => {\n try {\n // 判断是否是组件\n if (sources.id) {\n // 处理事件补丁\n const hasVnodeBeforeMount = 'vnodeBeforeMount' in sources.events\n const hasVnodeMounted = 'vnodeMounted' in sources.events\n\n if (hasVnodeBeforeMount) {\n newObject.events.advancedEvents.vnodeBeforeMount = sources?.events.vnodeBeforeMount\n }\n if (hasVnodeMounted) {\n newObject.events.advancedEvents.vnodeMounted = sources?.events.vnodeMounted\n }\n if (hasVnodeBeforeMount || hasVnodeMounted) {\n sources.events = {\n baseEvent: {\n [BaseEvent.ON_CLICK]: undefined,\n [BaseEvent.ON_DBL_CLICK]: undefined,\n [BaseEvent.ON_MOUSE_ENTER]: undefined,\n [BaseEvent.ON_MOUSE_LEAVE]: undefined\n },\n advancedEvents: {\n [EventLife.VNODE_MOUNTED]: undefined,\n [EventLife.VNODE_BEFORE_MOUNT]: undefined\n },\n interactEvents: []\n }\n }\n return newObject\n }\n } catch (error) {\n return newObject\n }\n}\n\n/**\n * * 合并处理\n * @param newObject 新的模板数据\n * @param sources 新拿到的数据\n * @returns object\n */\nconst componentMerge = (newObject: any, sources: any, notComponent = false) => {\n // 处理组件补丁\n componentVersionUpdatePolyfill(newObject, sources)\n\n // 非组件不处理\n if (notComponent) return merge(newObject, sources)\n // 组件排除 newObject\n const option = sources.option\n if (!option) return merge(newObject, sources)\n\n // 为 undefined 的 sources 来源对象属性将被跳过详见 https://www.lodashjs.com/docs/lodash.merge\n sources.option = undefined\n if (option) {\n return {\n ...merge(newObject, sources),\n option: option\n }\n }\n}\n\nconst buildMissingComponentInstance = async (\n targetComponent: CreateComponentType,\n error: unknown\n) => {\n ensureRegisteredComponent(MissingComponentConfig)\n const missingComponent = await createComponent(MissingComponentConfig)\n const errorMessage = error instanceof Error ? error.message : String(error)\n const originalConfig = { ...(targetComponent.chartConfig || {}) } as Partial<ConfigType>\n\n missingComponent.chartConfig.title = originalConfig.title\n ? `${originalConfig.title}(缺失)`\n : MissingComponentConfig.title\n\n return componentMerge(missingComponent, {\n ...targetComponent,\n key: missingComponent.key,\n chartConfig: missingComponent.chartConfig,\n option: {\n ...missingComponent.option,\n title: '组件缺失',\n message: '当前运行环境未注册该组件,已使用占位组件替代。',\n originalConfig,\n errorMessage,\n suggestion: '请检查扩展包是否已安装并完成注册。'\n }\n })\n}\n\n// 请求处理\nexport const useSync = () => {\n const chartEditStore = useChartEditStore()\n const chartHistoryStore = useChartHistoryStore()\n const chartLayoutStore = useChartLayoutStore()\n /**\n * * 组件动态注册\n * @param projectData 项目数据\n * @param isReplace 是否替换数据\n * @returns\n */\n const updateComponent = async (projectData: ChartEditStorage, isReplace = false, changeId = false) => {\n if (isReplace) {\n // 清除列表\n chartEditStore.componentList = []\n // 清除历史记录\n chartHistoryStore.clearBackStack()\n chartHistoryStore.clearForwardStack()\n }\n // 画布补丁处理\n projectData.editCanvasConfig = canvasVersionUpdatePolyfill(projectData.editCanvasConfig)\n\n // 列表组件注册\n projectData.componentList.forEach(async (e: CreateComponentType | CreateComponentGroupType) => {\n const intComponent = (target: CreateComponentType) => {\n ensureRegisteredComponent(target.chartConfig)\n }\n\n if (e.isGroup) {\n (e as CreateComponentGroupType).groupList.forEach(groupItem => {\n intComponent(groupItem)\n })\n } else {\n intComponent(e as CreateComponentType)\n }\n })\n\n // 创建函数-重新创建是为了处理类种方法消失的问题\n const create = async (\n _componentInstance: CreateComponentType,\n callBack?: (componentInstance: CreateComponentType) => void\n ) => {\n let newComponent: CreateComponentType\n let mergedComponent: CreateComponentType\n try {\n // 补充 class 上的方法\n newComponent = await createComponent(_componentInstance.chartConfig)\n if (_componentInstance.chartConfig.redirectComponent) {\n _componentInstance.chartConfig.dataset && (newComponent.option.dataset = _componentInstance.chartConfig.dataset)\n newComponent.chartConfig.title = _componentInstance.chartConfig.title\n newComponent.chartConfig.chartFrame = _componentInstance.chartConfig.chartFrame\n }\n mergedComponent = componentMerge(newComponent, _componentInstance)\n } catch (error) {\n console.error('[hgdataview] create component failed while sync project', _componentInstance.chartConfig, error)\n mergedComponent = await buildMissingComponentInstance(_componentInstance, error)\n }\n\n if (callBack) {\n if (changeId) {\n callBack(componentMerge(mergedComponent, { ...mergedComponent, id: getUUID() }))\n } else {\n callBack(mergedComponent)\n }\n } else {\n if (changeId) {\n chartEditStore.addComponentList(\n componentMerge(mergedComponent, { ...mergedComponent, id: getUUID() }),\n false,\n true\n )\n } else {\n chartEditStore.addComponentList(mergedComponent, false, true)\n }\n }\n }\n\n // 数据赋值\n for (const key in projectData) {\n // 组件\n if (key === ChartEditStoreEnum.COMPONENT_LIST) {\n let loadIndex = 0\n const listLength = projectData[key].length\n for (const comItem of projectData[key]) {\n // 设置加载数量\n let percentage = parseInt((parseFloat(`${++loadIndex / listLength}`) * 100).toString())\n chartLayoutStore.setItemUnHandle(ChartLayoutStoreEnum.PERCENTAGE, percentage)\n // 判断类型\n if (comItem.isGroup) {\n // 创建分组\n let groupClass = new PublicGroupConfigClass()\n if (changeId) {\n groupClass = componentMerge(groupClass, { ...comItem, id: getUUID() })\n } else {\n groupClass = componentMerge(groupClass, comItem)\n }\n\n // 异步注册子应用\n const targetList: CreateComponentType[] = []\n for (const groupItem of (comItem as CreateComponentGroupType).groupList) {\n await create(groupItem, e => {\n targetList.push(e)\n })\n }\n groupClass.groupList = targetList\n\n // 分组插入到列表\n chartEditStore.addComponentList(groupClass, false, true)\n } else {\n await create(comItem as CreateComponentType)\n }\n if (percentage === 100) {\n // 清除历史记录\n chartHistoryStore.clearBackStack()\n chartHistoryStore.clearForwardStack()\n }\n }\n } else if (key === ChartEditStoreEnum.EDIT_CANVAS_CONFIG || key === ChartEditStoreEnum.REQUEST_GLOBAL_CONFIG) {\n componentMerge(chartEditStore[key], projectData[key], true)\n }\n }\n\n // 清除数量\n chartLayoutStore.setItemUnHandle(ChartLayoutStoreEnum.PERCENTAGE, 0)\n }\n\n return {\n updateComponent\n }\n}\n","<template>\n <div ref=\"rootRef\" class=\"go-view-editor-wrapper hgdataview-root\" :class=\"{ dark: resolvedTheme === 'dark' }\"\n :data-theme=\"resolvedTheme\" :style=\"wrapperStyle\">\n <chart-home>\n <!-- 传递顶部工具栏插槽给 ChartHome -->\n <template #left>\n <slot name=\"header-left\">\n <!-- 默认左侧内容 -->\n </slot>\n </template>\n\n <template #center>\n <slot name=\"header-center\">\n <!-- 默认中间内容 -->\n </slot>\n </template>\n\n <template #ri-left>\n <slot name=\"header-right\">\n </slot>\n </template>\n </chart-home>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { computed, onBeforeUnmount, onMounted, ref, watch, nextTick, toRaw } from 'vue'\nimport ChartHome from '@core/views/chart/index.vue'\nimport { useChartEditStore } from '@core/store/modules/chartEditStore/chartEditStore'\nimport { useDesignStore } from '@core/store/modules/designStore/designStore'\nimport { useSync } from '@core/views/chart/hooks/useSync.hook'\nimport { registerHgDataViewThemeRoot, unregisterHgDataViewThemeRoot } from '@core/utils/style'\nimport { ThemeEnum } from '@core/enums/styleEnum'\nimport html2canvas from 'html2canvas'\n\ninterface Props {\n width?: string | number\n height?: string | number\n /**\n * 主题控制:\n * - 'dark' | 'light':由外部显式指定\n * - 'auto':自动跟随宿主 documentElement 的 data-theme / dark class\n */\n theme?: 'light' | 'dark' | 'auto'\n modelValue?: any // v-model 绑定项目数据\n}\n\ninterface Emits {\n (e: 'update:modelValue', data: any): void\n (e: 'save', data: any): void\n (e: 'change', data: any): void\n}\n\nconst props = withDefaults(defineProps<Props>(), {\n width: '100%',\n height: '100vh',\n theme: 'auto'\n})\n\nconst emit = defineEmits<Emits>()\n\nconst rootRef = ref<HTMLElement | null>(null)\n\nconst chartEditStore = useChartEditStore()\nconst designStore = useDesignStore()\nconst { updateComponent } = useSync()\nconst syncingProjectData = ref(false)\nconst lastProjectDataJson = ref('')\n\nconst getHostTheme = (): 'dark' | 'light' => {\n const e = window.document.documentElement\n const t = e.getAttribute('data-theme')\n if (t === 'dark' || t === 'light') return t\n return e.classList.contains('dark') ? 'dark' : 'light'\n}\n\nconst resolvedTheme = ref<'dark' | 'light'>(props.theme === 'auto' ? getHostTheme() : props.theme)\n\nlet hostThemeObserver: MutationObserver | null = null\nconst setupHostThemeObserver = () => {\n if (hostThemeObserver) return\n hostThemeObserver = new MutationObserver(() => {\n if (props.theme !== 'auto') return\n resolvedTheme.value = getHostTheme()\n })\n hostThemeObserver.observe(window.document.documentElement, {\n attributes: true,\n attributeFilter: ['data-theme', 'class']\n })\n}\n\nconst teardownHostThemeObserver = () => {\n hostThemeObserver?.disconnect()\n hostThemeObserver = null\n}\n\n// 容器样式\nconst wrapperStyle = computed(() => ({\n width: typeof props.width === 'number' ? `${props.width}px` : props.width,\n height: typeof props.height === 'number' ? `${props.height}px` : props.height,\n '--go-view-height': typeof props.height === 'number' ? `${props.height}px` : props.height\n}))\n\n// 同步主题到 designStore\nconst syncThemeToStore = (theme: 'dark' | 'light') => {\n const isDark = theme === 'dark'\n // 直接修改 store 属性以确保响应式更新\n designStore.darkTheme = isDark\n designStore.themeName = isDark ? ThemeEnum.DARK : ThemeEnum.LIGHT\n}\n\n// 监听主题变化(外部显式传入 or auto)\nwatch(\n () => props.theme,\n (newTheme) => {\n if (newTheme === 'auto') {\n resolvedTheme.value = getHostTheme()\n setupHostThemeObserver()\n return\n }\n teardownHostThemeObserver()\n resolvedTheme.value = newTheme\n },\n { immediate: true }\n)\n\n// 主题变更同步到 store(用于内部逻辑读取)\nwatch(\n () => resolvedTheme.value,\n (t) => {\n syncThemeToStore(t)\n },\n { immediate: true }\n)\n\nconst serializeProjectData = (data: any) => JSON.stringify({\n config: data?.config ?? {},\n components: data?.components ?? [],\n requestGlobalConfig: data?.requestGlobalConfig ?? {}\n})\n\n// 获取项目数据\nconst getProjectData = () => ({\n config: chartEditStore.getEditCanvasConfig,\n components: chartEditStore.getComponentList,\n requestGlobalConfig: chartEditStore.getRequestGlobalConfig\n})\n\n// 加载项目数据\nconst loadProjectData = async (data: any) => {\n if (!data) return\n\n const nextProjectData = {\n config: data?.config ?? {},\n components: Array.isArray(data?.components) ? data.components : [],\n requestGlobalConfig: data?.requestGlobalConfig ?? {}\n }\n const nextProjectDataJson = serializeProjectData(nextProjectData)\n\n if (nextProjectDataJson === lastProjectDataJson.value) return\n\n syncingProjectData.value = true\n try {\n await updateComponent(\n {\n editCanvasConfig: nextProjectData.config,\n componentList: nextProjectData.components,\n requestGlobalConfig: nextProjectData.requestGlobalConfig\n } as any,\n true\n )\n chartEditStore.setTargetSelectChart(undefined)\n lastProjectDataJson.value = serializeProjectData(getProjectData())\n } finally {\n syncingProjectData.value = false\n }\n}\n\n// 监听数据变化\nwatch(\n () => props.modelValue,\n async (newData) => {\n if (newData) {\n await loadProjectData(newData)\n }\n },\n { immediate: true, deep: true }\n)\n\n// 监听store变化,触发事件\nwatch(\n () => [chartEditStore.getEditCanvasConfig, chartEditStore.getComponentList],\n () => {\n const projectData = getProjectData()\n const projectDataJson = serializeProjectData(projectData)\n if (syncingProjectData.value || projectDataJson === lastProjectDataJson.value) return\n lastProjectDataJson.value = projectDataJson\n emit('update:modelValue', projectData)\n emit('change', projectData)\n },\n { deep: true }\n)\n\n// 触发画布重新计算尺寸\nconst triggerCanvasResize = () => {\n // 触发 window resize 事件,让 EditRule 组件重新计算尺寸\n window.dispatchEvent(new Event('resize'))\n}\n\n// 初始化\nonMounted(() => {\n if (rootRef.value) {\n registerHgDataViewThemeRoot(rootRef.value)\n }\n\n if (props.theme === 'auto') {\n setupHostThemeObserver()\n }\n\n // 延迟触发 resize,确保 CSS 样式已经生效\n // 使用多次延迟确保在各种情况下都能正确计算\n nextTick(() => {\n triggerCanvasResize()\n setTimeout(() => {\n triggerCanvasResize()\n }, 100)\n setTimeout(() => {\n triggerCanvasResize()\n }, 300)\n })\n})\n\nonBeforeUnmount(() => {\n teardownHostThemeObserver()\n if (rootRef.value) {\n unregisterHgDataViewThemeRoot(rootRef.value)\n }\n})\n\nconst getCoverImage = async () => {\n const range = document.querySelector('.go-edit-range') as HTMLElement | null\n if (!range) return ''\n\n const scaleTemp = chartEditStore.getEditCanvas.scale\n try {\n chartEditStore.setTargetSelectChart(undefined)\n chartEditStore.setScale(1, true)\n await nextTick()\n\n const canvas = await html2canvas(range, {\n backgroundColor: null,\n allowTaint: true,\n useCORS: true\n })\n return canvas.toDataURL('image/png')\n } finally {\n chartEditStore.setScale(scaleTemp, true)\n }\n}\n\n// 暴露给父组件的方法\ndefineExpose({\n // 获取项目数据\n getProjectData,\n // 设置项目数据\n setProjectData: loadProjectData,\n // 清空画布\n clearCanvas: () => {\n chartEditStore.componentList = []\n },\n // 保存项目\n save: () => {\n const data = getProjectData()\n emit('save', data)\n return data\n },\n getCoverImage\n})\n</script>\n\n<style scoped>\n.go-view-editor-wrapper {\n position: relative;\n overflow: hidden;\n width: 100%;\n height: 100%;\n}\n\n/* 覆盖内部组件的 100vh 为容器高度 */\n.go-view-editor-wrapper :deep(.go-chart) {\n height: 100% !important;\n width: 100% !important;\n position: relative !important;\n}\n\n\n.go-view-editor-wrapper :deep(.go-content-box .content) {\n height: 100% !important;\n position: relative !important;\n}\n\n.go-view-editor-wrapper :deep(.go-content-box .content-height-show-top-bottom) {\n height: calc(100% - 40px) !important;\n}\n\n.go-view-editor-wrapper :deep(.go-content-box .content-height-show-both) {\n height: calc(100% - 80px) !important;\n}\n\n.go-view-editor-wrapper :deep(.go-content-box.bg-depth1 > .content),\n.go-view-editor-wrapper :deep(.go-content-box.bg-depth1 > .content.content-height-show-top-bottom) {\n height: calc(100% - 40px) !important;\n}\n\n.go-view-editor-wrapper :deep(.go-content-charts .menu-width-box) {\n height: calc(100% - 40px) !important;\n}\n\n.go-view-editor-wrapper :deep(.layout-container) {\n height: 100% !important;\n position: relative !important;\n}\n\n.go-view-editor-wrapper :deep(.chart-layout) {\n height: 100% !important;\n position: relative !important;\n}\n\n/* 修复底部栏位置 */\n.go-view-editor-wrapper :deep(.go-content-box .bottom) {\n position: absolute;\n bottom: 0;\n left: 0;\n right: 0;\n z-index: 10;\n}\n\n/* 修复画布区域 - 关键修复 */\n.go-view-editor-wrapper :deep(#go-chart-edit-layout) {\n height: 100% !important;\n width: 100% !important;\n min-width: 0 !important;\n position: relative !important;\n flex: 1 !important;\n}\n\n.go-view-editor-wrapper :deep(#go-chart-edit-layout > .content),\n.go-view-editor-wrapper :deep(#go-chart-edit-layout > .content.content-height-show-top-bottom) {\n height: calc(100% - 40px) !important;\n width: 100% !important;\n position: relative !important;\n overflow: visible !important;\n}\n\n.go-view-editor-wrapper :deep(#go-chart-edit-content) {\n position: relative !important;\n /* height: 100% !important; */\n /* width: 100% !important; */\n}\n\n/* 修复标尺和画布容器 - 关键修复 */\n.go-view-editor-wrapper :deep(.go-sketch-rule) {\n position: relative !important;\n width: 100% !important;\n height: 100% !important;\n overflow: hidden !important;\n}\n\n/* 确保 edit-screens 正确显示 */\n.go-view-editor-wrapper :deep(.edit-screens) {\n position: absolute !important;\n top: 0 !important;\n left: 0 !important;\n width: 100% !important;\n height: 100% !important;\n}\n\n/* 修复中间编辑区域 flex 布局 */\n.go-view-editor-wrapper :deep(.go-content-edit) {\n flex: 1 !important;\n width: 100% !important;\n min-width: 0 !important;\n height: 100% !important;\n position: relative !important;\n display: flex !important;\n flex-direction: column !important;\n}\n\n/* 确保 edit-content-box 正确显示 */\n.go-view-editor-wrapper :deep(.edit-content-box) {\n flex: 1 !important;\n height: 100% !important;\n position: relative !important;\n}\n\n/* 修复 chart-main 高度 - 关键修复 */\n.go-view-editor-wrapper :deep(.chart-main) {\n height: calc(100% - 60px) !important;\n flex: 1 !important;\n overflow: hidden !important;\n}\n\n/* 修复 layout-main 高度 - 关键修复 */\n.go-view-editor-wrapper :deep(.layout-main) {\n height: 100% !important;\n flex: 1 !important;\n overflow: hidden !important;\n}\n\n/* 修复 el-main 默认样式 */\n.go-view-editor-wrapper :deep(.el-main) {\n overflow: hidden !important;\n}\n</style>\n\r\n","import { PickCreateComponentType } from '@core/packages/index.d'\nimport { EditCanvasConfigType } from '@core/store/modules/chartEditStore/chartEditStore.d'\n\ntype AttrType = PickCreateComponentType<'attr'>\ntype StatusType = PickCreateComponentType<'status'>\ntype PreviewConfig = PickCreateComponentType<'preview'>\n\n// 设置位置\nexport const getComponentAttrStyle = (attr: AttrType, index: number) => {\n const componentStyle = {\n zIndex: index + 1,\n left: `${attr.x}px`,\n top: `${attr.y}px`\n }\n return componentStyle\n}\n\n// 设置大小\nexport const getSizeStyle = (attr: AttrType, scale?: number) => {\n return {\n width: `${scale ? scale * attr.w : attr.w}px`,\n height: `${scale ? scale * attr.h : attr.h}px`\n }\n}\n\n// 设置状态样式\nexport const getStatusStyle = (attr: StatusType) => {\n return {\n display: attr.hide ? 'none' : 'block'\n }\n}\n\n// 设置预览配置样式\nexport const getPreviewConfigStyle = (previewConfig: PreviewConfig) => {\n const previewStyle: Partial<CSSStyleDeclaration> = {}\n if (previewConfig) {\n if (previewConfig.overFlowHidden) {\n previewStyle.overflow = 'hidden'\n }\n }\n return previewStyle\n}\n\n// 全局样式\nexport const getEditCanvasConfigStyle = (canvas: EditCanvasConfigType) => {\n // 背景\n const computedBackground = canvas.selectColor\n ? { background: canvas.background }\n : {\n background: `url(${canvas.backgroundImage}) center center / cover no-repeat !important`\n }\n return {\n position: 'relative' as const,\n width: canvas.width ? `${canvas.width || 100}px` : '100%',\n height: canvas.height ? `${canvas.height}px` : '100%',\n ...computedBackground\n }\n}\n","import { getSessionStorage } from '@core/utils'\nimport { StorageEnum } from '@core/enums/storageEnum'\nimport { ChartEditStorage } from '@core/store/modules/chartEditStore/chartEditStore.d'\nimport { useChartEditStore } from '@core/store/modules/chartEditStore/chartEditStore'\n\n// 移除模块级别的 store 调用,在需要时才获取\n// const chartEditStore = useChartEditStore()\n\nexport interface ChartEditStorageType extends ChartEditStorage {\n id: string\n}\n\n// 根据路由 id 获取存储数据的信息\nexport const getSessionStorageInfo = () => {\n const urlHash = document.location.hash\n const toPathArray = urlHash.split('/')\n const id = toPathArray && toPathArray[toPathArray.length - 1]\n\n const storageList: ChartEditStorageType[] = getSessionStorage(\n StorageEnum.GO_CHART_STORAGE_LIST\n )\n\n if (storageList) {\n for (let i = 0; i < storageList.length; i++) {\n if (id.toString() === storageList[i]['id']) {\n const { editCanvasConfig, requestGlobalConfig, componentList } = storageList[i]\n const chartEditStore = useChartEditStore()\n chartEditStore.editCanvasConfig = editCanvasConfig\n chartEditStore.requestGlobalConfig = requestGlobalConfig\n chartEditStore.componentList = componentList\n return storageList[i]\n }\n }\n }\n}","// 处理键盘记录\r\nexport const keyRecordHandle = () => {\r\n // 默认赋值\r\n window.$KeyboardActive = {\r\n ctrl: false,\r\n space: false\r\n }\r\n\r\n document.onkeydown = (e: KeyboardEvent) => {\r\n const { keyCode } = e\r\n if (keyCode == 32 && e.target == document.body) e.preventDefault()\r\n\r\n if ([17, 32].includes(keyCode) && window.$KeyboardActive) {\r\n switch (keyCode) {\r\n case 17:\r\n window.$KeyboardActive.ctrl = true\r\n break\r\n case 32:\r\n window.$KeyboardActive.space = true\r\n const previewBoxDom = document.querySelector('.go-preview') as HTMLElement\r\n if (previewBoxDom && previewBoxDom.style.position === 'absolute') {\r\n previewBoxDom.style.cursor = 'move'\r\n }\r\n break\r\n }\r\n }\r\n }\r\n\r\n document.onkeyup = (e: KeyboardEvent) => {\r\n const { keyCode } = e\r\n if (keyCode == 32 && e.target == document.body) e.preventDefault()\r\n\r\n if ([17, 32].includes(keyCode) && window.$KeyboardActive) {\r\n switch (keyCode) {\r\n case 17:\r\n window.$KeyboardActive.ctrl = false\r\n break\r\n case 32:\r\n window.$KeyboardActive.space = false\r\n break\r\n }\r\n }\r\n\r\n const previewBoxDom = document.querySelector('.go-preview') as HTMLElement\r\n if (previewBoxDom) {\r\n previewBoxDom.style.cursor = 'default'\r\n }\r\n }\r\n}\r\n","import throttle from 'lodash/throttle'\n\r\nlet prevMoveXValue = [0, 0]\r\nlet prevMoveYValue = [0, 0]\r\n\r\n// 拖拽处理\r\nexport const dragCanvas = (e: MouseEvent) => {\r\n const previewBoxDom = document.querySelector('.go-preview') as HTMLElement\r\n if (!previewBoxDom || previewBoxDom.style.position !== 'absolute') return\r\n if (!window.$KeyboardActive?.space) return\r\n\r\n e.preventDefault()\r\n e.stopPropagation()\r\n // @ts-ignore\r\n document.activeElement?.blur()\r\n const startX = e.screenX\r\n const startY = e.screenY\r\n\r\n const handleMousemove = throttle((moveEvent: MouseEvent) => {\n const nx = moveEvent.screenX - startX\n const ny = moveEvent.screenY - startY\n\n const [prevMoveX1, prevMoveX2] = prevMoveXValue\n const [prevMoveY1, prevMoveY2] = prevMoveYValue\n\n prevMoveXValue = [prevMoveX2, nx]\n prevMoveYValue = [prevMoveY2, ny]\n\n // 去除小数部分\n if (previewBoxDom) {\n const oldLeft = previewBoxDom.style.left ? Number(previewBoxDom.style.left.split('px')[0]) : 0\n const oldTop = previewBoxDom.style.top ? Number(previewBoxDom.style.top.split('px')[0]) : 0\n previewBoxDom.style.left =\n oldLeft +\n (prevMoveX2 > prevMoveX1 ? Math.abs(prevMoveX2 - prevMoveX1) : -Math.abs(prevMoveX2 - prevMoveX1)) +\n 'px'\n previewBoxDom.style.top =\n oldTop +\n (prevMoveY2 > prevMoveY1 ? Math.abs(prevMoveY2 - prevMoveY1) : -Math.abs(prevMoveY2 - prevMoveY1)) +\n 'px'\n }\n }, 20)\n\n const handleMouseup = () => {\n prevMoveXValue = [0, 0]\n prevMoveYValue = [0, 0]\n handleMousemove.cancel()\n window.removeEventListener('mousemove', handleMousemove)\n window.removeEventListener('mouseup', handleMouseup)\n }\n\n window.addEventListener('mousemove', handleMousemove)\n window.addEventListener('mouseup', handleMouseup)\n}\n","<template>\n <div\n :class=\"animationsClass(groupData.styles.animations)\"\n :style=\"{\n ...getSizeStyle(groupData.attr),\n ...getFilterStyle(groupData.styles),\n }\"\n >\n <div\n class=\"chart-item\"\n v-for=\"item in groupData.groupList\"\n :class=\"animationsClass(item.styles.animations)\"\n :key=\"item.id\"\n :style=\"{\n ...getComponentAttrStyle(item.attr, groupIndex),\n ...getStatusStyle(item.status),\n ...getPreviewConfigStyle(item.preview),\n ...getBlendModeStyle(item.styles) as any\n }\"\n >\n <component\n :is=\"item.chartConfig.chartKey\"\n :id=\"item.id\"\n :chartConfig=\"item\"\n :themeSetting=\"themeSetting\"\n :themeColor=\"themeColor\"\n :style=\"{\n ...getSizeStyle(item.attr),\n ...getFilterStyle(item.styles),\n ...getTransformStyle(item.styles)\n }\"\n v-on=\"useLifeHandler(item)\"\n ></component>\n </div>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { PropType } from 'vue'\nimport { CreateComponentGroupType } from '@core/packages/index.d'\nimport { animationsClass, getFilterStyle, getTransformStyle, getBlendModeStyle } from '@core/utils'\nimport { getSizeStyle, getComponentAttrStyle, getStatusStyle, getPreviewConfigStyle } from '../../utils'\nimport { useLifeHandler } from '@core/hooks'\n\nconst props = defineProps({\n groupData: {\n type: Object as PropType<CreateComponentGroupType>,\n required: true\n },\n themeSetting: {\n type: Object,\n required: true\n },\n themeColor: {\n type: Object,\n required: true\n },\n groupIndex: {\n type: Number,\n required: true\n }\n})\n</script>\n\n<style lang=\"scss\" scoped>\n.chart-item {\n position: absolute;\n}\n</style>\n","<template>\n <div\n class=\"chart-item\"\n :id=\"item.id\"\n v-for=\"(item, index) in chartEditStore.componentList\"\n :class=\"animationsClass(item.styles.animations)\"\n :key=\"item.id\"\n :style=\"{\n ...getComponentAttrStyle(item.attr, index),\n ...getTransformStyle(item.styles),\n ...getStatusStyle(item.status),\n ...getPreviewConfigStyle(item.preview),\n ...getBlendModeStyle(item.styles) as any,\n ...getSizeStyle(item.attr)\n }\"\n >\n <!-- 分组 -->\n <preview-render-group\n v-if=\"item.isGroup\"\n :groupData=\"(item as CreateComponentGroupType)\"\n :groupIndex=\"index\"\n :themeSetting=\"themeSetting\"\n :themeColor=\"themeColor\"\n ></preview-render-group>\n\n <!-- 单组件 -->\n <component\n v-else\n :is=\"item.chartConfig.chartKey\"\n :id=\"item.id\"\n :chartConfig=\"item\"\n :themeSetting=\"themeSetting\"\n :themeColor=\"themeColor\"\n :style=\"{ \n ...getSizeStyle(item.attr),\n ...getFilterStyle(item.styles)\n }\"\n v-on=\"useLifeHandler(item)\"\n ></component>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { PropType, computed, onMounted } from 'vue'\nimport { useChartDataPondFetch } from '@core/hooks'\nimport { ChartEditStorageType } from '../../index.d'\nimport { PreviewRenderGroup } from '../PreviewRenderGroup/index'\nimport { CreateComponentGroupType } from '@core/packages/index.d'\nimport { chartColors } from '@core/settings/chartThemes/index'\nimport { useChartEditStore } from '@core/store/modules/chartEditStore/chartEditStore'\nimport { animationsClass, getFilterStyle, getTransformStyle, getBlendModeStyle, colorCustomMerge } from '@core/utils'\nimport { getSizeStyle, getComponentAttrStyle, getStatusStyle, getPreviewConfigStyle } from '../../utils'\nimport { useLifeHandler } from '@core/hooks'\n\n// 初始化数据池\nconst { initDataPond, clearMittDataPondMap } = useChartDataPondFetch()\nconst chartEditStore = useChartEditStore()\n\n// const props = defineProps({\n// localStorageInfo: {\n// type: Object as PropType<ChartEditStorageType>,\n// required: true\n// }\n// })\n\n// 主题色\nconst themeSetting = computed(() => {\n const chartThemeSetting = chartEditStore.editCanvasConfig.chartThemeSetting\n return chartThemeSetting\n})\n\n// 配置项\nconst themeColor = computed(() => {\n const colorCustomMergeData = colorCustomMerge(chartEditStore.editCanvasConfig.chartCustomThemeColorInfo)\n return colorCustomMergeData[chartEditStore.editCanvasConfig.chartThemeColor]\n})\n\n// 组件渲染结束初始化数据池\nclearMittDataPondMap()\nonMounted(() => {\n initDataPond(useChartEditStore)\n})\n</script>\n\n<style lang=\"scss\" scoped>\n.chart-item {\n position: absolute;\n}\n</style>\n","import { ref } from 'vue'\nimport { ChartEditStorageType } from '../index.d'\nimport { CreateComponentType, CreateComponentGroupType } from '@core/packages/index.d'\nimport { ensureRegisteredComponent } from '@core/packages/index'\n\nexport const useComInstall = (localStorageInfo: ChartEditStorageType) => {\n const show = ref(false)\n\n // 注册组件(一开始无法获取window['$vue'])\n const intervalTiming = setInterval(() => {\n const app = window['$vue']\n if (app?.component) {\n clearInterval(intervalTiming)\n\n const intComponent = (target: CreateComponentType) => {\n ensureRegisteredComponent(target.chartConfig, false)\n }\n\n localStorageInfo.componentList.forEach(async (e: CreateComponentType | CreateComponentGroupType) => {\n if (e.isGroup) {\n (e as CreateComponentGroupType).groupList.forEach(groupItem => {\n intComponent(groupItem)\n })\n } else {\n intComponent(e as CreateComponentType)\n }\n })\n show.value = true\n }\n }, 200)\n\n return {\n show\n }\n}\n","import { ref, provide, onMounted, onUnmounted } from 'vue'\nimport { usePreviewFitScale, usePreviewScrollYScale, usePreviewScrollXScale, usePreviewFullScale } from '@core/hooks/index'\nimport type { ChartEditStorageType } from '../index.d'\nimport { PreviewScaleEnum } from '@core/enums/styleEnum'\n\nexport const SCALE_KEY = 'scale-value'\n\nexport const useScale = (localStorageInfo: ChartEditStorageType) => {\n const entityRef = ref()\n const previewRef = ref()\n const width = ref(localStorageInfo.editCanvasConfig.width)\n const height = ref(localStorageInfo.editCanvasConfig.height)\n const scaleRef = ref({ width: 1, height: 1 })\n\n provide(SCALE_KEY, scaleRef)\n\n const updateScaleRef = (scale: { width: number; height: number }) => {\n // 这里需要解构,保证赋值给scaleRef的为一个新对象\n // 因为scale始终为同一引用\n scaleRef.value = { ...scale }\n }\n\n const updateEntitySize = (scale: { width: number; height: number }) => {\n const dom = entityRef.value\n if (!dom) return\n dom.style.width = `${width.value * scale.width}px`\n dom.style.height = `${height.value * scale.height}px`\n }\n\n // 屏幕适配\n onMounted(() => {\n switch (localStorageInfo.editCanvasConfig.previewScaleType) {\n case PreviewScaleEnum.FIT:\n ;(() => {\n const { calcRate, windowResize, unWindowResize } = usePreviewFitScale(\n width.value as number,\n height.value as number,\n previewRef.value,\n scale => {\n updateEntitySize(scale)\n updateScaleRef(scale)\n }\n )\n calcRate()\n windowResize()\n onUnmounted(() => {\n unWindowResize()\n })\n })()\n break\n case PreviewScaleEnum.SCROLL_Y:\n ;(() => {\n const { calcRate, windowResize, unWindowResize } = usePreviewScrollYScale(\n width.value as number,\n height.value as number,\n previewRef.value,\n scale => {\n updateEntitySize(scale)\n updateScaleRef(scale)\n }\n )\n calcRate()\n windowResize()\n onUnmounted(() => {\n unWindowResize()\n })\n })()\n\n break\n case PreviewScaleEnum.SCROLL_X:\n ;(() => {\n const { calcRate, windowResize, unWindowResize } = usePreviewScrollXScale(\n width.value as number,\n height.value as number,\n previewRef.value,\n scale => {\n updateEntitySize(scale)\n updateScaleRef(scale)\n }\n )\n calcRate()\n windowResize()\n onUnmounted(() => {\n unWindowResize()\n })\n })()\n\n break\n case PreviewScaleEnum.FULL:\n ;(() => {\n const { calcRate, windowResize, unWindowResize } = usePreviewFullScale(\n width.value as number,\n height.value as number,\n previewRef.value,\n scale => {\n updateEntitySize(scale)\n updateScaleRef(scale)\n }\n )\n calcRate()\n windowResize()\n onUnmounted(() => {\n unWindowResize()\n })\n })()\n break\n }\n })\n\n return {\n entityRef,\n previewRef,\n scaleRef\n }\n}\n","import { useChartEditStore } from '@core/store/modules/chartEditStore/chartEditStore'\nimport { ChartEditStoreEnum } from '@core/store/modules/chartEditStore/chartEditStore.d'\nimport type { ChartEditStorageType } from '../index.d'\n\n// store 相关\nexport const useStore = (localStorageInfo: ChartEditStorageType) => {\n const chartEditStore = useChartEditStore()\n chartEditStore.requestGlobalConfig = localStorageInfo[ChartEditStoreEnum.REQUEST_GLOBAL_CONFIG]\n}\n","<template>\n <div :class=\"`go-preview ${chartEditStore.editCanvasConfig.previewScaleType}`\" @mousedown=\"dragCanvas\">\n <!-- 实体区域 -->\n <div ref=\"entityRef\" class=\"go-preview-entity\">\n <!-- 缩放层 -->\n <div ref=\"previewRef\" class=\"go-preview-scale\">\n <!-- 展示层 -->\n <div :style=\"previewRefStyle\" v-if=\"show\">\n <!-- 渲染层 -->\n <preview-render-list></preview-render-list>\n </div>\n </div>\n </div>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { computed } from 'vue'\nimport { PreviewRenderList } from './components/PreviewRenderList'\nimport { getFilterStyle, setTitle } from '@core/utils'\nimport { getEditCanvasConfigStyle, getSessionStorageInfo, keyRecordHandle, dragCanvas } from './utils'\nimport { useComInstall } from './hooks/useComInstall.hook'\nimport { useScale } from './hooks/useScale.hook'\nimport { useStore } from './hooks/useStore.hook'\nimport type { ChartEditStorageType } from './index.d'\nimport { useChartEditStore } from '@core/store/modules/chartEditStore/chartEditStore'\n\n// const localStorageInfo: ChartEditStorageType = getSessionStorageInfo() as ChartEditStorageType\n\nawait getSessionStorageInfo()\nconst chartEditStore = useChartEditStore() as unknown as ChartEditStorageType\n\n// setTitle(`预览-${chartEditStore.editCanvasConfig.projectName}`)\n\nconst previewRefStyle = computed(() => {\n return {\n overflow: 'hidden',\n ...getEditCanvasConfigStyle(chartEditStore.editCanvasConfig),\n ...getFilterStyle(chartEditStore.editCanvasConfig)\n }\n})\n\nuseStore(chartEditStore)\nconst { entityRef, previewRef } = useScale(chartEditStore)\nconst { show } = useComInstall(chartEditStore)\n\n// 开启键盘监听\nkeyRecordHandle()\n</script>\n\n<style lang=\"scss\" scoped>\n@include go('preview') {\n position: relative;\n height: 100%;\n width: 100%;\n @include background-image('background-image');\n &.fit,\n &.full {\n display: flex;\n align-items: center;\n justify-content: center;\n overflow: hidden;\n .go-preview-entity {\n flex: none;\n }\n .go-preview-scale {\n transform-origin: left top;\n }\n }\n &.scrollY {\n overflow-x: hidden;\n overflow-y: auto;\n scrollbar-gutter: stable;\n .go-preview-scale {\n transform-origin: left top;\n }\n }\n &.scrollX {\n overflow-x: auto;\n overflow-y: hidden;\n scrollbar-gutter: stable;\n .go-preview-scale {\n transform-origin: left top;\n }\n }\n .go-preview-entity {\n overflow: hidden;\n position: relative;\n }\n}\n</style>\n","<template>\n <div ref=\"rootRef\" class=\"hgdataview-preview-wrapper hgdataview-root\" :class=\"{ dark: resolvedTheme === 'dark' }\"\n :data-theme=\"resolvedTheme\" :style=\"wrapperStyle\">\n <!-- 直接使用原有的 preview 组件 -->\n <suspense v-if=\"previewReady\">\n <suspense-index :key=\"previewKey\"></suspense-index>\n </suspense>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { computed, nextTick, onBeforeUnmount, onMounted, ref, watch, toRaw } from 'vue'\nimport suspenseIndex from '@core/views/preview/suspenseIndex.vue'\nimport { useChartEditStore } from '@core/store/modules/chartEditStore/chartEditStore'\nimport { useSync } from '@core/views/chart/hooks/useSync.hook'\nimport { registerHgDataViewThemeRoot, unregisterHgDataViewThemeRoot } from '@core/utils/style'\n\ninterface Props {\n width?: string | number\n height?: string | number\n projectData?: any // 项目数据\n autoFit?: boolean // 是否自适应\n scale?: number // 缩放比例\n backgroundColor?: string // 背景色\n /**\n * 主题控制:\n * - 'dark' | 'light':由外部显式指定\n * - 'auto':自动跟随宿主 documentElement 的 data-theme / dark class\n */\n theme?: 'light' | 'dark' | 'auto'\n}\n\nconst props = withDefaults(defineProps<Props>(), {\n width: '100%',\n height: '100%',\n autoFit: true,\n scale: 1,\n backgroundColor: '#000',\n theme: 'auto'\n})\n\nconst rootRef = ref<HTMLElement | null>(null)\nconst previewReady = ref(false)\nconst previewKey = ref(0)\n\n// 使用原有的 store\nconst chartEditStore = useChartEditStore()\nconst { updateComponent } = useSync()\nconst lastProjectDataJson = ref('')\n\nconst getHostTheme = (): 'dark' | 'light' => {\n const e = window.document.documentElement\n const t = e.getAttribute('data-theme')\n if (t === 'dark' || t === 'light') return t\n return e.classList.contains('dark') ? 'dark' : 'light'\n}\n\nconst resolvedTheme = ref<'dark' | 'light'>(props.theme === 'auto' ? getHostTheme() : props.theme)\n\nlet hostThemeObserver: MutationObserver | null = null\nconst setupHostThemeObserver = () => {\n if (hostThemeObserver) return\n hostThemeObserver = new MutationObserver(() => {\n if (props.theme !== 'auto') return\n resolvedTheme.value = getHostTheme()\n })\n hostThemeObserver.observe(window.document.documentElement, {\n attributes: true,\n attributeFilter: ['data-theme', 'class']\n })\n}\n\nconst teardownHostThemeObserver = () => {\n hostThemeObserver?.disconnect()\n hostThemeObserver = null\n}\n\n// 监听主题变化(外部显式传入 or auto)\nwatch(\n () => props.theme,\n (newTheme) => {\n if (newTheme === 'auto') {\n resolvedTheme.value = getHostTheme()\n setupHostThemeObserver()\n return\n }\n teardownHostThemeObserver()\n resolvedTheme.value = newTheme\n },\n { immediate: true }\n)\n\n// 容器样式\nconst wrapperStyle = computed(() => ({\n width: typeof props.width === 'number' ? `${props.width}px` : props.width,\n height: typeof props.height === 'number' ? `${props.height}px` : props.height,\n overflow: 'hidden'\n}))\n\nconst serializeProjectData = (data: any) => JSON.stringify({\n config: data?.config ?? {},\n components: data?.components ?? [],\n requestGlobalConfig: data?.requestGlobalConfig ?? {}\n})\n\n// 监听项目数据变化,更新 store\nwatch(\n () => props.projectData,\n async (newData) => {\n if (newData) {\n previewReady.value = false\n const nextProjectData = {\n config: newData?.config ?? {},\n components: Array.isArray(newData?.components) ? newData.components : [],\n requestGlobalConfig: newData?.requestGlobalConfig ?? {}\n }\n const nextProjectDataJson = serializeProjectData(nextProjectData)\n if (nextProjectDataJson === lastProjectDataJson.value) {\n previewReady.value = true\n return\n }\n\n await updateComponent(\n {\n editCanvasConfig: nextProjectData.config,\n componentList: nextProjectData.components,\n requestGlobalConfig: nextProjectData.requestGlobalConfig\n } as any,\n true\n )\n chartEditStore.setTargetSelectChart(undefined)\n lastProjectDataJson.value = nextProjectDataJson\n previewKey.value += 1\n await nextTick()\n previewReady.value = true\n return\n }\n\n previewReady.value = true\n },\n { immediate: true }\n)\n\nonMounted(() => {\n if (rootRef.value) {\n registerHgDataViewThemeRoot(rootRef.value)\n }\n if (props.theme === 'auto') {\n setupHostThemeObserver()\n }\n})\n\nonBeforeUnmount(() => {\n teardownHostThemeObserver()\n if (rootRef.value) {\n unregisterHgDataViewThemeRoot(rootRef.value)\n }\n})\n</script>\n\n<style scoped>\n.hgdataview-preview-wrapper {\n position: relative;\n width: 100%;\n height: 100%;\n overflow: hidden;\n}\n</style>\n","import type { App } from 'vue'\nimport { setupStore, usePackagesStore } from '@core/store'\nimport { initUserPhotoRegistry } from '@core/packages/components/Photos/Private'\nimport { registerHgDataViewExtension } from '@core/packages'\nimport type { HgDataViewExtension } from '@core/packages'\nimport { registerHgDataViewEngine } from '@core/engines'\nimport type { HgDataViewEngine } from '@core/engines'\n\nexport type HgDataViewRuntimeExtension = HgDataViewExtension | (() => void)\nexport type HgDataViewRuntimeEngine = HgDataViewEngine | (() => void)\n\nexport interface HgDataViewRuntimeOptions {\n engines?: HgDataViewRuntimeEngine[]\n extensions?: HgDataViewRuntimeExtension[]\n}\n\nlet photoRegistryInitialized = false\n\nconst registerRuntimeExtension = (extension: HgDataViewRuntimeExtension) => {\n if (typeof extension === 'function') {\n extension()\n return\n }\n registerHgDataViewExtension(extension)\n}\n\nconst registerRuntimeEngine = (engine: HgDataViewRuntimeEngine) => {\n if (typeof engine === 'function') {\n engine()\n return\n }\n registerHgDataViewEngine(engine)\n}\n\nexport const setupHgDataViewRuntime = (app: App, options: HgDataViewRuntimeOptions = {}) => {\n setupStore(app)\n\n options.engines?.forEach(registerRuntimeEngine)\n options.extensions?.forEach(registerRuntimeExtension)\n\n if (!photoRegistryInitialized) {\n initUserPhotoRegistry()\n photoRegistryInitialized = true\n }\n\n usePackagesStore().initPackagesRegistrySubscription()\n}\n","import type {\n HgDataViewSkill,\n HgDataViewComponentTypeInfo,\n HgDataViewProjectSchema,\n HgDataViewSkillResult,\n HgDataViewCreateComponentInput,\n HgDataViewInsertComponentInput,\n HgDataViewApplyProjectInput,\n HgDataViewPatchProjectInput,\n HgDataViewProjectData\n} from './types'\nimport { usePackagesStore } from '@core/store/modules/packagesStore/packagesStore'\nimport { useChartEditStore } from '@core/store/modules/chartEditStore/chartEditStore'\nimport { useSync } from '@core/views/chart/hooks/useSync.hook'\nimport { createComponent, findComponentConfigByKey } from '@core/packages'\nimport merge from 'lodash/merge'\n\nconst ok = <T>(data: T): HgDataViewSkillResult<T> => ({ ok: true, data })\nconst fail = (error: string): HgDataViewSkillResult => ({ ok: false, error })\n\nconst projectSchema: HgDataViewProjectSchema = {\n type: 'object',\n required: ['config', 'components'],\n properties: {\n config: { type: 'object', description: '画布配置(EditCanvasConfigType)' },\n components: { type: 'array', description: '组件列表(CreateComponentType[])' },\n design: { type: 'object', description: '可选:主题与交互色(例如 appTheme)' }\n }\n}\n\nexport const getHgDataViewSkills = (): HgDataViewSkill[] => {\n const listComponentTypes: HgDataViewSkill<undefined, HgDataViewSkillResult<HgDataViewComponentTypeInfo[]>> = {\n name: 'list_component_types',\n title: '列出可用组件类型',\n description: '返回当前组件库内可用的组件类型清单,用于 AI 选型。',\n inputSchema: {\n type: 'object',\n properties: {},\n additionalProperties: false\n },\n handler: () => {\n const packagesStore = usePackagesStore()\n const list: HgDataViewComponentTypeInfo[] = []\n const packagesList = packagesStore.getPackagesList\n\n Object.keys(packagesList).forEach((pkgName: any) => {\n const group = (packagesList as any)[pkgName] || []\n group.forEach((item: any) => {\n list.push({\n key: item.key,\n title: item.title,\n category: item.category,\n categoryName: item.categoryName,\n package: item.package,\n chartKey: item.chartKey,\n conKey: item.conKey,\n chartFrame: item.chartFrame,\n disabled: item.disabled\n })\n })\n })\n\n return ok(list)\n }\n }\n\n const getProjectSchemaSkill: HgDataViewSkill<undefined, HgDataViewSkillResult<HgDataViewProjectSchema>> = {\n name: 'get_project_schema',\n title: '获取项目 JSON Schema',\n description: '返回项目数据结构的 JSON Schema,供 AI 严格输出使用。',\n inputSchema: {\n type: 'object',\n properties: {},\n additionalProperties: false\n },\n handler: () => ok(projectSchema)\n }\n\n const exportProject: HgDataViewSkill<undefined, HgDataViewSkillResult<HgDataViewProjectData>> = {\n name: 'export_project',\n title: '导出当前项目',\n description: '从 store 导出当前画布项目 JSON。',\n inputSchema: { type: 'object', properties: {}, additionalProperties: false },\n handler: () => {\n const chartEditStore = useChartEditStore()\n return ok({\n config: chartEditStore.getEditCanvasConfig,\n components: chartEditStore.getComponentList\n })\n }\n }\n\n const applyProject: HgDataViewSkill<HgDataViewApplyProjectInput, HgDataViewSkillResult<{ applied: boolean }>> = {\n name: 'apply_project',\n title: '应用项目到编辑器',\n description: '将 project 写入编辑器。replace=true 时会清空并重建组件(推荐)。',\n inputSchema: {\n type: 'object',\n required: ['project'],\n properties: {\n project: projectSchema,\n replace: { type: 'boolean', default: true },\n changeId: { type: 'boolean', default: false }\n }\n },\n handler: async (input) => {\n const chartEditStore = useChartEditStore()\n const { updateComponent } = useSync()\n const project = input?.project\n if (!project?.config || !Array.isArray(project.components)) return fail('project 缺少 config 或 components')\n\n await updateComponent(\n {\n editCanvasConfig: project.config as any,\n componentList: project.components as any,\n requestGlobalConfig: chartEditStore.getRequestGlobalConfig\n } as any,\n input?.replace ?? true,\n input?.changeId ?? false\n )\n return ok({ applied: true })\n }\n }\n\n const createComponentSkill: HgDataViewSkill<HgDataViewCreateComponentInput, HgDataViewSkillResult<any>> = {\n name: 'create_component',\n title: '创建组件(不插入)',\n description: '按组件 key 创建一个组件实例 JSON(不写入画布),用于 AI 先生成再确认。',\n inputSchema: {\n type: 'object',\n required: ['key'],\n properties: {\n key: { type: 'string', description: '组件 key,如 TextCommon / BarCommon / VChartLine 等' },\n title: { type: 'string' },\n x: { type: 'number' },\n y: { type: 'number' },\n w: { type: 'number' },\n h: { type: 'number' },\n option: { type: 'object' },\n request: { type: 'object' }\n }\n },\n handler: async (input) => {\n const found = findComponentConfigByKey(input.key)\n if (!found) return fail(`未找到组件类型 key=${input.key}`)\n\n const instance = await createComponent(found)\n if (input.title) instance.chartConfig.title = input.title\n if (typeof input.x === 'number') instance.attr.x = input.x\n if (typeof input.y === 'number') instance.attr.y = input.y\n if (typeof input.w === 'number') instance.attr.w = input.w\n if (typeof input.h === 'number') instance.attr.h = input.h\n if (input.option && typeof input.option === 'object') merge(instance.option, input.option)\n if (input.request && typeof input.request === 'object') merge(instance.request, input.request)\n\n return ok(instance)\n }\n }\n\n const insertComponentSkill: HgDataViewSkill<HgDataViewInsertComponentInput, HgDataViewSkillResult<{ id: string }>> = {\n name: 'insert_component',\n title: '创建并插入组件',\n description: '按组件 key 创建并直接插入到当前画布。',\n inputSchema: {\n type: 'object',\n required: ['key'],\n properties: {\n key: { type: 'string' },\n title: { type: 'string' },\n x: { type: 'number' },\n y: { type: 'number' },\n w: { type: 'number' },\n h: { type: 'number' },\n option: { type: 'object' },\n request: { type: 'object' },\n select: { type: 'boolean', default: true }\n }\n },\n handler: async (input) => {\n const chartEditStore = useChartEditStore()\n const createRes = await createComponentSkill.handler(input as any, { runtime: { mode: 'editor' } })\n if (!createRes.ok) return createRes as any\n const instance: any = createRes.data\n\n chartEditStore.addComponentList(instance, false, true)\n if (input.select ?? true) chartEditStore.setTargetSelectChart(instance.id)\n return ok({ id: instance.id })\n }\n }\n\n const patchProject: HgDataViewSkill<HgDataViewPatchProjectInput, HgDataViewSkillResult<HgDataViewProjectData>> = {\n name: 'patch_project',\n title: 'Patch 项目 JSON',\n description: '对 project 做深度合并 patch,返回新 project,但不自动应用。',\n inputSchema: {\n type: 'object',\n required: ['project', 'patch'],\n properties: {\n project: projectSchema,\n patch: { type: 'object' }\n }\n },\n handler: (input) => {\n if (!input?.project) return fail('缺少 project')\n const next = merge({}, input.project, input.patch)\n return ok(next)\n }\n }\n\n return [\n listComponentTypes,\n getProjectSchemaSkill,\n exportProject,\n applyProject,\n createComponentSkill,\n insertComponentSkill,\n patchProject\n ]\n}\n","import type { App } from 'vue'\nimport VueLazyLoad from 'vue3-lazyload'\nimport { SketchRule } from 'vue3-sketch-ruler'\nimport { ElMessage, ElMessageBox, ElLoading } from 'element-plus'\nimport HgDataViewEditor from './GoViewEditor.vue'\nimport HgDataViewPreview from './GoViewPreview.vue'\nimport { GoSkeleton } from '@core/components/GoSkeleton'\nimport { GoLoading } from '@core/components/GoLoading'\nimport { requireErrorImg } from '@core/utils'\nimport { setHtmlTheme } from '@core/utils/style'\nimport { setupHgDataViewRuntime } from '../runtime'\nimport type { HgDataViewRuntimeOptions } from '../runtime'\n\nimport './styles/element-plus-dark-scope.css'\nimport 'vue3-sketch-ruler/lib/style.css'\nimport 'animate.css/animate.min.css'\nimport './styles/theme.scss'\n\nexport { HgDataViewEditor, HgDataViewPreview }\nexport * from './skills'\nexport * from '../published/hooks'\nexport * from '../published/store'\nexport * from '../published/utils'\nexport * from '../enums/httpEnum'\n\nexport { registerHgDataViewCustomComponent, registerHgDataViewExtension } from '../packages/registry'\nexport type { HgDataViewCustomComponent, HgDataViewExtension, HgDataViewExtensionComponent } from '../packages/registry'\nexport { registerHgDataViewEngine } from '../engines/registry'\nexport type { HgDataViewEngine } from '../engines/registry'\n\nexport { PublicConfigClass } from '@core/packages/public/publicConfig'\nexport { globalThemeJson, defaultTheme, chartColors, chartColorsSearch } from '@core/settings/chartThemes/index'\nexport { colorCustomMerge, colorGradientCustomMerge } from '@core/utils/style'\n\nexport type { CreateComponentType, CreateComponentGroupType } from '@core/packages/index.d'\nexport type { EditCanvasConfigType } from '@core/store/modules/chartEditStore/chartEditStore.d'\n\nexport const version = '2.0.0'\n\nexport function setTheme(theme: 'dark' | 'light' = 'dark') {\n setHtmlTheme(theme)\n}\n\nfunction initGlobalMethods() {\n window['$message'] = {\n success: (content: string) => ElMessage.success(content),\n error: (content: string) => ElMessage.error(content),\n warning: (content: string) => ElMessage.warning(content),\n info: (content: string) => ElMessage.info(content),\n loading: (content: string) => ElMessage({ message: content, type: 'info', duration: 0 })\n }\n\n window['$dialog'] = {\n warning: (options: any) => {\n ElMessageBox.confirm(options.content || '', options.title || '提示', {\n confirmButtonText: options.positiveText || '确定',\n cancelButtonText: options.negativeText || '取消',\n type: 'warning'\n })\n .then(() => {\n options.onPositiveClick?.()\n })\n .catch(() => {\n options.onNegativeClick?.()\n })\n },\n error: (options: any) => {\n return window['$dialog']?.warning?.(options)\n },\n success: (options: any) => {\n return window['$dialog']?.warning?.(options)\n }\n }\n\n let loadingInstance: ReturnType<typeof ElLoading.service> | null = null\n window['$loading'] = {\n start: () => {\n loadingInstance = ElLoading.service({\n lock: true,\n text: '加载中...',\n background: 'rgba(0, 0, 0, 0.7)'\n })\n },\n finish: () => {\n loadingInstance?.close()\n loadingInstance = null\n },\n error: () => {\n loadingInstance?.close()\n loadingInstance = null\n }\n }\n}\n\nexport function install(\n app: App,\n options?: HgDataViewRuntimeOptions & { theme?: 'dark' | 'light'; applyThemeToHost?: boolean }\n) {\n window['$vue'] = app\n\n setupHgDataViewRuntime(app, options)\n\n if (options?.applyThemeToHost) {\n setTheme(options?.theme || 'dark')\n }\n\n initGlobalMethods()\n\n app.use(VueLazyLoad, {\n error: requireErrorImg()\n })\n\n app.component('GoSkeleton', GoSkeleton)\n app.component('GoLoading', GoLoading)\n app.component('SketchRule', SketchRule)\n\n app.component('HgDataViewEditor', HgDataViewEditor)\n app.component('HgDataViewPreview', HgDataViewPreview)\n}\n\ntype HgDataViewPlugin = {\n install: typeof install\n version: typeof version\n setTheme: typeof setTheme\n HgDataViewEditor: typeof HgDataViewEditor\n HgDataViewPreview: typeof HgDataViewPreview\n}\n\nconst HgDataViewPlugin: HgDataViewPlugin = {\n install,\n version,\n setTheme,\n HgDataViewEditor,\n HgDataViewPreview\n}\n\nexport default HgDataViewPlugin\n"],"names":["MoonIcon","SunnyIcon","icon","designStore","useDesignStore","changeTheme","setHtmlTheme","_createBlock","_component_el_button","_createVNode","_component_el_icon","_unref","global","zh","en","langStorage","getLocalStorage","StorageEnum","langList","LangEnum","createI18n","lang","LanguageIcon","locale","useI18n","langStore","useLangStore","options","handleSelect","key","_component_el_dropdown","_component_el_dropdown_menu","_createElementBlock","_Fragment","_renderList","item","_component_el_dropdown_item","_createTextVNode","_toDisplayString","themeColorLogo","tryOnScopeDispose","fn","getCurrentScope","onScopeDispose","isClient","isString","val","noop","createFilterWrapper","filter","wrapper","args","debounceFilter","ms","timer","maxTimer","invoke","duration","unref","maxDuration","throttleFilter","trailing","leading","lastExec","preventLeading","clear","elapsed","useDebounceFn","useThrottleFn","defaultWindow","useEventListener","target","event","listener","cleanup","stopWatch","watch","el","stop","_global","globalKey","useScroll","element","throttle","idle","onStop","onScroll","offset","eventListenerOptions","x","ref","y","isScrolling","arrivedState","reactive","directions","onScrollEnd","e","onScrollHandler","eventTarget","scrollLeft","scrollTop","_a","_b","__defProp$3","__getOwnPropSymbols$3","__hasOwnProp$3","__propIsEnum$3","__defNormalProp$3","obj","value","__spreadValues$3","a","b","prop","initialRect","ColorList","loadAsyncComponent","ColorWandIcon","CloseIcon","splitNumber","modelShow","contentLeftRef","designColorSplit","designColor","bottom","toRefs","appThemeDetail","computed","colorSelectHandle","color","newData","_component_el_dialog","$event","_createElementVNode","_hoisted_1","_hoisted_2","_cache","_component_el_divider","_openBlock","_hoisted_3","_hoisted_4","_hoisted_5","_hoisted_6","_hoisted_7","_hoisted_8","_normalizeStyle","_hoisted_9","_hoisted_10","_component_el_link","_component_el_header","_component_el_space","_renderSlot","_ctx","GoLangSelect","ThemeColorSelect","GoThemeSelect","LayoutHeader","CopyIcon","CutIcon","ClipboardOutlineIcon","TrashIcon","ChevronDownIcon","ChevronUpIcon","LockOpenOutlineIcon","LockClosedOutlineIcon","EyeOutlineIcon","EyeOffOutlineIcon","UpToTopIcon","DownToBottomIcon","PaintBrushIcon","Carbon3DSoftwareIcon","Carbon3DCursorIcon","divider","n","getDefaultOptions","chartEditStore","useChartEditStore","MenuEnum","renderIcon","getDefaultMultiSelectOptions","defaultNoItemKeys","pickOption","pickList","list","op","hideOption","hideList","menuOptions","handleContextMenu","targetInstance","optionsHandle","hideOptionsList","pickOptionsList","defaultOptions","defaultMultiSelectOptions","toRaw","cloneDeep","nextTick","useContextMenu","targetItem","loadingError","chartHistoryStoreStore","useChartHistoryStore","HeaderLeftBtn","HeaderRightBtn","HeaderTitle","ContentLayers","ContentCharts","ContentConfigurations","ContentLoad","onClickOutSide","mousePosition","handleMenuSelect","dropdownRef","menuOptionsWithChildren","_component_el_container","LayoutHeaderPro","_component_el_main","_component_el_menu","_component_el_menu_item","_resolveDynamicComponent","_component_el_sub_menu","child","_vShow","ChartModeEnum","LayerModeEnum","ChartLayoutStoreEnum","GO_CHART_LAYOUT_STORE","storageChartLayout","useChartLayoutStore","defineStore","baseState","computedScale","state","setLocalStorage","canvasVersionUpdatePolyfill","object","componentVersionUpdatePolyfill","newObject","sources","hasVnodeBeforeMount","hasVnodeMounted","BaseEvent","EventLife","componentMerge","notComponent","merge","option","buildMissingComponentInstance","targetComponent","error","ensureRegisteredComponent","MissingComponentConfig","missingComponent","createComponent","errorMessage","originalConfig","useSync","chartHistoryStore","chartLayoutStore","projectData","isReplace","changeId","intComponent","groupItem","create","_componentInstance","callBack","newComponent","mergedComponent","getUUID","ChartEditStoreEnum","loadIndex","listLength","comItem","percentage","groupClass","PublicGroupConfigClass","targetList","props","__props","emit","__emit","rootRef","updateComponent","syncingProjectData","lastProjectDataJson","getHostTheme","t","resolvedTheme","hostThemeObserver","setupHostThemeObserver","teardownHostThemeObserver","wrapperStyle","syncThemeToStore","theme","isDark","ThemeEnum","newTheme","serializeProjectData","data","getProjectData","loadProjectData","nextProjectData","projectDataJson","triggerCanvasResize","onMounted","registerHgDataViewThemeRoot","onBeforeUnmount","unregisterHgDataViewThemeRoot","__expose","range","scaleTemp","html2canvas","_normalizeClass","ChartHome","getComponentAttrStyle","attr","index","getSizeStyle","scale","getStatusStyle","getPreviewConfigStyle","previewConfig","previewStyle","getEditCanvasConfigStyle","canvas","computedBackground","getSessionStorageInfo","toPathArray","id","storageList","getSessionStorage","i","editCanvasConfig","requestGlobalConfig","componentList","keyRecordHandle","keyCode","previewBoxDom","prevMoveXValue","prevMoveYValue","dragCanvas","startX","startY","handleMousemove","moveEvent","nx","ny","prevMoveX1","prevMoveX2","prevMoveY1","prevMoveY2","oldLeft","oldTop","handleMouseup","animationsClass","getFilterStyle","getBlendModeStyle","_mergeProps","getTransformStyle","_toHandlers","useLifeHandler","initDataPond","clearMittDataPondMap","useChartDataPondFetch","themeSetting","themeColor","colorCustomMerge","PreviewRenderGroup","useComInstall","localStorageInfo","show","intervalTiming","app","SCALE_KEY","useScale","entityRef","previewRef","width","height","scaleRef","provide","updateScaleRef","updateEntitySize","dom","PreviewScaleEnum","calcRate","windowResize","unWindowResize","usePreviewFitScale","onUnmounted","usePreviewScrollYScale","usePreviewScrollXScale","usePreviewFullScale","useStore","__temp","__restore","_withAsyncContext","previewRefStyle","PreviewRenderList","previewReady","previewKey","nextProjectDataJson","_Suspense","suspenseIndex","photoRegistryInitialized","registerRuntimeExtension","extension","registerHgDataViewExtension","registerRuntimeEngine","engine","registerHgDataViewEngine","setupHgDataViewRuntime","setupStore","initUserPhotoRegistry","usePackagesStore","ok","fail","projectSchema","getHgDataViewSkills","listComponentTypes","packagesStore","packagesList","pkgName","getProjectSchemaSkill","exportProject","applyProject","input","project","createComponentSkill","found","findComponentConfigByKey","instance","createRes","next","version","setTheme","initGlobalMethods","content","ElMessage","ElMessageBox","loadingInstance","ElLoading","install","VueLazyLoad","requireErrorImg","GoSkeleton","GoLoading","SketchRule","HgDataViewEditor","HgDataViewPreview","HgDataViewPlugin"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;AAaA,UAAM,EAAE,UAAAA,GAAU,WAAAC,MAAcC,GAAK,WAC/BC,IAAcC,MAGdC,IAAc,MAAM;AACxB,MAAAF,EAAY,YAAY,GACXG;IAAA;;;kBAlBbC,EAKYC,GAAA;AAAA,QALD,MAAA;AAAA,QAAM,SAAOH;AAAA,QAAa,OAAM;AAAA,MAAA;mBACzC,MAGU;AAAA,UAHVI,EAGUC,GAAA,EAHA,MAAM,MAAE;AAAA,uBAChB,MAAoD;AAAA,cAAnCC,EAAAR,CAAA,EAAY,kBAA7BI,EAAoDI,EAAAX,CAAA,GAAA,EAAA,KAAA,GAAA,WACpDO,EAAgCI,EAAAV,CAAA,GAAA,EAAA,KAAA,EAAA,CAAA;AAAA,YAAA;;;;;;;;ICJhCW,KAAS;AAAA,EACb,UAAU;AAAA,EACV,WAAW;AAAA;AAAA,EAEX,KAAK;AAAA,EACL,MAAM;AAAA,EACN,SAAS;AAAA;AAAA,EAET,SAAS;AAAA,EACT,UAAU;AAAA;AAAA,EAEV,QAAQ;AAAA,EACR,WAAW;AAAA,EACX,QAAQ;AAAA,EACR,UAAU;AAAA,EACV,WAAW;AAAA,EACX,aAAa;AAAA,EACb,YAAY;AAAA,EACZ,UAAU;AAAA,EACV,QAAQ;AACV,GAEeC,KAAA;AAAA,EAAA,QACbD;AACF,GCxBMA,KAAS;AAAA,EACb,UAAU;AAAA,EACV,WAAW;AAAA;AAAA,EAEX,KAAK;AAAA,EACL,MAAM;AAAA,EACN,SAAS;AAAA;AAAA,EAET,SAAS;AAAA,EACT,UAAU;AAAA;AAAA,EAEV,QAAQ;AAAA,EACR,WAAW;AAAA,EACX,QAAQ;AAAA,EACR,UAAU;AAAA,EACV,WAAW;AAAA,EACX,aAAa;AAAA,EACb,YAAY;AAAA,EACZ,UAAU;AAAA,EACV,QAAQ;AACV,GAEeE,KAAA;AAAA,EAAA,QACbF;AACF,GCdMG,IAA6BC,GAAgBC,GAAY,aAAa,GAG/DC,KAAW;AAAA,EACtB;AAAA,IACE,OAAO;AAAA,IACP,KAAKC,GAAS;AAAA,EAChB;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,KAAKA,GAAS;AAAA,EAChB;AACF;AAEaC,GAAW;AAAA,EACtB,QAAQ;AAAA,EACR,iBAAgB;AAAA,EAChB,SAAQL,KAAA,gBAAAA,EAAa,SAAQM;AAAA,EAC7B,iBAAgBN,KAAA,gBAAAA,EAAa,SAAQM;AAAA,EACrC,UAAU;AAAA,IACR,CAACF,GAAS,EAAE,GAAGN;AAAA,IACf,CAACM,GAAS,EAAE,GAAGL;AAAA,EACjB;AACF,CAAC;;;;ACFK,UAAA,EAAE,cAAAQ,EAAa,IAAIpB,GAAK,WACxB,EAAE,QAAAqB,MAAWC,MACbC,IAAYC,MACZC,IAAUT,IAEVU,IAAe,CAACC,MAAkB;AACtC,MAAAN,EAAO,QAAQM,GACfJ,EAAU,WAAWI,CAAG;AAAA,IAAA;;;kBArCxBtB,EAoBcuB,GAAA;AAAA,QAnBZ,SAAQ;AAAA,QACP,WAASF;AAAA,MAAA;QAOC,YACT,MAQmB;AAAA,UARnBnB,EAQmBsB,GAAA,MAAA;AAAA,uBANf,MAAuB;AAAA,sBADzBC,EAMmBC,GAAA,MAAAC,GALFvB,EAAOgB,CAAA,GAAA,CAAfQ,YADT5B,EAMmB6B,GAAA;AAAA,gBAJhB,KAAKD,EAAK;AAAA,gBACV,SAASA,EAAK;AAAA,cAAA;2BAEf,MAAgB;AAAA,kBAAbE,GAAAC,EAAAH,EAAK,KAAK,GAAA,CAAA;AAAA,gBAAA;;;;;;;mBAZnB,MAIY;AAAA,UAJZ1B,EAIYD,GAAA,EAJD,MAAA,MAAI;AAAA,uBACb,MAEU;AAAA,cAFVC,EAEUC,GAAA,EAFA,MAAM,MAAE;AAAA,2BAChB,MAA+B;AAAA,kBAA/BD,EAA+BE,EAAAW,CAAA,CAAA;AAAA,gBAAA;;;;;;;;;;;ICPxBiB,KAAA;AC0Kf,SAASC,GAAkBC,GAAI;AAC7B,SAAIC,GAAe,KACjBC,GAAeF,CAAE,GACV,MAEF;AACT;AAyBA,MAAMG,KAAW,OAAO,SAAW,KAU7BC,KAAW,CAACC,MAAQ,OAAOA,KAAQ,UAMnCC,KAAO,MAAM;AACnB;AAOA,SAASC,GAAoBC,GAAQR,GAAI;AACvC,WAASS,KAAWC,GAAM;AACxB,IAAAF,EAAO,MAAMR,EAAG,MAAM,MAAMU,CAAI,GAAG,EAAE,IAAAV,GAAI,SAAS,MAAM,MAAAU,EAAM,CAAA;AAAA,EAC/D;AACD,SAAOD;AACT;AAIA,SAASE,GAAeC,GAAI1B,IAAU,IAAI;AACxC,MAAI2B,GACAC;AA4BJ,SA3Be,CAACC,MAAW;AACzB,UAAMC,IAAWC,GAAML,CAAE,GACnBM,IAAcD,GAAM/B,EAAQ,OAAO;AAGzC,QAFI2B,KACF,aAAaA,CAAK,GAChBG,KAAY,KAAKE,MAAgB,UAAUA,KAAe;AAC5D,aAAIJ,MACF,aAAaA,CAAQ,GACrBA,IAAW,OAENC,EAAM;AAEf,IAAIG,KAAe,CAACJ,MAClBA,IAAW,WAAW,MAAM;AAC1B,MAAID,KACF,aAAaA,CAAK,GACpBC,IAAW,MACXC;IACD,GAAEG,CAAW,IAEhBL,IAAQ,WAAW,MAAM;AACvB,MAAIC,KACF,aAAaA,CAAQ,GACvBA,IAAW,MACXC;IACD,GAAEC,CAAQ;AAAA,EACf;AAEA;AACA,SAASG,GAAeP,GAAIQ,IAAW,IAAMC,IAAU,IAAM;AAC3D,MAAIC,IAAW,GACXT,GACAU,IAAiB,CAACF;AACtB,QAAMG,IAAQ,MAAM;AAClB,IAAIX,MACF,aAAaA,CAAK,GAClBA,IAAQ;AAAA,EAEd;AA4BE,SA3Be,CAACE,MAAW;AACzB,UAAMC,IAAWC,GAAML,CAAE,GACnBa,IAAU,KAAK,IAAG,IAAKH;AAE7B,QADAE,KACIR,KAAY;AACd,aAAAM,IAAW,KAAK,OACTP,EAAM;AAEf,IAAIU,IAAUT,MACZM,IAAW,KAAK,OACZC,IACFA,IAAiB,KAEjBR,MAEAK,MACFP,IAAQ,WAAW,MAAM;AACvB,MAAAS,IAAW,KAAK,OACXD,MACHE,IAAiB,KACnBC,KACAT;IACD,GAAEC,CAAQ,IAET,CAACK,KAAW,CAACR,MACfA,IAAQ,WAAW,MAAMU,IAAiB,IAAMP,CAAQ;AAAA,EAC9D;AAEA;AAqEA,SAASU,GAAc1B,GAAIY,IAAK,KAAK1B,IAAU,CAAA,GAAI;AACjD,SAAOqB,GAAoBI,GAAeC,GAAI1B,CAAO,GAAGc,CAAE;AAC5D;AAyYA,SAAS2B,GAAc3B,GAAIY,IAAK,KAAKQ,IAAW,IAAMC,IAAU,IAAM;AACpE,SAAOd,GAAoBY,GAAeP,GAAIQ,GAAUC,CAAO,GAAGrB,CAAE;AACtE;ACjpBA,MAAM4B,KAAgBzB,KAAW,SAAS;AAK1C,SAAS0B,MAAoBnB,GAAM;AACjC,MAAIoB,GACAC,GACAC,GACA9C;AAOJ,MANIkB,GAASM,EAAK,CAAC,CAAC,KAClB,CAACqB,GAAOC,GAAU9C,CAAO,IAAIwB,GAC7BoB,IAASF,MAET,CAACE,GAAQC,GAAOC,GAAU9C,CAAO,IAAIwB,GAEnC,CAACoB;AACH,WAAOxB;AACT,MAAI2B,IAAU3B;AACd,QAAM4B,IAAYC,GAAM,MAAMlB,GAAMa,CAAM,GAAG,CAACM,MAAO;AAEnD,IADAH,KACKG,MAELA,EAAG,iBAAiBL,GAAOC,GAAU9C,CAAO,GAC5C+C,IAAU,MAAM;AACd,MAAAG,EAAG,oBAAoBL,GAAOC,GAAU9C,CAAO,GAC/C+C,IAAU3B;AAAA,IAChB;AAAA,EACG,GAAE,EAAE,WAAW,IAAM,OAAO,OAAQ,CAAA,GAC/B+B,IAAO,MAAM;AACjB,IAAAH,KACAD;EACJ;AACE,SAAAlC,GAAkBsC,CAAI,GACfA;AACT;AA0nBA,MAAMC,KAAU,OAAO,aAAe,MAAc,aAAa,OAAO,SAAW,MAAc,SAAS,OAAO,SAAW,MAAc,SAAS,OAAO,OAAS,MAAc,OAAO,IAClLC,KAAY;AAClBD,GAAQC,EAAS,IAAID,GAAQC,EAAS,KAAK,CAAA;AA2lD3C,SAASC,GAAUC,GAASvD,IAAU,IAAI;AACxC,QAAM;AAAA,IACJ,UAAAwD,IAAW;AAAA,IACX,MAAAC,IAAO;AAAA,IACP,QAAAC,IAAStC;AAAA,IACT,UAAAuC,IAAWvC;AAAA,IACX,QAAAwC,IAAS;AAAA,MACP,MAAM;AAAA,MACN,OAAO;AAAA,MACP,KAAK;AAAA,MACL,QAAQ;AAAA,IACT;AAAA,IACD,sBAAAC,IAAuB;AAAA,MACrB,SAAS;AAAA,MACT,SAAS;AAAA,IACV;AAAA,EACF,IAAG7D,GACE8D,IAAIC,GAAI,CAAC,GACTC,IAAID,GAAI,CAAC,GACTE,IAAcF,GAAI,EAAK,GACvBG,IAAeC,GAAS;AAAA,IAC5B,MAAM;AAAA,IACN,OAAO;AAAA,IACP,KAAK;AAAA,IACL,QAAQ;AAAA,EACZ,CAAG,GACKC,IAAaD,GAAS;AAAA,IAC1B,MAAM;AAAA,IACN,OAAO;AAAA,IACP,KAAK;AAAA,IACL,QAAQ;AAAA,EACZ,CAAG;AACD,MAAIZ,GAAS;AACX,UAAMc,IAAc7B,GAAc,CAAC8B,MAAM;AACvC,MAAAL,EAAY,QAAQ,IACpBG,EAAW,OAAO,IAClBA,EAAW,QAAQ,IACnBA,EAAW,MAAM,IACjBA,EAAW,SAAS,IACpBV,EAAOY,CAAC;AAAA,IACd,GAAOd,IAAWC,CAAI,GACZc,IAAkB,CAACD,MAAM;AAC7B,YAAME,IAAcF,EAAE,WAAW,WAAWA,EAAE,OAAO,kBAAkBA,EAAE,QACnEG,IAAaD,EAAY;AAC/B,MAAAJ,EAAW,OAAOK,IAAaX,EAAE,OACjCM,EAAW,QAAQK,IAAaX,EAAE,OAClCI,EAAa,OAAOO,KAAc,KAAKb,EAAO,QAAQ,IACtDM,EAAa,QAAQO,IAAaD,EAAY,eAAeA,EAAY,eAAeZ,EAAO,SAAS,IACxGE,EAAE,QAAQW;AACV,YAAMC,IAAYF,EAAY;AAC9B,MAAAJ,EAAW,MAAMM,IAAYV,EAAE,OAC/BI,EAAW,SAASM,IAAYV,EAAE,OAClCE,EAAa,MAAMQ,KAAa,KAAKd,EAAO,OAAO,IACnDM,EAAa,SAASQ,IAAYF,EAAY,gBAAgBA,EAAY,gBAAgBZ,EAAO,UAAU,IAC3GI,EAAE,QAAQU,GACVT,EAAY,QAAQ,IACpBI,EAAYC,CAAC,GACbX,EAASW,CAAC;AAAA,IAChB;AACI,IAAA3B,GAAiBY,GAAS,UAAUC,IAAWf,GAAc8B,GAAiBf,CAAQ,IAAIe,GAAiBV,CAAoB;AAAA;AAEjI,SAAO;AAAA,IACL,GAAAC;AAAA,IACA,GAAAE;AAAA,IACA,aAAAC;AAAA,IACA,cAAAC;AAAA,IACA,YAAAE;AAAA,EACJ;AACA;AAivCA,IAAIO,IAAIC;AASM3D,OAAa,UAAU,QAAgB,OAAO,gBAAgB0D,KAAK,UAAU,OAAO,SAAS,OAAO,cAAc,QAAgBA,GAAG,aAAa,iBAAiB,MAAMC,KAAK,UAAU,OAAO,SAAS,OAAO,cAAc,OAAO,SAASA,GAAG,QAAQ;AAyXtQ,IAAIC,KAAc,OAAO,gBAGrBC,KAAwB,OAAO,uBAC/BC,KAAiB,OAAO,UAAU,gBAClCC,KAAiB,OAAO,UAAU,sBAClCC,KAAoB,CAACC,GAAKhF,GAAKiF,MAAUjF,KAAOgF,IAAML,GAAYK,GAAKhF,GAAK,EAAE,YAAY,IAAM,cAAc,IAAM,UAAU,IAAM,OAAAiF,EAAO,CAAA,IAAID,EAAIhF,CAAG,IAAIiF,GAC1JC,KAAmB,CAACC,GAAGC,MAAM;AAC/B,WAASC,KAAQD,MAAMA,IAAI,CAAA;AACzB,IAAIP,GAAe,KAAKO,GAAGC,CAAI,KAC7BN,GAAkBI,GAAGE,GAAMD,EAAEC,CAAI,CAAC;AACtC,MAAIT;AACF,aAASS,KAAQT,GAAsBQ,CAAC;AACtC,MAAIN,GAAe,KAAKM,GAAGC,CAAI,KAC7BN,GAAkBI,GAAGE,GAAMD,EAAEC,CAAI,CAAC;AAExC,SAAOF;AACT;AAEA,MAAMG,KAAc;AAAA,EAClB,KAAK;AAAA,EACL,MAAM;AAAA,EACN,QAAQ;AAAA,EACR,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,OAAO;AACT;AACqBJ,GAAiB;AAAA,EACpC,MAAM;AACR,GAAGI,EAAW;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;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","x_google_ignoreList":[6,7]}
1
+ {"version":3,"file":"index-71001515.js","sources":["../src/components/GoThemeSelect/index.vue","../src/i18n/zh/index.ts","../src/i18n/en/index.ts","../src/i18n/index.ts","../src/components/GoLangSelect/index.vue","../src/assets/images/exception/theme-color.png","../../../node_modules/.pnpm/@vueuse+shared@7.7.1_vue@3.5.16_typescript@5.4.5_/node_modules/@vueuse/shared/index.mjs","../../../node_modules/.pnpm/@vueuse+core@7.7.1_vue@3.5.16_typescript@5.4.5_/node_modules/@vueuse/core/index.mjs","../src/components/Pages/ThemeColorSelect/index.vue","../src/layout/components/LayoutHeader/index.vue","../src/layout/components/LayoutHeaderPro/index.vue","../src/views/chart/hooks/useContextMenu.hook.ts","../src/views/chart/index.vue","../src/store/modules/chartLayoutStore/chartLayoutStore.d.ts","../src/store/modules/chartLayoutStore/chartLayoutStore.ts","../src/views/chart/hooks/useSync.hook.ts","../src/lib/GoViewEditor.vue","../src/views/preview/utils/style.ts","../src/views/preview/utils/storage.ts","../src/views/preview/utils/keyboard.ts","../src/views/preview/utils/drag.ts","../src/views/preview/components/PreviewRenderGroup/index.vue","../src/views/preview/components/PreviewRenderList/index.vue","../src/views/preview/hooks/useComInstall.hook.ts","../src/views/preview/hooks/useScale.hook.ts","../src/views/preview/hooks/useStore.hook.ts","../src/views/preview/suspenseIndex.vue","../src/lib/GoViewPreview.vue","../src/runtime.ts","../src/lib/skills/registry.ts","../src/lib/index.ts"],"sourcesContent":["<template>\n <el-button text @click=\"changeTheme\" title=\"主题\">\n <el-icon :size=\"20\">\n <moon-icon v-if=\"designStore.darkTheme\"></moon-icon>\n <sunny-icon v-else></sunny-icon>\n </el-icon>\n </el-button>\n</template>\n\n<script lang=\"ts\" setup>\nimport { useDesignStore } from '@core/store/modules/designStore/designStore'\nimport { setHtmlTheme } from '@core/utils'\nimport { icon } from '@core/plugins'\nconst { MoonIcon, SunnyIcon } = icon.ionicons5\nconst designStore = useDesignStore()\n\n// 改变样式\nconst changeTheme = () => {\n designStore.changeTheme()\n setHtmlTheme()\n}\n</script>\n","const global = {\n doc_addr: '文档地址',\n code_addr: '仓库地址',\n // 头部\n doc: '说明文档',\n help: '帮助中心',\n contact: '关于软件',\n // 系统设置\n sys_set: '系统设置',\n lang_set: '语言设置',\n // 功能键\n r_edit: '编辑',\n r_preview: '预览',\n r_copy: '克隆',\n r_rename: '重命名',\n r_publish: '发布',\n r_unpublish: '取消发布',\n r_download: '下载',\n r_delete: '删除',\n r_more: '更多',\n}\n\nexport default {\n global\n}\n","const global = {\n doc_addr: 'Document',\n code_addr: 'Code',\n // header\n doc: 'Document',\n help: 'Help',\n contact: 'About Software',\n // system setting\n sys_set: 'System Setting',\n lang_set: 'Language Setting',\n // right key\n r_edit: 'Edit',\n r_preview: 'Preview',\n r_copy: 'Clone',\n r_rename: 'Rename',\n r_publish: 'Publish',\n r_unpublish: 'Unpublish',\n r_download: 'Download',\n r_delete: 'Delete',\n r_more: 'More',\n}\n\nexport default {\n global\n}\n","//语言\nimport { lang } from '@core/settings/designSetting'\nimport { createI18n } from 'vue-i18n' //引入vue-i18n组件\nimport { getLocalStorage } from '@core/utils'\nimport { StorageEnum }from '@core/enums/storageEnum'\nimport { LangEnum } from '@core/enums/styleEnum'\nimport { LangStateType } from '@core/store/modules/langStore/langStore.d'\nimport zh from './zh/index'\nimport en from './en/index'\n\nconst langStorage: LangStateType = getLocalStorage(StorageEnum.GO_LANG_STORE)\n\n// 语言数组\nexport const langList = [\n {\n label: '中文',\n key: LangEnum.ZH\n },\n {\n label: 'English',\n key: LangEnum.EN\n }\n]\n\nconst i18n = createI18n({\n legacy: false,\n globalInjection:true,\n locale: langStorage?.lang || lang,\n fallbackLocale: langStorage?.lang || lang,\n messages: {\n [LangEnum.ZH]: zh,\n [LangEnum.EN]: en\n }\n})\n\nexport default i18n\n","<template>\n <el-dropdown\n trigger=\"hover\"\n @command=\"handleSelect\"\n >\n <el-button text>\n <el-icon :size=\"20\">\n <language-icon></language-icon>\n </el-icon>\n </el-button>\n <template #dropdown>\n <el-dropdown-menu>\n <el-dropdown-item\n v-for=\"item in options\"\n :key=\"item.key\"\n :command=\"item.key\"\n >\n {{ item.label }}\n </el-dropdown-item>\n </el-dropdown-menu>\n </template>\n </el-dropdown>\n</template>\n\n<script lang=\"ts\" setup>\nimport { useI18n } from \"vue-i18n\";\nimport { useLangStore } from '@core/store/modules/langStore/langStore'\nimport { langList } from '@core/i18n/index'\nimport { LangEnum } from '@core/enums/styleEnum'\nimport { icon } from '@core/plugins'\n\nconst { LanguageIcon } = icon.ionicons5\nconst { locale } = useI18n();\nconst langStore = useLangStore()\nconst options = langList\n\nconst handleSelect = (key: LangEnum) => {\n locale.value = key;\n langStore.changeLang(key)\n}\n</script>\n","export default \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADcAAAHfCAMAAADDZbAvAAAF6WlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNS42LWMxNDggNzkuMTY0MDM2LCAyMDE5LzA4LzEzLTAxOjA2OjU3ICAgICAgICAiPiA8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPiA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtbG5zOmRjPSJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyIgeG1sbnM6cGhvdG9zaG9wPSJodHRwOi8vbnMuYWRvYmUuY29tL3Bob3Rvc2hvcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RFdnQ9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZUV2ZW50IyIgeG1wOkNyZWF0b3JUb29sPSJBZG9iZSBQaG90b3Nob3AgMjEuMCAoTWFjaW50b3NoKSIgeG1wOkNyZWF0ZURhdGU9IjIwMjAtMDYtMTJUMTA6NDg6MzgrMDg6MDAiIHhtcDpNb2RpZnlEYXRlPSIyMDIwLTA2LTEyVDEwOjU2OjA0KzA4OjAwIiB4bXA6TWV0YWRhdGFEYXRlPSIyMDIwLTA2LTEyVDEwOjU2OjA0KzA4OjAwIiBkYzpmb3JtYXQ9ImltYWdlL3BuZyIgcGhvdG9zaG9wOkNvbG9yTW9kZT0iMyIgcGhvdG9zaG9wOklDQ1Byb2ZpbGU9InNSR0IgSUVDNjE5NjYtMi4xIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOjY4YjE2YjFlLTk4YWEtNDFhMS1iNTc2LWIzY2FjMzJlZjgyYyIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDphYzE5ZDBjYy01ZWQyLTRhN2EtYmI4NC1jMTQzMzQ0NDg4OWIiIHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD0ieG1wLmRpZDphYzE5ZDBjYy01ZWQyLTRhN2EtYmI4NC1jMTQzMzQ0NDg4OWIiPiA8eG1wTU06SGlzdG9yeT4gPHJkZjpTZXE+IDxyZGY6bGkgc3RFdnQ6YWN0aW9uPSJjcmVhdGVkIiBzdEV2dDppbnN0YW5jZUlEPSJ4bXAuaWlkOmFjMTlkMGNjLTVlZDItNGE3YS1iYjg0LWMxNDMzNDQ0ODg5YiIgc3RFdnQ6d2hlbj0iMjAyMC0wNi0xMlQxMDo0ODozOCswODowMCIgc3RFdnQ6c29mdHdhcmVBZ2VudD0iQWRvYmUgUGhvdG9zaG9wIDIxLjAgKE1hY2ludG9zaCkiLz4gPHJkZjpsaSBzdEV2dDphY3Rpb249InNhdmVkIiBzdEV2dDppbnN0YW5jZUlEPSJ4bXAuaWlkOjY4YjE2YjFlLTk4YWEtNDFhMS1iNTc2LWIzY2FjMzJlZjgyYyIgc3RFdnQ6d2hlbj0iMjAyMC0wNi0xMlQxMDo1NjowNCswODowMCIgc3RFdnQ6c29mdHdhcmVBZ2VudD0iQWRvYmUgUGhvdG9zaG9wIDIxLjAgKE1hY2ludG9zaCkiIHN0RXZ0OmNoYW5nZWQ9Ii8iLz4gPC9yZGY6U2VxPiA8L3htcE1NOkhpc3Rvcnk+IDwvcmRmOkRlc2NyaXB0aW9uPiA8L3JkZjpSREY+IDwveDp4bXBtZXRhPiA8P3hwYWNrZXQgZW5kPSJyIj8+PHY2LQAAAAlwSFlzAAALEwAACxMBAJqcGAAAAwBQTFRFR3BM////////////////////////////////////////////////////////////q6urxcXF5eXl/v7+////9/b2jIyM2dnZ39/foJ+g/Pv89/X31NLT8tnk////6+vrwsLC/Pz8x8PE////9/f34uLi+fn56Ojo8vLy0M/Q1tbW+vr6////o6Gh9/f39PT0+fn5+vr65+fozczMv7+//f398vLywMDA7+/vg4ODl5eXtLS0rKys4eHhwsLC8fHxu7y88fHx+fn59/f3z8/P+fn52dnZ7Ozs/Pz87u7uuLa409LT6eTm5+fn6Ojo/v7+4+PjpaWl9fX1+fn5xMTE4uLi/f396+vr+/v79/f329vbj4+P+/v739/f5OTkysrL+Pb46urq0NDQ9vb2+vr6+/v74uLi3t7e1MTK3cbOlY6Qn5+f9fX1rKysqKio////09PT8/Pz5eXllIuP7ubp8/Pzv769+/v78Obr7+Lp+Onw4MHNr52k1MfOx7q/npKX9uTsz7a//////////////v7+9+rw//7/+Ozx9+jv+/L2+/T4+u/1//v9/ff59N7o9ePr87LL9eXs/vn78t7n89vl8uDo8tPg87nO9ubs8drk8dDd8c3b8cra8sjZ8hSG/Pf69eHq8sXX8sHU8q3I8bbL8nOu80mf+/r7+u/y+O3z8Nfi9NTi8r/R8LrO9bXL85q+8QJ78ZW+9anH8nqx9Ym48mSq81Of81+m8y6Q79Pf87zR8r3P8MXW78LU8IOy9a7H8aPC85O58Ym083609KHC8TuX8CCKpgIY5V6W+fL299rn7s/b8Z+/8Wel50yUrgAi8Wyr4EuI7WWjuQYx2S9z7VuemQYLyTNetAAo8LzT8anG88TT7srZ773R9G+u84y500Jy8AZ/70aWwhJLpgci4i977bLJ2w5kyQFF3zd/6j6O7XCm4yN8zx1c6F+cwAM42keA9E+j8z+bqwsoogES11KB48/W+Mvd5jKEzzVl5yuG8giF3FaGuyRE3V+P9HxxcwAAAIJ0Uk5TADBgnxDvz79AfyDfj3BQrwESBPn77B8ICwbx8Cr+9sF2+lb+GoPZs1CffCjtHI081em6TiLp2iq6KzNfPEk8zknf4OZi9jLNxqUac9jIhe+gNsvkYVn/b7+vlxHMtF6bNZ1Gu5v2qT2/xw2JYlZLuFfjT3HkZIdb0uLq/LeFwFz6046QEqoAAA2jSURBVHja7Fx1eBtHFl+taEWW7ZjiOnYchZk5DXPTK6rclOmYmeb7VjKjTDLKGNsxxrEdJw6jw5w0jMWv3B5fb0GStaud2ZVyydk5vT/82bPzm5l98+bBvLfGMA8KjoyKefPBZSEYl6JWRUSERAVjMAqZ8POV8QCY5z/hiQwZsnLS0vC411aHhESFCqAil708MZoEJEmawDOz3c2zRwCKSDLs9eXPPjUyygsWNeGZWDPbxUyC6bOczQt09EgkST2IfyB84ssDebDQkU9HM09ZKHieXeqsx4GbqPEGDF/GhQWPedpEAk96hGme6dFCvQMIG82bjhhu4sDIAXOo5iUDuDgSLOcuNPJH8YCLA8ufw4LjAK+VXPood50j+B2AaTD2SrgXLn4Yl5tePczgBewXwEryga9xcEPH8nDm7NSf/fStVDOvGYSN5+K+w31szU6qLfiLrTZpHXdCcukQDm7gdMBuLtuNLEuxZNn+uj7LklJmtgKr1Q2MXsXdiEcYXjgpNa020ZHTVVmRnpuY0OM5JRnHE++5ThT905ycUODIWV/SXLnebstITElLdSNNc3lyNnCya43WdT2WrFx716XLuw6XHMqzOwoSktJI55jPep2mGeEMjrRmUzBbfVF3Q+Xuq/kVxV316dSUydlW0mwGP47wPkdToimgNTW5LjHDVn+oIr9px8nq7Y2Xu4u67Lk0f6jFhs8VOrYvhgNzWnJdliMnr3hrY+aeXR99unHH9vyG8qI86i3rekD4FOHzvmANSKNerb7w0uWqytbjx0+f6OjcWdlELTZvUHpW2kNTYIpi1epfJzoGHSrJr9pwtWPTmU+u7S290Xb4vaqGki677e1xwqDgqcRLMW83NF5+t7FqT/WX/9x34NS5mpaW0o6NGzIzK7dX/GHwqyvWrBixeipHJc17Y2F49AO/GdS9Y9e2bbuuXrmx78tv9//7zKa9Ne1tbbu37dyc3hPG7EV8+Eo3U4c+PIk6oCYyOcFhL87c+fFHtz88ceDja19/9e2n//r89u2jbReK0hN7UlnBMJnChzC7GPz9SeyeW7NTMnIKK5qaq49+8tn5r26dPXvr/Kmbp8+0Zl7syknsMbuPdOwPaNicWFrlMIcnOdHW1Z2/50jNyRM3j3199uz+U+cOdLQ3N13sSrckky6hJ8HwcVjogliSdMl0GbXQoi2Zu/eV1pw8t3///lvfdG663rEnv7veYSlz9aJ/LsFiJgLXQNRBSCmwF26taq653nL83LFjx85/80VL6ZELjSU0zgrc/cBMbBjnlCdZcvPKGyuPl2468Nmpa38/dfNkaemVDVuK6x0JZZ4dF2EzOec5rTbDXtSQuXFT5+kPPu9sP/3BiZrStu1biu0Zddm9hxeYorGJntoBmHsKbPRCq8+8f7Tzemnnh++3723L3FJkz0pJ9Rw/FhvL0bfmZIuj/lLjhY3/uPFFS0vLvva/7b2yLbOhyF7AxY3FlFy9k12XZT90sfJIR/s+SlZqjuw+Wr0zs6Iwp6DHExe2ApvGVWSpPdQWlrRW76revXFn854dG1qrW6sqCm29206PHqvBjLFcBUjJmu3dbc0XtldlNjVV5edvbt2VWZ5ns/R4aifzT7BfPh/GAa6rLTh44XD+5vwtDVu3dpcXF5Uc3lFen0uLS699MU/AYsZP8zQpZGpSbeF75eUlxcVFhYVdefX19vVVJQfZbXcxD0RHYAPfHB/HMQDWh37324N0f7vNlutwODISLX9+608pvTjKdIymDkTUmFfmMzJHMvIWNvmdP6Zn5DoyMgoKEi2WuoSUOrD2nSG/incrczBgFGPmQ0PnLHbPt3h0KPb7JEsCRbU9SUnJZWVpaeZpMVjkkMmLwmPXUVY+/LEn3Uo0ZsRCmq2LHxtGaYGBo0Byctm67GyzmTkAlHVYwtjWB/GHR6196kFP3RI843uDvzt6XiT9x9Q1IJW0ckzhG1FsLwGt1PurbBHfhoLocZg4TeDbUEr+Z0nAvTTNCwcelYCLme+Nmy0BF/KChwllZSE2QgIOWwvMJNe1iAuRghvMc7nM4AkpsOCI4YAzH5guZRsoGmZyCitgvAzlFGkw7LnlLhytfBaPxKRSxGT6rSig6fW4wTMw6RTy5Kuqx8Oo6Uw/HBqM+UJRI1WmhQPCxkdivlHomBfnBQWNwXyn4EgsGAtQPyQFLlczdlGn1sgkowgj59TqcIUUlFbtpZR0QeIwXAkEyCg2pdw1hVxDEIRBr3L+rdJKgcl7maHVsAtQooAapoua20WhZ2eEL5VgOmi82oOYKY3QXdPRj3GBJzIGGIRapUbwkYzhFWQ6elA1ZEwDbCnUztGPoFyjpUEFfSJH80xIVhXI6dhhDZABVSgBhLw9zU09St5poYHgcJQM0rsr0EwfOgKFUwu/v1oKjvjv4SStE8IXwg++aKBC3SsXOsi+qxG4IMhzRs4UaBUiuB4VcqEKmFwzR0wJnVAPPbgKgJiQOfAGhBIk4KoHthhGUSgFz6YKMZ1TiQgAWZhaRF0bhRWdErFH9MACCp1pRtpBhVFQu8qUKjHzKayUCUmmM0D/S9IAUSL6Ag5X84g5PByS5uMBYUUbwAVwAVzfwfVbveRNMixA9x3hGlFSwOIDf+TsXuMkvJ82IAX3H+n91GficiZ8xySKg4QsYjiVj9KpMIrdZ0FjLeSNDiRA1QEgEtlj0Bsw9AUL9JZRSfgKQ/Ff7JbRV0Y6Yep7w38tCzPcG/4TSr8YyfJf5ytMcyf8N/rKf7Vf/HduG+7XsVHifm2bn/xX+Qfz1d667/R9xOn9tO/6gN8aIB/IKC5nfvoFfcPf9brv5zaoA7gALoC7ezgxh40giL6jDBX+xb5BSnjaGxWSCSotLaExIBMsToea55w4SwXkWrT7qFcIeHko50smEGIoVJ5qF4faFZ5n5vLpNRo1NG7UCvDE2Bv3MT6YHuKcqQVe2OUuayAJR41X5QHBScNpIdeaXvLOpBE9TCWQmJ/m5xghBlfPYzQ/hyiDrNPA5QsD0ym4DTrYPuBckZPxfGE91E7jnqE3zoMJ3xfIWNkIIgg9G4zp+aJrkHSh7BmxKJEhDMcx1/BFABH5GJSwUiANOvLX6pk4R2XwOt6iLrmiL6nJAPkQtYvHY/7dnwX86wAugPu/x8koB1oBbwiC5asCFKAA3Qck8/k6V2ZQ65zJNH2QZBSu4qbvpKkVQuWd+JOQnRGu2lBLrZ9Xa6g4giA0RnSukQvzfCMFrhMHCmdW2KUj6jiDIFEzm82A1o2yASa8fh5H3TIIs5wB6oRXqkAV8+PwCQ3Irw7U0LpfFbIwXetv/bwRko29W/XzCkT9PPKs9fP6efkd1M/7wxfDXayfF5R6CXJmgL23xne5ZgQQrkTk8Pp5JUJCCYSi0MCfMWPqUHoJUT+PI/WgAJDN4RtF9K5RWNGpRG5OhViqEs2qywVlW6sUTcZrfWgNkGTSBjGFarhPd2Iyvc7jUzyptQYE/2JEJ6W4RCGUvteJLlemcn3/Z6DcF1yjFrqdhDkAnt//ufwXuTiMXwdhUIoA2Q/5vDvIdOjSDz3sTRg9AfUZCPhykN/4qREWXgYv1yCQil4PnVCOZBqzUsFRlWi7IofYFZmI/wKzY2J2E5OcJxHw3zA//YJ+7r8gVYlSGIdL+A5TBWnXIXAG2Lg69AuqYPurRzpMBMTdFU7kcVejR7g2CoQKgZwWrRLqNeBIHWqAKRhcxKEwCsekGrHAkfWLeAlXQkLlnDOBqjNo3WpeDSRVzrnMkU5NZ19dMbmEEkRC523H9JIif5yHlEv2emTu796VRtzHy0v69jPweWI/ov6U51L5WT9P+MmXAC6A66u4AIlHqQYja8iUd/J/agz+/p8aKeX0BndnSn+p/tPOFS05CMJAMShgAf/ZL78qVCGQgD7cTOeub512W0ANu0uSuz77uTt/pHWXz54TgUATWKCtVrlIaDS48VSWf+B1rFSrO28sjzTMNCxt5h1/5ziebMgr93rAy2eeZFI6QJI/yOsO3zAhKJ1jWlU8hK6yD3Xcb+vNLpysr4t+oMNNh+6fiBtpfeAzDB39Zhwlqhr9ZhZqIHy/GXVbigYziLA9mDOwwyFT3JVl/HIyEh4CdypHE/xy5uLWG3Y12nWdU8w7pUU7tGF869h9bHVaDFL7j/PaLCdbavS858C4kJv9gnNMN9yXvWHOS21gJ/5m/C+p+pbX0/r3b9GphwGSvPbg4PK3XXQfbVC9MgF34erDRWPrLi6Gmbs4V1nANk7CRuDYWBgrkqGynhwsROc3hV9v4czp6yFjeuJwMVH/oP05kVs4phyL3cO3RcZHRy55JEzNJyPz6WbsOAvz4vMp3waabRRJOoHfGz0sXm303q+KPdPnfQgkicNSJS0cJquOVaWzwWW+0pargtpHYk87B848/RNn0Fo9sjYsf7bGBjF898rRKDC+GfugHmzoZrPrVtJBMdULYQpVLEkY9UDMJWwJTXhHrUO32dpai5KwhwnD9c9AxGioTBiSZ2rq0n8umzDVB7OI/wJl8XXWc0m8EoRgQfpWYg7vN/rc8IVgMxrPTAknyGATKgOrB164gLqwaoBOdYw3hzVmLsoEFdMuAYXZTGHx+URpmM1D8D4WxvMQp/G1LngX5uOHhzdU2Tb7/wGM06c0667RrQAAAABJRU5ErkJggg==\"","import { computed, unref, watch, ref, customRef, isVue3, isRef, effectScope, getCurrentScope, onScopeDispose, shallowRef, watchEffect, readonly, reactive, toRefs as toRefs$1, toRef, isVue2, set as set$1, getCurrentInstance, onBeforeUnmount, onMounted, nextTick, onUnmounted } from 'vue-demi';\n\nfunction and(...args) {\n return computed(() => args.every((i) => unref(i)));\n}\n\nfunction biSyncRef(a, b) {\n const flush = \"sync\";\n const stop1 = watch(a, (newValue) => {\n b.value = newValue;\n }, {\n flush,\n immediate: true\n });\n const stop2 = watch(b, (newValue) => {\n a.value = newValue;\n }, {\n flush,\n immediate: true\n });\n return () => {\n stop1();\n stop2();\n };\n}\n\nfunction controlledComputed(source, fn) {\n let v = void 0;\n let track;\n let trigger;\n const dirty = ref(true);\n watch(source, () => {\n dirty.value = true;\n trigger();\n }, { flush: \"sync\" });\n return customRef((_track, _trigger) => {\n track = _track;\n trigger = _trigger;\n return {\n get() {\n if (dirty.value) {\n v = fn();\n dirty.value = false;\n }\n track();\n return v;\n },\n set() {\n }\n };\n });\n}\n\nfunction __onlyVue3(name = \"this function\") {\n if (isVue3)\n return;\n throw new Error(`[VueUse] ${name} is only works on Vue 3.`);\n}\n\nfunction extendRef(ref, extend, { enumerable = false, unwrap = true } = {}) {\n __onlyVue3();\n for (const [key, value] of Object.entries(extend)) {\n if (key === \"value\")\n continue;\n if (isRef(value) && unwrap) {\n Object.defineProperty(ref, key, {\n get() {\n return value.value;\n },\n set(v) {\n value.value = v;\n },\n enumerable\n });\n } else {\n Object.defineProperty(ref, key, { value, enumerable });\n }\n }\n return ref;\n}\n\nfunction controlledRef(initial, options = {}) {\n let source = initial;\n let track;\n let trigger;\n const ref = customRef((_track, _trigger) => {\n track = _track;\n trigger = _trigger;\n return {\n get() {\n return get();\n },\n set(v) {\n set(v);\n }\n };\n });\n function get(tracking = true) {\n if (tracking)\n track();\n return source;\n }\n function set(value, triggering = true) {\n var _a, _b;\n if (value === source)\n return;\n const old = source;\n if (((_a = options.onBeforeChange) == null ? void 0 : _a.call(options, value, old)) === false)\n return;\n source = value;\n (_b = options.onChanged) == null ? void 0 : _b.call(options, value, old);\n if (triggering)\n trigger();\n }\n const untrackedGet = () => get(false);\n const silentSet = (v) => set(v, false);\n const peek = () => get(false);\n const lay = (v) => set(v, false);\n return extendRef(ref, {\n get,\n set,\n untrackedGet,\n silentSet,\n peek,\n lay\n }, { enumerable: true });\n}\n\nfunction createEventHook() {\n const fns = [];\n const off = (fn) => {\n const index = fns.indexOf(fn);\n if (index !== -1)\n fns.splice(index, 1);\n };\n const on = (fn) => {\n fns.push(fn);\n return {\n off: () => off(fn)\n };\n };\n const trigger = (param) => {\n fns.forEach((fn) => fn(param));\n };\n return {\n on,\n off,\n trigger\n };\n}\n\nfunction createGlobalState(stateFactory) {\n let initialized = false;\n let state;\n const scope = effectScope(true);\n return () => {\n if (!initialized) {\n state = scope.run(stateFactory);\n initialized = true;\n }\n return state;\n };\n}\n\nfunction reactify(fn) {\n return function(...args) {\n return computed(() => fn.apply(this, args.map((i) => unref(i))));\n };\n}\n\nfunction tryOnScopeDispose(fn) {\n if (getCurrentScope()) {\n onScopeDispose(fn);\n return true;\n }\n return false;\n}\n\nfunction createSharedComposable(composable) {\n let subscribers = 0;\n let state;\n let scope;\n const dispose = () => {\n subscribers -= 1;\n if (scope && subscribers <= 0) {\n scope.stop();\n state = void 0;\n scope = void 0;\n }\n };\n return (...args) => {\n subscribers += 1;\n if (!state) {\n scope = effectScope(true);\n state = scope.run(() => composable(...args));\n }\n tryOnScopeDispose(dispose);\n return state;\n };\n}\n\nconst isClient = typeof window !== \"undefined\";\nconst isDef = (val) => typeof val !== \"undefined\";\nconst assert = (condition, ...infos) => {\n if (!condition)\n console.warn(...infos);\n};\nconst toString = Object.prototype.toString;\nconst isBoolean = (val) => typeof val === \"boolean\";\nconst isFunction = (val) => typeof val === \"function\";\nconst isNumber = (val) => typeof val === \"number\";\nconst isString = (val) => typeof val === \"string\";\nconst isObject = (val) => toString.call(val) === \"[object Object]\";\nconst isWindow = (val) => typeof window !== \"undefined\" && toString.call(val) === \"[object Window]\";\nconst now = () => Date.now();\nconst timestamp = () => +Date.now();\nconst clamp = (n, min, max) => Math.min(max, Math.max(min, n));\nconst noop = () => {\n};\nconst rand = (min, max) => {\n min = Math.ceil(min);\n max = Math.floor(max);\n return Math.floor(Math.random() * (max - min + 1)) + min;\n};\n\nfunction createFilterWrapper(filter, fn) {\n function wrapper(...args) {\n filter(() => fn.apply(this, args), { fn, thisArg: this, args });\n }\n return wrapper;\n}\nconst bypassFilter = (invoke) => {\n return invoke();\n};\nfunction debounceFilter(ms, options = {}) {\n let timer;\n let maxTimer;\n const filter = (invoke) => {\n const duration = unref(ms);\n const maxDuration = unref(options.maxWait);\n if (timer)\n clearTimeout(timer);\n if (duration <= 0 || maxDuration !== void 0 && maxDuration <= 0) {\n if (maxTimer) {\n clearTimeout(maxTimer);\n maxTimer = null;\n }\n return invoke();\n }\n if (maxDuration && !maxTimer) {\n maxTimer = setTimeout(() => {\n if (timer)\n clearTimeout(timer);\n maxTimer = null;\n invoke();\n }, maxDuration);\n }\n timer = setTimeout(() => {\n if (maxTimer)\n clearTimeout(maxTimer);\n maxTimer = null;\n invoke();\n }, duration);\n };\n return filter;\n}\nfunction throttleFilter(ms, trailing = true, leading = true) {\n let lastExec = 0;\n let timer;\n let preventLeading = !leading;\n const clear = () => {\n if (timer) {\n clearTimeout(timer);\n timer = void 0;\n }\n };\n const filter = (invoke) => {\n const duration = unref(ms);\n const elapsed = Date.now() - lastExec;\n clear();\n if (duration <= 0) {\n lastExec = Date.now();\n return invoke();\n }\n if (elapsed > duration) {\n lastExec = Date.now();\n if (preventLeading)\n preventLeading = false;\n else\n invoke();\n }\n if (trailing) {\n timer = setTimeout(() => {\n lastExec = Date.now();\n if (!leading)\n preventLeading = true;\n clear();\n invoke();\n }, duration);\n }\n if (!leading && !timer)\n timer = setTimeout(() => preventLeading = true, duration);\n };\n return filter;\n}\nfunction pausableFilter(extendFilter = bypassFilter) {\n const isActive = ref(true);\n function pause() {\n isActive.value = false;\n }\n function resume() {\n isActive.value = true;\n }\n const eventFilter = (...args) => {\n if (isActive.value)\n extendFilter(...args);\n };\n return { isActive, pause, resume, eventFilter };\n}\n\nfunction promiseTimeout(ms, throwOnTimeout = false, reason = \"Timeout\") {\n return new Promise((resolve, reject) => {\n if (throwOnTimeout)\n setTimeout(() => reject(reason), ms);\n else\n setTimeout(resolve, ms);\n });\n}\nfunction identity(arg) {\n return arg;\n}\nfunction createSingletonPromise(fn) {\n let _promise;\n function wrapper() {\n if (!_promise)\n _promise = fn();\n return _promise;\n }\n wrapper.reset = async () => {\n const _prev = _promise;\n _promise = void 0;\n if (_prev)\n await _prev;\n };\n return wrapper;\n}\nfunction invoke(fn) {\n return fn();\n}\nfunction containsProp(obj, ...props) {\n return props.some((k) => k in obj);\n}\nfunction increaseWithUnit(target, delta) {\n var _a;\n if (typeof target === \"number\")\n return target + delta;\n const value = ((_a = target.match(/^-?[0-9]+\\.?[0-9]*/)) == null ? void 0 : _a[0]) || \"\";\n const unit = target.slice(value.length);\n const result = parseFloat(value) + delta;\n if (Number.isNaN(result))\n return target;\n return result + unit;\n}\nfunction objectPick(obj, keys, omitUndefined = false) {\n return keys.reduce((n, k) => {\n if (k in obj) {\n if (!omitUndefined || !obj[k] === void 0)\n n[k] = obj[k];\n }\n return n;\n }, {});\n}\n\nfunction useDebounceFn(fn, ms = 200, options = {}) {\n return createFilterWrapper(debounceFilter(ms, options), fn);\n}\n\nfunction useDebounce(value, ms = 200, options = {}) {\n if (ms <= 0)\n return value;\n const debounced = ref(value.value);\n const updater = useDebounceFn(() => {\n debounced.value = value.value;\n }, ms, options);\n watch(value, () => updater());\n return debounced;\n}\n\nvar __getOwnPropSymbols$a = Object.getOwnPropertySymbols;\nvar __hasOwnProp$a = Object.prototype.hasOwnProperty;\nvar __propIsEnum$a = Object.prototype.propertyIsEnumerable;\nvar __objRest$5 = (source, exclude) => {\n var target = {};\n for (var prop in source)\n if (__hasOwnProp$a.call(source, prop) && exclude.indexOf(prop) < 0)\n target[prop] = source[prop];\n if (source != null && __getOwnPropSymbols$a)\n for (var prop of __getOwnPropSymbols$a(source)) {\n if (exclude.indexOf(prop) < 0 && __propIsEnum$a.call(source, prop))\n target[prop] = source[prop];\n }\n return target;\n};\nfunction watchWithFilter(source, cb, options = {}) {\n const _a = options, {\n eventFilter = bypassFilter\n } = _a, watchOptions = __objRest$5(_a, [\n \"eventFilter\"\n ]);\n return watch(source, createFilterWrapper(eventFilter, cb), watchOptions);\n}\n\nvar __defProp$8 = Object.defineProperty;\nvar __defProps$5 = Object.defineProperties;\nvar __getOwnPropDescs$5 = Object.getOwnPropertyDescriptors;\nvar __getOwnPropSymbols$9 = Object.getOwnPropertySymbols;\nvar __hasOwnProp$9 = Object.prototype.hasOwnProperty;\nvar __propIsEnum$9 = Object.prototype.propertyIsEnumerable;\nvar __defNormalProp$8 = (obj, key, value) => key in obj ? __defProp$8(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;\nvar __spreadValues$8 = (a, b) => {\n for (var prop in b || (b = {}))\n if (__hasOwnProp$9.call(b, prop))\n __defNormalProp$8(a, prop, b[prop]);\n if (__getOwnPropSymbols$9)\n for (var prop of __getOwnPropSymbols$9(b)) {\n if (__propIsEnum$9.call(b, prop))\n __defNormalProp$8(a, prop, b[prop]);\n }\n return a;\n};\nvar __spreadProps$5 = (a, b) => __defProps$5(a, __getOwnPropDescs$5(b));\nvar __objRest$4 = (source, exclude) => {\n var target = {};\n for (var prop in source)\n if (__hasOwnProp$9.call(source, prop) && exclude.indexOf(prop) < 0)\n target[prop] = source[prop];\n if (source != null && __getOwnPropSymbols$9)\n for (var prop of __getOwnPropSymbols$9(source)) {\n if (exclude.indexOf(prop) < 0 && __propIsEnum$9.call(source, prop))\n target[prop] = source[prop];\n }\n return target;\n};\nfunction debouncedWatch(source, cb, options = {}) {\n const _a = options, {\n debounce = 0\n } = _a, watchOptions = __objRest$4(_a, [\n \"debounce\"\n ]);\n return watchWithFilter(source, cb, __spreadProps$5(__spreadValues$8({}, watchOptions), {\n eventFilter: debounceFilter(debounce)\n }));\n}\n\nvar __defProp$7 = Object.defineProperty;\nvar __defProps$4 = Object.defineProperties;\nvar __getOwnPropDescs$4 = Object.getOwnPropertyDescriptors;\nvar __getOwnPropSymbols$8 = Object.getOwnPropertySymbols;\nvar __hasOwnProp$8 = Object.prototype.hasOwnProperty;\nvar __propIsEnum$8 = Object.prototype.propertyIsEnumerable;\nvar __defNormalProp$7 = (obj, key, value) => key in obj ? __defProp$7(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;\nvar __spreadValues$7 = (a, b) => {\n for (var prop in b || (b = {}))\n if (__hasOwnProp$8.call(b, prop))\n __defNormalProp$7(a, prop, b[prop]);\n if (__getOwnPropSymbols$8)\n for (var prop of __getOwnPropSymbols$8(b)) {\n if (__propIsEnum$8.call(b, prop))\n __defNormalProp$7(a, prop, b[prop]);\n }\n return a;\n};\nvar __spreadProps$4 = (a, b) => __defProps$4(a, __getOwnPropDescs$4(b));\nfunction eagerComputed(fn, options) {\n var _a;\n const result = shallowRef();\n watchEffect(() => {\n result.value = fn();\n }, __spreadProps$4(__spreadValues$7({}, options), {\n flush: (_a = options == null ? void 0 : options.flush) != null ? _a : \"sync\"\n }));\n return readonly(result);\n}\n\nfunction get(obj, key) {\n if (key == null)\n return unref(obj);\n return unref(obj)[key];\n}\n\nvar __defProp$6 = Object.defineProperty;\nvar __defProps$3 = Object.defineProperties;\nvar __getOwnPropDescs$3 = Object.getOwnPropertyDescriptors;\nvar __getOwnPropSymbols$7 = Object.getOwnPropertySymbols;\nvar __hasOwnProp$7 = Object.prototype.hasOwnProperty;\nvar __propIsEnum$7 = Object.prototype.propertyIsEnumerable;\nvar __defNormalProp$6 = (obj, key, value) => key in obj ? __defProp$6(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;\nvar __spreadValues$6 = (a, b) => {\n for (var prop in b || (b = {}))\n if (__hasOwnProp$7.call(b, prop))\n __defNormalProp$6(a, prop, b[prop]);\n if (__getOwnPropSymbols$7)\n for (var prop of __getOwnPropSymbols$7(b)) {\n if (__propIsEnum$7.call(b, prop))\n __defNormalProp$6(a, prop, b[prop]);\n }\n return a;\n};\nvar __spreadProps$3 = (a, b) => __defProps$3(a, __getOwnPropDescs$3(b));\nvar __objRest$3 = (source, exclude) => {\n var target = {};\n for (var prop in source)\n if (__hasOwnProp$7.call(source, prop) && exclude.indexOf(prop) < 0)\n target[prop] = source[prop];\n if (source != null && __getOwnPropSymbols$7)\n for (var prop of __getOwnPropSymbols$7(source)) {\n if (exclude.indexOf(prop) < 0 && __propIsEnum$7.call(source, prop))\n target[prop] = source[prop];\n }\n return target;\n};\nfunction ignorableWatch(source, cb, options = {}) {\n const _a = options, {\n eventFilter = bypassFilter\n } = _a, watchOptions = __objRest$3(_a, [\n \"eventFilter\"\n ]);\n const filteredCb = createFilterWrapper(eventFilter, cb);\n let ignoreUpdates;\n let ignorePrevAsyncUpdates;\n let stop;\n if (watchOptions.flush === \"sync\") {\n const ignore = ref(false);\n ignorePrevAsyncUpdates = () => {\n };\n ignoreUpdates = (updater) => {\n ignore.value = true;\n updater();\n ignore.value = false;\n };\n stop = watch(source, (...args) => {\n if (!ignore.value)\n filteredCb(...args);\n }, watchOptions);\n } else {\n const disposables = [];\n const ignoreCounter = ref(0);\n const syncCounter = ref(0);\n ignorePrevAsyncUpdates = () => {\n ignoreCounter.value = syncCounter.value;\n };\n disposables.push(watch(source, () => {\n syncCounter.value++;\n }, __spreadProps$3(__spreadValues$6({}, watchOptions), { flush: \"sync\" })));\n ignoreUpdates = (updater) => {\n const syncCounterPrev = syncCounter.value;\n updater();\n ignoreCounter.value += syncCounter.value - syncCounterPrev;\n };\n disposables.push(watch(source, (...args) => {\n const ignore = ignoreCounter.value > 0 && ignoreCounter.value === syncCounter.value;\n ignoreCounter.value = 0;\n syncCounter.value = 0;\n if (ignore)\n return;\n filteredCb(...args);\n }, watchOptions));\n stop = () => {\n disposables.forEach((fn) => fn());\n };\n }\n return { stop, ignoreUpdates, ignorePrevAsyncUpdates };\n}\n\nfunction isDefined(v) {\n return unref(v) != null;\n}\n\nvar __defProp$5 = Object.defineProperty;\nvar __getOwnPropSymbols$6 = Object.getOwnPropertySymbols;\nvar __hasOwnProp$6 = Object.prototype.hasOwnProperty;\nvar __propIsEnum$6 = Object.prototype.propertyIsEnumerable;\nvar __defNormalProp$5 = (obj, key, value) => key in obj ? __defProp$5(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;\nvar __spreadValues$5 = (a, b) => {\n for (var prop in b || (b = {}))\n if (__hasOwnProp$6.call(b, prop))\n __defNormalProp$5(a, prop, b[prop]);\n if (__getOwnPropSymbols$6)\n for (var prop of __getOwnPropSymbols$6(b)) {\n if (__propIsEnum$6.call(b, prop))\n __defNormalProp$5(a, prop, b[prop]);\n }\n return a;\n};\nfunction makeDestructurable(obj, arr) {\n if (typeof Symbol !== \"undefined\") {\n const clone = __spreadValues$5({}, obj);\n Object.defineProperty(clone, Symbol.iterator, {\n enumerable: false,\n value() {\n let index = 0;\n return {\n next: () => ({\n value: arr[index++],\n done: index > arr.length\n })\n };\n }\n });\n return clone;\n } else {\n return Object.assign([...arr], obj);\n }\n}\n\nfunction not(v) {\n return computed(() => !unref(v));\n}\n\nfunction or(...args) {\n return computed(() => args.some((i) => unref(i)));\n}\n\nvar __defProp$4 = Object.defineProperty;\nvar __defProps$2 = Object.defineProperties;\nvar __getOwnPropDescs$2 = Object.getOwnPropertyDescriptors;\nvar __getOwnPropSymbols$5 = Object.getOwnPropertySymbols;\nvar __hasOwnProp$5 = Object.prototype.hasOwnProperty;\nvar __propIsEnum$5 = Object.prototype.propertyIsEnumerable;\nvar __defNormalProp$4 = (obj, key, value) => key in obj ? __defProp$4(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;\nvar __spreadValues$4 = (a, b) => {\n for (var prop in b || (b = {}))\n if (__hasOwnProp$5.call(b, prop))\n __defNormalProp$4(a, prop, b[prop]);\n if (__getOwnPropSymbols$5)\n for (var prop of __getOwnPropSymbols$5(b)) {\n if (__propIsEnum$5.call(b, prop))\n __defNormalProp$4(a, prop, b[prop]);\n }\n return a;\n};\nvar __spreadProps$2 = (a, b) => __defProps$2(a, __getOwnPropDescs$2(b));\nvar __objRest$2 = (source, exclude) => {\n var target = {};\n for (var prop in source)\n if (__hasOwnProp$5.call(source, prop) && exclude.indexOf(prop) < 0)\n target[prop] = source[prop];\n if (source != null && __getOwnPropSymbols$5)\n for (var prop of __getOwnPropSymbols$5(source)) {\n if (exclude.indexOf(prop) < 0 && __propIsEnum$5.call(source, prop))\n target[prop] = source[prop];\n }\n return target;\n};\nfunction pausableWatch(source, cb, options = {}) {\n const _a = options, {\n eventFilter: filter\n } = _a, watchOptions = __objRest$2(_a, [\n \"eventFilter\"\n ]);\n const { eventFilter, pause, resume, isActive } = pausableFilter(filter);\n const stop = watchWithFilter(source, cb, __spreadProps$2(__spreadValues$4({}, watchOptions), {\n eventFilter\n }));\n return { stop, pause, resume, isActive };\n}\n\nfunction reactifyObject(obj, optionsOrKeys = {}) {\n let keys = [];\n if (Array.isArray(optionsOrKeys)) {\n keys = optionsOrKeys;\n } else {\n const { includeOwnProperties = true } = optionsOrKeys;\n keys.push(...Object.keys(obj));\n if (includeOwnProperties)\n keys.push(...Object.getOwnPropertyNames(obj));\n }\n return Object.fromEntries(keys.map((key) => {\n const value = obj[key];\n return [\n key,\n typeof value === \"function\" ? reactify(value.bind(obj)) : value\n ];\n }));\n}\n\nfunction toReactive(objectRef) {\n if (!isRef(objectRef))\n return reactive(objectRef);\n const proxy = new Proxy({}, {\n get(_, p, receiver) {\n return unref(Reflect.get(objectRef.value, p, receiver));\n },\n set(_, p, value) {\n if (isRef(objectRef.value[p]) && !isRef(value))\n objectRef.value[p].value = value;\n else\n objectRef.value[p] = value;\n return true;\n },\n deleteProperty(_, p) {\n return Reflect.deleteProperty(objectRef.value, p);\n },\n has(_, p) {\n return Reflect.has(objectRef.value, p);\n },\n ownKeys() {\n return Object.keys(objectRef.value);\n },\n getOwnPropertyDescriptor() {\n return {\n enumerable: true,\n configurable: true\n };\n }\n });\n return reactive(proxy);\n}\n\nfunction reactiveComputed(fn) {\n return toReactive(computed(fn));\n}\n\nfunction reactiveOmit(obj, ...keys) {\n return reactiveComputed(() => Object.fromEntries(Object.entries(toRefs$1(obj)).filter((e) => !keys.includes(e[0]))));\n}\n\nfunction reactivePick(obj, ...keys) {\n return reactive(Object.fromEntries(keys.map((k) => [k, toRef(obj, k)])));\n}\n\nfunction refDefault(source, defaultValue) {\n return computed({\n get() {\n var _a;\n return (_a = source.value) != null ? _a : defaultValue;\n },\n set(value) {\n source.value = value;\n }\n });\n}\n\nfunction set(...args) {\n if (args.length === 2) {\n const [ref, value] = args;\n ref.value = value;\n }\n if (args.length === 3) {\n if (isVue2) {\n set$1(...args);\n } else {\n const [target, key, value] = args;\n target[key] = value;\n }\n }\n}\n\nfunction syncRef(source, targets, {\n flush = \"sync\",\n deep = false,\n immediate = true\n} = {}) {\n if (!Array.isArray(targets))\n targets = [targets];\n return watch(source, (newValue) => targets.forEach((target) => target.value = newValue), { flush, deep, immediate });\n}\n\nfunction useThrottleFn(fn, ms = 200, trailing = true, leading = true) {\n return createFilterWrapper(throttleFilter(ms, trailing, leading), fn);\n}\n\nfunction useThrottle(value, delay = 200, trailing = true, leading = true) {\n if (delay <= 0)\n return value;\n const throttled = ref(value.value);\n const updater = useThrottleFn(() => {\n throttled.value = value.value;\n }, delay, trailing, leading);\n watch(value, () => updater());\n return throttled;\n}\n\nvar __defProp$3 = Object.defineProperty;\nvar __defProps$1 = Object.defineProperties;\nvar __getOwnPropDescs$1 = Object.getOwnPropertyDescriptors;\nvar __getOwnPropSymbols$4 = Object.getOwnPropertySymbols;\nvar __hasOwnProp$4 = Object.prototype.hasOwnProperty;\nvar __propIsEnum$4 = Object.prototype.propertyIsEnumerable;\nvar __defNormalProp$3 = (obj, key, value) => key in obj ? __defProp$3(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;\nvar __spreadValues$3 = (a, b) => {\n for (var prop in b || (b = {}))\n if (__hasOwnProp$4.call(b, prop))\n __defNormalProp$3(a, prop, b[prop]);\n if (__getOwnPropSymbols$4)\n for (var prop of __getOwnPropSymbols$4(b)) {\n if (__propIsEnum$4.call(b, prop))\n __defNormalProp$3(a, prop, b[prop]);\n }\n return a;\n};\nvar __spreadProps$1 = (a, b) => __defProps$1(a, __getOwnPropDescs$1(b));\nvar __objRest$1 = (source, exclude) => {\n var target = {};\n for (var prop in source)\n if (__hasOwnProp$4.call(source, prop) && exclude.indexOf(prop) < 0)\n target[prop] = source[prop];\n if (source != null && __getOwnPropSymbols$4)\n for (var prop of __getOwnPropSymbols$4(source)) {\n if (exclude.indexOf(prop) < 0 && __propIsEnum$4.call(source, prop))\n target[prop] = source[prop];\n }\n return target;\n};\nfunction throttledWatch(source, cb, options = {}) {\n const _a = options, {\n throttle = 0,\n trailing = true,\n leading = true\n } = _a, watchOptions = __objRest$1(_a, [\n \"throttle\",\n \"trailing\",\n \"leading\"\n ]);\n return watchWithFilter(source, cb, __spreadProps$1(__spreadValues$3({}, watchOptions), {\n eventFilter: throttleFilter(throttle, trailing, leading)\n }));\n}\n\nvar __defProp$2 = Object.defineProperty;\nvar __defProps = Object.defineProperties;\nvar __getOwnPropDescs = Object.getOwnPropertyDescriptors;\nvar __getOwnPropSymbols$3 = Object.getOwnPropertySymbols;\nvar __hasOwnProp$3 = Object.prototype.hasOwnProperty;\nvar __propIsEnum$3 = Object.prototype.propertyIsEnumerable;\nvar __defNormalProp$2 = (obj, key, value) => key in obj ? __defProp$2(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;\nvar __spreadValues$2 = (a, b) => {\n for (var prop in b || (b = {}))\n if (__hasOwnProp$3.call(b, prop))\n __defNormalProp$2(a, prop, b[prop]);\n if (__getOwnPropSymbols$3)\n for (var prop of __getOwnPropSymbols$3(b)) {\n if (__propIsEnum$3.call(b, prop))\n __defNormalProp$2(a, prop, b[prop]);\n }\n return a;\n};\nvar __spreadProps = (a, b) => __defProps(a, __getOwnPropDescs(b));\nfunction toRefs(objectRef) {\n if (!isRef(objectRef))\n return toRefs$1(objectRef);\n const result = Array.isArray(objectRef.value) ? new Array(objectRef.value.length) : {};\n for (const key in objectRef.value) {\n result[key] = customRef(() => ({\n get() {\n return objectRef.value[key];\n },\n set(v) {\n if (Array.isArray(objectRef.value)) {\n const copy = [...objectRef.value];\n copy[key] = v;\n objectRef.value = copy;\n } else {\n objectRef.value = __spreadProps(__spreadValues$2({}, objectRef.value), { [key]: v });\n }\n }\n }));\n }\n return result;\n}\n\nfunction tryOnBeforeUnmount(fn) {\n if (getCurrentInstance())\n onBeforeUnmount(fn);\n}\n\nfunction tryOnMounted(fn, sync = true) {\n if (getCurrentInstance())\n onMounted(fn);\n else if (sync)\n fn();\n else\n nextTick(fn);\n}\n\nfunction tryOnUnmounted(fn) {\n if (getCurrentInstance())\n onUnmounted(fn);\n}\n\nfunction until(r) {\n let isNot = false;\n function toMatch(condition, { flush = \"sync\", deep = false, timeout, throwOnTimeout } = {}) {\n let stop = null;\n const watcher = new Promise((resolve) => {\n stop = watch(r, (v) => {\n if (condition(v) === !isNot) {\n stop == null ? void 0 : stop();\n resolve();\n }\n }, {\n flush,\n deep,\n immediate: true\n });\n });\n const promises = [watcher];\n if (timeout) {\n promises.push(promiseTimeout(timeout, throwOnTimeout).finally(() => {\n stop == null ? void 0 : stop();\n }));\n }\n return Promise.race(promises);\n }\n function toBe(value, options) {\n return toMatch((v) => v === unref(value), options);\n }\n function toBeTruthy(options) {\n return toMatch((v) => Boolean(v), options);\n }\n function toBeNull(options) {\n return toBe(null, options);\n }\n function toBeUndefined(options) {\n return toBe(void 0, options);\n }\n function toBeNaN(options) {\n return toMatch(Number.isNaN, options);\n }\n function toContains(value, options) {\n return toMatch((v) => {\n const array = Array.from(v);\n return array.includes(value) || array.includes(unref(value));\n }, options);\n }\n function changed(options) {\n return changedTimes(1, options);\n }\n function changedTimes(n = 1, options) {\n let count = -1;\n return toMatch(() => {\n count += 1;\n return count >= n;\n }, options);\n }\n if (Array.isArray(unref(r))) {\n const instance = {\n toMatch,\n toContains,\n changed,\n changedTimes,\n get not() {\n isNot = !isNot;\n return this;\n }\n };\n return instance;\n } else {\n const instance = {\n toMatch,\n toBe,\n toBeTruthy,\n toBeNull,\n toBeNaN,\n toBeUndefined,\n changed,\n changedTimes,\n get not() {\n isNot = !isNot;\n return this;\n }\n };\n return instance;\n }\n}\n\nfunction useCounter(initialValue = 0, options = {}) {\n const count = ref(initialValue);\n const {\n max = Infinity,\n min = -Infinity\n } = options;\n const inc = (delta = 1) => count.value = Math.min(max, count.value + delta);\n const dec = (delta = 1) => count.value = Math.max(min, count.value - delta);\n const get = () => count.value;\n const set = (val) => count.value = val;\n const reset = (val = initialValue) => {\n initialValue = val;\n return set(val);\n };\n return { count, inc, dec, get, set, reset };\n}\n\nfunction useIntervalFn(cb, interval = 1e3, options = {}) {\n const {\n immediate = true,\n immediateCallback = false\n } = options;\n let timer = null;\n const isActive = ref(false);\n function clean() {\n if (timer) {\n clearInterval(timer);\n timer = null;\n }\n }\n function pause() {\n isActive.value = false;\n clean();\n }\n function resume() {\n if (interval <= 0)\n return;\n isActive.value = true;\n if (immediateCallback)\n cb();\n clean();\n timer = setInterval(cb, unref(interval));\n }\n if (immediate && isClient)\n resume();\n if (isRef(interval)) {\n const stopWatch = watch(interval, () => {\n if (immediate && isClient)\n resume();\n });\n tryOnScopeDispose(stopWatch);\n }\n tryOnScopeDispose(pause);\n return {\n isActive,\n pause,\n resume\n };\n}\n\nvar __defProp$1 = Object.defineProperty;\nvar __getOwnPropSymbols$2 = Object.getOwnPropertySymbols;\nvar __hasOwnProp$2 = Object.prototype.hasOwnProperty;\nvar __propIsEnum$2 = Object.prototype.propertyIsEnumerable;\nvar __defNormalProp$1 = (obj, key, value) => key in obj ? __defProp$1(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;\nvar __spreadValues$1 = (a, b) => {\n for (var prop in b || (b = {}))\n if (__hasOwnProp$2.call(b, prop))\n __defNormalProp$1(a, prop, b[prop]);\n if (__getOwnPropSymbols$2)\n for (var prop of __getOwnPropSymbols$2(b)) {\n if (__propIsEnum$2.call(b, prop))\n __defNormalProp$1(a, prop, b[prop]);\n }\n return a;\n};\nfunction useInterval(interval = 1e3, options = {}) {\n const {\n controls: exposeControls = false,\n immediate = true\n } = options;\n const counter = ref(0);\n const controls = useIntervalFn(() => counter.value += 1, interval, { immediate });\n if (exposeControls) {\n return __spreadValues$1({\n counter\n }, controls);\n } else {\n return counter;\n }\n}\n\nfunction useLastChanged(source, options = {}) {\n var _a;\n const ms = ref((_a = options.initialValue) != null ? _a : null);\n watch(source, () => ms.value = timestamp(), options);\n return ms;\n}\n\nfunction useTimeoutFn(cb, interval, options = {}) {\n const {\n immediate = true\n } = options;\n const isPending = ref(false);\n let timer = null;\n function clear() {\n if (timer) {\n clearTimeout(timer);\n timer = null;\n }\n }\n function stop() {\n isPending.value = false;\n clear();\n }\n function start(...args) {\n clear();\n isPending.value = true;\n timer = setTimeout(() => {\n isPending.value = false;\n timer = null;\n cb(...args);\n }, unref(interval));\n }\n if (immediate) {\n isPending.value = true;\n if (isClient)\n start();\n }\n tryOnScopeDispose(stop);\n return {\n isPending,\n start,\n stop\n };\n}\n\nvar __defProp = Object.defineProperty;\nvar __getOwnPropSymbols$1 = Object.getOwnPropertySymbols;\nvar __hasOwnProp$1 = Object.prototype.hasOwnProperty;\nvar __propIsEnum$1 = Object.prototype.propertyIsEnumerable;\nvar __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;\nvar __spreadValues = (a, b) => {\n for (var prop in b || (b = {}))\n if (__hasOwnProp$1.call(b, prop))\n __defNormalProp(a, prop, b[prop]);\n if (__getOwnPropSymbols$1)\n for (var prop of __getOwnPropSymbols$1(b)) {\n if (__propIsEnum$1.call(b, prop))\n __defNormalProp(a, prop, b[prop]);\n }\n return a;\n};\nfunction useTimeout(interval = 1e3, options = {}) {\n const {\n controls: exposeControls = false\n } = options;\n const controls = useTimeoutFn(noop, interval, options);\n const ready = computed(() => !controls.isPending.value);\n if (exposeControls) {\n return __spreadValues({\n ready\n }, controls);\n } else {\n return ready;\n }\n}\n\nfunction useToggle(initialValue = false) {\n if (isRef(initialValue)) {\n return (value) => {\n initialValue.value = typeof value === \"boolean\" ? value : !initialValue.value;\n return initialValue.value;\n };\n } else {\n const boolean = ref(initialValue);\n const toggle = (value) => {\n boolean.value = typeof value === \"boolean\" ? value : !boolean.value;\n return boolean.value;\n };\n return [boolean, toggle];\n }\n}\n\nvar __getOwnPropSymbols = Object.getOwnPropertySymbols;\nvar __hasOwnProp = Object.prototype.hasOwnProperty;\nvar __propIsEnum = Object.prototype.propertyIsEnumerable;\nvar __objRest = (source, exclude) => {\n var target = {};\n for (var prop in source)\n if (__hasOwnProp.call(source, prop) && exclude.indexOf(prop) < 0)\n target[prop] = source[prop];\n if (source != null && __getOwnPropSymbols)\n for (var prop of __getOwnPropSymbols(source)) {\n if (exclude.indexOf(prop) < 0 && __propIsEnum.call(source, prop))\n target[prop] = source[prop];\n }\n return target;\n};\nfunction watchAtMost(source, cb, options) {\n const _a = options, {\n count\n } = _a, watchOptions = __objRest(_a, [\n \"count\"\n ]);\n const current = ref(0);\n const stop = watchWithFilter(source, (...args) => {\n current.value += 1;\n if (current.value >= unref(count))\n nextTick(() => stop());\n cb(...args);\n }, watchOptions);\n return { count: current, stop };\n}\n\nfunction watchOnce(source, cb, options) {\n const stop = watch(source, (...args) => {\n nextTick(() => stop());\n return cb(...args);\n }, options);\n}\n\nfunction whenever(source, cb, options) {\n return watch(source, (v, ov, onInvalidate) => {\n if (v)\n cb(v, ov, onInvalidate);\n }, options);\n}\n\nexport { and, assert, biSyncRef, bypassFilter, clamp, containsProp, controlledComputed, controlledRef, createEventHook, createFilterWrapper, createGlobalState, reactify as createReactiveFn, createSharedComposable, createSingletonPromise, debounceFilter, useDebounce as debouncedRef, debouncedWatch, eagerComputed, extendRef, get, identity, ignorableWatch, increaseWithUnit, invoke, isBoolean, isClient, isDef, isDefined, isFunction, isNumber, isObject, isString, isWindow, makeDestructurable, noop, not, now, objectPick, or, pausableFilter, pausableWatch, promiseTimeout, rand, reactify, reactifyObject, reactiveComputed, reactiveOmit, reactivePick, refDefault, set, syncRef, throttleFilter, useThrottle as throttledRef, throttledWatch, timestamp, toReactive, toRefs, tryOnBeforeUnmount, tryOnMounted, tryOnScopeDispose, tryOnUnmounted, until, useCounter, useDebounce, useDebounceFn, useInterval, useIntervalFn, useLastChanged, useThrottle, useThrottleFn, useTimeout, useTimeoutFn, useToggle, watchAtMost, watchOnce, watchWithFilter, whenever };\n","import { noop, isClient, isString, tryOnScopeDispose, tryOnMounted, promiseTimeout, increaseWithUnit, clamp, useTimeoutFn, watchWithFilter, createEventHook, isFunction, timestamp, pausableFilter, ignorableWatch, debounceFilter, createFilterWrapper, bypassFilter, createSingletonPromise, toRefs, containsProp, until, throttleFilter, useDebounceFn, useThrottleFn, isObject, isNumber, useIntervalFn, objectPick, tryOnUnmounted, identity, pausableWatch } from '@vueuse/shared';\nexport * from '@vueuse/shared';\nimport { isRef, ref, watchEffect, computed, customRef, unref, inject, watch, getCurrentInstance, onUpdated, reactive, shallowRef, markRaw, getCurrentScope, isVue2, set, del, onMounted, readonly, onBeforeUpdate } from 'vue-demi';\nimport { unrefElement as unrefElement$1, useEventListener as useEventListener$1, useClamp as useClamp$1, biSyncRef, noop as noop$1 } from '@vueuse/core';\n\nfunction asyncComputed(evaluationCallback, initialState, optionsOrRef) {\n let options;\n if (isRef(optionsOrRef)) {\n options = {\n evaluating: optionsOrRef\n };\n } else {\n options = optionsOrRef || {};\n }\n const {\n lazy = false,\n evaluating = void 0,\n onError = noop\n } = options;\n const started = ref(!lazy);\n const current = ref(initialState);\n let counter = 0;\n watchEffect(async (onInvalidate) => {\n if (!started.value)\n return;\n counter++;\n const counterAtBeginning = counter;\n let hasFinished = false;\n if (evaluating) {\n Promise.resolve().then(() => {\n evaluating.value = true;\n });\n }\n try {\n const result = await evaluationCallback((cancelCallback) => {\n onInvalidate(() => {\n if (evaluating)\n evaluating.value = false;\n if (!hasFinished)\n cancelCallback();\n });\n });\n if (counterAtBeginning === counter)\n current.value = result;\n } catch (e) {\n onError(e);\n } finally {\n if (evaluating)\n evaluating.value = false;\n hasFinished = true;\n }\n });\n if (lazy) {\n return computed(() => {\n started.value = true;\n return current.value;\n });\n } else {\n return current;\n }\n}\n\nfunction autoResetRef(defaultValue, afterMs = 1e4) {\n return customRef((track, trigger) => {\n let value = defaultValue;\n let timer;\n const resetAfter = () => setTimeout(() => {\n value = defaultValue;\n trigger();\n }, unref(afterMs));\n return {\n get() {\n track();\n return value;\n },\n set(newValue) {\n value = newValue;\n trigger();\n clearTimeout(timer);\n timer = resetAfter();\n }\n };\n });\n}\n\nfunction computedInject(key, options, defaultSource, treatDefaultAsFactory) {\n let source = inject(key);\n if (defaultSource)\n source = inject(key, defaultSource);\n if (treatDefaultAsFactory)\n source = inject(key, defaultSource, treatDefaultAsFactory);\n if (typeof options === \"function\") {\n return computed((ctx) => options(source, ctx));\n } else {\n return computed({\n get: (ctx) => options.get(source, ctx),\n set: options.set\n });\n }\n}\n\nconst createUnrefFn = (fn) => {\n return function(...args) {\n return fn.apply(this, args.map((i) => unref(i)));\n };\n};\n\nfunction unrefElement(elRef) {\n var _a;\n const plain = unref(elRef);\n return (_a = plain == null ? void 0 : plain.$el) != null ? _a : plain;\n}\n\nconst defaultWindow = isClient ? window : void 0;\nconst defaultDocument = isClient ? window.document : void 0;\nconst defaultNavigator = isClient ? window.navigator : void 0;\nconst defaultLocation = isClient ? window.location : void 0;\n\nfunction useEventListener(...args) {\n let target;\n let event;\n let listener;\n let options;\n if (isString(args[0])) {\n [event, listener, options] = args;\n target = defaultWindow;\n } else {\n [target, event, listener, options] = args;\n }\n if (!target)\n return noop;\n let cleanup = noop;\n const stopWatch = watch(() => unref(target), (el) => {\n cleanup();\n if (!el)\n return;\n el.addEventListener(event, listener, options);\n cleanup = () => {\n el.removeEventListener(event, listener, options);\n cleanup = noop;\n };\n }, { immediate: true, flush: \"post\" });\n const stop = () => {\n stopWatch();\n cleanup();\n };\n tryOnScopeDispose(stop);\n return stop;\n}\n\nfunction onClickOutside(target, handler, options = {}) {\n const { window = defaultWindow, ignore } = options;\n if (!window)\n return;\n const shouldListen = ref(true);\n const listener = (event) => {\n const el = unrefElement(target);\n const composedPath = event.composedPath();\n if (!el || el === event.target || composedPath.includes(el) || !shouldListen.value)\n return;\n if (ignore && ignore.length > 0) {\n if (ignore.some((target2) => {\n const el2 = unrefElement(target2);\n return el2 && (event.target === el2 || composedPath.includes(el2));\n }))\n return;\n }\n handler(event);\n };\n const cleanup = [\n useEventListener(window, \"click\", listener, { passive: true, capture: true }),\n useEventListener(window, \"pointerdown\", (e) => {\n const el = unrefElement(target);\n shouldListen.value = !!el && !e.composedPath().includes(el);\n }, { passive: true })\n ];\n const stop = () => cleanup.forEach((fn) => fn());\n return stop;\n}\n\nvar __defProp$h = Object.defineProperty;\nvar __defProps$9 = Object.defineProperties;\nvar __getOwnPropDescs$9 = Object.getOwnPropertyDescriptors;\nvar __getOwnPropSymbols$j = Object.getOwnPropertySymbols;\nvar __hasOwnProp$j = Object.prototype.hasOwnProperty;\nvar __propIsEnum$j = Object.prototype.propertyIsEnumerable;\nvar __defNormalProp$h = (obj, key, value) => key in obj ? __defProp$h(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;\nvar __spreadValues$h = (a, b) => {\n for (var prop in b || (b = {}))\n if (__hasOwnProp$j.call(b, prop))\n __defNormalProp$h(a, prop, b[prop]);\n if (__getOwnPropSymbols$j)\n for (var prop of __getOwnPropSymbols$j(b)) {\n if (__propIsEnum$j.call(b, prop))\n __defNormalProp$h(a, prop, b[prop]);\n }\n return a;\n};\nvar __spreadProps$9 = (a, b) => __defProps$9(a, __getOwnPropDescs$9(b));\nconst createKeyPredicate = (keyFilter) => {\n if (typeof keyFilter === \"function\")\n return keyFilter;\n else if (typeof keyFilter === \"string\")\n return (event) => event.key === keyFilter;\n else if (Array.isArray(keyFilter))\n return (event) => keyFilter.includes(event.key);\n else if (keyFilter)\n return () => true;\n else\n return () => false;\n};\nfunction onKeyStroke(key, handler, options = {}) {\n const { target = defaultWindow, eventName = \"keydown\", passive = false } = options;\n const predicate = createKeyPredicate(key);\n const listener = (e) => {\n if (predicate(e))\n handler(e);\n };\n return useEventListener(target, eventName, listener, passive);\n}\nfunction onKeyDown(key, handler, options = {}) {\n return onKeyStroke(key, handler, __spreadProps$9(__spreadValues$h({}, options), { eventName: \"keydown\" }));\n}\nfunction onKeyPressed(key, handler, options = {}) {\n return onKeyStroke(key, handler, __spreadProps$9(__spreadValues$h({}, options), { eventName: \"keypress\" }));\n}\nfunction onKeyUp(key, handler, options = {}) {\n return onKeyStroke(key, handler, __spreadProps$9(__spreadValues$h({}, options), { eventName: \"keyup\" }));\n}\n\nconst DEFAULT_DELAY = 500;\nfunction onLongPress(target, handler, options) {\n const elementRef = computed(() => unrefElement$1(target));\n let timeout = null;\n function clear() {\n if (timeout != null) {\n clearTimeout(timeout);\n timeout = null;\n }\n }\n function onDown(ev) {\n var _a;\n clear();\n timeout = setTimeout(() => handler(ev), (_a = options == null ? void 0 : options.delay) != null ? _a : DEFAULT_DELAY);\n }\n useEventListener$1(elementRef, \"pointerdown\", onDown);\n useEventListener$1(elementRef, \"pointerup\", clear);\n useEventListener$1(elementRef, \"pointerleave\", clear);\n}\n\nconst isFocusedElementEditable = () => {\n const { activeElement, body } = document;\n if (!activeElement)\n return false;\n if (activeElement === body)\n return false;\n switch (activeElement.tagName) {\n case \"INPUT\":\n case \"TEXTAREA\":\n return true;\n }\n return activeElement.hasAttribute(\"contenteditable\");\n};\nconst isTypedCharValid = ({\n keyCode,\n metaKey,\n ctrlKey,\n altKey\n}) => {\n if (metaKey || ctrlKey || altKey)\n return false;\n if (keyCode >= 48 && keyCode <= 57 || keyCode >= 96 && keyCode <= 105)\n return true;\n if (keyCode >= 65 && keyCode <= 90)\n return true;\n return false;\n};\nfunction onStartTyping(callback, options = {}) {\n const { document: document2 = defaultDocument } = options;\n const keydown = (event) => {\n !isFocusedElementEditable() && isTypedCharValid(event) && callback(event);\n };\n if (document2)\n useEventListener(document2, \"keydown\", keydown, { passive: true });\n}\n\nfunction templateRef(key, initialValue = null) {\n const instance = getCurrentInstance();\n let _trigger = () => {\n };\n const element = customRef((track, trigger) => {\n _trigger = trigger;\n return {\n get() {\n var _a, _b;\n track();\n return (_b = (_a = instance == null ? void 0 : instance.proxy) == null ? void 0 : _a.$refs[key]) != null ? _b : initialValue;\n },\n set() {\n }\n };\n });\n tryOnMounted(_trigger);\n onUpdated(_trigger);\n return element;\n}\n\nfunction useActiveElement(options = {}) {\n const { window = defaultWindow } = options;\n const counter = ref(0);\n if (window) {\n useEventListener(window, \"blur\", () => counter.value += 1, true);\n useEventListener(window, \"focus\", () => counter.value += 1, true);\n }\n return computed(() => {\n counter.value;\n return window == null ? void 0 : window.document.activeElement;\n });\n}\n\nfunction useAsyncQueue(tasks, options = {}) {\n const {\n interrupt = true,\n onError = noop,\n onFinished = noop\n } = options;\n const promiseState = {\n pending: \"pending\",\n rejected: \"rejected\",\n fulfilled: \"fulfilled\"\n };\n const initialResult = Array.from(new Array(tasks.length), () => ({ state: promiseState.pending, data: null }));\n const result = reactive(initialResult);\n const activeIndex = ref(-1);\n if (!tasks || tasks.length === 0) {\n onFinished();\n return {\n activeIndex,\n result\n };\n }\n function updateResult(state, res) {\n activeIndex.value++;\n result[activeIndex.value].data = res;\n result[activeIndex.value].state = state;\n }\n tasks.reduce((prev, curr) => {\n return prev.then((prevRes) => {\n var _a;\n if (((_a = result[activeIndex.value]) == null ? void 0 : _a.state) === promiseState.rejected && interrupt) {\n onFinished();\n return;\n }\n return curr(prevRes).then((currentRes) => {\n updateResult(promiseState.fulfilled, currentRes);\n activeIndex.value === tasks.length - 1 && onFinished();\n return currentRes;\n });\n }).catch((e) => {\n updateResult(promiseState.rejected, e);\n onError();\n return e;\n });\n }, Promise.resolve());\n return {\n activeIndex,\n result\n };\n}\n\nfunction useAsyncState(promise, initialState, options) {\n const {\n immediate = true,\n delay = 0,\n onError = noop,\n resetOnExecute = true,\n shallow = true\n } = options != null ? options : {};\n const state = shallow ? shallowRef(initialState) : ref(initialState);\n const isReady = ref(false);\n const isLoading = ref(false);\n const error = ref(void 0);\n async function execute(delay2 = 0, ...args) {\n if (resetOnExecute)\n state.value = initialState;\n error.value = void 0;\n isReady.value = false;\n isLoading.value = true;\n if (delay2 > 0)\n await promiseTimeout(delay2);\n const _promise = typeof promise === \"function\" ? promise(...args) : promise;\n try {\n const data = await _promise;\n state.value = data;\n isReady.value = true;\n } catch (e) {\n error.value = e;\n onError(e);\n }\n isLoading.value = false;\n return state.value;\n }\n if (immediate)\n execute(delay);\n return {\n state,\n isReady,\n isLoading,\n error,\n execute\n };\n}\n\nfunction useBase64(target, options) {\n const base64 = ref(\"\");\n const promise = ref();\n function execute() {\n if (!isClient)\n return;\n promise.value = new Promise((resolve, reject) => {\n try {\n const _target = unref(target);\n if (_target === void 0 || _target === null) {\n resolve(\"\");\n } else if (typeof _target === \"string\") {\n resolve(blobToBase64(new Blob([_target], { type: \"text/plain\" })));\n } else if (_target instanceof Blob) {\n resolve(blobToBase64(_target));\n } else if (_target instanceof ArrayBuffer) {\n resolve(window.btoa(String.fromCharCode(...new Uint8Array(_target))));\n } else if (_target instanceof HTMLCanvasElement) {\n resolve(_target.toDataURL(options == null ? void 0 : options.type, options == null ? void 0 : options.quality));\n } else if (_target instanceof HTMLImageElement) {\n const img = _target.cloneNode(false);\n img.crossOrigin = \"Anonymous\";\n imgLoaded(img).then(() => {\n const canvas = document.createElement(\"canvas\");\n const ctx = canvas.getContext(\"2d\");\n canvas.width = img.width;\n canvas.height = img.height;\n ctx.drawImage(img, 0, 0, canvas.width, canvas.height);\n resolve(canvas.toDataURL(options == null ? void 0 : options.type, options == null ? void 0 : options.quality));\n }).catch(reject);\n } else {\n reject(new Error(\"target is unsupported types\"));\n }\n } catch (error) {\n reject(error);\n }\n });\n promise.value.then((res) => base64.value = res);\n return promise.value;\n }\n watch(target, execute, { immediate: true });\n return {\n base64,\n promise,\n execute\n };\n}\nfunction imgLoaded(img) {\n return new Promise((resolve, reject) => {\n if (!img.complete) {\n img.onload = () => {\n resolve();\n };\n img.onerror = reject;\n } else {\n resolve();\n }\n });\n}\nfunction blobToBase64(blob) {\n return new Promise((resolve, reject) => {\n const fr = new FileReader();\n fr.onload = (e) => {\n resolve(e.target.result);\n };\n fr.onerror = reject;\n fr.readAsDataURL(blob);\n });\n}\n\nfunction useBattery({ navigator = defaultNavigator } = {}) {\n const events = [\"chargingchange\", \"chargingtimechange\", \"dischargingtimechange\", \"levelchange\"];\n const isSupported = navigator && \"getBattery\" in navigator;\n const charging = ref(false);\n const chargingTime = ref(0);\n const dischargingTime = ref(0);\n const level = ref(1);\n let battery;\n function updateBatteryInfo() {\n charging.value = this.charging;\n chargingTime.value = this.chargingTime || 0;\n dischargingTime.value = this.dischargingTime || 0;\n level.value = this.level;\n }\n if (isSupported) {\n navigator.getBattery().then((_battery) => {\n battery = _battery;\n updateBatteryInfo.call(battery);\n for (const event of events)\n useEventListener(battery, event, updateBatteryInfo, { passive: true });\n });\n }\n return {\n isSupported,\n charging,\n chargingTime,\n dischargingTime,\n level\n };\n}\n\nfunction useMediaQuery(query, options = {}) {\n const { window = defaultWindow } = options;\n let mediaQuery;\n const matches = ref(false);\n const update = () => {\n if (!window)\n return;\n if (!mediaQuery)\n mediaQuery = window.matchMedia(query);\n matches.value = mediaQuery.matches;\n };\n tryOnMounted(() => {\n update();\n if (!mediaQuery)\n return;\n if (\"addEventListener\" in mediaQuery)\n mediaQuery.addEventListener(\"change\", update);\n else\n mediaQuery.addListener(update);\n tryOnScopeDispose(() => {\n if (\"removeEventListener\" in update)\n mediaQuery.removeEventListener(\"change\", update);\n else\n mediaQuery.removeListener(update);\n });\n });\n return matches;\n}\n\nconst breakpointsTailwind = {\n \"sm\": 640,\n \"md\": 768,\n \"lg\": 1024,\n \"xl\": 1280,\n \"2xl\": 1536\n};\nconst breakpointsBootstrapV5 = {\n sm: 576,\n md: 768,\n lg: 992,\n xl: 1200,\n xxl: 1400\n};\nconst breakpointsVuetify = {\n xs: 600,\n sm: 960,\n md: 1264,\n lg: 1904\n};\nconst breakpointsAntDesign = {\n xs: 480,\n sm: 576,\n md: 768,\n lg: 992,\n xl: 1200,\n xxl: 1600\n};\nconst breakpointsQuasar = {\n xs: 600,\n sm: 1024,\n md: 1440,\n lg: 1920\n};\nconst breakpointsSematic = {\n mobileS: 320,\n mobileM: 375,\n mobileL: 425,\n tablet: 768,\n laptop: 1024,\n laptopL: 1440,\n desktop4K: 2560\n};\n\nvar __defProp$g = Object.defineProperty;\nvar __getOwnPropSymbols$i = Object.getOwnPropertySymbols;\nvar __hasOwnProp$i = Object.prototype.hasOwnProperty;\nvar __propIsEnum$i = Object.prototype.propertyIsEnumerable;\nvar __defNormalProp$g = (obj, key, value) => key in obj ? __defProp$g(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;\nvar __spreadValues$g = (a, b) => {\n for (var prop in b || (b = {}))\n if (__hasOwnProp$i.call(b, prop))\n __defNormalProp$g(a, prop, b[prop]);\n if (__getOwnPropSymbols$i)\n for (var prop of __getOwnPropSymbols$i(b)) {\n if (__propIsEnum$i.call(b, prop))\n __defNormalProp$g(a, prop, b[prop]);\n }\n return a;\n};\nfunction useBreakpoints(breakpoints, options = {}) {\n function getValue(k, delta) {\n let v = breakpoints[k];\n if (delta != null)\n v = increaseWithUnit(v, delta);\n if (typeof v === \"number\")\n v = `${v}px`;\n return v;\n }\n const { window = defaultWindow } = options;\n function match(query) {\n if (!window)\n return false;\n return window.matchMedia(query).matches;\n }\n const greater = (k) => {\n return useMediaQuery(`(min-width: ${getValue(k)})`, options);\n };\n const shortcutMethods = Object.keys(breakpoints).reduce((shortcuts, k) => {\n Object.defineProperty(shortcuts, k, {\n get: () => greater(k),\n enumerable: true,\n configurable: true\n });\n return shortcuts;\n }, {});\n return __spreadValues$g({\n greater,\n smaller(k) {\n return useMediaQuery(`(max-width: ${getValue(k, -0.1)})`, options);\n },\n between(a, b) {\n return useMediaQuery(`(min-width: ${getValue(a)}) and (max-width: ${getValue(b, -0.1)})`, options);\n },\n isGreater(k) {\n return match(`(min-width: ${getValue(k)})`);\n },\n isSmaller(k) {\n return match(`(max-width: ${getValue(k, -0.1)})`);\n },\n isInBetween(a, b) {\n return match(`(min-width: ${getValue(a)}) and (max-width: ${getValue(b, -0.1)})`);\n }\n }, shortcutMethods);\n}\n\nconst useBroadcastChannel = (options) => {\n const {\n name,\n window = defaultWindow\n } = options;\n const isSupported = window && \"BroadcastChannel\" in window;\n const isClosed = ref(false);\n const channel = ref();\n const data = ref();\n const error = ref(null);\n const post = (data2) => {\n if (channel.value)\n channel.value.postMessage(data2);\n };\n const close = () => {\n if (channel.value)\n channel.value.close();\n isClosed.value = true;\n };\n if (isSupported) {\n tryOnMounted(() => {\n error.value = null;\n channel.value = new BroadcastChannel(name);\n channel.value.addEventListener(\"message\", (e) => {\n data.value = e.data;\n }, { passive: true });\n channel.value.addEventListener(\"messageerror\", (e) => {\n error.value = e;\n }, { passive: true });\n channel.value.addEventListener(\"close\", () => {\n isClosed.value = true;\n });\n });\n }\n tryOnScopeDispose(() => {\n close();\n });\n return {\n isSupported,\n channel,\n data,\n post,\n close,\n error,\n isClosed\n };\n};\n\nfunction useBrowserLocation({ window = defaultWindow } = {}) {\n const buildState = (trigger) => {\n const { state: state2, length } = (window == null ? void 0 : window.history) || {};\n const { hash, host, hostname, href, origin, pathname, port, protocol, search } = (window == null ? void 0 : window.location) || {};\n return {\n trigger,\n state: state2,\n length,\n hash,\n host,\n hostname,\n href,\n origin,\n pathname,\n port,\n protocol,\n search\n };\n };\n const state = ref(buildState(\"load\"));\n if (window) {\n useEventListener(window, \"popstate\", () => state.value = buildState(\"popstate\"), { passive: true });\n useEventListener(window, \"hashchange\", () => state.value = buildState(\"hashchange\"), { passive: true });\n }\n return state;\n}\n\nfunction useCached(refValue, comparator = (a, b) => a === b, watchOptions) {\n const cachedValue = ref(refValue.value);\n watch(() => refValue.value, (value) => {\n if (!comparator(value, cachedValue.value))\n cachedValue.value = value;\n }, watchOptions);\n return cachedValue;\n}\n\nfunction useClamp(value, min, max) {\n const _value = ref(value);\n return computed({\n get() {\n return _value.value = clamp(_value.value, unref(min), unref(max));\n },\n set(value2) {\n _value.value = clamp(value2, unref(min), unref(max));\n }\n });\n}\n\nfunction useClipboard(options = {}) {\n const {\n navigator = defaultNavigator,\n read = false,\n source,\n copiedDuring = 1500\n } = options;\n const events = [\"copy\", \"cut\"];\n const isSupported = Boolean(navigator && \"clipboard\" in navigator);\n const text = ref(\"\");\n const copied = ref(false);\n const timeout = useTimeoutFn(() => copied.value = false, copiedDuring);\n function updateText() {\n navigator.clipboard.readText().then((value) => {\n text.value = value;\n });\n }\n if (isSupported && read) {\n for (const event of events)\n useEventListener(event, updateText);\n }\n async function copy(value = unref(source)) {\n if (isSupported && value != null) {\n await navigator.clipboard.writeText(value);\n text.value = value;\n copied.value = true;\n timeout.start();\n }\n }\n return {\n isSupported,\n text,\n copied,\n copy\n };\n}\n\nconst _global = typeof globalThis !== \"undefined\" ? globalThis : typeof window !== \"undefined\" ? window : typeof global !== \"undefined\" ? global : typeof self !== \"undefined\" ? self : {};\nconst globalKey = \"__vueuse_ssr_handlers__\";\n_global[globalKey] = _global[globalKey] || {};\nconst handlers = _global[globalKey];\nfunction getSSRHandler(key, fallback) {\n return handlers[key] || fallback;\n}\nfunction setSSRHandler(key, fn) {\n handlers[key] = fn;\n}\n\nfunction guessSerializerType(rawInit) {\n return rawInit == null ? \"any\" : rawInit instanceof Set ? \"set\" : rawInit instanceof Map ? \"map\" : typeof rawInit === \"boolean\" ? \"boolean\" : typeof rawInit === \"string\" ? \"string\" : typeof rawInit === \"object\" ? \"object\" : Array.isArray(rawInit) ? \"object\" : !Number.isNaN(rawInit) ? \"number\" : \"any\";\n}\n\nconst StorageSerializers = {\n boolean: {\n read: (v) => v === \"true\",\n write: (v) => String(v)\n },\n object: {\n read: (v) => JSON.parse(v),\n write: (v) => JSON.stringify(v)\n },\n number: {\n read: (v) => Number.parseFloat(v),\n write: (v) => String(v)\n },\n any: {\n read: (v) => v,\n write: (v) => String(v)\n },\n string: {\n read: (v) => v,\n write: (v) => String(v)\n },\n map: {\n read: (v) => new Map(JSON.parse(v)),\n write: (v) => JSON.stringify(Array.from(v.entries()))\n },\n set: {\n read: (v) => new Set(JSON.parse(v)),\n write: (v) => JSON.stringify(Array.from(v.entries()))\n }\n};\nfunction useStorage(key, initialValue, storage, options = {}) {\n var _a;\n const {\n flush = \"pre\",\n deep = true,\n listenToStorageChanges = true,\n writeDefaults = true,\n shallow,\n window = defaultWindow,\n eventFilter,\n onError = (e) => {\n console.error(e);\n }\n } = options;\n const rawInit = unref(initialValue);\n const type = guessSerializerType(rawInit);\n const data = (shallow ? shallowRef : ref)(initialValue);\n const serializer = (_a = options.serializer) != null ? _a : StorageSerializers[type];\n if (!storage) {\n try {\n storage = getSSRHandler(\"getDefaultStorage\", () => {\n var _a2;\n return (_a2 = defaultWindow) == null ? void 0 : _a2.localStorage;\n })();\n } catch (e) {\n onError(e);\n }\n }\n function read(event) {\n if (!storage || event && event.key !== key)\n return;\n try {\n const rawValue = event ? event.newValue : storage.getItem(key);\n if (rawValue == null) {\n data.value = rawInit;\n if (writeDefaults && rawInit !== null)\n storage.setItem(key, serializer.write(rawInit));\n } else if (typeof rawValue !== \"string\") {\n data.value = rawValue;\n } else {\n data.value = serializer.read(rawValue);\n }\n } catch (e) {\n onError(e);\n }\n }\n read();\n if (window && listenToStorageChanges)\n useEventListener(window, \"storage\", (e) => setTimeout(() => read(e), 0));\n if (storage) {\n watchWithFilter(data, () => {\n try {\n if (data.value == null)\n storage.removeItem(key);\n else\n storage.setItem(key, serializer.write(data.value));\n } catch (e) {\n onError(e);\n }\n }, {\n flush,\n deep,\n eventFilter\n });\n }\n return data;\n}\n\nfunction usePreferredDark(options) {\n return useMediaQuery(\"(prefers-color-scheme: dark)\", options);\n}\n\nvar __defProp$f = Object.defineProperty;\nvar __getOwnPropSymbols$h = Object.getOwnPropertySymbols;\nvar __hasOwnProp$h = Object.prototype.hasOwnProperty;\nvar __propIsEnum$h = Object.prototype.propertyIsEnumerable;\nvar __defNormalProp$f = (obj, key, value) => key in obj ? __defProp$f(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;\nvar __spreadValues$f = (a, b) => {\n for (var prop in b || (b = {}))\n if (__hasOwnProp$h.call(b, prop))\n __defNormalProp$f(a, prop, b[prop]);\n if (__getOwnPropSymbols$h)\n for (var prop of __getOwnPropSymbols$h(b)) {\n if (__propIsEnum$h.call(b, prop))\n __defNormalProp$f(a, prop, b[prop]);\n }\n return a;\n};\nfunction useColorMode(options = {}) {\n const {\n selector = \"html\",\n attribute = \"class\",\n window = defaultWindow,\n storage,\n storageKey = \"vueuse-color-scheme\",\n listenToStorageChanges = true,\n storageRef\n } = options;\n const modes = __spreadValues$f({\n auto: \"\",\n light: \"light\",\n dark: \"dark\"\n }, options.modes || {});\n const preferredDark = usePreferredDark({ window });\n const preferredMode = computed(() => preferredDark.value ? \"dark\" : \"light\");\n const store = storageRef || (storageKey == null ? ref(\"auto\") : useStorage(storageKey, \"auto\", storage, { window, listenToStorageChanges }));\n const state = computed({\n get() {\n return store.value === \"auto\" ? preferredMode.value : store.value;\n },\n set(v) {\n store.value = v;\n }\n });\n const updateHTMLAttrs = getSSRHandler(\"updateHTMLAttrs\", (selector2, attribute2, value) => {\n const el = window == null ? void 0 : window.document.querySelector(selector2);\n if (!el)\n return;\n if (attribute2 === \"class\") {\n const current = value.split(/\\s/g);\n Object.values(modes).flatMap((i) => (i || \"\").split(/\\s/g)).filter(Boolean).forEach((v) => {\n if (current.includes(v))\n el.classList.add(v);\n else\n el.classList.remove(v);\n });\n } else {\n el.setAttribute(attribute2, value);\n }\n });\n function defaultOnChanged(mode) {\n var _a;\n updateHTMLAttrs(selector, attribute, (_a = modes[mode]) != null ? _a : mode);\n }\n function onChanged(mode) {\n if (options.onChanged)\n options.onChanged(mode, defaultOnChanged);\n else\n defaultOnChanged(mode);\n }\n watch(state, onChanged, { flush: \"post\", immediate: true });\n tryOnMounted(() => onChanged(state.value));\n return state;\n}\n\nfunction useConfirmDialog(revealed = ref(false)) {\n const confirmHook = createEventHook();\n const cancelHook = createEventHook();\n const revealHook = createEventHook();\n let _resolve = noop;\n const reveal = (data) => {\n revealHook.trigger(data);\n revealed.value = true;\n return new Promise((resolve) => {\n _resolve = resolve;\n });\n };\n const confirm = (data) => {\n revealed.value = false;\n confirmHook.trigger(data);\n _resolve({ data, isCanceled: false });\n };\n const cancel = (data) => {\n revealed.value = false;\n cancelHook.trigger(data);\n _resolve({ data, isCanceled: true });\n };\n return {\n isRevealed: computed(() => revealed.value),\n reveal,\n confirm,\n cancel,\n onReveal: revealHook.on,\n onConfirm: confirmHook.on,\n onCancel: cancelHook.on\n };\n}\n\nfunction useCssVar(prop, target, { window = defaultWindow } = {}) {\n const variable = ref(\"\");\n const elRef = computed(() => {\n var _a;\n return unrefElement(target) || ((_a = window == null ? void 0 : window.document) == null ? void 0 : _a.documentElement);\n });\n watch([elRef, () => unref(prop)], ([el, prop2]) => {\n if (el && window)\n variable.value = window.getComputedStyle(el).getPropertyValue(prop2);\n }, { immediate: true });\n watch(variable, (val) => {\n var _a;\n if ((_a = elRef.value) == null ? void 0 : _a.style)\n elRef.value.style.setProperty(unref(prop), val);\n });\n return variable;\n}\n\nfunction useCycleList(list, options) {\n var _a;\n const state = shallowRef((_a = options == null ? void 0 : options.initialValue) != null ? _a : list[0]);\n const index = computed({\n get() {\n var _a2;\n let index2 = (options == null ? void 0 : options.getIndexOf) ? options.getIndexOf(state.value, list) : list.indexOf(state.value);\n if (index2 < 0)\n index2 = (_a2 = options == null ? void 0 : options.fallbackIndex) != null ? _a2 : 0;\n return index2;\n },\n set(v) {\n set(v);\n }\n });\n function set(i) {\n const length = list.length;\n const index2 = (i % length + length) % length;\n const value = list[index2];\n state.value = value;\n return value;\n }\n function shift(delta = 1) {\n return set(index.value + delta);\n }\n function next(n = 1) {\n return shift(n);\n }\n function prev(n = 1) {\n return shift(-n);\n }\n return {\n state,\n index,\n next,\n prev\n };\n}\n\nvar __defProp$e = Object.defineProperty;\nvar __defProps$8 = Object.defineProperties;\nvar __getOwnPropDescs$8 = Object.getOwnPropertyDescriptors;\nvar __getOwnPropSymbols$g = Object.getOwnPropertySymbols;\nvar __hasOwnProp$g = Object.prototype.hasOwnProperty;\nvar __propIsEnum$g = Object.prototype.propertyIsEnumerable;\nvar __defNormalProp$e = (obj, key, value) => key in obj ? __defProp$e(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;\nvar __spreadValues$e = (a, b) => {\n for (var prop in b || (b = {}))\n if (__hasOwnProp$g.call(b, prop))\n __defNormalProp$e(a, prop, b[prop]);\n if (__getOwnPropSymbols$g)\n for (var prop of __getOwnPropSymbols$g(b)) {\n if (__propIsEnum$g.call(b, prop))\n __defNormalProp$e(a, prop, b[prop]);\n }\n return a;\n};\nvar __spreadProps$8 = (a, b) => __defProps$8(a, __getOwnPropDescs$8(b));\nfunction useDark(options = {}) {\n const {\n valueDark = \"dark\",\n valueLight = \"\",\n window = defaultWindow\n } = options;\n const mode = useColorMode(__spreadProps$8(__spreadValues$e({}, options), {\n onChanged: (mode2, defaultHandler) => {\n var _a;\n if (options.onChanged)\n (_a = options.onChanged) == null ? void 0 : _a.call(options, mode2 === \"dark\");\n else\n defaultHandler(mode2);\n },\n modes: {\n dark: valueDark,\n light: valueLight\n }\n }));\n const preferredDark = usePreferredDark({ window });\n const isDark = computed({\n get() {\n return mode.value === \"dark\";\n },\n set(v) {\n if (v === preferredDark.value)\n mode.value = \"auto\";\n else\n mode.value = v ? \"dark\" : \"light\";\n }\n });\n return isDark;\n}\n\nconst fnClone = (v) => JSON.parse(JSON.stringify(v));\nconst fnBypass = (v) => v;\nconst fnSetSource = (source, value) => source.value = value;\nfunction defaultDump(clone) {\n return clone ? isFunction(clone) ? clone : fnClone : fnBypass;\n}\nfunction defaultParse(clone) {\n return clone ? isFunction(clone) ? clone : fnClone : fnBypass;\n}\nfunction useManualRefHistory(source, options = {}) {\n const {\n clone = false,\n dump = defaultDump(clone),\n parse = defaultParse(clone),\n setSource = fnSetSource\n } = options;\n function _createHistoryRecord() {\n return markRaw({\n snapshot: dump(source.value),\n timestamp: timestamp()\n });\n }\n const last = ref(_createHistoryRecord());\n const undoStack = ref([]);\n const redoStack = ref([]);\n const _setSource = (record) => {\n setSource(source, parse(record.snapshot));\n last.value = record;\n };\n const commit = () => {\n undoStack.value.unshift(last.value);\n last.value = _createHistoryRecord();\n if (options.capacity && undoStack.value.length > options.capacity)\n undoStack.value.splice(options.capacity, Infinity);\n if (redoStack.value.length)\n redoStack.value.splice(0, redoStack.value.length);\n };\n const clear = () => {\n undoStack.value.splice(0, undoStack.value.length);\n redoStack.value.splice(0, redoStack.value.length);\n };\n const undo = () => {\n const state = undoStack.value.shift();\n if (state) {\n redoStack.value.unshift(last.value);\n _setSource(state);\n }\n };\n const redo = () => {\n const state = redoStack.value.shift();\n if (state) {\n undoStack.value.unshift(last.value);\n _setSource(state);\n }\n };\n const reset = () => {\n _setSource(last.value);\n };\n const history = computed(() => [last.value, ...undoStack.value]);\n const canUndo = computed(() => undoStack.value.length > 0);\n const canRedo = computed(() => redoStack.value.length > 0);\n return {\n source,\n undoStack,\n redoStack,\n last,\n history,\n canUndo,\n canRedo,\n clear,\n commit,\n reset,\n undo,\n redo\n };\n}\n\nvar __defProp$d = Object.defineProperty;\nvar __defProps$7 = Object.defineProperties;\nvar __getOwnPropDescs$7 = Object.getOwnPropertyDescriptors;\nvar __getOwnPropSymbols$f = Object.getOwnPropertySymbols;\nvar __hasOwnProp$f = Object.prototype.hasOwnProperty;\nvar __propIsEnum$f = Object.prototype.propertyIsEnumerable;\nvar __defNormalProp$d = (obj, key, value) => key in obj ? __defProp$d(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;\nvar __spreadValues$d = (a, b) => {\n for (var prop in b || (b = {}))\n if (__hasOwnProp$f.call(b, prop))\n __defNormalProp$d(a, prop, b[prop]);\n if (__getOwnPropSymbols$f)\n for (var prop of __getOwnPropSymbols$f(b)) {\n if (__propIsEnum$f.call(b, prop))\n __defNormalProp$d(a, prop, b[prop]);\n }\n return a;\n};\nvar __spreadProps$7 = (a, b) => __defProps$7(a, __getOwnPropDescs$7(b));\nfunction useRefHistory(source, options = {}) {\n const {\n deep = false,\n flush = \"pre\",\n eventFilter\n } = options;\n const {\n eventFilter: composedFilter,\n pause,\n resume: resumeTracking,\n isActive: isTracking\n } = pausableFilter(eventFilter);\n const {\n ignoreUpdates,\n ignorePrevAsyncUpdates,\n stop\n } = ignorableWatch(source, commit, { deep, flush, eventFilter: composedFilter });\n function setSource(source2, value) {\n ignorePrevAsyncUpdates();\n ignoreUpdates(() => {\n source2.value = value;\n });\n }\n const manualHistory = useManualRefHistory(source, __spreadProps$7(__spreadValues$d({}, options), { clone: options.clone || deep, setSource }));\n const { clear, commit: manualCommit } = manualHistory;\n function commit() {\n ignorePrevAsyncUpdates();\n manualCommit();\n }\n function resume(commitNow) {\n resumeTracking();\n if (commitNow)\n commit();\n }\n function batch(fn) {\n let canceled = false;\n const cancel = () => canceled = true;\n ignoreUpdates(() => {\n fn(cancel);\n });\n if (!canceled)\n commit();\n }\n function dispose() {\n stop();\n clear();\n }\n return __spreadProps$7(__spreadValues$d({}, manualHistory), {\n isTracking,\n pause,\n resume,\n commit,\n batch,\n dispose\n });\n}\n\nvar __defProp$c = Object.defineProperty;\nvar __defProps$6 = Object.defineProperties;\nvar __getOwnPropDescs$6 = Object.getOwnPropertyDescriptors;\nvar __getOwnPropSymbols$e = Object.getOwnPropertySymbols;\nvar __hasOwnProp$e = Object.prototype.hasOwnProperty;\nvar __propIsEnum$e = Object.prototype.propertyIsEnumerable;\nvar __defNormalProp$c = (obj, key, value) => key in obj ? __defProp$c(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;\nvar __spreadValues$c = (a, b) => {\n for (var prop in b || (b = {}))\n if (__hasOwnProp$e.call(b, prop))\n __defNormalProp$c(a, prop, b[prop]);\n if (__getOwnPropSymbols$e)\n for (var prop of __getOwnPropSymbols$e(b)) {\n if (__propIsEnum$e.call(b, prop))\n __defNormalProp$c(a, prop, b[prop]);\n }\n return a;\n};\nvar __spreadProps$6 = (a, b) => __defProps$6(a, __getOwnPropDescs$6(b));\nfunction useDebouncedRefHistory(source, options = {}) {\n const filter = options.debounce ? debounceFilter(options.debounce) : void 0;\n const history = useRefHistory(source, __spreadProps$6(__spreadValues$c({}, options), { eventFilter: filter }));\n return __spreadValues$c({}, history);\n}\n\nfunction useDeviceMotion(options = {}) {\n const {\n window = defaultWindow,\n eventFilter = bypassFilter\n } = options;\n const acceleration = ref({ x: null, y: null, z: null });\n const rotationRate = ref({ alpha: null, beta: null, gamma: null });\n const interval = ref(0);\n const accelerationIncludingGravity = ref({\n x: null,\n y: null,\n z: null\n });\n if (window) {\n const onDeviceMotion = createFilterWrapper(eventFilter, (event) => {\n acceleration.value = event.acceleration;\n accelerationIncludingGravity.value = event.accelerationIncludingGravity;\n rotationRate.value = event.rotationRate;\n interval.value = event.interval;\n });\n useEventListener(window, \"devicemotion\", onDeviceMotion);\n }\n return {\n acceleration,\n accelerationIncludingGravity,\n rotationRate,\n interval\n };\n}\n\nfunction useDeviceOrientation(options = {}) {\n const { window = defaultWindow } = options;\n const isSupported = Boolean(window && \"DeviceOrientationEvent\" in window);\n const isAbsolute = ref(false);\n const alpha = ref(null);\n const beta = ref(null);\n const gamma = ref(null);\n if (window && isSupported) {\n useEventListener(window, \"deviceorientation\", (event) => {\n isAbsolute.value = event.absolute;\n alpha.value = event.alpha;\n beta.value = event.beta;\n gamma.value = event.gamma;\n });\n }\n return {\n isSupported,\n isAbsolute,\n alpha,\n beta,\n gamma\n };\n}\n\nconst DEVICE_PIXEL_RATIO_SCALES = [\n 1,\n 1.325,\n 1.4,\n 1.5,\n 1.8,\n 2,\n 2.4,\n 2.5,\n 2.75,\n 3,\n 3.5,\n 4\n];\nfunction useDevicePixelRatio({\n window = defaultWindow\n} = {}) {\n if (!window) {\n return {\n pixelRatio: ref(1)\n };\n }\n const pixelRatio = ref(window.devicePixelRatio);\n const handleDevicePixelRatio = () => {\n pixelRatio.value = window.devicePixelRatio;\n };\n useEventListener(window, \"resize\", handleDevicePixelRatio, { passive: true });\n DEVICE_PIXEL_RATIO_SCALES.forEach((dppx) => {\n const mqlMin = useMediaQuery(`screen and (min-resolution: ${dppx}dppx)`);\n const mqlMax = useMediaQuery(`screen and (max-resolution: ${dppx}dppx)`);\n watch([mqlMin, mqlMax], handleDevicePixelRatio);\n });\n return { pixelRatio };\n}\n\nfunction usePermission(permissionDesc, options = {}) {\n const {\n controls = false,\n navigator = defaultNavigator\n } = options;\n const isSupported = Boolean(navigator && \"permissions\" in navigator);\n let permissionStatus;\n const desc = typeof permissionDesc === \"string\" ? { name: permissionDesc } : permissionDesc;\n const state = ref();\n const onChange = () => {\n if (permissionStatus)\n state.value = permissionStatus.state;\n };\n const query = createSingletonPromise(async () => {\n if (!isSupported)\n return;\n if (!permissionStatus) {\n try {\n permissionStatus = await navigator.permissions.query(desc);\n useEventListener(permissionStatus, \"change\", onChange);\n onChange();\n } catch (e) {\n state.value = \"prompt\";\n }\n }\n return permissionStatus;\n });\n query();\n if (controls) {\n return {\n state,\n isSupported,\n query\n };\n } else {\n return state;\n }\n}\n\nfunction useDevicesList(options = {}) {\n const {\n navigator = defaultNavigator,\n requestPermissions = false,\n constraints = { audio: true, video: true },\n onUpdated\n } = options;\n const devices = ref([]);\n const videoInputs = computed(() => devices.value.filter((i) => i.kind === \"videoinput\"));\n const audioInputs = computed(() => devices.value.filter((i) => i.kind === \"audioinput\"));\n const audioOutputs = computed(() => devices.value.filter((i) => i.kind === \"audiooutput\"));\n let isSupported = false;\n const permissionGranted = ref(false);\n async function update() {\n if (!isSupported)\n return;\n devices.value = await navigator.mediaDevices.enumerateDevices();\n onUpdated == null ? void 0 : onUpdated(devices.value);\n }\n async function ensurePermissions() {\n if (!isSupported)\n return false;\n if (permissionGranted.value)\n return true;\n const { state, query } = usePermission(\"camera\", { controls: true });\n await query();\n if (state.value !== \"granted\") {\n const stream = await navigator.mediaDevices.getUserMedia(constraints);\n stream.getTracks().forEach((t) => t.stop());\n update();\n permissionGranted.value = true;\n } else {\n permissionGranted.value = true;\n }\n return permissionGranted.value;\n }\n if (navigator) {\n isSupported = Boolean(navigator.mediaDevices && navigator.mediaDevices.enumerateDevices);\n if (isSupported) {\n if (requestPermissions)\n ensurePermissions();\n useEventListener(navigator.mediaDevices, \"devicechange\", update);\n update();\n }\n }\n return {\n devices,\n ensurePermissions,\n permissionGranted,\n videoInputs,\n audioInputs,\n audioOutputs,\n isSupported\n };\n}\n\nfunction useDisplayMedia(options = {}) {\n var _a, _b;\n const enabled = ref((_a = options.enabled) != null ? _a : false);\n const video = options.video;\n const audio = options.audio;\n const { navigator = defaultNavigator } = options;\n const isSupported = Boolean((_b = navigator == null ? void 0 : navigator.mediaDevices) == null ? void 0 : _b.getDisplayMedia);\n const constraint = { audio, video };\n const stream = shallowRef();\n async function _start() {\n if (!isSupported || stream.value)\n return;\n stream.value = await navigator.mediaDevices.getDisplayMedia(constraint);\n return stream.value;\n }\n async function _stop() {\n var _a2;\n (_a2 = stream.value) == null ? void 0 : _a2.getTracks().forEach((t) => t.stop());\n stream.value = void 0;\n }\n function stop() {\n _stop();\n enabled.value = false;\n }\n async function start() {\n await _start();\n if (stream.value)\n enabled.value = true;\n return stream.value;\n }\n watch(enabled, (v) => {\n if (v)\n _start();\n else\n _stop();\n }, { immediate: true });\n return {\n isSupported,\n stream,\n start,\n stop,\n enabled\n };\n}\n\nfunction useDocumentVisibility({ document = defaultDocument } = {}) {\n if (!document)\n return ref(\"visible\");\n const visibility = ref(document.visibilityState);\n useEventListener(document, \"visibilitychange\", () => {\n visibility.value = document.visibilityState;\n });\n return visibility;\n}\n\nvar __defProp$b = Object.defineProperty;\nvar __defProps$5 = Object.defineProperties;\nvar __getOwnPropDescs$5 = Object.getOwnPropertyDescriptors;\nvar __getOwnPropSymbols$d = Object.getOwnPropertySymbols;\nvar __hasOwnProp$d = Object.prototype.hasOwnProperty;\nvar __propIsEnum$d = Object.prototype.propertyIsEnumerable;\nvar __defNormalProp$b = (obj, key, value) => key in obj ? __defProp$b(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;\nvar __spreadValues$b = (a, b) => {\n for (var prop in b || (b = {}))\n if (__hasOwnProp$d.call(b, prop))\n __defNormalProp$b(a, prop, b[prop]);\n if (__getOwnPropSymbols$d)\n for (var prop of __getOwnPropSymbols$d(b)) {\n if (__propIsEnum$d.call(b, prop))\n __defNormalProp$b(a, prop, b[prop]);\n }\n return a;\n};\nvar __spreadProps$5 = (a, b) => __defProps$5(a, __getOwnPropDescs$5(b));\nfunction useDraggable(target, options = {}) {\n var _a, _b;\n const draggingElement = (_a = options.draggingElement) != null ? _a : defaultWindow;\n const position = ref((_b = options.initialValue) != null ? _b : { x: 0, y: 0 });\n const pressedDelta = ref();\n const filterEvent = (e) => {\n if (options.pointerTypes)\n return options.pointerTypes.includes(e.pointerType);\n return true;\n };\n const preventDefault = (e) => {\n if (unref(options.preventDefault))\n e.preventDefault();\n };\n const start = (e) => {\n var _a2;\n if (!filterEvent(e))\n return;\n if (unref(options.exact) && e.target !== unref(target))\n return;\n const rect = unref(target).getBoundingClientRect();\n const pos = {\n x: e.pageX - rect.left,\n y: e.pageY - rect.top\n };\n if (((_a2 = options.onStart) == null ? void 0 : _a2.call(options, pos, e)) === false)\n return;\n pressedDelta.value = pos;\n preventDefault(e);\n };\n const move = (e) => {\n var _a2;\n if (!filterEvent(e))\n return;\n if (!pressedDelta.value)\n return;\n position.value = {\n x: e.pageX - pressedDelta.value.x,\n y: e.pageY - pressedDelta.value.y\n };\n (_a2 = options.onMove) == null ? void 0 : _a2.call(options, position.value, e);\n preventDefault(e);\n };\n const end = (e) => {\n var _a2;\n if (!filterEvent(e))\n return;\n if (!pressedDelta.value)\n return;\n pressedDelta.value = void 0;\n (_a2 = options.onEnd) == null ? void 0 : _a2.call(options, position.value, e);\n preventDefault(e);\n };\n if (isClient) {\n useEventListener(target, \"pointerdown\", start, true);\n useEventListener(draggingElement, \"pointermove\", move, true);\n useEventListener(draggingElement, \"pointerup\", end, true);\n }\n return __spreadProps$5(__spreadValues$b({}, toRefs(position)), {\n position,\n isDragging: computed(() => !!pressedDelta.value),\n style: computed(() => `left:${position.value.x}px;top:${position.value.y}px;`)\n });\n}\n\nvar __getOwnPropSymbols$c = Object.getOwnPropertySymbols;\nvar __hasOwnProp$c = Object.prototype.hasOwnProperty;\nvar __propIsEnum$c = Object.prototype.propertyIsEnumerable;\nvar __objRest$2 = (source, exclude) => {\n var target = {};\n for (var prop in source)\n if (__hasOwnProp$c.call(source, prop) && exclude.indexOf(prop) < 0)\n target[prop] = source[prop];\n if (source != null && __getOwnPropSymbols$c)\n for (var prop of __getOwnPropSymbols$c(source)) {\n if (exclude.indexOf(prop) < 0 && __propIsEnum$c.call(source, prop))\n target[prop] = source[prop];\n }\n return target;\n};\nfunction useResizeObserver(target, callback, options = {}) {\n const _a = options, { window = defaultWindow } = _a, observerOptions = __objRest$2(_a, [\"window\"]);\n let observer;\n const isSupported = window && \"ResizeObserver\" in window;\n const cleanup = () => {\n if (observer) {\n observer.disconnect();\n observer = void 0;\n }\n };\n const stopWatch = watch(() => unrefElement(target), (el) => {\n cleanup();\n if (isSupported && window && el) {\n observer = new window.ResizeObserver(callback);\n observer.observe(el, observerOptions);\n }\n }, { immediate: true, flush: \"post\" });\n const stop = () => {\n cleanup();\n stopWatch();\n };\n tryOnScopeDispose(stop);\n return {\n isSupported,\n stop\n };\n}\n\nfunction useElementBounding(target) {\n const height = ref(0);\n const bottom = ref(0);\n const left = ref(0);\n const right = ref(0);\n const top = ref(0);\n const width = ref(0);\n const x = ref(0);\n const y = ref(0);\n function update() {\n const el = unrefElement(target);\n if (!el) {\n height.value = 0;\n bottom.value = 0;\n left.value = 0;\n right.value = 0;\n top.value = 0;\n width.value = 0;\n x.value = 0;\n y.value = 0;\n return;\n }\n const rect = el.getBoundingClientRect();\n height.value = rect.height;\n bottom.value = rect.bottom;\n left.value = rect.left;\n right.value = rect.right;\n top.value = rect.top;\n width.value = rect.width;\n x.value = rect.x;\n y.value = rect.y;\n }\n useEventListener(\"scroll\", update, true);\n useResizeObserver(target, update);\n watch(() => unrefElement(target), (ele) => !ele && update());\n return {\n height,\n bottom,\n left,\n right,\n top,\n width,\n x,\n y,\n update\n };\n}\n\nfunction useRafFn(fn, options = {}) {\n const {\n immediate = true,\n window = defaultWindow\n } = options;\n const isActive = ref(false);\n function loop() {\n if (!isActive.value || !window)\n return;\n fn();\n window.requestAnimationFrame(loop);\n }\n function resume() {\n if (!isActive.value && window) {\n isActive.value = true;\n loop();\n }\n }\n function pause() {\n isActive.value = false;\n }\n if (immediate)\n resume();\n tryOnScopeDispose(pause);\n return {\n isActive,\n pause,\n resume\n };\n}\n\nvar __defProp$a = Object.defineProperty;\nvar __getOwnPropSymbols$b = Object.getOwnPropertySymbols;\nvar __hasOwnProp$b = Object.prototype.hasOwnProperty;\nvar __propIsEnum$b = Object.prototype.propertyIsEnumerable;\nvar __defNormalProp$a = (obj, key, value) => key in obj ? __defProp$a(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;\nvar __spreadValues$a = (a, b) => {\n for (var prop in b || (b = {}))\n if (__hasOwnProp$b.call(b, prop))\n __defNormalProp$a(a, prop, b[prop]);\n if (__getOwnPropSymbols$b)\n for (var prop of __getOwnPropSymbols$b(b)) {\n if (__propIsEnum$b.call(b, prop))\n __defNormalProp$a(a, prop, b[prop]);\n }\n return a;\n};\nfunction useElementByPoint(options) {\n const element = ref(null);\n const { x, y } = options;\n const controls = useRafFn(() => {\n element.value = document.elementFromPoint(unref(x), unref(y));\n });\n return __spreadValues$a({\n element\n }, controls);\n}\n\nfunction useElementHover(el) {\n const isHovered = ref(false);\n useEventListener(el, \"mouseenter\", () => isHovered.value = true);\n useEventListener(el, \"mouseleave\", () => isHovered.value = false);\n return isHovered;\n}\n\nfunction useElementSize(target, initialSize = { width: 0, height: 0 }, options = {}) {\n const width = ref(initialSize.width);\n const height = ref(initialSize.height);\n useResizeObserver(target, ([entry]) => {\n width.value = entry.contentRect.width;\n height.value = entry.contentRect.height;\n }, options);\n watch(() => unrefElement(target), (ele) => {\n width.value = ele ? initialSize.width : 0;\n height.value = ele ? initialSize.height : 0;\n });\n return {\n width,\n height\n };\n}\n\nfunction useElementVisibility(element, { window = defaultWindow, scrollTarget } = {}) {\n const elementIsVisible = ref(false);\n const testBounding = () => {\n if (!window)\n return;\n const document = window.document;\n if (!element.value) {\n elementIsVisible.value = false;\n } else {\n const rect = element.value.getBoundingClientRect();\n elementIsVisible.value = rect.top <= (window.innerHeight || document.documentElement.clientHeight) && rect.left <= (window.innerWidth || document.documentElement.clientWidth) && rect.bottom >= 0 && rect.right >= 0;\n }\n };\n tryOnMounted(testBounding);\n if (window)\n tryOnMounted(() => useEventListener((scrollTarget == null ? void 0 : scrollTarget.value) || window, \"scroll\", testBounding, { capture: false, passive: true }));\n return elementIsVisible;\n}\n\nconst events = /* @__PURE__ */ new Map();\n\nfunction useEventBus(key) {\n const scope = getCurrentScope();\n function on(listener) {\n const listeners = events.get(key) || [];\n listeners.push(listener);\n events.set(key, listeners);\n const _off = () => off(listener);\n scope == null ? void 0 : scope.cleanups.push(_off);\n return _off;\n }\n function once(listener) {\n function _listener(...args) {\n off(_listener);\n listener(...args);\n }\n return on(_listener);\n }\n function off(listener) {\n const listeners = events.get(key);\n if (!listeners)\n return;\n const index = listeners.indexOf(listener);\n if (index > -1)\n listeners.splice(index, 1);\n if (!listeners.length)\n events.delete(key);\n }\n function reset() {\n events.delete(key);\n }\n function emit(event, payload) {\n var _a;\n (_a = events.get(key)) == null ? void 0 : _a.forEach((v) => v(event, payload));\n }\n return { on, once, off, emit, reset };\n}\n\nfunction useEventSource(url, events = [], options = {}) {\n const event = ref(null);\n const data = ref(null);\n const status = ref(\"CONNECTING\");\n const eventSource = ref(null);\n const error = ref(null);\n const {\n withCredentials = false\n } = options;\n const close = () => {\n if (eventSource.value) {\n eventSource.value.close();\n eventSource.value = null;\n status.value = \"CLOSED\";\n }\n };\n const es = new EventSource(url, { withCredentials });\n eventSource.value = es;\n es.onopen = () => {\n status.value = \"OPEN\";\n error.value = null;\n };\n es.onerror = (e) => {\n status.value = \"CLOSED\";\n error.value = e;\n };\n es.onmessage = (e) => {\n event.value = null;\n data.value = e.data;\n };\n for (const event_name of events) {\n useEventListener(es, event_name, (e) => {\n event.value = event_name;\n data.value = e.data || null;\n });\n }\n tryOnScopeDispose(() => {\n close();\n });\n return {\n eventSource,\n event,\n data,\n status,\n error,\n close\n };\n}\n\nfunction useEyeDropper(options = {}) {\n const { initialValue = \"\" } = options;\n const isSupported = Boolean(typeof window !== \"undefined\" && \"EyeDropper\" in window);\n const sRGBHex = ref(initialValue);\n async function open(openOptions) {\n if (!isSupported)\n return;\n const eyeDropper = new window.EyeDropper();\n const result = await eyeDropper.open(openOptions);\n sRGBHex.value = result.sRGBHex;\n return result;\n }\n return { isSupported, sRGBHex, open };\n}\n\nfunction useFavicon(newIcon = null, options = {}) {\n const {\n baseUrl = \"\",\n rel = \"icon\",\n document = defaultDocument\n } = options;\n const favicon = isRef(newIcon) ? newIcon : ref(newIcon);\n const applyIcon = (icon) => {\n document == null ? void 0 : document.head.querySelectorAll(`link[rel*=\"${rel}\"]`).forEach((el) => el.href = `${baseUrl}${icon}`);\n };\n watch(favicon, (i, o) => {\n if (isString(i) && i !== o)\n applyIcon(i);\n }, { immediate: true });\n return favicon;\n}\n\nvar __defProp$9 = Object.defineProperty;\nvar __defProps$4 = Object.defineProperties;\nvar __getOwnPropDescs$4 = Object.getOwnPropertyDescriptors;\nvar __getOwnPropSymbols$a = Object.getOwnPropertySymbols;\nvar __hasOwnProp$a = Object.prototype.hasOwnProperty;\nvar __propIsEnum$a = Object.prototype.propertyIsEnumerable;\nvar __defNormalProp$9 = (obj, key, value) => key in obj ? __defProp$9(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;\nvar __spreadValues$9 = (a, b) => {\n for (var prop in b || (b = {}))\n if (__hasOwnProp$a.call(b, prop))\n __defNormalProp$9(a, prop, b[prop]);\n if (__getOwnPropSymbols$a)\n for (var prop of __getOwnPropSymbols$a(b)) {\n if (__propIsEnum$a.call(b, prop))\n __defNormalProp$9(a, prop, b[prop]);\n }\n return a;\n};\nvar __spreadProps$4 = (a, b) => __defProps$4(a, __getOwnPropDescs$4(b));\nconst payloadMapping = {\n json: \"application/json\",\n text: \"text/plain\",\n formData: \"multipart/form-data\"\n};\nfunction isFetchOptions(obj) {\n return containsProp(obj, \"immediate\", \"refetch\", \"initialData\", \"timeout\", \"beforeFetch\", \"afterFetch\", \"onFetchError\");\n}\nfunction headersToObject(headers) {\n if (headers instanceof Headers)\n return Object.fromEntries([...headers.entries()]);\n return headers;\n}\nfunction createFetch(config = {}) {\n const _options = config.options || {};\n const _fetchOptions = config.fetchOptions || {};\n function useFactoryFetch(url, ...args) {\n const computedUrl = computed(() => config.baseUrl ? joinPaths(unref(config.baseUrl), unref(url)) : unref(url));\n let options = _options;\n let fetchOptions = _fetchOptions;\n if (args.length > 0) {\n if (isFetchOptions(args[0])) {\n options = __spreadValues$9(__spreadValues$9({}, options), args[0]);\n } else {\n fetchOptions = __spreadProps$4(__spreadValues$9(__spreadValues$9({}, fetchOptions), args[0]), {\n headers: __spreadValues$9(__spreadValues$9({}, headersToObject(fetchOptions.headers) || {}), headersToObject(args[0].headers) || {})\n });\n }\n }\n if (args.length > 1 && isFetchOptions(args[1]))\n options = __spreadValues$9(__spreadValues$9({}, options), args[1]);\n return useFetch(computedUrl, fetchOptions, options);\n }\n return useFactoryFetch;\n}\nfunction useFetch(url, ...args) {\n var _a;\n const supportsAbort = typeof AbortController === \"function\";\n let fetchOptions = {};\n let options = { immediate: true, refetch: false, timeout: 0 };\n const config = {\n method: \"get\",\n type: \"text\",\n payload: void 0\n };\n if (args.length > 0) {\n if (isFetchOptions(args[0]))\n options = __spreadValues$9(__spreadValues$9({}, options), args[0]);\n else\n fetchOptions = args[0];\n }\n if (args.length > 1) {\n if (isFetchOptions(args[1]))\n options = __spreadValues$9(__spreadValues$9({}, options), args[1]);\n }\n const {\n fetch = (_a = defaultWindow) == null ? void 0 : _a.fetch,\n initialData,\n timeout\n } = options;\n const responseEvent = createEventHook();\n const errorEvent = createEventHook();\n const finallyEvent = createEventHook();\n const isFinished = ref(false);\n const isFetching = ref(false);\n const aborted = ref(false);\n const statusCode = ref(null);\n const response = shallowRef(null);\n const error = shallowRef(null);\n const data = shallowRef(initialData);\n const canAbort = computed(() => supportsAbort && isFetching.value);\n let controller;\n let timer;\n const abort = () => {\n if (supportsAbort && controller)\n controller.abort();\n };\n const loading = (isLoading) => {\n isFetching.value = isLoading;\n isFinished.value = !isLoading;\n };\n if (timeout)\n timer = useTimeoutFn(abort, timeout, { immediate: false });\n const execute = async (throwOnFailed = false) => {\n var _a2;\n loading(true);\n error.value = null;\n statusCode.value = null;\n aborted.value = false;\n controller = void 0;\n if (supportsAbort) {\n controller = new AbortController();\n controller.signal.onabort = () => aborted.value = true;\n fetchOptions = __spreadProps$4(__spreadValues$9({}, fetchOptions), {\n signal: controller.signal\n });\n }\n const defaultFetchOptions = {\n method: config.method,\n headers: {}\n };\n if (config.payload) {\n const headers = headersToObject(defaultFetchOptions.headers);\n if (config.payloadType)\n headers[\"Content-Type\"] = (_a2 = payloadMapping[config.payloadType]) != null ? _a2 : config.payloadType;\n defaultFetchOptions.body = config.payloadType === \"json\" ? JSON.stringify(unref(config.payload)) : unref(config.payload);\n }\n let isCanceled = false;\n const context = { url: unref(url), options: fetchOptions, cancel: () => {\n isCanceled = true;\n } };\n if (options.beforeFetch)\n Object.assign(context, await options.beforeFetch(context));\n if (isCanceled || !fetch) {\n loading(false);\n return Promise.resolve(null);\n }\n let responseData = null;\n if (timer)\n timer.start();\n return new Promise((resolve, reject) => {\n var _a3;\n fetch(context.url, __spreadProps$4(__spreadValues$9(__spreadValues$9({}, defaultFetchOptions), context.options), {\n headers: __spreadValues$9(__spreadValues$9({}, headersToObject(defaultFetchOptions.headers)), headersToObject((_a3 = context.options) == null ? void 0 : _a3.headers))\n })).then(async (fetchResponse) => {\n response.value = fetchResponse;\n statusCode.value = fetchResponse.status;\n responseData = await fetchResponse[config.type]();\n if (options.afterFetch && statusCode.value >= 200 && statusCode.value < 300)\n ({ data: responseData } = await options.afterFetch({ data: responseData, response: fetchResponse }));\n data.value = responseData;\n if (!fetchResponse.ok)\n throw new Error(fetchResponse.statusText);\n responseEvent.trigger(fetchResponse);\n return resolve(fetchResponse);\n }).catch(async (fetchError) => {\n let errorData = fetchError.message || fetchError.name;\n if (options.onFetchError)\n ({ data: responseData, error: errorData } = await options.onFetchError({ data: responseData, error: fetchError }));\n data.value = responseData;\n error.value = errorData;\n errorEvent.trigger(fetchError);\n if (throwOnFailed)\n return reject(fetchError);\n return resolve(null);\n }).finally(() => {\n loading(false);\n if (timer)\n timer.stop();\n finallyEvent.trigger(null);\n });\n });\n };\n watch(() => [\n unref(url),\n unref(options.refetch)\n ], () => unref(options.refetch) && execute(), { deep: true });\n const shell = {\n isFinished,\n statusCode,\n response,\n error,\n data,\n isFetching,\n canAbort,\n aborted,\n abort,\n execute,\n onFetchResponse: responseEvent.on,\n onFetchError: errorEvent.on,\n onFetchFinally: finallyEvent.on,\n get: setMethod(\"get\"),\n put: setMethod(\"put\"),\n post: setMethod(\"post\"),\n delete: setMethod(\"delete\"),\n patch: setMethod(\"patch\"),\n head: setMethod(\"head\"),\n options: setMethod(\"options\"),\n json: setType(\"json\"),\n text: setType(\"text\"),\n blob: setType(\"blob\"),\n arrayBuffer: setType(\"arrayBuffer\"),\n formData: setType(\"formData\")\n };\n function setMethod(method) {\n return (payload, payloadType) => {\n if (!isFetching.value) {\n config.method = method;\n config.payload = payload;\n config.payloadType = payloadType;\n if (isRef(config.payload)) {\n watch(() => [\n unref(config.payload),\n unref(options.refetch)\n ], () => unref(options.refetch) && execute(), { deep: true });\n }\n if (!payloadType && unref(payload) && Object.getPrototypeOf(unref(payload)) === Object.prototype)\n config.payloadType = \"json\";\n return shell;\n }\n return void 0;\n };\n }\n function waitUntilFinished() {\n return new Promise((resolve, reject) => {\n until(isFinished).toBe(true).then(() => resolve(shell)).catch((error2) => reject(error2));\n });\n }\n function setType(type) {\n return () => {\n if (!isFetching.value) {\n config.type = type;\n return __spreadProps$4(__spreadValues$9({}, shell), {\n then(onFulfilled, onRejected) {\n return waitUntilFinished().then(onFulfilled, onRejected);\n }\n });\n }\n return void 0;\n };\n }\n if (options.immediate)\n setTimeout(execute, 0);\n return __spreadProps$4(__spreadValues$9({}, shell), {\n then(onFulfilled, onRejected) {\n return waitUntilFinished().then(onFulfilled, onRejected);\n }\n });\n}\nfunction joinPaths(start, end) {\n if (!start.endsWith(\"/\") && !end.startsWith(\"/\"))\n return `${start}/${end}`;\n return `${start}${end}`;\n}\n\nfunction useFocus(options = {}) {\n const {\n initialValue = false\n } = options;\n const activeElement = useActiveElement(options);\n const target = computed(() => unrefElement(options.target));\n const focused = computed({\n get() {\n return activeElement.value === target.value;\n },\n set(value) {\n var _a, _b;\n if (!value && focused.value)\n (_a = target.value) == null ? void 0 : _a.blur();\n if (value && !focused.value)\n (_b = target.value) == null ? void 0 : _b.focus();\n }\n });\n watch(target, () => {\n focused.value = initialValue;\n }, { immediate: true, flush: \"post\" });\n return { focused };\n}\n\nfunction useFocusWithin(target, options = {}) {\n const activeElement = useActiveElement(options);\n const targetElement = computed(() => unrefElement(target));\n const focused = computed(() => targetElement.value && activeElement.value ? targetElement.value.contains(activeElement.value) : false);\n return { focused };\n}\n\nfunction useFps(options) {\n var _a;\n const fps = ref(0);\n if (typeof performance === \"undefined\")\n return fps;\n const every = (_a = options == null ? void 0 : options.every) != null ? _a : 10;\n let last = performance.now();\n let ticks = 0;\n useRafFn(() => {\n ticks += 1;\n if (ticks >= every) {\n const now = performance.now();\n const diff = now - last;\n fps.value = Math.round(1e3 / (diff / ticks));\n last = now;\n ticks = 0;\n }\n });\n return fps;\n}\n\nconst functionsMap = [\n [\n \"requestFullscreen\",\n \"exitFullscreen\",\n \"fullscreenElement\",\n \"fullscreenEnabled\",\n \"fullscreenchange\",\n \"fullscreenerror\"\n ],\n [\n \"webkitRequestFullscreen\",\n \"webkitExitFullscreen\",\n \"webkitFullscreenElement\",\n \"webkitFullscreenEnabled\",\n \"webkitfullscreenchange\",\n \"webkitfullscreenerror\"\n ],\n [\n \"webkitRequestFullScreen\",\n \"webkitCancelFullScreen\",\n \"webkitCurrentFullScreenElement\",\n \"webkitCancelFullScreen\",\n \"webkitfullscreenchange\",\n \"webkitfullscreenerror\"\n ],\n [\n \"mozRequestFullScreen\",\n \"mozCancelFullScreen\",\n \"mozFullScreenElement\",\n \"mozFullScreenEnabled\",\n \"mozfullscreenchange\",\n \"mozfullscreenerror\"\n ],\n [\n \"msRequestFullscreen\",\n \"msExitFullscreen\",\n \"msFullscreenElement\",\n \"msFullscreenEnabled\",\n \"MSFullscreenChange\",\n \"MSFullscreenError\"\n ]\n];\nfunction useFullscreen(target, options = {}) {\n const { document = defaultDocument, autoExit = false } = options;\n const targetRef = target || (document == null ? void 0 : document.querySelector(\"html\"));\n const isFullscreen = ref(false);\n let isSupported = false;\n let map = functionsMap[0];\n if (!document) {\n isSupported = false;\n } else {\n for (const m of functionsMap) {\n if (m[1] in document) {\n map = m;\n isSupported = true;\n break;\n }\n }\n }\n const [REQUEST, EXIT, ELEMENT, , EVENT] = map;\n async function exit() {\n if (!isSupported)\n return;\n if (document == null ? void 0 : document[ELEMENT])\n await document[EXIT]();\n isFullscreen.value = false;\n }\n async function enter() {\n if (!isSupported)\n return;\n await exit();\n const target2 = unrefElement(targetRef);\n if (target2) {\n await target2[REQUEST]();\n isFullscreen.value = true;\n }\n }\n async function toggle() {\n if (isFullscreen.value)\n await exit();\n else\n await enter();\n }\n if (document) {\n useEventListener(document, EVENT, () => {\n isFullscreen.value = !!(document == null ? void 0 : document[ELEMENT]);\n }, false);\n }\n if (autoExit)\n tryOnScopeDispose(exit);\n return {\n isSupported,\n isFullscreen,\n enter,\n exit,\n toggle\n };\n}\n\nfunction useGeolocation(options = {}) {\n const {\n enableHighAccuracy = true,\n maximumAge = 3e4,\n timeout = 27e3,\n navigator = defaultNavigator\n } = options;\n const isSupported = navigator && \"geolocation\" in navigator;\n const locatedAt = ref(null);\n const error = ref(null);\n const coords = ref({\n accuracy: 0,\n latitude: Infinity,\n longitude: Infinity,\n altitude: null,\n altitudeAccuracy: null,\n heading: null,\n speed: null\n });\n function updatePosition(position) {\n locatedAt.value = position.timestamp;\n coords.value = position.coords;\n error.value = null;\n }\n let watcher;\n if (isSupported) {\n watcher = navigator.geolocation.watchPosition(updatePosition, (err) => error.value = err, {\n enableHighAccuracy,\n maximumAge,\n timeout\n });\n }\n tryOnScopeDispose(() => {\n if (watcher && navigator)\n navigator.geolocation.clearWatch(watcher);\n });\n return {\n isSupported,\n coords,\n locatedAt,\n error\n };\n}\n\nconst defaultEvents$1 = [\"mousemove\", \"mousedown\", \"resize\", \"keydown\", \"touchstart\", \"wheel\"];\nconst oneMinute = 6e4;\nfunction useIdle(timeout = oneMinute, options = {}) {\n const {\n initialState = false,\n listenForVisibilityChange = true,\n events = defaultEvents$1,\n window = defaultWindow,\n eventFilter = throttleFilter(50)\n } = options;\n const idle = ref(initialState);\n const lastActive = ref(timestamp());\n let timer;\n const onEvent = createFilterWrapper(eventFilter, () => {\n idle.value = false;\n lastActive.value = timestamp();\n clearTimeout(timer);\n timer = setTimeout(() => idle.value = true, timeout);\n });\n if (window) {\n const document = window.document;\n for (const event of events)\n useEventListener(window, event, onEvent, { passive: true });\n if (listenForVisibilityChange) {\n useEventListener(document, \"visibilitychange\", () => {\n if (!document.hidden)\n onEvent();\n });\n }\n }\n timer = setTimeout(() => idle.value = true, timeout);\n return { idle, lastActive };\n}\n\nfunction useScroll(element, options = {}) {\n const {\n throttle = 0,\n idle = 200,\n onStop = noop,\n onScroll = noop,\n offset = {\n left: 0,\n right: 0,\n top: 0,\n bottom: 0\n },\n eventListenerOptions = {\n capture: false,\n passive: true\n }\n } = options;\n const x = ref(0);\n const y = ref(0);\n const isScrolling = ref(false);\n const arrivedState = reactive({\n left: true,\n right: false,\n top: true,\n bottom: false\n });\n const directions = reactive({\n left: false,\n right: false,\n top: false,\n bottom: false\n });\n if (element) {\n const onScrollEnd = useDebounceFn((e) => {\n isScrolling.value = false;\n directions.left = false;\n directions.right = false;\n directions.top = false;\n directions.bottom = false;\n onStop(e);\n }, throttle + idle);\n const onScrollHandler = (e) => {\n const eventTarget = e.target === document ? e.target.documentElement : e.target;\n const scrollLeft = eventTarget.scrollLeft;\n directions.left = scrollLeft < x.value;\n directions.right = scrollLeft > x.value;\n arrivedState.left = scrollLeft <= 0 + (offset.left || 0);\n arrivedState.right = scrollLeft + eventTarget.clientWidth >= eventTarget.scrollWidth - (offset.right || 0);\n x.value = scrollLeft;\n const scrollTop = eventTarget.scrollTop;\n directions.top = scrollTop < y.value;\n directions.bottom = scrollTop > y.value;\n arrivedState.top = scrollTop <= 0 + (offset.top || 0);\n arrivedState.bottom = scrollTop + eventTarget.clientHeight >= eventTarget.scrollHeight - (offset.bottom || 0);\n y.value = scrollTop;\n isScrolling.value = true;\n onScrollEnd(e);\n onScroll(e);\n };\n useEventListener(element, \"scroll\", throttle ? useThrottleFn(onScrollHandler, throttle) : onScrollHandler, eventListenerOptions);\n }\n return {\n x,\n y,\n isScrolling,\n arrivedState,\n directions\n };\n}\n\nvar __defProp$8 = Object.defineProperty;\nvar __defProps$3 = Object.defineProperties;\nvar __getOwnPropDescs$3 = Object.getOwnPropertyDescriptors;\nvar __getOwnPropSymbols$9 = Object.getOwnPropertySymbols;\nvar __hasOwnProp$9 = Object.prototype.hasOwnProperty;\nvar __propIsEnum$9 = Object.prototype.propertyIsEnumerable;\nvar __defNormalProp$8 = (obj, key, value) => key in obj ? __defProp$8(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;\nvar __spreadValues$8 = (a, b) => {\n for (var prop in b || (b = {}))\n if (__hasOwnProp$9.call(b, prop))\n __defNormalProp$8(a, prop, b[prop]);\n if (__getOwnPropSymbols$9)\n for (var prop of __getOwnPropSymbols$9(b)) {\n if (__propIsEnum$9.call(b, prop))\n __defNormalProp$8(a, prop, b[prop]);\n }\n return a;\n};\nvar __spreadProps$3 = (a, b) => __defProps$3(a, __getOwnPropDescs$3(b));\nfunction useInfiniteScroll(element, onLoadMore, options = {}) {\n var _a;\n const state = reactive(useScroll(element, __spreadProps$3(__spreadValues$8({}, options), {\n offset: __spreadValues$8({\n bottom: (_a = options.distance) != null ? _a : 0\n }, options.offset)\n })));\n watch(() => state.arrivedState.bottom, (v) => {\n if (v)\n onLoadMore(state);\n });\n}\n\nfunction useIntersectionObserver(target, callback, options = {}) {\n const {\n root,\n rootMargin = \"0px\",\n threshold = 0.1,\n window = defaultWindow\n } = options;\n const isSupported = window && \"IntersectionObserver\" in window;\n let cleanup = noop;\n const stopWatch = isSupported ? watch(() => ({\n el: unrefElement(target),\n root: unrefElement(root)\n }), ({ el, root: root2 }) => {\n cleanup();\n if (!el)\n return;\n const observer = new window.IntersectionObserver(callback, {\n root: root2,\n rootMargin,\n threshold\n });\n observer.observe(el);\n cleanup = () => {\n observer.disconnect();\n cleanup = noop;\n };\n }, { immediate: true, flush: \"post\" }) : noop;\n const stop = () => {\n cleanup();\n stopWatch();\n };\n tryOnScopeDispose(stop);\n return {\n isSupported,\n stop\n };\n}\n\nconst defaultEvents = [\"mousedown\", \"mouseup\", \"keydown\", \"keyup\"];\nfunction useKeyModifier(modifier, options = {}) {\n const {\n events = defaultEvents,\n document = defaultDocument,\n initial = null\n } = options;\n const state = ref(initial);\n if (document) {\n events.forEach((listenerEvent) => {\n useEventListener(document, listenerEvent, (evt) => {\n state.value = evt.getModifierState(modifier);\n });\n });\n }\n return state;\n}\n\nfunction useLocalStorage(key, initialValue, options = {}) {\n const { window = defaultWindow } = options;\n return useStorage(key, initialValue, window == null ? void 0 : window.localStorage, options);\n}\n\nconst DefaultMagicKeysAliasMap = {\n ctrl: \"control\",\n command: \"meta\",\n cmd: \"meta\",\n option: \"alt\",\n up: \"arrowup\",\n down: \"arrowdown\",\n left: \"arrowleft\",\n right: \"arrowright\"\n};\n\nfunction useMagicKeys(options = {}) {\n const {\n reactive: useReactive = false,\n target = defaultWindow,\n aliasMap = DefaultMagicKeysAliasMap,\n passive = true,\n onEventFired = noop\n } = options;\n const current = reactive(/* @__PURE__ */ new Set());\n const obj = { toJSON() {\n return {};\n }, current };\n const refs = useReactive ? reactive(obj) : obj;\n function updateRefs(e, value) {\n var _a, _b;\n const key = (_a = e.key) == null ? void 0 : _a.toLowerCase();\n const code = (_b = e.code) == null ? void 0 : _b.toLowerCase();\n const values = [code, key].filter(Boolean);\n if (code) {\n if (value)\n current.add(e.code);\n else\n current.delete(e.code);\n }\n for (const key2 of values) {\n if (key2 in refs) {\n if (useReactive)\n refs[key2] = value;\n else\n refs[key2].value = value;\n }\n }\n }\n if (target) {\n useEventListener(target, \"keydown\", (e) => {\n updateRefs(e, true);\n return onEventFired(e);\n }, { passive });\n useEventListener(target, \"keyup\", (e) => {\n updateRefs(e, false);\n return onEventFired(e);\n }, { passive });\n }\n const proxy = new Proxy(refs, {\n get(target2, prop, rec) {\n if (typeof prop !== \"string\")\n return Reflect.get(target2, prop, rec);\n prop = prop.toLowerCase();\n if (prop in aliasMap)\n prop = aliasMap[prop];\n if (!(prop in refs)) {\n if (/[+_-]/.test(prop)) {\n const keys = prop.split(/[+_-]/g).map((i) => i.trim());\n refs[prop] = computed(() => keys.every((key) => unref(proxy[key])));\n } else {\n refs[prop] = ref(false);\n }\n }\n const r = Reflect.get(target2, prop, rec);\n return useReactive ? unref(r) : r;\n }\n });\n return proxy;\n}\n\nvar __defProp$7 = Object.defineProperty;\nvar __getOwnPropSymbols$8 = Object.getOwnPropertySymbols;\nvar __hasOwnProp$8 = Object.prototype.hasOwnProperty;\nvar __propIsEnum$8 = Object.prototype.propertyIsEnumerable;\nvar __defNormalProp$7 = (obj, key, value) => key in obj ? __defProp$7(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;\nvar __spreadValues$7 = (a, b) => {\n for (var prop in b || (b = {}))\n if (__hasOwnProp$8.call(b, prop))\n __defNormalProp$7(a, prop, b[prop]);\n if (__getOwnPropSymbols$8)\n for (var prop of __getOwnPropSymbols$8(b)) {\n if (__propIsEnum$8.call(b, prop))\n __defNormalProp$7(a, prop, b[prop]);\n }\n return a;\n};\nfunction usingElRef(source, cb) {\n if (unref(source))\n cb(unref(source));\n}\nfunction timeRangeToArray(timeRanges) {\n let ranges = [];\n for (let i = 0; i < timeRanges.length; ++i)\n ranges = [...ranges, [timeRanges.start(i), timeRanges.end(i)]];\n return ranges;\n}\nfunction tracksToArray(tracks) {\n return Array.from(tracks).map(({ label, kind, language, mode, activeCues, cues, inBandMetadataTrackDispatchType }, id) => ({ id, label, kind, language, mode, activeCues, cues, inBandMetadataTrackDispatchType }));\n}\nconst defaultOptions = {\n src: \"\",\n tracks: []\n};\nfunction useMediaControls(target, options = {}) {\n options = __spreadValues$7(__spreadValues$7({}, defaultOptions), options);\n const {\n document = defaultDocument\n } = options;\n const currentTime = ref(0);\n const duration = ref(0);\n const seeking = ref(false);\n const volume = ref(1);\n const waiting = ref(false);\n const ended = ref(false);\n const playing = ref(false);\n const rate = ref(1);\n const stalled = ref(false);\n const buffered = ref([]);\n const tracks = ref([]);\n const selectedTrack = ref(-1);\n const isPictureInPicture = ref(false);\n const muted = ref(false);\n const supportsPictureInPicture = document && \"pictureInPictureEnabled\" in document;\n const sourceErrorEvent = createEventHook();\n const disableTrack = (track) => {\n usingElRef(target, (el) => {\n if (track) {\n const id = isNumber(track) ? track : track.id;\n el.textTracks[id].mode = \"disabled\";\n } else {\n for (let i = 0; i < el.textTracks.length; ++i)\n el.textTracks[i].mode = \"disabled\";\n }\n selectedTrack.value = -1;\n });\n };\n const enableTrack = (track, disableTracks = true) => {\n usingElRef(target, (el) => {\n const id = isNumber(track) ? track : track.id;\n if (disableTracks)\n disableTrack();\n el.textTracks[id].mode = \"showing\";\n selectedTrack.value = id;\n });\n };\n const togglePictureInPicture = () => {\n return new Promise((resolve, reject) => {\n usingElRef(target, async (el) => {\n if (supportsPictureInPicture) {\n if (!isPictureInPicture.value) {\n el.requestPictureInPicture().then(resolve).catch(reject);\n } else {\n document.exitPictureInPicture().then(resolve).catch(reject);\n }\n }\n });\n });\n };\n watchEffect(() => {\n if (!document)\n return;\n const el = unref(target);\n if (!el)\n return;\n const src = unref(options.src);\n let sources = [];\n if (!src)\n return;\n if (isString(src))\n sources = [{ src }];\n else if (Array.isArray(src))\n sources = src;\n else if (isObject(src))\n sources = [src];\n el.querySelectorAll(\"source\").forEach((e) => {\n e.removeEventListener(\"error\", sourceErrorEvent.trigger);\n e.remove();\n });\n sources.forEach(({ src: src2, type }) => {\n const source = document.createElement(\"source\");\n source.setAttribute(\"src\", src2);\n source.setAttribute(\"type\", type || \"\");\n source.addEventListener(\"error\", sourceErrorEvent.trigger);\n el.appendChild(source);\n });\n el.load();\n });\n tryOnScopeDispose(() => {\n const el = unref(target);\n if (!el)\n return;\n el.querySelectorAll(\"source\").forEach((e) => e.removeEventListener(\"error\", sourceErrorEvent.trigger));\n });\n watch(volume, (vol) => {\n const el = unref(target);\n if (!el)\n return;\n el.volume = vol;\n });\n watch(muted, (mute) => {\n const el = unref(target);\n if (!el)\n return;\n el.muted = mute;\n });\n watch(rate, (rate2) => {\n const el = unref(target);\n if (!el)\n return;\n el.playbackRate = rate2;\n });\n watchEffect(() => {\n if (!document)\n return;\n const textTracks = unref(options.tracks);\n const el = unref(target);\n if (!textTracks || !textTracks.length || !el)\n return;\n el.querySelectorAll(\"track\").forEach((e) => e.remove());\n textTracks.forEach(({ default: isDefault, kind, label, src, srcLang }, i) => {\n const track = document.createElement(\"track\");\n track.default = isDefault || false;\n track.kind = kind;\n track.label = label;\n track.src = src;\n track.srclang = srcLang;\n if (track.default)\n selectedTrack.value = i;\n el.appendChild(track);\n });\n });\n const { ignoreUpdates: ignoreCurrentTimeUpdates } = ignorableWatch(currentTime, (time) => {\n const el = unref(target);\n if (!el)\n return;\n el.currentTime = time;\n });\n const { ignoreUpdates: ignorePlayingUpdates } = ignorableWatch(playing, (isPlaying) => {\n const el = unref(target);\n if (!el)\n return;\n isPlaying ? el.play() : el.pause();\n });\n useEventListener(target, \"timeupdate\", () => ignoreCurrentTimeUpdates(() => currentTime.value = unref(target).currentTime));\n useEventListener(target, \"durationchange\", () => duration.value = unref(target).duration);\n useEventListener(target, \"progress\", () => buffered.value = timeRangeToArray(unref(target).buffered));\n useEventListener(target, \"seeking\", () => seeking.value = true);\n useEventListener(target, \"seeked\", () => seeking.value = false);\n useEventListener(target, \"waiting\", () => waiting.value = true);\n useEventListener(target, \"playing\", () => waiting.value = false);\n useEventListener(target, \"ratechange\", () => rate.value = unref(target).playbackRate);\n useEventListener(target, \"stalled\", () => stalled.value = true);\n useEventListener(target, \"ended\", () => ended.value = true);\n useEventListener(target, \"pause\", () => ignorePlayingUpdates(() => playing.value = false));\n useEventListener(target, \"play\", () => ignorePlayingUpdates(() => playing.value = true));\n useEventListener(target, \"enterpictureinpicture\", () => isPictureInPicture.value = true);\n useEventListener(target, \"leavepictureinpicture\", () => isPictureInPicture.value = false);\n useEventListener(target, \"volumechange\", () => {\n const el = unref(target);\n if (!el)\n return;\n volume.value = el.volume;\n muted.value = el.muted;\n });\n const listeners = [];\n const stop = watch([target], () => {\n const el = unref(target);\n if (!el)\n return;\n stop();\n listeners[0] = useEventListener(el.textTracks, \"addtrack\", () => tracks.value = tracksToArray(el.textTracks));\n listeners[1] = useEventListener(el.textTracks, \"removetrack\", () => tracks.value = tracksToArray(el.textTracks));\n listeners[2] = useEventListener(el.textTracks, \"change\", () => tracks.value = tracksToArray(el.textTracks));\n });\n tryOnScopeDispose(() => listeners.forEach((listener) => listener()));\n return {\n currentTime,\n duration,\n waiting,\n seeking,\n ended,\n stalled,\n buffered,\n playing,\n rate,\n volume,\n muted,\n tracks,\n selectedTrack,\n enableTrack,\n disableTrack,\n supportsPictureInPicture,\n togglePictureInPicture,\n isPictureInPicture,\n onSourceError: sourceErrorEvent.on\n };\n}\n\nconst getMapVue2Compat = () => {\n const data = reactive({});\n return {\n get: (key) => data[key],\n set: (key, value) => set(data, key, value),\n has: (key) => Object.prototype.hasOwnProperty.call(data, key),\n delete: (key) => del(data, key),\n clear: () => {\n Object.keys(data).forEach((key) => {\n del(data, key);\n });\n }\n };\n};\nfunction useMemoize(resolver, options) {\n const initCache = () => {\n if (options == null ? void 0 : options.cache)\n return reactive(options.cache);\n if (isVue2)\n return getMapVue2Compat();\n return reactive(/* @__PURE__ */ new Map());\n };\n const cache = initCache();\n const generateKey = (...args) => (options == null ? void 0 : options.getKey) ? options.getKey(...args) : JSON.stringify(args);\n const _loadData = (key, ...args) => {\n cache.set(key, resolver(...args));\n return cache.get(key);\n };\n const loadData = (...args) => _loadData(generateKey(...args), ...args);\n const deleteData = (...args) => {\n cache.delete(generateKey(...args));\n };\n const clearData = () => {\n cache.clear();\n };\n const memoized = (...args) => {\n const key = generateKey(...args);\n if (cache.has(key))\n return cache.get(key);\n return _loadData(key, ...args);\n };\n memoized.load = loadData;\n memoized.delete = deleteData;\n memoized.clear = clearData;\n memoized.generateKey = generateKey;\n memoized.cache = cache;\n return memoized;\n}\n\nfunction useMemory(options = {}) {\n const memory = ref();\n const isSupported = typeof performance !== \"undefined\" && \"memory\" in performance;\n if (isSupported) {\n const { interval = 1e3 } = options;\n useIntervalFn(() => {\n memory.value = performance.memory;\n }, interval, { immediate: options.immediate, immediateCallback: options.immediateCallback });\n }\n return { isSupported, memory };\n}\n\nfunction useMounted() {\n const isMounted = ref(false);\n onMounted(() => {\n isMounted.value = true;\n });\n return isMounted;\n}\n\nfunction useMouse(options = {}) {\n const {\n type = \"page\",\n touch = true,\n resetOnTouchEnds = false,\n initialValue = { x: 0, y: 0 },\n window = defaultWindow,\n eventFilter\n } = options;\n const x = ref(initialValue.x);\n const y = ref(initialValue.y);\n const sourceType = ref(null);\n const mouseHandler = (event) => {\n if (type === \"page\") {\n x.value = event.pageX;\n y.value = event.pageY;\n } else if (type === \"client\") {\n x.value = event.clientX;\n y.value = event.clientY;\n }\n sourceType.value = \"mouse\";\n };\n const reset = () => {\n x.value = initialValue.x;\n y.value = initialValue.y;\n };\n const touchHandler = (event) => {\n if (event.touches.length > 0) {\n const touch2 = event.touches[0];\n if (type === \"page\") {\n x.value = touch2.pageX;\n y.value = touch2.pageY;\n } else if (type === \"client\") {\n x.value = touch2.clientX;\n y.value = touch2.clientY;\n }\n sourceType.value = \"touch\";\n }\n };\n const mouseHandlerWrapper = (event) => {\n return eventFilter === void 0 ? mouseHandler(event) : eventFilter(() => mouseHandler(event), {});\n };\n const touchHandlerWrapper = (event) => {\n return eventFilter === void 0 ? touchHandler(event) : eventFilter(() => touchHandler(event), {});\n };\n if (window) {\n useEventListener(window, \"mousemove\", mouseHandlerWrapper, { passive: true });\n useEventListener(window, \"dragover\", mouseHandlerWrapper, { passive: true });\n if (touch) {\n useEventListener(window, \"touchstart\", touchHandlerWrapper, { passive: true });\n useEventListener(window, \"touchmove\", touchHandlerWrapper, { passive: true });\n if (resetOnTouchEnds)\n useEventListener(window, \"touchend\", reset, { passive: true });\n }\n }\n return {\n x,\n y,\n sourceType\n };\n}\n\nfunction useMouseInElement(target, options = {}) {\n const {\n handleOutside = true,\n window = defaultWindow\n } = options;\n const { x, y, sourceType } = useMouse(options);\n const targetRef = ref(target != null ? target : window == null ? void 0 : window.document.body);\n const elementX = ref(0);\n const elementY = ref(0);\n const elementPositionX = ref(0);\n const elementPositionY = ref(0);\n const elementHeight = ref(0);\n const elementWidth = ref(0);\n const isOutside = ref(false);\n let stop = () => {\n };\n if (window) {\n stop = watch([targetRef, x, y], () => {\n const el = unrefElement(targetRef);\n if (!el)\n return;\n const {\n left,\n top,\n width,\n height\n } = el.getBoundingClientRect();\n elementPositionX.value = left + window.pageXOffset;\n elementPositionY.value = top + window.pageYOffset;\n elementHeight.value = height;\n elementWidth.value = width;\n const elX = x.value - elementPositionX.value;\n const elY = y.value - elementPositionY.value;\n isOutside.value = elX < 0 || elY < 0 || elX > elementWidth.value || elY > elementHeight.value;\n if (handleOutside || !isOutside.value) {\n elementX.value = elX;\n elementY.value = elY;\n }\n }, { immediate: true });\n }\n return {\n x,\n y,\n sourceType,\n elementX,\n elementY,\n elementPositionX,\n elementPositionY,\n elementHeight,\n elementWidth,\n isOutside,\n stop\n };\n}\n\nfunction useMousePressed(options = {}) {\n const {\n touch = true,\n drag = true,\n initialValue = false,\n window = defaultWindow\n } = options;\n const pressed = ref(initialValue);\n const sourceType = ref(null);\n if (!window) {\n return {\n pressed,\n sourceType\n };\n }\n const onPressed = (srcType) => () => {\n pressed.value = true;\n sourceType.value = srcType;\n };\n const onReleased = () => {\n pressed.value = false;\n sourceType.value = null;\n };\n const target = computed(() => unrefElement(options.target) || window);\n useEventListener(target, \"mousedown\", onPressed(\"mouse\"), { passive: true });\n useEventListener(window, \"mouseleave\", onReleased, { passive: true });\n useEventListener(window, \"mouseup\", onReleased, { passive: true });\n if (drag) {\n useEventListener(target, \"dragstart\", onPressed(\"mouse\"), { passive: true });\n useEventListener(window, \"drop\", onReleased, { passive: true });\n useEventListener(window, \"dragend\", onReleased, { passive: true });\n }\n if (touch) {\n useEventListener(target, \"touchstart\", onPressed(\"touch\"), { passive: true });\n useEventListener(window, \"touchend\", onReleased, { passive: true });\n useEventListener(window, \"touchcancel\", onReleased, { passive: true });\n }\n return {\n pressed,\n sourceType\n };\n}\n\nvar __getOwnPropSymbols$7 = Object.getOwnPropertySymbols;\nvar __hasOwnProp$7 = Object.prototype.hasOwnProperty;\nvar __propIsEnum$7 = Object.prototype.propertyIsEnumerable;\nvar __objRest$1 = (source, exclude) => {\n var target = {};\n for (var prop in source)\n if (__hasOwnProp$7.call(source, prop) && exclude.indexOf(prop) < 0)\n target[prop] = source[prop];\n if (source != null && __getOwnPropSymbols$7)\n for (var prop of __getOwnPropSymbols$7(source)) {\n if (exclude.indexOf(prop) < 0 && __propIsEnum$7.call(source, prop))\n target[prop] = source[prop];\n }\n return target;\n};\nfunction useMutationObserver(target, callback, options = {}) {\n const _a = options, { window = defaultWindow } = _a, mutationOptions = __objRest$1(_a, [\"window\"]);\n let observer;\n const isSupported = window && \"IntersectionObserver\" in window;\n const cleanup = () => {\n if (observer) {\n observer.disconnect();\n observer = void 0;\n }\n };\n const stopWatch = watch(() => unrefElement(target), (el) => {\n cleanup();\n if (isSupported && window && el) {\n observer = new window.MutationObserver(callback);\n observer.observe(el, mutationOptions);\n }\n }, { immediate: true });\n const stop = () => {\n cleanup();\n stopWatch();\n };\n tryOnScopeDispose(stop);\n return {\n isSupported,\n stop\n };\n}\n\nconst useNavigatorLanguage = (options = {}) => {\n const { window = defaultWindow } = options;\n const navigator = window == null ? void 0 : window.navigator;\n const isSupported = Boolean(navigator && \"language\" in navigator);\n const language = ref(navigator == null ? void 0 : navigator.language);\n useEventListener(window, \"languagechange\", () => {\n if (navigator)\n language.value = navigator.language;\n });\n return {\n isSupported,\n language\n };\n};\n\nfunction useNetwork(options = {}) {\n const { window = defaultWindow } = options;\n const navigator = window == null ? void 0 : window.navigator;\n const isSupported = Boolean(navigator && \"connection\" in navigator);\n const isOnline = ref(true);\n const saveData = ref(false);\n const offlineAt = ref(void 0);\n const downlink = ref(void 0);\n const downlinkMax = ref(void 0);\n const rtt = ref(void 0);\n const effectiveType = ref(void 0);\n const type = ref(\"unknown\");\n const connection = isSupported && navigator.connection;\n function updateNetworkInformation() {\n if (!navigator)\n return;\n isOnline.value = navigator.onLine;\n offlineAt.value = isOnline.value ? void 0 : Date.now();\n if (connection) {\n downlink.value = connection.downlink;\n downlinkMax.value = connection.downlinkMax;\n effectiveType.value = connection.effectiveType;\n rtt.value = connection.rtt;\n saveData.value = connection.saveData;\n type.value = connection.type;\n }\n }\n if (window) {\n useEventListener(window, \"offline\", () => {\n isOnline.value = false;\n offlineAt.value = Date.now();\n });\n useEventListener(window, \"online\", () => {\n isOnline.value = true;\n });\n }\n if (connection)\n useEventListener(connection, \"change\", updateNetworkInformation, false);\n updateNetworkInformation();\n return {\n isSupported,\n isOnline,\n saveData,\n offlineAt,\n downlink,\n downlinkMax,\n effectiveType,\n rtt,\n type\n };\n}\n\nvar __defProp$6 = Object.defineProperty;\nvar __getOwnPropSymbols$6 = Object.getOwnPropertySymbols;\nvar __hasOwnProp$6 = Object.prototype.hasOwnProperty;\nvar __propIsEnum$6 = Object.prototype.propertyIsEnumerable;\nvar __defNormalProp$6 = (obj, key, value) => key in obj ? __defProp$6(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;\nvar __spreadValues$6 = (a, b) => {\n for (var prop in b || (b = {}))\n if (__hasOwnProp$6.call(b, prop))\n __defNormalProp$6(a, prop, b[prop]);\n if (__getOwnPropSymbols$6)\n for (var prop of __getOwnPropSymbols$6(b)) {\n if (__propIsEnum$6.call(b, prop))\n __defNormalProp$6(a, prop, b[prop]);\n }\n return a;\n};\nfunction useNow(options = {}) {\n const {\n controls: exposeControls = false,\n interval = \"requestAnimationFrame\"\n } = options;\n const now = ref(new Date());\n const update = () => now.value = new Date();\n const controls = interval === \"requestAnimationFrame\" ? useRafFn(update, { immediate: true }) : useIntervalFn(update, interval, { immediate: true });\n if (exposeControls) {\n return __spreadValues$6({\n now\n }, controls);\n } else {\n return now;\n }\n}\n\nfunction useOffsetPagination(options) {\n const {\n total = Infinity,\n pageSize = 10,\n page = 1,\n onPageChange = noop$1,\n onPageSizeChange = noop$1,\n onPageCountChange = noop$1\n } = options;\n const currentPageSize = useClamp$1(pageSize, 1, Infinity);\n const pageCount = computed(() => Math.ceil(unref(total) / unref(currentPageSize)));\n const currentPage = useClamp$1(page, 1, pageCount);\n const isFirstPage = computed(() => currentPage.value === 1);\n const isLastPage = computed(() => currentPage.value === pageCount.value);\n if (isRef(page))\n biSyncRef(page, currentPage);\n if (isRef(pageSize))\n biSyncRef(pageSize, currentPageSize);\n function prev() {\n currentPage.value--;\n }\n function next() {\n currentPage.value++;\n }\n const returnValue = {\n currentPage,\n currentPageSize,\n pageCount,\n isFirstPage,\n isLastPage,\n prev,\n next\n };\n watch(currentPage, () => {\n onPageChange(reactive(returnValue));\n });\n watch(currentPageSize, () => {\n onPageSizeChange(reactive(returnValue));\n });\n watch(pageCount, () => {\n onPageCountChange(reactive(returnValue));\n });\n return returnValue;\n}\n\nfunction useOnline(options = {}) {\n const { isOnline } = useNetwork(options);\n return isOnline;\n}\n\nfunction usePageLeave(options = {}) {\n const { window = defaultWindow } = options;\n const isLeft = ref(false);\n const handler = (event) => {\n if (!window)\n return;\n event = event || window.event;\n const from = event.relatedTarget || event.toElement;\n isLeft.value = !from;\n };\n if (window) {\n useEventListener(window, \"mouseout\", handler, { passive: true });\n useEventListener(window.document, \"mouseleave\", handler, { passive: true });\n useEventListener(window.document, \"mouseenter\", handler, { passive: true });\n }\n return isLeft;\n}\n\nfunction useParallax(target, options = {}) {\n const {\n deviceOrientationTiltAdjust = (i) => i,\n deviceOrientationRollAdjust = (i) => i,\n mouseTiltAdjust = (i) => i,\n mouseRollAdjust = (i) => i,\n window = defaultWindow\n } = options;\n const orientation = reactive(useDeviceOrientation({ window }));\n const {\n elementX: x,\n elementY: y,\n elementWidth: width,\n elementHeight: height\n } = useMouseInElement(target, { handleOutside: false, window });\n const source = computed(() => {\n if (orientation.isSupported && (orientation.alpha != null && orientation.alpha !== 0 || orientation.gamma != null && orientation.gamma !== 0))\n return \"deviceOrientation\";\n return \"mouse\";\n });\n const roll = computed(() => {\n if (source.value === \"deviceOrientation\") {\n const value = -orientation.beta / 90;\n return deviceOrientationRollAdjust(value);\n } else {\n const value = -(y.value - height.value / 2) / height.value;\n return mouseRollAdjust(value);\n }\n });\n const tilt = computed(() => {\n if (source.value === \"deviceOrientation\") {\n const value = orientation.gamma / 90;\n return deviceOrientationTiltAdjust(value);\n } else {\n const value = (x.value - width.value / 2) / width.value;\n return mouseTiltAdjust(value);\n }\n });\n return { roll, tilt, source };\n}\n\nvar __defProp$5 = Object.defineProperty;\nvar __defProps$2 = Object.defineProperties;\nvar __getOwnPropDescs$2 = Object.getOwnPropertyDescriptors;\nvar __getOwnPropSymbols$5 = Object.getOwnPropertySymbols;\nvar __hasOwnProp$5 = Object.prototype.hasOwnProperty;\nvar __propIsEnum$5 = Object.prototype.propertyIsEnumerable;\nvar __defNormalProp$5 = (obj, key, value) => key in obj ? __defProp$5(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;\nvar __spreadValues$5 = (a, b) => {\n for (var prop in b || (b = {}))\n if (__hasOwnProp$5.call(b, prop))\n __defNormalProp$5(a, prop, b[prop]);\n if (__getOwnPropSymbols$5)\n for (var prop of __getOwnPropSymbols$5(b)) {\n if (__propIsEnum$5.call(b, prop))\n __defNormalProp$5(a, prop, b[prop]);\n }\n return a;\n};\nvar __spreadProps$2 = (a, b) => __defProps$2(a, __getOwnPropDescs$2(b));\nconst defaultState = {\n x: 0,\n y: 0,\n pointerId: 0,\n pressure: 0,\n tiltX: 0,\n tiltY: 0,\n width: 0,\n height: 0,\n twist: 0,\n pointerType: null\n};\nconst keys = /* @__PURE__ */ Object.keys(defaultState);\nfunction usePointer(options = {}) {\n const {\n target = defaultWindow\n } = options;\n const isInside = ref(false);\n const state = ref(options.initialValue || {});\n Object.assign(state.value, defaultState, state.value);\n const handler = (event) => {\n isInside.value = true;\n if (options.pointerTypes && !options.pointerTypes.includes(event.pointerType))\n return;\n state.value = objectPick(event, keys, false);\n };\n if (target) {\n useEventListener(target, \"pointerdown\", handler, { passive: true });\n useEventListener(target, \"pointermove\", handler, { passive: true });\n useEventListener(target, \"pointerleave\", () => isInside.value = false, { passive: true });\n }\n return __spreadProps$2(__spreadValues$5({}, toRefs(state)), {\n isInside\n });\n}\n\nvar SwipeDirection = /* @__PURE__ */ ((SwipeDirection2) => {\n SwipeDirection2[\"UP\"] = \"UP\";\n SwipeDirection2[\"RIGHT\"] = \"RIGHT\";\n SwipeDirection2[\"DOWN\"] = \"DOWN\";\n SwipeDirection2[\"LEFT\"] = \"LEFT\";\n SwipeDirection2[\"NONE\"] = \"NONE\";\n return SwipeDirection2;\n})(SwipeDirection || {});\nfunction useSwipe(target, options = {}) {\n const {\n threshold = 50,\n onSwipe,\n onSwipeEnd,\n onSwipeStart,\n passive = true,\n window = defaultWindow\n } = options;\n const coordsStart = reactive({ x: 0, y: 0 });\n const coordsEnd = reactive({ x: 0, y: 0 });\n const diffX = computed(() => coordsStart.x - coordsEnd.x);\n const diffY = computed(() => coordsStart.y - coordsEnd.y);\n const { max, abs } = Math;\n const isThresholdExceeded = computed(() => max(abs(diffX.value), abs(diffY.value)) >= threshold);\n const isSwiping = ref(false);\n const direction = computed(() => {\n if (!isThresholdExceeded.value)\n return \"NONE\" /* NONE */;\n if (abs(diffX.value) > abs(diffY.value)) {\n return diffX.value > 0 ? \"LEFT\" /* LEFT */ : \"RIGHT\" /* RIGHT */;\n } else {\n return diffY.value > 0 ? \"UP\" /* UP */ : \"DOWN\" /* DOWN */;\n }\n });\n const getTouchEventCoords = (e) => [e.touches[0].clientX, e.touches[0].clientY];\n const updateCoordsStart = (x, y) => {\n coordsStart.x = x;\n coordsStart.y = y;\n };\n const updateCoordsEnd = (x, y) => {\n coordsEnd.x = x;\n coordsEnd.y = y;\n };\n let listenerOptions;\n const isPassiveEventSupported = checkPassiveEventSupport(window == null ? void 0 : window.document);\n if (!passive)\n listenerOptions = isPassiveEventSupported ? { passive: false, capture: true } : { capture: true };\n else\n listenerOptions = isPassiveEventSupported ? { passive: true } : { capture: false };\n const onTouchEnd = (e) => {\n if (isSwiping.value)\n onSwipeEnd == null ? void 0 : onSwipeEnd(e, direction.value);\n isSwiping.value = false;\n };\n const stops = [\n useEventListener(target, \"touchstart\", (e) => {\n if (listenerOptions.capture && !listenerOptions.passive)\n e.preventDefault();\n const [x, y] = getTouchEventCoords(e);\n updateCoordsStart(x, y);\n updateCoordsEnd(x, y);\n onSwipeStart == null ? void 0 : onSwipeStart(e);\n }, listenerOptions),\n useEventListener(target, \"touchmove\", (e) => {\n const [x, y] = getTouchEventCoords(e);\n updateCoordsEnd(x, y);\n if (!isSwiping.value && isThresholdExceeded.value)\n isSwiping.value = true;\n if (isSwiping.value)\n onSwipe == null ? void 0 : onSwipe(e);\n }, listenerOptions),\n useEventListener(target, \"touchend\", onTouchEnd, listenerOptions),\n useEventListener(target, \"touchcancel\", onTouchEnd, listenerOptions)\n ];\n const stop = () => stops.forEach((s) => s());\n return {\n isPassiveEventSupported,\n isSwiping,\n direction,\n coordsStart,\n coordsEnd,\n lengthX: diffX,\n lengthY: diffY,\n stop\n };\n}\nfunction checkPassiveEventSupport(document) {\n if (!document)\n return false;\n let supportsPassive = false;\n const optionsBlock = {\n get passive() {\n supportsPassive = true;\n return false;\n }\n };\n document.addEventListener(\"x\", noop, optionsBlock);\n document.removeEventListener(\"x\", noop);\n return supportsPassive;\n}\n\nfunction usePointerSwipe(target, options = {}) {\n const targetRef = ref(target);\n const {\n threshold = 50,\n onSwipe,\n onSwipeEnd,\n onSwipeStart\n } = options;\n const posStart = reactive({ x: 0, y: 0 });\n const updatePosStart = (x, y) => {\n posStart.x = x;\n posStart.y = y;\n };\n const posEnd = reactive({ x: 0, y: 0 });\n const updatePosEnd = (x, y) => {\n posEnd.x = x;\n posEnd.y = y;\n };\n const distanceX = computed(() => posStart.x - posEnd.x);\n const distanceY = computed(() => posStart.y - posEnd.y);\n const { max, abs } = Math;\n const isThresholdExceeded = computed(() => max(abs(distanceX.value), abs(distanceY.value)) >= threshold);\n const isSwiping = ref(false);\n const isPointerDown = ref(false);\n const direction = computed(() => {\n if (!isThresholdExceeded.value)\n return SwipeDirection.NONE;\n if (abs(distanceX.value) > abs(distanceY.value)) {\n return distanceX.value > 0 ? SwipeDirection.LEFT : SwipeDirection.RIGHT;\n } else {\n return distanceY.value > 0 ? SwipeDirection.UP : SwipeDirection.DOWN;\n }\n });\n const filterEvent = (e) => {\n if (options.pointerTypes)\n return options.pointerTypes.includes(e.pointerType);\n return true;\n };\n const stops = [\n useEventListener(target, \"pointerdown\", (e) => {\n var _a, _b;\n if (!filterEvent(e))\n return;\n isPointerDown.value = true;\n (_b = (_a = targetRef.value) == null ? void 0 : _a.style) == null ? void 0 : _b.setProperty(\"touch-action\", \"none\");\n const eventTarget = e.target;\n eventTarget == null ? void 0 : eventTarget.setPointerCapture(e.pointerId);\n const { clientX: x, clientY: y } = e;\n updatePosStart(x, y);\n updatePosEnd(x, y);\n onSwipeStart == null ? void 0 : onSwipeStart(e);\n }),\n useEventListener(target, \"pointermove\", (e) => {\n if (!filterEvent(e))\n return;\n if (!isPointerDown.value)\n return;\n const { clientX: x, clientY: y } = e;\n updatePosEnd(x, y);\n if (!isSwiping.value && isThresholdExceeded.value)\n isSwiping.value = true;\n if (isSwiping.value)\n onSwipe == null ? void 0 : onSwipe(e);\n }),\n useEventListener(target, \"pointerup\", (e) => {\n var _a, _b;\n if (!filterEvent(e))\n return;\n if (isSwiping.value)\n onSwipeEnd == null ? void 0 : onSwipeEnd(e, direction.value);\n isPointerDown.value = false;\n isSwiping.value = false;\n (_b = (_a = targetRef.value) == null ? void 0 : _a.style) == null ? void 0 : _b.setProperty(\"touch-action\", \"initial\");\n })\n ];\n const stop = () => stops.forEach((s) => s());\n return {\n isSwiping: readonly(isSwiping),\n direction: readonly(direction),\n posStart: readonly(posStart),\n posEnd: readonly(posEnd),\n distanceX,\n distanceY,\n stop\n };\n}\n\nfunction usePreferredColorScheme(options) {\n const isLight = useMediaQuery(\"(prefers-color-scheme: light)\", options);\n const isDark = useMediaQuery(\"(prefers-color-scheme: dark)\", options);\n return computed(() => {\n if (isDark.value)\n return \"dark\";\n if (isLight.value)\n return \"light\";\n return \"no-preference\";\n });\n}\n\nfunction usePreferredLanguages(options = {}) {\n const { window = defaultWindow } = options;\n if (!window)\n return ref([\"en\"]);\n const navigator = window.navigator;\n const value = ref(navigator.languages);\n useEventListener(window, \"languagechange\", () => {\n value.value = navigator.languages;\n });\n return value;\n}\n\nconst topVarName = \"--vueuse-safe-area-top\";\nconst rightVarName = \"--vueuse-safe-area-right\";\nconst bottomVarName = \"--vueuse-safe-area-bottom\";\nconst leftVarName = \"--vueuse-safe-area-left\";\nfunction useScreenSafeArea() {\n const top = ref(\"\");\n const right = ref(\"\");\n const bottom = ref(\"\");\n const left = ref(\"\");\n if (isClient) {\n const topCssVar = useCssVar(topVarName);\n const rightCssVar = useCssVar(rightVarName);\n const bottomCssVar = useCssVar(bottomVarName);\n const leftCssVar = useCssVar(leftVarName);\n topCssVar.value = \"env(safe-area-inset-top, 0px)\";\n rightCssVar.value = \"env(safe-area-inset-right, 0px)\";\n bottomCssVar.value = \"env(safe-area-inset-bottom, 0px)\";\n leftCssVar.value = \"env(safe-area-inset-left, 0px)\";\n update();\n useEventListener(\"resize\", useDebounceFn(update));\n }\n function update() {\n top.value = getValue(topVarName);\n right.value = getValue(rightVarName);\n bottom.value = getValue(bottomVarName);\n left.value = getValue(leftVarName);\n }\n return {\n top,\n right,\n bottom,\n left,\n update\n };\n}\nfunction getValue(position) {\n return getComputedStyle(document.documentElement).getPropertyValue(position);\n}\n\nfunction useScriptTag(src, onLoaded = noop, options = {}) {\n const {\n immediate = true,\n manual = false,\n type = \"text/javascript\",\n async = true,\n crossOrigin,\n referrerPolicy,\n noModule,\n defer,\n document = defaultDocument,\n attrs = {}\n } = options;\n const scriptTag = ref(null);\n let _promise = null;\n const loadScript = (waitForScriptLoad) => new Promise((resolve, reject) => {\n const resolveWithElement = (el2) => {\n scriptTag.value = el2;\n resolve(el2);\n return el2;\n };\n if (!document) {\n resolve(false);\n return;\n }\n let shouldAppend = false;\n let el = document.querySelector(`script[src=\"${src}\"]`);\n if (!el) {\n el = document.createElement(\"script\");\n el.type = type;\n el.async = async;\n el.src = unref(src);\n if (defer)\n el.defer = defer;\n if (crossOrigin)\n el.crossOrigin = crossOrigin;\n if (noModule)\n el.noModule = noModule;\n if (referrerPolicy)\n el.referrerPolicy = referrerPolicy;\n for (const attr in attrs)\n el[attr] = attrs[attr];\n shouldAppend = true;\n } else if (el.hasAttribute(\"data-loaded\")) {\n resolveWithElement(el);\n }\n el.addEventListener(\"error\", (event) => reject(event));\n el.addEventListener(\"abort\", (event) => reject(event));\n el.addEventListener(\"load\", () => {\n el.setAttribute(\"data-loaded\", \"true\");\n onLoaded(el);\n resolveWithElement(el);\n });\n if (shouldAppend)\n el = document.head.appendChild(el);\n if (!waitForScriptLoad)\n resolveWithElement(el);\n });\n const load = (waitForScriptLoad = true) => {\n if (!_promise)\n _promise = loadScript(waitForScriptLoad);\n return _promise;\n };\n const unload = () => {\n if (!document)\n return;\n _promise = null;\n if (scriptTag.value)\n scriptTag.value = null;\n const el = document.querySelector(`script[src=\"${src}\"]`);\n if (el)\n document.head.removeChild(el);\n };\n if (immediate && !manual)\n tryOnMounted(load);\n if (!manual)\n tryOnUnmounted(unload);\n return { scriptTag, load, unload };\n}\n\nvar _a, _b;\nfunction preventDefault(rawEvent) {\n const e = rawEvent || window.event;\n if (e.touches.length > 1)\n return true;\n if (e.preventDefault)\n e.preventDefault();\n return false;\n}\nconst isIOS = isClient && (window == null ? void 0 : window.navigator) && ((_a = window == null ? void 0 : window.navigator) == null ? void 0 : _a.platform) && /iP(ad|hone|od)/.test((_b = window == null ? void 0 : window.navigator) == null ? void 0 : _b.platform);\nfunction useScrollLock(element, initialState = false) {\n const isLocked = ref(initialState);\n let touchMoveListener = null;\n let initialOverflow;\n watch(() => unref(element), (el) => {\n if (el) {\n const ele = el;\n initialOverflow = ele.style.overflow;\n if (isLocked.value)\n ele.style.overflow = \"hidden\";\n }\n }, {\n immediate: true\n });\n const lock = () => {\n const ele = unref(element);\n if (!ele || isLocked.value)\n return;\n if (isIOS) {\n touchMoveListener = useEventListener(document, \"touchmove\", preventDefault, { passive: false });\n }\n ele.style.overflow = \"hidden\";\n isLocked.value = true;\n };\n const unlock = () => {\n const ele = unref(element);\n if (!ele || !isLocked.value)\n return;\n isIOS && (touchMoveListener == null ? void 0 : touchMoveListener());\n ele.style.overflow = initialOverflow;\n isLocked.value = false;\n };\n return computed({\n get() {\n return isLocked.value;\n },\n set(v) {\n if (v)\n lock();\n else\n unlock();\n }\n });\n}\n\nfunction useSessionStorage(key, initialValue, options = {}) {\n const { window = defaultWindow } = options;\n return useStorage(key, initialValue, window == null ? void 0 : window.sessionStorage, options);\n}\n\nvar __defProp$4 = Object.defineProperty;\nvar __getOwnPropSymbols$4 = Object.getOwnPropertySymbols;\nvar __hasOwnProp$4 = Object.prototype.hasOwnProperty;\nvar __propIsEnum$4 = Object.prototype.propertyIsEnumerable;\nvar __defNormalProp$4 = (obj, key, value) => key in obj ? __defProp$4(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;\nvar __spreadValues$4 = (a, b) => {\n for (var prop in b || (b = {}))\n if (__hasOwnProp$4.call(b, prop))\n __defNormalProp$4(a, prop, b[prop]);\n if (__getOwnPropSymbols$4)\n for (var prop of __getOwnPropSymbols$4(b)) {\n if (__propIsEnum$4.call(b, prop))\n __defNormalProp$4(a, prop, b[prop]);\n }\n return a;\n};\nfunction useShare(shareOptions = {}, options = {}) {\n const { navigator = defaultNavigator } = options;\n const _navigator = navigator;\n const isSupported = _navigator && \"canShare\" in _navigator;\n const share = async (overrideOptions = {}) => {\n if (isSupported) {\n const data = __spreadValues$4(__spreadValues$4({}, unref(shareOptions)), unref(overrideOptions));\n let granted = true;\n if (data.files && _navigator.canShare)\n granted = _navigator.canShare({ files: data.files });\n if (granted)\n return _navigator.share(data);\n }\n };\n return {\n isSupported,\n share\n };\n}\n\nfunction useSpeechRecognition(options = {}) {\n const {\n interimResults = true,\n continuous = true,\n window = defaultWindow\n } = options;\n const lang = ref(options.lang || \"en-US\");\n const isListening = ref(false);\n const isFinal = ref(false);\n const result = ref(\"\");\n const error = shallowRef(void 0);\n const toggle = (value = !isListening.value) => {\n isListening.value = value;\n };\n const start = () => {\n isListening.value = true;\n };\n const stop = () => {\n isListening.value = false;\n };\n const SpeechRecognition = window && (window.SpeechRecognition || window.webkitSpeechRecognition);\n const isSupported = Boolean(SpeechRecognition);\n let recognition;\n if (isSupported) {\n recognition = new SpeechRecognition();\n recognition.continuous = continuous;\n recognition.interimResults = interimResults;\n recognition.lang = unref(lang);\n recognition.onstart = () => {\n isFinal.value = false;\n };\n watch(lang, (lang2) => {\n if (recognition && !isListening.value)\n recognition.lang = lang2;\n });\n recognition.onresult = (event) => {\n const transcript = Array.from(event.results).map((result2) => {\n isFinal.value = result2.isFinal;\n return result2[0];\n }).map((result2) => result2.transcript).join(\"\");\n result.value = transcript;\n error.value = void 0;\n };\n recognition.onerror = (event) => {\n error.value = event;\n };\n recognition.onend = () => {\n isListening.value = false;\n recognition.lang = unref(lang);\n };\n watch(isListening, () => {\n if (isListening.value)\n recognition.start();\n else\n recognition.stop();\n });\n }\n tryOnScopeDispose(() => {\n isListening.value = false;\n });\n return {\n isSupported,\n isListening,\n isFinal,\n recognition,\n result,\n error,\n toggle,\n start,\n stop\n };\n}\n\nfunction useSpeechSynthesis(text, options = {}) {\n var _a, _b;\n const {\n pitch = 1,\n rate = 1,\n volume = 1,\n window = defaultWindow\n } = options;\n const synth = window && window.speechSynthesis;\n const isSupported = Boolean(synth);\n const isPlaying = ref(false);\n const status = ref(\"init\");\n const voiceInfo = {\n lang: ((_a = options.voice) == null ? void 0 : _a.lang) || \"default\",\n name: ((_b = options.voice) == null ? void 0 : _b.name) || \"\"\n };\n const spokenText = ref(text || \"\");\n const lang = ref(options.lang || \"en-US\");\n const error = shallowRef(void 0);\n const toggle = (value = !isPlaying.value) => {\n isPlaying.value = value;\n };\n const bindEventsForUtterance = (utterance2) => {\n utterance2.lang = unref(lang);\n options.voice && (utterance2.voice = options.voice);\n utterance2.pitch = pitch;\n utterance2.rate = rate;\n utterance2.volume = volume;\n utterance2.onstart = () => {\n isPlaying.value = true;\n status.value = \"play\";\n };\n utterance2.onpause = () => {\n isPlaying.value = false;\n status.value = \"pause\";\n };\n utterance2.onresume = () => {\n isPlaying.value = true;\n status.value = \"play\";\n };\n utterance2.onend = () => {\n isPlaying.value = false;\n status.value = \"end\";\n };\n utterance2.onerror = (event) => {\n error.value = event;\n };\n utterance2.onend = () => {\n isPlaying.value = false;\n utterance2.lang = unref(lang);\n };\n };\n const utterance = computed(() => {\n isPlaying.value = false;\n status.value = \"init\";\n const newUtterance = new SpeechSynthesisUtterance(spokenText.value);\n bindEventsForUtterance(newUtterance);\n return newUtterance;\n });\n const speak = () => {\n synth.cancel();\n utterance && synth.speak(utterance.value);\n };\n if (isSupported) {\n bindEventsForUtterance(utterance.value);\n watch(lang, (lang2) => {\n if (utterance.value && !isPlaying.value)\n utterance.value.lang = lang2;\n });\n watch(isPlaying, () => {\n if (isPlaying.value)\n synth.resume();\n else\n synth.pause();\n });\n }\n tryOnScopeDispose(() => {\n isPlaying.value = false;\n });\n return {\n isSupported,\n isPlaying,\n status,\n voiceInfo,\n utterance,\n error,\n toggle,\n speak\n };\n}\n\nfunction useStorageAsync(key, initialValue, storage, options = {}) {\n var _a;\n const {\n flush = \"pre\",\n deep = true,\n listenToStorageChanges = true,\n writeDefaults = true,\n shallow,\n window = defaultWindow,\n eventFilter,\n onError = (e) => {\n console.error(e);\n }\n } = options;\n const rawInit = unref(initialValue);\n const type = guessSerializerType(rawInit);\n const data = (shallow ? shallowRef : ref)(initialValue);\n const serializer = (_a = options.serializer) != null ? _a : StorageSerializers[type];\n if (!storage) {\n try {\n storage = getSSRHandler(\"getDefaultStorage\", () => {\n var _a2;\n return (_a2 = defaultWindow) == null ? void 0 : _a2.localStorage;\n })();\n } catch (e) {\n onError(e);\n }\n }\n async function read(event) {\n if (!storage || event && event.key !== key)\n return;\n try {\n const rawValue = event ? event.newValue : await storage.getItem(key);\n if (rawValue == null) {\n data.value = rawInit;\n if (writeDefaults && rawInit !== null)\n await storage.setItem(key, await serializer.write(rawInit));\n } else {\n data.value = await serializer.read(rawValue);\n }\n } catch (e) {\n onError(e);\n }\n }\n read();\n if (window && listenToStorageChanges)\n useEventListener(window, \"storage\", (e) => setTimeout(() => read(e), 0));\n if (storage) {\n watchWithFilter(data, async () => {\n try {\n if (data.value == null)\n await storage.removeItem(key);\n else\n await storage.setItem(key, await serializer.write(data.value));\n } catch (e) {\n onError(e);\n }\n }, {\n flush,\n deep,\n eventFilter\n });\n }\n return data;\n}\n\nlet _id = 0;\nfunction useStyleTag(css, options = {}) {\n const isLoaded = ref(false);\n const {\n document = defaultDocument,\n immediate = true,\n manual = false,\n id = `vueuse_styletag_${++_id}`\n } = options;\n const cssRef = ref(css);\n let stop = () => {\n };\n const load = () => {\n if (!document)\n return;\n const el = document.getElementById(id) || document.createElement(\"style\");\n el.type = \"text/css\";\n el.id = id;\n if (options.media)\n el.media = options.media;\n document.head.appendChild(el);\n if (isLoaded.value)\n return;\n stop = watch(cssRef, (value) => {\n el.innerText = value;\n }, { immediate: true });\n isLoaded.value = true;\n };\n const unload = () => {\n if (!document || !isLoaded.value)\n return;\n stop();\n document.head.removeChild(document.getElementById(id));\n isLoaded.value = false;\n };\n if (immediate && !manual)\n load();\n if (!manual)\n tryOnScopeDispose(unload);\n return {\n id,\n css: cssRef,\n unload,\n load,\n isLoaded: readonly(isLoaded)\n };\n}\n\nfunction useTemplateRefsList() {\n const refs = ref([]);\n refs.value.set = (el) => {\n if (el)\n refs.value.push(el);\n };\n onBeforeUpdate(() => {\n refs.value.length = 0;\n });\n return refs;\n}\n\nvar __defProp$3 = Object.defineProperty;\nvar __defProps$1 = Object.defineProperties;\nvar __getOwnPropDescs$1 = Object.getOwnPropertyDescriptors;\nvar __getOwnPropSymbols$3 = Object.getOwnPropertySymbols;\nvar __hasOwnProp$3 = Object.prototype.hasOwnProperty;\nvar __propIsEnum$3 = Object.prototype.propertyIsEnumerable;\nvar __defNormalProp$3 = (obj, key, value) => key in obj ? __defProp$3(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;\nvar __spreadValues$3 = (a, b) => {\n for (var prop in b || (b = {}))\n if (__hasOwnProp$3.call(b, prop))\n __defNormalProp$3(a, prop, b[prop]);\n if (__getOwnPropSymbols$3)\n for (var prop of __getOwnPropSymbols$3(b)) {\n if (__propIsEnum$3.call(b, prop))\n __defNormalProp$3(a, prop, b[prop]);\n }\n return a;\n};\nvar __spreadProps$1 = (a, b) => __defProps$1(a, __getOwnPropDescs$1(b));\nconst initialRect = {\n top: 0,\n left: 0,\n bottom: 0,\n right: 0,\n height: 0,\n width: 0\n};\nconst initialState = __spreadValues$3({\n text: \"\"\n}, initialRect);\nfunction getRectFromSelection(selection) {\n if (!selection || selection.rangeCount < 1)\n return initialRect;\n const range = selection.getRangeAt(0);\n const { height, width, top, left, right, bottom } = range.getBoundingClientRect();\n return {\n height,\n width,\n top,\n left,\n right,\n bottom\n };\n}\nfunction useTextSelection(element) {\n var _a;\n const state = ref(initialState);\n if (!((_a = defaultWindow) == null ? void 0 : _a.getSelection))\n return state;\n const onMouseup = () => {\n var _a2;\n const text = (_a2 = window.getSelection()) == null ? void 0 : _a2.toString();\n if (text) {\n const rect = getRectFromSelection(window.getSelection());\n state.value = __spreadProps$1(__spreadValues$3(__spreadValues$3({}, state.value), rect), {\n text\n });\n }\n };\n const onMousedown = () => {\n var _a2;\n state.value.text && (state.value = initialState);\n (_a2 = window.getSelection()) == null ? void 0 : _a2.removeAllRanges();\n };\n useEventListener(element != null ? element : document, \"mouseup\", onMouseup);\n useEventListener(document, \"mousedown\", onMousedown);\n return state;\n}\n\nvar __defProp$2 = Object.defineProperty;\nvar __defProps = Object.defineProperties;\nvar __getOwnPropDescs = Object.getOwnPropertyDescriptors;\nvar __getOwnPropSymbols$2 = Object.getOwnPropertySymbols;\nvar __hasOwnProp$2 = Object.prototype.hasOwnProperty;\nvar __propIsEnum$2 = Object.prototype.propertyIsEnumerable;\nvar __defNormalProp$2 = (obj, key, value) => key in obj ? __defProp$2(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;\nvar __spreadValues$2 = (a, b) => {\n for (var prop in b || (b = {}))\n if (__hasOwnProp$2.call(b, prop))\n __defNormalProp$2(a, prop, b[prop]);\n if (__getOwnPropSymbols$2)\n for (var prop of __getOwnPropSymbols$2(b)) {\n if (__propIsEnum$2.call(b, prop))\n __defNormalProp$2(a, prop, b[prop]);\n }\n return a;\n};\nvar __spreadProps = (a, b) => __defProps(a, __getOwnPropDescs(b));\nfunction useThrottledRefHistory(source, options = {}) {\n const { throttle = 200, trailing = true } = options;\n const filter = throttleFilter(throttle, trailing);\n const history = useRefHistory(source, __spreadProps(__spreadValues$2({}, options), { eventFilter: filter }));\n return __spreadValues$2({}, history);\n}\n\nvar __defProp$1 = Object.defineProperty;\nvar __getOwnPropSymbols$1 = Object.getOwnPropertySymbols;\nvar __hasOwnProp$1 = Object.prototype.hasOwnProperty;\nvar __propIsEnum$1 = Object.prototype.propertyIsEnumerable;\nvar __defNormalProp$1 = (obj, key, value) => key in obj ? __defProp$1(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;\nvar __spreadValues$1 = (a, b) => {\n for (var prop in b || (b = {}))\n if (__hasOwnProp$1.call(b, prop))\n __defNormalProp$1(a, prop, b[prop]);\n if (__getOwnPropSymbols$1)\n for (var prop of __getOwnPropSymbols$1(b)) {\n if (__propIsEnum$1.call(b, prop))\n __defNormalProp$1(a, prop, b[prop]);\n }\n return a;\n};\nvar __objRest = (source, exclude) => {\n var target = {};\n for (var prop in source)\n if (__hasOwnProp$1.call(source, prop) && exclude.indexOf(prop) < 0)\n target[prop] = source[prop];\n if (source != null && __getOwnPropSymbols$1)\n for (var prop of __getOwnPropSymbols$1(source)) {\n if (exclude.indexOf(prop) < 0 && __propIsEnum$1.call(source, prop))\n target[prop] = source[prop];\n }\n return target;\n};\nconst UNITS = [\n { max: 6e4, value: 1e3, name: \"second\" },\n { max: 276e4, value: 6e4, name: \"minute\" },\n { max: 72e6, value: 36e5, name: \"hour\" },\n { max: 5184e5, value: 864e5, name: \"day\" },\n { max: 24192e5, value: 6048e5, name: \"week\" },\n { max: 28512e6, value: 2592e6, name: \"month\" },\n { max: Infinity, value: 31536e6, name: \"year\" }\n];\nconst DEFAULT_MESSAGES = {\n justNow: \"just now\",\n past: (n) => n.match(/\\d/) ? `${n} ago` : n,\n future: (n) => n.match(/\\d/) ? `in ${n}` : n,\n month: (n, past) => n === 1 ? past ? \"last month\" : \"next month\" : `${n} month${n > 1 ? \"s\" : \"\"}`,\n year: (n, past) => n === 1 ? past ? \"last year\" : \"next year\" : `${n} year${n > 1 ? \"s\" : \"\"}`,\n day: (n, past) => n === 1 ? past ? \"yesterday\" : \"tomorrow\" : `${n} day${n > 1 ? \"s\" : \"\"}`,\n week: (n, past) => n === 1 ? past ? \"last week\" : \"next week\" : `${n} week${n > 1 ? \"s\" : \"\"}`,\n hour: (n) => `${n} hour${n > 1 ? \"s\" : \"\"}`,\n minute: (n) => `${n} minute${n > 1 ? \"s\" : \"\"}`,\n second: (n) => `${n} second${n > 1 ? \"s\" : \"\"}`\n};\nconst DEFAULT_FORMATTER = (date) => date.toISOString().slice(0, 10);\nfunction useTimeAgo(time, options = {}) {\n const {\n controls: exposeControls = false,\n max,\n updateInterval = 3e4,\n messages = DEFAULT_MESSAGES,\n fullDateFormatter = DEFAULT_FORMATTER\n } = options;\n const { abs, round } = Math;\n const _a = useNow({ interval: updateInterval, controls: true }), { now } = _a, controls = __objRest(_a, [\"now\"]);\n function getTimeago(from, now2) {\n var _a2;\n const diff = +now2 - +from;\n const absDiff = abs(diff);\n if (absDiff < 6e4)\n return messages.justNow;\n if (typeof max === \"number\" && absDiff > max)\n return fullDateFormatter(new Date(from));\n if (typeof max === \"string\") {\n const unitMax = (_a2 = UNITS.find((i) => i.name === max)) == null ? void 0 : _a2.max;\n if (unitMax && absDiff > unitMax)\n return fullDateFormatter(new Date(from));\n }\n for (const unit of UNITS) {\n if (absDiff < unit.max)\n return format(diff, unit);\n }\n }\n function applyFormat(name, val, isPast) {\n const formatter = messages[name];\n if (typeof formatter === \"function\")\n return formatter(val, isPast);\n return formatter.replace(\"{0}\", val.toString());\n }\n function format(diff, unit) {\n const val = round(abs(diff) / unit.value);\n const past = diff > 0;\n const str = applyFormat(unit.name, val, past);\n return applyFormat(past ? \"past\" : \"future\", str, past);\n }\n const timeAgo = computed(() => getTimeago(new Date(unref(time)), unref(now.value)));\n if (exposeControls) {\n return __spreadValues$1({\n timeAgo\n }, controls);\n } else {\n return timeAgo;\n }\n}\n\nvar __defProp = Object.defineProperty;\nvar __getOwnPropSymbols = Object.getOwnPropertySymbols;\nvar __hasOwnProp = Object.prototype.hasOwnProperty;\nvar __propIsEnum = Object.prototype.propertyIsEnumerable;\nvar __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;\nvar __spreadValues = (a, b) => {\n for (var prop in b || (b = {}))\n if (__hasOwnProp.call(b, prop))\n __defNormalProp(a, prop, b[prop]);\n if (__getOwnPropSymbols)\n for (var prop of __getOwnPropSymbols(b)) {\n if (__propIsEnum.call(b, prop))\n __defNormalProp(a, prop, b[prop]);\n }\n return a;\n};\nfunction useTimestamp(options = {}) {\n const {\n controls: exposeControls = false,\n offset = 0,\n immediate = true,\n interval = \"requestAnimationFrame\"\n } = options;\n const ts = ref(timestamp() + offset);\n const update = () => ts.value = timestamp() + offset;\n const controls = interval === \"requestAnimationFrame\" ? useRafFn(update, { immediate }) : useIntervalFn(update, interval, { immediate });\n if (exposeControls) {\n return __spreadValues({\n timestamp: ts\n }, controls);\n } else {\n return ts;\n }\n}\n\nfunction useTitle(newTitle = null, options = {}) {\n var _a, _b;\n const {\n document = defaultDocument,\n observe = false,\n titleTemplate = \"%s\"\n } = options;\n const title = ref((_a = newTitle != null ? newTitle : document == null ? void 0 : document.title) != null ? _a : null);\n watch(title, (t, o) => {\n if (isString(t) && t !== o && document)\n document.title = titleTemplate.replace(\"%s\", t);\n }, { immediate: true });\n if (observe && document) {\n useMutationObserver((_b = document.head) == null ? void 0 : _b.querySelector(\"title\"), () => {\n if (document && document.title !== title.value)\n title.value = titleTemplate.replace(\"%s\", document.title);\n }, { childList: true });\n }\n return title;\n}\n\nconst TransitionPresets = {\n linear: identity,\n easeInSine: [0.12, 0, 0.39, 0],\n easeOutSine: [0.61, 1, 0.88, 1],\n easeInOutSine: [0.37, 0, 0.63, 1],\n easeInQuad: [0.11, 0, 0.5, 0],\n easeOutQuad: [0.5, 1, 0.89, 1],\n easeInOutQuad: [0.45, 0, 0.55, 1],\n easeInCubic: [0.32, 0, 0.67, 0],\n easeOutCubic: [0.33, 1, 0.68, 1],\n easeInOutCubic: [0.65, 0, 0.35, 1],\n easeInQuart: [0.5, 0, 0.75, 0],\n easeOutQuart: [0.25, 1, 0.5, 1],\n easeInOutQuart: [0.76, 0, 0.24, 1],\n easeInQuint: [0.64, 0, 0.78, 0],\n easeOutQuint: [0.22, 1, 0.36, 1],\n easeInOutQuint: [0.83, 0, 0.17, 1],\n easeInExpo: [0.7, 0, 0.84, 0],\n easeOutExpo: [0.16, 1, 0.3, 1],\n easeInOutExpo: [0.87, 0, 0.13, 1],\n easeInCirc: [0.55, 0, 1, 0.45],\n easeOutCirc: [0, 0.55, 0.45, 1],\n easeInOutCirc: [0.85, 0, 0.15, 1],\n easeInBack: [0.36, 0, 0.66, -0.56],\n easeOutBack: [0.34, 1.56, 0.64, 1],\n easeInOutBack: [0.68, -0.6, 0.32, 1.6]\n};\nfunction createEasingFunction([p0, p1, p2, p3]) {\n const a = (a1, a2) => 1 - 3 * a2 + 3 * a1;\n const b = (a1, a2) => 3 * a2 - 6 * a1;\n const c = (a1) => 3 * a1;\n const calcBezier = (t, a1, a2) => ((a(a1, a2) * t + b(a1, a2)) * t + c(a1)) * t;\n const getSlope = (t, a1, a2) => 3 * a(a1, a2) * t * t + 2 * b(a1, a2) * t + c(a1);\n const getTforX = (x) => {\n let aGuessT = x;\n for (let i = 0; i < 4; ++i) {\n const currentSlope = getSlope(aGuessT, p0, p2);\n if (currentSlope === 0)\n return aGuessT;\n const currentX = calcBezier(aGuessT, p0, p2) - x;\n aGuessT -= currentX / currentSlope;\n }\n return aGuessT;\n };\n return (x) => p0 === p1 && p2 === p3 ? x : calcBezier(getTforX(x), p1, p3);\n}\nfunction useTransition(source, options = {}) {\n const {\n delay = 0,\n disabled = false,\n duration = 1e3,\n onFinished = noop,\n onStarted = noop,\n transition = identity\n } = options;\n const currentTransition = computed(() => {\n const t = unref(transition);\n return isFunction(t) ? t : createEasingFunction(t);\n });\n const sourceValue = computed(() => {\n const s = unref(source);\n return isNumber(s) ? s : s.map(unref);\n });\n const sourceVector = computed(() => isNumber(sourceValue.value) ? [sourceValue.value] : sourceValue.value);\n const outputVector = ref(sourceVector.value.slice(0));\n let currentDuration;\n let diffVector;\n let endAt;\n let startAt;\n let startVector;\n const { resume, pause } = useRafFn(() => {\n const now = Date.now();\n const progress = clamp(1 - (endAt - now) / currentDuration, 0, 1);\n outputVector.value = startVector.map((val, i) => {\n var _a;\n return val + ((_a = diffVector[i]) != null ? _a : 0) * currentTransition.value(progress);\n });\n if (progress >= 1) {\n pause();\n onFinished();\n }\n }, { immediate: false });\n const start = () => {\n pause();\n currentDuration = unref(duration);\n diffVector = outputVector.value.map((n, i) => {\n var _a, _b;\n return ((_a = sourceVector.value[i]) != null ? _a : 0) - ((_b = outputVector.value[i]) != null ? _b : 0);\n });\n startVector = outputVector.value.slice(0);\n startAt = Date.now();\n endAt = startAt + currentDuration;\n resume();\n onStarted();\n };\n const timeout = useTimeoutFn(start, delay, { immediate: false });\n watch(sourceVector, () => {\n if (unref(disabled)) {\n outputVector.value = sourceVector.value.slice(0);\n } else {\n if (unref(delay) <= 0)\n start();\n else\n timeout.start();\n }\n }, { deep: true });\n return computed(() => {\n const targetVector = unref(disabled) ? sourceVector : outputVector;\n return isNumber(sourceValue.value) ? targetVector.value[0] : targetVector.value;\n });\n}\n\nfunction useUrlSearchParams(mode = \"history\", options = {}) {\n const {\n initialValue = {},\n removeNullishValues = true,\n removeFalsyValues = false,\n window = defaultWindow\n } = options;\n if (!window)\n return reactive(initialValue);\n const state = reactive(initialValue);\n function getRawParams() {\n if (mode === \"history\") {\n return window.location.search || \"\";\n } else if (mode === \"hash\") {\n const hash = window.location.hash || \"\";\n const index = hash.indexOf(\"?\");\n return index > 0 ? hash.slice(index) : \"\";\n } else {\n return (window.location.hash || \"\").replace(/^#/, \"\");\n }\n }\n function constructQuery(params) {\n const stringified = params.toString();\n if (mode === \"history\")\n return `${stringified ? `?${stringified}` : \"\"}${location.hash || \"\"}`;\n if (mode === \"hash-params\")\n return `${location.search || \"\"}${stringified ? `#${stringified}` : \"\"}`;\n const hash = window.location.hash || \"#\";\n const index = hash.indexOf(\"?\");\n if (index > 0)\n return `${hash.slice(0, index)}${stringified ? `?${stringified}` : \"\"}`;\n return `${hash}${stringified ? `?${stringified}` : \"\"}`;\n }\n function read() {\n return new URLSearchParams(getRawParams());\n }\n function updateState(params) {\n const unusedKeys = new Set(Object.keys(state));\n for (const key of params.keys()) {\n const paramsForKey = params.getAll(key);\n state[key] = paramsForKey.length > 1 ? paramsForKey : params.get(key) || \"\";\n unusedKeys.delete(key);\n }\n Array.from(unusedKeys).forEach((key) => delete state[key]);\n }\n const { pause, resume } = pausableWatch(state, () => {\n const params = new URLSearchParams(\"\");\n Object.keys(state).forEach((key) => {\n const mapEntry = state[key];\n if (Array.isArray(mapEntry))\n mapEntry.forEach((value) => params.append(key, value));\n else if (removeNullishValues && mapEntry == null)\n params.delete(key);\n else if (removeFalsyValues && !mapEntry)\n params.delete(key);\n else\n params.set(key, mapEntry);\n });\n write(params);\n }, { deep: true });\n function write(params, shouldUpdate) {\n pause();\n if (shouldUpdate)\n updateState(params);\n window.history.replaceState({}, \"\", window.location.pathname + constructQuery(params));\n resume();\n }\n function onChanged() {\n write(read(), true);\n }\n useEventListener(window, \"popstate\", onChanged, false);\n if (mode !== \"history\")\n useEventListener(window, \"hashchange\", onChanged, false);\n updateState(read());\n return state;\n}\n\nfunction useUserMedia(options = {}) {\n var _a, _b, _c;\n const enabled = ref((_a = options.enabled) != null ? _a : false);\n const autoSwitch = ref((_b = options.autoSwitch) != null ? _b : true);\n const videoDeviceId = ref(options.videoDeviceId);\n const audioDeviceId = ref(options.audioDeviceId);\n const { navigator = defaultNavigator } = options;\n const isSupported = Boolean((_c = navigator == null ? void 0 : navigator.mediaDevices) == null ? void 0 : _c.getUserMedia);\n const stream = shallowRef();\n function getDeviceOptions(device) {\n if (device.value === \"none\" || device.value === false)\n return false;\n if (device.value == null)\n return true;\n return {\n deviceId: device.value\n };\n }\n async function _start() {\n if (!isSupported || stream.value)\n return;\n stream.value = await navigator.mediaDevices.getUserMedia({\n video: getDeviceOptions(videoDeviceId),\n audio: getDeviceOptions(audioDeviceId)\n });\n return stream.value;\n }\n async function _stop() {\n var _a2;\n (_a2 = stream.value) == null ? void 0 : _a2.getTracks().forEach((t) => t.stop());\n stream.value = void 0;\n }\n function stop() {\n _stop();\n enabled.value = false;\n }\n async function start() {\n await _start();\n if (stream.value)\n enabled.value = true;\n return stream.value;\n }\n async function restart() {\n _stop();\n return await start();\n }\n watch(enabled, (v) => {\n if (v)\n _start();\n else\n _stop();\n }, { immediate: true });\n watch([videoDeviceId, audioDeviceId], () => {\n if (autoSwitch.value && stream.value)\n restart();\n }, { immediate: true });\n return {\n isSupported,\n stream,\n start,\n stop,\n restart,\n videoDeviceId,\n audioDeviceId,\n enabled,\n autoSwitch\n };\n}\n\nfunction useVModel(props, key, emit, options = {}) {\n var _a, _b, _c;\n const {\n passive = false,\n eventName,\n deep = false\n } = options;\n const vm = getCurrentInstance();\n const _emit = emit || (vm == null ? void 0 : vm.emit) || ((_a = vm == null ? void 0 : vm.$emit) == null ? void 0 : _a.bind(vm));\n let event = eventName;\n if (!key) {\n if (isVue2) {\n const modelOptions = (_c = (_b = vm == null ? void 0 : vm.proxy) == null ? void 0 : _b.$options) == null ? void 0 : _c.model;\n key = (modelOptions == null ? void 0 : modelOptions.value) || \"value\";\n if (!eventName)\n event = (modelOptions == null ? void 0 : modelOptions.event) || \"input\";\n } else {\n key = \"modelValue\";\n }\n }\n event = eventName || event || `update:${key}`;\n if (passive) {\n const proxy = ref(props[key]);\n watch(() => props[key], (v) => proxy.value = v);\n watch(proxy, (v) => {\n if (v !== props[key] || deep)\n _emit(event, v);\n }, {\n deep\n });\n return proxy;\n } else {\n return computed({\n get() {\n return props[key];\n },\n set(value) {\n _emit(event, value);\n }\n });\n }\n}\n\nfunction useVModels(props, emit, options = {}) {\n const ret = {};\n for (const key in props)\n ret[key] = useVModel(props, key, emit, options);\n return ret;\n}\n\nfunction useVibrate(options) {\n const {\n pattern = [],\n interval = 0,\n navigator = defaultNavigator\n } = options || {};\n const isSupported = typeof navigator !== \"undefined\" && \"vibrate\" in navigator;\n const patternRef = ref(pattern);\n let intervalControls;\n const vibrate = (pattern2 = patternRef.value) => {\n if (isSupported)\n navigator.vibrate(pattern2);\n };\n const stop = () => {\n if (isSupported)\n navigator.vibrate(0);\n intervalControls == null ? void 0 : intervalControls.pause();\n };\n if (interval > 0) {\n intervalControls = useIntervalFn(vibrate, interval, {\n immediate: false,\n immediateCallback: false\n });\n }\n return {\n isSupported,\n pattern,\n intervalControls,\n vibrate,\n stop\n };\n}\n\nfunction useVirtualList(list, options) {\n const containerRef = ref();\n const size = useElementSize(containerRef);\n const currentList = ref([]);\n const source = shallowRef(list);\n const state = ref({ start: 0, end: 10 });\n const { itemHeight, overscan = 5 } = options;\n const getViewCapacity = (containerHeight) => {\n if (typeof itemHeight === \"number\")\n return Math.ceil(containerHeight / itemHeight);\n const { start = 0 } = state.value;\n let sum = 0;\n let capacity = 0;\n for (let i = start; i < source.value.length; i++) {\n const height = itemHeight(i);\n sum += height;\n if (sum >= containerHeight) {\n capacity = i;\n break;\n }\n }\n return capacity - start;\n };\n const getOffset = (scrollTop) => {\n if (typeof itemHeight === \"number\")\n return Math.floor(scrollTop / itemHeight) + 1;\n let sum = 0;\n let offset = 0;\n for (let i = 0; i < source.value.length; i++) {\n const height = itemHeight(i);\n sum += height;\n if (sum >= scrollTop) {\n offset = i;\n break;\n }\n }\n return offset + 1;\n };\n const calculateRange = () => {\n const element = containerRef.value;\n if (element) {\n const offset = getOffset(element.scrollTop);\n const viewCapacity = getViewCapacity(element.clientHeight);\n const from = offset - overscan;\n const to = offset + viewCapacity + overscan;\n state.value = {\n start: from < 0 ? 0 : from,\n end: to > source.value.length ? source.value.length : to\n };\n currentList.value = source.value.slice(state.value.start, state.value.end).map((ele, index) => ({\n data: ele,\n index: index + state.value.start\n }));\n }\n };\n watch([size.width, size.height, list], () => {\n calculateRange();\n });\n const totalHeight = computed(() => {\n if (typeof itemHeight === \"number\")\n return source.value.length * itemHeight;\n return source.value.reduce((sum, _, index) => sum + itemHeight(index), 0);\n });\n const getDistanceTop = (index) => {\n if (typeof itemHeight === \"number\") {\n const height2 = index * itemHeight;\n return height2;\n }\n const height = source.value.slice(0, index).reduce((sum, _, i) => sum + itemHeight(i), 0);\n return height;\n };\n const scrollTo = (index) => {\n if (containerRef.value) {\n containerRef.value.scrollTop = getDistanceTop(index);\n calculateRange();\n }\n };\n const offsetTop = computed(() => getDistanceTop(state.value.start));\n const wrapperProps = computed(() => {\n return {\n style: {\n width: \"100%\",\n height: `${totalHeight.value - offsetTop.value}px`,\n marginTop: `${offsetTop.value}px`\n }\n };\n });\n const containerStyle = { overflowY: \"auto\" };\n return {\n list: currentList,\n scrollTo,\n containerProps: {\n ref: containerRef,\n onScroll: () => {\n calculateRange();\n },\n style: containerStyle\n },\n wrapperProps\n };\n}\n\nconst useWakeLock = (options = {}) => {\n const {\n navigator = defaultNavigator,\n document = defaultDocument\n } = options;\n let wakeLock;\n const isSupported = navigator && \"wakeLock\" in navigator;\n const isActive = ref(false);\n async function onVisibilityChange() {\n if (!isSupported || !wakeLock)\n return;\n if (document && document.visibilityState === \"visible\")\n wakeLock = await navigator.wakeLock.request(\"screen\");\n isActive.value = !wakeLock.released;\n }\n if (document)\n useEventListener(document, \"visibilitychange\", onVisibilityChange, { passive: true });\n async function request(type) {\n if (!isSupported)\n return;\n wakeLock = await navigator.wakeLock.request(type);\n isActive.value = !wakeLock.released;\n }\n async function release() {\n if (!isSupported || !wakeLock)\n return;\n await wakeLock.release();\n isActive.value = !wakeLock.released;\n wakeLock = null;\n }\n return {\n isSupported,\n isActive,\n request,\n release\n };\n};\n\nconst useWebNotification = (defaultOptions = {}) => {\n const {\n window = defaultWindow\n } = defaultOptions;\n const isSupported = !!window && \"Notification\" in window;\n const notification = ref(null);\n const requestPermission = async () => {\n if (!isSupported)\n return;\n if (\"permission\" in Notification && Notification.permission !== \"denied\")\n await Notification.requestPermission();\n };\n const onClick = createEventHook();\n const onShow = createEventHook();\n const onError = createEventHook();\n const onClose = createEventHook();\n const show = async (overrides) => {\n if (!isSupported)\n return;\n await requestPermission();\n const options = Object.assign({}, defaultOptions, overrides);\n notification.value = new Notification(options.title || \"\", options);\n notification.value.onclick = (event) => onClick.trigger(event);\n notification.value.onshow = (event) => onShow.trigger(event);\n notification.value.onerror = (event) => onError.trigger(event);\n notification.value.onclose = (event) => onClose.trigger(event);\n return notification.value;\n };\n const close = () => {\n if (notification.value)\n notification.value.close();\n notification.value = null;\n };\n tryOnMounted(async () => {\n if (isSupported)\n await requestPermission();\n });\n tryOnScopeDispose(close);\n if (isSupported && window) {\n const document = window.document;\n useEventListener(document, \"visibilitychange\", (e) => {\n e.preventDefault();\n if (document.visibilityState === \"visible\") {\n close();\n }\n });\n }\n return {\n isSupported,\n notification,\n show,\n close,\n onClick,\n onShow,\n onError,\n onClose\n };\n};\n\nfunction resolveNestedOptions(options) {\n if (options === true)\n return {};\n return options;\n}\nfunction useWebSocket(url, options = {}) {\n const {\n onConnected,\n onDisconnected,\n onError,\n onMessage,\n immediate = true,\n autoClose = true,\n protocols = []\n } = options;\n const data = ref(null);\n const status = ref(\"CONNECTING\");\n const wsRef = ref();\n let heartbeatPause;\n let heartbeatResume;\n let explicitlyClosed = false;\n let retried = 0;\n let bufferedData = [];\n const close = (code = 1e3, reason) => {\n if (!wsRef.value)\n return;\n explicitlyClosed = true;\n heartbeatPause == null ? void 0 : heartbeatPause();\n wsRef.value.close(code, reason);\n };\n const _sendBuffer = () => {\n if (bufferedData.length && wsRef.value && status.value === \"OPEN\") {\n for (const buffer of bufferedData)\n wsRef.value.send(buffer);\n bufferedData = [];\n }\n };\n const send = (data2, useBuffer = true) => {\n if (!wsRef.value || status.value !== \"OPEN\") {\n if (useBuffer)\n bufferedData.push(data2);\n return false;\n }\n _sendBuffer();\n wsRef.value.send(data2);\n return true;\n };\n const _init = () => {\n const ws = new WebSocket(url, protocols);\n wsRef.value = ws;\n status.value = \"CONNECTING\";\n explicitlyClosed = false;\n ws.onopen = () => {\n status.value = \"OPEN\";\n onConnected == null ? void 0 : onConnected(ws);\n heartbeatResume == null ? void 0 : heartbeatResume();\n _sendBuffer();\n };\n ws.onclose = (ev) => {\n status.value = \"CLOSED\";\n wsRef.value = void 0;\n onDisconnected == null ? void 0 : onDisconnected(ws, ev);\n if (!explicitlyClosed && options.autoReconnect) {\n const {\n retries = -1,\n delay = 1e3,\n onFailed\n } = resolveNestedOptions(options.autoReconnect);\n retried += 1;\n if (retries < 0 || retried < retries)\n setTimeout(_init, delay);\n else\n onFailed == null ? void 0 : onFailed();\n }\n };\n ws.onerror = (e) => {\n onError == null ? void 0 : onError(ws, e);\n };\n ws.onmessage = (e) => {\n data.value = e.data;\n onMessage == null ? void 0 : onMessage(ws, e);\n };\n };\n if (options.heartbeat) {\n const {\n message = \"ping\",\n interval = 1e3\n } = resolveNestedOptions(options.heartbeat);\n const { pause, resume } = useIntervalFn(() => send(message, false), interval, { immediate: false });\n heartbeatPause = pause;\n heartbeatResume = resume;\n }\n if (immediate)\n _init();\n if (autoClose) {\n useEventListener(window, \"beforeunload\", () => close());\n tryOnScopeDispose(close);\n }\n const open = () => {\n close();\n retried = 0;\n _init();\n };\n return {\n data,\n status,\n close,\n send,\n open,\n ws: wsRef\n };\n}\n\nfunction useWebWorker(url, workerOptions, options = {}) {\n const {\n window = defaultWindow\n } = options;\n const data = ref(null);\n const worker = shallowRef();\n const post = function post2(val) {\n if (!worker.value)\n return;\n worker.value.postMessage(val);\n };\n const terminate = function terminate2() {\n if (!worker.value)\n return;\n worker.value.terminate();\n };\n if (window) {\n worker.value = new window.Worker(url, workerOptions);\n worker.value.onmessage = (e) => {\n data.value = e.data;\n };\n tryOnScopeDispose(() => {\n if (worker.value)\n worker.value.terminate();\n });\n }\n return {\n data,\n post,\n terminate,\n worker\n };\n}\n\nconst jobRunner = (userFunc) => (e) => {\n const userFuncArgs = e.data[0];\n return Promise.resolve(userFunc.apply(void 0, userFuncArgs)).then((result) => {\n postMessage([\"SUCCESS\", result]);\n }).catch((error) => {\n postMessage([\"ERROR\", error]);\n });\n};\n\nconst depsParser = (deps) => {\n if (deps.length === 0)\n return \"\";\n const depsString = deps.map((dep) => `'${dep}'`).toString();\n return `importScripts(${depsString})`;\n};\n\nconst createWorkerBlobUrl = (fn, deps) => {\n const blobCode = `${depsParser(deps)}; onmessage=(${jobRunner})(${fn})`;\n const blob = new Blob([blobCode], { type: \"text/javascript\" });\n const url = URL.createObjectURL(blob);\n return url;\n};\n\nconst useWebWorkerFn = (fn, options = {}) => {\n const {\n dependencies = [],\n timeout,\n window = defaultWindow\n } = options;\n const worker = ref();\n const workerStatus = ref(\"PENDING\");\n const promise = ref({});\n const timeoutId = ref();\n const workerTerminate = (status = \"PENDING\") => {\n if (worker.value && worker.value._url && window) {\n worker.value.terminate();\n URL.revokeObjectURL(worker.value._url);\n promise.value = {};\n worker.value = void 0;\n window.clearTimeout(timeoutId.value);\n workerStatus.value = status;\n }\n };\n workerTerminate();\n tryOnScopeDispose(workerTerminate);\n const generateWorker = () => {\n const blobUrl = createWorkerBlobUrl(fn, dependencies);\n const newWorker = new Worker(blobUrl);\n newWorker._url = blobUrl;\n newWorker.onmessage = (e) => {\n const { resolve = () => {\n }, reject = () => {\n } } = promise.value;\n const [status, result] = e.data;\n switch (status) {\n case \"SUCCESS\":\n resolve(result);\n workerTerminate(status);\n break;\n default:\n reject(result);\n workerTerminate(\"ERROR\");\n break;\n }\n };\n newWorker.onerror = (e) => {\n const { reject = () => {\n } } = promise.value;\n reject(e);\n workerTerminate(\"ERROR\");\n };\n if (timeout) {\n timeoutId.value = setTimeout(() => workerTerminate(\"TIMEOUT_EXPIRED\"), timeout);\n }\n return newWorker;\n };\n const callWorker = (...fnArgs) => new Promise((resolve, reject) => {\n promise.value = {\n resolve,\n reject\n };\n worker.value && worker.value.postMessage([[...fnArgs]]);\n workerStatus.value = \"RUNNING\";\n });\n const workerFn = (...fnArgs) => {\n if (workerStatus.value === \"RUNNING\") {\n console.error(\"[useWebWorkerFn] You can only run one instance of the worker at a time.\");\n return Promise.reject();\n }\n worker.value = generateWorker();\n return callWorker(...fnArgs);\n };\n return {\n workerFn,\n workerStatus,\n workerTerminate\n };\n};\n\nfunction useWindowFocus({ window = defaultWindow } = {}) {\n if (!window)\n return ref(false);\n const focused = ref(window.document.hasFocus());\n useEventListener(window, \"blur\", () => {\n focused.value = false;\n });\n useEventListener(window, \"focus\", () => {\n focused.value = true;\n });\n return focused;\n}\n\nfunction useWindowScroll({ window = defaultWindow } = {}) {\n if (!window) {\n return {\n x: ref(0),\n y: ref(0)\n };\n }\n const x = ref(window.pageXOffset);\n const y = ref(window.pageYOffset);\n useEventListener(\"scroll\", () => {\n x.value = window.pageXOffset;\n y.value = window.pageYOffset;\n }, {\n capture: false,\n passive: true\n });\n return { x, y };\n}\n\nfunction useWindowSize({ window = defaultWindow, initialWidth = Infinity, initialHeight = Infinity } = {}) {\n const width = ref(initialWidth);\n const height = ref(initialHeight);\n const update = () => {\n if (window) {\n width.value = window.innerWidth;\n height.value = window.innerHeight;\n }\n };\n update();\n tryOnMounted(update);\n useEventListener(\"resize\", update, { passive: true });\n return { width, height };\n}\n\nexport { DefaultMagicKeysAliasMap, StorageSerializers, SwipeDirection, TransitionPresets, asyncComputed, autoResetRef, breakpointsAntDesign, breakpointsBootstrapV5, breakpointsQuasar, breakpointsSematic, breakpointsTailwind, breakpointsVuetify, computedInject, createFetch, createUnrefFn, defaultDocument, defaultLocation, defaultNavigator, defaultWindow, getSSRHandler, onClickOutside, onKeyDown, onKeyPressed, onKeyStroke, onKeyUp, onLongPress, onStartTyping, setSSRHandler, templateRef, unrefElement, useActiveElement, useAsyncQueue, useAsyncState, useBase64, useBattery, useBreakpoints, useBroadcastChannel, useBrowserLocation, useCached, useClamp, useClipboard, useColorMode, useConfirmDialog, useCssVar, useCycleList, useDark, useDebouncedRefHistory, useDeviceMotion, useDeviceOrientation, useDevicePixelRatio, useDevicesList, useDisplayMedia, useDocumentVisibility, useDraggable, useElementBounding, useElementByPoint, useElementHover, useElementSize, useElementVisibility, useEventBus, useEventListener, useEventSource, useEyeDropper, useFavicon, useFetch, useFocus, useFocusWithin, useFps, useFullscreen, useGeolocation, useIdle, useInfiniteScroll, useIntersectionObserver, useKeyModifier, useLocalStorage, useMagicKeys, useManualRefHistory, useMediaControls, useMediaQuery, useMemoize, useMemory, useMounted, useMouse, useMouseInElement, useMousePressed, useMutationObserver, useNavigatorLanguage, useNetwork, useNow, useOffsetPagination, useOnline, usePageLeave, useParallax, usePermission, usePointer, usePointerSwipe, usePreferredColorScheme, usePreferredDark, usePreferredLanguages, useRafFn, useRefHistory, useResizeObserver, useScreenSafeArea, useScriptTag, useScroll, useScrollLock, useSessionStorage, useShare, useSpeechRecognition, useSpeechSynthesis, useStorage, useStorageAsync, useStyleTag, useSwipe, useTemplateRefsList, useTextSelection, useThrottledRefHistory, useTimeAgo, useTimestamp, useTitle, useTransition, useUrlSearchParams, useUserMedia, useVModel, useVModels, useVibrate, useVirtualList, useWakeLock, useWebNotification, useWebSocket, useWebWorker, useWebWorkerFn, useWindowFocus, useWindowScroll, useWindowSize };\n","<template>\n <el-button text @click=\"modelShow = true\" title=\"颜色\">\n <el-icon :size=\"20\">\n <color-wand-icon></color-wand-icon>\n </el-icon>\n </el-button>\n <el-dialog \n v-model=\"modelShow\" \n :show-close=\"false\" \n width=\"90%\"\n class=\"theme-color-dialog\"\n >\n <div class=\"go-system-color-setting\">\n <div class=\"header-row\">\n <h3 class=\"title\">主题颜色选择</h3>\n <el-icon :size=\"20\" class=\"go-cursor-pointer\" @click=\"modelShow = false\">\n <close-icon></close-icon>\n </el-icon>\n </div>\n <el-divider></el-divider>\n <div class=\"model-content\" ref=\"contentLeftRef\">\n <div class=\"content-left\" v-if=\"modelShow\">\n <color-list :designColor=\"designColorSplit\" @colorSelectHandle=\"colorSelectHandle\"></color-list>\n </div>\n <div class=\"content-right\">\n <div class=\"color-name-detail\">\n <span v-if=\"appThemeDetail\" class=\"color-name\">{{ appThemeDetail.name }}</span>\n <span v-else class=\"color-name\">中国色</span>\n <span\n v-if=\"appThemeDetail\"\n class=\"color-name-Pinyin\"\n >{{ appThemeDetail.pinyin.toUpperCase() }}</span>\n <div\n v-if=\"appThemeDetail\"\n class=\"select-color\"\n :style=\"{ backgroundColor: designStore.appTheme }\"\n ></div>\n </div>\n <img :src=\"themeColorLogo\" />\n </div>\n </div>\n <div class=\"model-footer\">\n 中国色列表来自于:\n <el-link href=\"http://zhongguose.com\" target=\"_blank\">http://zhongguose.com</el-link>\n </div>\n </div>\n </el-dialog>\n</template>\n\n<script lang=\"ts\" setup>\nimport { ref, computed, watch, toRefs } from 'vue'\nimport { useDesignStore } from '@core/store/modules/designStore/designStore'\nimport { AppThemeColorType } from '@core/store/modules/designStore/designStore.d'\nimport { icon } from '@core/plugins'\nimport themeColorLogo from '@core/assets/images/exception/theme-color.png'\nimport { loadAsyncComponent } from '@core/utils'\nimport { useScroll } from '@vueuse/core'\nimport designColor from '@core/settings/designColor.json'\n\nconst ColorList = loadAsyncComponent(() =>\n import('./components/ColorList.vue')\n)\nconst { ColorWandIcon, CloseIcon } = icon.ionicons5\n\nlet splitNumber = 50\n\nconst designStore = useDesignStore()\nconst modelShow = ref(false)\nconst contentLeftRef = ref<HTMLElement | null>(null)\nconst designColorSplit = ref(designColor.slice(0, splitNumber))\n\nconst { arrivedState } = useScroll(contentLeftRef, {\n offset: { bottom: 200 },\n})\nconst { bottom } = toRefs(arrivedState)\n\nconst appThemeDetail = computed(() => {\n return designStore.getAppThemeDetail\n})\n\nconst colorSelectHandle = (color: AppThemeColorType) => {\n designStore.setAppColor(color)\n}\n\nwatch(() => bottom.value, (newData: boolean) => {\n if (newData) {\n splitNumber = splitNumber + 50\n designColorSplit.value = designColor.slice(0, splitNumber)\n }\n})\n\nwatch(() => modelShow.value, (modelShow: boolean) => {\n if (!modelShow) {\n splitNumber = 50\n }\n})\n</script>\n\n<style lang=\"scss\" scoped>\n$height: 85vh;\n@include go(\"system-color-setting\") {\n position: relative;\n display: flex;\n flex-direction: column;\n width: 100%;\n height: $height;\n overflow: hidden;\n \n .header-row {\n display: flex;\n justify-content: space-between;\n align-items: center;\n }\n \n .title {\n margin: 0;\n }\n .model-content {\n flex: 1;\n height: calc(#{$height} - 40px - 48px - 36px);\n overflow: auto;\n /* 右侧 */\n .content-right {\n position: absolute;\n display: flex;\n align-items: center;\n justify-content: flex-end;\n width: 300px;\n height: 100%;\n right: 50px;\n top: 0px;\n .color-name-detail {\n display: flex;\n flex-direction: column;\n align-items: center;\n margin-right: 40px;\n .go-flex-items-center {\n flex-direction: column;\n }\n .select-color {\n margin-top: 20px;\n width: 100px;\n height: 20px;\n border-radius: 3px;\n background-image: url(\"@core/assets/images/exception/texture.png\");\n }\n .color-name {\n font-family: serif;\n font-size: 80px;\n color: var(--el-text-color-primary);\n margin: 0 auto;\n display: block;\n width: 110px;\n text-align: center;\n background-position: center top;\n background-repeat: no-repeat;\n }\n .color-name-Pinyin {\n text-align: center;\n font-family: Georgia;\n font-size: 16px;\n color: var(--el-text-color-secondary);\n }\n }\n }\n }\n .model-footer {\n z-index: 1;\n text-align: end;\n }\n}\n</style>\n\n<style lang=\"scss\">\n.theme-color-dialog {\n min-width: 1000px;\n \n .el-dialog__header {\n display: none;\n }\n \n .el-dialog__body {\n padding: 20px 25px;\n @extend .go-background-filter;\n border-radius: 15px;\n }\n}\n</style>\n","<template>\n <el-header class=\"go-header\" style=\"border-bottom: 1px solid var(--el-border-color);\">\n <header class=\"go-header-box\">\n <div class=\"header-item left\">\n <el-space>\n <slot name=\"left\"></slot>\n </el-space>\n </div>\n <div class=\"header-item center\">\n <slot name=\"center\"></slot>\n </div>\n <div class=\"header-item right\">\n <el-space>\n <slot name=\"ri-left\"> </slot>\n <go-lang-select></go-lang-select>\n <theme-color-select></theme-color-select>\n <go-theme-select></go-theme-select>\n <slot name=\"ri-right\"> </slot>\n </el-space>\n </div>\n </header>\n </el-header>\n</template>\n\n<script setup lang=\"ts\">\nimport { GoThemeSelect } from '@core/components/GoThemeSelect'\nimport { GoLangSelect } from '@core/components/GoLangSelect'\nimport { ThemeColorSelect } from '@core/components/Pages/ThemeColorSelect'\n</script>\n\n<style lang=\"scss\" scoped>\n@include go(header) {\n &-box {\n display: flex;\n justify-content: space-between;\n .header-item {\n display: flex;\n align-items: center;\n &.left {\n justify-content: start;\n }\n &.center {\n justify-content: center;\n }\n &.right {\n justify-content: end;\n }\n }\n height: $--header-height;\n padding: 0 20px 0 60px;\n }\n}\n</style>\n","<template>\n <layout-header>\n <template #left>\n <slot name=\"left\"></slot>\n </template>\n <template #center>\n <slot name=\"center\"></slot>\n </template>\n <template #ri-left>\n <slot name=\"ri-left\"></slot>\n </template>\n <template #ri-right>\n <slot name=\"ri-right\"></slot>\n </template>\n </layout-header>\n</template>\n<script setup lang=\"ts\">\nimport { LayoutHeader } from '@core/layout/components/LayoutHeader'\n</script>\n","import { ref, nextTick, toRaw } from 'vue'\nimport { useChartEditStore } from '@core/store/modules/chartEditStore/chartEditStore'\nimport { CreateComponentType, CreateComponentGroupType } from '@core/packages/index.d'\nimport { renderIcon, loadingError } from '@core/utils'\nimport { icon } from '@core/plugins'\nimport { MenuOptionsItemType } from './useContextMenu.hook.d'\nimport { MenuEnum } from '@core/enums/editPageEnum'\nimport cloneDeep from 'lodash/cloneDeep'\n\nconst {\n CopyIcon,\n CutIcon,\n ClipboardOutlineIcon,\n TrashIcon,\n ChevronDownIcon,\n ChevronUpIcon,\n LockOpenOutlineIcon,\n LockClosedOutlineIcon,\n EyeOutlineIcon,\n EyeOffOutlineIcon\n} = icon.ionicons5\nconst { UpToTopIcon, DownToBottomIcon, PaintBrushIcon, Carbon3DSoftwareIcon, Carbon3DCursorIcon } = icon.carbon\n\n/**\n * 分割线\n * @param {number} n > 2\n * @returns\n */\nexport const divider = (n: number = 3) => {\n return {\n type: 'divider',\n key: `d${n}`\n }\n}\n\n// * 默认单组件选项(使用函数返回以延迟获取store)\nexport const getDefaultOptions = (): MenuOptionsItemType[] => {\n const chartEditStore = useChartEditStore()\n return [\n {\n label: '锁定',\n key: MenuEnum.LOCK,\n icon: renderIcon(LockClosedOutlineIcon),\n fnHandle: chartEditStore.setLock\n },\n {\n label: '解锁',\n key: MenuEnum.UNLOCK,\n icon: renderIcon(LockOpenOutlineIcon),\n fnHandle: chartEditStore.setUnLock\n },\n {\n label: '隐藏',\n key: MenuEnum.HIDE,\n icon: renderIcon(EyeOffOutlineIcon),\n fnHandle: chartEditStore.setHide\n },\n {\n label: '显示',\n key: MenuEnum.SHOW,\n icon: renderIcon(EyeOutlineIcon),\n fnHandle: chartEditStore.setShow\n },\n {\n type: 'divider',\n key: 'd0'\n },\n {\n label: '复制',\n key: MenuEnum.COPY,\n icon: renderIcon(CopyIcon),\n fnHandle: chartEditStore.setCopy\n },\n {\n label: '剪切',\n key: MenuEnum.CUT,\n icon: renderIcon(CutIcon),\n fnHandle: chartEditStore.setCut\n },\n {\n label: '粘贴',\n key: MenuEnum.PARSE,\n icon: renderIcon(ClipboardOutlineIcon),\n fnHandle: chartEditStore.setParse\n },\n {\n type: 'divider',\n key: 'd1'\n },\n {\n label: '置顶',\n key: MenuEnum.TOP,\n icon: renderIcon(UpToTopIcon),\n fnHandle: chartEditStore.setTop\n },\n {\n label: '置底',\n key: MenuEnum.BOTTOM,\n icon: renderIcon(DownToBottomIcon),\n fnHandle: chartEditStore.setBottom\n },\n {\n label: '上移',\n key: MenuEnum.UP,\n icon: renderIcon(ChevronUpIcon),\n fnHandle: chartEditStore.setUp\n },\n {\n label: '下移',\n key: MenuEnum.DOWN,\n icon: renderIcon(ChevronDownIcon),\n fnHandle: chartEditStore.setDown\n },\n {\n type: 'divider',\n key: 'd2'\n },\n {\n label: '清空剪贴板',\n key: MenuEnum.CLEAR,\n icon: renderIcon(PaintBrushIcon),\n fnHandle: chartEditStore.setRecordChart\n },\n {\n label: '删除',\n key: MenuEnum.DELETE,\n icon: renderIcon(TrashIcon),\n fnHandle: chartEditStore.removeComponentList\n }\n ]\n}\n\n// * 默认多选组件选项(使用函数返回以延迟获取store)\nexport const getDefaultMultiSelectOptions = (): MenuOptionsItemType[] => {\n const chartEditStore = useChartEditStore()\n return [\n {\n label: '创建分组',\n key: MenuEnum.GROUP,\n icon: renderIcon(Carbon3DSoftwareIcon),\n fnHandle: chartEditStore.setGroup\n },\n {\n label: '解除分组',\n key: MenuEnum.UN_GROUP,\n icon: renderIcon(Carbon3DCursorIcon),\n fnHandle: chartEditStore.setUnGroup\n }\n ]\n}\n\n// * 无数据传递拥有的选项\nconst defaultNoItemKeys = [MenuEnum.PARSE, MenuEnum.CLEAR]\n\n/**\n * * 挑选选项\n * @param options\n * @param pickList\n * @returns\n */\nconst pickOption = (options: MenuOptionsItemType[], pickList?: MenuEnum[]) => {\n if (!pickList) return options\n const list: MenuOptionsItemType[] = []\n pickList.forEach(e => {\n list.push(...options.filter(op => op.key === e))\n })\n return list\n}\n\n/**\n * * 去除选项\n * @param options\n * @param hideList\n * @returns\n */\nconst hideOption = (options: MenuOptionsItemType[], hideList?: MenuEnum[]) => {\n if (!hideList) return options\n return options.filter((op: MenuOptionsItemType) => {\n return hideList.findIndex((e: MenuEnum) => e !== op.key) !== -1\n })\n}\n\n// * 右键内容\nconst menuOptions = ref<MenuOptionsItemType[]>([])\n\n// * 右键处理\nconst handleContextMenu = (\n e: MouseEvent,\n // 右键对象\n targetInstance?: CreateComponentType | CreateComponentGroupType,\n // 判断函数\n optionsHandle?: Function,\n // 隐藏选项列表\n hideOptionsList?: MenuEnum[],\n // 挑选选项列表\n pickOptionsList?: MenuEnum[]\n) => {\n e.stopPropagation()\n e.preventDefault()\n\n const chartEditStore = useChartEditStore()\n const defaultOptions = getDefaultOptions()\n const defaultMultiSelectOptions = getDefaultMultiSelectOptions()\n\n let target = e.target\n while (target instanceof SVGElement) {\n target = target.parentNode\n }\n\n chartEditStore.setTargetSelectChart(targetInstance && targetInstance.id)\n\n // 隐藏旧列表\n chartEditStore.setRightMenuShow(false)\n\n // * 多选默认选项\n if (chartEditStore.getTargetChart.selectId.length > 1) {\n menuOptions.value = defaultMultiSelectOptions\n } else {\n // * 单选默认选项\n menuOptions.value = defaultOptions\n }\n\n if (!targetInstance) {\n menuOptions.value = pickOption(toRaw(menuOptions.value), defaultNoItemKeys)\n }\n if (hideOptionsList) {\n menuOptions.value = hideOption([...defaultMultiSelectOptions, divider(), ...defaultOptions], hideOptionsList)\n }\n if (pickOptionsList) {\n menuOptions.value = pickOption([...defaultMultiSelectOptions, divider(), ...defaultOptions], pickOptionsList)\n }\n if (optionsHandle) {\n // 自定义函数能够拿到当前选项和所有选项\n menuOptions.value = optionsHandle(\n cloneDeep(toRaw(menuOptions.value)),\n [...defaultMultiSelectOptions, ...defaultOptions],\n targetInstance\n )\n }\n nextTick().then(() => {\n chartEditStore.setMousePosition(e.clientX, e.clientY)\n chartEditStore.setRightMenuShow(true)\n })\n}\n\n/**\n * * 右键hook\n * @param menuConfig\n * @returns\n */\nexport const useContextMenu = () => {\n const chartEditStore = useChartEditStore()\n const defaultOptions = getDefaultOptions()\n const defaultMultiSelectOptions = getDefaultMultiSelectOptions()\n \n // 设置默认项\n menuOptions.value = defaultOptions\n\n // * 失焦\n const onClickOutSide = () => {\n chartEditStore.setRightMenuShow(false)\n }\n\n // * 事件处理\n const handleMenuSelect = (key: string) => {\n chartEditStore.setRightMenuShow(false)\n const targetItem: MenuOptionsItemType[] = menuOptions.value.filter((e: MenuOptionsItemType) => e.key === key)\n\n menuOptions.value.forEach((e: MenuOptionsItemType) => {\n if (e.key === key) {\n if (e.fnHandle) {\n e.fnHandle()\n return\n }\n if (!targetItem) loadingError()\n }\n })\n }\n\n return {\n menuOptions,\n defaultOptions,\n defaultMultiSelectOptions,\n handleContextMenu,\n onClickOutSide,\n handleMenuSelect,\n mousePosition: chartEditStore.getMousePosition\n }\n}\n","<template>\n <!-- 工作台相关 -->\n <div class=\"go-chart\">\n <el-container class=\"chart-layout\">\n <el-header class=\"chart-header\" height=\"auto\">\n <layout-header-pro>\n <template #left>\n <slot name=\"left\">\n <header-left-btn></header-left-btn>\n </slot>\n </template>\n <template #center>\n <slot name=\"center\">\n <header-title></header-title>\n </slot>\n </template>\n <template #ri-left>\n <slot name=\"ri-left\">\n <header-right-btn></header-right-btn>\n </slot>\n </template>\n </layout-header-pro>\n </el-header>\n <el-main class=\"chart-main\">\n <content-charts></content-charts>\n <content-layers></content-layers>\n <content-configurations></content-configurations>\n </el-main>\n </el-container>\n </div>\n <!-- 右键 -->\n <div v-show=\"chartEditStore.getRightMenuShow\" ref=\"dropdownRef\" class=\"context-menu\"\n :style=\"{ left: mousePosition.x + 'px', top: mousePosition.y + 'px' }\" v-click-outside=\"onClickOutSide\">\n <el-menu @select=\"handleMenuSelect\">\n <template v-for=\"item in menuOptionsWithChildren\" :key=\"item.key\">\n <!-- 分割线 -->\n <el-divider v-if=\"item.type === 'divider'\" class=\"menu-divider\" />\n <!-- 普通菜单项 -->\n <el-menu-item v-else-if=\"!item.children || !item.children.length\" :index=\"item.key\">\n <el-icon v-if=\"item.icon\">\n <component :is=\"item.icon\" />\n </el-icon>\n <span>{{ item.label }}</span>\n </el-menu-item>\n <!-- 子菜单 -->\n <el-sub-menu v-else :index=\"item.key\">\n <template #title>\n <el-icon v-if=\"item.icon\">\n <component :is=\"item.icon\" />\n </el-icon>\n <span>{{ item.label }}</span>\n </template>\n <el-menu-item v-for=\"child in item.children || []\" :key=\"child.key\" :index=\"child.key\">\n <el-icon v-if=\"child.icon\">\n <component :is=\"child.icon\" />\n </el-icon>\n <span>{{ child.label }}</span>\n </el-menu-item>\n </el-sub-menu>\n </template>\n </el-menu>\n </div>\n <!-- 加载蒙层 -->\n <content-load></content-load>\n</template>\n\n<script setup lang=\"ts\">\nimport { computed, ref } from 'vue'\nimport { ClickOutside as vClickOutside } from 'element-plus'\nimport { loadAsyncComponent } from '@core/utils'\nimport { LayoutHeaderPro } from '@core/layout/components/LayoutHeaderPro'\nimport { useContextMenu } from './hooks/useContextMenu.hook'\nimport { useChartEditStore } from '@core/store/modules/chartEditStore/chartEditStore'\nimport { useChartHistoryStore } from '@core/store/modules/chartHistoryStore/chartHistoryStore'\nimport type { MenuOptionsItemType } from './hooks/useContextMenu.hook.d'\n\nconst chartHistoryStoreStore = useChartHistoryStore()\nconst chartEditStore = useChartEditStore()\n\n// 记录初始化\nchartHistoryStoreStore.canvasInit(chartEditStore.getEditCanvas)\n\nconst HeaderLeftBtn = loadAsyncComponent(() => import('./ContentHeader/headerLeftBtn/index.vue'))\nconst HeaderRightBtn = loadAsyncComponent(() => import('./ContentHeader/headerRightBtn/index.vue'))\nconst HeaderTitle = loadAsyncComponent(() => import('./ContentHeader/headerTitle/index.vue'))\nconst ContentLayers = loadAsyncComponent(() => import('./ContentLayers/index.vue'))\nconst ContentCharts = loadAsyncComponent(() => import('./ContentCharts/index.vue'))\nconst ContentEdit = loadAsyncComponent(() => import('./ContentEdit/index.vue'))\nconst ContentConfigurations = loadAsyncComponent(() => import('./ContentConfigurations/index.vue'))\nconst ContentLoad = loadAsyncComponent(() => import('./ContentLoad/index.vue'))\n\n// 右键\nconst {\n menuOptions,\n onClickOutSide,\n mousePosition,\n handleMenuSelect\n} = useContextMenu()\n\nconst dropdownRef = ref()\n\ntype MenuOptionsItemWithChildren = MenuOptionsItemType & {\n children?: MenuOptionsItemType[]\n}\n\nconst menuOptionsWithChildren = computed<MenuOptionsItemWithChildren[]>(() => {\n return ((menuOptions.value ?? []) as MenuOptionsItemWithChildren[]).filter(\n item => item && typeof item === 'object'\n )\n})\n</script>\n\n<style lang=\"scss\" scoped>\n@include go(\"chart\") {\n height: 100vh;\n width: 100vw;\n overflow: hidden;\n @include background-image(\"background-image\");\n}\n\n.chart-layout {\n height: 100%;\n flex-direction: column;\n}\n\n.chart-header {\n padding: 0;\n}\n\n.chart-main {\n padding: 0;\n overflow: hidden;\n display: flex;\n}\n\n.context-menu {\n position: fixed;\n z-index: 9999;\n background: var(--el-bg-color);\n border: 1px solid var(--el-border-color);\n border-radius: 4px;\n box-shadow: var(--el-box-shadow-light);\n padding: 4px 0;\n\n .menu-divider {\n margin: 4px 8px;\n }\n\n :deep(.el-menu) {\n border: none;\n background: transparent;\n\n .el-menu-item,\n .el-sub-menu__title {\n height: 32px;\n line-height: 32px;\n font-size: 12px;\n padding: 0 16px;\n\n .el-icon {\n margin-right: 8px;\n }\n }\n\n .el-menu-item:hover,\n .el-sub-menu__title:hover {\n background-color: var(--el-fill-color-light);\n }\n }\n}\n</style>\n","export enum ChartModeEnum {\n SINGLE = 'single',\n DOUBLE = 'double'\n}\n\nexport enum LayerModeEnum {\n THUMBNAIL = 'thumbnail',\n TEXT = 'text'\n}\n\nexport enum ChartLayoutStoreEnum {\n LAYERS = 'layers',\n CHARTS = 'charts',\n DETAILS = 'details',\n Chart_TYPE = 'chartType',\n LAYER_TYPE = 'layerType',\n PERCENTAGE = 'percentage',\n RE_POSITION_CANVAS = 'rePositionCanvas'\n}\n\nexport interface ChartLayoutType {\n // 图层控制\n [ChartLayoutStoreEnum.LAYERS]: boolean\n // 图表组件\n [ChartLayoutStoreEnum.CHARTS]: boolean\n // 详情设置\n [ChartLayoutStoreEnum.DETAILS]: boolean\n // 组件展示方式\n [ChartLayoutStoreEnum.Chart_TYPE]: ChartModeEnum\n // 层级展示方式\n [ChartLayoutStoreEnum.LAYER_TYPE]: LayerModeEnum\n // 当前正在加载的数量\n [ChartLayoutStoreEnum.PERCENTAGE]: number\n // 是否重置当前画布位置\n [ChartLayoutStoreEnum.RE_POSITION_CANVAS]: boolean\n}\n","import { defineStore } from 'pinia'\r\nimport { ChartLayoutType, LayerModeEnum, ChartModeEnum } from './chartLayoutStore.d'\r\nimport { setLocalStorage, getLocalStorage } from '@core/utils'\r\nimport { StorageEnum } from '@core/enums/storageEnum'\r\nimport { useChartEditStore } from '@core/store/modules/chartEditStore/chartEditStore'\r\n\r\n// 移除模块级别的 store 调用,在需要时才获取\r\n// const chartEditStore = useChartEditStore()\r\n\r\nconst { GO_CHART_LAYOUT_STORE } = StorageEnum\r\n\r\nconst storageChartLayout: Partial<ChartLayoutType> = getLocalStorage(GO_CHART_LAYOUT_STORE)\r\n\r\n// 编辑区域布局和静态设置\r\nexport const useChartLayoutStore = defineStore({\r\n id: 'useChartLayoutStore',\r\n state: (): ChartLayoutType => {\r\n // 合并存储的配置,但强制 details 为 false(默认展开)\r\n const baseState = {\r\n // 图层控制\r\n layers: true,\r\n // 图表组件\r\n charts: true,\r\n // 详情设置(收缩为true)- 默认展开\r\n details: false,\r\n // 组件列表展示类型(默认单列)\r\n chartType: ChartModeEnum.SINGLE,\r\n // 图层类型(默认图片)\r\n layerType: LayerModeEnum.THUMBNAIL,\r\n // 当前加载数量\r\n percentage: 0,\r\n // 是否重置当前画布位置\r\n rePositionCanvas: false,\r\n // 合并存储的配置\r\n ...storageChartLayout,\r\n }\r\n // 强制 details 为 false(默认展开)\r\n baseState.details = false\r\n return baseState\r\n },\r\n getters: {\r\n getLayers(): boolean {\r\n return this.layers\r\n },\r\n getCharts(): boolean {\r\n return this.charts\r\n },\r\n getDetails(): boolean {\r\n return this.details\r\n },\r\n getChartType(): ChartModeEnum {\r\n return this.chartType\r\n },\r\n getLayerType(): LayerModeEnum {\r\n return this.layerType\r\n },\r\n getPercentage(): number {\r\n return this.percentage\r\n },\r\n getRePositionCanvas(): boolean {\r\n return this.rePositionCanvas\r\n }\r\n },\r\n actions: {\r\n setItem<T extends keyof ChartLayoutType, K extends ChartLayoutType[T]>(\r\n key: T,\r\n value: K,\r\n computedScale = true\r\n ): void {\r\n this.$patch(state => {\r\n state[key] = value\r\n })\r\n // 存储本地\r\n setLocalStorage(GO_CHART_LAYOUT_STORE, this.$state)\r\n // 这里需要标记重置画布位置\r\n this.rePositionCanvas = true;\r\n // 重新计算拖拽区域缩放比例\r\n if (computedScale) {\r\n setTimeout(() => {\r\n const chartEditStore = useChartEditStore()\r\n chartEditStore.computedScale()\r\n }, 500)\r\n }\r\n },\r\n setItemUnHandle<T extends keyof ChartLayoutType, K extends ChartLayoutType[T]>(key: T, value: K): void {\r\n this.$patch(state => {\r\n state[key] = value\r\n })\r\n }\r\n }\r\n})\r\n","import { getUUID } from '@core/utils'\nimport { useChartEditStore } from '@core/store/modules/chartEditStore/chartEditStore'\nimport { ChartEditStoreEnum, ChartEditStorage } from '@core/store/modules/chartEditStore/chartEditStore.d'\nimport { useChartHistoryStore } from '@core/store/modules/chartHistoryStore/chartHistoryStore'\nimport { useChartLayoutStore } from '@core/store/modules/chartLayoutStore/chartLayoutStore'\nimport { ChartLayoutStoreEnum } from '@core/store/modules/chartLayoutStore/chartLayoutStore.d'\nimport { ensureRegisteredComponent, createComponent } from '@core/packages/index'\nimport { CreateComponentType, CreateComponentGroupType, ConfigType } from '@core/packages/index.d'\nimport { BaseEvent, EventLife } from '@core/enums/eventEnum'\nimport { PublicGroupConfigClass } from '@core/packages/public/publicConfig'\nimport { MissingComponentConfig } from '@core/packages/components/Informations/Mores/MissingComponent'\nimport merge from 'lodash/merge'\n\n/**\n * * 画布-版本升级对旧数据无法兼容的补丁\n * @param object\n */\nconst canvasVersionUpdatePolyfill = (object: any) => {\n return object\n}\n\n/**\n * * 组件-版本升级对旧数据无法兼容的补丁\n * @param newObject\n * @param sources\n */\nconst componentVersionUpdatePolyfill = (newObject: any, sources: any) => {\n try {\n // 判断是否是组件\n if (sources.id) {\n // 处理事件补丁\n const hasVnodeBeforeMount = 'vnodeBeforeMount' in sources.events\n const hasVnodeMounted = 'vnodeMounted' in sources.events\n\n if (hasVnodeBeforeMount) {\n newObject.events.advancedEvents.vnodeBeforeMount = sources?.events.vnodeBeforeMount\n }\n if (hasVnodeMounted) {\n newObject.events.advancedEvents.vnodeMounted = sources?.events.vnodeMounted\n }\n if (hasVnodeBeforeMount || hasVnodeMounted) {\n sources.events = {\n baseEvent: {\n [BaseEvent.ON_CLICK]: undefined,\n [BaseEvent.ON_DBL_CLICK]: undefined,\n [BaseEvent.ON_MOUSE_ENTER]: undefined,\n [BaseEvent.ON_MOUSE_LEAVE]: undefined\n },\n advancedEvents: {\n [EventLife.VNODE_MOUNTED]: undefined,\n [EventLife.VNODE_BEFORE_MOUNT]: undefined\n },\n interactEvents: []\n }\n }\n return newObject\n }\n } catch (error) {\n return newObject\n }\n}\n\n/**\n * * 合并处理\n * @param newObject 新的模板数据\n * @param sources 新拿到的数据\n * @returns object\n */\nconst componentMerge = (newObject: any, sources: any, notComponent = false) => {\n // 处理组件补丁\n componentVersionUpdatePolyfill(newObject, sources)\n\n // 非组件不处理\n if (notComponent) return merge(newObject, sources)\n // 组件排除 newObject\n const option = sources.option\n if (!option) return merge(newObject, sources)\n\n // 为 undefined 的 sources 来源对象属性将被跳过详见 https://www.lodashjs.com/docs/lodash.merge\n sources.option = undefined\n if (option) {\n return {\n ...merge(newObject, sources),\n option: option\n }\n }\n}\n\nconst buildMissingComponentInstance = async (\n targetComponent: CreateComponentType,\n error: unknown\n) => {\n ensureRegisteredComponent(MissingComponentConfig)\n const missingComponent = await createComponent(MissingComponentConfig)\n const errorMessage = error instanceof Error ? error.message : String(error)\n const originalConfig = { ...(targetComponent.chartConfig || {}) } as Partial<ConfigType>\n\n missingComponent.chartConfig.title = originalConfig.title\n ? `${originalConfig.title}(缺失)`\n : MissingComponentConfig.title\n\n return componentMerge(missingComponent, {\n ...targetComponent,\n key: missingComponent.key,\n chartConfig: missingComponent.chartConfig,\n option: {\n ...missingComponent.option,\n title: '组件缺失',\n message: '当前运行环境未注册该组件,已使用占位组件替代。',\n originalConfig,\n errorMessage,\n suggestion: '请检查扩展包是否已安装并完成注册。'\n }\n })\n}\n\n// 请求处理\nexport const useSync = () => {\n const chartEditStore = useChartEditStore()\n const chartHistoryStore = useChartHistoryStore()\n const chartLayoutStore = useChartLayoutStore()\n /**\n * * 组件动态注册\n * @param projectData 项目数据\n * @param isReplace 是否替换数据\n * @returns\n */\n const updateComponent = async (projectData: ChartEditStorage, isReplace = false, changeId = false) => {\n if (isReplace) {\n // 清除列表\n chartEditStore.componentList = []\n // 清除历史记录\n chartHistoryStore.clearBackStack()\n chartHistoryStore.clearForwardStack()\n }\n // 画布补丁处理\n projectData.editCanvasConfig = canvasVersionUpdatePolyfill(projectData.editCanvasConfig)\n\n // 列表组件注册\n projectData.componentList.forEach(async (e: CreateComponentType | CreateComponentGroupType) => {\n const intComponent = (target: CreateComponentType) => {\n ensureRegisteredComponent(target.chartConfig)\n }\n\n if (e.isGroup) {\n (e as CreateComponentGroupType).groupList.forEach(groupItem => {\n intComponent(groupItem)\n })\n } else {\n intComponent(e as CreateComponentType)\n }\n })\n\n // 创建函数-重新创建是为了处理类种方法消失的问题\n const create = async (\n _componentInstance: CreateComponentType,\n callBack?: (componentInstance: CreateComponentType) => void\n ) => {\n let newComponent: CreateComponentType\n let mergedComponent: CreateComponentType\n try {\n // 补充 class 上的方法\n newComponent = await createComponent(_componentInstance.chartConfig)\n if (_componentInstance.chartConfig.redirectComponent) {\n _componentInstance.chartConfig.dataset && (newComponent.option.dataset = _componentInstance.chartConfig.dataset)\n newComponent.chartConfig.title = _componentInstance.chartConfig.title\n newComponent.chartConfig.chartFrame = _componentInstance.chartConfig.chartFrame\n }\n mergedComponent = componentMerge(newComponent, _componentInstance)\n } catch (error) {\n console.error('[hgdataview] create component failed while sync project', _componentInstance.chartConfig, error)\n mergedComponent = await buildMissingComponentInstance(_componentInstance, error)\n }\n\n if (callBack) {\n if (changeId) {\n callBack(componentMerge(mergedComponent, { ...mergedComponent, id: getUUID() }))\n } else {\n callBack(mergedComponent)\n }\n } else {\n if (changeId) {\n chartEditStore.addComponentList(\n componentMerge(mergedComponent, { ...mergedComponent, id: getUUID() }),\n false,\n true\n )\n } else {\n chartEditStore.addComponentList(mergedComponent, false, true)\n }\n }\n }\n\n // 数据赋值\n for (const key in projectData) {\n // 组件\n if (key === ChartEditStoreEnum.COMPONENT_LIST) {\n let loadIndex = 0\n const listLength = projectData[key].length\n for (const comItem of projectData[key]) {\n // 设置加载数量\n let percentage = parseInt((parseFloat(`${++loadIndex / listLength}`) * 100).toString())\n chartLayoutStore.setItemUnHandle(ChartLayoutStoreEnum.PERCENTAGE, percentage)\n // 判断类型\n if (comItem.isGroup) {\n // 创建分组\n let groupClass = new PublicGroupConfigClass()\n if (changeId) {\n groupClass = componentMerge(groupClass, { ...comItem, id: getUUID() })\n } else {\n groupClass = componentMerge(groupClass, comItem)\n }\n\n // 异步注册子应用\n const targetList: CreateComponentType[] = []\n for (const groupItem of (comItem as CreateComponentGroupType).groupList) {\n await create(groupItem, e => {\n targetList.push(e)\n })\n }\n groupClass.groupList = targetList\n\n // 分组插入到列表\n chartEditStore.addComponentList(groupClass, false, true)\n } else {\n await create(comItem as CreateComponentType)\n }\n if (percentage === 100) {\n // 清除历史记录\n chartHistoryStore.clearBackStack()\n chartHistoryStore.clearForwardStack()\n }\n }\n } else if (key === ChartEditStoreEnum.EDIT_CANVAS_CONFIG || key === ChartEditStoreEnum.REQUEST_GLOBAL_CONFIG) {\n componentMerge(chartEditStore[key], projectData[key], true)\n }\n }\n\n // 清除数量\n chartLayoutStore.setItemUnHandle(ChartLayoutStoreEnum.PERCENTAGE, 0)\n }\n\n return {\n updateComponent\n }\n}\n","<template>\n <div ref=\"rootRef\" class=\"go-view-editor-wrapper hgdataview-root\" :class=\"{ dark: resolvedTheme === 'dark' }\"\n :data-theme=\"resolvedTheme\" :style=\"wrapperStyle\">\n <chart-home>\n <!-- 传递顶部工具栏插槽给 ChartHome -->\n <template #left>\n <slot name=\"header-left\">\n <!-- 默认左侧内容 -->\n </slot>\n </template>\n\n <template #center>\n <slot name=\"header-center\">\n <!-- 默认中间内容 -->\n </slot>\n </template>\n\n <template #ri-left>\n <slot name=\"header-right\">\n </slot>\n </template>\n </chart-home>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { computed, onBeforeUnmount, onMounted, ref, watch, nextTick, toRaw } from 'vue'\nimport ChartHome from '@core/views/chart/index.vue'\nimport { useChartEditStore } from '@core/store/modules/chartEditStore/chartEditStore'\nimport { useDesignStore } from '@core/store/modules/designStore/designStore'\nimport { useSync } from '@core/views/chart/hooks/useSync.hook'\nimport { registerHgDataViewThemeRoot, unregisterHgDataViewThemeRoot } from '@core/utils/style'\nimport { ThemeEnum } from '@core/enums/styleEnum'\nimport html2canvas from 'html2canvas'\n\ninterface Props {\n width?: string | number\n height?: string | number\n /**\n * 主题控制:\n * - 'dark' | 'light':由外部显式指定\n * - 'auto':自动跟随宿主 documentElement 的 data-theme / dark class\n */\n theme?: 'light' | 'dark' | 'auto'\n modelValue?: any // v-model 绑定项目数据\n}\n\ninterface Emits {\n (e: 'update:modelValue', data: any): void\n (e: 'save', data: any): void\n (e: 'change', data: any): void\n}\n\nconst props = withDefaults(defineProps<Props>(), {\n width: '100%',\n height: '100vh',\n theme: 'auto'\n})\n\nconst emit = defineEmits<Emits>()\n\nconst rootRef = ref<HTMLElement | null>(null)\n\nconst chartEditStore = useChartEditStore()\nconst designStore = useDesignStore()\nconst { updateComponent } = useSync()\nconst syncingProjectData = ref(false)\nconst lastProjectDataJson = ref('')\n\nconst getHostTheme = (): 'dark' | 'light' => {\n const e = window.document.documentElement\n const t = e.getAttribute('data-theme')\n if (t === 'dark' || t === 'light') return t\n return e.classList.contains('dark') ? 'dark' : 'light'\n}\n\nconst resolvedTheme = ref<'dark' | 'light'>(props.theme === 'auto' ? getHostTheme() : props.theme)\n\nlet hostThemeObserver: MutationObserver | null = null\nconst setupHostThemeObserver = () => {\n if (hostThemeObserver) return\n hostThemeObserver = new MutationObserver(() => {\n if (props.theme !== 'auto') return\n resolvedTheme.value = getHostTheme()\n })\n hostThemeObserver.observe(window.document.documentElement, {\n attributes: true,\n attributeFilter: ['data-theme', 'class']\n })\n}\n\nconst teardownHostThemeObserver = () => {\n hostThemeObserver?.disconnect()\n hostThemeObserver = null\n}\n\n// 容器样式\nconst wrapperStyle = computed(() => ({\n width: typeof props.width === 'number' ? `${props.width}px` : props.width,\n height: typeof props.height === 'number' ? `${props.height}px` : props.height,\n '--go-view-height': typeof props.height === 'number' ? `${props.height}px` : props.height\n}))\n\n// 同步主题到 designStore\nconst syncThemeToStore = (theme: 'dark' | 'light') => {\n const isDark = theme === 'dark'\n // 直接修改 store 属性以确保响应式更新\n designStore.darkTheme = isDark\n designStore.themeName = isDark ? ThemeEnum.DARK : ThemeEnum.LIGHT\n}\n\n// 监听主题变化(外部显式传入 or auto)\nwatch(\n () => props.theme,\n (newTheme) => {\n if (newTheme === 'auto') {\n resolvedTheme.value = getHostTheme()\n setupHostThemeObserver()\n return\n }\n teardownHostThemeObserver()\n resolvedTheme.value = newTheme\n },\n { immediate: true }\n)\n\n// 主题变更同步到 store(用于内部逻辑读取)\nwatch(\n () => resolvedTheme.value,\n (t) => {\n syncThemeToStore(t)\n },\n { immediate: true }\n)\n\nconst serializeProjectData = (data: any) => JSON.stringify({\n config: data?.config ?? {},\n components: data?.components ?? [],\n requestGlobalConfig: data?.requestGlobalConfig ?? {}\n})\n\n// 获取项目数据\nconst getProjectData = () => ({\n config: chartEditStore.getEditCanvasConfig,\n components: chartEditStore.getComponentList,\n requestGlobalConfig: chartEditStore.getRequestGlobalConfig\n})\n\n// 加载项目数据\nconst loadProjectData = async (data: any) => {\n if (!data) return\n\n const nextProjectData = {\n config: data?.config ?? {},\n components: Array.isArray(data?.components) ? data.components : [],\n requestGlobalConfig: data?.requestGlobalConfig ?? {}\n }\n const nextProjectDataJson = serializeProjectData(nextProjectData)\n\n if (nextProjectDataJson === lastProjectDataJson.value) return\n\n syncingProjectData.value = true\n try {\n await updateComponent(\n {\n editCanvasConfig: nextProjectData.config,\n componentList: nextProjectData.components,\n requestGlobalConfig: nextProjectData.requestGlobalConfig\n } as any,\n true\n )\n chartEditStore.setTargetSelectChart(undefined)\n lastProjectDataJson.value = serializeProjectData(getProjectData())\n } finally {\n syncingProjectData.value = false\n }\n}\n\n// 监听数据变化\nwatch(\n () => props.modelValue,\n async (newData) => {\n if (newData) {\n await loadProjectData(newData)\n }\n },\n { immediate: true, deep: true }\n)\n\n// 监听store变化,触发事件\nwatch(\n () => [chartEditStore.getEditCanvasConfig, chartEditStore.getComponentList],\n () => {\n const projectData = getProjectData()\n const projectDataJson = serializeProjectData(projectData)\n if (syncingProjectData.value || projectDataJson === lastProjectDataJson.value) return\n lastProjectDataJson.value = projectDataJson\n emit('update:modelValue', projectData)\n emit('change', projectData)\n },\n { deep: true }\n)\n\n// 触发画布重新计算尺寸\nconst triggerCanvasResize = () => {\n // 触发 window resize 事件,让 EditRule 组件重新计算尺寸\n window.dispatchEvent(new Event('resize'))\n}\n\n// 初始化\nonMounted(() => {\n if (rootRef.value) {\n registerHgDataViewThemeRoot(rootRef.value)\n }\n\n if (props.theme === 'auto') {\n setupHostThemeObserver()\n }\n\n // 延迟触发 resize,确保 CSS 样式已经生效\n // 使用多次延迟确保在各种情况下都能正确计算\n nextTick(() => {\n triggerCanvasResize()\n setTimeout(() => {\n triggerCanvasResize()\n }, 100)\n setTimeout(() => {\n triggerCanvasResize()\n }, 300)\n })\n})\n\nonBeforeUnmount(() => {\n teardownHostThemeObserver()\n if (rootRef.value) {\n unregisterHgDataViewThemeRoot(rootRef.value)\n }\n})\n\nconst getCoverImage = async () => {\n const range = document.querySelector('.go-edit-range') as HTMLElement | null\n if (!range) return ''\n\n const scaleTemp = chartEditStore.getEditCanvas.scale\n try {\n chartEditStore.setTargetSelectChart(undefined)\n chartEditStore.setScale(1, true)\n await nextTick()\n\n const canvas = await html2canvas(range, {\n backgroundColor: null,\n allowTaint: true,\n useCORS: true\n })\n return canvas.toDataURL('image/png')\n } finally {\n chartEditStore.setScale(scaleTemp, true)\n }\n}\n\n// 暴露给父组件的方法\ndefineExpose({\n // 获取项目数据\n getProjectData,\n // 设置项目数据\n setProjectData: loadProjectData,\n // 清空画布\n clearCanvas: () => {\n chartEditStore.componentList = []\n },\n // 保存项目\n save: () => {\n const data = getProjectData()\n emit('save', data)\n return data\n },\n getCoverImage\n})\n</script>\n\n<style scoped>\n.go-view-editor-wrapper {\n position: relative;\n overflow: hidden;\n width: 100%;\n height: 100%;\n}\n\n/* 覆盖内部组件的 100vh 为容器高度 */\n.go-view-editor-wrapper :deep(.go-chart) {\n height: 100% !important;\n width: 100% !important;\n position: relative !important;\n}\n\n\n.go-view-editor-wrapper :deep(.go-content-box .content) {\n height: 100% !important;\n position: relative !important;\n}\n\n.go-view-editor-wrapper :deep(.go-content-box .content-height-show-top-bottom) {\n height: calc(100% - 40px) !important;\n}\n\n.go-view-editor-wrapper :deep(.go-content-box .content-height-show-both) {\n height: calc(100% - 80px) !important;\n}\n\n.go-view-editor-wrapper :deep(.go-content-box.bg-depth1 > .content),\n.go-view-editor-wrapper :deep(.go-content-box.bg-depth1 > .content.content-height-show-top-bottom) {\n height: calc(100% - 40px) !important;\n}\n\n.go-view-editor-wrapper :deep(.go-content-charts .menu-width-box) {\n height: calc(100% - 40px) !important;\n}\n\n.go-view-editor-wrapper :deep(.layout-container) {\n height: 100% !important;\n position: relative !important;\n}\n\n.go-view-editor-wrapper :deep(.chart-layout) {\n height: 100% !important;\n position: relative !important;\n}\n\n/* 修复底部栏位置 */\n.go-view-editor-wrapper :deep(.go-content-box .bottom) {\n position: absolute;\n bottom: 0;\n left: 0;\n right: 0;\n z-index: 10;\n}\n\n/* 修复画布区域 - 关键修复 */\n.go-view-editor-wrapper :deep(#go-chart-edit-layout) {\n height: 100% !important;\n width: 100% !important;\n min-width: 0 !important;\n position: relative !important;\n flex: 1 !important;\n}\n\n.go-view-editor-wrapper :deep(#go-chart-edit-layout > .content),\n.go-view-editor-wrapper :deep(#go-chart-edit-layout > .content.content-height-show-top-bottom) {\n height: calc(100% - 40px) !important;\n width: 100% !important;\n position: relative !important;\n overflow: visible !important;\n}\n\n.go-view-editor-wrapper :deep(#go-chart-edit-content) {\n position: relative !important;\n /* height: 100% !important; */\n /* width: 100% !important; */\n}\n\n/* 修复标尺和画布容器 - 关键修复 */\n.go-view-editor-wrapper :deep(.go-sketch-rule) {\n position: relative !important;\n width: 100% !important;\n height: 100% !important;\n overflow: hidden !important;\n}\n\n/* 确保 edit-screens 正确显示 */\n.go-view-editor-wrapper :deep(.edit-screens) {\n position: absolute !important;\n top: 0 !important;\n left: 0 !important;\n width: 100% !important;\n height: 100% !important;\n}\n\n/* 修复中间编辑区域 flex 布局 */\n.go-view-editor-wrapper :deep(.go-content-edit) {\n flex: 1 !important;\n width: 100% !important;\n min-width: 0 !important;\n height: 100% !important;\n position: relative !important;\n display: flex !important;\n flex-direction: column !important;\n}\n\n/* 确保 edit-content-box 正确显示 */\n.go-view-editor-wrapper :deep(.edit-content-box) {\n flex: 1 !important;\n height: 100% !important;\n position: relative !important;\n}\n\n/* 修复 chart-main 高度 - 关键修复 */\n.go-view-editor-wrapper :deep(.chart-main) {\n height: calc(100% - 60px) !important;\n flex: 1 !important;\n overflow: hidden !important;\n}\n\n/* 修复 layout-main 高度 - 关键修复 */\n.go-view-editor-wrapper :deep(.layout-main) {\n height: 100% !important;\n flex: 1 !important;\n overflow: hidden !important;\n}\n\n/* 修复 el-main 默认样式 */\n.go-view-editor-wrapper :deep(.el-main) {\n overflow: hidden !important;\n}\n</style>\n\r\n","import { PickCreateComponentType } from '@core/packages/index.d'\nimport { EditCanvasConfigType } from '@core/store/modules/chartEditStore/chartEditStore.d'\n\ntype AttrType = PickCreateComponentType<'attr'>\ntype StatusType = PickCreateComponentType<'status'>\ntype PreviewConfig = PickCreateComponentType<'preview'>\n\n// 设置位置\nexport const getComponentAttrStyle = (attr: AttrType, index: number) => {\n const componentStyle = {\n zIndex: index + 1,\n left: `${attr.x}px`,\n top: `${attr.y}px`\n }\n return componentStyle\n}\n\n// 设置大小\nexport const getSizeStyle = (attr: AttrType, scale?: number) => {\n return {\n width: `${scale ? scale * attr.w : attr.w}px`,\n height: `${scale ? scale * attr.h : attr.h}px`\n }\n}\n\n// 设置状态样式\nexport const getStatusStyle = (attr: StatusType) => {\n return {\n display: attr.hide ? 'none' : 'block'\n }\n}\n\n// 设置预览配置样式\nexport const getPreviewConfigStyle = (previewConfig: PreviewConfig) => {\n const previewStyle: Partial<CSSStyleDeclaration> = {}\n if (previewConfig) {\n if (previewConfig.overFlowHidden) {\n previewStyle.overflow = 'hidden'\n }\n }\n return previewStyle\n}\n\n// 全局样式\nexport const getEditCanvasConfigStyle = (canvas: EditCanvasConfigType) => {\n // 背景\n const computedBackground = canvas.selectColor\n ? { background: canvas.background }\n : {\n background: `url(${canvas.backgroundImage}) center center / cover no-repeat !important`\n }\n return {\n position: 'relative' as const,\n width: canvas.width ? `${canvas.width || 100}px` : '100%',\n height: canvas.height ? `${canvas.height}px` : '100%',\n ...computedBackground\n }\n}\n","import { getSessionStorage } from '@core/utils'\nimport { StorageEnum } from '@core/enums/storageEnum'\nimport { ChartEditStorage } from '@core/store/modules/chartEditStore/chartEditStore.d'\nimport { useChartEditStore } from '@core/store/modules/chartEditStore/chartEditStore'\n\n// 移除模块级别的 store 调用,在需要时才获取\n// const chartEditStore = useChartEditStore()\n\nexport interface ChartEditStorageType extends ChartEditStorage {\n id: string\n}\n\n// 根据路由 id 获取存储数据的信息\nexport const getSessionStorageInfo = () => {\n const urlHash = document.location.hash\n const toPathArray = urlHash.split('/')\n const id = toPathArray && toPathArray[toPathArray.length - 1]\n\n const storageList: ChartEditStorageType[] = getSessionStorage(\n StorageEnum.GO_CHART_STORAGE_LIST\n )\n\n if (storageList) {\n for (let i = 0; i < storageList.length; i++) {\n if (id.toString() === storageList[i]['id']) {\n const { editCanvasConfig, requestGlobalConfig, componentList } = storageList[i]\n const chartEditStore = useChartEditStore()\n chartEditStore.editCanvasConfig = editCanvasConfig\n chartEditStore.requestGlobalConfig = requestGlobalConfig\n chartEditStore.componentList = componentList\n return storageList[i]\n }\n }\n }\n}","// 处理键盘记录\r\nexport const keyRecordHandle = () => {\r\n // 默认赋值\r\n window.$KeyboardActive = {\r\n ctrl: false,\r\n space: false\r\n }\r\n\r\n document.onkeydown = (e: KeyboardEvent) => {\r\n const { keyCode } = e\r\n if (keyCode == 32 && e.target == document.body) e.preventDefault()\r\n\r\n if ([17, 32].includes(keyCode) && window.$KeyboardActive) {\r\n switch (keyCode) {\r\n case 17:\r\n window.$KeyboardActive.ctrl = true\r\n break\r\n case 32:\r\n window.$KeyboardActive.space = true\r\n const previewBoxDom = document.querySelector('.go-preview') as HTMLElement\r\n if (previewBoxDom && previewBoxDom.style.position === 'absolute') {\r\n previewBoxDom.style.cursor = 'move'\r\n }\r\n break\r\n }\r\n }\r\n }\r\n\r\n document.onkeyup = (e: KeyboardEvent) => {\r\n const { keyCode } = e\r\n if (keyCode == 32 && e.target == document.body) e.preventDefault()\r\n\r\n if ([17, 32].includes(keyCode) && window.$KeyboardActive) {\r\n switch (keyCode) {\r\n case 17:\r\n window.$KeyboardActive.ctrl = false\r\n break\r\n case 32:\r\n window.$KeyboardActive.space = false\r\n break\r\n }\r\n }\r\n\r\n const previewBoxDom = document.querySelector('.go-preview') as HTMLElement\r\n if (previewBoxDom) {\r\n previewBoxDom.style.cursor = 'default'\r\n }\r\n }\r\n}\r\n","import throttle from 'lodash/throttle'\n\r\nlet prevMoveXValue = [0, 0]\r\nlet prevMoveYValue = [0, 0]\r\n\r\n// 拖拽处理\r\nexport const dragCanvas = (e: MouseEvent) => {\r\n const previewBoxDom = document.querySelector('.go-preview') as HTMLElement\r\n if (!previewBoxDom || previewBoxDom.style.position !== 'absolute') return\r\n if (!window.$KeyboardActive?.space) return\r\n\r\n e.preventDefault()\r\n e.stopPropagation()\r\n // @ts-ignore\r\n document.activeElement?.blur()\r\n const startX = e.screenX\r\n const startY = e.screenY\r\n\r\n const handleMousemove = throttle((moveEvent: MouseEvent) => {\n const nx = moveEvent.screenX - startX\n const ny = moveEvent.screenY - startY\n\n const [prevMoveX1, prevMoveX2] = prevMoveXValue\n const [prevMoveY1, prevMoveY2] = prevMoveYValue\n\n prevMoveXValue = [prevMoveX2, nx]\n prevMoveYValue = [prevMoveY2, ny]\n\n // 去除小数部分\n if (previewBoxDom) {\n const oldLeft = previewBoxDom.style.left ? Number(previewBoxDom.style.left.split('px')[0]) : 0\n const oldTop = previewBoxDom.style.top ? Number(previewBoxDom.style.top.split('px')[0]) : 0\n previewBoxDom.style.left =\n oldLeft +\n (prevMoveX2 > prevMoveX1 ? Math.abs(prevMoveX2 - prevMoveX1) : -Math.abs(prevMoveX2 - prevMoveX1)) +\n 'px'\n previewBoxDom.style.top =\n oldTop +\n (prevMoveY2 > prevMoveY1 ? Math.abs(prevMoveY2 - prevMoveY1) : -Math.abs(prevMoveY2 - prevMoveY1)) +\n 'px'\n }\n }, 20)\n\n const handleMouseup = () => {\n prevMoveXValue = [0, 0]\n prevMoveYValue = [0, 0]\n handleMousemove.cancel()\n window.removeEventListener('mousemove', handleMousemove)\n window.removeEventListener('mouseup', handleMouseup)\n }\n\n window.addEventListener('mousemove', handleMousemove)\n window.addEventListener('mouseup', handleMouseup)\n}\n","<template>\n <div\n :class=\"animationsClass(groupData.styles.animations)\"\n :style=\"{\n ...getSizeStyle(groupData.attr),\n ...getFilterStyle(groupData.styles),\n }\"\n >\n <div\n class=\"chart-item\"\n v-for=\"item in groupData.groupList\"\n :class=\"animationsClass(item.styles.animations)\"\n :key=\"item.id\"\n :style=\"{\n ...getComponentAttrStyle(item.attr, groupIndex),\n ...getStatusStyle(item.status),\n ...getPreviewConfigStyle(item.preview),\n ...getBlendModeStyle(item.styles) as any\n }\"\n >\n <component\n :is=\"item.chartConfig.chartKey\"\n :id=\"item.id\"\n :chartConfig=\"item\"\n :themeSetting=\"themeSetting\"\n :themeColor=\"themeColor\"\n :style=\"{\n ...getSizeStyle(item.attr),\n ...getFilterStyle(item.styles),\n ...getTransformStyle(item.styles)\n }\"\n v-on=\"useLifeHandler(item)\"\n ></component>\n </div>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { PropType } from 'vue'\nimport { CreateComponentGroupType } from '@core/packages/index.d'\nimport { animationsClass, getFilterStyle, getTransformStyle, getBlendModeStyle } from '@core/utils'\nimport { getSizeStyle, getComponentAttrStyle, getStatusStyle, getPreviewConfigStyle } from '../../utils'\nimport { useLifeHandler } from '@core/hooks'\n\nconst props = defineProps({\n groupData: {\n type: Object as PropType<CreateComponentGroupType>,\n required: true\n },\n themeSetting: {\n type: Object,\n required: true\n },\n themeColor: {\n type: Object,\n required: true\n },\n groupIndex: {\n type: Number,\n required: true\n }\n})\n</script>\n\n<style lang=\"scss\" scoped>\n.chart-item {\n position: absolute;\n}\n</style>\n","<template>\n <div\n class=\"chart-item\"\n :id=\"item.id\"\n v-for=\"(item, index) in chartEditStore.componentList\"\n :class=\"animationsClass(item.styles.animations)\"\n :key=\"item.id\"\n :style=\"{\n ...getComponentAttrStyle(item.attr, index),\n ...getTransformStyle(item.styles),\n ...getStatusStyle(item.status),\n ...getPreviewConfigStyle(item.preview),\n ...getBlendModeStyle(item.styles) as any,\n ...getSizeStyle(item.attr)\n }\"\n >\n <!-- 分组 -->\n <preview-render-group\n v-if=\"item.isGroup\"\n :groupData=\"(item as CreateComponentGroupType)\"\n :groupIndex=\"index\"\n :themeSetting=\"themeSetting\"\n :themeColor=\"themeColor\"\n ></preview-render-group>\n\n <!-- 单组件 -->\n <component\n v-else\n :is=\"item.chartConfig.chartKey\"\n :id=\"item.id\"\n :chartConfig=\"item\"\n :themeSetting=\"themeSetting\"\n :themeColor=\"themeColor\"\n :style=\"{ \n ...getSizeStyle(item.attr),\n ...getFilterStyle(item.styles)\n }\"\n v-on=\"useLifeHandler(item)\"\n ></component>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { PropType, computed, onMounted } from 'vue'\nimport { useChartDataPondFetch } from '@core/hooks'\nimport { ChartEditStorageType } from '../../index.d'\nimport { PreviewRenderGroup } from '../PreviewRenderGroup/index'\nimport { CreateComponentGroupType } from '@core/packages/index.d'\nimport { chartColors } from '@core/settings/chartThemes/index'\nimport { useChartEditStore } from '@core/store/modules/chartEditStore/chartEditStore'\nimport { animationsClass, getFilterStyle, getTransformStyle, getBlendModeStyle, colorCustomMerge } from '@core/utils'\nimport { getSizeStyle, getComponentAttrStyle, getStatusStyle, getPreviewConfigStyle } from '../../utils'\nimport { useLifeHandler } from '@core/hooks'\n\n// 初始化数据池\nconst { initDataPond, clearMittDataPondMap } = useChartDataPondFetch()\nconst chartEditStore = useChartEditStore()\n\n// const props = defineProps({\n// localStorageInfo: {\n// type: Object as PropType<ChartEditStorageType>,\n// required: true\n// }\n// })\n\n// 主题色\nconst themeSetting = computed(() => {\n const chartThemeSetting = chartEditStore.editCanvasConfig.chartThemeSetting\n return chartThemeSetting\n})\n\n// 配置项\nconst themeColor = computed(() => {\n const colorCustomMergeData = colorCustomMerge(chartEditStore.editCanvasConfig.chartCustomThemeColorInfo)\n return colorCustomMergeData[chartEditStore.editCanvasConfig.chartThemeColor]\n})\n\n// 组件渲染结束初始化数据池\nclearMittDataPondMap()\nonMounted(() => {\n initDataPond(useChartEditStore)\n})\n</script>\n\n<style lang=\"scss\" scoped>\n.chart-item {\n position: absolute;\n}\n</style>\n","import { ref } from 'vue'\nimport { ChartEditStorageType } from '../index.d'\nimport { CreateComponentType, CreateComponentGroupType } from '@core/packages/index.d'\nimport { ensureRegisteredComponent } from '@core/packages/index'\n\nexport const useComInstall = (localStorageInfo: ChartEditStorageType) => {\n const show = ref(false)\n\n // 注册组件(一开始无法获取window['$vue'])\n const intervalTiming = setInterval(() => {\n const app = window['$vue']\n if (app?.component) {\n clearInterval(intervalTiming)\n\n const intComponent = (target: CreateComponentType) => {\n ensureRegisteredComponent(target.chartConfig, false)\n }\n\n localStorageInfo.componentList.forEach(async (e: CreateComponentType | CreateComponentGroupType) => {\n if (e.isGroup) {\n (e as CreateComponentGroupType).groupList.forEach(groupItem => {\n intComponent(groupItem)\n })\n } else {\n intComponent(e as CreateComponentType)\n }\n })\n show.value = true\n }\n }, 200)\n\n return {\n show\n }\n}\n","import { ref, provide, onMounted, onUnmounted } from 'vue'\nimport { usePreviewFitScale, usePreviewScrollYScale, usePreviewScrollXScale, usePreviewFullScale } from '@core/hooks/index'\nimport type { ChartEditStorageType } from '../index.d'\nimport { PreviewScaleEnum } from '@core/enums/styleEnum'\n\nexport const SCALE_KEY = 'scale-value'\n\nexport const useScale = (localStorageInfo: ChartEditStorageType) => {\n const entityRef = ref()\n const previewRef = ref()\n const width = ref(localStorageInfo.editCanvasConfig.width)\n const height = ref(localStorageInfo.editCanvasConfig.height)\n const scaleRef = ref({ width: 1, height: 1 })\n\n provide(SCALE_KEY, scaleRef)\n\n const updateScaleRef = (scale: { width: number; height: number }) => {\n // 这里需要解构,保证赋值给scaleRef的为一个新对象\n // 因为scale始终为同一引用\n scaleRef.value = { ...scale }\n }\n\n const updateEntitySize = (scale: { width: number; height: number }) => {\n const dom = entityRef.value\n if (!dom) return\n dom.style.width = `${width.value * scale.width}px`\n dom.style.height = `${height.value * scale.height}px`\n }\n\n // 屏幕适配\n onMounted(() => {\n switch (localStorageInfo.editCanvasConfig.previewScaleType) {\n case PreviewScaleEnum.FIT:\n ;(() => {\n const { calcRate, windowResize, unWindowResize } = usePreviewFitScale(\n width.value as number,\n height.value as number,\n previewRef.value,\n scale => {\n updateEntitySize(scale)\n updateScaleRef(scale)\n }\n )\n calcRate()\n windowResize()\n onUnmounted(() => {\n unWindowResize()\n })\n })()\n break\n case PreviewScaleEnum.SCROLL_Y:\n ;(() => {\n const { calcRate, windowResize, unWindowResize } = usePreviewScrollYScale(\n width.value as number,\n height.value as number,\n previewRef.value,\n scale => {\n updateEntitySize(scale)\n updateScaleRef(scale)\n }\n )\n calcRate()\n windowResize()\n onUnmounted(() => {\n unWindowResize()\n })\n })()\n\n break\n case PreviewScaleEnum.SCROLL_X:\n ;(() => {\n const { calcRate, windowResize, unWindowResize } = usePreviewScrollXScale(\n width.value as number,\n height.value as number,\n previewRef.value,\n scale => {\n updateEntitySize(scale)\n updateScaleRef(scale)\n }\n )\n calcRate()\n windowResize()\n onUnmounted(() => {\n unWindowResize()\n })\n })()\n\n break\n case PreviewScaleEnum.FULL:\n ;(() => {\n const { calcRate, windowResize, unWindowResize } = usePreviewFullScale(\n width.value as number,\n height.value as number,\n previewRef.value,\n scale => {\n updateEntitySize(scale)\n updateScaleRef(scale)\n }\n )\n calcRate()\n windowResize()\n onUnmounted(() => {\n unWindowResize()\n })\n })()\n break\n }\n })\n\n return {\n entityRef,\n previewRef,\n scaleRef\n }\n}\n","import { useChartEditStore } from '@core/store/modules/chartEditStore/chartEditStore'\nimport { ChartEditStoreEnum } from '@core/store/modules/chartEditStore/chartEditStore.d'\nimport type { ChartEditStorageType } from '../index.d'\n\n// store 相关\nexport const useStore = (localStorageInfo: ChartEditStorageType) => {\n const chartEditStore = useChartEditStore()\n chartEditStore.requestGlobalConfig = localStorageInfo[ChartEditStoreEnum.REQUEST_GLOBAL_CONFIG]\n}\n","<template>\n <div :class=\"`go-preview ${chartEditStore.editCanvasConfig.previewScaleType}`\" @mousedown=\"dragCanvas\">\n <!-- 实体区域 -->\n <div ref=\"entityRef\" class=\"go-preview-entity\">\n <!-- 缩放层 -->\n <div ref=\"previewRef\" class=\"go-preview-scale\">\n <!-- 展示层 -->\n <div :style=\"previewRefStyle\" v-if=\"show\">\n <!-- 渲染层 -->\n <preview-render-list></preview-render-list>\n </div>\n </div>\n </div>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { computed } from 'vue'\nimport { PreviewRenderList } from './components/PreviewRenderList'\nimport { getFilterStyle, setTitle } from '@core/utils'\nimport { getEditCanvasConfigStyle, getSessionStorageInfo, keyRecordHandle, dragCanvas } from './utils'\nimport { useComInstall } from './hooks/useComInstall.hook'\nimport { useScale } from './hooks/useScale.hook'\nimport { useStore } from './hooks/useStore.hook'\nimport type { ChartEditStorageType } from './index.d'\nimport { useChartEditStore } from '@core/store/modules/chartEditStore/chartEditStore'\n\n// const localStorageInfo: ChartEditStorageType = getSessionStorageInfo() as ChartEditStorageType\n\nawait getSessionStorageInfo()\nconst chartEditStore = useChartEditStore() as unknown as ChartEditStorageType\n\n// setTitle(`预览-${chartEditStore.editCanvasConfig.projectName}`)\n\nconst previewRefStyle = computed(() => {\n return {\n overflow: 'hidden',\n ...getEditCanvasConfigStyle(chartEditStore.editCanvasConfig),\n ...getFilterStyle(chartEditStore.editCanvasConfig)\n }\n})\n\nuseStore(chartEditStore)\nconst { entityRef, previewRef } = useScale(chartEditStore)\nconst { show } = useComInstall(chartEditStore)\n\n// 开启键盘监听\nkeyRecordHandle()\n</script>\n\n<style lang=\"scss\" scoped>\n@include go('preview') {\n position: relative;\n height: 100%;\n width: 100%;\n @include background-image('background-image');\n &.fit,\n &.full {\n display: flex;\n align-items: center;\n justify-content: center;\n overflow: hidden;\n .go-preview-entity {\n flex: none;\n }\n .go-preview-scale {\n transform-origin: left top;\n }\n }\n &.scrollY {\n overflow-x: hidden;\n overflow-y: auto;\n scrollbar-gutter: stable;\n .go-preview-scale {\n transform-origin: left top;\n }\n }\n &.scrollX {\n overflow-x: auto;\n overflow-y: hidden;\n scrollbar-gutter: stable;\n .go-preview-scale {\n transform-origin: left top;\n }\n }\n .go-preview-entity {\n overflow: hidden;\n position: relative;\n }\n}\n</style>\n","<template>\n <div ref=\"rootRef\" class=\"hgdataview-preview-wrapper hgdataview-root\" :class=\"{ dark: resolvedTheme === 'dark' }\"\n :data-theme=\"resolvedTheme\" :style=\"wrapperStyle\">\n <!-- 直接使用原有的 preview 组件 -->\n <suspense v-if=\"previewReady\">\n <suspense-index :key=\"previewKey\"></suspense-index>\n </suspense>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { computed, nextTick, onBeforeUnmount, onMounted, ref, watch, toRaw } from 'vue'\nimport suspenseIndex from '@core/views/preview/suspenseIndex.vue'\nimport { useChartEditStore } from '@core/store/modules/chartEditStore/chartEditStore'\nimport { useSync } from '@core/views/chart/hooks/useSync.hook'\nimport { registerHgDataViewThemeRoot, unregisterHgDataViewThemeRoot } from '@core/utils/style'\n\ninterface Props {\n width?: string | number\n height?: string | number\n projectData?: any // 项目数据\n autoFit?: boolean // 是否自适应\n scale?: number // 缩放比例\n backgroundColor?: string // 背景色\n /**\n * 主题控制:\n * - 'dark' | 'light':由外部显式指定\n * - 'auto':自动跟随宿主 documentElement 的 data-theme / dark class\n */\n theme?: 'light' | 'dark' | 'auto'\n}\n\nconst props = withDefaults(defineProps<Props>(), {\n width: '100%',\n height: '100%',\n autoFit: true,\n scale: 1,\n backgroundColor: '#000',\n theme: 'auto'\n})\n\nconst rootRef = ref<HTMLElement | null>(null)\nconst previewReady = ref(false)\nconst previewKey = ref(0)\n\n// 使用原有的 store\nconst chartEditStore = useChartEditStore()\nconst { updateComponent } = useSync()\nconst lastProjectDataJson = ref('')\n\nconst getHostTheme = (): 'dark' | 'light' => {\n const e = window.document.documentElement\n const t = e.getAttribute('data-theme')\n if (t === 'dark' || t === 'light') return t\n return e.classList.contains('dark') ? 'dark' : 'light'\n}\n\nconst resolvedTheme = ref<'dark' | 'light'>(props.theme === 'auto' ? getHostTheme() : props.theme)\n\nlet hostThemeObserver: MutationObserver | null = null\nconst setupHostThemeObserver = () => {\n if (hostThemeObserver) return\n hostThemeObserver = new MutationObserver(() => {\n if (props.theme !== 'auto') return\n resolvedTheme.value = getHostTheme()\n })\n hostThemeObserver.observe(window.document.documentElement, {\n attributes: true,\n attributeFilter: ['data-theme', 'class']\n })\n}\n\nconst teardownHostThemeObserver = () => {\n hostThemeObserver?.disconnect()\n hostThemeObserver = null\n}\n\n// 监听主题变化(外部显式传入 or auto)\nwatch(\n () => props.theme,\n (newTheme) => {\n if (newTheme === 'auto') {\n resolvedTheme.value = getHostTheme()\n setupHostThemeObserver()\n return\n }\n teardownHostThemeObserver()\n resolvedTheme.value = newTheme\n },\n { immediate: true }\n)\n\n// 容器样式\nconst wrapperStyle = computed(() => ({\n width: typeof props.width === 'number' ? `${props.width}px` : props.width,\n height: typeof props.height === 'number' ? `${props.height}px` : props.height,\n overflow: 'hidden'\n}))\n\nconst serializeProjectData = (data: any) => JSON.stringify({\n config: data?.config ?? {},\n components: data?.components ?? [],\n requestGlobalConfig: data?.requestGlobalConfig ?? {}\n})\n\n// 监听项目数据变化,更新 store\nwatch(\n () => props.projectData,\n async (newData) => {\n if (newData) {\n previewReady.value = false\n const nextProjectData = {\n config: newData?.config ?? {},\n components: Array.isArray(newData?.components) ? newData.components : [],\n requestGlobalConfig: newData?.requestGlobalConfig ?? {}\n }\n const nextProjectDataJson = serializeProjectData(nextProjectData)\n if (nextProjectDataJson === lastProjectDataJson.value) {\n previewReady.value = true\n return\n }\n\n await updateComponent(\n {\n editCanvasConfig: nextProjectData.config,\n componentList: nextProjectData.components,\n requestGlobalConfig: nextProjectData.requestGlobalConfig\n } as any,\n true\n )\n chartEditStore.setTargetSelectChart(undefined)\n lastProjectDataJson.value = nextProjectDataJson\n previewKey.value += 1\n await nextTick()\n previewReady.value = true\n return\n }\n\n previewReady.value = true\n },\n { immediate: true }\n)\n\nonMounted(() => {\n if (rootRef.value) {\n registerHgDataViewThemeRoot(rootRef.value)\n }\n if (props.theme === 'auto') {\n setupHostThemeObserver()\n }\n})\n\nonBeforeUnmount(() => {\n teardownHostThemeObserver()\n if (rootRef.value) {\n unregisterHgDataViewThemeRoot(rootRef.value)\n }\n})\n</script>\n\n<style scoped>\n.hgdataview-preview-wrapper {\n position: relative;\n width: 100%;\n height: 100%;\n overflow: hidden;\n}\n</style>\n","import type { App } from 'vue'\nimport { setupStore, usePackagesStore } from '@core/store'\nimport { initUserPhotoRegistry } from '@core/packages/components/Photos/Private'\nimport { registerHgDataViewExtension } from '@core/packages'\nimport type { HgDataViewExtension } from '@core/packages'\nimport { registerHgDataViewEngine } from '@core/engines'\nimport type { HgDataViewEngine } from '@core/engines'\n\nexport type HgDataViewRuntimeExtension = HgDataViewExtension | (() => void)\nexport type HgDataViewRuntimeEngine = HgDataViewEngine | (() => void)\n\nexport interface HgDataViewRuntimeOptions {\n engines?: HgDataViewRuntimeEngine[]\n extensions?: HgDataViewRuntimeExtension[]\n}\n\nlet photoRegistryInitialized = false\n\nconst registerRuntimeExtension = (extension: HgDataViewRuntimeExtension) => {\n if (typeof extension === 'function') {\n extension()\n return\n }\n registerHgDataViewExtension(extension)\n}\n\nconst registerRuntimeEngine = (engine: HgDataViewRuntimeEngine) => {\n if (typeof engine === 'function') {\n engine()\n return\n }\n registerHgDataViewEngine(engine)\n}\n\nexport const setupHgDataViewRuntime = (app: App, options: HgDataViewRuntimeOptions = {}) => {\n setupStore(app)\n\n options.engines?.forEach(registerRuntimeEngine)\n options.extensions?.forEach(registerRuntimeExtension)\n\n if (!photoRegistryInitialized) {\n initUserPhotoRegistry()\n photoRegistryInitialized = true\n }\n\n usePackagesStore().initPackagesRegistrySubscription()\n}\n","import type {\n HgDataViewSkill,\n HgDataViewComponentTypeInfo,\n HgDataViewProjectSchema,\n HgDataViewSkillResult,\n HgDataViewCreateComponentInput,\n HgDataViewInsertComponentInput,\n HgDataViewApplyProjectInput,\n HgDataViewPatchProjectInput,\n HgDataViewProjectData\n} from './types'\nimport { usePackagesStore } from '@core/store/modules/packagesStore/packagesStore'\nimport { useChartEditStore } from '@core/store/modules/chartEditStore/chartEditStore'\nimport { useSync } from '@core/views/chart/hooks/useSync.hook'\nimport { createComponent, findComponentConfigByKey } from '@core/packages'\nimport merge from 'lodash/merge'\n\nconst ok = <T>(data: T): HgDataViewSkillResult<T> => ({ ok: true, data })\nconst fail = (error: string): HgDataViewSkillResult => ({ ok: false, error })\n\nconst projectSchema: HgDataViewProjectSchema = {\n type: 'object',\n required: ['config', 'components'],\n properties: {\n config: { type: 'object', description: '画布配置(EditCanvasConfigType)' },\n components: { type: 'array', description: '组件列表(CreateComponentType[])' },\n design: { type: 'object', description: '可选:主题与交互色(例如 appTheme)' }\n }\n}\n\nexport const getHgDataViewSkills = (): HgDataViewSkill[] => {\n const listComponentTypes: HgDataViewSkill<undefined, HgDataViewSkillResult<HgDataViewComponentTypeInfo[]>> = {\n name: 'list_component_types',\n title: '列出可用组件类型',\n description: '返回当前组件库内可用的组件类型清单,用于 AI 选型。',\n inputSchema: {\n type: 'object',\n properties: {},\n additionalProperties: false\n },\n handler: () => {\n const packagesStore = usePackagesStore()\n const list: HgDataViewComponentTypeInfo[] = []\n const packagesList = packagesStore.getPackagesList\n\n Object.keys(packagesList).forEach((pkgName: any) => {\n const group = (packagesList as any)[pkgName] || []\n group.forEach((item: any) => {\n list.push({\n key: item.key,\n title: item.title,\n category: item.category,\n categoryName: item.categoryName,\n package: item.package,\n chartKey: item.chartKey,\n conKey: item.conKey,\n chartFrame: item.chartFrame,\n disabled: item.disabled\n })\n })\n })\n\n return ok(list)\n }\n }\n\n const getProjectSchemaSkill: HgDataViewSkill<undefined, HgDataViewSkillResult<HgDataViewProjectSchema>> = {\n name: 'get_project_schema',\n title: '获取项目 JSON Schema',\n description: '返回项目数据结构的 JSON Schema,供 AI 严格输出使用。',\n inputSchema: {\n type: 'object',\n properties: {},\n additionalProperties: false\n },\n handler: () => ok(projectSchema)\n }\n\n const exportProject: HgDataViewSkill<undefined, HgDataViewSkillResult<HgDataViewProjectData>> = {\n name: 'export_project',\n title: '导出当前项目',\n description: '从 store 导出当前画布项目 JSON。',\n inputSchema: { type: 'object', properties: {}, additionalProperties: false },\n handler: () => {\n const chartEditStore = useChartEditStore()\n return ok({\n config: chartEditStore.getEditCanvasConfig,\n components: chartEditStore.getComponentList\n })\n }\n }\n\n const applyProject: HgDataViewSkill<HgDataViewApplyProjectInput, HgDataViewSkillResult<{ applied: boolean }>> = {\n name: 'apply_project',\n title: '应用项目到编辑器',\n description: '将 project 写入编辑器。replace=true 时会清空并重建组件(推荐)。',\n inputSchema: {\n type: 'object',\n required: ['project'],\n properties: {\n project: projectSchema,\n replace: { type: 'boolean', default: true },\n changeId: { type: 'boolean', default: false }\n }\n },\n handler: async (input) => {\n const chartEditStore = useChartEditStore()\n const { updateComponent } = useSync()\n const project = input?.project\n if (!project?.config || !Array.isArray(project.components)) return fail('project 缺少 config 或 components')\n\n await updateComponent(\n {\n editCanvasConfig: project.config as any,\n componentList: project.components as any,\n requestGlobalConfig: chartEditStore.getRequestGlobalConfig\n } as any,\n input?.replace ?? true,\n input?.changeId ?? false\n )\n return ok({ applied: true })\n }\n }\n\n const createComponentSkill: HgDataViewSkill<HgDataViewCreateComponentInput, HgDataViewSkillResult<any>> = {\n name: 'create_component',\n title: '创建组件(不插入)',\n description: '按组件 key 创建一个组件实例 JSON(不写入画布),用于 AI 先生成再确认。',\n inputSchema: {\n type: 'object',\n required: ['key'],\n properties: {\n key: { type: 'string', description: '组件 key,如 TextCommon / BarCommon / VChartLine 等' },\n title: { type: 'string' },\n x: { type: 'number' },\n y: { type: 'number' },\n w: { type: 'number' },\n h: { type: 'number' },\n option: { type: 'object' },\n request: { type: 'object' }\n }\n },\n handler: async (input) => {\n const found = findComponentConfigByKey(input.key)\n if (!found) return fail(`未找到组件类型 key=${input.key}`)\n\n const instance = await createComponent(found)\n if (input.title) instance.chartConfig.title = input.title\n if (typeof input.x === 'number') instance.attr.x = input.x\n if (typeof input.y === 'number') instance.attr.y = input.y\n if (typeof input.w === 'number') instance.attr.w = input.w\n if (typeof input.h === 'number') instance.attr.h = input.h\n if (input.option && typeof input.option === 'object') merge(instance.option, input.option)\n if (input.request && typeof input.request === 'object') merge(instance.request, input.request)\n\n return ok(instance)\n }\n }\n\n const insertComponentSkill: HgDataViewSkill<HgDataViewInsertComponentInput, HgDataViewSkillResult<{ id: string }>> = {\n name: 'insert_component',\n title: '创建并插入组件',\n description: '按组件 key 创建并直接插入到当前画布。',\n inputSchema: {\n type: 'object',\n required: ['key'],\n properties: {\n key: { type: 'string' },\n title: { type: 'string' },\n x: { type: 'number' },\n y: { type: 'number' },\n w: { type: 'number' },\n h: { type: 'number' },\n option: { type: 'object' },\n request: { type: 'object' },\n select: { type: 'boolean', default: true }\n }\n },\n handler: async (input) => {\n const chartEditStore = useChartEditStore()\n const createRes = await createComponentSkill.handler(input as any, { runtime: { mode: 'editor' } })\n if (!createRes.ok) return createRes as any\n const instance: any = createRes.data\n\n chartEditStore.addComponentList(instance, false, true)\n if (input.select ?? true) chartEditStore.setTargetSelectChart(instance.id)\n return ok({ id: instance.id })\n }\n }\n\n const patchProject: HgDataViewSkill<HgDataViewPatchProjectInput, HgDataViewSkillResult<HgDataViewProjectData>> = {\n name: 'patch_project',\n title: 'Patch 项目 JSON',\n description: '对 project 做深度合并 patch,返回新 project,但不自动应用。',\n inputSchema: {\n type: 'object',\n required: ['project', 'patch'],\n properties: {\n project: projectSchema,\n patch: { type: 'object' }\n }\n },\n handler: (input) => {\n if (!input?.project) return fail('缺少 project')\n const next = merge({}, input.project, input.patch)\n return ok(next)\n }\n }\n\n return [\n listComponentTypes,\n getProjectSchemaSkill,\n exportProject,\n applyProject,\n createComponentSkill,\n insertComponentSkill,\n patchProject\n ]\n}\n","import type { App } from 'vue'\nimport VueLazyLoad from 'vue3-lazyload'\nimport { SketchRule } from 'vue3-sketch-ruler'\nimport { ElMessage, ElMessageBox, ElLoading } from 'element-plus'\nimport HgDataViewEditor from './GoViewEditor.vue'\nimport HgDataViewPreview from './GoViewPreview.vue'\nimport { GoSkeleton } from '@core/components/GoSkeleton'\nimport { GoLoading } from '@core/components/GoLoading'\nimport { requireErrorImg } from '@core/utils'\nimport { setHtmlTheme } from '@core/utils/style'\nimport { setupHgDataViewRuntime } from '../runtime'\nimport type { HgDataViewRuntimeOptions } from '../runtime'\n\nimport './styles/element-plus-dark-scope.css'\nimport 'vue3-sketch-ruler/lib/style.css'\nimport 'animate.css/animate.min.css'\nimport './styles/theme.scss'\n\nexport { HgDataViewEditor, HgDataViewPreview }\nexport * from './skills'\nexport * from '../published/hooks'\nexport * from '../published/store'\nexport * from '../published/utils'\nexport * from '../enums/httpEnum'\n\nexport { registerHgDataViewCustomComponent, registerHgDataViewExtension } from '../packages/registry'\nexport type { HgDataViewCustomComponent, HgDataViewExtension, HgDataViewExtensionComponent } from '../packages/registry'\nexport { registerHgDataViewEngine } from '../engines/registry'\nexport type { HgDataViewEngine } from '../engines/registry'\n\nexport { PublicConfigClass } from '@core/packages/public/publicConfig'\nexport { globalThemeJson, defaultTheme, chartColors, chartColorsSearch } from '@core/settings/chartThemes/index'\nexport { colorCustomMerge, colorGradientCustomMerge } from '@core/utils/style'\n\nexport type { CreateComponentType, CreateComponentGroupType } from '@core/packages/index.d'\nexport type { EditCanvasConfigType } from '@core/store/modules/chartEditStore/chartEditStore.d'\n\nexport const version = '2.0.0'\n\nexport function setTheme(theme: 'dark' | 'light' = 'dark') {\n setHtmlTheme(theme)\n}\n\nfunction initGlobalMethods() {\n window['$message'] = {\n success: (content: string) => ElMessage.success(content),\n error: (content: string) => ElMessage.error(content),\n warning: (content: string) => ElMessage.warning(content),\n info: (content: string) => ElMessage.info(content),\n loading: (content: string) => ElMessage({ message: content, type: 'info', duration: 0 })\n }\n\n window['$dialog'] = {\n warning: (options: any) => {\n ElMessageBox.confirm(options.content || '', options.title || '提示', {\n confirmButtonText: options.positiveText || '确定',\n cancelButtonText: options.negativeText || '取消',\n type: 'warning'\n })\n .then(() => {\n options.onPositiveClick?.()\n })\n .catch(() => {\n options.onNegativeClick?.()\n })\n },\n error: (options: any) => {\n return window['$dialog']?.warning?.(options)\n },\n success: (options: any) => {\n return window['$dialog']?.warning?.(options)\n }\n }\n\n let loadingInstance: ReturnType<typeof ElLoading.service> | null = null\n window['$loading'] = {\n start: () => {\n loadingInstance = ElLoading.service({\n lock: true,\n text: '加载中...',\n background: 'rgba(0, 0, 0, 0.7)'\n })\n },\n finish: () => {\n loadingInstance?.close()\n loadingInstance = null\n },\n error: () => {\n loadingInstance?.close()\n loadingInstance = null\n }\n }\n}\n\nexport function install(\n app: App,\n options?: HgDataViewRuntimeOptions & { theme?: 'dark' | 'light'; applyThemeToHost?: boolean }\n) {\n window['$vue'] = app\n\n setupHgDataViewRuntime(app, options)\n\n if (options?.applyThemeToHost) {\n setTheme(options?.theme || 'dark')\n }\n\n initGlobalMethods()\n\n app.use(VueLazyLoad, {\n error: requireErrorImg()\n })\n\n app.component('GoSkeleton', GoSkeleton)\n app.component('GoLoading', GoLoading)\n app.component('SketchRule', SketchRule)\n\n app.component('HgDataViewEditor', HgDataViewEditor)\n app.component('HgDataViewPreview', HgDataViewPreview)\n}\n\ntype HgDataViewPlugin = {\n install: typeof install\n version: typeof version\n setTheme: typeof setTheme\n HgDataViewEditor: typeof HgDataViewEditor\n HgDataViewPreview: typeof HgDataViewPreview\n}\n\nconst HgDataViewPlugin: HgDataViewPlugin = {\n install,\n version,\n setTheme,\n HgDataViewEditor,\n HgDataViewPreview\n}\n\nexport default HgDataViewPlugin\n"],"names":["MoonIcon","SunnyIcon","icon","designStore","useDesignStore","changeTheme","setHtmlTheme","_createBlock","_component_el_button","_createVNode","_component_el_icon","_unref","global","zh","en","langStorage","getLocalStorage","StorageEnum","langList","LangEnum","createI18n","lang","LanguageIcon","locale","useI18n","langStore","useLangStore","options","handleSelect","key","_component_el_dropdown","_component_el_dropdown_menu","_createElementBlock","_Fragment","_renderList","item","_component_el_dropdown_item","_createTextVNode","_toDisplayString","themeColorLogo","tryOnScopeDispose","fn","getCurrentScope","onScopeDispose","isClient","isString","val","noop","createFilterWrapper","filter","wrapper","args","debounceFilter","ms","timer","maxTimer","invoke","duration","unref","maxDuration","throttleFilter","trailing","leading","lastExec","preventLeading","clear","elapsed","useDebounceFn","useThrottleFn","defaultWindow","useEventListener","target","event","listener","cleanup","stopWatch","watch","el","stop","_global","globalKey","useScroll","element","throttle","idle","onStop","onScroll","offset","eventListenerOptions","x","ref","y","isScrolling","arrivedState","reactive","directions","onScrollEnd","e","onScrollHandler","eventTarget","scrollLeft","scrollTop","_a","_b","__defProp$3","__getOwnPropSymbols$3","__hasOwnProp$3","__propIsEnum$3","__defNormalProp$3","obj","value","__spreadValues$3","a","b","prop","initialRect","ColorList","loadAsyncComponent","ColorWandIcon","CloseIcon","splitNumber","modelShow","contentLeftRef","designColorSplit","designColor","bottom","toRefs","appThemeDetail","computed","colorSelectHandle","color","newData","_component_el_dialog","$event","_createElementVNode","_hoisted_1","_hoisted_2","_cache","_component_el_divider","_openBlock","_hoisted_3","_hoisted_4","_hoisted_5","_hoisted_6","_hoisted_7","_hoisted_8","_normalizeStyle","_hoisted_9","_hoisted_10","_component_el_link","_component_el_header","_component_el_space","_renderSlot","_ctx","GoLangSelect","ThemeColorSelect","GoThemeSelect","LayoutHeader","CopyIcon","CutIcon","ClipboardOutlineIcon","TrashIcon","ChevronDownIcon","ChevronUpIcon","LockOpenOutlineIcon","LockClosedOutlineIcon","EyeOutlineIcon","EyeOffOutlineIcon","UpToTopIcon","DownToBottomIcon","PaintBrushIcon","Carbon3DSoftwareIcon","Carbon3DCursorIcon","divider","n","getDefaultOptions","chartEditStore","useChartEditStore","MenuEnum","renderIcon","getDefaultMultiSelectOptions","defaultNoItemKeys","pickOption","pickList","list","op","hideOption","hideList","menuOptions","handleContextMenu","targetInstance","optionsHandle","hideOptionsList","pickOptionsList","defaultOptions","defaultMultiSelectOptions","toRaw","cloneDeep","nextTick","useContextMenu","targetItem","loadingError","chartHistoryStoreStore","useChartHistoryStore","HeaderLeftBtn","HeaderRightBtn","HeaderTitle","ContentLayers","ContentCharts","ContentConfigurations","ContentLoad","onClickOutSide","mousePosition","handleMenuSelect","dropdownRef","menuOptionsWithChildren","_component_el_container","LayoutHeaderPro","_component_el_main","_component_el_menu","_component_el_menu_item","_resolveDynamicComponent","_component_el_sub_menu","child","_vShow","ChartModeEnum","LayerModeEnum","ChartLayoutStoreEnum","GO_CHART_LAYOUT_STORE","storageChartLayout","useChartLayoutStore","defineStore","baseState","computedScale","state","setLocalStorage","canvasVersionUpdatePolyfill","object","componentVersionUpdatePolyfill","newObject","sources","hasVnodeBeforeMount","hasVnodeMounted","BaseEvent","EventLife","componentMerge","notComponent","merge","option","buildMissingComponentInstance","targetComponent","error","ensureRegisteredComponent","MissingComponentConfig","missingComponent","createComponent","errorMessage","originalConfig","useSync","chartHistoryStore","chartLayoutStore","projectData","isReplace","changeId","intComponent","groupItem","create","_componentInstance","callBack","newComponent","mergedComponent","getUUID","ChartEditStoreEnum","loadIndex","listLength","comItem","percentage","groupClass","PublicGroupConfigClass","targetList","props","__props","emit","__emit","rootRef","updateComponent","syncingProjectData","lastProjectDataJson","getHostTheme","t","resolvedTheme","hostThemeObserver","setupHostThemeObserver","teardownHostThemeObserver","wrapperStyle","syncThemeToStore","theme","isDark","ThemeEnum","newTheme","serializeProjectData","data","getProjectData","loadProjectData","nextProjectData","projectDataJson","triggerCanvasResize","onMounted","registerHgDataViewThemeRoot","onBeforeUnmount","unregisterHgDataViewThemeRoot","__expose","range","scaleTemp","html2canvas","_normalizeClass","ChartHome","getComponentAttrStyle","attr","index","getSizeStyle","scale","getStatusStyle","getPreviewConfigStyle","previewConfig","previewStyle","getEditCanvasConfigStyle","canvas","computedBackground","getSessionStorageInfo","toPathArray","id","storageList","getSessionStorage","i","editCanvasConfig","requestGlobalConfig","componentList","keyRecordHandle","keyCode","previewBoxDom","prevMoveXValue","prevMoveYValue","dragCanvas","startX","startY","handleMousemove","moveEvent","nx","ny","prevMoveX1","prevMoveX2","prevMoveY1","prevMoveY2","oldLeft","oldTop","handleMouseup","animationsClass","getFilterStyle","getBlendModeStyle","_mergeProps","getTransformStyle","_toHandlers","useLifeHandler","initDataPond","clearMittDataPondMap","useChartDataPondFetch","themeSetting","themeColor","colorCustomMerge","PreviewRenderGroup","useComInstall","localStorageInfo","show","intervalTiming","app","SCALE_KEY","useScale","entityRef","previewRef","width","height","scaleRef","provide","updateScaleRef","updateEntitySize","dom","PreviewScaleEnum","calcRate","windowResize","unWindowResize","usePreviewFitScale","onUnmounted","usePreviewScrollYScale","usePreviewScrollXScale","usePreviewFullScale","useStore","__temp","__restore","_withAsyncContext","previewRefStyle","PreviewRenderList","previewReady","previewKey","nextProjectDataJson","_Suspense","suspenseIndex","photoRegistryInitialized","registerRuntimeExtension","extension","registerHgDataViewExtension","registerRuntimeEngine","engine","registerHgDataViewEngine","setupHgDataViewRuntime","setupStore","initUserPhotoRegistry","usePackagesStore","ok","fail","projectSchema","getHgDataViewSkills","listComponentTypes","packagesStore","packagesList","pkgName","getProjectSchemaSkill","exportProject","applyProject","input","project","createComponentSkill","found","findComponentConfigByKey","instance","createRes","next","version","setTheme","initGlobalMethods","content","ElMessage","ElMessageBox","loadingInstance","ElLoading","install","VueLazyLoad","requireErrorImg","GoSkeleton","GoLoading","SketchRule","HgDataViewEditor","HgDataViewPreview","HgDataViewPlugin"],"mappings":"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;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;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","x_google_ignoreList":[6,7]}