@peter.prib/renderengine 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 (451) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +203 -2
  3. package/REFERENCE.md +2198 -0
  4. package/dist/renderengine-workspace.umd.js +46905 -0
  5. package/dist/renderengine.umd.js +42223 -0
  6. package/examples/archimate.html +66 -0
  7. package/examples/diagram-editor.html +51 -0
  8. package/package.json +65 -4
  9. package/src/BaseRenderer.js +57 -0
  10. package/src/CanvasRenderer.js +194 -0
  11. package/src/Mat4.js +111 -0
  12. package/src/OrbitCamera.js +57 -0
  13. package/src/RendererFactory.js +50 -0
  14. package/src/SVGRenderer.js +439 -0
  15. package/src/archimate.js +723 -0
  16. package/src/archimateArchiFormat.js +1693 -0
  17. package/src/archimateArchiTypes.js +72 -0
  18. package/src/archimateArchive.js +140 -0
  19. package/src/archimateCSV.js +127 -0
  20. package/src/archimateDrawio.js +182 -0
  21. package/src/archimateExchangeFormat.js +546 -0
  22. package/src/archimateRelationshipTable.js +93 -0
  23. package/src/archimateSpecializations.js +161 -0
  24. package/src/chartCatalog.js +589 -0
  25. package/src/charting/ArchimateDiagramEditor.js +1624 -0
  26. package/src/charting/ArchimateSpecializationSelector.js +134 -0
  27. package/src/charting/Axis.js +68 -0
  28. package/src/charting/CameraSeeder.js +30 -0
  29. package/src/charting/CatalogDialog.js +92 -0
  30. package/src/charting/Chart.js +37 -0
  31. package/src/charting/Chart3D.js +99 -0
  32. package/src/charting/ChartBox.js +80 -0
  33. package/src/charting/ChartData.js +27 -0
  34. package/src/charting/ChartRegistry.js +76 -0
  35. package/src/charting/CheckboxTreeSelector.js +304 -0
  36. package/src/charting/ColorField.js +107 -0
  37. package/src/charting/ColorPalette.js +88 -0
  38. package/src/charting/CommandHistory.js +176 -0
  39. package/src/charting/DataFilter.js +52 -0
  40. package/src/charting/Diagram.js +36 -0
  41. package/src/charting/Diagram3D.js +29 -0
  42. package/src/charting/DiagramClipboard.js +31 -0
  43. package/src/charting/DiagramEditor.js +3330 -0
  44. package/src/charting/DiagramEditorCommand.js +110 -0
  45. package/src/charting/DiagramEditorCommands.js +237 -0
  46. package/src/charting/DiagramEditorEdgeCommands.js +142 -0
  47. package/src/charting/DiagramEditorState.js +98 -0
  48. package/src/charting/DiagramRegistry.js +86 -0
  49. package/src/charting/DiagramTypeRegistry.js +326 -0
  50. package/src/charting/DiagramViewPropertiesDialog.js +46 -0
  51. package/src/charting/Edge.js +113 -0
  52. package/src/charting/ErrorBars.js +37 -0
  53. package/src/charting/FilterSystem.js +285 -0
  54. package/src/charting/FindReplaceDialog.js +139 -0
  55. package/src/charting/FormDialog.js +385 -0
  56. package/src/charting/Gauge.js +58 -0
  57. package/src/charting/Hierarchy.js +175 -0
  58. package/src/charting/HintPanel.js +86 -0
  59. package/src/charting/ImageSelector.js +148 -0
  60. package/src/charting/InteractionManager.js +725 -0
  61. package/src/charting/Legend.js +58 -0
  62. package/src/charting/MenuBar.js +62 -0
  63. package/src/charting/ModelFileFormat.js +115 -0
  64. package/src/charting/OrbitControls.js +77 -0
  65. package/src/charting/Palette.js +119 -0
  66. package/src/charting/PopupMenu.js +117 -0
  67. package/src/charting/PropertiesPanel.js +155 -0
  68. package/src/charting/PropertyListEditor.js +96 -0
  69. package/src/charting/PropertyLog.js +92 -0
  70. package/src/charting/SettingsCascade.js +93 -0
  71. package/src/charting/SettingsDialog.js +53 -0
  72. package/src/charting/SettingsManager.js +179 -0
  73. package/src/charting/SettingsViewPropertiesDialog.js +58 -0
  74. package/src/charting/ShapePaths.js +27 -0
  75. package/src/charting/Statistics.js +134 -0
  76. package/src/charting/TemplateCatalog.js +59 -0
  77. package/src/charting/TemplateLibrary.js +103 -0
  78. package/src/charting/TextStyle.js +168 -0
  79. package/src/charting/ViewFit.js +55 -0
  80. package/src/charting/ViewMenu.js +70 -0
  81. package/src/charting/ViewPropertiesDialog.js +77 -0
  82. package/src/charting/ViewTabStrip.js +81 -0
  83. package/src/charting/archimate/ArchiFileFormat.js +32 -0
  84. package/src/charting/archimate/ArchimateCanvasEditor.js +815 -0
  85. package/src/charting/archimate/ArchimateCsvFileFormat.js +35 -0
  86. package/src/charting/archimate/ArchimateEdge.js +137 -0
  87. package/src/charting/archimate/ArchimateElementTemplate.js +195 -0
  88. package/src/charting/archimate/ArchimatePalette.js +102 -0
  89. package/src/charting/archimate/CsvImportDialog.js +105 -0
  90. package/src/charting/archimate/CustomViewpoints.js +74 -0
  91. package/src/charting/archimate/DerivedEdge.js +29 -0
  92. package/src/charting/archimate/DrawioFileFormat.js +24 -0
  93. package/src/charting/archimate/ElementFilterRule.js +21 -0
  94. package/src/charting/archimate/ExchangeFileFormat.js +28 -0
  95. package/src/charting/archimate/ViewGroupTemplate.js +137 -0
  96. package/src/charting/archimate/ViewLineEdge.js +84 -0
  97. package/src/charting/archimate/ViewpointRule.js +45 -0
  98. package/src/charting/archimate/archimateFileFormats.js +12 -0
  99. package/src/charting/archimate/archimateNames.js +5 -0
  100. package/src/charting/archimate/csvMapping.js +122 -0
  101. package/src/charting/archimate/elementMenuItems.js +32 -0
  102. package/src/charting/archimate/elementProperties.js +146 -0
  103. package/src/charting/archimate/elementTypeChoices.js +7 -0
  104. package/src/charting/archimate/elementTypeGroups.js +19 -0
  105. package/src/charting/archimate/index.js +17 -0
  106. package/src/charting/archimate/specializationCatalogDialog.js +64 -0
  107. package/src/charting/archimate/typeGlyph.js +29 -0
  108. package/src/charting/arrangement/Arrangement.js +112 -0
  109. package/src/charting/arrangement/ArrangementCommand.js +29 -0
  110. package/src/charting/arrangement/BackgroundCommand.js +41 -0
  111. package/src/charting/arrangement/BackgroundGroup.js +18 -0
  112. package/src/charting/arrangement/GroupCommand.js +46 -0
  113. package/src/charting/arrangement/ItemGroup.js +62 -0
  114. package/src/charting/arrangement/LockCommand.js +32 -0
  115. package/src/charting/arrangement/UngroupCommand.js +27 -0
  116. package/src/charting/arrangement/alignment.js +88 -0
  117. package/src/charting/arrangement/arrangeMenuItems.js +25 -0
  118. package/src/charting/arrangement/index.js +11 -0
  119. package/src/charting/arrangement/layouts.js +233 -0
  120. package/src/charting/canvas/ArchiHint.js +78 -0
  121. package/src/charting/canvas/CanvasBoxKind.js +39 -0
  122. package/src/charting/canvas/CanvasPalette.js +49 -0
  123. package/src/charting/canvas/CanvasTemplateLibrary.js +61 -0
  124. package/src/charting/canvas/CanvasTemplateMenu.js +151 -0
  125. package/src/charting/canvas/EditHintCommand.js +28 -0
  126. package/src/charting/canvas/canvasBoxKinds.js +27 -0
  127. package/src/charting/canvas/canvasBoxMenuItems.js +40 -0
  128. package/src/charting/canvas/defaultCanvasTemplates.js +186 -0
  129. package/src/charting/canvas/diagramBoxKinds.js +12 -0
  130. package/src/charting/canvas/hintMenuItems.js +49 -0
  131. package/src/charting/charts/ArcGauge.js +55 -0
  132. package/src/charting/charts/AreaChart.js +71 -0
  133. package/src/charting/charts/BarChart.js +80 -0
  134. package/src/charting/charts/BarChart3D.js +56 -0
  135. package/src/charting/charts/BarChart3DOrbit.js +53 -0
  136. package/src/charting/charts/BarChartBase.js +70 -0
  137. package/src/charting/charts/BarGauge.js +42 -0
  138. package/src/charting/charts/BoxPlotChart.js +41 -0
  139. package/src/charting/charts/BubbleChart.js +99 -0
  140. package/src/charting/charts/BubbleChart3D.js +78 -0
  141. package/src/charting/charts/BulletGauge.js +87 -0
  142. package/src/charting/charts/CalendarHeatmapChart.js +204 -0
  143. package/src/charting/charts/CandlestickChart.js +54 -0
  144. package/src/charting/charts/ChordDiagram.js +130 -0
  145. package/src/charting/charts/DensityChart.js +73 -0
  146. package/src/charting/charts/DialGauge.js +65 -0
  147. package/src/charting/charts/DonutChart.js +15 -0
  148. package/src/charting/charts/FunnelChart.js +47 -0
  149. package/src/charting/charts/GanttChart.js +201 -0
  150. package/src/charting/charts/GaugeChart.js +175 -0
  151. package/src/charting/charts/GeoMapChart.js +146 -0
  152. package/src/charting/charts/GroupedBarChart.js +88 -0
  153. package/src/charting/charts/GroupedDistributionChart.js +70 -0
  154. package/src/charting/charts/HeatmapChart.js +80 -0
  155. package/src/charting/charts/HierarchyChart.js +39 -0
  156. package/src/charting/charts/HistogramChart.js +45 -0
  157. package/src/charting/charts/KpiTile.js +72 -0
  158. package/src/charting/charts/LagPlotChart.js +41 -0
  159. package/src/charting/charts/LineChart.js +124 -0
  160. package/src/charting/charts/MultiRingGauge.js +54 -0
  161. package/src/charting/charts/OutlineChart.js +95 -0
  162. package/src/charting/charts/ParallelCoordinatesChart.js +130 -0
  163. package/src/charting/charts/PieChart.js +56 -0
  164. package/src/charting/charts/PipeChart.js +88 -0
  165. package/src/charting/charts/PopulationPyramidChart.js +106 -0
  166. package/src/charting/charts/QQPlotChart.js +64 -0
  167. package/src/charting/charts/RadarChart.js +76 -0
  168. package/src/charting/charts/RadialBarChart.js +96 -0
  169. package/src/charting/charts/RingGauge.js +23 -0
  170. package/src/charting/charts/SankeyDiagram.js +174 -0
  171. package/src/charting/charts/ScatterChart.js +104 -0
  172. package/src/charting/charts/StackedAreaChart.js +15 -0
  173. package/src/charting/charts/StackedBarChart.js +33 -0
  174. package/src/charting/charts/StackedBarChart3DOrbit.js +58 -0
  175. package/src/charting/charts/StreamGraphChart.js +131 -0
  176. package/src/charting/charts/SunburstChart.js +57 -0
  177. package/src/charting/charts/ThermometerGauge.js +43 -0
  178. package/src/charting/charts/TreemapChart.js +54 -0
  179. package/src/charting/charts/ViolinChart.js +37 -0
  180. package/src/charting/charts/WaterfallChart.js +66 -0
  181. package/src/charting/charts/WordCloudChart.js +104 -0
  182. package/src/charting/diagramModel/AddViewCommand.js +33 -0
  183. package/src/charting/diagramModel/DiagramModel.js +39 -0
  184. package/src/charting/diagramModel/DiagramModelSearch.js +22 -0
  185. package/src/charting/diagramModel/DiagramView.js +50 -0
  186. package/src/charting/diagramModel/ModelHistory.js +43 -0
  187. package/src/charting/diagramModel/ModelReport.js +153 -0
  188. package/src/charting/diagramModel/ModelSearch.js +223 -0
  189. package/src/charting/diagramModel/RemoveViewCommand.js +25 -0
  190. package/src/charting/diagramModel/RenameViewCommand.js +21 -0
  191. package/src/charting/diagramModel/ReplaceTextCommand.js +25 -0
  192. package/src/charting/diagramModel/ViewSetChecker.js +34 -0
  193. package/src/charting/diagramModel/ViewSetModel.js +243 -0
  194. package/src/charting/diagramModel/index.js +6 -0
  195. package/src/charting/diagramModel/nameTransforms.js +29 -0
  196. package/src/charting/diagrams/ArchimateCommands.js +141 -0
  197. package/src/charting/diagrams/ArchimateDiagram.js +263 -0
  198. package/src/charting/diagrams/ArchimateModel.js +1155 -0
  199. package/src/charting/diagrams/ArchimateModelChecker.js +125 -0
  200. package/src/charting/diagrams/ArchimateModelReport.js +128 -0
  201. package/src/charting/diagrams/ArchimateModelSearch.js +41 -0
  202. package/src/charting/diagrams/ArchimateValidator.js +357 -0
  203. package/src/charting/diagrams/CanvasView.js +112 -0
  204. package/src/charting/diagrams/ContextMenu.js +37 -0
  205. package/src/charting/diagrams/DataModelDiagram.js +86 -0
  206. package/src/charting/diagrams/DataModelRelationshipStrategy.js +38 -0
  207. package/src/charting/diagrams/DerivedRelationships.js +102 -0
  208. package/src/charting/diagrams/EbnfDiagram.js +39 -0
  209. package/src/charting/diagrams/EdgeGeometry.js +553 -0
  210. package/src/charting/diagrams/EditViewItemCommand.js +128 -0
  211. package/src/charting/diagrams/ElementInstance.js +157 -0
  212. package/src/charting/diagrams/GraphDiagram.js +1340 -0
  213. package/src/charting/diagrams/GraphDiagram3D.js +152 -0
  214. package/src/charting/diagrams/GraphMetrics.js +81 -0
  215. package/src/charting/diagrams/GridOverlay.js +137 -0
  216. package/src/charting/diagrams/ImportRowsCommand.js +62 -0
  217. package/src/charting/diagrams/LabelHelper.js +108 -0
  218. package/src/charting/diagrams/MergeElementsCommand.js +101 -0
  219. package/src/charting/diagrams/NestInstanceCommand.js +34 -0
  220. package/src/charting/diagrams/NodeGeometry.js +158 -0
  221. package/src/charting/diagrams/PlaceItemsCommand.js +77 -0
  222. package/src/charting/diagrams/RadialLayout.js +101 -0
  223. package/src/charting/diagrams/RelationshipInstance.js +93 -0
  224. package/src/charting/diagrams/RemoveGroupFromViewCommand.js +28 -0
  225. package/src/charting/diagrams/RemoveLineCommand.js +27 -0
  226. package/src/charting/diagrams/ShowElementCommand.js +43 -0
  227. package/src/charting/diagrams/SvgCoordinate.js +17 -0
  228. package/src/charting/diagrams/SvgZoom.js +127 -0
  229. package/src/charting/diagrams/Tooltip.js +62 -0
  230. package/src/charting/diagrams/ViewConnectionInstance.js +102 -0
  231. package/src/charting/diagrams/ViewObjectInstance.js +56 -0
  232. package/src/charting/diagrams/commands/AddEdgeCommand.js +34 -0
  233. package/src/charting/diagrams/commands/AddNodeCommand.js +28 -0
  234. package/src/charting/diagrams/commands/AddWaypointCommand.js +27 -0
  235. package/src/charting/diagrams/commands/CreateFolderCommand.js +27 -0
  236. package/src/charting/diagrams/commands/DeleteEdgeCommand.js +30 -0
  237. package/src/charting/diagrams/commands/DeleteFolderCommand.js +47 -0
  238. package/src/charting/diagrams/commands/DeleteNodeCommand.js +35 -0
  239. package/src/charting/diagrams/commands/DeleteWaypointCommand.js +24 -0
  240. package/src/charting/diagrams/commands/GraphCommand.js +65 -0
  241. package/src/charting/diagrams/commands/InvertEdgeCommand.js +24 -0
  242. package/src/charting/diagrams/commands/MoveNodeCommand.js +44 -0
  243. package/src/charting/diagrams/commands/MoveWaypointCommand.js +27 -0
  244. package/src/charting/diagrams/commands/RenameEdgeCommand.js +23 -0
  245. package/src/charting/diagrams/commands/RenameFolderCommand.js +31 -0
  246. package/src/charting/diagrams/commands/RenameNodeCommand.js +27 -0
  247. package/src/charting/diagrams/commands/ResizeNodeCommand.js +46 -0
  248. package/src/charting/diagrams/commands/UpdateEdgeSideCommand.js +40 -0
  249. package/src/charting/diagrams/commands/index.js +17 -0
  250. package/src/charting/diagrams/duplicates.js +49 -0
  251. package/src/charting/diagrams/nesting.js +30 -0
  252. package/src/charting/diagrams/roadmap.js +77 -0
  253. package/src/charting/edgeMarkers/ArrowMarker.js +15 -0
  254. package/src/charting/edgeMarkers/CircleMarker.js +13 -0
  255. package/src/charting/edgeMarkers/CrowsFootMarker.js +16 -0
  256. package/src/charting/edgeMarkers/DiamondMarker.js +15 -0
  257. package/src/charting/edgeMarkers/EdgeMarker.js +34 -0
  258. package/src/charting/edgeMarkers/HalfArrowMarker.js +8 -0
  259. package/src/charting/edgeMarkers/HollowDiamondMarker.js +18 -0
  260. package/src/charting/edgeMarkers/HollowTriangleMarker.js +18 -0
  261. package/src/charting/edgeMarkers/OpenArrowMarker.js +17 -0
  262. package/src/charting/edgeMarkers/index.js +27 -0
  263. package/src/charting/edgeStyle/EdgeStyleCascade.js +22 -0
  264. package/src/charting/edgeStyle/EdgeStyleDialog.js +51 -0
  265. package/src/charting/edgeStyle/EdgeStyleSchema.js +43 -0
  266. package/src/charting/edgeStyle/SetStyleCommand.js +12 -0
  267. package/src/charting/edgeStyle/index.js +4 -0
  268. package/src/charting/emphasis/EmphasisRule.js +42 -0
  269. package/src/charting/emphasis/HighlightRule.js +24 -0
  270. package/src/charting/gauges/ArcTrack.js +51 -0
  271. package/src/charting/gauges/GaugeAnimation.js +51 -0
  272. package/src/charting/gauges/GaugeBands.js +48 -0
  273. package/src/charting/gauges/GaugeScale.js +87 -0
  274. package/src/charting/gauges/GaugeTrack.js +44 -0
  275. package/src/charting/gauges/GaugeValue.js +61 -0
  276. package/src/charting/gauges/HorizontalTrack.js +14 -0
  277. package/src/charting/gauges/LinearTrack.js +29 -0
  278. package/src/charting/gauges/Sparkline.js +42 -0
  279. package/src/charting/gauges/VerticalTrack.js +17 -0
  280. package/src/charting/glyphs/ArrowGlyph.js +21 -0
  281. package/src/charting/glyphs/BatteryGlyph.js +18 -0
  282. package/src/charting/glyphs/ChevronGlyph.js +18 -0
  283. package/src/charting/glyphs/CircleGlyph.js +15 -0
  284. package/src/charting/glyphs/CloudGlyph.js +19 -0
  285. package/src/charting/glyphs/ComponentGlyph.js +18 -0
  286. package/src/charting/glyphs/ConstraintGlyph.js +24 -0
  287. package/src/charting/glyphs/ContractBoxGlyph.js +10 -0
  288. package/src/charting/glyphs/CubeGlyph.js +19 -0
  289. package/src/charting/glyphs/CylinderGlyph.js +19 -0
  290. package/src/charting/glyphs/DashedDoubleArrowGlyph.js +11 -0
  291. package/src/charting/glyphs/DeviceGlyph.js +17 -0
  292. package/src/charting/glyphs/DiamondGlyph.js +17 -0
  293. package/src/charting/glyphs/DocumentGlyph.js +17 -0
  294. package/src/charting/glyphs/DoubleArrowGlyph.js +23 -0
  295. package/src/charting/glyphs/DoubleCircleGlyph.js +24 -0
  296. package/src/charting/glyphs/EllipseGlyph.js +18 -0
  297. package/src/charting/glyphs/FactoryGlyph.js +20 -0
  298. package/src/charting/glyphs/FlagGlyph.js +16 -0
  299. package/src/charting/glyphs/GapCircleGlyph.js +17 -0
  300. package/src/charting/glyphs/GearGlyph.js +37 -0
  301. package/src/charting/glyphs/Glyph.js +98 -0
  302. package/src/charting/glyphs/GroupingBoxGlyph.js +13 -0
  303. package/src/charting/glyphs/HalfCircleGlyph.js +22 -0
  304. package/src/charting/glyphs/HexagonGlyph.js +28 -0
  305. package/src/charting/glyphs/IconGlyph.js +22 -0
  306. package/src/charting/glyphs/ImageGlyph.js +16 -0
  307. package/src/charting/glyphs/JunctionGlyph.js +17 -0
  308. package/src/charting/glyphs/LollipopGlyph.js +22 -0
  309. package/src/charting/glyphs/MagnifierGlyph.js +17 -0
  310. package/src/charting/glyphs/NoteGlyph.js +33 -0
  311. package/src/charting/glyphs/ObjectBoxGlyph.js +21 -0
  312. package/src/charting/glyphs/OrJunctionGlyph.js +17 -0
  313. package/src/charting/glyphs/ParallelogramGlyph.js +20 -0
  314. package/src/charting/glyphs/PersonGlyph.js +23 -0
  315. package/src/charting/glyphs/PillGlyph.js +23 -0
  316. package/src/charting/glyphs/PinGlyph.js +18 -0
  317. package/src/charting/glyphs/PrincipleGlyph.js +23 -0
  318. package/src/charting/glyphs/ProductBoxGlyph.js +16 -0
  319. package/src/charting/glyphs/RectGlyph.js +15 -0
  320. package/src/charting/glyphs/RoundedBoxGlyph.js +13 -0
  321. package/src/charting/glyphs/StackGlyph.js +14 -0
  322. package/src/charting/glyphs/StepsGlyph.js +20 -0
  323. package/src/charting/glyphs/StickFigureGlyph.js +32 -0
  324. package/src/charting/glyphs/SystemSoftwareBoxGlyph.js +16 -0
  325. package/src/charting/glyphs/TabbedBoxGlyph.js +37 -0
  326. package/src/charting/glyphs/TargetGlyph.js +23 -0
  327. package/src/charting/glyphs/WavyBoxGlyph.js +17 -0
  328. package/src/charting/glyphs/WheelGlyph.js +28 -0
  329. package/src/charting/glyphs/drawGlyph.js +28 -0
  330. package/src/charting/glyphs/glyphSvg.js +55 -0
  331. package/src/charting/glyphs/index.js +109 -0
  332. package/src/charting/modelTree/AnalysisPanel.js +159 -0
  333. package/src/charting/modelTree/DiagramTabs.js +217 -0
  334. package/src/charting/modelTree/ModelTree.js +164 -0
  335. package/src/charting/modelTree/ModelTreePanel.js +914 -0
  336. package/src/charting/modelTree/TreeBuilder.js +238 -0
  337. package/src/charting/modelTree/TreeModeRegistry.js +51 -0
  338. package/src/charting/modelTree/TreeViewMode.js +110 -0
  339. package/src/charting/modelTree/buildFilterTrees.js +138 -0
  340. package/src/charting/modelTree/modes/FlatTreeMode.js +46 -0
  341. package/src/charting/modelTree/modes/LayerGroupedTreeMode.js +62 -0
  342. package/src/charting/modelTree/modes/TypeGroupedTreeMode.js +60 -0
  343. package/src/charting/modelTree/treeLayers.js +11 -0
  344. package/src/charting/report/reportHtml.js +82 -0
  345. package/src/charting/report/reportViewer.js +118 -0
  346. package/src/charting/shapes/CircleShape.js +19 -0
  347. package/src/charting/shapes/PathShape.js +17 -0
  348. package/src/charting/shapes/RectShape.js +20 -0
  349. package/src/charting/shapes/Shape.js +20 -0
  350. package/src/charting/shapes/ShapeFactory.js +23 -0
  351. package/src/charting/storage/LocalJsonStore.js +43 -0
  352. package/src/charting/templates/ActorTemplate.js +36 -0
  353. package/src/charting/templates/BoxTemplate.js +27 -0
  354. package/src/charting/templates/CircleTemplate.js +18 -0
  355. package/src/charting/templates/ClassTemplate.js +20 -0
  356. package/src/charting/templates/CloudTemplate.js +43 -0
  357. package/src/charting/templates/ComponentTemplate.js +19 -0
  358. package/src/charting/templates/CylinderTemplate.js +30 -0
  359. package/src/charting/templates/DataStoreTemplate.js +16 -0
  360. package/src/charting/templates/DiamondTemplate.js +10 -0
  361. package/src/charting/templates/DocumentTemplate.js +32 -0
  362. package/src/charting/templates/EllipseTemplate.js +15 -0
  363. package/src/charting/templates/FinalStateTemplate.js +12 -0
  364. package/src/charting/templates/GlyphTemplate.js +47 -0
  365. package/src/charting/templates/HexagonTemplate.js +17 -0
  366. package/src/charting/templates/LifelineTemplate.js +20 -0
  367. package/src/charting/templates/ManualInputTemplate.js +12 -0
  368. package/src/charting/templates/NoteTemplate.js +23 -0
  369. package/src/charting/templates/OctagonTemplate.js +7 -0
  370. package/src/charting/templates/PackageTemplate.js +25 -0
  371. package/src/charting/templates/ParallelogramTemplate.js +11 -0
  372. package/src/charting/templates/PentagonTemplate.js +5 -0
  373. package/src/charting/templates/PolygonTemplate.js +18 -0
  374. package/src/charting/templates/PredefinedProcessTemplate.js +13 -0
  375. package/src/charting/templates/RectangleTemplate.js +28 -0
  376. package/src/charting/templates/RegularPolygonTemplate.js +21 -0
  377. package/src/charting/templates/RoundedRectangleTemplate.js +5 -0
  378. package/src/charting/templates/StadiumTemplate.js +8 -0
  379. package/src/charting/templates/StarTemplate.js +17 -0
  380. package/src/charting/templates/SwimlaneTemplate.js +18 -0
  381. package/src/charting/templates/Template.js +208 -0
  382. package/src/charting/templates/TrapezoidTemplate.js +11 -0
  383. package/src/charting/templates/TriangleTemplate.js +12 -0
  384. package/src/charting/templates/index.js +31 -0
  385. package/src/charting/templates/outline.js +59 -0
  386. package/src/charting/templates/svg.js +19 -0
  387. package/src/charting/textToShapes.js +61 -0
  388. package/src/charting/toolbar/ToolbarButton.js +38 -0
  389. package/src/charting/toolbar/ToolbarCheckbox.js +31 -0
  390. package/src/charting/toolbar/ToolbarItem.js +19 -0
  391. package/src/charting/toolbar/ToolbarMenu.js +36 -0
  392. package/src/charting/toolbar/ToolbarSelect.js +38 -0
  393. package/src/charting/toolbar/ToolbarSeparator.js +7 -0
  394. package/src/charting/toolbar/ToolbarText.js +22 -0
  395. package/src/charting/toolbar/index.js +8 -0
  396. package/src/charting/toolbar/pickFile.js +14 -0
  397. package/src/charting/viewDecorations.js +85 -0
  398. package/src/charting/zOrder.js +57 -0
  399. package/src/csvTable.js +61 -0
  400. package/src/datamodel.js +122 -0
  401. package/src/datawindow/BoundedWindow.js +36 -0
  402. package/src/datawindow/FlatDataWindow.js +34 -0
  403. package/src/datawindow/GraphDataWindow.js +40 -0
  404. package/src/datawindow/GroupedSampleDataWindow.js +16 -0
  405. package/src/datawindow/SeriesDataWindow.js +42 -0
  406. package/src/datawindow/index.js +31 -0
  407. package/src/diagramCatalog.js +30 -0
  408. package/src/ebnfDiagram.js +57 -0
  409. package/src/ebnfParser.js +129 -0
  410. package/src/exportImage.js +233 -0
  411. package/src/index.js +2636 -0
  412. package/src/itIcons.js +84 -0
  413. package/src/kernelExpr.js +243 -0
  414. package/src/propertiesDialog.js +463 -0
  415. package/src/railroadDiagram.js +571 -0
  416. package/src/treeModeCatalog.js +16 -0
  417. package/src/workspace/ContextBus.js +79 -0
  418. package/src/workspace/EditorShell.js +67 -0
  419. package/src/workspace/Part.js +163 -0
  420. package/src/workspace/PartFactory.js +49 -0
  421. package/src/workspace/PartRegistry.js +86 -0
  422. package/src/workspace/Workspace.js +321 -0
  423. package/src/workspace/archimateServices.js +33 -0
  424. package/src/workspace/dom.js +120 -0
  425. package/src/workspace/index.js +75 -0
  426. package/src/workspace/layout/GridNode.js +280 -0
  427. package/src/workspace/layout/LayoutNode.js +89 -0
  428. package/src/workspace/layout/PartNode.js +77 -0
  429. package/src/workspace/layout/SplitNode.js +114 -0
  430. package/src/workspace/layout/TabsNode.js +191 -0
  431. package/src/workspace/layout/index.js +24 -0
  432. package/src/workspace/parts/AdapterPart.js +33 -0
  433. package/src/workspace/parts/ArchimateCanvasPart.js +345 -0
  434. package/src/workspace/parts/ArchimateEditorPart.js +79 -0
  435. package/src/workspace/parts/ChartPart.js +115 -0
  436. package/src/workspace/parts/ContentPart.js +34 -0
  437. package/src/workspace/parts/DetailPart.js +46 -0
  438. package/src/workspace/parts/DiagramEditorPart.js +135 -0
  439. package/src/workspace/parts/EditorPart.js +388 -0
  440. package/src/workspace/parts/HtmlPart.js +25 -0
  441. package/src/workspace/parts/ListPart.js +57 -0
  442. package/src/workspace/parts/ModelFile.js +187 -0
  443. package/src/workspace/parts/ModelsPart.js +135 -0
  444. package/src/workspace/styles.js +258 -0
  445. package/src/workspace/themes.js +96 -0
  446. package/src/workspace/workArea.js +413 -0
  447. package/src/workspace/workAreaModel.js +197 -0
  448. package/src/workspace.js +16 -0
  449. package/src/zip/ZipArchive.js +160 -0
  450. package/src/zip/crc32.js +25 -0
  451. package/src/zip/inflate.js +159 -0
@@ -0,0 +1,24 @@
1
+ import { Glyph } from './Glyph.js';
2
+
3
+ /** Constraint: a parallelogram with an internal divider. */
4
+ export class ConstraintGlyph extends Glyph {
5
+ static key = 'constraint';
6
+ static ownsInterior = true;
7
+
8
+ parts(ctx) {
9
+ const { w, h } = ctx;
10
+ const G = Glyph, st = (k) => this.stroke(ctx, k);
11
+ const skew = w * 0.15;
12
+ const d = `M ${-w / 2 + skew},${-h / 2} L ${w / 2},${-h / 2} L ${w / 2 - skew},${h / 2} L ${-w / 2},${h / 2} Z`;
13
+ const lx0 = -w / 2 + skew * 1.6;
14
+ return G.group([
15
+ G.path(d, ctx.color, st()),
16
+ G.path(`M ${lx0},${-h / 2} L ${lx0 - skew * 0.5},${h / 2}`, 'none', st(0.75)),
17
+ ]);
18
+ }
19
+ outline(ctx) {
20
+ const { w, h } = ctx;
21
+ const skew = w * 0.15;
22
+ return [[-w / 2 + skew, -h / 2], [w / 2, -h / 2], [w / 2 - skew, h / 2], [-w / 2, h / 2]];
23
+ }
24
+ }
@@ -0,0 +1,10 @@
1
+ import { ObjectBoxGlyph } from './ObjectBoxGlyph.js';
2
+
3
+ /** Contract: an object box with two bars. */
4
+ export class ContractBoxGlyph extends ObjectBoxGlyph {
5
+ static key = 'contract-box';
6
+
7
+ bars(h) {
8
+ return [-h * 0.22, -h * 0.02];
9
+ }
10
+ }
@@ -0,0 +1,19 @@
1
+ import { Glyph } from './Glyph.js';
2
+
3
+ /** Node: a 3-face isometric box (front, top, side). */
4
+ export class CubeGlyph extends Glyph {
5
+ static key = 'cube';
6
+ static ownsInterior = true;
7
+
8
+ parts(ctx) {
9
+ const { w, h } = ctx;
10
+ const G = Glyph, st = (k) => this.stroke(ctx, k);
11
+ const depth = Math.min(w, h) * 0.32;
12
+ const fx0 = -w / 2, fx1 = w / 2 - depth, fy0 = -h / 2 + depth, fy1 = h / 2;
13
+ return G.group([
14
+ G.rect(fx0, fy0, fx1 - fx0, fy1 - fy0, ctx.color, st()),
15
+ G.path(`M ${fx0},${fy0} L ${fx0 + depth},${fy0 - depth} L ${fx1 + depth},${fy0 - depth} L ${fx1},${fy0} Z`, ctx.color, st()),
16
+ G.path(`M ${fx1},${fy0} L ${fx1 + depth},${fy0 - depth} L ${fx1 + depth},${fy1 - depth} L ${fx1},${fy1} Z`, ctx.color, st()),
17
+ ]);
18
+ }
19
+ }
@@ -0,0 +1,19 @@
1
+ import { Glyph } from './Glyph.js';
2
+
3
+ /** Role/Stakeholder: a horizontal drum. */
4
+ export class CylinderGlyph extends Glyph {
5
+ static key = 'cylinder';
6
+ static ownsInterior = true;
7
+
8
+ parts(ctx) {
9
+ const { w, h } = ctx;
10
+ const G = Glyph, st = (k) => this.stroke(ctx, k);
11
+ const capRx = Math.min(w * 0.17, h * 0.5);
12
+ const cx = w / 2 - capRx;
13
+ return G.group([
14
+ G.path(`M ${-w / 2},${-h / 2} L ${cx},${-h / 2} A ${capRx} ${h / 2} 0 0 1 ${cx},${h / 2} L ${-w / 2},${h / 2} Z`, ctx.color, st()),
15
+ // The cap's far side, so it reads as a tube rather than a pill.
16
+ G.path(`M ${cx},${-h / 2} A ${capRx} ${h / 2} 0 0 0 ${cx},${h / 2}`, 'none', st()),
17
+ ]);
18
+ }
19
+ }
@@ -0,0 +1,11 @@
1
+ import { Glyph } from './Glyph.js';
2
+ import { DoubleArrowGlyph } from './DoubleArrowGlyph.js';
3
+
4
+ /** Path: a dashed two-headed arrow. */
5
+ export class DashedDoubleArrowGlyph extends DoubleArrowGlyph {
6
+ static key = 'double-arrow-dashed';
7
+
8
+ shaft(w, headW, stroke) {
9
+ return Glyph.path(`M ${-w / 2 + headW * 0.6},0 L ${w / 2 - headW * 0.6},0`, 'none', stroke, { 'stroke-dasharray': '3 3' });
10
+ }
11
+ }
@@ -0,0 +1,17 @@
1
+ import { Glyph } from './Glyph.js';
2
+
3
+ /** Device: a monitor on a small stand. */
4
+ export class DeviceGlyph extends Glyph {
5
+ static key = 'device';
6
+ static ownsInterior = true;
7
+
8
+ parts(ctx) {
9
+ const { w, h } = ctx;
10
+ const G = Glyph, st = (k) => this.stroke(ctx, k);
11
+ const screenH = h * 0.60, standH = h * 0.26, standTop = -h / 2 + screenH;
12
+ return G.group([
13
+ G.rect(-w / 2, -h / 2, w, screenH, ctx.color, st(), { rx: h * 0.10 }),
14
+ G.path(`M ${-w * 0.12},${standTop} L ${w * 0.12},${standTop} L ${w * 0.34},${standTop + standH} L ${-w * 0.34},${standTop + standH} Z`, ctx.color, st()),
15
+ ]);
16
+ }
17
+ }
@@ -0,0 +1,17 @@
1
+ import { Glyph } from './Glyph.js';
2
+
3
+ /** A diamond fitted to the smaller side. */
4
+ export class DiamondGlyph extends Glyph {
5
+ static key = 'diamond';
6
+
7
+ parts(ctx) {
8
+ const G = Glyph, st = (k) => this.stroke(ctx, k);
9
+ const r = ctx.circleR;
10
+ const diamondPoints = `0,${-r} ${r},0 0,${r} ${-r},0`;
11
+ return G.path(`M${diamondPoints}Z`, ctx.color, st());
12
+ }
13
+ outline(ctx) {
14
+ const r = ctx.circleR;
15
+ return [[0, -r], [r, 0], [0, r], [-r, 0]];
16
+ }
17
+ }
@@ -0,0 +1,17 @@
1
+ import { Glyph } from './Glyph.js';
2
+
3
+ /** Artifact: a page with a folded top-right corner. */
4
+ export class DocumentGlyph extends Glyph {
5
+ static key = 'document';
6
+ static ownsInterior = true;
7
+
8
+ parts(ctx) {
9
+ const { w, h } = ctx;
10
+ const G = Glyph, st = (k) => this.stroke(ctx, k);
11
+ const fold = Math.min(w, h) * 0.20;
12
+ return G.group([
13
+ G.path(`M ${-w / 2},${-h / 2} L ${w / 2 - fold},${-h / 2} L ${w / 2},${-h / 2 + fold} L ${w / 2},${h / 2} L ${-w / 2},${h / 2} Z`, ctx.color, st()),
14
+ G.path(`M ${w / 2 - fold},${-h / 2} L ${w / 2 - fold},${-h / 2 + fold} L ${w / 2},${-h / 2 + fold}`, 'none', st(0.75)),
15
+ ]);
16
+ }
17
+ }
@@ -0,0 +1,23 @@
1
+ import { Glyph } from './Glyph.js';
2
+
3
+ /** Communication/Distribution network: a two-headed arrow. */
4
+ export class DoubleArrowGlyph extends Glyph {
5
+ static key = 'double-arrow';
6
+ static ownsInterior = true;
7
+
8
+ parts(ctx) {
9
+ const { w, h } = ctx;
10
+ const G = Glyph, st = (k) => this.stroke(ctx, k);
11
+ const headW = w * 0.17, headH = h * 0.42;
12
+ return G.group([this.shaft(w, headW, st(1.25)), G.path(DoubleArrowGlyph.heads(w, headW, headH), 'none', st(1.25))]);
13
+ }
14
+
15
+ shaft(w, headW, stroke) {
16
+ return Glyph.path(`M ${-w / 2},0 L ${w / 2},0`, 'none', stroke);
17
+ }
18
+
19
+ static heads(w, headW, headH) {
20
+ return `M ${-w / 2 + headW},${-headH / 2} L ${-w / 2},0 L ${-w / 2 + headW},${headH / 2}`
21
+ + ` M ${w / 2 - headW},${-headH / 2} L ${w / 2},0 L ${w / 2 - headW},${headH / 2}`;
22
+ }
23
+ }
@@ -0,0 +1,24 @@
1
+ import { Glyph } from './Glyph.js';
2
+
3
+ /** Collaboration: two overlapping circles. */
4
+ export class DoubleCircleGlyph extends Glyph {
5
+ static key = 'double-circle';
6
+ static ownsInterior = true;
7
+
8
+ parts(ctx) {
9
+ const { w, h } = ctx;
10
+ const G = Glyph, st = (k) => this.stroke(ctx, k);
11
+ const cr = Math.min(w, h) * 0.44, off = cr * 0.55;
12
+ return G.group([
13
+ G.circle(-off, 0, cr, ctx.color, st()),
14
+ G.circle(off, 0, cr, ctx.color, st()),
15
+ // Re-stroke the back circle so the intersection lens reads.
16
+ G.circle(-off, 0, cr, 'none', st()),
17
+ ]);
18
+ }
19
+ /** Around both circles. */
20
+ outline(ctx) {
21
+ const cr = Math.min(ctx.w, ctx.h) * 0.44, off = cr * 0.55;
22
+ return [[-off - cr, -cr], [off + cr, -cr], [off + cr, cr], [-off - cr, cr]];
23
+ }
24
+ }
@@ -0,0 +1,18 @@
1
+ import { sampleArc } from '../templates/outline.js';
2
+ import { Glyph } from './Glyph.js';
3
+
4
+ /** Value: an oval. */
5
+ export class EllipseGlyph extends Glyph {
6
+ static key = 'ellipse';
7
+ static ownsInterior = true;
8
+
9
+ parts(ctx) {
10
+ const { w, h } = ctx;
11
+ const G = Glyph, st = (k) => this.stroke(ctx, k);
12
+ const d = `M ${-w / 2},0 A ${w / 2} ${h / 2} 0 1 0 ${w / 2},0 A ${w / 2} ${h / 2} 0 1 0 ${-w / 2},0 Z`;
13
+ return G.path(d, ctx.color, st());
14
+ }
15
+ outline(ctx) {
16
+ return sampleArc(0, 0, ctx.w / 2, ctx.h / 2, 0, Math.PI * 2, 48).slice(0, -1);
17
+ }
18
+ }
@@ -0,0 +1,20 @@
1
+ import { Glyph } from './Glyph.js';
2
+
3
+ /** Facility: a building with a zigzag roofline. */
4
+ export class FactoryGlyph extends Glyph {
5
+ static key = 'factory';
6
+ static ownsInterior = true;
7
+
8
+ parts(ctx) {
9
+ const { w, h } = ctx;
10
+ const G = Glyph, st = (k) => this.stroke(ctx, k);
11
+ const eaves = -h * 0.02, peaks = 3, tw = w / peaks;
12
+ let d = `M ${-w / 2},${h / 2} L ${-w / 2},${eaves}`;
13
+ for (let i = 0; i < peaks; i++) {
14
+ const xEnd = -w / 2 + tw * (i + 1);
15
+ d += ` L ${xEnd},${-h / 2} L ${xEnd},${eaves}`;
16
+ }
17
+ d += ` L ${w / 2},${h / 2} Z`;
18
+ return G.path(d, ctx.color, st());
19
+ }
20
+ }
@@ -0,0 +1,16 @@
1
+ import { Glyph } from './Glyph.js';
2
+
3
+ /** Event: a notched-left, rounded-right pennant. */
4
+ export class FlagGlyph extends Glyph {
5
+ static key = 'flag';
6
+ static ownsInterior = true;
7
+
8
+ parts(ctx) {
9
+ const { w, h } = ctx;
10
+ const G = Glyph, st = (k) => this.stroke(ctx, k);
11
+ const capX = Math.max(-w / 2, w / 2 - h / 2); // cap is a true semicircle
12
+ const notchX = -w / 2 + w * 0.18;
13
+ const d = `M ${-w / 2},${-h / 2} L ${capX},${-h / 2} A ${h / 2} ${h / 2} 0 0 1 ${capX},${h / 2} L ${-w / 2},${h / 2} L ${notchX},0 Z`;
14
+ return G.path(d, ctx.color, st());
15
+ }
16
+ }
@@ -0,0 +1,17 @@
1
+ import { Glyph } from './Glyph.js';
2
+
3
+ /** Gap: a circle crossed by two horizontal lines. */
4
+ export class GapCircleGlyph extends Glyph {
5
+ static key = 'gap-circle';
6
+ static ownsInterior = true;
7
+
8
+ parts(ctx) {
9
+ const { w, h } = ctx;
10
+ const G = Glyph, st = (k) => this.stroke(ctx, k);
11
+ const gr = Math.min(w, h) * 0.3;
12
+ return G.group([
13
+ G.path(`M ${-w / 2},${-h * 0.12} L ${w / 2},${-h * 0.12} M ${-w / 2},${h * 0.12} L ${w / 2},${h * 0.12}`, 'none', st()),
14
+ G.circle(0, 0, gr, ctx.color, st()),
15
+ ]);
16
+ }
17
+ }
@@ -0,0 +1,37 @@
1
+ import { Glyph } from './Glyph.js';
2
+
3
+ /** Equipment: two overlapping cogs. */
4
+ export class GearGlyph extends Glyph {
5
+ static key = 'gear';
6
+ static ownsInterior = true;
7
+
8
+ parts(ctx) {
9
+ const { w, h } = ctx;
10
+ const G = Glyph, st = (k) => this.stroke(ctx, k);
11
+ const makeTeeth = (cx, cy, gr, toothCount) => {
12
+ const toothLen = gr * 0.38, toothW = gr * 0.44;
13
+ let teeth = '';
14
+ for (let i = 0; i < toothCount; i++) {
15
+ const angle = (i / toothCount) * Math.PI * 2;
16
+ const dx = Math.cos(angle), dy = Math.sin(angle), px = -dy, py = dx;
17
+ const tcx = cx + dx * (gr + toothLen / 2), tcy = cy + dy * (gr + toothLen / 2);
18
+ const x1 = tcx - dx * toothLen / 2 - px * toothW / 2, y1 = tcy - dy * toothLen / 2 - py * toothW / 2;
19
+ const x2 = tcx - dx * toothLen / 2 + px * toothW / 2, y2 = tcy - dy * toothLen / 2 + py * toothW / 2;
20
+ const x3 = tcx + dx * toothLen / 2 + px * toothW / 2, y3 = tcy + dy * toothLen / 2 + py * toothW / 2;
21
+ const x4 = tcx + dx * toothLen / 2 - px * toothW / 2, y4 = tcy + dy * toothLen / 2 - py * toothW / 2;
22
+ teeth += `M${x1},${y1} L${x2},${y2} L${x3},${y3} L${x4},${y4} Z `;
23
+ }
24
+ return teeth;
25
+ };
26
+ const bigR = Math.min(w, h) * 0.28, smallR = bigR * 0.60;
27
+ const bigCx = -w * 0.17, bigCy = h * 0.16, smallCx = w * 0.23, smallCy = -h * 0.21;
28
+ return G.group([
29
+ G.path(makeTeeth(bigCx, bigCy, bigR, 8), ctx.color, st(0.5)),
30
+ G.circle(bigCx, bigCy, bigR, ctx.color, st()),
31
+ G.path(makeTeeth(smallCx, smallCy, smallR, 6), ctx.color, st(0.5)),
32
+ G.circle(smallCx, smallCy, smallR, ctx.color, st()),
33
+ G.circle(bigCx, bigCy, bigR * 0.35, '#fff', null),
34
+ G.circle(smallCx, smallCy, smallR * 0.35, '#fff', null),
35
+ ]);
36
+ }
37
+ }
@@ -0,0 +1,98 @@
1
+ /**
2
+ * Glyph — one notation shape (ArchiMate's pill, cube, chevron, ... and the
3
+ * plain graph shapes), described once as renderer-neutral parts so the graph
4
+ * engine and the editor's templates draw exactly the same thing.
5
+ *
6
+ * `parts(ctx)` returns a descriptor tree centred on (0, 0):
7
+ * { type: 'rect', x, y, w, h, fill, stroke, extra?, attrs? }
8
+ * { type: 'circle', cx, cy, r, fill, stroke, attrs? }
9
+ * { type: 'path', d, fill, stroke, attrs? }
10
+ * { type: 'image', href, x, y, w, h, options? }
11
+ * { type: 'text', text, x, y, options? }
12
+ * { type: 'group', children: [...], attrs? }
13
+ * `stroke` is `{color, width}` or null; `extra`/`options` are the renderer's own
14
+ * extra arguments (e.g. `{rx}`); `attrs` are SVG attributes set afterwards
15
+ * (e.g. `stroke-dasharray`). drawGlyph() replays a tree through a renderer.
16
+ *
17
+ * Context: `w`, `h` (box size), `R` (half the larger side), `circleR` (half the
18
+ * smaller side), `color` (fill), `strokeColor`, `strokeWidth`, `cornerStyle`,
19
+ * `icon`, `iconUrl`.
20
+ */
21
+ export class Glyph {
22
+ /** Shape name a node or element type asks for ('pill', 'cube', ...). */
23
+ static key = null;
24
+ /** True when the shape is busy enough that no centred icon or initials go on top of it. */
25
+ static ownsInterior = false;
26
+
27
+ /** @returns {Object} descriptor tree, centred on (0, 0) */
28
+ parts(ctx) {
29
+ throw new Error(`${this.constructor.name} must implement parts()`);
30
+ }
31
+
32
+ /**
33
+ * The visible outline as a closed polygon centred on (0, 0), for attaching
34
+ * lines exactly (curves sampled). The box by default; a shape whose edge
35
+ * is clearly not its box overrides it.
36
+ * @returns {Array<[number, number]>}
37
+ */
38
+ outline(ctx) {
39
+ const { w, h } = ctx;
40
+ return [[-w / 2, -h / 2], [w / 2, -h / 2], [w / 2, h / 2], [-w / 2, h / 2]];
41
+ }
42
+
43
+ /** The outline stroke, its width scaled by `scale` (omitted = as given). */
44
+ stroke(ctx, scale) {
45
+ return { color: ctx.strokeColor, width: scale === undefined ? ctx.strokeWidth : ctx.strokeWidth * scale };
46
+ }
47
+
48
+ /**
49
+ * Drawing context for a node: `size` ({w, h}) when it has its own box,
50
+ * otherwise a square of side 2R.
51
+ */
52
+ static context({ R, size, color, cornerStyle, strokeColor = '#fff', strokeWidth = 2, iconUrl = null, icon = null, ownFill = null }) {
53
+ return {
54
+ R,
55
+ w: size?.w ?? R * 2,
56
+ h: size?.h ?? R * 2,
57
+ circleR: size ? Math.min(size.w, size.h) / 2 : R,
58
+ // ownFill: a fill set on the item itself (null: it takes its kind's), for a glyph with a look of its own (a note).
59
+ color, cornerStyle, strokeColor, strokeWidth, iconUrl, icon, ownFill,
60
+ };
61
+ }
62
+
63
+ static rect(x, y, w, h, fill, stroke, extra, attrs) {
64
+ return { type: 'rect', x, y, w, h, fill, stroke, extra, attrs };
65
+ }
66
+
67
+ static circle(cx, cy, r, fill, stroke, attrs) {
68
+ return { type: 'circle', cx, cy, r, fill, stroke, attrs };
69
+ }
70
+
71
+ static path(d, fill, stroke, attrs) {
72
+ return { type: 'path', d, fill, stroke, attrs };
73
+ }
74
+
75
+ static image(href, x, y, w, h, options) {
76
+ return { type: 'image', href, x, y, w, h, options };
77
+ }
78
+
79
+ static text(text, x, y, options) {
80
+ return { type: 'text', text, x, y, options };
81
+ }
82
+
83
+ static group(children, attrs) {
84
+ return { type: 'group', children, attrs };
85
+ }
86
+
87
+ /** Box corner radius: 'sharp' 0, 'rounded' (ArchiMate behavior) quite round, otherwise a small 3. */
88
+ static cornerRadius(cornerStyle, w, h) {
89
+ return cornerStyle === 'sharp' ? 0 : cornerStyle === 'rounded' ? Math.min(w, h) * 0.28 : 3;
90
+ }
91
+
92
+ /** SVG path for a w x h box centred on the origin with all four corners cut at 45° (ArchiMate Motivation). */
93
+ static chamferedRectPath(w, h, chamfer) {
94
+ const hw = w / 2, hh = h / 2;
95
+ const c = Math.min(chamfer ?? Math.min(w, h) * 0.18, hw, hh);
96
+ return `M${-hw + c},${-hh} L${hw - c},${-hh} L${hw},${-hh + c} L${hw},${hh - c} L${hw - c},${hh} L${-hw + c},${hh} L${-hw},${hh - c} L${-hw},${-hh + c} Z`;
97
+ }
98
+ }
@@ -0,0 +1,13 @@
1
+ import { Glyph } from './Glyph.js';
2
+
3
+ /** Grouping: a box with a dashed outline. */
4
+ export class GroupingBoxGlyph extends Glyph {
5
+ static key = 'grouping-box';
6
+ static ownsInterior = true;
7
+
8
+ parts(ctx) {
9
+ const { w, h } = ctx;
10
+ const G = Glyph, st = (k) => this.stroke(ctx, k);
11
+ return G.rect(-w / 2, -h / 2, w, h, ctx.color, st(), undefined, { 'stroke-dasharray': '6 4' });
12
+ }
13
+ }
@@ -0,0 +1,22 @@
1
+ import { Glyph } from './Glyph.js';
2
+
3
+ /** Interaction: two facing half-discs. */
4
+ export class HalfCircleGlyph extends Glyph {
5
+ static key = 'half-circle';
6
+ static ownsInterior = true;
7
+
8
+ parts(ctx) {
9
+ const { w, h } = ctx;
10
+ const G = Glyph, st = (k) => this.stroke(ctx, k);
11
+ const hr = Math.min(w, h) / 2 * 0.92, gap = hr * 0.20;
12
+ return G.group([
13
+ G.path(`M ${-gap},${-hr} A ${hr} ${hr} 0 0 0 ${-gap},${hr} Z`, ctx.color, st()),
14
+ G.path(`M ${gap},${-hr} A ${hr} ${hr} 0 0 1 ${gap},${hr} Z`, ctx.color, st()),
15
+ ]);
16
+ }
17
+ /** Around both half-discs. */
18
+ outline(ctx) {
19
+ const hr = Math.min(ctx.w, ctx.h) / 2 * 0.92, gap = hr * 0.20;
20
+ return [[-gap - hr, -hr], [gap + hr, -hr], [gap + hr, hr], [-gap - hr, hr]];
21
+ }
22
+ }
@@ -0,0 +1,28 @@
1
+ import { Glyph } from './Glyph.js';
2
+
3
+ /** Material: a hexagon, flat top and bottom, with the spec's two slashes and underscore. */
4
+ export class HexagonGlyph extends Glyph {
5
+ static key = 'hexagon';
6
+ static ownsInterior = true;
7
+
8
+ parts(ctx) {
9
+ const { w, h } = ctx;
10
+ const G = Glyph, st = (k) => this.stroke(ctx, k);
11
+ const pts = [0, 1, 2, 3, 4, 5].map(i => {
12
+ const a = (Math.PI / 3) * i;
13
+ return [Math.cos(a) * w / 2, Math.sin(a) * h / 2];
14
+ });
15
+ return G.group([
16
+ G.path(`M${pts.map(p => p.join(',')).join(' L')}Z`, ctx.color, st()),
17
+ G.path(
18
+ `M ${-w * 0.16},${-h * 0.18} L ${-w * 0.06},${h * 0.10}`
19
+ + ` M ${w * 0.04},${-h * 0.18} L ${w * 0.14},${h * 0.10}`
20
+ + ` M ${-w * 0.18},${h * 0.26} L ${w * 0.06},${h * 0.26}`,
21
+ 'none', st(0.75)),
22
+ ]);
23
+ }
24
+ outline(ctx) {
25
+ const { w, h } = ctx;
26
+ return [0, 1, 2, 3, 4, 5].map(i => [Math.cos((Math.PI / 3) * i) * w / 2, Math.sin((Math.PI / 3) * i) * h / 2]);
27
+ }
28
+ }
@@ -0,0 +1,22 @@
1
+ import { Glyph } from './Glyph.js';
2
+
3
+ /** A box with the node's own icon (`iconUrl` or `icon` text) large in the middle. */
4
+ export class IconGlyph extends Glyph {
5
+ static key = 'icon';
6
+ static ownsInterior = true;
7
+
8
+ parts(ctx) {
9
+ const { w, h } = ctx;
10
+ const G = Glyph, st = (k) => this.stroke(ctx, k);
11
+ const rx = Glyph.cornerRadius(ctx.cornerStyle, w, h);
12
+ const parts = [G.rect(-w / 2, -h / 2, w, h, ctx.color, st(), { rx })];
13
+ if (ctx.iconUrl) {
14
+ const imgSize = Math.min(w, h) * 0.7;
15
+ parts.push(G.image(ctx.iconUrl, -imgSize / 2, -imgSize / 2, imgSize, imgSize, { 'pointer-events': 'none' }));
16
+ } else if (ctx.icon) {
17
+ const iconSize = Math.min(w, h) * 0.6;
18
+ parts.push(G.text(ctx.icon, 0, 0, { fill: '#fff', textAnchor: 'middle', verticalAlign: 'middle', fontSize: `${iconSize}px`, 'pointer-events': 'none' }));
19
+ }
20
+ return G.group(parts);
21
+ }
22
+ }
@@ -0,0 +1,16 @@
1
+ import { Glyph } from './Glyph.js';
2
+
3
+ /** A picture filling the box (`iconUrl`), with a light border showing its bounds. */
4
+ export class ImageGlyph extends Glyph {
5
+ static key = 'image';
6
+ static ownsInterior = true;
7
+
8
+ parts(ctx) {
9
+ const { w, h } = ctx;
10
+ const G = Glyph, st = (k) => this.stroke(ctx, k);
11
+ return G.group([
12
+ G.rect(-w / 2, -h / 2, w, h, 'none', { color: '#ccc', width: 1 }),
13
+ G.image(ctx.iconUrl || '', -w / 2, -h / 2, w, h, { preserveAspectRatio: 'none', 'pointer-events': 'none' }),
14
+ ]);
15
+ }
16
+ }
@@ -0,0 +1,17 @@
1
+ import { sampleArc } from '../templates/outline.js';
2
+ import { Glyph } from './Glyph.js';
3
+
4
+ /** (And) Junction: a small solid dot. */
5
+ export class JunctionGlyph extends Glyph {
6
+ static key = 'junction';
7
+ static ownsInterior = true;
8
+
9
+ parts(ctx) {
10
+ const G = Glyph, st = (k) => this.stroke(ctx, k);
11
+ return G.circle(0, 0, ctx.circleR * 0.4, ctx.strokeColor, st(0.75));
12
+ }
13
+ outline(ctx) {
14
+ const r = ctx.circleR * 0.4;
15
+ return sampleArc(0, 0, r, r, 0, Math.PI * 2, 24).slice(0, -1);
16
+ }
17
+ }
@@ -0,0 +1,22 @@
1
+ import { Glyph } from './Glyph.js';
2
+
3
+ /** Interface: a stub line into a small circle. */
4
+ export class LollipopGlyph extends Glyph {
5
+ static key = 'lollipop';
6
+ static ownsInterior = true;
7
+
8
+ parts(ctx) {
9
+ const { w, h } = ctx;
10
+ const G = Glyph, st = (k) => this.stroke(ctx, k);
11
+ const cr = Math.min(w, h) * 0.28;
12
+ return G.group([
13
+ G.path(`M ${-w / 2},0 L ${w / 2 - cr * 2},0`, 'none', st(1.25)),
14
+ G.circle(w / 2 - cr, 0, cr, ctx.color, st()),
15
+ ]);
16
+ }
17
+ /** The stub and circle: full width, the circle's height. */
18
+ outline(ctx) {
19
+ const cr = Math.min(ctx.w, ctx.h) * 0.28;
20
+ return [[-ctx.w / 2, -cr], [ctx.w / 2, -cr], [ctx.w / 2, cr], [-ctx.w / 2, cr]];
21
+ }
22
+ }
@@ -0,0 +1,17 @@
1
+ import { Glyph } from './Glyph.js';
2
+
3
+ /** Assessment: a magnifying glass. */
4
+ export class MagnifierGlyph extends Glyph {
5
+ static key = 'magnifier';
6
+ static ownsInterior = true;
7
+
8
+ parts(ctx) {
9
+ const { w, h } = ctx;
10
+ const G = Glyph, st = (k) => this.stroke(ctx, k);
11
+ const gr = Math.min(w, h) * 0.30, cx = w * 0.10, cy = -h * 0.12;
12
+ return G.group([
13
+ G.circle(cx, cy, gr, ctx.color, st()),
14
+ G.path(`M ${cx - gr * 0.72},${cy + gr * 0.72} L ${-w * 0.40},${h * 0.44}`, 'none', st(1.25)),
15
+ ]);
16
+ }
17
+ }
@@ -0,0 +1,33 @@
1
+ import { Glyph } from './Glyph.js';
2
+
3
+ /**
4
+ * A sticky note: a body with a folded bottom-right corner (a view annotation,
5
+ * not an element), yellow unless the note has a fill of its own (ctx.ownFill);
6
+ * the fold a shade darker.
7
+ */
8
+ export class NoteGlyph extends Glyph {
9
+ static DEFAULT_FILL = '#fff9c4';
10
+ static DEFAULT_FOLD = '#e8df9e';
11
+
12
+ static key = 'note';
13
+ static ownsInterior = true;
14
+
15
+ parts(ctx) {
16
+ const { w, h } = ctx;
17
+ const G = Glyph, st = (k) => this.stroke(ctx, k);
18
+ const fold = Math.min(w, h) * 0.22;
19
+ const noteFill = ctx.ownFill || NoteGlyph.DEFAULT_FILL;
20
+ const noteStroke = { color: '#b8ad76', width: 1.2 };
21
+ const outline = `M ${-w / 2},${-h / 2} L ${w / 2},${-h / 2} L ${w / 2},${h / 2 - fold} L ${w / 2 - fold},${h / 2} L ${-w / 2},${h / 2} Z`;
22
+ const flap = `M ${w / 2 - fold},${h / 2} L ${w / 2},${h / 2 - fold} L ${w / 2},${h / 2} Z`;
23
+ return G.group([G.path(outline, noteFill, noteStroke), G.path(flap, ctx.ownFill ? NoteGlyph.shade(noteFill) : NoteGlyph.DEFAULT_FOLD, noteStroke)]);
24
+ }
25
+
26
+ /** A colour a shade darker (the fold); one it cannot read (none, a name) as it is. */
27
+ static shade(colour, factor = 0.88) {
28
+ const m = String(colour).match(/^#([0-9a-f]{3}|[0-9a-f]{6})$/i);
29
+ if (!m) return colour;
30
+ const hex = m[1].length === 3 ? [...m[1]].map(c => c + c).join('') : m[1];
31
+ return '#' + [0, 2, 4].map(i => Math.round(parseInt(hex.slice(i, i + 2), 16) * factor).toString(16).padStart(2, '0')).join('');
32
+ }
33
+ }
@@ -0,0 +1,21 @@
1
+ import { Glyph } from './Glyph.js';
2
+
3
+ /** Business/Data Object: a box with one bar under its top. */
4
+ export class ObjectBoxGlyph extends Glyph {
5
+ static key = 'object-box';
6
+ static ownsInterior = true;
7
+
8
+ parts(ctx) {
9
+ const { w, h } = ctx;
10
+ const G = Glyph, st = (k) => this.stroke(ctx, k);
11
+ return G.group([
12
+ G.rect(-w / 2, -h / 2, w, h, ctx.color, st()),
13
+ G.path(this.bars(h).map(y => `M ${-w / 2},${y} L ${w / 2},${y}`).join(' '), 'none', st()),
14
+ ]);
15
+ }
16
+
17
+ /** Heights of the bars across the box. */
18
+ bars(h) {
19
+ return [-h * 0.22];
20
+ }
21
+ }
@@ -0,0 +1,17 @@
1
+ import { sampleArc } from '../templates/outline.js';
2
+ import { Glyph } from './Glyph.js';
3
+
4
+ /** (Or) Junction: the same dot, hollow. */
5
+ export class OrJunctionGlyph extends Glyph {
6
+ static key = 'junction-or';
7
+ static ownsInterior = true;
8
+
9
+ parts(ctx) {
10
+ const G = Glyph, st = (k) => this.stroke(ctx, k);
11
+ return G.circle(0, 0, ctx.circleR * 0.4, '#ffffff', st());
12
+ }
13
+ outline(ctx) {
14
+ const r = ctx.circleR * 0.4;
15
+ return sampleArc(0, 0, r, r, 0, Math.PI * 2, 24).slice(0, -1);
16
+ }
17
+ }