@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,32 @@
1
+ import { Template } from './Template.js';
2
+ import { svgEl } from './svg.js';
3
+ import { sampleQuad } from './outline.js';
4
+
5
+ /** DocumentTemplate — page with a wavy bottom edge (two quadratic bezier halves). */
6
+ export class DocumentTemplate extends Template {
7
+ static defaults = { width: 120, height: 70 };
8
+
9
+ get labelAnchor() { return { x: this.x, y: this.y - 12 }; }
10
+
11
+ /** [start, control, end] of each wave half, right to left. */
12
+ _wave() {
13
+ const { x, left: L, right: R, bottom: B } = this;
14
+ const a = Math.min(this.height * 0.12, 10);
15
+ const c1 = [(x + R) / 2, B - 3 * a];
16
+ const mid = [x, B - a];
17
+ // `T` reflects the previous control point through the joint.
18
+ const c2 = [2 * mid[0] - c1[0], 2 * mid[1] - c1[1]];
19
+ return [[[R, B - a], c1, mid], [mid, c2, [L, B - a]]];
20
+ }
21
+
22
+ outline() {
23
+ const [first, second] = this._wave();
24
+ return [[this.left, this.top], [this.right, this.top], first[0], ...sampleQuad(...first), ...sampleQuad(...second)];
25
+ }
26
+
27
+ shapeElements(doc) {
28
+ const [[start, c1, mid], [, , end]] = this._wave();
29
+ const d = `M ${this.left} ${this.top} H ${this.right} V ${start[1]} Q ${c1.join(' ')} ${mid.join(' ')} T ${end.join(' ')} Z`;
30
+ return [svgEl('path', this.paint({ d }), doc)];
31
+ }
32
+ }
@@ -0,0 +1,15 @@
1
+ import { Template } from './Template.js';
2
+ import { svgEl } from './svg.js';
3
+ import { sampleArc } from './outline.js';
4
+
5
+ export class EllipseTemplate extends Template {
6
+ static defaults = { width: 120, height: 70 };
7
+
8
+ outline() {
9
+ return sampleArc(this.x, this.y, this.width / 2, this.height / 2, 0, 2 * Math.PI, 72);
10
+ }
11
+
12
+ shapeElements(doc) {
13
+ return [svgEl('ellipse', this.paint({ cx: this.x, cy: this.y, rx: this.width / 2, ry: this.height / 2 }), doc)];
14
+ }
15
+ }
@@ -0,0 +1,12 @@
1
+ import { CircleTemplate } from './CircleTemplate.js';
2
+ import { svgEl } from './svg.js';
3
+
4
+ /** FinalStateTemplate — UML final node: ring around a filled disc. */
5
+ export class FinalStateTemplate extends CircleTemplate {
6
+ static defaults = { width: 30, height: 30, fillColor: '#ffffff' };
7
+
8
+ shapeElements(doc) {
9
+ const inner = svgEl('circle', { cx: this.x, cy: this.y, r: this.radius * 0.6, fill: this.strokeColor }, doc);
10
+ return [...super.shapeElements(doc), inner];
11
+ }
12
+ }
@@ -0,0 +1,47 @@
1
+ import { Template } from './Template.js';
2
+ import { svgEl } from './svg.js';
3
+ import { Glyph } from '../glyphs/Glyph.js';
4
+ import { glyphToSvg } from '../glyphs/glyphSvg.js';
5
+
6
+ /**
7
+ * GlyphTemplate — a template drawn by a Glyph (src/charting/glyphs), so the
8
+ * editor's shape is the same drawing the graph engine makes for that notation.
9
+ * Lines attach to the glyph's own outline.
10
+ *
11
+ * A subclass names its glyph and drawing context; it may add decorations
12
+ * (badges, marks) drawn over the glyph, centred on the shape.
13
+ */
14
+ export class GlyphTemplate extends Template {
15
+ /** The glyph that draws this shape. @abstract */
16
+ glyph() {
17
+ throw new Error(`${this.constructor.name} must implement glyph()`);
18
+ }
19
+
20
+ /** The glyph's drawing context: this shape's size and paint. */
21
+ glyphContext() {
22
+ return Glyph.context({
23
+ R: Math.max(this.width, this.height) / 2,
24
+ size: { w: this.width, h: this.height },
25
+ color: this.fillColor,
26
+ strokeColor: this.strokeColor,
27
+ strokeWidth: this.strokeWidth,
28
+ });
29
+ }
30
+
31
+ outline() {
32
+ return this.glyph().outline(this.glyphContext()).map(([px, py]) => [this.x + px, this.y + py]);
33
+ }
34
+
35
+ shapeElements(doc) {
36
+ const ctx = this.glyphContext();
37
+ const g = svgEl('g', { transform: `translate(${this.x},${this.y})` }, doc);
38
+ g.appendChild(glyphToSvg(this.glyph().parts(ctx), doc));
39
+ for (const part of this.decorations(ctx)) g.appendChild(glyphToSvg(part, doc));
40
+ return [g];
41
+ }
42
+
43
+ /** Extra glyph parts drawn over the shape, centred on (0, 0). */
44
+ decorations(ctx) {
45
+ return [];
46
+ }
47
+ }
@@ -0,0 +1,17 @@
1
+ import { PolygonTemplate } from './PolygonTemplate.js';
2
+
3
+ /**
4
+ * HexagonTemplate — flat top/bottom with pointed sides (flowchart "preparation").
5
+ * The point inset tracks the height so wide hexagons keep a sensible angle.
6
+ */
7
+ export class HexagonTemplate extends PolygonTemplate {
8
+ static defaults = { width: 120, height: 60 };
9
+
10
+ points() {
11
+ const i = Math.min(this.width / 4, this.height / 2);
12
+ return [
13
+ [this.left + i, this.top], [this.right - i, this.top], [this.right, this.y],
14
+ [this.right - i, this.bottom], [this.left + i, this.bottom], [this.left, this.y],
15
+ ];
16
+ }
17
+ }
@@ -0,0 +1,20 @@
1
+ import { Template } from './Template.js';
2
+ import { svgEl } from './svg.js';
3
+
4
+ /** LifelineTemplate — sequence-diagram participant: head box above a dashed line. */
5
+ export class LifelineTemplate extends Template {
6
+ static defaults = { width: 120, height: 280 };
7
+
8
+ get headHeight() { return Math.min(40, this.height / 3); }
9
+
10
+ get labelAnchor() { return { x: this.x, y: this.top + this.headHeight / 2 - 8 }; }
11
+
12
+ shapeElements(doc) {
13
+ const h = this.headHeight;
14
+ return [
15
+ svgEl('rect', { x: this.left, y: this.top, width: this.width, height: this.height, fill: 'transparent' }, doc),
16
+ svgEl('line', this.line({ x1: this.x, y1: this.top + h, x2: this.x, y2: this.bottom, 'stroke-dasharray': '6 4' }), doc),
17
+ svgEl('rect', this.paint({ x: this.left, y: this.top, width: this.width, height: h }), doc),
18
+ ];
19
+ }
20
+ }
@@ -0,0 +1,12 @@
1
+ import { PolygonTemplate } from './PolygonTemplate.js';
2
+
3
+ /** ManualInputTemplate — rectangle with a top edge sloping up to the right. */
4
+ export class ManualInputTemplate extends PolygonTemplate {
5
+ static defaults = { width: 130, height: 60 };
6
+
7
+ get labelAnchor() { return { x: this.x, y: this.y + this.height * 0.1 - 8 }; }
8
+
9
+ points() {
10
+ return [[this.left, this.top + this.height * 0.3], [this.right, this.top], [this.right, this.bottom], [this.left, this.bottom]];
11
+ }
12
+ }
@@ -0,0 +1,23 @@
1
+ import { Template } from './Template.js';
2
+ import { svgEl } from './svg.js';
3
+
4
+ /** NoteTemplate — sheet with a folded top-right corner (comment / UML note / artifact). */
5
+ export class NoteTemplate extends Template {
6
+ static defaults = { width: 120, height: 70, fillColor: '#fef9c3' };
7
+
8
+ get fold() { return Math.min(14, this.width / 4, this.height / 4); }
9
+
10
+ outline() {
11
+ const { left: L, right: R, top: T, bottom: B, fold: f } = this;
12
+ return [[L, T], [R - f, T], [R, T + f], [R, B], [L, B]];
13
+ }
14
+
15
+ shapeElements(doc) {
16
+ const { right: R, top: T, fold: f } = this;
17
+ const [first, ...rest] = this.outline();
18
+ return [
19
+ svgEl('path', this.paint({ d: `M ${first.join(' ')} ${rest.map(p => `L ${p.join(' ')}`).join(' ')} Z` }), doc),
20
+ svgEl('path', this.line({ d: `M ${R - f} ${T} V ${T + f} H ${R}` }), doc),
21
+ ];
22
+ }
23
+ }
@@ -0,0 +1,7 @@
1
+ import { RegularPolygonTemplate } from './RegularPolygonTemplate.js';
2
+
3
+ /** OctagonTemplate — flat top and bottom edges. */
4
+ export class OctagonTemplate extends RegularPolygonTemplate {
5
+ static sides = 8;
6
+ static startAngle = -Math.PI / 8;
7
+ }
@@ -0,0 +1,25 @@
1
+ import { Template } from './Template.js';
2
+ import { svgEl } from './svg.js';
3
+
4
+ /** PackageTemplate — UML package / folder: body with a name tab on the top-left. */
5
+ export class PackageTemplate extends Template {
6
+ static defaults = { width: 160, height: 110 };
7
+
8
+ get tabHeight() { return Math.min(16, this.height / 5); }
9
+
10
+ get labelAnchor() { return { x: this.x, y: this.y + this.tabHeight / 2 - 8 }; }
11
+
12
+ outline() {
13
+ const { left: L, right: R, top: T, bottom: B, tabHeight: t } = this;
14
+ const tabRight = L + this.width * 0.4;
15
+ return [[L, T], [tabRight, T], [tabRight, T + t], [R, T + t], [R, B], [L, B]];
16
+ }
17
+
18
+ shapeElements(doc) {
19
+ const t = this.tabHeight;
20
+ return [
21
+ svgEl('rect', this.paint({ x: this.left, y: this.top, width: this.width * 0.4, height: t }), doc),
22
+ svgEl('rect', this.paint({ x: this.left, y: this.top + t, width: this.width, height: this.height - t }), doc),
23
+ ];
24
+ }
25
+ }
@@ -0,0 +1,11 @@
1
+ import { PolygonTemplate } from './PolygonTemplate.js';
2
+
3
+ /** ParallelogramTemplate — flowchart data / input-output. */
4
+ export class ParallelogramTemplate extends PolygonTemplate {
5
+ static defaults = { width: 130, height: 60 };
6
+
7
+ points() {
8
+ const s = Math.min(this.width * 0.2, this.height * 0.5);
9
+ return [[this.left + s, this.top], [this.right, this.top], [this.right - s, this.bottom], [this.left, this.bottom]];
10
+ }
11
+ }
@@ -0,0 +1,5 @@
1
+ import { RegularPolygonTemplate } from './RegularPolygonTemplate.js';
2
+
3
+ export class PentagonTemplate extends RegularPolygonTemplate {
4
+ static sides = 5;
5
+ }
@@ -0,0 +1,18 @@
1
+ import { Template } from './Template.js';
2
+ import { svgEl, pointsAttr } from './svg.js';
3
+
4
+ /** PolygonTemplate — abstract base for shapes whose outline is one closed polygon. */
5
+ export class PolygonTemplate extends Template {
6
+ /** Outline vertices in canvas coordinates, as [[x, y], ...]. Pure — no DOM. */
7
+ points() {
8
+ throw new Error(`${this.constructor.name} must implement points()`);
9
+ }
10
+
11
+ outline() {
12
+ return this.points();
13
+ }
14
+
15
+ shapeElements(doc) {
16
+ return [svgEl('polygon', this.paint({ points: pointsAttr(this.points()) }), doc)];
17
+ }
18
+ }
@@ -0,0 +1,13 @@
1
+ import { RectangleTemplate } from './RectangleTemplate.js';
2
+ import { svgEl } from './svg.js';
3
+
4
+ /** PredefinedProcessTemplate — rectangle with double vertical side bars (subroutine). */
5
+ export class PredefinedProcessTemplate extends RectangleTemplate {
6
+ get cornerRadius() { return 0; }
7
+
8
+ shapeElements(doc) {
9
+ const i = Math.min(12, this.width * 0.1);
10
+ const bar = (x) => svgEl('line', this.line({ x1: x, y1: this.top, x2: x, y2: this.bottom }), doc);
11
+ return [...super.shapeElements(doc), bar(this.left + i), bar(this.right - i)];
12
+ }
13
+ }
@@ -0,0 +1,28 @@
1
+ import { Template } from './Template.js';
2
+ import { svgEl } from './svg.js';
3
+ import { sampleArc } from './outline.js';
4
+
5
+ /** RectangleTemplate — box; subclasses vary only the corner radius. */
6
+ export class RectangleTemplate extends Template {
7
+ get cornerRadius() { return 2; }
8
+
9
+ outline() {
10
+ const r = Math.min(this.cornerRadius, this.width / 2, this.height / 2);
11
+ if (r < 1) return super.outline();
12
+ const { left: L, right: R, top: T, bottom: B } = this;
13
+ const q = Math.PI / 2, n = Math.max(6, Math.ceil(r / 2));
14
+ return [
15
+ ...sampleArc(R - r, T + r, r, r, -q, 0, n),
16
+ ...sampleArc(R - r, B - r, r, r, 0, q, n),
17
+ ...sampleArc(L + r, B - r, r, r, q, 2 * q, n),
18
+ ...sampleArc(L + r, T + r, r, r, 2 * q, 3 * q, n),
19
+ ];
20
+ }
21
+
22
+ shapeElements(doc) {
23
+ const r = this.cornerRadius;
24
+ return [svgEl('rect', this.paint({
25
+ x: this.left, y: this.top, width: this.width, height: this.height, rx: r, ry: r,
26
+ }), doc)];
27
+ }
28
+ }
@@ -0,0 +1,21 @@
1
+ import { PolygonTemplate } from './PolygonTemplate.js';
2
+
3
+ /**
4
+ * RegularPolygonTemplate — n equal sides inscribed in the shape's ellipse, so
5
+ * it stretches with width/height instead of ignoring the aspect ratio.
6
+ */
7
+ export class RegularPolygonTemplate extends PolygonTemplate {
8
+ static defaults = { width: 100, height: 100 };
9
+ static sides = 0;
10
+ /** Angle of the first vertex in radians (0 = pointing right). */
11
+ static startAngle = -Math.PI / 2;
12
+
13
+ points() {
14
+ const { sides, startAngle } = this.constructor;
15
+ const hw = this.width / 2, hh = this.height / 2;
16
+ return Array.from({ length: sides }, (_, i) => {
17
+ const a = startAngle + (i * 2 * Math.PI) / sides;
18
+ return [this.x + hw * Math.cos(a), this.y + hh * Math.sin(a)];
19
+ });
20
+ }
21
+ }
@@ -0,0 +1,5 @@
1
+ import { RectangleTemplate } from './RectangleTemplate.js';
2
+
3
+ export class RoundedRectangleTemplate extends RectangleTemplate {
4
+ get cornerRadius() { return Math.min(12, this.width / 4, this.height / 4); }
5
+ }
@@ -0,0 +1,8 @@
1
+ import { RectangleTemplate } from './RectangleTemplate.js';
2
+
3
+ /** StadiumTemplate — fully rounded ends (flowchart terminator). */
4
+ export class StadiumTemplate extends RectangleTemplate {
5
+ static defaults = { width: 120, height: 50 };
6
+
7
+ get cornerRadius() { return Math.min(this.width, this.height) / 2; }
8
+ }
@@ -0,0 +1,17 @@
1
+ import { PolygonTemplate } from './PolygonTemplate.js';
2
+
3
+ export class StarTemplate extends PolygonTemplate {
4
+ static defaults = { width: 100, height: 100 };
5
+ static spikes = 5;
6
+ static innerRatio = 0.45;
7
+
8
+ points() {
9
+ const { spikes, innerRatio } = this.constructor;
10
+ const hw = this.width / 2, hh = this.height / 2;
11
+ return Array.from({ length: spikes * 2 }, (_, i) => {
12
+ const r = i % 2 === 0 ? 1 : innerRatio;
13
+ const a = -Math.PI / 2 + (i * Math.PI) / spikes;
14
+ return [this.x + hw * r * Math.cos(a), this.y + hh * r * Math.sin(a)];
15
+ });
16
+ }
17
+ }
@@ -0,0 +1,18 @@
1
+ import { RectangleTemplate } from './RectangleTemplate.js';
2
+ import { svgEl } from './svg.js';
3
+
4
+ /** SwimlaneTemplate — lane / pool / partition: large box with a title band. */
5
+ export class SwimlaneTemplate extends RectangleTemplate {
6
+ static defaults = { width: 420, height: 160, fillColor: '#f8fafc' };
7
+
8
+ get cornerRadius() { return 0; }
9
+
10
+ get headerHeight() { return Math.min(26, this.height / 4); }
11
+
12
+ get labelAnchor() { return { x: this.x, y: this.top + this.headerHeight / 2 }; }
13
+
14
+ shapeElements(doc) {
15
+ const y = this.top + this.headerHeight;
16
+ return [...super.shapeElements(doc), svgEl('line', this.line({ x1: this.left, y1: y, x2: this.right, y2: y }), doc)];
17
+ }
18
+ }
@@ -0,0 +1,208 @@
1
+ import { svgEl } from './svg.js';
2
+ import { rayExitDistance, rotateVector } from './outline.js';
3
+ import { TextStyle, TEXT_STYLE_KEYS } from '../TextStyle.js';
4
+
5
+ /**
6
+ * Template — abstract base for diagram shapes.
7
+ *
8
+ * Owns everything shapes have in common: geometry/paint state, the element
9
+ * group, rotation, label and editor wiring. A subclass supplies only its
10
+ * outline via shapeElements(), so the canvas and the palette preview are
11
+ * drawn by the same code and cannot drift apart.
12
+ *
13
+ * Geometry is centre-based: (x, y) is the centre of a width x height box.
14
+ */
15
+ export class Template {
16
+ /** Per-shape construction defaults; subclasses override. */
17
+ static defaults = { width: 120, height: 60 };
18
+
19
+ /** Whether the editor offers a rotate handle for this kind of shape. */
20
+ static rotatable = true;
21
+
22
+ /** What the format painter copies from a shape and gives to another: its paint and text style. */
23
+ static formatKeys = Object.freeze(['fillColor', 'strokeColor', 'strokeWidth', 'textColor', ...TEXT_STYLE_KEYS]);
24
+
25
+ /**
26
+ * The shape's format (`formatKeys`), as it holds it: a value it takes from
27
+ * elsewhere (an ArchiMate shape's layer colour) is left unset, so pasting
28
+ * it gives the other shape its own default too.
29
+ * @returns {Object}
30
+ */
31
+ format() {
32
+ const own = typeof this.ownProperty === 'function' ? (k) => this.ownProperty(k) : (k) => this[k];
33
+ return Object.fromEntries(this.constructor.formatKeys.map(k => [k, own(k)]));
34
+ }
35
+
36
+ constructor(id, name, options = {}) {
37
+ if (new.target === Template) throw new TypeError('Template is abstract — subclass it');
38
+ this.id = id;
39
+ this.rotation = options.rotation ?? 0;
40
+ this.connections = options.connections || [];
41
+ this._initState(name, options);
42
+ }
43
+
44
+ /**
45
+ * Set the name, placement and paint this shape keeps as its own fields. A
46
+ * subclass that keeps them elsewhere (an ArchiMate element keeps them on
47
+ * its view instance and model element) overrides this.
48
+ * @protected
49
+ */
50
+ _initState(name, options) {
51
+ const d = this.constructor.defaults;
52
+ this.name = name;
53
+ this.x = options.x ?? 0;
54
+ this.y = options.y ?? 0;
55
+ this.zIndex = options.zIndex ?? 0;
56
+ this.visible = options.visible !== false;
57
+ this.width = options.width ?? d.width;
58
+ this.height = options.height ?? d.height;
59
+ this.fillColor = options.fillColor ?? d.fillColor ?? '#e8f4f8';
60
+ this.fillOpacity = options.fillOpacity ?? d.fillOpacity ?? 1;
61
+ this.strokeColor = options.strokeColor ?? d.strokeColor ?? '#333';
62
+ this.strokeWidth = options.strokeWidth ?? d.strokeWidth ?? 2;
63
+ this.textColor = options.textColor ?? d.textColor ?? '#333';
64
+ // Text style (TextStyle): unset ones are left off, so the default applies.
65
+ for (const key of TEXT_STYLE_KEYS) {
66
+ const value = options[key] ?? d[key];
67
+ if (value !== undefined && value !== null && value !== '') this[key] = value;
68
+ }
69
+ }
70
+
71
+ /** The text style this shape's name is drawn in (TextStyle). */
72
+ get textStyle() {
73
+ return Object.fromEntries(TEXT_STYLE_KEYS.map(k => [k, this[k]]).filter(([, v]) => v !== undefined));
74
+ }
75
+
76
+ get left() { return this.x - this.width / 2; }
77
+ get right() { return this.x + this.width / 2; }
78
+ get top() { return this.y - this.height / 2; }
79
+ get bottom() { return this.y + this.height / 2; }
80
+
81
+ /**
82
+ * The visible outline as a closed polygon in unrotated canvas coordinates
83
+ * (curves sampled). Edges attach to it, so it must match shapeElements().
84
+ */
85
+ outline() {
86
+ return [[this.left, this.top], [this.right, this.top], [this.right, this.bottom], [this.left, this.bottom]];
87
+ }
88
+
89
+ /**
90
+ * Where a line heading out from the centre in screen direction (dx, dy)
91
+ * meets the outline, with rotation applied.
92
+ * @returns {{x: number, y: number}}
93
+ */
94
+ boundaryPoint(dx, dy) {
95
+ const len = Math.hypot(dx, dy);
96
+ if (!len) return { x: this.x, y: this.y };
97
+ const ux = dx / len, uy = dy / len;
98
+ // Rotation preserves length, so the exit distance found in the shape's own
99
+ // frame is the distance along the on-screen direction too.
100
+ const [lx, ly] = rotateVector(ux, uy, -this.rotation);
101
+ const t = rayExitDistance(this.outline(), this.x, this.y, lx, ly);
102
+ return { x: this.x + ux * t, y: this.y + uy * t };
103
+ }
104
+
105
+ /** Centre of the name text; the z-index line sits just below it. */
106
+ get labelAnchor() { return { x: this.x, y: this.y - 8 }; }
107
+
108
+ /**
109
+ * SVG nodes forming the outline, positioned in canvas coordinates.
110
+ * @param {Document} doc
111
+ * @returns {SVGElement[]}
112
+ */
113
+ shapeElements(doc) {
114
+ throw new Error(`${this.constructor.name} must implement shapeElements()`);
115
+ }
116
+
117
+ /** Fill/stroke attributes for the main outline, merged with `extra`. */
118
+ paint(extra = {}) {
119
+ return {
120
+ fill: this.fillColor,
121
+ 'fill-opacity': this.fillOpacity === 1 ? null : this.fillOpacity,
122
+ stroke: this.strokeColor,
123
+ 'stroke-width': this.strokeWidth,
124
+ ...extra,
125
+ };
126
+ }
127
+
128
+ /** Stroke-only attributes for interior detail lines. */
129
+ line(extra = {}) {
130
+ return { fill: 'none', stroke: this.strokeColor, 'stroke-width': Math.max(1, this.strokeWidth - 0.5), ...extra };
131
+ }
132
+
133
+ /** Draw into the editor's element group and wire interaction. */
134
+ render({ group, editor }) {
135
+ const g = this.renderElement(group.ownerDocument);
136
+ editor.attachElementHandlers(this.id, g);
137
+ group.appendChild(g);
138
+ }
139
+
140
+ /** Build the complete element group (outline + label) without attaching it. */
141
+ renderElement(doc = document) {
142
+ const g = svgEl('g', { 'data-id': this.id, 'data-template-id': this.id }, doc);
143
+ if (this.rotation) g.setAttribute('transform', `rotate(${this.rotation} ${this.x} ${this.y})`);
144
+ for (const node of this.shapeElements(doc)) g.appendChild(node);
145
+ this._renderLabel(g, doc);
146
+ return g;
147
+ }
148
+
149
+ /** Standalone thumbnail of the outline, scaled to fit a size x size box. */
150
+ renderPreview(size = 40, doc = document) {
151
+ const pad = this.strokeWidth + 2;
152
+ const svg = svgEl('svg', {
153
+ width: size,
154
+ height: size,
155
+ viewBox: `${this.left - pad} ${this.top - pad} ${this.width + pad * 2} ${this.height + pad * 2}`,
156
+ preserveAspectRatio: 'xMidYMid meet',
157
+ }, doc);
158
+ for (const node of this.shapeElements(doc)) svg.appendChild(node);
159
+ return svg;
160
+ }
161
+
162
+ _renderLabel(g, doc) {
163
+ const { x, y } = this.labelAnchor;
164
+ const text = (attrs, content) => {
165
+ const t = svgEl('text', {
166
+ 'text-anchor': 'middle', 'dominant-baseline': 'middle', 'pointer-events': 'none', ...attrs,
167
+ }, doc);
168
+ t.textContent = content;
169
+ g.appendChild(t);
170
+ };
171
+ const style = this.textStyle;
172
+ const font = TextStyle.svgAttributes(style, { defaultPixels: 12 });
173
+ const zLine = `Z:${this.zIndex || 0}`;
174
+ if (TextStyle.placesText(style)) {
175
+ // Placed in the shape's box by its alignment and position (centred, middle where unset).
176
+ const at = TextStyle.block(style, this, 1, { pixels: font['font-size'], defaults: { textAlign: 'center', textPosition: 'middle' } });
177
+ const placed = { 'text-anchor': at.textAnchor, 'dominant-baseline': 'auto' };
178
+ if (this.name) text({ x: at.x, y: at.baseline, ...font, ...placed, fill: this.textColor }, this.name);
179
+ // Under the name, or over it when the name is at the bottom (so it stays in the shape).
180
+ const zY = style.textPosition === 'bottom' ? at.baseline - font['font-size'] - 2 : at.baseline + 12;
181
+ text({ x: at.x, y: zY, 'font-size': 10, fill: '#666', ...placed }, zLine);
182
+ return;
183
+ }
184
+ if (this.name) text({ x, y, ...font, fill: this.textColor }, this.name);
185
+ // Below the name, however large it is set.
186
+ text({ x, y: y + Math.max(16, font['font-size'] / 2 + 10), 'font-size': 10, fill: '#666' }, zLine);
187
+ }
188
+
189
+ serialize() {
190
+ return {
191
+ id: this.id,
192
+ name: this.name,
193
+ x: this.x,
194
+ y: this.y,
195
+ zIndex: this.zIndex,
196
+ visible: this.visible,
197
+ width: this.width,
198
+ height: this.height,
199
+ rotation: this.rotation,
200
+ fillColor: this.fillColor,
201
+ fillOpacity: this.fillOpacity,
202
+ strokeColor: this.strokeColor,
203
+ strokeWidth: this.strokeWidth,
204
+ textColor: this.textColor,
205
+ ...this.textStyle,
206
+ };
207
+ }
208
+ }
@@ -0,0 +1,11 @@
1
+ import { PolygonTemplate } from './PolygonTemplate.js';
2
+
3
+ /** TrapezoidTemplate — wide top, narrow base (flowchart manual operation). */
4
+ export class TrapezoidTemplate extends PolygonTemplate {
5
+ static defaults = { width: 130, height: 60 };
6
+
7
+ points() {
8
+ const s = Math.min(this.width * 0.2, this.height * 0.5);
9
+ return [[this.left, this.top], [this.right, this.top], [this.right - s, this.bottom], [this.left + s, this.bottom]];
10
+ }
11
+ }
@@ -0,0 +1,12 @@
1
+ import { PolygonTemplate } from './PolygonTemplate.js';
2
+
3
+ /** TriangleTemplate — isosceles, apex up. */
4
+ export class TriangleTemplate extends PolygonTemplate {
5
+ static defaults = { width: 100, height: 90 };
6
+
7
+ get labelAnchor() { return { x: this.x, y: this.y + this.height / 6 - 8 }; }
8
+
9
+ points() {
10
+ return [[this.x, this.top], [this.right, this.bottom], [this.left, this.bottom]];
11
+ }
12
+ }
@@ -0,0 +1,31 @@
1
+ export { Template } from './Template.js';
2
+ export { PolygonTemplate } from './PolygonTemplate.js';
3
+ export { RegularPolygonTemplate } from './RegularPolygonTemplate.js';
4
+ export { RectangleTemplate } from './RectangleTemplate.js';
5
+ export { RoundedRectangleTemplate } from './RoundedRectangleTemplate.js';
6
+ export { StadiumTemplate } from './StadiumTemplate.js';
7
+ export { PredefinedProcessTemplate } from './PredefinedProcessTemplate.js';
8
+ export { ClassTemplate } from './ClassTemplate.js';
9
+ export { ComponentTemplate } from './ComponentTemplate.js';
10
+ export { SwimlaneTemplate } from './SwimlaneTemplate.js';
11
+ export { CircleTemplate } from './CircleTemplate.js';
12
+ export { FinalStateTemplate } from './FinalStateTemplate.js';
13
+ export { EllipseTemplate } from './EllipseTemplate.js';
14
+ export { DiamondTemplate } from './DiamondTemplate.js';
15
+ export { TriangleTemplate } from './TriangleTemplate.js';
16
+ export { PentagonTemplate } from './PentagonTemplate.js';
17
+ export { HexagonTemplate } from './HexagonTemplate.js';
18
+ export { OctagonTemplate } from './OctagonTemplate.js';
19
+ export { StarTemplate } from './StarTemplate.js';
20
+ export { ParallelogramTemplate } from './ParallelogramTemplate.js';
21
+ export { TrapezoidTemplate } from './TrapezoidTemplate.js';
22
+ export { ManualInputTemplate } from './ManualInputTemplate.js';
23
+ export { CylinderTemplate } from './CylinderTemplate.js';
24
+ export { DocumentTemplate } from './DocumentTemplate.js';
25
+ export { NoteTemplate } from './NoteTemplate.js';
26
+ export { CloudTemplate } from './CloudTemplate.js';
27
+ export { ActorTemplate } from './ActorTemplate.js';
28
+ export { PackageTemplate } from './PackageTemplate.js';
29
+ export { BoxTemplate } from './BoxTemplate.js';
30
+ export { DataStoreTemplate } from './DataStoreTemplate.js';
31
+ export { LifelineTemplate } from './LifelineTemplate.js';