@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,571 @@
1
+ /*
2
+ This is a simplified implementation based on the excellent railroad-diagrams library by Tab Atkins.
3
+ Original project: https://github.com/tabatkins/railroad-diagrams
4
+ */
5
+
6
+ export function Diagram(...items) {
7
+ return new DiagramNode('Diagram', { items: wrapAndFlatten(items) });
8
+ }
9
+
10
+ export function Sequence(...items) {
11
+ return new DiagramNode('Sequence', { items: wrapAndFlatten(items) });
12
+ }
13
+
14
+ export function Choice(normal, ...items) {
15
+ return new DiagramNode('Choice', { normal, items: wrapAndFlatten(items) });
16
+ }
17
+
18
+ export function Optional(item, skip) {
19
+ return new DiagramNode('Optional', { item: wrap(item), skip });
20
+ }
21
+
22
+ export function OneOrMore(item, repeat) {
23
+ return new DiagramNode('OneOrMore', { item: wrap(item), repeat: wrap(repeat) });
24
+ }
25
+
26
+ export function ZeroOrMore(item, repeat, skip) {
27
+ return new DiagramNode('ZeroOrMore', { item: wrap(item), repeat: wrap(repeat), skip });
28
+ }
29
+
30
+ export function Terminal(text, href, title) {
31
+ return new DiagramNode('Terminal', { text, href, title });
32
+ }
33
+
34
+ export function NonTerminal(text, href, title) {
35
+ return new DiagramNode('NonTerminal', { text, href, title });
36
+ }
37
+
38
+ export function Comment(text, href, title) {
39
+ return new DiagramNode('Comment', { text, href, title });
40
+ }
41
+
42
+ export function Skip() {
43
+ return new DiagramNode('Skip');
44
+ }
45
+
46
+ export function Difference(item1, item2) {
47
+ return new DiagramNode('Difference', { item1: wrap(item1), item2: wrap(item2) });
48
+ }
49
+
50
+
51
+ class DiagramNode {
52
+ constructor(type, data = {}) {
53
+ this.type = type;
54
+ Object.assign(this, data);
55
+ this.needsSpace = false;
56
+ }
57
+
58
+ format() {
59
+ // This is a placeholder for a method that would typically handle layout calculations.
60
+ // In our case, the rendering logic is in the RenderEngine's renderers.
61
+ return this;
62
+ }
63
+
64
+ walk(cb) {
65
+ cb(this);
66
+ for (const key of ['item', 'item1', 'item2', 'repeat']) {
67
+ if (this[key] && this[key].walk) {
68
+ this[key].walk(cb);
69
+ }
70
+ }
71
+ if (this.items) {
72
+ this.items.forEach(item => item.walk && item.walk(cb));
73
+ }
74
+ }
75
+
76
+ addTo(parent) {
77
+ if (parent) {
78
+ parent.items = parent.items || [];
79
+ parent.items.push(this);
80
+ }
81
+ return this;
82
+ }
83
+ }
84
+
85
+ function wrap(item) {
86
+ return typeof item === 'string' ? new Terminal(item) : item;
87
+ }
88
+
89
+ function wrapAndFlatten(items) {
90
+ return items.flat(Infinity).map(wrap);
91
+ }
92
+
93
+
94
+ /*
95
+ The following are simple stubs for the formatting part of the original library.
96
+ The actual rendering is handled by SVGRenderer and CanvasRenderer.
97
+ */
98
+
99
+ // Every node — regardless of which factory function built it (Terminal,
100
+ // Sequence, Choice, ...) — is constructed via `new DiagramNode(type, data)`
101
+ // directly (see the factory functions above), never `new Terminal(...)`
102
+ // etc. So every instance's real prototype is DiagramNode.prototype, full
103
+ // stop; per-type `Terminal.prototype`/`Choice.prototype`/... objects are
104
+ // never actually consulted by JS's own prototype-chain lookup. Dispatch by
105
+ // `.type` explicitly instead, via this table, rather than (as this file
106
+ // used to) aliasing every factory's `.prototype` to the SAME
107
+ // DiagramNode.prototype object and assigning `.format` on it once per
108
+ // type — each such assignment silently overwrote the previous one, so only
109
+ // the last one (Skip's, a complete no-op) ever actually ran, for every
110
+ // node type. `Difference` has no entry — never implemented in this
111
+ // simplified port; hitting it throws a clear error below rather than
112
+ // silently doing nothing.
113
+ const FORMATTERS = {};
114
+
115
+
116
+ /*
117
+ This section would normally contain complex SVG path generation logic.
118
+ Since our RenderEngine handles drawing, we can omit the complex parts.
119
+ The classes and their structure are what's important for the EBNFEngine and RenderEngine to work together.
120
+ */
121
+
122
+ // A plain object factory, not a `this`-dependent constructor — every call
123
+ // site invokes this as `FakeSVG(...)` (no `new`), and this file is an ES
124
+ // module (strict mode), where a non-`new` call has `this === undefined`;
125
+ // the old `if (text) this.text = text; return this;` body either threw
126
+ // (assigning onto undefined) or returned undefined outright, so the very
127
+ // next `.addTo(...)` in the same expression always failed. Sets attrs
128
+ // BOTH flat on the object (`item.x`, `item.width`, ... — what
129
+ // SVGRenderer.renderDiagram reads) and nested under `.attrs` (`item.attrs.x`,
130
+ // ... — what this file's own DiagramNode.prototype.drawOn Canvas path
131
+ // reads) so both renderer backends work off one shape.
132
+ function FakeSVG(tagName, attrs = {}, text) {
133
+ // Built on DiagramNode.prototype purely for its generic .addTo() (every
134
+ // call site immediately does `FakeSVG(...).addTo(parentNode)`) — these
135
+ // are leaf rendering primitives (rect/text/path/svg/style), never
136
+ // DiagramNode-tree nodes themselves, so inheriting .format()'s
137
+ // FORMATTERS dispatch is inert (nothing calls .format() on one).
138
+ const el = Object.assign(Object.create(DiagramNode.prototype), { type: tagName, tagName, attrs });
139
+ Object.assign(el, attrs);
140
+ if (text) el.text = text;
141
+ return el;
142
+ }
143
+
144
+ function determineGaps(outer, inner) {
145
+ var diff = outer - inner;
146
+ switch (diff % 2) {
147
+ case 0:
148
+ return [diff / 2, diff / 2];
149
+ case 1:
150
+ return [Math.floor(diff / 2), Math.ceil(diff / 2)];
151
+ }
152
+ }
153
+
154
+ function Path(x, y) {
155
+ this.x = x;
156
+ this.y = y;
157
+ this.attrs = {
158
+ d: "M" + x + " " + y
159
+ };
160
+ }
161
+ Path.prototype.m = function (x, y) {
162
+ this.attrs.d += "m" + x + " " + y;
163
+ return this;
164
+ };
165
+ Path.prototype.h = function (val) {
166
+ this.attrs.d += "h" + val;
167
+ return this;
168
+ };
169
+ Path.prototype.right = Path.prototype.h;
170
+ Path.prototype.left = function (val) {
171
+ return this.h(-val);
172
+ };
173
+ Path.prototype.v = function (val) {
174
+ this.attrs.d += "v" + val;
175
+ return this;
176
+ };
177
+ Path.prototype.down = Path.prototype.v;
178
+ Path.prototype.up = function (val) {
179
+ return this.v(-val);
180
+ };
181
+ // `code` is a 2-letter compass direction pair: code[0] is the direction the
182
+ // path is heading INTO the corner, code[1] is the direction it's heading
183
+ // OUT of the corner (e.g. 'se' = arriving heading south, departing heading
184
+ // east) — always a quarter (90 degree) turn of radius AR.
185
+ //
186
+ // Derived from first principles (not the original upstream library's own
187
+ // convention, and not the previous version of this function, which computed
188
+ // a provably wrong result — see below): for two perpendicular unit
189
+ // direction vectors D_in/D_out, the endpoint offset of the connecting arc is
190
+ // exactly AR*(D_in + D_out) — verified against 3 independently-worked
191
+ // examples (south-to-east, east-to-north, north-to-east) using the
192
+ // standard "rotate the outward radius 90 degrees" identity for circular
193
+ // motion. The turn is a visual right turn (clockwise, SVG sweep-flag 1) if
194
+ // D_out is next after D_in in the N->E->S->W->N sequence, otherwise a left
195
+ // turn (counterclockwise, sweep-flag 0).
196
+ //
197
+ // The previous version of this function set the LARGE-ARC-FLAG to 1 for
198
+ // exactly the 4 codes actually used elsewhere in this file (ne/se/sw/nw) —
199
+ // backwards; a large-arc-flag forces SVG to draw the *major* (270 degree)
200
+ // arc of the circle instead of the intended *minor* (90 degree) one,
201
+ // producing a huge, visually wrong loop that still technically starts/ends
202
+ // at the right two points, which is exactly what a "large arc" bug looks
203
+ // like from the outside. Every quarter-turn in this file is a minor arc, so
204
+ // the large-arc-flag is always 0 here — there is no case that needs 1.
205
+ var COMPASS = { n: [0, -1], s: [0, 1], e: [1, 0], w: [-1, 0] };
206
+ var CLOCKWISE_NEXT = { n: 'e', e: 's', s: 'w', w: 'n' };
207
+ Path.prototype.arc = function (code) {
208
+ var AR = 10;
209
+ var din = COMPASS[code[0]];
210
+ var dout = COMPASS[code[1]];
211
+ var dx = AR * (din[0] + dout[0]);
212
+ var dy = AR * (din[1] + dout[1]);
213
+ var sweepFlag = CLOCKWISE_NEXT[code[0]] === code[1] ? 1 : 0;
214
+ this.attrs.d += "a" + AR + " " + AR + " 0 0 " + sweepFlag + " " + dx + " " + dy;
215
+ return this;
216
+ };
217
+ Path.prototype.format = function () {
218
+ return FakeSVG("path", this.attrs);
219
+ };
220
+
221
+ function escapeString(s) {
222
+ if (!s) return "";
223
+ return s.replace(/&/g, '&')
224
+ .replace(/</g, '&lt;')
225
+ .replace(/>/g, '&gt;')
226
+ .replace(/"/g, '&quot;')
227
+ .replace(/'/g, '&#39;');
228
+ }
229
+
230
+ function drawPath(item, diagram) {
231
+ var path = new Path(item.x, item.y);
232
+ var current = item;
233
+ while (current.type != 'Start') {
234
+ if (current.type === 'path') {
235
+ path.attrs.d = current.attrs.d + path.attrs.d;
236
+ }
237
+ [path, current] = drawPath(current.from, path);
238
+ }
239
+ return [path, current];
240
+ }
241
+
242
+ function addDefaultStyles() {
243
+ var style = document.createElement('style');
244
+ style.innerText = `
245
+ .railroad-diagram {
246
+ background-color: hsl(30, 20%, 95%);
247
+ }
248
+ .railroad-diagram path {
249
+ stroke-width: 3;
250
+ stroke: black;
251
+ fill: rgba(0,0,0,0);
252
+ }
253
+ .railroad-diagram text {
254
+ font: bold 14px monospace;
255
+ text-anchor: middle;
256
+ }
257
+ /* ... other styles ... */
258
+ `;
259
+ return FakeSVG('style', {}, style.innerText);
260
+ }
261
+
262
+ var options = {
263
+ VS: 8,
264
+ AR: 10,
265
+ DIAGRAM_CLASS: 'railroad-diagram',
266
+ STROKE_ODD_PIXEL_LENGTH: true,
267
+ INTERNAL_ALIGNMENT: 'center',
268
+ };
269
+
270
+ function DiagramNode_format(x, y, width) {
271
+ // Every format function stores its own x/y — nothing else in this file
272
+ // did (a separate pre-existing gap from the two bugs already fixed
273
+ // above), so any caller reading `item.x`/`item.y` after calling
274
+ // `item.format(...)` (e.g. FORMATTERS.Diagram/.Choice below, which
275
+ // position siblings relative to a previous item's x) got `undefined`/
276
+ // NaN instead of a real coordinate.
277
+ this.x = x; this.y = y;
278
+ var startX = x; // this.width below must be the DISTANCE traveled, not
279
+ // the absolute ending x — see the comment there.
280
+ // Hook up the two sides if this is a complex diagram.
281
+ for (var i = 0; i < this.items.length; i++) {
282
+ var item = this.items[i];
283
+ if (i > 0) {
284
+ // 20px gap between adjacent items — same stub width used
285
+ // everywhere else in this file (e.g. Choice's own x+10 option
286
+ // indent), doubled since there are two abutting stubs here.
287
+ x += 20;
288
+ }
289
+ item.format(x, y, width);
290
+ x += item.width;
291
+ }
292
+ // This used to be `this.width = x;` — the loop's ABSOLUTE ending
293
+ // x-coordinate, not the relative width traveled. Barely noticeable for
294
+ // a Sequence sitting near the diagram's own x=0 origin (a small, easy-
295
+ // to-miss constant offset), but for a Sequence nested inside Optional/
296
+ // Choice/ZeroOrMore — which format their children starting from
297
+ // whatever (large, cumulative) x they themselves were positioned at —
298
+ // this inflated the reported width by that entire starting offset,
299
+ // corrupting every sibling positioned after it in the enclosing
300
+ // Sequence (each subsequent item.x compounds the error further).
301
+ this.width = x - startX;
302
+ this.height = this.items.reduce((max, item) => Math.max(max, item.height), 0);
303
+ this.up = this.items[0].up;
304
+ this.down = this.items[0].down;
305
+ // A flat backbone line spanning the whole sequence at y connects every
306
+ // item (and the gaps between them) into one continuous line. This was
307
+ // missing entirely before — the only sibling of this code,
308
+ // FORMATTERS.Diagram, builds an equivalent Path but never adds it to
309
+ // the node either, so it silently draws nothing — which is why items
310
+ // floated with no connecting line, and why Choice/Optional's own
311
+ // connector arcs (which assume they're meeting a line arriving at
312
+ // their own x) looked like they started from nowhere.
313
+ new Path(startX, y).h(this.width).format().addTo(this);
314
+ return this;
315
+ }
316
+
317
+ FORMATTERS.Diagram = function (x, y, _width) {
318
+ this.x = x; this.y = y;
319
+ var path = new Path(x, y);
320
+ path.h(10);
321
+ var last = this.items.length - 1;
322
+ for (var i = 0; i < this.items.length; i++) {
323
+ var item = this.items[i];
324
+ if (item.needsSpace) {
325
+ path.h(10);
326
+ }
327
+ // width/height aren't known yet at this point — each item's own
328
+ // .format() below is what sets them — so this can't use `this.width`
329
+ // as a constraint the way Choice does; matches this file's existing
330
+ // single-pass layout approach elsewhere (e.g. Sequence/
331
+ // DiagramNode_format), not a new limitation introduced here.
332
+ item.format(path.x, path.y, 0);
333
+ path.x = item.x + item.width;
334
+ if (item.needsSpace) {
335
+ path.h(10);
336
+ }
337
+ }
338
+ path.h(10);
339
+ // Only computable once every item has actually been formatted (above) —
340
+ // this used to run BEFORE the loop, reading each item's .width while it
341
+ // was still unset (undefined), producing NaN.
342
+ this.width = this.items.reduce((w, i) => w + i.width + (i.needsSpace ? 20 : 0), 0) + 20;
343
+ this.height = this.items.reduce((h, i) => Math.max(h, i.height), 0);
344
+ new Path(this.items[0].x, y).right(this.width - 20).format().addTo(this);
345
+ return this;
346
+ };
347
+
348
+ FORMATTERS.Sequence = DiagramNode_format;
349
+
350
+ FORMATTERS.Choice = function (x, y, width) {
351
+ this.x = x; this.y = y;
352
+ // Capture the real option count BEFORE the loop below starts appending
353
+ // connector-arc path primitives onto this.items — those legitimately
354
+ // belong in .items too (so walk() finds/renders them), but a `for`
355
+ // loop keyed off the SAME array's live .length, while that array is
356
+ // growing every iteration past i>0, never terminates (each iteration
357
+ // appends 2 more entries, so `i < this.items.length` stays true
358
+ // forever) — same bug already fixed in FORMATTERS.Diagram above.
359
+ var optionCount = this.items.length;
360
+ var first = this.items[0];
361
+ var last = this.items[optionCount - 1];
362
+
363
+ // Pass 1: format every option (sets each item's own width/height/x/y).
364
+ // 20px between option baselines, not 10 — a plain Terminal/NonTerminal
365
+ // box extends 10px above its own baseline (see FORMATTERS.Terminal's
366
+ // `up = 10`), so a 10px gap left its top edge exactly touching (0px
367
+ // clearance from) the line/branch above it instead of sitting on a
368
+ // clearly separate track below it.
369
+ var currentY = y;
370
+ for (var i = 0; i < optionCount; i++) {
371
+ var item = this.items[i];
372
+ item.format(x + 10, currentY, 0);
373
+ currentY += item.height + 20;
374
+ }
375
+ // Only computable once every option has actually been formatted.
376
+ this.width = this.items.slice(0, optionCount).reduce((w, i) => Math.max(w, i.width), 0) + 20;
377
+ this.height = this.items.slice(0, optionCount).reduce((h, i) => h + i.height, 0) + (optionCount - 1) * 20;
378
+ this.up = first.up;
379
+ this.down = last.down;
380
+
381
+ // Pass 2: draw each non-first option's connector arcs — needs
382
+ // this.width (just computed above) to route the "rejoin" arc back to
383
+ // the right edge, so this can't be folded into pass 1.
384
+ //
385
+ // Each connector is a straight run down from the shared entry point
386
+ // (x, y) followed by a single 'se' (south-then-east) quarter-turn that
387
+ // lands exactly at the option's own position (x+10, opt.y) — and the
388
+ // mirror image on the exit side. The previous version of this file
389
+ // started the vertical run from `y + first.up` and ALSO added the
390
+ // arc's own dy on top, double-counting first.up (an unrelated
391
+ // quantity — how far the FIRST option's own box extends upward, not
392
+ // an offset the branch geometry needs) and overshooting the target y
393
+ // by 10px every time — while also computing a rejoin point (this.width
394
+ // - opt.width - 10) that goes negative for the widest option. Both are
395
+ // why the arcs "failed to correctly connect to boxes." Re-derived from
396
+ // scratch: the arc's own dx/dy (10,10) already accounts for the full
397
+ // x-step from x to x+10, so the straight run only needs to cover
398
+ // whatever vertical distance is left over (opt.y - y - 10), and the
399
+ // rejoin run needs this.width - opt.width - 20 (verified non-negative
400
+ // for every option, including the widest one, since this.width
401
+ // reserves exactly 20px beyond the widest option's own width — 10 for
402
+ // this stub, 10 for the matching one on the entry side).
403
+ for (var j = 1; j < optionCount; j++) {
404
+ var opt = this.items[j];
405
+ new Path(x, y).v(opt.y - y - 10).arc('se').format().addTo(this);
406
+ new Path(opt.x + opt.width, opt.y).h(this.width - opt.width - 20).arc('en').v(-(opt.y - y - 10)).format().addTo(this);
407
+ }
408
+ return this;
409
+ };
410
+
411
+
412
+ FORMATTERS.OneOrMore = function (x, y, width) {
413
+ this.x = x; this.y = y;
414
+ this.item.format(x + 10, y, width - 20);
415
+ this.width = this.item.width + 20;
416
+ this.height = this.item.height;
417
+ this.up = this.item.up;
418
+ this.down = this.item.down;
419
+ new Path(x, y).h(10).format().addTo(this);
420
+ new Path(x + 10 + this.item.width, y).h(10).format().addTo(this);
421
+ new Path(x + 10, y + this.item.up).arc('se').up(this.item.up - 10).arc('wn').h(this.item.width).arc('ne').down(this.item.up - 10).arc('ws').format().addTo(this);
422
+ return this;
423
+ };
424
+
425
+ FORMATTERS.ZeroOrMore = function (x, y, width) {
426
+ // A rounded "repeat" loop below the item — same 4-corner race-track
427
+ // shape a real railroad diagram uses, built from Path.prototype.arc()
428
+ // now that its geometry is correct (see the comment above arc()'s own
429
+ // definition). An earlier version of this used sharp h/v-only corners
430
+ // instead, specifically because arc() was unverified/believed
431
+ // degenerate at the time — now that it's derived and checked, there's
432
+ // no more reason to avoid it here.
433
+ this.x = x; this.y = y;
434
+ this.item.format(x + 10, y, 0);
435
+ this.width = this.item.width + 20;
436
+ // Must clear 2*AR (20) for the loop's 2 vertical corners to fit;
437
+ // item.down is always >=10 so this comfortably clears that minimum
438
+ // while also giving the loop's bottom bar visible separation from the
439
+ // item's own box (rather than nearly touching its bottom border).
440
+ var loopDrop = this.item.down + 20;
441
+ this.height = this.item.height + loopDrop;
442
+ this.up = this.item.up;
443
+ this.down = this.item.down + loopDrop;
444
+ new Path(x, y).h(this.width).format().addTo(this);
445
+ var straightDrop = loopDrop - 20; // the part of loopDrop not already covered by the 2 corner arcs' own dy
446
+ new Path(x + 10 + this.item.width, y)
447
+ .arc('es')
448
+ .v(straightDrop)
449
+ .arc('sw')
450
+ .h(-(this.item.width + 10))
451
+ .arc('wn')
452
+ .v(-straightDrop)
453
+ .arc('ne')
454
+ .format().addTo(this);
455
+ return this;
456
+ };
457
+
458
+ FORMATTERS.Optional = function (x, y, width) {
459
+ // "Optional" is exactly "choice between nothing and the item" — reuse
460
+ // FORMATTERS.Choice's already-correct two-pass connector-arc geometry
461
+ // (verified visually) instead of the bespoke straight-line-plus-
462
+ // separate-loop math this used to have, which drew the "bypass" line
463
+ // at the SAME y as the item itself (no vertical room was ever reserved
464
+ // for it), so it visually overlapped/doubled the item's own content
465
+ // line instead of arcing around it.
466
+ this.items = [Skip(), this.item];
467
+ // walk() checks BOTH `.item` and `.items` (see its own definition
468
+ // above) — leaving `.item` in place after also setting `.items` to an
469
+ // array that happens to contain that exact same node reference made
470
+ // walk() visit (and render) it twice.
471
+ delete this.item;
472
+ return FORMATTERS.Choice.call(this, x, y, width);
473
+ };
474
+
475
+
476
+ FORMATTERS.Terminal = function (x, y, _width) {
477
+ this.x = x; this.y = y;
478
+ this.width = this.text.length * 8 + 20;
479
+ this.height = 21;
480
+ this.up = 10;
481
+ this.down = 11;
482
+ FakeSVG('rect', { x, y: y - 10, width: this.width, height: this.height, rx: 10, ry: 10 }).addTo(this);
483
+ FakeSVG('text', { x: x + this.width / 2, y: y + 4 }, this.text).addTo(this);
484
+ return this;
485
+ };
486
+
487
+ FORMATTERS.NonTerminal = function (x, y, _width) {
488
+ this.x = x; this.y = y;
489
+ this.width = this.text.length * 8 + 20;
490
+ this.height = 21;
491
+ this.up = 10;
492
+ this.down = 11;
493
+ FakeSVG('rect', { x, y: y - 10, width: this.width, height: this.height }).addTo(this);
494
+ FakeSVG('text', { x: x + this.width / 2, y: y + 4 }, this.text).addTo(this);
495
+ return this;
496
+ };
497
+
498
+ FORMATTERS.Comment = function (x, y, _width) {
499
+ this.x = x; this.y = y;
500
+ this.width = this.text.length * 7 + 20;
501
+ this.height = 21;
502
+ this.up = 11;
503
+ this.down = 10;
504
+ FakeSVG('text', { x: x + this.width / 2, y: y + 5, class: 'comment' }, this.text).addTo(this);
505
+ return this;
506
+ };
507
+
508
+ FORMATTERS.Skip = function (x, y, _width) {
509
+ this.x = x; this.y = y;
510
+ this.width = 0;
511
+ this.height = 0;
512
+ this.up = 0;
513
+ this.down = 0;
514
+ return this;
515
+ };
516
+
517
+ DiagramNode.prototype.format = function (x, y, width) {
518
+ const formatter = FORMATTERS[this.type];
519
+ if (!formatter) throw new Error(`railroadDiagram: no format() implementation for node type "${this.type}"`);
520
+ return formatter.call(this, x, y, width);
521
+ };
522
+
523
+ DiagramNode.prototype.toSVG = function () {
524
+ var diagram = new FakeSVG('svg', { class: 'railroad-diagram' });
525
+ this.format(0, 0).addTo(diagram);
526
+ return diagram;
527
+ };
528
+
529
+ DiagramNode.prototype.drawOn = function (ctx) {
530
+ this.format(20, 20); // Add some padding
531
+
532
+ ctx.clearRect(0, 0, ctx.canvas.width, ctx.canvas.height);
533
+ ctx.canvas.width = this.width + 40;
534
+ ctx.canvas.height = this.height + 40;
535
+ ctx.translate(20, 20);
536
+
537
+ this.walk(item => {
538
+ if (item.type === 'rect' || item.tagName === 'rect') {
539
+ ctx.fillStyle = 'hsl(30, 20%, 95%)';
540
+ ctx.strokeStyle = 'black';
541
+ ctx.lineWidth = 2;
542
+ if (item.attrs.rx) { // Rounded rect for Terminals
543
+ ctx.beginPath();
544
+ ctx.moveTo(item.attrs.x + item.attrs.rx, item.attrs.y);
545
+ ctx.arcTo(item.attrs.x + item.attrs.width, item.attrs.y, item.attrs.x + item.attrs.width, item.attrs.y + item.attrs.height, item.attrs.rx);
546
+ ctx.arcTo(item.attrs.x + item.attrs.width, item.attrs.y + item.attrs.height, item.attrs.x, item.attrs.y + item.attrs.height, item.attrs.rx);
547
+ ctx.arcTo(item.attrs.x, item.attrs.y + item.attrs.height, item.attrs.x, item.attrs.y, item.attrs.rx);
548
+ ctx.arcTo(item.attrs.x, item.attrs.y, item.attrs.x + item.attrs.width, item.attrs.y, item.attrs.rx);
549
+ ctx.closePath();
550
+ ctx.fill();
551
+ ctx.stroke();
552
+ } else { // Sharp rect for NonTerminals
553
+ ctx.fillRect(item.attrs.x, item.attrs.y, item.attrs.width, item.attrs.height);
554
+ ctx.strokeRect(item.attrs.x, item.attrs.y, item.attrs.width, item.attrs.height);
555
+ }
556
+ } else if (item.type === 'text' || item.tagName === 'text') {
557
+ ctx.fillStyle = 'black';
558
+ ctx.font = 'bold 14px monospace';
559
+ ctx.textAlign = 'center';
560
+ ctx.textBaseline = 'middle';
561
+ ctx.fillText(item.text, item.attrs.x, item.attrs.y);
562
+ } else if (item.type === 'path' || item.tagName === 'path') {
563
+ ctx.strokeStyle = 'black';
564
+ ctx.lineWidth = 3;
565
+ ctx.lineCap = 'round';
566
+ const p = new Path2D(item.attrs.d);
567
+ ctx.stroke(p);
568
+ }
569
+ });
570
+ ctx.translate(-20, -20);
571
+ };
@@ -0,0 +1,16 @@
1
+ import { TreeModeRegistry } from './charting/modelTree/TreeModeRegistry.js';
2
+ import { LayerGroupedTreeMode } from './charting/modelTree/modes/LayerGroupedTreeMode.js';
3
+ import { TypeGroupedTreeMode } from './charting/modelTree/modes/TypeGroupedTreeMode.js';
4
+ import { FlatTreeMode } from './charting/modelTree/modes/FlatTreeMode.js';
5
+
6
+ export const TREE_MODE_CATALOG = [
7
+ { key: 'byLayer', TreeModeClass: LayerGroupedTreeMode },
8
+ { key: 'byType', TreeModeClass: TypeGroupedTreeMode },
9
+ { key: 'flat', TreeModeClass: FlatTreeMode },
10
+ ];
11
+
12
+ export const treeModeRegistry = new TreeModeRegistry(TREE_MODE_CATALOG);
13
+
14
+ export function getTreeModeCatalogEntry(key) {
15
+ return treeModeRegistry.get(key);
16
+ }
@@ -0,0 +1,79 @@
1
+ /**
2
+ * ContextBus — the channel layer that lets independently authored parts drive
3
+ * each other without holding references to each other (the mashup property).
4
+ *
5
+ * The load-bearing detail is **retained-value replay**: `publish()` remembers
6
+ * the last value per channel, and `subscribe()` fires immediately with it. Parts
7
+ * mount lazily — an inactive tab's part does not exist yet — so without replay,
8
+ * activating a tab would give you a chart that stays blank until the user
9
+ * re-clicks whatever drove it. With replay, a part mounting at any point in the
10
+ * session immediately sees current context.
11
+ *
12
+ * Channel names are a convention, not enforced: `selection:<entity>`,
13
+ * `filter:<name>`, `data:<queryId>`.
14
+ */
15
+ export class ContextBus {
16
+ constructor() {
17
+ /** @type {Map<string, Set<Function>>} */
18
+ this._subs = new Map();
19
+ /** @type {Map<string, any>} */
20
+ this._retained = new Map();
21
+ }
22
+
23
+ /** Publish a value and retain it for later subscribers. */
24
+ publish(channel, value) {
25
+ this._retained.set(channel, value);
26
+ const subs = this._subs.get(channel);
27
+ if (!subs) return;
28
+ // Copy before iterating: a handler may unsubscribe itself.
29
+ for (const fn of [...subs]) this._invoke(fn, value, channel);
30
+ }
31
+
32
+ /**
33
+ * Subscribe to a channel. Fires immediately if the channel already has a
34
+ * retained value. Returns an unsubscribe function — `Part` pushes this
35
+ * straight onto its disposer list.
36
+ */
37
+ subscribe(channel, fn) {
38
+ if (!this._subs.has(channel)) this._subs.set(channel, new Set());
39
+ this._subs.get(channel).add(fn);
40
+ if (this._retained.has(channel)) this._invoke(fn, this._retained.get(channel), channel);
41
+ return () => this.unsubscribe(channel, fn);
42
+ }
43
+
44
+ unsubscribe(channel, fn) {
45
+ const subs = this._subs.get(channel);
46
+ if (!subs) return;
47
+ subs.delete(fn);
48
+ if (subs.size === 0) this._subs.delete(channel);
49
+ }
50
+
51
+ /** Current retained value without subscribing. */
52
+ peek(channel) {
53
+ return this._retained.get(channel);
54
+ }
55
+
56
+ /** Drop a channel's retained value (subscribers stay attached). */
57
+ clear(channel) {
58
+ this._retained.delete(channel);
59
+ }
60
+
61
+ /** Every channel with a subscriber or a retained value — for a wiring UI. */
62
+ channels() {
63
+ return [...new Set([...this._subs.keys(), ...this._retained.keys()])].sort();
64
+ }
65
+
66
+ dispose() {
67
+ this._subs.clear();
68
+ this._retained.clear();
69
+ }
70
+
71
+ /** One bad subscriber must not stop the others from being notified. */
72
+ _invoke(fn, value, channel) {
73
+ try {
74
+ fn(value, channel);
75
+ } catch (err) {
76
+ console.error(`ContextBus: subscriber for "${channel}" threw`, err);
77
+ }
78
+ }
79
+ }