From 3dd6107e7640394b90df16e49779dc93c77644d1 Mon Sep 17 00:00:00 2001 From: Anthony Juckel Date: Mon, 3 Mar 2025 14:58:17 -0600 Subject: [PATCH 001/143] fix: Allow equals sign in sequenceDiagram labels --- .../sequence/parser/sequenceDiagram.jison | 4 ++-- .../diagrams/sequence/sequenceDiagram.spec.js | 20 +++++++++++++++++++ 2 files changed, 22 insertions(+), 2 deletions(-) diff --git a/packages/mermaid/src/diagrams/sequence/parser/sequenceDiagram.jison b/packages/mermaid/src/diagrams/sequence/parser/sequenceDiagram.jison index 11b39d232..784aff82f 100644 --- a/packages/mermaid/src/diagrams/sequence/parser/sequenceDiagram.jison +++ b/packages/mermaid/src/diagrams/sequence/parser/sequenceDiagram.jison @@ -33,7 +33,7 @@ "actor" { this.begin('ID'); return 'participant_actor'; } "create" return 'create'; "destroy" { this.begin('ID'); return 'destroy'; } -[^\<->\->:\n,;]+?([\-]*[^\<->\->:\n,;]+?)*?(?=((?!\n)\s)+"as"(?!\n)\s|[#\n;]|$) { yytext = yytext.trim(); this.begin('ALIAS'); return 'ACTOR'; } +[^<\->\->:\n,;]+?([\-]*[^<\->\->:\n,;]+?)*?(?=((?!\n)\s)+"as"(?!\n)\s|[#\n;]|$) { yytext = yytext.trim(); this.begin('ALIAS'); return 'ACTOR'; } "as" { this.popState(); this.popState(); this.begin('LINE'); return 'AS'; } (?:) { this.popState(); this.popState(); return 'NEWLINE'; } "loop" { this.begin('LINE'); return 'loop'; } @@ -73,7 +73,7 @@ accDescr\s*"{"\s* { this.begin("acc_descr_multili "off" return 'off'; "," return ','; ";" return 'NEWLINE'; -[^\+\<->\->:\n,;]+((?!(\-x|\-\-x|\-\)|\-\-\)))[\-]*[^\+\<->\->:\n,;]+)* { yytext = yytext.trim(); return 'ACTOR'; } +[^+<\->\->:\n,;]+((?!(\-x|\-\-x|\-\)|\-\-\)))[\-]*[^\+<\->\->:\n,;]+)* { yytext = yytext.trim(); return 'ACTOR'; } "->>" return 'SOLID_ARROW'; "<<->>" return 'BIDIRECTIONAL_SOLID_ARROW'; "-->>" return 'DOTTED_ARROW'; diff --git a/packages/mermaid/src/diagrams/sequence/sequenceDiagram.spec.js b/packages/mermaid/src/diagrams/sequence/sequenceDiagram.spec.js index 1fb35bce6..1610bd72a 100644 --- a/packages/mermaid/src/diagrams/sequence/sequenceDiagram.spec.js +++ b/packages/mermaid/src/diagrams/sequence/sequenceDiagram.spec.js @@ -350,6 +350,26 @@ Bob-->Alice-in-Wonderland:I am good thanks!`); expect(messages[1].from).toBe('Bob'); }); + it('should handle equals in participant names', async () => { + const diagram = await Diagram.fromText(` +sequenceDiagram +participant Alice=Wonderland +participant Bob +Alice=Wonderland->Bob:Hello Bob, how are - you? +Bob-->Alice=Wonderland:I am good thanks!`); + + const actors = diagram.db.getActors(); + expect([...actors.keys()]).toEqual(['Alice=Wonderland', 'Bob']); + expect(actors.get('Alice=Wonderland').description).toBe('Alice=Wonderland'); + expect(actors.get('Bob').description).toBe('Bob'); + + const messages = diagram.db.getMessages(); + + expect(messages.length).toBe(2); + expect(messages[0].from).toBe('Alice=Wonderland'); + expect(messages[1].from).toBe('Bob'); + }); + it('should alias participants', async () => { const diagram = await Diagram.fromText(` sequenceDiagram From 6cc192680a2531cab28f87a8061a53b786e010f3 Mon Sep 17 00:00:00 2001 From: Anthony Juckel Date: Mon, 3 Mar 2025 15:09:17 -0600 Subject: [PATCH 002/143] Added changeset --- .changeset/red-zebras-happen.md | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 .changeset/red-zebras-happen.md diff --git a/.changeset/red-zebras-happen.md b/.changeset/red-zebras-happen.md new file mode 100644 index 000000000..cadf3d0fb --- /dev/null +++ b/.changeset/red-zebras-happen.md @@ -0,0 +1,5 @@ +--- +'mermaid': patch +--- + +fix: Allow equals sign in sequenceDiagram labels From 83b9a1727788e41b4819ee3e9124c442794e40f1 Mon Sep 17 00:00:00 2001 From: darshanr0107 Date: Thu, 12 Jun 2025 18:13:11 +0530 Subject: [PATCH 003/143] fix: prevent pie chart crash on zero or negative values --- cypress/platform/darshan.html | 35 +++++++++++++++++++ docs/syntax/pie.md | 5 +++ packages/mermaid/src/diagrams/pie/pie.spec.ts | 18 ++++++++++ packages/mermaid/src/diagrams/pie/pieDb.ts | 11 ++++++ packages/mermaid/src/docs/syntax/pie.md | 5 +++ .../parser/src/language/common/common.langium | 4 +-- 6 files changed, 76 insertions(+), 2 deletions(-) create mode 100644 cypress/platform/darshan.html diff --git a/cypress/platform/darshan.html b/cypress/platform/darshan.html new file mode 100644 index 000000000..df5994d7d --- /dev/null +++ b/cypress/platform/darshan.html @@ -0,0 +1,35 @@ + + + + + + Mermaid Quick Test Page + + + + + +

Pie chart demos

+
+     pie title Default text position: Animal adoption
+        accTitle: simple pie char demo
+        accDescr: pie chart with 3 sections: dogs, cats, rats. Most are dogs.
+         "dogs" : -60.67
+        "rats" : 40.12
+    
+ +
+ + + diff --git a/docs/syntax/pie.md b/docs/syntax/pie.md index b8f452b66..87fb3fc58 100644 --- a/docs/syntax/pie.md +++ b/docs/syntax/pie.md @@ -37,6 +37,11 @@ Drawing a pie chart is really simple in mermaid. - Followed by `:` colon as separator - Followed by `positive numeric value` (supported up to two decimal places) +**Note:** + +> Pie chart values must be **positive numbers greater than zero**.\ +> **Zero and negative values are not allowed** and will result in an error. + \[pie] \[showData] (OPTIONAL) \[title] \[titlevalue] (OPTIONAL) "\[datakey1]" : \[dataValue1] diff --git a/packages/mermaid/src/diagrams/pie/pie.spec.ts b/packages/mermaid/src/diagrams/pie/pie.spec.ts index f00906cc5..2b50f5604 100644 --- a/packages/mermaid/src/diagrams/pie/pie.spec.ts +++ b/packages/mermaid/src/diagrams/pie/pie.spec.ts @@ -139,6 +139,24 @@ describe('pie', () => { }).rejects.toThrowError(); }); + it('should handle simple pie with zero slice value', async () => { + await expect(async () => { + await parser.parse(`pie + "ash" : 0 + "bat" : 40.12 + `); + }).rejects.toThrowError(); + }); + + it('should handle simple pie with negative slice value', async () => { + await expect(async () => { + await parser.parse(`pie + "ash" : -60 + "bat" : 40.12 + `); + }).rejects.toThrowError(); + }); + it('should handle unsafe properties', async () => { await expect( parser.parse(`pie title Unsafe props test diff --git a/packages/mermaid/src/diagrams/pie/pieDb.ts b/packages/mermaid/src/diagrams/pie/pieDb.ts index 64831495c..87735b84e 100644 --- a/packages/mermaid/src/diagrams/pie/pieDb.ts +++ b/packages/mermaid/src/diagrams/pie/pieDb.ts @@ -34,6 +34,17 @@ const clear = (): void => { }; const addSection = ({ label, value }: D3Section): void => { + if (value <= 0) { + const error: any = new Error( + `Section "${label}" has invalid value: ${value}. Zero and negative values are not allowed in pie charts. All slice values must be > 0` + ); + error.hash = { + text: `pie "${label}": ${value}`, + token: `${value}`, + expected: ['a positive number (> 0)'], + }; + throw error; + } if (!sections.has(label)) { sections.set(label, value); log.debug(`added new section: ${label}, with value: ${value}`); diff --git a/packages/mermaid/src/docs/syntax/pie.md b/packages/mermaid/src/docs/syntax/pie.md index 2e7a1799a..4ad0dc4e0 100644 --- a/packages/mermaid/src/docs/syntax/pie.md +++ b/packages/mermaid/src/docs/syntax/pie.md @@ -24,6 +24,11 @@ Drawing a pie chart is really simple in mermaid. - Followed by `:` colon as separator - Followed by `positive numeric value` (supported up to two decimal places) +**Note:** + +> Pie chart values must be **positive numbers greater than zero**. +> **Zero and negative values are not allowed** and will result in an error. + [pie] [showData] (OPTIONAL) [title] [titlevalue] (OPTIONAL) "[datakey1]" : [dataValue1] diff --git a/packages/parser/src/language/common/common.langium b/packages/parser/src/language/common/common.langium index b74ffc34d..e6d3d488f 100644 --- a/packages/parser/src/language/common/common.langium +++ b/packages/parser/src/language/common/common.langium @@ -17,8 +17,8 @@ terminal ACC_DESCR: /[\t ]*accDescr(?:[\t ]*:([^\n\r]*?(?=%%)|[^\n\r]*)|\s*{([^} terminal ACC_TITLE: /[\t ]*accTitle[\t ]*:(?:[^\n\r]*?(?=%%)|[^\n\r]*)/; terminal TITLE: /[\t ]*title(?:[\t ][^\n\r]*?(?=%%)|[\t ][^\n\r]*|)/; -terminal FLOAT returns number: /[0-9]+\.[0-9]+(?!\.)/; -terminal INT returns number: /0|[1-9][0-9]*(?!\.)/; +terminal FLOAT returns number: /-?[0-9]+\.[0-9]+(?!\.)/; +terminal INT returns number: /-?(0|[1-9][0-9]*)(?!\.)/; terminal NUMBER returns number: FLOAT | INT; terminal STRING returns string: /"([^"\\]|\\.)*"|'([^'\\]|\\.)*'/; From 9da6fb39ae278401771943ac85d6d1b875f78cf1 Mon Sep 17 00:00:00 2001 From: darshanr0107 Date: Thu, 12 Jun 2025 19:18:36 +0530 Subject: [PATCH 004/143] added changeset --- .changeset/seven-papayas-film.md | 9 +++++++++ 1 file changed, 9 insertions(+) create mode 100644 .changeset/seven-papayas-film.md diff --git a/.changeset/seven-papayas-film.md b/.changeset/seven-papayas-film.md new file mode 100644 index 000000000..109743117 --- /dev/null +++ b/.changeset/seven-papayas-film.md @@ -0,0 +1,9 @@ +--- +'mermaid': patch +--- + +Add validation for negative values in pie charts: + +Prevents crashes during parsing by validating values post-parsing. + +Provides clearer, user-friendly error messages for invalid negative inputs. From ea60525988918dcfb110fbbf0291132af399943e Mon Sep 17 00:00:00 2001 From: darshanr0107 Date: Fri, 13 Jun 2025 19:33:43 +0530 Subject: [PATCH 005/143] remove beta suffix from xyChart --- cypress/integration/rendering/xyChart.spec.js | 77 ++++++------ demos/xychart.html | 22 ++-- docs/syntax/xyChart.md | 16 +-- .../src/diagrams/xychart/parser/xychart.jison | 1 + .../xychart/parser/xychart.jison.spec.ts | 111 +++++++++--------- .../src/diagrams/xychart/xychartDetector.ts | 2 +- packages/mermaid/src/docs/syntax/xyChart.md | 12 +- packages/mermaid/src/mermaidAPI.spec.ts | 1 + 8 files changed, 124 insertions(+), 118 deletions(-) diff --git a/cypress/integration/rendering/xyChart.spec.js b/cypress/integration/rendering/xyChart.spec.js index a582355e8..d54086fa7 100644 --- a/cypress/integration/rendering/xyChart.spec.js +++ b/cypress/integration/rendering/xyChart.spec.js @@ -1,7 +1,7 @@ import { imgSnapshotTest, renderGraph } from '../../helpers/util.ts'; describe('XY Chart', () => { - it('should render the simplest possible chart', () => { + it('should render the simplest possible xy-beta chart', () => { imgSnapshotTest( ` xychart-beta @@ -10,10 +10,19 @@ describe('XY Chart', () => { {} ); }); + it('should render the simplest possible xy chart', () => { + imgSnapshotTest( + ` + xychart + line [10, 30, 20] + `, + {} + ); + }); it('Should render a complete chart', () => { imgSnapshotTest( ` - xychart-beta + xychart title "Sales Revenue" x-axis Months [jan, feb, mar, apr, may, jun, jul, aug, sep, oct, nov, dec] y-axis "Revenue (in $)" 4000 --> 11000 @@ -26,7 +35,7 @@ describe('XY Chart', () => { it('Should render a chart without title', () => { imgSnapshotTest( ` - xychart-beta + xychart 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] @@ -38,7 +47,7 @@ describe('XY Chart', () => { it('y-axis title not required', () => { imgSnapshotTest( ` - xychart-beta + xychart x-axis Months [jan, feb, mar, apr, may, jun, jul, aug, sep, oct, nov, dec] y-axis 4000 --> 11000 bar [5000, 6000, 7500, 8200, 9500, 10500, 11000, 10200, 9200, 8500, 7000, 6000] @@ -50,7 +59,7 @@ describe('XY Chart', () => { it('Should render a chart without y-axis with different range', () => { imgSnapshotTest( ` - xychart-beta + xychart x-axis Months [jan, feb, mar, apr, may, jun, jul, aug, sep, oct, nov, dec] bar [5000, 6000, 7500, 8200, 9500, 10500, 14000, 3200, 9200, 9900, 3400, 6000] line [2000, 7000, 6500, 9200, 9500, 7500, 11000, 10200, 3200, 8500, 7000, 8800] @@ -61,7 +70,7 @@ describe('XY Chart', () => { it('x axis title not required', () => { imgSnapshotTest( ` - xychart-beta + xychart x-axis [jan, feb, mar, apr, may, jun, jul, aug, sep, oct, nov, dec] bar [5000, 6000, 7500, 8200, 9500, 10500, 14000, 3200, 9200, 9900, 3400, 6000] line [2000, 7000, 6500, 9200, 9500, 7500, 11000, 10200, 3200, 8500, 7000, 8800] @@ -72,7 +81,7 @@ describe('XY Chart', () => { it('Multiple plots can be rendered', () => { imgSnapshotTest( ` - xychart-beta + xychart line [23, 46, 77, 34] line [45, 32, 33, 12] bar [87, 54, 99, 85] @@ -86,7 +95,7 @@ describe('XY Chart', () => { it('Decimals and negative numbers are supported', () => { imgSnapshotTest( ` - xychart-beta + xychart y-axis -2.4 --> 3.5 line [+1.3, .6, 2.4, -.34] `, @@ -104,7 +113,7 @@ describe('XY Chart', () => { height: 20 plotReservedSpacePercent: 100 --- - xychart-beta + xychart line [5000, 9000, 7500, 6200, 9500, 5500, 11000, 8200, 9200, 9500, 7000, 8800] `, {} @@ -130,7 +139,7 @@ describe('XY Chart', () => { showTick: false showAxisLine: false --- - xychart-beta + xychart bar [5000, 9000, 7500, 6200, 9500, 5500, 11000, 8200, 9200, 9500, 7000, 8800] `, {} @@ -140,7 +149,7 @@ describe('XY Chart', () => { imgSnapshotTest( ` %%{init: {"xyChart": {"width": 1000, "height": 600, "titlePadding": 5, "titleFontSize": 10, "xAxis": {"labelFontSize": "20", "labelPadding": 10, "titleFontSize": 30, "titlePadding": 20, "tickLength": 10, "tickWidth": 5}, "yAxis": {"labelFontSize": "20", "labelPadding": 10, "titleFontSize": 30, "titlePadding": 20, "tickLength": 10, "tickWidth": 5}, "plotBorderWidth": 5, "chartOrientation": "horizontal", "plotReservedSpacePercent": 60 }}}%% - xychart-beta + xychart title "Sales Revenue" x-axis Months [jan, feb, mar, apr, may, jun, jul, aug, sep, oct, nov, dec] y-axis "Revenue (in $)" 4000 --> 11000 @@ -181,7 +190,7 @@ describe('XY Chart', () => { plotReservedSpacePercent: 60 showDataLabel: true --- - xychart-beta + xychart title "Sales Revenue" x-axis Months [jan, feb, mar, apr, may, jun, jul, aug, sep, oct, nov, dec] y-axis "Revenue (in $)" 4000 --> 11000 @@ -202,7 +211,7 @@ describe('XY Chart', () => { yAxis: showTitle: false --- - xychart-beta + xychart title "Sales Revenue" x-axis Months [jan, feb, mar, apr, may, jun, jul, aug, sep, oct, nov, dec] y-axis "Revenue (in $)" 4000 --> 11000 @@ -223,7 +232,7 @@ describe('XY Chart', () => { yAxis: showLabel: false --- - xychart-beta + xychart title "Sales Revenue" x-axis Months [jan, feb, mar, apr, may, jun, jul, aug, sep, oct, nov, dec] y-axis "Revenue (in $)" 4000 --> 11000 @@ -244,7 +253,7 @@ describe('XY Chart', () => { yAxis: showTick: false --- - xychart-beta + xychart title "Sales Revenue" x-axis Months [jan, feb, mar, apr, may, jun, jul, aug, sep, oct, nov, dec] y-axis "Revenue (in $)" 4000 --> 11000 @@ -265,7 +274,7 @@ describe('XY Chart', () => { yAxis: showAxisLine: false --- - xychart-beta + xychart title "Sales Revenue" x-axis Months [jan, feb, mar, apr, may, jun, jul, aug, sep, oct, nov, dec] y-axis "Revenue (in $)" 4000 --> 11000 @@ -294,7 +303,7 @@ describe('XY Chart', () => { xAxisLineColor: "#87ceeb" plotColorPalette: "#008000, #faba63" --- - xychart-beta + xychart title "Sales Revenue" x-axis Months [jan, feb, mar, apr, may, jun, jul, aug, sep, oct, nov, dec] y-axis "Revenue (in $)" 4000 --> 11000 @@ -307,7 +316,7 @@ describe('XY Chart', () => { it('should use the correct distances between data points', () => { imgSnapshotTest( ` - xychart-beta + xychart x-axis 0 --> 2 line [0, 1, 0, 1] bar [1, 0, 1, 0] @@ -325,7 +334,7 @@ describe('XY Chart', () => { xyChart: showDataLabel: true --- - xychart-beta + xychart title "Sales Revenue" x-axis Months [jan, feb, mar, apr, may, jun, jul, aug, sep, oct, nov, dec] y-axis "Revenue (in $)" 4000 --> 11000 @@ -344,7 +353,7 @@ describe('XY Chart', () => { showDataLabel: true chartOrientation: horizontal --- - xychart-beta + xychart title "Sales Revenue" x-axis Months [jan, feb, mar, apr, may, jun, jul, aug, sep, oct, nov, dec] y-axis "Revenue (in $)" 4000 --> 11000 @@ -357,7 +366,7 @@ describe('XY Chart', () => { it('should render vertical bar chart without labels by default', () => { imgSnapshotTest( ` - xychart-beta + xychart title "Sales Revenue" x-axis Months [jan, feb, mar, apr, may, jun, jul, aug, sep, oct, nov, dec] y-axis "Revenue (in $)" 4000 --> 11000 @@ -375,7 +384,7 @@ describe('XY Chart', () => { xyChart: chartOrientation: horizontal --- - xychart-beta + xychart title "Sales Revenue" x-axis Months [jan, feb, mar, apr, may, jun, jul, aug, sep, oct, nov, dec] y-axis "Revenue (in $)" 4000 --> 11000 @@ -393,7 +402,7 @@ describe('XY Chart', () => { xyChart: showDataLabel: true --- - xychart-beta + xychart title "Multiple Bar Plots" x-axis Categories [A, B, C] y-axis "Values" 0 --> 100 @@ -412,7 +421,7 @@ describe('XY Chart', () => { showDataLabel: true chartOrientation: horizontal --- - xychart-beta + xychart title "Multiple Bar Plots" x-axis Categories [A, B, C] y-axis "Values" 0 --> 100 @@ -430,7 +439,7 @@ describe('XY Chart', () => { xyChart: showDataLabel: true --- - xychart-beta + xychart title "Single Bar Chart" x-axis Categories [A] y-axis "Value" 0 --> 100 @@ -449,7 +458,7 @@ describe('XY Chart', () => { showDataLabel: true chartOrientation: horizontal --- - xychart-beta + xychart title "Single Bar Chart" x-axis Categories [A] y-axis "Value" 0 --> 100 @@ -467,7 +476,7 @@ describe('XY Chart', () => { xyChart: showDataLabel: true --- - xychart-beta + xychart title "Decimal and Negative Values" x-axis Categories [A, B, C] y-axis -10 --> 10 @@ -486,7 +495,7 @@ describe('XY Chart', () => { showDataLabel: true chartOrientation: horizontal --- - xychart-beta + xychart title "Decimal and Negative Values" x-axis Categories [A, B, C] y-axis -10 --> 10 @@ -504,7 +513,7 @@ describe('XY Chart', () => { xyChart: showDataLabel: true --- - xychart-beta + xychart title "Sales Revenue" x-axis Months [jan,b,c] y-axis "Revenue (in $)" 4000 --> 12000 @@ -561,7 +570,7 @@ describe('XY Chart', () => { showDataLabel: true chartOrientation: horizontal --- - xychart-beta + xychart title "Sales Revenue" x-axis Months [jan,b,c] y-axis "Revenue (in $)" 4000 --> 12000 @@ -615,7 +624,7 @@ describe('XY Chart', () => { xyChart: showDataLabel: true --- - xychart-beta + xychart 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 @@ -672,7 +681,7 @@ describe('XY Chart', () => { showDataLabel: true chartOrientation: horizontal --- - xychart-beta + xychart 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 @@ -726,7 +735,7 @@ describe('XY Chart', () => { xyChart: showDataLabel: true --- - xychart-beta + xychart title "Sales Revenue" x-axis Months [jan] y-axis "Revenue (in $)" 3000 --> 12000 @@ -783,7 +792,7 @@ describe('XY Chart', () => { showDataLabel: true chartOrientation: horizontal --- - xychart-beta + xychart title "Sales Revenue" x-axis Months [jan] y-axis "Revenue (in $)" 3000 --> 12000 diff --git a/demos/xychart.html b/demos/xychart.html index 25f8ec8ca..5706b15ea 100644 --- a/demos/xychart.html +++ b/demos/xychart.html @@ -16,7 +16,7 @@

XY Charts demos

-    xychart-beta
+    xychart
     title "Sales Revenue (in $)"
     x-axis [jan, feb, mar, apr, may, jun, jul, aug, sep, oct, nov, dec]
     y-axis "Revenue (in $)" 4000 --> 11000
@@ -26,7 +26,7 @@
     

XY Charts horizontal

-    xychart-beta horizontal
+    xychart horizontal
     title "Basic xychart"
     x-axis "this is x axis" [category1, "category 2", category3, category4]
     y-axis yaxisText 10 --> 150
@@ -36,7 +36,7 @@
     

XY Charts only lines and bar

-    xychart-beta
+    xychart
     line [23, 46, 77, 34]
     line [45, 32, 33, 12]
     line [87, 54, 99, 85]
@@ -48,13 +48,13 @@
     

XY Charts with +ve and -ve numbers

-    xychart-beta
+    xychart
     line [+1.3, .6, 2.4, -.34]
     

XY Charts Bar with multiple category

-    xychart-beta
+    xychart
     title "Basic xychart with many categories"
     x-axis "this is x axis" [category1, "category 2", category3, category4, category5, category6, category7]
     y-axis yaxisText 10 --> 150
@@ -63,7 +63,7 @@
 
     

XY Charts line with multiple category

-    xychart-beta
+    xychart
     title "Line chart with many category"
     x-axis "this is x axis" [category1, "category 2", category3, category4, category5, category6, category7]
     y-axis yaxisText 10 --> 150
@@ -72,7 +72,7 @@
 
     

XY Charts category with large text

-    xychart-beta
+    xychart
     title "Basic xychart with many categories with category overlap"
     x-axis "this is x axis" [category1, "Lorem ipsum dolor sit amet, qui minim labore adipisicing minim sint cillum sint consectetur cupidatat.", category3, category4, category5, category6, category7]
     y-axis yaxisText 10 --> 150
@@ -89,7 +89,7 @@ config:
     height: 20
     plotReservedSpacePercent: 100
 ---
-    xychart-beta
+    xychart
       line [5000, 9000, 7500, 6200, 9500, 5500, 11000, 8200, 9200, 9500, 7000, 8800]
     
@@ -103,7 +103,7 @@ config: height: 20 plotReservedSpacePercent: 100 --- - xychart-beta + xychart bar [5000, 9000, 7500, 6200, 9500, 5500, 11000, 8200, 9200, 9500, 7000, 8800]
@@ -136,7 +136,7 @@ config: chartOrientation: horizontal plotReservedSpacePercent: 60 --- - xychart-beta + xychart title "Sales Revenue" x-axis Months [jan, feb, mar, apr, may, jun, jul, aug, sep, oct, nov, dec] y-axis "Revenue (in $)" 4000 --> 11000 @@ -162,7 +162,7 @@ config: xAxisLineColor: "#87ceeb" plotColorPalette: "#008000, #faba63" --- - xychart-beta + xychart title "Sales Revenue" x-axis Months [jan, feb, mar, apr, may, jun, jul, aug, sep, oct, nov, dec] y-axis "Revenue (in $)" 4000 --> 11000 diff --git a/docs/syntax/xyChart.md b/docs/syntax/xyChart.md index dd64f742d..dec16a518 100644 --- a/docs/syntax/xyChart.md +++ b/docs/syntax/xyChart.md @@ -13,7 +13,7 @@ ## Example ```mermaid-example -xychart-beta +xychart title "Sales Revenue" x-axis [jan, feb, mar, apr, may, jun, jul, aug, sep, oct, nov, dec] y-axis "Revenue (in $)" 4000 --> 11000 @@ -22,7 +22,7 @@ xychart-beta ``` ```mermaid -xychart-beta +xychart title "Sales Revenue" x-axis [jan, feb, mar, apr, may, jun, jul, aug, sep, oct, nov, dec] y-axis "Revenue (in $)" 4000 --> 11000 @@ -40,7 +40,7 @@ xychart-beta The chart can be drawn horizontal or vertical, default value is vertical. ``` -xychart-beta horizontal +xychart horizontal ... ``` @@ -51,7 +51,7 @@ The title is a short description of the chart and it will always render on top o #### Example ``` -xychart-beta +xychart title "This is a simple example" ... ``` @@ -98,10 +98,10 @@ A bar chart offers the capability to graphically depict bars. #### Simplest example -The only two things required are the chart name (`xychart-beta`) and one data set. So you will be able to draw a chart with a simple config like +The only two things required are the chart name (`xychart`) and one data set. So you will be able to draw a chart with a simple config like ``` -xychart-beta +xychart line [+1.3, .6, 2.4, -.34] ``` @@ -176,7 +176,7 @@ config: xyChart: titleColor: "#ff0000" --- -xychart-beta +xychart title "Sales Revenue" x-axis [jan, feb, mar, apr, may, jun, jul, aug, sep, oct, nov, dec] y-axis "Revenue (in $)" 4000 --> 11000 @@ -195,7 +195,7 @@ config: xyChart: titleColor: "#ff0000" --- -xychart-beta +xychart title "Sales Revenue" x-axis [jan, feb, mar, apr, may, jun, jul, aug, sep, oct, nov, dec] y-axis "Revenue (in $)" 4000 --> 11000 diff --git a/packages/mermaid/src/diagrams/xychart/parser/xychart.jison b/packages/mermaid/src/diagrams/xychart/parser/xychart.jison index 987132d17..8a47b1aac 100644 --- a/packages/mermaid/src/diagrams/xychart/parser/xychart.jison +++ b/packages/mermaid/src/diagrams/xychart/parser/xychart.jison @@ -29,6 +29,7 @@ "{" { this.popState(); } [^\}]* { return "acc_descr_multiline_value"; } +"xychart" {return 'XYCHART';} "xychart-beta" {return 'XYCHART';} (?:"vertical"|"horizontal") {return 'CHART_ORIENTATION'} diff --git a/packages/mermaid/src/diagrams/xychart/parser/xychart.jison.spec.ts b/packages/mermaid/src/diagrams/xychart/parser/xychart.jison.spec.ts index d7de15f66..ee7c94581 100644 --- a/packages/mermaid/src/diagrams/xychart/parser/xychart.jison.spec.ts +++ b/packages/mermaid/src/diagrams/xychart/parser/xychart.jison.spec.ts @@ -33,44 +33,44 @@ describe('Testing xychart jison file', () => { clearMocks(); }); - it('should throw error if xychart-beta text is not there', () => { - const str = 'xychart-beta-1'; + it('should throw error if xychart text is not there', () => { + const str = 'xychart-1'; expect(parserFnConstructor(str)).toThrow(); }); it('should not throw error if only xychart is there', () => { - const str = 'xychart-beta'; + const str = 'xychart'; expect(parserFnConstructor(str)).not.toThrow(); }); it('parse title of the chart within "', () => { - const str = 'xychart-beta \n title "This is a title"'; + const str = 'xychart \n title "This is a title"'; expect(parserFnConstructor(str)).not.toThrow(); expect(mockDB.setDiagramTitle).toHaveBeenCalledWith('This is a title'); }); it('parse title of the chart without "', () => { - const str = 'xychart-beta \n title oneLinertitle'; + const str = 'xychart \n title oneLinertitle'; expect(parserFnConstructor(str)).not.toThrow(); expect(mockDB.setDiagramTitle).toHaveBeenCalledWith('oneLinertitle'); }); it('parse chart orientation', () => { - const str = 'xychart-beta vertical'; + const str = 'xychart vertical'; expect(parserFnConstructor(str)).not.toThrow(); expect(mockDB.setOrientation).toHaveBeenCalledWith('vertical'); }); it('parse chart orientation with spaces', () => { - let str = 'xychart-beta horizontal '; + let str = 'xychart horizontal '; expect(parserFnConstructor(str)).not.toThrow(); expect(mockDB.setOrientation).toHaveBeenCalledWith('horizontal'); - str = 'xychart-beta abc'; + str = 'xychart abc'; expect(parserFnConstructor(str)).toThrow(); }); it('parse x-axis', () => { - const str = 'xychart-beta \nx-axis xAxisName\n'; + const str = 'xychart \nx-axis xAxisName\n'; expect(parserFnConstructor(str)).not.toThrow(); expect(mockDB.setXAxisTitle).toHaveBeenCalledWith({ text: 'xAxisName', @@ -79,7 +79,7 @@ describe('Testing xychart jison file', () => { }); it('parse x-axis with axis name without "', () => { - const str = 'xychart-beta \nx-axis xAxisName \n'; + const str = 'xychart \nx-axis xAxisName \n'; expect(parserFnConstructor(str)).not.toThrow(); expect(mockDB.setXAxisTitle).toHaveBeenCalledWith({ text: 'xAxisName', @@ -88,7 +88,7 @@ describe('Testing xychart jison file', () => { }); it('parse x-axis with axis name with "', () => { - const str = 'xychart-beta \n x-axis "xAxisName has space"\n'; + const str = 'xychart \n x-axis "xAxisName has space"\n'; expect(parserFnConstructor(str)).not.toThrow(); expect(mockDB.setXAxisTitle).toHaveBeenCalledWith({ text: 'xAxisName has space', @@ -97,7 +97,7 @@ describe('Testing xychart jison file', () => { }); it('parse x-axis with axis name with " with spaces', () => { - const str = 'xychart-beta \n x-axis " xAxisName has space " \n'; + const str = 'xychart \n x-axis " xAxisName has space " \n'; expect(parserFnConstructor(str)).not.toThrow(); expect(mockDB.setXAxisTitle).toHaveBeenCalledWith({ text: ' xAxisName has space ', @@ -106,7 +106,7 @@ describe('Testing xychart jison file', () => { }); it('parse x-axis with axis name and range data', () => { - const str = 'xychart-beta \nx-axis xAxisName 45.5 --> 33 \n'; + const str = 'xychart \nx-axis xAxisName 45.5 --> 33 \n'; expect(parserFnConstructor(str)).not.toThrow(); expect(mockDB.setXAxisTitle).toHaveBeenCalledWith({ text: 'xAxisName', @@ -115,11 +115,11 @@ describe('Testing xychart jison file', () => { expect(mockDB.setXAxisRangeData).toHaveBeenCalledWith(45.5, 33); }); it('parse x-axis throw error for invalid range data', () => { - const str = 'xychart-beta \nx-axis xAxisName aaa --> 33 \n'; + const str = 'xychart \nx-axis xAxisName aaa --> 33 \n'; expect(parserFnConstructor(str)).toThrow(); }); it('parse x-axis with axis name and range data with only decimal part', () => { - const str = 'xychart-beta \nx-axis xAxisName 45.5 --> .34 \n'; + const str = 'xychart \nx-axis xAxisName 45.5 --> .34 \n'; expect(parserFnConstructor(str)).not.toThrow(); expect(mockDB.setXAxisTitle).toHaveBeenCalledWith({ text: 'xAxisName', @@ -129,7 +129,7 @@ describe('Testing xychart jison file', () => { }); it('parse x-axis without axis name and range data', () => { - const str = 'xychart-beta \nx-axis 45.5 --> 1.34 \n'; + const str = 'xychart \nx-axis 45.5 --> 1.34 \n'; expect(parserFnConstructor(str)).not.toThrow(); expect(mockDB.setXAxisTitle).toHaveBeenCalledWith({ text: '', @@ -139,7 +139,7 @@ describe('Testing xychart jison file', () => { }); it('parse x-axis with axis name and category data', () => { - const str = 'xychart-beta \nx-axis xAxisName [ "cat1" , cat2a ] \n '; + const str = 'xychart \nx-axis xAxisName [ "cat1" , cat2a ] \n '; expect(parserFnConstructor(str)).not.toThrow(); expect(mockDB.setXAxisTitle).toHaveBeenCalledWith({ text: 'xAxisName', @@ -155,7 +155,7 @@ describe('Testing xychart jison file', () => { }); it('parse x-axis without axis name and category data', () => { - const str = 'xychart-beta \nx-axis [ "cat1" , cat2a ] \n '; + const str = 'xychart \nx-axis [ "cat1" , cat2a ] \n '; expect(parserFnConstructor(str)).not.toThrow(); expect(mockDB.setXAxisTitle).toHaveBeenCalledWith({ text: '', @@ -171,14 +171,14 @@ describe('Testing xychart jison file', () => { }); it('parse x-axis throw error if unbalanced bracket', () => { - let str = 'xychart-beta \nx-axis xAxisName [ "cat1" [ cat2a ] \n '; + let str = 'xychart \nx-axis xAxisName [ "cat1" [ cat2a ] \n '; expect(parserFnConstructor(str)).toThrow(); - str = 'xychart-beta \nx-axis xAxisName [ "cat1" , cat2a ] ] \n '; + str = 'xychart \nx-axis xAxisName [ "cat1" , cat2a ] ] \n '; expect(parserFnConstructor(str)).toThrow(); }); it('parse x-axis complete variant 1', () => { - const str = `xychart-beta \n x-axis "this is x axis" [category1, "category 2", category3]\n`; + const str = `xychart \n x-axis "this is x axis" [category1, "category 2", category3]\n`; expect(parserFnConstructor(str)).not.toThrow(); expect(mockDB.setXAxisTitle).toHaveBeenCalledWith({ text: 'this is x axis', type: 'text' }); expect(mockDB.setXAxisBand).toHaveBeenCalledWith([ @@ -189,8 +189,7 @@ describe('Testing xychart jison file', () => { }); it('parse x-axis complete variant 2', () => { - const str = - 'xychart-beta \nx-axis xAxisName [ "cat1 with space" , cat2 , cat3] \n '; + const str = 'xychart \nx-axis xAxisName [ "cat1 with space" , cat2 , cat3] \n '; expect(parserFnConstructor(str)).not.toThrow(); expect(mockDB.setXAxisTitle).toHaveBeenCalledWith({ text: 'xAxisName', type: 'text' }); expect(mockDB.setXAxisBand).toHaveBeenCalledWith([ @@ -202,7 +201,7 @@ describe('Testing xychart jison file', () => { it('parse x-axis complete variant 3', () => { const str = - 'xychart-beta \nx-axis xAxisName [ "cat1 with space" , cat2 asdf , cat3] \n '; + 'xychart \nx-axis xAxisName [ "cat1 with space" , cat2 asdf , cat3] \n '; expect(parserFnConstructor(str)).not.toThrow(); expect(mockDB.setXAxisTitle).toHaveBeenCalledWith({ text: 'xAxisName', type: 'text' }); expect(mockDB.setXAxisBand).toHaveBeenCalledWith([ @@ -213,17 +212,17 @@ describe('Testing xychart jison file', () => { }); it('parse y-axis with axis name', () => { - const str = 'xychart-beta \ny-axis yAxisName\n'; + const str = 'xychart \ny-axis yAxisName\n'; expect(parserFnConstructor(str)).not.toThrow(); expect(mockDB.setYAxisTitle).toHaveBeenCalledWith({ text: 'yAxisName', type: 'text' }); }); it('parse y-axis with axis name with spaces', () => { - const str = 'xychart-beta \ny-axis yAxisName \n'; + const str = 'xychart \ny-axis yAxisName \n'; expect(parserFnConstructor(str)).not.toThrow(); expect(mockDB.setYAxisTitle).toHaveBeenCalledWith({ text: 'yAxisName', type: 'text' }); }); it('parse y-axis with axis name with "', () => { - const str = 'xychart-beta \n y-axis "yAxisName has space"\n'; + const str = 'xychart \n y-axis "yAxisName has space"\n'; expect(parserFnConstructor(str)).not.toThrow(); expect(mockDB.setYAxisTitle).toHaveBeenCalledWith({ text: 'yAxisName has space', @@ -231,7 +230,7 @@ describe('Testing xychart jison file', () => { }); }); it('parse y-axis with axis name with " and spaces', () => { - const str = 'xychart-beta \n y-axis " yAxisName has space " \n'; + const str = 'xychart \n y-axis " yAxisName has space " \n'; expect(parserFnConstructor(str)).not.toThrow(); expect(mockDB.setYAxisTitle).toHaveBeenCalledWith({ text: ' yAxisName has space ', @@ -239,39 +238,39 @@ describe('Testing xychart jison file', () => { }); }); it('parse y-axis with axis name with range data', () => { - const str = 'xychart-beta \ny-axis yAxisName 45.5 --> 33 \n'; + const str = 'xychart \ny-axis yAxisName 45.5 --> 33 \n'; expect(parserFnConstructor(str)).not.toThrow(); expect(mockDB.setYAxisTitle).toHaveBeenCalledWith({ text: 'yAxisName', type: 'text' }); expect(mockDB.setYAxisRangeData).toHaveBeenCalledWith(45.5, 33); }); it('parse y-axis without axis name with range data', () => { - const str = 'xychart-beta \ny-axis 45.5 --> 33 \n'; + const str = 'xychart \ny-axis 45.5 --> 33 \n'; expect(parserFnConstructor(str)).not.toThrow(); expect(mockDB.setYAxisTitle).toHaveBeenCalledWith({ text: '', type: 'text' }); expect(mockDB.setYAxisRangeData).toHaveBeenCalledWith(45.5, 33); }); it('parse y-axis with axis name with range data with only decimal part', () => { - const str = 'xychart-beta \ny-axis yAxisName 45.5 --> .33 \n'; + const str = 'xychart \ny-axis yAxisName 45.5 --> .33 \n'; expect(parserFnConstructor(str)).not.toThrow(); expect(mockDB.setYAxisTitle).toHaveBeenCalledWith({ text: 'yAxisName', type: 'text' }); expect(mockDB.setYAxisRangeData).toHaveBeenCalledWith(45.5, 0.33); }); it('parse y-axis throw error for invalid number in range data', () => { - const str = 'xychart-beta \ny-axis yAxisName 45.5 --> abc \n'; + const str = 'xychart \ny-axis yAxisName 45.5 --> abc \n'; expect(parserFnConstructor(str)).toThrow(); }); it('parse y-axis throws error if range data is passed', () => { - const str = 'xychart-beta \ny-axis yAxisName [ 45.3, 33 ] \n'; + const str = 'xychart \ny-axis yAxisName [ 45.3, 33 ] \n'; expect(parserFnConstructor(str)).toThrow(); }); it('parse both axis at once', () => { - const str = 'xychart-beta\nx-axis xAxisName\ny-axis yAxisName\n'; + const str = 'xychart\nx-axis xAxisName\ny-axis yAxisName\n'; expect(parserFnConstructor(str)).not.toThrow(); expect(mockDB.setXAxisTitle).toHaveBeenCalledWith({ text: 'xAxisName', type: 'text' }); expect(mockDB.setYAxisTitle).toHaveBeenCalledWith({ text: 'yAxisName', type: 'text' }); }); it('parse line Data', () => { - const str = 'xychart-beta\nx-axis xAxisName\ny-axis yAxisName\n line lineTitle [23, 45, 56.6]'; + const str = 'xychart\nx-axis xAxisName\ny-axis yAxisName\n line lineTitle [23, 45, 56.6]'; expect(parserFnConstructor(str)).not.toThrow(); expect(mockDB.setLineData).toHaveBeenCalledWith( { text: 'lineTitle', type: 'text' }, @@ -282,7 +281,7 @@ describe('Testing xychart jison file', () => { }); it('parse line Data with spaces and +,- symbols', () => { const str = - 'xychart-beta\nx-axis xAxisName\ny-axis yAxisName\n line "lineTitle with space" [ +23 , -45 , 56.6 ] '; + 'xychart\nx-axis xAxisName\ny-axis yAxisName\n line "lineTitle with space" [ +23 , -45 , 56.6 ] '; expect(parserFnConstructor(str)).not.toThrow(); expect(mockDB.setYAxisTitle).toHaveBeenCalledWith({ text: 'yAxisName', type: 'text' }); expect(mockDB.setXAxisTitle).toHaveBeenCalledWith({ text: 'xAxisName', type: 'text' }); @@ -292,8 +291,7 @@ describe('Testing xychart jison file', () => { ); }); it('parse line Data without title', () => { - const str = - 'xychart-beta\nx-axis xAxisName\ny-axis yAxisName\n line [ +23 , -45 , 56.6 , .33] '; + const str = 'xychart\nx-axis xAxisName\ny-axis yAxisName\n line [ +23 , -45 , 56.6 , .33] '; expect(parserFnConstructor(str)).not.toThrow(); expect(mockDB.setYAxisTitle).toHaveBeenCalledWith({ text: 'yAxisName', type: 'text' }); expect(mockDB.setXAxisTitle).toHaveBeenCalledWith({ text: 'xAxisName', type: 'text' }); @@ -304,34 +302,32 @@ describe('Testing xychart jison file', () => { }); it('parse line Data throws error unbalanced brackets', () => { let str = - 'xychart-beta\nx-axis xAxisName\ny-axis yAxisName\n line "lineTitle with space" [ +23 [ -45 , 56.6 ] '; + 'xychart\nx-axis xAxisName\ny-axis yAxisName\n line "lineTitle with space" [ +23 [ -45 , 56.6 ] '; expect(parserFnConstructor(str)).toThrow(); str = - 'xychart-beta\nx-axis xAxisName\ny-axis yAxisName\n line "lineTitle with space" [ +23 , -45 ] 56.6 ] '; + 'xychart\nx-axis xAxisName\ny-axis yAxisName\n line "lineTitle with space" [ +23 , -45 ] 56.6 ] '; expect(parserFnConstructor(str)).toThrow(); }); it('parse line Data throws error if data is not provided', () => { - const str = 'xychart-beta\nx-axis xAxisName\ny-axis yAxisName\n line "lineTitle with space" '; + const str = 'xychart\nx-axis xAxisName\ny-axis yAxisName\n line "lineTitle with space" '; expect(parserFnConstructor(str)).toThrow(); }); it('parse line Data throws error if data is empty', () => { - const str = - 'xychart-beta\nx-axis xAxisName\ny-axis yAxisName\n line "lineTitle with space" [ ] '; + const str = 'xychart\nx-axis xAxisName\ny-axis yAxisName\n line "lineTitle with space" [ ] '; expect(parserFnConstructor(str)).toThrow(); }); it('parse line Data throws error if , is not in proper', () => { const str = - 'xychart-beta\nx-axis xAxisName\ny-axis yAxisName\n line "lineTitle with space" [ +23 , , -45 , 56.6 ] '; + 'xychart\nx-axis xAxisName\ny-axis yAxisName\n line "lineTitle with space" [ +23 , , -45 , 56.6 ] '; expect(parserFnConstructor(str)).toThrow(); }); it('parse line Data throws error if not number', () => { const str = - 'xychart-beta\nx-axis xAxisName\ny-axis yAxisName\n line "lineTitle with space" [ +23 , -4aa5 , 56.6 ] '; + 'xychart\nx-axis xAxisName\ny-axis yAxisName\n line "lineTitle with space" [ +23 , -4aa5 , 56.6 ] '; expect(parserFnConstructor(str)).toThrow(); }); it('parse bar Data', () => { - const str = - 'xychart-beta\nx-axis xAxisName\ny-axis yAxisName\n bar barTitle [23, 45, 56.6, .22]'; + const str = 'xychart\nx-axis xAxisName\ny-axis yAxisName\n bar barTitle [23, 45, 56.6, .22]'; expect(parserFnConstructor(str)).not.toThrow(); expect(mockDB.setYAxisTitle).toHaveBeenCalledWith({ text: 'yAxisName', type: 'text' }); expect(mockDB.setXAxisTitle).toHaveBeenCalledWith({ text: 'xAxisName', type: 'text' }); @@ -342,7 +338,7 @@ describe('Testing xychart jison file', () => { }); it('parse bar Data spaces and +,- symbol', () => { const str = - 'xychart-beta\nx-axis xAxisName\ny-axis yAxisName\n bar "barTitle with space" [ +23 , -45 , 56.6 ] '; + 'xychart\nx-axis xAxisName\ny-axis yAxisName\n bar "barTitle with space" [ +23 , -45 , 56.6 ] '; expect(parserFnConstructor(str)).not.toThrow(); expect(mockDB.setYAxisTitle).toHaveBeenCalledWith({ text: 'yAxisName', type: 'text' }); expect(mockDB.setXAxisTitle).toHaveBeenCalledWith({ text: 'xAxisName', type: 'text' }); @@ -352,8 +348,7 @@ describe('Testing xychart jison file', () => { ); }); it('parse bar Data without plot title', () => { - const str = - 'xychart-beta\nx-axis xAxisName\ny-axis yAxisName\n bar [ +23 , -45 , 56.6 ] '; + const str = 'xychart\nx-axis xAxisName\ny-axis yAxisName\n bar [ +23 , -45 , 56.6 ] '; expect(parserFnConstructor(str)).not.toThrow(); expect(mockDB.setYAxisTitle).toHaveBeenCalledWith({ text: 'yAxisName', type: 'text' }); expect(mockDB.setXAxisTitle).toHaveBeenCalledWith({ text: 'xAxisName', type: 'text' }); @@ -361,34 +356,34 @@ describe('Testing xychart jison file', () => { }); it('parse bar should throw for unbalanced brackets', () => { let str = - 'xychart-beta\nx-axis xAxisName\ny-axis yAxisName\n bar "barTitle with space" [ +23 [ -45 , 56.6 ] '; + 'xychart\nx-axis xAxisName\ny-axis yAxisName\n bar "barTitle with space" [ +23 [ -45 , 56.6 ] '; expect(parserFnConstructor(str)).toThrow(); str = - 'xychart-beta\nx-axis xAxisName\ny-axis yAxisName\n bar "barTitle with space" [ +23 , -45 ] 56.6 ] '; + 'xychart\nx-axis xAxisName\ny-axis yAxisName\n bar "barTitle with space" [ +23 , -45 ] 56.6 ] '; expect(parserFnConstructor(str)).toThrow(); }); it('parse bar should throw error if data is not provided', () => { - const str = 'xychart-beta\nx-axis xAxisName\ny-axis yAxisName\n bar "barTitle with space" '; + const str = 'xychart\nx-axis xAxisName\ny-axis yAxisName\n bar "barTitle with space" '; expect(parserFnConstructor(str)).toThrow(); }); it('parse bar should throw error if data is empty', () => { const str = - 'xychart-beta\nx-axis xAxisName\ny-axis yAxisName\n bar "barTitle with space" [ ] '; + 'xychart\nx-axis xAxisName\ny-axis yAxisName\n bar "barTitle with space" [ ] '; expect(parserFnConstructor(str)).toThrow(); }); it('parse bar should throw error if comma is not proper', () => { const str = - 'xychart-beta\nx-axis xAxisName\ny-axis yAxisName\n bar "barTitle with space" [ +23 , , -45 , 56.6 ] '; + 'xychart\nx-axis xAxisName\ny-axis yAxisName\n bar "barTitle with space" [ +23 , , -45 , 56.6 ] '; expect(parserFnConstructor(str)).toThrow(); }); it('parse bar should throw error if number is not passed', () => { const str = - 'xychart-beta\nx-axis xAxisName\ny-axis yAxisName\n bar "barTitle with space" [ +23 , -4aa5 , 56.6 ] '; + 'xychart\nx-axis xAxisName\ny-axis yAxisName\n bar "barTitle with space" [ +23 , -4aa5 , 56.6 ] '; expect(parserFnConstructor(str)).toThrow(); }); it('parse multiple bar and line variant 1', () => { const str = - 'xychart-beta\nx-axis xAxisName\ny-axis yAxisName\n bar barTitle1 [23, 45, 56.6] \n line lineTitle1 [11, 45.5, 67, 23] \n bar barTitle2 [13, 42, 56.89] \n line lineTitle2 [45, 99, 012]'; + 'xychart\nx-axis xAxisName\ny-axis yAxisName\n bar barTitle1 [23, 45, 56.6] \n line lineTitle1 [11, 45.5, 67, 23] \n bar barTitle2 [13, 42, 56.89] \n line lineTitle2 [45, 99, 012]'; expect(parserFnConstructor(str)).not.toThrow(); expect(mockDB.setYAxisTitle).toHaveBeenCalledWith({ text: 'yAxisName', type: 'text' }); expect(mockDB.setXAxisTitle).toHaveBeenCalledWith({ text: 'xAxisName', type: 'text' }); @@ -411,7 +406,7 @@ describe('Testing xychart jison file', () => { }); it('parse multiple bar and line variant 2', () => { const str = ` - xychart-beta horizontal + xychart horizontal title Basic xychart x-axis "this is x axis" [category1, "category 2", category3] y-axis yaxisText 10 --> 150 diff --git a/packages/mermaid/src/diagrams/xychart/xychartDetector.ts b/packages/mermaid/src/diagrams/xychart/xychartDetector.ts index 08be05b01..3a848cd7f 100644 --- a/packages/mermaid/src/diagrams/xychart/xychartDetector.ts +++ b/packages/mermaid/src/diagrams/xychart/xychartDetector.ts @@ -7,7 +7,7 @@ import type { const id = 'xychart'; const detector: DiagramDetector = (txt) => { - return /^\s*xychart-beta/.test(txt); + return /^\s*xychart(-beta)?/.test(txt); }; const loader: DiagramLoader = async () => { diff --git a/packages/mermaid/src/docs/syntax/xyChart.md b/packages/mermaid/src/docs/syntax/xyChart.md index 7de3d4144..4154fb2f0 100644 --- a/packages/mermaid/src/docs/syntax/xyChart.md +++ b/packages/mermaid/src/docs/syntax/xyChart.md @@ -7,7 +7,7 @@ ## Example ```mermaid-example -xychart-beta +xychart title "Sales Revenue" x-axis [jan, feb, mar, apr, may, jun, jul, aug, sep, oct, nov, dec] y-axis "Revenue (in $)" 4000 --> 11000 @@ -26,7 +26,7 @@ All text values that contain only one word can be written without `"`. If a text The chart can be drawn horizontal or vertical, default value is vertical. ``` -xychart-beta horizontal +xychart horizontal ... ``` @@ -37,7 +37,7 @@ The title is a short description of the chart and it will always render on top o #### Example ``` -xychart-beta +xychart title "This is a simple example" ... ``` @@ -86,10 +86,10 @@ A bar chart offers the capability to graphically depict bars. #### Simplest example -The only two things required are the chart name (`xychart-beta`) and one data set. So you will be able to draw a chart with a simple config like +The only two things required are the chart name (`xychart`) and one data set. So you will be able to draw a chart with a simple config like ``` -xychart-beta +xychart line [+1.3, .6, 2.4, -.34] ``` @@ -164,7 +164,7 @@ config: xyChart: titleColor: "#ff0000" --- -xychart-beta +xychart title "Sales Revenue" x-axis [jan, feb, mar, apr, may, jun, jul, aug, sep, oct, nov, dec] y-axis "Revenue (in $)" 4000 --> 11000 diff --git a/packages/mermaid/src/mermaidAPI.spec.ts b/packages/mermaid/src/mermaidAPI.spec.ts index 3e28dbfd4..91022516a 100644 --- a/packages/mermaid/src/mermaidAPI.spec.ts +++ b/packages/mermaid/src/mermaidAPI.spec.ts @@ -796,6 +796,7 @@ graph TD;A--x|text including URL space|B;`) { textDiagramType: 'pie', expectedType: 'pie' }, { textDiagramType: 'packet-beta', expectedType: 'packet' }, { textDiagramType: 'xychart-beta', expectedType: 'xychart' }, + { textDiagramType: 'xychart', expectedType: 'xychart' }, { textDiagramType: 'requirementDiagram', expectedType: 'requirement' }, { textDiagramType: 'sequenceDiagram', expectedType: 'sequence' }, { textDiagramType: 'stateDiagram-v2', expectedType: 'stateDiagram' }, From 6979aa1013142fded5ad6d93126802906ef67c91 Mon Sep 17 00:00:00 2001 From: darshanr0107 Date: Mon, 16 Jun 2025 14:53:09 +0530 Subject: [PATCH 006/143] Fix failing test cases and update error messages for negative and zero inputs --- packages/mermaid/src/diagrams/pie/pieDb.ts | 10 ++-------- packages/parser/src/language/common/common.langium | 4 ++-- packages/parser/src/language/pie/pie.langium | 6 +++++- 3 files changed, 9 insertions(+), 11 deletions(-) diff --git a/packages/mermaid/src/diagrams/pie/pieDb.ts b/packages/mermaid/src/diagrams/pie/pieDb.ts index 87735b84e..ade44c331 100644 --- a/packages/mermaid/src/diagrams/pie/pieDb.ts +++ b/packages/mermaid/src/diagrams/pie/pieDb.ts @@ -35,15 +35,9 @@ const clear = (): void => { const addSection = ({ label, value }: D3Section): void => { if (value <= 0) { - const error: any = new Error( - `Section "${label}" has invalid value: ${value}. Zero and negative values are not allowed in pie charts. All slice values must be > 0` + throw new Error( + `"${label}" has invalid value: ${value}. Zero and negative values are not allowed in pie charts. All slice values must be > 0.` ); - error.hash = { - text: `pie "${label}": ${value}`, - token: `${value}`, - expected: ['a positive number (> 0)'], - }; - throw error; } if (!sections.has(label)) { sections.set(label, value); diff --git a/packages/parser/src/language/common/common.langium b/packages/parser/src/language/common/common.langium index e6d3d488f..b74ffc34d 100644 --- a/packages/parser/src/language/common/common.langium +++ b/packages/parser/src/language/common/common.langium @@ -17,8 +17,8 @@ terminal ACC_DESCR: /[\t ]*accDescr(?:[\t ]*:([^\n\r]*?(?=%%)|[^\n\r]*)|\s*{([^} terminal ACC_TITLE: /[\t ]*accTitle[\t ]*:(?:[^\n\r]*?(?=%%)|[^\n\r]*)/; terminal TITLE: /[\t ]*title(?:[\t ][^\n\r]*?(?=%%)|[\t ][^\n\r]*|)/; -terminal FLOAT returns number: /-?[0-9]+\.[0-9]+(?!\.)/; -terminal INT returns number: /-?(0|[1-9][0-9]*)(?!\.)/; +terminal FLOAT returns number: /[0-9]+\.[0-9]+(?!\.)/; +terminal INT returns number: /0|[1-9][0-9]*(?!\.)/; terminal NUMBER returns number: FLOAT | INT; terminal STRING returns string: /"([^"\\]|\\.)*"|'([^'\\]|\\.)*'/; diff --git a/packages/parser/src/language/pie/pie.langium b/packages/parser/src/language/pie/pie.langium index a80caa81f..f6802d718 100644 --- a/packages/parser/src/language/pie/pie.langium +++ b/packages/parser/src/language/pie/pie.langium @@ -12,5 +12,9 @@ entry Pie: ; PieSection: - label=STRING ":" value=NUMBER EOL + label=STRING ":" value=NUMBER_PIE EOL ; + +terminal FLOAT_PIE returns number: /-?[0-9]+\.[0-9]+(?!\.)/; +terminal INT_PIE returns number: /-?(0|[1-9][0-9]*)(?!\.)/; +terminal NUMBER_PIE returns number: FLOAT_PIE | INT_PIE; \ No newline at end of file From cfbce5463844f0c537ba9e74ad5b964943e75b7e Mon Sep 17 00:00:00 2001 From: darshanr0107 Date: Mon, 16 Jun 2025 19:11:29 +0530 Subject: [PATCH 007/143] prevent zero% slices from rendering in pie chart --- .../mermaid/src/diagrams/pie/pieRenderer.ts | 57 ++++++++++--------- 1 file changed, 29 insertions(+), 28 deletions(-) diff --git a/packages/mermaid/src/diagrams/pie/pieRenderer.ts b/packages/mermaid/src/diagrams/pie/pieRenderer.ts index a0cdce3df..5b87613ff 100644 --- a/packages/mermaid/src/diagrams/pie/pieRenderer.ts +++ b/packages/mermaid/src/diagrams/pie/pieRenderer.ts @@ -10,20 +10,14 @@ import { cleanAndMerge, parseFontSize } from '../../utils.js'; import type { D3Section, PieDB, Sections } from './pieTypes.js'; const createPieArcs = (sections: Sections): d3.PieArcDatum[] => { - // Compute the position of each group on the pie: + const sum = [...sections.values()].reduce((acc, val) => acc + val, 0); + const pieData: D3Section[] = [...sections.entries()] - .map((element: [string, number]): D3Section => { - return { - label: element[0], - value: element[1], - }; - }) - .sort((a: D3Section, b: D3Section): number => { - return b.value - a.value; - }); - const pie: d3.Pie = d3pie().value( - (d3Section: D3Section): number => d3Section.value - ); + .map(([label, value]) => ({ label, value })) + .filter((d) => (d.value / sum) * 100 >= 1) // Remove values < 1% + .sort((a, b) => b.value - a.value); + + const pie: d3.Pie = d3pie().value((d) => d.value); return pie(pieData); }; @@ -89,13 +83,21 @@ export const draw: DrawDefinition = (text, id, _version, diagObj) => { themeVariables.pie11, themeVariables.pie12, ]; + let sum = 0; + sections.forEach((section) => { + sum += section; + }); + + // Filter out arcs that would render as 0% + const filteredArcs = arcs.filter((datum) => ((datum.data.value / sum) * 100).toFixed(0) !== '0'); + // Set the color scale const color: d3.ScaleOrdinal = scaleOrdinal(myGeneratedColors); // Build the pie chart: each part of the pie is a path that we build using the arc function. group .selectAll('mySlices') - .data(arcs) + .data(filteredArcs) .enter() .append('path') .attr('d', arcGenerator) @@ -104,15 +106,11 @@ export const draw: DrawDefinition = (text, id, _version, diagObj) => { }) .attr('class', 'pieCircle'); - let sum = 0; - sections.forEach((section) => { - sum += section; - }); // Now add the percentage. // Use the centroid method to get the best coordinates. group .selectAll('mySlices') - .data(arcs) + .data(filteredArcs) .enter() .append('text') .text((datum: d3.PieArcDatum): string => { @@ -133,15 +131,20 @@ export const draw: DrawDefinition = (text, id, _version, diagObj) => { .attr('class', 'pieTitleText'); // Add the legends/annotations for each section + const allSectionData: D3Section[] = [...sections.entries()].map(([label, value]) => ({ + label, + value, + })); + const legend = group .selectAll('.legend') - .data(color.domain()) + .data(allSectionData) .enter() .append('g') .attr('class', 'legend') .attr('transform', (_datum, index: number): string => { const height = LEGEND_RECT_SIZE + LEGEND_SPACING; - const offset = (height * color.domain().length) / 2; + const offset = (height * allSectionData.length) / 2; const horizontal = 12 * LEGEND_RECT_SIZE; const vertical = index * height - offset; return 'translate(' + horizontal + ',' + vertical + ')'; @@ -151,20 +154,18 @@ export const draw: DrawDefinition = (text, id, _version, diagObj) => { .append('rect') .attr('width', LEGEND_RECT_SIZE) .attr('height', LEGEND_RECT_SIZE) - .style('fill', color) - .style('stroke', color); + .style('fill', (d) => color(d.label)) + .style('stroke', (d) => color(d.label)); legend - .data(arcs) .append('text') .attr('x', LEGEND_RECT_SIZE + LEGEND_SPACING) .attr('y', LEGEND_RECT_SIZE - LEGEND_SPACING) - .text((datum: d3.PieArcDatum): string => { - const { label, value } = datum.data; + .text((d) => { if (db.getShowData()) { - return `${label} [${value}]`; + return `${d.label} [${d.value}]`; } - return label; + return d.label; }); const longestTextWidth = Math.max( From 72c0d9df26687a4deca0999ae69e8b06d361c227 Mon Sep 17 00:00:00 2001 From: darshanr0107 Date: Mon, 16 Jun 2025 19:38:58 +0530 Subject: [PATCH 008/143] added test case for preventing zero% values from rendering --- cypress/integration/rendering/pie.spec.ts | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/cypress/integration/rendering/pie.spec.ts b/cypress/integration/rendering/pie.spec.ts index 171a83057..8f6ef7de3 100644 --- a/cypress/integration/rendering/pie.spec.ts +++ b/cypress/integration/rendering/pie.spec.ts @@ -82,4 +82,13 @@ describe('pie chart', () => { ` ); }); + it('should render pie slices only for non-zero values but shows all legends', () => { + imgSnapshotTest( + ` pie title Pets adopted by volunteers + "Dogs" : 386 + "Cats" : 85 + "Rats" : 1 + ` + ); + }); }); From 9dc987b28b34d81580be59b7499e7eab6f3e636c Mon Sep 17 00:00:00 2001 From: darshanr0107 Date: Tue, 17 Jun 2025 12:12:40 +0530 Subject: [PATCH 009/143] remove beta support for sankey diagram --- cypress/integration/rendering/sankey.spec.ts | 4 ++-- demos/sankey.html | 16 ++++++++------ docs/syntax/sankey.md | 22 +++++++++---------- .../src/diagrams/sankey/parser/sankey.jison | 1 + .../src/diagrams/sankey/parser/sankey.spec.ts | 21 ++++++++++++++++-- .../src/diagrams/sankey/sankeyDetector.ts | 2 +- packages/mermaid/src/docs/syntax/sankey.md | 12 +++++----- 7 files changed, 49 insertions(+), 29 deletions(-) diff --git a/cypress/integration/rendering/sankey.spec.ts b/cypress/integration/rendering/sankey.spec.ts index ad0d75f18..b9940d998 100644 --- a/cypress/integration/rendering/sankey.spec.ts +++ b/cypress/integration/rendering/sankey.spec.ts @@ -15,7 +15,7 @@ describe('Sankey Diagram', () => { describe('when given a linkColor', function () { this.beforeAll(() => { cy.wrap( - `sankey-beta + `sankey a,b,10 ` ).as('graph'); @@ -62,7 +62,7 @@ describe('Sankey Diagram', () => { this.beforeAll(() => { cy.wrap( ` - sankey-beta + sankey a,b,8 b,c,8 diff --git a/demos/sankey.html b/demos/sankey.html index 2439cb589..11bb541c2 100644 --- a/demos/sankey.html +++ b/demos/sankey.html @@ -20,12 +20,14 @@ width: 800 nodeAlignment: left --- - sankey-beta - Revenue,Expenses,10 - Revenue,Profit,10 - Expenses,Manufacturing,5 - Expenses,Tax,3 - Expenses,Research,2 + sankey + a,b,8 + b,c,8 + c,d,8 + d,e,8 + + x,c,4 + c,y,4

Energy flow

@@ -40,7 +42,7 @@ linkColor: gradient nodeAlignment: justify --- - sankey-beta + sankey Agricultural 'waste',Bio-conversion,124.729 Bio-conversion,Liquid,0.597 diff --git a/docs/syntax/sankey.md b/docs/syntax/sankey.md index ccabc11c9..e981358b5 100644 --- a/docs/syntax/sankey.md +++ b/docs/syntax/sankey.md @@ -23,7 +23,7 @@ config: sankey: showValues: false --- -sankey-beta +sankey Agricultural 'waste',Bio-conversion,124.729 Bio-conversion,Liquid,0.597 @@ -101,7 +101,7 @@ config: sankey: showValues: false --- -sankey-beta +sankey Agricultural 'waste',Bio-conversion,124.729 Bio-conversion,Liquid,0.597 @@ -175,7 +175,7 @@ Wind,Electricity grid,289.366 ## Syntax -The idea behind syntax is that a user types `sankey-beta` keyword first, then pastes raw CSV below and get the result. +The idea behind syntax is that a user types `sankey` keyword first, then pastes raw CSV below and get the result. It implements CSV standard as [described here](https://www.ietf.org/rfc/rfc4180.txt) with subtle **differences**: @@ -187,7 +187,7 @@ It implements CSV standard as [described here](https://www.ietf.org/rfc/rfc4180. It is implied that 3 columns inside CSV should represent `source`, `target` and `value` accordingly: ```mermaid-example -sankey-beta +sankey %% source,target,value Electricity grid,Over generation / exports,104.453 @@ -196,7 +196,7 @@ Electricity grid,H2 conversion,27.14 ``` ```mermaid -sankey-beta +sankey %% source,target,value Electricity grid,Over generation / exports,104.453 @@ -209,7 +209,7 @@ Electricity grid,H2 conversion,27.14 CSV does not support empty lines without comma delimiters by default. But you can add them if needed: ```mermaid-example -sankey-beta +sankey Bio-conversion,Losses,26.862 @@ -219,7 +219,7 @@ Bio-conversion,Gas,81.144 ``` ```mermaid -sankey-beta +sankey Bio-conversion,Losses,26.862 @@ -233,14 +233,14 @@ Bio-conversion,Gas,81.144 If you need to have a comma, wrap it in double quotes: ```mermaid-example -sankey-beta +sankey Pumped heat,"Heating and cooling, homes",193.026 Pumped heat,"Heating and cooling, commercial",70.672 ``` ```mermaid -sankey-beta +sankey Pumped heat,"Heating and cooling, homes",193.026 Pumped heat,"Heating and cooling, commercial",70.672 @@ -251,14 +251,14 @@ Pumped heat,"Heating and cooling, commercial",70.672 If you need to have double quote, put a pair of them inside quoted string: ```mermaid-example -sankey-beta +sankey Pumped heat,"Heating and cooling, ""homes""",193.026 Pumped heat,"Heating and cooling, ""commercial""",70.672 ``` ```mermaid -sankey-beta +sankey Pumped heat,"Heating and cooling, ""homes""",193.026 Pumped heat,"Heating and cooling, ""commercial""",70.672 diff --git a/packages/mermaid/src/diagrams/sankey/parser/sankey.jison b/packages/mermaid/src/diagrams/sankey/parser/sankey.jison index 9d66b69a4..d531c438a 100644 --- a/packages/mermaid/src/diagrams/sankey/parser/sankey.jison +++ b/packages/mermaid/src/diagrams/sankey/parser/sankey.jison @@ -27,6 +27,7 @@ TEXTDATA [\u0020-\u0021\u0023-\u002B\u002D-\u007E] %% "sankey-beta" { this.pushState('csv'); return 'SANKEY'; } +"sankey" { this.pushState('csv'); return 'SANKEY'; } <> { return 'EOF' } // match end of file ({CRLF}|{LF}) { return 'NEWLINE' } {COMMA} { return 'COMMA' } diff --git a/packages/mermaid/src/diagrams/sankey/parser/sankey.spec.ts b/packages/mermaid/src/diagrams/sankey/parser/sankey.spec.ts index 007cda6f9..10fc86963 100644 --- a/packages/mermaid/src/diagrams/sankey/parser/sankey.spec.ts +++ b/packages/mermaid/src/diagrams/sankey/parser/sankey.spec.ts @@ -13,7 +13,7 @@ describe('Sankey diagram', function () { sankey.parser.yy.clear(); }); - it('parses csv', () => { + it('parses csv with sankey-beta syntax', () => { const csv = path.resolve(__dirname, './energy.csv'); const data = fs.readFileSync(csv, 'utf8'); const graphDefinition = prepareTextForParsing(cleanupComments('sankey-beta\n\n ' + data)); @@ -21,7 +21,15 @@ describe('Sankey diagram', function () { sankey.parser.parse(graphDefinition); }); - it('allows __proto__ as id', function () { + it('parses csv with sankey syntax', () => { + const csv = path.resolve(__dirname, './energy.csv'); + const data = fs.readFileSync(csv, 'utf8'); + const graphDefinition = prepareTextForParsing(cleanupComments('sankey\n\n ' + data)); + + sankey.parser.parse(graphDefinition); + }); + + it('allows __proto__ as id with sankey-beta syntax', function () { sankey.parser.parse( prepareTextForParsing(`sankey-beta __proto__,A,0.597 @@ -29,5 +37,14 @@ describe('Sankey diagram', function () { `) ); }); + + it('allows __proto__ as id with sankey syntax', function () { + sankey.parser.parse( + prepareTextForParsing(`sankey + __proto__,A,0.597 + A,__proto__,0.403 + `) + ); + }); }); }); diff --git a/packages/mermaid/src/diagrams/sankey/sankeyDetector.ts b/packages/mermaid/src/diagrams/sankey/sankeyDetector.ts index 73c4d1428..589bc9ade 100644 --- a/packages/mermaid/src/diagrams/sankey/sankeyDetector.ts +++ b/packages/mermaid/src/diagrams/sankey/sankeyDetector.ts @@ -3,7 +3,7 @@ import type { DiagramDetector, ExternalDiagramDefinition } from '../../diagram-a const id = 'sankey'; const detector: DiagramDetector = (txt) => { - return /^\s*sankey-beta/.test(txt); + return /^\s*sankey(-beta)?/.test(txt); }; const loader = async () => { diff --git a/packages/mermaid/src/docs/syntax/sankey.md b/packages/mermaid/src/docs/syntax/sankey.md index 6b7c359e3..bf04d5553 100644 --- a/packages/mermaid/src/docs/syntax/sankey.md +++ b/packages/mermaid/src/docs/syntax/sankey.md @@ -18,7 +18,7 @@ config: sankey: showValues: false --- -sankey-beta +sankey Agricultural 'waste',Bio-conversion,124.729 Bio-conversion,Liquid,0.597 @@ -92,7 +92,7 @@ Wind,Electricity grid,289.366 ## Syntax -The idea behind syntax is that a user types `sankey-beta` keyword first, then pastes raw CSV below and get the result. +The idea behind syntax is that a user types `sankey` keyword first, then pastes raw CSV below and get the result. It implements CSV standard as [described here](https://www.ietf.org/rfc/rfc4180.txt) with subtle **differences**: @@ -104,7 +104,7 @@ It implements CSV standard as [described here](https://www.ietf.org/rfc/rfc4180. It is implied that 3 columns inside CSV should represent `source`, `target` and `value` accordingly: ```mermaid-example -sankey-beta +sankey %% source,target,value Electricity grid,Over generation / exports,104.453 @@ -117,7 +117,7 @@ Electricity grid,H2 conversion,27.14 CSV does not support empty lines without comma delimiters by default. But you can add them if needed: ```mermaid-example -sankey-beta +sankey Bio-conversion,Losses,26.862 @@ -131,7 +131,7 @@ Bio-conversion,Gas,81.144 If you need to have a comma, wrap it in double quotes: ```mermaid-example -sankey-beta +sankey Pumped heat,"Heating and cooling, homes",193.026 Pumped heat,"Heating and cooling, commercial",70.672 @@ -142,7 +142,7 @@ Pumped heat,"Heating and cooling, commercial",70.672 If you need to have double quote, put a pair of them inside quoted string: ```mermaid-example -sankey-beta +sankey Pumped heat,"Heating and cooling, ""homes""",193.026 Pumped heat,"Heating and cooling, ""commercial""",70.672 From a3d164fde8673054529b9c333b0c2429f5f413b5 Mon Sep 17 00:00:00 2001 From: darshanr0107 Date: Tue, 17 Jun 2025 12:43:26 +0530 Subject: [PATCH 010/143] remove beta suffix for block diagram --- cypress/integration/rendering/block.spec.js | 56 ++++---- demos/block.html | 22 ++-- docs/syntax/block.md | 122 +++++++++--------- .../src/diagrams/block/blockDetector.ts | 2 +- .../src/diagrams/block/parser/block.jison | 10 +- .../src/diagrams/block/parser/block.spec.ts | 46 +++---- packages/mermaid/src/docs/syntax/block.md | 62 ++++----- 7 files changed, 160 insertions(+), 160 deletions(-) diff --git a/cypress/integration/rendering/block.spec.js b/cypress/integration/rendering/block.spec.js index 589a30fde..12843f2a2 100644 --- a/cypress/integration/rendering/block.spec.js +++ b/cypress/integration/rendering/block.spec.js @@ -16,7 +16,7 @@ describe('Block diagram', () => { it('BL2: should handle columns statement in sub-blocks', () => { imgSnapshotTest( - `block-beta + `block id1["Hello"] block columns 3 @@ -32,7 +32,7 @@ describe('Block diagram', () => { it('BL3: should align block widths and handle columns statement in sub-blocks', () => { imgSnapshotTest( - `block-beta + `block block columns 1 id1 @@ -48,7 +48,7 @@ describe('Block diagram', () => { it('BL4: should align block widths and handle columns statements in deeper sub-blocks then 1 level', () => { imgSnapshotTest( - `block-beta + `block columns 1 block columns 1 @@ -68,7 +68,7 @@ describe('Block diagram', () => { it('BL5: should align block widths and handle columns statements in deeper sub-blocks then 1 level (alt)', () => { imgSnapshotTest( - `block-beta + `block columns 1 block id1 @@ -87,7 +87,7 @@ describe('Block diagram', () => { it('BL6: should handle block arrows and spece statements', () => { imgSnapshotTest( - `block-beta + `block columns 3 space:3 ida idb idc @@ -106,7 +106,7 @@ describe('Block diagram', () => { it('BL7: should handle different types of edges', () => { imgSnapshotTest( - `block-beta + `block columns 3 A space:5 A --o B @@ -119,7 +119,7 @@ describe('Block diagram', () => { it('BL8: should handle sub-blocks without columns statements', () => { imgSnapshotTest( - `block-beta + `block columns 2 C A B block @@ -133,7 +133,7 @@ describe('Block diagram', () => { it('BL9: should handle edges from blocks in sub blocks to other blocks', () => { imgSnapshotTest( - `block-beta + `block columns 3 B space block @@ -147,7 +147,7 @@ describe('Block diagram', () => { it('BL10: should handle edges from composite blocks', () => { imgSnapshotTest( - `block-beta + `block columns 3 B space block BL @@ -161,7 +161,7 @@ describe('Block diagram', () => { it('BL11: should handle edges to composite blocks', () => { imgSnapshotTest( - `block-beta + `block columns 3 B space block BL @@ -175,7 +175,7 @@ describe('Block diagram', () => { it('BL12: edges should handle labels', () => { imgSnapshotTest( - `block-beta + `block A space A -- "apa" --> E @@ -186,7 +186,7 @@ describe('Block diagram', () => { it('BL13: should handle block arrows in different directions', () => { imgSnapshotTest( - `block-beta + `block columns 3 space blockArrowId1<["down"]>(down) space blockArrowId2<["right"]>(right) blockArrowId3<["Sync"]>(x, y) blockArrowId4<["left"]>(left) @@ -199,7 +199,7 @@ describe('Block diagram', () => { it('BL14: should style statements and class statements', () => { imgSnapshotTest( - `block-beta + `block A B classDef blue fill:#66f,stroke:#333,stroke-width:2px; @@ -212,7 +212,7 @@ describe('Block diagram', () => { it('BL15: width alignment - D and E should share available space', () => { imgSnapshotTest( - `block-beta + `block block D E @@ -225,7 +225,7 @@ describe('Block diagram', () => { it('BL16: width alignment - C should be as wide as the composite block', () => { imgSnapshotTest( - `block-beta + `block block A("This is the text") B @@ -238,7 +238,7 @@ describe('Block diagram', () => { it('BL17: width alignment - blocks should be equal in width', () => { imgSnapshotTest( - `block-beta + `block A("This is the text") B C @@ -249,7 +249,7 @@ describe('Block diagram', () => { it('BL18: block types 1 - square, rounded and circle', () => { imgSnapshotTest( - `block-beta + `block A["square"] B("rounded") C(("circle")) @@ -260,7 +260,7 @@ describe('Block diagram', () => { it('BL19: block types 2 - odd, diamond and hexagon', () => { imgSnapshotTest( - `block-beta + `block A>"rect_left_inv_arrow"] B{"diamond"} C{{"hexagon"}} @@ -271,7 +271,7 @@ describe('Block diagram', () => { it('BL20: block types 3 - stadium', () => { imgSnapshotTest( - `block-beta + `block A(["stadium"]) `, {} @@ -280,7 +280,7 @@ describe('Block diagram', () => { it('BL21: block types 4 - lean right, lean left, trapezoid and inv trapezoid', () => { imgSnapshotTest( - `block-beta + `block A[/"lean right"/] B[\"lean left"\] C[/"trapezoid"\] @@ -292,7 +292,7 @@ describe('Block diagram', () => { it('BL22: block types 1 - square, rounded and circle', () => { imgSnapshotTest( - `block-beta + `block A["square"] B("rounded") C(("circle")) @@ -303,7 +303,7 @@ describe('Block diagram', () => { it('BL23: sizing - it should be possible to make a block wider', () => { imgSnapshotTest( - `block-beta + `block A("rounded"):2 B:2 C @@ -314,7 +314,7 @@ describe('Block diagram', () => { it('BL24: sizing - it should be possible to make a composite block wider', () => { imgSnapshotTest( - `block-beta + `block block:2 A end @@ -326,7 +326,7 @@ describe('Block diagram', () => { it('BL25: block in the middle with space on each side', () => { imgSnapshotTest( - `block-beta + `block columns 3 space middle["In the middle"] @@ -337,7 +337,7 @@ describe('Block diagram', () => { }); it('BL26: space and an edge', () => { imgSnapshotTest( - `block-beta + `block columns 5 A space B A --x B @@ -347,7 +347,7 @@ describe('Block diagram', () => { }); it('BL27: block sizes for regular blocks', () => { imgSnapshotTest( - `block-beta + `block columns 3 a["A wide one"] b:2 c:2 d `, @@ -356,7 +356,7 @@ describe('Block diagram', () => { }); it('BL28: composite block with a set width - f should use the available space', () => { imgSnapshotTest( - `block-beta + `block columns 3 a:3 block:e:3 @@ -370,7 +370,7 @@ describe('Block diagram', () => { it('BL29: composite block with a set width - f and g should split the available space', () => { imgSnapshotTest( - `block-beta + `block columns 3 a:3 block:e:3 diff --git a/demos/block.html b/demos/block.html index f0957b670..5296126e0 100644 --- a/demos/block.html +++ b/demos/block.html @@ -10,7 +10,7 @@

Block diagram demos

-block-beta
+block
 columns 1
   db(("DB"))
   blockArrowId6<["   "]>(down)
@@ -26,7 +26,7 @@ columns 1
   style B fill:#f9F,stroke:#333,stroke-width:4px
     
-block-beta
+block
     A1["square"]
     B1("rounded")
     C1(("circle"))
@@ -36,7 +36,7 @@ block-beta
     
-block-beta
+block
     A1(["stadium"])
     A2[["subroutine"]]
     B1[("cylinder")]
@@ -48,7 +48,7 @@ block-beta
     
-block-beta
+block
   block:e:4
     columns 2
       f
@@ -57,7 +57,7 @@ block-beta
 
     
-block-beta
+block
   block:e:4
     columns 2
       f
@@ -67,7 +67,7 @@ block-beta
 
     
-block-beta
+block
   columns 3
   a:3
   block:e:3
@@ -80,7 +80,7 @@ block-beta
 
     
-block-beta
+block
   columns 4
   a b c d
   block:e:4
@@ -97,19 +97,19 @@ flowchart LR
   X-- "a label" -->z
     
-block-beta
+block
 columns 5
    A space B
    A --x B
     
-block-beta
+block
 columns 3
   a["A wide one"] b:2 c:2 d
     
-block-beta
+block
 columns 3
   a b c
   e:3
@@ -117,7 +117,7 @@ columns 3
     
-block-beta
+block
 
   A1:3
   A2:1
diff --git a/docs/syntax/block.md b/docs/syntax/block.md
index d711a2c92..5ca0db719 100644
--- a/docs/syntax/block.md
+++ b/docs/syntax/block.md
@@ -9,7 +9,7 @@
 ## Introduction to Block Diagrams
 
 ```mermaid-example
-block-beta
+block
 columns 1
   db(("DB"))
   blockArrowId6<["   "]>(down)
@@ -26,7 +26,7 @@ columns 1
 ```
 
 ```mermaid
-block-beta
+block
 columns 1
   db(("DB"))
   blockArrowId6<["   "]>(down)
@@ -80,12 +80,12 @@ At its core, a block diagram consists of blocks representing different entities
 To create a simple block diagram with three blocks labeled 'a', 'b', and 'c', the syntax is as follows:
 
 ```mermaid-example
-block-beta
+block
   a b c
 ```
 
 ```mermaid
-block-beta
+block
   a b c
 ```
 
@@ -101,13 +101,13 @@ While simple block diagrams are linear and straightforward, more complex systems
 In scenarios where you need to distribute blocks across multiple columns, you can specify the number of columns and arrange the blocks accordingly. Here's how to create a block diagram with three columns and four blocks, where the fourth block appears in a second row:
 
 ```mermaid-example
-block-beta
+block
   columns 3
   a b c d
 ```
 
 ```mermaid
-block-beta
+block
   columns 3
   a b c d
 ```
@@ -130,13 +130,13 @@ In more complex diagrams, you may need blocks that span multiple columns to emph
 To create a block diagram where one block spans across two columns, you can specify the desired width for each block:
 
 ```mermaid-example
-block-beta
+block
   columns 3
   a["A label"] b:2 c:2 d
 ```
 
 ```mermaid
-block-beta
+block
   columns 3
   a["A label"] b:2 c:2 d
 ```
@@ -153,7 +153,7 @@ Composite blocks, or blocks within blocks, are an advanced feature in Mermaid's
 Creating a composite block involves defining a parent block and then nesting other blocks within it. Here's how to define a composite block with nested elements:
 
 ```mermaid-example
-block-beta
+block
     block
       D
     end
@@ -161,7 +161,7 @@ block-beta
 ```
 
 ```mermaid
-block-beta
+block
     block
       D
     end
@@ -180,7 +180,7 @@ Mermaid also allows for dynamic adjustment of column widths based on the content
 In diagrams with varying block sizes, Mermaid automatically adjusts the column widths to fit the largest block in each column. Here's an example:
 
 ```mermaid-example
-block-beta
+block
   columns 3
   a:3
   block:group1:2
@@ -195,7 +195,7 @@ block-beta
 ```
 
 ```mermaid
-block-beta
+block
   columns 3
   a:3
   block:group1:2
@@ -215,7 +215,7 @@ This example demonstrates how Mermaid dynamically adjusts the width of the colum
 In scenarios where you need to stack blocks horizontally, you can use column width to accomplish the task. Blocks can be arranged vertically by putting them in a single column. Here is how you can create a block diagram in which 4 blocks are stacked on top of each other:
 
 ```mermaid-example
-block-beta
+block
   block
     columns 1
     a["A label"] b c d
@@ -223,7 +223,7 @@ block-beta
 ```
 
 ```mermaid
-block-beta
+block
   block
     columns 1
     a["A label"] b c d
@@ -247,12 +247,12 @@ Mermaid supports a range of block shapes to suit different diagramming needs, fr
 To create a block with round edges, which can be used to represent a softer or more flexible component:
 
 ```mermaid-example
-block-beta
+block
     id1("This is the text in the box")
 ```
 
 ```mermaid
-block-beta
+block
     id1("This is the text in the box")
 ```
 
@@ -261,12 +261,12 @@ block-beta
 A stadium-shaped block, resembling an elongated circle, can be used for components that are process-oriented:
 
 ```mermaid-example
-block-beta
+block
     id1(["This is the text in the box"])
 ```
 
 ```mermaid
-block-beta
+block
     id1(["This is the text in the box"])
 ```
 
@@ -275,12 +275,12 @@ block-beta
 For representing subroutines or contained processes, a block with double vertical lines is useful:
 
 ```mermaid-example
-block-beta
+block
     id1[["This is the text in the box"]]
 ```
 
 ```mermaid
-block-beta
+block
     id1[["This is the text in the box"]]
 ```
 
@@ -289,12 +289,12 @@ block-beta
 The cylindrical shape is ideal for representing databases or storage components:
 
 ```mermaid-example
-block-beta
+block
     id1[("Database")]
 ```
 
 ```mermaid
-block-beta
+block
     id1[("Database")]
 ```
 
@@ -303,12 +303,12 @@ block-beta
 A circle can be used for centralized or pivotal components:
 
 ```mermaid-example
-block-beta
+block
     id1(("This is the text in the circle"))
 ```
 
 ```mermaid
-block-beta
+block
     id1(("This is the text in the circle"))
 ```
 
@@ -319,36 +319,36 @@ For decision points, use a rhombus, and for unique or specialized processes, asy
 **Asymmetric**
 
 ```mermaid-example
-block-beta
+block
   id1>"This is the text in the box"]
 ```
 
 ```mermaid
-block-beta
+block
   id1>"This is the text in the box"]
 ```
 
 **Rhombus**
 
 ```mermaid-example
-block-beta
+block
     id1{"This is the text in the box"}
 ```
 
 ```mermaid
-block-beta
+block
     id1{"This is the text in the box"}
 ```
 
 **Hexagon**
 
 ```mermaid-example
-block-beta
+block
     id1{{"This is the text in the box"}}
 ```
 
 ```mermaid
-block-beta
+block
     id1{{"This is the text in the box"}}
 ```
 
@@ -357,7 +357,7 @@ block-beta
 Parallelogram and trapezoid shapes are perfect for inputs/outputs and transitional processes:
 
 ```mermaid-example
-block-beta
+block
   id1[/"This is the text in the box"/]
   id2[\"This is the text in the box"\]
   A[/"Christmas"\]
@@ -365,7 +365,7 @@ block-beta
 ```
 
 ```mermaid
-block-beta
+block
   id1[/"This is the text in the box"/]
   id2[\"This is the text in the box"\]
   A[/"Christmas"\]
@@ -377,12 +377,12 @@ block-beta
 For highlighting critical or high-priority components, a double circle can be effective:
 
 ```mermaid-example
-block-beta
+block
     id1((("This is the text in the circle")))
 ```
 
 ```mermaid
-block-beta
+block
     id1((("This is the text in the circle")))
 ```
 
@@ -395,7 +395,7 @@ Mermaid also offers unique shapes like block arrows and space blocks for directi
 Block arrows can visually indicate direction or flow within a process:
 
 ```mermaid-example
-block-beta
+block
   blockArrowId<["Label"]>(right)
   blockArrowId2<["Label"]>(left)
   blockArrowId3<["Label"]>(up)
@@ -406,7 +406,7 @@ block-beta
 ```
 
 ```mermaid
-block-beta
+block
   blockArrowId<["Label"]>(right)
   blockArrowId2<["Label"]>(left)
   blockArrowId3<["Label"]>(up)
@@ -421,14 +421,14 @@ block-beta
 Space blocks can be used to create intentional empty spaces in the diagram, which is useful for layout and readability:
 
 ```mermaid-example
-block-beta
+block
   columns 3
   a space b
   c   d   e
 ```
 
 ```mermaid
-block-beta
+block
   columns 3
   a space b
   c   d   e
@@ -437,12 +437,12 @@ block-beta
 or
 
 ```mermaid-example
-block-beta
+block
   ida space:3 idb idc
 ```
 
 ```mermaid
-block-beta
+block
   ida space:3 idb idc
 ```
 
@@ -467,13 +467,13 @@ The most fundamental aspect of connecting blocks is the use of arrows or links.
 A simple link with an arrow can be created to show direction or flow from one block to another:
 
 ```mermaid-example
-block-beta
+block
   A space B
   A-->B
 ```
 
 ```mermaid
-block-beta
+block
   A space B
   A-->B
 ```
@@ -490,13 +490,13 @@ Example - Text with Links
 To add text to a link, the syntax includes the text within the link definition:
 
 ```mermaid-example
-block-beta
+block
   A space:2 B
   A-- "X" -->B
 ```
 
 ```mermaid
-block-beta
+block
   A space:2 B
   A-- "X" -->B
 ```
@@ -506,7 +506,7 @@ This example show how to add descriptive text to the links, enhancing the inform
 Example - Edges and Styles:
 
 ```mermaid-example
-block-beta
+block
 columns 1
   db(("DB"))
   blockArrowId6<["   "]>(down)
@@ -523,7 +523,7 @@ columns 1
 ```
 
 ```mermaid
-block-beta
+block
 columns 1
   db(("DB"))
   blockArrowId6<["   "]>(down)
@@ -552,7 +552,7 @@ Mermaid enables detailed styling of individual blocks, allowing you to apply var
 To apply custom styles to a block, you can use the `style` keyword followed by the block identifier and the desired CSS properties:
 
 ```mermaid-example
-block-beta
+block
   id1 space id2
   id1("Start")-->id2("Stop")
   style id1 fill:#636,stroke:#333,stroke-width:4px
@@ -560,7 +560,7 @@ block-beta
 ```
 
 ```mermaid
-block-beta
+block
   id1 space id2
   id1("Start")-->id2("Stop")
   style id1 fill:#636,stroke:#333,stroke-width:4px
@@ -574,7 +574,7 @@ Mermaid enables applying styling to classes, which could make styling easier if
 #### Example - Styling a Single Class
 
 ```mermaid-example
-block-beta
+block
   A space B
   A-->B
   classDef blue fill:#6e6ce6,stroke:#333,stroke-width:4px;
@@ -583,7 +583,7 @@ block-beta
 ```
 
 ```mermaid
-block-beta
+block
   A space B
   A-->B
   classDef blue fill:#6e6ce6,stroke:#333,stroke-width:4px;
@@ -608,7 +608,7 @@ Combining the elements of structure, linking, and styling, we can create compreh
 Illustrating a simple software system architecture with interconnected components:
 
 ```mermaid-example
-block-beta
+block
   columns 3
   Frontend blockArrowId6<[" "]>(right) Backend
   space:2 down<[" "]>(down)
@@ -621,7 +621,7 @@ block-beta
 ```
 
 ```mermaid
-block-beta
+block
   columns 3
   Frontend blockArrowId6<[" "]>(right) Backend
   space:2 down<[" "]>(down)
@@ -640,7 +640,7 @@ This example shows a basic architecture with a frontend, backend, and database.
 Representing a business process flow with decision points and multiple stages:
 
 ```mermaid-example
-block-beta
+block
   columns 3
   Start(("Start")) space:2
   down<[" "]>(down) space:2
@@ -653,7 +653,7 @@ block-beta
 ```
 
 ```mermaid
-block-beta
+block
   columns 3
   Start(("Start")) space:2
   down<[" "]>(down) space:2
@@ -682,7 +682,7 @@ Understanding and avoiding common syntax errors is key to a smooth experience wi
 A common mistake is incorrect linking syntax, which can lead to unexpected results or broken diagrams:
 
 ```
-block-beta
+block
   A - B
 ```
 
@@ -690,13 +690,13 @@ block-beta
 Ensure that links between blocks are correctly specified with arrows (--> or ---) to define the direction and type of connection. Also remember that one of the fundamentals for block diagram is to give the author full control of where the boxes are positioned so in the example you need to add a space between the boxes:
 
 ```mermaid-example
-block-beta
+block
   A space B
   A --> B
 ```
 
 ```mermaid
-block-beta
+block
   A space B
   A --> B
 ```
@@ -706,13 +706,13 @@ block-beta
 Applying styles in the wrong context or with incorrect syntax can lead to blocks not being styled as intended:
 
 ```mermaid-example
-  block-beta
+  block
     A
     style A fill#969;
 ```
 
 ```mermaid
-  block-beta
+  block
     A
     style A fill#969;
 ```
@@ -721,14 +721,14 @@ Applying styles in the wrong context or with incorrect syntax can lead to blocks
 Correct the syntax by ensuring proper separation of style properties with commas and using the correct CSS property format:
 
 ```mermaid-example
-block-beta
+block
   A
   style A fill:#969,stroke:#333;
 
 ```
 
 ```mermaid
-block-beta
+block
   A
   style A fill:#969,stroke:#333;
 
diff --git a/packages/mermaid/src/diagrams/block/blockDetector.ts b/packages/mermaid/src/diagrams/block/blockDetector.ts
index c4da643f0..6122221e8 100644
--- a/packages/mermaid/src/diagrams/block/blockDetector.ts
+++ b/packages/mermaid/src/diagrams/block/blockDetector.ts
@@ -3,7 +3,7 @@ import type { DiagramDetector, ExternalDiagramDefinition } from '../../diagram-a
 const id = 'block';
 
 const detector: DiagramDetector = (txt) => {
-  return /^\s*block-beta/.test(txt);
+  return /^\s*block(-beta)?/.test(txt);
 };
 
 const loader = async () => {
diff --git a/packages/mermaid/src/diagrams/block/parser/block.jison b/packages/mermaid/src/diagrams/block/parser/block.jison
index 88bdf729e..3aa2759a6 100644
--- a/packages/mermaid/src/diagrams/block/parser/block.jison
+++ b/packages/mermaid/src/diagrams/block/parser/block.jison
@@ -36,10 +36,10 @@ CRLF \u000D\u000A
 
 %%
 
-"block-beta"                                             { return 'BLOCK_DIAGRAM_KEY'; }
-"block"\s+            { yy.getLogger().debug('Found space-block'); return 'block';}
-"block"\n+            { yy.getLogger().debug('Found nl-block'); return 'block';}
-"block:"            { yy.getLogger().debug('Found space-block'); return 'id-block';}
+"block-beta"              { yy.getLogger().debug('Found block-beta'); return 'BLOCK_DIAGRAM_KEY'; }
+"block:"                  { yy.getLogger().debug('Found id-block'); return 'id-block'; }
+"block"                   { yy.getLogger().debug('Found block'); return 'BLOCK_DIAGRAM_KEY'; }
+
 // \s*\%\%.*                                                       { yy.getLogger().debug('Found comment',yytext); }
 [\s]+                                                           { yy.getLogger().debug('.', yytext); /* skip all whitespace */  }
 [\n]+ {yy.getLogger().debug('_', yytext);                 /* skip all whitespace */   }
@@ -240,7 +240,7 @@ columnsStatement
 
 blockStatement
   : id-block nodeStatement document end { yy.getLogger().debug('Rule: id-block statement : ', $2, $3); const id2 = yy.generateId(); $$ = { ...$2, type:'composite', children: $3 }; }
-  | block document end { yy.getLogger().debug('Rule: blockStatement : ', $1, $2, $3); const id = yy.generateId(); $$ = { id, type:'composite', label:'', children: $2 }; }
+  | BLOCK_DIAGRAM_KEY document end { yy.getLogger().debug('Rule: blockStatement : ', $1, $2, $3); const id = yy.generateId(); $$ = { id, type:'composite', label:'', children: $2 }; }
   ;
 
 node
diff --git a/packages/mermaid/src/diagrams/block/parser/block.spec.ts b/packages/mermaid/src/diagrams/block/parser/block.spec.ts
index 4bf3290d8..09f3eb02a 100644
--- a/packages/mermaid/src/diagrams/block/parser/block.spec.ts
+++ b/packages/mermaid/src/diagrams/block/parser/block.spec.ts
@@ -22,7 +22,7 @@ describe('Block diagram', function () {
       expect(blocks[0].label).toBe('id');
     });
     it('a node with a square shape and a label', () => {
-      const str = `block-beta
+      const str = `block
           id["A label"]
           `;
 
@@ -34,7 +34,7 @@ describe('Block diagram', function () {
       expect(blocks[0].type).toBe('square');
     });
     it('a diagram with multiple nodes', () => {
-      const str = `block-beta
+      const str = `block
           id1
           id2
       `;
@@ -50,7 +50,7 @@ describe('Block diagram', function () {
       expect(blocks[1].type).toBe('na');
     });
     it('a diagram with multiple nodes', () => {
-      const str = `block-beta
+      const str = `block
           id1
           id2
           id3
@@ -71,7 +71,7 @@ describe('Block diagram', function () {
     });
 
     it('a node with a square shape and a label', () => {
-      const str = `block-beta
+      const str = `block
           id["A label"]
           id2`;
 
@@ -86,7 +86,7 @@ describe('Block diagram', function () {
       expect(blocks[1].type).toBe('na');
     });
     it('a diagram with multiple nodes with edges abc123', () => {
-      const str = `block-beta
+      const str = `block
           id1["first"]  -->   id2["second"]
       `;
 
@@ -100,7 +100,7 @@ describe('Block diagram', function () {
       expect(edges[0].arrowTypeEnd).toBe('arrow_point');
     });
     it('a diagram with multiple nodes with edges abc123', () => {
-      const str = `block-beta
+      const str = `block
           id1["first"]  -- "a label" -->   id2["second"]
       `;
 
@@ -115,7 +115,7 @@ describe('Block diagram', function () {
       expect(edges[0].label).toBe('a label');
     });
     it('a diagram with column statements', () => {
-      const str = `block-beta
+      const str = `block
           columns 2
           block1["Block 1"]
       `;
@@ -126,7 +126,7 @@ describe('Block diagram', function () {
       expect(blocks.length).toBe(1);
     });
     it('a diagram without column statements', () => {
-      const str = `block-beta
+      const str = `block
           block1["Block 1"]
       `;
 
@@ -136,7 +136,7 @@ describe('Block diagram', function () {
       expect(blocks.length).toBe(1);
     });
     it('a diagram with auto column statements', () => {
-      const str = `block-beta
+      const str = `block
           columns auto
           block1["Block 1"]
       `;
@@ -148,7 +148,7 @@ describe('Block diagram', function () {
     });
 
     it('blocks next to each other', () => {
-      const str = `block-beta
+      const str = `block
           columns 2
           block1["Block 1"]
           block2["Block 2"]
@@ -162,7 +162,7 @@ describe('Block diagram', function () {
     });
 
     it('blocks on top of each other', () => {
-      const str = `block-beta
+      const str = `block
           columns 1
           block1["Block 1"]
           block2["Block 2"]
@@ -176,7 +176,7 @@ describe('Block diagram', function () {
     });
 
     it('compound blocks 2', () => {
-      const str = `block-beta
+      const str = `block
           block
             aBlock["ABlock"]
             bBlock["BBlock"]
@@ -204,7 +204,7 @@ describe('Block diagram', function () {
       expect(bBlock.type).toBe('square');
     });
     it('compound blocks of compound blocks', () => {
-      const str = `block-beta
+      const str = `block
           block
             aBlock["ABlock"]
             block
@@ -239,7 +239,7 @@ describe('Block diagram', function () {
       expect(bBlock.type).toBe('square');
     });
     it('compound blocks with title', () => {
-      const str = `block-beta
+      const str = `block
           block:compoundBlock["Compound block"]
             columns 1
             block2["Block 2"]
@@ -264,7 +264,7 @@ describe('Block diagram', function () {
       expect(block2.type).toBe('square');
     });
     it('blocks mixed with compound blocks', () => {
-      const str = `block-beta
+      const str = `block
           columns 1
           block1["Block 1"]
 
@@ -291,7 +291,7 @@ describe('Block diagram', function () {
     });
 
     it('Arrow blocks', () => {
-      const str = `block-beta
+      const str = `block
         columns 3
         block1["Block 1"]
         blockArrow<["   "]>(right)
@@ -315,7 +315,7 @@ describe('Block diagram', function () {
       expect(blockArrow.directions).toContain('right');
     });
     it('Arrow blocks with multiple points', () => {
-      const str = `block-beta
+      const str = `block
         columns 1
         A
         blockArrow<["   "]>(up, down)
@@ -338,7 +338,7 @@ describe('Block diagram', function () {
       expect(blockArrow.directions).not.toContain('right');
     });
     it('blocks with different widths', () => {
-      const str = `block-beta
+      const str = `block
         columns 3
         one["One Slot"]
         two["Two slots"]:2
@@ -353,7 +353,7 @@ describe('Block diagram', function () {
       expect(two.widthInColumns).toBe(2);
     });
     it('empty blocks', () => {
-      const str = `block-beta
+      const str = `block
         columns 3
         space
         middle["In the middle"]
@@ -372,7 +372,7 @@ describe('Block diagram', function () {
       expect(middle.label).toBe('In the middle');
     });
     it('classDef statements applied to a block', () => {
-      const str = `block-beta
+      const str = `block
         classDef black color:#ffffff, fill:#000000;
 
         mc["Memcache"]
@@ -390,7 +390,7 @@ describe('Block diagram', function () {
       expect(black.styles[0]).toEqual('color:#ffffff');
     });
     it('style statements applied to a block', () => {
-      const str = `block-beta
+      const str = `block
 columns 1
     B["A wide one in the middle"]
   style B fill:#f9F,stroke:#333,stroke-width:4px
@@ -406,9 +406,9 @@ columns 1
 
   describe('prototype properties', function () {
     function validateProperty(prop: string) {
-      expect(() => block.parse(`block-beta\n${prop}`)).not.toThrow();
+      expect(() => block.parse(`block\n${prop}`)).not.toThrow();
       expect(() =>
-        block.parse(`block-beta\nA; classDef ${prop} color:#ffffff,fill:#000000; class A ${prop}`)
+        block.parse(`block\nA; classDef ${prop} color:#ffffff,fill:#000000; class A ${prop}`)
       ).not.toThrow();
     }
 
diff --git a/packages/mermaid/src/docs/syntax/block.md b/packages/mermaid/src/docs/syntax/block.md
index ac5b53d5e..985ce1d8c 100644
--- a/packages/mermaid/src/docs/syntax/block.md
+++ b/packages/mermaid/src/docs/syntax/block.md
@@ -8,7 +8,7 @@ outline: 'deep' # shows all h3 headings in outline in Vitepress
 ## Introduction to Block Diagrams
 
 ```mermaid-example
-block-beta
+block
 columns 1
   db(("DB"))
   blockArrowId6<["   "]>(down)
@@ -62,7 +62,7 @@ At its core, a block diagram consists of blocks representing different entities
 To create a simple block diagram with three blocks labeled 'a', 'b', and 'c', the syntax is as follows:
 
 ```mermaid-example
-block-beta
+block
   a b c
 ```
 
@@ -78,7 +78,7 @@ While simple block diagrams are linear and straightforward, more complex systems
 In scenarios where you need to distribute blocks across multiple columns, you can specify the number of columns and arrange the blocks accordingly. Here's how to create a block diagram with three columns and four blocks, where the fourth block appears in a second row:
 
 ```mermaid-example
-block-beta
+block
   columns 3
   a b c d
 ```
@@ -101,7 +101,7 @@ In more complex diagrams, you may need blocks that span multiple columns to emph
 To create a block diagram where one block spans across two columns, you can specify the desired width for each block:
 
 ```mermaid-example
-block-beta
+block
   columns 3
   a["A label"] b:2 c:2 d
 ```
@@ -118,7 +118,7 @@ Composite blocks, or blocks within blocks, are an advanced feature in Mermaid's
 Creating a composite block involves defining a parent block and then nesting other blocks within it. Here's how to define a composite block with nested elements:
 
 ```mermaid-example
-block-beta
+block
     block
       D
     end
@@ -137,7 +137,7 @@ Mermaid also allows for dynamic adjustment of column widths based on the content
 In diagrams with varying block sizes, Mermaid automatically adjusts the column widths to fit the largest block in each column. Here's an example:
 
 ```mermaid-example
-block-beta
+block
   columns 3
   a:3
   block:group1:2
@@ -157,7 +157,7 @@ This example demonstrates how Mermaid dynamically adjusts the width of the colum
 In scenarios where you need to stack blocks horizontally, you can use column width to accomplish the task. Blocks can be arranged vertically by putting them in a single column. Here is how you can create a block diagram in which 4 blocks are stacked on top of each other:
 
 ```mermaid-example
-block-beta
+block
   block
     columns 1
     a["A label"] b c d
@@ -181,7 +181,7 @@ Mermaid supports a range of block shapes to suit different diagramming needs, fr
 To create a block with round edges, which can be used to represent a softer or more flexible component:
 
 ```mermaid-example
-block-beta
+block
     id1("This is the text in the box")
 ```
 
@@ -190,7 +190,7 @@ block-beta
 A stadium-shaped block, resembling an elongated circle, can be used for components that are process-oriented:
 
 ```mermaid-example
-block-beta
+block
     id1(["This is the text in the box"])
 ```
 
@@ -199,7 +199,7 @@ block-beta
 For representing subroutines or contained processes, a block with double vertical lines is useful:
 
 ```mermaid-example
-block-beta
+block
     id1[["This is the text in the box"]]
 ```
 
@@ -208,7 +208,7 @@ block-beta
 The cylindrical shape is ideal for representing databases or storage components:
 
 ```mermaid-example
-block-beta
+block
     id1[("Database")]
 ```
 
@@ -217,7 +217,7 @@ block-beta
 A circle can be used for centralized or pivotal components:
 
 ```mermaid-example
-block-beta
+block
     id1(("This is the text in the circle"))
 ```
 
@@ -228,21 +228,21 @@ For decision points, use a rhombus, and for unique or specialized processes, asy
 **Asymmetric**
 
 ```mermaid-example
-block-beta
+block
   id1>"This is the text in the box"]
 ```
 
 **Rhombus**
 
 ```mermaid-example
-block-beta
+block
     id1{"This is the text in the box"}
 ```
 
 **Hexagon**
 
 ```mermaid-example
-block-beta
+block
     id1{{"This is the text in the box"}}
 ```
 
@@ -251,7 +251,7 @@ block-beta
 Parallelogram and trapezoid shapes are perfect for inputs/outputs and transitional processes:
 
 ```mermaid-example
-block-beta
+block
   id1[/"This is the text in the box"/]
   id2[\"This is the text in the box"\]
   A[/"Christmas"\]
@@ -263,7 +263,7 @@ block-beta
 For highlighting critical or high-priority components, a double circle can be effective:
 
 ```mermaid-example
-block-beta
+block
     id1((("This is the text in the circle")))
 ```
 
@@ -276,7 +276,7 @@ Mermaid also offers unique shapes like block arrows and space blocks for directi
 Block arrows can visually indicate direction or flow within a process:
 
 ```mermaid-example
-block-beta
+block
   blockArrowId<["Label"]>(right)
   blockArrowId2<["Label"]>(left)
   blockArrowId3<["Label"]>(up)
@@ -291,7 +291,7 @@ block-beta
 Space blocks can be used to create intentional empty spaces in the diagram, which is useful for layout and readability:
 
 ```mermaid-example
-block-beta
+block
   columns 3
   a space b
   c   d   e
@@ -300,7 +300,7 @@ block-beta
 or
 
 ```mermaid-example
-block-beta
+block
   ida space:3 idb idc
 ```
 
@@ -325,7 +325,7 @@ The most fundamental aspect of connecting blocks is the use of arrows or links.
 A simple link with an arrow can be created to show direction or flow from one block to another:
 
 ```mermaid-example
-block-beta
+block
   A space B
   A-->B
 ```
@@ -342,7 +342,7 @@ Example - Text with Links
 To add text to a link, the syntax includes the text within the link definition:
 
 ```mermaid-example
-block-beta
+block
   A space:2 B
   A-- "X" -->B
 ```
@@ -352,7 +352,7 @@ This example show how to add descriptive text to the links, enhancing the inform
 Example - Edges and Styles:
 
 ```mermaid-example
-block-beta
+block
 columns 1
   db(("DB"))
   blockArrowId6<["   "]>(down)
@@ -381,7 +381,7 @@ Mermaid enables detailed styling of individual blocks, allowing you to apply var
 To apply custom styles to a block, you can use the `style` keyword followed by the block identifier and the desired CSS properties:
 
 ```mermaid-example
-block-beta
+block
   id1 space id2
   id1("Start")-->id2("Stop")
   style id1 fill:#636,stroke:#333,stroke-width:4px
@@ -395,7 +395,7 @@ Mermaid enables applying styling to classes, which could make styling easier if
 #### Example - Styling a Single Class
 
 ```mermaid-example
-block-beta
+block
   A space B
   A-->B
   classDef blue fill:#6e6ce6,stroke:#333,stroke-width:4px;
@@ -420,7 +420,7 @@ Combining the elements of structure, linking, and styling, we can create compreh
 Illustrating a simple software system architecture with interconnected components:
 
 ```mermaid
-block-beta
+block
   columns 3
   Frontend blockArrowId6<[" "]>(right) Backend
   space:2 down<[" "]>(down)
@@ -439,7 +439,7 @@ This example shows a basic architecture with a frontend, backend, and database.
 Representing a business process flow with decision points and multiple stages:
 
 ```mermaid-example
-block-beta
+block
   columns 3
   Start(("Start")) space:2
   down<[" "]>(down) space:2
@@ -468,7 +468,7 @@ Understanding and avoiding common syntax errors is key to a smooth experience wi
 A common mistake is incorrect linking syntax, which can lead to unexpected results or broken diagrams:
 
 ```
-block-beta
+block
   A - B
 ```
 
@@ -476,7 +476,7 @@ block-beta
 Ensure that links between blocks are correctly specified with arrows (--> or ---) to define the direction and type of connection. Also remember that one of the fundamentals for block diagram is to give the author full control of where the boxes are positioned so in the example you need to add a space between the boxes:
 
 ```mermaid-example
-block-beta
+block
   A space B
   A --> B
 ```
@@ -486,7 +486,7 @@ block-beta
 Applying styles in the wrong context or with incorrect syntax can lead to blocks not being styled as intended:
 
 ```mermaid-example
-  block-beta
+  block
     A
     style A fill#969;
 ```
@@ -495,7 +495,7 @@ Applying styles in the wrong context or with incorrect syntax can lead to blocks
 Correct the syntax by ensuring proper separation of style properties with commas and using the correct CSS property format:
 
 ```mermaid-example
-block-beta
+block
   A
   style A fill:#969,stroke:#333;
 

From 98442294edf7bdf0ed5f38c63a0b7c5f1bf5e7e8 Mon Sep 17 00:00:00 2001
From: darshanr0107 
Date: Tue, 17 Jun 2025 13:44:12 +0530
Subject: [PATCH 011/143] resolved PR comments

---
 packages/mermaid/src/diagrams/pie/pie.spec.ts | 28 ++++++++++++-------
 1 file changed, 18 insertions(+), 10 deletions(-)

diff --git a/packages/mermaid/src/diagrams/pie/pie.spec.ts b/packages/mermaid/src/diagrams/pie/pie.spec.ts
index 2b50f5604..7b898ca8f 100644
--- a/packages/mermaid/src/diagrams/pie/pie.spec.ts
+++ b/packages/mermaid/src/diagrams/pie/pie.spec.ts
@@ -141,20 +141,28 @@ describe('pie', () => {
 
     it('should handle simple pie with zero slice value', async () => {
       await expect(async () => {
-        await parser.parse(`pie
-        "ash" : 0
-        "bat" : 40.12
-        `);
-      }).rejects.toThrowError();
+        await parser.parse(`pie title Default text position: Animal adoption
+        accTitle: simple pie char demo
+        accDescr: pie chart with 3 sections: dogs, cats, rats. Most are dogs.
+         "dogs" : 0
+        "rats" : 40.12
+    `);
+      }).rejects.toThrowError(
+        '"dogs" has invalid value: 0. Zero and negative values are not allowed in pie charts. All slice values must be > 0'
+      );
     });
 
     it('should handle simple pie with negative slice value', async () => {
       await expect(async () => {
-        await parser.parse(`pie
-        "ash" : -60
-        "bat" : 40.12
-        `);
-      }).rejects.toThrowError();
+        await parser.parse(`pie title Default text position: Animal adoption
+        accTitle: simple pie char demo
+        accDescr: pie chart with 3 sections: dogs, cats, rats. Most are dogs.
+         "dogs" : -60.67
+        "rats" : 40.12
+    `);
+      }).rejects.toThrowError(
+        '"dogs" has invalid value: -60.67. Zero and negative values are not allowed in pie charts. All slice values must be > 0'
+      );
     });
 
     it('should handle unsafe properties', async () => {

From 8224a81ab6a9484053465de985eb377358988af5 Mon Sep 17 00:00:00 2001
From: darshanr0107 
Date: Tue, 17 Jun 2025 13:52:04 +0530
Subject: [PATCH 012/143] fix xychart test cases

---
 packages/mermaid/src/diagrams/xychart/parser/xychart.jison      | 2 +-
 .../mermaid/src/diagrams/xychart/parser/xychart.jison.spec.ts   | 2 +-
 2 files changed, 2 insertions(+), 2 deletions(-)

diff --git a/packages/mermaid/src/diagrams/xychart/parser/xychart.jison b/packages/mermaid/src/diagrams/xychart/parser/xychart.jison
index 8a47b1aac..33575b946 100644
--- a/packages/mermaid/src/diagrams/xychart/parser/xychart.jison
+++ b/packages/mermaid/src/diagrams/xychart/parser/xychart.jison
@@ -29,8 +29,8 @@
 "{"                 { this.popState(); }
 [^\}]*               { return "acc_descr_multiline_value"; }
 
-"xychart"                                 {return 'XYCHART';}
 "xychart-beta"                            {return 'XYCHART';}
+"xychart"                                 {return 'XYCHART';}
 (?:"vertical"|"horizontal")               {return 'CHART_ORIENTATION'}
 
 "x-axis"                                  { this.pushState("axis_data"); return "X_AXIS"; }
diff --git a/packages/mermaid/src/diagrams/xychart/parser/xychart.jison.spec.ts b/packages/mermaid/src/diagrams/xychart/parser/xychart.jison.spec.ts
index ee7c94581..409972828 100644
--- a/packages/mermaid/src/diagrams/xychart/parser/xychart.jison.spec.ts
+++ b/packages/mermaid/src/diagrams/xychart/parser/xychart.jison.spec.ts
@@ -407,7 +407,7 @@ describe('Testing xychart jison file', () => {
   it('parse multiple bar and line variant 2', () => {
     const str = `
     xychart horizontal
-    title Basic xychart
+    title "Basic xychart"
     x-axis "this is x axis" [category1, "category 2", category3]
     y-axis yaxisText 10 --> 150
  bar barTitle1 [23, 45, 56.6]

From 2c0931da46794b49d2523211e25f782900c34e94 Mon Sep 17 00:00:00 2001
From: darshanr0107 
Date: Tue, 17 Jun 2025 15:53:25 +0530
Subject: [PATCH 013/143] added changeset

---
 .changeset/chatty-lemons-stick.md | 5 +++++
 1 file changed, 5 insertions(+)
 create mode 100644 .changeset/chatty-lemons-stick.md

diff --git a/.changeset/chatty-lemons-stick.md b/.changeset/chatty-lemons-stick.md
new file mode 100644
index 000000000..d0a8a4d58
--- /dev/null
+++ b/.changeset/chatty-lemons-stick.md
@@ -0,0 +1,5 @@
+---
+'mermaid': patch
+---
+
+Removed the "Beta" suffix from the XYChart, Block , Sankey diagrams to reflect their stable status

From 3920ad442dbc79bb1d42e34081ee90965bd3c8f5 Mon Sep 17 00:00:00 2001
From: darshanr0107 
Date: Mon, 23 Jun 2025 15:08:11 +0530
Subject: [PATCH 014/143] resolved PR comments

---
 docs/syntax/pie.md                            |  2 +-
 packages/mermaid/src/diagrams/pie/pie.spec.ts | 14 +++++++-------
 packages/mermaid/src/diagrams/pie/pieDb.ts    |  4 ++--
 packages/mermaid/src/docs/syntax/pie.md       |  2 +-
 4 files changed, 11 insertions(+), 11 deletions(-)

diff --git a/docs/syntax/pie.md b/docs/syntax/pie.md
index 87fb3fc58..6a2eefb27 100644
--- a/docs/syntax/pie.md
+++ b/docs/syntax/pie.md
@@ -40,7 +40,7 @@ Drawing a pie chart is really simple in mermaid.
 **Note:**
 
 > Pie chart values must be **positive numbers greater than zero**.\
-> **Zero and negative values are not allowed** and will result in an error.
+> **Negative values are not allowed** and will result in an error.
 
 \[pie] \[showData] (OPTIONAL)
 \[title] \[titlevalue] (OPTIONAL)
diff --git a/packages/mermaid/src/diagrams/pie/pie.spec.ts b/packages/mermaid/src/diagrams/pie/pie.spec.ts
index 7b898ca8f..d5d39692f 100644
--- a/packages/mermaid/src/diagrams/pie/pie.spec.ts
+++ b/packages/mermaid/src/diagrams/pie/pie.spec.ts
@@ -140,16 +140,16 @@ describe('pie', () => {
     });
 
     it('should handle simple pie with zero slice value', async () => {
-      await expect(async () => {
-        await parser.parse(`pie title Default text position: Animal adoption
+      await parser.parse(`pie title Default text position: Animal adoption
         accTitle: simple pie char demo
         accDescr: pie chart with 3 sections: dogs, cats, rats. Most are dogs.
          "dogs" : 0
         "rats" : 40.12
-    `);
-      }).rejects.toThrowError(
-        '"dogs" has invalid value: 0. Zero and negative values are not allowed in pie charts. All slice values must be > 0'
-      );
+      `);
+
+      const sections = db.getSections();
+      expect(sections.get('dogs')).toBe(0);
+      expect(sections.get('rats')).toBe(40.12);
     });
 
     it('should handle simple pie with negative slice value', async () => {
@@ -161,7 +161,7 @@ describe('pie', () => {
         "rats" : 40.12
     `);
       }).rejects.toThrowError(
-        '"dogs" has invalid value: -60.67. Zero and negative values are not allowed in pie charts. All slice values must be > 0'
+        '"dogs" has invalid value: -60.67.Negative values are not allowed in pie charts. All slice values must be > 0'
       );
     });
 
diff --git a/packages/mermaid/src/diagrams/pie/pieDb.ts b/packages/mermaid/src/diagrams/pie/pieDb.ts
index ade44c331..d5c66ff78 100644
--- a/packages/mermaid/src/diagrams/pie/pieDb.ts
+++ b/packages/mermaid/src/diagrams/pie/pieDb.ts
@@ -34,9 +34,9 @@ const clear = (): void => {
 };
 
 const addSection = ({ label, value }: D3Section): void => {
-  if (value <= 0) {
+  if (value < 0) {
     throw new Error(
-      `"${label}" has invalid value: ${value}. Zero and negative values are not allowed in pie charts. All slice values must be > 0.`
+      `"${label}" has invalid value: ${value}.Negative values are not allowed in pie charts. All slice values must be > 0.`
     );
   }
   if (!sections.has(label)) {
diff --git a/packages/mermaid/src/docs/syntax/pie.md b/packages/mermaid/src/docs/syntax/pie.md
index 4ad0dc4e0..416119b5b 100644
--- a/packages/mermaid/src/docs/syntax/pie.md
+++ b/packages/mermaid/src/docs/syntax/pie.md
@@ -27,7 +27,7 @@ Drawing a pie chart is really simple in mermaid.
 **Note:**
 
 > Pie chart values must be **positive numbers greater than zero**.  
-> **Zero and negative values are not allowed** and will result in an error.
+> **Negative values are not allowed** and will result in an error.
 
 [pie] [showData] (OPTIONAL)
 [title] [titlevalue] (OPTIONAL)

From 24257de8a631cd61604eb08015e32cf2fab4acc7 Mon Sep 17 00:00:00 2001
From: darshanr0107 
Date: Tue, 24 Jun 2025 14:50:20 +0530
Subject: [PATCH 015/143] fix state diagram edge label position

---
 .../rendering-util/rendering-elements/edges.js  |  4 ++++
 packages/mermaid/src/utils.ts                   | 17 +++++++++++++++++
 2 files changed, 21 insertions(+)

diff --git a/packages/mermaid/src/rendering-util/rendering-elements/edges.js b/packages/mermaid/src/rendering-util/rendering-elements/edges.js
index a97668d5f..154040d87 100644
--- a/packages/mermaid/src/rendering-util/rendering-elements/edges.js
+++ b/packages/mermaid/src/rendering-util/rendering-elements/edges.js
@@ -638,6 +638,10 @@ export const insertEdge = function (elem, edge, clusterDb, diagramType, startNod
 
   addEdgeMarkers(svgPath, edge, url, id, diagramType, strokeColor);
 
+  if (!utils.isPointInDAttr(points, svgPath.attr('d'))) {
+    pointsHasChanged = true;
+  }
+
   let paths = {};
   if (pointsHasChanged) {
     paths.updatedPath = points;
diff --git a/packages/mermaid/src/utils.ts b/packages/mermaid/src/utils.ts
index 6ed935cf6..61157f827 100644
--- a/packages/mermaid/src/utils.ts
+++ b/packages/mermaid/src/utils.ts
@@ -884,6 +884,7 @@ export default {
   runFunc,
   entityDecode,
   insertTitle,
+  isPointInDAttr,
   parseFontSize,
   InitIDGenerator,
 };
@@ -960,3 +961,19 @@ export function handleUndefinedAttr(
 ) {
   return attrValue ?? null;
 }
+
+export function isPointInDAttr(points: Point[], dAttr: string) {
+  if (!points || points.length < 2 || !dAttr) {
+    return false;
+  }
+
+  const point = points[1];
+  const roundedX = Math.round(point.x);
+  const roundedY = Math.round(point.y);
+
+  const sanitizedD = dAttr.replace(/(\d+\.\d+)/g, (match) =>
+    Math.round(parseFloat(match)).toString()
+  );
+
+  return sanitizedD.includes(roundedX.toString()) || sanitizedD.includes(roundedY.toString());
+}

From 33e08daf175125295a06b1b80279437004a4e865 Mon Sep 17 00:00:00 2001
From: darshanr0107 
Date: Tue, 24 Jun 2025 15:10:36 +0530
Subject: [PATCH 016/143] added changeset

---
 .changeset/cold-sites-accept.md | 5 +++++
 1 file changed, 5 insertions(+)
 create mode 100644 .changeset/cold-sites-accept.md

diff --git a/.changeset/cold-sites-accept.md b/.changeset/cold-sites-accept.md
new file mode 100644
index 000000000..4166d40d4
--- /dev/null
+++ b/.changeset/cold-sites-accept.md
@@ -0,0 +1,5 @@
+---
+'mermaid': patch
+---
+
+edge label in the state diagram was not positioned correctly relative to the edge

From 579c22cf5d94dc038206ad95d812f0f36c4b28b8 Mon Sep 17 00:00:00 2001
From: darshanr0107 
Date: Tue, 24 Jun 2025 17:08:42 +0530
Subject: [PATCH 017/143] refactor code

---
 .../rendering-util/rendering-elements/edges.js |  5 +++--
 packages/mermaid/src/utils.ts                  | 18 +++++++++++-------
 2 files changed, 14 insertions(+), 9 deletions(-)

diff --git a/packages/mermaid/src/rendering-util/rendering-elements/edges.js b/packages/mermaid/src/rendering-util/rendering-elements/edges.js
index 154040d87..db48e313c 100644
--- a/packages/mermaid/src/rendering-util/rendering-elements/edges.js
+++ b/packages/mermaid/src/rendering-util/rendering-elements/edges.js
@@ -637,8 +637,9 @@ export const insertEdge = function (elem, edge, clusterDb, diagramType, startNod
   log.info('arrowTypeEnd', edge.arrowTypeEnd);
 
   addEdgeMarkers(svgPath, edge, url, id, diagramType, strokeColor);
-
-  if (!utils.isPointInDAttr(points, svgPath.attr('d'))) {
+  const midIndex = Math.floor(points.length / 2);
+  const point = points[midIndex];
+  if (!utils.isLabelCoordinateInPath(point, svgPath.attr('d'))) {
     pointsHasChanged = true;
   }
 
diff --git a/packages/mermaid/src/utils.ts b/packages/mermaid/src/utils.ts
index 61157f827..0f1bfbecf 100644
--- a/packages/mermaid/src/utils.ts
+++ b/packages/mermaid/src/utils.ts
@@ -884,7 +884,7 @@ export default {
   runFunc,
   entityDecode,
   insertTitle,
-  isPointInDAttr,
+  isLabelCoordinateInPath,
   parseFontSize,
   InitIDGenerator,
 };
@@ -962,12 +962,16 @@ export function handleUndefinedAttr(
   return attrValue ?? null;
 }
 
-export function isPointInDAttr(points: Point[], dAttr: string) {
-  if (!points || points.length < 2 || !dAttr) {
-    return false;
-  }
-
-  const point = points[1];
+/**
+ * Checks if the  x or y coordinate of the edge label
+ * appears in the given SVG path data string.
+ *
+ * @param point  - The Point object with x and y properties to check.
+ * @param dAttr  - SVG path data string (the 'd' attribute of an SVG path element).
+ * @returns      - True if the rounded x or y coordinate of the edge label is found
+ *                 in the sanitized path data string; otherwise, false.
+ */
+export function isLabelCoordinateInPath(point: Point, dAttr: string) {
   const roundedX = Math.round(point.x);
   const roundedY = Math.round(point.y);
 

From 6621f6ddb2eabff58c10d82a54bc42d7660f1cca Mon Sep 17 00:00:00 2001
From: Khizar Hasan <83395218+zarhasan@users.noreply.github.com>
Date: Wed, 25 Jun 2025 16:25:47 +0530
Subject: [PATCH 018/143] Update integrations-community.md

Added 'WP Documentation' in integrations.
---
 packages/mermaid/src/docs/ecosystem/integrations-community.md | 1 +
 1 file changed, 1 insertion(+)

diff --git a/packages/mermaid/src/docs/ecosystem/integrations-community.md b/packages/mermaid/src/docs/ecosystem/integrations-community.md
index f28570196..4eacc294e 100644
--- a/packages/mermaid/src/docs/ecosystem/integrations-community.md
+++ b/packages/mermaid/src/docs/ecosystem/integrations-community.md
@@ -98,6 +98,7 @@ Blogging frameworks and platforms
   - [Mermaid](https://nextra.site/docs/guide/mermaid)
 - [WordPress](https://wordpress.org)
   - [MerPRess](https://wordpress.org/plugins/merpress/)
+  - [WP Documentation](https://wordpress.org/themes/wp-documentation/)
 
 ### CMS/ECM
 

From e70be4f1553bb61d1ecc183aca9186a5b8fd7fef Mon Sep 17 00:00:00 2001
From: "autofix-ci[bot]" <114827586+autofix-ci[bot]@users.noreply.github.com>
Date: Wed, 25 Jun 2025 11:00:55 +0000
Subject: [PATCH 019/143] [autofix.ci] apply automated fixes

---
 docs/ecosystem/integrations-community.md | 1 +
 1 file changed, 1 insertion(+)

diff --git a/docs/ecosystem/integrations-community.md b/docs/ecosystem/integrations-community.md
index 601c4699d..a0b4794d3 100644
--- a/docs/ecosystem/integrations-community.md
+++ b/docs/ecosystem/integrations-community.md
@@ -103,6 +103,7 @@ Blogging frameworks and platforms
   - [Mermaid](https://nextra.site/docs/guide/mermaid)
 - [WordPress](https://wordpress.org)
   - [MerPRess](https://wordpress.org/plugins/merpress/)
+  - [WP Documentation](https://wordpress.org/themes/wp-documentation/)
 
 ### CMS/ECM
 

From bfa0eefa32a46628d97a4f5bc3f86e9d07764a53 Mon Sep 17 00:00:00 2001
From: darshanr0107 
Date: Fri, 27 Jun 2025 15:01:45 +0530
Subject: [PATCH 020/143] fix gantt chart date format issue

---
 cypress/integration/rendering/gantt.spec.js       | 12 ++++++++++++
 .../mermaid/src/diagrams/gantt/ganttRenderer.js   | 15 +++++++++++++--
 2 files changed, 25 insertions(+), 2 deletions(-)

diff --git a/cypress/integration/rendering/gantt.spec.js b/cypress/integration/rendering/gantt.spec.js
index 2cc67918c..fed4151ec 100644
--- a/cypress/integration/rendering/gantt.spec.js
+++ b/cypress/integration/rendering/gantt.spec.js
@@ -565,6 +565,18 @@ describe('Gantt diagram', () => {
     );
   });
 
+  it('should render only the day when using dateFormat D', () => {
+    imgSnapshotTest(
+      `
+    gantt
+      title Test
+      dateFormat D
+      A :a, 1, 1d
+    `,
+      {}
+    );
+  });
+
   // TODO: fix it
   //
   // This test is skipped deliberately
diff --git a/packages/mermaid/src/diagrams/gantt/ganttRenderer.js b/packages/mermaid/src/diagrams/gantt/ganttRenderer.js
index f5c8c2e38..66ada61c8 100644
--- a/packages/mermaid/src/diagrams/gantt/ganttRenderer.js
+++ b/packages/mermaid/src/diagrams/gantt/ganttRenderer.js
@@ -615,9 +615,20 @@ export const draw = function (text, id, version, diagObj) {
    * @param h
    */
   function makeGrid(theSidePad, theTopPad, w, h) {
+    const dateFormat = diagObj.db.getDateFormat();
+    const userAxisFormat = diagObj.db.getAxisFormat();
+    let axisFormat;
+    if (userAxisFormat) {
+      axisFormat = userAxisFormat;
+    } else if (dateFormat === 'D') {
+      axisFormat = '%d';
+    } else {
+      axisFormat = conf.axisFormat ?? '%Y-%m-%d';
+    }
+
     let bottomXAxis = axisBottom(timeScale)
       .tickSize(-h + theTopPad + conf.gridLineStartPadding)
-      .tickFormat(timeFormat(diagObj.db.getAxisFormat() || conf.axisFormat || '%Y-%m-%d'));
+      .tickFormat(timeFormat(axisFormat));
 
     const reTickInterval = /^([1-9]\d*)(millisecond|second|minute|hour|day|week|month)$/;
     const resultTickInterval = reTickInterval.exec(
@@ -669,7 +680,7 @@ export const draw = function (text, id, version, diagObj) {
     if (diagObj.db.topAxisEnabled() || conf.topAxis) {
       let topXAxis = axisTop(timeScale)
         .tickSize(-h + theTopPad + conf.gridLineStartPadding)
-        .tickFormat(timeFormat(diagObj.db.getAxisFormat() || conf.axisFormat || '%Y-%m-%d'));
+        .tickFormat(timeFormat(axisFormat));
 
       if (resultTickInterval !== null) {
         const every = resultTickInterval[1];

From 814b68b4a94813f7c6b3d7fb4559532a7bab2652 Mon Sep 17 00:00:00 2001
From: darshanr0107 
Date: Fri, 27 Jun 2025 15:16:20 +0530
Subject: [PATCH 021/143] added changeset

---
 .changeset/empty-clouds-cry.md | 5 +++++
 1 file changed, 5 insertions(+)
 create mode 100644 .changeset/empty-clouds-cry.md

diff --git a/.changeset/empty-clouds-cry.md b/.changeset/empty-clouds-cry.md
new file mode 100644
index 000000000..87ba93c6d
--- /dev/null
+++ b/.changeset/empty-clouds-cry.md
@@ -0,0 +1,5 @@
+---
+'mermaid': major
+---
+
+fix: apply correct dateFormat in Gantt chart to show only day when specified

From 939da082b2f5d09fd9b8997114aafa53f597a3a7 Mon Sep 17 00:00:00 2001
From: qraqras 
Date: Sat, 28 Jun 2025 08:18:19 +0000
Subject: [PATCH 022/143] Fix 6633

---
 packages/mermaid/src/diagrams/block/layout.ts | 6 +++++-
 1 file changed, 5 insertions(+), 1 deletion(-)

diff --git a/packages/mermaid/src/diagrams/block/layout.ts b/packages/mermaid/src/diagrams/block/layout.ts
index a00e935ac..9daf0b4c1 100644
--- a/packages/mermaid/src/diagrams/block/layout.ts
+++ b/packages/mermaid/src/diagrams/block/layout.ts
@@ -270,7 +270,11 @@ function layoutBlocks(block: Block, db: BlockDB) {
       if (child.children) {
         layoutBlocks(child, db);
       }
-      columnPos += child?.widthInColumns ?? 1;
+      let columnsFilled = child?.widthInColumns ?? 1;
+      if (columns > 0) {
+        columnsFilled = Math.min(columnsFilled, columns - (columnPos % columns));
+      }
+      columnPos += columnsFilled;
       log.debug('abc88 columnsPos', child, columnPos);
     }
   }

From 4012cbf013a979bead300d29675b4ebfae07bdfd Mon Sep 17 00:00:00 2001
From: darshanr0107 
Date: Mon, 30 Jun 2025 18:32:31 +0530
Subject: [PATCH 023/143] Update changeset

Co-authored-by: Sidharth Vinod 
---
 .changeset/cold-sites-accept.md | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/.changeset/cold-sites-accept.md b/.changeset/cold-sites-accept.md
index 4166d40d4..cba7ae414 100644
--- a/.changeset/cold-sites-accept.md
+++ b/.changeset/cold-sites-accept.md
@@ -2,4 +2,4 @@
 'mermaid': patch
 ---
 
-edge label in the state diagram was not positioned correctly relative to the edge
+fix: Position the edge label in state diagram correctly relative to the edge

From 4254bdd4733a3b528c002f29fb583949c3f7be22 Mon Sep 17 00:00:00 2001
From: darshanr0107 
Date: Mon, 30 Jun 2025 20:15:32 +0530
Subject: [PATCH 024/143] added test cases for edge label positions

---
 .../rendering/stateDiagram-v2.spec.js         | 225 ++++++++++++++++++
 1 file changed, 225 insertions(+)

diff --git a/cypress/integration/rendering/stateDiagram-v2.spec.js b/cypress/integration/rendering/stateDiagram-v2.spec.js
index 83190dbc7..e5a0cedd0 100644
--- a/cypress/integration/rendering/stateDiagram-v2.spec.js
+++ b/cypress/integration/rendering/stateDiagram-v2.spec.js
@@ -602,6 +602,231 @@ State1 --> [*]
       --
       55
   }
+`,
+      {}
+    );
+  });
+  it('should render edge labels correctly', () => {
+    imgSnapshotTest(
+      `---
+title: On The Way To Something Something DarkSide
+config:
+  look: default
+  theme: default
+---
+
+stateDiagram-v2
+
+   state State1_____________
+   {
+      c0
+   }
+
+   state State2_____________
+   {
+      c1
+   }
+
+   state State3_____________
+   {
+      c7
+   }
+
+   state State4_____________
+   {
+      c2
+   }
+
+   state State5_____________
+   {
+      c3
+   }
+
+   state State6_____________
+   {
+      c4
+   }
+
+   state State7_____________
+   {
+      c5
+   }
+
+   state State8_____________
+   {
+      c6
+   }
+
+
+[*] --> State1_____________
+State1_____________ --> State2_____________   : Transition1_____
+State2_____________ --> State4_____________   : Transition2_____
+State2_____________ --> State3_____________   : Transition3_____
+State3_____________ --> State2_____________
+State4_____________ --> State2_____________   : Transition5_____
+State4_____________ --> State5_____________   : Transition6_____
+State5_____________ --> State6_____________   : Transition7_____
+State6_____________ --> State4_____________   : Transition8_____
+State2_____________ --> State7_____________   : Transition4_____
+State4_____________ --> State7_____________   : Transition4_____
+State5_____________ --> State7_____________   : Transition4_____
+State6_____________ --> State7_____________   : Transition4_____
+State7_____________ --> State1_____________   : Transition9_____
+State5_____________ --> State8_____________   : Transition10____
+State8_____________ --> State5_____________   : Transition11____
+`,
+      {}
+    );
+  });
+  it('should render edge labels correctly with multiple transitions', () => {
+    imgSnapshotTest(
+      `---
+title: Multiple Transitions
+config:
+  look: default
+  theme: default
+---
+
+stateDiagram-v2
+
+   state State1_____________
+   {
+      c0
+   }
+
+   state State2_____________
+   {
+      c1
+   }
+
+   state State3_____________
+   {
+      c7
+   }
+
+   state State4_____________
+   {
+      c2
+   }
+
+   state State5_____________
+   {
+      c3
+   }
+
+   state State6_____________
+   {
+      c4
+   }
+
+   state State7_____________
+   {
+      c5
+   }
+
+   state State8_____________
+   {
+      c6
+   }
+
+   state State9_____________
+   {
+      c9
+   }
+
+[*] --> State1_____________
+State1_____________ --> State2_____________   : Transition1_____
+State2_____________ --> State4_____________   : Transition2_____
+State2_____________ --> State3_____________   : Transition3_____
+State3_____________ --> State2_____________
+State4_____________ --> State2_____________   : Transition5_____
+State4_____________ --> State5_____________   : Transition6_____
+State5_____________ --> State6_____________   : Transition7_____
+State6_____________ --> State4_____________   : Transition8_____
+State2_____________ --> State7_____________   : Transition4_____
+State4_____________ --> State7_____________   : Transition4_____
+State5_____________ --> State7_____________   : Transition4_____
+State6_____________ --> State7_____________   : Transition4_____
+State7_____________ --> State1_____________   : Transition9_____
+State5_____________ --> State8_____________   : Transition10____
+State8_____________ --> State5_____________   : Transition11____
+State9_____________ --> State8_____________   : Transition12____
+`,
+      {}
+    );
+  });
+
+  it('should render edge labels correctly with multiple states', () => {
+    imgSnapshotTest(
+      `---
+title: Multiple States
+config:
+  look: default
+  theme: default
+---
+
+stateDiagram-v2
+
+   state State1_____________
+   {
+      c0
+   }
+
+   state State2_____________
+   {
+      c1
+   }
+
+   state State3_____________
+   {
+      c7
+   }
+
+   state State4_____________
+   {
+      c2
+   }
+
+   state State5_____________
+   {
+      c3
+   }
+
+   state State6_____________
+   {
+      c4
+   }
+
+   state State7_____________
+   {
+      c5
+   }
+
+   state State8_____________
+   {
+      c6
+   }
+
+   state State9_____________
+   {
+      c9
+   }
+
+   state State10_____________
+   {
+      c10
+   }
+
+[*] --> State1_____________
+State1_____________ --> State2_____________   : Transition1_____
+State2_____________ --> State3_____________   : Transition2_____
+State3_____________ --> State4_____________   : Transition3_____
+State4_____________ --> State5_____________   : Transition4_____
+State5_____________ --> State6_____________   : Transition5_____
+State6_____________ --> State7_____________   : Transition6_____
+State7_____________ --> State8_____________   : Transition7_____
+State8_____________ --> State9_____________   : Transition8_____
+State9_____________ --> State10_____________   : Transition9_____
 `,
       {}
     );

From 27185f62e4f0197dfc81848c95e311b048664380 Mon Sep 17 00:00:00 2001
From: darshanr0107 
Date: Fri, 4 Jul 2025 18:26:39 +0530
Subject: [PATCH 025/143] throw error when block width is greater than column
 width

---
 packages/mermaid/src/diagrams/block/blockDB.ts    | 11 +++++++++++
 .../src/diagrams/block/parser/block.spec.ts       | 15 +++++++++++++++
 2 files changed, 26 insertions(+)

diff --git a/packages/mermaid/src/diagrams/block/blockDB.ts b/packages/mermaid/src/diagrams/block/blockDB.ts
index d6e35ed15..27702bb32 100644
--- a/packages/mermaid/src/diagrams/block/blockDB.ts
+++ b/packages/mermaid/src/diagrams/block/blockDB.ts
@@ -92,7 +92,18 @@ export const setCssClass = function (itemIds: string, cssClassName: string) {
 const populateBlockDatabase = (_blockList: Block[], parent: Block): void => {
   const blockList = _blockList.flat();
   const children = [];
+  const columnSettingBlock = blockList.find((b) => b?.type === 'column-setting');
+  const column = columnSettingBlock?.columns ?? -1;
   for (const block of blockList) {
+    if (
+      typeof column === 'number' &&
+      column > 0 &&
+      block.type !== 'column-setting' &&
+      typeof block.widthInColumns === 'number' &&
+      block.widthInColumns > column
+    ) {
+      throw new Error(`width of block ${block.id} is greater than the column width`);
+    }
     if (block.label) {
       block.label = sanitizeText(block.label);
     }
diff --git a/packages/mermaid/src/diagrams/block/parser/block.spec.ts b/packages/mermaid/src/diagrams/block/parser/block.spec.ts
index 4bf3290d8..b41abde45 100644
--- a/packages/mermaid/src/diagrams/block/parser/block.spec.ts
+++ b/packages/mermaid/src/diagrams/block/parser/block.spec.ts
@@ -402,6 +402,21 @@ columns 1
       const B = blocks[0];
       expect(B.styles).toContain('fill:#f9F');
     });
+    it('should throw error when block width exceeds column width', () => {
+      const str = `block-beta
+    columns 1
+    A:1
+    B:2
+    C:3
+    D:4
+    E:3
+    F:2
+    G:1`;
+
+      expect(() => block.parse(str)).toThrowError(
+        'width of block B is greater than the column width'
+      );
+    });
   });
 
   describe('prototype properties', function () {

From 71b04f93b07f876df2b30656ef36036c1d0e4e4f Mon Sep 17 00:00:00 2001
From: darshanr0107 
Date: Fri, 4 Jul 2025 18:37:32 +0530
Subject: [PATCH 026/143] added changeset

---
 .changeset/ninety-roses-turn.md | 7 +++++++
 1 file changed, 7 insertions(+)
 create mode 100644 .changeset/ninety-roses-turn.md

diff --git a/.changeset/ninety-roses-turn.md b/.changeset/ninety-roses-turn.md
new file mode 100644
index 000000000..a37c6c9e8
--- /dev/null
+++ b/.changeset/ninety-roses-turn.md
@@ -0,0 +1,7 @@
+---
+'mermaid': patch
+---
+
+fix:Add validation for blocks exceeding column width.
+
+This update adds a validation check that triggers an error message when a block's width exceeds the defined column layout.

From ce7a487dfc68365ae3e41ce2db460a920aedc8ba Mon Sep 17 00:00:00 2001
From: omkarht 
Date: Wed, 9 Jul 2025 18:37:52 +0530
Subject: [PATCH 027/143] Fix: Fixed Connection gaps in flowchart shapes

---
 .../rendering-elements/shapes/question.ts     |   4 +-
 .../rendering-elements/shapes/roundedRect.ts  | 162 ++++++++++++++++--
 .../rendering-elements/shapes/stadium.ts      |  66 ++++---
 3 files changed, 194 insertions(+), 38 deletions(-)

diff --git a/packages/mermaid/src/rendering-util/rendering-elements/shapes/question.ts b/packages/mermaid/src/rendering-util/rendering-elements/shapes/question.ts
index eef958169..24c811b85 100644
--- a/packages/mermaid/src/rendering-util/rendering-elements/shapes/question.ts
+++ b/packages/mermaid/src/rendering-util/rendering-elements/shapes/question.ts
@@ -25,6 +25,7 @@ export async function question(parent: D3Selection
   const w = bbox.width + node.padding;
   const h = bbox.height + node.padding;
   const s = w + h;
+  const adjustment = 0.5;
 
   const points = [
     { x: s / 2, y: 0 },
@@ -45,13 +46,14 @@ export async function question(parent: D3Selection
 
     polygon = shapeSvg
       .insert(() => roughNode, ':first-child')
-      .attr('transform', `translate(${-s / 2}, ${s / 2})`);
+      .attr('transform', `translate(${-s / 2 + adjustment}, ${s / 2})`);
 
     if (cssStyles) {
       polygon.attr('style', cssStyles);
     }
   } else {
     polygon = insertPolygonShape(shapeSvg, s, s, points);
+    polygon.attr('transform', `translate(${-s / 2 + adjustment}, ${s / 2})`);
   }
 
   if (nodeStyles) {
diff --git a/packages/mermaid/src/rendering-util/rendering-elements/shapes/roundedRect.ts b/packages/mermaid/src/rendering-util/rendering-elements/shapes/roundedRect.ts
index 134bcdb6c..40d71429c 100644
--- a/packages/mermaid/src/rendering-util/rendering-elements/shapes/roundedRect.ts
+++ b/packages/mermaid/src/rendering-util/rendering-elements/shapes/roundedRect.ts
@@ -1,18 +1,160 @@
-import type { Node, RectOptions } from '../../types.js';
+import { labelHelper, updateNodeBounds, getNodeClasses, createPathFromPoints } from './util.js';
+import intersect from '../intersect/index.js';
+import type { Node } from '../../types.js';
+import { styles2String, userNodeOverrides } from './handDrawnShapeStyles.js';
+import rough from 'roughjs';
 import type { D3Selection } from '../../../types.js';
-import { drawRect } from './drawRect.js';
+
+/**
+ * Generates evenly spaced points along an elliptical arc connecting two points.
+ *
+ * @param x1 - x-coordinate of the start point of the arc
+ * @param y1 - y-coordinate of the start point of the arc
+ * @param x2 - x-coordinate of the end point of the arc
+ * @param y2 - y-coordinate of the end point of the arc
+ * @param rx - horizontal radius of the ellipse
+ * @param ry - vertical radius of the ellipse
+ * @param clockwise - direction of the arc; true for clockwise, false for counterclockwise
+ * @returns Array of points `{ x, y }` along the elliptical arc
+ *
+ * @throws Error if the given radii are too small to draw an arc between the points
+ */
+export function generateArcPoints(
+  x1: number,
+  y1: number,
+  x2: number,
+  y2: number,
+  rx: number,
+  ry: number,
+  clockwise: boolean
+) {
+  const numPoints = 20;
+  // Calculate midpoint
+  const midX = (x1 + x2) / 2;
+  const midY = (y1 + y2) / 2;
+
+  // Calculate the angle of the line connecting the points
+  const angle = Math.atan2(y2 - y1, x2 - x1);
+
+  // Calculate transformed coordinates for the ellipse
+  const dx = (x2 - x1) / 2;
+  const dy = (y2 - y1) / 2;
+
+  // Scale to unit circle
+  const transformedX = dx / rx;
+  const transformedY = dy / ry;
+
+  // Calculate the distance between points on the unit circle
+  const distance = Math.sqrt(transformedX ** 2 + transformedY ** 2);
+
+  // Check if the ellipse can be drawn with the given radii
+  if (distance > 1) {
+    throw new Error('The given radii are too small to create an arc between the points.');
+  }
+
+  // Calculate the distance from the midpoint to the center of the ellipse
+  const scaledCenterDistance = Math.sqrt(1 - distance ** 2);
+
+  // Calculate the center of the ellipse
+  const centerX = midX + scaledCenterDistance * ry * Math.sin(angle) * (clockwise ? -1 : 1);
+  const centerY = midY - scaledCenterDistance * rx * Math.cos(angle) * (clockwise ? -1 : 1);
+
+  // Calculate the start and end angles on the ellipse
+  const startAngle = Math.atan2((y1 - centerY) / ry, (x1 - centerX) / rx);
+  const endAngle = Math.atan2((y2 - centerY) / ry, (x2 - centerX) / rx);
+
+  // Adjust angles for clockwise/counterclockwise
+  let angleRange = endAngle - startAngle;
+  if (clockwise && angleRange < 0) {
+    angleRange += 2 * Math.PI;
+  }
+  if (!clockwise && angleRange > 0) {
+    angleRange -= 2 * Math.PI;
+  }
+
+  // Generate points
+  const points = [];
+  for (let i = 0; i < numPoints; i++) {
+    const t = i / (numPoints - 1);
+    const angle = startAngle + t * angleRange;
+    const x = centerX + rx * Math.cos(angle);
+    const y = centerY + ry * Math.sin(angle);
+    points.push({ x, y });
+  }
+
+  return points;
+}
 
 export async function roundedRect(
   parent: D3Selection,
   node: Node
 ) {
-  const options = {
-    rx: 5,
-    ry: 5,
-    classes: '',
-    labelPaddingX: (node?.padding || 0) * 1,
-    labelPaddingY: (node?.padding || 0) * 1,
-  } as RectOptions;
+  const { labelStyles, nodeStyles } = styles2String(node);
+  node.labelStyle = labelStyles;
+  const { shapeSvg, bbox } = await labelHelper(parent, node, getNodeClasses(node));
 
-  return drawRect(parent, node, options);
+  const labelPaddingX = node?.padding ?? 0;
+  const labelPaddingY = node?.padding ?? 0;
+
+  const w = (node?.width ? node?.width : bbox.width) + labelPaddingX * 2;
+  const h = (node?.height ? node?.height : bbox.height) + labelPaddingY * 2;
+  const radius = 5;
+  const taper = 5; // Taper width for the rounded corners
+  const { cssStyles } = node;
+  // @ts-expect-error -- Passing a D3.Selection seems to work for some reason
+  const rc = rough.svg(shapeSvg);
+  const options = userNodeOverrides(node, {});
+
+  if (node.look !== 'handDrawn') {
+    options.roughness = 0;
+    options.fillStyle = 'solid';
+  }
+
+  const points = [
+    // Top edge (left to right)
+    { x: -w / 2 + taper, y: -h / 2 }, // Top-left corner start (1)
+    { x: w / 2 - taper, y: -h / 2 }, // Top-right corner start (2)
+
+    ...generateArcPoints(w / 2 - taper, -h / 2, w / 2, -h / 2 + taper, radius, radius, true), // Top-left arc (2 to 3)
+
+    // Right edge (top to bottom)
+    { x: w / 2, y: -h / 2 + taper }, // Top-right taper point (3)
+    { x: w / 2, y: h / 2 - taper }, // Bottom-right taper point (4)
+
+    ...generateArcPoints(w / 2, h / 2 - taper, w / 2 - taper, h / 2, radius, radius, true), // Top-left arc (4 to 5)
+
+    // Bottom edge (right to left)
+    { x: w / 2 - taper, y: h / 2 }, // Bottom-right corner start (5)
+    { x: -w / 2 + taper, y: h / 2 }, // Bottom-left corner start (6)
+
+    ...generateArcPoints(-w / 2 + taper, h / 2, -w / 2, h / 2 - taper, radius, radius, true), // Top-left arc (4 to 5)
+
+    // Left edge (bottom to top)
+    { x: -w / 2, y: h / 2 - taper }, // Bottom-left taper point (7)
+    { x: -w / 2, y: -h / 2 + taper }, // Top-left taper point (8)
+    ...generateArcPoints(-w / 2, -h / 2 + taper, -w / 2 + taper, -h / 2, radius, radius, true), // Top-left arc (4 to 5)
+  ];
+
+  const pathData = createPathFromPoints(points);
+  const shapeNode = rc.path(pathData, options);
+
+  const polygon = shapeSvg.insert(() => shapeNode, ':first-child');
+  polygon.attr('class', 'basic label-container outer-path');
+
+  if (cssStyles && node.look !== 'handDrawn') {
+    polygon.selectChildren('path').attr('style', cssStyles);
+  }
+
+  if (nodeStyles && node.look !== 'handDrawn') {
+    polygon.selectChildren('path').attr('style', nodeStyles);
+  }
+
+  updateNodeBounds(node, polygon);
+
+  node.intersect = function (point) {
+    const pos = intersect.polygon(node, points, point);
+    return pos;
+  };
+
+  return shapeSvg;
 }
diff --git a/packages/mermaid/src/rendering-util/rendering-elements/shapes/stadium.ts b/packages/mermaid/src/rendering-util/rendering-elements/shapes/stadium.ts
index 1b93aa1b3..117176b19 100644
--- a/packages/mermaid/src/rendering-util/rendering-elements/shapes/stadium.ts
+++ b/packages/mermaid/src/rendering-util/rendering-elements/shapes/stadium.ts
@@ -1,11 +1,15 @@
-import { labelHelper, updateNodeBounds, getNodeClasses } from './util.js';
+import {
+  labelHelper,
+  updateNodeBounds,
+  getNodeClasses,
+  generateCirclePoints,
+  createPathFromPoints,
+} from './util.js';
 import intersect from '../intersect/index.js';
 import type { Node } from '../../types.js';
 import { styles2String, userNodeOverrides } from './handDrawnShapeStyles.js';
 import rough from 'roughjs';
-import { createRoundedRectPathD } from './roundedRectPath.js';
 import type { D3Selection } from '../../../types.js';
-import { handleUndefinedAttr } from '../../../utils.js';
 
 export const createStadiumPathD = (
   x: number,
@@ -60,36 +64,44 @@ export async function stadium(parent: D3Selection<
   const h = bbox.height + node.padding;
   const w = bbox.width + h / 4 + node.padding;
 
-  let rect;
+  const radius = h / 2;
   const { cssStyles } = node;
-  if (node.look === 'handDrawn') {
-    // @ts-expect-error -- Passing a D3.Selection seems to work for some reason
-    const rc = rough.svg(shapeSvg);
-    const options = userNodeOverrides(node, {});
+  // @ts-expect-error -- Passing a D3.Selection seems to work for some reason
+  const rc = rough.svg(shapeSvg);
+  const options = userNodeOverrides(node, {});
 
-    const pathData = createRoundedRectPathD(-w / 2, -h / 2, w, h, h / 2);
-    const roughNode = rc.path(pathData, options);
-
-    rect = shapeSvg.insert(() => roughNode, ':first-child');
-    rect.attr('class', 'basic label-container').attr('style', handleUndefinedAttr(cssStyles));
-  } else {
-    rect = shapeSvg.insert('rect', ':first-child');
-
-    rect
-      .attr('class', 'basic label-container')
-      .attr('style', nodeStyles)
-      .attr('rx', h / 2)
-      .attr('ry', h / 2)
-      .attr('x', -w / 2)
-      .attr('y', -h / 2)
-      .attr('width', w)
-      .attr('height', h);
+  if (node.look !== 'handDrawn') {
+    options.roughness = 0;
+    options.fillStyle = 'solid';
   }
 
-  updateNodeBounds(node, rect);
+  const points = [
+    { x: -w / 2 + radius, y: -h / 2 },
+    { x: w / 2 - radius, y: -h / 2 },
+    ...generateCirclePoints(-w / 2 + radius, 0, radius, 50, 90, 270),
+    { x: w / 2 - radius, y: h / 2 },
+    ...generateCirclePoints(w / 2 - radius, 0, radius, 50, 270, 450),
+  ];
+
+  const pathData = createPathFromPoints(points);
+  const shapeNode = rc.path(pathData, options);
+
+  const polygon = shapeSvg.insert(() => shapeNode, ':first-child');
+  polygon.attr('class', 'basic label-container outer-path');
+
+  if (cssStyles && node.look !== 'handDrawn') {
+    polygon.selectChildren('path').attr('style', cssStyles);
+  }
+
+  if (nodeStyles && node.look !== 'handDrawn') {
+    polygon.selectChildren('path').attr('style', nodeStyles);
+  }
+
+  updateNodeBounds(node, polygon);
 
   node.intersect = function (point) {
-    return intersect.rect(node, point);
+    const pos = intersect.polygon(node, points, point);
+    return pos;
   };
 
   return shapeSvg;

From fc07f0d8abca49e4f887d7457b7b94fb07d1e3da Mon Sep 17 00:00:00 2001
From: omkarht 
Date: Wed, 9 Jul 2025 19:06:57 +0530
Subject: [PATCH 028/143] added changeset

---
 .changeset/gold-spiders-join.md | 5 +++++
 1 file changed, 5 insertions(+)
 create mode 100644 .changeset/gold-spiders-join.md

diff --git a/.changeset/gold-spiders-join.md b/.changeset/gold-spiders-join.md
new file mode 100644
index 000000000..70b55fc47
--- /dev/null
+++ b/.changeset/gold-spiders-join.md
@@ -0,0 +1,5 @@
+---
+'mermaid': minor
+---
+
+fix: fixed connection gaps in flowchart for roundedRect, stadium and diamond shape

From 5f0c53c8a71427bad1426f5f976b5f61600bde7a Mon Sep 17 00:00:00 2001
From: darshanr0107 
Date: Wed, 9 Jul 2025 20:02:18 +0530
Subject: [PATCH 029/143] fix excluded dates ignored in YYYY-MM-DD HH:mm:ss
 date format

---
 cypress/integration/rendering/gantt.spec.js   | 14 +++++++++++++
 .../src/diagrams/gantt/ganttRenderer.js       | 20 ++++++++-----------
 2 files changed, 22 insertions(+), 12 deletions(-)

diff --git a/cypress/integration/rendering/gantt.spec.js b/cypress/integration/rendering/gantt.spec.js
index 2cc67918c..ec33e01aa 100644
--- a/cypress/integration/rendering/gantt.spec.js
+++ b/cypress/integration/rendering/gantt.spec.js
@@ -647,6 +647,20 @@ describe('Gantt diagram', () => {
     );
   });
 
+  it('should render a gantt diagram excluding a specific date in YYYY-MM-DD HH:mm:ss format', () => {
+    imgSnapshotTest(
+      `
+    gantt
+      dateFormat  YYYY-MM-DD HH:mm:ss
+      excludes    2025-07-07
+      section     Section
+      A task      :a1, 2025-07-04 20:30:30, 2025-07-08 10:30:30
+      Another task:after a1, 20h
+    `,
+      {}
+    );
+  });
+
   it("should render when there's a semicolon in the title", () => {
     imgSnapshotTest(
       `
diff --git a/packages/mermaid/src/diagrams/gantt/ganttRenderer.js b/packages/mermaid/src/diagrams/gantt/ganttRenderer.js
index f5c8c2e38..0695544ce 100644
--- a/packages/mermaid/src/diagrams/gantt/ganttRenderer.js
+++ b/packages/mermaid/src/diagrams/gantt/ganttRenderer.js
@@ -554,12 +554,14 @@ export const draw = function (text, id, version, diagObj) {
       return;
     }
 
-    const dateFormat = diagObj.db.getDateFormat();
+    const normalizedExcludes = excludes.map((d) => dayjs(d).format('YYYY-MM-DD'));
+    const normalizedIncludes = includes.map((d) => dayjs(d).format('YYYY-MM-DD'));
     const excludeRanges = [];
     let range = null;
     let d = dayjs(minTime);
     while (d.valueOf() <= maxTime) {
-      if (diagObj.db.isInvalidDate(d, dateFormat, excludes, includes)) {
+      const dStr = d.format('YYYY-MM-DD');
+      if (normalizedExcludes.includes(dStr) && !normalizedIncludes.includes(dStr)) {
         if (!range) {
           range = {
             start: d,
@@ -581,17 +583,11 @@ export const draw = function (text, id, version, diagObj) {
 
     rectangles
       .append('rect')
-      .attr('id', function (d) {
-        return 'exclude-' + d.start.format('YYYY-MM-DD');
-      })
-      .attr('x', function (d) {
-        return timeScale(d.start) + theSidePad;
-      })
+      .attr('id', (d) => 'exclude-' + d.start.format('YYYY-MM-DD'))
+      .attr('x', (d) => timeScale(d.start.startOf('day')) + theSidePad)
       .attr('y', conf.gridLineStartPadding)
-      .attr('width', function (d) {
-        const renderEnd = d.end.add(1, 'day');
-        return timeScale(renderEnd) - timeScale(d.start);
-      })
+      .attr('width', (d) => timeScale(d.end.endOf('day')) - timeScale(d.start.startOf('day')))
+
       .attr('height', h - theTopPad - conf.gridLineStartPadding)
       .attr('transform-origin', function (d, i) {
         return (

From fce7cabb71d68a20a66246fe23d066512126a412 Mon Sep 17 00:00:00 2001
From: darshanr0107 
Date: Wed, 9 Jul 2025 20:18:49 +0530
Subject: [PATCH 030/143] add changeset

---
 .changeset/fuzzy-pears-cough.md | 5 +++++
 1 file changed, 5 insertions(+)
 create mode 100644 .changeset/fuzzy-pears-cough.md

diff --git a/.changeset/fuzzy-pears-cough.md b/.changeset/fuzzy-pears-cough.md
new file mode 100644
index 000000000..3d3af19ff
--- /dev/null
+++ b/.changeset/fuzzy-pears-cough.md
@@ -0,0 +1,5 @@
+---
+'mermaid': patch
+---
+
+Fix: an issue where exclude dates in Gantt charts were ignored when using dateFormat: 'YYYY-MM-DD HH:mm:ss'.

From 35a92efcdcc8eb990703f948a20556577856253c Mon Sep 17 00:00:00 2001
From: darshanr0107 
Date: Thu, 10 Jul 2025 15:49:53 +0530
Subject: [PATCH 031/143] resolve PR comments

---
 cypress/integration/rendering/gantt.spec.js   | 29 +++++++++++++++++++
 .../mermaid/src/diagrams/gantt/ganttDb.js     |  7 +++--
 .../src/diagrams/gantt/ganttRenderer.js       |  6 ++--
 3 files changed, 36 insertions(+), 6 deletions(-)

diff --git a/cypress/integration/rendering/gantt.spec.js b/cypress/integration/rendering/gantt.spec.js
index ec33e01aa..979c27540 100644
--- a/cypress/integration/rendering/gantt.spec.js
+++ b/cypress/integration/rendering/gantt.spec.js
@@ -661,6 +661,35 @@ describe('Gantt diagram', () => {
     );
   });
 
+  it('should render a gantt diagram excluding saturday and sunday in YYYY-MM-DD HH:mm:ss format', () => {
+    imgSnapshotTest(
+      `
+        gantt
+      dateFormat  YYYY-MM-DD HH:mm:ss
+      excludes    weekends
+       weekend saturday
+      section     Section
+      A task      :a1, 2025-07-04 20:30:30, 2025-07-08 10:30:30
+      Another task:after a1, 20h
+    `,
+      {}
+    );
+  });
+  it('should render a gantt diagram excluding friday and saturday in YYYY-MM-DD HH:mm:ss format', () => {
+    imgSnapshotTest(
+      `
+        gantt
+      dateFormat  YYYY-MM-DD HH:mm:ss
+      excludes    weekends
+       weekend friday
+      section     Section
+      A task      :a1, 2025-07-04 20:30:30, 2025-07-08 10:30:30
+      Another task:after a1, 20h
+    `,
+      {}
+    );
+  });
+
   it("should render when there's a semicolon in the title", () => {
     imgSnapshotTest(
       `
diff --git a/packages/mermaid/src/diagrams/gantt/ganttDb.js b/packages/mermaid/src/diagrams/gantt/ganttDb.js
index 3ae55fb25..b2b5b0566 100644
--- a/packages/mermaid/src/diagrams/gantt/ganttDb.js
+++ b/packages/mermaid/src/diagrams/gantt/ganttDb.js
@@ -167,7 +167,10 @@ export const getTasks = function () {
 };
 
 export const isInvalidDate = function (date, dateFormat, excludes, includes) {
-  if (includes.includes(date.format(dateFormat.trim()))) {
+  const formattedDate = date.format(dateFormat.trim());
+  const dateOnly = date.format('YYYY-MM-DD');
+
+  if (includes.includes(formattedDate) || includes.includes(dateOnly)) {
     return false;
   }
   if (
@@ -180,7 +183,7 @@ export const isInvalidDate = function (date, dateFormat, excludes, includes) {
   if (excludes.includes(date.format('dddd').toLowerCase())) {
     return true;
   }
-  return excludes.includes(date.format(dateFormat.trim()));
+  return excludes.includes(formattedDate) || excludes.includes(dateOnly);
 };
 
 export const setWeekday = function (txt) {
diff --git a/packages/mermaid/src/diagrams/gantt/ganttRenderer.js b/packages/mermaid/src/diagrams/gantt/ganttRenderer.js
index 0695544ce..dd4824d6b 100644
--- a/packages/mermaid/src/diagrams/gantt/ganttRenderer.js
+++ b/packages/mermaid/src/diagrams/gantt/ganttRenderer.js
@@ -554,14 +554,12 @@ export const draw = function (text, id, version, diagObj) {
       return;
     }
 
-    const normalizedExcludes = excludes.map((d) => dayjs(d).format('YYYY-MM-DD'));
-    const normalizedIncludes = includes.map((d) => dayjs(d).format('YYYY-MM-DD'));
+    const dateFormat = diagObj.db.getDateFormat();
     const excludeRanges = [];
     let range = null;
     let d = dayjs(minTime);
     while (d.valueOf() <= maxTime) {
-      const dStr = d.format('YYYY-MM-DD');
-      if (normalizedExcludes.includes(dStr) && !normalizedIncludes.includes(dStr)) {
+      if (diagObj.db.isInvalidDate(d, dateFormat, excludes, includes)) {
         if (!range) {
           range = {
             start: d,

From b3a12237c0782be59c2467869dd90d1eec119b93 Mon Sep 17 00:00:00 2001
From: SpecularAura 
Date: Wed, 9 Jul 2025 20:55:34 +0000
Subject: [PATCH 032/143] Added per link styling Edited flowDB.ts which already
 had interpolate for styling links individually. Added the ability to modify
 this parameter using the newer @ syntax using the curve property.

---
 packages/mermaid/src/diagrams/flowchart/flowDb.ts |  3 +++
 packages/mermaid/src/types.ts                     | 13 +++++++++++++
 2 files changed, 16 insertions(+)

diff --git a/packages/mermaid/src/diagrams/flowchart/flowDb.ts b/packages/mermaid/src/diagrams/flowchart/flowDb.ts
index 65f8c4a05..b729a85e0 100644
--- a/packages/mermaid/src/diagrams/flowchart/flowDb.ts
+++ b/packages/mermaid/src/diagrams/flowchart/flowDb.ts
@@ -139,6 +139,9 @@ export class FlowDB implements DiagramDB {
       if (edgeDoc?.animation !== undefined) {
         edge.animation = edgeDoc.animation;
       }
+      if (edgeDoc?.curve !== undefined) {
+        edge.interpolate = edgeDoc.curve;
+      }
       return;
     }
 
diff --git a/packages/mermaid/src/types.ts b/packages/mermaid/src/types.ts
index fdccae677..d1394e71b 100644
--- a/packages/mermaid/src/types.ts
+++ b/packages/mermaid/src/types.ts
@@ -16,6 +16,19 @@ export interface NodeMetaData {
 export interface EdgeMetaData {
   animation?: 'fast' | 'slow';
   animate?: boolean;
+  curve?:
+    | 'basis'
+    | 'bumpX'
+    | 'bumpY'
+    | 'cardinal'
+    | 'catmullRom'
+    | 'linear'
+    | 'monotoneX'
+    | 'monotoneY'
+    | 'natural'
+    | 'step'
+    | 'stepAfter'
+    | 'stepBefore';
 }
 import type { MermaidConfig } from './config.type.js';
 

From e9ce8cf4da9062d85098042044822100889bb0dd Mon Sep 17 00:00:00 2001
From: Krishna Upadhyay <24423580+kriss-u@users.noreply.github.com>
Date: Thu, 10 Jul 2025 21:39:19 -0500
Subject: [PATCH 033/143] fix: trim the direction string in flowchart

---
 .changeset/smart-humans-cover.md                  | 5 +++++
 packages/mermaid/src/diagrams/flowchart/flowDb.ts | 3 ++-
 2 files changed, 7 insertions(+), 1 deletion(-)
 create mode 100644 .changeset/smart-humans-cover.md

diff --git a/.changeset/smart-humans-cover.md b/.changeset/smart-humans-cover.md
new file mode 100644
index 000000000..4408e0a9c
--- /dev/null
+++ b/.changeset/smart-humans-cover.md
@@ -0,0 +1,5 @@
+---
+'mermaid': patch
+---
+
+fix: Update flowchart direction TD's behavior to be the same as TB
diff --git a/packages/mermaid/src/diagrams/flowchart/flowDb.ts b/packages/mermaid/src/diagrams/flowchart/flowDb.ts
index 65f8c4a05..303ad0e66 100644
--- a/packages/mermaid/src/diagrams/flowchart/flowDb.ts
+++ b/packages/mermaid/src/diagrams/flowchart/flowDb.ts
@@ -403,7 +403,8 @@ You have to call mermaid.initialize.`
    *
    */
   public setDirection(dir: string) {
-    this.direction = dir;
+    this.direction = dir.trim();
+
     if (/.*
Date: Thu, 10 Jul 2025 22:17:30 -0500
Subject: [PATCH 034/143] test: add tests for directions in flowchart

---
 .../src/diagrams/flowchart/flowDb.spec.ts       | 17 +++++++++++++++++
 1 file changed, 17 insertions(+)

diff --git a/packages/mermaid/src/diagrams/flowchart/flowDb.spec.ts b/packages/mermaid/src/diagrams/flowchart/flowDb.spec.ts
index 8d12de00b..56d3cfb57 100644
--- a/packages/mermaid/src/diagrams/flowchart/flowDb.spec.ts
+++ b/packages/mermaid/src/diagrams/flowchart/flowDb.spec.ts
@@ -126,3 +126,20 @@ describe('flow db getData', () => {
     expect(edges[0].curve).toBe('basis');
   });
 });
+
+describe('flow db direction', () => {
+  let flowDb: FlowDB;
+  beforeEach(() => {
+    flowDb = new FlowDB();
+  });
+
+  it('should set direction to TB when TD is set', () => {
+    flowDb.setDirection('TD');
+    expect(flowDb.getDirection()).toBe('TB');
+  });
+
+  it('should correctly set direction irrespective of leading spaces', () => {
+    flowDb.setDirection(' TD');
+    expect(flowDb.getDirection()).toBe('TB');
+  });
+});

From d7a55b422bb75f097416d301b0bafcc10cfb0ff0 Mon Sep 17 00:00:00 2001
From: SpecularAura 
Date: Sat, 12 Jul 2025 19:08:42 +0000
Subject: [PATCH 035/143] Added tests for Per Link Curve Styling

---
 .../src/diagrams/flowchart/flowDb.spec.ts     | 39 ++++++++++++++
 .../flowchart/parser/flow-lines.spec.js       | 53 +++++++++++++++++++
 2 files changed, 92 insertions(+)

diff --git a/packages/mermaid/src/diagrams/flowchart/flowDb.spec.ts b/packages/mermaid/src/diagrams/flowchart/flowDb.spec.ts
index 8d12de00b..44a6ed052 100644
--- a/packages/mermaid/src/diagrams/flowchart/flowDb.spec.ts
+++ b/packages/mermaid/src/diagrams/flowchart/flowDb.spec.ts
@@ -125,4 +125,43 @@ describe('flow db getData', () => {
     const { edges } = flowDb.getData();
     expect(edges[0].curve).toBe('basis');
   });
+
+  it('should support modifying interpolate using edge id syntax', () => {
+    flowDb.addVertex('A', { text: 'A', type: 'text' }, undefined, [], [], '', {}, undefined);
+    flowDb.addVertex('B', { text: 'B', type: 'text' }, undefined, [], [], '', {}, undefined);
+    flowDb.addVertex('C', { text: 'C', type: 'text' }, undefined, [], [], '', {}, undefined);
+    flowDb.addVertex('D', { text: 'D', type: 'text' }, undefined, [], [], '', {}, undefined);
+    flowDb.addLink(['A'], ['B'], {});
+    flowDb.addLink(['A'], ['C'], { id: 'e2' });
+    flowDb.addLink(['B'], ['D'], { id: 'e3' });
+    flowDb.addLink(['C'], ['D'], {});
+    flowDb.updateLinkInterpolate(['default'], 'stepBefore');
+    flowDb.updateLinkInterpolate([0], 'basis');
+    flowDb.addVertex(
+      'e2',
+      { text: 'Shouldnt be used', type: 'text' },
+      undefined,
+      [],
+      [],
+      '',
+      {},
+      ' curve: monotoneX '
+    );
+    flowDb.addVertex(
+      'e3',
+      { text: 'Shouldnt be used', type: 'text' },
+      undefined,
+      [],
+      [],
+      '',
+      {},
+      ' curve: catmullRom '
+    );
+
+    const { edges } = flowDb.getData();
+    expect(edges[0].curve).toBe('basis');
+    expect(edges[1].curve).toBe('monotoneX');
+    expect(edges[2].curve).toBe('catmullRom');
+    expect(edges[3].curve).toBe('stepBefore');
+  });
 });
diff --git a/packages/mermaid/src/diagrams/flowchart/parser/flow-lines.spec.js b/packages/mermaid/src/diagrams/flowchart/parser/flow-lines.spec.js
index 6b1bc7fbb..5dfd648ca 100644
--- a/packages/mermaid/src/diagrams/flowchart/parser/flow-lines.spec.js
+++ b/packages/mermaid/src/diagrams/flowchart/parser/flow-lines.spec.js
@@ -37,6 +37,59 @@ describe('[Lines] when parsing', () => {
     expect(edges[1].interpolate).toBe('cardinal');
   });
 
+  it('should handle edge curve properties using edge ID', function () {
+    const res = flow.parser.parse(
+      'graph TD\n' +
+        'A e1@-->B\n' +
+        'A uniqueName@-->C\n' +
+        'e1@{curve: basis}\n' +
+        'uniqueName@{curve: cardinal}'
+    );
+
+    const vert = flow.parser.yy.getVertices();
+    const edges = flow.parser.yy.getEdges();
+
+    expect(edges[0].interpolate).toBe('basis');
+    expect(edges[1].interpolate).toBe('cardinal');
+  });
+
+  it('should handle edge curve properties using edge ID but without overriding default', function () {
+    const res = flow.parser.parse(
+      'graph TD\n' +
+        'A e1@-->B\n' +
+        'A-->C\n' +
+        'linkStyle default interpolate linear\n' +
+        'e1@{curve: stepAfter}'
+    );
+
+    const vert = flow.parser.yy.getVertices();
+    const edges = flow.parser.yy.getEdges();
+
+    expect(edges[0].interpolate).toBe('stepAfter');
+    expect(edges.defaultInterpolate).toBe('linear');
+  });
+
+  it('should handle edge curve properties using edge ID mixed with line interpolation', function () {
+    const res = flow.parser.parse(
+      'graph TD\n' +
+        'A e1@-->B-->D\n' +
+        'A-->C e4@-->D-->E\n' +
+        'linkStyle default interpolate linear\n' +
+        'linkStyle 1 interpolate basis\n' +
+        'e1@{curve: monotoneX}\n' +
+        'e4@{curve: stepBefore}'
+    );
+
+    const vert = flow.parser.yy.getVertices();
+    const edges = flow.parser.yy.getEdges();
+
+    expect(edges[0].interpolate).toBe('monotoneX');
+    expect(edges[1].interpolate).toBe('basis');
+    expect(edges.defaultInterpolate).toBe('linear');
+    expect(edges[3].interpolate).toBe('stepBefore');
+    expect(edges.defaultInterpolate).toBe('linear');
+  });
+
   it('should handle line interpolation multi-numbered definitions', function () {
     const res = flow.parser.parse(
       'graph TD\n' + 'A-->B\n' + 'A-->C\n' + 'linkStyle 0,1 interpolate basis'

From daf8d8d3befcd600618a629977b76463b38d0ad9 Mon Sep 17 00:00:00 2001
From: SpecularAura 
Date: Sat, 12 Jul 2025 19:41:01 +0000
Subject: [PATCH 036/143] Added Changeset for Per Link Styling of edges

---
 .changeset/lemon-masks-unite.md | 5 +++++
 1 file changed, 5 insertions(+)
 create mode 100644 .changeset/lemon-masks-unite.md

diff --git a/.changeset/lemon-masks-unite.md b/.changeset/lemon-masks-unite.md
new file mode 100644
index 000000000..306ff1cce
--- /dev/null
+++ b/.changeset/lemon-masks-unite.md
@@ -0,0 +1,5 @@
+---
+'mermaid': minor
+---
+
+feat: Added support for per link curve styling in flowchart diagram using edge ids

From 003d1c7a70ee82aa44afc01c1b29d632106a570d Mon Sep 17 00:00:00 2001
From: "autofix-ci[bot]" <114827586+autofix-ci[bot]@users.noreply.github.com>
Date: Sat, 12 Jul 2025 20:03:58 +0000
Subject: [PATCH 037/143] [autofix.ci] apply automated fixes

---
 docs/config/setup/mermaid/interfaces/ParseOptions.md | 4 ++--
 docs/config/setup/mermaid/interfaces/ParseResult.md  | 6 +++---
 docs/config/setup/mermaid/interfaces/RenderResult.md | 8 ++++----
 3 files changed, 9 insertions(+), 9 deletions(-)

diff --git a/docs/config/setup/mermaid/interfaces/ParseOptions.md b/docs/config/setup/mermaid/interfaces/ParseOptions.md
index e3a968378..ea96f2706 100644
--- a/docs/config/setup/mermaid/interfaces/ParseOptions.md
+++ b/docs/config/setup/mermaid/interfaces/ParseOptions.md
@@ -10,7 +10,7 @@
 
 # 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
 
@@ -18,7 +18,7 @@ Defined in: [packages/mermaid/src/types.ts:59](https://github.com/mermaid-js/mer
 
 > `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.
 The `parseError` function will not be called.
diff --git a/docs/config/setup/mermaid/interfaces/ParseResult.md b/docs/config/setup/mermaid/interfaces/ParseResult.md
index 95d662b42..7a5990610 100644
--- a/docs/config/setup/mermaid/interfaces/ParseResult.md
+++ b/docs/config/setup/mermaid/interfaces/ParseResult.md
@@ -10,7 +10,7 @@
 
 # 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
 
@@ -18,7 +18,7 @@ Defined in: [packages/mermaid/src/types.ts:67](https://github.com/mermaid-js/mer
 
 > **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
 
@@ -28,6 +28,6 @@ The config passed as YAML frontmatter or directives
 
 > **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.
diff --git a/docs/config/setup/mermaid/interfaces/RenderResult.md b/docs/config/setup/mermaid/interfaces/RenderResult.md
index c6dc3cf08..fc5fac4f5 100644
--- a/docs/config/setup/mermaid/interfaces/RenderResult.md
+++ b/docs/config/setup/mermaid/interfaces/RenderResult.md
@@ -10,7 +10,7 @@
 
 # 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
 
@@ -18,7 +18,7 @@ Defined in: [packages/mermaid/src/types.ts:85](https://github.com/mermaid-js/mer
 
 > `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.
 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`
 
-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.
 
@@ -55,6 +55,6 @@ The diagram type, e.g. 'flowchart', 'sequence', etc.
 
 > **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.

From a2dbc8e4b3938da43e4a2cc6734ddeb882a322b2 Mon Sep 17 00:00:00 2001
From: omkarht 
Date: Mon, 14 Jul 2025 16:51:34 +0530
Subject: [PATCH 038/143] updated hexagon shape

---
 .../rendering-elements/shapes/hexagon.ts      | 72 ++++++++++---------
 1 file changed, 38 insertions(+), 34 deletions(-)

diff --git a/packages/mermaid/src/rendering-util/rendering-elements/shapes/hexagon.ts b/packages/mermaid/src/rendering-util/rendering-elements/shapes/hexagon.ts
index 52a4397a2..fe243d3e4 100644
--- a/packages/mermaid/src/rendering-util/rendering-elements/shapes/hexagon.ts
+++ b/packages/mermaid/src/rendering-util/rendering-elements/shapes/hexagon.ts
@@ -1,9 +1,8 @@
-import { labelHelper, updateNodeBounds, getNodeClasses } from './util.js';
+import { labelHelper, updateNodeBounds, getNodeClasses, createPathFromPoints } from './util.js';
 import intersect from '../intersect/index.js';
 import type { Node } from '../../types.js';
 import { styles2String, userNodeOverrides } from './handDrawnShapeStyles.js';
 import rough from 'roughjs';
-import { insertPolygonShape } from './insertPolygonShape.js';
 import type { D3Selection } from '../../../types.js';
 
 export const createHexagonPathD = (
@@ -29,42 +28,47 @@ export async function hexagon(parent: D3Selection<
   node.labelStyle = labelStyles;
   const { shapeSvg, bbox } = await labelHelper(parent, node, getNodeClasses(node));
 
-  const f = 4;
-  const h = bbox.height + node.padding;
-  const m = h / f;
-  const w = bbox.width + 2 * m + node.padding;
-  const points = [
-    { x: m, y: 0 },
-    { x: w - m, y: 0 },
-    { x: w, y: -h / 2 },
-    { x: w - m, y: -h },
-    { x: m, y: -h },
-    { x: 0, y: -h / 2 },
-  ];
-
-  let polygon: D3Selection | Awaited>;
+  const h = bbox.height + (node.padding ?? 0);
+  const w = bbox.width + (node.padding ?? 0) * 2.5;
   const { cssStyles } = node;
+  // @ts-expect-error -- Passing a D3.Selection seems to work for some reason
+  const rc = rough.svg(shapeSvg);
+  const options = userNodeOverrides(node, {});
 
-  if (node.look === 'handDrawn') {
-    // @ts-expect-error -- Passing a D3.Selection seems to work for some reason
-    const rc = rough.svg(shapeSvg);
-    const options = userNodeOverrides(node, {});
-    const pathData = createHexagonPathD(0, 0, w, h, m);
-    const roughNode = rc.path(pathData, options);
-
-    polygon = shapeSvg
-      .insert(() => roughNode, ':first-child')
-      .attr('transform', `translate(${-w / 2}, ${h / 2})`);
-
-    if (cssStyles) {
-      polygon.attr('style', cssStyles);
-    }
-  } else {
-    polygon = insertPolygonShape(shapeSvg, w, h, points);
+  if (node.look !== 'handDrawn') {
+    options.roughness = 0;
+    options.fillStyle = 'solid';
   }
 
-  if (nodeStyles) {
-    polygon.attr('style', nodeStyles);
+  const halfWidth = w / 2;
+  const halfHeight = h / 2;
+
+  const fixedLength = halfHeight / 2;
+  const deducedWidth = halfWidth - fixedLength;
+
+  const points = [
+    { x: -deducedWidth, y: -halfHeight },
+    { x: 0, y: -halfHeight },
+    { x: deducedWidth, y: -halfHeight },
+    { x: halfWidth, y: 0 },
+    { x: deducedWidth, y: halfHeight },
+    { x: 0, y: halfHeight },
+    { x: -deducedWidth, y: halfHeight },
+    { x: -halfWidth, y: 0 },
+  ];
+
+  const pathData = createPathFromPoints(points);
+  const shapeNode = rc.path(pathData, options);
+
+  const polygon = shapeSvg.insert(() => shapeNode, ':first-child');
+  polygon.attr('class', 'basic label-container');
+
+  if (cssStyles && node.look !== 'handDrawn') {
+    polygon.selectChildren('path').attr('style', cssStyles);
+  }
+
+  if (nodeStyles && node.look !== 'handDrawn') {
+    polygon.selectChildren('path').attr('style', nodeStyles);
   }
 
   node.width = w;

From 1176d306688323592879b11199ecbf0b69255358 Mon Sep 17 00:00:00 2001
From: darshanr0107 
Date: Wed, 16 Jul 2025 12:38:35 +0530
Subject: [PATCH 039/143] fix: update changeset

on-behalf-of: @Mermaid-Chart 
---
 .changeset/fuzzy-pears-cough.md | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/.changeset/fuzzy-pears-cough.md b/.changeset/fuzzy-pears-cough.md
index 3d3af19ff..6ed777506 100644
--- a/.changeset/fuzzy-pears-cough.md
+++ b/.changeset/fuzzy-pears-cough.md
@@ -2,4 +2,4 @@
 'mermaid': patch
 ---
 
-Fix: an issue where exclude dates in Gantt charts were ignored when using dateFormat: 'YYYY-MM-DD HH:mm:ss'.
+fix: handle exclude dates properly in Gantt charts when using dateFormat: 'YYYY-MM-DD HH:mm:ss'

From ac976245ad9f60b7abbbe31c530197e8196ec0d6 Mon Sep 17 00:00:00 2001
From: darshanr0107 
Date: Wed, 16 Jul 2025 13:11:44 +0530
Subject: [PATCH 040/143] fix: fix review comments

on-behalf-of: @Mermaid-Chart 
---
 .changeset/ninety-roses-turn.md                | 2 +-
 packages/mermaid/src/diagrams/block/blockDB.ts | 4 +++-
 2 files changed, 4 insertions(+), 2 deletions(-)

diff --git a/.changeset/ninety-roses-turn.md b/.changeset/ninety-roses-turn.md
index a37c6c9e8..1eb3a8189 100644
--- a/.changeset/ninety-roses-turn.md
+++ b/.changeset/ninety-roses-turn.md
@@ -2,6 +2,6 @@
 'mermaid': patch
 ---
 
-fix:Add validation for blocks exceeding column width.
+fix: Add validation for blocks exceeding column width
 
 This update adds a validation check that triggers an error message when a block's width exceeds the defined column layout.
diff --git a/packages/mermaid/src/diagrams/block/blockDB.ts b/packages/mermaid/src/diagrams/block/blockDB.ts
index 27702bb32..8831ad90e 100644
--- a/packages/mermaid/src/diagrams/block/blockDB.ts
+++ b/packages/mermaid/src/diagrams/block/blockDB.ts
@@ -102,7 +102,9 @@ const populateBlockDatabase = (_blockList: Block[], parent: Block): void => {
       typeof block.widthInColumns === 'number' &&
       block.widthInColumns > column
     ) {
-      throw new Error(`width of block ${block.id} is greater than the column width`);
+      throw new Error(
+        `Block ${block.id} width ${block.widthInColumns} exceeds configured column width ${column}`
+      );
     }
     if (block.label) {
       block.label = sanitizeText(block.label);

From 34e7f9704b5d3c8a4ac22833cc2aa58db9a8c9d3 Mon Sep 17 00:00:00 2001
From: darshanr0107 
Date: Wed, 16 Jul 2025 13:20:47 +0530
Subject: [PATCH 041/143] fix: update changeset

on-behalf-of: @Mermaid-Chart 
---
 .changeset/empty-clouds-cry.md | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/.changeset/empty-clouds-cry.md b/.changeset/empty-clouds-cry.md
index 87ba93c6d..c513542f1 100644
--- a/.changeset/empty-clouds-cry.md
+++ b/.changeset/empty-clouds-cry.md
@@ -1,5 +1,5 @@
 ---
-'mermaid': major
+'mermaid': patch
 ---
 
-fix: apply correct dateFormat in Gantt chart to show only day when specified
+fix: Apply correct dateFormat in Gantt chart to show only day when specified

From 3fea9e875920bc857dafabaedc65680201c50a84 Mon Sep 17 00:00:00 2001
From: darshanr0107 
Date: Wed, 16 Jul 2025 13:40:40 +0530
Subject: [PATCH 042/143] fix: update changeset

on-behalf-of: @Mermaid-Chart 
---
 .changeset/chatty-lemons-stick.md | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/.changeset/chatty-lemons-stick.md b/.changeset/chatty-lemons-stick.md
index d0a8a4d58..733e374ef 100644
--- a/.changeset/chatty-lemons-stick.md
+++ b/.changeset/chatty-lemons-stick.md
@@ -2,4 +2,4 @@
 'mermaid': patch
 ---
 
-Removed the "Beta" suffix from the XYChart, Block , Sankey diagrams to reflect their stable status
+chore: Remove the "-beta" suffix from the XYChart, Block, Sankey diagrams to reflect their stable status

From 14983158a2a5128d76de4dbfa0763a04d72dfb31 Mon Sep 17 00:00:00 2001
From: omkarht 
Date: Wed, 16 Jul 2025 14:52:53 +0530
Subject: [PATCH 043/143] fix: updated hexagon shape

on-behalf-of: @Mermaid-Chart hello@mermaidchart.com
---
 .../src/rendering-util/rendering-elements/shapes/hexagon.ts  | 5 ++++-
 1 file changed, 4 insertions(+), 1 deletion(-)

diff --git a/packages/mermaid/src/rendering-util/rendering-elements/shapes/hexagon.ts b/packages/mermaid/src/rendering-util/rendering-elements/shapes/hexagon.ts
index fe243d3e4..e73074268 100644
--- a/packages/mermaid/src/rendering-util/rendering-elements/shapes/hexagon.ts
+++ b/packages/mermaid/src/rendering-util/rendering-elements/shapes/hexagon.ts
@@ -40,7 +40,10 @@ export async function hexagon(parent: D3Selection<
     options.fillStyle = 'solid';
   }
 
-  const halfWidth = w / 2;
+  let halfWidth = w / 2;
+  const m = halfWidth / 6; // Margin for label
+  halfWidth = halfWidth + m; // Adjusted half width for hexagon
+
   const halfHeight = h / 2;
 
   const fixedLength = halfHeight / 2;

From cc2112c7aac0862994b45ac97058e7c1e589574f Mon Sep 17 00:00:00 2001
From: darshanr0107 
Date: Wed, 16 Jul 2025 15:25:16 +0530
Subject: [PATCH 044/143] fix: updated test case

on-behalf-of: @Mermaid-Chart 
---
 packages/mermaid/src/diagrams/block/parser/block.spec.ts | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/packages/mermaid/src/diagrams/block/parser/block.spec.ts b/packages/mermaid/src/diagrams/block/parser/block.spec.ts
index b41abde45..2dc79e2ec 100644
--- a/packages/mermaid/src/diagrams/block/parser/block.spec.ts
+++ b/packages/mermaid/src/diagrams/block/parser/block.spec.ts
@@ -414,7 +414,7 @@ columns 1
     G:1`;
 
       expect(() => block.parse(str)).toThrowError(
-        'width of block B is greater than the column width'
+        'Block B width 2 exceeds configured column width 1'
       );
     });
   });

From 3ab0961bdcdc3cc94e9ccdf6bc0780865a03a7fa Mon Sep 17 00:00:00 2001
From: darshanr0107 
Date: Wed, 16 Jul 2025 17:27:08 +0530
Subject: [PATCH 045/143] fix: PR comment and updated test case

on-behalf-of: @Mermaid-Chart 
---
 packages/mermaid/src/diagrams/pie/pie.spec.ts | 2 +-
 packages/mermaid/src/diagrams/pie/pieDb.ts    | 2 +-
 2 files changed, 2 insertions(+), 2 deletions(-)

diff --git a/packages/mermaid/src/diagrams/pie/pie.spec.ts b/packages/mermaid/src/diagrams/pie/pie.spec.ts
index d5d39692f..60fff01e1 100644
--- a/packages/mermaid/src/diagrams/pie/pie.spec.ts
+++ b/packages/mermaid/src/diagrams/pie/pie.spec.ts
@@ -161,7 +161,7 @@ describe('pie', () => {
         "rats" : 40.12
     `);
       }).rejects.toThrowError(
-        '"dogs" has invalid value: -60.67.Negative values are not allowed in pie charts. All slice values must be > 0'
+        '"dogs" has invalid value: -60.67. Negative values are not allowed in pie charts. All slice values must be >= 0.'
       );
     });
 
diff --git a/packages/mermaid/src/diagrams/pie/pieDb.ts b/packages/mermaid/src/diagrams/pie/pieDb.ts
index d5c66ff78..083ee97d5 100644
--- a/packages/mermaid/src/diagrams/pie/pieDb.ts
+++ b/packages/mermaid/src/diagrams/pie/pieDb.ts
@@ -36,7 +36,7 @@ const clear = (): void => {
 const addSection = ({ label, value }: D3Section): void => {
   if (value < 0) {
     throw new Error(
-      `"${label}" has invalid value: ${value}.Negative values are not allowed in pie charts. All slice values must be > 0.`
+      `"${label}" has invalid value: ${value}. Negative values are not allowed in pie charts. All slice values must be >= 0.`
     );
   }
   if (!sections.has(label)) {

From a14cd0e2a1bb9d501672d21639c9dac2428c0547 Mon Sep 17 00:00:00 2001
From: darshanr0107 
Date: Wed, 16 Jul 2025 18:47:45 +0530
Subject: [PATCH 046/143] fix: update test case

on-behalf-of: @Mermaid-Chart 
---
 packages/mermaid/src/mermaidAPI.spec.ts | 6 +++++-
 1 file changed, 5 insertions(+), 1 deletion(-)

diff --git a/packages/mermaid/src/mermaidAPI.spec.ts b/packages/mermaid/src/mermaidAPI.spec.ts
index ef2ffdc73..b2d2d3cd3 100644
--- a/packages/mermaid/src/mermaidAPI.spec.ts
+++ b/packages/mermaid/src/mermaidAPI.spec.ts
@@ -755,7 +755,11 @@ graph TD;A--x|text including URL space|B;`)
         expectedType: 'xychart',
         content: 'x-axis "Attempts" 10000 --> 10000\ny-axis "Passing tests" 1 --> 1\nbar [1]',
       },
-      { textDiagramType: 'xychart', expectedType: 'xychart' },
+      {
+        textDiagramType: 'xychart',
+        expectedType: 'xychart',
+        content: 'x-axis "Attempts" 10000 --> 10000\ny-axis "Passing tests" 1 --> 1\nbar [1]',
+      },
       { textDiagramType: 'requirementDiagram', expectedType: 'requirement' },
       { textDiagramType: 'sequenceDiagram', expectedType: 'sequence' },
       { textDiagramType: 'stateDiagram-v2', expectedType: 'stateDiagram' },

From 827a9af790f0c06dc2d7ec29295ad701f1d1b28e Mon Sep 17 00:00:00 2001
From: Sidharth Vinod 
Date: Wed, 16 Jul 2025 19:52:52 +0530
Subject: [PATCH 047/143] chore: Add repo to examples package

---
 packages/examples/package.json | 4 ++++
 1 file changed, 4 insertions(+)

diff --git a/packages/examples/package.json b/packages/examples/package.json
index 90abc9da9..c45c23c25 100644
--- a/packages/examples/package.json
+++ b/packages/examples/package.json
@@ -16,6 +16,10 @@
   "files": [
     "dist"
   ],
+  "repository": {
+    "type": "git",
+    "url": "https://github.com/mermaid-js/mermaid"
+  },
   "scripts": {
     "clean": "rimraf dist"
   },

From af3d5b6528d27dd733a681bc376f0c726c336338 Mon Sep 17 00:00:00 2001
From: Sidharth Vinod 
Date: Wed, 16 Jul 2025 20:11:38 +0530
Subject: [PATCH 048/143] docs: Add README for examples

---
 packages/examples/README.md | 41 +++++++++++++++++++++++++++++++++++++
 1 file changed, 41 insertions(+)
 create mode 100644 packages/examples/README.md

diff --git a/packages/examples/README.md b/packages/examples/README.md
new file mode 100644
index 000000000..603d0cea8
--- /dev/null
+++ b/packages/examples/README.md
@@ -0,0 +1,41 @@
+# @mermaid-js/examples
+
+The `@mermaid-js/examples` package contains a collection of examples used by tools like [mermaid.live](https://mermaid.live) to help users get started with new diagrams.
+
+You can duplicate an existing diagram example file, e.g., `packages/examples/src/examples/flowchart.ts`, and modify it with details specific to your diagram.
+
+Then, 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, which should be marked as the default. It's a good idea to add more examples to showcase different features of the diagram.
+
+## Usage
+
+```bash
+pnpm add @mermaid-js/examples
+```
+
+A sample usage of the package in mermaid.live, to get the default example for every diagram type:
+
+```ts
+import { diagramData } from '@mermaid-js/examples';
+
+type DiagramDefinition = (typeof diagramData)[number];
+
+const isValidDiagram = (diagram: DiagramDefinition): diagram is Required => {
+  return Boolean(diagram.name && diagram.examples && diagram.examples.length > 0);
+};
+
+export const getSampleDiagrams = () => {
+  const diagrams = diagramData
+    .filter((d) => isValidDiagram(d))
+    .map(({ examples, ...rest }) => ({
+      ...rest,
+      example: examples?.filter(({ isDefault }) => isDefault)[0],
+    }));
+  const examples: Record = {};
+  for (const diagram of diagrams) {
+    examples[diagram.name.replace(/ (Diagram|Chart|Graph)/, '')] = diagram.example.code;
+  }
+  return examples;
+};
+```

From 7886fed8b237b0932a439e26c8fa357947c6da2c Mon Sep 17 00:00:00 2001
From: hustcc 
Date: Thu, 17 Jul 2025 09:36:16 +0800
Subject: [PATCH 049/143] chore: update to add mcp-mermaid

---
 packages/mermaid/src/docs/ecosystem/integrations-community.md | 1 +
 1 file changed, 1 insertion(+)

diff --git a/packages/mermaid/src/docs/ecosystem/integrations-community.md b/packages/mermaid/src/docs/ecosystem/integrations-community.md
index 9f32cfd1e..e192a0387 100644
--- a/packages/mermaid/src/docs/ecosystem/integrations-community.md
+++ b/packages/mermaid/src/docs/ecosystem/integrations-community.md
@@ -79,6 +79,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.
 
 - [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
 

From 412d2a09d3c4fb56ff0f07e175b049b8245325df Mon Sep 17 00:00:00 2001
From: "autofix-ci[bot]" <114827586+autofix-ci[bot]@users.noreply.github.com>
Date: Thu, 17 Jul 2025 01:41:47 +0000
Subject: [PATCH 050/143] [autofix.ci] apply automated fixes

---
 docs/ecosystem/integrations-community.md | 1 +
 1 file changed, 1 insertion(+)

diff --git a/docs/ecosystem/integrations-community.md b/docs/ecosystem/integrations-community.md
index 463fcfae7..cc5dbad1a 100644
--- a/docs/ecosystem/integrations-community.md
+++ b/docs/ecosystem/integrations-community.md
@@ -84,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.
 
 - [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
 

From 7ba332ad4a99627e28cbe7e1dbfe26d448e0014b Mon Sep 17 00:00:00 2001
From: Sidharth Vinod 
Date: Thu, 17 Jul 2025 12:45:03 +0530
Subject: [PATCH 051/143] docs: Move changelog content

---
 CHANGELOG.md                  | 1005 ---------------------------------
 packages/mermaid/CHANGELOG.md | 1002 ++++++++++++++++++++++++++++++++
 2 files changed, 1002 insertions(+), 1005 deletions(-)
 delete mode 100644 CHANGELOG.md

diff --git a/CHANGELOG.md b/CHANGELOG.md
deleted file mode 100644
index 8a4c0a414..000000000
--- a/CHANGELOG.md
+++ /dev/null
@@ -1,1005 +0,0 @@
-# Changelog
-
-## [10.0.0](https://github.com/mermaid-js/mermaid/releases/tag/v10.0.0)
-
-### Mermaid is ESM only!
-
-We've dropped CJS support. So, you will have to update your import scripts as follows.
-
-```html
-
-```
-
-You can keep using v9 by adding the `@9` in the CDN URL.
-
-```diff
-- 
-+ 
-```
-
-### mermaid.render is async and doesn't accept callbacks
-
-```js
-// < v10
-mermaid.render('id', 'graph TD;\nA-->B', (svg, bindFunctions) => {
-  element.innerHTML = svg;
-  if (bindFunctions) {
-    bindFunctions(element);
-  }
-});
-
-// Shorter syntax
-if (bindFunctions) {
-  bindFunctions(element);
-}
-// can be replaced with the `?.` shorthand
-bindFunctions?.(element);
-
-// >= v10 with async/await
-const { svg, bindFunctions } = await mermaid.render('id', 'graph TD;\nA-->B');
-element.innerHTML = svg;
-bindFunctions?.(element);
-
-// >= v10 with promise.then
-mermaid.render('id', 'graph TD;A-->B').then(({ svg, bindFunctions }) => {
-  element.innerHTML = svg;
-  bindFunctions?.(element);
-});
-```
-
-### mermaid.parse is async and ParseError is removed
-
-```js
-// < v10
-mermaid.parse(text, parseError);
-
-//>= v10
-await mermaid.parse(text).catch(parseError);
-// or
-try {
-  await mermaid.parse(text);
-} catch (err) {
-  parseError(err);
-}
-```
-
-### Init deprecated and InitThrowsErrors removed
-
-The config passed to `init` was not being used earlier.
-It will now be used.
-The `init` function is deprecated and will be removed in the next major release.
-init currently works as a wrapper to `initialize` and `run`.
-
-```js
-// < v10
-mermaid.init(config, selector, cb);
-
-//>= v10
-mermaid.initialize(config);
-mermaid.run({
-  querySelector: selector,
-  postRenderCallback: cb,
-  suppressErrors: true,
-});
-```
-
-```js
-// < v10
-mermaid.initThrowsErrors(config, selector, cb);
-
-//>= v10
-mermaid.initialize(config);
-mermaid.run({
-  querySelector: selector,
-  postRenderCallback: cb,
-  suppressErrors: false,
-});
-```
-
-// TODO: Populate changelog pre v10
-
-- Config has a lot of changes
-- globalReset resets to `defaultConfig` instead of current config. Use `reset` instead.
-
-## [Unreleased](https://github.com/knsv/mermaid/tree/HEAD)
-
-[Full Changelog](https://github.com/knsv/mermaid/compare/8.2.0...HEAD)
-
-**Closed issues:**
-
-- Cross-Site Scripting:DOM - Issue [\#847](https://github.com/knsv/mermaid/issues/847)
-
-## [8.2.0](https://github.com/knsv/mermaid/tree/8.2.0) (2019-07-17)
-
-[Full Changelog](https://github.com/knsv/mermaid/compare/8.1.0...8.2.0)
-
-**Closed issues:**
-
-- Create issue templates [\#871](https://github.com/knsv/mermaid/issues/871)
-- cross site scripting in mermaid [\#869](https://github.com/knsv/mermaid/issues/869)
-- Make Gantt chart date inclusive [\#868](https://github.com/knsv/mermaid/issues/868)
-- CHANGELOG missing updates for all versions since 0.4.0 [\#865](https://github.com/knsv/mermaid/issues/865)
-- please add tag for 8.0.0 release [\#863](https://github.com/knsv/mermaid/issues/863)
-- classDiagram breaks on any edit [\#858](https://github.com/knsv/mermaid/issues/858)
-- found 1 high severity vulnerability [\#839](https://github.com/knsv/mermaid/issues/839)
-- Missing fontawesome icon support [\#830](https://github.com/knsv/mermaid/issues/830)
-- Docs for integration with wiki.js? [\#829](https://github.com/knsv/mermaid/issues/829)
-- Is this project still maintained? [\#826](https://github.com/knsv/mermaid/issues/826)
-- typora [\#823](https://github.com/knsv/mermaid/issues/823)
-- Maintain the order of the nodes in Flowchart [\#815](https://github.com/knsv/mermaid/issues/815)
-- Overlap, Overflow and cut titles in flowchart [\#814](https://github.com/knsv/mermaid/issues/814)
-- How load mermaidApi notejs electron [\#813](https://github.com/knsv/mermaid/issues/813)
-- How to set the spacing between the text of the flowchart node and the border? [\#812](https://github.com/knsv/mermaid/issues/812)
-- no triming participant name and the name following spaces is as another actor in sequence [\#809](https://github.com/knsv/mermaid/issues/809)
-- uml Class as shape type [\#807](https://github.com/knsv/mermaid/issues/807)
-- Force-directed graph Layout Style [\#806](https://github.com/knsv/mermaid/issues/806)
-- how can I start a newLine in FlowChart [\#805](https://github.com/knsv/mermaid/issues/805)
-- UOEProcessShow [\#801](https://github.com/knsv/mermaid/issues/801)
-- Why the use of code blocks? [\#799](https://github.com/knsv/mermaid/issues/799)
-- fixing class diagram [\#794](https://github.com/knsv/mermaid/issues/794)
-- Autonumber support in sequence diagrams [\#782](https://github.com/knsv/mermaid/issues/782)
-- MomentJS dependency [\#781](https://github.com/knsv/mermaid/issues/781)
-- Feature : Can we color code the flow/arrows [\#766](https://github.com/knsv/mermaid/issues/766)
-- Is there any way to convert flowchart.js code to mermaid code [\#726](https://github.com/knsv/mermaid/issues/726)
-- Fixed width of nodes [\#653](https://github.com/knsv/mermaid/issues/653)
-- Inline comment [\#650](https://github.com/knsv/mermaid/issues/650)
-- alt attribute of img tag in HTML [\#619](https://github.com/knsv/mermaid/issues/619)
-- Just wanted to say : THANKS ! [\#618](https://github.com/knsv/mermaid/issues/618)
-- "animation" [\#446](https://github.com/knsv/mermaid/issues/446)
-
-**Merged pull requests:**
-
-- Trimming whitespace after participant id [\#882](https://github.com/knsv/mermaid/pull/882) ([IOrlandoni](https://github.com/IOrlandoni))
-- chore\(deps\): bump atob from 2.0.3 to 2.1.2 [\#881](https://github.com/knsv/mermaid/pull/881) ([dependabot[bot]](https://github.com/apps/dependabot))
-- chore\(deps\): bump fstream from 1.0.11 to 1.0.12 [\#880](https://github.com/knsv/mermaid/pull/880) ([dependabot[bot]](https://github.com/apps/dependabot))
-- chore\(deps\): bump js-yaml from 3.12.0 to 3.13.1 [\#879](https://github.com/knsv/mermaid/pull/879) ([dependabot[bot]](https://github.com/apps/dependabot))
-- I847 cross site scripting [\#878](https://github.com/knsv/mermaid/pull/878) ([knsv](https://github.com/knsv))
-- Bump lodash.mergewith from 4.6.1 to 4.6.2 [\#877](https://github.com/knsv/mermaid/pull/877) ([dependabot[bot]](https://github.com/apps/dependabot))
-- Adding docs into core repo again [\#876](https://github.com/knsv/mermaid/pull/876) ([knsv](https://github.com/knsv))
-- Bump lodash from 4.17.11 to 4.17.13 [\#875](https://github.com/knsv/mermaid/pull/875) ([dependabot[bot]](https://github.com/apps/dependabot))
-- feat\(stale.yml\): update issue label and bot comment [\#874](https://github.com/knsv/mermaid/pull/874) ([ThePenguin1140](https://github.com/ThePenguin1140))
-- Feature/allow inclusive enddates [\#872](https://github.com/knsv/mermaid/pull/872) ([ThePenguin1140](https://github.com/ThePenguin1140))
-- Adding trapezoid and inverse trapezoid vertex options. [\#741](https://github.com/knsv/mermaid/pull/741) ([adamwulf](https://github.com/adamwulf))
-
-## [8.1.0](https://github.com/knsv/mermaid/tree/8.1.0) (2019-06-25)
-
-[Full Changelog](https://github.com/knsv/mermaid/compare/7.0.5...8.1.0)
-
-**Closed issues:**
-
-- Gantt and sequence diagram do not render [\#853](https://github.com/knsv/mermaid/issues/853)
-- margins around flowchart are not balanced [\#852](https://github.com/knsv/mermaid/issues/852)
-- Smaller bundles [\#843](https://github.com/knsv/mermaid/issues/843)
-- unicode in labels [\#776](https://github.com/knsv/mermaid/issues/776)
-- Hard-changing drawing of arrows per edge type [\#775](https://github.com/knsv/mermaid/issues/775)
-- SequenceDiagram wrong [\#773](https://github.com/knsv/mermaid/issues/773)
-- Render mermaid on github pages with simple code [\#772](https://github.com/knsv/mermaid/issues/772)
-- FlowChart - large space between text and the image [\#754](https://github.com/knsv/mermaid/issues/754)
-- Class Diagram Issues when using Mermaid in Stackedit [\#748](https://github.com/knsv/mermaid/issues/748)
-- Multi-platform CI [\#744](https://github.com/knsv/mermaid/issues/744)
-- gantt: sections can't have a colon [\#742](https://github.com/knsv/mermaid/issues/742)
-- Yarn build does not add mermaid.min.css to dist [\#732](https://github.com/knsv/mermaid/issues/732)
-- Is there a grammar / keyword / more than just the basic examples? [\#718](https://github.com/knsv/mermaid/issues/718)
-- Click event and react component [\#717](https://github.com/knsv/mermaid/issues/717)
-- Long text going outside the box [\#706](https://github.com/knsv/mermaid/issues/706)
-- How to migrate from yUML to mermaid? [\#704](https://github.com/knsv/mermaid/issues/704)
-- Issue on Dynamic Creation in PHP [\#690](https://github.com/knsv/mermaid/issues/690)
-- `click "\#target"` and `click "http://url"` should create regular links [\#689](https://github.com/knsv/mermaid/issues/689)
-- Support Chinese punctuation [\#687](https://github.com/knsv/mermaid/issues/687)
-- \[Question\] Proper way to install on Mac? [\#681](https://github.com/knsv/mermaid/issues/681)
-- Has Mermaid a graphical interface to make diagrams? [\#668](https://github.com/knsv/mermaid/issues/668)
-- mermaid installation on debian [\#649](https://github.com/knsv/mermaid/issues/649)
-- "Cannot activate" in sequenceDiagram [\#647](https://github.com/knsv/mermaid/issues/647)
-- Link \("click" statement\) in flowchart does not work in exported SVG [\#646](https://github.com/knsv/mermaid/issues/646)
-- How to pass styling [\#639](https://github.com/knsv/mermaid/issues/639)
-- The live editor can't show seq diagram with notes for 8.0.0-alpha.3 [\#638](https://github.com/knsv/mermaid/issues/638)
-- import mermaid.css with ES6 + NPM [\#634](https://github.com/knsv/mermaid/issues/634)
-- Actor line cuts through other elements [\#633](https://github.com/knsv/mermaid/issues/633)
-- Graph TD line out of the picture \(left side\) [\#630](https://github.com/knsv/mermaid/issues/630)
-- Flowchart labels appear "cutoff" [\#628](https://github.com/knsv/mermaid/issues/628)
-- Uncaught TypeError: \_.constant is not a function \(mermaid.js\) [\#626](https://github.com/knsv/mermaid/issues/626)
-- Missing tags and releases for newer versions [\#623](https://github.com/knsv/mermaid/issues/623)
-- Mermaid and Leo / Leo Vue [\#622](https://github.com/knsv/mermaid/issues/622)
-- mermaidAPI gantt Vue.js [\#621](https://github.com/knsv/mermaid/issues/621)
-- Gantt sections are not separated by colors - Fix: set numberSectionStyles to 4 instead of 3 [\#620](https://github.com/knsv/mermaid/issues/620)
-- how to get mermaidAPI? [\#617](https://github.com/knsv/mermaid/issues/617)
-- Error in startOnLoad documentation? [\#616](https://github.com/knsv/mermaid/issues/616)
-- Example export to SVG generates error [\#614](https://github.com/knsv/mermaid/issues/614)
-- The new online editor does not support previously generated links [\#613](https://github.com/knsv/mermaid/issues/613)
-- Grammar / Syntax documentation for flowcharts [\#607](https://github.com/knsv/mermaid/issues/607)
-- Mermaid does not work with d3.js [\#606](https://github.com/knsv/mermaid/issues/606)
-- Why does this code's flowchart lines get cut-off on screen? [\#604](https://github.com/knsv/mermaid/issues/604)
-- click keyword does not fire my callback \(on the demo Website too\) [\#603](https://github.com/knsv/mermaid/issues/603)
-- Online Editor fails to show exported SVG [\#601](https://github.com/knsv/mermaid/issues/601)
-- Just saying thanks! [\#597](https://github.com/knsv/mermaid/issues/597)
-- stylesheet crashed with other library like abcjs [\#596](https://github.com/knsv/mermaid/issues/596)
-- Missing connection [\#594](https://github.com/knsv/mermaid/issues/594)
-- How to use mermaid on node.js restful api? [\#593](https://github.com/knsv/mermaid/issues/593)
-- Remove status code [\#589](https://github.com/knsv/mermaid/issues/589)
-- Golang based editor [\#588](https://github.com/knsv/mermaid/issues/588)
-- sequenceDiagram -\> notetext css font is hardcoded [\#587](https://github.com/knsv/mermaid/issues/587)
-- Multiple graph in the live editor [\#586](https://github.com/knsv/mermaid/issues/586)
-- All \ elements in page are colored black [\#584](https://github.com/knsv/mermaid/issues/584)
-- Styling: classes aren't applied to elements. [\#582](https://github.com/knsv/mermaid/issues/582)
-- Rounded connections [\#580](https://github.com/knsv/mermaid/issues/580)
-- Arrows are not being shown correctly in the dark theme [\#578](https://github.com/knsv/mermaid/issues/578)
-- The documentation for CLI seems outdated. [\#572](https://github.com/knsv/mermaid/issues/572)
-- No effect of click event:can not open link [\#571](https://github.com/knsv/mermaid/issues/571)
-- Text colors are not correct in VSCODE [\#570](https://github.com/knsv/mermaid/issues/570)
-- Nodes aren't aligned properly \(just need an explanation\) [\#568](https://github.com/knsv/mermaid/issues/568)
-- setting margin around figure in R [\#567](https://github.com/knsv/mermaid/issues/567)
-- Arrows should Come out in upward and Downward direction from decision Node [\#566](https://github.com/knsv/mermaid/issues/566)
-- TypeError: Cannot read property 'select' of undefined [\#563](https://github.com/knsv/mermaid/issues/563)
-- A little bug [\#557](https://github.com/knsv/mermaid/issues/557)
-- Japanese text appears garbled [\#554](https://github.com/knsv/mermaid/issues/554)
-- classdiagram not works in mermaid live_editor [\#553](https://github.com/knsv/mermaid/issues/553)
-- font awesome in link text? [\#546](https://github.com/knsv/mermaid/issues/546)
-- q: heard of the cosmogol standard? [\#545](https://github.com/knsv/mermaid/issues/545)
-- Arrow heads missing \(cli, 7.0.3\) [\#544](https://github.com/knsv/mermaid/issues/544)
-- No Edge Boxes if useHtmlLabels=false [\#541](https://github.com/knsv/mermaid/issues/541)
-- how to change mermaid text color or line text block color? [\#534](https://github.com/knsv/mermaid/issues/534)
-- FlowChart visualization broken when downloading from live editor [\#533](https://github.com/knsv/mermaid/issues/533)
-- Can't get flowchart to render paths at the top of the diagram; I even tried the online editor and that shows the same issue. Thoughts? [\#532](https://github.com/knsv/mermaid/issues/532)
-- live editor make browser\(safari on macOS&iOS\) not longer respond [\#531](https://github.com/knsv/mermaid/issues/531)
-- css classes need a prefix/namespace [\#527](https://github.com/knsv/mermaid/issues/527)
-- input activate/deactivate cause safari unresponding [\#521](https://github.com/knsv/mermaid/issues/521)
-- Cannot Render the Mermaid Graph to PDF ? [\#520](https://github.com/knsv/mermaid/issues/520)
-- clicking links works from inset in subgraph but not from nodes [\#516](https://github.com/knsv/mermaid/issues/516)
-- Strange syntax error - when importing mermaid.js [\#515](https://github.com/knsv/mermaid/issues/515)
-- gantt x-axis display [\#510](https://github.com/knsv/mermaid/issues/510)
-- phantomjs renamed to phantomjs-prebuilt [\#508](https://github.com/knsv/mermaid/issues/508)
-- issue when using sphinxcontrib-mermaid extension for sphinx [\#507](https://github.com/knsv/mermaid/issues/507)
-- layout of docs page looks broken [\#504](https://github.com/knsv/mermaid/issues/504)
-- Problem showing graph with php on localhost [\#502](https://github.com/knsv/mermaid/issues/502)
-- logLevel's option doesnt work at 7.0.0 [\#501](https://github.com/knsv/mermaid/issues/501)
-- How do I get the log for a render or parse attempt? [\#500](https://github.com/knsv/mermaid/issues/500)
-- Mermaid neutral style to built in latest release [\#499](https://github.com/knsv/mermaid/issues/499)
-- Any plans for adding a typescript definition file? [\#495](https://github.com/knsv/mermaid/issues/495)
-- Gantt diagrams too narrow [\#493](https://github.com/knsv/mermaid/issues/493)
-- Flowchart edge labels placement [\#490](https://github.com/knsv/mermaid/issues/490)
-- Very different styles when rendering as png vs. svg [\#489](https://github.com/knsv/mermaid/issues/489)
-- New editor that supports mermaid: Caret [\#488](https://github.com/knsv/mermaid/issues/488)
-- Gant PNG margin [\#486](https://github.com/knsv/mermaid/issues/486)
-- ReferenceError: window is not defined [\#485](https://github.com/knsv/mermaid/issues/485)
-- Menu and layout bugs in docs [\#484](https://github.com/knsv/mermaid/issues/484)
-- Mermaid resets some of the page CSS styles [\#482](https://github.com/knsv/mermaid/issues/482)
-- Arrows rendering incorrectly in online editor [\#480](https://github.com/knsv/mermaid/issues/480)
-- CSS stroke-dasharray ignored by browsers but not other viewers [\#474](https://github.com/knsv/mermaid/issues/474)
-- mermaid - Browser Support issue [\#472](https://github.com/knsv/mermaid/issues/472)
-- Totally love mermaid I might pop! [\#471](https://github.com/knsv/mermaid/issues/471)
-- Sequence Diagram: Missing x on async arrows \(png\) [\#469](https://github.com/knsv/mermaid/issues/469)
-- live editor: the svg file rendered from graph is not supported by browsers [\#468](https://github.com/knsv/mermaid/issues/468)
-- Not found css [\#462](https://github.com/knsv/mermaid/issues/462)
-- Phantomjs Dependency [\#461](https://github.com/knsv/mermaid/issues/461)
-- Mermaid cli not working for subgraphs [\#459](https://github.com/knsv/mermaid/issues/459)
-- Support for notes across multiple participants? [\#458](https://github.com/knsv/mermaid/issues/458)
-- Related to Issue \#329: Phantomjs issues. [\#455](https://github.com/knsv/mermaid/issues/455)
-- Add a click style [\#426](https://github.com/knsv/mermaid/issues/426)
-- Add Parallel block \(par\) to sequence diagrams [\#425](https://github.com/knsv/mermaid/issues/425)
-- updating shapes after the flow chart rendering complete [\#424](https://github.com/knsv/mermaid/issues/424)
-- can't catch parse error Maximum call stack size exceeded on safari [\#421](https://github.com/knsv/mermaid/issues/421)
-- Arrows endings are missing [\#419](https://github.com/knsv/mermaid/issues/419)
-- shouldn't mermaid become more like Markdown ? [\#417](https://github.com/knsv/mermaid/issues/417)
-- Live editor show rendered diagram if syntax invalid [\#415](https://github.com/knsv/mermaid/issues/415)
-- Live editor sticky sidebar [\#414](https://github.com/knsv/mermaid/issues/414)
-- Linkstyle stroke does not work [\#410](https://github.com/knsv/mermaid/issues/410)
-- flowchart id's with dots in them .. break links [\#408](https://github.com/knsv/mermaid/issues/408)
-- Flowchart: Link text beginning with lowercase 'o' causes flowchart to break [\#407](https://github.com/knsv/mermaid/issues/407)
-- Some chinese character will case Safari no responding. [\#405](https://github.com/knsv/mermaid/issues/405)
-- Cannot center-justify text in nodes? [\#397](https://github.com/knsv/mermaid/issues/397)
-- Edge labels should have white background in live editor [\#396](https://github.com/knsv/mermaid/issues/396)
-- Live editor does not support activate/deactivate [\#394](https://github.com/knsv/mermaid/issues/394)
-- Styling subgraph? [\#391](https://github.com/knsv/mermaid/issues/391)
-- Update live editor to version 6.0.0 [\#387](https://github.com/knsv/mermaid/issues/387)
-- sequence diagram config issue [\#385](https://github.com/knsv/mermaid/issues/385)
-- How to add newline in the text [\#384](https://github.com/knsv/mermaid/issues/384)
-- PhantomJS crashes on a large graph [\#380](https://github.com/knsv/mermaid/issues/380)
-- Finnish support for class diagrams using plantuml syntax [\#377](https://github.com/knsv/mermaid/issues/377)
-- mermaidAPI.render generated different svg code from mermaid.int\(\) [\#374](https://github.com/knsv/mermaid/issues/374)
-- Put your own action on the chart [\#372](https://github.com/knsv/mermaid/issues/372)
-- when declaring participants the elements are generated twice [\#370](https://github.com/knsv/mermaid/issues/370)
-- Example Flowchart is cut in display \(Chrome\). [\#368](https://github.com/knsv/mermaid/issues/368)
-- Add shebang support to diagrams [\#365](https://github.com/knsv/mermaid/issues/365)
-- Silencing CLI output [\#352](https://github.com/knsv/mermaid/issues/352)
-- SequenceDiagram: 3+ Alternative Paths [\#348](https://github.com/knsv/mermaid/issues/348)
-- Smaller height of actor boxes [\#342](https://github.com/knsv/mermaid/issues/342)
-- Question: lib/phantomscript.js - foreignObjects in SVG - related to \#58 [\#340](https://github.com/knsv/mermaid/issues/340)
-- npm test fails on osx being blocked at Can not load "PhantomJS", it is not registered! [\#337](https://github.com/knsv/mermaid/issues/337)
-- Tabs & subgraphs cause rendering error [\#336](https://github.com/knsv/mermaid/issues/336)
-- Display question: right angles [\#335](https://github.com/knsv/mermaid/issues/335)
-- No Arrows rendered v0.5.8 [\#330](https://github.com/knsv/mermaid/issues/330)
-- mermaid -v filename.mmd gives You must specify at least one source file. [\#328](https://github.com/knsv/mermaid/issues/328)
-- You had errors in your syntax. Use --help for further information. [\#327](https://github.com/knsv/mermaid/issues/327)
-- Allow alternate arrow syntax that doesn't close html comments [\#322](https://github.com/knsv/mermaid/issues/322)
-- Comment in subgraph [\#319](https://github.com/knsv/mermaid/issues/319)
-- Update graph [\#311](https://github.com/knsv/mermaid/issues/311)
-- css conflicts with boostrap's css [\#308](https://github.com/knsv/mermaid/issues/308)
-- Can not get click event to fire. [\#306](https://github.com/knsv/mermaid/issues/306)
-- Fix phantomjs2 compatibility [\#304](https://github.com/knsv/mermaid/issues/304)
-- Flowcharts do not work in native IE11 [\#303](https://github.com/knsv/mermaid/issues/303)
-- Integration with remark.js - tutorial added [\#302](https://github.com/knsv/mermaid/issues/302)
-- Theme for dark background [\#301](https://github.com/knsv/mermaid/issues/301)
-- Sequence diagram Loops: changing boxMargin spoils the "loop" notation [\#299](https://github.com/knsv/mermaid/issues/299)
-- src/mermaid.js generates bad code [\#297](https://github.com/knsv/mermaid/issues/297)
-- Fresh fork: jasmine tests fail [\#294](https://github.com/knsv/mermaid/issues/294)
-- CSS clash [\#292](https://github.com/knsv/mermaid/issues/292)
-- Mermaid does not work in Chrome 48 [\#281](https://github.com/knsv/mermaid/issues/281)
-- node click is not effective [\#272](https://github.com/knsv/mermaid/issues/272)
-- circle and ellipse cannot change color by classDef [\#271](https://github.com/knsv/mermaid/issues/271)
-- \[Feature request\] gantt diagram axis format [\#269](https://github.com/knsv/mermaid/issues/269)
-- Not Able to See Labels even htmlLabels:false added [\#268](https://github.com/knsv/mermaid/issues/268)
-- npm run watch doesn’t work due missing dependencies [\#266](https://github.com/knsv/mermaid/issues/266)
-- label out of node [\#262](https://github.com/knsv/mermaid/issues/262)
-- IE11 Support issue [\#261](https://github.com/knsv/mermaid/issues/261)
-- mermaid without browser [\#260](https://github.com/knsv/mermaid/issues/260)
-- Insufficient capacity of gantt diagrams [\#226](https://github.com/knsv/mermaid/issues/226)
-- some WARN about installion [\#222](https://github.com/knsv/mermaid/issues/222)
-- Live editor offline access [\#217](https://github.com/knsv/mermaid/issues/217)
-- suggest: code highlight mode config for editors [\#212](https://github.com/knsv/mermaid/issues/212)
-- Uncaught RangeError: Maximum call stack size exceeded [\#189](https://github.com/knsv/mermaid/issues/189)
-- Implement render function for server side rendering using phantomjs [\#169](https://github.com/knsv/mermaid/issues/169)
-- Styling label texts [\#50](https://github.com/knsv/mermaid/issues/50)
-- Graphviz DOT syntax [\#5](https://github.com/knsv/mermaid/issues/5)
-
-**Merged pull requests:**
-
-- Remove console.log in classDB. [\#861](https://github.com/knsv/mermaid/pull/861) ([Arthaey](https://github.com/Arthaey))
-- Bump sshpk from 1.13.1 to 1.16.1 [\#851](https://github.com/knsv/mermaid/pull/851) ([dependabot[bot]](https://github.com/apps/dependabot))
-- Significantly smaller bundles [\#850](https://github.com/knsv/mermaid/pull/850) ([fabiospampinato](https://github.com/fabiospampinato))
-- Support styling of subgraphs [\#845](https://github.com/knsv/mermaid/pull/845) ([Qix-](https://github.com/Qix-))
-- fix dark theme loop labels not visible [\#837](https://github.com/knsv/mermaid/pull/837) ([jnnnnn](https://github.com/jnnnnn))
-- fix draw function can only call once [\#832](https://github.com/knsv/mermaid/pull/832) ([vaniship](https://github.com/vaniship))
-- Fix dotted lines not appearing in flowcharts when HTML labels disabled [\#828](https://github.com/knsv/mermaid/pull/828) ([stanhu](https://github.com/stanhu))
-- Fix issue with XML line breaks inside vertex labels [\#824](https://github.com/knsv/mermaid/pull/824) ([jsyang](https://github.com/jsyang))
-- fixed diagrams [\#810](https://github.com/knsv/mermaid/pull/810) ([0xflotus](https://github.com/0xflotus))
-- Clickable gantt tasks [\#804](https://github.com/knsv/mermaid/pull/804) ([abzicht](https://github.com/abzicht))
-- linkStyle now supports list of indexes with a few tests [\#798](https://github.com/knsv/mermaid/pull/798) ([ivan-danilov](https://github.com/ivan-danilov))
-- fix class diagram mermaid [\#795](https://github.com/knsv/mermaid/pull/795) ([DanShai](https://github.com/DanShai))
-- Added exclude weekdays to definition [\#792](https://github.com/knsv/mermaid/pull/792) ([jopapo](https://github.com/jopapo))
-- SVG link rendering [\#791](https://github.com/knsv/mermaid/pull/791) ([flying-sheep](https://github.com/flying-sheep))
-- Gantt milestones [\#788](https://github.com/knsv/mermaid/pull/788) ([gijswijs](https://github.com/gijswijs))
-- Remove duplicate code [\#768](https://github.com/knsv/mermaid/pull/768) ([znxkznxk1030](https://github.com/znxkznxk1030))
-- Render nodes as real links [\#765](https://github.com/knsv/mermaid/pull/765) ([flying-sheep](https://github.com/flying-sheep))
-- Support Multi-line Actor Descriptions [\#764](https://github.com/knsv/mermaid/pull/764) ([watsoncj](https://github.com/watsoncj))
-- Fix issue with marker-end. [\#757](https://github.com/knsv/mermaid/pull/757) ([gjlubbertsen](https://github.com/gjlubbertsen))
-- Make Class Diagrams usable in Stackedit and Live Editor [\#749](https://github.com/knsv/mermaid/pull/749) ([monsterkrampe](https://github.com/monsterkrampe))
-- Sequence numbers [\#722](https://github.com/knsv/mermaid/pull/722) ([paulbland](https://github.com/paulbland))
-- Add option for right angles [\#721](https://github.com/knsv/mermaid/pull/721) ([paulbland](https://github.com/paulbland))
-- Add nested activation classes [\#720](https://github.com/knsv/mermaid/pull/720) ([paulbland](https://github.com/paulbland))
-- wip: class diagram cardinality display [\#705](https://github.com/knsv/mermaid/pull/705) ([Vrixyz](https://github.com/Vrixyz))
-- add comments about CSS in config [\#688](https://github.com/knsv/mermaid/pull/688) ([imma90](https://github.com/imma90))
-- SequenceDiagram: Add support for multiple alt else statements [\#641](https://github.com/knsv/mermaid/pull/641) ([sechel](https://github.com/sechel))
-- fix \#426 - add class .clickable on nodes with click function or link [\#598](https://github.com/knsv/mermaid/pull/598) ([thomasleveil](https://github.com/thomasleveil))
-- Spec fix 1 [\#595](https://github.com/knsv/mermaid/pull/595) ([frankschmitt](https://github.com/frankschmitt))
-
-## [7.0.5](https://github.com/knsv/mermaid/tree/7.0.5) (2017-09-01)
-
-[Full Changelog](https://github.com/knsv/mermaid/compare/7.0.3...7.0.5)
-
-**Closed issues:**
-
-- live editor latin error after update [\#560](https://github.com/knsv/mermaid/issues/560)
-- Simple full example in online documentation is broken [\#558](https://github.com/knsv/mermaid/issues/558)
-- Graph No Arrow Head v7.0.3 [\#543](https://github.com/knsv/mermaid/issues/543)
-- Conflict while using mermaid along with core-js [\#512](https://github.com/knsv/mermaid/issues/512)
-- Export to pdf on website [\#496](https://github.com/knsv/mermaid/issues/496)
-- New downstream project: Mermaid Preview for VSCode [\#442](https://github.com/knsv/mermaid/issues/442)
-- Can't Zoom the flowchart ? [\#399](https://github.com/knsv/mermaid/issues/399)
-- line labels are not rendered correctly in live editor [\#366](https://github.com/knsv/mermaid/issues/366)
-- mermaid-loader [\#361](https://github.com/knsv/mermaid/issues/361)
-- Are there any documentation or examples for classDiagram and gitGraph? [\#359](https://github.com/knsv/mermaid/issues/359)
-- \# character broken in 0.5.8 [\#347](https://github.com/knsv/mermaid/issues/347)
-- Documentation issue: CSS example is not visible [\#345](https://github.com/knsv/mermaid/issues/345)
-- Include documentation for command line usage [\#326](https://github.com/knsv/mermaid/issues/326)
-- Fresh fork: can't build dist [\#296](https://github.com/knsv/mermaid/issues/296)
-- Invalid value for \ attribute viewBox="0 0 -Infinity -Infinity" [\#291](https://github.com/knsv/mermaid/issues/291)
-- Webpack require fails [\#277](https://github.com/knsv/mermaid/issues/277)
-- New documentation - need improved logo [\#216](https://github.com/knsv/mermaid/issues/216)
-
-## [7.0.3](https://github.com/knsv/mermaid/tree/7.0.3) (2017-06-04)
-
-[Full Changelog](https://github.com/knsv/mermaid/compare/7.0.2...7.0.3)
-
-**Closed issues:**
-
-- the documentation website is down [\#539](https://github.com/knsv/mermaid/issues/539)
-- Good example of interactivity with mermaidAPI [\#514](https://github.com/knsv/mermaid/issues/514)
-
-## [7.0.2](https://github.com/knsv/mermaid/tree/7.0.2) (2017-06-01)
-
-[Full Changelog](https://github.com/knsv/mermaid/compare/7.0.0...7.0.2)
-
-**Closed issues:**
-
-- CDN is not working [\#511](https://github.com/knsv/mermaid/issues/511)
-- A sampe sequenceDiagram crashes mermaid-cli [\#492](https://github.com/knsv/mermaid/issues/492)
-- Mermaid doesn't delete nodes when called multiple times [\#491](https://github.com/knsv/mermaid/issues/491)
-- API crashes on 2nd render\(\) call [\#478](https://github.com/knsv/mermaid/issues/478)
-- sequenceDiagram: dotted line for alt and empty bracket should be hidden [\#456](https://github.com/knsv/mermaid/issues/456)
-- SVG output \(almost\) not correct [\#434](https://github.com/knsv/mermaid/issues/434)
-- How to set axisFormatter of gantt in mermaid CLI? [\#428](https://github.com/knsv/mermaid/issues/428)
-- customizing link style with any color sets `fill` property to `black` instead of `none` [\#416](https://github.com/knsv/mermaid/issues/416)
-- New line at the end of SVG file [\#400](https://github.com/knsv/mermaid/issues/400)
-- CLI doesn't work [\#389](https://github.com/knsv/mermaid/issues/389)
-- Can't render subgraphs with htmlLabels: false [\#367](https://github.com/knsv/mermaid/issues/367)
-- Color arrowhead [\#362](https://github.com/knsv/mermaid/issues/362)
-- CLI: Invisible text, lines in SVG output [\#341](https://github.com/knsv/mermaid/issues/341)
-
-**Merged pull requests:**
-
-- Update Travis config [\#538](https://github.com/knsv/mermaid/pull/538) ([tylerlong](https://github.com/tylerlong))
-- Fix spelling of 'you' in sequenceDiagram docs [\#537](https://github.com/knsv/mermaid/pull/537) ([ctruelson](https://github.com/ctruelson))
-- Improve CLI output [\#536](https://github.com/knsv/mermaid/pull/536) ([gibson042](https://github.com/gibson042))
-- Modernize mermaid [\#524](https://github.com/knsv/mermaid/pull/524) ([tylerlong](https://github.com/tylerlong))
-- Modernize mermaid [\#519](https://github.com/knsv/mermaid/pull/519) ([tylerlong](https://github.com/tylerlong))
-- Update CLI instructions [\#509](https://github.com/knsv/mermaid/pull/509) ([filipedeschamps](https://github.com/filipedeschamps))
-- Add style for classDiagram to dark/default theme [\#503](https://github.com/knsv/mermaid/pull/503) ([yudenzel](https://github.com/yudenzel))
-- Fix documentation for git graph. [\#498](https://github.com/knsv/mermaid/pull/498) ([gomlgs](https://github.com/gomlgs))
-- Fix links in documentations [\#497](https://github.com/knsv/mermaid/pull/497) ([saveman71](https://github.com/saveman71))
-- Update README.md with git graph sample [\#481](https://github.com/knsv/mermaid/pull/481) ([raghur](https://github.com/raghur))
-- Fix misspelling of “another” [\#479](https://github.com/knsv/mermaid/pull/479) ([stevenschobert](https://github.com/stevenschobert))
-- Fixed \#456 sequenceDiagram: dotted line for alt and empty bracket sho… [\#477](https://github.com/knsv/mermaid/pull/477) ([brookhong](https://github.com/brookhong))
-- Add viewbox attr to class diagram [\#473](https://github.com/knsv/mermaid/pull/473) ([gnkm](https://github.com/gnkm))
-- add par statement to sequenceDiagram [\#470](https://github.com/knsv/mermaid/pull/470) ([u-minor](https://github.com/u-minor))
-
-## [7.0.0](https://github.com/knsv/mermaid/tree/7.0.0) (2017-01-29)
-
-[Full Changelog](https://github.com/knsv/mermaid/compare/6.0.0...7.0.0)
-
-**Closed issues:**
-
-- demos on io site not working [\#466](https://github.com/knsv/mermaid/issues/466)
-- Can not be generated PNG pictures through CLI with Chinese [\#451](https://github.com/knsv/mermaid/issues/451)
-- Round nodes cannot be styled with CSS classes [\#443](https://github.com/knsv/mermaid/issues/443)
-- webpack gulp UglifyJsPlugin error. [\#440](https://github.com/knsv/mermaid/issues/440)
-- String concatenation isn't working [\#432](https://github.com/knsv/mermaid/issues/432)
-- text flow/wrap in actor box of sequence diagram [\#422](https://github.com/knsv/mermaid/issues/422)
-- Online live editor still use old version [\#402](https://github.com/knsv/mermaid/issues/402)
-- uncaught TypeError: t.getTransformToElement is not a function [\#401](https://github.com/knsv/mermaid/issues/401)
-- Only works when using browserify'd code [\#373](https://github.com/knsv/mermaid/issues/373)
-- document the use of shebang line in mmd files [\#364](https://github.com/knsv/mermaid/issues/364)
-- Diagrams are small and unreadable in IE 11 - since 0.5.1 [\#356](https://github.com/knsv/mermaid/issues/356)
-- \[Feature Request\] ER-Diagram Support [\#354](https://github.com/knsv/mermaid/issues/354)
-- npm install -g mermaid does not install phantomjs [\#329](https://github.com/knsv/mermaid/issues/329)
-- activation boxes [\#313](https://github.com/knsv/mermaid/issues/313)
-- The need for mermaid.css should be mentioned explicitly in the intro docs... [\#273](https://github.com/knsv/mermaid/issues/273)
-
-**Merged pull requests:**
-
-- Update index.html [\#465](https://github.com/knsv/mermaid/pull/465) ([bmsleight](https://github.com/bmsleight))
-- Fix for \#416, customizing link style with any color sets `fill` property to `black` instead of `none` [\#452](https://github.com/knsv/mermaid/pull/452) ([joshuacolvin](https://github.com/joshuacolvin))
-- Allow .node\>circle to receive css styles [\#449](https://github.com/knsv/mermaid/pull/449) ([bfriedz](https://github.com/bfriedz))
-- Fix spelling [\#447](https://github.com/knsv/mermaid/pull/447) ([jawn](https://github.com/jawn))
-- added tests and fix cli css style selector lowercase problem [\#445](https://github.com/knsv/mermaid/pull/445) ([whyzdev](https://github.com/whyzdev))
-- Update d3.js [\#441](https://github.com/knsv/mermaid/pull/441) ([hetz](https://github.com/hetz))
-- adde tests to reproduce \#434 in flowchart [\#439](https://github.com/knsv/mermaid/pull/439) ([whyzdev](https://github.com/whyzdev))
-- Code Climate config [\#437](https://github.com/knsv/mermaid/pull/437) ([larkinscott](https://github.com/larkinscott))
-- fix gantt and sequence digram cli cfg [\#435](https://github.com/knsv/mermaid/pull/435) ([whyzdev](https://github.com/whyzdev))
-- fix gantt chart cli configuration broken [\#433](https://github.com/knsv/mermaid/pull/433) ([whyzdev](https://github.com/whyzdev))
-- fix gantt chart cli configuration parsing including functions [\#430](https://github.com/knsv/mermaid/pull/430) ([whyzdev](https://github.com/whyzdev))
-- Uses an empty text node instead of a string for svg group labels [\#429](https://github.com/knsv/mermaid/pull/429) ([daveaglick](https://github.com/daveaglick))
-- use tspan via d3.textwrap to place actor text in sequence diagram [\#427](https://github.com/knsv/mermaid/pull/427) ([whyzdev](https://github.com/whyzdev))
-- \#422 use foreignObject/div to place actor label in sequence diagram [\#423](https://github.com/knsv/mermaid/pull/423) ([whyzdev](https://github.com/whyzdev))
-- Clarify the need for a CSS stylesheet [\#413](https://github.com/knsv/mermaid/pull/413) ([sifb](https://github.com/sifb))
-- Added hads downstream project [\#412](https://github.com/knsv/mermaid/pull/412) ([sinedied](https://github.com/sinedied))
-- update usage and fix \#273 [\#406](https://github.com/knsv/mermaid/pull/406) ([jinntrance](https://github.com/jinntrance))
-- Add https://github.com/raghur/mermaid-filter to downstream projects docs page [\#404](https://github.com/knsv/mermaid/pull/404) ([raghur](https://github.com/raghur))
-- New neutral theme [\#395](https://github.com/knsv/mermaid/pull/395) ([sinedied](https://github.com/sinedied))
-- fix cli issues [\#390](https://github.com/knsv/mermaid/pull/390) ([ben-page](https://github.com/ben-page))
-- Add missing space for 'Labels out of bounds' section [\#386](https://github.com/knsv/mermaid/pull/386) ([The-Alchemist](https://github.com/The-Alchemist))
-- Fix typo: `pats` -\> `paths` [\#382](https://github.com/knsv/mermaid/pull/382) ([swhgoon](https://github.com/swhgoon))
-- Added class diagram example to README.md [\#379](https://github.com/knsv/mermaid/pull/379) ([HustLion](https://github.com/HustLion))
-- override normal flowchart arrowhead to allow css styling [\#376](https://github.com/knsv/mermaid/pull/376) ([dodoinblue](https://github.com/dodoinblue))
-- added sphinx extension [\#371](https://github.com/knsv/mermaid/pull/371) ([mgaitan](https://github.com/mgaitan))
-- Fix typo in the sequence diagram documentation [\#369](https://github.com/knsv/mermaid/pull/369) ([ggpasqualino](https://github.com/ggpasqualino))
-
-## [6.0.0](https://github.com/knsv/mermaid/tree/6.0.0) (2016-05-29)
-
-[Full Changelog](https://github.com/knsv/mermaid/compare/0.5.8...6.0.0)
-
-**Closed issues:**
-
-- Docs css: code hard to read [\#324](https://github.com/knsv/mermaid/issues/324)
-- About Markpad integration [\#323](https://github.com/knsv/mermaid/issues/323)
-- How to link backwards in flowchat? [\#321](https://github.com/knsv/mermaid/issues/321)
-- Help with editor [\#310](https://github.com/knsv/mermaid/issues/310)
-- +1 [\#293](https://github.com/knsv/mermaid/issues/293)
-- Basic chart does not render on Chome, but does in Firefox [\#290](https://github.com/knsv/mermaid/issues/290)
-- Live editor is broken [\#285](https://github.com/knsv/mermaid/issues/285)
-- "No such file or directory" trying to run mermaid 0.5.7 on OS X [\#284](https://github.com/knsv/mermaid/issues/284)
-- participant name as "Long Long Name" [\#283](https://github.com/knsv/mermaid/issues/283)
-- Windows - cli - could not find phantomjs at the specified path [\#236](https://github.com/knsv/mermaid/issues/236)
-
-**Merged pull requests:**
-
-- The option of gantt for the spaces for the section names. [\#353](https://github.com/knsv/mermaid/pull/353) ([zeroyonichihachi](https://github.com/zeroyonichihachi))
-- Gitgraph: Make reset work with parent ref carets [\#350](https://github.com/knsv/mermaid/pull/350) ([raghur](https://github.com/raghur))
-- Remove the text-shadows that make the text look blurry [\#349](https://github.com/knsv/mermaid/pull/349) ([AsaAyers](https://github.com/AsaAyers))
-- add line interpolation to linkStyle in flowchart [\#346](https://github.com/knsv/mermaid/pull/346) ([AlanHohn](https://github.com/AlanHohn))
-- Support git graph diagrams in mermaid [\#344](https://github.com/knsv/mermaid/pull/344) ([raghur](https://github.com/raghur))
-- Build and test execution changes [\#338](https://github.com/knsv/mermaid/pull/338) ([ssbarnea](https://github.com/ssbarnea))
-- Reformatting of css files [\#331](https://github.com/knsv/mermaid/pull/331) ([Jmuccigr](https://github.com/Jmuccigr))
-- \(WIP\) Sequence Diagram Title Support [\#320](https://github.com/knsv/mermaid/pull/320) ([bronsoja](https://github.com/bronsoja))
-- activations doc + few fixes [\#318](https://github.com/knsv/mermaid/pull/318) ([ciekawy](https://github.com/ciekawy))
-- Dark theme for better contrast on darker backgrounds [\#317](https://github.com/knsv/mermaid/pull/317) ([crodriguez1a](https://github.com/crodriguez1a))
-- Activations [\#316](https://github.com/knsv/mermaid/pull/316) ([ciekawy](https://github.com/ciekawy))
-- Support leading comments for sequenceDiagrams [\#312](https://github.com/knsv/mermaid/pull/312) ([ashsearle](https://github.com/ashsearle))
-- Show a little lenience for white-space around names [\#309](https://github.com/knsv/mermaid/pull/309) ([ashsearle](https://github.com/ashsearle))
-- Update list of downstream projects [\#307](https://github.com/knsv/mermaid/pull/307) ([maxArturo](https://github.com/maxArturo))
-- Issue 299: Sequence diagram Loops: changing boxMargin spoils the "loop" notation [\#300](https://github.com/knsv/mermaid/pull/300) ([LarryKlugerDS](https://github.com/LarryKlugerDS))
-- Issue 297 - src/mermaid.js generates bad code [\#298](https://github.com/knsv/mermaid/pull/298) ([LarryKlugerDS](https://github.com/LarryKlugerDS))
-- Updated instructions for running tests [\#295](https://github.com/knsv/mermaid/pull/295) ([LarryKlugerDS](https://github.com/LarryKlugerDS))
-- Add Markdown Plus to Downstream projects [\#288](https://github.com/knsv/mermaid/pull/288) ([tylerlong](https://github.com/tylerlong))
-- Quote phantomPath so that it doesn't fail on window [\#286](https://github.com/knsv/mermaid/pull/286) ([raghur](https://github.com/raghur))
-
-## [0.5.8](https://github.com/knsv/mermaid/tree/0.5.8) (2016-01-27)
-
-[Full Changelog](https://github.com/knsv/mermaid/compare/0.5.7...0.5.8)
-
-## [0.5.7](https://github.com/knsv/mermaid/tree/0.5.7) (2016-01-25)
-
-[Full Changelog](https://github.com/knsv/mermaid/compare/0.5.6...0.5.7)
-
-**Closed issues:**
-
-- Mermaid + LightPaper = ❤️ [\#280](https://github.com/knsv/mermaid/issues/280)
-- Bower Integration [\#278](https://github.com/knsv/mermaid/issues/278)
-- Mermaid breaks when variables end in 'v' [\#276](https://github.com/knsv/mermaid/issues/276)
-- sequence diagrams don't support participant aliasing [\#263](https://github.com/knsv/mermaid/issues/263)
-- One diagram that fails to render stops further execution on the page [\#259](https://github.com/knsv/mermaid/issues/259)
-- Where to find line layout algorithm? [\#258](https://github.com/knsv/mermaid/issues/258)
-- Compatibility with node.js [\#257](https://github.com/knsv/mermaid/issues/257)
-- Label resizing with dynamically loaded fonts [\#255](https://github.com/knsv/mermaid/issues/255)
-- SVG arrowheads are broken in the CLI [\#249](https://github.com/knsv/mermaid/issues/249)
-- Cannot read property 'replace' of undefined [\#239](https://github.com/knsv/mermaid/issues/239)
-
-**Merged pull requests:**
-
-- gh-50 Allow styling of edge labels in css [\#267](https://github.com/knsv/mermaid/pull/267) ([Anoia](https://github.com/Anoia))
-- Allow sequenceDiagram participant aliasing [\#265](https://github.com/knsv/mermaid/pull/265) ([gibson042](https://github.com/gibson042))
-
-## [0.5.6](https://github.com/knsv/mermaid/tree/0.5.6) (2015-11-22)
-
-[Full Changelog](https://github.com/knsv/mermaid/compare/0.5.5...0.5.6)
-
-**Closed issues:**
-
-- title doesn't work in sequenceDiagram [\#248](https://github.com/knsv/mermaid/issues/248)
-- hypen-minus should be valid in sequence diagram alt/else/etc. descriptions [\#247](https://github.com/knsv/mermaid/issues/247)
-- Broken in firefox? [\#245](https://github.com/knsv/mermaid/issues/245)
-- When there is a Chinese symbol in the flowchart, it will crash。 [\#238](https://github.com/knsv/mermaid/issues/238)
-- Non-alpha characters included in ALPHA token \(flow graph jison\) [\#232](https://github.com/knsv/mermaid/issues/232)
-- subgraph not rendering with change to sample [\#231](https://github.com/knsv/mermaid/issues/231)
-- sequence diagram requires a new line at the end? [\#229](https://github.com/knsv/mermaid/issues/229)
-- Live Editor: Permalink address not being parsed [\#202](https://github.com/knsv/mermaid/issues/202)
-- Add download SVG link to the live editor [\#144](https://github.com/knsv/mermaid/issues/144)
-
-**Merged pull requests:**
-
-- Make sequenceDiagram terminal newline optional [\#253](https://github.com/knsv/mermaid/pull/253) ([gibson042](https://github.com/gibson042))
-- Support sequenceDiagram "over" notes [\#252](https://github.com/knsv/mermaid/pull/252) ([gibson042](https://github.com/gibson042))
-- Properly handle "rest of line" statements [\#251](https://github.com/knsv/mermaid/pull/251) ([gibson042](https://github.com/gibson042))
-- CLI: Propagate exit code from lib \(i.e., phantomjs\) [\#250](https://github.com/knsv/mermaid/pull/250) ([gibson042](https://github.com/gibson042))
-- flowRender.js - Fix FontAwesome icon insert [\#244](https://github.com/knsv/mermaid/pull/244) ([ma-zal](https://github.com/ma-zal))
-- updated sequence diagram link in live editor [\#242](https://github.com/knsv/mermaid/pull/242) ([r-a-v-a-s](https://github.com/r-a-v-a-s))
-- updated links in README.md [\#240](https://github.com/knsv/mermaid/pull/240) ([r-a-v-a-s](https://github.com/r-a-v-a-s))
-- Ellipse syntax [\#237](https://github.com/knsv/mermaid/pull/237) ([spect88](https://github.com/spect88))
-- Allow keywords as suffixes of node ids [\#235](https://github.com/knsv/mermaid/pull/235) ([spect88](https://github.com/spect88))
-- Highlighted the editor in the nav [\#234](https://github.com/knsv/mermaid/pull/234) ([knsv](https://github.com/knsv))
-- Live editor tweaks [\#233](https://github.com/knsv/mermaid/pull/233) ([spect88](https://github.com/spect88))
-- Add a Gitter chat badge to README.md [\#230](https://github.com/knsv/mermaid/pull/230) ([gitter-badger](https://github.com/gitter-badger))
-
-## [0.5.5](https://github.com/knsv/mermaid/tree/0.5.5) (2015-10-21)
-
-[Full Changelog](https://github.com/knsv/mermaid/compare/0.5.4...0.5.5)
-
-**Closed issues:**
-
-- sequence diagram, arrowhead instead of crosshead [\#227](https://github.com/knsv/mermaid/issues/227)
-
-**Merged pull requests:**
-
-- Fix a typo: crosshead --\> arrowhead [\#228](https://github.com/knsv/mermaid/pull/228) ([tylerlong](https://github.com/tylerlong))
-
-## [0.5.4](https://github.com/knsv/mermaid/tree/0.5.4) (2015-10-19)
-
-[Full Changelog](https://github.com/knsv/mermaid/compare/0.5.3...0.5.4)
-
-**Closed issues:**
-
-- Weird bug in live editor when using words with substring `end` [\#184](https://github.com/knsv/mermaid/issues/184)
-- Custom icons [\#15](https://github.com/knsv/mermaid/issues/15)
-- Marker-end arrow cannot be shown for URL with query parameter [\#225](https://github.com/knsv/mermaid/issues/225)
-- Please update bower's D3 version [\#221](https://github.com/knsv/mermaid/issues/221)
-- Set log level from mermaid configuration [\#220](https://github.com/knsv/mermaid/issues/220)
-- Width fixed to 400px [\#204](https://github.com/knsv/mermaid/issues/204)
-- render to png from the cli does not display the marker-end arrow heads [\#181](https://github.com/knsv/mermaid/issues/181)
-- Links in sequence diagrams [\#159](https://github.com/knsv/mermaid/issues/159)
-- comment characters `%%` cause parse error [\#141](https://github.com/knsv/mermaid/issues/141)
-- Add a reversed asymmetric shape [\#124](https://github.com/knsv/mermaid/issues/124)
-- Add syntax for double headed arrows [\#123](https://github.com/knsv/mermaid/issues/123)
-- Support for font-awesome [\#49](https://github.com/knsv/mermaid/issues/49)
-
-**Merged pull requests:**
-
-- Allow `end` as a substring of vertex id [\#224](https://github.com/knsv/mermaid/pull/224) ([spect88](https://github.com/spect88))
-- Remove duplicate npm dependencies: d3 and he [\#223](https://github.com/knsv/mermaid/pull/223) ([spect88](https://github.com/spect88))
-
-## [0.5.3](https://github.com/knsv/mermaid/tree/0.5.3) (2015-10-04)
-
-[Full Changelog](https://github.com/knsv/mermaid/compare/0.5.2...0.5.3)
-
-## [0.5.2](https://github.com/knsv/mermaid/tree/0.5.2) (2015-10-04)
-
-[Full Changelog](https://github.com/knsv/mermaid/compare/0.5.1...0.5.2)
-
-**Closed issues:**
-
-- Installing “atom-mermaid@0.1.3” failed [\#218](https://github.com/knsv/mermaid/issues/218)
-- Render mermaid code on websites? [\#215](https://github.com/knsv/mermaid/issues/215)
-- Brackets in a node with text? [\#213](https://github.com/knsv/mermaid/issues/213)
-- node feature request [\#211](https://github.com/knsv/mermaid/issues/211)
-- Please add prefix for styles [\#208](https://github.com/knsv/mermaid/issues/208)
-- Bad handling of block arguments [\#207](https://github.com/knsv/mermaid/issues/207)
-- please consider port to mac osx [\#203](https://github.com/knsv/mermaid/issues/203)
-- allow phantomjs \>=1.9.x [\#201](https://github.com/knsv/mermaid/issues/201)
-- syntax for venn diagrams? [\#200](https://github.com/knsv/mermaid/issues/200)
-- Broken CLI Graphs? \(v0.5.1\) [\#196](https://github.com/knsv/mermaid/issues/196)
-- Static site does not render under HTTPS [\#194](https://github.com/knsv/mermaid/issues/194)
-- Error on simple graph [\#192](https://github.com/knsv/mermaid/issues/192)
-- Escape "~" [\#191](https://github.com/knsv/mermaid/issues/191)
-- Trying to add link using 'click' to flowchart [\#188](https://github.com/knsv/mermaid/issues/188)
-- cli: no lines and arrowheads rendered / only dotted lines [\#187](https://github.com/knsv/mermaid/issues/187)
-- text of mermaid div displayed on page [\#186](https://github.com/knsv/mermaid/issues/186)
-- using mermaid with laravel [\#185](https://github.com/knsv/mermaid/issues/185)
-- Atom editor package [\#183](https://github.com/knsv/mermaid/issues/183)
-- Auto linewrap for notes in sequence diagrams [\#178](https://github.com/knsv/mermaid/issues/178)
-- Execute code after initialize [\#176](https://github.com/knsv/mermaid/issues/176)
-- Autoscaling for all diagram types [\#175](https://github.com/knsv/mermaid/issues/175)
-- Problem with click event callback [\#174](https://github.com/knsv/mermaid/issues/174)
-- How to escape characters? [\#170](https://github.com/knsv/mermaid/issues/170)
-- it can not work [\#167](https://github.com/knsv/mermaid/issues/167)
-- UML Class diagram [\#154](https://github.com/knsv/mermaid/issues/154)
-- Broken subgraph using the CLI [\#153](https://github.com/knsv/mermaid/issues/153)
-- Support PlantUML syntax [\#149](https://github.com/knsv/mermaid/issues/149)
-- IE Support issue [\#142](https://github.com/knsv/mermaid/issues/142)
-- Flowchart truncated [\#140](https://github.com/knsv/mermaid/issues/140)
-- Double Quote as text is not working [\#219](https://github.com/knsv/mermaid/issues/219)
-- classDef / class not working with htmlLabels? [\#210](https://github.com/knsv/mermaid/issues/210)
-- Links in graph missing [\#209](https://github.com/knsv/mermaid/issues/209)
-- Last word in comment boxes getting cut off by word wrap library : \( [\#195](https://github.com/knsv/mermaid/issues/195)
-- Escaping characters in sequence diagram [\#193](https://github.com/knsv/mermaid/issues/193)
-- SVG foreignObject rendering [\#180](https://github.com/knsv/mermaid/issues/180)
-- IE9 issue [\#179](https://github.com/knsv/mermaid/issues/179)
-- inoperable in an AMD/requirejs environment: IPython Notebook [\#127](https://github.com/knsv/mermaid/issues/127)
-- \[Parser\] Hyphen in participant name bring TypeError [\#74](https://github.com/knsv/mermaid/issues/74)
-- Support for hyperlink and tooltip [\#34](https://github.com/knsv/mermaid/issues/34)
-
-**Merged pull requests:**
-
-- Update flowchart.md [\#214](https://github.com/knsv/mermaid/pull/214) ([orschiro](https://github.com/orschiro))
-- Default style when using the CLI [\#205](https://github.com/knsv/mermaid/pull/205) ([gillesdemey](https://github.com/gillesdemey))
-- Gantt chart - add minutes and seconds durations [\#198](https://github.com/knsv/mermaid/pull/198) ([dbrans](https://github.com/dbrans))
-- Using QUnit for AMD testing [\#190](https://github.com/knsv/mermaid/pull/190) ([bollwyvl](https://github.com/bollwyvl))
-- Update phantomscript.js [\#182](https://github.com/knsv/mermaid/pull/182) ([phairow](https://github.com/phairow))
-
-## [0.5.1](https://github.com/knsv/mermaid/tree/0.5.1) (2015-06-21)
-
-[Full Changelog](https://github.com/knsv/mermaid/compare/0.5.0...0.5.1)
-
-**Closed issues:**
-
-- Live editor is broken [\#173](https://github.com/knsv/mermaid/issues/173)
-- 0.5.0 no longer respects custom date definitions in Gantt diagrams [\#171](https://github.com/knsv/mermaid/issues/171)
-- Drop label character restrictions [\#162](https://github.com/knsv/mermaid/issues/162)
-- can't nest subgraphs in flowchart [\#161](https://github.com/knsv/mermaid/issues/161)
-- Unable to generate gantt diagram with mermaid CLI [\#158](https://github.com/knsv/mermaid/issues/158)
-- Inline css by "mermaid" [\#157](https://github.com/knsv/mermaid/issues/157)
-- Finite State Machine Diagram [\#152](https://github.com/knsv/mermaid/issues/152)
-- How to center align gantt diagram [\#150](https://github.com/knsv/mermaid/issues/150)
-- Security concern regarding class definition [\#148](https://github.com/knsv/mermaid/issues/148)
-- File Extension [\#147](https://github.com/knsv/mermaid/issues/147)
-- To SVG Export [\#146](https://github.com/knsv/mermaid/issues/146)
-- `setTimeout` with clusters problematic with programmatic edits and no callback [\#133](https://github.com/knsv/mermaid/issues/133)
-- Possibility to set the width of the generated flowchart [\#129](https://github.com/knsv/mermaid/issues/129)
-- flowchart - styling of edges via css overrides specific styles set in the graph definition [\#128](https://github.com/knsv/mermaid/issues/128)
-- module.exports.cloneCssStyles\(\) in combination with Angularjs breaks display in Chrome and IE [\#126](https://github.com/knsv/mermaid/issues/126)
-- Gantt - suitable xAxis for longer project [\#125](https://github.com/knsv/mermaid/issues/125)
-- Mix horizontal and vertical graph [\#68](https://github.com/knsv/mermaid/issues/68)
-- How to get started with this project ? [\#64](https://github.com/knsv/mermaid/issues/64)
-- Special characters break parsing [\#54](https://github.com/knsv/mermaid/issues/54)
-- Responsive graph layout for mobile viewers [\#51](https://github.com/knsv/mermaid/issues/51)
-- Styling connector lines [\#31](https://github.com/knsv/mermaid/issues/31)
-
-**Merged pull requests:**
-
-- Remove moot `version` property from bower.json [\#172](https://github.com/knsv/mermaid/pull/172) ([kkirsche](https://github.com/kkirsche))
-
-## [0.5.0](https://github.com/knsv/mermaid/tree/0.5.0) (2015-06-07)
-
-[Full Changelog](https://github.com/knsv/mermaid/compare/0.4.0...0.5.0)
-
-**Closed issues:**
-
-- it can not work where graph TD contains chinese character [\#166](https://github.com/knsv/mermaid/issues/166)
-- Broken Examples [\#163](https://github.com/knsv/mermaid/issues/163)
-- uglifyjs wanrings which means we can improve the code [\#156](https://github.com/knsv/mermaid/issues/156)
-- New\(er\) features unavailable in downloadable js files? [\#151](https://github.com/knsv/mermaid/issues/151)
-- Add gh-gapes link to description [\#143](https://github.com/knsv/mermaid/issues/143)
-- Some examples not displayed on Firefox 36.0.1 [\#138](https://github.com/knsv/mermaid/issues/138)
-- tags ending in a "v" don't render [\#132](https://github.com/knsv/mermaid/issues/132)
-- Links in flowchart [\#131](https://github.com/knsv/mermaid/issues/131)
-- Using the library for iOS development [\#130](https://github.com/knsv/mermaid/issues/130)
-- Add a css file, mermaid.css, with default styling [\#122](https://github.com/knsv/mermaid/issues/122)
-- Add capability for gantt diagrams [\#118](https://github.com/knsv/mermaid/issues/118)
-- lower case v causes error in the parser [\#108](https://github.com/knsv/mermaid/issues/108)
-- Label's css conflict with boostrap's .label [\#67](https://github.com/knsv/mermaid/issues/67)
-- TypeError: Cannot read property 'layout' of undefined [\#37](https://github.com/knsv/mermaid/issues/37)
-- software architecture diagram [\#36](https://github.com/knsv/mermaid/issues/36)
-- Support for bar charts and pie diagrams [\#22](https://github.com/knsv/mermaid/issues/22)
-
-**Merged pull requests:**
-
-- Dev 0.5.0 [\#168](https://github.com/knsv/mermaid/pull/168) ([knsv](https://github.com/knsv))
-- Fix spacing [\#164](https://github.com/knsv/mermaid/pull/164) ([rhcarvalho](https://github.com/rhcarvalho))
-- Fixing typo: "Think" -\> "Thick" [\#160](https://github.com/knsv/mermaid/pull/160) ([it0a](https://github.com/it0a))
-- IE, local html, cssRules access is denied [\#155](https://github.com/knsv/mermaid/pull/155) ([tylerlong](https://github.com/tylerlong))
-- Add automatically generated change log file. [\#139](https://github.com/knsv/mermaid/pull/139) ([skywinder](https://github.com/skywinder))
-- Adding init argument to the global API [\#137](https://github.com/knsv/mermaid/pull/137) ([bollwyvl](https://github.com/bollwyvl))
-- Add description of manual calling of init [\#136](https://github.com/knsv/mermaid/pull/136) ([bollwyvl](https://github.com/bollwyvl))
-- Allow other forms of node selection for init\(\) [\#135](https://github.com/knsv/mermaid/pull/135) ([bollwyvl](https://github.com/bollwyvl))
-- Use a library-level variable for assigning ids [\#134](https://github.com/knsv/mermaid/pull/134) ([bollwyvl](https://github.com/bollwyvl))
-
-## [0.4.0](https://github.com/knsv/mermaid/tree/0.4.0) (2015-03-01)
-
-[Full Changelog](https://github.com/knsv/mermaid/compare/0.3.5...0.4.0)
-
-**Closed issues:**
-
-- subgraph background is black in rendered flowchart PNG via CLI [\#121](https://github.com/knsv/mermaid/issues/121)
-- Integrate editor at https://github.com/naseer/mermaid-webapp [\#110](https://github.com/knsv/mermaid/issues/110)
-- Internet Explorer Support [\#99](https://github.com/knsv/mermaid/issues/99)
-- Asymmetric shapes not documented [\#82](https://github.com/knsv/mermaid/issues/82)
-- NoModificationAllowedError [\#23](https://github.com/knsv/mermaid/issues/23)
-- Improve arrows [\#3](https://github.com/knsv/mermaid/issues/3)
-
-## [0.3.5](https://github.com/knsv/mermaid/tree/0.3.5) (2015-02-15)
-
-[Full Changelog](https://github.com/knsv/mermaid/compare/0.3.4...0.3.5)
-
-## [0.3.4](https://github.com/knsv/mermaid/tree/0.3.4) (2015-02-15)
-
-[Full Changelog](https://github.com/knsv/mermaid/compare/0.3.3...0.3.4)
-
-**Closed issues:**
-
-- Subgraph syntax bug? [\#120](https://github.com/knsv/mermaid/issues/120)
-- Live editor [\#115](https://github.com/knsv/mermaid/issues/115)
-- Error in "Basic Syntax" wiki page [\#113](https://github.com/knsv/mermaid/issues/113)
-- semicolons, anyone? [\#111](https://github.com/knsv/mermaid/issues/111)
-- undefined `sequenceConfig` fails [\#109](https://github.com/knsv/mermaid/issues/109)
-- Sequence Diagrams: Show Actors below as well [\#106](https://github.com/knsv/mermaid/issues/106)
-- Allow overriding sequence diagram configuration \(SVG properties\) [\#103](https://github.com/knsv/mermaid/issues/103)
-- Error when rendering A-- This is the text -- B [\#102](https://github.com/knsv/mermaid/issues/102)
-- Clipping in documentation [\#97](https://github.com/knsv/mermaid/issues/97)
-- isolate class styling to the svg container [\#92](https://github.com/knsv/mermaid/issues/92)
-- Apply styling from css when using the CLI utility [\#85](https://github.com/knsv/mermaid/issues/85)
-- Generated SVG works poorly outside web browsers [\#58](https://github.com/knsv/mermaid/issues/58)
-- Make the new graph declaration more visual [\#40](https://github.com/knsv/mermaid/issues/40)
-- Generating SVG text blob for use in Node [\#2](https://github.com/knsv/mermaid/issues/2)
-
-**Merged pull requests:**
-
-- Add live editor [\#119](https://github.com/knsv/mermaid/pull/119) ([naseer](https://github.com/naseer))
-- Adds CSS option to the CLI [\#116](https://github.com/knsv/mermaid/pull/116) ([fardog](https://github.com/fardog))
-- Update flowchart.md in response Issue \#113 [\#114](https://github.com/knsv/mermaid/pull/114) ([vijay40](https://github.com/vijay40))
-- Ignore all files except the license and dist/ folder when installing with Bower. [\#112](https://github.com/knsv/mermaid/pull/112) ([jasonbellamy](https://github.com/jasonbellamy))
-
-## [0.3.3](https://github.com/knsv/mermaid/tree/0.3.3) (2015-01-25)
-
-[Full Changelog](https://github.com/knsv/mermaid/compare/0.3.2...0.3.3)
-
-**Closed issues:**
-
-- Missing arrows in sequence diagram [\#98](https://github.com/knsv/mermaid/issues/98)
-- Error with \>9 linkStyles [\#95](https://github.com/knsv/mermaid/issues/95)
-- Support for dotted links [\#26](https://github.com/knsv/mermaid/issues/26)
-
-**Merged pull requests:**
-
-- Require d3 directly to better support Node usage [\#107](https://github.com/knsv/mermaid/pull/107) ([markdalgleish](https://github.com/markdalgleish))
-- update doc with -c option [\#105](https://github.com/knsv/mermaid/pull/105) ([jjmr](https://github.com/jjmr))
-- Add new parameter to the console client to override the svg configuration in sequence diagrams [\#104](https://github.com/knsv/mermaid/pull/104) ([jjmr](https://github.com/jjmr))
-- Text based labels, new shape [\#101](https://github.com/knsv/mermaid/pull/101) ([bjowes](https://github.com/bjowes))
-- fix html tags in example usage [\#100](https://github.com/knsv/mermaid/pull/100) ([deiwin](https://github.com/deiwin))
-
-## [0.3.2](https://github.com/knsv/mermaid/tree/0.3.2) (2015-01-11)
-
-[Full Changelog](https://github.com/knsv/mermaid/compare/0.3.1...0.3.2)
-
-**Closed issues:**
-
-- disable auto render [\#91](https://github.com/knsv/mermaid/issues/91)
-- Tidy breaks mermaid \(linebreaks in \\) [\#87](https://github.com/knsv/mermaid/issues/87)
-- Bug: \ being rendered as text in node [\#73](https://github.com/knsv/mermaid/issues/73)
-- Graph edges appear to render outside of the canvas [\#70](https://github.com/knsv/mermaid/issues/70)
-- Make link text look like it is on the line [\#53](https://github.com/knsv/mermaid/issues/53)
-
-**Merged pull requests:**
-
-- Merge pull request \#1 from knsv/master [\#96](https://github.com/knsv/mermaid/pull/96) ([gkchic](https://github.com/gkchic))
-- Removed duplicated section in flowchart docs [\#94](https://github.com/knsv/mermaid/pull/94) ([kaime](https://github.com/kaime))
-- Grammar changes to sequence page [\#93](https://github.com/knsv/mermaid/pull/93) ([gkchic](https://github.com/gkchic))
-- GitHub buttons [\#89](https://github.com/knsv/mermaid/pull/89) ([gkchic](https://github.com/gkchic))
-- Template change [\#88](https://github.com/knsv/mermaid/pull/88) ([gkchic](https://github.com/gkchic))
-
-## [0.3.1](https://github.com/knsv/mermaid/tree/0.3.1) (2015-01-05)
-
-[Full Changelog](https://github.com/knsv/mermaid/compare/0.3.0...0.3.1)
-
-**Closed issues:**
-
-- Non ASCII chars in labels [\#84](https://github.com/knsv/mermaid/issues/84)
-- 'undefined' titles of Quicklinks on the usage page [\#80](https://github.com/knsv/mermaid/issues/80)
-- \[cli\] Enhancement proposal: not fail --version / --help if phantomjs isn't installed [\#71](https://github.com/knsv/mermaid/issues/71)
-- Neural Networks [\#39](https://github.com/knsv/mermaid/issues/39)
-- Support for sequence diagrams [\#16](https://github.com/knsv/mermaid/issues/16)
-- Client utility for mermaid [\#6](https://github.com/knsv/mermaid/issues/6)
-
-**Merged pull requests:**
-
-- Flowchart doc: Text in the circle now in a circle [\#81](https://github.com/knsv/mermaid/pull/81) ([Grahack](https://github.com/Grahack))
-- Fix for issue \#73 [\#79](https://github.com/knsv/mermaid/pull/79) ([it0a](https://github.com/it0a))
-- Ink template [\#78](https://github.com/knsv/mermaid/pull/78) ([gkchic](https://github.com/gkchic))
-- Show help and version even if phantom isn't present. Fixes \#71 [\#75](https://github.com/knsv/mermaid/pull/75) ([fardog](https://github.com/fardog))
-- Add apostrophe & 'and' [\#72](https://github.com/knsv/mermaid/pull/72) ([sudodoki](https://github.com/sudodoki))
-
-## [0.3.0](https://github.com/knsv/mermaid/tree/0.3.0) (2014-12-22)
-
-[Full Changelog](https://github.com/knsv/mermaid/compare/0.2.16...0.3.0)
-
-**Closed issues:**
-
-- Consider shipping a standalone executable [\#65](https://github.com/knsv/mermaid/issues/65)
-- Trailing whitespace at the end of lines is not ignored [\#55](https://github.com/knsv/mermaid/issues/55)
-- How do I do comments? [\#47](https://github.com/knsv/mermaid/issues/47)
-- This characters failed the lexical parsing [\#46](https://github.com/knsv/mermaid/issues/46)
-- tutorial for creating new type of graph/layout [\#44](https://github.com/knsv/mermaid/issues/44)
-- Improve readability with new line as terminator and whitespace [\#38](https://github.com/knsv/mermaid/issues/38)
-- Use classes instead of inline style for easy styling [\#24](https://github.com/knsv/mermaid/issues/24)
-
-**Merged pull requests:**
-
-- Adds Command Line Interface for generating PNGs from mermaid description files [\#69](https://github.com/knsv/mermaid/pull/69) ([fardog](https://github.com/fardog))
-- Allow special symbols for direction along with acronyms [\#66](https://github.com/knsv/mermaid/pull/66) ([vijay40](https://github.com/vijay40))
-
-## [0.2.16](https://github.com/knsv/mermaid/tree/0.2.16) (2014-12-15)
-
-[Full Changelog](https://github.com/knsv/mermaid/compare/0.2.15...0.2.16)
-
-**Closed issues:**
-
-- Mermaid not rendering properly on Wordpress pages [\#59](https://github.com/knsv/mermaid/issues/59)
-- Improve example page with live demo [\#52](https://github.com/knsv/mermaid/issues/52)
-- Create image file via CLI? [\#48](https://github.com/knsv/mermaid/issues/48)
-- Does not render upon AngularJS Updates [\#45](https://github.com/knsv/mermaid/issues/45)
-- Download link in README.MD doesn't work. [\#42](https://github.com/knsv/mermaid/issues/42)
-- linkStyle usage is not obvious [\#41](https://github.com/knsv/mermaid/issues/41)
-- Move \*.spec.js in src/ to test/ [\#35](https://github.com/knsv/mermaid/issues/35)
-- Lines routed outside visible area [\#19](https://github.com/knsv/mermaid/issues/19)
-
-**Merged pull requests:**
-
-- New grammar will allow statements ending without semicolon as disccused in Issue \#38 [\#63](https://github.com/knsv/mermaid/pull/63) ([vijay40](https://github.com/vijay40))
-- Class based styling [\#62](https://github.com/knsv/mermaid/pull/62) ([bjowes](https://github.com/bjowes))
-- Fix typos [\#60](https://github.com/knsv/mermaid/pull/60) ([sublimino](https://github.com/sublimino))
-- Included .DS_Store in gitignore [\#57](https://github.com/knsv/mermaid/pull/57) ([alvynmcq](https://github.com/alvynmcq))
-- Improves readablity discussed in issue \#38 [\#56](https://github.com/knsv/mermaid/pull/56) ([vijay40](https://github.com/vijay40))
-- Added a linting task for gulp [\#43](https://github.com/knsv/mermaid/pull/43) ([serv](https://github.com/serv))
-
-## [0.2.15](https://github.com/knsv/mermaid/tree/0.2.15) (2014-12-05)
-
-[Full Changelog](https://github.com/knsv/mermaid/compare/0.2.14...0.2.15)
-
-**Closed issues:**
-
-- Question marks don't render properly with /dist/mermaid.full.min.js [\#30](https://github.com/knsv/mermaid/issues/30)
-- Error with some characters [\#25](https://github.com/knsv/mermaid/issues/25)
-- Provide parse function in browser without `require`? [\#21](https://github.com/knsv/mermaid/issues/21)
-- Better label text support [\#18](https://github.com/knsv/mermaid/issues/18)
-- Cap-cased words break parser [\#8](https://github.com/knsv/mermaid/issues/8)
-
-**Merged pull requests:**
-
-- Include bower_components/ to .gitignore [\#33](https://github.com/knsv/mermaid/pull/33) ([serv](https://github.com/serv))
-- Fixed reference to Git repo. [\#32](https://github.com/knsv/mermaid/pull/32) ([guyellis](https://github.com/guyellis))
-
-## [0.2.14](https://github.com/knsv/mermaid/tree/0.2.14) (2014-12-03)
-
-[Full Changelog](https://github.com/knsv/mermaid/compare/0.2.13...0.2.14)
-
-## [0.2.13](https://github.com/knsv/mermaid/tree/0.2.13) (2014-12-03)
-
-[Full Changelog](https://github.com/knsv/mermaid/compare/0.2.10...0.2.13)
-
-**Closed issues:**
-
-- modified init to be applied more than once [\#29](https://github.com/knsv/mermaid/issues/29)
-- Wanted to know build process for the project. [\#28](https://github.com/knsv/mermaid/issues/28)
-- Container support [\#27](https://github.com/knsv/mermaid/issues/27)
-- can not support Chinese description [\#20](https://github.com/knsv/mermaid/issues/20)
-- Node Label text mistaken for Direction [\#17](https://github.com/knsv/mermaid/issues/17)
-- Support unicode chars in labels [\#9](https://github.com/knsv/mermaid/issues/9)
-- Publish to NPM [\#7](https://github.com/knsv/mermaid/issues/7)
-
-## [0.2.10](https://github.com/knsv/mermaid/tree/0.2.10) (2014-12-01)
-
-[Full Changelog](https://github.com/knsv/mermaid/compare/0.2.9...0.2.10)
-
-## [0.2.9](https://github.com/knsv/mermaid/tree/0.2.9) (2014-12-01)
-
-[Full Changelog](https://github.com/knsv/mermaid/compare/0.2.8...0.2.9)
-
-**Closed issues:**
-
-- Add link to jsbin playground to README [\#11](https://github.com/knsv/mermaid/issues/11)
-- What are the requirements ? [\#10](https://github.com/knsv/mermaid/issues/10)
-
-**Merged pull requests:**
-
-- Allow unicode chars in labels [\#13](https://github.com/knsv/mermaid/pull/13) ([codebeige](https://github.com/codebeige))
-
-## [0.2.8](https://github.com/knsv/mermaid/tree/0.2.8) (2014-12-01)
-
-[Full Changelog](https://github.com/knsv/mermaid/compare/0.2.7...0.2.8)
-
-## [0.2.7](https://github.com/knsv/mermaid/tree/0.2.7) (2014-12-01)
-
-[Full Changelog](https://github.com/knsv/mermaid/compare/0.2.6...0.2.7)
-
-**Closed issues:**
-
-- Provide parser as separate module [\#4](https://github.com/knsv/mermaid/issues/4)
-
-## [0.2.6](https://github.com/knsv/mermaid/tree/0.2.6) (2014-11-27)
-
-[Full Changelog](https://github.com/knsv/mermaid/compare/0.2.5...0.2.6)
-
-## [0.2.5](https://github.com/knsv/mermaid/tree/0.2.5) (2014-11-27)
-
-[Full Changelog](https://github.com/knsv/mermaid/compare/0.2.4...0.2.5)
-
-**Merged pull requests:**
-
-- Added new shapes! [\#1](https://github.com/knsv/mermaid/pull/1) ([bjowes](https://github.com/bjowes))
-
-## [0.2.4](https://github.com/knsv/mermaid/tree/0.2.4) (2014-11-25)
-
-[Full Changelog](https://github.com/knsv/mermaid/compare/0.2.3...0.2.4)
-
-## [0.2.3](https://github.com/knsv/mermaid/tree/0.2.3) (2014-11-24)
-
-[Full Changelog](https://github.com/knsv/mermaid/compare/0.2.2...0.2.3)
-
-## [0.2.2](https://github.com/knsv/mermaid/tree/0.2.2) (2014-11-22)
-
-[Full Changelog](https://github.com/knsv/mermaid/compare/0.2.1...0.2.2)
-
-## [0.2.1](https://github.com/knsv/mermaid/tree/0.2.1) (2014-11-22)
-
-[Full Changelog](https://github.com/knsv/mermaid/compare/0.2.0...0.2.1)
-
-## [0.2.0](https://github.com/knsv/mermaid/tree/0.2.0) (2014-11-22)
-
-[Full Changelog](https://github.com/knsv/mermaid/compare/0.1.1...0.2.0)
-
-## [0.1.1](https://github.com/knsv/mermaid/tree/0.1.1) (2014-11-17)
-
-[Full Changelog](https://github.com/knsv/mermaid/compare/0.1.0...0.1.1)
-
-## [0.1.0](https://github.com/knsv/mermaid/tree/0.1.0) (2014-11-16)
-
-\* _This Change Log was automatically generated by [github_changelog_generator](https://github.com/skywinder/GitHub-Changelog-Generator)_
diff --git a/packages/mermaid/CHANGELOG.md b/packages/mermaid/CHANGELOG.md
index f830e8ecd..49756233a 100644
--- a/packages/mermaid/CHANGELOG.md
+++ b/packages/mermaid/CHANGELOG.md
@@ -281,3 +281,1005 @@
 
 - Updated dependencies [[`5013484`](https://github.com/mermaid-js/mermaid/commit/50134849246141ec400e33e08c12c10539b84de9)]:
   - @mermaid-js/parser@0.1.0
+
+## [10.0.0](https://github.com/mermaid-js/mermaid/releases/tag/v10.0.0)
+
+### Mermaid is ESM only!
+
+We've dropped CJS support. So, you will have to update your import scripts as follows.
+
+```html
+
+```
+
+You can keep using v9 by adding the `@9` in the CDN URL.
+
+```diff
+- 
++ 
+```
+
+### mermaid.render is async and doesn't accept callbacks
+
+```js
+// < v10
+mermaid.render('id', 'graph TD;\nA-->B', (svg, bindFunctions) => {
+  element.innerHTML = svg;
+  if (bindFunctions) {
+    bindFunctions(element);
+  }
+});
+
+// Shorter syntax
+if (bindFunctions) {
+  bindFunctions(element);
+}
+// can be replaced with the `?.` shorthand
+bindFunctions?.(element);
+
+// >= v10 with async/await
+const { svg, bindFunctions } = await mermaid.render('id', 'graph TD;\nA-->B');
+element.innerHTML = svg;
+bindFunctions?.(element);
+
+// >= v10 with promise.then
+mermaid.render('id', 'graph TD;A-->B').then(({ svg, bindFunctions }) => {
+  element.innerHTML = svg;
+  bindFunctions?.(element);
+});
+```
+
+### mermaid.parse is async and ParseError is removed
+
+```js
+// < v10
+mermaid.parse(text, parseError);
+
+//>= v10
+await mermaid.parse(text).catch(parseError);
+// or
+try {
+  await mermaid.parse(text);
+} catch (err) {
+  parseError(err);
+}
+```
+
+### Init deprecated and InitThrowsErrors removed
+
+The config passed to `init` was not being used earlier.
+It will now be used.
+The `init` function is deprecated and will be removed in the next major release.
+init currently works as a wrapper to `initialize` and `run`.
+
+```js
+// < v10
+mermaid.init(config, selector, cb);
+
+//>= v10
+mermaid.initialize(config);
+mermaid.run({
+  querySelector: selector,
+  postRenderCallback: cb,
+  suppressErrors: true,
+});
+```
+
+```js
+// < v10
+mermaid.initThrowsErrors(config, selector, cb);
+
+//>= v10
+mermaid.initialize(config);
+mermaid.run({
+  querySelector: selector,
+  postRenderCallback: cb,
+  suppressErrors: false,
+});
+```
+
+// TODO: Populate changelog pre v10
+
+- Config has a lot of changes
+- globalReset resets to `defaultConfig` instead of current config. Use `reset` instead.
+
+## [Unreleased](https://github.com/knsv/mermaid/tree/HEAD)
+
+[Full Changelog](https://github.com/knsv/mermaid/compare/8.2.0...HEAD)
+
+**Closed issues:**
+
+- Cross-Site Scripting:DOM - Issue [\#847](https://github.com/knsv/mermaid/issues/847)
+
+## [8.2.0](https://github.com/knsv/mermaid/tree/8.2.0) (2019-07-17)
+
+[Full Changelog](https://github.com/knsv/mermaid/compare/8.1.0...8.2.0)
+
+**Closed issues:**
+
+- Create issue templates [\#871](https://github.com/knsv/mermaid/issues/871)
+- cross site scripting in mermaid [\#869](https://github.com/knsv/mermaid/issues/869)
+- Make Gantt chart date inclusive [\#868](https://github.com/knsv/mermaid/issues/868)
+- CHANGELOG missing updates for all versions since 0.4.0 [\#865](https://github.com/knsv/mermaid/issues/865)
+- please add tag for 8.0.0 release [\#863](https://github.com/knsv/mermaid/issues/863)
+- classDiagram breaks on any edit [\#858](https://github.com/knsv/mermaid/issues/858)
+- found 1 high severity vulnerability [\#839](https://github.com/knsv/mermaid/issues/839)
+- Missing fontawesome icon support [\#830](https://github.com/knsv/mermaid/issues/830)
+- Docs for integration with wiki.js? [\#829](https://github.com/knsv/mermaid/issues/829)
+- Is this project still maintained? [\#826](https://github.com/knsv/mermaid/issues/826)
+- typora [\#823](https://github.com/knsv/mermaid/issues/823)
+- Maintain the order of the nodes in Flowchart [\#815](https://github.com/knsv/mermaid/issues/815)
+- Overlap, Overflow and cut titles in flowchart [\#814](https://github.com/knsv/mermaid/issues/814)
+- How load mermaidApi notejs electron [\#813](https://github.com/knsv/mermaid/issues/813)
+- How to set the spacing between the text of the flowchart node and the border? [\#812](https://github.com/knsv/mermaid/issues/812)
+- no triming participant name and the name following spaces is as another actor in sequence [\#809](https://github.com/knsv/mermaid/issues/809)
+- uml Class as shape type [\#807](https://github.com/knsv/mermaid/issues/807)
+- Force-directed graph Layout Style [\#806](https://github.com/knsv/mermaid/issues/806)
+- how can I start a newLine in FlowChart [\#805](https://github.com/knsv/mermaid/issues/805)
+- UOEProcessShow [\#801](https://github.com/knsv/mermaid/issues/801)
+- Why the use of code blocks? [\#799](https://github.com/knsv/mermaid/issues/799)
+- fixing class diagram [\#794](https://github.com/knsv/mermaid/issues/794)
+- Autonumber support in sequence diagrams [\#782](https://github.com/knsv/mermaid/issues/782)
+- MomentJS dependency [\#781](https://github.com/knsv/mermaid/issues/781)
+- Feature : Can we color code the flow/arrows [\#766](https://github.com/knsv/mermaid/issues/766)
+- Is there any way to convert flowchart.js code to mermaid code [\#726](https://github.com/knsv/mermaid/issues/726)
+- Fixed width of nodes [\#653](https://github.com/knsv/mermaid/issues/653)
+- Inline comment [\#650](https://github.com/knsv/mermaid/issues/650)
+- alt attribute of img tag in HTML [\#619](https://github.com/knsv/mermaid/issues/619)
+- Just wanted to say : THANKS ! [\#618](https://github.com/knsv/mermaid/issues/618)
+- "animation" [\#446](https://github.com/knsv/mermaid/issues/446)
+
+**Merged pull requests:**
+
+- Trimming whitespace after participant id [\#882](https://github.com/knsv/mermaid/pull/882) ([IOrlandoni](https://github.com/IOrlandoni))
+- chore\(deps\): bump atob from 2.0.3 to 2.1.2 [\#881](https://github.com/knsv/mermaid/pull/881) ([dependabot[bot]](https://github.com/apps/dependabot))
+- chore\(deps\): bump fstream from 1.0.11 to 1.0.12 [\#880](https://github.com/knsv/mermaid/pull/880) ([dependabot[bot]](https://github.com/apps/dependabot))
+- chore\(deps\): bump js-yaml from 3.12.0 to 3.13.1 [\#879](https://github.com/knsv/mermaid/pull/879) ([dependabot[bot]](https://github.com/apps/dependabot))
+- I847 cross site scripting [\#878](https://github.com/knsv/mermaid/pull/878) ([knsv](https://github.com/knsv))
+- Bump lodash.mergewith from 4.6.1 to 4.6.2 [\#877](https://github.com/knsv/mermaid/pull/877) ([dependabot[bot]](https://github.com/apps/dependabot))
+- Adding docs into core repo again [\#876](https://github.com/knsv/mermaid/pull/876) ([knsv](https://github.com/knsv))
+- Bump lodash from 4.17.11 to 4.17.13 [\#875](https://github.com/knsv/mermaid/pull/875) ([dependabot[bot]](https://github.com/apps/dependabot))
+- feat\(stale.yml\): update issue label and bot comment [\#874](https://github.com/knsv/mermaid/pull/874) ([ThePenguin1140](https://github.com/ThePenguin1140))
+- Feature/allow inclusive enddates [\#872](https://github.com/knsv/mermaid/pull/872) ([ThePenguin1140](https://github.com/ThePenguin1140))
+- Adding trapezoid and inverse trapezoid vertex options. [\#741](https://github.com/knsv/mermaid/pull/741) ([adamwulf](https://github.com/adamwulf))
+
+## [8.1.0](https://github.com/knsv/mermaid/tree/8.1.0) (2019-06-25)
+
+[Full Changelog](https://github.com/knsv/mermaid/compare/7.0.5...8.1.0)
+
+**Closed issues:**
+
+- Gantt and sequence diagram do not render [\#853](https://github.com/knsv/mermaid/issues/853)
+- margins around flowchart are not balanced [\#852](https://github.com/knsv/mermaid/issues/852)
+- Smaller bundles [\#843](https://github.com/knsv/mermaid/issues/843)
+- unicode in labels [\#776](https://github.com/knsv/mermaid/issues/776)
+- Hard-changing drawing of arrows per edge type [\#775](https://github.com/knsv/mermaid/issues/775)
+- SequenceDiagram wrong [\#773](https://github.com/knsv/mermaid/issues/773)
+- Render mermaid on github pages with simple code [\#772](https://github.com/knsv/mermaid/issues/772)
+- FlowChart - large space between text and the image [\#754](https://github.com/knsv/mermaid/issues/754)
+- Class Diagram Issues when using Mermaid in Stackedit [\#748](https://github.com/knsv/mermaid/issues/748)
+- Multi-platform CI [\#744](https://github.com/knsv/mermaid/issues/744)
+- gantt: sections can't have a colon [\#742](https://github.com/knsv/mermaid/issues/742)
+- Yarn build does not add mermaid.min.css to dist [\#732](https://github.com/knsv/mermaid/issues/732)
+- Is there a grammar / keyword / more than just the basic examples? [\#718](https://github.com/knsv/mermaid/issues/718)
+- Click event and react component [\#717](https://github.com/knsv/mermaid/issues/717)
+- Long text going outside the box [\#706](https://github.com/knsv/mermaid/issues/706)
+- How to migrate from yUML to mermaid? [\#704](https://github.com/knsv/mermaid/issues/704)
+- Issue on Dynamic Creation in PHP [\#690](https://github.com/knsv/mermaid/issues/690)
+- `click "\#target"` and `click "http://url"` should create regular links [\#689](https://github.com/knsv/mermaid/issues/689)
+- Support Chinese punctuation [\#687](https://github.com/knsv/mermaid/issues/687)
+- \[Question\] Proper way to install on Mac? [\#681](https://github.com/knsv/mermaid/issues/681)
+- Has Mermaid a graphical interface to make diagrams? [\#668](https://github.com/knsv/mermaid/issues/668)
+- mermaid installation on debian [\#649](https://github.com/knsv/mermaid/issues/649)
+- "Cannot activate" in sequenceDiagram [\#647](https://github.com/knsv/mermaid/issues/647)
+- Link \("click" statement\) in flowchart does not work in exported SVG [\#646](https://github.com/knsv/mermaid/issues/646)
+- How to pass styling [\#639](https://github.com/knsv/mermaid/issues/639)
+- The live editor can't show seq diagram with notes for 8.0.0-alpha.3 [\#638](https://github.com/knsv/mermaid/issues/638)
+- import mermaid.css with ES6 + NPM [\#634](https://github.com/knsv/mermaid/issues/634)
+- Actor line cuts through other elements [\#633](https://github.com/knsv/mermaid/issues/633)
+- Graph TD line out of the picture \(left side\) [\#630](https://github.com/knsv/mermaid/issues/630)
+- Flowchart labels appear "cutoff" [\#628](https://github.com/knsv/mermaid/issues/628)
+- Uncaught TypeError: \_.constant is not a function \(mermaid.js\) [\#626](https://github.com/knsv/mermaid/issues/626)
+- Missing tags and releases for newer versions [\#623](https://github.com/knsv/mermaid/issues/623)
+- Mermaid and Leo / Leo Vue [\#622](https://github.com/knsv/mermaid/issues/622)
+- mermaidAPI gantt Vue.js [\#621](https://github.com/knsv/mermaid/issues/621)
+- Gantt sections are not separated by colors - Fix: set numberSectionStyles to 4 instead of 3 [\#620](https://github.com/knsv/mermaid/issues/620)
+- how to get mermaidAPI? [\#617](https://github.com/knsv/mermaid/issues/617)
+- Error in startOnLoad documentation? [\#616](https://github.com/knsv/mermaid/issues/616)
+- Example export to SVG generates error [\#614](https://github.com/knsv/mermaid/issues/614)
+- The new online editor does not support previously generated links [\#613](https://github.com/knsv/mermaid/issues/613)
+- Grammar / Syntax documentation for flowcharts [\#607](https://github.com/knsv/mermaid/issues/607)
+- Mermaid does not work with d3.js [\#606](https://github.com/knsv/mermaid/issues/606)
+- Why does this code's flowchart lines get cut-off on screen? [\#604](https://github.com/knsv/mermaid/issues/604)
+- click keyword does not fire my callback \(on the demo Website too\) [\#603](https://github.com/knsv/mermaid/issues/603)
+- Online Editor fails to show exported SVG [\#601](https://github.com/knsv/mermaid/issues/601)
+- Just saying thanks! [\#597](https://github.com/knsv/mermaid/issues/597)
+- stylesheet crashed with other library like abcjs [\#596](https://github.com/knsv/mermaid/issues/596)
+- Missing connection [\#594](https://github.com/knsv/mermaid/issues/594)
+- How to use mermaid on node.js restful api? [\#593](https://github.com/knsv/mermaid/issues/593)
+- Remove status code [\#589](https://github.com/knsv/mermaid/issues/589)
+- Golang based editor [\#588](https://github.com/knsv/mermaid/issues/588)
+- sequenceDiagram -\> notetext css font is hardcoded [\#587](https://github.com/knsv/mermaid/issues/587)
+- Multiple graph in the live editor [\#586](https://github.com/knsv/mermaid/issues/586)
+- All \ elements in page are colored black [\#584](https://github.com/knsv/mermaid/issues/584)
+- Styling: classes aren't applied to elements. [\#582](https://github.com/knsv/mermaid/issues/582)
+- Rounded connections [\#580](https://github.com/knsv/mermaid/issues/580)
+- Arrows are not being shown correctly in the dark theme [\#578](https://github.com/knsv/mermaid/issues/578)
+- The documentation for CLI seems outdated. [\#572](https://github.com/knsv/mermaid/issues/572)
+- No effect of click event:can not open link [\#571](https://github.com/knsv/mermaid/issues/571)
+- Text colors are not correct in VSCODE [\#570](https://github.com/knsv/mermaid/issues/570)
+- Nodes aren't aligned properly \(just need an explanation\) [\#568](https://github.com/knsv/mermaid/issues/568)
+- setting margin around figure in R [\#567](https://github.com/knsv/mermaid/issues/567)
+- Arrows should Come out in upward and Downward direction from decision Node [\#566](https://github.com/knsv/mermaid/issues/566)
+- TypeError: Cannot read property 'select' of undefined [\#563](https://github.com/knsv/mermaid/issues/563)
+- A little bug [\#557](https://github.com/knsv/mermaid/issues/557)
+- Japanese text appears garbled [\#554](https://github.com/knsv/mermaid/issues/554)
+- classdiagram not works in mermaid live_editor [\#553](https://github.com/knsv/mermaid/issues/553)
+- font awesome in link text? [\#546](https://github.com/knsv/mermaid/issues/546)
+- q: heard of the cosmogol standard? [\#545](https://github.com/knsv/mermaid/issues/545)
+- Arrow heads missing \(cli, 7.0.3\) [\#544](https://github.com/knsv/mermaid/issues/544)
+- No Edge Boxes if useHtmlLabels=false [\#541](https://github.com/knsv/mermaid/issues/541)
+- how to change mermaid text color or line text block color? [\#534](https://github.com/knsv/mermaid/issues/534)
+- FlowChart visualization broken when downloading from live editor [\#533](https://github.com/knsv/mermaid/issues/533)
+- Can't get flowchart to render paths at the top of the diagram; I even tried the online editor and that shows the same issue. Thoughts? [\#532](https://github.com/knsv/mermaid/issues/532)
+- live editor make browser\(safari on macOS&iOS\) not longer respond [\#531](https://github.com/knsv/mermaid/issues/531)
+- css classes need a prefix/namespace [\#527](https://github.com/knsv/mermaid/issues/527)
+- input activate/deactivate cause safari unresponding [\#521](https://github.com/knsv/mermaid/issues/521)
+- Cannot Render the Mermaid Graph to PDF ? [\#520](https://github.com/knsv/mermaid/issues/520)
+- clicking links works from inset in subgraph but not from nodes [\#516](https://github.com/knsv/mermaid/issues/516)
+- Strange syntax error - when importing mermaid.js [\#515](https://github.com/knsv/mermaid/issues/515)
+- gantt x-axis display [\#510](https://github.com/knsv/mermaid/issues/510)
+- phantomjs renamed to phantomjs-prebuilt [\#508](https://github.com/knsv/mermaid/issues/508)
+- issue when using sphinxcontrib-mermaid extension for sphinx [\#507](https://github.com/knsv/mermaid/issues/507)
+- layout of docs page looks broken [\#504](https://github.com/knsv/mermaid/issues/504)
+- Problem showing graph with php on localhost [\#502](https://github.com/knsv/mermaid/issues/502)
+- logLevel's option doesnt work at 7.0.0 [\#501](https://github.com/knsv/mermaid/issues/501)
+- How do I get the log for a render or parse attempt? [\#500](https://github.com/knsv/mermaid/issues/500)
+- Mermaid neutral style to built in latest release [\#499](https://github.com/knsv/mermaid/issues/499)
+- Any plans for adding a typescript definition file? [\#495](https://github.com/knsv/mermaid/issues/495)
+- Gantt diagrams too narrow [\#493](https://github.com/knsv/mermaid/issues/493)
+- Flowchart edge labels placement [\#490](https://github.com/knsv/mermaid/issues/490)
+- Very different styles when rendering as png vs. svg [\#489](https://github.com/knsv/mermaid/issues/489)
+- New editor that supports mermaid: Caret [\#488](https://github.com/knsv/mermaid/issues/488)
+- Gant PNG margin [\#486](https://github.com/knsv/mermaid/issues/486)
+- ReferenceError: window is not defined [\#485](https://github.com/knsv/mermaid/issues/485)
+- Menu and layout bugs in docs [\#484](https://github.com/knsv/mermaid/issues/484)
+- Mermaid resets some of the page CSS styles [\#482](https://github.com/knsv/mermaid/issues/482)
+- Arrows rendering incorrectly in online editor [\#480](https://github.com/knsv/mermaid/issues/480)
+- CSS stroke-dasharray ignored by browsers but not other viewers [\#474](https://github.com/knsv/mermaid/issues/474)
+- mermaid - Browser Support issue [\#472](https://github.com/knsv/mermaid/issues/472)
+- Totally love mermaid I might pop! [\#471](https://github.com/knsv/mermaid/issues/471)
+- Sequence Diagram: Missing x on async arrows \(png\) [\#469](https://github.com/knsv/mermaid/issues/469)
+- live editor: the svg file rendered from graph is not supported by browsers [\#468](https://github.com/knsv/mermaid/issues/468)
+- Not found css [\#462](https://github.com/knsv/mermaid/issues/462)
+- Phantomjs Dependency [\#461](https://github.com/knsv/mermaid/issues/461)
+- Mermaid cli not working for subgraphs [\#459](https://github.com/knsv/mermaid/issues/459)
+- Support for notes across multiple participants? [\#458](https://github.com/knsv/mermaid/issues/458)
+- Related to Issue \#329: Phantomjs issues. [\#455](https://github.com/knsv/mermaid/issues/455)
+- Add a click style [\#426](https://github.com/knsv/mermaid/issues/426)
+- Add Parallel block \(par\) to sequence diagrams [\#425](https://github.com/knsv/mermaid/issues/425)
+- updating shapes after the flow chart rendering complete [\#424](https://github.com/knsv/mermaid/issues/424)
+- can't catch parse error Maximum call stack size exceeded on safari [\#421](https://github.com/knsv/mermaid/issues/421)
+- Arrows endings are missing [\#419](https://github.com/knsv/mermaid/issues/419)
+- shouldn't mermaid become more like Markdown ? [\#417](https://github.com/knsv/mermaid/issues/417)
+- Live editor show rendered diagram if syntax invalid [\#415](https://github.com/knsv/mermaid/issues/415)
+- Live editor sticky sidebar [\#414](https://github.com/knsv/mermaid/issues/414)
+- Linkstyle stroke does not work [\#410](https://github.com/knsv/mermaid/issues/410)
+- flowchart id's with dots in them .. break links [\#408](https://github.com/knsv/mermaid/issues/408)
+- Flowchart: Link text beginning with lowercase 'o' causes flowchart to break [\#407](https://github.com/knsv/mermaid/issues/407)
+- Some chinese character will case Safari no responding. [\#405](https://github.com/knsv/mermaid/issues/405)
+- Cannot center-justify text in nodes? [\#397](https://github.com/knsv/mermaid/issues/397)
+- Edge labels should have white background in live editor [\#396](https://github.com/knsv/mermaid/issues/396)
+- Live editor does not support activate/deactivate [\#394](https://github.com/knsv/mermaid/issues/394)
+- Styling subgraph? [\#391](https://github.com/knsv/mermaid/issues/391)
+- Update live editor to version 6.0.0 [\#387](https://github.com/knsv/mermaid/issues/387)
+- sequence diagram config issue [\#385](https://github.com/knsv/mermaid/issues/385)
+- How to add newline in the text [\#384](https://github.com/knsv/mermaid/issues/384)
+- PhantomJS crashes on a large graph [\#380](https://github.com/knsv/mermaid/issues/380)
+- Finnish support for class diagrams using plantuml syntax [\#377](https://github.com/knsv/mermaid/issues/377)
+- mermaidAPI.render generated different svg code from mermaid.int\(\) [\#374](https://github.com/knsv/mermaid/issues/374)
+- Put your own action on the chart [\#372](https://github.com/knsv/mermaid/issues/372)
+- when declaring participants the elements are generated twice [\#370](https://github.com/knsv/mermaid/issues/370)
+- Example Flowchart is cut in display \(Chrome\). [\#368](https://github.com/knsv/mermaid/issues/368)
+- Add shebang support to diagrams [\#365](https://github.com/knsv/mermaid/issues/365)
+- Silencing CLI output [\#352](https://github.com/knsv/mermaid/issues/352)
+- SequenceDiagram: 3+ Alternative Paths [\#348](https://github.com/knsv/mermaid/issues/348)
+- Smaller height of actor boxes [\#342](https://github.com/knsv/mermaid/issues/342)
+- Question: lib/phantomscript.js - foreignObjects in SVG - related to \#58 [\#340](https://github.com/knsv/mermaid/issues/340)
+- npm test fails on osx being blocked at Can not load "PhantomJS", it is not registered! [\#337](https://github.com/knsv/mermaid/issues/337)
+- Tabs & subgraphs cause rendering error [\#336](https://github.com/knsv/mermaid/issues/336)
+- Display question: right angles [\#335](https://github.com/knsv/mermaid/issues/335)
+- No Arrows rendered v0.5.8 [\#330](https://github.com/knsv/mermaid/issues/330)
+- mermaid -v filename.mmd gives You must specify at least one source file. [\#328](https://github.com/knsv/mermaid/issues/328)
+- You had errors in your syntax. Use --help for further information. [\#327](https://github.com/knsv/mermaid/issues/327)
+- Allow alternate arrow syntax that doesn't close html comments [\#322](https://github.com/knsv/mermaid/issues/322)
+- Comment in subgraph [\#319](https://github.com/knsv/mermaid/issues/319)
+- Update graph [\#311](https://github.com/knsv/mermaid/issues/311)
+- css conflicts with boostrap's css [\#308](https://github.com/knsv/mermaid/issues/308)
+- Can not get click event to fire. [\#306](https://github.com/knsv/mermaid/issues/306)
+- Fix phantomjs2 compatibility [\#304](https://github.com/knsv/mermaid/issues/304)
+- Flowcharts do not work in native IE11 [\#303](https://github.com/knsv/mermaid/issues/303)
+- Integration with remark.js - tutorial added [\#302](https://github.com/knsv/mermaid/issues/302)
+- Theme for dark background [\#301](https://github.com/knsv/mermaid/issues/301)
+- Sequence diagram Loops: changing boxMargin spoils the "loop" notation [\#299](https://github.com/knsv/mermaid/issues/299)
+- src/mermaid.js generates bad code [\#297](https://github.com/knsv/mermaid/issues/297)
+- Fresh fork: jasmine tests fail [\#294](https://github.com/knsv/mermaid/issues/294)
+- CSS clash [\#292](https://github.com/knsv/mermaid/issues/292)
+- Mermaid does not work in Chrome 48 [\#281](https://github.com/knsv/mermaid/issues/281)
+- node click is not effective [\#272](https://github.com/knsv/mermaid/issues/272)
+- circle and ellipse cannot change color by classDef [\#271](https://github.com/knsv/mermaid/issues/271)
+- \[Feature request\] gantt diagram axis format [\#269](https://github.com/knsv/mermaid/issues/269)
+- Not Able to See Labels even htmlLabels:false added [\#268](https://github.com/knsv/mermaid/issues/268)
+- npm run watch doesn’t work due missing dependencies [\#266](https://github.com/knsv/mermaid/issues/266)
+- label out of node [\#262](https://github.com/knsv/mermaid/issues/262)
+- IE11 Support issue [\#261](https://github.com/knsv/mermaid/issues/261)
+- mermaid without browser [\#260](https://github.com/knsv/mermaid/issues/260)
+- Insufficient capacity of gantt diagrams [\#226](https://github.com/knsv/mermaid/issues/226)
+- some WARN about installion [\#222](https://github.com/knsv/mermaid/issues/222)
+- Live editor offline access [\#217](https://github.com/knsv/mermaid/issues/217)
+- suggest: code highlight mode config for editors [\#212](https://github.com/knsv/mermaid/issues/212)
+- Uncaught RangeError: Maximum call stack size exceeded [\#189](https://github.com/knsv/mermaid/issues/189)
+- Implement render function for server side rendering using phantomjs [\#169](https://github.com/knsv/mermaid/issues/169)
+- Styling label texts [\#50](https://github.com/knsv/mermaid/issues/50)
+- Graphviz DOT syntax [\#5](https://github.com/knsv/mermaid/issues/5)
+
+**Merged pull requests:**
+
+- Remove console.log in classDB. [\#861](https://github.com/knsv/mermaid/pull/861) ([Arthaey](https://github.com/Arthaey))
+- Bump sshpk from 1.13.1 to 1.16.1 [\#851](https://github.com/knsv/mermaid/pull/851) ([dependabot[bot]](https://github.com/apps/dependabot))
+- Significantly smaller bundles [\#850](https://github.com/knsv/mermaid/pull/850) ([fabiospampinato](https://github.com/fabiospampinato))
+- Support styling of subgraphs [\#845](https://github.com/knsv/mermaid/pull/845) ([Qix-](https://github.com/Qix-))
+- fix dark theme loop labels not visible [\#837](https://github.com/knsv/mermaid/pull/837) ([jnnnnn](https://github.com/jnnnnn))
+- fix draw function can only call once [\#832](https://github.com/knsv/mermaid/pull/832) ([vaniship](https://github.com/vaniship))
+- Fix dotted lines not appearing in flowcharts when HTML labels disabled [\#828](https://github.com/knsv/mermaid/pull/828) ([stanhu](https://github.com/stanhu))
+- Fix issue with XML line breaks inside vertex labels [\#824](https://github.com/knsv/mermaid/pull/824) ([jsyang](https://github.com/jsyang))
+- fixed diagrams [\#810](https://github.com/knsv/mermaid/pull/810) ([0xflotus](https://github.com/0xflotus))
+- Clickable gantt tasks [\#804](https://github.com/knsv/mermaid/pull/804) ([abzicht](https://github.com/abzicht))
+- linkStyle now supports list of indexes with a few tests [\#798](https://github.com/knsv/mermaid/pull/798) ([ivan-danilov](https://github.com/ivan-danilov))
+- fix class diagram mermaid [\#795](https://github.com/knsv/mermaid/pull/795) ([DanShai](https://github.com/DanShai))
+- Added exclude weekdays to definition [\#792](https://github.com/knsv/mermaid/pull/792) ([jopapo](https://github.com/jopapo))
+- SVG link rendering [\#791](https://github.com/knsv/mermaid/pull/791) ([flying-sheep](https://github.com/flying-sheep))
+- Gantt milestones [\#788](https://github.com/knsv/mermaid/pull/788) ([gijswijs](https://github.com/gijswijs))
+- Remove duplicate code [\#768](https://github.com/knsv/mermaid/pull/768) ([znxkznxk1030](https://github.com/znxkznxk1030))
+- Render nodes as real links [\#765](https://github.com/knsv/mermaid/pull/765) ([flying-sheep](https://github.com/flying-sheep))
+- Support Multi-line Actor Descriptions [\#764](https://github.com/knsv/mermaid/pull/764) ([watsoncj](https://github.com/watsoncj))
+- Fix issue with marker-end. [\#757](https://github.com/knsv/mermaid/pull/757) ([gjlubbertsen](https://github.com/gjlubbertsen))
+- Make Class Diagrams usable in Stackedit and Live Editor [\#749](https://github.com/knsv/mermaid/pull/749) ([monsterkrampe](https://github.com/monsterkrampe))
+- Sequence numbers [\#722](https://github.com/knsv/mermaid/pull/722) ([paulbland](https://github.com/paulbland))
+- Add option for right angles [\#721](https://github.com/knsv/mermaid/pull/721) ([paulbland](https://github.com/paulbland))
+- Add nested activation classes [\#720](https://github.com/knsv/mermaid/pull/720) ([paulbland](https://github.com/paulbland))
+- wip: class diagram cardinality display [\#705](https://github.com/knsv/mermaid/pull/705) ([Vrixyz](https://github.com/Vrixyz))
+- add comments about CSS in config [\#688](https://github.com/knsv/mermaid/pull/688) ([imma90](https://github.com/imma90))
+- SequenceDiagram: Add support for multiple alt else statements [\#641](https://github.com/knsv/mermaid/pull/641) ([sechel](https://github.com/sechel))
+- fix \#426 - add class .clickable on nodes with click function or link [\#598](https://github.com/knsv/mermaid/pull/598) ([thomasleveil](https://github.com/thomasleveil))
+- Spec fix 1 [\#595](https://github.com/knsv/mermaid/pull/595) ([frankschmitt](https://github.com/frankschmitt))
+
+## [7.0.5](https://github.com/knsv/mermaid/tree/7.0.5) (2017-09-01)
+
+[Full Changelog](https://github.com/knsv/mermaid/compare/7.0.3...7.0.5)
+
+**Closed issues:**
+
+- live editor latin error after update [\#560](https://github.com/knsv/mermaid/issues/560)
+- Simple full example in online documentation is broken [\#558](https://github.com/knsv/mermaid/issues/558)
+- Graph No Arrow Head v7.0.3 [\#543](https://github.com/knsv/mermaid/issues/543)
+- Conflict while using mermaid along with core-js [\#512](https://github.com/knsv/mermaid/issues/512)
+- Export to pdf on website [\#496](https://github.com/knsv/mermaid/issues/496)
+- New downstream project: Mermaid Preview for VSCode [\#442](https://github.com/knsv/mermaid/issues/442)
+- Can't Zoom the flowchart ? [\#399](https://github.com/knsv/mermaid/issues/399)
+- line labels are not rendered correctly in live editor [\#366](https://github.com/knsv/mermaid/issues/366)
+- mermaid-loader [\#361](https://github.com/knsv/mermaid/issues/361)
+- Are there any documentation or examples for classDiagram and gitGraph? [\#359](https://github.com/knsv/mermaid/issues/359)
+- \# character broken in 0.5.8 [\#347](https://github.com/knsv/mermaid/issues/347)
+- Documentation issue: CSS example is not visible [\#345](https://github.com/knsv/mermaid/issues/345)
+- Include documentation for command line usage [\#326](https://github.com/knsv/mermaid/issues/326)
+- Fresh fork: can't build dist [\#296](https://github.com/knsv/mermaid/issues/296)
+- Invalid value for \ attribute viewBox="0 0 -Infinity -Infinity" [\#291](https://github.com/knsv/mermaid/issues/291)
+- Webpack require fails [\#277](https://github.com/knsv/mermaid/issues/277)
+- New documentation - need improved logo [\#216](https://github.com/knsv/mermaid/issues/216)
+
+## [7.0.3](https://github.com/knsv/mermaid/tree/7.0.3) (2017-06-04)
+
+[Full Changelog](https://github.com/knsv/mermaid/compare/7.0.2...7.0.3)
+
+**Closed issues:**
+
+- the documentation website is down [\#539](https://github.com/knsv/mermaid/issues/539)
+- Good example of interactivity with mermaidAPI [\#514](https://github.com/knsv/mermaid/issues/514)
+
+## [7.0.2](https://github.com/knsv/mermaid/tree/7.0.2) (2017-06-01)
+
+[Full Changelog](https://github.com/knsv/mermaid/compare/7.0.0...7.0.2)
+
+**Closed issues:**
+
+- CDN is not working [\#511](https://github.com/knsv/mermaid/issues/511)
+- A sampe sequenceDiagram crashes mermaid-cli [\#492](https://github.com/knsv/mermaid/issues/492)
+- Mermaid doesn't delete nodes when called multiple times [\#491](https://github.com/knsv/mermaid/issues/491)
+- API crashes on 2nd render\(\) call [\#478](https://github.com/knsv/mermaid/issues/478)
+- sequenceDiagram: dotted line for alt and empty bracket should be hidden [\#456](https://github.com/knsv/mermaid/issues/456)
+- SVG output \(almost\) not correct [\#434](https://github.com/knsv/mermaid/issues/434)
+- How to set axisFormatter of gantt in mermaid CLI? [\#428](https://github.com/knsv/mermaid/issues/428)
+- customizing link style with any color sets `fill` property to `black` instead of `none` [\#416](https://github.com/knsv/mermaid/issues/416)
+- New line at the end of SVG file [\#400](https://github.com/knsv/mermaid/issues/400)
+- CLI doesn't work [\#389](https://github.com/knsv/mermaid/issues/389)
+- Can't render subgraphs with htmlLabels: false [\#367](https://github.com/knsv/mermaid/issues/367)
+- Color arrowhead [\#362](https://github.com/knsv/mermaid/issues/362)
+- CLI: Invisible text, lines in SVG output [\#341](https://github.com/knsv/mermaid/issues/341)
+
+**Merged pull requests:**
+
+- Update Travis config [\#538](https://github.com/knsv/mermaid/pull/538) ([tylerlong](https://github.com/tylerlong))
+- Fix spelling of 'you' in sequenceDiagram docs [\#537](https://github.com/knsv/mermaid/pull/537) ([ctruelson](https://github.com/ctruelson))
+- Improve CLI output [\#536](https://github.com/knsv/mermaid/pull/536) ([gibson042](https://github.com/gibson042))
+- Modernize mermaid [\#524](https://github.com/knsv/mermaid/pull/524) ([tylerlong](https://github.com/tylerlong))
+- Modernize mermaid [\#519](https://github.com/knsv/mermaid/pull/519) ([tylerlong](https://github.com/tylerlong))
+- Update CLI instructions [\#509](https://github.com/knsv/mermaid/pull/509) ([filipedeschamps](https://github.com/filipedeschamps))
+- Add style for classDiagram to dark/default theme [\#503](https://github.com/knsv/mermaid/pull/503) ([yudenzel](https://github.com/yudenzel))
+- Fix documentation for git graph. [\#498](https://github.com/knsv/mermaid/pull/498) ([gomlgs](https://github.com/gomlgs))
+- Fix links in documentations [\#497](https://github.com/knsv/mermaid/pull/497) ([saveman71](https://github.com/saveman71))
+- Update README.md with git graph sample [\#481](https://github.com/knsv/mermaid/pull/481) ([raghur](https://github.com/raghur))
+- Fix misspelling of “another” [\#479](https://github.com/knsv/mermaid/pull/479) ([stevenschobert](https://github.com/stevenschobert))
+- Fixed \#456 sequenceDiagram: dotted line for alt and empty bracket sho… [\#477](https://github.com/knsv/mermaid/pull/477) ([brookhong](https://github.com/brookhong))
+- Add viewbox attr to class diagram [\#473](https://github.com/knsv/mermaid/pull/473) ([gnkm](https://github.com/gnkm))
+- add par statement to sequenceDiagram [\#470](https://github.com/knsv/mermaid/pull/470) ([u-minor](https://github.com/u-minor))
+
+## [7.0.0](https://github.com/knsv/mermaid/tree/7.0.0) (2017-01-29)
+
+[Full Changelog](https://github.com/knsv/mermaid/compare/6.0.0...7.0.0)
+
+**Closed issues:**
+
+- demos on io site not working [\#466](https://github.com/knsv/mermaid/issues/466)
+- Can not be generated PNG pictures through CLI with Chinese [\#451](https://github.com/knsv/mermaid/issues/451)
+- Round nodes cannot be styled with CSS classes [\#443](https://github.com/knsv/mermaid/issues/443)
+- webpack gulp UglifyJsPlugin error. [\#440](https://github.com/knsv/mermaid/issues/440)
+- String concatenation isn't working [\#432](https://github.com/knsv/mermaid/issues/432)
+- text flow/wrap in actor box of sequence diagram [\#422](https://github.com/knsv/mermaid/issues/422)
+- Online live editor still use old version [\#402](https://github.com/knsv/mermaid/issues/402)
+- uncaught TypeError: t.getTransformToElement is not a function [\#401](https://github.com/knsv/mermaid/issues/401)
+- Only works when using browserify'd code [\#373](https://github.com/knsv/mermaid/issues/373)
+- document the use of shebang line in mmd files [\#364](https://github.com/knsv/mermaid/issues/364)
+- Diagrams are small and unreadable in IE 11 - since 0.5.1 [\#356](https://github.com/knsv/mermaid/issues/356)
+- \[Feature Request\] ER-Diagram Support [\#354](https://github.com/knsv/mermaid/issues/354)
+- npm install -g mermaid does not install phantomjs [\#329](https://github.com/knsv/mermaid/issues/329)
+- activation boxes [\#313](https://github.com/knsv/mermaid/issues/313)
+- The need for mermaid.css should be mentioned explicitly in the intro docs... [\#273](https://github.com/knsv/mermaid/issues/273)
+
+**Merged pull requests:**
+
+- Update index.html [\#465](https://github.com/knsv/mermaid/pull/465) ([bmsleight](https://github.com/bmsleight))
+- Fix for \#416, customizing link style with any color sets `fill` property to `black` instead of `none` [\#452](https://github.com/knsv/mermaid/pull/452) ([joshuacolvin](https://github.com/joshuacolvin))
+- Allow .node\>circle to receive css styles [\#449](https://github.com/knsv/mermaid/pull/449) ([bfriedz](https://github.com/bfriedz))
+- Fix spelling [\#447](https://github.com/knsv/mermaid/pull/447) ([jawn](https://github.com/jawn))
+- added tests and fix cli css style selector lowercase problem [\#445](https://github.com/knsv/mermaid/pull/445) ([whyzdev](https://github.com/whyzdev))
+- Update d3.js [\#441](https://github.com/knsv/mermaid/pull/441) ([hetz](https://github.com/hetz))
+- adde tests to reproduce \#434 in flowchart [\#439](https://github.com/knsv/mermaid/pull/439) ([whyzdev](https://github.com/whyzdev))
+- Code Climate config [\#437](https://github.com/knsv/mermaid/pull/437) ([larkinscott](https://github.com/larkinscott))
+- fix gantt and sequence digram cli cfg [\#435](https://github.com/knsv/mermaid/pull/435) ([whyzdev](https://github.com/whyzdev))
+- fix gantt chart cli configuration broken [\#433](https://github.com/knsv/mermaid/pull/433) ([whyzdev](https://github.com/whyzdev))
+- fix gantt chart cli configuration parsing including functions [\#430](https://github.com/knsv/mermaid/pull/430) ([whyzdev](https://github.com/whyzdev))
+- Uses an empty text node instead of a string for svg group labels [\#429](https://github.com/knsv/mermaid/pull/429) ([daveaglick](https://github.com/daveaglick))
+- use tspan via d3.textwrap to place actor text in sequence diagram [\#427](https://github.com/knsv/mermaid/pull/427) ([whyzdev](https://github.com/whyzdev))
+- \#422 use foreignObject/div to place actor label in sequence diagram [\#423](https://github.com/knsv/mermaid/pull/423) ([whyzdev](https://github.com/whyzdev))
+- Clarify the need for a CSS stylesheet [\#413](https://github.com/knsv/mermaid/pull/413) ([sifb](https://github.com/sifb))
+- Added hads downstream project [\#412](https://github.com/knsv/mermaid/pull/412) ([sinedied](https://github.com/sinedied))
+- update usage and fix \#273 [\#406](https://github.com/knsv/mermaid/pull/406) ([jinntrance](https://github.com/jinntrance))
+- Add https://github.com/raghur/mermaid-filter to downstream projects docs page [\#404](https://github.com/knsv/mermaid/pull/404) ([raghur](https://github.com/raghur))
+- New neutral theme [\#395](https://github.com/knsv/mermaid/pull/395) ([sinedied](https://github.com/sinedied))
+- fix cli issues [\#390](https://github.com/knsv/mermaid/pull/390) ([ben-page](https://github.com/ben-page))
+- Add missing space for 'Labels out of bounds' section [\#386](https://github.com/knsv/mermaid/pull/386) ([The-Alchemist](https://github.com/The-Alchemist))
+- Fix typo: `pats` -\> `paths` [\#382](https://github.com/knsv/mermaid/pull/382) ([swhgoon](https://github.com/swhgoon))
+- Added class diagram example to README.md [\#379](https://github.com/knsv/mermaid/pull/379) ([HustLion](https://github.com/HustLion))
+- override normal flowchart arrowhead to allow css styling [\#376](https://github.com/knsv/mermaid/pull/376) ([dodoinblue](https://github.com/dodoinblue))
+- added sphinx extension [\#371](https://github.com/knsv/mermaid/pull/371) ([mgaitan](https://github.com/mgaitan))
+- Fix typo in the sequence diagram documentation [\#369](https://github.com/knsv/mermaid/pull/369) ([ggpasqualino](https://github.com/ggpasqualino))
+
+## [6.0.0](https://github.com/knsv/mermaid/tree/6.0.0) (2016-05-29)
+
+[Full Changelog](https://github.com/knsv/mermaid/compare/0.5.8...6.0.0)
+
+**Closed issues:**
+
+- Docs css: code hard to read [\#324](https://github.com/knsv/mermaid/issues/324)
+- About Markpad integration [\#323](https://github.com/knsv/mermaid/issues/323)
+- How to link backwards in flowchat? [\#321](https://github.com/knsv/mermaid/issues/321)
+- Help with editor [\#310](https://github.com/knsv/mermaid/issues/310)
+- +1 [\#293](https://github.com/knsv/mermaid/issues/293)
+- Basic chart does not render on Chome, but does in Firefox [\#290](https://github.com/knsv/mermaid/issues/290)
+- Live editor is broken [\#285](https://github.com/knsv/mermaid/issues/285)
+- "No such file or directory" trying to run mermaid 0.5.7 on OS X [\#284](https://github.com/knsv/mermaid/issues/284)
+- participant name as "Long Long Name" [\#283](https://github.com/knsv/mermaid/issues/283)
+- Windows - cli - could not find phantomjs at the specified path [\#236](https://github.com/knsv/mermaid/issues/236)
+
+**Merged pull requests:**
+
+- The option of gantt for the spaces for the section names. [\#353](https://github.com/knsv/mermaid/pull/353) ([zeroyonichihachi](https://github.com/zeroyonichihachi))
+- Gitgraph: Make reset work with parent ref carets [\#350](https://github.com/knsv/mermaid/pull/350) ([raghur](https://github.com/raghur))
+- Remove the text-shadows that make the text look blurry [\#349](https://github.com/knsv/mermaid/pull/349) ([AsaAyers](https://github.com/AsaAyers))
+- add line interpolation to linkStyle in flowchart [\#346](https://github.com/knsv/mermaid/pull/346) ([AlanHohn](https://github.com/AlanHohn))
+- Support git graph diagrams in mermaid [\#344](https://github.com/knsv/mermaid/pull/344) ([raghur](https://github.com/raghur))
+- Build and test execution changes [\#338](https://github.com/knsv/mermaid/pull/338) ([ssbarnea](https://github.com/ssbarnea))
+- Reformatting of css files [\#331](https://github.com/knsv/mermaid/pull/331) ([Jmuccigr](https://github.com/Jmuccigr))
+- \(WIP\) Sequence Diagram Title Support [\#320](https://github.com/knsv/mermaid/pull/320) ([bronsoja](https://github.com/bronsoja))
+- activations doc + few fixes [\#318](https://github.com/knsv/mermaid/pull/318) ([ciekawy](https://github.com/ciekawy))
+- Dark theme for better contrast on darker backgrounds [\#317](https://github.com/knsv/mermaid/pull/317) ([crodriguez1a](https://github.com/crodriguez1a))
+- Activations [\#316](https://github.com/knsv/mermaid/pull/316) ([ciekawy](https://github.com/ciekawy))
+- Support leading comments for sequenceDiagrams [\#312](https://github.com/knsv/mermaid/pull/312) ([ashsearle](https://github.com/ashsearle))
+- Show a little lenience for white-space around names [\#309](https://github.com/knsv/mermaid/pull/309) ([ashsearle](https://github.com/ashsearle))
+- Update list of downstream projects [\#307](https://github.com/knsv/mermaid/pull/307) ([maxArturo](https://github.com/maxArturo))
+- Issue 299: Sequence diagram Loops: changing boxMargin spoils the "loop" notation [\#300](https://github.com/knsv/mermaid/pull/300) ([LarryKlugerDS](https://github.com/LarryKlugerDS))
+- Issue 297 - src/mermaid.js generates bad code [\#298](https://github.com/knsv/mermaid/pull/298) ([LarryKlugerDS](https://github.com/LarryKlugerDS))
+- Updated instructions for running tests [\#295](https://github.com/knsv/mermaid/pull/295) ([LarryKlugerDS](https://github.com/LarryKlugerDS))
+- Add Markdown Plus to Downstream projects [\#288](https://github.com/knsv/mermaid/pull/288) ([tylerlong](https://github.com/tylerlong))
+- Quote phantomPath so that it doesn't fail on window [\#286](https://github.com/knsv/mermaid/pull/286) ([raghur](https://github.com/raghur))
+
+## [0.5.8](https://github.com/knsv/mermaid/tree/0.5.8) (2016-01-27)
+
+[Full Changelog](https://github.com/knsv/mermaid/compare/0.5.7...0.5.8)
+
+## [0.5.7](https://github.com/knsv/mermaid/tree/0.5.7) (2016-01-25)
+
+[Full Changelog](https://github.com/knsv/mermaid/compare/0.5.6...0.5.7)
+
+**Closed issues:**
+
+- Mermaid + LightPaper = ❤️ [\#280](https://github.com/knsv/mermaid/issues/280)
+- Bower Integration [\#278](https://github.com/knsv/mermaid/issues/278)
+- Mermaid breaks when variables end in 'v' [\#276](https://github.com/knsv/mermaid/issues/276)
+- sequence diagrams don't support participant aliasing [\#263](https://github.com/knsv/mermaid/issues/263)
+- One diagram that fails to render stops further execution on the page [\#259](https://github.com/knsv/mermaid/issues/259)
+- Where to find line layout algorithm? [\#258](https://github.com/knsv/mermaid/issues/258)
+- Compatibility with node.js [\#257](https://github.com/knsv/mermaid/issues/257)
+- Label resizing with dynamically loaded fonts [\#255](https://github.com/knsv/mermaid/issues/255)
+- SVG arrowheads are broken in the CLI [\#249](https://github.com/knsv/mermaid/issues/249)
+- Cannot read property 'replace' of undefined [\#239](https://github.com/knsv/mermaid/issues/239)
+
+**Merged pull requests:**
+
+- gh-50 Allow styling of edge labels in css [\#267](https://github.com/knsv/mermaid/pull/267) ([Anoia](https://github.com/Anoia))
+- Allow sequenceDiagram participant aliasing [\#265](https://github.com/knsv/mermaid/pull/265) ([gibson042](https://github.com/gibson042))
+
+## [0.5.6](https://github.com/knsv/mermaid/tree/0.5.6) (2015-11-22)
+
+[Full Changelog](https://github.com/knsv/mermaid/compare/0.5.5...0.5.6)
+
+**Closed issues:**
+
+- title doesn't work in sequenceDiagram [\#248](https://github.com/knsv/mermaid/issues/248)
+- hypen-minus should be valid in sequence diagram alt/else/etc. descriptions [\#247](https://github.com/knsv/mermaid/issues/247)
+- Broken in firefox? [\#245](https://github.com/knsv/mermaid/issues/245)
+- When there is a Chinese symbol in the flowchart, it will crash。 [\#238](https://github.com/knsv/mermaid/issues/238)
+- Non-alpha characters included in ALPHA token \(flow graph jison\) [\#232](https://github.com/knsv/mermaid/issues/232)
+- subgraph not rendering with change to sample [\#231](https://github.com/knsv/mermaid/issues/231)
+- sequence diagram requires a new line at the end? [\#229](https://github.com/knsv/mermaid/issues/229)
+- Live Editor: Permalink address not being parsed [\#202](https://github.com/knsv/mermaid/issues/202)
+- Add download SVG link to the live editor [\#144](https://github.com/knsv/mermaid/issues/144)
+
+**Merged pull requests:**
+
+- Make sequenceDiagram terminal newline optional [\#253](https://github.com/knsv/mermaid/pull/253) ([gibson042](https://github.com/gibson042))
+- Support sequenceDiagram "over" notes [\#252](https://github.com/knsv/mermaid/pull/252) ([gibson042](https://github.com/gibson042))
+- Properly handle "rest of line" statements [\#251](https://github.com/knsv/mermaid/pull/251) ([gibson042](https://github.com/gibson042))
+- CLI: Propagate exit code from lib \(i.e., phantomjs\) [\#250](https://github.com/knsv/mermaid/pull/250) ([gibson042](https://github.com/gibson042))
+- flowRender.js - Fix FontAwesome icon insert [\#244](https://github.com/knsv/mermaid/pull/244) ([ma-zal](https://github.com/ma-zal))
+- updated sequence diagram link in live editor [\#242](https://github.com/knsv/mermaid/pull/242) ([r-a-v-a-s](https://github.com/r-a-v-a-s))
+- updated links in README.md [\#240](https://github.com/knsv/mermaid/pull/240) ([r-a-v-a-s](https://github.com/r-a-v-a-s))
+- Ellipse syntax [\#237](https://github.com/knsv/mermaid/pull/237) ([spect88](https://github.com/spect88))
+- Allow keywords as suffixes of node ids [\#235](https://github.com/knsv/mermaid/pull/235) ([spect88](https://github.com/spect88))
+- Highlighted the editor in the nav [\#234](https://github.com/knsv/mermaid/pull/234) ([knsv](https://github.com/knsv))
+- Live editor tweaks [\#233](https://github.com/knsv/mermaid/pull/233) ([spect88](https://github.com/spect88))
+- Add a Gitter chat badge to README.md [\#230](https://github.com/knsv/mermaid/pull/230) ([gitter-badger](https://github.com/gitter-badger))
+
+## [0.5.5](https://github.com/knsv/mermaid/tree/0.5.5) (2015-10-21)
+
+[Full Changelog](https://github.com/knsv/mermaid/compare/0.5.4...0.5.5)
+
+**Closed issues:**
+
+- sequence diagram, arrowhead instead of crosshead [\#227](https://github.com/knsv/mermaid/issues/227)
+
+**Merged pull requests:**
+
+- Fix a typo: crosshead --\> arrowhead [\#228](https://github.com/knsv/mermaid/pull/228) ([tylerlong](https://github.com/tylerlong))
+
+## [0.5.4](https://github.com/knsv/mermaid/tree/0.5.4) (2015-10-19)
+
+[Full Changelog](https://github.com/knsv/mermaid/compare/0.5.3...0.5.4)
+
+**Closed issues:**
+
+- Weird bug in live editor when using words with substring `end` [\#184](https://github.com/knsv/mermaid/issues/184)
+- Custom icons [\#15](https://github.com/knsv/mermaid/issues/15)
+- Marker-end arrow cannot be shown for URL with query parameter [\#225](https://github.com/knsv/mermaid/issues/225)
+- Please update bower's D3 version [\#221](https://github.com/knsv/mermaid/issues/221)
+- Set log level from mermaid configuration [\#220](https://github.com/knsv/mermaid/issues/220)
+- Width fixed to 400px [\#204](https://github.com/knsv/mermaid/issues/204)
+- render to png from the cli does not display the marker-end arrow heads [\#181](https://github.com/knsv/mermaid/issues/181)
+- Links in sequence diagrams [\#159](https://github.com/knsv/mermaid/issues/159)
+- comment characters `%%` cause parse error [\#141](https://github.com/knsv/mermaid/issues/141)
+- Add a reversed asymmetric shape [\#124](https://github.com/knsv/mermaid/issues/124)
+- Add syntax for double headed arrows [\#123](https://github.com/knsv/mermaid/issues/123)
+- Support for font-awesome [\#49](https://github.com/knsv/mermaid/issues/49)
+
+**Merged pull requests:**
+
+- Allow `end` as a substring of vertex id [\#224](https://github.com/knsv/mermaid/pull/224) ([spect88](https://github.com/spect88))
+- Remove duplicate npm dependencies: d3 and he [\#223](https://github.com/knsv/mermaid/pull/223) ([spect88](https://github.com/spect88))
+
+## [0.5.3](https://github.com/knsv/mermaid/tree/0.5.3) (2015-10-04)
+
+[Full Changelog](https://github.com/knsv/mermaid/compare/0.5.2...0.5.3)
+
+## [0.5.2](https://github.com/knsv/mermaid/tree/0.5.2) (2015-10-04)
+
+[Full Changelog](https://github.com/knsv/mermaid/compare/0.5.1...0.5.2)
+
+**Closed issues:**
+
+- Installing “atom-mermaid@0.1.3” failed [\#218](https://github.com/knsv/mermaid/issues/218)
+- Render mermaid code on websites? [\#215](https://github.com/knsv/mermaid/issues/215)
+- Brackets in a node with text? [\#213](https://github.com/knsv/mermaid/issues/213)
+- node feature request [\#211](https://github.com/knsv/mermaid/issues/211)
+- Please add prefix for styles [\#208](https://github.com/knsv/mermaid/issues/208)
+- Bad handling of block arguments [\#207](https://github.com/knsv/mermaid/issues/207)
+- please consider port to mac osx [\#203](https://github.com/knsv/mermaid/issues/203)
+- allow phantomjs \>=1.9.x [\#201](https://github.com/knsv/mermaid/issues/201)
+- syntax for venn diagrams? [\#200](https://github.com/knsv/mermaid/issues/200)
+- Broken CLI Graphs? \(v0.5.1\) [\#196](https://github.com/knsv/mermaid/issues/196)
+- Static site does not render under HTTPS [\#194](https://github.com/knsv/mermaid/issues/194)
+- Error on simple graph [\#192](https://github.com/knsv/mermaid/issues/192)
+- Escape "~" [\#191](https://github.com/knsv/mermaid/issues/191)
+- Trying to add link using 'click' to flowchart [\#188](https://github.com/knsv/mermaid/issues/188)
+- cli: no lines and arrowheads rendered / only dotted lines [\#187](https://github.com/knsv/mermaid/issues/187)
+- text of mermaid div displayed on page [\#186](https://github.com/knsv/mermaid/issues/186)
+- using mermaid with laravel [\#185](https://github.com/knsv/mermaid/issues/185)
+- Atom editor package [\#183](https://github.com/knsv/mermaid/issues/183)
+- Auto linewrap for notes in sequence diagrams [\#178](https://github.com/knsv/mermaid/issues/178)
+- Execute code after initialize [\#176](https://github.com/knsv/mermaid/issues/176)
+- Autoscaling for all diagram types [\#175](https://github.com/knsv/mermaid/issues/175)
+- Problem with click event callback [\#174](https://github.com/knsv/mermaid/issues/174)
+- How to escape characters? [\#170](https://github.com/knsv/mermaid/issues/170)
+- it can not work [\#167](https://github.com/knsv/mermaid/issues/167)
+- UML Class diagram [\#154](https://github.com/knsv/mermaid/issues/154)
+- Broken subgraph using the CLI [\#153](https://github.com/knsv/mermaid/issues/153)
+- Support PlantUML syntax [\#149](https://github.com/knsv/mermaid/issues/149)
+- IE Support issue [\#142](https://github.com/knsv/mermaid/issues/142)
+- Flowchart truncated [\#140](https://github.com/knsv/mermaid/issues/140)
+- Double Quote as text is not working [\#219](https://github.com/knsv/mermaid/issues/219)
+- classDef / class not working with htmlLabels? [\#210](https://github.com/knsv/mermaid/issues/210)
+- Links in graph missing [\#209](https://github.com/knsv/mermaid/issues/209)
+- Last word in comment boxes getting cut off by word wrap library : \( [\#195](https://github.com/knsv/mermaid/issues/195)
+- Escaping characters in sequence diagram [\#193](https://github.com/knsv/mermaid/issues/193)
+- SVG foreignObject rendering [\#180](https://github.com/knsv/mermaid/issues/180)
+- IE9 issue [\#179](https://github.com/knsv/mermaid/issues/179)
+- inoperable in an AMD/requirejs environment: IPython Notebook [\#127](https://github.com/knsv/mermaid/issues/127)
+- \[Parser\] Hyphen in participant name bring TypeError [\#74](https://github.com/knsv/mermaid/issues/74)
+- Support for hyperlink and tooltip [\#34](https://github.com/knsv/mermaid/issues/34)
+
+**Merged pull requests:**
+
+- Update flowchart.md [\#214](https://github.com/knsv/mermaid/pull/214) ([orschiro](https://github.com/orschiro))
+- Default style when using the CLI [\#205](https://github.com/knsv/mermaid/pull/205) ([gillesdemey](https://github.com/gillesdemey))
+- Gantt chart - add minutes and seconds durations [\#198](https://github.com/knsv/mermaid/pull/198) ([dbrans](https://github.com/dbrans))
+- Using QUnit for AMD testing [\#190](https://github.com/knsv/mermaid/pull/190) ([bollwyvl](https://github.com/bollwyvl))
+- Update phantomscript.js [\#182](https://github.com/knsv/mermaid/pull/182) ([phairow](https://github.com/phairow))
+
+## [0.5.1](https://github.com/knsv/mermaid/tree/0.5.1) (2015-06-21)
+
+[Full Changelog](https://github.com/knsv/mermaid/compare/0.5.0...0.5.1)
+
+**Closed issues:**
+
+- Live editor is broken [\#173](https://github.com/knsv/mermaid/issues/173)
+- 0.5.0 no longer respects custom date definitions in Gantt diagrams [\#171](https://github.com/knsv/mermaid/issues/171)
+- Drop label character restrictions [\#162](https://github.com/knsv/mermaid/issues/162)
+- can't nest subgraphs in flowchart [\#161](https://github.com/knsv/mermaid/issues/161)
+- Unable to generate gantt diagram with mermaid CLI [\#158](https://github.com/knsv/mermaid/issues/158)
+- Inline css by "mermaid" [\#157](https://github.com/knsv/mermaid/issues/157)
+- Finite State Machine Diagram [\#152](https://github.com/knsv/mermaid/issues/152)
+- How to center align gantt diagram [\#150](https://github.com/knsv/mermaid/issues/150)
+- Security concern regarding class definition [\#148](https://github.com/knsv/mermaid/issues/148)
+- File Extension [\#147](https://github.com/knsv/mermaid/issues/147)
+- To SVG Export [\#146](https://github.com/knsv/mermaid/issues/146)
+- `setTimeout` with clusters problematic with programmatic edits and no callback [\#133](https://github.com/knsv/mermaid/issues/133)
+- Possibility to set the width of the generated flowchart [\#129](https://github.com/knsv/mermaid/issues/129)
+- flowchart - styling of edges via css overrides specific styles set in the graph definition [\#128](https://github.com/knsv/mermaid/issues/128)
+- module.exports.cloneCssStyles\(\) in combination with Angularjs breaks display in Chrome and IE [\#126](https://github.com/knsv/mermaid/issues/126)
+- Gantt - suitable xAxis for longer project [\#125](https://github.com/knsv/mermaid/issues/125)
+- Mix horizontal and vertical graph [\#68](https://github.com/knsv/mermaid/issues/68)
+- How to get started with this project ? [\#64](https://github.com/knsv/mermaid/issues/64)
+- Special characters break parsing [\#54](https://github.com/knsv/mermaid/issues/54)
+- Responsive graph layout for mobile viewers [\#51](https://github.com/knsv/mermaid/issues/51)
+- Styling connector lines [\#31](https://github.com/knsv/mermaid/issues/31)
+
+**Merged pull requests:**
+
+- Remove moot `version` property from bower.json [\#172](https://github.com/knsv/mermaid/pull/172) ([kkirsche](https://github.com/kkirsche))
+
+## [0.5.0](https://github.com/knsv/mermaid/tree/0.5.0) (2015-06-07)
+
+[Full Changelog](https://github.com/knsv/mermaid/compare/0.4.0...0.5.0)
+
+**Closed issues:**
+
+- it can not work where graph TD contains chinese character [\#166](https://github.com/knsv/mermaid/issues/166)
+- Broken Examples [\#163](https://github.com/knsv/mermaid/issues/163)
+- uglifyjs wanrings which means we can improve the code [\#156](https://github.com/knsv/mermaid/issues/156)
+- New\(er\) features unavailable in downloadable js files? [\#151](https://github.com/knsv/mermaid/issues/151)
+- Add gh-gapes link to description [\#143](https://github.com/knsv/mermaid/issues/143)
+- Some examples not displayed on Firefox 36.0.1 [\#138](https://github.com/knsv/mermaid/issues/138)
+- tags ending in a "v" don't render [\#132](https://github.com/knsv/mermaid/issues/132)
+- Links in flowchart [\#131](https://github.com/knsv/mermaid/issues/131)
+- Using the library for iOS development [\#130](https://github.com/knsv/mermaid/issues/130)
+- Add a css file, mermaid.css, with default styling [\#122](https://github.com/knsv/mermaid/issues/122)
+- Add capability for gantt diagrams [\#118](https://github.com/knsv/mermaid/issues/118)
+- lower case v causes error in the parser [\#108](https://github.com/knsv/mermaid/issues/108)
+- Label's css conflict with boostrap's .label [\#67](https://github.com/knsv/mermaid/issues/67)
+- TypeError: Cannot read property 'layout' of undefined [\#37](https://github.com/knsv/mermaid/issues/37)
+- software architecture diagram [\#36](https://github.com/knsv/mermaid/issues/36)
+- Support for bar charts and pie diagrams [\#22](https://github.com/knsv/mermaid/issues/22)
+
+**Merged pull requests:**
+
+- Dev 0.5.0 [\#168](https://github.com/knsv/mermaid/pull/168) ([knsv](https://github.com/knsv))
+- Fix spacing [\#164](https://github.com/knsv/mermaid/pull/164) ([rhcarvalho](https://github.com/rhcarvalho))
+- Fixing typo: "Think" -\> "Thick" [\#160](https://github.com/knsv/mermaid/pull/160) ([it0a](https://github.com/it0a))
+- IE, local html, cssRules access is denied [\#155](https://github.com/knsv/mermaid/pull/155) ([tylerlong](https://github.com/tylerlong))
+- Add automatically generated change log file. [\#139](https://github.com/knsv/mermaid/pull/139) ([skywinder](https://github.com/skywinder))
+- Adding init argument to the global API [\#137](https://github.com/knsv/mermaid/pull/137) ([bollwyvl](https://github.com/bollwyvl))
+- Add description of manual calling of init [\#136](https://github.com/knsv/mermaid/pull/136) ([bollwyvl](https://github.com/bollwyvl))
+- Allow other forms of node selection for init\(\) [\#135](https://github.com/knsv/mermaid/pull/135) ([bollwyvl](https://github.com/bollwyvl))
+- Use a library-level variable for assigning ids [\#134](https://github.com/knsv/mermaid/pull/134) ([bollwyvl](https://github.com/bollwyvl))
+
+## [0.4.0](https://github.com/knsv/mermaid/tree/0.4.0) (2015-03-01)
+
+[Full Changelog](https://github.com/knsv/mermaid/compare/0.3.5...0.4.0)
+
+**Closed issues:**
+
+- subgraph background is black in rendered flowchart PNG via CLI [\#121](https://github.com/knsv/mermaid/issues/121)
+- Integrate editor at https://github.com/naseer/mermaid-webapp [\#110](https://github.com/knsv/mermaid/issues/110)
+- Internet Explorer Support [\#99](https://github.com/knsv/mermaid/issues/99)
+- Asymmetric shapes not documented [\#82](https://github.com/knsv/mermaid/issues/82)
+- NoModificationAllowedError [\#23](https://github.com/knsv/mermaid/issues/23)
+- Improve arrows [\#3](https://github.com/knsv/mermaid/issues/3)
+
+## [0.3.5](https://github.com/knsv/mermaid/tree/0.3.5) (2015-02-15)
+
+[Full Changelog](https://github.com/knsv/mermaid/compare/0.3.4...0.3.5)
+
+## [0.3.4](https://github.com/knsv/mermaid/tree/0.3.4) (2015-02-15)
+
+[Full Changelog](https://github.com/knsv/mermaid/compare/0.3.3...0.3.4)
+
+**Closed issues:**
+
+- Subgraph syntax bug? [\#120](https://github.com/knsv/mermaid/issues/120)
+- Live editor [\#115](https://github.com/knsv/mermaid/issues/115)
+- Error in "Basic Syntax" wiki page [\#113](https://github.com/knsv/mermaid/issues/113)
+- semicolons, anyone? [\#111](https://github.com/knsv/mermaid/issues/111)
+- undefined `sequenceConfig` fails [\#109](https://github.com/knsv/mermaid/issues/109)
+- Sequence Diagrams: Show Actors below as well [\#106](https://github.com/knsv/mermaid/issues/106)
+- Allow overriding sequence diagram configuration \(SVG properties\) [\#103](https://github.com/knsv/mermaid/issues/103)
+- Error when rendering A-- This is the text -- B [\#102](https://github.com/knsv/mermaid/issues/102)
+- Clipping in documentation [\#97](https://github.com/knsv/mermaid/issues/97)
+- isolate class styling to the svg container [\#92](https://github.com/knsv/mermaid/issues/92)
+- Apply styling from css when using the CLI utility [\#85](https://github.com/knsv/mermaid/issues/85)
+- Generated SVG works poorly outside web browsers [\#58](https://github.com/knsv/mermaid/issues/58)
+- Make the new graph declaration more visual [\#40](https://github.com/knsv/mermaid/issues/40)
+- Generating SVG text blob for use in Node [\#2](https://github.com/knsv/mermaid/issues/2)
+
+**Merged pull requests:**
+
+- Add live editor [\#119](https://github.com/knsv/mermaid/pull/119) ([naseer](https://github.com/naseer))
+- Adds CSS option to the CLI [\#116](https://github.com/knsv/mermaid/pull/116) ([fardog](https://github.com/fardog))
+- Update flowchart.md in response Issue \#113 [\#114](https://github.com/knsv/mermaid/pull/114) ([vijay40](https://github.com/vijay40))
+- Ignore all files except the license and dist/ folder when installing with Bower. [\#112](https://github.com/knsv/mermaid/pull/112) ([jasonbellamy](https://github.com/jasonbellamy))
+
+## [0.3.3](https://github.com/knsv/mermaid/tree/0.3.3) (2015-01-25)
+
+[Full Changelog](https://github.com/knsv/mermaid/compare/0.3.2...0.3.3)
+
+**Closed issues:**
+
+- Missing arrows in sequence diagram [\#98](https://github.com/knsv/mermaid/issues/98)
+- Error with \>9 linkStyles [\#95](https://github.com/knsv/mermaid/issues/95)
+- Support for dotted links [\#26](https://github.com/knsv/mermaid/issues/26)
+
+**Merged pull requests:**
+
+- Require d3 directly to better support Node usage [\#107](https://github.com/knsv/mermaid/pull/107) ([markdalgleish](https://github.com/markdalgleish))
+- update doc with -c option [\#105](https://github.com/knsv/mermaid/pull/105) ([jjmr](https://github.com/jjmr))
+- Add new parameter to the console client to override the svg configuration in sequence diagrams [\#104](https://github.com/knsv/mermaid/pull/104) ([jjmr](https://github.com/jjmr))
+- Text based labels, new shape [\#101](https://github.com/knsv/mermaid/pull/101) ([bjowes](https://github.com/bjowes))
+- fix html tags in example usage [\#100](https://github.com/knsv/mermaid/pull/100) ([deiwin](https://github.com/deiwin))
+
+## [0.3.2](https://github.com/knsv/mermaid/tree/0.3.2) (2015-01-11)
+
+[Full Changelog](https://github.com/knsv/mermaid/compare/0.3.1...0.3.2)
+
+**Closed issues:**
+
+- disable auto render [\#91](https://github.com/knsv/mermaid/issues/91)
+- Tidy breaks mermaid \(linebreaks in \\) [\#87](https://github.com/knsv/mermaid/issues/87)
+- Bug: \ being rendered as text in node [\#73](https://github.com/knsv/mermaid/issues/73)
+- Graph edges appear to render outside of the canvas [\#70](https://github.com/knsv/mermaid/issues/70)
+- Make link text look like it is on the line [\#53](https://github.com/knsv/mermaid/issues/53)
+
+**Merged pull requests:**
+
+- Merge pull request \#1 from knsv/master [\#96](https://github.com/knsv/mermaid/pull/96) ([gkchic](https://github.com/gkchic))
+- Removed duplicated section in flowchart docs [\#94](https://github.com/knsv/mermaid/pull/94) ([kaime](https://github.com/kaime))
+- Grammar changes to sequence page [\#93](https://github.com/knsv/mermaid/pull/93) ([gkchic](https://github.com/gkchic))
+- GitHub buttons [\#89](https://github.com/knsv/mermaid/pull/89) ([gkchic](https://github.com/gkchic))
+- Template change [\#88](https://github.com/knsv/mermaid/pull/88) ([gkchic](https://github.com/gkchic))
+
+## [0.3.1](https://github.com/knsv/mermaid/tree/0.3.1) (2015-01-05)
+
+[Full Changelog](https://github.com/knsv/mermaid/compare/0.3.0...0.3.1)
+
+**Closed issues:**
+
+- Non ASCII chars in labels [\#84](https://github.com/knsv/mermaid/issues/84)
+- 'undefined' titles of Quicklinks on the usage page [\#80](https://github.com/knsv/mermaid/issues/80)
+- \[cli\] Enhancement proposal: not fail --version / --help if phantomjs isn't installed [\#71](https://github.com/knsv/mermaid/issues/71)
+- Neural Networks [\#39](https://github.com/knsv/mermaid/issues/39)
+- Support for sequence diagrams [\#16](https://github.com/knsv/mermaid/issues/16)
+- Client utility for mermaid [\#6](https://github.com/knsv/mermaid/issues/6)
+
+**Merged pull requests:**
+
+- Flowchart doc: Text in the circle now in a circle [\#81](https://github.com/knsv/mermaid/pull/81) ([Grahack](https://github.com/Grahack))
+- Fix for issue \#73 [\#79](https://github.com/knsv/mermaid/pull/79) ([it0a](https://github.com/it0a))
+- Ink template [\#78](https://github.com/knsv/mermaid/pull/78) ([gkchic](https://github.com/gkchic))
+- Show help and version even if phantom isn't present. Fixes \#71 [\#75](https://github.com/knsv/mermaid/pull/75) ([fardog](https://github.com/fardog))
+- Add apostrophe & 'and' [\#72](https://github.com/knsv/mermaid/pull/72) ([sudodoki](https://github.com/sudodoki))
+
+## [0.3.0](https://github.com/knsv/mermaid/tree/0.3.0) (2014-12-22)
+
+[Full Changelog](https://github.com/knsv/mermaid/compare/0.2.16...0.3.0)
+
+**Closed issues:**
+
+- Consider shipping a standalone executable [\#65](https://github.com/knsv/mermaid/issues/65)
+- Trailing whitespace at the end of lines is not ignored [\#55](https://github.com/knsv/mermaid/issues/55)
+- How do I do comments? [\#47](https://github.com/knsv/mermaid/issues/47)
+- This characters failed the lexical parsing [\#46](https://github.com/knsv/mermaid/issues/46)
+- tutorial for creating new type of graph/layout [\#44](https://github.com/knsv/mermaid/issues/44)
+- Improve readability with new line as terminator and whitespace [\#38](https://github.com/knsv/mermaid/issues/38)
+- Use classes instead of inline style for easy styling [\#24](https://github.com/knsv/mermaid/issues/24)
+
+**Merged pull requests:**
+
+- Adds Command Line Interface for generating PNGs from mermaid description files [\#69](https://github.com/knsv/mermaid/pull/69) ([fardog](https://github.com/fardog))
+- Allow special symbols for direction along with acronyms [\#66](https://github.com/knsv/mermaid/pull/66) ([vijay40](https://github.com/vijay40))
+
+## [0.2.16](https://github.com/knsv/mermaid/tree/0.2.16) (2014-12-15)
+
+[Full Changelog](https://github.com/knsv/mermaid/compare/0.2.15...0.2.16)
+
+**Closed issues:**
+
+- Mermaid not rendering properly on Wordpress pages [\#59](https://github.com/knsv/mermaid/issues/59)
+- Improve example page with live demo [\#52](https://github.com/knsv/mermaid/issues/52)
+- Create image file via CLI? [\#48](https://github.com/knsv/mermaid/issues/48)
+- Does not render upon AngularJS Updates [\#45](https://github.com/knsv/mermaid/issues/45)
+- Download link in README.MD doesn't work. [\#42](https://github.com/knsv/mermaid/issues/42)
+- linkStyle usage is not obvious [\#41](https://github.com/knsv/mermaid/issues/41)
+- Move \*.spec.js in src/ to test/ [\#35](https://github.com/knsv/mermaid/issues/35)
+- Lines routed outside visible area [\#19](https://github.com/knsv/mermaid/issues/19)
+
+**Merged pull requests:**
+
+- New grammar will allow statements ending without semicolon as disccused in Issue \#38 [\#63](https://github.com/knsv/mermaid/pull/63) ([vijay40](https://github.com/vijay40))
+- Class based styling [\#62](https://github.com/knsv/mermaid/pull/62) ([bjowes](https://github.com/bjowes))
+- Fix typos [\#60](https://github.com/knsv/mermaid/pull/60) ([sublimino](https://github.com/sublimino))
+- Included .DS_Store in gitignore [\#57](https://github.com/knsv/mermaid/pull/57) ([alvynmcq](https://github.com/alvynmcq))
+- Improves readablity discussed in issue \#38 [\#56](https://github.com/knsv/mermaid/pull/56) ([vijay40](https://github.com/vijay40))
+- Added a linting task for gulp [\#43](https://github.com/knsv/mermaid/pull/43) ([serv](https://github.com/serv))
+
+## [0.2.15](https://github.com/knsv/mermaid/tree/0.2.15) (2014-12-05)
+
+[Full Changelog](https://github.com/knsv/mermaid/compare/0.2.14...0.2.15)
+
+**Closed issues:**
+
+- Question marks don't render properly with /dist/mermaid.full.min.js [\#30](https://github.com/knsv/mermaid/issues/30)
+- Error with some characters [\#25](https://github.com/knsv/mermaid/issues/25)
+- Provide parse function in browser without `require`? [\#21](https://github.com/knsv/mermaid/issues/21)
+- Better label text support [\#18](https://github.com/knsv/mermaid/issues/18)
+- Cap-cased words break parser [\#8](https://github.com/knsv/mermaid/issues/8)
+
+**Merged pull requests:**
+
+- Include bower_components/ to .gitignore [\#33](https://github.com/knsv/mermaid/pull/33) ([serv](https://github.com/serv))
+- Fixed reference to Git repo. [\#32](https://github.com/knsv/mermaid/pull/32) ([guyellis](https://github.com/guyellis))
+
+## [0.2.14](https://github.com/knsv/mermaid/tree/0.2.14) (2014-12-03)
+
+[Full Changelog](https://github.com/knsv/mermaid/compare/0.2.13...0.2.14)
+
+## [0.2.13](https://github.com/knsv/mermaid/tree/0.2.13) (2014-12-03)
+
+[Full Changelog](https://github.com/knsv/mermaid/compare/0.2.10...0.2.13)
+
+**Closed issues:**
+
+- modified init to be applied more than once [\#29](https://github.com/knsv/mermaid/issues/29)
+- Wanted to know build process for the project. [\#28](https://github.com/knsv/mermaid/issues/28)
+- Container support [\#27](https://github.com/knsv/mermaid/issues/27)
+- can not support Chinese description [\#20](https://github.com/knsv/mermaid/issues/20)
+- Node Label text mistaken for Direction [\#17](https://github.com/knsv/mermaid/issues/17)
+- Support unicode chars in labels [\#9](https://github.com/knsv/mermaid/issues/9)
+- Publish to NPM [\#7](https://github.com/knsv/mermaid/issues/7)
+
+## [0.2.10](https://github.com/knsv/mermaid/tree/0.2.10) (2014-12-01)
+
+[Full Changelog](https://github.com/knsv/mermaid/compare/0.2.9...0.2.10)
+
+## [0.2.9](https://github.com/knsv/mermaid/tree/0.2.9) (2014-12-01)
+
+[Full Changelog](https://github.com/knsv/mermaid/compare/0.2.8...0.2.9)
+
+**Closed issues:**
+
+- Add link to jsbin playground to README [\#11](https://github.com/knsv/mermaid/issues/11)
+- What are the requirements ? [\#10](https://github.com/knsv/mermaid/issues/10)
+
+**Merged pull requests:**
+
+- Allow unicode chars in labels [\#13](https://github.com/knsv/mermaid/pull/13) ([codebeige](https://github.com/codebeige))
+
+## [0.2.8](https://github.com/knsv/mermaid/tree/0.2.8) (2014-12-01)
+
+[Full Changelog](https://github.com/knsv/mermaid/compare/0.2.7...0.2.8)
+
+## [0.2.7](https://github.com/knsv/mermaid/tree/0.2.7) (2014-12-01)
+
+[Full Changelog](https://github.com/knsv/mermaid/compare/0.2.6...0.2.7)
+
+**Closed issues:**
+
+- Provide parser as separate module [\#4](https://github.com/knsv/mermaid/issues/4)
+
+## [0.2.6](https://github.com/knsv/mermaid/tree/0.2.6) (2014-11-27)
+
+[Full Changelog](https://github.com/knsv/mermaid/compare/0.2.5...0.2.6)
+
+## [0.2.5](https://github.com/knsv/mermaid/tree/0.2.5) (2014-11-27)
+
+[Full Changelog](https://github.com/knsv/mermaid/compare/0.2.4...0.2.5)
+
+**Merged pull requests:**
+
+- Added new shapes! [\#1](https://github.com/knsv/mermaid/pull/1) ([bjowes](https://github.com/bjowes))
+
+## [0.2.4](https://github.com/knsv/mermaid/tree/0.2.4) (2014-11-25)
+
+[Full Changelog](https://github.com/knsv/mermaid/compare/0.2.3...0.2.4)
+
+## [0.2.3](https://github.com/knsv/mermaid/tree/0.2.3) (2014-11-24)
+
+[Full Changelog](https://github.com/knsv/mermaid/compare/0.2.2...0.2.3)
+
+## [0.2.2](https://github.com/knsv/mermaid/tree/0.2.2) (2014-11-22)
+
+[Full Changelog](https://github.com/knsv/mermaid/compare/0.2.1...0.2.2)
+
+## [0.2.1](https://github.com/knsv/mermaid/tree/0.2.1) (2014-11-22)
+
+[Full Changelog](https://github.com/knsv/mermaid/compare/0.2.0...0.2.1)
+
+## [0.2.0](https://github.com/knsv/mermaid/tree/0.2.0) (2014-11-22)
+
+[Full Changelog](https://github.com/knsv/mermaid/compare/0.1.1...0.2.0)
+
+## [0.1.1](https://github.com/knsv/mermaid/tree/0.1.1) (2014-11-17)
+
+[Full Changelog](https://github.com/knsv/mermaid/compare/0.1.0...0.1.1)
+
+## [0.1.0](https://github.com/knsv/mermaid/tree/0.1.0) (2014-11-16)

From 6b1b0bf15136ac1710b0472df3db324951a490fa Mon Sep 17 00:00:00 2001
From: Sidharth Vinod 
Date: Thu, 17 Jul 2025 12:45:46 +0530
Subject: [PATCH 052/143] chore: Add symlink

---
 CHANGELOG.md | 1 +
 1 file changed, 1 insertion(+)
 create mode 120000 CHANGELOG.md

diff --git a/CHANGELOG.md b/CHANGELOG.md
new file mode 120000
index 000000000..c68d3f76d
--- /dev/null
+++ b/CHANGELOG.md
@@ -0,0 +1 @@
+./packages/mermaid/CHANGELOG.md
\ No newline at end of file

From 54640ce476bee4f13d1b06374604d96b093d12a8 Mon Sep 17 00:00:00 2001
From: darshanr0107 
Date: Thu, 17 Jul 2025 20:11:21 +0530
Subject: [PATCH 053/143] resolved PR comments

on-behalf-of: @Mermaid-Chart 
---
 .../mermaid/src/diagrams/block/blockDB.ts     |  2 +-
 .../src/diagrams/block/parser/block.spec.ts   | 29 +++++++++++--------
 2 files changed, 18 insertions(+), 13 deletions(-)

diff --git a/packages/mermaid/src/diagrams/block/blockDB.ts b/packages/mermaid/src/diagrams/block/blockDB.ts
index 3974d6d00..39a8b47a0 100644
--- a/packages/mermaid/src/diagrams/block/blockDB.ts
+++ b/packages/mermaid/src/diagrams/block/blockDB.ts
@@ -102,7 +102,7 @@ const populateBlockDatabase = (_blockList: Block[], parent: Block): void => {
       typeof block.widthInColumns === 'number' &&
       block.widthInColumns > column
     ) {
-      throw new Error(
+      log.warn(
         `Block ${block.id} width ${block.widthInColumns} exceeds configured column width ${column}`
       );
     }
diff --git a/packages/mermaid/src/diagrams/block/parser/block.spec.ts b/packages/mermaid/src/diagrams/block/parser/block.spec.ts
index 2dc79e2ec..21da4e440 100644
--- a/packages/mermaid/src/diagrams/block/parser/block.spec.ts
+++ b/packages/mermaid/src/diagrams/block/parser/block.spec.ts
@@ -1,6 +1,7 @@
 // @ts-ignore: jison doesn't export types
 import block from './block.jison';
 import db from '../blockDB.js';
+import { log } from '../../../logger.js';
 
 describe('Block diagram', function () {
   describe('when parsing a block diagram graph it should handle > ', function () {
@@ -402,20 +403,24 @@ columns 1
       const B = blocks[0];
       expect(B.styles).toContain('fill:#f9F');
     });
-    it('should throw error when block width exceeds column width', () => {
+    it('should log a warning when block width exceeds column width', () => {
       const str = `block-beta
-    columns 1
-    A:1
-    B:2
-    C:3
-    D:4
-    E:3
-    F:2
-    G:1`;
+  columns 1
+  A:1
+  B:2
+  C:3
+  D:4
+  E:3
+  F:2
+  G:1`;
 
-      expect(() => block.parse(str)).toThrowError(
-        'Block B width 2 exceeds configured column width 1'
-      );
+      const logWarnSpy = vi.spyOn(log, 'warn').mockImplementation(() => undefined);
+
+      block.parse(str);
+
+      expect(logWarnSpy).toHaveBeenCalledWith('Block B width 2 exceeds configured column width 1');
+
+      logWarnSpy.mockRestore();
     });
   });
 

From 37bfa2aa7515bbf47f731eafcd8264179f12aae9 Mon Sep 17 00:00:00 2001
From: "autofix-ci[bot]" <114827586+autofix-ci[bot]@users.noreply.github.com>
Date: Thu, 17 Jul 2025 14:46:30 +0000
Subject: [PATCH 054/143] [autofix.ci] apply automated fixes

---
 packages/tiny/CHANGELOG.md | 1002 ++++++++++++++++++++++++++++++++++++
 1 file changed, 1002 insertions(+)

diff --git a/packages/tiny/CHANGELOG.md b/packages/tiny/CHANGELOG.md
index c57e2a6db..8cdd3c6d4 100644
--- a/packages/tiny/CHANGELOG.md
+++ b/packages/tiny/CHANGELOG.md
@@ -258,3 +258,1005 @@
 
 - Updated dependencies [[`5013484`](https://github.com/mermaid-js/mermaid/commit/50134849246141ec400e33e08c12c10539b84de9)]:
   - @mermaid-js/parser@0.1.0
+
+## [10.0.0](https://github.com/mermaid-js/mermaid/releases/tag/v10.0.0)
+
+### Mermaid is ESM only!
+
+We've dropped CJS support. So, you will have to update your import scripts as follows.
+
+```html
+
+```
+
+You can keep using v9 by adding the `@9` in the CDN URL.
+
+```diff
+- 
++ 
+```
+
+### mermaid.render is async and doesn't accept callbacks
+
+```js
+// < v10
+mermaid.render('id', 'graph TD;\nA-->B', (svg, bindFunctions) => {
+  element.innerHTML = svg;
+  if (bindFunctions) {
+    bindFunctions(element);
+  }
+});
+
+// Shorter syntax
+if (bindFunctions) {
+  bindFunctions(element);
+}
+// can be replaced with the `?.` shorthand
+bindFunctions?.(element);
+
+// >= v10 with async/await
+const { svg, bindFunctions } = await mermaid.render('id', 'graph TD;\nA-->B');
+element.innerHTML = svg;
+bindFunctions?.(element);
+
+// >= v10 with promise.then
+mermaid.render('id', 'graph TD;A-->B').then(({ svg, bindFunctions }) => {
+  element.innerHTML = svg;
+  bindFunctions?.(element);
+});
+```
+
+### mermaid.parse is async and ParseError is removed
+
+```js
+// < v10
+mermaid.parse(text, parseError);
+
+//>= v10
+await mermaid.parse(text).catch(parseError);
+// or
+try {
+  await mermaid.parse(text);
+} catch (err) {
+  parseError(err);
+}
+```
+
+### Init deprecated and InitThrowsErrors removed
+
+The config passed to `init` was not being used earlier.
+It will now be used.
+The `init` function is deprecated and will be removed in the next major release.
+init currently works as a wrapper to `initialize` and `run`.
+
+```js
+// < v10
+mermaid.init(config, selector, cb);
+
+//>= v10
+mermaid.initialize(config);
+mermaid.run({
+  querySelector: selector,
+  postRenderCallback: cb,
+  suppressErrors: true,
+});
+```
+
+```js
+// < v10
+mermaid.initThrowsErrors(config, selector, cb);
+
+//>= v10
+mermaid.initialize(config);
+mermaid.run({
+  querySelector: selector,
+  postRenderCallback: cb,
+  suppressErrors: false,
+});
+```
+
+// TODO: Populate changelog pre v10
+
+- Config has a lot of changes
+- globalReset resets to `defaultConfig` instead of current config. Use `reset` instead.
+
+## [Unreleased](https://github.com/knsv/mermaid/tree/HEAD)
+
+[Full Changelog](https://github.com/knsv/mermaid/compare/8.2.0...HEAD)
+
+**Closed issues:**
+
+- Cross-Site Scripting:DOM - Issue [\#847](https://github.com/knsv/mermaid/issues/847)
+
+## [8.2.0](https://github.com/knsv/mermaid/tree/8.2.0) (2019-07-17)
+
+[Full Changelog](https://github.com/knsv/mermaid/compare/8.1.0...8.2.0)
+
+**Closed issues:**
+
+- Create issue templates [\#871](https://github.com/knsv/mermaid/issues/871)
+- cross site scripting in mermaid [\#869](https://github.com/knsv/mermaid/issues/869)
+- Make Gantt chart date inclusive [\#868](https://github.com/knsv/mermaid/issues/868)
+- CHANGELOG missing updates for all versions since 0.4.0 [\#865](https://github.com/knsv/mermaid/issues/865)
+- please add tag for 8.0.0 release [\#863](https://github.com/knsv/mermaid/issues/863)
+- classDiagram breaks on any edit [\#858](https://github.com/knsv/mermaid/issues/858)
+- found 1 high severity vulnerability [\#839](https://github.com/knsv/mermaid/issues/839)
+- Missing fontawesome icon support [\#830](https://github.com/knsv/mermaid/issues/830)
+- Docs for integration with wiki.js? [\#829](https://github.com/knsv/mermaid/issues/829)
+- Is this project still maintained? [\#826](https://github.com/knsv/mermaid/issues/826)
+- typora [\#823](https://github.com/knsv/mermaid/issues/823)
+- Maintain the order of the nodes in Flowchart [\#815](https://github.com/knsv/mermaid/issues/815)
+- Overlap, Overflow and cut titles in flowchart [\#814](https://github.com/knsv/mermaid/issues/814)
+- How load mermaidApi notejs electron [\#813](https://github.com/knsv/mermaid/issues/813)
+- How to set the spacing between the text of the flowchart node and the border? [\#812](https://github.com/knsv/mermaid/issues/812)
+- no triming participant name and the name following spaces is as another actor in sequence [\#809](https://github.com/knsv/mermaid/issues/809)
+- uml Class as shape type [\#807](https://github.com/knsv/mermaid/issues/807)
+- Force-directed graph Layout Style [\#806](https://github.com/knsv/mermaid/issues/806)
+- how can I start a newLine in FlowChart [\#805](https://github.com/knsv/mermaid/issues/805)
+- UOEProcessShow [\#801](https://github.com/knsv/mermaid/issues/801)
+- Why the use of code blocks? [\#799](https://github.com/knsv/mermaid/issues/799)
+- fixing class diagram [\#794](https://github.com/knsv/mermaid/issues/794)
+- Autonumber support in sequence diagrams [\#782](https://github.com/knsv/mermaid/issues/782)
+- MomentJS dependency [\#781](https://github.com/knsv/mermaid/issues/781)
+- Feature : Can we color code the flow/arrows [\#766](https://github.com/knsv/mermaid/issues/766)
+- Is there any way to convert flowchart.js code to mermaid code [\#726](https://github.com/knsv/mermaid/issues/726)
+- Fixed width of nodes [\#653](https://github.com/knsv/mermaid/issues/653)
+- Inline comment [\#650](https://github.com/knsv/mermaid/issues/650)
+- alt attribute of img tag in HTML [\#619](https://github.com/knsv/mermaid/issues/619)
+- Just wanted to say : THANKS ! [\#618](https://github.com/knsv/mermaid/issues/618)
+- "animation" [\#446](https://github.com/knsv/mermaid/issues/446)
+
+**Merged pull requests:**
+
+- Trimming whitespace after participant id [\#882](https://github.com/knsv/mermaid/pull/882) ([IOrlandoni](https://github.com/IOrlandoni))
+- chore\(deps\): bump atob from 2.0.3 to 2.1.2 [\#881](https://github.com/knsv/mermaid/pull/881) ([dependabot[bot]](https://github.com/apps/dependabot))
+- chore\(deps\): bump fstream from 1.0.11 to 1.0.12 [\#880](https://github.com/knsv/mermaid/pull/880) ([dependabot[bot]](https://github.com/apps/dependabot))
+- chore\(deps\): bump js-yaml from 3.12.0 to 3.13.1 [\#879](https://github.com/knsv/mermaid/pull/879) ([dependabot[bot]](https://github.com/apps/dependabot))
+- I847 cross site scripting [\#878](https://github.com/knsv/mermaid/pull/878) ([knsv](https://github.com/knsv))
+- Bump lodash.mergewith from 4.6.1 to 4.6.2 [\#877](https://github.com/knsv/mermaid/pull/877) ([dependabot[bot]](https://github.com/apps/dependabot))
+- Adding docs into core repo again [\#876](https://github.com/knsv/mermaid/pull/876) ([knsv](https://github.com/knsv))
+- Bump lodash from 4.17.11 to 4.17.13 [\#875](https://github.com/knsv/mermaid/pull/875) ([dependabot[bot]](https://github.com/apps/dependabot))
+- feat\(stale.yml\): update issue label and bot comment [\#874](https://github.com/knsv/mermaid/pull/874) ([ThePenguin1140](https://github.com/ThePenguin1140))
+- Feature/allow inclusive enddates [\#872](https://github.com/knsv/mermaid/pull/872) ([ThePenguin1140](https://github.com/ThePenguin1140))
+- Adding trapezoid and inverse trapezoid vertex options. [\#741](https://github.com/knsv/mermaid/pull/741) ([adamwulf](https://github.com/adamwulf))
+
+## [8.1.0](https://github.com/knsv/mermaid/tree/8.1.0) (2019-06-25)
+
+[Full Changelog](https://github.com/knsv/mermaid/compare/7.0.5...8.1.0)
+
+**Closed issues:**
+
+- Gantt and sequence diagram do not render [\#853](https://github.com/knsv/mermaid/issues/853)
+- margins around flowchart are not balanced [\#852](https://github.com/knsv/mermaid/issues/852)
+- Smaller bundles [\#843](https://github.com/knsv/mermaid/issues/843)
+- unicode in labels [\#776](https://github.com/knsv/mermaid/issues/776)
+- Hard-changing drawing of arrows per edge type [\#775](https://github.com/knsv/mermaid/issues/775)
+- SequenceDiagram wrong [\#773](https://github.com/knsv/mermaid/issues/773)
+- Render mermaid on github pages with simple code [\#772](https://github.com/knsv/mermaid/issues/772)
+- FlowChart - large space between text and the image [\#754](https://github.com/knsv/mermaid/issues/754)
+- Class Diagram Issues when using Mermaid in Stackedit [\#748](https://github.com/knsv/mermaid/issues/748)
+- Multi-platform CI [\#744](https://github.com/knsv/mermaid/issues/744)
+- gantt: sections can't have a colon [\#742](https://github.com/knsv/mermaid/issues/742)
+- Yarn build does not add mermaid.min.css to dist [\#732](https://github.com/knsv/mermaid/issues/732)
+- Is there a grammar / keyword / more than just the basic examples? [\#718](https://github.com/knsv/mermaid/issues/718)
+- Click event and react component [\#717](https://github.com/knsv/mermaid/issues/717)
+- Long text going outside the box [\#706](https://github.com/knsv/mermaid/issues/706)
+- How to migrate from yUML to mermaid? [\#704](https://github.com/knsv/mermaid/issues/704)
+- Issue on Dynamic Creation in PHP [\#690](https://github.com/knsv/mermaid/issues/690)
+- `click "\#target"` and `click "http://url"` should create regular links [\#689](https://github.com/knsv/mermaid/issues/689)
+- Support Chinese punctuation [\#687](https://github.com/knsv/mermaid/issues/687)
+- \[Question\] Proper way to install on Mac? [\#681](https://github.com/knsv/mermaid/issues/681)
+- Has Mermaid a graphical interface to make diagrams? [\#668](https://github.com/knsv/mermaid/issues/668)
+- mermaid installation on debian [\#649](https://github.com/knsv/mermaid/issues/649)
+- "Cannot activate" in sequenceDiagram [\#647](https://github.com/knsv/mermaid/issues/647)
+- Link \("click" statement\) in flowchart does not work in exported SVG [\#646](https://github.com/knsv/mermaid/issues/646)
+- How to pass styling [\#639](https://github.com/knsv/mermaid/issues/639)
+- The live editor can't show seq diagram with notes for 8.0.0-alpha.3 [\#638](https://github.com/knsv/mermaid/issues/638)
+- import mermaid.css with ES6 + NPM [\#634](https://github.com/knsv/mermaid/issues/634)
+- Actor line cuts through other elements [\#633](https://github.com/knsv/mermaid/issues/633)
+- Graph TD line out of the picture \(left side\) [\#630](https://github.com/knsv/mermaid/issues/630)
+- Flowchart labels appear "cutoff" [\#628](https://github.com/knsv/mermaid/issues/628)
+- Uncaught TypeError: \_.constant is not a function \(mermaid.js\) [\#626](https://github.com/knsv/mermaid/issues/626)
+- Missing tags and releases for newer versions [\#623](https://github.com/knsv/mermaid/issues/623)
+- Mermaid and Leo / Leo Vue [\#622](https://github.com/knsv/mermaid/issues/622)
+- mermaidAPI gantt Vue.js [\#621](https://github.com/knsv/mermaid/issues/621)
+- Gantt sections are not separated by colors - Fix: set numberSectionStyles to 4 instead of 3 [\#620](https://github.com/knsv/mermaid/issues/620)
+- how to get mermaidAPI? [\#617](https://github.com/knsv/mermaid/issues/617)
+- Error in startOnLoad documentation? [\#616](https://github.com/knsv/mermaid/issues/616)
+- Example export to SVG generates error [\#614](https://github.com/knsv/mermaid/issues/614)
+- The new online editor does not support previously generated links [\#613](https://github.com/knsv/mermaid/issues/613)
+- Grammar / Syntax documentation for flowcharts [\#607](https://github.com/knsv/mermaid/issues/607)
+- Mermaid does not work with d3.js [\#606](https://github.com/knsv/mermaid/issues/606)
+- Why does this code's flowchart lines get cut-off on screen? [\#604](https://github.com/knsv/mermaid/issues/604)
+- click keyword does not fire my callback \(on the demo Website too\) [\#603](https://github.com/knsv/mermaid/issues/603)
+- Online Editor fails to show exported SVG [\#601](https://github.com/knsv/mermaid/issues/601)
+- Just saying thanks! [\#597](https://github.com/knsv/mermaid/issues/597)
+- stylesheet crashed with other library like abcjs [\#596](https://github.com/knsv/mermaid/issues/596)
+- Missing connection [\#594](https://github.com/knsv/mermaid/issues/594)
+- How to use mermaid on node.js restful api? [\#593](https://github.com/knsv/mermaid/issues/593)
+- Remove status code [\#589](https://github.com/knsv/mermaid/issues/589)
+- Golang based editor [\#588](https://github.com/knsv/mermaid/issues/588)
+- sequenceDiagram -\> notetext css font is hardcoded [\#587](https://github.com/knsv/mermaid/issues/587)
+- Multiple graph in the live editor [\#586](https://github.com/knsv/mermaid/issues/586)
+- All \ elements in page are colored black [\#584](https://github.com/knsv/mermaid/issues/584)
+- Styling: classes aren't applied to elements. [\#582](https://github.com/knsv/mermaid/issues/582)
+- Rounded connections [\#580](https://github.com/knsv/mermaid/issues/580)
+- Arrows are not being shown correctly in the dark theme [\#578](https://github.com/knsv/mermaid/issues/578)
+- The documentation for CLI seems outdated. [\#572](https://github.com/knsv/mermaid/issues/572)
+- No effect of click event:can not open link [\#571](https://github.com/knsv/mermaid/issues/571)
+- Text colors are not correct in VSCODE [\#570](https://github.com/knsv/mermaid/issues/570)
+- Nodes aren't aligned properly \(just need an explanation\) [\#568](https://github.com/knsv/mermaid/issues/568)
+- setting margin around figure in R [\#567](https://github.com/knsv/mermaid/issues/567)
+- Arrows should Come out in upward and Downward direction from decision Node [\#566](https://github.com/knsv/mermaid/issues/566)
+- TypeError: Cannot read property 'select' of undefined [\#563](https://github.com/knsv/mermaid/issues/563)
+- A little bug [\#557](https://github.com/knsv/mermaid/issues/557)
+- Japanese text appears garbled [\#554](https://github.com/knsv/mermaid/issues/554)
+- classdiagram not works in mermaid live_editor [\#553](https://github.com/knsv/mermaid/issues/553)
+- font awesome in link text? [\#546](https://github.com/knsv/mermaid/issues/546)
+- q: heard of the cosmogol standard? [\#545](https://github.com/knsv/mermaid/issues/545)
+- Arrow heads missing \(cli, 7.0.3\) [\#544](https://github.com/knsv/mermaid/issues/544)
+- No Edge Boxes if useHtmlLabels=false [\#541](https://github.com/knsv/mermaid/issues/541)
+- how to change mermaid text color or line text block color? [\#534](https://github.com/knsv/mermaid/issues/534)
+- FlowChart visualization broken when downloading from live editor [\#533](https://github.com/knsv/mermaid/issues/533)
+- Can't get flowchart to render paths at the top of the diagram; I even tried the online editor and that shows the same issue. Thoughts? [\#532](https://github.com/knsv/mermaid/issues/532)
+- live editor make browser\(safari on macOS&iOS\) not longer respond [\#531](https://github.com/knsv/mermaid/issues/531)
+- css classes need a prefix/namespace [\#527](https://github.com/knsv/mermaid/issues/527)
+- input activate/deactivate cause safari unresponding [\#521](https://github.com/knsv/mermaid/issues/521)
+- Cannot Render the Mermaid Graph to PDF ? [\#520](https://github.com/knsv/mermaid/issues/520)
+- clicking links works from inset in subgraph but not from nodes [\#516](https://github.com/knsv/mermaid/issues/516)
+- Strange syntax error - when importing mermaid.js [\#515](https://github.com/knsv/mermaid/issues/515)
+- gantt x-axis display [\#510](https://github.com/knsv/mermaid/issues/510)
+- phantomjs renamed to phantomjs-prebuilt [\#508](https://github.com/knsv/mermaid/issues/508)
+- issue when using sphinxcontrib-mermaid extension for sphinx [\#507](https://github.com/knsv/mermaid/issues/507)
+- layout of docs page looks broken [\#504](https://github.com/knsv/mermaid/issues/504)
+- Problem showing graph with php on localhost [\#502](https://github.com/knsv/mermaid/issues/502)
+- logLevel's option doesnt work at 7.0.0 [\#501](https://github.com/knsv/mermaid/issues/501)
+- How do I get the log for a render or parse attempt? [\#500](https://github.com/knsv/mermaid/issues/500)
+- Mermaid neutral style to built in latest release [\#499](https://github.com/knsv/mermaid/issues/499)
+- Any plans for adding a typescript definition file? [\#495](https://github.com/knsv/mermaid/issues/495)
+- Gantt diagrams too narrow [\#493](https://github.com/knsv/mermaid/issues/493)
+- Flowchart edge labels placement [\#490](https://github.com/knsv/mermaid/issues/490)
+- Very different styles when rendering as png vs. svg [\#489](https://github.com/knsv/mermaid/issues/489)
+- New editor that supports mermaid: Caret [\#488](https://github.com/knsv/mermaid/issues/488)
+- Gant PNG margin [\#486](https://github.com/knsv/mermaid/issues/486)
+- ReferenceError: window is not defined [\#485](https://github.com/knsv/mermaid/issues/485)
+- Menu and layout bugs in docs [\#484](https://github.com/knsv/mermaid/issues/484)
+- Mermaid resets some of the page CSS styles [\#482](https://github.com/knsv/mermaid/issues/482)
+- Arrows rendering incorrectly in online editor [\#480](https://github.com/knsv/mermaid/issues/480)
+- CSS stroke-dasharray ignored by browsers but not other viewers [\#474](https://github.com/knsv/mermaid/issues/474)
+- mermaid - Browser Support issue [\#472](https://github.com/knsv/mermaid/issues/472)
+- Totally love mermaid I might pop! [\#471](https://github.com/knsv/mermaid/issues/471)
+- Sequence Diagram: Missing x on async arrows \(png\) [\#469](https://github.com/knsv/mermaid/issues/469)
+- live editor: the svg file rendered from graph is not supported by browsers [\#468](https://github.com/knsv/mermaid/issues/468)
+- Not found css [\#462](https://github.com/knsv/mermaid/issues/462)
+- Phantomjs Dependency [\#461](https://github.com/knsv/mermaid/issues/461)
+- Mermaid cli not working for subgraphs [\#459](https://github.com/knsv/mermaid/issues/459)
+- Support for notes across multiple participants? [\#458](https://github.com/knsv/mermaid/issues/458)
+- Related to Issue \#329: Phantomjs issues. [\#455](https://github.com/knsv/mermaid/issues/455)
+- Add a click style [\#426](https://github.com/knsv/mermaid/issues/426)
+- Add Parallel block \(par\) to sequence diagrams [\#425](https://github.com/knsv/mermaid/issues/425)
+- updating shapes after the flow chart rendering complete [\#424](https://github.com/knsv/mermaid/issues/424)
+- can't catch parse error Maximum call stack size exceeded on safari [\#421](https://github.com/knsv/mermaid/issues/421)
+- Arrows endings are missing [\#419](https://github.com/knsv/mermaid/issues/419)
+- shouldn't mermaid become more like Markdown ? [\#417](https://github.com/knsv/mermaid/issues/417)
+- Live editor show rendered diagram if syntax invalid [\#415](https://github.com/knsv/mermaid/issues/415)
+- Live editor sticky sidebar [\#414](https://github.com/knsv/mermaid/issues/414)
+- Linkstyle stroke does not work [\#410](https://github.com/knsv/mermaid/issues/410)
+- flowchart id's with dots in them .. break links [\#408](https://github.com/knsv/mermaid/issues/408)
+- Flowchart: Link text beginning with lowercase 'o' causes flowchart to break [\#407](https://github.com/knsv/mermaid/issues/407)
+- Some chinese character will case Safari no responding. [\#405](https://github.com/knsv/mermaid/issues/405)
+- Cannot center-justify text in nodes? [\#397](https://github.com/knsv/mermaid/issues/397)
+- Edge labels should have white background in live editor [\#396](https://github.com/knsv/mermaid/issues/396)
+- Live editor does not support activate/deactivate [\#394](https://github.com/knsv/mermaid/issues/394)
+- Styling subgraph? [\#391](https://github.com/knsv/mermaid/issues/391)
+- Update live editor to version 6.0.0 [\#387](https://github.com/knsv/mermaid/issues/387)
+- sequence diagram config issue [\#385](https://github.com/knsv/mermaid/issues/385)
+- How to add newline in the text [\#384](https://github.com/knsv/mermaid/issues/384)
+- PhantomJS crashes on a large graph [\#380](https://github.com/knsv/mermaid/issues/380)
+- Finnish support for class diagrams using plantuml syntax [\#377](https://github.com/knsv/mermaid/issues/377)
+- mermaidAPI.render generated different svg code from mermaid.int\(\) [\#374](https://github.com/knsv/mermaid/issues/374)
+- Put your own action on the chart [\#372](https://github.com/knsv/mermaid/issues/372)
+- when declaring participants the elements are generated twice [\#370](https://github.com/knsv/mermaid/issues/370)
+- Example Flowchart is cut in display \(Chrome\). [\#368](https://github.com/knsv/mermaid/issues/368)
+- Add shebang support to diagrams [\#365](https://github.com/knsv/mermaid/issues/365)
+- Silencing CLI output [\#352](https://github.com/knsv/mermaid/issues/352)
+- SequenceDiagram: 3+ Alternative Paths [\#348](https://github.com/knsv/mermaid/issues/348)
+- Smaller height of actor boxes [\#342](https://github.com/knsv/mermaid/issues/342)
+- Question: lib/phantomscript.js - foreignObjects in SVG - related to \#58 [\#340](https://github.com/knsv/mermaid/issues/340)
+- npm test fails on osx being blocked at Can not load "PhantomJS", it is not registered! [\#337](https://github.com/knsv/mermaid/issues/337)
+- Tabs & subgraphs cause rendering error [\#336](https://github.com/knsv/mermaid/issues/336)
+- Display question: right angles [\#335](https://github.com/knsv/mermaid/issues/335)
+- No Arrows rendered v0.5.8 [\#330](https://github.com/knsv/mermaid/issues/330)
+- mermaid -v filename.mmd gives You must specify at least one source file. [\#328](https://github.com/knsv/mermaid/issues/328)
+- You had errors in your syntax. Use --help for further information. [\#327](https://github.com/knsv/mermaid/issues/327)
+- Allow alternate arrow syntax that doesn't close html comments [\#322](https://github.com/knsv/mermaid/issues/322)
+- Comment in subgraph [\#319](https://github.com/knsv/mermaid/issues/319)
+- Update graph [\#311](https://github.com/knsv/mermaid/issues/311)
+- css conflicts with boostrap's css [\#308](https://github.com/knsv/mermaid/issues/308)
+- Can not get click event to fire. [\#306](https://github.com/knsv/mermaid/issues/306)
+- Fix phantomjs2 compatibility [\#304](https://github.com/knsv/mermaid/issues/304)
+- Flowcharts do not work in native IE11 [\#303](https://github.com/knsv/mermaid/issues/303)
+- Integration with remark.js - tutorial added [\#302](https://github.com/knsv/mermaid/issues/302)
+- Theme for dark background [\#301](https://github.com/knsv/mermaid/issues/301)
+- Sequence diagram Loops: changing boxMargin spoils the "loop" notation [\#299](https://github.com/knsv/mermaid/issues/299)
+- src/mermaid.js generates bad code [\#297](https://github.com/knsv/mermaid/issues/297)
+- Fresh fork: jasmine tests fail [\#294](https://github.com/knsv/mermaid/issues/294)
+- CSS clash [\#292](https://github.com/knsv/mermaid/issues/292)
+- Mermaid does not work in Chrome 48 [\#281](https://github.com/knsv/mermaid/issues/281)
+- node click is not effective [\#272](https://github.com/knsv/mermaid/issues/272)
+- circle and ellipse cannot change color by classDef [\#271](https://github.com/knsv/mermaid/issues/271)
+- \[Feature request\] gantt diagram axis format [\#269](https://github.com/knsv/mermaid/issues/269)
+- Not Able to See Labels even htmlLabels:false added [\#268](https://github.com/knsv/mermaid/issues/268)
+- npm run watch doesn’t work due missing dependencies [\#266](https://github.com/knsv/mermaid/issues/266)
+- label out of node [\#262](https://github.com/knsv/mermaid/issues/262)
+- IE11 Support issue [\#261](https://github.com/knsv/mermaid/issues/261)
+- mermaid without browser [\#260](https://github.com/knsv/mermaid/issues/260)
+- Insufficient capacity of gantt diagrams [\#226](https://github.com/knsv/mermaid/issues/226)
+- some WARN about installion [\#222](https://github.com/knsv/mermaid/issues/222)
+- Live editor offline access [\#217](https://github.com/knsv/mermaid/issues/217)
+- suggest: code highlight mode config for editors [\#212](https://github.com/knsv/mermaid/issues/212)
+- Uncaught RangeError: Maximum call stack size exceeded [\#189](https://github.com/knsv/mermaid/issues/189)
+- Implement render function for server side rendering using phantomjs [\#169](https://github.com/knsv/mermaid/issues/169)
+- Styling label texts [\#50](https://github.com/knsv/mermaid/issues/50)
+- Graphviz DOT syntax [\#5](https://github.com/knsv/mermaid/issues/5)
+
+**Merged pull requests:**
+
+- Remove console.log in classDB. [\#861](https://github.com/knsv/mermaid/pull/861) ([Arthaey](https://github.com/Arthaey))
+- Bump sshpk from 1.13.1 to 1.16.1 [\#851](https://github.com/knsv/mermaid/pull/851) ([dependabot[bot]](https://github.com/apps/dependabot))
+- Significantly smaller bundles [\#850](https://github.com/knsv/mermaid/pull/850) ([fabiospampinato](https://github.com/fabiospampinato))
+- Support styling of subgraphs [\#845](https://github.com/knsv/mermaid/pull/845) ([Qix-](https://github.com/Qix-))
+- fix dark theme loop labels not visible [\#837](https://github.com/knsv/mermaid/pull/837) ([jnnnnn](https://github.com/jnnnnn))
+- fix draw function can only call once [\#832](https://github.com/knsv/mermaid/pull/832) ([vaniship](https://github.com/vaniship))
+- Fix dotted lines not appearing in flowcharts when HTML labels disabled [\#828](https://github.com/knsv/mermaid/pull/828) ([stanhu](https://github.com/stanhu))
+- Fix issue with XML line breaks inside vertex labels [\#824](https://github.com/knsv/mermaid/pull/824) ([jsyang](https://github.com/jsyang))
+- fixed diagrams [\#810](https://github.com/knsv/mermaid/pull/810) ([0xflotus](https://github.com/0xflotus))
+- Clickable gantt tasks [\#804](https://github.com/knsv/mermaid/pull/804) ([abzicht](https://github.com/abzicht))
+- linkStyle now supports list of indexes with a few tests [\#798](https://github.com/knsv/mermaid/pull/798) ([ivan-danilov](https://github.com/ivan-danilov))
+- fix class diagram mermaid [\#795](https://github.com/knsv/mermaid/pull/795) ([DanShai](https://github.com/DanShai))
+- Added exclude weekdays to definition [\#792](https://github.com/knsv/mermaid/pull/792) ([jopapo](https://github.com/jopapo))
+- SVG link rendering [\#791](https://github.com/knsv/mermaid/pull/791) ([flying-sheep](https://github.com/flying-sheep))
+- Gantt milestones [\#788](https://github.com/knsv/mermaid/pull/788) ([gijswijs](https://github.com/gijswijs))
+- Remove duplicate code [\#768](https://github.com/knsv/mermaid/pull/768) ([znxkznxk1030](https://github.com/znxkznxk1030))
+- Render nodes as real links [\#765](https://github.com/knsv/mermaid/pull/765) ([flying-sheep](https://github.com/flying-sheep))
+- Support Multi-line Actor Descriptions [\#764](https://github.com/knsv/mermaid/pull/764) ([watsoncj](https://github.com/watsoncj))
+- Fix issue with marker-end. [\#757](https://github.com/knsv/mermaid/pull/757) ([gjlubbertsen](https://github.com/gjlubbertsen))
+- Make Class Diagrams usable in Stackedit and Live Editor [\#749](https://github.com/knsv/mermaid/pull/749) ([monsterkrampe](https://github.com/monsterkrampe))
+- Sequence numbers [\#722](https://github.com/knsv/mermaid/pull/722) ([paulbland](https://github.com/paulbland))
+- Add option for right angles [\#721](https://github.com/knsv/mermaid/pull/721) ([paulbland](https://github.com/paulbland))
+- Add nested activation classes [\#720](https://github.com/knsv/mermaid/pull/720) ([paulbland](https://github.com/paulbland))
+- wip: class diagram cardinality display [\#705](https://github.com/knsv/mermaid/pull/705) ([Vrixyz](https://github.com/Vrixyz))
+- add comments about CSS in config [\#688](https://github.com/knsv/mermaid/pull/688) ([imma90](https://github.com/imma90))
+- SequenceDiagram: Add support for multiple alt else statements [\#641](https://github.com/knsv/mermaid/pull/641) ([sechel](https://github.com/sechel))
+- fix \#426 - add class .clickable on nodes with click function or link [\#598](https://github.com/knsv/mermaid/pull/598) ([thomasleveil](https://github.com/thomasleveil))
+- Spec fix 1 [\#595](https://github.com/knsv/mermaid/pull/595) ([frankschmitt](https://github.com/frankschmitt))
+
+## [7.0.5](https://github.com/knsv/mermaid/tree/7.0.5) (2017-09-01)
+
+[Full Changelog](https://github.com/knsv/mermaid/compare/7.0.3...7.0.5)
+
+**Closed issues:**
+
+- live editor latin error after update [\#560](https://github.com/knsv/mermaid/issues/560)
+- Simple full example in online documentation is broken [\#558](https://github.com/knsv/mermaid/issues/558)
+- Graph No Arrow Head v7.0.3 [\#543](https://github.com/knsv/mermaid/issues/543)
+- Conflict while using mermaid along with core-js [\#512](https://github.com/knsv/mermaid/issues/512)
+- Export to pdf on website [\#496](https://github.com/knsv/mermaid/issues/496)
+- New downstream project: Mermaid Preview for VSCode [\#442](https://github.com/knsv/mermaid/issues/442)
+- Can't Zoom the flowchart ? [\#399](https://github.com/knsv/mermaid/issues/399)
+- line labels are not rendered correctly in live editor [\#366](https://github.com/knsv/mermaid/issues/366)
+- mermaid-loader [\#361](https://github.com/knsv/mermaid/issues/361)
+- Are there any documentation or examples for classDiagram and gitGraph? [\#359](https://github.com/knsv/mermaid/issues/359)
+- \# character broken in 0.5.8 [\#347](https://github.com/knsv/mermaid/issues/347)
+- Documentation issue: CSS example is not visible [\#345](https://github.com/knsv/mermaid/issues/345)
+- Include documentation for command line usage [\#326](https://github.com/knsv/mermaid/issues/326)
+- Fresh fork: can't build dist [\#296](https://github.com/knsv/mermaid/issues/296)
+- Invalid value for \ attribute viewBox="0 0 -Infinity -Infinity" [\#291](https://github.com/knsv/mermaid/issues/291)
+- Webpack require fails [\#277](https://github.com/knsv/mermaid/issues/277)
+- New documentation - need improved logo [\#216](https://github.com/knsv/mermaid/issues/216)
+
+## [7.0.3](https://github.com/knsv/mermaid/tree/7.0.3) (2017-06-04)
+
+[Full Changelog](https://github.com/knsv/mermaid/compare/7.0.2...7.0.3)
+
+**Closed issues:**
+
+- the documentation website is down [\#539](https://github.com/knsv/mermaid/issues/539)
+- Good example of interactivity with mermaidAPI [\#514](https://github.com/knsv/mermaid/issues/514)
+
+## [7.0.2](https://github.com/knsv/mermaid/tree/7.0.2) (2017-06-01)
+
+[Full Changelog](https://github.com/knsv/mermaid/compare/7.0.0...7.0.2)
+
+**Closed issues:**
+
+- CDN is not working [\#511](https://github.com/knsv/mermaid/issues/511)
+- A sampe sequenceDiagram crashes mermaid-cli [\#492](https://github.com/knsv/mermaid/issues/492)
+- Mermaid doesn't delete nodes when called multiple times [\#491](https://github.com/knsv/mermaid/issues/491)
+- API crashes on 2nd render\(\) call [\#478](https://github.com/knsv/mermaid/issues/478)
+- sequenceDiagram: dotted line for alt and empty bracket should be hidden [\#456](https://github.com/knsv/mermaid/issues/456)
+- SVG output \(almost\) not correct [\#434](https://github.com/knsv/mermaid/issues/434)
+- How to set axisFormatter of gantt in mermaid CLI? [\#428](https://github.com/knsv/mermaid/issues/428)
+- customizing link style with any color sets `fill` property to `black` instead of `none` [\#416](https://github.com/knsv/mermaid/issues/416)
+- New line at the end of SVG file [\#400](https://github.com/knsv/mermaid/issues/400)
+- CLI doesn't work [\#389](https://github.com/knsv/mermaid/issues/389)
+- Can't render subgraphs with htmlLabels: false [\#367](https://github.com/knsv/mermaid/issues/367)
+- Color arrowhead [\#362](https://github.com/knsv/mermaid/issues/362)
+- CLI: Invisible text, lines in SVG output [\#341](https://github.com/knsv/mermaid/issues/341)
+
+**Merged pull requests:**
+
+- Update Travis config [\#538](https://github.com/knsv/mermaid/pull/538) ([tylerlong](https://github.com/tylerlong))
+- Fix spelling of 'you' in sequenceDiagram docs [\#537](https://github.com/knsv/mermaid/pull/537) ([ctruelson](https://github.com/ctruelson))
+- Improve CLI output [\#536](https://github.com/knsv/mermaid/pull/536) ([gibson042](https://github.com/gibson042))
+- Modernize mermaid [\#524](https://github.com/knsv/mermaid/pull/524) ([tylerlong](https://github.com/tylerlong))
+- Modernize mermaid [\#519](https://github.com/knsv/mermaid/pull/519) ([tylerlong](https://github.com/tylerlong))
+- Update CLI instructions [\#509](https://github.com/knsv/mermaid/pull/509) ([filipedeschamps](https://github.com/filipedeschamps))
+- Add style for classDiagram to dark/default theme [\#503](https://github.com/knsv/mermaid/pull/503) ([yudenzel](https://github.com/yudenzel))
+- Fix documentation for git graph. [\#498](https://github.com/knsv/mermaid/pull/498) ([gomlgs](https://github.com/gomlgs))
+- Fix links in documentations [\#497](https://github.com/knsv/mermaid/pull/497) ([saveman71](https://github.com/saveman71))
+- Update README.md with git graph sample [\#481](https://github.com/knsv/mermaid/pull/481) ([raghur](https://github.com/raghur))
+- Fix misspelling of “another” [\#479](https://github.com/knsv/mermaid/pull/479) ([stevenschobert](https://github.com/stevenschobert))
+- Fixed \#456 sequenceDiagram: dotted line for alt and empty bracket sho… [\#477](https://github.com/knsv/mermaid/pull/477) ([brookhong](https://github.com/brookhong))
+- Add viewbox attr to class diagram [\#473](https://github.com/knsv/mermaid/pull/473) ([gnkm](https://github.com/gnkm))
+- add par statement to sequenceDiagram [\#470](https://github.com/knsv/mermaid/pull/470) ([u-minor](https://github.com/u-minor))
+
+## [7.0.0](https://github.com/knsv/mermaid/tree/7.0.0) (2017-01-29)
+
+[Full Changelog](https://github.com/knsv/mermaid/compare/6.0.0...7.0.0)
+
+**Closed issues:**
+
+- demos on io site not working [\#466](https://github.com/knsv/mermaid/issues/466)
+- Can not be generated PNG pictures through CLI with Chinese [\#451](https://github.com/knsv/mermaid/issues/451)
+- Round nodes cannot be styled with CSS classes [\#443](https://github.com/knsv/mermaid/issues/443)
+- webpack gulp UglifyJsPlugin error. [\#440](https://github.com/knsv/mermaid/issues/440)
+- String concatenation isn't working [\#432](https://github.com/knsv/mermaid/issues/432)
+- text flow/wrap in actor box of sequence diagram [\#422](https://github.com/knsv/mermaid/issues/422)
+- Online live editor still use old version [\#402](https://github.com/knsv/mermaid/issues/402)
+- uncaught TypeError: t.getTransformToElement is not a function [\#401](https://github.com/knsv/mermaid/issues/401)
+- Only works when using browserify'd code [\#373](https://github.com/knsv/mermaid/issues/373)
+- document the use of shebang line in mmd files [\#364](https://github.com/knsv/mermaid/issues/364)
+- Diagrams are small and unreadable in IE 11 - since 0.5.1 [\#356](https://github.com/knsv/mermaid/issues/356)
+- \[Feature Request\] ER-Diagram Support [\#354](https://github.com/knsv/mermaid/issues/354)
+- npm install -g mermaid does not install phantomjs [\#329](https://github.com/knsv/mermaid/issues/329)
+- activation boxes [\#313](https://github.com/knsv/mermaid/issues/313)
+- The need for mermaid.css should be mentioned explicitly in the intro docs... [\#273](https://github.com/knsv/mermaid/issues/273)
+
+**Merged pull requests:**
+
+- Update index.html [\#465](https://github.com/knsv/mermaid/pull/465) ([bmsleight](https://github.com/bmsleight))
+- Fix for \#416, customizing link style with any color sets `fill` property to `black` instead of `none` [\#452](https://github.com/knsv/mermaid/pull/452) ([joshuacolvin](https://github.com/joshuacolvin))
+- Allow .node\>circle to receive css styles [\#449](https://github.com/knsv/mermaid/pull/449) ([bfriedz](https://github.com/bfriedz))
+- Fix spelling [\#447](https://github.com/knsv/mermaid/pull/447) ([jawn](https://github.com/jawn))
+- added tests and fix cli css style selector lowercase problem [\#445](https://github.com/knsv/mermaid/pull/445) ([whyzdev](https://github.com/whyzdev))
+- Update d3.js [\#441](https://github.com/knsv/mermaid/pull/441) ([hetz](https://github.com/hetz))
+- adde tests to reproduce \#434 in flowchart [\#439](https://github.com/knsv/mermaid/pull/439) ([whyzdev](https://github.com/whyzdev))
+- Code Climate config [\#437](https://github.com/knsv/mermaid/pull/437) ([larkinscott](https://github.com/larkinscott))
+- fix gantt and sequence digram cli cfg [\#435](https://github.com/knsv/mermaid/pull/435) ([whyzdev](https://github.com/whyzdev))
+- fix gantt chart cli configuration broken [\#433](https://github.com/knsv/mermaid/pull/433) ([whyzdev](https://github.com/whyzdev))
+- fix gantt chart cli configuration parsing including functions [\#430](https://github.com/knsv/mermaid/pull/430) ([whyzdev](https://github.com/whyzdev))
+- Uses an empty text node instead of a string for svg group labels [\#429](https://github.com/knsv/mermaid/pull/429) ([daveaglick](https://github.com/daveaglick))
+- use tspan via d3.textwrap to place actor text in sequence diagram [\#427](https://github.com/knsv/mermaid/pull/427) ([whyzdev](https://github.com/whyzdev))
+- \#422 use foreignObject/div to place actor label in sequence diagram [\#423](https://github.com/knsv/mermaid/pull/423) ([whyzdev](https://github.com/whyzdev))
+- Clarify the need for a CSS stylesheet [\#413](https://github.com/knsv/mermaid/pull/413) ([sifb](https://github.com/sifb))
+- Added hads downstream project [\#412](https://github.com/knsv/mermaid/pull/412) ([sinedied](https://github.com/sinedied))
+- update usage and fix \#273 [\#406](https://github.com/knsv/mermaid/pull/406) ([jinntrance](https://github.com/jinntrance))
+- Add https://github.com/raghur/mermaid-filter to downstream projects docs page [\#404](https://github.com/knsv/mermaid/pull/404) ([raghur](https://github.com/raghur))
+- New neutral theme [\#395](https://github.com/knsv/mermaid/pull/395) ([sinedied](https://github.com/sinedied))
+- fix cli issues [\#390](https://github.com/knsv/mermaid/pull/390) ([ben-page](https://github.com/ben-page))
+- Add missing space for 'Labels out of bounds' section [\#386](https://github.com/knsv/mermaid/pull/386) ([The-Alchemist](https://github.com/The-Alchemist))
+- Fix typo: `pats` -\> `paths` [\#382](https://github.com/knsv/mermaid/pull/382) ([swhgoon](https://github.com/swhgoon))
+- Added class diagram example to README.md [\#379](https://github.com/knsv/mermaid/pull/379) ([HustLion](https://github.com/HustLion))
+- override normal flowchart arrowhead to allow css styling [\#376](https://github.com/knsv/mermaid/pull/376) ([dodoinblue](https://github.com/dodoinblue))
+- added sphinx extension [\#371](https://github.com/knsv/mermaid/pull/371) ([mgaitan](https://github.com/mgaitan))
+- Fix typo in the sequence diagram documentation [\#369](https://github.com/knsv/mermaid/pull/369) ([ggpasqualino](https://github.com/ggpasqualino))
+
+## [6.0.0](https://github.com/knsv/mermaid/tree/6.0.0) (2016-05-29)
+
+[Full Changelog](https://github.com/knsv/mermaid/compare/0.5.8...6.0.0)
+
+**Closed issues:**
+
+- Docs css: code hard to read [\#324](https://github.com/knsv/mermaid/issues/324)
+- About Markpad integration [\#323](https://github.com/knsv/mermaid/issues/323)
+- How to link backwards in flowchat? [\#321](https://github.com/knsv/mermaid/issues/321)
+- Help with editor [\#310](https://github.com/knsv/mermaid/issues/310)
+- +1 [\#293](https://github.com/knsv/mermaid/issues/293)
+- Basic chart does not render on Chome, but does in Firefox [\#290](https://github.com/knsv/mermaid/issues/290)
+- Live editor is broken [\#285](https://github.com/knsv/mermaid/issues/285)
+- "No such file or directory" trying to run mermaid 0.5.7 on OS X [\#284](https://github.com/knsv/mermaid/issues/284)
+- participant name as "Long Long Name" [\#283](https://github.com/knsv/mermaid/issues/283)
+- Windows - cli - could not find phantomjs at the specified path [\#236](https://github.com/knsv/mermaid/issues/236)
+
+**Merged pull requests:**
+
+- The option of gantt for the spaces for the section names. [\#353](https://github.com/knsv/mermaid/pull/353) ([zeroyonichihachi](https://github.com/zeroyonichihachi))
+- Gitgraph: Make reset work with parent ref carets [\#350](https://github.com/knsv/mermaid/pull/350) ([raghur](https://github.com/raghur))
+- Remove the text-shadows that make the text look blurry [\#349](https://github.com/knsv/mermaid/pull/349) ([AsaAyers](https://github.com/AsaAyers))
+- add line interpolation to linkStyle in flowchart [\#346](https://github.com/knsv/mermaid/pull/346) ([AlanHohn](https://github.com/AlanHohn))
+- Support git graph diagrams in mermaid [\#344](https://github.com/knsv/mermaid/pull/344) ([raghur](https://github.com/raghur))
+- Build and test execution changes [\#338](https://github.com/knsv/mermaid/pull/338) ([ssbarnea](https://github.com/ssbarnea))
+- Reformatting of css files [\#331](https://github.com/knsv/mermaid/pull/331) ([Jmuccigr](https://github.com/Jmuccigr))
+- \(WIP\) Sequence Diagram Title Support [\#320](https://github.com/knsv/mermaid/pull/320) ([bronsoja](https://github.com/bronsoja))
+- activations doc + few fixes [\#318](https://github.com/knsv/mermaid/pull/318) ([ciekawy](https://github.com/ciekawy))
+- Dark theme for better contrast on darker backgrounds [\#317](https://github.com/knsv/mermaid/pull/317) ([crodriguez1a](https://github.com/crodriguez1a))
+- Activations [\#316](https://github.com/knsv/mermaid/pull/316) ([ciekawy](https://github.com/ciekawy))
+- Support leading comments for sequenceDiagrams [\#312](https://github.com/knsv/mermaid/pull/312) ([ashsearle](https://github.com/ashsearle))
+- Show a little lenience for white-space around names [\#309](https://github.com/knsv/mermaid/pull/309) ([ashsearle](https://github.com/ashsearle))
+- Update list of downstream projects [\#307](https://github.com/knsv/mermaid/pull/307) ([maxArturo](https://github.com/maxArturo))
+- Issue 299: Sequence diagram Loops: changing boxMargin spoils the "loop" notation [\#300](https://github.com/knsv/mermaid/pull/300) ([LarryKlugerDS](https://github.com/LarryKlugerDS))
+- Issue 297 - src/mermaid.js generates bad code [\#298](https://github.com/knsv/mermaid/pull/298) ([LarryKlugerDS](https://github.com/LarryKlugerDS))
+- Updated instructions for running tests [\#295](https://github.com/knsv/mermaid/pull/295) ([LarryKlugerDS](https://github.com/LarryKlugerDS))
+- Add Markdown Plus to Downstream projects [\#288](https://github.com/knsv/mermaid/pull/288) ([tylerlong](https://github.com/tylerlong))
+- Quote phantomPath so that it doesn't fail on window [\#286](https://github.com/knsv/mermaid/pull/286) ([raghur](https://github.com/raghur))
+
+## [0.5.8](https://github.com/knsv/mermaid/tree/0.5.8) (2016-01-27)
+
+[Full Changelog](https://github.com/knsv/mermaid/compare/0.5.7...0.5.8)
+
+## [0.5.7](https://github.com/knsv/mermaid/tree/0.5.7) (2016-01-25)
+
+[Full Changelog](https://github.com/knsv/mermaid/compare/0.5.6...0.5.7)
+
+**Closed issues:**
+
+- Mermaid + LightPaper = ❤️ [\#280](https://github.com/knsv/mermaid/issues/280)
+- Bower Integration [\#278](https://github.com/knsv/mermaid/issues/278)
+- Mermaid breaks when variables end in 'v' [\#276](https://github.com/knsv/mermaid/issues/276)
+- sequence diagrams don't support participant aliasing [\#263](https://github.com/knsv/mermaid/issues/263)
+- One diagram that fails to render stops further execution on the page [\#259](https://github.com/knsv/mermaid/issues/259)
+- Where to find line layout algorithm? [\#258](https://github.com/knsv/mermaid/issues/258)
+- Compatibility with node.js [\#257](https://github.com/knsv/mermaid/issues/257)
+- Label resizing with dynamically loaded fonts [\#255](https://github.com/knsv/mermaid/issues/255)
+- SVG arrowheads are broken in the CLI [\#249](https://github.com/knsv/mermaid/issues/249)
+- Cannot read property 'replace' of undefined [\#239](https://github.com/knsv/mermaid/issues/239)
+
+**Merged pull requests:**
+
+- gh-50 Allow styling of edge labels in css [\#267](https://github.com/knsv/mermaid/pull/267) ([Anoia](https://github.com/Anoia))
+- Allow sequenceDiagram participant aliasing [\#265](https://github.com/knsv/mermaid/pull/265) ([gibson042](https://github.com/gibson042))
+
+## [0.5.6](https://github.com/knsv/mermaid/tree/0.5.6) (2015-11-22)
+
+[Full Changelog](https://github.com/knsv/mermaid/compare/0.5.5...0.5.6)
+
+**Closed issues:**
+
+- title doesn't work in sequenceDiagram [\#248](https://github.com/knsv/mermaid/issues/248)
+- hypen-minus should be valid in sequence diagram alt/else/etc. descriptions [\#247](https://github.com/knsv/mermaid/issues/247)
+- Broken in firefox? [\#245](https://github.com/knsv/mermaid/issues/245)
+- When there is a Chinese symbol in the flowchart, it will crash。 [\#238](https://github.com/knsv/mermaid/issues/238)
+- Non-alpha characters included in ALPHA token \(flow graph jison\) [\#232](https://github.com/knsv/mermaid/issues/232)
+- subgraph not rendering with change to sample [\#231](https://github.com/knsv/mermaid/issues/231)
+- sequence diagram requires a new line at the end? [\#229](https://github.com/knsv/mermaid/issues/229)
+- Live Editor: Permalink address not being parsed [\#202](https://github.com/knsv/mermaid/issues/202)
+- Add download SVG link to the live editor [\#144](https://github.com/knsv/mermaid/issues/144)
+
+**Merged pull requests:**
+
+- Make sequenceDiagram terminal newline optional [\#253](https://github.com/knsv/mermaid/pull/253) ([gibson042](https://github.com/gibson042))
+- Support sequenceDiagram "over" notes [\#252](https://github.com/knsv/mermaid/pull/252) ([gibson042](https://github.com/gibson042))
+- Properly handle "rest of line" statements [\#251](https://github.com/knsv/mermaid/pull/251) ([gibson042](https://github.com/gibson042))
+- CLI: Propagate exit code from lib \(i.e., phantomjs\) [\#250](https://github.com/knsv/mermaid/pull/250) ([gibson042](https://github.com/gibson042))
+- flowRender.js - Fix FontAwesome icon insert [\#244](https://github.com/knsv/mermaid/pull/244) ([ma-zal](https://github.com/ma-zal))
+- updated sequence diagram link in live editor [\#242](https://github.com/knsv/mermaid/pull/242) ([r-a-v-a-s](https://github.com/r-a-v-a-s))
+- updated links in README.md [\#240](https://github.com/knsv/mermaid/pull/240) ([r-a-v-a-s](https://github.com/r-a-v-a-s))
+- Ellipse syntax [\#237](https://github.com/knsv/mermaid/pull/237) ([spect88](https://github.com/spect88))
+- Allow keywords as suffixes of node ids [\#235](https://github.com/knsv/mermaid/pull/235) ([spect88](https://github.com/spect88))
+- Highlighted the editor in the nav [\#234](https://github.com/knsv/mermaid/pull/234) ([knsv](https://github.com/knsv))
+- Live editor tweaks [\#233](https://github.com/knsv/mermaid/pull/233) ([spect88](https://github.com/spect88))
+- Add a Gitter chat badge to README.md [\#230](https://github.com/knsv/mermaid/pull/230) ([gitter-badger](https://github.com/gitter-badger))
+
+## [0.5.5](https://github.com/knsv/mermaid/tree/0.5.5) (2015-10-21)
+
+[Full Changelog](https://github.com/knsv/mermaid/compare/0.5.4...0.5.5)
+
+**Closed issues:**
+
+- sequence diagram, arrowhead instead of crosshead [\#227](https://github.com/knsv/mermaid/issues/227)
+
+**Merged pull requests:**
+
+- Fix a typo: crosshead --\> arrowhead [\#228](https://github.com/knsv/mermaid/pull/228) ([tylerlong](https://github.com/tylerlong))
+
+## [0.5.4](https://github.com/knsv/mermaid/tree/0.5.4) (2015-10-19)
+
+[Full Changelog](https://github.com/knsv/mermaid/compare/0.5.3...0.5.4)
+
+**Closed issues:**
+
+- Weird bug in live editor when using words with substring `end` [\#184](https://github.com/knsv/mermaid/issues/184)
+- Custom icons [\#15](https://github.com/knsv/mermaid/issues/15)
+- Marker-end arrow cannot be shown for URL with query parameter [\#225](https://github.com/knsv/mermaid/issues/225)
+- Please update bower's D3 version [\#221](https://github.com/knsv/mermaid/issues/221)
+- Set log level from mermaid configuration [\#220](https://github.com/knsv/mermaid/issues/220)
+- Width fixed to 400px [\#204](https://github.com/knsv/mermaid/issues/204)
+- render to png from the cli does not display the marker-end arrow heads [\#181](https://github.com/knsv/mermaid/issues/181)
+- Links in sequence diagrams [\#159](https://github.com/knsv/mermaid/issues/159)
+- comment characters `%%` cause parse error [\#141](https://github.com/knsv/mermaid/issues/141)
+- Add a reversed asymmetric shape [\#124](https://github.com/knsv/mermaid/issues/124)
+- Add syntax for double headed arrows [\#123](https://github.com/knsv/mermaid/issues/123)
+- Support for font-awesome [\#49](https://github.com/knsv/mermaid/issues/49)
+
+**Merged pull requests:**
+
+- Allow `end` as a substring of vertex id [\#224](https://github.com/knsv/mermaid/pull/224) ([spect88](https://github.com/spect88))
+- Remove duplicate npm dependencies: d3 and he [\#223](https://github.com/knsv/mermaid/pull/223) ([spect88](https://github.com/spect88))
+
+## [0.5.3](https://github.com/knsv/mermaid/tree/0.5.3) (2015-10-04)
+
+[Full Changelog](https://github.com/knsv/mermaid/compare/0.5.2...0.5.3)
+
+## [0.5.2](https://github.com/knsv/mermaid/tree/0.5.2) (2015-10-04)
+
+[Full Changelog](https://github.com/knsv/mermaid/compare/0.5.1...0.5.2)
+
+**Closed issues:**
+
+- Installing “atom-mermaid@0.1.3” failed [\#218](https://github.com/knsv/mermaid/issues/218)
+- Render mermaid code on websites? [\#215](https://github.com/knsv/mermaid/issues/215)
+- Brackets in a node with text? [\#213](https://github.com/knsv/mermaid/issues/213)
+- node feature request [\#211](https://github.com/knsv/mermaid/issues/211)
+- Please add prefix for styles [\#208](https://github.com/knsv/mermaid/issues/208)
+- Bad handling of block arguments [\#207](https://github.com/knsv/mermaid/issues/207)
+- please consider port to mac osx [\#203](https://github.com/knsv/mermaid/issues/203)
+- allow phantomjs \>=1.9.x [\#201](https://github.com/knsv/mermaid/issues/201)
+- syntax for venn diagrams? [\#200](https://github.com/knsv/mermaid/issues/200)
+- Broken CLI Graphs? \(v0.5.1\) [\#196](https://github.com/knsv/mermaid/issues/196)
+- Static site does not render under HTTPS [\#194](https://github.com/knsv/mermaid/issues/194)
+- Error on simple graph [\#192](https://github.com/knsv/mermaid/issues/192)
+- Escape "~" [\#191](https://github.com/knsv/mermaid/issues/191)
+- Trying to add link using 'click' to flowchart [\#188](https://github.com/knsv/mermaid/issues/188)
+- cli: no lines and arrowheads rendered / only dotted lines [\#187](https://github.com/knsv/mermaid/issues/187)
+- text of mermaid div displayed on page [\#186](https://github.com/knsv/mermaid/issues/186)
+- using mermaid with laravel [\#185](https://github.com/knsv/mermaid/issues/185)
+- Atom editor package [\#183](https://github.com/knsv/mermaid/issues/183)
+- Auto linewrap for notes in sequence diagrams [\#178](https://github.com/knsv/mermaid/issues/178)
+- Execute code after initialize [\#176](https://github.com/knsv/mermaid/issues/176)
+- Autoscaling for all diagram types [\#175](https://github.com/knsv/mermaid/issues/175)
+- Problem with click event callback [\#174](https://github.com/knsv/mermaid/issues/174)
+- How to escape characters? [\#170](https://github.com/knsv/mermaid/issues/170)
+- it can not work [\#167](https://github.com/knsv/mermaid/issues/167)
+- UML Class diagram [\#154](https://github.com/knsv/mermaid/issues/154)
+- Broken subgraph using the CLI [\#153](https://github.com/knsv/mermaid/issues/153)
+- Support PlantUML syntax [\#149](https://github.com/knsv/mermaid/issues/149)
+- IE Support issue [\#142](https://github.com/knsv/mermaid/issues/142)
+- Flowchart truncated [\#140](https://github.com/knsv/mermaid/issues/140)
+- Double Quote as text is not working [\#219](https://github.com/knsv/mermaid/issues/219)
+- classDef / class not working with htmlLabels? [\#210](https://github.com/knsv/mermaid/issues/210)
+- Links in graph missing [\#209](https://github.com/knsv/mermaid/issues/209)
+- Last word in comment boxes getting cut off by word wrap library : \( [\#195](https://github.com/knsv/mermaid/issues/195)
+- Escaping characters in sequence diagram [\#193](https://github.com/knsv/mermaid/issues/193)
+- SVG foreignObject rendering [\#180](https://github.com/knsv/mermaid/issues/180)
+- IE9 issue [\#179](https://github.com/knsv/mermaid/issues/179)
+- inoperable in an AMD/requirejs environment: IPython Notebook [\#127](https://github.com/knsv/mermaid/issues/127)
+- \[Parser\] Hyphen in participant name bring TypeError [\#74](https://github.com/knsv/mermaid/issues/74)
+- Support for hyperlink and tooltip [\#34](https://github.com/knsv/mermaid/issues/34)
+
+**Merged pull requests:**
+
+- Update flowchart.md [\#214](https://github.com/knsv/mermaid/pull/214) ([orschiro](https://github.com/orschiro))
+- Default style when using the CLI [\#205](https://github.com/knsv/mermaid/pull/205) ([gillesdemey](https://github.com/gillesdemey))
+- Gantt chart - add minutes and seconds durations [\#198](https://github.com/knsv/mermaid/pull/198) ([dbrans](https://github.com/dbrans))
+- Using QUnit for AMD testing [\#190](https://github.com/knsv/mermaid/pull/190) ([bollwyvl](https://github.com/bollwyvl))
+- Update phantomscript.js [\#182](https://github.com/knsv/mermaid/pull/182) ([phairow](https://github.com/phairow))
+
+## [0.5.1](https://github.com/knsv/mermaid/tree/0.5.1) (2015-06-21)
+
+[Full Changelog](https://github.com/knsv/mermaid/compare/0.5.0...0.5.1)
+
+**Closed issues:**
+
+- Live editor is broken [\#173](https://github.com/knsv/mermaid/issues/173)
+- 0.5.0 no longer respects custom date definitions in Gantt diagrams [\#171](https://github.com/knsv/mermaid/issues/171)
+- Drop label character restrictions [\#162](https://github.com/knsv/mermaid/issues/162)
+- can't nest subgraphs in flowchart [\#161](https://github.com/knsv/mermaid/issues/161)
+- Unable to generate gantt diagram with mermaid CLI [\#158](https://github.com/knsv/mermaid/issues/158)
+- Inline css by "mermaid" [\#157](https://github.com/knsv/mermaid/issues/157)
+- Finite State Machine Diagram [\#152](https://github.com/knsv/mermaid/issues/152)
+- How to center align gantt diagram [\#150](https://github.com/knsv/mermaid/issues/150)
+- Security concern regarding class definition [\#148](https://github.com/knsv/mermaid/issues/148)
+- File Extension [\#147](https://github.com/knsv/mermaid/issues/147)
+- To SVG Export [\#146](https://github.com/knsv/mermaid/issues/146)
+- `setTimeout` with clusters problematic with programmatic edits and no callback [\#133](https://github.com/knsv/mermaid/issues/133)
+- Possibility to set the width of the generated flowchart [\#129](https://github.com/knsv/mermaid/issues/129)
+- flowchart - styling of edges via css overrides specific styles set in the graph definition [\#128](https://github.com/knsv/mermaid/issues/128)
+- module.exports.cloneCssStyles\(\) in combination with Angularjs breaks display in Chrome and IE [\#126](https://github.com/knsv/mermaid/issues/126)
+- Gantt - suitable xAxis for longer project [\#125](https://github.com/knsv/mermaid/issues/125)
+- Mix horizontal and vertical graph [\#68](https://github.com/knsv/mermaid/issues/68)
+- How to get started with this project ? [\#64](https://github.com/knsv/mermaid/issues/64)
+- Special characters break parsing [\#54](https://github.com/knsv/mermaid/issues/54)
+- Responsive graph layout for mobile viewers [\#51](https://github.com/knsv/mermaid/issues/51)
+- Styling connector lines [\#31](https://github.com/knsv/mermaid/issues/31)
+
+**Merged pull requests:**
+
+- Remove moot `version` property from bower.json [\#172](https://github.com/knsv/mermaid/pull/172) ([kkirsche](https://github.com/kkirsche))
+
+## [0.5.0](https://github.com/knsv/mermaid/tree/0.5.0) (2015-06-07)
+
+[Full Changelog](https://github.com/knsv/mermaid/compare/0.4.0...0.5.0)
+
+**Closed issues:**
+
+- it can not work where graph TD contains chinese character [\#166](https://github.com/knsv/mermaid/issues/166)
+- Broken Examples [\#163](https://github.com/knsv/mermaid/issues/163)
+- uglifyjs wanrings which means we can improve the code [\#156](https://github.com/knsv/mermaid/issues/156)
+- New\(er\) features unavailable in downloadable js files? [\#151](https://github.com/knsv/mermaid/issues/151)
+- Add gh-gapes link to description [\#143](https://github.com/knsv/mermaid/issues/143)
+- Some examples not displayed on Firefox 36.0.1 [\#138](https://github.com/knsv/mermaid/issues/138)
+- tags ending in a "v" don't render [\#132](https://github.com/knsv/mermaid/issues/132)
+- Links in flowchart [\#131](https://github.com/knsv/mermaid/issues/131)
+- Using the library for iOS development [\#130](https://github.com/knsv/mermaid/issues/130)
+- Add a css file, mermaid.css, with default styling [\#122](https://github.com/knsv/mermaid/issues/122)
+- Add capability for gantt diagrams [\#118](https://github.com/knsv/mermaid/issues/118)
+- lower case v causes error in the parser [\#108](https://github.com/knsv/mermaid/issues/108)
+- Label's css conflict with boostrap's .label [\#67](https://github.com/knsv/mermaid/issues/67)
+- TypeError: Cannot read property 'layout' of undefined [\#37](https://github.com/knsv/mermaid/issues/37)
+- software architecture diagram [\#36](https://github.com/knsv/mermaid/issues/36)
+- Support for bar charts and pie diagrams [\#22](https://github.com/knsv/mermaid/issues/22)
+
+**Merged pull requests:**
+
+- Dev 0.5.0 [\#168](https://github.com/knsv/mermaid/pull/168) ([knsv](https://github.com/knsv))
+- Fix spacing [\#164](https://github.com/knsv/mermaid/pull/164) ([rhcarvalho](https://github.com/rhcarvalho))
+- Fixing typo: "Think" -\> "Thick" [\#160](https://github.com/knsv/mermaid/pull/160) ([it0a](https://github.com/it0a))
+- IE, local html, cssRules access is denied [\#155](https://github.com/knsv/mermaid/pull/155) ([tylerlong](https://github.com/tylerlong))
+- Add automatically generated change log file. [\#139](https://github.com/knsv/mermaid/pull/139) ([skywinder](https://github.com/skywinder))
+- Adding init argument to the global API [\#137](https://github.com/knsv/mermaid/pull/137) ([bollwyvl](https://github.com/bollwyvl))
+- Add description of manual calling of init [\#136](https://github.com/knsv/mermaid/pull/136) ([bollwyvl](https://github.com/bollwyvl))
+- Allow other forms of node selection for init\(\) [\#135](https://github.com/knsv/mermaid/pull/135) ([bollwyvl](https://github.com/bollwyvl))
+- Use a library-level variable for assigning ids [\#134](https://github.com/knsv/mermaid/pull/134) ([bollwyvl](https://github.com/bollwyvl))
+
+## [0.4.0](https://github.com/knsv/mermaid/tree/0.4.0) (2015-03-01)
+
+[Full Changelog](https://github.com/knsv/mermaid/compare/0.3.5...0.4.0)
+
+**Closed issues:**
+
+- subgraph background is black in rendered flowchart PNG via CLI [\#121](https://github.com/knsv/mermaid/issues/121)
+- Integrate editor at https://github.com/naseer/mermaid-webapp [\#110](https://github.com/knsv/mermaid/issues/110)
+- Internet Explorer Support [\#99](https://github.com/knsv/mermaid/issues/99)
+- Asymmetric shapes not documented [\#82](https://github.com/knsv/mermaid/issues/82)
+- NoModificationAllowedError [\#23](https://github.com/knsv/mermaid/issues/23)
+- Improve arrows [\#3](https://github.com/knsv/mermaid/issues/3)
+
+## [0.3.5](https://github.com/knsv/mermaid/tree/0.3.5) (2015-02-15)
+
+[Full Changelog](https://github.com/knsv/mermaid/compare/0.3.4...0.3.5)
+
+## [0.3.4](https://github.com/knsv/mermaid/tree/0.3.4) (2015-02-15)
+
+[Full Changelog](https://github.com/knsv/mermaid/compare/0.3.3...0.3.4)
+
+**Closed issues:**
+
+- Subgraph syntax bug? [\#120](https://github.com/knsv/mermaid/issues/120)
+- Live editor [\#115](https://github.com/knsv/mermaid/issues/115)
+- Error in "Basic Syntax" wiki page [\#113](https://github.com/knsv/mermaid/issues/113)
+- semicolons, anyone? [\#111](https://github.com/knsv/mermaid/issues/111)
+- undefined `sequenceConfig` fails [\#109](https://github.com/knsv/mermaid/issues/109)
+- Sequence Diagrams: Show Actors below as well [\#106](https://github.com/knsv/mermaid/issues/106)
+- Allow overriding sequence diagram configuration \(SVG properties\) [\#103](https://github.com/knsv/mermaid/issues/103)
+- Error when rendering A-- This is the text -- B [\#102](https://github.com/knsv/mermaid/issues/102)
+- Clipping in documentation [\#97](https://github.com/knsv/mermaid/issues/97)
+- isolate class styling to the svg container [\#92](https://github.com/knsv/mermaid/issues/92)
+- Apply styling from css when using the CLI utility [\#85](https://github.com/knsv/mermaid/issues/85)
+- Generated SVG works poorly outside web browsers [\#58](https://github.com/knsv/mermaid/issues/58)
+- Make the new graph declaration more visual [\#40](https://github.com/knsv/mermaid/issues/40)
+- Generating SVG text blob for use in Node [\#2](https://github.com/knsv/mermaid/issues/2)
+
+**Merged pull requests:**
+
+- Add live editor [\#119](https://github.com/knsv/mermaid/pull/119) ([naseer](https://github.com/naseer))
+- Adds CSS option to the CLI [\#116](https://github.com/knsv/mermaid/pull/116) ([fardog](https://github.com/fardog))
+- Update flowchart.md in response Issue \#113 [\#114](https://github.com/knsv/mermaid/pull/114) ([vijay40](https://github.com/vijay40))
+- Ignore all files except the license and dist/ folder when installing with Bower. [\#112](https://github.com/knsv/mermaid/pull/112) ([jasonbellamy](https://github.com/jasonbellamy))
+
+## [0.3.3](https://github.com/knsv/mermaid/tree/0.3.3) (2015-01-25)
+
+[Full Changelog](https://github.com/knsv/mermaid/compare/0.3.2...0.3.3)
+
+**Closed issues:**
+
+- Missing arrows in sequence diagram [\#98](https://github.com/knsv/mermaid/issues/98)
+- Error with \>9 linkStyles [\#95](https://github.com/knsv/mermaid/issues/95)
+- Support for dotted links [\#26](https://github.com/knsv/mermaid/issues/26)
+
+**Merged pull requests:**
+
+- Require d3 directly to better support Node usage [\#107](https://github.com/knsv/mermaid/pull/107) ([markdalgleish](https://github.com/markdalgleish))
+- update doc with -c option [\#105](https://github.com/knsv/mermaid/pull/105) ([jjmr](https://github.com/jjmr))
+- Add new parameter to the console client to override the svg configuration in sequence diagrams [\#104](https://github.com/knsv/mermaid/pull/104) ([jjmr](https://github.com/jjmr))
+- Text based labels, new shape [\#101](https://github.com/knsv/mermaid/pull/101) ([bjowes](https://github.com/bjowes))
+- fix html tags in example usage [\#100](https://github.com/knsv/mermaid/pull/100) ([deiwin](https://github.com/deiwin))
+
+## [0.3.2](https://github.com/knsv/mermaid/tree/0.3.2) (2015-01-11)
+
+[Full Changelog](https://github.com/knsv/mermaid/compare/0.3.1...0.3.2)
+
+**Closed issues:**
+
+- disable auto render [\#91](https://github.com/knsv/mermaid/issues/91)
+- Tidy breaks mermaid \(linebreaks in \\) [\#87](https://github.com/knsv/mermaid/issues/87)
+- Bug: \ being rendered as text in node [\#73](https://github.com/knsv/mermaid/issues/73)
+- Graph edges appear to render outside of the canvas [\#70](https://github.com/knsv/mermaid/issues/70)
+- Make link text look like it is on the line [\#53](https://github.com/knsv/mermaid/issues/53)
+
+**Merged pull requests:**
+
+- Merge pull request \#1 from knsv/master [\#96](https://github.com/knsv/mermaid/pull/96) ([gkchic](https://github.com/gkchic))
+- Removed duplicated section in flowchart docs [\#94](https://github.com/knsv/mermaid/pull/94) ([kaime](https://github.com/kaime))
+- Grammar changes to sequence page [\#93](https://github.com/knsv/mermaid/pull/93) ([gkchic](https://github.com/gkchic))
+- GitHub buttons [\#89](https://github.com/knsv/mermaid/pull/89) ([gkchic](https://github.com/gkchic))
+- Template change [\#88](https://github.com/knsv/mermaid/pull/88) ([gkchic](https://github.com/gkchic))
+
+## [0.3.1](https://github.com/knsv/mermaid/tree/0.3.1) (2015-01-05)
+
+[Full Changelog](https://github.com/knsv/mermaid/compare/0.3.0...0.3.1)
+
+**Closed issues:**
+
+- Non ASCII chars in labels [\#84](https://github.com/knsv/mermaid/issues/84)
+- 'undefined' titles of Quicklinks on the usage page [\#80](https://github.com/knsv/mermaid/issues/80)
+- \[cli\] Enhancement proposal: not fail --version / --help if phantomjs isn't installed [\#71](https://github.com/knsv/mermaid/issues/71)
+- Neural Networks [\#39](https://github.com/knsv/mermaid/issues/39)
+- Support for sequence diagrams [\#16](https://github.com/knsv/mermaid/issues/16)
+- Client utility for mermaid [\#6](https://github.com/knsv/mermaid/issues/6)
+
+**Merged pull requests:**
+
+- Flowchart doc: Text in the circle now in a circle [\#81](https://github.com/knsv/mermaid/pull/81) ([Grahack](https://github.com/Grahack))
+- Fix for issue \#73 [\#79](https://github.com/knsv/mermaid/pull/79) ([it0a](https://github.com/it0a))
+- Ink template [\#78](https://github.com/knsv/mermaid/pull/78) ([gkchic](https://github.com/gkchic))
+- Show help and version even if phantom isn't present. Fixes \#71 [\#75](https://github.com/knsv/mermaid/pull/75) ([fardog](https://github.com/fardog))
+- Add apostrophe & 'and' [\#72](https://github.com/knsv/mermaid/pull/72) ([sudodoki](https://github.com/sudodoki))
+
+## [0.3.0](https://github.com/knsv/mermaid/tree/0.3.0) (2014-12-22)
+
+[Full Changelog](https://github.com/knsv/mermaid/compare/0.2.16...0.3.0)
+
+**Closed issues:**
+
+- Consider shipping a standalone executable [\#65](https://github.com/knsv/mermaid/issues/65)
+- Trailing whitespace at the end of lines is not ignored [\#55](https://github.com/knsv/mermaid/issues/55)
+- How do I do comments? [\#47](https://github.com/knsv/mermaid/issues/47)
+- This characters failed the lexical parsing [\#46](https://github.com/knsv/mermaid/issues/46)
+- tutorial for creating new type of graph/layout [\#44](https://github.com/knsv/mermaid/issues/44)
+- Improve readability with new line as terminator and whitespace [\#38](https://github.com/knsv/mermaid/issues/38)
+- Use classes instead of inline style for easy styling [\#24](https://github.com/knsv/mermaid/issues/24)
+
+**Merged pull requests:**
+
+- Adds Command Line Interface for generating PNGs from mermaid description files [\#69](https://github.com/knsv/mermaid/pull/69) ([fardog](https://github.com/fardog))
+- Allow special symbols for direction along with acronyms [\#66](https://github.com/knsv/mermaid/pull/66) ([vijay40](https://github.com/vijay40))
+
+## [0.2.16](https://github.com/knsv/mermaid/tree/0.2.16) (2014-12-15)
+
+[Full Changelog](https://github.com/knsv/mermaid/compare/0.2.15...0.2.16)
+
+**Closed issues:**
+
+- Mermaid not rendering properly on Wordpress pages [\#59](https://github.com/knsv/mermaid/issues/59)
+- Improve example page with live demo [\#52](https://github.com/knsv/mermaid/issues/52)
+- Create image file via CLI? [\#48](https://github.com/knsv/mermaid/issues/48)
+- Does not render upon AngularJS Updates [\#45](https://github.com/knsv/mermaid/issues/45)
+- Download link in README.MD doesn't work. [\#42](https://github.com/knsv/mermaid/issues/42)
+- linkStyle usage is not obvious [\#41](https://github.com/knsv/mermaid/issues/41)
+- Move \*.spec.js in src/ to test/ [\#35](https://github.com/knsv/mermaid/issues/35)
+- Lines routed outside visible area [\#19](https://github.com/knsv/mermaid/issues/19)
+
+**Merged pull requests:**
+
+- New grammar will allow statements ending without semicolon as disccused in Issue \#38 [\#63](https://github.com/knsv/mermaid/pull/63) ([vijay40](https://github.com/vijay40))
+- Class based styling [\#62](https://github.com/knsv/mermaid/pull/62) ([bjowes](https://github.com/bjowes))
+- Fix typos [\#60](https://github.com/knsv/mermaid/pull/60) ([sublimino](https://github.com/sublimino))
+- Included .DS_Store in gitignore [\#57](https://github.com/knsv/mermaid/pull/57) ([alvynmcq](https://github.com/alvynmcq))
+- Improves readablity discussed in issue \#38 [\#56](https://github.com/knsv/mermaid/pull/56) ([vijay40](https://github.com/vijay40))
+- Added a linting task for gulp [\#43](https://github.com/knsv/mermaid/pull/43) ([serv](https://github.com/serv))
+
+## [0.2.15](https://github.com/knsv/mermaid/tree/0.2.15) (2014-12-05)
+
+[Full Changelog](https://github.com/knsv/mermaid/compare/0.2.14...0.2.15)
+
+**Closed issues:**
+
+- Question marks don't render properly with /dist/mermaid.full.min.js [\#30](https://github.com/knsv/mermaid/issues/30)
+- Error with some characters [\#25](https://github.com/knsv/mermaid/issues/25)
+- Provide parse function in browser without `require`? [\#21](https://github.com/knsv/mermaid/issues/21)
+- Better label text support [\#18](https://github.com/knsv/mermaid/issues/18)
+- Cap-cased words break parser [\#8](https://github.com/knsv/mermaid/issues/8)
+
+**Merged pull requests:**
+
+- Include bower_components/ to .gitignore [\#33](https://github.com/knsv/mermaid/pull/33) ([serv](https://github.com/serv))
+- Fixed reference to Git repo. [\#32](https://github.com/knsv/mermaid/pull/32) ([guyellis](https://github.com/guyellis))
+
+## [0.2.14](https://github.com/knsv/mermaid/tree/0.2.14) (2014-12-03)
+
+[Full Changelog](https://github.com/knsv/mermaid/compare/0.2.13...0.2.14)
+
+## [0.2.13](https://github.com/knsv/mermaid/tree/0.2.13) (2014-12-03)
+
+[Full Changelog](https://github.com/knsv/mermaid/compare/0.2.10...0.2.13)
+
+**Closed issues:**
+
+- modified init to be applied more than once [\#29](https://github.com/knsv/mermaid/issues/29)
+- Wanted to know build process for the project. [\#28](https://github.com/knsv/mermaid/issues/28)
+- Container support [\#27](https://github.com/knsv/mermaid/issues/27)
+- can not support Chinese description [\#20](https://github.com/knsv/mermaid/issues/20)
+- Node Label text mistaken for Direction [\#17](https://github.com/knsv/mermaid/issues/17)
+- Support unicode chars in labels [\#9](https://github.com/knsv/mermaid/issues/9)
+- Publish to NPM [\#7](https://github.com/knsv/mermaid/issues/7)
+
+## [0.2.10](https://github.com/knsv/mermaid/tree/0.2.10) (2014-12-01)
+
+[Full Changelog](https://github.com/knsv/mermaid/compare/0.2.9...0.2.10)
+
+## [0.2.9](https://github.com/knsv/mermaid/tree/0.2.9) (2014-12-01)
+
+[Full Changelog](https://github.com/knsv/mermaid/compare/0.2.8...0.2.9)
+
+**Closed issues:**
+
+- Add link to jsbin playground to README [\#11](https://github.com/knsv/mermaid/issues/11)
+- What are the requirements ? [\#10](https://github.com/knsv/mermaid/issues/10)
+
+**Merged pull requests:**
+
+- Allow unicode chars in labels [\#13](https://github.com/knsv/mermaid/pull/13) ([codebeige](https://github.com/codebeige))
+
+## [0.2.8](https://github.com/knsv/mermaid/tree/0.2.8) (2014-12-01)
+
+[Full Changelog](https://github.com/knsv/mermaid/compare/0.2.7...0.2.8)
+
+## [0.2.7](https://github.com/knsv/mermaid/tree/0.2.7) (2014-12-01)
+
+[Full Changelog](https://github.com/knsv/mermaid/compare/0.2.6...0.2.7)
+
+**Closed issues:**
+
+- Provide parser as separate module [\#4](https://github.com/knsv/mermaid/issues/4)
+
+## [0.2.6](https://github.com/knsv/mermaid/tree/0.2.6) (2014-11-27)
+
+[Full Changelog](https://github.com/knsv/mermaid/compare/0.2.5...0.2.6)
+
+## [0.2.5](https://github.com/knsv/mermaid/tree/0.2.5) (2014-11-27)
+
+[Full Changelog](https://github.com/knsv/mermaid/compare/0.2.4...0.2.5)
+
+**Merged pull requests:**
+
+- Added new shapes! [\#1](https://github.com/knsv/mermaid/pull/1) ([bjowes](https://github.com/bjowes))
+
+## [0.2.4](https://github.com/knsv/mermaid/tree/0.2.4) (2014-11-25)
+
+[Full Changelog](https://github.com/knsv/mermaid/compare/0.2.3...0.2.4)
+
+## [0.2.3](https://github.com/knsv/mermaid/tree/0.2.3) (2014-11-24)
+
+[Full Changelog](https://github.com/knsv/mermaid/compare/0.2.2...0.2.3)
+
+## [0.2.2](https://github.com/knsv/mermaid/tree/0.2.2) (2014-11-22)
+
+[Full Changelog](https://github.com/knsv/mermaid/compare/0.2.1...0.2.2)
+
+## [0.2.1](https://github.com/knsv/mermaid/tree/0.2.1) (2014-11-22)
+
+[Full Changelog](https://github.com/knsv/mermaid/compare/0.2.0...0.2.1)
+
+## [0.2.0](https://github.com/knsv/mermaid/tree/0.2.0) (2014-11-22)
+
+[Full Changelog](https://github.com/knsv/mermaid/compare/0.1.1...0.2.0)
+
+## [0.1.1](https://github.com/knsv/mermaid/tree/0.1.1) (2014-11-17)
+
+[Full Changelog](https://github.com/knsv/mermaid/compare/0.1.0...0.1.1)
+
+## [0.1.0](https://github.com/knsv/mermaid/tree/0.1.0) (2014-11-16)

From af585bdcc7c068e09ec23413c8224845c400674e Mon Sep 17 00:00:00 2001
From: SpecularAura 
Date: Thu, 17 Jul 2025 21:09:22 +0000
Subject: [PATCH 055/143] Added a functioning visual test for per link curve
 styling

---
 .../rendering/flowchart-v2.spec.js            | 20 +++++++++++++++++++
 1 file changed, 20 insertions(+)

diff --git a/cypress/integration/rendering/flowchart-v2.spec.js b/cypress/integration/rendering/flowchart-v2.spec.js
index 97fc1ecbd..9ad2b5604 100644
--- a/cypress/integration/rendering/flowchart-v2.spec.js
+++ b/cypress/integration/rendering/flowchart-v2.spec.js
@@ -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 }
+      `
+    );
+  });
 });

From 04612e078a5db5aa0e169a92b58b01b3e20b2aa3 Mon Sep 17 00:00:00 2001
From: SpecularAura 
Date: Thu, 17 Jul 2025 21:12:51 +0000
Subject: [PATCH 056/143] Removed directive syntax from the documentation

---
 .../mermaid/classes/UnknownDiagramError.md    | 138 ++++++++++++------
 .../setup/mermaid/interfaces/ParseOptions.md  |   4 +-
 .../setup/mermaid/interfaces/ParseResult.md   |   6 +-
 .../setup/mermaid/interfaces/RenderResult.md  |   8 +-
 docs/syntax/flowchart.md                      |   6 +-
 packages/mermaid/src/docs/syntax/flowchart.md |   6 +-
 6 files changed, 113 insertions(+), 55 deletions(-)

diff --git a/docs/config/setup/mermaid/classes/UnknownDiagramError.md b/docs/config/setup/mermaid/classes/UnknownDiagramError.md
index c077f0e34..d2956dd5e 100644
--- a/docs/config/setup/mermaid/classes/UnknownDiagramError.md
+++ b/docs/config/setup/mermaid/classes/UnknownDiagramError.md
@@ -88,13 +88,103 @@ Defined in: node_modules/.pnpm/typescript\@5.7.3/node_modules/typescript/lib/lib
 
 ---
 
-### prepareStackTrace()?
+### stackTraceLimit
 
-> `static` `optional` **prepareStackTrace**: (`err`, `stackTraces`) => `any`
+> `static` **stackTraceLimit**: `number`
 
-Defined in: node_modules/.pnpm/@types+node\@22.13.5/node_modules/@types/node/globals.d.ts:143
+Defined in: node_modules/.pnpm/@types+node\@22.16.2/node_modules/@types/node/globals.d.ts:161
 
-Optional override for formatting stack traces
+The `Error.stackTraceLimit` property specifies the number of stack frames
+collected by a stack trace (whether generated by `new Error().stack` or
+`Error.captureStackTrace(obj)`).
+
+The default value is `10` but may be set to any valid JavaScript number. Changes
+will affect any stack trace captured _after_ the value has been changed.
+
+If set to a non-number value, or set to a negative number, stack traces will
+not capture any frames.
+
+#### Inherited from
+
+`Error.stackTraceLimit`
+
+## Methods
+
+### captureStackTrace()
+
+> `static` **captureStackTrace**(`targetObject`, `constructorOpt`?): `void`
+
+Defined in: node_modules/.pnpm/@types+node\@22.16.2/node_modules/@types/node/globals.d.ts:145
+
+Creates a `.stack` property on `targetObject`, which when accessed returns
+a string representing the location in the code at which
+`Error.captureStackTrace()` was called.
+
+```js
+const myObject = {};
+Error.captureStackTrace(myObject);
+myObject.stack; // Similar to `new Error().stack`
+```
+
+The first line of the trace will be prefixed with
+`${myObject.name}: ${myObject.message}`.
+
+The optional `constructorOpt` argument accepts a function. If given, all frames
+above `constructorOpt`, including `constructorOpt`, will be omitted from the
+generated stack trace.
+
+The `constructorOpt` argument is useful for hiding implementation
+details of error generation from the user. For instance:
+
+```js
+function a() {
+  b();
+}
+
+function b() {
+  c();
+}
+
+function c() {
+  // Create an error without stack trace to avoid calculating the stack trace twice.
+  const { stackTraceLimit } = Error;
+  Error.stackTraceLimit = 0;
+  const error = new Error();
+  Error.stackTraceLimit = stackTraceLimit;
+
+  // Capture the stack trace above function b
+  Error.captureStackTrace(error, b); // Neither function c, nor b is included in the stack trace
+  throw error;
+}
+
+a();
+```
+
+#### Parameters
+
+##### targetObject
+
+`object`
+
+##### constructorOpt?
+
+`Function`
+
+#### Returns
+
+`void`
+
+#### Inherited from
+
+`Error.captureStackTrace`
+
+---
+
+### prepareStackTrace()
+
+> `static` **prepareStackTrace**(`err`, `stackTraces`): `any`
+
+Defined in: node_modules/.pnpm/@types+node\@22.16.2/node_modules/@types/node/globals.d.ts:149
 
 #### Parameters
 
@@ -117,43 +207,3 @@ Optional override for formatting stack traces
 #### Inherited from
 
 `Error.prepareStackTrace`
-
----
-
-### stackTraceLimit
-
-> `static` **stackTraceLimit**: `number`
-
-Defined in: node_modules/.pnpm/@types+node\@22.13.5/node_modules/@types/node/globals.d.ts:145
-
-#### Inherited from
-
-`Error.stackTraceLimit`
-
-## Methods
-
-### captureStackTrace()
-
-> `static` **captureStackTrace**(`targetObject`, `constructorOpt`?): `void`
-
-Defined in: node_modules/.pnpm/@types+node\@22.13.5/node_modules/@types/node/globals.d.ts:136
-
-Create .stack property on a target object
-
-#### Parameters
-
-##### targetObject
-
-`object`
-
-##### constructorOpt?
-
-`Function`
-
-#### Returns
-
-`void`
-
-#### Inherited from
-
-`Error.captureStackTrace`
diff --git a/docs/config/setup/mermaid/interfaces/ParseOptions.md b/docs/config/setup/mermaid/interfaces/ParseOptions.md
index e3a968378..ea96f2706 100644
--- a/docs/config/setup/mermaid/interfaces/ParseOptions.md
+++ b/docs/config/setup/mermaid/interfaces/ParseOptions.md
@@ -10,7 +10,7 @@
 
 # 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
 
@@ -18,7 +18,7 @@ Defined in: [packages/mermaid/src/types.ts:59](https://github.com/mermaid-js/mer
 
 > `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.
 The `parseError` function will not be called.
diff --git a/docs/config/setup/mermaid/interfaces/ParseResult.md b/docs/config/setup/mermaid/interfaces/ParseResult.md
index 95d662b42..7a5990610 100644
--- a/docs/config/setup/mermaid/interfaces/ParseResult.md
+++ b/docs/config/setup/mermaid/interfaces/ParseResult.md
@@ -10,7 +10,7 @@
 
 # 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
 
@@ -18,7 +18,7 @@ Defined in: [packages/mermaid/src/types.ts:67](https://github.com/mermaid-js/mer
 
 > **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
 
@@ -28,6 +28,6 @@ The config passed as YAML frontmatter or directives
 
 > **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.
diff --git a/docs/config/setup/mermaid/interfaces/RenderResult.md b/docs/config/setup/mermaid/interfaces/RenderResult.md
index c6dc3cf08..fc5fac4f5 100644
--- a/docs/config/setup/mermaid/interfaces/RenderResult.md
+++ b/docs/config/setup/mermaid/interfaces/RenderResult.md
@@ -10,7 +10,7 @@
 
 # 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
 
@@ -18,7 +18,7 @@ Defined in: [packages/mermaid/src/types.ts:85](https://github.com/mermaid-js/mer
 
 > `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.
 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`
 
-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.
 
@@ -55,6 +55,6 @@ The diagram type, e.g. 'flowchart', 'sequence', etc.
 
 > **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.
diff --git a/docs/syntax/flowchart.md b/docs/syntax/flowchart.md
index 243592515..ee6d2c639 100644
--- a/docs/syntax/flowchart.md
+++ b/docs/syntax/flowchart.md
@@ -1798,7 +1798,11 @@ Available curve styles include `basis`, `bumpX`, `bumpY`, `cardinal`, `catmullRo
 In this example, a left-to-right graph uses the `stepBefore` curve style:
 
 ```
-%%{ init: { 'flowchart': { 'curve': 'stepBefore' } } }%%
+---
+config:
+  flowchart:
+    curve: stepBefore
+---
 graph LR
 ```
 
diff --git a/packages/mermaid/src/docs/syntax/flowchart.md b/packages/mermaid/src/docs/syntax/flowchart.md
index 909162abb..1737f83fb 100644
--- a/packages/mermaid/src/docs/syntax/flowchart.md
+++ b/packages/mermaid/src/docs/syntax/flowchart.md
@@ -1138,7 +1138,11 @@ Available curve styles include `basis`, `bumpX`, `bumpY`, `cardinal`, `catmullRo
 In this example, a left-to-right graph uses the `stepBefore` curve style:
 
 ```
-%%{ init: { 'flowchart': { 'curve': 'stepBefore' } } }%%
+---
+config:
+  flowchart:
+    curve: stepBefore
+---
 graph LR
 ```
 

From 9cef40d1644b2bd914ea30b8b1e43954bcf2e5a5 Mon Sep 17 00:00:00 2001
From: darshanr0107 
Date: Fri, 18 Jul 2025 12:50:26 +0530
Subject: [PATCH 057/143] update changeset

on-behalf-of: @Mermaid-Chart 
---
 .changeset/ninety-roses-turn.md | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/.changeset/ninety-roses-turn.md b/.changeset/ninety-roses-turn.md
index 1eb3a8189..a69a6e7a0 100644
--- a/.changeset/ninety-roses-turn.md
+++ b/.changeset/ninety-roses-turn.md
@@ -2,6 +2,6 @@
 'mermaid': patch
 ---
 
-fix: Add validation for blocks exceeding column width
+fix: log warning for blocks exceeding column width
 
-This update adds a validation check that triggers an error message when a block's width exceeds the defined column layout.
+This update adds a validation check that logs a warning message when a block's width exceeds the defined column layout.

From 64bf34b9abc5bdcdf251e474658cd1b2822fafc4 Mon Sep 17 00:00:00 2001
From: Christian Knittl-Frank 
Date: Fri, 18 Jul 2025 13:54:16 +0100
Subject: [PATCH 058/143] Update MIME type IANA status

The mermaid media type has been recognized by IANA on 2023-09-18
---
 packages/mermaid/src/docs/ecosystem/integrations-create.md | 4 +---
 1 file changed, 1 insertion(+), 3 deletions(-)

diff --git a/packages/mermaid/src/docs/ecosystem/integrations-create.md b/packages/mermaid/src/docs/ecosystem/integrations-create.md
index 0341f1bf8..0dbae0d04 100644
--- a/packages/mermaid/src/docs/ecosystem/integrations-create.md
+++ b/packages/mermaid/src/docs/ecosystem/integrations-create.md
@@ -10,9 +10,7 @@ Applications that support Mermaid files [SHOULD](https://datatracker.ietf.org/do
 
 ### MIME Type
 
-The recommended [MIME type](https://www.iana.org/assignments/media-types/media-types.xhtml) for Mermaid media is `text/vnd.mermaid`.
-
-Currently pending [IANA](https://www.iana.org/) recognition.
+The recommended [MIME type](https://www.iana.org/assignments/media-types/media-types.xhtml) for Mermaid media is [`text/vnd.mermaid`](https://www.iana.org/assignments/media-types/application/vnd.mermaid).
 
 ## Showcase
 

From a27d90fe9cd856bdc9a8277be6a1b9d14a4b1c2a Mon Sep 17 00:00:00 2001
From: "autofix-ci[bot]" <114827586+autofix-ci[bot]@users.noreply.github.com>
Date: Fri, 18 Jul 2025 13:05:27 +0000
Subject: [PATCH 059/143] [autofix.ci] apply automated fixes

---
 docs/ecosystem/integrations-create.md | 4 +---
 1 file changed, 1 insertion(+), 3 deletions(-)

diff --git a/docs/ecosystem/integrations-create.md b/docs/ecosystem/integrations-create.md
index 921368406..9538243f3 100644
--- a/docs/ecosystem/integrations-create.md
+++ b/docs/ecosystem/integrations-create.md
@@ -16,9 +16,7 @@ Applications that support Mermaid files [SHOULD](https://datatracker.ietf.org/do
 
 ### MIME Type
 
-The recommended [MIME type](https://www.iana.org/assignments/media-types/media-types.xhtml) for Mermaid media is `text/vnd.mermaid`.
-
-Currently pending [IANA](https://www.iana.org/) recognition.
+The recommended [MIME type](https://www.iana.org/assignments/media-types/media-types.xhtml) for Mermaid media is [`text/vnd.mermaid`](https://www.iana.org/assignments/media-types/application/vnd.mermaid).
 
 ## Showcase
 

From cd282f2245a1df571bd778f5ed4155b575981434 Mon Sep 17 00:00:00 2001
From: SpecularAura 
Date: Fri, 18 Jul 2025 21:19:06 +0000
Subject: [PATCH 060/143] Added Documentation for the per link styling in
 syntax/flowchat

---
 docs/community/contributing.md                |  3 +-
 docs/community/intro.md                       |  6 ++-
 docs/config/directives.md                     |  1 -
 .../mermaid/classes/UnknownDiagramError.md    |  6 +--
 docs/ecosystem/mermaid-chart.md               |  1 -
 docs/news/announcements.md                    |  2 -
 docs/syntax/c4.md                             |  6 ---
 docs/syntax/flowchart.md                      | 39 ++++++++++++++++++-
 docs/syntax/gantt.md                          |  3 +-
 packages/mermaid/src/docs/syntax/flowchart.md | 31 ++++++++++++++-
 10 files changed, 77 insertions(+), 21 deletions(-)

diff --git a/docs/community/contributing.md b/docs/community/contributing.md
index 596b26430..5f7290693 100644
--- a/docs/community/contributing.md
+++ b/docs/community/contributing.md
@@ -29,7 +29,8 @@ In GitHub, you first [**fork a mermaid repository**](https://github.com/mermaid-
 
 Then you **clone** a copy to your local development machine (e.g. where you code) to make a copy with all the files to work with.
 
-> **💡 Tip** > [Here is a GitHub document that gives an overview of the process](https://docs.github.com/en/get-started/quickstart/fork-a-repo).
+> **💡 Tip**
+> [Here is a GitHub document that gives an overview of the process](https://docs.github.com/en/get-started/quickstart/fork-a-repo).
 
 ```bash
 git clone git@github.com/your-fork/mermaid
diff --git a/docs/community/intro.md b/docs/community/intro.md
index 6b1430572..a549d031e 100644
--- a/docs/community/intro.md
+++ b/docs/community/intro.md
@@ -33,7 +33,8 @@ mindmap
 
 ## Join the Development
 
-> **💡 Tip** > **Check out our** [**detailed contribution guide**](./contributing.md).
+> **💡 Tip**
+> **Check out our** [**detailed contribution guide**](./contributing.md).
 
 Where to start:
 
@@ -47,7 +48,8 @@ Where to start:
 
 ## A Question Or a Suggestion?
 
-> **💡 Tip** > **Have a look at** [**how to open an issue**](./questions-and-suggestions.md).
+> **💡 Tip**
+> **Have a look at** [**how to open an issue**](./questions-and-suggestions.md).
 
 If you have faced a vulnerability [report it to us](./security.md).
 
diff --git a/docs/config/directives.md b/docs/config/directives.md
index 13a663133..40ebd81a4 100644
--- a/docs/config/directives.md
+++ b/docs/config/directives.md
@@ -22,7 +22,6 @@ While directives allow you to change most of the default configuration settings,
 Mermaid basically supports two types of configuration options to be overridden by directives.
 
 1. _General/Top Level configurations_ : These are the configurations that are available and applied to all the diagram. **Some of the most important top-level** configurations are:
-
    - theme
    - fontFamily
    - logLevel
diff --git a/docs/config/setup/mermaid/classes/UnknownDiagramError.md b/docs/config/setup/mermaid/classes/UnknownDiagramError.md
index d2956dd5e..5d8d47461 100644
--- a/docs/config/setup/mermaid/classes/UnknownDiagramError.md
+++ b/docs/config/setup/mermaid/classes/UnknownDiagramError.md
@@ -92,7 +92,7 @@ Defined in: node_modules/.pnpm/typescript\@5.7.3/node_modules/typescript/lib/lib
 
 > `static` **stackTraceLimit**: `number`
 
-Defined in: node_modules/.pnpm/@types+node\@22.16.2/node_modules/@types/node/globals.d.ts:161
+Defined in: node_modules/.pnpm/@types+node\@22.16.4/node_modules/@types/node/globals.d.ts:161
 
 The `Error.stackTraceLimit` property specifies the number of stack frames
 collected by a stack trace (whether generated by `new Error().stack` or
@@ -114,7 +114,7 @@ not capture any frames.
 
 > `static` **captureStackTrace**(`targetObject`, `constructorOpt`?): `void`
 
-Defined in: node_modules/.pnpm/@types+node\@22.16.2/node_modules/@types/node/globals.d.ts:145
+Defined in: node_modules/.pnpm/@types+node\@22.16.4/node_modules/@types/node/globals.d.ts:145
 
 Creates a `.stack` property on `targetObject`, which when accessed returns
 a string representing the location in the code at which
@@ -184,7 +184,7 @@ a();
 
 > `static` **prepareStackTrace**(`err`, `stackTraces`): `any`
 
-Defined in: node_modules/.pnpm/@types+node\@22.16.2/node_modules/@types/node/globals.d.ts:149
+Defined in: node_modules/.pnpm/@types+node\@22.16.4/node_modules/@types/node/globals.d.ts:149
 
 #### Parameters
 
diff --git a/docs/ecosystem/mermaid-chart.md b/docs/ecosystem/mermaid-chart.md
index 8100a1846..fd1e70aca 100644
--- a/docs/ecosystem/mermaid-chart.md
+++ b/docs/ecosystem/mermaid-chart.md
@@ -29,7 +29,6 @@ Try the Ultimate AI, Mermaid, and Visual Diagramming Suite by creating an accoun
 - **Plugins** - A plugin system for extending the functionality of Mermaid.
 
   Official Mermaid Chart plugins:
-
   - [Mermaid Chart GPT](https://chatgpt.com/g/g-684cc36f30208191b21383b88650a45d-mermaid-chart-diagrams-and-charts)
   - [Confluence](https://marketplace.atlassian.com/apps/1234056/mermaid-chart-for-confluence?hosting=cloud&tab=overview)
   - [Jira](https://marketplace.atlassian.com/apps/1234810/mermaid-chart-for-jira?tab=overview&hosting=cloud)
diff --git a/docs/news/announcements.md b/docs/news/announcements.md
index a8a67343d..e054d2da0 100644
--- a/docs/news/announcements.md
+++ b/docs/news/announcements.md
@@ -35,13 +35,11 @@ The Mermaid Chart team is excited to introduce a new Visual Editor for Flowchart
 Learn more:
 
 - Visual Editor For Flowcharts
-
   - [Blog post](https://www.mermaidchart.com/blog/posts/mermaid-chart-releases-new-visual-editor-for-flowcharts)
 
   - [Demo video](https://www.youtube.com/watch?v=5aja0gijoO0)
 
 - Visual Editor For Sequence diagrams
-
   - [Blog post](https://www.mermaidchart.com/blog/posts/mermaid-chart-unveils-visual-editor-for-sequence-diagrams)
 
   - [Demo video](https://youtu.be/imc2u5_N6Dc)
diff --git a/docs/syntax/c4.md b/docs/syntax/c4.md
index c1d2e1597..ae610d152 100644
--- a/docs/syntax/c4.md
+++ b/docs/syntax/c4.md
@@ -139,7 +139,6 @@ The following unfinished features are not supported in the short term.
 - [ ] Legend
 
 - [x] System Context
-
   - [x] Person(alias, label, ?descr, ?sprite, ?tags, $link)
   - [x] Person_Ext
   - [x] System(alias, label, ?descr, ?sprite, ?tags, $link)
@@ -153,7 +152,6 @@ The following unfinished features are not supported in the short term.
   - [x] System_Boundary
 
 - [x] Container diagram
-
   - [x] Container(alias, label, ?techn, ?descr, ?sprite, ?tags, $link)
   - [x] ContainerDb
   - [x] ContainerQueue
@@ -163,7 +161,6 @@ The following unfinished features are not supported in the short term.
   - [x] Container_Boundary(alias, label, ?tags, $link)
 
 - [x] Component diagram
-
   - [x] Component(alias, label, ?techn, ?descr, ?sprite, ?tags, $link)
   - [x] ComponentDb
   - [x] ComponentQueue
@@ -172,18 +169,15 @@ The following unfinished features are not supported in the short term.
   - [x] ComponentQueue_Ext
 
 - [x] Dynamic diagram
-
   - [x] RelIndex(index, from, to, label, ?tags, $link)
 
 - [x] Deployment diagram
-
   - [x] Deployment_Node(alias, label, ?type, ?descr, ?sprite, ?tags, $link)
   - [x] Node(alias, label, ?type, ?descr, ?sprite, ?tags, $link): short name of Deployment_Node()
   - [x] Node_L(alias, label, ?type, ?descr, ?sprite, ?tags, $link): left aligned Node()
   - [x] Node_R(alias, label, ?type, ?descr, ?sprite, ?tags, $link): right aligned Node()
 
 - [x] Relationship Types
-
   - [x] Rel(from, to, label, ?techn, ?descr, ?sprite, ?tags, $link)
   - [x] BiRel (bidirectional relationship)
   - [x] Rel_U, Rel_Up
diff --git a/docs/syntax/flowchart.md b/docs/syntax/flowchart.md
index ee6d2c639..5f827e52a 100644
--- a/docs/syntax/flowchart.md
+++ b/docs/syntax/flowchart.md
@@ -1795,6 +1795,16 @@ It is possible to style the type of curve used for lines between items, if the d
 Available curve styles include `basis`, `bumpX`, `bumpY`, `cardinal`, `catmullRom`, `linear`, `monotoneX`, `monotoneY`,
 `natural`, `step`, `stepAfter`, and `stepBefore`.
 
+For a full list of available curves, including an explanation of custom curves, refer to
+the [Shapes](https://d3js.org/d3-shape/curve) documentation in the [d3-shape](https://github.com/d3/d3-shape/) project.
+
+Line styling can be achieved in two ways:
+
+1. Change the curve style of all the lines
+2. Change the curve style of a particular line
+
+#### Diagram level curve style
+
 In this example, a left-to-right graph uses the `stepBefore` curve style:
 
 ```
@@ -1806,8 +1816,33 @@ config:
 graph LR
 ```
 
-For a full list of available curves, including an explanation of custom curves, refer to
-the [Shapes](https://d3js.org/d3-shape/curve) documentation in the [d3-shape](https://github.com/d3/d3-shape/) project.
+#### Edge level curve style using Edge IDs (v\+)
+
+You can assign IDs to [edges](#attaching-an-id-to-edges). After assigning an ID you can modify the line style by modifying the edge's `curve` property using the following syntax:
+
+```mermaid-example
+flowchart LR
+    A e1@==> B
+    A e2@--> C
+    e1@{ curve: linear }
+    e2@{ curve: natural }
+```
+
+```mermaid
+flowchart LR
+    A e1@==> B
+    A e2@--> C
+    e1@{ curve: linear }
+    e2@{ curve: natural }
+```
+
+```info
+Any edge curve style modified at the edge level overrides the diagram level style.
+```
+
+```info
+If the same edge is modified multiple times the last modification will be rendered.
+```
 
 ### Styling a node
 
diff --git a/docs/syntax/gantt.md b/docs/syntax/gantt.md
index 552c1658a..3a42f04e1 100644
--- a/docs/syntax/gantt.md
+++ b/docs/syntax/gantt.md
@@ -360,7 +360,8 @@ gantt
   weekday monday
 ```
 
-> **Warning** > `millisecond` and `second` support was added in v10.3.0
+> **Warning**
+> `millisecond` and `second` support was added in v10.3.0
 
 ## Output in compact mode
 
diff --git a/packages/mermaid/src/docs/syntax/flowchart.md b/packages/mermaid/src/docs/syntax/flowchart.md
index 1737f83fb..31c2a949f 100644
--- a/packages/mermaid/src/docs/syntax/flowchart.md
+++ b/packages/mermaid/src/docs/syntax/flowchart.md
@@ -1135,6 +1135,16 @@ It is possible to style the type of curve used for lines between items, if the d
 Available curve styles include `basis`, `bumpX`, `bumpY`, `cardinal`, `catmullRom`, `linear`, `monotoneX`, `monotoneY`,
 `natural`, `step`, `stepAfter`, and `stepBefore`.
 
+For a full list of available curves, including an explanation of custom curves, refer to
+the [Shapes](https://d3js.org/d3-shape/curve) documentation in the [d3-shape](https://github.com/d3/d3-shape/) project.
+
+Line styling can be achieved in two ways:
+
+1. Change the curve style of all the lines
+2. Change the curve style of a particular line
+
+#### Diagram level curve style
+
 In this example, a left-to-right graph uses the `stepBefore` curve style:
 
 ```
@@ -1146,8 +1156,25 @@ config:
 graph LR
 ```
 
-For a full list of available curves, including an explanation of custom curves, refer to
-the [Shapes](https://d3js.org/d3-shape/curve) documentation in the [d3-shape](https://github.com/d3/d3-shape/) project.
+#### Edge level curve style using Edge IDs (v+)
+
+You can assign IDs to [edges](#attaching-an-id-to-edges). After assigning an ID you can modify the line style by modifying the edge's `curve` property using the following syntax:
+
+```mermaid
+flowchart LR
+    A e1@==> B
+    A e2@--> C
+    e1@{ curve: linear }
+    e2@{ curve: natural }
+```
+
+```info
+Any edge curve style modified at the edge level overrides the diagram level style.
+```
+
+```info
+If the same edge is modified multiple times the last modification will be rendered.
+```
 
 ### Styling a node
 

From 000308c8f52f641fd0cb58b1b2a6b5496c3f6889 Mon Sep 17 00:00:00 2001
From: "autofix-ci[bot]" <114827586+autofix-ci[bot]@users.noreply.github.com>
Date: Fri, 18 Jul 2025 21:44:56 +0000
Subject: [PATCH 061/143] [autofix.ci] apply automated fixes

---
 docs/community/contributing.md                |   3 +-
 docs/community/intro.md                       |   6 +-
 docs/config/directives.md                     |   1 +
 .../mermaid/classes/UnknownDiagramError.md    | 138 ++++++------------
 docs/ecosystem/mermaid-chart.md               |   1 +
 docs/news/announcements.md                    |   2 +
 docs/syntax/c4.md                             |   6 +
 docs/syntax/gantt.md                          |   3 +-
 8 files changed, 58 insertions(+), 102 deletions(-)

diff --git a/docs/community/contributing.md b/docs/community/contributing.md
index 5f7290693..596b26430 100644
--- a/docs/community/contributing.md
+++ b/docs/community/contributing.md
@@ -29,8 +29,7 @@ In GitHub, you first [**fork a mermaid repository**](https://github.com/mermaid-
 
 Then you **clone** a copy to your local development machine (e.g. where you code) to make a copy with all the files to work with.
 
-> **💡 Tip**
-> [Here is a GitHub document that gives an overview of the process](https://docs.github.com/en/get-started/quickstart/fork-a-repo).
+> **💡 Tip** > [Here is a GitHub document that gives an overview of the process](https://docs.github.com/en/get-started/quickstart/fork-a-repo).
 
 ```bash
 git clone git@github.com/your-fork/mermaid
diff --git a/docs/community/intro.md b/docs/community/intro.md
index a549d031e..6b1430572 100644
--- a/docs/community/intro.md
+++ b/docs/community/intro.md
@@ -33,8 +33,7 @@ mindmap
 
 ## Join the Development
 
-> **💡 Tip**
-> **Check out our** [**detailed contribution guide**](./contributing.md).
+> **💡 Tip** > **Check out our** [**detailed contribution guide**](./contributing.md).
 
 Where to start:
 
@@ -48,8 +47,7 @@ Where to start:
 
 ## A Question Or a Suggestion?
 
-> **💡 Tip**
-> **Have a look at** [**how to open an issue**](./questions-and-suggestions.md).
+> **💡 Tip** > **Have a look at** [**how to open an issue**](./questions-and-suggestions.md).
 
 If you have faced a vulnerability [report it to us](./security.md).
 
diff --git a/docs/config/directives.md b/docs/config/directives.md
index 40ebd81a4..13a663133 100644
--- a/docs/config/directives.md
+++ b/docs/config/directives.md
@@ -22,6 +22,7 @@ While directives allow you to change most of the default configuration settings,
 Mermaid basically supports two types of configuration options to be overridden by directives.
 
 1. _General/Top Level configurations_ : These are the configurations that are available and applied to all the diagram. **Some of the most important top-level** configurations are:
+
    - theme
    - fontFamily
    - logLevel
diff --git a/docs/config/setup/mermaid/classes/UnknownDiagramError.md b/docs/config/setup/mermaid/classes/UnknownDiagramError.md
index 5d8d47461..c077f0e34 100644
--- a/docs/config/setup/mermaid/classes/UnknownDiagramError.md
+++ b/docs/config/setup/mermaid/classes/UnknownDiagramError.md
@@ -88,103 +88,13 @@ Defined in: node_modules/.pnpm/typescript\@5.7.3/node_modules/typescript/lib/lib
 
 ---
 
-### stackTraceLimit
+### prepareStackTrace()?
 
-> `static` **stackTraceLimit**: `number`
+> `static` `optional` **prepareStackTrace**: (`err`, `stackTraces`) => `any`
 
-Defined in: node_modules/.pnpm/@types+node\@22.16.4/node_modules/@types/node/globals.d.ts:161
+Defined in: node_modules/.pnpm/@types+node\@22.13.5/node_modules/@types/node/globals.d.ts:143
 
-The `Error.stackTraceLimit` property specifies the number of stack frames
-collected by a stack trace (whether generated by `new Error().stack` or
-`Error.captureStackTrace(obj)`).
-
-The default value is `10` but may be set to any valid JavaScript number. Changes
-will affect any stack trace captured _after_ the value has been changed.
-
-If set to a non-number value, or set to a negative number, stack traces will
-not capture any frames.
-
-#### Inherited from
-
-`Error.stackTraceLimit`
-
-## Methods
-
-### captureStackTrace()
-
-> `static` **captureStackTrace**(`targetObject`, `constructorOpt`?): `void`
-
-Defined in: node_modules/.pnpm/@types+node\@22.16.4/node_modules/@types/node/globals.d.ts:145
-
-Creates a `.stack` property on `targetObject`, which when accessed returns
-a string representing the location in the code at which
-`Error.captureStackTrace()` was called.
-
-```js
-const myObject = {};
-Error.captureStackTrace(myObject);
-myObject.stack; // Similar to `new Error().stack`
-```
-
-The first line of the trace will be prefixed with
-`${myObject.name}: ${myObject.message}`.
-
-The optional `constructorOpt` argument accepts a function. If given, all frames
-above `constructorOpt`, including `constructorOpt`, will be omitted from the
-generated stack trace.
-
-The `constructorOpt` argument is useful for hiding implementation
-details of error generation from the user. For instance:
-
-```js
-function a() {
-  b();
-}
-
-function b() {
-  c();
-}
-
-function c() {
-  // Create an error without stack trace to avoid calculating the stack trace twice.
-  const { stackTraceLimit } = Error;
-  Error.stackTraceLimit = 0;
-  const error = new Error();
-  Error.stackTraceLimit = stackTraceLimit;
-
-  // Capture the stack trace above function b
-  Error.captureStackTrace(error, b); // Neither function c, nor b is included in the stack trace
-  throw error;
-}
-
-a();
-```
-
-#### Parameters
-
-##### targetObject
-
-`object`
-
-##### constructorOpt?
-
-`Function`
-
-#### Returns
-
-`void`
-
-#### Inherited from
-
-`Error.captureStackTrace`
-
----
-
-### prepareStackTrace()
-
-> `static` **prepareStackTrace**(`err`, `stackTraces`): `any`
-
-Defined in: node_modules/.pnpm/@types+node\@22.16.4/node_modules/@types/node/globals.d.ts:149
+Optional override for formatting stack traces
 
 #### Parameters
 
@@ -207,3 +117,43 @@ Defined in: node_modules/.pnpm/@types+node\@22.16.4/node_modules/@types/node/glo
 #### Inherited from
 
 `Error.prepareStackTrace`
+
+---
+
+### stackTraceLimit
+
+> `static` **stackTraceLimit**: `number`
+
+Defined in: node_modules/.pnpm/@types+node\@22.13.5/node_modules/@types/node/globals.d.ts:145
+
+#### Inherited from
+
+`Error.stackTraceLimit`
+
+## Methods
+
+### captureStackTrace()
+
+> `static` **captureStackTrace**(`targetObject`, `constructorOpt`?): `void`
+
+Defined in: node_modules/.pnpm/@types+node\@22.13.5/node_modules/@types/node/globals.d.ts:136
+
+Create .stack property on a target object
+
+#### Parameters
+
+##### targetObject
+
+`object`
+
+##### constructorOpt?
+
+`Function`
+
+#### Returns
+
+`void`
+
+#### Inherited from
+
+`Error.captureStackTrace`
diff --git a/docs/ecosystem/mermaid-chart.md b/docs/ecosystem/mermaid-chart.md
index fd1e70aca..8100a1846 100644
--- a/docs/ecosystem/mermaid-chart.md
+++ b/docs/ecosystem/mermaid-chart.md
@@ -29,6 +29,7 @@ Try the Ultimate AI, Mermaid, and Visual Diagramming Suite by creating an accoun
 - **Plugins** - A plugin system for extending the functionality of Mermaid.
 
   Official Mermaid Chart plugins:
+
   - [Mermaid Chart GPT](https://chatgpt.com/g/g-684cc36f30208191b21383b88650a45d-mermaid-chart-diagrams-and-charts)
   - [Confluence](https://marketplace.atlassian.com/apps/1234056/mermaid-chart-for-confluence?hosting=cloud&tab=overview)
   - [Jira](https://marketplace.atlassian.com/apps/1234810/mermaid-chart-for-jira?tab=overview&hosting=cloud)
diff --git a/docs/news/announcements.md b/docs/news/announcements.md
index e054d2da0..a8a67343d 100644
--- a/docs/news/announcements.md
+++ b/docs/news/announcements.md
@@ -35,11 +35,13 @@ The Mermaid Chart team is excited to introduce a new Visual Editor for Flowchart
 Learn more:
 
 - Visual Editor For Flowcharts
+
   - [Blog post](https://www.mermaidchart.com/blog/posts/mermaid-chart-releases-new-visual-editor-for-flowcharts)
 
   - [Demo video](https://www.youtube.com/watch?v=5aja0gijoO0)
 
 - Visual Editor For Sequence diagrams
+
   - [Blog post](https://www.mermaidchart.com/blog/posts/mermaid-chart-unveils-visual-editor-for-sequence-diagrams)
 
   - [Demo video](https://youtu.be/imc2u5_N6Dc)
diff --git a/docs/syntax/c4.md b/docs/syntax/c4.md
index ae610d152..c1d2e1597 100644
--- a/docs/syntax/c4.md
+++ b/docs/syntax/c4.md
@@ -139,6 +139,7 @@ The following unfinished features are not supported in the short term.
 - [ ] Legend
 
 - [x] System Context
+
   - [x] Person(alias, label, ?descr, ?sprite, ?tags, $link)
   - [x] Person_Ext
   - [x] System(alias, label, ?descr, ?sprite, ?tags, $link)
@@ -152,6 +153,7 @@ The following unfinished features are not supported in the short term.
   - [x] System_Boundary
 
 - [x] Container diagram
+
   - [x] Container(alias, label, ?techn, ?descr, ?sprite, ?tags, $link)
   - [x] ContainerDb
   - [x] ContainerQueue
@@ -161,6 +163,7 @@ The following unfinished features are not supported in the short term.
   - [x] Container_Boundary(alias, label, ?tags, $link)
 
 - [x] Component diagram
+
   - [x] Component(alias, label, ?techn, ?descr, ?sprite, ?tags, $link)
   - [x] ComponentDb
   - [x] ComponentQueue
@@ -169,15 +172,18 @@ The following unfinished features are not supported in the short term.
   - [x] ComponentQueue_Ext
 
 - [x] Dynamic diagram
+
   - [x] RelIndex(index, from, to, label, ?tags, $link)
 
 - [x] Deployment diagram
+
   - [x] Deployment_Node(alias, label, ?type, ?descr, ?sprite, ?tags, $link)
   - [x] Node(alias, label, ?type, ?descr, ?sprite, ?tags, $link): short name of Deployment_Node()
   - [x] Node_L(alias, label, ?type, ?descr, ?sprite, ?tags, $link): left aligned Node()
   - [x] Node_R(alias, label, ?type, ?descr, ?sprite, ?tags, $link): right aligned Node()
 
 - [x] Relationship Types
+
   - [x] Rel(from, to, label, ?techn, ?descr, ?sprite, ?tags, $link)
   - [x] BiRel (bidirectional relationship)
   - [x] Rel_U, Rel_Up
diff --git a/docs/syntax/gantt.md b/docs/syntax/gantt.md
index 3a42f04e1..552c1658a 100644
--- a/docs/syntax/gantt.md
+++ b/docs/syntax/gantt.md
@@ -360,8 +360,7 @@ gantt
   weekday monday
 ```
 
-> **Warning**
-> `millisecond` and `second` support was added in v10.3.0
+> **Warning** > `millisecond` and `second` support was added in v10.3.0
 
 ## Output in compact mode
 

From b94f1336ab555cba826bd87a593544577f91e9d0 Mon Sep 17 00:00:00 2001
From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com>
Date: Wed, 23 Jul 2025 09:14:38 +0000
Subject: [PATCH 062/143] chore(deps): update peter-evans/create-pull-request
 digest to 2e50522

---
 .github/workflows/e2e-timings.yml | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/.github/workflows/e2e-timings.yml b/.github/workflows/e2e-timings.yml
index 00e733c48..5040bb8e4 100644
--- a/.github/workflows/e2e-timings.yml
+++ b/.github/workflows/e2e-timings.yml
@@ -58,7 +58,7 @@ jobs:
           echo "EOF" >> $GITHUB_OUTPUT
 
       - name: Commit and create pull request
-        uses: peter-evans/create-pull-request@889dce9eaba7900ce30494f5e1ac7220b27e5c81
+        uses: peter-evans/create-pull-request@2e50522bdf313efe32e5628afead9048374012ed
         with:
           add-paths: |
             cypress/timings.json

From 366d217928d65dbf966980b16ef66a430a4b3691 Mon Sep 17 00:00:00 2001
From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com>
Date: Wed, 23 Jul 2025 09:15:14 +0000
Subject: [PATCH 063/143] chore(deps): update eslint

---
 package.json   |  14 +-
 pnpm-lock.yaml | 710 +++++++++++++++++++++----------------------------
 2 files changed, 315 insertions(+), 409 deletions(-)

diff --git a/package.json b/package.json
index e85e380f9..c407d1158 100644
--- a/package.json
+++ b/package.json
@@ -67,7 +67,7 @@
     "@argos-ci/cypress": "^5.0.2",
     "@changesets/changelog-github": "^0.5.1",
     "@changesets/cli": "^2.27.12",
-    "@cspell/eslint-plugin": "^8.19.3",
+    "@cspell/eslint-plugin": "^8.19.4",
     "@cypress/code-coverage": "^3.12.49",
     "@eslint/js": "^9.26.0",
     "@rollup/plugin-typescript": "^12.1.2",
@@ -94,17 +94,17 @@
     "cypress-split": "^1.24.14",
     "esbuild": "^0.25.0",
     "eslint": "^9.26.0",
-    "eslint-config-prettier": "^10.1.1",
+    "eslint-config-prettier": "^10.1.8",
     "eslint-plugin-cypress": "^4.3.0",
-    "eslint-plugin-html": "^8.1.2",
-    "eslint-plugin-jest": "^28.11.0",
-    "eslint-plugin-jsdoc": "^50.6.9",
+    "eslint-plugin-html": "^8.1.3",
+    "eslint-plugin-jest": "^28.11.2",
+    "eslint-plugin-jsdoc": "^50.6.17",
     "eslint-plugin-json": "^4.0.1",
     "eslint-plugin-lodash": "^8.0.0",
     "eslint-plugin-markdown": "^5.1.0",
     "eslint-plugin-no-only-tests": "^3.3.0",
     "eslint-plugin-tsdoc": "^0.4.0",
-    "eslint-plugin-unicorn": "^59.0.0",
+    "eslint-plugin-unicorn": "^59.0.1",
     "express": "^5.1.0",
     "globals": "^16.0.0",
     "globby": "^14.0.2",
@@ -126,7 +126,7 @@
     "tslib": "^2.8.1",
     "tsx": "^4.7.3",
     "typescript": "~5.7.3",
-    "typescript-eslint": "^8.32.0",
+    "typescript-eslint": "^8.32.1",
     "vite": "^7.0.3",
     "vite-plugin-istanbul": "^7.0.0",
     "vitest": "^3.0.6"
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index ea7a7dd21..85424c1be 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -26,8 +26,8 @@ importers:
         specifier: ^2.27.12
         version: 2.28.1
       '@cspell/eslint-plugin':
-        specifier: ^8.19.3
-        version: 8.19.3(eslint@9.26.0(jiti@2.4.2))
+        specifier: ^8.19.4
+        version: 8.19.4(eslint@9.26.0(jiti@2.4.2))
       '@cypress/code-coverage':
         specifier: ^3.12.49
         version: 3.13.4(@babel/core@7.27.1)(@babel/preset-env@7.27.2(@babel/core@7.27.1))(babel-loader@9.2.1(@babel/core@7.27.1)(webpack@5.95.0(esbuild@0.25.0)))(cypress@14.5.1)(webpack@5.95.0(esbuild@0.25.0))
@@ -107,20 +107,20 @@ importers:
         specifier: ^9.26.0
         version: 9.26.0(jiti@2.4.2)
       eslint-config-prettier:
-        specifier: ^10.1.1
-        version: 10.1.1(eslint@9.26.0(jiti@2.4.2))
+        specifier: ^10.1.8
+        version: 10.1.8(eslint@9.26.0(jiti@2.4.2))
       eslint-plugin-cypress:
         specifier: ^4.3.0
         version: 4.3.0(eslint@9.26.0(jiti@2.4.2))
       eslint-plugin-html:
-        specifier: ^8.1.2
-        version: 8.1.2
+        specifier: ^8.1.3
+        version: 8.1.3
       eslint-plugin-jest:
-        specifier: ^28.11.0
-        version: 28.11.0(@typescript-eslint/eslint-plugin@8.32.0(@typescript-eslint/parser@8.32.0(eslint@9.26.0(jiti@2.4.2))(typescript@5.7.3))(eslint@9.26.0(jiti@2.4.2))(typescript@5.7.3))(eslint@9.26.0(jiti@2.4.2))(jest@30.0.4(@types/node@22.13.5))(typescript@5.7.3)
+        specifier: ^28.11.2
+        version: 28.14.0(@typescript-eslint/eslint-plugin@8.38.0(@typescript-eslint/parser@8.38.0(eslint@9.26.0(jiti@2.4.2))(typescript@5.7.3))(eslint@9.26.0(jiti@2.4.2))(typescript@5.7.3))(eslint@9.26.0(jiti@2.4.2))(jest@30.0.4(@types/node@22.13.5))(typescript@5.7.3)
       eslint-plugin-jsdoc:
-        specifier: ^50.6.9
-        version: 50.6.9(eslint@9.26.0(jiti@2.4.2))
+        specifier: ^50.6.17
+        version: 50.8.0(eslint@9.26.0(jiti@2.4.2))
       eslint-plugin-json:
         specifier: ^4.0.1
         version: 4.0.1
@@ -137,8 +137,8 @@ importers:
         specifier: ^0.4.0
         version: 0.4.0
       eslint-plugin-unicorn:
-        specifier: ^59.0.0
-        version: 59.0.0(eslint@9.26.0(jiti@2.4.2))
+        specifier: ^59.0.1
+        version: 59.0.1(eslint@9.26.0(jiti@2.4.2))
       express:
         specifier: ^5.1.0
         version: 5.1.0
@@ -203,8 +203,8 @@ importers:
         specifier: ~5.7.3
         version: 5.7.3
       typescript-eslint:
-        specifier: ^8.32.0
-        version: 8.32.0(eslint@9.26.0(jiti@2.4.2))(typescript@5.7.3)
+        specifier: ^8.32.1
+        version: 8.38.0(eslint@9.26.0(jiti@2.4.2))(typescript@5.7.3)
       vite:
         specifier: ^7.0.3
         version: 7.0.3(@types/node@22.13.5)(jiti@2.4.2)(terser@5.39.0)(tsx@4.19.3)(yaml@2.8.0)
@@ -909,10 +909,6 @@ packages:
     resolution: {integrity: sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==}
     engines: {node: '>=6.9.0'}
 
-  '@babel/helper-validator-identifier@7.25.9':
-    resolution: {integrity: sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==}
-    engines: {node: '>=6.9.0'}
-
   '@babel/helper-validator-identifier@7.27.1':
     resolution: {integrity: sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==}
     engines: {node: '>=6.9.0'}
@@ -1522,8 +1518,8 @@ packages:
   '@chevrotain/utils@11.0.3':
     resolution: {integrity: sha512-YslZMgtJUyuMbZ+aKvfF3x1f5liK4mWNxghFRv7jqRR9C3R3fAOGTTKvxXDa2Y1s9zSbcpuO0cAxDYsc9SrXoQ==}
 
-  '@cspell/cspell-bundled-dicts@8.19.3':
-    resolution: {integrity: sha512-HRxcvD+fqgq6Ag6K7TMnlsO1Uq2nc3V/ug4huZSKK/+tErB1i/m4N4gkOzO0pFtQsJDhGdlio3Wud2ce6kVpdw==}
+  '@cspell/cspell-bundled-dicts@8.19.4':
+    resolution: {integrity: sha512-2ZRcZP/ncJ5q953o8i+R0fb8+14PDt5UefUNMrFZZHvfTI0jukAASOQeLY+WT6ASZv6CgbPrApAdbppy9FaXYQ==}
     engines: {node: '>=18'}
 
   '@cspell/cspell-bundled-dicts@9.1.3':
@@ -1534,32 +1530,32 @@ packages:
     resolution: {integrity: sha512-FvzlSQuU+bNeo77v0KrA/lkoe324cHvZNhkx7Dtp1aj01FeBr5Y36gozR3DNY6tewBi6hC7uLeeNg/iSBf6CWg==}
     engines: {node: '>=20'}
 
-  '@cspell/cspell-pipe@8.19.3':
-    resolution: {integrity: sha512-Z90x+Kbq1P3A7iOsRe6FnsF2nisMKCY6bln03mTvHW0MmT8F69BEZTSZaL4z+kQ0L8qbjthJ+FqbQKYNNbPZpg==}
+  '@cspell/cspell-pipe@8.19.4':
+    resolution: {integrity: sha512-GNAyk+7ZLEcL2fCMT5KKZprcdsq3L1eYy3e38/tIeXfbZS7Sd1R5FXUe6CHXphVWTItV39TvtLiDwN/2jBts9A==}
     engines: {node: '>=18'}
 
   '@cspell/cspell-pipe@9.1.3':
     resolution: {integrity: sha512-Cns37ml7IaXMWBci9XOqdTkP9nFtOO8+sJ4VvtbVO68Zo8v0vq74ApDbPgGI2HzYtn7Jj2hxQqGIBdLnmrMPyA==}
     engines: {node: '>=20'}
 
-  '@cspell/cspell-resolver@8.19.3':
-    resolution: {integrity: sha512-hsEx/7q0tDCOFtMmlkpynlApgAWo4/7q846Y1deyDChtIElmS0dfuzdKzv3jvFi3KdTVgJyhJb+o7/OHH2D/4A==}
+  '@cspell/cspell-resolver@8.19.4':
+    resolution: {integrity: sha512-S8vJMYlsx0S1D60glX8H2Jbj4mD8519VjyY8lu3fnhjxfsl2bDFZvF3ZHKsLEhBE+Wh87uLqJDUJQiYmevHjDg==}
     engines: {node: '>=18'}
 
   '@cspell/cspell-resolver@9.1.3':
     resolution: {integrity: sha512-3h9AkbY+YutBG91fQxeSpfIRT50sfrNQ7IAS0N6fCvJ6z0sXed7UPYwf90NauQp/1lN/bVlHFFAgxDEyG720Yg==}
     engines: {node: '>=20'}
 
-  '@cspell/cspell-service-bus@8.19.3':
-    resolution: {integrity: sha512-K66Vj8O+SWjPUTFq1wfpq5uoDLmZcB7tY3m154WQa94RNpW+/z9kLXVPxW1FctRXfjxfc7bqfLq4LF6Yiu72fg==}
+  '@cspell/cspell-service-bus@8.19.4':
+    resolution: {integrity: sha512-uhY+v8z5JiUogizXW2Ft/gQf3eWrh5P9036jN2Dm0UiwEopG/PLshHcDjRDUiPdlihvA0RovrF0wDh4ptcrjuQ==}
     engines: {node: '>=18'}
 
   '@cspell/cspell-service-bus@9.1.3':
     resolution: {integrity: sha512-Ss4cCnkJI3IHDSOQKxhtAfypvZZDzuJeXbZFVimLvO22/8GdVH+vQxAFm3kBY+ACVUAe13MQIYzZxuFHaM9y8g==}
     engines: {node: '>=20'}
 
-  '@cspell/cspell-types@8.19.3':
-    resolution: {integrity: sha512-q6aUHJSvUe0Bt57djQN7qQ/AVV9O6nVNO7Nj0rZxFsv/73CtUvJseSrpjlZgkHTRCjOL0iRsVG+B8IPaxjczgw==}
+  '@cspell/cspell-types@8.19.4':
+    resolution: {integrity: sha512-ekMWuNlFiVGfsKhfj4nmc8JCA+1ZltwJgxiKgDuwYtR09ie340RfXFF6YRd2VTW5zN7l4F1PfaAaPklVz6utSg==}
     engines: {node: '>=18'}
 
   '@cspell/cspell-types@9.1.3':
@@ -1572,18 +1568,12 @@ packages:
   '@cspell/dict-al@1.1.0':
     resolution: {integrity: sha512-PtNI1KLmYkELYltbzuoztBxfi11jcE9HXBHCpID2lou/J4VMYKJPNqe4ZjVzSI9NYbMnMnyG3gkbhIdx66VSXg==}
 
-  '@cspell/dict-aws@4.0.10':
-    resolution: {integrity: sha512-0qW4sI0GX8haELdhfakQNuw7a2pnWXz3VYQA2MpydH2xT2e6EN9DWFpKAi8DfcChm8MgDAogKkoHtIo075iYng==}
-
   '@cspell/dict-aws@4.0.12':
     resolution: {integrity: sha512-k1F48eYlX+LsCK2QjqpfHBrjNwNwRyut/XsGumyhUXZsm+j9NVuxQaFCjiEwXi81KE0YE3GBVdwSjqhuUOkpnQ==}
 
   '@cspell/dict-bash@4.2.0':
     resolution: {integrity: sha512-HOyOS+4AbCArZHs/wMxX/apRkjxg6NDWdt0jF9i9XkvJQUltMwEhyA2TWYjQ0kssBsnof+9amax2lhiZnh3kCg==}
 
-  '@cspell/dict-companies@3.1.15':
-    resolution: {integrity: sha512-vnGYTJFrqM9HdtgpZFOThFTjlPyJWqPi0eidMKyZxMKTHhP7yg6mD5X9WPEPvfiysmJYMnA6KKYQEBqoKFPU9g==}
-
   '@cspell/dict-companies@3.2.2':
     resolution: {integrity: sha512-iIuEBPfWzSQugIOn+OKOVsdfE9UloON5SKl57TbvC//D5mgIwPAMZGYT69yv20cjc5E6oMu353hCV3WFy9XO9A==}
 
@@ -1611,9 +1601,6 @@ packages:
   '@cspell/dict-django@4.1.4':
     resolution: {integrity: sha512-fX38eUoPvytZ/2GA+g4bbdUtCMGNFSLbdJJPKX2vbewIQGfgSFJKY56vvcHJKAvw7FopjvgyS/98Ta9WN1gckg==}
 
-  '@cspell/dict-docker@1.1.13':
-    resolution: {integrity: sha512-85X+ZC/CPT3ie26DcfeMFkZSNuhS8DlAqPXzAjilHtGE/Nj+QnS3jyBz0spDJOJrjh8wx1+ro2oCK98sbVcztw==}
-
   '@cspell/dict-docker@1.1.15':
     resolution: {integrity: sha512-wYthMAbEbqDBr9P90VC9aT3zjErrJbUtIr91pDmse7Y5WUvQtAwFhiJHgmNrtx2fZ2idII0eYvpMqoEO+FYFxw==}
 
@@ -1623,9 +1610,6 @@ packages:
   '@cspell/dict-elixir@4.0.7':
     resolution: {integrity: sha512-MAUqlMw73mgtSdxvbAvyRlvc3bYnrDqXQrx5K9SwW8F7fRYf9V4vWYFULh+UWwwkqkhX9w03ZqFYRTdkFku6uA==}
 
-  '@cspell/dict-en-common-misspellings@2.0.10':
-    resolution: {integrity: sha512-80mXJLtr0tVEtzowrI7ycVae/ULAYImZUlr0kUTpa8i57AUk7Zy3pYBs44EYIKW7ZC9AHu4Qjjfq4vriAtyTDQ==}
-
   '@cspell/dict-en-common-misspellings@2.1.3':
     resolution: {integrity: sha512-v1I97Hr1OrK+mwHsVzbY4vsPxx6mA5quhxzanF6XuRofz00wH4HPz8Q3llzRHxka5Wl/59gyan04UkUrvP4gdA==}
 
@@ -1638,12 +1622,6 @@ packages:
   '@cspell/dict-en_us@4.4.14':
     resolution: {integrity: sha512-3JYC4XTc1I88ZC1SlZE9MssWljgJ1SmEVSfA8JiQDY5Mv7X9zo7Jvwjjq795oIJTkmdIW9yNX8ikKRt+cV7CIQ==}
 
-  '@cspell/dict-en_us@4.4.3':
-    resolution: {integrity: sha512-KnsS19kL5lYEk2P9xGNwvZF5ZbDYv1Tkv4BKIx4n4jKlgUj9iHv7L0Q+2cCvllKDGjuP715G/3Rg0McKdHR1Xg==}
-
-  '@cspell/dict-filetypes@3.0.11':
-    resolution: {integrity: sha512-bBtCHZLo7MiSRUqx5KEiPdGOmXIlDGY+L7SJEtRWZENpAKE+96rT7hj+TUUYWBbCzheqHr0OXZJFEKDgsG/uZg==}
-
   '@cspell/dict-filetypes@3.0.13':
     resolution: {integrity: sha512-g6rnytIpQlMNKGJT1JKzWkC+b3xCliDKpQ3ANFSq++MnR4GaLiifaC4JkVON11Oh/UTplYOR1nY3BR4X30bswA==}
 
@@ -1662,15 +1640,9 @@ packages:
   '@cspell/dict-gaming-terms@1.1.1':
     resolution: {integrity: sha512-tb8GFxjTLDQstkJcJ90lDqF4rKKlMUKs5/ewePN9P+PYRSehqDpLI5S5meOfPit8LGszeOrjUdBQ4zXo7NpMyQ==}
 
-  '@cspell/dict-git@3.0.4':
-    resolution: {integrity: sha512-C44M+m56rYn6QCsLbiKiedyPTMZxlDdEYAsPwwlL5bhMDDzXZ3Ic8OCQIhMbiunhCOJJT+er4URmOmM+sllnjg==}
-
   '@cspell/dict-git@3.0.7':
     resolution: {integrity: sha512-odOwVKgfxCQfiSb+nblQZc4ErXmnWEnv8XwkaI4sNJ7cNmojnvogYVeMqkXPjvfrgEcizEEA4URRD2Ms5PDk1w==}
 
-  '@cspell/dict-golang@6.0.20':
-    resolution: {integrity: sha512-b7nd9XXs+apMMzNSWorjirQsbmlwcTC0ViQJU8u+XNose3z0y7oNeEpbTPTVoN1+1sO9aOHuFwfwoOMFCDS14Q==}
-
   '@cspell/dict-golang@6.0.23':
     resolution: {integrity: sha512-oXqUh/9dDwcmVlfUF5bn3fYFqbUzC46lXFQmi5emB0vYsyQXdNWsqi6/yH3uE7bdRE21nP7Yo0mR1jjFNyLamg==}
 
@@ -1692,9 +1664,6 @@ packages:
   '@cspell/dict-julia@1.1.0':
     resolution: {integrity: sha512-CPUiesiXwy3HRoBR3joUseTZ9giFPCydSKu2rkh6I2nVjXnl5vFHzOMLXpbF4HQ1tH2CNfnDbUndxD+I+7eL9w==}
 
-  '@cspell/dict-k8s@1.0.10':
-    resolution: {integrity: sha512-313haTrX9prep1yWO7N6Xw4D6tvUJ0Xsx+YhCP+5YrrcIKoEw5Rtlg8R4PPzLqe6zibw6aJ+Eqq+y76Vx5BZkw==}
-
   '@cspell/dict-k8s@1.0.12':
     resolution: {integrity: sha512-2LcllTWgaTfYC7DmkMPOn9GsBWsA4DZdlun4po8s2ysTP7CPEnZc1ZfK6pZ2eI4TsZemlUQQ+NZxMe9/QutQxg==}
 
@@ -1713,14 +1682,6 @@ packages:
   '@cspell/dict-makefile@1.0.4':
     resolution: {integrity: sha512-E4hG/c0ekPqUBvlkrVvzSoAA+SsDA9bLi4xSV3AXHTVru7Y2bVVGMPtpfF+fI3zTkww/jwinprcU1LSohI3ylw==}
 
-  '@cspell/dict-markdown@2.0.10':
-    resolution: {integrity: sha512-vtVa6L/84F9sTjclTYDkWJF/Vx2c5xzxBKkQp+CEFlxOF2SYgm+RSoEvAvg5vj4N5kuqR4350ZlY3zl2eA3MXw==}
-    peerDependencies:
-      '@cspell/dict-css': ^4.0.17
-      '@cspell/dict-html': ^4.0.11
-      '@cspell/dict-html-symbol-entities': ^4.0.3
-      '@cspell/dict-typescript': ^3.2.1
-
   '@cspell/dict-markdown@2.0.12':
     resolution: {integrity: sha512-ufwoliPijAgWkD/ivAMC+A9QD895xKiJRF/fwwknQb7kt7NozTLKFAOBtXGPJAB4UjhGBpYEJVo2elQ0FCAH9A==}
     peerDependencies:
@@ -1735,9 +1696,6 @@ packages:
   '@cspell/dict-node@5.0.7':
     resolution: {integrity: sha512-ZaPpBsHGQCqUyFPKLyCNUH2qzolDRm1/901IO8e7btk7bEDF56DN82VD43gPvD4HWz3yLs/WkcLa01KYAJpnOw==}
 
-  '@cspell/dict-npm@5.2.1':
-    resolution: {integrity: sha512-aqcit8e/Hsnsmd2QoDDAaai+l80bQItwLggmlio/e5NTAfUu7qIVmx+/VFtUlXQH6sMKp+aAvxPC3K8tH86+qg==}
-
   '@cspell/dict-npm@5.2.11':
     resolution: {integrity: sha512-ImgO82P2rQlE7gjOZSmBT/ZHuR1qGklkt7WINwT73qaKepgz14k/xq1qYzQScl15Vuc3cUXi5OZNqYlTiquIHQ==}
 
@@ -1750,9 +1708,6 @@ packages:
   '@cspell/dict-public-licenses@2.0.13':
     resolution: {integrity: sha512-1Wdp/XH1ieim7CadXYE7YLnUlW0pULEjVl9WEeziZw3EKCAw8ZI8Ih44m4bEa5VNBLnuP5TfqC4iDautAleQzQ==}
 
-  '@cspell/dict-python@4.2.17':
-    resolution: {integrity: sha512-xqMKfVc8d7yDaOChFdL2uWAN3Mw9qObB/Zr6t5w1OHbi23gWs7V1lI9d0mXAoqSK6N3mosbum4OIq/FleQDnlw==}
-
   '@cspell/dict-python@4.2.19':
     resolution: {integrity: sha512-9S2gTlgILp1eb6OJcVZeC8/Od83N8EqBSg5WHVpx97eMMJhifOzePkE0kDYjyHMtAFznCQTUu0iQEJohNQ5B0A==}
 
@@ -1771,9 +1726,6 @@ packages:
   '@cspell/dict-shell@1.1.0':
     resolution: {integrity: sha512-D/xHXX7T37BJxNRf5JJHsvziFDvh23IF/KvkZXNSh8VqcRdod3BAz9VGHZf6VDqcZXr1VRqIYR3mQ8DSvs3AVQ==}
 
-  '@cspell/dict-software-terms@5.0.5':
-    resolution: {integrity: sha512-ZjAOa8FI8/JrxaRqKT3eS7AQXFjU174xxQoKYMkmdwSyNIj7WUCAg10UeLqeMjFVv36zIO0Hm0dD2+Bvn18SLA==}
-
   '@cspell/dict-software-terms@5.1.4':
     resolution: {integrity: sha512-zeinnVFfha+Snh8hMk4hRJTYWNLcRNaHRSvMMVe1DU8oljb1agfq6ouBt/uypIzwgGgAopPz9ArGyc/gVn9y8w==}
 
@@ -1786,53 +1738,47 @@ packages:
   '@cspell/dict-swift@2.0.5':
     resolution: {integrity: sha512-3lGzDCwUmnrfckv3Q4eVSW3sK3cHqqHlPprFJZD4nAqt23ot7fic5ALR7J4joHpvDz36nHX34TgcbZNNZOC/JA==}
 
-  '@cspell/dict-terraform@1.1.1':
-    resolution: {integrity: sha512-07KFDwCU7EnKl4hOZLsLKlj6Zceq/IsQ3LRWUyIjvGFfZHdoGtFdCp3ZPVgnFaAcd/DKv+WVkrOzUBSYqHopQQ==}
-
   '@cspell/dict-terraform@1.1.3':
     resolution: {integrity: sha512-gr6wxCydwSFyyBKhBA2xkENXtVFToheqYYGFvlMZXWjviynXmh+NK/JTvTCk/VHk3+lzbO9EEQKee6VjrAUSbA==}
 
-  '@cspell/dict-typescript@3.2.1':
-    resolution: {integrity: sha512-jdnKg4rBl75GUBTsUD6nTJl7FGvaIt5wWcWP7TZSC3rV1LfkwvbUiY3PiGpfJlAIdnLYSeFWIpYU9gyVgz206w==}
-
   '@cspell/dict-typescript@3.2.3':
     resolution: {integrity: sha512-zXh1wYsNljQZfWWdSPYwQhpwiuW0KPW1dSd8idjMRvSD0aSvWWHoWlrMsmZeRl4qM4QCEAjua8+cjflm41cQBg==}
 
   '@cspell/dict-vue@3.0.4':
     resolution: {integrity: sha512-0dPtI0lwHcAgSiQFx8CzvqjdoXROcH+1LyqgROCpBgppommWpVhbQ0eubnKotFEXgpUCONVkeZJ6Ql8NbTEu+w==}
 
-  '@cspell/dynamic-import@8.19.3':
-    resolution: {integrity: sha512-haAl+/HOLAPc6Cs7YkbpyIK1Htomp3/D42scl2FCe4PU860uFyjyOWeq99u2wetDI/SQn1Ry3sSOKRCjIGlHWA==}
+  '@cspell/dynamic-import@8.19.4':
+    resolution: {integrity: sha512-0LLghC64+SiwQS20Sa0VfFUBPVia1rNyo0bYeIDoB34AA3qwguDBVJJkthkpmaP1R2JeR/VmxmJowuARc4ZUxA==}
     engines: {node: '>=18.0'}
 
   '@cspell/dynamic-import@9.1.3':
     resolution: {integrity: sha512-+8PxTslsh+oTxmhYdnfQZ/brYGFAnfqLR9xotWE4Ks3HoaLOhZsp6FF9kvlEp/gNOjpyhHn1UhT/Gr5fT4+QhQ==}
     engines: {node: '>=20'}
 
-  '@cspell/eslint-plugin@8.19.3':
-    resolution: {integrity: sha512-5eZQYF5rG2WRgEpZM80XsYr0/LWx/VNRrVRIGHphd0geWLK8z/THyRCN8MV9EWn6txXIDZW2mEU2VWvv5rOAUg==}
+  '@cspell/eslint-plugin@8.19.4':
+    resolution: {integrity: sha512-ICXH38a0HeOcglkVUL4uE3y8jkQ1L14+tdMK+AcE1Hq/LvsA1iEXFRoEw0IGhO/yP98K8Nvj5CuN+7RNDbLYMA==}
     engines: {node: '>=18'}
     peerDependencies:
       eslint: ^7 || ^8 || ^9
 
-  '@cspell/filetypes@8.19.3':
-    resolution: {integrity: sha512-j6WEjuvh3t2zsBUvZm6leGhcpQtuCMroSjyGLSE7xNM5SRYOdd+KkO81erwyA/yAweTGlI6wYyXofUd+mRVFMw==}
+  '@cspell/filetypes@8.19.4':
+    resolution: {integrity: sha512-D9hOCMyfKtKjjqQJB8F80PWsjCZhVGCGUMiDoQpcta0e+Zl8vHgzwaC0Ai4QUGBhwYEawHGiWUd7Y05u/WXiNQ==}
     engines: {node: '>=18'}
 
   '@cspell/filetypes@9.1.3':
     resolution: {integrity: sha512-HRJEggDo6OJJmCc/gq7oriMqkqVDema+oLpGBh1a/M7ulw+CzoHkOa//1ohpAJh5KsWj9Tej9Va4BUZ/SaCwUA==}
     engines: {node: '>=20'}
 
-  '@cspell/strong-weak-map@8.19.3':
-    resolution: {integrity: sha512-IKzzbVDEjAprH0vH16heKbqCMqNtdU4tZXbp7mjJ3P3Xodl4csERrFRNqSwlyQMqfpjVU5n+wO7BSq/2S/uzRg==}
+  '@cspell/strong-weak-map@8.19.4':
+    resolution: {integrity: sha512-MUfFaYD8YqVe32SQaYLI24/bNzaoyhdBIFY5pVrvMo1ZCvMl8AlfI2OcBXvcGb5aS5z7sCNCJm11UuoYbLI1zw==}
     engines: {node: '>=18'}
 
   '@cspell/strong-weak-map@9.1.3':
     resolution: {integrity: sha512-+96SI9R6TOY+xGBOK5LiOgX/W/9gAKus1Cvngh2LdtDVZwgVqpqvm5LoXxLhUT+Vs5UsndRBzblSdNpziSwZtA==}
     engines: {node: '>=20'}
 
-  '@cspell/url@8.19.3':
-    resolution: {integrity: sha512-EATITl9WlmOuhdlUluHlYXCV7LFPuSw9CZ4gejPpjyDwQJUQg4ktHVNfy3hJ5I3h4SEiW0GWd68Gd61McmTO2A==}
+  '@cspell/url@8.19.4':
+    resolution: {integrity: sha512-Pa474iBxS+lxsAL4XkETPGIq3EgMLCEb9agj3hAd2VGMTCApaiUvamR4b+uGXIPybN70piFxvzrfoxsG2uIP6A==}
     engines: {node: '>=18.0'}
 
   '@cspell/url@9.1.3':
@@ -1931,9 +1877,9 @@ packages:
   '@emnapi/wasi-threads@1.0.3':
     resolution: {integrity: sha512-8K5IFFsQqF9wQNJptGbS6FNKgUTsSRYnTqNCG1vPP8jFdjSv18n2mQfJpkt2Oibo9iBEzcDnDxNwKTzC7svlJw==}
 
-  '@es-joy/jsdoccomment@0.49.0':
-    resolution: {integrity: sha512-xjZTSFgECpb9Ohuk5yMX5RhUEbfeQcuOp8IF60e+wyzWEF0M5xeSgqsfLtvPEX8BIyOX9saZqzuGPmZ8oWc+5Q==}
-    engines: {node: '>=16'}
+  '@es-joy/jsdoccomment@0.50.2':
+    resolution: {integrity: sha512-YAdE/IJSpwbOTiaURNCKECdAwqrJuFiZhylmesBcIRawtYKnBR2wxPhoIewMg+Yu+QuYvHfJNReWpoxGBKOChA==}
+    engines: {node: '>=18'}
 
   '@esbuild/aix-ppc64@0.21.5':
     resolution: {integrity: sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==}
@@ -2774,10 +2720,6 @@ packages:
     resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==}
     engines: {node: '>=14'}
 
-  '@pkgr/core@0.1.1':
-    resolution: {integrity: sha512-cq8o4cWH0ibXh9VGi5P20Tu9XF/0fFXl9EUinr9QfTM7a7p0oTA4iJRCQWppXR1Pg8dSM0UCItCkPwsk9qWWYA==}
-    engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0}
-
   '@pkgr/core@0.2.4':
     resolution: {integrity: sha512-ROFF39F6ZrnzSUEmQQZUar0Jt4xVoP9WnDRdWwF4NNcXs3xBTLgBUDoOwW141y1jP+S8nahIbdxbFC7IShw9Iw==}
     engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0}
@@ -3469,31 +3411,43 @@ packages:
   '@types/yauzl@2.10.3':
     resolution: {integrity: sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q==}
 
-  '@typescript-eslint/eslint-plugin@8.32.0':
-    resolution: {integrity: sha512-/jU9ettcntkBFmWUzzGgsClEi2ZFiikMX5eEQsmxIAWMOn4H3D4rvHssstmAHGVvrYnaMqdWWWg0b5M6IN/MTQ==}
+  '@typescript-eslint/eslint-plugin@8.38.0':
+    resolution: {integrity: sha512-CPoznzpuAnIOl4nhj4tRr4gIPj5AfKgkiJmGQDaq+fQnRJTYlcBjbX3wbciGmpoPf8DREufuPRe1tNMZnGdanA==}
     engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
     peerDependencies:
-      '@typescript-eslint/parser': ^8.0.0 || ^8.0.0-alpha.0
+      '@typescript-eslint/parser': ^8.38.0
       eslint: ^8.57.0 || ^9.0.0
       typescript: '>=4.8.4 <5.9.0'
 
-  '@typescript-eslint/parser@8.32.0':
-    resolution: {integrity: sha512-B2MdzyWxCE2+SqiZHAjPphft+/2x2FlO9YBx7eKE1BCb+rqBlQdhtAEhzIEdozHd55DXPmxBdpMygFJjfjjA9A==}
+  '@typescript-eslint/parser@8.38.0':
+    resolution: {integrity: sha512-Zhy8HCvBUEfBECzIl1PKqF4p11+d0aUJS1GeUiuqK9WmOug8YCmC4h4bjyBvMyAMI9sbRczmrYL5lKg/YMbrcQ==}
     engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
     peerDependencies:
       eslint: ^8.57.0 || ^9.0.0
       typescript: '>=4.8.4 <5.9.0'
 
-  '@typescript-eslint/scope-manager@8.24.1':
-    resolution: {integrity: sha512-OdQr6BNBzwRjNEXMQyaGyZzgg7wzjYKfX2ZBV3E04hUCBDv3GQCHiz9RpqdUIiVrMgJGkXm3tcEh4vFSHreS2Q==}
+  '@typescript-eslint/project-service@8.38.0':
+    resolution: {integrity: sha512-dbK7Jvqcb8c9QfH01YB6pORpqX1mn5gDZc9n63Ak/+jD67oWXn3Gs0M6vddAN+eDXBCS5EmNWzbSxsn9SzFWWg==}
     engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+    peerDependencies:
+      typescript: '>=4.8.4 <5.9.0'
 
   '@typescript-eslint/scope-manager@8.32.0':
     resolution: {integrity: sha512-jc/4IxGNedXkmG4mx4nJTILb6TMjL66D41vyeaPWvDUmeYQzF3lKtN15WsAeTr65ce4mPxwopPSo1yUUAWw0hQ==}
     engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
 
-  '@typescript-eslint/type-utils@8.32.0':
-    resolution: {integrity: sha512-t2vouuYQKEKSLtJaa5bB4jHeha2HJczQ6E5IXPDPgIty9EqcJxpr1QHQ86YyIPwDwxvUmLfP2YADQ5ZY4qddZg==}
+  '@typescript-eslint/scope-manager@8.38.0':
+    resolution: {integrity: sha512-WJw3AVlFFcdT9Ri1xs/lg8LwDqgekWXWhH3iAF+1ZM+QPd7oxQ6jvtW/JPwzAScxitILUIFs0/AnQ/UWHzbATQ==}
+    engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+
+  '@typescript-eslint/tsconfig-utils@8.38.0':
+    resolution: {integrity: sha512-Lum9RtSE3EroKk/bYns+sPOodqb2Fv50XOl/gMviMKNvanETUuUcC9ObRbzrJ4VSd2JalPqgSAavwrPiPvnAiQ==}
+    engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+    peerDependencies:
+      typescript: '>=4.8.4 <5.9.0'
+
+  '@typescript-eslint/type-utils@8.38.0':
+    resolution: {integrity: sha512-c7jAvGEZVf0ao2z+nnz8BUaHZD09Agbh+DY7qvBQqLiz8uJzRgVPj5YvOh8I8uEiH8oIUGIfHzMwUcGVco/SJg==}
     engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
     peerDependencies:
       eslint: ^8.57.0 || ^9.0.0
@@ -3503,14 +3457,14 @@ packages:
     resolution: {integrity: sha512-iZqi+Ds1y4EDYUtlOOC+aUmxnE9xS/yCigkjA7XpTKV6nCBd3Hp/PRGGmdwnfkV2ThMyYldP1wRpm/id99spTQ==}
     engines: {node: ^18.18.0 || >=20.0.0}
 
-  '@typescript-eslint/types@8.24.1':
-    resolution: {integrity: sha512-9kqJ+2DkUXiuhoiYIUvIYjGcwle8pcPpdlfkemGvTObzgmYfJ5d0Qm6jwb4NBXP9W1I5tss0VIAnWFumz3mC5A==}
-    engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
-
   '@typescript-eslint/types@8.32.0':
     resolution: {integrity: sha512-O5Id6tGadAZEMThM6L9HmVf5hQUXNSxLVKeGJYWNhhVseps/0LddMkp7//VDkzwJ69lPL0UmZdcZwggj9akJaA==}
     engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
 
+  '@typescript-eslint/types@8.38.0':
+    resolution: {integrity: sha512-wzkUfX3plUqij4YwWaJyqhiPE5UCRVlFpKn1oCRn2O1bJ592XxWJj8ROQ3JD5MYXLORW84063z3tZTb/cs4Tyw==}
+    engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+
   '@typescript-eslint/typescript-estree@7.18.0':
     resolution: {integrity: sha512-aP1v/BSPnnyhMHts8cf1qQ6Q1IFwwRvAQGRvBFkWlo3/lH29OXA3Pts+c10nxRxIBrDnoMqzhgdwVe5f2D6OzA==}
     engines: {node: ^18.18.0 || >=20.0.0}
@@ -3520,24 +3474,17 @@ packages:
       typescript:
         optional: true
 
-  '@typescript-eslint/typescript-estree@8.24.1':
-    resolution: {integrity: sha512-UPyy4MJ/0RE648DSKQe9g0VDSehPINiejjA6ElqnFaFIhI6ZEiZAkUI0D5MCk0bQcTf/LVqZStvQ6K4lPn/BRg==}
-    engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
-    peerDependencies:
-      typescript: '>=4.8.4 <5.8.0'
-
   '@typescript-eslint/typescript-estree@8.32.0':
     resolution: {integrity: sha512-pU9VD7anSCOIoBFnhTGfOzlVFQIA1XXiQpH/CezqOBaDppRwTglJzCC6fUQGpfwey4T183NKhF1/mfatYmjRqQ==}
     engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
     peerDependencies:
       typescript: '>=4.8.4 <5.9.0'
 
-  '@typescript-eslint/utils@8.24.1':
-    resolution: {integrity: sha512-OOcg3PMMQx9EXspId5iktsI3eMaXVwlhC8BvNnX6B5w9a4dVgpkQZuU8Hy67TolKcl+iFWq0XX+jbDGN4xWxjQ==}
+  '@typescript-eslint/typescript-estree@8.38.0':
+    resolution: {integrity: sha512-fooELKcAKzxux6fA6pxOflpNS0jc+nOQEEOipXFNjSlBS6fqrJOVY/whSn70SScHrcJ2LDsxWrneFoWYSVfqhQ==}
     engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
     peerDependencies:
-      eslint: ^8.57.0 || ^9.0.0
-      typescript: '>=4.8.4 <5.8.0'
+      typescript: '>=4.8.4 <5.9.0'
 
   '@typescript-eslint/utils@8.32.0':
     resolution: {integrity: sha512-8S9hXau6nQ/sYVtC3D6ISIDoJzS1NsCK+gluVhLN2YkBPX+/1wkwyUiDKnxRh15579WoOIyVWnoyIf3yGI9REw==}
@@ -3546,18 +3493,25 @@ packages:
       eslint: ^8.57.0 || ^9.0.0
       typescript: '>=4.8.4 <5.9.0'
 
+  '@typescript-eslint/utils@8.38.0':
+    resolution: {integrity: sha512-hHcMA86Hgt+ijJlrD8fX0j1j8w4C92zue/8LOPAFioIno+W0+L7KqE8QZKCcPGc/92Vs9x36w/4MPTJhqXdyvg==}
+    engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+    peerDependencies:
+      eslint: ^8.57.0 || ^9.0.0
+      typescript: '>=4.8.4 <5.9.0'
+
   '@typescript-eslint/visitor-keys@7.18.0':
     resolution: {integrity: sha512-cDF0/Gf81QpY3xYyJKDV14Zwdmid5+uuENhjH2EqFaF0ni+yAyq/LzMaIJdhNJXZI7uLzwIlA+V7oWoyn6Curg==}
     engines: {node: ^18.18.0 || >=20.0.0}
 
-  '@typescript-eslint/visitor-keys@8.24.1':
-    resolution: {integrity: sha512-EwVHlp5l+2vp8CoqJm9KikPZgi3gbdZAtabKT9KPShGeOcJhsv4Zdo3oc8T8I0uKEmYoU4ItyxbptjF08enaxg==}
-    engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
-
   '@typescript-eslint/visitor-keys@8.32.0':
     resolution: {integrity: sha512-1rYQTCLFFzOI5Nl0c8LUpJT8HxpwVRn9E4CkMsYfuN6ctmQqExjSTzzSk0Tz2apmXy7WU6/6fyaZVVA/thPN+w==}
     engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
 
+  '@typescript-eslint/visitor-keys@8.38.0':
+    resolution: {integrity: sha512-pWrTcoFNWuwHlA9CvlfSsGWs14JxfN1TH25zM5L7o0pRLhsoZkDnTsXfQRJBEWJoV5DL0jf+Z+sxiud+K0mq1g==}
+    engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+
   '@ungap/structured-clone@1.3.0':
     resolution: {integrity: sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==}
 
@@ -4848,9 +4802,6 @@ packages:
     resolution: {integrity: sha512-yCEafptTtb4bk7GLEQoM8KVJpxAfdBJYaXyzQEgQQQgYrZiDp8SJmGKlYza6CYjEDNstAdNdKA3UuoULlEbS6w==}
     engines: {node: '>=12.13'}
 
-  core-js-compat@3.41.0:
-    resolution: {integrity: sha512-RFsU9LySVue9RTwdDVX/T0e2Y6jRYWXERKElIjpuEOEnxaXffI0X7RUwVzfYLfzuLXSNJDYoRYUAmRUcyln20A==}
-
   core-js-compat@3.42.0:
     resolution: {integrity: sha512-bQasjMfyDGyaeWKBIu33lHh9qlSR0MFE/Nmc6nMjf/iU9b3rSMdAYz1Baxrv4lPdGUsTqZudHA4jIGSJy0SWZQ==}
 
@@ -4904,16 +4855,16 @@ packages:
     resolution: {integrity: sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==}
     engines: {node: '>=8'}
 
-  cspell-config-lib@8.19.3:
-    resolution: {integrity: sha512-GjSrLU1KFLVzFa5qQA8DMF04BXW6r3xnfhwHFqU/8tEqtQXxKemGWnc9mt42Ey5hoe366lvhbIoh+vUhGf/IKA==}
+  cspell-config-lib@8.19.4:
+    resolution: {integrity: sha512-LtFNZEWVrnpjiTNgEDsVN05UqhhJ1iA0HnTv4jsascPehlaUYVoyucgNbFeRs6UMaClJnqR0qT9lnPX+KO1OLg==}
     engines: {node: '>=18'}
 
   cspell-config-lib@9.1.3:
     resolution: {integrity: sha512-B3DdOTZNIOQahSkOYqaq2fOc8fq/jFkrOFd36kge/GAyEpY2Um/Kp/GQ6caOcev+ju0h3iGaO24OLCx6QJ3YoQ==}
     engines: {node: '>=20'}
 
-  cspell-dictionary@8.19.3:
-    resolution: {integrity: sha512-tycnHhLHvqKl4a2hVg/tIIai0wmcHHSAlgBAXAnSl+0g2DRrQ5GDT+9tHJ8B373o62jD8f5jHwbfJrLgHiNXWg==}
+  cspell-dictionary@8.19.4:
+    resolution: {integrity: sha512-lr8uIm7Wub8ToRXO9f6f7in429P1Egm3I+Ps3ZGfWpwLTCUBnHvJdNF/kQqF7PL0Lw6acXcjVWFYT7l2Wdst2g==}
     engines: {node: '>=18'}
 
   cspell-dictionary@9.1.3:
@@ -4925,16 +4876,16 @@ packages:
     engines: {node: '>=20'}
     hasBin: true
 
-  cspell-glob@8.19.3:
-    resolution: {integrity: sha512-Fv4coZmCmqaNq2UfXhVqQbHschhAcm3rwoxPyBqQcDYpvCQ4Q2+qnHQkK1nAxmDjus4KFM/QKrBoxSlD90bD9g==}
+  cspell-glob@8.19.4:
+    resolution: {integrity: sha512-042uDU+RjAz882w+DXKuYxI2rrgVPfRQDYvIQvUrY1hexH4sHbne78+OMlFjjzOCEAgyjnm1ktWUCCmh08pQUw==}
     engines: {node: '>=18'}
 
   cspell-glob@9.1.3:
     resolution: {integrity: sha512-If7gSgbWlUhLcmNA9zPflWzdUZs4wyRKB/Ze584wrht7zJR4yJm2Rptk2+M8kXEhx3zYS6UGhSL0alPbVAbjgQ==}
     engines: {node: '>=20'}
 
-  cspell-grammar@8.19.3:
-    resolution: {integrity: sha512-5VJjqTPRpJZpQvoGj0W88yo0orY/YVuG5P8NVIwnfMAMRAnw2PAb7fsDydO9bPdFKdGPQ4CWoO++ed0g/Ra6jQ==}
+  cspell-grammar@8.19.4:
+    resolution: {integrity: sha512-lzWgZYTu/L7DNOHjxuKf8H7DCXvraHMKxtFObf8bAzgT+aBmey5fW2LviXUkZ2Lb2R0qQY+TJ5VIGoEjNf55ow==}
     engines: {node: '>=18'}
     hasBin: true
 
@@ -4943,24 +4894,24 @@ packages:
     engines: {node: '>=20'}
     hasBin: true
 
-  cspell-io@8.19.3:
-    resolution: {integrity: sha512-kJa4ZQdr6QwFEo3TxcyXBLAs2DiogrdtYa4tK87Wzyg3+Am1l7Z9AN8gZWQ+tZIi3BC0FYj4PsBdZ4qdmcY98g==}
+  cspell-io@8.19.4:
+    resolution: {integrity: sha512-W48egJqZ2saEhPWf5ftyighvm4mztxEOi45ILsKgFikXcWFs0H0/hLwqVFeDurgELSzprr12b6dXsr67dV8amg==}
     engines: {node: '>=18'}
 
   cspell-io@9.1.3:
     resolution: {integrity: sha512-fdgAVrthOY1pPsBZHWVjEVn6uHMAshj2n75eu2rvUd6EcmMuLR13EcIXHoMcQo/1Az05x2UgG7HuK+0MuRcikQ==}
     engines: {node: '>=20'}
 
-  cspell-lib@8.19.3:
-    resolution: {integrity: sha512-tVxrZYG7VCjjzARoTBQ7F/3FCjIGbzN0YbFcB3g4KLvbEuH83uLXm2MNdN9yDMaiD1XZ0CzP14eKiwpSMT7tjQ==}
+  cspell-lib@8.19.4:
+    resolution: {integrity: sha512-NwfdCCYtIBNQuZcoMlMmL3HSv2olXNErMi/aOTI9BBAjvCHjhgX5hbHySMZ0NFNynnN+Mlbu5kooJ5asZeB3KA==}
     engines: {node: '>=18'}
 
   cspell-lib@9.1.3:
     resolution: {integrity: sha512-egESsnErAPtC/wuqbHWW28eRKChkg5h+vFQQuZ0iThuOSZ65jeSM0ESOt8W3TH2JD7EGo2pvPED/7rZjjnMIcQ==}
     engines: {node: '>=20'}
 
-  cspell-trie-lib@8.19.3:
-    resolution: {integrity: sha512-Z33vT0M/Vi10L9XaxKPTQu0AA0nmq91QWY5CzBymZY7LhOf6yGYcCgoTHluQms8YLCWaiX9pgTOF2/W1wlNiVg==}
+  cspell-trie-lib@8.19.4:
+    resolution: {integrity: sha512-yIPlmGSP3tT3j8Nmu+7CNpkPh/gBO2ovdnqNmZV+LNtQmVxqFd2fH7XvR1TKjQyctSH1ip0P5uIdJmzY1uhaYg==}
     engines: {node: '>=18'}
 
   cspell-trie-lib@9.1.3:
@@ -5454,8 +5405,8 @@ packages:
   dompurify@3.2.5:
     resolution: {integrity: sha512-mLPd29uoRe9HpvwP2TxClGQBzGXeEC/we/q+bFlmPPmj2p2Ugl3r6ATu/UU1v77DXNcehiBg9zsr1dREyA/dJQ==}
 
-  domutils@3.1.0:
-    resolution: {integrity: sha512-H78uMmQtI2AhgDJjWeQmHwJJ2bLPD3GMmO7Zja/ZZh84wkm+4ut+IUnUdRa8uCGX88DiVx1j6FRe1XfxEgjEZA==}
+  domutils@3.2.2:
+    resolution: {integrity: sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw==}
 
   dotenv@16.4.7:
     resolution: {integrity: sha512-47qPchRCykZC03FhkYAhrvwU4xDBFIj1QPqaarj6mdM/hgUzfPHcpkHJOn3mJAufFeeAxAzeGsr5X0M4k6fLZQ==}
@@ -5544,6 +5495,10 @@ packages:
     resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==}
     engines: {node: '>=0.12'}
 
+  entities@6.0.1:
+    resolution: {integrity: sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==}
+    engines: {node: '>=0.12'}
+
   env-paths@3.0.0:
     resolution: {integrity: sha512-dtJUTepzMW3Lm/NPxRf3wP4642UWhjL2sQxc+ym2YMj1m/H2zDNQOlezafzkHwn6sMstjHTwG6iQQsctDW/b1A==}
     engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
@@ -5648,8 +5603,8 @@ packages:
     engines: {node: '>=6.0'}
     hasBin: true
 
-  eslint-config-prettier@10.1.1:
-    resolution: {integrity: sha512-4EQQr6wXwS+ZJSzaR5ZCrYgLxqvUjdXctaEtBqHcbkW944B1NQyO4qpdHQbXBONfwxXdkAY81HH4+LUfrg+zPw==}
+  eslint-config-prettier@10.1.8:
+    resolution: {integrity: sha512-82GZUjRS0p/jganf6q1rEO25VSoHH0hKPCTrgillPjdI/3bgBhAE1QzHrHTizjpRvy6pGAvKjDJtk2pF9NDq8w==}
     hasBin: true
     peerDependencies:
       eslint: '>=7.0.0'
@@ -5659,12 +5614,12 @@ packages:
     peerDependencies:
       eslint: '>=9'
 
-  eslint-plugin-html@8.1.2:
-    resolution: {integrity: sha512-pbRchDV2SmqbCi/Ev/q3aAikzG9BcFe0IjjqjtMn8eTLq71ZUggyJB6CDmuwGAXmYZHrXI12XTfCqvgcnPRqGw==}
+  eslint-plugin-html@8.1.3:
+    resolution: {integrity: sha512-cnCdO7yb/jrvgSJJAfRkGDOwLu1AOvNdw8WCD6nh/2C4RnxuI4tz6QjMEAmmSiHSeugq/fXcIO8yBpIBQrMZCg==}
     engines: {node: '>=16.0.0'}
 
-  eslint-plugin-jest@28.11.0:
-    resolution: {integrity: sha512-QAfipLcNCWLVocVbZW8GimKn5p5iiMcgGbRzz8z/P5q7xw+cNEpYqyzFMtIF/ZgF2HLOyy+dYBut+DoYolvqig==}
+  eslint-plugin-jest@28.14.0:
+    resolution: {integrity: sha512-P9s/qXSMTpRTerE2FQ0qJet2gKbcGyFTPAJipoKxmWqR6uuFqIqk8FuEfg5yBieOezVrEfAMZrEwJ6yEp+1MFQ==}
     engines: {node: ^16.10.0 || ^18.12.0 || >=20.0.0}
     peerDependencies:
       '@typescript-eslint/eslint-plugin': ^6.0.0 || ^7.0.0 || ^8.0.0
@@ -5676,8 +5631,8 @@ packages:
       jest:
         optional: true
 
-  eslint-plugin-jsdoc@50.6.9:
-    resolution: {integrity: sha512-7/nHu3FWD4QRG8tCVqcv+BfFtctUtEDWc29oeDXB4bwmDM2/r1ndl14AG/2DUntdqH7qmpvdemJKwb3R97/QEw==}
+  eslint-plugin-jsdoc@50.8.0:
+    resolution: {integrity: sha512-UyGb5755LMFWPrZTEqqvTJ3urLz1iqj+bYOHFNag+sw3NvaMWP9K2z+uIn37XfNALmQLQyrBlJ5mkiVPL7ADEg==}
     engines: {node: '>=18'}
     peerDependencies:
       eslint: ^7.0.0 || ^8.0.0 || ^9.0.0
@@ -5705,8 +5660,8 @@ packages:
   eslint-plugin-tsdoc@0.4.0:
     resolution: {integrity: sha512-MT/8b4aKLdDClnS8mP3R/JNjg29i0Oyqd/0ym6NnQf+gfKbJJ4ZcSh2Bs1H0YiUMTBwww5JwXGTWot/RwyJ7aQ==}
 
-  eslint-plugin-unicorn@59.0.0:
-    resolution: {integrity: sha512-7IEeqkymGa7tr6wTWS4DolfXnfcE3QjcD0g7I+qCfV5GPMvVsFsLT7zTIYvnudqwAm5nWekdGIOTTXA93Sz9Ow==}
+  eslint-plugin-unicorn@59.0.1:
+    resolution: {integrity: sha512-EtNXYuWPUmkgSU2E7Ttn57LbRREQesIP1BiLn7OZLKodopKfDXfBUkC/0j6mpw2JExwf43Uf3qLSvrSvppgy8Q==}
     engines: {node: ^18.20.0 || ^20.10.0 || >=21.0.0}
     peerDependencies:
       eslint: '>=9.22.0'
@@ -5727,6 +5682,10 @@ packages:
     resolution: {integrity: sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==}
     engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
 
+  eslint-visitor-keys@4.2.1:
+    resolution: {integrity: sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==}
+    engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+
   eslint@9.26.0:
     resolution: {integrity: sha512-Hx0MOjPh6uK9oq9nVsATZKE/Wlbai7KFjfCuw9UHaguDW3x+HF0O5nIi3ud39TWgrTjTO5nHxmL3R1eANinWHQ==}
     engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
@@ -6434,8 +6393,8 @@ packages:
   html-void-elements@3.0.0:
     resolution: {integrity: sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg==}
 
-  htmlparser2@9.1.0:
-    resolution: {integrity: sha512-5zfg6mHUoaer/97TxnGpxmbR7zJtPwIYFMZ/H5ucTlPZhKvtum05yiPK3Mgai3a0DyVxv7qYqoweaEd2nrYQzQ==}
+  htmlparser2@10.0.0:
+    resolution: {integrity: sha512-TwAZM+zE5Tq3lrEHvOlvwgj1XLWQCtaaibSN11Q+gGBAS7Y1uZSWwXXRe4iF6OXnaq1riyQAPFOBtYc77Mxq0g==}
 
   http-cache-semantics@4.1.1:
     resolution: {integrity: sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==}
@@ -8056,14 +8015,16 @@ packages:
   parse-entities@2.0.0:
     resolution: {integrity: sha512-kkywGpCcRYhqQIchaWqZ875wzpS/bMKhz5HnN3p7wveJTkTtyAB/AlnS0f8DFSqYW1T82t6yEAkEcB+A1I3MbQ==}
 
-  parse-imports@2.2.1:
-    resolution: {integrity: sha512-OL/zLggRp8mFhKL0rNORUTR4yBYujK/uU+xZL+/0Rgm2QE4nLO9v8PzEweSJEbMGKmDRjJE4R3IMJlL2di4JeQ==}
-    engines: {node: '>= 18'}
+  parse-imports-exports@0.2.4:
+    resolution: {integrity: sha512-4s6vd6dx1AotCx/RCI2m7t7GCh5bDRUtGNvRfHSP2wbBQdMi67pPe7mtzmgwcaQ8VKK/6IB7Glfyu3qdZJPybQ==}
 
   parse-json@5.2.0:
     resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==}
     engines: {node: '>=8'}
 
+  parse-statements@1.0.11:
+    resolution: {integrity: sha512-HlsyYdMBnbPQ9Jr/VgJ1YF4scnldvJpJxCVx6KgqPL4dxppsWrJHCIIxQXMJrqGnsRkNPATbeMJ8Yxu7JMsYcA==}
+
   parse5@7.2.1:
     resolution: {integrity: sha512-BuBYQYlv1ckiPdQi/ohiivi9Sagc9JG+Ozs0r7b/0iK3sKmrb0b9FdWdBbOdx6hBCM/F9Ir82ofnBhtZOjCRPQ==}
 
@@ -8920,9 +8881,6 @@ packages:
     resolution: {integrity: sha512-ZA6oR3T/pEyuqwMgAKT0/hAv8oAXckzbkmR0UkUosQ+Mc4RxGoJkRmwHgHufaenlyAgE1Mxgpdcrf75y6XcnDg==}
     engines: {node: '>=14.16'}
 
-  slashes@3.0.12:
-    resolution: {integrity: sha512-Q9VME8WyGkc7pJf6QEkj3wE+2CnvZMI+XJhwdTPR8Z/kWQRXi7boAWLDibRPyHRTUTPx5FaU7MsyrjI3yLB4HA==}
-
   slice-ansi@3.0.0:
     resolution: {integrity: sha512-pSyv7bSTC7ig9Dcgbw9AuRNUb5k5V6oDudjZoMBSr13qpLBG7tB+zgCkARjq7xIUgdz5P1Qe8u+rSGdouOOIyQ==}
     engines: {node: '>=8'}
@@ -9204,18 +9162,10 @@ packages:
   symbol-tree@3.2.4:
     resolution: {integrity: sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==}
 
-  synckit@0.11.4:
-    resolution: {integrity: sha512-Q/XQKRaJiLiFIBNN+mndW7S/RHxvwzuZS6ZwmRzUBqJBv/5QIKCEwkBC8GBf8EQJKYnaFs0wOZbKTXBPj8L9oQ==}
-    engines: {node: ^14.18.0 || >=16.0.0}
-
   synckit@0.11.8:
     resolution: {integrity: sha512-+XZ+r1XGIJGeQk3VvXhT6xx/VpbHsRzsTkGgF6E5RX9TTXD0118l87puaEBZ566FhqblC6U0d4XnubznJDm30A==}
     engines: {node: ^14.18.0 || >=16.0.0}
 
-  synckit@0.9.2:
-    resolution: {integrity: sha512-vrozgXDQwYO72vHjUb/HnFbQx1exDjoKzqx23aXEg2a9VIg2TSFZ8FmeZpTjUCFMYw7mpX4BE2SFu8wI7asYsw==}
-    engines: {node: ^14.18.0 || >=16.0.0}
-
   tabbable@6.2.0:
     resolution: {integrity: sha512-Cat63mxsVJlzYvN51JmVXIgNoUokrIaT2zLclCXjRd8boZ0004U4KCs/sToJ75C6sdlByWxpYnb5Boif1VSFew==}
 
@@ -9407,12 +9357,6 @@ packages:
     peerDependencies:
       typescript: '>=4.2.0'
 
-  ts-api-utils@2.0.1:
-    resolution: {integrity: sha512-dnlgjFSVetynI8nzgJ+qF62efpglpWRk8isUEWZGWlJYySCTD6aKvbUDu+zbPeDakk3bg5H4XpitHukgfL1m9w==}
-    engines: {node: '>=18.12'}
-    peerDependencies:
-      typescript: '>=4.8.4'
-
   ts-api-utils@2.1.0:
     resolution: {integrity: sha512-CUgTZL1irw8u29bzrOD/nH85jqyc74D6SshFgujOIA7osm2Rz7dYH77agkx7H4FBNxDq7Cjf+IjaX/8zwFW+ZQ==}
     engines: {node: '>=18.12'}
@@ -9519,8 +9463,8 @@ packages:
     peerDependencies:
       typescript: 5.0.x || 5.1.x || 5.2.x || 5.3.x || 5.4.x || 5.5.x || 5.6.x || 5.7.x
 
-  typescript-eslint@8.32.0:
-    resolution: {integrity: sha512-UMq2kxdXCzinFFPsXc9o2ozIpYCCOiEC46MG3yEh5Vipq6BO27otTtEBZA1fQ66DulEUgE97ucQ/3YY66CPg0A==}
+  typescript-eslint@8.38.0:
+    resolution: {integrity: sha512-FsZlrYK6bPDGoLeZRuvx2v6qrM03I0U0SnfCLPs/XCCPCFD80xU9Pg09H/K+XFa68uJuZo7l/Xhs+eDRg2l3hg==}
     engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
     peerDependencies:
       eslint: ^8.57.0 || ^9.0.0
@@ -10845,7 +10789,7 @@ snapshots:
       '@babel/traverse': 7.27.1
       '@babel/types': 7.27.1
       convert-source-map: 2.0.0
-      debug: 4.4.0
+      debug: 4.4.1(supports-color@8.1.1)
       gensync: 1.0.0-beta.2
       json5: 2.2.3
       semver: 6.3.1
@@ -10865,7 +10809,7 @@ snapshots:
       '@babel/traverse': 7.28.0
       '@babel/types': 7.28.0
       convert-source-map: 2.0.0
-      debug: 4.4.0
+      debug: 4.4.1(supports-color@8.1.1)
       gensync: 1.0.0-beta.2
       json5: 2.2.3
       semver: 6.3.1
@@ -11058,8 +11002,6 @@ snapshots:
 
   '@babel/helper-string-parser@7.27.1': {}
 
-  '@babel/helper-validator-identifier@7.25.9': {}
-
   '@babel/helper-validator-identifier@7.27.1': {}
 
   '@babel/helper-validator-option@7.27.1': {}
@@ -12110,7 +12052,7 @@ snapshots:
       '@babel/parser': 7.27.2
       '@babel/template': 7.27.2
       '@babel/types': 7.27.1
-      debug: 4.4.0
+      debug: 4.4.1(supports-color@8.1.1)
       globals: 11.12.0
     transitivePeerDependencies:
       - supports-color
@@ -12123,7 +12065,7 @@ snapshots:
       '@babel/parser': 7.28.0
       '@babel/template': 7.27.2
       '@babel/types': 7.28.0
-      debug: 4.4.0
+      debug: 4.4.1(supports-color@8.1.1)
     transitivePeerDependencies:
       - supports-color
 
@@ -12322,65 +12264,65 @@ snapshots:
 
   '@chevrotain/utils@11.0.3': {}
 
-  '@cspell/cspell-bundled-dicts@8.19.3':
+  '@cspell/cspell-bundled-dicts@8.19.4':
     dependencies:
       '@cspell/dict-ada': 4.1.0
       '@cspell/dict-al': 1.1.0
-      '@cspell/dict-aws': 4.0.10
+      '@cspell/dict-aws': 4.0.12
       '@cspell/dict-bash': 4.2.0
-      '@cspell/dict-companies': 3.1.15
+      '@cspell/dict-companies': 3.2.2
       '@cspell/dict-cpp': 6.0.8
       '@cspell/dict-cryptocurrencies': 5.0.4
       '@cspell/dict-csharp': 4.0.6
       '@cspell/dict-css': 4.0.17
       '@cspell/dict-dart': 2.3.0
-      '@cspell/dict-data-science': 2.0.8
+      '@cspell/dict-data-science': 2.0.9
       '@cspell/dict-django': 4.1.4
-      '@cspell/dict-docker': 1.1.13
+      '@cspell/dict-docker': 1.1.15
       '@cspell/dict-dotnet': 5.0.9
       '@cspell/dict-elixir': 4.0.7
-      '@cspell/dict-en-common-misspellings': 2.0.10
+      '@cspell/dict-en-common-misspellings': 2.1.3
       '@cspell/dict-en-gb': 1.1.33
-      '@cspell/dict-en_us': 4.4.3
-      '@cspell/dict-filetypes': 3.0.11
+      '@cspell/dict-en_us': 4.4.14
+      '@cspell/dict-filetypes': 3.0.13
       '@cspell/dict-flutter': 1.1.0
       '@cspell/dict-fonts': 4.0.4
       '@cspell/dict-fsharp': 1.1.0
       '@cspell/dict-fullstack': 3.2.6
       '@cspell/dict-gaming-terms': 1.1.1
-      '@cspell/dict-git': 3.0.4
-      '@cspell/dict-golang': 6.0.20
+      '@cspell/dict-git': 3.0.7
+      '@cspell/dict-golang': 6.0.23
       '@cspell/dict-google': 1.0.8
       '@cspell/dict-haskell': 4.0.5
       '@cspell/dict-html': 4.0.11
       '@cspell/dict-html-symbol-entities': 4.0.3
       '@cspell/dict-java': 5.0.11
       '@cspell/dict-julia': 1.1.0
-      '@cspell/dict-k8s': 1.0.10
+      '@cspell/dict-k8s': 1.0.12
       '@cspell/dict-kotlin': 1.1.0
       '@cspell/dict-latex': 4.0.3
       '@cspell/dict-lorem-ipsum': 4.0.4
       '@cspell/dict-lua': 4.0.7
       '@cspell/dict-makefile': 1.0.4
-      '@cspell/dict-markdown': 2.0.10(@cspell/dict-css@4.0.17)(@cspell/dict-html-symbol-entities@4.0.3)(@cspell/dict-html@4.0.11)(@cspell/dict-typescript@3.2.1)
+      '@cspell/dict-markdown': 2.0.12(@cspell/dict-css@4.0.17)(@cspell/dict-html-symbol-entities@4.0.3)(@cspell/dict-html@4.0.11)(@cspell/dict-typescript@3.2.3)
       '@cspell/dict-monkeyc': 1.0.10
       '@cspell/dict-node': 5.0.7
-      '@cspell/dict-npm': 5.2.1
+      '@cspell/dict-npm': 5.2.11
       '@cspell/dict-php': 4.0.14
       '@cspell/dict-powershell': 5.0.14
       '@cspell/dict-public-licenses': 2.0.13
-      '@cspell/dict-python': 4.2.17
+      '@cspell/dict-python': 4.2.19
       '@cspell/dict-r': 2.1.0
       '@cspell/dict-ruby': 5.0.8
       '@cspell/dict-rust': 4.0.11
       '@cspell/dict-scala': 5.0.7
       '@cspell/dict-shell': 1.1.0
-      '@cspell/dict-software-terms': 5.0.5
+      '@cspell/dict-software-terms': 5.1.4
       '@cspell/dict-sql': 2.2.0
       '@cspell/dict-svelte': 1.0.6
       '@cspell/dict-swift': 2.0.5
-      '@cspell/dict-terraform': 1.1.1
-      '@cspell/dict-typescript': 3.2.1
+      '@cspell/dict-terraform': 1.1.3
+      '@cspell/dict-typescript': 3.2.3
       '@cspell/dict-vue': 3.0.4
 
   '@cspell/cspell-bundled-dicts@9.1.3':
@@ -12448,11 +12390,11 @@ snapshots:
     dependencies:
       '@cspell/cspell-types': 9.1.3
 
-  '@cspell/cspell-pipe@8.19.3': {}
+  '@cspell/cspell-pipe@8.19.4': {}
 
   '@cspell/cspell-pipe@9.1.3': {}
 
-  '@cspell/cspell-resolver@8.19.3':
+  '@cspell/cspell-resolver@8.19.4':
     dependencies:
       global-directory: 4.0.1
 
@@ -12460,11 +12402,11 @@ snapshots:
     dependencies:
       global-directory: 4.0.1
 
-  '@cspell/cspell-service-bus@8.19.3': {}
+  '@cspell/cspell-service-bus@8.19.4': {}
 
   '@cspell/cspell-service-bus@9.1.3': {}
 
-  '@cspell/cspell-types@8.19.3': {}
+  '@cspell/cspell-types@8.19.4': {}
 
   '@cspell/cspell-types@9.1.3': {}
 
@@ -12472,16 +12414,12 @@ snapshots:
 
   '@cspell/dict-al@1.1.0': {}
 
-  '@cspell/dict-aws@4.0.10': {}
-
   '@cspell/dict-aws@4.0.12': {}
 
   '@cspell/dict-bash@4.2.0':
     dependencies:
       '@cspell/dict-shell': 1.1.0
 
-  '@cspell/dict-companies@3.1.15': {}
-
   '@cspell/dict-companies@3.2.2': {}
 
   '@cspell/dict-cpp@6.0.8': {}
@@ -12500,16 +12438,12 @@ snapshots:
 
   '@cspell/dict-django@4.1.4': {}
 
-  '@cspell/dict-docker@1.1.13': {}
-
   '@cspell/dict-docker@1.1.15': {}
 
   '@cspell/dict-dotnet@5.0.9': {}
 
   '@cspell/dict-elixir@4.0.7': {}
 
-  '@cspell/dict-en-common-misspellings@2.0.10': {}
-
   '@cspell/dict-en-common-misspellings@2.1.3': {}
 
   '@cspell/dict-en-gb-mit@3.1.4': {}
@@ -12518,10 +12452,6 @@ snapshots:
 
   '@cspell/dict-en_us@4.4.14': {}
 
-  '@cspell/dict-en_us@4.4.3': {}
-
-  '@cspell/dict-filetypes@3.0.11': {}
-
   '@cspell/dict-filetypes@3.0.13': {}
 
   '@cspell/dict-flutter@1.1.0': {}
@@ -12534,12 +12464,8 @@ snapshots:
 
   '@cspell/dict-gaming-terms@1.1.1': {}
 
-  '@cspell/dict-git@3.0.4': {}
-
   '@cspell/dict-git@3.0.7': {}
 
-  '@cspell/dict-golang@6.0.20': {}
-
   '@cspell/dict-golang@6.0.23': {}
 
   '@cspell/dict-google@1.0.8': {}
@@ -12554,8 +12480,6 @@ snapshots:
 
   '@cspell/dict-julia@1.1.0': {}
 
-  '@cspell/dict-k8s@1.0.10': {}
-
   '@cspell/dict-k8s@1.0.12': {}
 
   '@cspell/dict-kotlin@1.1.0': {}
@@ -12568,13 +12492,6 @@ snapshots:
 
   '@cspell/dict-makefile@1.0.4': {}
 
-  '@cspell/dict-markdown@2.0.10(@cspell/dict-css@4.0.17)(@cspell/dict-html-symbol-entities@4.0.3)(@cspell/dict-html@4.0.11)(@cspell/dict-typescript@3.2.1)':
-    dependencies:
-      '@cspell/dict-css': 4.0.17
-      '@cspell/dict-html': 4.0.11
-      '@cspell/dict-html-symbol-entities': 4.0.3
-      '@cspell/dict-typescript': 3.2.1
-
   '@cspell/dict-markdown@2.0.12(@cspell/dict-css@4.0.17)(@cspell/dict-html-symbol-entities@4.0.3)(@cspell/dict-html@4.0.11)(@cspell/dict-typescript@3.2.3)':
     dependencies:
       '@cspell/dict-css': 4.0.17
@@ -12586,8 +12503,6 @@ snapshots:
 
   '@cspell/dict-node@5.0.7': {}
 
-  '@cspell/dict-npm@5.2.1': {}
-
   '@cspell/dict-npm@5.2.11': {}
 
   '@cspell/dict-php@4.0.14': {}
@@ -12596,10 +12511,6 @@ snapshots:
 
   '@cspell/dict-public-licenses@2.0.13': {}
 
-  '@cspell/dict-python@4.2.17':
-    dependencies:
-      '@cspell/dict-data-science': 2.0.8
-
   '@cspell/dict-python@4.2.19':
     dependencies:
       '@cspell/dict-data-science': 2.0.9
@@ -12614,8 +12525,6 @@ snapshots:
 
   '@cspell/dict-shell@1.1.0': {}
 
-  '@cspell/dict-software-terms@5.0.5': {}
-
   '@cspell/dict-software-terms@5.1.4': {}
 
   '@cspell/dict-sql@2.2.0': {}
@@ -12624,19 +12533,15 @@ snapshots:
 
   '@cspell/dict-swift@2.0.5': {}
 
-  '@cspell/dict-terraform@1.1.1': {}
-
   '@cspell/dict-terraform@1.1.3': {}
 
-  '@cspell/dict-typescript@3.2.1': {}
-
   '@cspell/dict-typescript@3.2.3': {}
 
   '@cspell/dict-vue@3.0.4': {}
 
-  '@cspell/dynamic-import@8.19.3':
+  '@cspell/dynamic-import@8.19.4':
     dependencies:
-      '@cspell/url': 8.19.3
+      '@cspell/url': 8.19.4
       import-meta-resolve: 4.1.0
 
   '@cspell/dynamic-import@9.1.3':
@@ -12644,23 +12549,23 @@ snapshots:
       '@cspell/url': 9.1.3
       import-meta-resolve: 4.1.0
 
-  '@cspell/eslint-plugin@8.19.3(eslint@9.26.0(jiti@2.4.2))':
+  '@cspell/eslint-plugin@8.19.4(eslint@9.26.0(jiti@2.4.2))':
     dependencies:
-      '@cspell/cspell-types': 8.19.3
-      '@cspell/url': 8.19.3
-      cspell-lib: 8.19.3
+      '@cspell/cspell-types': 8.19.4
+      '@cspell/url': 8.19.4
+      cspell-lib: 8.19.4
       eslint: 9.26.0(jiti@2.4.2)
-      synckit: 0.11.4
+      synckit: 0.11.8
 
-  '@cspell/filetypes@8.19.3': {}
+  '@cspell/filetypes@8.19.4': {}
 
   '@cspell/filetypes@9.1.3': {}
 
-  '@cspell/strong-weak-map@8.19.3': {}
+  '@cspell/strong-weak-map@8.19.4': {}
 
   '@cspell/strong-weak-map@9.1.3': {}
 
-  '@cspell/url@8.19.3': {}
+  '@cspell/url@8.19.4': {}
 
   '@cspell/url@9.1.3': {}
 
@@ -12790,8 +12695,10 @@ snapshots:
       tslib: 2.8.1
     optional: true
 
-  '@es-joy/jsdoccomment@0.49.0':
+  '@es-joy/jsdoccomment@0.50.2':
     dependencies:
+      '@types/estree': 1.0.7
+      '@typescript-eslint/types': 8.32.0
       comment-parser: 1.4.1
       esquery: 1.6.0
       jsdoc-type-pratt-parser: 4.1.0
@@ -13030,7 +12937,7 @@ snapshots:
   '@eslint/config-array@0.20.0':
     dependencies:
       '@eslint/object-schema': 2.1.6
-      debug: 4.4.0
+      debug: 4.4.1(supports-color@8.1.1)
       minimatch: 3.1.2
     transitivePeerDependencies:
       - supports-color
@@ -13044,7 +12951,7 @@ snapshots:
   '@eslint/eslintrc@3.3.1':
     dependencies:
       ajv: 6.12.6
-      debug: 4.4.0
+      debug: 4.4.1(supports-color@8.1.1)
       espree: 10.3.0
       globals: 14.0.0
       ignore: 5.3.2
@@ -13542,8 +13449,6 @@ snapshots:
   '@pkgjs/parseargs@0.11.0':
     optional: true
 
-  '@pkgr/core@0.1.1': {}
-
   '@pkgr/core@0.2.4': {}
 
   '@polka/url@1.0.0-next.28': {}
@@ -14240,50 +14145,64 @@ snapshots:
       '@types/node': 22.13.5
     optional: true
 
-  '@typescript-eslint/eslint-plugin@8.32.0(@typescript-eslint/parser@8.32.0(eslint@9.26.0(jiti@2.4.2))(typescript@5.7.3))(eslint@9.26.0(jiti@2.4.2))(typescript@5.7.3)':
+  '@typescript-eslint/eslint-plugin@8.38.0(@typescript-eslint/parser@8.38.0(eslint@9.26.0(jiti@2.4.2))(typescript@5.7.3))(eslint@9.26.0(jiti@2.4.2))(typescript@5.7.3)':
     dependencies:
       '@eslint-community/regexpp': 4.12.1
-      '@typescript-eslint/parser': 8.32.0(eslint@9.26.0(jiti@2.4.2))(typescript@5.7.3)
-      '@typescript-eslint/scope-manager': 8.32.0
-      '@typescript-eslint/type-utils': 8.32.0(eslint@9.26.0(jiti@2.4.2))(typescript@5.7.3)
-      '@typescript-eslint/utils': 8.32.0(eslint@9.26.0(jiti@2.4.2))(typescript@5.7.3)
-      '@typescript-eslint/visitor-keys': 8.32.0
+      '@typescript-eslint/parser': 8.38.0(eslint@9.26.0(jiti@2.4.2))(typescript@5.7.3)
+      '@typescript-eslint/scope-manager': 8.38.0
+      '@typescript-eslint/type-utils': 8.38.0(eslint@9.26.0(jiti@2.4.2))(typescript@5.7.3)
+      '@typescript-eslint/utils': 8.38.0(eslint@9.26.0(jiti@2.4.2))(typescript@5.7.3)
+      '@typescript-eslint/visitor-keys': 8.38.0
       eslint: 9.26.0(jiti@2.4.2)
       graphemer: 1.4.0
-      ignore: 5.3.2
+      ignore: 7.0.3
       natural-compare: 1.4.0
       ts-api-utils: 2.1.0(typescript@5.7.3)
       typescript: 5.7.3
     transitivePeerDependencies:
       - supports-color
 
-  '@typescript-eslint/parser@8.32.0(eslint@9.26.0(jiti@2.4.2))(typescript@5.7.3)':
+  '@typescript-eslint/parser@8.38.0(eslint@9.26.0(jiti@2.4.2))(typescript@5.7.3)':
     dependencies:
-      '@typescript-eslint/scope-manager': 8.32.0
-      '@typescript-eslint/types': 8.32.0
-      '@typescript-eslint/typescript-estree': 8.32.0(typescript@5.7.3)
-      '@typescript-eslint/visitor-keys': 8.32.0
-      debug: 4.4.0
+      '@typescript-eslint/scope-manager': 8.38.0
+      '@typescript-eslint/types': 8.38.0
+      '@typescript-eslint/typescript-estree': 8.38.0(typescript@5.7.3)
+      '@typescript-eslint/visitor-keys': 8.38.0
+      debug: 4.4.1(supports-color@8.1.1)
       eslint: 9.26.0(jiti@2.4.2)
       typescript: 5.7.3
     transitivePeerDependencies:
       - supports-color
 
-  '@typescript-eslint/scope-manager@8.24.1':
+  '@typescript-eslint/project-service@8.38.0(typescript@5.7.3)':
     dependencies:
-      '@typescript-eslint/types': 8.24.1
-      '@typescript-eslint/visitor-keys': 8.24.1
+      '@typescript-eslint/tsconfig-utils': 8.38.0(typescript@5.7.3)
+      '@typescript-eslint/types': 8.38.0
+      debug: 4.4.1(supports-color@8.1.1)
+      typescript: 5.7.3
+    transitivePeerDependencies:
+      - supports-color
 
   '@typescript-eslint/scope-manager@8.32.0':
     dependencies:
       '@typescript-eslint/types': 8.32.0
       '@typescript-eslint/visitor-keys': 8.32.0
 
-  '@typescript-eslint/type-utils@8.32.0(eslint@9.26.0(jiti@2.4.2))(typescript@5.7.3)':
+  '@typescript-eslint/scope-manager@8.38.0':
     dependencies:
-      '@typescript-eslint/typescript-estree': 8.32.0(typescript@5.7.3)
-      '@typescript-eslint/utils': 8.32.0(eslint@9.26.0(jiti@2.4.2))(typescript@5.7.3)
-      debug: 4.4.0
+      '@typescript-eslint/types': 8.38.0
+      '@typescript-eslint/visitor-keys': 8.38.0
+
+  '@typescript-eslint/tsconfig-utils@8.38.0(typescript@5.7.3)':
+    dependencies:
+      typescript: 5.7.3
+
+  '@typescript-eslint/type-utils@8.38.0(eslint@9.26.0(jiti@2.4.2))(typescript@5.7.3)':
+    dependencies:
+      '@typescript-eslint/types': 8.38.0
+      '@typescript-eslint/typescript-estree': 8.38.0(typescript@5.7.3)
+      '@typescript-eslint/utils': 8.38.0(eslint@9.26.0(jiti@2.4.2))(typescript@5.7.3)
+      debug: 4.4.1(supports-color@8.1.1)
       eslint: 9.26.0(jiti@2.4.2)
       ts-api-utils: 2.1.0(typescript@5.7.3)
       typescript: 5.7.3
@@ -14292,10 +14211,10 @@ snapshots:
 
   '@typescript-eslint/types@7.18.0': {}
 
-  '@typescript-eslint/types@8.24.1': {}
-
   '@typescript-eslint/types@8.32.0': {}
 
+  '@typescript-eslint/types@8.38.0': {}
+
   '@typescript-eslint/typescript-estree@7.18.0(typescript@5.7.3)':
     dependencies:
       '@typescript-eslint/types': 7.18.0
@@ -14304,48 +14223,39 @@ snapshots:
       globby: 11.1.0
       is-glob: 4.0.3
       minimatch: 9.0.5
-      semver: 7.7.1
+      semver: 7.7.2
       ts-api-utils: 1.3.0(typescript@5.7.3)
     optionalDependencies:
       typescript: 5.7.3
     transitivePeerDependencies:
       - supports-color
 
-  '@typescript-eslint/typescript-estree@8.24.1(typescript@5.7.3)':
-    dependencies:
-      '@typescript-eslint/types': 8.24.1
-      '@typescript-eslint/visitor-keys': 8.24.1
-      debug: 4.4.0
-      fast-glob: 3.3.3
-      is-glob: 4.0.3
-      minimatch: 9.0.5
-      semver: 7.7.1
-      ts-api-utils: 2.0.1(typescript@5.7.3)
-      typescript: 5.7.3
-    transitivePeerDependencies:
-      - supports-color
-
   '@typescript-eslint/typescript-estree@8.32.0(typescript@5.7.3)':
     dependencies:
       '@typescript-eslint/types': 8.32.0
       '@typescript-eslint/visitor-keys': 8.32.0
-      debug: 4.4.0
+      debug: 4.4.1(supports-color@8.1.1)
       fast-glob: 3.3.3
       is-glob: 4.0.3
       minimatch: 9.0.5
-      semver: 7.7.1
+      semver: 7.7.2
       ts-api-utils: 2.1.0(typescript@5.7.3)
       typescript: 5.7.3
     transitivePeerDependencies:
       - supports-color
 
-  '@typescript-eslint/utils@8.24.1(eslint@9.26.0(jiti@2.4.2))(typescript@5.7.3)':
+  '@typescript-eslint/typescript-estree@8.38.0(typescript@5.7.3)':
     dependencies:
-      '@eslint-community/eslint-utils': 4.5.1(eslint@9.26.0(jiti@2.4.2))
-      '@typescript-eslint/scope-manager': 8.24.1
-      '@typescript-eslint/types': 8.24.1
-      '@typescript-eslint/typescript-estree': 8.24.1(typescript@5.7.3)
-      eslint: 9.26.0(jiti@2.4.2)
+      '@typescript-eslint/project-service': 8.38.0(typescript@5.7.3)
+      '@typescript-eslint/tsconfig-utils': 8.38.0(typescript@5.7.3)
+      '@typescript-eslint/types': 8.38.0
+      '@typescript-eslint/visitor-keys': 8.38.0
+      debug: 4.4.1(supports-color@8.1.1)
+      fast-glob: 3.3.3
+      is-glob: 4.0.3
+      minimatch: 9.0.5
+      semver: 7.7.2
+      ts-api-utils: 2.1.0(typescript@5.7.3)
       typescript: 5.7.3
     transitivePeerDependencies:
       - supports-color
@@ -14361,21 +14271,32 @@ snapshots:
     transitivePeerDependencies:
       - supports-color
 
+  '@typescript-eslint/utils@8.38.0(eslint@9.26.0(jiti@2.4.2))(typescript@5.7.3)':
+    dependencies:
+      '@eslint-community/eslint-utils': 4.7.0(eslint@9.26.0(jiti@2.4.2))
+      '@typescript-eslint/scope-manager': 8.38.0
+      '@typescript-eslint/types': 8.38.0
+      '@typescript-eslint/typescript-estree': 8.38.0(typescript@5.7.3)
+      eslint: 9.26.0(jiti@2.4.2)
+      typescript: 5.7.3
+    transitivePeerDependencies:
+      - supports-color
+
   '@typescript-eslint/visitor-keys@7.18.0':
     dependencies:
       '@typescript-eslint/types': 7.18.0
       eslint-visitor-keys: 3.4.3
 
-  '@typescript-eslint/visitor-keys@8.24.1':
-    dependencies:
-      '@typescript-eslint/types': 8.24.1
-      eslint-visitor-keys: 4.2.0
-
   '@typescript-eslint/visitor-keys@8.32.0':
     dependencies:
       '@typescript-eslint/types': 8.32.0
       eslint-visitor-keys: 4.2.0
 
+  '@typescript-eslint/visitor-keys@8.38.0':
+    dependencies:
+      '@typescript-eslint/types': 8.38.0
+      eslint-visitor-keys: 4.2.1
+
   '@ungap/structured-clone@1.3.0': {}
 
   '@unocss/astro@66.0.0(vite@6.1.1(@types/node@22.13.5)(jiti@2.4.2)(terser@5.39.0)(tsx@4.19.3)(yaml@2.8.0))(vue@3.5.13(typescript@5.7.3))':
@@ -14987,7 +14908,7 @@ snapshots:
 
   agent-base@6.0.2:
     dependencies:
-      debug: 4.4.0
+      debug: 4.4.1(supports-color@8.1.1)
     transitivePeerDependencies:
       - supports-color
 
@@ -15376,7 +15297,7 @@ snapshots:
     dependencies:
       bytes: 3.1.2
       content-type: 1.0.5
-      debug: 4.4.0
+      debug: 4.4.1(supports-color@8.1.1)
       http-errors: 2.0.0
       iconv-lite: 0.6.3
       on-finished: 2.4.1
@@ -15828,10 +15749,6 @@ snapshots:
     dependencies:
       is-what: 4.1.16
 
-  core-js-compat@3.41.0:
-    dependencies:
-      browserslist: 4.24.4
-
   core-js-compat@3.42.0:
     dependencies:
       browserslist: 4.24.4
@@ -15901,11 +15818,11 @@ snapshots:
 
   crypto-random-string@2.0.0: {}
 
-  cspell-config-lib@8.19.3:
+  cspell-config-lib@8.19.4:
     dependencies:
-      '@cspell/cspell-types': 8.19.3
+      '@cspell/cspell-types': 8.19.4
       comment-json: 4.2.5
-      yaml: 2.7.1
+      yaml: 2.8.0
 
   cspell-config-lib@9.1.3:
     dependencies:
@@ -15914,11 +15831,11 @@ snapshots:
       smol-toml: 1.4.1
       yaml: 2.8.0
 
-  cspell-dictionary@8.19.3:
+  cspell-dictionary@8.19.4:
     dependencies:
-      '@cspell/cspell-pipe': 8.19.3
-      '@cspell/cspell-types': 8.19.3
-      cspell-trie-lib: 8.19.3
+      '@cspell/cspell-pipe': 8.19.4
+      '@cspell/cspell-types': 8.19.4
+      cspell-trie-lib: 8.19.4
       fast-equals: 5.2.2
 
   cspell-dictionary@9.1.3:
@@ -15934,9 +15851,9 @@ snapshots:
       cspell-glob: 9.1.3
       cspell-io: 9.1.3
 
-  cspell-glob@8.19.3:
+  cspell-glob@8.19.4:
     dependencies:
-      '@cspell/url': 8.19.3
+      '@cspell/url': 8.19.4
       picomatch: 4.0.2
 
   cspell-glob@9.1.3:
@@ -15944,44 +15861,44 @@ snapshots:
       '@cspell/url': 9.1.3
       picomatch: 4.0.2
 
-  cspell-grammar@8.19.3:
+  cspell-grammar@8.19.4:
     dependencies:
-      '@cspell/cspell-pipe': 8.19.3
-      '@cspell/cspell-types': 8.19.3
+      '@cspell/cspell-pipe': 8.19.4
+      '@cspell/cspell-types': 8.19.4
 
   cspell-grammar@9.1.3:
     dependencies:
       '@cspell/cspell-pipe': 9.1.3
       '@cspell/cspell-types': 9.1.3
 
-  cspell-io@8.19.3:
+  cspell-io@8.19.4:
     dependencies:
-      '@cspell/cspell-service-bus': 8.19.3
-      '@cspell/url': 8.19.3
+      '@cspell/cspell-service-bus': 8.19.4
+      '@cspell/url': 8.19.4
 
   cspell-io@9.1.3:
     dependencies:
       '@cspell/cspell-service-bus': 9.1.3
       '@cspell/url': 9.1.3
 
-  cspell-lib@8.19.3:
+  cspell-lib@8.19.4:
     dependencies:
-      '@cspell/cspell-bundled-dicts': 8.19.3
-      '@cspell/cspell-pipe': 8.19.3
-      '@cspell/cspell-resolver': 8.19.3
-      '@cspell/cspell-types': 8.19.3
-      '@cspell/dynamic-import': 8.19.3
-      '@cspell/filetypes': 8.19.3
-      '@cspell/strong-weak-map': 8.19.3
-      '@cspell/url': 8.19.3
+      '@cspell/cspell-bundled-dicts': 8.19.4
+      '@cspell/cspell-pipe': 8.19.4
+      '@cspell/cspell-resolver': 8.19.4
+      '@cspell/cspell-types': 8.19.4
+      '@cspell/dynamic-import': 8.19.4
+      '@cspell/filetypes': 8.19.4
+      '@cspell/strong-weak-map': 8.19.4
+      '@cspell/url': 8.19.4
       clear-module: 4.1.2
       comment-json: 4.2.5
-      cspell-config-lib: 8.19.3
-      cspell-dictionary: 8.19.3
-      cspell-glob: 8.19.3
-      cspell-grammar: 8.19.3
-      cspell-io: 8.19.3
-      cspell-trie-lib: 8.19.3
+      cspell-config-lib: 8.19.4
+      cspell-dictionary: 8.19.4
+      cspell-glob: 8.19.4
+      cspell-grammar: 8.19.4
+      cspell-io: 8.19.4
+      cspell-trie-lib: 8.19.4
       env-paths: 3.0.0
       fast-equals: 5.2.2
       gensequence: 7.0.0
@@ -16018,10 +15935,10 @@ snapshots:
       vscode-uri: 3.1.0
       xdg-basedir: 5.1.0
 
-  cspell-trie-lib@8.19.3:
+  cspell-trie-lib@8.19.4:
     dependencies:
-      '@cspell/cspell-pipe': 8.19.3
-      '@cspell/cspell-types': 8.19.3
+      '@cspell/cspell-pipe': 8.19.4
+      '@cspell/cspell-types': 8.19.4
       gensequence: 7.0.0
 
   cspell-trie-lib@9.1.3:
@@ -16593,7 +16510,7 @@ snapshots:
     optionalDependencies:
       '@types/trusted-types': 2.0.7
 
-  domutils@3.1.0:
+  domutils@3.2.2:
     dependencies:
       dom-serializer: 2.0.0
       domelementtype: 2.3.0
@@ -16670,6 +16587,8 @@ snapshots:
 
   entities@4.5.0: {}
 
+  entities@6.0.1: {}
+
   env-paths@3.0.0: {}
 
   envinfo@7.14.0: {}
@@ -16885,7 +16804,7 @@ snapshots:
     optionalDependencies:
       source-map: 0.6.1
 
-  eslint-config-prettier@10.1.1(eslint@9.26.0(jiti@2.4.2)):
+  eslint-config-prettier@10.1.8(eslint@9.26.0(jiti@2.4.2)):
     dependencies:
       eslint: 9.26.0(jiti@2.4.2)
 
@@ -16894,35 +16813,34 @@ snapshots:
       eslint: 9.26.0(jiti@2.4.2)
       globals: 15.15.0
 
-  eslint-plugin-html@8.1.2:
+  eslint-plugin-html@8.1.3:
     dependencies:
-      htmlparser2: 9.1.0
+      htmlparser2: 10.0.0
 
-  eslint-plugin-jest@28.11.0(@typescript-eslint/eslint-plugin@8.32.0(@typescript-eslint/parser@8.32.0(eslint@9.26.0(jiti@2.4.2))(typescript@5.7.3))(eslint@9.26.0(jiti@2.4.2))(typescript@5.7.3))(eslint@9.26.0(jiti@2.4.2))(jest@30.0.4(@types/node@22.13.5))(typescript@5.7.3):
+  eslint-plugin-jest@28.14.0(@typescript-eslint/eslint-plugin@8.38.0(@typescript-eslint/parser@8.38.0(eslint@9.26.0(jiti@2.4.2))(typescript@5.7.3))(eslint@9.26.0(jiti@2.4.2))(typescript@5.7.3))(eslint@9.26.0(jiti@2.4.2))(jest@30.0.4(@types/node@22.13.5))(typescript@5.7.3):
     dependencies:
-      '@typescript-eslint/utils': 8.24.1(eslint@9.26.0(jiti@2.4.2))(typescript@5.7.3)
+      '@typescript-eslint/utils': 8.32.0(eslint@9.26.0(jiti@2.4.2))(typescript@5.7.3)
       eslint: 9.26.0(jiti@2.4.2)
     optionalDependencies:
-      '@typescript-eslint/eslint-plugin': 8.32.0(@typescript-eslint/parser@8.32.0(eslint@9.26.0(jiti@2.4.2))(typescript@5.7.3))(eslint@9.26.0(jiti@2.4.2))(typescript@5.7.3)
+      '@typescript-eslint/eslint-plugin': 8.38.0(@typescript-eslint/parser@8.38.0(eslint@9.26.0(jiti@2.4.2))(typescript@5.7.3))(eslint@9.26.0(jiti@2.4.2))(typescript@5.7.3)
       jest: 30.0.4(@types/node@22.13.5)
     transitivePeerDependencies:
       - supports-color
       - typescript
 
-  eslint-plugin-jsdoc@50.6.9(eslint@9.26.0(jiti@2.4.2)):
+  eslint-plugin-jsdoc@50.8.0(eslint@9.26.0(jiti@2.4.2)):
     dependencies:
-      '@es-joy/jsdoccomment': 0.49.0
+      '@es-joy/jsdoccomment': 0.50.2
       are-docs-informative: 0.0.2
       comment-parser: 1.4.1
-      debug: 4.4.0
+      debug: 4.4.1(supports-color@8.1.1)
       escape-string-regexp: 4.0.0
       eslint: 9.26.0(jiti@2.4.2)
       espree: 10.3.0
       esquery: 1.6.0
-      parse-imports: 2.2.1
-      semver: 7.7.1
+      parse-imports-exports: 0.2.4
+      semver: 7.7.2
       spdx-expression-parse: 4.0.0
-      synckit: 0.9.2
     transitivePeerDependencies:
       - supports-color
 
@@ -16950,14 +16868,14 @@ snapshots:
       '@microsoft/tsdoc': 0.15.1
       '@microsoft/tsdoc-config': 0.17.1
 
-  eslint-plugin-unicorn@59.0.0(eslint@9.26.0(jiti@2.4.2)):
+  eslint-plugin-unicorn@59.0.1(eslint@9.26.0(jiti@2.4.2)):
     dependencies:
-      '@babel/helper-validator-identifier': 7.25.9
-      '@eslint-community/eslint-utils': 4.5.1(eslint@9.26.0(jiti@2.4.2))
+      '@babel/helper-validator-identifier': 7.27.1
+      '@eslint-community/eslint-utils': 4.7.0(eslint@9.26.0(jiti@2.4.2))
       '@eslint/plugin-kit': 0.2.8
       ci-info: 4.2.0
       clean-regexp: 1.0.0
-      core-js-compat: 3.41.0
+      core-js-compat: 3.42.0
       eslint: 9.26.0(jiti@2.4.2)
       esquery: 1.6.0
       find-up-simple: 1.0.1
@@ -16968,7 +16886,7 @@ snapshots:
       pluralize: 8.0.0
       regexp-tree: 0.1.27
       regjsparser: 0.12.0
-      semver: 7.7.1
+      semver: 7.7.2
       strip-indent: 4.0.0
 
   eslint-scope@5.1.1:
@@ -16985,6 +16903,8 @@ snapshots:
 
   eslint-visitor-keys@4.2.0: {}
 
+  eslint-visitor-keys@4.2.1: {}
+
   eslint@9.26.0(jiti@2.4.2):
     dependencies:
       '@eslint-community/eslint-utils': 4.5.1(eslint@9.26.0(jiti@2.4.2))
@@ -17306,7 +17226,7 @@ snapshots:
       proxy-addr: 2.0.7
       rfdc: 1.4.1
       secure-json-parse: 2.7.0
-      semver: 7.7.1
+      semver: 7.7.2
       toad-cache: 3.7.0
 
   fastq@1.19.0:
@@ -17400,7 +17320,7 @@ snapshots:
 
   finalhandler@2.1.0:
     dependencies:
-      debug: 4.4.0
+      debug: 4.4.1(supports-color@8.1.1)
       encodeurl: 2.0.0
       escape-html: 1.0.3
       on-finished: 2.4.1
@@ -17455,7 +17375,7 @@ snapshots:
       '@babel/parser': 7.27.2
       '@babel/plugin-syntax-jsx': 7.25.7(@babel/core@7.27.1)
       acorn-walk: 8.3.4
-      debug: 4.4.0
+      debug: 4.4.1(supports-color@8.1.1)
       globby: 11.1.0
       simple-bin-help: 1.8.0
     transitivePeerDependencies:
@@ -17889,12 +17809,12 @@ snapshots:
 
   html-void-elements@3.0.0: {}
 
-  htmlparser2@9.1.0:
+  htmlparser2@10.0.0:
     dependencies:
       domelementtype: 2.3.0
       domhandler: 5.0.3
-      domutils: 3.1.0
-      entities: 4.5.0
+      domutils: 3.2.2
+      entities: 6.0.1
 
   http-cache-semantics@4.1.1: {}
 
@@ -17921,7 +17841,7 @@ snapshots:
     dependencies:
       '@tootallnate/once': 2.0.0
       agent-base: 6.0.2
-      debug: 4.4.0
+      debug: 4.4.1(supports-color@8.1.1)
     transitivePeerDependencies:
       - supports-color
 
@@ -17977,7 +17897,7 @@ snapshots:
   https-proxy-agent@5.0.1:
     dependencies:
       agent-base: 6.0.2
-      debug: 4.4.0
+      debug: 4.4.1(supports-color@8.1.1)
     transitivePeerDependencies:
       - supports-color
 
@@ -18294,7 +18214,7 @@ snapshots:
       '@babel/parser': 7.27.2
       '@istanbuljs/schema': 0.1.3
       istanbul-lib-coverage: 3.2.2
-      semver: 7.7.1
+      semver: 7.7.2
     transitivePeerDependencies:
       - supports-color
 
@@ -18315,7 +18235,7 @@ snapshots:
 
   istanbul-lib-source-maps@4.0.1:
     dependencies:
-      debug: 4.4.0
+      debug: 4.4.1(supports-color@8.1.1)
       istanbul-lib-coverage: 3.2.2
       source-map: 0.6.1
     transitivePeerDependencies:
@@ -19052,7 +18972,7 @@ snapshots:
 
   make-dir@4.0.0:
     dependencies:
-      semver: 7.7.1
+      semver: 7.7.2
 
   makeerror@1.0.12:
     dependencies:
@@ -19442,7 +19362,7 @@ snapshots:
 
   micromark@2.11.4:
     dependencies:
-      debug: 4.4.0
+      debug: 4.4.1(supports-color@8.1.1)
       parse-entities: 2.0.0
     transitivePeerDependencies:
       - supports-color
@@ -19450,7 +19370,7 @@ snapshots:
   micromark@4.0.0:
     dependencies:
       '@types/debug': 4.1.12
-      debug: 4.4.0
+      debug: 4.4.1(supports-color@8.1.1)
       decode-named-character-reference: 1.0.2
       devlop: 1.1.0
       micromark-core-commonmark: 2.0.1
@@ -19909,10 +19829,9 @@ snapshots:
       is-decimal: 1.0.4
       is-hexadecimal: 1.0.4
 
-  parse-imports@2.2.1:
+  parse-imports-exports@0.2.4:
     dependencies:
-      es-module-lexer: 1.6.0
-      slashes: 3.0.12
+      parse-statements: 1.0.11
 
   parse-json@5.2.0:
     dependencies:
@@ -19921,6 +19840,8 @@ snapshots:
       json-parse-even-better-errors: 2.3.1
       lines-and-columns: 1.2.4
 
+  parse-statements@1.0.11: {}
+
   parse5@7.2.1:
     dependencies:
       entities: 4.5.0
@@ -20596,7 +20517,7 @@ snapshots:
 
   router@2.2.0:
     dependencies:
-      debug: 4.4.0
+      debug: 4.4.1(supports-color@8.1.1)
       depd: 2.0.0
       is-promise: 4.0.0
       parseurl: 1.3.3
@@ -20716,7 +20637,7 @@ snapshots:
 
   send@1.2.0:
     dependencies:
-      debug: 4.4.0
+      debug: 4.4.1(supports-color@8.1.1)
       encodeurl: 2.0.0
       escape-html: 1.0.3
       etag: 1.8.1
@@ -20915,8 +20836,6 @@ snapshots:
 
   slash@5.1.0: {}
 
-  slashes@3.0.12: {}
-
   slice-ansi@3.0.0:
     dependencies:
       ansi-styles: 4.3.0
@@ -21013,7 +20932,7 @@ snapshots:
 
   spdy-transport@3.0.0:
     dependencies:
-      debug: 4.4.0
+      debug: 4.4.1(supports-color@8.1.1)
       detect-node: 2.1.0
       hpack.js: 2.1.6
       obuf: 1.1.2
@@ -21037,7 +20956,7 @@ snapshots:
   spec-change@1.11.11:
     dependencies:
       arg: 5.0.2
-      debug: 4.4.0
+      debug: 4.4.1(supports-color@8.1.1)
       deep-equal: 2.2.3
       dependency-tree: 11.0.1
       lazy-ass: 2.0.3
@@ -21251,20 +21170,10 @@ snapshots:
 
   symbol-tree@3.2.4: {}
 
-  synckit@0.11.4:
-    dependencies:
-      '@pkgr/core': 0.2.4
-      tslib: 2.8.1
-
   synckit@0.11.8:
     dependencies:
       '@pkgr/core': 0.2.4
 
-  synckit@0.9.2:
-    dependencies:
-      '@pkgr/core': 0.1.1
-      tslib: 2.8.1
-
   tabbable@6.2.0: {}
 
   tailwindcss@3.4.17:
@@ -21478,10 +21387,6 @@ snapshots:
     dependencies:
       typescript: 5.7.3
 
-  ts-api-utils@2.0.1(typescript@5.7.3):
-    dependencies:
-      typescript: 5.7.3
-
   ts-api-utils@2.1.0(typescript@5.7.3):
     dependencies:
       typescript: 5.7.3
@@ -21592,11 +21497,12 @@ snapshots:
       typescript: 5.7.3
       yaml: 2.7.0
 
-  typescript-eslint@8.32.0(eslint@9.26.0(jiti@2.4.2))(typescript@5.7.3):
+  typescript-eslint@8.38.0(eslint@9.26.0(jiti@2.4.2))(typescript@5.7.3):
     dependencies:
-      '@typescript-eslint/eslint-plugin': 8.32.0(@typescript-eslint/parser@8.32.0(eslint@9.26.0(jiti@2.4.2))(typescript@5.7.3))(eslint@9.26.0(jiti@2.4.2))(typescript@5.7.3)
-      '@typescript-eslint/parser': 8.32.0(eslint@9.26.0(jiti@2.4.2))(typescript@5.7.3)
-      '@typescript-eslint/utils': 8.32.0(eslint@9.26.0(jiti@2.4.2))(typescript@5.7.3)
+      '@typescript-eslint/eslint-plugin': 8.38.0(@typescript-eslint/parser@8.38.0(eslint@9.26.0(jiti@2.4.2))(typescript@5.7.3))(eslint@9.26.0(jiti@2.4.2))(typescript@5.7.3)
+      '@typescript-eslint/parser': 8.38.0(eslint@9.26.0(jiti@2.4.2))(typescript@5.7.3)
+      '@typescript-eslint/typescript-estree': 8.38.0(typescript@5.7.3)
+      '@typescript-eslint/utils': 8.38.0(eslint@9.26.0(jiti@2.4.2))(typescript@5.7.3)
       eslint: 9.26.0(jiti@2.4.2)
       typescript: 5.7.3
     transitivePeerDependencies:
@@ -21845,7 +21751,7 @@ snapshots:
   vite-node@3.0.6(@types/node@22.13.5)(jiti@2.4.2)(terser@5.39.0)(tsx@4.19.3)(yaml@2.8.0):
     dependencies:
       cac: 6.7.14
-      debug: 4.4.0
+      debug: 4.4.1(supports-color@8.1.1)
       es-module-lexer: 1.6.0
       pathe: 2.0.3
       vite: 6.1.6(@types/node@22.13.5)(jiti@2.4.2)(terser@5.39.0)(tsx@4.19.3)(yaml@2.8.0)

From adfeb093cb55d570c06998beff767ef7ac7b3a21 Mon Sep 17 00:00:00 2001
From: Prashant-7718 
Date: Wed, 23 Jul 2025 18:55:25 +0530
Subject: [PATCH 064/143] chore: mermaid diagrams for flowchart, mindmap and
 mermaidAPI files

---
 docs/diagrams/flowchart-code-flow.mmd         | 189 +++++++++++
 docs/diagrams/mermaid-api-sequence.mmd        | 307 ++++++++++++++++++
 .../mindmap-implementation-sequence.mmd       | 180 ++++++++++
 .../src/docs/diagrams/flowchart-code-flow.mmd | 189 +++++++++++
 .../docs/diagrams/mermaid-api-sequence.mmd    | 307 ++++++++++++++++++
 .../mindmap-implementation-sequence.mmd       | 180 ++++++++++
 6 files changed, 1352 insertions(+)
 create mode 100644 docs/diagrams/flowchart-code-flow.mmd
 create mode 100644 docs/diagrams/mermaid-api-sequence.mmd
 create mode 100644 docs/diagrams/mindmap-implementation-sequence.mmd
 create mode 100644 packages/mermaid/src/docs/diagrams/flowchart-code-flow.mmd
 create mode 100644 packages/mermaid/src/docs/diagrams/mermaid-api-sequence.mmd
 create mode 100644 packages/mermaid/src/docs/diagrams/mindmap-implementation-sequence.mmd

diff --git a/docs/diagrams/flowchart-code-flow.mmd b/docs/diagrams/flowchart-code-flow.mmd
new file mode 100644
index 000000000..d306dac7b
--- /dev/null
+++ b/docs/diagrams/flowchart-code-flow.mmd
@@ -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
detector(txt, config)"] + Detection --> flowDetectorV2["flowDetector-v2.ts
detector(txt, config)"] + Detection --> elkDetector["elk/detector.ts
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
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
newParser.parse(src)"] + flowParser --> |"Preprocesses src"| RemoveWhitespace["Remove trailing whitespace
src.replace(/}\s*\n/g, '}\n')"] + RemoveWhitespace --> flowJison["parser/flow.jison
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
FlowDB class"] + + FlowDBClass --> DBInit["constructor()
- Initialize counters
- Bind methods
- Setup toolTips
- Call clear()"] + + DBInit --> DBMethods{FlowDB Methods} + + DBMethods --> addVertex["addVertex(id, textObj, type, style,
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
- id, labelType, domId
- styles[], classes[]"] + VertexProcess --> SanitizeText["sanitizeText(textObj.text)"] + VertexProcess --> ParseMetadata["Parse YAML metadata
yaml.load(yamlData)"] + VertexProcess --> SetVertexProps["Set vertex properties
- shape, label, icon, form
- pos, img, constraint, w, h"] + + %% Edge Processing + addSingleLink --> EdgeProcess{Edge Processing} + EdgeProcess --> CreateEdge["Create FlowEdge object
- start, end, type, text
- labelType, classes[]"] + EdgeProcess --> ProcessLinkText["Process link text
- sanitizeText()
- strip quotes"] + EdgeProcess --> SetEdgeProps["Set edge properties
- type, stroke, length"] + EdgeProcess --> GenerateEdgeId["Generate edge ID
getEdgeId(start, end, counter)"] + EdgeProcess --> ValidateEdgeLimit["Validate edge limit
maxEdges check"] + + %% Data Collection + DBMethods --> GetData["getData()"] + GetData --> CollectNodes["Collect nodes[] from vertices"] + GetData --> CollectEdges["Collect edges[] from edges"] + GetData --> ProcessSubGraphs["Process subgraphs
- parentDB Map
- subGraphDB Map"] + GetData --> AddNodeFromVertex["addNodeFromVertex()
for each vertex"] + GetData --> ProcessEdgeTypes["destructEdgeType()
arrowTypeStart, arrowTypeEnd"] + + %% Node Creation + AddNodeFromVertex --> NodeCreation{Node Creation} + NodeCreation --> FindExistingNode["findNode(nodes, vertex.id)"] + NodeCreation --> CreateBaseNode["Create base node
- id, label, parentId
- cssStyles, cssClasses
- shape, domId, tooltip"] + NodeCreation --> GetCompiledStyles["getCompiledStyles(classDefs)"] + NodeCreation --> GetTypeFromVertex["getTypeFromVertex(vertex)"] + + %% Rendering Phase + Renderer --> flowRendererV3["flowRenderer-v3-unified.ts
draw(text, id, version, diag)"] + + flowRendererV3 --> RenderInit["Initialize rendering
- getConfig()
- handle securityLevel
- getDiagramElement()"] + + RenderInit --> GetLayoutData["diag.db.getData()
as LayoutData"] + GetLayoutData --> SetupLayoutData["Setup layout data
- type, layoutAlgorithm
- direction, spacing
- markers, diagramId"] + + SetupLayoutData --> CallRender["render(data4Layout, svg)"] + CallRender --> SetupViewPort["setupViewPortForSVG(svg, padding)"] + SetupViewPort --> ProcessLinks["Process vertex links
- create anchor elements
- handle click events"] + + %% Shape Rendering + CallRender --> ShapeSystem["flowChartShapes.js
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
getStyles(options)"] + stylesTS --> StyleOptions["FlowChartStyleOptions
- arrowheadColor, border2
- clusterBkg, mainBkg
- fontFamily, textColor"] + + StyleOptions --> GenerateCSS["Generate CSS styles
- .label, .cluster-label
- .node, .edgePath
- .flowchart-link, .edgeLabel"] + GenerateCSS --> GetIconStyles["getIconStyles()"] + + %% Type System + Parser --> TypeSystem["types.ts
Type Definitions"] + TypeSystem --> FlowVertex["FlowVertex interface"] + TypeSystem --> FlowEdge["FlowEdge interface"] + TypeSystem --> FlowClass["FlowClass interface"] + TypeSystem --> FlowSubGraph["FlowSubGraph interface"] + TypeSystem --> FlowVertexTypeParam["FlowVertexTypeParam
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
(default)"] + LayoutAlgorithm --> DagreWrapper["dagre-wrapper
(v2 renderer)"] + LayoutAlgorithm --> ELK["elk
(external package)"] + + %% Testing Components + FlowDBClass --> TestFiles["Test Files"] + TestFiles --> flowDbSpec["flowDb.spec.ts"] + TestFiles --> flowChartShapesSpec["flowChartShapes.spec.js"] + TestFiles --> ParserTests["parser/*.spec.js files
- flow-text.spec.js
- flow-edges.spec.js
- flow-style.spec.js
- subgraph.spec.js"] + + %% Configuration + Init --> ConfigSetup["Configuration Setup"] + ConfigSetup --> FlowchartConfig["cnf.flowchart config"] + ConfigSetup --> ArrowMarkers["arrowMarkerAbsolute"] + ConfigSetup --> LayoutConfig["layout config"] + ConfigSetup --> SetConfig["setConfig() calls"] \ No newline at end of file diff --git a/docs/diagrams/mermaid-api-sequence.mmd b/docs/diagrams/mermaid-api-sequence.mmd new file mode 100644 index 000000000..ce7597525 --- /dev/null +++ b/docs/diagrams/mermaid-api-sequence.mmd @@ -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
with
+ 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:
- reset()
- getConfig()
- setConfig()
- getSiteConfig()
- updateSiteConfig()
- saveConfigFromInitialize() + + Note over Styles: CSS Generation + Note right of Styles: Features:
- createCssStyles()
- createUserStyles()
- cssImportantStyles()
- Theme integration
- Class definitions + + Note over API: Security Levels + Note right of API: Modes:
- sandbox: iframe isolation
- loose: minimal sanitization
- default: DOMPurify sanitization + + Note over API: Helper Functions + Note right of API: Utilities:
- cleanUpSvgCode()
- putIntoIFrame()
- appendDivSvgG()
- removeExistingElements() \ No newline at end of file diff --git a/docs/diagrams/mindmap-implementation-sequence.mmd b/docs/diagrams/mindmap-implementation-sequence.mmd new file mode 100644 index 000000000..335855380 --- /dev/null +++ b/docs/diagrams/mindmap-implementation-sequence.mmd @@ -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:
[ → RECT
( → ROUNDED_RECT
(( → CIRCLE
)) → BANG
{{ → 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
.edge-depth-X widths
.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:
Base padding from config
RECT: ×2 padding
ROUNDED_RECT: ×2 padding
HEXAGON: ×2 padding + Note right of Styles: Section Management:
MAX_SECTIONS = 12
Dynamic color generation
Git theme integration + Note right of Renderer: Layout Parameters:
Cytoscape configuration
coseBilkent settings
Node spacing rules \ No newline at end of file diff --git a/packages/mermaid/src/docs/diagrams/flowchart-code-flow.mmd b/packages/mermaid/src/docs/diagrams/flowchart-code-flow.mmd new file mode 100644 index 000000000..d306dac7b --- /dev/null +++ b/packages/mermaid/src/docs/diagrams/flowchart-code-flow.mmd @@ -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
detector(txt, config)"] + Detection --> flowDetectorV2["flowDetector-v2.ts
detector(txt, config)"] + Detection --> elkDetector["elk/detector.ts
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
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
newParser.parse(src)"] + flowParser --> |"Preprocesses src"| RemoveWhitespace["Remove trailing whitespace
src.replace(/}\s*\n/g, '}\n')"] + RemoveWhitespace --> flowJison["parser/flow.jison
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
FlowDB class"] + + FlowDBClass --> DBInit["constructor()
- Initialize counters
- Bind methods
- Setup toolTips
- Call clear()"] + + DBInit --> DBMethods{FlowDB Methods} + + DBMethods --> addVertex["addVertex(id, textObj, type, style,
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
- id, labelType, domId
- styles[], classes[]"] + VertexProcess --> SanitizeText["sanitizeText(textObj.text)"] + VertexProcess --> ParseMetadata["Parse YAML metadata
yaml.load(yamlData)"] + VertexProcess --> SetVertexProps["Set vertex properties
- shape, label, icon, form
- pos, img, constraint, w, h"] + + %% Edge Processing + addSingleLink --> EdgeProcess{Edge Processing} + EdgeProcess --> CreateEdge["Create FlowEdge object
- start, end, type, text
- labelType, classes[]"] + EdgeProcess --> ProcessLinkText["Process link text
- sanitizeText()
- strip quotes"] + EdgeProcess --> SetEdgeProps["Set edge properties
- type, stroke, length"] + EdgeProcess --> GenerateEdgeId["Generate edge ID
getEdgeId(start, end, counter)"] + EdgeProcess --> ValidateEdgeLimit["Validate edge limit
maxEdges check"] + + %% Data Collection + DBMethods --> GetData["getData()"] + GetData --> CollectNodes["Collect nodes[] from vertices"] + GetData --> CollectEdges["Collect edges[] from edges"] + GetData --> ProcessSubGraphs["Process subgraphs
- parentDB Map
- subGraphDB Map"] + GetData --> AddNodeFromVertex["addNodeFromVertex()
for each vertex"] + GetData --> ProcessEdgeTypes["destructEdgeType()
arrowTypeStart, arrowTypeEnd"] + + %% Node Creation + AddNodeFromVertex --> NodeCreation{Node Creation} + NodeCreation --> FindExistingNode["findNode(nodes, vertex.id)"] + NodeCreation --> CreateBaseNode["Create base node
- id, label, parentId
- cssStyles, cssClasses
- shape, domId, tooltip"] + NodeCreation --> GetCompiledStyles["getCompiledStyles(classDefs)"] + NodeCreation --> GetTypeFromVertex["getTypeFromVertex(vertex)"] + + %% Rendering Phase + Renderer --> flowRendererV3["flowRenderer-v3-unified.ts
draw(text, id, version, diag)"] + + flowRendererV3 --> RenderInit["Initialize rendering
- getConfig()
- handle securityLevel
- getDiagramElement()"] + + RenderInit --> GetLayoutData["diag.db.getData()
as LayoutData"] + GetLayoutData --> SetupLayoutData["Setup layout data
- type, layoutAlgorithm
- direction, spacing
- markers, diagramId"] + + SetupLayoutData --> CallRender["render(data4Layout, svg)"] + CallRender --> SetupViewPort["setupViewPortForSVG(svg, padding)"] + SetupViewPort --> ProcessLinks["Process vertex links
- create anchor elements
- handle click events"] + + %% Shape Rendering + CallRender --> ShapeSystem["flowChartShapes.js
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
getStyles(options)"] + stylesTS --> StyleOptions["FlowChartStyleOptions
- arrowheadColor, border2
- clusterBkg, mainBkg
- fontFamily, textColor"] + + StyleOptions --> GenerateCSS["Generate CSS styles
- .label, .cluster-label
- .node, .edgePath
- .flowchart-link, .edgeLabel"] + GenerateCSS --> GetIconStyles["getIconStyles()"] + + %% Type System + Parser --> TypeSystem["types.ts
Type Definitions"] + TypeSystem --> FlowVertex["FlowVertex interface"] + TypeSystem --> FlowEdge["FlowEdge interface"] + TypeSystem --> FlowClass["FlowClass interface"] + TypeSystem --> FlowSubGraph["FlowSubGraph interface"] + TypeSystem --> FlowVertexTypeParam["FlowVertexTypeParam
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
(default)"] + LayoutAlgorithm --> DagreWrapper["dagre-wrapper
(v2 renderer)"] + LayoutAlgorithm --> ELK["elk
(external package)"] + + %% Testing Components + FlowDBClass --> TestFiles["Test Files"] + TestFiles --> flowDbSpec["flowDb.spec.ts"] + TestFiles --> flowChartShapesSpec["flowChartShapes.spec.js"] + TestFiles --> ParserTests["parser/*.spec.js files
- flow-text.spec.js
- flow-edges.spec.js
- flow-style.spec.js
- subgraph.spec.js"] + + %% Configuration + Init --> ConfigSetup["Configuration Setup"] + ConfigSetup --> FlowchartConfig["cnf.flowchart config"] + ConfigSetup --> ArrowMarkers["arrowMarkerAbsolute"] + ConfigSetup --> LayoutConfig["layout config"] + ConfigSetup --> SetConfig["setConfig() calls"] \ No newline at end of file diff --git a/packages/mermaid/src/docs/diagrams/mermaid-api-sequence.mmd b/packages/mermaid/src/docs/diagrams/mermaid-api-sequence.mmd new file mode 100644 index 000000000..ce7597525 --- /dev/null +++ b/packages/mermaid/src/docs/diagrams/mermaid-api-sequence.mmd @@ -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
with
+ 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:
- reset()
- getConfig()
- setConfig()
- getSiteConfig()
- updateSiteConfig()
- saveConfigFromInitialize() + + Note over Styles: CSS Generation + Note right of Styles: Features:
- createCssStyles()
- createUserStyles()
- cssImportantStyles()
- Theme integration
- Class definitions + + Note over API: Security Levels + Note right of API: Modes:
- sandbox: iframe isolation
- loose: minimal sanitization
- default: DOMPurify sanitization + + Note over API: Helper Functions + Note right of API: Utilities:
- cleanUpSvgCode()
- putIntoIFrame()
- appendDivSvgG()
- removeExistingElements() \ No newline at end of file diff --git a/packages/mermaid/src/docs/diagrams/mindmap-implementation-sequence.mmd b/packages/mermaid/src/docs/diagrams/mindmap-implementation-sequence.mmd new file mode 100644 index 000000000..335855380 --- /dev/null +++ b/packages/mermaid/src/docs/diagrams/mindmap-implementation-sequence.mmd @@ -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:
[ → RECT
( → ROUNDED_RECT
(( → CIRCLE
)) → BANG
{{ → 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
.edge-depth-X widths
.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:
Base padding from config
RECT: ×2 padding
ROUNDED_RECT: ×2 padding
HEXAGON: ×2 padding + Note right of Styles: Section Management:
MAX_SECTIONS = 12
Dynamic color generation
Git theme integration + Note right of Renderer: Layout Parameters:
Cytoscape configuration
coseBilkent settings
Node spacing rules \ No newline at end of file From 00a79353fc8dfd2dbee3992e6deceb34c52bddb0 Mon Sep 17 00:00:00 2001 From: Prashant-7718 Date: Thu, 24 Jul 2025 12:40:39 +0530 Subject: [PATCH 065/143] changeset added --- .changeset/dirty-heads-travel.md | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 .changeset/dirty-heads-travel.md diff --git a/.changeset/dirty-heads-travel.md b/.changeset/dirty-heads-travel.md new file mode 100644 index 000000000..2a96554e0 --- /dev/null +++ b/.changeset/dirty-heads-travel.md @@ -0,0 +1,5 @@ +--- +'mermaid': minor +--- + +chore: mermaid diagrams for flowchart mindmap and mermaidAPI From da8ce0b93eeef1ab3e3b7cd0dc61afeaf92e3e29 Mon Sep 17 00:00:00 2001 From: Prashant-7718 Date: Thu, 24 Jul 2025 12:49:08 +0530 Subject: [PATCH 066/143] chore: removed unwanted files --- .../src/docs/diagrams/flowchart-code-flow.mmd | 189 ----------- .../docs/diagrams/mermaid-api-sequence.mmd | 307 ------------------ .../mindmap-implementation-sequence.mmd | 180 ---------- 3 files changed, 676 deletions(-) delete mode 100644 packages/mermaid/src/docs/diagrams/flowchart-code-flow.mmd delete mode 100644 packages/mermaid/src/docs/diagrams/mermaid-api-sequence.mmd delete mode 100644 packages/mermaid/src/docs/diagrams/mindmap-implementation-sequence.mmd diff --git a/packages/mermaid/src/docs/diagrams/flowchart-code-flow.mmd b/packages/mermaid/src/docs/diagrams/flowchart-code-flow.mmd deleted file mode 100644 index d306dac7b..000000000 --- a/packages/mermaid/src/docs/diagrams/flowchart-code-flow.mmd +++ /dev/null @@ -1,189 +0,0 @@ ---- -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
detector(txt, config)"] - Detection --> flowDetectorV2["flowDetector-v2.ts
detector(txt, config)"] - Detection --> elkDetector["elk/detector.ts
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
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
newParser.parse(src)"] - flowParser --> |"Preprocesses src"| RemoveWhitespace["Remove trailing whitespace
src.replace(/}\s*\n/g, '}\n')"] - RemoveWhitespace --> flowJison["parser/flow.jison
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
FlowDB class"] - - FlowDBClass --> DBInit["constructor()
- Initialize counters
- Bind methods
- Setup toolTips
- Call clear()"] - - DBInit --> DBMethods{FlowDB Methods} - - DBMethods --> addVertex["addVertex(id, textObj, type, style,
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
- id, labelType, domId
- styles[], classes[]"] - VertexProcess --> SanitizeText["sanitizeText(textObj.text)"] - VertexProcess --> ParseMetadata["Parse YAML metadata
yaml.load(yamlData)"] - VertexProcess --> SetVertexProps["Set vertex properties
- shape, label, icon, form
- pos, img, constraint, w, h"] - - %% Edge Processing - addSingleLink --> EdgeProcess{Edge Processing} - EdgeProcess --> CreateEdge["Create FlowEdge object
- start, end, type, text
- labelType, classes[]"] - EdgeProcess --> ProcessLinkText["Process link text
- sanitizeText()
- strip quotes"] - EdgeProcess --> SetEdgeProps["Set edge properties
- type, stroke, length"] - EdgeProcess --> GenerateEdgeId["Generate edge ID
getEdgeId(start, end, counter)"] - EdgeProcess --> ValidateEdgeLimit["Validate edge limit
maxEdges check"] - - %% Data Collection - DBMethods --> GetData["getData()"] - GetData --> CollectNodes["Collect nodes[] from vertices"] - GetData --> CollectEdges["Collect edges[] from edges"] - GetData --> ProcessSubGraphs["Process subgraphs
- parentDB Map
- subGraphDB Map"] - GetData --> AddNodeFromVertex["addNodeFromVertex()
for each vertex"] - GetData --> ProcessEdgeTypes["destructEdgeType()
arrowTypeStart, arrowTypeEnd"] - - %% Node Creation - AddNodeFromVertex --> NodeCreation{Node Creation} - NodeCreation --> FindExistingNode["findNode(nodes, vertex.id)"] - NodeCreation --> CreateBaseNode["Create base node
- id, label, parentId
- cssStyles, cssClasses
- shape, domId, tooltip"] - NodeCreation --> GetCompiledStyles["getCompiledStyles(classDefs)"] - NodeCreation --> GetTypeFromVertex["getTypeFromVertex(vertex)"] - - %% Rendering Phase - Renderer --> flowRendererV3["flowRenderer-v3-unified.ts
draw(text, id, version, diag)"] - - flowRendererV3 --> RenderInit["Initialize rendering
- getConfig()
- handle securityLevel
- getDiagramElement()"] - - RenderInit --> GetLayoutData["diag.db.getData()
as LayoutData"] - GetLayoutData --> SetupLayoutData["Setup layout data
- type, layoutAlgorithm
- direction, spacing
- markers, diagramId"] - - SetupLayoutData --> CallRender["render(data4Layout, svg)"] - CallRender --> SetupViewPort["setupViewPortForSVG(svg, padding)"] - SetupViewPort --> ProcessLinks["Process vertex links
- create anchor elements
- handle click events"] - - %% Shape Rendering - CallRender --> ShapeSystem["flowChartShapes.js
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
getStyles(options)"] - stylesTS --> StyleOptions["FlowChartStyleOptions
- arrowheadColor, border2
- clusterBkg, mainBkg
- fontFamily, textColor"] - - StyleOptions --> GenerateCSS["Generate CSS styles
- .label, .cluster-label
- .node, .edgePath
- .flowchart-link, .edgeLabel"] - GenerateCSS --> GetIconStyles["getIconStyles()"] - - %% Type System - Parser --> TypeSystem["types.ts
Type Definitions"] - TypeSystem --> FlowVertex["FlowVertex interface"] - TypeSystem --> FlowEdge["FlowEdge interface"] - TypeSystem --> FlowClass["FlowClass interface"] - TypeSystem --> FlowSubGraph["FlowSubGraph interface"] - TypeSystem --> FlowVertexTypeParam["FlowVertexTypeParam
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
(default)"] - LayoutAlgorithm --> DagreWrapper["dagre-wrapper
(v2 renderer)"] - LayoutAlgorithm --> ELK["elk
(external package)"] - - %% Testing Components - FlowDBClass --> TestFiles["Test Files"] - TestFiles --> flowDbSpec["flowDb.spec.ts"] - TestFiles --> flowChartShapesSpec["flowChartShapes.spec.js"] - TestFiles --> ParserTests["parser/*.spec.js files
- flow-text.spec.js
- flow-edges.spec.js
- flow-style.spec.js
- subgraph.spec.js"] - - %% Configuration - Init --> ConfigSetup["Configuration Setup"] - ConfigSetup --> FlowchartConfig["cnf.flowchart config"] - ConfigSetup --> ArrowMarkers["arrowMarkerAbsolute"] - ConfigSetup --> LayoutConfig["layout config"] - ConfigSetup --> SetConfig["setConfig() calls"] \ No newline at end of file diff --git a/packages/mermaid/src/docs/diagrams/mermaid-api-sequence.mmd b/packages/mermaid/src/docs/diagrams/mermaid-api-sequence.mmd deleted file mode 100644 index ce7597525..000000000 --- a/packages/mermaid/src/docs/diagrams/mermaid-api-sequence.mmd +++ /dev/null @@ -1,307 +0,0 @@ ---- -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
with
- 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:
- reset()
- getConfig()
- setConfig()
- getSiteConfig()
- updateSiteConfig()
- saveConfigFromInitialize() - - Note over Styles: CSS Generation - Note right of Styles: Features:
- createCssStyles()
- createUserStyles()
- cssImportantStyles()
- Theme integration
- Class definitions - - Note over API: Security Levels - Note right of API: Modes:
- sandbox: iframe isolation
- loose: minimal sanitization
- default: DOMPurify sanitization - - Note over API: Helper Functions - Note right of API: Utilities:
- cleanUpSvgCode()
- putIntoIFrame()
- appendDivSvgG()
- removeExistingElements() \ No newline at end of file diff --git a/packages/mermaid/src/docs/diagrams/mindmap-implementation-sequence.mmd b/packages/mermaid/src/docs/diagrams/mindmap-implementation-sequence.mmd deleted file mode 100644 index 335855380..000000000 --- a/packages/mermaid/src/docs/diagrams/mindmap-implementation-sequence.mmd +++ /dev/null @@ -1,180 +0,0 @@ ---- -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:
[ → RECT
( → ROUNDED_RECT
(( → CIRCLE
)) → BANG
{{ → 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
.edge-depth-X widths
.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:
Base padding from config
RECT: ×2 padding
ROUNDED_RECT: ×2 padding
HEXAGON: ×2 padding - Note right of Styles: Section Management:
MAX_SECTIONS = 12
Dynamic color generation
Git theme integration - Note right of Renderer: Layout Parameters:
Cytoscape configuration
coseBilkent settings
Node spacing rules \ No newline at end of file From 1a80854242ece986f2b4c85a05a310eccc41570b Mon Sep 17 00:00:00 2001 From: "autofix-ci[bot]" <114827586+autofix-ci[bot]@users.noreply.github.com> Date: Thu, 24 Jul 2025 07:30:35 +0000 Subject: [PATCH 067/143] [autofix.ci] apply automated fixes --- docs/diagrams/flowchart-code-flow.mmd | 189 ----------- docs/diagrams/mermaid-api-sequence.mmd | 307 ------------------ .../mindmap-implementation-sequence.mmd | 180 ---------- 3 files changed, 676 deletions(-) delete mode 100644 docs/diagrams/flowchart-code-flow.mmd delete mode 100644 docs/diagrams/mermaid-api-sequence.mmd delete mode 100644 docs/diagrams/mindmap-implementation-sequence.mmd diff --git a/docs/diagrams/flowchart-code-flow.mmd b/docs/diagrams/flowchart-code-flow.mmd deleted file mode 100644 index d306dac7b..000000000 --- a/docs/diagrams/flowchart-code-flow.mmd +++ /dev/null @@ -1,189 +0,0 @@ ---- -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
detector(txt, config)"] - Detection --> flowDetectorV2["flowDetector-v2.ts
detector(txt, config)"] - Detection --> elkDetector["elk/detector.ts
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
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
newParser.parse(src)"] - flowParser --> |"Preprocesses src"| RemoveWhitespace["Remove trailing whitespace
src.replace(/}\s*\n/g, '}\n')"] - RemoveWhitespace --> flowJison["parser/flow.jison
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
FlowDB class"] - - FlowDBClass --> DBInit["constructor()
- Initialize counters
- Bind methods
- Setup toolTips
- Call clear()"] - - DBInit --> DBMethods{FlowDB Methods} - - DBMethods --> addVertex["addVertex(id, textObj, type, style,
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
- id, labelType, domId
- styles[], classes[]"] - VertexProcess --> SanitizeText["sanitizeText(textObj.text)"] - VertexProcess --> ParseMetadata["Parse YAML metadata
yaml.load(yamlData)"] - VertexProcess --> SetVertexProps["Set vertex properties
- shape, label, icon, form
- pos, img, constraint, w, h"] - - %% Edge Processing - addSingleLink --> EdgeProcess{Edge Processing} - EdgeProcess --> CreateEdge["Create FlowEdge object
- start, end, type, text
- labelType, classes[]"] - EdgeProcess --> ProcessLinkText["Process link text
- sanitizeText()
- strip quotes"] - EdgeProcess --> SetEdgeProps["Set edge properties
- type, stroke, length"] - EdgeProcess --> GenerateEdgeId["Generate edge ID
getEdgeId(start, end, counter)"] - EdgeProcess --> ValidateEdgeLimit["Validate edge limit
maxEdges check"] - - %% Data Collection - DBMethods --> GetData["getData()"] - GetData --> CollectNodes["Collect nodes[] from vertices"] - GetData --> CollectEdges["Collect edges[] from edges"] - GetData --> ProcessSubGraphs["Process subgraphs
- parentDB Map
- subGraphDB Map"] - GetData --> AddNodeFromVertex["addNodeFromVertex()
for each vertex"] - GetData --> ProcessEdgeTypes["destructEdgeType()
arrowTypeStart, arrowTypeEnd"] - - %% Node Creation - AddNodeFromVertex --> NodeCreation{Node Creation} - NodeCreation --> FindExistingNode["findNode(nodes, vertex.id)"] - NodeCreation --> CreateBaseNode["Create base node
- id, label, parentId
- cssStyles, cssClasses
- shape, domId, tooltip"] - NodeCreation --> GetCompiledStyles["getCompiledStyles(classDefs)"] - NodeCreation --> GetTypeFromVertex["getTypeFromVertex(vertex)"] - - %% Rendering Phase - Renderer --> flowRendererV3["flowRenderer-v3-unified.ts
draw(text, id, version, diag)"] - - flowRendererV3 --> RenderInit["Initialize rendering
- getConfig()
- handle securityLevel
- getDiagramElement()"] - - RenderInit --> GetLayoutData["diag.db.getData()
as LayoutData"] - GetLayoutData --> SetupLayoutData["Setup layout data
- type, layoutAlgorithm
- direction, spacing
- markers, diagramId"] - - SetupLayoutData --> CallRender["render(data4Layout, svg)"] - CallRender --> SetupViewPort["setupViewPortForSVG(svg, padding)"] - SetupViewPort --> ProcessLinks["Process vertex links
- create anchor elements
- handle click events"] - - %% Shape Rendering - CallRender --> ShapeSystem["flowChartShapes.js
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
getStyles(options)"] - stylesTS --> StyleOptions["FlowChartStyleOptions
- arrowheadColor, border2
- clusterBkg, mainBkg
- fontFamily, textColor"] - - StyleOptions --> GenerateCSS["Generate CSS styles
- .label, .cluster-label
- .node, .edgePath
- .flowchart-link, .edgeLabel"] - GenerateCSS --> GetIconStyles["getIconStyles()"] - - %% Type System - Parser --> TypeSystem["types.ts
Type Definitions"] - TypeSystem --> FlowVertex["FlowVertex interface"] - TypeSystem --> FlowEdge["FlowEdge interface"] - TypeSystem --> FlowClass["FlowClass interface"] - TypeSystem --> FlowSubGraph["FlowSubGraph interface"] - TypeSystem --> FlowVertexTypeParam["FlowVertexTypeParam
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
(default)"] - LayoutAlgorithm --> DagreWrapper["dagre-wrapper
(v2 renderer)"] - LayoutAlgorithm --> ELK["elk
(external package)"] - - %% Testing Components - FlowDBClass --> TestFiles["Test Files"] - TestFiles --> flowDbSpec["flowDb.spec.ts"] - TestFiles --> flowChartShapesSpec["flowChartShapes.spec.js"] - TestFiles --> ParserTests["parser/*.spec.js files
- flow-text.spec.js
- flow-edges.spec.js
- flow-style.spec.js
- subgraph.spec.js"] - - %% Configuration - Init --> ConfigSetup["Configuration Setup"] - ConfigSetup --> FlowchartConfig["cnf.flowchart config"] - ConfigSetup --> ArrowMarkers["arrowMarkerAbsolute"] - ConfigSetup --> LayoutConfig["layout config"] - ConfigSetup --> SetConfig["setConfig() calls"] \ No newline at end of file diff --git a/docs/diagrams/mermaid-api-sequence.mmd b/docs/diagrams/mermaid-api-sequence.mmd deleted file mode 100644 index ce7597525..000000000 --- a/docs/diagrams/mermaid-api-sequence.mmd +++ /dev/null @@ -1,307 +0,0 @@ ---- -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
with
- 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:
- reset()
- getConfig()
- setConfig()
- getSiteConfig()
- updateSiteConfig()
- saveConfigFromInitialize() - - Note over Styles: CSS Generation - Note right of Styles: Features:
- createCssStyles()
- createUserStyles()
- cssImportantStyles()
- Theme integration
- Class definitions - - Note over API: Security Levels - Note right of API: Modes:
- sandbox: iframe isolation
- loose: minimal sanitization
- default: DOMPurify sanitization - - Note over API: Helper Functions - Note right of API: Utilities:
- cleanUpSvgCode()
- putIntoIFrame()
- appendDivSvgG()
- removeExistingElements() \ No newline at end of file diff --git a/docs/diagrams/mindmap-implementation-sequence.mmd b/docs/diagrams/mindmap-implementation-sequence.mmd deleted file mode 100644 index 335855380..000000000 --- a/docs/diagrams/mindmap-implementation-sequence.mmd +++ /dev/null @@ -1,180 +0,0 @@ ---- -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:
[ → RECT
( → ROUNDED_RECT
(( → CIRCLE
)) → BANG
{{ → 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
.edge-depth-X widths
.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:
Base padding from config
RECT: ×2 padding
ROUNDED_RECT: ×2 padding
HEXAGON: ×2 padding - Note right of Styles: Section Management:
MAX_SECTIONS = 12
Dynamic color generation
Git theme integration - Note right of Renderer: Layout Parameters:
Cytoscape configuration
coseBilkent settings
Node spacing rules \ No newline at end of file From 10752f13570f018be2e47fe42c1078431206c896 Mon Sep 17 00:00:00 2001 From: Prashant-7718 Date: Thu, 24 Jul 2025 14:03:50 +0530 Subject: [PATCH 068/143] added mermaid files --- docs/diagrams/flowchart-code-flow.mmd | 189 +++++++++++ docs/diagrams/mermaid-api-sequence.mmd | 307 ++++++++++++++++++ .../mindmap-implementation-sequence.mmd | 180 ++++++++++ 3 files changed, 676 insertions(+) create mode 100644 docs/diagrams/flowchart-code-flow.mmd create mode 100644 docs/diagrams/mermaid-api-sequence.mmd create mode 100644 docs/diagrams/mindmap-implementation-sequence.mmd diff --git a/docs/diagrams/flowchart-code-flow.mmd b/docs/diagrams/flowchart-code-flow.mmd new file mode 100644 index 000000000..d306dac7b --- /dev/null +++ b/docs/diagrams/flowchart-code-flow.mmd @@ -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
detector(txt, config)"] + Detection --> flowDetectorV2["flowDetector-v2.ts
detector(txt, config)"] + Detection --> elkDetector["elk/detector.ts
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
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
newParser.parse(src)"] + flowParser --> |"Preprocesses src"| RemoveWhitespace["Remove trailing whitespace
src.replace(/}\s*\n/g, '}\n')"] + RemoveWhitespace --> flowJison["parser/flow.jison
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
FlowDB class"] + + FlowDBClass --> DBInit["constructor()
- Initialize counters
- Bind methods
- Setup toolTips
- Call clear()"] + + DBInit --> DBMethods{FlowDB Methods} + + DBMethods --> addVertex["addVertex(id, textObj, type, style,
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
- id, labelType, domId
- styles[], classes[]"] + VertexProcess --> SanitizeText["sanitizeText(textObj.text)"] + VertexProcess --> ParseMetadata["Parse YAML metadata
yaml.load(yamlData)"] + VertexProcess --> SetVertexProps["Set vertex properties
- shape, label, icon, form
- pos, img, constraint, w, h"] + + %% Edge Processing + addSingleLink --> EdgeProcess{Edge Processing} + EdgeProcess --> CreateEdge["Create FlowEdge object
- start, end, type, text
- labelType, classes[]"] + EdgeProcess --> ProcessLinkText["Process link text
- sanitizeText()
- strip quotes"] + EdgeProcess --> SetEdgeProps["Set edge properties
- type, stroke, length"] + EdgeProcess --> GenerateEdgeId["Generate edge ID
getEdgeId(start, end, counter)"] + EdgeProcess --> ValidateEdgeLimit["Validate edge limit
maxEdges check"] + + %% Data Collection + DBMethods --> GetData["getData()"] + GetData --> CollectNodes["Collect nodes[] from vertices"] + GetData --> CollectEdges["Collect edges[] from edges"] + GetData --> ProcessSubGraphs["Process subgraphs
- parentDB Map
- subGraphDB Map"] + GetData --> AddNodeFromVertex["addNodeFromVertex()
for each vertex"] + GetData --> ProcessEdgeTypes["destructEdgeType()
arrowTypeStart, arrowTypeEnd"] + + %% Node Creation + AddNodeFromVertex --> NodeCreation{Node Creation} + NodeCreation --> FindExistingNode["findNode(nodes, vertex.id)"] + NodeCreation --> CreateBaseNode["Create base node
- id, label, parentId
- cssStyles, cssClasses
- shape, domId, tooltip"] + NodeCreation --> GetCompiledStyles["getCompiledStyles(classDefs)"] + NodeCreation --> GetTypeFromVertex["getTypeFromVertex(vertex)"] + + %% Rendering Phase + Renderer --> flowRendererV3["flowRenderer-v3-unified.ts
draw(text, id, version, diag)"] + + flowRendererV3 --> RenderInit["Initialize rendering
- getConfig()
- handle securityLevel
- getDiagramElement()"] + + RenderInit --> GetLayoutData["diag.db.getData()
as LayoutData"] + GetLayoutData --> SetupLayoutData["Setup layout data
- type, layoutAlgorithm
- direction, spacing
- markers, diagramId"] + + SetupLayoutData --> CallRender["render(data4Layout, svg)"] + CallRender --> SetupViewPort["setupViewPortForSVG(svg, padding)"] + SetupViewPort --> ProcessLinks["Process vertex links
- create anchor elements
- handle click events"] + + %% Shape Rendering + CallRender --> ShapeSystem["flowChartShapes.js
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
getStyles(options)"] + stylesTS --> StyleOptions["FlowChartStyleOptions
- arrowheadColor, border2
- clusterBkg, mainBkg
- fontFamily, textColor"] + + StyleOptions --> GenerateCSS["Generate CSS styles
- .label, .cluster-label
- .node, .edgePath
- .flowchart-link, .edgeLabel"] + GenerateCSS --> GetIconStyles["getIconStyles()"] + + %% Type System + Parser --> TypeSystem["types.ts
Type Definitions"] + TypeSystem --> FlowVertex["FlowVertex interface"] + TypeSystem --> FlowEdge["FlowEdge interface"] + TypeSystem --> FlowClass["FlowClass interface"] + TypeSystem --> FlowSubGraph["FlowSubGraph interface"] + TypeSystem --> FlowVertexTypeParam["FlowVertexTypeParam
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
(default)"] + LayoutAlgorithm --> DagreWrapper["dagre-wrapper
(v2 renderer)"] + LayoutAlgorithm --> ELK["elk
(external package)"] + + %% Testing Components + FlowDBClass --> TestFiles["Test Files"] + TestFiles --> flowDbSpec["flowDb.spec.ts"] + TestFiles --> flowChartShapesSpec["flowChartShapes.spec.js"] + TestFiles --> ParserTests["parser/*.spec.js files
- flow-text.spec.js
- flow-edges.spec.js
- flow-style.spec.js
- subgraph.spec.js"] + + %% Configuration + Init --> ConfigSetup["Configuration Setup"] + ConfigSetup --> FlowchartConfig["cnf.flowchart config"] + ConfigSetup --> ArrowMarkers["arrowMarkerAbsolute"] + ConfigSetup --> LayoutConfig["layout config"] + ConfigSetup --> SetConfig["setConfig() calls"] \ No newline at end of file diff --git a/docs/diagrams/mermaid-api-sequence.mmd b/docs/diagrams/mermaid-api-sequence.mmd new file mode 100644 index 000000000..ce7597525 --- /dev/null +++ b/docs/diagrams/mermaid-api-sequence.mmd @@ -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
with
+ 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:
- reset()
- getConfig()
- setConfig()
- getSiteConfig()
- updateSiteConfig()
- saveConfigFromInitialize() + + Note over Styles: CSS Generation + Note right of Styles: Features:
- createCssStyles()
- createUserStyles()
- cssImportantStyles()
- Theme integration
- Class definitions + + Note over API: Security Levels + Note right of API: Modes:
- sandbox: iframe isolation
- loose: minimal sanitization
- default: DOMPurify sanitization + + Note over API: Helper Functions + Note right of API: Utilities:
- cleanUpSvgCode()
- putIntoIFrame()
- appendDivSvgG()
- removeExistingElements() \ No newline at end of file diff --git a/docs/diagrams/mindmap-implementation-sequence.mmd b/docs/diagrams/mindmap-implementation-sequence.mmd new file mode 100644 index 000000000..335855380 --- /dev/null +++ b/docs/diagrams/mindmap-implementation-sequence.mmd @@ -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:
[ → RECT
( → ROUNDED_RECT
(( → CIRCLE
)) → BANG
{{ → 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
.edge-depth-X widths
.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:
Base padding from config
RECT: ×2 padding
ROUNDED_RECT: ×2 padding
HEXAGON: ×2 padding + Note right of Styles: Section Management:
MAX_SECTIONS = 12
Dynamic color generation
Git theme integration + Note right of Renderer: Layout Parameters:
Cytoscape configuration
coseBilkent settings
Node spacing rules \ No newline at end of file From 9c92da487f558923f474a644234fa69e64dbc70e Mon Sep 17 00:00:00 2001 From: "autofix-ci[bot]" <114827586+autofix-ci[bot]@users.noreply.github.com> Date: Thu, 24 Jul 2025 08:39:03 +0000 Subject: [PATCH 069/143] [autofix.ci] apply automated fixes --- docs/diagrams/flowchart-code-flow.mmd | 189 ----------- docs/diagrams/mermaid-api-sequence.mmd | 307 ------------------ .../mindmap-implementation-sequence.mmd | 180 ---------- 3 files changed, 676 deletions(-) delete mode 100644 docs/diagrams/flowchart-code-flow.mmd delete mode 100644 docs/diagrams/mermaid-api-sequence.mmd delete mode 100644 docs/diagrams/mindmap-implementation-sequence.mmd diff --git a/docs/diagrams/flowchart-code-flow.mmd b/docs/diagrams/flowchart-code-flow.mmd deleted file mode 100644 index d306dac7b..000000000 --- a/docs/diagrams/flowchart-code-flow.mmd +++ /dev/null @@ -1,189 +0,0 @@ ---- -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
detector(txt, config)"] - Detection --> flowDetectorV2["flowDetector-v2.ts
detector(txt, config)"] - Detection --> elkDetector["elk/detector.ts
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
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
newParser.parse(src)"] - flowParser --> |"Preprocesses src"| RemoveWhitespace["Remove trailing whitespace
src.replace(/}\s*\n/g, '}\n')"] - RemoveWhitespace --> flowJison["parser/flow.jison
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
FlowDB class"] - - FlowDBClass --> DBInit["constructor()
- Initialize counters
- Bind methods
- Setup toolTips
- Call clear()"] - - DBInit --> DBMethods{FlowDB Methods} - - DBMethods --> addVertex["addVertex(id, textObj, type, style,
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
- id, labelType, domId
- styles[], classes[]"] - VertexProcess --> SanitizeText["sanitizeText(textObj.text)"] - VertexProcess --> ParseMetadata["Parse YAML metadata
yaml.load(yamlData)"] - VertexProcess --> SetVertexProps["Set vertex properties
- shape, label, icon, form
- pos, img, constraint, w, h"] - - %% Edge Processing - addSingleLink --> EdgeProcess{Edge Processing} - EdgeProcess --> CreateEdge["Create FlowEdge object
- start, end, type, text
- labelType, classes[]"] - EdgeProcess --> ProcessLinkText["Process link text
- sanitizeText()
- strip quotes"] - EdgeProcess --> SetEdgeProps["Set edge properties
- type, stroke, length"] - EdgeProcess --> GenerateEdgeId["Generate edge ID
getEdgeId(start, end, counter)"] - EdgeProcess --> ValidateEdgeLimit["Validate edge limit
maxEdges check"] - - %% Data Collection - DBMethods --> GetData["getData()"] - GetData --> CollectNodes["Collect nodes[] from vertices"] - GetData --> CollectEdges["Collect edges[] from edges"] - GetData --> ProcessSubGraphs["Process subgraphs
- parentDB Map
- subGraphDB Map"] - GetData --> AddNodeFromVertex["addNodeFromVertex()
for each vertex"] - GetData --> ProcessEdgeTypes["destructEdgeType()
arrowTypeStart, arrowTypeEnd"] - - %% Node Creation - AddNodeFromVertex --> NodeCreation{Node Creation} - NodeCreation --> FindExistingNode["findNode(nodes, vertex.id)"] - NodeCreation --> CreateBaseNode["Create base node
- id, label, parentId
- cssStyles, cssClasses
- shape, domId, tooltip"] - NodeCreation --> GetCompiledStyles["getCompiledStyles(classDefs)"] - NodeCreation --> GetTypeFromVertex["getTypeFromVertex(vertex)"] - - %% Rendering Phase - Renderer --> flowRendererV3["flowRenderer-v3-unified.ts
draw(text, id, version, diag)"] - - flowRendererV3 --> RenderInit["Initialize rendering
- getConfig()
- handle securityLevel
- getDiagramElement()"] - - RenderInit --> GetLayoutData["diag.db.getData()
as LayoutData"] - GetLayoutData --> SetupLayoutData["Setup layout data
- type, layoutAlgorithm
- direction, spacing
- markers, diagramId"] - - SetupLayoutData --> CallRender["render(data4Layout, svg)"] - CallRender --> SetupViewPort["setupViewPortForSVG(svg, padding)"] - SetupViewPort --> ProcessLinks["Process vertex links
- create anchor elements
- handle click events"] - - %% Shape Rendering - CallRender --> ShapeSystem["flowChartShapes.js
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
getStyles(options)"] - stylesTS --> StyleOptions["FlowChartStyleOptions
- arrowheadColor, border2
- clusterBkg, mainBkg
- fontFamily, textColor"] - - StyleOptions --> GenerateCSS["Generate CSS styles
- .label, .cluster-label
- .node, .edgePath
- .flowchart-link, .edgeLabel"] - GenerateCSS --> GetIconStyles["getIconStyles()"] - - %% Type System - Parser --> TypeSystem["types.ts
Type Definitions"] - TypeSystem --> FlowVertex["FlowVertex interface"] - TypeSystem --> FlowEdge["FlowEdge interface"] - TypeSystem --> FlowClass["FlowClass interface"] - TypeSystem --> FlowSubGraph["FlowSubGraph interface"] - TypeSystem --> FlowVertexTypeParam["FlowVertexTypeParam
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
(default)"] - LayoutAlgorithm --> DagreWrapper["dagre-wrapper
(v2 renderer)"] - LayoutAlgorithm --> ELK["elk
(external package)"] - - %% Testing Components - FlowDBClass --> TestFiles["Test Files"] - TestFiles --> flowDbSpec["flowDb.spec.ts"] - TestFiles --> flowChartShapesSpec["flowChartShapes.spec.js"] - TestFiles --> ParserTests["parser/*.spec.js files
- flow-text.spec.js
- flow-edges.spec.js
- flow-style.spec.js
- subgraph.spec.js"] - - %% Configuration - Init --> ConfigSetup["Configuration Setup"] - ConfigSetup --> FlowchartConfig["cnf.flowchart config"] - ConfigSetup --> ArrowMarkers["arrowMarkerAbsolute"] - ConfigSetup --> LayoutConfig["layout config"] - ConfigSetup --> SetConfig["setConfig() calls"] \ No newline at end of file diff --git a/docs/diagrams/mermaid-api-sequence.mmd b/docs/diagrams/mermaid-api-sequence.mmd deleted file mode 100644 index ce7597525..000000000 --- a/docs/diagrams/mermaid-api-sequence.mmd +++ /dev/null @@ -1,307 +0,0 @@ ---- -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
with
- 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:
- reset()
- getConfig()
- setConfig()
- getSiteConfig()
- updateSiteConfig()
- saveConfigFromInitialize() - - Note over Styles: CSS Generation - Note right of Styles: Features:
- createCssStyles()
- createUserStyles()
- cssImportantStyles()
- Theme integration
- Class definitions - - Note over API: Security Levels - Note right of API: Modes:
- sandbox: iframe isolation
- loose: minimal sanitization
- default: DOMPurify sanitization - - Note over API: Helper Functions - Note right of API: Utilities:
- cleanUpSvgCode()
- putIntoIFrame()
- appendDivSvgG()
- removeExistingElements() \ No newline at end of file diff --git a/docs/diagrams/mindmap-implementation-sequence.mmd b/docs/diagrams/mindmap-implementation-sequence.mmd deleted file mode 100644 index 335855380..000000000 --- a/docs/diagrams/mindmap-implementation-sequence.mmd +++ /dev/null @@ -1,180 +0,0 @@ ---- -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:
[ → RECT
( → ROUNDED_RECT
(( → CIRCLE
)) → BANG
{{ → 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
.edge-depth-X widths
.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:
Base padding from config
RECT: ×2 padding
ROUNDED_RECT: ×2 padding
HEXAGON: ×2 padding - Note right of Styles: Section Management:
MAX_SECTIONS = 12
Dynamic color generation
Git theme integration - Note right of Renderer: Layout Parameters:
Cytoscape configuration
coseBilkent settings
Node spacing rules \ No newline at end of file From 326e4e369388b6330bd34460353414f01034d039 Mon Sep 17 00:00:00 2001 From: Prashant-7718 Date: Thu, 24 Jul 2025 14:16:18 +0530 Subject: [PATCH 070/143] added mermaid files for documentation --- docs/diagrams/flowchart-code-flow.mmd | 189 +++++++++++ docs/diagrams/mermaid-api-sequence.mmd | 307 ++++++++++++++++++ .../mindmap-implementation-sequence.mmd | 180 ++++++++++ .../src/docs/diagrams/flowchart-code-flow.mmd | 189 +++++++++++ .../docs/diagrams/mermaid-api-sequence.mmd | 307 ++++++++++++++++++ .../mindmap-implementation-sequence.mmd | 180 ++++++++++ 6 files changed, 1352 insertions(+) create mode 100644 docs/diagrams/flowchart-code-flow.mmd create mode 100644 docs/diagrams/mermaid-api-sequence.mmd create mode 100644 docs/diagrams/mindmap-implementation-sequence.mmd create mode 100644 packages/mermaid/src/docs/diagrams/flowchart-code-flow.mmd create mode 100644 packages/mermaid/src/docs/diagrams/mermaid-api-sequence.mmd create mode 100644 packages/mermaid/src/docs/diagrams/mindmap-implementation-sequence.mmd diff --git a/docs/diagrams/flowchart-code-flow.mmd b/docs/diagrams/flowchart-code-flow.mmd new file mode 100644 index 000000000..d306dac7b --- /dev/null +++ b/docs/diagrams/flowchart-code-flow.mmd @@ -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
detector(txt, config)"] + Detection --> flowDetectorV2["flowDetector-v2.ts
detector(txt, config)"] + Detection --> elkDetector["elk/detector.ts
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
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
newParser.parse(src)"] + flowParser --> |"Preprocesses src"| RemoveWhitespace["Remove trailing whitespace
src.replace(/}\s*\n/g, '}\n')"] + RemoveWhitespace --> flowJison["parser/flow.jison
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
FlowDB class"] + + FlowDBClass --> DBInit["constructor()
- Initialize counters
- Bind methods
- Setup toolTips
- Call clear()"] + + DBInit --> DBMethods{FlowDB Methods} + + DBMethods --> addVertex["addVertex(id, textObj, type, style,
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
- id, labelType, domId
- styles[], classes[]"] + VertexProcess --> SanitizeText["sanitizeText(textObj.text)"] + VertexProcess --> ParseMetadata["Parse YAML metadata
yaml.load(yamlData)"] + VertexProcess --> SetVertexProps["Set vertex properties
- shape, label, icon, form
- pos, img, constraint, w, h"] + + %% Edge Processing + addSingleLink --> EdgeProcess{Edge Processing} + EdgeProcess --> CreateEdge["Create FlowEdge object
- start, end, type, text
- labelType, classes[]"] + EdgeProcess --> ProcessLinkText["Process link text
- sanitizeText()
- strip quotes"] + EdgeProcess --> SetEdgeProps["Set edge properties
- type, stroke, length"] + EdgeProcess --> GenerateEdgeId["Generate edge ID
getEdgeId(start, end, counter)"] + EdgeProcess --> ValidateEdgeLimit["Validate edge limit
maxEdges check"] + + %% Data Collection + DBMethods --> GetData["getData()"] + GetData --> CollectNodes["Collect nodes[] from vertices"] + GetData --> CollectEdges["Collect edges[] from edges"] + GetData --> ProcessSubGraphs["Process subgraphs
- parentDB Map
- subGraphDB Map"] + GetData --> AddNodeFromVertex["addNodeFromVertex()
for each vertex"] + GetData --> ProcessEdgeTypes["destructEdgeType()
arrowTypeStart, arrowTypeEnd"] + + %% Node Creation + AddNodeFromVertex --> NodeCreation{Node Creation} + NodeCreation --> FindExistingNode["findNode(nodes, vertex.id)"] + NodeCreation --> CreateBaseNode["Create base node
- id, label, parentId
- cssStyles, cssClasses
- shape, domId, tooltip"] + NodeCreation --> GetCompiledStyles["getCompiledStyles(classDefs)"] + NodeCreation --> GetTypeFromVertex["getTypeFromVertex(vertex)"] + + %% Rendering Phase + Renderer --> flowRendererV3["flowRenderer-v3-unified.ts
draw(text, id, version, diag)"] + + flowRendererV3 --> RenderInit["Initialize rendering
- getConfig()
- handle securityLevel
- getDiagramElement()"] + + RenderInit --> GetLayoutData["diag.db.getData()
as LayoutData"] + GetLayoutData --> SetupLayoutData["Setup layout data
- type, layoutAlgorithm
- direction, spacing
- markers, diagramId"] + + SetupLayoutData --> CallRender["render(data4Layout, svg)"] + CallRender --> SetupViewPort["setupViewPortForSVG(svg, padding)"] + SetupViewPort --> ProcessLinks["Process vertex links
- create anchor elements
- handle click events"] + + %% Shape Rendering + CallRender --> ShapeSystem["flowChartShapes.js
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
getStyles(options)"] + stylesTS --> StyleOptions["FlowChartStyleOptions
- arrowheadColor, border2
- clusterBkg, mainBkg
- fontFamily, textColor"] + + StyleOptions --> GenerateCSS["Generate CSS styles
- .label, .cluster-label
- .node, .edgePath
- .flowchart-link, .edgeLabel"] + GenerateCSS --> GetIconStyles["getIconStyles()"] + + %% Type System + Parser --> TypeSystem["types.ts
Type Definitions"] + TypeSystem --> FlowVertex["FlowVertex interface"] + TypeSystem --> FlowEdge["FlowEdge interface"] + TypeSystem --> FlowClass["FlowClass interface"] + TypeSystem --> FlowSubGraph["FlowSubGraph interface"] + TypeSystem --> FlowVertexTypeParam["FlowVertexTypeParam
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
(default)"] + LayoutAlgorithm --> DagreWrapper["dagre-wrapper
(v2 renderer)"] + LayoutAlgorithm --> ELK["elk
(external package)"] + + %% Testing Components + FlowDBClass --> TestFiles["Test Files"] + TestFiles --> flowDbSpec["flowDb.spec.ts"] + TestFiles --> flowChartShapesSpec["flowChartShapes.spec.js"] + TestFiles --> ParserTests["parser/*.spec.js files
- flow-text.spec.js
- flow-edges.spec.js
- flow-style.spec.js
- subgraph.spec.js"] + + %% Configuration + Init --> ConfigSetup["Configuration Setup"] + ConfigSetup --> FlowchartConfig["cnf.flowchart config"] + ConfigSetup --> ArrowMarkers["arrowMarkerAbsolute"] + ConfigSetup --> LayoutConfig["layout config"] + ConfigSetup --> SetConfig["setConfig() calls"] \ No newline at end of file diff --git a/docs/diagrams/mermaid-api-sequence.mmd b/docs/diagrams/mermaid-api-sequence.mmd new file mode 100644 index 000000000..ce7597525 --- /dev/null +++ b/docs/diagrams/mermaid-api-sequence.mmd @@ -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
with
+ 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:
- reset()
- getConfig()
- setConfig()
- getSiteConfig()
- updateSiteConfig()
- saveConfigFromInitialize() + + Note over Styles: CSS Generation + Note right of Styles: Features:
- createCssStyles()
- createUserStyles()
- cssImportantStyles()
- Theme integration
- Class definitions + + Note over API: Security Levels + Note right of API: Modes:
- sandbox: iframe isolation
- loose: minimal sanitization
- default: DOMPurify sanitization + + Note over API: Helper Functions + Note right of API: Utilities:
- cleanUpSvgCode()
- putIntoIFrame()
- appendDivSvgG()
- removeExistingElements() \ No newline at end of file diff --git a/docs/diagrams/mindmap-implementation-sequence.mmd b/docs/diagrams/mindmap-implementation-sequence.mmd new file mode 100644 index 000000000..335855380 --- /dev/null +++ b/docs/diagrams/mindmap-implementation-sequence.mmd @@ -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:
[ → RECT
( → ROUNDED_RECT
(( → CIRCLE
)) → BANG
{{ → 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
.edge-depth-X widths
.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:
Base padding from config
RECT: ×2 padding
ROUNDED_RECT: ×2 padding
HEXAGON: ×2 padding + Note right of Styles: Section Management:
MAX_SECTIONS = 12
Dynamic color generation
Git theme integration + Note right of Renderer: Layout Parameters:
Cytoscape configuration
coseBilkent settings
Node spacing rules \ No newline at end of file diff --git a/packages/mermaid/src/docs/diagrams/flowchart-code-flow.mmd b/packages/mermaid/src/docs/diagrams/flowchart-code-flow.mmd new file mode 100644 index 000000000..d306dac7b --- /dev/null +++ b/packages/mermaid/src/docs/diagrams/flowchart-code-flow.mmd @@ -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
detector(txt, config)"] + Detection --> flowDetectorV2["flowDetector-v2.ts
detector(txt, config)"] + Detection --> elkDetector["elk/detector.ts
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
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
newParser.parse(src)"] + flowParser --> |"Preprocesses src"| RemoveWhitespace["Remove trailing whitespace
src.replace(/}\s*\n/g, '}\n')"] + RemoveWhitespace --> flowJison["parser/flow.jison
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
FlowDB class"] + + FlowDBClass --> DBInit["constructor()
- Initialize counters
- Bind methods
- Setup toolTips
- Call clear()"] + + DBInit --> DBMethods{FlowDB Methods} + + DBMethods --> addVertex["addVertex(id, textObj, type, style,
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
- id, labelType, domId
- styles[], classes[]"] + VertexProcess --> SanitizeText["sanitizeText(textObj.text)"] + VertexProcess --> ParseMetadata["Parse YAML metadata
yaml.load(yamlData)"] + VertexProcess --> SetVertexProps["Set vertex properties
- shape, label, icon, form
- pos, img, constraint, w, h"] + + %% Edge Processing + addSingleLink --> EdgeProcess{Edge Processing} + EdgeProcess --> CreateEdge["Create FlowEdge object
- start, end, type, text
- labelType, classes[]"] + EdgeProcess --> ProcessLinkText["Process link text
- sanitizeText()
- strip quotes"] + EdgeProcess --> SetEdgeProps["Set edge properties
- type, stroke, length"] + EdgeProcess --> GenerateEdgeId["Generate edge ID
getEdgeId(start, end, counter)"] + EdgeProcess --> ValidateEdgeLimit["Validate edge limit
maxEdges check"] + + %% Data Collection + DBMethods --> GetData["getData()"] + GetData --> CollectNodes["Collect nodes[] from vertices"] + GetData --> CollectEdges["Collect edges[] from edges"] + GetData --> ProcessSubGraphs["Process subgraphs
- parentDB Map
- subGraphDB Map"] + GetData --> AddNodeFromVertex["addNodeFromVertex()
for each vertex"] + GetData --> ProcessEdgeTypes["destructEdgeType()
arrowTypeStart, arrowTypeEnd"] + + %% Node Creation + AddNodeFromVertex --> NodeCreation{Node Creation} + NodeCreation --> FindExistingNode["findNode(nodes, vertex.id)"] + NodeCreation --> CreateBaseNode["Create base node
- id, label, parentId
- cssStyles, cssClasses
- shape, domId, tooltip"] + NodeCreation --> GetCompiledStyles["getCompiledStyles(classDefs)"] + NodeCreation --> GetTypeFromVertex["getTypeFromVertex(vertex)"] + + %% Rendering Phase + Renderer --> flowRendererV3["flowRenderer-v3-unified.ts
draw(text, id, version, diag)"] + + flowRendererV3 --> RenderInit["Initialize rendering
- getConfig()
- handle securityLevel
- getDiagramElement()"] + + RenderInit --> GetLayoutData["diag.db.getData()
as LayoutData"] + GetLayoutData --> SetupLayoutData["Setup layout data
- type, layoutAlgorithm
- direction, spacing
- markers, diagramId"] + + SetupLayoutData --> CallRender["render(data4Layout, svg)"] + CallRender --> SetupViewPort["setupViewPortForSVG(svg, padding)"] + SetupViewPort --> ProcessLinks["Process vertex links
- create anchor elements
- handle click events"] + + %% Shape Rendering + CallRender --> ShapeSystem["flowChartShapes.js
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
getStyles(options)"] + stylesTS --> StyleOptions["FlowChartStyleOptions
- arrowheadColor, border2
- clusterBkg, mainBkg
- fontFamily, textColor"] + + StyleOptions --> GenerateCSS["Generate CSS styles
- .label, .cluster-label
- .node, .edgePath
- .flowchart-link, .edgeLabel"] + GenerateCSS --> GetIconStyles["getIconStyles()"] + + %% Type System + Parser --> TypeSystem["types.ts
Type Definitions"] + TypeSystem --> FlowVertex["FlowVertex interface"] + TypeSystem --> FlowEdge["FlowEdge interface"] + TypeSystem --> FlowClass["FlowClass interface"] + TypeSystem --> FlowSubGraph["FlowSubGraph interface"] + TypeSystem --> FlowVertexTypeParam["FlowVertexTypeParam
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
(default)"] + LayoutAlgorithm --> DagreWrapper["dagre-wrapper
(v2 renderer)"] + LayoutAlgorithm --> ELK["elk
(external package)"] + + %% Testing Components + FlowDBClass --> TestFiles["Test Files"] + TestFiles --> flowDbSpec["flowDb.spec.ts"] + TestFiles --> flowChartShapesSpec["flowChartShapes.spec.js"] + TestFiles --> ParserTests["parser/*.spec.js files
- flow-text.spec.js
- flow-edges.spec.js
- flow-style.spec.js
- subgraph.spec.js"] + + %% Configuration + Init --> ConfigSetup["Configuration Setup"] + ConfigSetup --> FlowchartConfig["cnf.flowchart config"] + ConfigSetup --> ArrowMarkers["arrowMarkerAbsolute"] + ConfigSetup --> LayoutConfig["layout config"] + ConfigSetup --> SetConfig["setConfig() calls"] \ No newline at end of file diff --git a/packages/mermaid/src/docs/diagrams/mermaid-api-sequence.mmd b/packages/mermaid/src/docs/diagrams/mermaid-api-sequence.mmd new file mode 100644 index 000000000..ce7597525 --- /dev/null +++ b/packages/mermaid/src/docs/diagrams/mermaid-api-sequence.mmd @@ -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
with
+ 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:
- reset()
- getConfig()
- setConfig()
- getSiteConfig()
- updateSiteConfig()
- saveConfigFromInitialize() + + Note over Styles: CSS Generation + Note right of Styles: Features:
- createCssStyles()
- createUserStyles()
- cssImportantStyles()
- Theme integration
- Class definitions + + Note over API: Security Levels + Note right of API: Modes:
- sandbox: iframe isolation
- loose: minimal sanitization
- default: DOMPurify sanitization + + Note over API: Helper Functions + Note right of API: Utilities:
- cleanUpSvgCode()
- putIntoIFrame()
- appendDivSvgG()
- removeExistingElements() \ No newline at end of file diff --git a/packages/mermaid/src/docs/diagrams/mindmap-implementation-sequence.mmd b/packages/mermaid/src/docs/diagrams/mindmap-implementation-sequence.mmd new file mode 100644 index 000000000..335855380 --- /dev/null +++ b/packages/mermaid/src/docs/diagrams/mindmap-implementation-sequence.mmd @@ -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:
[ → RECT
( → ROUNDED_RECT
(( → CIRCLE
)) → BANG
{{ → 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
.edge-depth-X widths
.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:
Base padding from config
RECT: ×2 padding
ROUNDED_RECT: ×2 padding
HEXAGON: ×2 padding + Note right of Styles: Section Management:
MAX_SECTIONS = 12
Dynamic color generation
Git theme integration + Note right of Renderer: Layout Parameters:
Cytoscape configuration
coseBilkent settings
Node spacing rules \ No newline at end of file From 999b8365082782d1664d444028b42353b3f24c17 Mon Sep 17 00:00:00 2001 From: Prashant-7718 Date: Thu, 24 Jul 2025 14:46:34 +0530 Subject: [PATCH 071/143] updated changeset --- .changeset/dirty-heads-travel.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.changeset/dirty-heads-travel.md b/.changeset/dirty-heads-travel.md index 2a96554e0..0f253239e 100644 --- a/.changeset/dirty-heads-travel.md +++ b/.changeset/dirty-heads-travel.md @@ -2,4 +2,4 @@ 'mermaid': minor --- -chore: mermaid diagrams for flowchart mindmap and mermaidAPI +chore: Mermaid diagrams for flowchart mindmap and mermaidAPI From 1c269e0432b9aeac1d3dc24004631d1486e1ec81 Mon Sep 17 00:00:00 2001 From: MrCoder Date: Fri, 25 Jul 2025 07:40:59 +1000 Subject: [PATCH 072/143] Convert mermaid-zenuml README from symlink to regular file MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Changed packages/mermaid-zenuml/README.md from a symbolic link pointing to ../mermaid/src/docs/syntax/zenuml.md to a standalone README file with comprehensive documentation for the @mermaid-js/mermaid-zenuml package. 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude --- packages/mermaid-zenuml/README.md | 384 +++++++++++++++++++++++++++++- 1 file changed, 383 insertions(+), 1 deletion(-) mode change 120000 => 100644 packages/mermaid-zenuml/README.md diff --git a/packages/mermaid-zenuml/README.md b/packages/mermaid-zenuml/README.md deleted file mode 120000 index 4300aecbe..000000000 --- a/packages/mermaid-zenuml/README.md +++ /dev/null @@ -1 +0,0 @@ -../mermaid/src/docs/syntax/zenuml.md diff --git a/packages/mermaid-zenuml/README.md b/packages/mermaid-zenuml/README.md new file mode 100644 index 000000000..7de0971a6 --- /dev/null +++ b/packages/mermaid-zenuml/README.md @@ -0,0 +1,383 @@ +# @mermaid-js/mermaid-zenuml + +MermaidJS plugin for ZenUML integration - A powerful sequence diagram rendering engine. + +> A Sequence diagram is an interaction diagram that shows how processes operate with one another and in what order. + +Mermaid can render sequence diagrams with [ZenUML](https://zenuml.com). Note that ZenUML uses a different +syntax than the original Sequence Diagram in mermaid. + +```mermaid +zenuml + BookLibService.Borrow(id) { + User = Session.GetUser() + if(User.isActive) { + try { + BookRepository.Update(id, onLoan, User) + receipt = new Receipt(id, dueDate) + } catch (BookNotFoundException) { + ErrorService.onException(BookNotFoundException) + } finally { + Connection.close() + } + } + return receipt + } +``` + +## Installation + +### With bundlers + +```sh +npm install @mermaid-js/mermaid-zenuml +``` + +```ts +import mermaid from 'mermaid'; +import zenuml from '@mermaid-js/mermaid-zenuml'; + +await mermaid.registerExternalDiagrams([zenuml]); +``` + +### With CDN + +```html + +``` + +> [!NOTE] +> ZenUML uses experimental lazy loading & async rendering features which could change in the future. + +## Basic Usage + +Once the plugin is registered, you can create ZenUML diagrams using the `zenuml` syntax: + +```mermaid +zenuml + Controller.Get(id) { + Service.Get(id) { + item = Repository.Get(id) + if(item) { + return item + } else { + return null + } + } + return result + } +``` + +## ZenUML Syntax Reference + +### Participants + +The participants can be defined implicitly as in the first example on this page. The participants or actors are +rendered in order of appearance in the diagram source text. Sometimes you might want to show the participants in a +different order than how they appear in the first message. It is possible to specify the actor's order of +appearance by doing the following: + +```mermaid +zenuml + title Declare participant (optional) + Bob + Alice + Alice->Bob: Hi Bob + Bob->Alice: Hi Alice +``` + +### Annotators + +If you specifically want to use symbols instead of just rectangles with text you can do so by using the annotator syntax to declare participants as per below. + +```mermaid +zenuml + title Annotators + @Actor Alice + @Database Bob + Alice->Bob: Hi Bob + Bob->Alice: Hi Alice +``` + +Available annotators include: +- `@Actor` - Human figure +- `@Database` - Database symbol +- `@Boundary` - Boundary symbol +- `@Control` - Control symbol +- `@Entity` - Entity symbol +- `@Queue` - Queue symbol + +### Aliases + +The participants can have a convenient identifier and a descriptive label. + +```mermaid +zenuml + title Aliases + A as Alice + J as John + A->J: Hello John, how are you? + J->A: Great! +``` + +## Messages + +Messages can be one of: + +1. Sync message +2. Async message +3. Creation message +4. Reply message + +### Sync message + +You can think of a sync (blocking) method in a programming language. + +```mermaid +zenuml + title Sync message + A.SyncMessage + A.SyncMessage(with, parameters) { + B.nestedSyncMessage() + } +``` + +### Async message + +You can think of an async (non-blocking) method in a programming language. Fire an event and forget about it. + +```mermaid +zenuml + title Async message + Alice->Bob: How are you? +``` + +### Creation message + +We use `new` keyword to create an object. + +```mermaid +zenuml + new A1 + new A2(with, parameters) +``` + +### Reply message + +There are three ways to express a reply message: + +```mermaid +zenuml + // 1. assign a variable from a sync message. + a = A.SyncMessage() + + // 1.1. optionally give the variable a type + SomeType a = A.SyncMessage() + + // 2. use return keyword + A.SyncMessage() { + return result + } + + // 3. use @return or @reply annotator on an async message + @return + A->B: result +``` + +The third way `@return` is rarely used, but it is useful when you want to return to one level up. + +```mermaid +zenuml + title Reply message + Client->A.method() { + B.method() { + if(condition) { + return x1 + // return early + @return + A->Client: x11 + } + } + return x2 + } +``` + +## Advanced Features + +### Nesting + +Sync messages and Creation messages are naturally nestable with `{}`. + +```mermaid +zenuml + A.method() { + B.nested_sync_method() + B->C: nested async message + } +``` + +### Comments + +It is possible to add comments to a sequence diagram with `// comment` syntax. +Comments will be rendered above the messages or fragments. Comments on other places +are ignored. Markdown is supported. + +```mermaid +zenuml + // a comment on a participant will not be rendered + BookService + // a comment on a message. + // **Markdown** is supported. + BookService.getBook() +``` + +### Loops + +It is possible to express loops in a ZenUML diagram. This is done by any of the +following notations: + +1. while +2. for +3. forEach, foreach +4. loop + +```zenuml +while(condition) { + ...statements... +} +``` + +Example: + +```mermaid +zenuml + Alice->John: Hello John, how are you? + while(true) { + John->Alice: Great! + } +``` + +### Alt (Alternative paths) + +It is possible to express alternative paths in a sequence diagram. This is done by the notation + +```zenuml +if(condition1) { + ...statements... +} else if(condition2) { + ...statements... +} else { + ...statements... +} +``` + +Example: + +```mermaid +zenuml + Alice->Bob: Hello Bob, how are you? + if(is_sick) { + Bob->Alice: Not so good :( + } else { + Bob->Alice: Feeling fresh like a daisy + } +``` + +### Opt (Optional) + +It is possible to render an `opt` fragment. This is done by the notation + +```zenuml +opt { + ...statements... +} +``` + +Example: + +```mermaid +zenuml + Alice->Bob: Hello Bob, how are you? + Bob->Alice: Not so good :( + opt { + Bob->Alice: Thanks for asking + } +``` + +### Parallel + +It is possible to show actions that are happening in parallel. + +This is done by the notation + +```zenuml +par { + statement1 + statement2 + statement3 +} +``` + +Example: + +```mermaid +zenuml + par { + Alice->Bob: Hello guys! + Alice->John: Hello guys! + } +``` + +### Try/Catch/Finally (Break) + +It is possible to indicate a stop of the sequence within the flow (usually used to model exceptions). + +This is done by the notation + +``` +try { + ...statements... +} catch { + ...statements... +} finally { + ...statements... +} +``` + +Example: + +```mermaid +zenuml + try { + Consumer->API: Book something + API->BookingService: Start booking process + } catch { + API->Consumer: show failure + } finally { + API->BookingService: rollback status + } +``` + +## Contributing + +This package is part of the [Mermaid](https://github.com/mermaid-js/mermaid) project. See the main repository for contributing guidelines. + +## Contributors + +- [Peng Xiao](https://github.com/MrCoder) +- [Sidharth Vinod](https://sidharth.dev) +- [Dong Cai](https://github.com/dontry) + +## License + +MIT + +## Links + +- [ZenUML Official Website](https://zenuml.com) +- [Mermaid Documentation](https://mermaid.js.org) +- [GitHub Repository](https://github.com/mermaid-js/mermaid) \ No newline at end of file From cf5b4b89a8db9c1440b7fec8d02328d4eb8740a7 Mon Sep 17 00:00:00 2001 From: Hashan Chandika Date: Sun, 27 Jul 2025 13:51:26 +0530 Subject: [PATCH 073/143] make regex match less greedy --- packages/mermaid/src/diagrams/flowchart/elk/detector.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/mermaid/src/diagrams/flowchart/elk/detector.ts b/packages/mermaid/src/diagrams/flowchart/elk/detector.ts index 6688ffd8c..f0b2ac8ff 100644 --- a/packages/mermaid/src/diagrams/flowchart/elk/detector.ts +++ b/packages/mermaid/src/diagrams/flowchart/elk/detector.ts @@ -11,7 +11,7 @@ const detector: DiagramDetector = (txt, config = {}): boolean => { // If diagram explicitly states flowchart-elk /^\s*flowchart-elk/.test(txt) || // If a flowchart/graph diagram has their default renderer set to elk - (/^\s*flowchart|graph/.test(txt) && config?.flowchart?.defaultRenderer === 'elk') + (/^\s*(flowchart|graph)/.test(txt) && config?.flowchart?.defaultRenderer === 'elk') ) { config.layout = 'elk'; return true; From ac04172cf8a5145af25713cb558b0d7235bda927 Mon Sep 17 00:00:00 2001 From: Hashan Chandika Date: Sun, 27 Jul 2025 14:53:28 +0530 Subject: [PATCH 074/143] add tests for #6795 --- .../integration/rendering/classDiagram.spec.js | 17 +++++++++++++++++ cypress/integration/rendering/erDiagram.spec.js | 15 +++++++++++++++ cypress/integration/rendering/mindmap.spec.ts | 17 +++++++++++++++++ 3 files changed, 49 insertions(+) diff --git a/cypress/integration/rendering/classDiagram.spec.js b/cypress/integration/rendering/classDiagram.spec.js index e7d201b5d..f66a2d6f3 100644 --- a/cypress/integration/rendering/classDiagram.spec.js +++ b/cypress/integration/rendering/classDiagram.spec.js @@ -495,4 +495,21 @@ describe('Class diagram', () => { 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' } } + ); + }); + }); }); diff --git a/cypress/integration/rendering/erDiagram.spec.js b/cypress/integration/rendering/erDiagram.spec.js index cbfec8218..8f6193f96 100644 --- a/cypress/integration/rendering/erDiagram.spec.js +++ b/cypress/integration/rendering/erDiagram.spec.js @@ -354,4 +354,19 @@ ORDER ||--|{ LINE-ITEM : contains { 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' } } + ); + }); + }); }); diff --git a/cypress/integration/rendering/mindmap.spec.ts b/cypress/integration/rendering/mindmap.spec.ts index 731f861ee..d76e58c56 100644 --- a/cypress/integration/rendering/mindmap.spec.ts +++ b/cypress/integration/rendering/mindmap.spec.ts @@ -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 */ }); From 5e8aa2dccf6d25ce4f0fe7726ab2a53011a421b2 Mon Sep 17 00:00:00 2001 From: Hashan Chandika Date: Sun, 27 Jul 2025 15:21:46 +0530 Subject: [PATCH 075/143] add unit tests for coverage #6795 --- .../diagram-api/diagram-orchestration.spec.ts | 36 +++++++++++++++++++ 1 file changed, 36 insertions(+) diff --git a/packages/mermaid/src/diagram-api/diagram-orchestration.spec.ts b/packages/mermaid/src/diagram-api/diagram-orchestration.spec.ts index 3ec2d861f..f4f7c58bc 100644 --- a/packages/mermaid/src/diagram-api/diagram-orchestration.spec.ts +++ b/packages/mermaid/src/diagram-api/diagram-orchestration.spec.ts @@ -78,5 +78,41 @@ describe('diagram-orchestration', () => { flowchart: 1 "pie" pie: 2 "pie"`) ).toBe('pie'); }); + + it('should detect proper diagram when defaultRenderer is elk for flowchart', () => { + expect( + detectType('mindmap\n root\n Photograph\n Waterfall', { + flowchart: { defaultRenderer: 'elk' }, + }) + ).toBe('mindmap'); + expect( + detectType( + ` + classDiagram + class Person { + +String name + -Int id + #double age + +Text demographicProfile + } + `, + { flowchart: { defaultRenderer: 'elk' } } + ) + ).toBe('class'); + expect( + detectType( + ` + erDiagram + p[Photograph] { + varchar(12) jobId + date dateCreated + } + `, + { + flowchart: { defaultRenderer: 'elk' }, + } + ) + ).toBe('er'); + }); }); }); From da539c1fa10bc3454507fb241915450e546e7597 Mon Sep 17 00:00:00 2001 From: MrCoder Date: Sun, 27 Jul 2025 20:55:58 +1000 Subject: [PATCH 076/143] chore: Upgrade @zenuml/core to version 3.35.2 --- packages/mermaid-zenuml/package.json | 2 +- pnpm-lock.yaml | 473 +++++++++++++++++---------- 2 files changed, 302 insertions(+), 173 deletions(-) diff --git a/packages/mermaid-zenuml/package.json b/packages/mermaid-zenuml/package.json index d3a76e797..ec7b9486d 100644 --- a/packages/mermaid-zenuml/package.json +++ b/packages/mermaid-zenuml/package.json @@ -33,7 +33,7 @@ ], "license": "MIT", "dependencies": { - "@zenuml/core": "^3.31.1" + "@zenuml/core": "^3.35.2" }, "devDependencies": { "mermaid": "workspace:^" diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 85424c1be..aeebfac01 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -449,8 +449,8 @@ importers: packages/mermaid-zenuml: dependencies: '@zenuml/core': - specifier: ^3.31.1 - version: 3.31.1(typescript@5.7.3) + specifier: ^3.35.2 + version: 3.35.2 devDependencies: mermaid: specifier: workspace:^ @@ -2379,18 +2379,36 @@ packages: '@fastify/merge-json-schemas@0.1.1': resolution: {integrity: sha512-fERDVz7topgNjtXsJTTW1JKLy0rhuLRcquYqNR9rF7OcVpCa2OVW49ZPDIhaRRCaUuvVxI+N416xUoF76HNSXA==} - '@floating-ui/core@1.6.9': - resolution: {integrity: sha512-uMXCuQ3BItDUbAMhIXw7UPXRfAlOAvZzdK9BWpE60MCn+Svt3aLn9jsPTi/WNGlRUu2uI0v5S7JiIUsbsvh3fw==} + '@floating-ui/core@1.7.2': + resolution: {integrity: sha512-wNB5ooIKHQc+Kui96jE/n69rHFWAVoxn5CAzL1Xdd8FG03cgY3MLO+GF9U3W737fYDSgPWA6MReKhBQBop6Pcw==} - '@floating-ui/dom@1.6.13': - resolution: {integrity: sha512-umqzocjDgNRGTuO7Q8CU32dkHkECqI8ZdMZ5Swb6QAM0t5rnlrN3lGo1hdpscRd3WS8T6DKYK4ephgIH9iRh3w==} + '@floating-ui/dom@1.7.2': + resolution: {integrity: sha512-7cfaOQuCS27HD7DX+6ib2OrnW+b4ZBwDNnCcT0uTyidcmyWb03FnQqJybDBoCnpdxwBSfA94UAYlRCt7mV+TbA==} + + '@floating-ui/react-dom@2.1.4': + resolution: {integrity: sha512-JbbpPhp38UmXDDAu60RJmbeme37Jbgsm7NrHGgzYYFKmblzRUh6Pa641dII6LsjwF4XlScDrde2UAzDo/b9KPw==} + peerDependencies: + react: '>=16.8.0' + react-dom: '>=16.8.0' + + '@floating-ui/react@0.26.28': + resolution: {integrity: sha512-yORQuuAtVpiRjpMhdc0wJj06b9JFjrYF4qp96j++v2NBpbi6SEGF7donUJ3TMieerQ6qVkAv1tgr7L4r5roTqw==} + peerDependencies: + react: '>=16.8.0' + react-dom: '>=16.8.0' + + '@floating-ui/react@0.27.14': + resolution: {integrity: sha512-aSf9JXfyXpRQWMbtuW+CJQrnhzHu4Hg1Th9AkvR1o+wSW/vCUVMrtgXaRY5ToV5Fh5w3I7lXJdvlKVvYrQrppw==} + peerDependencies: + react: '>=17.0.0' + react-dom: '>=17.0.0' + + '@floating-ui/utils@0.2.10': + resolution: {integrity: sha512-aGTxbpbg8/b5JfU1HXSrbH3wXZuLPJcNEcZQFMxLs3oSzgtVu6nFPkbbGGUvBcUjKV2YyB9Wxxabo+HEH9tcRQ==} '@floating-ui/utils@0.2.9': resolution: {integrity: sha512-MDWhGtE+eHw5JW7lq4qhc5yRLS11ERl1c7Z6Xd0a58DozHES6EnNNwUWbMiG4J9Cgj053Bhk8zvlhFYKVhULwg==} - '@floating-ui/vue@1.1.6': - resolution: {integrity: sha512-XFlUzGHGv12zbgHNk5FN2mUB7ROul3oG2ENdTpWdE+qMFxyNxWSRmsoyhiEnpmabNm6WnUvR1OvJfUfN4ojC1A==} - '@gerrit0/mini-shiki@1.27.2': resolution: {integrity: sha512-GeWyHz8ao2gBiUW4OJnQDxXQnFgZQwwQk05t/CVVgNBN7/rK8XZ7xY6YhLVv9tH3VppWWmr9DCl3MwemB/i+Og==} @@ -2400,11 +2418,12 @@ packages: '@hapi/topo@5.1.0': resolution: {integrity: sha512-foQZKJig7Ob0BMAYBfcJk8d77QtOe7Wo4ox7ff1lQYoNNAb6jwcY1ncdoy2e9wQZzvNy7ODZCYJkK8kzmcAnAg==} - '@headlessui-float/vue@0.14.4': - resolution: {integrity: sha512-MSyWCxUTueeex+veRCf++q4KM/fa4HOe9HDttzGrtgVDBULkGduFK6ItJh7EHJp2U/dY7qpyDUqp2KCHpCEplw==} + '@headlessui/react@2.2.6': + resolution: {integrity: sha512-gN5CT8Kf4IWwL04GQOjZ/ZnHMFoeFHZmVSFoDKeTmbtmy9oFqQqJMthdBiO3Pl5LXk2w03fGFLpQV6EW84vjjQ==} + engines: {node: '>=10'} peerDependencies: - '@headlessui/vue': ^1.0.0 - vue: ^3.0.0 + react: ^18 || ^19 || ^19.0.0-rc + react-dom: ^18 || ^19 || ^19.0.0-rc '@headlessui/tailwindcss@0.2.2': resolution: {integrity: sha512-xNe42KjdyA4kfUKLLPGzME9zkH7Q3rOZ5huFihWNWOQFxnItxPB3/67yBI8/qBfY8nwBRx5GHn4VprsoluVMGw==} @@ -2412,12 +2431,6 @@ packages: peerDependencies: tailwindcss: ^3.0 || ^4.0 - '@headlessui/vue@1.7.23': - resolution: {integrity: sha512-JzdCNqurrtuu0YW6QaDtR2PIYCKPUWq28csDyMvN4zmGccmE7lz40Is6hc3LA4HFeCI7sekZ/PQMTNmn9I/4Wg==} - engines: {node: '>=10'} - peerDependencies: - vue: ^3.2.0 - '@humanfs/core@0.19.1': resolution: {integrity: sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==} engines: {node: '>=18.18.0'} @@ -2727,6 +2740,43 @@ packages: '@polka/url@1.0.0-next.28': resolution: {integrity: sha512-8LduaNlMZGwdZ6qWrKlfa+2M4gahzFkprZiAt2TF8uS0qQgBizKXpXURqvTJ4WtmupWxaLqjRb2UCTe72mu+Aw==} + '@react-aria/focus@3.21.0': + resolution: {integrity: sha512-7NEGtTPsBy52EZ/ToVKCu0HSelE3kq9qeis+2eEq90XSuJOMaDHUQrA7RC2Y89tlEwQB31bud/kKRi9Qme1dkA==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 + react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 + + '@react-aria/interactions@3.25.4': + resolution: {integrity: sha512-HBQMxgUPHrW8V63u9uGgBymkMfj6vdWbB0GgUJY49K9mBKMsypcHeWkWM6+bF7kxRO728/IK8bWDV6whDbqjHg==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 + react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 + + '@react-aria/ssr@3.9.10': + resolution: {integrity: sha512-hvTm77Pf+pMBhuBm760Li0BVIO38jv1IBws1xFm1NoL26PU+fe+FMW5+VZWyANR6nYL65joaJKZqOdTQMkO9IQ==} + engines: {node: '>= 12'} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 + + '@react-aria/utils@3.30.0': + resolution: {integrity: sha512-ydA6y5G1+gbem3Va2nczj/0G0W7/jUVo/cbN10WA5IizzWIwMP5qhFr7macgbKfHMkZ+YZC3oXnt2NNre5odKw==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 + react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 + + '@react-stately/flags@3.1.2': + resolution: {integrity: sha512-2HjFcZx1MyQXoPqcBGALwWWmgFVUk2TuKVIQxCbRq7fPyWXIl6VHcakCLurdtYC2Iks7zizvz0Idv48MQ38DWg==} + + '@react-stately/utils@3.10.8': + resolution: {integrity: sha512-SN3/h7SzRsusVQjQ4v10LaVsDc81jyyR0DD5HnsQitm/I5WDpaSr2nRHtyloPFU48jlql1XX/S04T2DLQM7Y3g==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 + + '@react-types/shared@3.31.0': + resolution: {integrity: sha512-ua5U6V66gDcbLZe4P2QeyNgPp4YWD1ymGA6j3n+s8CGExtrCPe64v+g4mvpT8Bnb985R96e4zFT61+m0YCwqMg==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 + '@rolldown/pluginutils@1.0.0-beta.19': resolution: {integrity: sha512-3FL3mnMbPu0muGOCaKAhhFEYmqv9eTfPSJRJmANrCwtgK8VuxpsZDGK+m0LYAGoyO8+0j5uRe4PeyPDK1yA/hA==} @@ -3046,17 +3096,21 @@ packages: '@surma/rollup-plugin-off-main-thread@2.2.3': resolution: {integrity: sha512-lR8q/9W7hZpMWweNiAKU7NQerBnzQQLvi8qnTDU/fxItPhtZVMbPV3lbCwjhIlNBe9Bbr5V+KHshvWmVSG9cxQ==} + '@swc/helpers@0.5.17': + resolution: {integrity: sha512-5IKx/Y13RsYd+sauPb2x+U/xZikHjolzfuDgTAl/Tdf3Q8rslRvC19NKDLgAJQ6wsqADk10ntlv08nPFw/gO/A==} + '@szmarczak/http-timer@4.0.6': resolution: {integrity: sha512-4BAffykYOgO+5nzBWYwE3W90sBgLJoUPRWWcL8wlyiM8IB8ipJz3UMJ9KXQd1RKQXpKp8Tutn80HZtWsu2u76w==} engines: {node: '>=10'} - '@tanstack/virtual-core@3.13.0': - resolution: {integrity: sha512-NBKJP3OIdmZY3COJdWkSonr50FMVIi+aj5ZJ7hI/DTpEKg2RMfo/KvP8A3B/zOSpMgIe52B5E2yn7rryULzA6g==} - - '@tanstack/vue-virtual@3.13.0': - resolution: {integrity: sha512-EPgcTc41KGJAK2N2Ux2PeUnG3cPpdkldTib05nwq+0zdS2Ihpbq8BsWXz/eXPyNc5noDBh1GBgAe36yMYiW6WA==} + '@tanstack/react-virtual@3.13.12': + resolution: {integrity: sha512-Gd13QdxPSukP8ZrkbgS2RwoZseTTbQPLnQEn7HY/rqtM+8Zt95f7xKC7N0EsKs7aoz0WzZ+fditZux+F8EzYxA==} peerDependencies: - vue: ^2.7.0 || ^3.0.0 + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + + '@tanstack/virtual-core@3.13.12': + resolution: {integrity: sha512-1YBOJfRHV4sXUmWsFSf5rQor4Ss82G8dQWLRbnk3GA4jeP8hQt1hxXh0tmflpC0dz3VgEv/1+qwPyLeWkQuPFA==} '@tootallnate/once@2.0.0': resolution: {integrity: sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==} @@ -3065,9 +3119,6 @@ packages: '@tybys/wasm-util@0.9.0': resolution: {integrity: sha512-6+7nlbMVX/PVDCwaIQ8nTOPveOcFLSt8GcXdx8hD0bt39uWxYT88uXzqTd4fTvqta7oeUJqudepapKNt2DYJFw==} - '@types/assert@1.5.11': - resolution: {integrity: sha512-FjS1mxq2dlGr9N4z72/DO+XmyRS3ZZIoVn998MEopAN/OmyN28F4yumRL5pOw2z+hbFLuWGYuF2rrw5p11xM5A==} - '@types/babel__core@7.20.5': resolution: {integrity: sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==} @@ -3332,9 +3383,6 @@ packages: '@types/qs@6.9.16': resolution: {integrity: sha512-7i+zxXdPD0T4cKDuxCUXJ4wHcsJLwENa6Z3dCu8cfCK743OGy5Nu1RmAGqDPsoTDINVEcdXKRvR/zre+P2Ku1A==} - '@types/ramda@0.28.25': - resolution: {integrity: sha512-HrQNqQAGcITpn9HAJFamDxm7iZeeXiP/95pN5OMbNniDjzCCeOHbBKNGmUy8NRi0fhYS+/cXeo91MFC+06gbow==} - '@types/range-parser@1.2.7': resolution: {integrity: sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==} @@ -3759,11 +3807,6 @@ packages: '@vitest/utils@3.0.6': resolution: {integrity: sha512-18ktZpf4GQFTbf9jK543uspU03Q2qya7ZGya5yiZ0Gx0nnnalBvd5ZBislbl2EhLjM8A8rt4OilqKG7QwcGkvQ==} - '@vue/compat@3.5.13': - resolution: {integrity: sha512-Q3xRdTPN4l+kddxU98REyUBgvc0meAo9CefCWE2lW8Fg3dyPn3vSCce52b338ihrJAx1RQQhO5wMWhJ/PAKUpA==} - peerDependencies: - vue: 3.5.13 - '@vue/compiler-core@3.5.13': resolution: {integrity: sha512-oOdAkwqUfW1WqpwSYJce06wvt6HljgY3fGeM9NcVA1HaYOij3mZG9Rkysn0OHuyUAGMbEbARIpsG+LPVlBJ5/Q==} @@ -3776,9 +3819,6 @@ packages: '@vue/compiler-ssr@3.5.13': resolution: {integrity: sha512-wMH6vrYHxQl/IybKJagqbquvxpWCuVYpoUJfCqFZwa/JY1GdATAQ+TgVtgrwwMZ0D07QhA99rs/EAAWfvG6KpA==} - '@vue/devtools-api@6.6.4': - resolution: {integrity: sha512-sGhTPMuXqZ1rVOk32RylztWkfXTRhuS7vgAKv0zjqk8gbsHkJ7xfFf+jbySxt7tWObEJwyKaHMikV/WGDiQm8g==} - '@vue/devtools-api@7.7.2': resolution: {integrity: sha512-1syn558KhyN+chO5SjlZIwJ8bV/bQ1nOVTG66t2RbG66ZGekyiYNmRO7X9BJCXQqPsFHlnksqvPhce2qpzxFnA==} @@ -3968,9 +4008,9 @@ packages: '@xtuc/long@4.2.2': resolution: {integrity: sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==} - '@zenuml/core@3.31.1': - resolution: {integrity: sha512-gfbCIp2+AmdT9tUmRiRmMtxWHhvlo0VieGICgxFkvmcJxfNXRokpUrlW1H2NDcD+n9vYy6KjNSoYAxiph/9Irw==} - engines: {node: '>=12.0.0'} + '@zenuml/core@3.35.2': + resolution: {integrity: sha512-g9pX+id6xrZ+pgFiBvBJjol7KyqoHJPsVofiHThSn04bDBVdZLxHtA3KxwRdrggwyRDsK2DLLB1+YA0kITuKtQ==} + engines: {node: '>=20'} JSONSelect@0.4.0: resolution: {integrity: sha512-VRLR3Su35MH+XV2lrvh9O7qWoug/TUyj9tLDjn9rtpUCNnILLrHjgd/tB0KrhugCxUpj3UqoLqfYb3fLJdIQQQ==} @@ -4578,6 +4618,9 @@ packages: resolution: {integrity: sha512-vp42956Ax06WwaaheYEqEOgXZ3VKJxgccZ0gJL0HpyiupkIS9RVJFo5eDU1BPeQAOqz+cclndZg4DCqG1sJReQ==} engines: {node: ^12.20.0 || ^14.13.0 || >=15.0.0, npm: '>=7.0.0'} + class-variance-authority@0.7.1: + resolution: {integrity: sha512-Ka+9Trutv7G8M6WT6SeiRWz792K5qEqIGEGzXKhAE6xOWAY6pPH8U+9IY3oCMv6kqTmLsv7Xh/2w2RigkePMsg==} + clean-regexp@1.0.0: resolution: {integrity: sha512-GfisEZEJvzKrmGWkvfhgzcz/BllN1USeqD2V6tg14OAOgaCD2Z/PUEuxnAZ/nPvmaHRG7a8y77p1T/IRQ4D1Hw==} engines: {node: '>=4'} @@ -4636,6 +4679,10 @@ packages: resolution: {integrity: sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==} engines: {node: '>=0.8'} + clsx@2.1.1: + resolution: {integrity: sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==} + engines: {node: '>=6'} + co@4.6.0: resolution: {integrity: sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==} engines: {iojs: '>= 1.0.0', node: '>= 0.12.0'} @@ -4656,9 +4703,17 @@ packages: color-name@1.1.4: resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} + color-name@2.0.0: + resolution: {integrity: sha512-SbtvAMWvASO5TE2QP07jHBMXKafgdZz8Vrsrn96fiL+O92/FN/PLARzUW5sKt013fjAprK2d2iCn2hk2Xb5oow==} + engines: {node: '>=12.20'} + color-string@1.9.1: resolution: {integrity: sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==} + color-string@2.0.1: + resolution: {integrity: sha512-5z9FbYTZPAo8iKsNEqRNv+OlpBbDcoE+SY9GjLfDUHEfcNNV7tS9eSAlFHEaub/r5tBL9LtskAeq1l9SaoZ5tQ==} + engines: {node: '>=18'} + color@4.2.3: resolution: {integrity: sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A==} engines: {node: '>=12.5.0'} @@ -5392,9 +5447,6 @@ packages: dom-serializer@2.0.0: resolution: {integrity: sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==} - dom-to-image-more@2.16.0: - resolution: {integrity: sha512-RyjtkaM/zVy90uJ20lT+/G7MwBZx6l/ePliq5CQOeAnPeew7aUGS6IqRWBkHpstU+POmhaKA8A9H9qf476gisQ==} - domelementtype@2.3.0: resolution: {integrity: sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==} @@ -5953,9 +6005,6 @@ packages: resolution: {integrity: sha512-/pqPFG+FdxWQj+/WSuzXSDaNzxgTLr/OrR1QuqfEZzDakpdYE70PwUxL7BPUa8hpjbvY1+qvCl8k+8Tq34xJgg==} engines: {node: '>=18'} - file-saver@2.0.5: - resolution: {integrity: sha512-P9bmyZ3h/PRG+Nzga+rbdI4OEpNDzAVyy74uVO9ATgzLK6VtAsYybF/+TOCvrc0MO793d6+42lLyZTw7/ArVzA==} - filelist@1.0.4: resolution: {integrity: sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==} @@ -6496,6 +6545,9 @@ packages: resolution: {integrity: sha512-bAH5jbK/F3T3Jls4I0SO1hmPR0dKU0a7+SY6n1yzRtG54FLO8d6w/nxLFX2Nb7dBu6cCWXPaAME6cYqFUMmuCA==} engines: {node: '>= 4'} + immer@10.1.1: + resolution: {integrity: sha512-s2MPrmjovJcoMaHtx6K11Ra7oD05NT97w1IC5zpMkT6Atjr7H8LjaDd81iIxUYpMKSRRNMJE703M1Fhr/TctHw==} + import-fresh@3.3.1: resolution: {integrity: sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==} engines: {node: '>=6'} @@ -7028,6 +7080,18 @@ packages: joi@17.13.3: resolution: {integrity: sha512-otDA4ldcIx+ZXsKHWmp0YizCweVRZG96J10b0FevjfuncLO1oX59THoAmHkNubYJ+9gWsYsp5k8v4ib6oDv1fA==} + jotai@2.12.5: + resolution: {integrity: sha512-G8m32HW3lSmcz/4mbqx0hgJIQ0ekndKWiYP7kWVKi0p6saLXdSoye+FZiOFyonnd7Q482LCzm8sMDl7Ar1NWDw==} + engines: {node: '>=12.20.0'} + peerDependencies: + '@types/react': '>=17.0.0' + react: '>=17.0.0' + peerDependenciesMeta: + '@types/react': + optional: true + react: + optional: true + jpeg-js@0.4.4: resolution: {integrity: sha512-WZzeDOEtTOBK4Mdsar0IqEU5sMr3vSV2RqkAIzUEV2BHnUfKGyswWFPFwK5EeDo93K3FohSHbLAjj0s1Wzd+dg==} @@ -8004,6 +8068,9 @@ packages: pako@1.0.11: resolution: {integrity: sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==} + pako@2.1.0: + resolution: {integrity: sha512-w+eufiZ1WuJYgPXbV/PO3NCMEc3xqylkKHzp8bxp1uW4qaSNQUkwmLLEc3kKsfz8lpV1F8Ht3U1Cm+9Srog2ug==} + parent-module@1.0.1: resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} engines: {node: '>=6'} @@ -8154,10 +8221,6 @@ packages: resolution: {integrity: sha512-i85pKRCt4qMjZ1+L7sy2Ag4t1atFcdbEt76+7iRJn1g2BvsnRMGu9p8pivl9fs63M2kF/A0OacFZhTub+m/qMg==} hasBin: true - pirates@4.0.6: - resolution: {integrity: sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==} - engines: {node: '>= 6'} - pirates@4.0.7: resolution: {integrity: sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA==} engines: {node: '>= 6'} @@ -8380,6 +8443,10 @@ packages: quote-unquote@1.0.0: resolution: {integrity: sha512-twwRO/ilhlG/FIgYeKGFqyHhoEhqgnKVkcmqMKi2r524gz3ZbDTcyFt38E9xjJI2vT+KbRNHVbnJ/e0I25Azwg==} + radash@12.1.1: + resolution: {integrity: sha512-h36JMxKRqrAxVD8201FrCpyeNuUY9Y5zZwujr20fFO77tpUtGa6EZzfKw/3WaiBX95fq7+MpsuMLNdSnORAwSA==} + engines: {node: '>=14.18.0'} + railroad-diagrams@1.0.0: resolution: {integrity: sha512-cz93DjNeLY0idrCNOH6PviZGRN9GJhsdm9hpn1YCS879fj4W+x5IFJhhkRZcwVgMmFF7R82UA/7Oh+R8lLZg6A==} @@ -8408,9 +8475,18 @@ packages: resolution: {integrity: sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==} hasBin: true + react-dom@19.1.0: + resolution: {integrity: sha512-Xs1hdnE+DyKgeHJeJznQmYMIBG3TKIHJJT95Q58nHLSrElKlGQqDTR2HQ9fx5CN/Gk6Vh/kupBTDLU11/nDk/g==} + peerDependencies: + react: ^19.1.0 + react-is@18.3.1: resolution: {integrity: sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==} + react@19.1.0: + resolution: {integrity: sha512-FS+XFBNvn3GTAWq26joslQgWNoFu08F4kl0J4CgdNKADkdSGXQyTCnKteIAJy96Br6YbpEU1LSzV5dYtjMkMDg==} + engines: {node: '>=0.10.0'} + read-cache@1.0.0: resolution: {integrity: sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==} @@ -8695,6 +8771,9 @@ packages: resolution: {integrity: sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA==} engines: {node: '>=v12.22.7'} + scheduler@0.26.0: + resolution: {integrity: sha512-NlHwttCI/l5gCPR3D1nNXtWABUmBwvZpEQiD4IXSbIDq8BzLIK/7Ir5gTFSGZDUu37K5cMNp0hFtzO38sC7gWA==} + schema-utils@3.3.0: resolution: {integrity: sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==} engines: {node: '>= 10.13.0'} @@ -9169,6 +9248,9 @@ packages: tabbable@6.2.0: resolution: {integrity: sha512-Cat63mxsVJlzYvN51JmVXIgNoUokrIaT2zLclCXjRd8boZ0004U4KCs/sToJ75C6sdlByWxpYnb5Boif1VSFew==} + tailwind-merge@3.3.1: + resolution: {integrity: sha512-gBXpgUm/3rp1lMZZrM/w7D8GKqshif0zAymAhbCyIt8KMe+0v9DQ7cdYLR4FHH/cKpdTXb+A/tKKU3eolfsI+g==} + tailwindcss@3.4.17: resolution: {integrity: sha512-w33E2aCvSDP0tW9RZuNXadXlkHXqFzSkQew/aIa2i/Sj8fThxwovwlXHSPXTbAHwEIhBFXAedUhP2tueAKP8Og==} engines: {node: '>=14.0.0'} @@ -9370,9 +9452,6 @@ packages: ts-interface-checker@0.1.13: resolution: {integrity: sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==} - ts-toolbelt@6.15.5: - resolution: {integrity: sha512-FZIXf1ksVyLcfr7M317jbB67XFJhOO1YqdTcuGaq9q5jLUoTikukZ+98TPjKiP2jC5CgmYdWWYs0s2nLSU0/1A==} - tsconfig-paths@4.2.0: resolution: {integrity: sha512-NoZ4roiN7LnbKn9QqE1amc9DJfzvZXxF4xDavcOWt1BPkdx+m+0gJuPM+S0vCe7zTJMYUP0R8pO2XMr+Y8oLIg==} engines: {node: '>=6'} @@ -9628,6 +9707,11 @@ packages: uri-js@4.4.1: resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} + use-sync-external-store@1.5.0: + resolution: {integrity: sha512-Rb46I4cGGVBmjamjphe8L/UnvJD+uPPtTkNvX5mZgqdbavhI4EbgIWJiIHXJ8bc/i9EQGPRh4DwEURJ552Do0A==} + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + util-deprecate@1.0.2: resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} @@ -9915,17 +9999,6 @@ packages: vscode-uri@3.1.0: resolution: {integrity: sha512-/BpdSx+yCQGnCvecbyXdxHDkuk55/G3xwnC0GqY4gmQ3j+A+g8kzzgB4Nk/SINjqn6+waqw3EgbVF2QKExkRxQ==} - vue-demi@0.14.10: - resolution: {integrity: sha512-nMZBOwuzabUO0nLgIcc6rycZEebF6eeUfaiQx9+WSk8e29IbLvPU9feI6tqW4kTo3hvoYAJkMh8n8D0fuISphg==} - engines: {node: '>=12'} - hasBin: true - peerDependencies: - '@vue/composition-api': ^1.0.0-rc.1 - vue: ^3.0.0-0 || ^2.6.0 - peerDependenciesMeta: - '@vue/composition-api': - optional: true - vue-flow-layout@0.1.1: resolution: {integrity: sha512-JdgRRUVrN0Y2GosA0M68DEbKlXMqJ7FQgsK8CjQD2vxvNSqAU6PZEpi4cfcTVtfM2GVOMjHo7GKKLbXxOBqDqA==} peerDependencies: @@ -9939,11 +10012,6 @@ packages: typescript: optional: true - vuex@4.1.0: - resolution: {integrity: sha512-hmV6UerDrPcgbSy9ORAtNXDr9M4wlNP4pEFKye4ujJF8oqgFFuxDCdOLS3eNoRTtq5O3hoBDh9Doj1bQMYHRbQ==} - peerDependencies: - vue: ^3.2.0 - w3c-xmlserializer@5.0.0: resolution: {integrity: sha512-o8qghlI8NZHU1lLPrpi2+Uq7abh4GGPpYANlalzWxyWteJOCsr/P+oPBA49TOLu5FTZO4d3F9MnWJfiMo4BkmA==} engines: {node: '>=18'} @@ -10256,11 +10324,6 @@ packages: engines: {node: '>= 14'} hasBin: true - yaml@2.7.1: - resolution: {integrity: sha512-10ULxpnOCQXxJvBgxsn9ptjq6uviG/htZKk9veJGhlqn3w/DxQ631zFF+nlQXLwmImeS5amR2dl2U8sg6U9jsQ==} - engines: {node: '>= 14'} - hasBin: true - yaml@2.8.0: resolution: {integrity: sha512-4lLa/EcQCB0cJkyts+FpIRx5G/llPxfP6VQU5KByHEhLxY3IJCH0f0Hy1MHI8sClTvsIb8qwRJ6R/ZdlDJ/leQ==} engines: {node: '>= 14.6'} @@ -12989,26 +13052,41 @@ snapshots: dependencies: fast-deep-equal: 3.1.3 - '@floating-ui/core@1.6.9': + '@floating-ui/core@1.7.2': dependencies: - '@floating-ui/utils': 0.2.9 + '@floating-ui/utils': 0.2.10 - '@floating-ui/dom@1.6.13': + '@floating-ui/dom@1.7.2': dependencies: - '@floating-ui/core': 1.6.9 + '@floating-ui/core': 1.7.2 + '@floating-ui/utils': 0.2.10 + + '@floating-ui/react-dom@2.1.4(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': + dependencies: + '@floating-ui/dom': 1.7.2 + react: 19.1.0 + react-dom: 19.1.0(react@19.1.0) + + '@floating-ui/react@0.26.28(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': + dependencies: + '@floating-ui/react-dom': 2.1.4(react-dom@19.1.0(react@19.1.0))(react@19.1.0) '@floating-ui/utils': 0.2.9 + react: 19.1.0 + react-dom: 19.1.0(react@19.1.0) + tabbable: 6.2.0 + + '@floating-ui/react@0.27.14(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': + dependencies: + '@floating-ui/react-dom': 2.1.4(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@floating-ui/utils': 0.2.10 + react: 19.1.0 + react-dom: 19.1.0(react@19.1.0) + tabbable: 6.2.0 + + '@floating-ui/utils@0.2.10': {} '@floating-ui/utils@0.2.9': {} - '@floating-ui/vue@1.1.6(vue@3.5.13(typescript@5.7.3))': - dependencies: - '@floating-ui/dom': 1.6.13 - '@floating-ui/utils': 0.2.9 - vue-demi: 0.14.10(vue@3.5.13(typescript@5.7.3)) - transitivePeerDependencies: - - '@vue/composition-api' - - vue - '@gerrit0/mini-shiki@1.27.2': dependencies: '@shikijs/engine-oniguruma': 1.29.2 @@ -13021,25 +13099,20 @@ snapshots: dependencies: '@hapi/hoek': 9.3.0 - '@headlessui-float/vue@0.14.4(@headlessui/vue@1.7.23(vue@3.5.13(typescript@5.7.3)))(vue@3.5.13(typescript@5.7.3))': + '@headlessui/react@2.2.6(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': dependencies: - '@floating-ui/core': 1.6.9 - '@floating-ui/dom': 1.6.13 - '@floating-ui/vue': 1.1.6(vue@3.5.13(typescript@5.7.3)) - '@headlessui/vue': 1.7.23(vue@3.5.13(typescript@5.7.3)) - vue: 3.5.13(typescript@5.7.3) - transitivePeerDependencies: - - '@vue/composition-api' + '@floating-ui/react': 0.26.28(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@react-aria/focus': 3.21.0(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@react-aria/interactions': 3.25.4(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@tanstack/react-virtual': 3.13.12(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + react: 19.1.0 + react-dom: 19.1.0(react@19.1.0) + use-sync-external-store: 1.5.0(react@19.1.0) '@headlessui/tailwindcss@0.2.2(tailwindcss@3.4.17)': dependencies: tailwindcss: 3.4.17 - '@headlessui/vue@1.7.23(vue@3.5.13(typescript@5.7.3))': - dependencies: - '@tanstack/vue-virtual': 3.13.0(vue@3.5.13(typescript@5.7.3)) - vue: 3.5.13(typescript@5.7.3) - '@humanfs/core@0.19.1': {} '@humanfs/node@0.16.6': @@ -13453,6 +13526,55 @@ snapshots: '@polka/url@1.0.0-next.28': {} + '@react-aria/focus@3.21.0(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': + dependencies: + '@react-aria/interactions': 3.25.4(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@react-aria/utils': 3.30.0(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@react-types/shared': 3.31.0(react@19.1.0) + '@swc/helpers': 0.5.17 + clsx: 2.1.1 + react: 19.1.0 + react-dom: 19.1.0(react@19.1.0) + + '@react-aria/interactions@3.25.4(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': + dependencies: + '@react-aria/ssr': 3.9.10(react@19.1.0) + '@react-aria/utils': 3.30.0(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@react-stately/flags': 3.1.2 + '@react-types/shared': 3.31.0(react@19.1.0) + '@swc/helpers': 0.5.17 + react: 19.1.0 + react-dom: 19.1.0(react@19.1.0) + + '@react-aria/ssr@3.9.10(react@19.1.0)': + dependencies: + '@swc/helpers': 0.5.17 + react: 19.1.0 + + '@react-aria/utils@3.30.0(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': + dependencies: + '@react-aria/ssr': 3.9.10(react@19.1.0) + '@react-stately/flags': 3.1.2 + '@react-stately/utils': 3.10.8(react@19.1.0) + '@react-types/shared': 3.31.0(react@19.1.0) + '@swc/helpers': 0.5.17 + clsx: 2.1.1 + react: 19.1.0 + react-dom: 19.1.0(react@19.1.0) + + '@react-stately/flags@3.1.2': + dependencies: + '@swc/helpers': 0.5.17 + + '@react-stately/utils@3.10.8(react@19.1.0)': + dependencies: + '@swc/helpers': 0.5.17 + react: 19.1.0 + + '@react-types/shared@3.31.0(react@19.1.0)': + dependencies: + react: 19.1.0 + '@rolldown/pluginutils@1.0.0-beta.19': {} '@rollup/plugin-babel@5.3.1(@babel/core@7.28.0)(@types/babel__core@7.20.5)(rollup@2.79.2)': @@ -13718,16 +13840,21 @@ snapshots: magic-string: 0.25.9 string.prototype.matchall: 4.0.12 + '@swc/helpers@0.5.17': + dependencies: + tslib: 2.8.1 + '@szmarczak/http-timer@4.0.6': dependencies: defer-to-connect: 2.0.1 - '@tanstack/virtual-core@3.13.0': {} - - '@tanstack/vue-virtual@3.13.0(vue@3.5.13(typescript@5.7.3))': + '@tanstack/react-virtual@3.13.12(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': dependencies: - '@tanstack/virtual-core': 3.13.0 - vue: 3.5.13(typescript@5.7.3) + '@tanstack/virtual-core': 3.13.12 + react: 19.1.0 + react-dom: 19.1.0(react@19.1.0) + + '@tanstack/virtual-core@3.13.12': {} '@tootallnate/once@2.0.0': {} @@ -13736,8 +13863,6 @@ snapshots: tslib: 2.8.1 optional: true - '@types/assert@1.5.11': {} - '@types/babel__core@7.20.5': dependencies: '@babel/parser': 7.27.2 @@ -14064,10 +14189,6 @@ snapshots: '@types/qs@6.9.16': {} - '@types/ramda@0.28.25': - dependencies: - ts-toolbelt: 6.15.5 - '@types/range-parser@1.2.7': {} '@types/resolve@1.20.2': {} @@ -14587,13 +14708,6 @@ snapshots: loupe: 3.1.3 tinyrainbow: 2.0.0 - '@vue/compat@3.5.13(vue@3.5.13(typescript@5.7.3))': - dependencies: - '@babel/parser': 7.27.2 - estree-walker: 2.0.2 - source-map-js: 1.2.1 - vue: 3.5.13(typescript@5.7.3) - '@vue/compiler-core@3.5.13': dependencies: '@babel/parser': 7.27.2 @@ -14624,8 +14738,6 @@ snapshots: '@vue/compiler-dom': 3.5.13 '@vue/shared': 3.5.13 - '@vue/devtools-api@6.6.4': {} - '@vue/devtools-api@7.7.2': dependencies: '@vue/devtools-kit': 7.7.2 @@ -14842,33 +14954,32 @@ snapshots: '@xtuc/long@4.2.2': {} - '@zenuml/core@3.31.1(typescript@5.7.3)': + '@zenuml/core@3.35.2': dependencies: - '@headlessui-float/vue': 0.14.4(@headlessui/vue@1.7.23(vue@3.5.13(typescript@5.7.3)))(vue@3.5.13(typescript@5.7.3)) + '@floating-ui/react': 0.27.14(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@headlessui/react': 2.2.6(react-dom@19.1.0(react@19.1.0))(react@19.1.0) '@headlessui/tailwindcss': 0.2.2(tailwindcss@3.4.17) - '@headlessui/vue': 1.7.23(vue@3.5.13(typescript@5.7.3)) - '@types/assert': 1.5.11 - '@types/ramda': 0.28.25 - '@vue/compat': 3.5.13(vue@3.5.13(typescript@5.7.3)) antlr4: 4.11.0 - color-string: 1.9.1 - dom-to-image-more: 2.16.0 + class-variance-authority: 0.7.1 + clsx: 2.1.1 + color-string: 2.0.1 dompurify: 3.2.5 - file-saver: 2.0.5 highlight.js: 10.7.3 html-to-image: 1.11.13 - lodash: 4.17.21 + immer: 10.1.1 + jotai: 2.12.5(react@19.1.0) marked: 4.3.0 + pako: 2.1.0 pino: 8.21.0 - postcss: 8.5.3 + radash: 12.1.1 ramda: 0.28.0 + react: 19.1.0 + react-dom: 19.1.0(react@19.1.0) + tailwind-merge: 3.3.1 tailwindcss: 3.4.17 - vue: 3.5.13(typescript@5.7.3) - vuex: 4.1.0(vue@3.5.13(typescript@5.7.3)) transitivePeerDependencies: - - '@vue/composition-api' + - '@types/react' - ts-node - - typescript JSONSelect@0.4.0: {} @@ -15543,6 +15654,10 @@ snapshots: dependencies: ansi-colors: 4.1.3 + class-variance-authority@0.7.1: + dependencies: + clsx: 2.1.1 + clean-regexp@1.0.0: dependencies: escape-string-regexp: 1.0.5 @@ -15609,6 +15724,8 @@ snapshots: clone@1.0.4: optional: true + clsx@2.1.1: {} + co@4.6.0: {} collect-v8-coverage@1.0.2: {} @@ -15625,11 +15742,17 @@ snapshots: color-name@1.1.4: {} + color-name@2.0.0: {} + color-string@1.9.1: dependencies: color-name: 1.1.4 simple-swizzle: 0.2.2 + color-string@2.0.1: + dependencies: + color-name: 2.0.0 + color@4.2.3: dependencies: color-convert: 2.0.1 @@ -16498,8 +16621,6 @@ snapshots: domhandler: 5.0.3 entities: 4.5.0 - dom-to-image-more@2.16.0: {} - domelementtype@2.3.0: {} domhandler@5.0.3: @@ -17282,8 +17403,6 @@ snapshots: dependencies: flat-cache: 5.0.0 - file-saver@2.0.5: {} - filelist@1.0.4: dependencies: minimatch: 5.1.6 @@ -17934,6 +18053,8 @@ snapshots: ignore@7.0.3: {} + immer@10.1.1: {} + import-fresh@3.3.1: dependencies: parent-module: 1.0.1 @@ -18636,6 +18757,10 @@ snapshots: '@sideway/formula': 3.0.1 '@sideway/pinpoint': 2.0.0 + jotai@2.12.5(react@19.1.0): + optionalDependencies: + react: 19.1.0 + jpeg-js@0.4.4: {} js-base64@3.7.7: {} @@ -19812,6 +19937,8 @@ snapshots: pako@1.0.11: {} + pako@2.1.0: {} + parent-module@1.0.1: dependencies: callsites: 3.1.0 @@ -19956,8 +20083,6 @@ snapshots: sonic-boom: 4.2.0 thread-stream: 3.1.0 - pirates@4.0.6: {} - pirates@4.0.7: {} pixelmatch@5.3.0: @@ -20007,28 +20132,28 @@ snapshots: possible-typed-array-names@1.1.0: {} - postcss-import@15.1.0(postcss@8.5.3): + postcss-import@15.1.0(postcss@8.5.6): dependencies: - postcss: 8.5.3 + postcss: 8.5.6 postcss-value-parser: 4.2.0 read-cache: 1.0.0 resolve: 1.22.10 - postcss-js@4.0.1(postcss@8.5.3): + postcss-js@4.0.1(postcss@8.5.6): dependencies: camelcase-css: 2.0.1 - postcss: 8.5.3 + postcss: 8.5.6 - postcss-load-config@4.0.2(postcss@8.5.3): + postcss-load-config@4.0.2(postcss@8.5.6): dependencies: lilconfig: 3.1.3 - yaml: 2.7.1 + yaml: 2.8.0 optionalDependencies: - postcss: 8.5.3 + postcss: 8.5.6 - postcss-nested@6.2.0(postcss@8.5.3): + postcss-nested@6.2.0(postcss@8.5.6): dependencies: - postcss: 8.5.3 + postcss: 8.5.6 postcss-selector-parser: 6.1.2 postcss-selector-parser@6.1.2: @@ -20173,6 +20298,8 @@ snapshots: quote-unquote@1.0.0: {} + radash@12.1.1: {} + railroad-diagrams@1.0.0: {} ramda@0.28.0: {} @@ -20206,8 +20333,15 @@ snapshots: minimist: 1.2.8 strip-json-comments: 2.0.1 + react-dom@19.1.0(react@19.1.0): + dependencies: + react: 19.1.0 + scheduler: 0.26.0 + react-is@18.3.1: {} + react@19.1.0: {} + read-cache@1.0.0: dependencies: pify: 2.3.0 @@ -20576,6 +20710,8 @@ snapshots: dependencies: xmlchars: 2.2.0 + scheduler@0.26.0: {} + schema-utils@3.3.0: dependencies: '@types/json-schema': 7.0.15 @@ -21140,12 +21276,12 @@ snapshots: sucrase@3.35.0: dependencies: - '@jridgewell/gen-mapping': 0.3.8 + '@jridgewell/gen-mapping': 0.3.12 commander: 4.1.1 glob: 10.4.5 lines-and-columns: 1.2.4 mz: 2.7.0 - pirates: 4.0.6 + pirates: 4.0.7 ts-interface-checker: 0.1.13 superjson@2.2.2: @@ -21176,6 +21312,8 @@ snapshots: tabbable@6.2.0: {} + tailwind-merge@3.3.1: {} + tailwindcss@3.4.17: dependencies: '@alloc/quick-lru': 5.2.0 @@ -21192,11 +21330,11 @@ snapshots: normalize-path: 3.0.0 object-hash: 3.0.0 picocolors: 1.1.1 - postcss: 8.5.3 - postcss-import: 15.1.0(postcss@8.5.3) - postcss-js: 4.0.1(postcss@8.5.3) - postcss-load-config: 4.0.2(postcss@8.5.3) - postcss-nested: 6.2.0(postcss@8.5.3) + postcss: 8.5.6 + postcss-import: 15.1.0(postcss@8.5.6) + postcss-js: 4.0.1(postcss@8.5.6) + postcss-load-config: 4.0.2(postcss@8.5.6) + postcss-nested: 6.2.0(postcss@8.5.6) postcss-selector-parser: 6.1.2 resolve: 1.22.10 sucrase: 3.35.0 @@ -21395,8 +21533,6 @@ snapshots: ts-interface-checker@0.1.13: {} - ts-toolbelt@6.15.5: {} - tsconfig-paths@4.2.0: dependencies: json5: 2.2.3 @@ -21714,6 +21850,10 @@ snapshots: dependencies: punycode: 2.3.1 + use-sync-external-store@1.5.0(react@19.1.0): + dependencies: + react: 19.1.0 + util-deprecate@1.0.2: {} utils-merge@1.0.1: {} @@ -21973,10 +22113,6 @@ snapshots: vscode-uri@3.1.0: {} - vue-demi@0.14.10(vue@3.5.13(typescript@5.7.3)): - dependencies: - vue: 3.5.13(typescript@5.7.3) - vue-flow-layout@0.1.1(vue@3.5.13(typescript@5.7.3)): dependencies: vue: 3.5.13(typescript@5.7.3) @@ -21991,11 +22127,6 @@ snapshots: optionalDependencies: typescript: 5.7.3 - vuex@4.1.0(vue@3.5.13(typescript@5.7.3)): - dependencies: - '@vue/devtools-api': 6.6.4 - vue: 3.5.13(typescript@5.7.3) - w3c-xmlserializer@5.0.0: dependencies: xml-name-validator: 5.0.0 @@ -22475,8 +22606,6 @@ snapshots: yaml@2.7.0: {} - yaml@2.7.1: {} - yaml@2.8.0: {} yargs-parser@18.1.3: From 3ffe9618aebc9ac96de6e3c826481f542f18c2a9 Mon Sep 17 00:00:00 2001 From: MrCoder Date: Sun, 27 Jul 2025 21:05:49 +1000 Subject: [PATCH 077/143] chore: added changeset. --- .changeset/beige-peas-shave.md | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 .changeset/beige-peas-shave.md diff --git a/.changeset/beige-peas-shave.md b/.changeset/beige-peas-shave.md new file mode 100644 index 000000000..c405f3dcc --- /dev/null +++ b/.changeset/beige-peas-shave.md @@ -0,0 +1,5 @@ +--- +'@mermaid-js/mermaid-zenuml': patch +--- + +Fixed a critical bug that the ZenUML diagram is not rendered. From a9f7a94ae33257e58edb4a0a5632d81cff31b1b7 Mon Sep 17 00:00:00 2001 From: MrCoder Date: Sun, 27 Jul 2025 21:08:00 +1000 Subject: [PATCH 078/143] fix: remove TypeScript error suppression for ZenUml instantiation --- packages/mermaid-zenuml/src/zenumlRenderer.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/packages/mermaid-zenuml/src/zenumlRenderer.ts b/packages/mermaid-zenuml/src/zenumlRenderer.ts index f9dd57996..42ec8fcb4 100644 --- a/packages/mermaid-zenuml/src/zenumlRenderer.ts +++ b/packages/mermaid-zenuml/src/zenumlRenderer.ts @@ -53,7 +53,6 @@ export const draw = async function (text: string, id: string) { const { foreignObject, container, app } = createForeignObject(id); svgContainer.appendChild(foreignObject); - // @ts-expect-error @zenuml/core@3.0.0 exports the wrong type for ZenUml const zenuml = new ZenUml(app); // default is a theme name. More themes to be added and will be configurable in the future await zenuml.render(text, { theme: 'default', mode: 'static' }); From 6180c5f2ff852161711531f9e3a9fdead9779036 Mon Sep 17 00:00:00 2001 From: MrCoder Date: Sun, 27 Jul 2025 21:11:40 +1000 Subject: [PATCH 079/143] chore: add TypeScript declaration for ZenUml module --- packages/mermaid-zenuml/src/zenuml.d.ts | 11 +++++++++++ 1 file changed, 11 insertions(+) create mode 100644 packages/mermaid-zenuml/src/zenuml.d.ts diff --git a/packages/mermaid-zenuml/src/zenuml.d.ts b/packages/mermaid-zenuml/src/zenuml.d.ts new file mode 100644 index 000000000..eac411bd2 --- /dev/null +++ b/packages/mermaid-zenuml/src/zenuml.d.ts @@ -0,0 +1,11 @@ +declare module '@zenuml/core' { + interface RenderOptions { + theme?: string; + mode?: string; + } + + export default class ZenUml { + constructor(container: Element); + render(text: string, options?: RenderOptions): Promise; + } +} From 724197c9105869679a88940428bdbb64486cf9ec Mon Sep 17 00:00:00 2001 From: MrCoder Date: Sun, 27 Jul 2025 21:25:46 +1000 Subject: [PATCH 080/143] chore: add missing newline at end of README.md --- packages/mermaid-zenuml/README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/packages/mermaid-zenuml/README.md b/packages/mermaid-zenuml/README.md index 7de0971a6..b26295807 100644 --- a/packages/mermaid-zenuml/README.md +++ b/packages/mermaid-zenuml/README.md @@ -104,6 +104,7 @@ zenuml ``` Available annotators include: + - `@Actor` - Human figure - `@Database` - Database symbol - `@Boundary` - Boundary symbol @@ -380,4 +381,4 @@ MIT - [ZenUML Official Website](https://zenuml.com) - [Mermaid Documentation](https://mermaid.js.org) -- [GitHub Repository](https://github.com/mermaid-js/mermaid) \ No newline at end of file +- [GitHub Repository](https://github.com/mermaid-js/mermaid) From 3d640fc620ddce56768b8056c0480af8f0d57198 Mon Sep 17 00:00:00 2001 From: Sidharth Vinod Date: Tue, 29 Jul 2025 11:30:11 +0530 Subject: [PATCH 081/143] fix: Casing of ID to match https://www.britannica.com/dictionary/ID --- .../rendering-util/rendering-elements/shapes/requirementBox.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/mermaid/src/rendering-util/rendering-elements/shapes/requirementBox.ts b/packages/mermaid/src/rendering-util/rendering-elements/shapes/requirementBox.ts index eb50d09bd..ed764f5ee 100644 --- a/packages/mermaid/src/rendering-util/rendering-elements/shapes/requirementBox.ts +++ b/packages/mermaid/src/rendering-util/rendering-elements/shapes/requirementBox.ts @@ -54,7 +54,7 @@ export async function requirementBox( if (isRequirementNode) { const idHeight = await addText( shapeSvg, - `${requirementNode.requirementId ? `id: ${requirementNode.requirementId}` : ''}`, + `${requirementNode.requirementId ? `ID: ${requirementNode.requirementId}` : ''}`, accumulativeHeight, node.labelStyle ); From 01aaef39b4a1ec8bc5a0c6bfa3a20b712d67f4dc Mon Sep 17 00:00:00 2001 From: Sidharth Vinod Date: Tue, 29 Jul 2025 11:31:28 +0530 Subject: [PATCH 082/143] docs: Add changeset --- .changeset/large-mirrors-cheer.md | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 .changeset/large-mirrors-cheer.md diff --git a/.changeset/large-mirrors-cheer.md b/.changeset/large-mirrors-cheer.md new file mode 100644 index 000000000..4e3903039 --- /dev/null +++ b/.changeset/large-mirrors-cheer.md @@ -0,0 +1,5 @@ +--- +'mermaid': patch +--- + +fix: Update casing of ID in requirement diagram From e073c80019982407bff45f3d5f68a78c0a0a4afa Mon Sep 17 00:00:00 2001 From: Alois Klink Date: Tue, 29 Jul 2025 15:27:10 +0900 Subject: [PATCH 083/143] test(e2e): test block column overflowing Add a test-case for 939da082b (Fix 6633, 2025-06-28), that checks whether overflowing blocks render correctly. --- cypress/integration/rendering/block.spec.js | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/cypress/integration/rendering/block.spec.js b/cypress/integration/rendering/block.spec.js index 589a30fde..f01d59375 100644 --- a/cypress/integration/rendering/block.spec.js +++ b/cypress/integration/rendering/block.spec.js @@ -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 +`, + {} + ); + }); }); From 8bb29fc879329ad109898e4025b4f4eba2ab0649 Mon Sep 17 00:00:00 2001 From: Alois Klink Date: Tue, 29 Jul 2025 15:31:58 +0900 Subject: [PATCH 084/143] docs(block): add changeset for overflow bug Add a changeset that explains that overflowing blocks no longer create an empty line in block diagrams or cause bugs in later lines. Technically, this is a breaking change since it can change the layout of block diagrams, but this diagram is still in `-beta` and they all will still render correctly. --- .changeset/lovely-queens-own.md | 8 ++++++++ 1 file changed, 8 insertions(+) create mode 100644 .changeset/lovely-queens-own.md diff --git a/.changeset/lovely-queens-own.md b/.changeset/lovely-queens-own.md new file mode 100644 index 000000000..edc8dda2d --- /dev/null +++ b/.changeset/lovely-queens-own.md @@ -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). From b7a591b8d3ddb0867036ea87b5d7bd4523ff047f Mon Sep 17 00:00:00 2001 From: Alois Klink Date: Tue, 29 Jul 2025 15:45:06 +0900 Subject: [PATCH 085/143] docs(block): add clarifying comment for overflow This line is a bit confusing to me, so I thought I should clarify it! See: 939da082b2f5d09fd9b8997114aafa53f597a3a7 --- packages/mermaid/src/diagrams/block/layout.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/mermaid/src/diagrams/block/layout.ts b/packages/mermaid/src/diagrams/block/layout.ts index 9daf0b4c1..ea0de6312 100644 --- a/packages/mermaid/src/diagrams/block/layout.ts +++ b/packages/mermaid/src/diagrams/block/layout.ts @@ -272,6 +272,7 @@ function layoutBlocks(block: Block, db: BlockDB) { } let columnsFilled = child?.widthInColumns ?? 1; if (columns > 0) { + // Make sure overflowing lines do not affect later lines columnsFilled = Math.min(columnsFilled, columns - (columnPos % columns)); } columnPos += columnsFilled; From c36cd05c45ac3090181152b4dae41f8d7b569bd6 Mon Sep 17 00:00:00 2001 From: shubham-mermaid Date: Tue, 29 Jul 2025 13:10:10 +0530 Subject: [PATCH 086/143] Create light-flowers-judge.md --- .changeset/light-flowers-judge.md | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 .changeset/light-flowers-judge.md diff --git a/.changeset/light-flowers-judge.md b/.changeset/light-flowers-judge.md new file mode 100644 index 000000000..0fd27ef1c --- /dev/null +++ b/.changeset/light-flowers-judge.md @@ -0,0 +1,5 @@ +--- +"mermaid": patch +--- + +fix: Make flowchart elk detector regex match less greedy From 1be16200002f72592961c95d1773e7c2e4178838 Mon Sep 17 00:00:00 2001 From: "autofix-ci[bot]" <114827586+autofix-ci[bot]@users.noreply.github.com> Date: Tue, 29 Jul 2025 07:45:04 +0000 Subject: [PATCH 087/143] [autofix.ci] apply automated fixes --- .changeset/light-flowers-judge.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.changeset/light-flowers-judge.md b/.changeset/light-flowers-judge.md index 0fd27ef1c..6378a9b0a 100644 --- a/.changeset/light-flowers-judge.md +++ b/.changeset/light-flowers-judge.md @@ -1,5 +1,5 @@ --- -"mermaid": patch +'mermaid': patch --- fix: Make flowchart elk detector regex match less greedy From 694844050a9e68d5fbed33d34b3595a58dab2aa9 Mon Sep 17 00:00:00 2001 From: Prashant-7718 Date: Tue, 29 Jul 2025 13:34:18 +0530 Subject: [PATCH 088/143] removed changeset --- .changeset/dirty-heads-travel.md | 5 ----- 1 file changed, 5 deletions(-) delete mode 100644 .changeset/dirty-heads-travel.md diff --git a/.changeset/dirty-heads-travel.md b/.changeset/dirty-heads-travel.md deleted file mode 100644 index 0f253239e..000000000 --- a/.changeset/dirty-heads-travel.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'mermaid': minor ---- - -chore: Mermaid diagrams for flowchart mindmap and mermaidAPI From a476e99d4c4ba959cb956701ebe14ee1f798d7f2 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Tue, 29 Jul 2025 08:41:36 +0000 Subject: [PATCH 089/143] chore(deps): update eslint --- package.json | 6 ++--- pnpm-lock.yaml | 72 ++++---------------------------------------------- 2 files changed, 8 insertions(+), 70 deletions(-) diff --git a/package.json b/package.json index c407d1158..ddd0446ed 100644 --- a/package.json +++ b/package.json @@ -97,8 +97,8 @@ "eslint-config-prettier": "^10.1.8", "eslint-plugin-cypress": "^4.3.0", "eslint-plugin-html": "^8.1.3", - "eslint-plugin-jest": "^28.11.2", - "eslint-plugin-jsdoc": "^50.6.17", + "eslint-plugin-jest": "^28.14.0", + "eslint-plugin-jsdoc": "^50.8.0", "eslint-plugin-json": "^4.0.1", "eslint-plugin-lodash": "^8.0.0", "eslint-plugin-markdown": "^5.1.0", @@ -126,7 +126,7 @@ "tslib": "^2.8.1", "tsx": "^4.7.3", "typescript": "~5.7.3", - "typescript-eslint": "^8.32.1", + "typescript-eslint": "^8.38.0", "vite": "^7.0.3", "vite-plugin-istanbul": "^7.0.0", "vitest": "^3.0.6" diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 85424c1be..94ba0faac 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -116,10 +116,10 @@ importers: specifier: ^8.1.3 version: 8.1.3 eslint-plugin-jest: - specifier: ^28.11.2 + specifier: ^28.14.0 version: 28.14.0(@typescript-eslint/eslint-plugin@8.38.0(@typescript-eslint/parser@8.38.0(eslint@9.26.0(jiti@2.4.2))(typescript@5.7.3))(eslint@9.26.0(jiti@2.4.2))(typescript@5.7.3))(eslint@9.26.0(jiti@2.4.2))(jest@30.0.4(@types/node@22.13.5))(typescript@5.7.3) eslint-plugin-jsdoc: - specifier: ^50.6.17 + specifier: ^50.8.0 version: 50.8.0(eslint@9.26.0(jiti@2.4.2)) eslint-plugin-json: specifier: ^4.0.1 @@ -203,7 +203,7 @@ importers: specifier: ~5.7.3 version: 5.7.3 typescript-eslint: - specifier: ^8.32.1 + specifier: ^8.38.0 version: 8.38.0(eslint@9.26.0(jiti@2.4.2))(typescript@5.7.3) vite: specifier: ^7.0.3 @@ -3432,10 +3432,6 @@ packages: peerDependencies: typescript: '>=4.8.4 <5.9.0' - '@typescript-eslint/scope-manager@8.32.0': - resolution: {integrity: sha512-jc/4IxGNedXkmG4mx4nJTILb6TMjL66D41vyeaPWvDUmeYQzF3lKtN15WsAeTr65ce4mPxwopPSo1yUUAWw0hQ==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/scope-manager@8.38.0': resolution: {integrity: sha512-WJw3AVlFFcdT9Ri1xs/lg8LwDqgekWXWhH3iAF+1ZM+QPd7oxQ6jvtW/JPwzAScxitILUIFs0/AnQ/UWHzbATQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} @@ -3457,10 +3453,6 @@ packages: resolution: {integrity: sha512-iZqi+Ds1y4EDYUtlOOC+aUmxnE9xS/yCigkjA7XpTKV6nCBd3Hp/PRGGmdwnfkV2ThMyYldP1wRpm/id99spTQ==} engines: {node: ^18.18.0 || >=20.0.0} - '@typescript-eslint/types@8.32.0': - resolution: {integrity: sha512-O5Id6tGadAZEMThM6L9HmVf5hQUXNSxLVKeGJYWNhhVseps/0LddMkp7//VDkzwJ69lPL0UmZdcZwggj9akJaA==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/types@8.38.0': resolution: {integrity: sha512-wzkUfX3plUqij4YwWaJyqhiPE5UCRVlFpKn1oCRn2O1bJ592XxWJj8ROQ3JD5MYXLORW84063z3tZTb/cs4Tyw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} @@ -3474,25 +3466,12 @@ packages: typescript: optional: true - '@typescript-eslint/typescript-estree@8.32.0': - resolution: {integrity: sha512-pU9VD7anSCOIoBFnhTGfOzlVFQIA1XXiQpH/CezqOBaDppRwTglJzCC6fUQGpfwey4T183NKhF1/mfatYmjRqQ==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - peerDependencies: - typescript: '>=4.8.4 <5.9.0' - '@typescript-eslint/typescript-estree@8.38.0': resolution: {integrity: sha512-fooELKcAKzxux6fA6pxOflpNS0jc+nOQEEOipXFNjSlBS6fqrJOVY/whSn70SScHrcJ2LDsxWrneFoWYSVfqhQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '>=4.8.4 <5.9.0' - '@typescript-eslint/utils@8.32.0': - resolution: {integrity: sha512-8S9hXau6nQ/sYVtC3D6ISIDoJzS1NsCK+gluVhLN2YkBPX+/1wkwyUiDKnxRh15579WoOIyVWnoyIf3yGI9REw==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - peerDependencies: - eslint: ^8.57.0 || ^9.0.0 - typescript: '>=4.8.4 <5.9.0' - '@typescript-eslint/utils@8.38.0': resolution: {integrity: sha512-hHcMA86Hgt+ijJlrD8fX0j1j8w4C92zue/8LOPAFioIno+W0+L7KqE8QZKCcPGc/92Vs9x36w/4MPTJhqXdyvg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} @@ -3504,10 +3483,6 @@ packages: resolution: {integrity: sha512-cDF0/Gf81QpY3xYyJKDV14Zwdmid5+uuENhjH2EqFaF0ni+yAyq/LzMaIJdhNJXZI7uLzwIlA+V7oWoyn6Curg==} engines: {node: ^18.18.0 || >=20.0.0} - '@typescript-eslint/visitor-keys@8.32.0': - resolution: {integrity: sha512-1rYQTCLFFzOI5Nl0c8LUpJT8HxpwVRn9E4CkMsYfuN6ctmQqExjSTzzSk0Tz2apmXy7WU6/6fyaZVVA/thPN+w==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/visitor-keys@8.38.0': resolution: {integrity: sha512-pWrTcoFNWuwHlA9CvlfSsGWs14JxfN1TH25zM5L7o0pRLhsoZkDnTsXfQRJBEWJoV5DL0jf+Z+sxiud+K0mq1g==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} @@ -12698,7 +12673,7 @@ snapshots: '@es-joy/jsdoccomment@0.50.2': dependencies: '@types/estree': 1.0.7 - '@typescript-eslint/types': 8.32.0 + '@typescript-eslint/types': 8.38.0 comment-parser: 1.4.1 esquery: 1.6.0 jsdoc-type-pratt-parser: 4.1.0 @@ -14183,11 +14158,6 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/scope-manager@8.32.0': - dependencies: - '@typescript-eslint/types': 8.32.0 - '@typescript-eslint/visitor-keys': 8.32.0 - '@typescript-eslint/scope-manager@8.38.0': dependencies: '@typescript-eslint/types': 8.38.0 @@ -14211,8 +14181,6 @@ snapshots: '@typescript-eslint/types@7.18.0': {} - '@typescript-eslint/types@8.32.0': {} - '@typescript-eslint/types@8.38.0': {} '@typescript-eslint/typescript-estree@7.18.0(typescript@5.7.3)': @@ -14230,20 +14198,6 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/typescript-estree@8.32.0(typescript@5.7.3)': - dependencies: - '@typescript-eslint/types': 8.32.0 - '@typescript-eslint/visitor-keys': 8.32.0 - debug: 4.4.1(supports-color@8.1.1) - fast-glob: 3.3.3 - is-glob: 4.0.3 - minimatch: 9.0.5 - semver: 7.7.2 - ts-api-utils: 2.1.0(typescript@5.7.3) - typescript: 5.7.3 - transitivePeerDependencies: - - supports-color - '@typescript-eslint/typescript-estree@8.38.0(typescript@5.7.3)': dependencies: '@typescript-eslint/project-service': 8.38.0(typescript@5.7.3) @@ -14260,17 +14214,6 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/utils@8.32.0(eslint@9.26.0(jiti@2.4.2))(typescript@5.7.3)': - dependencies: - '@eslint-community/eslint-utils': 4.7.0(eslint@9.26.0(jiti@2.4.2)) - '@typescript-eslint/scope-manager': 8.32.0 - '@typescript-eslint/types': 8.32.0 - '@typescript-eslint/typescript-estree': 8.32.0(typescript@5.7.3) - eslint: 9.26.0(jiti@2.4.2) - typescript: 5.7.3 - transitivePeerDependencies: - - supports-color - '@typescript-eslint/utils@8.38.0(eslint@9.26.0(jiti@2.4.2))(typescript@5.7.3)': dependencies: '@eslint-community/eslint-utils': 4.7.0(eslint@9.26.0(jiti@2.4.2)) @@ -14287,11 +14230,6 @@ snapshots: '@typescript-eslint/types': 7.18.0 eslint-visitor-keys: 3.4.3 - '@typescript-eslint/visitor-keys@8.32.0': - dependencies: - '@typescript-eslint/types': 8.32.0 - eslint-visitor-keys: 4.2.0 - '@typescript-eslint/visitor-keys@8.38.0': dependencies: '@typescript-eslint/types': 8.38.0 @@ -16819,7 +16757,7 @@ snapshots: eslint-plugin-jest@28.14.0(@typescript-eslint/eslint-plugin@8.38.0(@typescript-eslint/parser@8.38.0(eslint@9.26.0(jiti@2.4.2))(typescript@5.7.3))(eslint@9.26.0(jiti@2.4.2))(typescript@5.7.3))(eslint@9.26.0(jiti@2.4.2))(jest@30.0.4(@types/node@22.13.5))(typescript@5.7.3): dependencies: - '@typescript-eslint/utils': 8.32.0(eslint@9.26.0(jiti@2.4.2))(typescript@5.7.3) + '@typescript-eslint/utils': 8.38.0(eslint@9.26.0(jiti@2.4.2))(typescript@5.7.3) eslint: 9.26.0(jiti@2.4.2) optionalDependencies: '@typescript-eslint/eslint-plugin': 8.38.0(@typescript-eslint/parser@8.38.0(eslint@9.26.0(jiti@2.4.2))(typescript@5.7.3))(eslint@9.26.0(jiti@2.4.2))(typescript@5.7.3) From 1a4b8662cfaff30c3dcb13694589182626492f3a Mon Sep 17 00:00:00 2001 From: omkarht Date: Tue, 29 Jul 2025 15:21:34 +0530 Subject: [PATCH 090/143] 6774: update architecture diagram to reflect new class-based DB structure on-behalf-of: @Mermaid-Chart --- .../architecture/architecture.spec.ts | 29 +- .../diagrams/architecture/architectureDb.ts | 582 +++++++++--------- .../architecture/architectureDiagram.ts | 6 +- .../architecture/architectureParser.ts | 21 +- .../architecture/architectureRenderer.ts | 44 +- .../src/diagrams/architecture/svgDraw.ts | 31 +- 6 files changed, 364 insertions(+), 349 deletions(-) diff --git a/packages/mermaid/src/diagrams/architecture/architecture.spec.ts b/packages/mermaid/src/diagrams/architecture/architecture.spec.ts index d0405d025..49cc18a07 100644 --- a/packages/mermaid/src/diagrams/architecture/architecture.spec.ts +++ b/packages/mermaid/src/diagrams/architecture/architecture.spec.ts @@ -1,21 +1,12 @@ import { it, describe, expect } from 'vitest'; -import { db } from './architectureDb.js'; import { parser } from './architectureParser.js'; - -const { - clear, - getDiagramTitle, - getAccTitle, - getAccDescription, - getServices, - getGroups, - getEdges, - getJunctions, -} = db; - +import { ArchitectureDB } from './architectureDb.js'; describe('architecture diagrams', () => { + let db: ArchitectureDB; beforeEach(() => { - clear(); + db = new ArchitectureDB(); + // @ts-expect-error since type is set to undefined we will have error + parser.parser?.yy = db; }); describe('architecture diagram definitions', () => { @@ -36,7 +27,7 @@ describe('architecture diagrams', () => { it('should handle title on the first line', async () => { const str = `architecture-beta title Simple Architecture Diagram`; await expect(parser.parse(str)).resolves.not.toThrow(); - expect(getDiagramTitle()).toBe('Simple Architecture Diagram'); + expect(db.getDiagramTitle()).toBe('Simple Architecture Diagram'); }); it('should handle title on another line', async () => { @@ -44,7 +35,7 @@ describe('architecture diagrams', () => { title Simple Architecture Diagram `; await expect(parser.parse(str)).resolves.not.toThrow(); - expect(getDiagramTitle()).toBe('Simple Architecture Diagram'); + expect(db.getDiagramTitle()).toBe('Simple Architecture Diagram'); }); it('should handle accessibility title and description', async () => { @@ -53,8 +44,8 @@ describe('architecture diagrams', () => { accDescr: Accessibility Description `; await expect(parser.parse(str)).resolves.not.toThrow(); - expect(getAccTitle()).toBe('Accessibility Title'); - expect(getAccDescription()).toBe('Accessibility Description'); + expect(db.getAccTitle()).toBe('Accessibility Title'); + expect(db.getAccDescription()).toBe('Accessibility Description'); }); it('should handle multiline accessibility description', async () => { @@ -64,7 +55,7 @@ describe('architecture diagrams', () => { } `; await expect(parser.parse(str)).resolves.not.toThrow(); - expect(getAccDescription()).toBe('Accessibility Description'); + expect(db.getAccDescription()).toBe('Accessibility Description'); }); }); }); diff --git a/packages/mermaid/src/diagrams/architecture/architectureDb.ts b/packages/mermaid/src/diagrams/architecture/architectureDb.ts index c7bd64e21..5d90bd8a6 100644 --- a/packages/mermaid/src/diagrams/architecture/architectureDb.ts +++ b/packages/mermaid/src/diagrams/architecture/architectureDb.ts @@ -1,8 +1,9 @@ +import { getConfig as commonGetConfig } from '../../config.js'; import type { ArchitectureDiagramConfig } from '../../config.type.js'; import DEFAULT_CONFIG from '../../defaultConfig.js'; -import { getConfig as commonGetConfig } from '../../config.js'; +import type { DiagramDB } from '../../diagram-api/types.js'; import type { D3Element } from '../../types.js'; -import { ImperativeState } from '../../utils/imperativeState.js'; +import { cleanAndMerge } from '../../utils.js'; import { clear as commonClear, getAccDescription, @@ -14,7 +15,6 @@ import { } from '../common/commonDb.js'; import type { ArchitectureAlignment, - ArchitectureDB, ArchitectureDirectionPair, ArchitectureDirectionPairMap, ArchitectureEdge, @@ -33,330 +33,334 @@ import { isArchitectureService, shiftPositionByArchitectureDirectionPair, } from './architectureTypes.js'; -import { cleanAndMerge } from '../../utils.js'; const DEFAULT_ARCHITECTURE_CONFIG: Required = DEFAULT_CONFIG.architecture; +export class ArchitectureDB implements DiagramDB { + private nodes: Record = {}; + private groups: Record = {}; + private edges: ArchitectureEdge[] = []; + private registeredIds: Record = {}; + // private config: Required = DEFAULT_ARCHITECTURE_CONFIG; + private dataStructures?: ArchitectureState['dataStructures']; + private elements: Record = {}; -const state = new ImperativeState(() => ({ - nodes: {}, - groups: {}, - edges: [], - registeredIds: {}, - config: DEFAULT_ARCHITECTURE_CONFIG, - dataStructures: undefined, - elements: {}, -})); - -const clear = (): void => { - state.reset(); - commonClear(); -}; - -const addService = function ({ - id, - icon, - in: parent, - title, - iconText, -}: Omit) { - if (state.records.registeredIds[id] !== undefined) { - throw new Error( - `The service id [${id}] is already in use by another ${state.records.registeredIds[id]}` - ); - } - if (parent !== undefined) { - if (id === parent) { - throw new Error(`The service [${id}] cannot be placed within itself`); - } - if (state.records.registeredIds[parent] === undefined) { - throw new Error( - `The service [${id}]'s parent does not exist. Please make sure the parent is created before this service` - ); - } - if (state.records.registeredIds[parent] === 'node') { - throw new Error(`The service [${id}]'s parent is not a group`); - } + constructor() { + this.clear(); } - state.records.registeredIds[id] = 'node'; + public clear(): void { + this.nodes = {}; + this.groups = {}; + this.edges = []; + this.registeredIds = {}; + this.dataStructures = undefined; + this.elements = {}; + commonClear(); + } - state.records.nodes[id] = { + public addService({ id, - type: 'service', icon, + in: parent, + title, iconText, - title, - edges: [], - in: parent, - }; -}; - -const getServices = (): ArchitectureService[] => - Object.values(state.records.nodes).filter(isArchitectureService); - -const addJunction = function ({ id, in: parent }: Omit) { - state.records.registeredIds[id] = 'node'; - - state.records.nodes[id] = { - id, - type: 'junction', - edges: [], - in: parent, - }; -}; - -const getJunctions = (): ArchitectureJunction[] => - Object.values(state.records.nodes).filter(isArchitectureJunction); - -const getNodes = (): ArchitectureNode[] => Object.values(state.records.nodes); - -const getNode = (id: string): ArchitectureNode | null => state.records.nodes[id]; - -const addGroup = function ({ id, icon, in: parent, title }: ArchitectureGroup) { - if (state.records.registeredIds[id] !== undefined) { - throw new Error( - `The group id [${id}] is already in use by another ${state.records.registeredIds[id]}` - ); - } - if (parent !== undefined) { - if (id === parent) { - throw new Error(`The group [${id}] cannot be placed within itself`); - } - if (state.records.registeredIds[parent] === undefined) { + }: Omit): void { + if (this.registeredIds[id] !== undefined) { throw new Error( - `The group [${id}]'s parent does not exist. Please make sure the parent is created before this group` + `The service id [${id}] is already in use by another ${this.registeredIds[id]}` ); } - if (state.records.registeredIds[parent] === 'node') { - throw new Error(`The group [${id}]'s parent is not a group`); + if (parent !== undefined) { + if (id === parent) { + throw new Error(`The service [${id}] cannot be placed within itself`); + } + if (this.registeredIds[parent] === undefined) { + throw new Error( + `The service [${id}]'s parent does not exist. Please make sure the parent is created before this service` + ); + } + if (this.registeredIds[parent] === 'node') { + throw new Error(`The service [${id}]'s parent is not a group`); + } } + + this.registeredIds[id] = 'node'; + + this.nodes[id] = { + id, + type: 'service', + icon, + iconText, + title, + edges: [], + in: parent, + }; } - state.records.registeredIds[id] = 'group'; - - state.records.groups[id] = { - id, - icon, - title, - in: parent, - }; -}; -const getGroups = (): ArchitectureGroup[] => { - return Object.values(state.records.groups); -}; - -const addEdge = function ({ - lhsId, - rhsId, - lhsDir, - rhsDir, - lhsInto, - rhsInto, - lhsGroup, - rhsGroup, - title, -}: ArchitectureEdge) { - if (!isArchitectureDirection(lhsDir)) { - throw new Error( - `Invalid direction given for left hand side of edge ${lhsId}--${rhsId}. Expected (L,R,T,B) got ${lhsDir}` - ); - } - if (!isArchitectureDirection(rhsDir)) { - throw new Error( - `Invalid direction given for right hand side of edge ${lhsId}--${rhsId}. Expected (L,R,T,B) got ${rhsDir}` - ); + public getServices(): ArchitectureService[] { + return Object.values(this.nodes).filter(isArchitectureService); } - if (state.records.nodes[lhsId] === undefined && state.records.groups[lhsId] === undefined) { - throw new Error( - `The left-hand id [${lhsId}] does not yet exist. Please create the service/group before declaring an edge to it.` - ); - } - if (state.records.nodes[rhsId] === undefined && state.records.groups[lhsId] === undefined) { - throw new Error( - `The right-hand id [${rhsId}] does not yet exist. Please create the service/group before declaring an edge to it.` - ); + public addJunction({ id, in: parent }: Omit): void { + this.registeredIds[id] = 'node'; + + this.nodes[id] = { + id, + type: 'junction', + edges: [], + in: parent, + }; } - const lhsGroupId = state.records.nodes[lhsId].in; - const rhsGroupId = state.records.nodes[rhsId].in; - if (lhsGroup && lhsGroupId && rhsGroupId && lhsGroupId == rhsGroupId) { - throw new Error( - `The left-hand id [${lhsId}] is modified to traverse the group boundary, but the edge does not pass through two groups.` - ); - } - if (rhsGroup && lhsGroupId && rhsGroupId && lhsGroupId == rhsGroupId) { - throw new Error( - `The right-hand id [${rhsId}] is modified to traverse the group boundary, but the edge does not pass through two groups.` - ); + public getJunctions(): ArchitectureJunction[] { + return Object.values(this.nodes).filter(isArchitectureJunction); } - const edge = { + public getNodes(): ArchitectureNode[] { + return Object.values(this.nodes); + } + + public getNode(id: string): ArchitectureNode | null { + return this.nodes[id] ?? null; + } + + public addGroup({ id, icon, in: parent, title }: ArchitectureGroup): void { + if (this.registeredIds?.[id] !== undefined) { + throw new Error( + `The group id [${id}] is already in use by another ${this.registeredIds[id]}` + ); + } + if (parent !== undefined) { + if (id === parent) { + throw new Error(`The group [${id}] cannot be placed within itself`); + } + if (this.registeredIds?.[parent] === undefined) { + throw new Error( + `The group [${id}]'s parent does not exist. Please make sure the parent is created before this group` + ); + } + if (this.registeredIds?.[parent] === 'node') { + throw new Error(`The group [${id}]'s parent is not a group`); + } + } + + this.registeredIds[id] = 'group'; + + this.groups[id] = { + id, + icon, + title, + in: parent, + }; + } + public getGroups(): ArchitectureGroup[] { + return Object.values(this.groups); + } + public addEdge({ lhsId, - lhsDir, - lhsInto, - lhsGroup, rhsId, + lhsDir, rhsDir, + lhsInto, rhsInto, + lhsGroup, rhsGroup, title, - }; - - state.records.edges.push(edge); - if (state.records.nodes[lhsId] && state.records.nodes[rhsId]) { - state.records.nodes[lhsId].edges.push(state.records.edges[state.records.edges.length - 1]); - state.records.nodes[rhsId].edges.push(state.records.edges[state.records.edges.length - 1]); - } -}; - -const getEdges = (): ArchitectureEdge[] => state.records.edges; - -/** - * Returns the current diagram's adjacency list, spatial map, & group alignments. - * If they have not been created, run the algorithms to generate them. - * @returns - */ -const getDataStructures = () => { - if (state.records.dataStructures === undefined) { - // Tracks how groups are aligned with one another. Generated while creating the adj list - const groupAlignments: Record< - string, - Record> - > = {}; - - // Create an adjacency list of the diagram to perform BFS on - // Outer reduce applied on all services - // Inner reduce applied on the edges for a service - const adjList = Object.entries(state.records.nodes).reduce< - Record - >((prevOuter, [id, service]) => { - prevOuter[id] = service.edges.reduce((prevInner, edge) => { - // track the direction groups connect to one another - const lhsGroupId = getNode(edge.lhsId)?.in; - const rhsGroupId = getNode(edge.rhsId)?.in; - if (lhsGroupId && rhsGroupId && lhsGroupId !== rhsGroupId) { - const alignment = getArchitectureDirectionAlignment(edge.lhsDir, edge.rhsDir); - if (alignment !== 'bend') { - groupAlignments[lhsGroupId] ??= {}; - groupAlignments[lhsGroupId][rhsGroupId] = alignment; - groupAlignments[rhsGroupId] ??= {}; - groupAlignments[rhsGroupId][lhsGroupId] = alignment; - } - } - - if (edge.lhsId === id) { - // source is LHS - const pair = getArchitectureDirectionPair(edge.lhsDir, edge.rhsDir); - if (pair) { - prevInner[pair] = edge.rhsId; - } - } else { - // source is RHS - const pair = getArchitectureDirectionPair(edge.rhsDir, edge.lhsDir); - if (pair) { - prevInner[pair] = edge.lhsId; - } - } - return prevInner; - }, {}); - return prevOuter; - }, {}); - - // Configuration for the initial pass of BFS - const firstId = Object.keys(adjList)[0]; - const visited = { [firstId]: 1 }; - // If a key is present in this object, it has not been visited - const notVisited = Object.keys(adjList).reduce( - (prev, id) => (id === firstId ? prev : { ...prev, [id]: 1 }), - {} as Record - ); - - // Perform BFS on the adjacency list - const BFS = (startingId: string): ArchitectureSpatialMap => { - const spatialMap = { [startingId]: [0, 0] }; - const queue = [startingId]; - while (queue.length > 0) { - const id = queue.shift(); - if (id) { - visited[id] = 1; - delete notVisited[id]; - const adj = adjList[id]; - const [posX, posY] = spatialMap[id]; - Object.entries(adj).forEach(([dir, rhsId]) => { - if (!visited[rhsId]) { - spatialMap[rhsId] = shiftPositionByArchitectureDirectionPair( - [posX, posY], - dir as ArchitectureDirectionPair - ); - queue.push(rhsId); - } - }); - } - } - return spatialMap; - }; - const spatialMaps = [BFS(firstId)]; - - // If our diagram is disconnected, keep adding additional spatial maps until all disconnected graphs have been found - while (Object.keys(notVisited).length > 0) { - spatialMaps.push(BFS(Object.keys(notVisited)[0])); + }: ArchitectureEdge): void { + if (!isArchitectureDirection(lhsDir)) { + throw new Error( + `Invalid direction given for left hand side of edge ${lhsId}--${rhsId}. Expected (L,R,T,B) got ${String(lhsDir)}` + ); } - state.records.dataStructures = { - adjList, - spatialMaps, - groupAlignments, + if (!isArchitectureDirection(rhsDir)) { + throw new Error( + `Invalid direction given for right hand side of edge ${lhsId}--${rhsId}. Expected (L,R,T,B) got ${String(rhsDir)}` + ); + } + + if (this.nodes[lhsId] === undefined && this.groups[lhsId] === undefined) { + throw new Error( + `The left-hand id [${lhsId}] does not yet exist. Please create the service/group before declaring an edge to it.` + ); + } + if (this.nodes[rhsId] === undefined && this.groups[lhsId] === undefined) { + throw new Error( + `The right-hand id [${rhsId}] does not yet exist. Please create the service/group before declaring an edge to it.` + ); + } + + const lhsGroupId = this.nodes[lhsId].in; + const rhsGroupId = this.nodes[rhsId].in; + if (lhsGroup && lhsGroupId && rhsGroupId && lhsGroupId == rhsGroupId) { + throw new Error( + `The left-hand id [${lhsId}] is modified to traverse the group boundary, but the edge does not pass through two groups.` + ); + } + if (rhsGroup && lhsGroupId && rhsGroupId && lhsGroupId == rhsGroupId) { + throw new Error( + `The right-hand id [${rhsId}] is modified to traverse the group boundary, but the edge does not pass through two groups.` + ); + } + + const edge = { + lhsId, + lhsDir, + lhsInto, + lhsGroup, + rhsId, + rhsDir, + rhsInto, + rhsGroup, + title, }; + + this.edges.push(edge); + if (this.nodes[lhsId] && this.nodes[rhsId]) { + this.nodes[lhsId].edges.push(this.edges[this.edges.length - 1]); + this.nodes[rhsId].edges.push(this.edges[this.edges.length - 1]); + } } - return state.records.dataStructures; -}; -const setElementForId = (id: string, element: D3Element) => { - state.records.elements[id] = element; -}; -const getElementById = (id: string) => state.records.elements[id]; + public getEdges(): ArchitectureEdge[] { + return this.edges; + } -const getConfig = (): Required => { - const config = cleanAndMerge({ - ...DEFAULT_ARCHITECTURE_CONFIG, - ...commonGetConfig().architecture, - }); - return config; -}; + /** + * Returns the current diagram's adjacency list, spatial map, & group alignments. + * If they have not been created, run the algorithms to generate them. + * @returns + */ + public getDataStructures() { + if (this.dataStructures === undefined) { + // Tracks how groups are aligned with one another. Generated while creating the adj list + const groupAlignments: Record< + string, + Record> + > = {}; -export const db: ArchitectureDB = { - clear, - setDiagramTitle, - getDiagramTitle, - setAccTitle, - getAccTitle, - setAccDescription, - getAccDescription, - getConfig, + // Create an adjacency list of the diagram to perform BFS on + // Outer reduce applied on all services + // Inner reduce applied on the edges for a service + const adjList = Object.entries(this.nodes).reduce< + Record + >((prevOuter, [id, service]) => { + prevOuter[id] = service.edges.reduce((prevInner, edge) => { + // track the direction groups connect to one another + const lhsGroupId = this.getNode(edge.lhsId)?.in; + const rhsGroupId = this.getNode(edge.rhsId)?.in; + if (lhsGroupId && rhsGroupId && lhsGroupId !== rhsGroupId) { + const alignment = getArchitectureDirectionAlignment(edge.lhsDir, edge.rhsDir); + if (alignment !== 'bend') { + groupAlignments[lhsGroupId] ??= {}; + groupAlignments[lhsGroupId][rhsGroupId] = alignment; + groupAlignments[rhsGroupId] ??= {}; + groupAlignments[rhsGroupId][lhsGroupId] = alignment; + } + } - addService, - getServices, - addJunction, - getJunctions, - getNodes, - getNode, - addGroup, - getGroups, - addEdge, - getEdges, - setElementForId, - getElementById, - getDataStructures, -}; + if (edge.lhsId === id) { + // source is LHS + const pair = getArchitectureDirectionPair(edge.lhsDir, edge.rhsDir); + if (pair) { + prevInner[pair] = edge.rhsId; + } + } else { + // source is RHS + const pair = getArchitectureDirectionPair(edge.rhsDir, edge.lhsDir); + if (pair) { + prevInner[pair] = edge.lhsId; + } + } + return prevInner; + }, {}); + return prevOuter; + }, {}); + + // Configuration for the initial pass of BFS + const firstId = Object.keys(adjList)[0]; + const visited = { [firstId]: 1 }; + // If a key is present in this object, it has not been visited + const notVisited = Object.keys(adjList).reduce( + (prev, id) => (id === firstId ? prev : { ...prev, [id]: 1 }), + {} as Record + ); + + // Perform BFS on the adjacency list + const BFS = (startingId: string): ArchitectureSpatialMap => { + const spatialMap = { [startingId]: [0, 0] }; + const queue = [startingId]; + while (queue.length > 0) { + const id = queue.shift(); + if (id) { + visited[id] = 1; + delete notVisited[id]; + const adj = adjList[id]; + const [posX, posY] = spatialMap[id]; + Object.entries(adj).forEach(([dir, rhsId]) => { + if (!visited[rhsId]) { + spatialMap[rhsId] = shiftPositionByArchitectureDirectionPair( + [posX, posY], + dir as ArchitectureDirectionPair + ); + queue.push(rhsId); + } + }); + } + } + return spatialMap; + }; + const spatialMaps = [BFS(firstId)]; + + // If our diagram is disconnected, keep adding additional spatial maps until all disconnected graphs have been found + while (Object.keys(notVisited).length > 0) { + spatialMaps.push(BFS(Object.keys(notVisited)[0])); + } + this.dataStructures = { + adjList, + spatialMaps, + groupAlignments, + }; + } + return this.dataStructures; + } + + public setElementForId(id: string, element: D3Element): void { + this.elements[id] = element; + } + + public getElementById(id: string): D3Element { + return this.elements[id]; + } + + public getConfig(): Required { + return cleanAndMerge({ + ...DEFAULT_ARCHITECTURE_CONFIG, + ...commonGetConfig().architecture, + }); + } + + public getConfigField( + field: T + ): Required[T] { + return this.getConfig()[field]; + } + + public setAccTitle = setAccTitle; + public getAccTitle = getAccTitle; + public setDiagramTitle = setDiagramTitle; + public getDiagramTitle = getDiagramTitle; + public getAccDescription = getAccDescription; + public setAccDescription = setAccDescription; +} /** * Typed wrapper for resolving an architecture diagram's config fields. Returns the default value if undefined * @param field - the config field to access * @returns */ -export function getConfigField( - field: T -): Required[T] { - return getConfig()[field]; -} +// export function getConfigField( +// field: T +// ): Required[T] { +// return db.getConfig()[field]; +// } diff --git a/packages/mermaid/src/diagrams/architecture/architectureDiagram.ts b/packages/mermaid/src/diagrams/architecture/architectureDiagram.ts index 82dacd3e1..1d390a3ab 100644 --- a/packages/mermaid/src/diagrams/architecture/architectureDiagram.ts +++ b/packages/mermaid/src/diagrams/architecture/architectureDiagram.ts @@ -1,12 +1,14 @@ import type { DiagramDefinition } from '../../diagram-api/types.js'; import { parser } from './architectureParser.js'; -import { db } from './architectureDb.js'; +import { ArchitectureDB } from './architectureDb.js'; import styles from './architectureStyles.js'; import { renderer } from './architectureRenderer.js'; export const diagram: DiagramDefinition = { parser, - db, + get db() { + return new ArchitectureDB(); + }, renderer, styles, }; diff --git a/packages/mermaid/src/diagrams/architecture/architectureParser.ts b/packages/mermaid/src/diagrams/architecture/architectureParser.ts index a7159d907..f3d7771be 100644 --- a/packages/mermaid/src/diagrams/architecture/architectureParser.ts +++ b/packages/mermaid/src/diagrams/architecture/architectureParser.ts @@ -1,24 +1,33 @@ import type { Architecture } from '@mermaid-js/parser'; import { parse } from '@mermaid-js/parser'; -import { log } from '../../logger.js'; import type { ParserDefinition } from '../../diagram-api/types.js'; +import { log } from '../../logger.js'; import { populateCommonDb } from '../common/populateCommonDb.js'; -import type { ArchitectureDB } from './architectureTypes.js'; -import { db } from './architectureDb.js'; +import { ArchitectureDB } from './architectureDb.js'; const populateDb = (ast: Architecture, db: ArchitectureDB) => { populateCommonDb(ast, db); - ast.groups.map(db.addGroup); + ast.groups.map((group) => db.addGroup(group)); ast.services.map((service) => db.addService({ ...service, type: 'service' })); ast.junctions.map((service) => db.addJunction({ ...service, type: 'junction' })); - // @ts-ignore TODO our parser guarantees the type is L/R/T/B and not string. How to change to union type? - ast.edges.map(db.addEdge); + // @ts-ignore ToDo our parser guarantees the type is L/R/T/B and not string. How to change to union type? + ast.edges.map((edge) => db.addEdge(edge)); }; export const parser: ParserDefinition = { + parser: { + // @ts-expect-error - ArchitectureDB is not assignable to DiagramDB + yy: undefined, + }, parse: async (input: string): Promise => { const ast: Architecture = await parse('architecture', input); log.debug(ast); + const db = parser.parser?.yy; + if (!(db instanceof ArchitectureDB)) { + throw new Error( + 'parser.parser?.yy was not a ArchitectureDB. This is due to a bug within Mermaid, please report this issue at https://github.com/mermaid-js/mermaid/issues.' + ); + } populateDb(ast, db); }, }; diff --git a/packages/mermaid/src/diagrams/architecture/architectureRenderer.ts b/packages/mermaid/src/diagrams/architecture/architectureRenderer.ts index 1505b1950..ad435a29f 100644 --- a/packages/mermaid/src/diagrams/architecture/architectureRenderer.ts +++ b/packages/mermaid/src/diagrams/architecture/architectureRenderer.ts @@ -1,4 +1,3 @@ -import { registerIconPacks } from '../../rendering-util/icons.js'; import type { Position } from 'cytoscape'; import cytoscape from 'cytoscape'; import type { FcoseLayoutOptions } from 'cytoscape-fcose'; @@ -7,9 +6,10 @@ import { select } from 'd3'; import type { DrawDefinition, SVG } from '../../diagram-api/types.js'; import type { Diagram } from '../../Diagram.js'; import { log } from '../../logger.js'; +import { registerIconPacks } from '../../rendering-util/icons.js'; import { selectSvgElement } from '../../rendering-util/selectSvgElement.js'; import { setupGraphViewbox } from '../../setupGraphViewbox.js'; -import { getConfigField } from './architectureDb.js'; +import type { ArchitectureDB } from './architectureDb.js'; import { architectureIcons } from './architectureIcons.js'; import type { ArchitectureAlignment, @@ -22,7 +22,6 @@ import type { NodeSingularData, } from './architectureTypes.js'; import { - type ArchitectureDB, type ArchitectureDirection, type ArchitectureEdge, type ArchitectureGroup, @@ -44,7 +43,7 @@ registerIconPacks([ ]); cytoscape.use(fcose); -function addServices(services: ArchitectureService[], cy: cytoscape.Core) { +function addServices(services: ArchitectureService[], cy: cytoscape.Core, db: ArchitectureDB) { services.forEach((service) => { cy.add({ group: 'nodes', @@ -54,15 +53,15 @@ function addServices(services: ArchitectureService[], cy: cytoscape.Core) { icon: service.icon, label: service.title, parent: service.in, - width: getConfigField('iconSize'), - height: getConfigField('iconSize'), + width: db.getConfigField('iconSize'), + height: db.getConfigField('iconSize'), } as NodeSingularData, classes: 'node-service', }); }); } -function addJunctions(junctions: ArchitectureJunction[], cy: cytoscape.Core) { +function addJunctions(junctions: ArchitectureJunction[], cy: cytoscape.Core, db: ArchitectureDB) { junctions.forEach((junction) => { cy.add({ group: 'nodes', @@ -70,8 +69,8 @@ function addJunctions(junctions: ArchitectureJunction[], cy: cytoscape.Core) { type: 'junction', id: junction.id, parent: junction.in, - width: getConfigField('iconSize'), - height: getConfigField('iconSize'), + width: db.getConfigField('iconSize'), + height: db.getConfigField('iconSize'), } as NodeSingularData, classes: 'node-junction', }); @@ -192,7 +191,7 @@ function getAlignments( prev[dir] ??= []; prev[dir] = [...prev[dir], ...aNodeIds, ...bNodeIds]; // add the node ids of both groups to the axis array in prev } else if (aGroupId === 'default' || bGroupId === 'default') { - // If either of the groups are in the default space (not in a group), use the same behavior as above + // If either of the groups are in the default space (not in a group), use the same behaviour as above prev[dir] ??= []; prev[dir] = [...prev[dir], ...aNodeIds, ...bNodeIds]; } else { @@ -257,7 +256,8 @@ function getAlignments( } function getRelativeConstraints( - spatialMaps: ArchitectureSpatialMap[] + spatialMaps: ArchitectureSpatialMap[], + db: ArchitectureDB ): fcose.FcoseRelativePlacementConstraint[] { const relativeConstraints: fcose.FcoseRelativePlacementConstraint[] = []; const posToStr = (pos: number[]) => `${pos[0]},${pos[1]}`; @@ -296,7 +296,7 @@ function getRelativeConstraints( [ArchitectureDirectionName[ getOppositeArchitectureDirection(dir as ArchitectureDirection) ]]: currId, - gap: 1.5 * getConfigField('iconSize'), + gap: 1.5 * db.getConfigField('iconSize'), }); } }); @@ -353,7 +353,7 @@ function layoutArchitecture( style: { 'text-valign': 'bottom', 'text-halign': 'center', - 'font-size': `${getConfigField('fontSize')}px`, + 'font-size': `${db.getConfigField('fontSize')}px`, }, }, { @@ -375,7 +375,7 @@ function layoutArchitecture( selector: '.node-group', style: { // @ts-ignore Incorrect library types - padding: `${getConfigField('padding')}px`, + padding: `${db.getConfigField('padding')}px`, }, }, ], @@ -393,14 +393,14 @@ function layoutArchitecture( renderEl.remove(); addGroups(groups, cy); - addServices(services, cy); - addJunctions(junctions, cy); + addServices(services, cy, db); + addJunctions(junctions, cy, db); addEdges(edges, cy); // Use the spatial map to create alignment arrays for fcose const alignmentConstraint = getAlignments(db, spatialMaps, groupAlignments); // Create the relative constraints for fcose by using an inverse of the spatial map and performing BFS on it - const relativePlacementConstraint = getRelativeConstraints(spatialMaps); + const relativePlacementConstraint = getRelativeConstraints(spatialMaps, db); const layout = cy.layout({ name: 'fcose', @@ -415,7 +415,9 @@ function layoutArchitecture( const { parent: parentA } = nodeData(nodeA); const { parent: parentB } = nodeData(nodeB); const elasticity = - parentA === parentB ? 1.5 * getConfigField('iconSize') : 0.5 * getConfigField('iconSize'); + parentA === parentB + ? 1.5 * db.getConfigField('iconSize') + : 0.5 * db.getConfigField('iconSize'); return elasticity; }, edgeElasticity(edge: EdgeSingular) { @@ -535,11 +537,11 @@ export const draw: DrawDefinition = async (text, id, _version, diagObj: Diagram) const cy = await layoutArchitecture(services, junctions, groups, edges, db, ds); - await drawEdges(edgesElem, cy); - await drawGroups(groupElem, cy); + await drawEdges(edgesElem, cy, db); + await drawGroups(groupElem, cy, db); positionNodes(db, cy); - setupGraphViewbox(undefined, svg, getConfigField('padding'), getConfigField('useMaxWidth')); + setupGraphViewbox(undefined, svg, db.getConfigField('padding'), db.getConfigField('useMaxWidth')); }; export const renderer = { draw }; diff --git a/packages/mermaid/src/diagrams/architecture/svgDraw.ts b/packages/mermaid/src/diagrams/architecture/svgDraw.ts index b10a451fe..f384defd8 100644 --- a/packages/mermaid/src/diagrams/architecture/svgDraw.ts +++ b/packages/mermaid/src/diagrams/architecture/svgDraw.ts @@ -1,9 +1,9 @@ -import { getIconSVG } from '../../rendering-util/icons.js'; import type cytoscape from 'cytoscape'; import { getConfig } from '../../diagram-api/diagramAPI.js'; import { createText } from '../../rendering-util/createText.js'; +import { getIconSVG } from '../../rendering-util/icons.js'; import type { D3Element } from '../../types.js'; -import { db, getConfigField } from './architectureDb.js'; +import type { ArchitectureDB } from './architectureDb.js'; import { architectureIcons } from './architectureIcons.js'; import { ArchitectureDirectionArrow, @@ -16,14 +16,17 @@ import { isArchitectureDirectionY, isArchitecturePairXY, nodeData, - type ArchitectureDB, type ArchitectureJunction, type ArchitectureService, } from './architectureTypes.js'; -export const drawEdges = async function (edgesEl: D3Element, cy: cytoscape.Core) { - const padding = getConfigField('padding'); - const iconSize = getConfigField('iconSize'); +export const drawEdges = async function ( + edgesEl: D3Element, + cy: cytoscape.Core, + db: ArchitectureDB +) { + const padding = db.getConfigField('padding'); + const iconSize = db.getConfigField('iconSize'); const halfIconSize = iconSize / 2; const arrowSize = iconSize / 6; const halfArrowSize = arrowSize / 2; @@ -183,13 +186,17 @@ export const drawEdges = async function (edgesEl: D3Element, cy: cytoscape.Core) ); }; -export const drawGroups = async function (groupsEl: D3Element, cy: cytoscape.Core) { - const padding = getConfigField('padding'); +export const drawGroups = async function ( + groupsEl: D3Element, + cy: cytoscape.Core, + db: ArchitectureDB +) { + const padding = db.getConfigField('padding'); const groupIconSize = padding * 0.75; - const fontSize = getConfigField('fontSize'); + const fontSize = db.getConfigField('fontSize'); - const iconSize = getConfigField('iconSize'); + const iconSize = db.getConfigField('iconSize'); const halfIconSize = iconSize / 2; await Promise.all( @@ -266,7 +273,7 @@ export const drawServices = async function ( ): Promise { for (const service of services) { const serviceElem = elem.append('g'); - const iconSize = getConfigField('iconSize'); + const iconSize = db.getConfigField('iconSize'); if (service.title) { const textElem = serviceElem.append('g'); @@ -350,7 +357,7 @@ export const drawJunctions = function ( ) { junctions.forEach((junction) => { const junctionElem = elem.append('g'); - const iconSize = getConfigField('iconSize'); + const iconSize = db.getConfigField('iconSize'); const bkgElem = junctionElem.append('g'); bkgElem From e48b0ba61dab7f95aa02da603b5b7d383b894932 Mon Sep 17 00:00:00 2001 From: omkarht Date: Tue, 29 Jul 2025 15:41:21 +0530 Subject: [PATCH 091/143] chore: added changeset on-behalf-of: @Mermaid-Chart --- .changeset/silver-eyes-build.md | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 .changeset/silver-eyes-build.md diff --git a/.changeset/silver-eyes-build.md b/.changeset/silver-eyes-build.md new file mode 100644 index 000000000..77a581568 --- /dev/null +++ b/.changeset/silver-eyes-build.md @@ -0,0 +1,5 @@ +--- +'mermaid': minor +--- + +chore: migrate to class-based ArchitectureDB implementation From 895f9d43ff98ca05ebfba530789f677f31a011ff Mon Sep 17 00:00:00 2001 From: omkarht Date: Tue, 29 Jul 2025 16:55:04 +0530 Subject: [PATCH 092/143] 6691: update packet diagram to use new class-based DB approach on-behalf-of: @Mermaid-Chart --- .changeset/vast-buses-see.md | 5 ++ packages/mermaid/src/diagrams/packet/db.ts | 72 +++++++++---------- .../mermaid/src/diagrams/packet/diagram.ts | 6 +- .../src/diagrams/packet/packet.spec.ts | 32 +++++---- .../mermaid/src/diagrams/packet/parser.ts | 14 +++- 5 files changed, 70 insertions(+), 59 deletions(-) create mode 100644 .changeset/vast-buses-see.md diff --git a/.changeset/vast-buses-see.md b/.changeset/vast-buses-see.md new file mode 100644 index 000000000..683a3bf3c --- /dev/null +++ b/.changeset/vast-buses-see.md @@ -0,0 +1,5 @@ +--- +'mermaid': minor +--- + +chore: Update packet diagram to use new class-based database structure diff --git a/packages/mermaid/src/diagrams/packet/db.ts b/packages/mermaid/src/diagrams/packet/db.ts index d7b550472..863bd79e1 100644 --- a/packages/mermaid/src/diagrams/packet/db.ts +++ b/packages/mermaid/src/diagrams/packet/db.ts @@ -1,6 +1,7 @@ import { getConfig as commonGetConfig } from '../../config.js'; import type { PacketDiagramConfig } from '../../config.type.js'; import DEFAULT_CONFIG from '../../defaultConfig.js'; +import type { DiagramDB } from '../../diagram-api/types.js'; import { cleanAndMerge } from '../../utils.js'; import { clear as commonClear, @@ -11,49 +12,42 @@ import { setAccTitle, setDiagramTitle, } from '../common/commonDb.js'; -import type { PacketDB, PacketData, PacketWord } from './types.js'; - -const defaultPacketData: PacketData = { - packet: [], -}; - -let data: PacketData = structuredClone(defaultPacketData); - +import type { PacketWord } from './types.js'; const DEFAULT_PACKET_CONFIG: Required = DEFAULT_CONFIG.packet; -const getConfig = (): Required => { - const config = cleanAndMerge({ - ...DEFAULT_PACKET_CONFIG, - ...commonGetConfig().packet, - }); - if (config.showBits) { - config.paddingY += 10; +export class PacketDB implements DiagramDB { + private packet: PacketWord[] = []; + + public getConfig() { + const config = cleanAndMerge({ + ...DEFAULT_PACKET_CONFIG, + ...commonGetConfig().packet, + }); + if (config.showBits) { + config.paddingY += 10; + } + return config; } - return config; -}; -const getPacket = (): PacketWord[] => data.packet; - -const pushWord = (word: PacketWord) => { - if (word.length > 0) { - data.packet.push(word); + public getPacket() { + return this.packet; } -}; -const clear = () => { - commonClear(); - data = structuredClone(defaultPacketData); -}; + public pushWord(word: PacketWord) { + if (word.length > 0) { + this.packet.push(word); + } + } -export const db: PacketDB = { - pushWord, - getPacket, - getConfig, - clear, - setAccTitle, - getAccTitle, - setDiagramTitle, - getDiagramTitle, - getAccDescription, - setAccDescription, -}; + public clear() { + commonClear(); + this.packet = []; + } + + public setAccTitle = setAccTitle; + public getAccTitle = getAccTitle; + public setDiagramTitle = setDiagramTitle; + public getDiagramTitle = getDiagramTitle; + public getAccDescription = getAccDescription; + public setAccDescription = setAccDescription; +} diff --git a/packages/mermaid/src/diagrams/packet/diagram.ts b/packages/mermaid/src/diagrams/packet/diagram.ts index a73a77c05..84a7bca8f 100644 --- a/packages/mermaid/src/diagrams/packet/diagram.ts +++ b/packages/mermaid/src/diagrams/packet/diagram.ts @@ -1,12 +1,14 @@ import type { DiagramDefinition } from '../../diagram-api/types.js'; -import { db } from './db.js'; +import { PacketDB } from './db.js'; import { parser } from './parser.js'; import { renderer } from './renderer.js'; import { styles } from './styles.js'; export const diagram: DiagramDefinition = { parser, - db, + get db() { + return new PacketDB(); + }, renderer, styles, }; diff --git a/packages/mermaid/src/diagrams/packet/packet.spec.ts b/packages/mermaid/src/diagrams/packet/packet.spec.ts index b03ffe4d1..fd7b3211a 100644 --- a/packages/mermaid/src/diagrams/packet/packet.spec.ts +++ b/packages/mermaid/src/diagrams/packet/packet.spec.ts @@ -1,24 +1,26 @@ import { it, describe, expect } from 'vitest'; -import { db } from './db.js'; +import { PacketDB } from './db.js'; import { parser } from './parser.js'; -const { clear, getPacket, getDiagramTitle, getAccTitle, getAccDescription } = db; - describe('packet diagrams', () => { + let db: PacketDB; beforeEach(() => { - clear(); + db = new PacketDB(); + if (parser.parser) { + parser.parser.yy = db; + } }); it('should handle a packet-beta definition', async () => { const str = `packet-beta`; await expect(parser.parse(str)).resolves.not.toThrow(); - expect(getPacket()).toMatchInlineSnapshot('[]'); + expect(db.getPacket()).toMatchInlineSnapshot('[]'); }); it('should handle a packet definition', async () => { const str = `packet`; await expect(parser.parse(str)).resolves.not.toThrow(); - expect(getPacket()).toMatchInlineSnapshot('[]'); + expect(db.getPacket()).toMatchInlineSnapshot('[]'); }); it('should handle diagram with data and title', async () => { @@ -29,10 +31,10 @@ describe('packet diagrams', () => { 0-10: "test" `; await expect(parser.parse(str)).resolves.not.toThrow(); - expect(getDiagramTitle()).toMatchInlineSnapshot('"Packet diagram"'); - expect(getAccTitle()).toMatchInlineSnapshot('"Packet accTitle"'); - expect(getAccDescription()).toMatchInlineSnapshot('"Packet accDescription"'); - expect(getPacket()).toMatchInlineSnapshot(` + expect(db.getDiagramTitle()).toMatchInlineSnapshot('"Packet diagram"'); + expect(db.getAccTitle()).toMatchInlineSnapshot('"Packet accTitle"'); + expect(db.getAccDescription()).toMatchInlineSnapshot('"Packet accDescription"'); + expect(db.getPacket()).toMatchInlineSnapshot(` [ [ { @@ -52,7 +54,7 @@ describe('packet diagrams', () => { 11: "single" `; await expect(parser.parse(str)).resolves.not.toThrow(); - expect(getPacket()).toMatchInlineSnapshot(` + expect(db.getPacket()).toMatchInlineSnapshot(` [ [ { @@ -78,7 +80,7 @@ describe('packet diagrams', () => { +16: "word" `; await expect(parser.parse(str)).resolves.not.toThrow(); - expect(getPacket()).toMatchInlineSnapshot(` + expect(db.getPacket()).toMatchInlineSnapshot(` [ [ { @@ -104,7 +106,7 @@ describe('packet diagrams', () => { +16: "word" `; await expect(parser.parse(str)).resolves.not.toThrow(); - expect(getPacket()).toMatchInlineSnapshot(` + expect(db.getPacket()).toMatchInlineSnapshot(` [ [ { @@ -130,7 +132,7 @@ describe('packet diagrams', () => { 11-90: "multiple" `; await expect(parser.parse(str)).resolves.not.toThrow(); - expect(getPacket()).toMatchInlineSnapshot(` + expect(db.getPacket()).toMatchInlineSnapshot(` [ [ { @@ -172,7 +174,7 @@ describe('packet diagrams', () => { 17-63: "multiple" `; await expect(parser.parse(str)).resolves.not.toThrow(); - expect(getPacket()).toMatchInlineSnapshot(` + expect(db.getPacket()).toMatchInlineSnapshot(` [ [ { diff --git a/packages/mermaid/src/diagrams/packet/parser.ts b/packages/mermaid/src/diagrams/packet/parser.ts index 1dcccd636..689d86fb3 100644 --- a/packages/mermaid/src/diagrams/packet/parser.ts +++ b/packages/mermaid/src/diagrams/packet/parser.ts @@ -3,12 +3,12 @@ import { parse } from '@mermaid-js/parser'; import type { ParserDefinition } from '../../diagram-api/types.js'; import { log } from '../../logger.js'; import { populateCommonDb } from '../common/populateCommonDb.js'; -import { db } from './db.js'; +import { PacketDB } from './db.js'; import type { PacketBlock, PacketWord } from './types.js'; const maxPacketSize = 10_000; -const populate = (ast: Packet) => { +const populate = (ast: Packet, db: PacketDB) => { populateCommonDb(ast, db); let lastBit = -1; let word: PacketWord = []; @@ -91,9 +91,17 @@ const getNextFittingBlock = ( }; export const parser: ParserDefinition = { + // @ts-expect-error - PacketDB is not assignable to DiagramDB + parser: { yy: undefined }, parse: async (input: string): Promise => { const ast: Packet = await parse('packet', input); + const db = parser.parser?.yy; + if (!(db instanceof PacketDB)) { + throw new Error( + 'parser.parser?.yy was not a PacketDB. This is due to a bug within Mermaid, please report this issue at https://github.com/mermaid-js/mermaid/issues.' + ); + } log.debug(ast); - populate(ast); + populate(ast, db); }, }; From 5dd748148f8a7b59174bb74047c5f6b640acc2b3 Mon Sep 17 00:00:00 2001 From: omkarht Date: Tue, 29 Jul 2025 16:59:02 +0530 Subject: [PATCH 093/143] fix: refactored code on-behalf-of: @Mermaid-Chart --- packages/mermaid/src/diagrams/architecture/architectureDb.ts | 5 ++--- .../mermaid/src/diagrams/architecture/architectureParser.ts | 2 +- .../src/diagrams/architecture/architectureRenderer.ts | 2 +- 3 files changed, 4 insertions(+), 5 deletions(-) diff --git a/packages/mermaid/src/diagrams/architecture/architectureDb.ts b/packages/mermaid/src/diagrams/architecture/architectureDb.ts index 5d90bd8a6..4764671e8 100644 --- a/packages/mermaid/src/diagrams/architecture/architectureDb.ts +++ b/packages/mermaid/src/diagrams/architecture/architectureDb.ts @@ -41,7 +41,6 @@ export class ArchitectureDB implements DiagramDB { private groups: Record = {}; private edges: ArchitectureEdge[] = []; private registeredIds: Record = {}; - // private config: Required = DEFAULT_ARCHITECTURE_CONFIG; private dataStructures?: ArchitectureState['dataStructures']; private elements: Record = {}; @@ -184,7 +183,7 @@ export class ArchitectureDB implements DiagramDB { `The left-hand id [${lhsId}] does not yet exist. Please create the service/group before declaring an edge to it.` ); } - if (this.nodes[rhsId] === undefined && this.groups[lhsId] === undefined) { + if (this.nodes[rhsId] === undefined && this.groups[rhsId] === undefined) { throw new Error( `The right-hand id [${rhsId}] does not yet exist. Please create the service/group before declaring an edge to it.` ); @@ -359,7 +358,7 @@ export class ArchitectureDB implements DiagramDB { * @param field - the config field to access * @returns */ -// export function getConfigField( +// export function getConfigField( // field: T // ): Required[T] { // return db.getConfig()[field]; diff --git a/packages/mermaid/src/diagrams/architecture/architectureParser.ts b/packages/mermaid/src/diagrams/architecture/architectureParser.ts index f3d7771be..58820dad4 100644 --- a/packages/mermaid/src/diagrams/architecture/architectureParser.ts +++ b/packages/mermaid/src/diagrams/architecture/architectureParser.ts @@ -10,7 +10,7 @@ const populateDb = (ast: Architecture, db: ArchitectureDB) => { ast.groups.map((group) => db.addGroup(group)); ast.services.map((service) => db.addService({ ...service, type: 'service' })); ast.junctions.map((service) => db.addJunction({ ...service, type: 'junction' })); - // @ts-ignore ToDo our parser guarantees the type is L/R/T/B and not string. How to change to union type? + // @ts-ignore TODO our parser guarantees the type is L/R/T/B and not string. How to change to union type? ast.edges.map((edge) => db.addEdge(edge)); }; diff --git a/packages/mermaid/src/diagrams/architecture/architectureRenderer.ts b/packages/mermaid/src/diagrams/architecture/architectureRenderer.ts index ad435a29f..b29567236 100644 --- a/packages/mermaid/src/diagrams/architecture/architectureRenderer.ts +++ b/packages/mermaid/src/diagrams/architecture/architectureRenderer.ts @@ -191,7 +191,7 @@ function getAlignments( prev[dir] ??= []; prev[dir] = [...prev[dir], ...aNodeIds, ...bNodeIds]; // add the node ids of both groups to the axis array in prev } else if (aGroupId === 'default' || bGroupId === 'default') { - // If either of the groups are in the default space (not in a group), use the same behaviour as above + // If either of the groups are in the default space (not in a group), use the same behavior as above prev[dir] ??= []; prev[dir] = [...prev[dir], ...aNodeIds, ...bNodeIds]; } else { From 03cf10003fe92f33867a455f3aa6611433a12bbd Mon Sep 17 00:00:00 2001 From: omkarht Date: Wed, 30 Jul 2025 13:16:49 +0530 Subject: [PATCH 094/143] fix: modified changeset to patch on-behalf-of: @Mermaid-Chart --- .changeset/silver-eyes-build.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.changeset/silver-eyes-build.md b/.changeset/silver-eyes-build.md index 77a581568..76f0a0125 100644 --- a/.changeset/silver-eyes-build.md +++ b/.changeset/silver-eyes-build.md @@ -1,5 +1,5 @@ --- -'mermaid': minor +'mermaid': patch --- chore: migrate to class-based ArchitectureDB implementation From e27a9da61d177600b0b83b59374f3b4b68e20953 Mon Sep 17 00:00:00 2001 From: omkarht Date: Wed, 30 Jul 2025 13:18:44 +0530 Subject: [PATCH 095/143] Update .changeset/vast-buses-see.md Co-authored-by: Sidharth Vinod --- .changeset/vast-buses-see.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.changeset/vast-buses-see.md b/.changeset/vast-buses-see.md index 683a3bf3c..fc2a0e6c6 100644 --- a/.changeset/vast-buses-see.md +++ b/.changeset/vast-buses-see.md @@ -1,5 +1,5 @@ --- -'mermaid': minor +'mermaid': patch --- chore: Update packet diagram to use new class-based database structure From aeb51e56e2c9837e7e471886922956057df575aa Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 4 Aug 2025 03:11:32 +0000 Subject: [PATCH 096/143] chore(deps): update peter-evans/create-pull-request digest to 07cbaeb --- .github/workflows/e2e-timings.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/e2e-timings.yml b/.github/workflows/e2e-timings.yml index 5040bb8e4..ef009fa2b 100644 --- a/.github/workflows/e2e-timings.yml +++ b/.github/workflows/e2e-timings.yml @@ -58,7 +58,7 @@ jobs: echo "EOF" >> $GITHUB_OUTPUT - name: Commit and create pull request - uses: peter-evans/create-pull-request@2e50522bdf313efe32e5628afead9048374012ed + uses: peter-evans/create-pull-request@07cbaebb4bfc9c5d7db426ea5a5f585df29dd0a0 with: add-paths: | cypress/timings.json From 17142ef8d7af7a2a1714f87a02f085b38539bc7f Mon Sep 17 00:00:00 2001 From: Krishna Upadhyay <24423580+kriss-u@users.noreply.github.com> Date: Mon, 4 Aug 2025 20:45:20 -0500 Subject: [PATCH 097/143] chore: run cspell on lint staged for markdown files [skip ci] --- .lintstagedrc.mjs | 1 + 1 file changed, 1 insertion(+) diff --git a/.lintstagedrc.mjs b/.lintstagedrc.mjs index 86af4f513..3c5b860b3 100644 --- a/.lintstagedrc.mjs +++ b/.lintstagedrc.mjs @@ -7,5 +7,6 @@ export default { 'prettier --write', ], '.cspell/*.txt': ['tsx scripts/fixCSpell.ts'], + '**/*.md': ['pnpm dlx cspell'], '**/*.jison': ['pnpm -w run lint:jison'], }; From 1dd11705d940288080a1521b96216b64a5c5d766 Mon Sep 17 00:00:00 2001 From: omkarht Date: Tue, 5 Aug 2025 17:40:18 +0530 Subject: [PATCH 098/143] fix: updated changeset on-behalf-of: @Mermaid-Chart --- .changeset/gold-spiders-join.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.changeset/gold-spiders-join.md b/.changeset/gold-spiders-join.md index 70b55fc47..56bccc244 100644 --- a/.changeset/gold-spiders-join.md +++ b/.changeset/gold-spiders-join.md @@ -1,5 +1,5 @@ --- -'mermaid': minor +'mermaid': patch --- fix: fixed connection gaps in flowchart for roundedRect, stadium and diamond shape From b451c66d7c4467c2170ccf34f29bf6b5b1b4e714 Mon Sep 17 00:00:00 2001 From: omkarht Date: Tue, 5 Aug 2025 19:43:34 +0530 Subject: [PATCH 099/143] chore: added test case for updated shapes on-behalf-of: @Mermaid-Chart --- .../rendering/flowchart-v2.spec.js | 31 +++++++++++++++++++ 1 file changed, 31 insertions(+) diff --git a/cypress/integration/rendering/flowchart-v2.spec.js b/cypress/integration/rendering/flowchart-v2.spec.js index 9ad2b5604..69ff10b00 100644 --- a/cypress/integration/rendering/flowchart-v2.spec.js +++ b/cypress/integration/rendering/flowchart-v2.spec.js @@ -1113,6 +1113,37 @@ end ); }); }); + describe('Flowchart Node Shape Rendering', () => { + it('should render a stadium-shaped node', () => { + imgSnapshotTest( + `flowchart TB + A(["Start"]) --> n1["Untitled Node"] + A --> n2["Untitled Node"] + `, + {} + ); + }); + it('should render a diamond-shaped node using shape config', () => { + imgSnapshotTest( + `flowchart BT + n2["Untitled Node"] --> n1["Diamond"] + n1@{ shape: diam} + `, + {} + ); + }); + it('should render a rounded rectangle and a normal rectangle', () => { + imgSnapshotTest( + `flowchart BT + n2["Untitled Node"] --> n1["Rounded Rectangle"] + n3["Untitled Node"] --> n1 + n1@{ shape: rounded} + n3@{ shape: rect} + `, + {} + ); + }); + }); it('6617: Per Link Curve Styling using edge Ids', () => { imgSnapshotTest( From 9d685178d215f76be4d5e8fe47c64dd915274738 Mon Sep 17 00:00:00 2001 From: Sidharth Vinod Date: Tue, 5 Aug 2025 20:44:03 +0530 Subject: [PATCH 100/143] fix: Sanitize Katex --- .../mermaid/src/diagrams/common/common.ts | 26 ++++++++++------- .../mermaid/src/diagrams/sequence/svgDraw.js | 16 +++++++---- .../mermaid/src/rendering-util/createText.ts | 7 +++-- .../rendering-elements/createLabel.js | 28 +++++++++++-------- 4 files changed, 48 insertions(+), 29 deletions(-) diff --git a/packages/mermaid/src/diagrams/common/common.ts b/packages/mermaid/src/diagrams/common/common.ts index 00c9b8313..3b3fdd41e 100644 --- a/packages/mermaid/src/diagrams/common/common.ts +++ b/packages/mermaid/src/diagrams/common/common.ts @@ -311,9 +311,8 @@ export const hasKatex = (text: string): boolean => (text.match(katexRegex)?.leng * @returns Object containing \{width, height\} */ export const calculateMathMLDimensions = async (text: string, config: MermaidConfig) => { - text = await renderKatex(text, config); const divElem = document.createElement('div'); - divElem.innerHTML = text; + divElem.innerHTML = await renderKatexSanitized(text, config); divElem.id = 'katex-temp'; divElem.style.visibility = 'hidden'; divElem.style.position = 'absolute'; @@ -325,14 +324,7 @@ export const calculateMathMLDimensions = async (text: string, config: MermaidCon return dim; }; -/** - * Attempts to render and return the KaTeX portion of a string with MathML - * - * @param text - The text to test - * @param config - Configuration for Mermaid - * @returns String containing MathML if KaTeX is supported, or an error message if it is not and stylesheets aren't present - */ -export const renderKatex = async (text: string, config: MermaidConfig): Promise => { +const renderKatexUnsanitized = async (text: string, config: MermaidConfig): Promise => { if (!hasKatex(text)) { return text; } @@ -373,6 +365,20 @@ export const renderKatex = async (text: string, config: MermaidConfig): Promise< ); }; +/** + * Attempts to render and return the KaTeX portion of a string with MathML + * + * @param text - The text to test + * @param config - Configuration for Mermaid + * @returns String containing MathML if KaTeX is supported, or an error message if it is not and stylesheets aren't present + */ +export const renderKatexSanitized = async ( + text: string, + config: MermaidConfig +): Promise => { + return sanitizeText(await renderKatexUnsanitized(text, config), config); +}; + export default { getRows, sanitizeText, diff --git a/packages/mermaid/src/diagrams/sequence/svgDraw.js b/packages/mermaid/src/diagrams/sequence/svgDraw.js index 04ccd8a84..18fd2d034 100644 --- a/packages/mermaid/src/diagrams/sequence/svgDraw.js +++ b/packages/mermaid/src/diagrams/sequence/svgDraw.js @@ -1,8 +1,12 @@ -import common, { calculateMathMLDimensions, hasKatex, renderKatex } from '../common/common.js'; -import * as svgDrawCommon from '../common/svgDrawCommon.js'; -import { ZERO_WIDTH_SPACE, parseFontSize } from '../../utils.js'; import { sanitizeUrl } from '@braintree/sanitize-url'; import * as configApi from '../../config.js'; +import { ZERO_WIDTH_SPACE, parseFontSize } from '../../utils.js'; +import common, { + calculateMathMLDimensions, + hasKatex, + renderKatexSanitized, +} from '../common/common.js'; +import * as svgDrawCommon from '../common/svgDrawCommon.js'; export const ACTOR_TYPE_WIDTH = 18 * 2; const TOP_ACTOR_CLASS = 'actor-top'; @@ -87,13 +91,13 @@ const popupMenuToggle = function (popId) { export const drawKatex = async function (elem, textData, msgModel = null) { let textElem = elem.append('foreignObject'); - const lines = await renderKatex(textData.text, configApi.getConfig()); + const linesSanitized = await renderKatexSanitized(textData.text, configApi.getConfig()); const divElem = textElem .append('xhtml:div') .attr('style', 'width: fit-content;') .attr('xmlns', 'http://www.w3.org/1999/xhtml') - .html(lines); + .html(linesSanitized); const dim = divElem.node().getBoundingClientRect(); textElem.attr('height', Math.round(dim.height)).attr('width', Math.round(dim.width)); @@ -965,7 +969,7 @@ const _drawTextCandidateFunc = (function () { .append('div') .style('text-align', 'center') .style('vertical-align', 'middle') - .html(await renderKatex(content, configApi.getConfig())); + .html(await renderKatexSanitized(content, configApi.getConfig())); byTspan(content, s, x, y, width, height, textAttrs, conf); _setTextAttrs(text, textAttrs); diff --git a/packages/mermaid/src/rendering-util/createText.ts b/packages/mermaid/src/rendering-util/createText.ts index 6dad6b214..65129aa8a 100644 --- a/packages/mermaid/src/rendering-util/createText.ts +++ b/packages/mermaid/src/rendering-util/createText.ts @@ -4,7 +4,7 @@ import { select } from 'd3'; import type { MermaidConfig } from '../config.type.js'; import { getConfig, sanitizeText } from '../diagram-api/diagramAPI.js'; import type { SVGGroup } from '../diagram-api/types.js'; -import common, { hasKatex, renderKatex } from '../diagrams/common/common.js'; +import common, { hasKatex, renderKatexSanitized } from '../diagrams/common/common.js'; import type { D3TSpanElement, D3TextElement } from '../diagrams/common/commonTypes.js'; import { log } from '../logger.js'; import { markdownToHTML, markdownToLines } from '../rendering-util/handle-markdown-text.js'; @@ -29,7 +29,10 @@ async function addHtmlSpan(element, node, width, classes, addBackground = false) const div = fo.append('xhtml:div'); let label = node.label; if (node.label && hasKatex(node.label)) { - label = await renderKatex(node.label.replace(common.lineBreakRegex, '\n'), getConfig()); + label = await renderKatexSanitized( + node.label.replace(common.lineBreakRegex, '\n'), + getConfig() + ); } const labelClass = node.isNode ? 'nodeLabel' : 'edgeLabel'; const span = div.append('span'); diff --git a/packages/mermaid/src/rendering-util/rendering-elements/createLabel.js b/packages/mermaid/src/rendering-util/rendering-elements/createLabel.js index 482dbb9f1..de6f0403d 100644 --- a/packages/mermaid/src/rendering-util/rendering-elements/createLabel.js +++ b/packages/mermaid/src/rendering-util/rendering-elements/createLabel.js @@ -1,7 +1,12 @@ import { select } from 'd3'; -import { log } from '../../logger.js'; import { getConfig } from '../../diagram-api/diagramAPI.js'; -import common, { evaluate, renderKatex, hasKatex } from '../../diagrams/common/common.js'; +import common, { + evaluate, + hasKatex, + renderKatexSanitized, + sanitizeText, +} from '../../diagrams/common/common.js'; +import { log } from '../../logger.js'; import { decodeEntities } from '../../utils.js'; /** @@ -22,20 +27,21 @@ async function addHtmlLabel(node) { const fo = select(document.createElementNS('http://www.w3.org/2000/svg', 'foreignObject')); const div = fo.append('xhtml:div'); + const config = getConfig(); let label = node.label; if (node.label && hasKatex(node.label)) { - label = await renderKatex(node.label.replace(common.lineBreakRegex, '\n'), getConfig()); + label = await renderKatexSanitized(node.label.replace(common.lineBreakRegex, '\n'), config); } const labelClass = node.isNode ? 'nodeLabel' : 'edgeLabel'; - div.html( + const labelSpan = '' + - label + - '' - ); + labelClass + + '" ' + + (node.labelStyle ? 'style="' + node.labelStyle + '"' : '') + // codeql [js/html-constructed-from-input] : false positive + '>' + + label + + ''; + div.html(sanitizeText(labelSpan, config)); applyStyle(div, node.labelStyle); div.style('display', 'inline-block'); From 8090580c677408f58e6601fc3b4187a4cd57d02f Mon Sep 17 00:00:00 2001 From: Sidharth Vinod Date: Tue, 5 Aug 2025 22:27:21 +0530 Subject: [PATCH 101/143] test: Handle missing bindFunctions --- cypress/platform/viewer.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/cypress/platform/viewer.js b/cypress/platform/viewer.js index e120469fe..7ff95e163 100644 --- a/cypress/platform/viewer.js +++ b/cypress/platform/viewer.js @@ -182,7 +182,7 @@ const contentLoadedApi = async function () { for (let i = 0; i < numCodes; i++) { const { svg, bindFunctions } = await mermaid.render('newid' + i, graphObj.code[i], divs[i]); div.innerHTML = svg; - bindFunctions(div); + bindFunctions?.(div); } } else { const div = document.createElement('div'); @@ -194,7 +194,7 @@ const contentLoadedApi = async function () { const { svg, bindFunctions } = await mermaid.render('newid', graphObj.code, div); div.innerHTML = svg; console.log(div.innerHTML); - bindFunctions(div); + bindFunctions?.(div); } } }; From 526b35c602129ede7490d322bcc3d363b7f35909 Mon Sep 17 00:00:00 2001 From: Sidharth Vinod Date: Tue, 5 Aug 2025 22:30:45 +0530 Subject: [PATCH 102/143] test: Architecture XSS --- cypress/helpers/util.ts | 2 +- cypress/integration/other/xss.spec.js | 13 ++++++++++++- 2 files changed, 13 insertions(+), 2 deletions(-) diff --git a/cypress/helpers/util.ts b/cypress/helpers/util.ts index 81b7036af..a1291fa30 100644 --- a/cypress/helpers/util.ts +++ b/cypress/helpers/util.ts @@ -14,7 +14,7 @@ interface CodeObject { mermaid: CypressMermaidConfig; } -const utf8ToB64 = (str: string): string => { +export const utf8ToB64 = (str: string): string => { return Buffer.from(decodeURIComponent(encodeURIComponent(str))).toString('base64'); }; diff --git a/cypress/integration/other/xss.spec.js b/cypress/integration/other/xss.spec.js index 1e51d2f23..b2f629935 100644 --- a/cypress/integration/other/xss.spec.js +++ b/cypress/integration/other/xss.spec.js @@ -1,4 +1,4 @@ -import { mermaidUrl } from '../../helpers/util.ts'; +import { imgSnapshotTest, mermaidUrl, utf8ToB64 } from '../../helpers/util.ts'; describe('XSS', () => { it('should handle xss in tags', () => { const str = @@ -141,4 +141,15 @@ describe('XSS', () => { cy.wait(1000); cy.get('#the-malware').should('not.exist'); }); + + it('should sanitize icon labels in architecture diagrams', () => { + const str = JSON.stringify({ + code: `architecture-beta + group api(cloud)[API] + service db "" [Database] in api`, + }); + imgSnapshotTest(utf8ToB64(str), {}, true); + cy.wait(1000); + cy.get('#the-malware').should('not.exist'); + }); }); From c61a431e2d663ead577cb24fa3c9a6bd846d9061 Mon Sep 17 00:00:00 2001 From: Sidharth Vinod Date: Tue, 5 Aug 2025 22:32:38 +0530 Subject: [PATCH 103/143] fix: Sanitize iconText --- packages/mermaid/src/diagrams/architecture/svgDraw.ts | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/packages/mermaid/src/diagrams/architecture/svgDraw.ts b/packages/mermaid/src/diagrams/architecture/svgDraw.ts index f384defd8..6e470caa2 100644 --- a/packages/mermaid/src/diagrams/architecture/svgDraw.ts +++ b/packages/mermaid/src/diagrams/architecture/svgDraw.ts @@ -3,6 +3,7 @@ import { getConfig } from '../../diagram-api/diagramAPI.js'; import { createText } from '../../rendering-util/createText.js'; import { getIconSVG } from '../../rendering-util/icons.js'; import type { D3Element } from '../../types.js'; +import { sanitizeText } from '../common/common.js'; import type { ArchitectureDB } from './architectureDb.js'; import { architectureIcons } from './architectureIcons.js'; import { @@ -271,6 +272,7 @@ export const drawServices = async function ( elem: D3Element, services: ArchitectureService[] ): Promise { + const config = getConfig(); for (const service of services) { const serviceElem = elem.append('g'); const iconSize = db.getConfigField('iconSize'); @@ -285,7 +287,7 @@ export const drawServices = async function ( width: iconSize * 1.5, classes: 'architecture-service-label', }, - getConfig() + config ); textElem @@ -320,7 +322,7 @@ export const drawServices = async function ( .attr('class', 'node-icon-text') .attr('style', `height: ${iconSize}px;`) .append('div') - .html(service.iconText); + .html(sanitizeText(service.iconText, config)); const fontSize = parseInt( window From ecf7ab435542107579fadcba8f594cc71edd37d2 Mon Sep 17 00:00:00 2001 From: Sidharth Vinod Date: Tue, 5 Aug 2025 22:33:05 +0530 Subject: [PATCH 104/143] fix: Sanitize getIconSVG --- packages/mermaid/src/rendering-util/icons.ts | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/packages/mermaid/src/rendering-util/icons.ts b/packages/mermaid/src/rendering-util/icons.ts index 50b1bbeb9..65f35bc62 100644 --- a/packages/mermaid/src/rendering-util/icons.ts +++ b/packages/mermaid/src/rendering-util/icons.ts @@ -1,7 +1,9 @@ -import { log } from '../logger.js'; import type { ExtendedIconifyIcon, IconifyIcon, IconifyJSON } from '@iconify/types'; import type { IconifyIconCustomisations } from '@iconify/utils'; import { getIconData, iconToHTML, iconToSVG, replaceIDs, stringToIcon } from '@iconify/utils'; +import { getConfig } from '../config.js'; +import { sanitizeText } from '../diagrams/common/common.js'; +import { log } from '../logger.js'; interface AsyncIconLoader { name: string; @@ -100,5 +102,5 @@ export const getIconSVG = async ( ...renderData.attributes, ...extraAttributes, }); - return svg; + return sanitizeText(svg, getConfig()); }; From 8d79bc9b195e5cfa2f31649d622024670886edff Mon Sep 17 00:00:00 2001 From: Sidharth Vinod Date: Tue, 5 Aug 2025 22:36:28 +0530 Subject: [PATCH 105/143] test: check katex sanitization --- cypress/helpers/util.ts | 8 +++----- cypress/integration/other/xss.spec.js | 13 ++++++++++++- cypress/platform/viewer.js | 4 ++-- 3 files changed, 17 insertions(+), 8 deletions(-) diff --git a/cypress/helpers/util.ts b/cypress/helpers/util.ts index 81b7036af..ab4bbef64 100644 --- a/cypress/helpers/util.ts +++ b/cypress/helpers/util.ts @@ -14,7 +14,7 @@ interface CodeObject { mermaid: CypressMermaidConfig; } -const utf8ToB64 = (str: string): string => { +export const utf8ToB64 = (str: string): string => { return Buffer.from(decodeURIComponent(encodeURIComponent(str))).toString('base64'); }; @@ -22,7 +22,7 @@ const batchId: string = 'mermaid-batch-' + (Cypress.env('useAppli') ? Date.now().toString() - : Cypress.env('CYPRESS_COMMIT') || Date.now().toString()); + : (Cypress.env('CYPRESS_COMMIT') ?? Date.now().toString())); export const mermaidUrl = ( graphStr: string | string[], @@ -61,9 +61,7 @@ export const imgSnapshotTest = ( sequence: { ...(_options.sequence ?? {}), actorFontFamily: 'courier', - noteFontFamily: _options.sequence?.noteFontFamily - ? _options.sequence.noteFontFamily - : 'courier', + noteFontFamily: _options.sequence?.noteFontFamily ?? 'courier', messageFontFamily: 'courier', }, }; diff --git a/cypress/integration/other/xss.spec.js b/cypress/integration/other/xss.spec.js index 1e51d2f23..7e286876b 100644 --- a/cypress/integration/other/xss.spec.js +++ b/cypress/integration/other/xss.spec.js @@ -1,4 +1,4 @@ -import { mermaidUrl } from '../../helpers/util.ts'; +import { imgSnapshotTest, mermaidUrl, utf8ToB64 } from '../../helpers/util.ts'; describe('XSS', () => { it('should handle xss in tags', () => { const str = @@ -141,4 +141,15 @@ describe('XSS', () => { cy.wait(1000); cy.get('#the-malware').should('not.exist'); }); + + it('should sanitize katex blocks', () => { + const str = JSON.stringify({ + code: `sequenceDiagram + participant A as Alice$$\\text{Alice}$$ + A->>John: Hello John, how are you?`, + }); + imgSnapshotTest(utf8ToB64(str), {}, true); + cy.wait(1000); + cy.get('#the-malware').should('not.exist'); + }); }); diff --git a/cypress/platform/viewer.js b/cypress/platform/viewer.js index e120469fe..7ff95e163 100644 --- a/cypress/platform/viewer.js +++ b/cypress/platform/viewer.js @@ -182,7 +182,7 @@ const contentLoadedApi = async function () { for (let i = 0; i < numCodes; i++) { const { svg, bindFunctions } = await mermaid.render('newid' + i, graphObj.code[i], divs[i]); div.innerHTML = svg; - bindFunctions(div); + bindFunctions?.(div); } } else { const div = document.createElement('div'); @@ -194,7 +194,7 @@ const contentLoadedApi = async function () { const { svg, bindFunctions } = await mermaid.render('newid', graphObj.code, div); div.innerHTML = svg; console.log(div.innerHTML); - bindFunctions(div); + bindFunctions?.(div); } } }; From 12e01bdb5cacf3569133979a5a4f1d8973e9aec1 Mon Sep 17 00:00:00 2001 From: Sidharth Vinod Date: Tue, 5 Aug 2025 22:41:10 +0530 Subject: [PATCH 106/143] docs: Add changeset --- .changeset/good-weeks-tickle.md | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 .changeset/good-weeks-tickle.md diff --git a/.changeset/good-weeks-tickle.md b/.changeset/good-weeks-tickle.md new file mode 100644 index 000000000..723e5932b --- /dev/null +++ b/.changeset/good-weeks-tickle.md @@ -0,0 +1,5 @@ +--- +'mermaid': patch +--- + +fix: sanitize icon labels and icon SVGs From 0133f1c0c5cff4fc4c8e0b99e9cf0b3d49dcbe71 Mon Sep 17 00:00:00 2001 From: Sidharth Vinod Date: Tue, 5 Aug 2025 22:42:13 +0530 Subject: [PATCH 107/143] docs: Add changeset --- .changeset/tidy-weeks-play.md | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 .changeset/tidy-weeks-play.md diff --git a/.changeset/tidy-weeks-play.md b/.changeset/tidy-weeks-play.md new file mode 100644 index 000000000..8c36f70b0 --- /dev/null +++ b/.changeset/tidy-weeks-play.md @@ -0,0 +1,5 @@ +--- +'mermaid': patch +--- + +fix: sanitize KATEX blocks From 3256807d25dc2d418171c1f3a3c00856e31e50a9 Mon Sep 17 00:00:00 2001 From: Sidharth Vinod Date: Tue, 5 Aug 2025 22:44:58 +0530 Subject: [PATCH 108/143] chore: Add @fourcube in changeset --- .changeset/tidy-weeks-play.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.changeset/tidy-weeks-play.md b/.changeset/tidy-weeks-play.md index 8c36f70b0..987171995 100644 --- a/.changeset/tidy-weeks-play.md +++ b/.changeset/tidy-weeks-play.md @@ -3,3 +3,5 @@ --- fix: sanitize KATEX blocks + +Resolves issue reported by @fourcube From c99bce6bab4c7ce0b81b66d44f44853ce4aeb1c3 Mon Sep 17 00:00:00 2001 From: Krishna Upadhyay <24423580+kriss-u@users.noreply.github.com> Date: Mon, 4 Aug 2025 16:56:55 -0500 Subject: [PATCH 109/143] fix: add classLiteral to the language for class diagram namespace --- .changeset/rare-women-fly.md | 5 +++++ cypress/integration/rendering/classDiagram.spec.js | 13 +++++++++++++ .../mermaid/src/diagrams/class/parser/class.spec.js | 8 ++++++++ .../src/diagrams/class/parser/classDiagram.jison | 1 + 4 files changed, 27 insertions(+) create mode 100644 .changeset/rare-women-fly.md diff --git a/.changeset/rare-women-fly.md b/.changeset/rare-women-fly.md new file mode 100644 index 000000000..46d08dd10 --- /dev/null +++ b/.changeset/rare-women-fly.md @@ -0,0 +1,5 @@ +--- +'mermaid': patch +--- + +fix: Add escaped class literal name on namespace diff --git a/cypress/integration/rendering/classDiagram.spec.js b/cypress/integration/rendering/classDiagram.spec.js index f66a2d6f3..bd2a96b34 100644 --- a/cypress/integration/rendering/classDiagram.spec.js +++ b/cypress/integration/rendering/classDiagram.spec.js @@ -512,4 +512,17 @@ describe('Class diagram', () => { ); }); }); + + it('should handle backticks for namespace and class names', () => { + imgSnapshotTest( + ` + classDiagram + namespace \`A::B\` { + class \`IPC::Sender\` + } + RenderProcessHost --|> \`IPC::Sender\` + `, + {} + ); + }); }); diff --git a/packages/mermaid/src/diagrams/class/parser/class.spec.js b/packages/mermaid/src/diagrams/class/parser/class.spec.js index fe0077a29..7d4922561 100644 --- a/packages/mermaid/src/diagrams/class/parser/class.spec.js +++ b/packages/mermaid/src/diagrams/class/parser/class.spec.js @@ -15,4 +15,12 @@ describe('class diagram', function () { expect(() => parser.parse(`classDiagram\nnamespace ${prop} {\n\tclass A\n}`)).not.toThrow(); }); }); + + describe('backtick escaping', function () { + it('should handle backtick-quoted namespace names', function () { + expect(() => + parser.parse(`classDiagram\nnamespace \`A::B\` {\n\tclass \`IPC::Sender\`\n}`) + ).not.toThrow(); + }); + }); }); diff --git a/packages/mermaid/src/diagrams/class/parser/classDiagram.jison b/packages/mermaid/src/diagrams/class/parser/classDiagram.jison index 83d9bd48e..0f971c8b9 100644 --- a/packages/mermaid/src/diagrams/class/parser/classDiagram.jison +++ b/packages/mermaid/src/diagrams/class/parser/classDiagram.jison @@ -242,6 +242,7 @@ classLabel namespaceName : alphaNumToken { $$=$1; } + | classLiteralName { $$=$1; } | alphaNumToken DOT namespaceName { $$=$1+'.'+$3; } | alphaNumToken namespaceName { $$=$1+$2; } ; From e32e80ea7f57e5fef02aea68de585ddb4e3dd14a Mon Sep 17 00:00:00 2001 From: Sidharth Vinod Date: Tue, 5 Aug 2025 10:17:21 -0700 Subject: [PATCH 110/143] chore: Add @fourcube in changeset --- .changeset/good-weeks-tickle.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.changeset/good-weeks-tickle.md b/.changeset/good-weeks-tickle.md index 723e5932b..9210c54e0 100644 --- a/.changeset/good-weeks-tickle.md +++ b/.changeset/good-weeks-tickle.md @@ -3,3 +3,6 @@ --- fix: sanitize icon labels and icon SVGs + +Resolves issue reported by @fourcube + From 7a1530d91160912a633cb7cc878135620de63b0d Mon Sep 17 00:00:00 2001 From: Alois Klink Date: Wed, 6 Aug 2025 22:26:30 +0800 Subject: [PATCH 111/143] refactor: remove unnecessary `Element` check [DOMPurify v3.2.2][1] narrowed down the types of these hooks so that these are known to have the `Element` type, which means checking the type of these at runtime is unnecessary. [1]: https://github.com/cure53/DOMPurify/releases/tag/3.2.2 See: fe3cffbb673a25b81989aacb06e5d0eda35326db See: https://github.com/cure53/DOMPurify/commit/4cdfd1ffef091823d72d91cc78616eb7070b22a0 --- packages/mermaid/src/diagrams/common/common.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/mermaid/src/diagrams/common/common.ts b/packages/mermaid/src/diagrams/common/common.ts index 00c9b8313..4b73bb02f 100644 --- a/packages/mermaid/src/diagrams/common/common.ts +++ b/packages/mermaid/src/diagrams/common/common.ts @@ -33,13 +33,13 @@ function setupDompurifyHooks() { const TEMPORARY_ATTRIBUTE = 'data-temp-href-target'; DOMPurify.addHook('beforeSanitizeAttributes', (node) => { - if (node instanceof Element && node.tagName === 'A' && node.hasAttribute('target')) { + if (node.tagName === 'A' && node.hasAttribute('target')) { node.setAttribute(TEMPORARY_ATTRIBUTE, node.getAttribute('target') ?? ''); } }); DOMPurify.addHook('afterSanitizeAttributes', (node) => { - if (node instanceof Element && node.tagName === 'A' && node.hasAttribute(TEMPORARY_ATTRIBUTE)) { + if (node.tagName === 'A' && node.hasAttribute(TEMPORARY_ATTRIBUTE)) { node.setAttribute('target', node.getAttribute(TEMPORARY_ATTRIBUTE) ?? ''); node.removeAttribute(TEMPORARY_ATTRIBUTE); if (node.getAttribute('target') === '_blank') { From f5445b266e7523c10ceca517d0cda6667ca2cf8a Mon Sep 17 00:00:00 2001 From: darshanr0107 Date: Wed, 6 Aug 2025 20:01:28 +0530 Subject: [PATCH 112/143] fix: incorrect arrow direction in block direction on-behalf-of: @Mermaid-Chart --- cypress/integration/rendering/block.spec.js | 21 +++++++++++++++++++ .../mermaid/src/diagrams/block/blockDB.ts | 10 +++++---- 2 files changed, 27 insertions(+), 4 deletions(-) diff --git a/cypress/integration/rendering/block.spec.js b/cypress/integration/rendering/block.spec.js index f01d59375..cdaad90d4 100644 --- a/cypress/integration/rendering/block.spec.js +++ b/cypress/integration/rendering/block.spec.js @@ -393,6 +393,27 @@ describe('Block diagram', () => { overflow:3 short:1 also_overflow:2 +`, + {} + ); + }); + + it('BL31: edge without arrow syntax should render with no arrowheads', () => { + imgSnapshotTest( + `block-beta + a + b + a --- b +`, + {} + ); + }); + it('BL32: edge with arrow syntax should render with arrowheads', () => { + imgSnapshotTest( + `block-beta + a + b + a --> b `, {} ); diff --git a/packages/mermaid/src/diagrams/block/blockDB.ts b/packages/mermaid/src/diagrams/block/blockDB.ts index 39a8b47a0..b291be61e 100644 --- a/packages/mermaid/src/diagrams/block/blockDB.ts +++ b/packages/mermaid/src/diagrams/block/blockDB.ts @@ -238,13 +238,15 @@ export function edgeTypeStr2Type(typeStr: string): string { } export function edgeStrToEdgeData(typeStr: string): string { - switch (typeStr.trim()) { - case '--x': + switch (typeStr.replace(/^[\s-]+|[\s-]+$/g, '')) { + case 'x': return 'arrow_cross'; - case '--o': + case 'o': return 'arrow_circle'; - default: + case '>': return 'arrow_point'; + default: + return ''; } } From 9258b2933bbe1ef41087345ffea3731673671c49 Mon Sep 17 00:00:00 2001 From: darshanr0107 Date: Wed, 6 Aug 2025 20:05:35 +0530 Subject: [PATCH 113/143] add changeset on-behalf-of: @Mermaid-Chart --- .changeset/strong-dryers-pay.md | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 .changeset/strong-dryers-pay.md diff --git a/.changeset/strong-dryers-pay.md b/.changeset/strong-dryers-pay.md new file mode 100644 index 000000000..495cde202 --- /dev/null +++ b/.changeset/strong-dryers-pay.md @@ -0,0 +1,5 @@ +--- +'mermaid': patch +--- + +fix: correctly render non-directional lines for '---' in block diagrams From 165ffefad59b6a80e95af0a6e6a9f42024a7aa89 Mon Sep 17 00:00:00 2001 From: darshanr0107 Date: Thu, 7 Aug 2025 12:09:49 +0530 Subject: [PATCH 114/143] chore: remove unnecessary test case on-behalf-of: @Mermaid-Chart --- cypress/integration/rendering/block.spec.js | 10 ---------- 1 file changed, 10 deletions(-) diff --git a/cypress/integration/rendering/block.spec.js b/cypress/integration/rendering/block.spec.js index cdaad90d4..180c0093d 100644 --- a/cypress/integration/rendering/block.spec.js +++ b/cypress/integration/rendering/block.spec.js @@ -404,16 +404,6 @@ describe('Block diagram', () => { a b a --- b -`, - {} - ); - }); - it('BL32: edge with arrow syntax should render with arrowheads', () => { - imgSnapshotTest( - `block-beta - a - b - a --> b `, {} ); From e1e36dfcb3eee1cd7a0ee3de1810718f545b4b26 Mon Sep 17 00:00:00 2001 From: Sidharth Vinod Date: Thu, 7 Aug 2025 13:37:54 +0530 Subject: [PATCH 115/143] chore: Add CVE ID --- .changeset/tidy-weeks-play.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.changeset/tidy-weeks-play.md b/.changeset/tidy-weeks-play.md index 987171995..266f57552 100644 --- a/.changeset/tidy-weeks-play.md +++ b/.changeset/tidy-weeks-play.md @@ -4,4 +4,4 @@ fix: sanitize KATEX blocks -Resolves issue reported by @fourcube +Resolves CVE-2025-54881 reported by @fourcube From 20a18971ea6425aa7f083d0f62ea652f7ec8d1ed Mon Sep 17 00:00:00 2001 From: Sidharth Vinod Date: Thu, 7 Aug 2025 13:39:01 +0530 Subject: [PATCH 116/143] chore: Add CVE ID --- .changeset/good-weeks-tickle.md | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/.changeset/good-weeks-tickle.md b/.changeset/good-weeks-tickle.md index 9210c54e0..97c0c3660 100644 --- a/.changeset/good-weeks-tickle.md +++ b/.changeset/good-weeks-tickle.md @@ -4,5 +4,4 @@ fix: sanitize icon labels and icon SVGs -Resolves issue reported by @fourcube - +Resolves CVE-2025-54880 reported by @fourcube From cfc76ef1cb7eb31c3c1b3b1a3aec30b4f4433d74 Mon Sep 17 00:00:00 2001 From: Sidharth Vinod Date: Thu, 7 Aug 2025 22:49:39 +0530 Subject: [PATCH 117/143] fix: sanitize HTML for spans --- .../mermaid/src/rendering-util/createText.ts | 41 +++++++++++-------- 1 file changed, 23 insertions(+), 18 deletions(-) diff --git a/packages/mermaid/src/rendering-util/createText.ts b/packages/mermaid/src/rendering-util/createText.ts index 65129aa8a..9b9c9d574 100644 --- a/packages/mermaid/src/rendering-util/createText.ts +++ b/packages/mermaid/src/rendering-util/createText.ts @@ -2,9 +2,8 @@ // @ts-nocheck TODO: Fix types import { select } from 'd3'; import type { MermaidConfig } from '../config.type.js'; -import { getConfig, sanitizeText } from '../diagram-api/diagramAPI.js'; import type { SVGGroup } from '../diagram-api/types.js'; -import common, { hasKatex, renderKatexSanitized } from '../diagrams/common/common.js'; +import common, { hasKatex, renderKatexSanitized, sanitizeText } from '../diagrams/common/common.js'; import type { D3TSpanElement, D3TextElement } from '../diagrams/common/commonTypes.js'; import { log } from '../logger.js'; import { markdownToHTML, markdownToLines } from '../rendering-util/handle-markdown-text.js'; @@ -19,7 +18,15 @@ function applyStyle(dom, styleFn) { } } -async function addHtmlSpan(element, node, width, classes, addBackground = false) { +async function addHtmlSpan( + element, + node, + width, + classes, + addBackground = false, + // TODO: Make config mandatory + config: MermaidConfig = {} +) { const fo = element.append('foreignObject'); // This is not the final width but used in order to make sure the foreign // object in firefox gets a width at all. The final width is fetched from the div @@ -27,16 +34,12 @@ async function addHtmlSpan(element, node, width, classes, addBackground = false) fo.attr('height', `${10 * width}px`); const div = fo.append('xhtml:div'); - let label = node.label; - if (node.label && hasKatex(node.label)) { - label = await renderKatexSanitized( - node.label.replace(common.lineBreakRegex, '\n'), - getConfig() - ); - } + const sanitizedLabel = hasKatex(label) + ? await renderKatexSanitized(node.label.replace(common.lineBreakRegex, '\n'), config) + : sanitizeText(label, config); const labelClass = node.isNode ? 'nodeLabel' : 'edgeLabel'; const span = div.append('span'); - span.html(label); + span.html(sanitizedLabel); applyStyle(span, node.labelStyle); span.attr('class', `${labelClass} ${classes}`); @@ -59,9 +62,6 @@ async function addHtmlSpan(element, node, width, classes, addBackground = false) bbox = div.node().getBoundingClientRect(); } - // fo.style('width', bbox.width); - // fo.style('height', bbox.height); - return fo.node(); } @@ -184,9 +184,14 @@ function updateTextContentAndStyles(tspan: any, wrappedLine: MarkdownWord[]) { /** * Convert fontawesome labels into fontawesome icons by using a regex pattern * @param text - The raw string to convert + * @param config - Mermaid config * @returns string with fontawesome icons as svg if the icon is registered otherwise as i tags */ -export async function replaceIconSubstring(text: string) { +export async function replaceIconSubstring( + text: string, + // TODO: Make config mandatory + config: MermaidConfig = {} +): Promise { const pendingReplacements: Promise[] = []; // cspell: disable-next-line text.replace(/(fa[bklrs]?):fa-([\w-]+)/g, (fullMatch, prefix, iconName) => { @@ -196,7 +201,7 @@ export async function replaceIconSubstring(text: string) { if (await isIconAvailable(registeredIconName)) { return await getIconSVG(registeredIconName, undefined, { class: 'label-icon' }); } else { - return ``; + return ``; } })() ); @@ -239,7 +244,7 @@ export const createText = async ( // TODO: addHtmlLabel accepts a labelStyle. Do we possibly have that? const htmlText = markdownToHTML(text, config); - const decodedReplacedText = await replaceIconSubstring(decodeEntities(htmlText)); + const decodedReplacedText = await replaceIconSubstring(decodeEntities(htmlText), config); //for Katex the text could contain escaped characters, \\relax that should be transformed to \relax const inputForKatex = text.replace(/\\\\/g, '\\'); @@ -249,7 +254,7 @@ export const createText = async ( label: hasKatex(text) ? inputForKatex : decodedReplacedText, labelStyle: style.replace('fill:', 'color:'), }; - const vertexNode = await addHtmlSpan(el, node, width, classes, addSvgBackground); + const vertexNode = await addHtmlSpan(el, node, width, classes, addSvgBackground, config); return vertexNode; } else { //sometimes the user might add br tags with 1 or more spaces in between, so we need to replace them with
From e539909e87a9c07ed9ba879bc8487b2acdbc3c85 Mon Sep 17 00:00:00 2001 From: Sidharth Vinod Date: Fri, 8 Aug 2025 12:54:26 +0530 Subject: [PATCH 118/143] fix: Label in addHtmlSpan --- packages/mermaid/src/rendering-util/createText.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/mermaid/src/rendering-util/createText.ts b/packages/mermaid/src/rendering-util/createText.ts index 9b9c9d574..47f8bb98b 100644 --- a/packages/mermaid/src/rendering-util/createText.ts +++ b/packages/mermaid/src/rendering-util/createText.ts @@ -34,9 +34,9 @@ async function addHtmlSpan( fo.attr('height', `${10 * width}px`); const div = fo.append('xhtml:div'); - const sanitizedLabel = hasKatex(label) + const sanitizedLabel = hasKatex(node.label) ? await renderKatexSanitized(node.label.replace(common.lineBreakRegex, '\n'), config) - : sanitizeText(label, config); + : sanitizeText(node.label, config); const labelClass = node.isNode ? 'nodeLabel' : 'edgeLabel'; const span = div.append('span'); span.html(sanitizedLabel); From 096fbe933e555dacb8c0f0173e419bde95052691 Mon Sep 17 00:00:00 2001 From: Sidharth Vinod Date: Fri, 8 Aug 2025 12:55:18 +0530 Subject: [PATCH 119/143] test: Verify label is sanitized Co-authored-by: Chris Grieger --- cypress/integration/other/xss.spec.js | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/cypress/integration/other/xss.spec.js b/cypress/integration/other/xss.spec.js index 7e286876b..603e75f5d 100644 --- a/cypress/integration/other/xss.spec.js +++ b/cypress/integration/other/xss.spec.js @@ -152,4 +152,15 @@ describe('XSS', () => { cy.wait(1000); cy.get('#the-malware').should('not.exist'); }); + + it('should sanitize labels', () => { + const str = JSON.stringify({ + code: `erDiagram + "" ||--|| ENTITY2 : "" + `, + }); + imgSnapshotTest(utf8ToB64(str), {}, true); + cy.wait(1000); + cy.get('#the-malware').should('not.exist'); + }); }); From 5af489d8ddd0b8d7c2f6f5fd4db70b935ff51693 Mon Sep 17 00:00:00 2001 From: saurabhg772244 Date: Fri, 8 Aug 2025 14:17:09 +0530 Subject: [PATCH 120/143] Fix border style for hand drawn shapes --- .../shapes/handDrawnShapeStyles.ts | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/packages/mermaid/src/rendering-util/rendering-elements/shapes/handDrawnShapeStyles.ts b/packages/mermaid/src/rendering-util/rendering-elements/shapes/handDrawnShapeStyles.ts index 99dedd919..16a201e14 100644 --- a/packages/mermaid/src/rendering-util/rendering-elements/shapes/handDrawnShapeStyles.ts +++ b/packages/mermaid/src/rendering-util/rendering-elements/shapes/handDrawnShapeStyles.ts @@ -104,8 +104,23 @@ export const userNodeOverrides = (node: Node, options: any) => { seed: handDrawnSeed, strokeWidth: stylesMap.get('stroke-width')?.replace('px', '') || 1.3, fillLineDash: [0, 0], + strokeLineDash: getStrokeDashArray(stylesMap.get('stroke-dasharray')), }, options ); return result; }; + +const getStrokeDashArray = (strokeDasharrayStyle?: string) => { + if (!strokeDasharrayStyle) { + return [0, 0]; + } + const dashArray = strokeDasharrayStyle.trim().split(/\s+/).map(Number); + if (dashArray.length === 1) { + const val = isNaN(dashArray[0]) ? 0 : dashArray[0]; + return [val, val]; + } + const first = isNaN(dashArray[0]) ? 0 : dashArray[0]; + const second = isNaN(dashArray[1]) ? 0 : dashArray[1]; + return [first, second]; +}; From 4d62d5963238400270e9314c6e4d506f48147074 Mon Sep 17 00:00:00 2001 From: saurabhg772244 Date: Fri, 8 Aug 2025 14:19:03 +0530 Subject: [PATCH 121/143] added changeset --- .changeset/six-planets-rescue.md | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 .changeset/six-planets-rescue.md diff --git a/.changeset/six-planets-rescue.md b/.changeset/six-planets-rescue.md new file mode 100644 index 000000000..8b04a69ed --- /dev/null +++ b/.changeset/six-planets-rescue.md @@ -0,0 +1,5 @@ +--- +'mermaid': patch +--- + +fix: node border style for handdrawn shapes From aeaf626bb575d923c482c58fc4a827934570e8e4 Mon Sep 17 00:00:00 2001 From: Sidharth Vinod Date: Fri, 8 Aug 2025 18:59:47 +0530 Subject: [PATCH 122/143] fix: Sanitize check in unit test --- packages/mermaid/src/rendering-util/createText.spec.ts | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/packages/mermaid/src/rendering-util/createText.spec.ts b/packages/mermaid/src/rendering-util/createText.spec.ts index e2e13ef7d..dd7bc00b6 100644 --- a/packages/mermaid/src/rendering-util/createText.spec.ts +++ b/packages/mermaid/src/rendering-util/createText.spec.ts @@ -1,6 +1,7 @@ import { describe, expect, it } from 'vitest'; -import { replaceIconSubstring } from './createText.js'; +import { sanitizeText } from '../diagram-api/diagramAPI.js'; import mermaid from '../mermaid.js'; +import { replaceIconSubstring } from './createText.js'; describe('replaceIconSubstring', () => { it('converts FontAwesome icon notations to HTML tags', async () => { @@ -56,7 +57,7 @@ describe('replaceIconSubstring', () => { ]); const input = 'Icons galore: fa:fa-bell'; const output = await replaceIconSubstring(input); - const expected = staticBellIconPack.icons.bell.body; + const expected = sanitizeText(staticBellIconPack.icons.bell.body); expect(output).toContain(expected); }); }); From bb2d6973ba3b6c22c239dfaa99fc564aec108d09 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 11 Aug 2025 02:12:30 +0000 Subject: [PATCH 123/143] chore(deps): update peter-evans/create-pull-request digest to 1310d7d --- .github/workflows/e2e-timings.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/e2e-timings.yml b/.github/workflows/e2e-timings.yml index ef009fa2b..f4c28acad 100644 --- a/.github/workflows/e2e-timings.yml +++ b/.github/workflows/e2e-timings.yml @@ -58,7 +58,7 @@ jobs: echo "EOF" >> $GITHUB_OUTPUT - name: Commit and create pull request - uses: peter-evans/create-pull-request@07cbaebb4bfc9c5d7db426ea5a5f585df29dd0a0 + uses: peter-evans/create-pull-request@1310d7dab503600742045e6fd4b84dda64352858 with: add-paths: | cypress/timings.json From 4f24489d8148dfd78d5586274c51280025976379 Mon Sep 17 00:00:00 2001 From: anderium <33520919+anderium@users.noreply.github.com> Date: Wed, 13 Aug 2025 01:47:25 +0200 Subject: [PATCH 124/143] Make elk not force model order, but strongly consider it instead This improves the ordering in models with crossings that can be resolved by reordering nodes. It keeps the node order to still avoid #6647 which cause this regression to be introduced. [See this example on the ELK Editor.](https://rtsys.informatik.uni-kiel.de/elklive/elkgraph.html?compressedContent=IYGw5g9gTglgLgCwLYC4AEJgE8CmUcAmAUAPQloDGUEAzjTAHZgCyjMSMAXsHDBAwDoAZtAo4AchAI5mUnCADyUaVHRwoAVxxEK-eitnTFyvAJrqeOMFnTiFAEQCiAZQD6AQXH3Xj+wHEXIlJyABUEGBo0CLQAI2ACNAB3BBwGNA16JjQRKDFJaUN5JRU1TRwBIIY5NAYABjQAbwxgGPk0ACJa9rQAXyIq6Rr3RubWkA7gbr6BnBqARhHMMY65qf7qhgAmRZa29s21mZqADR3l9uPDjYAhM72Yq8GGa+GmpfuBVd71p+vbt9243aMQEB2+R2epwB5wAWmsiIQwLM6mgALQAPiGaARBCRNXqGPmQURyIWhK2xNxyOG5OulLxzzRmOe7hxDNutLpbORLyZNWux25-I5zMFQq2fIYYuCaGuGjgaEQ0RoCAgGhACVaaAA1jgAA4KxCzGjAJDlGUASQV+GgKkicAgaAAzAAaNAAFjdczd2xgQkoehgBjkxhUZgscCsNjQdnEjjQAAppEJgOq4ABKSrVABu9Whe1zj1m2YW+aBJaLaGz2zLHWrlezTru5adDfdzbr7vhJKrBMxJaFub51cHfarTtHw-dRCAA) --- packages/mermaid-layout-elk/src/render.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/mermaid-layout-elk/src/render.ts b/packages/mermaid-layout-elk/src/render.ts index 9f361bf7b..c3799fedd 100644 --- a/packages/mermaid-layout-elk/src/render.ts +++ b/packages/mermaid-layout-elk/src/render.ts @@ -766,7 +766,7 @@ export const render = async ( id: 'root', layoutOptions: { 'elk.hierarchyHandling': 'INCLUDE_CHILDREN', - 'elk.layered.crossingMinimization.forceNodeModelOrder': true, + 'elk.layered.considerModelOrder.strategy': 'NODES_AND_EDGES', 'elk.algorithm': algorithm, 'nodePlacement.strategy': data4Layout.config.elk?.nodePlacementStrategy, 'elk.layered.mergeEdges': data4Layout.config.elk?.mergeEdges, From 657a9ef7857ce4696efcfa232eece7e382e826c4 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Wed, 13 Aug 2025 04:15:39 +0000 Subject: [PATCH 125/143] chore: update E2E timings --- cypress/timings.json | 108 +++++++++++++++++++++---------------------- 1 file changed, 54 insertions(+), 54 deletions(-) diff --git a/cypress/timings.json b/cypress/timings.json index 05263ad9f..50130f180 100644 --- a/cypress/timings.json +++ b/cypress/timings.json @@ -2,219 +2,219 @@ "durations": [ { "spec": "cypress/integration/other/configuration.spec.js", - "duration": 5672 + "duration": 5815 }, { "spec": "cypress/integration/other/external-diagrams.spec.js", - "duration": 1990 + "duration": 2035 }, { "spec": "cypress/integration/other/ghsa.spec.js", - "duration": 3186 + "duration": 3386 }, { "spec": "cypress/integration/other/iife.spec.js", - "duration": 1948 + "duration": 2089 }, { "spec": "cypress/integration/other/interaction.spec.js", - "duration": 11938 + "duration": 11578 }, { "spec": "cypress/integration/other/rerender.spec.js", - "duration": 1932 + "duration": 2119 }, { "spec": "cypress/integration/other/xss.spec.js", - "duration": 27237 + "duration": 27282 }, { "spec": "cypress/integration/rendering/appli.spec.js", - "duration": 3170 + "duration": 3377 }, { "spec": "cypress/integration/rendering/architecture.spec.ts", - "duration": 104 + "duration": 97 }, { "spec": "cypress/integration/rendering/block.spec.js", - "duration": 17390 + "duration": 18137 }, { "spec": "cypress/integration/rendering/c4.spec.js", - "duration": 5296 + "duration": 5455 }, { "spec": "cypress/integration/rendering/classDiagram-elk-v3.spec.js", - "duration": 39004 + "duration": 40850 }, { "spec": "cypress/integration/rendering/classDiagram-handDrawn-v3.spec.js", - "duration": 37653 + "duration": 37964 }, { "spec": "cypress/integration/rendering/classDiagram-v2.spec.js", - "duration": 23278 + "duration": 23446 }, { "spec": "cypress/integration/rendering/classDiagram-v3.spec.js", - "duration": 36645 + "duration": 37207 }, { "spec": "cypress/integration/rendering/classDiagram.spec.js", - "duration": 15418 + "duration": 16531 }, { "spec": "cypress/integration/rendering/conf-and-directives.spec.js", - "duration": 9684 + "duration": 9385 }, { "spec": "cypress/integration/rendering/current.spec.js", - "duration": 2570 + "duration": 2697 }, { "spec": "cypress/integration/rendering/erDiagram-unified.spec.js", - "duration": 84687 + "duration": 88648 }, { "spec": "cypress/integration/rendering/erDiagram.spec.js", - "duration": 14819 + "duration": 15094 }, { "spec": "cypress/integration/rendering/errorDiagram.spec.js", - "duration": 3371 + "duration": 3548 }, { "spec": "cypress/integration/rendering/flowchart-elk.spec.js", - "duration": 39925 + "duration": 44889 }, { "spec": "cypress/integration/rendering/flowchart-handDrawn.spec.js", - "duration": 34694 + "duration": 30487 }, { "spec": "cypress/integration/rendering/flowchart-icon.spec.js", - "duration": 7137 + "duration": 7375 }, { "spec": "cypress/integration/rendering/flowchart-shape-alias.spec.ts", - "duration": 24740 + "duration": 24913 }, { "spec": "cypress/integration/rendering/flowchart-v2.spec.js", - "duration": 42077 + "duration": 51927 }, { "spec": "cypress/integration/rendering/flowchart.spec.js", - "duration": 30642 + "duration": 31676 }, { "spec": "cypress/integration/rendering/gantt.spec.js", - "duration": 18085 + "duration": 19897 }, { "spec": "cypress/integration/rendering/gitGraph.spec.js", - "duration": 50107 + "duration": 53450 }, { "spec": "cypress/integration/rendering/iconShape.spec.ts", - "duration": 276279 + "duration": 287035 }, { "spec": "cypress/integration/rendering/imageShape.spec.ts", - "duration": 56505 + "duration": 58555 }, { "spec": "cypress/integration/rendering/info.spec.ts", - "duration": 3036 + "duration": 3179 }, { "spec": "cypress/integration/rendering/journey.spec.js", - "duration": 6889 + "duration": 7099 }, { "spec": "cypress/integration/rendering/kanban.spec.ts", - "duration": 7353 + "duration": 7628 }, { "spec": "cypress/integration/rendering/katex.spec.js", - "duration": 3580 + "duration": 3764 }, { "spec": "cypress/integration/rendering/marker_unique_id.spec.js", - "duration": 2508 + "duration": 2573 }, { "spec": "cypress/integration/rendering/mindmap.spec.ts", - "duration": 10939 + "duration": 11269 }, { "spec": "cypress/integration/rendering/newShapes.spec.ts", - "duration": 149102 + "duration": 148389 }, { "spec": "cypress/integration/rendering/oldShapes.spec.ts", - "duration": 113987 + "duration": 113395 }, { "spec": "cypress/integration/rendering/packet.spec.ts", - "duration": 4060 + "duration": 4714 }, { "spec": "cypress/integration/rendering/pie.spec.ts", - "duration": 5715 + "duration": 6446 }, { "spec": "cypress/integration/rendering/quadrantChart.spec.js", - "duration": 8945 + "duration": 9133 }, { "spec": "cypress/integration/rendering/radar.spec.js", - "duration": 5337 + "duration": 5544 }, { "spec": "cypress/integration/rendering/requirement.spec.js", - "duration": 2643 + "duration": 2709 }, { "spec": "cypress/integration/rendering/requirementDiagram-unified.spec.js", - "duration": 52072 + "duration": 55647 }, { "spec": "cypress/integration/rendering/sankey.spec.ts", - "duration": 6692 + "duration": 6751 }, { "spec": "cypress/integration/rendering/sequencediagram.spec.js", - "duration": 35721 + "duration": 36618 }, { "spec": "cypress/integration/rendering/stateDiagram-v2.spec.js", - "duration": 26030 + "duration": 29642 }, { "spec": "cypress/integration/rendering/stateDiagram.spec.js", - "duration": 16333 + "duration": 16037 }, { "spec": "cypress/integration/rendering/theme.spec.js", - "duration": 29287 + "duration": 30006 }, { "spec": "cypress/integration/rendering/timeline.spec.ts", - "duration": 8491 + "duration": 8451 }, { "spec": "cypress/integration/rendering/treemap.spec.ts", - "duration": 12291 + "duration": 11996 }, { "spec": "cypress/integration/rendering/xyChart.spec.js", - "duration": 20651 + "duration": 20627 }, { "spec": "cypress/integration/rendering/zenuml.spec.js", - "duration": 3218 + "duration": 3472 } ] } From 2260948b7bda08f00616c2ce678bed1da69eb96c Mon Sep 17 00:00:00 2001 From: anderium <33520919+anderium@users.noreply.github.com> Date: Wed, 13 Aug 2025 14:39:09 +0200 Subject: [PATCH 126/143] Add changeset and integration test --- .changeset/spicy-ties-see.md | 5 +++++ .../integration/rendering/flowchart-elk.spec.js | 15 +++++++++++++++ 2 files changed, 20 insertions(+) create mode 100644 .changeset/spicy-ties-see.md diff --git a/.changeset/spicy-ties-see.md b/.changeset/spicy-ties-see.md new file mode 100644 index 000000000..25fc643e0 --- /dev/null +++ b/.changeset/spicy-ties-see.md @@ -0,0 +1,5 @@ +--- +'@mermaid-js/layout-elk': patch +--- + +Make elk not force node model order, but strongly consider it instead diff --git a/cypress/integration/rendering/flowchart-elk.spec.js b/cypress/integration/rendering/flowchart-elk.spec.js index 27af2c40c..312e1d5b4 100644 --- a/cypress/integration/rendering/flowchart-elk.spec.js +++ b/cypress/integration/rendering/flowchart-elk.spec.js @@ -1053,6 +1053,21 @@ flowchart LR }); }); }); + + it('6647-elk: should keep node order when using elk layout unless it would add crossings', () => { + imgSnapshotTest( + `--- +config: + layout: elk +--- + flowchart TB + a --> a1 & a2 & a3 & a4 + b --> b1 & b2 + b2 --> b3 + b1 --> b4 + ` + ); + }); }); describe('Title and arrow styling #4813', () => { From 29edfa7f5688e0ac0848b0490454b3b11b3f9602 Mon Sep 17 00:00:00 2001 From: Sidharth Vinod Date: Wed, 13 Aug 2025 10:03:26 -0700 Subject: [PATCH 127/143] Apply suggestion from @sidharthv96 --- .lintstagedrc.mjs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.lintstagedrc.mjs b/.lintstagedrc.mjs index 3c5b860b3..951bc889c 100644 --- a/.lintstagedrc.mjs +++ b/.lintstagedrc.mjs @@ -7,6 +7,6 @@ export default { 'prettier --write', ], '.cspell/*.txt': ['tsx scripts/fixCSpell.ts'], - '**/*.md': ['pnpm dlx cspell'], + '**/*.md': ['pnpm cspell'], '**/*.jison': ['pnpm -w run lint:jison'], }; From d74013c64200125e2f61d49e9acf4517bcef9328 Mon Sep 17 00:00:00 2001 From: Sidharth Vinod Date: Thu, 14 Aug 2025 13:05:44 +0530 Subject: [PATCH 128/143] fix: Remove data loss when unsupported markdown is encountered --- .../mermaid/src/rendering-util/handle-markdown-text.spec.ts | 6 +++++- packages/mermaid/src/rendering-util/handle-markdown-text.ts | 4 +++- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/packages/mermaid/src/rendering-util/handle-markdown-text.spec.ts b/packages/mermaid/src/rendering-util/handle-markdown-text.spec.ts index 3ab4167a2..2000d58b8 100644 --- a/packages/mermaid/src/rendering-util/handle-markdown-text.spec.ts +++ b/packages/mermaid/src/rendering-util/handle-markdown-text.spec.ts @@ -285,7 +285,11 @@ test('markdownToHTML - Unsupported formatting', () => { - l1 - l2 - l3`) - ).toMatchInlineSnapshot('"

Hello

Unsupported markdown: list"'); + ).toMatchInlineSnapshot(` + "

Hello

- l1 + - l2 + - l3" + `); }); test('markdownToHTML - no auto wrapping', () => { diff --git a/packages/mermaid/src/rendering-util/handle-markdown-text.ts b/packages/mermaid/src/rendering-util/handle-markdown-text.ts index f898875cf..82e94c2c2 100644 --- a/packages/mermaid/src/rendering-util/handle-markdown-text.ts +++ b/packages/mermaid/src/rendering-util/handle-markdown-text.ts @@ -3,6 +3,7 @@ import { marked } from 'marked'; import { dedent } from 'ts-dedent'; import type { MarkdownLine, MarkdownWordType } from './types.js'; import type { MermaidConfig } from '../config.type.js'; +import { log } from '../logger.js'; /** * @param markdown - markdown to process @@ -89,7 +90,8 @@ export function markdownToHTML(markdown: string, { markdownAutoWrap }: MermaidCo } else if (node.type === 'escape') { return node.text; } - return `Unsupported markdown: ${node.type}`; + log.warn(`Unsupported markdown: ${node.type}`); + return node.raw; } return nodes.map(output).join(''); From da90f6760b6efb0da998bcb63b75eecc29e06c08 Mon Sep 17 00:00:00 2001 From: Sidharth Vinod Date: Thu, 14 Aug 2025 02:16:38 -0700 Subject: [PATCH 129/143] Create strong-laws-confess.md --- .changeset/strong-laws-confess.md | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 .changeset/strong-laws-confess.md diff --git a/.changeset/strong-laws-confess.md b/.changeset/strong-laws-confess.md new file mode 100644 index 000000000..79230b10c --- /dev/null +++ b/.changeset/strong-laws-confess.md @@ -0,0 +1,5 @@ +--- +"mermaid": patch +--- + +fix: Remove data loss when unsupported markdown is encountered From 7af6723ac0234105907cb3aecfef5ef95ff5617f Mon Sep 17 00:00:00 2001 From: Sidharth Vinod Date: Thu, 14 Aug 2025 14:48:37 +0530 Subject: [PATCH 130/143] test: Add E2E test for unsupported markdown --- .../integration/rendering/flowchart-v2.spec.js | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/cypress/integration/rendering/flowchart-v2.spec.js b/cypress/integration/rendering/flowchart-v2.spec.js index 69ff10b00..bafe40610 100644 --- a/cypress/integration/rendering/flowchart-v2.spec.js +++ b/cypress/integration/rendering/flowchart-v2.spec.js @@ -1164,4 +1164,20 @@ end ` ); }); + + it('should render raw strings for unsuported markdown', () => { + imgSnapshotTest( + `flowchart TB + mermaid{"What is\nyourmermaid version?"} --> v10["<11"] --"\`<**1**1\`"--> fine["No bug"] + mermaid --> v11[">= v11"] -- ">= v11" --> broken["Affected by https://github.com/mermaid-js/mermaid/issues/5824"] + subgraph subgraph1["\`How to fix **fix**\`"] + broken --> B["B"] + end + githost["Github, Gitlab, BitBucket, etc."] + githost2["\`Github, Gitlab, BitBucket, etc.\`"] + a["1."] + b["- x"] + ` + ); + }); }); From 60feec465beb92f2e8d396b49b640f9e40ac7567 Mon Sep 17 00:00:00 2001 From: "autofix-ci[bot]" <114827586+autofix-ci[bot]@users.noreply.github.com> Date: Thu, 14 Aug 2025 09:26:22 +0000 Subject: [PATCH 131/143] [autofix.ci] apply automated fixes --- .changeset/strong-laws-confess.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.changeset/strong-laws-confess.md b/.changeset/strong-laws-confess.md index 79230b10c..45ce775f2 100644 --- a/.changeset/strong-laws-confess.md +++ b/.changeset/strong-laws-confess.md @@ -1,5 +1,5 @@ --- -"mermaid": patch +'mermaid': patch --- fix: Remove data loss when unsupported markdown is encountered From 9c071a90645042431e131d92c9beb10d1cdbee4b Mon Sep 17 00:00:00 2001 From: Sidharth Vinod Date: Thu, 14 Aug 2025 15:47:29 +0530 Subject: [PATCH 132/143] chore: Modify changeset Co-authored-by: Alois Klink --- .changeset/strong-laws-confess.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.changeset/strong-laws-confess.md b/.changeset/strong-laws-confess.md index 45ce775f2..341fad46d 100644 --- a/.changeset/strong-laws-confess.md +++ b/.changeset/strong-laws-confess.md @@ -2,4 +2,4 @@ 'mermaid': patch --- -fix: Remove data loss when unsupported markdown is encountered +fix: fallback to raw text instead of rendering _Unsupported markdown_ From 52be254ad3b8cd2372b63180702ffce9a141eaa9 Mon Sep 17 00:00:00 2001 From: Sidharth Vinod Date: Thu, 14 Aug 2025 16:17:04 +0530 Subject: [PATCH 133/143] fix: fallback to raw text instead of rendering empty boxes when `htmlLabels: false` --- .../integration/rendering/flowchart-v2.spec.js | 16 +++++++++++----- .../src/rendering-util/handle-markdown-text.ts | 2 ++ 2 files changed, 13 insertions(+), 5 deletions(-) diff --git a/cypress/integration/rendering/flowchart-v2.spec.js b/cypress/integration/rendering/flowchart-v2.spec.js index bafe40610..6756c433d 100644 --- a/cypress/integration/rendering/flowchart-v2.spec.js +++ b/cypress/integration/rendering/flowchart-v2.spec.js @@ -1165,9 +1165,8 @@ end ); }); - it('should render raw strings for unsuported markdown', () => { - imgSnapshotTest( - `flowchart TB + describe('when rendering unsuported markdown', () => { + const graph = `flowchart TB mermaid{"What is\nyourmermaid version?"} --> v10["<11"] --"\`<**1**1\`"--> fine["No bug"] mermaid --> v11[">= v11"] -- ">= v11" --> broken["Affected by https://github.com/mermaid-js/mermaid/issues/5824"] subgraph subgraph1["\`How to fix **fix**\`"] @@ -1177,7 +1176,14 @@ end githost2["\`Github, Gitlab, BitBucket, etc.\`"] a["1."] b["- x"] - ` - ); + `; + + it('should render raw strings', () => { + imgSnapshotTest(graph); + }); + + it('should render raw strings with htmlLabels: false', () => { + imgSnapshotTest(graph, { htmlLabels: false }); + }); }); }); diff --git a/packages/mermaid/src/rendering-util/handle-markdown-text.ts b/packages/mermaid/src/rendering-util/handle-markdown-text.ts index 82e94c2c2..b20b334f4 100644 --- a/packages/mermaid/src/rendering-util/handle-markdown-text.ts +++ b/packages/mermaid/src/rendering-util/handle-markdown-text.ts @@ -62,6 +62,8 @@ export function markdownToLines(markdown: string, config: MermaidConfig = {}): M }); } else if (treeNode.type === 'html') { lines[currentLine].push({ content: treeNode.text, type: 'normal' }); + } else { + lines[currentLine].push({ content: treeNode.raw, type: 'normal' }); } }); From accb4c6369c77b5423e1f037a1d7504871615bc7 Mon Sep 17 00:00:00 2001 From: Sidharth Vinod Date: Thu, 14 Aug 2025 03:47:30 -0700 Subject: [PATCH 134/143] Update .changeset/strong-laws-confess.md Co-authored-by: Alois Klink --- .changeset/strong-laws-confess.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/.changeset/strong-laws-confess.md b/.changeset/strong-laws-confess.md index 341fad46d..49a242d59 100644 --- a/.changeset/strong-laws-confess.md +++ b/.changeset/strong-laws-confess.md @@ -3,3 +3,7 @@ --- fix: fallback to raw text instead of rendering _Unsupported markdown_ + +Instead of printing **Unsupported markdown: XXX** when using a markdown feature +that Mermaid does not yet support when `htmlLabels: true` (default), +fallback to the raw markdown text. From 6a6289f2aa81ef3661538e36941222d0738697ed Mon Sep 17 00:00:00 2001 From: Sidharth Vinod Date: Thu, 14 Aug 2025 16:18:45 +0530 Subject: [PATCH 135/143] chore: Modify changeset --- .changeset/strong-laws-confess.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.changeset/strong-laws-confess.md b/.changeset/strong-laws-confess.md index 49a242d59..be0621d10 100644 --- a/.changeset/strong-laws-confess.md +++ b/.changeset/strong-laws-confess.md @@ -2,8 +2,8 @@ 'mermaid': patch --- -fix: fallback to raw text instead of rendering _Unsupported markdown_ +fix: fallback to raw text instead of rendering _Unsupported markdown_ or empty blocks -Instead of printing **Unsupported markdown: XXX** when using a markdown feature -that Mermaid does not yet support when `htmlLabels: true` (default), +Instead of printing **Unsupported markdown: XXX**, or empty blocks when using a markdown feature +that Mermaid does not yet support when `htmlLabels: true`(default) or `htmlLabels: false`, fallback to the raw markdown text. From b9ef683fb67b8959abc455d6cc5266c37ba435f6 Mon Sep 17 00:00:00 2001 From: Knut Sveidqvist Date: Thu, 14 Aug 2025 12:56:20 +0200 Subject: [PATCH 136/143] #6856 Exposing elk configuration forceNodeModelOrder and considerModelOrder to the mermaid configuration --- .changeset/busy-clocks-melt.md | 6 + cypress/platform/knsv2.html | 16 + .../defaultConfig/variables/configKeys.md | 2 +- .../setup/mermaid/interfaces/MermaidConfig.md | 90 ++--- packages/mermaid-layout-elk/src/render.ts | 5 +- packages/mermaid/src/config.type.ts | 10 + packages/mermaid/src/defaultConfig.ts | 2 + .../mermaid/src/schemas/config.schema.yaml | 15 + pnpm-lock.yaml | 307 ++++++++++++------ 9 files changed, 310 insertions(+), 143 deletions(-) create mode 100644 .changeset/busy-clocks-melt.md diff --git a/.changeset/busy-clocks-melt.md b/.changeset/busy-clocks-melt.md new file mode 100644 index 000000000..bde4b81de --- /dev/null +++ b/.changeset/busy-clocks-melt.md @@ -0,0 +1,6 @@ +--- +'@mermaid-js/layout-elk': patch +'mermaid': patch +--- + +feat: Exposing elk configuration forceNodeModelOrder and considerModelOrder to the mermaid configuration diff --git a/cypress/platform/knsv2.html b/cypress/platform/knsv2.html index ab7ded0c2..eb5528844 100644 --- a/cypress/platform/knsv2.html +++ b/cypress/platform/knsv2.html @@ -131,6 +131,22 @@
+---
+config:
+  layout: elk
+  elk:
+    mergeEdges: false
+    forceNodeModelOrder: false
+    considerModelOrder: NONE
+
+---
+            flowchart TB
+              a --> a1 & a2 & a3 & a4
+              b --> b1 & b2
+              b2 --> b3
+              b1 --> b4
+
 treemap
 "Section 1"
     "Leaf 1.1": 12
diff --git a/docs/config/setup/defaultConfig/variables/configKeys.md b/docs/config/setup/defaultConfig/variables/configKeys.md
index 222111bd5..82b68d780 100644
--- a/docs/config/setup/defaultConfig/variables/configKeys.md
+++ b/docs/config/setup/defaultConfig/variables/configKeys.md
@@ -12,4 +12,4 @@
 
 > `const` **configKeys**: `Set`<`string`>
 
-Defined in: [packages/mermaid/src/defaultConfig.ts:290](https://github.com/mermaid-js/mermaid/blob/master/packages/mermaid/src/defaultConfig.ts#L290)
+Defined in: [packages/mermaid/src/defaultConfig.ts:292](https://github.com/mermaid-js/mermaid/blob/master/packages/mermaid/src/defaultConfig.ts#L292)
diff --git a/docs/config/setup/mermaid/interfaces/MermaidConfig.md b/docs/config/setup/mermaid/interfaces/MermaidConfig.md
index d08533713..f4c5b0b2b 100644
--- a/docs/config/setup/mermaid/interfaces/MermaidConfig.md
+++ b/docs/config/setup/mermaid/interfaces/MermaidConfig.md
@@ -18,7 +18,7 @@ Defined in: [packages/mermaid/src/config.type.ts:58](https://github.com/mermaid-
 
 > `optional` **altFontFamily**: `string`
 
-Defined in: [packages/mermaid/src/config.type.ts:122](https://github.com/mermaid-js/mermaid/blob/master/packages/mermaid/src/config.type.ts#L122)
+Defined in: [packages/mermaid/src/config.type.ts:132](https://github.com/mermaid-js/mermaid/blob/master/packages/mermaid/src/config.type.ts#L132)
 
 ---
 
@@ -26,7 +26,7 @@ Defined in: [packages/mermaid/src/config.type.ts:122](https://github.com/mermaid
 
 > `optional` **architecture**: `ArchitectureDiagramConfig`
 
-Defined in: [packages/mermaid/src/config.type.ts:194](https://github.com/mermaid-js/mermaid/blob/master/packages/mermaid/src/config.type.ts#L194)
+Defined in: [packages/mermaid/src/config.type.ts:204](https://github.com/mermaid-js/mermaid/blob/master/packages/mermaid/src/config.type.ts#L204)
 
 ---
 
@@ -34,7 +34,7 @@ Defined in: [packages/mermaid/src/config.type.ts:194](https://github.com/mermaid
 
 > `optional` **arrowMarkerAbsolute**: `boolean`
 
-Defined in: [packages/mermaid/src/config.type.ts:141](https://github.com/mermaid-js/mermaid/blob/master/packages/mermaid/src/config.type.ts#L141)
+Defined in: [packages/mermaid/src/config.type.ts:151](https://github.com/mermaid-js/mermaid/blob/master/packages/mermaid/src/config.type.ts#L151)
 
 Controls whether or arrow markers in html code are absolute paths or anchors.
 This matters if you are using base tag settings.
@@ -45,7 +45,7 @@ This matters if you are using base tag settings.
 
 > `optional` **block**: `BlockDiagramConfig`
 
-Defined in: [packages/mermaid/src/config.type.ts:201](https://github.com/mermaid-js/mermaid/blob/master/packages/mermaid/src/config.type.ts#L201)
+Defined in: [packages/mermaid/src/config.type.ts:211](https://github.com/mermaid-js/mermaid/blob/master/packages/mermaid/src/config.type.ts#L211)
 
 ---
 
@@ -53,7 +53,7 @@ Defined in: [packages/mermaid/src/config.type.ts:201](https://github.com/mermaid
 
 > `optional` **c4**: `C4DiagramConfig`
 
-Defined in: [packages/mermaid/src/config.type.ts:198](https://github.com/mermaid-js/mermaid/blob/master/packages/mermaid/src/config.type.ts#L198)
+Defined in: [packages/mermaid/src/config.type.ts:208](https://github.com/mermaid-js/mermaid/blob/master/packages/mermaid/src/config.type.ts#L208)
 
 ---
 
@@ -61,7 +61,7 @@ Defined in: [packages/mermaid/src/config.type.ts:198](https://github.com/mermaid
 
 > `optional` **class**: `ClassDiagramConfig`
 
-Defined in: [packages/mermaid/src/config.type.ts:187](https://github.com/mermaid-js/mermaid/blob/master/packages/mermaid/src/config.type.ts#L187)
+Defined in: [packages/mermaid/src/config.type.ts:197](https://github.com/mermaid-js/mermaid/blob/master/packages/mermaid/src/config.type.ts#L197)
 
 ---
 
@@ -69,7 +69,7 @@ Defined in: [packages/mermaid/src/config.type.ts:187](https://github.com/mermaid
 
 > `optional` **darkMode**: `boolean`
 
-Defined in: [packages/mermaid/src/config.type.ts:113](https://github.com/mermaid-js/mermaid/blob/master/packages/mermaid/src/config.type.ts#L113)
+Defined in: [packages/mermaid/src/config.type.ts:123](https://github.com/mermaid-js/mermaid/blob/master/packages/mermaid/src/config.type.ts#L123)
 
 ---
 
@@ -77,7 +77,7 @@ Defined in: [packages/mermaid/src/config.type.ts:113](https://github.com/mermaid
 
 > `optional` **deterministicIds**: `boolean`
 
-Defined in: [packages/mermaid/src/config.type.ts:174](https://github.com/mermaid-js/mermaid/blob/master/packages/mermaid/src/config.type.ts#L174)
+Defined in: [packages/mermaid/src/config.type.ts:184](https://github.com/mermaid-js/mermaid/blob/master/packages/mermaid/src/config.type.ts#L184)
 
 This option controls if the generated ids of nodes in the SVG are
 generated randomly or based on a seed.
@@ -93,7 +93,7 @@ should not change unless content is changed.
 
 > `optional` **deterministicIDSeed**: `string`
 
-Defined in: [packages/mermaid/src/config.type.ts:181](https://github.com/mermaid-js/mermaid/blob/master/packages/mermaid/src/config.type.ts#L181)
+Defined in: [packages/mermaid/src/config.type.ts:191](https://github.com/mermaid-js/mermaid/blob/master/packages/mermaid/src/config.type.ts#L191)
 
 This option is the optional seed for deterministic ids.
 If set to `undefined` but deterministicIds is `true`, a simple number iterator is used.
@@ -105,7 +105,7 @@ You can set this attribute to base the seed on a static string.
 
 > `optional` **dompurifyConfig**: `Config`
 
-Defined in: [packages/mermaid/src/config.type.ts:203](https://github.com/mermaid-js/mermaid/blob/master/packages/mermaid/src/config.type.ts#L203)
+Defined in: [packages/mermaid/src/config.type.ts:213](https://github.com/mermaid-js/mermaid/blob/master/packages/mermaid/src/config.type.ts#L213)
 
 ---
 
@@ -115,12 +115,24 @@ Defined in: [packages/mermaid/src/config.type.ts:203](https://github.com/mermaid
 
 Defined in: [packages/mermaid/src/config.type.ts:91](https://github.com/mermaid-js/mermaid/blob/master/packages/mermaid/src/config.type.ts#L91)
 
+#### considerModelOrder?
+
+> `optional` **considerModelOrder**: `"NONE"` | `"NODES_AND_EDGES"` | `"PREFER_EDGES"` | `"PREFER_NODES"`
+
+Preserves the order of nodes and edges in the model file if this does not lead to additional edge crossings. Depending on the strategy this is not always possible since the node and edge order might be conflicting.
+
 #### cycleBreakingStrategy?
 
 > `optional` **cycleBreakingStrategy**: `"GREEDY"` | `"DEPTH_FIRST"` | `"INTERACTIVE"` | `"MODEL_ORDER"` | `"GREEDY_MODEL_ORDER"`
 
 This strategy decides how to find cycles in the graph and deciding which edges need adjustment to break loops.
 
+#### forceNodeModelOrder?
+
+> `optional` **forceNodeModelOrder**: `boolean`
+
+The node order given by the model does not change to produce a better layout. E.g. if node A is before node B in the model this is not changed during crossing minimization. This assumes that the node model order is already respected before crossing minimization. This can be achieved by setting considerModelOrder.strategy to NODES_AND_EDGES.
+
 #### mergeEdges?
 
 > `optional` **mergeEdges**: `boolean`
@@ -139,7 +151,7 @@ Elk specific option affecting how nodes are placed.
 
 > `optional` **er**: `ErDiagramConfig`
 
-Defined in: [packages/mermaid/src/config.type.ts:189](https://github.com/mermaid-js/mermaid/blob/master/packages/mermaid/src/config.type.ts#L189)
+Defined in: [packages/mermaid/src/config.type.ts:199](https://github.com/mermaid-js/mermaid/blob/master/packages/mermaid/src/config.type.ts#L199)
 
 ---
 
@@ -147,7 +159,7 @@ Defined in: [packages/mermaid/src/config.type.ts:189](https://github.com/mermaid
 
 > `optional` **flowchart**: `FlowchartDiagramConfig`
 
-Defined in: [packages/mermaid/src/config.type.ts:182](https://github.com/mermaid-js/mermaid/blob/master/packages/mermaid/src/config.type.ts#L182)
+Defined in: [packages/mermaid/src/config.type.ts:192](https://github.com/mermaid-js/mermaid/blob/master/packages/mermaid/src/config.type.ts#L192)
 
 ---
 
@@ -155,7 +167,7 @@ Defined in: [packages/mermaid/src/config.type.ts:182](https://github.com/mermaid
 
 > `optional` **fontFamily**: `string`
 
-Defined in: [packages/mermaid/src/config.type.ts:121](https://github.com/mermaid-js/mermaid/blob/master/packages/mermaid/src/config.type.ts#L121)
+Defined in: [packages/mermaid/src/config.type.ts:131](https://github.com/mermaid-js/mermaid/blob/master/packages/mermaid/src/config.type.ts#L131)
 
 Specifies the font to be used in the rendered diagrams.
 Can be any possible CSS `font-family`.
@@ -167,7 +179,7 @@ See 
 
 > `optional` **fontSize**: `number`
 
-Defined in: [packages/mermaid/src/config.type.ts:205](https://github.com/mermaid-js/mermaid/blob/master/packages/mermaid/src/config.type.ts#L205)
+Defined in: [packages/mermaid/src/config.type.ts:215](https://github.com/mermaid-js/mermaid/blob/master/packages/mermaid/src/config.type.ts#L215)
 
 ---
 
@@ -175,7 +187,7 @@ Defined in: [packages/mermaid/src/config.type.ts:205](https://github.com/mermaid
 
 > `optional` **forceLegacyMathML**: `boolean`
 
-Defined in: [packages/mermaid/src/config.type.ts:163](https://github.com/mermaid-js/mermaid/blob/master/packages/mermaid/src/config.type.ts#L163)
+Defined in: [packages/mermaid/src/config.type.ts:173](https://github.com/mermaid-js/mermaid/blob/master/packages/mermaid/src/config.type.ts#L173)
 
 This option forces Mermaid to rely on KaTeX's own stylesheet for rendering MathML. Due to differences between OS
 fonts and browser's MathML implementation, this option is recommended if consistent rendering is important.
@@ -187,7 +199,7 @@ If set to true, ignores legacyMathML.
 
 > `optional` **gantt**: `GanttDiagramConfig`
 
-Defined in: [packages/mermaid/src/config.type.ts:184](https://github.com/mermaid-js/mermaid/blob/master/packages/mermaid/src/config.type.ts#L184)
+Defined in: [packages/mermaid/src/config.type.ts:194](https://github.com/mermaid-js/mermaid/blob/master/packages/mermaid/src/config.type.ts#L194)
 
 ---
 
@@ -195,7 +207,7 @@ Defined in: [packages/mermaid/src/config.type.ts:184](https://github.com/mermaid
 
 > `optional` **gitGraph**: `GitGraphDiagramConfig`
 
-Defined in: [packages/mermaid/src/config.type.ts:197](https://github.com/mermaid-js/mermaid/blob/master/packages/mermaid/src/config.type.ts#L197)
+Defined in: [packages/mermaid/src/config.type.ts:207](https://github.com/mermaid-js/mermaid/blob/master/packages/mermaid/src/config.type.ts#L207)
 
 ---
 
@@ -213,7 +225,7 @@ Defines the seed to be used when using handDrawn look. This is important for the
 
 > `optional` **htmlLabels**: `boolean`
 
-Defined in: [packages/mermaid/src/config.type.ts:114](https://github.com/mermaid-js/mermaid/blob/master/packages/mermaid/src/config.type.ts#L114)
+Defined in: [packages/mermaid/src/config.type.ts:124](https://github.com/mermaid-js/mermaid/blob/master/packages/mermaid/src/config.type.ts#L124)
 
 ---
 
@@ -221,7 +233,7 @@ Defined in: [packages/mermaid/src/config.type.ts:114](https://github.com/mermaid
 
 > `optional` **journey**: `JourneyDiagramConfig`
 
-Defined in: [packages/mermaid/src/config.type.ts:185](https://github.com/mermaid-js/mermaid/blob/master/packages/mermaid/src/config.type.ts#L185)
+Defined in: [packages/mermaid/src/config.type.ts:195](https://github.com/mermaid-js/mermaid/blob/master/packages/mermaid/src/config.type.ts#L195)
 
 ---
 
@@ -229,7 +241,7 @@ Defined in: [packages/mermaid/src/config.type.ts:185](https://github.com/mermaid
 
 > `optional` **kanban**: `KanbanDiagramConfig`
 
-Defined in: [packages/mermaid/src/config.type.ts:196](https://github.com/mermaid-js/mermaid/blob/master/packages/mermaid/src/config.type.ts#L196)
+Defined in: [packages/mermaid/src/config.type.ts:206](https://github.com/mermaid-js/mermaid/blob/master/packages/mermaid/src/config.type.ts#L206)
 
 ---
 
@@ -247,7 +259,7 @@ Defines which layout algorithm to use for rendering the diagram.
 
 > `optional` **legacyMathML**: `boolean`
 
-Defined in: [packages/mermaid/src/config.type.ts:156](https://github.com/mermaid-js/mermaid/blob/master/packages/mermaid/src/config.type.ts#L156)
+Defined in: [packages/mermaid/src/config.type.ts:166](https://github.com/mermaid-js/mermaid/blob/master/packages/mermaid/src/config.type.ts#L166)
 
 This option specifies if Mermaid can expect the dependent to include KaTeX stylesheets for browsers
 without their own MathML implementation. If this option is disabled and MathML is not supported, the math
@@ -260,7 +272,7 @@ fall back to legacy rendering for KaTeX.
 
 > `optional` **logLevel**: `0` | `2` | `1` | `"trace"` | `"debug"` | `"info"` | `"warn"` | `"error"` | `"fatal"` | `3` | `4` | `5`
 
-Defined in: [packages/mermaid/src/config.type.ts:127](https://github.com/mermaid-js/mermaid/blob/master/packages/mermaid/src/config.type.ts#L127)
+Defined in: [packages/mermaid/src/config.type.ts:137](https://github.com/mermaid-js/mermaid/blob/master/packages/mermaid/src/config.type.ts#L137)
 
 This option decides the amount of logging to be used by mermaid.
 
@@ -280,7 +292,7 @@ Defines which main look to use for the diagram.
 
 > `optional` **markdownAutoWrap**: `boolean`
 
-Defined in: [packages/mermaid/src/config.type.ts:206](https://github.com/mermaid-js/mermaid/blob/master/packages/mermaid/src/config.type.ts#L206)
+Defined in: [packages/mermaid/src/config.type.ts:216](https://github.com/mermaid-js/mermaid/blob/master/packages/mermaid/src/config.type.ts#L216)
 
 ---
 
@@ -308,7 +320,7 @@ The maximum allowed size of the users text diagram
 
 > `optional` **mindmap**: `MindmapDiagramConfig`
 
-Defined in: [packages/mermaid/src/config.type.ts:195](https://github.com/mermaid-js/mermaid/blob/master/packages/mermaid/src/config.type.ts#L195)
+Defined in: [packages/mermaid/src/config.type.ts:205](https://github.com/mermaid-js/mermaid/blob/master/packages/mermaid/src/config.type.ts#L205)
 
 ---
 
@@ -316,7 +328,7 @@ Defined in: [packages/mermaid/src/config.type.ts:195](https://github.com/mermaid
 
 > `optional` **packet**: `PacketDiagramConfig`
 
-Defined in: [packages/mermaid/src/config.type.ts:200](https://github.com/mermaid-js/mermaid/blob/master/packages/mermaid/src/config.type.ts#L200)
+Defined in: [packages/mermaid/src/config.type.ts:210](https://github.com/mermaid-js/mermaid/blob/master/packages/mermaid/src/config.type.ts#L210)
 
 ---
 
@@ -324,7 +336,7 @@ Defined in: [packages/mermaid/src/config.type.ts:200](https://github.com/mermaid
 
 > `optional` **pie**: `PieDiagramConfig`
 
-Defined in: [packages/mermaid/src/config.type.ts:190](https://github.com/mermaid-js/mermaid/blob/master/packages/mermaid/src/config.type.ts#L190)
+Defined in: [packages/mermaid/src/config.type.ts:200](https://github.com/mermaid-js/mermaid/blob/master/packages/mermaid/src/config.type.ts#L200)
 
 ---
 
@@ -332,7 +344,7 @@ Defined in: [packages/mermaid/src/config.type.ts:190](https://github.com/mermaid
 
 > `optional` **quadrantChart**: `QuadrantChartConfig`
 
-Defined in: [packages/mermaid/src/config.type.ts:191](https://github.com/mermaid-js/mermaid/blob/master/packages/mermaid/src/config.type.ts#L191)
+Defined in: [packages/mermaid/src/config.type.ts:201](https://github.com/mermaid-js/mermaid/blob/master/packages/mermaid/src/config.type.ts#L201)
 
 ---
 
@@ -340,7 +352,7 @@ Defined in: [packages/mermaid/src/config.type.ts:191](https://github.com/mermaid
 
 > `optional` **radar**: `RadarDiagramConfig`
 
-Defined in: [packages/mermaid/src/config.type.ts:202](https://github.com/mermaid-js/mermaid/blob/master/packages/mermaid/src/config.type.ts#L202)
+Defined in: [packages/mermaid/src/config.type.ts:212](https://github.com/mermaid-js/mermaid/blob/master/packages/mermaid/src/config.type.ts#L212)
 
 ---
 
@@ -348,7 +360,7 @@ Defined in: [packages/mermaid/src/config.type.ts:202](https://github.com/mermaid
 
 > `optional` **requirement**: `RequirementDiagramConfig`
 
-Defined in: [packages/mermaid/src/config.type.ts:193](https://github.com/mermaid-js/mermaid/blob/master/packages/mermaid/src/config.type.ts#L193)
+Defined in: [packages/mermaid/src/config.type.ts:203](https://github.com/mermaid-js/mermaid/blob/master/packages/mermaid/src/config.type.ts#L203)
 
 ---
 
@@ -356,7 +368,7 @@ Defined in: [packages/mermaid/src/config.type.ts:193](https://github.com/mermaid
 
 > `optional` **sankey**: `SankeyDiagramConfig`
 
-Defined in: [packages/mermaid/src/config.type.ts:199](https://github.com/mermaid-js/mermaid/blob/master/packages/mermaid/src/config.type.ts#L199)
+Defined in: [packages/mermaid/src/config.type.ts:209](https://github.com/mermaid-js/mermaid/blob/master/packages/mermaid/src/config.type.ts#L209)
 
 ---
 
@@ -364,7 +376,7 @@ Defined in: [packages/mermaid/src/config.type.ts:199](https://github.com/mermaid
 
 > `optional` **secure**: `string`\[]
 
-Defined in: [packages/mermaid/src/config.type.ts:148](https://github.com/mermaid-js/mermaid/blob/master/packages/mermaid/src/config.type.ts#L148)
+Defined in: [packages/mermaid/src/config.type.ts:158](https://github.com/mermaid-js/mermaid/blob/master/packages/mermaid/src/config.type.ts#L158)
 
 This option controls which `currentConfig` keys are considered secure and
 can only be changed via call to `mermaid.initialize`.
@@ -376,7 +388,7 @@ This prevents malicious graph directives from overriding a site's default securi
 
 > `optional` **securityLevel**: `"strict"` | `"loose"` | `"antiscript"` | `"sandbox"`
 
-Defined in: [packages/mermaid/src/config.type.ts:131](https://github.com/mermaid-js/mermaid/blob/master/packages/mermaid/src/config.type.ts#L131)
+Defined in: [packages/mermaid/src/config.type.ts:141](https://github.com/mermaid-js/mermaid/blob/master/packages/mermaid/src/config.type.ts#L141)
 
 Level of trust for parsed diagram
 
@@ -386,7 +398,7 @@ Level of trust for parsed diagram
 
 > `optional` **sequence**: `SequenceDiagramConfig`
 
-Defined in: [packages/mermaid/src/config.type.ts:183](https://github.com/mermaid-js/mermaid/blob/master/packages/mermaid/src/config.type.ts#L183)
+Defined in: [packages/mermaid/src/config.type.ts:193](https://github.com/mermaid-js/mermaid/blob/master/packages/mermaid/src/config.type.ts#L193)
 
 ---
 
@@ -394,7 +406,7 @@ Defined in: [packages/mermaid/src/config.type.ts:183](https://github.com/mermaid
 
 > `optional` **startOnLoad**: `boolean`
 
-Defined in: [packages/mermaid/src/config.type.ts:135](https://github.com/mermaid-js/mermaid/blob/master/packages/mermaid/src/config.type.ts#L135)
+Defined in: [packages/mermaid/src/config.type.ts:145](https://github.com/mermaid-js/mermaid/blob/master/packages/mermaid/src/config.type.ts#L145)
 
 Dictates whether mermaid starts on Page load
 
@@ -404,7 +416,7 @@ Dictates whether mermaid starts on Page load
 
 > `optional` **state**: `StateDiagramConfig`
 
-Defined in: [packages/mermaid/src/config.type.ts:188](https://github.com/mermaid-js/mermaid/blob/master/packages/mermaid/src/config.type.ts#L188)
+Defined in: [packages/mermaid/src/config.type.ts:198](https://github.com/mermaid-js/mermaid/blob/master/packages/mermaid/src/config.type.ts#L198)
 
 ---
 
@@ -412,7 +424,7 @@ Defined in: [packages/mermaid/src/config.type.ts:188](https://github.com/mermaid
 
 > `optional` **suppressErrorRendering**: `boolean`
 
-Defined in: [packages/mermaid/src/config.type.ts:212](https://github.com/mermaid-js/mermaid/blob/master/packages/mermaid/src/config.type.ts#L212)
+Defined in: [packages/mermaid/src/config.type.ts:222](https://github.com/mermaid-js/mermaid/blob/master/packages/mermaid/src/config.type.ts#L222)
 
 Suppresses inserting 'Syntax error' diagram in the DOM.
 This is useful when you want to control how to handle syntax errors in your application.
@@ -450,7 +462,7 @@ Defined in: [packages/mermaid/src/config.type.ts:65](https://github.com/mermaid-
 
 > `optional` **timeline**: `TimelineDiagramConfig`
 
-Defined in: [packages/mermaid/src/config.type.ts:186](https://github.com/mermaid-js/mermaid/blob/master/packages/mermaid/src/config.type.ts#L186)
+Defined in: [packages/mermaid/src/config.type.ts:196](https://github.com/mermaid-js/mermaid/blob/master/packages/mermaid/src/config.type.ts#L196)
 
 ---
 
@@ -458,7 +470,7 @@ Defined in: [packages/mermaid/src/config.type.ts:186](https://github.com/mermaid
 
 > `optional` **wrap**: `boolean`
 
-Defined in: [packages/mermaid/src/config.type.ts:204](https://github.com/mermaid-js/mermaid/blob/master/packages/mermaid/src/config.type.ts#L204)
+Defined in: [packages/mermaid/src/config.type.ts:214](https://github.com/mermaid-js/mermaid/blob/master/packages/mermaid/src/config.type.ts#L214)
 
 ---
 
@@ -466,4 +478,4 @@ Defined in: [packages/mermaid/src/config.type.ts:204](https://github.com/mermaid
 
 > `optional` **xyChart**: `XYChartConfig`
 
-Defined in: [packages/mermaid/src/config.type.ts:192](https://github.com/mermaid-js/mermaid/blob/master/packages/mermaid/src/config.type.ts#L192)
+Defined in: [packages/mermaid/src/config.type.ts:202](https://github.com/mermaid-js/mermaid/blob/master/packages/mermaid/src/config.type.ts#L202)
diff --git a/packages/mermaid-layout-elk/src/render.ts b/packages/mermaid-layout-elk/src/render.ts
index c3799fedd..d1c44b67f 100644
--- a/packages/mermaid-layout-elk/src/render.ts
+++ b/packages/mermaid-layout-elk/src/render.ts
@@ -766,7 +766,10 @@ export const render = async (
     id: 'root',
     layoutOptions: {
       'elk.hierarchyHandling': 'INCLUDE_CHILDREN',
-      'elk.layered.considerModelOrder.strategy': 'NODES_AND_EDGES',
+      'elk.layered.crossingMinimization.forceNodeModelOrder':
+        data4Layout.config.elk?.forceNodeModelOrder,
+      'elk.layered.considerModelOrder.strategy': data4Layout.config.elk?.considerModelOrder,
+
       'elk.algorithm': algorithm,
       'nodePlacement.strategy': data4Layout.config.elk?.nodePlacementStrategy,
       'elk.layered.mergeEdges': data4Layout.config.elk?.mergeEdges,
diff --git a/packages/mermaid/src/config.type.ts b/packages/mermaid/src/config.type.ts
index 8cd451c16..70391f2e5 100644
--- a/packages/mermaid/src/config.type.ts
+++ b/packages/mermaid/src/config.type.ts
@@ -109,6 +109,16 @@ export interface MermaidConfig {
       | 'INTERACTIVE'
       | 'MODEL_ORDER'
       | 'GREEDY_MODEL_ORDER';
+    /**
+     * The node order given by the model does not change to produce a better layout. E.g. if node A is before node B in the model this is not changed during crossing minimization. This assumes that the node model order is already respected before crossing minimization. This can be achieved by setting considerModelOrder.strategy to NODES_AND_EDGES.
+     *
+     */
+    forceNodeModelOrder?: boolean;
+    /**
+     * Preserves the order of nodes and edges in the model file if this does not lead to additional edge crossings. Depending on the strategy this is not always possible since the node and edge order might be conflicting.
+     *
+     */
+    considerModelOrder?: 'NONE' | 'NODES_AND_EDGES' | 'PREFER_EDGES' | 'PREFER_NODES';
   };
   darkMode?: boolean;
   htmlLabels?: boolean;
diff --git a/packages/mermaid/src/defaultConfig.ts b/packages/mermaid/src/defaultConfig.ts
index 468f8e192..655bf3724 100644
--- a/packages/mermaid/src/defaultConfig.ts
+++ b/packages/mermaid/src/defaultConfig.ts
@@ -24,6 +24,8 @@ const config: RequiredDeep = {
     // mergeEdges is needed here to be considered
     mergeEdges: false,
     nodePlacementStrategy: 'BRANDES_KOEPF',
+    forceNodeModelOrder: false,
+    considerModelOrder: 'NODES_AND_EDGES',
   },
   themeCSS: undefined,
 
diff --git a/packages/mermaid/src/schemas/config.schema.yaml b/packages/mermaid/src/schemas/config.schema.yaml
index 6dd21e884..0ff385c61 100644
--- a/packages/mermaid/src/schemas/config.schema.yaml
+++ b/packages/mermaid/src/schemas/config.schema.yaml
@@ -133,6 +133,21 @@ properties:
           - MODEL_ORDER
           - GREEDY_MODEL_ORDER
         default: GREEDY_MODEL_ORDER
+      forceNodeModelOrder:
+        description: |
+          The node order given by the model does not change to produce a better layout. E.g. if node A is before node B in the model this is not changed during crossing minimization. This assumes that the node model order is already respected before crossing minimization. This can be achieved by setting considerModelOrder.strategy to NODES_AND_EDGES.
+        type: boolean
+        default: false
+      considerModelOrder:
+        description: |
+          Preserves the order of nodes and edges in the model file if this does not lead to additional edge crossings. Depending on the strategy this is not always possible since the node and edge order might be conflicting.
+        type: string
+        enum:
+          - NONE
+          - NODES_AND_EDGES
+          - PREFER_EDGES
+          - PREFER_NODES
+        default: 'NODES_AND_EDGES'
   darkMode:
     type: boolean
     default: false
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index 8be2d5aca..d5d11f733 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -517,6 +517,67 @@ importers:
         specifier: ^7.3.0
         version: 7.3.0
 
+  packages/mermaid/src/vitepress:
+    dependencies:
+      '@mdi/font':
+        specifier: ^7.4.47
+        version: 7.4.47
+      '@vueuse/core':
+        specifier: ^12.7.0
+        version: 12.7.0(typescript@5.7.3)
+      font-awesome:
+        specifier: ^4.7.0
+        version: 4.7.0
+      jiti:
+        specifier: ^2.4.2
+        version: 2.4.2
+      mermaid:
+        specifier: workspace:^
+        version: link:../..
+      vue:
+        specifier: ^3.4.38
+        version: 3.5.13(typescript@5.7.3)
+    devDependencies:
+      '@iconify-json/carbon':
+        specifier: ^1.1.37
+        version: 1.2.1
+      '@unocss/reset':
+        specifier: ^66.0.0
+        version: 66.0.0
+      '@vite-pwa/vitepress':
+        specifier: ^0.5.3
+        version: 0.5.4(vite-plugin-pwa@0.21.2(vite@6.1.6(@types/node@22.13.5)(jiti@2.4.2)(terser@5.39.0)(tsx@4.19.3)(yaml@2.8.0))(workbox-build@7.1.1(@types/babel__core@7.20.5))(workbox-window@7.3.0))
+      '@vitejs/plugin-vue':
+        specifier: ^5.0.5
+        version: 5.2.1(vite@6.1.6(@types/node@22.13.5)(jiti@2.4.2)(terser@5.39.0)(tsx@4.19.3)(yaml@2.8.0))(vue@3.5.13(typescript@5.7.3))
+      fast-glob:
+        specifier: ^3.3.3
+        version: 3.3.3
+      https-localhost:
+        specifier: ^4.7.1
+        version: 4.7.1
+      pathe:
+        specifier: ^2.0.3
+        version: 2.0.3
+      unocss:
+        specifier: ^66.0.0
+        version: 66.0.0(postcss@8.5.6)(vite@6.1.6(@types/node@22.13.5)(jiti@2.4.2)(terser@5.39.0)(tsx@4.19.3)(yaml@2.8.0))(vue@3.5.13(typescript@5.7.3))
+      unplugin-vue-components:
+        specifier: ^28.4.0
+        version: 28.4.0(@babel/parser@7.28.0)(vue@3.5.13(typescript@5.7.3))
+      vite:
+        specifier: ^6.1.1
+        version: 6.1.6(@types/node@22.13.5)(jiti@2.4.2)(terser@5.39.0)(tsx@4.19.3)(yaml@2.8.0)
+      vite-plugin-pwa:
+        specifier: ^0.21.1
+        version: 0.21.2(vite@6.1.6(@types/node@22.13.5)(jiti@2.4.2)(terser@5.39.0)(tsx@4.19.3)(yaml@2.8.0))(workbox-build@7.1.1(@types/babel__core@7.20.5))(workbox-window@7.3.0)
+      vitepress:
+        specifier: 1.6.3
+        version: 1.6.3(@algolia/client-search@5.20.3)(@types/node@22.13.5)(axios@1.8.4)(postcss@8.5.6)(search-insights@2.17.2)(terser@5.39.0)(typescript@5.7.3)
+      workbox-window:
+        specifier: ^7.3.0
+        version: 7.3.0
+
   packages/parser:
     dependencies:
       langium:
@@ -934,11 +995,6 @@ packages:
     engines: {node: '>=6.0.0'}
     hasBin: true
 
-  '@babel/parser@7.27.2':
-    resolution: {integrity: sha512-QYLs8299NA7WM/bZAdp+CviYYkVoYXlDW2rzliy3chxd1PQjej7JORuMJDJXJUb9g0TT+B99EwaVLKmX+sPXWw==}
-    engines: {node: '>=6.0.0'}
-    hasBin: true
-
   '@babel/parser@7.28.0':
     resolution: {integrity: sha512-jVZGvOxOuNSsuQuLRTh13nU0AogFlw32w/MT+LV6D3sP5WdbW61E77RnkbaO2dUvmPAYrBDJXGn5gGS6tH4j8g==}
     engines: {node: '>=6.0.0'}
@@ -1424,10 +1480,6 @@ packages:
     resolution: {integrity: sha512-Y3IR1cRnOxOCDvMmNiym7XpXQ93iGDDPHx+Zj+NM+rg0fBaShfQLkg+hKPaZCEvg5N/LeCo4+Rj/i3FuJsIQaw==}
     engines: {node: '>=6.9.0'}
 
-  '@babel/types@7.27.1':
-    resolution: {integrity: sha512-+EzkxvLNfiUeKMgy/3luqfsCWFRXLb7U6wNQTk60tovuckwB15B191tJWvpp4HjiQWdJkCxO3Wbvc6jlk3Xb2Q==}
-    engines: {node: '>=6.9.0'}
-
   '@babel/types@7.28.0':
     resolution: {integrity: sha512-jYnje+JyZG5YThjHiF28oT4SIZLnYOcSBb6+SDaFIyzDVSkXQmQQYclJ2R+YxcdmK0AX6x1E5OQNtuh3jHDrUg==}
     engines: {node: '>=6.9.0'}
@@ -2665,18 +2717,10 @@ packages:
   '@jridgewell/gen-mapping@0.3.12':
     resolution: {integrity: sha512-OuLGC46TjB5BbN1dH8JULVVZY4WTdkF7tV9Ys6wLL1rubZnCMstOhNHueU5bLCrnRuDhKPDM4g6sw4Bel5Gzqg==}
 
-  '@jridgewell/gen-mapping@0.3.8':
-    resolution: {integrity: sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==}
-    engines: {node: '>=6.0.0'}
-
   '@jridgewell/resolve-uri@3.1.2':
     resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==}
     engines: {node: '>=6.0.0'}
 
-  '@jridgewell/set-array@1.2.1':
-    resolution: {integrity: sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==}
-    engines: {node: '>=6.0.0'}
-
   '@jridgewell/source-map@0.3.6':
     resolution: {integrity: sha512-1ZJTZebgqllO79ue2bm3rIGud/bOe0pP5BjSRCRxxYkEZS8STV7zN84UBbiYu7jy+eCKSnVIUgoWWE/tt+shMQ==}
 
@@ -3716,6 +3760,15 @@ packages:
     cpu: [x64]
     os: [win32]
 
+  '@vite-pwa/vitepress@0.5.4':
+    resolution: {integrity: sha512-g57qwG983WTyQNLnOcDVPQEIeN+QDgK/HdqghmygiUFp3a/MzVvmLXC/EVnPAXxWa8W2g9pZ9lE3EiDGs2HjsA==}
+    peerDependencies:
+      '@vite-pwa/assets-generator': ^0.2.6
+      vite-plugin-pwa: '>=0.21.2 <1'
+    peerDependenciesMeta:
+      '@vite-pwa/assets-generator':
+        optional: true
+
   '@vite-pwa/vitepress@1.0.0':
     resolution: {integrity: sha512-i5RFah4urA6tZycYlGyBslVx8cVzbZBcARJLDg5rWMfAkRmyLtpRU6usGfVOwyN9kjJ2Bkm+gBHXF1hhr7HptQ==}
     peerDependencies:
@@ -6188,10 +6241,6 @@ packages:
     resolution: {integrity: sha512-vpeMIQKxczTD/0s2CdEWHcb0eeJe6TFjxb+J5xgX7hScxqrGuyjmv4c1D4A/gelKfyox0gJJwIHF+fLjeaM8kQ==}
     engines: {node: '>=18'}
 
-  get-intrinsic@1.2.7:
-    resolution: {integrity: sha512-VW6Pxhsrk0KAOqs3WEd0klDiF/+V7gQOpAvY1jVU/LHmaD/kQO4523aiJuikX/QAKYiW6x8Jh+RJej1almdtCA==}
-    engines: {node: '>= 0.4'}
-
   get-intrinsic@1.3.0:
     resolution: {integrity: sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==}
     engines: {node: '>= 0.4'}
@@ -8996,6 +9045,7 @@ packages:
   source-map@0.8.0-beta.0:
     resolution: {integrity: sha512-2ymg6oRBpebeZi9UUNsgQ89bhx01TcTkmNTGnNO88imTmbSgy4nfujrgVEFKWpMTEGA11EDkTt7mqObTPdigIA==}
     engines: {node: '>= 8'}
+    deprecated: The work that was done in this beta branch won't be included in future versions
 
   sourcemap-codec@1.4.8:
     resolution: {integrity: sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==}
@@ -9734,6 +9784,18 @@ packages:
     peerDependencies:
       vite: '>=4 <=6'
 
+  vite-plugin-pwa@0.21.2:
+    resolution: {integrity: sha512-vFhH6Waw8itNu37hWUJxL50q+CBbNcMVzsKaYHQVrfxTt3ihk3PeLO22SbiP1UNWzcEPaTQv+YVxe4G0KOjAkg==}
+    engines: {node: '>=16.0.0'}
+    peerDependencies:
+      '@vite-pwa/assets-generator': ^0.2.6
+      vite: ^3.1.0 || ^4.0.0 || ^5.0.0 || ^6.0.0
+      workbox-build: ^7.3.0
+      workbox-window: ^7.3.0
+    peerDependenciesMeta:
+      '@vite-pwa/assets-generator':
+        optional: true
+
   vite-plugin-pwa@1.0.0:
     resolution: {integrity: sha512-X77jo0AOd5OcxmWj3WnVti8n7Kw2tBgV1c8MCXFclrSlDV23ePzv2eTDIALXI2Qo6nJ5pZJeZAuX0AawvRfoeA==}
     engines: {node: '>=16.0.0'}
@@ -10495,8 +10557,8 @@ snapshots:
 
   '@ampproject/remapping@2.3.0':
     dependencies:
-      '@jridgewell/gen-mapping': 0.3.8
-      '@jridgewell/trace-mapping': 0.3.25
+      '@jridgewell/gen-mapping': 0.3.12
+      '@jridgewell/trace-mapping': 0.3.29
 
   '@antfu/install-pkg@1.0.0':
     dependencies:
@@ -10822,10 +10884,10 @@ snapshots:
       '@babel/helper-compilation-targets': 7.27.2
       '@babel/helper-module-transforms': 7.27.1(@babel/core@7.27.1)
       '@babel/helpers': 7.27.1
-      '@babel/parser': 7.27.2
+      '@babel/parser': 7.28.0
       '@babel/template': 7.27.2
       '@babel/traverse': 7.27.1
-      '@babel/types': 7.27.1
+      '@babel/types': 7.28.0
       convert-source-map: 2.0.0
       debug: 4.4.1(supports-color@8.1.1)
       gensync: 1.0.0-beta.2
@@ -10856,10 +10918,10 @@ snapshots:
 
   '@babel/generator@7.27.1':
     dependencies:
-      '@babel/parser': 7.27.2
-      '@babel/types': 7.27.1
-      '@jridgewell/gen-mapping': 0.3.8
-      '@jridgewell/trace-mapping': 0.3.25
+      '@babel/parser': 7.28.0
+      '@babel/types': 7.28.0
+      '@jridgewell/gen-mapping': 0.3.12
+      '@jridgewell/trace-mapping': 0.3.29
       jsesc: 3.1.0
 
   '@babel/generator@7.28.0':
@@ -10956,7 +11018,7 @@ snapshots:
   '@babel/helper-module-imports@7.27.1':
     dependencies:
       '@babel/traverse': 7.27.1
-      '@babel/types': 7.27.1
+      '@babel/types': 7.28.0
     transitivePeerDependencies:
       - supports-color
 
@@ -11055,7 +11117,7 @@ snapshots:
   '@babel/helpers@7.27.1':
     dependencies:
       '@babel/template': 7.27.2
-      '@babel/types': 7.27.1
+      '@babel/types': 7.28.0
 
   '@babel/helpers@7.27.6':
     dependencies:
@@ -11064,11 +11126,7 @@ snapshots:
 
   '@babel/parser@7.26.9':
     dependencies:
-      '@babel/types': 7.27.1
-
-  '@babel/parser@7.27.2':
-    dependencies:
-      '@babel/types': 7.27.1
+      '@babel/types': 7.28.0
 
   '@babel/parser@7.28.0':
     dependencies:
@@ -12080,16 +12138,16 @@ snapshots:
   '@babel/template@7.27.2':
     dependencies:
       '@babel/code-frame': 7.27.1
-      '@babel/parser': 7.27.2
-      '@babel/types': 7.27.1
+      '@babel/parser': 7.28.0
+      '@babel/types': 7.28.0
 
   '@babel/traverse@7.27.1':
     dependencies:
       '@babel/code-frame': 7.27.1
       '@babel/generator': 7.27.1
-      '@babel/parser': 7.27.2
+      '@babel/parser': 7.28.0
       '@babel/template': 7.27.2
-      '@babel/types': 7.27.1
+      '@babel/types': 7.28.0
       debug: 4.4.1(supports-color@8.1.1)
       globals: 11.12.0
     transitivePeerDependencies:
@@ -12112,11 +12170,6 @@ snapshots:
       '@babel/helper-string-parser': 7.27.1
       '@babel/helper-validator-identifier': 7.27.1
 
-  '@babel/types@7.27.1':
-    dependencies:
-      '@babel/helper-string-parser': 7.27.1
-      '@babel/helper-validator-identifier': 7.27.1
-
   '@babel/types@7.28.0':
     dependencies:
       '@babel/helper-string-parser': 7.27.1
@@ -12673,7 +12726,7 @@ snapshots:
       '@babel/preset-env': 7.27.2(@babel/core@7.27.1)
       babel-loader: 9.2.1(@babel/core@7.27.1)(webpack@5.95.0(esbuild@0.25.0))
       bluebird: 3.7.1
-      debug: 4.4.0
+      debug: 4.4.1(supports-color@8.1.1)
       lodash: 4.17.21
       webpack: 5.95.0(esbuild@0.25.0)
     transitivePeerDependencies:
@@ -13315,7 +13368,7 @@ snapshots:
       '@jest/test-result': 30.0.4
       '@jest/transform': 30.0.4
       '@jest/types': 30.0.1
-      '@jridgewell/trace-mapping': 0.3.25
+      '@jridgewell/trace-mapping': 0.3.29
       '@types/node': 22.13.5
       chalk: 4.1.2
       collect-v8-coverage: 1.0.2
@@ -13349,7 +13402,7 @@ snapshots:
 
   '@jest/source-map@30.0.1':
     dependencies:
-      '@jridgewell/trace-mapping': 0.3.25
+      '@jridgewell/trace-mapping': 0.3.29
       callsites: 3.1.0
       graceful-fs: 4.2.11
 
@@ -13371,7 +13424,7 @@ snapshots:
     dependencies:
       '@babel/core': 7.28.0
       '@jest/types': 30.0.1
-      '@jridgewell/trace-mapping': 0.3.25
+      '@jridgewell/trace-mapping': 0.3.29
       babel-plugin-istanbul: 7.0.0
       chalk: 4.1.2
       convert-source-map: 2.0.0
@@ -13402,20 +13455,12 @@ snapshots:
       '@jridgewell/sourcemap-codec': 1.5.0
       '@jridgewell/trace-mapping': 0.3.29
 
-  '@jridgewell/gen-mapping@0.3.8':
-    dependencies:
-      '@jridgewell/set-array': 1.2.1
-      '@jridgewell/sourcemap-codec': 1.5.0
-      '@jridgewell/trace-mapping': 0.3.25
-
   '@jridgewell/resolve-uri@3.1.2': {}
 
-  '@jridgewell/set-array@1.2.1': {}
-
   '@jridgewell/source-map@0.3.6':
     dependencies:
-      '@jridgewell/gen-mapping': 0.3.8
-      '@jridgewell/trace-mapping': 0.3.25
+      '@jridgewell/gen-mapping': 0.3.12
+      '@jridgewell/trace-mapping': 0.3.29
 
   '@jridgewell/sourcemap-codec@1.5.0': {}
 
@@ -13840,24 +13885,24 @@ snapshots:
 
   '@types/babel__core@7.20.5':
     dependencies:
-      '@babel/parser': 7.27.2
-      '@babel/types': 7.27.1
+      '@babel/parser': 7.28.0
+      '@babel/types': 7.28.0
       '@types/babel__generator': 7.6.8
       '@types/babel__template': 7.4.4
       '@types/babel__traverse': 7.20.6
 
   '@types/babel__generator@7.6.8':
     dependencies:
-      '@babel/types': 7.27.1
+      '@babel/types': 7.28.0
 
   '@types/babel__template@7.4.4':
     dependencies:
-      '@babel/parser': 7.27.2
-      '@babel/types': 7.27.1
+      '@babel/parser': 7.28.0
+      '@babel/types': 7.28.0
 
   '@types/babel__traverse@7.20.6':
     dependencies:
-      '@babel/types': 7.27.1
+      '@babel/types': 7.28.0
 
   '@types/body-parser@1.19.5':
     dependencies:
@@ -14368,6 +14413,16 @@ snapshots:
     transitivePeerDependencies:
       - vue
 
+  '@unocss/astro@66.0.0(vite@6.1.6(@types/node@22.13.5)(jiti@2.4.2)(terser@5.39.0)(tsx@4.19.3)(yaml@2.8.0))(vue@3.5.13(typescript@5.7.3))':
+    dependencies:
+      '@unocss/core': 66.0.0
+      '@unocss/reset': 66.0.0
+      '@unocss/vite': 66.0.0(vite@6.1.6(@types/node@22.13.5)(jiti@2.4.2)(terser@5.39.0)(tsx@4.19.3)(yaml@2.8.0))(vue@3.5.13(typescript@5.7.3))
+    optionalDependencies:
+      vite: 6.1.6(@types/node@22.13.5)(jiti@2.4.2)(terser@5.39.0)(tsx@4.19.3)(yaml@2.8.0)
+    transitivePeerDependencies:
+      - vue
+
   '@unocss/cli@66.0.0':
     dependencies:
       '@ampproject/remapping': 2.3.0
@@ -14381,7 +14436,7 @@ snapshots:
       magic-string: 0.30.17
       pathe: 2.0.3
       perfect-debounce: 1.0.0
-      tinyglobby: 0.2.12
+      tinyglobby: 0.2.14
       unplugin-utils: 0.2.4
 
   '@unocss/config@66.0.0':
@@ -14413,7 +14468,7 @@ snapshots:
       '@unocss/rule-utils': 66.0.0
       css-tree: 3.1.0
       postcss: 8.5.6
-      tinyglobby: 0.2.12
+      tinyglobby: 0.2.14
 
   '@unocss/preset-attributify@66.0.0':
     dependencies:
@@ -14497,12 +14552,26 @@ snapshots:
       '@unocss/inspector': 66.0.0(vue@3.5.13(typescript@5.7.3))
       chokidar: 3.6.0
       magic-string: 0.30.17
-      tinyglobby: 0.2.12
+      tinyglobby: 0.2.14
       unplugin-utils: 0.2.4
       vite: 6.1.1(@types/node@22.13.5)(jiti@2.4.2)(terser@5.39.0)(tsx@4.19.3)(yaml@2.8.0)
     transitivePeerDependencies:
       - vue
 
+  '@unocss/vite@66.0.0(vite@6.1.6(@types/node@22.13.5)(jiti@2.4.2)(terser@5.39.0)(tsx@4.19.3)(yaml@2.8.0))(vue@3.5.13(typescript@5.7.3))':
+    dependencies:
+      '@ampproject/remapping': 2.3.0
+      '@unocss/config': 66.0.0
+      '@unocss/core': 66.0.0
+      '@unocss/inspector': 66.0.0(vue@3.5.13(typescript@5.7.3))
+      chokidar: 3.6.0
+      magic-string: 0.30.17
+      tinyglobby: 0.2.14
+      unplugin-utils: 0.2.4
+      vite: 6.1.6(@types/node@22.13.5)(jiti@2.4.2)(terser@5.39.0)(tsx@4.19.3)(yaml@2.8.0)
+    transitivePeerDependencies:
+      - vue
+
   '@unrs/resolver-binding-android-arm-eabi@1.11.1':
     optional: true
 
@@ -14562,6 +14631,10 @@ snapshots:
   '@unrs/resolver-binding-win32-x64-msvc@1.11.1':
     optional: true
 
+  '@vite-pwa/vitepress@0.5.4(vite-plugin-pwa@0.21.2(vite@6.1.6(@types/node@22.13.5)(jiti@2.4.2)(terser@5.39.0)(tsx@4.19.3)(yaml@2.8.0))(workbox-build@7.1.1(@types/babel__core@7.20.5))(workbox-window@7.3.0))':
+    dependencies:
+      vite-plugin-pwa: 0.21.2(vite@6.1.6(@types/node@22.13.5)(jiti@2.4.2)(terser@5.39.0)(tsx@4.19.3)(yaml@2.8.0))(workbox-build@7.1.1(@types/babel__core@7.20.5))(workbox-window@7.3.0)
+
   '@vite-pwa/vitepress@1.0.0(vite-plugin-pwa@1.0.0(vite@6.1.1(@types/node@22.13.5)(jiti@2.4.2)(terser@5.39.0)(tsx@4.19.3)(yaml@2.8.0))(workbox-build@7.1.1(@types/babel__core@7.20.5))(workbox-window@7.3.0))':
     dependencies:
       vite-plugin-pwa: 1.0.0(vite@6.1.1(@types/node@22.13.5)(jiti@2.4.2)(terser@5.39.0)(tsx@4.19.3)(yaml@2.8.0))(workbox-build@7.1.1(@types/babel__core@7.20.5))(workbox-window@7.3.0)
@@ -14571,6 +14644,11 @@ snapshots:
       vite: 5.4.19(@types/node@22.13.5)(terser@5.39.0)
       vue: 3.5.13(typescript@5.7.3)
 
+  '@vitejs/plugin-vue@5.2.1(vite@6.1.6(@types/node@22.13.5)(jiti@2.4.2)(terser@5.39.0)(tsx@4.19.3)(yaml@2.8.0))(vue@3.5.13(typescript@5.7.3))':
+    dependencies:
+      vite: 6.1.6(@types/node@22.13.5)(jiti@2.4.2)(terser@5.39.0)(tsx@4.19.3)(yaml@2.8.0)
+      vue: 3.5.13(typescript@5.7.3)
+
   '@vitejs/plugin-vue@6.0.0(vite@6.1.1(@types/node@22.13.5)(jiti@2.4.2)(terser@5.39.0)(tsx@4.19.3)(yaml@2.8.0))(vue@3.5.13(typescript@5.7.3))':
     dependencies:
       '@rolldown/pluginutils': 1.0.0-beta.19
@@ -14648,7 +14726,7 @@ snapshots:
 
   '@vue/compiler-core@3.5.13':
     dependencies:
-      '@babel/parser': 7.27.2
+      '@babel/parser': 7.28.0
       '@vue/shared': 3.5.13
       entities: 4.5.0
       estree-walker: 2.0.2
@@ -14661,14 +14739,14 @@ snapshots:
 
   '@vue/compiler-sfc@3.5.13':
     dependencies:
-      '@babel/parser': 7.27.2
+      '@babel/parser': 7.28.0
       '@vue/compiler-core': 3.5.13
       '@vue/compiler-dom': 3.5.13
       '@vue/compiler-ssr': 3.5.13
       '@vue/shared': 3.5.13
       estree-walker: 2.0.2
       magic-string: 0.30.17
-      postcss: 8.5.3
+      postcss: 8.5.6
       source-map-js: 1.2.1
 
   '@vue/compiler-ssr@3.5.13':
@@ -16498,11 +16576,11 @@ snapshots:
     dependencies:
       node-source-walk: 7.0.0
 
-  detective-postcss@7.0.0(postcss@8.5.3):
+  detective-postcss@7.0.0(postcss@8.5.6):
     dependencies:
       is-url: 1.2.4
-      postcss: 8.5.3
-      postcss-values-parser: 6.0.2(postcss@8.5.3)
+      postcss: 8.5.6
+      postcss-values-parser: 6.0.2(postcss@8.5.6)
 
   detective-sass@6.0.0:
     dependencies:
@@ -16739,7 +16817,7 @@ snapshots:
   es-set-tostringtag@2.1.0:
     dependencies:
       es-errors: 1.3.0
-      get-intrinsic: 1.2.7
+      get-intrinsic: 1.3.0
       has-tostringtag: 1.0.2
       hasown: 2.0.2
 
@@ -17402,7 +17480,7 @@ snapshots:
       '@actions/core': 1.11.1
       arg: 5.0.2
       console.table: 0.10.0
-      debug: 4.4.0
+      debug: 4.4.1(supports-color@8.1.1)
       find-test-names: 1.29.5(@babel/core@7.27.1)
       globby: 11.1.0
       minimatch: 3.1.2
@@ -17429,7 +17507,7 @@ snapshots:
 
   find-test-names@1.29.5(@babel/core@7.27.1):
     dependencies:
-      '@babel/parser': 7.27.2
+      '@babel/parser': 7.28.0
       '@babel/plugin-syntax-jsx': 7.25.7(@babel/core@7.27.1)
       acorn-walk: 8.3.4
       debug: 4.4.1(supports-color@8.1.1)
@@ -17595,19 +17673,6 @@ snapshots:
 
   get-east-asian-width@1.3.0: {}
 
-  get-intrinsic@1.2.7:
-    dependencies:
-      call-bind-apply-helpers: 1.0.2
-      es-define-property: 1.0.1
-      es-errors: 1.3.0
-      es-object-atoms: 1.1.1
-      function-bind: 1.1.2
-      get-proto: 1.0.1
-      gopd: 1.2.0
-      has-symbols: 1.1.0
-      hasown: 2.0.2
-      math-intrinsics: 1.1.0
-
   get-intrinsic@1.3.0:
     dependencies:
       call-bind-apply-helpers: 1.0.2
@@ -18270,7 +18335,7 @@ snapshots:
   istanbul-lib-instrument@6.0.3:
     dependencies:
       '@babel/core': 7.27.1
-      '@babel/parser': 7.27.2
+      '@babel/parser': 7.28.0
       '@istanbuljs/schema': 0.1.3
       istanbul-lib-coverage: 3.2.2
       semver: 7.7.2
@@ -18303,7 +18368,7 @@ snapshots:
   istanbul-lib-source-maps@5.0.6:
     dependencies:
       '@jridgewell/trace-mapping': 0.3.25
-      debug: 4.4.0
+      debug: 4.4.1(supports-color@8.1.1)
       istanbul-lib-coverage: 3.2.2
     transitivePeerDependencies:
       - supports-color
@@ -19615,7 +19680,7 @@ snapshots:
 
   node-source-walk@7.0.0:
     dependencies:
-      '@babel/parser': 7.27.2
+      '@babel/parser': 7.28.0
 
   nomnom@1.5.2:
     dependencies:
@@ -20101,11 +20166,11 @@ snapshots:
 
   postcss-value-parser@4.2.0: {}
 
-  postcss-values-parser@6.0.2(postcss@8.5.3):
+  postcss-values-parser@6.0.2(postcss@8.5.6):
     dependencies:
       color-name: 1.1.4
       is-url-superb: 4.0.0
-      postcss: 8.5.3
+      postcss: 8.5.6
       quote-unquote: 1.0.0
 
   postcss@8.5.3:
@@ -20144,7 +20209,7 @@ snapshots:
       detective-amd: 6.0.0
       detective-cjs: 6.0.0
       detective-es6: 5.0.0
-      detective-postcss: 7.0.0(postcss@8.5.3)
+      detective-postcss: 7.0.0(postcss@8.5.6)
       detective-sass: 6.0.0
       detective-scss: 5.0.0
       detective-stylus: 5.0.0
@@ -20152,7 +20217,7 @@ snapshots:
       detective-vue2: 2.0.3(typescript@5.7.3)
       module-definition: 6.0.0
       node-source-walk: 7.0.0
-      postcss: 8.5.3
+      postcss: 8.5.6
       typescript: 5.7.3
     transitivePeerDependencies:
       - supports-color
@@ -21017,7 +21082,7 @@ snapshots:
 
   spdy@4.0.2:
     dependencies:
-      debug: 4.4.0
+      debug: 4.4.1(supports-color@8.1.1)
       handle-thing: 2.0.1
       http-deceiver: 1.2.7
       select-hose: 2.0.0
@@ -21034,7 +21099,7 @@ snapshots:
       deep-equal: 2.2.3
       dependency-tree: 11.0.1
       lazy-ass: 2.0.3
-      tinyglobby: 0.2.12
+      tinyglobby: 0.2.14
     transitivePeerDependencies:
       - supports-color
 
@@ -21716,6 +21781,33 @@ snapshots:
       - supports-color
       - vue
 
+  unocss@66.0.0(postcss@8.5.6)(vite@6.1.6(@types/node@22.13.5)(jiti@2.4.2)(terser@5.39.0)(tsx@4.19.3)(yaml@2.8.0))(vue@3.5.13(typescript@5.7.3)):
+    dependencies:
+      '@unocss/astro': 66.0.0(vite@6.1.6(@types/node@22.13.5)(jiti@2.4.2)(terser@5.39.0)(tsx@4.19.3)(yaml@2.8.0))(vue@3.5.13(typescript@5.7.3))
+      '@unocss/cli': 66.0.0
+      '@unocss/core': 66.0.0
+      '@unocss/postcss': 66.0.0(postcss@8.5.6)
+      '@unocss/preset-attributify': 66.0.0
+      '@unocss/preset-icons': 66.0.0
+      '@unocss/preset-mini': 66.0.0
+      '@unocss/preset-tagify': 66.0.0
+      '@unocss/preset-typography': 66.0.0
+      '@unocss/preset-uno': 66.0.0
+      '@unocss/preset-web-fonts': 66.0.0
+      '@unocss/preset-wind': 66.0.0
+      '@unocss/preset-wind3': 66.0.0
+      '@unocss/transformer-attributify-jsx': 66.0.0
+      '@unocss/transformer-compile-class': 66.0.0
+      '@unocss/transformer-directives': 66.0.0
+      '@unocss/transformer-variant-group': 66.0.0
+      '@unocss/vite': 66.0.0(vite@6.1.6(@types/node@22.13.5)(jiti@2.4.2)(terser@5.39.0)(tsx@4.19.3)(yaml@2.8.0))(vue@3.5.13(typescript@5.7.3))
+    optionalDependencies:
+      vite: 6.1.6(@types/node@22.13.5)(jiti@2.4.2)(terser@5.39.0)(tsx@4.19.3)(yaml@2.8.0)
+    transitivePeerDependencies:
+      - postcss
+      - supports-color
+      - vue
+
   unpipe@1.0.0: {}
 
   unplugin-utils@0.2.4:
@@ -21726,11 +21818,11 @@ snapshots:
   unplugin-vue-components@28.4.0(@babel/parser@7.28.0)(vue@3.5.13(typescript@5.7.3)):
     dependencies:
       chokidar: 3.6.0
-      debug: 4.4.0
+      debug: 4.4.1(supports-color@8.1.1)
       local-pkg: 1.0.0
       magic-string: 0.30.17
       mlly: 1.7.4
-      tinyglobby: 0.2.12
+      tinyglobby: 0.2.14
       unplugin: 2.2.0
       unplugin-utils: 0.2.4
       vue: 3.5.13(typescript@5.7.3)
@@ -21804,7 +21896,7 @@ snapshots:
 
   v8-to-istanbul@9.3.0:
     dependencies:
-      '@jridgewell/trace-mapping': 0.3.25
+      '@jridgewell/trace-mapping': 0.3.29
       '@types/istanbul-lib-coverage': 2.0.6
       convert-source-map: 2.0.0
 
@@ -21859,6 +21951,17 @@ snapshots:
     transitivePeerDependencies:
       - supports-color
 
+  vite-plugin-pwa@0.21.2(vite@6.1.6(@types/node@22.13.5)(jiti@2.4.2)(terser@5.39.0)(tsx@4.19.3)(yaml@2.8.0))(workbox-build@7.1.1(@types/babel__core@7.20.5))(workbox-window@7.3.0):
+    dependencies:
+      debug: 4.4.1(supports-color@8.1.1)
+      pretty-bytes: 6.1.1
+      tinyglobby: 0.2.14
+      vite: 6.1.6(@types/node@22.13.5)(jiti@2.4.2)(terser@5.39.0)(tsx@4.19.3)(yaml@2.8.0)
+      workbox-build: 7.1.1(@types/babel__core@7.20.5)
+      workbox-window: 7.3.0
+    transitivePeerDependencies:
+      - supports-color
+
   vite-plugin-pwa@1.0.0(vite@6.1.1(@types/node@22.13.5)(jiti@2.4.2)(terser@5.39.0)(tsx@4.19.3)(yaml@2.8.0))(workbox-build@7.1.1(@types/babel__core@7.20.5))(workbox-window@7.3.0):
     dependencies:
       debug: 4.4.0

From 5cc264feb7e66e610768858b9bdf5f6a70d41721 Mon Sep 17 00:00:00 2001
From: Knut Sveidqvist 
Date: Thu, 14 Aug 2025 13:05:40 +0200
Subject: [PATCH 137/143] updated lock file

---
 pnpm-lock.yaml | 307 ++++++++++++++++---------------------------------
 1 file changed, 102 insertions(+), 205 deletions(-)

diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index d5d11f733..8be2d5aca 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -517,67 +517,6 @@ importers:
         specifier: ^7.3.0
         version: 7.3.0
 
-  packages/mermaid/src/vitepress:
-    dependencies:
-      '@mdi/font':
-        specifier: ^7.4.47
-        version: 7.4.47
-      '@vueuse/core':
-        specifier: ^12.7.0
-        version: 12.7.0(typescript@5.7.3)
-      font-awesome:
-        specifier: ^4.7.0
-        version: 4.7.0
-      jiti:
-        specifier: ^2.4.2
-        version: 2.4.2
-      mermaid:
-        specifier: workspace:^
-        version: link:../..
-      vue:
-        specifier: ^3.4.38
-        version: 3.5.13(typescript@5.7.3)
-    devDependencies:
-      '@iconify-json/carbon':
-        specifier: ^1.1.37
-        version: 1.2.1
-      '@unocss/reset':
-        specifier: ^66.0.0
-        version: 66.0.0
-      '@vite-pwa/vitepress':
-        specifier: ^0.5.3
-        version: 0.5.4(vite-plugin-pwa@0.21.2(vite@6.1.6(@types/node@22.13.5)(jiti@2.4.2)(terser@5.39.0)(tsx@4.19.3)(yaml@2.8.0))(workbox-build@7.1.1(@types/babel__core@7.20.5))(workbox-window@7.3.0))
-      '@vitejs/plugin-vue':
-        specifier: ^5.0.5
-        version: 5.2.1(vite@6.1.6(@types/node@22.13.5)(jiti@2.4.2)(terser@5.39.0)(tsx@4.19.3)(yaml@2.8.0))(vue@3.5.13(typescript@5.7.3))
-      fast-glob:
-        specifier: ^3.3.3
-        version: 3.3.3
-      https-localhost:
-        specifier: ^4.7.1
-        version: 4.7.1
-      pathe:
-        specifier: ^2.0.3
-        version: 2.0.3
-      unocss:
-        specifier: ^66.0.0
-        version: 66.0.0(postcss@8.5.6)(vite@6.1.6(@types/node@22.13.5)(jiti@2.4.2)(terser@5.39.0)(tsx@4.19.3)(yaml@2.8.0))(vue@3.5.13(typescript@5.7.3))
-      unplugin-vue-components:
-        specifier: ^28.4.0
-        version: 28.4.0(@babel/parser@7.28.0)(vue@3.5.13(typescript@5.7.3))
-      vite:
-        specifier: ^6.1.1
-        version: 6.1.6(@types/node@22.13.5)(jiti@2.4.2)(terser@5.39.0)(tsx@4.19.3)(yaml@2.8.0)
-      vite-plugin-pwa:
-        specifier: ^0.21.1
-        version: 0.21.2(vite@6.1.6(@types/node@22.13.5)(jiti@2.4.2)(terser@5.39.0)(tsx@4.19.3)(yaml@2.8.0))(workbox-build@7.1.1(@types/babel__core@7.20.5))(workbox-window@7.3.0)
-      vitepress:
-        specifier: 1.6.3
-        version: 1.6.3(@algolia/client-search@5.20.3)(@types/node@22.13.5)(axios@1.8.4)(postcss@8.5.6)(search-insights@2.17.2)(terser@5.39.0)(typescript@5.7.3)
-      workbox-window:
-        specifier: ^7.3.0
-        version: 7.3.0
-
   packages/parser:
     dependencies:
       langium:
@@ -995,6 +934,11 @@ packages:
     engines: {node: '>=6.0.0'}
     hasBin: true
 
+  '@babel/parser@7.27.2':
+    resolution: {integrity: sha512-QYLs8299NA7WM/bZAdp+CviYYkVoYXlDW2rzliy3chxd1PQjej7JORuMJDJXJUb9g0TT+B99EwaVLKmX+sPXWw==}
+    engines: {node: '>=6.0.0'}
+    hasBin: true
+
   '@babel/parser@7.28.0':
     resolution: {integrity: sha512-jVZGvOxOuNSsuQuLRTh13nU0AogFlw32w/MT+LV6D3sP5WdbW61E77RnkbaO2dUvmPAYrBDJXGn5gGS6tH4j8g==}
     engines: {node: '>=6.0.0'}
@@ -1480,6 +1424,10 @@ packages:
     resolution: {integrity: sha512-Y3IR1cRnOxOCDvMmNiym7XpXQ93iGDDPHx+Zj+NM+rg0fBaShfQLkg+hKPaZCEvg5N/LeCo4+Rj/i3FuJsIQaw==}
     engines: {node: '>=6.9.0'}
 
+  '@babel/types@7.27.1':
+    resolution: {integrity: sha512-+EzkxvLNfiUeKMgy/3luqfsCWFRXLb7U6wNQTk60tovuckwB15B191tJWvpp4HjiQWdJkCxO3Wbvc6jlk3Xb2Q==}
+    engines: {node: '>=6.9.0'}
+
   '@babel/types@7.28.0':
     resolution: {integrity: sha512-jYnje+JyZG5YThjHiF28oT4SIZLnYOcSBb6+SDaFIyzDVSkXQmQQYclJ2R+YxcdmK0AX6x1E5OQNtuh3jHDrUg==}
     engines: {node: '>=6.9.0'}
@@ -2717,10 +2665,18 @@ packages:
   '@jridgewell/gen-mapping@0.3.12':
     resolution: {integrity: sha512-OuLGC46TjB5BbN1dH8JULVVZY4WTdkF7tV9Ys6wLL1rubZnCMstOhNHueU5bLCrnRuDhKPDM4g6sw4Bel5Gzqg==}
 
+  '@jridgewell/gen-mapping@0.3.8':
+    resolution: {integrity: sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==}
+    engines: {node: '>=6.0.0'}
+
   '@jridgewell/resolve-uri@3.1.2':
     resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==}
     engines: {node: '>=6.0.0'}
 
+  '@jridgewell/set-array@1.2.1':
+    resolution: {integrity: sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==}
+    engines: {node: '>=6.0.0'}
+
   '@jridgewell/source-map@0.3.6':
     resolution: {integrity: sha512-1ZJTZebgqllO79ue2bm3rIGud/bOe0pP5BjSRCRxxYkEZS8STV7zN84UBbiYu7jy+eCKSnVIUgoWWE/tt+shMQ==}
 
@@ -3760,15 +3716,6 @@ packages:
     cpu: [x64]
     os: [win32]
 
-  '@vite-pwa/vitepress@0.5.4':
-    resolution: {integrity: sha512-g57qwG983WTyQNLnOcDVPQEIeN+QDgK/HdqghmygiUFp3a/MzVvmLXC/EVnPAXxWa8W2g9pZ9lE3EiDGs2HjsA==}
-    peerDependencies:
-      '@vite-pwa/assets-generator': ^0.2.6
-      vite-plugin-pwa: '>=0.21.2 <1'
-    peerDependenciesMeta:
-      '@vite-pwa/assets-generator':
-        optional: true
-
   '@vite-pwa/vitepress@1.0.0':
     resolution: {integrity: sha512-i5RFah4urA6tZycYlGyBslVx8cVzbZBcARJLDg5rWMfAkRmyLtpRU6usGfVOwyN9kjJ2Bkm+gBHXF1hhr7HptQ==}
     peerDependencies:
@@ -6241,6 +6188,10 @@ packages:
     resolution: {integrity: sha512-vpeMIQKxczTD/0s2CdEWHcb0eeJe6TFjxb+J5xgX7hScxqrGuyjmv4c1D4A/gelKfyox0gJJwIHF+fLjeaM8kQ==}
     engines: {node: '>=18'}
 
+  get-intrinsic@1.2.7:
+    resolution: {integrity: sha512-VW6Pxhsrk0KAOqs3WEd0klDiF/+V7gQOpAvY1jVU/LHmaD/kQO4523aiJuikX/QAKYiW6x8Jh+RJej1almdtCA==}
+    engines: {node: '>= 0.4'}
+
   get-intrinsic@1.3.0:
     resolution: {integrity: sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==}
     engines: {node: '>= 0.4'}
@@ -9045,7 +8996,6 @@ packages:
   source-map@0.8.0-beta.0:
     resolution: {integrity: sha512-2ymg6oRBpebeZi9UUNsgQ89bhx01TcTkmNTGnNO88imTmbSgy4nfujrgVEFKWpMTEGA11EDkTt7mqObTPdigIA==}
     engines: {node: '>= 8'}
-    deprecated: The work that was done in this beta branch won't be included in future versions
 
   sourcemap-codec@1.4.8:
     resolution: {integrity: sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==}
@@ -9784,18 +9734,6 @@ packages:
     peerDependencies:
       vite: '>=4 <=6'
 
-  vite-plugin-pwa@0.21.2:
-    resolution: {integrity: sha512-vFhH6Waw8itNu37hWUJxL50q+CBbNcMVzsKaYHQVrfxTt3ihk3PeLO22SbiP1UNWzcEPaTQv+YVxe4G0KOjAkg==}
-    engines: {node: '>=16.0.0'}
-    peerDependencies:
-      '@vite-pwa/assets-generator': ^0.2.6
-      vite: ^3.1.0 || ^4.0.0 || ^5.0.0 || ^6.0.0
-      workbox-build: ^7.3.0
-      workbox-window: ^7.3.0
-    peerDependenciesMeta:
-      '@vite-pwa/assets-generator':
-        optional: true
-
   vite-plugin-pwa@1.0.0:
     resolution: {integrity: sha512-X77jo0AOd5OcxmWj3WnVti8n7Kw2tBgV1c8MCXFclrSlDV23ePzv2eTDIALXI2Qo6nJ5pZJeZAuX0AawvRfoeA==}
     engines: {node: '>=16.0.0'}
@@ -10557,8 +10495,8 @@ snapshots:
 
   '@ampproject/remapping@2.3.0':
     dependencies:
-      '@jridgewell/gen-mapping': 0.3.12
-      '@jridgewell/trace-mapping': 0.3.29
+      '@jridgewell/gen-mapping': 0.3.8
+      '@jridgewell/trace-mapping': 0.3.25
 
   '@antfu/install-pkg@1.0.0':
     dependencies:
@@ -10884,10 +10822,10 @@ snapshots:
       '@babel/helper-compilation-targets': 7.27.2
       '@babel/helper-module-transforms': 7.27.1(@babel/core@7.27.1)
       '@babel/helpers': 7.27.1
-      '@babel/parser': 7.28.0
+      '@babel/parser': 7.27.2
       '@babel/template': 7.27.2
       '@babel/traverse': 7.27.1
-      '@babel/types': 7.28.0
+      '@babel/types': 7.27.1
       convert-source-map: 2.0.0
       debug: 4.4.1(supports-color@8.1.1)
       gensync: 1.0.0-beta.2
@@ -10918,10 +10856,10 @@ snapshots:
 
   '@babel/generator@7.27.1':
     dependencies:
-      '@babel/parser': 7.28.0
-      '@babel/types': 7.28.0
-      '@jridgewell/gen-mapping': 0.3.12
-      '@jridgewell/trace-mapping': 0.3.29
+      '@babel/parser': 7.27.2
+      '@babel/types': 7.27.1
+      '@jridgewell/gen-mapping': 0.3.8
+      '@jridgewell/trace-mapping': 0.3.25
       jsesc: 3.1.0
 
   '@babel/generator@7.28.0':
@@ -11018,7 +10956,7 @@ snapshots:
   '@babel/helper-module-imports@7.27.1':
     dependencies:
       '@babel/traverse': 7.27.1
-      '@babel/types': 7.28.0
+      '@babel/types': 7.27.1
     transitivePeerDependencies:
       - supports-color
 
@@ -11117,7 +11055,7 @@ snapshots:
   '@babel/helpers@7.27.1':
     dependencies:
       '@babel/template': 7.27.2
-      '@babel/types': 7.28.0
+      '@babel/types': 7.27.1
 
   '@babel/helpers@7.27.6':
     dependencies:
@@ -11126,7 +11064,11 @@ snapshots:
 
   '@babel/parser@7.26.9':
     dependencies:
-      '@babel/types': 7.28.0
+      '@babel/types': 7.27.1
+
+  '@babel/parser@7.27.2':
+    dependencies:
+      '@babel/types': 7.27.1
 
   '@babel/parser@7.28.0':
     dependencies:
@@ -12138,16 +12080,16 @@ snapshots:
   '@babel/template@7.27.2':
     dependencies:
       '@babel/code-frame': 7.27.1
-      '@babel/parser': 7.28.0
-      '@babel/types': 7.28.0
+      '@babel/parser': 7.27.2
+      '@babel/types': 7.27.1
 
   '@babel/traverse@7.27.1':
     dependencies:
       '@babel/code-frame': 7.27.1
       '@babel/generator': 7.27.1
-      '@babel/parser': 7.28.0
+      '@babel/parser': 7.27.2
       '@babel/template': 7.27.2
-      '@babel/types': 7.28.0
+      '@babel/types': 7.27.1
       debug: 4.4.1(supports-color@8.1.1)
       globals: 11.12.0
     transitivePeerDependencies:
@@ -12170,6 +12112,11 @@ snapshots:
       '@babel/helper-string-parser': 7.27.1
       '@babel/helper-validator-identifier': 7.27.1
 
+  '@babel/types@7.27.1':
+    dependencies:
+      '@babel/helper-string-parser': 7.27.1
+      '@babel/helper-validator-identifier': 7.27.1
+
   '@babel/types@7.28.0':
     dependencies:
       '@babel/helper-string-parser': 7.27.1
@@ -12726,7 +12673,7 @@ snapshots:
       '@babel/preset-env': 7.27.2(@babel/core@7.27.1)
       babel-loader: 9.2.1(@babel/core@7.27.1)(webpack@5.95.0(esbuild@0.25.0))
       bluebird: 3.7.1
-      debug: 4.4.1(supports-color@8.1.1)
+      debug: 4.4.0
       lodash: 4.17.21
       webpack: 5.95.0(esbuild@0.25.0)
     transitivePeerDependencies:
@@ -13368,7 +13315,7 @@ snapshots:
       '@jest/test-result': 30.0.4
       '@jest/transform': 30.0.4
       '@jest/types': 30.0.1
-      '@jridgewell/trace-mapping': 0.3.29
+      '@jridgewell/trace-mapping': 0.3.25
       '@types/node': 22.13.5
       chalk: 4.1.2
       collect-v8-coverage: 1.0.2
@@ -13402,7 +13349,7 @@ snapshots:
 
   '@jest/source-map@30.0.1':
     dependencies:
-      '@jridgewell/trace-mapping': 0.3.29
+      '@jridgewell/trace-mapping': 0.3.25
       callsites: 3.1.0
       graceful-fs: 4.2.11
 
@@ -13424,7 +13371,7 @@ snapshots:
     dependencies:
       '@babel/core': 7.28.0
       '@jest/types': 30.0.1
-      '@jridgewell/trace-mapping': 0.3.29
+      '@jridgewell/trace-mapping': 0.3.25
       babel-plugin-istanbul: 7.0.0
       chalk: 4.1.2
       convert-source-map: 2.0.0
@@ -13455,12 +13402,20 @@ snapshots:
       '@jridgewell/sourcemap-codec': 1.5.0
       '@jridgewell/trace-mapping': 0.3.29
 
+  '@jridgewell/gen-mapping@0.3.8':
+    dependencies:
+      '@jridgewell/set-array': 1.2.1
+      '@jridgewell/sourcemap-codec': 1.5.0
+      '@jridgewell/trace-mapping': 0.3.25
+
   '@jridgewell/resolve-uri@3.1.2': {}
 
+  '@jridgewell/set-array@1.2.1': {}
+
   '@jridgewell/source-map@0.3.6':
     dependencies:
-      '@jridgewell/gen-mapping': 0.3.12
-      '@jridgewell/trace-mapping': 0.3.29
+      '@jridgewell/gen-mapping': 0.3.8
+      '@jridgewell/trace-mapping': 0.3.25
 
   '@jridgewell/sourcemap-codec@1.5.0': {}
 
@@ -13885,24 +13840,24 @@ snapshots:
 
   '@types/babel__core@7.20.5':
     dependencies:
-      '@babel/parser': 7.28.0
-      '@babel/types': 7.28.0
+      '@babel/parser': 7.27.2
+      '@babel/types': 7.27.1
       '@types/babel__generator': 7.6.8
       '@types/babel__template': 7.4.4
       '@types/babel__traverse': 7.20.6
 
   '@types/babel__generator@7.6.8':
     dependencies:
-      '@babel/types': 7.28.0
+      '@babel/types': 7.27.1
 
   '@types/babel__template@7.4.4':
     dependencies:
-      '@babel/parser': 7.28.0
-      '@babel/types': 7.28.0
+      '@babel/parser': 7.27.2
+      '@babel/types': 7.27.1
 
   '@types/babel__traverse@7.20.6':
     dependencies:
-      '@babel/types': 7.28.0
+      '@babel/types': 7.27.1
 
   '@types/body-parser@1.19.5':
     dependencies:
@@ -14413,16 +14368,6 @@ snapshots:
     transitivePeerDependencies:
       - vue
 
-  '@unocss/astro@66.0.0(vite@6.1.6(@types/node@22.13.5)(jiti@2.4.2)(terser@5.39.0)(tsx@4.19.3)(yaml@2.8.0))(vue@3.5.13(typescript@5.7.3))':
-    dependencies:
-      '@unocss/core': 66.0.0
-      '@unocss/reset': 66.0.0
-      '@unocss/vite': 66.0.0(vite@6.1.6(@types/node@22.13.5)(jiti@2.4.2)(terser@5.39.0)(tsx@4.19.3)(yaml@2.8.0))(vue@3.5.13(typescript@5.7.3))
-    optionalDependencies:
-      vite: 6.1.6(@types/node@22.13.5)(jiti@2.4.2)(terser@5.39.0)(tsx@4.19.3)(yaml@2.8.0)
-    transitivePeerDependencies:
-      - vue
-
   '@unocss/cli@66.0.0':
     dependencies:
       '@ampproject/remapping': 2.3.0
@@ -14436,7 +14381,7 @@ snapshots:
       magic-string: 0.30.17
       pathe: 2.0.3
       perfect-debounce: 1.0.0
-      tinyglobby: 0.2.14
+      tinyglobby: 0.2.12
       unplugin-utils: 0.2.4
 
   '@unocss/config@66.0.0':
@@ -14468,7 +14413,7 @@ snapshots:
       '@unocss/rule-utils': 66.0.0
       css-tree: 3.1.0
       postcss: 8.5.6
-      tinyglobby: 0.2.14
+      tinyglobby: 0.2.12
 
   '@unocss/preset-attributify@66.0.0':
     dependencies:
@@ -14552,26 +14497,12 @@ snapshots:
       '@unocss/inspector': 66.0.0(vue@3.5.13(typescript@5.7.3))
       chokidar: 3.6.0
       magic-string: 0.30.17
-      tinyglobby: 0.2.14
+      tinyglobby: 0.2.12
       unplugin-utils: 0.2.4
       vite: 6.1.1(@types/node@22.13.5)(jiti@2.4.2)(terser@5.39.0)(tsx@4.19.3)(yaml@2.8.0)
     transitivePeerDependencies:
       - vue
 
-  '@unocss/vite@66.0.0(vite@6.1.6(@types/node@22.13.5)(jiti@2.4.2)(terser@5.39.0)(tsx@4.19.3)(yaml@2.8.0))(vue@3.5.13(typescript@5.7.3))':
-    dependencies:
-      '@ampproject/remapping': 2.3.0
-      '@unocss/config': 66.0.0
-      '@unocss/core': 66.0.0
-      '@unocss/inspector': 66.0.0(vue@3.5.13(typescript@5.7.3))
-      chokidar: 3.6.0
-      magic-string: 0.30.17
-      tinyglobby: 0.2.14
-      unplugin-utils: 0.2.4
-      vite: 6.1.6(@types/node@22.13.5)(jiti@2.4.2)(terser@5.39.0)(tsx@4.19.3)(yaml@2.8.0)
-    transitivePeerDependencies:
-      - vue
-
   '@unrs/resolver-binding-android-arm-eabi@1.11.1':
     optional: true
 
@@ -14631,10 +14562,6 @@ snapshots:
   '@unrs/resolver-binding-win32-x64-msvc@1.11.1':
     optional: true
 
-  '@vite-pwa/vitepress@0.5.4(vite-plugin-pwa@0.21.2(vite@6.1.6(@types/node@22.13.5)(jiti@2.4.2)(terser@5.39.0)(tsx@4.19.3)(yaml@2.8.0))(workbox-build@7.1.1(@types/babel__core@7.20.5))(workbox-window@7.3.0))':
-    dependencies:
-      vite-plugin-pwa: 0.21.2(vite@6.1.6(@types/node@22.13.5)(jiti@2.4.2)(terser@5.39.0)(tsx@4.19.3)(yaml@2.8.0))(workbox-build@7.1.1(@types/babel__core@7.20.5))(workbox-window@7.3.0)
-
   '@vite-pwa/vitepress@1.0.0(vite-plugin-pwa@1.0.0(vite@6.1.1(@types/node@22.13.5)(jiti@2.4.2)(terser@5.39.0)(tsx@4.19.3)(yaml@2.8.0))(workbox-build@7.1.1(@types/babel__core@7.20.5))(workbox-window@7.3.0))':
     dependencies:
       vite-plugin-pwa: 1.0.0(vite@6.1.1(@types/node@22.13.5)(jiti@2.4.2)(terser@5.39.0)(tsx@4.19.3)(yaml@2.8.0))(workbox-build@7.1.1(@types/babel__core@7.20.5))(workbox-window@7.3.0)
@@ -14644,11 +14571,6 @@ snapshots:
       vite: 5.4.19(@types/node@22.13.5)(terser@5.39.0)
       vue: 3.5.13(typescript@5.7.3)
 
-  '@vitejs/plugin-vue@5.2.1(vite@6.1.6(@types/node@22.13.5)(jiti@2.4.2)(terser@5.39.0)(tsx@4.19.3)(yaml@2.8.0))(vue@3.5.13(typescript@5.7.3))':
-    dependencies:
-      vite: 6.1.6(@types/node@22.13.5)(jiti@2.4.2)(terser@5.39.0)(tsx@4.19.3)(yaml@2.8.0)
-      vue: 3.5.13(typescript@5.7.3)
-
   '@vitejs/plugin-vue@6.0.0(vite@6.1.1(@types/node@22.13.5)(jiti@2.4.2)(terser@5.39.0)(tsx@4.19.3)(yaml@2.8.0))(vue@3.5.13(typescript@5.7.3))':
     dependencies:
       '@rolldown/pluginutils': 1.0.0-beta.19
@@ -14726,7 +14648,7 @@ snapshots:
 
   '@vue/compiler-core@3.5.13':
     dependencies:
-      '@babel/parser': 7.28.0
+      '@babel/parser': 7.27.2
       '@vue/shared': 3.5.13
       entities: 4.5.0
       estree-walker: 2.0.2
@@ -14739,14 +14661,14 @@ snapshots:
 
   '@vue/compiler-sfc@3.5.13':
     dependencies:
-      '@babel/parser': 7.28.0
+      '@babel/parser': 7.27.2
       '@vue/compiler-core': 3.5.13
       '@vue/compiler-dom': 3.5.13
       '@vue/compiler-ssr': 3.5.13
       '@vue/shared': 3.5.13
       estree-walker: 2.0.2
       magic-string: 0.30.17
-      postcss: 8.5.6
+      postcss: 8.5.3
       source-map-js: 1.2.1
 
   '@vue/compiler-ssr@3.5.13':
@@ -16576,11 +16498,11 @@ snapshots:
     dependencies:
       node-source-walk: 7.0.0
 
-  detective-postcss@7.0.0(postcss@8.5.6):
+  detective-postcss@7.0.0(postcss@8.5.3):
     dependencies:
       is-url: 1.2.4
-      postcss: 8.5.6
-      postcss-values-parser: 6.0.2(postcss@8.5.6)
+      postcss: 8.5.3
+      postcss-values-parser: 6.0.2(postcss@8.5.3)
 
   detective-sass@6.0.0:
     dependencies:
@@ -16817,7 +16739,7 @@ snapshots:
   es-set-tostringtag@2.1.0:
     dependencies:
       es-errors: 1.3.0
-      get-intrinsic: 1.3.0
+      get-intrinsic: 1.2.7
       has-tostringtag: 1.0.2
       hasown: 2.0.2
 
@@ -17480,7 +17402,7 @@ snapshots:
       '@actions/core': 1.11.1
       arg: 5.0.2
       console.table: 0.10.0
-      debug: 4.4.1(supports-color@8.1.1)
+      debug: 4.4.0
       find-test-names: 1.29.5(@babel/core@7.27.1)
       globby: 11.1.0
       minimatch: 3.1.2
@@ -17507,7 +17429,7 @@ snapshots:
 
   find-test-names@1.29.5(@babel/core@7.27.1):
     dependencies:
-      '@babel/parser': 7.28.0
+      '@babel/parser': 7.27.2
       '@babel/plugin-syntax-jsx': 7.25.7(@babel/core@7.27.1)
       acorn-walk: 8.3.4
       debug: 4.4.1(supports-color@8.1.1)
@@ -17673,6 +17595,19 @@ snapshots:
 
   get-east-asian-width@1.3.0: {}
 
+  get-intrinsic@1.2.7:
+    dependencies:
+      call-bind-apply-helpers: 1.0.2
+      es-define-property: 1.0.1
+      es-errors: 1.3.0
+      es-object-atoms: 1.1.1
+      function-bind: 1.1.2
+      get-proto: 1.0.1
+      gopd: 1.2.0
+      has-symbols: 1.1.0
+      hasown: 2.0.2
+      math-intrinsics: 1.1.0
+
   get-intrinsic@1.3.0:
     dependencies:
       call-bind-apply-helpers: 1.0.2
@@ -18335,7 +18270,7 @@ snapshots:
   istanbul-lib-instrument@6.0.3:
     dependencies:
       '@babel/core': 7.27.1
-      '@babel/parser': 7.28.0
+      '@babel/parser': 7.27.2
       '@istanbuljs/schema': 0.1.3
       istanbul-lib-coverage: 3.2.2
       semver: 7.7.2
@@ -18368,7 +18303,7 @@ snapshots:
   istanbul-lib-source-maps@5.0.6:
     dependencies:
       '@jridgewell/trace-mapping': 0.3.25
-      debug: 4.4.1(supports-color@8.1.1)
+      debug: 4.4.0
       istanbul-lib-coverage: 3.2.2
     transitivePeerDependencies:
       - supports-color
@@ -19680,7 +19615,7 @@ snapshots:
 
   node-source-walk@7.0.0:
     dependencies:
-      '@babel/parser': 7.28.0
+      '@babel/parser': 7.27.2
 
   nomnom@1.5.2:
     dependencies:
@@ -20166,11 +20101,11 @@ snapshots:
 
   postcss-value-parser@4.2.0: {}
 
-  postcss-values-parser@6.0.2(postcss@8.5.6):
+  postcss-values-parser@6.0.2(postcss@8.5.3):
     dependencies:
       color-name: 1.1.4
       is-url-superb: 4.0.0
-      postcss: 8.5.6
+      postcss: 8.5.3
       quote-unquote: 1.0.0
 
   postcss@8.5.3:
@@ -20209,7 +20144,7 @@ snapshots:
       detective-amd: 6.0.0
       detective-cjs: 6.0.0
       detective-es6: 5.0.0
-      detective-postcss: 7.0.0(postcss@8.5.6)
+      detective-postcss: 7.0.0(postcss@8.5.3)
       detective-sass: 6.0.0
       detective-scss: 5.0.0
       detective-stylus: 5.0.0
@@ -20217,7 +20152,7 @@ snapshots:
       detective-vue2: 2.0.3(typescript@5.7.3)
       module-definition: 6.0.0
       node-source-walk: 7.0.0
-      postcss: 8.5.6
+      postcss: 8.5.3
       typescript: 5.7.3
     transitivePeerDependencies:
       - supports-color
@@ -21082,7 +21017,7 @@ snapshots:
 
   spdy@4.0.2:
     dependencies:
-      debug: 4.4.1(supports-color@8.1.1)
+      debug: 4.4.0
       handle-thing: 2.0.1
       http-deceiver: 1.2.7
       select-hose: 2.0.0
@@ -21099,7 +21034,7 @@ snapshots:
       deep-equal: 2.2.3
       dependency-tree: 11.0.1
       lazy-ass: 2.0.3
-      tinyglobby: 0.2.14
+      tinyglobby: 0.2.12
     transitivePeerDependencies:
       - supports-color
 
@@ -21781,33 +21716,6 @@ snapshots:
       - supports-color
       - vue
 
-  unocss@66.0.0(postcss@8.5.6)(vite@6.1.6(@types/node@22.13.5)(jiti@2.4.2)(terser@5.39.0)(tsx@4.19.3)(yaml@2.8.0))(vue@3.5.13(typescript@5.7.3)):
-    dependencies:
-      '@unocss/astro': 66.0.0(vite@6.1.6(@types/node@22.13.5)(jiti@2.4.2)(terser@5.39.0)(tsx@4.19.3)(yaml@2.8.0))(vue@3.5.13(typescript@5.7.3))
-      '@unocss/cli': 66.0.0
-      '@unocss/core': 66.0.0
-      '@unocss/postcss': 66.0.0(postcss@8.5.6)
-      '@unocss/preset-attributify': 66.0.0
-      '@unocss/preset-icons': 66.0.0
-      '@unocss/preset-mini': 66.0.0
-      '@unocss/preset-tagify': 66.0.0
-      '@unocss/preset-typography': 66.0.0
-      '@unocss/preset-uno': 66.0.0
-      '@unocss/preset-web-fonts': 66.0.0
-      '@unocss/preset-wind': 66.0.0
-      '@unocss/preset-wind3': 66.0.0
-      '@unocss/transformer-attributify-jsx': 66.0.0
-      '@unocss/transformer-compile-class': 66.0.0
-      '@unocss/transformer-directives': 66.0.0
-      '@unocss/transformer-variant-group': 66.0.0
-      '@unocss/vite': 66.0.0(vite@6.1.6(@types/node@22.13.5)(jiti@2.4.2)(terser@5.39.0)(tsx@4.19.3)(yaml@2.8.0))(vue@3.5.13(typescript@5.7.3))
-    optionalDependencies:
-      vite: 6.1.6(@types/node@22.13.5)(jiti@2.4.2)(terser@5.39.0)(tsx@4.19.3)(yaml@2.8.0)
-    transitivePeerDependencies:
-      - postcss
-      - supports-color
-      - vue
-
   unpipe@1.0.0: {}
 
   unplugin-utils@0.2.4:
@@ -21818,11 +21726,11 @@ snapshots:
   unplugin-vue-components@28.4.0(@babel/parser@7.28.0)(vue@3.5.13(typescript@5.7.3)):
     dependencies:
       chokidar: 3.6.0
-      debug: 4.4.1(supports-color@8.1.1)
+      debug: 4.4.0
       local-pkg: 1.0.0
       magic-string: 0.30.17
       mlly: 1.7.4
-      tinyglobby: 0.2.14
+      tinyglobby: 0.2.12
       unplugin: 2.2.0
       unplugin-utils: 0.2.4
       vue: 3.5.13(typescript@5.7.3)
@@ -21896,7 +21804,7 @@ snapshots:
 
   v8-to-istanbul@9.3.0:
     dependencies:
-      '@jridgewell/trace-mapping': 0.3.29
+      '@jridgewell/trace-mapping': 0.3.25
       '@types/istanbul-lib-coverage': 2.0.6
       convert-source-map: 2.0.0
 
@@ -21951,17 +21859,6 @@ snapshots:
     transitivePeerDependencies:
       - supports-color
 
-  vite-plugin-pwa@0.21.2(vite@6.1.6(@types/node@22.13.5)(jiti@2.4.2)(terser@5.39.0)(tsx@4.19.3)(yaml@2.8.0))(workbox-build@7.1.1(@types/babel__core@7.20.5))(workbox-window@7.3.0):
-    dependencies:
-      debug: 4.4.1(supports-color@8.1.1)
-      pretty-bytes: 6.1.1
-      tinyglobby: 0.2.14
-      vite: 6.1.6(@types/node@22.13.5)(jiti@2.4.2)(terser@5.39.0)(tsx@4.19.3)(yaml@2.8.0)
-      workbox-build: 7.1.1(@types/babel__core@7.20.5)
-      workbox-window: 7.3.0
-    transitivePeerDependencies:
-      - supports-color
-
   vite-plugin-pwa@1.0.0(vite@6.1.1(@types/node@22.13.5)(jiti@2.4.2)(terser@5.39.0)(tsx@4.19.3)(yaml@2.8.0))(workbox-build@7.1.1(@types/babel__core@7.20.5))(workbox-window@7.3.0):
     dependencies:
       debug: 4.4.0

From ec7099dc279605b5028e0ac4242f36ab07671c78 Mon Sep 17 00:00:00 2001
From: Baraka Kinywa 
Date: Sat, 16 Aug 2025 10:20:05 +0200
Subject: [PATCH 138/143] docs(integrations): update Tiki to Tiki Wiki CMS
 Groupware community in list cms/ecm to avoid confusion

---
 docs/ecosystem/integrations-community.md                      | 2 +-
 packages/mermaid/src/docs/ecosystem/integrations-community.md | 2 +-
 2 files changed, 2 insertions(+), 2 deletions(-)

diff --git a/docs/ecosystem/integrations-community.md b/docs/ecosystem/integrations-community.md
index e86abfd81..c2887c43e 100644
--- a/docs/ecosystem/integrations-community.md
+++ b/docs/ecosystem/integrations-community.md
@@ -117,7 +117,7 @@ Content Management Systems/Enterprise Content Management
 - [Grav CMS](https://getgrav.org/)
   - [Mermaid Diagrams Plugin](https://github.com/DanielFlaum/grav-plugin-mermaid-diagrams)
   - [GitLab Markdown Adapter](https://github.com/Goutte/grav-plugin-gitlab-markdown-adapter)
-- [Tiki](https://tiki.org)
+- [Tiki Wiki CMS Groupware](https://tiki.org)
   - [Tracker Entity Relationship Diagram](https://doc.tiki.org/Tracker-Entity-Relationship-Diagram)
 - [VitePress](https://vitepress.vuejs.org/)
   - [Plugin for Mermaid.js](https://emersonbottero.github.io/vitepress-plugin-mermaid/)
diff --git a/packages/mermaid/src/docs/ecosystem/integrations-community.md b/packages/mermaid/src/docs/ecosystem/integrations-community.md
index 92a87b7ed..931dc1429 100644
--- a/packages/mermaid/src/docs/ecosystem/integrations-community.md
+++ b/packages/mermaid/src/docs/ecosystem/integrations-community.md
@@ -112,7 +112,7 @@ Content Management Systems/Enterprise Content Management
 - [Grav CMS](https://getgrav.org/)
   - [Mermaid Diagrams Plugin](https://github.com/DanielFlaum/grav-plugin-mermaid-diagrams)
   - [GitLab Markdown Adapter](https://github.com/Goutte/grav-plugin-gitlab-markdown-adapter)
-- [Tiki](https://tiki.org)
+- [Tiki Wiki CMS Groupware](https://tiki.org)
   - [Tracker Entity Relationship Diagram](https://doc.tiki.org/Tracker-Entity-Relationship-Diagram)
 - [VitePress](https://vitepress.vuejs.org/)
   - [Plugin for Mermaid.js](https://emersonbottero.github.io/vitepress-plugin-mermaid/)

From 880f7454a355bfb3612dac7870d9124440c3f812 Mon Sep 17 00:00:00 2001
From: Sidharth Vinod 
Date: Mon, 18 Aug 2025 16:50:53 +0530
Subject: [PATCH 139/143] fix: sanitize addHtmlLabel in createLabel

Co-authored-by: Chris Grieger 
---
 packages/mermaid/src/dagre-wrapper/createLabel.js | 15 ++++++++-------
 1 file changed, 8 insertions(+), 7 deletions(-)

diff --git a/packages/mermaid/src/dagre-wrapper/createLabel.js b/packages/mermaid/src/dagre-wrapper/createLabel.js
index 467eed260..fdab9a34e 100644
--- a/packages/mermaid/src/dagre-wrapper/createLabel.js
+++ b/packages/mermaid/src/dagre-wrapper/createLabel.js
@@ -1,9 +1,9 @@
 import { select } from 'd3';
-import { log } from '../logger.js';
 import { getConfig } from '../diagram-api/diagramAPI.js';
-import { evaluate } from '../diagrams/common/common.js';
-import { decodeEntities } from '../utils.js';
+import { evaluate, sanitizeText } from '../diagrams/common/common.js';
+import { log } from '../logger.js';
 import { replaceIconSubstring } from '../rendering-util/createText.js';
+import { decodeEntities } from '../utils.js';
 
 /**
  * @param dom
@@ -19,14 +19,14 @@ function applyStyle(dom, styleFn) {
  * @param {any} node
  * @returns {SVGForeignObjectElement} Node
  */
-function addHtmlLabel(node) {
+function addHtmlLabel(node, config) {
   const fo = select(document.createElementNS('http://www.w3.org/2000/svg', 'foreignObject'));
   const div = fo.append('xhtml:div');
 
   const label = node.label;
   const labelClass = node.isNode ? 'nodeLabel' : 'edgeLabel';
   const span = div.append('span');
-  span.html(label);
+  span.html(sanitizeText(label, config));
   applyStyle(span, node.labelStyle);
   span.attr('class', labelClass);
 
@@ -49,7 +49,8 @@ const createLabel = async (_vertexText, style, isTitle, isNode) => {
   if (typeof vertexText === 'object') {
     vertexText = vertexText[0];
   }
-  if (evaluate(getConfig().flowchart.htmlLabels)) {
+  const config = getConfig();
+  if (evaluate(config.flowchart.htmlLabels)) {
     // TODO: addHtmlLabel accepts a labelStyle. Do we possibly have that?
     vertexText = vertexText.replace(/\\n|\n/g, '
'); log.debug('vertexText' + vertexText); @@ -59,7 +60,7 @@ const createLabel = async (_vertexText, style, isTitle, isNode) => { label, labelStyle: style.replace('fill:', 'color:'), }; - let vertexNode = addHtmlLabel(node); + let vertexNode = addHtmlLabel(node, config); // vertexNode.parentNode.removeChild(vertexNode); return vertexNode; } else { From 4b89af3acac9e43d31bfb286f1536e569c607ed4 Mon Sep 17 00:00:00 2001 From: Sidharth Vinod Date: Mon, 18 Aug 2025 17:16:32 +0530 Subject: [PATCH 140/143] chore: just something to let autofix run --- cypress/platform/sidv.html | 4 ---- 1 file changed, 4 deletions(-) diff --git a/cypress/platform/sidv.html b/cypress/platform/sidv.html index b0a1699da..1651b0737 100644 --- a/cypress/platform/sidv.html +++ b/cypress/platform/sidv.html @@ -41,10 +41,6 @@ graph TB const { svg } = await mermaid.render('d22', value); console.log(svg); el.innerHTML = svg; - // mermaid.test1('first_slow', 1200).then((r) => console.info(r)); - // mermaid.test1('second_fast', 200).then((r) => console.info(r)); - // mermaid.test1('third_fast', 200).then((r) => console.info(r)); - // mermaid.test1('forth_slow', 1200).then((r) => console.info(r)); From 8c7da5af56818446b686cd27fc792b781141d6f2 Mon Sep 17 00:00:00 2001 From: "autofix-ci[bot]" <114827586+autofix-ci[bot]@users.noreply.github.com> Date: Mon, 18 Aug 2025 11:52:01 +0000 Subject: [PATCH 141/143] [autofix.ci] apply automated fixes --- docs/syntax/pie.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/syntax/pie.md b/docs/syntax/pie.md index 6a2eefb27..fd5ec1db0 100644 --- a/docs/syntax/pie.md +++ b/docs/syntax/pie.md @@ -39,7 +39,7 @@ Drawing a pie chart is really simple in mermaid. **Note:** -> Pie chart values must be **positive numbers greater than zero**.\ +> Pie chart values must be **positive numbers greater than zero**. > **Negative values are not allowed** and will result in an error. \[pie] \[showData] (OPTIONAL) From fc2c32603d9118944e92a4aee8286a4ac55c4a8c Mon Sep 17 00:00:00 2001 From: Sidharth Vinod Date: Mon, 18 Aug 2025 17:25:32 +0530 Subject: [PATCH 142/143] fix: Config handling Co-authored-by: Saurabh Gore --- packages/mermaid/src/rendering-util/createText.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/packages/mermaid/src/rendering-util/createText.ts b/packages/mermaid/src/rendering-util/createText.ts index 47f8bb98b..759330390 100644 --- a/packages/mermaid/src/rendering-util/createText.ts +++ b/packages/mermaid/src/rendering-util/createText.ts @@ -11,6 +11,7 @@ import { decodeEntities } from '../utils.js'; import { getIconSVG, isIconAvailable } from './icons.js'; import { splitLineToFitWidth } from './splitText.js'; import type { MarkdownLine, MarkdownWord } from './types.js'; +import { getConfig } from '../config.js'; function applyStyle(dom, styleFn) { if (styleFn) { @@ -25,7 +26,7 @@ async function addHtmlSpan( classes, addBackground = false, // TODO: Make config mandatory - config: MermaidConfig = {} + config: MermaidConfig = getConfig() ) { const fo = element.append('foreignObject'); // This is not the final width but used in order to make sure the foreign From cad144734dc2618f4dd2c3c5538bb4d5c85304ee Mon Sep 17 00:00:00 2001 From: Sidharth Vinod Date: Mon, 18 Aug 2025 17:55:32 +0530 Subject: [PATCH 143/143] chore: ignore redmine.org in linkchecker --- .github/lychee.toml | 1 + docs/ecosystem/integrations-community.md | 2 +- packages/mermaid/src/docs/ecosystem/integrations-community.md | 2 +- 3 files changed, 3 insertions(+), 2 deletions(-) diff --git a/.github/lychee.toml b/.github/lychee.toml index fbe7a71a2..06b3aa707 100644 --- a/.github/lychee.toml +++ b/.github/lychee.toml @@ -59,6 +59,7 @@ exclude = [ "https://huehive.co", "https://foswiki.org", "https://www.gnu.org", +"https://redmine.org", "https://mermaid-preview.com" ] diff --git a/docs/ecosystem/integrations-community.md b/docs/ecosystem/integrations-community.md index c2887c43e..6bc16e3e2 100644 --- a/docs/ecosystem/integrations-community.md +++ b/docs/ecosystem/integrations-community.md @@ -73,7 +73,7 @@ To add an integration to this list, see the [Integrations - create page](./integ - [Obsidian](https://help.obsidian.md/Editing+and+formatting/Advanced+formatting+syntax#Diagram) ✅ - [Outline](https://docs.getoutline.com/s/guide/doc/diagrams-KQiKoT4wzK) ✅ - [Redmine](https://redmine.org) - - [Mermaid Macro](https://www.redmine.org/plugins/redmine_mermaid_macro) + - [Mermaid Macro](https://redmine.org/plugins/redmine_mermaid_macro) - [Markdown for mermaid plugin](https://github.com/jamieh-mongolian/markdown-for-mermaid-plugin) - [redmine-mermaid](https://github.com/styz/redmine_mermaid) - Visual Studio Code [Polyglot Interactive Notebooks](https://github.com/dotnet/interactive#net-interactive) diff --git a/packages/mermaid/src/docs/ecosystem/integrations-community.md b/packages/mermaid/src/docs/ecosystem/integrations-community.md index 931dc1429..a4a68e6ab 100644 --- a/packages/mermaid/src/docs/ecosystem/integrations-community.md +++ b/packages/mermaid/src/docs/ecosystem/integrations-community.md @@ -68,7 +68,7 @@ To add an integration to this list, see the [Integrations - create page](./integ - [Obsidian](https://help.obsidian.md/Editing+and+formatting/Advanced+formatting+syntax#Diagram) ✅ - [Outline](https://docs.getoutline.com/s/guide/doc/diagrams-KQiKoT4wzK) ✅ - [Redmine](https://redmine.org) - - [Mermaid Macro](https://www.redmine.org/plugins/redmine_mermaid_macro) + - [Mermaid Macro](https://redmine.org/plugins/redmine_mermaid_macro) - [Markdown for mermaid plugin](https://github.com/jamieh-mongolian/markdown-for-mermaid-plugin) - [redmine-mermaid](https://github.com/styz/redmine_mermaid) - Visual Studio Code [Polyglot Interactive Notebooks](https://github.com/dotnet/interactive#net-interactive)