qidian-vue-ui 1.5.2 → 1.5.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,18 +1,18 @@
1
- .qd-file-viewer[data-v-d9e97271],
2
- .qd-file-viewer__content[data-v-d9e97271] {
1
+ .qd-file-viewer[data-v-a1dee402],
2
+ .qd-file-viewer__content[data-v-a1dee402] {
3
3
  width: 100%;
4
4
  height: 100%;
5
5
  }
6
- .qd-file-viewer--image[data-v-d9e97271] {
6
+ .qd-file-viewer--image[data-v-a1dee402] {
7
7
  transform: translate3d(0, 0, 0);
8
8
  }
9
- .qd-file-viewer--image[data-v-d9e97271] .t-image-viewer__trigger {
9
+ .qd-file-viewer--image[data-v-a1dee402] .t-image-viewer__trigger {
10
10
  display: none;
11
11
  }
12
- .qd-file-viewer--image[data-v-d9e97271] .t-image-viewer__modal-box,
13
- .qd-file-viewer--image[data-v-d9e97271] .t-image-viewer-preview-image {
12
+ .qd-file-viewer--image[data-v-a1dee402] .t-image-viewer__modal-box,
13
+ .qd-file-viewer--image[data-v-a1dee402] .t-image-viewer-preview-image {
14
14
  animation: none;
15
15
  }
16
- .qd-file-viewer--image[data-v-d9e97271] .t-image-viewer__modal-mask {
16
+ .qd-file-viewer--image[data-v-a1dee402] .t-image-viewer__modal-mask {
17
17
  transition: none;
18
18
  }
@@ -2,7 +2,7 @@ import './index.css'
2
2
  import _sfc_main from "./index.vue2.mjs";
3
3
  /* empty css */
4
4
  import _export_sfc from "../../_virtual/_plugin-vue_export-helper.mjs";
5
- const QdFileViewer = /* @__PURE__ */ _export_sfc(_sfc_main, [["__scopeId", "data-v-d9e97271"]]);
5
+ const QdFileViewer = /* @__PURE__ */ _export_sfc(_sfc_main, [["__scopeId", "data-v-a1dee402"]]);
6
6
  export {
7
7
  QdFileViewer as default
8
8
  };
@@ -4,7 +4,6 @@ import { allRenderers } from "@file-viewer/preset-all";
4
4
  import { FileViewer } from "@file-viewer/vue3";
5
5
  import { ImageViewer } from "tdesign-vue-next";
6
6
  import { isImage } from "../../utils/tools.mjs";
7
- import { useConfig } from "../config-provider/useConfig.mjs";
8
7
  import { useTheme } from "../../hooks/useTheme.mjs";
9
8
  import QdOfficePdf from "../office/pdf/index.vue.mjs";
10
9
  import merge from "../../node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/merge.mjs";
@@ -20,9 +19,16 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
20
19
  setup(__props) {
21
20
  const props = __props;
22
21
  const tdTheme = useTheme();
23
- const { t } = useConfig("wrapper");
22
+ const SVG_PLACEHOLDER_PNG = (() => {
23
+ if (typeof document === "undefined") return "";
24
+ const canvas = document.createElement("canvas");
25
+ canvas.width = 800;
26
+ canvas.height = 600;
27
+ return canvas.toDataURL("image/png");
28
+ })();
24
29
  const rootRef = ref();
25
30
  const imageViewerVisible = ref(false);
31
+ const svgReady = ref(false);
26
32
  const isPdf = computed(() => {
27
33
  const { file, src } = props;
28
34
  if (file) {
@@ -35,6 +41,18 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
35
41
  }
36
42
  return false;
37
43
  });
44
+ const isSvg = computed(() => {
45
+ const { file, src } = props;
46
+ if (file) {
47
+ if ("type" in file && file.type === "image/svg+xml") return true;
48
+ if ("name" in file && file.name.endsWith(".svg")) return true;
49
+ }
50
+ if (src) {
51
+ const pathname = new URL(src, "https://x").pathname;
52
+ if (pathname.endsWith(".svg")) return true;
53
+ }
54
+ return false;
55
+ });
38
56
  const fileType = computed(() => {
39
57
  const { file, src } = props;
40
58
  if (file && "type" in file && file.type) return file.type;
@@ -48,23 +66,33 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
48
66
  if (src) return src;
49
67
  return void 0;
50
68
  });
51
- const imageViewerImages = computed(
52
- () => imageViewerSource.value ? [imageViewerSource.value] : []
53
- );
69
+ const imageViewerImages = computed(() => {
70
+ const source = imageViewerSource.value;
71
+ if (!source) return [];
72
+ if (isSvg.value) {
73
+ return svgReady.value ? [{ mainImage: source, thumbnail: source, isSvg: true }] : [SVG_PLACEHOLDER_PNG];
74
+ }
75
+ return [source];
76
+ });
54
77
  const useImageViewer = computed(() => isImageFile.value && !!imageViewerSource.value);
55
78
  const resolvedAttach = computed(() => {
56
79
  if (rootRef.value) return () => rootRef.value;
57
80
  return "body";
58
81
  });
59
82
  watch(
60
- useImageViewer,
61
- (val) => {
62
- if (!val) {
83
+ [useImageViewer, imageViewerSource],
84
+ () => {
85
+ if (!useImageViewer.value) {
63
86
  imageViewerVisible.value = false;
87
+ svgReady.value = false;
64
88
  return;
65
89
  }
90
+ svgReady.value = false;
66
91
  nextTick(() => {
67
92
  imageViewerVisible.value = true;
93
+ nextTick(() => {
94
+ svgReady.value = true;
95
+ });
68
96
  });
69
97
  },
70
98
  { immediate: true }
@@ -32,6 +32,14 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
32
32
  const imageViewerIndex = ref(0);
33
33
  const { t } = useConfig("multiFileViewer");
34
34
  const { t: wrapperT } = useConfig("wrapper");
35
+ const SVG_PLACEHOLDER_PNG = (() => {
36
+ if (typeof document === "undefined") return "";
37
+ const canvas = document.createElement("canvas");
38
+ canvas.width = 800;
39
+ canvas.height = 600;
40
+ return canvas.toDataURL("image/png");
41
+ })();
42
+ const svgReady = ref(false);
35
43
  const mergedProps = computed(() => ({
36
44
  ...props,
37
45
  ...runtimeOverrides.value
@@ -64,7 +72,13 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
64
72
  );
65
73
  const useImageViewer = computed(() => allFilesAreImages.value && !fileViewerOnly.value);
66
74
  const imageViewerImages = computed(
67
- () => (mergedProps.value.files ?? []).map((item) => resolveImageViewerSource(item) ?? "")
75
+ () => (mergedProps.value.files ?? []).map((item) => {
76
+ const source = resolveImageViewerSource(item);
77
+ if (isSvgItem(item) && source) {
78
+ return svgReady.value ? { mainImage: source, thumbnail: source, isSvg: true } : SVG_PLACEHOLDER_PNG;
79
+ }
80
+ return source ?? "";
81
+ })
68
82
  );
69
83
  const resolvedAttach = computed(() => mergedProps.value.attach ?? wrapperT("attach") ?? "body");
70
84
  const isDialog = computed(() => mergedProps.value.wrapper !== false && !useImageViewer.value);
@@ -92,6 +106,18 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
92
106
  if (item.src) return item.src;
93
107
  return void 0;
94
108
  }
109
+ function isSvgItem(item) {
110
+ const file = item.file;
111
+ if (file) {
112
+ if ("type" in file && file.type === "image/svg+xml") return true;
113
+ if ("name" in file && file.name.endsWith(".svg")) return true;
114
+ }
115
+ if (item.src) {
116
+ const pathname = new URL(item.src, "https://x").pathname;
117
+ if (pathname.endsWith(".svg")) return true;
118
+ }
119
+ return false;
120
+ }
95
121
  function normalizeIndex(index, files) {
96
122
  if (!files?.length) return 0;
97
123
  if (index === void 0 || index < 0 || index >= files.length) return 0;
@@ -121,9 +147,13 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
121
147
  activeIndex.value = normalizeIndex(mergedProps.value.index, mergedProps.value.files);
122
148
  if (useImageViewer.value) {
123
149
  imageViewerIndex.value = activeIndex.value;
150
+ svgReady.value = false;
124
151
  imageViewerVisible.value = false;
125
152
  nextTick(() => {
126
153
  imageViewerVisible.value = true;
154
+ nextTick(() => {
155
+ svgReady.value = true;
156
+ });
127
157
  });
128
158
  return;
129
159
  }
@@ -131,6 +161,7 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
131
161
  nextTick(() => dialogRef.value?.show());
132
162
  }
133
163
  function hide() {
164
+ svgReady.value = false;
134
165
  if (imageViewerVisible.value) imageViewerVisible.value = false;
135
166
  if (!isDialog.value) return;
136
167
  dialogRef.value?.hide();
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "qidian-vue-ui",
3
- "version": "1.5.2",
3
+ "version": "1.5.3",
4
4
  "description": "基于 TDesign 的 QiDian Vue UI 组件库",
5
5
  "author": "qidian",
6
6
  "license": "MIT",