@codehz/draw-call 0.1.0 → 0.1.2

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/canvas.d.cts ADDED
@@ -0,0 +1,304 @@
1
+ //#region src/types/base.d.ts
2
+ type Size = number | `${number}%` | "auto" | "fill";
3
+ interface ColorStop {
4
+ offset: number;
5
+ color: string;
6
+ }
7
+ interface LinearGradientDescriptor {
8
+ type: "linear-gradient";
9
+ angle: number;
10
+ stops: ColorStop[];
11
+ }
12
+ interface RadialGradientDescriptor {
13
+ type: "radial-gradient";
14
+ startX?: number;
15
+ startY?: number;
16
+ startRadius?: number;
17
+ endX?: number;
18
+ endY?: number;
19
+ endRadius?: number;
20
+ stops: ColorStop[];
21
+ }
22
+ type GradientDescriptor = LinearGradientDescriptor | RadialGradientDescriptor;
23
+ type Color = string | CanvasGradient | CanvasPattern | GradientDescriptor;
24
+ declare function linearGradient(angle: number, ...stops: (string | [number, string])[]): LinearGradientDescriptor;
25
+ declare function radialGradient(options: {
26
+ startX?: number;
27
+ startY?: number;
28
+ startRadius?: number;
29
+ endX?: number;
30
+ endY?: number;
31
+ endRadius?: number;
32
+ }, ...stops: (string | [number, string])[]): RadialGradientDescriptor;
33
+ interface Spacing {
34
+ top?: number;
35
+ right?: number;
36
+ bottom?: number;
37
+ left?: number;
38
+ }
39
+ interface Border {
40
+ width?: number;
41
+ color?: Color;
42
+ radius?: number | [number, number, number, number];
43
+ }
44
+ interface Shadow {
45
+ offsetX?: number;
46
+ offsetY?: number;
47
+ blur?: number;
48
+ color?: Color;
49
+ }
50
+ interface FontProps {
51
+ family?: string;
52
+ size?: number;
53
+ weight?: number | "normal" | "bold";
54
+ style?: "normal" | "italic";
55
+ }
56
+ interface StrokeProps {
57
+ color: Color;
58
+ width: number;
59
+ dash?: number[];
60
+ cap?: "butt" | "round" | "square";
61
+ join?: "miter" | "round" | "bevel";
62
+ }
63
+ interface Bounds {
64
+ x: number;
65
+ y: number;
66
+ width: number;
67
+ height: number;
68
+ }
69
+ //#endregion
70
+ //#region src/types/layout.d.ts
71
+ type FlexDirection = "row" | "column" | "row-reverse" | "column-reverse";
72
+ type JustifyContent = "start" | "end" | "center" | "space-between" | "space-around" | "space-evenly";
73
+ type AlignItems = "start" | "end" | "center" | "stretch" | "baseline";
74
+ type AlignSelf = "auto" | AlignItems;
75
+ interface LayoutProps {
76
+ width?: Size;
77
+ height?: Size;
78
+ minWidth?: number;
79
+ maxWidth?: number;
80
+ minHeight?: number;
81
+ maxHeight?: number;
82
+ margin?: number | Spacing;
83
+ padding?: number | Spacing;
84
+ flex?: number;
85
+ alignSelf?: AlignSelf;
86
+ }
87
+ interface ContainerLayoutProps extends LayoutProps {
88
+ direction?: FlexDirection;
89
+ justify?: JustifyContent;
90
+ align?: AlignItems;
91
+ gap?: number;
92
+ wrap?: boolean;
93
+ }
94
+ interface ComputedLayout {
95
+ x: number;
96
+ y: number;
97
+ width: number;
98
+ height: number;
99
+ contentX: number;
100
+ contentY: number;
101
+ contentWidth: number;
102
+ contentHeight: number;
103
+ }
104
+ interface LayoutNode {
105
+ element: Element;
106
+ layout: ComputedLayout;
107
+ children: LayoutNode[];
108
+ lines?: string[];
109
+ lineOffsets?: number[];
110
+ }
111
+ interface LayoutConstraints {
112
+ minWidth: number;
113
+ maxWidth: number;
114
+ minHeight: number;
115
+ maxHeight: number;
116
+ }
117
+ //#endregion
118
+ //#region src/types/components.d.ts
119
+ type ElementType = "box" | "text" | "image" | "svg" | "stack";
120
+ interface ElementBase {
121
+ type: ElementType;
122
+ }
123
+ interface BoxProps extends ContainerLayoutProps {
124
+ background?: Color;
125
+ border?: Border;
126
+ shadow?: Shadow;
127
+ opacity?: number;
128
+ clip?: boolean;
129
+ children?: Element[];
130
+ }
131
+ interface BoxElement extends ElementBase, BoxProps {
132
+ type: "box";
133
+ }
134
+ interface TextProps extends LayoutProps {
135
+ content: string;
136
+ font?: FontProps;
137
+ color?: Color;
138
+ align?: "left" | "center" | "right";
139
+ verticalAlign?: "top" | "middle" | "bottom";
140
+ lineHeight?: number;
141
+ maxLines?: number;
142
+ ellipsis?: boolean;
143
+ wrap?: boolean;
144
+ shadow?: Shadow;
145
+ stroke?: StrokeProps;
146
+ }
147
+ interface TextElement extends ElementBase, TextProps {
148
+ type: "text";
149
+ }
150
+ interface ImageProps extends LayoutProps {
151
+ src: ImageBitmap | CanvasImageSource;
152
+ fit?: "contain" | "cover" | "fill" | "none" | "scale-down";
153
+ position?: {
154
+ x?: "left" | "center" | "right" | number;
155
+ y?: "top" | "center" | "bottom" | number;
156
+ };
157
+ border?: Border;
158
+ shadow?: Shadow;
159
+ opacity?: number;
160
+ }
161
+ interface ImageElement extends ElementBase, ImageProps {
162
+ type: "image";
163
+ }
164
+ interface SvgStyleProps {
165
+ fill?: Color | "none";
166
+ stroke?: StrokeProps;
167
+ opacity?: number;
168
+ }
169
+ interface SvgTransformProps {
170
+ transform?: {
171
+ translate?: [number, number];
172
+ rotate?: number | [number, number, number];
173
+ scale?: number | [number, number];
174
+ skewX?: number;
175
+ skewY?: number;
176
+ matrix?: [number, number, number, number, number, number];
177
+ };
178
+ }
179
+ interface SvgRectChild extends SvgStyleProps, SvgTransformProps {
180
+ type: "rect";
181
+ x?: number;
182
+ y?: number;
183
+ width: number;
184
+ height: number;
185
+ rx?: number;
186
+ ry?: number;
187
+ }
188
+ interface SvgCircleChild extends SvgStyleProps, SvgTransformProps {
189
+ type: "circle";
190
+ cx: number;
191
+ cy: number;
192
+ r: number;
193
+ }
194
+ interface SvgEllipseChild extends SvgStyleProps, SvgTransformProps {
195
+ type: "ellipse";
196
+ cx: number;
197
+ cy: number;
198
+ rx: number;
199
+ ry: number;
200
+ }
201
+ interface SvgLineChild extends SvgStyleProps, SvgTransformProps {
202
+ type: "line";
203
+ x1: number;
204
+ y1: number;
205
+ x2: number;
206
+ y2: number;
207
+ }
208
+ interface SvgPolylineChild extends SvgStyleProps, SvgTransformProps {
209
+ type: "polyline";
210
+ points: [number, number][];
211
+ }
212
+ interface SvgPolygonChild extends SvgStyleProps, SvgTransformProps {
213
+ type: "polygon";
214
+ points: [number, number][];
215
+ }
216
+ interface SvgPathChild extends SvgStyleProps, SvgTransformProps {
217
+ type: "path";
218
+ d: string;
219
+ }
220
+ interface SvgTextChild extends SvgStyleProps, SvgTransformProps {
221
+ type: "text";
222
+ x?: number;
223
+ y?: number;
224
+ content: string;
225
+ font?: FontProps;
226
+ textAnchor?: "start" | "middle" | "end";
227
+ dominantBaseline?: "auto" | "middle" | "hanging";
228
+ }
229
+ interface SvgGroupChild extends SvgStyleProps, SvgTransformProps {
230
+ type: "g";
231
+ children: SvgChild[];
232
+ }
233
+ type SvgChild = SvgRectChild | SvgCircleChild | SvgEllipseChild | SvgLineChild | SvgPolylineChild | SvgPolygonChild | SvgPathChild | SvgTextChild | SvgGroupChild;
234
+ type SvgAlign = "none" | "xMinYMin" | "xMidYMin" | "xMaxYMin" | "xMinYMid" | "xMidYMid" | "xMaxYMid" | "xMinYMax" | "xMidYMax" | "xMaxYMax";
235
+ interface SvgProps extends LayoutProps {
236
+ viewBox?: {
237
+ x?: number;
238
+ y?: number;
239
+ width: number;
240
+ height: number;
241
+ };
242
+ preserveAspectRatio?: {
243
+ align?: SvgAlign;
244
+ meetOrSlice?: "meet" | "slice";
245
+ };
246
+ children: SvgChild[];
247
+ background?: Color;
248
+ shadow?: Shadow;
249
+ }
250
+ interface SvgElement extends ElementBase, SvgProps {
251
+ type: "svg";
252
+ }
253
+ type StackAlign = "start" | "end" | "center";
254
+ interface StackProps extends LayoutProps {
255
+ children: Element[];
256
+ background?: Color;
257
+ border?: Border;
258
+ shadow?: Shadow;
259
+ opacity?: number;
260
+ clip?: boolean;
261
+ /** 水平对齐方式(默认 start) */
262
+ align?: StackAlign;
263
+ /** 垂直对齐方式(默认 start) */
264
+ justify?: StackAlign;
265
+ }
266
+ interface StackElement extends ElementBase, StackProps {
267
+ type: "stack";
268
+ }
269
+ type Element = BoxElement | TextElement | ImageElement | SvgElement | StackElement;
270
+ //#endregion
271
+ //#region src/canvas.d.ts
272
+ interface CanvasOptions {
273
+ width: number;
274
+ height: number;
275
+ pixelRatio?: number;
276
+ canvas?: {
277
+ getContext(type: "2d"): CanvasRenderingContext2D | null;
278
+ width: number;
279
+ height: number;
280
+ };
281
+ }
282
+ interface LayoutSize {
283
+ width: number;
284
+ height: number;
285
+ }
286
+ interface DrawCallCanvas {
287
+ readonly width: number;
288
+ readonly height: number;
289
+ readonly pixelRatio: number;
290
+ readonly canvas: HTMLCanvasElement;
291
+ render(element: Element): LayoutNode;
292
+ clear(): void;
293
+ getContext(): CanvasRenderingContext2D;
294
+ toDataURL(type?: string, quality?: number): string;
295
+ toBuffer(type?: "image/png" | "image/jpeg"): Buffer;
296
+ }
297
+ /**
298
+ * 创建适用于浏览器环境的 Canvas
299
+ *
300
+ * 在浏览器环境中使用,支持传入已有的 canvas 实例
301
+ */
302
+ declare function createCanvas(options: CanvasOptions): DrawCallCanvas;
303
+ //#endregion
304
+ export { AlignItems as A, Color as B, SvgProps as C, SvgTransformProps as D, SvgTextChild as E, LayoutConstraints as F, RadialGradientDescriptor as G, FontProps as H, LayoutNode as I, Spacing as J, Shadow as K, LayoutProps as L, ContainerLayoutProps as M, FlexDirection as N, TextElement as O, JustifyContent as P, Border as R, SvgPolylineChild as S, SvgStyleProps as T, GradientDescriptor as U, ColorStop as V, LinearGradientDescriptor as W, linearGradient as X, StrokeProps as Y, radialGradient as Z, SvgEllipseChild as _, BoxElement as a, SvgPathChild as b, ImageElement as c, StackElement as d, StackProps as f, SvgElement as g, SvgCircleChild as h, createCanvas as i, AlignSelf as j, TextProps as k, ImageProps as l, SvgChild as m, DrawCallCanvas as n, BoxProps as o, SvgAlign as p, Size as q, LayoutSize as r, Element as s, CanvasOptions as t, StackAlign as u, SvgGroupChild as v, SvgRectChild as w, SvgPolygonChild as x, SvgLineChild as y, Bounds as z };
package/canvas.d.mts ADDED
@@ -0,0 +1,304 @@
1
+ //#region src/types/base.d.ts
2
+ type Size = number | `${number}%` | "auto" | "fill";
3
+ interface ColorStop {
4
+ offset: number;
5
+ color: string;
6
+ }
7
+ interface LinearGradientDescriptor {
8
+ type: "linear-gradient";
9
+ angle: number;
10
+ stops: ColorStop[];
11
+ }
12
+ interface RadialGradientDescriptor {
13
+ type: "radial-gradient";
14
+ startX?: number;
15
+ startY?: number;
16
+ startRadius?: number;
17
+ endX?: number;
18
+ endY?: number;
19
+ endRadius?: number;
20
+ stops: ColorStop[];
21
+ }
22
+ type GradientDescriptor = LinearGradientDescriptor | RadialGradientDescriptor;
23
+ type Color = string | CanvasGradient | CanvasPattern | GradientDescriptor;
24
+ declare function linearGradient(angle: number, ...stops: (string | [number, string])[]): LinearGradientDescriptor;
25
+ declare function radialGradient(options: {
26
+ startX?: number;
27
+ startY?: number;
28
+ startRadius?: number;
29
+ endX?: number;
30
+ endY?: number;
31
+ endRadius?: number;
32
+ }, ...stops: (string | [number, string])[]): RadialGradientDescriptor;
33
+ interface Spacing {
34
+ top?: number;
35
+ right?: number;
36
+ bottom?: number;
37
+ left?: number;
38
+ }
39
+ interface Border {
40
+ width?: number;
41
+ color?: Color;
42
+ radius?: number | [number, number, number, number];
43
+ }
44
+ interface Shadow {
45
+ offsetX?: number;
46
+ offsetY?: number;
47
+ blur?: number;
48
+ color?: Color;
49
+ }
50
+ interface FontProps {
51
+ family?: string;
52
+ size?: number;
53
+ weight?: number | "normal" | "bold";
54
+ style?: "normal" | "italic";
55
+ }
56
+ interface StrokeProps {
57
+ color: Color;
58
+ width: number;
59
+ dash?: number[];
60
+ cap?: "butt" | "round" | "square";
61
+ join?: "miter" | "round" | "bevel";
62
+ }
63
+ interface Bounds {
64
+ x: number;
65
+ y: number;
66
+ width: number;
67
+ height: number;
68
+ }
69
+ //#endregion
70
+ //#region src/types/layout.d.ts
71
+ type FlexDirection = "row" | "column" | "row-reverse" | "column-reverse";
72
+ type JustifyContent = "start" | "end" | "center" | "space-between" | "space-around" | "space-evenly";
73
+ type AlignItems = "start" | "end" | "center" | "stretch" | "baseline";
74
+ type AlignSelf = "auto" | AlignItems;
75
+ interface LayoutProps {
76
+ width?: Size;
77
+ height?: Size;
78
+ minWidth?: number;
79
+ maxWidth?: number;
80
+ minHeight?: number;
81
+ maxHeight?: number;
82
+ margin?: number | Spacing;
83
+ padding?: number | Spacing;
84
+ flex?: number;
85
+ alignSelf?: AlignSelf;
86
+ }
87
+ interface ContainerLayoutProps extends LayoutProps {
88
+ direction?: FlexDirection;
89
+ justify?: JustifyContent;
90
+ align?: AlignItems;
91
+ gap?: number;
92
+ wrap?: boolean;
93
+ }
94
+ interface ComputedLayout {
95
+ x: number;
96
+ y: number;
97
+ width: number;
98
+ height: number;
99
+ contentX: number;
100
+ contentY: number;
101
+ contentWidth: number;
102
+ contentHeight: number;
103
+ }
104
+ interface LayoutNode {
105
+ element: Element;
106
+ layout: ComputedLayout;
107
+ children: LayoutNode[];
108
+ lines?: string[];
109
+ lineOffsets?: number[];
110
+ }
111
+ interface LayoutConstraints {
112
+ minWidth: number;
113
+ maxWidth: number;
114
+ minHeight: number;
115
+ maxHeight: number;
116
+ }
117
+ //#endregion
118
+ //#region src/types/components.d.ts
119
+ type ElementType = "box" | "text" | "image" | "svg" | "stack";
120
+ interface ElementBase {
121
+ type: ElementType;
122
+ }
123
+ interface BoxProps extends ContainerLayoutProps {
124
+ background?: Color;
125
+ border?: Border;
126
+ shadow?: Shadow;
127
+ opacity?: number;
128
+ clip?: boolean;
129
+ children?: Element[];
130
+ }
131
+ interface BoxElement extends ElementBase, BoxProps {
132
+ type: "box";
133
+ }
134
+ interface TextProps extends LayoutProps {
135
+ content: string;
136
+ font?: FontProps;
137
+ color?: Color;
138
+ align?: "left" | "center" | "right";
139
+ verticalAlign?: "top" | "middle" | "bottom";
140
+ lineHeight?: number;
141
+ maxLines?: number;
142
+ ellipsis?: boolean;
143
+ wrap?: boolean;
144
+ shadow?: Shadow;
145
+ stroke?: StrokeProps;
146
+ }
147
+ interface TextElement extends ElementBase, TextProps {
148
+ type: "text";
149
+ }
150
+ interface ImageProps extends LayoutProps {
151
+ src: ImageBitmap | CanvasImageSource;
152
+ fit?: "contain" | "cover" | "fill" | "none" | "scale-down";
153
+ position?: {
154
+ x?: "left" | "center" | "right" | number;
155
+ y?: "top" | "center" | "bottom" | number;
156
+ };
157
+ border?: Border;
158
+ shadow?: Shadow;
159
+ opacity?: number;
160
+ }
161
+ interface ImageElement extends ElementBase, ImageProps {
162
+ type: "image";
163
+ }
164
+ interface SvgStyleProps {
165
+ fill?: Color | "none";
166
+ stroke?: StrokeProps;
167
+ opacity?: number;
168
+ }
169
+ interface SvgTransformProps {
170
+ transform?: {
171
+ translate?: [number, number];
172
+ rotate?: number | [number, number, number];
173
+ scale?: number | [number, number];
174
+ skewX?: number;
175
+ skewY?: number;
176
+ matrix?: [number, number, number, number, number, number];
177
+ };
178
+ }
179
+ interface SvgRectChild extends SvgStyleProps, SvgTransformProps {
180
+ type: "rect";
181
+ x?: number;
182
+ y?: number;
183
+ width: number;
184
+ height: number;
185
+ rx?: number;
186
+ ry?: number;
187
+ }
188
+ interface SvgCircleChild extends SvgStyleProps, SvgTransformProps {
189
+ type: "circle";
190
+ cx: number;
191
+ cy: number;
192
+ r: number;
193
+ }
194
+ interface SvgEllipseChild extends SvgStyleProps, SvgTransformProps {
195
+ type: "ellipse";
196
+ cx: number;
197
+ cy: number;
198
+ rx: number;
199
+ ry: number;
200
+ }
201
+ interface SvgLineChild extends SvgStyleProps, SvgTransformProps {
202
+ type: "line";
203
+ x1: number;
204
+ y1: number;
205
+ x2: number;
206
+ y2: number;
207
+ }
208
+ interface SvgPolylineChild extends SvgStyleProps, SvgTransformProps {
209
+ type: "polyline";
210
+ points: [number, number][];
211
+ }
212
+ interface SvgPolygonChild extends SvgStyleProps, SvgTransformProps {
213
+ type: "polygon";
214
+ points: [number, number][];
215
+ }
216
+ interface SvgPathChild extends SvgStyleProps, SvgTransformProps {
217
+ type: "path";
218
+ d: string;
219
+ }
220
+ interface SvgTextChild extends SvgStyleProps, SvgTransformProps {
221
+ type: "text";
222
+ x?: number;
223
+ y?: number;
224
+ content: string;
225
+ font?: FontProps;
226
+ textAnchor?: "start" | "middle" | "end";
227
+ dominantBaseline?: "auto" | "middle" | "hanging";
228
+ }
229
+ interface SvgGroupChild extends SvgStyleProps, SvgTransformProps {
230
+ type: "g";
231
+ children: SvgChild[];
232
+ }
233
+ type SvgChild = SvgRectChild | SvgCircleChild | SvgEllipseChild | SvgLineChild | SvgPolylineChild | SvgPolygonChild | SvgPathChild | SvgTextChild | SvgGroupChild;
234
+ type SvgAlign = "none" | "xMinYMin" | "xMidYMin" | "xMaxYMin" | "xMinYMid" | "xMidYMid" | "xMaxYMid" | "xMinYMax" | "xMidYMax" | "xMaxYMax";
235
+ interface SvgProps extends LayoutProps {
236
+ viewBox?: {
237
+ x?: number;
238
+ y?: number;
239
+ width: number;
240
+ height: number;
241
+ };
242
+ preserveAspectRatio?: {
243
+ align?: SvgAlign;
244
+ meetOrSlice?: "meet" | "slice";
245
+ };
246
+ children: SvgChild[];
247
+ background?: Color;
248
+ shadow?: Shadow;
249
+ }
250
+ interface SvgElement extends ElementBase, SvgProps {
251
+ type: "svg";
252
+ }
253
+ type StackAlign = "start" | "end" | "center";
254
+ interface StackProps extends LayoutProps {
255
+ children: Element[];
256
+ background?: Color;
257
+ border?: Border;
258
+ shadow?: Shadow;
259
+ opacity?: number;
260
+ clip?: boolean;
261
+ /** 水平对齐方式(默认 start) */
262
+ align?: StackAlign;
263
+ /** 垂直对齐方式(默认 start) */
264
+ justify?: StackAlign;
265
+ }
266
+ interface StackElement extends ElementBase, StackProps {
267
+ type: "stack";
268
+ }
269
+ type Element = BoxElement | TextElement | ImageElement | SvgElement | StackElement;
270
+ //#endregion
271
+ //#region src/canvas.d.ts
272
+ interface CanvasOptions {
273
+ width: number;
274
+ height: number;
275
+ pixelRatio?: number;
276
+ canvas?: {
277
+ getContext(type: "2d"): CanvasRenderingContext2D | null;
278
+ width: number;
279
+ height: number;
280
+ };
281
+ }
282
+ interface LayoutSize {
283
+ width: number;
284
+ height: number;
285
+ }
286
+ interface DrawCallCanvas {
287
+ readonly width: number;
288
+ readonly height: number;
289
+ readonly pixelRatio: number;
290
+ readonly canvas: HTMLCanvasElement;
291
+ render(element: Element): LayoutNode;
292
+ clear(): void;
293
+ getContext(): CanvasRenderingContext2D;
294
+ toDataURL(type?: string, quality?: number): string;
295
+ toBuffer(type?: "image/png" | "image/jpeg"): Buffer;
296
+ }
297
+ /**
298
+ * 创建适用于浏览器环境的 Canvas
299
+ *
300
+ * 在浏览器环境中使用,支持传入已有的 canvas 实例
301
+ */
302
+ declare function createCanvas(options: CanvasOptions): DrawCallCanvas;
303
+ //#endregion
304
+ export { AlignItems as A, Color as B, SvgProps as C, SvgTransformProps as D, SvgTextChild as E, LayoutConstraints as F, RadialGradientDescriptor as G, FontProps as H, LayoutNode as I, Spacing as J, Shadow as K, LayoutProps as L, ContainerLayoutProps as M, FlexDirection as N, TextElement as O, JustifyContent as P, Border as R, SvgPolylineChild as S, SvgStyleProps as T, GradientDescriptor as U, ColorStop as V, LinearGradientDescriptor as W, linearGradient as X, StrokeProps as Y, radialGradient as Z, SvgEllipseChild as _, BoxElement as a, SvgPathChild as b, ImageElement as c, StackElement as d, StackProps as f, SvgElement as g, SvgCircleChild as h, createCanvas as i, AlignSelf as j, TextProps as k, ImageProps as l, SvgChild as m, DrawCallCanvas as n, BoxProps as o, SvgAlign as p, Size as q, LayoutSize as r, Element as s, CanvasOptions as t, StackAlign as u, SvgGroupChild as v, SvgRectChild as w, SvgPolygonChild as x, SvgLineChild as y, Bounds as z };