@mstone6969/graph 0.1.0 → 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 (238) hide show
  1. package/README.md +111 -14
  2. package/dist/ExcelWriter-3ZSYUH4T.cjs +154 -0
  3. package/dist/GraphType.js +24 -38
  4. package/dist/PdfWriter-6HJFYMCO.cjs +205 -0
  5. package/dist/catalog-YWX6FHRM.cjs +8 -0
  6. package/dist/catalog.js +5 -1
  7. package/dist/charts/bars/index.js +2 -12
  8. package/dist/charts/comparison/EffectForestPlot.js +1 -1
  9. package/dist/charts/comparison/index.js +1 -8
  10. package/dist/charts/demography/Nomogram.js +3 -3
  11. package/dist/charts/density/HexbinChart.js +6 -4
  12. package/dist/charts/diagrams/ArchitectureCanvas.js +68 -0
  13. package/dist/charts/diagrams/ArchitectureDiagram.js +331 -0
  14. package/dist/charts/diagrams/ArchitectureLayout.js +106 -0
  15. package/dist/charts/diagrams/ArchitectureLinkLabels.js +78 -0
  16. package/dist/charts/diagrams/ArchitectureModel.js +108 -0
  17. package/dist/charts/diagrams/ArchitectureRouter.js +348 -0
  18. package/dist/charts/diagrams/ArchitectureSamples.js +312 -0
  19. package/dist/charts/diagrams/ArchitectureShapes.js +130 -0
  20. package/dist/charts/diagrams/ArchitectureText.js +25 -0
  21. package/dist/charts/diagrams/DiagramText.js +38 -0
  22. package/dist/charts/diagrams/EntityRelationshipDiagram.js +465 -0
  23. package/dist/charts/diagrams/ErCrowsFoot.js +33 -0
  24. package/dist/charts/diagrams/ErSamples.js +205 -0
  25. package/dist/charts/diagrams/ErSchema.js +122 -0
  26. package/dist/charts/diagrams/LogicCircuit.js +154 -0
  27. package/dist/charts/diagrams/LogicCircuitLayout.js +600 -0
  28. package/dist/charts/diagrams/LogicCircuitSamples.js +66 -0
  29. package/dist/charts/diagrams/LogicGateDiagram.js +216 -0
  30. package/dist/charts/diagrams/LogicGateSymbol.js +113 -0
  31. package/dist/charts/diagrams/NetworkTopologyDiagram.js +247 -0
  32. package/dist/charts/diagrams/SequenceDiagram.js +351 -0
  33. package/dist/charts/diagrams/SequenceLayout.js +422 -0
  34. package/dist/charts/diagrams/SequenceModel.js +221 -0
  35. package/dist/charts/diagrams/TopologyLayout.js +143 -0
  36. package/dist/charts/diagrams/architectureEnums.js +50 -0
  37. package/dist/charts/diagrams/index.js +26 -0
  38. package/dist/charts/diagrams/logicEnums.js +42 -0
  39. package/dist/charts/diagrams/sequenceEnums.js +40 -0
  40. package/dist/charts/distribution/HistogramChart.js +25 -3
  41. package/dist/charts/distribution/index.js +1 -3
  42. package/dist/charts/earthscience/HovmollerDiagram.js +477 -0
  43. package/dist/charts/earthscience/HovmollerEnums.js +42 -0
  44. package/dist/charts/earthscience/HovmollerField.js +180 -0
  45. package/dist/charts/earthscience/HovmollerSample.js +40 -0
  46. package/dist/charts/earthscience/HovmollerSpeed.js +71 -0
  47. package/dist/charts/earthscience/index.js +10 -2
  48. package/dist/charts/engineering/ConstellationDiagram.js +26 -6
  49. package/dist/charts/engineering/EyeDiagram.js +2 -1
  50. package/dist/charts/engineering/PoleZeroPlot.js +32 -8
  51. package/dist/charts/financial/RelativeStrengthRotation.js +434 -0
  52. package/dist/charts/financial/RelativeStrengthRotationMath.js +71 -0
  53. package/dist/charts/financial/RelativeStrengthRotationSamples.js +27 -0
  54. package/dist/charts/financial/index.js +5 -3
  55. package/dist/charts/flow/index.js +1 -5
  56. package/dist/charts/frameworks/AnsoffMatrix.js +523 -0
  57. package/dist/charts/frameworks/FrameworkText.js +98 -0
  58. package/dist/charts/frameworks/NpsGauge.js +279 -0
  59. package/dist/charts/frameworks/NpsSurvey.js +58 -0
  60. package/dist/charts/frameworks/PerceptualMap.js +419 -0
  61. package/dist/charts/frameworks/PerceptualProjection.js +142 -0
  62. package/dist/charts/frameworks/PositioningSamples.js +191 -0
  63. package/dist/charts/frameworks/RaciMatrix.js +458 -0
  64. package/dist/charts/frameworks/RaciPlan.js +81 -0
  65. package/dist/charts/frameworks/RaciSamples.js +76 -0
  66. package/dist/charts/frameworks/SwotMatrix.js +358 -0
  67. package/dist/charts/frameworks/SwotSamples.js +85 -0
  68. package/dist/charts/frameworks/VanWestendorpChart.js +187 -0
  69. package/dist/charts/frameworks/VanWestendorpSurvey.js +197 -0
  70. package/dist/charts/frameworks/index.js +26 -0
  71. package/dist/charts/frameworks/raciEnums.js +30 -0
  72. package/dist/charts/frameworks/swotEnums.js +34 -0
  73. package/dist/charts/genomics/CircosPlot.js +1 -1
  74. package/dist/charts/geoflows/GeoFlowChart.js +2 -2
  75. package/dist/charts/geoflows/GeoFlowSample.js +2 -1
  76. package/dist/charts/geomaps/FloorPlanMap.js +324 -0
  77. package/dist/charts/geomaps/FloorPlanModel.js +179 -0
  78. package/dist/charts/geomaps/FloorPlanSamples.js +416 -0
  79. package/dist/charts/geomaps/GeoLand.js +2 -2
  80. package/dist/charts/geomaps/GeoSamples.js +2 -1
  81. package/dist/charts/geomaps/GraticuleMap.js +2 -2
  82. package/dist/charts/geomaps/RoomLabelFit.js +200 -0
  83. package/dist/charts/geomaps/TissotMap.js +2 -2
  84. package/dist/charts/geomaps/index.js +8 -4
  85. package/dist/charts/hierarchy/SunburstChart.js +17 -10
  86. package/dist/charts/hierarchy/index.js +2 -11
  87. package/dist/charts/indicators/BulletChart.js +8 -2
  88. package/dist/charts/indicators/SpeedometerChart.js +1 -1
  89. package/dist/charts/indicators/ThermometerChart.js +1 -1
  90. package/dist/charts/lifescience/LoessFit.js +113 -0
  91. package/dist/charts/lifescience/MaPlot.js +337 -0
  92. package/dist/charts/lifescience/MaPlotSamples.js +35 -0
  93. package/dist/charts/lifescience/OncoGlyph.js +137 -0
  94. package/dist/charts/lifescience/OncoPrint.js +373 -0
  95. package/dist/charts/lifescience/OncoPrintMatrix.js +107 -0
  96. package/dist/charts/lifescience/OncoPrintSamples.js +142 -0
  97. package/dist/charts/lifescience/PedigreeChart.js +306 -0
  98. package/dist/charts/lifescience/PedigreeLayout.js +261 -0
  99. package/dist/charts/lifescience/PedigreeRows.js +70 -0
  100. package/dist/charts/lifescience/PedigreeSamples.js +161 -0
  101. package/dist/charts/lifescience/PedigreeSymbol.js +47 -0
  102. package/dist/charts/lifescience/RamachandranPlot.js +364 -0
  103. package/dist/charts/lifescience/RamachandranRegions.js +2712 -0
  104. package/dist/charts/lifescience/RamachandranSamples.js +235 -0
  105. package/dist/charts/lifescience/index.js +25 -0
  106. package/dist/charts/lifescience/pedigreeEnums.js +21 -0
  107. package/dist/charts/lifescience/ramachandranEnums.js +34 -0
  108. package/dist/charts/linesareas/DualAxisChart.js +1 -1
  109. package/dist/charts/linesareas/LineEnums.js +1 -15
  110. package/dist/charts/linesareas/MultiLineChart.js +1 -1
  111. package/dist/charts/linesareas/TrendChart.js +15 -5
  112. package/dist/charts/linesareas/index.js +2 -6
  113. package/dist/charts/massive/MassiveChart.js +3 -2
  114. package/dist/charts/mathematical/FourierSeriesChart.js +7 -1
  115. package/dist/charts/mathematical/index.js +2 -6
  116. package/dist/charts/matrix/GridPlot.js +27 -2
  117. package/dist/charts/matrix/TilegramChart.js +2 -2
  118. package/dist/charts/mlcharts/AttentionGrid.js +79 -0
  119. package/dist/charts/mlcharts/AttentionHeatmap.js +329 -0
  120. package/dist/charts/mlcharts/AttentionModel.js +132 -0
  121. package/dist/charts/mlcharts/AttentionSamples.js +82 -0
  122. package/dist/charts/mlcharts/CellNumber.js +8 -0
  123. package/dist/charts/mlcharts/CurveDiagnosticSamples.js +95 -0
  124. package/dist/charts/mlcharts/CurvePickMark.js +31 -0
  125. package/dist/charts/mlcharts/DecisionBoundaryChart.js +316 -0
  126. package/dist/charts/mlcharts/DecisionSamples.js +60 -0
  127. package/dist/charts/mlcharts/DecisionSurface.js +130 -0
  128. package/dist/charts/mlcharts/DistinctTicks.js +13 -0
  129. package/dist/charts/mlcharts/ElbowMath.js +153 -0
  130. package/dist/charts/mlcharts/ElbowPlot.js +273 -0
  131. package/dist/charts/mlcharts/ExplainabilitySamples.js +70 -0
  132. package/dist/charts/mlcharts/FeatureImportanceChart.js +150 -0
  133. package/dist/charts/mlcharts/ImportanceRanking.js +98 -0
  134. package/dist/charts/mlcharts/LearningCurveChart.js +276 -0
  135. package/dist/charts/mlcharts/LearningCurveMath.js +92 -0
  136. package/dist/charts/mlcharts/PartialDependence.js +92 -0
  137. package/dist/charts/mlcharts/PartialDependencePlot.js +225 -0
  138. package/dist/charts/mlcharts/WideLabel.js +28 -0
  139. package/dist/charts/mlcharts/curveDiagnosticEnums.js +37 -0
  140. package/dist/charts/mlcharts/index.js +32 -0
  141. package/dist/charts/proportion/index.js +5 -9
  142. package/dist/charts/scatter/CategoryScatterBase.js +1 -4
  143. package/dist/charts/scatter/ConnectedScatter.js +7 -4
  144. package/dist/charts/scatter/MarginalScatter.js +13 -8
  145. package/dist/charts/scatter/index.js +4 -17
  146. package/dist/charts/scientific/SpectrogramChart.js +9 -3
  147. package/dist/charts/scientific/index.js +2 -2
  148. package/dist/charts/signals/index.js +3 -13
  149. package/dist/charts/statistics/LorenzCurve.js +7 -4
  150. package/dist/charts/threebars/Candlestick3DChart.js +18 -2
  151. package/dist/charts/threeglobe/GlobeChart.js +2 -2
  152. package/dist/charts/threeglobe/GlobeSamples.js +2 -1
  153. package/dist/charts/threeglobe/RingGlobe.js +1 -1
  154. package/dist/charts/threenetwork/ConeTreeChart.js +2 -1
  155. package/dist/charts/threenetwork/Gantt3DChart.js +3 -2
  156. package/dist/charts/threesurfaces/Ridgeline3DChart.js +22 -4
  157. package/dist/charts/threevolume/LorenzAttractor.js +19 -0
  158. package/dist/charts/threevolume/VolumeRaycastChart.js +4 -3
  159. package/dist/charts/threevolume/volumeEnums.js +1 -0
  160. package/dist/charts/timeline/index.js +2 -10
  161. package/dist/chunk-753UBLV2.cjs +33 -0
  162. package/dist/chunk-VX54A7KA.cjs +17 -0
  163. package/dist/{chunk-W5GAAAZY.cjs → chunk-WAODDPYX.cjs} +24874 -17620
  164. package/dist/chunk-Z3JPIJSC.cjs +338 -0
  165. package/dist/core/CartesianChart.js +87 -11
  166. package/dist/core/Chart.js +63 -15
  167. package/dist/core/Chart2D.js +54 -17
  168. package/dist/core/Chart3D.js +56 -20
  169. package/dist/core/ChartExportError.js +2 -0
  170. package/dist/core/ChartExporter.js +50 -8
  171. package/dist/core/ColumnCheck.js +53 -0
  172. package/dist/core/Context2D.js +29 -15
  173. package/dist/core/Context3D.js +7 -2
  174. package/dist/core/ExcelWriter.js +152 -0
  175. package/dist/core/ExportText.js +28 -0
  176. package/dist/core/MarkOrigin.js +88 -0
  177. package/dist/core/MarkStyle.js +294 -0
  178. package/dist/core/Palette.js +27 -7
  179. package/dist/core/PdfPage.js +13 -0
  180. package/dist/core/PdfWriter.js +245 -0
  181. package/dist/core/Scales.js +52 -2
  182. package/dist/core/SceneOverlay.js +4 -4
  183. package/dist/core/TextFit.js +37 -0
  184. package/dist/core/Theme.js +28 -1
  185. package/dist/core/enums.js +33 -1
  186. package/dist/core/pathMorph.js +15 -0
  187. package/dist/data/SampleData.js +1 -17
  188. package/dist/data/WorldSample.js +23 -0
  189. package/dist/index.cjs +810 -691
  190. package/dist/index.d.cts +8390 -2925
  191. package/dist/index.d.ts +8392 -2927
  192. package/dist/index.js +106 -56
  193. package/dist/react/ChartView.js +18 -8
  194. package/dist/react/GraphHandle.js +2 -0
  195. package/dist/react/components.js +74 -116
  196. package/package.json +13 -3
  197. package/dist/catalog-4UP2YFNR.cjs +0 -7
  198. package/dist/charts/bars/BulletBar.js +0 -184
  199. package/dist/charts/bars/ErrorBarColumn.js +0 -147
  200. package/dist/charts/bars/HistogramBar.js +0 -217
  201. package/dist/charts/bars/MarimekkoBar.js +0 -191
  202. package/dist/charts/bars/ParetoBar.js +0 -143
  203. package/dist/charts/comparison/PanelChart.js +0 -70
  204. package/dist/charts/comparison/SmallMultipleBars.js +0 -134
  205. package/dist/charts/comparison/SpanChart.js +0 -118
  206. package/dist/charts/comparison/TrellisChart.js +0 -158
  207. package/dist/charts/distribution/RidgeSlabs3DChart.js +0 -169
  208. package/dist/charts/financial/Candlestick3D.js +0 -157
  209. package/dist/charts/flow/BumpFlow.js +0 -212
  210. package/dist/charts/flow/StreamFlow.js +0 -174
  211. package/dist/charts/geomaps/ThiessenMap.js +0 -106
  212. package/dist/charts/hierarchy/ConeTree3D.js +0 -135
  213. package/dist/charts/hierarchy/Hierarchy3DChart.js +0 -27
  214. package/dist/charts/hierarchy/SpherePack3D.js +0 -81
  215. package/dist/charts/hierarchy/SunburstTower3D.js +0 -93
  216. package/dist/charts/hierarchy/TreemapSkyline3D.js +0 -98
  217. package/dist/charts/linesareas/ConnectedScatterTime.js +0 -206
  218. package/dist/charts/linesareas/SmallMultipleLines.js +0 -153
  219. package/dist/charts/mathematical/ParametricSurface3D.js +0 -234
  220. package/dist/charts/mathematical/StrangeAttractor3D.js +0 -251
  221. package/dist/charts/proportion/ConeFunnel.js +0 -126
  222. package/dist/charts/proportion/ExtrudedPieChart.js +0 -123
  223. package/dist/charts/scatter/BeeswarmScatter.js +0 -151
  224. package/dist/charts/scatter/BinnedScatterBase.js +0 -51
  225. package/dist/charts/scatter/ContourScatter.js +0 -116
  226. package/dist/charts/scatter/GridBinScatter.js +0 -98
  227. package/dist/charts/scatter/HexbinScatter.js +0 -74
  228. package/dist/charts/scatter/StripScatter.js +0 -107
  229. package/dist/charts/scatter/SunflowerScatter.js +0 -109
  230. package/dist/charts/signals/ConstellationChart.js +0 -153
  231. package/dist/charts/signals/CorrelogramChart.js +0 -171
  232. package/dist/charts/signals/EyeDiagramChart.js +0 -155
  233. package/dist/charts/signals/PoleZeroChart.js +0 -164
  234. package/dist/charts/signals/SpectrogramChart.js +0 -79
  235. package/dist/charts/timeline/CalendarSkylineChart.js +0 -128
  236. package/dist/charts/timeline/ScheduleBlocksChart.js +0 -119
  237. package/dist/charts/timeline/SpiralTimeline.js +0 -154
  238. package/dist/charts/timeline/StreamTimeline.js +0 -141
@@ -0,0 +1,351 @@
1
+ import { Chart2D } from "../../core/Chart2D.js";
2
+ import { ChartFamily, DataShape, Dimension } from "../../core/enums.js";
3
+ import { SampleData } from "../../data/SampleData.js";
4
+ import { SequenceFragmentKind, SequenceMessageKind, SequenceNoteSide, SequenceNumbering, SequenceParticipantKind, SequenceSpacing } from "./sequenceEnums.js";
5
+ import { SequenceLayout } from "./SequenceLayout.js";
6
+ import { SequenceModel } from "./SequenceModel.js";
7
+ // src/charts/diagrams/SequenceDiagram.ts
8
+ var SIZE = 10.5;
9
+ var { Sync, Async, Return, Self } = SequenceMessageKind;
10
+ /**
11
+ * UML 2 sequence diagram (OMG UML 2.5.1, clause 17.8): lifelines, synchronous calls with filled heads,
12
+ * asynchronous messages with open heads, dashed replies, execution specifications and combined
13
+ * fragments. Use it to show the order of messages between participants in one scenario.
14
+ */
15
+ var SequenceDiagram = class SequenceDiagram extends Chart2D {
16
+ static meta = {
17
+ id: "uml-sequence-diagram",
18
+ name: "UML sequence diagram",
19
+ family: ChartFamily.Flow,
20
+ dimension: Dimension.Two,
21
+ shape: DataShape.Graph,
22
+ description: "Orders the messages between participants top to bottom, with activation bars, combined fragments and notes.",
23
+ tags: [
24
+ "uml",
25
+ "sequence",
26
+ "software",
27
+ "lifeline",
28
+ "messages"
29
+ ],
30
+ sample: (seed) => SequenceDiagram.checkout(seed),
31
+ variants: {
32
+ activations: [true, false],
33
+ numbering: [
34
+ SequenceNumbering.None,
35
+ SequenceNumbering.Flat,
36
+ SequenceNumbering.Nested
37
+ ],
38
+ spacing: [SequenceSpacing.Fitted, SequenceSpacing.Even],
39
+ foot: [false, true]
40
+ }
41
+ };
42
+ /** A synthetic checkout scenario, invented for illustration; the seed decides whether a receipt is sent. */
43
+ static checkout(seed) {
44
+ const receipt = +SampleData.categories(seed, 1, 1)[0].value % 2 === 0;
45
+ const messages = [
46
+ {
47
+ from: "Customer",
48
+ to: "Web app",
49
+ label: "Place order",
50
+ kind: Sync
51
+ },
52
+ {
53
+ from: "Web app",
54
+ to: "Orders",
55
+ label: "POST /orders",
56
+ kind: Sync
57
+ },
58
+ {
59
+ from: "Orders",
60
+ to: "Orders",
61
+ label: "Validate cart",
62
+ kind: Self
63
+ },
64
+ {
65
+ from: "Orders",
66
+ to: "Stock",
67
+ label: "reserve(sku)",
68
+ kind: Sync
69
+ },
70
+ {
71
+ from: "Stock",
72
+ to: "Orders",
73
+ label: "reserved",
74
+ kind: Return
75
+ },
76
+ {
77
+ from: "Orders",
78
+ to: "Payments",
79
+ label: "charge(total)",
80
+ kind: Sync
81
+ },
82
+ {
83
+ from: "Payments",
84
+ to: "Orders",
85
+ label: "approved",
86
+ kind: Return
87
+ },
88
+ {
89
+ from: "Orders",
90
+ to: "Mailer",
91
+ label: receipt ? "send receipt" : "send order summary",
92
+ kind: Async
93
+ },
94
+ {
95
+ from: "Payments",
96
+ to: "Orders",
97
+ label: "declined",
98
+ kind: Return
99
+ },
100
+ {
101
+ from: "Orders",
102
+ to: "Stock",
103
+ label: "release(sku)",
104
+ kind: Async
105
+ },
106
+ {
107
+ from: "Orders",
108
+ to: "Web app",
109
+ label: "order status",
110
+ kind: Return
111
+ },
112
+ {
113
+ from: "Web app",
114
+ to: "Customer",
115
+ label: "Show result",
116
+ kind: Return
117
+ }
118
+ ];
119
+ return {
120
+ participants: [
121
+ {
122
+ id: "Customer",
123
+ kind: SequenceParticipantKind.Actor
124
+ },
125
+ "Web app",
126
+ "Orders",
127
+ "Stock",
128
+ "Payments",
129
+ "Mailer"
130
+ ],
131
+ messages,
132
+ fragments: [
133
+ {
134
+ kind: SequenceFragmentKind.Loop,
135
+ first: 3,
136
+ last: 4,
137
+ guard: "each line item"
138
+ },
139
+ {
140
+ kind: SequenceFragmentKind.Alt,
141
+ first: 6,
142
+ last: 9,
143
+ guard: "card accepted",
144
+ branches: [{
145
+ first: 8,
146
+ guard: "else"
147
+ }]
148
+ },
149
+ {
150
+ kind: SequenceFragmentKind.Opt,
151
+ first: 7,
152
+ last: 7,
153
+ guard: "wants receipt"
154
+ }
155
+ ],
156
+ notes: [{
157
+ text: "Payment is idempotent on the order id",
158
+ over: "Payments",
159
+ side: SequenceNoteSide.Over,
160
+ after: 5
161
+ }]
162
+ };
163
+ }
164
+ defaults() {
165
+ return {
166
+ from: "from",
167
+ to: "to",
168
+ label: "label",
169
+ kind: "kind",
170
+ activations: true,
171
+ foot: false,
172
+ numbering: SequenceNumbering.None,
173
+ spacing: SequenceSpacing.Fitted
174
+ };
175
+ }
176
+ plotMargin() {
177
+ return {
178
+ top: 6,
179
+ right: 10,
180
+ bottom: 6,
181
+ left: 10
182
+ };
183
+ }
184
+ legendItems() {
185
+ return [];
186
+ }
187
+ #scene() {
188
+ const { from, to, label, kind } = this.options;
189
+ return SequenceModel.build(this.options.data, {
190
+ from,
191
+ to,
192
+ label,
193
+ kind
194
+ });
195
+ }
196
+ draw(ctx) {
197
+ const { activations, foot, numbering, spacing } = this.options;
198
+ const scene = this.#scene();
199
+ const plan = SequenceLayout.place(scene, {
200
+ width: ctx.plot.width,
201
+ height: ctx.plot.height,
202
+ activations,
203
+ foot,
204
+ numbering,
205
+ spacing
206
+ });
207
+ const x = (ctx.plot.width - plan.width * plan.scale) / 2 - plan.left * plan.scale;
208
+ const stage = ctx.nest(`translate(${x},0) scale(${plan.scale})`, "sequence");
209
+ const { theme } = ctx;
210
+ const lifelines = stage.marks("lifelines", "line", plan.lifelines, (d) => d.key).attr("stroke", theme.axis).attr("stroke-width", 1).attr("stroke-dasharray", "5 4");
211
+ ctx.set(lifelines, {
212
+ x1: (d) => d.x,
213
+ x2: (d) => d.x,
214
+ y1: (d) => d.y1,
215
+ y2: (d) => d.y2
216
+ });
217
+ const frames = stage.marks("frames", "rect", plan.frames, (d) => d.key).attr("fill", "none").attr("stroke", theme.inkMuted).attr("stroke-width", 1).attr("rx", 2);
218
+ ctx.set(frames, {
219
+ x: (d) => d.x,
220
+ y: (d) => d.y,
221
+ width: (d) => d.width,
222
+ height: (d) => d.height
223
+ });
224
+ const separators = stage.marks("separators", "line", plan.frames.flatMap((frame) => frame.separators), (d) => d.key).attr("stroke", theme.inkMuted).attr("stroke-width", 1).attr("stroke-dasharray", "6 4");
225
+ ctx.set(separators, {
226
+ x1: (d) => d.x1,
227
+ x2: (d) => d.x2,
228
+ y1: (d) => d.y,
229
+ y2: (d) => d.y
230
+ });
231
+ const bars = stage.marks("bars", "rect", plan.bars, (d) => d.key).attr("fill", theme.grid).attr("stroke", theme.inkSecondary).attr("stroke-width", 1);
232
+ ctx.set(bars, {
233
+ x: (d) => d.x,
234
+ y: (d) => d.y,
235
+ width: (d) => d.width,
236
+ height: (d) => d.height
237
+ });
238
+ ctx.hover(bars, (d) => ({
239
+ title: scene.lanes[d.bar.lane].label,
240
+ rows: [["Active", `messages ${d.bar.first + 1} to ${d.bar.last + 1}`], ["Ends", d.bar.returned ? "on return" : "implied"]]
241
+ }));
242
+ const lines = stage.marks("messages", "path", plan.arrows, (d) => d.key).attr("fill", "none").attr("stroke", theme.inkSecondary).attr("stroke-width", 2).attr("stroke-dasharray", (d) => d.dashed ? "6 4" : null).attr("stroke-linejoin", "round");
243
+ ctx.set(lines, { d: (d) => d.d });
244
+ const heads = stage.marks("arrowheads", "path", plan.arrows, (d) => d.key).attr("stroke", theme.inkSecondary).attr("stroke-width", 2).attr("stroke-linejoin", "round").attr("stroke-linecap", "round").attr("fill", (d) => d.filled ? theme.inkSecondary : "none");
245
+ ctx.set(heads, { d: (d) => d.head });
246
+ const pills = plan.arrows.filter((arrow) => arrow.pill);
247
+ const chips = stage.marks("pills", "rect", pills, (d) => d.key).attr("fill", theme.inkSecondary).attr("stroke", theme.surface).attr("stroke-width", 2).attr("rx", 7);
248
+ ctx.set(chips, {
249
+ x: (d) => d.pill.x,
250
+ y: (d) => d.pill.y,
251
+ width: (d) => d.pill.width,
252
+ height: 14
253
+ });
254
+ const numbers = ctx.text(stage.marks("numbers", "text", pills, (d) => d.key), 9).attr("fill", ctx.palette.inkOn(theme.inkSecondary)).attr("text-anchor", "middle").attr("pointer-events", "none").text((d) => d.number);
255
+ ctx.set(numbers, {
256
+ x: (d) => d.pill.x + d.pill.width / 2,
257
+ y: (d) => d.pill.y + 10.5
258
+ });
259
+ const hits = stage.marks("hits", "path", plan.arrows, (d) => d.key).attr("fill", "none").attr("stroke", "transparent").attr("stroke-width", 14).attr("pointer-events", "stroke");
260
+ ctx.set(hits, { d: (d) => d.d });
261
+ ctx.hover(hits, (d) => ({
262
+ title: `${scene.lanes[d.step.from].label} → ${scene.lanes[d.step.to].label}`,
263
+ rows: [
264
+ ["Message", d.step.label || "none"],
265
+ ["Kind", d.step.kind],
266
+ ["Order", d.number || d.step.decimal || String(d.step.row + 1)]
267
+ ]
268
+ }));
269
+ const labels = plan.arrows.filter((arrow) => arrow.label);
270
+ const words = ctx.text(stage.marks("labels", "text", labels, (d) => d.key), SIZE, "ink").attr("text-anchor", (d) => d.label.anchor).attr("pointer-events", "none").attr("stroke", theme.surface).attr("stroke-width", 3).attr("paint-order", "stroke").text((d) => d.label.text);
271
+ ctx.set(words, {
272
+ x: (d) => d.label.x,
273
+ y: (d) => d.label.y
274
+ });
275
+ const tabs = stage.marks("tabs", "path", plan.frames, (d) => d.key).attr("fill", theme.grid).attr("stroke", theme.inkMuted).attr("stroke-width", 1);
276
+ ctx.set(tabs, { d: (d) => d.tab });
277
+ ctx.hover(tabs, (d) => ({
278
+ title: d.tabText,
279
+ rows: [["Guard", d.frame.guard || "none"], ["Messages", `${d.frame.first + 1} to ${d.frame.last + 1}`]]
280
+ }));
281
+ const tabWords = ctx.text(stage.marks("tab-text", "text", plan.frames, (d) => d.key), SIZE, "ink").attr("font-weight", 600).attr("pointer-events", "none").text((d) => d.tabText);
282
+ ctx.set(tabWords, {
283
+ x: (d) => d.tabX,
284
+ y: (d) => d.tabY
285
+ });
286
+ const guards = ctx.text(stage.marks("guards", "text", plan.frames.flatMap((frame) => frame.guards), (d) => d.key), SIZE).attr("pointer-events", "none").attr("stroke", theme.surface).attr("stroke-width", 3).attr("paint-order", "stroke").text((d) => d.text);
287
+ ctx.set(guards, {
288
+ x: (d) => d.x,
289
+ y: (d) => d.y
290
+ });
291
+ const notes = stage.marks("notes", "path", plan.notes, (d) => d.key).attr("fill", theme.surface).attr("stroke", theme.inkMuted).attr("stroke-width", 1).attr("stroke-linejoin", "round");
292
+ ctx.set(notes, { d: (d) => d.d });
293
+ ctx.hover(notes, (d) => ({
294
+ title: "Note",
295
+ rows: [["Text", d.remark.text]]
296
+ }));
297
+ const noteWords = ctx.text(stage.marks("note-text", "text", plan.notes.flatMap((note) => note.lines), (d) => d.key), SIZE, "ink").attr("pointer-events", "none").text((d) => d.text);
298
+ ctx.set(noteWords, {
299
+ x: (d) => d.x,
300
+ y: (d) => d.y
301
+ });
302
+ this.#heads(ctx, stage, plan, scene);
303
+ }
304
+ #heads(ctx, stage, plan, scene) {
305
+ const { theme } = ctx;
306
+ const objects = plan.heads.filter((head) => !head.actor), actors = plan.heads.filter((head) => head.actor);
307
+ const boxes = stage.marks("head-boxes", "rect", objects, (d) => d.key).attr("fill", theme.surface).attr("stroke", theme.inkSecondary).attr("stroke-width", 1.5).attr("rx", 3);
308
+ ctx.set(boxes, {
309
+ x: (d) => d.x,
310
+ y: (d) => d.boxY,
311
+ width: (d) => d.width,
312
+ height: 28
313
+ });
314
+ const figures = stage.marks("head-actors", "path", actors, (d) => d.key).attr("fill", "none").attr("stroke", theme.inkSecondary).attr("stroke-width", 2).attr("stroke-linecap", "round");
315
+ ctx.set(figures, { d: (d) => SequenceDiagram.figure(d.x + d.width / 2, d.y + 2) });
316
+ const tip = (d) => {
317
+ const lane = scene.lanes[d.lane];
318
+ const sent = scene.steps.filter((step) => step.from === d.lane).length, received = scene.steps.filter((step) => step.to === d.lane).length;
319
+ return {
320
+ title: lane.label,
321
+ rows: [["Sends", sent], ["Receives", received]]
322
+ };
323
+ };
324
+ ctx.hover(boxes, tip);
325
+ ctx.hover(figures, tip);
326
+ const names = ctx.text(stage.marks("head-text", "text", plan.heads, (d) => d.key), 11.5, "ink").attr("font-weight", 600).attr("text-anchor", "middle").attr("pointer-events", "none").text((d) => d.text);
327
+ ctx.set(names, {
328
+ x: (d) => d.x + d.width / 2,
329
+ y: (d) => d.textY
330
+ });
331
+ }
332
+ /** UML's stick figure for an actor, 28 tall. */
333
+ static figure(x, y) {
334
+ const r = 5;
335
+ return `M${x + r},${y + r}A${r},${r},0,1,1,${x - r},${y + r}A${r},${r},0,1,1,${x + r},${y + r}M${x},${y + 10}L${x},${y + 20}M${x - 8},${y + 14}L${x + 8},${y + 14}M${x},${y + 20}L${x - 7},${y + 28}M${x},${y + 20}L${x + 7},${y + 28}`;
336
+ }
337
+ table() {
338
+ const { from, to, label, kind } = this.options;
339
+ const columns = [
340
+ from,
341
+ to,
342
+ label,
343
+ kind
344
+ ];
345
+ return {
346
+ columns,
347
+ rows: SequenceModel.rows(this.options.data).filter((row) => row && typeof row === "object").map((row) => columns.map((column) => row[column]))
348
+ };
349
+ }
350
+ };
351
+ export { SequenceDiagram };