@contraagent/elements 0.0.0-stage → 0.2.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 (648) hide show
  1. package/README.md +83 -2
  2. package/custom-elements.json +5022 -0
  3. package/dist/charts/bar-chart.d.ts +32 -0
  4. package/dist/charts/bar-chart.d.ts.map +1 -0
  5. package/dist/charts/bar-chart.js +70 -0
  6. package/dist/charts/bar-chart.js.map +1 -0
  7. package/dist/charts/base.d.ts +48 -0
  8. package/dist/charts/base.d.ts.map +1 -0
  9. package/dist/charts/base.js +203 -0
  10. package/dist/charts/base.js.map +1 -0
  11. package/dist/charts/column-chart.d.ts +42 -0
  12. package/dist/charts/column-chart.d.ts.map +1 -0
  13. package/dist/charts/column-chart.js +146 -0
  14. package/dist/charts/column-chart.js.map +1 -0
  15. package/dist/charts/heatmap.d.ts +42 -0
  16. package/dist/charts/heatmap.d.ts.map +1 -0
  17. package/dist/charts/heatmap.js +124 -0
  18. package/dist/charts/heatmap.js.map +1 -0
  19. package/dist/charts/index.d.ts +9 -0
  20. package/dist/charts/index.d.ts.map +1 -0
  21. package/dist/charts/index.js +11 -0
  22. package/dist/charts/index.js.map +1 -0
  23. package/dist/charts/line-chart.d.ts +36 -0
  24. package/dist/charts/line-chart.d.ts.map +1 -0
  25. package/dist/charts/line-chart.js +118 -0
  26. package/dist/charts/line-chart.js.map +1 -0
  27. package/dist/charts/scale.d.ts +32 -0
  28. package/dist/charts/scale.d.ts.map +1 -0
  29. package/dist/charts/scale.js +50 -0
  30. package/dist/charts/scale.js.map +1 -0
  31. package/dist/charts/state-grid.d.ts +64 -0
  32. package/dist/charts/state-grid.d.ts.map +1 -0
  33. package/dist/charts/state-grid.js +223 -0
  34. package/dist/charts/state-grid.js.map +1 -0
  35. package/dist/charts/types.d.ts +34 -0
  36. package/dist/charts/types.d.ts.map +1 -0
  37. package/dist/charts/types.js +11 -0
  38. package/dist/charts/types.js.map +1 -0
  39. package/dist/checks/check-table.d.ts +32 -0
  40. package/dist/checks/check-table.d.ts.map +1 -0
  41. package/dist/checks/check-table.js +94 -0
  42. package/dist/checks/check-table.js.map +1 -0
  43. package/dist/checks/index.d.ts +4 -0
  44. package/dist/checks/index.d.ts.map +1 -0
  45. package/dist/checks/index.js +6 -0
  46. package/dist/checks/index.js.map +1 -0
  47. package/dist/checks/styles.d.ts +5 -0
  48. package/dist/checks/styles.d.ts.map +1 -0
  49. package/dist/checks/styles.js +30 -0
  50. package/dist/checks/styles.js.map +1 -0
  51. package/dist/checks/types.d.ts +35 -0
  52. package/dist/checks/types.d.ts.map +1 -0
  53. package/dist/checks/types.js +12 -0
  54. package/dist/checks/types.js.map +1 -0
  55. package/dist/code/code.d.ts +83 -0
  56. package/dist/code/code.d.ts.map +1 -0
  57. package/dist/code/code.js +206 -0
  58. package/dist/code/code.js.map +1 -0
  59. package/dist/code/highlight.d.ts +25 -0
  60. package/dist/code/highlight.d.ts.map +1 -0
  61. package/dist/code/highlight.js +312 -0
  62. package/dist/code/highlight.js.map +1 -0
  63. package/dist/code/index.d.ts +3 -0
  64. package/dist/code/index.d.ts.map +1 -0
  65. package/dist/code/index.js +5 -0
  66. package/dist/code/index.js.map +1 -0
  67. package/dist/core/clock.d.ts +20 -0
  68. package/dist/core/clock.d.ts.map +1 -0
  69. package/dist/core/clock.js +45 -0
  70. package/dist/core/clock.js.map +1 -0
  71. package/dist/core/define.d.ts +3 -0
  72. package/dist/core/define.d.ts.map +1 -0
  73. package/dist/core/define.js +8 -0
  74. package/dist/core/define.js.map +1 -0
  75. package/dist/core/events.d.ts +78 -0
  76. package/dist/core/events.d.ts.map +1 -0
  77. package/dist/core/events.js +8 -0
  78. package/dist/core/events.js.map +1 -0
  79. package/dist/core/format.d.ts +8 -0
  80. package/dist/core/format.d.ts.map +1 -0
  81. package/dist/core/format.js +28 -0
  82. package/dist/core/format.js.map +1 -0
  83. package/dist/core/frame.d.ts +4 -0
  84. package/dist/core/frame.d.ts.map +1 -0
  85. package/dist/core/frame.js +5 -0
  86. package/dist/core/frame.js.map +1 -0
  87. package/dist/core/strings.d.ts +3 -0
  88. package/dist/core/strings.d.ts.map +1 -0
  89. package/dist/core/strings.js +14 -0
  90. package/dist/core/strings.js.map +1 -0
  91. package/dist/core/tone.d.ts +8 -0
  92. package/dist/core/tone.d.ts.map +1 -0
  93. package/dist/core/tone.js +9 -0
  94. package/dist/core/tone.js.map +1 -0
  95. package/dist/count/count.d.ts +22 -0
  96. package/dist/count/count.d.ts.map +1 -0
  97. package/dist/count/count.js +60 -0
  98. package/dist/count/count.js.map +1 -0
  99. package/dist/count/elapsed.d.ts +18 -0
  100. package/dist/count/elapsed.d.ts.map +1 -0
  101. package/dist/count/elapsed.js +33 -0
  102. package/dist/count/elapsed.js.map +1 -0
  103. package/dist/count/index.d.ts +3 -0
  104. package/dist/count/index.d.ts.map +1 -0
  105. package/dist/count/index.js +5 -0
  106. package/dist/count/index.js.map +1 -0
  107. package/dist/define/all.d.ts +15 -0
  108. package/dist/define/all.d.ts.map +1 -0
  109. package/dist/define/all.js +16 -0
  110. package/dist/define/all.js.map +1 -0
  111. package/dist/define/charts.d.ts +8 -0
  112. package/dist/define/charts.d.ts.map +1 -0
  113. package/dist/define/charts.js +15 -0
  114. package/dist/define/charts.js.map +1 -0
  115. package/dist/define/check-table.d.ts +4 -0
  116. package/dist/define/check-table.d.ts.map +1 -0
  117. package/dist/define/check-table.js +7 -0
  118. package/dist/define/check-table.js.map +1 -0
  119. package/dist/define/code.d.ts +4 -0
  120. package/dist/define/code.d.ts.map +1 -0
  121. package/dist/define/code.js +7 -0
  122. package/dist/define/code.js.map +1 -0
  123. package/dist/define/count.d.ts +5 -0
  124. package/dist/define/count.d.ts.map +1 -0
  125. package/dist/define/count.js +9 -0
  126. package/dist/define/count.js.map +1 -0
  127. package/dist/define/data-table.d.ts +4 -0
  128. package/dist/define/data-table.d.ts.map +1 -0
  129. package/dist/define/data-table.js +7 -0
  130. package/dist/define/data-table.js.map +1 -0
  131. package/dist/define/graph.d.ts +6 -0
  132. package/dist/define/graph.d.ts.map +1 -0
  133. package/dist/define/graph.js +9 -0
  134. package/dist/define/graph.js.map +1 -0
  135. package/dist/define/json-tree.d.ts +4 -0
  136. package/dist/define/json-tree.d.ts.map +1 -0
  137. package/dist/define/json-tree.js +7 -0
  138. package/dist/define/json-tree.js.map +1 -0
  139. package/dist/define/lanes.d.ts +4 -0
  140. package/dist/define/lanes.d.ts.map +1 -0
  141. package/dist/define/lanes.js +7 -0
  142. package/dist/define/lanes.js.map +1 -0
  143. package/dist/define/markdown.d.ts +4 -0
  144. package/dist/define/markdown.d.ts.map +1 -0
  145. package/dist/define/markdown.js +7 -0
  146. package/dist/define/markdown.js.map +1 -0
  147. package/dist/define/matrix.d.ts +4 -0
  148. package/dist/define/matrix.d.ts.map +1 -0
  149. package/dist/define/matrix.js +7 -0
  150. package/dist/define/matrix.js.map +1 -0
  151. package/dist/define/segmented.d.ts +4 -0
  152. package/dist/define/segmented.d.ts.map +1 -0
  153. package/dist/define/segmented.js +7 -0
  154. package/dist/define/segmented.js.map +1 -0
  155. package/dist/define/tiles.d.ts +5 -0
  156. package/dist/define/tiles.d.ts.map +1 -0
  157. package/dist/define/tiles.js +9 -0
  158. package/dist/define/tiles.js.map +1 -0
  159. package/dist/define/transcript.d.ts +4 -0
  160. package/dist/define/transcript.d.ts.map +1 -0
  161. package/dist/define/transcript.js +7 -0
  162. package/dist/define/transcript.js.map +1 -0
  163. package/dist/define/tree.d.ts +4 -0
  164. package/dist/define/tree.d.ts.map +1 -0
  165. package/dist/define/tree.js +7 -0
  166. package/dist/define/tree.js.map +1 -0
  167. package/dist/graph/arrange.d.ts +43 -0
  168. package/dist/graph/arrange.d.ts.map +1 -0
  169. package/dist/graph/arrange.js +390 -0
  170. package/dist/graph/arrange.js.map +1 -0
  171. package/dist/graph/card.d.ts +71 -0
  172. package/dist/graph/card.d.ts.map +1 -0
  173. package/dist/graph/card.js +185 -0
  174. package/dist/graph/card.js.map +1 -0
  175. package/dist/graph/host.d.ts +82 -0
  176. package/dist/graph/host.d.ts.map +1 -0
  177. package/dist/graph/host.js +21 -0
  178. package/dist/graph/host.js.map +1 -0
  179. package/dist/graph/icons.d.ts +7 -0
  180. package/dist/graph/icons.d.ts.map +1 -0
  181. package/dist/graph/icons.js +18 -0
  182. package/dist/graph/icons.js.map +1 -0
  183. package/dist/graph/index.d.ts +15 -0
  184. package/dist/graph/index.d.ts.map +1 -0
  185. package/dist/graph/index.js +17 -0
  186. package/dist/graph/index.js.map +1 -0
  187. package/dist/graph/layered-graph.d.ts +226 -0
  188. package/dist/graph/layered-graph.d.ts.map +1 -0
  189. package/dist/graph/layered-graph.js +396 -0
  190. package/dist/graph/layered-graph.js.map +1 -0
  191. package/dist/graph/layout.d.ts +80 -0
  192. package/dist/graph/layout.d.ts.map +1 -0
  193. package/dist/graph/layout.js +264 -0
  194. package/dist/graph/layout.js.map +1 -0
  195. package/dist/graph/marks.d.ts +24 -0
  196. package/dist/graph/marks.d.ts.map +1 -0
  197. package/dist/graph/marks.js +38 -0
  198. package/dist/graph/marks.js.map +1 -0
  199. package/dist/graph/nav.d.ts +14 -0
  200. package/dist/graph/nav.d.ts.map +1 -0
  201. package/dist/graph/nav.js +14 -0
  202. package/dist/graph/nav.js.map +1 -0
  203. package/dist/graph/pan-zoom.d.ts +80 -0
  204. package/dist/graph/pan-zoom.d.ts.map +1 -0
  205. package/dist/graph/pan-zoom.js +191 -0
  206. package/dist/graph/pan-zoom.js.map +1 -0
  207. package/dist/graph/paths.d.ts +9 -0
  208. package/dist/graph/paths.d.ts.map +1 -0
  209. package/dist/graph/paths.js +44 -0
  210. package/dist/graph/paths.js.map +1 -0
  211. package/dist/graph/place-card.d.ts +36 -0
  212. package/dist/graph/place-card.d.ts.map +1 -0
  213. package/dist/graph/place-card.js +68 -0
  214. package/dist/graph/place-card.js.map +1 -0
  215. package/dist/graph/strings.d.ts +50 -0
  216. package/dist/graph/strings.d.ts.map +1 -0
  217. package/dist/graph/strings.js +37 -0
  218. package/dist/graph/strings.js.map +1 -0
  219. package/dist/graph/styles.d.ts +2 -0
  220. package/dist/graph/styles.d.ts.map +1 -0
  221. package/dist/graph/styles.js +203 -0
  222. package/dist/graph/styles.js.map +1 -0
  223. package/dist/graph/types.d.ts +184 -0
  224. package/dist/graph/types.d.ts.map +1 -0
  225. package/dist/graph/types.js +2 -0
  226. package/dist/graph/types.js.map +1 -0
  227. package/dist/graph/view.d.ts +17 -0
  228. package/dist/graph/view.d.ts.map +1 -0
  229. package/dist/graph/view.js +21 -0
  230. package/dist/graph/view.js.map +1 -0
  231. package/dist/graph/views/dag.d.ts +10 -0
  232. package/dist/graph/views/dag.d.ts.map +1 -0
  233. package/dist/graph/views/dag.js +292 -0
  234. package/dist/graph/views/dag.js.map +1 -0
  235. package/dist/graph/views/foot.d.ts +8 -0
  236. package/dist/graph/views/foot.d.ts.map +1 -0
  237. package/dist/graph/views/foot.js +103 -0
  238. package/dist/graph/views/foot.js.map +1 -0
  239. package/dist/graph/views/node-table.d.ts +17 -0
  240. package/dist/graph/views/node-table.d.ts.map +1 -0
  241. package/dist/graph/views/node-table.js +80 -0
  242. package/dist/graph/views/node-table.js.map +1 -0
  243. package/dist/index.d.ts +24 -0
  244. package/dist/index.d.ts.map +1 -0
  245. package/dist/index.js +28 -0
  246. package/dist/index.js.map +1 -0
  247. package/dist/json/index.d.ts +2 -0
  248. package/dist/json/index.d.ts.map +1 -0
  249. package/dist/json/index.js +3 -0
  250. package/dist/json/index.js.map +1 -0
  251. package/dist/json/json-tree.d.ts +21 -0
  252. package/dist/json/json-tree.d.ts.map +1 -0
  253. package/dist/json/json-tree.js +51 -0
  254. package/dist/json/json-tree.js.map +1 -0
  255. package/dist/lanes/index.d.ts +5 -0
  256. package/dist/lanes/index.d.ts.map +1 -0
  257. package/dist/lanes/index.js +7 -0
  258. package/dist/lanes/index.js.map +1 -0
  259. package/dist/lanes/lanes.d.ts +56 -0
  260. package/dist/lanes/lanes.d.ts.map +1 -0
  261. package/dist/lanes/lanes.js +160 -0
  262. package/dist/lanes/lanes.js.map +1 -0
  263. package/dist/lanes/stack.d.ts +26 -0
  264. package/dist/lanes/stack.d.ts.map +1 -0
  265. package/dist/lanes/stack.js +43 -0
  266. package/dist/lanes/stack.js.map +1 -0
  267. package/dist/lanes/styles.d.ts +2 -0
  268. package/dist/lanes/styles.d.ts.map +1 -0
  269. package/dist/lanes/styles.js +30 -0
  270. package/dist/lanes/styles.js.map +1 -0
  271. package/dist/lanes/types.d.ts +41 -0
  272. package/dist/lanes/types.d.ts.map +1 -0
  273. package/dist/lanes/types.js +6 -0
  274. package/dist/lanes/types.js.map +1 -0
  275. package/dist/markdown/cae-markdown.d.ts +37 -0
  276. package/dist/markdown/cae-markdown.d.ts.map +1 -0
  277. package/dist/markdown/cae-markdown.js +68 -0
  278. package/dist/markdown/cae-markdown.js.map +1 -0
  279. package/dist/markdown/highlight.d.ts +2 -0
  280. package/dist/markdown/highlight.d.ts.map +1 -0
  281. package/dist/markdown/highlight.js +3 -0
  282. package/dist/markdown/highlight.js.map +1 -0
  283. package/dist/markdown/index.d.ts +4 -0
  284. package/dist/markdown/index.d.ts.map +1 -0
  285. package/dist/markdown/index.js +6 -0
  286. package/dist/markdown/index.js.map +1 -0
  287. package/dist/markdown/markdown.d.ts +4 -0
  288. package/dist/markdown/markdown.d.ts.map +1 -0
  289. package/dist/markdown/markdown.js +105 -0
  290. package/dist/markdown/markdown.js.map +1 -0
  291. package/dist/matrix/grid-step.d.ts +8 -0
  292. package/dist/matrix/grid-step.d.ts.map +1 -0
  293. package/dist/matrix/grid-step.js +69 -0
  294. package/dist/matrix/grid-step.js.map +1 -0
  295. package/dist/matrix/index.d.ts +5 -0
  296. package/dist/matrix/index.d.ts.map +1 -0
  297. package/dist/matrix/index.js +7 -0
  298. package/dist/matrix/index.js.map +1 -0
  299. package/dist/matrix/mark-matrix.d.ts +97 -0
  300. package/dist/matrix/mark-matrix.d.ts.map +1 -0
  301. package/dist/matrix/mark-matrix.js +272 -0
  302. package/dist/matrix/mark-matrix.js.map +1 -0
  303. package/dist/matrix/styles.d.ts +4 -0
  304. package/dist/matrix/styles.d.ts.map +1 -0
  305. package/dist/matrix/styles.js +47 -0
  306. package/dist/matrix/styles.js.map +1 -0
  307. package/dist/matrix/types.d.ts +79 -0
  308. package/dist/matrix/types.d.ts.map +1 -0
  309. package/dist/matrix/types.js +5 -0
  310. package/dist/matrix/types.js.map +1 -0
  311. package/dist/primitives/fact-line.d.ts +14 -0
  312. package/dist/primitives/fact-line.d.ts.map +1 -0
  313. package/dist/primitives/fact-line.js +18 -0
  314. package/dist/primitives/fact-line.js.map +1 -0
  315. package/dist/primitives/icon.d.ts +14 -0
  316. package/dist/primitives/icon.d.ts.map +1 -0
  317. package/dist/primitives/icon.js +19 -0
  318. package/dist/primitives/icon.js.map +1 -0
  319. package/dist/primitives/index.d.ts +10 -0
  320. package/dist/primitives/index.d.ts.map +1 -0
  321. package/dist/primitives/index.js +13 -0
  322. package/dist/primitives/index.js.map +1 -0
  323. package/dist/primitives/legend.d.ts +28 -0
  324. package/dist/primitives/legend.d.ts.map +1 -0
  325. package/dist/primitives/legend.js +28 -0
  326. package/dist/primitives/legend.js.map +1 -0
  327. package/dist/primitives/pill.d.ts +23 -0
  328. package/dist/primitives/pill.d.ts.map +1 -0
  329. package/dist/primitives/pill.js +40 -0
  330. package/dist/primitives/pill.js.map +1 -0
  331. package/dist/primitives/roving-focus.d.ts +47 -0
  332. package/dist/primitives/roving-focus.d.ts.map +1 -0
  333. package/dist/primitives/roving-focus.js +111 -0
  334. package/dist/primitives/roving-focus.js.map +1 -0
  335. package/dist/primitives/segmented.d.ts +41 -0
  336. package/dist/primitives/segmented.d.ts.map +1 -0
  337. package/dist/primitives/segmented.js +88 -0
  338. package/dist/primitives/segmented.js.map +1 -0
  339. package/dist/primitives/share-bar.d.ts +37 -0
  340. package/dist/primitives/share-bar.d.ts.map +1 -0
  341. package/dist/primitives/share-bar.js +69 -0
  342. package/dist/primitives/share-bar.js.map +1 -0
  343. package/dist/primitives/states.d.ts +19 -0
  344. package/dist/primitives/states.d.ts.map +1 -0
  345. package/dist/primitives/states.js +11 -0
  346. package/dist/primitives/states.js.map +1 -0
  347. package/dist/primitives/window.d.ts +24 -0
  348. package/dist/primitives/window.d.ts.map +1 -0
  349. package/dist/primitives/window.js +56 -0
  350. package/dist/primitives/window.js.map +1 -0
  351. package/dist/styles/chips.d.ts +2 -0
  352. package/dist/styles/chips.d.ts.map +1 -0
  353. package/dist/styles/chips.js +18 -0
  354. package/dist/styles/chips.js.map +1 -0
  355. package/dist/styles/facts.d.ts +2 -0
  356. package/dist/styles/facts.d.ts.map +1 -0
  357. package/dist/styles/facts.js +7 -0
  358. package/dist/styles/facts.js.map +1 -0
  359. package/dist/styles/index.d.ts +16 -0
  360. package/dist/styles/index.d.ts.map +1 -0
  361. package/dist/styles/index.js +15 -0
  362. package/dist/styles/index.js.map +1 -0
  363. package/dist/styles/layout.d.ts +2 -0
  364. package/dist/styles/layout.d.ts.map +1 -0
  365. package/dist/styles/layout.js +33 -0
  366. package/dist/styles/layout.js.map +1 -0
  367. package/dist/styles/marks.d.ts +2 -0
  368. package/dist/styles/marks.d.ts.map +1 -0
  369. package/dist/styles/marks.js +30 -0
  370. package/dist/styles/marks.js.map +1 -0
  371. package/dist/styles/meter.d.ts +3 -0
  372. package/dist/styles/meter.d.ts.map +1 -0
  373. package/dist/styles/meter.js +9 -0
  374. package/dist/styles/meter.js.map +1 -0
  375. package/dist/styles/motion.d.ts +2 -0
  376. package/dist/styles/motion.d.ts.map +1 -0
  377. package/dist/styles/motion.js +27 -0
  378. package/dist/styles/motion.js.map +1 -0
  379. package/dist/styles/prose.d.ts +3 -0
  380. package/dist/styles/prose.d.ts.map +1 -0
  381. package/dist/styles/prose.js +64 -0
  382. package/dist/styles/prose.js.map +1 -0
  383. package/dist/styles/reset.d.ts +2 -0
  384. package/dist/styles/reset.d.ts.map +1 -0
  385. package/dist/styles/reset.js +13 -0
  386. package/dist/styles/reset.js.map +1 -0
  387. package/dist/styles/status.d.ts +2 -0
  388. package/dist/styles/status.d.ts.map +1 -0
  389. package/dist/styles/status.js +52 -0
  390. package/dist/styles/status.js.map +1 -0
  391. package/dist/styles/text.d.ts +2 -0
  392. package/dist/styles/text.d.ts.map +1 -0
  393. package/dist/styles/text.js +21 -0
  394. package/dist/styles/text.js.map +1 -0
  395. package/dist/styles/tokens.d.ts +8 -0
  396. package/dist/styles/tokens.d.ts.map +1 -0
  397. package/dist/styles/tokens.js +32 -0
  398. package/dist/styles/tokens.js.map +1 -0
  399. package/dist/table/data-table.d.ts +106 -0
  400. package/dist/table/data-table.d.ts.map +1 -0
  401. package/dist/table/data-table.js +408 -0
  402. package/dist/table/data-table.js.map +1 -0
  403. package/dist/table/index.d.ts +4 -0
  404. package/dist/table/index.d.ts.map +1 -0
  405. package/dist/table/index.js +6 -0
  406. package/dist/table/index.js.map +1 -0
  407. package/dist/table/styles.d.ts +2 -0
  408. package/dist/table/styles.d.ts.map +1 -0
  409. package/dist/table/styles.js +32 -0
  410. package/dist/table/styles.js.map +1 -0
  411. package/dist/table/types.d.ts +48 -0
  412. package/dist/table/types.d.ts.map +1 -0
  413. package/dist/table/types.js +30 -0
  414. package/dist/table/types.js.map +1 -0
  415. package/dist/themes/boot.d.ts +7 -0
  416. package/dist/themes/boot.d.ts.map +1 -0
  417. package/dist/themes/boot.js +14 -0
  418. package/dist/themes/boot.js.map +1 -0
  419. package/dist/themes/choice.d.ts +16 -0
  420. package/dist/themes/choice.d.ts.map +1 -0
  421. package/dist/themes/choice.js +45 -0
  422. package/dist/themes/choice.js.map +1 -0
  423. package/dist/themes/data.d.ts +43 -0
  424. package/dist/themes/data.d.ts.map +1 -0
  425. package/dist/themes/data.js +408 -0
  426. package/dist/themes/data.js.map +1 -0
  427. package/dist/themes/index.d.ts +7 -0
  428. package/dist/themes/index.d.ts.map +1 -0
  429. package/dist/themes/index.js +11 -0
  430. package/dist/themes/index.js.map +1 -0
  431. package/dist/themes/sheet.d.ts +16 -0
  432. package/dist/themes/sheet.d.ts.map +1 -0
  433. package/dist/themes/sheet.js +28 -0
  434. package/dist/themes/sheet.js.map +1 -0
  435. package/dist/themes/token-meanings.d.ts +3 -0
  436. package/dist/themes/token-meanings.d.ts.map +1 -0
  437. package/dist/themes/token-meanings.js +67 -0
  438. package/dist/themes/token-meanings.js.map +1 -0
  439. package/dist/themes/tokens-list.d.ts +14 -0
  440. package/dist/themes/tokens-list.d.ts.map +1 -0
  441. package/dist/themes/tokens-list.js +69 -0
  442. package/dist/themes/tokens-list.js.map +1 -0
  443. package/dist/tiles/index.d.ts +4 -0
  444. package/dist/tiles/index.d.ts.map +1 -0
  445. package/dist/tiles/index.js +6 -0
  446. package/dist/tiles/index.js.map +1 -0
  447. package/dist/tiles/stat-tiles.d.ts +40 -0
  448. package/dist/tiles/stat-tiles.d.ts.map +1 -0
  449. package/dist/tiles/stat-tiles.js +99 -0
  450. package/dist/tiles/stat-tiles.js.map +1 -0
  451. package/dist/tiles/styles.d.ts +2 -0
  452. package/dist/tiles/styles.d.ts.map +1 -0
  453. package/dist/tiles/styles.js +23 -0
  454. package/dist/tiles/styles.js.map +1 -0
  455. package/dist/tiles/types.d.ts +22 -0
  456. package/dist/tiles/types.d.ts.map +1 -0
  457. package/dist/tiles/types.js +2 -0
  458. package/dist/tiles/types.js.map +1 -0
  459. package/dist/transcript/follow-scroll.d.ts +21 -0
  460. package/dist/transcript/follow-scroll.d.ts.map +1 -0
  461. package/dist/transcript/follow-scroll.js +76 -0
  462. package/dist/transcript/follow-scroll.js.map +1 -0
  463. package/dist/transcript/index.d.ts +5 -0
  464. package/dist/transcript/index.d.ts.map +1 -0
  465. package/dist/transcript/index.js +7 -0
  466. package/dist/transcript/index.js.map +1 -0
  467. package/dist/transcript/styles.d.ts +2 -0
  468. package/dist/transcript/styles.d.ts.map +1 -0
  469. package/dist/transcript/styles.js +114 -0
  470. package/dist/transcript/styles.js.map +1 -0
  471. package/dist/transcript/tags.d.ts +6 -0
  472. package/dist/transcript/tags.d.ts.map +1 -0
  473. package/dist/transcript/tags.js +13 -0
  474. package/dist/transcript/tags.js.map +1 -0
  475. package/dist/transcript/tool-card.d.ts +16 -0
  476. package/dist/transcript/tool-card.d.ts.map +1 -0
  477. package/dist/transcript/tool-card.js +87 -0
  478. package/dist/transcript/tool-card.js.map +1 -0
  479. package/dist/transcript/transcript.d.ts +103 -0
  480. package/dist/transcript/transcript.d.ts.map +1 -0
  481. package/dist/transcript/transcript.js +397 -0
  482. package/dist/transcript/transcript.js.map +1 -0
  483. package/dist/transcript/types.d.ts +161 -0
  484. package/dist/transcript/types.d.ts.map +1 -0
  485. package/dist/transcript/types.js +25 -0
  486. package/dist/transcript/types.js.map +1 -0
  487. package/dist/tree/index.d.ts +2 -0
  488. package/dist/tree/index.d.ts.map +1 -0
  489. package/dist/tree/index.js +4 -0
  490. package/dist/tree/index.js.map +1 -0
  491. package/dist/tree/tree.d.ts +83 -0
  492. package/dist/tree/tree.d.ts.map +1 -0
  493. package/dist/tree/tree.js +251 -0
  494. package/dist/tree/tree.js.map +1 -0
  495. package/docs/charts.md +58 -0
  496. package/docs/check-table.md +40 -0
  497. package/docs/code.md +55 -0
  498. package/docs/data-table.md +57 -0
  499. package/docs/examples/charts.ts +61 -0
  500. package/docs/examples/check-table.ts +19 -0
  501. package/docs/examples/ci-pipeline.ts +271 -0
  502. package/docs/examples/code.ts +28 -0
  503. package/docs/examples/data-table.ts +39 -0
  504. package/docs/examples/graph.ts +57 -0
  505. package/docs/examples/lanes.ts +40 -0
  506. package/docs/examples/matrix.ts +56 -0
  507. package/docs/examples/page.css +34 -0
  508. package/docs/examples/segmented.ts +18 -0
  509. package/docs/examples/status.ts +30 -0
  510. package/docs/examples/theme.css +54 -0
  511. package/docs/examples/tiles.ts +27 -0
  512. package/docs/examples/transcript.ts +59 -0
  513. package/docs/examples/tree.ts +44 -0
  514. package/docs/graph.md +112 -0
  515. package/docs/lanes.md +48 -0
  516. package/docs/matrix.md +34 -0
  517. package/docs/page.md +87 -0
  518. package/docs/primitives.md +57 -0
  519. package/docs/strings.md +16 -0
  520. package/docs/theming.md +147 -0
  521. package/docs/tiles.md +40 -0
  522. package/docs/transcript.md +73 -0
  523. package/docs/tree.md +44 -0
  524. package/docs/tsconfig.json +20 -0
  525. package/package.json +177 -4
  526. package/src/charts/bar-chart.ts +74 -0
  527. package/src/charts/base.ts +188 -0
  528. package/src/charts/column-chart.ts +153 -0
  529. package/src/charts/heatmap.ts +129 -0
  530. package/src/charts/index.ts +10 -0
  531. package/src/charts/line-chart.ts +128 -0
  532. package/src/charts/scale.ts +61 -0
  533. package/src/charts/state-grid.ts +245 -0
  534. package/src/charts/types.ts +48 -0
  535. package/src/checks/check-table.ts +85 -0
  536. package/src/checks/index.ts +5 -0
  537. package/src/checks/styles.ts +31 -0
  538. package/src/checks/types.ts +48 -0
  539. package/src/code/code.ts +199 -0
  540. package/src/code/highlight.ts +378 -0
  541. package/src/code/index.ts +4 -0
  542. package/src/core/clock.ts +46 -0
  543. package/src/core/define.ts +7 -0
  544. package/src/core/events.ts +89 -0
  545. package/src/core/format.ts +25 -0
  546. package/src/core/frame.ts +5 -0
  547. package/src/core/strings.ts +11 -0
  548. package/src/core/tone.ts +14 -0
  549. package/src/count/count.ts +54 -0
  550. package/src/count/elapsed.ts +33 -0
  551. package/src/count/index.ts +4 -0
  552. package/src/define/all.ts +15 -0
  553. package/src/define/charts.ts +17 -0
  554. package/src/define/check-table.ts +9 -0
  555. package/src/define/code.ts +9 -0
  556. package/src/define/count.ts +11 -0
  557. package/src/define/data-table.ts +9 -0
  558. package/src/define/graph.ts +11 -0
  559. package/src/define/json-tree.ts +9 -0
  560. package/src/define/lanes.ts +9 -0
  561. package/src/define/markdown.ts +9 -0
  562. package/src/define/matrix.ts +9 -0
  563. package/src/define/segmented.ts +9 -0
  564. package/src/define/tiles.ts +11 -0
  565. package/src/define/transcript.ts +9 -0
  566. package/src/define/tree.ts +9 -0
  567. package/src/graph/arrange.ts +399 -0
  568. package/src/graph/card.ts +209 -0
  569. package/src/graph/host.ts +100 -0
  570. package/src/graph/icons.ts +23 -0
  571. package/src/graph/index.ts +16 -0
  572. package/src/graph/layered-graph.ts +417 -0
  573. package/src/graph/layout.ts +331 -0
  574. package/src/graph/marks.ts +42 -0
  575. package/src/graph/nav.ts +19 -0
  576. package/src/graph/pan-zoom.ts +219 -0
  577. package/src/graph/paths.ts +41 -0
  578. package/src/graph/place-card.ts +93 -0
  579. package/src/graph/strings.ts +86 -0
  580. package/src/graph/styles.ts +204 -0
  581. package/src/graph/types.ts +202 -0
  582. package/src/graph/view.ts +28 -0
  583. package/src/graph/views/dag.ts +294 -0
  584. package/src/graph/views/foot.ts +109 -0
  585. package/src/graph/views/node-table.ts +90 -0
  586. package/src/index.ts +27 -0
  587. package/src/json/index.ts +2 -0
  588. package/src/json/json-tree.ts +49 -0
  589. package/src/lanes/index.ts +6 -0
  590. package/src/lanes/lanes.ts +143 -0
  591. package/src/lanes/stack.ts +51 -0
  592. package/src/lanes/styles.ts +30 -0
  593. package/src/lanes/types.ts +51 -0
  594. package/src/markdown/cae-markdown.ts +64 -0
  595. package/src/markdown/highlight.ts +2 -0
  596. package/src/markdown/index.ts +5 -0
  597. package/src/markdown/markdown.ts +110 -0
  598. package/src/matrix/grid-step.ts +58 -0
  599. package/src/matrix/index.ts +6 -0
  600. package/src/matrix/mark-matrix.ts +285 -0
  601. package/src/matrix/styles.ts +48 -0
  602. package/src/matrix/types.ts +83 -0
  603. package/src/primitives/fact-line.ts +26 -0
  604. package/src/primitives/icon.ts +26 -0
  605. package/src/primitives/index.ts +12 -0
  606. package/src/primitives/legend.ts +56 -0
  607. package/src/primitives/pill.ts +58 -0
  608. package/src/primitives/roving-focus.ts +138 -0
  609. package/src/primitives/segmented.ts +92 -0
  610. package/src/primitives/share-bar.ts +94 -0
  611. package/src/primitives/states.ts +28 -0
  612. package/src/primitives/window.ts +65 -0
  613. package/src/styles/chips.ts +18 -0
  614. package/src/styles/facts.ts +7 -0
  615. package/src/styles/index.ts +19 -0
  616. package/src/styles/layout.ts +33 -0
  617. package/src/styles/marks.ts +30 -0
  618. package/src/styles/meter.ts +9 -0
  619. package/src/styles/motion.ts +27 -0
  620. package/src/styles/prose.ts +64 -0
  621. package/src/styles/reset.ts +13 -0
  622. package/src/styles/status.ts +52 -0
  623. package/src/styles/text.ts +21 -0
  624. package/src/styles/tokens.ts +35 -0
  625. package/src/table/data-table.ts +367 -0
  626. package/src/table/index.ts +5 -0
  627. package/src/table/styles.ts +32 -0
  628. package/src/table/types.ts +73 -0
  629. package/src/themes/boot.ts +14 -0
  630. package/src/themes/choice.ts +47 -0
  631. package/src/themes/data.ts +433 -0
  632. package/src/themes/index.ts +10 -0
  633. package/src/themes/sheet.ts +29 -0
  634. package/src/themes/token-meanings.ts +67 -0
  635. package/src/themes/tokens-list.ts +82 -0
  636. package/src/tiles/index.ts +5 -0
  637. package/src/tiles/stat-tiles.ts +92 -0
  638. package/src/tiles/styles.ts +23 -0
  639. package/src/tiles/types.ts +20 -0
  640. package/src/transcript/follow-scroll.ts +72 -0
  641. package/src/transcript/index.ts +6 -0
  642. package/src/transcript/styles.ts +114 -0
  643. package/src/transcript/tags.ts +18 -0
  644. package/src/transcript/tool-card.ts +103 -0
  645. package/src/transcript/transcript.ts +358 -0
  646. package/src/transcript/types.ts +167 -0
  647. package/src/tree/index.ts +3 -0
  648. package/src/tree/tree.ts +263 -0
@@ -0,0 +1,4 @@
1
+ // `@contraagent/elements/count`: a number that counts to its value, and a time
2
+ // that ticks; `…/count/define` registers both.
3
+ export * from './count.js';
4
+ export * from './elapsed.js';
@@ -0,0 +1,15 @@
1
+ // Registers every cae-* element.
2
+ import './json-tree.js';
3
+ import './markdown.js';
4
+ import './code.js';
5
+ import './tree.js';
6
+ import './count.js';
7
+ import './segmented.js';
8
+ import './data-table.js';
9
+ import './tiles.js';
10
+ import './lanes.js';
11
+ import './check-table.js';
12
+ import './matrix.js';
13
+ import './graph.js';
14
+ import './transcript.js';
15
+ import './charts.js';
@@ -0,0 +1,17 @@
1
+ // Registers <cae-column-chart>, <cae-line-chart>, <cae-heatmap>, <cae-state-grid> and <cae-bar-chart>.
2
+ import { defineElement } from '../core/define.js';
3
+ import { CaeBarChart } from '../charts/bar-chart.js';
4
+ import { CaeColumnChart } from '../charts/column-chart.js';
5
+ import { CaeHeatmap } from '../charts/heatmap.js';
6
+ import { CaeLineChart } from '../charts/line-chart.js';
7
+ import { CaeStateGrid } from '../charts/state-grid.js';
8
+
9
+ defineElement('cae-column-chart', CaeColumnChart);
10
+ defineElement('cae-line-chart', CaeLineChart);
11
+ defineElement('cae-heatmap', CaeHeatmap);
12
+ defineElement('cae-state-grid', CaeStateGrid);
13
+ defineElement('cae-bar-chart', CaeBarChart);
14
+
15
+ // The classes, and the events' types (`HTMLElementEventMap`), for a page that imports only this entry.
16
+ export { CaeBarChart, CaeColumnChart, CaeHeatmap, CaeLineChart, CaeStateGrid };
17
+ export type { CaeEventMap } from '../core/events.js';
@@ -0,0 +1,9 @@
1
+ // Registers <cae-check-table>.
2
+ import { defineElement } from '../core/define.js';
3
+ import { CaeCheckTable } from '../checks/check-table.js';
4
+
5
+ defineElement('cae-check-table', CaeCheckTable);
6
+
7
+ // The classes, and the events' types (`HTMLElementEventMap`), for a page that imports only this entry.
8
+ export { CaeCheckTable };
9
+ export type { CaeEventMap } from '../core/events.js';
@@ -0,0 +1,9 @@
1
+ // Registers <cae-code>.
2
+ import { defineElement } from '../core/define.js';
3
+ import { CaeCode } from '../code/code.js';
4
+
5
+ defineElement('cae-code', CaeCode);
6
+
7
+ // The class, and the events' types (`HTMLElementEventMap`), for a page that imports only this entry.
8
+ export { CaeCode };
9
+ export type { CaeEventMap } from '../core/events.js';
@@ -0,0 +1,11 @@
1
+ // Registers <cae-count> and <cae-elapsed>.
2
+ import { defineElement } from '../core/define.js';
3
+ import { CaeCount } from '../count/count.js';
4
+ import { CaeElapsed } from '../count/elapsed.js';
5
+
6
+ defineElement('cae-count', CaeCount);
7
+ defineElement('cae-elapsed', CaeElapsed);
8
+
9
+ // The classes, and the events' types (`HTMLElementEventMap`), for a page that imports only this entry.
10
+ export { CaeCount, CaeElapsed };
11
+ export type { CaeEventMap } from '../core/events.js';
@@ -0,0 +1,9 @@
1
+ // Registers <cae-data-table>.
2
+ import { defineElement } from '../core/define.js';
3
+ import { CaeDataTable } from '../table/data-table.js';
4
+
5
+ defineElement('cae-data-table', CaeDataTable);
6
+
7
+ // The classes, and the events' types (`HTMLElementEventMap`), for a page that imports only this entry.
8
+ export { CaeDataTable };
9
+ export type { CaeEventMap } from '../core/events.js';
@@ -0,0 +1,11 @@
1
+ // Registers <cae-layered-graph>, and the elements it renders: <cae-mark-matrix> and <cae-segmented>.
2
+ import { defineElement } from '../core/define.js';
3
+ import { CaeLayeredGraph } from '../graph/layered-graph.js';
4
+ import './matrix.js';
5
+ import './segmented.js';
6
+
7
+ defineElement('cae-layered-graph', CaeLayeredGraph);
8
+
9
+ // The classes, and the events' types (`HTMLElementEventMap`), for a page that imports only this entry.
10
+ export { CaeLayeredGraph };
11
+ export type { CaeEventMap } from '../core/events.js';
@@ -0,0 +1,9 @@
1
+ // Registers <cae-json-tree>.
2
+ import { defineElement } from '../core/define.js';
3
+ import { CaeJsonTree } from '../json/json-tree.js';
4
+
5
+ defineElement('cae-json-tree', CaeJsonTree);
6
+
7
+ // The classes, and the events' types (`HTMLElementEventMap`), for a page that imports only this entry.
8
+ export { CaeJsonTree };
9
+ export type { CaeEventMap } from '../core/events.js';
@@ -0,0 +1,9 @@
1
+ // Registers <cae-lanes>.
2
+ import { defineElement } from '../core/define.js';
3
+ import { CaeLanes } from '../lanes/lanes.js';
4
+
5
+ defineElement('cae-lanes', CaeLanes);
6
+
7
+ // The classes, and the events' types (`HTMLElementEventMap`), for a page that imports only this entry.
8
+ export { CaeLanes };
9
+ export type { CaeEventMap } from '../core/events.js';
@@ -0,0 +1,9 @@
1
+ // Registers <cae-markdown>.
2
+ import { defineElement } from '../core/define.js';
3
+ import { CaeMarkdown } from '../markdown/cae-markdown.js';
4
+
5
+ defineElement('cae-markdown', CaeMarkdown);
6
+
7
+ // The classes, and the events' types (`HTMLElementEventMap`), for a page that imports only this entry.
8
+ export { CaeMarkdown };
9
+ export type { CaeEventMap } from '../core/events.js';
@@ -0,0 +1,9 @@
1
+ // Registers <cae-mark-matrix>.
2
+ import { defineElement } from '../core/define.js';
3
+ import { CaeMarkMatrix } from '../matrix/mark-matrix.js';
4
+
5
+ defineElement('cae-mark-matrix', CaeMarkMatrix);
6
+
7
+ // The classes, and the events' types (`HTMLElementEventMap`), for a page that imports only this entry.
8
+ export { CaeMarkMatrix };
9
+ export type { CaeEventMap } from '../core/events.js';
@@ -0,0 +1,9 @@
1
+ // Registers <cae-segmented>.
2
+ import { defineElement } from '../core/define.js';
3
+ import { CaeSegmented } from '../primitives/segmented.js';
4
+
5
+ defineElement('cae-segmented', CaeSegmented);
6
+
7
+ // The classes, and the events' types (`HTMLElementEventMap`), for a page that imports only this entry.
8
+ export { CaeSegmented };
9
+ export type { CaeEventMap } from '../core/events.js';
@@ -0,0 +1,11 @@
1
+ // Registers <cae-stat-tiles> and the <cae-count> it renders.
2
+ import { defineElement } from '../core/define.js';
3
+ import { CaeCount } from '../count/count.js';
4
+ import { CaeStatTiles } from '../tiles/stat-tiles.js';
5
+
6
+ defineElement('cae-stat-tiles', CaeStatTiles);
7
+ defineElement('cae-count', CaeCount);
8
+
9
+ // The classes, and the events' types (`HTMLElementEventMap`), for a page that imports only this entry.
10
+ export { CaeStatTiles, CaeCount };
11
+ export type { CaeEventMap } from '../core/events.js';
@@ -0,0 +1,9 @@
1
+ // Registers <cae-transcript>.
2
+ import { defineElement } from '../core/define.js';
3
+ import { CaeTranscript } from '../transcript/transcript.js';
4
+
5
+ defineElement('cae-transcript', CaeTranscript);
6
+
7
+ // The classes, and the events' types (`HTMLElementEventMap`), for a page that imports only this entry.
8
+ export { CaeTranscript };
9
+ export type { CaeEventMap } from '../core/events.js';
@@ -0,0 +1,9 @@
1
+ // Registers <cae-tree>.
2
+ import { defineElement } from '../core/define.js';
3
+ import { CaeTree } from '../tree/tree.js';
4
+
5
+ defineElement('cae-tree', CaeTree);
6
+
7
+ // The class, and the events' types (`HTMLElementEventMap`), for a page that imports only this entry.
8
+ export { CaeTree };
9
+ export type { CaeEventMap } from '../core/events.js';
@@ -0,0 +1,399 @@
1
+ // The order of a layered drawing: each item's layer by longest path, and the order
2
+ // within each layer that reduces crossings. Reads ids and links only.
3
+ //
4
+ // The drawing is a layered (Sugiyama) layout of a compound graph, by container (the
5
+ // top level, then each cluster, a cluster being one item of its parent): layers by
6
+ // longest path, with the edges that close a cycle (`ranks: false`) left out; a point
7
+ // (`~...`) on every layer a long edge crosses, so no edge runs over a node; crossings
8
+ // reduced by barycentre sweeps. `layoutGraph` then places it from measured sizes.
9
+ // The order depends on the structure only, and keeps a previous order: items that
10
+ // appear later are appended to their layer.
11
+ import type { Arrangement, EdgeStyle, GraphClusterInput, GraphEdgeInput, GraphNodeInput, GraphOrder, GraphStubInput, EdgePathStep } from './types.js';
12
+
13
+ const push = <K, V>(m: Map<K, V[]>, k: K, v: V): void => {
14
+ const xs = m.get(k);
15
+ if (xs) xs.push(v);
16
+ else m.set(k, [v]);
17
+ };
18
+
19
+ const pairKey = (a: string, b: string) => `${a}\u0000${b}`;
20
+
21
+ /**
22
+ * Each id's layer by longest path. Edges that close a cycle (found depth first, in
23
+ * `ids` order) are left out; `fixed` ids keep their layer.
24
+ */
25
+ export function rankLayers(ids: readonly string[], edges: readonly (readonly [string, string])[], fixed: ReadonlyMap<string, number>): Map<string, number> {
26
+ const known = new Set(ids);
27
+ const all = new Map<string, string[]>(ids.map((id) => [id, []]));
28
+ for (const [a, b] of edges) if (a !== b && known.has(a) && known.has(b) && !all.get(a)?.includes(b)) all.get(a)?.push(b);
29
+ const back = new Set<string>();
30
+ const seen = new Map<string, 1 | 2>();
31
+ for (const root of ids) {
32
+ if (seen.has(root)) continue;
33
+ seen.set(root, 1);
34
+ const stack: [string, number][] = [[root, 0]];
35
+ while (stack.length) {
36
+ const top = stack[stack.length - 1] as [string, number];
37
+ const ss = all.get(top[0]) ?? [];
38
+ if (top[1] < ss.length) {
39
+ const s = ss[top[1]++] as string;
40
+ const st = seen.get(s);
41
+ if (st === 1) back.add(pairKey(top[0], s));
42
+ else if (!st) {
43
+ seen.set(s, 1);
44
+ stack.push([s, 0]);
45
+ }
46
+ } else {
47
+ seen.set(top[0], 2);
48
+ stack.pop();
49
+ }
50
+ }
51
+ }
52
+ const succ = new Map<string, string[]>(ids.map((id) => [id, []]));
53
+ const pred = new Map<string, string[]>(ids.map((id) => [id, []]));
54
+ for (const [a, ss] of all) {
55
+ for (const b of ss) {
56
+ if (back.has(pairKey(a, b))) continue;
57
+ succ.get(a)?.push(b);
58
+ pred.get(b)?.push(a);
59
+ }
60
+ }
61
+ // Longest path, in topological order (Kahn's).
62
+ const indeg = new Map(ids.map((id) => [id, pred.get(id)?.length ?? 0]));
63
+ const queue = ids.filter((id) => !indeg.get(id));
64
+ const layer = new Map<string, number>();
65
+ for (let q = queue.shift(); q !== undefined; q = queue.shift()) {
66
+ layer.set(q, fixed.get(q) ?? Math.max(0, ...(pred.get(q) ?? []).map((p) => (layer.get(p) ?? 0) + 1)));
67
+ for (const s of succ.get(q) ?? []) {
68
+ indeg.set(s, (indeg.get(s) ?? 0) - 1);
69
+ if (!indeg.get(s)) queue.push(s);
70
+ }
71
+ }
72
+ return layer;
73
+ }
74
+
75
+ /** Pairs (a, b) between adjacent layers that cross, for the order `pos`. */
76
+ function crossings(rows: readonly string[][], links: readonly (readonly [string, string])[], pos: ReadonlyMap<string, number>, layerOf: ReadonlyMap<string, number>): number {
77
+ let n = 0;
78
+ const by = new Map<number, [number, number][]>();
79
+ for (const [a, b] of links) {
80
+ const l = layerOf.get(a);
81
+ if (l === undefined) continue;
82
+ push(by, l, [pos.get(a) ?? 0, pos.get(b) ?? 0]);
83
+ }
84
+ for (const ls of by.values())
85
+ for (let i = 0; i < ls.length; i++)
86
+ for (let j = i + 1; j < ls.length; j++) {
87
+ const [a1, b1] = ls[i] as [number, number];
88
+ const [a2, b2] = ls[j] as [number, number];
89
+ if ((a1 - a2) * (b1 - b2) < 0) n++;
90
+ }
91
+ return rows.length ? n : 0;
92
+ }
93
+
94
+ /** True for a point where an edge crosses a layer. */
95
+ export const isPoint = (id: string): boolean => id.startsWith('~');
96
+
97
+ /**
98
+ * The order within each layer that reduces crossings: barycentre sweeps, down and
99
+ * up, four times, keeping the best. `links` join a slot to one in the next layer.
100
+ * With `keep`, those ids keep their order (a previous layout's, new ones after
101
+ * them) and only the other slots (the points) move between them.
102
+ */
103
+ export function orderRows(rows: string[][], links: readonly (readonly [string, string])[], keep: boolean): string[][] {
104
+ const layerOf = new Map<string, number>();
105
+ rows.forEach((row, i) => row.forEach((id) => layerOf.set(id, i)));
106
+ const pred = new Map<string, string[]>();
107
+ const succ = new Map<string, string[]>();
108
+ for (const [a, b] of links) {
109
+ push(succ, a, b);
110
+ push(pred, b, a);
111
+ }
112
+ const pos = new Map<string, number>();
113
+ const fix = (row: readonly string[]) => row.forEach((id, i) => pos.set(id, i));
114
+ const cur = rows.map((r) => [...r]);
115
+ cur.forEach(fix);
116
+ const score = () => crossings(cur, links, pos, layerOf);
117
+ let best = cur.map((r) => [...r]);
118
+ let bestN = score();
119
+ const sortRow = (row: string[], near: Map<string, string[]>): string[] => {
120
+ const bc = new Map<string, number>();
121
+ for (const id of row) {
122
+ const ps = (near.get(id) ?? []).map((p) => pos.get(p)).filter((x): x is number => x !== undefined);
123
+ bc.set(id, ps.length ? ps.reduce((a, b) => a + b, 0) / ps.length : (pos.get(id) ?? 0));
124
+ }
125
+ const at = (id: string) => bc.get(id) ?? 0;
126
+ if (!keep) return [...row].sort((a, b) => at(a) - at(b) || (pos.get(a) ?? 0) - (pos.get(b) ?? 0));
127
+ // The kept ids stay in their order; each point goes before the first kept id it is left of.
128
+ const fixed = row.filter((id) => !isPoint(id));
129
+ const points = row.filter(isPoint).sort((a, b) => at(a) - at(b) || (pos.get(a) ?? 0) - (pos.get(b) ?? 0));
130
+ const out: string[] = [];
131
+ let p = 0;
132
+ for (const id of fixed) {
133
+ while (p < points.length && at(points[p] as string) < at(id)) out.push(points[p++] as string);
134
+ out.push(id);
135
+ }
136
+ return [...out, ...points.slice(p)];
137
+ };
138
+ for (let sweep = 0; sweep < 4; sweep++) {
139
+ const down = sweep % 2 === 0;
140
+ const order = down ? cur.map((_, i) => i).slice(1) : cur.map((_, i) => i).reverse().slice(1);
141
+ for (const i of order) {
142
+ const row = sortRow(cur[i] as string[], down ? pred : succ);
143
+ cur[i] = row;
144
+ fix(row);
145
+ }
146
+ const n = score();
147
+ if (n < bestN) {
148
+ bestN = n;
149
+ best = cur.map((r) => [...r]);
150
+ }
151
+ }
152
+ return score() <= bestN ? cur : best;
153
+ }
154
+
155
+ /** What `arrange` reads of a graph: ids, where each node is, and the links. */
156
+ export interface GraphShape {
157
+ nodes: readonly Pick<GraphNodeInput, 'id' | 'cluster'>[];
158
+ clusters: readonly (Pick<GraphClusterInput, 'id' | 'parent'> & { cycle?: boolean })[];
159
+ edges: readonly Pick<GraphEdgeInput, 'from' | 'to' | 'style' | 'ranks'>[];
160
+ stubs: readonly Pick<GraphStubInput, 'id' | 'to' | 'style'>[];
161
+ }
162
+
163
+ const arranged = new WeakMap<GraphShape, { prev: GraphOrder | undefined; down: boolean; out: Arrangement }[]>();
164
+
165
+ /**
166
+ * The order of `g`'s drawing: each container's layers (the top level, then each
167
+ * cluster, a cluster being one item of its parent), the order within each layer,
168
+ * and the slots each edge passes. Pass a previous `order` of the same graph as
169
+ * `prev` to keep its items where they are (new ones are appended to their layer);
170
+ * `down` lays out the edge paths for a drawing top to bottom (a cluster's label is then on
171
+ * the side its edges come in). The same `g`, `prev` and `down` give the same object.
172
+ */
173
+ export function arrange(g: GraphShape, prev?: GraphOrder, down = false): Arrangement {
174
+ const seen = arranged.get(g) ?? [];
175
+ const hit = seen.find((x) => x.prev === prev && x.down === down);
176
+ if (hit) return hit.out;
177
+ const out = arrangeNew(g, prev, down);
178
+ arranged.set(g, [...seen.slice(-3), { prev, down, out }]);
179
+ return out;
180
+ }
181
+
182
+ function arrangeNew(g: GraphShape, prev: GraphOrder | undefined, down: boolean): Arrangement {
183
+ const clusterIds = new Set(g.clusters.map((c) => c.id));
184
+ const parentOf = new Map(g.clusters.map((c) => [c.id, c.parent]));
185
+ const boxOf = new Map<string, string>(); // node id -> its innermost cluster
186
+ for (const n of g.nodes) if (n.cluster) boxOf.set(n.id, n.cluster);
187
+ const stubIds = [...new Set(g.stubs.map((s) => s.id))];
188
+ const isStub = new Set(stubIds);
189
+
190
+ // The clusters an id sits in, innermost first (for a cluster id, itself first).
191
+ const boxPath = (id: string): string[] => {
192
+ const out: string[] = [];
193
+ let b: string | null = clusterIds.has(id) ? id : (boxOf.get(id) ?? null);
194
+ while (b) {
195
+ out.push(b);
196
+ b = parentOf.get(b) ?? null;
197
+ }
198
+ return out;
199
+ };
200
+ // The direct child of `container` (a cluster, or '' for the top level) that holds a node `id`.
201
+ const itemIn = (id: string, container: string): string | undefined => {
202
+ const bp = boxPath(id);
203
+ if (container === '') return bp[bp.length - 1] ?? id;
204
+ const i = bp.indexOf(container);
205
+ return i < 0 ? undefined : i === 0 ? id : bp[i - 1];
206
+ };
207
+ // The deepest cluster holding both ends of an edge (the top level when none).
208
+ const commonBox = (a: string, b: string): string => {
209
+ const bp = boxPath(a);
210
+ return bp.find((x) => boxPath(b).includes(x)) ?? '';
211
+ };
212
+ // The container a slot is in: a stub's is the top level.
213
+ const containerOf = (id: string): string => (isStub.has(id) ? '' : (boxOf.get(id) ?? ''));
214
+
215
+ // Layers, by container: the top level, then each cluster (its own nodes and the
216
+ // clusters nested in it). Each cluster is one item of its parent.
217
+ const containers = ['', ...g.clusters.map((c) => c.id)];
218
+ const kidsOf = new Map<string, string[]>(containers.map((c) => [c, []]));
219
+ for (const { id } of g.nodes) {
220
+ for (const c of containers) {
221
+ const it = itemIn(id, c);
222
+ if (it !== undefined && !kidsOf.get(c)?.includes(it)) kidsOf.get(c)?.push(it);
223
+ }
224
+ }
225
+ const lay = new Map<string, Map<string, number>>();
226
+ for (const c of containers) {
227
+ const kids = kidsOf.get(c) ?? [];
228
+ const prevRows = c === '' ? prev?.layers : prev?.clusters[c];
229
+ const fixed = new Map<string, number>();
230
+ prevRows?.forEach((row, i) => row.forEach((id) => kids.includes(id) && fixed.set(id, i)));
231
+ // An edge that closes a cycle does not set the layers.
232
+ const es = g.edges
233
+ .filter((e) => e.ranks && commonBox(e.from, e.to) === c)
234
+ .map((e) => [itemIn(e.from, c) as string, itemIn(e.to, c) as string] as const);
235
+ lay.set(c, rankLayers(kids, es, fixed));
236
+ }
237
+ // Stubs, in the top level: in the layer before the first they lead to (a new first layer when that is the first).
238
+ const top = lay.get('') as Map<string, number>;
239
+ const prevTop = new Map<string, number>();
240
+ prev?.layers.forEach((row, i) => row.forEach((id) => prevTop.set(id, i)));
241
+ const stubAt = new Map(
242
+ stubIds.map((id) => [id, prevTop.get(id) ?? Math.min(...g.stubs.filter((s) => s.id === id).map((s) => top.get(itemIn(s.to, '') as string) ?? 0)) - 1]),
243
+ );
244
+ if ([...stubAt.values()].some((l) => l < 0)) {
245
+ for (const [id, l] of top) top.set(id, l + 1);
246
+ for (const [id, l] of stubAt) stubAt.set(id, l + 1);
247
+ }
248
+ for (const [id, l] of stubAt) top.set(id, l);
249
+ const layerOf = (c: string, id: string): number => lay.get(c)?.get(id) ?? 0;
250
+ const lastLayer = (c: string): number => Math.max(0, ...(lay.get(c)?.values() ?? []));
251
+
252
+ // Every edge whose end is not in a later layer than its start goes back: not drawn.
253
+ const isBack = (from: string, to: string): boolean => {
254
+ const c = commonBox(from, to);
255
+ return layerOf(c, itemIn(from, c) as string) >= layerOf(c, itemIn(to, c) as string);
256
+ };
257
+ const back = g.edges.map((e) => isBack(e.from, e.to));
258
+
259
+ // Each container's rows: its items by layer, a previous order kept, new items after it.
260
+ const rows = new Map<string, string[][]>();
261
+ for (const c of containers) {
262
+ const prevRows = c === '' ? prev?.layers : prev?.clusters[c];
263
+ const kept = (prevRows ?? []).flat();
264
+ const ids = [...(c === '' ? [...stubIds] : []), ...(kidsOf.get(c) ?? [])];
265
+ ids.sort((a, b) => {
266
+ const ka = kept.indexOf(a);
267
+ const kb = kept.indexOf(b);
268
+ return (ka < 0 ? Infinity : ka) - (kb < 0 ? Infinity : kb);
269
+ });
270
+ const r: string[][] = Array.from({ length: lastLayer(c) + 1 }, () => []);
271
+ for (const id of ids) r[layerOf(c, id)]?.push(id);
272
+ rows.set(c, r);
273
+ }
274
+
275
+ // Edge paths: the drawn edges through points on the layers they cross. The points of
276
+ // edges from one place (of one style) are shared, so their lines run as one.
277
+ const edgePaths: Arrangement['edgePaths'] = [];
278
+ const points = new Set<string>();
279
+ const point = (c: string, origin: string, style: string, l: number): EdgePathStep => {
280
+ const id = `~${c}|${origin}|${style}|${l}`;
281
+ if (!points.has(id)) {
282
+ points.add(id);
283
+ rows.get(c)?.[l]?.push(id);
284
+ }
285
+ return { id, in: c };
286
+ };
287
+ // A point beside a cluster, in its layer of the container around it: an edge that leaves or
288
+ // enters the cluster through its side, between two of its layers, passes there.
289
+ const byPoint = (c: string, box: string, origin: string, style: string): EdgePathStep => {
290
+ const l = layerOf(c, box);
291
+ const id = `~${c}|by:${box}|${origin}|${style}|${l}`;
292
+ if (!points.has(id)) {
293
+ points.add(id);
294
+ rows.get(c)?.[l]?.push(id);
295
+ }
296
+ return { id, in: c };
297
+ };
298
+ // An edge enters a cluster at its near side only to reach the cluster's first layer (and,
299
+ // top to bottom, not even then: the cluster's label is on that side); else through its
300
+ // side, next to the layer it goes to. It leaves at the far side only from the cluster's
301
+ // last layer, else through its side. So it runs inside a cluster only where it starts or ends.
302
+ const edgePath = (from: string, to: string, style: EdgeStyle): EdgePathStep[] => {
303
+ const c = isStub.has(from) ? '' : commonBox(from, to);
304
+ let curIn = containerOf(from);
305
+ let cur = from;
306
+ const steps: EdgePathStep[] = [{ id: from, in: curIn }];
307
+ // Out of the clusters around the source, up to the common container.
308
+ while (curIn !== c) {
309
+ const up = parentOf.get(curIn) ?? '';
310
+ steps.push({ id: curIn, in: up });
311
+ if (layerOf(curIn, cur) < lastLayer(curIn)) steps.push(byPoint(up, curIn, cur, style));
312
+ cur = curIn;
313
+ curIn = up;
314
+ }
315
+ // Across the common container, then into the clusters around the target.
316
+ const target = itemIn(to, c) as string;
317
+ for (let l = layerOf(c, cur) + 1; l < layerOf(c, target); l++) steps.push(point(c, cur, style, l));
318
+ const bp = boxPath(to);
319
+ const inward = bp.slice(0, c === '' ? bp.length : bp.indexOf(c)).reverse();
320
+ const origin = `>${c}:${cur}`;
321
+ let k = c;
322
+ for (const box of inward) {
323
+ const n = itemIn(to, box) as string;
324
+ if (layerOf(box, n) > 0 || down) steps.push(byPoint(k, box, origin, style));
325
+ steps.push({ id: box, in: k });
326
+ k = box;
327
+ }
328
+ steps.push({ id: to, in: k });
329
+ return steps;
330
+ };
331
+ g.edges.forEach((e, i) => {
332
+ if (!back[i]) edgePaths.push({ from: e.from, to: e.to, style: e.style, steps: edgePath(e.from, e.to, e.style) });
333
+ });
334
+ for (const s of g.stubs) edgePaths.push({ from: s.id, to: s.to, style: s.style, steps: edgePath(s.id, s.to, s.style) });
335
+
336
+ // The order within each layer.
337
+ const slots: Record<string, string[][]> = {};
338
+ for (const c of containers) {
339
+ const links: [string, string][] = [];
340
+ const lv = new Map((rows.get(c) ?? []).flatMap((r, i) => r.map((id) => [id, i] as const)));
341
+ for (const r of edgePaths)
342
+ for (let i = 1; i < r.steps.length; i++) {
343
+ const a = r.steps[i - 1] as EdgePathStep;
344
+ const b = r.steps[i] as EdgePathStep;
345
+ if (a.in === c && b.in === c && lv.get(a.id) !== lv.get(b.id)) links.push([a.id, b.id]);
346
+ }
347
+ const hasPrev = c === '' ? !!prev : !!prev?.clusters[c];
348
+ // A point beside a cluster is right after it.
349
+ slots[c] = orderRows(rows.get(c) ?? [], links, hasPrev).map((row) => {
350
+ const by = row.filter((id) => id.includes('|by:'));
351
+ const rest = row.filter((id) => !id.includes('|by:'));
352
+ return rest.flatMap((id) => [id, ...by.filter((p) => p.includes(`|by:${id}|`))]);
353
+ });
354
+ }
355
+ const real = (r: readonly string[][]) => r.map((row) => row.filter((id) => !isPoint(id)));
356
+ const clusters = g.clusters.map((c) => ({ id: c.id, parent: c.parent, cycle: !!c.cycle, layers: real(slots[c.id] ?? []).filter((r) => r.length) }));
357
+ const outerRows = real(slots[''] ?? []).map((row) => row.filter((id) => !isStub.has(id)));
358
+ const byId = new Map(clusters.map((c) => [c.id, c]));
359
+ // Every node id, in drawing order: expand each cluster to the nodes nested in it.
360
+ const expand = (ids: readonly string[]): string[] =>
361
+ ids.flatMap((id) => (clusterIds.has(id) ? expand((byId.get(id)?.layers ?? []).flat()) : [id]));
362
+ return {
363
+ drawn: expand(outerRows.flat()),
364
+ layers: outerRows.filter((r) => r.length),
365
+ clusters,
366
+ back,
367
+ slots,
368
+ edgePaths,
369
+ order: { layers: real(slots[''] ?? []), clusters: Object.fromEntries(clusters.map((c) => [c.id, real(slots[c.id] ?? [])])) },
370
+ };
371
+ }
372
+
373
+ /**
374
+ * How many layers the drawing spans along its flow, and how many items it stacks across
375
+ * it at most, counting a cluster as what it holds: an estimate of the drawing's shape,
376
+ * before it is measured (`span` items wide left to right, `stack` items high).
377
+ */
378
+ export function extentOf(a: Pick<Arrangement, 'layers' | 'clusters'>): { span: number; stack: number } {
379
+ const byId = new Map(a.clusters.map((c) => [c.id, c]));
380
+ const memo = new Map<string, { span: number; stack: number }>();
381
+ const of = (layers: readonly string[][]): { span: number; stack: number } => {
382
+ let span = 0;
383
+ let stack = 0;
384
+ for (const row of layers) {
385
+ let deep = 0;
386
+ let across = 0;
387
+ for (const id of row) {
388
+ const c = byId.get(id);
389
+ const e = c ? (memo.get(id) ?? memo.set(id, of(c.layers)).get(id) ?? { span: 1, stack: 1 }) : { span: 1, stack: 1 };
390
+ deep = Math.max(deep, e.span);
391
+ across += e.stack;
392
+ }
393
+ span += deep;
394
+ stack = Math.max(stack, across);
395
+ }
396
+ return { span, stack };
397
+ };
398
+ return of(a.layers);
399
+ }