@peter.prib/renderengine 0.0.0-stage → 0.1.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 (436) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +203 -2
  3. package/REFERENCE.md +2159 -0
  4. package/dist/renderengine-workspace.umd.js +45944 -0
  5. package/dist/renderengine.umd.js +41262 -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 +544 -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 +52 -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/AreaChart.js +71 -0
  132. package/src/charting/charts/BarChart.js +80 -0
  133. package/src/charting/charts/BarChart3D.js +56 -0
  134. package/src/charting/charts/BarChart3DOrbit.js +53 -0
  135. package/src/charting/charts/BarChartBase.js +70 -0
  136. package/src/charting/charts/BarGauge.js +21 -0
  137. package/src/charting/charts/BoxPlotChart.js +41 -0
  138. package/src/charting/charts/BubbleChart.js +99 -0
  139. package/src/charting/charts/BubbleChart3D.js +78 -0
  140. package/src/charting/charts/BulletGauge.js +91 -0
  141. package/src/charting/charts/CalendarHeatmapChart.js +204 -0
  142. package/src/charting/charts/CandlestickChart.js +54 -0
  143. package/src/charting/charts/ChordDiagram.js +130 -0
  144. package/src/charting/charts/DensityChart.js +73 -0
  145. package/src/charting/charts/DialGauge.js +37 -0
  146. package/src/charting/charts/DonutChart.js +15 -0
  147. package/src/charting/charts/FunnelChart.js +47 -0
  148. package/src/charting/charts/GanttChart.js +201 -0
  149. package/src/charting/charts/GaugeChart.js +47 -0
  150. package/src/charting/charts/GeoMapChart.js +146 -0
  151. package/src/charting/charts/GroupedBarChart.js +88 -0
  152. package/src/charting/charts/GroupedDistributionChart.js +70 -0
  153. package/src/charting/charts/HeatmapChart.js +80 -0
  154. package/src/charting/charts/HierarchyChart.js +39 -0
  155. package/src/charting/charts/HistogramChart.js +45 -0
  156. package/src/charting/charts/LagPlotChart.js +41 -0
  157. package/src/charting/charts/LineChart.js +124 -0
  158. package/src/charting/charts/OutlineChart.js +95 -0
  159. package/src/charting/charts/ParallelCoordinatesChart.js +130 -0
  160. package/src/charting/charts/PieChart.js +56 -0
  161. package/src/charting/charts/PipeChart.js +88 -0
  162. package/src/charting/charts/PopulationPyramidChart.js +106 -0
  163. package/src/charting/charts/QQPlotChart.js +64 -0
  164. package/src/charting/charts/RadarChart.js +76 -0
  165. package/src/charting/charts/RadialBarChart.js +96 -0
  166. package/src/charting/charts/SankeyDiagram.js +174 -0
  167. package/src/charting/charts/ScatterChart.js +104 -0
  168. package/src/charting/charts/StackedAreaChart.js +15 -0
  169. package/src/charting/charts/StackedBarChart.js +33 -0
  170. package/src/charting/charts/StackedBarChart3DOrbit.js +58 -0
  171. package/src/charting/charts/StreamGraphChart.js +131 -0
  172. package/src/charting/charts/SunburstChart.js +57 -0
  173. package/src/charting/charts/TreemapChart.js +54 -0
  174. package/src/charting/charts/ViolinChart.js +37 -0
  175. package/src/charting/charts/WaterfallChart.js +66 -0
  176. package/src/charting/charts/WordCloudChart.js +104 -0
  177. package/src/charting/diagramModel/AddViewCommand.js +33 -0
  178. package/src/charting/diagramModel/DiagramModel.js +39 -0
  179. package/src/charting/diagramModel/DiagramModelSearch.js +22 -0
  180. package/src/charting/diagramModel/DiagramView.js +50 -0
  181. package/src/charting/diagramModel/ModelHistory.js +43 -0
  182. package/src/charting/diagramModel/ModelReport.js +153 -0
  183. package/src/charting/diagramModel/ModelSearch.js +223 -0
  184. package/src/charting/diagramModel/RemoveViewCommand.js +25 -0
  185. package/src/charting/diagramModel/RenameViewCommand.js +21 -0
  186. package/src/charting/diagramModel/ReplaceTextCommand.js +25 -0
  187. package/src/charting/diagramModel/ViewSetChecker.js +34 -0
  188. package/src/charting/diagramModel/ViewSetModel.js +243 -0
  189. package/src/charting/diagramModel/index.js +6 -0
  190. package/src/charting/diagramModel/nameTransforms.js +29 -0
  191. package/src/charting/diagrams/ArchimateCommands.js +141 -0
  192. package/src/charting/diagrams/ArchimateDiagram.js +263 -0
  193. package/src/charting/diagrams/ArchimateModel.js +1155 -0
  194. package/src/charting/diagrams/ArchimateModelChecker.js +125 -0
  195. package/src/charting/diagrams/ArchimateModelReport.js +128 -0
  196. package/src/charting/diagrams/ArchimateModelSearch.js +41 -0
  197. package/src/charting/diagrams/ArchimateValidator.js +357 -0
  198. package/src/charting/diagrams/CanvasView.js +112 -0
  199. package/src/charting/diagrams/ContextMenu.js +37 -0
  200. package/src/charting/diagrams/DataModelDiagram.js +86 -0
  201. package/src/charting/diagrams/DataModelRelationshipStrategy.js +38 -0
  202. package/src/charting/diagrams/DerivedRelationships.js +102 -0
  203. package/src/charting/diagrams/EbnfDiagram.js +39 -0
  204. package/src/charting/diagrams/EdgeGeometry.js +553 -0
  205. package/src/charting/diagrams/EditViewItemCommand.js +128 -0
  206. package/src/charting/diagrams/ElementInstance.js +157 -0
  207. package/src/charting/diagrams/GraphDiagram.js +1340 -0
  208. package/src/charting/diagrams/GraphDiagram3D.js +152 -0
  209. package/src/charting/diagrams/GraphMetrics.js +81 -0
  210. package/src/charting/diagrams/GridOverlay.js +137 -0
  211. package/src/charting/diagrams/ImportRowsCommand.js +62 -0
  212. package/src/charting/diagrams/LabelHelper.js +108 -0
  213. package/src/charting/diagrams/MergeElementsCommand.js +101 -0
  214. package/src/charting/diagrams/NestInstanceCommand.js +34 -0
  215. package/src/charting/diagrams/NodeGeometry.js +158 -0
  216. package/src/charting/diagrams/PlaceItemsCommand.js +77 -0
  217. package/src/charting/diagrams/RadialLayout.js +101 -0
  218. package/src/charting/diagrams/RelationshipInstance.js +93 -0
  219. package/src/charting/diagrams/RemoveGroupFromViewCommand.js +28 -0
  220. package/src/charting/diagrams/RemoveLineCommand.js +27 -0
  221. package/src/charting/diagrams/ShowElementCommand.js +43 -0
  222. package/src/charting/diagrams/SvgCoordinate.js +17 -0
  223. package/src/charting/diagrams/SvgZoom.js +127 -0
  224. package/src/charting/diagrams/Tooltip.js +62 -0
  225. package/src/charting/diagrams/ViewConnectionInstance.js +102 -0
  226. package/src/charting/diagrams/ViewObjectInstance.js +56 -0
  227. package/src/charting/diagrams/commands/AddEdgeCommand.js +34 -0
  228. package/src/charting/diagrams/commands/AddNodeCommand.js +28 -0
  229. package/src/charting/diagrams/commands/AddWaypointCommand.js +27 -0
  230. package/src/charting/diagrams/commands/CreateFolderCommand.js +27 -0
  231. package/src/charting/diagrams/commands/DeleteEdgeCommand.js +30 -0
  232. package/src/charting/diagrams/commands/DeleteFolderCommand.js +47 -0
  233. package/src/charting/diagrams/commands/DeleteNodeCommand.js +35 -0
  234. package/src/charting/diagrams/commands/DeleteWaypointCommand.js +24 -0
  235. package/src/charting/diagrams/commands/GraphCommand.js +65 -0
  236. package/src/charting/diagrams/commands/InvertEdgeCommand.js +24 -0
  237. package/src/charting/diagrams/commands/MoveNodeCommand.js +44 -0
  238. package/src/charting/diagrams/commands/MoveWaypointCommand.js +27 -0
  239. package/src/charting/diagrams/commands/RenameEdgeCommand.js +23 -0
  240. package/src/charting/diagrams/commands/RenameFolderCommand.js +31 -0
  241. package/src/charting/diagrams/commands/RenameNodeCommand.js +27 -0
  242. package/src/charting/diagrams/commands/ResizeNodeCommand.js +46 -0
  243. package/src/charting/diagrams/commands/UpdateEdgeSideCommand.js +40 -0
  244. package/src/charting/diagrams/commands/index.js +17 -0
  245. package/src/charting/diagrams/duplicates.js +49 -0
  246. package/src/charting/diagrams/nesting.js +30 -0
  247. package/src/charting/diagrams/roadmap.js +77 -0
  248. package/src/charting/edgeMarkers/ArrowMarker.js +15 -0
  249. package/src/charting/edgeMarkers/CircleMarker.js +13 -0
  250. package/src/charting/edgeMarkers/CrowsFootMarker.js +16 -0
  251. package/src/charting/edgeMarkers/DiamondMarker.js +15 -0
  252. package/src/charting/edgeMarkers/EdgeMarker.js +34 -0
  253. package/src/charting/edgeMarkers/HalfArrowMarker.js +8 -0
  254. package/src/charting/edgeMarkers/HollowDiamondMarker.js +18 -0
  255. package/src/charting/edgeMarkers/HollowTriangleMarker.js +18 -0
  256. package/src/charting/edgeMarkers/OpenArrowMarker.js +17 -0
  257. package/src/charting/edgeMarkers/index.js +27 -0
  258. package/src/charting/edgeStyle/EdgeStyleCascade.js +22 -0
  259. package/src/charting/edgeStyle/EdgeStyleDialog.js +51 -0
  260. package/src/charting/edgeStyle/EdgeStyleSchema.js +43 -0
  261. package/src/charting/edgeStyle/SetStyleCommand.js +12 -0
  262. package/src/charting/edgeStyle/index.js +4 -0
  263. package/src/charting/emphasis/EmphasisRule.js +42 -0
  264. package/src/charting/emphasis/HighlightRule.js +24 -0
  265. package/src/charting/glyphs/ArrowGlyph.js +21 -0
  266. package/src/charting/glyphs/BatteryGlyph.js +18 -0
  267. package/src/charting/glyphs/ChevronGlyph.js +18 -0
  268. package/src/charting/glyphs/CircleGlyph.js +15 -0
  269. package/src/charting/glyphs/CloudGlyph.js +19 -0
  270. package/src/charting/glyphs/ComponentGlyph.js +18 -0
  271. package/src/charting/glyphs/ConstraintGlyph.js +24 -0
  272. package/src/charting/glyphs/ContractBoxGlyph.js +10 -0
  273. package/src/charting/glyphs/CubeGlyph.js +19 -0
  274. package/src/charting/glyphs/CylinderGlyph.js +19 -0
  275. package/src/charting/glyphs/DashedDoubleArrowGlyph.js +11 -0
  276. package/src/charting/glyphs/DeviceGlyph.js +17 -0
  277. package/src/charting/glyphs/DiamondGlyph.js +17 -0
  278. package/src/charting/glyphs/DocumentGlyph.js +17 -0
  279. package/src/charting/glyphs/DoubleArrowGlyph.js +23 -0
  280. package/src/charting/glyphs/DoubleCircleGlyph.js +24 -0
  281. package/src/charting/glyphs/EllipseGlyph.js +18 -0
  282. package/src/charting/glyphs/FactoryGlyph.js +20 -0
  283. package/src/charting/glyphs/FlagGlyph.js +16 -0
  284. package/src/charting/glyphs/GapCircleGlyph.js +17 -0
  285. package/src/charting/glyphs/GearGlyph.js +37 -0
  286. package/src/charting/glyphs/Glyph.js +98 -0
  287. package/src/charting/glyphs/GroupingBoxGlyph.js +13 -0
  288. package/src/charting/glyphs/HalfCircleGlyph.js +22 -0
  289. package/src/charting/glyphs/HexagonGlyph.js +28 -0
  290. package/src/charting/glyphs/IconGlyph.js +22 -0
  291. package/src/charting/glyphs/ImageGlyph.js +16 -0
  292. package/src/charting/glyphs/JunctionGlyph.js +17 -0
  293. package/src/charting/glyphs/LollipopGlyph.js +22 -0
  294. package/src/charting/glyphs/MagnifierGlyph.js +17 -0
  295. package/src/charting/glyphs/NoteGlyph.js +33 -0
  296. package/src/charting/glyphs/ObjectBoxGlyph.js +21 -0
  297. package/src/charting/glyphs/OrJunctionGlyph.js +17 -0
  298. package/src/charting/glyphs/ParallelogramGlyph.js +20 -0
  299. package/src/charting/glyphs/PersonGlyph.js +23 -0
  300. package/src/charting/glyphs/PillGlyph.js +23 -0
  301. package/src/charting/glyphs/PinGlyph.js +18 -0
  302. package/src/charting/glyphs/PrincipleGlyph.js +23 -0
  303. package/src/charting/glyphs/ProductBoxGlyph.js +16 -0
  304. package/src/charting/glyphs/RectGlyph.js +15 -0
  305. package/src/charting/glyphs/RoundedBoxGlyph.js +13 -0
  306. package/src/charting/glyphs/StackGlyph.js +14 -0
  307. package/src/charting/glyphs/StepsGlyph.js +20 -0
  308. package/src/charting/glyphs/StickFigureGlyph.js +32 -0
  309. package/src/charting/glyphs/SystemSoftwareBoxGlyph.js +16 -0
  310. package/src/charting/glyphs/TabbedBoxGlyph.js +37 -0
  311. package/src/charting/glyphs/TargetGlyph.js +23 -0
  312. package/src/charting/glyphs/WavyBoxGlyph.js +17 -0
  313. package/src/charting/glyphs/WheelGlyph.js +28 -0
  314. package/src/charting/glyphs/drawGlyph.js +28 -0
  315. package/src/charting/glyphs/glyphSvg.js +55 -0
  316. package/src/charting/glyphs/index.js +109 -0
  317. package/src/charting/modelTree/AnalysisPanel.js +159 -0
  318. package/src/charting/modelTree/DiagramTabs.js +217 -0
  319. package/src/charting/modelTree/ModelTree.js +164 -0
  320. package/src/charting/modelTree/ModelTreePanel.js +914 -0
  321. package/src/charting/modelTree/TreeBuilder.js +238 -0
  322. package/src/charting/modelTree/TreeModeRegistry.js +51 -0
  323. package/src/charting/modelTree/TreeViewMode.js +110 -0
  324. package/src/charting/modelTree/buildFilterTrees.js +138 -0
  325. package/src/charting/modelTree/modes/FlatTreeMode.js +46 -0
  326. package/src/charting/modelTree/modes/LayerGroupedTreeMode.js +62 -0
  327. package/src/charting/modelTree/modes/TypeGroupedTreeMode.js +60 -0
  328. package/src/charting/modelTree/treeLayers.js +11 -0
  329. package/src/charting/report/reportHtml.js +82 -0
  330. package/src/charting/report/reportViewer.js +118 -0
  331. package/src/charting/shapes/CircleShape.js +19 -0
  332. package/src/charting/shapes/PathShape.js +17 -0
  333. package/src/charting/shapes/RectShape.js +20 -0
  334. package/src/charting/shapes/Shape.js +20 -0
  335. package/src/charting/shapes/ShapeFactory.js +23 -0
  336. package/src/charting/storage/LocalJsonStore.js +43 -0
  337. package/src/charting/templates/ActorTemplate.js +36 -0
  338. package/src/charting/templates/BoxTemplate.js +27 -0
  339. package/src/charting/templates/CircleTemplate.js +18 -0
  340. package/src/charting/templates/ClassTemplate.js +20 -0
  341. package/src/charting/templates/CloudTemplate.js +43 -0
  342. package/src/charting/templates/ComponentTemplate.js +19 -0
  343. package/src/charting/templates/CylinderTemplate.js +30 -0
  344. package/src/charting/templates/DataStoreTemplate.js +16 -0
  345. package/src/charting/templates/DiamondTemplate.js +10 -0
  346. package/src/charting/templates/DocumentTemplate.js +32 -0
  347. package/src/charting/templates/EllipseTemplate.js +15 -0
  348. package/src/charting/templates/FinalStateTemplate.js +12 -0
  349. package/src/charting/templates/GlyphTemplate.js +47 -0
  350. package/src/charting/templates/HexagonTemplate.js +17 -0
  351. package/src/charting/templates/LifelineTemplate.js +20 -0
  352. package/src/charting/templates/ManualInputTemplate.js +12 -0
  353. package/src/charting/templates/NoteTemplate.js +23 -0
  354. package/src/charting/templates/OctagonTemplate.js +7 -0
  355. package/src/charting/templates/PackageTemplate.js +25 -0
  356. package/src/charting/templates/ParallelogramTemplate.js +11 -0
  357. package/src/charting/templates/PentagonTemplate.js +5 -0
  358. package/src/charting/templates/PolygonTemplate.js +18 -0
  359. package/src/charting/templates/PredefinedProcessTemplate.js +13 -0
  360. package/src/charting/templates/RectangleTemplate.js +28 -0
  361. package/src/charting/templates/RegularPolygonTemplate.js +21 -0
  362. package/src/charting/templates/RoundedRectangleTemplate.js +5 -0
  363. package/src/charting/templates/StadiumTemplate.js +8 -0
  364. package/src/charting/templates/StarTemplate.js +17 -0
  365. package/src/charting/templates/SwimlaneTemplate.js +18 -0
  366. package/src/charting/templates/Template.js +208 -0
  367. package/src/charting/templates/TrapezoidTemplate.js +11 -0
  368. package/src/charting/templates/TriangleTemplate.js +12 -0
  369. package/src/charting/templates/index.js +31 -0
  370. package/src/charting/templates/outline.js +59 -0
  371. package/src/charting/templates/svg.js +19 -0
  372. package/src/charting/textToShapes.js +61 -0
  373. package/src/charting/toolbar/ToolbarButton.js +38 -0
  374. package/src/charting/toolbar/ToolbarCheckbox.js +31 -0
  375. package/src/charting/toolbar/ToolbarItem.js +19 -0
  376. package/src/charting/toolbar/ToolbarMenu.js +36 -0
  377. package/src/charting/toolbar/ToolbarSelect.js +38 -0
  378. package/src/charting/toolbar/ToolbarSeparator.js +7 -0
  379. package/src/charting/toolbar/ToolbarText.js +22 -0
  380. package/src/charting/toolbar/index.js +8 -0
  381. package/src/charting/toolbar/pickFile.js +14 -0
  382. package/src/charting/viewDecorations.js +85 -0
  383. package/src/charting/zOrder.js +57 -0
  384. package/src/csvTable.js +61 -0
  385. package/src/datamodel.js +122 -0
  386. package/src/datawindow/BoundedWindow.js +36 -0
  387. package/src/datawindow/FlatDataWindow.js +34 -0
  388. package/src/datawindow/GraphDataWindow.js +40 -0
  389. package/src/datawindow/GroupedSampleDataWindow.js +16 -0
  390. package/src/datawindow/SeriesDataWindow.js +42 -0
  391. package/src/datawindow/index.js +31 -0
  392. package/src/diagramCatalog.js +30 -0
  393. package/src/ebnfDiagram.js +57 -0
  394. package/src/ebnfParser.js +129 -0
  395. package/src/exportImage.js +233 -0
  396. package/src/index.js +2564 -0
  397. package/src/itIcons.js +84 -0
  398. package/src/kernelExpr.js +243 -0
  399. package/src/propertiesDialog.js +463 -0
  400. package/src/railroadDiagram.js +571 -0
  401. package/src/treeModeCatalog.js +16 -0
  402. package/src/workspace/ContextBus.js +79 -0
  403. package/src/workspace/EditorShell.js +67 -0
  404. package/src/workspace/Part.js +163 -0
  405. package/src/workspace/PartFactory.js +49 -0
  406. package/src/workspace/PartRegistry.js +86 -0
  407. package/src/workspace/Workspace.js +321 -0
  408. package/src/workspace/archimateServices.js +33 -0
  409. package/src/workspace/dom.js +120 -0
  410. package/src/workspace/index.js +75 -0
  411. package/src/workspace/layout/GridNode.js +280 -0
  412. package/src/workspace/layout/LayoutNode.js +89 -0
  413. package/src/workspace/layout/PartNode.js +77 -0
  414. package/src/workspace/layout/SplitNode.js +114 -0
  415. package/src/workspace/layout/TabsNode.js +191 -0
  416. package/src/workspace/layout/index.js +24 -0
  417. package/src/workspace/parts/AdapterPart.js +33 -0
  418. package/src/workspace/parts/ArchimateCanvasPart.js +345 -0
  419. package/src/workspace/parts/ArchimateEditorPart.js +79 -0
  420. package/src/workspace/parts/ChartPart.js +115 -0
  421. package/src/workspace/parts/ContentPart.js +34 -0
  422. package/src/workspace/parts/DetailPart.js +46 -0
  423. package/src/workspace/parts/DiagramEditorPart.js +135 -0
  424. package/src/workspace/parts/EditorPart.js +388 -0
  425. package/src/workspace/parts/HtmlPart.js +25 -0
  426. package/src/workspace/parts/ListPart.js +57 -0
  427. package/src/workspace/parts/ModelFile.js +187 -0
  428. package/src/workspace/parts/ModelsPart.js +135 -0
  429. package/src/workspace/styles.js +258 -0
  430. package/src/workspace/themes.js +96 -0
  431. package/src/workspace/workArea.js +413 -0
  432. package/src/workspace/workAreaModel.js +197 -0
  433. package/src/workspace.js +16 -0
  434. package/src/zip/ZipArchive.js +160 -0
  435. package/src/zip/crc32.js +25 -0
  436. package/src/zip/inflate.js +159 -0
@@ -0,0 +1,463 @@
1
+ /**
2
+ * propertiesDialog — the "Show/Edit Properties" dialog, as a shipped feature.
3
+ *
4
+ * `graphDiagram` has always had the HOOKS for this (`onNodeDoubleClick`,
5
+ * `contextMenuItems`, `NODE_STRUCTURAL_KEYS`) but not the dialog, which lived
6
+ * only in `test/charts.html`. A consumer wanting double-click-to-edit therefore
7
+ * had to copy 400 lines out of a demo page — so nobody did, and diagrams that
8
+ * could have been editable were read-only. This is that dialog, generalized.
9
+ *
10
+ * Two halves, split on testability:
11
+ *
12
+ * - The DECISIONS are pure functions over plain objects — which fields a
13
+ * subject has, which section each belongs to, which control type edits it,
14
+ * how a typed value is read back out of a string, and whether a derived
15
+ * colour/icon may be refreshed silently. No DOM.
16
+ * - The dialog itself is a FormDialog built from those: a thin shell.
17
+ *
18
+ * Nothing here runs at import time, so this module loads under node.
19
+ */
20
+
21
+ import { LabelHelper } from './charting/diagrams/LabelHelper.js';
22
+ import { ArchimateDiagram } from './charting/diagrams/ArchimateDiagram.js';
23
+ import { ArchimateSpecializationSelector } from './charting/ArchimateSpecializationSelector.js';
24
+ import { FormDialog } from './charting/FormDialog.js';
25
+ import { el } from './workspace/dom.js';
26
+ import { TextStyle } from './charting/TextStyle.js';
27
+ import { PropertyListEditor, PROPERTY_TYPES, coercePropertyValue, stringifyPropertyValue } from './charting/PropertyListEditor.js';
28
+
29
+ export { PROPERTY_TYPES, coercePropertyValue, stringifyPropertyValue };
30
+
31
+ /** ArchiMate's own layers plus the engine's catch-all — a closed list. */
32
+ export const LAYER_CHOICES = [
33
+ 'strategy', 'business', 'application', 'technology',
34
+ 'physical', 'motivation', 'implementation', 'other',
35
+ ];
36
+
37
+ /**
38
+ * Which section of the form a node field belongs to.
39
+ *
40
+ * OBJECT is the concept itself — the same whatever diagram draws it. DIAGRAM is
41
+ * this view's own presentation of it. Both live on the one flat node object
42
+ * `graphDiagram` renders (there is no model/view split under the hood); the
43
+ * grouping keeps the distinction visible while editing, which is the whole
44
+ * point of an architecture tool.
45
+ */
46
+ export const NODE_SECTIONS = {
47
+ object: ['name', 'description', 'type', 'specialization'],
48
+ diagram: ['label', 'layer', 'color', 'strokeColor', 'textColor', 'icon', 'group', 'size', 'useDistinctShape'],
49
+ };
50
+
51
+ /** What a field is called in the dialog, where its key would not read well. */
52
+ export const FIELD_LABELS = {
53
+ color: 'Fill colour', strokeColor: 'Line colour', textColor: 'Text colour',
54
+ useDistinctShape: 'Distinct shape',
55
+ };
56
+
57
+ /** Which control edits which field. Anything unlisted is a plain text box. */
58
+ const FIELD_TYPES = {
59
+ description: 'textarea',
60
+ documentation: 'textarea',
61
+ notes: 'textarea',
62
+ tooltip: 'textarea',
63
+ color: 'color',
64
+ strokeColor: 'color',
65
+ textColor: 'color',
66
+ layer: 'select',
67
+ icon: 'select',
68
+ type: 'select-editable',
69
+ specialization: 'select-editable',
70
+ useDistinctShape: 'checkbox',
71
+ };
72
+
73
+ /**
74
+ * The rows a dialog should show, in order, already sectioned and typed.
75
+ *
76
+ * @param {object} subject the node or edge being edited
77
+ * @param {'node'|'edge'} kind
78
+ * @param {object} [ctx]
79
+ * @param {string[]} [ctx.typeChoices] suggestions for `type`
80
+ * @param {string[]} [ctx.iconChoices] options for `icon`
81
+ * @param {string[]} [ctx.extraKeys] caller-added fields, from the engine's
82
+ * own "extra data" reckoning — shown under Other/Extra
83
+ * @returns {Array<{key, value, section, type, choices?, readOnly?}>}
84
+ */
85
+ export function propertyRowsFor(subject = {}, kind = 'node', ctx = {}) {
86
+ const { typeChoices = [], iconChoices = [], relationshipChoices = [], specializationChoices = [], extraKeys = [] } = ctx;
87
+ const rows = [];
88
+ const seen = new Set();
89
+ const push = (key, section, over = {}) => {
90
+ if (seen.has(key)) return;
91
+ seen.add(key);
92
+ rows.push({
93
+ key, section, value: subject[key],
94
+ type: over.type ?? FIELD_TYPES[key] ?? 'text',
95
+ ...(over.choices ? { choices: over.choices } : {}),
96
+ ...(over.readOnly ? { readOnly: true } : {}),
97
+ });
98
+ };
99
+
100
+ if (kind === 'edge') {
101
+ // The ends are identity, not a property — renaming one would silently
102
+ // re-wire the diagram, which is a different (and destructive) action
103
+ // from editing what the relationship IS.
104
+ push('source', 'edge', { readOnly: true });
105
+ push('target', 'edge', { readOnly: true });
106
+ push('label', 'edge');
107
+ push('kind', 'edge', { type: 'select', choices: relationshipChoices });
108
+ push('weight', 'edge');
109
+ push('color', 'edge');
110
+ push('tooltip', 'edge');
111
+ } else {
112
+ for (const key of NODE_SECTIONS.object) {
113
+ push(key, 'object',
114
+ key === 'type' ? { choices: typeChoices }
115
+ : key === 'specialization' ? { choices: specializationChoices }
116
+ : {});
117
+ }
118
+ for (const key of NODE_SECTIONS.diagram) {
119
+ push(key, 'diagram',
120
+ key === 'layer' ? { choices: LAYER_CHOICES }
121
+ : key === 'icon' ? { choices: iconChoices }
122
+ : {});
123
+ }
124
+ }
125
+ for (const key of extraKeys) push(key, 'other');
126
+ return rows;
127
+ }
128
+
129
+ /**
130
+ * Read an edited string back as the type the field originally held.
131
+ *
132
+ * A field that was a number must not come back as the string "3" — the diagram
133
+ * sizes and scales off it. Invalid JSON in an array field leaves the value
134
+ * alone rather than destroying it.
135
+ */
136
+ export function coerceFieldValue(raw, { wasArray = false, wasNumber = false, wasBoolean = false, previous } = {}) {
137
+ if (wasArray) {
138
+ try { return JSON.parse(raw); } catch { return previous; }
139
+ }
140
+ if (wasNumber) return raw === '' ? undefined : Number(raw);
141
+ if (wasBoolean) return raw === 'true';
142
+ return raw;
143
+ }
144
+
145
+ /**
146
+ * After a layer/type change, may the derived colour and icon be refreshed
147
+ * WITHOUT asking?
148
+ *
149
+ * Only when they were never customised — still exactly what auto-derivation
150
+ * gave the OLD layer/type, and not something typed in this same edit. There is
151
+ * nothing of the user's to lose in that case. Anything they chose deliberately
152
+ * is theirs, and gets a prompt instead.
153
+ *
154
+ * @returns {{color: boolean, icon: boolean, changed: boolean}}
155
+ */
156
+ export function derivedRefreshPlan({
157
+ layerChanged = false, typeChanged = false,
158
+ colorWasAuto = false, iconWasAuto = false,
159
+ colorFieldUntouched = true, iconFieldUntouched = true,
160
+ } = {}) {
161
+ const changed = !!(layerChanged || typeChanged);
162
+ return {
163
+ changed,
164
+ color: changed && colorWasAuto && colorFieldUntouched,
165
+ icon: changed && iconWasAuto && iconFieldUntouched,
166
+ };
167
+ }
168
+
169
+ /* ── DOM side ────────────────────────────────────────────────────────────── */
170
+
171
+ /**
172
+ * Show the properties of one node or edge, editable.
173
+ *
174
+ * @param {object} subject the node/edge object the diagram is rendering
175
+ * @param {RenderEngine} engine
176
+ * @param {'node'|'edge'} kind
177
+ * @param {object} [options]
178
+ * @param {Function} [options.onSave] (subject, changedKeys) — persist here.
179
+ * The subject is already updated and the diagram already re-rendered.
180
+ * @param {Document} [options.document]
181
+ */
182
+ export function showPropertiesDialog(subject, engine, kind = 'node', options = {}) {
183
+ // A context-menu action's exception is otherwise swallowed by the menu's
184
+ // own click listener — nothing visibly happens, with no clue why.
185
+ try {
186
+ return showPropertiesDialogUnsafe(subject, engine, kind, options);
187
+ } catch (err) {
188
+ console.error('showPropertiesDialog failed:', err);
189
+ // eslint-disable-next-line no-alert
190
+ (options.document ?? document).defaultView?.alert?.(`Properties failed: ${err?.message ?? err}`);
191
+ return null;
192
+ }
193
+ }
194
+
195
+ const SECTION_LABELS = { object: 'Object', diagram: 'Diagram', other: 'Other', edge: null };
196
+
197
+ function showPropertiesDialogUnsafe(subject, engine, kind, options = {}) {
198
+ const doc = options.document ?? document;
199
+ const RenderEngineClass = engine.constructor;
200
+ const notation = RenderEngineClass.ArchimateNotation;
201
+ const structuralKeys = engine._graphDiagram?.structuralKeys(kind === 'edge' ? 'edge' : 'node')
202
+ ?? (kind === 'edge' ? RenderEngineClass.EDGE_STRUCTURAL_KEYS : RenderEngineClass.NODE_STRUCTURAL_KEYS);
203
+ const isNode = kind === 'node';
204
+ // The SAME catalog version the diagram itself was built with, so the
205
+ // dropdown offers exactly what is actually resolvable.
206
+ const version = engine._archimateOptions?.archimateVersion || '4';
207
+
208
+ const typeChoices = isNode && notation
209
+ ? [...new Set([
210
+ ...notation.elementTypeNames(version),
211
+ ...(engine._chartState?.nodes ?? []).map(n => n.type).filter(Boolean),
212
+ ])].sort()
213
+ : [];
214
+ const iconChoices = isNode && notation ? notation.iconChoices(subject.type, version) : [];
215
+ const relationshipChoices = !isNode && notation ? notation.relationshipTypeNames() : [];
216
+ const specializationChoices = isNode && notation
217
+ ? RenderEngineClass.ArchimateSpecializationRegistry?.list().map(s => s.name).sort() ?? []
218
+ : [];
219
+ const extraKeys = (LabelHelper.nodeExtraDataLines(subject, structuralKeys))
220
+ .map(line => line.slice(0, line.indexOf(':')))
221
+ .filter(Boolean);
222
+
223
+ const rows = propertyRowsFor(subject, kind, { typeChoices, iconChoices, relationshipChoices, specializationChoices, extraKeys });
224
+
225
+ const specSelect = isNode && RenderEngineClass.ArchimateSpecializationRegistry
226
+ ? new ArchimateSpecializationSelector(RenderEngineClass.ArchimateSpecializationRegistry, { doc })
227
+ .buildSelect({ value: subject.specialization ?? '', elementType: subject.type || null, onTypeChange: () => {} })
228
+ : null;
229
+ const propertyList = new PropertyListEditor(subject.properties ?? [], doc);
230
+
231
+ const fields = [];
232
+ let sectionShown = null;
233
+ for (const row of rows) {
234
+ if (row.section !== sectionShown) {
235
+ sectionShown = row.section;
236
+ if (SECTION_LABELS[row.section]) fields.push({ type: 'heading', label: SECTION_LABELS[row.section] });
237
+ }
238
+ fields.push(fieldForRow(row, specSelect));
239
+ }
240
+ // How a node's text is set: TextStyle's fields (the graph renderer draws no underline).
241
+ if (isNode) fields.push({ type: 'heading', label: 'Text' }, ...TextStyle.fields(TextStyle.fromNode(subject), { underline: false }));
242
+ // User-defined typed properties — a structured array rather than flat extra
243
+ // data, so it gets its own editable section.
244
+ fields.push({ type: 'heading', label: 'Properties' });
245
+ fields.push({ key: '__properties', label: '', type: 'custom', element: propertyList.element, read: () => propertyList.collect() });
246
+
247
+ // `id` (a GUID in a real app) is deliberately not shown — it has little
248
+ // value to a person; name/label are the human-facing identity.
249
+ const subjectName = kind === 'edge'
250
+ ? `${subject.source} → ${subject.target}`
251
+ : (subject.name || subject.label || subject.id);
252
+ const dialog = new FormDialog({
253
+ title: options.title ?? `${isNode ? 'Node' : 'Edge'} properties — ${subjectName}`,
254
+ fields,
255
+ submitLabel: 'Save',
256
+ idPrefix: 'properties-',
257
+ document: doc,
258
+ onApply: (values) => {
259
+ const edited = rows.filter(r => !r.readOnly).map(r => ({
260
+ key: r.key, input: dialog.controls[r.key], previous: r.value,
261
+ wasArray: Array.isArray(r.value),
262
+ wasNumber: typeof r.value === 'number',
263
+ wasBoolean: typeof r.value === 'boolean' || r.type === 'checkbox',
264
+ }));
265
+ applyEdits(subject, engine, kind, edited, notation, version);
266
+ // The Text section, in the node's own names.
267
+ const text = isNode ? TextStyle.toNode(TextStyle.fromValues(values)) : {};
268
+ Object.assign(subject, text);
269
+ const textKeys = Object.keys(text);
270
+ if (values.__properties.length) subject.properties = values.__properties;
271
+ else delete subject.properties;
272
+ engine._rerenderGraph?.();
273
+ options.onSave?.(subject, [...edited.map(e => e.key), ...textKeys, 'properties']);
274
+ },
275
+ }).open();
276
+
277
+ const { layer, type, icon } = dialog.controls;
278
+ if (layer && type && notation) wireLayerTypeCascade(layer, type, icon, notation, version);
279
+ if (type && specSelect) {
280
+ type.addEventListener('change', () => specSelect._onTypeChanged?.(type.value.trim()));
281
+ }
282
+ return { overlay: dialog.overlay, close: () => dialog.close() };
283
+ }
284
+
285
+ /** The FormDialog field for one property row. */
286
+ function fieldForRow({ key, value, type, choices, readOnly }, specSelect) {
287
+ const base = { key, label: FIELD_LABELS[key] ?? key, value, readOnly };
288
+ // Text needs a colour: "No colour" is for fills and lines.
289
+ if (type === 'color') return { ...base, type, allowNone: key !== 'textColor' };
290
+ if (type === 'select-editable' && key === 'specialization' && specSelect) {
291
+ return { ...base, type: 'custom', element: specSelect, read: () => specSelect.value };
292
+ }
293
+ if (type === 'select-editable') return { ...base, type: 'text', suggestions: choices?.length ? choices : undefined };
294
+ if (type === 'select' && choices?.length) return { ...base, type: 'select', choices: choices.map(c => [c, c]), allowEmpty: true };
295
+ if (type === 'select') return { ...base, type: 'text' };
296
+ if (type === 'textarea') return { ...base, type: 'textarea', rows: key === 'description' ? 2 : 4 };
297
+ return { ...base, type };
298
+ }
299
+
300
+ /**
301
+ * The editable list of user-defined typed properties: name, type, value rows
302
+ * with add/remove. `collect()` reads them back, dropping unnamed rows.
303
+ */
304
+ /**
305
+ * The category/type dependency, reflected both ways.
306
+ *
307
+ * Picking a layer narrows type's suggestions to that layer's official types AND
308
+ * clears type — every official type belongs to exactly one layer, so the old
309
+ * one essentially never still applies. Picking a recognised type snaps layer to
310
+ * match, and refreshes icon's options to that type's own.
311
+ */
312
+ function wireLayerTypeCascade(layerInput, typeInput, iconInput, notation, version) {
313
+ layerInput.addEventListener('change', () => {
314
+ const list = typeInput.list;
315
+ if (!list) return;
316
+ list.replaceChildren(...notation.typesInLayer(layerInput.value, version).map(t => t.name).sort().map(name => new Option(name)));
317
+ typeInput.value = '';
318
+ delete typeInput.dataset.prevValue;
319
+ typeInput.focus();
320
+ });
321
+ typeInput.addEventListener('change', () => {
322
+ const known = notation.elementType(typeInput.value.trim(), version);
323
+ // A v4 Common Domain type has no fixed layer of its own, so there is
324
+ // nothing to snap to for one of those.
325
+ if (known?.layer) layerInput.value = known.layer.name;
326
+ if (!iconInput) return;
327
+ const current = iconInput.value;
328
+ const choices = notation.iconChoices(typeInput.value.trim(), version);
329
+ iconInput.replaceChildren(...choices.map(choice => new Option(choice, choice, false, choice === current)));
330
+ if (!choices.includes(current)) iconInput.value = choices[0];
331
+ });
332
+ }
333
+
334
+ function applyEdits(subject, engine, kind, fields, notation, version) {
335
+ // Captured BEFORE mutating, so "did layer/type change" and "was the colour
336
+ // still auto-derived from the OLD layer/type" both compare against the
337
+ // pre-edit state.
338
+ const originalLayer = subject.layer;
339
+ const originalType = subject.type;
340
+ const originalSpecialization = subject.specialization;
341
+ const isNode = kind === 'node';
342
+ const colorWasAuto = isNode && subject.color === engine._archimateLayerColor?.(originalLayer);
343
+ const iconWasAuto = isNode && !subject.iconUrl
344
+ && subject.icon === engine._archimateDefaultIcon?.(subject, originalLayer, undefined, 0, version);
345
+ const colorInput = fields.find(f => f.key === 'color')?.input;
346
+ const iconInput = fields.find(f => f.key === 'icon')?.input;
347
+ // Case-insensitive: a native colour input normalises to lowercase hex,
348
+ // which would otherwise read as a hand-edit even when nothing changed.
349
+ const colorFieldUntouched = !colorInput
350
+ || colorInput.value.toLowerCase() === String(subject.color ?? '').toLowerCase();
351
+ const iconFieldUntouched = !iconInput || iconInput.value === (subject.icon ?? '');
352
+
353
+ const originalKind = subject.kind;
354
+ for (const f of fields) {
355
+ const raw = f.input.type === 'checkbox' ? String(f.input.checked) : f.input.value;
356
+ subject[f.key] = coerceFieldValue(raw, f);
357
+ }
358
+
359
+ if (!isNode) {
360
+ if (notation && subject.kind !== originalKind) {
361
+ const relationshipStyles = engine._archimateOptions?.relationshipStyles;
362
+ const style = relationshipStyles?.[subject.kind] ?? notation.relationshipType(subject.kind);
363
+ subject.lineStyle = style.lineStyle;
364
+ subject.arrowhead = style.arrowhead || 'none';
365
+ subject.arrowheadStart = style.arrowheadStart;
366
+ }
367
+ return;
368
+ }
369
+ const plan = derivedRefreshPlan({
370
+ layerChanged: subject.layer !== originalLayer,
371
+ typeChanged: subject.type !== originalType,
372
+ colorWasAuto, iconWasAuto, colorFieldUntouched, iconFieldUntouched,
373
+ });
374
+ if (!plan.changed) return;
375
+
376
+ const freshColor = engine._archimateLayerColor?.(subject.layer);
377
+ const freshIcon = subject.iconUrl ? undefined
378
+ : engine._archimateDefaultIcon?.(subject, subject.layer, undefined, 0, version);
379
+ if (plan.color) subject.color = freshColor;
380
+ if (plan.icon) subject.icon = freshIcon;
381
+ if (!plan.color || !plan.icon) {
382
+ const what = [!plan.color && 'colour', !plan.icon && 'icon'].filter(Boolean).join(' and ');
383
+ // eslint-disable-next-line no-alert
384
+ if (globalThis.confirm?.(`Layer/type changed to "${subject.type || subject.layer}". `
385
+ + `Update this element's customised ${what} to match?`)) {
386
+ if (!plan.color) subject.color = freshColor;
387
+ if (!plan.icon) subject.icon = freshIcon;
388
+ }
389
+ }
390
+ if (engine._archimateCornerStyle) {
391
+ subject.cornerStyle = engine._archimateCornerStyle(subject, subject.layer, version);
392
+ }
393
+
394
+ // Specialization changed -> apply the specialization's own icon/colour,
395
+ // but ask before overwriting a customised value.
396
+ if (isNode && subject.specialization !== originalSpecialization && engine.constructor.ArchimateSpecializationRegistry) {
397
+ const spec = engine.constructor.ArchimateSpecializationRegistry.resolve(subject.specialization);
398
+ if (spec) {
399
+ const defaultColor = engine._archimateLayerColor?.(subject.layer);
400
+ const defaultIcon = !subject.iconUrl
401
+ ? engine._archimateDefaultIcon?.(subject, subject.layer, undefined, 0, version)
402
+ : undefined;
403
+ const colorIsDefault = !subject.color
404
+ || String(subject.color).toLowerCase() === String(defaultColor ?? '').toLowerCase();
405
+ const iconIsDefault = !subject.icon && !subject.iconUrl;
406
+
407
+ if (spec.color && subject.color !== spec.color) {
408
+ if (colorIsDefault || globalThis.confirm?.(`Reset colour to specialization "${spec.name}" (${spec.color})?`)) {
409
+ subject.color = spec.color;
410
+ }
411
+ }
412
+ if (spec.iconUrl && subject.iconUrl !== spec.iconUrl) {
413
+ if (iconIsDefault || globalThis.confirm?.(`Reset icon image to specialization "${spec.name}"?`)) {
414
+ subject.iconUrl = spec.iconUrl;
415
+ delete subject.icon;
416
+ }
417
+ } else if (spec.icon && subject.icon !== spec.icon && !subject.iconUrl) {
418
+ if (iconIsDefault || globalThis.confirm?.(`Reset icon to specialization "${spec.name}" (${spec.icon})?`)) {
419
+ subject.icon = spec.icon;
420
+ delete subject.iconUrl;
421
+ }
422
+ }
423
+ }
424
+ }
425
+ }
426
+
427
+ /**
428
+ * Settings for the diagram/view itself rather than any one object on it —
429
+ * what double-clicking empty canvas opens.
430
+ */
431
+ export function showDiagramPropertiesDialog(engine, options = {}) {
432
+ try {
433
+ const chartOptions = engine._chartState?.options;
434
+ if (!chartOptions) return null;
435
+ // Only for an ArchiMate diagram: which of each type's own icon choices
436
+ // is the default. Applied live, and only to nodes that never had their
437
+ // icon customised.
438
+ const archimate = engine._archimateOptions;
439
+ const dialog = new FormDialog({
440
+ title: options.title ?? 'Diagram properties',
441
+ fields: [
442
+ {
443
+ key: 'edgeRouting', label: 'edgeRouting', type: 'select', value: chartOptions.edgeRouting ?? 'straight',
444
+ choices: ['straight', 'curved', 'orthogonal', 'polyline'].map(c => [c, c]),
445
+ },
446
+ ...(archimate ? [{ key: 'iconChoiceIndex', label: 'iconChoiceIndex', type: 'number', value: archimate.iconChoiceIndex ?? 0, min: 0 }] : []),
447
+ ],
448
+ submitLabel: 'Save',
449
+ idPrefix: 'diagram-properties-',
450
+ document: options.document ?? document,
451
+ onApply: ({ edgeRouting, iconChoiceIndex }) => {
452
+ chartOptions.edgeRouting = edgeRouting;
453
+ engine._rerenderGraph?.();
454
+ if (archimate && Number.isFinite(iconChoiceIndex)) ArchimateDiagram.setIconChoiceIndex(engine, iconChoiceIndex);
455
+ options.onSave?.(chartOptions);
456
+ },
457
+ }).open();
458
+ return { overlay: dialog.overlay, close: () => dialog.close() };
459
+ } catch (err) {
460
+ console.error('showDiagramPropertiesDialog failed:', err);
461
+ return null;
462
+ }
463
+ }