@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,134 @@
1
+ /**
2
+ * ArchimateSpecializationSelector — OO abstraction for building specialization
3
+ * selector UI with type-based filtering and icon display.
4
+ *
5
+ * Responsibilities:
6
+ * - Filter specializations by element type (baseTypes)
7
+ * - Build HTML with icons and descriptions
8
+ * - Wire type-change callbacks to reset selection
9
+ */
10
+
11
+ export class ArchimateSpecializationSelector {
12
+ constructor(registry, { doc = document } = {}) {
13
+ this.registry = registry;
14
+ this.doc = doc;
15
+ }
16
+
17
+ /**
18
+ * Get specializations allowed for a given type.
19
+ * If baseTypes is empty [], the specialization applies to any type.
20
+ */
21
+ allowedFor(elementType) {
22
+ if (!elementType) return [];
23
+ return this.registry.list().filter(spec => {
24
+ // Empty baseTypes = applies to all
25
+ if (spec.baseTypes.length === 0) return true;
26
+ return spec.baseTypes.includes(elementType);
27
+ });
28
+ }
29
+
30
+ /**
31
+ * Build a <select> element for specialization picker.
32
+ * @param {Object} opts
33
+ * @param {string} opts.value - current specialization id/name
34
+ * @param {string} opts.elementType - current element type (for filtering)
35
+ * @param {Function} opts.onTypeChange - callback when type changes (should reset specialization)
36
+ * @returns {HTMLSelectElement}
37
+ */
38
+ buildSelect({ value = '', elementType = null, onTypeChange = () => {} } = {}) {
39
+ const select = this.doc.createElement('select');
40
+ select.style.cssText = 'flex:1 1 auto; padding:3px 6px; border:1px solid #ccc; border-radius:3px; background:#fff; color:#222;';
41
+
42
+ // Track current type so we can detect changes
43
+ let currentType = elementType;
44
+
45
+ // Callback to rebuild when type changes (for external type inputs)
46
+ const onTypeChangedExternally = (newType) => {
47
+ if (newType !== currentType) {
48
+ currentType = newType;
49
+ // Reset selection when type changes
50
+ select.value = '';
51
+ // Rebuild options for new type
52
+ this._rebuildOptions(select, newType);
53
+ onTypeChange(newType);
54
+ }
55
+ };
56
+
57
+ // Expose callback for caller to wire up
58
+ select._onTypeChanged = onTypeChangedExternally;
59
+
60
+ // Build initial options
61
+ this._rebuildOptions(select, elementType, value);
62
+
63
+ return select;
64
+ }
65
+
66
+ /**
67
+ * Rebuild options in a select element based on element type.
68
+ * @private
69
+ */
70
+ _rebuildOptions(select, elementType, value = '') {
71
+ select.innerHTML = '';
72
+
73
+ // Empty option
74
+ const emptyOpt = this.doc.createElement('option');
75
+ emptyOpt.value = '';
76
+ emptyOpt.textContent = '(none)';
77
+ select.appendChild(emptyOpt);
78
+
79
+ // Allowed specializations for this type
80
+ const allowed = this.allowedFor(elementType);
81
+ for (const spec of allowed) {
82
+ const opt = this.doc.createElement('option');
83
+ opt.value = spec.id;
84
+ const label = spec.icon ? `${spec.icon} ${spec.name}` : spec.name;
85
+ opt.textContent = label;
86
+ opt.title = spec.description || '';
87
+ select.appendChild(opt);
88
+ }
89
+
90
+ // Restore previous value if it's still valid
91
+ if (value) {
92
+ const selected = allowed.find(s => s.id === value || s.name === value);
93
+ select.value = selected?.id ?? '';
94
+ }
95
+ }
96
+
97
+ /**
98
+ * Build a <datalist> of specialization names (for autocomplete).
99
+ * @param {string} elementType - filter to this type
100
+ * @returns {HTMLDatalistElement}
101
+ */
102
+ buildDatalist({ elementType = null } = {}) {
103
+ const datalist = this.doc.createElement('datalist');
104
+ const allowed = this.allowedFor(elementType);
105
+ for (const spec of allowed) {
106
+ datalist.appendChild(new Option(spec.name));
107
+ }
108
+ return datalist;
109
+ }
110
+
111
+ /**
112
+ * Build a reference description/help text for a specialization.
113
+ * Shows icon, color, description, base types.
114
+ * @param {string} idOrName - specialization id or name
115
+ * @returns {HTMLElement} - a div with formatted content
116
+ */
117
+ buildHelp(idOrName) {
118
+ const div = this.doc.createElement('div');
119
+ const spec = this.registry.resolve(idOrName);
120
+
121
+ if (!spec) {
122
+ div.innerHTML = `<strong>${idOrName || '(none)'}</strong><p style="margin:4px 0 0;">Not a registered specialization. Use the <strong>Specializations…</strong> button to define it.</p>`;
123
+ return div;
124
+ }
125
+
126
+ const bases = spec.baseTypes.length ? spec.baseTypes.join(', ') : 'any type';
127
+ const icon = spec.icon ? ` <span style="font-size:18px;">${spec.icon}</span>` : '';
128
+ const color = spec.color ? ` &middot; <strong>Colour:</strong> <span style="display:inline-block; width:16px; height:16px; background:${spec.color}; border:1px solid #ccc; border-radius:2px; vertical-align:middle;"></span>` : '';
129
+
130
+ div.innerHTML = `<strong>${spec.name}${icon}</strong><p style="margin:4px 0 0;">${spec.description || 'User-defined specialization.'}</p><p style="margin:4px 0 0; color:#666;"><strong>Base types:</strong> ${bases}${color}</p>`;
131
+
132
+ return div;
133
+ }
134
+ }
@@ -0,0 +1,68 @@
1
+ /**
2
+ * Axis — reusable cartesian-axis drawing.
3
+ *
4
+ * Currently focused on the numeric y-axis used by most 2D charts. The
5
+ * tick-layout math (`niceTicks`, `formatValue`) is static and DOM-free.
6
+ */
7
+ export class Axis {
8
+ /**
9
+ * Compute evenly-spaced "nice" ticks that cover at least `maxVal`.
10
+ * @param {number} maxVal
11
+ * @param {number} [count=4] desired number of intervals
12
+ * @returns {number[]}
13
+ */
14
+ static niceTicks(maxVal, count = 4) {
15
+ if (!maxVal || maxVal <= 0) return [0];
16
+ const raw = maxVal / count;
17
+ const mag = Math.pow(10, Math.floor(Math.log10(raw)));
18
+ const frac = raw / mag;
19
+ const step = frac < 1.5 ? mag : frac < 3.5 ? 2 * mag : frac < 7.5 ? 5 * mag : 10 * mag;
20
+ const yMax = Math.ceil(maxVal / step) * step;
21
+ const ticks = [];
22
+ let v = 0;
23
+ while (v <= yMax + step * 1e-9) {
24
+ ticks.push(parseFloat(v.toFixed(10)));
25
+ v += step;
26
+ }
27
+ return ticks;
28
+ }
29
+
30
+ /**
31
+ * Format a numeric value for axis labels (k/M suffixes, fixed decimals).
32
+ * @param {number} v
33
+ * @returns {string}
34
+ */
35
+ static formatValue(v) {
36
+ if (v === 0) return '0';
37
+ if (Math.abs(v) >= 1e6) return (v / 1e6).toFixed(2) + 'M';
38
+ if (Math.abs(v) >= 1e3) return (v / 1e3).toFixed(2) + 'k';
39
+ if (Math.abs(v) >= 100) return v.toFixed(0);
40
+ if (Math.abs(v) >= 10) return v.toFixed(1);
41
+ if (Math.abs(v) >= 1) return v.toFixed(2);
42
+ return v.toPrecision(2);
43
+ }
44
+
45
+ /**
46
+ * Draw numeric y-axis tick marks, value labels, and horizontal gridlines.
47
+ *
48
+ * @param {*} renderer a renderer implementing .path() and .text()
49
+ * @param {{x:number, y:number, width:number, height:number}} box plot-area box
50
+ * @param {number} rawMax the raw (un-rounded) data maximum
51
+ * @returns {number} the nice domain max the ticks actually span
52
+ */
53
+ drawYAxis(renderer, box, rawMax) {
54
+ const ticks = Axis.niceTicks(rawMax);
55
+ const niceMax = ticks[ticks.length - 1] || 1;
56
+ for (const t of ticks) {
57
+ const ty = box.y + box.height - (t / niceMax) * box.height;
58
+ renderer.path(`M${box.x - 5},${ty} L${box.x},${ty}`, 'none', { color: '#999', width: 1 });
59
+ if (t > 0) {
60
+ renderer.path(`M${box.x},${ty} L${box.x + box.width},${ty}`, 'none', { color: '#eee', width: 1 });
61
+ }
62
+ renderer.text(Axis.formatValue(t), box.x - 10, ty, {
63
+ textAnchor: 'end', verticalAlign: 'middle', fontSize: '10px', fill: '#666',
64
+ });
65
+ }
66
+ return niceMax;
67
+ }
68
+ }
@@ -0,0 +1,30 @@
1
+ /**
2
+ * CameraSeeder — shared orbit-camera default state and seeding logic.
3
+ *
4
+ * Used by both Chart3D and Diagram3D so the seedCamera() implementation isn't
5
+ * duplicated across two unrelated inheritance hierarchies.
6
+ */
7
+ export class CameraSeeder {
8
+ constructor(defaults = CameraSeeder.DEFAULTS) {
9
+ this._defaults = defaults;
10
+ }
11
+
12
+ static DEFAULTS = { theta: -0.6, phi: 0.35, distance: 2.2 };
13
+
14
+ /**
15
+ * Ensure `camera` is an object, filling it with defaults if missing.
16
+ * Mutates the target object when one is supplied.
17
+ * @param {{theta?:number, phi?:number, distance?:number}|null} camera
18
+ * @param {{theta?:number, phi?:number, distance?:number}} [defaults]
19
+ * @returns {{theta:number, phi:number, distance:number}}
20
+ */
21
+ seed(camera, defaults = this._defaults) {
22
+ const result = camera || {};
23
+ for (const key of Object.keys(defaults)) {
24
+ if (result[key] == null) {
25
+ result[key] = defaults[key];
26
+ }
27
+ }
28
+ return result;
29
+ }
30
+ }
@@ -0,0 +1,92 @@
1
+ import { FormDialog } from './FormDialog.js';
2
+ import { el } from '../workspace/dom.js';
3
+
4
+ /**
5
+ * CatalogDialog — edit a list of entries a user keeps (specializations,
6
+ * viewpoints, ...): a row per entry with Edit and Delete, and "New …". An
7
+ * entry is edited in its own FormDialog, whose fields, checks and saving the
8
+ * caller gives; the list redraws after each change. Nothing here knows what
9
+ * an entry is.
10
+ */
11
+ export class CatalogDialog {
12
+ /**
13
+ * @param {Object} options
14
+ * @param {string} options.title
15
+ * @param {string} [options.description]
16
+ * @param {string} options.noun - What one entry is called ('specialization')
17
+ * @param {() => Array<Object>} options.items - The entries, as they are now
18
+ * @param {(item) => string} options.label - An entry's row text
19
+ * @param {(item: Object|null) => Array<Object>} options.fields - The form for an entry (null: a new one)
20
+ * @param {(item: Object|null, values: Object) => (string|null|undefined)} [options.validate] - A problem, shown in the form
21
+ * @param {(item: Object|null, values: Object) => void} options.save - Keep a new or edited entry
22
+ * @param {(item: Object) => void} options.remove - Delete an entry
23
+ * @param {() => void} [options.onChange] - After any change
24
+ * @param {Document} [options.document]
25
+ */
26
+ constructor({ title, description = '', noun, items, label, fields, validate = () => null, save, remove, onChange = () => {}, document: doc = globalThis.document }) {
27
+ Object.assign(this, { title, description, noun, items, label, fields, validate, save, remove, onChange, doc });
28
+ this.list = null;
29
+ }
30
+
31
+ /** Show the list. */
32
+ open() {
33
+ this.list = el({ style: { display: 'flex', flexDirection: 'column', gap: '4px', minWidth: '360px' } }, this.doc);
34
+ this.refresh();
35
+ this.dialog = new FormDialog({
36
+ title: this.title,
37
+ description: this.description,
38
+ fields: [{ key: '__catalog', label: '', type: 'custom', element: this.list, read: () => null }],
39
+ submitLabel: 'Done',
40
+ idPrefix: 'catalog-',
41
+ document: this.doc,
42
+ onApply: () => {},
43
+ }).open();
44
+ return this;
45
+ }
46
+
47
+ /** Redraw the rows from `items()`. */
48
+ refresh() {
49
+ if (!this.list) return;
50
+ const button = (text, on, title) => ({ tag: 'button', attrs: { type: 'button', title: title ?? text }, text, style: { padding: '2px 8px', fontSize: '12px' }, on: { click: on } });
51
+ const rows = this.items().map(item => ({
52
+ attrs: { 'data-catalog-entry': this.label(item) },
53
+ style: { display: 'flex', alignItems: 'center', gap: '6px', padding: '3px 0', borderBottom: '1px solid #eee' },
54
+ children: [
55
+ { text: this.label(item), style: { flex: '1 1 auto' } },
56
+ button('Edit…', () => this.edit(item)),
57
+ button('Delete', () => this.delete(item)),
58
+ ],
59
+ }));
60
+ this.list.replaceChildren(
61
+ ...(rows.length ? rows : [{ text: `No ${this.noun}s yet.`, style: { color: '#888', padding: '4px 0' } }]).map(spec => el(spec, this.doc)),
62
+ el({ style: { marginTop: '8px' }, children: [button(`+ New ${this.noun}…`, () => this.edit(null))] }, this.doc),
63
+ );
64
+ }
65
+
66
+ /** Edit an entry (null: a new one) in its own form; saving redraws the list. */
67
+ edit(item) {
68
+ return new FormDialog({
69
+ title: item ? `Edit ${this.noun}: ${this.label(item)}` : `New ${this.noun}`,
70
+ fields: this.fields(item),
71
+ submitLabel: 'Save',
72
+ idPrefix: 'catalog-entry-',
73
+ document: this.doc,
74
+ validate: (values) => this.validate(item, values),
75
+ onApply: (values) => {
76
+ this.save(item, values);
77
+ this.onChange();
78
+ this.refresh();
79
+ },
80
+ }).open();
81
+ }
82
+
83
+ /** Delete an entry, once confirmed. */
84
+ delete(item) {
85
+ const confirm = this.doc?.defaultView?.confirm ?? (() => true);
86
+ if (!confirm(`Delete ${this.noun} "${this.label(item)}"?`)) return false;
87
+ this.remove(item);
88
+ this.onChange();
89
+ this.refresh();
90
+ return true;
91
+ }
92
+ }
@@ -0,0 +1,37 @@
1
+ /**
2
+ * Chart — abstract base class for one chart type.
3
+ *
4
+ * Subclasses implement `_render()` and are instantiated by RenderEngine's
5
+ * chart methods. Keeping each chart in its own class removes the giant
6
+ * RenderEngine God class one chart at a time.
7
+ */
8
+ export class Chart {
9
+ /** Registry key / catalog key for this chart type. Subclasses override. */
10
+ static chartType = null;
11
+
12
+ constructor(renderer, data, options = {}) {
13
+ if (new.target === Chart) {
14
+ throw new TypeError('Chart is abstract — subclass it');
15
+ }
16
+ this.renderer = renderer;
17
+ this.data = data;
18
+ this.options = options;
19
+ }
20
+
21
+ /** Render the chart. Subclasses implement `_render()`. */
22
+ render() {
23
+ if (!this.renderer) return;
24
+ this.renderer.clear();
25
+ this._render();
26
+ }
27
+
28
+ /** Subclasses implement the actual drawing here. */
29
+ _render() {
30
+ throw new Error(`${this.constructor.name} must implement _render()`);
31
+ }
32
+
33
+ /** Optional click handler; subclasses override to respond to hits. */
34
+ onClick(event, hitShape) {
35
+ // no-op by default
36
+ }
37
+ }
@@ -0,0 +1,99 @@
1
+ import { Chart } from './Chart.js';
2
+ import { OrbitCamera } from '../OrbitCamera.js';
3
+ import { ColorPalette } from './ColorPalette.js';
4
+ import { ChartBox } from './ChartBox.js';
5
+ import { CameraSeeder } from './CameraSeeder.js';
6
+
7
+ /**
8
+ * Chart3D — abstract base class for orbit-camera 3D charts.
9
+ *
10
+ * Centralizes camera storage, projection, viewport scaling, and the shared
11
+ * box-drawing helper used by the orbit bar/bubble charts.
12
+ */
13
+ export class Chart3D extends Chart {
14
+ constructor(renderer, data, options = {}, camera = null) {
15
+ if (new.target === Chart3D) {
16
+ throw new TypeError('Chart3D is abstract — subclass it');
17
+ }
18
+ super(renderer, data, options);
19
+ this.camera = camera;
20
+ this._cameraSeeder = new CameraSeeder();
21
+ }
22
+
23
+ /**
24
+ * Seed an orbit-camera state object if one isn't already present.
25
+ * @param {{theta?:number, phi?:number, distance?:number}} defaults
26
+ * @returns {{theta:number, phi:number, distance:number}}
27
+ */
28
+ seedCamera(defaults = CameraSeeder.DEFAULTS) {
29
+ this.camera = this._cameraSeeder.seed(this.camera, defaults);
30
+ return this.camera;
31
+ }
32
+
33
+ /**
34
+ * Project a normalized 3D point through the orbit camera.
35
+ * @returns {{sx:number, sy:number, depth:number, scale:number}}
36
+ */
37
+ project(x, y, z) {
38
+ return new OrbitCamera(this.camera).project({ x, y, z }, 1);
39
+ }
40
+
41
+ /**
42
+ * Compute the viewport center/radius and return a function that maps
43
+ * normalized 3D coordinates to screen coordinates.
44
+ * @returns {{cx:number, cy:number, pixelRadius:number, toScreen:Function, box:ChartBox}}
45
+ */
46
+ _viewport() {
47
+ const box = ChartBox.fromRenderer(this.renderer);
48
+ const { x: bx, y: by, width, height } = box;
49
+ const cx = bx + width / 2;
50
+ const cy = by + height / 2;
51
+ const pixelRadius = Math.min(width, height) / 2 - 30;
52
+ const toScreen = (nx, ny, nz) => {
53
+ const p = this.project(nx, ny, nz);
54
+ return { x: cx + p.sx * pixelRadius, y: cy - p.sy * pixelRadius, depth: p.depth, scale: p.scale };
55
+ };
56
+ return { cx, cy, pixelRadius, toScreen, box };
57
+ }
58
+
59
+ /**
60
+ * Groups flat {x, z, ...} data into grid indices/labels for orbit bar charts.
61
+ * @returns {{xLabels: string[], zLabels: string[], xIndex: Map, zIndex: Map}}
62
+ */
63
+ bucketGrid(data) {
64
+ const xLabels = [], zLabels = [];
65
+ const xIndex = new Map(), zIndex = new Map();
66
+ for (const d of data) {
67
+ if (!xIndex.has(d.x)) { xIndex.set(d.x, xLabels.length); xLabels.push(d.x); }
68
+ if (!zIndex.has(d.z)) { zIndex.set(d.z, zLabels.length); zLabels.push(d.z); }
69
+ }
70
+ return { xLabels, zLabels, xIndex, zIndex };
71
+ }
72
+
73
+ /**
74
+ * Draw one 3D box through the orbit camera. Returns average corner depth.
75
+ */
76
+ drawBox(renderer, x0, x1, y0, y1, z0, z1, color, toScreen) {
77
+ const camera = this.camera;
78
+ const faceXSign = Math.sin(camera.theta) >= 0 ? 1 : -1;
79
+ const faceZSign = Math.cos(camera.theta) >= 0 ? 1 : -1;
80
+ const xf = faceXSign > 0 ? x1 : x0;
81
+ const zf = faceZSign > 0 ? z1 : z0;
82
+
83
+ const c = (x, y, z) => toScreen(x, y, z);
84
+ const top = [c(x0, y1, z0), c(x1, y1, z0), c(x1, y1, z1), c(x0, y1, z1)];
85
+ const xSide = [c(xf, y0, z0), c(xf, y1, z0), c(xf, y1, z1), c(xf, y0, z1)];
86
+ const zSide = [c(x0, y0, zf), c(x1, y0, zf), c(x1, y1, zf), c(x0, y1, zf)];
87
+
88
+ const drawFace = (pts, shade) => {
89
+ const d = `M${pts[0].x},${pts[0].y} L${pts[1].x},${pts[1].y} L${pts[2].x},${pts[2].y} L${pts[3].x},${pts[3].y} Z`;
90
+ renderer.path(d, ColorPalette.lighten(color, shade), { color: '#333', width: 1 });
91
+ };
92
+ drawFace(top, 0.15);
93
+ drawFace(xSide, faceXSign > 0 ? -0.05 : -0.2);
94
+ drawFace(zSide, faceZSign > 0 ? -0.1 : -0.25);
95
+
96
+ const allDepths = [...top, ...xSide, ...zSide].map(p => p.depth);
97
+ return allDepths.reduce((s, d) => s + d, 0) / allDepths.length;
98
+ }
99
+ }
@@ -0,0 +1,80 @@
1
+ /**
2
+ * ChartBox — computes the plot-area box for a cartesian chart.
3
+ *
4
+ * The defaults mirror the historical `_defaultChartBox()` values in
5
+ * RenderEngine so existing charts keep the same layout.
6
+ */
7
+ export class ChartBox {
8
+ /**
9
+ * @param {object} options
10
+ * @param {number} options.width total renderer/container width
11
+ * @param {number} options.height total renderer/container height
12
+ * @param {object} [options.margins]
13
+ * @param {number} [options.margins.left=70]
14
+ * @param {number} [options.margins.top=60]
15
+ * @param {number} [options.margins.right=20]
16
+ * @param {number} [options.margins.bottom=70]
17
+ */
18
+ constructor({ width, height, margins = {} }) {
19
+ const left = margins.left ?? 70;
20
+ const top = margins.top ?? 60;
21
+ const right = margins.right ?? 20;
22
+ const bottom = margins.bottom ?? 70;
23
+ this.x = left;
24
+ this.y = top;
25
+ this.width = Math.max(120, width - left - right);
26
+ this.height = Math.max(80, height - top - bottom);
27
+ }
28
+
29
+ /**
30
+ * Build a ChartBox from a renderer's dimensions.
31
+ * @param {{width:number, height:number}} renderer
32
+ */
33
+ static fromRenderer(renderer, margins) {
34
+ const width = renderer?.width ?? 640;
35
+ const height = renderer?.height ?? 400;
36
+ return new ChartBox({ width, height, margins });
37
+ }
38
+ }
39
+
40
+ /**
41
+ * ChartLabels — draws the title and axis labels that sit outside the
42
+ * plot-area box. Keeping this with ChartBox makes the shared chart-chrome
43
+ * easy to reuse once each chart becomes its own class.
44
+ */
45
+ export class ChartLabels {
46
+ /**
47
+ * @param {object} options
48
+ * @param {string} [options.title]
49
+ * @param {string} [options.xAxisLabel]
50
+ * @param {string} [options.yAxisLabel]
51
+ */
52
+ constructor({ title, xAxisLabel, yAxisLabel }) {
53
+ this.title = title;
54
+ this.xAxisLabel = xAxisLabel;
55
+ this.yAxisLabel = yAxisLabel;
56
+ }
57
+
58
+ /**
59
+ * Draw the labels onto `renderer` relative to `box`.
60
+ * @param {*} renderer
61
+ * @param {{x:number, y:number, width:number, height:number}} box
62
+ */
63
+ draw(renderer, box) {
64
+ if (this.title) {
65
+ renderer.text(this.title, box.x + box.width / 2, box.y - 30, {
66
+ textAnchor: 'middle', fontSize: '18px', fill: '#333',
67
+ });
68
+ }
69
+ if (this.yAxisLabel) {
70
+ renderer.text(this.yAxisLabel, box.x - 40, box.y + box.height / 2, {
71
+ textAnchor: 'middle', rotation: -Math.PI / 2,
72
+ });
73
+ }
74
+ if (this.xAxisLabel) {
75
+ renderer.text(this.xAxisLabel, box.x + box.width / 2, box.y + box.height + 45, {
76
+ textAnchor: 'middle', fontSize: '14px', fill: '#333',
77
+ });
78
+ }
79
+ }
80
+ }
@@ -0,0 +1,27 @@
1
+ import { compileFormula } from '../kernelExpr.js';
2
+
3
+ /**
4
+ * ChartData — small data-access helpers shared by chart subclasses.
5
+ *
6
+ * These used to live on RenderEngine; they are collected here so Chart
7
+ * subclasses can read their own encoding fields without going through the
8
+ * engine façade.
9
+ */
10
+ export class ChartData {
11
+ /** Reads whatever `colorCol` names for one data point — a plain field
12
+ * name (unchanged behavior: `d[colorCol]`), or a compiled
13
+ * `{formula, params}` expression evaluated over the point's own fields
14
+ * (`kernelExpr.js`, the same small grammar sqlengine's compiled UDFs
15
+ * use). Shared by every chart with a `colorCol` option
16
+ * (scatterChart/bubbleChart/bubbleChart3D) so a formula means the same
17
+ * thing wherever it's written, and each distinct value it returns gets
18
+ * its own palette color exactly as a plain field's distinct values
19
+ * already do. */
20
+ static readColorCol(d, colorCol) {
21
+ if (colorCol && typeof colorCol === 'object') {
22
+ colorCol._compiled ??= compileFormula(colorCol.formula, colorCol.params);
23
+ return colorCol._compiled(...colorCol.params.map(p => d[p]));
24
+ }
25
+ return d[colorCol];
26
+ }
27
+ }
@@ -0,0 +1,76 @@
1
+ /**
2
+ * ChartRegistry — object-oriented catalog of supported chart types.
3
+ *
4
+ * Wraps the flat CHART_CATALOG array with register/lookup/list helpers,
5
+ * making the catalog extensible at runtime while preserving the existing
6
+ * export shape for backward compatibility.
7
+ */
8
+ export class ChartRegistry {
9
+ constructor(entries = []) {
10
+ this._entries = entries.slice();
11
+ this._index = new Map(entries.map(e => [e.key, e]));
12
+ }
13
+
14
+ /** Number of registered chart types. */
15
+ get size() {
16
+ return this._entries.length;
17
+ }
18
+
19
+ /** Register a new chart type (or replace an existing one). */
20
+ register(entry) {
21
+ if (!entry || typeof entry.key !== 'string') {
22
+ throw new TypeError('ChartRegistry entry must have a string key');
23
+ }
24
+ if (this._index.has(entry.key)) {
25
+ const i = this._entries.findIndex(e => e.key === entry.key);
26
+ this._entries[i] = entry;
27
+ } else {
28
+ this._entries.push(entry);
29
+ }
30
+ this._index.set(entry.key, entry);
31
+ return this;
32
+ }
33
+
34
+ /** Remove a chart type by key. */
35
+ unregister(key) {
36
+ const i = this._entries.findIndex(e => e.key === key);
37
+ if (i >= 0) this._entries.splice(i, 1);
38
+ this._index.delete(key);
39
+ return this;
40
+ }
41
+
42
+ /** Look up one entry by key. */
43
+ get(key) {
44
+ return this._index.get(key);
45
+ }
46
+
47
+ /** All entries, in registration order. */
48
+ list() {
49
+ return this._entries.slice();
50
+ }
51
+
52
+ /** All entry keys. */
53
+ keys() {
54
+ return this._entries.map(e => e.key);
55
+ }
56
+
57
+ /** All RenderEngine method names used by the registered entries. */
58
+ methods() {
59
+ return this._entries.map(e => e.method);
60
+ }
61
+
62
+ /** Find entries matching a predicate. */
63
+ filter(predicate) {
64
+ return this._entries.filter(predicate);
65
+ }
66
+
67
+ /** Find entries in a given category. */
68
+ byCategory(category) {
69
+ return this._entries.filter(e => e.category === category);
70
+ }
71
+
72
+ /** Whether a key is registered. */
73
+ has(key) {
74
+ return this._index.has(key);
75
+ }
76
+ }