ml-time-graph 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/LICENSE +32 -0
- package/MKT_AGGREGATE.md +154 -0
- package/README.de.md +154 -0
- package/README.md +152 -0
- package/USAGE.md +343 -0
- package/dist/aggregated_subtypes-DZNZyFTX.d.ts +43 -0
- package/dist/analyze/index.d.ts +296 -0
- package/dist/analyze/index.js +574 -0
- package/dist/index.d.ts +481 -0
- package/dist/index.js +3432 -0
- package/dist/interaction/index.d.ts +141 -0
- package/dist/interaction/index.js +438 -0
- package/dist/internals.d.ts +899 -0
- package/dist/internals.js +2465 -0
- package/dist/layout-Sc5UkC0r.d.ts +246 -0
- package/dist/scale-Cbr0KpPz.d.ts +824 -0
- package/package.json +85 -0
|
@@ -0,0 +1,824 @@
|
|
|
1
|
+
/*!
|
|
2
|
+
* MLTimeGraph — Copyright (c) 2026 Michael Lechner
|
|
3
|
+
* MIT with Attribution: free use incl. commercial requires visible credit to
|
|
4
|
+
* "Michael Lechner". Commercial license (no attribution) on request. See LICENSE.
|
|
5
|
+
*/
|
|
6
|
+
/** Shared SVG/CSS shadow and glow effects for draw commands. */
|
|
7
|
+
interface DrawEffects {
|
|
8
|
+
shadowColor?: string;
|
|
9
|
+
shadowBlur?: number;
|
|
10
|
+
shadowOffsetX?: number;
|
|
11
|
+
shadowOffsetY?: number;
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
/*!
|
|
15
|
+
* MLTimeGraph — Copyright (c) 2026 Michael Lechner
|
|
16
|
+
* MIT with Attribution: free use incl. commercial requires visible credit to
|
|
17
|
+
* "Michael Lechner". Commercial license (no attribution) on request. See LICENSE.
|
|
18
|
+
*/
|
|
19
|
+
/** Gradient-Stop */
|
|
20
|
+
interface GradientStop {
|
|
21
|
+
offset: number;
|
|
22
|
+
color: string;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
/*!
|
|
26
|
+
* MLTimeGraph — Copyright (c) 2026 Michael Lechner
|
|
27
|
+
* MIT with Attribution: free use incl. commercial requires visible credit to
|
|
28
|
+
* "Michael Lechner". Commercial license (no attribution) on request. See LICENSE.
|
|
29
|
+
*/
|
|
30
|
+
/** Koordinaten-Punkt (Pixel) */
|
|
31
|
+
interface Point {
|
|
32
|
+
x: number;
|
|
33
|
+
y: number;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
/*!
|
|
37
|
+
* MLTimeGraph — Copyright (c) 2026 Michael Lechner
|
|
38
|
+
* MIT with Attribution: free use incl. commercial requires visible credit to
|
|
39
|
+
* "Michael Lechner". Commercial license (no attribution) on request. See LICENSE.
|
|
40
|
+
*/
|
|
41
|
+
/** All available line-stroke variants. */
|
|
42
|
+
type LineVariant = "solid" | "dotted" | "sparse-dots" | "dashed" | "long-dash" | "dense-dash" | "dash-dot" | "dash-dot-dot" | "loose-dash";
|
|
43
|
+
|
|
44
|
+
/**
|
|
45
|
+
* Stroke pattern for path / line draw commands. Widened to {@link LineVariant}
|
|
46
|
+
* in Phase 2 (was: `'dashed' | 'dotted'`). The legacy values still work; the
|
|
47
|
+
* renderer keeps their exact visual output (4,4 / 2,4 dashes) for backwards
|
|
48
|
+
* compatibility, and uses `getLineStyle()` to scale newer variants
|
|
49
|
+
* proportionally to the stroke width.
|
|
50
|
+
*/
|
|
51
|
+
type Dashstyle_t = LineVariant;
|
|
52
|
+
interface DrawPath extends DrawEffects {
|
|
53
|
+
type: 'path';
|
|
54
|
+
points: Point[];
|
|
55
|
+
smoothing?: boolean;
|
|
56
|
+
stroke?: string;
|
|
57
|
+
strokeWidth?: number;
|
|
58
|
+
fill?: string;
|
|
59
|
+
hatch?: string;
|
|
60
|
+
dashed?: boolean;
|
|
61
|
+
/** Dash style; overrides `dashed`. */
|
|
62
|
+
dash?: Dashstyle_t;
|
|
63
|
+
opacity?: number;
|
|
64
|
+
/** Optional SVG `id` attribute for this element. */
|
|
65
|
+
id?: string;
|
|
66
|
+
}
|
|
67
|
+
interface DrawLine extends DrawEffects {
|
|
68
|
+
type: 'line';
|
|
69
|
+
x1: number;
|
|
70
|
+
y1: number;
|
|
71
|
+
x2: number;
|
|
72
|
+
y2: number;
|
|
73
|
+
stroke?: string;
|
|
74
|
+
strokeWidth?: number;
|
|
75
|
+
dashed?: boolean;
|
|
76
|
+
/** Dash style; overrides `dashed`. */
|
|
77
|
+
dash?: Dashstyle_t;
|
|
78
|
+
opacity?: number;
|
|
79
|
+
/** Optional SVG `id` attribute for this element. */
|
|
80
|
+
id?: string;
|
|
81
|
+
}
|
|
82
|
+
interface DrawRect extends DrawEffects {
|
|
83
|
+
type: 'rect';
|
|
84
|
+
x: number;
|
|
85
|
+
y: number;
|
|
86
|
+
w: number;
|
|
87
|
+
h: number;
|
|
88
|
+
fill?: string;
|
|
89
|
+
hatch?: string;
|
|
90
|
+
stroke?: string;
|
|
91
|
+
strokeWidth?: number;
|
|
92
|
+
opacity?: number;
|
|
93
|
+
dashed?: boolean;
|
|
94
|
+
/** Optional SVG `id` attribute for this element. */
|
|
95
|
+
id?: string;
|
|
96
|
+
}
|
|
97
|
+
interface DrawCircle extends DrawEffects {
|
|
98
|
+
type: 'circle';
|
|
99
|
+
cx: number;
|
|
100
|
+
cy: number;
|
|
101
|
+
r: number;
|
|
102
|
+
fill?: string;
|
|
103
|
+
hatch?: string;
|
|
104
|
+
stroke?: string;
|
|
105
|
+
strokeWidth?: number;
|
|
106
|
+
/** Optional SVG `id` attribute for this element. */
|
|
107
|
+
id?: string;
|
|
108
|
+
}
|
|
109
|
+
interface DrawText {
|
|
110
|
+
type: 'text';
|
|
111
|
+
content: string;
|
|
112
|
+
x: number;
|
|
113
|
+
y: number;
|
|
114
|
+
anchor?: string;
|
|
115
|
+
fontSize?: number;
|
|
116
|
+
fontFamily?: string;
|
|
117
|
+
fill?: string;
|
|
118
|
+
/** Rotation in degrees, around (x, y). Used e.g. for vertical axis labels. */
|
|
119
|
+
rotate?: number;
|
|
120
|
+
textBaseline?: 'top' | 'middle' | 'bottom';
|
|
121
|
+
/** Optional SVG `id` attribute for this element. */
|
|
122
|
+
id?: string;
|
|
123
|
+
}
|
|
124
|
+
type DrawDirection_t = 'vertical' | 'horizontal';
|
|
125
|
+
interface DrawGradient {
|
|
126
|
+
type: 'gradient';
|
|
127
|
+
points: Point[];
|
|
128
|
+
stops: GradientStop[];
|
|
129
|
+
direction: DrawDirection_t;
|
|
130
|
+
}
|
|
131
|
+
type DrawGapType_t$1 = 'dashed_border' | 'empty' | 'label';
|
|
132
|
+
interface DrawGap {
|
|
133
|
+
type: 'gap';
|
|
134
|
+
x1: number;
|
|
135
|
+
y1: number;
|
|
136
|
+
x2: number;
|
|
137
|
+
y2: number;
|
|
138
|
+
style: DrawGapType_t$1;
|
|
139
|
+
label?: string;
|
|
140
|
+
/** Optional SVG `id` attribute for this element. */
|
|
141
|
+
id?: string;
|
|
142
|
+
}
|
|
143
|
+
interface DrawGroup {
|
|
144
|
+
type: 'group';
|
|
145
|
+
commands: DrawCommand[];
|
|
146
|
+
cssClass?: string;
|
|
147
|
+
/** Optional SVG `id` attribute for this group. */
|
|
148
|
+
id?: string;
|
|
149
|
+
plotClipId?: string;
|
|
150
|
+
/** Plot-area rectangle. When set the SVGRenderer emits a matching `<clipPath>` in \<defs\> and applies `clip-path` to this group. */
|
|
151
|
+
clipRect?: {
|
|
152
|
+
x: number;
|
|
153
|
+
y: number;
|
|
154
|
+
w: number;
|
|
155
|
+
h: number;
|
|
156
|
+
};
|
|
157
|
+
}
|
|
158
|
+
/** Union aller Commands */
|
|
159
|
+
type DrawCommand = DrawPath | DrawLine | DrawRect | DrawCircle | DrawText | DrawGradient | DrawGap | DrawGroup;
|
|
160
|
+
type LineParams = Omit<DrawLine, 'type'>;
|
|
161
|
+
type PathParams = Omit<DrawPath, 'type'>;
|
|
162
|
+
type RectParams = Omit<DrawRect, 'type'>;
|
|
163
|
+
type CircleParams = Omit<DrawCircle, 'type'>;
|
|
164
|
+
type TextParams = Omit<DrawText, 'type'>;
|
|
165
|
+
|
|
166
|
+
/*!
|
|
167
|
+
* MLTimeGraph — Copyright (c) 2026 Michael Lechner
|
|
168
|
+
* MIT with Attribution: free use incl. commercial requires visible credit to
|
|
169
|
+
* "Michael Lechner". Commercial license (no attribution) on request. See LICENSE.
|
|
170
|
+
*/
|
|
171
|
+
/** Point marker style — unified for series points, annotations, and markers. */
|
|
172
|
+
type PointStyleType = "none" | "circle" | "cross" | "square" | "diamond" | "triangle" | "star" | "arrow" | "plus" | "triangle-down" | "hexagon" | "hourglass" | "line-horizontal";
|
|
173
|
+
/** Chart series type (determines which renderer pipeline is used). */
|
|
174
|
+
type SeriesType = "line" | "area" | "step";
|
|
175
|
+
/** Line dashes style. 'none' means the line is not drawn at all. */
|
|
176
|
+
type LineDashStyle = "solid" | "dashed" | "dotted" | "none";
|
|
177
|
+
/** Direction for zoned fills relative to the line. */
|
|
178
|
+
type FillDirectionType = "toMin" | "toMax";
|
|
179
|
+
/** Side of a threshold or value for fill rendering. */
|
|
180
|
+
type FillSide = "above" | "below";
|
|
181
|
+
/** Axis orientation: vertical (left/right Y-axis) or horizontal (bottom X-axis). */
|
|
182
|
+
type AxisOrientation = "vertical" | "horizontal";
|
|
183
|
+
/** Vertical axis placement. */
|
|
184
|
+
type AxisPosition = "left" | "right";
|
|
185
|
+
/** Text anchor alignment. */
|
|
186
|
+
type LabelAnchor = "start" | "middle" | "end";
|
|
187
|
+
/** Gap rendering style. */
|
|
188
|
+
type DrawGapType_t = "dashed_border" | "empty" | "label";
|
|
189
|
+
|
|
190
|
+
/*!
|
|
191
|
+
* MLTimeGraph — Copyright (c) 2026 Michael Lechner
|
|
192
|
+
* MIT with Attribution: free use incl. commercial requires visible credit to
|
|
193
|
+
* "Michael Lechner". Commercial license (no attribution) on request. See LICENSE.
|
|
194
|
+
*/
|
|
195
|
+
/** All available hatch and pattern variants. */
|
|
196
|
+
type HatchVariant = "none" | "classic-diagonal" | "dense-steep" | "crosshatch" | "dots" | "waves" | "dashed" | "herringbone" | "brick" | "double-stripe" | "honeycomb";
|
|
197
|
+
/**
|
|
198
|
+
* Produce an SVG `<pattern>` element for the given variant.
|
|
199
|
+
* @param id DOM id to reference the pattern from `fill="url(#id)"`.
|
|
200
|
+
* @param variant Visual pattern kind (default `classic-diagonal`).
|
|
201
|
+
* @param fillcolor Pattern background colour (default a light steel-blue).
|
|
202
|
+
* @param linecolor Foreground stroke colour for the pattern shapes.
|
|
203
|
+
* @param strokewidth Stroke width in user units (scales with the pattern).
|
|
204
|
+
*/
|
|
205
|
+
declare function getHatch(id: string, variant?: HatchVariant, fillcolor?: string, linecolor?: string, strokewidth?: number): string;
|
|
206
|
+
|
|
207
|
+
/*!
|
|
208
|
+
* MLTimeGraph — Copyright (c) 2026 Michael Lechner
|
|
209
|
+
* MIT with Attribution: free use incl. commercial requires visible credit to
|
|
210
|
+
* "Michael Lechner". Commercial license (no attribution) on request. See LICENSE.
|
|
211
|
+
*/
|
|
212
|
+
|
|
213
|
+
/**
|
|
214
|
+
* A fill description. Three shapes:
|
|
215
|
+
* - `string` — plain colour (`'#ef444433'` or `'rgba(…)'`)
|
|
216
|
+
* - `{ color }` — explicit colour
|
|
217
|
+
* - `{ color, hatch, hatchColor?, hatchWidth? }` — colour + hatch pattern
|
|
218
|
+
*
|
|
219
|
+
* Where the fill is applied is described by {@link FillRegion}, not by `FillStyle`.
|
|
220
|
+
*/
|
|
221
|
+
type FillStyle = string | {
|
|
222
|
+
color: string;
|
|
223
|
+
hatch?: HatchVariant;
|
|
224
|
+
hatchColor?: string;
|
|
225
|
+
hatchWidth?: number;
|
|
226
|
+
};
|
|
227
|
+
/** Vertical boundary of a fill region. */
|
|
228
|
+
type FillBound = "series" | "chartTop" | "chartBottom" | {
|
|
229
|
+
threshold: string;
|
|
230
|
+
} | {
|
|
231
|
+
value: number;
|
|
232
|
+
};
|
|
233
|
+
/**
|
|
234
|
+
* A fill region. `from` and `to` define the Y interval; the X range is always
|
|
235
|
+
* the series itself.
|
|
236
|
+
*/
|
|
237
|
+
interface FillRegion {
|
|
238
|
+
/** Lower bound. Default `'chartBottom'`. */
|
|
239
|
+
from?: FillBound;
|
|
240
|
+
/** Upper bound. Default `'series'` (the line). */
|
|
241
|
+
to?: FillBound;
|
|
242
|
+
/** The fill itself. */
|
|
243
|
+
fill: FillStyle;
|
|
244
|
+
/** Only fill on one side of the `from`/`to` transition. */
|
|
245
|
+
side?: "above" | "below";
|
|
246
|
+
/**
|
|
247
|
+
* Optional outer gate. With `side` set and exactly one bound being
|
|
248
|
+
* `'series'`, the region renders only in X-spans where the line's value
|
|
249
|
+
* is between the fixed inner bound and this outer bound:
|
|
250
|
+
* - `side: 'above'` → outer > inner; render where inner < value < outer.
|
|
251
|
+
* - `side: 'below'` → outer < inner; render where outer < value < inner.
|
|
252
|
+
*
|
|
253
|
+
* Use this for classified zone bands: stack four bands lowwarn / low /
|
|
254
|
+
* high / highwarn and each fills only its own value range.
|
|
255
|
+
*/
|
|
256
|
+
outer?: FillBound;
|
|
257
|
+
}
|
|
258
|
+
/**
|
|
259
|
+
* Top-level fill spec on a series style. Either a single fill (covers from
|
|
260
|
+
* chart bottom to the line) or a `regions[]` array for multi-zone fills.
|
|
261
|
+
*/
|
|
262
|
+
type FillSpec = FillStyle | {
|
|
263
|
+
regions: FillRegion[];
|
|
264
|
+
};
|
|
265
|
+
|
|
266
|
+
/*!
|
|
267
|
+
* MLTimeGraph — Copyright (c) 2026 Michael Lechner
|
|
268
|
+
* MIT with Attribution: free use incl. commercial requires visible credit to
|
|
269
|
+
* "Michael Lechner". Commercial license (no attribution) on request. See LICENSE.
|
|
270
|
+
*/
|
|
271
|
+
|
|
272
|
+
/** Label placement / styling inside a gap region. */
|
|
273
|
+
interface GapLabel {
|
|
274
|
+
baseline?: "above" | "middle" | "below";
|
|
275
|
+
rotate?: number;
|
|
276
|
+
color?: string;
|
|
277
|
+
fontSize?: number;
|
|
278
|
+
}
|
|
279
|
+
/** Visual styling of a gap region. */
|
|
280
|
+
interface GapStyle {
|
|
281
|
+
/**
|
|
282
|
+
* - `'empty'` — line breaks, gap is not visualised.
|
|
283
|
+
* - `'dashed_border'` — dashed-stroke rectangle over the gap span (default
|
|
284
|
+
* when no `fill` is given).
|
|
285
|
+
* - `'filled'` — filled rectangle (use with `fill`).
|
|
286
|
+
* - `'bridge_line'` — dotted/dashed line between the last point before
|
|
287
|
+
* the gap and the first one after — "missing data"
|
|
288
|
+
* made visible without a background fill.
|
|
289
|
+
*/
|
|
290
|
+
display?: "empty" | "dashed_border" | "filled" | "bridge_line";
|
|
291
|
+
fill?: FillStyle;
|
|
292
|
+
opacity?: number;
|
|
293
|
+
label?: GapLabel;
|
|
294
|
+
/** Optional bridge-line style; only used when `display: 'bridge_line'`. */
|
|
295
|
+
bridge?: {
|
|
296
|
+
color?: string;
|
|
297
|
+
width?: number;
|
|
298
|
+
/** Default `'dotted'`. */
|
|
299
|
+
style?: "solid" | "dotted" | "dashed";
|
|
300
|
+
};
|
|
301
|
+
}
|
|
302
|
+
/** A manually-declared gap region. */
|
|
303
|
+
interface GapRegion {
|
|
304
|
+
startTime: number;
|
|
305
|
+
endTime: number;
|
|
306
|
+
label?: string;
|
|
307
|
+
style?: GapStyle;
|
|
308
|
+
}
|
|
309
|
+
/** Top-level gap configuration on `MLTimeGraphOptions`. */
|
|
310
|
+
interface GapsConfig {
|
|
311
|
+
autoDetect?: boolean;
|
|
312
|
+
minGapMs?: number;
|
|
313
|
+
regions?: GapRegion[];
|
|
314
|
+
style?: GapStyle;
|
|
315
|
+
}
|
|
316
|
+
|
|
317
|
+
/*!
|
|
318
|
+
* MLTimeGraph — Copyright (c) 2026 Michael Lechner
|
|
319
|
+
* MIT with Attribution: free use incl. commercial requires visible credit to
|
|
320
|
+
* "Michael Lechner". Commercial license (no attribution) on request. See LICENSE.
|
|
321
|
+
*/
|
|
322
|
+
|
|
323
|
+
/** Line styling for a series. All fields optional; defaults come from the theme. */
|
|
324
|
+
interface LineStyle {
|
|
325
|
+
/** Stroke colour. */
|
|
326
|
+
color?: string;
|
|
327
|
+
/** Stroke width in px. */
|
|
328
|
+
width?: number;
|
|
329
|
+
/** Stroke variant (`solid` / `dashed` / `dotted` / …). */
|
|
330
|
+
style?: LineVariant;
|
|
331
|
+
/** Catmull-Rom smoothing. */
|
|
332
|
+
smoothing?: boolean;
|
|
333
|
+
/** Line shape — `line` (Default) or `step` (Treppe). */
|
|
334
|
+
shape?: "line" | "step";
|
|
335
|
+
/** Max time gap (ms) between samples before the line breaks; 0 = off. */
|
|
336
|
+
gapThreshold?: number;
|
|
337
|
+
/** Opacity 0..1 (e.g. for overlaid lines). */
|
|
338
|
+
opacity?: number;
|
|
339
|
+
}
|
|
340
|
+
/** Drop-shadow for line / markers. */
|
|
341
|
+
interface ShadowStyle {
|
|
342
|
+
color?: string;
|
|
343
|
+
blur?: number;
|
|
344
|
+
offsetX?: number;
|
|
345
|
+
offsetY?: number;
|
|
346
|
+
}
|
|
347
|
+
/** Marker / point styling on series samples. */
|
|
348
|
+
interface MarkerStyle {
|
|
349
|
+
/** Marker shape (default `none`). */
|
|
350
|
+
type?: PointStyleType;
|
|
351
|
+
/** Marker size in px (radius or half-width). */
|
|
352
|
+
size?: number;
|
|
353
|
+
/** Outline colour. */
|
|
354
|
+
stroke?: string;
|
|
355
|
+
/** Fill colour. */
|
|
356
|
+
fill?: string;
|
|
357
|
+
/** Outline width. */
|
|
358
|
+
strokeWidth?: number;
|
|
359
|
+
/** Show markers only if the series has ≤ n samples (anti-clutter). */
|
|
360
|
+
threshold?: number;
|
|
361
|
+
}
|
|
362
|
+
/**
|
|
363
|
+
* Visual styling for a series. Which sub-objects are present determines what
|
|
364
|
+
* gets drawn: `line` → line, `fill` → area, `markers` → points. Any
|
|
365
|
+
* combination is allowed. Defaults come from the theme.
|
|
366
|
+
*/
|
|
367
|
+
interface SeriesStyle {
|
|
368
|
+
/** Optional id prefix for DOM selectors. */
|
|
369
|
+
id?: string;
|
|
370
|
+
/**
|
|
371
|
+
* Line styling. Three forms: a single `LineStyle`, an array (multiple lines
|
|
372
|
+
* through the same data — e.g. step + smoothed overlay), or `false` to skip
|
|
373
|
+
* the line entirely.
|
|
374
|
+
*/
|
|
375
|
+
line?: LineStyle | LineStyle[] | false;
|
|
376
|
+
/** Area / fill spec. */
|
|
377
|
+
fill?: FillSpec;
|
|
378
|
+
/** Point-marker styling. */
|
|
379
|
+
markers?: MarkerStyle;
|
|
380
|
+
/** Drop-shadow for line + markers. */
|
|
381
|
+
shadow?: ShadowStyle;
|
|
382
|
+
/** Per-series override for the gap rendering. */
|
|
383
|
+
gap?: GapStyle;
|
|
384
|
+
}
|
|
385
|
+
|
|
386
|
+
/*!
|
|
387
|
+
* MLTimeGraph — Copyright (c) 2026 Michael Lechner
|
|
388
|
+
* MIT with Attribution: free use incl. commercial requires visible credit to
|
|
389
|
+
* "Michael Lechner". Commercial license (no attribution) on request. See LICENSE.
|
|
390
|
+
*/
|
|
391
|
+
|
|
392
|
+
/**
|
|
393
|
+
* Statistic overlay on a series. Discriminated by `kind`.
|
|
394
|
+
*
|
|
395
|
+
* - `movingAverage` — simple or exponential moving average over a `window` ms.
|
|
396
|
+
* - `movingMkt` — rolling Mean Kinetic Temperature (USP <1079.2>) over a
|
|
397
|
+
* `window` ms; `activationEnergy` defaults to 83144 J/mol.
|
|
398
|
+
* - `stdDevBand` — band of (rolling-mean ± `multiplier` × σ) over `window` ms;
|
|
399
|
+
* `multiplier` defaults to 1. `style.fill` controls the band
|
|
400
|
+
* fill (FillStyle); `style.line`, if set, also renders the
|
|
401
|
+
* centerline.
|
|
402
|
+
* - `limits` — horizontal `low` / `high` reference lines + flagging
|
|
403
|
+
* of out-of-bounds excursions.
|
|
404
|
+
*/
|
|
405
|
+
type SeriesOverlay = {
|
|
406
|
+
kind: "movingAverage";
|
|
407
|
+
window: number;
|
|
408
|
+
type?: "simple" | "exponential";
|
|
409
|
+
style?: SeriesStyle;
|
|
410
|
+
} | {
|
|
411
|
+
kind: "movingMkt";
|
|
412
|
+
window: number;
|
|
413
|
+
activationEnergy?: number;
|
|
414
|
+
style?: SeriesStyle;
|
|
415
|
+
} | {
|
|
416
|
+
kind: "stdDevBand";
|
|
417
|
+
window: number;
|
|
418
|
+
multiplier?: number;
|
|
419
|
+
style?: SeriesStyle;
|
|
420
|
+
} | {
|
|
421
|
+
kind: "limits";
|
|
422
|
+
low?: number;
|
|
423
|
+
high?: number;
|
|
424
|
+
style?: SeriesStyle;
|
|
425
|
+
};
|
|
426
|
+
/** All overlay kinds — useful for switch-statement exhaustiveness checks. */
|
|
427
|
+
type SeriesOverlayKind = SeriesOverlay["kind"];
|
|
428
|
+
|
|
429
|
+
/*!
|
|
430
|
+
* MLTimeGraph — Copyright (c) 2026 Michael Lechner
|
|
431
|
+
* MIT with Attribution: free use incl. commercial requires visible credit to
|
|
432
|
+
* "Michael Lechner". Commercial license (no attribution) on request. See LICENSE.
|
|
433
|
+
*/
|
|
434
|
+
|
|
435
|
+
/** Einzelner Messwert — numerisch oder Integer-Enum-Key */
|
|
436
|
+
interface DataPoint {
|
|
437
|
+
/** Zeit (ms-Timestamp) */
|
|
438
|
+
time: number;
|
|
439
|
+
/** Numerischer Wert oder Integer-Enum-Key, null = Gap (Linie bricht hier) */
|
|
440
|
+
value: number | null;
|
|
441
|
+
/** Optionaler Annotationstext */
|
|
442
|
+
annotation?: string;
|
|
443
|
+
/**
|
|
444
|
+
* Synthetischer Punkt — keine echte Messung. Wird automatisch vom
|
|
445
|
+
* `SeriesProcessor` auf interpolierten Punkten gesetzt (Threshold-Schnitte,
|
|
446
|
+
* Gap-Ränder), kann auch manuell verwendet werden für eigene berechnete
|
|
447
|
+
* Stützstellen (z. B. eine Trendlinie auf interpolierten Zwischenwerten).
|
|
448
|
+
*
|
|
449
|
+
* Renderer-Konsequenz: kein Punkt-Marker, kein Tooltip-Snap, kein Eintrag
|
|
450
|
+
* in der Werte-Tabelle. Skalen (Y-Min/Max) zählen den Punkt mit, sonst
|
|
451
|
+
* wäre die Linien-Geometrie verzerrt. Default `undefined` = echte Messung.
|
|
452
|
+
*
|
|
453
|
+
* Siehe API_DESIGN.md §4.1.
|
|
454
|
+
*/
|
|
455
|
+
synthetic?: boolean;
|
|
456
|
+
}
|
|
457
|
+
/**
|
|
458
|
+
* Limits + activation energy for pre-computed slot-level statistics (MKT,
|
|
459
|
+
* minutes-above/below). When passed to `aggregateBySlot`, the returned
|
|
460
|
+
* slots are widened to `StatsAggregatedPoint`. At render time, an
|
|
461
|
+
* equivalent on-the-fly variant is the `limits` / `movingMkt` overlay.
|
|
462
|
+
*/
|
|
463
|
+
interface AggregationThresholds {
|
|
464
|
+
limitLow: number;
|
|
465
|
+
limitHigh: number;
|
|
466
|
+
activationEnergy?: number;
|
|
467
|
+
}
|
|
468
|
+
/** Aggregierter Messwert pro Zeitslot (hourly/daily/custom). */
|
|
469
|
+
interface AggregatedPoint {
|
|
470
|
+
/** Slot-Start-Zeit (ms) */
|
|
471
|
+
time: number;
|
|
472
|
+
/** Minimum-Wert, null = Gap-Slot */
|
|
473
|
+
min: number | null;
|
|
474
|
+
/** Maximum-Wert, null = Gap-Slot */
|
|
475
|
+
max: number | null;
|
|
476
|
+
/** Durchschnitt, null = Gap-Slot */
|
|
477
|
+
avg: number | null;
|
|
478
|
+
/** Anzahl der Roh-Daten im Slot */
|
|
479
|
+
count: number;
|
|
480
|
+
}
|
|
481
|
+
/** Sensor-Typ */
|
|
482
|
+
type SensorType = "numeric" | "enum";
|
|
483
|
+
/** Map from enum value (number) to human-readable label */
|
|
484
|
+
interface EnumMap {
|
|
485
|
+
[key: number]: string;
|
|
486
|
+
}
|
|
487
|
+
/** Raw-Serie (numerisch oder Enum) */
|
|
488
|
+
interface TimeSeries {
|
|
489
|
+
name: string;
|
|
490
|
+
data: DataPoint[];
|
|
491
|
+
sensorType?: SensorType;
|
|
492
|
+
enumMap?: EnumMap;
|
|
493
|
+
/**
|
|
494
|
+
* Structured style block (preferred, see API_DESIGN.md §5).
|
|
495
|
+
* The structured style block. Its sub-objects (`line`, `fill`, `markers`,
|
|
496
|
+
* `shadow`, `gap`) are merged with theme defaults by the chart's resolver.
|
|
497
|
+
*/
|
|
498
|
+
style?: SeriesStyle;
|
|
499
|
+
/**
|
|
500
|
+
* Statistic overlays computed at render time from this series' data.
|
|
501
|
+
* Each overlay carries its own style and appears in the legend.
|
|
502
|
+
* See API_DESIGN.md §11.
|
|
503
|
+
*/
|
|
504
|
+
overlays?: SeriesOverlay[];
|
|
505
|
+
yAxisIndex?: number;
|
|
506
|
+
seriesType?: SeriesType;
|
|
507
|
+
/** Color the line by these named thresholds — segments are coloured per zone. */
|
|
508
|
+
colorByThresholds?: string[];
|
|
509
|
+
/** Optional SVG id prefix for series elements. */
|
|
510
|
+
id?: string;
|
|
511
|
+
}
|
|
512
|
+
/** Aggregierte Serie: min/max/avg pro Slot */
|
|
513
|
+
interface AggregatedSeries {
|
|
514
|
+
name: string;
|
|
515
|
+
data: AggregatedPoint[];
|
|
516
|
+
/** 'band' = gefülltes Rechteck pro Slot; 'minmaxavg' = min/max/avg-Linien + optionaler Fill */
|
|
517
|
+
showAs?: "band" | "minmaxavg";
|
|
518
|
+
yAxisIndex?: number;
|
|
519
|
+
avgLine?: boolean;
|
|
520
|
+
countOpacity?: boolean;
|
|
521
|
+
/**
|
|
522
|
+
* Structured style block (preferred). For aggregated series, `style.line.color`
|
|
523
|
+
* sets the avg-line colour; `style.fill.color` sets the band fill.
|
|
524
|
+
* Sub-band fills (avg→max, avg→min) keep using the legacy `fillToMax`/`fillToMin`
|
|
525
|
+
* for now — the new `style.fill.regions[]` form covers them and arrives in 2.9.
|
|
526
|
+
*/
|
|
527
|
+
style?: SeriesStyle;
|
|
528
|
+
/** Statistic overlays — see API_DESIGN.md §11. */
|
|
529
|
+
overlays?: SeriesOverlay[];
|
|
530
|
+
minColor?: string;
|
|
531
|
+
maxColor?: string;
|
|
532
|
+
avgColor?: string;
|
|
533
|
+
/** avg gepunktet (default: true). */
|
|
534
|
+
avgDashed?: boolean;
|
|
535
|
+
/** Halbtransparenter Fill zwischen avg and max */
|
|
536
|
+
fillToMax?: string;
|
|
537
|
+
/** Hatch pattern for fillToMax */
|
|
538
|
+
fillToMaxHatch?: HatchVariant;
|
|
539
|
+
/** Halbtransparenter Fill zwischen avg and min */
|
|
540
|
+
fillToMin?: string;
|
|
541
|
+
/** Hatch pattern for fillToMin */
|
|
542
|
+
fillToMinHatch?: HatchVariant;
|
|
543
|
+
/** Optional SVG id prefix for series elements. */
|
|
544
|
+
id?: string;
|
|
545
|
+
}
|
|
546
|
+
/** Series-Typ: Raw, Enum, oder Aggregat */
|
|
547
|
+
type AnySeries = TimeSeries | AggregatedSeries;
|
|
548
|
+
/** Time range gap with optional label and style */
|
|
549
|
+
interface Gap {
|
|
550
|
+
startTime: number;
|
|
551
|
+
endTime: number;
|
|
552
|
+
label?: string;
|
|
553
|
+
fill?: string;
|
|
554
|
+
/** Hatch pattern for gap fill */
|
|
555
|
+
hatch?: HatchVariant;
|
|
556
|
+
fillOpacity?: number;
|
|
557
|
+
labelBaseline?: 'above' | 'middle' | 'below';
|
|
558
|
+
rotate?: number;
|
|
559
|
+
style?: DrawGapType_t$1;
|
|
560
|
+
}
|
|
561
|
+
/** Configuration for gap rendering (manual or auto-detected) */
|
|
562
|
+
interface GapConfig {
|
|
563
|
+
enabled: boolean;
|
|
564
|
+
autoDetect?: boolean;
|
|
565
|
+
minGapMs?: number;
|
|
566
|
+
gaps?: Gap[];
|
|
567
|
+
}
|
|
568
|
+
/** Possible positions for threshold labels */
|
|
569
|
+
type ThresholdLabelPosition = "left" | "right" | "above" | "below" | "center";
|
|
570
|
+
interface ThresholdLabelConfig {
|
|
571
|
+
/** Label text (default: the threshold's name). */
|
|
572
|
+
text?: string;
|
|
573
|
+
/** Where the label sits relative to the line (default: 'right'). */
|
|
574
|
+
position?: ThresholdLabelPosition;
|
|
575
|
+
/** Rotation in degrees (default: none). */
|
|
576
|
+
rotate?: number;
|
|
577
|
+
/** Text vertical alignment: 'top', 'middle' (default), or 'bottom'. */
|
|
578
|
+
textBaseline?: "top" | "middle" | "bottom";
|
|
579
|
+
}
|
|
580
|
+
/**
|
|
581
|
+
* A named value boundary. It can be drawn (line / half-plane fill / label) and
|
|
582
|
+
* referenced from a series via `colorByThresholds` / `fillToThreshold`.
|
|
583
|
+
*/
|
|
584
|
+
interface Threshold {
|
|
585
|
+
name: string;
|
|
586
|
+
value: number;
|
|
587
|
+
color?: string;
|
|
588
|
+
line?: "solid" | "dashed" | "dotted" | "none";
|
|
589
|
+
fill?: "above" | "below" | "none";
|
|
590
|
+
fillHatch?: HatchVariant;
|
|
591
|
+
fillOpacity?: number;
|
|
592
|
+
label?: false | string | ThresholdLabelConfig;
|
|
593
|
+
/** Optional SVG id prefix for threshold elements. Generated ids: `<id>-line`, `<id>-fill`, `<id>-label`. */
|
|
594
|
+
id?: string;
|
|
595
|
+
shadowColor?: string;
|
|
596
|
+
shadowBlur?: number;
|
|
597
|
+
shadowOffsetX?: number;
|
|
598
|
+
shadowOffsetY?: number;
|
|
599
|
+
}
|
|
600
|
+
/** Colored time-range highlight drawn behind the series */
|
|
601
|
+
interface Highlight {
|
|
602
|
+
startTime: number;
|
|
603
|
+
endTime: number;
|
|
604
|
+
label?: string;
|
|
605
|
+
color?: string;
|
|
606
|
+
opacity?: number;
|
|
607
|
+
/**
|
|
608
|
+
* Where the label sits (default 'top'). 'top' | 'center' | 'bottom' are inside
|
|
609
|
+
* the highlighted band; 'above' / 'below' place it outside the plot area
|
|
610
|
+
* (in the top margin / below the x-axis) so it never overlaps the data.
|
|
611
|
+
*/
|
|
612
|
+
labelPosition?: "top" | "center" | "bottom" | "above" | "below";
|
|
613
|
+
}
|
|
614
|
+
/** A point in data coordinates. `axis` selects the y-scale (0 = left, 1 = right). */
|
|
615
|
+
interface DataPointRef {
|
|
616
|
+
time: number;
|
|
617
|
+
value: number;
|
|
618
|
+
axis?: number;
|
|
619
|
+
}
|
|
620
|
+
/**
|
|
621
|
+
* A free-form, user-supplied overlay drawn in data coordinates (time/value).
|
|
622
|
+
* The chart projects it to pixels, so it tracks the data through zoom/resize.
|
|
623
|
+
* An optional `id` lets you remove or enable/disable it dynamically.
|
|
624
|
+
*/
|
|
625
|
+
type Annotation = {
|
|
626
|
+
id?: string;
|
|
627
|
+
} & ({
|
|
628
|
+
type: "line";
|
|
629
|
+
from: DataPointRef;
|
|
630
|
+
to: DataPointRef;
|
|
631
|
+
color?: string;
|
|
632
|
+
width?: number;
|
|
633
|
+
dash?: "dashed" | "dotted";
|
|
634
|
+
} | {
|
|
635
|
+
type: "arrow";
|
|
636
|
+
from: DataPointRef;
|
|
637
|
+
to: DataPointRef;
|
|
638
|
+
color?: string;
|
|
639
|
+
width?: number;
|
|
640
|
+
headSize?: number;
|
|
641
|
+
} | {
|
|
642
|
+
type: "rect";
|
|
643
|
+
from: DataPointRef;
|
|
644
|
+
to: DataPointRef;
|
|
645
|
+
fill?: string;
|
|
646
|
+
hatch?: HatchVariant;
|
|
647
|
+
stroke?: string;
|
|
648
|
+
opacity?: number;
|
|
649
|
+
} | {
|
|
650
|
+
type: "point";
|
|
651
|
+
at: DataPointRef;
|
|
652
|
+
color?: string;
|
|
653
|
+
radius?: number;
|
|
654
|
+
shape?: "circle" | "square" | "cross";
|
|
655
|
+
} | {
|
|
656
|
+
type: "label";
|
|
657
|
+
at: DataPointRef;
|
|
658
|
+
text: string;
|
|
659
|
+
color?: string;
|
|
660
|
+
anchor?: "start" | "middle" | "end";
|
|
661
|
+
dx?: number;
|
|
662
|
+
dy?: number;
|
|
663
|
+
rotate?: number;
|
|
664
|
+
});
|
|
665
|
+
/** Aggregation mode: no aggregation, hourly, daily, or custom interval */
|
|
666
|
+
type AggregationMode = "none" | "hourly" | "daily" | "custom";
|
|
667
|
+
interface AggregationConfig {
|
|
668
|
+
mode: AggregationMode;
|
|
669
|
+
interval?: number;
|
|
670
|
+
}
|
|
671
|
+
/**
|
|
672
|
+
* A colored time-range item inside an annotation band.
|
|
673
|
+
* Drawn as a rect strip spanning the band height, with optional label.
|
|
674
|
+
*/
|
|
675
|
+
interface AnnotationBandItem {
|
|
676
|
+
/** Start time (ms epoch) */
|
|
677
|
+
startTime: number;
|
|
678
|
+
/** End time (ms epoch) */
|
|
679
|
+
endTime: number;
|
|
680
|
+
/** Fill color for this range (default '#6b728044'). */
|
|
681
|
+
fill?: string;
|
|
682
|
+
/** Hatch pattern for band item fill */
|
|
683
|
+
hatch?: HatchVariant;
|
|
684
|
+
/** Stroke color for the rect border (default: none). */
|
|
685
|
+
stroke?: string;
|
|
686
|
+
/** Stroke width (default: 0). */
|
|
687
|
+
strokeWidth?: number;
|
|
688
|
+
/** Optional label centered in this range. */
|
|
689
|
+
label?: string;
|
|
690
|
+
/** Label font size in px (default: 10). */
|
|
691
|
+
labelFontSize?: number;
|
|
692
|
+
/** Label fill color (default: inherit from theme). */
|
|
693
|
+
labelFill?: string;
|
|
694
|
+
/**
|
|
695
|
+
* Label vertical position: 'top', 'middle' (default), or 'bottom' inside the band.
|
|
696
|
+
*/
|
|
697
|
+
labelBaseline?: 'top' | 'middle' | 'bottom';
|
|
698
|
+
}
|
|
699
|
+
/**
|
|
700
|
+
* Configuration for an annotation band — a horizontal strip below the main chart
|
|
701
|
+
* that shares the time axis and highlights time ranges with colors and optional labels.
|
|
702
|
+
*/
|
|
703
|
+
interface AnnotationBandConfig {
|
|
704
|
+
/** Name of this band (used for legend / grouping). */
|
|
705
|
+
name: string;
|
|
706
|
+
/** Default hatch pattern for all items in this band (overridden per-item). */
|
|
707
|
+
hatch?: HatchVariant;
|
|
708
|
+
/** Band height in pixels (default: 12). */
|
|
709
|
+
height?: number;
|
|
710
|
+
/** Pixel offset between bands (default: 0). */
|
|
711
|
+
spacing?: number;
|
|
712
|
+
/** Whether to show a time axis for this band (default: false). */
|
|
713
|
+
showAxis?: boolean;
|
|
714
|
+
/** Whether this band should appear in the legend (default: true). */
|
|
715
|
+
showInLegend?: boolean;
|
|
716
|
+
/** Background fill for the entire band (default: transparent). */
|
|
717
|
+
background?: string;
|
|
718
|
+
/** Colored time ranges to draw in this band. */
|
|
719
|
+
items: AnnotationBandItem[];
|
|
720
|
+
}
|
|
721
|
+
|
|
722
|
+
/*!
|
|
723
|
+
* MLTimeGraph — Copyright (c) 2026 Michael Lechner
|
|
724
|
+
* MIT with Attribution: free use incl. commercial requires visible credit to
|
|
725
|
+
* "Michael Lechner". Commercial license (no attribution) on request. See LICENSE.
|
|
726
|
+
*/
|
|
727
|
+
/** Base scale interface – maps data values to pixel coordinates */
|
|
728
|
+
interface ScaleConfig {
|
|
729
|
+
/** Pixel range (output domain). Defaults to [0, width] or [0, height] */
|
|
730
|
+
range: [number, number];
|
|
731
|
+
}
|
|
732
|
+
interface Scale {
|
|
733
|
+
/** Map a data value to a pixel coordinate */
|
|
734
|
+
map(value: unknown): number;
|
|
735
|
+
/** Map a pixel coordinate back to a data value */
|
|
736
|
+
invert(pixel: number): unknown;
|
|
737
|
+
/** Get the data domain */
|
|
738
|
+
domain(): [unknown, unknown];
|
|
739
|
+
/** Get the pixel range */
|
|
740
|
+
range(): [number, number];
|
|
741
|
+
}
|
|
742
|
+
/** Scale with explicit data domain and pixel range. */
|
|
743
|
+
interface DomainScaleConfig extends ScaleConfig {
|
|
744
|
+
domain: [unknown, unknown];
|
|
745
|
+
}
|
|
746
|
+
/** Configuration for linear value-to-pixel mapping. */
|
|
747
|
+
interface LinearScaleConfig {
|
|
748
|
+
domain: [number, number];
|
|
749
|
+
range: [number, number];
|
|
750
|
+
}
|
|
751
|
+
/** Maps numeric data values to pixel coordinates using linear interpolation. */
|
|
752
|
+
declare class LinearScale implements Scale {
|
|
753
|
+
#private;
|
|
754
|
+
constructor(config: LinearScaleConfig);
|
|
755
|
+
map(value: unknown): number;
|
|
756
|
+
invert(pixel: number): number;
|
|
757
|
+
domain(): [number, number];
|
|
758
|
+
range(): [number, number];
|
|
759
|
+
}
|
|
760
|
+
/** Nice time intervals for tick placement (milliseconds) */
|
|
761
|
+
declare const TIME_INTERVALS: {
|
|
762
|
+
label: string;
|
|
763
|
+
ms: number;
|
|
764
|
+
}[];
|
|
765
|
+
/** Configuration for time-to-pixel mapping. */
|
|
766
|
+
interface TimeScaleConfig {
|
|
767
|
+
domain: [number, number];
|
|
768
|
+
range: [number, number];
|
|
769
|
+
/** Locale for i18n formatting (default: 'en-US') */
|
|
770
|
+
locale?: string;
|
|
771
|
+
}
|
|
772
|
+
/** Maps timestamps (ms) to pixel coordinates with automatic tick interval selection. */
|
|
773
|
+
declare class TimeScale implements Scale {
|
|
774
|
+
#private;
|
|
775
|
+
constructor(config: TimeScaleConfig);
|
|
776
|
+
map(value: unknown): number;
|
|
777
|
+
invert(pixel: number): number;
|
|
778
|
+
domain(): [number, number];
|
|
779
|
+
range(): [number, number];
|
|
780
|
+
get locale(): string;
|
|
781
|
+
/**
|
|
782
|
+
* Pick the "nicest" time interval that yields roughly `targetTicks` ticks
|
|
783
|
+
* across the visible range. Clamps to minTicks / maxTicks bounds.
|
|
784
|
+
*/
|
|
785
|
+
tickInterval(targetTicks: number, minTicks?: number, maxTicks?: number): {
|
|
786
|
+
interval: number;
|
|
787
|
+
};
|
|
788
|
+
/**
|
|
789
|
+
* Generate tick positions (timestamps) across the domain.
|
|
790
|
+
*/
|
|
791
|
+
ticks(opts?: {
|
|
792
|
+
minTicks?: number;
|
|
793
|
+
maxTicks?: number;
|
|
794
|
+
}): number[];
|
|
795
|
+
/** Format a timestamp using Intl.DateTimeFormat */
|
|
796
|
+
format(timestamp: number, formatOpts?: Intl.DateTimeFormatOptions): string;
|
|
797
|
+
}
|
|
798
|
+
/** Configuration for band (categorical) scale. */
|
|
799
|
+
interface BandScaleConfig {
|
|
800
|
+
/** Discrete categories (strings or numbers) */
|
|
801
|
+
domain: string[];
|
|
802
|
+
range: [number, number];
|
|
803
|
+
/** Padding fraction inside the band area (0-1, default 0.1) */
|
|
804
|
+
paddingInner?: number;
|
|
805
|
+
/** Padding fraction outside the band area (0-1, default 0.05) */
|
|
806
|
+
paddingOuter?: number;
|
|
807
|
+
}
|
|
808
|
+
/** Scale for discrete (categorical) axes — maps category indices to pixel positions. */
|
|
809
|
+
declare class BandScale implements Scale {
|
|
810
|
+
#private;
|
|
811
|
+
constructor(config: BandScaleConfig);
|
|
812
|
+
/** Get the pixel width of each band (including padding) */
|
|
813
|
+
get step(): number;
|
|
814
|
+
/** Get the pixel width of each band's content area */
|
|
815
|
+
get bandwidth(): number;
|
|
816
|
+
map(value: unknown): number;
|
|
817
|
+
invert(pixel: number): string;
|
|
818
|
+
domain(): [string, string];
|
|
819
|
+
range(): [number, number];
|
|
820
|
+
/** Get all band positions */
|
|
821
|
+
positions(): Map<string, number>;
|
|
822
|
+
}
|
|
823
|
+
|
|
824
|
+
export { type PointStyleType as $, type AggregatedPoint as A, BandScale as B, type CircleParams as C, type Dashstyle_t as D, type EnumMap as E, type FillBound as F, type FillSide as G, type FillSpec as H, type FillStyle as I, type Gap as J, type GapConfig as K, type GapLabel as L, type GapRegion as M, type GapStyle as N, type GapsConfig as O, type HatchVariant as P, type Highlight as Q, type LabelAnchor as R, type LineDashStyle as S, type LineParams as T, type LineStyle as U, type LineVariant as V, LinearScale as W, type LinearScaleConfig as X, type MarkerStyle as Y, type PathParams as Z, type Point as _, type AggregatedSeries as a, type RectParams as a0, type Scale as a1, type ScaleConfig as a2, type SensorType as a3, type SeriesOverlay as a4, type SeriesOverlayKind as a5, type SeriesStyle as a6, type SeriesType as a7, type ShadowStyle as a8, TIME_INTERVALS as a9, type TextParams as aa, type Threshold as ab, type ThresholdLabelConfig as ac, type ThresholdLabelPosition as ad, TimeScale as ae, type TimeScaleConfig as af, type TimeSeries as ag, getHatch as ah, type AggregationConfig as b, type AggregationMode as c, type AggregationThresholds as d, type Annotation as e, type AnnotationBandConfig as f, type AnnotationBandItem as g, type AnySeries as h, type AxisOrientation as i, type AxisPosition as j, type BandScaleConfig as k, type DataPoint as l, type DataPointRef as m, type DomainScaleConfig as n, type DrawCircle as o, type DrawCommand as p, type DrawGap as q, type DrawGapType_t as r, type DrawGradient as s, type DrawGroup as t, type DrawLine as u, type DrawPath as v, type DrawRect as w, type DrawText as x, type FillDirectionType as y, type FillRegion as z };
|