@eternalheart/vue-file-preview 1.3.12 → 1.3.14
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/README.md +27 -0
- package/README.zh-CN.md +27 -0
- 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/{index-Dpqyibd9.mjs → index-5hGtGeD4.mjs} +2 -2
- package/lib/chunks/{index-Dpqyibd9.mjs.map → index-5hGtGeD4.mjs.map} +1 -1
- package/lib/chunks/{index-CtEc7uvz.mjs → index-B-f41wjl.mjs} +2 -2
- package/lib/chunks/{index-CtEc7uvz.mjs.map → index-B-f41wjl.mjs.map} +1 -1
- package/lib/chunks/{index-BeTJ1DUg.mjs → index-BI32fnT-.mjs} +2 -2
- package/lib/chunks/{index-BeTJ1DUg.mjs.map → index-BI32fnT-.mjs.map} +1 -1
- package/lib/chunks/{index-CRmrH3nJ.mjs → index-BgdBpGYv.mjs} +6 -6
- package/lib/chunks/{index-CRmrH3nJ.mjs.map → index-BgdBpGYv.mjs.map} +1 -1
- package/lib/chunks/index-BkMYaea2.mjs +279 -0
- package/lib/chunks/index-BkMYaea2.mjs.map +1 -0
- package/lib/chunks/{index-Bt25EBuH.mjs → index-BlD2p_KC.mjs} +2 -2
- package/lib/chunks/{index-Bt25EBuH.mjs.map → index-BlD2p_KC.mjs.map} +1 -1
- package/lib/chunks/{index-BX-xIvu9.mjs → index-Bz9nKaz5.mjs} +2 -2
- package/lib/chunks/{index-BX-xIvu9.mjs.map → index-Bz9nKaz5.mjs.map} +1 -1
- package/lib/chunks/{index-BQqNfXR5.mjs → index-C0OWrmU8.mjs} +2 -2
- package/lib/chunks/{index-BQqNfXR5.mjs.map → index-C0OWrmU8.mjs.map} +1 -1
- package/lib/chunks/{index-B0tDrTQA.mjs → index-CFaWV6cC.mjs} +87 -82
- package/lib/chunks/index-CFaWV6cC.mjs.map +1 -0
- package/lib/chunks/{index-Bhkl1Msu.mjs → index-CJ86PaaF.mjs} +2 -2
- package/lib/chunks/{index-Bhkl1Msu.mjs.map → index-CJ86PaaF.mjs.map} +1 -1
- package/lib/chunks/{index-D37d-1Bp.mjs → index-CMKtCKpo.mjs} +9 -9
- package/lib/chunks/{index-D37d-1Bp.mjs.map → index-CMKtCKpo.mjs.map} +1 -1
- package/lib/chunks/{index-BA2QrqaL.mjs → index-CUA_z4GJ.mjs} +2 -2
- package/lib/chunks/{index-BA2QrqaL.mjs.map → index-CUA_z4GJ.mjs.map} +1 -1
- package/lib/chunks/index-Cr0Z36a0.mjs +318 -0
- package/lib/chunks/index-Cr0Z36a0.mjs.map +1 -0
- package/lib/chunks/{index-yZM6j-26.mjs → index-DVJfd09T.mjs} +2 -2
- package/lib/chunks/{index-yZM6j-26.mjs.map → index-DVJfd09T.mjs.map} +1 -1
- package/lib/chunks/{index-BzLx8rHY.mjs → index-DYrRDrZL.mjs} +2 -2
- package/lib/chunks/{index-BzLx8rHY.mjs.map → index-DYrRDrZL.mjs.map} +1 -1
- package/lib/chunks/{index-Ba1_ms5t.mjs → index-GcvjVFMf.mjs} +2 -2
- package/lib/chunks/{index-Ba1_ms5t.mjs.map → index-GcvjVFMf.mjs.map} +1 -1
- package/lib/chunks/{index-C-4Vkx_h.mjs → index-P8naV3DU.mjs} +2 -2
- package/lib/chunks/{index-C-4Vkx_h.mjs.map → index-P8naV3DU.mjs.map} +1 -1
- package/lib/chunks/{index-BnkUXcOD.mjs → index-VTsO_yR7.mjs} +2 -2
- package/lib/chunks/{index-BnkUXcOD.mjs.map → index-VTsO_yR7.mjs.map} +1 -1
- package/lib/chunks/{index-DvNpZrTA.mjs → index-dG-p4BPD.mjs} +2 -2
- package/lib/chunks/{index-DvNpZrTA.mjs.map → index-dG-p4BPD.mjs.map} +1 -1
- package/lib/components/ResizableSplit.vue.d.ts +17 -2
- package/lib/components/ResizableSplit.vue.d.ts.map +1 -1
- package/lib/index.cjs +32 -32
- package/lib/index.cjs.map +1 -1
- package/lib/index.css +1 -1
- package/lib/index.mjs +1 -1
- package/lib/renderers/Image/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/lib/renderers/Zip/index.vue.d.ts.map +1 -1
- package/package.json +1 -1
- package/lib/chunks/index-B0tDrTQA.mjs.map +0 -1
- package/lib/chunks/index-BVWAQngT.mjs +0 -234
- package/lib/chunks/index-BVWAQngT.mjs.map +0 -1
- package/lib/chunks/index-DWmW_luw.mjs +0 -280
- package/lib/chunks/index-DWmW_luw.mjs.map +0 -1
package/README.md
CHANGED
|
@@ -95,6 +95,33 @@ export default defineConfig({
|
|
|
95
95
|
});
|
|
96
96
|
```
|
|
97
97
|
|
|
98
|
+
### Vite Bundler Note (AVIF Decoder)
|
|
99
|
+
|
|
100
|
+
If your project bundler is Vite and you happen to have `@jsquash/avif` installed (transitively or directly), the production build may fail with:
|
|
101
|
+
|
|
102
|
+
```
|
|
103
|
+
[commonjs--resolver] Invalid value "iife" for option "worker.format"
|
|
104
|
+
- UMD and IIFE output formats are not supported for code-splitting builds.
|
|
105
|
+
file: .../@jsquash/avif/codec/enc/avif_enc_mt.js
|
|
106
|
+
```
|
|
107
|
+
|
|
108
|
+
This happens because `@jsquash/avif` ships a multi-threaded worker that uses code-splitting, while Vite's default `worker.format` is `'iife'`, which does not support split chunks.
|
|
109
|
+
|
|
110
|
+
**Fix** — add this to your `vite.config.ts`:
|
|
111
|
+
|
|
112
|
+
```ts
|
|
113
|
+
export default defineConfig({
|
|
114
|
+
// ... your existing config
|
|
115
|
+
worker: {
|
|
116
|
+
format: 'es',
|
|
117
|
+
},
|
|
118
|
+
});
|
|
119
|
+
```
|
|
120
|
+
|
|
121
|
+
`'es'` produces module workers (`type: 'module'`), supported by all modern browsers and compatible with code-splitting.
|
|
122
|
+
|
|
123
|
+
> Note: `@jsquash/avif` is only used as a fallback when the browser does not natively support AVIF (Chrome 85+, Firefox 93+, Safari 16+ all support it natively). If your target browsers cover the native list, you can also remove `@jsquash/avif` from your dependencies entirely.
|
|
124
|
+
|
|
98
125
|
## 🚀 Quick Start
|
|
99
126
|
|
|
100
127
|
### Basic Usage
|
package/README.zh-CN.md
CHANGED
|
@@ -95,6 +95,33 @@ export default defineConfig({
|
|
|
95
95
|
});
|
|
96
96
|
```
|
|
97
97
|
|
|
98
|
+
### Vite 打包提示(AVIF 解码器)
|
|
99
|
+
|
|
100
|
+
如果你的项目使用 Vite 打包,且项目里安装了 `@jsquash/avif`(直接安装或被其它依赖间接引入),生产构建时可能报错:
|
|
101
|
+
|
|
102
|
+
```
|
|
103
|
+
[commonjs--resolver] Invalid value "iife" for option "worker.format"
|
|
104
|
+
- UMD and IIFE output formats are not supported for code-splitting builds.
|
|
105
|
+
file: .../@jsquash/avif/codec/enc/avif_enc_mt.js
|
|
106
|
+
```
|
|
107
|
+
|
|
108
|
+
原因:`@jsquash/avif` 内部包含一个使用代码分割的多线程 worker,而 Vite 默认的 `worker.format` 是 `'iife'`,不支持多 chunk 拆分。
|
|
109
|
+
|
|
110
|
+
**解决方法** —— 在你的 `vite.config.ts` 中加入:
|
|
111
|
+
|
|
112
|
+
```ts
|
|
113
|
+
export default defineConfig({
|
|
114
|
+
// ... 原有配置
|
|
115
|
+
worker: {
|
|
116
|
+
format: 'es',
|
|
117
|
+
},
|
|
118
|
+
});
|
|
119
|
+
```
|
|
120
|
+
|
|
121
|
+
`'es'` 会产生 module worker(`type: 'module'`),现代浏览器全部支持,且兼容代码分割。
|
|
122
|
+
|
|
123
|
+
> 说明:`@jsquash/avif` 仅在浏览器不原生支持 AVIF 时作为兜底使用(Chrome 85+、Firefox 93+、Safari 16+ 均已原生支持)。如果你的目标浏览器都覆盖原生支持范围,也可以直接从依赖中移除 `@jsquash/avif`。
|
|
124
|
+
|
|
98
125
|
## 🚀 快速开始
|
|
99
126
|
|
|
100
127
|
### 基础用法
|
|
@@ -24,6 +24,8 @@ interface Props {
|
|
|
24
24
|
shouldFetchAsBlob?: ShouldFetchAsBlob;
|
|
25
25
|
/** 自定义下载回调;不传时库内默认通过 fetcher 拉 Blob 触发下载 */
|
|
26
26
|
onDownload?: (file: PreviewFile) => void | Promise<void>;
|
|
27
|
+
/** 关闭回调:传入后工具栏显示关闭按钮 */
|
|
28
|
+
onClose?: () => void;
|
|
27
29
|
}
|
|
28
30
|
declare const _default: import("vue").DefineComponent<Props, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {} & {
|
|
29
31
|
close: () => any;
|
|
@@ -36,6 +38,7 @@ declare const _default: import("vue").DefineComponent<Props, {}, {}, {}, {}, imp
|
|
|
36
38
|
}>, {
|
|
37
39
|
requestInit: RequestInitFactory;
|
|
38
40
|
requestHandler: RequestHandler;
|
|
41
|
+
onClose: () => void;
|
|
39
42
|
mode: "modal" | "embed";
|
|
40
43
|
theme: Theme;
|
|
41
44
|
customRenderers: CustomRenderer[];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"FilePreviewContent.vue.d.ts","sourceRoot":"","sources":["../src/FilePreviewContent.vue"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"FilePreviewContent.vue.d.ts","sourceRoot":"","sources":["../src/FilePreviewContent.vue"],"names":[],"mappings":"AA8vBA,OAAO,EAIL,KAAK,WAAW,EAChB,KAAK,gBAAgB,EACrB,KAAK,MAAM,EACX,KAAK,QAAQ,EACb,KAAK,KAAK,EACV,KAAK,0BAA0B,EAC/B,KAAK,cAAc,EACnB,KAAK,kBAAkB,EACvB,KAAK,iBAAiB,EACvB,MAAM,iCAAiC,CAAC;AACzC,OAAO,KAAK,EAAE,cAAc,EAAyB,MAAM,SAAS,CAAC;AAuCrE,UAAU,KAAK;IACb,KAAK,EAAE,gBAAgB,EAAE,CAAC;IAC1B,YAAY,EAAE,MAAM,CAAC;IACrB,eAAe,CAAC,EAAE,cAAc,EAAE,CAAC;IACnC,kCAAkC;IAClC,IAAI,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC;IACzB,qCAAqC;IACrC,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,SAAS;IACT,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,cAAc;IACd,QAAQ,CAAC,EAAE,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;IACtD,8BAA8B;IAC9B,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,qBAAqB;IACrB,KAAK,CAAC,EAAE,KAAK,CAAC;IACd,mDAAmD;IACnD,WAAW,CAAC,EAAE,kBAAkB,CAAC;IACjC,4BAA4B;IAC5B,cAAc,CAAC,EAAE,cAAc,CAAC;IAChC,4EAA4E;IAC5E,iBAAiB,CAAC,EAAE,iBAAiB,CAAC;IACtC,4CAA4C;IAC5C,UAAU,CAAC,EAAE,CAAC,IAAI,EAAE,WAAW,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACzD,wBAAwB;IACxB,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;CACtB;;;;;;;;;;iBATe,kBAAkB;oBAEf,cAAc;aAMrB,MAAM,IAAI;UApBb,OAAO,GAAG,OAAO;WAUhB,KAAK;qBAZK,cAAc,EAAE;qBAIhB,MAAM;YAEf,MAAM;cAEJ,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC;cAE1C,OAAO;uBAQE,iBAAiB;gBAExB,CAAC,IAAI,EAAE,WAAW,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;;AA8nC1D,wBAQG"}
|
|
@@ -24,16 +24,21 @@ interface Props {
|
|
|
24
24
|
shouldFetchAsBlob?: ShouldFetchAsBlob;
|
|
25
25
|
/** 自定义下载回调;不传时库内默认通过 fetcher 拉 Blob 触发下载 */
|
|
26
26
|
onDownload?: (file: PreviewFile) => void | Promise<void>;
|
|
27
|
+
/** 关闭回调:传入后工具栏显示关闭按钮 */
|
|
28
|
+
onClose?: () => void;
|
|
27
29
|
}
|
|
28
30
|
declare const _default: import("vue").DefineComponent<Props, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {} & {
|
|
31
|
+
close: () => any;
|
|
29
32
|
navigate: (index: number) => any;
|
|
30
33
|
"custom-event": (payload: CustomRendererEventPayload<unknown>) => any;
|
|
31
34
|
}, string, import("vue").PublicProps, Readonly<Props> & Readonly<{
|
|
35
|
+
onClose?: (() => any) | undefined;
|
|
32
36
|
onNavigate?: ((index: number) => any) | undefined;
|
|
33
37
|
"onCustom-event"?: ((payload: CustomRendererEventPayload<unknown>) => any) | undefined;
|
|
34
38
|
}>, {
|
|
35
39
|
requestInit: RequestInitFactory;
|
|
36
40
|
requestHandler: RequestHandler;
|
|
41
|
+
onClose: () => void;
|
|
37
42
|
height: number | string;
|
|
38
43
|
width: number | string;
|
|
39
44
|
theme: Theme;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"FilePreviewEmbed.vue.d.ts","sourceRoot":"","sources":["../src/FilePreviewEmbed.vue"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"FilePreviewEmbed.vue.d.ts","sourceRoot":"","sources":["../src/FilePreviewEmbed.vue"],"names":[],"mappings":"AA4HA,OAAO,KAAK,EAAE,WAAW,EAAE,gBAAgB,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,0BAA0B,EAAE,cAAc,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,MAAM,iCAAiC,CAAC;AACjM,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AAG9C,UAAU,KAAK;IACb,KAAK,EAAE,gBAAgB,EAAE,CAAC;IAC1B,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,eAAe,CAAC,EAAE,cAAc,EAAE,CAAC;IACnC,uBAAuB;IACvB,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IACxB,uBAAuB;IACvB,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IACzB,SAAS;IACT,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,cAAc;IACd,QAAQ,CAAC,EAAE,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;IACtD,sBAAsB;IACtB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,qBAAqB;IACrB,KAAK,CAAC,EAAE,KAAK,CAAC;IACd,mDAAmD;IACnD,WAAW,CAAC,EAAE,kBAAkB,CAAC;IACjC,4BAA4B;IAC5B,cAAc,CAAC,EAAE,cAAc,CAAC;IAChC,4EAA4E;IAC5E,iBAAiB,CAAC,EAAE,iBAAiB,CAAC;IACtC,4CAA4C;IAC5C,UAAU,CAAC,EAAE,CAAC,IAAI,EAAE,WAAW,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACzD,wBAAwB;IACxB,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;CACtB;;;;;;;;;;iBATe,kBAAkB;oBAEf,cAAc;aAMrB,MAAM,IAAI;YAlBX,MAAM,GAAG,MAAM;WAFhB,MAAM,GAAG,MAAM;WAUf,KAAK;kBAbE,MAAM;qBACH,cAAc,EAAE;YAMzB,MAAM;cAEJ,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC;cAE1C,OAAO;uBAQE,iBAAiB;gBAExB,CAAC,IAAI,EAAE,WAAW,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;;AAiL1D,wBAQG"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"FilePreviewModal.vue.d.ts","sourceRoot":"","sources":["../src/FilePreviewModal.vue"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"FilePreviewModal.vue.d.ts","sourceRoot":"","sources":["../src/FilePreviewModal.vue"],"names":[],"mappings":"AAqIA,OAAO,KAAK,EAAE,WAAW,EAAE,gBAAgB,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,0BAA0B,EAAE,cAAc,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,MAAM,iCAAiC,CAAC;AACjM,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AAI9C,UAAU,KAAK;IACb,KAAK,EAAE,gBAAgB,EAAE,CAAC;IAC1B,YAAY,EAAE,MAAM,CAAC;IACrB,MAAM,EAAE,OAAO,CAAC;IAChB,eAAe,CAAC,EAAE,cAAc,EAAE,CAAC;IACnC,SAAS;IACT,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,cAAc;IACd,QAAQ,CAAC,EAAE,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;IACtD,sBAAsB;IACtB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,qBAAqB;IACrB,KAAK,CAAC,EAAE,KAAK,CAAC;IACd,mDAAmD;IACnD,WAAW,CAAC,EAAE,kBAAkB,CAAC;IACjC,4BAA4B;IAC5B,cAAc,CAAC,EAAE,cAAc,CAAC;IAChC,4EAA4E;IAC5E,iBAAiB,CAAC,EAAE,iBAAiB,CAAC;IACtC,4CAA4C;IAC5C,UAAU,CAAC,EAAE,CAAC,IAAI,EAAE,WAAW,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CAC1D;;;;;;;;;;iBAPe,kBAAkB;oBAEf,cAAc;WAJvB,KAAK;qBARK,cAAc,EAAE;YAEzB,MAAM;cAEJ,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC;cAE1C,OAAO;uBAQE,iBAAiB;gBAExB,CAAC,IAAI,EAAE,WAAW,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;;AAyN1D,wBAQG"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { defineComponent as U, ref as f, watch as te, onBeforeUnmount as oe, openBlock as m, createElementBlock as _, createBlock as ae, createCommentVNode as C, createElementVNode as p, normalizeStyle as S, toDisplayString as re, unref as $, createVNode as P, h } from "vue";
|
|
2
2
|
import { X as le } from "lucide-vue-next";
|
|
3
3
|
import "foliate-js/view.js";
|
|
4
|
-
import { u as ne, a as se, _ as ie } from "./index-
|
|
4
|
+
import { u as ne, a as se, _ as ie } from "./index-CFaWV6cC.mjs";
|
|
5
5
|
import { _ as fe } from "./RendererError.vue_vue_type_script_setup_true_lang-CbgZBSDr.mjs";
|
|
6
6
|
const pe = { class: "vfp-relative vfp-w-full vfp-h-full vfp-flex vfp-justify-center vfp-bg-surface-1 vfp-overflow-hidden" }, ce = {
|
|
7
7
|
key: 1,
|
|
@@ -199,4 +199,4 @@ const pe = { class: "vfp-relative vfp-w-full vfp-h-full vfp-flex vfp-justify-cen
|
|
|
199
199
|
export {
|
|
200
200
|
ke as default
|
|
201
201
|
};
|
|
202
|
-
//# sourceMappingURL=index-
|
|
202
|
+
//# sourceMappingURL=index-5hGtGeD4.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index-Dpqyibd9.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';\nimport { useFetcher } from '../../composables/useRequest';\nimport RendererError from '../RendererError.vue';\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();\nconst fetcher = useFetcher();\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 fetcher.value(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, (newUrl) => {\n // 只有 URL 有效时才加载(避免空字符串或已 revoke 的 blob URL)\n if (newUrl) load();\n}, { 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-bg-surface-1 vfp-overflow-hidden\"\n >\n <RendererError v-if=\"error\" :message=\"error\" class=\"vfp-absolute vfp-inset-0\" />\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","item","i","_a","_b","_c","href","__default__","READER_CSS","props","__props","emit","__emit","t","useTranslator","fetcher","useFetcher","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","newUrl","onBeforeUnmount","_openBlock","_createElementBlock","_hoisted_1","_createBlock","RendererError","_hoisted_2","_cache","_createElementVNode","_normalizeStyle","_hoisted_3","_hoisted_4","_toDisplayString","_unref","_createVNode","X","_hoisted_5"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index-5hGtGeD4.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';\nimport { useFetcher } from '../../composables/useRequest';\nimport RendererError from '../RendererError.vue';\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();\nconst fetcher = useFetcher();\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 fetcher.value(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, (newUrl) => {\n // 只有 URL 有效时才加载(避免空字符串或已 revoke 的 blob URL)\n if (newUrl) load();\n}, { 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-bg-surface-1 vfp-overflow-hidden\"\n >\n <RendererError v-if=\"error\" :message=\"error\" class=\"vfp-absolute vfp-inset-0\" />\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","item","i","_a","_b","_c","href","__default__","READER_CSS","props","__props","emit","__emit","t","useTranslator","fetcher","useFetcher","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","newUrl","onBeforeUnmount","_openBlock","_createElementBlock","_hoisted_1","_createBlock","RendererError","_hoisted_2","_cache","_createElementVNode","_normalizeStyle","_hoisted_3","_hoisted_4","_toDisplayString","_unref","_createVNode","X","_hoisted_5"],"mappings":"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"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { defineComponent as d, ref as U, watch as h, openBlock as $, createElementBlock as q, createElementVNode as K, createBlock as x, createVNode as C, unref as ee, h as g, inject as ne, computed as H } from "vue";
|
|
2
|
-
import { u as le, a as te, E as ie, L as ue, W as fe, c as oe } from "./index-
|
|
2
|
+
import { u as le, a as te, E as ie, L as ue, W as fe, c as oe } from "./index-CFaWV6cC.mjs";
|
|
3
3
|
import { _ as se } from "./RendererError.vue_vue_type_script_setup_true_lang-CbgZBSDr.mjs";
|
|
4
4
|
import { ChevronDown as ce, ChevronRight as pe } from "lucide-vue-next";
|
|
5
5
|
function ke(e, f = !1) {
|
|
@@ -614,4 +614,4 @@ const D = d({
|
|
|
614
614
|
export {
|
|
615
615
|
Ne as default
|
|
616
616
|
};
|
|
617
|
-
//# sourceMappingURL=index-
|
|
617
|
+
//# sourceMappingURL=index-B-f41wjl.mjs.map
|