@diagrammo/dgmo 0.8.20 → 0.8.22

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (110) hide show
  1. package/AGENTS.md +2 -1
  2. package/README.md +1 -0
  3. package/dist/cli.cjs +142 -90
  4. package/dist/editor.cjs +30 -4
  5. package/dist/editor.cjs.map +1 -1
  6. package/dist/editor.js +30 -4
  7. package/dist/editor.js.map +1 -1
  8. package/dist/highlight.cjs +25 -3
  9. package/dist/highlight.cjs.map +1 -1
  10. package/dist/highlight.js +25 -3
  11. package/dist/highlight.js.map +1 -1
  12. package/dist/index.cjs +21201 -12886
  13. package/dist/index.cjs.map +1 -1
  14. package/dist/index.d.cts +646 -89
  15. package/dist/index.d.ts +646 -89
  16. package/dist/index.js +21178 -12889
  17. package/dist/index.js.map +1 -1
  18. package/docs/guide/chart-mindmap.md +198 -0
  19. package/docs/guide/chart-sequence.md +23 -1
  20. package/docs/guide/chart-sitemap.md +18 -1
  21. package/docs/guide/chart-tech-radar.md +219 -0
  22. package/docs/guide/chart-wireframe.md +100 -0
  23. package/docs/guide/index.md +8 -0
  24. package/docs/guide/registry.json +1 -0
  25. package/docs/language-reference.md +249 -4
  26. package/gallery/fixtures/boxes-and-lines.dgmo +10 -3
  27. package/gallery/fixtures/c4-full.dgmo +2 -2
  28. package/gallery/fixtures/cycle/ooda-loop.dgmo +25 -0
  29. package/gallery/fixtures/cycle/pdca-circle-nodes.dgmo +12 -0
  30. package/gallery/fixtures/cycle/pdca-minimal.dgmo +6 -0
  31. package/gallery/fixtures/cycle/sprint-cycle-span.dgmo +17 -0
  32. package/gallery/fixtures/gantt-full.dgmo +2 -2
  33. package/gallery/fixtures/gantt.dgmo +2 -2
  34. package/gallery/fixtures/infra-full.dgmo +2 -2
  35. package/gallery/fixtures/infra.dgmo +1 -1
  36. package/gallery/fixtures/sequence-tags-protocols.dgmo +2 -2
  37. package/gallery/fixtures/sequence-tags.dgmo +2 -2
  38. package/gallery/fixtures/tech-radar-dense.dgmo +77 -0
  39. package/gallery/fixtures/tech-radar.dgmo +36 -0
  40. package/gallery/fixtures/timeline.dgmo +1 -1
  41. package/package.json +1 -1
  42. package/src/boxes-and-lines/collapse.ts +21 -3
  43. package/src/boxes-and-lines/layout.ts +360 -42
  44. package/src/boxes-and-lines/parser.ts +94 -11
  45. package/src/boxes-and-lines/renderer.ts +371 -114
  46. package/src/boxes-and-lines/types.ts +2 -1
  47. package/src/c4/layout.ts +8 -8
  48. package/src/c4/parser.ts +35 -2
  49. package/src/c4/renderer.ts +19 -3
  50. package/src/c4/types.ts +1 -0
  51. package/src/chart.ts +14 -7
  52. package/src/completion.ts +253 -0
  53. package/src/cycle/layout.ts +732 -0
  54. package/src/cycle/parser.ts +352 -0
  55. package/src/cycle/renderer.ts +539 -0
  56. package/src/cycle/types.ts +77 -0
  57. package/src/d3.ts +240 -40
  58. package/src/dgmo-router.ts +15 -0
  59. package/src/echarts.ts +7 -4
  60. package/src/editor/dgmo.grammar +5 -1
  61. package/src/editor/dgmo.grammar.js +1 -1
  62. package/src/editor/keywords.ts +26 -0
  63. package/src/gantt/parser.ts +2 -8
  64. package/src/graph/flowchart-parser.ts +15 -21
  65. package/src/graph/layout.ts +73 -9
  66. package/src/graph/state-collapse.ts +78 -0
  67. package/src/graph/state-parser.ts +5 -10
  68. package/src/graph/state-renderer.ts +139 -34
  69. package/src/index.ts +78 -0
  70. package/src/infra/layout.ts +218 -74
  71. package/src/infra/parser.ts +30 -6
  72. package/src/infra/renderer.ts +14 -8
  73. package/src/infra/types.ts +10 -3
  74. package/src/journey-map/layout.ts +386 -0
  75. package/src/journey-map/parser.ts +540 -0
  76. package/src/journey-map/renderer.ts +1456 -0
  77. package/src/journey-map/types.ts +47 -0
  78. package/src/kanban/parser.ts +3 -10
  79. package/src/kanban/renderer.ts +325 -63
  80. package/src/mindmap/collapse.ts +88 -0
  81. package/src/mindmap/layout.ts +605 -0
  82. package/src/mindmap/parser.ts +373 -0
  83. package/src/mindmap/renderer.ts +544 -0
  84. package/src/mindmap/text-wrap.ts +217 -0
  85. package/src/mindmap/types.ts +55 -0
  86. package/src/org/parser.ts +2 -6
  87. package/src/render.ts +18 -21
  88. package/src/sequence/renderer.ts +273 -56
  89. package/src/sharing.ts +3 -0
  90. package/src/sitemap/layout.ts +56 -18
  91. package/src/sitemap/parser.ts +26 -17
  92. package/src/sitemap/renderer.ts +34 -0
  93. package/src/sitemap/types.ts +1 -0
  94. package/src/tech-radar/index.ts +14 -0
  95. package/src/tech-radar/interactive.ts +1058 -0
  96. package/src/tech-radar/layout.ts +190 -0
  97. package/src/tech-radar/parser.ts +385 -0
  98. package/src/tech-radar/renderer.ts +1159 -0
  99. package/src/tech-radar/shared.ts +187 -0
  100. package/src/tech-radar/types.ts +81 -0
  101. package/src/utils/description-helpers.ts +33 -0
  102. package/src/utils/export-container.ts +3 -2
  103. package/src/utils/legend-d3.ts +1 -0
  104. package/src/utils/legend-layout.ts +5 -3
  105. package/src/utils/parsing.ts +48 -7
  106. package/src/utils/tag-groups.ts +46 -60
  107. package/src/wireframe/layout.ts +460 -0
  108. package/src/wireframe/parser.ts +956 -0
  109. package/src/wireframe/renderer.ts +1293 -0
  110. package/src/wireframe/types.ts +110 -0
package/dist/editor.cjs CHANGED
@@ -56,6 +56,10 @@ var CHART_TYPES = /* @__PURE__ */ new Set([
56
56
  "infra",
57
57
  "gantt",
58
58
  "boxes-and-lines",
59
+ "wireframe",
60
+ "tech-radar",
61
+ "mindmap",
62
+ "journey-map",
59
63
  // Data chart types
60
64
  "bar",
61
65
  "line",
@@ -104,7 +108,11 @@ var METADATA_KEYS = /* @__PURE__ */ new Set([
104
108
  "top-right",
105
109
  "top-left",
106
110
  "bottom-right",
107
- "bottom-left"
111
+ "bottom-left",
112
+ // Tech-radar pipe metadata
113
+ "quadrant",
114
+ "ring",
115
+ "trend"
108
116
  ]);
109
117
  var TAG_KEYWORD = "tag";
110
118
  var DIRECTIVE_KEYWORDS = /* @__PURE__ */ new Set([
@@ -118,6 +126,8 @@ var DIRECTIVE_KEYWORDS = /* @__PURE__ */ new Set([
118
126
  "critical-path",
119
127
  "no-dependencies",
120
128
  "sort",
129
+ // Tech-radar
130
+ "rings",
121
131
  // Tags
122
132
  "tags",
123
133
  "import",
@@ -204,7 +214,18 @@ var CONTROL_KEYWORDS = /* @__PURE__ */ new Set([
204
214
  "else",
205
215
  "loop",
206
216
  "parallel",
207
- "note"
217
+ "note",
218
+ // Wireframe elements
219
+ "nav",
220
+ "tabs",
221
+ "table",
222
+ "image",
223
+ "modal",
224
+ "skeleton",
225
+ "alert",
226
+ "progress",
227
+ "chart",
228
+ "mobile"
208
229
  ]);
209
230
  var STATUS_KEYWORDS = /* @__PURE__ */ new Set([
210
231
  "na",
@@ -214,7 +235,12 @@ var STATUS_KEYWORDS = /* @__PURE__ */ new Set([
214
235
  "blocked",
215
236
  "in-progress",
216
237
  "backlog",
217
- "ready"
238
+ "ready",
239
+ // Tech-radar trend values
240
+ "new",
241
+ "up",
242
+ "down",
243
+ "stable"
218
244
  ]);
219
245
  var MODIFIER_KEYWORDS = /* @__PURE__ */ new Set([
220
246
  "alias",
@@ -258,7 +284,7 @@ var parser = import_lr.LRParser.deserialize({
258
284
  maxTerm: 40,
259
285
  skippedNodes: [0],
260
286
  repeatNodeCount: 2,
261
- tokenData: ":T~RxOX#oXY#tYZ$PZp#opq#tqt#oux#oxy$Uyz$tz{${{|%S|}%Z}!O%b!O!P#o!P!Q%q!Q![&b![!]-Y!]!^#o!^!_-a!_!`-h!`!a-u!a!b-|!b!c#o!c!}.T!}#O1Z#O#P#o#P#Q1`#Q#R#o#R#S.T#S#T#o#T#[.T#[#]1g#]#o.T#o#p#o#p#q9g#q#r#o#r#s9n#s;'S#o;'S;=`9}<%lO#o~#tOq~~#yQv~XY#tpq#t~$UOw~~$]Qc~q~}!O$c#T#o$c~$fRyz$o}!O$c#T#o$c~$tOg~~${Od~q~~%SOn~q~~%ZOk~q~~%bOj~q~~%iPl~q~!`!a%l~%qOX~~%vPq~!P!Q%y~&OSV~OY%yZ;'S%y;'S;=`&[<%lO%y~&_P;=`<%l%y~&iZ^~q~uv'[!O!P'a!Q![)Q#U#V([#W#X(b#[#](b#a#b(o#e#f(b#g#h(b#k#l(b#m#n(b~'aO]~~'dP!Q!['g~'lY^~uv'[!Q!['g#U#V([#W#X(b#[#](b#a#b(o#e#f(b#g#h(b#k#l(b#m#n(b~(_P#W#X(b~(gPZ~!a!b(j~(oOZ~~(tQZ~!a!b(j#]#^(z~(}P#b#c(b~)VZ^~uv'[!O!P'a!Q![)x#U#V([#W#X(b#[#](b#a#b(o#e#f(b#g#h(b#k#l(b#m#n(b~)}Z^~uv'[!O!P'a!Q![*p#U#V([#W#X(b#[#](b#a#b(o#e#f(b#g#h(b#k#l(b#m#n(b~*u[^~uv'[}!O+k!O!P'a!Q![,b#U#V([#W#X(b#[#](b#a#b(o#e#f(b#g#h(b#k#l(b#m#n(b~+nP!Q![+q~+tP!Q![+w~+|P[~}!O,P~,SP!Q![,V~,YP!Q![,]~,bO[~~,gZ^~uv'[!O!P'a!Q![,b#U#V([#W#X(b#[#](b#a#b(o#e#f(b#g#h(b#k#l(b#m#n(b~-aOi~q~~-hOe~q~~-mPq~!_!`-p~-uO_~~-|Of~q~~.TOo~q~~.[_p~q~qr/Zst/Zvw/Zwx/Z{|/Z}!O0_!O!P/Z!P!Q/Z!Q![/Z!_!`/Z!a!b/Z!b!c/Z!c!}/Z#R#S/Z#T#o/Z~/`_p~qr/Zst/Zvw/Zwx/Z{|/Z}!O0_!O!P/Z!P!Q/Z!Q![/Z!_!`/Z!a!b/Z!b!c/Z!c!}/Z#R#S/Z#T#o/Z~0b]qr/Zst/Zvw/Zwx/Z{|/Z!O!P/Z!P!Q/Z!_!`/Z!a!b/Z!b!c/Z!c!}/Z#R#S/Z#T#o/Z~1`Oa~~1gOb~q~~1nap~q~qr/Zst/Zvw/Zwx/Z{|/Z}!O0_!O!P/Z!P!Q/Z!Q![/Z!_!`/Z!a!b/Z!b!c/Z!c!}/Z#R#S/Z#T#h/Z#h#i2s#i#o/Z~2xap~qr/Zst/Zvw/Zwx/Z{|/Z}!O0_!O!P/Z!P!Q/Z!Q![/Z!_!`/Z!a!b/Z!b!c/Z!c!}/Z#R#S/Z#T#h/Z#h#i3}#i#o/Z~4Sap~qr/Zst/Zvw/Zwx/Z{|/Z}!O0_!O!P/Z!P!Q/Z!Q![/Z!_!`/Z!a!b/Z!b!c/Z!c!}/Z#R#S/Z#T#d/Z#d#e5X#e#o/Z~5^bp~qr/Zst/Zvw/Zwx/Z{|/Z}!O0_!O!P/Z!P!Q/Z!Q![/Z![!]6f!_!`/Z!a!b/Z!b!c/Z!c!}/Z#R#S/Z#T#g/Z#g#h8`#h#o/Z~6iP!P!Q6l~6oP!P!Q6r~6uYOX7eZp7eqy7ez|7e}!`7e!a#P7e#Q#p7e#q;'S7e;'S;=`8Y<%lO7e~7jY`~OX7eZp7eqy7ez|7e}!`7e!a#P7e#Q#p7e#q;'S7e;'S;=`8Y<%lO7e~8]P;=`<%l7e~8e`p~qr/Zst/Zvw/Zwx/Z{|/Z}!O0_!O!P/Z!P!Q/Z!Q![/Z![!]6f!_!`/Z!a!b/Z!b!c/Z!c!}/Z#R#S/Z#T#o/Z~9nOh~q~~9uPm~q~!`!a9x~9}OY~~:QP;=`<%l#o",
287
+ tokenData: "<O~RxOX#oXY#tYZ$PZp#opq#tqt#oux#oxy$Uyz$tz{${{|%S|}%Z}!O%b!O!P#o!P!Q%q!Q![&b![!]/T!]!^#o!^!_/[!_!`/c!`!a/p!a!b/w!b!c#o!c!}0O!}#O3U#O#P#o#P#Q3Z#Q#R#o#R#S0O#S#T#o#T#[0O#[#]3b#]#o0O#o#p#o#p#q;b#q#r#o#r#s;i#s;'S#o;'S;=`;x<%lO#o~#tOq~~#yQv~XY#tpq#t~$UOw~~$]Qc~q~}!O$c#T#o$c~$fRyz$o}!O$c#T#o$c~$tOg~~${Od~q~~%SOn~q~~%ZOk~q~~%bOj~q~~%iPl~q~!`!a%l~%qOX~~%vPq~!P!Q%y~&OSV~OY%yZ;'S%y;'S;=`&[<%lO%y~&_P;=`<%l%y~&i]^~q~uv'b|}'g!O!P(d!Q![*T#R#S.o#U#V)_#W#X)e#[#])e#a#b)r#e#f)e#g#h)e#k#l)e#m#n)e~'gO]~~'jP!Q!['m~'pP!Q!['s~'vP!Q!['y~(OQ^~|}'g!O!P(U~(XP!Q![([~(aP^~!Q![([~(gP!Q![(j~(oY^~uv'b!Q![(j#U#V)_#W#X)e#[#])e#a#b)r#e#f)e#g#h)e#k#l)e#m#n)e~)bP#W#X)e~)jPZ~!a!b)m~)rOZ~~)wQZ~!a!b)m#]#^)}~*QP#b#c)e~*Y]^~uv'b|}'g!O!P(d!Q![+R#R#S.o#U#V)_#W#X)e#[#])e#a#b)r#e#f)e#g#h)e#k#l)e#m#n)e~+W]^~uv'b|}'g!O!P(d!Q![,P#R#S.o#U#V)_#W#X)e#[#])e#a#b)r#e#f)e#g#h)e#k#l)e#m#n)e~,U]^~uv'b}!O,}!O!P(d!Q![-t#R#S.o#U#V)_#W#X)e#[#])e#a#b)r#e#f)e#g#h)e#k#l)e#m#n)e~-QP!Q![-T~-WP!Q![-Z~-`P[~}!O-c~-fP!Q![-i~-lP!Q![-o~-tO[~~-y[^~uv'b!O!P(d!Q![-t#R#S.o#U#V)_#W#X)e#[#])e#a#b)r#e#f)e#g#h)e#k#l)e#m#n)e~.rP!Q![.u~.zR^~!O!P(U!Q![.u#R#S.o~/[Oi~q~~/cOe~q~~/hPq~!_!`/k~/pO_~~/wOf~q~~0OOo~q~~0V_p~q~qr1Ust1Uvw1Uwx1U{|1U}!O2Y!O!P1U!P!Q1U!Q![1U!_!`1U!a!b1U!b!c1U!c!}1U#R#S1U#T#o1U~1Z_p~qr1Ust1Uvw1Uwx1U{|1U}!O2Y!O!P1U!P!Q1U!Q![1U!_!`1U!a!b1U!b!c1U!c!}1U#R#S1U#T#o1U~2]]qr1Ust1Uvw1Uwx1U{|1U!O!P1U!P!Q1U!_!`1U!a!b1U!b!c1U!c!}1U#R#S1U#T#o1U~3ZOa~~3bOb~q~~3iap~q~qr1Ust1Uvw1Uwx1U{|1U}!O2Y!O!P1U!P!Q1U!Q![1U!_!`1U!a!b1U!b!c1U!c!}1U#R#S1U#T#h1U#h#i4n#i#o1U~4sap~qr1Ust1Uvw1Uwx1U{|1U}!O2Y!O!P1U!P!Q1U!Q![1U!_!`1U!a!b1U!b!c1U!c!}1U#R#S1U#T#h1U#h#i5x#i#o1U~5}ap~qr1Ust1Uvw1Uwx1U{|1U}!O2Y!O!P1U!P!Q1U!Q![1U!_!`1U!a!b1U!b!c1U!c!}1U#R#S1U#T#d1U#d#e7S#e#o1U~7Xbp~qr1Ust1Uvw1Uwx1U{|1U}!O2Y!O!P1U!P!Q1U!Q![1U![!]8a!_!`1U!a!b1U!b!c1U!c!}1U#R#S1U#T#g1U#g#h:Z#h#o1U~8dP!P!Q8g~8jP!P!Q8m~8pYOX9`Zp9`qy9`z|9`}!`9`!a#P9`#Q#p9`#q;'S9`;'S;=`:T<%lO9`~9eY`~OX9`Zp9`qy9`z|9`}!`9`!a#P9`#Q#p9`#q;'S9`;'S;=`:T<%lO9`~:WP;=`<%l9`~:``p~qr1Ust1Uvw1Uwx1U{|1U}!O2Y!O!P1U!P!Q1U!Q![1U![!]8a!_!`1U!a!b1U!b!c1U!c!}1U#R#S1U#T#o1U~;iOh~q~~;pPm~q~!`!a;s~;xOY~~;{P;=`<%l#o",
262
288
  tokenizers: [0],
263
289
  topRules: { "Document": [0, 6] },
264
290
  specialized: [{ term: 32, get: (value, stack) => specializeKeyword(value, stack) << 1, external: specializeKeyword }],
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/editor/index.ts","../src/editor/dgmo.grammar.js","../src/editor/dgmo.grammar.terms.js","../src/editor/keywords.ts","../src/editor/tokens.ts","../src/editor/highlight.ts"],"sourcesContent":["import { LRLanguage, LanguageSupport } from '@codemirror/language';\nimport { parser } from './dgmo.grammar.js';\nimport { dgmoHighlighting } from './highlight';\n\nexport { CHART_TYPES, METADATA_KEYS } from './keywords';\nexport { dgmoHighlighting } from './highlight';\n\n/** The raw Lezer parser for DGMO. */\nexport const dgmoParser = parser.configure({\n props: [dgmoHighlighting],\n});\n\n/** LRLanguage wrapper for CodeMirror. */\nexport const dgmoLanguage = LRLanguage.define({\n name: 'dgmo',\n parser: dgmoParser,\n});\n\n/** Full language support (language + extensions). */\nexport const dgmoLanguageSupport = new LanguageSupport(dgmoLanguage);\n\n/**\n * Drop-in replacement for the old dgmoExtension.\n * Consumers should add indentationMarkers() separately if desired\n * (from @replit/codemirror-indentation-markers).\n */\nexport const dgmoExtension = dgmoLanguageSupport;\n","// This file was generated by lezer-generator. You probably shouldn't edit it.\nimport {LRParser} from \"@lezer/lr\"\nimport {specializeKeyword} from \"./tokens\"\nexport const parser = LRParser.deserialize({\n version: 14,\n states: \"!WQVQPOOOOQO'#DU'#DUOOQO'#DP'#DPO%]QPO'#CdOOQO'#DO'#DOQVQPOOOOQO-E6}-E6}OOQO,59O,59OOOQO-E6|-E6|\",\n stateData: \"&Q~OvOS~OPPOQPORPOSPOTPOVSOXPOYPOZPO[PO]PO^PO_PO`POaPObPOcPOdPOePOfPOgPOhPOiPOjPOkPOlPOmPOnPOoPOpPOqPOwSO~OPPOQPORPOSPOTPOXPOYPOZPO[PO]PO^PO_PO`POaPObPOcPOdPOePOfPOgPOhPOiPOjPOkPOlPOmPOnPOoPOpPOqPO~OwVO~P#]OVXYZ[]^_`ghijklmnoabcdefpqk~\",\n goto: \"!byPPPPPPPPzPPPPPPPPPPPPPPPPPPPPPPPPP!O!UPPPP!]TSOTQTORWTSROTRURVQORT\",\n nodeNames: \"⚠ ChartType TagKeyword DirectiveKeyword ControlKeyword ModifierKeyword Document Comment ContentLine SyncArrow AsyncArrow Duration DateLiteral Percentage Number SectionMarker Url OpenBracket CloseBracket OpenParen CloseParen OpenAngle CloseAngle ColorAnnotation Pipe Colon Comma Plus Dash Tilde Star Question Identifier Punct\",\n maxTerm: 40,\n skippedNodes: [0],\n repeatNodeCount: 2,\n tokenData: \":T~RxOX#oXY#tYZ$PZp#opq#tqt#oux#oxy$Uyz$tz{${{|%S|}%Z}!O%b!O!P#o!P!Q%q!Q![&b![!]-Y!]!^#o!^!_-a!_!`-h!`!a-u!a!b-|!b!c#o!c!}.T!}#O1Z#O#P#o#P#Q1`#Q#R#o#R#S.T#S#T#o#T#[.T#[#]1g#]#o.T#o#p#o#p#q9g#q#r#o#r#s9n#s;'S#o;'S;=`9}<%lO#o~#tOq~~#yQv~XY#tpq#t~$UOw~~$]Qc~q~}!O$c#T#o$c~$fRyz$o}!O$c#T#o$c~$tOg~~${Od~q~~%SOn~q~~%ZOk~q~~%bOj~q~~%iPl~q~!`!a%l~%qOX~~%vPq~!P!Q%y~&OSV~OY%yZ;'S%y;'S;=`&[<%lO%y~&_P;=`<%l%y~&iZ^~q~uv'[!O!P'a!Q![)Q#U#V([#W#X(b#[#](b#a#b(o#e#f(b#g#h(b#k#l(b#m#n(b~'aO]~~'dP!Q!['g~'lY^~uv'[!Q!['g#U#V([#W#X(b#[#](b#a#b(o#e#f(b#g#h(b#k#l(b#m#n(b~(_P#W#X(b~(gPZ~!a!b(j~(oOZ~~(tQZ~!a!b(j#]#^(z~(}P#b#c(b~)VZ^~uv'[!O!P'a!Q![)x#U#V([#W#X(b#[#](b#a#b(o#e#f(b#g#h(b#k#l(b#m#n(b~)}Z^~uv'[!O!P'a!Q![*p#U#V([#W#X(b#[#](b#a#b(o#e#f(b#g#h(b#k#l(b#m#n(b~*u[^~uv'[}!O+k!O!P'a!Q![,b#U#V([#W#X(b#[#](b#a#b(o#e#f(b#g#h(b#k#l(b#m#n(b~+nP!Q![+q~+tP!Q![+w~+|P[~}!O,P~,SP!Q![,V~,YP!Q![,]~,bO[~~,gZ^~uv'[!O!P'a!Q![,b#U#V([#W#X(b#[#](b#a#b(o#e#f(b#g#h(b#k#l(b#m#n(b~-aOi~q~~-hOe~q~~-mPq~!_!`-p~-uO_~~-|Of~q~~.TOo~q~~.[_p~q~qr/Zst/Zvw/Zwx/Z{|/Z}!O0_!O!P/Z!P!Q/Z!Q![/Z!_!`/Z!a!b/Z!b!c/Z!c!}/Z#R#S/Z#T#o/Z~/`_p~qr/Zst/Zvw/Zwx/Z{|/Z}!O0_!O!P/Z!P!Q/Z!Q![/Z!_!`/Z!a!b/Z!b!c/Z!c!}/Z#R#S/Z#T#o/Z~0b]qr/Zst/Zvw/Zwx/Z{|/Z!O!P/Z!P!Q/Z!_!`/Z!a!b/Z!b!c/Z!c!}/Z#R#S/Z#T#o/Z~1`Oa~~1gOb~q~~1nap~q~qr/Zst/Zvw/Zwx/Z{|/Z}!O0_!O!P/Z!P!Q/Z!Q![/Z!_!`/Z!a!b/Z!b!c/Z!c!}/Z#R#S/Z#T#h/Z#h#i2s#i#o/Z~2xap~qr/Zst/Zvw/Zwx/Z{|/Z}!O0_!O!P/Z!P!Q/Z!Q![/Z!_!`/Z!a!b/Z!b!c/Z!c!}/Z#R#S/Z#T#h/Z#h#i3}#i#o/Z~4Sap~qr/Zst/Zvw/Zwx/Z{|/Z}!O0_!O!P/Z!P!Q/Z!Q![/Z!_!`/Z!a!b/Z!b!c/Z!c!}/Z#R#S/Z#T#d/Z#d#e5X#e#o/Z~5^bp~qr/Zst/Zvw/Zwx/Z{|/Z}!O0_!O!P/Z!P!Q/Z!Q![/Z![!]6f!_!`/Z!a!b/Z!b!c/Z!c!}/Z#R#S/Z#T#g/Z#g#h8`#h#o/Z~6iP!P!Q6l~6oP!P!Q6r~6uYOX7eZp7eqy7ez|7e}!`7e!a#P7e#Q#p7e#q;'S7e;'S;=`8Y<%lO7e~7jY`~OX7eZp7eqy7ez|7e}!`7e!a#P7e#Q#p7e#q;'S7e;'S;=`8Y<%lO7e~8]P;=`<%l7e~8e`p~qr/Zst/Zvw/Zwx/Z{|/Z}!O0_!O!P/Z!P!Q/Z!Q![/Z![!]6f!_!`/Z!a!b/Z!b!c/Z!c!}/Z#R#S/Z#T#o/Z~9nOh~q~~9uPm~q~!`!a9x~9}OY~~:QP;=`<%l#o\",\n tokenizers: [0],\n topRules: {\"Document\":[0,6]},\n specialized: [{term: 32, get: (value, stack) => (specializeKeyword(value, stack) << 1), external: specializeKeyword}],\n tokenPrec: 204\n})\n","// This file was generated by lezer-generator. You probably shouldn't edit it.\nexport const\n ChartType = 1,\n TagKeyword = 2,\n DirectiveKeyword = 3,\n ControlKeyword = 4,\n ModifierKeyword = 5,\n Document = 6,\n Comment = 7,\n ContentLine = 8,\n SyncArrow = 9,\n AsyncArrow = 10,\n Duration = 11,\n DateLiteral = 12,\n Percentage = 13,\n Number = 14,\n SectionMarker = 15,\n Url = 16,\n OpenBracket = 17,\n CloseBracket = 18,\n OpenParen = 19,\n CloseParen = 20,\n OpenAngle = 21,\n CloseAngle = 22,\n ColorAnnotation = 23,\n Pipe = 24,\n Colon = 25,\n Comma = 26,\n Plus = 27,\n Dash = 28,\n Tilde = 29,\n Star = 30,\n Question = 31,\n Identifier = 32,\n Punct = 33\n","/** All supported DGMO chart types. */\nexport const CHART_TYPES = new Set([\n // Diagram types\n 'sequence',\n 'flowchart',\n 'class',\n 'er',\n 'org',\n 'kanban',\n 'c4',\n 'state',\n 'sitemap',\n 'infra',\n 'gantt',\n 'boxes-and-lines',\n // Data chart types\n 'bar',\n 'line',\n 'pie',\n 'doughnut',\n 'area',\n 'polar-area',\n 'radar',\n 'bar-stacked',\n 'multi-line',\n 'scatter',\n 'sankey',\n 'chord',\n 'function',\n 'heatmap',\n 'funnel',\n // Visualization types\n 'slope',\n 'wordcloud',\n 'arc',\n 'timeline',\n 'venn',\n 'quadrant',\n]);\n\n/** Metadata keys recognized across chart types. */\nexport const METADATA_KEYS = new Set([\n 'title',\n 'series',\n 'orientation',\n 'x-label',\n 'y-label',\n 'size-label',\n 'x',\n 'columns',\n 'rows',\n 'labels',\n 'rotate',\n 'max',\n 'size',\n 'order',\n 'sort',\n 'scale',\n 'values',\n 'notation',\n 'x-axis',\n 'y-axis',\n 'top-right',\n 'top-left',\n 'bottom-right',\n 'bottom-left',\n]);\n\n/** Tag declaration keyword. */\nexport const TAG_KEYWORD = 'tag';\n\n/** Directive keywords — commands that configure chart behavior. */\nexport const DIRECTIVE_KEYWORDS = new Set([\n // Gantt\n 'start',\n 'era',\n 'marker',\n 'holiday',\n 'workweek',\n 'today-marker',\n 'critical-path',\n 'no-dependencies',\n 'sort',\n // Tags\n 'tags',\n 'import',\n 'active-tag',\n 'hide',\n 'mode',\n 'direction',\n // ER\n 'notation',\n // Class\n 'extends',\n 'implements',\n 'abstract',\n 'interface',\n 'enum',\n // C4\n 'containers',\n 'components',\n 'deployment',\n // Infra directives\n 'sub-node-label',\n 'show-sub-node-count',\n 'no-auto-color',\n // Infra node properties\n 'description',\n 'instances',\n 'max-rps',\n 'latency-ms',\n 'uptime',\n 'firewall-block',\n 'ratelimit-rps',\n 'cb-error-threshold',\n 'cb-latency-threshold-ms',\n 'buffer',\n 'drain-rate',\n 'retention-hours',\n 'partitions',\n 'split',\n 'slo-p90-latency-ms',\n 'slo-availability',\n 'cache-hit',\n 'concurrency',\n 'duration-ms',\n 'cold-start-ms',\n 'rps',\n // Sequence\n 'activations',\n 'no-activations',\n 'collapse-notes',\n 'no-collapse-notes',\n // Data charts\n 'stacked',\n 'no-label-name',\n 'no-label-value',\n 'no-label-percent',\n // Slope\n 'period',\n // Quadrant\n 'x-axis',\n 'y-axis',\n 'top-right',\n 'top-left',\n 'bottom-right',\n 'bottom-left',\n // Layout\n 'direction-tb',\n 'direction-lr',\n // Data chart metadata\n 'title',\n 'series',\n 'orientation',\n 'x-label',\n 'y-label',\n 'size-label',\n 'columns',\n 'rows',\n 'labels',\n 'rotate',\n 'scale',\n 'values',\n]);\n\n/** Control flow keywords — structural blocks. */\nexport const CONTROL_KEYWORDS = new Set([\n 'if',\n 'else',\n 'loop',\n 'parallel',\n 'note',\n]);\n\n/** Status keywords — kanban. */\nexport const STATUS_KEYWORDS = new Set([\n 'na',\n 'todo',\n 'wip',\n 'done',\n 'blocked',\n 'in-progress',\n 'backlog',\n 'ready',\n]);\n\n/** Modifier keywords — adjust declarations. */\nexport const MODIFIER_KEYWORDS = new Set([\n 'alias',\n 'aka',\n 'position',\n 'default',\n // ER column modifiers\n 'pk',\n 'fk',\n 'nullable',\n 'unique',\n // ER data types\n 'int',\n 'varchar',\n 'text',\n 'boolean',\n 'date',\n 'timestamp',\n 'float',\n 'decimal',\n]);\n","import {\n ChartType,\n TagKeyword,\n DirectiveKeyword,\n ControlKeyword,\n ModifierKeyword,\n} from './dgmo.grammar.terms.js';\nimport {\n CHART_TYPES,\n TAG_KEYWORD,\n DIRECTIVE_KEYWORDS,\n CONTROL_KEYWORDS,\n STATUS_KEYWORDS,\n MODIFIER_KEYWORDS,\n} from './keywords';\n\n/**\n * Keyword specializer for the Lezer grammar.\n * Called on every Identifier token — returns a specialized term ID\n * or -1 to keep it as a plain Identifier.\n */\nexport function specializeKeyword(value: string): number {\n if (CHART_TYPES.has(value)) return ChartType;\n if (value === TAG_KEYWORD) return TagKeyword;\n if (DIRECTIVE_KEYWORDS.has(value)) return DirectiveKeyword;\n if (CONTROL_KEYWORDS.has(value)) return ControlKeyword;\n if (STATUS_KEYWORDS.has(value)) return ModifierKeyword;\n if (MODIFIER_KEYWORDS.has(value)) return ModifierKeyword;\n return -1;\n}\n","import type { NodePropSource } from '@lezer/common';\nimport { styleTags, tags as t } from '@lezer/highlight';\n\n/** Maps grammar node names to semantic highlight tags. */\nexport const dgmoHighlighting: NodePropSource = styleTags({\n Comment: t.lineComment,\n ChartType: t.typeName,\n TagKeyword: t.definitionKeyword,\n DirectiveKeyword: t.keyword,\n ControlKeyword: t.controlKeyword,\n ModifierKeyword: t.modifier,\n SyncArrow: t.operator,\n AsyncArrow: t.operator,\n Duration: t.number,\n DateLiteral: t.number,\n Number: t.number,\n Percentage: t.number,\n SectionMarker: t.heading,\n OpenBracket: t.squareBracket,\n CloseBracket: t.squareBracket,\n OpenParen: t.paren,\n CloseParen: t.paren,\n OpenAngle: t.angleBracket,\n CloseAngle: t.angleBracket,\n Url: t.url,\n ColorAnnotation: t.atom,\n Pipe: t.separator,\n Colon: t.separator,\n Plus: t.separator,\n Comma: t.punctuation,\n Dash: t.operator,\n Tilde: t.operator,\n Star: t.operator,\n Question: t.operator,\n Punct: t.punctuation,\n});\n"],"mappings":"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","names":["t"]}
1
+ {"version":3,"sources":["../src/editor/index.ts","../src/editor/dgmo.grammar.js","../src/editor/dgmo.grammar.terms.js","../src/editor/keywords.ts","../src/editor/tokens.ts","../src/editor/highlight.ts"],"sourcesContent":["import { LRLanguage, LanguageSupport } from '@codemirror/language';\nimport { parser } from './dgmo.grammar.js';\nimport { dgmoHighlighting } from './highlight';\n\nexport { CHART_TYPES, METADATA_KEYS } from './keywords';\nexport { dgmoHighlighting } from './highlight';\n\n/** The raw Lezer parser for DGMO. */\nexport const dgmoParser = parser.configure({\n props: [dgmoHighlighting],\n});\n\n/** LRLanguage wrapper for CodeMirror. */\nexport const dgmoLanguage = LRLanguage.define({\n name: 'dgmo',\n parser: dgmoParser,\n});\n\n/** Full language support (language + extensions). */\nexport const dgmoLanguageSupport = new LanguageSupport(dgmoLanguage);\n\n/**\n * Drop-in replacement for the old dgmoExtension.\n * Consumers should add indentationMarkers() separately if desired\n * (from @replit/codemirror-indentation-markers).\n */\nexport const dgmoExtension = dgmoLanguageSupport;\n","// This file was generated by lezer-generator. You probably shouldn't edit it.\nimport {LRParser} from \"@lezer/lr\"\nimport {specializeKeyword} from \"./tokens\"\nexport const parser = LRParser.deserialize({\n version: 14,\n states: \"!WQVQPOOOOQO'#DU'#DUOOQO'#DP'#DPO%]QPO'#CdOOQO'#DO'#DOQVQPOOOOQO-E6}-E6}OOQO,59O,59OOOQO-E6|-E6|\",\n stateData: \"&Q~OvOS~OPPOQPORPOSPOTPOVSOXPOYPOZPO[PO]PO^PO_PO`POaPObPOcPOdPOePOfPOgPOhPOiPOjPOkPOlPOmPOnPOoPOpPOqPOwSO~OPPOQPORPOSPOTPOXPOYPOZPO[PO]PO^PO_PO`POaPObPOcPOdPOePOfPOgPOhPOiPOjPOkPOlPOmPOnPOoPOpPOqPO~OwVO~P#]OVXYZ[]^_`ghijklmnoabcdefpqk~\",\n goto: \"!byPPPPPPPPzPPPPPPPPPPPPPPPPPPPPPPPPP!O!UPPPP!]TSOTQTORWTSROTRURVQORT\",\n nodeNames: \"⚠ ChartType TagKeyword DirectiveKeyword ControlKeyword ModifierKeyword Document Comment ContentLine SyncArrow AsyncArrow Duration DateLiteral Percentage Number SectionMarker Url OpenBracket CloseBracket OpenParen CloseParen OpenAngle CloseAngle ColorAnnotation Pipe Colon Comma Plus Dash Tilde Star Question Identifier Punct\",\n maxTerm: 40,\n skippedNodes: [0],\n repeatNodeCount: 2,\n tokenData: \"<O~RxOX#oXY#tYZ$PZp#opq#tqt#oux#oxy$Uyz$tz{${{|%S|}%Z}!O%b!O!P#o!P!Q%q!Q![&b![!]/T!]!^#o!^!_/[!_!`/c!`!a/p!a!b/w!b!c#o!c!}0O!}#O3U#O#P#o#P#Q3Z#Q#R#o#R#S0O#S#T#o#T#[0O#[#]3b#]#o0O#o#p#o#p#q;b#q#r#o#r#s;i#s;'S#o;'S;=`;x<%lO#o~#tOq~~#yQv~XY#tpq#t~$UOw~~$]Qc~q~}!O$c#T#o$c~$fRyz$o}!O$c#T#o$c~$tOg~~${Od~q~~%SOn~q~~%ZOk~q~~%bOj~q~~%iPl~q~!`!a%l~%qOX~~%vPq~!P!Q%y~&OSV~OY%yZ;'S%y;'S;=`&[<%lO%y~&_P;=`<%l%y~&i]^~q~uv'b|}'g!O!P(d!Q![*T#R#S.o#U#V)_#W#X)e#[#])e#a#b)r#e#f)e#g#h)e#k#l)e#m#n)e~'gO]~~'jP!Q!['m~'pP!Q!['s~'vP!Q!['y~(OQ^~|}'g!O!P(U~(XP!Q![([~(aP^~!Q![([~(gP!Q![(j~(oY^~uv'b!Q![(j#U#V)_#W#X)e#[#])e#a#b)r#e#f)e#g#h)e#k#l)e#m#n)e~)bP#W#X)e~)jPZ~!a!b)m~)rOZ~~)wQZ~!a!b)m#]#^)}~*QP#b#c)e~*Y]^~uv'b|}'g!O!P(d!Q![+R#R#S.o#U#V)_#W#X)e#[#])e#a#b)r#e#f)e#g#h)e#k#l)e#m#n)e~+W]^~uv'b|}'g!O!P(d!Q![,P#R#S.o#U#V)_#W#X)e#[#])e#a#b)r#e#f)e#g#h)e#k#l)e#m#n)e~,U]^~uv'b}!O,}!O!P(d!Q![-t#R#S.o#U#V)_#W#X)e#[#])e#a#b)r#e#f)e#g#h)e#k#l)e#m#n)e~-QP!Q![-T~-WP!Q![-Z~-`P[~}!O-c~-fP!Q![-i~-lP!Q![-o~-tO[~~-y[^~uv'b!O!P(d!Q![-t#R#S.o#U#V)_#W#X)e#[#])e#a#b)r#e#f)e#g#h)e#k#l)e#m#n)e~.rP!Q![.u~.zR^~!O!P(U!Q![.u#R#S.o~/[Oi~q~~/cOe~q~~/hPq~!_!`/k~/pO_~~/wOf~q~~0OOo~q~~0V_p~q~qr1Ust1Uvw1Uwx1U{|1U}!O2Y!O!P1U!P!Q1U!Q![1U!_!`1U!a!b1U!b!c1U!c!}1U#R#S1U#T#o1U~1Z_p~qr1Ust1Uvw1Uwx1U{|1U}!O2Y!O!P1U!P!Q1U!Q![1U!_!`1U!a!b1U!b!c1U!c!}1U#R#S1U#T#o1U~2]]qr1Ust1Uvw1Uwx1U{|1U!O!P1U!P!Q1U!_!`1U!a!b1U!b!c1U!c!}1U#R#S1U#T#o1U~3ZOa~~3bOb~q~~3iap~q~qr1Ust1Uvw1Uwx1U{|1U}!O2Y!O!P1U!P!Q1U!Q![1U!_!`1U!a!b1U!b!c1U!c!}1U#R#S1U#T#h1U#h#i4n#i#o1U~4sap~qr1Ust1Uvw1Uwx1U{|1U}!O2Y!O!P1U!P!Q1U!Q![1U!_!`1U!a!b1U!b!c1U!c!}1U#R#S1U#T#h1U#h#i5x#i#o1U~5}ap~qr1Ust1Uvw1Uwx1U{|1U}!O2Y!O!P1U!P!Q1U!Q![1U!_!`1U!a!b1U!b!c1U!c!}1U#R#S1U#T#d1U#d#e7S#e#o1U~7Xbp~qr1Ust1Uvw1Uwx1U{|1U}!O2Y!O!P1U!P!Q1U!Q![1U![!]8a!_!`1U!a!b1U!b!c1U!c!}1U#R#S1U#T#g1U#g#h:Z#h#o1U~8dP!P!Q8g~8jP!P!Q8m~8pYOX9`Zp9`qy9`z|9`}!`9`!a#P9`#Q#p9`#q;'S9`;'S;=`:T<%lO9`~9eY`~OX9`Zp9`qy9`z|9`}!`9`!a#P9`#Q#p9`#q;'S9`;'S;=`:T<%lO9`~:WP;=`<%l9`~:``p~qr1Ust1Uvw1Uwx1U{|1U}!O2Y!O!P1U!P!Q1U!Q![1U![!]8a!_!`1U!a!b1U!b!c1U!c!}1U#R#S1U#T#o1U~;iOh~q~~;pPm~q~!`!a;s~;xOY~~;{P;=`<%l#o\",\n tokenizers: [0],\n topRules: {\"Document\":[0,6]},\n specialized: [{term: 32, get: (value, stack) => (specializeKeyword(value, stack) << 1), external: specializeKeyword}],\n tokenPrec: 204\n})\n","// This file was generated by lezer-generator. You probably shouldn't edit it.\nexport const\n ChartType = 1,\n TagKeyword = 2,\n DirectiveKeyword = 3,\n ControlKeyword = 4,\n ModifierKeyword = 5,\n Document = 6,\n Comment = 7,\n ContentLine = 8,\n SyncArrow = 9,\n AsyncArrow = 10,\n Duration = 11,\n DateLiteral = 12,\n Percentage = 13,\n Number = 14,\n SectionMarker = 15,\n Url = 16,\n OpenBracket = 17,\n CloseBracket = 18,\n OpenParen = 19,\n CloseParen = 20,\n OpenAngle = 21,\n CloseAngle = 22,\n ColorAnnotation = 23,\n Pipe = 24,\n Colon = 25,\n Comma = 26,\n Plus = 27,\n Dash = 28,\n Tilde = 29,\n Star = 30,\n Question = 31,\n Identifier = 32,\n Punct = 33\n","/** All supported DGMO chart types. */\nexport const CHART_TYPES = new Set([\n // Diagram types\n 'sequence',\n 'flowchart',\n 'class',\n 'er',\n 'org',\n 'kanban',\n 'c4',\n 'state',\n 'sitemap',\n 'infra',\n 'gantt',\n 'boxes-and-lines',\n 'wireframe',\n 'tech-radar',\n 'mindmap',\n 'journey-map',\n // Data chart types\n 'bar',\n 'line',\n 'pie',\n 'doughnut',\n 'area',\n 'polar-area',\n 'radar',\n 'bar-stacked',\n 'multi-line',\n 'scatter',\n 'sankey',\n 'chord',\n 'function',\n 'heatmap',\n 'funnel',\n // Visualization types\n 'slope',\n 'wordcloud',\n 'arc',\n 'timeline',\n 'venn',\n 'quadrant',\n]);\n\n/** Metadata keys recognized across chart types. */\nexport const METADATA_KEYS = new Set([\n 'title',\n 'series',\n 'orientation',\n 'x-label',\n 'y-label',\n 'size-label',\n 'x',\n 'columns',\n 'rows',\n 'labels',\n 'rotate',\n 'max',\n 'size',\n 'order',\n 'sort',\n 'scale',\n 'values',\n 'notation',\n 'x-axis',\n 'y-axis',\n 'top-right',\n 'top-left',\n 'bottom-right',\n 'bottom-left',\n // Tech-radar pipe metadata\n 'quadrant',\n 'ring',\n 'trend',\n]);\n\n/** Tag declaration keyword. */\nexport const TAG_KEYWORD = 'tag';\n\n/** Directive keywords — commands that configure chart behavior. */\nexport const DIRECTIVE_KEYWORDS = new Set([\n // Gantt\n 'start',\n 'era',\n 'marker',\n 'holiday',\n 'workweek',\n 'today-marker',\n 'critical-path',\n 'no-dependencies',\n 'sort',\n // Tech-radar\n 'rings',\n // Tags\n 'tags',\n 'import',\n 'active-tag',\n 'hide',\n 'mode',\n 'direction',\n // ER\n 'notation',\n // Class\n 'extends',\n 'implements',\n 'abstract',\n 'interface',\n 'enum',\n // C4\n 'containers',\n 'components',\n 'deployment',\n // Infra directives\n 'sub-node-label',\n 'show-sub-node-count',\n 'no-auto-color',\n // Infra node properties\n 'description',\n 'instances',\n 'max-rps',\n 'latency-ms',\n 'uptime',\n 'firewall-block',\n 'ratelimit-rps',\n 'cb-error-threshold',\n 'cb-latency-threshold-ms',\n 'buffer',\n 'drain-rate',\n 'retention-hours',\n 'partitions',\n 'split',\n 'slo-p90-latency-ms',\n 'slo-availability',\n 'cache-hit',\n 'concurrency',\n 'duration-ms',\n 'cold-start-ms',\n 'rps',\n // Sequence\n 'activations',\n 'no-activations',\n 'collapse-notes',\n 'no-collapse-notes',\n // Data charts\n 'stacked',\n 'no-label-name',\n 'no-label-value',\n 'no-label-percent',\n // Slope\n 'period',\n // Quadrant\n 'x-axis',\n 'y-axis',\n 'top-right',\n 'top-left',\n 'bottom-right',\n 'bottom-left',\n // Layout\n 'direction-tb',\n 'direction-lr',\n // Data chart metadata\n 'title',\n 'series',\n 'orientation',\n 'x-label',\n 'y-label',\n 'size-label',\n 'columns',\n 'rows',\n 'labels',\n 'rotate',\n 'scale',\n 'values',\n]);\n\n/** Control flow keywords — structural blocks. */\nexport const CONTROL_KEYWORDS = new Set([\n 'if',\n 'else',\n 'loop',\n 'parallel',\n 'note',\n // Wireframe elements\n 'nav',\n 'tabs',\n 'table',\n 'image',\n 'modal',\n 'skeleton',\n 'alert',\n 'progress',\n 'chart',\n 'mobile',\n]);\n\n/** Status keywords — kanban. */\nexport const STATUS_KEYWORDS = new Set([\n 'na',\n 'todo',\n 'wip',\n 'done',\n 'blocked',\n 'in-progress',\n 'backlog',\n 'ready',\n // Tech-radar trend values\n 'new',\n 'up',\n 'down',\n 'stable',\n]);\n\n/** Modifier keywords — adjust declarations. */\nexport const MODIFIER_KEYWORDS = new Set([\n 'alias',\n 'aka',\n 'position',\n 'default',\n // ER column modifiers\n 'pk',\n 'fk',\n 'nullable',\n 'unique',\n // ER data types\n 'int',\n 'varchar',\n 'text',\n 'boolean',\n 'date',\n 'timestamp',\n 'float',\n 'decimal',\n]);\n","import {\n ChartType,\n TagKeyword,\n DirectiveKeyword,\n ControlKeyword,\n ModifierKeyword,\n} from './dgmo.grammar.terms.js';\nimport {\n CHART_TYPES,\n TAG_KEYWORD,\n DIRECTIVE_KEYWORDS,\n CONTROL_KEYWORDS,\n STATUS_KEYWORDS,\n MODIFIER_KEYWORDS,\n} from './keywords';\n\n/**\n * Keyword specializer for the Lezer grammar.\n * Called on every Identifier token — returns a specialized term ID\n * or -1 to keep it as a plain Identifier.\n */\nexport function specializeKeyword(value: string): number {\n if (CHART_TYPES.has(value)) return ChartType;\n if (value === TAG_KEYWORD) return TagKeyword;\n if (DIRECTIVE_KEYWORDS.has(value)) return DirectiveKeyword;\n if (CONTROL_KEYWORDS.has(value)) return ControlKeyword;\n if (STATUS_KEYWORDS.has(value)) return ModifierKeyword;\n if (MODIFIER_KEYWORDS.has(value)) return ModifierKeyword;\n return -1;\n}\n","import type { NodePropSource } from '@lezer/common';\nimport { styleTags, tags as t } from '@lezer/highlight';\n\n/** Maps grammar node names to semantic highlight tags. */\nexport const dgmoHighlighting: NodePropSource = styleTags({\n Comment: t.lineComment,\n ChartType: t.typeName,\n TagKeyword: t.definitionKeyword,\n DirectiveKeyword: t.keyword,\n ControlKeyword: t.controlKeyword,\n ModifierKeyword: t.modifier,\n SyncArrow: t.operator,\n AsyncArrow: t.operator,\n Duration: t.number,\n DateLiteral: t.number,\n Number: t.number,\n Percentage: t.number,\n SectionMarker: t.heading,\n OpenBracket: t.squareBracket,\n CloseBracket: t.squareBracket,\n OpenParen: t.paren,\n CloseParen: t.paren,\n OpenAngle: t.angleBracket,\n CloseAngle: t.angleBracket,\n Url: t.url,\n ColorAnnotation: t.atom,\n Pipe: t.separator,\n Colon: t.separator,\n Plus: t.separator,\n Comma: t.punctuation,\n Dash: t.operator,\n Tilde: t.operator,\n Star: t.operator,\n Question: t.operator,\n Punct: t.punctuation,\n});\n"],"mappings":"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","names":["t"]}
package/dist/editor.js CHANGED
@@ -26,6 +26,10 @@ var CHART_TYPES = /* @__PURE__ */ new Set([
26
26
  "infra",
27
27
  "gantt",
28
28
  "boxes-and-lines",
29
+ "wireframe",
30
+ "tech-radar",
31
+ "mindmap",
32
+ "journey-map",
29
33
  // Data chart types
30
34
  "bar",
31
35
  "line",
@@ -74,7 +78,11 @@ var METADATA_KEYS = /* @__PURE__ */ new Set([
74
78
  "top-right",
75
79
  "top-left",
76
80
  "bottom-right",
77
- "bottom-left"
81
+ "bottom-left",
82
+ // Tech-radar pipe metadata
83
+ "quadrant",
84
+ "ring",
85
+ "trend"
78
86
  ]);
79
87
  var TAG_KEYWORD = "tag";
80
88
  var DIRECTIVE_KEYWORDS = /* @__PURE__ */ new Set([
@@ -88,6 +96,8 @@ var DIRECTIVE_KEYWORDS = /* @__PURE__ */ new Set([
88
96
  "critical-path",
89
97
  "no-dependencies",
90
98
  "sort",
99
+ // Tech-radar
100
+ "rings",
91
101
  // Tags
92
102
  "tags",
93
103
  "import",
@@ -174,7 +184,18 @@ var CONTROL_KEYWORDS = /* @__PURE__ */ new Set([
174
184
  "else",
175
185
  "loop",
176
186
  "parallel",
177
- "note"
187
+ "note",
188
+ // Wireframe elements
189
+ "nav",
190
+ "tabs",
191
+ "table",
192
+ "image",
193
+ "modal",
194
+ "skeleton",
195
+ "alert",
196
+ "progress",
197
+ "chart",
198
+ "mobile"
178
199
  ]);
179
200
  var STATUS_KEYWORDS = /* @__PURE__ */ new Set([
180
201
  "na",
@@ -184,7 +205,12 @@ var STATUS_KEYWORDS = /* @__PURE__ */ new Set([
184
205
  "blocked",
185
206
  "in-progress",
186
207
  "backlog",
187
- "ready"
208
+ "ready",
209
+ // Tech-radar trend values
210
+ "new",
211
+ "up",
212
+ "down",
213
+ "stable"
188
214
  ]);
189
215
  var MODIFIER_KEYWORDS = /* @__PURE__ */ new Set([
190
216
  "alias",
@@ -228,7 +254,7 @@ var parser = LRParser.deserialize({
228
254
  maxTerm: 40,
229
255
  skippedNodes: [0],
230
256
  repeatNodeCount: 2,
231
- tokenData: ":T~RxOX#oXY#tYZ$PZp#opq#tqt#oux#oxy$Uyz$tz{${{|%S|}%Z}!O%b!O!P#o!P!Q%q!Q![&b![!]-Y!]!^#o!^!_-a!_!`-h!`!a-u!a!b-|!b!c#o!c!}.T!}#O1Z#O#P#o#P#Q1`#Q#R#o#R#S.T#S#T#o#T#[.T#[#]1g#]#o.T#o#p#o#p#q9g#q#r#o#r#s9n#s;'S#o;'S;=`9}<%lO#o~#tOq~~#yQv~XY#tpq#t~$UOw~~$]Qc~q~}!O$c#T#o$c~$fRyz$o}!O$c#T#o$c~$tOg~~${Od~q~~%SOn~q~~%ZOk~q~~%bOj~q~~%iPl~q~!`!a%l~%qOX~~%vPq~!P!Q%y~&OSV~OY%yZ;'S%y;'S;=`&[<%lO%y~&_P;=`<%l%y~&iZ^~q~uv'[!O!P'a!Q![)Q#U#V([#W#X(b#[#](b#a#b(o#e#f(b#g#h(b#k#l(b#m#n(b~'aO]~~'dP!Q!['g~'lY^~uv'[!Q!['g#U#V([#W#X(b#[#](b#a#b(o#e#f(b#g#h(b#k#l(b#m#n(b~(_P#W#X(b~(gPZ~!a!b(j~(oOZ~~(tQZ~!a!b(j#]#^(z~(}P#b#c(b~)VZ^~uv'[!O!P'a!Q![)x#U#V([#W#X(b#[#](b#a#b(o#e#f(b#g#h(b#k#l(b#m#n(b~)}Z^~uv'[!O!P'a!Q![*p#U#V([#W#X(b#[#](b#a#b(o#e#f(b#g#h(b#k#l(b#m#n(b~*u[^~uv'[}!O+k!O!P'a!Q![,b#U#V([#W#X(b#[#](b#a#b(o#e#f(b#g#h(b#k#l(b#m#n(b~+nP!Q![+q~+tP!Q![+w~+|P[~}!O,P~,SP!Q![,V~,YP!Q![,]~,bO[~~,gZ^~uv'[!O!P'a!Q![,b#U#V([#W#X(b#[#](b#a#b(o#e#f(b#g#h(b#k#l(b#m#n(b~-aOi~q~~-hOe~q~~-mPq~!_!`-p~-uO_~~-|Of~q~~.TOo~q~~.[_p~q~qr/Zst/Zvw/Zwx/Z{|/Z}!O0_!O!P/Z!P!Q/Z!Q![/Z!_!`/Z!a!b/Z!b!c/Z!c!}/Z#R#S/Z#T#o/Z~/`_p~qr/Zst/Zvw/Zwx/Z{|/Z}!O0_!O!P/Z!P!Q/Z!Q![/Z!_!`/Z!a!b/Z!b!c/Z!c!}/Z#R#S/Z#T#o/Z~0b]qr/Zst/Zvw/Zwx/Z{|/Z!O!P/Z!P!Q/Z!_!`/Z!a!b/Z!b!c/Z!c!}/Z#R#S/Z#T#o/Z~1`Oa~~1gOb~q~~1nap~q~qr/Zst/Zvw/Zwx/Z{|/Z}!O0_!O!P/Z!P!Q/Z!Q![/Z!_!`/Z!a!b/Z!b!c/Z!c!}/Z#R#S/Z#T#h/Z#h#i2s#i#o/Z~2xap~qr/Zst/Zvw/Zwx/Z{|/Z}!O0_!O!P/Z!P!Q/Z!Q![/Z!_!`/Z!a!b/Z!b!c/Z!c!}/Z#R#S/Z#T#h/Z#h#i3}#i#o/Z~4Sap~qr/Zst/Zvw/Zwx/Z{|/Z}!O0_!O!P/Z!P!Q/Z!Q![/Z!_!`/Z!a!b/Z!b!c/Z!c!}/Z#R#S/Z#T#d/Z#d#e5X#e#o/Z~5^bp~qr/Zst/Zvw/Zwx/Z{|/Z}!O0_!O!P/Z!P!Q/Z!Q![/Z![!]6f!_!`/Z!a!b/Z!b!c/Z!c!}/Z#R#S/Z#T#g/Z#g#h8`#h#o/Z~6iP!P!Q6l~6oP!P!Q6r~6uYOX7eZp7eqy7ez|7e}!`7e!a#P7e#Q#p7e#q;'S7e;'S;=`8Y<%lO7e~7jY`~OX7eZp7eqy7ez|7e}!`7e!a#P7e#Q#p7e#q;'S7e;'S;=`8Y<%lO7e~8]P;=`<%l7e~8e`p~qr/Zst/Zvw/Zwx/Z{|/Z}!O0_!O!P/Z!P!Q/Z!Q![/Z![!]6f!_!`/Z!a!b/Z!b!c/Z!c!}/Z#R#S/Z#T#o/Z~9nOh~q~~9uPm~q~!`!a9x~9}OY~~:QP;=`<%l#o",
257
+ tokenData: "<O~RxOX#oXY#tYZ$PZp#opq#tqt#oux#oxy$Uyz$tz{${{|%S|}%Z}!O%b!O!P#o!P!Q%q!Q![&b![!]/T!]!^#o!^!_/[!_!`/c!`!a/p!a!b/w!b!c#o!c!}0O!}#O3U#O#P#o#P#Q3Z#Q#R#o#R#S0O#S#T#o#T#[0O#[#]3b#]#o0O#o#p#o#p#q;b#q#r#o#r#s;i#s;'S#o;'S;=`;x<%lO#o~#tOq~~#yQv~XY#tpq#t~$UOw~~$]Qc~q~}!O$c#T#o$c~$fRyz$o}!O$c#T#o$c~$tOg~~${Od~q~~%SOn~q~~%ZOk~q~~%bOj~q~~%iPl~q~!`!a%l~%qOX~~%vPq~!P!Q%y~&OSV~OY%yZ;'S%y;'S;=`&[<%lO%y~&_P;=`<%l%y~&i]^~q~uv'b|}'g!O!P(d!Q![*T#R#S.o#U#V)_#W#X)e#[#])e#a#b)r#e#f)e#g#h)e#k#l)e#m#n)e~'gO]~~'jP!Q!['m~'pP!Q!['s~'vP!Q!['y~(OQ^~|}'g!O!P(U~(XP!Q![([~(aP^~!Q![([~(gP!Q![(j~(oY^~uv'b!Q![(j#U#V)_#W#X)e#[#])e#a#b)r#e#f)e#g#h)e#k#l)e#m#n)e~)bP#W#X)e~)jPZ~!a!b)m~)rOZ~~)wQZ~!a!b)m#]#^)}~*QP#b#c)e~*Y]^~uv'b|}'g!O!P(d!Q![+R#R#S.o#U#V)_#W#X)e#[#])e#a#b)r#e#f)e#g#h)e#k#l)e#m#n)e~+W]^~uv'b|}'g!O!P(d!Q![,P#R#S.o#U#V)_#W#X)e#[#])e#a#b)r#e#f)e#g#h)e#k#l)e#m#n)e~,U]^~uv'b}!O,}!O!P(d!Q![-t#R#S.o#U#V)_#W#X)e#[#])e#a#b)r#e#f)e#g#h)e#k#l)e#m#n)e~-QP!Q![-T~-WP!Q![-Z~-`P[~}!O-c~-fP!Q![-i~-lP!Q![-o~-tO[~~-y[^~uv'b!O!P(d!Q![-t#R#S.o#U#V)_#W#X)e#[#])e#a#b)r#e#f)e#g#h)e#k#l)e#m#n)e~.rP!Q![.u~.zR^~!O!P(U!Q![.u#R#S.o~/[Oi~q~~/cOe~q~~/hPq~!_!`/k~/pO_~~/wOf~q~~0OOo~q~~0V_p~q~qr1Ust1Uvw1Uwx1U{|1U}!O2Y!O!P1U!P!Q1U!Q![1U!_!`1U!a!b1U!b!c1U!c!}1U#R#S1U#T#o1U~1Z_p~qr1Ust1Uvw1Uwx1U{|1U}!O2Y!O!P1U!P!Q1U!Q![1U!_!`1U!a!b1U!b!c1U!c!}1U#R#S1U#T#o1U~2]]qr1Ust1Uvw1Uwx1U{|1U!O!P1U!P!Q1U!_!`1U!a!b1U!b!c1U!c!}1U#R#S1U#T#o1U~3ZOa~~3bOb~q~~3iap~q~qr1Ust1Uvw1Uwx1U{|1U}!O2Y!O!P1U!P!Q1U!Q![1U!_!`1U!a!b1U!b!c1U!c!}1U#R#S1U#T#h1U#h#i4n#i#o1U~4sap~qr1Ust1Uvw1Uwx1U{|1U}!O2Y!O!P1U!P!Q1U!Q![1U!_!`1U!a!b1U!b!c1U!c!}1U#R#S1U#T#h1U#h#i5x#i#o1U~5}ap~qr1Ust1Uvw1Uwx1U{|1U}!O2Y!O!P1U!P!Q1U!Q![1U!_!`1U!a!b1U!b!c1U!c!}1U#R#S1U#T#d1U#d#e7S#e#o1U~7Xbp~qr1Ust1Uvw1Uwx1U{|1U}!O2Y!O!P1U!P!Q1U!Q![1U![!]8a!_!`1U!a!b1U!b!c1U!c!}1U#R#S1U#T#g1U#g#h:Z#h#o1U~8dP!P!Q8g~8jP!P!Q8m~8pYOX9`Zp9`qy9`z|9`}!`9`!a#P9`#Q#p9`#q;'S9`;'S;=`:T<%lO9`~9eY`~OX9`Zp9`qy9`z|9`}!`9`!a#P9`#Q#p9`#q;'S9`;'S;=`:T<%lO9`~:WP;=`<%l9`~:``p~qr1Ust1Uvw1Uwx1U{|1U}!O2Y!O!P1U!P!Q1U!Q![1U![!]8a!_!`1U!a!b1U!b!c1U!c!}1U#R#S1U#T#o1U~;iOh~q~~;pPm~q~!`!a;s~;xOY~~;{P;=`<%l#o",
232
258
  tokenizers: [0],
233
259
  topRules: { "Document": [0, 6] },
234
260
  specialized: [{ term: 32, get: (value, stack) => specializeKeyword(value, stack) << 1, external: specializeKeyword }],
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/editor/index.ts","../src/editor/dgmo.grammar.js","../src/editor/dgmo.grammar.terms.js","../src/editor/keywords.ts","../src/editor/tokens.ts","../src/editor/highlight.ts"],"sourcesContent":["import { LRLanguage, LanguageSupport } from '@codemirror/language';\nimport { parser } from './dgmo.grammar.js';\nimport { dgmoHighlighting } from './highlight';\n\nexport { CHART_TYPES, METADATA_KEYS } from './keywords';\nexport { dgmoHighlighting } from './highlight';\n\n/** The raw Lezer parser for DGMO. */\nexport const dgmoParser = parser.configure({\n props: [dgmoHighlighting],\n});\n\n/** LRLanguage wrapper for CodeMirror. */\nexport const dgmoLanguage = LRLanguage.define({\n name: 'dgmo',\n parser: dgmoParser,\n});\n\n/** Full language support (language + extensions). */\nexport const dgmoLanguageSupport = new LanguageSupport(dgmoLanguage);\n\n/**\n * Drop-in replacement for the old dgmoExtension.\n * Consumers should add indentationMarkers() separately if desired\n * (from @replit/codemirror-indentation-markers).\n */\nexport const dgmoExtension = dgmoLanguageSupport;\n","// This file was generated by lezer-generator. You probably shouldn't edit it.\nimport {LRParser} from \"@lezer/lr\"\nimport {specializeKeyword} from \"./tokens\"\nexport const parser = LRParser.deserialize({\n version: 14,\n states: \"!WQVQPOOOOQO'#DU'#DUOOQO'#DP'#DPO%]QPO'#CdOOQO'#DO'#DOQVQPOOOOQO-E6}-E6}OOQO,59O,59OOOQO-E6|-E6|\",\n stateData: \"&Q~OvOS~OPPOQPORPOSPOTPOVSOXPOYPOZPO[PO]PO^PO_PO`POaPObPOcPOdPOePOfPOgPOhPOiPOjPOkPOlPOmPOnPOoPOpPOqPOwSO~OPPOQPORPOSPOTPOXPOYPOZPO[PO]PO^PO_PO`POaPObPOcPOdPOePOfPOgPOhPOiPOjPOkPOlPOmPOnPOoPOpPOqPO~OwVO~P#]OVXYZ[]^_`ghijklmnoabcdefpqk~\",\n goto: \"!byPPPPPPPPzPPPPPPPPPPPPPPPPPPPPPPPPP!O!UPPPP!]TSOTQTORWTSROTRURVQORT\",\n nodeNames: \"⚠ ChartType TagKeyword DirectiveKeyword ControlKeyword ModifierKeyword Document Comment ContentLine SyncArrow AsyncArrow Duration DateLiteral Percentage Number SectionMarker Url OpenBracket CloseBracket OpenParen CloseParen OpenAngle CloseAngle ColorAnnotation Pipe Colon Comma Plus Dash Tilde Star Question Identifier Punct\",\n maxTerm: 40,\n skippedNodes: [0],\n repeatNodeCount: 2,\n tokenData: \":T~RxOX#oXY#tYZ$PZp#opq#tqt#oux#oxy$Uyz$tz{${{|%S|}%Z}!O%b!O!P#o!P!Q%q!Q![&b![!]-Y!]!^#o!^!_-a!_!`-h!`!a-u!a!b-|!b!c#o!c!}.T!}#O1Z#O#P#o#P#Q1`#Q#R#o#R#S.T#S#T#o#T#[.T#[#]1g#]#o.T#o#p#o#p#q9g#q#r#o#r#s9n#s;'S#o;'S;=`9}<%lO#o~#tOq~~#yQv~XY#tpq#t~$UOw~~$]Qc~q~}!O$c#T#o$c~$fRyz$o}!O$c#T#o$c~$tOg~~${Od~q~~%SOn~q~~%ZOk~q~~%bOj~q~~%iPl~q~!`!a%l~%qOX~~%vPq~!P!Q%y~&OSV~OY%yZ;'S%y;'S;=`&[<%lO%y~&_P;=`<%l%y~&iZ^~q~uv'[!O!P'a!Q![)Q#U#V([#W#X(b#[#](b#a#b(o#e#f(b#g#h(b#k#l(b#m#n(b~'aO]~~'dP!Q!['g~'lY^~uv'[!Q!['g#U#V([#W#X(b#[#](b#a#b(o#e#f(b#g#h(b#k#l(b#m#n(b~(_P#W#X(b~(gPZ~!a!b(j~(oOZ~~(tQZ~!a!b(j#]#^(z~(}P#b#c(b~)VZ^~uv'[!O!P'a!Q![)x#U#V([#W#X(b#[#](b#a#b(o#e#f(b#g#h(b#k#l(b#m#n(b~)}Z^~uv'[!O!P'a!Q![*p#U#V([#W#X(b#[#](b#a#b(o#e#f(b#g#h(b#k#l(b#m#n(b~*u[^~uv'[}!O+k!O!P'a!Q![,b#U#V([#W#X(b#[#](b#a#b(o#e#f(b#g#h(b#k#l(b#m#n(b~+nP!Q![+q~+tP!Q![+w~+|P[~}!O,P~,SP!Q![,V~,YP!Q![,]~,bO[~~,gZ^~uv'[!O!P'a!Q![,b#U#V([#W#X(b#[#](b#a#b(o#e#f(b#g#h(b#k#l(b#m#n(b~-aOi~q~~-hOe~q~~-mPq~!_!`-p~-uO_~~-|Of~q~~.TOo~q~~.[_p~q~qr/Zst/Zvw/Zwx/Z{|/Z}!O0_!O!P/Z!P!Q/Z!Q![/Z!_!`/Z!a!b/Z!b!c/Z!c!}/Z#R#S/Z#T#o/Z~/`_p~qr/Zst/Zvw/Zwx/Z{|/Z}!O0_!O!P/Z!P!Q/Z!Q![/Z!_!`/Z!a!b/Z!b!c/Z!c!}/Z#R#S/Z#T#o/Z~0b]qr/Zst/Zvw/Zwx/Z{|/Z!O!P/Z!P!Q/Z!_!`/Z!a!b/Z!b!c/Z!c!}/Z#R#S/Z#T#o/Z~1`Oa~~1gOb~q~~1nap~q~qr/Zst/Zvw/Zwx/Z{|/Z}!O0_!O!P/Z!P!Q/Z!Q![/Z!_!`/Z!a!b/Z!b!c/Z!c!}/Z#R#S/Z#T#h/Z#h#i2s#i#o/Z~2xap~qr/Zst/Zvw/Zwx/Z{|/Z}!O0_!O!P/Z!P!Q/Z!Q![/Z!_!`/Z!a!b/Z!b!c/Z!c!}/Z#R#S/Z#T#h/Z#h#i3}#i#o/Z~4Sap~qr/Zst/Zvw/Zwx/Z{|/Z}!O0_!O!P/Z!P!Q/Z!Q![/Z!_!`/Z!a!b/Z!b!c/Z!c!}/Z#R#S/Z#T#d/Z#d#e5X#e#o/Z~5^bp~qr/Zst/Zvw/Zwx/Z{|/Z}!O0_!O!P/Z!P!Q/Z!Q![/Z![!]6f!_!`/Z!a!b/Z!b!c/Z!c!}/Z#R#S/Z#T#g/Z#g#h8`#h#o/Z~6iP!P!Q6l~6oP!P!Q6r~6uYOX7eZp7eqy7ez|7e}!`7e!a#P7e#Q#p7e#q;'S7e;'S;=`8Y<%lO7e~7jY`~OX7eZp7eqy7ez|7e}!`7e!a#P7e#Q#p7e#q;'S7e;'S;=`8Y<%lO7e~8]P;=`<%l7e~8e`p~qr/Zst/Zvw/Zwx/Z{|/Z}!O0_!O!P/Z!P!Q/Z!Q![/Z![!]6f!_!`/Z!a!b/Z!b!c/Z!c!}/Z#R#S/Z#T#o/Z~9nOh~q~~9uPm~q~!`!a9x~9}OY~~:QP;=`<%l#o\",\n tokenizers: [0],\n topRules: {\"Document\":[0,6]},\n specialized: [{term: 32, get: (value, stack) => (specializeKeyword(value, stack) << 1), external: specializeKeyword}],\n tokenPrec: 204\n})\n","// This file was generated by lezer-generator. You probably shouldn't edit it.\nexport const\n ChartType = 1,\n TagKeyword = 2,\n DirectiveKeyword = 3,\n ControlKeyword = 4,\n ModifierKeyword = 5,\n Document = 6,\n Comment = 7,\n ContentLine = 8,\n SyncArrow = 9,\n AsyncArrow = 10,\n Duration = 11,\n DateLiteral = 12,\n Percentage = 13,\n Number = 14,\n SectionMarker = 15,\n Url = 16,\n OpenBracket = 17,\n CloseBracket = 18,\n OpenParen = 19,\n CloseParen = 20,\n OpenAngle = 21,\n CloseAngle = 22,\n ColorAnnotation = 23,\n Pipe = 24,\n Colon = 25,\n Comma = 26,\n Plus = 27,\n Dash = 28,\n Tilde = 29,\n Star = 30,\n Question = 31,\n Identifier = 32,\n Punct = 33\n","/** All supported DGMO chart types. */\nexport const CHART_TYPES = new Set([\n // Diagram types\n 'sequence',\n 'flowchart',\n 'class',\n 'er',\n 'org',\n 'kanban',\n 'c4',\n 'state',\n 'sitemap',\n 'infra',\n 'gantt',\n 'boxes-and-lines',\n // Data chart types\n 'bar',\n 'line',\n 'pie',\n 'doughnut',\n 'area',\n 'polar-area',\n 'radar',\n 'bar-stacked',\n 'multi-line',\n 'scatter',\n 'sankey',\n 'chord',\n 'function',\n 'heatmap',\n 'funnel',\n // Visualization types\n 'slope',\n 'wordcloud',\n 'arc',\n 'timeline',\n 'venn',\n 'quadrant',\n]);\n\n/** Metadata keys recognized across chart types. */\nexport const METADATA_KEYS = new Set([\n 'title',\n 'series',\n 'orientation',\n 'x-label',\n 'y-label',\n 'size-label',\n 'x',\n 'columns',\n 'rows',\n 'labels',\n 'rotate',\n 'max',\n 'size',\n 'order',\n 'sort',\n 'scale',\n 'values',\n 'notation',\n 'x-axis',\n 'y-axis',\n 'top-right',\n 'top-left',\n 'bottom-right',\n 'bottom-left',\n]);\n\n/** Tag declaration keyword. */\nexport const TAG_KEYWORD = 'tag';\n\n/** Directive keywords — commands that configure chart behavior. */\nexport const DIRECTIVE_KEYWORDS = new Set([\n // Gantt\n 'start',\n 'era',\n 'marker',\n 'holiday',\n 'workweek',\n 'today-marker',\n 'critical-path',\n 'no-dependencies',\n 'sort',\n // Tags\n 'tags',\n 'import',\n 'active-tag',\n 'hide',\n 'mode',\n 'direction',\n // ER\n 'notation',\n // Class\n 'extends',\n 'implements',\n 'abstract',\n 'interface',\n 'enum',\n // C4\n 'containers',\n 'components',\n 'deployment',\n // Infra directives\n 'sub-node-label',\n 'show-sub-node-count',\n 'no-auto-color',\n // Infra node properties\n 'description',\n 'instances',\n 'max-rps',\n 'latency-ms',\n 'uptime',\n 'firewall-block',\n 'ratelimit-rps',\n 'cb-error-threshold',\n 'cb-latency-threshold-ms',\n 'buffer',\n 'drain-rate',\n 'retention-hours',\n 'partitions',\n 'split',\n 'slo-p90-latency-ms',\n 'slo-availability',\n 'cache-hit',\n 'concurrency',\n 'duration-ms',\n 'cold-start-ms',\n 'rps',\n // Sequence\n 'activations',\n 'no-activations',\n 'collapse-notes',\n 'no-collapse-notes',\n // Data charts\n 'stacked',\n 'no-label-name',\n 'no-label-value',\n 'no-label-percent',\n // Slope\n 'period',\n // Quadrant\n 'x-axis',\n 'y-axis',\n 'top-right',\n 'top-left',\n 'bottom-right',\n 'bottom-left',\n // Layout\n 'direction-tb',\n 'direction-lr',\n // Data chart metadata\n 'title',\n 'series',\n 'orientation',\n 'x-label',\n 'y-label',\n 'size-label',\n 'columns',\n 'rows',\n 'labels',\n 'rotate',\n 'scale',\n 'values',\n]);\n\n/** Control flow keywords — structural blocks. */\nexport const CONTROL_KEYWORDS = new Set([\n 'if',\n 'else',\n 'loop',\n 'parallel',\n 'note',\n]);\n\n/** Status keywords — kanban. */\nexport const STATUS_KEYWORDS = new Set([\n 'na',\n 'todo',\n 'wip',\n 'done',\n 'blocked',\n 'in-progress',\n 'backlog',\n 'ready',\n]);\n\n/** Modifier keywords — adjust declarations. */\nexport const MODIFIER_KEYWORDS = new Set([\n 'alias',\n 'aka',\n 'position',\n 'default',\n // ER column modifiers\n 'pk',\n 'fk',\n 'nullable',\n 'unique',\n // ER data types\n 'int',\n 'varchar',\n 'text',\n 'boolean',\n 'date',\n 'timestamp',\n 'float',\n 'decimal',\n]);\n","import {\n ChartType,\n TagKeyword,\n DirectiveKeyword,\n ControlKeyword,\n ModifierKeyword,\n} from './dgmo.grammar.terms.js';\nimport {\n CHART_TYPES,\n TAG_KEYWORD,\n DIRECTIVE_KEYWORDS,\n CONTROL_KEYWORDS,\n STATUS_KEYWORDS,\n MODIFIER_KEYWORDS,\n} from './keywords';\n\n/**\n * Keyword specializer for the Lezer grammar.\n * Called on every Identifier token — returns a specialized term ID\n * or -1 to keep it as a plain Identifier.\n */\nexport function specializeKeyword(value: string): number {\n if (CHART_TYPES.has(value)) return ChartType;\n if (value === TAG_KEYWORD) return TagKeyword;\n if (DIRECTIVE_KEYWORDS.has(value)) return DirectiveKeyword;\n if (CONTROL_KEYWORDS.has(value)) return ControlKeyword;\n if (STATUS_KEYWORDS.has(value)) return ModifierKeyword;\n if (MODIFIER_KEYWORDS.has(value)) return ModifierKeyword;\n return -1;\n}\n","import type { NodePropSource } from '@lezer/common';\nimport { styleTags, tags as t } from '@lezer/highlight';\n\n/** Maps grammar node names to semantic highlight tags. */\nexport const dgmoHighlighting: NodePropSource = styleTags({\n Comment: t.lineComment,\n ChartType: t.typeName,\n TagKeyword: t.definitionKeyword,\n DirectiveKeyword: t.keyword,\n ControlKeyword: t.controlKeyword,\n ModifierKeyword: t.modifier,\n SyncArrow: t.operator,\n AsyncArrow: t.operator,\n Duration: t.number,\n DateLiteral: t.number,\n Number: t.number,\n Percentage: t.number,\n SectionMarker: t.heading,\n OpenBracket: t.squareBracket,\n CloseBracket: t.squareBracket,\n OpenParen: t.paren,\n CloseParen: t.paren,\n OpenAngle: t.angleBracket,\n CloseAngle: t.angleBracket,\n Url: t.url,\n ColorAnnotation: t.atom,\n Pipe: t.separator,\n Colon: t.separator,\n Plus: t.separator,\n Comma: t.punctuation,\n Dash: t.operator,\n Tilde: t.operator,\n Star: t.operator,\n Question: t.operator,\n Punct: t.punctuation,\n});\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../src/editor/index.ts","../src/editor/dgmo.grammar.js","../src/editor/dgmo.grammar.terms.js","../src/editor/keywords.ts","../src/editor/tokens.ts","../src/editor/highlight.ts"],"sourcesContent":["import { LRLanguage, LanguageSupport } from '@codemirror/language';\nimport { parser } from './dgmo.grammar.js';\nimport { dgmoHighlighting } from './highlight';\n\nexport { CHART_TYPES, METADATA_KEYS } from './keywords';\nexport { dgmoHighlighting } from './highlight';\n\n/** The raw Lezer parser for DGMO. */\nexport const dgmoParser = parser.configure({\n props: [dgmoHighlighting],\n});\n\n/** LRLanguage wrapper for CodeMirror. */\nexport const dgmoLanguage = LRLanguage.define({\n name: 'dgmo',\n parser: dgmoParser,\n});\n\n/** Full language support (language + extensions). */\nexport const dgmoLanguageSupport = new LanguageSupport(dgmoLanguage);\n\n/**\n * Drop-in replacement for the old dgmoExtension.\n * Consumers should add indentationMarkers() separately if desired\n * (from @replit/codemirror-indentation-markers).\n */\nexport const dgmoExtension = dgmoLanguageSupport;\n","// This file was generated by lezer-generator. You probably shouldn't edit it.\nimport {LRParser} from \"@lezer/lr\"\nimport {specializeKeyword} from \"./tokens\"\nexport const parser = LRParser.deserialize({\n version: 14,\n states: \"!WQVQPOOOOQO'#DU'#DUOOQO'#DP'#DPO%]QPO'#CdOOQO'#DO'#DOQVQPOOOOQO-E6}-E6}OOQO,59O,59OOOQO-E6|-E6|\",\n stateData: \"&Q~OvOS~OPPOQPORPOSPOTPOVSOXPOYPOZPO[PO]PO^PO_PO`POaPObPOcPOdPOePOfPOgPOhPOiPOjPOkPOlPOmPOnPOoPOpPOqPOwSO~OPPOQPORPOSPOTPOXPOYPOZPO[PO]PO^PO_PO`POaPObPOcPOdPOePOfPOgPOhPOiPOjPOkPOlPOmPOnPOoPOpPOqPO~OwVO~P#]OVXYZ[]^_`ghijklmnoabcdefpqk~\",\n goto: \"!byPPPPPPPPzPPPPPPPPPPPPPPPPPPPPPPPPP!O!UPPPP!]TSOTQTORWTSROTRURVQORT\",\n nodeNames: \"⚠ ChartType TagKeyword DirectiveKeyword ControlKeyword ModifierKeyword Document Comment ContentLine SyncArrow AsyncArrow Duration DateLiteral Percentage Number SectionMarker Url OpenBracket CloseBracket OpenParen CloseParen OpenAngle CloseAngle ColorAnnotation Pipe Colon Comma Plus Dash Tilde Star Question Identifier Punct\",\n maxTerm: 40,\n skippedNodes: [0],\n repeatNodeCount: 2,\n tokenData: \"<O~RxOX#oXY#tYZ$PZp#opq#tqt#oux#oxy$Uyz$tz{${{|%S|}%Z}!O%b!O!P#o!P!Q%q!Q![&b![!]/T!]!^#o!^!_/[!_!`/c!`!a/p!a!b/w!b!c#o!c!}0O!}#O3U#O#P#o#P#Q3Z#Q#R#o#R#S0O#S#T#o#T#[0O#[#]3b#]#o0O#o#p#o#p#q;b#q#r#o#r#s;i#s;'S#o;'S;=`;x<%lO#o~#tOq~~#yQv~XY#tpq#t~$UOw~~$]Qc~q~}!O$c#T#o$c~$fRyz$o}!O$c#T#o$c~$tOg~~${Od~q~~%SOn~q~~%ZOk~q~~%bOj~q~~%iPl~q~!`!a%l~%qOX~~%vPq~!P!Q%y~&OSV~OY%yZ;'S%y;'S;=`&[<%lO%y~&_P;=`<%l%y~&i]^~q~uv'b|}'g!O!P(d!Q![*T#R#S.o#U#V)_#W#X)e#[#])e#a#b)r#e#f)e#g#h)e#k#l)e#m#n)e~'gO]~~'jP!Q!['m~'pP!Q!['s~'vP!Q!['y~(OQ^~|}'g!O!P(U~(XP!Q![([~(aP^~!Q![([~(gP!Q![(j~(oY^~uv'b!Q![(j#U#V)_#W#X)e#[#])e#a#b)r#e#f)e#g#h)e#k#l)e#m#n)e~)bP#W#X)e~)jPZ~!a!b)m~)rOZ~~)wQZ~!a!b)m#]#^)}~*QP#b#c)e~*Y]^~uv'b|}'g!O!P(d!Q![+R#R#S.o#U#V)_#W#X)e#[#])e#a#b)r#e#f)e#g#h)e#k#l)e#m#n)e~+W]^~uv'b|}'g!O!P(d!Q![,P#R#S.o#U#V)_#W#X)e#[#])e#a#b)r#e#f)e#g#h)e#k#l)e#m#n)e~,U]^~uv'b}!O,}!O!P(d!Q![-t#R#S.o#U#V)_#W#X)e#[#])e#a#b)r#e#f)e#g#h)e#k#l)e#m#n)e~-QP!Q![-T~-WP!Q![-Z~-`P[~}!O-c~-fP!Q![-i~-lP!Q![-o~-tO[~~-y[^~uv'b!O!P(d!Q![-t#R#S.o#U#V)_#W#X)e#[#])e#a#b)r#e#f)e#g#h)e#k#l)e#m#n)e~.rP!Q![.u~.zR^~!O!P(U!Q![.u#R#S.o~/[Oi~q~~/cOe~q~~/hPq~!_!`/k~/pO_~~/wOf~q~~0OOo~q~~0V_p~q~qr1Ust1Uvw1Uwx1U{|1U}!O2Y!O!P1U!P!Q1U!Q![1U!_!`1U!a!b1U!b!c1U!c!}1U#R#S1U#T#o1U~1Z_p~qr1Ust1Uvw1Uwx1U{|1U}!O2Y!O!P1U!P!Q1U!Q![1U!_!`1U!a!b1U!b!c1U!c!}1U#R#S1U#T#o1U~2]]qr1Ust1Uvw1Uwx1U{|1U!O!P1U!P!Q1U!_!`1U!a!b1U!b!c1U!c!}1U#R#S1U#T#o1U~3ZOa~~3bOb~q~~3iap~q~qr1Ust1Uvw1Uwx1U{|1U}!O2Y!O!P1U!P!Q1U!Q![1U!_!`1U!a!b1U!b!c1U!c!}1U#R#S1U#T#h1U#h#i4n#i#o1U~4sap~qr1Ust1Uvw1Uwx1U{|1U}!O2Y!O!P1U!P!Q1U!Q![1U!_!`1U!a!b1U!b!c1U!c!}1U#R#S1U#T#h1U#h#i5x#i#o1U~5}ap~qr1Ust1Uvw1Uwx1U{|1U}!O2Y!O!P1U!P!Q1U!Q![1U!_!`1U!a!b1U!b!c1U!c!}1U#R#S1U#T#d1U#d#e7S#e#o1U~7Xbp~qr1Ust1Uvw1Uwx1U{|1U}!O2Y!O!P1U!P!Q1U!Q![1U![!]8a!_!`1U!a!b1U!b!c1U!c!}1U#R#S1U#T#g1U#g#h:Z#h#o1U~8dP!P!Q8g~8jP!P!Q8m~8pYOX9`Zp9`qy9`z|9`}!`9`!a#P9`#Q#p9`#q;'S9`;'S;=`:T<%lO9`~9eY`~OX9`Zp9`qy9`z|9`}!`9`!a#P9`#Q#p9`#q;'S9`;'S;=`:T<%lO9`~:WP;=`<%l9`~:``p~qr1Ust1Uvw1Uwx1U{|1U}!O2Y!O!P1U!P!Q1U!Q![1U![!]8a!_!`1U!a!b1U!b!c1U!c!}1U#R#S1U#T#o1U~;iOh~q~~;pPm~q~!`!a;s~;xOY~~;{P;=`<%l#o\",\n tokenizers: [0],\n topRules: {\"Document\":[0,6]},\n specialized: [{term: 32, get: (value, stack) => (specializeKeyword(value, stack) << 1), external: specializeKeyword}],\n tokenPrec: 204\n})\n","// This file was generated by lezer-generator. You probably shouldn't edit it.\nexport const\n ChartType = 1,\n TagKeyword = 2,\n DirectiveKeyword = 3,\n ControlKeyword = 4,\n ModifierKeyword = 5,\n Document = 6,\n Comment = 7,\n ContentLine = 8,\n SyncArrow = 9,\n AsyncArrow = 10,\n Duration = 11,\n DateLiteral = 12,\n Percentage = 13,\n Number = 14,\n SectionMarker = 15,\n Url = 16,\n OpenBracket = 17,\n CloseBracket = 18,\n OpenParen = 19,\n CloseParen = 20,\n OpenAngle = 21,\n CloseAngle = 22,\n ColorAnnotation = 23,\n Pipe = 24,\n Colon = 25,\n Comma = 26,\n Plus = 27,\n Dash = 28,\n Tilde = 29,\n Star = 30,\n Question = 31,\n Identifier = 32,\n Punct = 33\n","/** All supported DGMO chart types. */\nexport const CHART_TYPES = new Set([\n // Diagram types\n 'sequence',\n 'flowchart',\n 'class',\n 'er',\n 'org',\n 'kanban',\n 'c4',\n 'state',\n 'sitemap',\n 'infra',\n 'gantt',\n 'boxes-and-lines',\n 'wireframe',\n 'tech-radar',\n 'mindmap',\n 'journey-map',\n // Data chart types\n 'bar',\n 'line',\n 'pie',\n 'doughnut',\n 'area',\n 'polar-area',\n 'radar',\n 'bar-stacked',\n 'multi-line',\n 'scatter',\n 'sankey',\n 'chord',\n 'function',\n 'heatmap',\n 'funnel',\n // Visualization types\n 'slope',\n 'wordcloud',\n 'arc',\n 'timeline',\n 'venn',\n 'quadrant',\n]);\n\n/** Metadata keys recognized across chart types. */\nexport const METADATA_KEYS = new Set([\n 'title',\n 'series',\n 'orientation',\n 'x-label',\n 'y-label',\n 'size-label',\n 'x',\n 'columns',\n 'rows',\n 'labels',\n 'rotate',\n 'max',\n 'size',\n 'order',\n 'sort',\n 'scale',\n 'values',\n 'notation',\n 'x-axis',\n 'y-axis',\n 'top-right',\n 'top-left',\n 'bottom-right',\n 'bottom-left',\n // Tech-radar pipe metadata\n 'quadrant',\n 'ring',\n 'trend',\n]);\n\n/** Tag declaration keyword. */\nexport const TAG_KEYWORD = 'tag';\n\n/** Directive keywords — commands that configure chart behavior. */\nexport const DIRECTIVE_KEYWORDS = new Set([\n // Gantt\n 'start',\n 'era',\n 'marker',\n 'holiday',\n 'workweek',\n 'today-marker',\n 'critical-path',\n 'no-dependencies',\n 'sort',\n // Tech-radar\n 'rings',\n // Tags\n 'tags',\n 'import',\n 'active-tag',\n 'hide',\n 'mode',\n 'direction',\n // ER\n 'notation',\n // Class\n 'extends',\n 'implements',\n 'abstract',\n 'interface',\n 'enum',\n // C4\n 'containers',\n 'components',\n 'deployment',\n // Infra directives\n 'sub-node-label',\n 'show-sub-node-count',\n 'no-auto-color',\n // Infra node properties\n 'description',\n 'instances',\n 'max-rps',\n 'latency-ms',\n 'uptime',\n 'firewall-block',\n 'ratelimit-rps',\n 'cb-error-threshold',\n 'cb-latency-threshold-ms',\n 'buffer',\n 'drain-rate',\n 'retention-hours',\n 'partitions',\n 'split',\n 'slo-p90-latency-ms',\n 'slo-availability',\n 'cache-hit',\n 'concurrency',\n 'duration-ms',\n 'cold-start-ms',\n 'rps',\n // Sequence\n 'activations',\n 'no-activations',\n 'collapse-notes',\n 'no-collapse-notes',\n // Data charts\n 'stacked',\n 'no-label-name',\n 'no-label-value',\n 'no-label-percent',\n // Slope\n 'period',\n // Quadrant\n 'x-axis',\n 'y-axis',\n 'top-right',\n 'top-left',\n 'bottom-right',\n 'bottom-left',\n // Layout\n 'direction-tb',\n 'direction-lr',\n // Data chart metadata\n 'title',\n 'series',\n 'orientation',\n 'x-label',\n 'y-label',\n 'size-label',\n 'columns',\n 'rows',\n 'labels',\n 'rotate',\n 'scale',\n 'values',\n]);\n\n/** Control flow keywords — structural blocks. */\nexport const CONTROL_KEYWORDS = new Set([\n 'if',\n 'else',\n 'loop',\n 'parallel',\n 'note',\n // Wireframe elements\n 'nav',\n 'tabs',\n 'table',\n 'image',\n 'modal',\n 'skeleton',\n 'alert',\n 'progress',\n 'chart',\n 'mobile',\n]);\n\n/** Status keywords — kanban. */\nexport const STATUS_KEYWORDS = new Set([\n 'na',\n 'todo',\n 'wip',\n 'done',\n 'blocked',\n 'in-progress',\n 'backlog',\n 'ready',\n // Tech-radar trend values\n 'new',\n 'up',\n 'down',\n 'stable',\n]);\n\n/** Modifier keywords — adjust declarations. */\nexport const MODIFIER_KEYWORDS = new Set([\n 'alias',\n 'aka',\n 'position',\n 'default',\n // ER column modifiers\n 'pk',\n 'fk',\n 'nullable',\n 'unique',\n // ER data types\n 'int',\n 'varchar',\n 'text',\n 'boolean',\n 'date',\n 'timestamp',\n 'float',\n 'decimal',\n]);\n","import {\n ChartType,\n TagKeyword,\n DirectiveKeyword,\n ControlKeyword,\n ModifierKeyword,\n} from './dgmo.grammar.terms.js';\nimport {\n CHART_TYPES,\n TAG_KEYWORD,\n DIRECTIVE_KEYWORDS,\n CONTROL_KEYWORDS,\n STATUS_KEYWORDS,\n MODIFIER_KEYWORDS,\n} from './keywords';\n\n/**\n * Keyword specializer for the Lezer grammar.\n * Called on every Identifier token — returns a specialized term ID\n * or -1 to keep it as a plain Identifier.\n */\nexport function specializeKeyword(value: string): number {\n if (CHART_TYPES.has(value)) return ChartType;\n if (value === TAG_KEYWORD) return TagKeyword;\n if (DIRECTIVE_KEYWORDS.has(value)) return DirectiveKeyword;\n if (CONTROL_KEYWORDS.has(value)) return ControlKeyword;\n if (STATUS_KEYWORDS.has(value)) return ModifierKeyword;\n if (MODIFIER_KEYWORDS.has(value)) return ModifierKeyword;\n return -1;\n}\n","import type { NodePropSource } from '@lezer/common';\nimport { styleTags, tags as t } from '@lezer/highlight';\n\n/** Maps grammar node names to semantic highlight tags. */\nexport const dgmoHighlighting: NodePropSource = styleTags({\n Comment: t.lineComment,\n ChartType: t.typeName,\n TagKeyword: t.definitionKeyword,\n DirectiveKeyword: t.keyword,\n ControlKeyword: t.controlKeyword,\n ModifierKeyword: t.modifier,\n SyncArrow: t.operator,\n AsyncArrow: t.operator,\n Duration: t.number,\n DateLiteral: t.number,\n Number: t.number,\n Percentage: t.number,\n SectionMarker: t.heading,\n OpenBracket: t.squareBracket,\n CloseBracket: t.squareBracket,\n OpenParen: t.paren,\n CloseParen: t.paren,\n OpenAngle: t.angleBracket,\n CloseAngle: t.angleBracket,\n Url: t.url,\n ColorAnnotation: t.atom,\n Pipe: t.separator,\n Colon: t.separator,\n Plus: t.separator,\n Comma: t.punctuation,\n Dash: t.operator,\n Tilde: t.operator,\n Star: t.operator,\n Question: t.operator,\n Punct: t.punctuation,\n});\n"],"mappings":"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","names":[]}
@@ -52,6 +52,10 @@ var CHART_TYPES = /* @__PURE__ */ new Set([
52
52
  "infra",
53
53
  "gantt",
54
54
  "boxes-and-lines",
55
+ "wireframe",
56
+ "tech-radar",
57
+ "mindmap",
58
+ "journey-map",
55
59
  // Data chart types
56
60
  "bar",
57
61
  "line",
@@ -88,6 +92,8 @@ var DIRECTIVE_KEYWORDS = /* @__PURE__ */ new Set([
88
92
  "critical-path",
89
93
  "no-dependencies",
90
94
  "sort",
95
+ // Tech-radar
96
+ "rings",
91
97
  // Tags
92
98
  "tags",
93
99
  "import",
@@ -174,7 +180,18 @@ var CONTROL_KEYWORDS = /* @__PURE__ */ new Set([
174
180
  "else",
175
181
  "loop",
176
182
  "parallel",
177
- "note"
183
+ "note",
184
+ // Wireframe elements
185
+ "nav",
186
+ "tabs",
187
+ "table",
188
+ "image",
189
+ "modal",
190
+ "skeleton",
191
+ "alert",
192
+ "progress",
193
+ "chart",
194
+ "mobile"
178
195
  ]);
179
196
  var STATUS_KEYWORDS = /* @__PURE__ */ new Set([
180
197
  "na",
@@ -184,7 +201,12 @@ var STATUS_KEYWORDS = /* @__PURE__ */ new Set([
184
201
  "blocked",
185
202
  "in-progress",
186
203
  "backlog",
187
- "ready"
204
+ "ready",
205
+ // Tech-radar trend values
206
+ "new",
207
+ "up",
208
+ "down",
209
+ "stable"
188
210
  ]);
189
211
  var MODIFIER_KEYWORDS = /* @__PURE__ */ new Set([
190
212
  "alias",
@@ -228,7 +250,7 @@ var parser = import_lr.LRParser.deserialize({
228
250
  maxTerm: 40,
229
251
  skippedNodes: [0],
230
252
  repeatNodeCount: 2,
231
- tokenData: ":T~RxOX#oXY#tYZ$PZp#opq#tqt#oux#oxy$Uyz$tz{${{|%S|}%Z}!O%b!O!P#o!P!Q%q!Q![&b![!]-Y!]!^#o!^!_-a!_!`-h!`!a-u!a!b-|!b!c#o!c!}.T!}#O1Z#O#P#o#P#Q1`#Q#R#o#R#S.T#S#T#o#T#[.T#[#]1g#]#o.T#o#p#o#p#q9g#q#r#o#r#s9n#s;'S#o;'S;=`9}<%lO#o~#tOq~~#yQv~XY#tpq#t~$UOw~~$]Qc~q~}!O$c#T#o$c~$fRyz$o}!O$c#T#o$c~$tOg~~${Od~q~~%SOn~q~~%ZOk~q~~%bOj~q~~%iPl~q~!`!a%l~%qOX~~%vPq~!P!Q%y~&OSV~OY%yZ;'S%y;'S;=`&[<%lO%y~&_P;=`<%l%y~&iZ^~q~uv'[!O!P'a!Q![)Q#U#V([#W#X(b#[#](b#a#b(o#e#f(b#g#h(b#k#l(b#m#n(b~'aO]~~'dP!Q!['g~'lY^~uv'[!Q!['g#U#V([#W#X(b#[#](b#a#b(o#e#f(b#g#h(b#k#l(b#m#n(b~(_P#W#X(b~(gPZ~!a!b(j~(oOZ~~(tQZ~!a!b(j#]#^(z~(}P#b#c(b~)VZ^~uv'[!O!P'a!Q![)x#U#V([#W#X(b#[#](b#a#b(o#e#f(b#g#h(b#k#l(b#m#n(b~)}Z^~uv'[!O!P'a!Q![*p#U#V([#W#X(b#[#](b#a#b(o#e#f(b#g#h(b#k#l(b#m#n(b~*u[^~uv'[}!O+k!O!P'a!Q![,b#U#V([#W#X(b#[#](b#a#b(o#e#f(b#g#h(b#k#l(b#m#n(b~+nP!Q![+q~+tP!Q![+w~+|P[~}!O,P~,SP!Q![,V~,YP!Q![,]~,bO[~~,gZ^~uv'[!O!P'a!Q![,b#U#V([#W#X(b#[#](b#a#b(o#e#f(b#g#h(b#k#l(b#m#n(b~-aOi~q~~-hOe~q~~-mPq~!_!`-p~-uO_~~-|Of~q~~.TOo~q~~.[_p~q~qr/Zst/Zvw/Zwx/Z{|/Z}!O0_!O!P/Z!P!Q/Z!Q![/Z!_!`/Z!a!b/Z!b!c/Z!c!}/Z#R#S/Z#T#o/Z~/`_p~qr/Zst/Zvw/Zwx/Z{|/Z}!O0_!O!P/Z!P!Q/Z!Q![/Z!_!`/Z!a!b/Z!b!c/Z!c!}/Z#R#S/Z#T#o/Z~0b]qr/Zst/Zvw/Zwx/Z{|/Z!O!P/Z!P!Q/Z!_!`/Z!a!b/Z!b!c/Z!c!}/Z#R#S/Z#T#o/Z~1`Oa~~1gOb~q~~1nap~q~qr/Zst/Zvw/Zwx/Z{|/Z}!O0_!O!P/Z!P!Q/Z!Q![/Z!_!`/Z!a!b/Z!b!c/Z!c!}/Z#R#S/Z#T#h/Z#h#i2s#i#o/Z~2xap~qr/Zst/Zvw/Zwx/Z{|/Z}!O0_!O!P/Z!P!Q/Z!Q![/Z!_!`/Z!a!b/Z!b!c/Z!c!}/Z#R#S/Z#T#h/Z#h#i3}#i#o/Z~4Sap~qr/Zst/Zvw/Zwx/Z{|/Z}!O0_!O!P/Z!P!Q/Z!Q![/Z!_!`/Z!a!b/Z!b!c/Z!c!}/Z#R#S/Z#T#d/Z#d#e5X#e#o/Z~5^bp~qr/Zst/Zvw/Zwx/Z{|/Z}!O0_!O!P/Z!P!Q/Z!Q![/Z![!]6f!_!`/Z!a!b/Z!b!c/Z!c!}/Z#R#S/Z#T#g/Z#g#h8`#h#o/Z~6iP!P!Q6l~6oP!P!Q6r~6uYOX7eZp7eqy7ez|7e}!`7e!a#P7e#Q#p7e#q;'S7e;'S;=`8Y<%lO7e~7jY`~OX7eZp7eqy7ez|7e}!`7e!a#P7e#Q#p7e#q;'S7e;'S;=`8Y<%lO7e~8]P;=`<%l7e~8e`p~qr/Zst/Zvw/Zwx/Z{|/Z}!O0_!O!P/Z!P!Q/Z!Q![/Z![!]6f!_!`/Z!a!b/Z!b!c/Z!c!}/Z#R#S/Z#T#o/Z~9nOh~q~~9uPm~q~!`!a9x~9}OY~~:QP;=`<%l#o",
253
+ tokenData: "<O~RxOX#oXY#tYZ$PZp#opq#tqt#oux#oxy$Uyz$tz{${{|%S|}%Z}!O%b!O!P#o!P!Q%q!Q![&b![!]/T!]!^#o!^!_/[!_!`/c!`!a/p!a!b/w!b!c#o!c!}0O!}#O3U#O#P#o#P#Q3Z#Q#R#o#R#S0O#S#T#o#T#[0O#[#]3b#]#o0O#o#p#o#p#q;b#q#r#o#r#s;i#s;'S#o;'S;=`;x<%lO#o~#tOq~~#yQv~XY#tpq#t~$UOw~~$]Qc~q~}!O$c#T#o$c~$fRyz$o}!O$c#T#o$c~$tOg~~${Od~q~~%SOn~q~~%ZOk~q~~%bOj~q~~%iPl~q~!`!a%l~%qOX~~%vPq~!P!Q%y~&OSV~OY%yZ;'S%y;'S;=`&[<%lO%y~&_P;=`<%l%y~&i]^~q~uv'b|}'g!O!P(d!Q![*T#R#S.o#U#V)_#W#X)e#[#])e#a#b)r#e#f)e#g#h)e#k#l)e#m#n)e~'gO]~~'jP!Q!['m~'pP!Q!['s~'vP!Q!['y~(OQ^~|}'g!O!P(U~(XP!Q![([~(aP^~!Q![([~(gP!Q![(j~(oY^~uv'b!Q![(j#U#V)_#W#X)e#[#])e#a#b)r#e#f)e#g#h)e#k#l)e#m#n)e~)bP#W#X)e~)jPZ~!a!b)m~)rOZ~~)wQZ~!a!b)m#]#^)}~*QP#b#c)e~*Y]^~uv'b|}'g!O!P(d!Q![+R#R#S.o#U#V)_#W#X)e#[#])e#a#b)r#e#f)e#g#h)e#k#l)e#m#n)e~+W]^~uv'b|}'g!O!P(d!Q![,P#R#S.o#U#V)_#W#X)e#[#])e#a#b)r#e#f)e#g#h)e#k#l)e#m#n)e~,U]^~uv'b}!O,}!O!P(d!Q![-t#R#S.o#U#V)_#W#X)e#[#])e#a#b)r#e#f)e#g#h)e#k#l)e#m#n)e~-QP!Q![-T~-WP!Q![-Z~-`P[~}!O-c~-fP!Q![-i~-lP!Q![-o~-tO[~~-y[^~uv'b!O!P(d!Q![-t#R#S.o#U#V)_#W#X)e#[#])e#a#b)r#e#f)e#g#h)e#k#l)e#m#n)e~.rP!Q![.u~.zR^~!O!P(U!Q![.u#R#S.o~/[Oi~q~~/cOe~q~~/hPq~!_!`/k~/pO_~~/wOf~q~~0OOo~q~~0V_p~q~qr1Ust1Uvw1Uwx1U{|1U}!O2Y!O!P1U!P!Q1U!Q![1U!_!`1U!a!b1U!b!c1U!c!}1U#R#S1U#T#o1U~1Z_p~qr1Ust1Uvw1Uwx1U{|1U}!O2Y!O!P1U!P!Q1U!Q![1U!_!`1U!a!b1U!b!c1U!c!}1U#R#S1U#T#o1U~2]]qr1Ust1Uvw1Uwx1U{|1U!O!P1U!P!Q1U!_!`1U!a!b1U!b!c1U!c!}1U#R#S1U#T#o1U~3ZOa~~3bOb~q~~3iap~q~qr1Ust1Uvw1Uwx1U{|1U}!O2Y!O!P1U!P!Q1U!Q![1U!_!`1U!a!b1U!b!c1U!c!}1U#R#S1U#T#h1U#h#i4n#i#o1U~4sap~qr1Ust1Uvw1Uwx1U{|1U}!O2Y!O!P1U!P!Q1U!Q![1U!_!`1U!a!b1U!b!c1U!c!}1U#R#S1U#T#h1U#h#i5x#i#o1U~5}ap~qr1Ust1Uvw1Uwx1U{|1U}!O2Y!O!P1U!P!Q1U!Q![1U!_!`1U!a!b1U!b!c1U!c!}1U#R#S1U#T#d1U#d#e7S#e#o1U~7Xbp~qr1Ust1Uvw1Uwx1U{|1U}!O2Y!O!P1U!P!Q1U!Q![1U![!]8a!_!`1U!a!b1U!b!c1U!c!}1U#R#S1U#T#g1U#g#h:Z#h#o1U~8dP!P!Q8g~8jP!P!Q8m~8pYOX9`Zp9`qy9`z|9`}!`9`!a#P9`#Q#p9`#q;'S9`;'S;=`:T<%lO9`~9eY`~OX9`Zp9`qy9`z|9`}!`9`!a#P9`#Q#p9`#q;'S9`;'S;=`:T<%lO9`~:WP;=`<%l9`~:``p~qr1Ust1Uvw1Uwx1U{|1U}!O2Y!O!P1U!P!Q1U!Q![1U![!]8a!_!`1U!a!b1U!b!c1U!c!}1U#R#S1U#T#o1U~;iOh~q~~;pPm~q~!`!a;s~;xOY~~;{P;=`<%l#o",
232
254
  tokenizers: [0],
233
255
  topRules: { "Document": [0, 6] },
234
256
  specialized: [{ term: 32, get: (value, stack) => specializeKeyword(value, stack) << 1, external: specializeKeyword }],
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/editor/highlight-api.ts","../src/editor/dgmo.grammar.js","../src/editor/dgmo.grammar.terms.js","../src/editor/keywords.ts","../src/editor/tokens.ts"],"sourcesContent":["/**\n * Standalone DGMO syntax highlighter — no CodeMirror dependency.\n *\n * Exports:\n * - `highlightDgmo(source)` → `HighlightToken[]` (consumer-agnostic)\n * - `NORD_ROLE_STYLES` — inline style objects keyed by role (for React/Astro)\n * - `ROLE_TO_ANSI` — ANSI escape codes keyed by role (for CLI)\n *\n * Uses the raw Lezer parser directly — keyword specialization is wired into\n * the grammar, so `parser.parse()` runs it automatically.\n *\n * @module @diagrammo/dgmo/highlight\n */\n\nimport { parser } from './dgmo.grammar.js';\n\n// ============================================================\n// Types\n// ============================================================\n\nexport interface HighlightToken {\n text: string;\n role: string;\n}\n\n// ============================================================\n// NODE_TO_ROLE — keep in sync with highlight.ts\n// ============================================================\n\nconst NODE_TO_ROLE: Record<string, string> = {\n Comment: 'comment',\n ChartType: 'chartType',\n TagKeyword: 'definitionKeyword',\n DirectiveKeyword: 'keyword',\n ControlKeyword: 'controlKeyword',\n ModifierKeyword: 'modifier',\n SyncArrow: 'operator',\n AsyncArrow: 'operator',\n Dash: 'operator',\n Tilde: 'operator',\n Star: 'operator',\n Question: 'operator',\n Duration: 'number',\n DateLiteral: 'number',\n Number: 'number',\n Percentage: 'number',\n SectionMarker: 'heading',\n Url: 'url',\n ColorAnnotation: 'colorAnnotation',\n OpenBracket: 'bracket',\n CloseBracket: 'bracket',\n OpenParen: 'bracket',\n CloseParen: 'bracket',\n OpenAngle: 'bracket',\n CloseAngle: 'bracket',\n Pipe: 'separator',\n Colon: 'separator',\n Plus: 'separator',\n Comma: 'punctuation',\n Punct: 'punctuation',\n Identifier: 'default',\n};\n\n// ============================================================\n// Entity detection — keep in sync with entity-highlight.ts\n// ============================================================\n\n/** Tokens that have grammar-level styling which should be overridden in labels. */\nconst OVERRIDE_IN_LABEL = new Set([\n 'ChartType',\n 'TagKeyword',\n 'DirectiveKeyword',\n 'ControlKeyword',\n 'ModifierKeyword',\n 'Number',\n 'Percentage',\n 'Duration',\n 'DateLiteral',\n]);\n\n/** Lines starting with these are keyword-led — not entity declarations. */\nconst KEYWORD_STARTS = new Set([\n 'TagKeyword',\n 'DirectiveKeyword',\n 'ControlKeyword',\n 'ModifierKeyword',\n 'SectionMarker',\n 'Comment',\n 'Duration',\n 'DateLiteral',\n]);\n\n// ============================================================\n// Core: highlightDgmo()\n// ============================================================\n\n/**\n * Tokenize DGMO source into annotated highlight spans.\n *\n * Guarantees lossless round-trip:\n * `highlightDgmo(src).map(t => t.text).join('') === src`\n */\nexport function highlightDgmo(source: string): HighlightToken[] {\n const tree = parser.parse(source);\n const tokens: HighlightToken[] = [];\n\n // Phase 1: Walk tree cursor, collect leaf tokens with gap filling\n let pos = 0;\n const cursor = tree.cursor();\n\n // Descend to leaves, process them, then advance via next() or parent+next()\n function descend(): void {\n for (;;) {\n // Try to go deeper\n if (cursor.firstChild()) continue;\n\n // At a leaf — emit it\n emitLeaf();\n\n // Try to advance to next sibling or ascend\n while (!cursor.nextSibling()) {\n if (!cursor.parent()) return; // back at root — done\n }\n\n // Now at next sibling — loop will try to descend into it\n }\n }\n\n function emitLeaf(): void {\n const from = cursor.from;\n const to = cursor.to;\n\n // Fill gap before this node\n if (from > pos) {\n tokens.push({ text: source.slice(pos, from), role: 'default' });\n }\n\n // Emit this leaf node\n if (to > from) {\n const role = NODE_TO_ROLE[cursor.name] ?? 'default';\n tokens.push({ text: source.slice(from, to), role });\n }\n\n pos = to;\n }\n\n descend();\n\n // Fill trailing gap\n if (pos < source.length) {\n tokens.push({ text: source.slice(pos, source.length), role: 'default' });\n }\n\n // Phase 2: Post-process — entity detection (label override only)\n applyLabelOverrides(tokens);\n\n // Phase 3: Post-process — note content detection\n applyNoteContent(tokens);\n\n return tokens;\n}\n\n// ============================================================\n// Post-processing: label overrides\n// ============================================================\n\ninterface LineTokenRef {\n /** Index into the flat token array. */\n idx: number;\n /** Grammar node name (looked up from role + NODE_TO_ROLE reverse). */\n nodeName: string;\n}\n\n/**\n * Override keyword/number tokens in message-label positions to `default` role.\n *\n * A \"label\" is the span between the first Dash/Tilde and the last arrow on a\n * content line. Tokens in OVERRIDE_IN_LABEL within that zone get their role\n * set to `default` so they render as plain text.\n *\n * Also handles ChartType tokens on non-first content lines — they become\n * `default` in labels.\n */\nfunction applyLabelOverrides(tokens: HighlightToken[]): void {\n // Build reverse map: role → possible node names (for override detection)\n const ROLE_TO_NODES: Record<string, string[]> = {};\n for (const [node, role] of Object.entries(NODE_TO_ROLE)) {\n (ROLE_TO_NODES[role] ??= []).push(node);\n }\n\n // Split tokens into lines\n const lines: LineTokenRef[][] = [[]];\n for (let i = 0; i < tokens.length; i++) {\n const t = tokens[i];\n // If the token contains newlines, it belongs to the current line\n // but signals the start of a new line after it\n const currentLine = lines[lines.length - 1];\n const role = t.role;\n\n // Determine which node name this token likely had\n let nodeName = '';\n for (const [node, r] of Object.entries(NODE_TO_ROLE)) {\n if (r === role) {\n nodeName = node;\n break;\n }\n }\n // For roles mapping to multiple nodes, refine\n if (role === 'operator') {\n const text = t.text;\n if (text === '->' || text.endsWith('->')) nodeName = 'SyncArrow';\n else if (text === '~>' || text.endsWith('~>')) nodeName = 'AsyncArrow';\n else if (text === '-') nodeName = 'Dash';\n else if (text === '~') nodeName = 'Tilde';\n else if (text === '*') nodeName = 'Star';\n else if (text === '?') nodeName = 'Question';\n } else if (role === 'number') {\n const text = t.text;\n if (/^\\d+[smhd]$/i.test(text)) nodeName = 'Duration';\n else if (/^\\d{4}-\\d{2}-\\d{2}/.test(text)) nodeName = 'DateLiteral';\n else if (text.endsWith('%')) nodeName = 'Percentage';\n else nodeName = 'Number';\n } else if (role === 'bracket') {\n const text = t.text;\n if (text === '[') nodeName = 'OpenBracket';\n else if (text === ']') nodeName = 'CloseBracket';\n else if (text === '(') nodeName = 'OpenParen';\n else if (text === ')') nodeName = 'CloseParen';\n else if (text === '<') nodeName = 'OpenAngle';\n else if (text === '>') nodeName = 'CloseAngle';\n } else if (role === 'separator') {\n if (t.text === '|') nodeName = 'Pipe';\n else if (t.text === ':') nodeName = 'Colon';\n else if (t.text === '+') nodeName = 'Plus';\n } else if (role === 'punctuation') {\n if (t.text === ',') nodeName = 'Comma';\n else nodeName = 'Punct';\n }\n\n currentLine.push({ idx: i, nodeName });\n\n // Check if token text ends with newline — start a new line\n if (t.text.includes('\\n')) {\n lines.push([]);\n }\n }\n\n // Track first content line (for ChartType handling)\n let seenFirstContent = false;\n\n for (const line of lines) {\n // Skip empty lines and whitespace-only\n const nonWs = line.filter((ref) => tokens[ref.idx].text.trim().length > 0);\n if (nonWs.length === 0) continue;\n\n const firstTok = nonWs[0];\n\n // Skip keyword-led lines\n if (KEYWORD_STARTS.has(firstTok.nodeName)) continue;\n\n // First-line chart type — skip\n if (firstTok.nodeName === 'ChartType' && !seenFirstContent) {\n seenFirstContent = true;\n continue;\n }\n seenFirstContent = true;\n\n // Find structural boundaries within this line\n let firstDashTildeIdx = -1;\n let lastArrowIdx = -1;\n\n for (let li = 0; li < nonWs.length; li++) {\n const ref = nonWs[li];\n if (\n (ref.nodeName === 'Dash' || ref.nodeName === 'Tilde') &&\n firstDashTildeIdx < 0\n ) {\n firstDashTildeIdx = li;\n }\n if (ref.nodeName === 'SyncArrow' || ref.nodeName === 'AsyncArrow') {\n lastArrowIdx = li;\n }\n }\n\n const hasArrow = firstDashTildeIdx >= 0 && lastArrowIdx > firstDashTildeIdx;\n\n if (!hasArrow) continue;\n\n // Override tokens in label zone (between first dash/tilde and last arrow)\n for (let li = firstDashTildeIdx + 1; li < lastArrowIdx; li++) {\n const ref = nonWs[li];\n if (OVERRIDE_IN_LABEL.has(ref.nodeName)) {\n tokens[ref.idx].role = 'default';\n }\n // ChartType in label also overridden\n if (ref.nodeName === 'ChartType') {\n tokens[ref.idx].role = 'default';\n }\n }\n }\n}\n\n// ============================================================\n// Post-processing: note content detection\n// ============================================================\n\nconst NOTE_HEAD_RE = /^note(\\s|$)/i;\n\n/**\n * Detect `note` keyword lines and mark indented followers as `noteContent`.\n */\nfunction applyNoteContent(tokens: HighlightToken[]): void {\n // Reconstruct lines from token text\n const fullText = tokens.map((t) => t.text).join('');\n const lines = fullText.split('\\n');\n\n let inNote = false;\n let noteIndent = 0;\n let charOffset = 0;\n\n for (const lineText of lines) {\n const lineStart = charOffset;\n const lineEnd = charOffset + lineText.length;\n const trimmed = lineText.trimStart();\n const indent = lineText.length - trimmed.length;\n\n if (NOTE_HEAD_RE.test(trimmed)) {\n inNote = true;\n noteIndent = indent;\n } else if (inNote) {\n if (trimmed.length === 0) {\n // Blank line — stays in note block\n } else if (indent > noteIndent) {\n // Mark all tokens within this line range as noteContent\n markTokensInRange(tokens, lineStart, lineEnd, 'noteContent');\n } else {\n inNote = false;\n }\n }\n\n charOffset = lineEnd + 1; // +1 for the \\n\n }\n}\n\n/**\n * Set the role of all tokens overlapping [from, to) to the given role.\n */\nfunction markTokensInRange(\n tokens: HighlightToken[],\n from: number,\n to: number,\n role: string\n): void {\n let pos = 0;\n for (const token of tokens) {\n const tokenEnd = pos + token.text.length;\n // Token overlaps range and is not just whitespace\n if (tokenEnd > from && pos < to && token.text.trim().length > 0) {\n token.role = role;\n }\n pos = tokenEnd;\n }\n}\n\n// ============================================================\n// NORD_ROLE_STYLES — hardcoded Nord dark palette for static contexts\n// ============================================================\n\nexport const NORD_ROLE_STYLES: Record<string, Record<string, string>> = {\n keyword: { color: '#81A1C1', fontWeight: 'bold' }, // nord9\n controlKeyword: { color: '#B48EAD', fontWeight: 'bold' }, // nord15\n definitionKeyword: { color: '#5E81AC', fontWeight: 'bold' }, // nord10\n modifier: { color: '#B48EAD' }, // nord15\n chartType: { color: '#D08770', fontWeight: 'bold' }, // nord12\n operator: { color: '#BF616A', fontWeight: 'bold' }, // nord11\n number: { color: '#B48EAD' }, // nord15\n comment: { color: '#616E88', fontStyle: 'italic' },\n heading: { color: '#D08770', fontWeight: 'bold' }, // nord12\n bracket: { color: '#5E81AC' }, // nord10\n separator: { color: '#88C0D0' }, // nord8\n url: { color: '#88C0D0', textDecoration: 'underline' }, // nord8\n colorAnnotation: { color: '#D08770', fontStyle: 'italic' }, // nord12\n punctuation: { color: '#616E88' },\n noteContent: { color: '#616E88', fontStyle: 'italic' },\n default: {},\n};\n\n// ============================================================\n// ROLE_TO_ANSI — ANSI escape codes for CLI output\n// ============================================================\n\nexport const ROLE_TO_ANSI: Record<string, string> = {\n comment: '\\x1b[3;90m', // italic dim\n keyword: '\\x1b[1;34m', // bold blue\n controlKeyword: '\\x1b[1;35m', // bold magenta\n definitionKeyword: '\\x1b[1;34m', // bold blue\n modifier: '\\x1b[35m', // magenta\n chartType: '\\x1b[1;33m', // bold yellow\n operator: '\\x1b[1;31m', // bold red\n number: '\\x1b[35m', // magenta\n heading: '\\x1b[1;33m', // bold yellow\n bracket: '\\x1b[34m', // blue\n separator: '\\x1b[36m', // cyan\n url: '\\x1b[4;36m', // underline cyan\n colorAnnotation: '\\x1b[3;33m', // italic yellow\n punctuation: '\\x1b[90m', // dim\n noteContent: '\\x1b[3;90m', // italic dim\n};\n\nconst ANSI_RESET = '\\x1b[0m';\n\n/**\n * Render highlighted tokens to an ANSI string for terminal display.\n */\nexport function renderAnsi(\n tokens: HighlightToken[],\n useColor: boolean\n): string {\n if (!useColor) {\n return tokens.map((t) => t.text).join('');\n }\n\n let out = '';\n let inStyled = false;\n\n for (const token of tokens) {\n const ansi = ROLE_TO_ANSI[token.role];\n if (ansi) {\n if (inStyled) out += ANSI_RESET;\n out += ansi + token.text;\n inStyled = true;\n } else {\n if (inStyled) {\n out += ANSI_RESET;\n inStyled = false;\n }\n out += token.text;\n }\n }\n\n // Final reset to prevent terminal style leakage\n out += ANSI_RESET;\n return out;\n}\n","// This file was generated by lezer-generator. You probably shouldn't edit it.\nimport {LRParser} from \"@lezer/lr\"\nimport {specializeKeyword} from \"./tokens\"\nexport const parser = LRParser.deserialize({\n version: 14,\n states: \"!WQVQPOOOOQO'#DU'#DUOOQO'#DP'#DPO%]QPO'#CdOOQO'#DO'#DOQVQPOOOOQO-E6}-E6}OOQO,59O,59OOOQO-E6|-E6|\",\n stateData: \"&Q~OvOS~OPPOQPORPOSPOTPOVSOXPOYPOZPO[PO]PO^PO_PO`POaPObPOcPOdPOePOfPOgPOhPOiPOjPOkPOlPOmPOnPOoPOpPOqPOwSO~OPPOQPORPOSPOTPOXPOYPOZPO[PO]PO^PO_PO`POaPObPOcPOdPOePOfPOgPOhPOiPOjPOkPOlPOmPOnPOoPOpPOqPO~OwVO~P#]OVXYZ[]^_`ghijklmnoabcdefpqk~\",\n goto: \"!byPPPPPPPPzPPPPPPPPPPPPPPPPPPPPPPPPP!O!UPPPP!]TSOTQTORWTSROTRURVQORT\",\n nodeNames: \"⚠ ChartType TagKeyword DirectiveKeyword ControlKeyword ModifierKeyword Document Comment ContentLine SyncArrow AsyncArrow Duration DateLiteral Percentage Number SectionMarker Url OpenBracket CloseBracket OpenParen CloseParen OpenAngle CloseAngle ColorAnnotation Pipe Colon Comma Plus Dash Tilde Star Question Identifier Punct\",\n maxTerm: 40,\n skippedNodes: [0],\n repeatNodeCount: 2,\n tokenData: \":T~RxOX#oXY#tYZ$PZp#opq#tqt#oux#oxy$Uyz$tz{${{|%S|}%Z}!O%b!O!P#o!P!Q%q!Q![&b![!]-Y!]!^#o!^!_-a!_!`-h!`!a-u!a!b-|!b!c#o!c!}.T!}#O1Z#O#P#o#P#Q1`#Q#R#o#R#S.T#S#T#o#T#[.T#[#]1g#]#o.T#o#p#o#p#q9g#q#r#o#r#s9n#s;'S#o;'S;=`9}<%lO#o~#tOq~~#yQv~XY#tpq#t~$UOw~~$]Qc~q~}!O$c#T#o$c~$fRyz$o}!O$c#T#o$c~$tOg~~${Od~q~~%SOn~q~~%ZOk~q~~%bOj~q~~%iPl~q~!`!a%l~%qOX~~%vPq~!P!Q%y~&OSV~OY%yZ;'S%y;'S;=`&[<%lO%y~&_P;=`<%l%y~&iZ^~q~uv'[!O!P'a!Q![)Q#U#V([#W#X(b#[#](b#a#b(o#e#f(b#g#h(b#k#l(b#m#n(b~'aO]~~'dP!Q!['g~'lY^~uv'[!Q!['g#U#V([#W#X(b#[#](b#a#b(o#e#f(b#g#h(b#k#l(b#m#n(b~(_P#W#X(b~(gPZ~!a!b(j~(oOZ~~(tQZ~!a!b(j#]#^(z~(}P#b#c(b~)VZ^~uv'[!O!P'a!Q![)x#U#V([#W#X(b#[#](b#a#b(o#e#f(b#g#h(b#k#l(b#m#n(b~)}Z^~uv'[!O!P'a!Q![*p#U#V([#W#X(b#[#](b#a#b(o#e#f(b#g#h(b#k#l(b#m#n(b~*u[^~uv'[}!O+k!O!P'a!Q![,b#U#V([#W#X(b#[#](b#a#b(o#e#f(b#g#h(b#k#l(b#m#n(b~+nP!Q![+q~+tP!Q![+w~+|P[~}!O,P~,SP!Q![,V~,YP!Q![,]~,bO[~~,gZ^~uv'[!O!P'a!Q![,b#U#V([#W#X(b#[#](b#a#b(o#e#f(b#g#h(b#k#l(b#m#n(b~-aOi~q~~-hOe~q~~-mPq~!_!`-p~-uO_~~-|Of~q~~.TOo~q~~.[_p~q~qr/Zst/Zvw/Zwx/Z{|/Z}!O0_!O!P/Z!P!Q/Z!Q![/Z!_!`/Z!a!b/Z!b!c/Z!c!}/Z#R#S/Z#T#o/Z~/`_p~qr/Zst/Zvw/Zwx/Z{|/Z}!O0_!O!P/Z!P!Q/Z!Q![/Z!_!`/Z!a!b/Z!b!c/Z!c!}/Z#R#S/Z#T#o/Z~0b]qr/Zst/Zvw/Zwx/Z{|/Z!O!P/Z!P!Q/Z!_!`/Z!a!b/Z!b!c/Z!c!}/Z#R#S/Z#T#o/Z~1`Oa~~1gOb~q~~1nap~q~qr/Zst/Zvw/Zwx/Z{|/Z}!O0_!O!P/Z!P!Q/Z!Q![/Z!_!`/Z!a!b/Z!b!c/Z!c!}/Z#R#S/Z#T#h/Z#h#i2s#i#o/Z~2xap~qr/Zst/Zvw/Zwx/Z{|/Z}!O0_!O!P/Z!P!Q/Z!Q![/Z!_!`/Z!a!b/Z!b!c/Z!c!}/Z#R#S/Z#T#h/Z#h#i3}#i#o/Z~4Sap~qr/Zst/Zvw/Zwx/Z{|/Z}!O0_!O!P/Z!P!Q/Z!Q![/Z!_!`/Z!a!b/Z!b!c/Z!c!}/Z#R#S/Z#T#d/Z#d#e5X#e#o/Z~5^bp~qr/Zst/Zvw/Zwx/Z{|/Z}!O0_!O!P/Z!P!Q/Z!Q![/Z![!]6f!_!`/Z!a!b/Z!b!c/Z!c!}/Z#R#S/Z#T#g/Z#g#h8`#h#o/Z~6iP!P!Q6l~6oP!P!Q6r~6uYOX7eZp7eqy7ez|7e}!`7e!a#P7e#Q#p7e#q;'S7e;'S;=`8Y<%lO7e~7jY`~OX7eZp7eqy7ez|7e}!`7e!a#P7e#Q#p7e#q;'S7e;'S;=`8Y<%lO7e~8]P;=`<%l7e~8e`p~qr/Zst/Zvw/Zwx/Z{|/Z}!O0_!O!P/Z!P!Q/Z!Q![/Z![!]6f!_!`/Z!a!b/Z!b!c/Z!c!}/Z#R#S/Z#T#o/Z~9nOh~q~~9uPm~q~!`!a9x~9}OY~~:QP;=`<%l#o\",\n tokenizers: [0],\n topRules: {\"Document\":[0,6]},\n specialized: [{term: 32, get: (value, stack) => (specializeKeyword(value, stack) << 1), external: specializeKeyword}],\n tokenPrec: 204\n})\n","// This file was generated by lezer-generator. You probably shouldn't edit it.\nexport const\n ChartType = 1,\n TagKeyword = 2,\n DirectiveKeyword = 3,\n ControlKeyword = 4,\n ModifierKeyword = 5,\n Document = 6,\n Comment = 7,\n ContentLine = 8,\n SyncArrow = 9,\n AsyncArrow = 10,\n Duration = 11,\n DateLiteral = 12,\n Percentage = 13,\n Number = 14,\n SectionMarker = 15,\n Url = 16,\n OpenBracket = 17,\n CloseBracket = 18,\n OpenParen = 19,\n CloseParen = 20,\n OpenAngle = 21,\n CloseAngle = 22,\n ColorAnnotation = 23,\n Pipe = 24,\n Colon = 25,\n Comma = 26,\n Plus = 27,\n Dash = 28,\n Tilde = 29,\n Star = 30,\n Question = 31,\n Identifier = 32,\n Punct = 33\n","/** All supported DGMO chart types. */\nexport const CHART_TYPES = new Set([\n // Diagram types\n 'sequence',\n 'flowchart',\n 'class',\n 'er',\n 'org',\n 'kanban',\n 'c4',\n 'state',\n 'sitemap',\n 'infra',\n 'gantt',\n 'boxes-and-lines',\n // Data chart types\n 'bar',\n 'line',\n 'pie',\n 'doughnut',\n 'area',\n 'polar-area',\n 'radar',\n 'bar-stacked',\n 'multi-line',\n 'scatter',\n 'sankey',\n 'chord',\n 'function',\n 'heatmap',\n 'funnel',\n // Visualization types\n 'slope',\n 'wordcloud',\n 'arc',\n 'timeline',\n 'venn',\n 'quadrant',\n]);\n\n/** Metadata keys recognized across chart types. */\nexport const METADATA_KEYS = new Set([\n 'title',\n 'series',\n 'orientation',\n 'x-label',\n 'y-label',\n 'size-label',\n 'x',\n 'columns',\n 'rows',\n 'labels',\n 'rotate',\n 'max',\n 'size',\n 'order',\n 'sort',\n 'scale',\n 'values',\n 'notation',\n 'x-axis',\n 'y-axis',\n 'top-right',\n 'top-left',\n 'bottom-right',\n 'bottom-left',\n]);\n\n/** Tag declaration keyword. */\nexport const TAG_KEYWORD = 'tag';\n\n/** Directive keywords — commands that configure chart behavior. */\nexport const DIRECTIVE_KEYWORDS = new Set([\n // Gantt\n 'start',\n 'era',\n 'marker',\n 'holiday',\n 'workweek',\n 'today-marker',\n 'critical-path',\n 'no-dependencies',\n 'sort',\n // Tags\n 'tags',\n 'import',\n 'active-tag',\n 'hide',\n 'mode',\n 'direction',\n // ER\n 'notation',\n // Class\n 'extends',\n 'implements',\n 'abstract',\n 'interface',\n 'enum',\n // C4\n 'containers',\n 'components',\n 'deployment',\n // Infra directives\n 'sub-node-label',\n 'show-sub-node-count',\n 'no-auto-color',\n // Infra node properties\n 'description',\n 'instances',\n 'max-rps',\n 'latency-ms',\n 'uptime',\n 'firewall-block',\n 'ratelimit-rps',\n 'cb-error-threshold',\n 'cb-latency-threshold-ms',\n 'buffer',\n 'drain-rate',\n 'retention-hours',\n 'partitions',\n 'split',\n 'slo-p90-latency-ms',\n 'slo-availability',\n 'cache-hit',\n 'concurrency',\n 'duration-ms',\n 'cold-start-ms',\n 'rps',\n // Sequence\n 'activations',\n 'no-activations',\n 'collapse-notes',\n 'no-collapse-notes',\n // Data charts\n 'stacked',\n 'no-label-name',\n 'no-label-value',\n 'no-label-percent',\n // Slope\n 'period',\n // Quadrant\n 'x-axis',\n 'y-axis',\n 'top-right',\n 'top-left',\n 'bottom-right',\n 'bottom-left',\n // Layout\n 'direction-tb',\n 'direction-lr',\n // Data chart metadata\n 'title',\n 'series',\n 'orientation',\n 'x-label',\n 'y-label',\n 'size-label',\n 'columns',\n 'rows',\n 'labels',\n 'rotate',\n 'scale',\n 'values',\n]);\n\n/** Control flow keywords — structural blocks. */\nexport const CONTROL_KEYWORDS = new Set([\n 'if',\n 'else',\n 'loop',\n 'parallel',\n 'note',\n]);\n\n/** Status keywords — kanban. */\nexport const STATUS_KEYWORDS = new Set([\n 'na',\n 'todo',\n 'wip',\n 'done',\n 'blocked',\n 'in-progress',\n 'backlog',\n 'ready',\n]);\n\n/** Modifier keywords — adjust declarations. */\nexport const MODIFIER_KEYWORDS = new Set([\n 'alias',\n 'aka',\n 'position',\n 'default',\n // ER column modifiers\n 'pk',\n 'fk',\n 'nullable',\n 'unique',\n // ER data types\n 'int',\n 'varchar',\n 'text',\n 'boolean',\n 'date',\n 'timestamp',\n 'float',\n 'decimal',\n]);\n","import {\n ChartType,\n TagKeyword,\n DirectiveKeyword,\n ControlKeyword,\n ModifierKeyword,\n} from './dgmo.grammar.terms.js';\nimport {\n CHART_TYPES,\n TAG_KEYWORD,\n DIRECTIVE_KEYWORDS,\n CONTROL_KEYWORDS,\n STATUS_KEYWORDS,\n MODIFIER_KEYWORDS,\n} from './keywords';\n\n/**\n * Keyword specializer for the Lezer grammar.\n * Called on every Identifier token — returns a specialized term ID\n * or -1 to keep it as a plain Identifier.\n */\nexport function specializeKeyword(value: string): number {\n if (CHART_TYPES.has(value)) return ChartType;\n if (value === TAG_KEYWORD) return TagKeyword;\n if (DIRECTIVE_KEYWORDS.has(value)) return DirectiveKeyword;\n if (CONTROL_KEYWORDS.has(value)) return ControlKeyword;\n if (STATUS_KEYWORDS.has(value)) return ModifierKeyword;\n if (MODIFIER_KEYWORDS.has(value)) return ModifierKeyword;\n return -1;\n}\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../src/editor/highlight-api.ts","../src/editor/dgmo.grammar.js","../src/editor/dgmo.grammar.terms.js","../src/editor/keywords.ts","../src/editor/tokens.ts"],"sourcesContent":["/**\n * Standalone DGMO syntax highlighter — no CodeMirror dependency.\n *\n * Exports:\n * - `highlightDgmo(source)` → `HighlightToken[]` (consumer-agnostic)\n * - `NORD_ROLE_STYLES` — inline style objects keyed by role (for React/Astro)\n * - `ROLE_TO_ANSI` — ANSI escape codes keyed by role (for CLI)\n *\n * Uses the raw Lezer parser directly — keyword specialization is wired into\n * the grammar, so `parser.parse()` runs it automatically.\n *\n * @module @diagrammo/dgmo/highlight\n */\n\nimport { parser } from './dgmo.grammar.js';\n\n// ============================================================\n// Types\n// ============================================================\n\nexport interface HighlightToken {\n text: string;\n role: string;\n}\n\n// ============================================================\n// NODE_TO_ROLE — keep in sync with highlight.ts\n// ============================================================\n\nconst NODE_TO_ROLE: Record<string, string> = {\n Comment: 'comment',\n ChartType: 'chartType',\n TagKeyword: 'definitionKeyword',\n DirectiveKeyword: 'keyword',\n ControlKeyword: 'controlKeyword',\n ModifierKeyword: 'modifier',\n SyncArrow: 'operator',\n AsyncArrow: 'operator',\n Dash: 'operator',\n Tilde: 'operator',\n Star: 'operator',\n Question: 'operator',\n Duration: 'number',\n DateLiteral: 'number',\n Number: 'number',\n Percentage: 'number',\n SectionMarker: 'heading',\n Url: 'url',\n ColorAnnotation: 'colorAnnotation',\n OpenBracket: 'bracket',\n CloseBracket: 'bracket',\n OpenParen: 'bracket',\n CloseParen: 'bracket',\n OpenAngle: 'bracket',\n CloseAngle: 'bracket',\n Pipe: 'separator',\n Colon: 'separator',\n Plus: 'separator',\n Comma: 'punctuation',\n Punct: 'punctuation',\n Identifier: 'default',\n};\n\n// ============================================================\n// Entity detection — keep in sync with entity-highlight.ts\n// ============================================================\n\n/** Tokens that have grammar-level styling which should be overridden in labels. */\nconst OVERRIDE_IN_LABEL = new Set([\n 'ChartType',\n 'TagKeyword',\n 'DirectiveKeyword',\n 'ControlKeyword',\n 'ModifierKeyword',\n 'Number',\n 'Percentage',\n 'Duration',\n 'DateLiteral',\n]);\n\n/** Lines starting with these are keyword-led — not entity declarations. */\nconst KEYWORD_STARTS = new Set([\n 'TagKeyword',\n 'DirectiveKeyword',\n 'ControlKeyword',\n 'ModifierKeyword',\n 'SectionMarker',\n 'Comment',\n 'Duration',\n 'DateLiteral',\n]);\n\n// ============================================================\n// Core: highlightDgmo()\n// ============================================================\n\n/**\n * Tokenize DGMO source into annotated highlight spans.\n *\n * Guarantees lossless round-trip:\n * `highlightDgmo(src).map(t => t.text).join('') === src`\n */\nexport function highlightDgmo(source: string): HighlightToken[] {\n const tree = parser.parse(source);\n const tokens: HighlightToken[] = [];\n\n // Phase 1: Walk tree cursor, collect leaf tokens with gap filling\n let pos = 0;\n const cursor = tree.cursor();\n\n // Descend to leaves, process them, then advance via next() or parent+next()\n function descend(): void {\n for (;;) {\n // Try to go deeper\n if (cursor.firstChild()) continue;\n\n // At a leaf — emit it\n emitLeaf();\n\n // Try to advance to next sibling or ascend\n while (!cursor.nextSibling()) {\n if (!cursor.parent()) return; // back at root — done\n }\n\n // Now at next sibling — loop will try to descend into it\n }\n }\n\n function emitLeaf(): void {\n const from = cursor.from;\n const to = cursor.to;\n\n // Fill gap before this node\n if (from > pos) {\n tokens.push({ text: source.slice(pos, from), role: 'default' });\n }\n\n // Emit this leaf node\n if (to > from) {\n const role = NODE_TO_ROLE[cursor.name] ?? 'default';\n tokens.push({ text: source.slice(from, to), role });\n }\n\n pos = to;\n }\n\n descend();\n\n // Fill trailing gap\n if (pos < source.length) {\n tokens.push({ text: source.slice(pos, source.length), role: 'default' });\n }\n\n // Phase 2: Post-process — entity detection (label override only)\n applyLabelOverrides(tokens);\n\n // Phase 3: Post-process — note content detection\n applyNoteContent(tokens);\n\n return tokens;\n}\n\n// ============================================================\n// Post-processing: label overrides\n// ============================================================\n\ninterface LineTokenRef {\n /** Index into the flat token array. */\n idx: number;\n /** Grammar node name (looked up from role + NODE_TO_ROLE reverse). */\n nodeName: string;\n}\n\n/**\n * Override keyword/number tokens in message-label positions to `default` role.\n *\n * A \"label\" is the span between the first Dash/Tilde and the last arrow on a\n * content line. Tokens in OVERRIDE_IN_LABEL within that zone get their role\n * set to `default` so they render as plain text.\n *\n * Also handles ChartType tokens on non-first content lines — they become\n * `default` in labels.\n */\nfunction applyLabelOverrides(tokens: HighlightToken[]): void {\n // Build reverse map: role → possible node names (for override detection)\n const ROLE_TO_NODES: Record<string, string[]> = {};\n for (const [node, role] of Object.entries(NODE_TO_ROLE)) {\n (ROLE_TO_NODES[role] ??= []).push(node);\n }\n\n // Split tokens into lines\n const lines: LineTokenRef[][] = [[]];\n for (let i = 0; i < tokens.length; i++) {\n const t = tokens[i];\n // If the token contains newlines, it belongs to the current line\n // but signals the start of a new line after it\n const currentLine = lines[lines.length - 1];\n const role = t.role;\n\n // Determine which node name this token likely had\n let nodeName = '';\n for (const [node, r] of Object.entries(NODE_TO_ROLE)) {\n if (r === role) {\n nodeName = node;\n break;\n }\n }\n // For roles mapping to multiple nodes, refine\n if (role === 'operator') {\n const text = t.text;\n if (text === '->' || text.endsWith('->')) nodeName = 'SyncArrow';\n else if (text === '~>' || text.endsWith('~>')) nodeName = 'AsyncArrow';\n else if (text === '-') nodeName = 'Dash';\n else if (text === '~') nodeName = 'Tilde';\n else if (text === '*') nodeName = 'Star';\n else if (text === '?') nodeName = 'Question';\n } else if (role === 'number') {\n const text = t.text;\n if (/^\\d+[smhd]$/i.test(text)) nodeName = 'Duration';\n else if (/^\\d{4}-\\d{2}-\\d{2}/.test(text)) nodeName = 'DateLiteral';\n else if (text.endsWith('%')) nodeName = 'Percentage';\n else nodeName = 'Number';\n } else if (role === 'bracket') {\n const text = t.text;\n if (text === '[') nodeName = 'OpenBracket';\n else if (text === ']') nodeName = 'CloseBracket';\n else if (text === '(') nodeName = 'OpenParen';\n else if (text === ')') nodeName = 'CloseParen';\n else if (text === '<') nodeName = 'OpenAngle';\n else if (text === '>') nodeName = 'CloseAngle';\n } else if (role === 'separator') {\n if (t.text === '|') nodeName = 'Pipe';\n else if (t.text === ':') nodeName = 'Colon';\n else if (t.text === '+') nodeName = 'Plus';\n } else if (role === 'punctuation') {\n if (t.text === ',') nodeName = 'Comma';\n else nodeName = 'Punct';\n }\n\n currentLine.push({ idx: i, nodeName });\n\n // Check if token text ends with newline — start a new line\n if (t.text.includes('\\n')) {\n lines.push([]);\n }\n }\n\n // Track first content line (for ChartType handling)\n let seenFirstContent = false;\n\n for (const line of lines) {\n // Skip empty lines and whitespace-only\n const nonWs = line.filter((ref) => tokens[ref.idx].text.trim().length > 0);\n if (nonWs.length === 0) continue;\n\n const firstTok = nonWs[0];\n\n // Skip keyword-led lines\n if (KEYWORD_STARTS.has(firstTok.nodeName)) continue;\n\n // First-line chart type — skip\n if (firstTok.nodeName === 'ChartType' && !seenFirstContent) {\n seenFirstContent = true;\n continue;\n }\n seenFirstContent = true;\n\n // Find structural boundaries within this line\n let firstDashTildeIdx = -1;\n let lastArrowIdx = -1;\n\n for (let li = 0; li < nonWs.length; li++) {\n const ref = nonWs[li];\n if (\n (ref.nodeName === 'Dash' || ref.nodeName === 'Tilde') &&\n firstDashTildeIdx < 0\n ) {\n firstDashTildeIdx = li;\n }\n if (ref.nodeName === 'SyncArrow' || ref.nodeName === 'AsyncArrow') {\n lastArrowIdx = li;\n }\n }\n\n const hasArrow = firstDashTildeIdx >= 0 && lastArrowIdx > firstDashTildeIdx;\n\n if (!hasArrow) continue;\n\n // Override tokens in label zone (between first dash/tilde and last arrow)\n for (let li = firstDashTildeIdx + 1; li < lastArrowIdx; li++) {\n const ref = nonWs[li];\n if (OVERRIDE_IN_LABEL.has(ref.nodeName)) {\n tokens[ref.idx].role = 'default';\n }\n // ChartType in label also overridden\n if (ref.nodeName === 'ChartType') {\n tokens[ref.idx].role = 'default';\n }\n }\n }\n}\n\n// ============================================================\n// Post-processing: note content detection\n// ============================================================\n\nconst NOTE_HEAD_RE = /^note(\\s|$)/i;\n\n/**\n * Detect `note` keyword lines and mark indented followers as `noteContent`.\n */\nfunction applyNoteContent(tokens: HighlightToken[]): void {\n // Reconstruct lines from token text\n const fullText = tokens.map((t) => t.text).join('');\n const lines = fullText.split('\\n');\n\n let inNote = false;\n let noteIndent = 0;\n let charOffset = 0;\n\n for (const lineText of lines) {\n const lineStart = charOffset;\n const lineEnd = charOffset + lineText.length;\n const trimmed = lineText.trimStart();\n const indent = lineText.length - trimmed.length;\n\n if (NOTE_HEAD_RE.test(trimmed)) {\n inNote = true;\n noteIndent = indent;\n } else if (inNote) {\n if (trimmed.length === 0) {\n // Blank line — stays in note block\n } else if (indent > noteIndent) {\n // Mark all tokens within this line range as noteContent\n markTokensInRange(tokens, lineStart, lineEnd, 'noteContent');\n } else {\n inNote = false;\n }\n }\n\n charOffset = lineEnd + 1; // +1 for the \\n\n }\n}\n\n/**\n * Set the role of all tokens overlapping [from, to) to the given role.\n */\nfunction markTokensInRange(\n tokens: HighlightToken[],\n from: number,\n to: number,\n role: string\n): void {\n let pos = 0;\n for (const token of tokens) {\n const tokenEnd = pos + token.text.length;\n // Token overlaps range and is not just whitespace\n if (tokenEnd > from && pos < to && token.text.trim().length > 0) {\n token.role = role;\n }\n pos = tokenEnd;\n }\n}\n\n// ============================================================\n// NORD_ROLE_STYLES — hardcoded Nord dark palette for static contexts\n// ============================================================\n\nexport const NORD_ROLE_STYLES: Record<string, Record<string, string>> = {\n keyword: { color: '#81A1C1', fontWeight: 'bold' }, // nord9\n controlKeyword: { color: '#B48EAD', fontWeight: 'bold' }, // nord15\n definitionKeyword: { color: '#5E81AC', fontWeight: 'bold' }, // nord10\n modifier: { color: '#B48EAD' }, // nord15\n chartType: { color: '#D08770', fontWeight: 'bold' }, // nord12\n operator: { color: '#BF616A', fontWeight: 'bold' }, // nord11\n number: { color: '#B48EAD' }, // nord15\n comment: { color: '#616E88', fontStyle: 'italic' },\n heading: { color: '#D08770', fontWeight: 'bold' }, // nord12\n bracket: { color: '#5E81AC' }, // nord10\n separator: { color: '#88C0D0' }, // nord8\n url: { color: '#88C0D0', textDecoration: 'underline' }, // nord8\n colorAnnotation: { color: '#D08770', fontStyle: 'italic' }, // nord12\n punctuation: { color: '#616E88' },\n noteContent: { color: '#616E88', fontStyle: 'italic' },\n default: {},\n};\n\n// ============================================================\n// ROLE_TO_ANSI — ANSI escape codes for CLI output\n// ============================================================\n\nexport const ROLE_TO_ANSI: Record<string, string> = {\n comment: '\\x1b[3;90m', // italic dim\n keyword: '\\x1b[1;34m', // bold blue\n controlKeyword: '\\x1b[1;35m', // bold magenta\n definitionKeyword: '\\x1b[1;34m', // bold blue\n modifier: '\\x1b[35m', // magenta\n chartType: '\\x1b[1;33m', // bold yellow\n operator: '\\x1b[1;31m', // bold red\n number: '\\x1b[35m', // magenta\n heading: '\\x1b[1;33m', // bold yellow\n bracket: '\\x1b[34m', // blue\n separator: '\\x1b[36m', // cyan\n url: '\\x1b[4;36m', // underline cyan\n colorAnnotation: '\\x1b[3;33m', // italic yellow\n punctuation: '\\x1b[90m', // dim\n noteContent: '\\x1b[3;90m', // italic dim\n};\n\nconst ANSI_RESET = '\\x1b[0m';\n\n/**\n * Render highlighted tokens to an ANSI string for terminal display.\n */\nexport function renderAnsi(\n tokens: HighlightToken[],\n useColor: boolean\n): string {\n if (!useColor) {\n return tokens.map((t) => t.text).join('');\n }\n\n let out = '';\n let inStyled = false;\n\n for (const token of tokens) {\n const ansi = ROLE_TO_ANSI[token.role];\n if (ansi) {\n if (inStyled) out += ANSI_RESET;\n out += ansi + token.text;\n inStyled = true;\n } else {\n if (inStyled) {\n out += ANSI_RESET;\n inStyled = false;\n }\n out += token.text;\n }\n }\n\n // Final reset to prevent terminal style leakage\n out += ANSI_RESET;\n return out;\n}\n","// This file was generated by lezer-generator. You probably shouldn't edit it.\nimport {LRParser} from \"@lezer/lr\"\nimport {specializeKeyword} from \"./tokens\"\nexport const parser = LRParser.deserialize({\n version: 14,\n states: \"!WQVQPOOOOQO'#DU'#DUOOQO'#DP'#DPO%]QPO'#CdOOQO'#DO'#DOQVQPOOOOQO-E6}-E6}OOQO,59O,59OOOQO-E6|-E6|\",\n stateData: \"&Q~OvOS~OPPOQPORPOSPOTPOVSOXPOYPOZPO[PO]PO^PO_PO`POaPObPOcPOdPOePOfPOgPOhPOiPOjPOkPOlPOmPOnPOoPOpPOqPOwSO~OPPOQPORPOSPOTPOXPOYPOZPO[PO]PO^PO_PO`POaPObPOcPOdPOePOfPOgPOhPOiPOjPOkPOlPOmPOnPOoPOpPOqPO~OwVO~P#]OVXYZ[]^_`ghijklmnoabcdefpqk~\",\n goto: \"!byPPPPPPPPzPPPPPPPPPPPPPPPPPPPPPPPPP!O!UPPPP!]TSOTQTORWTSROTRURVQORT\",\n nodeNames: \"⚠ ChartType TagKeyword DirectiveKeyword ControlKeyword ModifierKeyword Document Comment ContentLine SyncArrow AsyncArrow Duration DateLiteral Percentage Number SectionMarker Url OpenBracket CloseBracket OpenParen CloseParen OpenAngle CloseAngle ColorAnnotation Pipe Colon Comma Plus Dash Tilde Star Question Identifier Punct\",\n maxTerm: 40,\n skippedNodes: [0],\n repeatNodeCount: 2,\n tokenData: \"<O~RxOX#oXY#tYZ$PZp#opq#tqt#oux#oxy$Uyz$tz{${{|%S|}%Z}!O%b!O!P#o!P!Q%q!Q![&b![!]/T!]!^#o!^!_/[!_!`/c!`!a/p!a!b/w!b!c#o!c!}0O!}#O3U#O#P#o#P#Q3Z#Q#R#o#R#S0O#S#T#o#T#[0O#[#]3b#]#o0O#o#p#o#p#q;b#q#r#o#r#s;i#s;'S#o;'S;=`;x<%lO#o~#tOq~~#yQv~XY#tpq#t~$UOw~~$]Qc~q~}!O$c#T#o$c~$fRyz$o}!O$c#T#o$c~$tOg~~${Od~q~~%SOn~q~~%ZOk~q~~%bOj~q~~%iPl~q~!`!a%l~%qOX~~%vPq~!P!Q%y~&OSV~OY%yZ;'S%y;'S;=`&[<%lO%y~&_P;=`<%l%y~&i]^~q~uv'b|}'g!O!P(d!Q![*T#R#S.o#U#V)_#W#X)e#[#])e#a#b)r#e#f)e#g#h)e#k#l)e#m#n)e~'gO]~~'jP!Q!['m~'pP!Q!['s~'vP!Q!['y~(OQ^~|}'g!O!P(U~(XP!Q![([~(aP^~!Q![([~(gP!Q![(j~(oY^~uv'b!Q![(j#U#V)_#W#X)e#[#])e#a#b)r#e#f)e#g#h)e#k#l)e#m#n)e~)bP#W#X)e~)jPZ~!a!b)m~)rOZ~~)wQZ~!a!b)m#]#^)}~*QP#b#c)e~*Y]^~uv'b|}'g!O!P(d!Q![+R#R#S.o#U#V)_#W#X)e#[#])e#a#b)r#e#f)e#g#h)e#k#l)e#m#n)e~+W]^~uv'b|}'g!O!P(d!Q![,P#R#S.o#U#V)_#W#X)e#[#])e#a#b)r#e#f)e#g#h)e#k#l)e#m#n)e~,U]^~uv'b}!O,}!O!P(d!Q![-t#R#S.o#U#V)_#W#X)e#[#])e#a#b)r#e#f)e#g#h)e#k#l)e#m#n)e~-QP!Q![-T~-WP!Q![-Z~-`P[~}!O-c~-fP!Q![-i~-lP!Q![-o~-tO[~~-y[^~uv'b!O!P(d!Q![-t#R#S.o#U#V)_#W#X)e#[#])e#a#b)r#e#f)e#g#h)e#k#l)e#m#n)e~.rP!Q![.u~.zR^~!O!P(U!Q![.u#R#S.o~/[Oi~q~~/cOe~q~~/hPq~!_!`/k~/pO_~~/wOf~q~~0OOo~q~~0V_p~q~qr1Ust1Uvw1Uwx1U{|1U}!O2Y!O!P1U!P!Q1U!Q![1U!_!`1U!a!b1U!b!c1U!c!}1U#R#S1U#T#o1U~1Z_p~qr1Ust1Uvw1Uwx1U{|1U}!O2Y!O!P1U!P!Q1U!Q![1U!_!`1U!a!b1U!b!c1U!c!}1U#R#S1U#T#o1U~2]]qr1Ust1Uvw1Uwx1U{|1U!O!P1U!P!Q1U!_!`1U!a!b1U!b!c1U!c!}1U#R#S1U#T#o1U~3ZOa~~3bOb~q~~3iap~q~qr1Ust1Uvw1Uwx1U{|1U}!O2Y!O!P1U!P!Q1U!Q![1U!_!`1U!a!b1U!b!c1U!c!}1U#R#S1U#T#h1U#h#i4n#i#o1U~4sap~qr1Ust1Uvw1Uwx1U{|1U}!O2Y!O!P1U!P!Q1U!Q![1U!_!`1U!a!b1U!b!c1U!c!}1U#R#S1U#T#h1U#h#i5x#i#o1U~5}ap~qr1Ust1Uvw1Uwx1U{|1U}!O2Y!O!P1U!P!Q1U!Q![1U!_!`1U!a!b1U!b!c1U!c!}1U#R#S1U#T#d1U#d#e7S#e#o1U~7Xbp~qr1Ust1Uvw1Uwx1U{|1U}!O2Y!O!P1U!P!Q1U!Q![1U![!]8a!_!`1U!a!b1U!b!c1U!c!}1U#R#S1U#T#g1U#g#h:Z#h#o1U~8dP!P!Q8g~8jP!P!Q8m~8pYOX9`Zp9`qy9`z|9`}!`9`!a#P9`#Q#p9`#q;'S9`;'S;=`:T<%lO9`~9eY`~OX9`Zp9`qy9`z|9`}!`9`!a#P9`#Q#p9`#q;'S9`;'S;=`:T<%lO9`~:WP;=`<%l9`~:``p~qr1Ust1Uvw1Uwx1U{|1U}!O2Y!O!P1U!P!Q1U!Q![1U![!]8a!_!`1U!a!b1U!b!c1U!c!}1U#R#S1U#T#o1U~;iOh~q~~;pPm~q~!`!a;s~;xOY~~;{P;=`<%l#o\",\n tokenizers: [0],\n topRules: {\"Document\":[0,6]},\n specialized: [{term: 32, get: (value, stack) => (specializeKeyword(value, stack) << 1), external: specializeKeyword}],\n tokenPrec: 204\n})\n","// This file was generated by lezer-generator. You probably shouldn't edit it.\nexport const\n ChartType = 1,\n TagKeyword = 2,\n DirectiveKeyword = 3,\n ControlKeyword = 4,\n ModifierKeyword = 5,\n Document = 6,\n Comment = 7,\n ContentLine = 8,\n SyncArrow = 9,\n AsyncArrow = 10,\n Duration = 11,\n DateLiteral = 12,\n Percentage = 13,\n Number = 14,\n SectionMarker = 15,\n Url = 16,\n OpenBracket = 17,\n CloseBracket = 18,\n OpenParen = 19,\n CloseParen = 20,\n OpenAngle = 21,\n CloseAngle = 22,\n ColorAnnotation = 23,\n Pipe = 24,\n Colon = 25,\n Comma = 26,\n Plus = 27,\n Dash = 28,\n Tilde = 29,\n Star = 30,\n Question = 31,\n Identifier = 32,\n Punct = 33\n","/** All supported DGMO chart types. */\nexport const CHART_TYPES = new Set([\n // Diagram types\n 'sequence',\n 'flowchart',\n 'class',\n 'er',\n 'org',\n 'kanban',\n 'c4',\n 'state',\n 'sitemap',\n 'infra',\n 'gantt',\n 'boxes-and-lines',\n 'wireframe',\n 'tech-radar',\n 'mindmap',\n 'journey-map',\n // Data chart types\n 'bar',\n 'line',\n 'pie',\n 'doughnut',\n 'area',\n 'polar-area',\n 'radar',\n 'bar-stacked',\n 'multi-line',\n 'scatter',\n 'sankey',\n 'chord',\n 'function',\n 'heatmap',\n 'funnel',\n // Visualization types\n 'slope',\n 'wordcloud',\n 'arc',\n 'timeline',\n 'venn',\n 'quadrant',\n]);\n\n/** Metadata keys recognized across chart types. */\nexport const METADATA_KEYS = new Set([\n 'title',\n 'series',\n 'orientation',\n 'x-label',\n 'y-label',\n 'size-label',\n 'x',\n 'columns',\n 'rows',\n 'labels',\n 'rotate',\n 'max',\n 'size',\n 'order',\n 'sort',\n 'scale',\n 'values',\n 'notation',\n 'x-axis',\n 'y-axis',\n 'top-right',\n 'top-left',\n 'bottom-right',\n 'bottom-left',\n // Tech-radar pipe metadata\n 'quadrant',\n 'ring',\n 'trend',\n]);\n\n/** Tag declaration keyword. */\nexport const TAG_KEYWORD = 'tag';\n\n/** Directive keywords — commands that configure chart behavior. */\nexport const DIRECTIVE_KEYWORDS = new Set([\n // Gantt\n 'start',\n 'era',\n 'marker',\n 'holiday',\n 'workweek',\n 'today-marker',\n 'critical-path',\n 'no-dependencies',\n 'sort',\n // Tech-radar\n 'rings',\n // Tags\n 'tags',\n 'import',\n 'active-tag',\n 'hide',\n 'mode',\n 'direction',\n // ER\n 'notation',\n // Class\n 'extends',\n 'implements',\n 'abstract',\n 'interface',\n 'enum',\n // C4\n 'containers',\n 'components',\n 'deployment',\n // Infra directives\n 'sub-node-label',\n 'show-sub-node-count',\n 'no-auto-color',\n // Infra node properties\n 'description',\n 'instances',\n 'max-rps',\n 'latency-ms',\n 'uptime',\n 'firewall-block',\n 'ratelimit-rps',\n 'cb-error-threshold',\n 'cb-latency-threshold-ms',\n 'buffer',\n 'drain-rate',\n 'retention-hours',\n 'partitions',\n 'split',\n 'slo-p90-latency-ms',\n 'slo-availability',\n 'cache-hit',\n 'concurrency',\n 'duration-ms',\n 'cold-start-ms',\n 'rps',\n // Sequence\n 'activations',\n 'no-activations',\n 'collapse-notes',\n 'no-collapse-notes',\n // Data charts\n 'stacked',\n 'no-label-name',\n 'no-label-value',\n 'no-label-percent',\n // Slope\n 'period',\n // Quadrant\n 'x-axis',\n 'y-axis',\n 'top-right',\n 'top-left',\n 'bottom-right',\n 'bottom-left',\n // Layout\n 'direction-tb',\n 'direction-lr',\n // Data chart metadata\n 'title',\n 'series',\n 'orientation',\n 'x-label',\n 'y-label',\n 'size-label',\n 'columns',\n 'rows',\n 'labels',\n 'rotate',\n 'scale',\n 'values',\n]);\n\n/** Control flow keywords — structural blocks. */\nexport const CONTROL_KEYWORDS = new Set([\n 'if',\n 'else',\n 'loop',\n 'parallel',\n 'note',\n // Wireframe elements\n 'nav',\n 'tabs',\n 'table',\n 'image',\n 'modal',\n 'skeleton',\n 'alert',\n 'progress',\n 'chart',\n 'mobile',\n]);\n\n/** Status keywords — kanban. */\nexport const STATUS_KEYWORDS = new Set([\n 'na',\n 'todo',\n 'wip',\n 'done',\n 'blocked',\n 'in-progress',\n 'backlog',\n 'ready',\n // Tech-radar trend values\n 'new',\n 'up',\n 'down',\n 'stable',\n]);\n\n/** Modifier keywords — adjust declarations. */\nexport const MODIFIER_KEYWORDS = new Set([\n 'alias',\n 'aka',\n 'position',\n 'default',\n // ER column modifiers\n 'pk',\n 'fk',\n 'nullable',\n 'unique',\n // ER data types\n 'int',\n 'varchar',\n 'text',\n 'boolean',\n 'date',\n 'timestamp',\n 'float',\n 'decimal',\n]);\n","import {\n ChartType,\n TagKeyword,\n DirectiveKeyword,\n ControlKeyword,\n ModifierKeyword,\n} from './dgmo.grammar.terms.js';\nimport {\n CHART_TYPES,\n TAG_KEYWORD,\n DIRECTIVE_KEYWORDS,\n CONTROL_KEYWORDS,\n STATUS_KEYWORDS,\n MODIFIER_KEYWORDS,\n} from './keywords';\n\n/**\n * Keyword specializer for the Lezer grammar.\n * Called on every Identifier token — returns a specialized term ID\n * or -1 to keep it as a plain Identifier.\n */\nexport function specializeKeyword(value: string): number {\n if (CHART_TYPES.has(value)) return ChartType;\n if (value === TAG_KEYWORD) return TagKeyword;\n if (DIRECTIVE_KEYWORDS.has(value)) return DirectiveKeyword;\n if (CONTROL_KEYWORDS.has(value)) return ControlKeyword;\n if (STATUS_KEYWORDS.has(value)) return ModifierKeyword;\n if (MODIFIER_KEYWORDS.has(value)) return ModifierKeyword;\n return -1;\n}\n"],"mappings":"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","names":[]}