@sdata/web-vue 3.9.0 → 3.11.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.
Files changed (40) hide show
  1. package/dist/sd.css +257 -5
  2. package/dist/sd.min.css +1 -1
  3. package/es/components.d.ts +1 -0
  4. package/es/file-previewer/file-previewer.vue.d.ts +5 -1
  5. package/es/file-previewer/file-previewer.vue_vue_type_script_setup_true_lang.js +117 -21
  6. package/es/file-previewer/index.d.ts +33 -3
  7. package/es/file-previewer/pdfjs-worker-url.d.ts +2 -0
  8. package/es/file-previewer/pdfjs-worker-url.js +4 -0
  9. package/es/file-previewer/pdfjs-worker.min.mjs +29 -0
  10. package/es/file-previewer/style/index.css +53 -5
  11. package/es/file-previewer/style/index.scss +58 -6
  12. package/es/file-previewer/style/token.scss +13 -0
  13. package/es/file-previewer/types.d.ts +55 -1
  14. package/es/file-previewer/use-pdf-js.d.ts +20 -0
  15. package/es/file-previewer/use-pdf-js.js +197 -0
  16. package/es/index.css +257 -5
  17. package/es/index.d.ts +3 -1
  18. package/es/index.js +2 -1
  19. package/es/index.scss +1 -0
  20. package/es/sd-vue.js +2 -0
  21. package/es/selectable-card/index.d.ts +88 -0
  22. package/es/selectable-card/index.js +10 -0
  23. package/es/selectable-card/selectable-card.js +5 -0
  24. package/es/selectable-card/selectable-card.vue.d.ts +39 -0
  25. package/es/selectable-card/selectable-card.vue_vue_type_script_setup_true_lang.js +115 -0
  26. package/es/selectable-card/style/css.js +2 -0
  27. package/es/selectable-card/style/index.css +220 -0
  28. package/es/selectable-card/style/index.d.ts +2 -0
  29. package/es/selectable-card/style/index.js +2 -0
  30. package/es/selectable-card/style/index.scss +202 -0
  31. package/es/selectable-card/style/token.scss +27 -0
  32. package/es/selectable-card/types.d.ts +7 -0
  33. package/es/tree/base-node.vue_vue_type_script_setup_true_lang.js +17 -10
  34. package/es/tree/interface.d.ts +1 -0
  35. package/es/tree/tree.vue.d.ts +9 -0
  36. package/es/tree/tree.vue_vue_type_script_setup_true_lang.js +8 -0
  37. package/json/vetur-attributes.json +4 -0
  38. package/json/vetur-tags.json +4 -0
  39. package/json/web-types.json +15 -1
  40. package/package.json +3 -1
@@ -23,6 +23,7 @@ declare module 'vue' {
23
23
  SdCard: SDVue['Card'];
24
24
  SdCardMeta: SDVue['CardMeta'];
25
25
  SdCardGrid: SDVue['CardGrid'];
26
+ SdSelectableCard: SDVue['SelectableCard'];
26
27
  SdCarousel: SDVue['Carousel'];
27
28
  SdCarouselItem: SDVue['CarouselItem'];
28
29
  SdCascader: SDVue['Cascader'];
@@ -1,8 +1,12 @@
1
1
  import type { PropType } from 'vue';
2
- import type { FilePreviewerContentSlotProps, FilePreviewerImageProps, FilePreviewerMediaProps, FilePreviewerPdfProps, FilePreviewerType } from './types';
2
+ import type { FilePreviewerContentSlotProps, FilePreviewerImageProps, FilePreviewerImageSlotProps, FilePreviewerMediaProps, FilePreviewerMediaSlotProps, FilePreviewerPdfProps, FilePreviewerPdfSlotProps, FilePreviewerType } from './types';
3
3
  type __VLS_Slots = {
4
4
  title?: () => unknown;
5
5
  content?: (_props: FilePreviewerContentSlotProps) => unknown;
6
+ image?: (_props: FilePreviewerImageSlotProps) => unknown;
7
+ video?: (_props: FilePreviewerMediaSlotProps) => unknown;
8
+ audio?: (_props: FilePreviewerMediaSlotProps) => unknown;
9
+ pdf?: (_props: FilePreviewerPdfSlotProps) => unknown;
6
10
  };
7
11
  declare function close(): void;
8
12
  declare function onPreviewLoad(): void;
@@ -9,7 +9,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
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
+ import { usePdfJs } from "./use-pdf-js.js";
13
+ import { Teleport, computed, createBlock, createCommentVNode, createElementBlock, createElementVNode, createVNode, defineComponent, guardReactiveProps, mergeProps, nextTick, normalizeClass, normalizeProps, normalizeStyle, onBeforeUnmount, openBlock, reactive, renderSlot, resolveDynamicComponent, shallowRef, toDisplayString, toRefs, unref, useSlots, watch, withCtx } from "vue";
13
14
  //#region components/file-previewer/file-previewer.vue?vue&type=script&setup=true&lang.ts
14
15
  var _hoisted_1 = ["tabindex"];
15
16
  var _hoisted_2 = [
@@ -17,6 +18,8 @@ var _hoisted_2 = [
17
18
  "aria-modal",
18
19
  "aria-label"
19
20
  ];
21
+ var _hoisted_3 = ["disabled"];
22
+ var _hoisted_4 = ["disabled"];
20
23
  var file_previewer_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ defineComponent(_objectSpread2(_objectSpread2({}, { name: "FilePreviewer" }), {}, {
21
24
  __name: "file-previewer",
22
25
  props: {
@@ -138,7 +141,7 @@ var file_previewer_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ d
138
141
  return (_visible$value = visible === null || visible === void 0 ? void 0 : visible.value) !== null && _visible$value !== void 0 ? _visible$value : localVisible.value;
139
142
  });
140
143
  const shouldRender = computed(() => !fullscreen.value || mergedVisible.value);
141
- const useImagePreview = computed(() => type.value === "image" && fullscreen.value && !slots.content);
144
+ const useImagePreview = computed(() => type.value === "image" && fullscreen.value && !slots.content && !slots.image);
142
145
  const container = usePopupContainer(document.body, reactive({ popupContainer }));
143
146
  const popupVisible = computed(() => fullscreen.value && mergedVisible.value);
144
147
  const { zIndex } = usePopupManager("dialog", { visible: popupVisible });
@@ -246,25 +249,87 @@ var file_previewer_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ d
246
249
  }
247
250
  });
248
251
  });
249
- const mergedPdfProps = computed(() => {
250
- var _pdfProps$value;
251
- const userProps = (_pdfProps$value = pdfProps === null || pdfProps === void 0 ? void 0 : pdfProps.value) !== null && _pdfProps$value !== void 0 ? _pdfProps$value : {};
252
- return _objectSpread2(_objectSpread2({ title: "PDF preview" }, userProps), {}, {
253
- src: currentSrc.value,
254
- onLoad: (event) => {
255
- callEventHandler(userProps.onLoad, event);
256
- onPreviewLoad();
257
- },
258
- onError: (event) => {
259
- callEventHandler(userProps.onError, event);
260
- onLoadError();
261
- }
262
- });
252
+ const { doc: pdfDoc, numPages: pdfNumPages, page: pdfCurrentPage, goto: pdfGoto, prev: pdfPrev, next: pdfNext, render: pdfRender, load: loadPdf, destroy: destroyPdf } = usePdfJs({
253
+ src: () => currentSrc.value,
254
+ pdfProps: () => pdfProps === null || pdfProps === void 0 ? void 0 : pdfProps.value,
255
+ onStatus: (next) => {
256
+ status.value = next;
257
+ }
258
+ });
259
+ const pdfCanvasRef = shallowRef();
260
+ const hasTypeSlot = computed(() => {
261
+ switch (type.value) {
262
+ case "image": return !!slots.image;
263
+ case "video": return !!slots.video;
264
+ case "audio": return !!slots.audio;
265
+ case "pdf": return !!slots.pdf;
266
+ default: return false;
267
+ }
263
268
  });
269
+ const pdfSlotProps = computed(() => ({
270
+ src: currentSrc.value,
271
+ status: status.value,
272
+ loading: isLoading.value,
273
+ loaded: isLoaded.value,
274
+ error: isError.value,
275
+ doc: pdfDoc.value,
276
+ page: pdfCurrentPage.value,
277
+ numPages: pdfNumPages.value,
278
+ goto: pdfGoto,
279
+ prev: pdfPrev,
280
+ next: pdfNext,
281
+ render: pdfRender,
282
+ close,
283
+ onLoad: onPreviewLoad,
284
+ onError: onLoadError
285
+ }));
286
+ const mediaSlotProps = computed(() => ({
287
+ src: currentSrc.value,
288
+ status: status.value,
289
+ loading: isLoading.value,
290
+ loaded: isLoaded.value,
291
+ error: isError.value,
292
+ skin: mediaSkin.value,
293
+ useVideoJs: useVideoJsMediaSkin.value,
294
+ playerProps: mediaPlayerProps.value,
295
+ skinProps: mediaSkinProps.value,
296
+ close,
297
+ onLoad: onPreviewLoad,
298
+ onError: onLoadError
299
+ }));
300
+ const imageSlotProps = computed(() => ({
301
+ src: currentSrc.value,
302
+ status: status.value,
303
+ loading: isLoading.value,
304
+ loaded: isLoaded.value,
305
+ error: isError.value,
306
+ imageProps: mergedImageProps.value,
307
+ close,
308
+ onLoad: onPreviewLoad,
309
+ onError: onLoadError
310
+ }));
264
311
  usePopupOverflowHidden(reactive({
265
312
  container,
266
313
  hidden: popupVisible
267
314
  }));
315
+ watch([
316
+ pdfDoc,
317
+ pdfCurrentPage,
318
+ () => {
319
+ var _pdfProps$value;
320
+ return pdfProps === null || pdfProps === void 0 || (_pdfProps$value = pdfProps.value) === null || _pdfProps$value === void 0 ? void 0 : _pdfProps$value.scale;
321
+ },
322
+ () => {
323
+ var _pdfProps$value2;
324
+ return pdfProps === null || pdfProps === void 0 || (_pdfProps$value2 = pdfProps.value) === null || _pdfProps$value2 === void 0 ? void 0 : _pdfProps$value2.rotation;
325
+ }
326
+ ], () => {
327
+ if (!pdfDoc.value || !pdfCanvasRef.value) return;
328
+ pdfRender(pdfCanvasRef.value, pdfCurrentPage.value);
329
+ }, { flush: "post" });
330
+ onBeforeUnmount(() => {
331
+ destroyPdf();
332
+ });
268
333
  function resetPreviewState() {
269
334
  status.value = "beforeLoad";
270
335
  }
@@ -359,15 +424,23 @@ var file_previewer_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ d
359
424
  return;
360
425
  }
361
426
  const currentRequestId = requestId.value;
427
+ if (type.value === "pdf") {
428
+ loadPdf();
429
+ return;
430
+ }
362
431
  if (type.value === "video" || type.value === "audio") {
363
432
  if (useVideoJsMediaSkin.value) {
364
433
  prepareMedia(currentRequestId);
365
434
  return;
366
435
  }
436
+ if (hasTypeSlot.value) {
437
+ status.value = "loaded";
438
+ return;
439
+ }
367
440
  status.value = "loading";
368
441
  return;
369
442
  }
370
- if (type.value === "pdf") {
443
+ if (hasTypeSlot.value) {
371
444
  status.value = "loaded";
372
445
  return;
373
446
  }
@@ -412,22 +485,45 @@ var file_previewer_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ d
412
485
  }, [unref(title) || _ctx.$slots.title ? (openBlock(), createElementBlock("header", {
413
486
  key: 0,
414
487
  class: normalizeClass(`${unref(prefixCls)}-header`)
415
- }, [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` }), {
488
+ }, [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" ? renderSlot(_ctx.$slots, "image", normalizeProps(mergeProps({ key: 0 }, imageSlotProps.value)), () => [(openBlock(), createBlock(unref(Image), mergeProps({ key: currentSrc.value + "image" }, mergedImageProps.value, { class: `${unref(prefixCls)}-image` }), null, 16, ["class"]))]) : unref(type) === "video" ? renderSlot(_ctx.$slots, "video", normalizeProps(mergeProps({ key: 1 }, mediaSlotProps.value)), () => [useVideoJsMediaSkin.value ? (openBlock(), createBlock(resolveDynamicComponent(mediaPlayerTag.value), mergeProps({ key: 0 }, mediaPlayerProps.value, { class: `${unref(prefixCls)}-video-player` }), {
416
489
  default: withCtx(() => [(openBlock(), createBlock(resolveDynamicComponent(mediaSkinTag.value), mergeProps(mediaSkinProps.value, { class: mediaSkinClassNames.value }), {
417
490
  default: withCtx(() => [(openBlock(), createElementBlock("video", mergeProps({ key: currentSrc.value + "video" }, mergedMediaProps.value, { class: `${unref(prefixCls)}-video` }), null, 16))]),
418
491
  _: 1
419
492
  }, 16, ["class"]))]),
420
493
  _: 1
421
- }, 16, ["class"])) : (openBlock(), createElementBlock("video", mergeProps({ key: currentSrc.value }, mergedMediaProps.value, { class: `${unref(prefixCls)}-video` }), null, 16))], 64)) : unref(type) === "audio" ? (openBlock(), createElementBlock("div", {
494
+ }, 16, ["class"])) : (openBlock(), createElementBlock("video", mergeProps({ key: currentSrc.value }, mergedMediaProps.value, { class: `${unref(prefixCls)}-video` }), null, 16))]) : unref(type) === "audio" ? (openBlock(), createElementBlock("div", {
422
495
  key: 2,
423
496
  class: normalizeClass(`${unref(prefixCls)}-audio-panel`)
424
- }, [useVideoJsMediaSkin.value ? (openBlock(), createBlock(resolveDynamicComponent(mediaPlayerTag.value), mergeProps({ key: 0 }, mediaPlayerProps.value, { class: `${unref(prefixCls)}-audio-player` }), {
497
+ }, [renderSlot(_ctx.$slots, "audio", normalizeProps(guardReactiveProps(mediaSlotProps.value)), () => [useVideoJsMediaSkin.value ? (openBlock(), createBlock(resolveDynamicComponent(mediaPlayerTag.value), mergeProps({ key: 0 }, mediaPlayerProps.value, { class: `${unref(prefixCls)}-audio-player` }), {
425
498
  default: withCtx(() => [(openBlock(), createBlock(resolveDynamicComponent(mediaSkinTag.value), mergeProps(mediaSkinProps.value, { class: mediaSkinClassNames.value }), {
426
499
  default: withCtx(() => [(openBlock(), createElementBlock("audio", mergeProps({ key: currentSrc.value + "audio" }, mergedMediaProps.value, { class: `${unref(prefixCls)}-audio` }), null, 16))]),
427
500
  _: 1
428
501
  }, 16, ["class"]))]),
429
502
  _: 1
430
- }, 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),
503
+ }, 16, ["class"])) : (openBlock(), createElementBlock("audio", mergeProps({ key: currentSrc.value + "audio" }, mergedMediaProps.value, { class: `${unref(prefixCls)}-audio` }), null, 16))])], 2)) : unref(type) === "pdf" ? renderSlot(_ctx.$slots, "pdf", normalizeProps(mergeProps({ key: 3 }, pdfSlotProps.value)), () => [createElementVNode("div", { class: normalizeClass(`${unref(prefixCls)}-pdf`) }, [createElementVNode("div", { class: normalizeClass(`${unref(prefixCls)}-pdf-canvas-wrap`) }, [createElementVNode("canvas", {
504
+ ref_key: "pdfCanvasRef",
505
+ ref: pdfCanvasRef,
506
+ class: normalizeClass(`${unref(prefixCls)}-pdf-canvas`)
507
+ }, null, 2)], 2), unref(pdfNumPages) > 1 ? (openBlock(), createElementBlock("div", {
508
+ key: 0,
509
+ class: normalizeClass(`${unref(prefixCls)}-pdf-toolbar`)
510
+ }, [
511
+ createElementVNode("button", {
512
+ type: "button",
513
+ class: normalizeClass(`${unref(prefixCls)}-pdf-btn`),
514
+ disabled: unref(pdfCurrentPage) <= 1,
515
+ "aria-label": "上一页",
516
+ onClick: _cache[0] || (_cache[0] = (...args) => unref(pdfPrev) && unref(pdfPrev)(...args))
517
+ }, " ‹ ", 10, _hoisted_3),
518
+ createElementVNode("span", { class: normalizeClass(`${unref(prefixCls)}-pdf-page`) }, toDisplayString(unref(pdfCurrentPage)) + " / " + toDisplayString(unref(pdfNumPages)), 3),
519
+ createElementVNode("button", {
520
+ type: "button",
521
+ class: normalizeClass(`${unref(prefixCls)}-pdf-btn`),
522
+ disabled: unref(pdfCurrentPage) >= unref(pdfNumPages),
523
+ "aria-label": "下一页",
524
+ onClick: _cache[1] || (_cache[1] = (...args) => unref(pdfNext) && unref(pdfNext)(...args))
525
+ }, " › ", 10, _hoisted_4)
526
+ ], 2)) : createCommentVNode("", true)], 2)]) : createCommentVNode("", true)])], 2)], 10, _hoisted_2),
431
527
  unref(fullscreen) && unref(closable) ? (openBlock(), createElementBlock("button", {
432
528
  key: 1,
433
529
  type: "button",
@@ -80,7 +80,20 @@ declare const FilePreviewer: {
80
80
  }>;
81
81
  };
82
82
  pdfProps: {
83
- type: import("vue").PropType<import("./types").FilePreviewerPdfProps>;
83
+ type: import("vue").PropType<{
84
+ [x: string]: unknown;
85
+ [x: number]: unknown;
86
+ [x: symbol]: unknown;
87
+ worker?: boolean | undefined;
88
+ workerSrc?: string | undefined;
89
+ workerPort?: Worker | undefined;
90
+ scale?: number | undefined;
91
+ rotation?: import("./types").FilePreviewerPdfRotation | undefined;
92
+ page?: number | undefined;
93
+ documentParams?: import("type-fest").UnknownRecord | undefined;
94
+ renderParams?: import("type-fest").UnknownRecord | undefined;
95
+ onDocumentLoad?: ((doc: import("pdfjs-dist").PDFDocumentProxy) => void) | undefined;
96
+ }>;
84
97
  };
85
98
  }>> & Readonly<{
86
99
  onClose?: (() => any) | undefined;
@@ -191,7 +204,20 @@ declare const FilePreviewer: {
191
204
  }>;
192
205
  };
193
206
  pdfProps: {
194
- type: import("vue").PropType<import("./types").FilePreviewerPdfProps>;
207
+ type: import("vue").PropType<{
208
+ [x: string]: unknown;
209
+ [x: number]: unknown;
210
+ [x: symbol]: unknown;
211
+ worker?: boolean | undefined;
212
+ workerSrc?: string | undefined;
213
+ workerPort?: Worker | undefined;
214
+ scale?: number | undefined;
215
+ rotation?: import("./types").FilePreviewerPdfRotation | undefined;
216
+ page?: number | undefined;
217
+ documentParams?: import("type-fest").UnknownRecord | undefined;
218
+ renderParams?: import("type-fest").UnknownRecord | undefined;
219
+ onDocumentLoad?: ((doc: import("pdfjs-dist").PDFDocumentProxy) => void) | undefined;
220
+ }>;
195
221
  };
196
222
  }>> & Readonly<{
197
223
  onClose?: (() => any) | undefined;
@@ -296,10 +322,14 @@ declare const FilePreviewer: {
296
322
  $slots: {
297
323
  title?: () => unknown;
298
324
  content?: (_props: import("./types").FilePreviewerContentSlotProps) => unknown;
325
+ image?: (_props: import("./types").FilePreviewerImageSlotProps) => unknown;
326
+ video?: (_props: import("./types").FilePreviewerMediaSlotProps) => unknown;
327
+ audio?: (_props: import("./types").FilePreviewerMediaSlotProps) => unknown;
328
+ pdf?: (_props: import("./types").FilePreviewerPdfSlotProps) => unknown;
299
329
  };
300
330
  }) & {
301
331
  install: (app: App, options?: SDOptions) => void;
302
332
  };
303
333
  export type FilePreviewerInstance = InstanceType<typeof _FilePreviewer>;
304
- export type { FilePreviewerContentSlotProps, FilePreviewerImageProps, FilePreviewerMediaProps, FilePreviewerMediaSkin, FilePreviewerPdfProps, FilePreviewerProps, FilePreviewerStatus, FilePreviewerType, } from './types';
334
+ export type { FilePreviewerContentSlotProps, FilePreviewerImageProps, FilePreviewerImageSlotProps, FilePreviewerMediaProps, FilePreviewerMediaSkin, FilePreviewerMediaSlotProps, FilePreviewerPdfProps, FilePreviewerPdfRotation, FilePreviewerPdfSlotProps, FilePreviewerProps, FilePreviewerStatus, FilePreviewerType, } from './types';
305
335
  export default FilePreviewer;
@@ -0,0 +1,2 @@
1
+ declare const _default: string;
2
+ export default _default;
@@ -0,0 +1,4 @@
1
+ //#region components/file-previewer/pdfjs-worker-url.ts
2
+ var pdfjs_worker_url_default = new URL("./pdfjs-worker.min.mjs", import.meta.url).href;
3
+ //#endregion
4
+ export { pdfjs_worker_url_default as default };