@diagrammo/dgmo 0.46.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 (232) hide show
  1. package/dist/advanced.d.cts +3 -855
  2. package/dist/advanced.d.ts +3 -855
  3. package/dist/advanced.js +541 -70107
  4. package/dist/analyzer-UYKBXAKR.js +15 -0
  5. package/dist/auto.cjs +1 -1
  6. package/dist/auto.js +1 -1
  7. package/dist/auto.mjs +1 -1
  8. package/dist/block.js +83 -69417
  9. package/dist/calculator-LDYQCDDY.js +11 -0
  10. package/dist/charts-d3-QOZHKTCT.js +25 -0
  11. package/dist/chunk-2DXMZRWJ.js +800 -0
  12. package/dist/chunk-2LACINWN.js +786 -0
  13. package/dist/chunk-33LCUH4H.js +893 -0
  14. package/dist/chunk-3CIOJ5YJ.js +35 -0
  15. package/dist/chunk-3HDBAXF5.js +86 -0
  16. package/dist/chunk-3JLKYGBQ.js +290 -0
  17. package/dist/chunk-3MQQNXPD.js +415 -0
  18. package/dist/chunk-3R5POCTZ.js +967 -0
  19. package/dist/chunk-3SMGIJDD.js +112 -0
  20. package/dist/chunk-44CM72SQ.js +409 -0
  21. package/dist/chunk-4GRI7MEB.js +1604 -0
  22. package/dist/chunk-4OHACBGX.js +606 -0
  23. package/dist/chunk-5DH3KYFH.js +21 -0
  24. package/dist/chunk-5MLYVTYM.js +76 -0
  25. package/dist/chunk-5QXL4NYS.js +553 -0
  26. package/dist/chunk-5WRI5ZAA.js +31 -0
  27. package/dist/chunk-6EK55ART.js +117 -0
  28. package/dist/chunk-6FZYCKXB.js +2065 -0
  29. package/dist/chunk-6HO5ZTXK.js +277 -0
  30. package/dist/chunk-6KFWC4CO.js +7 -0
  31. package/dist/chunk-6MTWIQVO.js +121 -0
  32. package/dist/chunk-6NYWYNBI.js +329 -0
  33. package/dist/chunk-6SM5NJQH.js +620 -0
  34. package/dist/chunk-725LDASD.js +422 -0
  35. package/dist/chunk-76OWZ3BA.js +130 -0
  36. package/dist/chunk-7JEGTRLD.js +338 -0
  37. package/dist/chunk-A44USUV7.js +923 -0
  38. package/dist/chunk-A4GOY3PE.js +25 -0
  39. package/dist/chunk-A4VFQH5G.js +251 -0
  40. package/dist/chunk-AELOBFW5.js +375 -0
  41. package/dist/chunk-AN2MOO5T.js +522 -0
  42. package/dist/chunk-BMR4CIEO.js +41 -0
  43. package/dist/chunk-BS7SV7C3.js +51 -0
  44. package/dist/chunk-BUPDIHML.js +613 -0
  45. package/dist/chunk-BUVJFRPY.js +887 -0
  46. package/dist/chunk-C3Z4DX3V.js +112 -0
  47. package/dist/chunk-CI2G3OEB.js +1818 -0
  48. package/dist/chunk-CKNVO24D.js +54 -0
  49. package/dist/chunk-CUVHQHZ7.js +391 -0
  50. package/dist/chunk-CXK4DZH3.js +114 -0
  51. package/dist/chunk-DKEPS5LH.js +315 -0
  52. package/dist/chunk-DU7W62N5.js +487 -0
  53. package/dist/chunk-DZAQBW35.js +751 -0
  54. package/dist/chunk-EB6FPQUP.js +316 -0
  55. package/dist/chunk-EMS2SK26.js +376 -0
  56. package/dist/chunk-ERLBPDGU.js +510 -0
  57. package/dist/chunk-EVCVDTXE.js +732 -0
  58. package/dist/chunk-FCIIHT24.js +384 -0
  59. package/dist/chunk-FFUN5D66.js +97 -0
  60. package/dist/chunk-FITOLXSX.js +714 -0
  61. package/dist/chunk-FMDSF3OV.js +68 -0
  62. package/dist/chunk-FNB3PNGF.js +410 -0
  63. package/dist/chunk-G2H74XJZ.js +2104 -0
  64. package/dist/chunk-GMR5MFHJ.js +339 -0
  65. package/dist/chunk-H6PI3KJT.js +305 -0
  66. package/dist/chunk-I46X5VUA.js +59 -0
  67. package/dist/chunk-I5IGB56C.js +255 -0
  68. package/dist/chunk-IH6ZMVQ5.js +3950 -0
  69. package/dist/chunk-IJZFN3HM.js +463 -0
  70. package/dist/chunk-IPWPWM6R.js +3079 -0
  71. package/dist/chunk-IYULMRBE.js +23 -0
  72. package/dist/chunk-IZMRON6C.js +167 -0
  73. package/dist/chunk-J5FIXQRT.js +813 -0
  74. package/dist/chunk-JED6ZDEE.js +73 -0
  75. package/dist/chunk-JEUJOX5X.js +136 -0
  76. package/dist/chunk-JM4LEPY3.js +436 -0
  77. package/dist/chunk-L3UHP6TD.js +101 -0
  78. package/dist/chunk-L66GEFB6.js +524 -0
  79. package/dist/chunk-LIOHW36Z.js +469 -0
  80. package/dist/chunk-LP7EC4MI.js +16 -0
  81. package/dist/chunk-MITI6NOL.js +548 -0
  82. package/dist/chunk-MO5YHHMQ.js +168 -0
  83. package/dist/chunk-MZSBFAPJ.js +885 -0
  84. package/dist/chunk-NNAAJVBU.js +9 -0
  85. package/dist/chunk-NOTA6TEI.js +47 -0
  86. package/dist/chunk-NURGB5Z4.js +335 -0
  87. package/dist/chunk-NX4EQS3U.js +1062 -0
  88. package/dist/chunk-NXMESY4J.js +1 -0
  89. package/dist/chunk-OJR3MQYV.js +1458 -0
  90. package/dist/chunk-OURHMODR.js +454 -0
  91. package/dist/chunk-P235SVAH.js +1057 -0
  92. package/dist/chunk-P4RH4OSP.js +1038 -0
  93. package/dist/chunk-P6T66CCZ.js +226 -0
  94. package/dist/chunk-PBAHEPLQ.js +223 -0
  95. package/dist/chunk-PBHE5UG6.js +1530 -0
  96. package/dist/chunk-PDKUANDZ.js +35 -0
  97. package/dist/chunk-PWIHZ6NJ.js +296 -0
  98. package/dist/chunk-QEBUY5NY.js +1685 -0
  99. package/dist/chunk-QLCCJEJI.js +253 -0
  100. package/dist/chunk-QOOUC2J5.js +52 -0
  101. package/dist/chunk-QYTPPDAO.js +402 -0
  102. package/dist/chunk-R3XI2VC7.js +801 -0
  103. package/dist/chunk-RCERWOJR.js +154 -0
  104. package/dist/chunk-RJE5JTVK.js +362 -0
  105. package/dist/chunk-RTLBSQ3G.js +1155 -0
  106. package/dist/chunk-RUNNI6VE.js +448 -0
  107. package/dist/chunk-RVMRZAPB.js +354 -0
  108. package/dist/chunk-RYEGFMUO.js +955 -0
  109. package/dist/chunk-RZCF2VVM.js +528 -0
  110. package/dist/chunk-SML67VPV.js +1025 -0
  111. package/dist/chunk-SQ7IY53Q.js +44 -0
  112. package/dist/chunk-SQAG3UXH.js +161 -0
  113. package/dist/chunk-SRTU6HMQ.js +1851 -0
  114. package/dist/chunk-T2OE3YQB.js +550 -0
  115. package/dist/chunk-T3UBLACL.js +299 -0
  116. package/dist/chunk-TLVIHFRO.js +296 -0
  117. package/dist/chunk-TYS6CSS5.js +52 -0
  118. package/dist/chunk-U6EQI3U6.js +130 -0
  119. package/dist/chunk-UJ4FJLBF.js +86 -0
  120. package/dist/chunk-ULOEATBZ.js +347 -0
  121. package/dist/chunk-UNCCZ3NU.js +127 -0
  122. package/dist/chunk-USZW2HHU.js +197 -0
  123. package/dist/chunk-UWN33VNX.js +1610 -0
  124. package/dist/chunk-UZ7EZW3B.js +40 -0
  125. package/dist/chunk-VOKGH627.js +37 -0
  126. package/dist/chunk-WBRZJOEC.js +204 -0
  127. package/dist/chunk-WCSOJFU3.js +380 -0
  128. package/dist/chunk-WCT3NYCV.js +160 -0
  129. package/dist/chunk-WVAJFAIA.js +529 -0
  130. package/dist/chunk-X5LCYCL5.js +394 -0
  131. package/dist/chunk-XAKEUMEJ.js +1256 -0
  132. package/dist/chunk-Y2ZE3MSG.js +590 -0
  133. package/dist/chunk-Y3J7VR52.js +646 -0
  134. package/dist/chunk-Y5QGVTVC.js +33 -0
  135. package/dist/chunk-YAA6IID3.js +548 -0
  136. package/dist/chunk-YGJTDXVR.js +692 -0
  137. package/dist/chunk-YRYKTYMQ.js +186 -0
  138. package/dist/chunk-YYVTBZZC.js +61 -0
  139. package/dist/chunk-Z5CGSFJB.js +647 -0
  140. package/dist/chunk-Z72XRXD4.js +787 -0
  141. package/dist/chunk-ZGR7ULFJ.js +978 -0
  142. package/dist/chunk-ZJEL4H2R.js +851 -0
  143. package/dist/chunk-ZO27FGJS.js +554 -0
  144. package/dist/collapse-CLPJD2RL.js +11 -0
  145. package/dist/collapse-SLINJQW6.js +9 -0
  146. package/dist/collapse-ZWUFFCK2.js +9 -0
  147. package/dist/compute-G55RG53N.js +8 -0
  148. package/dist/dgmo-router-DZCIDUO5.js +73 -0
  149. package/dist/dimensions-J3FHIMJ6.js +22 -0
  150. package/dist/element.cjs +1 -1
  151. package/dist/element.js +1 -1
  152. package/dist/element.mjs +1 -1
  153. package/dist/flowchart-parser-ZNSKIBVR.js +21 -0
  154. package/dist/flowchart-renderer-ZAEOL4DX.js +35 -0
  155. package/dist/index.cjs +3 -3
  156. package/dist/index.d.cts +3 -469
  157. package/dist/index.d.ts +3 -469
  158. package/dist/index.js +137 -69685
  159. package/dist/layout-46N4JJYK.js +17 -0
  160. package/dist/layout-5RA6QWR6.js +26 -0
  161. package/dist/layout-5T6RH5M6.js +14 -0
  162. package/dist/layout-7QXCNOVS.js +13 -0
  163. package/dist/layout-EE6GE46Y.js +17 -0
  164. package/dist/layout-G23F7LDH.js +9 -0
  165. package/dist/layout-HRBZPFCN.js +23 -0
  166. package/dist/layout-HWDSRX5E.js +20 -0
  167. package/dist/layout-HYZPWAK5.js +18 -0
  168. package/dist/layout-N76NR4ZO.js +19 -0
  169. package/dist/layout-OB3RI63S.js +14 -0
  170. package/dist/layout-S2QBYSK2.js +15 -0
  171. package/dist/layout-UM5F4DJB.js +15 -0
  172. package/dist/layout-search-OYV77HHS.js +1655 -0
  173. package/dist/load-data-EHDDZ5ZS.js +8 -0
  174. package/dist/palettes-PRJ2RI6D.js +56 -0
  175. package/dist/parser-2MFP2H2E.js +11 -0
  176. package/dist/parser-3STE62GB.js +21 -0
  177. package/dist/parser-4FL2CMDG.js +18 -0
  178. package/dist/parser-4OGOBJJ4.js +13 -0
  179. package/dist/parser-6BTRLKRZ.js +15 -0
  180. package/dist/parser-AQETEVRW.js +21 -0
  181. package/dist/parser-CFZD5IBL.js +12 -0
  182. package/dist/parser-FUSKFGZN.js +16 -0
  183. package/dist/parser-I6KXEYFK.js +13 -0
  184. package/dist/parser-IXSZZQHY.js +18 -0
  185. package/dist/parser-JAL2HD4I.js +13 -0
  186. package/dist/parser-KNSQSKQO.js +20 -0
  187. package/dist/parser-N5O4IHUN.js +13 -0
  188. package/dist/parser-NGU3ETO6.js +16 -0
  189. package/dist/parser-NRAI6O25.js +19 -0
  190. package/dist/parser-O5J4VBII.js +11 -0
  191. package/dist/parser-OV7NOBW6.js +21 -0
  192. package/dist/parser-PQ3POX45.js +23 -0
  193. package/dist/parser-TFZFBVWN.js +11 -0
  194. package/dist/parser-TRTHDFPP.js +18 -0
  195. package/dist/parser-VQP2UJ6W.js +11 -0
  196. package/dist/parser-XDVELHRK.js +13 -0
  197. package/dist/parser-XKRP7QKP.js +11 -0
  198. package/dist/parser-Y6WTBU76.js +14 -0
  199. package/dist/parser-ZSDPZYQP.js +12 -0
  200. package/dist/renderer-2XQQQ6QR.js +28 -0
  201. package/dist/renderer-5NDVNDAZ.js +26 -0
  202. package/dist/renderer-6EEZHMH4.js +26 -0
  203. package/dist/renderer-6W5462RB.js +43 -0
  204. package/dist/renderer-7MVLWWQD.js +22 -0
  205. package/dist/renderer-AWWAF6XD.js +33 -0
  206. package/dist/renderer-BYCNMBF7.js +34 -0
  207. package/dist/renderer-CLJHQPBJ.js +29 -0
  208. package/dist/renderer-GHPZMFU2.js +15 -0
  209. package/dist/renderer-JGBKUCZD.js +16 -0
  210. package/dist/renderer-KQB7UGDS.js +19 -0
  211. package/dist/renderer-PGX2TKVS.js +24 -0
  212. package/dist/renderer-QIWVHWZO.js +15 -0
  213. package/dist/renderer-RPOA5YPZ.js +35 -0
  214. package/dist/renderer-SMIBCRVB.js +24 -0
  215. package/dist/renderer-T7YKC5VP.js +28 -0
  216. package/dist/renderer-TOCOVLHS.js +37 -0
  217. package/dist/renderer-UWA5XS74.js +39 -0
  218. package/dist/renderer-VACVQYML.js +25 -0
  219. package/dist/renderer-W4M6QLIJ.js +37 -0
  220. package/dist/renderer-WZRREQ2P.js +23 -0
  221. package/dist/renderer-YY2OSF6E.js +27 -0
  222. package/dist/renderer-Z7I3W2PP.js +24 -0
  223. package/dist/renderer-ZGNTUWC4.js +22 -0
  224. package/dist/renderer-ZTR3DER3.js +19 -0
  225. package/dist/renderer-radial-C32GPJQ7.js +21 -0
  226. package/dist/resolver-NOAA7ID7.js +13 -0
  227. package/dist/state-collapse-HCGD6IVJ.js +8 -0
  228. package/dist/state-parser-Z2V23ATR.js +18 -0
  229. package/dist/state-renderer-RFYHSP4K.js +34 -0
  230. package/dist/themes-1-CuKpeH.d.cts +908 -0
  231. package/dist/themes-1-CuKpeH.d.ts +908 -0
  232. package/package.json +1 -1
@@ -0,0 +1,299 @@
1
+ import {
2
+ noteCanvasShift,
3
+ placeNotes
4
+ } from "./chunk-6EK55ART.js";
5
+ import {
6
+ noteBoxSize
7
+ } from "./chunk-TYS6CSS5.js";
8
+ import {
9
+ resolveNotes
10
+ } from "./chunk-FMDSF3OV.js";
11
+
12
+ // src/graph/layout.ts
13
+ import dagre from "@dagrejs/dagre";
14
+ var GROUP_PADDING = 20;
15
+ function computeNodeWidth(label, shape) {
16
+ if (shape === "pseudostate") return 24;
17
+ const base = Math.max(120, label.length * 9 + 40);
18
+ if (shape === "subroutine") return base + 10;
19
+ return base;
20
+ }
21
+ function computeNodeHeight(shape) {
22
+ if (shape === "pseudostate") return 24;
23
+ return shape === "decision" ? 60 : 50;
24
+ }
25
+ function layoutGraph(graph, options) {
26
+ const collapsedChildCounts = options?.collapsedChildCounts;
27
+ const originalGroups = options?.originalGroups;
28
+ const collapsedNotes = options?.collapsedNotes;
29
+ const collapsedGroupNodes = [];
30
+ if (collapsedChildCounts && originalGroups) {
31
+ for (const group of originalGroups) {
32
+ if (collapsedChildCounts.has(group.id)) {
33
+ const count = collapsedChildCounts.get(group.id);
34
+ collapsedGroupNodes.push({
35
+ id: group.id,
36
+ label: `${group.label} (${count} state${count !== 1 ? "s" : ""})`,
37
+ shape: "state",
38
+ lineNumber: group.lineNumber,
39
+ ...group.color && { color: group.color }
40
+ });
41
+ }
42
+ }
43
+ }
44
+ const allNodes = [...graph.nodes, ...collapsedGroupNodes];
45
+ if (allNodes.length === 0) {
46
+ return { nodes: [], edges: [], groups: [], width: 0, height: 0 };
47
+ }
48
+ const g = new dagre.graphlib.Graph({ compound: true });
49
+ g.setGraph({
50
+ rankdir: graph.direction,
51
+ nodesep: 50,
52
+ ranksep: 60,
53
+ edgesep: 20
54
+ });
55
+ g.setDefaultEdgeLabel(() => ({}));
56
+ const nodeDataMap = /* @__PURE__ */ new Map();
57
+ for (const node of allNodes) {
58
+ nodeDataMap.set(node.id, node);
59
+ }
60
+ if (graph.groups) {
61
+ for (const group of graph.groups) {
62
+ g.setNode(group.id, {
63
+ label: group.label,
64
+ clusterLabelPos: "top"
65
+ });
66
+ }
67
+ }
68
+ const notesSuppressed = graph.options?.["no-notes"] === "on";
69
+ const noteByNode = notesSuppressed || !graph.notes ? /* @__PURE__ */ new Map() : resolveNotes(graph.notes, graph.nodes);
70
+ const noteGeoms = /* @__PURE__ */ new Map();
71
+ for (const node of allNodes) {
72
+ const width = computeNodeWidth(node.label, node.shape);
73
+ const height = computeNodeHeight(node.shape);
74
+ g.setNode(node.id, { label: node.label, width, height });
75
+ const note = noteByNode.get(node.id);
76
+ if (note) {
77
+ const size = noteBoxSize(note.body);
78
+ noteGeoms.set(node.id, {
79
+ noteW: size.width,
80
+ noteH: size.height,
81
+ ...note.color && { color: note.color },
82
+ lines: size.lines,
83
+ lineNumber: note.lineNumber,
84
+ endLineNumber: note.endLineNumber
85
+ });
86
+ }
87
+ if (node.group && graph.groups?.some((gr) => gr.id === node.group)) {
88
+ g.setParent(node.id, node.group);
89
+ }
90
+ }
91
+ const edgeDataMap = /* @__PURE__ */ new Map();
92
+ for (const edge of graph.edges) {
93
+ const key = `${edge.source}->${edge.target}`;
94
+ edgeDataMap.set(key, edge);
95
+ g.setEdge(edge.source, edge.target, {
96
+ label: edge.label ?? ""
97
+ });
98
+ }
99
+ dagre.layout(g);
100
+ const collapsedGroupIds = collapsedChildCounts ? new Set(collapsedChildCounts.keys()) : /* @__PURE__ */ new Set();
101
+ const basePositioned = allNodes.map((node) => {
102
+ const pos = g.node(node.id);
103
+ return { node, x: pos.x, y: pos.y, width: pos.width, height: pos.height };
104
+ });
105
+ const noteRequests = basePositioned.filter((p) => noteGeoms.has(p.node.id)).map((p) => {
106
+ const ng = noteGeoms.get(p.node.id);
107
+ return {
108
+ key: p.node.id,
109
+ node: { x: p.x, y: p.y, width: p.width, height: p.height },
110
+ noteW: ng.noteW,
111
+ noteH: ng.noteH,
112
+ collapsed: collapsedNotes?.has(ng.lineNumber) ?? false
113
+ };
114
+ });
115
+ const placements = placeNotes(
116
+ basePositioned.map((p) => ({
117
+ x: p.x,
118
+ y: p.y,
119
+ width: p.width,
120
+ height: p.height
121
+ })),
122
+ noteRequests,
123
+ graph.direction === "LR" ? "LR" : "TB"
124
+ );
125
+ const layoutNodes = basePositioned.map((p) => {
126
+ const node = p.node;
127
+ const ng = noteGeoms.get(node.id);
128
+ const placed = placements.get(node.id);
129
+ return {
130
+ id: node.id,
131
+ label: node.label,
132
+ shape: node.shape,
133
+ ...node.color !== void 0 && { color: node.color },
134
+ ...node.group !== void 0 && { group: node.group },
135
+ lineNumber: node.lineNumber,
136
+ x: p.x,
137
+ y: p.y,
138
+ width: p.width,
139
+ height: p.height,
140
+ ...ng && placed && {
141
+ // Local coords relative to the node center (translate origin).
142
+ note: placed.collapsed ? {
143
+ x: 0,
144
+ y: 0,
145
+ width: 0,
146
+ height: 0,
147
+ side: "right",
148
+ ...ng.color && { color: ng.color },
149
+ lines: [],
150
+ lineNumber: ng.lineNumber,
151
+ endLineNumber: ng.endLineNumber,
152
+ collapsed: true
153
+ } : {
154
+ x: placed.x,
155
+ y: placed.y,
156
+ width: ng.noteW,
157
+ height: ng.noteH,
158
+ side: placed.side,
159
+ ...ng.color && { color: ng.color },
160
+ lines: ng.lines,
161
+ lineNumber: ng.lineNumber,
162
+ endLineNumber: ng.endLineNumber
163
+ }
164
+ }
165
+ };
166
+ });
167
+ const layoutEdges = graph.edges.map((edge) => {
168
+ const edgeData = g.edge(edge.source, edge.target);
169
+ return {
170
+ source: edge.source,
171
+ target: edge.target,
172
+ points: edgeData?.points ?? [],
173
+ ...edge.label !== void 0 && { label: edge.label },
174
+ lineNumber: edge.lineNumber
175
+ };
176
+ });
177
+ const layoutGroups = [];
178
+ const allGroups = graph.groups ?? [];
179
+ if (originalGroups) {
180
+ for (const group of originalGroups) {
181
+ if (collapsedGroupIds.has(group.id)) {
182
+ const syntheticNode = layoutNodes.find((n) => n.id === group.id);
183
+ if (syntheticNode) {
184
+ layoutGroups.push({
185
+ id: group.id,
186
+ label: group.label,
187
+ ...group.color !== void 0 && { color: group.color },
188
+ lineNumber: group.lineNumber,
189
+ collapsed: true,
190
+ x: syntheticNode.x - syntheticNode.width / 2,
191
+ y: syntheticNode.y - syntheticNode.height / 2,
192
+ width: syntheticNode.width,
193
+ height: syntheticNode.height
194
+ });
195
+ }
196
+ }
197
+ }
198
+ }
199
+ if (allGroups.length > 0) {
200
+ const nodeMap = new Map(layoutNodes.map((n) => [n.id, n]));
201
+ for (const group of allGroups) {
202
+ const members = group.nodeIds.map((id) => nodeMap.get(id)).filter((n) => n !== void 0);
203
+ if (members.length === 0) {
204
+ layoutGroups.push({
205
+ id: group.id,
206
+ label: group.label,
207
+ ...group.color !== void 0 && { color: group.color },
208
+ lineNumber: group.lineNumber,
209
+ x: 0,
210
+ y: 0,
211
+ width: 0,
212
+ height: 0
213
+ });
214
+ continue;
215
+ }
216
+ let minX = Infinity;
217
+ let minY = Infinity;
218
+ let maxX = -Infinity;
219
+ let maxY = -Infinity;
220
+ for (const member of members) {
221
+ const left = member.x - member.width / 2;
222
+ const right = member.x + member.width / 2;
223
+ const top = member.y - member.height / 2;
224
+ const bottom = member.y + member.height / 2;
225
+ if (left < minX) minX = left;
226
+ if (right > maxX) maxX = right;
227
+ if (top < minY) minY = top;
228
+ if (bottom > maxY) maxY = bottom;
229
+ }
230
+ layoutGroups.push({
231
+ id: group.id,
232
+ label: group.label,
233
+ ...group.color !== void 0 && { color: group.color },
234
+ lineNumber: group.lineNumber,
235
+ x: minX - GROUP_PADDING,
236
+ y: minY - GROUP_PADDING,
237
+ width: maxX - minX + GROUP_PADDING * 2,
238
+ height: maxY - minY + GROUP_PADDING * 2
239
+ });
240
+ }
241
+ }
242
+ let bbMinX = Infinity;
243
+ let bbMinY = Infinity;
244
+ let bbMaxX = -Infinity;
245
+ let bbMaxY = -Infinity;
246
+ const extend = (l, t, r, b) => {
247
+ if (l < bbMinX) bbMinX = l;
248
+ if (t < bbMinY) bbMinY = t;
249
+ if (r > bbMaxX) bbMaxX = r;
250
+ if (b > bbMaxY) bbMaxY = b;
251
+ };
252
+ for (const node of layoutNodes) {
253
+ extend(
254
+ node.x - node.width / 2,
255
+ node.y - node.height / 2,
256
+ node.x + node.width / 2,
257
+ node.y + node.height / 2
258
+ );
259
+ if (node.note) {
260
+ extend(
261
+ node.x + node.note.x,
262
+ node.y + node.note.y,
263
+ node.x + node.note.x + node.note.width,
264
+ node.y + node.note.y + node.note.height
265
+ );
266
+ }
267
+ }
268
+ for (const group of layoutGroups) {
269
+ extend(group.x, group.y, group.x + group.width, group.y + group.height);
270
+ }
271
+ if (!Number.isFinite(bbMinX)) {
272
+ bbMinX = 0;
273
+ bbMinY = 0;
274
+ bbMaxX = 0;
275
+ bbMaxY = 0;
276
+ }
277
+ const { shiftX, shiftY } = noteCanvasShift(bbMinX, bbMinY);
278
+ const shifted = shiftX !== 0 || shiftY !== 0;
279
+ const finalNodes = shifted ? layoutNodes.map((n) => ({ ...n, x: n.x + shiftX, y: n.y + shiftY })) : layoutNodes;
280
+ const finalEdges = shifted ? layoutEdges.map((e) => ({
281
+ ...e,
282
+ points: e.points.map((pt) => ({ x: pt.x + shiftX, y: pt.y + shiftY }))
283
+ })) : layoutEdges;
284
+ const finalGroups = shifted ? layoutGroups.map((gr) => ({ ...gr, x: gr.x + shiftX, y: gr.y + shiftY })) : layoutGroups;
285
+ const totalWidth = bbMaxX + shiftX + 40;
286
+ const totalHeight = bbMaxY + shiftY + 40;
287
+ return {
288
+ nodes: finalNodes,
289
+ edges: finalEdges,
290
+ groups: finalGroups,
291
+ width: totalWidth,
292
+ height: totalHeight
293
+ };
294
+ }
295
+
296
+ export {
297
+ layoutGraph
298
+ };
299
+ //# sourceMappingURL=chunk-T3UBLACL.js.map
@@ -0,0 +1,296 @@
1
+ import {
2
+ makeDgmoError,
3
+ suggest
4
+ } from "./chunk-CXK4DZH3.js";
5
+
6
+ // src/colors.ts
7
+ var nord = {
8
+ // Polar Night (dark)
9
+ nord0: "#2e3440",
10
+ nord1: "#3b4252",
11
+ nord2: "#434c5e",
12
+ nord3: "#4c566a",
13
+ // Snow Storm (light)
14
+ nord4: "#d8dee9",
15
+ nord5: "#e5e9f0",
16
+ nord6: "#eceff4",
17
+ // Frost (accent blues)
18
+ nord7: "#8fbcbb",
19
+ nord8: "#88c0d0",
20
+ nord9: "#81a1c1",
21
+ nord10: "#5e81ac",
22
+ // Aurora (colors)
23
+ nord11: "#bf616a",
24
+ // red
25
+ nord12: "#d08770",
26
+ // orange
27
+ nord13: "#ebcb8b",
28
+ // yellow
29
+ nord14: "#a3be8c",
30
+ // green
31
+ nord15: "#b48ead"
32
+ // purple
33
+ };
34
+ var colorNames = {
35
+ red: nord.nord11,
36
+ orange: nord.nord12,
37
+ yellow: nord.nord13,
38
+ green: nord.nord14,
39
+ blue: nord.nord10,
40
+ purple: nord.nord15,
41
+ teal: nord.nord7,
42
+ cyan: nord.nord8,
43
+ gray: nord.nord3,
44
+ black: nord.nord0,
45
+ white: nord.nord6
46
+ };
47
+ var RECOGNIZED_COLOR_NAMES = Object.freeze([
48
+ "red",
49
+ "orange",
50
+ "yellow",
51
+ "green",
52
+ "blue",
53
+ "purple",
54
+ "teal",
55
+ "cyan",
56
+ "gray",
57
+ "black",
58
+ "white"
59
+ ]);
60
+ var CATEGORICAL_COLOR_ORDER = Object.freeze([
61
+ "red",
62
+ "green",
63
+ "blue",
64
+ "yellow",
65
+ "teal",
66
+ "purple",
67
+ "orange",
68
+ "cyan"
69
+ ]);
70
+ function isRecognizedColorName(name) {
71
+ return Object.prototype.hasOwnProperty.call(colorNames, name.toLowerCase());
72
+ }
73
+ function resolveColor(color, palette) {
74
+ if (!color) return null;
75
+ if (color.startsWith("#")) return null;
76
+ const lower = color.toLowerCase();
77
+ if (!isRecognizedColorName(lower)) return null;
78
+ if (palette) {
79
+ const named = palette.colors[lower];
80
+ if (named) return named;
81
+ }
82
+ return colorNames[lower] ?? null;
83
+ }
84
+ var INVALID_COLOR_CODE = "E_INVALID_COLOR";
85
+ var INVALID_CSS_COLOR_HEX = Object.freeze({
86
+ pink: "#ffc0cb",
87
+ hotpink: "#ff69b4",
88
+ deeppink: "#ff1493",
89
+ lightpink: "#ffb6c1",
90
+ palevioletred: "#db7093",
91
+ crimson: "#dc143c",
92
+ scarlet: "#ff2400",
93
+ firebrick: "#b22222",
94
+ darkred: "#8b0000",
95
+ maroon: "#800000",
96
+ salmon: "#fa8072",
97
+ lightsalmon: "#ffa07a",
98
+ darksalmon: "#e9967a",
99
+ coral: "#ff7f50",
100
+ lightcoral: "#f08080",
101
+ tomato: "#ff6347",
102
+ orangered: "#ff4500",
103
+ darkorange: "#ff8c00",
104
+ gold: "#ffd700",
105
+ goldenrod: "#daa520",
106
+ darkgoldenrod: "#b8860b",
107
+ khaki: "#f0e68c",
108
+ darkkhaki: "#bdb76b",
109
+ amber: "#ffbf00",
110
+ lavender: "#e6e6fa",
111
+ violet: "#ee82ee",
112
+ magenta: "#ff00ff",
113
+ fuchsia: "#ff00ff",
114
+ orchid: "#da70d6",
115
+ plum: "#dda0dd",
116
+ indigo: "#4b0082",
117
+ navy: "#000080",
118
+ midnightblue: "#191970",
119
+ darkblue: "#00008b",
120
+ mediumblue: "#0000cd",
121
+ royalblue: "#4169e1",
122
+ cornflowerblue: "#6495ed",
123
+ dodgerblue: "#1e90ff",
124
+ deepskyblue: "#00bfff",
125
+ skyblue: "#87ceeb",
126
+ lightskyblue: "#87cefa",
127
+ lightblue: "#add8e6",
128
+ powderblue: "#b0e0e6",
129
+ steelblue: "#4682b4",
130
+ slateblue: "#6a5acd",
131
+ cadetblue: "#5f9ea0",
132
+ turquoise: "#40e0d0",
133
+ aqua: "#00ffff",
134
+ aquamarine: "#7fffd4",
135
+ lime: "#00ff00",
136
+ limegreen: "#32cd32",
137
+ lightgreen: "#90ee90",
138
+ palegreen: "#98fb98",
139
+ seagreen: "#2e8b57",
140
+ mediumseagreen: "#3cb371",
141
+ forestgreen: "#228b22",
142
+ darkgreen: "#006400",
143
+ olive: "#808000",
144
+ olivedrab: "#6b8e23",
145
+ darkolivegreen: "#556b2f",
146
+ chartreuse: "#7fff00",
147
+ lawngreen: "#7cfc00",
148
+ springgreen: "#00ff7f",
149
+ greenyellow: "#adff2f",
150
+ brown: "#a52a2a",
151
+ sienna: "#a0522d",
152
+ chocolate: "#d2691e",
153
+ peru: "#cd853f",
154
+ tan: "#d2b48c",
155
+ beige: "#f5f5dc",
156
+ wheat: "#f5deb3",
157
+ ivory: "#fffff0",
158
+ silver: "#c0c0c0",
159
+ lightgray: "#d3d3d3",
160
+ lightgrey: "#d3d3d3",
161
+ darkgray: "#a9a9a9",
162
+ darkgrey: "#a9a9a9",
163
+ dimgray: "#696969",
164
+ dimgrey: "#696969",
165
+ slategray: "#708090",
166
+ slategrey: "#708090",
167
+ gainsboro: "#dcdcdc",
168
+ grey: "#808080"
169
+ });
170
+ function nearestNamedColor(input) {
171
+ const cssHex = INVALID_CSS_COLOR_HEX[input.trim().toLowerCase()];
172
+ if (cssHex) input = cssHex;
173
+ const m = /^#([0-9a-f]{3}|[0-9a-f]{6})$/i.exec(input.trim());
174
+ if (!m) return null;
175
+ let h = m[1].toLowerCase();
176
+ if (h.length === 3)
177
+ h = h.split("").map((c) => c + c).join("");
178
+ const r = parseInt(h.slice(0, 2), 16) / 255;
179
+ const g = parseInt(h.slice(2, 4), 16) / 255;
180
+ const b = parseInt(h.slice(4, 6), 16) / 255;
181
+ const max = Math.max(r, g, b);
182
+ const min = Math.min(r, g, b);
183
+ const delta = max - min;
184
+ const l = (max + min) / 2;
185
+ const s = delta === 0 ? 0 : delta / (1 - Math.abs(2 * l - 1));
186
+ if (s < 0.15) {
187
+ if (l < 0.2) return "black";
188
+ if (l > 0.85) return "white";
189
+ return "gray";
190
+ }
191
+ let hue;
192
+ if (max === r) hue = 60 * ((g - b) / delta % 6);
193
+ else if (max === g) hue = 60 * ((b - r) / delta + 2);
194
+ else hue = 60 * ((r - g) / delta + 4);
195
+ if (hue < 0) hue += 360;
196
+ const anchors = [
197
+ ["red", 0],
198
+ ["orange", 30],
199
+ ["yellow", 55],
200
+ ["green", 120],
201
+ ["teal", 170],
202
+ ["cyan", 190],
203
+ ["blue", 225],
204
+ ["purple", 285],
205
+ ["red", 360]
206
+ ];
207
+ let best = "red";
208
+ let bestD = Infinity;
209
+ for (const [name, deg] of anchors) {
210
+ const d = Math.abs(hue - deg);
211
+ if (d < bestD) {
212
+ bestD = d;
213
+ best = name;
214
+ }
215
+ }
216
+ return best;
217
+ }
218
+ function isInvalidColorToken(token) {
219
+ if (/^(#|rgba?\(|hsla?\()/i.test(token)) return true;
220
+ const lower = token.toLowerCase();
221
+ return INVALID_CSS_COLOR_HEX[lower] !== void 0 && !isRecognizedColorName(lower);
222
+ }
223
+ function invalidColorDiagnostic(token, line) {
224
+ if (!isInvalidColorToken(token)) return null;
225
+ const nearest = nearestNamedColor(token);
226
+ const near = nearest ? ` Nearest: ${nearest}.` : "";
227
+ return makeDgmoError(
228
+ line,
229
+ `Color "${token}" is not a valid DGMO color \u2014 DGMO accepts only these 11 named colors: ${RECOGNIZED_COLOR_NAMES.join(", ")} (no hex, no CSS color names).${near}`,
230
+ "warning",
231
+ INVALID_COLOR_CODE
232
+ );
233
+ }
234
+ function resolveColorWithDiagnostic(color, line, diagnostics, palette) {
235
+ const resolved = resolveColor(color, palette);
236
+ if (resolved !== null) return resolved;
237
+ if (/^(#|rgba?\(|hsla?\()/i.test(color)) {
238
+ const nearest = nearestNamedColor(color);
239
+ const near = nearest ? ` Nearest: ${nearest}.` : "";
240
+ diagnostics.push(
241
+ makeDgmoError(
242
+ line,
243
+ `Color "${color}" is not supported \u2014 DGMO does not accept hex or CSS color values. Use a named palette color: ${RECOGNIZED_COLOR_NAMES.join(", ")}.${near}`,
244
+ "error",
245
+ INVALID_COLOR_CODE
246
+ )
247
+ );
248
+ return void 0;
249
+ }
250
+ const hint = suggest(color, RECOGNIZED_COLOR_NAMES);
251
+ const suggestion = hint ? ` ${hint}` : "";
252
+ diagnostics.push(
253
+ makeDgmoError(
254
+ line,
255
+ `Unknown color "${color}". DGMO accepts only these 11 named colors: ${RECOGNIZED_COLOR_NAMES.join(", ")} (no hex, no CSS color names).${suggestion}`,
256
+ "warning",
257
+ INVALID_COLOR_CODE
258
+ )
259
+ );
260
+ return void 0;
261
+ }
262
+ var seriesColors = [
263
+ nord.nord10,
264
+ // blue
265
+ nord.nord14,
266
+ // green
267
+ nord.nord13,
268
+ // yellow
269
+ nord.nord12,
270
+ // orange
271
+ nord.nord15,
272
+ // purple
273
+ nord.nord11,
274
+ // red
275
+ nord.nord7,
276
+ // teal
277
+ nord.nord8
278
+ // light blue
279
+ ];
280
+
281
+ export {
282
+ nord,
283
+ colorNames,
284
+ RECOGNIZED_COLOR_NAMES,
285
+ CATEGORICAL_COLOR_ORDER,
286
+ isRecognizedColorName,
287
+ resolveColor,
288
+ INVALID_COLOR_CODE,
289
+ INVALID_CSS_COLOR_HEX,
290
+ nearestNamedColor,
291
+ isInvalidColorToken,
292
+ invalidColorDiagnostic,
293
+ resolveColorWithDiagnostic,
294
+ seriesColors
295
+ };
296
+ //# sourceMappingURL=chunk-TLVIHFRO.js.map
@@ -0,0 +1,52 @@
1
+ import {
2
+ NOTE_BULLET_INDENT,
3
+ NOTE_FOLD,
4
+ NOTE_FONT_SIZE,
5
+ NOTE_LINE_H,
6
+ NOTE_MAX_W,
7
+ NOTE_PAD_H,
8
+ NOTE_PAD_V
9
+ } from "./chunk-5DH3KYFH.js";
10
+ import {
11
+ wrapDescriptionLines
12
+ } from "./chunk-BMR4CIEO.js";
13
+ import {
14
+ measureText
15
+ } from "./chunk-WCT3NYCV.js";
16
+
17
+ // src/utils/note-box/metrics.ts
18
+ function normalizeBulletLine(line) {
19
+ return line.replace(/^\s*[-*]\s+/, "\u2022 ");
20
+ }
21
+ function wrapNoteBody(body, textMaxWidth, fontSize = NOTE_FONT_SIZE) {
22
+ const sourceLines = body.split("\n").map(normalizeBulletLine);
23
+ return wrapDescriptionLines(
24
+ sourceLines,
25
+ textMaxWidth,
26
+ (s) => measureText(s, fontSize)
27
+ );
28
+ }
29
+ function noteBoxSize(body, opts = {}) {
30
+ const fontSize = opts.fontSize ?? NOTE_FONT_SIZE;
31
+ const maxW = opts.maxW ?? NOTE_MAX_W;
32
+ const textMaxWidth = maxW - NOTE_PAD_H * 2;
33
+ const lines = wrapNoteBody(body, textMaxWidth, fontSize);
34
+ let maxLineW = 0;
35
+ for (const line of lines) {
36
+ const indent = line.kind === "plain" ? 0 : NOTE_BULLET_INDENT;
37
+ const w = measureText(line.text, fontSize) + indent;
38
+ if (w > maxLineW) maxLineW = w;
39
+ }
40
+ const width = Math.min(
41
+ maxW,
42
+ Math.max(80, maxLineW + NOTE_PAD_H * 2 + NOTE_FOLD)
43
+ );
44
+ const height = Math.max(1, lines.length) * NOTE_LINE_H + NOTE_PAD_V * 2;
45
+ return { width, height, lines };
46
+ }
47
+
48
+ export {
49
+ wrapNoteBody,
50
+ noteBoxSize
51
+ };
52
+ //# sourceMappingURL=chunk-TYS6CSS5.js.map