zcw-shared 1.33.0 → 1.35.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.
- package/README.md +13 -13
- package/dist/functions/android/integrateFacebookLogin.d.ts +12 -0
- package/dist/functions/android/integrateFacebookLogin.js +91 -0
- package/dist/functions/android/integrateFacebookLogin.js.map +1 -0
- package/dist/functions/android/integrateGoogleLogin.d.ts +10 -0
- package/dist/functions/android/integrateGoogleLogin.js +199 -0
- package/dist/functions/android/integrateGoogleLogin.js.map +1 -0
- package/dist/functions/android/integrateMiuiLogin.d.ts +13 -0
- package/dist/functions/android/integrateMiuiLogin.js +115 -0
- package/dist/functions/android/integrateMiuiLogin.js.map +1 -0
- package/dist/functions/android/integrateQQLogin.d.ts +12 -0
- package/dist/functions/android/integrateQQLogin.js +130 -0
- package/dist/functions/android/integrateQQLogin.js.map +1 -0
- package/dist/functions/android/integrateShareTrace.d.ts +10 -0
- package/dist/functions/android/integrateShareTrace.js +181 -0
- package/dist/functions/android/integrateShareTrace.js.map +1 -0
- package/dist/functions/android/integrateSinaLogin.d.ts +13 -0
- package/dist/functions/android/integrateSinaLogin.js +85 -0
- package/dist/functions/android/integrateSinaLogin.js.map +1 -0
- package/dist/functions/android/integrateThirdPartyModule.d.ts +46 -0
- package/dist/functions/android/integrateThirdPartyModule.js +251 -0
- package/dist/functions/android/integrateThirdPartyModule.js.map +1 -0
- package/dist/functions/android/integrateUniverifyLogin.d.ts +11 -0
- package/dist/functions/android/integrateUniverifyLogin.js +314 -0
- package/dist/functions/android/integrateUniverifyLogin.js.map +1 -0
- package/dist/functions/android/integrateWechatLogin.d.ts +13 -0
- package/dist/functions/android/integrateWechatLogin.js +154 -0
- package/dist/functions/android/integrateWechatLogin.js.map +1 -0
- package/dist/functions/android/integrateWechatShare.d.ts +13 -0
- package/dist/functions/android/integrateWechatShare.js +154 -0
- package/dist/functions/android/integrateWechatShare.js.map +1 -0
- package/dist/functions/android/modifyManifest.d.ts +7 -0
- package/dist/functions/android/modifyManifest.js +24 -0
- package/dist/functions/android/modifyManifest.js.map +1 -1
- package/dist/functions/async/cancellableFetch.d.ts +12 -0
- package/dist/functions/async/cancellableFetch.js +27 -0
- package/dist/functions/async/cancellableFetch.js.map +1 -0
- package/dist/functions/async/cancellableXHR.d.ts +21 -0
- package/dist/functions/async/cancellableXHR.js +96 -0
- package/dist/functions/async/cancellableXHR.js.map +1 -0
- package/dist/functions/functional/constant.d.ts +1 -0
- package/dist/functions/functional/constant.js +4 -0
- package/dist/functions/functional/constant.js.map +1 -0
- package/dist/functions/functional/identity.d.ts +1 -0
- package/dist/functions/functional/identity.js +4 -0
- package/dist/functions/functional/identity.js.map +1 -0
- package/dist/functions/functional/noop.d.ts +1 -0
- package/dist/functions/functional/noop.js +3 -0
- package/dist/functions/functional/noop.js.map +1 -0
- package/dist/functions/image/compressImageToWidth.d.ts +12 -0
- package/dist/functions/image/compressImageToWidth.js +44 -0
- package/dist/functions/image/compressImageToWidth.js.map +1 -0
- package/dist/functions/image/generateFavIcon.d.ts +8 -0
- package/dist/functions/image/generateFavIcon.js +13 -0
- package/dist/functions/image/generateFavIcon.js.map +1 -0
- package/dist/functions/image/renderBankCard.d.ts +52 -0
- package/dist/functions/image/renderBankCard.js +177 -0
- package/dist/functions/image/renderBankCard.js.map +1 -0
- package/dist/functions/image/renderBusinessLicense.d.ts +47 -0
- package/dist/functions/image/renderBusinessLicense.js +187 -0
- package/dist/functions/image/renderBusinessLicense.js.map +1 -0
- package/dist/functions/image/renderDrivingLicense.d.ts +48 -0
- package/dist/functions/image/renderDrivingLicense.js +201 -0
- package/dist/functions/image/renderDrivingLicense.js.map +1 -0
- package/dist/functions/image/renderLicensePlate.d.ts +47 -0
- package/dist/functions/image/renderLicensePlate.js +85 -0
- package/dist/functions/image/renderLicensePlate.js.map +1 -0
- package/dist/functions/software/publishToPgyer.d.ts +16 -0
- package/dist/functions/software/publishToPgyer.js +96 -0
- package/dist/functions/software/publishToPgyer.js.map +1 -0
- package/dist/functions/tencent-cloud/deploy.tcb.js +1 -1
- package/dist/functions/tencent-cloud/deploy.tcb.js.map +1 -1
- package/dist/functions/uniapp/app-plus/buildAndroidApp.js +290 -0
- package/dist/functions/uniapp/app-plus/buildAndroidApp.js.map +1 -1
- package/dist/functions/validation/generateFakeBankCard.d.ts +87 -0
- package/dist/functions/validation/generateFakeBankCard.js +152 -0
- package/dist/functions/validation/generateFakeBankCard.js.map +1 -0
- package/dist/functions/validation/generateFakeBusinessLicense.d.ts +21 -0
- package/dist/functions/validation/generateFakeBusinessLicense.js +160 -0
- package/dist/functions/validation/generateFakeBusinessLicense.js.map +1 -0
- package/dist/functions/validation/generateFakeDrivingLicense.d.ts +31 -0
- package/dist/functions/validation/generateFakeDrivingLicense.js +119 -0
- package/dist/functions/validation/generateFakeDrivingLicense.js.map +1 -0
- package/dist/functions/validation/generateFakeLicensePlate.d.ts +13 -0
- package/dist/functions/validation/generateFakeLicensePlate.js +87 -0
- package/dist/functions/validation/generateFakeLicensePlate.js.map +1 -0
- package/package.json +26 -4
- package/references/blob.d.ts +4 -0
- package/references/fetch.d.ts +22 -0
- package/references/sharp.d.ts +1 -0
- package/references/xhr.d.ts +47 -0
- package/types/pgyer.d.ts +64 -0
- package/types/uniapp-android-build.d.ts +124 -0
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import { getImageDimensions } from './getImageDimensions';
|
|
2
|
+
export async function compressImageToWidth(file, targetWidth, options = {}, deps) {
|
|
3
|
+
const { quality = 0.9, mimeType = 'image/jpeg' } = options;
|
|
4
|
+
const dimensions = await getImageDimensions(file, {
|
|
5
|
+
Image: deps.Image,
|
|
6
|
+
createObjectURL: deps.createObjectURL
|
|
7
|
+
});
|
|
8
|
+
const originalWidth = dimensions.width;
|
|
9
|
+
const originalHeight = dimensions.height;
|
|
10
|
+
const targetHeight = Math.round((targetWidth / originalWidth) * originalHeight);
|
|
11
|
+
if (originalWidth === targetWidth && originalHeight === targetHeight) {
|
|
12
|
+
return file;
|
|
13
|
+
}
|
|
14
|
+
return new Promise((resolve, reject) => {
|
|
15
|
+
const img = new deps.Image();
|
|
16
|
+
img.onload = () => {
|
|
17
|
+
const canvas = deps.createElement('canvas');
|
|
18
|
+
canvas.width = targetWidth;
|
|
19
|
+
canvas.height = targetHeight;
|
|
20
|
+
const ctx = canvas.getContext('2d');
|
|
21
|
+
if (!ctx) {
|
|
22
|
+
reject(new Error('无法创建canvas上下文'));
|
|
23
|
+
return;
|
|
24
|
+
}
|
|
25
|
+
ctx.drawImage(img, 0, 0, targetWidth, targetHeight);
|
|
26
|
+
canvas.toBlob((blob) => {
|
|
27
|
+
if (!blob) {
|
|
28
|
+
reject(new Error('图片压缩失败'));
|
|
29
|
+
return;
|
|
30
|
+
}
|
|
31
|
+
const newFile = new deps.File([blob], file.name, {
|
|
32
|
+
type: mimeType,
|
|
33
|
+
lastModified: Date.now()
|
|
34
|
+
});
|
|
35
|
+
resolve(newFile);
|
|
36
|
+
}, mimeType, quality);
|
|
37
|
+
};
|
|
38
|
+
img.onerror = () => {
|
|
39
|
+
reject(new Error('图片加载失败'));
|
|
40
|
+
};
|
|
41
|
+
img.src = deps.createObjectURL(file);
|
|
42
|
+
});
|
|
43
|
+
}
|
|
44
|
+
//# sourceMappingURL=compressImageToWidth.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"compressImageToWidth.js","sourceRoot":"","sources":["../../../src/functions/image/compressImageToWidth.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAA;AAyDzD,MAAM,CAAC,KAAK,UAAU,oBAAoB,CACxC,IAAU,EACV,WAAmB,EACnB,UAGI,EAAE,EACN,IAA8B;IAE9B,MAAM,EACJ,OAAO,GAAG,GAAG,EACb,QAAQ,GAAG,YAAY,EACxB,GAAG,OAAO,CAAA;IAEX,MAAM,UAAU,GAAG,MAAM,kBAAkB,CAAC,IAAI,EAAE;QAChD,KAAK,EAAE,IAAI,CAAC,KAAK;QACjB,eAAe,EAAE,IAAI,CAAC,eAAe;KACtC,CAAC,CAAA;IAEF,MAAM,aAAa,GAAG,UAAU,CAAC,KAAK,CAAA;IACtC,MAAM,cAAc,GAAG,UAAU,CAAC,MAAM,CAAA;IAGxC,MAAM,YAAY,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,WAAW,GAAG,aAAa,CAAC,GAAG,cAAc,CAAC,CAAA;IAG/E,IAAI,aAAa,KAAK,WAAW,IAAI,cAAc,KAAK,YAAY,EAAE,CAAC;QACrE,OAAO,IAAI,CAAA;IACb,CAAC;IAGD,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACrC,MAAM,GAAG,GAAG,IAAI,IAAI,CAAC,KAAK,EAAE,CAAA;QAE5B,GAAG,CAAC,MAAM,GAAG,GAAG,EAAE;YAEhB,MAAM,MAAM,GAAG,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAA;YAC3C,MAAM,CAAC,KAAK,GAAG,WAAW,CAAA;YAC1B,MAAM,CAAC,MAAM,GAAG,YAAY,CAAA;YAG5B,MAAM,GAAG,GAAG,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,CAAA;YACnC,IAAI,CAAC,GAAG,EAAE,CAAC;gBACT,MAAM,CAAC,IAAI,KAAK,CAAC,eAAe,CAAC,CAAC,CAAA;gBAClC,OAAM;YACR,CAAC;YAED,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,EAAE,WAAW,EAAE,YAAY,CAAC,CAAA;YAGnD,MAAM,CAAC,MAAM,CACX,CAAC,IAAiB,EAAE,EAAE;gBACpB,IAAI,CAAC,IAAI,EAAE,CAAC;oBACV,MAAM,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAA;oBAC3B,OAAM;gBACR,CAAC;gBAED,MAAM,OAAO,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,EAAE,IAAI,CAAC,IAAI,EAAE;oBAC/C,IAAI,EAAE,QAAQ;oBACd,YAAY,EAAE,IAAI,CAAC,GAAG,EAAE;iBACzB,CAAC,CAAA;gBACF,OAAO,CAAC,OAAO,CAAC,CAAA;YAClB,CAAC,EACD,QAAQ,EACR,OAAO,CACR,CAAA;QACH,CAAC,CAAA;QAED,GAAG,CAAC,OAAO,GAAG,GAAG,EAAE;YACjB,MAAM,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAA;QAC7B,CAAC,CAAA;QAED,GAAG,CAAC,GAAG,GAAG,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,CAAA;IACtC,CAAC,CAAC,CAAA;AACJ,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { Buffer, BufferConstructor } from '../../../references/node.d';
|
|
2
|
+
import type { Sharp } from '../../../references/sharp.d';
|
|
3
|
+
export interface GenerateFavIconDeps {
|
|
4
|
+
sharp: Sharp;
|
|
5
|
+
Buffer: BufferConstructor;
|
|
6
|
+
toIco: (buffers: Buffer[]) => Promise<Buffer>;
|
|
7
|
+
}
|
|
8
|
+
export declare function generateFavIcon(input: Buffer, sizes: number[] | undefined, deps: GenerateFavIconDeps): Promise<Buffer>;
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
export async function generateFavIcon(input, sizes = [16, 32], deps) {
|
|
2
|
+
const pngBuffers = [];
|
|
3
|
+
for (const size of sizes) {
|
|
4
|
+
const buffer = await deps.sharp(input)
|
|
5
|
+
.resize(size, size)
|
|
6
|
+
.png()
|
|
7
|
+
.toBuffer();
|
|
8
|
+
pngBuffers.push(buffer);
|
|
9
|
+
}
|
|
10
|
+
const icoBuffer = await deps.toIco(pngBuffers);
|
|
11
|
+
return icoBuffer;
|
|
12
|
+
}
|
|
13
|
+
//# sourceMappingURL=generateFavIcon.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"generateFavIcon.js","sourceRoot":"","sources":["../../../src/functions/image/generateFavIcon.ts"],"names":[],"mappings":"AAiDA,MAAM,CAAC,KAAK,UAAU,eAAe,CACnC,KAAa,EACb,QAAkB,CAAC,EAAE,EAAE,EAAE,CAAC,EAC1B,IAAyB;IAGzB,MAAM,UAAU,GAAa,EAAE,CAAA;IAE/B,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC;aACnC,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC;aAClB,GAAG,EAAE;aACL,QAAQ,EAAE,CAAA;QACb,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA;IACzB,CAAC;IAGD,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,CAAA;IAE9C,OAAO,SAAS,CAAA;AAClB,CAAC"}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import type { GeneratedBankCardProfile } from '../validation/generateFakeBankCard';
|
|
2
|
+
type CanvasTextBaseline = 'top' | 'hanging' | 'middle' | 'alphabetic' | 'ideographic' | 'bottom';
|
|
3
|
+
type CanvasTextAlign = 'left' | 'right' | 'center' | 'start' | 'end';
|
|
4
|
+
export interface RenderBankCardOptions {
|
|
5
|
+
resolution?: 'standard' | 'retina';
|
|
6
|
+
cornerRadius?: number;
|
|
7
|
+
showSignaturePanel?: boolean;
|
|
8
|
+
}
|
|
9
|
+
export interface CanvasGradientLike {
|
|
10
|
+
addColorStop: (offset: number, color: string) => void;
|
|
11
|
+
}
|
|
12
|
+
export interface Canvas2DContextLike {
|
|
13
|
+
fillStyle: string | CanvasGradientLike;
|
|
14
|
+
strokeStyle: string;
|
|
15
|
+
globalAlpha: number;
|
|
16
|
+
lineWidth: number;
|
|
17
|
+
font: string;
|
|
18
|
+
textBaseline: CanvasTextBaseline;
|
|
19
|
+
textAlign: CanvasTextAlign;
|
|
20
|
+
beginPath: () => void;
|
|
21
|
+
moveTo?: (x: number, y: number) => void;
|
|
22
|
+
lineTo?: (x: number, y: number) => void;
|
|
23
|
+
arc: (x: number, y: number, radius: number, startAngle: number, endAngle: number) => void;
|
|
24
|
+
closePath: () => void;
|
|
25
|
+
fill?: () => void;
|
|
26
|
+
stroke?: () => void;
|
|
27
|
+
fillRect: (x: number, y: number, w: number, h: number) => void;
|
|
28
|
+
strokeRect: (x: number, y: number, w: number, h: number) => void;
|
|
29
|
+
drawImage?: (...args: any[]) => void;
|
|
30
|
+
fillText: (text: string, x: number, y: number) => void;
|
|
31
|
+
measureText: (text: string) => {
|
|
32
|
+
width: number;
|
|
33
|
+
};
|
|
34
|
+
createLinearGradient: (x0: number, y0: number, x1: number, y1: number) => CanvasGradientLike;
|
|
35
|
+
save: () => void;
|
|
36
|
+
restore: () => void;
|
|
37
|
+
setLineDash?: (segments: number[]) => void;
|
|
38
|
+
clip?: () => void;
|
|
39
|
+
}
|
|
40
|
+
export interface CanvasLike {
|
|
41
|
+
width: number;
|
|
42
|
+
height: number;
|
|
43
|
+
getContext: (type: '2d') => Canvas2DContextLike;
|
|
44
|
+
}
|
|
45
|
+
export interface RenderBankCardDeps {
|
|
46
|
+
createCanvas: (width: number, height: number) => CanvasLike;
|
|
47
|
+
}
|
|
48
|
+
export interface RenderBankCardResult {
|
|
49
|
+
canvas: CanvasLike;
|
|
50
|
+
}
|
|
51
|
+
export declare function renderBankCard(profile: GeneratedBankCardProfile, deps: RenderBankCardDeps, options?: RenderBankCardOptions): RenderBankCardResult;
|
|
52
|
+
export {};
|
|
@@ -0,0 +1,177 @@
|
|
|
1
|
+
function drawRoundedRect(ctx, x, y, w, h, r) {
|
|
2
|
+
const radius = Math.min(r, Math.min(w, h) / 2);
|
|
3
|
+
ctx.beginPath();
|
|
4
|
+
ctx.moveTo?.(x + radius, y);
|
|
5
|
+
ctx.arc(x + w - radius, y + radius, radius, Math.PI * 1.5, 0);
|
|
6
|
+
ctx.lineTo?.(x + w, y + h - radius);
|
|
7
|
+
ctx.arc(x + w - radius, y + h - radius, radius, 0, Math.PI * 0.5);
|
|
8
|
+
ctx.lineTo?.(x + radius, y + h);
|
|
9
|
+
ctx.arc(x + radius, y + h - radius, radius, Math.PI * 0.5, Math.PI);
|
|
10
|
+
ctx.lineTo?.(x, y + radius);
|
|
11
|
+
ctx.arc(x + radius, y + radius, radius, Math.PI, Math.PI * 1.5);
|
|
12
|
+
ctx.closePath();
|
|
13
|
+
}
|
|
14
|
+
function drawBackground(ctx, width, height, theme, radius) {
|
|
15
|
+
ctx.save();
|
|
16
|
+
drawRoundedRect(ctx, 0, 0, width, height, radius);
|
|
17
|
+
const gradient = ctx.createLinearGradient(0, 0, width, height);
|
|
18
|
+
gradient.addColorStop(0, theme.gradient[0]);
|
|
19
|
+
gradient.addColorStop(1, theme.gradient[1]);
|
|
20
|
+
ctx.fillStyle = gradient;
|
|
21
|
+
ctx.fill?.();
|
|
22
|
+
ctx.restore();
|
|
23
|
+
}
|
|
24
|
+
function drawPattern(ctx, width, height, theme, radius) {
|
|
25
|
+
ctx.save();
|
|
26
|
+
ctx.globalAlpha = 1;
|
|
27
|
+
drawRoundedRect(ctx, 0, 0, width, height, radius);
|
|
28
|
+
ctx.clip?.();
|
|
29
|
+
ctx.strokeStyle = theme.patternColor;
|
|
30
|
+
ctx.lineWidth = 2;
|
|
31
|
+
const spacing = 42;
|
|
32
|
+
for (let i = -width; i < width * 2; i += spacing) {
|
|
33
|
+
ctx.beginPath();
|
|
34
|
+
ctx.moveTo?.(i, -20);
|
|
35
|
+
ctx.lineTo?.(i + height, height + 20);
|
|
36
|
+
ctx.stroke?.();
|
|
37
|
+
}
|
|
38
|
+
ctx.restore();
|
|
39
|
+
}
|
|
40
|
+
function drawChip(ctx, x, y, width, height, style, accentColor) {
|
|
41
|
+
ctx.save();
|
|
42
|
+
ctx.lineWidth = 2;
|
|
43
|
+
const gradient = ctx.createLinearGradient(x, y, x + width, y + height);
|
|
44
|
+
gradient.addColorStop(0, '#eceff4');
|
|
45
|
+
gradient.addColorStop(1, '#cbd5f5');
|
|
46
|
+
ctx.fillStyle = gradient;
|
|
47
|
+
drawRoundedRect(ctx, x, y, width, height, 16);
|
|
48
|
+
ctx.fill?.();
|
|
49
|
+
ctx.strokeStyle = 'rgba(0,0,0,0.2)';
|
|
50
|
+
ctx.stroke?.();
|
|
51
|
+
ctx.strokeStyle = 'rgba(0,0,0,0.35)';
|
|
52
|
+
ctx.lineWidth = 1.2;
|
|
53
|
+
const segments = style === 'minimal' ? 2 : 3;
|
|
54
|
+
for (let i = 1; i <= segments; i++) {
|
|
55
|
+
const offset = (height / (segments + 1)) * i;
|
|
56
|
+
ctx.beginPath();
|
|
57
|
+
ctx.moveTo?.(x + 10, y + offset);
|
|
58
|
+
ctx.lineTo?.(x + width - 10, y + offset);
|
|
59
|
+
ctx.stroke?.();
|
|
60
|
+
}
|
|
61
|
+
ctx.fillStyle = accentColor;
|
|
62
|
+
ctx.fillRect(x + width / 2 - 8, y + height / 2 - 22, 16, 44);
|
|
63
|
+
ctx.restore();
|
|
64
|
+
}
|
|
65
|
+
function drawContactless(ctx, x, y, color) {
|
|
66
|
+
ctx.save();
|
|
67
|
+
ctx.strokeStyle = color;
|
|
68
|
+
ctx.lineWidth = 2;
|
|
69
|
+
for (let i = 0; i < 3; i++) {
|
|
70
|
+
ctx.beginPath();
|
|
71
|
+
ctx.arc(x, y, 10 + i * 6, -Math.PI / 3, Math.PI / 3);
|
|
72
|
+
ctx.stroke?.();
|
|
73
|
+
}
|
|
74
|
+
ctx.restore();
|
|
75
|
+
}
|
|
76
|
+
function drawCardNumber(ctx, value, x, y, theme, width) {
|
|
77
|
+
const segments = value.split(' ');
|
|
78
|
+
ctx.save();
|
|
79
|
+
ctx.font = '600 48px "SF Mono", "JetBrains Mono", "Menlo", monospace';
|
|
80
|
+
ctx.fillStyle = theme.textColor;
|
|
81
|
+
const spacing = (width - x * 2) / segments.length;
|
|
82
|
+
segments.forEach((segment, index) => {
|
|
83
|
+
const text = ctx.measureText(segment);
|
|
84
|
+
const baseX = x + spacing * index + (spacing - text.width) / 2;
|
|
85
|
+
ctx.fillText(segment, baseX, y);
|
|
86
|
+
});
|
|
87
|
+
ctx.restore();
|
|
88
|
+
}
|
|
89
|
+
function drawLabelValue(ctx, label, value, x, y, theme) {
|
|
90
|
+
ctx.save();
|
|
91
|
+
ctx.font = '600 18px "Inter", "PingFang SC", sans-serif';
|
|
92
|
+
ctx.fillStyle = theme.secondaryTextColor;
|
|
93
|
+
ctx.fillText(label.toUpperCase(), x, y);
|
|
94
|
+
ctx.font = '600 30px "Inter", "PingFang SC", sans-serif';
|
|
95
|
+
ctx.fillStyle = theme.textColor;
|
|
96
|
+
ctx.fillText(value, x, y + 42);
|
|
97
|
+
ctx.restore();
|
|
98
|
+
}
|
|
99
|
+
function drawBrandBadge(ctx, brand, x, y, theme) {
|
|
100
|
+
const radius = 42;
|
|
101
|
+
ctx.save();
|
|
102
|
+
ctx.beginPath();
|
|
103
|
+
ctx.arc(x, y, radius, 0, Math.PI * 2);
|
|
104
|
+
ctx.closePath();
|
|
105
|
+
ctx.fillStyle = '#ffffff';
|
|
106
|
+
ctx.globalAlpha = 0.92;
|
|
107
|
+
ctx.fill?.();
|
|
108
|
+
ctx.globalAlpha = 1;
|
|
109
|
+
ctx.strokeStyle = theme.accentColor;
|
|
110
|
+
ctx.lineWidth = 3;
|
|
111
|
+
ctx.stroke?.();
|
|
112
|
+
ctx.fillStyle = theme.baseColor;
|
|
113
|
+
ctx.font = '700 20px "Inter", "PingFang SC", sans-serif';
|
|
114
|
+
ctx.textAlign = 'center';
|
|
115
|
+
ctx.textBaseline = 'middle';
|
|
116
|
+
ctx.fillText(brand, x, y);
|
|
117
|
+
ctx.restore();
|
|
118
|
+
}
|
|
119
|
+
function ensureFormattedNumber(cardNumber, formatted) {
|
|
120
|
+
if (formatted && formatted.trim().length > 0)
|
|
121
|
+
return formatted;
|
|
122
|
+
return cardNumber.replace(/\D/g, '').replace(/(.{4})/g, '$1 ').trim();
|
|
123
|
+
}
|
|
124
|
+
export function renderBankCard(profile, deps, options = {}) {
|
|
125
|
+
const width = options.resolution === 'retina' ? 1280 : 1012;
|
|
126
|
+
const height = Math.round(width * 0.63);
|
|
127
|
+
const cornerRadius = options.cornerRadius ?? 52;
|
|
128
|
+
const canvas = deps.createCanvas(width, height);
|
|
129
|
+
const ctx = canvas.getContext('2d');
|
|
130
|
+
ctx.textBaseline = 'alphabetic';
|
|
131
|
+
ctx.textAlign = 'left';
|
|
132
|
+
drawBackground(ctx, width, height, profile.background, cornerRadius);
|
|
133
|
+
drawPattern(ctx, width, height, profile.background, cornerRadius);
|
|
134
|
+
const padding = Math.round(width * 0.07);
|
|
135
|
+
const chipWidth = 160;
|
|
136
|
+
const chipHeight = 110;
|
|
137
|
+
drawChip(ctx, padding, padding + 40, chipWidth, chipHeight, profile.chipStyle, profile.background.accentColor);
|
|
138
|
+
if (profile.contactless) {
|
|
139
|
+
drawContactless(ctx, padding + chipWidth + 50, padding + chipHeight / 2 + 20, profile.background.secondaryTextColor);
|
|
140
|
+
}
|
|
141
|
+
ctx.save();
|
|
142
|
+
ctx.fillStyle = profile.background.textColor;
|
|
143
|
+
ctx.font = '700 48px "Inter", "PingFang SC", sans-serif';
|
|
144
|
+
ctx.fillText(profile.bankName, padding, padding + 32);
|
|
145
|
+
ctx.font = '400 20px "Inter", "PingFang SC", sans-serif';
|
|
146
|
+
ctx.fillStyle = profile.background.secondaryTextColor;
|
|
147
|
+
ctx.fillText(`${profile.cardType} · ${profile.tagline}`, padding, padding + 72);
|
|
148
|
+
ctx.restore();
|
|
149
|
+
const formattedNumber = ensureFormattedNumber(profile.cardNumber, profile.formattedNumber);
|
|
150
|
+
drawCardNumber(ctx, formattedNumber, padding, height / 2 + 40, profile.background, width - padding * 2);
|
|
151
|
+
drawLabelValue(ctx, 'CARD HOLDER', profile.holderName.toUpperCase(), padding, height - 180, profile.background);
|
|
152
|
+
drawLabelValue(ctx, 'VALID FROM', profile.validFrom, padding + 360, height - 180, profile.background);
|
|
153
|
+
drawLabelValue(ctx, 'VALID THRU', profile.validThru, padding + 620, height - 180, profile.background);
|
|
154
|
+
if (options.showSignaturePanel !== false) {
|
|
155
|
+
ctx.save();
|
|
156
|
+
const panelWidth = width * 0.32;
|
|
157
|
+
const panelHeight = 70;
|
|
158
|
+
const panelX = width - panelWidth - padding;
|
|
159
|
+
const panelY = padding + 30;
|
|
160
|
+
ctx.globalAlpha = 0.25;
|
|
161
|
+
drawRoundedRect(ctx, panelX, panelY, panelWidth, panelHeight, 10);
|
|
162
|
+
ctx.fillStyle = '#ffffff';
|
|
163
|
+
ctx.fill?.();
|
|
164
|
+
ctx.globalAlpha = 1;
|
|
165
|
+
ctx.strokeStyle = 'rgba(255,255,255,0.5)';
|
|
166
|
+
ctx.lineWidth = 1;
|
|
167
|
+
ctx.stroke?.();
|
|
168
|
+
ctx.font = '500 18px "Inter", "PingFang SC", sans-serif';
|
|
169
|
+
ctx.fillStyle = profile.background.baseColor;
|
|
170
|
+
ctx.textAlign = 'right';
|
|
171
|
+
ctx.fillText(profile.bankShortName, panelX + panelWidth - 16, panelY + panelHeight / 2 + 6);
|
|
172
|
+
ctx.restore();
|
|
173
|
+
}
|
|
174
|
+
drawBrandBadge(ctx, profile.cardBrand, width - padding - 64, height - padding - 60, profile.background);
|
|
175
|
+
return { canvas };
|
|
176
|
+
}
|
|
177
|
+
//# sourceMappingURL=renderBankCard.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"renderBankCard.js","sourceRoot":"","sources":["../../../src/functions/image/renderBankCard.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import type { GeneratedBusinessLicenseProfile } from '../validation/generateFakeBusinessLicense';
|
|
2
|
+
import type { Window } from '../../../references/browser.d';
|
|
3
|
+
export interface RenderBusinessLicenseOptions {
|
|
4
|
+
companyName?: string;
|
|
5
|
+
}
|
|
6
|
+
export interface Canvas2DContextLike {
|
|
7
|
+
fillStyle: string | CanvasGradientLike;
|
|
8
|
+
strokeStyle: string;
|
|
9
|
+
lineWidth: number;
|
|
10
|
+
font: string;
|
|
11
|
+
textBaseline: string;
|
|
12
|
+
textAlign: string;
|
|
13
|
+
moveTo?: (x: number, y: number) => void;
|
|
14
|
+
lineTo?: (x: number, y: number) => void;
|
|
15
|
+
fill?: () => void;
|
|
16
|
+
stroke?: () => void;
|
|
17
|
+
drawImage: (...args: any[]) => void;
|
|
18
|
+
fillRect: (x: number, y: number, w: number, h: number) => void;
|
|
19
|
+
strokeRect: (x: number, y: number, w: number, h: number) => void;
|
|
20
|
+
fillText: (text: string, x: number, y: number) => void;
|
|
21
|
+
measureText: (text: string) => {
|
|
22
|
+
width: number;
|
|
23
|
+
};
|
|
24
|
+
beginPath: () => void;
|
|
25
|
+
arc: (x: number, y: number, r: number, sAngle: number, eAngle: number) => void;
|
|
26
|
+
closePath: () => void;
|
|
27
|
+
clip: () => void;
|
|
28
|
+
save: () => void;
|
|
29
|
+
restore: () => void;
|
|
30
|
+
createLinearGradient: (x0: number, y0: number, x1: number, y1: number) => CanvasGradientLike;
|
|
31
|
+
}
|
|
32
|
+
export interface CanvasGradientLike {
|
|
33
|
+
addColorStop: (offset: number, color: string) => void;
|
|
34
|
+
}
|
|
35
|
+
export interface CanvasLike {
|
|
36
|
+
width: number;
|
|
37
|
+
height: number;
|
|
38
|
+
getContext: (type: '2d') => Canvas2DContextLike;
|
|
39
|
+
}
|
|
40
|
+
export interface RenderBusinessLicenseDeps {
|
|
41
|
+
createCanvas: (width: number, height: number) => CanvasLike;
|
|
42
|
+
Image: Window['Image'];
|
|
43
|
+
}
|
|
44
|
+
export interface RenderBusinessLicenseResult {
|
|
45
|
+
canvas: CanvasLike;
|
|
46
|
+
}
|
|
47
|
+
export declare function renderBusinessLicense(profile: GeneratedBusinessLicenseProfile, deps: RenderBusinessLicenseDeps, options?: RenderBusinessLicenseOptions): RenderBusinessLicenseResult;
|
|
@@ -0,0 +1,187 @@
|
|
|
1
|
+
function drawRoundedRect(ctx, x, y, w, h, r) {
|
|
2
|
+
if (ctx.beginPath) {
|
|
3
|
+
ctx.beginPath();
|
|
4
|
+
}
|
|
5
|
+
ctx.moveTo?.(x + r, y);
|
|
6
|
+
ctx.arc(x + w - r, y + r, r, Math.PI * 1.5, 0);
|
|
7
|
+
ctx.lineTo?.(x + w, y + h - r);
|
|
8
|
+
ctx.arc(x + w - r, y + h - r, r, 0, Math.PI * 0.5);
|
|
9
|
+
ctx.lineTo?.(x + r, y + h);
|
|
10
|
+
ctx.arc(x + r, y + h - r, r, Math.PI * 0.5, Math.PI);
|
|
11
|
+
ctx.lineTo?.(x, y + r);
|
|
12
|
+
ctx.arc(x + r, y + r, r, Math.PI, Math.PI * 1.5);
|
|
13
|
+
if (ctx.closePath) {
|
|
14
|
+
ctx.closePath();
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
function drawLabelAndValue(ctx, label, value, x, y, fonts, spacing = 16) {
|
|
18
|
+
ctx.font = fonts.label;
|
|
19
|
+
const labelWidth = ctx.measureText(label).width;
|
|
20
|
+
ctx.fillText(label, x, y);
|
|
21
|
+
ctx.font = fonts.value;
|
|
22
|
+
ctx.fillText(value, x + labelWidth + spacing, y);
|
|
23
|
+
}
|
|
24
|
+
function drawCenteredText(ctx, text, y, font, canvasWidth, xShift = 0) {
|
|
25
|
+
ctx.font = font;
|
|
26
|
+
const w = ctx.measureText(text).width;
|
|
27
|
+
const x = (canvasWidth - w) / 2 + xShift;
|
|
28
|
+
ctx.fillText(text, x, y);
|
|
29
|
+
}
|
|
30
|
+
function drawMultilineText(ctx, text, x, y, maxWidth, lineHeight) {
|
|
31
|
+
const chars = text.split('');
|
|
32
|
+
let line = '';
|
|
33
|
+
let currentY = y;
|
|
34
|
+
for (const ch of chars) {
|
|
35
|
+
const test = line + ch;
|
|
36
|
+
const testWidth = ctx.measureText(test).width;
|
|
37
|
+
if (testWidth > maxWidth && line.length > 0) {
|
|
38
|
+
ctx.fillText(line, x, currentY);
|
|
39
|
+
currentY += lineHeight;
|
|
40
|
+
line = ch;
|
|
41
|
+
}
|
|
42
|
+
else {
|
|
43
|
+
line = test;
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
if (line) {
|
|
47
|
+
ctx.fillText(line, x, currentY);
|
|
48
|
+
currentY += lineHeight;
|
|
49
|
+
}
|
|
50
|
+
return currentY;
|
|
51
|
+
}
|
|
52
|
+
function calculateBusinessLicenseHeight(ctx, profile, companyName, padding, titleTopMargin, leftX, labelFont, valueFont, lineHeight) {
|
|
53
|
+
let height = padding + titleTopMargin + 60;
|
|
54
|
+
const borderTopMargin = padding + titleTopMargin + 60;
|
|
55
|
+
let currentY = borderTopMargin + 40;
|
|
56
|
+
currentY += 60;
|
|
57
|
+
currentY += lineHeight + 10 + lineHeight + 10;
|
|
58
|
+
ctx.font = labelFont;
|
|
59
|
+
const addressLabelWidth = ctx.measureText('住所').width;
|
|
60
|
+
ctx.font = valueFont;
|
|
61
|
+
const addressStartX = leftX + addressLabelWidth + 30;
|
|
62
|
+
const addressMaxWidth = 856 - addressStartX - padding - 60;
|
|
63
|
+
const addressHeight = calculateMultilineHeight(ctx, profile.address, addressMaxWidth, lineHeight + 5);
|
|
64
|
+
currentY += Math.max(lineHeight + 10, addressHeight + 15);
|
|
65
|
+
currentY += (lineHeight + 10) * 4;
|
|
66
|
+
ctx.font = labelFont;
|
|
67
|
+
const scopeLabelWidth = ctx.measureText('经营范围').width;
|
|
68
|
+
ctx.font = valueFont;
|
|
69
|
+
const scopeStartX = leftX + scopeLabelWidth + 30;
|
|
70
|
+
const scopeMaxWidth = 856 - scopeStartX - padding - 60;
|
|
71
|
+
const scopeHeight = calculateMultilineHeight(ctx, profile.businessScope, scopeMaxWidth, lineHeight + 5);
|
|
72
|
+
currentY += Math.max(lineHeight + 10, scopeHeight + 15);
|
|
73
|
+
currentY += (lineHeight + 10) * 2;
|
|
74
|
+
height = currentY + padding + 40;
|
|
75
|
+
return height;
|
|
76
|
+
}
|
|
77
|
+
function calculateMultilineHeight(ctx, text, maxWidth, lineHeight) {
|
|
78
|
+
const chars = text.split('');
|
|
79
|
+
let line = '';
|
|
80
|
+
let lines = 0;
|
|
81
|
+
for (const ch of chars) {
|
|
82
|
+
const test = line + ch;
|
|
83
|
+
const testWidth = ctx.measureText(test).width;
|
|
84
|
+
if (testWidth > maxWidth && line.length > 0) {
|
|
85
|
+
lines++;
|
|
86
|
+
line = ch;
|
|
87
|
+
}
|
|
88
|
+
else {
|
|
89
|
+
line = test;
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
if (line)
|
|
93
|
+
lines++;
|
|
94
|
+
return lines * lineHeight;
|
|
95
|
+
}
|
|
96
|
+
export function renderBusinessLicense(profile, deps, options = {}) {
|
|
97
|
+
const WIDTH = 856;
|
|
98
|
+
const companyName = options.companyName ?? profile.companyName;
|
|
99
|
+
const tempCanvas = deps.createCanvas(WIDTH, 1000);
|
|
100
|
+
const tempCtx = tempCanvas.getContext('2d');
|
|
101
|
+
const padding = 40;
|
|
102
|
+
const titleTopMargin = 80;
|
|
103
|
+
const leftX = padding + 50;
|
|
104
|
+
const labelFont = 'bold 28px "Microsoft YaHei", "SimHei", "PingFang SC", "Hiragino Sans GB", "WenQuanYi Micro Hei", sans-serif';
|
|
105
|
+
const valueFont = '28px "Microsoft YaHei", "SimHei", "PingFang SC", "Hiragino Sans GB", "WenQuanYi Micro Hei", sans-serif';
|
|
106
|
+
const lineHeight = 38;
|
|
107
|
+
tempCtx.font = valueFont;
|
|
108
|
+
const calculatedHeight = calculateBusinessLicenseHeight(tempCtx, profile, companyName, padding, titleTopMargin, leftX, labelFont, valueFont, lineHeight);
|
|
109
|
+
const HEIGHT = Math.max(800, Math.ceil(calculatedHeight));
|
|
110
|
+
const canvas = deps.createCanvas(WIDTH, HEIGHT);
|
|
111
|
+
const ctx = canvas.getContext('2d');
|
|
112
|
+
ctx.textBaseline = 'alphabetic';
|
|
113
|
+
ctx.textAlign = 'left';
|
|
114
|
+
ctx.fillStyle = '#f8f9fa';
|
|
115
|
+
ctx.fillRect(0, 0, WIDTH, HEIGHT);
|
|
116
|
+
ctx.save();
|
|
117
|
+
drawRoundedRect(ctx, padding, padding, WIDTH - padding * 2, HEIGHT - padding * 2, 8);
|
|
118
|
+
ctx.fillStyle = '#ffffff';
|
|
119
|
+
if (ctx.fill) {
|
|
120
|
+
ctx.fill();
|
|
121
|
+
}
|
|
122
|
+
ctx.restore();
|
|
123
|
+
ctx.fillStyle = '#000000';
|
|
124
|
+
ctx.font = 'bold 48px "Microsoft YaHei", "SimHei", "PingFang SC", "Hiragino Sans GB", "WenQuanYi Micro Hei", sans-serif';
|
|
125
|
+
drawCenteredText(ctx, '营业执照', padding + titleTopMargin, 'bold 48px "Microsoft YaHei", "SimHei", "PingFang SC", "Hiragino Sans GB", "WenQuanYi Micro Hei", sans-serif', WIDTH);
|
|
126
|
+
ctx.strokeStyle = '#b0b0b0';
|
|
127
|
+
ctx.lineWidth = 3;
|
|
128
|
+
const innerPadding = padding + 20;
|
|
129
|
+
const borderTopMargin = padding + titleTopMargin + 60;
|
|
130
|
+
const borderHeight = HEIGHT - borderTopMargin - padding - 30;
|
|
131
|
+
ctx.strokeRect(innerPadding, borderTopMargin, WIDTH - innerPadding * 2, borderHeight);
|
|
132
|
+
const yOffset = borderTopMargin + 40;
|
|
133
|
+
let currentY = yOffset;
|
|
134
|
+
ctx.fillStyle = '#000000';
|
|
135
|
+
ctx.font = 'bold 28px "Microsoft YaHei", "SimHei", "PingFang SC", "Hiragino Sans GB", "WenQuanYi Micro Hei", monospace';
|
|
136
|
+
ctx.fillText('统一社会信用代码', leftX, currentY);
|
|
137
|
+
ctx.font = 'bold 30px "Microsoft YaHei", "SimHei", "PingFang SC", "Hiragino Sans GB", "WenQuanYi Micro Hei", monospace';
|
|
138
|
+
const creditCodeX = leftX + 280;
|
|
139
|
+
ctx.fillText(profile.creditCode, creditCodeX, currentY);
|
|
140
|
+
currentY += 60;
|
|
141
|
+
ctx.strokeStyle = '#e0e0e0';
|
|
142
|
+
ctx.lineWidth = 1;
|
|
143
|
+
if (ctx.beginPath && ctx.moveTo && ctx.lineTo && ctx.stroke) {
|
|
144
|
+
ctx.beginPath();
|
|
145
|
+
ctx.moveTo(leftX, currentY - 10);
|
|
146
|
+
ctx.lineTo(WIDTH - padding - 20, currentY - 10);
|
|
147
|
+
ctx.stroke();
|
|
148
|
+
}
|
|
149
|
+
currentY += 20;
|
|
150
|
+
ctx.fillStyle = '#000000';
|
|
151
|
+
drawLabelAndValue(ctx, '名称', companyName, leftX, currentY, { label: labelFont, value: valueFont }, 30);
|
|
152
|
+
currentY += lineHeight + 10;
|
|
153
|
+
drawLabelAndValue(ctx, '类型', profile.companyType, leftX, currentY, { label: labelFont, value: valueFont }, 30);
|
|
154
|
+
currentY += lineHeight + 10;
|
|
155
|
+
ctx.font = labelFont;
|
|
156
|
+
const addressLabel = '住所';
|
|
157
|
+
const addressLabelWidth = ctx.measureText(addressLabel).width;
|
|
158
|
+
ctx.fillText(addressLabel, leftX, currentY);
|
|
159
|
+
ctx.font = valueFont;
|
|
160
|
+
const addressStartX = leftX + addressLabelWidth + 30;
|
|
161
|
+
const addressMaxWidth = WIDTH - addressStartX - padding - 20;
|
|
162
|
+
currentY = drawMultilineText(ctx, profile.address, addressStartX, currentY, addressMaxWidth, lineHeight + 5);
|
|
163
|
+
currentY += 15;
|
|
164
|
+
drawLabelAndValue(ctx, '法定代表人', profile.legalRepresentative, leftX, currentY, { label: labelFont, value: valueFont }, 30);
|
|
165
|
+
currentY += lineHeight + 10;
|
|
166
|
+
drawLabelAndValue(ctx, '注册资本', profile.registeredCapital, leftX, currentY, { label: labelFont, value: valueFont }, 30);
|
|
167
|
+
currentY += lineHeight + 10;
|
|
168
|
+
drawLabelAndValue(ctx, '成立日期', profile.establishDate, leftX, currentY, { label: labelFont, value: valueFont }, 30);
|
|
169
|
+
currentY += lineHeight + 10;
|
|
170
|
+
drawLabelAndValue(ctx, '营业期限', profile.businessTerm, leftX, currentY, { label: labelFont, value: valueFont }, 30);
|
|
171
|
+
currentY += lineHeight + 10;
|
|
172
|
+
ctx.font = labelFont;
|
|
173
|
+
const scopeLabel = '经营范围';
|
|
174
|
+
const scopeLabelWidth = ctx.measureText(scopeLabel).width;
|
|
175
|
+
ctx.fillText(scopeLabel, leftX, currentY);
|
|
176
|
+
ctx.font = valueFont;
|
|
177
|
+
const scopeStartX = leftX + scopeLabelWidth + 30;
|
|
178
|
+
const scopeMaxWidth = WIDTH - scopeStartX - padding - 20;
|
|
179
|
+
currentY = drawMultilineText(ctx, profile.businessScope, scopeStartX, currentY, scopeMaxWidth, lineHeight + 5);
|
|
180
|
+
currentY += 15;
|
|
181
|
+
drawLabelAndValue(ctx, '登记机关', profile.registrationAuthority, leftX, currentY, { label: labelFont, value: valueFont }, 30);
|
|
182
|
+
currentY += lineHeight + 10;
|
|
183
|
+
drawLabelAndValue(ctx, '登记日期', profile.registrationDate, leftX, currentY, { label: labelFont, value: valueFont }, 30);
|
|
184
|
+
currentY += lineHeight + 10;
|
|
185
|
+
return { canvas };
|
|
186
|
+
}
|
|
187
|
+
//# sourceMappingURL=renderBusinessLicense.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"renderBusinessLicense.js","sourceRoot":"","sources":["../../../src/functions/image/renderBusinessLicense.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import type { GeneratedDrivingLicenseProfile } from '../validation/generateFakeDrivingLicense';
|
|
2
|
+
import type { Window } from '../../../references/browser.d';
|
|
3
|
+
export interface RenderDrivingLicenseOptions {
|
|
4
|
+
owner?: string;
|
|
5
|
+
}
|
|
6
|
+
export interface Canvas2DContextLike {
|
|
7
|
+
fillStyle: string | CanvasGradientLike;
|
|
8
|
+
strokeStyle: string;
|
|
9
|
+
lineWidth: number;
|
|
10
|
+
font: string;
|
|
11
|
+
textBaseline: string;
|
|
12
|
+
textAlign: string;
|
|
13
|
+
moveTo?: (x: number, y: number) => void;
|
|
14
|
+
lineTo?: (x: number, y: number) => void;
|
|
15
|
+
fill?: () => void;
|
|
16
|
+
stroke?: () => void;
|
|
17
|
+
drawImage: (...args: any[]) => void;
|
|
18
|
+
fillRect: (x: number, y: number, w: number, h: number) => void;
|
|
19
|
+
strokeRect: (x: number, y: number, w: number, h: number) => void;
|
|
20
|
+
fillText: (text: string, x: number, y: number) => void;
|
|
21
|
+
measureText: (text: string) => {
|
|
22
|
+
width: number;
|
|
23
|
+
};
|
|
24
|
+
beginPath: () => void;
|
|
25
|
+
arc: (x: number, y: number, r: number, sAngle: number, eAngle: number) => void;
|
|
26
|
+
closePath: () => void;
|
|
27
|
+
clip: () => void;
|
|
28
|
+
save: () => void;
|
|
29
|
+
restore: () => void;
|
|
30
|
+
createLinearGradient: (x0: number, y0: number, x1: number, y1: number) => CanvasGradientLike;
|
|
31
|
+
}
|
|
32
|
+
export interface CanvasGradientLike {
|
|
33
|
+
addColorStop: (offset: number, color: string) => void;
|
|
34
|
+
}
|
|
35
|
+
export interface CanvasLike {
|
|
36
|
+
width: number;
|
|
37
|
+
height: number;
|
|
38
|
+
getContext: (type: '2d') => Canvas2DContextLike;
|
|
39
|
+
}
|
|
40
|
+
export interface RenderDrivingLicenseDeps {
|
|
41
|
+
createCanvas: (width: number, height: number) => CanvasLike;
|
|
42
|
+
Image: Window['Image'];
|
|
43
|
+
}
|
|
44
|
+
export interface RenderDrivingLicenseResult {
|
|
45
|
+
front: CanvasLike;
|
|
46
|
+
back: CanvasLike;
|
|
47
|
+
}
|
|
48
|
+
export declare function renderDrivingLicense(profile: GeneratedDrivingLicenseProfile, deps: RenderDrivingLicenseDeps, options?: RenderDrivingLicenseOptions): RenderDrivingLicenseResult;
|