@eternalheart/vue-file-preview 1.3.7 → 1.3.8
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.
- package/lib/chunks/{index-BI0dSTSM.mjs → index-5Smm2vx0.mjs} +2 -2
- package/lib/chunks/{index-BI0dSTSM.mjs.map → index-5Smm2vx0.mjs.map} +1 -1
- package/lib/chunks/{index-yMb1JUC4.mjs → index-BCkcZs4y.mjs} +2 -2
- package/lib/chunks/{index-yMb1JUC4.mjs.map → index-BCkcZs4y.mjs.map} +1 -1
- package/lib/chunks/{index-DUUsS_T4.mjs → index-BM9FaQUl.mjs} +2 -2
- package/lib/chunks/{index-DUUsS_T4.mjs.map → index-BM9FaQUl.mjs.map} +1 -1
- package/lib/chunks/{index-CcJ5NmY1.mjs → index-BYzQg-jL.mjs} +2 -2
- package/lib/chunks/{index-CcJ5NmY1.mjs.map → index-BYzQg-jL.mjs.map} +1 -1
- package/lib/chunks/{index-DTLDLOGO.mjs → index-BoL1b2w-.mjs} +2 -2
- package/lib/chunks/{index-DTLDLOGO.mjs.map → index-BoL1b2w-.mjs.map} +1 -1
- package/lib/chunks/{index-S_kGRh6H.mjs → index-Bri7VeRx.mjs} +2 -2
- package/lib/chunks/{index-S_kGRh6H.mjs.map → index-Bri7VeRx.mjs.map} +1 -1
- package/lib/chunks/{index-DpAxU2JM.mjs → index-C324a7kV.mjs} +3 -3
- package/lib/chunks/{index-DpAxU2JM.mjs.map → index-C324a7kV.mjs.map} +1 -1
- package/lib/chunks/{index-kBPb_OKm.mjs → index-C7uOM7XL.mjs} +2 -2
- package/lib/chunks/{index-kBPb_OKm.mjs.map → index-C7uOM7XL.mjs.map} +1 -1
- package/lib/chunks/{index-Doy0FvQW.mjs → index-CTsscgqY.mjs} +2 -2
- package/lib/chunks/{index-Doy0FvQW.mjs.map → index-CTsscgqY.mjs.map} +1 -1
- package/lib/chunks/{index-CBCQs1ZC.mjs → index-Ch7AEfnk.mjs} +2 -2
- package/lib/chunks/{index-CBCQs1ZC.mjs.map → index-Ch7AEfnk.mjs.map} +1 -1
- package/lib/chunks/{index-ClxBxmPR.mjs → index-D9wf6m37.mjs} +2 -2
- package/lib/chunks/{index-ClxBxmPR.mjs.map → index-D9wf6m37.mjs.map} +1 -1
- package/lib/chunks/{index-BW61ZRev.mjs → index-DAEQe-RI.mjs} +2 -2
- package/lib/chunks/{index-BW61ZRev.mjs.map → index-DAEQe-RI.mjs.map} +1 -1
- package/lib/chunks/{index-DsznjwsH.mjs → index-DAo-7spn.mjs} +2 -2
- package/lib/chunks/{index-DsznjwsH.mjs.map → index-DAo-7spn.mjs.map} +1 -1
- package/lib/chunks/{index-C8ZF84WX.mjs → index-DXlcF1Dk.mjs} +2 -2
- package/lib/chunks/{index-C8ZF84WX.mjs.map → index-DXlcF1Dk.mjs.map} +1 -1
- package/lib/chunks/{index-SAfVQyNJ.mjs → index-ELyTQZeF.mjs} +3 -3
- package/lib/chunks/{index-SAfVQyNJ.mjs.map → index-ELyTQZeF.mjs.map} +1 -1
- package/lib/chunks/{index-D9lByoJw.mjs → index-cZn4ih-x.mjs} +2 -2
- package/lib/chunks/{index-D9lByoJw.mjs.map → index-cZn4ih-x.mjs.map} +1 -1
- package/lib/chunks/{index-CB0zCxJb.mjs → index-dzB4jd9b.mjs} +2 -2
- package/lib/chunks/{index-CB0zCxJb.mjs.map → index-dzB4jd9b.mjs.map} +1 -1
- package/lib/chunks/{index-CbKSdAt_.mjs → index-lHlugUBI.mjs} +2 -2
- package/lib/chunks/{index-CbKSdAt_.mjs.map → index-lHlugUBI.mjs.map} +1 -1
- package/lib/index.cjs +1 -1
- package/lib/index.mjs +1 -1
- package/package.json +2 -2
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { defineComponent as x, ref as n, computed as y, watch as h, openBlock as e, createElementBlock as t, createElementVNode as v, toDisplayString as m, normalizeClass as w } from "vue";
|
|
2
|
-
import { u as _, b, j as k, h as T, _ as B } from "./index-
|
|
2
|
+
import { u as _, b, j as k, h as T, _ as B } from "./index-C324a7kV.mjs";
|
|
3
3
|
import { codeToHtml as N } from "shiki";
|
|
4
4
|
const j = {
|
|
5
5
|
key: 0,
|
|
@@ -74,4 +74,4 @@ const j = {
|
|
|
74
74
|
export {
|
|
75
75
|
S as default
|
|
76
76
|
};
|
|
77
|
-
//# sourceMappingURL=index-
|
|
77
|
+
//# sourceMappingURL=index-5Smm2vx0.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index-
|
|
1
|
+
{"version":3,"file":"index-5Smm2vx0.mjs","sources":["../../src/renderers/Text/index.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { ref, computed, watch } from 'vue';\nimport { getLanguageFromFileName, fetchTextUtf8 } from '@eternalheart/file-preview-core';\nimport { codeToHtml } from 'shiki';\nimport { useTranslator } from '../../composables/useTranslator';\nimport { useResolvedTheme } from '../../composables/useResolvedTheme';\n\nconst props = withDefaults(defineProps<{\n url: string;\n fileName: string;\n wordWrap?: boolean;\n htmlPreview?: boolean;\n}>(), {\n wordWrap: true,\n htmlPreview: false,\n});\n\nconst { t } = useTranslator();\nconst resolvedTheme = useResolvedTheme();\n\nconst content = ref<string>('');\nconst highlighted = ref<string>('');\nconst loading = ref(true);\nconst error = ref<string | null>(null);\n\nconst language = computed(() => getLanguageFromFileName(props.fileName));\n\nconst loadText = async () => {\n loading.value = true;\n error.value = null;\n try {\n const text = await fetchTextUtf8(props.url);\n content.value = text;\n\n if (language.value !== 'text') {\n try {\n highlighted.value = await codeToHtml(text, {\n lang: language.value,\n theme: resolvedTheme.value === 'light' ? 'github-light' : 'dark-plus',\n });\n } catch {\n highlighted.value = '';\n }\n } else {\n highlighted.value = '';\n }\n } catch (err) {\n console.error(err);\n error.value = t.value('text.load_failed');\n } finally {\n loading.value = false;\n }\n};\n\nwatch(() => props.url, loadText, { immediate: true });\nwatch(resolvedTheme, () => {\n // 主题切换时重新高亮\n if (content.value && language.value !== 'text') {\n loadText();\n }\n});\n</script>\n\n<template>\n <div v-if=\"loading\" class=\"vfp-flex vfp-items-center vfp-justify-center vfp-w-full vfp-h-full\">\n <div\n class=\"vfp-w-12 vfp-h-12 vfp-border-4 vfp-border-line-strong vfp-border-t-spinner-head vfp-rounded-full vfp-animate-spin\"\n />\n </div>\n\n <div v-else-if=\"error\" class=\"vfp-flex vfp-items-center vfp-justify-center vfp-w-full vfp-h-full\">\n <div class=\"vfp-text-fg-secondary vfp-text-center\">\n <p class=\"vfp-text-lg\">{{ error }}</p>\n </div>\n </div>\n\n <!-- HTML 预览模式 -->\n <div v-else-if=\"htmlPreview && language === 'html'\" class=\"vfp-w-full vfp-h-full vfp-bg-surface-toolbar\">\n <iframe\n :srcdoc=\"content\"\n sandbox=\"allow-same-origin\"\n class=\"vfp-w-full vfp-h-full vfp-border-0\"\n :title=\"fileName\"\n />\n </div>\n\n <!-- 源码模式 -->\n <div v-else class=\"vfp-w-full vfp-h-full vfp-overflow-auto\" style=\"background: var(--fp-code-bg);\">\n <pre\n v-if=\"!highlighted\"\n class=\"vfp-p-6 vfp-text-fg-primary vfp-font-mono vfp-text-sm\"\n :class=\"wordWrap ? 'vfp-whitespace-pre-wrap vfp-break-words' : 'vfp-whitespace-pre'\"\n >{{ content }}</pre>\n <div v-else class=\"shiki-wrapper\" :class=\"{ 'no-wrap': !wordWrap }\" v-html=\"highlighted\" />\n </div>\n</template>\n\n<style scoped>\n.shiki-wrapper :deep(pre) {\n margin: 0;\n padding: 1.5rem 1.5rem 1.5rem 0;\n background: transparent !important;\n font-size: 0.875rem;\n overflow-x: auto;\n}\n.shiki-wrapper :deep(code) {\n font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace;\n counter-reset: line;\n}\n.shiki-wrapper :deep(code .line) {\n counter-increment: line;\n}\n.shiki-wrapper :deep(code .line::before) {\n content: counter(line);\n display: inline-block;\n width: 3em;\n padding-right: 1em;\n margin-right: 0.5em;\n text-align: right;\n color: var(--fp-fg-disabled);\n user-select: none;\n border-right: 1px solid var(--fp-line);\n}\n.shiki-wrapper.no-wrap :deep(code) {\n white-space: pre;\n word-break: normal;\n overflow-wrap: normal;\n}\n.shiki-wrapper:not(.no-wrap) :deep(code) {\n white-space: pre-wrap;\n word-break: break-word;\n overflow-wrap: break-word;\n}\n</style>\n"],"names":["props","__props","t","useTranslator","resolvedTheme","useResolvedTheme","content","ref","highlighted","loading","error","language","computed","getLanguageFromFileName","loadText","text","fetchTextUtf8","codeToHtml","err","watch","_openBlock","_createElementBlock","_hoisted_1","_cache","_createElementVNode","_hoisted_2","_hoisted_3","_hoisted_4","_toDisplayString","_hoisted_5","_hoisted_7","_normalizeClass"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;AAOA,UAAMA,IAAQC,GAUR,EAAE,GAAAC,EAAA,IAAMC,EAAA,GACRC,IAAgBC,EAAA,GAEhBC,IAAUC,EAAY,EAAE,GACxBC,IAAcD,EAAY,EAAE,GAC5BE,IAAUF,EAAI,EAAI,GAClBG,IAAQH,EAAmB,IAAI,GAE/BI,IAAWC,EAAS,MAAMC,EAAwBb,EAAM,QAAQ,CAAC,GAEjEc,IAAW,YAAY;AAC3B,MAAAL,EAAQ,QAAQ,IAChBC,EAAM,QAAQ;AACd,UAAI;AACF,cAAMK,IAAO,MAAMC,EAAchB,EAAM,GAAG;AAG1C,YAFAM,EAAQ,QAAQS,GAEZJ,EAAS,UAAU;AACrB,cAAI;AACF,YAAAH,EAAY,QAAQ,MAAMS,EAAWF,GAAM;AAAA,cACzC,MAAMJ,EAAS;AAAA,cACf,OAAOP,EAAc,UAAU,UAAU,iBAAiB;AAAA,YAAA,CAC3D;AAAA,UACH,QAAQ;AACN,YAAAI,EAAY,QAAQ;AAAA,UACtB;AAAA;AAEA,UAAAA,EAAY,QAAQ;AAAA,MAExB,SAASU,GAAK;AACZ,gBAAQ,MAAMA,CAAG,GACjBR,EAAM,QAAQR,EAAE,MAAM,kBAAkB;AAAA,MAC1C,UAAA;AACE,QAAAO,EAAQ,QAAQ;AAAA,MAClB;AAAA,IACF;AAEA,WAAAU,EAAM,MAAMnB,EAAM,KAAKc,GAAU,EAAE,WAAW,IAAM,GACpDK,EAAMf,GAAe,MAAM;AAEzB,MAAIE,EAAQ,SAASK,EAAS,UAAU,UACtCG,EAAA;AAAA,IAEJ,CAAC,aAIYL,EAAA,SAAXW,EAAA,GAAAC,EAIM,OAJNC,GAIM,CAAA,GAAAC,EAAA,CAAA,MAAAA,EAAA,CAAA,IAAA;AAAA,MAHJC,EAEE,OAAA,EADA,OAAM,oHAAA,GAAmH,MAAA,EAAA;AAAA,IAAA,QAI7Gd,EAAA,SAAhBU,EAAA,GAAAC,EAIM,OAJNI,GAIM;AAAA,MAHJD,EAEM,OAFNE,GAEM;AAAA,QADJF,EAAsC,KAAtCG,GAAsCC,EAAZlB,EAAA,KAAK,GAAA,CAAA;AAAA,MAAA;UAKnBT,EAAA,eAAeU,EAAA,UAAQ,UAAvCS,KAAAC,EAOM,OAPNQ,GAOM;AAAA,MANJL,EAKE,UAAA;AAAA,QAJC,QAAQlB,EAAA;AAAA,QACT,SAAQ;AAAA,QACR,OAAM;AAAA,QACL,OAAOL,EAAA;AAAA,MAAA;WAKZmB,EAAA,GAAAC,EAOM,OAPNS,GAOM;AAAA,MALKtB,EAAA,cAITa,EAA2F,OAAA;AAAA;QAA/E,OAAKU,EAAA,CAAC,iBAAe,EAAA,WAAA,CAAuB9B,EAAA,SAAA,CAAQ,CAAA;AAAA,QAAI,WAAQO,EAAA;AAAA,MAAA,yBAL5Ea,EAIoB,OAAA;AAAA;QAFlB,OAAKU,EAAA,CAAC,yDACE9B,EAAA,WAAQ,4CAAA,oBAAA,CAAA;AAAA,MAAA,KACdK,EAAA,KAAO,GAAA,CAAA;AAAA;;;"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { defineComponent as z, ref as c, watch as g, openBlock as s, createElementBlock as a, createElementVNode as v, toDisplayString as y } from "vue";
|
|
2
|
-
import { u as M, b as S, h as $, _ as D } from "./index-
|
|
2
|
+
import { u as M, b as S, h as $, _ as D } from "./index-C324a7kV.mjs";
|
|
3
3
|
import { codeToHtml as j } from "shiki";
|
|
4
4
|
const H = {
|
|
5
5
|
key: 0,
|
|
@@ -81,4 +81,4 @@ $2$3`);
|
|
|
81
81
|
export {
|
|
82
82
|
F as default
|
|
83
83
|
};
|
|
84
|
-
//# sourceMappingURL=index-
|
|
84
|
+
//# sourceMappingURL=index-BCkcZs4y.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index-
|
|
1
|
+
{"version":3,"file":"index-BCkcZs4y.mjs","sources":["../../src/renderers/Xml/index.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { ref, watch } from 'vue';\nimport { fetchTextUtf8 } from '@eternalheart/file-preview-core';\nimport { codeToHtml } from 'shiki';\nimport { useTranslator } from '../../composables/useTranslator';\nimport { useResolvedTheme } from '../../composables/useResolvedTheme';\n\nconst props = defineProps<{\n url: string;\n fileName: string;\n}>();\n\nconst { t } = useTranslator();\nconst resolvedTheme = useResolvedTheme();\n\nconst content = ref<string>('');\nconst highlighted = ref<string>('');\nconst loading = ref(true);\nconst error = ref<string | null>(null);\n\nconst indentXml = (xml: string): string => {\n const PADDING = ' ';\n const reg = /(>)(<)(\\/*)/g;\n const formatted = xml.replace(reg, '$1\\n$2$3');\n let pad = 0;\n return formatted\n .split('\\n')\n .map((line) => {\n let indent = 0;\n if (/^<\\/\\w/.test(line)) {\n pad = Math.max(pad - 1, 0);\n } else if (/^<\\w[^>]*[^/]>.*$/.test(line) && !/<.+<\\/.+>$/.test(line)) {\n indent = 1;\n }\n const padded = PADDING.repeat(pad) + line;\n pad += indent;\n return padded;\n })\n .join('\\n');\n};\n\nconst prettyPrintXml = (xml: string): string => {\n try {\n const parser = new DOMParser();\n const doc = parser.parseFromString(xml, 'application/xml');\n if (doc.querySelector('parsererror')) return xml;\n const serializer = new XMLSerializer();\n const serialized = serializer.serializeToString(doc);\n return indentXml(serialized);\n } catch {\n return xml;\n }\n};\n\nconst load = async () => {\n loading.value = true;\n error.value = null;\n try {\n const raw = await fetchTextUtf8(props.url);\n content.value = prettyPrintXml(raw);\n try {\n highlighted.value = await codeToHtml(content.value, {\n lang: 'xml',\n theme: resolvedTheme.value === 'light' ? 'github-light' : 'dark-plus',\n });\n } catch {\n highlighted.value = '';\n }\n } catch (err) {\n console.error(err);\n error.value = t.value('xml.load_failed');\n } finally {\n loading.value = false;\n }\n};\n\nwatch(() => props.url, load, { immediate: true });\nwatch(resolvedTheme, () => {\n if (content.value) load();\n});\n</script>\n\n<template>\n <div v-if=\"loading\" class=\"vfp-flex vfp-items-center vfp-justify-center vfp-w-full vfp-h-full\">\n <div\n class=\"vfp-w-12 vfp-h-12 vfp-border-4 vfp-border-line-strong vfp-border-t-spinner-head vfp-rounded-full vfp-animate-spin\"\n />\n </div>\n\n <div v-else-if=\"error\" class=\"vfp-flex vfp-items-center vfp-justify-center vfp-w-full vfp-h-full\">\n <div class=\"vfp-text-fg-secondary vfp-text-center\">\n <p class=\"vfp-text-lg\">{{ error }}</p>\n </div>\n </div>\n\n <div v-else class=\"vfp-w-full vfp-h-full vfp-overflow-auto\" style=\"background: var(--fp-code-bg);\">\n <pre\n v-if=\"!highlighted\"\n class=\"vfp-p-6 vfp-text-fg-primary vfp-font-mono vfp-text-sm vfp-whitespace-pre-wrap vfp-break-words\"\n >{{ content }}</pre\n >\n <div v-else class=\"shiki-wrapper\" v-html=\"highlighted\" />\n </div>\n</template>\n\n<style scoped>\n.shiki-wrapper :deep(pre) {\n margin: 0;\n padding: 1.5rem;\n background: transparent !important;\n font-size: 0.875rem;\n overflow-x: auto;\n}\n.shiki-wrapper :deep(code) {\n font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace;\n}\n</style>\n"],"names":["props","__props","t","useTranslator","resolvedTheme","useResolvedTheme","content","ref","highlighted","loading","error","indentXml","xml","PADDING","reg","formatted","pad","line","indent","padded","prettyPrintXml","doc","serialized","load","raw","fetchTextUtf8","codeToHtml","err","watch","_openBlock","_createElementBlock","_hoisted_1","_cache","_createElementVNode","_hoisted_2","_hoisted_3","_hoisted_4","_toDisplayString","_hoisted_5","_hoisted_6"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;AAOA,UAAMA,IAAQC,GAKR,EAAE,GAAAC,EAAA,IAAMC,EAAA,GACRC,IAAgBC,EAAA,GAEhBC,IAAUC,EAAY,EAAE,GACxBC,IAAcD,EAAY,EAAE,GAC5BE,IAAUF,EAAI,EAAI,GAClBG,IAAQH,EAAmB,IAAI,GAE/BI,IAAY,CAACC,MAAwB;AACzC,YAAMC,IAAU,MACVC,IAAM,gBACNC,IAAYH,EAAI,QAAQE,GAAK;AAAA,KAAU;AAC7C,UAAIE,IAAM;AACV,aAAOD,EACJ,MAAM;AAAA,CAAI,EACV,IAAI,CAACE,MAAS;AACb,YAAIC,IAAS;AACb,QAAI,SAAS,KAAKD,CAAI,IACpBD,IAAM,KAAK,IAAIA,IAAM,GAAG,CAAC,IAChB,oBAAoB,KAAKC,CAAI,KAAK,CAAC,aAAa,KAAKA,CAAI,MAClEC,IAAS;AAEX,cAAMC,IAASN,EAAQ,OAAOG,CAAG,IAAIC;AACrC,eAAAD,KAAOE,GACAC;AAAA,MACT,CAAC,EACA,KAAK;AAAA,CAAI;AAAA,IACd,GAEMC,IAAiB,CAACR,MAAwB;AAC9C,UAAI;AAEF,cAAMS,IADS,IAAI,UAAA,EACA,gBAAgBT,GAAK,iBAAiB;AACzD,YAAIS,EAAI,cAAc,aAAa,EAAG,QAAOT;AAE7C,cAAMU,IADa,IAAI,cAAA,EACO,kBAAkBD,CAAG;AACnD,eAAOV,EAAUW,CAAU;AAAA,MAC7B,QAAQ;AACN,eAAOV;AAAA,MACT;AAAA,IACF,GAEMW,IAAO,YAAY;AACvB,MAAAd,EAAQ,QAAQ,IAChBC,EAAM,QAAQ;AACd,UAAI;AACF,cAAMc,IAAM,MAAMC,EAAczB,EAAM,GAAG;AACzC,QAAAM,EAAQ,QAAQc,EAAeI,CAAG;AAClC,YAAI;AACF,UAAAhB,EAAY,QAAQ,MAAMkB,EAAWpB,EAAQ,OAAO;AAAA,YAClD,MAAM;AAAA,YACN,OAAOF,EAAc,UAAU,UAAU,iBAAiB;AAAA,UAAA,CAC3D;AAAA,QACH,QAAQ;AACN,UAAAI,EAAY,QAAQ;AAAA,QACtB;AAAA,MACF,SAASmB,GAAK;AACZ,gBAAQ,MAAMA,CAAG,GACjBjB,EAAM,QAAQR,EAAE,MAAM,iBAAiB;AAAA,MACzC,UAAA;AACE,QAAAO,EAAQ,QAAQ;AAAA,MAClB;AAAA,IACF;AAEA,WAAAmB,EAAM,MAAM5B,EAAM,KAAKuB,GAAM,EAAE,WAAW,IAAM,GAChDK,EAAMxB,GAAe,MAAM;AACzB,MAAIE,EAAQ,SAAOiB,EAAA;AAAA,IACrB,CAAC,aAIYd,EAAA,SAAXoB,EAAA,GAAAC,EAIM,OAJNC,GAIM,CAAA,GAAAC,EAAA,CAAA,MAAAA,EAAA,CAAA,IAAA;AAAA,MAHJC,EAEE,OAAA,EADA,OAAM,oHAAA,GAAmH,MAAA,EAAA;AAAA,IAAA,QAI7GvB,EAAA,SAAhBmB,EAAA,GAAAC,EAIM,OAJNI,GAIM;AAAA,MAHJD,EAEM,OAFNE,GAEM;AAAA,QADJF,EAAsC,KAAtCG,GAAsCC,EAAZ3B,EAAA,KAAK,GAAA,CAAA;AAAA,MAAA;WAInCmB,EAAA,GAAAC,EAOM,OAPNQ,GAOM;AAAA,MALK9B,EAAA,cAITsB,EAAyD,OAAA;AAAA;QAA7C,OAAM;AAAA,QAAgB,WAAQtB,EAAA;AAAA,MAAA,wBAL1CsB,EAIC,OAJDS,GAICF,EADK/B,EAAA,KAAO,GAAA,CAAA;AAAA;;;"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { defineComponent as U, ref as o, watch as z, onMounted as V, onBeforeUnmount as O, computed as E, openBlock as x, createElementBlock as y, normalizeStyle as Y, createElementVNode as C, createCommentVNode as k, toDisplayString as w, normalizeClass as Z } from "vue";
|
|
2
|
-
import { u as q, p as A } from "./index-
|
|
2
|
+
import { u as q, p as A } from "./index-C324a7kV.mjs";
|
|
3
3
|
const F = {
|
|
4
4
|
key: 0,
|
|
5
5
|
class: "vfp-flex vfp-items-center vfp-justify-center"
|
|
@@ -131,4 +131,4 @@ const F = {
|
|
|
131
131
|
export {
|
|
132
132
|
ne as default
|
|
133
133
|
};
|
|
134
|
-
//# sourceMappingURL=index-
|
|
134
|
+
//# sourceMappingURL=index-BM9FaQUl.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index-DUUsS_T4.mjs","sources":["../../src/renderers/Image/index.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { ref, watch, onMounted, onBeforeUnmount, computed } from 'vue';\nimport { formatFileSize } from '@eternalheart/file-preview-core';\nimport { useTranslator } from '../../composables/useTranslator';\n\nconst props = defineProps<{\n url: string;\n zoom: number;\n rotation: number;\n resetKey?: number;\n fileSize?: number;\n}>();\n\nconst emit = defineEmits<{\n (e: 'zoomChange', zoom: number): void;\n (e: 'naturalWidthChange', width: number): void;\n (e: 'naturalHeightChange', height: number): void;\n}>();\n\nconst { t } = useTranslator();\n\nconst loaded = ref(false);\nconst error = ref<string | null>(null);\nconst position = ref({ x: 0, y: 0 });\nconst isDragging = ref(false);\nlet dragStart = { x: 0, y: 0 };\nconst internalZoom = ref(1);\nconst naturalSize = ref({ width: 0, height: 0 });\n\nconst imgRef = ref<HTMLImageElement | null>(null);\nconst containerRef = ref<HTMLDivElement | null>(null);\n\nwatch(\n () => props.url,\n () => {\n loaded.value = false;\n error.value = null;\n position.value = { x: 0, y: 0 };\n internalZoom.value = 1;\n }\n);\n\nwatch(\n () => props.zoom,\n (z) => {\n internalZoom.value = z;\n }\n);\n\nwatch(\n () => props.resetKey,\n () => {\n position.value = { x: 0, y: 0 };\n }\n);\n\nconst clampPosition = (pos: { x: number; y: number }, currentZoom: number) => {\n const container = containerRef.value;\n if (!container || naturalSize.value.width === 0) return pos;\n\n const containerW = container.clientWidth;\n const containerH = container.clientHeight;\n const imgW = naturalSize.value.width * currentZoom;\n const imgH = naturalSize.value.height * currentZoom;\n\n const margin = Math.min(80, containerW * 0.15, containerH * 0.15);\n const rangeX = (containerW + imgW) / 2 - margin;\n const rangeY = (containerH + imgH) / 2 - margin;\n\n return {\n x: rangeX > 0 ? Math.max(-rangeX, Math.min(rangeX, pos.x)) : 0,\n y: rangeY > 0 ? Math.max(-rangeY, Math.min(rangeY, pos.y)) : 0,\n };\n};\n\nconst handleLoad = (e: Event) => {\n loaded.value = true;\n const img = e.currentTarget as HTMLImageElement;\n naturalSize.value = { width: img.naturalWidth, height: img.naturalHeight };\n emit('naturalWidthChange', img.naturalWidth);\n emit('naturalHeightChange', img.naturalHeight);\n};\n\nconst handleError = () => {\n error.value = t.value('image.load_failed');\n loaded.value = true;\n};\n\nconst handleDoubleClick = () => {\n position.value = { x: 0, y: 0 };\n internalZoom.value = 1;\n emit('zoomChange', 1);\n};\n\n// 鼠标滚轮缩放\nconst handleWheelNative = (e: WheelEvent) => {\n e.preventDefault();\n e.stopPropagation();\n\n const container = containerRef.value;\n if (!container) return;\n\n const rect = container.getBoundingClientRect();\n const mouseX = e.clientX - rect.left - rect.width / 2;\n const mouseY = e.clientY - rect.top - rect.height / 2;\n\n const delta = e.deltaY > 0 ? -0.05 : 0.05;\n const prev = internalZoom.value;\n const newZoom = Math.max(0.01, Math.min(10, prev + delta));\n const scale = newZoom / prev;\n\n position.value = clampPosition(\n {\n x: mouseX - scale * (mouseX - position.value.x),\n y: mouseY - scale * (mouseY - position.value.y),\n },\n newZoom\n );\n\n internalZoom.value = newZoom;\n emit('zoomChange', newZoom);\n};\n\nonMounted(() => {\n const container = containerRef.value;\n if (container) {\n container.addEventListener('wheel', handleWheelNative, { passive: false });\n }\n});\n\nonBeforeUnmount(() => {\n const container = containerRef.value;\n if (container) {\n container.removeEventListener('wheel', handleWheelNative);\n }\n});\n\nconst handleMouseDown = (e: MouseEvent) => {\n if (e.button !== 0) return;\n isDragging.value = true;\n dragStart = {\n x: e.clientX - position.value.x,\n y: e.clientY - position.value.y,\n };\n};\n\nconst handleMouseMove = (e: MouseEvent) => {\n if (!isDragging.value) return;\n position.value = clampPosition(\n {\n x: e.clientX - dragStart.x,\n y: e.clientY - dragStart.y,\n },\n internalZoom.value\n );\n};\n\nconst handleMouseUp = () => {\n isDragging.value = false;\n};\n\nconst transformStyle = computed(() => ({\n transform: `translate(${position.value.x}px, ${position.value.y}px) scale(${internalZoom.value}) rotate(${props.rotation}deg)`,\n transformOrigin: 'center',\n transition: isDragging.value ? 'none' : 'transform 0.3s ease-out',\n opacity: loaded.value ? 1 : 0,\n}));\n\nconst sizeText = computed(() => {\n if (props.fileSize == null) return '';\n return ` · ${formatFileSize(props.fileSize)}`;\n});\n</script>\n\n<template>\n <div\n ref=\"containerRef\"\n class=\"vfp-relative vfp-flex vfp-items-center vfp-justify-center vfp-w-full vfp-h-full vfp-overflow-hidden\"\n :style=\"{ cursor: isDragging ? 'grabbing' : 'grab' }\"\n @mousedown=\"handleMouseDown\"\n @mousemove=\"handleMouseMove\"\n @mouseup=\"handleMouseUp\"\n @mouseleave=\"handleMouseUp\"\n >\n <div v-if=\"!loaded && !error\" class=\"vfp-flex vfp-items-center vfp-justify-center\">\n <div\n class=\"vfp-w-12 vfp-h-12 vfp-border-4 vfp-border-line-strong vfp-border-t-spinner-head vfp-rounded-full vfp-animate-spin\"\n />\n </div>\n\n <div v-if=\"error\" class=\"vfp-text-fg-secondary vfp-text-center\">\n <p class=\"vfp-text-lg\">{{ error }}</p>\n </div>\n\n <img\n ref=\"imgRef\"\n :src=\"url\"\n alt=\"Preview\"\n :class=\"['vfp-max-w-none vfp-select-none', !loaded && 'vfp-hidden']\"\n :style=\"transformStyle\"\n :draggable=\"false\"\n @load=\"handleLoad\"\n @error=\"handleError\"\n @dblclick=\"handleDoubleClick\"\n />\n\n <div\n v-if=\"loaded && !error && naturalSize.width > 0\"\n class=\"vfp-absolute vfp-bottom-2 vfp-right-3 vfp-text-[10px] vfp-text-fg-disabled hover:vfp-text-fg-secondary vfp-transition-colors vfp-pointer-events-auto vfp-select-none vfp-cursor-default\"\n >\n {{ naturalSize.width }} × {{ naturalSize.height }}{{ sizeText }}\n </div>\n </div>\n</template>\n"],"names":["props","__props","emit","__emit","t","useTranslator","loaded","ref","error","position","isDragging","dragStart","internalZoom","naturalSize","imgRef","containerRef","watch","z","clampPosition","pos","currentZoom","container","containerW","containerH","imgW","imgH","margin","rangeX","rangeY","handleLoad","img","handleError","handleDoubleClick","handleWheelNative","rect","mouseX","mouseY","delta","prev","newZoom","scale","onMounted","onBeforeUnmount","handleMouseDown","handleMouseMove","handleMouseUp","transformStyle","computed","sizeText","formatFileSize","_createElementBlock","_openBlock","_hoisted_1","_cache","_createElementVNode","_hoisted_2","_hoisted_3","_toDisplayString","_hoisted_5"],"mappings":";;;;;;;;;;;;;;;;;;;;;;AAKA,UAAMA,IAAQC,GAQRC,IAAOC,GAMP,EAAE,GAAAC,EAAA,IAAMC,EAAA,GAERC,IAASC,EAAI,EAAK,GAClBC,IAAQD,EAAmB,IAAI,GAC/BE,IAAWF,EAAI,EAAE,GAAG,GAAG,GAAG,GAAG,GAC7BG,IAAaH,EAAI,EAAK;AAC5B,QAAII,IAAY,EAAE,GAAG,GAAG,GAAG,EAAA;AAC3B,UAAMC,IAAeL,EAAI,CAAC,GACpBM,IAAcN,EAAI,EAAE,OAAO,GAAG,QAAQ,GAAG,GAEzCO,IAASP,EAA6B,IAAI,GAC1CQ,IAAeR,EAA2B,IAAI;AAEpD,IAAAS;AAAA,MACE,MAAMhB,EAAM;AAAA,MACZ,MAAM;AACJ,QAAAM,EAAO,QAAQ,IACfE,EAAM,QAAQ,MACdC,EAAS,QAAQ,EAAE,GAAG,GAAG,GAAG,EAAA,GAC5BG,EAAa,QAAQ;AAAA,MACvB;AAAA,IAAA,GAGFI;AAAA,MACE,MAAMhB,EAAM;AAAA,MACZ,CAACiB,MAAM;AACL,QAAAL,EAAa,QAAQK;AAAA,MACvB;AAAA,IAAA,GAGFD;AAAA,MACE,MAAMhB,EAAM;AAAA,MACZ,MAAM;AACJ,QAAAS,EAAS,QAAQ,EAAE,GAAG,GAAG,GAAG,EAAA;AAAA,MAC9B;AAAA,IAAA;AAGF,UAAMS,IAAgB,CAACC,GAA+BC,MAAwB;AAC5E,YAAMC,IAAYN,EAAa;AAC/B,UAAI,CAACM,KAAaR,EAAY,MAAM,UAAU,EAAG,QAAOM;AAExD,YAAMG,IAAaD,EAAU,aACvBE,IAAaF,EAAU,cACvBG,IAAOX,EAAY,MAAM,QAAQO,GACjCK,IAAOZ,EAAY,MAAM,SAASO,GAElCM,IAAS,KAAK,IAAI,IAAIJ,IAAa,MAAMC,IAAa,IAAI,GAC1DI,KAAUL,IAAaE,KAAQ,IAAIE,GACnCE,KAAUL,IAAaE,KAAQ,IAAIC;AAEzC,aAAO;AAAA,QACL,GAAGC,IAAS,IAAI,KAAK,IAAI,CAACA,GAAQ,KAAK,IAAIA,GAAQR,EAAI,CAAC,CAAC,IAAI;AAAA,QAC7D,GAAGS,IAAS,IAAI,KAAK,IAAI,CAACA,GAAQ,KAAK,IAAIA,GAAQT,EAAI,CAAC,CAAC,IAAI;AAAA,MAAA;AAAA,IAEjE,GAEMU,IAAa,CAAC,MAAa;AAC/B,MAAAvB,EAAO,QAAQ;AACf,YAAMwB,IAAM,EAAE;AACd,MAAAjB,EAAY,QAAQ,EAAE,OAAOiB,EAAI,cAAc,QAAQA,EAAI,cAAA,GAC3D5B,EAAK,sBAAsB4B,EAAI,YAAY,GAC3C5B,EAAK,uBAAuB4B,EAAI,aAAa;AAAA,IAC/C,GAEMC,IAAc,MAAM;AACxB,MAAAvB,EAAM,QAAQJ,EAAE,MAAM,mBAAmB,GACzCE,EAAO,QAAQ;AAAA,IACjB,GAEM0B,IAAoB,MAAM;AAC9B,MAAAvB,EAAS,QAAQ,EAAE,GAAG,GAAG,GAAG,EAAA,GAC5BG,EAAa,QAAQ,GACrBV,EAAK,cAAc,CAAC;AAAA,IACtB,GAGM+B,IAAoB,CAAC,MAAkB;AAC3C,QAAE,eAAA,GACF,EAAE,gBAAA;AAEF,YAAMZ,IAAYN,EAAa;AAC/B,UAAI,CAACM,EAAW;AAEhB,YAAMa,IAAOb,EAAU,sBAAA,GACjBc,IAAS,EAAE,UAAUD,EAAK,OAAOA,EAAK,QAAQ,GAC9CE,IAAS,EAAE,UAAUF,EAAK,MAAMA,EAAK,SAAS,GAE9CG,IAAQ,EAAE,SAAS,IAAI,QAAQ,MAC/BC,IAAO1B,EAAa,OACpB2B,IAAU,KAAK,IAAI,MAAM,KAAK,IAAI,IAAID,IAAOD,CAAK,CAAC,GACnDG,IAAQD,IAAUD;AAExB,MAAA7B,EAAS,QAAQS;AAAA,QACf;AAAA,UACE,GAAGiB,IAASK,KAASL,IAAS1B,EAAS,MAAM;AAAA,UAC7C,GAAG2B,IAASI,KAASJ,IAAS3B,EAAS,MAAM;AAAA,QAAA;AAAA,QAE/C8B;AAAA,MAAA,GAGF3B,EAAa,QAAQ2B,GACrBrC,EAAK,cAAcqC,CAAO;AAAA,IAC5B;AAEA,IAAAE,EAAU,MAAM;AACd,YAAMpB,IAAYN,EAAa;AAC/B,MAAIM,KACFA,EAAU,iBAAiB,SAASY,GAAmB,EAAE,SAAS,IAAO;AAAA,IAE7E,CAAC,GAEDS,EAAgB,MAAM;AACpB,YAAMrB,IAAYN,EAAa;AAC/B,MAAIM,KACFA,EAAU,oBAAoB,SAASY,CAAiB;AAAA,IAE5D,CAAC;AAED,UAAMU,IAAkB,CAAC,MAAkB;AACzC,MAAI,EAAE,WAAW,MACjBjC,EAAW,QAAQ,IACnBC,IAAY;AAAA,QACV,GAAG,EAAE,UAAUF,EAAS,MAAM;AAAA,QAC9B,GAAG,EAAE,UAAUA,EAAS,MAAM;AAAA,MAAA;AAAA,IAElC,GAEMmC,IAAkB,CAAC,MAAkB;AACzC,MAAKlC,EAAW,UAChBD,EAAS,QAAQS;AAAA,QACf;AAAA,UACE,GAAG,EAAE,UAAUP,EAAU;AAAA,UACzB,GAAG,EAAE,UAAUA,EAAU;AAAA,QAAA;AAAA,QAE3BC,EAAa;AAAA,MAAA;AAAA,IAEjB,GAEMiC,IAAgB,MAAM;AAC1B,MAAAnC,EAAW,QAAQ;AAAA,IACrB,GAEMoC,IAAiBC,EAAS,OAAO;AAAA,MACrC,WAAW,aAAatC,EAAS,MAAM,CAAC,OAAOA,EAAS,MAAM,CAAC,aAAaG,EAAa,KAAK,YAAYZ,EAAM,QAAQ;AAAA,MACxH,iBAAiB;AAAA,MACjB,YAAYU,EAAW,QAAQ,SAAS;AAAA,MACxC,SAASJ,EAAO,QAAQ,IAAI;AAAA,IAAA,EAC5B,GAEI0C,IAAWD,EAAS,MACpB/C,EAAM,YAAY,OAAa,KAC5B,MAAMiD,EAAejD,EAAM,QAAQ,CAAC,EAC5C;2BAICkD,EAqCM,OAAA;AAAA,eApCA;AAAA,MAAJ,KAAInC;AAAA,MACJ,OAAM;AAAA,MACL,mBAAiBL,EAAA,QAAU,aAAA,QAAA;AAAA,MAC3B,aAAWiC;AAAA,MACX,aAAWC;AAAA,MACX,WAASC;AAAA,MACT,cAAYA;AAAA,IAAA;MAED,CAAAvC,EAAA,UAAWE,EAAA,SAAvB2C,KAAAD,EAIM,OAJNE,GAIM,CAAA,GAAAC,EAAA,CAAA,MAAAA,EAAA,CAAA,IAAA;AAAA,QAHJC,EAEE,OAAA,EADA,OAAM,oHAAA,GAAmH,MAAA,EAAA;AAAA,MAAA;MAIlH9C,EAAA,SAAX2C,EAAA,GAAAD,EAEM,OAFNK,GAEM;AAAA,QADJD,EAAsC,KAAtCE,GAAsCC,EAAZjD,EAAA,KAAK,GAAA,CAAA;AAAA,MAAA;MAGjC8C,EAUE,OAAA;AAAA,iBATI;AAAA,QAAJ,KAAIxC;AAAA,QACH,KAAKb,EAAA;AAAA,QACN,KAAI;AAAA,QACH,6CAA2CK,EAAA,SAAM,YAAA,CAAA;AAAA,QACjD,SAAOwC,EAAA,KAAc;AAAA,QACrB,WAAW;AAAA,QACX,QAAMjB;AAAA,QACN,SAAOE;AAAA,QACP,YAAUC;AAAA,MAAA;MAIL1B,EAAA,SAAM,CAAKE,EAAA,SAASK,EAAA,MAAY,QAAK,KAD7CsC,EAAA,GAAAD,EAKM,OALNQ,GAKMD,EADD5C,EAAA,MAAY,KAAK,IAAG,QAAG4C,EAAG5C,EAAA,MAAY,MAAM,MAAMmC,EAAA,KAAQ,GAAA,CAAA;;;;"}
|
|
1
|
+
{"version":3,"file":"index-BM9FaQUl.mjs","sources":["../../src/renderers/Image/index.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { ref, watch, onMounted, onBeforeUnmount, computed } from 'vue';\nimport { formatFileSize } from '@eternalheart/file-preview-core';\nimport { useTranslator } from '../../composables/useTranslator';\n\nconst props = defineProps<{\n url: string;\n zoom: number;\n rotation: number;\n resetKey?: number;\n fileSize?: number;\n}>();\n\nconst emit = defineEmits<{\n (e: 'zoomChange', zoom: number): void;\n (e: 'naturalWidthChange', width: number): void;\n (e: 'naturalHeightChange', height: number): void;\n}>();\n\nconst { t } = useTranslator();\n\nconst loaded = ref(false);\nconst error = ref<string | null>(null);\nconst position = ref({ x: 0, y: 0 });\nconst isDragging = ref(false);\nlet dragStart = { x: 0, y: 0 };\nconst internalZoom = ref(1);\nconst naturalSize = ref({ width: 0, height: 0 });\n\nconst imgRef = ref<HTMLImageElement | null>(null);\nconst containerRef = ref<HTMLDivElement | null>(null);\n\nwatch(\n () => props.url,\n () => {\n loaded.value = false;\n error.value = null;\n position.value = { x: 0, y: 0 };\n internalZoom.value = 1;\n }\n);\n\nwatch(\n () => props.zoom,\n (z) => {\n internalZoom.value = z;\n }\n);\n\nwatch(\n () => props.resetKey,\n () => {\n position.value = { x: 0, y: 0 };\n }\n);\n\nconst clampPosition = (pos: { x: number; y: number }, currentZoom: number) => {\n const container = containerRef.value;\n if (!container || naturalSize.value.width === 0) return pos;\n\n const containerW = container.clientWidth;\n const containerH = container.clientHeight;\n const imgW = naturalSize.value.width * currentZoom;\n const imgH = naturalSize.value.height * currentZoom;\n\n const margin = Math.min(80, containerW * 0.15, containerH * 0.15);\n const rangeX = (containerW + imgW) / 2 - margin;\n const rangeY = (containerH + imgH) / 2 - margin;\n\n return {\n x: rangeX > 0 ? Math.max(-rangeX, Math.min(rangeX, pos.x)) : 0,\n y: rangeY > 0 ? Math.max(-rangeY, Math.min(rangeY, pos.y)) : 0,\n };\n};\n\nconst handleLoad = (e: Event) => {\n loaded.value = true;\n const img = e.currentTarget as HTMLImageElement;\n naturalSize.value = { width: img.naturalWidth, height: img.naturalHeight };\n emit('naturalWidthChange', img.naturalWidth);\n emit('naturalHeightChange', img.naturalHeight);\n};\n\nconst handleError = () => {\n error.value = t.value('image.load_failed');\n loaded.value = true;\n};\n\nconst handleDoubleClick = () => {\n position.value = { x: 0, y: 0 };\n internalZoom.value = 1;\n emit('zoomChange', 1);\n};\n\n// 鼠标滚轮缩放\nconst handleWheelNative = (e: WheelEvent) => {\n e.preventDefault();\n e.stopPropagation();\n\n const container = containerRef.value;\n if (!container) return;\n\n const rect = container.getBoundingClientRect();\n const mouseX = e.clientX - rect.left - rect.width / 2;\n const mouseY = e.clientY - rect.top - rect.height / 2;\n\n const delta = e.deltaY > 0 ? -0.05 : 0.05;\n const prev = internalZoom.value;\n const newZoom = Math.max(0.01, Math.min(10, prev + delta));\n const scale = newZoom / prev;\n\n position.value = clampPosition(\n {\n x: mouseX - scale * (mouseX - position.value.x),\n y: mouseY - scale * (mouseY - position.value.y),\n },\n newZoom\n );\n\n internalZoom.value = newZoom;\n emit('zoomChange', newZoom);\n};\n\nonMounted(() => {\n const container = containerRef.value;\n if (container) {\n container.addEventListener('wheel', handleWheelNative, { passive: false });\n }\n});\n\nonBeforeUnmount(() => {\n const container = containerRef.value;\n if (container) {\n container.removeEventListener('wheel', handleWheelNative);\n }\n});\n\nconst handleMouseDown = (e: MouseEvent) => {\n if (e.button !== 0) return;\n isDragging.value = true;\n dragStart = {\n x: e.clientX - position.value.x,\n y: e.clientY - position.value.y,\n };\n};\n\nconst handleMouseMove = (e: MouseEvent) => {\n if (!isDragging.value) return;\n position.value = clampPosition(\n {\n x: e.clientX - dragStart.x,\n y: e.clientY - dragStart.y,\n },\n internalZoom.value\n );\n};\n\nconst handleMouseUp = () => {\n isDragging.value = false;\n};\n\nconst transformStyle = computed(() => ({\n transform: `translate(${position.value.x}px, ${position.value.y}px) scale(${internalZoom.value}) rotate(${props.rotation}deg)`,\n transformOrigin: 'center',\n transition: isDragging.value ? 'none' : 'transform 0.3s ease-out',\n opacity: loaded.value ? 1 : 0,\n}));\n\nconst sizeText = computed(() => {\n if (props.fileSize == null) return '';\n return ` · ${formatFileSize(props.fileSize)}`;\n});\n</script>\n\n<template>\n <div\n ref=\"containerRef\"\n class=\"vfp-relative vfp-flex vfp-items-center vfp-justify-center vfp-w-full vfp-h-full vfp-overflow-hidden\"\n :style=\"{ cursor: isDragging ? 'grabbing' : 'grab' }\"\n @mousedown=\"handleMouseDown\"\n @mousemove=\"handleMouseMove\"\n @mouseup=\"handleMouseUp\"\n @mouseleave=\"handleMouseUp\"\n >\n <div v-if=\"!loaded && !error\" class=\"vfp-flex vfp-items-center vfp-justify-center\">\n <div\n class=\"vfp-w-12 vfp-h-12 vfp-border-4 vfp-border-line-strong vfp-border-t-spinner-head vfp-rounded-full vfp-animate-spin\"\n />\n </div>\n\n <div v-if=\"error\" class=\"vfp-text-fg-secondary vfp-text-center\">\n <p class=\"vfp-text-lg\">{{ error }}</p>\n </div>\n\n <img\n ref=\"imgRef\"\n :src=\"url\"\n alt=\"Preview\"\n :class=\"['vfp-max-w-none vfp-select-none', !loaded && 'vfp-hidden']\"\n :style=\"transformStyle\"\n :draggable=\"false\"\n @load=\"handleLoad\"\n @error=\"handleError\"\n @dblclick=\"handleDoubleClick\"\n />\n\n <div\n v-if=\"loaded && !error && naturalSize.width > 0\"\n class=\"vfp-absolute vfp-bottom-2 vfp-right-3 vfp-text-[10px] vfp-text-fg-disabled hover:vfp-text-fg-secondary vfp-transition-colors vfp-pointer-events-auto vfp-select-none vfp-cursor-default\"\n >\n {{ naturalSize.width }} × {{ naturalSize.height }}{{ sizeText }}\n </div>\n </div>\n</template>\n"],"names":["props","__props","emit","__emit","t","useTranslator","loaded","ref","error","position","isDragging","dragStart","internalZoom","naturalSize","imgRef","containerRef","watch","z","clampPosition","pos","currentZoom","container","containerW","containerH","imgW","imgH","margin","rangeX","rangeY","handleLoad","img","handleError","handleDoubleClick","handleWheelNative","rect","mouseX","mouseY","delta","prev","newZoom","scale","onMounted","onBeforeUnmount","handleMouseDown","handleMouseMove","handleMouseUp","transformStyle","computed","sizeText","formatFileSize","_createElementBlock","_openBlock","_hoisted_1","_cache","_createElementVNode","_hoisted_2","_hoisted_3","_toDisplayString","_hoisted_5"],"mappings":"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"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { defineComponent as C, ref as y, onMounted as P, watch as W, onBeforeUnmount as R, openBlock as g, createElementBlock as b, createElementVNode as f, toDisplayString as E, unref as T, createCommentVNode as k, createVNode as j, normalizeStyle as L } from "vue";
|
|
2
2
|
import { Presentation as N } from "lucide-vue-next";
|
|
3
3
|
import { init as D } from "pptx-preview";
|
|
4
|
-
import { u as S } from "./index-
|
|
4
|
+
import { u as S } from "./index-C324a7kV.mjs";
|
|
5
5
|
const V = { class: "vfp-relative vfp-flex vfp-flex-col vfp-items-center vfp-w-full vfp-h-full" }, q = {
|
|
6
6
|
key: 0,
|
|
7
7
|
class: "vfp-absolute vfp-inset-0 vfp-flex vfp-items-center vfp-justify-center vfp-bg-surface-toolbar vfp-backdrop-blur-sm vfp-z-10"
|
|
@@ -149,4 +149,4 @@ const V = { class: "vfp-relative vfp-flex vfp-flex-col vfp-items-center vfp-w-fu
|
|
|
149
149
|
export {
|
|
150
150
|
Y as default
|
|
151
151
|
};
|
|
152
|
-
//# sourceMappingURL=index-
|
|
152
|
+
//# sourceMappingURL=index-BYzQg-jL.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index-CcJ5NmY1.mjs","sources":["../../src/renderers/Pptx/index.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { ref, watch, onMounted, onBeforeUnmount } from 'vue';\nimport { Presentation } from 'lucide-vue-next';\nimport { init } from 'pptx-preview';\nimport { useTranslator } from '../../composables/useTranslator';\n\nconst props = withDefaults(\n defineProps<{\n url: string;\n tiled?: boolean;\n }>(),\n { tiled: true }\n);\n\nconst { t } = useTranslator();\n\nconst loading = ref(true);\nconst error = ref<string | null>(null);\nconst slideCount = ref(0);\nconst containerRef = ref<HTMLDivElement | null>(null);\nlet previewer: ReturnType<typeof init> | null = null;\nlet resizeObserver: ResizeObserver | null = null;\nlet arrayBufferRef: ArrayBuffer | null = null;\nlet resizeTimeout: number | null = null;\nlet lastDimensions = { width: 0, height: 0 };\n\nconst calculateDimensions = () => {\n if (!containerRef.value) return { width: 960, height: 540 };\n const rawWidth = containerRef.value.clientWidth;\n const parentWidth = containerRef.value.parentElement?.clientWidth || 0;\n const containerWidth = rawWidth > 100 ? rawWidth : parentWidth > 100 ? parentWidth : 300;\n const height = Math.floor((containerWidth * 9) / 16);\n return { width: containerWidth, height };\n};\n\nconst reinitializePreviewer = async () => {\n if (!containerRef.value || !arrayBufferRef || slideCount.value === 0) return;\n\n try {\n if (previewer) {\n try {\n previewer.destroy();\n } catch {\n // ignore\n }\n }\n\n containerRef.value.innerHTML = '';\n\n const currentDimensions = calculateDimensions();\n previewer = init(containerRef.value, {\n width: currentDimensions.width,\n height: props.tiled ? currentDimensions.height * slideCount.value : currentDimensions.height,\n mode: props.tiled ? 'list' : 'slide',\n });\n\n await previewer.preview(arrayBufferRef);\n } catch {\n // 静默处理\n }\n};\n\nconst loadPptx = async () => {\n if (!containerRef.value) return;\n\n loading.value = true;\n error.value = null;\n\n let timeoutId: number | null = window.setTimeout(() => {\n error.value = t.value('pptx.timeout');\n loading.value = false;\n }, 30000);\n\n try {\n const response = await fetch(props.url, {\n mode: 'cors',\n credentials: 'omit',\n redirect: 'follow',\n });\n\n if (!response.ok) {\n if (response.status === 404) throw new Error(t.value('pptx.not_found'));\n if (response.status === 403) throw new Error('无权限访问此文件');\n if (response.status >= 500) throw new Error('服务器错误,请稍后重试');\n throw new Error(`文件加载失败 (${response.status})`);\n }\n\n const arrayBuffer = await response.arrayBuffer();\n if (arrayBuffer.byteLength === 0) throw new Error('文件为空');\n\n arrayBufferRef = arrayBuffer;\n\n // 步骤 1: 创建隐藏容器获取 slideCount\n const hiddenContainer = document.createElement('div');\n hiddenContainer.style.cssText = 'position:absolute;left:-9999px;top:-9999px;visibility:hidden';\n document.body.appendChild(hiddenContainer);\n\n try {\n const tempPreviewer = init(hiddenContainer, {\n width: 100,\n height: 100,\n mode: 'slide',\n });\n\n try {\n await tempPreviewer.preview(arrayBuffer);\n } catch {\n throw new Error(t.value('pptx.invalid_format'));\n }\n\n const count = tempPreviewer.slideCount;\n if (!count || count === 0) throw new Error(t.value('pptx.no_pages'));\n\n tempPreviewer.destroy();\n\n slideCount.value = count;\n\n if (containerRef.value) {\n containerRef.value.innerHTML = '';\n }\n\n const currentDimensions = calculateDimensions();\n previewer = init(containerRef.value, {\n width: currentDimensions.width,\n height: props.tiled ? currentDimensions.height * count : currentDimensions.height,\n mode: props.tiled ? 'list' : 'slide',\n });\n\n await previewer.preview(arrayBuffer);\n\n if (timeoutId !== null) {\n clearTimeout(timeoutId);\n timeoutId = null;\n }\n\n loading.value = false;\n } finally {\n if (document.body.contains(hiddenContainer)) {\n document.body.removeChild(hiddenContainer);\n }\n }\n } catch (err) {\n if (timeoutId !== null) clearTimeout(timeoutId);\n let errorMsg = t.value('pptx.parse_failed');\n if (err instanceof Error) errorMsg = err.message;\n else if (typeof err === 'string') errorMsg = err;\n error.value = errorMsg;\n loading.value = false;\n }\n};\n\nonMounted(() => {\n if (!containerRef.value) return;\n\n let isInitialRender = true;\n\n resizeObserver = new ResizeObserver(() => {\n if (isInitialRender) {\n isInitialRender = false;\n lastDimensions = calculateDimensions();\n return;\n }\n\n const newDimensions = calculateDimensions();\n const widthDiff = Math.abs(lastDimensions.width - newDimensions.width);\n const heightDiff = Math.abs(lastDimensions.height - newDimensions.height);\n\n if (widthDiff < 10 && heightDiff < 10) return;\n\n lastDimensions = newDimensions;\n\n if (resizeTimeout !== null) clearTimeout(resizeTimeout);\n\n resizeTimeout = window.setTimeout(() => {\n if (previewer && arrayBufferRef) reinitializePreviewer();\n }, 800);\n });\n\n resizeObserver.observe(containerRef.value);\n\n setTimeout(() => {\n requestAnimationFrame(() => requestAnimationFrame(() => loadPptx()));\n }, 150);\n});\n\nwatch(\n () => props.url,\n () => {\n loadPptx();\n }\n);\n\nonBeforeUnmount(() => {\n if (resizeObserver) resizeObserver.disconnect();\n if (resizeTimeout !== null) clearTimeout(resizeTimeout);\n arrayBufferRef = null;\n slideCount.value = 0;\n if (previewer) {\n try {\n previewer.destroy();\n } catch {\n // ignore\n }\n }\n previewer = null;\n});\n</script>\n\n<template>\n <div class=\"vfp-relative vfp-flex vfp-flex-col vfp-items-center vfp-w-full vfp-h-full\">\n <div\n v-if=\"loading\"\n class=\"vfp-absolute vfp-inset-0 vfp-flex vfp-items-center vfp-justify-center vfp-bg-surface-toolbar vfp-backdrop-blur-sm vfp-z-10\"\n >\n <div class=\"vfp-text-center\">\n <div\n class=\"vfp-w-10 vfp-h-10 md:vfp-w-12 md:vfp-h-12 vfp-mx-auto vfp-mb-3 vfp-border-4 vfp-border-line-strong vfp-border-t-spinner-head vfp-rounded-full vfp-animate-spin\"\n />\n <p class=\"vfp-text-xs md:vfp-text-sm vfp-text-fg-secondary vfp-font-medium\">{{ t('pptx.loading') }}</p>\n </div>\n </div>\n\n <div\n v-if=\"error && !loading\"\n class=\"vfp-absolute vfp-inset-0 vfp-flex vfp-items-center vfp-justify-center vfp-bg-surface-toolbar vfp-backdrop-blur-sm vfp-z-10\"\n >\n <div class=\"vfp-text-center vfp-max-w-sm md:vfp-max-w-md vfp-px-4\">\n <div\n class=\"vfp-w-24 vfp-h-24 md:vfp-w-32 md:vfp-h-32 vfp-mx-auto vfp-mb-4 md:vfp-mb-6 vfp-rounded-2xl md:vfp-rounded-3xl vfp-bg-gradient-to-br vfp-from-orange-500 vfp-via-red-500 vfp-to-pink-500 vfp-flex vfp-items-center vfp-justify-center vfp-shadow-2xl\"\n >\n <Presentation class=\"vfp-w-12 vfp-h-12 md:vfp-w-16 md:vfp-h-16 vfp-text-fg-primary\" />\n </div>\n <p class=\"vfp-text-lg md:vfp-text-xl vfp-text-fg-primary vfp-mb-2 md:vfp-mb-3 vfp-font-medium\">\n {{ t('pptx.load_failed') }}\n </p>\n <p class=\"vfp-text-xs md:vfp-text-sm vfp-text-fg-tertiary vfp-mb-4 md:vfp-mb-6\">{{ error }}</p>\n <a\n :href=\"url\"\n download\n class=\"vfp-inline-flex vfp-items-center vfp-gap-2 vfp-px-4 vfp-py-2 md:vfp-px-6 md:vfp-py-3 vfp-bg-gradient-to-r vfp-from-purple-500 vfp-to-pink-500 vfp-text-fg-primary vfp-text-sm md:vfp-text-base vfp-rounded-lg md:vfp-rounded-xl hover:vfp-scale-105 vfp-transition-all vfp-shadow-lg\"\n >\n 下载文件\n </a>\n <p class=\"vfp-text-xs vfp-text-fg-muted vfp-mt-3 md:vfp-mt-4\">\n 提示:可以使用 Microsoft PowerPoint 或 WPS 打开\n </p>\n </div>\n </div>\n\n <div\n v-if=\"!error\"\n ref=\"containerRef\"\n class=\"pptx-wrapper vfp-w-full vfp-max-w-full md:vfp-max-w-6xl\"\n :style=\"{ opacity: loading ? 0 : 1 }\"\n />\n </div>\n</template>\n"],"names":["props","__props","t","useTranslator","loading","ref","error","slideCount","containerRef","previewer","resizeObserver","arrayBufferRef","resizeTimeout","lastDimensions","calculateDimensions","rawWidth","parentWidth","_a","containerWidth","height","reinitializePreviewer","currentDimensions","init","loadPptx","timeoutId","response","arrayBuffer","hiddenContainer","tempPreviewer","count","err","errorMsg","onMounted","isInitialRender","newDimensions","widthDiff","heightDiff","watch","onBeforeUnmount","_openBlock","_createElementBlock","_hoisted_1","_hoisted_2","_createElementVNode","_hoisted_3","_hoisted_4","_toDisplayString","_unref","_hoisted_5","_hoisted_6","_hoisted_7","_createVNode","Presentation","_hoisted_8","_hoisted_9","_hoisted_10","_cache"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index-BYzQg-jL.mjs","sources":["../../src/renderers/Pptx/index.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { ref, watch, onMounted, onBeforeUnmount } from 'vue';\nimport { Presentation } from 'lucide-vue-next';\nimport { init } from 'pptx-preview';\nimport { useTranslator } from '../../composables/useTranslator';\n\nconst props = withDefaults(\n defineProps<{\n url: string;\n tiled?: boolean;\n }>(),\n { tiled: true }\n);\n\nconst { t } = useTranslator();\n\nconst loading = ref(true);\nconst error = ref<string | null>(null);\nconst slideCount = ref(0);\nconst containerRef = ref<HTMLDivElement | null>(null);\nlet previewer: ReturnType<typeof init> | null = null;\nlet resizeObserver: ResizeObserver | null = null;\nlet arrayBufferRef: ArrayBuffer | null = null;\nlet resizeTimeout: number | null = null;\nlet lastDimensions = { width: 0, height: 0 };\n\nconst calculateDimensions = () => {\n if (!containerRef.value) return { width: 960, height: 540 };\n const rawWidth = containerRef.value.clientWidth;\n const parentWidth = containerRef.value.parentElement?.clientWidth || 0;\n const containerWidth = rawWidth > 100 ? rawWidth : parentWidth > 100 ? parentWidth : 300;\n const height = Math.floor((containerWidth * 9) / 16);\n return { width: containerWidth, height };\n};\n\nconst reinitializePreviewer = async () => {\n if (!containerRef.value || !arrayBufferRef || slideCount.value === 0) return;\n\n try {\n if (previewer) {\n try {\n previewer.destroy();\n } catch {\n // ignore\n }\n }\n\n containerRef.value.innerHTML = '';\n\n const currentDimensions = calculateDimensions();\n previewer = init(containerRef.value, {\n width: currentDimensions.width,\n height: props.tiled ? currentDimensions.height * slideCount.value : currentDimensions.height,\n mode: props.tiled ? 'list' : 'slide',\n });\n\n await previewer.preview(arrayBufferRef);\n } catch {\n // 静默处理\n }\n};\n\nconst loadPptx = async () => {\n if (!containerRef.value) return;\n\n loading.value = true;\n error.value = null;\n\n let timeoutId: number | null = window.setTimeout(() => {\n error.value = t.value('pptx.timeout');\n loading.value = false;\n }, 30000);\n\n try {\n const response = await fetch(props.url, {\n mode: 'cors',\n credentials: 'omit',\n redirect: 'follow',\n });\n\n if (!response.ok) {\n if (response.status === 404) throw new Error(t.value('pptx.not_found'));\n if (response.status === 403) throw new Error('无权限访问此文件');\n if (response.status >= 500) throw new Error('服务器错误,请稍后重试');\n throw new Error(`文件加载失败 (${response.status})`);\n }\n\n const arrayBuffer = await response.arrayBuffer();\n if (arrayBuffer.byteLength === 0) throw new Error('文件为空');\n\n arrayBufferRef = arrayBuffer;\n\n // 步骤 1: 创建隐藏容器获取 slideCount\n const hiddenContainer = document.createElement('div');\n hiddenContainer.style.cssText = 'position:absolute;left:-9999px;top:-9999px;visibility:hidden';\n document.body.appendChild(hiddenContainer);\n\n try {\n const tempPreviewer = init(hiddenContainer, {\n width: 100,\n height: 100,\n mode: 'slide',\n });\n\n try {\n await tempPreviewer.preview(arrayBuffer);\n } catch {\n throw new Error(t.value('pptx.invalid_format'));\n }\n\n const count = tempPreviewer.slideCount;\n if (!count || count === 0) throw new Error(t.value('pptx.no_pages'));\n\n tempPreviewer.destroy();\n\n slideCount.value = count;\n\n if (containerRef.value) {\n containerRef.value.innerHTML = '';\n }\n\n const currentDimensions = calculateDimensions();\n previewer = init(containerRef.value, {\n width: currentDimensions.width,\n height: props.tiled ? currentDimensions.height * count : currentDimensions.height,\n mode: props.tiled ? 'list' : 'slide',\n });\n\n await previewer.preview(arrayBuffer);\n\n if (timeoutId !== null) {\n clearTimeout(timeoutId);\n timeoutId = null;\n }\n\n loading.value = false;\n } finally {\n if (document.body.contains(hiddenContainer)) {\n document.body.removeChild(hiddenContainer);\n }\n }\n } catch (err) {\n if (timeoutId !== null) clearTimeout(timeoutId);\n let errorMsg = t.value('pptx.parse_failed');\n if (err instanceof Error) errorMsg = err.message;\n else if (typeof err === 'string') errorMsg = err;\n error.value = errorMsg;\n loading.value = false;\n }\n};\n\nonMounted(() => {\n if (!containerRef.value) return;\n\n let isInitialRender = true;\n\n resizeObserver = new ResizeObserver(() => {\n if (isInitialRender) {\n isInitialRender = false;\n lastDimensions = calculateDimensions();\n return;\n }\n\n const newDimensions = calculateDimensions();\n const widthDiff = Math.abs(lastDimensions.width - newDimensions.width);\n const heightDiff = Math.abs(lastDimensions.height - newDimensions.height);\n\n if (widthDiff < 10 && heightDiff < 10) return;\n\n lastDimensions = newDimensions;\n\n if (resizeTimeout !== null) clearTimeout(resizeTimeout);\n\n resizeTimeout = window.setTimeout(() => {\n if (previewer && arrayBufferRef) reinitializePreviewer();\n }, 800);\n });\n\n resizeObserver.observe(containerRef.value);\n\n setTimeout(() => {\n requestAnimationFrame(() => requestAnimationFrame(() => loadPptx()));\n }, 150);\n});\n\nwatch(\n () => props.url,\n () => {\n loadPptx();\n }\n);\n\nonBeforeUnmount(() => {\n if (resizeObserver) resizeObserver.disconnect();\n if (resizeTimeout !== null) clearTimeout(resizeTimeout);\n arrayBufferRef = null;\n slideCount.value = 0;\n if (previewer) {\n try {\n previewer.destroy();\n } catch {\n // ignore\n }\n }\n previewer = null;\n});\n</script>\n\n<template>\n <div class=\"vfp-relative vfp-flex vfp-flex-col vfp-items-center vfp-w-full vfp-h-full\">\n <div\n v-if=\"loading\"\n class=\"vfp-absolute vfp-inset-0 vfp-flex vfp-items-center vfp-justify-center vfp-bg-surface-toolbar vfp-backdrop-blur-sm vfp-z-10\"\n >\n <div class=\"vfp-text-center\">\n <div\n class=\"vfp-w-10 vfp-h-10 md:vfp-w-12 md:vfp-h-12 vfp-mx-auto vfp-mb-3 vfp-border-4 vfp-border-line-strong vfp-border-t-spinner-head vfp-rounded-full vfp-animate-spin\"\n />\n <p class=\"vfp-text-xs md:vfp-text-sm vfp-text-fg-secondary vfp-font-medium\">{{ t('pptx.loading') }}</p>\n </div>\n </div>\n\n <div\n v-if=\"error && !loading\"\n class=\"vfp-absolute vfp-inset-0 vfp-flex vfp-items-center vfp-justify-center vfp-bg-surface-toolbar vfp-backdrop-blur-sm vfp-z-10\"\n >\n <div class=\"vfp-text-center vfp-max-w-sm md:vfp-max-w-md vfp-px-4\">\n <div\n class=\"vfp-w-24 vfp-h-24 md:vfp-w-32 md:vfp-h-32 vfp-mx-auto vfp-mb-4 md:vfp-mb-6 vfp-rounded-2xl md:vfp-rounded-3xl vfp-bg-gradient-to-br vfp-from-orange-500 vfp-via-red-500 vfp-to-pink-500 vfp-flex vfp-items-center vfp-justify-center vfp-shadow-2xl\"\n >\n <Presentation class=\"vfp-w-12 vfp-h-12 md:vfp-w-16 md:vfp-h-16 vfp-text-fg-primary\" />\n </div>\n <p class=\"vfp-text-lg md:vfp-text-xl vfp-text-fg-primary vfp-mb-2 md:vfp-mb-3 vfp-font-medium\">\n {{ t('pptx.load_failed') }}\n </p>\n <p class=\"vfp-text-xs md:vfp-text-sm vfp-text-fg-tertiary vfp-mb-4 md:vfp-mb-6\">{{ error }}</p>\n <a\n :href=\"url\"\n download\n class=\"vfp-inline-flex vfp-items-center vfp-gap-2 vfp-px-4 vfp-py-2 md:vfp-px-6 md:vfp-py-3 vfp-bg-gradient-to-r vfp-from-purple-500 vfp-to-pink-500 vfp-text-fg-primary vfp-text-sm md:vfp-text-base vfp-rounded-lg md:vfp-rounded-xl hover:vfp-scale-105 vfp-transition-all vfp-shadow-lg\"\n >\n 下载文件\n </a>\n <p class=\"vfp-text-xs vfp-text-fg-muted vfp-mt-3 md:vfp-mt-4\">\n 提示:可以使用 Microsoft PowerPoint 或 WPS 打开\n </p>\n </div>\n </div>\n\n <div\n v-if=\"!error\"\n ref=\"containerRef\"\n class=\"pptx-wrapper vfp-w-full vfp-max-w-full md:vfp-max-w-6xl\"\n :style=\"{ opacity: loading ? 0 : 1 }\"\n />\n </div>\n</template>\n"],"names":["props","__props","t","useTranslator","loading","ref","error","slideCount","containerRef","previewer","resizeObserver","arrayBufferRef","resizeTimeout","lastDimensions","calculateDimensions","rawWidth","parentWidth","_a","containerWidth","height","reinitializePreviewer","currentDimensions","init","loadPptx","timeoutId","response","arrayBuffer","hiddenContainer","tempPreviewer","count","err","errorMsg","onMounted","isInitialRender","newDimensions","widthDiff","heightDiff","watch","onBeforeUnmount","_openBlock","_createElementBlock","_hoisted_1","_hoisted_2","_createElementVNode","_hoisted_3","_hoisted_4","_toDisplayString","_unref","_hoisted_5","_hoisted_6","_hoisted_7","_createVNode","Presentation","_hoisted_8","_hoisted_9","_hoisted_10","_cache"],"mappings":"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"}
|
|
@@ -3,7 +3,7 @@ import { FileSpreadsheet as W } from "lucide-vue-next";
|
|
|
3
3
|
import B from "exceljs";
|
|
4
4
|
import C from "x-data-spreadsheet";
|
|
5
5
|
/* empty css */
|
|
6
|
-
import { u as H, C as R } from "./index-
|
|
6
|
+
import { u as H, C as R } from "./index-C324a7kV.mjs";
|
|
7
7
|
const j = { class: "vfp-relative vfp-flex vfp-flex-col vfp-items-center vfp-w-full vfp-h-full" }, L = {
|
|
8
8
|
key: 0,
|
|
9
9
|
class: "vfp-absolute vfp-inset-0 vfp-flex vfp-items-center vfp-justify-center vfp-bg-surface-toolbar vfp-backdrop-blur-sm vfp-z-10"
|
|
@@ -126,4 +126,4 @@ const j = { class: "vfp-relative vfp-flex vfp-flex-col vfp-items-center vfp-w-fu
|
|
|
126
126
|
export {
|
|
127
127
|
X as default
|
|
128
128
|
};
|
|
129
|
-
//# sourceMappingURL=index-
|
|
129
|
+
//# sourceMappingURL=index-BoL1b2w-.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index-DTLDLOGO.mjs","sources":["../../src/renderers/Xlsx/index.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { ref, watch, onMounted, onBeforeUnmount } from 'vue';\nimport { FileSpreadsheet } from 'lucide-vue-next';\nimport ExcelJS from 'exceljs';\nimport Spreadsheet from 'x-data-spreadsheet';\nimport 'x-data-spreadsheet/dist/xspreadsheet.css';\nimport { convertWorkbookToSpreadsheetData } from '@eternalheart/file-preview-core';\nimport { useTranslator } from '../../composables/useTranslator';\n\nconst props = defineProps<{\n url: string;\n}>();\n\nconst { t } = useTranslator();\n\nconst loading = ref(true);\nconst error = ref<string | null>(null);\nconst containerRef = ref<HTMLDivElement | null>(null);\nlet sheetData: Record<string, unknown>[] | null = null;\nlet resizeObserver: ResizeObserver | null = null;\nlet resizeTimeout: number | null = null;\nlet lastDimensions = { width: 0, height: 0 };\n\nconst calculateDimensions = () => {\n if (!containerRef.value) return { width: 800, height: 600 };\n const rawWidth = containerRef.value.clientWidth;\n const rawHeight = containerRef.value.clientHeight;\n const width = rawWidth > 100 ? rawWidth : 800;\n const height = rawHeight > 100 ? rawHeight : 600;\n return { width, height };\n};\n\nconst mountSpreadsheet = () => {\n if (!containerRef.value || !sheetData) return;\n\n containerRef.value.innerHTML = '';\n\n const { width, height } = calculateDimensions();\n const isMobile = width < 640;\n\n const s = new Spreadsheet(containerRef.value, {\n mode: 'read',\n showToolbar: false,\n showContextmenu: false,\n showGrid: true,\n row: {\n len: 100,\n height: 25,\n },\n col: {\n len: 26,\n width: isMobile ? 80 : 100,\n indexWidth: isMobile ? 40 : 60,\n minWidth: isMobile ? 40 : 60,\n },\n view: {\n height: () => height,\n width: () => width,\n },\n });\n\n s.loadData(sheetData as unknown as Record<string, unknown>);\n};\n\nconst loadExcel = async () => {\n if (!containerRef.value) return;\n\n loading.value = true;\n error.value = null;\n\n try {\n const response = await fetch(props.url, {\n mode: 'cors',\n credentials: 'omit',\n redirect: 'follow',\n });\n\n if (!response.ok) {\n if (response.status === 404) throw new Error(t.value('xlsx.not_found'));\n if (response.status === 403) throw new Error('无权限访问此文件');\n throw new Error(`文件加载失败 (${response.status})`);\n }\n\n const arrayBuffer = await response.arrayBuffer();\n\n if (arrayBuffer.byteLength === 0) {\n throw new Error('文件为空');\n }\n\n const workbook = new ExcelJS.Workbook();\n await workbook.xlsx.load(arrayBuffer);\n const data = convertWorkbookToSpreadsheetData(workbook);\n\n sheetData = data as unknown as Record<string, unknown>[];\n mountSpreadsheet();\n loading.value = false;\n } catch (err) {\n console.error('Excel 解析错误:', err);\n let errorMsg = t.value('xlsx.parse_failed');\n if (err instanceof Error) errorMsg = err.message;\n error.value = errorMsg;\n loading.value = false;\n }\n};\n\nonMounted(() => {\n if (!containerRef.value) return;\n\n let isInitialRender = true;\n\n resizeObserver = new ResizeObserver(() => {\n if (isInitialRender) {\n isInitialRender = false;\n lastDimensions = calculateDimensions();\n return;\n }\n\n const newDimensions = calculateDimensions();\n const widthDiff = Math.abs(lastDimensions.width - newDimensions.width);\n const heightDiff = Math.abs(lastDimensions.height - newDimensions.height);\n\n if (widthDiff < 10 && heightDiff < 10) return;\n\n lastDimensions = newDimensions;\n\n if (resizeTimeout !== null) clearTimeout(resizeTimeout);\n\n resizeTimeout = window.setTimeout(() => {\n if (sheetData) mountSpreadsheet();\n }, 500);\n });\n\n resizeObserver.observe(containerRef.value);\n\n setTimeout(() => {\n requestAnimationFrame(() => loadExcel());\n }, 100);\n});\n\nwatch(\n () => props.url,\n () => {\n loadExcel();\n }\n);\n\nonBeforeUnmount(() => {\n if (resizeObserver) resizeObserver.disconnect();\n if (resizeTimeout !== null) clearTimeout(resizeTimeout);\n sheetData = null;\n if (containerRef.value) containerRef.value.innerHTML = '';\n});\n</script>\n\n<template>\n <div class=\"vfp-relative vfp-flex vfp-flex-col vfp-items-center vfp-w-full vfp-h-full\">\n <div\n v-if=\"loading\"\n class=\"vfp-absolute vfp-inset-0 vfp-flex vfp-items-center vfp-justify-center vfp-bg-surface-toolbar vfp-backdrop-blur-sm vfp-z-10\"\n >\n <div class=\"vfp-text-center\">\n <div\n class=\"vfp-w-10 vfp-h-10 md:vfp-w-12 md:vfp-h-12 vfp-mx-auto vfp-mb-3 vfp-border-4 vfp-border-line-strong vfp-border-t-spinner-head vfp-rounded-full vfp-animate-spin\"\n />\n <p class=\"vfp-text-xs md:vfp-text-sm vfp-text-fg-secondary vfp-font-medium\">{{ t('xlsx.loading') }}</p>\n </div>\n </div>\n\n <div\n v-if=\"error && !loading\"\n class=\"vfp-absolute vfp-inset-0 vfp-flex vfp-items-center vfp-justify-center vfp-bg-surface-toolbar vfp-backdrop-blur-sm vfp-z-10\"\n >\n <div class=\"vfp-text-center vfp-max-w-sm md:vfp-max-w-md vfp-px-4\">\n <div\n class=\"vfp-w-24 vfp-h-24 md:vfp-w-32 md:vfp-h-32 vfp-mx-auto vfp-mb-4 md:vfp-mb-6 vfp-rounded-2xl md:vfp-rounded-3xl vfp-bg-gradient-to-br vfp-from-green-500 vfp-via-emerald-500 vfp-to-teal-500 vfp-flex vfp-items-center vfp-justify-center vfp-shadow-2xl\"\n >\n <FileSpreadsheet class=\"vfp-w-12 vfp-h-12 md:vfp-w-16 md:vfp-h-16 vfp-text-fg-primary\" />\n </div>\n <p class=\"vfp-text-lg md:vfp-text-xl vfp-text-fg-primary vfp-mb-2 md:vfp-mb-3 vfp-font-medium\">\n {{ t('xlsx.load_failed') }}\n </p>\n <p class=\"vfp-text-xs md:vfp-text-sm vfp-text-fg-tertiary vfp-mb-4 md:vfp-mb-6\">{{ error }}</p>\n <a\n :href=\"url\"\n download\n class=\"vfp-inline-flex vfp-items-center vfp-gap-2 vfp-px-4 vfp-py-2 md:vfp-px-6 md:vfp-py-3 vfp-bg-gradient-to-r vfp-from-purple-500 vfp-to-pink-500 vfp-text-fg-primary vfp-text-sm md:vfp-text-base vfp-rounded-lg md:vfp-rounded-xl hover:vfp-scale-105 vfp-transition-all vfp-shadow-lg\"\n >\n 下载文件\n </a>\n <p class=\"vfp-text-xs vfp-text-fg-muted vfp-mt-3 md:vfp-mt-4\">提示:可以使用 Microsoft Excel 或 WPS 打开</p>\n </div>\n </div>\n\n <div\n v-if=\"!error\"\n ref=\"containerRef\"\n class=\"xlsx-spreadsheet-container vfp-w-full vfp-h-full\"\n :style=\"{ opacity: loading ? 0 : 1 }\"\n />\n </div>\n</template>\n"],"names":["props","__props","t","useTranslator","loading","ref","error","containerRef","sheetData","resizeObserver","resizeTimeout","lastDimensions","calculateDimensions","rawWidth","rawHeight","width","height","mountSpreadsheet","isMobile","Spreadsheet","loadExcel","response","arrayBuffer","workbook","ExcelJS","convertWorkbookToSpreadsheetData","err","errorMsg","onMounted","isInitialRender","newDimensions","widthDiff","heightDiff","watch","onBeforeUnmount","_openBlock","_createElementBlock","_hoisted_1","_hoisted_2","_createElementVNode","_hoisted_3","_hoisted_4","_toDisplayString","_unref","_hoisted_5","_hoisted_6","_hoisted_7","_createVNode","FileSpreadsheet","_hoisted_8","_hoisted_9","_hoisted_10","_cache"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index-BoL1b2w-.mjs","sources":["../../src/renderers/Xlsx/index.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { ref, watch, onMounted, onBeforeUnmount } from 'vue';\nimport { FileSpreadsheet } from 'lucide-vue-next';\nimport ExcelJS from 'exceljs';\nimport Spreadsheet from 'x-data-spreadsheet';\nimport 'x-data-spreadsheet/dist/xspreadsheet.css';\nimport { convertWorkbookToSpreadsheetData } from '@eternalheart/file-preview-core';\nimport { useTranslator } from '../../composables/useTranslator';\n\nconst props = defineProps<{\n url: string;\n}>();\n\nconst { t } = useTranslator();\n\nconst loading = ref(true);\nconst error = ref<string | null>(null);\nconst containerRef = ref<HTMLDivElement | null>(null);\nlet sheetData: Record<string, unknown>[] | null = null;\nlet resizeObserver: ResizeObserver | null = null;\nlet resizeTimeout: number | null = null;\nlet lastDimensions = { width: 0, height: 0 };\n\nconst calculateDimensions = () => {\n if (!containerRef.value) return { width: 800, height: 600 };\n const rawWidth = containerRef.value.clientWidth;\n const rawHeight = containerRef.value.clientHeight;\n const width = rawWidth > 100 ? rawWidth : 800;\n const height = rawHeight > 100 ? rawHeight : 600;\n return { width, height };\n};\n\nconst mountSpreadsheet = () => {\n if (!containerRef.value || !sheetData) return;\n\n containerRef.value.innerHTML = '';\n\n const { width, height } = calculateDimensions();\n const isMobile = width < 640;\n\n const s = new Spreadsheet(containerRef.value, {\n mode: 'read',\n showToolbar: false,\n showContextmenu: false,\n showGrid: true,\n row: {\n len: 100,\n height: 25,\n },\n col: {\n len: 26,\n width: isMobile ? 80 : 100,\n indexWidth: isMobile ? 40 : 60,\n minWidth: isMobile ? 40 : 60,\n },\n view: {\n height: () => height,\n width: () => width,\n },\n });\n\n s.loadData(sheetData as unknown as Record<string, unknown>);\n};\n\nconst loadExcel = async () => {\n if (!containerRef.value) return;\n\n loading.value = true;\n error.value = null;\n\n try {\n const response = await fetch(props.url, {\n mode: 'cors',\n credentials: 'omit',\n redirect: 'follow',\n });\n\n if (!response.ok) {\n if (response.status === 404) throw new Error(t.value('xlsx.not_found'));\n if (response.status === 403) throw new Error('无权限访问此文件');\n throw new Error(`文件加载失败 (${response.status})`);\n }\n\n const arrayBuffer = await response.arrayBuffer();\n\n if (arrayBuffer.byteLength === 0) {\n throw new Error('文件为空');\n }\n\n const workbook = new ExcelJS.Workbook();\n await workbook.xlsx.load(arrayBuffer);\n const data = convertWorkbookToSpreadsheetData(workbook);\n\n sheetData = data as unknown as Record<string, unknown>[];\n mountSpreadsheet();\n loading.value = false;\n } catch (err) {\n console.error('Excel 解析错误:', err);\n let errorMsg = t.value('xlsx.parse_failed');\n if (err instanceof Error) errorMsg = err.message;\n error.value = errorMsg;\n loading.value = false;\n }\n};\n\nonMounted(() => {\n if (!containerRef.value) return;\n\n let isInitialRender = true;\n\n resizeObserver = new ResizeObserver(() => {\n if (isInitialRender) {\n isInitialRender = false;\n lastDimensions = calculateDimensions();\n return;\n }\n\n const newDimensions = calculateDimensions();\n const widthDiff = Math.abs(lastDimensions.width - newDimensions.width);\n const heightDiff = Math.abs(lastDimensions.height - newDimensions.height);\n\n if (widthDiff < 10 && heightDiff < 10) return;\n\n lastDimensions = newDimensions;\n\n if (resizeTimeout !== null) clearTimeout(resizeTimeout);\n\n resizeTimeout = window.setTimeout(() => {\n if (sheetData) mountSpreadsheet();\n }, 500);\n });\n\n resizeObserver.observe(containerRef.value);\n\n setTimeout(() => {\n requestAnimationFrame(() => loadExcel());\n }, 100);\n});\n\nwatch(\n () => props.url,\n () => {\n loadExcel();\n }\n);\n\nonBeforeUnmount(() => {\n if (resizeObserver) resizeObserver.disconnect();\n if (resizeTimeout !== null) clearTimeout(resizeTimeout);\n sheetData = null;\n if (containerRef.value) containerRef.value.innerHTML = '';\n});\n</script>\n\n<template>\n <div class=\"vfp-relative vfp-flex vfp-flex-col vfp-items-center vfp-w-full vfp-h-full\">\n <div\n v-if=\"loading\"\n class=\"vfp-absolute vfp-inset-0 vfp-flex vfp-items-center vfp-justify-center vfp-bg-surface-toolbar vfp-backdrop-blur-sm vfp-z-10\"\n >\n <div class=\"vfp-text-center\">\n <div\n class=\"vfp-w-10 vfp-h-10 md:vfp-w-12 md:vfp-h-12 vfp-mx-auto vfp-mb-3 vfp-border-4 vfp-border-line-strong vfp-border-t-spinner-head vfp-rounded-full vfp-animate-spin\"\n />\n <p class=\"vfp-text-xs md:vfp-text-sm vfp-text-fg-secondary vfp-font-medium\">{{ t('xlsx.loading') }}</p>\n </div>\n </div>\n\n <div\n v-if=\"error && !loading\"\n class=\"vfp-absolute vfp-inset-0 vfp-flex vfp-items-center vfp-justify-center vfp-bg-surface-toolbar vfp-backdrop-blur-sm vfp-z-10\"\n >\n <div class=\"vfp-text-center vfp-max-w-sm md:vfp-max-w-md vfp-px-4\">\n <div\n class=\"vfp-w-24 vfp-h-24 md:vfp-w-32 md:vfp-h-32 vfp-mx-auto vfp-mb-4 md:vfp-mb-6 vfp-rounded-2xl md:vfp-rounded-3xl vfp-bg-gradient-to-br vfp-from-green-500 vfp-via-emerald-500 vfp-to-teal-500 vfp-flex vfp-items-center vfp-justify-center vfp-shadow-2xl\"\n >\n <FileSpreadsheet class=\"vfp-w-12 vfp-h-12 md:vfp-w-16 md:vfp-h-16 vfp-text-fg-primary\" />\n </div>\n <p class=\"vfp-text-lg md:vfp-text-xl vfp-text-fg-primary vfp-mb-2 md:vfp-mb-3 vfp-font-medium\">\n {{ t('xlsx.load_failed') }}\n </p>\n <p class=\"vfp-text-xs md:vfp-text-sm vfp-text-fg-tertiary vfp-mb-4 md:vfp-mb-6\">{{ error }}</p>\n <a\n :href=\"url\"\n download\n class=\"vfp-inline-flex vfp-items-center vfp-gap-2 vfp-px-4 vfp-py-2 md:vfp-px-6 md:vfp-py-3 vfp-bg-gradient-to-r vfp-from-purple-500 vfp-to-pink-500 vfp-text-fg-primary vfp-text-sm md:vfp-text-base vfp-rounded-lg md:vfp-rounded-xl hover:vfp-scale-105 vfp-transition-all vfp-shadow-lg\"\n >\n 下载文件\n </a>\n <p class=\"vfp-text-xs vfp-text-fg-muted vfp-mt-3 md:vfp-mt-4\">提示:可以使用 Microsoft Excel 或 WPS 打开</p>\n </div>\n </div>\n\n <div\n v-if=\"!error\"\n ref=\"containerRef\"\n class=\"xlsx-spreadsheet-container vfp-w-full vfp-h-full\"\n :style=\"{ opacity: loading ? 0 : 1 }\"\n />\n </div>\n</template>\n"],"names":["props","__props","t","useTranslator","loading","ref","error","containerRef","sheetData","resizeObserver","resizeTimeout","lastDimensions","calculateDimensions","rawWidth","rawHeight","width","height","mountSpreadsheet","isMobile","Spreadsheet","loadExcel","response","arrayBuffer","workbook","ExcelJS","convertWorkbookToSpreadsheetData","err","errorMsg","onMounted","isInitialRender","newDimensions","widthDiff","heightDiff","watch","onBeforeUnmount","_openBlock","_createElementBlock","_hoisted_1","_hoisted_2","_createElementVNode","_hoisted_3","_hoisted_4","_toDisplayString","_unref","_hoisted_5","_hoisted_6","_hoisted_7","_createVNode","FileSpreadsheet","_hoisted_8","_hoisted_9","_hoisted_10","_cache"],"mappings":"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"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { defineComponent as V, ref as p, watch as te, onBeforeUnmount as oe, openBlock as m, createElementBlock as h, createElementVNode as f, toDisplayString as P, createCommentVNode as C, normalizeStyle as S, unref as z, createVNode as U, h as b } from "vue";
|
|
2
2
|
import { X as re } from "lucide-vue-next";
|
|
3
3
|
import "foliate-js/view.js";
|
|
4
|
-
import { u as ae, _ as le } from "./index-
|
|
4
|
+
import { u as ae, _ as le } from "./index-C324a7kV.mjs";
|
|
5
5
|
const ne = {
|
|
6
6
|
class: "vfp-relative vfp-w-full vfp-h-full vfp-flex vfp-justify-center vfp-overflow-hidden",
|
|
7
7
|
style: { background: "#f5f5f0" }
|
|
@@ -200,4 +200,4 @@ const ne = {
|
|
|
200
200
|
export {
|
|
201
201
|
xe as default
|
|
202
202
|
};
|
|
203
|
-
//# sourceMappingURL=index-
|
|
203
|
+
//# sourceMappingURL=index-Bri7VeRx.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index-S_kGRh6H.mjs","sources":["../../src/renderers/Mobi/index.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { ref, watch, onBeforeUnmount, defineComponent, h, type PropType } from 'vue';\nimport { X } from 'lucide-vue-next';\nimport 'foliate-js/view.js';\nimport { useTranslator } from '../../composables/useTranslator';\n\ninterface TocItem {\n label: string;\n href?: string;\n subitems?: TocItem[];\n}\n\ninterface FoliateView extends HTMLElement {\n book: {\n sections: unknown[];\n toc?: TocItem[];\n destroy?: () => void;\n } | null;\n renderer: HTMLElement & {\n setStyles?: (css: string) => void;\n next?: () => Promise<void>;\n page?: number;\n pages?: number;\n };\n open(target: string | Blob | File | ArrayBuffer): Promise<void>;\n goTo(target: number | string): Promise<void>;\n prev(distance?: number): Promise<void>;\n next(distance?: number): Promise<void>;\n}\n\nconst READER_CSS = `\n @namespace epub \"http://www.idpf.org/2007/ops\";\n html { color-scheme: light; }\n body {\n background: #ffffff !important;\n color: #1a1a1a !important;\n font-family: \"Noto Serif SC\", \"Source Han Serif SC\", Georgia, \"Times New Roman\", serif !important;\n font-size: 16px !important;\n line-height: 2 !important;\n max-width: 100% !important;\n box-sizing: border-box !important;\n word-break: break-word !important;\n overflow-wrap: break-word !important;\n }\n p, li, blockquote, dd { line-height: 2; text-align: justify; }\n p { text-indent: 2em; margin: 0.8em 0; }\n h1 { text-align: center; margin: 1.5em 0 1em; }\n h2 { margin: 1.2em 0 0.8em; }\n h3 { margin: 1em 0 0.6em; }\n img { max-width: 100% !important; height: auto !important; }\n a { color: #2563eb; text-decoration: none; }\n pre { white-space: pre-wrap !important; }\n`;\n\nconst A4_WIDTH = 794;\n\nconst props = defineProps<{ url: string }>();\nconst emit = defineEmits<{\n (e: 'chapterChange', current: number, total: number): void;\n (e: 'fullWidthChange', isFullWidth: boolean): void;\n}>();\n\nconst { t } = useTranslator();\n\nconst hostRef = ref<HTMLDivElement | null>(null);\nlet viewInstance: FoliateView | null = null;\nlet totalLocations = 1;\n\nconst loading = ref(true);\nconst error = ref<string | null>(null);\nconst toc = ref<TocItem[]>([]);\nconst showToc = ref(false);\nconst activeTocHref = ref('');\nconst isFullWidth = ref(false);\n\nconst reportProgress = (current: number, total: number) => {\n if (total > 0) totalLocations = total;\n emit('chapterChange', Math.max(1, current + 1), totalLocations);\n};\n\nconst prevPage = () => { viewInstance?.prev().catch(() => {}); };\nconst nextPage = () => { viewInstance?.next().catch(() => {}); };\nconst toggleToc = () => { showToc.value = !showToc.value; };\nconst toggleFullWidth = () => {\n isFullWidth.value = !isFullWidth.value;\n emit('fullWidthChange', isFullWidth.value);\n if (viewInstance?.renderer) {\n viewInstance.renderer.setAttribute('max-inline-size', isFullWidth.value ? '9999' : '720');\n }\n};\n\nconst handleTocClick = (href: string) => {\n activeTocHref.value = href;\n showToc.value = false;\n viewInstance?.goTo(href).catch(() => {});\n};\n\ndefineExpose({ prevPage, nextPage, toggleFullWidth, toggleToc });\n\nconst load = async () => {\n const host = hostRef.value;\n if (!host) return;\n loading.value = true;\n error.value = null;\n toc.value = [];\n showToc.value = false;\n activeTocHref.value = '';\n host.replaceChildren();\n viewInstance = null;\n\n try {\n const view = document.createElement('foliate-view') as FoliateView;\n host.appendChild(view);\n viewInstance = view;\n\n // 先注册事件\n view.addEventListener('relocate', (e: Event) => {\n const detail = (e as CustomEvent).detail;\n if (!detail) return;\n const loc = detail.location as { current?: number; total?: number } | undefined;\n if (loc && typeof loc.current === 'number' && typeof loc.total === 'number') {\n reportProgress(loc.current, loc.total);\n } else {\n const sections = viewInstance?.book?.sections ?? [];\n const idx = detail.index ?? 0;\n const frac = detail.fraction ?? 0;\n const total = Math.max(sections.length, 1);\n reportProgress(Math.round((idx + frac) / total * total), total);\n }\n const tocItem = detail.tocItem as { href?: string } | undefined;\n if (tocItem?.href) activeTocHref.value = tocItem.href;\n });\n\n const res = await fetch(props.url);\n if (!res.ok) throw new Error(`请求失败: ${res.status}`);\n const blob = await res.blob();\n let name = 'book.mobi';\n try {\n const u = new URL(props.url, window.location.href);\n const base = u.pathname.split('/').pop();\n if (base) name = decodeURIComponent(base);\n } catch { /* blob: URL */ }\n\n await view.open(new File([blob], name));\n\n // 配置 paginator:paginated 模式 + 动画\n const renderer = view.renderer;\n if (renderer) {\n renderer.setAttribute('animated', '');\n renderer.setAttribute('max-inline-size', '720');\n renderer.setAttribute('margin', '48');\n renderer.setAttribute('gap', '5%');\n renderer.setStyles?.(READER_CSS);\n await renderer.next?.();\n }\n\n toc.value = (view.book?.toc ?? []) as TocItem[];\n loading.value = false;\n reportProgress(0, view.book?.sections.length ?? 1);\n } catch (err) {\n console.error('MOBI/AZW3 加载错误:', err);\n error.value = t.value('mobi.load_failed');\n loading.value = false;\n }\n};\n\nwatch(() => props.url, () => load(), { immediate: true });\nonBeforeUnmount(() => {\n try { viewInstance?.book?.destroy?.(); } catch { /* ignore */ }\n viewInstance = null;\n hostRef.value?.replaceChildren();\n});\n</script>\n\n<template>\n <div\n class=\"vfp-relative vfp-w-full vfp-h-full vfp-flex vfp-justify-center vfp-overflow-hidden\"\n style=\"background: #f5f5f0\"\n >\n <div\n v-if=\"error\"\n class=\"vfp-absolute vfp-inset-0 vfp-flex vfp-items-center vfp-justify-center vfp-text-fg-secondary vfp-text-center vfp-p-6\"\n >\n <p class=\"vfp-text-lg\">{{ error }}</p>\n </div>\n\n <div\n v-if=\"loading && !error\"\n class=\"vfp-absolute vfp-inset-0 vfp-flex vfp-items-center vfp-justify-center vfp-z-10\"\n >\n <div class=\"vfp-w-12 vfp-h-12 vfp-border-4 vfp-border-line-strong vfp-border-t-spinner-head vfp-rounded-full vfp-animate-spin\" />\n </div>\n\n <!-- 目录侧栏 -->\n <div\n v-if=\"toc.length > 0\"\n class=\"vfp-absolute vfp-inset-0 vfp-z-20 vfp-flex vfp-transition-opacity vfp-duration-300\"\n :style=\"{ opacity: showToc ? 1 : 0, pointerEvents: showToc ? 'auto' : 'none' }\"\n >\n <div\n class=\"vfp-w-72 vfp-max-w-[80%] vfp-h-full vfp-bg-surface-overlay vfp-backdrop-blur-xl vfp-border-r vfp-border-line-weak vfp-flex vfp-flex-col vfp-shadow-2xl vfp-transition-transform vfp-duration-300\"\n :style=\"{ transform: showToc ? 'translateX(0)' : 'translateX(-100%)' }\"\n >\n <div class=\"vfp-flex vfp-items-center vfp-justify-between vfp-px-4 vfp-py-3 vfp-border-b vfp-border-line-weak vfp-flex-shrink-0\">\n <span class=\"vfp-text-fg-primary vfp-font-medium vfp-text-sm\">{{ t('toolbar.toc') }}</span>\n <button class=\"toc-close-btn\" @click=\"showToc = false\">\n <X class=\"vfp-w-4 vfp-h-4\" />\n </button>\n </div>\n <div class=\"vfp-flex-1 vfp-overflow-y-auto vfp-py-4 vfp-px-1\">\n <MobiTocList :items=\"toc\" :active-href=\"activeTocHref\" @select=\"handleTocClick\" />\n </div>\n </div>\n <div\n class=\"vfp-flex-1 vfp-transition-opacity vfp-duration-300\"\n :style=\"{ background: showToc ? 'rgba(0,0,0,0.3)' : 'transparent' }\"\n @click=\"showToc = false\"\n />\n </div>\n\n <div\n v-if=\"!error\"\n ref=\"hostRef\"\n class=\"vfp-h-full vfp-bg-surface-toolbar vfp-shadow-lg\"\n :style=\"{ width: isFullWidth ? '100%' : A4_WIDTH + 'px', maxWidth: '100%', transition: 'width 0.3s ease' }\"\n />\n </div>\n</template>\n\n<script lang=\"ts\">\ninterface TocItemLocal {\n label: string;\n href?: string;\n subitems?: TocItemLocal[];\n}\n\nconst MobiTocList = defineComponent({\n name: 'MobiTocList',\n props: {\n items: { type: Array as PropType<TocItemLocal[]>, required: true },\n activeHref: { type: String, default: '' },\n depth: { type: Number, default: 0 },\n },\n emits: ['select'],\n render(): ReturnType<typeof h> {\n return h(\n 'ul',\n { style: { listStyle: 'none', padding: 0, margin: this.depth > 0 ? '0 0 0 16px' : 0 } },\n this.items.map((item: TocItemLocal, i: number) =>\n h('li', { key: `${item.href ?? item.label}-${i}` }, [\n item.href\n ? h(\n 'button',\n {\n onClick: () => this.$emit('select', item.href),\n class: [\n 'vfp-w-full vfp-text-left vfp-py-2 vfp-px-3 vfp-text-sm vfp-rounded vfp-transition-all vfp-truncate',\n this.activeHref === item.href\n ? 'vfp-text-fg-primary vfp-bg-surface-3 vfp-font-medium'\n : 'vfp-text-fg-secondary hover:vfp-text-fg-primary hover:vfp-bg-surface-2',\n ],\n title: item.label,\n style: 'background: none; border: none; cursor: pointer',\n },\n item.label?.trim()\n )\n : h(\n 'div',\n { class: 'vfp-w-full vfp-py-2 vfp-px-3 vfp-text-sm vfp-text-fg-tertiary vfp-truncate' },\n item.label?.trim()\n ),\n item.subitems?.length\n ? h(MobiTocList, {\n items: item.subitems,\n activeHref: this.activeHref,\n depth: (this.depth as number) + 1,\n onSelect: (href: string) => this.$emit('select', href),\n })\n : null,\n ])\n )\n );\n },\n});\n\nexport default { name: 'MobiRenderer' };\n</script>\n\n<style scoped>\n.toc-close-btn {\n color: var(--fp-fg-tertiary);\n background: none;\n border: none;\n cursor: pointer;\n transition: color 0.15s;\n}\n.toc-close-btn:hover { color: #fff; }\n</style>\n"],"names":["MobiTocList","defineComponent","h","item","i","_a","_b","_c","href","__default__","READER_CSS","props","__props","emit","__emit","t","useTranslator","hostRef","ref","viewInstance","totalLocations","loading","error","toc","showToc","activeTocHref","isFullWidth","reportProgress","current","total","prevPage","nextPage","toggleToc","toggleFullWidth","handleTocClick","__expose","load","host","view","e","detail","loc","sections","idx","frac","tocItem","res","blob","name","base","renderer","_d","err","watch","onBeforeUnmount","_openBlock","_createElementBlock","_hoisted_1","_hoisted_2","_createElementVNode","_hoisted_3","_toDisplayString","_hoisted_4","_cache","_normalizeStyle","_hoisted_5","_hoisted_6","_unref","_createVNode","X","_hoisted_7"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index-Bri7VeRx.mjs","sources":["../../src/renderers/Mobi/index.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { ref, watch, onBeforeUnmount, defineComponent, h, type PropType } from 'vue';\nimport { X } from 'lucide-vue-next';\nimport 'foliate-js/view.js';\nimport { useTranslator } from '../../composables/useTranslator';\n\ninterface TocItem {\n label: string;\n href?: string;\n subitems?: TocItem[];\n}\n\ninterface FoliateView extends HTMLElement {\n book: {\n sections: unknown[];\n toc?: TocItem[];\n destroy?: () => void;\n } | null;\n renderer: HTMLElement & {\n setStyles?: (css: string) => void;\n next?: () => Promise<void>;\n page?: number;\n pages?: number;\n };\n open(target: string | Blob | File | ArrayBuffer): Promise<void>;\n goTo(target: number | string): Promise<void>;\n prev(distance?: number): Promise<void>;\n next(distance?: number): Promise<void>;\n}\n\nconst READER_CSS = `\n @namespace epub \"http://www.idpf.org/2007/ops\";\n html { color-scheme: light; }\n body {\n background: #ffffff !important;\n color: #1a1a1a !important;\n font-family: \"Noto Serif SC\", \"Source Han Serif SC\", Georgia, \"Times New Roman\", serif !important;\n font-size: 16px !important;\n line-height: 2 !important;\n max-width: 100% !important;\n box-sizing: border-box !important;\n word-break: break-word !important;\n overflow-wrap: break-word !important;\n }\n p, li, blockquote, dd { line-height: 2; text-align: justify; }\n p { text-indent: 2em; margin: 0.8em 0; }\n h1 { text-align: center; margin: 1.5em 0 1em; }\n h2 { margin: 1.2em 0 0.8em; }\n h3 { margin: 1em 0 0.6em; }\n img { max-width: 100% !important; height: auto !important; }\n a { color: #2563eb; text-decoration: none; }\n pre { white-space: pre-wrap !important; }\n`;\n\nconst A4_WIDTH = 794;\n\nconst props = defineProps<{ url: string }>();\nconst emit = defineEmits<{\n (e: 'chapterChange', current: number, total: number): void;\n (e: 'fullWidthChange', isFullWidth: boolean): void;\n}>();\n\nconst { t } = useTranslator();\n\nconst hostRef = ref<HTMLDivElement | null>(null);\nlet viewInstance: FoliateView | null = null;\nlet totalLocations = 1;\n\nconst loading = ref(true);\nconst error = ref<string | null>(null);\nconst toc = ref<TocItem[]>([]);\nconst showToc = ref(false);\nconst activeTocHref = ref('');\nconst isFullWidth = ref(false);\n\nconst reportProgress = (current: number, total: number) => {\n if (total > 0) totalLocations = total;\n emit('chapterChange', Math.max(1, current + 1), totalLocations);\n};\n\nconst prevPage = () => { viewInstance?.prev().catch(() => {}); };\nconst nextPage = () => { viewInstance?.next().catch(() => {}); };\nconst toggleToc = () => { showToc.value = !showToc.value; };\nconst toggleFullWidth = () => {\n isFullWidth.value = !isFullWidth.value;\n emit('fullWidthChange', isFullWidth.value);\n if (viewInstance?.renderer) {\n viewInstance.renderer.setAttribute('max-inline-size', isFullWidth.value ? '9999' : '720');\n }\n};\n\nconst handleTocClick = (href: string) => {\n activeTocHref.value = href;\n showToc.value = false;\n viewInstance?.goTo(href).catch(() => {});\n};\n\ndefineExpose({ prevPage, nextPage, toggleFullWidth, toggleToc });\n\nconst load = async () => {\n const host = hostRef.value;\n if (!host) return;\n loading.value = true;\n error.value = null;\n toc.value = [];\n showToc.value = false;\n activeTocHref.value = '';\n host.replaceChildren();\n viewInstance = null;\n\n try {\n const view = document.createElement('foliate-view') as FoliateView;\n host.appendChild(view);\n viewInstance = view;\n\n // 先注册事件\n view.addEventListener('relocate', (e: Event) => {\n const detail = (e as CustomEvent).detail;\n if (!detail) return;\n const loc = detail.location as { current?: number; total?: number } | undefined;\n if (loc && typeof loc.current === 'number' && typeof loc.total === 'number') {\n reportProgress(loc.current, loc.total);\n } else {\n const sections = viewInstance?.book?.sections ?? [];\n const idx = detail.index ?? 0;\n const frac = detail.fraction ?? 0;\n const total = Math.max(sections.length, 1);\n reportProgress(Math.round((idx + frac) / total * total), total);\n }\n const tocItem = detail.tocItem as { href?: string } | undefined;\n if (tocItem?.href) activeTocHref.value = tocItem.href;\n });\n\n const res = await fetch(props.url);\n if (!res.ok) throw new Error(`请求失败: ${res.status}`);\n const blob = await res.blob();\n let name = 'book.mobi';\n try {\n const u = new URL(props.url, window.location.href);\n const base = u.pathname.split('/').pop();\n if (base) name = decodeURIComponent(base);\n } catch { /* blob: URL */ }\n\n await view.open(new File([blob], name));\n\n // 配置 paginator:paginated 模式 + 动画\n const renderer = view.renderer;\n if (renderer) {\n renderer.setAttribute('animated', '');\n renderer.setAttribute('max-inline-size', '720');\n renderer.setAttribute('margin', '48');\n renderer.setAttribute('gap', '5%');\n renderer.setStyles?.(READER_CSS);\n await renderer.next?.();\n }\n\n toc.value = (view.book?.toc ?? []) as TocItem[];\n loading.value = false;\n reportProgress(0, view.book?.sections.length ?? 1);\n } catch (err) {\n console.error('MOBI/AZW3 加载错误:', err);\n error.value = t.value('mobi.load_failed');\n loading.value = false;\n }\n};\n\nwatch(() => props.url, () => load(), { immediate: true });\nonBeforeUnmount(() => {\n try { viewInstance?.book?.destroy?.(); } catch { /* ignore */ }\n viewInstance = null;\n hostRef.value?.replaceChildren();\n});\n</script>\n\n<template>\n <div\n class=\"vfp-relative vfp-w-full vfp-h-full vfp-flex vfp-justify-center vfp-overflow-hidden\"\n style=\"background: #f5f5f0\"\n >\n <div\n v-if=\"error\"\n class=\"vfp-absolute vfp-inset-0 vfp-flex vfp-items-center vfp-justify-center vfp-text-fg-secondary vfp-text-center vfp-p-6\"\n >\n <p class=\"vfp-text-lg\">{{ error }}</p>\n </div>\n\n <div\n v-if=\"loading && !error\"\n class=\"vfp-absolute vfp-inset-0 vfp-flex vfp-items-center vfp-justify-center vfp-z-10\"\n >\n <div class=\"vfp-w-12 vfp-h-12 vfp-border-4 vfp-border-line-strong vfp-border-t-spinner-head vfp-rounded-full vfp-animate-spin\" />\n </div>\n\n <!-- 目录侧栏 -->\n <div\n v-if=\"toc.length > 0\"\n class=\"vfp-absolute vfp-inset-0 vfp-z-20 vfp-flex vfp-transition-opacity vfp-duration-300\"\n :style=\"{ opacity: showToc ? 1 : 0, pointerEvents: showToc ? 'auto' : 'none' }\"\n >\n <div\n class=\"vfp-w-72 vfp-max-w-[80%] vfp-h-full vfp-bg-surface-overlay vfp-backdrop-blur-xl vfp-border-r vfp-border-line-weak vfp-flex vfp-flex-col vfp-shadow-2xl vfp-transition-transform vfp-duration-300\"\n :style=\"{ transform: showToc ? 'translateX(0)' : 'translateX(-100%)' }\"\n >\n <div class=\"vfp-flex vfp-items-center vfp-justify-between vfp-px-4 vfp-py-3 vfp-border-b vfp-border-line-weak vfp-flex-shrink-0\">\n <span class=\"vfp-text-fg-primary vfp-font-medium vfp-text-sm\">{{ t('toolbar.toc') }}</span>\n <button class=\"toc-close-btn\" @click=\"showToc = false\">\n <X class=\"vfp-w-4 vfp-h-4\" />\n </button>\n </div>\n <div class=\"vfp-flex-1 vfp-overflow-y-auto vfp-py-4 vfp-px-1\">\n <MobiTocList :items=\"toc\" :active-href=\"activeTocHref\" @select=\"handleTocClick\" />\n </div>\n </div>\n <div\n class=\"vfp-flex-1 vfp-transition-opacity vfp-duration-300\"\n :style=\"{ background: showToc ? 'rgba(0,0,0,0.3)' : 'transparent' }\"\n @click=\"showToc = false\"\n />\n </div>\n\n <div\n v-if=\"!error\"\n ref=\"hostRef\"\n class=\"vfp-h-full vfp-bg-surface-toolbar vfp-shadow-lg\"\n :style=\"{ width: isFullWidth ? '100%' : A4_WIDTH + 'px', maxWidth: '100%', transition: 'width 0.3s ease' }\"\n />\n </div>\n</template>\n\n<script lang=\"ts\">\ninterface TocItemLocal {\n label: string;\n href?: string;\n subitems?: TocItemLocal[];\n}\n\nconst MobiTocList = defineComponent({\n name: 'MobiTocList',\n props: {\n items: { type: Array as PropType<TocItemLocal[]>, required: true },\n activeHref: { type: String, default: '' },\n depth: { type: Number, default: 0 },\n },\n emits: ['select'],\n render(): ReturnType<typeof h> {\n return h(\n 'ul',\n { style: { listStyle: 'none', padding: 0, margin: this.depth > 0 ? '0 0 0 16px' : 0 } },\n this.items.map((item: TocItemLocal, i: number) =>\n h('li', { key: `${item.href ?? item.label}-${i}` }, [\n item.href\n ? h(\n 'button',\n {\n onClick: () => this.$emit('select', item.href),\n class: [\n 'vfp-w-full vfp-text-left vfp-py-2 vfp-px-3 vfp-text-sm vfp-rounded vfp-transition-all vfp-truncate',\n this.activeHref === item.href\n ? 'vfp-text-fg-primary vfp-bg-surface-3 vfp-font-medium'\n : 'vfp-text-fg-secondary hover:vfp-text-fg-primary hover:vfp-bg-surface-2',\n ],\n title: item.label,\n style: 'background: none; border: none; cursor: pointer',\n },\n item.label?.trim()\n )\n : h(\n 'div',\n { class: 'vfp-w-full vfp-py-2 vfp-px-3 vfp-text-sm vfp-text-fg-tertiary vfp-truncate' },\n item.label?.trim()\n ),\n item.subitems?.length\n ? h(MobiTocList, {\n items: item.subitems,\n activeHref: this.activeHref,\n depth: (this.depth as number) + 1,\n onSelect: (href: string) => this.$emit('select', href),\n })\n : null,\n ])\n )\n );\n },\n});\n\nexport default { name: 'MobiRenderer' };\n</script>\n\n<style scoped>\n.toc-close-btn {\n color: var(--fp-fg-tertiary);\n background: none;\n border: none;\n cursor: pointer;\n transition: color 0.15s;\n}\n.toc-close-btn:hover { color: #fff; }\n</style>\n"],"names":["MobiTocList","defineComponent","h","item","i","_a","_b","_c","href","__default__","READER_CSS","props","__props","emit","__emit","t","useTranslator","hostRef","ref","viewInstance","totalLocations","loading","error","toc","showToc","activeTocHref","isFullWidth","reportProgress","current","total","prevPage","nextPage","toggleToc","toggleFullWidth","handleTocClick","__expose","load","host","view","e","detail","loc","sections","idx","frac","tocItem","res","blob","name","base","renderer","_d","err","watch","onBeforeUnmount","_openBlock","_createElementBlock","_hoisted_1","_hoisted_2","_createElementVNode","_hoisted_3","_toDisplayString","_hoisted_4","_cache","_normalizeStyle","_hoisted_5","_hoisted_6","_unref","_createVNode","X","_hoisted_7"],"mappings":"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"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { inject as Le, computed as T, unref as C, provide as ue, h as O, defineComponent as X, openBlock as c, createElementBlock as g, createElementVNode as E, toDisplayString as D, defineAsyncComponent as ut, createVNode as G, createTextVNode as dt, toRef as Te, ref as z, watch as V, onBeforeUnmount as oe, onMounted as De, Fragment as R, renderList as I, createBlock as _, resolveDynamicComponent as U, createCommentVNode as L, normalizeStyle as ee, onUnmounted as pt, Teleport as ct, Transition as ft, withCtx as mt } from "vue";
|
|
2
2
|
import { ZoomOut as Ie, ZoomIn as Oe, Scan as vt, RotateCcw as ht, RotateCw as gt, RefreshCw as Ze, List as Ae, ChevronLeft as de, ChevronRight as pe, Minimize2 as Be, Maximize2 as Ve, WrapText as bt, Code as Ge, Eye as He, FileQuestion as wt, Download as Ue, X as xt } from "lucide-vue-next";
|
|
3
3
|
import yt from "jszip";
|
|
4
|
-
const kt = "1.3.
|
|
4
|
+
const kt = "1.3.8", Ft = {
|
|
5
5
|
version: kt
|
|
6
6
|
};
|
|
7
7
|
function Ct(e) {
|
|
@@ -1345,7 +1345,7 @@ const io = { class: "rfp-flex rfp-items-center rfp-justify-center rfp-w-full rfp
|
|
|
1345
1345
|
loader: e,
|
|
1346
1346
|
loadingComponent: { render: () => O(po) },
|
|
1347
1347
|
delay: 0
|
|
1348
|
-
}), co = $(() => import("./index-
|
|
1348
|
+
}), co = $(() => import("./index-BM9FaQUl.mjs")), fo = $(() => import("./index-cZn4ih-x.mjs")), mo = $(() => import("./index-DAo-7spn.mjs")), vo = $(() => import("./index-BoL1b2w-.mjs")), ho = $(() => import("./index-BYzQg-jL.mjs")), go = $(() => import("./index-dzB4jd9b.mjs")), bo = $(() => import("./index-D9wf6m37.mjs")), wo = $(() => import("./index-Bri7VeRx.mjs")), xo = $(() => import("./index-DXlcF1Dk.mjs")), yo = $(() => import("./index-lHlugUBI.mjs")), ko = $(() => import("./index-CTsscgqY.mjs")), Fo = $(() => import("./index-C7uOM7XL.mjs")), Co = $(() => import("./index-DAEQe-RI.mjs")), _o = $(() => import("./index-BCkcZs4y.mjs")), zo = $(() => import("./index-Ch7AEfnk.mjs")), Mo = $(() => import("./index-ELyTQZeF.mjs")), Ro = $(() => import("./index-5Smm2vx0.mjs")), To = { class: "vfp-flex vfp-flex-col vfp-items-center vfp-justify-center vfp-w-full vfp-h-full vfp-p-8 vfp-gap-6" }, Eo = { class: "vfp-w-32 vfp-h-32 vfp-rounded-full vfp-bg-surface-2 vfp-flex vfp-items-center vfp-justify-center" }, Po = { class: "vfp-text-fg-primary vfp-text-center" }, $o = { class: "vfp-text-xl vfp-font-medium vfp-mb-2" }, So = { class: "vfp-text-fg-secondary" }, We = /* @__PURE__ */ X({
|
|
1349
1349
|
__name: "index",
|
|
1350
1350
|
props: {
|
|
1351
1351
|
fileName: {},
|
|
@@ -2014,4 +2014,4 @@ export {
|
|
|
2014
2014
|
hn as w,
|
|
2015
2015
|
cn as x
|
|
2016
2016
|
};
|
|
2017
|
-
//# sourceMappingURL=index-
|
|
2017
|
+
//# sourceMappingURL=index-C324a7kV.mjs.map
|