@diagrammo/dgmo 0.45.0 → 0.47.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (250) hide show
  1. package/dist/advanced.cjs +31 -25
  2. package/dist/advanced.d.cts +3 -855
  3. package/dist/advanced.d.ts +3 -855
  4. package/dist/advanced.js +541 -70101
  5. package/dist/analyzer-UYKBXAKR.js +15 -0
  6. package/dist/auto.cjs +500 -341
  7. package/dist/auto.css +342 -159
  8. package/dist/auto.d.cts +10 -8
  9. package/dist/auto.d.ts +10 -8
  10. package/dist/auto.js +373 -265
  11. package/dist/auto.mjs +500 -341
  12. package/dist/block.cjs +31 -25
  13. package/dist/block.js +83 -69411
  14. package/dist/calculator-LDYQCDDY.js +11 -0
  15. package/dist/charts-d3-QOZHKTCT.js +25 -0
  16. package/dist/chunk-2DXMZRWJ.js +800 -0
  17. package/dist/chunk-2LACINWN.js +786 -0
  18. package/dist/chunk-33LCUH4H.js +893 -0
  19. package/dist/chunk-3CIOJ5YJ.js +35 -0
  20. package/dist/chunk-3HDBAXF5.js +86 -0
  21. package/dist/chunk-3JLKYGBQ.js +290 -0
  22. package/dist/chunk-3MQQNXPD.js +415 -0
  23. package/dist/chunk-3R5POCTZ.js +967 -0
  24. package/dist/chunk-3SMGIJDD.js +112 -0
  25. package/dist/chunk-44CM72SQ.js +409 -0
  26. package/dist/chunk-4GRI7MEB.js +1604 -0
  27. package/dist/chunk-4OHACBGX.js +606 -0
  28. package/dist/chunk-5DH3KYFH.js +21 -0
  29. package/dist/chunk-5MLYVTYM.js +76 -0
  30. package/dist/chunk-5QXL4NYS.js +553 -0
  31. package/dist/chunk-5WRI5ZAA.js +31 -0
  32. package/dist/chunk-6EK55ART.js +117 -0
  33. package/dist/chunk-6FZYCKXB.js +2065 -0
  34. package/dist/chunk-6HO5ZTXK.js +277 -0
  35. package/dist/chunk-6KFWC4CO.js +7 -0
  36. package/dist/chunk-6MTWIQVO.js +121 -0
  37. package/dist/chunk-6NYWYNBI.js +329 -0
  38. package/dist/chunk-6SM5NJQH.js +620 -0
  39. package/dist/chunk-725LDASD.js +422 -0
  40. package/dist/chunk-76OWZ3BA.js +130 -0
  41. package/dist/chunk-7JEGTRLD.js +338 -0
  42. package/dist/chunk-A44USUV7.js +923 -0
  43. package/dist/chunk-A4GOY3PE.js +25 -0
  44. package/dist/chunk-A4VFQH5G.js +251 -0
  45. package/dist/chunk-AELOBFW5.js +375 -0
  46. package/dist/chunk-AN2MOO5T.js +522 -0
  47. package/dist/chunk-BMR4CIEO.js +41 -0
  48. package/dist/chunk-BS7SV7C3.js +51 -0
  49. package/dist/chunk-BUPDIHML.js +613 -0
  50. package/dist/chunk-BUVJFRPY.js +887 -0
  51. package/dist/chunk-C3Z4DX3V.js +112 -0
  52. package/dist/chunk-CI2G3OEB.js +1818 -0
  53. package/dist/chunk-CKNVO24D.js +54 -0
  54. package/dist/chunk-CUVHQHZ7.js +391 -0
  55. package/dist/chunk-CXK4DZH3.js +114 -0
  56. package/dist/chunk-DKEPS5LH.js +315 -0
  57. package/dist/chunk-DU7W62N5.js +487 -0
  58. package/dist/chunk-DZAQBW35.js +751 -0
  59. package/dist/chunk-EB6FPQUP.js +316 -0
  60. package/dist/chunk-EMS2SK26.js +376 -0
  61. package/dist/chunk-ERLBPDGU.js +510 -0
  62. package/dist/chunk-EVCVDTXE.js +732 -0
  63. package/dist/chunk-FCIIHT24.js +384 -0
  64. package/dist/chunk-FFUN5D66.js +97 -0
  65. package/dist/chunk-FITOLXSX.js +714 -0
  66. package/dist/chunk-FMDSF3OV.js +68 -0
  67. package/dist/chunk-FNB3PNGF.js +410 -0
  68. package/dist/chunk-G2H74XJZ.js +2104 -0
  69. package/dist/chunk-GMR5MFHJ.js +339 -0
  70. package/dist/chunk-H6PI3KJT.js +305 -0
  71. package/dist/chunk-I46X5VUA.js +59 -0
  72. package/dist/chunk-I5IGB56C.js +255 -0
  73. package/dist/chunk-IH6ZMVQ5.js +3950 -0
  74. package/dist/chunk-IJZFN3HM.js +463 -0
  75. package/dist/chunk-IPWPWM6R.js +3079 -0
  76. package/dist/chunk-IYULMRBE.js +23 -0
  77. package/dist/chunk-IZMRON6C.js +167 -0
  78. package/dist/chunk-J5FIXQRT.js +813 -0
  79. package/dist/chunk-JED6ZDEE.js +73 -0
  80. package/dist/chunk-JEUJOX5X.js +136 -0
  81. package/dist/chunk-JM4LEPY3.js +436 -0
  82. package/dist/chunk-L3UHP6TD.js +101 -0
  83. package/dist/chunk-L66GEFB6.js +524 -0
  84. package/dist/chunk-LIOHW36Z.js +469 -0
  85. package/dist/chunk-LP7EC4MI.js +16 -0
  86. package/dist/chunk-MITI6NOL.js +548 -0
  87. package/dist/chunk-MO5YHHMQ.js +168 -0
  88. package/dist/chunk-MZSBFAPJ.js +885 -0
  89. package/dist/chunk-NNAAJVBU.js +9 -0
  90. package/dist/chunk-NOTA6TEI.js +47 -0
  91. package/dist/chunk-NURGB5Z4.js +335 -0
  92. package/dist/chunk-NX4EQS3U.js +1062 -0
  93. package/dist/chunk-NXMESY4J.js +1 -0
  94. package/dist/chunk-OJR3MQYV.js +1458 -0
  95. package/dist/chunk-OURHMODR.js +454 -0
  96. package/dist/chunk-P235SVAH.js +1057 -0
  97. package/dist/chunk-P4RH4OSP.js +1038 -0
  98. package/dist/chunk-P6T66CCZ.js +226 -0
  99. package/dist/chunk-PBAHEPLQ.js +223 -0
  100. package/dist/chunk-PBHE5UG6.js +1530 -0
  101. package/dist/chunk-PDKUANDZ.js +35 -0
  102. package/dist/chunk-PWIHZ6NJ.js +296 -0
  103. package/dist/chunk-QEBUY5NY.js +1685 -0
  104. package/dist/chunk-QLCCJEJI.js +253 -0
  105. package/dist/chunk-QOOUC2J5.js +52 -0
  106. package/dist/chunk-QYTPPDAO.js +402 -0
  107. package/dist/chunk-R3XI2VC7.js +801 -0
  108. package/dist/chunk-RCERWOJR.js +154 -0
  109. package/dist/chunk-RJE5JTVK.js +362 -0
  110. package/dist/chunk-RTLBSQ3G.js +1155 -0
  111. package/dist/chunk-RUNNI6VE.js +448 -0
  112. package/dist/chunk-RVMRZAPB.js +354 -0
  113. package/dist/chunk-RYEGFMUO.js +955 -0
  114. package/dist/chunk-RZCF2VVM.js +528 -0
  115. package/dist/chunk-SML67VPV.js +1025 -0
  116. package/dist/chunk-SQ7IY53Q.js +44 -0
  117. package/dist/chunk-SQAG3UXH.js +161 -0
  118. package/dist/chunk-SRTU6HMQ.js +1851 -0
  119. package/dist/chunk-T2OE3YQB.js +550 -0
  120. package/dist/chunk-T3UBLACL.js +299 -0
  121. package/dist/chunk-TLVIHFRO.js +296 -0
  122. package/dist/chunk-TYS6CSS5.js +52 -0
  123. package/dist/chunk-U6EQI3U6.js +130 -0
  124. package/dist/chunk-UJ4FJLBF.js +86 -0
  125. package/dist/chunk-ULOEATBZ.js +347 -0
  126. package/dist/chunk-UNCCZ3NU.js +127 -0
  127. package/dist/chunk-USZW2HHU.js +197 -0
  128. package/dist/chunk-UWN33VNX.js +1610 -0
  129. package/dist/chunk-UZ7EZW3B.js +40 -0
  130. package/dist/chunk-VOKGH627.js +37 -0
  131. package/dist/chunk-WBRZJOEC.js +204 -0
  132. package/dist/chunk-WCSOJFU3.js +380 -0
  133. package/dist/chunk-WCT3NYCV.js +160 -0
  134. package/dist/chunk-WVAJFAIA.js +529 -0
  135. package/dist/chunk-X5LCYCL5.js +394 -0
  136. package/dist/chunk-XAKEUMEJ.js +1256 -0
  137. package/dist/chunk-Y2ZE3MSG.js +590 -0
  138. package/dist/chunk-Y3J7VR52.js +646 -0
  139. package/dist/chunk-Y5QGVTVC.js +33 -0
  140. package/dist/chunk-YAA6IID3.js +548 -0
  141. package/dist/chunk-YGJTDXVR.js +692 -0
  142. package/dist/chunk-YRYKTYMQ.js +186 -0
  143. package/dist/chunk-YYVTBZZC.js +61 -0
  144. package/dist/chunk-Z5CGSFJB.js +647 -0
  145. package/dist/chunk-Z72XRXD4.js +787 -0
  146. package/dist/chunk-ZGR7ULFJ.js +978 -0
  147. package/dist/chunk-ZJEL4H2R.js +851 -0
  148. package/dist/chunk-ZO27FGJS.js +554 -0
  149. package/dist/cli.cjs +112 -112
  150. package/dist/collapse-CLPJD2RL.js +11 -0
  151. package/dist/collapse-SLINJQW6.js +9 -0
  152. package/dist/collapse-ZWUFFCK2.js +9 -0
  153. package/dist/compute-G55RG53N.js +8 -0
  154. package/dist/dgmo-router-DZCIDUO5.js +73 -0
  155. package/dist/dimensions-J3FHIMJ6.js +22 -0
  156. package/dist/element.cjs +492 -325
  157. package/dist/element.js +367 -259
  158. package/dist/element.mjs +492 -325
  159. package/dist/flowchart-parser-ZNSKIBVR.js +21 -0
  160. package/dist/flowchart-renderer-ZAEOL4DX.js +35 -0
  161. package/dist/index.cjs +34 -28
  162. package/dist/index.d.cts +3 -469
  163. package/dist/index.d.ts +3 -469
  164. package/dist/index.js +137 -69679
  165. package/dist/layout-46N4JJYK.js +17 -0
  166. package/dist/layout-5RA6QWR6.js +26 -0
  167. package/dist/layout-5T6RH5M6.js +14 -0
  168. package/dist/layout-7QXCNOVS.js +13 -0
  169. package/dist/layout-EE6GE46Y.js +17 -0
  170. package/dist/layout-G23F7LDH.js +9 -0
  171. package/dist/layout-HRBZPFCN.js +23 -0
  172. package/dist/layout-HWDSRX5E.js +20 -0
  173. package/dist/layout-HYZPWAK5.js +18 -0
  174. package/dist/layout-N76NR4ZO.js +19 -0
  175. package/dist/layout-OB3RI63S.js +14 -0
  176. package/dist/layout-S2QBYSK2.js +15 -0
  177. package/dist/layout-UM5F4DJB.js +15 -0
  178. package/dist/layout-search-OYV77HHS.js +1655 -0
  179. package/dist/load-data-EHDDZ5ZS.js +8 -0
  180. package/dist/palettes-PRJ2RI6D.js +56 -0
  181. package/dist/parser-2MFP2H2E.js +11 -0
  182. package/dist/parser-3STE62GB.js +21 -0
  183. package/dist/parser-4FL2CMDG.js +18 -0
  184. package/dist/parser-4OGOBJJ4.js +13 -0
  185. package/dist/parser-6BTRLKRZ.js +15 -0
  186. package/dist/parser-AQETEVRW.js +21 -0
  187. package/dist/parser-CFZD5IBL.js +12 -0
  188. package/dist/parser-FUSKFGZN.js +16 -0
  189. package/dist/parser-I6KXEYFK.js +13 -0
  190. package/dist/parser-IXSZZQHY.js +18 -0
  191. package/dist/parser-JAL2HD4I.js +13 -0
  192. package/dist/parser-KNSQSKQO.js +20 -0
  193. package/dist/parser-N5O4IHUN.js +13 -0
  194. package/dist/parser-NGU3ETO6.js +16 -0
  195. package/dist/parser-NRAI6O25.js +19 -0
  196. package/dist/parser-O5J4VBII.js +11 -0
  197. package/dist/parser-OV7NOBW6.js +21 -0
  198. package/dist/parser-PQ3POX45.js +23 -0
  199. package/dist/parser-TFZFBVWN.js +11 -0
  200. package/dist/parser-TRTHDFPP.js +18 -0
  201. package/dist/parser-VQP2UJ6W.js +11 -0
  202. package/dist/parser-XDVELHRK.js +13 -0
  203. package/dist/parser-XKRP7QKP.js +11 -0
  204. package/dist/parser-Y6WTBU76.js +14 -0
  205. package/dist/parser-ZSDPZYQP.js +12 -0
  206. package/dist/renderer-2XQQQ6QR.js +28 -0
  207. package/dist/renderer-5NDVNDAZ.js +26 -0
  208. package/dist/renderer-6EEZHMH4.js +26 -0
  209. package/dist/renderer-6W5462RB.js +43 -0
  210. package/dist/renderer-7MVLWWQD.js +22 -0
  211. package/dist/renderer-AWWAF6XD.js +33 -0
  212. package/dist/renderer-BYCNMBF7.js +34 -0
  213. package/dist/renderer-CLJHQPBJ.js +29 -0
  214. package/dist/renderer-GHPZMFU2.js +15 -0
  215. package/dist/renderer-JGBKUCZD.js +16 -0
  216. package/dist/renderer-KQB7UGDS.js +19 -0
  217. package/dist/renderer-PGX2TKVS.js +24 -0
  218. package/dist/renderer-QIWVHWZO.js +15 -0
  219. package/dist/renderer-RPOA5YPZ.js +35 -0
  220. package/dist/renderer-SMIBCRVB.js +24 -0
  221. package/dist/renderer-T7YKC5VP.js +28 -0
  222. package/dist/renderer-TOCOVLHS.js +37 -0
  223. package/dist/renderer-UWA5XS74.js +39 -0
  224. package/dist/renderer-VACVQYML.js +25 -0
  225. package/dist/renderer-W4M6QLIJ.js +37 -0
  226. package/dist/renderer-WZRREQ2P.js +23 -0
  227. package/dist/renderer-YY2OSF6E.js +27 -0
  228. package/dist/renderer-Z7I3W2PP.js +24 -0
  229. package/dist/renderer-ZGNTUWC4.js +22 -0
  230. package/dist/renderer-ZTR3DER3.js +19 -0
  231. package/dist/renderer-radial-C32GPJQ7.js +21 -0
  232. package/dist/resolver-NOAA7ID7.js +13 -0
  233. package/dist/state-collapse-HCGD6IVJ.js +8 -0
  234. package/dist/state-parser-Z2V23ATR.js +18 -0
  235. package/dist/state-renderer-RFYHSP4K.js +34 -0
  236. package/dist/themes-1-CuKpeH.d.cts +908 -0
  237. package/dist/themes-1-CuKpeH.d.ts +908 -0
  238. package/package.json +1 -1
  239. package/src/auto/index.ts +55 -57
  240. package/src/auto/shared.ts +142 -142
  241. package/src/auto/styles.ts +44 -199
  242. package/src/c4/renderer.ts +2 -2
  243. package/src/element/index.ts +29 -21
  244. package/src/infra/renderer.ts +1 -1
  245. package/src/render.ts +34 -14
  246. package/src/sitemap/renderer.ts +1 -1
  247. package/src/timeline/renderer.ts +1 -1
  248. package/src/utils/hover-styles.ts +6 -1
  249. package/src/utils/legend-d3.ts +1 -4
  250. package/src/utils/legend-svg.ts +1 -1
@@ -0,0 +1,339 @@
1
+ import {
2
+ TIMELINE_REGISTRY,
3
+ splitNameAndMeta,
4
+ warnUnknownMetaKeys,
5
+ withTagAliases
6
+ } from "./chunk-Y3J7VR52.js";
7
+ import {
8
+ makeDgmoError
9
+ } from "./chunk-CXK4DZH3.js";
10
+
11
+ // src/timeline/parser.ts
12
+ var TIMELINE_DURATION_RE = /^(\d+(?:\.\d{1,2})?)(min|[dwmyhs])(\?)?$/;
13
+ var DATE_RE = /^(\d{4}(?:-\d{2}(?:-\d{2})?)?)/;
14
+ var TIME_RE = /^\s+(\d{1,2}:\d{2}(?::\d{2})?)/;
15
+ var ARROW_RE = /^\s*(?:->|–>)\s*/;
16
+ var ERA_DATE_RE = /^(\d{1,4}(?:-\d{2}(?:-\d{2})?)?)\s+(BCE|BC|CE|AD)\b/i;
17
+ function parseTime(timeStr) {
18
+ const [hStr, mStr, sStr] = timeStr.split(":");
19
+ const h = parseInt(hStr, 10);
20
+ const m = parseInt(mStr, 10);
21
+ const s = sStr !== void 0 ? parseInt(sStr, 10) : 0;
22
+ const valid = h >= 0 && h <= 23 && m >= 0 && m <= 59 && s >= 0 && s <= 59;
23
+ return { valid, h, m, s };
24
+ }
25
+ function parseDateWithOptionalTime(input) {
26
+ const eraMatch = input.match(ERA_DATE_RE);
27
+ if (eraMatch) {
28
+ const marker = eraMatch[2].toUpperCase();
29
+ const bce = marker === "BCE" || marker === "BC";
30
+ const date2 = (bce ? "-" : "") + eraMatch[1];
31
+ return {
32
+ date: date2,
33
+ rest: input.slice(eraMatch[0].length),
34
+ timeValid: true,
35
+ invalidTime: void 0
36
+ };
37
+ }
38
+ const dateMatch = input.match(DATE_RE);
39
+ if (!dateMatch) return null;
40
+ let date = dateMatch[1];
41
+ let rest = input.slice(date.length);
42
+ let timeValid = true;
43
+ let invalidTime;
44
+ const timeMatch = rest.match(TIME_RE);
45
+ if (timeMatch) {
46
+ const timeStr = timeMatch[1];
47
+ const { valid } = parseTime(timeStr);
48
+ timeValid = valid;
49
+ if (!valid) invalidTime = timeStr;
50
+ date = `${date} ${timeStr}`;
51
+ rest = rest.slice(timeMatch[0].length);
52
+ }
53
+ return { date, rest, timeValid, invalidTime };
54
+ }
55
+ function extractDatePrefix(line) {
56
+ const startResult = parseDateWithOptionalTime(line);
57
+ if (!startResult) return null;
58
+ const { date: startDate } = startResult;
59
+ let { rest } = startResult;
60
+ const arrowMatch = rest.match(ARROW_RE);
61
+ if (arrowMatch) {
62
+ rest = rest.slice(arrowMatch[0].length);
63
+ const endResult = parseDateWithOptionalTime(rest);
64
+ if (endResult) {
65
+ let uncertain = false;
66
+ let afterEnd = endResult.rest;
67
+ if (afterEnd.startsWith("?")) {
68
+ uncertain = true;
69
+ afterEnd = afterEnd.slice(1);
70
+ }
71
+ const remainder2 = afterEnd.trimStart();
72
+ return {
73
+ startDate,
74
+ endDate: endResult.date,
75
+ uncertain,
76
+ remainder: remainder2,
77
+ startTimeValid: startResult.timeValid,
78
+ endTimeValid: endResult.timeValid,
79
+ invalidStartTime: startResult.invalidTime,
80
+ invalidEndTime: endResult.invalidTime
81
+ };
82
+ }
83
+ return null;
84
+ }
85
+ const remainder = rest.trimStart();
86
+ if (!remainder) {
87
+ return {
88
+ startDate,
89
+ endDate: null,
90
+ uncertain: false,
91
+ remainder: "",
92
+ startTimeValid: startResult.timeValid,
93
+ endTimeValid: true,
94
+ invalidStartTime: startResult.invalidTime,
95
+ invalidEndTime: void 0
96
+ };
97
+ }
98
+ return {
99
+ startDate,
100
+ endDate: null,
101
+ uncertain: false,
102
+ remainder,
103
+ startTimeValid: startResult.timeValid,
104
+ endTimeValid: true,
105
+ invalidStartTime: startResult.invalidTime,
106
+ invalidEndTime: void 0
107
+ };
108
+ }
109
+ function splitDateParts(input) {
110
+ let s = input;
111
+ let sign = 1;
112
+ if (s.startsWith("-")) {
113
+ sign = -1;
114
+ s = s.slice(1);
115
+ }
116
+ const spaceIdx = s.indexOf(" ");
117
+ let datePart = s;
118
+ let hour = 0;
119
+ let minute = 0;
120
+ let second = 0;
121
+ let hasTime = false;
122
+ if (spaceIdx !== -1) {
123
+ datePart = s.slice(0, spaceIdx);
124
+ const tp = s.slice(spaceIdx + 1).split(":");
125
+ if (tp.length >= 2) {
126
+ hasTime = true;
127
+ hour = parseInt(tp[0], 10) || 0;
128
+ minute = parseInt(tp[1], 10) || 0;
129
+ second = tp.length >= 3 ? parseInt(tp[2], 10) || 0 : 0;
130
+ }
131
+ }
132
+ const parts = datePart.split("-").map((p) => parseInt(p, 10));
133
+ const granularity = parts.length >= 3 ? 3 : parts.length === 2 ? 2 : 1;
134
+ return {
135
+ sign,
136
+ year: parts[0],
137
+ month: parts.length >= 2 ? parts[1] : 1,
138
+ day: parts.length >= 3 ? parts[2] : 1,
139
+ hour,
140
+ minute,
141
+ second,
142
+ granularity,
143
+ hasTime
144
+ };
145
+ }
146
+ function addDurationToDate(startDate, amount, unit) {
147
+ const p = splitDateParts(startDate);
148
+ const signedYear = p.sign * p.year;
149
+ const date = new Date(2e3, p.month - 1, p.day, p.hour, p.minute, p.second);
150
+ date.setFullYear(signedYear);
151
+ switch (unit) {
152
+ case "d":
153
+ date.setDate(date.getDate() + Math.round(amount));
154
+ break;
155
+ case "w":
156
+ date.setDate(date.getDate() + Math.round(amount * 7));
157
+ break;
158
+ case "m": {
159
+ const wholeMonths = Math.floor(amount);
160
+ const fractionalDays = Math.round((amount - wholeMonths) * 30);
161
+ date.setMonth(date.getMonth() + wholeMonths);
162
+ if (fractionalDays > 0) {
163
+ date.setDate(date.getDate() + fractionalDays);
164
+ }
165
+ break;
166
+ }
167
+ case "y": {
168
+ const wholeYears = Math.floor(amount);
169
+ const fractionalMonths = Math.round((amount - wholeYears) * 12);
170
+ date.setFullYear(date.getFullYear() + wholeYears);
171
+ if (fractionalMonths > 0) {
172
+ date.setMonth(date.getMonth() + fractionalMonths);
173
+ }
174
+ break;
175
+ }
176
+ case "h":
177
+ date.setTime(date.getTime() + amount * 36e5);
178
+ break;
179
+ case "min":
180
+ date.setTime(date.getTime() + amount * 6e4);
181
+ break;
182
+ case "s":
183
+ date.setTime(date.getTime() + amount * 1e3);
184
+ break;
185
+ }
186
+ const outYear = date.getFullYear();
187
+ const neg = outYear < 0 ? "-" : "";
188
+ const endYear = Math.abs(outYear);
189
+ const endMonth = String(date.getMonth() + 1).padStart(2, "0");
190
+ const endDay = String(date.getDate()).padStart(2, "0");
191
+ const endHour = String(date.getHours()).padStart(2, "0");
192
+ const endMinute = String(date.getMinutes()).padStart(2, "0");
193
+ const endSecond = String(date.getSeconds()).padStart(2, "0");
194
+ const hasTime = unit === "h" || unit === "min" || unit === "s" || p.hasTime;
195
+ const showSeconds = unit === "s" || p.second !== 0 || date.getSeconds() !== 0;
196
+ if (p.granularity === 1) {
197
+ return `${neg}${endYear}`;
198
+ } else if (p.granularity === 2) {
199
+ return `${neg}${endYear}-${endMonth}`;
200
+ } else if (hasTime && (date.getHours() !== 0 || date.getMinutes() !== 0 || date.getSeconds() !== 0)) {
201
+ const time = showSeconds ? `${endHour}:${endMinute}:${endSecond}` : `${endHour}:${endMinute}`;
202
+ return `${neg}${endYear}-${endMonth}-${endDay} ${time}`;
203
+ } else {
204
+ return `${neg}${endYear}-${endMonth}-${endDay}`;
205
+ }
206
+ }
207
+ function parseTimelineDate(s) {
208
+ const p = splitDateParts(s);
209
+ const yearBase = p.sign * p.year;
210
+ return yearBase + (p.month - 1) / 12 + (p.day - 1) / 365 + p.hour / 8760 + p.minute / 525600 + p.second / 31536e3;
211
+ }
212
+ function parseTimelineEventLine(line, lineNumber, currentGroup, groupMetadata, aliasMap, registry) {
213
+ const diagnostics = [];
214
+ const prefix = extractDatePrefix(line);
215
+ if (!prefix) {
216
+ if (/^\d/.test(line)) {
217
+ const firstToken = line.split(/\s/)[0];
218
+ if (!/^\d{4}(?:-\d{2}(?:-\d{2})?)?$/.test(firstToken)) {
219
+ diagnostics.push(
220
+ makeDgmoError(
221
+ lineNumber,
222
+ `Expected date format YYYY, YYYY-MM, or YYYY-MM-DD. Got '${firstToken}'.`,
223
+ "warning"
224
+ )
225
+ );
226
+ return { event: null, diagnostics };
227
+ }
228
+ }
229
+ return null;
230
+ }
231
+ if (!prefix.startTimeValid && prefix.invalidStartTime) {
232
+ diagnostics.push(
233
+ makeDgmoError(
234
+ lineNumber,
235
+ `Invalid time '${prefix.invalidStartTime}'. Hours must be 0-23, minutes 0-59.`,
236
+ "warning"
237
+ )
238
+ );
239
+ }
240
+ if (!prefix.endTimeValid && prefix.invalidEndTime) {
241
+ diagnostics.push(
242
+ makeDgmoError(
243
+ lineNumber,
244
+ `Invalid time '${prefix.invalidEndTime}'. Hours must be 0-23, minutes 0-59.`,
245
+ "warning"
246
+ )
247
+ );
248
+ }
249
+ if (!prefix.remainder) {
250
+ diagnostics.push(
251
+ makeDgmoError(lineNumber, "Event needs a name after the date.", "warning")
252
+ );
253
+ return { event: null, diagnostics };
254
+ }
255
+ const tlRegistry = registry ?? withTagAliases(
256
+ TIMELINE_REGISTRY,
257
+ /* @__PURE__ */ new Set([...aliasMap.keys(), ...aliasMap.values()])
258
+ );
259
+ const split = splitNameAndMeta(prefix.remainder, tlRegistry, aliasMap);
260
+ warnUnknownMetaKeys(
261
+ split.meta,
262
+ tlRegistry,
263
+ (msg) => diagnostics.push(makeDgmoError(lineNumber, msg, "warning"))
264
+ );
265
+ const name = split.name;
266
+ let endDate = prefix.endDate;
267
+ let uncertain = prefix.uncertain;
268
+ const metadata = { ...split.meta };
269
+ let duration = null;
270
+ if (metadata["duration"]) {
271
+ const durStr = metadata["duration"];
272
+ const uncertainMatch = durStr.match(/^(.+)\?$/);
273
+ const cleanDur = uncertainMatch ? uncertainMatch[1] : durStr;
274
+ if (uncertainMatch) uncertain = true;
275
+ const durMatch = cleanDur.match(TIMELINE_DURATION_RE);
276
+ if (durMatch) {
277
+ duration = {
278
+ amount: parseFloat(durMatch[1]),
279
+ unit: durMatch[2]
280
+ };
281
+ } else {
282
+ diagnostics.push(
283
+ makeDgmoError(
284
+ lineNumber,
285
+ `Invalid duration '${durStr}'. Expected format like "30d", "2w", "1.5m", "1y", "2h", "30min", "45s".`,
286
+ "warning"
287
+ )
288
+ );
289
+ }
290
+ delete metadata["duration"];
291
+ }
292
+ if (endDate && duration) {
293
+ diagnostics.push(
294
+ makeDgmoError(
295
+ lineNumber,
296
+ "Event has both an end date and duration. End date takes precedence.",
297
+ "warning"
298
+ )
299
+ );
300
+ }
301
+ if (!endDate && duration) {
302
+ endDate = addDurationToDate(
303
+ prefix.startDate,
304
+ duration.amount,
305
+ duration.unit
306
+ );
307
+ }
308
+ let label = name;
309
+ if (split.color !== void 0) {
310
+ label = `${label} ${split.color}`;
311
+ }
312
+ const mergedMetadata = {
313
+ ...groupMetadata,
314
+ ...metadata
315
+ };
316
+ if (split.color) {
317
+ mergedMetadata["color"] = split.color;
318
+ }
319
+ const eventMeta = { ...mergedMetadata };
320
+ if (split.color) delete eventMeta["color"];
321
+ const event = {
322
+ date: prefix.startDate,
323
+ endDate,
324
+ label,
325
+ group: currentGroup,
326
+ metadata: eventMeta,
327
+ lineNumber,
328
+ ...uncertain ? { uncertain: true } : {}
329
+ };
330
+ return { event, diagnostics };
331
+ }
332
+
333
+ export {
334
+ extractDatePrefix,
335
+ addDurationToDate,
336
+ parseTimelineDate,
337
+ parseTimelineEventLine
338
+ };
339
+ //# sourceMappingURL=chunk-GMR5MFHJ.js.map
@@ -0,0 +1,305 @@
1
+ import {
2
+ measureText
3
+ } from "./chunk-WCT3NYCV.js";
4
+
5
+ // src/wireframe/layout.ts
6
+ var DESKTOP_WIDTH = 1200;
7
+ var MOBILE_WIDTH = 375;
8
+ var LABEL_PADDING = 16;
9
+ var LABEL_FIELD_FONT_SIZE = 13;
10
+ var ELEMENT_HEIGHTS = {
11
+ textInput: 36,
12
+ button: 40,
13
+ dropdown: 36,
14
+ checkbox: 24,
15
+ radio: 24,
16
+ heading: 48,
17
+ subheading: 36,
18
+ divider: 24,
19
+ text: 22,
20
+ listItem: 24,
21
+ image: 120,
22
+ progress: 28,
23
+ chart: 160,
24
+ alert: 40,
25
+ nav: 44,
26
+ tabs: 44
27
+ };
28
+ var SPACING_AFTER = {
29
+ heading: 16,
30
+ subheading: 12,
31
+ divider: 12,
32
+ textInput: 8,
33
+ dropdown: 8,
34
+ checkbox: 8,
35
+ radio: 8,
36
+ button: 8,
37
+ text: 12,
38
+ listItem: 4,
39
+ group: 16,
40
+ image: 12,
41
+ progress: 12,
42
+ chart: 16,
43
+ alert: 12,
44
+ nav: 12,
45
+ tabs: 12,
46
+ table: 16
47
+ };
48
+ var GROUP_PADDING_TOP_WITH_LABEL = 32;
49
+ var GROUP_PADDING_TOP_NO_LABEL = 10;
50
+ var GROUP_PADDING_BOTTOM = 12;
51
+ var GROUP_PADDING_TOP = GROUP_PADDING_TOP_WITH_LABEL;
52
+ var GROUP_PADDING_X = 12;
53
+ var FRAME_PADDING = 20;
54
+ var TITLE_HEIGHT = 40;
55
+ var REGION_SIZES = {
56
+ sidebar: 0.25,
57
+ side: 0.25,
58
+ left: 0.25,
59
+ right: 0.25,
60
+ main: 0,
61
+ // fill remaining
62
+ content: 0,
63
+ // fill remaining
64
+ center: 0
65
+ // fill remaining
66
+ };
67
+ var FULL_WIDTH_REGIONS = /* @__PURE__ */ new Set(["header", "top", "footer", "bottom"]);
68
+ var HEADER_REGION_HEIGHT = 60;
69
+ var FOOTER_REGION_HEIGHT = 40;
70
+ function layoutWireframe(parsed, _options, overrideWidth, showGroupLabels = true) {
71
+ GROUP_PADDING_TOP = showGroupLabels ? GROUP_PADDING_TOP_WITH_LABEL : GROUP_PADDING_TOP_NO_LABEL;
72
+ const defaultWidth = parsed.formFactor === "mobile" ? MOBILE_WIDTH : DESKTOP_WIDTH;
73
+ const frameWidth = overrideWidth ?? defaultWidth;
74
+ const titleHeight = parsed.title && parsed.options["no-title"] !== "on" ? TITLE_HEIGHT : 0;
75
+ const contentWidth = frameWidth - FRAME_PADDING * 2;
76
+ const nodes = layoutTopLevel(parsed.roots, contentWidth, parsed.formFactor);
77
+ let maxY = 0;
78
+ for (const n of nodes) {
79
+ maxY = Math.max(maxY, n.y + n.height);
80
+ }
81
+ const modalNodes = [];
82
+ let modalY = maxY + 24;
83
+ for (const modal of parsed.modals) {
84
+ const modalWidth = Math.min(contentWidth * 0.7, 600);
85
+ const modalX = (contentWidth - modalWidth) / 2;
86
+ const node = layoutElement(modal, modalX, modalY, modalWidth);
87
+ modalNodes.push(node);
88
+ modalY += node.height + 24;
89
+ }
90
+ const totalHeight = (modalNodes.length > 0 ? (
91
+ // In-bounds by length-check above.
92
+ modalNodes[modalNodes.length - 1].y + modalNodes[modalNodes.length - 1].height
93
+ ) : maxY) + FRAME_PADDING * 2 + titleHeight;
94
+ return {
95
+ width: frameWidth,
96
+ height: totalHeight,
97
+ titleHeight,
98
+ nodes,
99
+ modalNodes
100
+ };
101
+ }
102
+ function layoutTopLevel(roots, contentWidth, formFactor) {
103
+ const result = [];
104
+ let y = 0;
105
+ const rows = [];
106
+ let currentRow = [];
107
+ for (const root of roots) {
108
+ const regionName = root.label.toLowerCase().split(/\s+/)[0];
109
+ if (FULL_WIDTH_REGIONS.has(regionName) || formFactor === "mobile") {
110
+ if (currentRow.length > 0) {
111
+ rows.push(currentRow);
112
+ currentRow = [];
113
+ }
114
+ rows.push([root]);
115
+ } else {
116
+ currentRow.push(root);
117
+ }
118
+ }
119
+ if (currentRow.length > 0) rows.push(currentRow);
120
+ for (const row of rows) {
121
+ if (row.length === 1 && formFactor !== "mobile") {
122
+ const el = row[0];
123
+ const regionName = el.label.toLowerCase().split(/\s+/)[0];
124
+ if (FULL_WIDTH_REGIONS.has(regionName)) {
125
+ const node = layoutElement(el, 0, y, contentWidth);
126
+ if (regionName === "header" || regionName === "top") {
127
+ node.height = Math.max(node.height, HEADER_REGION_HEIGHT);
128
+ } else {
129
+ node.height = Math.max(node.height, FOOTER_REGION_HEIGHT);
130
+ }
131
+ result.push(node);
132
+ y += node.height + 16;
133
+ continue;
134
+ }
135
+ }
136
+ if (formFactor === "mobile" || row.length === 1) {
137
+ for (const el of row) {
138
+ const node = layoutElement(el, 0, y, contentWidth);
139
+ result.push(node);
140
+ y += node.height + 16;
141
+ }
142
+ } else {
143
+ const allocated = allocateHorizontalWidths(row, contentWidth);
144
+ let x = 0;
145
+ let maxHeight = 0;
146
+ const rowNodes = [];
147
+ for (let i = 0; i < row.length; i++) {
148
+ const w = allocated[i];
149
+ const node = layoutElement(row[i], x, y, w);
150
+ rowNodes.push(node);
151
+ maxHeight = Math.max(maxHeight, node.height);
152
+ x += w + 12;
153
+ }
154
+ for (const n of rowNodes) {
155
+ n.height = maxHeight;
156
+ }
157
+ result.push(...rowNodes);
158
+ y += maxHeight + 16;
159
+ }
160
+ }
161
+ return result;
162
+ }
163
+ function allocateHorizontalWidths(elements, totalWidth) {
164
+ const gap = 12;
165
+ const totalGaps = (elements.length - 1) * gap;
166
+ const available = totalWidth - totalGaps;
167
+ const widths = new Array(elements.length).fill(0);
168
+ let allocated = 0;
169
+ let fillCount = 0;
170
+ for (let i = 0; i < elements.length; i++) {
171
+ const name = elements[i].label.toLowerCase().split(/\s+/)[0];
172
+ const fraction = REGION_SIZES[name];
173
+ if (fraction !== void 0 && fraction > 0) {
174
+ widths[i] = available * fraction;
175
+ allocated += widths[i];
176
+ } else if (fraction === 0) {
177
+ fillCount++;
178
+ } else {
179
+ fillCount++;
180
+ }
181
+ }
182
+ if (fillCount > 0) {
183
+ const remaining = Math.max(0, available - allocated);
184
+ const each = remaining / fillCount;
185
+ for (let i = 0; i < widths.length; i++) {
186
+ if (widths[i] === 0) widths[i] = Math.max(40, each);
187
+ }
188
+ }
189
+ for (let i = 0; i < widths.length; i++) {
190
+ widths[i] = Math.max(40, widths[i]);
191
+ }
192
+ return widths;
193
+ }
194
+ function layoutElement(el, x, y, width) {
195
+ const node = {
196
+ id: el.id,
197
+ x,
198
+ y,
199
+ width,
200
+ height: 0,
201
+ element: el,
202
+ children: []
203
+ };
204
+ const selfRendered = el.type === "nav" || el.type === "tabs";
205
+ if (!el.isContainer || el.children.length === 0 || selfRendered) {
206
+ node.height = getElementHeight(el);
207
+ return node;
208
+ }
209
+ const isInlineRow = el.metadata["_inlineRow"] === "true" || el.metadata["_labelField"] === "true";
210
+ const padTop = isInlineRow ? 0 : GROUP_PADDING_TOP;
211
+ const padBottom = isInlineRow ? 0 : GROUP_PADDING_BOTTOM;
212
+ const padX = isInlineRow ? 0 : GROUP_PADDING_X;
213
+ const innerWidth = width - padX * 2;
214
+ const innerX = padX;
215
+ if (el.orientation === "horizontal") {
216
+ const childWidths = allocateEqualWidths(el.children, innerWidth);
217
+ let cx = innerX;
218
+ let maxChildHeight = 0;
219
+ const horizChildren = [];
220
+ for (let i = 0; i < el.children.length; i++) {
221
+ const child = el.children[i];
222
+ const cw = childWidths[i];
223
+ const childNode = layoutElement(child, cx, padTop, cw);
224
+ horizChildren.push(childNode);
225
+ node.children.push(childNode);
226
+ maxChildHeight = Math.max(maxChildHeight, childNode.height);
227
+ cx += cw + 8;
228
+ }
229
+ for (const cn of horizChildren) {
230
+ cn.height = maxChildHeight;
231
+ }
232
+ node.height = padTop + maxChildHeight + padBottom;
233
+ } else {
234
+ let cy = padTop;
235
+ const fieldAlignX = computeFieldAlignX(el.children);
236
+ if (fieldAlignX > 0) {
237
+ node.fieldAlignX = fieldAlignX;
238
+ }
239
+ for (const child of el.children) {
240
+ const childNode = layoutElement(child, innerX, cy, innerWidth);
241
+ node.children.push(childNode);
242
+ cy += childNode.height + getSpacingAfter(child);
243
+ }
244
+ node.height = cy + padBottom;
245
+ }
246
+ if (el.states.includes("collapsed")) {
247
+ node.height = GROUP_PADDING_TOP;
248
+ node.children = [];
249
+ }
250
+ return node;
251
+ }
252
+ function allocateEqualWidths(children, totalWidth) {
253
+ const gap = 8;
254
+ const totalGaps = (children.length - 1) * gap;
255
+ const each = Math.max(40, (totalWidth - totalGaps) / children.length);
256
+ return children.map(() => each);
257
+ }
258
+ function getElementHeight(el) {
259
+ if (el.type === "heading") {
260
+ return el.headingLevel === 2 ? ELEMENT_HEIGHTS["subheading"] ?? 36 : ELEMENT_HEIGHTS["heading"] ?? 48;
261
+ }
262
+ if (el.type === "textInput" && el.fieldVariant === "textarea") {
263
+ return 80;
264
+ }
265
+ if (el.type === "table") {
266
+ const headerH = 32;
267
+ const rowH = 28;
268
+ const rows = el.tableData?.length || el.tableRows || 0;
269
+ return headerH + rows * rowH + 8;
270
+ }
271
+ if (el.type === "image") {
272
+ if (el.imageHint === "round") return 80;
273
+ if (el.imageHint === "wide") return 80;
274
+ return ELEMENT_HEIGHTS["image"] ?? 120;
275
+ }
276
+ if (el.metadata["_labelField"] === "true") {
277
+ return 36;
278
+ }
279
+ return ELEMENT_HEIGHTS[el.type] ?? 24;
280
+ }
281
+ function getSpacingAfter(el) {
282
+ if (el.type === "heading" && el.headingLevel === 2) {
283
+ return SPACING_AFTER["subheading"] ?? 12;
284
+ }
285
+ return SPACING_AFTER[el.type] ?? 8;
286
+ }
287
+ function computeFieldAlignX(children) {
288
+ let maxLabelWidth = 0;
289
+ let labelFieldCount = 0;
290
+ for (const child of children) {
291
+ if (child.metadata["_labelField"] === "true" && child.children.length >= 2) {
292
+ const labelEl = child.children[0];
293
+ const labelWidth = measureText(labelEl.label, LABEL_FIELD_FONT_SIZE);
294
+ maxLabelWidth = Math.max(maxLabelWidth, labelWidth);
295
+ labelFieldCount++;
296
+ }
297
+ }
298
+ if (labelFieldCount < 2) return 0;
299
+ return maxLabelWidth + LABEL_PADDING;
300
+ }
301
+
302
+ export {
303
+ layoutWireframe
304
+ };
305
+ //# sourceMappingURL=chunk-H6PI3KJT.js.map
@@ -0,0 +1,59 @@
1
+ // src/graph/diagnostics.ts
2
+ var GRAPH_DX = {
3
+ INFRA_NO_ENTRY: {
4
+ // src/infra/parser.ts:1094 — makeDgmoError(..., 'warning', 'W_INFRA_NO_ENTRY')
5
+ code: "W_INFRA_NO_ENTRY",
6
+ severity: "warning",
7
+ chartType: "infra",
8
+ title: "Infra diagram has no entry point",
9
+ message: "Infra diagram has no 'internet' or 'edge' entry point \u2014 an infra diagram traces request traffic from an entry inward, so without one nothing carries traffic. Add an 'internet' or 'edge' node and route from it.",
10
+ hint: "Add an 'internet' or 'edge' node and draw an edge from it into the graph.",
11
+ example: `infra
12
+ gw
13
+ -> svc
14
+ svc
15
+ `
16
+ },
17
+ INFRA_UNREACHABLE: {
18
+ // src/infra/parser.ts:1145 — makeDgmoError(..., 'warning', 'W_INFRA_UNREACHABLE')
19
+ code: "W_INFRA_UNREACHABLE",
20
+ severity: "warning",
21
+ chartType: "infra",
22
+ title: "Infra node is unreachable from an entry",
23
+ message: (p) => `'${String(p.label ?? "")}' is unreachable from an 'internet'/'edge' entry \u2014 no request traffic flows to it, so it's dead on an infra diagram. Connect it downstream of an entry, or remove it.`,
24
+ hint: "Connect the node downstream of an entry, or remove it.",
25
+ example: `infra
26
+
27
+ edge
28
+ rps: 1000
29
+ -> A
30
+
31
+ A
32
+ latency-ms: 10
33
+
34
+ Orphan
35
+ latency-ms: 20
36
+ `
37
+ },
38
+ FLOWCHART_NODE_SUFFIX: {
39
+ // src/graph/flowchart-parser.ts:329 — makeDgmoError(..., 'warning', 'W_FLOWCHART_NODE_SUFFIX')
40
+ code: "W_FLOWCHART_NODE_SUFFIX",
41
+ severity: "warning",
42
+ chartType: "flowchart",
43
+ title: "Unsupported text after a flowchart node shape",
44
+ message: (p) => `Ignored unsupported text after a node shape: "${String(
45
+ p.trailing ?? ""
46
+ )}". Flowcharts have no tag groups or node metadata; node colors are assigned automatically by shape (e.g. terminals green/red, decisions yellow). Remove the suffix.`,
47
+ hint: "Remove the trailing tag/metadata suffix \u2014 flowchart node colors come from shape.",
48
+ example: `flowchart
49
+ (Start) -> (Denied) s: Denied
50
+ `
51
+ }
52
+ };
53
+ var GRAPH_DIAGNOSTICS = Object.values(GRAPH_DX);
54
+
55
+ export {
56
+ GRAPH_DX,
57
+ GRAPH_DIAGNOSTICS
58
+ };
59
+ //# sourceMappingURL=chunk-I46X5VUA.js.map