mirror of
https://github.com/mermaid-js/mermaid.git
synced 2025-08-22 01:36:43 +02:00
Compare commits
918 Commits
mermaid@11
...
ipsep-cola
Author | SHA1 | Date | |
---|---|---|---|
![]() |
f06f1bacd3 | ||
![]() |
d93d9a521d | ||
![]() |
c99bce6bab | ||
![]() |
4ab98c2ec7 | ||
![]() |
aeb51e56e2 | ||
![]() |
e12036ed6c | ||
![]() |
ddcd8a5e73 | ||
![]() |
e464d080ef | ||
![]() |
1a9b94ca2d | ||
![]() |
e4b33a1d99 | ||
![]() |
e27a9da61d | ||
![]() |
03cf10003f | ||
![]() |
8e31fdb611 | ||
![]() |
5dd748148f | ||
![]() |
895f9d43ff | ||
![]() |
4ea4a7b3fe | ||
![]() |
fb890a2be8 | ||
![]() |
5986189a52 | ||
![]() |
1988dfc956 | ||
![]() |
e48b0ba61d | ||
![]() |
1a4b8662cf | ||
![]() |
6083463c8e | ||
![]() |
1a14e331ea | ||
![]() |
ebb6680eba | ||
![]() |
6d1d46f88a | ||
![]() |
435790f931 | ||
![]() |
ffe9c1090e | ||
![]() |
a476e99d4c | ||
![]() |
0cc0b63e52 | ||
![]() |
694844050a | ||
![]() |
1be1620000 | ||
![]() |
c36cd05c45 | ||
![]() |
b7a591b8d3 | ||
![]() |
8bb29fc879 | ||
![]() |
e073c80019 | ||
![]() |
01aaef39b4 | ||
![]() |
3d640fc620 | ||
![]() |
724197c910 | ||
![]() |
6180c5f2ff | ||
![]() |
a9f7a94ae3 | ||
![]() |
3ffe9618ae | ||
![]() |
da539c1fa1 | ||
![]() |
5e8aa2dccf | ||
![]() |
ac04172cf8 | ||
![]() |
cf5b4b89a8 | ||
![]() |
1c269e0432 | ||
![]() |
999b836508 | ||
![]() |
326e4e3693 | ||
![]() |
9c92da487f | ||
![]() |
10752f1357 | ||
![]() |
1a80854242 | ||
![]() |
fc9c600a31 | ||
![]() |
da8ce0b93e | ||
![]() |
00a79353fc | ||
![]() |
1ceeca1ef1 | ||
![]() |
94890390ef | ||
![]() |
adfeb093cb | ||
![]() |
366d217928 | ||
![]() |
b94f1336ab | ||
![]() |
020c6d66e0 | ||
![]() |
09c239fc25 | ||
![]() |
b01a0d7dcd | ||
![]() |
cfc2551bdc | ||
![]() |
000308c8f5 | ||
![]() |
6039a8b930 | ||
![]() |
cd282f2245 | ||
![]() |
a27d90fe9c | ||
![]() |
64bf34b9ab | ||
![]() |
9faf2f9fb2 | ||
![]() |
f683b03645 | ||
![]() |
9cef40d164 | ||
![]() |
04612e078a | ||
![]() |
af585bdcc7 | ||
![]() |
37bfa2aa75 | ||
![]() |
54640ce476 | ||
![]() |
47b4c56b2b | ||
![]() |
6b1b0bf151 | ||
![]() |
7ba332ad4a | ||
![]() |
412d2a09d3 | ||
![]() |
7886fed8b2 | ||
![]() |
af3d5b6528 | ||
![]() |
404286a90d | ||
![]() |
827a9af790 | ||
![]() |
95733b6295 | ||
![]() |
8b86d617e7 | ||
![]() |
cc2112c7aa | ||
![]() |
767754f4fb | ||
![]() |
cff59c58b4 | ||
![]() |
ac976245ad | ||
![]() |
5b241bbb97 | ||
![]() |
7e5e47843b | ||
![]() |
9e2cd1a926 | ||
![]() |
abf2227faf | ||
![]() |
7db942b0e1 | ||
![]() |
70041c806f | ||
![]() |
77e2703f72 | ||
![]() |
771801b366 | ||
![]() |
a9a0a9b2de | ||
![]() |
1e5e835c41 | ||
![]() |
1f3f8da0f7 | ||
![]() |
b11f40e8ce | ||
![]() |
1fe045e638 | ||
![]() |
1c750ffc70 | ||
![]() |
b0ec93f29c | ||
![]() |
6b071c135a | ||
![]() |
42a3c3487f | ||
![]() |
d7b8ed2c5a | ||
![]() |
96c21c7e54 | ||
![]() |
e95e4d155a | ||
![]() |
688170558c | ||
![]() |
832f012e10 | ||
![]() |
2e2e8c4152 | ||
![]() |
6ff6e08c4b | ||
![]() |
d7f1f12549 | ||
![]() |
6e56869566 | ||
![]() |
d3e2be35be | ||
![]() |
852cb35f0a | ||
![]() |
260a045da0 | ||
![]() |
a28965064d | ||
![]() |
355eeeb9cc | ||
![]() |
5449d6a447 | ||
![]() |
34e91f8b65 | ||
![]() |
627ee1f34d | ||
![]() |
28840ebd84 | ||
![]() |
4145879003 | ||
![]() |
e097b480d5 | ||
![]() |
f76e27db70 | ||
![]() |
3e3ae08930 | ||
![]() |
966c112eb1 | ||
![]() |
55527e70c2 | ||
![]() |
447d1cf988 | ||
![]() |
003d1c7a70 | ||
![]() |
daf8d8d3be | ||
![]() |
d7a55b422b | ||
![]() |
12e3d31437 | ||
![]() |
ad024b01d6 | ||
![]() |
c12aea588c | ||
![]() |
9dfbf1166d | ||
![]() |
98bf9b4cb4 | ||
![]() |
e9ce8cf4da | ||
![]() |
d90634bf2b | ||
![]() |
90707e8062 | ||
![]() |
7e23f984e6 | ||
![]() |
b3a12237c0 | ||
![]() |
fad6676d18 | ||
![]() |
637680d4d9 | ||
![]() |
5f6f5110fd | ||
![]() |
af47269342 | ||
![]() |
d3c0893937 | ||
![]() |
75ef9bc681 | ||
![]() |
45edc91591 | ||
![]() |
f4edd19371 | ||
![]() |
b611a13e04 | ||
![]() |
7a38eb715d | ||
![]() |
2715ddb338 | ||
![]() |
ca2eca58c9 | ||
![]() |
b4fae2d096 | ||
![]() |
6dd9af0dd4 | ||
![]() |
3151241559 | ||
![]() |
dda9c9b46e | ||
![]() |
cdd1a70b67 | ||
![]() |
12c94a177b | ||
![]() |
d8bd4dea93 | ||
![]() |
6deb476182 | ||
![]() |
ed297ee235 | ||
![]() |
03c1201fcb | ||
![]() |
3ca317c5a0 | ||
![]() |
4d83263388 | ||
![]() |
254e5cbd51 | ||
![]() |
a58dd3c6ce | ||
![]() |
10b7bb568f | ||
![]() |
1aa2870224 | ||
![]() |
8fbcbb6dc9 | ||
![]() |
3e545d7925 | ||
![]() |
75d2a259ed | ||
![]() |
746280b3e2 | ||
![]() |
fa4e30bb15 | ||
![]() |
950b107dd4 | ||
![]() |
35b84761a9 | ||
![]() |
0da2922ee7 | ||
![]() |
85eba01663 | ||
![]() |
79ba50216a | ||
![]() |
71b04f93b0 | ||
![]() |
27185f62e4 | ||
![]() |
9655d07adf | ||
![]() |
2b3cb6a362 | ||
![]() |
89ac2932c4 | ||
![]() |
e828609749 | ||
![]() |
91f141f772 | ||
![]() |
c77b968f1e | ||
![]() |
ba13981905 | ||
![]() |
a7a94b95e1 | ||
![]() |
31f141c61a | ||
![]() |
fb017bebfd | ||
![]() |
648698a43a | ||
![]() |
a5e4729c76 | ||
![]() |
c884def5fc | ||
![]() |
592c5bb880 | ||
![]() |
da0c6c6c32 | ||
![]() |
939da082b2 | ||
![]() |
d9396eedd6 | ||
![]() |
5f9601b6a8 | ||
![]() |
378f8ece0c | ||
![]() |
148a42a31a | ||
![]() |
8980ca4526 | ||
![]() |
caa04aad8b | ||
![]() |
3dc06ea9bd | ||
![]() |
c311c1ba5d | ||
![]() |
11a86d9c06 | ||
![]() |
037bec189c | ||
![]() |
9b164dd185 | ||
![]() |
4ee124bf91 | ||
![]() |
e70be4f155 | ||
![]() |
6621f6ddb2 | ||
![]() |
3e99158c04 | ||
![]() |
e7970c66ee | ||
![]() |
c7b96be683 | ||
![]() |
0623a87d70 | ||
![]() |
c5f89eaa9a | ||
![]() |
1fbe550285 | ||
![]() |
b3724f04c4 | ||
![]() |
2f58a0e188 | ||
![]() |
6f1e0e4d17 | ||
![]() |
7dd8ddc3eb | ||
![]() |
222d7170f7 | ||
![]() |
3137cff4a5 | ||
![]() |
b45b1d7795 | ||
![]() |
e1030b186e | ||
![]() |
334c8c2962 | ||
![]() |
bdaa3f693a | ||
![]() |
be13fb0391 | ||
![]() |
c120901744 | ||
![]() |
1f07a781e4 | ||
![]() |
3132387ede | ||
![]() |
f41b4c96f9 | ||
![]() |
26bd456c01 | ||
![]() |
8ef7040a8d | ||
![]() |
badb019d38 | ||
![]() |
e7ec8ed527 | ||
![]() |
d85a393bcd | ||
![]() |
7c1e655675 | ||
![]() |
df2ccaa14b | ||
![]() |
797ba43d6e | ||
![]() |
d628a971ef | ||
![]() |
8049b6aef8 | ||
![]() |
84802118be | ||
![]() |
e2ef425245 | ||
![]() |
da98732961 | ||
![]() |
efa11a7325 | ||
![]() |
e5f6ea0b13 | ||
![]() |
339927d7e5 | ||
![]() |
9562a769db | ||
![]() |
5cfda33d04 | ||
![]() |
e682172823 | ||
![]() |
85c5b9b4c0 | ||
![]() |
2785ca47a0 | ||
![]() |
b70abed096 | ||
![]() |
1a5a846d71 | ||
![]() |
20ddc12b42 | ||
![]() |
5e037ee315 | ||
![]() |
70eedd840d | ||
![]() |
bb0aa4009c | ||
![]() |
75f940bf9e | ||
![]() |
a46de01885 | ||
![]() |
a7e9f4f926 | ||
![]() |
99c8224dfa | ||
![]() |
13f8549f81 | ||
![]() |
cfd25ed33e | ||
![]() |
3a8952ebe0 | ||
![]() |
1e68ed9cc1 | ||
![]() |
1337c60784 | ||
![]() |
a12d1f731a | ||
![]() |
b6ba9b79df | ||
![]() |
ce227b5519 | ||
![]() |
8a703bd09f | ||
![]() |
c4de3cdc57 | ||
![]() |
ef449a601b | ||
![]() |
8e84a1a8af | ||
![]() |
a3552e7936 | ||
![]() |
646cdf0d32 | ||
![]() |
99048bfa01 | ||
![]() |
ca80f719ea | ||
![]() |
0cabc6e8ed | ||
![]() |
5fe0f53179 | ||
![]() |
e2e3cd2bbd | ||
![]() |
ffb9016d65 | ||
![]() |
3c03f289b4 | ||
![]() |
c6035936b6 | ||
![]() |
818699f347 | ||
![]() |
f23a26e528 | ||
![]() |
48e6e60753 | ||
![]() |
dc3ed65c18 | ||
![]() |
43092e6e11 | ||
![]() |
878e77acab | ||
![]() |
2372cd7b21 | ||
![]() |
51f0cb2892 | ||
![]() |
14e3d77c75 | ||
![]() |
875fef691b | ||
![]() |
7075f833d0 | ||
![]() |
d629c5eae5 | ||
![]() |
80904da253 | ||
![]() |
e6be1e9202 | ||
![]() |
6f5d889f19 | ||
![]() |
63827db60d | ||
![]() |
41108358f6 | ||
![]() |
ec0786a6fa | ||
![]() |
2ea6695b4b | ||
![]() |
6485d1fbca | ||
![]() |
d0f1dafd49 | ||
![]() |
f970fc8bea | ||
![]() |
015afc53d5 | ||
![]() |
1f44143936 | ||
![]() |
db461a4c6c | ||
![]() |
fe33d5fb53 | ||
![]() |
64c4d4197b | ||
![]() |
ed7bab76f2 | ||
![]() |
f338802642 | ||
![]() |
445595f942 | ||
![]() |
66ce617bea | ||
![]() |
3e07a5acff | ||
![]() |
df1e739194 | ||
![]() |
2def5a0768 | ||
![]() |
2746bccef3 | ||
![]() |
f0c3dfe3b3 | ||
![]() |
942ae8dcbc | ||
![]() |
cadcddd40c | ||
![]() |
bca6ed67c3 | ||
![]() |
f20c677982 | ||
![]() |
e46fd145b2 | ||
![]() |
b1cf291273 | ||
![]() |
cac1779c22 | ||
![]() |
96bd7de40d | ||
![]() |
82874c6584 | ||
![]() |
e79147dcfc | ||
![]() |
28131bab98 | ||
![]() |
9d6b9369e6 | ||
![]() |
80351d9f59 | ||
![]() |
7b307f812f | ||
![]() |
071df09395 | ||
![]() |
0d047ccbcc | ||
![]() |
680d65114c | ||
![]() |
d463f00160 | ||
![]() |
941bc69835 | ||
![]() |
107b6cae87 | ||
![]() |
1b044a24fa | ||
![]() |
17a156901a | ||
![]() |
fa22ed137c | ||
![]() |
6b886abf39 | ||
![]() |
4fd64c5bc0 | ||
![]() |
7e245f970f | ||
![]() |
4f8f929340 | ||
![]() |
3629e8e480 | ||
![]() |
ff48c2e1da | ||
![]() |
1bd13b50f1 | ||
![]() |
bbe3489b4f | ||
![]() |
31ba692f65 | ||
![]() |
b073175fe9 | ||
![]() |
e2e22de1d9 | ||
![]() |
c370ebe520 | ||
![]() |
d732fa5f86 | ||
![]() |
ce1bfb2af5 | ||
![]() |
c6d8590d8f | ||
![]() |
10505a0392 | ||
![]() |
e0a075ecca | ||
![]() |
2a10143406 | ||
![]() |
40eb0cc240 | ||
![]() |
d702a7164e | ||
![]() |
8a0bc64282 | ||
![]() |
ac0283ff97 | ||
![]() |
84faddc9e5 | ||
![]() |
5e3f21f572 | ||
![]() |
05c74ed9ce | ||
![]() |
b106346119 | ||
![]() |
c09232c44d | ||
![]() |
714496af6d | ||
![]() |
5d61a30237 | ||
![]() |
02ff3c1216 | ||
![]() |
1f897a851b | ||
![]() |
8af636c58d | ||
![]() |
954f6cc8fc | ||
![]() |
a566353030 | ||
![]() |
d396c6b760 | ||
![]() |
8d9f027f40 | ||
![]() |
560700eaf8 | ||
![]() |
819843cf2a | ||
![]() |
5e2870f6f2 | ||
![]() |
c364ff463a | ||
![]() |
8738288bc0 | ||
![]() |
74ef4ce9c6 | ||
![]() |
2b41bf083c | ||
![]() |
249f22763b | ||
![]() |
444d35b9b4 | ||
![]() |
83543bc790 | ||
![]() |
379559c992 | ||
![]() |
c61b879711 | ||
![]() |
67806022b9 | ||
![]() |
f8c54317c5 | ||
![]() |
65f778d183 | ||
![]() |
ed67c36440 | ||
![]() |
908043183e | ||
![]() |
97b79c3578 | ||
![]() |
8d4c5d5278 | ||
![]() |
9988a61ec5 | ||
![]() |
d4e737e451 | ||
![]() |
b821454927 | ||
![]() |
cee43a45f6 | ||
![]() |
475532a839 | ||
![]() |
c8daf9aa43 | ||
![]() |
cf8fc2a541 | ||
![]() |
08b6524a35 | ||
![]() |
221aa3ed19 | ||
![]() |
640a65f9a7 | ||
![]() |
c17277e743 | ||
![]() |
7b3fd044e8 | ||
![]() |
566b3db15f | ||
![]() |
2483e6e434 | ||
![]() |
e7b39f3fa3 | ||
![]() |
19884294bc | ||
![]() |
e6b63fd70a | ||
![]() |
1c1d7d0300 | ||
![]() |
e8ee4bdb48 | ||
![]() |
2afa96c2a8 | ||
![]() |
7c42d08ef2 | ||
![]() |
d0520e6a50 | ||
![]() |
a703a195d4 | ||
![]() |
05b5607265 | ||
![]() |
2b28966f8d | ||
![]() |
4077088f18 | ||
![]() |
867484a2cc | ||
![]() |
5ea7088e04 | ||
![]() |
646230d603 | ||
![]() |
5a7e734da4 | ||
![]() |
2924b94fbc | ||
![]() |
f8c6ae5d17 | ||
![]() |
8d7330aeb3 | ||
![]() |
6a6c9f6254 | ||
![]() |
b0b76ef7a2 | ||
![]() |
53e89d97a0 | ||
![]() |
59b400652b | ||
![]() |
e8124d8828 | ||
![]() |
26e3bea2fe | ||
![]() |
1fda77db13 | ||
![]() |
5b2227b3be | ||
![]() |
68670535bf | ||
![]() |
7a6f13707f | ||
![]() |
9d838d4e7a | ||
![]() |
a92ae7a16c | ||
![]() |
8800de9309 | ||
![]() |
d2c53552ff | ||
![]() |
91a7564db6 | ||
![]() |
a037cdcf13 | ||
![]() |
3753967c8f | ||
![]() |
549dc86b21 | ||
![]() |
e97f25f13e | ||
![]() |
c3c609a965 | ||
![]() |
c81a7d13e0 | ||
![]() |
e561acac23 | ||
![]() |
86a0a7fe3a | ||
![]() |
5a8f32b8cb | ||
![]() |
c6e640ab75 | ||
![]() |
f6862c5af5 | ||
![]() |
bd8b93327e | ||
![]() |
4a63901af9 | ||
![]() |
8c52edf3ef | ||
![]() |
da610bff1d | ||
![]() |
db389e589d | ||
![]() |
24aec8c280 | ||
![]() |
8c4fc3c6ff | ||
![]() |
d72ee5fc95 | ||
![]() |
b3ff80f211 | ||
![]() |
8a34154efa | ||
![]() |
79b47be35f | ||
![]() |
054f5444d6 | ||
![]() |
beb80db25a | ||
![]() |
fbdbd9d0dd | ||
![]() |
8ce1f70066 | ||
![]() |
334294c6af | ||
![]() |
e0f3f2bd5a | ||
![]() |
6dad2ab327 | ||
![]() |
4d2e424c30 | ||
![]() |
ff217957fc | ||
![]() |
866b29c050 | ||
![]() |
a463d11e57 | ||
![]() |
5267f7c6ea | ||
![]() |
2bdecc2842 | ||
![]() |
d8efe9a55d | ||
![]() |
ae564f30af | ||
![]() |
2a6da19956 | ||
![]() |
de41669320 | ||
![]() |
02b997f4e4 | ||
![]() |
90c0908ed5 | ||
![]() |
a7d76b2695 | ||
![]() |
e46c7ae996 | ||
![]() |
af7a5fe77d | ||
![]() |
f9fbadbbe2 | ||
![]() |
dec82de586 | ||
![]() |
598c72853f | ||
![]() |
b1e1a0c0d7 | ||
![]() |
a9f3b432ff | ||
![]() |
cd2ab38927 | ||
![]() |
04448e3b6a | ||
![]() |
2a12a64c06 | ||
![]() |
586b528a16 | ||
![]() |
36e6e6e1be | ||
![]() |
1de7d31d90 | ||
![]() |
34d91d0e88 | ||
![]() |
101dc6d52c | ||
![]() |
1fbe17e04c | ||
![]() |
8fed1c86b0 | ||
![]() |
b808801347 | ||
![]() |
58ec4ca39f | ||
![]() |
7e3d547094 | ||
![]() |
79f010143a | ||
![]() |
aa9df775cd | ||
![]() |
2601ec89c8 | ||
![]() |
566415c189 | ||
![]() |
cbabc7b709 | ||
![]() |
873962c739 | ||
![]() |
2aeb435f19 | ||
![]() |
e0818c9e47 | ||
![]() |
a3753d8f4d | ||
![]() |
308e2cc107 | ||
![]() |
a578cb8def | ||
![]() |
a823bf043b | ||
![]() |
3980c99c22 | ||
![]() |
c81f63b462 | ||
![]() |
16167a64e5 | ||
![]() |
cba4d733f0 | ||
![]() |
6a0fb67ab7 | ||
![]() |
4bfd0f753d | ||
![]() |
bf83262d7c | ||
![]() |
ccdd0f0146 | ||
![]() |
82646432a1 | ||
![]() |
c82579097c | ||
![]() |
92132ad4f1 | ||
![]() |
8564ebbdbd | ||
![]() |
1ca6ff93ff | ||
![]() |
20098b287b | ||
![]() |
0474a8422b | ||
![]() |
075f0f580f | ||
![]() |
78ded6452f | ||
![]() |
08085b8821 | ||
![]() |
5f35d70ce2 | ||
![]() |
08951dbbf0 | ||
![]() |
7caf377963 | ||
![]() |
0103da0179 | ||
![]() |
a6c9ab04dc | ||
![]() |
b9c472e091 | ||
![]() |
4ed4756220 | ||
![]() |
4b12ebee51 | ||
![]() |
d6e1541bc8 | ||
![]() |
0507fe114e | ||
![]() |
2bb77406fb | ||
![]() |
2215bf6aaa | ||
![]() |
206cc51578 | ||
![]() |
c4c55277cb | ||
![]() |
0c2d222aa6 | ||
![]() |
fc3d4859db | ||
![]() |
c7714fd666 | ||
![]() |
e2bf95c922 | ||
![]() |
a79a50b77f | ||
![]() |
9133fcb9a8 | ||
![]() |
00e9ed2024 | ||
![]() |
5919d39812 | ||
![]() |
f5fa0ae876 | ||
![]() |
de9eb67040 | ||
![]() |
cb7518a960 | ||
![]() |
34bf5c8be1 | ||
![]() |
7d1319f97c | ||
![]() |
9c46e960e7 | ||
![]() |
cd956e1b60 | ||
![]() |
78cf1706a9 | ||
![]() |
607e9ab989 | ||
![]() |
0cf0b684cf | ||
![]() |
cb0cb5dfc7 | ||
![]() |
330c48fa3f | ||
![]() |
2ff6de11dc | ||
![]() |
385fab8c67 | ||
![]() |
e49911e748 | ||
![]() |
8a84ede164 | ||
![]() |
d79b7b2d97 | ||
![]() |
844f879f63 | ||
![]() |
cf789d2c91 | ||
![]() |
4936ef5c30 | ||
![]() |
f006718e56 | ||
![]() |
d720776918 | ||
![]() |
f43398dd44 | ||
![]() |
43ad451940 | ||
![]() |
94c099caa1 | ||
![]() |
a3fed10d55 | ||
![]() |
2a859f2739 | ||
![]() |
dbbe014c5b | ||
![]() |
c7fa906115 | ||
![]() |
3c69bd34c7 | ||
![]() |
ceef0558be | ||
![]() |
63b90e8b9b | ||
![]() |
f5d27bf7ef | ||
![]() |
5a03f07853 | ||
![]() |
8474cf43fe | ||
![]() |
f56895832f | ||
![]() |
8975a1907a | ||
![]() |
62b4228df4 | ||
![]() |
c552dc7551 | ||
![]() |
e425a45755 | ||
![]() |
d177211286 | ||
![]() |
a07d365c1c | ||
![]() |
1f512e9671 | ||
![]() |
12b6371abf | ||
![]() |
88ae4ef704 | ||
![]() |
df9df9dc32 | ||
![]() |
ea321168bd | ||
![]() |
d7730aba46 | ||
![]() |
5310d60e63 | ||
![]() |
3ae87ca06a | ||
![]() |
24f23efdad | ||
![]() |
e2520dde20 | ||
![]() |
3e8204aa21 | ||
![]() |
0b57984d27 | ||
![]() |
bcaa40f1d5 | ||
![]() |
0107494b59 | ||
![]() |
11c3ac58fd | ||
![]() |
af2eb13932 | ||
![]() |
41e84b726a | ||
![]() |
a1ba65c0c0 | ||
![]() |
5fe6e5dccc | ||
![]() |
946452c7b4 | ||
![]() |
4bb6351489 | ||
![]() |
8c63a2e411 | ||
![]() |
4467fd4363 | ||
![]() |
7e567a8759 | ||
![]() |
edf062720d | ||
![]() |
3348eea6af | ||
![]() |
ae7ffab9ac | ||
![]() |
ecdbc676d2 | ||
![]() |
6a01b04e3c | ||
![]() |
aafe8de3d3 | ||
![]() |
24287637b5 | ||
![]() |
f69cc17795 | ||
![]() |
f5c99a2a4f | ||
![]() |
244703a904 | ||
![]() |
59a9e1b300 | ||
![]() |
167a625413 | ||
![]() |
296cb64fa5 | ||
![]() |
934f4da507 | ||
![]() |
6957f35782 | ||
![]() |
b00be59ea8 | ||
![]() |
dff00f2c4f | ||
![]() |
2009177375 | ||
![]() |
eb9987435a | ||
![]() |
a300d0db94 | ||
![]() |
7e7f3c56c2 | ||
![]() |
81fa2a675f | ||
![]() |
2203792164 | ||
![]() |
5bbc9b4f5b | ||
![]() |
ea987861f3 | ||
![]() |
8005262d76 | ||
![]() |
463eb07979 | ||
![]() |
a3cf9de01b | ||
![]() |
9a90aca8e6 | ||
![]() |
8c9b38ed90 | ||
![]() |
963b1e3ec5 | ||
![]() |
208d29e3d6 | ||
![]() |
5c865e7b71 | ||
![]() |
7ce9dbcece | ||
![]() |
36fe04bd46 | ||
![]() |
ff786b4ef8 | ||
![]() |
b81b665137 | ||
![]() |
178c7130c6 | ||
![]() |
f87d0dd88a | ||
![]() |
2396f90269 | ||
![]() |
97e35fd30a | ||
![]() |
7a5f999f42 | ||
![]() |
cd8d74bb96 | ||
![]() |
3e6f680df2 | ||
![]() |
56c6853e05 | ||
![]() |
2e5d955e77 | ||
![]() |
7733faf6c4 | ||
![]() |
b053a88993 | ||
![]() |
01e2af0cfd | ||
![]() |
f55ff99f74 | ||
![]() |
d25770ee73 | ||
![]() |
2b05d7e1ed | ||
![]() |
7c77c46ede | ||
![]() |
30735266a4 | ||
![]() |
926862c196 | ||
![]() |
44e668e704 | ||
![]() |
404216273a | ||
![]() |
5a6831ae7e | ||
![]() |
da6937f474 | ||
![]() |
cbb496da79 | ||
![]() |
03119fea2c | ||
![]() |
5351211256 | ||
![]() |
92c0aa4331 | ||
![]() |
7bd5c03d87 | ||
![]() |
de72e18a7f | ||
![]() |
3f493acc6a | ||
![]() |
d2239549e6 | ||
![]() |
f8d8f74f34 | ||
![]() |
74a9336d42 | ||
![]() |
ca2b16119d | ||
![]() |
2d9034c983 | ||
![]() |
aa6cb86899 | ||
![]() |
99797632ab | ||
![]() |
4fdb1d5906 | ||
![]() |
43e66a6089 | ||
![]() |
5acbd7e762 | ||
![]() |
febae345fc | ||
![]() |
28bdbbca1a | ||
![]() |
4b896fa22e | ||
![]() |
a25ee49edd | ||
![]() |
695b5b2fb2 | ||
![]() |
9b77af540b | ||
![]() |
7829138fb2 | ||
![]() |
7e7a4fc665 | ||
![]() |
a2bf5103ce | ||
![]() |
8b7a4db2ef | ||
![]() |
a43965ac2c | ||
![]() |
8eb2000b98 | ||
![]() |
73f8dee643 | ||
![]() |
8bdd7ec719 | ||
![]() |
7e1cec95ef | ||
![]() |
ec2c76a703 | ||
![]() |
7facc8f50d | ||
![]() |
52cd9e8e55 | ||
![]() |
9208e7faaf | ||
![]() |
d0ee6079b3 | ||
![]() |
34e6112fea | ||
![]() |
0c759d0075 | ||
![]() |
5b7c1aad9e | ||
![]() |
865c453547 | ||
![]() |
c0b14021b7 | ||
![]() |
2798e27b1e | ||
![]() |
f4c08a0c6f | ||
![]() |
c28c05780c | ||
![]() |
6a538da07d | ||
![]() |
b2dfa74865 | ||
![]() |
930e917215 | ||
![]() |
c8e87b113b | ||
![]() |
8627fb0f62 | ||
![]() |
cdbd3e58a3 | ||
![]() |
630c4d6954 | ||
![]() |
fd4493733f | ||
![]() |
e588743bf4 | ||
![]() |
04d68e7f9a | ||
![]() |
9795b6e089 | ||
![]() |
a9be1a4146 | ||
![]() |
617c7393bf | ||
![]() |
ceb8d4c7ef | ||
![]() |
32c70a0f6a | ||
![]() |
af2632f14a | ||
![]() |
8f89ba1930 | ||
![]() |
c1db4f2ed0 | ||
![]() |
ad6f855f5e | ||
![]() |
f2f2a1d275 | ||
![]() |
17fcf43cdb | ||
![]() |
4fff67e4af | ||
![]() |
350543a5e2 | ||
![]() |
99a2dc7c1f | ||
![]() |
34e756fde6 | ||
![]() |
f74fad057a | ||
![]() |
32ea973b12 | ||
![]() |
0104d19f66 | ||
![]() |
e8986eb546 | ||
![]() |
936d1074b2 | ||
![]() |
a401a4ab49 | ||
![]() |
2bc3a0f97c | ||
![]() |
ce68da3fee | ||
![]() |
f7e31a978b | ||
![]() |
2d583b186d | ||
![]() |
b322392f97 | ||
![]() |
573b6d9ba7 | ||
![]() |
ea39254556 | ||
![]() |
044a3d9686 | ||
![]() |
f28f7b713d | ||
![]() |
cfbd05515e | ||
![]() |
1125f5a283 | ||
![]() |
fa4d4806fa | ||
![]() |
20927a1c8e | ||
![]() |
b2ab34ca2b | ||
![]() |
55e1dd0ead | ||
![]() |
a403f78168 | ||
![]() |
6c45aa3602 | ||
![]() |
91bcd2da8c | ||
![]() |
ec2330875e | ||
![]() |
c8f01b14a8 | ||
![]() |
cdaea58096 | ||
![]() |
b3d8fa917f | ||
![]() |
91931531a6 | ||
![]() |
50e4641666 | ||
![]() |
1bed6432ac | ||
![]() |
ee5dc5ae80 | ||
![]() |
b7940b64cd | ||
![]() |
1ddaf10b89 | ||
![]() |
02b833f251 | ||
![]() |
0ce0c3cd75 | ||
![]() |
11f7f426cb | ||
![]() |
a31adc63a9 | ||
![]() |
91e2c04e56 | ||
![]() |
a2f0d8e4d6 | ||
![]() |
f60ecfc2c4 | ||
![]() |
06877dcc47 | ||
![]() |
050fbd9da2 | ||
![]() |
1be1e34e72 | ||
![]() |
9e29fd0c4a | ||
![]() |
a2650adec2 | ||
![]() |
b0c1460940 | ||
![]() |
7c7fd4bc5e | ||
![]() |
baa261fdd1 | ||
![]() |
aaf15fccc1 | ||
![]() |
3724d11255 | ||
![]() |
5510f18d33 | ||
![]() |
edbf125c83 | ||
![]() |
ad6248147c | ||
![]() |
d47e4724cb | ||
![]() |
4f592115e0 | ||
![]() |
d2d78a5576 | ||
![]() |
e045e0b42d | ||
![]() |
50816a7f98 | ||
![]() |
a318ea3692 | ||
![]() |
1424127127 | ||
![]() |
9c27125f2d | ||
![]() |
6140be24da | ||
![]() |
2fb7bc2806 | ||
![]() |
83a6e696c6 | ||
![]() |
a89e001d01 | ||
![]() |
6a81a907d1 | ||
![]() |
16573d97f5 | ||
![]() |
5abda14809 | ||
![]() |
bb4b92a663 | ||
![]() |
9bd599666b | ||
![]() |
36894fe14a | ||
![]() |
efe834e772 | ||
![]() |
8857e77495 | ||
![]() |
5dab86a067 | ||
![]() |
9ef35549f4 | ||
![]() |
4beed963b8 | ||
![]() |
3122c3b75c | ||
![]() |
dffa689e2b | ||
![]() |
5ed2278887 | ||
![]() |
d6376ca1ff | ||
![]() |
99bd0c48fa | ||
![]() |
eb7289a65a | ||
![]() |
80c6b945fa | ||
![]() |
a81c3187ba | ||
![]() |
39a5abc714 | ||
![]() |
6650efc1a6 | ||
![]() |
a4754ad195 | ||
![]() |
91cbe5bc01 | ||
![]() |
d2996dd553 | ||
![]() |
7a7836ad90 | ||
![]() |
7ca9242b24 | ||
![]() |
438f388b5c | ||
![]() |
e89c77a5ca | ||
![]() |
31984acfe0 | ||
![]() |
9badfe7489 | ||
![]() |
27912bee8c | ||
![]() |
7aef182fbf | ||
![]() |
2fb6ea7b77 | ||
![]() |
add48da4c8 | ||
![]() |
d63d3bf1e7 | ||
![]() |
33e5694a75 | ||
![]() |
302ba725ae | ||
![]() |
5f7c68def7 | ||
![]() |
82d019234a | ||
![]() |
d618b8398e | ||
![]() |
db4ea020ba | ||
![]() |
5366e8b692 | ||
![]() |
fbac4c61bb | ||
![]() |
d81ddf246c | ||
![]() |
ffe1bb359f | ||
![]() |
88a39f8e16 | ||
![]() |
9fb46ae88f | ||
![]() |
798fb98b2a | ||
![]() |
7c0af381d1 | ||
![]() |
384f59eee2 | ||
![]() |
03ff28e927 | ||
![]() |
16a1a90705 | ||
![]() |
3221cbfa0a | ||
![]() |
f0a8ccb177 | ||
![]() |
a30705cdcc | ||
![]() |
9ff09f28e7 | ||
![]() |
eddd8313c9 | ||
![]() |
c828867852 | ||
![]() |
5fca47c5ec | ||
![]() |
4cd3f0a8bb | ||
![]() |
73653c348d | ||
![]() |
0bc07f356d | ||
![]() |
6d33d93b15 | ||
![]() |
d54eed9d62 | ||
![]() |
0fdfd91069 | ||
![]() |
93577619b2 | ||
![]() |
b602f67abe | ||
![]() |
70038e90ce | ||
![]() |
49f2de9547 | ||
![]() |
80eaafa001 | ||
![]() |
cedc1d4e28 | ||
![]() |
882e4971eb | ||
![]() |
3a12a63c32 | ||
![]() |
c1d31476cd | ||
![]() |
b23b97f612 | ||
![]() |
bd1789c54b | ||
![]() |
5feececff6 | ||
![]() |
87b0025691 | ||
![]() |
e32747dc6f | ||
![]() |
6936f6cd02 | ||
![]() |
841619a7d2 | ||
![]() |
905cc365e7 | ||
![]() |
55266c4085 | ||
![]() |
5f95a26218 | ||
![]() |
91b7d4234e | ||
![]() |
0280316b03 | ||
![]() |
7afe87bb52 | ||
![]() |
9632049bf2 | ||
![]() |
13a6f04945 | ||
![]() |
58a744782a | ||
![]() |
63d5808848 | ||
![]() |
a1541aa6f5 | ||
![]() |
5f3c4fccaf |
@@ -33,4 +33,9 @@ export const packageOptions = {
|
|||||||
packageName: 'mermaid-layout-elk',
|
packageName: 'mermaid-layout-elk',
|
||||||
file: 'layouts.ts',
|
file: 'layouts.ts',
|
||||||
},
|
},
|
||||||
|
examples: {
|
||||||
|
name: 'mermaid-examples',
|
||||||
|
packageName: 'examples',
|
||||||
|
file: 'index.ts',
|
||||||
|
},
|
||||||
} as const satisfies Record<string, PackageOptions>;
|
} as const satisfies Record<string, PackageOptions>;
|
||||||
|
@@ -10,13 +10,16 @@ const buildType = (packageName: string) => {
|
|||||||
console.log(out.toString());
|
console.log(out.toString());
|
||||||
}
|
}
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
console.error(e);
|
|
||||||
if (e.stdout.length > 0) {
|
if (e.stdout.length > 0) {
|
||||||
console.error(e.stdout.toString());
|
console.error(e.stdout.toString());
|
||||||
}
|
}
|
||||||
if (e.stderr.length > 0) {
|
if (e.stderr.length > 0) {
|
||||||
console.error(e.stderr.toString());
|
console.error(e.stderr.toString());
|
||||||
}
|
}
|
||||||
|
// Exit the build process if we are in CI
|
||||||
|
if (process.env.CI) {
|
||||||
|
throw new Error(`Failed to build types for ${packageName}`);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
5
.changeset/beige-peas-shave.md
Normal file
5
.changeset/beige-peas-shave.md
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
---
|
||||||
|
'@mermaid-js/mermaid-zenuml': patch
|
||||||
|
---
|
||||||
|
|
||||||
|
Fixed a critical bug that the ZenUML diagram is not rendered.
|
5
.changeset/cute-crews-shake.md
Normal file
5
.changeset/cute-crews-shake.md
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
---
|
||||||
|
'mermaid': minor
|
||||||
|
---
|
||||||
|
|
||||||
|
feat: Added IpSepCoLa algorithm for layout
|
5
.changeset/large-mirrors-cheer.md
Normal file
5
.changeset/large-mirrors-cheer.md
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
---
|
||||||
|
'mermaid': patch
|
||||||
|
---
|
||||||
|
|
||||||
|
fix: Update casing of ID in requirement diagram
|
5
.changeset/lemon-masks-unite.md
Normal file
5
.changeset/lemon-masks-unite.md
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
---
|
||||||
|
'mermaid': minor
|
||||||
|
---
|
||||||
|
|
||||||
|
feat: Added support for per link curve styling in flowchart diagram using edge ids
|
5
.changeset/light-flowers-judge.md
Normal file
5
.changeset/light-flowers-judge.md
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
---
|
||||||
|
'mermaid': patch
|
||||||
|
---
|
||||||
|
|
||||||
|
fix: Make flowchart elk detector regex match less greedy
|
8
.changeset/lovely-queens-own.md
Normal file
8
.changeset/lovely-queens-own.md
Normal file
@@ -0,0 +1,8 @@
|
|||||||
|
---
|
||||||
|
'mermaid': patch
|
||||||
|
---
|
||||||
|
|
||||||
|
fix(block): overflowing blocks no longer affect later lines
|
||||||
|
|
||||||
|
This may change the layout of block diagrams that have overflowing lines
|
||||||
|
(i.e. block diagrams that use up more columns that the `columns` specifier).
|
7
.changeset/ninety-roses-turn.md
Normal file
7
.changeset/ninety-roses-turn.md
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
---
|
||||||
|
'mermaid': patch
|
||||||
|
---
|
||||||
|
|
||||||
|
fix: log warning for blocks exceeding column width
|
||||||
|
|
||||||
|
This update adds a validation check that logs a warning message when a block's width exceeds the defined column layout.
|
5
.changeset/rare-women-fly.md
Normal file
5
.changeset/rare-women-fly.md
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
---
|
||||||
|
'mermaid': patch
|
||||||
|
---
|
||||||
|
|
||||||
|
fix: Add escaped class literal name on namespace
|
5
.changeset/silver-eyes-build.md
Normal file
5
.changeset/silver-eyes-build.md
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
---
|
||||||
|
'mermaid': patch
|
||||||
|
---
|
||||||
|
|
||||||
|
chore: migrate to class-based ArchitectureDB implementation
|
5
.changeset/smart-humans-cover.md
Normal file
5
.changeset/smart-humans-cover.md
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
---
|
||||||
|
'mermaid': patch
|
||||||
|
---
|
||||||
|
|
||||||
|
fix: Update flowchart direction TD's behavior to be the same as TB
|
5
.changeset/vast-buses-see.md
Normal file
5
.changeset/vast-buses-see.md
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
---
|
||||||
|
'mermaid': patch
|
||||||
|
---
|
||||||
|
|
||||||
|
chore: Update packet diagram to use new class-based database structure
|
@@ -47,13 +47,13 @@ edgesep
|
|||||||
EMPTYSTR
|
EMPTYSTR
|
||||||
enddate
|
enddate
|
||||||
ERDIAGRAM
|
ERDIAGRAM
|
||||||
|
eslint
|
||||||
flatmap
|
flatmap
|
||||||
forwardable
|
forwardable
|
||||||
frontmatter
|
frontmatter
|
||||||
funs
|
funs
|
||||||
gantt
|
gantt
|
||||||
GENERICTYPE
|
GENERICTYPE
|
||||||
getBoundarys
|
|
||||||
grammr
|
grammr
|
||||||
graphtype
|
graphtype
|
||||||
halign
|
halign
|
||||||
@@ -88,6 +88,7 @@ NODIR
|
|||||||
NSTR
|
NSTR
|
||||||
outdir
|
outdir
|
||||||
Qcontrolx
|
Qcontrolx
|
||||||
|
QSTR
|
||||||
reinit
|
reinit
|
||||||
rels
|
rels
|
||||||
reqs
|
reqs
|
||||||
|
@@ -2,8 +2,10 @@
|
|||||||
Ashish Jain
|
Ashish Jain
|
||||||
cpettitt
|
cpettitt
|
||||||
Dong Cai
|
Dong Cai
|
||||||
|
knsv
|
||||||
|
Knut Sveidqvist
|
||||||
Nikolay Rozhkov
|
Nikolay Rozhkov
|
||||||
Peng Xiao
|
Peng Xiao
|
||||||
Per Brolin
|
Per Brolin
|
||||||
|
Sidharth Vinod
|
||||||
subhash-halder
|
subhash-halder
|
||||||
Vinod Sidharth
|
|
||||||
|
@@ -26,6 +26,7 @@ dompurify
|
|||||||
elkjs
|
elkjs
|
||||||
fcose
|
fcose
|
||||||
fontawesome
|
fontawesome
|
||||||
|
Fonticons
|
||||||
Forgejo
|
Forgejo
|
||||||
Foswiki
|
Foswiki
|
||||||
Gitea
|
Gitea
|
||||||
|
@@ -12,12 +12,12 @@ gantt
|
|||||||
gitgraph
|
gitgraph
|
||||||
gzipped
|
gzipped
|
||||||
handDrawn
|
handDrawn
|
||||||
|
ipsepcola
|
||||||
kanban
|
kanban
|
||||||
knsv
|
|
||||||
Knut
|
|
||||||
marginx
|
marginx
|
||||||
marginy
|
marginy
|
||||||
Markdownish
|
Markdownish
|
||||||
|
mermaidchart
|
||||||
mermaidjs
|
mermaidjs
|
||||||
mindmap
|
mindmap
|
||||||
mindmaps
|
mindmaps
|
||||||
@@ -35,7 +35,6 @@ sandboxed
|
|||||||
siebling
|
siebling
|
||||||
statediagram
|
statediagram
|
||||||
substate
|
substate
|
||||||
Sveidqvist
|
|
||||||
unfixable
|
unfixable
|
||||||
Viewbox
|
Viewbox
|
||||||
viewports
|
viewports
|
||||||
|
@@ -1,5 +1,5 @@
|
|||||||
import { build } from 'esbuild';
|
import { build } from 'esbuild';
|
||||||
import { mkdir, writeFile } from 'node:fs/promises';
|
import { cp, mkdir, readFile, rename, writeFile } from 'node:fs/promises';
|
||||||
import { packageOptions } from '../.build/common.js';
|
import { packageOptions } from '../.build/common.js';
|
||||||
import { generateLangium } from '../.build/generateLangium.js';
|
import { generateLangium } from '../.build/generateLangium.js';
|
||||||
import type { MermaidBuildOptions } from './util.js';
|
import type { MermaidBuildOptions } from './util.js';
|
||||||
@@ -31,6 +31,27 @@ const buildPackage = async (entryName: keyof typeof packageOptions) => {
|
|||||||
// mermaid.js
|
// mermaid.js
|
||||||
{ ...iifeOptions },
|
{ ...iifeOptions },
|
||||||
// mermaid.min.js
|
// mermaid.min.js
|
||||||
|
{ ...iifeOptions, minify: true, metafile: shouldVisualize },
|
||||||
|
// mermaid.tiny.min.js
|
||||||
|
{
|
||||||
|
...iifeOptions,
|
||||||
|
minify: true,
|
||||||
|
includeLargeFeatures: false,
|
||||||
|
metafile: shouldVisualize,
|
||||||
|
sourcemap: false,
|
||||||
|
}
|
||||||
|
);
|
||||||
|
}
|
||||||
|
if (entryName === 'mermaid-zenuml') {
|
||||||
|
const iifeOptions: MermaidBuildOptions = {
|
||||||
|
...commonOptions,
|
||||||
|
format: 'iife',
|
||||||
|
globalName: 'mermaid-zenuml',
|
||||||
|
};
|
||||||
|
buildConfigs.push(
|
||||||
|
// mermaid-zenuml.js
|
||||||
|
{ ...iifeOptions },
|
||||||
|
// mermaid-zenuml.min.js
|
||||||
{ ...iifeOptions, minify: true, metafile: shouldVisualize }
|
{ ...iifeOptions, minify: true, metafile: shouldVisualize }
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
@@ -57,6 +78,21 @@ const handler = (e) => {
|
|||||||
process.exit(1);
|
process.exit(1);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
const buildTinyMermaid = async () => {
|
||||||
|
await mkdir('./packages/tiny/dist', { recursive: true });
|
||||||
|
await rename(
|
||||||
|
'./packages/mermaid/dist/mermaid.tiny.min.js',
|
||||||
|
'./packages/tiny/dist/mermaid.tiny.js'
|
||||||
|
);
|
||||||
|
// Copy version from mermaid's package.json to tiny's package.json
|
||||||
|
const mermaidPkg = JSON.parse(await readFile('./packages/mermaid/package.json', 'utf8'));
|
||||||
|
const tinyPkg = JSON.parse(await readFile('./packages/tiny/package.json', 'utf8'));
|
||||||
|
tinyPkg.version = mermaidPkg.version;
|
||||||
|
|
||||||
|
await writeFile('./packages/tiny/package.json', JSON.stringify(tinyPkg, null, 2) + '\n');
|
||||||
|
await cp('./packages/mermaid/CHANGELOG.md', './packages/tiny/CHANGELOG.md');
|
||||||
|
};
|
||||||
|
|
||||||
const main = async () => {
|
const main = async () => {
|
||||||
await generateLangium();
|
await generateLangium();
|
||||||
await mkdir('stats', { recursive: true });
|
await mkdir('stats', { recursive: true });
|
||||||
@@ -65,6 +101,7 @@ const main = async () => {
|
|||||||
for (const pkg of packageNames) {
|
for (const pkg of packageNames) {
|
||||||
await buildPackage(pkg).catch(handler);
|
await buildPackage(pkg).catch(handler);
|
||||||
}
|
}
|
||||||
|
await buildTinyMermaid();
|
||||||
};
|
};
|
||||||
|
|
||||||
void main();
|
void main();
|
||||||
|
@@ -14,6 +14,7 @@ export interface MermaidBuildOptions extends BuildOptions {
|
|||||||
metafile: boolean;
|
metafile: boolean;
|
||||||
format: 'esm' | 'iife';
|
format: 'esm' | 'iife';
|
||||||
options: PackageOptions;
|
options: PackageOptions;
|
||||||
|
includeLargeFeatures: boolean;
|
||||||
}
|
}
|
||||||
|
|
||||||
export const defaultOptions: Omit<MermaidBuildOptions, 'entryName' | 'options'> = {
|
export const defaultOptions: Omit<MermaidBuildOptions, 'entryName' | 'options'> = {
|
||||||
@@ -21,6 +22,7 @@ export const defaultOptions: Omit<MermaidBuildOptions, 'entryName' | 'options'>
|
|||||||
metafile: false,
|
metafile: false,
|
||||||
core: false,
|
core: false,
|
||||||
format: 'esm',
|
format: 'esm',
|
||||||
|
includeLargeFeatures: true,
|
||||||
} as const;
|
} as const;
|
||||||
|
|
||||||
const buildOptions = (override: BuildOptions): BuildOptions => {
|
const buildOptions = (override: BuildOptions): BuildOptions => {
|
||||||
@@ -39,12 +41,18 @@ const buildOptions = (override: BuildOptions): BuildOptions => {
|
|||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
const getFileName = (fileName: string, { core, format, minify }: MermaidBuildOptions) => {
|
const getFileName = (
|
||||||
|
fileName: string,
|
||||||
|
{ core, format, minify, includeLargeFeatures }: MermaidBuildOptions
|
||||||
|
) => {
|
||||||
if (core) {
|
if (core) {
|
||||||
fileName += '.core';
|
fileName += '.core';
|
||||||
} else if (format === 'esm') {
|
} else if (format === 'esm') {
|
||||||
fileName += '.esm';
|
fileName += '.esm';
|
||||||
}
|
}
|
||||||
|
if (!includeLargeFeatures) {
|
||||||
|
fileName += '.tiny';
|
||||||
|
}
|
||||||
if (minify) {
|
if (minify) {
|
||||||
fileName += '.min';
|
fileName += '.min';
|
||||||
}
|
}
|
||||||
@@ -54,23 +62,27 @@ const getFileName = (fileName: string, { core, format, minify }: MermaidBuildOpt
|
|||||||
export const getBuildConfig = (options: MermaidBuildOptions): BuildOptions => {
|
export const getBuildConfig = (options: MermaidBuildOptions): BuildOptions => {
|
||||||
const {
|
const {
|
||||||
core,
|
core,
|
||||||
metafile,
|
|
||||||
format,
|
format,
|
||||||
minify,
|
|
||||||
options: { name, file, packageName },
|
options: { name, file, packageName },
|
||||||
|
globalName = 'mermaid',
|
||||||
|
includeLargeFeatures,
|
||||||
|
...rest
|
||||||
} = options;
|
} = options;
|
||||||
|
|
||||||
const external: string[] = ['require', 'fs', 'path'];
|
const external: string[] = ['require', 'fs', 'path'];
|
||||||
const outFileName = getFileName(name, options);
|
const outFileName = getFileName(name, options);
|
||||||
const output: BuildOptions = buildOptions({
|
const output: BuildOptions = buildOptions({
|
||||||
|
...rest,
|
||||||
absWorkingDir: resolve(__dirname, `../packages/${packageName}`),
|
absWorkingDir: resolve(__dirname, `../packages/${packageName}`),
|
||||||
entryPoints: {
|
entryPoints: {
|
||||||
[outFileName]: `src/${file}`,
|
[outFileName]: `src/${file}`,
|
||||||
},
|
},
|
||||||
metafile,
|
globalName,
|
||||||
minify,
|
|
||||||
logLevel: 'info',
|
logLevel: 'info',
|
||||||
chunkNames: `chunks/${outFileName}/[name]-[hash]`,
|
chunkNames: `chunks/${outFileName}/[name]-[hash]`,
|
||||||
define: {
|
define: {
|
||||||
|
// This needs to be stringified for esbuild
|
||||||
|
includeLargeFeatures: `${includeLargeFeatures}`,
|
||||||
'import.meta.vitest': 'undefined',
|
'import.meta.vitest': 'undefined',
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
@@ -89,11 +101,12 @@ export const getBuildConfig = (options: MermaidBuildOptions): BuildOptions => {
|
|||||||
if (format === 'iife') {
|
if (format === 'iife') {
|
||||||
output.format = 'iife';
|
output.format = 'iife';
|
||||||
output.splitting = false;
|
output.splitting = false;
|
||||||
output.globalName = '__esbuild_esm_mermaid';
|
const originalGlobalName = output.globalName ?? 'mermaid';
|
||||||
|
output.globalName = `__esbuild_esm_mermaid_nm[${JSON.stringify(originalGlobalName)}]`;
|
||||||
// Workaround for removing the .default access in esbuild IIFE.
|
// Workaround for removing the .default access in esbuild IIFE.
|
||||||
// https://github.com/mermaid-js/mermaid/pull/4109#discussion_r1292317396
|
// https://github.com/mermaid-js/mermaid/pull/4109#discussion_r1292317396
|
||||||
output.footer = {
|
output.footer = {
|
||||||
js: 'globalThis.mermaid = globalThis.__esbuild_esm_mermaid.default;',
|
js: `globalThis[${JSON.stringify(originalGlobalName)}] = globalThis.${output.globalName}.default;`,
|
||||||
};
|
};
|
||||||
output.outExtension = { '.js': '.js' };
|
output.outExtension = { '.js': '.js' };
|
||||||
} else {
|
} else {
|
||||||
|
2
.github/ISSUE_TEMPLATE/theme_proposal.yml
vendored
2
.github/ISSUE_TEMPLATE/theme_proposal.yml
vendored
@@ -29,7 +29,7 @@ body:
|
|||||||
label: Colors
|
label: Colors
|
||||||
description: |-
|
description: |-
|
||||||
A detailed list of the different colour values to use.
|
A detailed list of the different colour values to use.
|
||||||
A list of currently used variable names can be found [here](https://mermaid-js.github.io/mermaid/#/theming?id=theme-variables-reference-table)
|
See the [list of currently used variable names](https://mermaid-js.github.io/mermaid/#/theming?id=theme-variables-reference-table)
|
||||||
placeholder: |-
|
placeholder: |-
|
||||||
- background: #f4f4f4
|
- background: #f4f4f4
|
||||||
- primaryColor: #fff4dd
|
- primaryColor: #fff4dd
|
||||||
|
13
.github/lychee.toml
vendored
13
.github/lychee.toml
vendored
@@ -46,11 +46,20 @@ exclude = [
|
|||||||
# Drupal 403
|
# Drupal 403
|
||||||
"https://(www.)?drupal.org",
|
"https://(www.)?drupal.org",
|
||||||
|
|
||||||
# Swimm returns 404, eventhough the link is valid
|
# Phbpp 403
|
||||||
|
"https://(www.)?phpbb.com",
|
||||||
|
|
||||||
|
# Swimm returns 404, even though the link is valid
|
||||||
"https://docs.swimm.io",
|
"https://docs.swimm.io",
|
||||||
|
|
||||||
|
# Certificate Error
|
||||||
|
"https://noteshub.app",
|
||||||
|
|
||||||
# Timeout
|
# Timeout
|
||||||
"https://huehive.co"
|
"https://huehive.co",
|
||||||
|
"https://foswiki.org",
|
||||||
|
"https://www.gnu.org",
|
||||||
|
"https://mermaid-preview.com"
|
||||||
]
|
]
|
||||||
|
|
||||||
# Exclude all private IPs from checking.
|
# Exclude all private IPs from checking.
|
||||||
|
2
.github/stale.yml
vendored
2
.github/stale.yml
vendored
@@ -15,5 +15,5 @@ markComment: >
|
|||||||
If you are still interested in this issue and it is still relevant you can comment to revive it.
|
If you are still interested in this issue and it is still relevant you can comment to revive it.
|
||||||
# Comment to post when closing a stale issue. Set to `false` to disable
|
# Comment to post when closing a stale issue. Set to `false` to disable
|
||||||
closeComment: >
|
closeComment: >
|
||||||
This issue has been been automatically closed due to a lack of activity.
|
This issue has been automatically closed due to a lack of activity.
|
||||||
This is done to maintain a clean list of issues that the community is interested in developing.
|
This is done to maintain a clean list of issues that the community is interested in developing.
|
||||||
|
2
.github/workflows/autofix.yml
vendored
2
.github/workflows/autofix.yml
vendored
@@ -42,4 +42,4 @@ jobs:
|
|||||||
working-directory: ./packages/mermaid
|
working-directory: ./packages/mermaid
|
||||||
run: pnpm run docs:build
|
run: pnpm run docs:build
|
||||||
|
|
||||||
- uses: autofix-ci/action@551dded8c6cc8a1054039c8bc0b8b48c51dfc6ef # main
|
- uses: autofix-ci/action@635ffb0c9798bd160680f18fd73371e355b85f27 # main
|
||||||
|
4
.github/workflows/e2e-applitools.yml
vendored
4
.github/workflows/e2e-applitools.yml
vendored
@@ -45,13 +45,15 @@ jobs:
|
|||||||
- if: ${{ env.USE_APPLI }}
|
- if: ${{ env.USE_APPLI }}
|
||||||
name: Notify applitools of new batch
|
name: Notify applitools of new batch
|
||||||
# Copied from docs https://applitools.com/docs/topics/integrations/github-integration-ci-setup.html
|
# Copied from docs https://applitools.com/docs/topics/integrations/github-integration-ci-setup.html
|
||||||
run: curl -L -d '' -X POST "$APPLITOOLS_SERVER_URL/api/externals/github/push?apiKey=$APPLITOOLS_API_KEY&CommitSha=$GITHUB_SHA&BranchName=${APPLITOOLS_BRANCH}$&ParentBranchName=$APPLITOOLS_PARENT_BRANCH"
|
|
||||||
env:
|
env:
|
||||||
# e.g. mermaid-js/mermaid/my-branch
|
# e.g. mermaid-js/mermaid/my-branch
|
||||||
APPLITOOLS_BRANCH: ${{ github.repository }}/${{ github.ref_name }}
|
APPLITOOLS_BRANCH: ${{ github.repository }}/${{ github.ref_name }}
|
||||||
APPLITOOLS_PARENT_BRANCH: ${{ github.event.inputs.parent_branch }}
|
APPLITOOLS_PARENT_BRANCH: ${{ github.event.inputs.parent_branch }}
|
||||||
APPLITOOLS_API_KEY: ${{ secrets.APPLITOOLS_API_KEY }}
|
APPLITOOLS_API_KEY: ${{ secrets.APPLITOOLS_API_KEY }}
|
||||||
APPLITOOLS_SERVER_URL: 'https://eyesapi.applitools.com'
|
APPLITOOLS_SERVER_URL: 'https://eyesapi.applitools.com'
|
||||||
|
uses: wei/curl@012398a392d02480afa2720780031f8621d5f94c
|
||||||
|
with:
|
||||||
|
args: -X POST "$APPLITOOLS_SERVER_URL/api/externals/github/push?apiKey=$APPLITOOLS_API_KEY&CommitSha=$GITHUB_SHA&BranchName=${APPLITOOLS_BRANCH}$&ParentBranchName=$APPLITOOLS_PARENT_BRANCH"
|
||||||
|
|
||||||
- name: Cypress run
|
- name: Cypress run
|
||||||
uses: cypress-io/github-action@18a6541367f4580a515371905f499a27a44e8dbe # v6.7.12
|
uses: cypress-io/github-action@18a6541367f4580a515371905f499a27a44e8dbe # v6.7.12
|
||||||
|
32
.github/workflows/e2e-timings.yml
vendored
32
.github/workflows/e2e-timings.yml
vendored
@@ -11,6 +11,7 @@ concurrency: ${{ github.workflow }}-${{ github.ref }}
|
|||||||
|
|
||||||
permissions:
|
permissions:
|
||||||
contents: write
|
contents: write
|
||||||
|
pull-requests: write
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
timings:
|
timings:
|
||||||
@@ -29,6 +30,7 @@ jobs:
|
|||||||
uses: cypress-io/github-action@18a6541367f4580a515371905f499a27a44e8dbe # v6.7.12
|
uses: cypress-io/github-action@18a6541367f4580a515371905f499a27a44e8dbe # v6.7.12
|
||||||
with:
|
with:
|
||||||
runTests: false
|
runTests: false
|
||||||
|
|
||||||
- name: Cypress run
|
- name: Cypress run
|
||||||
uses: cypress-io/github-action@18a6541367f4580a515371905f499a27a44e8dbe # v6.7.12
|
uses: cypress-io/github-action@18a6541367f4580a515371905f499a27a44e8dbe # v6.7.12
|
||||||
id: cypress
|
id: cypress
|
||||||
@@ -44,15 +46,25 @@ jobs:
|
|||||||
SPLIT: 1
|
SPLIT: 1
|
||||||
SPLIT_INDEX: 0
|
SPLIT_INDEX: 0
|
||||||
SPLIT_FILE: 'cypress/timings.json'
|
SPLIT_FILE: 'cypress/timings.json'
|
||||||
- name: Commit changes
|
|
||||||
uses: EndBug/add-and-commit@a94899bca583c204427a224a7af87c02f9b325d5 # v9.1.4
|
- name: Compare timings
|
||||||
|
id: compare
|
||||||
|
run: |
|
||||||
|
OUTPUT=$(pnpm tsx scripts/compare-timings.ts)
|
||||||
|
echo "$OUTPUT" >> $GITHUB_STEP_SUMMARY
|
||||||
|
|
||||||
|
echo "output<<EOF" >> $GITHUB_OUTPUT
|
||||||
|
echo "$OUTPUT" >> $GITHUB_OUTPUT
|
||||||
|
echo "EOF" >> $GITHUB_OUTPUT
|
||||||
|
|
||||||
|
- name: Commit and create pull request
|
||||||
|
uses: peter-evans/create-pull-request@07cbaebb4bfc9c5d7db426ea5a5f585df29dd0a0
|
||||||
with:
|
with:
|
||||||
add: 'cypress/timings.json'
|
add-paths: |
|
||||||
author_name: 'github-actions[bot]'
|
cypress/timings.json
|
||||||
author_email: '41898282+github-actions[bot]@users.noreply.github.com'
|
commit-message: 'chore: update E2E timings'
|
||||||
message: 'chore: update E2E timings'
|
branch: update-timings
|
||||||
- name: Create Pull Request
|
|
||||||
uses: peter-evans/create-pull-request@v5
|
|
||||||
with:
|
|
||||||
branch: release-promotion
|
|
||||||
title: Update E2E Timings
|
title: Update E2E Timings
|
||||||
|
body: ${{ steps.compare.outputs.output }}
|
||||||
|
delete-branch: true
|
||||||
|
sign-commits: true
|
||||||
|
26
.github/workflows/pr-labeler.yml
vendored
26
.github/workflows/pr-labeler.yml
vendored
@@ -29,3 +29,29 @@ jobs:
|
|||||||
disable-releaser: true
|
disable-releaser: true
|
||||||
env:
|
env:
|
||||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||||
|
|
||||||
|
- name: Add "Sponsored by MermaidChart" label
|
||||||
|
uses: actions/github-script@60a0d83039c74a4aee543508d2ffcb1c3799cdea # v7.0.1
|
||||||
|
with:
|
||||||
|
github-token: ${{ secrets.GITHUB_TOKEN }}
|
||||||
|
script: |
|
||||||
|
const prNumber = context.payload.pull_request.number;
|
||||||
|
const { data: commits } = await github.rest.pulls.listCommits({
|
||||||
|
owner: context.repo.owner,
|
||||||
|
repo: context.repo.repo,
|
||||||
|
pull_number: prNumber,
|
||||||
|
});
|
||||||
|
|
||||||
|
const isSponsored = commits.every(
|
||||||
|
(c) => c.commit.author.email?.endsWith('@mermaidchart.com')
|
||||||
|
);
|
||||||
|
|
||||||
|
if (isSponsored) {
|
||||||
|
console.log('PR is sponsored. Adding label.');
|
||||||
|
await github.rest.issues.addLabels({
|
||||||
|
owner: context.repo.owner,
|
||||||
|
repo: context.repo.repo,
|
||||||
|
issue_number: prNumber,
|
||||||
|
labels: ['Sponsored by MermaidChart'],
|
||||||
|
});
|
||||||
|
}
|
||||||
|
70
.github/workflows/validate-lockfile.yml
vendored
Normal file
70
.github/workflows/validate-lockfile.yml
vendored
Normal file
@@ -0,0 +1,70 @@
|
|||||||
|
name: Validate pnpm-lock.yaml
|
||||||
|
|
||||||
|
on:
|
||||||
|
pull_request:
|
||||||
|
paths:
|
||||||
|
- 'pnpm-lock.yaml'
|
||||||
|
- '**/package.json'
|
||||||
|
- '.github/workflows/validate-lockfile.yml'
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
validate-lockfile:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- name: Checkout code
|
||||||
|
uses: actions/checkout@v4
|
||||||
|
with:
|
||||||
|
fetch-depth: 0
|
||||||
|
|
||||||
|
- name: Set up Node.js
|
||||||
|
uses: actions/setup-node@v4
|
||||||
|
with:
|
||||||
|
node-version: 20
|
||||||
|
|
||||||
|
- uses: pnpm/action-setup@a7487c7e89a18df4991f7f222e4898a00d66ddda # v4.1.0
|
||||||
|
|
||||||
|
- name: Validate pnpm-lock.yaml entries
|
||||||
|
id: validate # give this step an ID so we can reference its outputs
|
||||||
|
run: |
|
||||||
|
issues=()
|
||||||
|
|
||||||
|
# 1) No tarball references
|
||||||
|
if grep -qF 'tarball:' pnpm-lock.yaml; then
|
||||||
|
issues+=("• Tarball references found (forbidden)")
|
||||||
|
fi
|
||||||
|
|
||||||
|
# 2) No unwanted vitepress paths
|
||||||
|
if grep -qF 'packages/mermaid/src/vitepress' pnpm-lock.yaml; then
|
||||||
|
issues+=("• Disallowed path 'packages/mermaid/src/vitepress' present. Run `rm -rf packages/mermaid/src/vitepress && pnpm install` to regenerate.")
|
||||||
|
fi
|
||||||
|
|
||||||
|
# 3) Lockfile only changes when package.json changes
|
||||||
|
git diff --name-only ${{ github.event.pull_request.base.sha }} ${{ github.sha }} > changed.txt
|
||||||
|
if grep -q '^pnpm-lock.yaml$' changed.txt && ! grep -q 'package.json' changed.txt; then
|
||||||
|
issues+=("• pnpm-lock.yaml changed without any package.json modification")
|
||||||
|
fi
|
||||||
|
|
||||||
|
# If any issues, output them and fail
|
||||||
|
if [ ${#issues[@]} -gt 0 ]; then
|
||||||
|
# Use the new GITHUB_OUTPUT approach to set a multiline output
|
||||||
|
{
|
||||||
|
echo "errors<<EOF"
|
||||||
|
printf '%s\n' "${issues[@]}"
|
||||||
|
echo "EOF"
|
||||||
|
} >> $GITHUB_OUTPUT
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
- name: Comment on PR if validation failed
|
||||||
|
if: failure()
|
||||||
|
uses: peter-evans/create-or-update-comment@v4
|
||||||
|
with:
|
||||||
|
token: ${{ secrets.GITHUB_TOKEN }}
|
||||||
|
issue-number: ${{ github.event.pull_request.number }}
|
||||||
|
body: |
|
||||||
|
The following issue(s) were detected:
|
||||||
|
${{ steps.validate.outputs.errors }}
|
||||||
|
|
||||||
|
Please address these and push an update.
|
||||||
|
|
||||||
|
_Posted automatically by GitHub Actions_
|
@@ -94,6 +94,10 @@ export const getBuildConfig = ({ minify, core, watch, entryName }: BuildOptions)
|
|||||||
}),
|
}),
|
||||||
...visualizerOptions(packageName, core),
|
...visualizerOptions(packageName, core),
|
||||||
],
|
],
|
||||||
|
define: {
|
||||||
|
// Needs to be string
|
||||||
|
includeLargeFeatures: 'true',
|
||||||
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
if (watch && config.build) {
|
if (watch && config.build) {
|
||||||
|
1005
CHANGELOG.md
1005
CHANGELOG.md
File diff suppressed because it is too large
Load Diff
1
CHANGELOG.md
Symbolic link
1
CHANGELOG.md
Symbolic link
@@ -0,0 +1 @@
|
|||||||
|
./packages/mermaid/CHANGELOG.md
|
@@ -44,7 +44,7 @@ Try Live Editor previews of future releases: <a href="https://develop.git.mermai
|
|||||||
|
|
||||||
**Thanks to all involved, people committing pull requests, people answering questions! 🙏**
|
**Thanks to all involved, people committing pull requests, people answering questions! 🙏**
|
||||||
|
|
||||||
<a href="https://mermaid.js.org/landing/"><img src="https://github.com/mermaid-js/mermaid/blob/master/docs/intro/img/book-banner-post-release.jpg" alt="Explore Mermaid.js in depth, with real-world examples, tips & tricks from the creator... The first official book on Mermaid is available for purchase. Check it out!"></a>
|
<a href="https://mermaid.js.org/landing/"><img src="https://github.com/mermaid-js/mermaid/blob/master/docs/intro/img/book-banner-post-release.jpg" alt='Banner for "The Official Guide to Mermaid.js" book'></a>
|
||||||
|
|
||||||
## Table of content
|
## Table of content
|
||||||
|
|
||||||
@@ -95,10 +95,6 @@ In our release process we rely heavily on visual regression tests using [applito
|
|||||||
|
|
||||||
<!-- </Main description> -->
|
<!-- </Main description> -->
|
||||||
|
|
||||||
## Mermaid AI Bot
|
|
||||||
|
|
||||||
[Mermaid](https://codeparrot.ai/oracle?owner=mermaid-js&repo=mermaid) Bot will help you understand this repository better. You can ask for code examples, installation guide, debugging help and much more.
|
|
||||||
|
|
||||||
## Examples
|
## Examples
|
||||||
|
|
||||||
**The following are some examples of the diagrams, charts and graphs that can be made using Mermaid. Click here to jump into the [text syntax](https://mermaid.js.org/intro/syntax-reference.html).**
|
**The following are some examples of the diagrams, charts and graphs that can be made using Mermaid. Click here to jump into the [text syntax](https://mermaid.js.org/intro/syntax-reference.html).**
|
||||||
@@ -451,7 +447,7 @@ For public sites, it can be precarious to retrieve text from users on the intern
|
|||||||
|
|
||||||
As an extra level of security for sites with external users we are happy to introduce a new security level in which the diagram is rendered in a sandboxed iframe preventing javascript in the code from being executed. This is a great step forward for better security.
|
As an extra level of security for sites with external users we are happy to introduce a new security level in which the diagram is rendered in a sandboxed iframe preventing javascript in the code from being executed. This is a great step forward for better security.
|
||||||
|
|
||||||
_Unfortunately you can not have a cake and eat it at the same time which in this case means that some of the interactive functionality gets blocked along with the possible malicious code._
|
_Unfortunately you cannot have a cake and eat it at the same time which in this case means that some of the interactive functionality gets blocked along with the possible malicious code._
|
||||||
|
|
||||||
## Reporting vulnerabilities
|
## Reporting vulnerabilities
|
||||||
|
|
||||||
|
@@ -43,13 +43,13 @@ Mermaid
|
|||||||
|
|
||||||
**感谢所有参与进来提交 PR,解答疑问的人们! 🙏**
|
**感谢所有参与进来提交 PR,解答疑问的人们! 🙏**
|
||||||
|
|
||||||
<a href="https://mermaid.js.org/landing/"><img src="https://github.com/mermaid-js/mermaid/blob/master/docs/intro/img/book-banner-post-release.jpg" alt="Explore Mermaid.js in depth, with real-world examples, tips & tricks from the creator... The first official book on Mermaid is available for purchase. Check it out!"></a>
|
<a href="https://mermaid.js.org/landing/"><img src="https://github.com/mermaid-js/mermaid/blob/master/docs/intro/img/book-banner-post-release.jpg" alt='Banner for "The Official Guide to Mermaid.js" book'></a>
|
||||||
|
|
||||||
## 关于 Mermaid
|
## 关于 Mermaid
|
||||||
|
|
||||||
<!-- <Main description> -->
|
<!-- <Main description> -->
|
||||||
|
|
||||||
Mermaid 是一个基于 Javascript 的图表绘制工具,通过解析类 Markdown 的文本语法来实现图表的创建和动态修改。Mermaid 诞生的主要目的是让文档的更新能够及时跟上开发进度。
|
Mermaid 是一个基于 JavaScript 的图表绘制工具,通过解析类 Markdown 的文本语法来实现图表的创建和动态修改。Mermaid 诞生的主要目的是让文档的更新能够及时跟上开发进度。
|
||||||
|
|
||||||
> Doc-Rot 是 Mermaid 致力于解决的一个难题。
|
> Doc-Rot 是 Mermaid 致力于解决的一个难题。
|
||||||
|
|
||||||
|
@@ -1,13 +0,0 @@
|
|||||||
import { MockedD3 } from '../packages/mermaid/src/tests/MockedD3.js';
|
|
||||||
|
|
||||||
export const select = function () {
|
|
||||||
return new MockedD3();
|
|
||||||
};
|
|
||||||
|
|
||||||
export const selectAll = function () {
|
|
||||||
return new MockedD3();
|
|
||||||
};
|
|
||||||
|
|
||||||
export const curveBasis = 'basis';
|
|
||||||
export const curveLinear = 'linear';
|
|
||||||
export const curveCardinal = 'cardinal';
|
|
@@ -26,7 +26,10 @@ export default eyesPlugin(
|
|||||||
config.env.useArgos = process.env.RUN_VISUAL_TEST === 'true';
|
config.env.useArgos = process.env.RUN_VISUAL_TEST === 'true';
|
||||||
|
|
||||||
if (config.env.useArgos) {
|
if (config.env.useArgos) {
|
||||||
registerArgosTask(on, config);
|
registerArgosTask(on, config, {
|
||||||
|
// Enable upload to Argos only when it runs on CI.
|
||||||
|
uploadToArgos: !!process.env.CI,
|
||||||
|
});
|
||||||
} else {
|
} else {
|
||||||
addMatchImageSnapshotPlugin(on, config);
|
addMatchImageSnapshotPlugin(on, config);
|
||||||
}
|
}
|
||||||
|
@@ -69,7 +69,9 @@ describe('Configuration', () => {
|
|||||||
.and('include', 'url(#');
|
.and('include', 'url(#');
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
it('should handle arrowMarkerAbsolute explicitly set to "false" as false', () => {
|
// This has been broken for a long time, but something about the Cypress environment was
|
||||||
|
// rewriting the URL to be relative, causing the test to incorrectly pass.
|
||||||
|
it.skip('should handle arrowMarkerAbsolute explicitly set to "false" as false', () => {
|
||||||
renderGraph(
|
renderGraph(
|
||||||
`graph TD
|
`graph TD
|
||||||
A[Christmas] -->|Get money| B(Go shopping)
|
A[Christmas] -->|Get money| B(Go shopping)
|
||||||
@@ -112,7 +114,7 @@ describe('Configuration', () => {
|
|||||||
.first()
|
.first()
|
||||||
.should('have.attr', 'marker-end')
|
.should('have.attr', 'marker-end')
|
||||||
.should('exist')
|
.should('exist')
|
||||||
.and('include', 'url(http://localhost');
|
.and('include', 'url(http\\:\\/\\/localhost');
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
it('should not taint the initial configuration when using multiple directives', () => {
|
it('should not taint the initial configuration when using multiple directives', () => {
|
||||||
|
@@ -20,7 +20,7 @@ describe('Interaction', () => {
|
|||||||
});
|
});
|
||||||
|
|
||||||
it('Graph: should handle a click on a node with a bound url', () => {
|
it('Graph: should handle a click on a node with a bound url', () => {
|
||||||
// When there is a URL, cy.contains selects the a tag instead of the span. The .node is a child of a, so we have to use find instead of parent.
|
// When there is a URL, `cy.contains()` selects the `a` tag instead of the `span` tag. The .node is a child of `a`, so we have to use `find()` instead of `parent`.
|
||||||
cy.contains('URLTest1').find('.node').click();
|
cy.contains('URLTest1').find('.node').click();
|
||||||
cy.location().should(({ href }) => {
|
cy.location().should(({ href }) => {
|
||||||
expect(href).to.eq('http://localhost:9000/empty.html');
|
expect(href).to.eq('http://localhost:9000/empty.html');
|
||||||
@@ -146,7 +146,7 @@ describe('Interaction', () => {
|
|||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
describe('Interaction - security level other, missspelling', () => {
|
describe('Interaction - security level other, misspelling', () => {
|
||||||
beforeEach(() => {
|
beforeEach(() => {
|
||||||
cy.visit('http://localhost:9000/click_security_other.html');
|
cy.visit('http://localhost:9000/click_security_other.html');
|
||||||
});
|
});
|
||||||
|
@@ -19,6 +19,25 @@ describe.skip('architecture diagram', () => {
|
|||||||
`
|
`
|
||||||
);
|
);
|
||||||
});
|
});
|
||||||
|
it('should render a simple architecture diagram with titleAndAccessibilities', () => {
|
||||||
|
imgSnapshotTest(
|
||||||
|
`architecture-beta
|
||||||
|
title Simple Architecture Diagram
|
||||||
|
accTitle: Accessibility Title
|
||||||
|
accDescr: Accessibility Description
|
||||||
|
group api(cloud)[API]
|
||||||
|
|
||||||
|
service db(database)[Database] in api
|
||||||
|
service disk1(disk)[Storage] in api
|
||||||
|
service disk2(disk)[Storage] in api
|
||||||
|
service server(server)[Server] in api
|
||||||
|
|
||||||
|
db:L -- R:server
|
||||||
|
disk1:T -- B:server
|
||||||
|
disk2:T -- B:db
|
||||||
|
`
|
||||||
|
);
|
||||||
|
});
|
||||||
it('should render an architecture diagram with groups within groups', () => {
|
it('should render an architecture diagram with groups within groups', () => {
|
||||||
imgSnapshotTest(
|
imgSnapshotTest(
|
||||||
`architecture-beta
|
`architecture-beta
|
||||||
@@ -172,7 +191,7 @@ describe.skip('architecture diagram', () => {
|
|||||||
);
|
);
|
||||||
});
|
});
|
||||||
|
|
||||||
it('should render an architecture diagram with a resonable height', () => {
|
it('should render an architecture diagram with a reasonable height', () => {
|
||||||
imgSnapshotTest(
|
imgSnapshotTest(
|
||||||
`architecture-beta
|
`architecture-beta
|
||||||
group federated(cloud)[Federated Environment]
|
group federated(cloud)[Federated Environment]
|
||||||
|
@@ -14,7 +14,7 @@ describe('Block diagram', () => {
|
|||||||
);
|
);
|
||||||
});
|
});
|
||||||
|
|
||||||
it('BL2: should handle colums statement in sub-blocks', () => {
|
it('BL2: should handle columns statement in sub-blocks', () => {
|
||||||
imgSnapshotTest(
|
imgSnapshotTest(
|
||||||
`block-beta
|
`block-beta
|
||||||
id1["Hello"]
|
id1["Hello"]
|
||||||
@@ -30,7 +30,7 @@ describe('Block diagram', () => {
|
|||||||
);
|
);
|
||||||
});
|
});
|
||||||
|
|
||||||
it('BL3: should align block widths and handle colums statement in sub-blocks', () => {
|
it('BL3: should align block widths and handle columns statement in sub-blocks', () => {
|
||||||
imgSnapshotTest(
|
imgSnapshotTest(
|
||||||
`block-beta
|
`block-beta
|
||||||
block
|
block
|
||||||
@@ -46,7 +46,7 @@ describe('Block diagram', () => {
|
|||||||
);
|
);
|
||||||
});
|
});
|
||||||
|
|
||||||
it('BL4: should align block widths and handle colums statements in deeper sub-blocks then 1 level', () => {
|
it('BL4: should align block widths and handle columns statements in deeper sub-blocks then 1 level', () => {
|
||||||
imgSnapshotTest(
|
imgSnapshotTest(
|
||||||
`block-beta
|
`block-beta
|
||||||
columns 1
|
columns 1
|
||||||
@@ -66,7 +66,7 @@ describe('Block diagram', () => {
|
|||||||
);
|
);
|
||||||
});
|
});
|
||||||
|
|
||||||
it('BL5: should align block widths and handle colums statements in deeper sub-blocks then 1 level (alt)', () => {
|
it('BL5: should align block widths and handle columns statements in deeper sub-blocks then 1 level (alt)', () => {
|
||||||
imgSnapshotTest(
|
imgSnapshotTest(
|
||||||
`block-beta
|
`block-beta
|
||||||
columns 1
|
columns 1
|
||||||
@@ -236,7 +236,7 @@ describe('Block diagram', () => {
|
|||||||
);
|
);
|
||||||
});
|
});
|
||||||
|
|
||||||
it('BL17: width alignment - blocks shold be equal in width', () => {
|
it('BL17: width alignment - blocks should be equal in width', () => {
|
||||||
imgSnapshotTest(
|
imgSnapshotTest(
|
||||||
`block-beta
|
`block-beta
|
||||||
A("This is the text")
|
A("This is the text")
|
||||||
@@ -384,4 +384,17 @@ describe('Block diagram', () => {
|
|||||||
{}
|
{}
|
||||||
);
|
);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
it('BL30: block should overflow if too wide for columns', () => {
|
||||||
|
imgSnapshotTest(
|
||||||
|
`block-beta
|
||||||
|
columns 2
|
||||||
|
fit:2
|
||||||
|
overflow:3
|
||||||
|
short:1
|
||||||
|
also_overflow:2
|
||||||
|
`,
|
||||||
|
{}
|
||||||
|
);
|
||||||
|
});
|
||||||
});
|
});
|
||||||
|
@@ -429,7 +429,7 @@ describe('Class diagram', () => {
|
|||||||
classDiagram
|
classDiagram
|
||||||
class \`This\nTitle\nHas\nMany\nNewlines\` {
|
class \`This\nTitle\nHas\nMany\nNewlines\` {
|
||||||
+String Also
|
+String Also
|
||||||
-Stirng Many
|
-String Many
|
||||||
#int Members
|
#int Members
|
||||||
+And()
|
+And()
|
||||||
-Many()
|
-Many()
|
||||||
@@ -443,7 +443,7 @@ describe('Class diagram', () => {
|
|||||||
classDiagram
|
classDiagram
|
||||||
class \`This\nTitle\nHas\nMany\nNewlines\` {
|
class \`This\nTitle\nHas\nMany\nNewlines\` {
|
||||||
+String Also
|
+String Also
|
||||||
-Stirng Many
|
-String Many
|
||||||
#int Members
|
#int Members
|
||||||
+And()
|
+And()
|
||||||
-Many()
|
-Many()
|
||||||
@@ -459,7 +459,7 @@ describe('Class diagram', () => {
|
|||||||
namespace testingNamespace {
|
namespace testingNamespace {
|
||||||
class \`This\nTitle\nHas\nMany\nNewlines\` {
|
class \`This\nTitle\nHas\nMany\nNewlines\` {
|
||||||
+String Also
|
+String Also
|
||||||
-Stirng Many
|
-String Many
|
||||||
#int Members
|
#int Members
|
||||||
+And()
|
+And()
|
||||||
-Many()
|
-Many()
|
||||||
@@ -495,4 +495,34 @@ describe('Class diagram', () => {
|
|||||||
cy.get('a').should('have.attr', 'target', '_blank').should('have.attr', 'rel', 'noopener');
|
cy.get('a').should('have.attr', 'target', '_blank').should('have.attr', 'rel', 'noopener');
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
describe('Include char sequence "graph" in text (#6795)', () => {
|
||||||
|
it('has a label with char sequence "graph"', () => {
|
||||||
|
imgSnapshotTest(
|
||||||
|
`
|
||||||
|
classDiagram
|
||||||
|
class Person {
|
||||||
|
+String name
|
||||||
|
-Int id
|
||||||
|
#double age
|
||||||
|
+Text demographicProfile
|
||||||
|
}
|
||||||
|
`,
|
||||||
|
{ flowchart: { defaultRenderer: 'elk' } }
|
||||||
|
);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should handle backticks for namespace and class names', () => {
|
||||||
|
imgSnapshotTest(
|
||||||
|
`
|
||||||
|
classDiagram
|
||||||
|
namespace \`A::B\` {
|
||||||
|
class \`IPC::Sender\`
|
||||||
|
}
|
||||||
|
RenderProcessHost --|> \`IPC::Sender\`
|
||||||
|
`,
|
||||||
|
{}
|
||||||
|
);
|
||||||
|
});
|
||||||
});
|
});
|
||||||
|
@@ -354,4 +354,19 @@ ORDER ||--|{ LINE-ITEM : contains
|
|||||||
{ logLevel: 1 }
|
{ logLevel: 1 }
|
||||||
);
|
);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
describe('Include char sequence "graph" in text (#6795)', () => {
|
||||||
|
it('has a label with char sequence "graph"', () => {
|
||||||
|
imgSnapshotTest(
|
||||||
|
`
|
||||||
|
erDiagram
|
||||||
|
p[Photograph] {
|
||||||
|
varchar(12) jobId
|
||||||
|
date dateCreated
|
||||||
|
}
|
||||||
|
`,
|
||||||
|
{ flowchart: { defaultRenderer: 'elk' } }
|
||||||
|
);
|
||||||
|
});
|
||||||
|
});
|
||||||
});
|
});
|
||||||
|
@@ -208,13 +208,13 @@ describe('Flowchart ELK', () => {
|
|||||||
`flowchart-elk TB
|
`flowchart-elk TB
|
||||||
internet
|
internet
|
||||||
nat
|
nat
|
||||||
routeur
|
router
|
||||||
lb1
|
lb1
|
||||||
lb2
|
lb2
|
||||||
compute1
|
compute1
|
||||||
compute2
|
compute2
|
||||||
subgraph project
|
subgraph project
|
||||||
routeur
|
router
|
||||||
nat
|
nat
|
||||||
subgraph subnet1
|
subgraph subnet1
|
||||||
compute1
|
compute1
|
||||||
@@ -225,8 +225,8 @@ describe('Flowchart ELK', () => {
|
|||||||
lb2
|
lb2
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
internet --> routeur
|
internet --> router
|
||||||
routeur --> subnet1 & subnet2
|
router --> subnet1 & subnet2
|
||||||
subnet1 & subnet2 --> nat --> internet
|
subnet1 & subnet2 --> nat --> internet
|
||||||
`,
|
`,
|
||||||
{ htmlLabels: true, flowchart: { htmlLabels: true }, securityLevel: 'loose' }
|
{ htmlLabels: true, flowchart: { htmlLabels: true }, securityLevel: 'loose' }
|
||||||
@@ -443,7 +443,7 @@ flowchart-elk TD
|
|||||||
{ htmlLabels: true, flowchart: { htmlLabels: true }, securityLevel: 'loose' }
|
{ htmlLabels: true, flowchart: { htmlLabels: true }, securityLevel: 'loose' }
|
||||||
);
|
);
|
||||||
});
|
});
|
||||||
it('63-elk: title on subgraphs should be themable', () => {
|
it('63-elk: title on subgraphs should be themeable', () => {
|
||||||
imgSnapshotTest(
|
imgSnapshotTest(
|
||||||
`
|
`
|
||||||
%%{init:{"theme":"base", "themeVariables": {"primaryColor":"#411d4e", "titleColor":"white", "darkMode":true}}}%%
|
%%{init:{"theme":"base", "themeVariables": {"primaryColor":"#411d4e", "titleColor":"white", "darkMode":true}}}%%
|
||||||
|
28
cypress/integration/rendering/flowchart-icon.spec.js
Normal file
28
cypress/integration/rendering/flowchart-icon.spec.js
Normal file
@@ -0,0 +1,28 @@
|
|||||||
|
import { imgSnapshotTest } from '../../helpers/util.ts';
|
||||||
|
|
||||||
|
const themes = ['default', 'forest', 'dark', 'base', 'neutral'];
|
||||||
|
|
||||||
|
describe('when rendering flowchart with icons', () => {
|
||||||
|
for (const theme of themes) {
|
||||||
|
it(`should render icons from fontawesome library on theme ${theme}`, () => {
|
||||||
|
imgSnapshotTest(
|
||||||
|
`flowchart TD
|
||||||
|
A("fab:fa-twitter Twitter") --> B("fab:fa-facebook Facebook")
|
||||||
|
B --> C("fa:fa-coffee Coffee")
|
||||||
|
C --> D("fa:fa-car Car")
|
||||||
|
D --> E("fab:fa-github GitHub")
|
||||||
|
`,
|
||||||
|
{ theme }
|
||||||
|
);
|
||||||
|
});
|
||||||
|
|
||||||
|
it(`should render registered icons on theme ${theme}`, () => {
|
||||||
|
imgSnapshotTest(
|
||||||
|
`flowchart TD
|
||||||
|
A("fa:fa-bell Bell")
|
||||||
|
`,
|
||||||
|
{ theme }
|
||||||
|
);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
});
|
@@ -99,7 +99,7 @@ describe('Flowchart v2', () => {
|
|||||||
const style = svg.attr('style');
|
const style = svg.attr('style');
|
||||||
expect(style).to.match(/^max-width: [\d.]+px;$/);
|
expect(style).to.match(/^max-width: [\d.]+px;$/);
|
||||||
const maxWidthValue = parseFloat(style.match(/[\d.]+/g).join(''));
|
const maxWidthValue = parseFloat(style.match(/[\d.]+/g).join(''));
|
||||||
expect(maxWidthValue).to.be.within(417 * 0.95, 417 * 1.05);
|
expect(maxWidthValue).to.be.within(440 * 0.95, 440 * 1.05);
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
it('8: should render a flowchart when useMaxWidth is false', () => {
|
it('8: should render a flowchart when useMaxWidth is false', () => {
|
||||||
@@ -118,7 +118,7 @@ describe('Flowchart v2', () => {
|
|||||||
const width = parseFloat(svg.attr('width'));
|
const width = parseFloat(svg.attr('width'));
|
||||||
// use within because the absolute value can be slightly different depending on the environment ±5%
|
// use within because the absolute value can be slightly different depending on the environment ±5%
|
||||||
// expect(height).to.be.within(446 * 0.95, 446 * 1.05);
|
// expect(height).to.be.within(446 * 0.95, 446 * 1.05);
|
||||||
expect(width).to.be.within(417 * 0.95, 417 * 1.05);
|
expect(width).to.be.within(440 * 0.95, 440 * 1.05);
|
||||||
expect(svg).to.not.have.attr('style');
|
expect(svg).to.not.have.attr('style');
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
@@ -198,13 +198,13 @@ describe('Flowchart v2', () => {
|
|||||||
`flowchart TB
|
`flowchart TB
|
||||||
internet
|
internet
|
||||||
nat
|
nat
|
||||||
routeur
|
router
|
||||||
lb1
|
lb1
|
||||||
lb2
|
lb2
|
||||||
compute1
|
compute1
|
||||||
compute2
|
compute2
|
||||||
subgraph project
|
subgraph project
|
||||||
routeur
|
router
|
||||||
nat
|
nat
|
||||||
subgraph subnet1
|
subgraph subnet1
|
||||||
compute1
|
compute1
|
||||||
@@ -215,8 +215,8 @@ describe('Flowchart v2', () => {
|
|||||||
lb2
|
lb2
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
internet --> routeur
|
internet --> router
|
||||||
routeur --> subnet1 & subnet2
|
router --> subnet1 & subnet2
|
||||||
subnet1 & subnet2 --> nat --> internet
|
subnet1 & subnet2 --> nat --> internet
|
||||||
`,
|
`,
|
||||||
{ htmlLabels: true, flowchart: { htmlLabels: true }, securityLevel: 'loose' }
|
{ htmlLabels: true, flowchart: { htmlLabels: true }, securityLevel: 'loose' }
|
||||||
@@ -433,7 +433,7 @@ flowchart TD
|
|||||||
{ htmlLabels: true, flowchart: { htmlLabels: true }, securityLevel: 'loose' }
|
{ htmlLabels: true, flowchart: { htmlLabels: true }, securityLevel: 'loose' }
|
||||||
);
|
);
|
||||||
});
|
});
|
||||||
it('63: title on subgraphs should be themable', () => {
|
it('63: title on subgraphs should be themeable', () => {
|
||||||
imgSnapshotTest(
|
imgSnapshotTest(
|
||||||
`
|
`
|
||||||
%%{init:{"theme":"base", "themeVariables": {"primaryColor":"#411d4e", "titleColor":"white", "darkMode":true}}}%%
|
%%{init:{"theme":"base", "themeVariables": {"primaryColor":"#411d4e", "titleColor":"white", "darkMode":true}}}%%
|
||||||
@@ -699,7 +699,7 @@ A --> B
|
|||||||
{ flowchart: { titleTopMargin: 10 } }
|
{ flowchart: { titleTopMargin: 10 } }
|
||||||
);
|
);
|
||||||
});
|
});
|
||||||
it('3192: It should be possieble to render flowcharts with invisible edges', () => {
|
it('3192: It should be possible to render flowcharts with invisible edges', () => {
|
||||||
imgSnapshotTest(
|
imgSnapshotTest(
|
||||||
`---
|
`---
|
||||||
title: Simple flowchart with invisible edges
|
title: Simple flowchart with invisible edges
|
||||||
@@ -1076,11 +1076,11 @@ end
|
|||||||
);
|
);
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
describe('New @ sytax for node metadata edge cases', () => {
|
describe('New @ syntax for node metadata edge cases', () => {
|
||||||
it('should be possible to use @ syntax to add labels on multi nodes', () => {
|
it('should be possible to use @ syntax to add labels on multi nodes', () => {
|
||||||
imgSnapshotTest(
|
imgSnapshotTest(
|
||||||
`flowchart TB
|
`flowchart TB
|
||||||
n2["label for n2"] & n4@{ label: "labe for n4"} & n5@{ label: "labe for n5"}
|
n2["label for n2"] & n4@{ label: "label for n4"} & n5@{ label: "label for n5"}
|
||||||
`,
|
`,
|
||||||
{}
|
{}
|
||||||
);
|
);
|
||||||
@@ -1088,7 +1088,7 @@ end
|
|||||||
it('should be possible to use @ syntax to add labels with trail spaces and &', () => {
|
it('should be possible to use @ syntax to add labels with trail spaces and &', () => {
|
||||||
imgSnapshotTest(
|
imgSnapshotTest(
|
||||||
`flowchart TB
|
`flowchart TB
|
||||||
n2["label for n2"] & n4@{ label: "labe for n4"} & n5@{ label: "labe for n5"}
|
n2["label for n2"] & n4@{ label: "label for n4"} & n5@{ label: "label for n5"}
|
||||||
`,
|
`,
|
||||||
{}
|
{}
|
||||||
);
|
);
|
||||||
@@ -1097,8 +1097,8 @@ end
|
|||||||
imgSnapshotTest(
|
imgSnapshotTest(
|
||||||
`flowchart TB
|
`flowchart TB
|
||||||
n2["label for n2"]
|
n2["label for n2"]
|
||||||
n4@{ label: "labe for n4"}
|
n4@{ label: "label for n4"}
|
||||||
n5@{ label: "labe for n5"}
|
n5@{ label: "label for n5"}
|
||||||
`,
|
`,
|
||||||
{}
|
{}
|
||||||
);
|
);
|
||||||
@@ -1113,4 +1113,24 @@ end
|
|||||||
);
|
);
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
it('6617: Per Link Curve Styling using edge Ids', () => {
|
||||||
|
imgSnapshotTest(
|
||||||
|
`flowchart TD
|
||||||
|
A e1@-->B e5@--> E
|
||||||
|
E e7@--> D
|
||||||
|
B e3@-->D
|
||||||
|
A e2@-->C e4@-->D
|
||||||
|
C e6@--> F
|
||||||
|
F e8@--> D
|
||||||
|
e1@{ curve: natural }
|
||||||
|
e2@{ curve: stepAfter }
|
||||||
|
e3@{ curve: monotoneY }
|
||||||
|
e4@{ curve: bumpY }
|
||||||
|
e5@{ curve: linear }
|
||||||
|
e6@{ curve: catmullRom }
|
||||||
|
e7@{ curve: cardinal }
|
||||||
|
`
|
||||||
|
);
|
||||||
|
});
|
||||||
});
|
});
|
||||||
|
@@ -934,4 +934,43 @@ graph TD
|
|||||||
}
|
}
|
||||||
);
|
);
|
||||||
});
|
});
|
||||||
|
it('68: should honor subgraph direction when inheritDir is false', () => {
|
||||||
|
imgSnapshotTest(
|
||||||
|
`
|
||||||
|
%%{init: {"flowchart": { "inheritDir": false }}}%%
|
||||||
|
flowchart TB
|
||||||
|
direction LR
|
||||||
|
subgraph A
|
||||||
|
direction TB
|
||||||
|
a --> b
|
||||||
|
end
|
||||||
|
subgraph B
|
||||||
|
c --> d
|
||||||
|
end
|
||||||
|
`,
|
||||||
|
{
|
||||||
|
fontFamily: 'courier',
|
||||||
|
}
|
||||||
|
);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('69: should inherit global direction when inheritDir is true', () => {
|
||||||
|
imgSnapshotTest(
|
||||||
|
`
|
||||||
|
%%{init: {"flowchart": { "inheritDir": true }}}%%
|
||||||
|
flowchart TB
|
||||||
|
direction LR
|
||||||
|
subgraph A
|
||||||
|
direction TB
|
||||||
|
a --> b
|
||||||
|
end
|
||||||
|
subgraph B
|
||||||
|
c --> d
|
||||||
|
end
|
||||||
|
`,
|
||||||
|
{
|
||||||
|
fontFamily: 'courier',
|
||||||
|
}
|
||||||
|
);
|
||||||
|
});
|
||||||
});
|
});
|
||||||
|
@@ -117,7 +117,7 @@ describe('Gantt diagram', () => {
|
|||||||
{}
|
{}
|
||||||
);
|
);
|
||||||
});
|
});
|
||||||
it('should FAIL redering a gantt chart for issue #1060 with invalid date', () => {
|
it('should FAIL rendering a gantt chart for issue #1060 with invalid date', () => {
|
||||||
imgSnapshotTest(
|
imgSnapshotTest(
|
||||||
`
|
`
|
||||||
gantt
|
gantt
|
||||||
@@ -358,6 +358,23 @@ describe('Gantt diagram', () => {
|
|||||||
);
|
);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
it('should render a gantt diagram with a vert tag', () => {
|
||||||
|
imgSnapshotTest(
|
||||||
|
`
|
||||||
|
gantt
|
||||||
|
title A Gantt Diagram
|
||||||
|
dateFormat ss
|
||||||
|
axisFormat %Ss
|
||||||
|
|
||||||
|
section Section
|
||||||
|
A task : a1, 00, 6s
|
||||||
|
Milestone : vert, 01,
|
||||||
|
section Another
|
||||||
|
Task in sec : 06, 3s
|
||||||
|
another task : 3s
|
||||||
|
`
|
||||||
|
);
|
||||||
|
});
|
||||||
it('should render a gantt diagram with tick is 2 milliseconds', () => {
|
it('should render a gantt diagram with tick is 2 milliseconds', () => {
|
||||||
imgSnapshotTest(
|
imgSnapshotTest(
|
||||||
`
|
`
|
||||||
@@ -573,7 +590,7 @@ describe('Gantt diagram', () => {
|
|||||||
`
|
`
|
||||||
);
|
);
|
||||||
});
|
});
|
||||||
it('should render a gantt diagram exculding friday and saturday', () => {
|
it('should render a gantt diagram excluding friday and saturday', () => {
|
||||||
imgSnapshotTest(
|
imgSnapshotTest(
|
||||||
`gantt
|
`gantt
|
||||||
title A Gantt Diagram
|
title A Gantt Diagram
|
||||||
@@ -584,7 +601,7 @@ describe('Gantt diagram', () => {
|
|||||||
A task :a1, 2024-02-28, 10d`
|
A task :a1, 2024-02-28, 10d`
|
||||||
);
|
);
|
||||||
});
|
});
|
||||||
it('should render a gantt diagram exculding saturday and sunday', () => {
|
it('should render a gantt diagram excluding saturday and sunday', () => {
|
||||||
imgSnapshotTest(
|
imgSnapshotTest(
|
||||||
`gantt
|
`gantt
|
||||||
title A Gantt Diagram
|
title A Gantt Diagram
|
||||||
@@ -671,7 +688,7 @@ describe('Gantt diagram', () => {
|
|||||||
title Gantt Digram
|
title Gantt Digram
|
||||||
dateFormat YYYY-MM-DD
|
dateFormat YYYY-MM-DD
|
||||||
section Section
|
section Section
|
||||||
;A task with a semiclon :a1, 2014-01-01, 30d
|
;A task with a semicolon :a1, 2014-01-01, 30d
|
||||||
Another task :after a1 , 20d
|
Another task :after a1 , 20d
|
||||||
section Another
|
section Another
|
||||||
Task in sec :2014-01-12 , 12d
|
Task in sec :2014-01-12 , 12d
|
||||||
|
@@ -11,7 +11,7 @@ describe('Git Graph diagram', () => {
|
|||||||
{}
|
{}
|
||||||
);
|
);
|
||||||
});
|
});
|
||||||
it('2: should render a simple gitgraph with commit on main branch with Id', () => {
|
it('2: should render a simple gitgraph with commit on main branch with id', () => {
|
||||||
imgSnapshotTest(
|
imgSnapshotTest(
|
||||||
`gitGraph
|
`gitGraph
|
||||||
commit id: "One"
|
commit id: "One"
|
||||||
@@ -253,7 +253,7 @@ describe('Git Graph diagram', () => {
|
|||||||
`
|
`
|
||||||
gitGraph
|
gitGraph
|
||||||
checkout main
|
checkout main
|
||||||
%% Make sure to manually set the ID of all commits, for consistent visual tests
|
%% Make sure to manually set the id of all commits, for consistent visual tests
|
||||||
commit id: "1-abcdefg"
|
commit id: "1-abcdefg"
|
||||||
checkout main
|
checkout main
|
||||||
branch branch1
|
branch branch1
|
||||||
@@ -343,7 +343,7 @@ gitGraph
|
|||||||
{}
|
{}
|
||||||
);
|
);
|
||||||
});
|
});
|
||||||
it('16: should render a simple gitgraph with commit on main branch with Id | Vertical Branch', () => {
|
it('16: should render a simple gitgraph with commit on main branch with id | Vertical Branch', () => {
|
||||||
imgSnapshotTest(
|
imgSnapshotTest(
|
||||||
`gitGraph TB:
|
`gitGraph TB:
|
||||||
commit id: "One"
|
commit id: "One"
|
||||||
@@ -585,7 +585,7 @@ gitGraph
|
|||||||
`
|
`
|
||||||
gitGraph TB:
|
gitGraph TB:
|
||||||
checkout main
|
checkout main
|
||||||
%% Make sure to manually set the ID of all commits, for consistent visual tests
|
%% Make sure to manually set the id of all commits, for consistent visual tests
|
||||||
commit id: "1-abcdefg"
|
commit id: "1-abcdefg"
|
||||||
checkout main
|
checkout main
|
||||||
branch branch1
|
branch branch1
|
||||||
@@ -1024,7 +1024,7 @@ gitGraph TB:
|
|||||||
{}
|
{}
|
||||||
);
|
);
|
||||||
});
|
});
|
||||||
it('51: should render a simple gitgraph with commit on main branch with Id | Vertical Branch - Bottom-to-top', () => {
|
it('51: should render a simple gitgraph with commit on main branch with id | Vertical Branch - Bottom-to-top', () => {
|
||||||
imgSnapshotTest(
|
imgSnapshotTest(
|
||||||
`gitGraph BT:
|
`gitGraph BT:
|
||||||
commit id: "One"
|
commit id: "One"
|
||||||
@@ -1266,7 +1266,7 @@ gitGraph TB:
|
|||||||
`
|
`
|
||||||
gitGraph BT:
|
gitGraph BT:
|
||||||
checkout main
|
checkout main
|
||||||
%% Make sure to manually set the ID of all commits, for consistent visual tests
|
%% Make sure to manually set the id of all commits, for consistent visual tests
|
||||||
commit id: "1-abcdefg"
|
commit id: "1-abcdefg"
|
||||||
checkout main
|
checkout main
|
||||||
branch branch1
|
branch branch1
|
||||||
@@ -1491,7 +1491,7 @@ gitGraph TB:
|
|||||||
`
|
`
|
||||||
gitGraph
|
gitGraph
|
||||||
switch main
|
switch main
|
||||||
%% Make sure to manually set the ID of all commits, for consistent visual tests
|
%% Make sure to manually set the id of all commits, for consistent visual tests
|
||||||
commit id: "1-abcdefg"
|
commit id: "1-abcdefg"
|
||||||
switch main
|
switch main
|
||||||
branch branch1
|
branch branch1
|
||||||
|
153
cypress/integration/rendering/ipsepCola.spec.ts
Normal file
153
cypress/integration/rendering/ipsepCola.spec.ts
Normal file
@@ -0,0 +1,153 @@
|
|||||||
|
import { imgSnapshotTest } from '../../helpers/util.ts';
|
||||||
|
|
||||||
|
describe('Flowchart IPSepCoLa', () => {
|
||||||
|
it('1-ipsepCola: should render a simple flowchart', () => {
|
||||||
|
imgSnapshotTest(
|
||||||
|
`---
|
||||||
|
config:
|
||||||
|
layout: ipsepCola
|
||||||
|
---
|
||||||
|
flowchart
|
||||||
|
A[Christmas] -->|Get money| B(Go shopping)
|
||||||
|
B --> C{Let me think}
|
||||||
|
C -->|One| D[Laptop]
|
||||||
|
C -->|Two| E[iPhone]
|
||||||
|
C -->|Three| F[fa:fa-car Car]
|
||||||
|
`
|
||||||
|
);
|
||||||
|
});
|
||||||
|
it('2-ipsepCola: handle bidirectional edges', () => {
|
||||||
|
imgSnapshotTest(
|
||||||
|
`---
|
||||||
|
config:
|
||||||
|
layout: ipsepCola
|
||||||
|
---
|
||||||
|
flowchart TD
|
||||||
|
subgraph D
|
||||||
|
A --> B
|
||||||
|
A --> B
|
||||||
|
B --> A
|
||||||
|
B --> A
|
||||||
|
end
|
||||||
|
`
|
||||||
|
);
|
||||||
|
});
|
||||||
|
it('3-ipsepCola: handle multiple self loops', () => {
|
||||||
|
imgSnapshotTest(
|
||||||
|
`---
|
||||||
|
config:
|
||||||
|
layout: ipsepCola
|
||||||
|
---
|
||||||
|
flowchart
|
||||||
|
a --> a
|
||||||
|
a --> a
|
||||||
|
a --> a
|
||||||
|
a --> a
|
||||||
|
`
|
||||||
|
);
|
||||||
|
});
|
||||||
|
it('4-ipsepCola: handle state diagram example', () => {
|
||||||
|
imgSnapshotTest(
|
||||||
|
`---
|
||||||
|
config:
|
||||||
|
layout: ipsepCola
|
||||||
|
---
|
||||||
|
stateDiagram-v2
|
||||||
|
[*] --> Still
|
||||||
|
Still --> [*]
|
||||||
|
Still --> Moving
|
||||||
|
Moving --> Still
|
||||||
|
Moving --> Crash
|
||||||
|
Crash --> [*]
|
||||||
|
`
|
||||||
|
);
|
||||||
|
});
|
||||||
|
it('5-ipsepCola: handle multiple subgraphs with edges between them', () => {
|
||||||
|
imgSnapshotTest(
|
||||||
|
`---
|
||||||
|
config:
|
||||||
|
layout: ipsepCola
|
||||||
|
---
|
||||||
|
flowchart LR
|
||||||
|
c1-->a2
|
||||||
|
subgraph one
|
||||||
|
a1-->a2
|
||||||
|
end
|
||||||
|
subgraph two
|
||||||
|
b1-->b2
|
||||||
|
end
|
||||||
|
subgraph three
|
||||||
|
c1-->c2
|
||||||
|
end
|
||||||
|
one --> two
|
||||||
|
three --> two
|
||||||
|
two --> c2
|
||||||
|
`
|
||||||
|
);
|
||||||
|
});
|
||||||
|
it('6-ipsepCola: handle class diagram example', () => {
|
||||||
|
imgSnapshotTest(
|
||||||
|
`---
|
||||||
|
config:
|
||||||
|
layout: ipsepCola
|
||||||
|
---
|
||||||
|
classDiagram
|
||||||
|
class AuthService {
|
||||||
|
+login(username: string, password: string): boolean
|
||||||
|
+logout(): void
|
||||||
|
+register(): void
|
||||||
|
}
|
||||||
|
|
||||||
|
class User {
|
||||||
|
-username: string
|
||||||
|
-password: string
|
||||||
|
-role: Role
|
||||||
|
+changePassword(): void
|
||||||
|
}
|
||||||
|
|
||||||
|
class Role {
|
||||||
|
-name: string
|
||||||
|
-permissions: string[]
|
||||||
|
+hasPermission(): boolean
|
||||||
|
}
|
||||||
|
|
||||||
|
AuthService --> User
|
||||||
|
User --> Role
|
||||||
|
`
|
||||||
|
);
|
||||||
|
});
|
||||||
|
it('7-ipsepCola: should render a decision flowchart', () => {
|
||||||
|
imgSnapshotTest(
|
||||||
|
`---
|
||||||
|
config:
|
||||||
|
layout: ipsepCola
|
||||||
|
---
|
||||||
|
flowchart TD
|
||||||
|
Start([Start]) --> Prep[Preparation Step]
|
||||||
|
Prep --> Split{Ready to Process?}
|
||||||
|
Split -->|Yes| T1[Task A]
|
||||||
|
Split -->|Yes| T2[Task B]
|
||||||
|
T1 --> Merge
|
||||||
|
T2 --> Merge
|
||||||
|
Merge((Join Results)) --> Finalize[Finalize Process]
|
||||||
|
Finalize --> End([End])
|
||||||
|
`
|
||||||
|
);
|
||||||
|
});
|
||||||
|
it('8-ipsepCola: handle nested subgraphs', () => {
|
||||||
|
imgSnapshotTest(
|
||||||
|
`---
|
||||||
|
config:
|
||||||
|
layout: ipsepCola
|
||||||
|
---
|
||||||
|
flowchart LR
|
||||||
|
subgraph main
|
||||||
|
subgraph subcontainer
|
||||||
|
subcontainer-child
|
||||||
|
end
|
||||||
|
subcontainer-child--> subcontainer-sibling
|
||||||
|
end
|
||||||
|
`
|
||||||
|
);
|
||||||
|
});
|
||||||
|
});
|
@@ -63,4 +63,199 @@ section Checkout from website
|
|||||||
{ journey: { useMaxWidth: false } }
|
{ journey: { useMaxWidth: false } }
|
||||||
);
|
);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
it('should initialize with a left margin of 150px for user journeys', () => {
|
||||||
|
renderGraph(
|
||||||
|
`
|
||||||
|
---
|
||||||
|
config:
|
||||||
|
journey:
|
||||||
|
maxLabelWidth: 320
|
||||||
|
---
|
||||||
|
journey
|
||||||
|
title User Journey Example
|
||||||
|
section Onboarding
|
||||||
|
Sign Up: 5:
|
||||||
|
Browse Features: 3:
|
||||||
|
Use Core Functionality: 4:
|
||||||
|
section Engagement
|
||||||
|
Browse Features: 3
|
||||||
|
Use Core Functionality: 4
|
||||||
|
`,
|
||||||
|
{ journey: { useMaxWidth: true } }
|
||||||
|
);
|
||||||
|
|
||||||
|
let diagramStartX;
|
||||||
|
|
||||||
|
cy.contains('foreignobject', 'Sign Up').then(($diagram) => {
|
||||||
|
diagramStartX = parseFloat($diagram.attr('x'));
|
||||||
|
expect(diagramStartX).to.be.closeTo(150, 2);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should maintain sufficient space between legend and diagram when legend labels are longer', () => {
|
||||||
|
renderGraph(
|
||||||
|
`journey
|
||||||
|
title Web hook life cycle
|
||||||
|
section Darkoob
|
||||||
|
Make preBuilt:5: Darkoob user
|
||||||
|
register slug : 5: Darkoob userf deliberately increasing the size of this label to check if distance between legend and diagram is maintained
|
||||||
|
Map slug to a Prebuilt Job:5: Darkoob user
|
||||||
|
section External Service
|
||||||
|
set Darkoob slug as hook for an Event : 5 : admin Exjjjnjjjj qwerty
|
||||||
|
listen to the events : 5 : External Service
|
||||||
|
call darkoob endpoint : 5 : External Service
|
||||||
|
section Darkoob
|
||||||
|
check for inputs : 5 : DarkoobAPI
|
||||||
|
run the prebuilt job : 5 : DarkoobAPI
|
||||||
|
`,
|
||||||
|
{ journey: { useMaxWidth: true } }
|
||||||
|
);
|
||||||
|
|
||||||
|
let LabelEndX, diagramStartX;
|
||||||
|
|
||||||
|
// Get right edge of the legend
|
||||||
|
cy.contains('tspan', 'Darkoob userf').then((textBox) => {
|
||||||
|
const bbox = textBox[0].getBBox();
|
||||||
|
LabelEndX = bbox.x + bbox.width;
|
||||||
|
});
|
||||||
|
|
||||||
|
// Get left edge of the diagram
|
||||||
|
cy.contains('foreignobject', 'Make preBuilt').then((rect) => {
|
||||||
|
diagramStartX = parseFloat(rect.attr('x'));
|
||||||
|
});
|
||||||
|
|
||||||
|
// Assert right edge of the diagram is greater than or equal to the right edge of the label
|
||||||
|
cy.then(() => {
|
||||||
|
expect(diagramStartX).to.be.gte(LabelEndX);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should wrap a single long word with hyphenation', () => {
|
||||||
|
renderGraph(
|
||||||
|
`
|
||||||
|
---
|
||||||
|
config:
|
||||||
|
journey:
|
||||||
|
maxLabelWidth: 100
|
||||||
|
---
|
||||||
|
journey
|
||||||
|
title Long Word Test
|
||||||
|
section Test
|
||||||
|
VeryLongWord: 5: Supercalifragilisticexpialidocious
|
||||||
|
`,
|
||||||
|
{ journey: { useMaxWidth: true } }
|
||||||
|
);
|
||||||
|
|
||||||
|
// Verify that the line ends with a hyphen, indicating proper hyphenation for words exceeding maxLabelWidth.
|
||||||
|
cy.get('tspan').then((tspans) => {
|
||||||
|
const hasHyphen = [...tspans].some((t) => t.textContent.trim().endsWith('-'));
|
||||||
|
return expect(hasHyphen).to.be.true;
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should wrap text on whitespace without adding hyphens', () => {
|
||||||
|
renderGraph(
|
||||||
|
`
|
||||||
|
---
|
||||||
|
config:
|
||||||
|
journey:
|
||||||
|
maxLabelWidth: 200
|
||||||
|
---
|
||||||
|
journey
|
||||||
|
title Whitespace Test
|
||||||
|
section Test
|
||||||
|
TextWithSpaces: 5: Gustavo Fring is played by Giancarlo Esposito and is a character in Breaking Bad.
|
||||||
|
`,
|
||||||
|
{ journey: { useMaxWidth: true } }
|
||||||
|
);
|
||||||
|
|
||||||
|
// Verify that none of the text spans end with a hyphen.
|
||||||
|
cy.get('tspan').each(($el) => {
|
||||||
|
const text = $el.text();
|
||||||
|
expect(text.trim()).not.to.match(/-$/);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should wrap long labels into multiple lines, keep them under max width, and maintain margins', () => {
|
||||||
|
renderGraph(
|
||||||
|
`
|
||||||
|
---
|
||||||
|
config:
|
||||||
|
journey:
|
||||||
|
maxLabelWidth: 320
|
||||||
|
---
|
||||||
|
journey
|
||||||
|
title User Journey Example
|
||||||
|
section Onboarding
|
||||||
|
Sign Up: 5: This is a long label that will be split into multiple lines to test the wrapping functionality
|
||||||
|
Browse Features: 3: This is another long label that will be split into multiple lines to test the wrapping functionality
|
||||||
|
Use Core Functionality: 4: This is yet another long label that will be split into multiple lines to test the wrapping functionality
|
||||||
|
section Engagement
|
||||||
|
Browse Features: 3
|
||||||
|
Use Core Functionality: 4
|
||||||
|
`,
|
||||||
|
{ journey: { useMaxWidth: true } }
|
||||||
|
);
|
||||||
|
|
||||||
|
let diagramStartX, maxLineWidth;
|
||||||
|
|
||||||
|
// Get the diagram's left edge x-coordinate
|
||||||
|
cy.contains('foreignobject', 'Sign Up')
|
||||||
|
.then(($diagram) => {
|
||||||
|
diagramStartX = parseFloat($diagram.attr('x'));
|
||||||
|
})
|
||||||
|
.then(() => {
|
||||||
|
cy.get('text.legend').then(($lines) => {
|
||||||
|
// Check that there are multiple lines
|
||||||
|
expect($lines.length).to.be.equal(9);
|
||||||
|
|
||||||
|
// Check that all lines are under the maxLabelWidth
|
||||||
|
$lines.each((index, el) => {
|
||||||
|
const bbox = el.getBBox();
|
||||||
|
expect(bbox.width).to.be.lte(320);
|
||||||
|
maxLineWidth = Math.max(maxLineWidth || 0, bbox.width);
|
||||||
|
});
|
||||||
|
|
||||||
|
/** The expected margin between the diagram and the legend is 150px, as defined by
|
||||||
|
* conf.leftMargin in user-journey-config.js
|
||||||
|
*/
|
||||||
|
expect(diagramStartX - maxLineWidth).to.be.closeTo(150, 2);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should correctly render the user journey diagram title with the specified styling', () => {
|
||||||
|
renderGraph(
|
||||||
|
`---
|
||||||
|
config:
|
||||||
|
journey:
|
||||||
|
titleColor: "#2900A5"
|
||||||
|
titleFontFamily: "Times New Roman"
|
||||||
|
titleFontSize: "5rem"
|
||||||
|
---
|
||||||
|
|
||||||
|
journey
|
||||||
|
title User Journey Example
|
||||||
|
section Onboarding
|
||||||
|
Sign Up: 5: John, Shahir
|
||||||
|
Complete Profile: 4: John
|
||||||
|
section Engagement
|
||||||
|
Browse Features: 3: John
|
||||||
|
Use Core Functionality: 4: John
|
||||||
|
section Retention
|
||||||
|
Revisit Application: 5: John
|
||||||
|
Invite Friends: 3: John
|
||||||
|
|
||||||
|
size: 2rem
|
||||||
|
`
|
||||||
|
);
|
||||||
|
|
||||||
|
cy.get('text').contains('User Journey Example').as('title');
|
||||||
|
cy.get('@title').then(($title) => {
|
||||||
|
expect($title).to.have.attr('fill', '#2900A5');
|
||||||
|
expect($title).to.have.attr('font-family', 'Times New Roman');
|
||||||
|
expect($title).to.have.attr('font-size', '5rem');
|
||||||
|
});
|
||||||
|
});
|
||||||
});
|
});
|
||||||
|
@@ -62,7 +62,7 @@ describe('Kanban diagram', () => {
|
|||||||
{}
|
{}
|
||||||
);
|
);
|
||||||
});
|
});
|
||||||
it('6: should handle assigments', () => {
|
it('6: should handle assignments', () => {
|
||||||
imgSnapshotTest(
|
imgSnapshotTest(
|
||||||
`kanban
|
`kanban
|
||||||
id1[Todo]
|
id1[Todo]
|
||||||
@@ -118,7 +118,7 @@ kanban
|
|||||||
docs[Create Documentation]
|
docs[Create Documentation]
|
||||||
docs[Create Blog about the new diagram]
|
docs[Create Blog about the new diagram]
|
||||||
id7[In progress]
|
id7[In progress]
|
||||||
id6[Create renderer so that it works in all cases. We also add som extra text here for testing purposes. And some more just for the extra flare.]
|
id6[Create renderer so that it works in all cases. We also add some extra text here for testing purposes. And some more just for the extra flare.]
|
||||||
id8[Design grammar]@{ assigned: 'knsv' }
|
id8[Design grammar]@{ assigned: 'knsv' }
|
||||||
id9[Ready for deploy]
|
id9[Ready for deploy]
|
||||||
id10[Ready for test]
|
id10[Ready for test]
|
||||||
|
@@ -146,7 +146,7 @@ root
|
|||||||
shouldHaveRoot
|
shouldHaveRoot
|
||||||
);
|
);
|
||||||
});
|
});
|
||||||
it('text shouhld wrap with icon', () => {
|
it('text should wrap with icon', () => {
|
||||||
imgSnapshotTest(
|
imgSnapshotTest(
|
||||||
`mindmap
|
`mindmap
|
||||||
root
|
root
|
||||||
@@ -246,5 +246,22 @@ Word!\`]
|
|||||||
);
|
);
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
describe('Include char sequence "graph" in text (#6795)', () => {
|
||||||
|
it('has a label with char sequence "graph"', () => {
|
||||||
|
imgSnapshotTest(
|
||||||
|
`
|
||||||
|
mindmap
|
||||||
|
root
|
||||||
|
Photograph
|
||||||
|
Waterfall
|
||||||
|
Landscape
|
||||||
|
Geography
|
||||||
|
Mountains
|
||||||
|
Rocks
|
||||||
|
`,
|
||||||
|
{ flowchart: { defaultRenderer: 'elk' } }
|
||||||
|
);
|
||||||
|
});
|
||||||
|
});
|
||||||
/* The end */
|
/* The end */
|
||||||
});
|
});
|
||||||
|
@@ -1,7 +1,7 @@
|
|||||||
import { imgSnapshotTest } from '../../helpers/util';
|
import { imgSnapshotTest } from '../../helpers/util';
|
||||||
|
|
||||||
describe('packet structure', () => {
|
describe('packet structure', () => {
|
||||||
it('should render a simple packet diagram', () => {
|
it('should render a simple packet-beta diagram', () => {
|
||||||
imgSnapshotTest(
|
imgSnapshotTest(
|
||||||
`packet-beta
|
`packet-beta
|
||||||
title Hello world
|
title Hello world
|
||||||
@@ -10,9 +10,18 @@ describe('packet structure', () => {
|
|||||||
);
|
);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
it('should render a simple packet diagram', () => {
|
||||||
|
imgSnapshotTest(
|
||||||
|
`packet
|
||||||
|
title Hello world
|
||||||
|
0-10: "hello"
|
||||||
|
`
|
||||||
|
);
|
||||||
|
});
|
||||||
|
|
||||||
it('should render a simple packet diagram without ranges', () => {
|
it('should render a simple packet diagram without ranges', () => {
|
||||||
imgSnapshotTest(
|
imgSnapshotTest(
|
||||||
`packet-beta
|
`packet
|
||||||
0: "h"
|
0: "h"
|
||||||
1: "i"
|
1: "i"
|
||||||
`
|
`
|
||||||
@@ -21,7 +30,7 @@ describe('packet structure', () => {
|
|||||||
|
|
||||||
it('should render a complex packet diagram', () => {
|
it('should render a complex packet diagram', () => {
|
||||||
imgSnapshotTest(
|
imgSnapshotTest(
|
||||||
`packet-beta
|
`packet
|
||||||
0-15: "Source Port"
|
0-15: "Source Port"
|
||||||
16-31: "Destination Port"
|
16-31: "Destination Port"
|
||||||
32-63: "Sequence Number"
|
32-63: "Sequence Number"
|
||||||
@@ -52,7 +61,7 @@ describe('packet structure', () => {
|
|||||||
packet:
|
packet:
|
||||||
showBits: false
|
showBits: false
|
||||||
---
|
---
|
||||||
packet-beta
|
packet
|
||||||
0-15: "Source Port"
|
0-15: "Source Port"
|
||||||
16-31: "Destination Port"
|
16-31: "Destination Port"
|
||||||
32-63: "Sequence Number"
|
32-63: "Sequence Number"
|
||||||
|
@@ -64,7 +64,7 @@ describe('pie chart', () => {
|
|||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
it('should render a pie diagram when textPosition is setted', () => {
|
it('should render a pie diagram when textPosition is set', () => {
|
||||||
imgSnapshotTest(
|
imgSnapshotTest(
|
||||||
`pie
|
`pie
|
||||||
"Dogs": 50
|
"Dogs": 50
|
||||||
|
@@ -45,7 +45,7 @@ describe('Quadrant Chart', () => {
|
|||||||
{}
|
{}
|
||||||
);
|
);
|
||||||
});
|
});
|
||||||
it('should able to render y-axix on right side', () => {
|
it('should able to render y-axis on right side', () => {
|
||||||
imgSnapshotTest(
|
imgSnapshotTest(
|
||||||
`
|
`
|
||||||
%%{init: {"quadrantChart": {"yAxisPosition": "right"}}}%%
|
%%{init: {"quadrantChart": {"yAxisPosition": "right"}}}%%
|
||||||
@@ -61,7 +61,7 @@ describe('Quadrant Chart', () => {
|
|||||||
{}
|
{}
|
||||||
);
|
);
|
||||||
});
|
});
|
||||||
it('should able to render x-axix on bottom', () => {
|
it('should able to render x-axis on bottom', () => {
|
||||||
imgSnapshotTest(
|
imgSnapshotTest(
|
||||||
`
|
`
|
||||||
%%{init: {"quadrantChart": {"xAxisPosition": "bottom"}}}%%
|
%%{init: {"quadrantChart": {"xAxisPosition": "bottom"}}}%%
|
||||||
@@ -77,7 +77,7 @@ describe('Quadrant Chart', () => {
|
|||||||
{}
|
{}
|
||||||
);
|
);
|
||||||
});
|
});
|
||||||
it('should able to render x-axix on bottom and y-axis on right', () => {
|
it('should able to render x-axis on bottom and y-axis on right', () => {
|
||||||
imgSnapshotTest(
|
imgSnapshotTest(
|
||||||
`
|
`
|
||||||
%%{init: {"quadrantChart": {"xAxisPosition": "bottom", "yAxisPosition": "right"}}}%%
|
%%{init: {"quadrantChart": {"xAxisPosition": "bottom", "yAxisPosition": "right"}}}%%
|
||||||
|
@@ -138,8 +138,8 @@ describe('State diagram', () => {
|
|||||||
imgSnapshotTest(
|
imgSnapshotTest(
|
||||||
`
|
`
|
||||||
stateDiagram-v2
|
stateDiagram-v2
|
||||||
State1: This a a single line description
|
State1: This a single line description
|
||||||
State2: This a a multi line description
|
State2: This a multi line description
|
||||||
State2: here comes the multi part
|
State2: here comes the multi part
|
||||||
[*] --> State1
|
[*] --> State1
|
||||||
State1 --> State2
|
State1 --> State2
|
||||||
@@ -345,7 +345,7 @@ stateDiagram
|
|||||||
}
|
}
|
||||||
);
|
);
|
||||||
});
|
});
|
||||||
it('v2 width of compond state should grow with title if title is wider', () => {
|
it('v2 width of compound state should grow with title if title is wider', () => {
|
||||||
imgSnapshotTest(
|
imgSnapshotTest(
|
||||||
`
|
`
|
||||||
stateDiagram-v2
|
stateDiagram-v2
|
||||||
@@ -402,8 +402,8 @@ stateDiagram-v2
|
|||||||
`
|
`
|
||||||
stateDiagram-v2
|
stateDiagram-v2
|
||||||
MyState
|
MyState
|
||||||
note left of MyState : I am a leftie
|
note left of MyState : I am a lefty
|
||||||
note right of MyState : I am a rightie
|
note right of MyState : I am a righty
|
||||||
`,
|
`,
|
||||||
{
|
{
|
||||||
logLevel: 0,
|
logLevel: 0,
|
||||||
@@ -552,7 +552,7 @@ style AState fill:#636,border:1px solid red,color:white;
|
|||||||
{ logLevel: 0, fontFamily: 'courier' }
|
{ logLevel: 0, fontFamily: 'courier' }
|
||||||
);
|
);
|
||||||
});
|
});
|
||||||
it(' should let styles take preceedence over classes', () => {
|
it(' should let styles take precedence over classes', () => {
|
||||||
imgSnapshotTest(
|
imgSnapshotTest(
|
||||||
`
|
`
|
||||||
stateDiagram-v2
|
stateDiagram-v2
|
||||||
@@ -565,7 +565,7 @@ style AState fill:#636,border:1px solid red,color:white;
|
|||||||
{ logLevel: 0, fontFamily: 'courier' }
|
{ logLevel: 0, fontFamily: 'courier' }
|
||||||
);
|
);
|
||||||
});
|
});
|
||||||
it(' should allow styles to take effect in stubgraphs', () => {
|
it(' should allow styles to take effect in subgraphs', () => {
|
||||||
imgSnapshotTest(
|
imgSnapshotTest(
|
||||||
`
|
`
|
||||||
stateDiagram
|
stateDiagram
|
||||||
|
@@ -129,8 +129,8 @@ describe('State diagram', () => {
|
|||||||
imgSnapshotTest(
|
imgSnapshotTest(
|
||||||
`
|
`
|
||||||
stateDiagram
|
stateDiagram
|
||||||
State1: This a a single line description
|
State1: This a single line description
|
||||||
State2: This a a multi line description
|
State2: This a multi line description
|
||||||
State2: here comes the multi part
|
State2: here comes the multi part
|
||||||
[*] --> State1
|
[*] --> State1
|
||||||
State1 --> State2
|
State1 --> State2
|
||||||
|
@@ -7,7 +7,7 @@ describe('Timeline diagram', () => {
|
|||||||
title History of Social Media Platform
|
title History of Social Media Platform
|
||||||
2002 : LinkedIn
|
2002 : LinkedIn
|
||||||
2004 : Facebook : Google
|
2004 : Facebook : Google
|
||||||
2005 : Youtube
|
2005 : YouTube
|
||||||
2006 : Twitter
|
2006 : Twitter
|
||||||
`,
|
`,
|
||||||
{}
|
{}
|
||||||
@@ -35,7 +35,7 @@ describe('Timeline diagram', () => {
|
|||||||
section Stone Age
|
section Stone Age
|
||||||
7600 BC : Britain's oldest known house was built in Orkney, Scotland
|
7600 BC : Britain's oldest known house was built in Orkney, Scotland
|
||||||
6000 BC : Sea levels rise and Britain becomes an island.<br> The people who live here are hunter-gatherers.
|
6000 BC : Sea levels rise and Britain becomes an island.<br> The people who live here are hunter-gatherers.
|
||||||
section Broze Age
|
section Bronze Age
|
||||||
2300 BC : People arrive from Europe and settle in Britain. <br>They bring farming and metalworking.
|
2300 BC : People arrive from Europe and settle in Britain. <br>They bring farming and metalworking.
|
||||||
: New styles of pottery and ways of burying the dead appear.
|
: New styles of pottery and ways of burying the dead appear.
|
||||||
2200 BC : The last major building works are completed at Stonehenge.<br> People now bury their dead in stone circles.
|
2200 BC : The last major building works are completed at Stonehenge.<br> People now bury their dead in stone circles.
|
||||||
@@ -51,7 +51,7 @@ describe('Timeline diagram', () => {
|
|||||||
title History of Social Media Platform
|
title History of Social Media Platform
|
||||||
2002 : LinkedIn
|
2002 : LinkedIn
|
||||||
2004 : Facebook : Google
|
2004 : Facebook : Google
|
||||||
2005 : Youtube
|
2005 : YouTube
|
||||||
2006 : Twitter
|
2006 : Twitter
|
||||||
`,
|
`,
|
||||||
{}
|
{}
|
||||||
@@ -68,7 +68,7 @@ describe('Timeline diagram', () => {
|
|||||||
title History of Social Media Platform
|
title History of Social Media Platform
|
||||||
2002 : LinkedIn
|
2002 : LinkedIn
|
||||||
2004 : Facebook : Google
|
2004 : Facebook : Google
|
||||||
2005 : Youtube
|
2005 : YouTube
|
||||||
2006 : Twitter
|
2006 : Twitter
|
||||||
2007 : Tumblr
|
2007 : Tumblr
|
||||||
2008 : Instagram
|
2008 : Instagram
|
||||||
@@ -84,7 +84,7 @@ describe('Timeline diagram', () => {
|
|||||||
title History of Social Media Platform
|
title History of Social Media Platform
|
||||||
2002 : LinkedIn
|
2002 : LinkedIn
|
||||||
2004 : Facebook : Google
|
2004 : Facebook : Google
|
||||||
2005 : Youtube
|
2005 : YouTube
|
||||||
2006 : Twitter
|
2006 : Twitter
|
||||||
2007 : Tumblr
|
2007 : Tumblr
|
||||||
2008 : Instagram
|
2008 : Instagram
|
||||||
@@ -101,7 +101,7 @@ describe('Timeline diagram', () => {
|
|||||||
title History of Social Media Platform
|
title History of Social Media Platform
|
||||||
2002 : LinkedIn
|
2002 : LinkedIn
|
||||||
2004 : Facebook : Google
|
2004 : Facebook : Google
|
||||||
2005 : Youtube
|
2005 : YouTube
|
||||||
2006 : Twitter
|
2006 : Twitter
|
||||||
2007 : Tumblr
|
2007 : Tumblr
|
||||||
2008 : Instagram
|
2008 : Instagram
|
||||||
@@ -118,7 +118,7 @@ describe('Timeline diagram', () => {
|
|||||||
title History of Social Media Platform
|
title History of Social Media Platform
|
||||||
2002 : LinkedIn
|
2002 : LinkedIn
|
||||||
2004 : Facebook : Google
|
2004 : Facebook : Google
|
||||||
2005 : Youtube
|
2005 : YouTube
|
||||||
2006 : Twitter
|
2006 : Twitter
|
||||||
2007 : Tumblr
|
2007 : Tumblr
|
||||||
2008 : Instagram
|
2008 : Instagram
|
||||||
@@ -135,7 +135,7 @@ describe('Timeline diagram', () => {
|
|||||||
title History of Social Media Platform
|
title History of Social Media Platform
|
||||||
2002 : LinkedIn
|
2002 : LinkedIn
|
||||||
2004 : Facebook : Google
|
2004 : Facebook : Google
|
||||||
2005 : Youtube
|
2005 : YouTube
|
||||||
2006 : Twitter
|
2006 : Twitter
|
||||||
2007 : Tumblr
|
2007 : Tumblr
|
||||||
2008 : Instagram
|
2008 : Instagram
|
||||||
@@ -152,7 +152,7 @@ describe('Timeline diagram', () => {
|
|||||||
title History of Social Media Platform
|
title History of Social Media Platform
|
||||||
2002 : LinkedIn
|
2002 : LinkedIn
|
||||||
2004 : Facebook : Google
|
2004 : Facebook : Google
|
||||||
2005 : Youtube
|
2005 : YouTube
|
||||||
2006 : Twitter
|
2006 : Twitter
|
||||||
2007 : Tumblr
|
2007 : Tumblr
|
||||||
2008 : Instagram
|
2008 : Instagram
|
||||||
@@ -161,4 +161,68 @@ describe('Timeline diagram', () => {
|
|||||||
{}
|
{}
|
||||||
);
|
);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
it('11: should render timeline with many stacked events and proper timeline line length', () => {
|
||||||
|
imgSnapshotTest(
|
||||||
|
`timeline
|
||||||
|
title Medical Device Lifecycle
|
||||||
|
section Pre-Development
|
||||||
|
Quality Management System : Regulatory Compliance : Risk Management
|
||||||
|
section Development
|
||||||
|
Management Responsibility : Planning Activities : Human Resources
|
||||||
|
Resource Management : Management Reviews : Infrastructure
|
||||||
|
section Post-Development
|
||||||
|
Product Realization Activities : Planning Activities : Customer-related Processes
|
||||||
|
Post-Production Activities : Feedback : Complaints : Adverse Events
|
||||||
|
: Research and Development : Purchasing Activities
|
||||||
|
: Production Activities : Installation Activities
|
||||||
|
: Servicing Activities : Post-Market Surveillance
|
||||||
|
`,
|
||||||
|
{}
|
||||||
|
);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('12: should render timeline with proper vertical line lengths for all columns', () => {
|
||||||
|
imgSnapshotTest(
|
||||||
|
`---
|
||||||
|
config:
|
||||||
|
theme: base
|
||||||
|
themeVariables:
|
||||||
|
fontFamily: Fira Sans
|
||||||
|
fontSize: 17px
|
||||||
|
cScale0: '#b3cde0'
|
||||||
|
cScale1: '#f49090'
|
||||||
|
cScale2: '#85d5b8'
|
||||||
|
---
|
||||||
|
|
||||||
|
timeline
|
||||||
|
title Medical Device Lifecycle
|
||||||
|
section Planning
|
||||||
|
Quality Management System (4): Regulatory Compliance (4.1.1)
|
||||||
|
: Risk Management (4.1.2)
|
||||||
|
Management Resposibility (5): Planning Activities (5.4)
|
||||||
|
: Management Reviews (5.6)
|
||||||
|
Resource Management (6): Human Resources (6.2)
|
||||||
|
: Infrastructure (6.3)
|
||||||
|
section Realization
|
||||||
|
Research and Development (7.3): RnD Planning (7.3.2)
|
||||||
|
: Inputs (7.3.3)
|
||||||
|
: Outputs (7.3.4)
|
||||||
|
: Review (7.3.5)
|
||||||
|
: Verification (7.3.6)
|
||||||
|
: Validation (7.3.7)
|
||||||
|
Purchasing (7.4): Purchasing Process (7.4.1)
|
||||||
|
: Purchasing Information (7.4.2)
|
||||||
|
Production (7.5): Production Activities (7.5.1)
|
||||||
|
: Production Feedback (8.2.1)
|
||||||
|
Installation (7.5.3): Installation Activities (7.5.3)
|
||||||
|
Servicing (7.5.4): Servicing Activities (7.5.4)
|
||||||
|
section Post-Production
|
||||||
|
Post-Market Activities (8): Feedback (8.2.1)
|
||||||
|
: Complaints (8.2.2)
|
||||||
|
: Adverse Events (8.2.3)
|
||||||
|
`,
|
||||||
|
{}
|
||||||
|
);
|
||||||
|
});
|
||||||
});
|
});
|
||||||
|
382
cypress/integration/rendering/treemap.spec.ts
Normal file
382
cypress/integration/rendering/treemap.spec.ts
Normal file
@@ -0,0 +1,382 @@
|
|||||||
|
import { imgSnapshotTest } from '../../helpers/util.ts';
|
||||||
|
|
||||||
|
describe('Treemap Diagram', () => {
|
||||||
|
it('1: should render a basic treemap', () => {
|
||||||
|
imgSnapshotTest(
|
||||||
|
`treemap-beta
|
||||||
|
"Category A"
|
||||||
|
"Item A1": 10
|
||||||
|
"Item A2": 20
|
||||||
|
"Category B"
|
||||||
|
"Item B1": 15
|
||||||
|
"Item B2": 25
|
||||||
|
`,
|
||||||
|
{}
|
||||||
|
);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('2: should render a hierarchical treemap', () => {
|
||||||
|
imgSnapshotTest(
|
||||||
|
`treemap-beta
|
||||||
|
"Products"
|
||||||
|
"Electronics"
|
||||||
|
"Phones": 50
|
||||||
|
"Computers": 30
|
||||||
|
"Accessories": 20
|
||||||
|
"Clothing"
|
||||||
|
"Men's"
|
||||||
|
"Shirts": 10
|
||||||
|
"Pants": 15
|
||||||
|
"Women's"
|
||||||
|
"Dresses": 20
|
||||||
|
"Skirts": 10
|
||||||
|
`,
|
||||||
|
{}
|
||||||
|
);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('3: should render a treemap with styling using classDef', () => {
|
||||||
|
imgSnapshotTest(
|
||||||
|
`treemap-beta
|
||||||
|
"Section 1"
|
||||||
|
"Leaf 1.1": 12
|
||||||
|
"Section 1.2":::class1
|
||||||
|
"Leaf 1.2.1": 12
|
||||||
|
"Section 2"
|
||||||
|
"Leaf 2.1": 20:::class1
|
||||||
|
"Leaf 2.2": 25
|
||||||
|
"Leaf 2.3": 12
|
||||||
|
|
||||||
|
classDef class1 fill:red,color:blue,stroke:#FFD600;
|
||||||
|
`,
|
||||||
|
{}
|
||||||
|
);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('4: should handle long text that wraps', () => {
|
||||||
|
imgSnapshotTest(
|
||||||
|
`treemap-beta
|
||||||
|
"Main Category"
|
||||||
|
"This is a very long item name that should wrap to the next line when rendered in the treemap diagram": 50
|
||||||
|
"Short item": 20
|
||||||
|
`,
|
||||||
|
{}
|
||||||
|
);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('5: should render with a forest theme', () => {
|
||||||
|
imgSnapshotTest(
|
||||||
|
`---
|
||||||
|
config:
|
||||||
|
theme: forest
|
||||||
|
---
|
||||||
|
treemap-beta
|
||||||
|
"Category A"
|
||||||
|
"Item A1": 10
|
||||||
|
"Item A2": 20
|
||||||
|
"Category B"
|
||||||
|
"Item B1": 15
|
||||||
|
"Item B2": 25
|
||||||
|
`,
|
||||||
|
{}
|
||||||
|
);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('6: should handle multiple levels of nesting', () => {
|
||||||
|
imgSnapshotTest(
|
||||||
|
`treemap-beta
|
||||||
|
"Level 1"
|
||||||
|
"Level 2A"
|
||||||
|
"Level 3A": 10
|
||||||
|
"Level 3B": 15
|
||||||
|
"Level 2B"
|
||||||
|
"Level 3C": 20
|
||||||
|
"Level 3D"
|
||||||
|
"Level 4A": 5
|
||||||
|
"Level 4B": 5
|
||||||
|
`,
|
||||||
|
{}
|
||||||
|
);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('7: should handle classDef with multiple styles', () => {
|
||||||
|
imgSnapshotTest(
|
||||||
|
`treemap-beta
|
||||||
|
"Main"
|
||||||
|
"A": 20
|
||||||
|
"B":::important
|
||||||
|
"B1": 10
|
||||||
|
"B2": 15
|
||||||
|
"C": 5:::secondary
|
||||||
|
|
||||||
|
classDef important fill:#f96,stroke:#333,stroke-width:2px;
|
||||||
|
classDef secondary fill:#6cf,stroke:#333,stroke-dasharray:5 5;
|
||||||
|
`,
|
||||||
|
{}
|
||||||
|
);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('8: should handle dollar value formatting with thousands separator', () => {
|
||||||
|
imgSnapshotTest(
|
||||||
|
`---
|
||||||
|
config:
|
||||||
|
treemap:
|
||||||
|
valueFormat: "$0,0"
|
||||||
|
---
|
||||||
|
treemap
|
||||||
|
"Budget"
|
||||||
|
"Operations"
|
||||||
|
"Salaries": 700000
|
||||||
|
"Equipment": 200000
|
||||||
|
"Supplies": 100000
|
||||||
|
"Marketing"
|
||||||
|
"Advertising": 400000
|
||||||
|
"Events": 100000
|
||||||
|
`,
|
||||||
|
{}
|
||||||
|
);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('8a: should handle percentage formatting', () => {
|
||||||
|
imgSnapshotTest(
|
||||||
|
`---
|
||||||
|
config:
|
||||||
|
treemap:
|
||||||
|
valueFormat: ".1%"
|
||||||
|
---
|
||||||
|
treemap-beta
|
||||||
|
"Market Share"
|
||||||
|
"Company A": 0.35
|
||||||
|
"Company B": 0.25
|
||||||
|
"Company C": 0.15
|
||||||
|
"Others": 0.25
|
||||||
|
`,
|
||||||
|
{}
|
||||||
|
);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('8b: should handle decimal formatting', () => {
|
||||||
|
imgSnapshotTest(
|
||||||
|
`---
|
||||||
|
config:
|
||||||
|
treemap:
|
||||||
|
valueFormat: ".2f"
|
||||||
|
---
|
||||||
|
treemap-beta
|
||||||
|
"Metrics"
|
||||||
|
"Conversion Rate": 0.0567
|
||||||
|
"Bounce Rate": 0.6723
|
||||||
|
"Click-through Rate": 0.1289
|
||||||
|
"Engagement": 0.4521
|
||||||
|
`,
|
||||||
|
{}
|
||||||
|
);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('8c: should handle dollar sign with decimal places', () => {
|
||||||
|
imgSnapshotTest(
|
||||||
|
`---
|
||||||
|
config:
|
||||||
|
treemap:
|
||||||
|
valueFormat: "$.2f"
|
||||||
|
---
|
||||||
|
treemap-beta
|
||||||
|
"Product Prices"
|
||||||
|
"Basic": 19.99
|
||||||
|
"Standard": 49.99
|
||||||
|
"Premium": 99.99
|
||||||
|
"Enterprise": 199.99
|
||||||
|
`,
|
||||||
|
{}
|
||||||
|
);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('8d: should handle dollar sign with thousands separator and decimal places', () => {
|
||||||
|
imgSnapshotTest(
|
||||||
|
`---
|
||||||
|
config:
|
||||||
|
treemap:
|
||||||
|
valueFormat: "$,.2f"
|
||||||
|
---
|
||||||
|
treemap-beta
|
||||||
|
"Revenue"
|
||||||
|
"Q1": 1250345.75
|
||||||
|
"Q2": 1645789.25
|
||||||
|
"Q3": 1845123.50
|
||||||
|
"Q4": 2145678.75
|
||||||
|
`,
|
||||||
|
{}
|
||||||
|
);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('8e: should handle simple thousands separator', () => {
|
||||||
|
imgSnapshotTest(
|
||||||
|
`---
|
||||||
|
config:
|
||||||
|
treemap:
|
||||||
|
valueFormat: ","
|
||||||
|
---
|
||||||
|
treemap-beta
|
||||||
|
"User Counts"
|
||||||
|
"Active Users": 1250345
|
||||||
|
"New Signups": 45789
|
||||||
|
"Churned": 12350
|
||||||
|
"Converted": 78975
|
||||||
|
`,
|
||||||
|
{}
|
||||||
|
);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('8f: should handle valueFormat set via directive with dollar and thousands separator', () => {
|
||||||
|
imgSnapshotTest(
|
||||||
|
`---
|
||||||
|
config:
|
||||||
|
treemap:
|
||||||
|
valueFormat: "$,.0f"
|
||||||
|
---
|
||||||
|
treemap-beta
|
||||||
|
"Sales by Region"
|
||||||
|
"North": 1234567
|
||||||
|
"South": 7654321
|
||||||
|
"East": 4567890
|
||||||
|
"West": 9876543
|
||||||
|
`,
|
||||||
|
{}
|
||||||
|
);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('8g: should handle scientific notation format', () => {
|
||||||
|
imgSnapshotTest(
|
||||||
|
`---
|
||||||
|
config:
|
||||||
|
treemap:
|
||||||
|
valueFormat: ".2e"
|
||||||
|
---
|
||||||
|
treemap-beta
|
||||||
|
"Scientific Values"
|
||||||
|
"Value 1": 1234567
|
||||||
|
"Value 2": 0.0000123
|
||||||
|
"Value 3": 1000000000
|
||||||
|
`,
|
||||||
|
{}
|
||||||
|
);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('9: should handle a complex example with multiple features', () => {
|
||||||
|
imgSnapshotTest(
|
||||||
|
`---
|
||||||
|
config:
|
||||||
|
theme: dark
|
||||||
|
treemap:
|
||||||
|
valueFormat: "$0,0"
|
||||||
|
---
|
||||||
|
treemap-beta
|
||||||
|
"Company Budget"
|
||||||
|
"Engineering":::engineering
|
||||||
|
"Frontend": 300000
|
||||||
|
"Backend": 400000
|
||||||
|
"DevOps": 200000
|
||||||
|
"Marketing":::marketing
|
||||||
|
"Digital": 250000
|
||||||
|
"Print": 100000
|
||||||
|
"Events": 150000
|
||||||
|
"Sales":::sales
|
||||||
|
"Direct": 500000
|
||||||
|
"Channel": 300000
|
||||||
|
|
||||||
|
classDef engineering fill:#6b9bc3,stroke:#333;
|
||||||
|
classDef marketing fill:#c36b9b,stroke:#333;
|
||||||
|
classDef sales fill:#c3a66b,stroke:#333;
|
||||||
|
`,
|
||||||
|
{}
|
||||||
|
);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('10: should render the example from documentation', () => {
|
||||||
|
imgSnapshotTest(
|
||||||
|
`
|
||||||
|
treemap-beta
|
||||||
|
"Section 1"
|
||||||
|
"Leaf 1.1": 12
|
||||||
|
"Section 1.2":::class1
|
||||||
|
"Leaf 1.2.1": 12
|
||||||
|
"Section 2"
|
||||||
|
"Leaf 2.1": 20:::class1
|
||||||
|
"Leaf 2.2": 25
|
||||||
|
"Leaf 2.3": 12
|
||||||
|
|
||||||
|
classDef class1 fill:red,color:blue,stroke:#FFD600;
|
||||||
|
`,
|
||||||
|
{}
|
||||||
|
);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('11: should handle comments', () => {
|
||||||
|
imgSnapshotTest(
|
||||||
|
`
|
||||||
|
treemap-beta
|
||||||
|
%% This is a comment
|
||||||
|
"Category A"
|
||||||
|
"Item A1": 10
|
||||||
|
"Item A2": 20
|
||||||
|
%% Another comment
|
||||||
|
"Category B"
|
||||||
|
"Item B1": 15
|
||||||
|
"Item B2": 25
|
||||||
|
`,
|
||||||
|
{}
|
||||||
|
);
|
||||||
|
});
|
||||||
|
/*
|
||||||
|
it.skip('12: should render a treemap with title', () => {
|
||||||
|
imgSnapshotTest(
|
||||||
|
`
|
||||||
|
treemap-beta
|
||||||
|
title Treemap with Title
|
||||||
|
"Category A"
|
||||||
|
"Item A1": 10
|
||||||
|
"Item A2": 20
|
||||||
|
"Category B"
|
||||||
|
"Item B1": 15
|
||||||
|
"Item B2": 25
|
||||||
|
`,
|
||||||
|
{}
|
||||||
|
);
|
||||||
|
});
|
||||||
|
|
||||||
|
it.skip('13: should render a treemap with accessibility attributes', () => {
|
||||||
|
imgSnapshotTest(
|
||||||
|
`
|
||||||
|
treemap-beta
|
||||||
|
accTitle: Accessible Treemap Title
|
||||||
|
accDescr: This is a description of the treemap for accessibility purposes
|
||||||
|
"Category A"
|
||||||
|
"Item A1": 10
|
||||||
|
"Item A2": 20
|
||||||
|
"Category B"
|
||||||
|
"Item B1": 15
|
||||||
|
"Item B2": 25
|
||||||
|
`,
|
||||||
|
{}
|
||||||
|
);
|
||||||
|
});
|
||||||
|
|
||||||
|
it.skip('14: should render a treemap with title and accessibility attributes', () => {
|
||||||
|
imgSnapshotTest(
|
||||||
|
`
|
||||||
|
treemap
|
||||||
|
title Treemap with Title and Accessibility
|
||||||
|
accTitle: Accessible Treemap Title
|
||||||
|
accDescr: This is a description of the treemap for accessibility purposes
|
||||||
|
"Category A"
|
||||||
|
"Item A1": 10
|
||||||
|
"Item A2": 20
|
||||||
|
"Category B"
|
||||||
|
"Item B1": 15
|
||||||
|
"Item B2": 25
|
||||||
|
`,
|
||||||
|
{}
|
||||||
|
);
|
||||||
|
});
|
||||||
|
*/
|
||||||
|
});
|
@@ -179,6 +179,7 @@ describe('XY Chart', () => {
|
|||||||
axisLineWidth: 5
|
axisLineWidth: 5
|
||||||
chartOrientation: horizontal
|
chartOrientation: horizontal
|
||||||
plotReservedSpacePercent: 60
|
plotReservedSpacePercent: 60
|
||||||
|
showDataLabel: true
|
||||||
---
|
---
|
||||||
xychart-beta
|
xychart-beta
|
||||||
title "Sales Revenue"
|
title "Sales Revenue"
|
||||||
@@ -315,4 +316,516 @@ describe('XY Chart', () => {
|
|||||||
);
|
);
|
||||||
cy.get('svg');
|
cy.get('svg');
|
||||||
});
|
});
|
||||||
|
|
||||||
|
it('should render vertical bar chart with labels', () => {
|
||||||
|
imgSnapshotTest(
|
||||||
|
`
|
||||||
|
---
|
||||||
|
config:
|
||||||
|
xyChart:
|
||||||
|
showDataLabel: true
|
||||||
|
---
|
||||||
|
xychart-beta
|
||||||
|
title "Sales Revenue"
|
||||||
|
x-axis Months [jan, feb, mar, apr, may, jun, jul, aug, sep, oct, nov, dec]
|
||||||
|
y-axis "Revenue (in $)" 4000 --> 11000
|
||||||
|
bar [5000, 6000, 7500, 8200, 9500, 10500, 11000, 10200, 9200, 8500, 7000, 6000]
|
||||||
|
`,
|
||||||
|
{}
|
||||||
|
);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should render horizontal bar chart with labels', () => {
|
||||||
|
imgSnapshotTest(
|
||||||
|
`
|
||||||
|
---
|
||||||
|
config:
|
||||||
|
xyChart:
|
||||||
|
showDataLabel: true
|
||||||
|
chartOrientation: horizontal
|
||||||
|
---
|
||||||
|
xychart-beta
|
||||||
|
title "Sales Revenue"
|
||||||
|
x-axis Months [jan, feb, mar, apr, may, jun, jul, aug, sep, oct, nov, dec]
|
||||||
|
y-axis "Revenue (in $)" 4000 --> 11000
|
||||||
|
bar [5000, 6000, 7500, 8200, 9500, 10500, 11000, 10200, 9200, 8500, 7000, 6000]
|
||||||
|
`,
|
||||||
|
{}
|
||||||
|
);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should render vertical bar chart without labels by default', () => {
|
||||||
|
imgSnapshotTest(
|
||||||
|
`
|
||||||
|
xychart-beta
|
||||||
|
title "Sales Revenue"
|
||||||
|
x-axis Months [jan, feb, mar, apr, may, jun, jul, aug, sep, oct, nov, dec]
|
||||||
|
y-axis "Revenue (in $)" 4000 --> 11000
|
||||||
|
bar [5000, 6000, 7500, 8200, 9500, 10500, 11000, 10200, 9200, 8500, 7000, 6000]
|
||||||
|
`,
|
||||||
|
{}
|
||||||
|
);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should render horizontal bar chart without labels by default', () => {
|
||||||
|
imgSnapshotTest(
|
||||||
|
`
|
||||||
|
---
|
||||||
|
config:
|
||||||
|
xyChart:
|
||||||
|
chartOrientation: horizontal
|
||||||
|
---
|
||||||
|
xychart-beta
|
||||||
|
title "Sales Revenue"
|
||||||
|
x-axis Months [jan, feb, mar, apr, may, jun, jul, aug, sep, oct, nov, dec]
|
||||||
|
y-axis "Revenue (in $)" 4000 --> 11000
|
||||||
|
bar [5000, 6000, 7500, 8200, 9500, 10500, 11000, 10200, 9200, 8500, 7000, 6000]
|
||||||
|
`,
|
||||||
|
{}
|
||||||
|
);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should render multiple bar plots vertically with labels correctly', () => {
|
||||||
|
imgSnapshotTest(
|
||||||
|
`
|
||||||
|
---
|
||||||
|
config:
|
||||||
|
xyChart:
|
||||||
|
showDataLabel: true
|
||||||
|
---
|
||||||
|
xychart-beta
|
||||||
|
title "Multiple Bar Plots"
|
||||||
|
x-axis Categories [A, B, C]
|
||||||
|
y-axis "Values" 0 --> 100
|
||||||
|
bar [10, 50, 90]
|
||||||
|
`,
|
||||||
|
{}
|
||||||
|
);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should render multiple bar plots horizontally with labels correctly', () => {
|
||||||
|
imgSnapshotTest(
|
||||||
|
`
|
||||||
|
---
|
||||||
|
config:
|
||||||
|
xyChart:
|
||||||
|
showDataLabel: true
|
||||||
|
chartOrientation: horizontal
|
||||||
|
---
|
||||||
|
xychart-beta
|
||||||
|
title "Multiple Bar Plots"
|
||||||
|
x-axis Categories [A, B, C]
|
||||||
|
y-axis "Values" 0 --> 100
|
||||||
|
bar [10, 50, 90]
|
||||||
|
`,
|
||||||
|
{}
|
||||||
|
);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should render a single bar with label for a vertical xy-chart', () => {
|
||||||
|
imgSnapshotTest(
|
||||||
|
`
|
||||||
|
---
|
||||||
|
config:
|
||||||
|
xyChart:
|
||||||
|
showDataLabel: true
|
||||||
|
---
|
||||||
|
xychart-beta
|
||||||
|
title "Single Bar Chart"
|
||||||
|
x-axis Categories [A]
|
||||||
|
y-axis "Value" 0 --> 100
|
||||||
|
bar [75]
|
||||||
|
`,
|
||||||
|
{}
|
||||||
|
);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should render a single bar with label for a horizontal xy-chart', () => {
|
||||||
|
imgSnapshotTest(
|
||||||
|
`
|
||||||
|
---
|
||||||
|
config:
|
||||||
|
xyChart:
|
||||||
|
showDataLabel: true
|
||||||
|
chartOrientation: horizontal
|
||||||
|
---
|
||||||
|
xychart-beta
|
||||||
|
title "Single Bar Chart"
|
||||||
|
x-axis Categories [A]
|
||||||
|
y-axis "Value" 0 --> 100
|
||||||
|
bar [75]
|
||||||
|
`,
|
||||||
|
{}
|
||||||
|
);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should render negative and decimal values with correct labels for vertical xy-chart', () => {
|
||||||
|
imgSnapshotTest(
|
||||||
|
`
|
||||||
|
---
|
||||||
|
config:
|
||||||
|
xyChart:
|
||||||
|
showDataLabel: true
|
||||||
|
---
|
||||||
|
xychart-beta
|
||||||
|
title "Decimal and Negative Values"
|
||||||
|
x-axis Categories [A, B, C]
|
||||||
|
y-axis -10 --> 10
|
||||||
|
bar [ -2.5, 0.75, 5.1 ]
|
||||||
|
`,
|
||||||
|
{}
|
||||||
|
);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should render negative and decimal values with correct labels for horizontal xy-chart', () => {
|
||||||
|
imgSnapshotTest(
|
||||||
|
`
|
||||||
|
---
|
||||||
|
config:
|
||||||
|
xyChart:
|
||||||
|
showDataLabel: true
|
||||||
|
chartOrientation: horizontal
|
||||||
|
---
|
||||||
|
xychart-beta
|
||||||
|
title "Decimal and Negative Values"
|
||||||
|
x-axis Categories [A, B, C]
|
||||||
|
y-axis -10 --> 10
|
||||||
|
bar [ -2.5, 0.75, 5.1 ]
|
||||||
|
`,
|
||||||
|
{}
|
||||||
|
);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should render data labels within each bar in the vertical xy-chart', () => {
|
||||||
|
imgSnapshotTest(
|
||||||
|
`
|
||||||
|
---
|
||||||
|
config:
|
||||||
|
xyChart:
|
||||||
|
showDataLabel: true
|
||||||
|
---
|
||||||
|
xychart-beta
|
||||||
|
title "Sales Revenue"
|
||||||
|
x-axis Months [jan,b,c]
|
||||||
|
y-axis "Revenue (in $)" 4000 --> 12000
|
||||||
|
bar [5000, 6000, 7500, 8200, 9500, 10500, 11000, 10200, 9200, 8500, 7000, 6000, 3000, 2000, 500, 2000, 3000, 11000, 5000, 6000]
|
||||||
|
`,
|
||||||
|
{}
|
||||||
|
);
|
||||||
|
|
||||||
|
cy.get('g.bar-plot-0').within(() => {
|
||||||
|
cy.get('rect').each(($rect, index) => {
|
||||||
|
// Extract bar properties
|
||||||
|
const barProps = {
|
||||||
|
x: parseFloat($rect.attr('x')),
|
||||||
|
y: parseFloat($rect.attr('y')),
|
||||||
|
width: parseFloat($rect.attr('width')),
|
||||||
|
height: parseFloat($rect.attr('height')),
|
||||||
|
};
|
||||||
|
|
||||||
|
// Get the text element corresponding to this bar by index.
|
||||||
|
cy.get('text')
|
||||||
|
.eq(index)
|
||||||
|
.then(($text) => {
|
||||||
|
const bbox = $text[0].getBBox();
|
||||||
|
const textProps = {
|
||||||
|
x: bbox.x,
|
||||||
|
y: bbox.y,
|
||||||
|
width: bbox.width,
|
||||||
|
height: bbox.height,
|
||||||
|
};
|
||||||
|
|
||||||
|
// Verify that the text label is positioned within the boundaries of the bar.
|
||||||
|
expect(textProps.x).to.be.greaterThan(barProps.x);
|
||||||
|
expect(textProps.x + textProps.width).to.be.lessThan(barProps.x + barProps.width);
|
||||||
|
|
||||||
|
// Check horizontal alignment (within tolerance)
|
||||||
|
expect(textProps.x + textProps.width / 2).to.be.closeTo(
|
||||||
|
barProps.x + barProps.width / 2,
|
||||||
|
5
|
||||||
|
);
|
||||||
|
|
||||||
|
expect(textProps.y).to.be.greaterThan(barProps.y);
|
||||||
|
expect(textProps.y + textProps.height).to.be.lessThan(barProps.y + barProps.height);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should render data labels within each bar in the horizontal xy-chart', () => {
|
||||||
|
imgSnapshotTest(
|
||||||
|
`
|
||||||
|
---
|
||||||
|
config:
|
||||||
|
xyChart:
|
||||||
|
showDataLabel: true
|
||||||
|
chartOrientation: horizontal
|
||||||
|
---
|
||||||
|
xychart-beta
|
||||||
|
title "Sales Revenue"
|
||||||
|
x-axis Months [jan,b,c]
|
||||||
|
y-axis "Revenue (in $)" 4000 --> 12000
|
||||||
|
bar [5000, 6000, 7500, 8200, 9500, 10500, 11000, 10200, 9200, 8500, 7000, 6000, 3000, 2000, 500, 2000, 3000, 11000, 5000, 6000]
|
||||||
|
`,
|
||||||
|
{}
|
||||||
|
);
|
||||||
|
|
||||||
|
cy.get('g.bar-plot-0').within(() => {
|
||||||
|
cy.get('rect').each(($rect, index) => {
|
||||||
|
// Extract bar properties
|
||||||
|
const barProps = {
|
||||||
|
x: parseFloat($rect.attr('x')),
|
||||||
|
y: parseFloat($rect.attr('y')),
|
||||||
|
width: parseFloat($rect.attr('width')),
|
||||||
|
height: parseFloat($rect.attr('height')),
|
||||||
|
};
|
||||||
|
|
||||||
|
// Get the text element corresponding to this bar by index.
|
||||||
|
cy.get('text')
|
||||||
|
.eq(index)
|
||||||
|
.then(($text) => {
|
||||||
|
const bbox = $text[0].getBBox();
|
||||||
|
const textProps = {
|
||||||
|
x: bbox.x,
|
||||||
|
y: bbox.y,
|
||||||
|
width: bbox.width,
|
||||||
|
height: bbox.height,
|
||||||
|
};
|
||||||
|
|
||||||
|
// Verify that the text label is positioned within the boundaries of the bar.
|
||||||
|
expect(textProps.x).to.be.greaterThan(barProps.x);
|
||||||
|
expect(textProps.x + textProps.width).to.be.lessThan(barProps.x + barProps.width);
|
||||||
|
|
||||||
|
expect(textProps.y).to.be.greaterThan(barProps.y);
|
||||||
|
expect(textProps.y + textProps.height).to.be.lessThan(barProps.y + barProps.height);
|
||||||
|
expect(textProps.y + textProps.height / 2).to.be.closeTo(
|
||||||
|
barProps.y + barProps.height / 2,
|
||||||
|
5
|
||||||
|
);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should render data labels within each bar in the vertical xy-chart with a lot of bars of different sizes', () => {
|
||||||
|
imgSnapshotTest(
|
||||||
|
`
|
||||||
|
---
|
||||||
|
config:
|
||||||
|
xyChart:
|
||||||
|
showDataLabel: true
|
||||||
|
---
|
||||||
|
xychart-beta
|
||||||
|
title "Sales Revenue"
|
||||||
|
x-axis Months [jan,a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s]
|
||||||
|
y-axis "Revenue (in $)" 4000 --> 12000
|
||||||
|
bar [5000, 6000, 7500, 8200, 9500, 10500, 11000, 10200, 9200, 8500, 7000, 6000, 8000, 10000, 5000, 7600, 4999,11000 ,5000,6000]
|
||||||
|
`,
|
||||||
|
{}
|
||||||
|
);
|
||||||
|
|
||||||
|
cy.get('g.bar-plot-0').within(() => {
|
||||||
|
cy.get('rect').each(($rect, index) => {
|
||||||
|
// Extract bar properties
|
||||||
|
const barProps = {
|
||||||
|
x: parseFloat($rect.attr('x')),
|
||||||
|
y: parseFloat($rect.attr('y')),
|
||||||
|
width: parseFloat($rect.attr('width')),
|
||||||
|
height: parseFloat($rect.attr('height')),
|
||||||
|
};
|
||||||
|
|
||||||
|
// Get the text element corresponding to this bar by index.
|
||||||
|
cy.get('text')
|
||||||
|
.eq(index)
|
||||||
|
.then(($text) => {
|
||||||
|
const bbox = $text[0].getBBox();
|
||||||
|
const textProps = {
|
||||||
|
x: bbox.x,
|
||||||
|
y: bbox.y,
|
||||||
|
width: bbox.width,
|
||||||
|
height: bbox.height,
|
||||||
|
};
|
||||||
|
|
||||||
|
// Verify that the text label is positioned within the boundaries of the bar.
|
||||||
|
expect(textProps.x).to.be.greaterThan(barProps.x);
|
||||||
|
expect(textProps.x + textProps.width).to.be.lessThan(barProps.x + barProps.width);
|
||||||
|
|
||||||
|
// Check horizontal alignment (within tolerance)
|
||||||
|
expect(textProps.x + textProps.width / 2).to.be.closeTo(
|
||||||
|
barProps.x + barProps.width / 2,
|
||||||
|
5
|
||||||
|
);
|
||||||
|
|
||||||
|
expect(textProps.y).to.be.greaterThan(barProps.y);
|
||||||
|
expect(textProps.y + textProps.height).to.be.lessThan(barProps.y + barProps.height);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should render data labels within each bar in the horizontal xy-chart with a lot of bars of different sizes', () => {
|
||||||
|
imgSnapshotTest(
|
||||||
|
`
|
||||||
|
---
|
||||||
|
config:
|
||||||
|
xyChart:
|
||||||
|
showDataLabel: true
|
||||||
|
chartOrientation: horizontal
|
||||||
|
---
|
||||||
|
xychart-beta
|
||||||
|
title "Sales Revenue"
|
||||||
|
x-axis Months [jan,a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s]
|
||||||
|
y-axis "Revenue (in $)" 4000 --> 12000
|
||||||
|
bar [5000, 6000, 7500, 8200, 9500, 10500, 11000, 10200, 9200, 8500, 7000, 6000, 8000, 10000, 5000, 7600, 4999,11000 ,5000,6000]
|
||||||
|
`,
|
||||||
|
{}
|
||||||
|
);
|
||||||
|
|
||||||
|
cy.get('g.bar-plot-0').within(() => {
|
||||||
|
cy.get('rect').each(($rect, index) => {
|
||||||
|
// Extract bar properties
|
||||||
|
const barProps = {
|
||||||
|
x: parseFloat($rect.attr('x')),
|
||||||
|
y: parseFloat($rect.attr('y')),
|
||||||
|
width: parseFloat($rect.attr('width')),
|
||||||
|
height: parseFloat($rect.attr('height')),
|
||||||
|
};
|
||||||
|
|
||||||
|
// Get the text element corresponding to this bar by index.
|
||||||
|
cy.get('text')
|
||||||
|
.eq(index)
|
||||||
|
.then(($text) => {
|
||||||
|
const bbox = $text[0].getBBox();
|
||||||
|
const textProps = {
|
||||||
|
x: bbox.x,
|
||||||
|
y: bbox.y,
|
||||||
|
width: bbox.width,
|
||||||
|
height: bbox.height,
|
||||||
|
};
|
||||||
|
|
||||||
|
// Verify that the text label is positioned within the boundaries of the bar.
|
||||||
|
expect(textProps.x).to.be.greaterThan(barProps.x);
|
||||||
|
expect(textProps.x + textProps.width).to.be.lessThan(barProps.x + barProps.width);
|
||||||
|
|
||||||
|
expect(textProps.y).to.be.greaterThan(barProps.y);
|
||||||
|
expect(textProps.y + textProps.height).to.be.lessThan(barProps.y + barProps.height);
|
||||||
|
expect(textProps.y + textProps.height / 2).to.be.closeTo(
|
||||||
|
barProps.y + barProps.height / 2,
|
||||||
|
5
|
||||||
|
);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should render data labels correctly for a bar in the vertical xy-chart', () => {
|
||||||
|
imgSnapshotTest(
|
||||||
|
`
|
||||||
|
---
|
||||||
|
config:
|
||||||
|
xyChart:
|
||||||
|
showDataLabel: true
|
||||||
|
---
|
||||||
|
xychart-beta
|
||||||
|
title "Sales Revenue"
|
||||||
|
x-axis Months [jan]
|
||||||
|
y-axis "Revenue (in $)" 3000 --> 12000
|
||||||
|
bar [4000]
|
||||||
|
`,
|
||||||
|
{}
|
||||||
|
);
|
||||||
|
|
||||||
|
cy.get('g.bar-plot-0').within(() => {
|
||||||
|
cy.get('rect').each(($rect, index) => {
|
||||||
|
// Extract bar properties
|
||||||
|
const barProps = {
|
||||||
|
x: parseFloat($rect.attr('x')),
|
||||||
|
y: parseFloat($rect.attr('y')),
|
||||||
|
width: parseFloat($rect.attr('width')),
|
||||||
|
height: parseFloat($rect.attr('height')),
|
||||||
|
};
|
||||||
|
|
||||||
|
// Get the text element corresponding to this bar by index.
|
||||||
|
cy.get('text')
|
||||||
|
.eq(index)
|
||||||
|
.then(($text) => {
|
||||||
|
const bbox = $text[0].getBBox();
|
||||||
|
const textProps = {
|
||||||
|
x: bbox.x,
|
||||||
|
y: bbox.y,
|
||||||
|
width: bbox.width,
|
||||||
|
height: bbox.height,
|
||||||
|
};
|
||||||
|
|
||||||
|
// Verify that the text label is positioned within the boundaries of the bar.
|
||||||
|
expect(textProps.x).to.be.greaterThan(barProps.x);
|
||||||
|
expect(textProps.x + textProps.width).to.be.lessThan(barProps.x + barProps.width);
|
||||||
|
|
||||||
|
// Check horizontal alignment (within tolerance)
|
||||||
|
expect(textProps.x + textProps.width / 2).to.be.closeTo(
|
||||||
|
barProps.x + barProps.width / 2,
|
||||||
|
5
|
||||||
|
);
|
||||||
|
|
||||||
|
expect(textProps.y).to.be.greaterThan(barProps.y);
|
||||||
|
expect(textProps.y + textProps.height).to.be.lessThan(barProps.y + barProps.height);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should render data labels correctly for a bar in the horizontal xy-chart', () => {
|
||||||
|
imgSnapshotTest(
|
||||||
|
`
|
||||||
|
---
|
||||||
|
config:
|
||||||
|
xyChart:
|
||||||
|
showDataLabel: true
|
||||||
|
chartOrientation: horizontal
|
||||||
|
---
|
||||||
|
xychart-beta
|
||||||
|
title "Sales Revenue"
|
||||||
|
x-axis Months [jan]
|
||||||
|
y-axis "Revenue (in $)" 3000 --> 12000
|
||||||
|
bar [4000]
|
||||||
|
`,
|
||||||
|
{}
|
||||||
|
);
|
||||||
|
|
||||||
|
cy.get('g.bar-plot-0').within(() => {
|
||||||
|
cy.get('rect').each(($rect, index) => {
|
||||||
|
// Extract bar properties
|
||||||
|
const barProps = {
|
||||||
|
x: parseFloat($rect.attr('x')),
|
||||||
|
y: parseFloat($rect.attr('y')),
|
||||||
|
width: parseFloat($rect.attr('width')),
|
||||||
|
height: parseFloat($rect.attr('height')),
|
||||||
|
};
|
||||||
|
|
||||||
|
// Get the text element corresponding to this bar by index.
|
||||||
|
cy.get('text')
|
||||||
|
.eq(index)
|
||||||
|
.then(($text) => {
|
||||||
|
const bbox = $text[0].getBBox();
|
||||||
|
const textProps = {
|
||||||
|
x: bbox.x,
|
||||||
|
y: bbox.y,
|
||||||
|
width: bbox.width,
|
||||||
|
height: bbox.height,
|
||||||
|
};
|
||||||
|
|
||||||
|
// Verify that the text label is positioned within the boundaries of the bar.
|
||||||
|
expect(textProps.x).to.be.greaterThan(barProps.x);
|
||||||
|
expect(textProps.x + textProps.width).to.be.lessThan(barProps.x + barProps.width);
|
||||||
|
|
||||||
|
expect(textProps.y).to.be.greaterThan(barProps.y);
|
||||||
|
expect(textProps.y + textProps.height).to.be.lessThan(barProps.y + barProps.height);
|
||||||
|
expect(textProps.y + textProps.height / 2).to.be.closeTo(
|
||||||
|
barProps.y + barProps.height / 2,
|
||||||
|
5
|
||||||
|
);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
});
|
});
|
||||||
|
@@ -60,7 +60,7 @@
|
|||||||
<pre id="diagram" class="mermaid2">
|
<pre id="diagram" class="mermaid2">
|
||||||
timeline
|
timeline
|
||||||
title My day
|
title My day
|
||||||
section section with no tasks
|
section Section with no tasks
|
||||||
section Go to work at the dog office
|
section Go to work at the dog office
|
||||||
1930 : first step : second step is a long step
|
1930 : first step : second step is a long step
|
||||||
: third step
|
: third step
|
||||||
@@ -70,18 +70,18 @@
|
|||||||
1960 : India fights poverty, looses war to China and gets nuclear weapons from USA and USSR
|
1960 : India fights poverty, looses war to China and gets nuclear weapons from USA and USSR
|
||||||
1970 : Green Revolution comes to india
|
1970 : Green Revolution comes to india
|
||||||
section Another section with no tasks
|
section Another section with no tasks
|
||||||
I am a big big big tasks
|
I am a very, very big task
|
||||||
I am not so big tasks
|
I am not so big task
|
||||||
</pre>
|
</pre>
|
||||||
<pre id="diagram" class="mermaid">
|
<pre id="diagram" class="mermaid">
|
||||||
timeline
|
timeline
|
||||||
title MermaidChart 2023 Timeline
|
title MermaidChart 2023 Timeline
|
||||||
section 2023 Q1 <br> Release Personal Tier
|
section 2023 Q1 <br> Release Personal Tier
|
||||||
Buttet 1 : sub-point 1a : sub-point 1b
|
Bullet 1 : sub-point 1a : sub-point 1b
|
||||||
: sub-point 1c
|
: sub-point 1c
|
||||||
Bullet 2 : sub-point 2a : sub-point 2b
|
Bullet 2 : sub-point 2a : sub-point 2b
|
||||||
section 2023 Q2 <br> Release XYZ Tier
|
section 2023 Q2 <br> Release XYZ Tier
|
||||||
Buttet 3 : sub-point <br> 3a : sub-point 3b
|
Bullet 3 : sub-point <br> 3a : sub-point 3b
|
||||||
: sub-point 3c
|
: sub-point 3c
|
||||||
Bullet 4 : sub-point 4a : sub-point 4b
|
Bullet 4 : sub-point 4a : sub-point 4b
|
||||||
|
|
||||||
@@ -93,7 +93,7 @@
|
|||||||
section Stone Age
|
section Stone Age
|
||||||
7600 BC : Britain's oldest known house was built in Orkney, Scotland
|
7600 BC : Britain's oldest known house was built in Orkney, Scotland
|
||||||
6000 BC : Sea levels rise and Britain becomes an island. The people who live here are hunter-gatherers.
|
6000 BC : Sea levels rise and Britain becomes an island. The people who live here are hunter-gatherers.
|
||||||
section Broze Age
|
section Bronze Age
|
||||||
2300 BC : People arrive from Europe and settle in Britain. They bring farming and metalworking.
|
2300 BC : People arrive from Europe and settle in Britain. They bring farming and metalworking.
|
||||||
: New styles of pottery and ways of burying the dead appear.
|
: New styles of pottery and ways of burying the dead appear.
|
||||||
2200 BC : The last major building works are completed at Stonehenge. People now bury their dead in stone circles.
|
2200 BC : The last major building works are completed at Stonehenge. People now bury their dead in stone circles.
|
||||||
@@ -106,7 +106,7 @@
|
|||||||
title History of Social Media Platform
|
title History of Social Media Platform
|
||||||
2002 : LinkedIn
|
2002 : LinkedIn
|
||||||
2004 : Facebook : Google : Pixar
|
2004 : Facebook : Google : Pixar
|
||||||
2005 : Youtube
|
2005 : YouTube
|
||||||
2006 : Twitter
|
2006 : Twitter
|
||||||
2007 : Tumblr
|
2007 : Tumblr
|
||||||
2008s : Instagram
|
2008s : Instagram
|
||||||
@@ -122,7 +122,7 @@
|
|||||||
title History of Social Media Platform
|
title History of Social Media Platform
|
||||||
2002 : LinkedIn
|
2002 : LinkedIn
|
||||||
2004 : Facebook : Google : Pixar
|
2004 : Facebook : Google : Pixar
|
||||||
2005 : Youtube
|
2005 : YouTube
|
||||||
2006 : Twitter
|
2006 : Twitter
|
||||||
2007 : Tumblr
|
2007 : Tumblr
|
||||||
2008s : Instagram
|
2008s : Instagram
|
||||||
@@ -139,7 +139,7 @@
|
|||||||
title History of Social Media Platform
|
title History of Social Media Platform
|
||||||
2002 : LinkedIn
|
2002 : LinkedIn
|
||||||
2004 : Facebook : Google
|
2004 : Facebook : Google
|
||||||
2005 : Youtube
|
2005 : YouTube
|
||||||
2006 : Twitter
|
2006 : Twitter
|
||||||
2007 : Tumblr
|
2007 : Tumblr
|
||||||
2008 : Instagram
|
2008 : Instagram
|
||||||
@@ -152,7 +152,7 @@
|
|||||||
title History of Social Media Platform
|
title History of Social Media Platform
|
||||||
2002 : LinkedIn
|
2002 : LinkedIn
|
||||||
2004 : Facebook : Google
|
2004 : Facebook : Google
|
||||||
2005 : Youtube
|
2005 : YouTube
|
||||||
2006 : Twitter
|
2006 : Twitter
|
||||||
2007 : Tumblr
|
2007 : Tumblr
|
||||||
2008s : Instagram
|
2008s : Instagram
|
||||||
|
@@ -37,7 +37,7 @@
|
|||||||
+String owner
|
+String owner
|
||||||
+BigDecimal balance
|
+BigDecimal balance
|
||||||
+deposit(amount) bool
|
+deposit(amount) bool
|
||||||
+withdrawl(amount) int
|
+withdrawal(amount) int
|
||||||
}
|
}
|
||||||
cssClass "BankAccount" customCss
|
cssClass "BankAccount" customCss
|
||||||
|
|
||||||
@@ -56,7 +56,7 @@ classE o-- classF : aggregation
|
|||||||
+String owner
|
+String owner
|
||||||
+BigDecimal balance
|
+BigDecimal balance
|
||||||
+deposit(amount) bool
|
+deposit(amount) bool
|
||||||
+withdrawl(amount) int
|
+withdrawal(amount) int
|
||||||
}
|
}
|
||||||
Class01~T~ <|-- AveryLongClass : Cool
|
Class01~T~ <|-- AveryLongClass : Cool
|
||||||
Class03~T~ *-- Class04~T~
|
Class03~T~ *-- Class04~T~
|
||||||
|
@@ -77,7 +77,7 @@
|
|||||||
|
|
||||||
document.getElementsByTagName('body')[0].appendChild(div);
|
document.getElementsByTagName('body')[0].appendChild(div);
|
||||||
}
|
}
|
||||||
mermaid.initialize({ startOnLoad: true, securityLevel: 'strct', logLevel: 1 });
|
mermaid.initialize({ startOnLoad: true, securityLevel: 'strict_', logLevel: 1 });
|
||||||
</script>
|
</script>
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
|
@@ -31,7 +31,7 @@
|
|||||||
flowchart BT subgraph S1 sub1 -->sub2 end subgraph S2 sub4 end S1 --> S2 sub1 --> sub4
|
flowchart BT subgraph S1 sub1 -->sub2 end subgraph S2 sub4 end S1 --> S2 sub1 --> sub4
|
||||||
</div>
|
</div>
|
||||||
<div class="mermaid2" style="width: 50%; height: 200px">
|
<div class="mermaid2" style="width: 50%; height: 200px">
|
||||||
sequenceDiagram Alice->>Bob:Extremely utterly long line of longness which had preivously
|
sequenceDiagram Alice->>Bob:Extremely utterly long line of longness which had previously
|
||||||
overflown the actor box as it is much longer than what it should be Bob->>Alice: I'm short
|
overflown the actor box as it is much longer than what it should be Bob->>Alice: I'm short
|
||||||
though
|
though
|
||||||
</div>
|
</div>
|
||||||
@@ -61,9 +61,9 @@
|
|||||||
#quot;elit#quot;."}}
|
#quot;elit#quot;."}}
|
||||||
</div>
|
</div>
|
||||||
<div class="mermaid2" style="width: 50%; height: 50%">
|
<div class="mermaid2" style="width: 50%; height: 50%">
|
||||||
flowchart TB internet nat routeur lb1 lb2 compute1 compute2 subgraph project routeur nat
|
flowchart TB internet nat router lb1 lb2 compute1 compute2 subgraph project router nat
|
||||||
subgraph subnet1 compute1 lb1 end subgraph subnet2 compute2 lb2 end end internet --> routeur
|
subgraph subnet1 compute1 lb1 end subgraph subnet2 compute2 lb2 end end internet --> router
|
||||||
routeur --> subnet1 & subnet2 subnet1 & subnet2 --> nat --> internet
|
router --> subnet1 & subnet2 subnet1 & subnet2 --> nat --> internet
|
||||||
</div>
|
</div>
|
||||||
<div class="mermaid2" style="width: 50%; height: 50%">
|
<div class="mermaid2" style="width: 50%; height: 50%">
|
||||||
flowchart TD subgraph one[One] subgraph sub_one[Sub One] _sub_one end end subgraph two[Two]
|
flowchart TD subgraph one[One] subgraph sub_one[Sub One] _sub_one end end subgraph two[Two]
|
||||||
|
@@ -7,7 +7,7 @@
|
|||||||
rel="stylesheet"
|
rel="stylesheet"
|
||||||
/>
|
/>
|
||||||
<style>
|
<style>
|
||||||
svg {
|
svg:not(svg svg) {
|
||||||
border: 2px solid darkred;
|
border: 2px solid darkred;
|
||||||
}
|
}
|
||||||
.exClass2 > rect,
|
.exClass2 > rect,
|
||||||
|
@@ -38,7 +38,7 @@
|
|||||||
+String owner
|
+String owner
|
||||||
+BigDecimal balance
|
+BigDecimal balance
|
||||||
+deposit(amount) bool
|
+deposit(amount) bool
|
||||||
+withdrawl(amount) int
|
+withdrawal(amount) int
|
||||||
}
|
}
|
||||||
cssClass "BankAccount" customCss
|
cssClass "BankAccount" customCss
|
||||||
</pre>
|
</pre>
|
||||||
|
601
cypress/platform/ipsepcola_sample.html
Normal file
601
cypress/platform/ipsepcola_sample.html
Normal file
@@ -0,0 +1,601 @@
|
|||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<link href="https://fonts.googleapis.com/css?family=Montserrat&display=swap" rel="stylesheet" />
|
||||||
|
<link href="https://unpkg.com/tailwindcss@^1.0/dist/tailwind.min.css" rel="stylesheet" />
|
||||||
|
<link
|
||||||
|
rel="stylesheet"
|
||||||
|
href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.7.2/css/font-awesome.min.css"
|
||||||
|
/>
|
||||||
|
<link
|
||||||
|
href="https://cdn.jsdelivr.net/npm/@mdi/font@6.9.96/css/materialdesignicons.min.css"
|
||||||
|
rel="stylesheet"
|
||||||
|
/>
|
||||||
|
<link
|
||||||
|
href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.7.2/css/all.min.css"
|
||||||
|
rel="stylesheet"
|
||||||
|
/>
|
||||||
|
<link
|
||||||
|
href="https://fonts.googleapis.com/css?family=Noto+Sans+SC&display=swap"
|
||||||
|
rel="stylesheet"
|
||||||
|
/>
|
||||||
|
<link rel="preconnect" href="https://fonts.googleapis.com" />
|
||||||
|
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin />
|
||||||
|
<link
|
||||||
|
href="https://fonts.googleapis.com/css2?family=Kalam:wght@300;400;700&display=swap"
|
||||||
|
rel="stylesheet"
|
||||||
|
/>
|
||||||
|
<link
|
||||||
|
href="https://fonts.googleapis.com/css2?family=Caveat:wght@400..700&family=Kalam:wght@300;400;700&family=Rubik+Mono+One&display=swap"
|
||||||
|
rel="stylesheet"
|
||||||
|
/>
|
||||||
|
<link
|
||||||
|
href="https://fonts.googleapis.com/css2?family=Kalam:wght@300;400;700&family=Rubik+Mono+One&display=swap"
|
||||||
|
rel="stylesheet"
|
||||||
|
/>
|
||||||
|
|
||||||
|
<style>
|
||||||
|
body {
|
||||||
|
/* background: #333; */
|
||||||
|
font-family: 'Arial';
|
||||||
|
}
|
||||||
|
|
||||||
|
h1 {
|
||||||
|
color: grey;
|
||||||
|
}
|
||||||
|
|
||||||
|
.mermaid2 {
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
svg {
|
||||||
|
border: 3px solid #300;
|
||||||
|
margin: 10px;
|
||||||
|
}
|
||||||
|
|
||||||
|
pre {
|
||||||
|
width: 100%;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
</head>
|
||||||
|
|
||||||
|
<body>
|
||||||
|
<pre id="diagram4" class="mermaid">
|
||||||
|
flowchart
|
||||||
|
A --> B
|
||||||
|
subgraph hello
|
||||||
|
C --> D
|
||||||
|
end
|
||||||
|
</pre
|
||||||
|
>
|
||||||
|
|
||||||
|
<pre id="diagram4" class="mermaid">
|
||||||
|
flowchart
|
||||||
|
A --> B
|
||||||
|
A --> B
|
||||||
|
</pre
|
||||||
|
>
|
||||||
|
<pre id="diagram4" class="mermaid">
|
||||||
|
flowchart
|
||||||
|
A[hello] --> A
|
||||||
|
</pre
|
||||||
|
>
|
||||||
|
|
||||||
|
<pre id="diagram4" class="mermaid">
|
||||||
|
flowchart
|
||||||
|
subgraph C
|
||||||
|
c
|
||||||
|
end
|
||||||
|
A --> C
|
||||||
|
</pre
|
||||||
|
>
|
||||||
|
<pre id="diagram4" class="mermaid">
|
||||||
|
flowchart
|
||||||
|
subgraph C
|
||||||
|
c
|
||||||
|
end
|
||||||
|
A --> c
|
||||||
|
</pre
|
||||||
|
>
|
||||||
|
|
||||||
|
<pre id="diagram4" class="mermaid">
|
||||||
|
flowchart TD
|
||||||
|
subgraph D
|
||||||
|
A --> B
|
||||||
|
A --> B
|
||||||
|
B --> A
|
||||||
|
B --> A
|
||||||
|
end
|
||||||
|
</pre
|
||||||
|
>
|
||||||
|
<pre id="diagram4" class="mermaid">
|
||||||
|
flowchart
|
||||||
|
subgraph B2
|
||||||
|
A --> B --> C
|
||||||
|
B --> D
|
||||||
|
end
|
||||||
|
|
||||||
|
B2 --> X
|
||||||
|
</pre
|
||||||
|
>
|
||||||
|
<pre id="diagram4" class="mermaid">
|
||||||
|
stateDiagram-v2
|
||||||
|
[*] --> Still
|
||||||
|
Still --> [*]
|
||||||
|
Still --> Moving
|
||||||
|
Moving --> Still
|
||||||
|
Moving --> Crash
|
||||||
|
Crash --> [*]
|
||||||
|
</pre
|
||||||
|
>
|
||||||
|
|
||||||
|
<pre id="diagram4" class="mermaid">
|
||||||
|
classDiagram
|
||||||
|
Animal <|-- Duck
|
||||||
|
Animal <|-- Fish
|
||||||
|
Animal <|-- Zebra
|
||||||
|
Animal : +int age
|
||||||
|
Animal : +String gender
|
||||||
|
Animal: +isMammal()
|
||||||
|
Animal: +mate()
|
||||||
|
class Duck{
|
||||||
|
+String beakColor
|
||||||
|
+swim()
|
||||||
|
+quack()
|
||||||
|
}
|
||||||
|
class Fish{
|
||||||
|
-int sizeInFeet
|
||||||
|
-canEat()
|
||||||
|
}
|
||||||
|
class Zebra{
|
||||||
|
+bool is_wild
|
||||||
|
+run()
|
||||||
|
}
|
||||||
|
</pre
|
||||||
|
>
|
||||||
|
<pre id="diagram4" class="mermaid">
|
||||||
|
flowchart TD
|
||||||
|
P1
|
||||||
|
P1 -->P1.5
|
||||||
|
subgraph P1.5
|
||||||
|
P2
|
||||||
|
P2.5(( A ))
|
||||||
|
P3
|
||||||
|
end
|
||||||
|
P2 --> P4
|
||||||
|
P3 --> P6
|
||||||
|
P1.5 --> P5
|
||||||
|
</pre>
|
||||||
|
<pre id="diagram4" class="mermaid">
|
||||||
|
%% Length of edges
|
||||||
|
flowchart TD
|
||||||
|
L1 --- L2
|
||||||
|
L2 --- C
|
||||||
|
M1 ---> C
|
||||||
|
R1 .-> R2
|
||||||
|
R2 <.-> C
|
||||||
|
C -->|Label 1| E1
|
||||||
|
C <-- Label 2 ---> E2
|
||||||
|
C ----> E3
|
||||||
|
C <-...-> E4
|
||||||
|
C ======> E5
|
||||||
|
</pre>
|
||||||
|
<pre id="diagram4" class="mermaid">
|
||||||
|
%% Stadium shape
|
||||||
|
flowchart TD
|
||||||
|
A([stadium shape test])
|
||||||
|
A -->|Get money| B([Go shopping])
|
||||||
|
B --> C([Let me think...<br />Do I want something for work,<br />something to spend every free second with,<br />or something to get around?])
|
||||||
|
C -->|One| D([Laptop])
|
||||||
|
C -->|Two| E([iPhone])
|
||||||
|
C -->|Three| F([Car<br/>wroom wroom])
|
||||||
|
click A "index.html#link-clicked" "link test"
|
||||||
|
click B testClick "click test"
|
||||||
|
classDef someclass fill:#f96;
|
||||||
|
class A someclass;
|
||||||
|
class C someclass;
|
||||||
|
</pre>
|
||||||
|
|
||||||
|
<pre id="diagram4" class="mermaid">
|
||||||
|
%% should render escaped without html labels
|
||||||
|
flowchart TD
|
||||||
|
a["<strong>Haiya</strong>"]---->b
|
||||||
|
</pre>
|
||||||
|
<pre id="diagram4" class="mermaid">
|
||||||
|
%% nested subgraphs in reverse order
|
||||||
|
flowchart LR
|
||||||
|
a -->b
|
||||||
|
subgraph A
|
||||||
|
B
|
||||||
|
end
|
||||||
|
subgraph B
|
||||||
|
b
|
||||||
|
end
|
||||||
|
</pre>
|
||||||
|
<pre id="diagram4" class="mermaid">
|
||||||
|
%% nested subgraphs in several levels
|
||||||
|
flowchart LR
|
||||||
|
b-->B
|
||||||
|
a-->c
|
||||||
|
subgraph O
|
||||||
|
A
|
||||||
|
end
|
||||||
|
subgraph B
|
||||||
|
c
|
||||||
|
end
|
||||||
|
subgraph A
|
||||||
|
a
|
||||||
|
b
|
||||||
|
B
|
||||||
|
end
|
||||||
|
</pre>
|
||||||
|
<pre id="diagram4" class="mermaid">
|
||||||
|
%% nested subgraphs with edges in and out
|
||||||
|
flowchart LR
|
||||||
|
internet
|
||||||
|
nat
|
||||||
|
routeur
|
||||||
|
lb1
|
||||||
|
lb2
|
||||||
|
compute1
|
||||||
|
compute2
|
||||||
|
subgraph project
|
||||||
|
routeur
|
||||||
|
nat
|
||||||
|
subgraph subnet1
|
||||||
|
compute1
|
||||||
|
lb1
|
||||||
|
end
|
||||||
|
subgraph subnet2
|
||||||
|
compute2
|
||||||
|
lb2
|
||||||
|
end
|
||||||
|
end
|
||||||
|
internet --> routeur
|
||||||
|
routeur --> subnet1 & subnet2
|
||||||
|
subnet1 & subnet2 --> nat --> internet
|
||||||
|
</pre>
|
||||||
|
<pre id="diagram4" class="mermaid">
|
||||||
|
%% nested subgraphs with outgoing links
|
||||||
|
flowchart LR
|
||||||
|
subgraph main
|
||||||
|
subgraph subcontainer
|
||||||
|
subcontainer-child
|
||||||
|
end
|
||||||
|
subcontainer-child--> subcontainer-sibling
|
||||||
|
end
|
||||||
|
</pre>
|
||||||
|
<pre id="diagram4" class="mermaid">
|
||||||
|
%% nested subgraphs with ingoing links
|
||||||
|
flowchart LR
|
||||||
|
subgraph one[One]
|
||||||
|
subgraph sub_one[Sub One]
|
||||||
|
_sub_one
|
||||||
|
end
|
||||||
|
subgraph sub_two[Sub Two]
|
||||||
|
_sub_two
|
||||||
|
end
|
||||||
|
_one
|
||||||
|
end
|
||||||
|
|
||||||
|
%% here, either the first or the second one
|
||||||
|
sub_one --> sub_two
|
||||||
|
_one --> b
|
||||||
|
</pre>
|
||||||
|
<pre id="diagram4" class="mermaid">
|
||||||
|
%% nested subgraphs with outgoing links 3
|
||||||
|
flowchart LR
|
||||||
|
subgraph container_Beta
|
||||||
|
process_C-->Process_D
|
||||||
|
end
|
||||||
|
subgraph container_Alpha
|
||||||
|
process_A-->process_B
|
||||||
|
process_A-->|messages|process_C
|
||||||
|
end
|
||||||
|
process_B-->|via_AWSBatch|container_Beta
|
||||||
|
</pre>
|
||||||
|
<pre id="diagram4" class="mermaid">
|
||||||
|
%% nested subgraphs with outgoing links 4
|
||||||
|
flowchart LR
|
||||||
|
subgraph A
|
||||||
|
a -->b
|
||||||
|
end
|
||||||
|
subgraph B
|
||||||
|
b
|
||||||
|
end
|
||||||
|
</pre>
|
||||||
|
<pre id="diagram4" class="mermaid">
|
||||||
|
%% nested subgraphs with outgoing links 2
|
||||||
|
flowchart LR
|
||||||
|
c1-->a2
|
||||||
|
subgraph one
|
||||||
|
a1-->a2
|
||||||
|
end
|
||||||
|
subgraph two
|
||||||
|
b1-->b2
|
||||||
|
end
|
||||||
|
subgraph three
|
||||||
|
c1-->c2
|
||||||
|
end
|
||||||
|
one --> two
|
||||||
|
three --> two
|
||||||
|
two --> c2
|
||||||
|
</pre>
|
||||||
|
<pre id="diagram4" class="mermaid">
|
||||||
|
%% nested subgraphs with outgoing links 5
|
||||||
|
flowchart LR
|
||||||
|
subgraph container_Beta
|
||||||
|
process_C-->Process_D
|
||||||
|
end
|
||||||
|
subgraph container_Alpha
|
||||||
|
process_A-->process_B
|
||||||
|
process_B-->|via_AWSBatch|container_Beta
|
||||||
|
process_A-->|messages|process_C
|
||||||
|
end
|
||||||
|
</pre>
|
||||||
|
<pre id="diagram4" class="mermaid">
|
||||||
|
%% More subgraphs
|
||||||
|
flowchart LR
|
||||||
|
subgraph two
|
||||||
|
b1
|
||||||
|
end
|
||||||
|
subgraph three
|
||||||
|
c2
|
||||||
|
end
|
||||||
|
|
||||||
|
three --> two
|
||||||
|
two --> c2
|
||||||
|
note[There are two links in this diagram]
|
||||||
|
</pre>
|
||||||
|
<pre id="diagram4" class="mermaid">
|
||||||
|
%% nested subgraphs with outgoing links 5
|
||||||
|
flowchart LR
|
||||||
|
A[red text] -->|default style| B(blue text)
|
||||||
|
C([red text]) -->|default style| D[[blue text]]
|
||||||
|
E[(red text)] -->|default style| F((blue text))
|
||||||
|
G>red text] -->|default style| H{blue text}
|
||||||
|
I{{red text}} -->|default style| J[/blue text/]
|
||||||
|
K[\\ red text\\] -->|default style| L[/blue text\\]
|
||||||
|
M[\\ red text/] -->|default style| N[blue text];
|
||||||
|
O(((red text))) -->|default style| P(((blue text)));
|
||||||
|
linkStyle default color:Sienna;
|
||||||
|
style A stroke:#ff0000,fill:#ffcccc,color:#ff0000;
|
||||||
|
style B stroke:#0000ff,fill:#ccccff,color:#0000ff;
|
||||||
|
style C stroke:#ff0000,fill:#ffcccc,color:#ff0000;
|
||||||
|
style D stroke:#0000ff,fill:#ccccff,color:#0000ff;
|
||||||
|
style E stroke:#ff0000,fill:#ffcccc,color:#ff0000;
|
||||||
|
style F stroke:#0000ff,fill:#ccccff,color:#0000ff;
|
||||||
|
style G stroke:#ff0000,fill:#ffcccc,color:#ff0000;
|
||||||
|
style H stroke:#0000ff,fill:#ccccff,color:#0000ff;
|
||||||
|
style I stroke:#ff0000,fill:#ffcccc,color:#ff0000;
|
||||||
|
style J stroke:#0000ff,fill:#ccccff,color:#0000ff;
|
||||||
|
style K stroke:#ff0000,fill:#ffcccc,color:#ff0000;
|
||||||
|
style L stroke:#0000ff,fill:#ccccff,color:#0000ff;
|
||||||
|
style M stroke:#ff0000,fill:#ffcccc,color:#ff0000;
|
||||||
|
style N stroke:#0000ff,fill:#ccccff,color:#0000ff;
|
||||||
|
style O stroke:#ff0000,fill:#ffcccc,color:#ff0000;
|
||||||
|
style P stroke:#0000ff,fill:#ccccff,color:#0000ff;
|
||||||
|
</pre>
|
||||||
|
<pre id="diagram4" class="mermaid">
|
||||||
|
%% labels on edges in a cluster
|
||||||
|
flowchart RL
|
||||||
|
subgraph one
|
||||||
|
a1 -- I am a long label --> a2
|
||||||
|
a1 -- Another long label --> a2
|
||||||
|
end
|
||||||
|
</pre>
|
||||||
|
<pre id="diagram4" class="mermaid">
|
||||||
|
%% labels on edges in a cluster
|
||||||
|
flowchart RL
|
||||||
|
subgraph one
|
||||||
|
a1[Iam a node with a super long label] -- I am a long label --> a2[I am another node with a mega long label]
|
||||||
|
a1 -- Another long label --> a2
|
||||||
|
a3 --> a1 & a2 & a3 & a4
|
||||||
|
a1 --> a4
|
||||||
|
end
|
||||||
|
</pre>
|
||||||
|
<pre id="diagram4" class="mermaid">
|
||||||
|
%% labels on edges in a cluster
|
||||||
|
flowchart RL
|
||||||
|
subgraph one
|
||||||
|
a1[Iam a node with a super long label]
|
||||||
|
a2[I am another node with a mega long label]
|
||||||
|
a3[I am a node with a super long label]
|
||||||
|
a4[I am another node with a mega long label]
|
||||||
|
a1 -- Another long label --> a2
|
||||||
|
a3 --> a1 & a2 & a3 & a4
|
||||||
|
a1 --> a4
|
||||||
|
end
|
||||||
|
</pre>
|
||||||
|
<pre id="diagram4" class="mermaid">
|
||||||
|
%% labels on edges in a cluster
|
||||||
|
flowchart RL
|
||||||
|
a1[I am a node with a super long label. I am a node with a super long label. I am a node with a super long label. I am a node with a super long label. I am a node with a super long label. ]
|
||||||
|
a2[I am another node with a mega long label]
|
||||||
|
a3[I am a node with a super long label]
|
||||||
|
a4[I am another node with a mega long label]
|
||||||
|
a1 & a2 & a3 & a4 --> a5 & a6 & a7 & a8 & a9 & a10
|
||||||
|
|
||||||
|
</pre>
|
||||||
|
<pre id="diagram4" class="mermaid">
|
||||||
|
flowchart
|
||||||
|
subgraph Z
|
||||||
|
subgraph X
|
||||||
|
a --> b
|
||||||
|
end
|
||||||
|
subgraph Y
|
||||||
|
c --> d
|
||||||
|
end
|
||||||
|
end
|
||||||
|
Y --> X
|
||||||
|
X --> P
|
||||||
|
P --> Y
|
||||||
|
|
||||||
|
</pre
|
||||||
|
>
|
||||||
|
<pre id="diagram4" class="mermaid">
|
||||||
|
flowchart
|
||||||
|
|
||||||
|
a --> b
|
||||||
|
b --> c
|
||||||
|
b --> d
|
||||||
|
c --> a
|
||||||
|
|
||||||
|
</pre
|
||||||
|
>
|
||||||
|
|
||||||
|
<pre id="diagram3" class="mermaid">
|
||||||
|
flowchart TD
|
||||||
|
Start([Start]) --> Prep[Preparation Step]
|
||||||
|
Prep --> Split{Ready to Process?}
|
||||||
|
Split -->|Yes| T1[Task A]
|
||||||
|
Split -->|Yes| T2[Task B]
|
||||||
|
T1 --> Merge
|
||||||
|
T2 --> Merge
|
||||||
|
Merge((Join Results)) --> Finalize[Finalize Process]
|
||||||
|
Finalize --> End([End])
|
||||||
|
</pre
|
||||||
|
>
|
||||||
|
<pre id="diagram4" class="mermaid">
|
||||||
|
flowchart TD
|
||||||
|
A[Start Build] --> B[Compile Source]
|
||||||
|
B --> C[Test Suite]
|
||||||
|
C --> D{Tests Passed?}
|
||||||
|
D -->|No| E[Notify Developer]
|
||||||
|
E --> A
|
||||||
|
D -->|Yes| F[Build Docker Image]
|
||||||
|
|
||||||
|
subgraph Deploy Pipeline
|
||||||
|
F --> G[Deploy to Staging]
|
||||||
|
G --> H[Run Integration Tests]
|
||||||
|
H --> I{Tests Passed?}
|
||||||
|
I -->|No| J[Rollback & Alert]
|
||||||
|
I -->|Yes| K[Deploy to Production]
|
||||||
|
end
|
||||||
|
|
||||||
|
K --> L([Success])
|
||||||
|
</pre
|
||||||
|
>
|
||||||
|
|
||||||
|
<pre class="mermaid">
|
||||||
|
classDiagram
|
||||||
|
class Controller {
|
||||||
|
+handleRequest(): void
|
||||||
|
}
|
||||||
|
|
||||||
|
class View {
|
||||||
|
+render(): void
|
||||||
|
}
|
||||||
|
|
||||||
|
class Model {
|
||||||
|
+getData(): any
|
||||||
|
+setData(data: any): void
|
||||||
|
}
|
||||||
|
|
||||||
|
Controller --> Model
|
||||||
|
Controller --> View
|
||||||
|
Model --> View : notifyChange()
|
||||||
|
</pre
|
||||||
|
>
|
||||||
|
|
||||||
|
<pre class="mermaid">
|
||||||
|
classDiagram
|
||||||
|
class AuthService {
|
||||||
|
+login(username: string, password: string): boolean
|
||||||
|
+logout(): void
|
||||||
|
+register(): void
|
||||||
|
}
|
||||||
|
|
||||||
|
class User {
|
||||||
|
-username: string
|
||||||
|
-password: string
|
||||||
|
-role: Role
|
||||||
|
+changePassword(): void
|
||||||
|
}
|
||||||
|
|
||||||
|
class Role {
|
||||||
|
-name: string
|
||||||
|
-permissions: string[]
|
||||||
|
+hasPermission(): boolean
|
||||||
|
}
|
||||||
|
|
||||||
|
AuthService --> User
|
||||||
|
User --> Role
|
||||||
|
</pre
|
||||||
|
>
|
||||||
|
|
||||||
|
<script type="module">
|
||||||
|
import mermaid from './mermaid.esm.mjs';
|
||||||
|
import layouts from './mermaid-layout-elk.esm.mjs';
|
||||||
|
|
||||||
|
const staticBellIconPack = {
|
||||||
|
prefix: 'fa6-regular',
|
||||||
|
icons: {
|
||||||
|
bell: {
|
||||||
|
body: '<path fill="currentColor" d="M224 0c-17.7 0-32 14.3-32 32v19.2C119 66 64 130.6 64 208v25.4c0 45.4-15.5 89.5-43.8 124.9L5.3 377c-5.8 7.2-6.9 17.1-2.9 25.4S14.8 416 24 416h400c9.2 0 17.6-5.3 21.6-13.6s2.9-18.2-2.9-25.4l-14.9-18.6c-28.3-35.5-43.8-79.6-43.8-125V208c0-77.4-55-142-128-156.8V32c0-17.7-14.3-32-32-32m0 96c61.9 0 112 50.1 112 112v25.4c0 47.9 13.9 94.6 39.7 134.6H72.3c25.8-40 39.7-86.7 39.7-134.6V208c0-61.9 50.1-112 112-112m64 352H160c0 17 6.7 33.3 18.7 45.3S207 512 224 512s33.3-6.7 45.3-18.7S288 465 288 448"/>',
|
||||||
|
width: 448,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
width: 512,
|
||||||
|
height: 512,
|
||||||
|
};
|
||||||
|
|
||||||
|
mermaid.registerIconPacks([
|
||||||
|
{
|
||||||
|
name: 'logos',
|
||||||
|
loader: () =>
|
||||||
|
fetch('https://unpkg.com/@iconify-json/logos@1/icons.json').then((res) => res.json()),
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: 'fa',
|
||||||
|
loader: () => staticBellIconPack,
|
||||||
|
},
|
||||||
|
]);
|
||||||
|
mermaid.registerLayoutLoaders(layouts);
|
||||||
|
mermaid.parseError = function (err, hash) {
|
||||||
|
console.error('Mermaid error: ', err);
|
||||||
|
};
|
||||||
|
window.callback = function () {
|
||||||
|
alert('A callback was triggered');
|
||||||
|
};
|
||||||
|
function callback() {
|
||||||
|
alert('It worked');
|
||||||
|
}
|
||||||
|
await mermaid.initialize({
|
||||||
|
theme: 'redux-dark',
|
||||||
|
// theme: 'default',
|
||||||
|
// theme: 'forest',
|
||||||
|
handDrawnSeed: 12,
|
||||||
|
look: 'classic ',
|
||||||
|
// 'elk.nodePlacement.strategy': 'NETWORK_SIMPLEX',
|
||||||
|
// layout: 'dagre',
|
||||||
|
layout: 'ipsepCola',
|
||||||
|
// layout: 'elk',
|
||||||
|
// layout: 'sugiyama',
|
||||||
|
// htmlLabels: false,
|
||||||
|
flowchart: { titleTopMargin: 10 },
|
||||||
|
|
||||||
|
// fontFamily: 'Caveat',
|
||||||
|
// fontFamily: 'Kalam',
|
||||||
|
// fontFamily: 'courier',
|
||||||
|
fontFamily: 'arial',
|
||||||
|
sequence: {
|
||||||
|
actorFontFamily: 'courier',
|
||||||
|
noteFontFamily: 'courier',
|
||||||
|
messageFontFamily: 'courier',
|
||||||
|
},
|
||||||
|
kanban: {
|
||||||
|
htmlLabels: false,
|
||||||
|
},
|
||||||
|
fontSize: 12,
|
||||||
|
logLevel: 0,
|
||||||
|
securityLevel: 'loose',
|
||||||
|
callback,
|
||||||
|
});
|
||||||
|
|
||||||
|
mermaid.parseError = function (err, hash) {
|
||||||
|
console.error('In parse error:');
|
||||||
|
console.error(err);
|
||||||
|
};
|
||||||
|
</script>
|
||||||
|
</body>
|
||||||
|
</html>
|
@@ -32,8 +32,26 @@
|
|||||||
href="https://fonts.googleapis.com/css2?family=Kalam:wght@300;400;700&family=Rubik+Mono+One&display=swap"
|
href="https://fonts.googleapis.com/css2?family=Kalam:wght@300;400;700&family=Rubik+Mono+One&display=swap"
|
||||||
rel="stylesheet"
|
rel="stylesheet"
|
||||||
/>
|
/>
|
||||||
|
<link rel="preconnect" href="https://fonts.googleapis.com" />
|
||||||
|
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin />
|
||||||
|
<link
|
||||||
|
href="https://fonts.googleapis.com/css2?family=Recursive:wght@300..1000&display=swap"
|
||||||
|
rel="stylesheet"
|
||||||
|
/>
|
||||||
|
|
||||||
<style>
|
<style>
|
||||||
|
.recursive-mermaid {
|
||||||
|
font-family: 'Recursive', sans-serif;
|
||||||
|
font-optical-sizing: auto;
|
||||||
|
font-weight: 500;
|
||||||
|
font-style: normal;
|
||||||
|
font-variation-settings:
|
||||||
|
'slnt' 0,
|
||||||
|
'CASL' 0,
|
||||||
|
'CRSV' 0.5,
|
||||||
|
'MONO' 0;
|
||||||
|
}
|
||||||
|
|
||||||
body {
|
body {
|
||||||
/* background: rgb(221, 208, 208); */
|
/* background: rgb(221, 208, 208); */
|
||||||
/* background: #333; */
|
/* background: #333; */
|
||||||
@@ -45,7 +63,9 @@
|
|||||||
h1 {
|
h1 {
|
||||||
color: grey;
|
color: grey;
|
||||||
}
|
}
|
||||||
|
.mermaid {
|
||||||
|
border: 1px solid red;
|
||||||
|
}
|
||||||
.mermaid2 {
|
.mermaid2 {
|
||||||
display: none;
|
display: none;
|
||||||
}
|
}
|
||||||
@@ -83,6 +103,11 @@
|
|||||||
width: 100%;
|
width: 100%;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.class2 {
|
||||||
|
fill: red;
|
||||||
|
fill-opacity: 1;
|
||||||
|
}
|
||||||
|
|
||||||
/* tspan {
|
/* tspan {
|
||||||
font-size: 6px !important;
|
font-size: 6px !important;
|
||||||
} */
|
} */
|
||||||
@@ -106,19 +131,63 @@
|
|||||||
|
|
||||||
<body>
|
<body>
|
||||||
<pre id="diagram4" class="mermaid">
|
<pre id="diagram4" class="mermaid">
|
||||||
|
treemap
|
||||||
|
"Section 1"
|
||||||
|
"Leaf 1.1": 12
|
||||||
|
"Section 1.2":::class1
|
||||||
|
"Leaf 1.2.1": 12
|
||||||
|
"Section 2"
|
||||||
|
"Leaf 2.1": 20:::class1
|
||||||
|
"Leaf 2.2": 25
|
||||||
|
"Leaf 2.3": 12
|
||||||
|
|
||||||
|
classDef class1 fill:red,color:blue,stroke:#FFD600;
|
||||||
|
|
||||||
|
|
||||||
|
</pre
|
||||||
|
>
|
||||||
|
<pre id="diagram4" class="mermaid2">
|
||||||
|
---
|
||||||
|
config:
|
||||||
|
treemap:
|
||||||
|
valueFormat: '$0,0'
|
||||||
|
---
|
||||||
|
treemap
|
||||||
|
"Budget"
|
||||||
|
"Operations"
|
||||||
|
"Salaries": 7000
|
||||||
|
"Equipment": 2000
|
||||||
|
"Supplies": 1000
|
||||||
|
"Marketing"
|
||||||
|
"Advertising": 4000
|
||||||
|
"Events": 1000
|
||||||
|
|
||||||
|
</pre
|
||||||
|
>
|
||||||
|
<pre id="diagram4" class="mermaid">
|
||||||
|
treemap
|
||||||
|
title Accessible Treemap Title
|
||||||
|
"Category A"
|
||||||
|
"Item A1": 10
|
||||||
|
"Item A2": 20
|
||||||
|
"Category B"
|
||||||
|
"Item B1": 15
|
||||||
|
"Item B2": 25
|
||||||
|
</pre>
|
||||||
|
<pre id="diagram4" class="mermaid2">
|
||||||
flowchart LR
|
flowchart LR
|
||||||
AB["apa@apa@"] --> B(("`apa@apa`"))
|
AB["apa@apa@"] --> B(("`apa@apa`"))
|
||||||
</pre>
|
</pre>
|
||||||
<pre id="diagram4" class="mermaid">
|
<pre id="diagram4" class="mermaid2">
|
||||||
flowchart
|
flowchart
|
||||||
D(("for D"))
|
D(("for D"))
|
||||||
</pre>
|
</pre>
|
||||||
<pre id="diagram4" class="mermaid">
|
<pre id="diagram4" class="mermaid2">
|
||||||
flowchart LR
|
flowchart LR
|
||||||
A e1@==> B
|
A e1@==> B
|
||||||
e1@{ animate: true}
|
e1@{ animate: true}
|
||||||
</pre>
|
</pre>
|
||||||
<pre id="diagram4" class="mermaid">
|
<pre id="diagram4" class="mermaid2">
|
||||||
flowchart LR
|
flowchart LR
|
||||||
A e1@--> B
|
A e1@--> B
|
||||||
classDef animate stroke-width:2,stroke-dasharray:10\,8,stroke-dashoffset:-180,animation: edge-animation-frame 6s linear infinite, stroke-linecap: round
|
classDef animate stroke-width:2,stroke-dasharray:10\,8,stroke-dashoffset:-180,animation: edge-animation-frame 6s linear infinite, stroke-linecap: round
|
||||||
@@ -386,7 +455,7 @@ kanban
|
|||||||
[Create Documentation]
|
[Create Documentation]
|
||||||
docs[Create Blog about the new diagram]
|
docs[Create Blog about the new diagram]
|
||||||
id7[In progress]
|
id7[In progress]
|
||||||
id6[Create renderer so that it works in all cases. We also add som extra text here for testing purposes. And some more just for the extra flare.]
|
id6[Create renderer so that it works in all cases. We also add some extra text here for testing purposes. And some more just for the extra flare.]
|
||||||
id9[Ready for deploy]
|
id9[Ready for deploy]
|
||||||
id8[Design grammar]@{ assigned: 'knsv' }
|
id8[Design grammar]@{ assigned: 'knsv' }
|
||||||
id10[Ready for test]
|
id10[Ready for test]
|
||||||
@@ -438,7 +507,7 @@ kanban
|
|||||||
alert('It worked');
|
alert('It worked');
|
||||||
}
|
}
|
||||||
await mermaid.initialize({
|
await mermaid.initialize({
|
||||||
// theme: 'base',
|
// theme: 'forest',
|
||||||
// theme: 'default',
|
// theme: 'default',
|
||||||
// theme: 'forest',
|
// theme: 'forest',
|
||||||
// handDrawnSeed: 12,
|
// handDrawnSeed: 12,
|
||||||
@@ -449,11 +518,7 @@ kanban
|
|||||||
// layout: 'fixed',
|
// layout: 'fixed',
|
||||||
// htmlLabels: false,
|
// htmlLabels: false,
|
||||||
flowchart: { titleTopMargin: 10 },
|
flowchart: { titleTopMargin: 10 },
|
||||||
|
fontFamily: "'Recursive', sans-serif",
|
||||||
// fontFamily: 'Caveat',
|
|
||||||
// fontFamily: 'Kalam',
|
|
||||||
// fontFamily: 'courier',
|
|
||||||
fontFamily: 'arial',
|
|
||||||
sequence: {
|
sequence: {
|
||||||
actorFontFamily: 'courier',
|
actorFontFamily: 'courier',
|
||||||
noteFontFamily: 'courier',
|
noteFontFamily: 'courier',
|
||||||
|
@@ -14,12 +14,28 @@ function markRendered() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function loadFontAwesomeCSS() {
|
||||||
|
const link = document.createElement('link');
|
||||||
|
link.rel = 'stylesheet';
|
||||||
|
link.href = 'https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.7.2/css/all.min.css';
|
||||||
|
|
||||||
|
document.head.appendChild(link);
|
||||||
|
|
||||||
|
return new Promise((resolve, reject) => {
|
||||||
|
link.onload = resolve;
|
||||||
|
link.onerror = () => reject(new Error('Failed to load FontAwesome'));
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* ##contentLoaded Callback function that is called when page is loaded. This functions fetches
|
* ##contentLoaded Callback function that is called when page is loaded. This functions fetches
|
||||||
* configuration for mermaid rendering and calls init for rendering the mermaid diagrams on the
|
* configuration for mermaid rendering and calls init for rendering the mermaid diagrams on the
|
||||||
* page.
|
* page.
|
||||||
*/
|
*/
|
||||||
const contentLoaded = async function () {
|
const contentLoaded = async function () {
|
||||||
|
await loadFontAwesomeCSS();
|
||||||
|
await Promise.all(Array.from(document.fonts, (font) => font.load()));
|
||||||
|
|
||||||
let pos = document.location.href.indexOf('?graph=');
|
let pos = document.location.href.indexOf('?graph=');
|
||||||
if (pos > 0) {
|
if (pos > 0) {
|
||||||
pos = pos + 7;
|
pos = pos + 7;
|
||||||
@@ -50,8 +66,13 @@ const contentLoaded = async function () {
|
|||||||
|
|
||||||
mermaid.registerLayoutLoaders(layouts);
|
mermaid.registerLayoutLoaders(layouts);
|
||||||
mermaid.initialize(graphObj.mermaid);
|
mermaid.initialize(graphObj.mermaid);
|
||||||
|
/**
|
||||||
|
* CC-BY-4.0
|
||||||
|
* Copyright (c) Fonticons, Inc. - https://fontawesome.com/license/free
|
||||||
|
* https://fontawesome.com/icons/bell?f=classic&s=regular
|
||||||
|
*/
|
||||||
const staticBellIconPack = {
|
const staticBellIconPack = {
|
||||||
prefix: 'fa6-regular',
|
prefix: 'fa',
|
||||||
icons: {
|
icons: {
|
||||||
bell: {
|
bell: {
|
||||||
body: '<path fill="currentColor" d="M224 0c-17.7 0-32 14.3-32 32v19.2C119 66 64 130.6 64 208v25.4c0 45.4-15.5 89.5-43.8 124.9L5.3 377c-5.8 7.2-6.9 17.1-2.9 25.4S14.8 416 24 416h400c9.2 0 17.6-5.3 21.6-13.6s2.9-18.2-2.9-25.4l-14.9-18.6c-28.3-35.5-43.8-79.6-43.8-125V208c0-77.4-55-142-128-156.8V32c0-17.7-14.3-32-32-32m0 96c61.9 0 112 50.1 112 112v25.4c0 47.9 13.9 94.6 39.7 134.6H72.3c25.8-40 39.7-86.7 39.7-134.6V208c0-61.9 50.1-112 112-112m64 352H160c0 17 6.7 33.3 18.7 45.3S207 512 224 512s33.3-6.7 45.3-18.7S288 465 288 448"/>',
|
body: '<path fill="currentColor" d="M224 0c-17.7 0-32 14.3-32 32v19.2C119 66 64 130.6 64 208v25.4c0 45.4-15.5 89.5-43.8 124.9L5.3 377c-5.8 7.2-6.9 17.1-2.9 25.4S14.8 416 24 416h400c9.2 0 17.6-5.3 21.6-13.6s2.9-18.2-2.9-25.4l-14.9-18.6c-28.3-35.5-43.8-79.6-43.8-125V208c0-77.4-55-142-128-156.8V32c0-17.7-14.3-32-32-32m0 96c61.9 0 112 50.1 112 112v25.4c0 47.9 13.9 94.6 39.7 134.6H72.3c25.8-40 39.7-86.7 39.7-134.6V208c0-61.9 50.1-112 112-112m64 352H160c0 17 6.7 33.3 18.7 45.3S207 512 224 512s33.3-6.7 45.3-18.7S288 465 288 448"/>',
|
||||||
|
@@ -105,7 +105,7 @@
|
|||||||
let diagram = 'graph LR\n';
|
let diagram = 'graph LR\n';
|
||||||
diagram += " B(<a href='<";
|
diagram += " B(<a href='<";
|
||||||
diagram += 'script></';
|
diagram += 'script></';
|
||||||
diagram += "script>Javascript:xssAttack`1`'>Click)";
|
diagram += "script>JavaScript:xssAttack`1`'>Click)";
|
||||||
// diagram += "script\u003aalert\u0028document.domain\u0029\` src=x>\"\);\n";
|
// diagram += "script\u003aalert\u0028document.domain\u0029\` src=x>\"\);\n";
|
||||||
console.log(diagram);
|
console.log(diagram);
|
||||||
// document.querySelector('#diagram').innerHTML = diagram;
|
// document.querySelector('#diagram').innerHTML = diagram;
|
||||||
|
@@ -50,7 +50,7 @@
|
|||||||
setPoints(List~int~ points)
|
setPoints(List~int~ points)
|
||||||
getPoints() List~int~
|
getPoints() List~int~
|
||||||
}
|
}
|
||||||
|
|
||||||
Square : -List~string~ messages
|
Square : -List~string~ messages
|
||||||
Square : +setMessages(List~string~ messages)
|
Square : +setMessages(List~string~ messages)
|
||||||
Square : +getMessages() List~string~
|
Square : +getMessages() List~string~
|
||||||
@@ -88,7 +88,7 @@
|
|||||||
---
|
---
|
||||||
classDiagram
|
classDiagram
|
||||||
class Duck {
|
class Duck {
|
||||||
|
|
||||||
}
|
}
|
||||||
</pre>
|
</pre>
|
||||||
</div>
|
</div>
|
||||||
@@ -127,8 +127,8 @@
|
|||||||
-attribute:type
|
-attribute:type
|
||||||
- attribute : type
|
- attribute : type
|
||||||
test
|
test
|
||||||
|
|
||||||
+ GetAttribute() type
|
+ GetAttribute() type
|
||||||
+ GetAttribute() type
|
+ GetAttribute() type
|
||||||
}
|
}
|
||||||
</pre>
|
</pre>
|
||||||
@@ -449,7 +449,7 @@
|
|||||||
---
|
---
|
||||||
config:
|
config:
|
||||||
theme: forest
|
theme: forest
|
||||||
look: handDrawns
|
look: handDrawn
|
||||||
layout: elk
|
layout: elk
|
||||||
---
|
---
|
||||||
classDiagram
|
classDiagram
|
||||||
|
@@ -41,7 +41,7 @@
|
|||||||
|
|
||||||
CAR:::someclass
|
CAR:::someclass
|
||||||
PERSON:::anotherclass,someclass
|
PERSON:::anotherclass,someclass
|
||||||
|
|
||||||
classDef someclass fill:#f96
|
classDef someclass fill:#f96
|
||||||
classDef anotherclass color:blue
|
classDef anotherclass color:blue
|
||||||
</pre>
|
</pre>
|
||||||
@@ -90,7 +90,7 @@
|
|||||||
erDiagram
|
erDiagram
|
||||||
CAR ||--o{ NAMED-DRIVER : allows
|
CAR ||--o{ NAMED-DRIVER : allows
|
||||||
CAR {
|
CAR {
|
||||||
test test PK "comment"
|
text text PK "comment"
|
||||||
string make
|
string make
|
||||||
string model
|
string model
|
||||||
string[] parts
|
string[] parts
|
||||||
@@ -108,7 +108,7 @@
|
|||||||
string carRegistrationNumber PK, FK
|
string carRegistrationNumber PK, FK
|
||||||
string driverLicence PK, FK
|
string driverLicence PK, FK
|
||||||
}
|
}
|
||||||
MANUFACTURER only one to zero or more CAR : makes
|
MANUFACTURER only one to zero or more CAR : makes
|
||||||
</pre>
|
</pre>
|
||||||
</div>
|
</div>
|
||||||
<div class="test">
|
<div class="test">
|
||||||
@@ -129,7 +129,7 @@
|
|||||||
string email
|
string email
|
||||||
}
|
}
|
||||||
p ||--o| a : has
|
p ||--o| a : has
|
||||||
|
|
||||||
</pre>
|
</pre>
|
||||||
</div>
|
</div>
|
||||||
<div class="test">
|
<div class="test">
|
||||||
|
@@ -2,151 +2,219 @@
|
|||||||
"durations": [
|
"durations": [
|
||||||
{
|
{
|
||||||
"spec": "cypress/integration/other/configuration.spec.js",
|
"spec": "cypress/integration/other/configuration.spec.js",
|
||||||
"duration": 4989
|
"duration": 5672
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"spec": "cypress/integration/other/external-diagrams.spec.js",
|
"spec": "cypress/integration/other/external-diagrams.spec.js",
|
||||||
"duration": 1382
|
"duration": 1990
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"spec": "cypress/integration/other/ghsa.spec.js",
|
"spec": "cypress/integration/other/ghsa.spec.js",
|
||||||
"duration": 3178
|
"duration": 3186
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"spec": "cypress/integration/other/iife.spec.js",
|
"spec": "cypress/integration/other/iife.spec.js",
|
||||||
"duration": 1372
|
"duration": 1948
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"spec": "cypress/integration/other/interaction.spec.js",
|
"spec": "cypress/integration/other/interaction.spec.js",
|
||||||
"duration": 8998
|
"duration": 11938
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"spec": "cypress/integration/other/rerender.spec.js",
|
"spec": "cypress/integration/other/rerender.spec.js",
|
||||||
"duration": 1249
|
"duration": 1932
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"spec": "cypress/integration/other/xss.spec.js",
|
"spec": "cypress/integration/other/xss.spec.js",
|
||||||
"duration": 25664
|
"duration": 27237
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"spec": "cypress/integration/rendering/appli.spec.js",
|
"spec": "cypress/integration/rendering/appli.spec.js",
|
||||||
"duration": 1928
|
"duration": 3170
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"spec": "cypress/integration/rendering/architecture.spec.ts",
|
"spec": "cypress/integration/rendering/architecture.spec.ts",
|
||||||
"duration": 2330
|
"duration": 104
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"spec": "cypress/integration/rendering/block.spec.js",
|
"spec": "cypress/integration/rendering/block.spec.js",
|
||||||
"duration": 11156
|
"duration": 17390
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"spec": "cypress/integration/rendering/c4.spec.js",
|
"spec": "cypress/integration/rendering/c4.spec.js",
|
||||||
"duration": 3418
|
"duration": 5296
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"spec": "cypress/integration/rendering/classDiagram-elk-v3.spec.js",
|
||||||
|
"duration": 39004
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"spec": "cypress/integration/rendering/classDiagram-handDrawn-v3.spec.js",
|
||||||
|
"duration": 37653
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"spec": "cypress/integration/rendering/classDiagram-v2.spec.js",
|
"spec": "cypress/integration/rendering/classDiagram-v2.spec.js",
|
||||||
"duration": 14866
|
"duration": 23278
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"spec": "cypress/integration/rendering/classDiagram-v3.spec.js",
|
||||||
|
"duration": 36645
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"spec": "cypress/integration/rendering/classDiagram.spec.js",
|
"spec": "cypress/integration/rendering/classDiagram.spec.js",
|
||||||
"duration": 9894
|
"duration": 15418
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"spec": "cypress/integration/rendering/conf-and-directives.spec.js",
|
"spec": "cypress/integration/rendering/conf-and-directives.spec.js",
|
||||||
"duration": 5778
|
"duration": 9684
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"spec": "cypress/integration/rendering/current.spec.js",
|
"spec": "cypress/integration/rendering/current.spec.js",
|
||||||
"duration": 1690
|
"duration": 2570
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"spec": "cypress/integration/rendering/erDiagram-unified.spec.js",
|
||||||
|
"duration": 84687
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"spec": "cypress/integration/rendering/erDiagram.spec.js",
|
"spec": "cypress/integration/rendering/erDiagram.spec.js",
|
||||||
"duration": 9144
|
"duration": 14819
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"spec": "cypress/integration/rendering/errorDiagram.spec.js",
|
"spec": "cypress/integration/rendering/errorDiagram.spec.js",
|
||||||
"duration": 1951
|
"duration": 3371
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"spec": "cypress/integration/rendering/flowchart-elk.spec.js",
|
"spec": "cypress/integration/rendering/flowchart-elk.spec.js",
|
||||||
"duration": 2196
|
"duration": 39925
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"spec": "cypress/integration/rendering/flowchart-handDrawn.spec.js",
|
"spec": "cypress/integration/rendering/flowchart-handDrawn.spec.js",
|
||||||
"duration": 21029
|
"duration": 34694
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"spec": "cypress/integration/rendering/flowchart-icon.spec.js",
|
||||||
|
"duration": 7137
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"spec": "cypress/integration/rendering/flowchart-shape-alias.spec.ts",
|
"spec": "cypress/integration/rendering/flowchart-shape-alias.spec.ts",
|
||||||
"duration": 16087
|
"duration": 24740
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"spec": "cypress/integration/rendering/flowchart-v2.spec.js",
|
"spec": "cypress/integration/rendering/flowchart-v2.spec.js",
|
||||||
"duration": 27465
|
"duration": 42077
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"spec": "cypress/integration/rendering/flowchart.spec.js",
|
"spec": "cypress/integration/rendering/flowchart.spec.js",
|
||||||
"duration": 20035
|
"duration": 30642
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"spec": "cypress/integration/rendering/gantt.spec.js",
|
"spec": "cypress/integration/rendering/gantt.spec.js",
|
||||||
"duration": 11366
|
"duration": 18085
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"spec": "cypress/integration/rendering/gitGraph.spec.js",
|
"spec": "cypress/integration/rendering/gitGraph.spec.js",
|
||||||
"duration": 34025
|
"duration": 50107
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"spec": "cypress/integration/rendering/iconShape.spec.ts",
|
"spec": "cypress/integration/rendering/iconShape.spec.ts",
|
||||||
"duration": 185902
|
"duration": 276279
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"spec": "cypress/integration/rendering/imageShape.spec.ts",
|
"spec": "cypress/integration/rendering/imageShape.spec.ts",
|
||||||
"duration": 41631
|
"duration": 56505
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"spec": "cypress/integration/rendering/info.spec.ts",
|
"spec": "cypress/integration/rendering/info.spec.ts",
|
||||||
"duration": 1736
|
"duration": 3036
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"spec": "cypress/integration/rendering/journey.spec.js",
|
"spec": "cypress/integration/rendering/journey.spec.js",
|
||||||
"duration": 2247
|
"duration": 6889
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"spec": "cypress/integration/rendering/kanban.spec.ts",
|
||||||
|
"duration": 7353
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"spec": "cypress/integration/rendering/katex.spec.js",
|
"spec": "cypress/integration/rendering/katex.spec.js",
|
||||||
"duration": 2144
|
"duration": 3580
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"spec": "cypress/integration/rendering/marker_unique_id.spec.js",
|
"spec": "cypress/integration/rendering/marker_unique_id.spec.js",
|
||||||
"duration": 1646
|
"duration": 2508
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"spec": "cypress/integration/rendering/mindmap.spec.ts",
|
"spec": "cypress/integration/rendering/mindmap.spec.ts",
|
||||||
"duration": 6406
|
"duration": 10939
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"spec": "cypress/integration/rendering/newShapes.spec.ts",
|
"spec": "cypress/integration/rendering/newShapes.spec.ts",
|
||||||
"duration": 107219
|
"duration": 149102
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"spec": "cypress/integration/rendering/oldShapes.spec.ts",
|
||||||
|
"duration": 113987
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"spec": "cypress/integration/rendering/packet.spec.ts",
|
||||||
|
"duration": 4060
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"spec": "cypress/integration/rendering/pie.spec.ts",
|
||||||
|
"duration": 5715
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"spec": "cypress/integration/rendering/quadrantChart.spec.js",
|
||||||
|
"duration": 8945
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"spec": "cypress/integration/rendering/radar.spec.js",
|
||||||
|
"duration": 5337
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"spec": "cypress/integration/rendering/requirement.spec.js",
|
||||||
|
"duration": 2643
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"spec": "cypress/integration/rendering/requirementDiagram-unified.spec.js",
|
||||||
|
"duration": 52072
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"spec": "cypress/integration/rendering/sankey.spec.ts",
|
||||||
|
"duration": 6692
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"spec": "cypress/integration/rendering/sequencediagram.spec.js",
|
||||||
|
"duration": 35721
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"spec": "cypress/integration/rendering/stateDiagram-v2.spec.js",
|
||||||
|
"duration": 26030
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"spec": "cypress/integration/rendering/stateDiagram.spec.js",
|
"spec": "cypress/integration/rendering/stateDiagram.spec.js",
|
||||||
"duration": 15834
|
"duration": 16333
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"spec": "cypress/integration/rendering/theme.spec.js",
|
"spec": "cypress/integration/rendering/theme.spec.js",
|
||||||
"duration": 33240
|
"duration": 29287
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"spec": "cypress/integration/rendering/timeline.spec.ts",
|
"spec": "cypress/integration/rendering/timeline.spec.ts",
|
||||||
"duration": 7122
|
"duration": 8491
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"spec": "cypress/integration/rendering/treemap.spec.ts",
|
||||||
|
"duration": 12291
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"spec": "cypress/integration/rendering/xyChart.spec.js",
|
"spec": "cypress/integration/rendering/xyChart.spec.js",
|
||||||
"duration": 11127
|
"duration": 20651
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"spec": "cypress/integration/rendering/zenuml.spec.js",
|
"spec": "cypress/integration/rendering/zenuml.spec.js",
|
||||||
"duration": 2391
|
"duration": 3218
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
@@ -110,7 +110,7 @@
|
|||||||
title Component diagram for Internet Banking System - API Application
|
title Component diagram for Internet Banking System - API Application
|
||||||
|
|
||||||
Container(spa, "Single Page Application", "javascript and angular", "Provides all the internet banking functionality to customers via their web browser.")
|
Container(spa, "Single Page Application", "javascript and angular", "Provides all the internet banking functionality to customers via their web browser.")
|
||||||
Container(ma, "Mobile App", "Xamarin", "Provides a limited subset ot the internet banking functionality to customers via their mobile mobile device.")
|
Container(ma, "Mobile App", "Xamarin", "Provides a limited subset ot the internet banking functionality to customers via their mobile device.")
|
||||||
ContainerDb(db, "Database", "Relational Database Schema", "Stores user registration information, hashed authentication credentials, access logs, etc.")
|
ContainerDb(db, "Database", "Relational Database Schema", "Stores user registration information, hashed authentication credentials, access logs, etc.")
|
||||||
System_Ext(mbs, "Mainframe Banking System", "Stores all of the core banking information about customers, accounts, transactions, etc.")
|
System_Ext(mbs, "Mainframe Banking System", "Stores all of the core banking information about customers, accounts, transactions, etc.")
|
||||||
|
|
||||||
|
@@ -148,7 +148,7 @@
|
|||||||
<pre class="mermaid">
|
<pre class="mermaid">
|
||||||
classDiagram
|
classDiagram
|
||||||
class Person {
|
class Person {
|
||||||
+Id : Guid
|
+ID : Guid
|
||||||
+FirstName : string
|
+FirstName : string
|
||||||
+LastName : string
|
+LastName : string
|
||||||
-privateProperty : string
|
-privateProperty : string
|
||||||
@@ -218,10 +218,10 @@
|
|||||||
+double side
|
+double side
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Shape <|-- Circle
|
Shape <|-- Circle
|
||||||
Shape <|-- Square
|
Shape <|-- Square
|
||||||
|
|
||||||
namespace Vehicles {
|
namespace Vehicles {
|
||||||
class Vehicle {
|
class Vehicle {
|
||||||
+String brand
|
+String brand
|
||||||
@@ -233,12 +233,12 @@
|
|||||||
+boolean hasGears
|
+boolean hasGears
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Vehicle <|-- Car
|
Vehicle <|-- Car
|
||||||
Vehicle <|-- Bike
|
Vehicle <|-- Bike
|
||||||
Car --> Circle : "Logo Shape"
|
Car --> Circle : "Logo Shape"
|
||||||
Bike --> Square : "Logo Shape"
|
Bike --> Square : "Logo Shape"
|
||||||
|
|
||||||
</pre>
|
</pre>
|
||||||
<script type="module">
|
<script type="module">
|
||||||
import mermaid from './mermaid.esm.mjs';
|
import mermaid from './mermaid.esm.mjs';
|
||||||
|
222
demos/er-multiline.html
Normal file
222
demos/er-multiline.html
Normal file
@@ -0,0 +1,222 @@
|
|||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<link href="https://fonts.googleapis.com/css?family=Montserrat&display=swap" rel="stylesheet" />
|
||||||
|
<link href="https://unpkg.com/tailwindcss@^1.0/dist/tailwind.min.css" rel="stylesheet" />
|
||||||
|
<link
|
||||||
|
rel="stylesheet"
|
||||||
|
href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.7.2/css/font-awesome.min.css"
|
||||||
|
/>
|
||||||
|
<link
|
||||||
|
href="https://cdn.jsdelivr.net/npm/@mdi/font@6.9.96/css/materialdesignicons.min.css"
|
||||||
|
rel="stylesheet"
|
||||||
|
/>
|
||||||
|
<link
|
||||||
|
href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.5.1/css/all.min.css"
|
||||||
|
rel="stylesheet"
|
||||||
|
/>
|
||||||
|
<link
|
||||||
|
href="https://fonts.googleapis.com/css?family=Noto+Sans+SC&display=swap"
|
||||||
|
rel="stylesheet"
|
||||||
|
/>
|
||||||
|
<link rel="preconnect" href="https://fonts.googleapis.com" />
|
||||||
|
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin />
|
||||||
|
<link
|
||||||
|
href="https://fonts.googleapis.com/css2?family=Kalam:wght@300;400;700&display=swap"
|
||||||
|
rel="stylesheet"
|
||||||
|
/>
|
||||||
|
<link
|
||||||
|
href="https://fonts.googleapis.com/css2?family=Caveat:wght@400..700&family=Kalam:wght@300;400;700&family=Rubik+Mono+One&display=swap"
|
||||||
|
rel="stylesheet"
|
||||||
|
/>
|
||||||
|
<link
|
||||||
|
href="https://fonts.googleapis.com/css2?family=Kalam:wght@300;400;700&family=Rubik+Mono+One&display=swap"
|
||||||
|
rel="stylesheet"
|
||||||
|
/>
|
||||||
|
<link
|
||||||
|
href="https://fonts.googleapis.com/css2?family=Recursive:wght@300..1000&display=swap"
|
||||||
|
rel="stylesheet"
|
||||||
|
/>
|
||||||
|
|
||||||
|
<style>
|
||||||
|
.recursive-500 {
|
||||||
|
font-family: 'Recursive', serif;
|
||||||
|
font-optical-sizing: auto;
|
||||||
|
font-weight: 500;
|
||||||
|
font-style: normal;
|
||||||
|
font-variation-settings:
|
||||||
|
'slnt' 0,
|
||||||
|
'CASL' 0,
|
||||||
|
'CRSV' 0.5,
|
||||||
|
'MONO' 0;
|
||||||
|
}
|
||||||
|
body {
|
||||||
|
/* background: rgb(221, 208, 208); */
|
||||||
|
/* background: #333; */
|
||||||
|
/* font-family: 'Arial'; */
|
||||||
|
font-family: 'Recursive', serif;
|
||||||
|
font-optical-sizing: auto;
|
||||||
|
font-weight: 500;
|
||||||
|
font-style: normal;
|
||||||
|
font-variation-settings:
|
||||||
|
'slnt' 0,
|
||||||
|
'CASL' 0,
|
||||||
|
'CRSV' 0.5,
|
||||||
|
'MONO' 0;
|
||||||
|
/* color: white; */
|
||||||
|
/* font-size: 18px !important; */
|
||||||
|
}
|
||||||
|
.gridify.tiny {
|
||||||
|
background-image:
|
||||||
|
linear-gradient(transparent 11px, rgba(220, 220, 200, 0.8) 12px, transparent 12px),
|
||||||
|
linear-gradient(90deg, transparent 11px, rgba(220, 220, 200, 0.8) 12px, transparent 12px);
|
||||||
|
background-size:
|
||||||
|
100% 12px,
|
||||||
|
12px 100%;
|
||||||
|
}
|
||||||
|
|
||||||
|
.gridify.dots {
|
||||||
|
background-image: radial-gradient(
|
||||||
|
circle at center,
|
||||||
|
rgba(220, 220, 200, 0.8) 1px,
|
||||||
|
transparent 1px
|
||||||
|
);
|
||||||
|
background-size: 24px 24px;
|
||||||
|
}
|
||||||
|
|
||||||
|
h1 {
|
||||||
|
color: grey;
|
||||||
|
}
|
||||||
|
|
||||||
|
.mermaid2 {
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
.mermaid svg {
|
||||||
|
font-size: 16px !important;
|
||||||
|
font-family: 'Recursive', serif;
|
||||||
|
font-optical-sizing: auto;
|
||||||
|
font-weight: 500;
|
||||||
|
font-style: normal;
|
||||||
|
font-variation-settings:
|
||||||
|
'slnt' 0,
|
||||||
|
'CASL' 0,
|
||||||
|
'CRSV' 0.5,
|
||||||
|
'MONO' 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
pre {
|
||||||
|
width: 100%;
|
||||||
|
/*box-shadow: 4px 4px 0px 0px #0000000F;*/
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
</head>
|
||||||
|
|
||||||
|
<body class="gridify dots">
|
||||||
|
<div class="w-full h-64">
|
||||||
|
<pre id="diagram4" class="mermaid" style="background: rgb(255, 255, 255)">
|
||||||
|
erDiagram
|
||||||
|
CAR ||--o{ NAMED-DRIVER : allows
|
||||||
|
CAR ::: Pine {
|
||||||
|
string registrationNumber PK "Primary Key<br><strong>Unique registration number</strong>"
|
||||||
|
string make "Car make<br><strong>e.g., Toyota</strong>"
|
||||||
|
string model "Model of the car<br><strong>e.g., Corolla</strong>"
|
||||||
|
string[] parts "List of parts<br><strong>Stored as array</strong>"
|
||||||
|
}
|
||||||
|
PERSON ||--o{ NAMED-DRIVER : is
|
||||||
|
PERSON ::: someclass {
|
||||||
|
string driversLicense PK "The license #<br><strong>Primary Key</strong>"
|
||||||
|
string(99) firstName "Only 99 characters <br>are allowed <br> <strong>e.g., Smith</strong>"
|
||||||
|
string lastName "Last name of person<br><strong>e.g., Smith</strong>"
|
||||||
|
string phone UK "Unique phone number<br><strong>Used for contact</strong>"
|
||||||
|
int age "Age of the person<br><strong>Must be numeric</strong>"
|
||||||
|
}
|
||||||
|
NAMED-DRIVER {
|
||||||
|
string carRegistrationNumber PK, FK, UK, PK "Foreign key to CAR<br><strong>Also part of PK</strong>"
|
||||||
|
string driverLicence PK, FK "Foreign key to PERSON<br><strong>Also part of PK</strong>"
|
||||||
|
}
|
||||||
|
MANUFACTURER only one to zero or more CAR : makesx
|
||||||
|
</pre>
|
||||||
|
<hr />
|
||||||
|
<pre class="mermaid">
|
||||||
|
erDiagram
|
||||||
|
_**testẽζ➕Ø😀㌕ぼ**_ {
|
||||||
|
*__List~List~int~~sdfds__* **driversLicense** PK "***The l😀icense #***"
|
||||||
|
string last*Name*
|
||||||
|
string __phone__ UK
|
||||||
|
*string(99)~T~~~~~~* firstName "Only __99__ <br>characters are a<br>llowed dsfsdfsdfsdfs"
|
||||||
|
int _age_
|
||||||
|
}
|
||||||
|
</pre>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<script type="module">
|
||||||
|
import mermaid from './mermaid.esm.mjs';
|
||||||
|
import layouts from './mermaid-layout-elk.esm.mjs';
|
||||||
|
|
||||||
|
const staticBellIconPack = {
|
||||||
|
prefix: 'fa6-regular',
|
||||||
|
icons: {
|
||||||
|
bell: {
|
||||||
|
body: '<path fill="currentColor" d="M224 0c-17.7 0-32 14.3-32 32v19.2C119 66 64 130.6 64 208v25.4c0 45.4-15.5 89.5-43.8 124.9L5.3 377c-5.8 7.2-6.9 17.1-2.9 25.4S14.8 416 24 416h400c9.2 0 17.6-5.3 21.6-13.6s2.9-18.2-2.9-25.4l-14.9-18.6c-28.3-35.5-43.8-79.6-43.8-125V208c0-77.4-55-142-128-156.8V32c0-17.7-14.3-32-32-32m0 96c61.9 0 112 50.1 112 112v25.4c0 47.9 13.9 94.6 39.7 134.6H72.3c25.8-40 39.7-86.7 39.7-134.6V208c0-61.9 50.1-112 112-112m64 352H160c0 17 6.7 33.3 18.7 45.3S207 512 224 512s33.3-6.7 45.3-18.7S288 465 288 448"/>',
|
||||||
|
width: 448,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
width: 512,
|
||||||
|
height: 512,
|
||||||
|
};
|
||||||
|
|
||||||
|
mermaid.registerIconPacks([
|
||||||
|
{
|
||||||
|
name: 'logos',
|
||||||
|
loader: () =>
|
||||||
|
fetch('https://unpkg.com/@iconify-json/logos@1/icons.json').then((res) => res.json()),
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: 'fa',
|
||||||
|
loader: () => staticBellIconPack,
|
||||||
|
},
|
||||||
|
]);
|
||||||
|
mermaid.registerLayoutLoaders(layouts);
|
||||||
|
mermaid.parseError = function (err, hash) {
|
||||||
|
console.error('Mermaid error: ', err);
|
||||||
|
};
|
||||||
|
window.callback = function () {
|
||||||
|
alert('A callback was triggered');
|
||||||
|
};
|
||||||
|
function callback() {
|
||||||
|
alert('It worked');
|
||||||
|
}
|
||||||
|
await mermaid.initialize({
|
||||||
|
startOnLoad: false,
|
||||||
|
|
||||||
|
theme: 'forest',
|
||||||
|
look: 'classic',
|
||||||
|
layout: 'dagre',
|
||||||
|
|
||||||
|
// theme: 'default',
|
||||||
|
// look: 'classic',
|
||||||
|
flowchart: { titleTopMargin: 10 },
|
||||||
|
fontFamily: 'Recursive',
|
||||||
|
sequence: {
|
||||||
|
actorFontFamily: 'courier',
|
||||||
|
noteFontFamily: 'courier',
|
||||||
|
messageFontFamily: 'courier',
|
||||||
|
},
|
||||||
|
kanban: {
|
||||||
|
htmlLabels: false,
|
||||||
|
},
|
||||||
|
fontSize: 16,
|
||||||
|
logLevel: 0,
|
||||||
|
securityLevel: 'loose',
|
||||||
|
callback,
|
||||||
|
});
|
||||||
|
// setTimeout(() => {
|
||||||
|
mermaid.init(undefined, document.querySelectorAll('.mermaid'));
|
||||||
|
// }, 1000);
|
||||||
|
mermaid.parseError = function (err, hash) {
|
||||||
|
console.error('In parse error:');
|
||||||
|
console.error(err);
|
||||||
|
};
|
||||||
|
</script>
|
||||||
|
</body>
|
||||||
|
</html>
|
@@ -17,7 +17,7 @@
|
|||||||
|
|
||||||
<div class="diagrams">
|
<div class="diagrams">
|
||||||
<pre class="mermaid">
|
<pre class="mermaid">
|
||||||
packet-beta
|
packet
|
||||||
0-15: "Source Port"
|
0-15: "Source Port"
|
||||||
16-31: "Destination Port"
|
16-31: "Destination Port"
|
||||||
32-63: "Sequence Number"
|
32-63: "Sequence Number"
|
||||||
@@ -44,7 +44,7 @@
|
|||||||
packet:
|
packet:
|
||||||
showBits: false
|
showBits: false
|
||||||
---
|
---
|
||||||
packet-beta
|
packet
|
||||||
0-15: "Source Port"
|
0-15: "Source Port"
|
||||||
16-31: "Destination Port"
|
16-31: "Destination Port"
|
||||||
32-63: "Sequence Number"
|
32-63: "Sequence Number"
|
||||||
@@ -70,7 +70,7 @@
|
|||||||
config:
|
config:
|
||||||
theme: forest
|
theme: forest
|
||||||
---
|
---
|
||||||
packet-beta
|
packet
|
||||||
title Forest theme
|
title Forest theme
|
||||||
0-15: "Source Port"
|
0-15: "Source Port"
|
||||||
16-31: "Destination Port"
|
16-31: "Destination Port"
|
||||||
@@ -97,7 +97,7 @@
|
|||||||
config:
|
config:
|
||||||
theme: dark
|
theme: dark
|
||||||
---
|
---
|
||||||
packet-beta
|
packet
|
||||||
title Dark theme
|
title Dark theme
|
||||||
0-15: "Source Port"
|
0-15: "Source Port"
|
||||||
16-31: "Destination Port"
|
16-31: "Destination Port"
|
||||||
|
@@ -22,7 +22,7 @@
|
|||||||
y-axis Not Important --> important
|
y-axis Not Important --> important
|
||||||
quadrant-1 Plan
|
quadrant-1 Plan
|
||||||
quadrant-2 Do
|
quadrant-2 Do
|
||||||
quadrant-3 Deligate
|
quadrant-3 Delegate
|
||||||
quadrant-4 Delete
|
quadrant-4 Delete
|
||||||
</pre>
|
</pre>
|
||||||
|
|
||||||
|
@@ -23,6 +23,23 @@
|
|||||||
1940 : fourth step : fifth step
|
1940 : fourth step : fifth step
|
||||||
</pre>
|
</pre>
|
||||||
|
|
||||||
|
<h2>Medical Device Lifecycle Timeline</h2>
|
||||||
|
<pre class="mermaid">
|
||||||
|
timeline
|
||||||
|
title Medical Device Lifecycle
|
||||||
|
section Planning
|
||||||
|
Quality Management System (4) : Regulatory Compliance (4.1) : Risk Management (4.1.3) : Management Review (5.6) : Infrastructure (6.3)
|
||||||
|
Management Responsibility (5) : Planning Activities (5.2) : Human Resources (6.2) : RnD Planning (7.3.2) : Purchasing Process (7.4.1) : Production Activities (7.5.1) : Installation Activities (7.5.3) : Servicing Activities (7.5.4)
|
||||||
|
section Realization
|
||||||
|
Research and Development (7.3) : Inputs (7.3.3) : Outputs (7.3.4) : Review (7.3.5) : Verification (7.3.6) : Validation (7.3.7)
|
||||||
|
Purchasing (7.4) : Purchasing Information (7.4.2) : Production Feedback (8.2.1)
|
||||||
|
Production (7.5) : Production Feedback (8.2.1)
|
||||||
|
Installation (7.5.3) : Installation Activities (7.5.3)
|
||||||
|
Servicing (7.5.4) : Servicing Activities (7.5.4)
|
||||||
|
section Post-Production
|
||||||
|
Post-Market Activities (8) : Feedback (8.2.1) : Complaints (8.2.2) : Adverse Events (8.2.3)
|
||||||
|
</pre>
|
||||||
|
|
||||||
<script type="module">
|
<script type="module">
|
||||||
import mermaid from './mermaid.esm.mjs';
|
import mermaid from './mermaid.esm.mjs';
|
||||||
mermaid.initialize({
|
mermaid.initialize({
|
||||||
|
75
demos/treemap.html
Normal file
75
demos/treemap.html
Normal file
@@ -0,0 +1,75 @@
|
|||||||
|
<!doctype html>
|
||||||
|
<html lang="en">
|
||||||
|
<head>
|
||||||
|
<meta charset="utf-8" />
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
||||||
|
<title>Mermaid Treemap Diagram Demo</title>
|
||||||
|
<link href="https://fonts.googleapis.com/css?family=Montserrat&display=swap" rel="stylesheet" />
|
||||||
|
<style>
|
||||||
|
body {
|
||||||
|
font-family: 'Montserrat', sans-serif;
|
||||||
|
margin: 0 auto;
|
||||||
|
max-width: 900px;
|
||||||
|
padding: 20px;
|
||||||
|
}
|
||||||
|
.mermaid {
|
||||||
|
margin: 30px 0;
|
||||||
|
}
|
||||||
|
h1,
|
||||||
|
h2 {
|
||||||
|
color: #333;
|
||||||
|
}
|
||||||
|
pre {
|
||||||
|
background-color: #f5f5f5;
|
||||||
|
padding: 15px;
|
||||||
|
border-radius: 5px;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<h1>Treemap Diagram Demo</h1>
|
||||||
|
<p>This is a demo of the new treemap diagram type in Mermaid.</p>
|
||||||
|
|
||||||
|
<h2>Basic Treemap Example</h2>
|
||||||
|
<pre class="mermaid">
|
||||||
|
treemap
|
||||||
|
"Root"
|
||||||
|
"Branch 1"
|
||||||
|
"Leaf 1.1": 10
|
||||||
|
"Leaf 1.2": 15
|
||||||
|
"Branch 2"
|
||||||
|
"Branch 2.1"
|
||||||
|
"Leaf 2.1.1": 20
|
||||||
|
"Leaf 2.1.2": 25
|
||||||
|
"Leaf 2.2": 25
|
||||||
|
"Leaf 2.3": 30
|
||||||
|
</pre>
|
||||||
|
|
||||||
|
<h2>Technology Stack Treemap Example</h2>
|
||||||
|
<pre class="mermaid">
|
||||||
|
treemap
|
||||||
|
"Technology Stack"
|
||||||
|
"Frontend"
|
||||||
|
"React": 35
|
||||||
|
"CSS": 15
|
||||||
|
"HTML": 10
|
||||||
|
"Backend"
|
||||||
|
"Node.js": 25
|
||||||
|
"Express": 10
|
||||||
|
"MongoDB": 15
|
||||||
|
"DevOps"
|
||||||
|
"Docker": 10
|
||||||
|
"Kubernetes": 15
|
||||||
|
"CI/CD": 5
|
||||||
|
</pre>
|
||||||
|
|
||||||
|
<script type="module">
|
||||||
|
import mermaid from './mermaid.esm.mjs';
|
||||||
|
mermaid.initialize({
|
||||||
|
theme: 'forest',
|
||||||
|
logLevel: 1,
|
||||||
|
securityLevel: 'loose',
|
||||||
|
});
|
||||||
|
</script>
|
||||||
|
</body>
|
||||||
|
</html>
|
@@ -10,16 +10,20 @@
|
|||||||
<h1>Zenuml demos</h1>
|
<h1>Zenuml demos</h1>
|
||||||
<pre class="mermaid">
|
<pre class="mermaid">
|
||||||
zenuml
|
zenuml
|
||||||
title Sync Messages (Design Pattern: Adapter)
|
BookLibService.Borrow(id) {
|
||||||
@Starter(Client)
|
User = Session.GetUser()
|
||||||
Adapter.interfaceMethod() {
|
if(User.isActive) {
|
||||||
translateParameter(parameter)
|
try {
|
||||||
|
BookRepository.Update(id, onLoan, User)
|
||||||
result = Implementation.implementationMethod()
|
receipt = new Receipt(id, dueDate)
|
||||||
|
} catch (BookNotFoundException) {
|
||||||
translateResult()
|
ErrorService.onException(BookNotFoundException)
|
||||||
return translatedResult
|
} finally {
|
||||||
}
|
Connection.close()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return receipt
|
||||||
|
}
|
||||||
</pre>
|
</pre>
|
||||||
<pre class="mermaid">
|
<pre class="mermaid">
|
||||||
zenuml
|
zenuml
|
||||||
|
@@ -301,7 +301,7 @@ If you are adding a feature, you will definitely need to add tests. Depending on
|
|||||||
|
|
||||||
Unit tests are tests that test a single function or module. They are the easiest to write and the fastest to run.
|
Unit tests are tests that test a single function or module. They are the easiest to write and the fastest to run.
|
||||||
|
|
||||||
Unit tests are mandatory for all code except the renderers. (The renderers are tested with integration tests.)
|
Unit tests are mandatory for all code except the layout tests. (The layouts are tested with integration tests.)
|
||||||
|
|
||||||
We use [Vitest](https://vitest.dev) to run unit tests.
|
We use [Vitest](https://vitest.dev) to run unit tests.
|
||||||
|
|
||||||
@@ -327,6 +327,30 @@ When using Docker prepend your command with `./run`:
|
|||||||
./run pnpm test
|
./run pnpm test
|
||||||
```
|
```
|
||||||
|
|
||||||
|
##### Testing the DOM
|
||||||
|
|
||||||
|
One can use `jsdomIt` to test any part of Mermaid that interacts with the DOM, as long as it is not related to the layout.
|
||||||
|
|
||||||
|
The function `jsdomIt` ([developed in utils.ts](../../tests/util.ts)) overrides `it` from `vitest`, and creates a pseudo-browser environment that works almost like the real deal for the duration of the test. It uses JSDOM to create a DOM, and adds objects `window` and `document` to `global` to mock the browser environment.
|
||||||
|
|
||||||
|
> \[!NOTE]
|
||||||
|
> The layout cannot work in `jsdomIt` tests because JSDOM has no rendering engine, hence the pseudo-browser environment.
|
||||||
|
|
||||||
|
Example :
|
||||||
|
|
||||||
|
```typescript
|
||||||
|
import { ensureNodeFromSelector, jsdomIt } from './tests/util.js';
|
||||||
|
|
||||||
|
jsdomIt('should add element "thing" in the SVG', ({ svg }) => {
|
||||||
|
// Code in this block runs in a pseudo-browser environment
|
||||||
|
addThing(svg); // The svg item is the D3 selection of the SVG node
|
||||||
|
const svgNode = ensureNodeFromSelector('svg'); // Retrieve the DOM node using the DOM API
|
||||||
|
expect(svgNode.querySelector('thing')).not.toBeNull(); // Test the structure of the SVG
|
||||||
|
});
|
||||||
|
```
|
||||||
|
|
||||||
|
They can be used to test any method that interacts with the DOM, including for testing renderers. For renderers, additional integration testing is necessary to test the layout though.
|
||||||
|
|
||||||
#### Integration / End-to-End (E2E) Tests
|
#### Integration / End-to-End (E2E) Tests
|
||||||
|
|
||||||
These test the rendering and visual appearance of the diagrams.
|
These test the rendering and visual appearance of the diagrams.
|
||||||
@@ -497,14 +521,14 @@ This is a danger alert
|
|||||||
|
|
||||||
### Navigation
|
### Navigation
|
||||||
|
|
||||||
If you want to propose changes to how the documentation is _organized_, such as adding a new section or re-arranging or renaming a section, you must update the **sidebar navigation**, which is defined in [the vitepress config](../.vitepress/config.ts). The same goes to **topbar**.
|
If you want to propose changes to how the documentation is _organized_, such as adding a new section or re-arranging or renaming a section, you must update the **sidebar navigation**, which is defined in [the vitepress config](../.vitepress/config.ts). The same goes for **topbar**.
|
||||||
|
|
||||||
### Build Docs
|
### Build Docs
|
||||||
|
|
||||||
The content of `/docs` folder is built with Github Actions.
|
The content of `/docs` folder is built with GitHub Actions.
|
||||||
|
|
||||||
> **Warning**
|
> **Warning**
|
||||||
> So as to allow automatic compilation of documentation pages you have to enable Github Actions on your fork first
|
> So as to allow automatic compilation of documentation pages you have to enable GitHub Actions on your fork first
|
||||||
|
|
||||||
## Submit your pull request
|
## Submit your pull request
|
||||||
|
|
||||||
|
@@ -111,3 +111,13 @@ const themes = {
|
|||||||
```
|
```
|
||||||
|
|
||||||
The actual options and values for the colors are defined in **src/theme/theme-\[xyz].js**. If you provide the options your diagram needs in the existing theme files then the theming will work smoothly without hiccups.
|
The actual options and values for the colors are defined in **src/theme/theme-\[xyz].js**. If you provide the options your diagram needs in the existing theme files then the theming will work smoothly without hiccups.
|
||||||
|
|
||||||
|
## Examples
|
||||||
|
|
||||||
|
The `@mermaid-js/examples` package contains a collection of examples that are used by tools like mermaid.live to help users get started with the new diagram.
|
||||||
|
|
||||||
|
You can duplicate an existing diagram example file, eg: `packages/examples/src/examples/flowchart.ts`, and modify it with details specific to your diagram.
|
||||||
|
|
||||||
|
Then you can import the example in the `packages/examples/src/index.ts` file and add it to the `examples` array.
|
||||||
|
|
||||||
|
Each diagram should have at least one example, and that should be marked as default. It is good to add more examples to showcase different features of the diagram.
|
||||||
|
@@ -22,4 +22,4 @@ This helps the team know the relative interest in something and helps them set p
|
|||||||
|
|
||||||
You have not found anything that already addresses your request, or maybe you have come up with the new idea? Feel free to open a new issue or discussion.
|
You have not found anything that already addresses your request, or maybe you have come up with the new idea? Feel free to open a new issue or discussion.
|
||||||
|
|
||||||
Log in to [GitHub.com](https://www.github.com), and use [GitHub issue tracker of the mermaid-js repository](https://github.com/mermaid-js/mermaid/issues). Press \[<https://github.com/mermaid-js/mermaid/issues/new/choose>] issue, select the appropriate template and describe your problem.
|
Log in to [GitHub.com](https://www.github.com), and use [GitHub issue tracker of the mermaid-js repository](https://github.com/mermaid-js/mermaid/issues). Press [issue, select the appropriate template](https://github.com/mermaid-js/mermaid/issues/new/choose) and describe your problem.
|
||||||
|
@@ -251,12 +251,12 @@ Here is the HTML generated for the SVG element: _(Note that some of the SVG attr
|
|||||||
|
|
||||||
```
|
```
|
||||||
|
|
||||||
##### Gitgraph
|
##### GitGraph
|
||||||
|
|
||||||
```mermaid-example
|
```mermaid-example
|
||||||
gitGraph
|
gitGraph
|
||||||
accTitle: My Gitgraph Accessibility Title
|
accTitle: My GitGraph Accessibility Title
|
||||||
accDescr: My Gitgraph Accessibility Description
|
accDescr: My GitGraph Accessibility Description
|
||||||
|
|
||||||
commit
|
commit
|
||||||
commit
|
commit
|
||||||
@@ -273,8 +273,8 @@ Here is the HTML generated for the SVG element: _(Note that some of the SVG attr
|
|||||||
|
|
||||||
```mermaid
|
```mermaid
|
||||||
gitGraph
|
gitGraph
|
||||||
accTitle: My Gitgraph Accessibility Title
|
accTitle: My GitGraph Accessibility Title
|
||||||
accDescr: My Gitgraph Accessibility Description
|
accDescr: My GitGraph Accessibility Description
|
||||||
|
|
||||||
commit
|
commit
|
||||||
commit
|
commit
|
||||||
|
@@ -12,4 +12,4 @@
|
|||||||
|
|
||||||
> `const` **configKeys**: `Set`<`string`>
|
> `const` **configKeys**: `Set`<`string`>
|
||||||
|
|
||||||
Defined in: [packages/mermaid/src/defaultConfig.ts:274](https://github.com/mermaid-js/mermaid/blob/master/packages/mermaid/src/defaultConfig.ts#L274)
|
Defined in: [packages/mermaid/src/defaultConfig.ts:290](https://github.com/mermaid-js/mermaid/blob/master/packages/mermaid/src/defaultConfig.ts#L290)
|
||||||
|
@@ -10,7 +10,7 @@
|
|||||||
|
|
||||||
# Interface: ExternalDiagramDefinition
|
# Interface: ExternalDiagramDefinition
|
||||||
|
|
||||||
Defined in: [packages/mermaid/src/diagram-api/types.ts:99](https://github.com/mermaid-js/mermaid/blob/master/packages/mermaid/src/diagram-api/types.ts#L99)
|
Defined in: [packages/mermaid/src/diagram-api/types.ts:94](https://github.com/mermaid-js/mermaid/blob/master/packages/mermaid/src/diagram-api/types.ts#L94)
|
||||||
|
|
||||||
## Properties
|
## Properties
|
||||||
|
|
||||||
@@ -18,7 +18,7 @@ Defined in: [packages/mermaid/src/diagram-api/types.ts:99](https://github.com/me
|
|||||||
|
|
||||||
> **detector**: `DiagramDetector`
|
> **detector**: `DiagramDetector`
|
||||||
|
|
||||||
Defined in: [packages/mermaid/src/diagram-api/types.ts:101](https://github.com/mermaid-js/mermaid/blob/master/packages/mermaid/src/diagram-api/types.ts#L101)
|
Defined in: [packages/mermaid/src/diagram-api/types.ts:96](https://github.com/mermaid-js/mermaid/blob/master/packages/mermaid/src/diagram-api/types.ts#L96)
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
@@ -26,7 +26,7 @@ Defined in: [packages/mermaid/src/diagram-api/types.ts:101](https://github.com/m
|
|||||||
|
|
||||||
> **id**: `string`
|
> **id**: `string`
|
||||||
|
|
||||||
Defined in: [packages/mermaid/src/diagram-api/types.ts:100](https://github.com/mermaid-js/mermaid/blob/master/packages/mermaid/src/diagram-api/types.ts#L100)
|
Defined in: [packages/mermaid/src/diagram-api/types.ts:95](https://github.com/mermaid-js/mermaid/blob/master/packages/mermaid/src/diagram-api/types.ts#L95)
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
@@ -34,4 +34,4 @@ Defined in: [packages/mermaid/src/diagram-api/types.ts:100](https://github.com/m
|
|||||||
|
|
||||||
> **loader**: `DiagramLoader`
|
> **loader**: `DiagramLoader`
|
||||||
|
|
||||||
Defined in: [packages/mermaid/src/diagram-api/types.ts:102](https://github.com/mermaid-js/mermaid/blob/master/packages/mermaid/src/diagram-api/types.ts#L102)
|
Defined in: [packages/mermaid/src/diagram-api/types.ts:97](https://github.com/mermaid-js/mermaid/blob/master/packages/mermaid/src/diagram-api/types.ts#L97)
|
||||||
|
@@ -10,7 +10,7 @@
|
|||||||
|
|
||||||
# Interface: LayoutData
|
# Interface: LayoutData
|
||||||
|
|
||||||
Defined in: [packages/mermaid/src/rendering-util/types.ts:145](https://github.com/mermaid-js/mermaid/blob/master/packages/mermaid/src/rendering-util/types.ts#L145)
|
Defined in: [packages/mermaid/src/rendering-util/types.ts:153](https://github.com/mermaid-js/mermaid/blob/master/packages/mermaid/src/rendering-util/types.ts#L153)
|
||||||
|
|
||||||
## Indexable
|
## Indexable
|
||||||
|
|
||||||
@@ -22,7 +22,7 @@ Defined in: [packages/mermaid/src/rendering-util/types.ts:145](https://github.co
|
|||||||
|
|
||||||
> **config**: [`MermaidConfig`](MermaidConfig.md)
|
> **config**: [`MermaidConfig`](MermaidConfig.md)
|
||||||
|
|
||||||
Defined in: [packages/mermaid/src/rendering-util/types.ts:148](https://github.com/mermaid-js/mermaid/blob/master/packages/mermaid/src/rendering-util/types.ts#L148)
|
Defined in: [packages/mermaid/src/rendering-util/types.ts:156](https://github.com/mermaid-js/mermaid/blob/master/packages/mermaid/src/rendering-util/types.ts#L156)
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
@@ -30,7 +30,7 @@ Defined in: [packages/mermaid/src/rendering-util/types.ts:148](https://github.co
|
|||||||
|
|
||||||
> **edges**: `Edge`\[]
|
> **edges**: `Edge`\[]
|
||||||
|
|
||||||
Defined in: [packages/mermaid/src/rendering-util/types.ts:147](https://github.com/mermaid-js/mermaid/blob/master/packages/mermaid/src/rendering-util/types.ts#L147)
|
Defined in: [packages/mermaid/src/rendering-util/types.ts:155](https://github.com/mermaid-js/mermaid/blob/master/packages/mermaid/src/rendering-util/types.ts#L155)
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
@@ -38,4 +38,4 @@ Defined in: [packages/mermaid/src/rendering-util/types.ts:147](https://github.co
|
|||||||
|
|
||||||
> **nodes**: `Node`\[]
|
> **nodes**: `Node`\[]
|
||||||
|
|
||||||
Defined in: [packages/mermaid/src/rendering-util/types.ts:146](https://github.com/mermaid-js/mermaid/blob/master/packages/mermaid/src/rendering-util/types.ts#L146)
|
Defined in: [packages/mermaid/src/rendering-util/types.ts:154](https://github.com/mermaid-js/mermaid/blob/master/packages/mermaid/src/rendering-util/types.ts#L154)
|
||||||
|
@@ -10,7 +10,7 @@
|
|||||||
|
|
||||||
# Interface: Mermaid
|
# Interface: Mermaid
|
||||||
|
|
||||||
Defined in: [packages/mermaid/src/mermaid.ts:418](https://github.com/mermaid-js/mermaid/blob/master/packages/mermaid/src/mermaid.ts#L418)
|
Defined in: [packages/mermaid/src/mermaid.ts:429](https://github.com/mermaid-js/mermaid/blob/master/packages/mermaid/src/mermaid.ts#L429)
|
||||||
|
|
||||||
## Properties
|
## Properties
|
||||||
|
|
||||||
@@ -18,7 +18,7 @@ Defined in: [packages/mermaid/src/mermaid.ts:418](https://github.com/mermaid-js/
|
|||||||
|
|
||||||
> **contentLoaded**: () => `void`
|
> **contentLoaded**: () => `void`
|
||||||
|
|
||||||
Defined in: [packages/mermaid/src/mermaid.ts:436](https://github.com/mermaid-js/mermaid/blob/master/packages/mermaid/src/mermaid.ts#L436)
|
Defined in: [packages/mermaid/src/mermaid.ts:447](https://github.com/mermaid-js/mermaid/blob/master/packages/mermaid/src/mermaid.ts#L447)
|
||||||
|
|
||||||
\##contentLoaded Callback function that is called when page is loaded. This functions fetches
|
\##contentLoaded Callback function that is called when page is loaded. This functions fetches
|
||||||
configuration for mermaid rendering and calls init for rendering the mermaid diagrams on the
|
configuration for mermaid rendering and calls init for rendering the mermaid diagrams on the
|
||||||
@@ -34,7 +34,7 @@ page.
|
|||||||
|
|
||||||
> **detectType**: (`text`, `config`?) => `string`
|
> **detectType**: (`text`, `config`?) => `string`
|
||||||
|
|
||||||
Defined in: [packages/mermaid/src/mermaid.ts:438](https://github.com/mermaid-js/mermaid/blob/master/packages/mermaid/src/mermaid.ts#L438)
|
Defined in: [packages/mermaid/src/mermaid.ts:449](https://github.com/mermaid-js/mermaid/blob/master/packages/mermaid/src/mermaid.ts#L449)
|
||||||
|
|
||||||
Detects the type of the graph text.
|
Detects the type of the graph text.
|
||||||
|
|
||||||
@@ -86,11 +86,28 @@ A graph definition key
|
|||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
|
### getRegisteredDiagramsMetadata()
|
||||||
|
|
||||||
|
> **getRegisteredDiagramsMetadata**: () => `Pick`<[`ExternalDiagramDefinition`](ExternalDiagramDefinition.md), `"id"`>\[]
|
||||||
|
|
||||||
|
Defined in: [packages/mermaid/src/mermaid.ts:451](https://github.com/mermaid-js/mermaid/blob/master/packages/mermaid/src/mermaid.ts#L451)
|
||||||
|
|
||||||
|
Gets the metadata for all registered diagrams.
|
||||||
|
Currently only the id is returned.
|
||||||
|
|
||||||
|
#### Returns
|
||||||
|
|
||||||
|
`Pick`<[`ExternalDiagramDefinition`](ExternalDiagramDefinition.md), `"id"`>\[]
|
||||||
|
|
||||||
|
An array of objects with the id of the diagram.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
### ~~init()~~
|
### ~~init()~~
|
||||||
|
|
||||||
> **init**: (`config`?, `nodes`?, `callback`?) => `Promise`<`void`>
|
> **init**: (`config`?, `nodes`?, `callback`?) => `Promise`<`void`>
|
||||||
|
|
||||||
Defined in: [packages/mermaid/src/mermaid.ts:431](https://github.com/mermaid-js/mermaid/blob/master/packages/mermaid/src/mermaid.ts#L431)
|
Defined in: [packages/mermaid/src/mermaid.ts:442](https://github.com/mermaid-js/mermaid/blob/master/packages/mermaid/src/mermaid.ts#L442)
|
||||||
|
|
||||||
## init
|
## init
|
||||||
|
|
||||||
@@ -138,7 +155,7 @@ Use [initialize](Mermaid.md#initialize) and [run](Mermaid.md#run) instead.
|
|||||||
|
|
||||||
> **initialize**: (`config`) => `void`
|
> **initialize**: (`config`) => `void`
|
||||||
|
|
||||||
Defined in: [packages/mermaid/src/mermaid.ts:435](https://github.com/mermaid-js/mermaid/blob/master/packages/mermaid/src/mermaid.ts#L435)
|
Defined in: [packages/mermaid/src/mermaid.ts:446](https://github.com/mermaid-js/mermaid/blob/master/packages/mermaid/src/mermaid.ts#L446)
|
||||||
|
|
||||||
Used to set configurations for mermaid.
|
Used to set configurations for mermaid.
|
||||||
This function should be called before the run function.
|
This function should be called before the run function.
|
||||||
@@ -161,7 +178,7 @@ Configuration object for mermaid.
|
|||||||
|
|
||||||
> **mermaidAPI**: `Readonly`<{ `defaultConfig`: [`MermaidConfig`](MermaidConfig.md); `getConfig`: () => [`MermaidConfig`](MermaidConfig.md); `getDiagramFromText`: (`text`, `metadata`) => `Promise`<`Diagram`>; `getSiteConfig`: () => [`MermaidConfig`](MermaidConfig.md); `globalReset`: () => `void`; `initialize`: (`userOptions`) => `void`; `parse`: (`text`, `parseOptions`) => `Promise`<`false` | [`ParseResult`](ParseResult.md)>(`text`, `parseOptions`?) => `Promise`<[`ParseResult`](ParseResult.md)>; `render`: (`id`, `text`, `svgContainingElement`?) => `Promise`<[`RenderResult`](RenderResult.md)>; `reset`: () => `void`; `setConfig`: (`conf`) => [`MermaidConfig`](MermaidConfig.md); `updateSiteConfig`: (`conf`) => [`MermaidConfig`](MermaidConfig.md); }>
|
> **mermaidAPI**: `Readonly`<{ `defaultConfig`: [`MermaidConfig`](MermaidConfig.md); `getConfig`: () => [`MermaidConfig`](MermaidConfig.md); `getDiagramFromText`: (`text`, `metadata`) => `Promise`<`Diagram`>; `getSiteConfig`: () => [`MermaidConfig`](MermaidConfig.md); `globalReset`: () => `void`; `initialize`: (`userOptions`) => `void`; `parse`: (`text`, `parseOptions`) => `Promise`<`false` | [`ParseResult`](ParseResult.md)>(`text`, `parseOptions`?) => `Promise`<[`ParseResult`](ParseResult.md)>; `render`: (`id`, `text`, `svgContainingElement`?) => `Promise`<[`RenderResult`](RenderResult.md)>; `reset`: () => `void`; `setConfig`: (`conf`) => [`MermaidConfig`](MermaidConfig.md); `updateSiteConfig`: (`conf`) => [`MermaidConfig`](MermaidConfig.md); }>
|
||||||
|
|
||||||
Defined in: [packages/mermaid/src/mermaid.ts:425](https://github.com/mermaid-js/mermaid/blob/master/packages/mermaid/src/mermaid.ts#L425)
|
Defined in: [packages/mermaid/src/mermaid.ts:436](https://github.com/mermaid-js/mermaid/blob/master/packages/mermaid/src/mermaid.ts#L436)
|
||||||
|
|
||||||
**`Internal`**
|
**`Internal`**
|
||||||
|
|
||||||
@@ -175,7 +192,7 @@ Use [parse](Mermaid.md#parse) and [render](Mermaid.md#render) instead. Please [o
|
|||||||
|
|
||||||
> **parse**: (`text`, `parseOptions`) => `Promise`<`false` | [`ParseResult`](ParseResult.md)>(`text`, `parseOptions`?) => `Promise`<[`ParseResult`](ParseResult.md)>
|
> **parse**: (`text`, `parseOptions`) => `Promise`<`false` | [`ParseResult`](ParseResult.md)>(`text`, `parseOptions`?) => `Promise`<[`ParseResult`](ParseResult.md)>
|
||||||
|
|
||||||
Defined in: [packages/mermaid/src/mermaid.ts:426](https://github.com/mermaid-js/mermaid/blob/master/packages/mermaid/src/mermaid.ts#L426)
|
Defined in: [packages/mermaid/src/mermaid.ts:437](https://github.com/mermaid-js/mermaid/blob/master/packages/mermaid/src/mermaid.ts#L437)
|
||||||
|
|
||||||
Parse the text and validate the syntax.
|
Parse the text and validate the syntax.
|
||||||
|
|
||||||
@@ -243,7 +260,7 @@ Error if the diagram is invalid and parseOptions.suppressErrors is false or not
|
|||||||
|
|
||||||
> `optional` **parseError**: [`ParseErrorFunction`](../type-aliases/ParseErrorFunction.md)
|
> `optional` **parseError**: [`ParseErrorFunction`](../type-aliases/ParseErrorFunction.md)
|
||||||
|
|
||||||
Defined in: [packages/mermaid/src/mermaid.ts:420](https://github.com/mermaid-js/mermaid/blob/master/packages/mermaid/src/mermaid.ts#L420)
|
Defined in: [packages/mermaid/src/mermaid.ts:431](https://github.com/mermaid-js/mermaid/blob/master/packages/mermaid/src/mermaid.ts#L431)
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
@@ -251,7 +268,7 @@ Defined in: [packages/mermaid/src/mermaid.ts:420](https://github.com/mermaid-js/
|
|||||||
|
|
||||||
> **registerExternalDiagrams**: (`diagrams`, `opts`) => `Promise`<`void`>
|
> **registerExternalDiagrams**: (`diagrams`, `opts`) => `Promise`<`void`>
|
||||||
|
|
||||||
Defined in: [packages/mermaid/src/mermaid.ts:434](https://github.com/mermaid-js/mermaid/blob/master/packages/mermaid/src/mermaid.ts#L434)
|
Defined in: [packages/mermaid/src/mermaid.ts:445](https://github.com/mermaid-js/mermaid/blob/master/packages/mermaid/src/mermaid.ts#L445)
|
||||||
|
|
||||||
Used to register external diagram types.
|
Used to register external diagram types.
|
||||||
|
|
||||||
@@ -281,7 +298,7 @@ If opts.lazyLoad is false, the diagrams will be loaded immediately.
|
|||||||
|
|
||||||
> **registerIconPacks**: (`iconLoaders`) => `void`
|
> **registerIconPacks**: (`iconLoaders`) => `void`
|
||||||
|
|
||||||
Defined in: [packages/mermaid/src/mermaid.ts:439](https://github.com/mermaid-js/mermaid/blob/master/packages/mermaid/src/mermaid.ts#L439)
|
Defined in: [packages/mermaid/src/mermaid.ts:450](https://github.com/mermaid-js/mermaid/blob/master/packages/mermaid/src/mermaid.ts#L450)
|
||||||
|
|
||||||
#### Parameters
|
#### Parameters
|
||||||
|
|
||||||
@@ -299,7 +316,7 @@ Defined in: [packages/mermaid/src/mermaid.ts:439](https://github.com/mermaid-js/
|
|||||||
|
|
||||||
> **registerLayoutLoaders**: (`loaders`) => `void`
|
> **registerLayoutLoaders**: (`loaders`) => `void`
|
||||||
|
|
||||||
Defined in: [packages/mermaid/src/mermaid.ts:433](https://github.com/mermaid-js/mermaid/blob/master/packages/mermaid/src/mermaid.ts#L433)
|
Defined in: [packages/mermaid/src/mermaid.ts:444](https://github.com/mermaid-js/mermaid/blob/master/packages/mermaid/src/mermaid.ts#L444)
|
||||||
|
|
||||||
#### Parameters
|
#### Parameters
|
||||||
|
|
||||||
@@ -317,7 +334,7 @@ Defined in: [packages/mermaid/src/mermaid.ts:433](https://github.com/mermaid-js/
|
|||||||
|
|
||||||
> **render**: (`id`, `text`, `svgContainingElement`?) => `Promise`<[`RenderResult`](RenderResult.md)>
|
> **render**: (`id`, `text`, `svgContainingElement`?) => `Promise`<[`RenderResult`](RenderResult.md)>
|
||||||
|
|
||||||
Defined in: [packages/mermaid/src/mermaid.ts:427](https://github.com/mermaid-js/mermaid/blob/master/packages/mermaid/src/mermaid.ts#L427)
|
Defined in: [packages/mermaid/src/mermaid.ts:438](https://github.com/mermaid-js/mermaid/blob/master/packages/mermaid/src/mermaid.ts#L438)
|
||||||
|
|
||||||
#### Parameters
|
#### Parameters
|
||||||
|
|
||||||
@@ -349,7 +366,7 @@ Deprecated for external use.
|
|||||||
|
|
||||||
> **run**: (`options`) => `Promise`<`void`>
|
> **run**: (`options`) => `Promise`<`void`>
|
||||||
|
|
||||||
Defined in: [packages/mermaid/src/mermaid.ts:432](https://github.com/mermaid-js/mermaid/blob/master/packages/mermaid/src/mermaid.ts#L432)
|
Defined in: [packages/mermaid/src/mermaid.ts:443](https://github.com/mermaid-js/mermaid/blob/master/packages/mermaid/src/mermaid.ts#L443)
|
||||||
|
|
||||||
## run
|
## run
|
||||||
|
|
||||||
@@ -393,7 +410,7 @@ Optional runtime configs
|
|||||||
|
|
||||||
> **setParseErrorHandler**: (`parseErrorHandler`) => `void`
|
> **setParseErrorHandler**: (`parseErrorHandler`) => `void`
|
||||||
|
|
||||||
Defined in: [packages/mermaid/src/mermaid.ts:437](https://github.com/mermaid-js/mermaid/blob/master/packages/mermaid/src/mermaid.ts#L437)
|
Defined in: [packages/mermaid/src/mermaid.ts:448](https://github.com/mermaid-js/mermaid/blob/master/packages/mermaid/src/mermaid.ts#L448)
|
||||||
|
|
||||||
## setParseErrorHandler Alternative to directly setting parseError using:
|
## setParseErrorHandler Alternative to directly setting parseError using:
|
||||||
|
|
||||||
@@ -424,4 +441,4 @@ New parseError() callback.
|
|||||||
|
|
||||||
> **startOnLoad**: `boolean`
|
> **startOnLoad**: `boolean`
|
||||||
|
|
||||||
Defined in: [packages/mermaid/src/mermaid.ts:419](https://github.com/mermaid-js/mermaid/blob/master/packages/mermaid/src/mermaid.ts#L419)
|
Defined in: [packages/mermaid/src/mermaid.ts:430](https://github.com/mermaid-js/mermaid/blob/master/packages/mermaid/src/mermaid.ts#L430)
|
||||||
|
@@ -10,7 +10,7 @@
|
|||||||
|
|
||||||
# Interface: ParseOptions
|
# Interface: ParseOptions
|
||||||
|
|
||||||
Defined in: [packages/mermaid/src/types.ts:59](https://github.com/mermaid-js/mermaid/blob/master/packages/mermaid/src/types.ts#L59)
|
Defined in: [packages/mermaid/src/types.ts:72](https://github.com/mermaid-js/mermaid/blob/master/packages/mermaid/src/types.ts#L72)
|
||||||
|
|
||||||
## Properties
|
## Properties
|
||||||
|
|
||||||
@@ -18,7 +18,7 @@ Defined in: [packages/mermaid/src/types.ts:59](https://github.com/mermaid-js/mer
|
|||||||
|
|
||||||
> `optional` **suppressErrors**: `boolean`
|
> `optional` **suppressErrors**: `boolean`
|
||||||
|
|
||||||
Defined in: [packages/mermaid/src/types.ts:64](https://github.com/mermaid-js/mermaid/blob/master/packages/mermaid/src/types.ts#L64)
|
Defined in: [packages/mermaid/src/types.ts:77](https://github.com/mermaid-js/mermaid/blob/master/packages/mermaid/src/types.ts#L77)
|
||||||
|
|
||||||
If `true`, parse will return `false` instead of throwing error when the diagram is invalid.
|
If `true`, parse will return `false` instead of throwing error when the diagram is invalid.
|
||||||
The `parseError` function will not be called.
|
The `parseError` function will not be called.
|
||||||
|
@@ -10,7 +10,7 @@
|
|||||||
|
|
||||||
# Interface: ParseResult
|
# Interface: ParseResult
|
||||||
|
|
||||||
Defined in: [packages/mermaid/src/types.ts:67](https://github.com/mermaid-js/mermaid/blob/master/packages/mermaid/src/types.ts#L67)
|
Defined in: [packages/mermaid/src/types.ts:80](https://github.com/mermaid-js/mermaid/blob/master/packages/mermaid/src/types.ts#L80)
|
||||||
|
|
||||||
## Properties
|
## Properties
|
||||||
|
|
||||||
@@ -18,7 +18,7 @@ Defined in: [packages/mermaid/src/types.ts:67](https://github.com/mermaid-js/mer
|
|||||||
|
|
||||||
> **config**: [`MermaidConfig`](MermaidConfig.md)
|
> **config**: [`MermaidConfig`](MermaidConfig.md)
|
||||||
|
|
||||||
Defined in: [packages/mermaid/src/types.ts:75](https://github.com/mermaid-js/mermaid/blob/master/packages/mermaid/src/types.ts#L75)
|
Defined in: [packages/mermaid/src/types.ts:88](https://github.com/mermaid-js/mermaid/blob/master/packages/mermaid/src/types.ts#L88)
|
||||||
|
|
||||||
The config passed as YAML frontmatter or directives
|
The config passed as YAML frontmatter or directives
|
||||||
|
|
||||||
@@ -28,6 +28,6 @@ The config passed as YAML frontmatter or directives
|
|||||||
|
|
||||||
> **diagramType**: `string`
|
> **diagramType**: `string`
|
||||||
|
|
||||||
Defined in: [packages/mermaid/src/types.ts:71](https://github.com/mermaid-js/mermaid/blob/master/packages/mermaid/src/types.ts#L71)
|
Defined in: [packages/mermaid/src/types.ts:84](https://github.com/mermaid-js/mermaid/blob/master/packages/mermaid/src/types.ts#L84)
|
||||||
|
|
||||||
The diagram type, e.g. 'flowchart', 'sequence', etc.
|
The diagram type, e.g. 'flowchart', 'sequence', etc.
|
||||||
|
@@ -10,7 +10,7 @@
|
|||||||
|
|
||||||
# Interface: RenderResult
|
# Interface: RenderResult
|
||||||
|
|
||||||
Defined in: [packages/mermaid/src/types.ts:85](https://github.com/mermaid-js/mermaid/blob/master/packages/mermaid/src/types.ts#L85)
|
Defined in: [packages/mermaid/src/types.ts:98](https://github.com/mermaid-js/mermaid/blob/master/packages/mermaid/src/types.ts#L98)
|
||||||
|
|
||||||
## Properties
|
## Properties
|
||||||
|
|
||||||
@@ -18,7 +18,7 @@ Defined in: [packages/mermaid/src/types.ts:85](https://github.com/mermaid-js/mer
|
|||||||
|
|
||||||
> `optional` **bindFunctions**: (`element`) => `void`
|
> `optional` **bindFunctions**: (`element`) => `void`
|
||||||
|
|
||||||
Defined in: [packages/mermaid/src/types.ts:103](https://github.com/mermaid-js/mermaid/blob/master/packages/mermaid/src/types.ts#L103)
|
Defined in: [packages/mermaid/src/types.ts:116](https://github.com/mermaid-js/mermaid/blob/master/packages/mermaid/src/types.ts#L116)
|
||||||
|
|
||||||
Bind function to be called after the svg has been inserted into the DOM.
|
Bind function to be called after the svg has been inserted into the DOM.
|
||||||
This is necessary for adding event listeners to the elements in the svg.
|
This is necessary for adding event listeners to the elements in the svg.
|
||||||
@@ -45,7 +45,7 @@ bindFunctions?.(div); // To call bindFunctions only if it's present.
|
|||||||
|
|
||||||
> **diagramType**: `string`
|
> **diagramType**: `string`
|
||||||
|
|
||||||
Defined in: [packages/mermaid/src/types.ts:93](https://github.com/mermaid-js/mermaid/blob/master/packages/mermaid/src/types.ts#L93)
|
Defined in: [packages/mermaid/src/types.ts:106](https://github.com/mermaid-js/mermaid/blob/master/packages/mermaid/src/types.ts#L106)
|
||||||
|
|
||||||
The diagram type, e.g. 'flowchart', 'sequence', etc.
|
The diagram type, e.g. 'flowchart', 'sequence', etc.
|
||||||
|
|
||||||
@@ -55,6 +55,6 @@ The diagram type, e.g. 'flowchart', 'sequence', etc.
|
|||||||
|
|
||||||
> **svg**: `string`
|
> **svg**: `string`
|
||||||
|
|
||||||
Defined in: [packages/mermaid/src/types.ts:89](https://github.com/mermaid-js/mermaid/blob/master/packages/mermaid/src/types.ts#L89)
|
Defined in: [packages/mermaid/src/types.ts:102](https://github.com/mermaid-js/mermaid/blob/master/packages/mermaid/src/types.ts#L102)
|
||||||
|
|
||||||
The svg code for the rendered graph.
|
The svg code for the rendered graph.
|
||||||
|
@@ -12,4 +12,4 @@
|
|||||||
|
|
||||||
> **SVG**: `d3.Selection`<`SVGSVGElement`, `unknown`, `Element` | `null`, `unknown`>
|
> **SVG**: `d3.Selection`<`SVGSVGElement`, `unknown`, `Element` | `null`, `unknown`>
|
||||||
|
|
||||||
Defined in: [packages/mermaid/src/diagram-api/types.ts:130](https://github.com/mermaid-js/mermaid/blob/master/packages/mermaid/src/diagram-api/types.ts#L130)
|
Defined in: [packages/mermaid/src/diagram-api/types.ts:126](https://github.com/mermaid-js/mermaid/blob/master/packages/mermaid/src/diagram-api/types.ts#L126)
|
||||||
|
@@ -12,4 +12,4 @@
|
|||||||
|
|
||||||
> **SVGGroup**: `d3.Selection`<`SVGGElement`, `unknown`, `Element` | `null`, `unknown`>
|
> **SVGGroup**: `d3.Selection`<`SVGGElement`, `unknown`, `Element` | `null`, `unknown`>
|
||||||
|
|
||||||
Defined in: [packages/mermaid/src/diagram-api/types.ts:132](https://github.com/mermaid-js/mermaid/blob/master/packages/mermaid/src/diagram-api/types.ts#L132)
|
Defined in: [packages/mermaid/src/diagram-api/types.ts:128](https://github.com/mermaid-js/mermaid/blob/master/packages/mermaid/src/diagram-api/types.ts#L128)
|
||||||
|
@@ -12,4 +12,4 @@
|
|||||||
|
|
||||||
> `const` **default**: [`Mermaid`](../interfaces/Mermaid.md)
|
> `const` **default**: [`Mermaid`](../interfaces/Mermaid.md)
|
||||||
|
|
||||||
Defined in: [packages/mermaid/src/mermaid.ts:442](https://github.com/mermaid-js/mermaid/blob/master/packages/mermaid/src/mermaid.ts#L442)
|
Defined in: [packages/mermaid/src/mermaid.ts:454](https://github.com/mermaid-js/mermaid/blob/master/packages/mermaid/src/mermaid.ts#L454)
|
||||||
|
@@ -8,7 +8,7 @@
|
|||||||
|
|
||||||
Dynamic and integrated theme configuration was introduced in Mermaid version 8.7.0.
|
Dynamic and integrated theme configuration was introduced in Mermaid version 8.7.0.
|
||||||
|
|
||||||
Themes can now be customized at the site-wide level, or on individual Mermaid diagrams. For site-wide theme customization, the `initialize` call is used. For diagram specific customization, the `init` directive is used.
|
Themes can now be customized at the site-wide level, or on individual Mermaid diagrams. For site-wide theme customization, the `initialize` call is used. For diagram specific customization, frontmatter config is used.
|
||||||
|
|
||||||
## Available Themes
|
## Available Themes
|
||||||
|
|
||||||
@@ -37,30 +37,24 @@ mermaid.initialize({
|
|||||||
|
|
||||||
## Diagram-specific Themes
|
## Diagram-specific Themes
|
||||||
|
|
||||||
To customize the theme of an individual diagram, use the `init` directive.
|
To customize the theme of an individual diagram, use frontmatter config.
|
||||||
|
|
||||||
Example of `init` directive setting the `theme` to `forest`:
|
Example of frontmatter config setting the `theme` to `forest`:
|
||||||
|
|
||||||
```mermaid-example
|
```mermaid-example
|
||||||
%%{init: {'theme':'forest'}}%%
|
---
|
||||||
|
config:
|
||||||
|
theme: 'forest'
|
||||||
|
---
|
||||||
graph TD
|
graph TD
|
||||||
a --> b
|
a --> b
|
||||||
```
|
```
|
||||||
|
|
||||||
```mermaid
|
```mermaid
|
||||||
%%{init: {'theme':'forest'}}%%
|
---
|
||||||
graph TD
|
config:
|
||||||
a --> b
|
theme: 'forest'
|
||||||
```
|
---
|
||||||
|
|
||||||
```mermaid-example
|
|
||||||
%%{init: {'theme':'forest'}}%%
|
|
||||||
graph TD
|
|
||||||
a --> b
|
|
||||||
```
|
|
||||||
|
|
||||||
```mermaid
|
|
||||||
%%{init: {'theme':'forest'}}%%
|
|
||||||
graph TD
|
graph TD
|
||||||
a --> b
|
a --> b
|
||||||
```
|
```
|
||||||
@@ -69,30 +63,28 @@ Example of `init` directive setting the `theme` to `forest`:
|
|||||||
|
|
||||||
## Customizing Themes with `themeVariables`
|
## Customizing Themes with `themeVariables`
|
||||||
|
|
||||||
To make a custom theme, modify `themeVariables` via `init`.
|
To make a custom theme, modify `themeVariables` via frontmatter config.
|
||||||
|
|
||||||
You will need to use the [base](#available-themes) theme as it is the only modifiable theme.
|
You will need to use the [base](#available-themes) theme as it is the only modifiable theme.
|
||||||
|
|
||||||
| Parameter | Description | Type | Properties |
|
| Parameter | Description | Type | Properties |
|
||||||
| -------------- | ------------------------------------ | ------ | ----------------------------------------------------------------------------------- |
|
| -------------- | ---------------------------------- | ------ | ----------------------------------------------------------------------------------- |
|
||||||
| themeVariables | Modifiable with the `init` directive | Object | `primaryColor`, `primaryTextColor`, `lineColor` ([see full list](#theme-variables)) |
|
| themeVariables | Modifiable with frontmatter config | Object | `primaryColor`, `primaryTextColor`, `lineColor` ([see full list](#theme-variables)) |
|
||||||
|
|
||||||
Example of modifying `themeVariables` using the `init` directive:
|
Example of modifying `themeVariables` using frontmatter config:
|
||||||
|
|
||||||
```mermaid-example
|
```mermaid-example
|
||||||
%%{
|
---
|
||||||
init: {
|
config:
|
||||||
'theme': 'base',
|
theme: 'base'
|
||||||
'themeVariables': {
|
themeVariables:
|
||||||
'primaryColor': '#BB2528',
|
primaryColor: '#BB2528'
|
||||||
'primaryTextColor': '#fff',
|
primaryTextColor: '#fff'
|
||||||
'primaryBorderColor': '#7C0000',
|
primaryBorderColor: '#7C0000'
|
||||||
'lineColor': '#F8B229',
|
lineColor: '#F8B229'
|
||||||
'secondaryColor': '#006100',
|
secondaryColor: '#006100'
|
||||||
'tertiaryColor': '#fff'
|
tertiaryColor: '#fff'
|
||||||
}
|
---
|
||||||
}
|
|
||||||
}%%
|
|
||||||
graph TD
|
graph TD
|
||||||
A[Christmas] -->|Get money| B(Go shopping)
|
A[Christmas] -->|Get money| B(Go shopping)
|
||||||
B --> C{Let me think}
|
B --> C{Let me think}
|
||||||
@@ -110,79 +102,17 @@ Example of modifying `themeVariables` using the `init` directive:
|
|||||||
```
|
```
|
||||||
|
|
||||||
```mermaid
|
```mermaid
|
||||||
%%{
|
---
|
||||||
init: {
|
config:
|
||||||
'theme': 'base',
|
theme: 'base'
|
||||||
'themeVariables': {
|
themeVariables:
|
||||||
'primaryColor': '#BB2528',
|
primaryColor: '#BB2528'
|
||||||
'primaryTextColor': '#fff',
|
primaryTextColor: '#fff'
|
||||||
'primaryBorderColor': '#7C0000',
|
primaryBorderColor: '#7C0000'
|
||||||
'lineColor': '#F8B229',
|
lineColor: '#F8B229'
|
||||||
'secondaryColor': '#006100',
|
secondaryColor: '#006100'
|
||||||
'tertiaryColor': '#fff'
|
tertiaryColor: '#fff'
|
||||||
}
|
---
|
||||||
}
|
|
||||||
}%%
|
|
||||||
graph TD
|
|
||||||
A[Christmas] -->|Get money| B(Go shopping)
|
|
||||||
B --> C{Let me think}
|
|
||||||
B --> G[/Another/]
|
|
||||||
C ==>|One| D[Laptop]
|
|
||||||
C -->|Two| E[iPhone]
|
|
||||||
C -->|Three| F[fa:fa-car Car]
|
|
||||||
subgraph section
|
|
||||||
C
|
|
||||||
D
|
|
||||||
E
|
|
||||||
F
|
|
||||||
G
|
|
||||||
end
|
|
||||||
```
|
|
||||||
|
|
||||||
```mermaid-example
|
|
||||||
%%{
|
|
||||||
init: {
|
|
||||||
'theme': 'base',
|
|
||||||
'themeVariables': {
|
|
||||||
'primaryColor': '#BB2528',
|
|
||||||
'primaryTextColor': '#fff',
|
|
||||||
'primaryBorderColor': '#7C0000',
|
|
||||||
'lineColor': '#F8B229',
|
|
||||||
'secondaryColor': '#006100',
|
|
||||||
'tertiaryColor': '#fff'
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}%%
|
|
||||||
graph TD
|
|
||||||
A[Christmas] -->|Get money| B(Go shopping)
|
|
||||||
B --> C{Let me think}
|
|
||||||
B --> G[/Another/]
|
|
||||||
C ==>|One| D[Laptop]
|
|
||||||
C -->|Two| E[iPhone]
|
|
||||||
C -->|Three| F[fa:fa-car Car]
|
|
||||||
subgraph section
|
|
||||||
C
|
|
||||||
D
|
|
||||||
E
|
|
||||||
F
|
|
||||||
G
|
|
||||||
end
|
|
||||||
```
|
|
||||||
|
|
||||||
```mermaid
|
|
||||||
%%{
|
|
||||||
init: {
|
|
||||||
'theme': 'base',
|
|
||||||
'themeVariables': {
|
|
||||||
'primaryColor': '#BB2528',
|
|
||||||
'primaryTextColor': '#fff',
|
|
||||||
'primaryBorderColor': '#7C0000',
|
|
||||||
'lineColor': '#F8B229',
|
|
||||||
'secondaryColor': '#006100',
|
|
||||||
'tertiaryColor': '#fff'
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}%%
|
|
||||||
graph TD
|
graph TD
|
||||||
A[Christmas] -->|Get money| B(Go shopping)
|
A[Christmas] -->|Get money| B(Go shopping)
|
||||||
B --> C{Let me think}
|
B --> C{Let me think}
|
||||||
@@ -211,7 +141,7 @@ The theming engine will only recognize hex colors and not color names. So, the v
|
|||||||
| -------------------- | ---------------------------------- | -------------------------------------------------------------------------------------------------------------------------------- |
|
| -------------------- | ---------------------------------- | -------------------------------------------------------------------------------------------------------------------------------- |
|
||||||
| darkMode | false | Affects how derived colors are calculated. Set value to `true` for dark mode. |
|
| darkMode | false | Affects how derived colors are calculated. Set value to `true` for dark mode. |
|
||||||
| background | #f4f4f4 | Used to calculate color for items that should either be background colored or contrasting to the background |
|
| background | #f4f4f4 | Used to calculate color for items that should either be background colored or contrasting to the background |
|
||||||
| fontFamily | trebuchet ms, verdana, arial | |
|
| fontFamily | trebuchet ms, verdana, arial | Font family for diagram text |
|
||||||
| fontSize | 16px | Font size in pixels |
|
| fontSize | 16px | Font size in pixels |
|
||||||
| primaryColor | #fff4dd | Color to be used as background in nodes, other colors will be derived from this |
|
| primaryColor | #fff4dd | Color to be used as background in nodes, other colors will be derived from this |
|
||||||
| primaryTextColor | calculated from darkMode #ddd/#333 | Color to be used as text color in nodes using `primaryColor` |
|
| primaryTextColor | calculated from darkMode #ddd/#333 | Color to be used as text color in nodes using `primaryColor` |
|
||||||
|
@@ -98,6 +98,12 @@ Mermaid can load multiple diagrams, in the same page.
|
|||||||
> Try it out, save this code as HTML and load it using any browser.
|
> Try it out, save this code as HTML and load it using any browser.
|
||||||
> (Except Internet Explorer, please don't use Internet Explorer.)
|
> (Except Internet Explorer, please don't use Internet Explorer.)
|
||||||
|
|
||||||
|
## Tiny Mermaid
|
||||||
|
|
||||||
|
We offer a smaller version of Mermaid that's approximately half the size of the full library. This tiny version doesn't support Mindmap Diagrams, Architecture Diagrams, KaTeX rendering, or lazy loading.
|
||||||
|
|
||||||
|
If you need a more lightweight version without these features, you can use [Mermaid Tiny](https://github.com/mermaid-js/mermaid/tree/develop/packages/tiny).
|
||||||
|
|
||||||
## Enabling Click Event and Tags in Nodes
|
## Enabling Click Event and Tags in Nodes
|
||||||
|
|
||||||
A `securityLevel` configuration has to first be cleared. `securityLevel` sets the level of trust for the parsed diagrams and limits click functionality. This was introduced in version 8.2 as a security improvement, aimed at preventing malicious use.
|
A `securityLevel` configuration has to first be cleared. `securityLevel` sets the level of trust for the parsed diagrams and limits click functionality. This was introduced in version 8.2 as a security improvement, aimed at preventing malicious use.
|
||||||
|
189
docs/diagrams/flowchart-code-flow.mmd
Normal file
189
docs/diagrams/flowchart-code-flow.mmd
Normal file
@@ -0,0 +1,189 @@
|
|||||||
|
---
|
||||||
|
references:
|
||||||
|
- "File: /packages/mermaid/src/diagrams/flowchart/flowDiagram.ts"
|
||||||
|
- "File: /packages/mermaid/src/diagrams/flowchart/flowDb.ts"
|
||||||
|
- "File: /packages/mermaid/src/diagrams/flowchart/flowDetector.ts"
|
||||||
|
- "File: /packages/mermaid/src/diagrams/flowchart/flowDetector-v2.ts"
|
||||||
|
- "File: /packages/mermaid/src/diagrams/flowchart/flowRenderer-v3-unified.ts"
|
||||||
|
- "File: /packages/mermaid/src/diagrams/flowchart/styles.ts"
|
||||||
|
- "File: /packages/mermaid/src/diagrams/flowchart/types.ts"
|
||||||
|
- "File: /packages/mermaid/src/diagrams/flowchart/flowChartShapes.js"
|
||||||
|
- "File: /packages/mermaid/src/diagrams/flowchart/parser/flowParser.ts"
|
||||||
|
- "File: /packages/mermaid/src/diagrams/flowchart/elk/detector.ts"
|
||||||
|
generationTime: 2025-07-23T10:31:53.266Z
|
||||||
|
---
|
||||||
|
flowchart TD
|
||||||
|
%% Entry Points and Detection
|
||||||
|
Input["User Input Text"] --> Detection{Detection Phase}
|
||||||
|
|
||||||
|
Detection --> flowDetector["flowDetector.ts<br/>detector(txt, config)"]
|
||||||
|
Detection --> flowDetectorV2["flowDetector-v2.ts<br/>detector(txt, config)"]
|
||||||
|
Detection --> elkDetector["elk/detector.ts<br/>detector(txt, config)"]
|
||||||
|
|
||||||
|
flowDetector --> |"Checks /^\s*graph/"| DetectLegacy{Legacy Flowchart?}
|
||||||
|
flowDetectorV2 --> |"Checks /^\s*flowchart/"| DetectNew{New Flowchart?}
|
||||||
|
elkDetector --> |"Checks /^\s*flowchart-elk/"| DetectElk{ELK Layout?}
|
||||||
|
|
||||||
|
DetectLegacy --> |Yes| LoadDiagram
|
||||||
|
DetectNew --> |Yes| LoadDiagram
|
||||||
|
DetectElk --> |Yes| LoadDiagram
|
||||||
|
|
||||||
|
%% Loading Phase
|
||||||
|
LoadDiagram["loader() function"] --> flowDiagram["flowDiagram.ts<br/>diagram object"]
|
||||||
|
|
||||||
|
flowDiagram --> DiagramStructure{Diagram Components}
|
||||||
|
DiagramStructure --> Parser["parser: flowParser"]
|
||||||
|
DiagramStructure --> Database["db: new FlowDB()"]
|
||||||
|
DiagramStructure --> Renderer["renderer: flowRenderer-v3-unified"]
|
||||||
|
DiagramStructure --> Styles["styles: flowStyles"]
|
||||||
|
DiagramStructure --> Init["init: (cnf: MermaidConfig)"]
|
||||||
|
|
||||||
|
%% Parser Phase
|
||||||
|
Parser --> flowParser["parser/flowParser.ts<br/>newParser.parse(src)"]
|
||||||
|
flowParser --> |"Preprocesses src"| RemoveWhitespace["Remove trailing whitespace<br/>src.replace(/}\s*\n/g, '}\n')"]
|
||||||
|
RemoveWhitespace --> flowJison["parser/flow.jison<br/>flowJisonParser.parse(newSrc)"]
|
||||||
|
|
||||||
|
flowJison --> ParseGraph["Parse Graph Structure"]
|
||||||
|
ParseGraph --> ParseVertices["Parse Vertices"]
|
||||||
|
ParseGraph --> ParseEdges["Parse Edges"]
|
||||||
|
ParseGraph --> ParseSubgraphs["Parse Subgraphs"]
|
||||||
|
ParseGraph --> ParseClasses["Parse Classes"]
|
||||||
|
ParseGraph --> ParseStyles["Parse Styles"]
|
||||||
|
|
||||||
|
%% Database Phase - FlowDB Class
|
||||||
|
Database --> FlowDBClass["flowDb.ts<br/>FlowDB class"]
|
||||||
|
|
||||||
|
FlowDBClass --> DBInit["constructor()<br/>- Initialize counters<br/>- Bind methods<br/>- Setup toolTips<br/>- Call clear()"]
|
||||||
|
|
||||||
|
DBInit --> DBMethods{FlowDB Methods}
|
||||||
|
|
||||||
|
DBMethods --> addVertex["addVertex(id, textObj, type, style,<br/>classes, dir, props, metadata)"]
|
||||||
|
DBMethods --> addLink["addLink(_start[], _end[], linkData)"]
|
||||||
|
DBMethods --> addSingleLink["addSingleLink(_start, _end, type, id)"]
|
||||||
|
DBMethods --> setDirection["setDirection(dir)"]
|
||||||
|
DBMethods --> addSubGraph["addSubGraph(nodes[], id, title)"]
|
||||||
|
DBMethods --> addClass["addClass(id, style)"]
|
||||||
|
DBMethods --> setClass["setClass(ids, className)"]
|
||||||
|
DBMethods --> setTooltip["setTooltip(ids, tooltip)"]
|
||||||
|
DBMethods --> setClickEvent["setClickEvent(id, functionName, args)"]
|
||||||
|
DBMethods --> setClickFun["setClickFun(id, functionName, args)"]
|
||||||
|
|
||||||
|
%% Vertex Processing
|
||||||
|
addVertex --> VertexProcess{Vertex Processing}
|
||||||
|
VertexProcess --> CreateVertex["Create FlowVertex object<br/>- id, labelType, domId<br/>- styles[], classes[]"]
|
||||||
|
VertexProcess --> SanitizeText["sanitizeText(textObj.text)"]
|
||||||
|
VertexProcess --> ParseMetadata["Parse YAML metadata<br/>yaml.load(yamlData)"]
|
||||||
|
VertexProcess --> SetVertexProps["Set vertex properties<br/>- shape, label, icon, form<br/>- pos, img, constraint, w, h"]
|
||||||
|
|
||||||
|
%% Edge Processing
|
||||||
|
addSingleLink --> EdgeProcess{Edge Processing}
|
||||||
|
EdgeProcess --> CreateEdge["Create FlowEdge object<br/>- start, end, type, text<br/>- labelType, classes[]"]
|
||||||
|
EdgeProcess --> ProcessLinkText["Process link text<br/>- sanitizeText()<br/>- strip quotes"]
|
||||||
|
EdgeProcess --> SetEdgeProps["Set edge properties<br/>- type, stroke, length"]
|
||||||
|
EdgeProcess --> GenerateEdgeId["Generate edge ID<br/>getEdgeId(start, end, counter)"]
|
||||||
|
EdgeProcess --> ValidateEdgeLimit["Validate edge limit<br/>maxEdges check"]
|
||||||
|
|
||||||
|
%% Data Collection
|
||||||
|
DBMethods --> GetData["getData()"]
|
||||||
|
GetData --> CollectNodes["Collect nodes[] from vertices"]
|
||||||
|
GetData --> CollectEdges["Collect edges[] from edges"]
|
||||||
|
GetData --> ProcessSubGraphs["Process subgraphs<br/>- parentDB Map<br/>- subGraphDB Map"]
|
||||||
|
GetData --> AddNodeFromVertex["addNodeFromVertex()<br/>for each vertex"]
|
||||||
|
GetData --> ProcessEdgeTypes["destructEdgeType()<br/>arrowTypeStart, arrowTypeEnd"]
|
||||||
|
|
||||||
|
%% Node Creation
|
||||||
|
AddNodeFromVertex --> NodeCreation{Node Creation}
|
||||||
|
NodeCreation --> FindExistingNode["findNode(nodes, vertex.id)"]
|
||||||
|
NodeCreation --> CreateBaseNode["Create base node<br/>- id, label, parentId<br/>- cssStyles, cssClasses<br/>- shape, domId, tooltip"]
|
||||||
|
NodeCreation --> GetCompiledStyles["getCompiledStyles(classDefs)"]
|
||||||
|
NodeCreation --> GetTypeFromVertex["getTypeFromVertex(vertex)"]
|
||||||
|
|
||||||
|
%% Rendering Phase
|
||||||
|
Renderer --> flowRendererV3["flowRenderer-v3-unified.ts<br/>draw(text, id, version, diag)"]
|
||||||
|
|
||||||
|
flowRendererV3 --> RenderInit["Initialize rendering<br/>- getConfig()<br/>- handle securityLevel<br/>- getDiagramElement()"]
|
||||||
|
|
||||||
|
RenderInit --> GetLayoutData["diag.db.getData()<br/>as LayoutData"]
|
||||||
|
GetLayoutData --> SetupLayoutData["Setup layout data<br/>- type, layoutAlgorithm<br/>- direction, spacing<br/>- markers, diagramId"]
|
||||||
|
|
||||||
|
SetupLayoutData --> CallRender["render(data4Layout, svg)"]
|
||||||
|
CallRender --> SetupViewPort["setupViewPortForSVG(svg, padding)"]
|
||||||
|
SetupViewPort --> ProcessLinks["Process vertex links<br/>- create anchor elements<br/>- handle click events"]
|
||||||
|
|
||||||
|
%% Shape Rendering
|
||||||
|
CallRender --> ShapeSystem["flowChartShapes.js<br/>Shape Functions"]
|
||||||
|
|
||||||
|
ShapeSystem --> ShapeFunctions{Shape Functions}
|
||||||
|
ShapeFunctions --> question["question(parent, bbox, node)"]
|
||||||
|
ShapeFunctions --> hexagon["hexagon(parent, bbox, node)"]
|
||||||
|
ShapeFunctions --> rect_left_inv_arrow["rect_left_inv_arrow(parent, bbox, node)"]
|
||||||
|
ShapeFunctions --> lean_right["lean_right(parent, bbox, node)"]
|
||||||
|
ShapeFunctions --> lean_left["lean_left(parent, bbox, node)"]
|
||||||
|
|
||||||
|
ShapeFunctions --> insertPolygonShape["insertPolygonShape(parent, w, h, points)"]
|
||||||
|
ShapeFunctions --> intersectPolygon["intersectPolygon(node, points, point)"]
|
||||||
|
ShapeFunctions --> intersectRect["intersectRect(node, point)"]
|
||||||
|
|
||||||
|
%% Styling System
|
||||||
|
Styles --> stylesTS["styles.ts<br/>getStyles(options)"]
|
||||||
|
stylesTS --> StyleOptions["FlowChartStyleOptions<br/>- arrowheadColor, border2<br/>- clusterBkg, mainBkg<br/>- fontFamily, textColor"]
|
||||||
|
|
||||||
|
StyleOptions --> GenerateCSS["Generate CSS styles<br/>- .label, .cluster-label<br/>- .node, .edgePath<br/>- .flowchart-link, .edgeLabel"]
|
||||||
|
GenerateCSS --> GetIconStyles["getIconStyles()"]
|
||||||
|
|
||||||
|
%% Type System
|
||||||
|
Parser --> TypeSystem["types.ts<br/>Type Definitions"]
|
||||||
|
TypeSystem --> FlowVertex["FlowVertex interface"]
|
||||||
|
TypeSystem --> FlowEdge["FlowEdge interface"]
|
||||||
|
TypeSystem --> FlowClass["FlowClass interface"]
|
||||||
|
TypeSystem --> FlowSubGraph["FlowSubGraph interface"]
|
||||||
|
TypeSystem --> FlowVertexTypeParam["FlowVertexTypeParam<br/>Shape types"]
|
||||||
|
|
||||||
|
%% Utility Functions
|
||||||
|
DBMethods --> UtilityFunctions{Utility Functions}
|
||||||
|
UtilityFunctions --> lookUpDomId["lookUpDomId(id)"]
|
||||||
|
UtilityFunctions --> getClasses["getClasses()"]
|
||||||
|
UtilityFunctions --> getDirection["getDirection()"]
|
||||||
|
UtilityFunctions --> getVertices["getVertices()"]
|
||||||
|
UtilityFunctions --> getEdges["getEdges()"]
|
||||||
|
UtilityFunctions --> getSubGraphs["getSubGraphs()"]
|
||||||
|
UtilityFunctions --> clear["clear()"]
|
||||||
|
UtilityFunctions --> defaultConfig["defaultConfig()"]
|
||||||
|
|
||||||
|
%% Event Handling
|
||||||
|
ProcessLinks --> EventHandling{Event Handling}
|
||||||
|
EventHandling --> setupToolTips["setupToolTips(element)"]
|
||||||
|
EventHandling --> bindFunctions["bindFunctions(element)"]
|
||||||
|
EventHandling --> runFunc["utils.runFunc(functionName, args)"]
|
||||||
|
|
||||||
|
%% Common Database Functions
|
||||||
|
DBMethods --> CommonDB["commonDb.js functions"]
|
||||||
|
CommonDB --> setAccTitle["setAccTitle()"]
|
||||||
|
CommonDB --> getAccTitle["getAccTitle()"]
|
||||||
|
CommonDB --> setAccDescription["setAccDescription()"]
|
||||||
|
CommonDB --> getAccDescription["getAccDescription()"]
|
||||||
|
CommonDB --> setDiagramTitle["setDiagramTitle()"]
|
||||||
|
CommonDB --> getDiagramTitle["getDiagramTitle()"]
|
||||||
|
CommonDB --> commonClear["clear()"]
|
||||||
|
|
||||||
|
%% Final Output
|
||||||
|
ProcessLinks --> FinalSVG["Final SVG Output"]
|
||||||
|
|
||||||
|
%% Layout Algorithm Selection
|
||||||
|
SetupLayoutData --> LayoutAlgorithm{Layout Algorithm}
|
||||||
|
LayoutAlgorithm --> Dagre["dagre<br/>(default)"]
|
||||||
|
LayoutAlgorithm --> DagreWrapper["dagre-wrapper<br/>(v2 renderer)"]
|
||||||
|
LayoutAlgorithm --> ELK["elk<br/>(external package)"]
|
||||||
|
|
||||||
|
%% Testing Components
|
||||||
|
FlowDBClass --> TestFiles["Test Files"]
|
||||||
|
TestFiles --> flowDbSpec["flowDb.spec.ts"]
|
||||||
|
TestFiles --> flowChartShapesSpec["flowChartShapes.spec.js"]
|
||||||
|
TestFiles --> ParserTests["parser/*.spec.js files<br/>- flow-text.spec.js<br/>- flow-edges.spec.js<br/>- flow-style.spec.js<br/>- subgraph.spec.js"]
|
||||||
|
|
||||||
|
%% Configuration
|
||||||
|
Init --> ConfigSetup["Configuration Setup"]
|
||||||
|
ConfigSetup --> FlowchartConfig["cnf.flowchart config"]
|
||||||
|
ConfigSetup --> ArrowMarkers["arrowMarkerAbsolute"]
|
||||||
|
ConfigSetup --> LayoutConfig["layout config"]
|
||||||
|
ConfigSetup --> SetConfig["setConfig() calls"]
|
307
docs/diagrams/mermaid-api-sequence.mmd
Normal file
307
docs/diagrams/mermaid-api-sequence.mmd
Normal file
@@ -0,0 +1,307 @@
|
|||||||
|
---
|
||||||
|
references:
|
||||||
|
- "File: /packages/mermaid/src/mermaidAPI.ts"
|
||||||
|
- "File: /packages/mermaid/src/mermaid.ts"
|
||||||
|
generationTime: 2025-01-28T16:30:00.000Z
|
||||||
|
---
|
||||||
|
sequenceDiagram
|
||||||
|
participant User as User/Browser
|
||||||
|
participant Mermaid as mermaid.ts
|
||||||
|
participant Queue as executionQueue
|
||||||
|
participant API as mermaidAPI.ts
|
||||||
|
participant Config as configApi
|
||||||
|
participant Preprocessor as preprocessDiagram
|
||||||
|
participant DiagramAPI as diagram-api
|
||||||
|
participant Diagram as Diagram.fromText
|
||||||
|
participant Renderer as diagram.renderer
|
||||||
|
participant Styles as Styling System
|
||||||
|
participant DOM as DOM/SVG
|
||||||
|
|
||||||
|
Note over User, DOM: Mermaid Complete API Flow
|
||||||
|
|
||||||
|
%% Initialization Phase
|
||||||
|
User->>+Mermaid: mermaid.initialize(config)
|
||||||
|
Mermaid->>+API: mermaidAPI.initialize(config)
|
||||||
|
|
||||||
|
API->>API: assignWithDepth({}, userOptions)
|
||||||
|
API->>API: handle legacy fontFamily config
|
||||||
|
API->>Config: saveConfigFromInitialize(options)
|
||||||
|
|
||||||
|
alt Theme Configuration Available
|
||||||
|
API->>API: check if theme in theme object
|
||||||
|
API->>API: set themeVariables from theme
|
||||||
|
else Default Theme
|
||||||
|
API->>API: use default theme variables
|
||||||
|
end
|
||||||
|
|
||||||
|
API->>Config: setSiteConfig(options) or getSiteConfig()
|
||||||
|
API->>API: setLogLevel(config.logLevel)
|
||||||
|
API->>DiagramAPI: addDiagrams()
|
||||||
|
|
||||||
|
API-->>-Mermaid: initialization complete
|
||||||
|
Mermaid-->>-User: ready to render
|
||||||
|
|
||||||
|
%% Content Loaded Event
|
||||||
|
User->>DOM: document.load event
|
||||||
|
DOM->>+Mermaid: contentLoaded()
|
||||||
|
|
||||||
|
opt startOnLoad is true
|
||||||
|
Mermaid->>Config: getConfig()
|
||||||
|
Config-->>Mermaid: { startOnLoad: true }
|
||||||
|
Mermaid->>Mermaid: run()
|
||||||
|
end
|
||||||
|
|
||||||
|
Mermaid-->>-DOM: event handling complete
|
||||||
|
|
||||||
|
%% Main Run Function
|
||||||
|
User->>+Mermaid: mermaid.run(options)
|
||||||
|
|
||||||
|
Mermaid->>Mermaid: runThrowsErrors(options)
|
||||||
|
Mermaid->>Config: getConfig()
|
||||||
|
Config-->>Mermaid: configuration object
|
||||||
|
|
||||||
|
alt nodes provided
|
||||||
|
Mermaid->>Mermaid: use provided nodes
|
||||||
|
else querySelector provided
|
||||||
|
Mermaid->>DOM: document.querySelectorAll(querySelector)
|
||||||
|
DOM-->>Mermaid: nodesToProcess
|
||||||
|
end
|
||||||
|
|
||||||
|
Mermaid->>Mermaid: new InitIDGenerator(deterministicIds, seed)
|
||||||
|
|
||||||
|
loop For each diagram element
|
||||||
|
Mermaid->>DOM: check element.getAttribute('data-processed')
|
||||||
|
|
||||||
|
opt not processed
|
||||||
|
Mermaid->>DOM: element.setAttribute('data-processed', 'true')
|
||||||
|
Mermaid->>Mermaid: generate unique id
|
||||||
|
Mermaid->>DOM: get element.innerHTML
|
||||||
|
Mermaid->>Mermaid: entityDecode and clean text
|
||||||
|
Mermaid->>Mermaid: detectInit(txt)
|
||||||
|
|
||||||
|
Mermaid->>Queue: render(id, txt, element)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
Mermaid-->>-User: processing initiated
|
||||||
|
|
||||||
|
%% Render Function (Queued)
|
||||||
|
activate Queue
|
||||||
|
Queue->>+API: mermaidAPI.render(id, text, container)
|
||||||
|
|
||||||
|
API->>DiagramAPI: addDiagrams()
|
||||||
|
API->>+Preprocessor: processAndSetConfigs(text)
|
||||||
|
|
||||||
|
Preprocessor->>Preprocessor: preprocessDiagram(text)
|
||||||
|
Preprocessor->>Config: reset()
|
||||||
|
Preprocessor->>Config: addDirective(processed.config)
|
||||||
|
Preprocessor-->>-API: { code, config }
|
||||||
|
|
||||||
|
API->>Config: getConfig()
|
||||||
|
Config-->>API: current configuration
|
||||||
|
|
||||||
|
opt text length > maxTextSize
|
||||||
|
API->>API: text = MAX_TEXTLENGTH_EXCEEDED_MSG
|
||||||
|
end
|
||||||
|
|
||||||
|
API->>API: setup id selectors and element IDs
|
||||||
|
API->>API: determine security level (sandbox/loose)
|
||||||
|
|
||||||
|
%% DOM Setup
|
||||||
|
alt svgContainingElement provided
|
||||||
|
alt isSandboxed
|
||||||
|
API->>DOM: sandboxedIframe(select(svgContainingElement), iFrameID)
|
||||||
|
API->>DOM: select iframe contentDocument body
|
||||||
|
else
|
||||||
|
API->>DOM: select(svgContainingElement)
|
||||||
|
end
|
||||||
|
else no container
|
||||||
|
API->>API: removeExistingElements(document, id, divId, iFrameId)
|
||||||
|
alt isSandboxed
|
||||||
|
API->>DOM: sandboxedIframe(select('body'), iFrameID)
|
||||||
|
else
|
||||||
|
API->>DOM: select('body')
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
API->>DOM: appendDivSvgG(root, id, enclosingDivID, fontFamily, XMLNS_XLINK_STD)
|
||||||
|
|
||||||
|
%% Diagram Creation
|
||||||
|
API->>+Diagram: Diagram.fromText(text, { title: processed.title })
|
||||||
|
|
||||||
|
Diagram->>DiagramAPI: detect diagram type
|
||||||
|
Diagram->>DiagramAPI: load appropriate diagram
|
||||||
|
Diagram-->>-API: diagram instance
|
||||||
|
|
||||||
|
opt parsing error occurred
|
||||||
|
API->>+Diagram: Diagram.fromText('error')
|
||||||
|
Diagram-->>-API: error diagram
|
||||||
|
API->>API: store parseEncounteredException
|
||||||
|
end
|
||||||
|
|
||||||
|
%% Style Generation
|
||||||
|
API->>DOM: get svg element and firstChild
|
||||||
|
API->>Renderer: diag.renderer.getClasses(text, diag)
|
||||||
|
Renderer-->>API: diagramClassDefs
|
||||||
|
|
||||||
|
API->>+Styles: createUserStyles(config, diagramType, diagramClassDefs, idSelector)
|
||||||
|
|
||||||
|
Styles->>Styles: createCssStyles(config, classDefs)
|
||||||
|
|
||||||
|
opt config.themeCSS defined
|
||||||
|
Styles->>Styles: append themeCSS
|
||||||
|
end
|
||||||
|
|
||||||
|
opt fontFamily configured
|
||||||
|
Styles->>Styles: add CSS variables for fonts
|
||||||
|
end
|
||||||
|
|
||||||
|
opt classDefs exist
|
||||||
|
loop For each styleClassDef
|
||||||
|
opt has styles
|
||||||
|
Styles->>Styles: cssImportantStyles for each CSS element
|
||||||
|
end
|
||||||
|
opt has textStyles
|
||||||
|
Styles->>Styles: cssImportantStyles for tspan elements
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
Styles->>Styles: getStyles(graphType, userCSSstyles, themeVariables)
|
||||||
|
Styles->>Styles: serialize(compile(svgId{allStyles}), stringify)
|
||||||
|
Styles-->>-API: compiled CSS rules
|
||||||
|
|
||||||
|
API->>DOM: create style element
|
||||||
|
API->>DOM: style.innerHTML = rules
|
||||||
|
API->>DOM: svg.insertBefore(style, firstChild)
|
||||||
|
|
||||||
|
%% Diagram Rendering
|
||||||
|
API->>+Renderer: diag.renderer.draw(text, id, version, diag)
|
||||||
|
|
||||||
|
Renderer->>Renderer: diagram-specific rendering logic
|
||||||
|
Renderer->>DOM: create SVG elements
|
||||||
|
Renderer->>DOM: apply positioning and styling
|
||||||
|
Renderer-->>-API: rendered diagram
|
||||||
|
|
||||||
|
opt rendering error
|
||||||
|
alt suppressErrorRendering
|
||||||
|
API->>API: removeTempElements()
|
||||||
|
API->>Mermaid: throw error
|
||||||
|
else
|
||||||
|
API->>Renderer: errorRenderer.draw(text, id, version)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
%% Accessibility and Cleanup
|
||||||
|
API->>DOM: select svg element
|
||||||
|
API->>Diagram: diag.db.getAccTitle()
|
||||||
|
API->>Diagram: diag.db.getAccDescription()
|
||||||
|
API->>API: addA11yInfo(diagramType, svgNode, a11yTitle, a11yDescr)
|
||||||
|
|
||||||
|
API->>DOM: set xmlns for foreignobject elements
|
||||||
|
API->>DOM: get innerHTML from enclosing div
|
||||||
|
|
||||||
|
API->>+API: cleanUpSvgCode(svgCode, isSandboxed, arrowMarkerAbsolute)
|
||||||
|
|
||||||
|
opt not useArrowMarkerUrls and not sandboxed
|
||||||
|
API->>API: replace marker-end URLs with anchors
|
||||||
|
end
|
||||||
|
|
||||||
|
API->>API: decodeEntities(svgCode)
|
||||||
|
API->>API: replace <br> with <br/>
|
||||||
|
API-->>-API: cleaned SVG code
|
||||||
|
|
||||||
|
alt isSandboxed
|
||||||
|
API->>+API: putIntoIFrame(svgCode, svgEl)
|
||||||
|
API->>API: calculate iframe height
|
||||||
|
API->>API: toBase64 encode SVG content
|
||||||
|
API->>API: create iframe with sandbox attributes
|
||||||
|
API-->>-API: iframe HTML
|
||||||
|
else not loose security
|
||||||
|
API->>API: DOMPurify.sanitize(svgCode, options)
|
||||||
|
end
|
||||||
|
|
||||||
|
API->>API: attachFunctions()
|
||||||
|
API->>API: removeTempElements()
|
||||||
|
|
||||||
|
opt parseEncounteredException
|
||||||
|
API->>Mermaid: throw parseEncounteredException
|
||||||
|
end
|
||||||
|
|
||||||
|
API-->>-Queue: { diagramType, svg: svgCode, bindFunctions }
|
||||||
|
|
||||||
|
%% Return to Web Integration
|
||||||
|
activate Mermaid
|
||||||
|
Queue-->>Mermaid: render result
|
||||||
|
Mermaid->>DOM: element.innerHTML = svg
|
||||||
|
|
||||||
|
opt postRenderCallback
|
||||||
|
Mermaid->>User: postRenderCallback(id)
|
||||||
|
end
|
||||||
|
|
||||||
|
opt bindFunctions exist
|
||||||
|
Mermaid->>DOM: bindFunctions(element)
|
||||||
|
end
|
||||||
|
deactivate Mermaid
|
||||||
|
|
||||||
|
%% Parse Function Flow
|
||||||
|
User->>+Mermaid: mermaid.parse(text, parseOptions)
|
||||||
|
activate Queue
|
||||||
|
|
||||||
|
Queue->>+API: mermaidAPI.parse(text, parseOptions)
|
||||||
|
|
||||||
|
API->>DiagramAPI: addDiagrams()
|
||||||
|
API->>Preprocessor: processAndSetConfigs(text)
|
||||||
|
Preprocessor-->>API: { code, config }
|
||||||
|
API->>Diagram: getDiagramFromText(code)
|
||||||
|
Diagram-->>API: diagram instance
|
||||||
|
API-->>-Queue: { diagramType: diagram.type, config }
|
||||||
|
|
||||||
|
Queue-->>-Mermaid: parse result
|
||||||
|
Mermaid-->>-User: ParseResult or false
|
||||||
|
|
||||||
|
%% External Diagram Registration
|
||||||
|
User->>+Mermaid: registerExternalDiagrams(diagrams, options)
|
||||||
|
|
||||||
|
Mermaid->>DiagramAPI: addDiagrams()
|
||||||
|
Mermaid->>DiagramAPI: registerLazyLoadedDiagrams(...diagrams)
|
||||||
|
|
||||||
|
opt lazyLoad is false
|
||||||
|
Mermaid->>DiagramAPI: loadRegisteredDiagrams()
|
||||||
|
end
|
||||||
|
|
||||||
|
Mermaid-->>-User: registration complete
|
||||||
|
|
||||||
|
%% Error Handling
|
||||||
|
Note over Mermaid, API: Error Handling Throughout
|
||||||
|
alt Error occurs
|
||||||
|
API->>Mermaid: throw error
|
||||||
|
Mermaid->>+Mermaid: handleError(error, errors, parseError)
|
||||||
|
|
||||||
|
Mermaid->>Mermaid: log.warn(error)
|
||||||
|
|
||||||
|
alt isDetailedError
|
||||||
|
Mermaid->>User: parseError(error.str, error.hash)
|
||||||
|
else
|
||||||
|
Mermaid->>User: parseError(error)
|
||||||
|
end
|
||||||
|
|
||||||
|
opt not suppressErrors
|
||||||
|
Mermaid->>User: throw error
|
||||||
|
end
|
||||||
|
|
||||||
|
Mermaid-->>-User: error handled
|
||||||
|
end
|
||||||
|
|
||||||
|
%% Configuration Details
|
||||||
|
Note over Config: Configuration Functions
|
||||||
|
Note right of Config: Functions:<br/>- reset()<br/>- getConfig()<br/>- setConfig()<br/>- getSiteConfig()<br/>- updateSiteConfig()<br/>- saveConfigFromInitialize()
|
||||||
|
|
||||||
|
Note over Styles: CSS Generation
|
||||||
|
Note right of Styles: Features:<br/>- createCssStyles()<br/>- createUserStyles()<br/>- cssImportantStyles()<br/>- Theme integration<br/>- Class definitions
|
||||||
|
|
||||||
|
Note over API: Security Levels
|
||||||
|
Note right of API: Modes:<br/>- sandbox: iframe isolation<br/>- loose: minimal sanitization<br/>- default: DOMPurify sanitization
|
||||||
|
|
||||||
|
Note over API: Helper Functions
|
||||||
|
Note right of API: Utilities:<br/>- cleanUpSvgCode()<br/>- putIntoIFrame()<br/>- appendDivSvgG()<br/>- removeExistingElements()
|
180
docs/diagrams/mindmap-implementation-sequence.mmd
Normal file
180
docs/diagrams/mindmap-implementation-sequence.mmd
Normal file
@@ -0,0 +1,180 @@
|
|||||||
|
---
|
||||||
|
references:
|
||||||
|
- "File: /packages/mermaid/src/diagrams/mindmap/mindmap-definition.ts"
|
||||||
|
- "File: /packages/mermaid/src/diagrams/mindmap/mindmapDb.ts"
|
||||||
|
- "File: /packages/mermaid/src/diagrams/mindmap/detector.ts"
|
||||||
|
- "File: /packages/mermaid/src/diagrams/mindmap/mindmapTypes.ts"
|
||||||
|
- "File: /packages/mermaid/src/diagrams/mindmap/mindmapRenderer.ts"
|
||||||
|
- "File: /packages/mermaid/src/diagrams/mindmap/styles.ts"
|
||||||
|
- "File: /packages/mermaid/src/diagrams/mindmap/svgDraw.ts"
|
||||||
|
generationTime: 2025-01-28T16:00:00.000Z
|
||||||
|
---
|
||||||
|
sequenceDiagram
|
||||||
|
participant User as User Input Text
|
||||||
|
participant Detector as detector.ts
|
||||||
|
participant Loader as DiagramLoader
|
||||||
|
participant Definition as mindmap-definition.ts
|
||||||
|
participant Parser as parser/mindmap.jison
|
||||||
|
participant DB as MindmapDB
|
||||||
|
participant Renderer as mindmapRenderer.ts
|
||||||
|
participant Cytoscape as cytoscape.js
|
||||||
|
participant SVGDraw as svgDraw.ts
|
||||||
|
participant Styles as styles.ts
|
||||||
|
participant Output as Final SVG
|
||||||
|
|
||||||
|
Note over User, Output: Mindmap Implementation Flow
|
||||||
|
|
||||||
|
%% Detection Phase
|
||||||
|
User->>Detector: /^\s*mindmap/ text input
|
||||||
|
activate Detector
|
||||||
|
Detector->>Detector: detector(txt) validates pattern
|
||||||
|
Detector->>Loader: loader() function called
|
||||||
|
deactivate Detector
|
||||||
|
|
||||||
|
activate Loader
|
||||||
|
Loader->>Definition: import mindmap-definition.js
|
||||||
|
deactivate Loader
|
||||||
|
|
||||||
|
%% Core Structure Setup
|
||||||
|
activate Definition
|
||||||
|
Definition->>DB: get db() → new MindmapDB()
|
||||||
|
Definition->>Renderer: setup renderer
|
||||||
|
Definition->>Parser: setup parser
|
||||||
|
Definition->>Styles: setup styles
|
||||||
|
deactivate Definition
|
||||||
|
|
||||||
|
%% Database Initialization
|
||||||
|
activate DB
|
||||||
|
Note over DB: MindmapDB Constructor
|
||||||
|
DB->>DB: initialize nodes array
|
||||||
|
DB->>DB: setup nodeType constants
|
||||||
|
DB->>DB: bind methods
|
||||||
|
DB->>DB: clear() state
|
||||||
|
|
||||||
|
%% Parsing Phase
|
||||||
|
activate Parser
|
||||||
|
User->>Parser: mindmap syntax text
|
||||||
|
|
||||||
|
loop For each node in hierarchy
|
||||||
|
Parser->>DB: addNode(level, id, descr, type)
|
||||||
|
activate DB
|
||||||
|
DB->>DB: sanitizeText(id, descr)
|
||||||
|
DB->>DB: getType(startStr, endStr)
|
||||||
|
Note right of DB: Shape Detection:<br/>[ → RECT<br/>( → ROUNDED_RECT<br/>(( → CIRCLE<br/>)) → BANG<br/>{{ → HEXAGON
|
||||||
|
DB->>DB: getParent(level)
|
||||||
|
DB->>DB: create MindmapNode
|
||||||
|
DB->>DB: add to hierarchy
|
||||||
|
deactivate DB
|
||||||
|
end
|
||||||
|
|
||||||
|
opt Icon/Class Decoration
|
||||||
|
Parser->>DB: decorateNode(decoration)
|
||||||
|
DB->>DB: set icon/class properties
|
||||||
|
end
|
||||||
|
deactivate Parser
|
||||||
|
|
||||||
|
%% Data Preparation
|
||||||
|
Renderer->>DB: getData() for layout
|
||||||
|
activate DB
|
||||||
|
DB->>DB: collect all nodes
|
||||||
|
DB->>DB: build parent-child relationships
|
||||||
|
DB-->>Renderer: return node hierarchy
|
||||||
|
deactivate DB
|
||||||
|
|
||||||
|
%% Rendering Pipeline
|
||||||
|
activate Renderer
|
||||||
|
Note over Renderer: Rendering Phase
|
||||||
|
|
||||||
|
Renderer->>Cytoscape: initialize cytoscape
|
||||||
|
activate Cytoscape
|
||||||
|
|
||||||
|
loop For each node in mindmap
|
||||||
|
Renderer->>Cytoscape: addNodes(mindmap, cy, conf, level)
|
||||||
|
Cytoscape->>Cytoscape: create node data
|
||||||
|
Cytoscape->>Cytoscape: set position (x, y)
|
||||||
|
end
|
||||||
|
|
||||||
|
loop For parent-child relationships
|
||||||
|
Renderer->>Cytoscape: add edges
|
||||||
|
Cytoscape->>Cytoscape: create edge data
|
||||||
|
end
|
||||||
|
|
||||||
|
Renderer->>Cytoscape: configure cose-bilkent layout
|
||||||
|
Cytoscape->>Cytoscape: calculate optimal positions
|
||||||
|
Cytoscape-->>Renderer: return positioned graph
|
||||||
|
deactivate Cytoscape
|
||||||
|
|
||||||
|
%% SVG Generation
|
||||||
|
Renderer->>SVGDraw: drawNodes(db, svg, mindmap, section, conf)
|
||||||
|
activate SVGDraw
|
||||||
|
|
||||||
|
loop For each node recursively
|
||||||
|
SVGDraw->>SVGDraw: select shape function
|
||||||
|
|
||||||
|
alt Default Shape
|
||||||
|
SVGDraw->>SVGDraw: defaultBkg() - rounded rectangle
|
||||||
|
else Rectangle Shape
|
||||||
|
SVGDraw->>SVGDraw: rectBkg() - sharp corners
|
||||||
|
else Circle Shape
|
||||||
|
SVGDraw->>SVGDraw: circleBkg() - perfect circle
|
||||||
|
else Cloud Shape
|
||||||
|
SVGDraw->>SVGDraw: cloudBkg() - organic curves
|
||||||
|
else Bang Shape
|
||||||
|
SVGDraw->>SVGDraw: bangBkg() - explosion style
|
||||||
|
else Hexagon Shape
|
||||||
|
SVGDraw->>SVGDraw: hexagonBkg() - six sides
|
||||||
|
end
|
||||||
|
|
||||||
|
SVGDraw->>SVGDraw: create SVG elements
|
||||||
|
SVGDraw->>SVGDraw: add text labels
|
||||||
|
SVGDraw->>SVGDraw: position node
|
||||||
|
|
||||||
|
opt Node has children
|
||||||
|
SVGDraw->>SVGDraw: drawNodes() recursive call
|
||||||
|
end
|
||||||
|
end
|
||||||
|
deactivate SVGDraw
|
||||||
|
|
||||||
|
%% Edge Rendering
|
||||||
|
Renderer->>Renderer: drawEdges(edgesEl, cy)
|
||||||
|
loop For each edge
|
||||||
|
Renderer->>Renderer: extract edge bounds
|
||||||
|
Renderer->>Renderer: draw SVG path
|
||||||
|
end
|
||||||
|
|
||||||
|
%% Styling Application
|
||||||
|
Renderer->>Styles: getStyles(options)
|
||||||
|
activate Styles
|
||||||
|
|
||||||
|
Styles->>Styles: genSections(options)
|
||||||
|
loop For THEME_COLOR_LIMIT sections
|
||||||
|
Styles->>Styles: generate color scale
|
||||||
|
Styles->>Styles: create CSS rules
|
||||||
|
Note right of Styles: .section-X fills<br/>.edge-depth-X widths<br/>.node-icon-X colors
|
||||||
|
end
|
||||||
|
|
||||||
|
Styles->>Styles: apply theme integration
|
||||||
|
Styles-->>Renderer: return compiled CSS
|
||||||
|
deactivate Styles
|
||||||
|
|
||||||
|
%% Final Assembly
|
||||||
|
Renderer->>Output: selectSvgElement()
|
||||||
|
Renderer->>Output: setupGraphViewbox()
|
||||||
|
Renderer->>Output: apply styles
|
||||||
|
Renderer->>Output: add interactive elements
|
||||||
|
deactivate Renderer
|
||||||
|
|
||||||
|
activate Output
|
||||||
|
Note over Output: Final Mindmap Features
|
||||||
|
Output->>Output: responsive layout
|
||||||
|
Output->>Output: accessibility attributes
|
||||||
|
Output->>Output: hover effects
|
||||||
|
Output->>Output: click handling
|
||||||
|
Output-->>User: rendered mindmap
|
||||||
|
deactivate Output
|
||||||
|
|
||||||
|
%% Configuration Details
|
||||||
|
Note over DB, Styles: Configuration Options
|
||||||
|
Note right of DB: Padding Calculations:<br/>Base padding from config<br/>RECT: ×2 padding<br/>ROUNDED_RECT: ×2 padding<br/>HEXAGON: ×2 padding
|
||||||
|
Note right of Styles: Section Management:<br/>MAX_SECTIONS = 12<br/>Dynamic color generation<br/>Git theme integration
|
||||||
|
Note right of Renderer: Layout Parameters:<br/>Cytoscape configuration<br/>coseBilkent settings<br/>Node spacing rules
|
@@ -40,6 +40,7 @@ To add an integration to this list, see the [Integrations - create page](./integ
|
|||||||
- [Mermaid Charts & Diagrams for Jira](https://marketplace.atlassian.com/apps/1224537/)
|
- [Mermaid Charts & Diagrams for Jira](https://marketplace.atlassian.com/apps/1224537/)
|
||||||
- [Mermaid for Jira Cloud - Draw UML diagrams easily](https://marketplace.atlassian.com/apps/1223053/mermaid-for-jira-cloud-draw-uml-diagrams-easily?hosting=cloud&tab=overview)
|
- [Mermaid for Jira Cloud - Draw UML diagrams easily](https://marketplace.atlassian.com/apps/1223053/mermaid-for-jira-cloud-draw-uml-diagrams-easily?hosting=cloud&tab=overview)
|
||||||
- [CloudScript.io Mermaid Addon](https://marketplace.atlassian.com/apps/1219878/cloudscript-io-mermaid-addon?hosting=cloud&tab=overview)
|
- [CloudScript.io Mermaid Addon](https://marketplace.atlassian.com/apps/1219878/cloudscript-io-mermaid-addon?hosting=cloud&tab=overview)
|
||||||
|
- [Mermaid plus for Confluence](https://marketplace.atlassian.com/apps/1236814/mermaid-plus-for-confluence?hosting=cloud&tab=overview)
|
||||||
- [Azure Devops](https://learn.microsoft.com/en-us/azure/devops/project/wiki/markdown-guidance?view=azure-devops#add-mermaid-diagrams-to-a-wiki-page) ✅
|
- [Azure Devops](https://learn.microsoft.com/en-us/azure/devops/project/wiki/markdown-guidance?view=azure-devops#add-mermaid-diagrams-to-a-wiki-page) ✅
|
||||||
- [Deepdwn](https://billiam.itch.io/deepdwn) ✅
|
- [Deepdwn](https://billiam.itch.io/deepdwn) ✅
|
||||||
- [Doctave](https://www.doctave.com/) ✅
|
- [Doctave](https://www.doctave.com/) ✅
|
||||||
@@ -83,6 +84,7 @@ To add an integration to this list, see the [Integrations - create page](./integ
|
|||||||
LLM integrations to create mermaid diagrams using AI from text descriptions.
|
LLM integrations to create mermaid diagrams using AI from text descriptions.
|
||||||
|
|
||||||
- [HueHive - Create mermaid diagrams with text](https://huehive.co/tools/diagrams)
|
- [HueHive - Create mermaid diagrams with text](https://huehive.co/tools/diagrams)
|
||||||
|
- [MCP Server Mermaid](https://github.com/hustcc/mcp-mermaid) - Generate mermaid diagram and chart with AI MCP dynamically.
|
||||||
|
|
||||||
### CRM/ERP
|
### CRM/ERP
|
||||||
|
|
||||||
@@ -102,6 +104,7 @@ Blogging frameworks and platforms
|
|||||||
- [Mermaid](https://nextra.site/docs/guide/mermaid)
|
- [Mermaid](https://nextra.site/docs/guide/mermaid)
|
||||||
- [WordPress](https://wordpress.org)
|
- [WordPress](https://wordpress.org)
|
||||||
- [MerPRess](https://wordpress.org/plugins/merpress/)
|
- [MerPRess](https://wordpress.org/plugins/merpress/)
|
||||||
|
- [WP Documentation](https://wordpress.org/themes/wp-documentation/)
|
||||||
|
|
||||||
### CMS/ECM
|
### CMS/ECM
|
||||||
|
|
||||||
@@ -114,6 +117,8 @@ Content Management Systems/Enterprise Content Management
|
|||||||
- [Grav CMS](https://getgrav.org/)
|
- [Grav CMS](https://getgrav.org/)
|
||||||
- [Mermaid Diagrams Plugin](https://github.com/DanielFlaum/grav-plugin-mermaid-diagrams)
|
- [Mermaid Diagrams Plugin](https://github.com/DanielFlaum/grav-plugin-mermaid-diagrams)
|
||||||
- [GitLab Markdown Adapter](https://github.com/Goutte/grav-plugin-gitlab-markdown-adapter)
|
- [GitLab Markdown Adapter](https://github.com/Goutte/grav-plugin-gitlab-markdown-adapter)
|
||||||
|
- [Tiki](https://tiki.org)
|
||||||
|
- [Tracker Entity Relationship Diagram](https://doc.tiki.org/Tracker-Entity-Relationship-Diagram)
|
||||||
- [VitePress](https://vitepress.vuejs.org/)
|
- [VitePress](https://vitepress.vuejs.org/)
|
||||||
- [Plugin for Mermaid.js](https://emersonbottero.github.io/vitepress-plugin-mermaid/)
|
- [Plugin for Mermaid.js](https://emersonbottero.github.io/vitepress-plugin-mermaid/)
|
||||||
- [VuePress](https://vuepress.vuejs.org/)
|
- [VuePress](https://vuepress.vuejs.org/)
|
||||||
@@ -242,7 +247,7 @@ Communication tools and platforms
|
|||||||
| GitHub + Mermaid | - | [🦊🔗](https://addons.mozilla.org/firefox/addon/github-mermaid/) | - | - | [🐙🔗](https://github.com/BackMarket/github-mermaid-extension) |
|
| GitHub + Mermaid | - | [🦊🔗](https://addons.mozilla.org/firefox/addon/github-mermaid/) | - | - | [🐙🔗](https://github.com/BackMarket/github-mermaid-extension) |
|
||||||
| Asciidoctor Live Preview | [🎡🔗](https://chromewebstore.google.com/detail/asciidoctorjs-live-previe/iaalpfgpbocpdfblpnhhgllgbdbchmia) | - | - | [🌀🔗](https://microsoftedge.microsoft.com/addons/detail/asciidoctorjs-live-previ/pefkelkanablhjdekgdahplkccnbdggd?hl=en-US) | - |
|
| Asciidoctor Live Preview | [🎡🔗](https://chromewebstore.google.com/detail/asciidoctorjs-live-previe/iaalpfgpbocpdfblpnhhgllgbdbchmia) | - | - | [🌀🔗](https://microsoftedge.microsoft.com/addons/detail/asciidoctorjs-live-previ/pefkelkanablhjdekgdahplkccnbdggd?hl=en-US) | - |
|
||||||
| Diagram Tab | - | - | - | - | [🐙🔗](https://github.com/khafast/diagramtab) |
|
| Diagram Tab | - | - | - | - | [🐙🔗](https://github.com/khafast/diagramtab) |
|
||||||
| Markdown Diagrams | [🎡🔗](https://chromewebstore.google.com/detail/markdown-diagrams/pmoglnmodacnbbofbgcagndelmgaclel) | [🦊🔗](https://addons.mozilla.org/en-US/firefox/addon/markdown-diagrams/) | [🔴🔗](https://addons.opera.com/en/extensions/details/markdown-diagrams/) | [🌀🔗](https://microsoftedge.microsoft.com/addons/detail/markdown-diagrams/hceenoomhhdkjjijnmlclkpenkapfihe) | [🐙🔗](https://github.com/marcozaccari/markdown-diagrams-browser-extension/tree/master/doc/examples) |
|
| Markdown Diagrams | [🎡🔗](https://chromewebstore.google.com/detail/markdown-diagrams/pmoglnmodacnbbofbgcagndelmgaclel) | [🦊🔗](https://addons.mozilla.org/en-US/firefox/addon/markdown-diagrams/) | - | [🌀🔗](https://microsoftedge.microsoft.com/addons/detail/markdown-diagrams/hceenoomhhdkjjijnmlclkpenkapfihe) | [🐙🔗](https://github.com/marcozaccari/markdown-diagrams-browser-extension/tree/master/doc/examples) |
|
||||||
| Markdown Viewer | - | [🦊🔗](https://addons.mozilla.org/en-US/firefox/addon/markdown-viewer-chrome/) | - | - | [🐙🔗](https://github.com/simov/markdown-viewer) |
|
| Markdown Viewer | - | [🦊🔗](https://addons.mozilla.org/en-US/firefox/addon/markdown-viewer-chrome/) | - | - | [🐙🔗](https://github.com/simov/markdown-viewer) |
|
||||||
| Extensions for Mermaid | - | - | [🔴🔗](https://addons.opera.com/en/extensions/details/extensions-for-mermaid/) | - | [🐙🔗](https://github.com/Stefan-S/mermaid-extension) |
|
| Extensions for Mermaid | - | - | [🔴🔗](https://addons.opera.com/en/extensions/details/extensions-for-mermaid/) | - | [🐙🔗](https://github.com/Stefan-S/mermaid-extension) |
|
||||||
| Chrome Diagrammer | [🎡🔗](https://chromewebstore.google.com/detail/chrome-diagrammer/bkpbgjmkomfoakfklcjeoegkklgjnnpk) | - | - | - | - |
|
| Chrome Diagrammer | [🎡🔗](https://chromewebstore.google.com/detail/chrome-diagrammer/bkpbgjmkomfoakfklcjeoegkklgjnnpk) | - | - | - | - |
|
||||||
@@ -267,7 +272,6 @@ Communication tools and platforms
|
|||||||
- [reveal.js-mermaid-plugin](https://github.com/ludwick/reveal.js-mermaid-plugin)
|
- [reveal.js-mermaid-plugin](https://github.com/ludwick/reveal.js-mermaid-plugin)
|
||||||
- [Reveal CK](https://github.com/jedcn/reveal-ck)
|
- [Reveal CK](https://github.com/jedcn/reveal-ck)
|
||||||
- [reveal-ck-mermaid-plugin](https://github.com/tmtm/reveal-ck-mermaid-plugin)
|
- [reveal-ck-mermaid-plugin](https://github.com/tmtm/reveal-ck-mermaid-plugin)
|
||||||
- [mermaid-isomorphic](https://github.com/remcohaszing/mermaid-isomorphic)
|
- [Vitepress Plugin](https://github.com/sametcn99/vitepress-mermaid-renderer)
|
||||||
- [mermaid-server: Generate diagrams using a HTTP request](https://github.com/TomWright/mermaid-server)
|
|
||||||
|
|
||||||
<!--- cspell:ignore Blazorade HueHive --->
|
<!--- cspell:ignore Blazorade HueHive --->
|
||||||
|
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user