UNPKG

vue3-electronic-signature

Version:

一个基于Vue3的电子签名组件库,支持手写签名、触摸绘制和多种导出格式

333 lines 8.94 kB
/** * 签名组件的属性接口 */ export interface SignatureProps { /** 画布宽度,支持数字或字符串(如 '100%') */ width?: number | string; /** 画布高度,支持数字或字符串(如 '300px') */ height?: number | string; /** 笔迹样式 - 默认为适中笔迹 */ penStyle?: PenStyle; /** 画笔颜色 */ strokeColor?: string; /** 画笔粗细 */ strokeWidth?: number; /** 背景颜色 */ backgroundColor?: string; /** 是否禁用签名功能 */ disabled?: boolean; /** 占位符文本 */ placeholder?: string; /** 是否启用平滑绘制 */ smoothing?: boolean; /** 是否启用压感效果 */ pressureSensitive?: boolean; /** 最小画笔宽度(压感模式下) */ minStrokeWidth?: number; /** 最大画笔宽度(压感模式下) */ maxStrokeWidth?: number; /** 画布边框样式 */ borderStyle?: string; /** 画布圆角 */ borderRadius?: string; /** 是否启用回放模式 */ replayMode?: boolean; /** 实时渲染模式 - 确保书写时与最终效果一致 */ realTimeMode?: boolean; /** 回放数据 */ replayData?: SignatureReplay; /** 回放选项 */ replayOptions?: ReplayOptions; } /** * 签名数据点 */ export interface SignaturePoint { /** X坐标 */ x: number; /** Y坐标 */ y: number; /** 时间戳(毫秒) */ time: number; /** 压力值(0-1) */ pressure?: number; /** 相对于笔画开始的时间偏移(毫秒) */ relativeTime?: number; /** 预计算的随机效果数据(确保回放一致性) */ randomEffects?: { /** 毛笔随机因子 */ brushRandomFactor?: number; /** 毛笔墨迹扩散 */ brushInkSpread?: boolean; /** 铅笔随机性 */ pencilRandomness?: number; /** 铅笔纹理效果 */ pencilTextures?: Array<{ offsetX: number; offsetY: number; show: boolean; }>; /** 铅笔颗粒效果 */ pencilParticles?: Array<{ x: number; y: number; radius: number; show: boolean; }>; /** 圆珠笔断续效果 */ ballpointSkip?: boolean; /** 圆珠笔透明度 */ ballpointAlpha?: number; /** 圆珠笔墨水聚集 */ ballpointInkDrop?: boolean; }; } /** * 签名路径 */ export interface SignaturePath { /** 路径点集合 */ points: SignaturePoint[]; /** 画笔颜色 */ strokeColor: string; /** 画笔粗细 */ strokeWidth: number; /** 笔迹样式 */ penStyle?: PenStyle; /** 笔画开始时间(毫秒) */ startTime?: number; /** 笔画结束时间(毫秒) */ endTime?: number; /** 笔画持续时间(毫秒) */ duration?: number; } /** * 签名数据 */ export interface SignatureData { /** 所有签名路径 */ paths: SignaturePath[]; /** 画布尺寸 */ canvasSize: { width: number; height: number; }; /** 创建时间 */ timestamp: number; /** 是否为空 */ isEmpty: boolean; } /** * 导出格式类型 */ export type ExportFormat = 'png' | 'jpeg' | 'svg' | 'base64'; /** * 导出选项 */ export interface ExportOptions { /** 导出格式 */ format: ExportFormat; /** 图片质量(0-1,仅对jpeg格式有效) */ quality?: number; /** 导出尺寸 */ size?: { width: number; height: number; }; /** 背景颜色(透明背景设为 'transparent') */ backgroundColor?: string; } /** * 签名组件事件 */ export interface SignatureEvents extends ReplayEvents { /** 开始签名 */ 'signature-start': () => void; /** 签名进行中 */ 'signature-drawing': (data: SignatureData) => void; /** 签名结束 */ 'signature-end': (data: SignatureData) => void; /** 清除签名 */ 'signature-clear': () => void; /** 撤销操作 */ 'signature-undo': (data: SignatureData) => void; /** 重做操作 */ 'signature-redo': (data: SignatureData) => void; } /** * 签名组件方法 */ export interface SignatureMethods extends ReplayController { /** 清除签名 */ clear(): void; /** 撤销上一步操作 */ undo(): void; /** 重做操作 */ redo(): void; /** 保存签名 */ save(options?: ExportOptions): string; /** 判断签名是否为空 */ isEmpty(): boolean; /** 从数据URL加载签名 */ fromDataURL(dataURL: string): void; /** 获取签名数据 */ getSignatureData(): SignatureData; /** 设置签名数据 */ setSignatureData(data: SignatureData): void; /** 调整画布尺寸 */ resize(width?: number, height?: number): void; /** 开始回放签名 */ startReplay(replayData: SignatureReplay, options?: ReplayOptions): void; /** 获取回放数据 */ getReplayData(): SignatureReplay | null; /** 设置回放模式 */ setReplayMode(enabled: boolean): void; } /** * 触摸事件类型 */ export type TouchEventType = 'start' | 'move' | 'end'; /** * 笔迹样式类型 */ export type PenStyle = 'ballpoint' | 'elegant' | 'brush' | 'pencil' | 'pen' | 'marker'; /** * 笔迹样式配置 */ export interface PenStyleConfig { /** 样式名称 */ name: string; /** 样式描述 */ description: string; /** 基础线宽 */ strokeWidth: number; /** 是否启用平滑 */ smoothing: boolean; /** 压感配置 */ pressure: { enabled: boolean; min: number; max: number; }; /** 线条端点样式 */ lineCap: CanvasLineCap; /** 线条连接样式 */ lineJoin: CanvasLineJoin; /** 推荐颜色 */ recommendedColor?: string; } /** * 绘制选项 */ export interface DrawOptions { /** 画笔颜色 */ strokeColor: string; /** 画笔粗细 */ strokeWidth: number; /** 是否平滑 */ smoothing: boolean; /** 压感设置 */ pressure: { enabled: boolean; min: number; max: number; }; /** 线条端点样式 */ lineCap?: CanvasLineCap; /** 线条连接样式 */ lineJoin?: CanvasLineJoin; } /** * 签名回放数据 */ export interface SignatureReplay { /** 带时间信息的路径集合 */ paths: SignaturePath[]; /** 总回放时长(毫秒) */ totalDuration: number; /** 回放速度倍率 */ speed: number; /** 签名元数据 */ metadata: { /** 设备类型 */ deviceType: 'mouse' | 'touch' | 'pen'; /** 平均书写速度(像素/秒) */ averageSpeed: number; /** 总绘制距离(像素) */ totalDistance: number; /** 笔画间平均停顿时间(毫秒) */ averagePauseTime: number; }; } /** * 回放控制状态 */ export type ReplayState = 'idle' | 'playing' | 'paused' | 'stopped' | 'completed'; /** * 回放控制选项 */ export interface ReplayOptions { /** 回放速度倍率 */ speed?: number; /** 是否循环播放 */ loop?: boolean; /** 是否显示控制条 */ showControls?: boolean; /** 是否自动开始播放 */ autoPlay?: boolean; /** 回放开始时间(毫秒) */ startTime?: number; /** 回放结束时间(毫秒) */ endTime?: number; /** 绘制选项(确保回放与录制一致) */ drawOptions?: DrawOptions; /** 笔迹样式(确保回放与录制一致) */ penStyle?: PenStyle; } /** * 回放事件 */ export interface ReplayEvents { /** 回放开始 */ 'replay-start': () => void; /** 回放进度更新 */ 'replay-progress': (progress: number, currentTime: number) => void; /** 回放暂停 */ 'replay-pause': () => void; /** 回放恢复 */ 'replay-resume': () => void; /** 回放停止 */ 'replay-stop': () => void; /** 回放完成 */ 'replay-complete': () => void; /** 笔画开始 */ 'replay-path-start': (pathIndex: number, path: SignaturePath) => void; /** 笔画结束 */ 'replay-path-end': (pathIndex: number, path: SignaturePath) => void; /** 回放速度改变 */ 'replay-speed-change': (speed: number) => void; } /** * 回放控制器方法 */ export interface ReplayController { /** 播放 */ play(): void; /** 暂停 */ pause(): void; /** 停止 */ stop(): void; /** 跳转到指定时间 */ seek(time: number): void; /** 设置播放速度 */ setSpeed(speed: number): void; /** 获取当前状态 */ getState(): ReplayState; /** 获取当前时间 */ getCurrentTime(): number; /** 获取总时长 */ getTotalDuration(): number; /** 获取当前进度(0-1) */ getProgress(): number; } //# sourceMappingURL=index.d.ts.map