@sdata/web-vue 3.4.0 → 3.6.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.
@@ -1,5 +1,5 @@
1
1
  import type { PropType } from 'vue';
2
- import type { FilePreviewerContentSlotProps, FilePreviewerType } from './types';
2
+ import type { FilePreviewerContentSlotProps, FilePreviewerImageProps, FilePreviewerMediaProps, FilePreviewerPdfProps, FilePreviewerType } from './types';
3
3
  type __VLS_Slots = {
4
4
  title?: () => unknown;
5
5
  content?: (_props: FilePreviewerContentSlotProps) => unknown;
@@ -49,6 +49,15 @@ declare const __VLS_base: import("vue").DefineComponent<import("vue").ExtractPro
49
49
  type: BooleanConstructor;
50
50
  default: boolean;
51
51
  };
52
+ imageProps: {
53
+ type: PropType<FilePreviewerImageProps>;
54
+ };
55
+ mediaProps: {
56
+ type: PropType<FilePreviewerMediaProps>;
57
+ };
58
+ pdfProps: {
59
+ type: PropType<FilePreviewerPdfProps>;
60
+ };
52
61
  }>, {
53
62
  close: typeof close;
54
63
  onLoad: typeof onPreviewLoad;
@@ -102,6 +111,15 @@ declare const __VLS_base: import("vue").DefineComponent<import("vue").ExtractPro
102
111
  type: BooleanConstructor;
103
112
  default: boolean;
104
113
  };
114
+ imageProps: {
115
+ type: PropType<FilePreviewerImageProps>;
116
+ };
117
+ mediaProps: {
118
+ type: PropType<FilePreviewerMediaProps>;
119
+ };
120
+ pdfProps: {
121
+ type: PropType<FilePreviewerPdfProps>;
122
+ };
105
123
  }>> & Readonly<{
106
124
  onClose?: (() => any) | undefined;
107
125
  "onUpdate:visible"?: ((_visible: boolean) => any) | undefined;
@@ -8,7 +8,8 @@ import { KEYBOARD_KEY } from "../_utils/keyboard.js";
8
8
  import usePopupManager from "../_hooks/use-popup-manager.js";
9
9
  import usePopupContainer from "../_hooks/use-popup-container.js";
10
10
  import usePopupOverflowHidden from "../_hooks/use-popup-overflow-hidden.js";
11
- import { Teleport, computed, createBlock, createCommentVNode, createElementBlock, createElementVNode, createVNode, defineComponent, guardReactiveProps, nextTick, normalizeClass, normalizeProps, normalizeStyle, openBlock, reactive, renderSlot, resolveDynamicComponent, shallowRef, toDisplayString, toRefs, unref, useSlots, watch, withCtx } from "vue";
11
+ import Image from "../image/index.js";
12
+ import { Fragment, Teleport, computed, createBlock, createCommentVNode, createElementBlock, createElementVNode, createVNode, defineComponent, guardReactiveProps, mergeProps, nextTick, normalizeClass, normalizeProps, normalizeStyle, openBlock, reactive, renderSlot, resolveDynamicComponent, shallowRef, toDisplayString, toRefs, unref, useSlots, watch, withCtx } from "vue";
12
13
  //#region components/file-previewer/file-previewer.vue?vue&type=script&setup=true&lang.ts
13
14
  var _hoisted_1 = ["tabindex"];
14
15
  var _hoisted_2 = [
@@ -16,10 +17,6 @@ var _hoisted_2 = [
16
17
  "aria-modal",
17
18
  "aria-label"
18
19
  ];
19
- var _hoisted_3 = ["src", "alt"];
20
- var _hoisted_4 = ["src"];
21
- var _hoisted_5 = ["src"];
22
- var _hoisted_6 = ["src"];
23
20
  var file_previewer_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ defineComponent(_objectSpread2(_objectSpread2({}, { name: "FilePreviewer" }), {}, {
24
21
  __name: "file-previewer",
25
22
  props: {
@@ -102,7 +99,22 @@ var file_previewer_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ d
102
99
  renderToBody: {
103
100
  type: Boolean,
104
101
  default: true
105
- }
102
+ },
103
+ /**
104
+ * @zh 图片预览器参数
105
+ * @en Image previewer props
106
+ */
107
+ imageProps: { type: Object },
108
+ /**
109
+ * @zh 视频和音频预览器参数
110
+ * @en Video and audio previewer props
111
+ */
112
+ mediaProps: { type: Object },
113
+ /**
114
+ * @zh PDF 预览器参数
115
+ * @en PDF previewer props
116
+ */
117
+ pdfProps: { type: Object }
106
118
  },
107
119
  emits: [
108
120
  "close",
@@ -113,12 +125,13 @@ var file_previewer_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ d
113
125
  const slots = useSlots();
114
126
  const props = __props;
115
127
  const emit = __emit;
116
- const { src, type, visible, defaultVisible, fullscreen, popupContainer, renderToBody, maskClosable, closable, escToClose, title } = toRefs(props);
128
+ const { src, type, visible, defaultVisible, fullscreen, popupContainer, renderToBody, maskClosable, closable, escToClose, title, imageProps, mediaProps, pdfProps } = toRefs(props);
117
129
  const prefixCls = getPrefixCls("file-previewer");
118
130
  const wrapperRef = shallowRef();
119
131
  const status = shallowRef("beforeLoad");
120
132
  const requestId = shallowRef(0);
121
- let videoJsHtmlPromise;
133
+ let videoJsVideoPromise;
134
+ let videoJsAudioPromise;
122
135
  const localVisible = shallowRef(defaultVisible.value);
123
136
  const mergedVisible = computed(() => {
124
137
  var _visible$value;
@@ -170,6 +183,82 @@ var file_previewer_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ d
170
183
  onLoad: onPreviewLoad,
171
184
  onError: onLoadError
172
185
  }));
186
+ const mergedImageProps = computed(() => {
187
+ var _imageProps$value;
188
+ const userProps = (_imageProps$value = imageProps === null || imageProps === void 0 ? void 0 : imageProps.value) !== null && _imageProps$value !== void 0 ? _imageProps$value : {};
189
+ return _objectSpread2(_objectSpread2({
190
+ preview: false,
191
+ width: "100%",
192
+ height: "100%",
193
+ fit: "contain",
194
+ alt: (title === null || title === void 0 ? void 0 : title.value) || ""
195
+ }, userProps), {}, {
196
+ src: currentSrc.value,
197
+ onLoad: (event) => {
198
+ callEventHandler(userProps.onLoad, event);
199
+ onPreviewLoad();
200
+ },
201
+ onError: (event) => {
202
+ callEventHandler(userProps.onError, event);
203
+ onLoadError();
204
+ }
205
+ });
206
+ });
207
+ const mediaSkin = computed(() => {
208
+ var _mediaProps$value$ski, _mediaProps$value;
209
+ return (_mediaProps$value$ski = mediaProps === null || mediaProps === void 0 || (_mediaProps$value = mediaProps.value) === null || _mediaProps$value === void 0 ? void 0 : _mediaProps$value.skin) !== null && _mediaProps$value$ski !== void 0 ? _mediaProps$value$ski : "default";
210
+ });
211
+ const useVideoJsMediaSkin = computed(() => mediaSkin.value !== false && mediaSkin.value !== "native");
212
+ const mediaSkinTag = computed(() => {
213
+ if (mediaSkin.value === "minimal") return type.value === "audio" ? "minimal-audio-skin" : "minimal-video-skin";
214
+ if (mediaSkin.value && mediaSkin.value !== "default") return String(mediaSkin.value);
215
+ return type.value === "audio" ? "audio-skin" : "video-skin";
216
+ });
217
+ const mediaPlayerTag = computed(() => type.value === "audio" ? "audio-player" : "video-player");
218
+ const mediaSkinClassNames = computed(() => [`${prefixCls}-media-skin`, `${prefixCls}-media-skin-${type.value}`]);
219
+ const mediaPlayerProps = computed(() => {
220
+ var _mediaProps$value$pla, _mediaProps$value2;
221
+ return (_mediaProps$value$pla = mediaProps === null || mediaProps === void 0 || (_mediaProps$value2 = mediaProps.value) === null || _mediaProps$value2 === void 0 ? void 0 : _mediaProps$value2.playerProps) !== null && _mediaProps$value$pla !== void 0 ? _mediaProps$value$pla : {};
222
+ });
223
+ const mediaSkinProps = computed(() => {
224
+ var _mediaProps$value$ski2, _mediaProps$value3;
225
+ return (_mediaProps$value$ski2 = mediaProps === null || mediaProps === void 0 || (_mediaProps$value3 = mediaProps.value) === null || _mediaProps$value3 === void 0 ? void 0 : _mediaProps$value3.skinProps) !== null && _mediaProps$value$ski2 !== void 0 ? _mediaProps$value$ski2 : {};
226
+ });
227
+ const mergedMediaProps = computed(() => {
228
+ const userProps = _objectSpread2({}, mediaProps === null || mediaProps === void 0 ? void 0 : mediaProps.value);
229
+ const { onLoadedData, onError } = userProps;
230
+ delete userProps.skin;
231
+ delete userProps.playerProps;
232
+ delete userProps.skinProps;
233
+ delete userProps.onLoadedData;
234
+ delete userProps.onError;
235
+ return _objectSpread2(_objectSpread2(_objectSpread2(_objectSpread2({}, useVideoJsMediaSkin.value ? void 0 : { controls: true }), type.value === "video" ? { playsinline: true } : void 0), userProps), {}, {
236
+ src: currentSrc.value,
237
+ onLoadedData: (event) => {
238
+ callEventHandler(onLoadedData, event);
239
+ onPreviewLoad();
240
+ },
241
+ onError: (event) => {
242
+ callEventHandler(onError, event);
243
+ onLoadError();
244
+ }
245
+ });
246
+ });
247
+ const mergedPdfProps = computed(() => {
248
+ var _pdfProps$value;
249
+ const userProps = (_pdfProps$value = pdfProps === null || pdfProps === void 0 ? void 0 : pdfProps.value) !== null && _pdfProps$value !== void 0 ? _pdfProps$value : {};
250
+ return _objectSpread2(_objectSpread2({ title: "PDF preview" }, userProps), {}, {
251
+ src: currentSrc.value,
252
+ onLoad: (event) => {
253
+ callEventHandler(userProps.onLoad, event);
254
+ onPreviewLoad();
255
+ },
256
+ onError: (event) => {
257
+ callEventHandler(userProps.onError, event);
258
+ onLoadError();
259
+ }
260
+ });
261
+ });
173
262
  usePopupOverflowHidden(reactive({
174
263
  container,
175
264
  hidden: popupVisible
@@ -204,6 +293,13 @@ var file_previewer_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ d
204
293
  function onLoadError() {
205
294
  status.value = "error";
206
295
  }
296
+ function callEventHandler(handler, event) {
297
+ if (Array.isArray(handler)) {
298
+ handler.forEach((item) => callEventHandler(item, event));
299
+ return;
300
+ }
301
+ if (typeof handler === "function") handler(event);
302
+ }
207
303
  function ensureVideoJsHtml() {
208
304
  return _ensureVideoJsHtml.apply(this, arguments);
209
305
  }
@@ -213,16 +309,21 @@ var file_previewer_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ d
213
309
  configurable: true,
214
310
  value: window.Element
215
311
  });
216
- if (!videoJsHtmlPromise) videoJsHtmlPromise = import("@videojs/html");
217
- yield videoJsHtmlPromise;
312
+ if (type.value === "audio") {
313
+ if (!videoJsAudioPromise) videoJsAudioPromise = import("@videojs/html/audio");
314
+ yield videoJsAudioPromise;
315
+ return;
316
+ }
317
+ if (!videoJsVideoPromise) videoJsVideoPromise = import("@videojs/html/video");
318
+ yield videoJsVideoPromise;
218
319
  });
219
320
  return _ensureVideoJsHtml.apply(this, arguments);
220
321
  }
221
- function prepareVideo(_x) {
222
- return _prepareVideo.apply(this, arguments);
322
+ function prepareMedia(_x) {
323
+ return _prepareMedia.apply(this, arguments);
223
324
  }
224
- function _prepareVideo() {
225
- _prepareVideo = _asyncToGenerator(function* (currentRequestId) {
325
+ function _prepareMedia() {
326
+ _prepareMedia = _asyncToGenerator(function* (currentRequestId) {
226
327
  status.value = "loading";
227
328
  try {
228
329
  if (!isServerRendering) yield ensureVideoJsHtml();
@@ -233,7 +334,7 @@ var file_previewer_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ d
233
334
  status.value = "error";
234
335
  }
235
336
  });
236
- return _prepareVideo.apply(this, arguments);
337
+ return _prepareMedia.apply(this, arguments);
237
338
  }
238
339
  watch([
239
340
  src,
@@ -252,11 +353,15 @@ var file_previewer_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ d
252
353
  return;
253
354
  }
254
355
  const currentRequestId = requestId.value;
255
- if (type.value === "video") {
256
- prepareVideo(currentRequestId);
356
+ if (type.value === "video" || type.value === "audio") {
357
+ if (useVideoJsMediaSkin.value) {
358
+ prepareMedia(currentRequestId);
359
+ return;
360
+ }
361
+ status.value = "loading";
257
362
  return;
258
363
  }
259
- if (type.value === "audio" || type.value === "pdf") {
364
+ if (type.value === "pdf") {
260
365
  status.value = "loaded";
261
366
  return;
262
367
  }
@@ -296,44 +401,22 @@ var file_previewer_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ d
296
401
  }, [unref(title) || _ctx.$slots.title ? (openBlock(), createElementBlock("header", {
297
402
  key: 0,
298
403
  class: normalizeClass(`${unref(prefixCls)}-header`)
299
- }, [renderSlot(_ctx.$slots, "title", {}, () => [createElementVNode("span", { class: normalizeClass(`${unref(prefixCls)}-title`) }, toDisplayString(unref(title)), 3)])], 2)) : createCommentVNode("", true), createElementVNode("div", { class: normalizeClass(`${unref(prefixCls)}-body`) }, [renderSlot(_ctx.$slots, "content", normalizeProps(guardReactiveProps(contentSlotProps.value)), () => [unref(type) === "image" ? (openBlock(), createElementBlock("img", {
300
- key: currentSrc.value,
301
- class: normalizeClass(`${unref(prefixCls)}-image`),
302
- src: currentSrc.value,
303
- alt: unref(title) || "",
304
- onLoad: onPreviewLoad,
305
- onError: onLoadError
306
- }, null, 42, _hoisted_3)) : unref(type) === "video" ? (openBlock(), createBlock(resolveDynamicComponent("video-player"), {
307
- key: 1,
308
- class: normalizeClass(`${unref(prefixCls)}-video-player`)
309
- }, {
310
- default: withCtx(() => [(openBlock(), createBlock(resolveDynamicComponent("video-skin"), null, {
311
- default: withCtx(() => [(openBlock(), createElementBlock("video", {
312
- key: currentSrc.value,
313
- class: normalizeClass(`${unref(prefixCls)}-video`),
314
- src: currentSrc.value,
315
- controls: "",
316
- playsinline: ""
317
- }, null, 10, _hoisted_4))]),
404
+ }, [renderSlot(_ctx.$slots, "title", {}, () => [createElementVNode("span", { class: normalizeClass(`${unref(prefixCls)}-title`) }, toDisplayString(unref(title)), 3)])], 2)) : createCommentVNode("", true), createElementVNode("div", { class: normalizeClass(`${unref(prefixCls)}-body`) }, [renderSlot(_ctx.$slots, "content", normalizeProps(guardReactiveProps(contentSlotProps.value)), () => [unref(type) === "image" ? (openBlock(), createBlock(unref(Image), mergeProps({ key: currentSrc.value + "image" }, mergedImageProps.value, { class: `${unref(prefixCls)}-image` }), null, 16, ["class"])) : unref(type) === "video" ? (openBlock(), createElementBlock(Fragment, { key: 1 }, [useVideoJsMediaSkin.value ? (openBlock(), createBlock(resolveDynamicComponent(mediaPlayerTag.value), mergeProps({ key: 0 }, mediaPlayerProps.value, { class: `${unref(prefixCls)}-video-player` }), {
405
+ default: withCtx(() => [(openBlock(), createBlock(resolveDynamicComponent(mediaSkinTag.value), mergeProps(mediaSkinProps.value, { class: mediaSkinClassNames.value }), {
406
+ default: withCtx(() => [(openBlock(), createElementBlock("video", mergeProps({ key: currentSrc.value + "video" }, mergedMediaProps.value, { class: `${unref(prefixCls)}-video` }), null, 16))]),
318
407
  _: 1
319
- }))]),
408
+ }, 16, ["class"]))]),
320
409
  _: 1
321
- }, 8, ["class"])) : unref(type) === "audio" ? (openBlock(), createElementBlock("div", {
410
+ }, 16, ["class"])) : (openBlock(), createElementBlock("video", mergeProps({ key: currentSrc.value }, mergedMediaProps.value, { class: `${unref(prefixCls)}-video` }), null, 16))], 64)) : unref(type) === "audio" ? (openBlock(), createElementBlock("div", {
322
411
  key: 2,
323
412
  class: normalizeClass(`${unref(prefixCls)}-audio-panel`)
324
- }, [(openBlock(), createElementBlock("audio", {
325
- key: currentSrc.value,
326
- class: normalizeClass(`${unref(prefixCls)}-audio`),
327
- src: currentSrc.value,
328
- controls: ""
329
- }, null, 10, _hoisted_5))], 2)) : unref(type) === "pdf" ? (openBlock(), createElementBlock("iframe", {
330
- key: currentSrc.value,
331
- class: normalizeClass(`${unref(prefixCls)}-pdf`),
332
- src: currentSrc.value,
333
- title: "PDF preview",
334
- onLoad: onPreviewLoad,
335
- onError: onLoadError
336
- }, null, 42, _hoisted_6)) : createCommentVNode("", true)])], 2)], 10, _hoisted_2),
413
+ }, [useVideoJsMediaSkin.value ? (openBlock(), createBlock(resolveDynamicComponent(mediaPlayerTag.value), mergeProps({ key: 0 }, mediaPlayerProps.value, { class: `${unref(prefixCls)}-audio-player` }), {
414
+ default: withCtx(() => [(openBlock(), createBlock(resolveDynamicComponent(mediaSkinTag.value), mergeProps(mediaSkinProps.value, { class: mediaSkinClassNames.value }), {
415
+ default: withCtx(() => [(openBlock(), createElementBlock("audio", mergeProps({ key: currentSrc.value + "audio" }, mergedMediaProps.value, { class: `${unref(prefixCls)}-audio` }), null, 16))]),
416
+ _: 1
417
+ }, 16, ["class"]))]),
418
+ _: 1
419
+ }, 16, ["class"])) : (openBlock(), createElementBlock("audio", mergeProps({ key: currentSrc.value + "audio" }, mergedMediaProps.value, { class: `${unref(prefixCls)}-audio` }), null, 16))], 2)) : unref(type) === "pdf" ? (openBlock(), createElementBlock("iframe", mergeProps({ key: currentSrc.value + "pdf" }, mergedPdfProps.value, { class: `${unref(prefixCls)}-pdf` }), null, 16)) : createCommentVNode("", true)])], 2)], 10, _hoisted_2),
337
420
  unref(fullscreen) && unref(closable) ? (openBlock(), createElementBlock("button", {
338
421
  key: 1,
339
422
  type: "button",
@@ -44,6 +44,44 @@ declare const FilePreviewer: {
44
44
  type: BooleanConstructor;
45
45
  default: boolean;
46
46
  };
47
+ imageProps: {
48
+ type: import("vue").PropType<{
49
+ [x: string]: unknown;
50
+ [x: number]: unknown;
51
+ [x: symbol]: unknown;
52
+ src?: string | undefined;
53
+ width?: string | number | undefined;
54
+ height?: string | number | undefined;
55
+ title?: string | undefined;
56
+ description?: string | undefined;
57
+ alt?: string | undefined;
58
+ hideFooter?: boolean | undefined;
59
+ footerPosition?: "outer" | "inner" | undefined;
60
+ showLoader?: boolean | undefined;
61
+ preview?: boolean | undefined;
62
+ previewVisible?: boolean | undefined;
63
+ defaultPreviewVisible?: boolean | undefined;
64
+ previewProps?: Partial<import("../image/interface.ts").ImagePreviewProps> | undefined;
65
+ extra?: import("vue").Slot | undefined;
66
+ error?: import("vue").Slot | undefined;
67
+ loader?: import("vue").Slot | undefined;
68
+ onPreviewVisibleChange?: ((visible: boolean) => void) | undefined;
69
+ fit?: ("fill" | "none" | "contain" | "cover" | "scale-down") | undefined;
70
+ }>;
71
+ };
72
+ mediaProps: {
73
+ type: import("vue").PropType<{
74
+ [x: string]: unknown;
75
+ [x: number]: unknown;
76
+ [x: symbol]: unknown;
77
+ skin?: import("./types").FilePreviewerMediaSkin | undefined;
78
+ playerProps?: import("type-fest").UnknownRecord | undefined;
79
+ skinProps?: import("type-fest").UnknownRecord | undefined;
80
+ }>;
81
+ };
82
+ pdfProps: {
83
+ type: import("vue").PropType<import("./types").FilePreviewerPdfProps>;
84
+ };
47
85
  }>> & Readonly<{
48
86
  onClose?: (() => any) | undefined;
49
87
  "onUpdate:visible"?: ((_visible: boolean) => any) | undefined;
@@ -117,6 +155,44 @@ declare const FilePreviewer: {
117
155
  type: BooleanConstructor;
118
156
  default: boolean;
119
157
  };
158
+ imageProps: {
159
+ type: import("vue").PropType<{
160
+ [x: string]: unknown;
161
+ [x: number]: unknown;
162
+ [x: symbol]: unknown;
163
+ src?: string | undefined;
164
+ width?: string | number | undefined;
165
+ height?: string | number | undefined;
166
+ title?: string | undefined;
167
+ description?: string | undefined;
168
+ alt?: string | undefined;
169
+ hideFooter?: boolean | undefined;
170
+ footerPosition?: "outer" | "inner" | undefined;
171
+ showLoader?: boolean | undefined;
172
+ preview?: boolean | undefined;
173
+ previewVisible?: boolean | undefined;
174
+ defaultPreviewVisible?: boolean | undefined;
175
+ previewProps?: Partial<import("../image/interface.ts").ImagePreviewProps> | undefined;
176
+ extra?: import("vue").Slot | undefined;
177
+ error?: import("vue").Slot | undefined;
178
+ loader?: import("vue").Slot | undefined;
179
+ onPreviewVisibleChange?: ((visible: boolean) => void) | undefined;
180
+ fit?: ("fill" | "none" | "contain" | "cover" | "scale-down") | undefined;
181
+ }>;
182
+ };
183
+ mediaProps: {
184
+ type: import("vue").PropType<{
185
+ [x: string]: unknown;
186
+ [x: number]: unknown;
187
+ [x: symbol]: unknown;
188
+ skin?: import("./types").FilePreviewerMediaSkin | undefined;
189
+ playerProps?: import("type-fest").UnknownRecord | undefined;
190
+ skinProps?: import("type-fest").UnknownRecord | undefined;
191
+ }>;
192
+ };
193
+ pdfProps: {
194
+ type: import("vue").PropType<import("./types").FilePreviewerPdfProps>;
195
+ };
120
196
  }>> & Readonly<{
121
197
  onClose?: (() => any) | undefined;
122
198
  "onUpdate:visible"?: ((_visible: boolean) => any) | undefined;
@@ -183,6 +259,15 @@ declare const FilePreviewer: {
183
259
  type: BooleanConstructor;
184
260
  default: boolean;
185
261
  };
262
+ imageProps: {
263
+ type: import("vue").PropType<import("./types").FilePreviewerImageProps>;
264
+ };
265
+ mediaProps: {
266
+ type: import("vue").PropType<import("./types").FilePreviewerMediaProps>;
267
+ };
268
+ pdfProps: {
269
+ type: import("vue").PropType<import("./types").FilePreviewerPdfProps>;
270
+ };
186
271
  }>> & Readonly<{
187
272
  onClose?: (() => any) | undefined;
188
273
  "onUpdate:visible"?: ((_visible: boolean) => any) | undefined;
@@ -216,5 +301,5 @@ declare const FilePreviewer: {
216
301
  install: (app: App, options?: SDOptions) => void;
217
302
  };
218
303
  export type FilePreviewerInstance = InstanceType<typeof _FilePreviewer>;
219
- export type { FilePreviewerContentSlotProps, FilePreviewerProps, FilePreviewerStatus, FilePreviewerType, } from './types';
304
+ export type { FilePreviewerContentSlotProps, FilePreviewerImageProps, FilePreviewerMediaProps, FilePreviewerMediaSkin, FilePreviewerPdfProps, FilePreviewerProps, FilePreviewerStatus, FilePreviewerType, } from './types';
220
305
  export default FilePreviewer;
@@ -28,9 +28,6 @@
28
28
  .sd-file-previewer-inline {
29
29
  overflow: hidden;
30
30
  color: var(--sd-color-text-1);
31
- background: var(--sd-color-fill-1);
32
- border: 1px solid var(--sd-color-border-2);
33
- border-radius: var(--sd-border-radius-medium);
34
31
  }
35
32
  .sd-file-previewer-mask {
36
33
  position: absolute;
@@ -82,31 +79,45 @@
82
79
  min-width: 0;
83
80
  min-height: 0;
84
81
  }
85
- .sd-file-previewer-image, .sd-file-previewer-video-player, .sd-file-previewer-video, .sd-file-previewer-pdf {
82
+ .sd-file-previewer-image, .sd-file-previewer-video-player, .sd-file-previewer-audio-player, .sd-file-previewer-video, .sd-file-previewer-pdf {
86
83
  display: block;
87
84
  width: 100%;
88
85
  height: 100%;
89
86
  }
90
- .sd-file-previewer-image {
87
+ .sd-file-previewer-image .sd-image-img {
91
88
  object-fit: contain;
92
89
  }
90
+ .sd-file-previewer-video-player, .sd-file-previewer-audio-player {
91
+ min-width: 0 !important;
92
+ min-height: 0 !important;
93
+ }
93
94
  .sd-file-previewer-video-player {
94
95
  max-width: 1180px;
95
96
  max-height: 78vh;
96
97
  }
97
- .sd-file-previewer-inline .sd-file-previewer-video-player {
98
+ .sd-file-previewer-media-skin {
99
+ display: block;
100
+ width: 100%;
101
+ min-width: 0 !important;
98
102
  max-width: 100%;
99
- max-height: none;
103
+ height: 100%;
104
+ min-height: 0 !important;
105
+ max-height: 100%;
106
+ --media-object-fit: cover;
100
107
  }
101
108
  .sd-file-previewer-video {
102
- background: #000;
109
+ object-fit: cover;
110
+ }
111
+ .sd-file-previewer-inline .sd-file-previewer-video-player {
112
+ max-width: 100%;
113
+ max-height: none;
103
114
  }
104
115
  .sd-file-previewer-audio-panel {
105
116
  box-sizing: border-box;
106
117
  width: 100%;
107
118
  padding: 20px;
108
119
  }
109
- .sd-file-previewer-audio {
120
+ .sd-file-previewer-audio-player, .sd-file-previewer-audio {
110
121
  display: block;
111
122
  width: 100%;
112
123
  }
@@ -3,6 +3,7 @@
3
3
  @use './token.scss' as *;
4
4
 
5
5
  $file-previewer-prefix-cls: string.unquote('#{theme.$prefix}-file-previewer');
6
+ $image-prefix-cls: string.unquote('#{theme.$prefix}-image');
6
7
 
7
8
  @mixin center() {
8
9
  position: absolute;
@@ -25,9 +26,6 @@ $file-previewer-prefix-cls: string.unquote('#{theme.$prefix}-file-previewer');
25
26
  &-inline {
26
27
  overflow: hidden;
27
28
  color: $file-previewer-color-content-text;
28
- background: $file-previewer-color-inline-bg;
29
- border: 1px solid $file-previewer-color-inline-border;
30
- border-radius: $file-previewer-radius-panel;
31
29
  }
32
30
 
33
31
  &-mask {
@@ -94,6 +92,7 @@ $file-previewer-prefix-cls: string.unquote('#{theme.$prefix}-file-previewer');
94
92
 
95
93
  &-image,
96
94
  &-video-player,
95
+ &-audio-player,
97
96
  &-video,
98
97
  &-pdf {
99
98
  display: block;
@@ -101,22 +100,40 @@ $file-previewer-prefix-cls: string.unquote('#{theme.$prefix}-file-previewer');
101
100
  height: 100%;
102
101
  }
103
102
 
104
- &-image {
103
+ &-image .#{$image-prefix-cls}-img {
105
104
  object-fit: contain;
106
105
  }
107
106
 
107
+ &-video-player,
108
+ &-audio-player {
109
+ min-width: 0 !important;
110
+ min-height: 0 !important;
111
+ }
112
+
108
113
  &-video-player {
109
114
  max-width: $file-previewer-size-media-width;
110
115
  max-height: $file-previewer-size-media-height;
111
116
  }
112
117
 
113
- &-inline &-video-player {
118
+ &-media-skin {
119
+ display: block;
120
+ width: 100%;
121
+ min-width: 0 !important;
114
122
  max-width: 100%;
115
- max-height: none;
123
+ height: 100%;
124
+ min-height: 0 !important;
125
+ max-height: 100%;
126
+
127
+ --media-object-fit: cover;
116
128
  }
117
129
 
118
130
  &-video {
119
- background: #000;
131
+ object-fit: cover;
132
+ }
133
+
134
+ &-inline &-video-player {
135
+ max-width: 100%;
136
+ max-height: none;
120
137
  }
121
138
 
122
139
  &-audio-panel {
@@ -125,6 +142,7 @@ $file-previewer-prefix-cls: string.unquote('#{theme.$prefix}-file-previewer');
125
142
  padding: $file-previewer-spacing-panel-padding;
126
143
  }
127
144
 
145
+ &-audio-player,
128
146
  &-audio {
129
147
  display: block;
130
148
  width: 100%;
@@ -1,5 +1,18 @@
1
+ import type { Except, Simplify, UnknownRecord } from 'type-fest';
2
+ import type { ImageProps } from '../image/interface';
1
3
  export type FilePreviewerType = 'image' | 'video' | 'audio' | 'pdf';
2
4
  export type FilePreviewerStatus = 'beforeLoad' | 'loading' | 'loaded' | 'error';
5
+ type FilePreviewerImageFit = 'contain' | 'cover' | 'fill' | 'none' | 'scale-down';
6
+ export type FilePreviewerImageProps = Simplify<Except<Partial<ImageProps>, 'fit'> & {
7
+ fit?: FilePreviewerImageFit;
8
+ } & UnknownRecord>;
9
+ export type FilePreviewerMediaSkin = 'default' | 'minimal' | 'native' | false | (string & {});
10
+ export type FilePreviewerMediaProps = Simplify<UnknownRecord & {
11
+ skin?: FilePreviewerMediaSkin;
12
+ playerProps?: UnknownRecord;
13
+ skinProps?: UnknownRecord;
14
+ }>;
15
+ export type FilePreviewerPdfProps = UnknownRecord;
3
16
  export interface FilePreviewerContentSlotProps {
4
17
  src: string;
5
18
  type: FilePreviewerType;
@@ -26,4 +39,8 @@ export interface FilePreviewerProps {
26
39
  escToClose?: boolean;
27
40
  popupContainer?: HTMLElement | string;
28
41
  renderToBody?: boolean;
42
+ imageProps?: FilePreviewerImageProps;
43
+ mediaProps?: FilePreviewerMediaProps;
44
+ pdfProps?: FilePreviewerPdfProps;
29
45
  }
46
+ export {};
package/es/index.css CHANGED
@@ -5276,7 +5276,6 @@ body.sd-tour-active .sd-tour-popover * {
5276
5276
  grid-template-columns: repeat(auto-fill, minmax(var(--toolbar-span-width), 1fr));
5277
5277
  gap: 8px;
5278
5278
  width: 100%;
5279
- background-color: var(--sd-color-bg-2);
5280
5279
  }
5281
5280
  .sd-toolbar-body--schema .sd-form > * {
5282
5281
  max-width: var(--toolbar-item-max-width);
@@ -14898,9 +14897,6 @@ body.sd-tour-active .sd-tour-popover * {
14898
14897
  .sd-file-previewer-inline {
14899
14898
  overflow: hidden;
14900
14899
  color: var(--sd-color-text-1);
14901
- background: var(--sd-color-fill-1);
14902
- border: 1px solid var(--sd-color-border-2);
14903
- border-radius: var(--sd-border-radius-medium);
14904
14900
  }
14905
14901
  .sd-file-previewer-mask {
14906
14902
  position: absolute;
@@ -14952,31 +14948,45 @@ body.sd-tour-active .sd-tour-popover * {
14952
14948
  min-width: 0;
14953
14949
  min-height: 0;
14954
14950
  }
14955
- .sd-file-previewer-image, .sd-file-previewer-video-player, .sd-file-previewer-video, .sd-file-previewer-pdf {
14951
+ .sd-file-previewer-image, .sd-file-previewer-video-player, .sd-file-previewer-audio-player, .sd-file-previewer-video, .sd-file-previewer-pdf {
14956
14952
  display: block;
14957
14953
  width: 100%;
14958
14954
  height: 100%;
14959
14955
  }
14960
- .sd-file-previewer-image {
14956
+ .sd-file-previewer-image .sd-image-img {
14961
14957
  object-fit: contain;
14962
14958
  }
14959
+ .sd-file-previewer-video-player, .sd-file-previewer-audio-player {
14960
+ min-width: 0 !important;
14961
+ min-height: 0 !important;
14962
+ }
14963
14963
  .sd-file-previewer-video-player {
14964
14964
  max-width: 1180px;
14965
14965
  max-height: 78vh;
14966
14966
  }
14967
- .sd-file-previewer-inline .sd-file-previewer-video-player {
14967
+ .sd-file-previewer-media-skin {
14968
+ display: block;
14969
+ width: 100%;
14970
+ min-width: 0 !important;
14968
14971
  max-width: 100%;
14969
- max-height: none;
14972
+ height: 100%;
14973
+ min-height: 0 !important;
14974
+ max-height: 100%;
14975
+ --media-object-fit: cover;
14970
14976
  }
14971
14977
  .sd-file-previewer-video {
14972
- background: #000;
14978
+ object-fit: cover;
14979
+ }
14980
+ .sd-file-previewer-inline .sd-file-previewer-video-player {
14981
+ max-width: 100%;
14982
+ max-height: none;
14973
14983
  }
14974
14984
  .sd-file-previewer-audio-panel {
14975
14985
  box-sizing: border-box;
14976
14986
  width: 100%;
14977
14987
  padding: 20px;
14978
14988
  }
14979
- .sd-file-previewer-audio {
14989
+ .sd-file-previewer-audio-player, .sd-file-previewer-audio {
14980
14990
  display: block;
14981
14991
  width: 100%;
14982
14992
  }
package/es/index.d.ts CHANGED
@@ -70,7 +70,7 @@ export type { ColProps, GridColInstance, GridInstance, GridItemInstance, GridIte
70
70
  export { default as Icon } from './icon-component';
71
71
  export type { IconInstance, IconProps } from './icon-component';
72
72
  export { default as FilePreviewer } from './file-previewer';
73
- export type { FilePreviewerContentSlotProps, FilePreviewerInstance, FilePreviewerProps, FilePreviewerStatus, FilePreviewerType, } from './file-previewer';
73
+ export type { FilePreviewerContentSlotProps, FilePreviewerImageProps, FilePreviewerInstance, FilePreviewerMediaProps, FilePreviewerMediaSkin, FilePreviewerPdfProps, FilePreviewerProps, FilePreviewerStatus, FilePreviewerType, } from './file-previewer';
74
74
  export { default as Image, ImagePreviewAction, ImagePreview, ImagePreviewGroup } from './image';
75
75
  export type { ImageInstance, ImagePreviewActionInstance, ImagePreviewInstance, ImagePreviewGroupInstance, } from './image';
76
76
  export { default as Input, InputGroup, InputPassword, InputSearch } from './input';