@eternalheart/vue-file-preview 1.6.0 → 1.6.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (63) hide show
  1. package/README.md +6 -5
  2. package/README.zh-CN.md +6 -5
  3. package/lib/chunks/{index-DD9QZ4a2.mjs → index-04rWay5r.mjs} +13 -13
  4. package/lib/chunks/{index-DD9QZ4a2.mjs.map → index-04rWay5r.mjs.map} +1 -1
  5. package/lib/chunks/{index-CdUSfYfF.mjs → index-BG-e_YTm.mjs} +26 -26
  6. package/lib/chunks/{index-CdUSfYfF.mjs.map → index-BG-e_YTm.mjs.map} +1 -1
  7. package/lib/chunks/{index-DcLACobl.mjs → index-BJ9Jd5fz.mjs} +22 -22
  8. package/lib/chunks/{index-DcLACobl.mjs.map → index-BJ9Jd5fz.mjs.map} +1 -1
  9. package/lib/chunks/{index-C-ikNsDh.mjs → index-BRH8E5yi.mjs} +21 -21
  10. package/lib/chunks/{index-C-ikNsDh.mjs.map → index-BRH8E5yi.mjs.map} +1 -1
  11. package/lib/chunks/{index-D-YwSyrE.mjs → index-Bicn2NYv.mjs} +25 -25
  12. package/lib/chunks/{index-D-YwSyrE.mjs.map → index-Bicn2NYv.mjs.map} +1 -1
  13. package/lib/chunks/{index-C1Ev7K-W.mjs → index-BkcwI2qf.mjs} +2 -2
  14. package/lib/chunks/{index-C1Ev7K-W.mjs.map → index-BkcwI2qf.mjs.map} +1 -1
  15. package/lib/chunks/index-C38FDG67.mjs +2530 -0
  16. package/lib/chunks/index-C38FDG67.mjs.map +1 -0
  17. package/lib/chunks/{index-EPkoXaAV.mjs → index-CK5v4U-z.mjs} +2 -2
  18. package/lib/chunks/{index-EPkoXaAV.mjs.map → index-CK5v4U-z.mjs.map} +1 -1
  19. package/lib/chunks/{index-Dcruruhk.mjs → index-CTcS-MsV.mjs} +2 -2
  20. package/lib/chunks/{index-Dcruruhk.mjs.map → index-CTcS-MsV.mjs.map} +1 -1
  21. package/lib/chunks/index-CcjZzhj5.mjs +377 -0
  22. package/lib/chunks/index-CcjZzhj5.mjs.map +1 -0
  23. package/lib/chunks/{index-CKKL3xiq.mjs → index-CfzeM7g7.mjs} +32 -32
  24. package/lib/chunks/{index-CKKL3xiq.mjs.map → index-CfzeM7g7.mjs.map} +1 -1
  25. package/lib/chunks/{index-DxSw5Ekp.mjs → index-CgYTaOkd.mjs} +2 -2
  26. package/lib/chunks/{index-DxSw5Ekp.mjs.map → index-CgYTaOkd.mjs.map} +1 -1
  27. package/lib/chunks/{index-Cl9ZiWVl.mjs → index-CxFwOWi1.mjs} +2 -2
  28. package/lib/chunks/{index-Cl9ZiWVl.mjs.map → index-CxFwOWi1.mjs.map} +1 -1
  29. package/lib/chunks/{index-B3Bv_Etp.mjs → index-D0Zr3fiq.mjs} +14 -14
  30. package/lib/chunks/{index-B3Bv_Etp.mjs.map → index-D0Zr3fiq.mjs.map} +1 -1
  31. package/lib/chunks/{index-Cy83gsDL.mjs → index-DHEHo8Oq.mjs} +76 -76
  32. package/lib/chunks/{index-Cy83gsDL.mjs.map → index-DHEHo8Oq.mjs.map} +1 -1
  33. package/lib/chunks/{index-DL3qn-zG.mjs → index-DLQiuuqn.mjs} +2 -2
  34. package/lib/chunks/{index-DL3qn-zG.mjs.map → index-DLQiuuqn.mjs.map} +1 -1
  35. package/lib/chunks/{index-BAbJRSyS.mjs → index-DLaaej5b.mjs} +633 -627
  36. package/lib/chunks/{index-BAbJRSyS.mjs.map → index-DLaaej5b.mjs.map} +1 -1
  37. package/lib/chunks/{index-CLDPeQbI.mjs → index-DlmsnYdv.mjs} +20 -20
  38. package/lib/chunks/{index-CLDPeQbI.mjs.map → index-DlmsnYdv.mjs.map} +1 -1
  39. package/lib/chunks/{index-BMz5d0Rs.mjs → index-Yie5jBdV.mjs} +15 -15
  40. package/lib/chunks/{index-BMz5d0Rs.mjs.map → index-Yie5jBdV.mjs.map} +1 -1
  41. package/lib/chunks/{index-Dqqq0VnB.mjs → index-r9hisC9w.mjs} +2 -2
  42. package/lib/chunks/{index-Dqqq0VnB.mjs.map → index-r9hisC9w.mjs.map} +1 -1
  43. package/lib/chunks/psdLoader-D5CkupyY-DMppLen1.mjs +79 -0
  44. package/lib/chunks/psdLoader-D5CkupyY-DMppLen1.mjs.map +1 -0
  45. package/lib/chunks/{tiffLoader-CTFKVLqJ-B84NfwhR.mjs → tiffLoader-CmUAD1vO-DABms0J3.mjs} +7 -7
  46. package/lib/chunks/tiffLoader-CmUAD1vO-DABms0J3.mjs.map +1 -0
  47. package/lib/chunks/{useShikiHighlight-CIk_v_UB.mjs → useShikiHighlight-ChY7TOSl.mjs} +2 -2
  48. package/lib/chunks/{useShikiHighlight-CIk_v_UB.mjs.map → useShikiHighlight-ChY7TOSl.mjs.map} +1 -1
  49. package/lib/index.cjs +47 -47
  50. package/lib/index.cjs.map +1 -1
  51. package/lib/index.d.ts +1 -1
  52. package/lib/index.d.ts.map +1 -1
  53. package/lib/index.mjs +5 -5
  54. package/lib/renderers/Image/index.vue.d.ts.map +1 -1
  55. package/lib/renderers/Pdf/index.vue.d.ts.map +1 -1
  56. package/package.json +1 -1
  57. package/lib/chunks/index-2RMNnT0y.mjs +0 -363
  58. package/lib/chunks/index-2RMNnT0y.mjs.map +0 -1
  59. package/lib/chunks/index-M_Nf3MY5.mjs +0 -2458
  60. package/lib/chunks/index-M_Nf3MY5.mjs.map +0 -1
  61. package/lib/chunks/psdLoader-Doxw3mWm-DVOGFSlh.mjs +0 -73
  62. package/lib/chunks/psdLoader-Doxw3mWm-DVOGFSlh.mjs.map +0 -1
  63. package/lib/chunks/tiffLoader-CTFKVLqJ-B84NfwhR.mjs.map +0 -1
package/README.md CHANGED
@@ -250,8 +250,9 @@ Differences from `FilePreviewModal`:
250
250
  ## <img src="https://cdn.jsdelivr.net/gh/twitter/twemoji@latest/assets/svg/1f4d6.svg" width="20" height="20" alt="📖" /> Supported File Formats
251
251
 
252
252
  ### Images
253
- - **Formats**: JPG, PNG, GIF, WebP, SVG, BMP, ICO
254
- - **Features**: Zoom (0.1x - 10x), rotate, drag, mouse wheel zoom, double-click reset
253
+ - **Formats**: JPG, PNG, GIF, WebP, SVG, BMP, ICO, HEIC/HEIF, AVIF, TIFF, RAW, PSD, JPEG 2000
254
+ - **Features**: Zoom (0.01x - 10x), rotate, drag, mouse wheel zoom, double-click reset, multi-page TIFF
255
+ - **Decoding**: HEIC/RAW/PSD use a Worker-first path with a main-thread fallback; other advanced formats are loaded on demand
255
256
 
256
257
  ### Videos
257
258
  - **Formats**: MP4, WebM, OGG, MOV, AVI, MKV, M4V, 3GP, FLV
@@ -522,7 +523,7 @@ const files = [
522
523
  :custom-renderers="[
523
524
  {
524
525
  test: (file) => file.type === 'application/custom',
525
- component: CustomRenderer
526
+ render: () => CustomRenderer
526
527
  }
527
528
  ]"
528
529
  />
@@ -545,7 +546,7 @@ All built-in renderers use code-splitting via `defineAsyncComponent` to minimize
545
546
 
546
547
  - Main entry point: gzip ≤ 60 KB (strictly enforced by CI)
547
548
  - Each renderer: separate async chunk
548
- - Total library: gzip ≤ 500 KB (all renderers combined)
549
+ - Total library: gzip ≤ 3 MB (all ESM chunks and CSS combined)
549
550
 
550
551
  **Implementation Example:**
551
552
 
@@ -598,7 +599,7 @@ const files = [...];
598
599
  :custom-renderers="[
599
600
  {
600
601
  test: (file) => file.type === 'application/custom',
601
- component: MyCustomRenderer
602
+ render: () => MyCustomRenderer
602
603
  }
603
604
  ]"
604
605
  />
package/README.zh-CN.md CHANGED
@@ -250,8 +250,9 @@ const files = [
250
250
  ## 📖 支持的文件格式
251
251
 
252
252
  ### 图片
253
- - **格式**: JPG, PNG, GIF, WebP, SVG, BMP, ICO
254
- - **功能**: 缩放 (0.1x - 10x)、旋转、拖拽、滚轮缩放、双击重置
253
+ - **格式**: JPG, PNG, GIF, WebP, SVG, BMP, ICO, HEIC/HEIF, AVIF, TIFF, RAW, PSD, JPEG 2000
254
+ - **功能**: 缩放 (0.01x - 10x)、旋转、拖拽、滚轮缩放、双击重置、多页 TIFF
255
+ - **解码**: HEIC/RAW/PSD 优先通过 Worker 解码,失败时回退主线程;其他高级格式按需加载
255
256
 
256
257
  ### 视频
257
258
  - **格式**: MP4, WebM, OGG, MOV, AVI, MKV, M4V, 3GP, FLV
@@ -522,7 +523,7 @@ const files = [
522
523
  :custom-renderers="[
523
524
  {
524
525
  test: (file) => file.type === 'application/custom',
525
- component: CustomRenderer
526
+ render: () => CustomRenderer
526
527
  }
527
528
  ]"
528
529
  />
@@ -545,7 +546,7 @@ const files = [
545
546
 
546
547
  - 主入口:gzip ≤ 60 KB(CI 强制约束)
547
548
  - 每个渲染器:独立异步 chunk
548
- - 整个库:gzip ≤ 500 KB(所有渲染器合计)
549
+ - 整个库:gzip ≤ 3 MB(所有 ESM chunk 与 CSS 合计)
549
550
 
550
551
  **实现示例:**
551
552
 
@@ -598,7 +599,7 @@ const files = [...];
598
599
  :custom-renderers="[
599
600
  {
600
601
  test: (file) => file.type === 'application/custom',
601
- component: MyCustomRenderer
602
+ render: () => MyCustomRenderer
602
603
  }
603
604
  ]"
604
605
  />
@@ -1,11 +1,11 @@
1
- import { defineComponent as L, ref as c, watch as M, computed as D, openBlock as n, createElementBlock as a, createElementVNode as r, createBlock as H, unref as h, toDisplayString as w, normalizeStyle as B, Fragment as y, renderList as F } from "vue";
2
- import { u as G, a as N, U as P } from "./index-M_Nf3MY5.mjs";
3
- import { u as X } from "./useShikiHighlight-CIk_v_UB.mjs";
4
- import { _ as j } from "./RendererError.vue_vue_type_script_setup_true_lang-BNoENOWX.mjs";
5
- const E = {
1
+ import { defineComponent as M, ref as c, watch as L, computed as D, openBlock as n, createElementBlock as a, createElementVNode as r, createBlock as H, unref as h, toDisplayString as w, normalizeStyle as B, Fragment as y, renderList as F } from "vue";
2
+ import { u as G, a as N, R as P } from "./index-C38FDG67.mjs";
3
+ import { u as R } from "./useShikiHighlight-ChY7TOSl.mjs";
4
+ import { _ as X } from "./RendererError.vue_vue_type_script_setup_true_lang-BNoENOWX.mjs";
5
+ const j = {
6
6
  key: 0,
7
7
  class: "vfp-flex vfp-items-center vfp-justify-center vfp-w-full vfp-h-full"
8
- }, U = {
8
+ }, E = {
9
9
  key: 2,
10
10
  class: "vfp-w-full vfp-h-full vfp-overflow-auto",
11
11
  style: { background: "var(--fp-code-bg)" }
@@ -13,14 +13,14 @@ const E = {
13
13
  key: 3,
14
14
  class: "vfp-w-full vfp-h-full vfp-overflow-auto",
15
15
  style: { background: "var(--fp-code-bg)" }
16
- }, C = { class: "vfp-code-gutter" }, I = ["innerHTML"], W = /* @__PURE__ */ L({
16
+ }, C = { class: "vfp-code-gutter" }, I = ["innerHTML"], W = /* @__PURE__ */ M({
17
17
  __name: "index",
18
18
  props: {
19
19
  url: {},
20
20
  fileName: {}
21
21
  },
22
22
  setup(_, { expose: k }) {
23
- const v = _, { t: b } = G(), x = N(), p = c(""), u = c(!0), i = c(null), S = c("xml"), { lineHtmls: d } = X(p, S), T = (e) => {
23
+ const v = _, { t: b } = G(), x = N(), p = c(""), u = c(!0), i = c(null), S = c("xml"), { lineHtmls: d } = R(p, S), T = (e) => {
24
24
  const t = " ", o = /(>)(<)(\/*)/g, l = e.replace(o, `$1
25
25
  $2$3`);
26
26
  let s = 0;
@@ -42,7 +42,7 @@ $2$3`);
42
42
  return e;
43
43
  }
44
44
  };
45
- M(() => v.url, async () => {
45
+ L(() => v.url, async () => {
46
46
  u.value = !0, i.value = null;
47
47
  try {
48
48
  const e = await P(v.url, { fetcher: x.value });
@@ -57,12 +57,12 @@ $2$3`);
57
57
  `));
58
58
  return k({
59
59
  getToolbarGroups: () => []
60
- }), (e, t) => u.value ? (n(), a("div", E, [...t[0] || (t[0] = [
60
+ }), (e, t) => u.value ? (n(), a("div", j, [...t[0] || (t[0] = [
61
61
  r("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)
62
- ])])) : i.value ? (n(), H(j, {
62
+ ])])) : i.value ? (n(), H(X, {
63
63
  key: 1,
64
64
  message: i.value
65
- }, null, 8, ["message"])) : h(d).length === 0 ? (n(), a("div", U, [
65
+ }, null, 8, ["message"])) : h(d).length === 0 ? (n(), a("div", E, [
66
66
  r("pre", q, w(p.value), 1)
67
67
  ])) : (n(), a("div", A, [
68
68
  r("div", {
@@ -85,4 +85,4 @@ $2$3`);
85
85
  export {
86
86
  W as default
87
87
  };
88
- //# sourceMappingURL=index-DD9QZ4a2.mjs.map
88
+ //# sourceMappingURL=index-04rWay5r.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"index-DD9QZ4a2.mjs","sources":["../../src/renderers/Xml/index.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport type { RendererHandle } from '../base.types';\nimport type { ToolbarGroup } from '../toolbar.types';\n\nimport { ref, computed, watch } from 'vue';\nimport { fetchTextUtf8 } from '@eternalheart/file-preview-core';\nimport { useTranslator } from '../../composables/useTranslator';\nimport { useFetcher } from '../../composables/useRequest';\nimport { useShikiHighlight } from '../../composables/useShikiHighlight';\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 content = ref<string>('');\nconst loading = ref(true);\nconst error = ref<string | null>(null);\nconst xmlLang = ref('xml');\n\nconst { lineHtmls } = useShikiHighlight(content, xmlLang);\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 } 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 });\n\nconst lines = computed(() => content.value.split('\\n'));\n\nconst getToolbarGroups = (): ToolbarGroup[] => [];\n\ndefineExpose<RendererHandle>({\n getToolbarGroups,\n});\n\n</script>\n\n<template>\n <div v-if=\"loading\" class=\"vfp-flex vfp-items-center vfp-justify-center vfp-w-full vfp-h-full\">\n <div\n class=\"vfp-w-12 vfp-h-12 vfp-border-4 vfp-border-line-strong vfp-border-t-spinner-head vfp-rounded-full vfp-animate-spin\"\n />\n </div>\n\n <RendererError v-else-if=\"error\" :message=\"error\" />\n\n <div v-else-if=\"lineHtmls.length === 0\" class=\"vfp-w-full vfp-h-full vfp-overflow-auto\" style=\"background: var(--fp-code-bg);\">\n <pre\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>\n\n <div v-else class=\"vfp-w-full vfp-h-full vfp-overflow-auto\" style=\"background: var(--fp-code-bg);\">\n <div class=\"vfp-code-block with-line-numbers vfp-w-full\" :style=\"{ gridTemplateRows: `repeat(${lines.length}, auto) minmax(1.5rem, 1fr)` }\">\n <template v-for=\"(_, i) in lines\" :key=\"i\">\n <span class=\"vfp-code-gutter\">{{ i + 1 }}</span>\n <span class=\"vfp-code-line\" v-html=\"lineHtmls[i] ?? ''\" />\n </template>\n <!-- 占位行:撑满剩余高度,让 gutter border 延伸到底部 -->\n <span class=\"vfp-code-gutter-filler\" />\n <span class=\"vfp-code-line-filler\" />\n </div>\n </div>\n</template>\n"],"names":["props","__props","t","useTranslator","fetcher","useFetcher","content","ref","loading","error","xmlLang","lineHtmls","useShikiHighlight","indentXml","xml","PADDING","reg","formatted","pad","line","indent","padded","prettyPrintXml","doc","serialized","watch","raw","fetchTextUtf8","err","lines","computed","__expose","_openBlock","_createElementBlock","_hoisted_1","_cache","_createElementVNode","_createBlock","RendererError","_unref","_hoisted_2","_hoisted_3","_toDisplayString","_hoisted_4","_normalizeStyle","_Fragment","_renderList","_","i","_hoisted_5"],"mappings":"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"}
1
+ {"version":3,"file":"index-04rWay5r.mjs","sources":["../../src/renderers/Xml/index.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport type { RendererHandle } from '../base.types';\nimport type { ToolbarGroup } from '../toolbar.types';\n\nimport { ref, computed, watch } from 'vue';\nimport { fetchTextUtf8 } from '@eternalheart/file-preview-core';\nimport { useTranslator } from '../../composables/useTranslator';\nimport { useFetcher } from '../../composables/useRequest';\nimport { useShikiHighlight } from '../../composables/useShikiHighlight';\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 content = ref<string>('');\nconst loading = ref(true);\nconst error = ref<string | null>(null);\nconst xmlLang = ref('xml');\n\nconst { lineHtmls } = useShikiHighlight(content, xmlLang);\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 } 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 });\n\nconst lines = computed(() => content.value.split('\\n'));\n\nconst getToolbarGroups = (): ToolbarGroup[] => [];\n\ndefineExpose<RendererHandle>({\n getToolbarGroups,\n});\n\n</script>\n\n<template>\n <div v-if=\"loading\" class=\"vfp-flex vfp-items-center vfp-justify-center vfp-w-full vfp-h-full\">\n <div\n class=\"vfp-w-12 vfp-h-12 vfp-border-4 vfp-border-line-strong vfp-border-t-spinner-head vfp-rounded-full vfp-animate-spin\"\n />\n </div>\n\n <RendererError v-else-if=\"error\" :message=\"error\" />\n\n <div v-else-if=\"lineHtmls.length === 0\" class=\"vfp-w-full vfp-h-full vfp-overflow-auto\" style=\"background: var(--fp-code-bg);\">\n <pre\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>\n\n <div v-else class=\"vfp-w-full vfp-h-full vfp-overflow-auto\" style=\"background: var(--fp-code-bg);\">\n <div class=\"vfp-code-block with-line-numbers vfp-w-full\" :style=\"{ gridTemplateRows: `repeat(${lines.length}, auto) minmax(1.5rem, 1fr)` }\">\n <template v-for=\"(_, i) in lines\" :key=\"i\">\n <span class=\"vfp-code-gutter\">{{ i + 1 }}</span>\n <span class=\"vfp-code-line\" v-html=\"lineHtmls[i] ?? ''\" />\n </template>\n <!-- 占位行:撑满剩余高度,让 gutter border 延伸到底部 -->\n <span class=\"vfp-code-gutter-filler\" />\n <span class=\"vfp-code-line-filler\" />\n </div>\n </div>\n</template>\n"],"names":["props","__props","t","useTranslator","fetcher","useFetcher","content","ref","loading","error","xmlLang","lineHtmls","useShikiHighlight","indentXml","xml","PADDING","reg","formatted","pad","line","indent","padded","prettyPrintXml","doc","serialized","watch","raw","fetchTextUtf8","err","lines","computed","__expose","_openBlock","_createElementBlock","_hoisted_1","_cache","_createElementVNode","_createBlock","RendererError","_unref","_hoisted_2","_hoisted_3","_toDisplayString","_hoisted_4","_normalizeStyle","_Fragment","_renderList","_","i","_hoisted_5"],"mappings":"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"}
@@ -1,5 +1,5 @@
1
- import { defineComponent as d, ref as E, watch as h, openBlock as $, createElementBlock as G, createElementVNode as x, createBlock as K, createVNode as C, unref as ee, h as g, inject as ne, computed as q } from "vue";
2
- import { u as le, a as te, U as ie, L as ue, Q as fe, b as oe } from "./index-M_Nf3MY5.mjs";
1
+ import { defineComponent as d, ref as I, watch as h, openBlock as $, createElementBlock as q, createElementVNode as x, createBlock as K, 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, R as ie, L as ue, C as fe, b as oe } from "./index-C38FDG67.mjs";
3
3
  import { _ as se } from "./RendererError.vue_vue_type_script_setup_true_lang-BNoENOWX.mjs";
4
4
  import { ChevronDown as ce, ChevronRight as pe } from "lucide-vue-next";
5
5
  function ke(e, f = !1) {
@@ -236,17 +236,17 @@ function j(e) {
236
236
  function B(e) {
237
237
  return e >= 48 && e <= 57;
238
238
  }
239
- var H;
239
+ var Q;
240
240
  (function(e) {
241
241
  e[e.lineFeed = 10] = "lineFeed", e[e.carriageReturn = 13] = "carriageReturn", e[e.space = 32] = "space", e[e._0 = 48] = "_0", e[e._1 = 49] = "_1", e[e._2 = 50] = "_2", e[e._3 = 51] = "_3", e[e._4 = 52] = "_4", e[e._5 = 53] = "_5", e[e._6 = 54] = "_6", e[e._7 = 55] = "_7", e[e._8 = 56] = "_8", e[e._9 = 57] = "_9", e[e.a = 97] = "a", e[e.b = 98] = "b", e[e.c = 99] = "c", e[e.d = 100] = "d", e[e.e = 101] = "e", e[e.f = 102] = "f", e[e.g = 103] = "g", e[e.h = 104] = "h", e[e.i = 105] = "i", e[e.j = 106] = "j", e[e.k = 107] = "k", e[e.l = 108] = "l", e[e.m = 109] = "m", e[e.n = 110] = "n", e[e.o = 111] = "o", e[e.p = 112] = "p", e[e.q = 113] = "q", e[e.r = 114] = "r", e[e.s = 115] = "s", e[e.t = 116] = "t", e[e.u = 117] = "u", e[e.v = 118] = "v", e[e.w = 119] = "w", e[e.x = 120] = "x", e[e.y = 121] = "y", e[e.z = 122] = "z", e[e.A = 65] = "A", e[e.B = 66] = "B", e[e.C = 67] = "C", e[e.D = 68] = "D", e[e.E = 69] = "E", e[e.F = 70] = "F", e[e.G = 71] = "G", e[e.H = 72] = "H", e[e.I = 73] = "I", e[e.J = 74] = "J", e[e.K = 75] = "K", e[e.L = 76] = "L", e[e.M = 77] = "M", e[e.N = 78] = "N", e[e.O = 79] = "O", e[e.P = 80] = "P", e[e.Q = 81] = "Q", e[e.R = 82] = "R", e[e.S = 83] = "S", e[e.T = 84] = "T", e[e.U = 85] = "U", e[e.V = 86] = "V", e[e.W = 87] = "W", e[e.X = 88] = "X", e[e.Y = 89] = "Y", e[e.Z = 90] = "Z", e[e.asterisk = 42] = "asterisk", e[e.backslash = 92] = "backslash", e[e.closeBrace = 125] = "closeBrace", e[e.closeBracket = 93] = "closeBracket", e[e.colon = 58] = "colon", e[e.comma = 44] = "comma", e[e.dot = 46] = "dot", e[e.doubleQuote = 34] = "doubleQuote", e[e.minus = 45] = "minus", e[e.openBrace = 123] = "openBrace", e[e.openBracket = 91] = "openBracket", e[e.plus = 43] = "plus", e[e.slash = 47] = "slash", e[e.formFeed = 12] = "formFeed", e[e.tab = 9] = "tab";
242
- })(H || (H = {}));
243
- var I;
242
+ })(Q || (Q = {}));
243
+ var U;
244
244
  (function(e) {
245
245
  e.DEFAULT = {
246
246
  allowTrailingComma: !1
247
247
  };
248
- })(I || (I = {}));
249
- function ge(e, f = [], c = I.DEFAULT) {
248
+ })(U || (U = {}));
249
+ function ge(e, f = [], c = U.DEFAULT) {
250
250
  let n = null, t = [];
251
251
  const o = [];
252
252
  function i(p) {
@@ -276,7 +276,7 @@ function ge(e, f = [], c = I.DEFAULT) {
276
276
  }
277
277
  }, c), t[0];
278
278
  }
279
- function re(e, f, c = I.DEFAULT) {
279
+ function re(e, f, c = U.DEFAULT) {
280
280
  const n = ke(e, !1), t = [];
281
281
  let o = 0;
282
282
  function i(s) {
@@ -362,16 +362,16 @@ function re(e, f, c = I.DEFAULT) {
362
362
  }
363
363
  }
364
364
  }
365
- function u(s, m = [], Q = []) {
366
- if (l(s), m.length + Q.length > 0) {
367
- let U = n.getToken();
368
- for (; U !== 17; ) {
369
- if (m.indexOf(U) !== -1) {
365
+ function u(s, m = [], G = []) {
366
+ if (l(s), m.length + G.length > 0) {
367
+ let E = n.getToken();
368
+ for (; E !== 17; ) {
369
+ if (m.indexOf(E) !== -1) {
370
370
  k();
371
371
  break;
372
- } else if (Q.indexOf(U) !== -1)
372
+ } else if (G.indexOf(E) !== -1)
373
373
  break;
374
- U = k();
374
+ E = k();
375
375
  }
376
376
  }
377
377
  }
@@ -479,10 +479,10 @@ var z;
479
479
  e[e.OpenBraceToken = 1] = "OpenBraceToken", e[e.CloseBraceToken = 2] = "CloseBraceToken", e[e.OpenBracketToken = 3] = "OpenBracketToken", e[e.CloseBracketToken = 4] = "CloseBracketToken", e[e.CommaToken = 5] = "CommaToken", e[e.ColonToken = 6] = "ColonToken", e[e.NullKeyword = 7] = "NullKeyword", e[e.TrueKeyword = 8] = "TrueKeyword", e[e.FalseKeyword = 9] = "FalseKeyword", e[e.StringLiteral = 10] = "StringLiteral", e[e.NumericLiteral = 11] = "NumericLiteral", e[e.LineCommentTrivia = 12] = "LineCommentTrivia", e[e.BlockCommentTrivia = 13] = "BlockCommentTrivia", e[e.LineBreakTrivia = 14] = "LineBreakTrivia", e[e.Trivia = 15] = "Trivia", e[e.Unknown = 16] = "Unknown", e[e.EOF = 17] = "EOF";
480
480
  })(z || (z = {}));
481
481
  const me = ge;
482
- var Y;
482
+ var M;
483
483
  (function(e) {
484
484
  e[e.InvalidSymbol = 1] = "InvalidSymbol", e[e.InvalidNumberFormat = 2] = "InvalidNumberFormat", e[e.PropertyNameExpected = 3] = "PropertyNameExpected", e[e.ValueExpected = 4] = "ValueExpected", e[e.ColonExpected = 5] = "ColonExpected", e[e.CommaExpected = 6] = "CommaExpected", e[e.CloseBraceExpected = 7] = "CloseBraceExpected", e[e.CloseBracketExpected = 8] = "CloseBracketExpected", e[e.EndOfFileExpected = 9] = "EndOfFileExpected", e[e.InvalidCommentToken = 10] = "InvalidCommentToken", e[e.UnexpectedEndOfComment = 11] = "UnexpectedEndOfComment", e[e.UnexpectedEndOfString = 12] = "UnexpectedEndOfString", e[e.UnexpectedEndOfNumber = 13] = "UnexpectedEndOfNumber", e[e.InvalidUnicode = 14] = "InvalidUnicode", e[e.InvalidEscapeCharacter = 15] = "InvalidEscapeCharacter", e[e.InvalidCharacter = 16] = "InvalidCharacter";
485
- })(Y || (Y = {}));
485
+ })(M || (M = {}));
486
486
  const ae = {
487
487
  key: 0,
488
488
  class: "vfp-flex vfp-items-center vfp-justify-center vfp-w-full vfp-h-full"
@@ -514,7 +514,7 @@ function Oe(e) {
514
514
  function ye(e, f) {
515
515
  return e === null ? g("span", { class: "json-null", style: { color: f.keyword } }, "null") : e === void 0 ? g("span", { class: "json-null", style: { color: f.keyword } }, "undefined") : typeof e == "boolean" ? g("span", { style: { color: f.keyword } }, String(e)) : typeof e == "number" ? g("span", { style: { color: f.number } }, String(e)) : typeof e == "string" ? g("span", { style: { color: f.string } }, `"${e}"`) : g("span", { style: { color: f.bracket } }, String(e));
516
516
  }
517
- function M(e, f, c, n, t) {
517
+ function Y(e, f, c, n, t) {
518
518
  return g("div", { class: "json-row", style: { paddingLeft: `${c}px` } }, [
519
519
  g("span", { class: "json-arrow-placeholder" }),
520
520
  e !== void 0 ? g("span", { class: "json-key", style: { color: n.key } }, [
@@ -533,18 +533,18 @@ const D = d({
533
533
  defaultExpanded: { type: Boolean, default: !1 }
534
534
  },
535
535
  setup(e) {
536
- const f = E(e.defaultExpanded), c = () => {
536
+ const f = I(e.defaultExpanded), c = () => {
537
537
  f.value = !f.value;
538
- }, n = ne(ue, null), t = q(() => (n == null ? void 0 : n.t.value) ?? fe({ locale: "zh-CN" })), o = oe(), i = q(() => Oe(o.value));
538
+ }, n = ne(ue, null), t = H(() => (n == null ? void 0 : n.t.value) ?? fe({ locale: "zh-CN" })), o = oe(), i = H(() => Oe(o.value));
539
539
  return { expanded: f, toggle: c, tFunc: t, colors: i };
540
540
  },
541
541
  render() {
542
542
  const { keyName: e, value: f, depth: c, expanded: n, toggle: t, tFunc: o, colors: i } = this, a = c * 20;
543
543
  if (f == null || typeof f != "object")
544
- return M(e, f, a, i);
544
+ return Y(e, f, a, i);
545
545
  const p = Array.isArray(f), b = (p ? f : Object.entries(f)).length, r = p ? "[" : "{", L = p ? "]" : "}";
546
546
  if (b === 0)
547
- return M(e, null, a, i, `${r}${L}`);
547
+ return Y(e, null, a, i, `${r}${L}`);
548
548
  const O = [];
549
549
  return O.push(
550
550
  g("div", {
@@ -586,7 +586,7 @@ const D = d({
586
586
  fileName: {}
587
587
  },
588
588
  setup(e, { expose: f }) {
589
- const c = e, { t: n } = le(), t = te(), o = E(null), i = E(!0), a = E(null);
589
+ const c = e, { t: n } = le(), t = te(), o = I(null), i = I(!0), a = I(null);
590
590
  return h(() => c.url, async () => {
591
591
  i.value = !0, a.value = null;
592
592
  try {
@@ -599,12 +599,12 @@ const D = d({
599
599
  }
600
600
  }, { immediate: !0 }), f({
601
601
  getToolbarGroups: () => []
602
- }), (b, r) => i.value ? ($(), G("div", ae, [...r[0] || (r[0] = [
602
+ }), (b, r) => i.value ? ($(), q("div", ae, [...r[0] || (r[0] = [
603
603
  x("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)
604
604
  ])])) : a.value ? ($(), K(se, {
605
605
  key: 1,
606
606
  message: a.value
607
- }, null, 8, ["message"])) : ($(), G("div", be, [
607
+ }, null, 8, ["message"])) : ($(), q("div", be, [
608
608
  C(ee(D), {
609
609
  value: o.value,
610
610
  depth: 0,
@@ -616,4 +616,4 @@ const D = d({
616
616
  export {
617
617
  Ne as default
618
618
  };
619
- //# sourceMappingURL=index-CdUSfYfF.mjs.map
619
+ //# sourceMappingURL=index-BG-e_YTm.mjs.map