@formicoidea/labre-framework-uml 0.42.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 (114) hide show
  1. package/LICENSE +384 -0
  2. package/dist/actions.d.ts +430 -0
  3. package/dist/actions.js +724 -0
  4. package/dist/background.d.ts +153 -0
  5. package/dist/background.js +557 -0
  6. package/dist/board-hit.d.ts +137 -0
  7. package/dist/board-hit.js +191 -0
  8. package/dist/commands-manifest.d.ts +19 -0
  9. package/dist/commands-manifest.js +571 -0
  10. package/dist/commands.d.ts +4 -0
  11. package/dist/commands.js +983 -0
  12. package/dist/component.d.ts +521 -0
  13. package/dist/component.js +708 -0
  14. package/dist/consts.d.ts +365 -0
  15. package/dist/consts.js +463 -0
  16. package/dist/descriptor.d.ts +12 -0
  17. package/dist/descriptor.js +10 -0
  18. package/dist/drawio-decode.d.ts +32 -0
  19. package/dist/drawio-decode.js +96 -0
  20. package/dist/drawio-import.d.ts +133 -0
  21. package/dist/drawio-import.js +885 -0
  22. package/dist/edge-morph.d.ts +154 -0
  23. package/dist/edge-morph.js +153 -0
  24. package/dist/edge-styles.d.ts +78 -0
  25. package/dist/edge-styles.js +210 -0
  26. package/dist/effects.d.ts +9 -0
  27. package/dist/effects.js +6 -0
  28. package/dist/element-renderer.d.ts +64 -0
  29. package/dist/element-renderer.js +114 -0
  30. package/dist/element-view.d.ts +234 -0
  31. package/dist/element-view.js +430 -0
  32. package/dist/export.d.ts +61 -0
  33. package/dist/export.js +41 -0
  34. package/dist/filename.d.ts +17 -0
  35. package/dist/filename.js +26 -0
  36. package/dist/frame-tag.d.ts +70 -0
  37. package/dist/frame-tag.js +78 -0
  38. package/dist/grammar.d.ts +695 -0
  39. package/dist/grammar.js +1436 -0
  40. package/dist/import.d.ts +306 -0
  41. package/dist/import.js +1270 -0
  42. package/dist/index.d.ts +47 -0
  43. package/dist/index.js +67 -0
  44. package/dist/interchange.d.ts +125 -0
  45. package/dist/interchange.js +372 -0
  46. package/dist/keywords.d.ts +204 -0
  47. package/dist/keywords.js +361 -0
  48. package/dist/kinds.d.ts +73 -0
  49. package/dist/kinds.js +91 -0
  50. package/dist/legend.d.ts +30 -0
  51. package/dist/legend.js +255 -0
  52. package/dist/model.d.ts +862 -0
  53. package/dist/model.js +1316 -0
  54. package/dist/morph.d.ts +178 -0
  55. package/dist/morph.js +496 -0
  56. package/dist/node/act-glyphs.d.ts +30 -0
  57. package/dist/node/act-glyphs.js +142 -0
  58. package/dist/node/compartment-watcher.d.ts +107 -0
  59. package/dist/node/compartment-watcher.js +163 -0
  60. package/dist/node/fit.d.ts +85 -0
  61. package/dist/node/fit.js +129 -0
  62. package/dist/node/node-renderer.d.ts +49 -0
  63. package/dist/node/node-renderer.js +611 -0
  64. package/dist/node/node-view.d.ts +51 -0
  65. package/dist/node/node-view.js +89 -0
  66. package/dist/node/paint.d.ts +84 -0
  67. package/dist/node/paint.js +143 -0
  68. package/dist/node/sd-glyphs.d.ts +36 -0
  69. package/dist/node/sd-glyphs.js +79 -0
  70. package/dist/node/stm-glyphs.d.ts +22 -0
  71. package/dist/node/stm-glyphs.js +111 -0
  72. package/dist/node/tier-metrics.d.ts +38 -0
  73. package/dist/node/tier-metrics.js +45 -0
  74. package/dist/operators.d.ts +45 -0
  75. package/dist/operators.js +75 -0
  76. package/dist/plantuml-import.d.ts +113 -0
  77. package/dist/plantuml-import.js +1723 -0
  78. package/dist/plantuml.d.ts +94 -0
  79. package/dist/plantuml.js +985 -0
  80. package/dist/presets.d.ts +149 -0
  81. package/dist/presets.js +302 -0
  82. package/dist/profiles.d.ts +2 -0
  83. package/dist/profiles.js +358 -0
  84. package/dist/reading.d.ts +160 -0
  85. package/dist/reading.js +648 -0
  86. package/dist/roles.d.ts +257 -0
  87. package/dist/roles.js +997 -0
  88. package/dist/rules.d.ts +267 -0
  89. package/dist/rules.js +3090 -0
  90. package/dist/templates.d.ts +2 -0
  91. package/dist/templates.js +197 -0
  92. package/dist/toolbar/config.d.ts +228 -0
  93. package/dist/toolbar/config.js +833 -0
  94. package/dist/toolbar/icons.d.ts +440 -0
  95. package/dist/toolbar/icons.js +711 -0
  96. package/dist/toolbar/senior-tool.d.ts +11 -0
  97. package/dist/toolbar/senior-tool.js +21 -0
  98. package/dist/toolbar/uml-menu.d.ts +17 -0
  99. package/dist/toolbar/uml-menu.js +20 -0
  100. package/dist/toolbar/uml-senior-button.d.ts +18 -0
  101. package/dist/toolbar/uml-senior-button.js +22 -0
  102. package/dist/translations.d.ts +27 -0
  103. package/dist/translations.js +117 -0
  104. package/dist/view.d.ts +33 -0
  105. package/dist/view.js +236 -0
  106. package/dist/xmi-import.d.ts +174 -0
  107. package/dist/xmi-import.js +2268 -0
  108. package/dist/xmi.d.ts +61 -0
  109. package/dist/xmi.js +1860 -0
  110. package/dist/xml-reader.d.ts +157 -0
  111. package/dist/xml-reader.js +430 -0
  112. package/dist/xml.d.ts +72 -0
  113. package/dist/xml.js +96 -0
  114. package/package.json +38 -0
@@ -0,0 +1,711 @@
1
+ import { svg } from 'lit';
2
+ import { UML_CARD, UML_FRAME_INK, UML_INK } from '../consts.js';
3
+ /**
4
+ * The UML senior-button tile: a class box with its two compartment separators,
5
+ * beside a use-case ellipse — the two shapes the pack's two diagram families
6
+ * are recognised by, in one glyph.
7
+ *
8
+ * The one tile of this file, and unlike C4's it is NOT coloured: UML 2.5.1 has
9
+ * no stencil palette of its own (§7 draws in ink on paper), so the tile reads
10
+ * off the shared neutral scale exactly as the canvas does — `UML_INK` for the
11
+ * outlines, `UML_CARD` for the body, `UML_FRAME_INK` for the ellipse that
12
+ * stands a shade back (R33: never a grey hex literal here).
13
+ *
14
+ * Everything below it is a 24×24 monochrome outline drawn in `currentColor`,
15
+ * because a command glyph sits in a menu row and takes the row's colour.
16
+ */
17
+ export const umlToolbarIcon = svg `
18
+ <svg viewBox="0 0 56 56" width="100%" height="100%" fill="none"
19
+ xmlns="http://www.w3.org/2000/svg">
20
+ <rect x="4" y="9" width="26" height="30" rx="1.5" fill="${UML_CARD}"
21
+ stroke="${UML_INK}" stroke-width="2"/>
22
+ <path d="M4 19 H30 M4 29 H30" stroke="${UML_INK}" stroke-width="2"/>
23
+ <rect x="9" y="12.5" width="16" height="3" rx="1.5" fill="${UML_INK}"/>
24
+ <rect x="9" y="22.5" width="12" height="2.5" rx="1.25" fill="${UML_FRAME_INK}"
25
+ opacity="0.75"/>
26
+ <rect x="9" y="32.5" width="14" height="2.5" rx="1.25" fill="${UML_FRAME_INK}"
27
+ opacity="0.75"/>
28
+ <ellipse cx="39.5" cy="35" rx="13" ry="9" fill="${UML_CARD}"
29
+ stroke="${UML_FRAME_INK}" stroke-width="2"/>
30
+ <rect x="33" y="33.5" width="13" height="3" rx="1.5" fill="${UML_FRAME_INK}"
31
+ opacity="0.75"/>
32
+ </svg>
33
+ `;
34
+ /* ── The sheet and the frame drawn round part of it ─────────────────────── */
35
+ /**
36
+ * Class diagram — the frame of §C.2's diagram notation: a rectangle with the
37
+ * cut-corner name tag in its top-left corner, which is what tells a UML frame
38
+ * from any other box on the canvas.
39
+ */
40
+ export const umlDiagramIcon = svg `<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
41
+ <rect x="2.5" y="4" width="19" height="16" rx="1.2" stroke="currentColor" stroke-width="1.6"/>
42
+ <path d="M2.5 4 H11 L13 6.4 V9 H2.5 Z" stroke="currentColor" stroke-width="1.4" stroke-linejoin="round"/>
43
+ </svg>`;
44
+ /**
45
+ * Subject — the rectangle a use-case diagram draws round the use cases that
46
+ * belong to one system (§18.1.1): a plain frame, its name along the top.
47
+ */
48
+ export const umlSubjectIcon = svg `<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
49
+ <rect x="3" y="4.5" width="18" height="15" rx="1.2" stroke="currentColor" stroke-width="1.6"/>
50
+ <path d="M6 8 H14" stroke="currentColor" stroke-width="1.4" stroke-linecap="round"/>
51
+ <ellipse cx="12" cy="14.5" rx="5.5" ry="3" stroke="currentColor" stroke-width="1.3"/>
52
+ </svg>`;
53
+ /* ── The classifiers: the three-compartment box and what varies on it ───── */
54
+ /** Class — the canonical three-compartment rectangle (§11.4.4). */
55
+ export const umlClassIcon = svg `<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
56
+ <rect x="4" y="3.5" width="16" height="17" rx="1.2" stroke="currentColor" stroke-width="1.6"/>
57
+ <path d="M4 9 H20 M4 15 H20" stroke="currentColor" stroke-width="1.4"/>
58
+ </svg>`;
59
+ /**
60
+ * Interface — the same box, with the guillemets keyword above the name
61
+ * (§10.4.2.1). Drawn as the two chevrons, which is the whole of what
62
+ * `«interface»` looks like at this size.
63
+ */
64
+ export const umlInterfaceIcon = svg `<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
65
+ <rect x="4" y="3.5" width="16" height="17" rx="1.2" stroke="currentColor" stroke-width="1.6"/>
66
+ <path d="M4 15 H20" stroke="currentColor" stroke-width="1.4"/>
67
+ <path d="M10 7 L8 9.2 L10 11.4 M14 7 L16 9.2 L14 11.4" stroke="currentColor" stroke-width="1.4" stroke-linecap="round" stroke-linejoin="round"/>
68
+ </svg>`;
69
+ /**
70
+ * Enumeration — the box whose lower compartment is a LIST of literals
71
+ * (§10.2.4): three stacked rules rather than the two tiers of a class.
72
+ */
73
+ export const umlEnumerationIcon = svg `<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
74
+ <rect x="4" y="3.5" width="16" height="17" rx="1.2" stroke="currentColor" stroke-width="1.6"/>
75
+ <path d="M4 9 H20" stroke="currentColor" stroke-width="1.4"/>
76
+ <path d="M7 12 H17 M7 15 H17 M7 18 H13" stroke="currentColor" stroke-width="1.3" stroke-linecap="round"/>
77
+ </svg>`;
78
+ /**
79
+ * Object — an instance specification: the same box with its name UNDERLINED,
80
+ * which is the one notation that tells an instance from its classifier
81
+ * (§9.8.4).
82
+ */
83
+ export const umlObjectIcon = svg `<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
84
+ <rect x="4" y="3.5" width="16" height="17" rx="1.2" stroke="currentColor" stroke-width="1.6"/>
85
+ <path d="M4 11 H20" stroke="currentColor" stroke-width="1.4"/>
86
+ <path d="M7.5 8.4 H16.5" stroke="currentColor" stroke-width="1.6" stroke-linecap="round"/>
87
+ </svg>`;
88
+ /** Package — the folder: a tab over a body (§12.2.4). */
89
+ export const umlPackageIcon = svg `<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
90
+ <path d="M3 6.5 H10 L11.6 9 H21 V19 H3 Z" stroke="currentColor" stroke-width="1.6" stroke-linejoin="round"/>
91
+ <path d="M3 9 H11.6" stroke="currentColor" stroke-width="1.4"/>
92
+ </svg>`;
93
+ /** Note — the rectangle with its top-right corner turned down (§7.5.4). */
94
+ export const umlNoteIcon = svg `<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
95
+ <path d="M4 4.5 H15.5 L20 9 V19.5 H4 Z" stroke="currentColor" stroke-width="1.6" stroke-linejoin="round"/>
96
+ <path d="M15.5 4.5 V9 H20" stroke="currentColor" stroke-width="1.4" stroke-linejoin="round"/>
97
+ </svg>`;
98
+ /** Actor — the stick figure (§18.1.1). */
99
+ export const umlActorIcon = svg `<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
100
+ <circle cx="12" cy="5.5" r="2.6" stroke="currentColor" stroke-width="1.6"/>
101
+ <path d="M12 8.5 V15 M7 11 H17 M12 15 L8.5 20 M12 15 L15.5 20" stroke="currentColor" stroke-width="1.6" stroke-linecap="round"/>
102
+ </svg>`;
103
+ /** Use case — the ellipse, and nothing else (§18.1.1). */
104
+ export const umlUseCaseIcon = svg `<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
105
+ <ellipse cx="12" cy="12" rx="9" ry="6" stroke="currentColor" stroke-width="1.6"/>
106
+ </svg>`;
107
+ /* ── Phase 2: what a component diagram is made of ───────────────────────── */
108
+ /**
109
+ * Component — the rectangle with the two protruding tabs on its left edge
110
+ * (§11.6.4). The one classifier UML announces with a MARK rather than with a
111
+ * keyword, which is why the glyph is the mark and not a box with words in it.
112
+ */
113
+ export const umlComponentIcon = svg `<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
114
+ <rect x="7" y="4.5" width="13" height="15" rx="1.2" stroke="currentColor" stroke-width="1.6"/>
115
+ <rect x="4" y="7.5" width="6" height="3.5" rx="0.6" stroke="currentColor" stroke-width="1.4"/>
116
+ <rect x="4" y="13" width="6" height="3.5" rx="0.6" stroke="currentColor" stroke-width="1.4"/>
117
+ </svg>`;
118
+ /**
119
+ * Port — the small square straddling the border of what owns it (§11.3.4).
120
+ * FILLED, and drawn half in and half out, because the whole of what a port
121
+ * means is that it sits ON the boundary: a square inside the box would be a
122
+ * part, and one outside it would be a neighbour.
123
+ */
124
+ export const umlPortIcon = svg `<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
125
+ <rect x="3" y="5" width="13" height="14" rx="1.2" stroke="currentColor" stroke-width="1.6"/>
126
+ <rect x="13" y="9" width="6" height="6" rx="0.5" fill="currentColor"/>
127
+ </svg>`;
128
+ /** Provided interface — the LOLLIPOP: a stub ending in a full circle (§10.4.4). */
129
+ export const umlProvidedInterfaceIcon = svg `<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
130
+ <path d="M2.5 12 H12" stroke="currentColor" stroke-width="1.8" stroke-linecap="round"/>
131
+ <circle cx="16" cy="12" r="4.2" stroke="currentColor" stroke-width="1.6"/>
132
+ </svg>`;
133
+ /**
134
+ * Required interface — the SOCKET: the same stub ending in the half circle that
135
+ * cups a ball (§10.4.4). Open on the side the ball comes from, which is what
136
+ * makes an assembly read as one joint rather than as two marks that happen to
137
+ * touch.
138
+ */
139
+ export const umlRequiredInterfaceIcon = svg `<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
140
+ <path d="M2.5 12 H12" stroke="currentColor" stroke-width="1.8" stroke-linecap="round"/>
141
+ <path d="M16.5 7.5 A4.5 4.5 0 0 0 16.5 16.5" stroke="currentColor" stroke-width="1.6" stroke-linecap="round"/>
142
+ </svg>`;
143
+ /* ── Phase 2: what a deployment diagram is made of ──────────────────────── */
144
+ /**
145
+ * Artifact — the document with its corner turned down (§19.3.4), told from the
146
+ * note beside it by the lines written ON it: a note is a comment about the
147
+ * model, an artifact is a FILE that is part of the system.
148
+ */
149
+ export const umlArtifactIcon = svg `<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
150
+ <path d="M5.5 3.5 H14.5 L18.5 7.5 V20.5 H5.5 Z" stroke="currentColor" stroke-width="1.6" stroke-linejoin="round"/>
151
+ <path d="M14.5 3.5 V7.5 H18.5" stroke="currentColor" stroke-width="1.4" stroke-linejoin="round"/>
152
+ <path d="M8.5 12 H15.5 M8.5 15.5 H13" stroke="currentColor" stroke-width="1.3" stroke-linecap="round"/>
153
+ </svg>`;
154
+ /** The cube every deployment target is drawn as (§19.4.4) — front, top, side. */
155
+ const cube = 'M3 8 H16 V20 H3 Z';
156
+ const cubeBack = 'M3 8 L7 4 H20 V16 L16 20 M16 8 L20 4';
157
+ /** Node — the bare 3D box: a computational resource, and nothing said of it. */
158
+ export const umlNodeIcon = svg `<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
159
+ <path d="${cube}" stroke="currentColor" stroke-width="1.6" stroke-linejoin="round"/>
160
+ <path d="${cubeBack}" stroke="currentColor" stroke-width="1.4" stroke-linejoin="round"/>
161
+ </svg>`;
162
+ /**
163
+ * Device — the same cube, carrying the filled chip that says this node is a
164
+ * piece of HARDWARE (§19.4.4's `«device»`, as a mark rather than as a word,
165
+ * because a 24-unit glyph has no room for a keyword).
166
+ */
167
+ export const umlDeviceIcon = svg `<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
168
+ <path d="${cube}" stroke="currentColor" stroke-width="1.6" stroke-linejoin="round"/>
169
+ <path d="${cubeBack}" stroke="currentColor" stroke-width="1.4" stroke-linejoin="round"/>
170
+ <rect x="6" y="12" width="7" height="4.5" rx="0.6" fill="currentColor"/>
171
+ </svg>`;
172
+ /**
173
+ * Execution environment — the cube with the RUN mark on its face: software that
174
+ * other software is deployed into (§19.4.4's `«executionEnvironment»`), which is
175
+ * exactly the distinction from the device beside it.
176
+ */
177
+ export const umlExecutionEnvironmentIcon = svg `<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
178
+ <path d="${cube}" stroke="currentColor" stroke-width="1.6" stroke-linejoin="round"/>
179
+ <path d="${cubeBack}" stroke="currentColor" stroke-width="1.4" stroke-linejoin="round"/>
180
+ <path d="M7 11.5 L12.5 14.3 L7 17 Z" fill="currentColor"/>
181
+ </svg>`;
182
+ /* ── Phase 2: what an ACTIVITY diagram is made of (§15, §16) ────────────── */
183
+ /**
184
+ * Action — the round-cornered rectangle of §15.2.4, and the one shape of an
185
+ * activity diagram that holds a sentence. The corners are the whole of what
186
+ * tells it from a class box at this size, so they are drawn generously.
187
+ */
188
+ export const umlActionIcon = svg `<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
189
+ <rect x="3" y="7" width="18" height="10" rx="4" stroke="currentColor" stroke-width="1.6"/>
190
+ </svg>`;
191
+ /**
192
+ * Initial node — the FILLED disc where a flow begins (§15.3.4), with the first
193
+ * arrow leaving it. One per region, and the arrow is what says the disc is a
194
+ * start rather than a junction.
195
+ */
196
+ export const umlInitialIcon = svg `<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
197
+ <circle cx="7" cy="12" r="4.5" fill="currentColor"/>
198
+ <path d="M12.5 12 H19" stroke="currentColor" stroke-width="1.6" stroke-linecap="round"/>
199
+ <path d="M16.5 9 L20 12 L16.5 15" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
200
+ </svg>`;
201
+ /**
202
+ * Activity final — the BULLSEYE that ends the whole activity (§15.3.4): every
203
+ * token in it stops, not only the one that arrived.
204
+ */
205
+ export const umlActivityFinalIcon = svg `<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
206
+ <circle cx="12" cy="12" r="8" stroke="currentColor" stroke-width="1.6"/>
207
+ <circle cx="12" cy="12" r="4.5" fill="currentColor"/>
208
+ </svg>`;
209
+ /**
210
+ * Flow final — the circle with the CROSS through it (§15.3.4): this one token
211
+ * ends here and the rest of the activity carries on. The distinction the
212
+ * bullseye beside it cannot draw, and the one everybody forgets exists.
213
+ */
214
+ export const umlFlowFinalIcon = svg `<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
215
+ <circle cx="12" cy="12" r="8" stroke="currentColor" stroke-width="1.6"/>
216
+ <path d="M8.5 8.5 L15.5 15.5 M15.5 8.5 L8.5 15.5" stroke="currentColor" stroke-width="1.6" stroke-linecap="round"/>
217
+ </svg>`;
218
+ /**
219
+ * Decision — the diamond one token leaves by ONE branch (§15.3.4). The two
220
+ * outgoing stubs are the glyph's argument: a bare diamond is a shape, a diamond
221
+ * with a choice coming out of it is a decision.
222
+ */
223
+ export const umlDecisionIcon = svg `<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
224
+ <path d="M9 12 L14 6.5 L19 12 L14 17.5 Z" stroke="currentColor" stroke-width="1.6" stroke-linejoin="round"/>
225
+ <path d="M2.5 12 H9" stroke="currentColor" stroke-width="1.6" stroke-linecap="round"/>
226
+ </svg>`;
227
+ /**
228
+ * Fork — the filled BAR one token leaves by every branch at once (§15.3.4),
229
+ * which is exactly the difference from the diamond above: concurrency, not
230
+ * choice. Drawn with the two outgoing lines, because a bar on its own is a rule.
231
+ */
232
+ export const umlForkIcon = svg `<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
233
+ <rect x="10" y="4" width="3.5" height="16" rx="0.6" fill="currentColor"/>
234
+ <path d="M3 12 H10" stroke="currentColor" stroke-width="1.6" stroke-linecap="round"/>
235
+ <path d="M13.5 8 H20 M13.5 16 H20" stroke="currentColor" stroke-width="1.6" stroke-linecap="round"/>
236
+ </svg>`;
237
+ /**
238
+ * Object node — the plain rectangle DATA travels through (§15.4.4), drawn with
239
+ * the flow entering and leaving it. The arrows are not decoration: an object
240
+ * node is told from every other rectangle on the sheet by sitting ON a flow.
241
+ */
242
+ export const umlObjectNodeIcon = svg `<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
243
+ <rect x="7" y="8" width="10" height="8" stroke="currentColor" stroke-width="1.6"/>
244
+ <path d="M2.5 12 H7 M17 12 H21.5" stroke="currentColor" stroke-width="1.6" stroke-linecap="round"/>
245
+ </svg>`;
246
+ /**
247
+ * Send signal — the CONVEX pentagon of §16.3.4: a box with its right edge
248
+ * pushed out into a point, which is the message leaving.
249
+ */
250
+ export const umlSendSignalIcon = svg `<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
251
+ <path d="M3 7 H15 L20 12 L15 17 H3 Z" stroke="currentColor" stroke-width="1.6" stroke-linejoin="round"/>
252
+ </svg>`;
253
+ /**
254
+ * Accept event — the CONCAVE pentagon of §16.10.4: the same box with its LEFT
255
+ * edge notched IN, the cup the message arrives into. The pair is the one thing
256
+ * on an activity diagram a reader tells apart by silhouette alone, which is why
257
+ * the two glyphs are deliberately mirror images.
258
+ */
259
+ export const umlAcceptEventIcon = svg `<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
260
+ <path d="M3 7 H21 V17 H3 L8 12 Z" stroke="currentColor" stroke-width="1.6" stroke-linejoin="round"/>
261
+ </svg>`;
262
+ /** Time event — the HOURGLASS that fires when its moment comes (§16.10.4). */
263
+ export const umlTimeEventIcon = svg `<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
264
+ <path d="M6 4 H18 L6 20 H18" stroke="currentColor" stroke-width="1.6" stroke-linejoin="round" stroke-linecap="round"/>
265
+ <path d="M6 4 L18 20" stroke="currentColor" stroke-width="1.6" stroke-linecap="round"/>
266
+ </svg>`;
267
+ /**
268
+ * Partition — the swimlane (§15.6.4): two bands with a name strip on top, which
269
+ * is what a vertical partition set actually looks like. The strip is the half
270
+ * of the drawing that matters — a lane with no heading is a line.
271
+ */
272
+ export const umlPartitionIcon = svg `<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
273
+ <rect x="3" y="4" width="18" height="16" stroke="currentColor" stroke-width="1.6"/>
274
+ <path d="M3 9 H21 M12 4 V20" stroke="currentColor" stroke-width="1.4"/>
275
+ </svg>`;
276
+ /* ── Phase 2: what a STATE MACHINE is made of (§14.2.4) ─────────────────── */
277
+ /**
278
+ * State — the round-cornered box with a NAME BAND (§14.2.4). The separator is
279
+ * what tells it from the action it shares a silhouette with: an action is one
280
+ * sentence, a state is a name over the `entry` / `do` / `exit` lines below it.
281
+ */
282
+ export const umlStateIcon = svg `<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
283
+ <rect x="3" y="5" width="18" height="14" rx="4" stroke="currentColor" stroke-width="1.6"/>
284
+ <path d="M3 11 H21" stroke="currentColor" stroke-width="1.4"/>
285
+ </svg>`;
286
+ /**
287
+ * Final state — the bullseye that ends the machine (§14.2.4).
288
+ *
289
+ * The SAME drawing as the activity final beside it, deliberately: §14.2.4 and
290
+ * §15.3.4 both draw a filled circle inside a ring, and inventing a difference
291
+ * would be this pack teaching a notation UML does not have. What separates them
292
+ * is the role and the sheet they are legal on — a final state on an activity
293
+ * diagram is what the per-frame admissibility lists refuse.
294
+ */
295
+ export const umlFinalStateIcon = svg `<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
296
+ <circle cx="12" cy="12" r="8" stroke="currentColor" stroke-width="1.6"/>
297
+ <circle cx="12" cy="12" r="4.5" fill="currentColor"/>
298
+ </svg>`;
299
+ /**
300
+ * Choice — the diamond a transition branches at (§14.2.4), and the state
301
+ * machine's twin of the activity decision: the same drawing, on the other
302
+ * diagram, for the same reason the two finals share theirs.
303
+ */
304
+ export const umlChoiceIcon = svg `<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
305
+ <path d="M9 12 L14 6.5 L19 12 L14 17.5 Z" stroke="currentColor" stroke-width="1.6" stroke-linejoin="round"/>
306
+ <path d="M2.5 12 H9" stroke="currentColor" stroke-width="1.6" stroke-linecap="round"/>
307
+ </svg>`;
308
+ /**
309
+ * Junction — the small filled dot several transitions MERGE at (§14.2.4). The
310
+ * three incoming stubs are what tells it from the initial node's disc: an
311
+ * initial has one arrow out and nothing in, a junction is a knot.
312
+ */
313
+ export const umlJunctionIcon = svg `<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
314
+ <circle cx="12" cy="12" r="3.5" fill="currentColor"/>
315
+ <path d="M3 6 L9 10.5 M3 18 L9 13.5 M15.5 12 H21" stroke="currentColor" stroke-width="1.5" stroke-linecap="round"/>
316
+ </svg>`;
317
+ /** The `H` of a history pseudostate, drawn as strokes rather than set as type. */
318
+ const historyH = 'M9 8.5 V15.5 M15 8.5 V15.5 M9 12 H15';
319
+ /**
320
+ * Shallow history — the `H` in a circle (§14.2.4): re-enter this region at the
321
+ * sub-state it was last in.
322
+ */
323
+ export const umlShallowHistoryIcon = svg `<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
324
+ <circle cx="12" cy="12" r="8.5" stroke="currentColor" stroke-width="1.6"/>
325
+ <path d="${historyH}" stroke="currentColor" stroke-width="1.6" stroke-linecap="round"/>
326
+ </svg>`;
327
+ /**
328
+ * Deep history — the same `H` with the ASTERISK (§14.2.4): restore the whole
329
+ * nested configuration, not only the top level. One star apart, which is why
330
+ * the circle is drawn smaller here to make room for it rather than redrawn.
331
+ */
332
+ export const umlDeepHistoryIcon = svg `<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
333
+ <circle cx="10.5" cy="12" r="8" stroke="currentColor" stroke-width="1.6"/>
334
+ <path d="M7.5 8.5 V15.5 M13.5 8.5 V15.5 M7.5 12 H13.5" stroke="currentColor" stroke-width="1.6" stroke-linecap="round"/>
335
+ <path d="M19.5 4.5 V9.5 M17.3 5.8 L21.7 8.2 M21.7 5.8 L17.3 8.2" stroke="currentColor" stroke-width="1.4" stroke-linecap="round"/>
336
+ </svg>`;
337
+ /**
338
+ * Entry point — the hollow circle ON a composite state's border (§14.2.4): the
339
+ * named way IN. The border is drawn because the mark means nothing off it.
340
+ */
341
+ export const umlEntryPointIcon = svg `<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
342
+ <path d="M12 3.5 V20.5" stroke="currentColor" stroke-width="1.6"/>
343
+ <path d="M2.5 12 H8" stroke="currentColor" stroke-width="1.5" stroke-linecap="round"/>
344
+ <circle cx="12" cy="12" r="4" fill="none" stroke="currentColor" stroke-width="1.6"/>
345
+ </svg>`;
346
+ /**
347
+ * Exit point — the same circle on the same border, CROSSED (§14.2.4): the named
348
+ * way out.
349
+ */
350
+ export const umlExitPointIcon = svg `<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
351
+ <path d="M12 3.5 V20.5" stroke="currentColor" stroke-width="1.6"/>
352
+ <path d="M16 12 H21.5" stroke="currentColor" stroke-width="1.5" stroke-linecap="round"/>
353
+ <circle cx="12" cy="12" r="4" fill="none" stroke="currentColor" stroke-width="1.6"/>
354
+ <path d="M9.5 9.5 L14.5 14.5 M14.5 9.5 L9.5 14.5" stroke="currentColor" stroke-width="1.4" stroke-linecap="round"/>
355
+ </svg>`;
356
+ /**
357
+ * Terminate — the bare CROSS (§14.2.4): the machine stops here and nothing
358
+ * else runs. No circle round it, which is the whole of what tells it from the
359
+ * flow final and from the exit point.
360
+ */
361
+ export const umlTerminateIcon = svg `<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
362
+ <path d="M5 5 L19 19 M19 5 L5 19" stroke="currentColor" stroke-width="2.2" stroke-linecap="round"/>
363
+ </svg>`;
364
+ /**
365
+ * Region — the composite state (§14.2.4): the rounded box with its name band
366
+ * and a sub-machine inside it. The two little states are the point — a region
367
+ * is a container, and a glyph of an empty rounded box would be the state's.
368
+ */
369
+ export const umlRegionIcon = svg `<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
370
+ <rect x="2.5" y="4" width="19" height="16" rx="3" stroke="currentColor" stroke-width="1.6"/>
371
+ <path d="M2.5 9 H21.5" stroke="currentColor" stroke-width="1.4"/>
372
+ <rect x="5.5" y="12" width="5.5" height="4.5" rx="1.5" stroke="currentColor" stroke-width="1.3"/>
373
+ <rect x="13" y="12" width="5.5" height="4.5" rx="1.5" stroke="currentColor" stroke-width="1.3"/>
374
+ </svg>`;
375
+ /* ── The relationships: each glyph IS the line the tool draws ───────────── */
376
+ /** Association — a plain solid line, undirected (§11.5.4). */
377
+ export const umlAssociationIcon = svg `<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
378
+ <path d="M3 12 H21" stroke="currentColor" stroke-width="1.8" stroke-linecap="round"/>
379
+ </svg>`;
380
+ /** Aggregation — the HOLLOW diamond at the whole's end (§11.5.4). */
381
+ export const umlAggregationIcon = svg `<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
382
+ <path d="M9 12 H21" stroke="currentColor" stroke-width="1.8" stroke-linecap="round"/>
383
+ <path d="M3 12 L6 9 L9 12 L6 15 Z" stroke="currentColor" stroke-width="1.6" stroke-linejoin="round"/>
384
+ </svg>`;
385
+ /** Composition — the same diamond, FILLED (§11.5.4). */
386
+ export const umlCompositionIcon = svg `<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
387
+ <path d="M9 12 H21" stroke="currentColor" stroke-width="1.8" stroke-linecap="round"/>
388
+ <path d="M3 12 L6 9 L9 12 L6 15 Z" fill="currentColor" stroke="currentColor" stroke-width="1.6" stroke-linejoin="round"/>
389
+ </svg>`;
390
+ /** Generalization — a solid line with a hollow triangle on the general end. */
391
+ export const umlGeneralizationIcon = svg `<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
392
+ <path d="M3 12 H15" stroke="currentColor" stroke-width="1.8" stroke-linecap="round"/>
393
+ <path d="M15 7.5 L21 12 L15 16.5 Z" stroke="currentColor" stroke-width="1.6" stroke-linejoin="round"/>
394
+ </svg>`;
395
+ /** Realization — the same hollow triangle, on a DASHED line (§10.4.2.1). */
396
+ export const umlRealizationIcon = svg `<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
397
+ <path d="M3 12 H15" stroke="currentColor" stroke-width="1.8" stroke-dasharray="3 2.6" stroke-linecap="round"/>
398
+ <path d="M15 7.5 L21 12 L15 16.5 Z" stroke="currentColor" stroke-width="1.6" stroke-linejoin="round"/>
399
+ </svg>`;
400
+ /** Dependency — a dashed line with an open arrowhead (§7.8.4). */
401
+ export const umlDependencyIcon = svg `<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
402
+ <path d="M3 12 H18" stroke="currentColor" stroke-width="1.8" stroke-dasharray="3 2.6" stroke-linecap="round"/>
403
+ <path d="M14.5 8.4 L21 12 L14.5 15.6" stroke="currentColor" stroke-width="1.6" stroke-linecap="round" stroke-linejoin="round"/>
404
+ </svg>`;
405
+ /**
406
+ * Anchor — the DASHED line with no head at all, which is how a note is tied to
407
+ * what it comments on (§7.5.4). The only relationship of this pack that says
408
+ * nothing about direction, and the glyph says so by carrying no arrow.
409
+ */
410
+ export const umlAnchorIcon = svg `<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
411
+ <path d="M3 12 H21" stroke="currentColor" stroke-width="1.8" stroke-dasharray="3 2.6" stroke-linecap="round"/>
412
+ </svg>`;
413
+ /**
414
+ * Include — a dependency whose keyword is `«include»`, drawn with the chevrons
415
+ * over the line so the two use-case relationships are told apart at a glance
416
+ * rather than by their tooltip (§18.1.4).
417
+ */
418
+ export const umlIncludeIcon = svg `<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
419
+ <path d="M3 16 H18" stroke="currentColor" stroke-width="1.8" stroke-dasharray="3 2.6" stroke-linecap="round"/>
420
+ <path d="M14.5 12.4 L21 16 L14.5 19.6" stroke="currentColor" stroke-width="1.6" stroke-linecap="round" stroke-linejoin="round"/>
421
+ <path d="M8 4 L5.5 6.8 L8 9.6 M14 4 L16.5 6.8 L14 9.6" stroke="currentColor" stroke-width="1.4" stroke-linecap="round" stroke-linejoin="round"/>
422
+ </svg>`;
423
+ /** Extend — the same dashed arrow, with the chevrons pointing outward. */
424
+ export const umlExtendIcon = svg `<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
425
+ <path d="M3 16 H18" stroke="currentColor" stroke-width="1.8" stroke-dasharray="3 2.6" stroke-linecap="round"/>
426
+ <path d="M14.5 12.4 L21 16 L14.5 19.6" stroke="currentColor" stroke-width="1.6" stroke-linecap="round" stroke-linejoin="round"/>
427
+ <path d="M5.5 4 L8 6.8 L5.5 9.6 M16.5 4 L14 6.8 L16.5 9.6" stroke="currentColor" stroke-width="1.4" stroke-linecap="round" stroke-linejoin="round"/>
428
+ </svg>`;
429
+ /**
430
+ * Deploy — the dashed dependency arrow of §19.2.4, pointed at the NODE it lands
431
+ * on. The box above it is the target, not decoration: `«deploy»` and
432
+ * `«manifest»` are the same line, and the only thing that can tell them apart in
433
+ * a menu row is what sits at the far end.
434
+ */
435
+ export const umlDeployIcon = svg `<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
436
+ <path d="M2 16 H16" stroke="currentColor" stroke-width="1.8" stroke-dasharray="3 2.6" stroke-linecap="round"/>
437
+ <path d="M12.5 12.4 L19 16 L12.5 19.6" stroke="currentColor" stroke-width="1.6" stroke-linecap="round" stroke-linejoin="round"/>
438
+ <rect x="13" y="2.5" width="8" height="7" rx="0.8" stroke="currentColor" stroke-width="1.4"/>
439
+ </svg>`;
440
+ /** Manifest — the same arrow, landing on the artifact's own document glyph. */
441
+ export const umlManifestIcon = svg `<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
442
+ <path d="M2 16 H16" stroke="currentColor" stroke-width="1.8" stroke-dasharray="3 2.6" stroke-linecap="round"/>
443
+ <path d="M12.5 12.4 L19 16 L12.5 19.6" stroke="currentColor" stroke-width="1.6" stroke-linecap="round" stroke-linejoin="round"/>
444
+ <path d="M13.5 2.5 H18 L20.5 5 V10 H13.5 Z" stroke="currentColor" stroke-width="1.4" stroke-linejoin="round"/>
445
+ <path d="M18 2.5 V5 H20.5" stroke="currentColor" stroke-width="1.2" stroke-linejoin="round"/>
446
+ </svg>`;
447
+ /**
448
+ * Communication path — a plain solid line between two NODES (§19.4.4). The two
449
+ * boxes are what separates it from the association it is drawn exactly like: a
450
+ * network link joins machines, and it claims no direction at either end.
451
+ */
452
+ export const umlCommunicationPathIcon = svg `<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
453
+ <path d="M6 12 H18" stroke="currentColor" stroke-width="1.8" stroke-linecap="round"/>
454
+ <rect x="1.5" y="8.5" width="5" height="7" rx="0.8" stroke="currentColor" stroke-width="1.4"/>
455
+ <rect x="17.5" y="8.5" width="5" height="7" rx="0.8" stroke="currentColor" stroke-width="1.4"/>
456
+ </svg>`;
457
+ /**
458
+ * Control flow — the SOLID line with an open arrowhead (§15.2.4). The look no
459
+ * structural relationship wears: a behaviour diagram states an order and
460
+ * therefore always points.
461
+ */
462
+ export const umlControlFlowIcon = svg `<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
463
+ <path d="M3 12 H18" stroke="currentColor" stroke-width="1.8" stroke-linecap="round"/>
464
+ <path d="M14.5 8.4 L21 12 L14.5 15.6" stroke="currentColor" stroke-width="1.6" stroke-linecap="round" stroke-linejoin="round"/>
465
+ </svg>`;
466
+ /**
467
+ * Object flow — the same arrow, with the DATA on it. §15.2.4 draws no line of
468
+ * its own for an object flow and tells it apart by what the flow runs between,
469
+ * so the glyph says that rather than inventing a dash: the little rectangle is
470
+ * the object node the line passes through.
471
+ */
472
+ export const umlObjectFlowIcon = svg `<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
473
+ <path d="M2 12 H8 M14 12 H18" stroke="currentColor" stroke-width="1.8" stroke-linecap="round"/>
474
+ <path d="M14.5 8.4 L21 12 L14.5 15.6" stroke="currentColor" stroke-width="1.6" stroke-linecap="round" stroke-linejoin="round"/>
475
+ <rect x="8" y="9" width="6" height="6" stroke="currentColor" stroke-width="1.4"/>
476
+ </svg>`;
477
+ /**
478
+ * Transition — the same arrow again (§14.2.4.8), carrying its LABEL: the
479
+ * `trigger [guard] / effect` written over the line is the whole of what a state
480
+ * machine's arrow says, and the only thing that separates this glyph from the
481
+ * control flow above it.
482
+ */
483
+ export const umlTransitionIcon = svg `<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
484
+ <path d="M3 16 H18" stroke="currentColor" stroke-width="1.8" stroke-linecap="round"/>
485
+ <path d="M14.5 12.4 L21 16 L14.5 19.6" stroke="currentColor" stroke-width="1.6" stroke-linecap="round" stroke-linejoin="round"/>
486
+ <path d="M5 7 H16 M5 10.5 H12" stroke="currentColor" stroke-width="1.4" stroke-linecap="round"/>
487
+ </svg>`;
488
+ /* ── Phase 3: what a SEQUENCE diagram is made of (§17.2.4, §17.4.4) ────── */
489
+ /**
490
+ * Lifeline — the named head with the dashed spine falling out of it (§17.2.4).
491
+ *
492
+ * The dashes are the half that matters: a head on its own is a class box, and
493
+ * what makes a lifeline a lifeline is that time runs down the line under it.
494
+ */
495
+ export const umlLifelineIcon = svg `<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
496
+ <rect x="5" y="3.5" width="14" height="7" stroke="currentColor" stroke-width="1.6"/>
497
+ <path d="M12 10.5 V21" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-dasharray="2.4 2.4"/>
498
+ </svg>`;
499
+ /**
500
+ * Execution specification — the thin BAR sat on a spine (§17.2.4): the stretch
501
+ * of the diagram during which this participant is doing something. Drawn ON the
502
+ * dashes, because a bar floating beside a lifeline means nothing at all.
503
+ */
504
+ export const umlExecutionIcon = svg `<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
505
+ <path d="M12 3 V21" stroke="currentColor" stroke-width="1.4" stroke-linecap="round" stroke-dasharray="2.4 2.4"/>
506
+ <rect x="9.5" y="7" width="5" height="10" fill="currentColor" fill-opacity="0.25" stroke="currentColor" stroke-width="1.5"/>
507
+ </svg>`;
508
+ /**
509
+ * Destruction occurrence — the CROSS that ends a lifeline (§17.2.4). The spine
510
+ * stops at it, which is the whole statement: nothing happens to this
511
+ * participant afterwards.
512
+ */
513
+ export const umlDestructionIcon = svg `<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
514
+ <path d="M12 3 V13" stroke="currentColor" stroke-width="1.4" stroke-linecap="round" stroke-dasharray="2.4 2.4"/>
515
+ <path d="M7 13 L17 21 M17 13 L7 21" stroke="currentColor" stroke-width="2" stroke-linecap="round"/>
516
+ </svg>`;
517
+ /**
518
+ * Combined fragment — the rectangle with the PENTAGON tag in its corner
519
+ * (§17.6.4), and the dashed rule that separates two operands.
520
+ *
521
+ * The cut corner and the dashed line are the two things the notation draws and
522
+ * nothing else does: a plain rectangle is a subject, a region or a partition.
523
+ */
524
+ export const umlFragmentIcon = svg `<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
525
+ <rect x="3" y="4" width="18" height="16" stroke="currentColor" stroke-width="1.6"/>
526
+ <path d="M3 4 H10 L12 6.5 V9 H3 Z" stroke="currentColor" stroke-width="1.4" stroke-linejoin="round"/>
527
+ <path d="M3 14.5 H21" stroke="currentColor" stroke-width="1.3" stroke-dasharray="2.5 2.5"/>
528
+ </svg>`;
529
+ /**
530
+ * Interaction use — the same frame with `ref` in its tag (§17.7.4), drawn here
531
+ * as the ARROW out of the box: the glyph has no room for three letters at 24
532
+ * units, and "this happens somewhere else" is what the reader has to take from
533
+ * it. No dashed rule, which is the one thing that tells it from the fragment
534
+ * above: a `ref` has no operands to separate.
535
+ */
536
+ export const umlInteractionUseIcon = svg `<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
537
+ <rect x="3" y="4" width="18" height="16" stroke="currentColor" stroke-width="1.6"/>
538
+ <path d="M3 4 H10 L12 6.5 V9 H3 Z" stroke="currentColor" stroke-width="1.4" stroke-linejoin="round"/>
539
+ <path d="M8.5 16 L16 12.5" stroke="currentColor" stroke-width="1.5" stroke-linecap="round"/>
540
+ <path d="M12.5 12 L16.5 12.4 L16 16.2" stroke="currentColor" stroke-width="1.4" stroke-linecap="round" stroke-linejoin="round"/>
541
+ </svg>`;
542
+ /**
543
+ * Synchronous message — a solid line with a FILLED arrowhead (§17.4.4): the
544
+ * caller waits, and the black triangle is the whole of what says so.
545
+ */
546
+ export const umlMessageSyncIcon = svg `<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
547
+ <path d="M3 12 H16" stroke="currentColor" stroke-width="1.8" stroke-linecap="round"/>
548
+ <path d="M15 8 L21.5 12 L15 16 Z" fill="currentColor" stroke="currentColor" stroke-width="1.4" stroke-linejoin="round"/>
549
+ </svg>`;
550
+ /**
551
+ * Asynchronous message — the same solid line with an OPEN stick arrowhead: the
552
+ * caller does not wait. The one pair in this pack where getting the head's fill
553
+ * backwards inverts the meaning of every call on the sheet.
554
+ */
555
+ export const umlMessageAsyncIcon = svg `<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
556
+ <path d="M3 12 H20" stroke="currentColor" stroke-width="1.8" stroke-linecap="round"/>
557
+ <path d="M15 7.8 L21 12 L15 16.2" stroke="currentColor" stroke-width="1.6" stroke-linecap="round" stroke-linejoin="round"/>
558
+ </svg>`;
559
+ /** Reply — the open head on a DASHED line, travelling back (§17.4.4). */
560
+ export const umlMessageReplyIcon = svg `<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
561
+ <path d="M21 12 H4" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-dasharray="3 2.6"/>
562
+ <path d="M9 7.8 L3 12 L9 16.2" stroke="currentColor" stroke-width="1.6" stroke-linecap="round" stroke-linejoin="round"/>
563
+ </svg>`;
564
+ /**
565
+ * Create message — the dashed arrow landing on a lifeline's HEAD (§17.4.4).
566
+ * The box at the end is the point: a create message is the one message that
567
+ * does not arrive on a spine, because the spine does not exist until it does.
568
+ */
569
+ export const umlMessageCreateIcon = svg `<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
570
+ <path d="M2 10 H12" stroke="currentColor" stroke-width="1.6" stroke-linecap="round" stroke-dasharray="3 2.6"/>
571
+ <path d="M9.5 6.6 L13.5 10 L9.5 13.4" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
572
+ <rect x="14" y="6.5" width="8" height="7" stroke="currentColor" stroke-width="1.5"/>
573
+ <path d="M18 13.5 V21" stroke="currentColor" stroke-width="1.3" stroke-linecap="round" stroke-dasharray="2.2 2.2"/>
574
+ </svg>`;
575
+ /**
576
+ * Delete message — the call that ends at the X (§17.4.4). The solid line with
577
+ * the filled head is the ordinary call; the cross is what makes it a deletion,
578
+ * and it is drawn here because the LINE alone cannot say so.
579
+ */
580
+ export const umlMessageDeleteIcon = svg `<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
581
+ <path d="M2 12 H11" stroke="currentColor" stroke-width="1.7" stroke-linecap="round"/>
582
+ <path d="M10 8.8 L14 12 L10 15.2 Z" fill="currentColor" stroke="currentColor" stroke-width="1.3" stroke-linejoin="round"/>
583
+ <path d="M15.5 8 L22 16 M22 8 L15.5 16" stroke="currentColor" stroke-width="1.8" stroke-linecap="round"/>
584
+ </svg>`;
585
+ /* ── The two exports ───────────────────────────────────────────────────── */
586
+ /**
587
+ * Export as PlantUML — the generic "document, going out" glyph the other packs
588
+ * use for an export, restated here rather than imported from BPMN's or C4's
589
+ * private module: a cross-framework import for one path would tie this pack's
590
+ * build to theirs, and the three are meant to ship separately.
591
+ */
592
+ export const umlExportPlantumlIcon = svg `<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
593
+ <path d="M13.5 3.5H7a1.5 1.5 0 0 0-1.5 1.5v14A1.5 1.5 0 0 0 7 20.5h3" stroke="currentColor" stroke-width="1.5" stroke-linecap="round"/>
594
+ <path d="M13.5 3.5 18.5 8.5V12" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
595
+ <path d="M16 20.5v-6M13.5 18l2.5 2.5 2.5-2.5" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
596
+ </svg>`;
597
+ /** Export as XMI — the same document, marked as the angle-bracketed one. */
598
+ export const umlExportXmiIcon = svg `<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
599
+ <path d="M13.5 3.5H7a1.5 1.5 0 0 0-1.5 1.5v14A1.5 1.5 0 0 0 7 20.5h2" stroke="currentColor" stroke-width="1.5" stroke-linecap="round"/>
600
+ <path d="M13.5 3.5 18.5 8.5V11" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
601
+ <path d="M14.5 14.5 12 17.5 14.5 20.5M18.5 14.5 21 17.5 18.5 20.5" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
602
+ </svg>`;
603
+ /**
604
+ * The three IMPORTS — the same page glyph as the exports beside them, with the
605
+ * arrow turned round (`docs/adr/0019`).
606
+ *
607
+ * Deliberately the same family as `bpmnImportXmlIcon`: a file becoming a board
608
+ * is one gesture across this library, and a user who has met it once in BPMN
609
+ * should not have to learn a second picture for it in UML. What differs between
610
+ * the three is the mark under the page — the arrow alone for PlantUML, the
611
+ * angle brackets for XMI, and the two connected boxes for draw.io, which is
612
+ * the only one of the three whose file is a DRAWING.
613
+ */
614
+ export const umlImportPlantumlIcon = svg `<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
615
+ <path d="M13.5 3.5H7a1.5 1.5 0 0 0-1.5 1.5v14A1.5 1.5 0 0 0 7 20.5h3" stroke="currentColor" stroke-width="1.5" stroke-linecap="round"/>
616
+ <path d="M13.5 3.5 18.5 8.5V12" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
617
+ <path d="M16 14.5v6M13.5 17l2.5-2.5 2.5 2.5" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
618
+ </svg>`;
619
+ /** Import XMI — the page arriving, marked as the angle-bracketed document. */
620
+ export const umlImportXmiIcon = svg `<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
621
+ <path d="M12.5 3.5H7a1.5 1.5 0 0 0-1.5 1.5v14A1.5 1.5 0 0 0 7 20.5h2" stroke="currentColor" stroke-width="1.5" stroke-linecap="round"/>
622
+ <path d="M12.5 3.5 17.5 8.5V11" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
623
+ <path d="M13.5 14.5 11 17.5 13.5 20.5M17.5 14.5 20 17.5 17.5 20.5" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
624
+ </svg>`;
625
+ /** Import draw.io — two connected boxes, which is what the file actually holds. */
626
+ export const umlImportDrawioIcon = svg `<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
627
+ <rect x="3" y="4" width="8" height="5.5" rx="1" stroke="currentColor" stroke-width="1.5"/>
628
+ <rect x="12.5" y="12" width="8" height="5.5" rx="1" stroke="currentColor" stroke-width="1.5"/>
629
+ <path d="M7 9.5v3.25h9.5v-0.75" stroke="currentColor" stroke-width="1.3" stroke-linecap="round" stroke-linejoin="round"/>
630
+ <path d="M6 15v5.5M3.5 18 6 15.5 8.5 18" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
631
+ </svg>`;
632
+ /**
633
+ * Every command glyph of the TOOLBOX, keyed by its `iconKey`.
634
+ *
635
+ * Registered together with the commands themselves
636
+ * (`CommandExtension(umlCommands, umlCommandIcons)`), so a key a descriptor
637
+ * names and this record does not hold renders as nothing.
638
+ *
639
+ * The two export glyphs are deliberately NOT here and are added to
640
+ * {@link umlToolbarIcon}'s sibling `umlCommandIcons` in `commands.ts` instead:
641
+ * this record is the glyphs of things UML DRAWS, and an export draws nothing.
642
+ */
643
+ export const UML_TOOLBOX_ICONS = {
644
+ 'uml.diagram': umlDiagramIcon,
645
+ 'uml.class': umlClassIcon,
646
+ 'uml.interface': umlInterfaceIcon,
647
+ 'uml.enumeration': umlEnumerationIcon,
648
+ 'uml.object': umlObjectIcon,
649
+ 'uml.package': umlPackageIcon,
650
+ 'uml.note': umlNoteIcon,
651
+ 'uml.actor': umlActorIcon,
652
+ 'uml.use-case': umlUseCaseIcon,
653
+ 'uml.subject': umlSubjectIcon,
654
+ 'uml.association': umlAssociationIcon,
655
+ 'uml.aggregation': umlAggregationIcon,
656
+ 'uml.composition': umlCompositionIcon,
657
+ 'uml.generalization': umlGeneralizationIcon,
658
+ 'uml.realization': umlRealizationIcon,
659
+ 'uml.dependency': umlDependencyIcon,
660
+ 'uml.anchor': umlAnchorIcon,
661
+ 'uml.include': umlIncludeIcon,
662
+ 'uml.extend': umlExtendIcon,
663
+ /* ── Phase 2: components and deployment ────────────────────────────── */
664
+ 'uml.component': umlComponentIcon,
665
+ 'uml.port': umlPortIcon,
666
+ 'uml.provided-interface': umlProvidedInterfaceIcon,
667
+ 'uml.required-interface': umlRequiredInterfaceIcon,
668
+ 'uml.artifact': umlArtifactIcon,
669
+ 'uml.node': umlNodeIcon,
670
+ 'uml.device': umlDeviceIcon,
671
+ 'uml.execution-environment': umlExecutionEnvironmentIcon,
672
+ 'uml.deploy': umlDeployIcon,
673
+ 'uml.manifest': umlManifestIcon,
674
+ 'uml.communication-path': umlCommunicationPathIcon,
675
+ /* ── Phase 2: activities and state machines ────────────────────────── */
676
+ 'uml.action': umlActionIcon,
677
+ 'uml.initial': umlInitialIcon,
678
+ 'uml.activity-final': umlActivityFinalIcon,
679
+ 'uml.flow-final': umlFlowFinalIcon,
680
+ 'uml.decision': umlDecisionIcon,
681
+ 'uml.fork': umlForkIcon,
682
+ 'uml.object-node': umlObjectNodeIcon,
683
+ 'uml.send-signal': umlSendSignalIcon,
684
+ 'uml.accept-event': umlAcceptEventIcon,
685
+ 'uml.time-event': umlTimeEventIcon,
686
+ 'uml.partition': umlPartitionIcon,
687
+ 'uml.state': umlStateIcon,
688
+ 'uml.final-state': umlFinalStateIcon,
689
+ 'uml.choice': umlChoiceIcon,
690
+ 'uml.junction': umlJunctionIcon,
691
+ 'uml.shallow-history': umlShallowHistoryIcon,
692
+ 'uml.deep-history': umlDeepHistoryIcon,
693
+ 'uml.entry-point': umlEntryPointIcon,
694
+ 'uml.exit-point': umlExitPointIcon,
695
+ 'uml.terminate': umlTerminateIcon,
696
+ 'uml.region': umlRegionIcon,
697
+ 'uml.control-flow': umlControlFlowIcon,
698
+ 'uml.object-flow': umlObjectFlowIcon,
699
+ 'uml.transition': umlTransitionIcon,
700
+ /* ── Phase 3: sequence diagrams ────────────────────────────────────── */
701
+ 'uml.lifeline': umlLifelineIcon,
702
+ 'uml.execution': umlExecutionIcon,
703
+ 'uml.destruction': umlDestructionIcon,
704
+ 'uml.fragment': umlFragmentIcon,
705
+ 'uml.interaction-use': umlInteractionUseIcon,
706
+ 'uml.message-sync': umlMessageSyncIcon,
707
+ 'uml.message-async': umlMessageAsyncIcon,
708
+ 'uml.message-reply': umlMessageReplyIcon,
709
+ 'uml.message-create': umlMessageCreateIcon,
710
+ 'uml.message-delete': umlMessageDeleteIcon,
711
+ };