@elucim/dsl 0.1.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 +208 -0
- package/dist/index.d.ts +820 -0
- package/dist/index.js +1533 -0
- package/package.json +66 -0
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,820 @@
|
|
|
1
|
+
import { default as default_2 } from 'react';
|
|
2
|
+
import { JSX as JSX_2 } from 'react/jsx-runtime';
|
|
3
|
+
|
|
4
|
+
export declare interface ArrowNode {
|
|
5
|
+
type: 'arrow';
|
|
6
|
+
id?: string;
|
|
7
|
+
x1: number;
|
|
8
|
+
y1: number;
|
|
9
|
+
x2: number;
|
|
10
|
+
y2: number;
|
|
11
|
+
stroke?: string;
|
|
12
|
+
strokeWidth?: number;
|
|
13
|
+
headSize?: number;
|
|
14
|
+
strokeDasharray?: string;
|
|
15
|
+
opacity?: number;
|
|
16
|
+
fadeIn?: number;
|
|
17
|
+
fadeOut?: number;
|
|
18
|
+
draw?: number;
|
|
19
|
+
easing?: EasingSpec;
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
export declare interface AxesNode {
|
|
23
|
+
type: 'axes';
|
|
24
|
+
id?: string;
|
|
25
|
+
domain?: [number, number];
|
|
26
|
+
range?: [number, number];
|
|
27
|
+
origin?: [number, number];
|
|
28
|
+
scale?: number;
|
|
29
|
+
showGrid?: boolean;
|
|
30
|
+
showTicks?: boolean;
|
|
31
|
+
showLabels?: boolean;
|
|
32
|
+
tickStep?: number;
|
|
33
|
+
axisColor?: string;
|
|
34
|
+
gridColor?: string;
|
|
35
|
+
labelColor?: string;
|
|
36
|
+
labelFontSize?: number;
|
|
37
|
+
fadeIn?: number;
|
|
38
|
+
fadeOut?: number;
|
|
39
|
+
draw?: number;
|
|
40
|
+
easing?: EasingSpec;
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
export declare interface BarChartBarDef {
|
|
44
|
+
label: string;
|
|
45
|
+
value: number;
|
|
46
|
+
color?: string;
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
export declare interface BarChartNode {
|
|
50
|
+
type: 'barChart';
|
|
51
|
+
id?: string;
|
|
52
|
+
bars: BarChartBarDef[];
|
|
53
|
+
x: number;
|
|
54
|
+
y: number;
|
|
55
|
+
width: number;
|
|
56
|
+
height: number;
|
|
57
|
+
barColor?: string;
|
|
58
|
+
labelColor?: string;
|
|
59
|
+
labelFontSize?: number;
|
|
60
|
+
showValues?: boolean;
|
|
61
|
+
maxValue?: number;
|
|
62
|
+
gap?: number;
|
|
63
|
+
valueFormat?: 'number' | 'percent';
|
|
64
|
+
fadeIn?: number;
|
|
65
|
+
fadeOut?: number;
|
|
66
|
+
easing?: EasingSpec;
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
export declare interface CircleNode {
|
|
70
|
+
type: 'circle';
|
|
71
|
+
id?: string;
|
|
72
|
+
cx: number;
|
|
73
|
+
cy: number;
|
|
74
|
+
r: number;
|
|
75
|
+
fill?: string;
|
|
76
|
+
stroke?: string;
|
|
77
|
+
strokeWidth?: number;
|
|
78
|
+
opacity?: number;
|
|
79
|
+
fadeIn?: number;
|
|
80
|
+
fadeOut?: number;
|
|
81
|
+
draw?: number;
|
|
82
|
+
easing?: EasingSpec;
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
/**
|
|
86
|
+
* Compile a math expression string into a callable function.
|
|
87
|
+
* Returns a function that accepts variable values and returns a number.
|
|
88
|
+
*
|
|
89
|
+
* @example
|
|
90
|
+
* const fn = compileExpression('sin(x) * 2');
|
|
91
|
+
* fn({ x: Math.PI / 2 }); // → 2
|
|
92
|
+
*/
|
|
93
|
+
export declare function compileExpression(expr: string): (vars: Record<string, number>) => number;
|
|
94
|
+
|
|
95
|
+
/**
|
|
96
|
+
* Compile a vector expression string (returns [number, number]).
|
|
97
|
+
* Used for VectorField fn props.
|
|
98
|
+
*
|
|
99
|
+
* @example
|
|
100
|
+
* const fn = compileVectorExpression('[-y, x]');
|
|
101
|
+
* fn({ x: 1, y: 2 }); // → [-2, 1]
|
|
102
|
+
*/
|
|
103
|
+
export declare function compileVectorExpression(expr: string): (vars: Record<string, number>) => [number, number];
|
|
104
|
+
|
|
105
|
+
export declare interface CubicBezierEasing {
|
|
106
|
+
type: 'cubicBezier';
|
|
107
|
+
x1: number;
|
|
108
|
+
y1: number;
|
|
109
|
+
x2: number;
|
|
110
|
+
y2: number;
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
export declare const darkTheme: Theme;
|
|
114
|
+
|
|
115
|
+
export declare interface DrawNode {
|
|
116
|
+
type: 'draw';
|
|
117
|
+
duration?: number;
|
|
118
|
+
easing?: EasingSpec;
|
|
119
|
+
pathLength?: number;
|
|
120
|
+
children: ElementNode[];
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
export declare function DslRenderer({ dsl, className, style }: DslRendererProps): JSX_2.Element;
|
|
124
|
+
|
|
125
|
+
export declare interface DslRendererProps {
|
|
126
|
+
dsl: ElucimDocument;
|
|
127
|
+
className?: string;
|
|
128
|
+
style?: default_2.CSSProperties;
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
/** An easing function maps progress (0→1) to an eased value (typically 0→1) */
|
|
132
|
+
declare type EasingFunction = (t: number) => number;
|
|
133
|
+
|
|
134
|
+
declare type EasingName = 'linear' | 'easeInQuad' | 'easeOutQuad' | 'easeInOutQuad' | 'easeInCubic' | 'easeOutCubic' | 'easeInOutCubic' | 'easeInQuart' | 'easeOutQuart' | 'easeInOutQuart' | 'easeInSine' | 'easeOutSine' | 'easeInOutSine' | 'easeInExpo' | 'easeOutExpo' | 'easeInOutExpo' | 'easeInBack' | 'easeOutBack' | 'easeOutElastic' | 'easeOutBounce';
|
|
135
|
+
|
|
136
|
+
export declare type EasingSpec = EasingName | SpringEasing | CubicBezierEasing;
|
|
137
|
+
|
|
138
|
+
export declare type ElementNode = SequenceNode | GroupNode | CircleNode | LineNode | ArrowNode | RectNode | PolygonNode | TextNode | AxesNode | FunctionPlotNode | VectorNode | VectorFieldNode | MatrixNode | GraphNode | LaTeXNode | BarChartNode | FadeInNode | FadeOutNode | DrawNode | WriteNode | TransformNode | MorphNode | StaggerNode | ParallelNode | PlayerNode | SceneNode;
|
|
139
|
+
|
|
140
|
+
export declare interface ElucimDocument {
|
|
141
|
+
/** JSON Schema URL for editor autocomplete */
|
|
142
|
+
$schema?: string;
|
|
143
|
+
/** DSL version */
|
|
144
|
+
version: '1.0';
|
|
145
|
+
/** Root node — a Scene, Player, or Presentation */
|
|
146
|
+
root: RootNode;
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
export declare interface FadeInNode {
|
|
150
|
+
type: 'fadeIn';
|
|
151
|
+
duration?: number;
|
|
152
|
+
easing?: EasingSpec;
|
|
153
|
+
children: ElementNode[];
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
export declare interface FadeOutNode {
|
|
157
|
+
type: 'fadeOut';
|
|
158
|
+
duration?: number;
|
|
159
|
+
totalFrames?: number;
|
|
160
|
+
easing?: EasingSpec;
|
|
161
|
+
children: ElementNode[];
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
export declare interface FunctionPlotNode {
|
|
165
|
+
type: 'functionPlot';
|
|
166
|
+
/** Math expression string, e.g. "sin(x)", "x^2 - 1" */
|
|
167
|
+
fn: string;
|
|
168
|
+
domain?: [number, number];
|
|
169
|
+
yClamp?: [number, number];
|
|
170
|
+
origin?: [number, number];
|
|
171
|
+
scale?: number;
|
|
172
|
+
color?: string;
|
|
173
|
+
strokeWidth?: number;
|
|
174
|
+
samples?: number;
|
|
175
|
+
draw?: number;
|
|
176
|
+
easing?: EasingSpec;
|
|
177
|
+
opacity?: number;
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
export declare interface GraphEdgeDef {
|
|
181
|
+
from: string;
|
|
182
|
+
to: string;
|
|
183
|
+
color?: string;
|
|
184
|
+
directed?: boolean;
|
|
185
|
+
label?: string;
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
export declare interface GraphNode {
|
|
189
|
+
type: 'graph';
|
|
190
|
+
id?: string;
|
|
191
|
+
nodes: GraphNodeDef[];
|
|
192
|
+
edges: GraphEdgeDef[];
|
|
193
|
+
nodeColor?: string;
|
|
194
|
+
nodeRadius?: number;
|
|
195
|
+
edgeColor?: string;
|
|
196
|
+
edgeWidth?: number;
|
|
197
|
+
labelColor?: string;
|
|
198
|
+
labelFontSize?: number;
|
|
199
|
+
fadeIn?: number;
|
|
200
|
+
fadeOut?: number;
|
|
201
|
+
easing?: EasingSpec;
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
export declare interface GraphNodeDef {
|
|
205
|
+
id: string;
|
|
206
|
+
x: number;
|
|
207
|
+
y: number;
|
|
208
|
+
label?: string;
|
|
209
|
+
color?: string;
|
|
210
|
+
radius?: number;
|
|
211
|
+
}
|
|
212
|
+
|
|
213
|
+
export declare interface GroupNode {
|
|
214
|
+
type: 'group';
|
|
215
|
+
children: ElementNode[];
|
|
216
|
+
}
|
|
217
|
+
|
|
218
|
+
export declare interface LaTeXNode {
|
|
219
|
+
type: 'latex';
|
|
220
|
+
id?: string;
|
|
221
|
+
/** LaTeX expression, e.g. "\\frac{a}{b}" */
|
|
222
|
+
expression: string;
|
|
223
|
+
x: number;
|
|
224
|
+
y: number;
|
|
225
|
+
color?: string;
|
|
226
|
+
fontSize?: number;
|
|
227
|
+
align?: 'left' | 'center' | 'right';
|
|
228
|
+
fadeIn?: number;
|
|
229
|
+
fadeOut?: number;
|
|
230
|
+
easing?: EasingSpec;
|
|
231
|
+
}
|
|
232
|
+
|
|
233
|
+
export declare const lightTheme: Theme;
|
|
234
|
+
|
|
235
|
+
export declare interface LineNode {
|
|
236
|
+
type: 'line';
|
|
237
|
+
id?: string;
|
|
238
|
+
x1: number;
|
|
239
|
+
y1: number;
|
|
240
|
+
x2: number;
|
|
241
|
+
y2: number;
|
|
242
|
+
stroke?: string;
|
|
243
|
+
strokeWidth?: number;
|
|
244
|
+
strokeDasharray?: string;
|
|
245
|
+
opacity?: number;
|
|
246
|
+
fadeIn?: number;
|
|
247
|
+
fadeOut?: number;
|
|
248
|
+
draw?: number;
|
|
249
|
+
easing?: EasingSpec;
|
|
250
|
+
}
|
|
251
|
+
|
|
252
|
+
export declare interface MatrixNode {
|
|
253
|
+
type: 'matrix';
|
|
254
|
+
id?: string;
|
|
255
|
+
values: (number | string)[][];
|
|
256
|
+
x?: number;
|
|
257
|
+
y?: number;
|
|
258
|
+
cellSize?: number;
|
|
259
|
+
color?: string;
|
|
260
|
+
bracketColor?: string;
|
|
261
|
+
fontSize?: number;
|
|
262
|
+
fadeIn?: number;
|
|
263
|
+
fadeOut?: number;
|
|
264
|
+
easing?: EasingSpec;
|
|
265
|
+
}
|
|
266
|
+
|
|
267
|
+
export declare interface MorphNode {
|
|
268
|
+
type: 'morph';
|
|
269
|
+
duration?: number;
|
|
270
|
+
easing?: EasingSpec;
|
|
271
|
+
fromColor?: string;
|
|
272
|
+
toColor?: string;
|
|
273
|
+
fromOpacity?: number;
|
|
274
|
+
toOpacity?: number;
|
|
275
|
+
fromScale?: number;
|
|
276
|
+
toScale?: number;
|
|
277
|
+
children: ElementNode[];
|
|
278
|
+
}
|
|
279
|
+
|
|
280
|
+
export declare interface ParallelNode {
|
|
281
|
+
type: 'parallel';
|
|
282
|
+
children: ElementNode[];
|
|
283
|
+
}
|
|
284
|
+
|
|
285
|
+
export declare interface PlayerNode {
|
|
286
|
+
type: 'player';
|
|
287
|
+
width?: number;
|
|
288
|
+
height?: number;
|
|
289
|
+
fps?: number;
|
|
290
|
+
durationInFrames: number;
|
|
291
|
+
background?: string;
|
|
292
|
+
controls?: boolean;
|
|
293
|
+
loop?: boolean;
|
|
294
|
+
autoPlay?: boolean;
|
|
295
|
+
children: ElementNode[];
|
|
296
|
+
}
|
|
297
|
+
|
|
298
|
+
export declare interface PolygonNode {
|
|
299
|
+
type: 'polygon';
|
|
300
|
+
id?: string;
|
|
301
|
+
points: [number, number][];
|
|
302
|
+
fill?: string;
|
|
303
|
+
stroke?: string;
|
|
304
|
+
strokeWidth?: number;
|
|
305
|
+
closed?: boolean;
|
|
306
|
+
opacity?: number;
|
|
307
|
+
fadeIn?: number;
|
|
308
|
+
fadeOut?: number;
|
|
309
|
+
draw?: number;
|
|
310
|
+
easing?: EasingSpec;
|
|
311
|
+
}
|
|
312
|
+
|
|
313
|
+
/**
|
|
314
|
+
* Create a new presentation. Entry point for the builder API.
|
|
315
|
+
*
|
|
316
|
+
* @example
|
|
317
|
+
* ```ts
|
|
318
|
+
* import { presentation, darkTheme } from '@elucim/dsl/builders';
|
|
319
|
+
*
|
|
320
|
+
* const doc = presentation('My Talk', darkTheme)
|
|
321
|
+
* .slide('Welcome', s => {
|
|
322
|
+
* s.title('Welcome to My Talk');
|
|
323
|
+
* s.subtitle('A visual journey');
|
|
324
|
+
* })
|
|
325
|
+
* .build();
|
|
326
|
+
* ```
|
|
327
|
+
*/
|
|
328
|
+
export declare function presentation(title: string, theme?: Theme, opts?: PresentationOptions): PresentationBuilder;
|
|
329
|
+
|
|
330
|
+
/**
|
|
331
|
+
* PresentationBuilder — top-level fluent API for creating presentations.
|
|
332
|
+
*
|
|
333
|
+
* Usage:
|
|
334
|
+
* ```ts
|
|
335
|
+
* const doc = presentation('My Talk', darkTheme)
|
|
336
|
+
* .slide('Intro', s => { s.title('Hello'); })
|
|
337
|
+
* .slide('Details', s => { s.boxRow([...]); })
|
|
338
|
+
* .build();
|
|
339
|
+
* ```
|
|
340
|
+
*/
|
|
341
|
+
export declare class PresentationBuilder {
|
|
342
|
+
private _title;
|
|
343
|
+
private _theme;
|
|
344
|
+
private _opts;
|
|
345
|
+
private _slides;
|
|
346
|
+
constructor(title: string, theme?: Theme, opts?: PresentationOptions);
|
|
347
|
+
/** Add a slide */
|
|
348
|
+
slide(title: string, build: (s: SlideBuilder) => void, opts?: {
|
|
349
|
+
notes?: string;
|
|
350
|
+
background?: string;
|
|
351
|
+
}): this;
|
|
352
|
+
/** Build the final ElucimDocument */
|
|
353
|
+
build(): ElucimDocument;
|
|
354
|
+
/** Build and return as JSON string (for saving to file) */
|
|
355
|
+
toJSON(pretty?: boolean): string;
|
|
356
|
+
}
|
|
357
|
+
|
|
358
|
+
export declare interface PresentationNode {
|
|
359
|
+
type: 'presentation';
|
|
360
|
+
width?: number;
|
|
361
|
+
height?: number;
|
|
362
|
+
background?: string;
|
|
363
|
+
transition?: TransitionType;
|
|
364
|
+
transitionDuration?: number;
|
|
365
|
+
showHud?: boolean;
|
|
366
|
+
showNotes?: boolean;
|
|
367
|
+
slides: SlideNode[];
|
|
368
|
+
}
|
|
369
|
+
|
|
370
|
+
export declare interface PresentationOptions {
|
|
371
|
+
width?: number;
|
|
372
|
+
height?: number;
|
|
373
|
+
fps?: number;
|
|
374
|
+
transition?: TransitionType;
|
|
375
|
+
transitionDuration?: number;
|
|
376
|
+
showHud?: boolean;
|
|
377
|
+
showNotes?: boolean;
|
|
378
|
+
}
|
|
379
|
+
|
|
380
|
+
export declare interface RectNode {
|
|
381
|
+
type: 'rect';
|
|
382
|
+
id?: string;
|
|
383
|
+
x: number;
|
|
384
|
+
y: number;
|
|
385
|
+
width: number;
|
|
386
|
+
height: number;
|
|
387
|
+
fill?: string;
|
|
388
|
+
stroke?: string;
|
|
389
|
+
strokeWidth?: number;
|
|
390
|
+
rx?: number;
|
|
391
|
+
ry?: number;
|
|
392
|
+
strokeDasharray?: string;
|
|
393
|
+
opacity?: number;
|
|
394
|
+
fadeIn?: number;
|
|
395
|
+
fadeOut?: number;
|
|
396
|
+
draw?: number;
|
|
397
|
+
easing?: EasingSpec;
|
|
398
|
+
}
|
|
399
|
+
|
|
400
|
+
/**
|
|
401
|
+
* Resolve an EasingSpec (string name or spring/cubicBezier object) to an EasingFunction.
|
|
402
|
+
* Returns undefined if the spec is undefined.
|
|
403
|
+
* Throws if the easing name is unknown.
|
|
404
|
+
*/
|
|
405
|
+
export declare function resolveEasing(spec: EasingSpec | undefined): EasingFunction | undefined;
|
|
406
|
+
|
|
407
|
+
export declare type RootNode = SceneNode | PlayerNode | PresentationNode;
|
|
408
|
+
|
|
409
|
+
export declare interface SceneNode {
|
|
410
|
+
type: 'scene';
|
|
411
|
+
width?: number;
|
|
412
|
+
height?: number;
|
|
413
|
+
fps?: number;
|
|
414
|
+
durationInFrames: number;
|
|
415
|
+
background?: string;
|
|
416
|
+
children: ElementNode[];
|
|
417
|
+
}
|
|
418
|
+
|
|
419
|
+
export declare interface SequenceNode {
|
|
420
|
+
type: 'sequence';
|
|
421
|
+
from: number;
|
|
422
|
+
durationInFrames?: number;
|
|
423
|
+
name?: string;
|
|
424
|
+
children: ElementNode[];
|
|
425
|
+
}
|
|
426
|
+
|
|
427
|
+
/**
|
|
428
|
+
* SlideBuilder — fluent API for composing slide content.
|
|
429
|
+
*
|
|
430
|
+
* Manages automatic frame-based timing: each call appends elements
|
|
431
|
+
* at the current "cursor" position and advances it.
|
|
432
|
+
*/
|
|
433
|
+
export declare class SlideBuilder {
|
|
434
|
+
private elements;
|
|
435
|
+
private cursor;
|
|
436
|
+
private _fps;
|
|
437
|
+
private _width;
|
|
438
|
+
private _height;
|
|
439
|
+
theme: Theme;
|
|
440
|
+
constructor(theme: Theme, fps?: number, width?: number, height?: number);
|
|
441
|
+
get width(): number;
|
|
442
|
+
get height(): number;
|
|
443
|
+
get fps(): number;
|
|
444
|
+
get cx(): number;
|
|
445
|
+
get cy(): number;
|
|
446
|
+
/** Current animation frame cursor */
|
|
447
|
+
get frame(): number;
|
|
448
|
+
/** Advance the cursor by N frames */
|
|
449
|
+
wait(frames: number): this;
|
|
450
|
+
/** Set cursor to an absolute frame */
|
|
451
|
+
at(frame: number): this;
|
|
452
|
+
/** Large centered title text */
|
|
453
|
+
title(content: string, opts?: {
|
|
454
|
+
y?: number;
|
|
455
|
+
fontSize?: number;
|
|
456
|
+
color?: string;
|
|
457
|
+
}): this;
|
|
458
|
+
/** Smaller subtitle text */
|
|
459
|
+
subtitle(content: string, opts?: {
|
|
460
|
+
y?: number;
|
|
461
|
+
fontSize?: number;
|
|
462
|
+
color?: string;
|
|
463
|
+
}): this;
|
|
464
|
+
/** Add a LaTeX expression */
|
|
465
|
+
latex(expression: string, opts?: {
|
|
466
|
+
x?: number;
|
|
467
|
+
y?: number;
|
|
468
|
+
fontSize?: number;
|
|
469
|
+
color?: string;
|
|
470
|
+
fadeIn?: number;
|
|
471
|
+
advance?: number;
|
|
472
|
+
}): this;
|
|
473
|
+
/** Add text at a position */
|
|
474
|
+
text(content: string, opts: {
|
|
475
|
+
x: number;
|
|
476
|
+
y: number;
|
|
477
|
+
fontSize?: number;
|
|
478
|
+
color?: string;
|
|
479
|
+
anchor?: 'start' | 'middle' | 'end';
|
|
480
|
+
fontWeight?: string | number;
|
|
481
|
+
fontFamily?: string;
|
|
482
|
+
fadeIn?: number;
|
|
483
|
+
advance?: number;
|
|
484
|
+
}): this;
|
|
485
|
+
/** Add an arrow */
|
|
486
|
+
arrow(x1: number, y1: number, x2: number, y2: number, opts?: {
|
|
487
|
+
color?: string;
|
|
488
|
+
strokeWidth?: number;
|
|
489
|
+
headSize?: number;
|
|
490
|
+
dashed?: boolean;
|
|
491
|
+
fadeIn?: number;
|
|
492
|
+
advance?: number;
|
|
493
|
+
}): this;
|
|
494
|
+
/** Add a line */
|
|
495
|
+
line(x1: number, y1: number, x2: number, y2: number, opts?: {
|
|
496
|
+
color?: string;
|
|
497
|
+
strokeWidth?: number;
|
|
498
|
+
dashed?: boolean;
|
|
499
|
+
fadeIn?: number;
|
|
500
|
+
advance?: number;
|
|
501
|
+
}): this;
|
|
502
|
+
/** Add a rectangle */
|
|
503
|
+
rect(x: number, y: number, w: number, h: number, opts?: {
|
|
504
|
+
fill?: string;
|
|
505
|
+
stroke?: string;
|
|
506
|
+
strokeWidth?: number;
|
|
507
|
+
rx?: number;
|
|
508
|
+
dashed?: boolean;
|
|
509
|
+
fadeIn?: number;
|
|
510
|
+
advance?: number;
|
|
511
|
+
}): this;
|
|
512
|
+
/** Add a circle */
|
|
513
|
+
circle(cx: number, cy: number, r: number, opts?: {
|
|
514
|
+
fill?: string;
|
|
515
|
+
stroke?: string;
|
|
516
|
+
strokeWidth?: number;
|
|
517
|
+
fadeIn?: number;
|
|
518
|
+
advance?: number;
|
|
519
|
+
}): this;
|
|
520
|
+
/** Add a bar chart */
|
|
521
|
+
barChart(bars: {
|
|
522
|
+
label: string;
|
|
523
|
+
value: number;
|
|
524
|
+
color?: string;
|
|
525
|
+
}[], opts: {
|
|
526
|
+
x: number;
|
|
527
|
+
y: number;
|
|
528
|
+
width: number;
|
|
529
|
+
height: number;
|
|
530
|
+
barColor?: string;
|
|
531
|
+
labelColor?: string;
|
|
532
|
+
maxValue?: number;
|
|
533
|
+
valueFormat?: 'number' | 'percent';
|
|
534
|
+
gap?: number;
|
|
535
|
+
fadeIn?: number;
|
|
536
|
+
showValues?: boolean;
|
|
537
|
+
labelFontSize?: number;
|
|
538
|
+
}): this;
|
|
539
|
+
/** Add a matrix visualization */
|
|
540
|
+
matrix(values: (number | string)[][], opts?: {
|
|
541
|
+
x?: number;
|
|
542
|
+
y?: number;
|
|
543
|
+
cellSize?: number;
|
|
544
|
+
color?: string;
|
|
545
|
+
bracketColor?: string;
|
|
546
|
+
fontSize?: number;
|
|
547
|
+
fadeIn?: number;
|
|
548
|
+
}): this;
|
|
549
|
+
/** Add a graph (nodes + edges) */
|
|
550
|
+
graph(nodes: {
|
|
551
|
+
id: string;
|
|
552
|
+
x: number;
|
|
553
|
+
y: number;
|
|
554
|
+
label?: string;
|
|
555
|
+
color?: string;
|
|
556
|
+
radius?: number;
|
|
557
|
+
}[], edges: {
|
|
558
|
+
from: string;
|
|
559
|
+
to: string;
|
|
560
|
+
directed?: boolean;
|
|
561
|
+
label?: string;
|
|
562
|
+
color?: string;
|
|
563
|
+
}[], opts?: {
|
|
564
|
+
nodeColor?: string;
|
|
565
|
+
edgeColor?: string;
|
|
566
|
+
labelColor?: string;
|
|
567
|
+
nodeRadius?: number;
|
|
568
|
+
edgeWidth?: number;
|
|
569
|
+
fadeIn?: number;
|
|
570
|
+
}): this;
|
|
571
|
+
/**
|
|
572
|
+
* Render a horizontal row of labeled boxes.
|
|
573
|
+
* Returns the box positions for follow-up arrows, etc.
|
|
574
|
+
*/
|
|
575
|
+
boxRow(labels: string[], opts?: {
|
|
576
|
+
y?: number;
|
|
577
|
+
boxWidth?: number;
|
|
578
|
+
boxHeight?: number;
|
|
579
|
+
gap?: number;
|
|
580
|
+
colors?: string[];
|
|
581
|
+
textColor?: string;
|
|
582
|
+
fontSize?: number;
|
|
583
|
+
fillOpacity?: number;
|
|
584
|
+
strokeColors?: string[];
|
|
585
|
+
fadeIn?: number;
|
|
586
|
+
fontFamily?: string;
|
|
587
|
+
}): {
|
|
588
|
+
x: number;
|
|
589
|
+
y: number;
|
|
590
|
+
w: number;
|
|
591
|
+
h: number;
|
|
592
|
+
cx: number;
|
|
593
|
+
cy: number;
|
|
594
|
+
}[];
|
|
595
|
+
/**
|
|
596
|
+
* Render a vertical stack of labeled boxes.
|
|
597
|
+
*/
|
|
598
|
+
boxColumn(labels: string[], opts?: {
|
|
599
|
+
x?: number;
|
|
600
|
+
y?: number;
|
|
601
|
+
boxWidth?: number;
|
|
602
|
+
boxHeight?: number;
|
|
603
|
+
gap?: number;
|
|
604
|
+
colors?: string[];
|
|
605
|
+
textColor?: string;
|
|
606
|
+
fontSize?: number;
|
|
607
|
+
fadeIn?: number;
|
|
608
|
+
}): {
|
|
609
|
+
x: number;
|
|
610
|
+
y: number;
|
|
611
|
+
w: number;
|
|
612
|
+
h: number;
|
|
613
|
+
cx: number;
|
|
614
|
+
cy: number;
|
|
615
|
+
}[];
|
|
616
|
+
/**
|
|
617
|
+
* Draw arrows connecting sequential positions (e.g., output of boxRow/boxColumn).
|
|
618
|
+
*/
|
|
619
|
+
connectDown(positions: {
|
|
620
|
+
cx: number;
|
|
621
|
+
y: number;
|
|
622
|
+
h: number;
|
|
623
|
+
}[], opts?: {
|
|
624
|
+
color?: string;
|
|
625
|
+
headSize?: number;
|
|
626
|
+
}): this;
|
|
627
|
+
/**
|
|
628
|
+
* Draw arrows between two rows of boxes (fan-out pattern).
|
|
629
|
+
*/
|
|
630
|
+
connectRows(fromPositions: {
|
|
631
|
+
cx: number;
|
|
632
|
+
y: number;
|
|
633
|
+
h: number;
|
|
634
|
+
}[], toPositions: {
|
|
635
|
+
cx: number;
|
|
636
|
+
y: number;
|
|
637
|
+
}[], opts?: {
|
|
638
|
+
color?: string;
|
|
639
|
+
headSize?: number;
|
|
640
|
+
}): this;
|
|
641
|
+
/** Add any raw ElementNode at the current cursor position */
|
|
642
|
+
add(node: ElementNode, advanceFrames?: number): this;
|
|
643
|
+
/** Add a raw element at a specific frame (doesn't move cursor) */
|
|
644
|
+
addAt(frame: number, node: ElementNode): this;
|
|
645
|
+
/** Add multiple raw elements simultaneously at current cursor */
|
|
646
|
+
addAll(nodes: ElementNode[], advanceFrames?: number): this;
|
|
647
|
+
private addAtCursor;
|
|
648
|
+
/** Build the slide's player node with all timed elements */
|
|
649
|
+
_build(): {
|
|
650
|
+
elements: ElementNode[];
|
|
651
|
+
durationInFrames: number;
|
|
652
|
+
};
|
|
653
|
+
}
|
|
654
|
+
|
|
655
|
+
export declare interface SlideNode {
|
|
656
|
+
type: 'slide';
|
|
657
|
+
title?: string;
|
|
658
|
+
notes?: string;
|
|
659
|
+
background?: string;
|
|
660
|
+
children: ElementNode[];
|
|
661
|
+
}
|
|
662
|
+
|
|
663
|
+
export declare interface SpringEasing {
|
|
664
|
+
type: 'spring';
|
|
665
|
+
stiffness?: number;
|
|
666
|
+
damping?: number;
|
|
667
|
+
mass?: number;
|
|
668
|
+
}
|
|
669
|
+
|
|
670
|
+
export declare interface StaggerNode {
|
|
671
|
+
type: 'stagger';
|
|
672
|
+
staggerDelay?: number;
|
|
673
|
+
easing?: EasingSpec;
|
|
674
|
+
children: ElementNode[];
|
|
675
|
+
}
|
|
676
|
+
|
|
677
|
+
export declare interface TextNode {
|
|
678
|
+
type: 'text';
|
|
679
|
+
id?: string;
|
|
680
|
+
x: number;
|
|
681
|
+
y: number;
|
|
682
|
+
content: string;
|
|
683
|
+
fill?: string;
|
|
684
|
+
fontSize?: number;
|
|
685
|
+
fontFamily?: string;
|
|
686
|
+
fontWeight?: string | number;
|
|
687
|
+
textAnchor?: 'start' | 'middle' | 'end';
|
|
688
|
+
dominantBaseline?: 'auto' | 'middle' | 'hanging' | 'central';
|
|
689
|
+
opacity?: number;
|
|
690
|
+
fadeIn?: number;
|
|
691
|
+
fadeOut?: number;
|
|
692
|
+
easing?: EasingSpec;
|
|
693
|
+
}
|
|
694
|
+
|
|
695
|
+
/**
|
|
696
|
+
* Theme configuration for presentation builders.
|
|
697
|
+
* Provides consistent colors across slides.
|
|
698
|
+
*/
|
|
699
|
+
export declare interface Theme {
|
|
700
|
+
background: string;
|
|
701
|
+
/** Title text color */
|
|
702
|
+
title: string;
|
|
703
|
+
/** Subtitle / secondary text */
|
|
704
|
+
subtitle: string;
|
|
705
|
+
/** Primary accent (arrows, highlights) */
|
|
706
|
+
primary: string;
|
|
707
|
+
/** Secondary accent */
|
|
708
|
+
secondary: string;
|
|
709
|
+
/** Tertiary accent */
|
|
710
|
+
tertiary: string;
|
|
711
|
+
/** Muted text / annotations */
|
|
712
|
+
muted: string;
|
|
713
|
+
/** Default text color */
|
|
714
|
+
text: string;
|
|
715
|
+
/** Box fill colors for diagrams */
|
|
716
|
+
boxFill: string;
|
|
717
|
+
/** Box stroke color */
|
|
718
|
+
boxStroke: string;
|
|
719
|
+
/** Success / positive color */
|
|
720
|
+
success: string;
|
|
721
|
+
/** Warning / highlight color */
|
|
722
|
+
warning: string;
|
|
723
|
+
/** Error / negative color */
|
|
724
|
+
error: string;
|
|
725
|
+
/** Palette of 8 colors for sequential use */
|
|
726
|
+
palette: string[];
|
|
727
|
+
}
|
|
728
|
+
|
|
729
|
+
export declare interface TransformNode {
|
|
730
|
+
type: 'transform';
|
|
731
|
+
duration?: number;
|
|
732
|
+
easing?: EasingSpec;
|
|
733
|
+
translate?: {
|
|
734
|
+
from: [number, number];
|
|
735
|
+
to: [number, number];
|
|
736
|
+
};
|
|
737
|
+
scale?: {
|
|
738
|
+
from: number;
|
|
739
|
+
to: number;
|
|
740
|
+
};
|
|
741
|
+
rotate?: {
|
|
742
|
+
from: number;
|
|
743
|
+
to: number;
|
|
744
|
+
};
|
|
745
|
+
opacity?: {
|
|
746
|
+
from: number;
|
|
747
|
+
to: number;
|
|
748
|
+
};
|
|
749
|
+
children: ElementNode[];
|
|
750
|
+
}
|
|
751
|
+
|
|
752
|
+
declare type TransitionType = 'none' | 'fade' | 'slide-left' | 'slide-up' | 'zoom';
|
|
753
|
+
|
|
754
|
+
export declare function validate(doc: unknown): ValidationResult;
|
|
755
|
+
|
|
756
|
+
/**
|
|
757
|
+
* Validate an expression string without evaluating it.
|
|
758
|
+
* Returns null if valid, or an error message string.
|
|
759
|
+
*/
|
|
760
|
+
export declare function validateExpression(expr: string): string | null;
|
|
761
|
+
|
|
762
|
+
export declare interface ValidationError {
|
|
763
|
+
path: string;
|
|
764
|
+
message: string;
|
|
765
|
+
severity: 'error' | 'warning';
|
|
766
|
+
}
|
|
767
|
+
|
|
768
|
+
export declare interface ValidationResult {
|
|
769
|
+
valid: boolean;
|
|
770
|
+
errors: ValidationError[];
|
|
771
|
+
}
|
|
772
|
+
|
|
773
|
+
export declare interface VectorFieldNode {
|
|
774
|
+
type: 'vectorField';
|
|
775
|
+
/** Vector expression string, e.g. "[-y, x]" */
|
|
776
|
+
fn: string;
|
|
777
|
+
domain?: [number, number];
|
|
778
|
+
range?: [number, number];
|
|
779
|
+
step?: number;
|
|
780
|
+
origin?: [number, number];
|
|
781
|
+
scale?: number;
|
|
782
|
+
arrowScale?: number;
|
|
783
|
+
color?: string;
|
|
784
|
+
strokeWidth?: number;
|
|
785
|
+
headSize?: number;
|
|
786
|
+
normalize?: boolean;
|
|
787
|
+
maxLength?: number;
|
|
788
|
+
fadeIn?: number;
|
|
789
|
+
fadeOut?: number;
|
|
790
|
+
easing?: EasingSpec;
|
|
791
|
+
}
|
|
792
|
+
|
|
793
|
+
export declare interface VectorNode {
|
|
794
|
+
type: 'vector';
|
|
795
|
+
id?: string;
|
|
796
|
+
from?: [number, number];
|
|
797
|
+
to: [number, number];
|
|
798
|
+
origin?: [number, number];
|
|
799
|
+
scale?: number;
|
|
800
|
+
color?: string;
|
|
801
|
+
strokeWidth?: number;
|
|
802
|
+
headSize?: number;
|
|
803
|
+
label?: string;
|
|
804
|
+
labelOffset?: [number, number];
|
|
805
|
+
labelColor?: string;
|
|
806
|
+
labelFontSize?: number;
|
|
807
|
+
fadeIn?: number;
|
|
808
|
+
fadeOut?: number;
|
|
809
|
+
draw?: number;
|
|
810
|
+
easing?: EasingSpec;
|
|
811
|
+
}
|
|
812
|
+
|
|
813
|
+
export declare interface WriteNode {
|
|
814
|
+
type: 'write';
|
|
815
|
+
duration?: number;
|
|
816
|
+
easing?: EasingSpec;
|
|
817
|
+
children: ElementNode[];
|
|
818
|
+
}
|
|
819
|
+
|
|
820
|
+
export { }
|