schematex 0.1.1 → 0.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 +130 -15
- package/dist/api-bQZ98gkJ.d.cts +22 -0
- package/dist/api-bQZ98gkJ.d.ts +22 -0
- package/dist/browser.cjs +46 -0
- package/dist/browser.cjs.map +1 -0
- package/dist/browser.d.cts +27 -0
- package/dist/browser.d.ts +27 -0
- package/dist/browser.js +40 -0
- package/dist/browser.js.map +1 -0
- package/dist/{chunk-XXU36667.js → chunk-2OIW3MAE.js} +4 -3
- package/dist/chunk-2OIW3MAE.js.map +1 -0
- package/dist/{chunk-3FTUWAXK.cjs → chunk-3M7QWADF.cjs} +5 -4
- package/dist/chunk-3M7QWADF.cjs.map +1 -0
- package/dist/{chunk-BE5HNDA5.cjs → chunk-4HPT4BOI.cjs} +5 -4
- package/dist/{chunk-BE5HNDA5.cjs.map → chunk-4HPT4BOI.cjs.map} +1 -1
- package/dist/{chunk-CZRM7LT7.js → chunk-4TS5NB7L.js} +4 -3
- package/dist/chunk-4TS5NB7L.js.map +1 -0
- package/dist/{chunk-4G7ZIBHN.js → chunk-5SH5NUDW.js} +3 -2
- package/dist/{chunk-4G7ZIBHN.js.map → chunk-5SH5NUDW.js.map} +1 -1
- package/dist/{chunk-47ZC6EMJ.js → chunk-7WXAAVR3.js} +4 -3
- package/dist/{chunk-47ZC6EMJ.js.map → chunk-7WXAAVR3.js.map} +1 -1
- package/dist/{chunk-5C7DPDHQ.js → chunk-A74ZCP5I.js} +4 -3
- package/dist/{chunk-5C7DPDHQ.js.map → chunk-A74ZCP5I.js.map} +1 -1
- package/dist/{chunk-DS47NTWZ.cjs → chunk-AMP2FFES.cjs} +11 -10
- package/dist/chunk-AMP2FFES.cjs.map +1 -0
- package/dist/{chunk-2UKC6ZCY.cjs → chunk-CEV3GZA3.cjs} +12 -11
- package/dist/chunk-CEV3GZA3.cjs.map +1 -0
- package/dist/{chunk-NYCIK4SU.cjs → chunk-DTMCQXXC.cjs} +13 -12
- package/dist/chunk-DTMCQXXC.cjs.map +1 -0
- package/dist/{chunk-FDLZEKEB.js → chunk-GEPBET4L.js} +3 -2
- package/dist/chunk-GEPBET4L.js.map +1 -0
- package/dist/chunk-HAIBAF6J.cjs +1880 -0
- package/dist/chunk-HAIBAF6J.cjs.map +1 -0
- package/dist/{chunk-FGPTCDUT.cjs → chunk-HKRYKEOV.cjs} +5 -4
- package/dist/chunk-HKRYKEOV.cjs.map +1 -0
- package/dist/{chunk-D4JTSPOL.js → chunk-HLYA4QBB.js} +4 -3
- package/dist/chunk-HLYA4QBB.js.map +1 -0
- package/dist/{chunk-7FZSPKX3.cjs → chunk-IMHR3S5H.cjs} +6 -5
- package/dist/chunk-IMHR3S5H.cjs.map +1 -0
- package/dist/{chunk-HGHWCB6K.js → chunk-IQIJ6WW6.js} +4 -3
- package/dist/chunk-IQIJ6WW6.js.map +1 -0
- package/dist/{chunk-UHLYS3W5.cjs → chunk-IY52OWPG.cjs} +5 -4
- package/dist/{chunk-UHLYS3W5.cjs.map → chunk-IY52OWPG.cjs.map} +1 -1
- package/dist/chunk-JZGFSRVT.js +1873 -0
- package/dist/chunk-JZGFSRVT.js.map +1 -0
- package/dist/{chunk-3J7TFUOC.js → chunk-L6IHSTPP.js} +4 -3
- package/dist/{chunk-3J7TFUOC.js.map → chunk-L6IHSTPP.js.map} +1 -1
- package/dist/{chunk-4DBRNOPA.cjs → chunk-LKHWBDWZ.cjs} +5 -4
- package/dist/{chunk-4DBRNOPA.cjs.map → chunk-LKHWBDWZ.cjs.map} +1 -1
- package/dist/{chunk-34X3ZJ6E.cjs → chunk-LXNFVHDT.cjs} +3 -2
- package/dist/{chunk-34X3ZJ6E.cjs.map → chunk-LXNFVHDT.cjs.map} +1 -1
- package/dist/chunk-M6AMNXQ7.js +4539 -0
- package/dist/chunk-M6AMNXQ7.js.map +1 -0
- package/dist/{chunk-XX4BKS7Y.js → chunk-MRGS54WN.js} +4 -3
- package/dist/chunk-MRGS54WN.js.map +1 -0
- package/dist/{chunk-ROFLJ74T.js → chunk-MXJ6FHSY.js} +4 -3
- package/dist/chunk-MXJ6FHSY.js.map +1 -0
- package/dist/{chunk-V6WO7RK7.cjs → chunk-PIQG2Z5N.cjs} +5 -4
- package/dist/chunk-PIQG2Z5N.cjs.map +1 -0
- package/dist/{chunk-U5GGE6PJ.js → chunk-RQX53J6M.js} +4 -3
- package/dist/chunk-RQX53J6M.js.map +1 -0
- package/dist/{chunk-N7KOXOMX.cjs → chunk-S6VPECM3.cjs} +72 -2
- package/dist/chunk-S6VPECM3.cjs.map +1 -0
- package/dist/{chunk-VFQCTXOX.js → chunk-SPIW4VWP.js} +4 -3
- package/dist/chunk-SPIW4VWP.js.map +1 -0
- package/dist/{chunk-IX554O5K.js → chunk-TIGP2OEJ.js} +72 -3
- package/dist/chunk-TIGP2OEJ.js.map +1 -0
- package/dist/{chunk-LMFSHK45.js → chunk-TPA36ULU.js} +4 -3
- package/dist/{chunk-LMFSHK45.js.map → chunk-TPA36ULU.js.map} +1 -1
- package/dist/{chunk-ZX7QKZK2.cjs → chunk-ULERCTGS.cjs} +5 -4
- package/dist/{chunk-ZX7QKZK2.cjs.map → chunk-ULERCTGS.cjs.map} +1 -1
- package/dist/chunk-VP54YPOX.cjs +4544 -0
- package/dist/chunk-VP54YPOX.cjs.map +1 -0
- package/dist/{chunk-XQ52ICHU.cjs → chunk-YKO7DY2F.cjs} +14 -13
- package/dist/chunk-YKO7DY2F.cjs.map +1 -0
- package/dist/{chunk-PDPHRZZT.js → chunk-YO4GU6JX.js} +4 -3
- package/dist/chunk-YO4GU6JX.js.map +1 -0
- package/dist/{chunk-S6BK5DB6.cjs → chunk-ZGKEFVJQ.cjs} +13 -12
- package/dist/chunk-ZGKEFVJQ.cjs.map +1 -0
- package/dist/{chunk-2MQWZ2XY.cjs → chunk-ZO77FHBF.cjs} +3 -2
- package/dist/chunk-ZO77FHBF.cjs.map +1 -0
- package/dist/diagrams/blockdiagram/index.cjs +5 -5
- package/dist/diagrams/blockdiagram/index.d.cts +1 -1
- package/dist/diagrams/blockdiagram/index.d.ts +1 -1
- package/dist/diagrams/blockdiagram/index.js +1 -1
- package/dist/diagrams/circuit/index.cjs +8 -8
- package/dist/diagrams/circuit/index.d.cts +1 -1
- package/dist/diagrams/circuit/index.d.ts +1 -1
- package/dist/diagrams/circuit/index.js +2 -2
- package/dist/diagrams/ecomap/index.cjs +7 -7
- package/dist/diagrams/ecomap/index.d.cts +1 -1
- package/dist/diagrams/ecomap/index.d.ts +1 -1
- package/dist/diagrams/ecomap/index.js +2 -2
- package/dist/diagrams/entity/index.cjs +6 -6
- package/dist/diagrams/entity/index.d.cts +1 -1
- package/dist/diagrams/entity/index.d.ts +1 -1
- package/dist/diagrams/entity/index.js +2 -2
- package/dist/diagrams/fishbone/index.cjs +8 -8
- package/dist/diagrams/fishbone/index.d.cts +1 -1
- package/dist/diagrams/fishbone/index.d.ts +1 -1
- package/dist/diagrams/fishbone/index.js +2 -2
- package/dist/diagrams/flowchart/index.cjs +8 -8
- package/dist/diagrams/flowchart/index.d.cts +2 -2
- package/dist/diagrams/flowchart/index.d.ts +2 -2
- package/dist/diagrams/flowchart/index.js +2 -2
- package/dist/diagrams/genogram/index.cjs +9 -9
- package/dist/diagrams/genogram/index.d.cts +1 -1
- package/dist/diagrams/genogram/index.d.ts +1 -1
- package/dist/diagrams/genogram/index.js +2 -2
- package/dist/diagrams/ladder/index.cjs +6 -6
- package/dist/diagrams/ladder/index.d.cts +1 -1
- package/dist/diagrams/ladder/index.d.ts +1 -1
- package/dist/diagrams/ladder/index.js +2 -2
- package/dist/diagrams/logic/index.cjs +6 -6
- package/dist/diagrams/logic/index.d.cts +1 -1
- package/dist/diagrams/logic/index.d.ts +1 -1
- package/dist/diagrams/logic/index.js +2 -2
- package/dist/diagrams/orgchart/index.cjs +7 -7
- package/dist/diagrams/orgchart/index.d.cts +1 -1
- package/dist/diagrams/orgchart/index.d.ts +1 -1
- package/dist/diagrams/orgchart/index.js +2 -2
- package/dist/diagrams/pedigree/index.cjs +7 -7
- package/dist/diagrams/pedigree/index.d.cts +1 -1
- package/dist/diagrams/pedigree/index.d.ts +1 -1
- package/dist/diagrams/pedigree/index.js +2 -2
- package/dist/diagrams/phylo/index.cjs +7 -7
- package/dist/diagrams/phylo/index.d.cts +1 -1
- package/dist/diagrams/phylo/index.d.ts +1 -1
- package/dist/diagrams/phylo/index.js +2 -2
- package/dist/diagrams/sld/index.cjs +6 -6
- package/dist/diagrams/sld/index.d.cts +1 -1
- package/dist/diagrams/sld/index.d.ts +1 -1
- package/dist/diagrams/sld/index.js +2 -2
- package/dist/diagrams/sociogram/index.cjs +6 -6
- package/dist/diagrams/sociogram/index.d.cts +1 -1
- package/dist/diagrams/sociogram/index.d.ts +1 -1
- package/dist/diagrams/sociogram/index.js +2 -2
- package/dist/diagrams/timing/index.cjs +4 -4
- package/dist/diagrams/timing/index.d.cts +1 -1
- package/dist/diagrams/timing/index.d.ts +1 -1
- package/dist/diagrams/timing/index.js +1 -1
- package/dist/diagrams/venn/index.cjs +9 -9
- package/dist/diagrams/venn/index.d.cts +1 -1
- package/dist/diagrams/venn/index.d.ts +1 -1
- package/dist/diagrams/venn/index.js +2 -2
- package/dist/export.cjs +87 -0
- package/dist/export.cjs.map +1 -0
- package/dist/export.d.cts +38 -0
- package/dist/export.d.ts +38 -0
- package/dist/export.js +83 -0
- package/dist/export.js.map +1 -0
- package/dist/{index-BXefHVce.d.cts → index-SSGpCggE.d.cts} +52 -3
- package/dist/{index-BSlza1YY.d.ts → index-ga04CTBI.d.ts} +52 -3
- package/dist/index.cjs +65 -1948
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +7 -12
- package/dist/index.d.ts +7 -12
- package/dist/index.js +19 -1942
- package/dist/index.js.map +1 -1
- package/dist/react.cjs +56 -0
- package/dist/react.cjs.map +1 -0
- package/dist/react.d.cts +24 -0
- package/dist/react.d.ts +24 -0
- package/dist/react.js +54 -0
- package/dist/react.js.map +1 -0
- package/dist/{types-DqfcYkcY.d.ts → types-BcPhMdHd.d.cts} +6 -2
- package/dist/{types-DqfcYkcY.d.cts → types-BcPhMdHd.d.ts} +6 -2
- package/package.json +31 -2
- package/dist/chunk-2MQWZ2XY.cjs.map +0 -1
- package/dist/chunk-2UKC6ZCY.cjs.map +0 -1
- package/dist/chunk-3FTUWAXK.cjs.map +0 -1
- package/dist/chunk-7FZSPKX3.cjs.map +0 -1
- package/dist/chunk-ADOXGKAK.js +0 -1251
- package/dist/chunk-ADOXGKAK.js.map +0 -1
- package/dist/chunk-CZRM7LT7.js.map +0 -1
- package/dist/chunk-D4JTSPOL.js.map +0 -1
- package/dist/chunk-DS47NTWZ.cjs.map +0 -1
- package/dist/chunk-FDLZEKEB.js.map +0 -1
- package/dist/chunk-FGPTCDUT.cjs.map +0 -1
- package/dist/chunk-HGHWCB6K.js.map +0 -1
- package/dist/chunk-IX554O5K.js.map +0 -1
- package/dist/chunk-MDICUK6F.cjs +0 -1258
- package/dist/chunk-MDICUK6F.cjs.map +0 -1
- package/dist/chunk-N7KOXOMX.cjs.map +0 -1
- package/dist/chunk-NYCIK4SU.cjs.map +0 -1
- package/dist/chunk-PDPHRZZT.js.map +0 -1
- package/dist/chunk-ROFLJ74T.js.map +0 -1
- package/dist/chunk-S6BK5DB6.cjs.map +0 -1
- package/dist/chunk-U5GGE6PJ.js.map +0 -1
- package/dist/chunk-V6WO7RK7.cjs.map +0 -1
- package/dist/chunk-VFQCTXOX.js.map +0 -1
- package/dist/chunk-XQ52ICHU.cjs.map +0 -1
- package/dist/chunk-XX4BKS7Y.js.map +0 -1
- package/dist/chunk-XXU36667.js.map +0 -1
package/README.md
CHANGED
|
@@ -1,10 +1,11 @@
|
|
|
1
1
|
<p align="center">
|
|
2
|
-
<strong>
|
|
3
|
-
<em>
|
|
2
|
+
<strong>Schematex</strong><br>
|
|
3
|
+
<em>Every diagram a doctor, engineer, or lawyer would actually use.</em><br>
|
|
4
|
+
<em>Free. Fully open source. Made for AI.</em>
|
|
4
5
|
</p>
|
|
5
6
|
|
|
6
7
|
<p align="center">
|
|
7
|
-
McGoldrick genograms · NSGC pedigrees · IEC 61131-3 ladder logic · IEEE 315 single-line diagrams · Newick phylogenetic trees · Moreno sociograms · and
|
|
8
|
+
McGoldrick genograms · NSGC pedigrees · IEC 61131-3 ladder logic · IEEE 315 single-line diagrams · Newick phylogenetic trees · Howard-Raiffa decision trees · Moreno sociograms · and more — all from a tiny text DSL, with zero runtime dependencies.
|
|
8
9
|
</p>
|
|
9
10
|
|
|
10
11
|
<p align="center">
|
|
@@ -22,18 +23,23 @@
|
|
|
22
23
|
<a href="./LICENSE"><img src="https://img.shields.io/badge/license-AGPL--3.0-blue" alt="license"></a>
|
|
23
24
|
</p>
|
|
24
25
|
|
|
26
|
+
<p align="center">
|
|
27
|
+
<img src="https://schematex.dev/hero-demo.gif" alt="Schematex demo — genogram, pedigree, ladder logic, phylo, entity structure, fishbone, circuit, ecomap, timing" width="720">
|
|
28
|
+
</p>
|
|
29
|
+
|
|
25
30
|
---
|
|
26
31
|
|
|
27
|
-
**
|
|
32
|
+
**Schematex** is the open-source rendering engine for the diagrams professionals actually use — medical, electrical, legal, and analytical. 20 diagram families across five domains:
|
|
28
33
|
|
|
29
34
|
- 👪 **Relationships** — genograms, ecomaps, pedigrees, sociograms, phylogenetic trees
|
|
30
35
|
- ⚡ **Electrical & Industrial** — ladder logic, single-line diagrams, circuit schematics, logic gates, timing, block diagrams
|
|
31
36
|
- 🏢 **Corporate & Legal** — entity structures, cap tables
|
|
32
|
-
- 🐟 **Causality & Analysis** — fishbone / Ishikawa
|
|
37
|
+
- 🐟 **Causality & Analysis** — fishbone / Ishikawa, decision trees (Howard-Raiffa EV · CART/sklearn · taxonomy)
|
|
38
|
+
- 📅 **Timelines** — proportional / equidistant / log axis · swimlane · gantt · lollipop · BC dates · geological Ma scale
|
|
33
39
|
|
|
34
|
-
Mermaid draws generic flowcharts.
|
|
40
|
+
Mermaid draws generic flowcharts. Schematex draws the diagrams doctors, engineers, and lawyers actually use — a genogram a genetic counselor accepts clinically, ladder logic that maps 1:1 to IEC 61131-3, a cap table that survives a Series A review.
|
|
35
41
|
|
|
36
|
-
|
|
42
|
+
🆓 **Free & fully open source** · 📐 **10+ industry standards** · 🤖 **Made for AI** · 🌱 **SSR-ready pure SVG · Zero deps**
|
|
37
43
|
|
|
38
44
|
## Install
|
|
39
45
|
|
|
@@ -64,7 +70,7 @@ import { render } from 'schematex/genogram';
|
|
|
64
70
|
|
|
65
71
|
## Gallery
|
|
66
72
|
|
|
67
|
-
|
|
73
|
+
20 diagram types, one unified pipeline. **Try any of these live at [schematex.dev/playground](https://schematex.dev/playground).**
|
|
68
74
|
|
|
69
75
|
### 👪 Genogram — *McGoldrick family-systems standard*
|
|
70
76
|
|
|
@@ -378,6 +384,101 @@ algo : "Core Update penalty" : "Weak E-E-A-T signals" : "SGE traffic diversion"
|
|
|
378
384
|
|
|
379
385
|
[Fishbone syntax →](https://schematex.dev/docs/fishbone)
|
|
380
386
|
|
|
387
|
+
### 🌳 Decision Tree — *Howard-Raiffa · CART/sklearn · Taxonomy*
|
|
388
|
+
|
|
389
|
+
Three modes in one DSL. Decision analysis with EV rollback (Howard-Raiffa), ML tree visualization (sklearn `plot_tree` style), and yes/no taxonomy trees. Diagonal edge routing, payoff-aligned columns, optimal-path highlighting.
|
|
390
|
+
|
|
391
|
+
**Decision analysis — EV rollback:**
|
|
392
|
+
```
|
|
393
|
+
decisiontree:decision "Oil drilling"
|
|
394
|
+
|
|
395
|
+
decision "Drill or sell rights?"
|
|
396
|
+
choice "Sell rights"
|
|
397
|
+
end payoff=90000 "Guaranteed sale"
|
|
398
|
+
choice "Drill"
|
|
399
|
+
chance "Well outcome"
|
|
400
|
+
prob 0.3 end payoff=500000 "Major strike"
|
|
401
|
+
prob 0.5 end payoff=50000 "Minor strike"
|
|
402
|
+
prob 0.2 end payoff=-200000 "Dry hole"
|
|
403
|
+
```
|
|
404
|
+
|
|
405
|
+
**ML tree — sklearn CART style:**
|
|
406
|
+
```
|
|
407
|
+
decisiontree:ml "Iris classification"
|
|
408
|
+
classes: setosa, versicolor, virginica
|
|
409
|
+
impurity: gini
|
|
410
|
+
branchLabels: relation
|
|
411
|
+
|
|
412
|
+
split feature=petal_width op=<= threshold=0.8 samples=120 value=[50,35,35] gini=0.66
|
|
413
|
+
true leaf samples=50 value=[50,0,0] gini=0 class=setosa
|
|
414
|
+
false split feature=petal_width op=<= threshold=1.75 samples=70 value=[0,35,35] gini=0.5
|
|
415
|
+
true leaf samples=36 value=[0,32,4] gini=0.198 class=versicolor
|
|
416
|
+
false leaf samples=34 value=[0,3,31] gini=0.162 class=virginica
|
|
417
|
+
```
|
|
418
|
+
|
|
419
|
+
**Taxonomy — yes/no classification:**
|
|
420
|
+
```
|
|
421
|
+
decisiontree:taxonomy "ED Triage Level"
|
|
422
|
+
direction: left-right
|
|
423
|
+
|
|
424
|
+
q "Airway compromise?"
|
|
425
|
+
yes: a "Level 1 — Resuscitation"
|
|
426
|
+
no: q "Vital signs unstable?"
|
|
427
|
+
yes: a "Level 2 — Emergent"
|
|
428
|
+
no: q "Multiple resources needed?"
|
|
429
|
+
yes: a "Level 3 — Urgent"
|
|
430
|
+
no: a "Level 4/5 — Less urgent"
|
|
431
|
+
```
|
|
432
|
+
|
|
433
|
+
[Decision Tree syntax →](https://schematex.dev/docs/decisiontree)
|
|
434
|
+
|
|
435
|
+
---
|
|
436
|
+
|
|
437
|
+
### 📅 Timeline
|
|
438
|
+
|
|
439
|
+
Historical events, biographical lifelines, product roadmaps, and geological timescales on a proportional / equidistant / log axis. Three visual styles: **swimlane** (multi-track biographies), **gantt** (project plan with pins + category lanes + legend), and **lollipop** (alternating above/below cards on a center axis). Supports BC/AD dates, quarter dates (`2026-Q1`), and geological mega-year (`Ma`) scale.
|
|
440
|
+
|
|
441
|
+
```
|
|
442
|
+
timeline "Apollo program"
|
|
443
|
+
|
|
444
|
+
1961-05-25: milestone "Kennedy Moon speech"
|
|
445
|
+
1967-01-27: "Apollo 1 fire"
|
|
446
|
+
1968-12-21 - 1968-12-27: "Apollo 8 — first lunar orbit"
|
|
447
|
+
1969-07-16 - 1969-07-24: "Apollo 11 — Moon landing" [icon:🚀]
|
|
448
|
+
1970-04-11 - 1970-04-17: "Apollo 13 — abort"
|
|
449
|
+
1972-12-07 - 1972-12-19: "Apollo 17 — last crewed Moon mission"
|
|
450
|
+
```
|
|
451
|
+
|
|
452
|
+
```
|
|
453
|
+
timeline "Brand story"
|
|
454
|
+
config: style = lollipop
|
|
455
|
+
|
|
456
|
+
era 2015 - 2019: "Scrappy startup"
|
|
457
|
+
era 2019 - 2023: "Scale-up"
|
|
458
|
+
era 2023 - 2027: "Enterprise era"
|
|
459
|
+
|
|
460
|
+
2015: "Founded in a coffee shop" [icon:☕]
|
|
461
|
+
2017: milestone "First 1000 users" [icon:👥]
|
|
462
|
+
2019: "Series A" [icon:💰]
|
|
463
|
+
2021: "Opened NYC office" [icon:🏙]
|
|
464
|
+
2023: milestone "Crossed $50M ARR" [icon:📊]
|
|
465
|
+
2025: "Acquired Acme Inc." [icon:🤝]
|
|
466
|
+
```
|
|
467
|
+
|
|
468
|
+
```
|
|
469
|
+
timeline "Q2 Launch plan"
|
|
470
|
+
config: style = gantt
|
|
471
|
+
|
|
472
|
+
2026-04-01: milestone "Kickoff"
|
|
473
|
+
2026-06-30: milestone "GA launch" [icon:🚀]
|
|
474
|
+
|
|
475
|
+
2026-04-01 - 2026-04-30: "Research & specs" [category: "Design"]
|
|
476
|
+
2026-04-10 - 2026-06-10: "API build" [category: "Eng"]
|
|
477
|
+
2026-05-15 - 2026-06-25: "Campaign prep" [category: "Marketing"]
|
|
478
|
+
```
|
|
479
|
+
|
|
480
|
+
[Timeline syntax →](https://schematex.dev/docs/timeline)
|
|
481
|
+
|
|
381
482
|
## Why SchemaTex?
|
|
382
483
|
|
|
383
484
|
**Generic flowchart tools can't draw professional diagrams.** Every diagram domain has published standards — symbol conventions, layout rules, labelling grammars — and when you ignore them, domain experts reject the output:
|
|
@@ -413,22 +514,36 @@ Written by humans, shaped by what LLMs get wrong.
|
|
|
413
514
|
## API
|
|
414
515
|
|
|
415
516
|
```ts
|
|
416
|
-
// Universal entry —
|
|
517
|
+
// Universal entry — auto-detects diagram type from first keyword
|
|
417
518
|
import { render, parse } from 'schematex';
|
|
418
519
|
|
|
419
|
-
render(text
|
|
420
|
-
parse(text
|
|
520
|
+
const svg = render(text, config?); // → SVG string
|
|
521
|
+
const ast = parse(text, config?); // → AST (JSON-serializable)
|
|
522
|
+
|
|
523
|
+
// Per-diagram tree-shaking
|
|
524
|
+
import { render } from 'schematex/genogram';
|
|
525
|
+
|
|
526
|
+
// Browser DOM
|
|
527
|
+
import { renderToElement, renderToContainer } from 'schematex/browser';
|
|
528
|
+
container.appendChild(renderToElement(dsl));
|
|
529
|
+
|
|
530
|
+
// React
|
|
531
|
+
import { SchematexDiagram } from 'schematex/react';
|
|
532
|
+
// <SchematexDiagram dsl="genogram ..." theme="monochrome" />
|
|
421
533
|
|
|
422
|
-
//
|
|
423
|
-
import {
|
|
424
|
-
|
|
534
|
+
// Export (browser Canvas)
|
|
535
|
+
import { svgToPngBlob, downloadBlob, printSvgAsPdf } from 'schematex/export';
|
|
536
|
+
const blob = await svgToPngBlob(svg, { scale: 2 });
|
|
537
|
+
downloadBlob(blob, 'diagram.png');
|
|
425
538
|
```
|
|
426
539
|
|
|
427
540
|
See the [API reference →](https://schematex.dev/docs/api).
|
|
428
541
|
|
|
429
542
|
## Ecosystem
|
|
430
543
|
|
|
431
|
-
- **React** —
|
|
544
|
+
- **React** — `schematex/react` — `<SchematexDiagram dsl="..." />` component
|
|
545
|
+
- **Browser** — `schematex/browser` — `renderToElement()` / `renderToContainer()`
|
|
546
|
+
- **Export** — `schematex/export` — PNG (@2×) + print-to-PDF via browser Canvas
|
|
432
547
|
- **Obsidian** — code-block renderer plugin *(coming soon)*
|
|
433
548
|
- **Markdown-it / remark** — diagram fence support *(coming soon)*
|
|
434
549
|
- **CLI** — `npx schematex input.txt > output.svg` *(coming soon)*
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
interface SchematexConfig {
|
|
2
|
+
type?: "genogram" | "ecomap" | "pedigree" | "phylo" | "sociogram" | "timing" | "logic" | "circuit" | "blockdiagram" | "ladder" | "sld" | "entity" | "fishbone" | "venn" | "flowchart" | "mindmap" | "matrix" | "orgchart" | "decisiontree" | "timeline";
|
|
3
|
+
width?: number;
|
|
4
|
+
height?: number;
|
|
5
|
+
padding?: number;
|
|
6
|
+
theme?: string;
|
|
7
|
+
fontFamily?: string;
|
|
8
|
+
}
|
|
9
|
+
/**
|
|
10
|
+
* Parse DSL text to the diagram's AST and return it as a plain object.
|
|
11
|
+
* Useful for JSON serialization, programmatic inspection, or custom renderers.
|
|
12
|
+
*
|
|
13
|
+
* @example
|
|
14
|
+
* ```ts
|
|
15
|
+
* const ast = parse('genogram\n alice [female]');
|
|
16
|
+
* console.log(JSON.stringify(ast, null, 2));
|
|
17
|
+
* ```
|
|
18
|
+
*/
|
|
19
|
+
declare function parse(text: string, config?: SchematexConfig): unknown;
|
|
20
|
+
declare function render(text: string, config?: SchematexConfig): string;
|
|
21
|
+
|
|
22
|
+
export { type SchematexConfig as S, parse as p, render as r };
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
interface SchematexConfig {
|
|
2
|
+
type?: "genogram" | "ecomap" | "pedigree" | "phylo" | "sociogram" | "timing" | "logic" | "circuit" | "blockdiagram" | "ladder" | "sld" | "entity" | "fishbone" | "venn" | "flowchart" | "mindmap" | "matrix" | "orgchart" | "decisiontree" | "timeline";
|
|
3
|
+
width?: number;
|
|
4
|
+
height?: number;
|
|
5
|
+
padding?: number;
|
|
6
|
+
theme?: string;
|
|
7
|
+
fontFamily?: string;
|
|
8
|
+
}
|
|
9
|
+
/**
|
|
10
|
+
* Parse DSL text to the diagram's AST and return it as a plain object.
|
|
11
|
+
* Useful for JSON serialization, programmatic inspection, or custom renderers.
|
|
12
|
+
*
|
|
13
|
+
* @example
|
|
14
|
+
* ```ts
|
|
15
|
+
* const ast = parse('genogram\n alice [female]');
|
|
16
|
+
* console.log(JSON.stringify(ast, null, 2));
|
|
17
|
+
* ```
|
|
18
|
+
*/
|
|
19
|
+
declare function parse(text: string, config?: SchematexConfig): unknown;
|
|
20
|
+
declare function render(text: string, config?: SchematexConfig): string;
|
|
21
|
+
|
|
22
|
+
export { type SchematexConfig as S, parse as p, render as r };
|
package/dist/browser.cjs
ADDED
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var chunkVP54YPOX_cjs = require('./chunk-VP54YPOX.cjs');
|
|
4
|
+
require('./chunk-IY52OWPG.cjs');
|
|
5
|
+
require('./chunk-HKRYKEOV.cjs');
|
|
6
|
+
require('./chunk-LXNFVHDT.cjs');
|
|
7
|
+
require('./chunk-LKHWBDWZ.cjs');
|
|
8
|
+
require('./chunk-ULERCTGS.cjs');
|
|
9
|
+
require('./chunk-PIQG2Z5N.cjs');
|
|
10
|
+
require('./chunk-IMHR3S5H.cjs');
|
|
11
|
+
require('./chunk-3M7QWADF.cjs');
|
|
12
|
+
require('./chunk-HAIBAF6J.cjs');
|
|
13
|
+
require('./chunk-CEV3GZA3.cjs');
|
|
14
|
+
require('./chunk-ZGKEFVJQ.cjs');
|
|
15
|
+
require('./chunk-AMP2FFES.cjs');
|
|
16
|
+
require('./chunk-YKO7DY2F.cjs');
|
|
17
|
+
require('./chunk-DTMCQXXC.cjs');
|
|
18
|
+
require('./chunk-ZO77FHBF.cjs');
|
|
19
|
+
require('./chunk-4HPT4BOI.cjs');
|
|
20
|
+
require('./chunk-S6VPECM3.cjs');
|
|
21
|
+
require('./chunk-HDKDQAEQ.cjs');
|
|
22
|
+
|
|
23
|
+
// src/browser.ts
|
|
24
|
+
function renderToElement(text, config) {
|
|
25
|
+
const svgString = chunkVP54YPOX_cjs.render(text, config);
|
|
26
|
+
const parser = new DOMParser();
|
|
27
|
+
const doc = parser.parseFromString(svgString, "image/svg+xml");
|
|
28
|
+
const el = doc.documentElement;
|
|
29
|
+
const parseError = doc.querySelector("parsererror");
|
|
30
|
+
if (parseError) {
|
|
31
|
+
throw new Error(`SVG parse error: ${parseError.textContent}`);
|
|
32
|
+
}
|
|
33
|
+
return el;
|
|
34
|
+
}
|
|
35
|
+
function renderToContainer(text, container, config) {
|
|
36
|
+
container.innerHTML = chunkVP54YPOX_cjs.render(text, config);
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
Object.defineProperty(exports, "render", {
|
|
40
|
+
enumerable: true,
|
|
41
|
+
get: function () { return chunkVP54YPOX_cjs.render; }
|
|
42
|
+
});
|
|
43
|
+
exports.renderToContainer = renderToContainer;
|
|
44
|
+
exports.renderToElement = renderToElement;
|
|
45
|
+
//# sourceMappingURL=browser.cjs.map
|
|
46
|
+
//# sourceMappingURL=browser.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/browser.ts"],"names":["render"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;AAmBO,SAAS,eAAA,CACd,MACA,MAAA,EACe;AACf,EAAA,MAAM,SAAA,GAAYA,wBAAA,CAAO,IAAA,EAAM,MAAM,CAAA;AACrC,EAAA,MAAM,MAAA,GAAS,IAAI,SAAA,EAAU;AAC7B,EAAA,MAAM,GAAA,GAAM,MAAA,CAAO,eAAA,CAAgB,SAAA,EAAW,eAAe,CAAA;AAC7D,EAAA,MAAM,KAAK,GAAA,CAAI,eAAA;AACf,EAAA,MAAM,UAAA,GAAa,GAAA,CAAI,aAAA,CAAc,aAAa,CAAA;AAClD,EAAA,IAAI,UAAA,EAAY;AACd,IAAA,MAAM,IAAI,KAAA,CAAM,CAAA,iBAAA,EAAoB,UAAA,CAAW,WAAW,CAAA,CAAE,CAAA;AAAA,EAC9D;AACA,EAAA,OAAO,EAAA;AACT;AAKO,SAAS,iBAAA,CACd,IAAA,EACA,SAAA,EACA,MAAA,EACM;AACN,EAAA,SAAA,CAAU,SAAA,GAAYA,wBAAA,CAAO,IAAA,EAAM,MAAM,CAAA;AAC3C","file":"browser.cjs","sourcesContent":["/**\n * Browser-specific utilities for Schematex.\n *\n * These APIs require a DOM environment. Do not import in SSR/Node contexts.\n *\n * @example\n * ```ts\n * import { renderToElement, renderToContainer } from 'schematex/browser';\n *\n * const svg = renderToElement('genogram\\n alice [female]');\n * document.getElementById('diagram')!.appendChild(svg);\n * ```\n */\n\nimport { render, type SchematexConfig } from \"./core/api\";\n\n/**\n * Render DSL text to a live `SVGSVGElement` ready to insert into the DOM.\n */\nexport function renderToElement(\n text: string,\n config?: SchematexConfig\n): SVGSVGElement {\n const svgString = render(text, config);\n const parser = new DOMParser();\n const doc = parser.parseFromString(svgString, \"image/svg+xml\");\n const el = doc.documentElement;\n const parseError = doc.querySelector(\"parsererror\");\n if (parseError) {\n throw new Error(`SVG parse error: ${parseError.textContent}`);\n }\n return el as unknown as SVGSVGElement;\n}\n\n/**\n * Render DSL text and inject SVG into a container element (replaces innerHTML).\n */\nexport function renderToContainer(\n text: string,\n container: Element,\n config?: SchematexConfig\n): void {\n container.innerHTML = render(text, config);\n}\n\nexport { render, type SchematexConfig } from \"./core/api\";\n"]}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { S as SchematexConfig } from './api-bQZ98gkJ.cjs';
|
|
2
|
+
export { r as render } from './api-bQZ98gkJ.cjs';
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* Browser-specific utilities for Schematex.
|
|
6
|
+
*
|
|
7
|
+
* These APIs require a DOM environment. Do not import in SSR/Node contexts.
|
|
8
|
+
*
|
|
9
|
+
* @example
|
|
10
|
+
* ```ts
|
|
11
|
+
* import { renderToElement, renderToContainer } from 'schematex/browser';
|
|
12
|
+
*
|
|
13
|
+
* const svg = renderToElement('genogram\n alice [female]');
|
|
14
|
+
* document.getElementById('diagram')!.appendChild(svg);
|
|
15
|
+
* ```
|
|
16
|
+
*/
|
|
17
|
+
|
|
18
|
+
/**
|
|
19
|
+
* Render DSL text to a live `SVGSVGElement` ready to insert into the DOM.
|
|
20
|
+
*/
|
|
21
|
+
declare function renderToElement(text: string, config?: SchematexConfig): SVGSVGElement;
|
|
22
|
+
/**
|
|
23
|
+
* Render DSL text and inject SVG into a container element (replaces innerHTML).
|
|
24
|
+
*/
|
|
25
|
+
declare function renderToContainer(text: string, container: Element, config?: SchematexConfig): void;
|
|
26
|
+
|
|
27
|
+
export { SchematexConfig, renderToContainer, renderToElement };
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { S as SchematexConfig } from './api-bQZ98gkJ.js';
|
|
2
|
+
export { r as render } from './api-bQZ98gkJ.js';
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* Browser-specific utilities for Schematex.
|
|
6
|
+
*
|
|
7
|
+
* These APIs require a DOM environment. Do not import in SSR/Node contexts.
|
|
8
|
+
*
|
|
9
|
+
* @example
|
|
10
|
+
* ```ts
|
|
11
|
+
* import { renderToElement, renderToContainer } from 'schematex/browser';
|
|
12
|
+
*
|
|
13
|
+
* const svg = renderToElement('genogram\n alice [female]');
|
|
14
|
+
* document.getElementById('diagram')!.appendChild(svg);
|
|
15
|
+
* ```
|
|
16
|
+
*/
|
|
17
|
+
|
|
18
|
+
/**
|
|
19
|
+
* Render DSL text to a live `SVGSVGElement` ready to insert into the DOM.
|
|
20
|
+
*/
|
|
21
|
+
declare function renderToElement(text: string, config?: SchematexConfig): SVGSVGElement;
|
|
22
|
+
/**
|
|
23
|
+
* Render DSL text and inject SVG into a container element (replaces innerHTML).
|
|
24
|
+
*/
|
|
25
|
+
declare function renderToContainer(text: string, container: Element, config?: SchematexConfig): void;
|
|
26
|
+
|
|
27
|
+
export { SchematexConfig, renderToContainer, renderToElement };
|
package/dist/browser.js
ADDED
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import { render } from './chunk-M6AMNXQ7.js';
|
|
2
|
+
export { render } from './chunk-M6AMNXQ7.js';
|
|
3
|
+
import './chunk-7WXAAVR3.js';
|
|
4
|
+
import './chunk-2OIW3MAE.js';
|
|
5
|
+
import './chunk-5SH5NUDW.js';
|
|
6
|
+
import './chunk-L6IHSTPP.js';
|
|
7
|
+
import './chunk-A74ZCP5I.js';
|
|
8
|
+
import './chunk-MRGS54WN.js';
|
|
9
|
+
import './chunk-IQIJ6WW6.js';
|
|
10
|
+
import './chunk-MXJ6FHSY.js';
|
|
11
|
+
import './chunk-JZGFSRVT.js';
|
|
12
|
+
import './chunk-HLYA4QBB.js';
|
|
13
|
+
import './chunk-RQX53J6M.js';
|
|
14
|
+
import './chunk-TPA36ULU.js';
|
|
15
|
+
import './chunk-4TS5NB7L.js';
|
|
16
|
+
import './chunk-YO4GU6JX.js';
|
|
17
|
+
import './chunk-GEPBET4L.js';
|
|
18
|
+
import './chunk-SPIW4VWP.js';
|
|
19
|
+
import './chunk-TIGP2OEJ.js';
|
|
20
|
+
import './chunk-KLJEK547.js';
|
|
21
|
+
|
|
22
|
+
// src/browser.ts
|
|
23
|
+
function renderToElement(text, config) {
|
|
24
|
+
const svgString = render(text, config);
|
|
25
|
+
const parser = new DOMParser();
|
|
26
|
+
const doc = parser.parseFromString(svgString, "image/svg+xml");
|
|
27
|
+
const el = doc.documentElement;
|
|
28
|
+
const parseError = doc.querySelector("parsererror");
|
|
29
|
+
if (parseError) {
|
|
30
|
+
throw new Error(`SVG parse error: ${parseError.textContent}`);
|
|
31
|
+
}
|
|
32
|
+
return el;
|
|
33
|
+
}
|
|
34
|
+
function renderToContainer(text, container, config) {
|
|
35
|
+
container.innerHTML = render(text, config);
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
export { renderToContainer, renderToElement };
|
|
39
|
+
//# sourceMappingURL=browser.js.map
|
|
40
|
+
//# sourceMappingURL=browser.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/browser.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;AAmBO,SAAS,eAAA,CACd,MACA,MAAA,EACe;AACf,EAAA,MAAM,SAAA,GAAY,MAAA,CAAO,IAAA,EAAM,MAAM,CAAA;AACrC,EAAA,MAAM,MAAA,GAAS,IAAI,SAAA,EAAU;AAC7B,EAAA,MAAM,GAAA,GAAM,MAAA,CAAO,eAAA,CAAgB,SAAA,EAAW,eAAe,CAAA;AAC7D,EAAA,MAAM,KAAK,GAAA,CAAI,eAAA;AACf,EAAA,MAAM,UAAA,GAAa,GAAA,CAAI,aAAA,CAAc,aAAa,CAAA;AAClD,EAAA,IAAI,UAAA,EAAY;AACd,IAAA,MAAM,IAAI,KAAA,CAAM,CAAA,iBAAA,EAAoB,UAAA,CAAW,WAAW,CAAA,CAAE,CAAA;AAAA,EAC9D;AACA,EAAA,OAAO,EAAA;AACT;AAKO,SAAS,iBAAA,CACd,IAAA,EACA,SAAA,EACA,MAAA,EACM;AACN,EAAA,SAAA,CAAU,SAAA,GAAY,MAAA,CAAO,IAAA,EAAM,MAAM,CAAA;AAC3C","file":"browser.js","sourcesContent":["/**\n * Browser-specific utilities for Schematex.\n *\n * These APIs require a DOM environment. Do not import in SSR/Node contexts.\n *\n * @example\n * ```ts\n * import { renderToElement, renderToContainer } from 'schematex/browser';\n *\n * const svg = renderToElement('genogram\\n alice [female]');\n * document.getElementById('diagram')!.appendChild(svg);\n * ```\n */\n\nimport { render, type SchematexConfig } from \"./core/api\";\n\n/**\n * Render DSL text to a live `SVGSVGElement` ready to insert into the DOM.\n */\nexport function renderToElement(\n text: string,\n config?: SchematexConfig\n): SVGSVGElement {\n const svgString = render(text, config);\n const parser = new DOMParser();\n const doc = parser.parseFromString(svgString, \"image/svg+xml\");\n const el = doc.documentElement;\n const parseError = doc.querySelector(\"parsererror\");\n if (parseError) {\n throw new Error(`SVG parse error: ${parseError.textContent}`);\n }\n return el as unknown as SVGSVGElement;\n}\n\n/**\n * Render DSL text and inject SVG into a container element (replaces innerHTML).\n */\nexport function renderToContainer(\n text: string,\n container: Element,\n config?: SchematexConfig\n): void {\n container.innerHTML = render(text, config);\n}\n\nexport { render, type SchematexConfig } from \"./core/api\";\n"]}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { resolveIndustrialTheme } from './chunk-
|
|
1
|
+
import { resolveIndustrialTheme } from './chunk-TIGP2OEJ.js';
|
|
2
2
|
import { text, svgRoot, title, desc, defs, el, group, circle, escapeXml } from './chunk-KLJEK547.js';
|
|
3
3
|
|
|
4
4
|
// src/diagrams/circuit/netlist.ts
|
|
@@ -1833,6 +1833,7 @@ var circuit = {
|
|
|
1833
1833
|
const first = text2.trim().split("\n")[0]?.trim().toLowerCase() ?? "";
|
|
1834
1834
|
return first.startsWith("circuit");
|
|
1835
1835
|
},
|
|
1836
|
+
parse: parseCircuit,
|
|
1836
1837
|
render(text2, config) {
|
|
1837
1838
|
const ast = parseCircuit(text2);
|
|
1838
1839
|
return renderCircuit(ast, config);
|
|
@@ -1840,5 +1841,5 @@ var circuit = {
|
|
|
1840
1841
|
};
|
|
1841
1842
|
|
|
1842
1843
|
export { circuit, layoutCircuit, layoutCircuitNetlist, parseCircuit, parseNetlist, renderCircuit };
|
|
1843
|
-
//# sourceMappingURL=chunk-
|
|
1844
|
-
//# sourceMappingURL=chunk-
|
|
1844
|
+
//# sourceMappingURL=chunk-2OIW3MAE.js.map
|
|
1845
|
+
//# sourceMappingURL=chunk-2OIW3MAE.js.map
|