@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,58 @@
1
+ import { ColorPalette } from '../ColorPalette.js';
2
+ import { Chart3D } from '../Chart3D.js';
3
+
4
+ /**
5
+ * StackedBarChart3DOrbit — stacked-segment version of BarChart3DOrbit.
6
+ */
7
+ export class StackedBarChart3DOrbit extends Chart3D {
8
+ static chartType = 'stackedBar3dOrbit';
9
+
10
+ _render() {
11
+ const data = this.data;
12
+ const options = this.options;
13
+ const { colors, title } = options;
14
+ const { cx, cy, toScreen, box } = this._viewport();
15
+ const { x: bx, y: by, width, height } = box;
16
+
17
+ const { xLabels, zLabels, xIndex, zIndex } = this.bucketGrid(data);
18
+ const stackMax = Math.max(...data.map(d => d.values.reduce((s, v) => s + v, 0))) || 1;
19
+ const palette = new ColorPalette(colors);
20
+
21
+ const cellW = 2 / Math.max(1, xLabels.length);
22
+ const cellD = 2 / Math.max(1, zLabels.length);
23
+ const barFrac = 0.7;
24
+
25
+ if (title) {
26
+ this.renderer.text(title, cx, by - 20, { textAnchor: 'middle', fontSize: '18px', fill: '#333' });
27
+ }
28
+
29
+ const bars = data.map(d => {
30
+ const xi = xIndex.get(d.x), zi = zIndex.get(d.z);
31
+ const xCenter = -1 + cellW * (xi + 0.5);
32
+ const zCenter = -1 + cellD * (zi + 0.5);
33
+ const hw = cellW * barFrac / 2, hd = cellD * barFrac / 2;
34
+ const stackTotal = d.values.reduce((s, v) => s + v, 0) / stackMax;
35
+ const { depth } = this.project(xCenter, stackTotal / 2, zCenter);
36
+ return { d, x0: xCenter - hw, x1: xCenter + hw, z0: zCenter - hd, z1: zCenter + hd, depth };
37
+ }).sort((a, b) => b.depth - a.depth);
38
+
39
+ for (const bar of bars) {
40
+ let yCursor = 0;
41
+ for (let j = 0; j < bar.d.values.length; j++) {
42
+ const segHeight = bar.d.values[j] / stackMax;
43
+ const y0 = yCursor, y1 = yCursor + segHeight;
44
+ yCursor = y1;
45
+ this.drawBox(this.renderer, bar.x0, bar.x1, y0, y1, bar.z0, bar.z1, palette.colorAt(j), toScreen);
46
+ }
47
+ }
48
+
49
+ const maxSegments = Math.max(...data.map(d => d.values.length));
50
+ let legY = by + 10;
51
+ const legX = bx + width - 100;
52
+ for (let j = 0; j < maxSegments; j++) {
53
+ this.renderer.circle(legX + 5, legY, 5, palette.colorAt(j), null, {});
54
+ this.renderer.text(`Series ${j + 1}`, legX + 16, legY + 4, { textAnchor: 'start', fontSize: '11px', fill: '#374151' });
55
+ legY += 18;
56
+ }
57
+ }
58
+ }
@@ -0,0 +1,131 @@
1
+ import { Chart } from '../Chart.js';
2
+ import { ColorPalette } from '../ColorPalette.js';
3
+ import { Legend } from '../Legend.js';
4
+
5
+ /**
6
+ * StreamGraphChart — a stacked area chart with a centered (silhouette) baseline,
7
+ * producing the flowing, river-like shape commonly called a stream graph.
8
+ *
9
+ * Data: Array<{name: string, values: Array<{label: string, value: number}>}>
10
+ * Options:
11
+ * - title, xAxisLabel, yAxisLabel
12
+ * - colors: string[] palette
13
+ * - legend: boolean (default true)
14
+ * - smooth: boolean (default true) — cubic-bezier smoothing between points
15
+ * - tension: number (default 0.5)
16
+ */
17
+ export class StreamGraphChart extends Chart {
18
+ static chartType = 'streamGraph';
19
+
20
+ /** Build a smooth closed area path from top points then bottom points (reversed). */
21
+ static areaPath(topPts, bottomPts, smooth = true, tension = 0.5) {
22
+ if (topPts.length === 0) return '';
23
+ if (!smooth || topPts.length < 3) {
24
+ return 'M' + topPts.map(p => `${p.x},${p.y}`).join(' L')
25
+ + ' L' + [...bottomPts].reverse().map(p => `${p.x},${p.y}`).join(' L') + ' Z';
26
+ }
27
+
28
+ const line = (pts) => {
29
+ let d = `M${pts[0].x},${pts[0].y}`;
30
+ for (let i = 0; i < pts.length - 1; i++) {
31
+ const p0 = pts[Math.max(0, i - 1)];
32
+ const p1 = pts[i];
33
+ const p2 = pts[i + 1];
34
+ const p3 = pts[Math.min(pts.length - 1, i + 2)];
35
+ const cp1x = p1.x + (p2.x - p0.x) * (tension / 6);
36
+ const cp1y = p1.y + (p2.y - p0.y) * (tension / 6);
37
+ const cp2x = p2.x - (p3.x - p1.x) * (tension / 6);
38
+ const cp2y = p2.y - (p3.y - p1.y) * (tension / 6);
39
+ d += ` C${cp1x},${cp1y} ${cp2x},${cp2y} ${p2.x},${p2.y}`;
40
+ }
41
+ return d;
42
+ };
43
+
44
+ return line(topPts) + ' L' + [...bottomPts].reverse().map(p => `${p.x},${p.y}`).join(' L') + ' Z';
45
+ }
46
+
47
+ _render() {
48
+ const data = this.data || [];
49
+ const options = this.options || {};
50
+ const box = this.renderer?.width
51
+ ? { x: 60, y: 40, width: this.renderer.width - 100, height: this.renderer.height - 100 }
52
+ : { x: 60, y: 40, width: 700, height: 300 };
53
+
54
+ const {
55
+ x = box.x, y = box.y, width = box.width, height = box.height,
56
+ colors, title, xAxisLabel, yAxisLabel, legend: showLegend = true,
57
+ smooth = true, tension = 0.5,
58
+ } = options;
59
+
60
+ const isMultiline = Array.isArray(data[0]?.values);
61
+ const series = isMultiline ? data : [{ name: 'default', values: data }];
62
+ const pointCount = series[0]?.values?.length ?? 0;
63
+ if (pointCount === 0) return;
64
+
65
+ const pointMargin = pointCount > 1 ? width / (pointCount - 1) : width;
66
+ const palette = new ColorPalette(colors);
67
+ const textAnchor = this.renderer.centerTextAnchor;
68
+
69
+ // Compute totals per point and max extent for scaling.
70
+ const totals = new Array(pointCount).fill(0);
71
+ series.forEach(s => {
72
+ s.values.forEach((d, i) => { totals[i] += d.value; });
73
+ });
74
+ const maxExtent = Math.max(...totals.map(v => Math.abs(v))) || 1;
75
+
76
+ // Centered (silhouette) baseline: each layer floats so the stack is
77
+ // vertically centered at every x-position.
78
+ const bands = series.map(() => new Array(pointCount));
79
+ for (let i = 0; i < pointCount; i++) {
80
+ const total = totals[i];
81
+ let y0 = -total / 2;
82
+ series.forEach((s, si) => {
83
+ const v = s.values[i].value;
84
+ bands[si][i] = { y0, y1: y0 + v };
85
+ y0 += v;
86
+ });
87
+ }
88
+
89
+ // Title / labels.
90
+ if (title) {
91
+ this.renderer.text(title, x + width / 2, y - 16, { textAnchor: 'middle', fontSize: '18px', fill: '#333' });
92
+ }
93
+ if (xAxisLabel) {
94
+ this.renderer.text(xAxisLabel, x + width / 2, y + height + 36, { textAnchor: 'middle', fontSize: '12px', fill: '#666' });
95
+ }
96
+ if (yAxisLabel) {
97
+ this.renderer.text(yAxisLabel, y + height / 2, x - 45, { textAnchor: 'middle', fontSize: '12px', fill: '#666', transform: 'rotate(-90,' + (x - 45) + ',' + (y + height / 2) + ')' });
98
+ }
99
+
100
+ const toY = (v) => y + height / 2 - (v / maxExtent) * (height / 2);
101
+
102
+ // Draw layers bottom-up so overlaps look correct.
103
+ series.forEach((s, si) => {
104
+ const color = palette.colorAt(si);
105
+ const topPts = bands[si].map((b, i) => ({ x: x + i * pointMargin, y: toY(b.y1) }));
106
+ const bottomPts = bands[si].map((b, i) => ({ x: x + i * pointMargin, y: toY(b.y0) }));
107
+ const path = StreamGraphChart.areaPath(topPts, bottomPts, smooth, tension);
108
+ const { r, g, b: bl } = palette.hexToRgb(color);
109
+ this.renderer.path(path, `rgba(${r},${g},${bl},0.75)`, { color: color, width: 1 }, { tooltip: s.name });
110
+ });
111
+
112
+ // X-axis labels.
113
+ series[0].values.forEach((d, i) => {
114
+ this.renderer.text(d.label, x + i * pointMargin, y + height + 16, { textAnchor, fontSize: '10px', fill: '#666' });
115
+ });
116
+
117
+ // Center zero line.
118
+ this.renderer.path(`M${x},${y + height / 2} L${x + width},${y + height / 2}`, 'none', { color: '#ccc', width: 1, dasharray: '4 3' });
119
+
120
+ // Baseline axes.
121
+ this.renderer.path(`M${x},${y} L${x},${y + height} L${x + width},${y + height}`, 'none', { color: '#999', width: 1 });
122
+
123
+ if (isMultiline && showLegend) {
124
+ const legendItems = series.map((s, i) => ({ label: s.name, color: palette.colorAt(i) }));
125
+ new Legend({
126
+ items: legendItems, x: x + width + 20, y,
127
+ itemHeight: 20, markerSize: 12,
128
+ }).draw(this.renderer);
129
+ }
130
+ }
131
+ }
@@ -0,0 +1,57 @@
1
+ import { ShapePaths } from '../ShapePaths.js';
2
+ import { Hierarchy } from '../Hierarchy.js';
3
+ import { HierarchyChart } from './HierarchyChart.js';
4
+
5
+ /**
6
+ * SunburstChart — the same hierarchical composition a treemap shows as nested
7
+ * rectangles, drawn instead as nested rings (one ring per depth), each ring's
8
+ * arcs sized by value like a pie chart.
9
+ */
10
+ export class SunburstChart extends HierarchyChart {
11
+ static chartType = 'sunburst';
12
+
13
+ _render() {
14
+ const data = this.data;
15
+ const options = this.options;
16
+ const w = this.renderer?.width ?? 640;
17
+ const h = this.renderer?.height ?? 400;
18
+ const {
19
+ cx = w / 2, cy = h / 2 + 10,
20
+ radius = Math.min(w, h) / 2 - 60,
21
+ innerRadiusRatio = 0,
22
+ title,
23
+ } = options;
24
+
25
+ if (title) {
26
+ this.renderer.text(title, cx, cy - radius - 20, { textAnchor: 'middle', fontSize: '18px', fill: '#333' });
27
+ }
28
+
29
+ const maxDepth = Math.max(1, ...data.map(n => Hierarchy.depth(n)));
30
+ const innerHole = radius * innerRadiusRatio;
31
+ const ringWidth = (radius - innerHole) / maxDepth;
32
+ const layout = Hierarchy.sunburstLayout(data, cx, cy, innerHole, ringWidth, -Math.PI / 2, -Math.PI / 2 + Math.PI * 2);
33
+
34
+ layout.forEach(entry => {
35
+ const { node, cx: ecx, cy: ecy, rInner, rOuter, startAngle, endAngle, depth, topAncestor } = entry;
36
+ const color = this._colorForNode(topAncestor, depth);
37
+ const textColor = this._textColorForNode(topAncestor, depth);
38
+
39
+ const path = ShapePaths.donutSlicePath(ecx, ecy, rOuter, rInner, startAngle, endAngle);
40
+ this.renderer.path(path, color, { color: '#fff', width: 1 }, {
41
+ tooltip: `${node.label}: ${this._formatNodeValue(node)}`,
42
+ });
43
+
44
+ if (endAngle - startAngle > 0.35) {
45
+ const midAngle = (startAngle + endAngle) / 2;
46
+ const midR = (rInner + rOuter) / 2;
47
+ const labelX = ecx + midR * Math.cos(midAngle);
48
+ const labelY = ecy + midR * Math.sin(midAngle);
49
+ const upright = Math.cos(midAngle) >= 0;
50
+ const rotation = upright ? midAngle : midAngle + Math.PI;
51
+ this.renderer.text(node.label, labelX, labelY, {
52
+ textAnchor: 'middle', verticalAlign: 'middle', fontSize: '9px', fill: textColor, rotation, 'pointer-events': 'none',
53
+ });
54
+ }
55
+ });
56
+ }
57
+ }
@@ -0,0 +1,54 @@
1
+ import { ChartBox, ChartLabels } from '../ChartBox.js';
2
+ import { Hierarchy } from '../Hierarchy.js';
3
+ import { HierarchyChart } from './HierarchyChart.js';
4
+
5
+ /**
6
+ * TreemapChart — rectangles nested/sized proportional to value (squarified
7
+ * layout), the standard chart for "composition of a whole across a hierarchy".
8
+ */
9
+ export class TreemapChart extends HierarchyChart {
10
+ static chartType = 'treemap';
11
+
12
+ _render() {
13
+ const data = this.data;
14
+ const options = this.options;
15
+ const box = ChartBox.fromRenderer(this.renderer);
16
+ const { x = box.x, y = box.y, width = box.width, height = box.height, title } = options;
17
+ const plotBox = { x, y, width, height };
18
+
19
+ new ChartLabels({ title }).draw(this.renderer, plotBox);
20
+
21
+ const layout = Hierarchy.treemapLayout(data, x, y, width, height, 0, null, TreemapChart.HEADER_H);
22
+ const textAnchor = this.renderer.centerTextAnchor;
23
+
24
+ layout.forEach(entry => {
25
+ const { node, x: rx, y: ry, width: rw, height: rh, depth, isLeaf, topAncestor } = entry;
26
+ const color = this._colorForNode(topAncestor, depth);
27
+ const textColor = this._textColorForNode(topAncestor, depth);
28
+
29
+ if (isLeaf) {
30
+ this.renderer.rect(rx, ry, Math.max(0, rw), Math.max(0, rh), color, { color: '#fff', width: 1 }, {
31
+ tooltip: `${node.label}: ${this._formatNodeValue(node)}`,
32
+ });
33
+ if (rw > 30 && rh > 14) {
34
+ this.renderer.text(node.label, rx + rw / 2, ry + rh / 2, {
35
+ textAnchor, verticalAlign: 'middle', fontSize: '10px', fill: textColor, 'pointer-events': 'none',
36
+ });
37
+ }
38
+ } else {
39
+ const headerH = Math.min(rh, TreemapChart.HEADER_H);
40
+ this.renderer.rect(rx, ry, Math.max(0, rw), Math.max(0, rh), 'rgba(0,0,0,0.03)', { color: '#ddd', width: 1 });
41
+ this.renderer.rect(rx, ry, Math.max(0, rw), headerH, color, null, {
42
+ tooltip: `${node.label}: ${this._formatNodeValue(node)}`,
43
+ });
44
+ if (rw > 30) {
45
+ this.renderer.text(node.label, rx + 4, ry + headerH / 2, {
46
+ textAnchor: 'start', verticalAlign: 'middle', fontSize: '9px', fontWeight: 'bold', fill: textColor, 'pointer-events': 'none',
47
+ });
48
+ }
49
+ }
50
+ });
51
+ }
52
+ }
53
+
54
+ TreemapChart.HEADER_H = 16;
@@ -0,0 +1,37 @@
1
+ import { Statistics } from '../Statistics.js';
2
+ import { GroupedDistributionChart } from './GroupedDistributionChart.js';
3
+
4
+ /**
5
+ * ViolinChart — one mirrored Gaussian-KDE silhouette per group in its own
6
+ * x-slot, the same per-group layout math as BoxPlotChart (same top-level
7
+ * data shape too). Unlike BoxPlotChart's single flat `boxColor`, each violin
8
+ * gets its own palette color: a violin's shape is visually larger/more
9
+ * prominent than a thin box glyph, so per-group color materially helps
10
+ * distinguish many holdings at a glance. A thin median tick is drawn for
11
+ * reference — no outlier dots, since showing the full distribution shape
12
+ * including tails IS the point of a violin.
13
+ */
14
+ export class ViolinChart extends GroupedDistributionChart {
15
+ static chartType = 'violin';
16
+
17
+ _renderGlyph(cx, slotWidth, i, d) {
18
+ const color = this._palette.colorAt(i);
19
+ const curve = Statistics.kernelDensityEstimate(d.values, { min: this._domain.vMin, max: this._domain.vMax });
20
+ const maxDensity = Math.max(...curve.map(p => p.density)) || 1;
21
+ const halfWidth = slotWidth * 0.4;
22
+
23
+ // Mirrored silhouette: right edge low-to-high value, then left
24
+ // edge high-to-low, closing into one filled path — the
25
+ // standard violin construction.
26
+ const rightPts = curve.map(p => ({ px: cx + (p.density / maxDensity) * halfWidth, py: this._toY(p.x) }));
27
+ const leftPts = curve.map(p => ({ px: cx - (p.density / maxDensity) * halfWidth, py: this._toY(p.x) }));
28
+ const path = 'M' + rightPts.map(p => `${p.px},${p.py}`).join(' L')
29
+ + ' L' + [...leftPts].reverse().map(p => `${p.px},${p.py}`).join(' L') + ' Z';
30
+ this.renderer.path(path, color, { color: '#333', width: 1 }, {
31
+ tooltip: `${d.label}: n=${d.values.length}`,
32
+ });
33
+
34
+ const median = Statistics.quantile([...d.values].sort((a, b) => a - b), 0.5);
35
+ this.renderer.path(`M${cx - halfWidth},${this._toY(median)} L${cx + halfWidth},${this._toY(median)}`, 'none', { color: '#fff', width: 2 });
36
+ }
37
+ }
@@ -0,0 +1,66 @@
1
+ import { Chart } from '../Chart.js';
2
+ import { ChartBox, ChartLabels } from '../ChartBox.js';
3
+ import { Axis } from '../Axis.js';
4
+
5
+ /**
6
+ * WaterfallChart — running-total bars, each floating from the previous
7
+ * cumulative value to the new one (a "delta" bar), except entries marked
8
+ * `type:'total'` which draw full-height from zero.
9
+ */
10
+ export class WaterfallChart extends Chart {
11
+ static chartType = 'waterfall';
12
+
13
+ _render() {
14
+ const data = this.data;
15
+ const options = this.options;
16
+ const box = ChartBox.fromRenderer(this.renderer);
17
+ const {
18
+ x = box.x, y = box.y, width = box.width, height = box.height,
19
+ upColor = '#26a69a', downColor = '#ef5350', totalColor = '#5470c6',
20
+ title, xAxisLabel, yAxisLabel,
21
+ } = options;
22
+ const plotBox = { x, y, width, height };
23
+
24
+ let running = 0;
25
+ const bands = data.map(d => {
26
+ if (d.type === 'total') {
27
+ const band = { from: 0, to: d.value, isTotal: true };
28
+ running = d.value;
29
+ return band;
30
+ }
31
+ const from = running;
32
+ running += d.value;
33
+ return { from, to: running, isTotal: false };
34
+ });
35
+ const allVals = bands.flatMap(b => [b.from, b.to]);
36
+ const vMax = Math.max(0, ...allVals);
37
+ const vMin = Math.min(0, ...allVals);
38
+ const range = (vMax - vMin) || 1;
39
+ const toY = (v) => y + height - ((v - vMin) / range) * height;
40
+ const barWidth = width / data.length * 0.7;
41
+ const barMargin = width / data.length * 0.3;
42
+ const textAnchor = this.renderer.centerTextAnchor;
43
+
44
+ new ChartLabels({ title, xAxisLabel, yAxisLabel }).draw(this.renderer, plotBox);
45
+ this.renderer.path(`M${x},${toY(0)} L${x + width},${toY(0)}`, 'none', { color: '#ccc', width: 1 });
46
+ this.renderer.path(`M${x},${y} L${x},${y + height}`, 'none', { color: 'black', width: 1 });
47
+
48
+ for (let i = 0; i < bands.length - 1; i++) {
49
+ const barX = x + i * (barWidth + barMargin);
50
+ const nextX = barX + barWidth + barMargin;
51
+ this.renderer.path(`M${barX + barWidth},${toY(bands[i].to)} L${nextX},${toY(bands[i].to)}`, 'none', { color: '#bbb', width: 1 });
52
+ }
53
+
54
+ data.forEach((d, i) => {
55
+ const band = bands[i];
56
+ const barX = x + i * (barWidth + barMargin);
57
+ const top = toY(Math.max(band.from, band.to));
58
+ const bottom = toY(Math.min(band.from, band.to));
59
+ const color = band.isTotal ? totalColor : (band.to >= band.from ? upColor : downColor);
60
+ this.renderer.rect(barX, top, barWidth, Math.max(1, bottom - top), color, null, {
61
+ tooltip: `${d.label}: ${band.isTotal ? band.to : (d.value >= 0 ? '+' : '') + d.value} (total: ${Axis.formatValue(band.to)})`,
62
+ });
63
+ this.renderer.text(d.label, barX + barWidth / 2, y + height + 20, { textAnchor, fontSize: '10px' });
64
+ });
65
+ }
66
+ }
@@ -0,0 +1,104 @@
1
+ import { Chart } from '../Chart.js';
2
+ import { ColorPalette } from '../ColorPalette.js';
3
+
4
+ /**
5
+ * WordCloudChart — words sized by value and laid out with a simple spiral
6
+ * placement that avoids overlaps.
7
+ *
8
+ * Data: Array<{text: string, value: number}>
9
+ * Options:
10
+ * - title
11
+ * - colors: string[] palette
12
+ * - minFontSize, maxFontSize
13
+ * - fontFamily
14
+ * - padding: extra space around each word for collision detection
15
+ */
16
+ export class WordCloudChart extends Chart {
17
+ static chartType = 'wordCloud';
18
+
19
+ static estimateBox(text, fontSize) {
20
+ // Approximate width: each glyph ~0.55em; height ~1.1em.
21
+ const w = text.length * fontSize * 0.55;
22
+ const h = fontSize * 1.1;
23
+ return { w, h };
24
+ }
25
+
26
+ _render() {
27
+ const data = this.data || [];
28
+ const options = this.options || {};
29
+ const w = this.renderer?.width ?? 800;
30
+ const h = this.renderer?.height ?? 400;
31
+
32
+ const {
33
+ x = 40, y = 40,
34
+ width = w - x - 40,
35
+ height = h - y - 60,
36
+ title,
37
+ colors,
38
+ minFontSize = 12,
39
+ maxFontSize = 48,
40
+ fontFamily = 'sans-serif',
41
+ padding = 4,
42
+ } = options;
43
+
44
+ const palette = new ColorPalette(colors);
45
+ const textAnchor = this.renderer.centerTextAnchor;
46
+ const sorted = [...data].filter(d => d.text && d.value > 0).sort((a, b) => b.value - a.value);
47
+ if (sorted.length === 0) return;
48
+
49
+ const maxValue = sorted[0].value;
50
+ const minValue = Math.max(1, sorted[sorted.length - 1].value);
51
+ const valueRange = Math.max(1, maxValue - minValue);
52
+ const scale = (v) => minFontSize + ((v - minValue) / valueRange) * (maxFontSize - minFontSize);
53
+
54
+ const cx = x + width / 2;
55
+ const cy = y + height / 2;
56
+ const placed = [];
57
+
58
+ if (title) {
59
+ this.renderer.text(title, x + width / 2, y - 10, { textAnchor: 'middle', fontSize: '18px', fill: '#333' });
60
+ }
61
+
62
+ sorted.forEach((d, i) => {
63
+ const fontSize = scale(d.value);
64
+ const box = WordCloudChart.estimateBox(d.text, fontSize);
65
+ const pos = this._findPosition(cx, cy, box.w, box.h, placed, padding, width, height);
66
+ if (!pos) return; // Could not place; skip.
67
+ placed.push({ x: pos.x, y: pos.y, w: box.w, h: box.h });
68
+ const color = palette.colorAt(i);
69
+ this.renderer.text(d.text, pos.x, pos.y + fontSize * 0.35, {
70
+ textAnchor, fontSize: `${fontSize}px`, fill: color, fontFamily,
71
+ tooltip: `${d.text}: ${d.value}`,
72
+ });
73
+ });
74
+ }
75
+
76
+ _findPosition(cx, cy, w, h, placed, padding, maxW, maxH) {
77
+ const bounds = { x: cx - maxW / 2, y: cy - maxH / 2, w: maxW, h: maxH };
78
+ // Try center first.
79
+ const candidates = [{ x: cx, y: cy }];
80
+ // Spiral outward.
81
+ const a = 5; // spiral tightness
82
+ for (let t = 0; t < 2000; t += 0.5) {
83
+ const r = a * t;
84
+ const px = cx + r * Math.cos(t);
85
+ const py = cy + r * Math.sin(t);
86
+ candidates.push({ x: px, y: py });
87
+ }
88
+
89
+ for (const p of candidates) {
90
+ const rect = { x: p.x - w / 2 - padding, y: p.y - h / 2 - padding, w: w + padding * 2, h: h + padding * 2 };
91
+ if (rect.x < bounds.x || rect.y < bounds.y || rect.x + rect.w > bounds.x + bounds.w || rect.y + rect.h > bounds.y + bounds.h) {
92
+ continue;
93
+ }
94
+ if (!placed.some(other => this._overlap(rect, other))) {
95
+ return p;
96
+ }
97
+ }
98
+ return null;
99
+ }
100
+
101
+ _overlap(a, b) {
102
+ return a.x < b.x + b.w && a.x + a.w > b.x && a.y < b.y + b.h && a.y + a.h > b.y;
103
+ }
104
+ }
@@ -0,0 +1,33 @@
1
+ import { Command } from '../CommandHistory.js';
2
+
3
+ /**
4
+ * AddViewCommand — a view added to a model (new, duplicated, generated, a
5
+ * canvas or template), last in order and, with `current`, shown. Undo takes
6
+ * it away and shows the view that was in front.
7
+ */
8
+ export class AddViewCommand extends Command {
9
+ /** A view added or removed is no edit on a view: undoing it shows no other. */
10
+ viewId = null;
11
+
12
+ /**
13
+ * @param {ViewSetModel} model
14
+ * @param {Object} view
15
+ * @param {{current?: boolean, label?: string}} [options]
16
+ */
17
+ constructor(model, view, { current = true, label = `Add "${view.title || view.name || view.id}"` } = {}) {
18
+ super(label);
19
+ this.model = model;
20
+ this.view = view;
21
+ this.current = current;
22
+ this._before = null;
23
+ }
24
+
25
+ execute() {
26
+ this._before = this.model.currentViewId;
27
+ this.model._insertView(this.view, { current: this.current });
28
+ }
29
+
30
+ undo() {
31
+ this.model._removeView(this.view.id, { next: this._before });
32
+ }
33
+ }
@@ -0,0 +1,39 @@
1
+ import { DiagramView } from './DiagramView.js';
2
+ import { ViewSetModel } from './ViewSetModel.js';
3
+ import { DiagramModelSearch } from './DiagramModelSearch.js';
4
+
5
+ /**
6
+ * DiagramModel — the template editor's diagrams (views) edited together: the
7
+ * palette category shared by all of them and model-level line style defaults.
8
+ * Creating, duplicating, renaming, deleting and switching views come from
9
+ * ViewSetModel.
10
+ */
11
+ export class DiagramModel extends ViewSetModel {
12
+ /**
13
+ * @param {Object} [options]
14
+ * @param {string} [options.templateType] - Palette category shared by every view
15
+ * @param {Object} [options.edgeStyle] - Model-level line style defaults
16
+ * @param {Object} [options.historyOptions] - CommandHistory options for each view (e.g. onChange)
17
+ * @param {string} [options.name] - What the model is called
18
+ */
19
+ constructor({ templateType = 'generic', edgeStyle = {}, historyOptions = {}, name = '' } = {}) {
20
+ super({ idPrefix: 'view', viewNoun: 'Diagram' });
21
+ this.name = name;
22
+ this.templateType = templateType;
23
+ this.edgeStyle = edgeStyle;
24
+ this.historyOptions = historyOptions;
25
+ }
26
+
27
+ _newView(id, title) {
28
+ return new DiagramView({ id, title, historyOptions: this.historyOptions });
29
+ }
30
+
31
+ /** Find and replace: the views, their shapes' names and lines' labels (DiagramModelSearch). */
32
+ search() {
33
+ return new DiagramModelSearch(this);
34
+ }
35
+
36
+ setTemplateType(templateType) {
37
+ this.templateType = templateType;
38
+ }
39
+ }
@@ -0,0 +1,22 @@
1
+ import { ModelSearch } from './ModelSearch.js';
2
+
3
+ /**
4
+ * DiagramModelSearch — find and replace in the template editor's diagrams: on
5
+ * top of the model and views (ModelSearch), each shape's name and each line's
6
+ * label, which belong to their view.
7
+ */
8
+ export class DiagramModelSearch extends ModelSearch {
9
+ viewItemTargets(view) {
10
+ const shapes = [...(view.templates?.values() ?? [])].map(t => ({
11
+ kind: 'shape', id: t.id, viewId: view.id, owner: t.name || t.id, field: 'name', fieldLabel: 'Name',
12
+ read: () => t.name ?? '',
13
+ write: (text) => { t.name = text; },
14
+ }));
15
+ const lines = [...(view.edges?.values() ?? [])].filter(e => e.label).map(e => ({
16
+ kind: 'line', id: e.id, viewId: view.id, owner: e.label, field: 'name', fieldLabel: 'Label',
17
+ read: () => e.label ?? '',
18
+ write: (text) => { e.label = text; },
19
+ }));
20
+ return [...shapes, ...lines];
21
+ }
22
+ }
@@ -0,0 +1,50 @@
1
+ import { DiagramEditorState } from '../DiagramEditorState.js';
2
+
3
+ /**
4
+ * DiagramView — one diagram (tab) of a DiagramModel: its shapes, lines,
5
+ * diagram-level line style and its own undo history (from DiagramEditorState).
6
+ *
7
+ * A DiagramEditor is bound directly to `templates`/`edges`, so edits land here
8
+ * with nothing to save back, and the history survives the editor being rebuilt.
9
+ */
10
+ export class DiagramView extends DiagramEditorState {
11
+ /**
12
+ * @param {Object} options
13
+ * @param {string} options.id
14
+ * @param {string} options.title
15
+ * @param {Map<string, Template>} [options.templates]
16
+ * @param {Map<string, Edge>} [options.edges]
17
+ * @param {Object} [options.edgeStyle] - Diagram-level line style defaults
18
+ * @param {Object} [options.historyOptions] - Passed to CommandHistory (e.g. onChange)
19
+ * @param {string} [options.documentation]
20
+ */
21
+ constructor({ id, title, templates = new Map(), edges = new Map(), edgeStyle = {}, historyOptions = {}, documentation = undefined, arrangement = null }) {
22
+ super({ historyOptions, arrangement });
23
+ this.historyOptions = historyOptions;
24
+ this.id = id;
25
+ this.title = title;
26
+ this.documentation = documentation;
27
+ this.templates = templates;
28
+ this.edges = edges;
29
+ this.edgeStyle = edgeStyle;
30
+ }
31
+
32
+ /** The shapes are what stack. */
33
+ layerItems() {
34
+ return [...this.templates.values()];
35
+ }
36
+
37
+ /** An independent copy: shapes, lines, style and documentation are copied; history starts empty (same options). */
38
+ copy(id, title, historyOptions = this.historyOptions) {
39
+ return new DiagramView({
40
+ id,
41
+ title,
42
+ templates: new Map([...this.templates].map(([tid, t]) => [tid, new t.constructor(tid, t.name, t.serialize())])),
43
+ edges: new Map([...this.edges].map(([eid, e]) => [eid, e.clone()])),
44
+ edgeStyle: { ...this.edgeStyle },
45
+ documentation: this.documentation,
46
+ historyOptions,
47
+ arrangement: this.arrangement.copy(), // template ids are kept
48
+ });
49
+ }
50
+ }