@graphty/graph-io 0.3.48 → 0.3.50

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 (600) hide show
  1. package/dist/chunks/{approximations-C2riR4NT.js → approximations-BRXsll0T.js} +2 -2
  2. package/dist/chunks/{approximations-C2riR4NT.js.map → approximations-BRXsll0T.js.map} +1 -1
  3. package/dist/chunks/bends-BGXjv_U4.js +129 -0
  4. package/dist/chunks/bends-BGXjv_U4.js.map +1 -0
  5. package/dist/chunks/{block-Cu22ewuS.js → block-yl0f_qLO.js} +931 -164
  6. package/dist/chunks/block-yl0f_qLO.js.map +1 -0
  7. package/dist/chunks/choose-CczZJaX_.js +717 -0
  8. package/dist/chunks/choose-CczZJaX_.js.map +1 -0
  9. package/dist/chunks/{codes-CV_Bhcyi.js → codes-BE2xir2k.js} +6 -2
  10. package/dist/chunks/codes-BE2xir2k.js.map +1 -0
  11. package/dist/chunks/{constants-D0LqcsLJ.js → constants-CKkYLPtt.js} +2 -2
  12. package/dist/chunks/{constants-D0LqcsLJ.js.map → constants-CKkYLPtt.js.map} +1 -1
  13. package/dist/chunks/{context-cgmmOxZ2.js → context-DizmppHy.js} +5 -4
  14. package/dist/chunks/{context-cgmmOxZ2.js.map → context-DizmppHy.js.map} +1 -1
  15. package/dist/chunks/{convert-BcQ8_jMo.js → convert-Ct2zelbQ.js} +7 -2
  16. package/dist/chunks/convert-Ct2zelbQ.js.map +1 -0
  17. package/dist/chunks/{credentials-BiQsnMTb.js → credentials-CmvJXYeH.js} +67 -16
  18. package/dist/chunks/credentials-CmvJXYeH.js.map +1 -0
  19. package/dist/chunks/{cx-export-BEeF6ymo.js → cx-export-Bt6NoqTQ.js} +3 -3
  20. package/dist/chunks/{cx-export-BEeF6ymo.js.map → cx-export-Bt6NoqTQ.js.map} +1 -1
  21. package/dist/chunks/descriptor-B28U25x4.js +60 -0
  22. package/dist/chunks/descriptor-B28U25x4.js.map +1 -0
  23. package/dist/chunks/{descriptor-BJ-W0Jd-.js → descriptor-Dhez_Cew.js} +11 -2
  24. package/dist/chunks/descriptor-Dhez_Cew.js.map +1 -0
  25. package/dist/chunks/{emit-CD8xnY8s.js → emit-7Jkpg0yd.js} +1788 -133
  26. package/dist/chunks/emit-7Jkpg0yd.js.map +1 -0
  27. package/dist/chunks/{escape-DH2Egt-l.js → escape-CuCIzNMB.js} +8 -8
  28. package/dist/chunks/{escape-DH2Egt-l.js.map → escape-CuCIzNMB.js.map} +1 -1
  29. package/dist/chunks/{export-CZ7VRm4I.js → export-Cha4dRFz.js} +45 -387
  30. package/dist/chunks/export-Cha4dRFz.js.map +1 -0
  31. package/dist/chunks/{exporter-ChjL5fmP.js → exporter-1Ajud15J.js} +9 -8
  32. package/dist/chunks/{exporter-ChjL5fmP.js.map → exporter-1Ajud15J.js.map} +1 -1
  33. package/dist/chunks/{exporter-BIdaoIgh.js → exporter-B6yvL3wy.js} +7 -7
  34. package/dist/chunks/{exporter-BIdaoIgh.js.map → exporter-B6yvL3wy.js.map} +1 -1
  35. package/dist/chunks/{exporter-Dcw7Ldtq.js → exporter-BP6otMO6.js} +6 -6
  36. package/dist/chunks/{exporter-Dcw7Ldtq.js.map → exporter-BP6otMO6.js.map} +1 -1
  37. package/dist/chunks/{exporter-DtVU80Fa.js → exporter-CA5q8ROP.js} +9 -8
  38. package/dist/chunks/{exporter-DtVU80Fa.js.map → exporter-CA5q8ROP.js.map} +1 -1
  39. package/dist/chunks/{exporter-bxxjOrDZ.js → exporter-CQQZFJ2v.js} +1284 -156
  40. package/dist/chunks/exporter-CQQZFJ2v.js.map +1 -0
  41. package/dist/chunks/format-BXiAb-1h.js +408 -0
  42. package/dist/chunks/format-BXiAb-1h.js.map +1 -0
  43. package/dist/chunks/{generic-CP6YD34u.js → generic-Dc21MAdg.js} +387 -31
  44. package/dist/chunks/generic-Dc21MAdg.js.map +1 -0
  45. package/dist/chunks/{importer-B87_fmVx.js → importer-C6NVpCXp.js} +327 -84
  46. package/dist/chunks/importer-C6NVpCXp.js.map +1 -0
  47. package/dist/chunks/{importer-DPZDN40-.js → importer-CKFe4q54.js} +25 -17
  48. package/dist/chunks/importer-CKFe4q54.js.map +1 -0
  49. package/dist/chunks/{importer-Bji2MeWr.js → importer-CKbUbsJA.js} +13 -10
  50. package/dist/chunks/{importer-Bji2MeWr.js.map → importer-CKbUbsJA.js.map} +1 -1
  51. package/dist/chunks/{importer-CB_zV5_L.js → importer-ClCsdgTJ.js} +208 -1104
  52. package/dist/chunks/importer-ClCsdgTJ.js.map +1 -0
  53. package/dist/chunks/{importer-e3huMZbm.js → importer-CyVZTrf0.js} +14 -10
  54. package/dist/chunks/importer-CyVZTrf0.js.map +1 -0
  55. package/dist/chunks/{importer-CVT-JyDE.js → importer-DgG4v1Ms.js} +1537 -355
  56. package/dist/chunks/importer-DgG4v1Ms.js.map +1 -0
  57. package/dist/chunks/{importer-Cyy6UseH.js → importer-asFUrIsj.js} +66 -13
  58. package/dist/chunks/importer-asFUrIsj.js.map +1 -0
  59. package/dist/chunks/{input-Ccg9I22A.js → input-CAxt_aV-.js} +4 -4
  60. package/dist/chunks/{input-Ccg9I22A.js.map → input-CAxt_aV-.js.map} +1 -1
  61. package/dist/chunks/{json-elements-By172SVq.js → json-elements-Cq76WjnZ.js} +4 -4
  62. package/dist/chunks/{json-elements-By172SVq.js.map → json-elements-Cq76WjnZ.js.map} +1 -1
  63. package/dist/chunks/{lexicon-u2SI5xcx.js → lexicon-IVRq2Uoo.js} +282 -74
  64. package/dist/chunks/lexicon-IVRq2Uoo.js.map +1 -0
  65. package/dist/chunks/{ontology-export-BwgMyuF0.js → ontology-export-OMo91mb0.js} +4 -4
  66. package/dist/chunks/{ontology-export-BwgMyuF0.js.map → ontology-export-OMo91mb0.js.map} +1 -1
  67. package/dist/chunks/{records-Cgvxz-Vx.js → records-NJiYvekn.js} +2 -2
  68. package/dist/chunks/{records-Cgvxz-Vx.js.map → records-NJiYvekn.js.map} +1 -1
  69. package/dist/chunks/{report-CgdsL9Hb.js → report-CwMfYa9J.js} +23 -23
  70. package/dist/chunks/{report-CgdsL9Hb.js.map → report-CwMfYa9J.js.map} +1 -1
  71. package/dist/chunks/round-trip-Cy3_SHRZ.js +79 -0
  72. package/dist/chunks/round-trip-Cy3_SHRZ.js.map +1 -0
  73. package/dist/chunks/{sigv4-LkAzsLAu.js → sigv4-BXwVbza3.js} +5 -5
  74. package/dist/chunks/sigv4-BXwVbza3.js.map +1 -0
  75. package/dist/chunks/{styles-CaABMoO1.js → styles-CAVmBLgp.js} +1237 -138
  76. package/dist/chunks/styles-CAVmBLgp.js.map +1 -0
  77. package/dist/chunks/styles-CPczw1Jz.js +1928 -0
  78. package/dist/chunks/styles-CPczw1Jz.js.map +1 -0
  79. package/dist/chunks/styles-boK6Ln54.js +2847 -0
  80. package/dist/chunks/styles-boK6Ln54.js.map +1 -0
  81. package/dist/chunks/{styles-yed-Cs1nmrjn.js → styles-yed-XeFBQ6VS.js} +506 -175
  82. package/dist/chunks/styles-yed-XeFBQ6VS.js.map +1 -0
  83. package/dist/chunks/{text-BuKQVMz2.js → text-ystE2bYi.js} +2 -2
  84. package/dist/chunks/{text-BuKQVMz2.js.map → text-ystE2bYi.js.map} +1 -1
  85. package/dist/csv.js +7 -7
  86. package/dist/cx.js +2 -2
  87. package/dist/cx2.js +2 -2
  88. package/dist/cys.js +1 -1
  89. package/dist/dot.js +8 -4
  90. package/dist/dot.js.map +1 -1
  91. package/dist/gexf.js +42 -12
  92. package/dist/gexf.js.map +1 -1
  93. package/dist/gml.js +848 -194
  94. package/dist/gml.js.map +1 -1
  95. package/dist/graph-io.js +230 -193
  96. package/dist/graph-io.js.map +1 -1
  97. package/dist/graphml.js +3 -3
  98. package/dist/json.js +3 -2
  99. package/dist/neo4j.js +6 -6
  100. package/dist/obo.js +1 -1
  101. package/dist/pajek.js +1 -1
  102. package/dist/positions.js +45 -3
  103. package/dist/positions.js.map +1 -1
  104. package/dist/sources-cypher.js +141 -23
  105. package/dist/sources-cypher.js.map +1 -1
  106. package/dist/sources-ndex.js +2 -2
  107. package/dist/sources-rest.js +32 -6
  108. package/dist/sources-rest.js.map +1 -1
  109. package/dist/sources-sparql.d.ts +1 -0
  110. package/dist/sources-sparql.js +439 -0
  111. package/dist/sources-sparql.js.map +1 -0
  112. package/dist/src/formats/cx/importer.d.ts.map +1 -1
  113. package/dist/src/formats/cx/importer.js +5 -1
  114. package/dist/src/formats/cx/importer.js.map +1 -1
  115. package/dist/src/formats/cx/styles.d.ts +24 -1
  116. package/dist/src/formats/cx/styles.d.ts.map +1 -1
  117. package/dist/src/formats/cx/styles.js +117 -11
  118. package/dist/src/formats/cx/styles.js.map +1 -1
  119. package/dist/src/formats/cx2/importer.d.ts.map +1 -1
  120. package/dist/src/formats/cx2/importer.js +1 -0
  121. package/dist/src/formats/cx2/importer.js.map +1 -1
  122. package/dist/src/formats/cx2/styles.d.ts.map +1 -1
  123. package/dist/src/formats/cx2/styles.js +3 -1
  124. package/dist/src/formats/cx2/styles.js.map +1 -1
  125. package/dist/src/formats/cys/importer.d.ts.map +1 -1
  126. package/dist/src/formats/cys/importer.js +1 -0
  127. package/dist/src/formats/cys/importer.js.map +1 -1
  128. package/dist/src/formats/cys/styles.d.ts +2 -0
  129. package/dist/src/formats/cys/styles.d.ts.map +1 -1
  130. package/dist/src/formats/cys/styles.js +15 -7
  131. package/dist/src/formats/cys/styles.js.map +1 -1
  132. package/dist/src/formats/dot/drawing.d.ts +98 -0
  133. package/dist/src/formats/dot/drawing.d.ts.map +1 -0
  134. package/dist/src/formats/dot/drawing.js +734 -0
  135. package/dist/src/formats/dot/drawing.js.map +1 -0
  136. package/dist/src/formats/dot/exporter.d.ts.map +1 -1
  137. package/dist/src/formats/dot/exporter.js +34 -2
  138. package/dist/src/formats/dot/exporter.js.map +1 -1
  139. package/dist/src/formats/dot/importer.d.ts +6 -1
  140. package/dist/src/formats/dot/importer.d.ts.map +1 -1
  141. package/dist/src/formats/dot/importer.js +170 -33
  142. package/dist/src/formats/dot/importer.js.map +1 -1
  143. package/dist/src/formats/dot/index.d.ts +3 -1
  144. package/dist/src/formats/dot/index.d.ts.map +1 -1
  145. package/dist/src/formats/dot/index.js +2 -1
  146. package/dist/src/formats/dot/index.js.map +1 -1
  147. package/dist/src/formats/dot/label-places.d.ts +41 -0
  148. package/dist/src/formats/dot/label-places.d.ts.map +1 -0
  149. package/dist/src/formats/dot/label-places.js +185 -0
  150. package/dist/src/formats/dot/label-places.js.map +1 -0
  151. package/dist/src/formats/dot/names.d.ts +13 -0
  152. package/dist/src/formats/dot/names.d.ts.map +1 -1
  153. package/dist/src/formats/dot/names.js +13 -0
  154. package/dist/src/formats/dot/names.js.map +1 -1
  155. package/dist/src/formats/dot/record.d.ts +50 -0
  156. package/dist/src/formats/dot/record.d.ts.map +1 -0
  157. package/dist/src/formats/dot/record.js +275 -0
  158. package/dist/src/formats/dot/record.js.map +1 -0
  159. package/dist/src/formats/dot/styles.d.ts +72 -2
  160. package/dist/src/formats/dot/styles.d.ts.map +1 -1
  161. package/dist/src/formats/dot/styles.js +1500 -119
  162. package/dist/src/formats/dot/styles.js.map +1 -1
  163. package/dist/src/formats/gexf/dialog-metrics.d.ts +15 -0
  164. package/dist/src/formats/gexf/dialog-metrics.d.ts.map +1 -0
  165. package/dist/src/formats/gexf/dialog-metrics.js +59 -0
  166. package/dist/src/formats/gexf/dialog-metrics.js.map +1 -0
  167. package/dist/src/formats/gexf/importer.d.ts +7 -0
  168. package/dist/src/formats/gexf/importer.d.ts.map +1 -1
  169. package/dist/src/formats/gexf/importer.js +41 -5
  170. package/dist/src/formats/gexf/importer.js.map +1 -1
  171. package/dist/src/formats/gexf/preview.d.ts +77 -0
  172. package/dist/src/formats/gexf/preview.d.ts.map +1 -0
  173. package/dist/src/formats/gexf/preview.js +191 -0
  174. package/dist/src/formats/gexf/preview.js.map +1 -0
  175. package/dist/src/formats/gexf/schema.d.ts.map +1 -1
  176. package/dist/src/formats/gexf/schema.js +2 -1
  177. package/dist/src/formats/gexf/schema.js.map +1 -1
  178. package/dist/src/formats/gexf/styles.d.ts +58 -31
  179. package/dist/src/formats/gexf/styles.d.ts.map +1 -1
  180. package/dist/src/formats/gexf/styles.js +848 -225
  181. package/dist/src/formats/gexf/styles.js.map +1 -1
  182. package/dist/src/formats/gml/importer.d.ts +5 -2
  183. package/dist/src/formats/gml/importer.d.ts.map +1 -1
  184. package/dist/src/formats/gml/importer.js +258 -71
  185. package/dist/src/formats/gml/importer.js.map +1 -1
  186. package/dist/src/formats/gml/index.d.ts +1 -1
  187. package/dist/src/formats/gml/index.d.ts.map +1 -1
  188. package/dist/src/formats/gml/index.js +1 -1
  189. package/dist/src/formats/gml/index.js.map +1 -1
  190. package/dist/src/formats/gml/positions.d.ts +7 -0
  191. package/dist/src/formats/gml/positions.d.ts.map +1 -1
  192. package/dist/src/formats/gml/positions.js +29 -7
  193. package/dist/src/formats/gml/positions.js.map +1 -1
  194. package/dist/src/formats/gml/styles.d.ts.map +1 -1
  195. package/dist/src/formats/gml/styles.js +754 -102
  196. package/dist/src/formats/gml/styles.js.map +1 -1
  197. package/dist/src/formats/graphml/styles-plain.d.ts.map +1 -1
  198. package/dist/src/formats/graphml/styles-plain.js +6 -10
  199. package/dist/src/formats/graphml/styles-plain.js.map +1 -1
  200. package/dist/src/formats/graphml/styles-yed.d.ts +21 -15
  201. package/dist/src/formats/graphml/styles-yed.d.ts.map +1 -1
  202. package/dist/src/formats/graphml/styles-yed.js +695 -164
  203. package/dist/src/formats/graphml/styles-yed.js.map +1 -1
  204. package/dist/src/formats/graphml/styles-yfiles3.d.ts +1 -1
  205. package/dist/src/formats/graphml/styles-yfiles3.d.ts.map +1 -1
  206. package/dist/src/formats/graphml/styles-yfiles3.js +431 -64
  207. package/dist/src/formats/graphml/styles-yfiles3.js.map +1 -1
  208. package/dist/src/formats/graphml/yfiles.d.ts +3 -3
  209. package/dist/src/formats/graphml/yfiles.d.ts.map +1 -1
  210. package/dist/src/formats/graphml/yfiles.js +16 -6
  211. package/dist/src/formats/graphml/yfiles.js.map +1 -1
  212. package/dist/src/formats/json/dialect.d.ts +3 -2
  213. package/dist/src/formats/json/dialect.d.ts.map +1 -1
  214. package/dist/src/formats/json/dialect.js +39 -5
  215. package/dist/src/formats/json/dialect.js.map +1 -1
  216. package/dist/src/formats/json/importer.d.ts +13 -2
  217. package/dist/src/formats/json/importer.d.ts.map +1 -1
  218. package/dist/src/formats/json/importer.js +42 -6
  219. package/dist/src/formats/json/importer.js.map +1 -1
  220. package/dist/src/formats/json/index.d.ts +1 -1
  221. package/dist/src/formats/json/index.d.ts.map +1 -1
  222. package/dist/src/formats/json/index.js +1 -1
  223. package/dist/src/formats/json/index.js.map +1 -1
  224. package/dist/src/formats/json/positions.d.ts +5 -2
  225. package/dist/src/formats/json/positions.d.ts.map +1 -1
  226. package/dist/src/formats/json/positions.js +20 -4
  227. package/dist/src/formats/json/positions.js.map +1 -1
  228. package/dist/src/formats/json/styles.d.ts +12 -1
  229. package/dist/src/formats/json/styles.d.ts.map +1 -1
  230. package/dist/src/formats/json/styles.js +1843 -136
  231. package/dist/src/formats/json/styles.js.map +1 -1
  232. package/dist/src/formats/pajek/draw.d.ts +104 -0
  233. package/dist/src/formats/pajek/draw.d.ts.map +1 -0
  234. package/dist/src/formats/pajek/draw.js +382 -0
  235. package/dist/src/formats/pajek/draw.js.map +1 -0
  236. package/dist/src/formats/pajek/exporter.d.ts.map +1 -1
  237. package/dist/src/formats/pajek/exporter.js +70 -51
  238. package/dist/src/formats/pajek/exporter.js.map +1 -1
  239. package/dist/src/formats/pajek/importer.d.ts +9 -0
  240. package/dist/src/formats/pajek/importer.d.ts.map +1 -1
  241. package/dist/src/formats/pajek/importer.js +233 -102
  242. package/dist/src/formats/pajek/importer.js.map +1 -1
  243. package/dist/src/formats/pajek/index.d.ts +1 -0
  244. package/dist/src/formats/pajek/index.d.ts.map +1 -1
  245. package/dist/src/formats/pajek/index.js.map +1 -1
  246. package/dist/src/formats/pajek/styles.d.ts +15 -7
  247. package/dist/src/formats/pajek/styles.d.ts.map +1 -1
  248. package/dist/src/formats/pajek/styles.js +1395 -114
  249. package/dist/src/formats/pajek/styles.js.map +1 -1
  250. package/dist/src/formats/pajek/syntax.d.ts +10 -1
  251. package/dist/src/formats/pajek/syntax.d.ts.map +1 -1
  252. package/dist/src/formats/pajek/syntax.js +26 -2
  253. package/dist/src/formats/pajek/syntax.js.map +1 -1
  254. package/dist/src/formats/xgmml/emit.d.ts +1 -0
  255. package/dist/src/formats/xgmml/emit.d.ts.map +1 -1
  256. package/dist/src/formats/xgmml/emit.js +65 -5
  257. package/dist/src/formats/xgmml/emit.js.map +1 -1
  258. package/dist/src/formats/xgmml/styles.d.ts +23 -3
  259. package/dist/src/formats/xgmml/styles.d.ts.map +1 -1
  260. package/dist/src/formats/xgmml/styles.js +277 -60
  261. package/dist/src/formats/xgmml/styles.js.map +1 -1
  262. package/dist/src/index.d.ts +6 -5
  263. package/dist/src/index.d.ts.map +1 -1
  264. package/dist/src/index.js +6 -5
  265. package/dist/src/index.js.map +1 -1
  266. package/dist/src/positions/convert.d.ts.map +1 -1
  267. package/dist/src/positions/convert.js +11 -1
  268. package/dist/src/positions/convert.js.map +1 -1
  269. package/dist/src/positions/extract.d.ts.map +1 -1
  270. package/dist/src/positions/extract.js +53 -1
  271. package/dist/src/positions/extract.js.map +1 -1
  272. package/dist/src/positions/index.d.ts +1 -1
  273. package/dist/src/positions/index.d.ts.map +1 -1
  274. package/dist/src/positions/types.d.ts +59 -0
  275. package/dist/src/positions/types.d.ts.map +1 -1
  276. package/dist/src/sources/builtins.d.ts +1 -1
  277. package/dist/src/sources/builtins.d.ts.map +1 -1
  278. package/dist/src/sources/builtins.js +8 -2
  279. package/dist/src/sources/builtins.js.map +1 -1
  280. package/dist/src/sources/context.d.ts.map +1 -1
  281. package/dist/src/sources/context.js +1 -0
  282. package/dist/src/sources/context.js.map +1 -1
  283. package/dist/src/sources/credentials.d.ts +50 -1
  284. package/dist/src/sources/credentials.d.ts.map +1 -1
  285. package/dist/src/sources/credentials.js +69 -0
  286. package/dist/src/sources/credentials.js.map +1 -1
  287. package/dist/src/sources/cypher/descriptor.d.ts.map +1 -1
  288. package/dist/src/sources/cypher/descriptor.js +5 -0
  289. package/dist/src/sources/cypher/descriptor.js.map +1 -1
  290. package/dist/src/sources/cypher/index.d.ts.map +1 -1
  291. package/dist/src/sources/cypher/index.js +125 -18
  292. package/dist/src/sources/cypher/index.js.map +1 -1
  293. package/dist/src/sources/cypher/params.d.ts +1 -1
  294. package/dist/src/sources/cypher/params.d.ts.map +1 -1
  295. package/dist/src/sources/cypher/query-builder.d.ts +17 -0
  296. package/dist/src/sources/cypher/query-builder.d.ts.map +1 -1
  297. package/dist/src/sources/cypher/query-builder.js +31 -0
  298. package/dist/src/sources/cypher/query-builder.js.map +1 -1
  299. package/dist/src/sources/ids.d.ts +5 -0
  300. package/dist/src/sources/ids.d.ts.map +1 -1
  301. package/dist/src/sources/ids.js +5 -0
  302. package/dist/src/sources/ids.js.map +1 -1
  303. package/dist/src/sources/params.d.ts +3 -0
  304. package/dist/src/sources/params.d.ts.map +1 -1
  305. package/dist/src/sources/rest/descriptor.d.ts.map +1 -1
  306. package/dist/src/sources/rest/descriptor.js +9 -0
  307. package/dist/src/sources/rest/descriptor.js.map +1 -1
  308. package/dist/src/sources/rest/openalex.d.ts +4 -2
  309. package/dist/src/sources/rest/openalex.d.ts.map +1 -1
  310. package/dist/src/sources/rest/openalex.js +4 -2
  311. package/dist/src/sources/rest/openalex.js.map +1 -1
  312. package/dist/src/sources/rest/source.d.ts.map +1 -1
  313. package/dist/src/sources/rest/source.js +38 -0
  314. package/dist/src/sources/rest/source.js.map +1 -1
  315. package/dist/src/sources/run.d.ts +2 -0
  316. package/dist/src/sources/run.d.ts.map +1 -1
  317. package/dist/src/sources/run.js +30 -3
  318. package/dist/src/sources/run.js.map +1 -1
  319. package/dist/src/sources/sigv4.d.ts +5 -3
  320. package/dist/src/sources/sigv4.d.ts.map +1 -1
  321. package/dist/src/sources/sigv4.js +6 -4
  322. package/dist/src/sources/sigv4.js.map +1 -1
  323. package/dist/src/sources/sparql/descriptor.d.ts +10 -0
  324. package/dist/src/sources/sparql/descriptor.d.ts.map +1 -0
  325. package/dist/src/sources/sparql/descriptor.js +64 -0
  326. package/dist/src/sources/sparql/descriptor.js.map +1 -0
  327. package/dist/src/sources/sparql/index.d.ts +28 -0
  328. package/dist/src/sources/sparql/index.d.ts.map +1 -0
  329. package/dist/src/sources/sparql/index.js +327 -0
  330. package/dist/src/sources/sparql/index.js.map +1 -0
  331. package/dist/src/sources/sparql/ntriples.d.ts +69 -0
  332. package/dist/src/sources/sparql/ntriples.d.ts.map +1 -0
  333. package/dist/src/sources/sparql/ntriples.js +180 -0
  334. package/dist/src/sources/sparql/ntriples.js.map +1 -0
  335. package/dist/src/sources/sparql/params.d.ts +27 -0
  336. package/dist/src/sources/sparql/params.d.ts.map +1 -0
  337. package/dist/src/sources/sparql/params.js +5 -0
  338. package/dist/src/sources/sparql/params.js.map +1 -0
  339. package/dist/src/sources/sparql/query.d.ts +73 -0
  340. package/dist/src/sources/sparql/query.d.ts.map +1 -0
  341. package/dist/src/sources/sparql/query.js +164 -0
  342. package/dist/src/sources/sparql/query.js.map +1 -0
  343. package/dist/src/sources/types.d.ts +60 -0
  344. package/dist/src/sources/types.d.ts.map +1 -1
  345. package/dist/src/styles/annotations.d.ts +61 -5
  346. package/dist/src/styles/annotations.d.ts.map +1 -1
  347. package/dist/src/styles/annotations.js +130 -22
  348. package/dist/src/styles/annotations.js.map +1 -1
  349. package/dist/src/styles/canon/bends.d.ts +46 -0
  350. package/dist/src/styles/canon/bends.d.ts.map +1 -1
  351. package/dist/src/styles/canon/bends.js +123 -0
  352. package/dist/src/styles/canon/bends.js.map +1 -1
  353. package/dist/src/styles/canon/color-tables.d.ts +6 -1
  354. package/dist/src/styles/canon/color-tables.d.ts.map +1 -1
  355. package/dist/src/styles/canon/color-tables.js +10 -4
  356. package/dist/src/styles/canon/color-tables.js.map +1 -1
  357. package/dist/src/styles/canon/color.d.ts +3 -1
  358. package/dist/src/styles/canon/color.d.ts.map +1 -1
  359. package/dist/src/styles/canon/color.js +103 -3
  360. package/dist/src/styles/canon/color.js.map +1 -1
  361. package/dist/src/styles/canon/enums.d.ts +2 -2
  362. package/dist/src/styles/canon/enums.d.ts.map +1 -1
  363. package/dist/src/styles/canon/enums.js +89 -7
  364. package/dist/src/styles/canon/enums.js.map +1 -1
  365. package/dist/src/styles/canon/graphviz.d.ts +12 -3
  366. package/dist/src/styles/canon/graphviz.d.ts.map +1 -1
  367. package/dist/src/styles/canon/graphviz.js +57 -9
  368. package/dist/src/styles/canon/graphviz.js.map +1 -1
  369. package/dist/src/styles/canon/number.d.ts +8 -0
  370. package/dist/src/styles/canon/number.d.ts.map +1 -1
  371. package/dist/src/styles/canon/number.js +18 -0
  372. package/dist/src/styles/canon/number.js.map +1 -1
  373. package/dist/src/styles/canon/text.d.ts +29 -2
  374. package/dist/src/styles/canon/text.d.ts.map +1 -1
  375. package/dist/src/styles/canon/text.js +156 -16
  376. package/dist/src/styles/canon/text.js.map +1 -1
  377. package/dist/src/styles/codes.d.ts +2 -0
  378. package/dist/src/styles/codes.d.ts.map +1 -1
  379. package/dist/src/styles/codes.js +2 -0
  380. package/dist/src/styles/codes.js.map +1 -1
  381. package/dist/src/styles/cyjs/cascade.d.ts.map +1 -1
  382. package/dist/src/styles/cyjs/cascade.js +1139 -79
  383. package/dist/src/styles/cyjs/cascade.js.map +1 -1
  384. package/dist/src/styles/cyjs/defaults-table.d.ts.map +1 -1
  385. package/dist/src/styles/cyjs/defaults-table.js +4 -0
  386. package/dist/src/styles/cyjs/defaults-table.js.map +1 -1
  387. package/dist/src/styles/cyjs/emit.d.ts.map +1 -1
  388. package/dist/src/styles/cyjs/emit.js +232 -10
  389. package/dist/src/styles/cyjs/emit.js.map +1 -1
  390. package/dist/src/styles/cyjs/face.d.ts +20 -0
  391. package/dist/src/styles/cyjs/face.d.ts.map +1 -0
  392. package/dist/src/styles/cyjs/face.js +332 -0
  393. package/dist/src/styles/cyjs/face.js.map +1 -0
  394. package/dist/src/styles/cyjs/mappers.d.ts +44 -1
  395. package/dist/src/styles/cyjs/mappers.d.ts.map +1 -1
  396. package/dist/src/styles/cyjs/mappers.js +475 -26
  397. package/dist/src/styles/cyjs/mappers.js.map +1 -1
  398. package/dist/src/styles/cyjs/routes.d.ts +53 -0
  399. package/dist/src/styles/cyjs/routes.d.ts.map +1 -0
  400. package/dist/src/styles/cyjs/routes.js +360 -0
  401. package/dist/src/styles/cyjs/routes.js.map +1 -0
  402. package/dist/src/styles/cytoscape/charts.d.ts +23 -0
  403. package/dist/src/styles/cytoscape/charts.d.ts.map +1 -0
  404. package/dist/src/styles/cytoscape/charts.js +560 -0
  405. package/dist/src/styles/cytoscape/charts.js.map +1 -0
  406. package/dist/src/styles/cytoscape/emit.d.ts.map +1 -1
  407. package/dist/src/styles/cytoscape/emit.js +156 -48
  408. package/dist/src/styles/cytoscape/emit.js.map +1 -1
  409. package/dist/src/styles/cytoscape/lexicon.d.ts +91 -3
  410. package/dist/src/styles/cytoscape/lexicon.d.ts.map +1 -1
  411. package/dist/src/styles/cytoscape/lexicon.js +387 -77
  412. package/dist/src/styles/cytoscape/lexicon.js.map +1 -1
  413. package/dist/src/styles/cytoscape/mappings.d.ts +30 -0
  414. package/dist/src/styles/cytoscape/mappings.d.ts.map +1 -1
  415. package/dist/src/styles/cytoscape/mappings.js +92 -0
  416. package/dist/src/styles/cytoscape/mappings.js.map +1 -1
  417. package/dist/src/styles/cytoscape/resolve.d.ts +42 -2
  418. package/dist/src/styles/cytoscape/resolve.d.ts.map +1 -1
  419. package/dist/src/styles/cytoscape/resolve.js +623 -17
  420. package/dist/src/styles/cytoscape/resolve.js.map +1 -1
  421. package/dist/src/styles/defaults.d.ts +46 -26
  422. package/dist/src/styles/defaults.d.ts.map +1 -1
  423. package/dist/src/styles/defaults.js +308 -71
  424. package/dist/src/styles/defaults.js.map +1 -1
  425. package/dist/src/styles/index.d.ts +4 -3
  426. package/dist/src/styles/index.d.ts.map +1 -1
  427. package/dist/src/styles/index.js +3 -2
  428. package/dist/src/styles/index.js.map +1 -1
  429. package/dist/src/styles/internal.d.ts +1 -0
  430. package/dist/src/styles/internal.d.ts.map +1 -1
  431. package/dist/src/styles/internal.js +1 -0
  432. package/dist/src/styles/internal.js.map +1 -1
  433. package/dist/src/styles/io/generic.d.ts.map +1 -1
  434. package/dist/src/styles/io/generic.js +56 -16
  435. package/dist/src/styles/io/generic.js.map +1 -1
  436. package/dist/src/styles/io/round-trip.d.ts +56 -0
  437. package/dist/src/styles/io/round-trip.d.ts.map +1 -0
  438. package/dist/src/styles/io/round-trip.js +138 -0
  439. package/dist/src/styles/io/round-trip.js.map +1 -0
  440. package/dist/src/styles/io/writer.d.ts.map +1 -1
  441. package/dist/src/styles/io/writer.js +6 -1
  442. package/dist/src/styles/io/writer.js.map +1 -1
  443. package/dist/src/styles/notes.d.ts.map +1 -1
  444. package/dist/src/styles/notes.js +1 -0
  445. package/dist/src/styles/notes.js.map +1 -1
  446. package/dist/src/styles/plan/features.d.ts +1 -1
  447. package/dist/src/styles/plan/features.d.ts.map +1 -1
  448. package/dist/src/styles/plan/features.js +22 -2
  449. package/dist/src/styles/plan/features.js.map +1 -1
  450. package/dist/src/styles/plan/index.d.ts +1 -1
  451. package/dist/src/styles/plan/index.d.ts.map +1 -1
  452. package/dist/src/styles/plan/index.js +1 -1
  453. package/dist/src/styles/plan/index.js.map +1 -1
  454. package/dist/src/styles/plan/plan.d.ts.map +1 -1
  455. package/dist/src/styles/plan/plan.js +61 -4
  456. package/dist/src/styles/plan/plan.js.map +1 -1
  457. package/dist/src/styles/plan/resolve.d.ts +11 -0
  458. package/dist/src/styles/plan/resolve.d.ts.map +1 -1
  459. package/dist/src/styles/plan/resolve.js +40 -4
  460. package/dist/src/styles/plan/resolve.js.map +1 -1
  461. package/dist/src/styles/slots.d.ts +14 -0
  462. package/dist/src/styles/slots.d.ts.map +1 -0
  463. package/dist/src/styles/slots.js +20 -0
  464. package/dist/src/styles/slots.js.map +1 -0
  465. package/dist/src/styles/types.d.ts +687 -6
  466. package/dist/src/styles/types.d.ts.map +1 -1
  467. package/dist/src/styles/vocabulary.d.ts +3 -2
  468. package/dist/src/styles/vocabulary.d.ts.map +1 -1
  469. package/dist/src/styles/vocabulary.js +224 -0
  470. package/dist/src/styles/vocabulary.js.map +1 -1
  471. package/dist/styles.js +30 -239
  472. package/dist/styles.js.map +1 -1
  473. package/dist/xgmml.js +3 -3
  474. package/package.json +27 -7
  475. package/src/formats/cx/importer.ts +6 -1
  476. package/src/formats/cx/styles.ts +143 -9
  477. package/src/formats/cx2/importer.ts +1 -0
  478. package/src/formats/cx2/styles.ts +3 -1
  479. package/src/formats/cys/importer.ts +1 -0
  480. package/src/formats/cys/styles.ts +27 -5
  481. package/src/formats/dot/drawing.ts +799 -0
  482. package/src/formats/dot/exporter.ts +37 -1
  483. package/src/formats/dot/importer.ts +192 -36
  484. package/src/formats/dot/index.ts +3 -1
  485. package/src/formats/dot/label-places.ts +241 -0
  486. package/src/formats/dot/names.ts +15 -0
  487. package/src/formats/dot/record.ts +336 -0
  488. package/src/formats/dot/styles.ts +1702 -149
  489. package/src/formats/gexf/dialog-metrics.ts +61 -0
  490. package/src/formats/gexf/importer.ts +50 -5
  491. package/src/formats/gexf/preview.ts +217 -0
  492. package/src/formats/gexf/schema.ts +2 -1
  493. package/src/formats/gexf/styles.ts +1099 -245
  494. package/src/formats/gml/importer.ts +291 -76
  495. package/src/formats/gml/index.ts +1 -1
  496. package/src/formats/gml/positions.ts +29 -7
  497. package/src/formats/gml/styles.ts +852 -110
  498. package/src/formats/graphml/styles-plain.ts +6 -15
  499. package/src/formats/graphml/styles-yed.ts +765 -176
  500. package/src/formats/graphml/styles-yfiles3.ts +487 -63
  501. package/src/formats/graphml/yfiles.ts +19 -6
  502. package/src/formats/json/dialect.ts +41 -5
  503. package/src/formats/json/importer.ts +59 -7
  504. package/src/formats/json/index.ts +1 -0
  505. package/src/formats/json/positions.ts +22 -5
  506. package/src/formats/json/styles.ts +2123 -171
  507. package/src/formats/pajek/draw.ts +469 -0
  508. package/src/formats/pajek/exporter.ts +81 -49
  509. package/src/formats/pajek/importer.ts +278 -103
  510. package/src/formats/pajek/index.ts +1 -0
  511. package/src/formats/pajek/styles.ts +1506 -133
  512. package/src/formats/pajek/syntax.ts +27 -2
  513. package/src/formats/xgmml/emit.ts +73 -5
  514. package/src/formats/xgmml/styles.ts +330 -71
  515. package/src/index.ts +12 -1
  516. package/src/positions/convert.ts +12 -1
  517. package/src/positions/extract.ts +55 -1
  518. package/src/positions/index.ts +1 -0
  519. package/src/positions/types.ts +60 -0
  520. package/src/sources/builtins.ts +8 -1
  521. package/src/sources/context.ts +1 -0
  522. package/src/sources/credentials.ts +90 -1
  523. package/src/sources/cypher/descriptor.ts +7 -1
  524. package/src/sources/cypher/index.ts +149 -18
  525. package/src/sources/cypher/params.ts +1 -1
  526. package/src/sources/cypher/query-builder.ts +33 -0
  527. package/src/sources/ids.ts +6 -0
  528. package/src/sources/params.ts +3 -0
  529. package/src/sources/rest/descriptor.ts +9 -0
  530. package/src/sources/rest/openalex.ts +4 -2
  531. package/src/sources/rest/source.ts +41 -0
  532. package/src/sources/run.ts +35 -3
  533. package/src/sources/sigv4.ts +6 -4
  534. package/src/sources/sparql/descriptor.ts +67 -0
  535. package/src/sources/sparql/index.ts +371 -0
  536. package/src/sources/sparql/ntriples.ts +219 -0
  537. package/src/sources/sparql/params.ts +28 -0
  538. package/src/sources/sparql/query.ts +216 -0
  539. package/src/sources/types.ts +68 -0
  540. package/src/styles/annotations.ts +201 -27
  541. package/src/styles/canon/bends.ts +137 -0
  542. package/src/styles/canon/color-tables.ts +10 -4
  543. package/src/styles/canon/color.ts +105 -3
  544. package/src/styles/canon/enums.ts +107 -8
  545. package/src/styles/canon/graphviz.ts +71 -10
  546. package/src/styles/canon/number.ts +19 -0
  547. package/src/styles/canon/text.ts +187 -16
  548. package/src/styles/codes.ts +2 -0
  549. package/src/styles/cyjs/cascade.ts +1303 -84
  550. package/src/styles/cyjs/defaults-table.ts +4 -0
  551. package/src/styles/cyjs/emit.ts +268 -14
  552. package/src/styles/cyjs/face.ts +372 -0
  553. package/src/styles/cyjs/mappers.ts +506 -27
  554. package/src/styles/cyjs/routes.ts +432 -0
  555. package/src/styles/cytoscape/charts.ts +684 -0
  556. package/src/styles/cytoscape/emit.ts +170 -48
  557. package/src/styles/cytoscape/lexicon.ts +431 -78
  558. package/src/styles/cytoscape/mappings.ts +108 -0
  559. package/src/styles/cytoscape/resolve.ts +741 -17
  560. package/src/styles/defaults.ts +417 -108
  561. package/src/styles/index.ts +5 -0
  562. package/src/styles/internal.ts +1 -0
  563. package/src/styles/io/generic.ts +79 -23
  564. package/src/styles/io/round-trip.ts +202 -0
  565. package/src/styles/io/writer.ts +6 -1
  566. package/src/styles/notes.ts +1 -0
  567. package/src/styles/plan/features.ts +23 -2
  568. package/src/styles/plan/index.ts +1 -1
  569. package/src/styles/plan/plan.ts +69 -5
  570. package/src/styles/plan/resolve.ts +47 -4
  571. package/src/styles/slots.ts +25 -0
  572. package/src/styles/types.ts +698 -5
  573. package/src/styles/vocabulary.ts +232 -2
  574. package/dist/chunks/block-Cu22ewuS.js.map +0 -1
  575. package/dist/chunks/choose-Cdx6Enl2.js +0 -57
  576. package/dist/chunks/choose-Cdx6Enl2.js.map +0 -1
  577. package/dist/chunks/codes-CV_Bhcyi.js.map +0 -1
  578. package/dist/chunks/convert-BcQ8_jMo.js.map +0 -1
  579. package/dist/chunks/credentials-BiQsnMTb.js.map +0 -1
  580. package/dist/chunks/descriptor-BJ-W0Jd-.js.map +0 -1
  581. package/dist/chunks/emit-CD8xnY8s.js.map +0 -1
  582. package/dist/chunks/export-CZ7VRm4I.js.map +0 -1
  583. package/dist/chunks/exporter-bxxjOrDZ.js.map +0 -1
  584. package/dist/chunks/format-BMS-1Nxb.js +0 -64
  585. package/dist/chunks/format-BMS-1Nxb.js.map +0 -1
  586. package/dist/chunks/generic-CP6YD34u.js.map +0 -1
  587. package/dist/chunks/importer-B87_fmVx.js.map +0 -1
  588. package/dist/chunks/importer-CB_zV5_L.js.map +0 -1
  589. package/dist/chunks/importer-CVT-JyDE.js.map +0 -1
  590. package/dist/chunks/importer-Cyy6UseH.js.map +0 -1
  591. package/dist/chunks/importer-DPZDN40-.js.map +0 -1
  592. package/dist/chunks/importer-e3huMZbm.js.map +0 -1
  593. package/dist/chunks/lexicon-u2SI5xcx.js.map +0 -1
  594. package/dist/chunks/sigv4-LkAzsLAu.js.map +0 -1
  595. package/dist/chunks/styles-CaABMoO1.js.map +0 -1
  596. package/dist/chunks/styles-P_gmFAOi.js +0 -770
  597. package/dist/chunks/styles-P_gmFAOi.js.map +0 -1
  598. package/dist/chunks/styles-yed-Cs1nmrjn.js.map +0 -1
  599. package/dist/chunks/writer-DvHTl36J.js +0 -449
  600. package/dist/chunks/writer-DvHTl36J.js.map +0 -1
@@ -49,38 +49,11 @@ export type ToolDerivedDefault =
49
49
  readonly source: string;
50
50
  }
51
51
  | {
52
- /**
53
- * An edge with no color of its own takes the mean of its two nodes' colors, each channel rounded down
54
- * (Gephi Preview's "mixed" edge color).
55
- */
52
+ /** An edge with no color of its own takes the mix of its two end nodes' colors (Gephi's EdgeColor MIXED). */
56
53
  readonly kind: "colorFromEndNodes";
57
54
  /** Where the default is stated. */
58
55
  readonly source: string;
59
56
  }
60
- | {
61
- /**
62
- * A node with no border of its own gets a border of its fill with each channel times `darken`, `widthFactor`
63
- * times its width wide (Gephi Preview's "darker" border, scaled with the node).
64
- */
65
- readonly kind: "borderFromFill";
66
- /** What each color channel of the fill is multiplied by. */
67
- readonly darken: number;
68
- /** The border's width as a share of the node's width. */
69
- readonly widthFactor: number;
70
- /** Where the default is stated. */
71
- readonly source: string;
72
- }
73
- | {
74
- /**
75
- * A node with no label size of its own gets a label size of its width times `factor` (Gephi Preview's
76
- * proportional label size).
77
- */
78
- readonly kind: "labelSizeFromWidth";
79
- /** The label size per unit of the node's width. */
80
- readonly factor: number;
81
- /** Where the default is stated. */
82
- readonly source: string;
83
- }
84
57
  | {
85
58
  /** An edge with no width of its own is drawn as thick as its weight (1 for an edge with no weight, or a weight of 0 or below). */
86
59
  readonly kind: "widthFromWeight";
@@ -115,6 +88,59 @@ export interface ToolDefaults {
115
88
  readonly graph: ToolDefaultValues<GraphStyleValues>;
116
89
  /** Defaults that are rules, applied above the constants. */
117
90
  readonly derived: readonly ToolDerivedDefault[];
91
+ /**
92
+ * The largest corner radius, in `units`, the program draws on a rounded rectangle whose file gives none. Not a
93
+ * node default: it only bounds the rounding of the shape the file names, so no rule carries it and no writer has
94
+ * to hold it.
95
+ */
96
+ readonly roundedCornerRadius?: ToolDefaultValue<number>;
97
+ /**
98
+ * How big the program draws its filled triangle arrowhead, which it sizes from the line width and its own size
99
+ * setting rather than from the neutral `arrowSize` alone. Not an edge default: the size follows from two
100
+ * properties, so no rule carries it. Absent for a program whose arrowheads graph-io has not measured.
101
+ */
102
+ readonly arrowhead?: ToolArrowhead;
103
+ /**
104
+ * Whether the program draws a node's `borderWidth` in screen pixels, the same at every zoom, rather than as a
105
+ * length that grows and shrinks with the drawing: vis-network divides it by its view's scale. Not a node default:
106
+ * it says how every node's border width is read, so no rule carries it. Absent, a border width is a length.
107
+ */
108
+ readonly nodeBorderOnScreen?: ToolDefaultValue<boolean>;
109
+ }
110
+
111
+ /**
112
+ * How a program sizes its filled triangle arrowhead, in its `units`.
113
+ * @category Styles
114
+ */
115
+ export interface ToolArrowhead {
116
+ /**
117
+ * The arrowhead's length along its line.
118
+ * @param arrowSize - the edge's neutral `arrowSize` (1 is the program's normal size)
119
+ * @param width - the edge's line width
120
+ * @returns the length
121
+ */
122
+ readonly length: (arrowSize: number, width: number) => number;
123
+ /** Its width across the line as a fraction of its length, which its diamond shares. */
124
+ readonly aspect: number;
125
+ /**
126
+ * Another arrow shape's length along its line as a fraction of the triangle's, and its width as a fraction of
127
+ * its own length, where they differ.
128
+ */
129
+ readonly shapes?: Readonly<
130
+ Partial<
131
+ Record<
132
+ StyleArrowShape,
133
+ {
134
+ /** The shape's length along its line, as a fraction of the triangle's. */
135
+ readonly length: number;
136
+ /** Its width across the line as a fraction of its own length; unset, the triangle's. */
137
+ readonly aspect?: number;
138
+ }
139
+ >
140
+ >
141
+ >;
142
+ /** Where the rule is stated or measured. */
143
+ readonly source: string;
118
144
  }
119
145
 
120
146
  /**
@@ -129,6 +155,9 @@ function v<V>(value: V, source: string): ToolDefaultValue<V> {
129
155
 
130
156
  const CY = "cytoscape-impl vizmap-gui-impl default_vizmap.xml, style default, line";
131
157
  const CYL = "cytoscape-api BasicVisualLexicon.java line";
158
+ /** Cytoscape desktop's zigzag and sine-wave strokes: both swing 10 px and repeat every 20 px. */
159
+ const CY_WAVE =
160
+ "cytoscape-impl ding-presentation-impl 3.10.5 org.cytoscape.ding.impl.strokes: ZigzagStroke (amplitude 10, a turn every 10) and SineWaveStroke (amplitude 10, wavelength 20)";
132
161
  const CYJS = "cytoscape.js 3.34.3 dist/cytoscape.cjs.js line";
133
162
  const GV = "graphviz.org/docs/attrs";
134
163
  const YED_QA = "yEd Q&A, How can I change the default nodes and/or default edges";
@@ -138,14 +167,86 @@ const YED_BG = "yFiles for Java 2.19 DefaultBackgroundRenderer API docs";
138
167
  const Y3 = "yFiles for HTML API docs,";
139
168
  const GEPHI = "gephi master 92e503df61a7";
140
169
  const VIS = "vis-network 10.1.2 vis-network.esm.js";
170
+ const VIS9 = "vis-network 9.1.9 standalone/umd/vis-network.js";
141
171
  const SIGMA = "sigma 3.0.3 packages/sigma/src";
142
- const GEXFJS = "github.com/raphv/gexf-js ebfd2a7213d3 js/gexfjs.js";
172
+ const SIGMA4 = "sigma 4.0.1 dist/types-d8ce3382.esm.js";
143
173
  const PAJEK = "Pajek 6.02 reference manual";
144
- const PAJEK_SHAPES =
145
- "the SHAPES.CFG Pajek writes when none exists (DrawEPS.htm), " +
146
- "github.com/ohshane/radical-clustering 0f568f67893558035868b3db1bf365870ba52f6b shapes.cfg, SHAPE ELLIPSE";
147
174
  const OGDF = "ogdf master 1a40505ac006";
175
+ const OGDF_SVG =
176
+ "OGDF 2025.10 GraphIO::drawSVG with its default SVGSettings (graph-io/test/fidelity/oracles/gml-specimen-labels-p5.svg: ";
148
177
  const NX = "networkx 6da4704cbf32 networkx/drawing/nx_pylab.py line";
178
+ const MEASURED = "measured in the program's own SVG export (graph-io/test/fidelity/oracles/";
179
+ const PAJEK_SVG = `${MEASURED}pajek-`;
180
+
181
+ /**
182
+ * Cytoscape desktop draws an arrow `EDGE_*_ARROW_SIZE` (6 by default, the neutral arrowSize 1) plus the line width
183
+ * across, a DELTA twice as long, a square, a circle and a half arrow as long as that, and a T bar as wide as the
184
+ * DELTA is long and a tenth of that deep: measured on cx-ndex-90f78bcd (width 1), cx2-u2os-hierarchy (width 2),
185
+ * cx2-signor-aml and cx2-syn-bypass (widths 1 and 7).
186
+ */
187
+ const CYTOSCAPE_ARROWHEAD: ToolArrowhead = {
188
+ length: (size, width) => 2 * (6 * size + width),
189
+ aspect: 0.5,
190
+ shapes: {
191
+ square: { length: 0.5, aspect: 1 },
192
+ circle: { length: 0.5, aspect: 1 },
193
+ "circle-open": { length: 0.5, aspect: 1 },
194
+ // HALF_TOP's barb: 1.135 long and 1 to one side of its line
195
+ half: { length: 0.5675, aspect: 0.881 },
196
+ "other:half-bottom": { length: 0.5675, aspect: 0.881 },
197
+ tee: { length: 0.1, aspect: 10 },
198
+ // a square's outline, and a half circle (half a CIRCLE deep, as wide)
199
+ "other:open-square": { length: 0.5, aspect: 1 },
200
+ "other:half-circle": { length: 0.25, aspect: 2 },
201
+ "other:open-half-circle": { length: 0.25, aspect: 2 },
202
+ },
203
+ source: `${MEASURED}cx-ndex-90f78bcd, cx2-u2os-hierarchy, cx2-signor-aml, cx2-syn-bypass, cx-syn-mappings: each arrow's unit glyph), Cytoscape 3.10.5`,
204
+ };
205
+
206
+ /**
207
+ * Cytoscape desktop draws a node's outline its size less its border's width across and strokes the border along it,
208
+ * so the border's outer edge is the node's size: a 40 x 40 HEXAGON with a border of 1 is a 39-wide path.
209
+ */
210
+ /** Cytoscape desktop draws a curved edge through its handles, and the loops it adds itself, through their midpoints. */
211
+ const CYTOSCAPE_BEND_CURVE = v(
212
+ "midpoints",
213
+ "cytoscape-impl ding-presentation-impl GraphGraphics.java computeCubicPolyEdgePath (cubic pieces between the handles' midpoints, controls pulled toward each handle by CURVE_ELLIPTICAL)",
214
+ );
215
+
216
+ /**
217
+ * Cytoscape desktop draws a label's background box round its words alone: as wide as the text and one line tall,
218
+ * the font's ascent plus descent (1.164 of a DejaVu Sans font's size), which is also the step between its lines.
219
+ */
220
+ const CYTOSCAPE_LABEL_BOX = `${MEASURED}xgmml-specimen-labels: label-background-* boxes and the captions' two lines), Cytoscape 3.10.5`;
221
+ const CYTOSCAPE_LABEL_PADDING = v(0, CYTOSCAPE_LABEL_BOX);
222
+ const CYTOSCAPE_LABEL_LINE_HEIGHT = v(1, CYTOSCAPE_LABEL_BOX);
223
+
224
+ const CYTOSCAPE_BORDER_INSIDE = v<"inside">(
225
+ "inside",
226
+ `${MEASURED}cx2-repro-shared-interaction, cys-luad-vest-v2, cx2-synthetic-lethal), Cytoscape 3.10.5`,
227
+ );
228
+
229
+ /**
230
+ * draw.io draws a yEd or yFiles file's arrows `endSize` 6 plus the line width long and as wide; yEd itself could not
231
+ * be run, so draw.io's drawing stands in.
232
+ */
233
+ const DRAWIO_ARROWHEAD: ToolArrowhead = {
234
+ length: (size, width) => 6 * size + width,
235
+ aspect: 1,
236
+ source: `${MEASURED}graphml-*, draw.io 32.4.1 standing in for yEd)`,
237
+ };
238
+
239
+ /**
240
+ * The largest corner radius of a rounded rectangle whose file gives none, in the program's units. Cytoscape.js is the
241
+ * one program that publishes its rule (`getRoundRectangleRadius`); the others draw barely rounded corners too, so they
242
+ * get the same 8, and a 513 x 453 group keeps small corners instead of a quarter of its side.
243
+ * @param tool - the program, when it is not Cytoscape.js and so states no radius of its own
244
+ * @returns the default
245
+ */
246
+ function cornerCap(tool?: string): ToolDefaultValue<number> {
247
+ const rule = `${CYJS} 4386`;
248
+ return v(8, tool === undefined ? rule : `${rule} (Cytoscape.js's rule; ${tool} states none)`);
249
+ }
149
250
 
150
251
  /**
151
252
  * The defaults of every program graph-io recognizes as a file's writer, by tool id.
@@ -158,6 +259,8 @@ export const TOOL_DEFAULTS: ReadonlyMap<StyleTool, ToolDefaults> = new Map<Style
158
259
  tool: "cytoscape",
159
260
  version: "cytoscape-impl develop 6c63e97c5152 (3.11)",
160
261
  units: "px",
262
+ roundedCornerRadius: cornerCap("cytoscape"),
263
+ arrowhead: CYTOSCAPE_ARROWHEAD,
161
264
  node: {
162
265
  fill: v("#89d0f5", `${CY} 382`),
163
266
  fillOpacity: v(1, `${CY} 383`),
@@ -167,29 +270,44 @@ export const TOOL_DEFAULTS: ReadonlyMap<StyleTool, ToolDefaults> = new Map<Style
167
270
  borderColor: v("#cccccc", `${CY} 392`),
168
271
  borderWidth: v(0, `${CY} 350`),
169
272
  borderStyle: v("solid", `${CY} 366`),
273
+ borderPosition: CYTOSCAPE_BORDER_INSIDE,
274
+ borderWaveAmplitude: v(10, CY_WAVE),
275
+ borderWavePeriod: v(20, CY_WAVE),
170
276
  labelColor: v("#000000", `${CY} 395`),
171
- labelFont: v("sans-serif", `${CY} 370`),
277
+ labelFont: v("DejaVu Sans, sans-serif", `${CY} 370 (SansSerif, drawn in Java's face for it)`),
172
278
  labelWeight: v("normal", `${CY} 370`),
173
279
  labelItalic: v(false, `${CY} 370`),
174
280
  labelSize: v(12, `${CY} 371`),
281
+ labelWrapWidth: v(200, `${CY} 372`),
282
+ labelWrapTrailingSpace: v(
283
+ true,
284
+ `${MEASURED}cx-ndex-90f78bcd: each word is measured with the space after it), Cytoscape 3.10.5`,
285
+ ),
175
286
  labelPosition: v("center", `${CY} 380`),
287
+ labelPadding: CYTOSCAPE_LABEL_PADDING,
288
+ labelLineHeight: CYTOSCAPE_LABEL_LINE_HEIGHT,
176
289
  },
177
290
  edge: {
178
291
  color: v("#848484", `${CY} 431`),
179
292
  width: v(2, `${CY} 417`),
180
293
  lineStyle: v("solid", `${CY} 438`),
294
+ waveAmplitude: v(10, CY_WAVE),
295
+ wavePeriod: v(20, CY_WAVE),
181
296
  opacity: v(1, `${CY} 423`),
182
297
  sourceArrow: v("none", `${CY} 437`),
183
298
  targetArrow: v("none", `${CY} 428`),
184
299
  sourceArrowColor: v("#000000", `${CY} 432`),
185
300
  targetArrowColor: v("#000000", `${CY} 432`),
186
301
  labelColor: v("#000000", `${CY} 415`),
187
- labelFont: v("sans-serif", `${CY} 439`),
302
+ labelFont: v("DejaVu Sans, sans-serif", `${CY} 439 (SansSerif, drawn in Java's face for it)`),
188
303
  labelWeight: v("normal", `${CY} 439`),
189
304
  labelItalic: v(false, `${CY} 439`),
190
305
  labelSize: v(10, `${CY} 439`),
306
+ labelPadding: CYTOSCAPE_LABEL_PADDING,
307
+ labelLineHeight: CYTOSCAPE_LABEL_LINE_HEIGHT,
191
308
  // EDGE_CURVED is true there, but it only rounds an edge's bends: an edge without bends is straight
192
309
  curved: v(false, `${CY} 422`),
310
+ bendCurve: CYTOSCAPE_BEND_CURVE,
193
311
  },
194
312
  graph: { background: v("#ffffff", `${CY} 335`) },
195
313
  derived: [{ kind: "labelFromColumn", column: "name", source: `${CY} 406-408` }],
@@ -198,6 +316,8 @@ export const TOOL_DEFAULTS: ReadonlyMap<StyleTool, ToolDefaults> = new Map<Style
198
316
  tool: "cytoscape-fallbacks",
199
317
  version: "cytoscape-api develop (3.11)",
200
318
  units: "px",
319
+ roundedCornerRadius: cornerCap("cytoscape-fallbacks"),
320
+ arrowhead: CYTOSCAPE_ARROWHEAD,
201
321
  node: {
202
322
  fill: v("#c80000", `${CYL} 83`),
203
323
  fillOpacity: v(1, `${CYL} 273`),
@@ -206,24 +326,39 @@ export const TOOL_DEFAULTS: ReadonlyMap<StyleTool, ToolDefaults> = new Map<Style
206
326
  height: v(40, `${CYL} 163`),
207
327
  borderColor: v("#000000", `${CYL} 230`),
208
328
  borderWidth: v(2, `${CYL} 54`),
329
+ borderPosition: CYTOSCAPE_BORDER_INSIDE,
330
+ borderWaveAmplitude: v(10, CY_WAVE),
331
+ borderWavePeriod: v(20, CY_WAVE),
209
332
  labelColor: v("#000000", `${CYL} 91`),
210
- labelFont: v("sans-serif", `${CYL} 255`),
333
+ labelFont: v("DejaVu Sans, sans-serif", `${CYL} 255 (SansSerif, drawn in Java's face for it)`),
211
334
  labelWeight: v("normal", `${CYL} 255`),
212
335
  labelItalic: v(false, `${CYL} 255`),
213
336
  labelSize: v(12, `${CYL} 55`),
337
+ labelWrapWidth: v(200, `${CYL} 196`),
338
+ labelWrapTrailingSpace: v(
339
+ true,
340
+ `${MEASURED}cx-ndex-90f78bcd: each word is measured with the space after it), Cytoscape 3.10.5`,
341
+ ),
214
342
  labelPosition: v("center", `${CYL} 205`),
343
+ labelPadding: CYTOSCAPE_LABEL_PADDING,
344
+ labelLineHeight: CYTOSCAPE_LABEL_LINE_HEIGHT,
215
345
  },
216
346
  edge: {
217
347
  color: v("#404040", `${CYL} 469`),
218
348
  width: v(1, `${CYL} 368`),
219
349
  lineStyle: v("solid", `${CYL} 392`),
350
+ waveAmplitude: v(10, CY_WAVE),
351
+ wavePeriod: v(20, CY_WAVE),
220
352
  sourceArrow: v("none", `${CYL} 487`),
221
353
  targetArrow: v("none", `${CYL} 493`),
222
354
  labelColor: v("#000000", `${CYL} 327`),
223
- labelFont: v("sans-serif", `${CYL} 408`),
355
+ labelFont: v("DejaVu Sans, sans-serif", `${CYL} 408 (SansSerif, drawn in Java's face for it)`),
224
356
  labelWeight: v("normal", `${CYL} 408`),
225
357
  labelItalic: v(false, `${CYL} 408`),
226
358
  labelSize: v(10, `${CYL} 416`),
359
+ labelPadding: CYTOSCAPE_LABEL_PADDING,
360
+ labelLineHeight: CYTOSCAPE_LABEL_LINE_HEIGHT,
361
+ bendCurve: CYTOSCAPE_BEND_CURVE,
227
362
  },
228
363
  graph: { background: v("#ffffff", `${CYL} 667`) },
229
364
  derived: [],
@@ -232,6 +367,22 @@ export const TOOL_DEFAULTS: ReadonlyMap<StyleTool, ToolDefaults> = new Map<Style
232
367
  tool: "cytoscape-js",
233
368
  version: "cytoscape.js 3.34.3",
234
369
  units: "px",
370
+ roundedCornerRadius: cornerCap(),
371
+ arrowhead: {
372
+ // getArrowWidth, and the triangle's points at +-0.15, -0.3 of it
373
+ length: (size, width) => 0.3 * Math.max((width * 13.37) ** 0.9, 29) * size,
374
+ aspect: 1,
375
+ // a tee is 0.1 of the arrow width deep, the triangle 0.3 long; triangle-tee reaches back to its bar
376
+ // at 0.5, circle-triangle to 0.6 and triangle-cross to its cross line at 0.4 plus the line's width
377
+ shapes: {
378
+ tee: { length: 1 / 3, aspect: 3 },
379
+ "other:triangle-tee": { length: 5 / 3, aspect: 0.6 },
380
+ "other:triangle-cross": { length: 1.5, aspect: 0.66 },
381
+ "other:circle-triangle": { length: 2, aspect: 0.5 },
382
+ "other:chevron": { length: 2 / 3, aspect: 1.5 },
383
+ },
384
+ source: `${CYJS} 23497 (getArrowWidth), 22714-22716 (triangle), 22813-22814 (tee), 22627 (arrowShapeWidth)`,
385
+ },
235
386
  node: {
236
387
  fill: v("#999999", `${CYJS} 18536`),
237
388
  fillOpacity: v(1, `${CYJS} 18538`),
@@ -241,17 +392,42 @@ export const TOOL_DEFAULTS: ReadonlyMap<StyleTool, ToolDefaults> = new Map<Style
241
392
  borderColor: v("#000000", `${CYJS} 18555`),
242
393
  borderWidth: v(0, `${CYJS} 18557`),
243
394
  borderStyle: v("solid", `${CYJS} 18558`),
395
+ borderPosition: v("center", `${CYJS} 18563`),
396
+ outerBorderColor: v("#999999", `${CYJS} 18564`),
397
+ // the underlay and the overlay draw nothing until an opacity is set; then these
398
+ underlayColor: v("#000000", `${CYJS} 18524`),
399
+ underlayPadding: v(10, `${CYJS} 18525`),
400
+ underlayShape: v("round-rectangle", `${CYJS} 18526`),
401
+ overlayColor: v("#000000", `${CYJS} 18519`),
402
+ overlayPadding: v(10, `${CYJS} 18520`),
403
+ overlayShape: v("round-rectangle", `${CYJS} 18521`),
244
404
  opacity: v(1, `${CYJS} 18503`),
245
405
  labelColor: v("#000000", `${CYJS} 18474`),
246
406
  labelSize: v(16, `${CYJS} 18496`),
247
407
  labelFont: v("Helvetica Neue, Helvetica, sans-serif", `${CYJS} 18493`),
248
408
  labelWeight: v("normal", `${CYJS} 18495`),
249
409
  labelPosition: v("top", `${CYJS} 18470-18471`),
410
+ // text-wrap: wrap measures `subline + word + wordSeparator` against text-max-width; ponytail: a
411
+ // line's last word has no separator there, where graphty counts a space after it too
412
+ labelWrapTrailingSpace: v(true, `${CYJS} 25218`),
250
413
  },
251
414
  edge: {
252
415
  color: v("#999999", `${CYJS} 18639`),
253
416
  sourceArrowColor: v("#999999", `${CYJS} 18639`),
254
417
  targetArrowColor: v("#999999", `${CYJS} 18639`),
418
+ outlineColor: v("#000000", `${CYJS} 18644`),
419
+ underlayColor: v("#000000", `${CYJS} 18524`),
420
+ underlayPadding: v(10, `${CYJS} 18525`),
421
+ overlayColor: v("#000000", `${CYJS} 18519`),
422
+ overlayPadding: v(10, `${CYJS} 18520`),
423
+ gradientKind: v("none", `${CYJS} 18640 (line-fill solid)`),
424
+ midSourceArrowColor: v("#999999", `${CYJS} 18639`),
425
+ midTargetArrowColor: v("#999999", `${CYJS} 18639`),
426
+ // an edge's label is centered on the line's middle (recalculateEdgeLabelProjections)
427
+ labelPosition: v("center", `${CYJS} 24942`),
428
+ // a source or target label is centered on the line where it leaves its node, unless offset
429
+ sourceLabelOffset: v(0, `${CYJS} 18511, 18515`),
430
+ targetLabelOffset: v(0, `${CYJS} 18511, 18515`),
255
431
  width: v(3, `${CYJS} 18711`),
256
432
  lineStyle: v("solid", `${CYJS} 18638`),
257
433
  opacity: v(1, `${CYJS} 18503`),
@@ -259,28 +435,56 @@ export const TOOL_DEFAULTS: ReadonlyMap<StyleTool, ToolDefaults> = new Map<Style
259
435
  targetArrow: v("none", `${CYJS} 18671`),
260
436
  arrowSize: v(1, `${CYJS} 18660`),
261
437
  curved: v(false, `${CYJS} 18658`),
438
+ // control-point-step-size 40: a quadratic's middle is half as far out as its control point
439
+ fanSpacing: v(20, `${CYJS} 18647`),
262
440
  labelColor: v("#000000", `${CYJS} 18474`),
263
441
  labelSize: v(16, `${CYJS} 18496`),
264
442
  labelFont: v("Helvetica Neue, Helvetica, sans-serif", `${CYJS} 18493`),
265
443
  labelWeight: v("normal", `${CYJS} 18495`),
266
444
  },
267
- graph: {},
445
+ graph: {
446
+ // the canvas is cleared to transparent, so the page's default white shows through
447
+ background: v("#ffffff", `${CYJS} 31537 (clearCanvas: clearRect)`),
448
+ },
268
449
  derived: [],
269
450
  },
270
451
  {
271
452
  tool: "graphviz",
272
453
  version: "graphviz main (16.1.0)",
273
454
  units: "px",
455
+ roundedCornerRadius: cornerCap("graphviz"),
456
+ arrowhead: {
457
+ // ARROW_LENGTH 10 and the normal arrow's half width 0.35 of its length
458
+ length: (size) => 10 * size,
459
+ aspect: 0.7,
460
+ // each arrow type's length factor and the half width its arrow_type_* function draws
461
+ shapes: {
462
+ tee: { length: 0.2, aspect: 5 },
463
+ square: { length: 0.8, aspect: 1 },
464
+ diamond: { length: 1.2, aspect: 2 / 3 },
465
+ "diamond-open": { length: 1.2, aspect: 2 / 3 },
466
+ circle: { length: 0.8, aspect: 1 },
467
+ "circle-open": { length: 0.8, aspect: 1 },
468
+ crow: { length: 1, aspect: 0.9 },
469
+ vee: { length: 1, aspect: 0.9 },
470
+ // the arc of curve and icurve, a half circle of radius half the arrow's length across its
471
+ // stem (the stem is the line, carried on to the tip)
472
+ "other:curve": { length: 0.5, aspect: 2 },
473
+ "other:inv-curve": { length: 0.5, aspect: 2 },
474
+ },
475
+ source: "graphviz lib/common/arrows.c (ARROW_LENGTH 10, Arrowtypes lenfact, arrow_type_normal 0.35, arrow_type_crow 0.45, arrow_type_tee, arrow_type_box 0.4, arrow_type_diamond 1/3, arrow_type_dot, arrow_type_curve)",
476
+ },
274
477
  node: {
275
478
  fillOpacity: v(0, `${GV}/style/ (default "", not filled)`),
276
479
  borderColor: v("#000000", `${GV}/color/`),
277
480
  borderWidth: v(1, `${GV}/penwidth/; lib/common/const.h line 77`),
481
+ borderPosition: v("center", `${MEASURED}dot-synth-nodes), Graphviz strokes the node's own outline`),
278
482
  shape: v("ellipse", `${GV}/shape/; lib/common/const.h line 76`),
279
483
  width: v(54, `${GV}/width/ (0.75 inch); lib/common/const.h line 72`),
280
484
  height: v(36, `${GV}/height/ (0.5 inch); lib/common/const.h line 73`),
281
485
  labelColor: v("#000000", `${GV}/fontcolor/`),
282
486
  labelSize: v(14, `${GV}/fontsize/; lib/common/const.h line 61`),
283
- labelFont: v("Times-Roman", `${GV}/fontname/; lib/common/const.h line 67`),
487
+ labelFont: v("Times, serif", `${GV}/fontname/ (Times-Roman); lib/common/const.h line 67`),
284
488
  labelPosition: v("center", `${GV}/labelloc/`),
285
489
  },
286
490
  edge: {
@@ -292,12 +496,12 @@ export const TOOL_DEFAULTS: ReadonlyMap<StyleTool, ToolDefaults> = new Map<Style
292
496
  arrowSize: v(1, `${GV}/arrowsize/`),
293
497
  labelColor: v("#000000", `${GV}/fontcolor/`),
294
498
  labelSize: v(14, `${GV}/fontsize/`),
295
- labelFont: v("Times-Roman", `${GV}/fontname/`),
499
+ labelFont: v("Times, serif", `${GV}/fontname/ (Times-Roman)`),
296
500
  },
297
501
  graph: {
298
502
  background: v(
299
503
  "#ffffff",
300
- `${GV}/bgcolor/ (default none); lib/common/emit.c emit_background: no bgcolor paints white`,
504
+ `${GV}/bgcolor/ (default unset); lib/common/emit.c emit_background (an unset bgcolor paints the page white)`,
301
505
  ),
302
506
  },
303
507
  derived: [
@@ -313,14 +517,17 @@ export const TOOL_DEFAULTS: ReadonlyMap<StyleTool, ToolDefaults> = new Map<Style
313
517
  tool: "yed",
314
518
  version: "yEd / yFiles for Java 2.19",
315
519
  units: "px",
520
+ roundedCornerRadius: cornerCap("yed"),
521
+ arrowhead: DRAWIO_ARROWHEAD,
316
522
  node: {
317
523
  fill: v("#ffcc00", `${YED_QA}; ${YED_CORPUS} of y:Fill color`),
318
524
  shape: v("rectangle", "yFiles for Java 2.19 ShapeNodeRealizer API docs"),
319
525
  borderColor: v("#000000", `${YED_CORPUS} of y:BorderStyle`),
320
526
  borderWidth: v(1, `${YED_CORPUS} of y:BorderStyle`),
321
527
  borderStyle: v("solid", `${YED_CORPUS} of y:BorderStyle`),
528
+ borderPosition: v("center", `${MEASURED}graphml-*, draw.io 32.4.1 standing in for yEd)`),
322
529
  labelColor: v("#000000", `${YED_CORPUS} of y:NodeLabel`),
323
- labelFont: v("Dialog", `${YED_CORPUS} of y:NodeLabel`),
530
+ labelFont: v("DejaVu Sans, sans-serif", `${YED_CORPUS} of y:NodeLabel (Dialog's face)`),
324
531
  labelSize: v(12, `${YED_CORPUS} of y:NodeLabel`),
325
532
  labelWeight: v("normal", `${YED_CORPUS} of y:NodeLabel`),
326
533
  labelPosition: v("center", `${YED_CORPUS} of y:NodeLabel`),
@@ -332,7 +539,7 @@ export const TOOL_DEFAULTS: ReadonlyMap<StyleTool, ToolDefaults> = new Map<Style
332
539
  sourceArrow: v("none", `${YED_EDGE} (defaults to Arrow.NONE)`),
333
540
  targetArrow: v("none", `${YED_EDGE} (defaults to Arrow.NONE)`),
334
541
  labelColor: v("#000000", `${YED_CORPUS} of y:EdgeLabel`),
335
- labelFont: v("Dialog", `${YED_CORPUS} of y:EdgeLabel`),
542
+ labelFont: v("DejaVu Sans, sans-serif", `${YED_CORPUS} of y:EdgeLabel (Dialog's face)`),
336
543
  labelSize: v(12, `${YED_CORPUS} of y:EdgeLabel`),
337
544
  },
338
545
  graph: {
@@ -347,14 +554,24 @@ export const TOOL_DEFAULTS: ReadonlyMap<StyleTool, ToolDefaults> = new Map<Style
347
554
  tool: "yfiles3",
348
555
  version: "yFiles for HTML (API docs retrieved 2026-10-11)",
349
556
  units: "px",
557
+ roundedCornerRadius: cornerCap("yfiles3"),
558
+ arrowhead: DRAWIO_ARROWHEAD,
350
559
  node: {
351
560
  fill: v("#ffffff", `${Y3} ShapeNodeStyle fill`),
352
561
  borderColor: v("#000000", `${Y3} ShapeNodeStyle stroke`),
353
562
  borderWidth: v(1, `${Y3} ShapeNodeStyle stroke`),
563
+ borderPosition: v(
564
+ "center",
565
+ `${MEASURED}graphml-yfiles-html-*, draw.io 32.4.1 standing in for yFiles)`,
566
+ ),
354
567
  shape: v("rectangle", `${Y3} ShapeNodeStyle shape`),
355
568
  labelColor: v("#000000", `${Y3} LabelStyle textFill`),
356
569
  labelFont: v("Arial", `${Y3} LabelStyle font`),
357
570
  labelSize: v(12, `${Y3} LabelStyle font`),
571
+ labelPosition: v(
572
+ "center",
573
+ `${Y3} IGraph.nodeDefaults labels layoutParameter (InteriorLabelModel center)`,
574
+ ),
358
575
  },
359
576
  edge: {
360
577
  color: v("#000000", `${Y3} PolylineEdgeStyle stroke`),
@@ -365,76 +582,58 @@ export const TOOL_DEFAULTS: ReadonlyMap<StyleTool, ToolDefaults> = new Map<Style
365
582
  labelFont: v("Arial", `${Y3} LabelStyle font`),
366
583
  labelSize: v(12, `${Y3} LabelStyle font`),
367
584
  },
368
- graph: {},
585
+ graph: {
586
+ background: v("#ffffff", `${Y3} GraphComponent (a transparent canvas over the page's white)`),
587
+ },
369
588
  derived: [],
370
589
  },
371
590
  {
372
591
  tool: "gephi",
373
592
  version: "gephi 0.11.4-SNAPSHOT",
374
593
  units: "relative",
594
+ roundedCornerRadius: cornerCap("gephi"),
595
+ arrowhead: {
596
+ length: (size, width) => 3.25 * width * size,
597
+ aspect: 0.9,
598
+ source: `${MEASURED}gexf-synth-nx-viz, widths 1 to 4), Gephi Toolkit 0.11.3`,
599
+ },
375
600
  node: {
376
601
  fill: v("#000000", "gephi/graphstore a4c790b2343e NodeImpl.java line 322"),
377
- width: v(10, `${GEPHI} AbstractProcessor.java lines 195-198`),
378
- height: v(10, `${GEPHI} AbstractProcessor.java lines 195-198`),
602
+ width: v(20, `${GEPHI} AbstractProcessor.java lines 195-198 (size 10 is a radius)`),
603
+ height: v(20, `${GEPHI} AbstractProcessor.java lines 195-198 (size 10 is a radius)`),
379
604
  shape: v("ellipse", "GEXF 1.3 viz shape default disc; Preview NodeRenderer"),
380
- opacity: v(1, `${GEPHI} DefaultPreset.java line 87 (NODE_OPACITY 100)`),
381
- // Preview hides labels (DefaultPreset.java line 106) and so does the Overview (VizConfig.java
382
- // line 113); graph-io shows them as sigma.js and gexf-js do (see formats/gexf/styles.ts), in
383
- // the color and font Gephi gives a label it shows
384
- labelColor: v("#000000", `${GEPHI} DefaultPreset.java line 91 (DependantOriginalColor(BLACK))`),
385
- labelFont: v("Arial", `${GEPHI} DefaultPreset.java line 93 (Arial plain 12)`),
386
- // the size of a size-10 node's label; Preview scales it with the node (labelSizeFromWidth below)
387
- labelSize: v(12, `${GEPHI} DefaultPreset.java line 93 (Arial plain 12)`),
605
+ borderPosition: v(
606
+ "inside",
607
+ `${MEASURED}gexf-specimen-node-fills-borders-p3), Gephi Toolkit 0.11.3: the border is stroked on a circle of radius size - border / 2`,
608
+ ),
388
609
  labelPosition: v(
389
610
  "center",
390
611
  `${GEPHI} NodeLabelRenderer.java (a label is drawn centered on its node)`,
391
612
  ),
392
- },
393
- edge: {
394
- curved: v(
613
+ // a node drawn under another still shows its label (gexf-cns-wos n5 under n109: "Borner, K")
614
+ labelOnTop: v(
395
615
  true,
396
- `${GEPHI} DefaultPreset.java line 66 (EDGE_CURVED true); EdgeRenderer.java line 117`,
616
+ `${GEPHI} PreviewController (the node label items are drawn after every node); Gephi Toolkit 0.11.3 SVG export: g#node-labels after g#nodes`,
397
617
  ),
618
+ },
619
+ edge: {
398
620
  sourceArrow: v("none", `${GEPHI} DefaultPreset.java line 62`),
399
621
  targetArrow: v("none", `${GEPHI} DefaultPreset.java line 62`),
400
- // the vocabulary's 1 is the tool's normal arrow: Preview's ARROW_SIZE 3, drawn 3 times the edge's
401
- // weight long, as Cytoscape.js's arrow-scale 1 scales with the edge's width
402
- arrowSize: v(
403
- 1,
404
- `${GEPHI} DefaultPreset.java line 62 (ARROW_SIZE 3); EdgeRenderer.java lines 255-256 (times the weight)`,
622
+ curved: v(true, `${GEPHI} DefaultPreset.java (EDGE_CURVED true); Gephi Toolkit 0.11.3 SVG export`),
623
+ fanned: v(
624
+ false,
625
+ `${GEPHI} EdgeRenderer.java (each curved edge bows left of its own direction, siblings ignored); Gephi Toolkit 0.11.3 SVG export`,
626
+ ),
627
+ arcRadius: v(
628
+ 1 / 1.2,
629
+ `${GEPHI} EdgeRenderer.java (CurvedEdgeRenderer: an arc through both node centers of radius length / ARC_CURVENESS, default 1.2)`,
405
630
  ),
406
- opacity: v(1, `${GEPHI} DefaultPreset.java line 71 (EDGE_OPACITY 100)`),
407
631
  },
408
632
  graph: { background: v("#ffffff", `${GEPHI} VizConfig.java line 111`) },
409
633
  derived: [
410
- {
411
- kind: "labelFromColumn",
412
- column: "label",
413
- source: `${SIGMA}/settings.ts lines 119-126 (renderLabels); ${GEXFJS} lines 1019-1040`,
414
- },
415
634
  {
416
635
  kind: "colorFromEndNodes",
417
- source:
418
- `${GEPHI} DefaultPreset.java line 65 (EdgeColor.Mode.MIXED); ` +
419
- "PreviewAPI types/EdgeColor.java lines 89-93",
420
- },
421
- {
422
- kind: "borderFromFill",
423
- darken: 0.498,
424
- widthFactor: 0.08,
425
- source:
426
- `${GEPHI} DefaultPreset.java lines 84, 86 (DependantColor DARKER, NODE_BORDER_FIXED false); ` +
427
- "PreviewAPI types/DependantColor.java lines 55, 85-86; Utils ColorUtils.java lines 22-34; " +
428
- "PreviewPlugin renderers/SizeUtils.java lines 11, 33-38 (0.16 x size / 2 of a node drawn " +
429
- "size x 2 wide, builders/NodeBuilder.java line 65)",
430
- },
431
- {
432
- kind: "labelSizeFromWidth",
433
- factor: 1.2,
434
- source:
435
- `${GEPHI} DefaultPreset.java lines 93, 98 (Arial 12, NODE_LABEL_PROPORTIONAL_SIZE true); ` +
436
- "PreviewPlugin renderers/NodeLabelRenderer.java lines 165-173 (12 x the node drawn size x 2 " +
437
- "wide x 0.05, builders/NodeBuilder.java line 65)",
636
+ source: `${GEPHI} DefaultPreset.java (EDGE_COLOR EdgeColor.Mode.MIXED); Gephi Toolkit 0.11.3 SVG export`,
438
637
  },
439
638
  {
440
639
  kind: "widthFromWeight",
@@ -451,26 +650,62 @@ export const TOOL_DEFAULTS: ReadonlyMap<StyleTool, ToolDefaults> = new Map<Style
451
650
  tool: "vis-network",
452
651
  version: "vis-network 10.1.2",
453
652
  units: "px",
653
+ roundedCornerRadius: cornerCap("vis-network"),
654
+ arrowhead: {
655
+ // EdgeBase.getArrowData: 15 * scaleFactor + 3 * width; ArrowHead's points at -1, +-0.3
656
+ length: (size, width) => 15 * size + 3 * width,
657
+ aspect: 0.6,
658
+ // its bar is 0.15 of the arrow's length deep and as wide as the arrow is long; its box is 0.6 of the
659
+ // length square, its circle 0.8 of the length across, and its curve and inv_curve arcs have a
660
+ // radius of 0.4 of it
661
+ shapes: {
662
+ tee: { length: 0.15, aspect: 1 / 0.15 },
663
+ square: { length: 0.6, aspect: 1 },
664
+ circle: { length: 0.8, aspect: 1 },
665
+ "other:curve": { length: 0.4, aspect: 2 },
666
+ "other:inv-curve": { length: 0.4, aspect: 2 },
667
+ },
668
+ source: `${VIS} EdgeBase.getArrowData, ArrowHead, Bar, Box, Circle, Curve, InvertedCurve (measured on json-vis-unix, json-vis-world, json-vis-synth)`,
669
+ },
670
+ nodeBorderOnScreen: v(
671
+ true,
672
+ `${VIS9} NodeBase.initContextForDraw and performStroke: borderWidth / view.scale, at most the node's width`,
673
+ ),
454
674
  node: {
455
675
  fill: v("#97c2fc", `${VIS} lines 32986-33110`),
456
676
  borderColor: v("#2b7ce9", `${VIS} lines 32986-33110`),
457
677
  borderWidth: v(1, `${VIS} lines 32986-33110`),
678
+ // a canvas stroke along the node's own outline, half in and half out (NodeBase.performStroke)
679
+ borderPosition: v("center", `${VIS9} NodeBase.performStroke: ctx.stroke() on the shape's own path`),
458
680
  shape: v("ellipse", `${VIS} lines 32986-33110`),
459
681
  labelColor: v("#343434", `${VIS} lines 32986-33110`),
460
682
  labelSize: v(14, `${VIS} lines 32986-33110`),
461
683
  labelFont: v("arial", `${VIS} lines 32986-33110`),
462
684
  labelPosition: v("center", `${VIS} lines 32986-33110`),
685
+ // Label.draw returns before drawing when the font is under drawThreshold - 1 px on screen
686
+ labelMinScreenSize: v(4, `${VIS9} Label.draw, nodes scaling.label.drawThreshold 5`),
463
687
  },
464
688
  edge: {
465
689
  width: v(1, `${VIS} lines 25160-25290`),
690
+ outlineColor: v("#6f6f6f", `${VIS} lines 25160-25290 (background.color)`),
466
691
  lineStyle: v("solid", `${VIS} lines 25160-25290 (dashes false)`),
467
692
  sourceArrow: v("none", `${VIS} lines 25160-25290`),
468
693
  targetArrow: v("none", `${VIS} lines 25160-25290`),
469
694
  labelColor: v("#343434", `${VIS} lines 25160-25290`),
470
695
  labelSize: v(14, `${VIS} lines 25160-25290`),
471
696
  labelFont: v("arial", `${VIS} lines 25160-25290`),
697
+ labelMinScreenSize: v(4, `${VIS9} Label.draw, edges scaling.label.drawThreshold 5`),
698
+ // an edge label is drawn on the line, its letters stroked white 2 px wide (font.strokeWidth 2)
699
+ labelPosition: v("center", `${VIS9} Edge.drawLabel (the label at the line's middle point)`),
700
+ labelOutlineColor: v("#ffffff", `${VIS} lines 25160-25290 (font.strokeColor)`),
701
+ labelOutlineWidth: v(2, `${VIS} lines 25160-25290 (font.strokeWidth)`),
702
+ },
703
+ graph: {
704
+ background: v(
705
+ "#ffffff",
706
+ "vis-network 9.1.9 vis-network.esm.js line 32378 (clearRect: the page's white shows through)",
707
+ ),
472
708
  },
473
- graph: {},
474
709
  derived: [
475
710
  { kind: "labelFromColumn", column: "label", source: `${VIS} lines 32986-33110` },
476
711
  { kind: "colorFromSourceNode", source: `${VIS} lines 25160-25290 (color.inherit "from")` },
@@ -478,50 +713,107 @@ export const TOOL_DEFAULTS: ReadonlyMap<StyleTool, ToolDefaults> = new Map<Style
478
713
  },
479
714
  {
480
715
  tool: "sigma",
481
- version: "sigma 3.0.3",
716
+ version: "sigma 4.0.1",
482
717
  units: "relative",
718
+ roundedCornerRadius: cornerCap("sigma"),
483
719
  node: {
484
- fill: v("#999999", `${SIGMA}/settings.ts lines 119-126`),
720
+ fill: v("#666666", `${SIGMA4} DEFAULT_NODE_DISPLAY_DATA (color "#666")`),
485
721
  shape: v("ellipse", `${SIGMA}/settings.ts lines 119-126`),
486
- width: v(2, `${SIGMA}/sigma.ts line 76`),
487
- height: v(2, `${SIGMA}/sigma.ts line 76`),
722
+ width: v(20, `${SIGMA4} DEFAULT_NODE_DISPLAY_DATA (size 10 is a radius)`),
723
+ height: v(20, `${SIGMA4} DEFAULT_NODE_DISPLAY_DATA (size 10 is a radius)`),
488
724
  labelColor: v("#000000", `${SIGMA}/settings.ts lines 119-126`),
489
725
  labelFont: v("Arial", `${SIGMA}/settings.ts lines 119-126`),
490
- labelSize: v(14, `${SIGMA}/settings.ts lines 119-126`),
726
+ // sigma 4 sets every node's labelSize to 12 before its styles run; the 14 in sigma.esm.js
727
+ // (`defaultLabelSize`) is only reached by a node whose styles cleared it.
728
+ labelSize: v(12, `${SIGMA4} DEFAULT_NODE_DISPLAY_DATA (labelSize 12)`),
491
729
  labelWeight: v("normal", `${SIGMA}/settings.ts lines 119-126`),
730
+ labelPosition: v("right", `${SIGMA4} DEFAULT_NODE_DISPLAY_DATA (labelPosition "right")`),
731
+ // sigma keeps the largest node's label per 100 px cell of its first framing; it avoids no overlap
732
+ labelGridCellSize: v(
733
+ 100,
734
+ `${SIGMA4} LabelGrid.getLabelsToDisplay (labelDensity 1, labelGridCellSize 100)`,
735
+ ),
736
+ labelOnTop: v(true, `${SIGMA4} labels are drawn by their own program after every node and edge`),
737
+ // a node's label is drawn only while its node's rendered size (a radius) is 6 px or more
738
+ labelMinNodeScreenSize: v(12, `${SIGMA4} renderLabels (labelRenderedSizeThreshold 6, a radius)`),
492
739
  },
493
740
  edge: {
494
741
  color: v("#cccccc", `${SIGMA}/settings.ts lines 119-126`),
495
- width: v(0.5, `${SIGMA}/sigma.ts line 100`),
742
+ // an edge of sigma's default size 1, drawn half as wide as its size (readSigmaRow)
743
+ width: v(0.5, `${SIGMA4} DEFAULT_EDGE_DISPLAY_DATA (size 1)`),
744
+ // an edge label (renderEdgeLabels) is drawn at its line's middle, 12 px, in #666
745
+ labelColor: v("#666666", `${SIGMA4} DEFAULT_EDGE_DISPLAY_DATA (labelColor "#666")`),
746
+ labelSize: v(12, "sigma 4.0.1 dist/sigma.esm.js line 2816 (DEFAULT_EDGE_LABEL_SIZE)"),
747
+ labelPosition: v("center", "sigma 4.0.1 dist/sigma.esm.js line 3647 (the middle of its two ends)"),
496
748
  sourceArrow: v("none", `${SIGMA}/settings.ts lines 119-126 (type line)`),
497
749
  targetArrow: v("none", `${SIGMA}/settings.ts lines 119-126 (type line)`),
750
+ // no edge is drawn thinner on screen, whatever its size (the shader's max(size, minEdgeThickness 1.7),
751
+ // drawn half as wide as a node of that size is in radius, as readSigmaRow halves a size)
752
+ minScreenWidth: v(
753
+ 0.85,
754
+ `${SIGMA4} edge program (pixelsThickness = max(size, minEdgeThickness 1.7))`,
755
+ ),
756
+ },
757
+ graph: {
758
+ background: v(
759
+ "#ffffff",
760
+ "sigma 4.0.1 dist/sigma.esm.js line 5202 (gl.clear to transparent: the page's white shows through)",
761
+ ),
498
762
  },
499
- graph: {},
500
763
  derived: [{ kind: "labelFromColumn", column: "label", source: `${SIGMA}/settings.ts lines 119-126` }],
501
764
  },
502
765
  {
503
766
  tool: "pajek",
504
767
  version: "Pajek 6.02",
505
- units: "relative",
768
+ // PostScript points, the unit of Pajek's EPS and SVG export (formats/pajek/styles.ts)
769
+ units: "px",
770
+ roundedCornerRadius: cornerCap("pajek"),
771
+ // a line's `s` (arrowSize) scales Pajek's arrowhead whatever its width: 6 x s long (tip to its back
772
+ // corners) and 5 x s wide
773
+ arrowhead: {
774
+ length: (size) => 6 * size,
775
+ aspect: 5 / 6,
776
+ source: `${PAJEK_SVG}specimen-arrows: s 0.5, 1, 2, 3 and 5 draw arrowheads 3, 6, 12, 18 and 30 long, 2.5, 5, 10, 15 and 25 wide; football: s 4 and 9)`,
777
+ },
506
778
  node: {
507
779
  shape: v("ellipse", `${PAJEK} p. 85`),
508
780
  opacity: v(1, `${PAJEK} p. 87`),
509
- borderColor: v("#000000", `${PAJEK}, vertex parameter bc (default Black)`),
510
- borderWidth: v(0.2, `${PAJEK}, vertex parameter bw (default 1, against the default vertex size 5)`),
511
- labelColor: v("#000000", `${PAJEK_SHAPES} (lc Black)`),
512
- labelPosition: v("center", `${PAJEK_SHAPES} (lr 0); ${PAJEK} p. 85 (radius 0 is centered)`),
781
+ // Pajek 6.02's own defaults, as its SVG export draws a vertex and label the file gives no
782
+ // parameters for (the manual names these settings but not their values)
783
+ borderColor: v("#660000", `${PAJEK_SVG}football, kdorola: every vertex without bc)`),
784
+ borderWidth: v(0.5, `${PAJEK_SVG}football, kdorola: every vertex without bw)`),
785
+ // an SVG stroke along the vertex's own outline, half in and half out
786
+ borderPosition: v(
787
+ "center",
788
+ `${PAJEK_SVG}specimen-node-fills-borders-p3: bw 8 draws a vertex of size 36 44 across)`,
789
+ ),
790
+ width: v(20, `${PAJEK_SVG}football, iliad: a vertex without s_size, x_fact or y_fact)`),
791
+ height: v(20, `${PAJEK_SVG}football, iliad: a vertex without s_size, x_fact or y_fact)`),
792
+ fill: v("#ffd9bc", `${PAJEK_SVG}football, kdorola: every vertex without ic)`),
793
+ labelColor: v("#ad0000", `${PAJEK_SVG}football, 1crn: every label without lc)`),
794
+ labelSize: v(15, `${PAJEK_SVG}football, 1crn: every label without fos)`),
795
+ labelFont: v("Arial", `${PAJEK_SVG}football, 1crn: every label without font)`),
796
+ labelWeight: v("bold", `${PAJEK_SVG}football, 1crn: every label is bold)`),
797
+ // the text starts 20 from the center at lphi 285 and runs to the right, its baseline through
798
+ // that point: its left edge's middle at 20 cos 285 across and 20 sin 285 less 0.3465 of its
799
+ // size down (formats/pajek/styles.ts readLabelPosition)
800
+ labelPosition: v("center", `${PAJEK_SVG}football, 1crn, specimen-labels: lr 20 lphi 285)`),
801
+ labelOffsetX: v(5.176380902, `${PAJEK_SVG}football, 1crn, specimen-labels: lr 20 lphi 285)`),
802
+ labelOffsetY: v(14.121016526, `${PAJEK_SVG}football, 1crn, specimen-labels: lr 20 lphi 285)`),
803
+ labelShiftX: v(0.5, `${PAJEK_SVG}football, 1crn, specimen-labels: text-anchor start)`),
513
804
  },
514
805
  edge: {
515
- color: v("#000000", `${PAJEK} p. 90`),
516
- // No line width: Pajek's w is read as the file has it, not as a factor of the vertex size as bw is,
517
- // so a default of 1 here, with no vertex size in the file, became the length every other length
518
- // of the drawing was scaled by, and a border 0.2 wide was drawn far too thin to see.
806
+ // an edge (undirected) is drawn twice the width of an arc; the arc rule below sets an arc's
807
+ width: v(2, `${PAJEK_SVG}1crn, lin-rel4, synth-vertices: edges without w; c: w 0.5 drawn 1)`),
808
+ color: v("#007091", `${PAJEK_SVG}1crn, lin-rel4, c: edges without c)`),
519
809
  lineStyle: v("solid", `${PAJEK} p. 90`),
520
810
  opacity: v(1, `${PAJEK} p. 87`),
521
811
  sourceArrow: v("none", `${PAJEK} p. 91`),
522
812
  targetArrow: v("none", `${PAJEK} p. 91 (edges have none)`),
523
813
  },
524
- graph: {},
814
+ graph: {
815
+ background: v("#ffffff", `${PAJEK}, Draw window (assumed: a white background)`),
816
+ },
525
817
  derived: [
526
818
  { kind: "labelFromColumn", column: "label", source: `${PAJEK}, vertex labels (drawn by default)` },
527
819
  { kind: "targetArrowOnDirected", arrow: "triangle", source: `${PAJEK} p. 91 (arcs)` },
@@ -531,6 +823,13 @@ export const TOOL_DEFAULTS: ReadonlyMap<StyleTool, ToolDefaults> = new Map<Style
531
823
  tool: "ogdf",
532
824
  version: "ogdf master 1a40505ac006",
533
825
  units: "px",
826
+ roundedCornerRadius: cornerCap("ogdf"),
827
+ // OGDF's arrowhead is three times its line's width long and half as wide as it is long
828
+ arrowhead: {
829
+ length: (size, width) => 3 * width * size,
830
+ aspect: 0.5,
831
+ source: `${MEASURED}gml-specimen-arrows-p5.svg: lineWidth 1, 1.5 and 3 draw arrowheads 3, 4.5 and 9 long, 1.5, 2.25 and 4.5 wide)`,
832
+ },
534
833
  node: {
535
834
  fill: v("#ffffff", `${OGDF} LayoutStandards.cpp lines 38-45`),
536
835
  shape: v("rectangle", `${OGDF} LayoutStandards.cpp lines 38-45`),
@@ -539,19 +838,29 @@ export const TOOL_DEFAULTS: ReadonlyMap<StyleTool, ToolDefaults> = new Map<Style
539
838
  borderColor: v("#000000", `${OGDF} LayoutStandards.cpp lines 38-45`),
540
839
  borderWidth: v(1, `${OGDF} LayoutStandards.cpp lines 38-45`),
541
840
  borderStyle: v("solid", `${OGDF} LayoutStandards.cpp lines 38-45`),
841
+ // GraphIO::drawSVG's default SVGSettings: every label in one font, centered on its node
842
+ labelColor: v("#000000", `${OGDF_SVG}fill #000000)`),
843
+ labelFont: v("Arial", `${OGDF_SVG}font-family Arial)`),
844
+ labelSize: v(10, `${OGDF_SVG}font-size 10)`),
845
+ labelPosition: v("center", `${OGDF_SVG}text-anchor middle at the node's center)`),
542
846
  },
543
847
  edge: {
544
848
  color: v("#000000", `${OGDF} LayoutStandards.cpp lines 38-45`),
545
849
  width: v(1, `${OGDF} LayoutStandards.cpp lines 38-45`),
546
850
  lineStyle: v("solid", `${OGDF} LayoutStandards.cpp lines 38-45`),
851
+ labelColor: v("#000000", `${OGDF_SVG}fill #000000)`),
852
+ labelFont: v("Arial", `${OGDF_SVG}font-family Arial)`),
853
+ labelSize: v(10, `${OGDF_SVG}font-size 10)`),
854
+ labelPosition: v("center", `${OGDF_SVG}text-anchor middle on the line, dominant-baseline middle)`),
547
855
  },
548
- graph: {},
856
+ graph: { background: v("#ffffff", `${OGDF_SVG}no background: the page's white shows through)`) },
549
857
  derived: [],
550
858
  },
551
859
  {
552
860
  tool: "networkx",
553
861
  version: "networkx 3.7 (main 6da4704cbf32)",
554
862
  units: "px",
863
+ roundedCornerRadius: cornerCap("networkx"),
555
864
  node: {
556
865
  fill: v("#1f78b4", `${NX} 1378`),
557
866
  fillOpacity: v(1, `${NX} 549`),