@eternalheart/vue-file-preview 1.3.13 → 1.4.0
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/FilePreviewContent.vue.d.ts +3 -0
- package/lib/FilePreviewContent.vue.d.ts.map +1 -1
- package/lib/FilePreviewEmbed.vue.d.ts +5 -0
- package/lib/FilePreviewEmbed.vue.d.ts.map +1 -1
- package/lib/FilePreviewModal.vue.d.ts.map +1 -1
- package/lib/chunks/{RendererError.vue_vue_type_script_setup_true_lang-CbgZBSDr.mjs → RendererError.vue_vue_type_script_setup_true_lang-BNoENOWX.mjs} +9 -9
- package/lib/chunks/RendererError.vue_vue_type_script_setup_true_lang-BNoENOWX.mjs.map +1 -0
- package/lib/chunks/index-8ETACZ6T.mjs +267 -0
- package/lib/chunks/index-8ETACZ6T.mjs.map +1 -0
- package/lib/chunks/{index-DyipSoKh.mjs → index-B-LW-GJO.mjs} +24 -21
- package/lib/chunks/index-B-LW-GJO.mjs.map +1 -0
- package/lib/chunks/{index-Cjnw238n.mjs → index-BT9hXA6r.mjs} +3 -3
- package/lib/chunks/{index-Cjnw238n.mjs.map → index-BT9hXA6r.mjs.map} +1 -1
- package/lib/chunks/{index-CyrFxdIJ.mjs → index-BcKI75RW.mjs} +4 -4
- package/lib/chunks/{index-CyrFxdIJ.mjs.map → index-BcKI75RW.mjs.map} +1 -1
- package/lib/chunks/{index-Ctd0JQ6K.mjs → index-By6vGdnK.mjs} +3 -3
- package/lib/chunks/{index-Ctd0JQ6K.mjs.map → index-By6vGdnK.mjs.map} +1 -1
- package/lib/chunks/{index-BHi1WRQZ.mjs → index-C-Mu0fvH.mjs} +3 -3
- package/lib/chunks/{index-BHi1WRQZ.mjs.map → index-C-Mu0fvH.mjs.map} +1 -1
- package/lib/chunks/{index-DT9dPz8I.mjs → index-CGSq7-Q-.mjs} +3 -3
- package/lib/chunks/{index-DT9dPz8I.mjs.map → index-CGSq7-Q-.mjs.map} +1 -1
- package/lib/chunks/{index-DTtHrdBl.mjs → index-CWpU8prZ.mjs} +11 -11
- package/lib/chunks/index-CWpU8prZ.mjs.map +1 -0
- package/lib/chunks/index-CYa_XneH.mjs +303 -0
- package/lib/chunks/index-CYa_XneH.mjs.map +1 -0
- package/lib/chunks/{index-CYt6tpQC.mjs → index-CbJkkdEB.mjs} +9 -9
- package/lib/chunks/index-CbJkkdEB.mjs.map +1 -0
- package/lib/chunks/{index-DEoR7aDN.mjs → index-CoITLoYL.mjs} +3 -3
- package/lib/chunks/{index-DEoR7aDN.mjs.map → index-CoITLoYL.mjs.map} +1 -1
- package/lib/chunks/{index-Oxwizt6-.mjs → index-D9QQL7U6.mjs} +605 -557
- package/lib/chunks/index-D9QQL7U6.mjs.map +1 -0
- package/lib/chunks/{index-BvegaxQF.mjs → index-DAdO2lkI.mjs} +32 -32
- package/lib/chunks/index-DAdO2lkI.mjs.map +1 -0
- package/lib/chunks/{index-GGGDPwxX.mjs → index-DGqDJMot.mjs} +3 -3
- package/lib/chunks/{index-GGGDPwxX.mjs.map → index-DGqDJMot.mjs.map} +1 -1
- package/lib/chunks/{index-DIe0vHlt.mjs → index-DTyG1Wzp.mjs} +8 -8
- package/lib/chunks/index-DTyG1Wzp.mjs.map +1 -0
- package/lib/chunks/{index-Dw1U4YqT.mjs → index-DglMeKJM.mjs} +36 -38
- package/lib/chunks/{index-Dw1U4YqT.mjs.map → index-DglMeKJM.mjs.map} +1 -1
- package/lib/chunks/{index-B2lqsdp7.mjs → index-OOoaYpkl.mjs} +3 -3
- package/lib/chunks/{index-B2lqsdp7.mjs.map → index-OOoaYpkl.mjs.map} +1 -1
- package/lib/chunks/{index-DBw8tvyb.mjs → index-jcgLzyDR.mjs} +4 -4
- package/lib/chunks/{index-DBw8tvyb.mjs.map → index-jcgLzyDR.mjs.map} +1 -1
- package/lib/chunks/{index-BTW1xwB9.mjs → index-nFIiu1lA.mjs} +3 -3
- package/lib/chunks/{index-BTW1xwB9.mjs.map → index-nFIiu1lA.mjs.map} +1 -1
- package/lib/index.cjs +40 -32
- package/lib/index.cjs.map +1 -1
- package/lib/index.css +1 -1
- package/lib/index.mjs +1 -1
- package/lib/renderers/Audio/index.vue.d.ts.map +1 -1
- package/lib/renderers/Docx/index.vue.d.ts.map +1 -1
- package/lib/renderers/Epub/index.vue.d.ts.map +1 -1
- package/lib/renderers/Markdown/index.vue.d.ts.map +1 -1
- package/lib/renderers/Pdf/index.vue.d.ts +3 -0
- package/lib/renderers/Pdf/index.vue.d.ts.map +1 -1
- package/lib/renderers/Pdf/toolbar.d.ts +5 -0
- package/lib/renderers/Pdf/toolbar.d.ts.map +1 -1
- package/lib/renderers/RendererError.vue.d.ts.map +1 -1
- package/lib/renderers/Subtitle/index.vue.d.ts.map +1 -1
- package/lib/renderers/Text/index.vue.d.ts.map +1 -1
- package/lib/renderers/Xml/index.vue.d.ts.map +1 -1
- package/package.json +1 -1
- package/lib/chunks/RendererError.vue_vue_type_script_setup_true_lang-CbgZBSDr.mjs.map +0 -1
- package/lib/chunks/index-BvegaxQF.mjs.map +0 -1
- package/lib/chunks/index-CYt6tpQC.mjs.map +0 -1
- package/lib/chunks/index-DIe0vHlt.mjs.map +0 -1
- package/lib/chunks/index-DTtHrdBl.mjs.map +0 -1
- package/lib/chunks/index-DX_NBPzS.mjs +0 -248
- package/lib/chunks/index-DX_NBPzS.mjs.map +0 -1
- package/lib/chunks/index-DyipSoKh.mjs.map +0 -1
- package/lib/chunks/index-Oxwizt6-.mjs.map +0 -1
- package/lib/chunks/index-Zwl5J-Uw.mjs +0 -166
- package/lib/chunks/index-Zwl5J-Uw.mjs.map +0 -1
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
import { ref as p, watch as B, onUnmounted as D, defineComponent as U, toRef as O, computed as $, onMounted as q, onBeforeUnmount as H, unref as t, openBlock as
|
|
1
|
+
import { ref as p, watch as B, onUnmounted as D, defineComponent as U, toRef as O, computed as $, onMounted as q, onBeforeUnmount as H, unref as t, openBlock as x, createBlock as V, createElementBlock as z, createElementVNode as a, normalizeStyle as G, createStaticVNode as W, toDisplayString as C, normalizeClass as A, createVNode as P, resolveDynamicComponent as X, Transition as J, withCtx as K, createCommentVNode as Q } from "vue";
|
|
2
2
|
import { VolumeX as Y, Volume1 as Z, Volume2 as ee, Repeat as te, SkipBack as ae, Pause as re, Play as ne, SkipForward as oe } from "lucide-vue-next";
|
|
3
|
-
import { k as se, u as le, _ as ie } from "./index-
|
|
4
|
-
import { _ as pe } from "./RendererError.vue_vue_type_script_setup_true_lang-
|
|
5
|
-
function fe(
|
|
6
|
-
const f = p(null),
|
|
3
|
+
import { k as se, u as le, _ as ie } from "./index-D9QQL7U6.mjs";
|
|
4
|
+
import { _ as pe } from "./RendererError.vue_vue_type_script_setup_true_lang-BNoENOWX.mjs";
|
|
5
|
+
function fe(b) {
|
|
6
|
+
const f = p(null), g = p(!1), o = p(!0), h = p(0), d = p(0), y = p(1), c = p(!1), v = p(!1), u = p(null);
|
|
7
7
|
let l = null;
|
|
8
8
|
const w = () => {
|
|
9
9
|
const e = f.value;
|
|
@@ -18,13 +18,13 @@ function fe(x) {
|
|
|
18
18
|
}, M = () => {
|
|
19
19
|
o.value = !0;
|
|
20
20
|
}, T = () => {
|
|
21
|
-
o.value = !1,
|
|
21
|
+
o.value = !1, g.value = !0;
|
|
22
22
|
}, k = () => {
|
|
23
|
-
|
|
23
|
+
g.value = !0;
|
|
24
24
|
}, _ = () => {
|
|
25
|
-
|
|
25
|
+
g.value = !1;
|
|
26
26
|
}, L = () => {
|
|
27
|
-
|
|
27
|
+
g.value = !1;
|
|
28
28
|
}, E = () => {
|
|
29
29
|
u.value = "音频加载失败", o.value = !1;
|
|
30
30
|
};
|
|
@@ -33,7 +33,7 @@ function fe(x) {
|
|
|
33
33
|
};
|
|
34
34
|
};
|
|
35
35
|
return B(
|
|
36
|
-
|
|
36
|
+
b,
|
|
37
37
|
() => {
|
|
38
38
|
l == null || l(), l = null, requestAnimationFrame(() => w());
|
|
39
39
|
},
|
|
@@ -48,7 +48,7 @@ function fe(x) {
|
|
|
48
48
|
l == null || l(), l = null;
|
|
49
49
|
}), {
|
|
50
50
|
audioRef: f,
|
|
51
|
-
isPlaying:
|
|
51
|
+
isPlaying: g,
|
|
52
52
|
isLoading: o,
|
|
53
53
|
isLoop: v,
|
|
54
54
|
currentTime: h,
|
|
@@ -93,14 +93,14 @@ function fe(x) {
|
|
|
93
93
|
}
|
|
94
94
|
const de = {
|
|
95
95
|
key: 1,
|
|
96
|
-
class: "vfp-flex vfp-flex-col vfp-items-center vfp-justify-center vfp-w-full vfp-h-full vfp-p-
|
|
96
|
+
class: "vfp-flex vfp-flex-col vfp-items-center vfp-justify-center vfp-w-full vfp-h-full vfp-p-6 vfp-gap-6 vfp-select-none"
|
|
97
97
|
}, ve = {
|
|
98
98
|
class: "vfp-relative",
|
|
99
99
|
style: { width: "260px", height: "240px" }
|
|
100
|
-
}, ue = { class: "vfp-text-center vfp-max-w-
|
|
101
|
-
class: "vfp-w-full vfp-max-w-
|
|
100
|
+
}, ue = { class: "vfp-text-center vfp-max-w-md vfp-px-4" }, ce = { class: "vfp-text-lg vfp-font-medium vfp-mb-1 vfp-truncate vfp-text-fg-primary" }, ge = {
|
|
101
|
+
class: "vfp-w-full vfp-max-w-md vfp-rounded-2xl vfp-p-5 vfp-border vfp-bg-surface-1 vfp-border-line-weak",
|
|
102
102
|
style: { backdropFilter: "blur(16px)" }
|
|
103
|
-
}, me = { class: "vfp-mb-5" },
|
|
103
|
+
}, me = { class: "vfp-mb-5" }, xe = { class: "vfp-relative vfp-h-4 vfp-flex vfp-items-center" }, be = ["max", "value", "disabled", "aria-label"], he = { class: "vfp-flex vfp-justify-between vfp-text-xs vfp-mt-2.5 vfp-text-fg-tertiary" }, ye = { style: { "font-variant-numeric": "tabular-nums" } }, we = { style: { "font-variant-numeric": "tabular-nums" } }, ke = { class: "vfp-flex vfp-items-center vfp-justify-center vfp-gap-3" }, _e = ["aria-label"], Le = ["aria-label"], Ee = ["aria-label"], Ge = ["aria-label"], Me = ["aria-label"], Te = {
|
|
104
104
|
class: "vfp-flex vfp-flex-col vfp-items-center vfp-gap-2",
|
|
105
105
|
style: { height: "100px" }
|
|
106
106
|
}, Ve = {
|
|
@@ -112,8 +112,8 @@ const de = {
|
|
|
112
112
|
url: {},
|
|
113
113
|
fileName: {}
|
|
114
114
|
},
|
|
115
|
-
setup(
|
|
116
|
-
const
|
|
115
|
+
setup(b) {
|
|
116
|
+
const g = O(b, "url"), { t: o } = le(), {
|
|
117
117
|
audioRef: h,
|
|
118
118
|
isPlaying: d,
|
|
119
119
|
isLoop: y,
|
|
@@ -129,7 +129,7 @@ const de = {
|
|
|
129
129
|
toggleMute: j,
|
|
130
130
|
toggleLoop: I,
|
|
131
131
|
formatTime: e
|
|
132
|
-
} = fe(
|
|
132
|
+
} = fe(g), n = p(!1);
|
|
133
133
|
let s = null;
|
|
134
134
|
const m = p(null), M = $(() => v.value > 0 ? c.value / v.value : 0), T = $(() => l.value || u.value === 0 ? Y : u.value < 0.5 ? Z : ee), k = (E) => {
|
|
135
135
|
m.value && !m.value.contains(E.target) && (n.value = !1);
|
|
@@ -146,10 +146,10 @@ const de = {
|
|
|
146
146
|
n.value = !1;
|
|
147
147
|
}, 300);
|
|
148
148
|
};
|
|
149
|
-
return (E, r) => t(w) ? (
|
|
149
|
+
return (E, r) => t(w) ? (x(), V(pe, {
|
|
150
150
|
key: 0,
|
|
151
151
|
message: t(w)
|
|
152
|
-
}, null, 8, ["message"])) : (
|
|
152
|
+
}, null, 8, ["message"])) : (x(), z("div", de, [
|
|
153
153
|
a("div", ve, [
|
|
154
154
|
a("div", {
|
|
155
155
|
class: "vfp-absolute vfp-rounded-full",
|
|
@@ -224,16 +224,16 @@ const de = {
|
|
|
224
224
|
transition: "transform 0.8s cubic-bezier(0.4, 0, 0.2, 1)"
|
|
225
225
|
})
|
|
226
226
|
}, [...r[8] || (r[8] = [
|
|
227
|
-
W('<svg width="100" height="120" viewBox="0 0 100 120" fill="none" xmlns="http://www.w3.org/2000/svg" data-v-
|
|
227
|
+
W('<svg width="100" height="120" viewBox="0 0 100 120" fill="none" xmlns="http://www.w3.org/2000/svg" data-v-0953754e><circle cx="76" cy="16" r="13" fill="rgba(0,0,0,0.3)" data-v-0953754e></circle><circle cx="76" cy="16" r="11" fill="url(#vfp-baseGrad)" data-v-0953754e></circle><circle cx="76" cy="16" r="6" fill="url(#vfp-baseInnerGrad)" data-v-0953754e></circle><circle cx="76" cy="16" r="2.5" fill="#222" stroke="#555" stroke-width="0.5" data-v-0953754e></circle><path d="M74 22 L56 88" stroke="url(#vfp-armGrad)" stroke-width="3.5" stroke-linecap="round" data-v-0953754e></path><rect x="50" y="86" width="12" height="7" rx="1.5" fill="url(#vfp-headGrad)" data-v-0953754e></rect><rect x="52.5" y="92" width="7" height="9" rx="1" fill="url(#vfp-cartridgeGrad)" data-v-0953754e></rect><line x1="56" y1="101" x2="56" y2="105" stroke="#bbb" stroke-width="1.2" stroke-linecap="round" data-v-0953754e></line><circle cx="56" cy="105.5" r="0.8" fill="#ddd" data-v-0953754e></circle><defs data-v-0953754e><radialGradient id="vfp-baseGrad" cx="40%" cy="35%" data-v-0953754e><stop offset="0%" stop-color="#555" data-v-0953754e></stop><stop offset="100%" stop-color="#1a1a1a" data-v-0953754e></stop></radialGradient><radialGradient id="vfp-baseInnerGrad" cx="40%" cy="35%" data-v-0953754e><stop offset="0%" stop-color="#666" data-v-0953754e></stop><stop offset="100%" stop-color="#333" data-v-0953754e></stop></radialGradient><linearGradient id="vfp-armGrad" x1="0" y1="0" x2="0" y2="1" data-v-0953754e><stop offset="0%" stop-color="#555" data-v-0953754e></stop><stop offset="50%" stop-color="#444" data-v-0953754e></stop><stop offset="100%" stop-color="#333" data-v-0953754e></stop></linearGradient><linearGradient id="vfp-headGrad" x1="0" y1="0" x2="0" y2="1" data-v-0953754e><stop offset="0%" stop-color="#555" data-v-0953754e></stop><stop offset="100%" stop-color="#333" data-v-0953754e></stop></linearGradient><linearGradient id="vfp-cartridgeGrad" x1="0" y1="0" x2="0" y2="1" data-v-0953754e><stop offset="0%" stop-color="#444" data-v-0953754e></stop><stop offset="100%" stop-color="#222" data-v-0953754e></stop></linearGradient></defs></svg>', 1)
|
|
228
228
|
])], 4)
|
|
229
229
|
]),
|
|
230
230
|
a("div", ue, [
|
|
231
|
-
a("div", ce, C(
|
|
231
|
+
a("div", ce, C(b.fileName), 1),
|
|
232
232
|
r[9] || (r[9] = a("p", { class: "vfp-text-xs vfp-tracking-widest vfp-uppercase vfp-text-accent" }, "Audio", -1))
|
|
233
233
|
]),
|
|
234
|
-
a("div",
|
|
234
|
+
a("div", ge, [
|
|
235
235
|
a("div", me, [
|
|
236
|
-
a("div",
|
|
236
|
+
a("div", xe, [
|
|
237
237
|
r[10] || (r[10] = a("div", { class: "vfp-absolute vfp-w-full vfp-h-[5px] vfp-rounded-full vfp-bg-surface-2" }, null, -1)),
|
|
238
238
|
a("div", {
|
|
239
239
|
class: "vfp-absolute vfp-h-[5px] vfp-rounded-full vfp-pointer-events-none",
|
|
@@ -254,7 +254,7 @@ const de = {
|
|
|
254
254
|
"aria-label": t(o)("audio.aria.progress"),
|
|
255
255
|
class: "audio-slider vfp-absolute vfp-w-full",
|
|
256
256
|
onInput: r[0] || (r[0] = (i) => t(R)(parseFloat(i.target.value)))
|
|
257
|
-
}, null, 40,
|
|
257
|
+
}, null, 40, be)
|
|
258
258
|
]),
|
|
259
259
|
a("div", he, [
|
|
260
260
|
a("span", ye, C(t(e)(t(c))), 1),
|
|
@@ -291,10 +291,10 @@ const de = {
|
|
|
291
291
|
onClick: r[3] || (r[3] = //@ts-ignore
|
|
292
292
|
(...i) => t(S) && t(S)(...i))
|
|
293
293
|
}, [
|
|
294
|
-
t(d) ? (
|
|
294
|
+
t(d) ? (x(), V(t(re), {
|
|
295
295
|
key: 0,
|
|
296
296
|
class: "vfp-w-6 vfp-h-6"
|
|
297
|
-
})) : (
|
|
297
|
+
})) : (x(), V(t(ne), {
|
|
298
298
|
key: 1,
|
|
299
299
|
class: "vfp-w-6 vfp-h-6 vfp-ml-0.5"
|
|
300
300
|
}))
|
|
@@ -322,11 +322,11 @@ const de = {
|
|
|
322
322
|
onClick: r[5] || (r[5] = //@ts-ignore
|
|
323
323
|
(...i) => t(j) && t(j)(...i))
|
|
324
324
|
}, [
|
|
325
|
-
(
|
|
325
|
+
(x(), V(X(T.value), { class: "vfp-w-4 vfp-h-4" }))
|
|
326
326
|
], 10, Me),
|
|
327
327
|
P(J, { name: "vfp-fade" }, {
|
|
328
328
|
default: K(() => [
|
|
329
|
-
n.value ? (
|
|
329
|
+
n.value ? (x(), z("div", {
|
|
330
330
|
key: 0,
|
|
331
331
|
class: "vfp-absolute vfp-bottom-full vfp-mb-2 vfp-rounded-xl vfp-p-3 vfp-border vfp-bg-surface-3 vfp-border-line",
|
|
332
332
|
style: {
|
|
@@ -376,13 +376,13 @@ const de = {
|
|
|
376
376
|
a("audio", {
|
|
377
377
|
ref_key: "audioRef",
|
|
378
378
|
ref: h,
|
|
379
|
-
src:
|
|
379
|
+
src: b.url,
|
|
380
380
|
class: "vfp-hidden"
|
|
381
381
|
}, null, 8, Se)
|
|
382
382
|
]));
|
|
383
383
|
}
|
|
384
|
-
}), Be = /* @__PURE__ */ ie(Ne, [["__scopeId", "data-v-
|
|
384
|
+
}), Be = /* @__PURE__ */ ie(Ne, [["__scopeId", "data-v-0953754e"]]);
|
|
385
385
|
export {
|
|
386
386
|
Be as default
|
|
387
387
|
};
|
|
388
|
-
//# sourceMappingURL=index-
|
|
388
|
+
//# sourceMappingURL=index-DAdO2lkI.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index-DAdO2lkI.mjs","sources":["../../src/composables/useAudioPlayer.ts","../../src/renderers/Audio/index.vue"],"sourcesContent":["import { ref, watch, onUnmounted, type Ref } from 'vue';\nimport { formatTime } from '@eternalheart/file-preview-core';\n\n/**\n * Vue 3 版本的音频播放器 composable\n * 与 React 版的 useAudioPlayer 行为对齐\n */\nexport function useAudioPlayer(url: Ref<string>) {\n const audioRef = ref<HTMLAudioElement | null>(null);\n const isPlaying = ref(false);\n const isLoading = ref(true);\n const currentTime = ref(0);\n const duration = ref(0);\n const volume = ref(1);\n const isMuted = ref(false);\n const isLoop = ref(false);\n const error = ref<string | null>(null);\n\n let cleanup: (() => void) | null = null;\n\n const bindEvents = () => {\n const audio = audioRef.value;\n if (!audio) return;\n\n isLoading.value = true;\n error.value = null;\n\n const onTimeUpdate = () => {\n if (!isNaN(audio.currentTime)) {\n currentTime.value = audio.currentTime;\n }\n };\n\n const onDurationChange = () => {\n if (!isNaN(audio.duration) && isFinite(audio.duration)) {\n duration.value = audio.duration;\n }\n };\n\n const onCanPlay = () => {\n isLoading.value = false;\n onDurationChange();\n };\n\n const onWaiting = () => {\n isLoading.value = true;\n };\n const onPlaying = () => {\n isLoading.value = false;\n isPlaying.value = true;\n };\n\n const onPlay = () => {\n isPlaying.value = true;\n };\n const onPause = () => {\n isPlaying.value = false;\n };\n const onEnded = () => {\n isPlaying.value = false;\n };\n\n const onError = () => {\n error.value = '音频加载失败';\n isLoading.value = false;\n };\n\n audio.addEventListener('timeupdate', onTimeUpdate);\n audio.addEventListener('loadedmetadata', onDurationChange);\n audio.addEventListener('durationchange', onDurationChange);\n audio.addEventListener('canplay', onCanPlay);\n audio.addEventListener('waiting', onWaiting);\n audio.addEventListener('playing', onPlaying);\n audio.addEventListener('play', onPlay);\n audio.addEventListener('pause', onPause);\n audio.addEventListener('ended', onEnded);\n audio.addEventListener('error', onError);\n\n if (audio.readyState >= 3) {\n isLoading.value = false;\n onDurationChange();\n } else if (audio.readyState >= 1) {\n onDurationChange();\n }\n\n cleanup = () => {\n audio.removeEventListener('timeupdate', onTimeUpdate);\n audio.removeEventListener('loadedmetadata', onDurationChange);\n audio.removeEventListener('durationchange', onDurationChange);\n audio.removeEventListener('canplay', onCanPlay);\n audio.removeEventListener('waiting', onWaiting);\n audio.removeEventListener('playing', onPlaying);\n audio.removeEventListener('play', onPlay);\n audio.removeEventListener('pause', onPause);\n audio.removeEventListener('ended', onEnded);\n audio.removeEventListener('error', onError);\n };\n };\n\n // url 变化时重新绑定\n watch(\n url,\n () => {\n cleanup?.();\n cleanup = null;\n // 等待 DOM 更新(audio src 变化)\n requestAnimationFrame(() => bindEvents());\n },\n { flush: 'post' }\n );\n\n // 在 audioRef 挂载后首次绑定\n watch(\n audioRef,\n (el) => {\n if (el) bindEvents();\n },\n { flush: 'post' }\n );\n\n onUnmounted(() => {\n cleanup?.();\n cleanup = null;\n });\n\n const togglePlay = () => {\n const audio = audioRef.value;\n if (!audio) return;\n if (audio.paused) {\n audio.play().catch(() => {});\n } else {\n audio.pause();\n }\n };\n\n const seek = (time: number) => {\n const audio = audioRef.value;\n if (!audio) return;\n audio.currentTime = time;\n currentTime.value = time;\n };\n\n const skip = (seconds: number) => {\n const audio = audioRef.value;\n if (!audio) return;\n audio.currentTime = Math.max(\n 0,\n Math.min(audio.currentTime + seconds, audio.duration || Infinity)\n );\n };\n\n const setVolume = (vol: number) => {\n const audio = audioRef.value;\n if (!audio) return;\n const clamped = Math.max(0, Math.min(1, vol));\n audio.volume = clamped;\n volume.value = clamped;\n if (clamped > 0) {\n audio.muted = false;\n isMuted.value = false;\n }\n };\n\n const toggleMute = () => {\n const audio = audioRef.value;\n if (!audio) return;\n audio.muted = !audio.muted;\n isMuted.value = audio.muted;\n };\n\n const toggleLoop = () => {\n const audio = audioRef.value;\n if (!audio) return;\n const next = !audio.loop;\n audio.loop = next;\n isLoop.value = next;\n };\n\n return {\n audioRef,\n isPlaying,\n isLoading,\n isLoop,\n currentTime,\n duration,\n volume,\n isMuted,\n error,\n togglePlay,\n seek,\n skip,\n setVolume,\n toggleMute,\n toggleLoop,\n formatTime,\n };\n}\n","<script setup lang=\"ts\">\nimport { ref, computed, onMounted, onBeforeUnmount, toRef } from 'vue';\nimport { Play, Pause, Volume2, VolumeX, Volume1, SkipBack, SkipForward, Repeat } from 'lucide-vue-next';\nimport { useAudioPlayer } from '../../composables/useAudioPlayer';\nimport { useTranslator } from '../../composables/useTranslator';\nimport RendererError from '../RendererError.vue';\n\nconst props = defineProps<{\n url: string;\n fileName: string;\n}>();\n\nconst urlRef = toRef(props, 'url');\n\nconst { t } = useTranslator();\n\nconst {\n audioRef,\n isPlaying,\n isLoop,\n currentTime,\n duration,\n volume,\n isMuted,\n error,\n togglePlay,\n seek,\n skip,\n setVolume,\n toggleMute,\n toggleLoop,\n formatTime,\n} = useAudioPlayer(urlRef);\n\nconst showVolume = ref(false);\nlet volumeHideTimer: number | null = null;\nconst volumeRef = ref<HTMLDivElement | null>(null);\n\nconst progress = computed(() => (duration.value > 0 ? currentTime.value / duration.value : 0));\n\nconst VolumeIcon = computed(() => {\n if (isMuted.value || volume.value === 0) return VolumeX;\n if (volume.value < 0.5) return Volume1;\n return Volume2;\n});\n\nconst handleClickOutside = (e: MouseEvent) => {\n if (volumeRef.value && !volumeRef.value.contains(e.target as Node)) {\n showVolume.value = false;\n }\n};\n\nonMounted(() => {\n document.addEventListener('mousedown', handleClickOutside);\n});\n\nonBeforeUnmount(() => {\n document.removeEventListener('mousedown', handleClickOutside);\n if (volumeHideTimer !== null) clearTimeout(volumeHideTimer);\n});\n\nconst handleVolumeEnter = () => {\n if (volumeHideTimer !== null) clearTimeout(volumeHideTimer);\n showVolume.value = true;\n};\n\nconst handleVolumeLeave = () => {\n volumeHideTimer = window.setTimeout(() => {\n showVolume.value = false;\n }, 300);\n};\n</script>\n\n<template>\n <RendererError v-if=\"error\" :message=\"error\" />\n\n <div\n v-else\n class=\"vfp-flex vfp-flex-col vfp-items-center vfp-justify-center vfp-w-full vfp-h-full vfp-p-6 vfp-gap-6 vfp-select-none\"\n >\n <!-- 唱片机 -->\n <div class=\"vfp-relative\" style=\"width: 260px; height: 240px\">\n <!-- 外圈光晕 -->\n <div\n class=\"vfp-absolute vfp-rounded-full\"\n :style=\"{\n width: '220px',\n height: '220px',\n top: '18px',\n left: '8px',\n background: 'radial-gradient(circle, rgba(129,140,248,0.12) 0%, transparent 70%)',\n opacity: isPlaying ? 0.7 : 0.2,\n transition: 'opacity 0.5s',\n }\"\n />\n\n <!-- 唱片主体 -->\n <div\n class=\"vfp-absolute vfp-rounded-full vfp-overflow-hidden\"\n :style=\"{\n width: '200px',\n height: '200px',\n top: '28px',\n left: '18px',\n background: `\n radial-gradient(circle at center, transparent 95%, rgba(30,30,30,0.8) 95.5%, #111 97%),\n radial-gradient(circle at center, transparent 38%, rgba(50,50,50,0.5) 38.15%, transparent 38.4%),\n radial-gradient(circle at center, transparent 45%, rgba(50,50,50,0.3) 45.15%, transparent 45.4%),\n radial-gradient(circle at center, transparent 52%, rgba(50,50,50,0.5) 52.15%, transparent 52.4%),\n radial-gradient(circle at center, transparent 59%, rgba(50,50,50,0.3) 59.15%, transparent 59.4%),\n radial-gradient(circle at center, transparent 66%, rgba(50,50,50,0.5) 66.15%, transparent 66.4%),\n radial-gradient(circle at center, transparent 73%, rgba(50,50,50,0.3) 73.15%, transparent 73.4%),\n radial-gradient(circle at center, transparent 80%, rgba(50,50,50,0.4) 80.15%, transparent 80.4%),\n radial-gradient(circle at center, transparent 87%, rgba(50,50,50,0.3) 87.15%, transparent 87.4%),\n conic-gradient(from 0deg, #1c1c1c, #232323, #1a1a1a, #262626, #1c1c1c, #212121, #1a1a1a, #252525, #1c1c1c, #232323, #1a1a1a, #262626, #1c1c1c)\n `,\n boxShadow: isPlaying\n ? '0 0 36px rgba(129,140,248,0.1), 0 8px 32px rgba(0,0,0,0.4), inset 0 0 20px rgba(0,0,0,0.4)'\n : '0 8px 32px rgba(0,0,0,0.4), inset 0 0 20px rgba(0,0,0,0.4)',\n animation: 'vfp-vinyl-spin 8s linear infinite',\n animationPlayState: isPlaying ? 'running' : 'paused',\n }\"\n >\n <!-- 中心标签 -->\n <div\n class=\"vfp-absolute vfp-rounded-full\"\n :style=\"{\n width: '34%',\n height: '34%',\n top: '33%',\n left: '33%',\n background: 'radial-gradient(circle at 40% 38%, #818cf8, #6366f1, #4f46e5, #4338ca)',\n boxShadow: 'inset 0 1px 3px rgba(255,255,255,0.25), inset 0 -1px 3px rgba(0,0,0,0.3), 0 0 8px rgba(0,0,0,0.3)',\n }\"\n >\n <div\n class=\"vfp-absolute vfp-rounded-full\"\n :style=\"{\n width: '14%',\n height: '14%',\n top: '43%',\n left: '43%',\n background: 'radial-gradient(circle at 40% 40%, #333, #0d0d0d)',\n boxShadow: 'inset 0 1px 3px rgba(0,0,0,0.9), 0 0 2px rgba(0,0,0,0.5)',\n }\"\n />\n </div>\n </div>\n\n <!-- 唱臂 -->\n <div\n class=\"vfp-absolute\"\n :style=\"{\n top: '-6px',\n right: '2px',\n width: '100px',\n height: '120px',\n transformOrigin: '76px 16px',\n zIndex: 5,\n transform: isPlaying ? 'rotate(16deg)' : 'rotate(0deg)',\n transition: 'transform 0.8s cubic-bezier(0.4, 0, 0.2, 1)',\n }\"\n >\n <svg width=\"100\" height=\"120\" viewBox=\"0 0 100 120\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <circle cx=\"76\" cy=\"16\" r=\"13\" fill=\"rgba(0,0,0,0.3)\" />\n <circle cx=\"76\" cy=\"16\" r=\"11\" fill=\"url(#vfp-baseGrad)\" />\n <circle cx=\"76\" cy=\"16\" r=\"6\" fill=\"url(#vfp-baseInnerGrad)\" />\n <circle cx=\"76\" cy=\"16\" r=\"2.5\" fill=\"#222\" stroke=\"#555\" stroke-width=\"0.5\" />\n <path d=\"M74 22 L56 88\" stroke=\"url(#vfp-armGrad)\" stroke-width=\"3.5\" stroke-linecap=\"round\" />\n <rect x=\"50\" y=\"86\" width=\"12\" height=\"7\" rx=\"1.5\" fill=\"url(#vfp-headGrad)\" />\n <rect x=\"52.5\" y=\"92\" width=\"7\" height=\"9\" rx=\"1\" fill=\"url(#vfp-cartridgeGrad)\" />\n <line x1=\"56\" y1=\"101\" x2=\"56\" y2=\"105\" stroke=\"#bbb\" stroke-width=\"1.2\" stroke-linecap=\"round\" />\n <circle cx=\"56\" cy=\"105.5\" r=\"0.8\" fill=\"#ddd\" />\n\n <defs>\n <radialGradient id=\"vfp-baseGrad\" cx=\"40%\" cy=\"35%\">\n <stop offset=\"0%\" stop-color=\"#555\" />\n <stop offset=\"100%\" stop-color=\"#1a1a1a\" />\n </radialGradient>\n <radialGradient id=\"vfp-baseInnerGrad\" cx=\"40%\" cy=\"35%\">\n <stop offset=\"0%\" stop-color=\"#666\" />\n <stop offset=\"100%\" stop-color=\"#333\" />\n </radialGradient>\n <linearGradient id=\"vfp-armGrad\" x1=\"0\" y1=\"0\" x2=\"0\" y2=\"1\">\n <stop offset=\"0%\" stop-color=\"#555\" />\n <stop offset=\"50%\" stop-color=\"#444\" />\n <stop offset=\"100%\" stop-color=\"#333\" />\n </linearGradient>\n <linearGradient id=\"vfp-headGrad\" x1=\"0\" y1=\"0\" x2=\"0\" y2=\"1\">\n <stop offset=\"0%\" stop-color=\"#555\" />\n <stop offset=\"100%\" stop-color=\"#333\" />\n </linearGradient>\n <linearGradient id=\"vfp-cartridgeGrad\" x1=\"0\" y1=\"0\" x2=\"0\" y2=\"1\">\n <stop offset=\"0%\" stop-color=\"#444\" />\n <stop offset=\"100%\" stop-color=\"#222\" />\n </linearGradient>\n </defs>\n </svg>\n </div>\n </div>\n\n <!-- 文件名 -->\n <div class=\"vfp-text-center vfp-max-w-md vfp-px-4\">\n <div class=\"vfp-text-lg vfp-font-medium vfp-mb-1 vfp-truncate vfp-text-fg-primary\">\n {{ fileName }}\n </div>\n <p class=\"vfp-text-xs vfp-tracking-widest vfp-uppercase vfp-text-accent\">Audio</p>\n </div>\n\n <!-- 控制面板 -->\n <div\n class=\"vfp-w-full vfp-max-w-md vfp-rounded-2xl vfp-p-5 vfp-border vfp-bg-surface-1 vfp-border-line-weak\"\n :style=\"{ backdropFilter: 'blur(16px)' }\"\n >\n <!-- 进度条 -->\n <div class=\"vfp-mb-5\">\n <div class=\"vfp-relative vfp-h-4 vfp-flex vfp-items-center\">\n <div\n class=\"vfp-absolute vfp-w-full vfp-h-[5px] vfp-rounded-full vfp-bg-surface-2\"\n />\n <div\n class=\"vfp-absolute vfp-h-[5px] vfp-rounded-full vfp-pointer-events-none\"\n :style=\"{\n width: `${progress * 100}%`,\n background: 'linear-gradient(90deg, var(--fp-accent), var(--fp-accent-hover))',\n boxShadow: isPlaying ? '0 0 8px rgba(129,140,248,0.4)' : 'none',\n transition: 'width 0.1s linear',\n }\"\n />\n <input\n type=\"range\"\n min=\"0\"\n :max=\"duration > 0 ? duration : currentTime || 100\"\n step=\"any\"\n :value=\"currentTime\"\n :disabled=\"duration <= 0\"\n :aria-label=\"t('audio.aria.progress')\"\n class=\"audio-slider vfp-absolute vfp-w-full\"\n @input=\"(e) => seek(parseFloat((e.target as HTMLInputElement).value))\"\n />\n </div>\n <div\n class=\"vfp-flex vfp-justify-between vfp-text-xs vfp-mt-2.5 vfp-text-fg-tertiary\"\n >\n <span style=\"font-variant-numeric: tabular-nums\">{{ formatTime(currentTime) }}</span>\n <span style=\"font-variant-numeric: tabular-nums\">{{ duration > 0 ? formatTime(duration) : '--:--' }}</span>\n </div>\n </div>\n\n <!-- 控制按钮 -->\n <div class=\"vfp-flex vfp-items-center vfp-justify-center vfp-gap-3\">\n <!-- 循环 -->\n <button\n :class=\"[\n 'vfp-w-9 vfp-h-9 vfp-rounded-full vfp-flex vfp-items-center vfp-justify-center vfp-transition-colors audio-ctrl-btn',\n isLoop ? 'vfp-bg-accent-soft vfp-text-accent' : 'vfp-bg-surface-2 vfp-text-fg-tertiary',\n ]\"\n :aria-label=\"isLoop ? t('audio.aria.loop_off') : t('audio.aria.loop_on')\"\n @click=\"toggleLoop\"\n >\n <Repeat class=\"vfp-w-4 vfp-h-4\" />\n </button>\n\n <!-- 后退 -->\n <button\n class=\"vfp-w-10 vfp-h-10 vfp-rounded-full vfp-flex vfp-items-center vfp-justify-center vfp-transition-colors audio-ctrl-btn vfp-bg-surface-2 vfp-text-fg-secondary\"\n :aria-label=\"t('audio.aria.backward_10')\"\n @click=\"skip(-10)\"\n >\n <SkipBack class=\"vfp-w-[18px] vfp-h-[18px]\" />\n </button>\n\n <!-- 播放/暂停 -->\n <button\n class=\"vfp-w-14 vfp-h-14 vfp-rounded-full vfp-flex vfp-items-center vfp-justify-center audio-ctrl-btn\"\n :style=\"{\n background: 'linear-gradient(135deg, var(--fp-accent-hover), var(--fp-accent))',\n color: '#fff',\n boxShadow: '0 4px 20px rgba(99,102,241,0.35)',\n }\"\n :aria-label=\"isPlaying ? t('audio.aria.pause') : t('audio.aria.play')\"\n @click=\"togglePlay\"\n >\n <Pause v-if=\"isPlaying\" class=\"vfp-w-6 vfp-h-6\" />\n <Play v-else class=\"vfp-w-6 vfp-h-6 vfp-ml-0.5\" />\n </button>\n\n <!-- 前进 -->\n <button\n class=\"vfp-w-10 vfp-h-10 vfp-rounded-full vfp-flex vfp-items-center vfp-justify-center vfp-transition-colors audio-ctrl-btn vfp-bg-surface-2 vfp-text-fg-secondary\"\n :aria-label=\"t('audio.aria.forward_10')\"\n @click=\"skip(10)\"\n >\n <SkipForward class=\"vfp-w-[18px] vfp-h-[18px]\" />\n </button>\n\n <!-- 音量 -->\n <div ref=\"volumeRef\" class=\"vfp-relative\" @mouseenter=\"handleVolumeEnter\" @mouseleave=\"handleVolumeLeave\">\n <button\n :class=\"[\n 'vfp-w-9 vfp-h-9 vfp-rounded-full vfp-flex vfp-items-center vfp-justify-center vfp-transition-colors audio-ctrl-btn',\n showVolume ? 'vfp-bg-accent-soft vfp-text-accent' : 'vfp-bg-surface-2 vfp-text-fg-secondary',\n ]\"\n :aria-label=\"isMuted ? t('audio.aria.unmute') : t('audio.aria.mute')\"\n @click=\"toggleMute\"\n >\n <component :is=\"VolumeIcon\" class=\"vfp-w-4 vfp-h-4\" />\n </button>\n\n <Transition name=\"vfp-fade\">\n <div\n v-if=\"showVolume\"\n class=\"vfp-absolute vfp-bottom-full vfp-mb-2 vfp-rounded-xl vfp-p-3 vfp-border vfp-bg-surface-3 vfp-border-line\"\n :style=\"{\n left: '50%',\n marginLeft: '-27px',\n backdropFilter: 'blur(16px)',\n }\"\n @mouseenter=\"handleVolumeEnter\"\n @mouseleave=\"handleVolumeLeave\"\n >\n <div class=\"vfp-flex vfp-flex-col vfp-items-center vfp-gap-2\" style=\"height: 100px\">\n <div\n class=\"vfp-relative vfp-flex vfp-items-center vfp-justify-center\"\n style=\"width: 24px; height: 80px\"\n >\n <div\n class=\"vfp-absolute vfp-rounded-full vfp-bg-surface-2\"\n style=\"width: 3px; height: 100%\"\n />\n <div\n class=\"vfp-absolute vfp-bottom-0 vfp-rounded-full vfp-pointer-events-none\"\n :style=\"{\n width: '3px',\n height: `${(isMuted ? 0 : volume) * 100}%`,\n background: 'var(--fp-accent-hover)',\n transition: 'height 0.1s linear',\n }\"\n />\n <input\n type=\"range\"\n min=\"0\"\n max=\"1\"\n step=\"0.01\"\n :value=\"isMuted ? 0 : volume\"\n :aria-label=\"t('audio.aria.volume')\"\n class=\"volume-slider-vertical vfp-absolute\"\n style=\"width: 80px; height: 24px; transform: rotate(-90deg); transform-origin: center center\"\n @input=\"(e) => setVolume(parseFloat((e.target as HTMLInputElement).value))\"\n />\n </div>\n <span class=\"vfp-text-[10px] vfp-tabular-nums vfp-text-fg-tertiary\">\n {{ Math.round((isMuted ? 0 : volume) * 100) }}\n </span>\n </div>\n </div>\n </Transition>\n </div>\n </div>\n </div>\n\n <audio ref=\"audioRef\" :src=\"url\" class=\"vfp-hidden\" />\n </div>\n</template>\n\n<style scoped>\n.audio-ctrl-btn {\n border: 0;\n cursor: pointer;\n}\n</style>\n"],"names":["useAudioPlayer","url","audioRef","ref","isPlaying","isLoading","currentTime","duration","volume","isMuted","isLoop","error","cleanup","bindEvents","audio","onTimeUpdate","onDurationChange","onCanPlay","onWaiting","onPlaying","onPlay","onPause","onEnded","onError","watch","el","onUnmounted","time","seconds","vol","clamped","next","formatTime","urlRef","toRef","__props","t","useTranslator","togglePlay","seek","skip","setVolume","toggleMute","toggleLoop","showVolume","volumeHideTimer","volumeRef","progress","computed","VolumeIcon","VolumeX","Volume1","Volume2","handleClickOutside","e","onMounted","onBeforeUnmount","handleVolumeEnter","handleVolumeLeave","_unref","_createBlock","RendererError","_openBlock","_createElementBlock","_hoisted_1","_createElementVNode","_hoisted_2","_normalizeStyle","_hoisted_3","_hoisted_4","_toDisplayString","_cache","_hoisted_5","_hoisted_6","_hoisted_7","_hoisted_9","_hoisted_10","_hoisted_11","_hoisted_12","_normalizeClass","args","_createVNode","Repeat","SkipBack","Pause","Play","SkipForward","_resolveDynamicComponent","_Transition","_hoisted_18","_hoisted_19","_hoisted_21"],"mappings":"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"}
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { defineComponent as k, ref as p, onMounted as T, watch as D, onBeforeUnmount as M, openBlock as v, createElementBlock as h, createElementVNode as m, toDisplayString as S, unref as z, createCommentVNode as w, createBlock as C, normalizeStyle as N } from "vue";
|
|
2
2
|
import B from "x-data-spreadsheet";
|
|
3
3
|
/* empty css */
|
|
4
|
-
import { u as E, a as H, E as R, S as W, M as U, U as V } from "./index-
|
|
5
|
-
import { _ as F } from "./RendererError.vue_vue_type_script_setup_true_lang-
|
|
4
|
+
import { u as E, a as H, E as R, S as W, M as U, U as V } from "./index-D9QQL7U6.mjs";
|
|
5
|
+
import { _ as F } from "./RendererError.vue_vue_type_script_setup_true_lang-BNoENOWX.mjs";
|
|
6
6
|
const L = { class: "vfp-relative vfp-flex vfp-flex-col vfp-items-center vfp-w-full vfp-h-full" }, O = {
|
|
7
7
|
key: 0,
|
|
8
8
|
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"
|
|
@@ -101,4 +101,4 @@ const L = { class: "vfp-relative vfp-flex vfp-flex-col vfp-items-center vfp-w-fu
|
|
|
101
101
|
export {
|
|
102
102
|
K as default
|
|
103
103
|
};
|
|
104
|
-
//# sourceMappingURL=index-
|
|
104
|
+
//# sourceMappingURL=index-DGqDJMot.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index-
|
|
1
|
+
{"version":3,"file":"index-DGqDJMot.mjs","sources":["../../src/renderers/Csv/index.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { ref, watch, onMounted, onBeforeUnmount } from 'vue';\nimport Spreadsheet from 'x-data-spreadsheet';\nimport 'x-data-spreadsheet/dist/xspreadsheet.css';\nimport {\n parseCsv,\n guessCsvDelimiter,\n fetchTextUtf8,\n convertCsvToSpreadsheetData,\n} from '@eternalheart/file-preview-core';\nimport { useTranslator } from '../../composables/useTranslator';\nimport { useFetcher } from '../../composables/useRequest';\nimport RendererError from '../RendererError.vue';\n\nconst props = defineProps<{\n url: string;\n fileName: string;\n}>();\n\nconst { t } = useTranslator();\nconst fetcher = useFetcher();\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 loadCsv = async () => {\n if (!containerRef.value) return;\n\n loading.value = true;\n error.value = null;\n\n try {\n const text = await fetchTextUtf8(props.url, { fetcher: fetcher.value });\n const parsed = parseCsv(text, { delimiter: guessCsvDelimiter(props.fileName) });\n const data = convertCsvToSpreadsheetData(parsed.header, parsed.rows, props.fileName);\n\n sheetData = data as unknown as Record<string, unknown>[];\n mountSpreadsheet();\n loading.value = false;\n } catch (err) {\n console.error('CSV 解析错误:', err);\n error.value = t.value('csv.load_failed');\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(() => loadCsv());\n }, 100);\n});\n\nwatch(\n () => props.url,\n () => {\n loadCsv();\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('csv.loading') }}</p>\n </div>\n </div>\n\n <RendererError\n v-if=\"error && !loading\"\n :message=\"error\"\n class=\"vfp-absolute vfp-inset-0 vfp-bg-surface-toolbar vfp-backdrop-blur-sm vfp-z-10\"\n />\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","fetcher","useFetcher","loading","ref","error","containerRef","sheetData","resizeObserver","resizeTimeout","lastDimensions","calculateDimensions","rawWidth","rawHeight","width","height","mountSpreadsheet","isMobile","Spreadsheet","loadCsv","text","fetchTextUtf8","parsed","parseCsv","guessCsvDelimiter","convertCsvToSpreadsheetData","err","onMounted","isInitialRender","newDimensions","widthDiff","heightDiff","watch","onBeforeUnmount","_openBlock","_createElementBlock","_hoisted_1","_hoisted_2","_createElementVNode","_hoisted_3","_hoisted_4","_toDisplayString","_unref","_createBlock","RendererError"],"mappings":"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"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { defineComponent as T, ref as i, watch as _, openBlock as a, createElementBlock as p, createElementVNode as $, createBlock as z, toDisplayString as M } from "vue";
|
|
2
|
-
import { u as S, a as D, c as E, E as B, _ as H } from "./index-
|
|
2
|
+
import { u as S, a as D, c as E, E as B, _ as H } from "./index-D9QQL7U6.mjs";
|
|
3
3
|
import { codeToHtml as L } from "shiki";
|
|
4
|
-
import { _ as N } from "./RendererError.vue_vue_type_script_setup_true_lang-
|
|
4
|
+
import { _ as N } from "./RendererError.vue_vue_type_script_setup_true_lang-BNoENOWX.mjs";
|
|
5
5
|
const P = {
|
|
6
6
|
key: 0,
|
|
7
7
|
class: "vfp-flex vfp-items-center vfp-justify-center vfp-w-full vfp-h-full"
|
|
@@ -11,7 +11,7 @@ const P = {
|
|
|
11
11
|
style: { background: "var(--fp-code-bg)" }
|
|
12
12
|
}, j = {
|
|
13
13
|
key: 0,
|
|
14
|
-
class: "vfp-
|
|
14
|
+
class: "vfp-py-6 vfp-px-4 vfp-text-fg-primary vfp-font-mono vfp-text-sm vfp-whitespace-pre-wrap vfp-break-words"
|
|
15
15
|
}, F = ["innerHTML"], I = /* @__PURE__ */ T({
|
|
16
16
|
__name: "index",
|
|
17
17
|
props: {
|
|
@@ -19,7 +19,7 @@ const P = {
|
|
|
19
19
|
fileName: {}
|
|
20
20
|
},
|
|
21
21
|
setup(g) {
|
|
22
|
-
const u = g, { t:
|
|
22
|
+
const u = g, { t: y } = S(), w = D(), v = E(), s = i(""), l = i(""), f = i(!0), o = i(null), k = (e) => {
|
|
23
23
|
const r = " ", n = /(>)(<)(\/*)/g, m = e.replace(n, `$1
|
|
24
24
|
$2$3`);
|
|
25
25
|
let t = 0;
|
|
@@ -43,7 +43,7 @@ $2$3`);
|
|
|
43
43
|
}, d = async () => {
|
|
44
44
|
f.value = !0, o.value = null;
|
|
45
45
|
try {
|
|
46
|
-
const e = await B(u.url, { fetcher:
|
|
46
|
+
const e = await B(u.url, { fetcher: w.value });
|
|
47
47
|
s.value = x(e);
|
|
48
48
|
try {
|
|
49
49
|
l.value = await L(s.value, {
|
|
@@ -54,7 +54,7 @@ $2$3`);
|
|
|
54
54
|
l.value = "";
|
|
55
55
|
}
|
|
56
56
|
} catch (e) {
|
|
57
|
-
console.error(e), o.value =
|
|
57
|
+
console.error(e), o.value = y.value("xml.load_failed");
|
|
58
58
|
} finally {
|
|
59
59
|
f.value = !1;
|
|
60
60
|
}
|
|
@@ -74,8 +74,8 @@ $2$3`);
|
|
|
74
74
|
}, null, 8, F)) : (a(), p("pre", j, M(s.value), 1))
|
|
75
75
|
]));
|
|
76
76
|
}
|
|
77
|
-
}), O = /* @__PURE__ */ H(I, [["__scopeId", "data-v-
|
|
77
|
+
}), O = /* @__PURE__ */ H(I, [["__scopeId", "data-v-ba95455f"]]);
|
|
78
78
|
export {
|
|
79
79
|
O as default
|
|
80
80
|
};
|
|
81
|
-
//# sourceMappingURL=index-
|
|
81
|
+
//# sourceMappingURL=index-DTyG1Wzp.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index-DTyG1Wzp.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 { useFetcher } from '../../composables/useRequest';\nimport { useResolvedTheme } from '../../composables/useResolvedTheme';\nimport RendererError from '../RendererError.vue';\n\nconst props = defineProps<{\n url: string;\n fileName: string;\n}>();\n\nconst { t } = useTranslator();\nconst fetcher = useFetcher();\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, { fetcher: fetcher.value });\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 <RendererError v-else-if=\"error\" :message=\"error\" />\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-py-6 vfp-px-4 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 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 display: inline-block;\n width: 100%;\n padding-left: 4.5em;\n text-indent: -4.5em;\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</style>\n"],"names":["props","__props","t","useTranslator","fetcher","useFetcher","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","_createBlock","RendererError","_hoisted_2","_hoisted_3","_toDisplayString"],"mappings":";;;;;;;;;;;;;;;;;;;;;AASA,UAAMA,IAAQC,GAKR,EAAE,GAAAC,EAAA,IAAMC,EAAA,GACRC,IAAUC,EAAA,GACVC,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,EAAc3B,EAAM,KAAK,EAAE,SAASI,EAAQ,OAAO;AACrE,QAAAI,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,QAAQV,EAAE,MAAM,iBAAiB;AAAA,MACzC,UAAA;AACE,QAAAS,EAAQ,QAAQ;AAAA,MAClB;AAAA,IACF;AAEA,WAAAmB,EAAM,MAAM9B,EAAM,KAAKyB,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,QAInGvB,EAAA,cAA1BwB,EAAoDC,GAAA;AAAA;MAAlB,SAASzB,EAAA;AAAA,IAAA,6BAE3CmB,KAAAC,EAOM,OAPNM,GAOM;AAAA,MALK5B,EAAA,cAITsB,EAAyD,OAAA;AAAA;QAA7C,OAAM;AAAA,QAAgB,WAAQtB,EAAA;AAAA,MAAA,wBAL1CsB,EAIC,OAJDO,GAICC,EADKhC,EAAA,KAAO,GAAA,CAAA;AAAA;;;"}
|
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
import { defineComponent as A, computed as G, ref as s, watch as y, nextTick as I, openBlock as
|
|
1
|
+
import { defineComponent as A, computed as G, ref as s, watch as y, nextTick as I, openBlock as a, createElementBlock as d, createElementVNode as S, createBlock as P, toDisplayString as D } from "vue";
|
|
2
2
|
import K from "markdown-it";
|
|
3
3
|
import O from "@traptitech/markdown-it-katex";
|
|
4
4
|
import { codeToHtml as H } from "shiki";
|
|
5
|
-
import { u as R, a as N, c as Y, E as F, _ as W } from "./index-
|
|
6
|
-
import { _ as z } from "./RendererError.vue_vue_type_script_setup_true_lang-
|
|
5
|
+
import { u as R, a as N, c as Y, E as F, _ as W } from "./index-D9QQL7U6.mjs";
|
|
6
|
+
import { _ as z } from "./RendererError.vue_vue_type_script_setup_true_lang-BNoENOWX.mjs";
|
|
7
7
|
const J = {
|
|
8
8
|
key: 0,
|
|
9
9
|
class: "vfp-flex vfp-items-center vfp-justify-center vfp-w-full vfp-h-full"
|
|
@@ -16,15 +16,15 @@ const J = {
|
|
|
16
16
|
class: "vfp-p-6 vfp-text-fg-primary vfp-font-mono vfp-text-sm vfp-whitespace-pre-wrap vfp-break-words"
|
|
17
17
|
}, X = ["innerHTML"], Z = {
|
|
18
18
|
key: 3,
|
|
19
|
-
class: "vfp-w-full vfp-h-full vfp-overflow-auto vfp-
|
|
20
|
-
}, ee =
|
|
19
|
+
class: "vfp-w-full vfp-h-full vfp-overflow-auto vfp-py-6 vfp-px-4"
|
|
20
|
+
}, ee = ["innerHTML"], E = '<svg xmlns="http://www.w3.org/2000/svg" width="13" height="13" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><rect width="14" height="14" x="8" y="8" rx="2" ry="2"/><path d="M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2"/></svg>', B = '<svg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><rect width="14" height="14" x="8" y="8" rx="2" ry="2"/><path d="M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2"/></svg>', te = '<svg xmlns="http://www.w3.org/2000/svg" width="13" height="13" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M20 6 9 17l-5-5"/></svg>', oe = '<svg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M20 6 9 17l-5-5"/></svg>', re = /* @__PURE__ */ A({
|
|
21
21
|
__name: "index",
|
|
22
22
|
props: {
|
|
23
23
|
url: {},
|
|
24
24
|
viewMode: {}
|
|
25
25
|
},
|
|
26
|
-
setup(
|
|
27
|
-
const
|
|
26
|
+
setup(_) {
|
|
27
|
+
const b = _, { t: i } = R(), L = N(), q = Y(), k = G(() => q.value === "light" ? "github-light" : "github-dark"), g = s(""), p = s(""), u = s(""), v = s(!0), f = s(null), h = s(null), l = new K({
|
|
28
28
|
html: !0,
|
|
29
29
|
linkify: !0,
|
|
30
30
|
typographer: !1,
|
|
@@ -50,10 +50,10 @@ const J = {
|
|
|
50
50
|
l.renderer.rules.table_open = (o, r, e, n, t) => '<div class="table-wrapper">' + V(o, r, e, n, t);
|
|
51
51
|
const j = l.renderer.rules.table_close || ((o, r, e, n, t) => t.renderToken(o, r, e));
|
|
52
52
|
l.renderer.rules.table_close = (o, r, e, n, t) => j(o, r, e, n, t) + "</div>";
|
|
53
|
-
const
|
|
53
|
+
const x = async () => {
|
|
54
54
|
v.value = !0, f.value = null;
|
|
55
55
|
try {
|
|
56
|
-
const o = await F(
|
|
56
|
+
const o = await F(b.url, { fetcher: L.value });
|
|
57
57
|
g.value = o, p.value = l.render(o), v.value = !1;
|
|
58
58
|
try {
|
|
59
59
|
u.value = await H(o, { lang: "markdown", theme: k.value });
|
|
@@ -63,7 +63,7 @@ const J = {
|
|
|
63
63
|
} catch (o) {
|
|
64
64
|
console.error(o), f.value = i.value("markdown.load_failed"), v.value = !1;
|
|
65
65
|
}
|
|
66
|
-
},
|
|
66
|
+
}, C = (o, r) => {
|
|
67
67
|
const e = document.createElement("button");
|
|
68
68
|
return e.type = "button", e.className = r ? "code-copy-btn" : "code-copy-btn code-copy-float", e.title = i.value("markdown.copy_code"), e.innerHTML = r ? E : B, e.addEventListener("click", async (n) => {
|
|
69
69
|
n.stopPropagation();
|
|
@@ -73,7 +73,7 @@ const J = {
|
|
|
73
73
|
const t = document.createElement("textarea");
|
|
74
74
|
t.value = o, document.body.appendChild(t), t.select(), document.execCommand("copy"), document.body.removeChild(t);
|
|
75
75
|
}
|
|
76
|
-
e.innerHTML = r ?
|
|
76
|
+
e.innerHTML = r ? te : oe, e.title = i.value("markdown.copied"), setTimeout(() => {
|
|
77
77
|
e.innerHTML = r ? E : B, e.title = i.value("markdown.copy_code");
|
|
78
78
|
}, 2e3);
|
|
79
79
|
}), e;
|
|
@@ -82,12 +82,12 @@ const J = {
|
|
|
82
82
|
if (!h.value) return;
|
|
83
83
|
const o = h.value.querySelectorAll('pre[data-shiki-pending="1"]');
|
|
84
84
|
for (const t of o) {
|
|
85
|
-
const m = t.getAttribute("data-lang") || "text",
|
|
85
|
+
const m = t.getAttribute("data-lang") || "text", c = ((e = t.querySelector("code")) == null ? void 0 : e.textContent) || "";
|
|
86
86
|
try {
|
|
87
|
-
const w = await H(
|
|
88
|
-
|
|
89
|
-
const
|
|
90
|
-
|
|
87
|
+
const w = await H(c, { lang: m, theme: k.value }), M = document.createElement("div");
|
|
88
|
+
M.innerHTML = w;
|
|
89
|
+
const T = M.firstElementChild;
|
|
90
|
+
T && t.replaceWith(T);
|
|
91
91
|
} catch {
|
|
92
92
|
t.style.backgroundColor = "var(--fp-code-bg)", t.removeAttribute("data-shiki-pending");
|
|
93
93
|
}
|
|
@@ -95,38 +95,36 @@ const J = {
|
|
|
95
95
|
const r = h.value.querySelectorAll(".code-block-wrapper");
|
|
96
96
|
for (const t of r) {
|
|
97
97
|
if (t.querySelector(".code-copy-btn")) continue;
|
|
98
|
-
const m = t.querySelector(".code-block-header"),
|
|
99
|
-
m ? m.appendChild(
|
|
98
|
+
const m = t.querySelector(".code-block-header"), c = t.querySelector("pre"), w = ((n = c == null ? void 0 : c.querySelector("code")) == null ? void 0 : n.textContent) ?? (c == null ? void 0 : c.textContent) ?? "";
|
|
99
|
+
m ? m.appendChild(C(w, !0)) : t.appendChild(C(w, !1));
|
|
100
100
|
}
|
|
101
101
|
};
|
|
102
|
-
return y(() =>
|
|
102
|
+
return y(() => b.url, x, { immediate: !0 }), y(p, async () => {
|
|
103
103
|
p.value && (await I(), $());
|
|
104
104
|
}), y(k, () => {
|
|
105
|
-
g.value &&
|
|
106
|
-
}), (o, r) => v.value ? (
|
|
107
|
-
|
|
108
|
-
])])) : f.value ? (
|
|
105
|
+
g.value && x();
|
|
106
|
+
}), (o, r) => v.value ? (a(), d("div", J, [...r[0] || (r[0] = [
|
|
107
|
+
S("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" }, null, -1)
|
|
108
|
+
])])) : f.value ? (a(), P(z, {
|
|
109
109
|
key: 1,
|
|
110
110
|
message: f.value
|
|
111
|
-
}, null, 8, ["message"])) :
|
|
112
|
-
u.value ? (
|
|
111
|
+
}, null, 8, ["message"])) : _.viewMode === "source" ? (a(), d("div", Q, [
|
|
112
|
+
u.value ? (a(), d("div", {
|
|
113
113
|
key: 1,
|
|
114
114
|
class: "shiki-wrapper",
|
|
115
115
|
innerHTML: u.value
|
|
116
|
-
}, null, 8, X)) : (
|
|
117
|
-
])) : (
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
}, null, 8, te)
|
|
125
|
-
])
|
|
116
|
+
}, null, 8, X)) : (a(), d("pre", U, D(g.value), 1))
|
|
117
|
+
])) : (a(), d("div", Z, [
|
|
118
|
+
S("div", {
|
|
119
|
+
ref_key: "containerRef",
|
|
120
|
+
ref: h,
|
|
121
|
+
class: "markdown-body",
|
|
122
|
+
innerHTML: p.value
|
|
123
|
+
}, null, 8, ee)
|
|
126
124
|
]));
|
|
127
125
|
}
|
|
128
|
-
}),
|
|
126
|
+
}), ie = /* @__PURE__ */ W(re, [["__scopeId", "data-v-5968e550"]]);
|
|
129
127
|
export {
|
|
130
|
-
|
|
128
|
+
ie as default
|
|
131
129
|
};
|
|
132
|
-
//# sourceMappingURL=index-
|
|
130
|
+
//# sourceMappingURL=index-DglMeKJM.mjs.map
|