sketchmark 1.1.6 → 1.2.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 +193 -147
- package/dist/animation/index.d.ts +2 -0
- package/dist/animation/index.d.ts.map +1 -1
- package/dist/ast/types.d.ts +3 -0
- package/dist/ast/types.d.ts.map +1 -1
- package/dist/index.cjs +228 -95
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.ts +2 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +228 -95
- package/dist/index.js.map +1 -1
- package/dist/layout/index.d.ts +8 -0
- package/dist/layout/index.d.ts.map +1 -1
- package/dist/parser/index.d.ts +2 -1
- package/dist/parser/index.d.ts.map +1 -1
- package/dist/parser/tokenizer.d.ts.map +1 -1
- package/dist/plugins.d.ts +12 -0
- package/dist/plugins.d.ts.map +1 -0
- package/dist/render.d.ts +2 -0
- package/dist/render.d.ts.map +1 -1
- package/dist/renderer/shared.d.ts +1 -1
- package/dist/renderer/shared.d.ts.map +1 -1
- package/dist/renderer/svg/index.d.ts.map +1 -1
- package/dist/scene/index.d.ts +2 -0
- package/dist/scene/index.d.ts.map +1 -1
- package/dist/sketchmark.iife.js +228 -95
- package/dist/ui/canvas.d.ts +2 -0
- package/dist/ui/canvas.d.ts.map +1 -1
- package/dist/ui/embed.d.ts +2 -0
- package/dist/ui/embed.d.ts.map +1 -1
- package/package.json +18 -1
package/README.md
CHANGED
|
@@ -68,6 +68,45 @@ const instance = render({
|
|
|
68
68
|
});
|
|
69
69
|
```
|
|
70
70
|
|
|
71
|
+
### Plugins
|
|
72
|
+
|
|
73
|
+
Sketchmark supports lightweight parse plugins. A plugin can preprocess the DSL source before parsing, transform the parsed AST after parsing, or do both. This keeps domain features like official packages such as `@sketchmark/plugin-notation` outside the core bundle.
|
|
74
|
+
|
|
75
|
+
```typescript
|
|
76
|
+
import { render } from 'sketchmark';
|
|
77
|
+
import { notation } from '@sketchmark/plugin-notation';
|
|
78
|
+
|
|
79
|
+
render({
|
|
80
|
+
container: document.getElementById('diagram'),
|
|
81
|
+
dsl: `
|
|
82
|
+
diagram
|
|
83
|
+
box eq label="$x^2 + y^2 = z^2$"
|
|
84
|
+
step narrate "$\\theta = 45^\\circ$"
|
|
85
|
+
end
|
|
86
|
+
`.trim(),
|
|
87
|
+
plugins: [notation()],
|
|
88
|
+
});
|
|
89
|
+
```
|
|
90
|
+
|
|
91
|
+
The first `@sketchmark/plugin-notation` release focuses on lightweight TeX-style math to Unicode conversion for labels and `step narrate`, which keeps the core renderer small while still making math-heavy diagrams nicer to author.
|
|
92
|
+
|
|
93
|
+
Another official package, `@sketchmark/plugin-geometry`, follows the same model by compiling `geo.*` commands into ordinary `circle`, `path`, and `text` nodes for textbook-style diagrams without adding geometry-specific renderer logic to the core bundle.
|
|
94
|
+
|
|
95
|
+
`@sketchmark/plugin-anchors` keeps edge syntax readable by rewriting endpoint refs like `a@right --> b@left` into ordinary edges with anchor metadata, which lets named attachment points stay outside the core parser surface.
|
|
96
|
+
|
|
97
|
+
`@sketchmark/plugin-annotations` builds on that idea for geometry-style marks such as angle arcs, right-angle squares, equal ticks, midpoint marks, and dimension lines, again by compiling into ordinary Sketchmark nodes.
|
|
98
|
+
|
|
99
|
+
`@sketchmark/plugin-wireframe` applies the same pattern to primitive UI mockups, compiling `wf.screen`, `wf.panel`, `wf.text`, `wf.media`, `wf.control`, and `wf.divider` into regular Sketchmark groups and nodes so wireframe support stays outside the core bundle too.
|
|
100
|
+
|
|
101
|
+
`@sketchmark/plugin-circuit` does the same for draw-focused circuit notation, compiling `ckt.comp`, `ckt.port`, `ckt.junction`, and `ckt.wire` into regular groups plus `path`, `circle`, and `text` nodes.
|
|
102
|
+
|
|
103
|
+
`@sketchmark/plugin-chem-molecule` extends the same pattern to lightweight molecule diagrams, compiling `chem.atom`, `chem.bond`, `chem.ring`, and `chem.label` into ordinary groups plus `path` and `text` nodes.
|
|
104
|
+
|
|
105
|
+
`@sketchmark/plugin-graph` applies the same approach to coordinate-plane graphing, compiling `graph.axes`, `graph.plot`, `graph.point`, `graph.line`, `graph.arrow`, `graph.region`, `graph.tangent`, and `graph.area` into ordinary nodes so sampled math graphs stay outside the core bundle too.
|
|
106
|
+
|
|
107
|
+
|
|
108
|
+
|
|
109
|
+
|
|
71
110
|
### Reusable UI Widgets
|
|
72
111
|
|
|
73
112
|
```javascript
|
|
@@ -84,11 +123,11 @@ end
|
|
|
84
123
|
`.trim(),
|
|
85
124
|
});
|
|
86
125
|
|
|
87
|
-
const canvas = new SketchmarkCanvas({
|
|
88
|
-
container: document.getElementById('viewport'),
|
|
89
|
-
showCaption: false,
|
|
90
|
-
tts: true,
|
|
91
|
-
});
|
|
126
|
+
const canvas = new SketchmarkCanvas({
|
|
127
|
+
container: document.getElementById('viewport'),
|
|
128
|
+
showCaption: false,
|
|
129
|
+
tts: true,
|
|
130
|
+
});
|
|
92
131
|
|
|
93
132
|
canvas.bindEditor(editor);
|
|
94
133
|
```
|
|
@@ -96,21 +135,21 @@ canvas.bindEditor(editor);
|
|
|
96
135
|
```javascript
|
|
97
136
|
import { SketchmarkEmbed } from 'sketchmark';
|
|
98
137
|
|
|
99
|
-
const embed = new SketchmarkEmbed({
|
|
100
|
-
container: document.getElementById('article-embed'),
|
|
101
|
-
dsl,
|
|
102
|
-
width: 960,
|
|
103
|
-
height: 540,
|
|
104
|
-
playStepDelay: 700,
|
|
105
|
-
showCaption: false,
|
|
106
|
-
tts: true,
|
|
107
|
-
fitPadding: 24,
|
|
108
|
-
zoomMin: 0.08,
|
|
109
|
-
zoomMax: 4,
|
|
110
|
-
});
|
|
111
|
-
```
|
|
112
|
-
|
|
113
|
-
Use `SketchmarkCanvas` for the full playground-style surface, and `SketchmarkEmbed` for fixed-size embeds that clip overflow, auto-fit large diagrams, and expose built-in zoom, playback, caption, and TTS controls.
|
|
138
|
+
const embed = new SketchmarkEmbed({
|
|
139
|
+
container: document.getElementById('article-embed'),
|
|
140
|
+
dsl,
|
|
141
|
+
width: 960,
|
|
142
|
+
height: 540,
|
|
143
|
+
playStepDelay: 700,
|
|
144
|
+
showCaption: false,
|
|
145
|
+
tts: true,
|
|
146
|
+
fitPadding: 24,
|
|
147
|
+
zoomMin: 0.08,
|
|
148
|
+
zoomMax: 4,
|
|
149
|
+
});
|
|
150
|
+
```
|
|
151
|
+
|
|
152
|
+
Use `SketchmarkCanvas` for the full playground-style surface, and `SketchmarkEmbed` for fixed-size embeds that clip overflow, auto-fit large diagrams, and expose built-in zoom, playback, caption, and TTS controls.
|
|
114
153
|
|
|
115
154
|
---
|
|
116
155
|
|
|
@@ -263,28 +302,28 @@ Every diagram follows this structure:
|
|
|
263
302
|
```
|
|
264
303
|
diagram
|
|
265
304
|
[title label="My Title"]
|
|
266
|
-
[layout row|column|grid|absolute]
|
|
305
|
+
[layout row|column|grid|absolute]
|
|
267
306
|
[config key=value ...]
|
|
268
307
|
[theme name fill="..." stroke="..." color="..."]
|
|
269
308
|
|
|
270
309
|
[nodes, edges, groups, tables, charts, markdown blocks]
|
|
271
310
|
|
|
272
|
-
[step action target ...]
|
|
273
|
-
end
|
|
274
|
-
```
|
|
275
|
-
|
|
276
|
-
When `layout=absolute`, authored elements use `x`/`y` coordinates instead of flow layout:
|
|
277
|
-
|
|
278
|
-
```
|
|
279
|
-
diagram
|
|
280
|
-
layout absolute
|
|
281
|
-
box start x=40 y=60 label="Start"
|
|
282
|
-
box finish x=240 y=140 label="Finish"
|
|
283
|
-
start --> finish
|
|
284
|
-
end
|
|
285
|
-
```
|
|
286
|
-
|
|
287
|
-
- Lines starting with `#` or `//` are comments.
|
|
311
|
+
[step action target ...]
|
|
312
|
+
end
|
|
313
|
+
```
|
|
314
|
+
|
|
315
|
+
When `layout=absolute`, authored elements use `x`/`y` coordinates instead of flow layout:
|
|
316
|
+
|
|
317
|
+
```
|
|
318
|
+
diagram
|
|
319
|
+
layout absolute
|
|
320
|
+
box start x=40 y=60 label="Start"
|
|
321
|
+
box finish x=240 y=140 label="Finish"
|
|
322
|
+
start --> finish
|
|
323
|
+
end
|
|
324
|
+
```
|
|
325
|
+
|
|
326
|
+
- Lines starting with `#` or `//` are comments.
|
|
288
327
|
- All key-value attributes use the `key=value` or `key="quoted value"` syntax.
|
|
289
328
|
- The DSL is **whitespace-sensitive** — do not indent lines.
|
|
290
329
|
|
|
@@ -338,12 +377,12 @@ note myNote label="Remember this!"
|
|
|
338
377
|
|
|
339
378
|
| Property | Type | Description | Example |
|
|
340
379
|
|----------|------|-------------|---------|
|
|
341
|
-
| `label` | string | Display text (required) | `label="Hello World"` |
|
|
342
|
-
| `width` | number | Override auto-width (px) | `width=140` |
|
|
343
|
-
| `height` | number | Override auto-height (px) | `height=55` |
|
|
344
|
-
| `x` | number | Authored X position when parent/root uses `layout=absolute` | `x=80` |
|
|
345
|
-
| `y` | number | Authored Y position when parent/root uses `layout=absolute` | `y=40` |
|
|
346
|
-
| `theme` | string | Named theme preset | `theme=primary` |
|
|
380
|
+
| `label` | string | Display text (required) | `label="Hello World"` |
|
|
381
|
+
| `width` | number | Override auto-width (px) | `width=140` |
|
|
382
|
+
| `height` | number | Override auto-height (px) | `height=55` |
|
|
383
|
+
| `x` | number | Authored X position when parent/root uses `layout=absolute` | `x=80` |
|
|
384
|
+
| `y` | number | Authored Y position when parent/root uses `layout=absolute` | `y=40` |
|
|
385
|
+
| `theme` | string | Named theme preset | `theme=primary` |
|
|
347
386
|
| `fill` | CSS color | Background fill color | `fill="#e8f4ff"` |
|
|
348
387
|
| `stroke` | CSS color | Border/outline color | `stroke="#0044cc"` |
|
|
349
388
|
| `stroke-width` | number | Border thickness | `stroke-width=2` |
|
|
@@ -362,8 +401,8 @@ note myNote label="Remember this!"
|
|
|
362
401
|
| `name` | string | Iconify icon name (for `icon`) | `name="mdi:cog"` |
|
|
363
402
|
| `value` | string | SVG path data (for `path`) | `value="M 0 0 L 50 0"` |
|
|
364
403
|
| `deg` | number | Static rotation (degrees) | `deg=45` |
|
|
365
|
-
| `dx` | number | Static visual X translation after layout (px) | `dx=20` |
|
|
366
|
-
| `dy` | number | Static visual Y translation after layout (px) | `dy=-10` |
|
|
404
|
+
| `dx` | number | Static visual X translation after layout (px) | `dx=20` |
|
|
405
|
+
| `dy` | number | Static visual Y translation after layout (px) | `dy=-10` |
|
|
367
406
|
| `factor` | number | Static scale factor | `factor=1.2` |
|
|
368
407
|
|
|
369
408
|
---
|
|
@@ -433,12 +472,12 @@ group outer label="Outer Group" layout=column items=[a,b,inner]
|
|
|
433
472
|
General form:
|
|
434
473
|
|
|
435
474
|
```
|
|
436
|
-
group <id> [label="..."] [layout=row|column|grid|absolute] [gap=N] [padding=N]
|
|
437
|
-
[columns=N] [align=start|center|end]
|
|
438
|
-
[justify=start|center|end|space-between|space-around]
|
|
439
|
-
[theme=...] [fill="..."] [stroke="..."] [x=N] [y=N] [width=N] [height=N]
|
|
440
|
-
[items=[id1,id2,...]]
|
|
441
|
-
```
|
|
475
|
+
group <id> [label="..."] [layout=row|column|grid|absolute] [gap=N] [padding=N]
|
|
476
|
+
[columns=N] [align=start|center|end]
|
|
477
|
+
[justify=start|center|end|space-between|space-around]
|
|
478
|
+
[theme=...] [fill="..."] [stroke="..."] [x=N] [y=N] [width=N] [height=N]
|
|
479
|
+
[items=[id1,id2,...]]
|
|
480
|
+
```
|
|
442
481
|
|
|
443
482
|
- Groups are always declared at the top level.
|
|
444
483
|
- `items` order is the visual child order.
|
|
@@ -450,22 +489,22 @@ group <id> [label="..."] [layout=row|column|grid|absolute] [gap=N] [padding=N]
|
|
|
450
489
|
| Property | Type | Description |
|
|
451
490
|
|----------|------|-------------|
|
|
452
491
|
| `label` | string | Group title (shown at top) |
|
|
453
|
-
| `layout` | row / column / grid / absolute | Child arrangement direction |
|
|
454
|
-
| `gap` | number | Space between children (px) |
|
|
455
|
-
| `padding` | number | Inner padding (px) |
|
|
456
|
-
| `columns` | number | Column count (for `layout=grid`) |
|
|
457
|
-
| `align` | start/center/end | Cross-axis alignment (align-items) |
|
|
458
|
-
| `justify` | start/center/end/space-between/space-around | Main-axis alignment |
|
|
459
|
-
| `x` | number | Authored X position when parent/root uses `layout=absolute` |
|
|
460
|
-
| `y` | number | Authored Y position when parent/root uses `layout=absolute` |
|
|
461
|
-
| `width` | number | Minimum width override |
|
|
462
|
-
| `height` | number | Minimum height override |
|
|
463
|
-
| `theme` | string | Named theme preset |
|
|
464
|
-
| `fill` | CSS color | Background color |
|
|
465
|
-
| `stroke` | CSS color | Border color |
|
|
466
|
-
| `stroke-width` | number | Border thickness |
|
|
467
|
-
|
|
468
|
-
For absolute groups, child `x`/`y` coordinates are relative to the group's inner content box.
|
|
492
|
+
| `layout` | row / column / grid / absolute | Child arrangement direction |
|
|
493
|
+
| `gap` | number | Space between children (px) |
|
|
494
|
+
| `padding` | number | Inner padding (px) |
|
|
495
|
+
| `columns` | number | Column count (for `layout=grid`) |
|
|
496
|
+
| `align` | start/center/end | Cross-axis alignment (align-items) |
|
|
497
|
+
| `justify` | start/center/end/space-between/space-around | Main-axis alignment |
|
|
498
|
+
| `x` | number | Authored X position when parent/root uses `layout=absolute` |
|
|
499
|
+
| `y` | number | Authored Y position when parent/root uses `layout=absolute` |
|
|
500
|
+
| `width` | number | Minimum width override |
|
|
501
|
+
| `height` | number | Minimum height override |
|
|
502
|
+
| `theme` | string | Named theme preset |
|
|
503
|
+
| `fill` | CSS color | Background color |
|
|
504
|
+
| `stroke` | CSS color | Border color |
|
|
505
|
+
| `stroke-width` | number | Border thickness |
|
|
506
|
+
|
|
507
|
+
For absolute groups, child `x`/`y` coordinates are relative to the group's inner content box.
|
|
469
508
|
|
|
470
509
|
#### `bare` keyword
|
|
471
510
|
|
|
@@ -482,7 +521,7 @@ bare myContainer layout=row items=[a,b]
|
|
|
482
521
|
## Tables
|
|
483
522
|
|
|
484
523
|
```
|
|
485
|
-
table <id> [label="..."] [x=N] [y=N] [theme=...] [fill="..."] [stroke="..."]
|
|
524
|
+
table <id> [label="..."] [x=N] [y=N] [theme=...] [fill="..."] [stroke="..."]
|
|
486
525
|
{
|
|
487
526
|
header Col1 Col2 Col3
|
|
488
527
|
row "Value A" "Value B" "Value C"
|
|
@@ -490,19 +529,19 @@ table <id> [label="..."] [x=N] [y=N] [theme=...] [fill="..."] [stroke="..."]
|
|
|
490
529
|
}
|
|
491
530
|
```
|
|
492
531
|
|
|
493
|
-
- `header` rows get a shaded background and bold text.
|
|
494
|
-
- `row` rows use regular styling.
|
|
495
|
-
- `"value"` must use a double-quoted string literal.
|
|
496
|
-
- Column widths auto-size to content.
|
|
497
|
-
- Tables support `fill`, `stroke`, `color`, `font-size`, `font`, `text-align`, `letter-spacing`, `theme`, `opacity` style props (same as nodes).
|
|
498
|
-
- Tables also accept `x` and `y` when the parent/root uses `layout=absolute`.
|
|
532
|
+
- `header` rows get a shaded background and bold text.
|
|
533
|
+
- `row` rows use regular styling.
|
|
534
|
+
- `"value"` must use a double-quoted string literal.
|
|
535
|
+
- Column widths auto-size to content.
|
|
536
|
+
- Tables support `fill`, `stroke`, `color`, `font-size`, `font`, `text-align`, `letter-spacing`, `theme`, `opacity` style props (same as nodes).
|
|
537
|
+
- Tables also accept `x` and `y` when the parent/root uses `layout=absolute`.
|
|
499
538
|
|
|
500
539
|
---
|
|
501
540
|
|
|
502
541
|
## Charts
|
|
503
542
|
|
|
504
543
|
```
|
|
505
|
-
<chart-type> <id> [label="Title"] [x=N] [y=N] [width=N] [height=N] [theme=...] [style props]
|
|
544
|
+
<chart-type> <id> [label="Title"] [x=N] [y=N] [width=N] [height=N] [theme=...] [style props]
|
|
506
545
|
data
|
|
507
546
|
[["Category", "Series1", "Series2"],
|
|
508
547
|
["Jan", 120, 80],
|
|
@@ -530,15 +569,15 @@ data
|
|
|
530
569
|
["Mar", 1100, 750]]
|
|
531
570
|
|
|
532
571
|
# Pie chart example
|
|
533
|
-
pie-chart share label="Market Share" width=300 height=240
|
|
534
|
-
data
|
|
535
|
-
[["Company", "Share"],
|
|
536
|
-
["Alpha", 42],
|
|
537
|
-
["Beta", 31],
|
|
538
|
-
["Gamma", 27]]
|
|
539
|
-
```
|
|
540
|
-
|
|
541
|
-
Charts also accept `x` and `y` when the parent/root uses `layout=absolute`.
|
|
572
|
+
pie-chart share label="Market Share" width=300 height=240
|
|
573
|
+
data
|
|
574
|
+
[["Company", "Share"],
|
|
575
|
+
["Alpha", 42],
|
|
576
|
+
["Beta", 31],
|
|
577
|
+
["Gamma", 27]]
|
|
578
|
+
```
|
|
579
|
+
|
|
580
|
+
Charts also accept `x` and `y` when the parent/root uses `layout=absolute`.
|
|
542
581
|
|
|
543
582
|
---
|
|
544
583
|
|
|
@@ -547,7 +586,7 @@ Charts also accept `x` and `y` when the parent/root uses `layout=absolute`.
|
|
|
547
586
|
Renders inline rich text with headings and bold/italic:
|
|
548
587
|
|
|
549
588
|
```
|
|
550
|
-
markdown <id> [x=N] [y=N] [width=N] [height=N] [theme=...] [style props]
|
|
589
|
+
markdown <id> [x=N] [y=N] [width=N] [height=N] [theme=...] [style props]
|
|
551
590
|
"""
|
|
552
591
|
# Heading 1
|
|
553
592
|
## Heading 2
|
|
@@ -559,10 +598,10 @@ Another paragraph here.
|
|
|
559
598
|
"""
|
|
560
599
|
```
|
|
561
600
|
|
|
562
|
-
- Triple-quote `"""` delimiters for the content block.
|
|
563
|
-
- Supported formatting: `# H1`, `## H2`, `### H3`, `**bold**`, `*italic*`, blank lines.
|
|
564
|
-
- Style props: `color`, `font`, `font-size`, `text-align`, `padding`, `fill`, `stroke`, `opacity`, `letter-spacing`.
|
|
565
|
-
- Markdown blocks also accept `x` and `y` when the parent/root uses `layout=absolute`.
|
|
601
|
+
- Triple-quote `"""` delimiters for the content block.
|
|
602
|
+
- Supported formatting: `# H1`, `## H2`, `### H3`, `**bold**`, `*italic*`, blank lines.
|
|
603
|
+
- Style props: `color`, `font`, `font-size`, `text-align`, `padding`, `fill`, `stroke`, `opacity`, `letter-spacing`.
|
|
604
|
+
- Markdown blocks also accept `x` and `y` when the parent/root uses `layout=absolute`.
|
|
566
605
|
|
|
567
606
|
---
|
|
568
607
|
|
|
@@ -686,11 +725,11 @@ step narrate "Plants need sunlight to make food"
|
|
|
686
725
|
step narrate "This is the most important step" pace=slow
|
|
687
726
|
```
|
|
688
727
|
|
|
689
|
-
- Caption is rendered as a fixed-position `<div>` on `document.body` (independent of diagram pan/zoom).
|
|
690
|
-
- Access via `anim.captionElement` to reparent it anywhere.
|
|
691
|
-
- `SketchmarkCanvas` and `SketchmarkEmbed` support `showCaption: false` to hide the caption bar UI.
|
|
692
|
-
- Both widget UIs also include a built-in caption toggle button by default.
|
|
693
|
-
- Supports built-in browser text-to-speech (see [TTS](#text-to-speech)).
|
|
728
|
+
- Caption is rendered as a fixed-position `<div>` on `document.body` (independent of diagram pan/zoom).
|
|
729
|
+
- Access via `anim.captionElement` to reparent it anywhere.
|
|
730
|
+
- `SketchmarkCanvas` and `SketchmarkEmbed` support `showCaption: false` to hide the caption bar UI.
|
|
731
|
+
- Both widget UIs also include a built-in caption toggle button by default.
|
|
732
|
+
- Supports built-in browser text-to-speech (see [TTS](#text-to-speech)).
|
|
694
733
|
|
|
695
734
|
### Annotations
|
|
696
735
|
|
|
@@ -826,14 +865,14 @@ anim.destroy() // remove caption, annotations, pointer from DOM
|
|
|
826
865
|
|
|
827
866
|
// Toggle TTS programmatically
|
|
828
867
|
anim.tts = true; // enable browser speech
|
|
829
|
-
anim.tts = false; // disable (stops current speech)
|
|
830
|
-
|
|
831
|
-
// Reparent the narration caption to a custom container
|
|
832
|
-
myDiv.appendChild(anim.captionElement);
|
|
833
|
-
|
|
834
|
-
// UI widgets can suppress the visible caption bar
|
|
835
|
-
const embed = new SketchmarkEmbed({ container, dsl, showCaption: false });
|
|
836
|
-
embed.setCaptionVisible(true);
|
|
868
|
+
anim.tts = false; // disable (stops current speech)
|
|
869
|
+
|
|
870
|
+
// Reparent the narration caption to a custom container
|
|
871
|
+
myDiv.appendChild(anim.captionElement);
|
|
872
|
+
|
|
873
|
+
// UI widgets can suppress the visible caption bar
|
|
874
|
+
const embed = new SketchmarkEmbed({ container, dsl, showCaption: false });
|
|
875
|
+
embed.setCaptionVisible(true);
|
|
837
876
|
|
|
838
877
|
// Event listener
|
|
839
878
|
const unsub = anim.on((event) => {
|
|
@@ -845,31 +884,31 @@ const unsub = anim.on((event) => {
|
|
|
845
884
|
unsub(); // unsubscribe
|
|
846
885
|
```
|
|
847
886
|
|
|
848
|
-
### Text-to-Speech
|
|
849
|
-
|
|
850
|
-
Enable browser-native speech synthesis for narrate steps. You can drive it from the diagram config or from the JS API. If both are provided, the JS option wins. `SketchmarkCanvas` and `SketchmarkEmbed` also include a built-in TTS toggle button by default.
|
|
851
|
-
|
|
852
|
-
```
|
|
853
|
-
# In DSL
|
|
854
|
-
config tts=on
|
|
855
|
-
```
|
|
856
|
-
|
|
857
|
-
```javascript
|
|
858
|
-
// Direct render option
|
|
859
|
-
const instance = render({ container, dsl, tts: true });
|
|
860
|
-
|
|
861
|
-
// Widget options
|
|
862
|
-
const canvas = new SketchmarkCanvas({ container, dsl, tts: true });
|
|
863
|
-
const embed = new SketchmarkEmbed({ container, dsl, tts: true });
|
|
864
|
-
|
|
865
|
-
// Or toggle at runtime
|
|
866
|
-
anim.tts = true;
|
|
867
|
-
canvas.setTtsEnabled(false);
|
|
868
|
-
embed.setTtsEnabled(true);
|
|
869
|
-
|
|
870
|
-
// Custom TTS (e.g. ElevenLabs) via event listener
|
|
871
|
-
anim.tts = false; // disable built-in
|
|
872
|
-
anim.on((e) => {
|
|
887
|
+
### Text-to-Speech
|
|
888
|
+
|
|
889
|
+
Enable browser-native speech synthesis for narrate steps. You can drive it from the diagram config or from the JS API. If both are provided, the JS option wins. `SketchmarkCanvas` and `SketchmarkEmbed` also include a built-in TTS toggle button by default.
|
|
890
|
+
|
|
891
|
+
```
|
|
892
|
+
# In DSL
|
|
893
|
+
config tts=on
|
|
894
|
+
```
|
|
895
|
+
|
|
896
|
+
```javascript
|
|
897
|
+
// Direct render option
|
|
898
|
+
const instance = render({ container, dsl, tts: true });
|
|
899
|
+
|
|
900
|
+
// Widget options
|
|
901
|
+
const canvas = new SketchmarkCanvas({ container, dsl, tts: true });
|
|
902
|
+
const embed = new SketchmarkEmbed({ container, dsl, tts: true });
|
|
903
|
+
|
|
904
|
+
// Or toggle at runtime
|
|
905
|
+
anim.tts = true;
|
|
906
|
+
canvas.setTtsEnabled(false);
|
|
907
|
+
embed.setTtsEnabled(true);
|
|
908
|
+
|
|
909
|
+
// Custom TTS (e.g. ElevenLabs) via event listener
|
|
910
|
+
anim.tts = false; // disable built-in
|
|
911
|
+
anim.on((e) => {
|
|
873
912
|
if (e.step?.kind === 'step' && e.step.action === 'narrate') {
|
|
874
913
|
myTTSService.speak(e.step.value);
|
|
875
914
|
}
|
|
@@ -995,11 +1034,11 @@ exportHTML(instance.svg, dslSource, { filename: 'diagram.html' });
|
|
|
995
1034
|
|
|
996
1035
|
## Supported vs Unsupported Features
|
|
997
1036
|
|
|
998
|
-
### Nodes
|
|
999
|
-
|
|
1000
|
-
Nodes can also opt into authored absolute `x`/`y` positioning when their parent or the root diagram uses `layout=absolute`.
|
|
1001
|
-
|
|
1002
|
-
| Feature | Supported | Notes |
|
|
1037
|
+
### Nodes
|
|
1038
|
+
|
|
1039
|
+
Nodes can also opt into authored absolute `x`/`y` positioning when their parent or the root diagram uses `layout=absolute`.
|
|
1040
|
+
|
|
1041
|
+
| Feature | Supported | Notes |
|
|
1003
1042
|
|---------|-----------|-------|
|
|
1004
1043
|
| box | ✅ | Default shape |
|
|
1005
1044
|
| circle | ✅ | |
|
|
@@ -1039,11 +1078,11 @@ Nodes can also opt into authored absolute `x`/`y` positioning when their parent
|
|
|
1039
1078
|
| Multiple edges between same nodes | ✅ | Stack visually |
|
|
1040
1079
|
| Edge from/to groups | ✅ | Uses group center |
|
|
1041
1080
|
|
|
1042
|
-
### Groups
|
|
1043
|
-
|
|
1044
|
-
Groups support `layout=absolute` in addition to flow layouts. In absolute groups, child `x`/`y` coordinates are measured from the group's inner content box.
|
|
1045
|
-
|
|
1046
|
-
| Feature | Supported | Notes |
|
|
1081
|
+
### Groups
|
|
1082
|
+
|
|
1083
|
+
Groups support `layout=absolute` in addition to flow layouts. In absolute groups, child `x`/`y` coordinates are measured from the group's inner content box.
|
|
1084
|
+
|
|
1085
|
+
| Feature | Supported | Notes |
|
|
1047
1086
|
|---------|-----------|-------|
|
|
1048
1087
|
| Nested groups | ✅ | Unlimited depth |
|
|
1049
1088
|
| Row / column / grid layout | ✅ | |
|
|
@@ -1126,7 +1165,7 @@ Groups support `layout=absolute` in addition to flow layouts. In absolute groups
|
|
|
1126
1165
|
| `end` | Structure | `end` |
|
|
1127
1166
|
| `title` | Meta | `title label="My Diagram"` |
|
|
1128
1167
|
| `description` | Meta | `description "Some text"` |
|
|
1129
|
-
| `layout` | Meta | `layout row` / `layout column` / `layout grid` / `layout absolute` |
|
|
1168
|
+
| `layout` | Meta | `layout row` / `layout column` / `layout grid` / `layout absolute` |
|
|
1130
1169
|
| `config` | Meta | `config gap=60` |
|
|
1131
1170
|
| `theme` | Styling | `theme primary fill="#e8f4ff" stroke="#0044cc" color="#003399"` |
|
|
1132
1171
|
| `style` | Styling | `style nodeId fill="#ff0" stroke="#000"` |
|
|
@@ -1255,15 +1294,16 @@ end
|
|
|
1255
1294
|
```typescript
|
|
1256
1295
|
render(options: RenderOptions): DiagramInstance
|
|
1257
1296
|
|
|
1258
|
-
interface RenderOptions {
|
|
1259
|
-
container: string | HTMLElement | SVGSVGElement; // CSS selector or element
|
|
1260
|
-
dsl: string; // DSL source text
|
|
1261
|
-
|
|
1262
|
-
|
|
1263
|
-
|
|
1264
|
-
|
|
1265
|
-
|
|
1266
|
-
|
|
1297
|
+
interface RenderOptions {
|
|
1298
|
+
container: string | HTMLElement | SVGSVGElement; // CSS selector or element
|
|
1299
|
+
dsl: string; // DSL source text
|
|
1300
|
+
plugins?: SketchmarkPlugin[]; // optional source/AST plugins
|
|
1301
|
+
renderer?: 'svg' | 'canvas'; // default: 'svg'
|
|
1302
|
+
injectCSS?: boolean; // inject animation CSS (default: true)
|
|
1303
|
+
tts?: boolean; // override diagram TTS config
|
|
1304
|
+
svgOptions?: SVGRendererOptions;
|
|
1305
|
+
canvasOptions?: CanvasRendererOptions;
|
|
1306
|
+
onNodeClick?: (nodeId: string) => void; // click handler
|
|
1267
1307
|
onReady?: (anim, svg?) => void; // callback after render
|
|
1268
1308
|
}
|
|
1269
1309
|
|
|
@@ -1286,6 +1326,12 @@ interface DiagramInstance {
|
|
|
1286
1326
|
exportSVG: (filename?: string) => void;
|
|
1287
1327
|
exportPNG: (filename?: string) => Promise<void>;
|
|
1288
1328
|
}
|
|
1329
|
+
|
|
1330
|
+
interface SketchmarkPlugin {
|
|
1331
|
+
name: string;
|
|
1332
|
+
preprocess?: (source: string) => string;
|
|
1333
|
+
transformAst?: (ast: DiagramAST) => DiagramAST;
|
|
1334
|
+
}
|
|
1289
1335
|
```
|
|
1290
1336
|
|
|
1291
1337
|
---
|
|
@@ -31,6 +31,7 @@ export declare class AnimationController {
|
|
|
31
31
|
readonly drawTargetCharts: Set<string>;
|
|
32
32
|
readonly drawTargetMarkdowns: Set<string>;
|
|
33
33
|
private readonly _drawStepIndexByElementId;
|
|
34
|
+
private readonly _relatedElementIdsByPrimaryId;
|
|
34
35
|
private readonly _parentGroupByElementId;
|
|
35
36
|
private readonly _groupDescendantIds;
|
|
36
37
|
private _captionEl;
|
|
@@ -45,6 +46,7 @@ export declare class AnimationController {
|
|
|
45
46
|
get drawTargets(): Set<string>;
|
|
46
47
|
constructor(svg: SVGSVGElement, steps: ASTStepItem[], _container?: HTMLElement | undefined, _rc?: any | undefined, _config?: Record<string, string | number | boolean> | undefined);
|
|
47
48
|
private _buildDrawStepIndex;
|
|
49
|
+
private _buildRelatedElementIndex;
|
|
48
50
|
private _buildGroupVisibilityIndex;
|
|
49
51
|
private _hideGroupDescendants;
|
|
50
52
|
private _isDeferredForGroupReveal;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/animation/index.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAoB,WAAW,EAAE,MAAM,cAAc,CAAC;AAGlE,MAAM,MAAM,kBAAkB,GAC1B,aAAa,GACb,eAAe,GACf,iBAAiB,GACjB,iBAAiB,GACjB,eAAe,CAAC;AACpB,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,kBAAkB,CAAC;IACzB,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,CAAC,EAAE,WAAW,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;CACf;AACD,MAAM,MAAM,iBAAiB,GAAG,CAAC,CAAC,EAAE,cAAc,KAAK,IAAI,CAAC;AA+a5D,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,WAAW,EAAE,GAAG,GAAG,CAAC,MAAM,CAAC,CAQtE;AACD,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,WAAW,EAAE,GAAG,GAAG,CAAC,MAAM,CAAC,CAOtE;AAED,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,WAAW,EAAE,GAAG,GAAG,CAAC,MAAM,CAAC,CAOvE;AAED,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,WAAW,EAAE,GAAG,GAAG,CAAC,MAAM,CAAC,CAOtE;AAED,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,WAAW,EAAE,GAAG,GAAG,CAAC,MAAM,CAAC,CAOvE;AAsKD,qBAAa,mBAAmB;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/animation/index.ts"],"names":[],"mappings":"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"}
|
package/dist/ast/types.d.ts
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
export type NodeShape = 'box' | 'circle' | 'diamond' | 'hexagon' | 'triangle' | 'cylinder' | 'parallelogram' | 'text' | 'image' | 'icon' | 'note' | 'line' | 'path';
|
|
2
2
|
export type EdgeConnector = '->' | '<-' | '<->' | '-->' | '<-->' | '---' | '--';
|
|
3
|
+
export type EdgeAnchor = 'top' | 'right' | 'bottom' | 'left' | 'center' | 'top-left' | 'top-right' | 'bottom-left' | 'bottom-right';
|
|
3
4
|
export type LayoutType = 'row' | 'column' | 'grid' | 'absolute';
|
|
4
5
|
export type AlignItems = 'start' | 'center' | 'end';
|
|
5
6
|
export type JustifyContent = 'start' | 'center' | 'end' | 'space-between' | 'space-around';
|
|
@@ -82,6 +83,8 @@ export interface ASTEdge {
|
|
|
82
83
|
to: string;
|
|
83
84
|
connector: EdgeConnector;
|
|
84
85
|
label?: string;
|
|
86
|
+
fromAnchor?: EdgeAnchor;
|
|
87
|
+
toAnchor?: EdgeAnchor;
|
|
85
88
|
dashed?: boolean;
|
|
86
89
|
bidirectional?: boolean;
|
|
87
90
|
theme?: string;
|
package/dist/ast/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/ast/types.ts"],"names":[],"mappings":"AAIA,MAAM,MAAM,SAAS,GACjB,KAAK,GAAG,QAAQ,GAAG,SAAS,GAAG,SAAS,GAAG,UAAU,GACrD,UAAU,GAAG,eAAe,GAAG,MAAM,GAAG,OAAO,GAAG,MAAM,GAAG,MAAM,GACjE,MAAM,GAAG,MAAM,CAAC;AAEpB,MAAM,MAAM,aAAa,GACrB,IAAI,GAAG,IAAI,GAAG,KAAK,GAAG,KAAK,GAAG,MAAM,GAAG,KAAK,GAAG,IAAI,CAAC;
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/ast/types.ts"],"names":[],"mappings":"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"}
|