vue-select-avatar
Version:
412 lines (411 loc) • 11.1 kB
TypeScript
import * as _$vue from "vue";
import { ComputedRef, Reactive, Ref } from "vue";
//#region lib/components/Viewport.vue.d.ts
declare var __VLS_1: {}, __VLS_3: {}, __VLS_5: {}, __VLS_7: {};
type __VLS_Slots = {} & {
'point-top-left'?: (props: typeof __VLS_1) => any;
} & {
'point-top-right'?: (props: typeof __VLS_3) => any;
} & {
'point-bottom-left'?: (props: typeof __VLS_5) => any;
} & {
'point-bottom-right'?: (props: typeof __VLS_7) => any;
};
declare const __VLS_base: _$vue.DefineComponent<ViewportProps, {
select: (options?: ImageSelectOptions) => Promise<void>;
crop: <T extends File | string = string | File>(options?: CropOptions) => Promise<T>;
positionInit: (res: ImageSelectResult) => void;
elEmitter: HTMLDivElement;
backing: _$vue.Ref<boolean, boolean>;
}, {}, {}, {}, _$vue.ComponentOptionsMixin, _$vue.ComponentOptionsMixin, {}, string, _$vue.PublicProps, Readonly<ViewportProps> & Readonly<{}>, {
size: number | "full";
width: number | "full";
height: number | "full";
info: ImageInfo;
view: number;
grid: boolean;
step: number;
ctrlStep: number;
shiftStep: number;
reverse: boolean;
minView: number;
padding: number;
arrow: boolean;
wasd: boolean;
mask: "clip" | "double";
mode: "fixed-view" | "fixed-image";
border: boolean | number;
}, {}, {}, {}, string, _$vue.ComponentProvideOptions, false, {}, any>;
declare const __VLS_export$1: __VLS_WithSlots<typeof __VLS_base, __VLS_Slots>;
declare const _default$1: typeof __VLS_export$1;
type __VLS_WithSlots<T, S> = T & {
new (): {
$slots: S;
};
};
//#endregion
//#region lib/types.d.ts
type ViewportInstance = InstanceType<typeof _default$1>;
/**
* 位置信息
*/
interface Position {
viewportWidth: number;
viewportHeight: number;
viewX: number;
viewY: number;
viewSize: number;
imageX: number;
imageY: number;
imageWidth: number;
imageHeight: number;
imageScale: number;
}
interface SimplePosition {
x: number;
y: number;
}
interface ViewportProps {
/**
* 视口尺寸(同时设置宽高)
*
* @default 300
*/
size?: number | 'full';
/**
* 视口宽度(覆盖size)
*/
width?: number | 'full';
/**
* 视口高度(覆盖size)
*/
height?: number | 'full';
/**
* 图片信息
*/
info?: ImageInfo;
/**
* 观察窗口大小(<=1 表示比例,>1 表示像素值)
*
* @default 0.6
*/
view?: number;
/**
* 是否为网格背景
*
* @default false
*/
grid?: boolean;
/**
* 缩放步长(<1 表示比例,>=1 表示像素值)
*
* @default 0.05
*/
step?: number;
/**
* 缩放步长(按下Ctrl键时,设置为0时,则不生效,<1 表示比例,>=1 表示像素值)
*
* @default 0.02
*/
ctrlStep?: number;
/**
* 缩放步长(按下Shift键时,设置为0时,则不生效,<1 表示比例,>=1 表示像素值)
*
* @default 2
*/
shiftStep?: number;
/**
* 滚轮反向
*
* @default false
*/
reverse?: boolean;
/**
* 最小观察窗口尺寸(mode=fixed-image 时生效)
*
* @default 10
*/
minView?: number;
/**
* 图片边距(mode=fixed-image 时生效)
*
* @default 10
*/
padding?: number;
/**
* 方向键移动
*
* @default true
*/
arrow?: boolean;
/**
* wasd 键移动
*
* @default true
*/
wasd?: boolean;
/**
* 遮罩实现方式
*
* - 'clip':使用 clip-path
* - 'double':使用双层图片
*
* @default 'clip'
*/
mask?: 'clip' | 'double';
/**
* 移动模式:'fixed-view'=观察窗固定图片移动,'fixed-image'=图片固定观察窗移动
*
* @default 'fixed-view'
*/
mode?: 'fixed-view' | 'fixed-image';
/**
* 是否显示观察窗边框
*
* @default false
*/
border?: boolean | number;
}
interface ViewportExposes {
/**
* 选择图片
* @param options 选择图片选项
*/
select: (options?: ImageSelectOptions) => Promise<void>;
/**
* 裁剪图片
* @param options 裁剪选项
* @returns 裁剪后的图片信息
*/
crop: <T extends File | string = string | File>(options?: CropOptions) => Promise<T>;
/**
* 初始化位置信息
* @param res 图片信息
*/
positionInit: (res: ImageSelectResult) => void;
}
interface ImageSelectOptions {
/**
* 允许的文件类型(参考input的accept属性)
*
* @default DEFAULT_ACCEPT
*/
accept?: string;
/**
* 最大文件大小(单位:字节)
* @default 2 * 1024 * 1024
*/
maxFileSize?: number;
/**
* 图片最小尺寸(宽高任一小于该值则无效)
*/
minSize?: number;
/**
* 图片最大尺寸(宽高任一超过该值则无效)
* @default 5000
*/
maxSize?: number;
/**
* 超过最大尺寸时是否等比例缩放到最大尺寸
* @default false
*/
resizeToMax?: boolean;
/**
* 是否启用压缩
* - true:全部压缩
* - number:文件大于该值时压缩(单位:字节)
* @default false
*/
compress?: boolean | number;
/**
* 压缩质量(0-1)
* @default 0.8
*/
quality?: number;
/**
* 矢量图最小尺寸
* @default 1024
*/
minVectorSize?: number;
}
interface ImageSelectResult {
file: File;
width: number;
height: number;
}
interface ImageInfo extends ImageSelectResult {
url?: string;
}
type CropFormat = 'file' | 'base64';
interface CropOptions {
/**
* 数据格式
*/
format?: CropFormat;
/**
* 输出图片尺寸
*/
size?: number;
/**
* 最大输出图片尺寸(如果截取图片尺寸超过该值则等比例缩放到该尺寸,如果设置了 size,该属性则无效)
*/
maxSize?: number;
/**
* 如果截取图片尺寸小于 size 时,则使用截取图片的尺寸
* (如果还是使用 size 作为图片尺寸,则会将图片等比例放大,会造成文件大小变大)
* (仅在设置了 size 时生效)
*/
useOriginSize?: boolean;
/**
* 输出图片类型
*/
type?: 'image/jpeg' | 'image/png' | 'image/webp';
/**
* 输出图片质量(0-1)
*/
quality?: number;
/**
* 文件名
*/
filename?: string;
/**
* 当输出图片类型为 image/jpeg 的底色
*/
backgroundColor?: string;
}
type PointPosition = 'top-left' | 'top-right' | 'bottom-left' | 'bottom-right';
interface PreviewProps {
/**
* 预览尺寸
*
* @default 180
*/
size?: number | 'full';
/**
* 视口实例
*/
viewportRef?: ViewportInstance;
/**
* 是否圆形
*/
round?: boolean;
/**
* 背景颜色
*/
bg?: string;
}
type ErrorCode = 'UNKNOWN' | 'CANCEL' | 'NOT_IMAGE_FILES' | 'IMAGE_FILE_TOO_LARGE' | 'IMAGE_TOO_SMALL' | 'IMAGE_TOO_LARGE' | 'IMAGE_LOAD_FAILED' | 'CANVAS_TO_BLOB_FAILED' | 'BLOB_TO_BASE64_FAILED' | 'CANVAS_CONTEXT_NOT_DEFINED' | 'NO_IMAGE_SELECTED';
/**
* 多语言key
*/
type Locale = { [K in ErrorCode]: string };
interface HookContext {
props: ViewportProps;
pos: Reactive<Position>;
info: Ref<ImageInfo | undefined>;
imageMoving: Ref<boolean, boolean>;
viewMoving: Ref<boolean, boolean>;
viewResizing: Ref<boolean, boolean>;
viewportRef: Ref<HTMLElement | undefined>;
minImageScale: Ref<number>;
step: Ref<number>;
ctrlStep: Ref<number>;
shiftStep: Ref<number>;
pressCtrl: Ref<boolean>;
pressShift: Ref<boolean>;
isClipPathSupported: Ref<boolean>;
pointPosition: Ref<PointPosition | undefined>;
backing: Ref<boolean>;
elEmitter: HTMLElement;
showViewLayer: ComputedRef<boolean>;
checkImageBack: (transition?: boolean) => void;
checkViewPosition: () => void;
resizeView: (newPos: SimplePosition) => void;
broadcastInfo: () => void;
broadcastPos: () => void;
}
type NativeType = null | undefined | number | string | boolean | symbol | Function;
type InferDefault<P, T> = ((props: P) => T & {}) | (T extends NativeType ? T : never);
type InferDefaults<T> = { [K in keyof T]?: InferDefault<T, T[K]> };
//#endregion
//#region lib/utils.d.ts
interface SelectFileOptions {
accept?: string;
multiple?: boolean;
}
/**
* 选择文件
* @example
* selectFile({ accept: 'image/*', multiple: true }).then(files => {
* console.log(files)
* })
*/
declare const selectFile: (options?: SelectFileOptions) => Promise<File[]>;
/**
* 选择并验证图片文件
* @param options 图片选择配置选项
* @returns 验证通过的File对象数组
*/
declare const selectImage: (options?: ImageSelectOptions) => Promise<ImageSelectResult>;
declare const loadImage: (url: string, revoke?: boolean) => Promise<HTMLImageElement>;
declare const canvasToBlob: (canvas: HTMLCanvasElement, type?: string, quality?: number) => Promise<Blob>;
declare const blobToBase64: (blob: Blob) => Promise<string>;
//#endregion
//#region lib/defaults.d.ts
declare const DEFAULT_ACCEPT = "image/jpeg, image/png, image/webp, image/bmp, image/svg+xml, image/avif, image/tiff";
declare const DEFAULT_VIEWPORT_PROPS: Readonly<ViewportProps>;
//#endregion
//#region lib/error.d.ts
declare class AvatarError extends Error {
/**
* 判断是否是 AvatarError
*/
static is(value: unknown): value is AvatarError;
/**
* 判断是否是取消错误
*/
static isCancel(value: unknown): value is AvatarError;
readonly code: ErrorCode;
constructor(code: ErrorCode);
}
//#endregion
//#region lib/locales/zh_cn.d.ts
declare const _default$3: {
UNKNOWN: string;
CANCEL: string;
NOT_IMAGE_FILES: string;
IMAGE_FILE_TOO_LARGE: string;
IMAGE_TOO_SMALL: string;
IMAGE_TOO_LARGE: string;
IMAGE_LOAD_FAILED: string;
CANVAS_TO_BLOB_FAILED: string;
BLOB_TO_BASE64_FAILED: string;
CANVAS_CONTEXT_NOT_DEFINED: string;
NO_IMAGE_SELECTED: string;
};
//#endregion
//#region lib/locales/en.d.ts
declare const _default$2: {
UNKNOWN: string;
CANCEL: string;
NOT_IMAGE_FILES: string;
IMAGE_FILE_TOO_LARGE: string;
IMAGE_TOO_SMALL: string;
IMAGE_TOO_LARGE: string;
IMAGE_LOAD_FAILED: string;
CANVAS_TO_BLOB_FAILED: string;
BLOB_TO_BASE64_FAILED: string;
CANVAS_CONTEXT_NOT_DEFINED: string;
NO_IMAGE_SELECTED: string;
};
//#endregion
//#region lib/locales/index.d.ts
declare function setLocale(locale: Locale): void;
//#endregion
//#region lib/components/Preview.vue.d.ts
declare const __VLS_export: _$vue.DefineComponent<PreviewProps, {}, {}, {}, {}, _$vue.ComponentOptionsMixin, _$vue.ComponentOptionsMixin, {}, string, _$vue.PublicProps, Readonly<PreviewProps> & Readonly<{}>, {
size: number | "full";
}, {}, {}, {}, string, _$vue.ComponentProvideOptions, false, {}, any>;
declare const _default: typeof __VLS_export;
//#endregion
export { AvatarError, CropFormat, CropOptions, DEFAULT_ACCEPT, DEFAULT_VIEWPORT_PROPS, ErrorCode, HookContext, ImageInfo, ImageSelectOptions, ImageSelectResult, InferDefaults, Locale, PointPosition, Position, _default as Preview, PreviewProps, type SelectFileOptions, SimplePosition, _default$1 as Viewport, ViewportExposes, ViewportInstance, ViewportProps, blobToBase64, canvasToBlob, _default$2 as en, loadImage, selectFile, selectImage, setLocale, _default$3 as zh_cn };