ste-canvas-poster 1.0.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/CHANGELOG.md +20 -0
- package/LICENSE +15 -0
- package/README.md +543 -0
- package/index.d.ts +23 -0
- package/index.js +4 -0
- package/package.json +143 -0
- package/src/measureText.js +53 -0
- package/src/posterAdapter.js +400 -0
- package/src/posterEngine.js +946 -0
- package/src/qrcodeGenerator.js +533 -0
- package/types.d.ts +198 -0
package/types.d.ts
ADDED
|
@@ -0,0 +1,198 @@
|
|
|
1
|
+
// ste-canvas-poster 类型声明 v0.0.1
|
|
2
|
+
|
|
3
|
+
// ─────────────────────────────────────────────
|
|
4
|
+
// CSS 属性类型
|
|
5
|
+
// ─────────────────────────────────────────────
|
|
6
|
+
|
|
7
|
+
/** padding 值:四边相同 / [上下, 左右] / [上, 右, 下, 左] */
|
|
8
|
+
export type PaddingValue = number | [number, number] | [number, number, number, number];
|
|
9
|
+
|
|
10
|
+
/** borderRadius 值:四角相同 / [左上, 右上, 右下, 左下] */
|
|
11
|
+
export type BorderRadiusValue = number | [number, number, number, number];
|
|
12
|
+
|
|
13
|
+
/** 字重:关键字或数字 */
|
|
14
|
+
export type FontWeight = 'normal' | 'bold' | '400' | '700' | number;
|
|
15
|
+
|
|
16
|
+
/** 对齐方式 */
|
|
17
|
+
export type TextAlign = 'left' | 'center' | 'right';
|
|
18
|
+
|
|
19
|
+
/** Flex 方向 */
|
|
20
|
+
export type FlexDirection = 'row' | 'column';
|
|
21
|
+
|
|
22
|
+
/** Flex 交叉轴对齐 */
|
|
23
|
+
export type AlignItems = 'flex-start' | 'center' | 'flex-end';
|
|
24
|
+
|
|
25
|
+
/** Flex 主轴对齐 */
|
|
26
|
+
export type JustifyContent = 'flex-start' | 'center' | 'space-between';
|
|
27
|
+
|
|
28
|
+
/** objectFit 模式 */
|
|
29
|
+
export type ObjectFit = 'fill' | 'cover' | 'contain';
|
|
30
|
+
|
|
31
|
+
/** 背景色或渐变字符串 */
|
|
32
|
+
export type BackgroundValue = string;
|
|
33
|
+
|
|
34
|
+
/** 模板变量字符串,如 '{{key}}' */
|
|
35
|
+
export type TemplateString = string;
|
|
36
|
+
|
|
37
|
+
// ─────────────────────────────────────────────
|
|
38
|
+
// 通用 CSS 属性(所有元素共享)
|
|
39
|
+
// ─────────────────────────────────────────────
|
|
40
|
+
|
|
41
|
+
export interface CommonCss {
|
|
42
|
+
left?: number;
|
|
43
|
+
top?: number;
|
|
44
|
+
right?: number;
|
|
45
|
+
bottom?: number;
|
|
46
|
+
width?: number;
|
|
47
|
+
height?: number;
|
|
48
|
+
opacity?: number;
|
|
49
|
+
borderRadius?: BorderRadiusValue;
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
// ─────────────────────────────────────────────
|
|
53
|
+
// 各元素 CSS 属性
|
|
54
|
+
// ─────────────────────────────────────────────
|
|
55
|
+
|
|
56
|
+
export interface ViewCss extends CommonCss {
|
|
57
|
+
background?: BackgroundValue;
|
|
58
|
+
backgroundColor?: BackgroundValue;
|
|
59
|
+
borderWidth?: number;
|
|
60
|
+
borderColor?: string;
|
|
61
|
+
display?: 'flex';
|
|
62
|
+
flexDirection?: FlexDirection;
|
|
63
|
+
alignItems?: AlignItems;
|
|
64
|
+
justifyContent?: JustifyContent;
|
|
65
|
+
padding?: PaddingValue;
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
export interface ImageCss extends CommonCss {
|
|
69
|
+
objectFit?: ObjectFit;
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
export interface TextCss extends CommonCss {
|
|
73
|
+
fontSize?: number;
|
|
74
|
+
fontWeight?: FontWeight;
|
|
75
|
+
fontFamily?: string;
|
|
76
|
+
color?: string;
|
|
77
|
+
textAlign?: TextAlign;
|
|
78
|
+
lineHeight?: number;
|
|
79
|
+
maxWidth?: number;
|
|
80
|
+
ellipsis?: boolean;
|
|
81
|
+
lines?: number;
|
|
82
|
+
textDecoration?: 'line-through' | 'none';
|
|
83
|
+
background?: BackgroundValue;
|
|
84
|
+
backgroundColor?: BackgroundValue;
|
|
85
|
+
padding?: PaddingValue;
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
export interface QrcodeCss extends CommonCss {
|
|
89
|
+
color?: string;
|
|
90
|
+
background?: BackgroundValue;
|
|
91
|
+
backgroundColor?: BackgroundValue;
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
// ─────────────────────────────────────────────
|
|
95
|
+
// Flex 子元素 margin
|
|
96
|
+
// ─────────────────────────────────────────────
|
|
97
|
+
|
|
98
|
+
export interface FlexChildCss {
|
|
99
|
+
marginLeft?: number;
|
|
100
|
+
marginRight?: number;
|
|
101
|
+
marginTop?: number;
|
|
102
|
+
marginBottom?: number;
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
// ─────────────────────────────────────────────
|
|
106
|
+
// Schema 视图节点
|
|
107
|
+
// ─────────────────────────────────────────────
|
|
108
|
+
|
|
109
|
+
export interface ViewNode {
|
|
110
|
+
type: 'view';
|
|
111
|
+
css?: ViewCss & FlexChildCss;
|
|
112
|
+
views?: SchemaNode[];
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
export interface ImageNode {
|
|
116
|
+
type: 'image';
|
|
117
|
+
src: string | TemplateString;
|
|
118
|
+
css?: ImageCss & FlexChildCss;
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
export interface TextNode {
|
|
122
|
+
type: 'text';
|
|
123
|
+
text: string | TemplateString;
|
|
124
|
+
css?: TextCss & FlexChildCss;
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
export interface QrcodeNode {
|
|
128
|
+
type: 'qrcode';
|
|
129
|
+
text?: string | TemplateString;
|
|
130
|
+
src?: string | TemplateString;
|
|
131
|
+
css?: QrcodeCss & FlexChildCss;
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
export type SchemaNode = ViewNode | ImageNode | TextNode | QrcodeNode;
|
|
135
|
+
|
|
136
|
+
// ─────────────────────────────────────────────
|
|
137
|
+
// 根 Schema
|
|
138
|
+
// ─────────────────────────────────────────────
|
|
139
|
+
|
|
140
|
+
export interface PosterSchema {
|
|
141
|
+
width: number;
|
|
142
|
+
height: number;
|
|
143
|
+
borderRadius?: number;
|
|
144
|
+
background?: BackgroundValue;
|
|
145
|
+
backgroundColor?: BackgroundValue;
|
|
146
|
+
backgroundImage?: string | TemplateString;
|
|
147
|
+
views: SchemaNode[];
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
// ─────────────────────────────────────────────
|
|
151
|
+
// 模板变量数据
|
|
152
|
+
// ─────────────────────────────────────────────
|
|
153
|
+
|
|
154
|
+
export type TemplateData = Record<string, string | number | boolean | undefined | null>;
|
|
155
|
+
|
|
156
|
+
// ─────────────────────────────────────────────
|
|
157
|
+
// renderPoster 选项
|
|
158
|
+
// ─────────────────────────────────────────────
|
|
159
|
+
|
|
160
|
+
export interface RenderPosterOptions {
|
|
161
|
+
schema: PosterSchema;
|
|
162
|
+
data?: TemplateData;
|
|
163
|
+
selector: string;
|
|
164
|
+
vm: Record<string, any>;
|
|
165
|
+
dpr?: number;
|
|
166
|
+
useRpx?: boolean;
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
// ─────────────────────────────────────────────
|
|
170
|
+
// toTempFilePath 选项
|
|
171
|
+
// ─────────────────────────────────────────────
|
|
172
|
+
|
|
173
|
+
export interface ToTempFilePathOptions {
|
|
174
|
+
fileType?: 'png' | 'jpg';
|
|
175
|
+
quality?: number;
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
// ─────────────────────────────────────────────
|
|
179
|
+
// PosterEngine 类
|
|
180
|
+
// ─────────────────────────────────────────────
|
|
181
|
+
|
|
182
|
+
export declare class PosterEngine {
|
|
183
|
+
canvas: any;
|
|
184
|
+
ctx: CanvasRenderingContext2D;
|
|
185
|
+
schema: PosterSchema;
|
|
186
|
+
data: TemplateData;
|
|
187
|
+
dpr: number;
|
|
188
|
+
|
|
189
|
+
constructor(options: { canvas: any; schema: PosterSchema; data?: TemplateData; dpr?: number });
|
|
190
|
+
|
|
191
|
+
render(): Promise<void>;
|
|
192
|
+
|
|
193
|
+
toTempFilePath(options?: ToTempFilePathOptions): Promise<string>;
|
|
194
|
+
|
|
195
|
+
saveToAlbum(): Promise<string>;
|
|
196
|
+
|
|
197
|
+
destroy(): void;
|
|
198
|
+
}
|