@lazycatcloud/vue-media-preview 0.0.0-stage → 0.1.1

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 (43) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +109 -2
  3. package/dist/components/MediaPreview.vue.d.ts +171 -0
  4. package/dist/components/PreviewStage.vue.d.ts +147 -0
  5. package/dist/components/VirtualTimeline.vue.d.ts +42 -0
  6. package/dist/components/video/VideoControls.vue.d.ts +21 -0
  7. package/dist/components/video/VideoIcon.vue.d.ts +14 -0
  8. package/dist/core/errors.d.ts +1 -0
  9. package/dist/core/gestures/edgePaging.d.ts +5 -0
  10. package/dist/core/gestures/pointerGesture.d.ts +5 -0
  11. package/dist/core/gestures/pressHold.d.ts +5 -0
  12. package/dist/core/gestures/wheelZoom.d.ts +2 -0
  13. package/dist/core/math.d.ts +11 -0
  14. package/dist/core/resources/imageLimits.d.ts +11 -0
  15. package/dist/core/resources/imagePolicy.d.ts +14 -0
  16. package/dist/core/resources/imageRequest.d.ts +15 -0
  17. package/dist/core/resources/imageStore.d.ts +30 -0
  18. package/dist/core/resources/imageTransport.d.ts +9 -0
  19. package/dist/core/resources/initialImage.d.ts +11 -0
  20. package/dist/core/resources/usePreviewResources.d.ts +13 -0
  21. package/dist/core/timeline/layout.d.ts +28 -0
  22. package/dist/core/transition/anchor.d.ts +12 -0
  23. package/dist/core/transition/geometry.d.ts +27 -0
  24. package/dist/core/transition/rect.d.ts +2 -0
  25. package/dist/core/transition/sharedTransition.d.ts +12 -0
  26. package/dist/core/transition/sourceViewport.d.ts +3 -0
  27. package/dist/core/types.d.ts +69 -0
  28. package/dist/core/usePreviewPager.d.ts +26 -0
  29. package/dist/core/usePreviewViewport.d.ts +29 -0
  30. package/dist/core/video/captureVideoFrame.d.ts +3 -0
  31. package/dist/core/video/useVideoPlayback.d.ts +46 -0
  32. package/dist/core/video/useVideoSource.d.ts +5 -0
  33. package/dist/index.d.ts +17 -0
  34. package/dist/renderers/ImageCanvasRenderer.vue.d.ts +71 -0
  35. package/dist/renderers/LivePhotoRenderer.vue.d.ts +94 -0
  36. package/dist/renderers/VideoDomRenderer.vue.d.ts +166 -0
  37. package/dist/vue-media-preview.cjs +1 -0
  38. package/dist/vue-media-preview.css +1 -0
  39. package/dist/vue-media-preview.js +2403 -0
  40. package/docs/testing.md +141 -0
  41. package/docs/ui-alignment.md +44 -0
  42. package/docs/vue-media-preview.md +193 -0
  43. package/package.json +71 -4
@@ -0,0 +1,11 @@
1
+ import type { PreviewAnchor } from "../types";
2
+ export type InitialImage = {
3
+ kind: "empty";
4
+ } | {
5
+ kind: "image";
6
+ image: HTMLImageElement;
7
+ };
8
+ export declare const emptyInitialImage: InitialImage;
9
+ /** Reuse pixels already displayed by the host; never wait for an image request here. */
10
+ export declare function initialImageFromAnchor(anchor: PreviewAnchor): InitialImage;
11
+ export declare function openingPlaceholder(): HTMLCanvasElement;
@@ -0,0 +1,13 @@
1
+ import type { OriginalStatus } from "./imagePolicy";
2
+ import type { PreviewMedia } from "../types";
3
+ /** Resource state for the selected page, independent of transition and gesture ownership. */
4
+ export declare function usePreviewResources(current: () => PreviewMedia, onOriginalState: (media: PreviewMedia, status: OriginalStatus, reason: string) => void): {
5
+ originalIds: import("vue").Ref<Set<string> & Omit<Set<string>, keyof Set<any>>>;
6
+ originalStatus: import("vue").Ref<OriginalStatus>;
7
+ originalReason: import("vue").Ref<string>;
8
+ originalRequest: import("vue").Ref<number>;
9
+ readyId: import("vue").Ref<string>;
10
+ reset: () => void;
11
+ requestOriginal: () => void;
12
+ updateOriginal: (status: OriginalStatus, reason: string) => void;
13
+ };
@@ -0,0 +1,28 @@
1
+ import type { PreviewAnchor } from "../types";
2
+ export interface VirtualTimelineHandle {
3
+ resolveAnchor(id: string): Promise<PreviewAnchor>;
4
+ readonly rendered: number;
5
+ readonly total: number;
6
+ }
7
+ export interface TimelineGroup<T> {
8
+ key: string;
9
+ items: T[];
10
+ }
11
+ export type TimelineRow = {
12
+ kind: "header" | "items";
13
+ group: number;
14
+ first: number;
15
+ count: number;
16
+ start: number;
17
+ end: number;
18
+ };
19
+ export declare function timelineLayout<T extends {
20
+ id: string;
21
+ }>(groups: TimelineGroup<T>[], width: number, columns: number, gap?: number): {
22
+ rows: TimelineRow[];
23
+ locations: Map<string, number>;
24
+ height: number;
25
+ size: number;
26
+ total: number;
27
+ };
28
+ export declare function rowAt(rows: TimelineRow[], position: number): number;
@@ -0,0 +1,12 @@
1
+ import type { PreviewAnchor, PreviewSize } from "../types";
2
+ import { type PictureFrame, type Rect } from "./geometry";
3
+ export type TransitionAnchor = {
4
+ kind: "unavailable";
5
+ } | {
6
+ kind: "element";
7
+ element: HTMLElement;
8
+ frame: PictureFrame;
9
+ viewport: Rect;
10
+ };
11
+ /** Clip only the thumbnail endpoint; the shared window grows into the full preview. */
12
+ export declare function prepareTransitionAnchor(anchor: PreviewAnchor, media: PreviewSize, viewport: Rect): TransitionAnchor;
@@ -0,0 +1,27 @@
1
+ import type { PreviewSize } from "../types";
2
+ export interface Rect {
3
+ left: number;
4
+ top: number;
5
+ width: number;
6
+ height: number;
7
+ }
8
+ export interface PictureFrame {
9
+ x: number;
10
+ y: number;
11
+ width: number;
12
+ height: number;
13
+ rotation: number;
14
+ clip: Rect;
15
+ radius: number;
16
+ }
17
+ export declare function fitFrame(media: PreviewSize, rect: Rect, fit: "cover" | "contain"): PictureFrame;
18
+ export declare function interpolateFrame(a: PictureFrame, b: PictureFrame, t: number): PictureFrame;
19
+ /** Fixed layout bounds: both crop and picture animate through compositor transforms. */
20
+ export declare function transitionKeyframes(from: PictureFrame, to: PictureFrame, viewport: Rect, canvasSize: PreviewSize, entering: boolean): {
21
+ pictures: Keyframe[];
22
+ masks: Keyframe[];
23
+ maskSize: {
24
+ width: number;
25
+ height: number;
26
+ };
27
+ };
@@ -0,0 +1,2 @@
1
+ import type { Rect } from "./geometry";
2
+ export declare function intersectRects(a: Rect, b: Rect): Rect;
@@ -0,0 +1,12 @@
1
+ import type { PictureFrame, Rect } from "./geometry";
2
+ /** Hold one texture throughout motion; resource upgrades belong to the settled page. */
3
+ export declare function createSharedTransition(): {
4
+ play: (canvas: HTMLCanvasElement, mask: HTMLElement, image: CanvasImageSource, from: PictureFrame, to: PictureFrame, viewport: Rect, backdrop: HTMLElement, entering: boolean, startOpacity?: number, durationMs?: number) => Promise<void>;
5
+ cancel: () => void;
6
+ reverseOpening: () => {
7
+ kind: "inactive";
8
+ } | {
9
+ kind: "reversing";
10
+ finished: Promise<void>;
11
+ };
12
+ };
@@ -0,0 +1,3 @@
1
+ import type { Rect } from "./geometry";
2
+ /** Resolve the visible list region used to clip the thumbnail endpoint. */
3
+ export declare function sourceViewport(element: HTMLElement, viewport: Rect): Rect;
@@ -0,0 +1,69 @@
1
+ import type { CSSProperties, ComputedRef, Ref, ShallowRef } from "vue";
2
+ export type PreviewMediaType = "image" | "video" | "live-photo";
3
+ export type LivePhotoStatus = "loading" | "idle" | "playing" | "error";
4
+ export interface PreviewMedia {
5
+ id: string;
6
+ type: PreviewMediaType;
7
+ title: string;
8
+ src: string;
9
+ /** Uncropped, screen-sized resource. Keep its aspect ratio identical to src. */
10
+ previewSrc: string;
11
+ poster?: string;
12
+ videoSrc?: string;
13
+ width: number;
14
+ height: number;
15
+ thumbnail: string;
16
+ }
17
+ export type PreviewAnchor = {
18
+ kind: "element";
19
+ element: HTMLElement;
20
+ } | {
21
+ kind: "unavailable";
22
+ };
23
+ export type PreviewPhase = "closed" | "opening" | "open" | "closing";
24
+ export interface PreviewPoint {
25
+ x: number;
26
+ y: number;
27
+ }
28
+ export interface PreviewSize {
29
+ width: number;
30
+ height: number;
31
+ }
32
+ export type PreviewRotation = 0 | 90 | 180 | 270;
33
+ export type PreviewDirection = "" | "vertical" | "horizontal";
34
+ export interface PreviewViewportState {
35
+ level: number;
36
+ offsetX: number;
37
+ offsetY: number;
38
+ rotation: PreviewRotation;
39
+ zooming: boolean;
40
+ draggingDown: boolean;
41
+ downOffsetX: number;
42
+ downOffsetY: number;
43
+ downScale: number;
44
+ }
45
+ export interface PreviewViewportCore {
46
+ state: PreviewViewportState;
47
+ /** Resource upgrades wait until pointer interaction and transform animation settle. */
48
+ motionActive: ComputedRef<boolean>;
49
+ containerRef: Ref<HTMLElement | undefined>;
50
+ canvasRef: Ref<HTMLCanvasElement | undefined>;
51
+ mediaRef: ShallowRef<HTMLImageElement | HTMLVideoElement | undefined>;
52
+ viewportSize: Ref<PreviewSize>;
53
+ mediaSize: Ref<PreviewSize>;
54
+ visualMediaSize: ComputedRef<PreviewSize>;
55
+ displaySize: ComputedRef<PreviewSize>;
56
+ displayScale: ComputedRef<number>;
57
+ downDragStyle: ComputedRef<CSSProperties>;
58
+ setMediaElement: (el: HTMLImageElement | HTMLVideoElement) => void;
59
+ setMediaSize: (size: PreviewSize) => void;
60
+ clearMedia: () => void;
61
+ renderNow: () => void;
62
+ requestRender: () => void;
63
+ registerRenderHandler: (handler: () => void) => () => void;
64
+ zoomTo: (level: number, center?: PreviewPoint, animate?: boolean) => void;
65
+ setRotation: (rotation: PreviewRotation, reset?: boolean) => void;
66
+ rotateBy: (delta?: number) => void;
67
+ resetTransform: (duration?: number) => void;
68
+ cancelGesture: (preserveVisual?: boolean) => void;
69
+ }
@@ -0,0 +1,26 @@
1
+ interface PagerOptions {
2
+ readOffset: () => number;
3
+ flushLayout: () => void;
4
+ }
5
+ export declare function usePreviewPager(count: () => number, width: () => number, change: (index: number) => void, options?: Partial<PagerOptions>): {
6
+ index: import("vue").Ref<number>;
7
+ state: {
8
+ offset: number;
9
+ dragging: boolean;
10
+ settling: boolean;
11
+ preparing: boolean;
12
+ grabbed: boolean;
13
+ duration: number;
14
+ };
15
+ slots: import("vue").ComputedRef<number[]>;
16
+ stride: () => number;
17
+ drag: (offset: number) => void;
18
+ release: (_offset: number, velocity: number) => void;
19
+ go: (delta: number) => void;
20
+ grab: () => void;
21
+ resume: () => void;
22
+ reset: (next: number) => void;
23
+ rebase: (next: number) => void;
24
+ cancel: () => void;
25
+ };
26
+ export {};
@@ -0,0 +1,29 @@
1
+ import type { PreviewViewportCore } from "./types";
2
+ interface Options {
3
+ motionActive?: () => boolean;
4
+ onTap?: () => void;
5
+ onDoubleTap?: () => void;
6
+ onScale?: (level: number) => void;
7
+ onSwipeDownProgress?: (progress: number) => void;
8
+ onSwipeDownClose?: () => void;
9
+ onSwipeLeft?: () => void;
10
+ onSwipeRight?: () => void;
11
+ onPageDrag?: (offset: number) => void;
12
+ onPageRelease?: (offset: number, velocity: number) => void;
13
+ interactive?: () => boolean;
14
+ zoomable?: () => boolean;
15
+ doubleTapZoom?: () => number;
16
+ zoomLimit?: () => number;
17
+ holdable?: () => boolean;
18
+ onHoldStart?: () => void;
19
+ onHoldEnd?: () => void;
20
+ }
21
+ export declare function usePreviewViewport(options?: Options): {
22
+ core: PreviewViewportCore;
23
+ onPointerDown: (event: PointerEvent, origin?: DOMRect) => boolean;
24
+ onPointerMove: (event: PointerEvent) => void;
25
+ onPointerUp: (event: PointerEvent) => void;
26
+ onPointerCancel: (event: PointerEvent) => void;
27
+ onWheel: (event: WheelEvent) => void;
28
+ };
29
+ export {};
@@ -0,0 +1,3 @@
1
+ import type { PreviewSize } from "../types";
2
+ /** Snapshot the native player's object-fit:contain pixels before pausing or detaching it. */
3
+ export declare function captureVideoFrame(video: HTMLVideoElement, size: PreviewSize): HTMLCanvasElement;
@@ -0,0 +1,46 @@
1
+ export declare function formatVideoTime(seconds: number): string;
2
+ /** Playback owns media state; the preview still owns navigation and transitions. */
3
+ export declare function useVideoPlayback(video: () => HTMLVideoElement, reportError: (error: Error) => void): {
4
+ state: {
5
+ playing: boolean;
6
+ buffering: boolean;
7
+ duration: number;
8
+ time: number;
9
+ buffered: number;
10
+ muted: boolean;
11
+ ended: boolean;
12
+ scrubbing: boolean;
13
+ scrubTime: number;
14
+ status: "loading" | "ready" | "error";
15
+ };
16
+ seekable: import("vue").ComputedRef<boolean>;
17
+ displayTime: import("vue").ComputedRef<number>;
18
+ progress: import("vue").ComputedRef<number>;
19
+ bufferedProgress: import("vue").ComputedRef<number>;
20
+ events: {
21
+ loadedmetadata: () => void;
22
+ durationchange: () => void;
23
+ timeupdate: () => void;
24
+ progress: () => void;
25
+ loadeddata: () => void;
26
+ canplay: () => void;
27
+ play: () => void;
28
+ playing: () => void;
29
+ pause: () => void;
30
+ ended: () => void;
31
+ waiting: () => void;
32
+ seeking: () => void;
33
+ seeked: () => void;
34
+ volumechange: () => void;
35
+ error: () => void;
36
+ };
37
+ play: () => Promise<void>;
38
+ pause: () => void;
39
+ toggle: () => void;
40
+ beginScrub: () => void;
41
+ scrub: (time: number) => void;
42
+ endScrub: (commit?: boolean) => void;
43
+ toggleMuted: () => void;
44
+ retry: () => void;
45
+ dispose: () => void;
46
+ };
@@ -0,0 +1,5 @@
1
+ import type { PreviewMedia } from "../types";
2
+ /** A host can attach its own streaming transport without coupling the renderer to it. */
3
+ export type VideoSourceLoader = (video: HTMLVideoElement, media: PreviewMedia, reportError: (error: Error) => void) => () => void;
4
+ export declare const nativeVideoSource: VideoSourceLoader;
5
+ export declare function useVideoSource(video: () => HTMLVideoElement, media: () => PreviewMedia, enabled: () => boolean, loader: () => VideoSourceLoader, reportError: (error: Error) => void): () => number;
@@ -0,0 +1,17 @@
1
+ import "./styles/album.css";
2
+ export { default as MediaPreview } from "./components/MediaPreview.vue";
3
+ export { default as PreviewStage } from "./components/PreviewStage.vue";
4
+ export { default as ImageCanvasRenderer } from "./renderers/ImageCanvasRenderer.vue";
5
+ export { default as VideoDomRenderer } from "./renderers/VideoDomRenderer.vue";
6
+ export { default as LivePhotoRenderer } from "./renderers/LivePhotoRenderer.vue";
7
+ export { usePreviewViewport } from "./core/usePreviewViewport";
8
+ export { formatVideoTime } from "./core/video/useVideoPlayback";
9
+ export type { PreviewAnchor, PreviewPhase, PreviewMedia, PreviewMediaType, PreviewViewportCore, LivePhotoStatus, } from "./core/types";
10
+ export type { InitialImage } from "./core/resources/initialImage";
11
+ export { default as VirtualTimeline } from "./components/VirtualTimeline.vue";
12
+ export { defaultImagePolicy, defaultImageSource } from "./core/resources/imagePolicy";
13
+ export type { ImagePolicy, ImageSourceResolver, ImageQuality, OriginalStatus, } from "./core/resources/imagePolicy";
14
+ export { previewImageStore, ImageStore } from "./core/resources/imageStore";
15
+ export type { TimelineGroup, VirtualTimelineHandle } from "./core/timeline/layout";
16
+ export { nativeVideoSource } from "./core/video/useVideoSource";
17
+ export type { VideoSourceLoader } from "./core/video/useVideoSource";
@@ -0,0 +1,71 @@
1
+ import type { InitialImage } from "../core/resources/initialImage";
2
+ import type { ImagePolicy, ImageQuality, ImageSourceResolver, OriginalStatus } from "../core/resources/imagePolicy";
3
+ import type { PreviewMedia, PreviewViewportCore } from "../core/types";
4
+ type __VLS_Props = {
5
+ media: PreviewMedia;
6
+ core: PreviewViewportCore;
7
+ quality?: ImageQuality;
8
+ rendering?: boolean;
9
+ requestVersion?: number;
10
+ loadEnabled?: boolean;
11
+ priority?: number;
12
+ resourcePolicy?: ImagePolicy;
13
+ resolveSource?: ImageSourceResolver;
14
+ initialImage?: InitialImage;
15
+ };
16
+ declare const __VLS_export: import("vue").DefineComponent<__VLS_WithDefaults<__VLS_TypePropsToOption<__VLS_Props>, {
17
+ quality: string;
18
+ initialImage: () => InitialImage;
19
+ rendering: boolean;
20
+ loadEnabled: boolean;
21
+ requestVersion: number;
22
+ priority: number;
23
+ resourcePolicy: () => ImagePolicy;
24
+ resolveSource: ImageSourceResolver;
25
+ }>, unknown, unknown, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {
26
+ error: (error: Error) => void;
27
+ ready: (quality: "thumbnail" | "screen" | "full") => void;
28
+ originalState: (status: OriginalStatus, reason: string) => void;
29
+ }, string, import("vue").PublicProps, Readonly<import("vue").ExtractPropTypes<__VLS_WithDefaults<__VLS_TypePropsToOption<__VLS_Props>, {
30
+ quality: string;
31
+ initialImage: () => InitialImage;
32
+ rendering: boolean;
33
+ loadEnabled: boolean;
34
+ requestVersion: number;
35
+ priority: number;
36
+ resourcePolicy: () => ImagePolicy;
37
+ resolveSource: ImageSourceResolver;
38
+ }>>> & {
39
+ onError?: ((error: Error) => any) | undefined;
40
+ onReady?: ((quality: "thumbnail" | "screen" | "full") => any) | undefined;
41
+ onOriginalState?: ((status: OriginalStatus, reason: string) => any) | undefined;
42
+ }, {
43
+ quality: ImageQuality;
44
+ rendering: boolean;
45
+ requestVersion: number;
46
+ loadEnabled: boolean;
47
+ priority: number;
48
+ resourcePolicy: ImagePolicy;
49
+ resolveSource: ImageSourceResolver;
50
+ initialImage: InitialImage;
51
+ }, {}>;
52
+ declare const _default: typeof __VLS_export;
53
+ export default _default;
54
+ type __VLS_TypePropsToOption<T> = {
55
+ [K in keyof T]-?: {} extends Pick<T, K> ? {
56
+ type: import('vue').PropType<Required<T>[K]>;
57
+ } : {
58
+ type: import('vue').PropType<T[K]>;
59
+ required: true;
60
+ };
61
+ };
62
+ type __VLS_WithDefaults<P, D> = {
63
+ [K in keyof Pick<P, keyof P>]: K extends keyof D ? __VLS_PrettifyLocal<P[K] & {
64
+ default: D[K];
65
+ }> : P[K];
66
+ };
67
+ type __VLS_PrettifyLocal<T> = (T extends any ? {
68
+ [K in keyof T]: T[K];
69
+ } : {
70
+ [K in keyof T as K]: T[K];
71
+ }) & {};
@@ -0,0 +1,94 @@
1
+ import type { ImagePolicy, ImageQuality, ImageSourceResolver, OriginalStatus } from "../core/resources/imagePolicy";
2
+ import type { InitialImage } from "../core/resources/initialImage";
3
+ import type { LivePhotoStatus, PreviewMedia, PreviewViewportCore } from "../core/types";
4
+ type __VLS_Props = {
5
+ media: PreviewMedia;
6
+ core: PreviewViewportCore;
7
+ playing?: boolean;
8
+ active?: boolean;
9
+ enabled?: boolean;
10
+ requestVersion?: number;
11
+ loadEnabled?: boolean;
12
+ priority?: number;
13
+ resourcePolicy?: ImagePolicy;
14
+ resolveSource?: ImageSourceResolver;
15
+ rendering?: boolean;
16
+ initialImage?: InitialImage;
17
+ quality?: ImageQuality;
18
+ };
19
+ /** Freeze the actual cover/video blend and scale before the closing phase stops playback. */
20
+ declare function captureFrame(): {
21
+ image: HTMLCanvasElement;
22
+ scale: number;
23
+ };
24
+ declare const __VLS_export: import("vue").DefineComponent<__VLS_WithDefaults<__VLS_TypePropsToOption<__VLS_Props>, {
25
+ playing: boolean;
26
+ active: boolean;
27
+ enabled: boolean;
28
+ quality: string;
29
+ initialImage: () => InitialImage;
30
+ rendering: boolean;
31
+ loadEnabled: boolean;
32
+ requestVersion: number;
33
+ priority: number;
34
+ resourcePolicy: () => ImagePolicy;
35
+ resolveSource: ImageSourceResolver;
36
+ }>, {
37
+ captureFrame: typeof captureFrame;
38
+ }, unknown, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {
39
+ error: (error: Error) => void;
40
+ ready: (quality: "thumbnail" | "screen" | "full") => void;
41
+ originalState: (status: OriginalStatus, reason: string) => void;
42
+ liveState: (status: LivePhotoStatus) => void;
43
+ liveEnded: () => void;
44
+ }, string, import("vue").PublicProps, Readonly<import("vue").ExtractPropTypes<__VLS_WithDefaults<__VLS_TypePropsToOption<__VLS_Props>, {
45
+ playing: boolean;
46
+ active: boolean;
47
+ enabled: boolean;
48
+ quality: string;
49
+ initialImage: () => InitialImage;
50
+ rendering: boolean;
51
+ loadEnabled: boolean;
52
+ requestVersion: number;
53
+ priority: number;
54
+ resourcePolicy: () => ImagePolicy;
55
+ resolveSource: ImageSourceResolver;
56
+ }>>> & {
57
+ onError?: ((error: Error) => any) | undefined;
58
+ onReady?: ((quality: "thumbnail" | "screen" | "full") => any) | undefined;
59
+ onOriginalState?: ((status: OriginalStatus, reason: string) => any) | undefined;
60
+ onLiveState?: ((status: LivePhotoStatus) => any) | undefined;
61
+ onLiveEnded?: (() => any) | undefined;
62
+ }, {
63
+ playing: boolean;
64
+ active: boolean;
65
+ quality: ImageQuality;
66
+ rendering: boolean;
67
+ requestVersion: number;
68
+ loadEnabled: boolean;
69
+ priority: number;
70
+ resourcePolicy: ImagePolicy;
71
+ resolveSource: ImageSourceResolver;
72
+ initialImage: InitialImage;
73
+ enabled: boolean;
74
+ }, {}>;
75
+ declare const _default: typeof __VLS_export;
76
+ export default _default;
77
+ type __VLS_TypePropsToOption<T> = {
78
+ [K in keyof T]-?: {} extends Pick<T, K> ? {
79
+ type: import('vue').PropType<Required<T>[K]>;
80
+ } : {
81
+ type: import('vue').PropType<T[K]>;
82
+ required: true;
83
+ };
84
+ };
85
+ type __VLS_WithDefaults<P, D> = {
86
+ [K in keyof Pick<P, keyof P>]: K extends keyof D ? __VLS_PrettifyLocal<P[K] & {
87
+ default: D[K];
88
+ }> : P[K];
89
+ };
90
+ type __VLS_PrettifyLocal<T> = (T extends any ? {
91
+ [K in keyof T]: T[K];
92
+ } : {
93
+ [K in keyof T as K]: T[K];
94
+ }) & {};
@@ -0,0 +1,166 @@
1
+ import type { InitialImage } from "../core/resources/initialImage";
2
+ import type { ImagePolicy, ImageSourceResolver, OriginalStatus } from "../core/resources/imagePolicy";
3
+ import type { VideoSourceLoader } from "../core/video/useVideoSource";
4
+ import type { ImageQuality } from "../core/resources/imagePolicy";
5
+ import type { PreviewMedia, PreviewViewportCore } from "../core/types";
6
+ type __VLS_Props = {
7
+ initialImage?: InitialImage;
8
+ rendering?: boolean;
9
+ quality?: ImageQuality;
10
+ requestVersion?: number;
11
+ priority?: number;
12
+ resourcePolicy?: ImagePolicy;
13
+ resolveSource?: ImageSourceResolver;
14
+ media: PreviewMedia;
15
+ videoLoader?: VideoSourceLoader;
16
+ core: PreviewViewportCore;
17
+ active?: boolean;
18
+ enabled?: boolean;
19
+ autoplay?: boolean;
20
+ loadEnabled?: boolean;
21
+ muted?: boolean;
22
+ loop?: boolean;
23
+ controls?: boolean;
24
+ controlsVisible?: boolean;
25
+ teleportControls?: boolean;
26
+ controlsTarget?: string;
27
+ };
28
+ declare function toggleFullscreen(): Promise<void>;
29
+ declare function captureFrame(): {
30
+ image: HTMLCanvasElement | HTMLImageElement | HTMLVideoElement;
31
+ scale: number;
32
+ };
33
+ declare const __VLS_export: import("vue").DefineComponent<__VLS_WithDefaults<__VLS_TypePropsToOption<__VLS_Props>, {
34
+ initialImage: () => InitialImage;
35
+ rendering: boolean;
36
+ quality: string;
37
+ requestVersion: number;
38
+ priority: number;
39
+ resourcePolicy: () => ImagePolicy;
40
+ resolveSource: ImageSourceResolver;
41
+ videoLoader: VideoSourceLoader;
42
+ active: boolean;
43
+ enabled: boolean;
44
+ autoplay: boolean;
45
+ loadEnabled: boolean;
46
+ muted: boolean;
47
+ loop: boolean;
48
+ controls: boolean;
49
+ controlsVisible: boolean;
50
+ teleportControls: boolean;
51
+ controlsTarget: string;
52
+ }>, {
53
+ togglePlayback: () => void;
54
+ toggleFullscreen: typeof toggleFullscreen;
55
+ playback: {
56
+ state: {
57
+ playing: boolean;
58
+ buffering: boolean;
59
+ duration: number;
60
+ time: number;
61
+ buffered: number;
62
+ muted: boolean;
63
+ ended: boolean;
64
+ scrubbing: boolean;
65
+ scrubTime: number;
66
+ status: "loading" | "ready" | "error";
67
+ };
68
+ seekable: import("vue").ComputedRef<boolean>;
69
+ displayTime: import("vue").ComputedRef<number>;
70
+ progress: import("vue").ComputedRef<number>;
71
+ bufferedProgress: import("vue").ComputedRef<number>;
72
+ events: {
73
+ loadedmetadata: () => void;
74
+ durationchange: () => void;
75
+ timeupdate: () => void;
76
+ progress: () => void;
77
+ loadeddata: () => void;
78
+ canplay: () => void;
79
+ play: () => void;
80
+ playing: () => void;
81
+ pause: () => void;
82
+ ended: () => void;
83
+ waiting: () => void;
84
+ seeking: () => void;
85
+ seeked: () => void;
86
+ volumechange: () => void;
87
+ error: () => void;
88
+ };
89
+ play: () => Promise<void>;
90
+ pause: () => void;
91
+ toggle: () => void;
92
+ beginScrub: () => void;
93
+ scrub: (time: number) => void;
94
+ endScrub: (commit?: boolean) => void;
95
+ toggleMuted: () => void;
96
+ retry: () => void;
97
+ dispose: () => void;
98
+ };
99
+ captureFrame: typeof captureFrame;
100
+ }, unknown, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {
101
+ error: (error: Error) => void;
102
+ ready: (quality: "thumbnail" | "screen" | "full") => void;
103
+ originalState: (status: OriginalStatus, reason: string) => void;
104
+ }, string, import("vue").PublicProps, Readonly<import("vue").ExtractPropTypes<__VLS_WithDefaults<__VLS_TypePropsToOption<__VLS_Props>, {
105
+ initialImage: () => InitialImage;
106
+ rendering: boolean;
107
+ quality: string;
108
+ requestVersion: number;
109
+ priority: number;
110
+ resourcePolicy: () => ImagePolicy;
111
+ resolveSource: ImageSourceResolver;
112
+ videoLoader: VideoSourceLoader;
113
+ active: boolean;
114
+ enabled: boolean;
115
+ autoplay: boolean;
116
+ loadEnabled: boolean;
117
+ muted: boolean;
118
+ loop: boolean;
119
+ controls: boolean;
120
+ controlsVisible: boolean;
121
+ teleportControls: boolean;
122
+ controlsTarget: string;
123
+ }>>> & {
124
+ onError?: ((error: Error) => any) | undefined;
125
+ onReady?: ((quality: "thumbnail" | "screen" | "full") => any) | undefined;
126
+ onOriginalState?: ((status: OriginalStatus, reason: string) => any) | undefined;
127
+ }, {
128
+ active: boolean;
129
+ quality: ImageQuality;
130
+ rendering: boolean;
131
+ requestVersion: number;
132
+ loadEnabled: boolean;
133
+ priority: number;
134
+ resourcePolicy: ImagePolicy;
135
+ resolveSource: ImageSourceResolver;
136
+ initialImage: InitialImage;
137
+ muted: boolean;
138
+ enabled: boolean;
139
+ videoLoader: VideoSourceLoader;
140
+ autoplay: boolean;
141
+ loop: boolean;
142
+ controls: boolean;
143
+ controlsVisible: boolean;
144
+ teleportControls: boolean;
145
+ controlsTarget: string;
146
+ }, {}>;
147
+ declare const _default: typeof __VLS_export;
148
+ export default _default;
149
+ type __VLS_TypePropsToOption<T> = {
150
+ [K in keyof T]-?: {} extends Pick<T, K> ? {
151
+ type: import('vue').PropType<Required<T>[K]>;
152
+ } : {
153
+ type: import('vue').PropType<T[K]>;
154
+ required: true;
155
+ };
156
+ };
157
+ type __VLS_WithDefaults<P, D> = {
158
+ [K in keyof Pick<P, keyof P>]: K extends keyof D ? __VLS_PrettifyLocal<P[K] & {
159
+ default: D[K];
160
+ }> : P[K];
161
+ };
162
+ type __VLS_PrettifyLocal<T> = (T extends any ? {
163
+ [K in keyof T]: T[K];
164
+ } : {
165
+ [K in keyof T as K]: T[K];
166
+ }) & {};