@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,589 @@
1
+ // Copyright 2026 Jaroslav Peter Prib, Purveyor of Excellence
2
+ /**
3
+ * Single source of truth for "what chart types does RenderEngine support" —
4
+ * see ARCHITECTURE.md's "Chart-type catalog" section for the full story.
5
+ *
6
+ * This is not just a flat {key,label} list. Chart types share real,
7
+ * composable capabilities — every one of them takes a title; several accept
8
+ * a legend; several take a customizable color palette while others take a
9
+ * fixed semantic pair (up/down) or a single color; every one has at least
10
+ * one data-driving "axis," but an axis isn't always a spatial position —
11
+ * bubbleChart's `size` is a driving value encoded as a property of the
12
+ * marker object itself (its radius), not a position, and bubbleChart's
13
+ * `colorCol` similarly encodes a *group* as the marker's color rather than
14
+ * a spatial dimension. This file models each chart type as the specific
15
+ * JOINT combination of these reusable pieces (`axes`, `coordSystem`,
16
+ * `legend`, `colorMode`, `camera`) it supports, extracted empirically from
17
+ * every method's real `options` destructure (not aspirational/guessed) —
18
+ * see git history for the audit this came from.
19
+ */
20
+
21
+ // ── Vocabulary — the reusable pieces every chart type composes from ────────
22
+
23
+ /** What kind of value a given axis role expects. */
24
+ export const AXIS_KIND = {
25
+ CATEGORICAL: 'categorical', // a label/group string
26
+ NUMERIC: 'numeric', // a single number
27
+ NUMERIC_LIST: 'numeric-list', // an array of numbers (one chart glyph, several values — e.g. a stacked bar's segments)
28
+ RAW_SAMPLE: 'raw-sample', // a raw numeric array the chart itself aggregates (histogram bins it, boxPlot computes quartiles) — not pre-aggregated by the caller
29
+ };
30
+
31
+ /**
32
+ * WHERE an axis role's value actually shows up visually. Most are a literal
33
+ * screen position (`position-*`); the rest are "axis within object" —
34
+ * exactly the bubble/size case: the value drives a property of the marker
35
+ * shape itself (its size, its width, its color, its depth) rather than
36
+ * where it sits on the chart. A future "sphere/ellipsoid" bubble variant
37
+ * with two independent radii is still just two roles both channeled through
38
+ * `shape-size` — the schema doesn't need to change to describe it, only the
39
+ * catalog entry gains a second `shape-size` role.
40
+ */
41
+ export const ENCODING_CHANNEL = {
42
+ POSITION_X: 'position-x',
43
+ POSITION_Y: 'position-y',
44
+ POSITION_Z: 'position-z',
45
+ POSITION_Y_LENGTH: 'position-y-length', // bar height from a zero baseline
46
+ POSITION_Y_STACKED: 'position-y-stacked', // bar height, one of several segments stacked from a zero baseline
47
+ POSITION_Y_HEIGHT: 'position-y-height', // orbit-3D bar height
48
+ POSITION_Y_DELTA: 'position-y-delta', // waterfall's floating delta bar
49
+ POSITION_ORDER: 'position-order', // funnel/boxPlot-group: sequence matters, not a numeric coordinate
50
+ RADIAL_AXIS: 'radial-axis', // radar: one of N shared spokes
51
+ RADIAL_DISTANCE: 'radial-distance', // radar: distance out along its axis
52
+ ANGLE_OR_AREA: 'angle-or-area', // pie/doughnut slice
53
+ SHAPE_SIZE: 'shape-size', // bubble radius — "axis within object"
54
+ SHAPE_WIDTH: 'shape-width', // pipe line-width / funnel band width — "axis within object"
55
+ SHAPE_DEPTH: 'shape-depth', // barChart3D's isometric depth shadow — "axis within object"
56
+ SHAPE_GLYPH: 'shape-glyph', // candlestick's whole open/high/low/close body+wick is one compound glyph
57
+ COLOR: 'color', // a category mapped to marker/point color — "axis within object"
58
+ COLOR_SCALE: 'color-scale', // a continuous value mapped along a color gradient (heatmap)
59
+ SEMANTIC_COLOR: 'semantic-color', // a fixed meaning (up/down/total), not an arbitrary palette index
60
+ FILL_PERCENT: 'fill-percent', // gauge's single 0-100 fill
61
+ DERIVED: 'derived', // histogram/boxPlot: the chart computes the real visual encoding internally from a raw sample
62
+ TEXT_VALUE: 'text-value', // outlineChart's row count — shown as literal text, not any geometric/color property (a genuinely new "where" — every other channel above drives position/size/color, this one drives displayed text)
63
+ };
64
+
65
+ /** The coordinate system a chart type's `x/y/width/height` (or `cx/cy/r`, or none) options address. */
66
+ export const COORD_SYSTEM = {
67
+ CARTESIAN: 'cartesian', // {x,y,width,height} box
68
+ RADIAL: 'radial', // {cx,cy,radius} or {cx,cy,r} — pie, radar, dialGauge
69
+ ORBIT_3D: 'orbit-3d', // no 2D box at all — a real camera (theta/phi/distance) owns the space
70
+ };
71
+
72
+ /** How a chart type accepts color customization — these are genuinely different contracts, not degrees of the same one. */
73
+ export const COLOR_MODE = {
74
+ PALETTE: 'palette', // string[] indexed by series/category/segment
75
+ SCALE: 'scale', // low→high gradient stops (heatmap's colorScale)
76
+ SEMANTIC: 'semantic', // fixed-meaning named colors (candlestick's upColor/downColor, waterfall's +totalColor)
77
+ SINGLE: 'single', // one color, no per-item variation
78
+ GROUPED_FIELD: 'grouped-field', // colorCol — an actual data column drives color per-point (a group "axis within object"; also has a matching ENCODING_CHANNEL.COLOR axis role)
79
+ NONE: 'none', // no color option at all
80
+ };
81
+
82
+ /** Whether/how a chart type does 3D — these are two unrelated implementations, not degrees of the same feature. */
83
+ export const CAMERA_MODE = {
84
+ NONE: 'none',
85
+ ISOMETRIC: 'isometric', // fixed-angle depth shadow, still 2D mouse interaction (barChart3D, bubbleChart({zAxis:true}))
86
+ ORBIT: 'orbit', // real Mat4/OrbitCamera — drag-to-rotate, wheel-to-zoom (bubbleChart3D, bar/stackedBarChart3DOrbit)
87
+ };
88
+
89
+ // ── The catalog ──────────────────────────────────────────────────────────
90
+
91
+ export const CHART_CATALOG = [
92
+ {
93
+ key: 'bar', label: 'Bar', method: 'barChart', category: '2d',
94
+ coordSystem: COORD_SYSTEM.CARTESIAN, title: true, legend: true, colorMode: COLOR_MODE.PALETTE, camera: CAMERA_MODE.NONE,
95
+ axes: [
96
+ { role: 'category', kind: AXIS_KIND.CATEGORICAL, channel: ENCODING_CHANNEL.POSITION_X, required: true },
97
+ { role: 'value', kind: AXIS_KIND.NUMERIC, channel: ENCODING_CHANNEL.POSITION_Y_LENGTH, required: true },
98
+ ],
99
+ dataShape: 'Array<{label, value}>',
100
+ streamShape: 'flat',
101
+ },
102
+ {
103
+ key: 'groupedBar', label: 'Grouped Bar', method: 'groupedBarChart', category: '2d',
104
+ coordSystem: COORD_SYSTEM.CARTESIAN, title: true, legend: true, colorMode: COLOR_MODE.PALETTE, camera: CAMERA_MODE.NONE,
105
+ seriesCapable: true,
106
+ axes: [
107
+ { role: 'category', kind: AXIS_KIND.CATEGORICAL, channel: ENCODING_CHANNEL.POSITION_X, required: true },
108
+ { role: 'value', kind: AXIS_KIND.NUMERIC, channel: ENCODING_CHANNEL.POSITION_Y_LENGTH, required: true },
109
+ { role: 'series', kind: AXIS_KIND.CATEGORICAL, channel: ENCODING_CHANNEL.COLOR, required: true },
110
+ ],
111
+ dataShape: 'Multi-series Array<{name, values:Array<{label,value}>}>',
112
+ streamShape: 'series',
113
+ },
114
+ {
115
+ key: 'line', label: 'Line', method: 'lineChart', category: '2d',
116
+ coordSystem: COORD_SYSTEM.CARTESIAN, title: true, legend: true, colorMode: COLOR_MODE.PALETTE, camera: CAMERA_MODE.ISOMETRIC,
117
+ seriesCapable: true,
118
+ axes: [
119
+ { role: 'category', kind: AXIS_KIND.CATEGORICAL, channel: ENCODING_CHANNEL.POSITION_X, required: true },
120
+ { role: 'value', kind: AXIS_KIND.NUMERIC, channel: ENCODING_CHANNEL.POSITION_Y, required: true },
121
+ ],
122
+ dataShape: 'Array<{label, value}> or multi-series Array<{name, values:Array<{label,value}>}> — {zAxis:true} adds an isometric depth shadow per series',
123
+ streamShape: 'series',
124
+ },
125
+ {
126
+ key: 'pie', label: 'Pie / Doughnut', method: 'pieChart', category: '2d',
127
+ coordSystem: COORD_SYSTEM.RADIAL, title: true, legend: true, colorMode: COLOR_MODE.PALETTE, camera: CAMERA_MODE.NONE,
128
+ axes: [
129
+ { role: 'category', kind: AXIS_KIND.CATEGORICAL, channel: ENCODING_CHANNEL.ANGLE_OR_AREA, required: true },
130
+ { role: 'value', kind: AXIS_KIND.NUMERIC, channel: ENCODING_CHANNEL.ANGLE_OR_AREA, required: true },
131
+ ],
132
+ dataShape: 'Array<{label, value}> — innerRadiusRatio>0 makes it a doughnut, same method/data',
133
+ streamShape: 'flat',
134
+ },
135
+ {
136
+ key: 'donut', label: 'Donut', method: 'donutChart', category: '2d',
137
+ coordSystem: COORD_SYSTEM.RADIAL, title: true, legend: true, colorMode: COLOR_MODE.PALETTE, camera: CAMERA_MODE.NONE,
138
+ axes: [
139
+ { role: 'category', kind: AXIS_KIND.CATEGORICAL, channel: ENCODING_CHANNEL.ANGLE_OR_AREA, required: true },
140
+ { role: 'value', kind: AXIS_KIND.NUMERIC, channel: ENCODING_CHANNEL.ANGLE_OR_AREA, required: true },
141
+ ],
142
+ dataShape: 'Array<{label, value}> — donutChart is pieChart with a default innerRadiusRatio of 0.5',
143
+ streamShape: 'flat',
144
+ },
145
+ {
146
+ key: 'area', label: 'Area', method: 'areaChart', category: '2d',
147
+ coordSystem: COORD_SYSTEM.CARTESIAN, title: true, legend: true, colorMode: COLOR_MODE.PALETTE, camera: CAMERA_MODE.NONE,
148
+ seriesCapable: true,
149
+ axes: [
150
+ { role: 'category', kind: AXIS_KIND.CATEGORICAL, channel: ENCODING_CHANNEL.POSITION_X, required: true },
151
+ { role: 'value', kind: AXIS_KIND.NUMERIC, channel: ENCODING_CHANNEL.POSITION_Y, required: true },
152
+ ],
153
+ dataShape: 'Array<{label, value}> or multi-series (same shape as line) — {stacked:true} bands each series atop the previous',
154
+ streamShape: 'series',
155
+ },
156
+ {
157
+ key: 'stackedArea', label: 'Stacked Area', method: 'stackedAreaChart', category: '2d',
158
+ coordSystem: COORD_SYSTEM.CARTESIAN, title: true, legend: true, colorMode: COLOR_MODE.PALETTE, camera: CAMERA_MODE.NONE,
159
+ seriesCapable: true,
160
+ axes: [
161
+ { role: 'category', kind: AXIS_KIND.CATEGORICAL, channel: ENCODING_CHANNEL.POSITION_X, required: true },
162
+ { role: 'value', kind: AXIS_KIND.NUMERIC, channel: ENCODING_CHANNEL.POSITION_Y, required: true },
163
+ ],
164
+ dataShape: 'Multi-series Array<{name, values:Array<{label,value}>}> — each series banded atop the previous',
165
+ streamShape: 'series',
166
+ },
167
+ {
168
+ key: 'scatter', label: 'Scatter', method: 'scatterChart', category: '2d',
169
+ coordSystem: COORD_SYSTEM.CARTESIAN, title: true, legend: false, colorMode: COLOR_MODE.GROUPED_FIELD, camera: CAMERA_MODE.NONE,
170
+ axes: [
171
+ { role: 'x', kind: AXIS_KIND.NUMERIC, channel: ENCODING_CHANNEL.POSITION_X, required: true },
172
+ { role: 'y', kind: AXIS_KIND.NUMERIC, channel: ENCODING_CHANNEL.POSITION_Y, required: true },
173
+ { role: 'group', kind: AXIS_KIND.CATEGORICAL, channel: ENCODING_CHANNEL.COLOR, required: false },
174
+ ],
175
+ dataShape: 'Array<{label, x, y}> — plain x/y points at a fixed marker radius; `colorCol` names a field to color-group by (same convention as bubbleChart, minus its required size axis)',
176
+ streamShape: 'flat',
177
+ },
178
+ {
179
+ key: 'bubble', label: 'Bubble', method: 'bubbleChart', category: '2d',
180
+ coordSystem: COORD_SYSTEM.CARTESIAN, title: true, legend: false, colorMode: COLOR_MODE.GROUPED_FIELD, camera: CAMERA_MODE.ISOMETRIC,
181
+ axes: [
182
+ { role: 'x', kind: AXIS_KIND.NUMERIC, channel: ENCODING_CHANNEL.POSITION_X, required: true },
183
+ { role: 'y', kind: AXIS_KIND.NUMERIC, channel: ENCODING_CHANNEL.POSITION_Y, required: true },
184
+ { role: 'size', kind: AXIS_KIND.NUMERIC, channel: ENCODING_CHANNEL.SHAPE_SIZE, required: false },
185
+ { role: 'group', kind: AXIS_KIND.CATEGORICAL, channel: ENCODING_CHANNEL.COLOR, required: false },
186
+ ],
187
+ dataShape: 'Array<{label, x, y, z}> — z drives bubble size; `colorCol` names a field to color-group by; {zAxis:true} adds an isometric depth shadow',
188
+ streamShape: 'flat',
189
+ },
190
+ {
191
+ key: 'heatmap', label: 'Heatmap', method: 'heatmap', category: '2d',
192
+ coordSystem: COORD_SYSTEM.CARTESIAN, title: true, legend: false, colorMode: COLOR_MODE.SCALE, camera: CAMERA_MODE.NONE,
193
+ axes: [
194
+ { role: 'x', kind: AXIS_KIND.CATEGORICAL, channel: ENCODING_CHANNEL.POSITION_X, required: true },
195
+ { role: 'y', kind: AXIS_KIND.CATEGORICAL, channel: ENCODING_CHANNEL.POSITION_Y, required: true },
196
+ { role: 'value', kind: AXIS_KIND.NUMERIC, channel: ENCODING_CHANNEL.COLOR_SCALE, required: true },
197
+ ],
198
+ dataShape: 'Array<{x, y, value}> — two category axes shaded by value',
199
+ streamShape: 'none', // fixed x/y category matrix — "add one point" isn't meaningful
200
+ },
201
+ {
202
+ key: 'calendarHeatmap', label: 'Calendar Heatmap', method: 'calendarHeatmap', category: '2d',
203
+ coordSystem: COORD_SYSTEM.CARTESIAN, title: true, legend: false, colorMode: COLOR_MODE.SCALE, camera: CAMERA_MODE.NONE,
204
+ axes: [
205
+ { role: 'date', kind: AXIS_KIND.CATEGORICAL, channel: ENCODING_CHANNEL.POSITION_X, required: true },
206
+ { role: 'weekday', kind: AXIS_KIND.CATEGORICAL, channel: ENCODING_CHANNEL.POSITION_Y, required: true },
207
+ { role: 'value', kind: AXIS_KIND.NUMERIC, channel: ENCODING_CHANNEL.COLOR_SCALE, required: true },
208
+ ],
209
+ dataShape: 'Array<{date: string|Date, value: number}> — one row per calendar day, shaded by value; empty days use emptyColor',
210
+ streamShape: 'none',
211
+ },
212
+ {
213
+ key: 'gantt', label: 'Gantt', method: 'ganttChart', category: '2d',
214
+ coordSystem: COORD_SYSTEM.CARTESIAN, title: true, legend: false, colorMode: COLOR_MODE.PALETTE, camera: CAMERA_MODE.NONE,
215
+ axes: [
216
+ { role: 'time', kind: AXIS_KIND.NUMERIC, channel: ENCODING_CHANNEL.POSITION_X, required: true },
217
+ { role: 'task', kind: AXIS_KIND.CATEGORICAL, channel: ENCODING_CHANNEL.POSITION_ORDER, required: true },
218
+ { role: 'progress', kind: AXIS_KIND.NUMERIC, channel: ENCODING_CHANNEL.FILL_PERCENT, required: false },
219
+ ],
220
+ dataShape: 'Array<{label, start, end, progress?, category?, color?}> — start/end are Dates, ISO strings, or numbers; progress is 0-100',
221
+ streamShape: 'flat',
222
+ },
223
+ {
224
+ key: 'streamGraph', label: 'Stream Graph', method: 'streamGraph', category: '2d',
225
+ coordSystem: COORD_SYSTEM.CARTESIAN, title: true, legend: true, colorMode: COLOR_MODE.PALETTE, camera: CAMERA_MODE.NONE,
226
+ seriesCapable: true,
227
+ axes: [
228
+ { role: 'time', kind: AXIS_KIND.CATEGORICAL, channel: ENCODING_CHANNEL.POSITION_X, required: true },
229
+ { role: 'value', kind: AXIS_KIND.NUMERIC, channel: ENCODING_CHANNEL.POSITION_Y, required: true },
230
+ { role: 'series', kind: AXIS_KIND.CATEGORICAL, channel: ENCODING_CHANNEL.COLOR, required: true },
231
+ ],
232
+ dataShape: 'Multi-series Array<{name, values:Array<{label,value}>}> — stacked areas with a centered (silhouette) baseline',
233
+ streamShape: 'series',
234
+ },
235
+ {
236
+ key: 'radialBar', label: 'Radial Bar', method: 'radialBarChart', category: '2d',
237
+ coordSystem: COORD_SYSTEM.RADIAL, title: true, legend: true, colorMode: COLOR_MODE.PALETTE, camera: CAMERA_MODE.NONE,
238
+ axes: [
239
+ { role: 'category', kind: AXIS_KIND.CATEGORICAL, channel: ENCODING_CHANNEL.RADIAL_AXIS, required: true },
240
+ { role: 'value', kind: AXIS_KIND.NUMERIC, channel: ENCODING_CHANNEL.RADIAL_DISTANCE, required: true },
241
+ ],
242
+ dataShape: 'Array<{label, value}> — angular categories with radial bar length',
243
+ streamShape: 'flat',
244
+ },
245
+ {
246
+ key: 'populationPyramid', label: 'Population Pyramid', method: 'populationPyramid', category: '2d',
247
+ coordSystem: COORD_SYSTEM.CARTESIAN, title: true, legend: false, colorMode: COLOR_MODE.SEMANTIC, camera: CAMERA_MODE.NONE,
248
+ axes: [
249
+ { role: 'category', kind: AXIS_KIND.CATEGORICAL, channel: ENCODING_CHANNEL.POSITION_ORDER, required: true },
250
+ { role: 'left', kind: AXIS_KIND.NUMERIC, channel: ENCODING_CHANNEL.POSITION_X, required: true },
251
+ { role: 'right', kind: AXIS_KIND.NUMERIC, channel: ENCODING_CHANNEL.POSITION_X, required: true },
252
+ ],
253
+ dataShape: 'Array<{label, left, right}> — back-to-back horizontal bars (commonly age groups by sex)',
254
+ streamShape: 'flat',
255
+ },
256
+ {
257
+ key: 'sankey', label: 'Sankey Diagram', method: 'sankeyDiagram', category: '2d',
258
+ coordSystem: COORD_SYSTEM.CARTESIAN, title: true, legend: false, colorMode: COLOR_MODE.PALETTE, camera: CAMERA_MODE.NONE,
259
+ axes: [
260
+ { role: 'source', kind: AXIS_KIND.CATEGORICAL, channel: ENCODING_CHANNEL.POSITION_X, required: true },
261
+ { role: 'target', kind: AXIS_KIND.CATEGORICAL, channel: ENCODING_CHANNEL.POSITION_X, required: true },
262
+ { role: 'value', kind: AXIS_KIND.NUMERIC, channel: ENCODING_CHANNEL.SHAPE_WIDTH, required: true },
263
+ ],
264
+ dataShape: '{nodes?: Array<{id,label?,color?}>, links: Array<{source,target,value}>} — proportional-width flow links between nodes',
265
+ streamShape: 'none',
266
+ },
267
+ {
268
+ key: 'chord', label: 'Chord Diagram', method: 'chordDiagram', category: '2d',
269
+ coordSystem: COORD_SYSTEM.RADIAL, title: true, legend: false, colorMode: COLOR_MODE.PALETTE, camera: CAMERA_MODE.NONE,
270
+ axes: [
271
+ { role: 'source', kind: AXIS_KIND.CATEGORICAL, channel: ENCODING_CHANNEL.RADIAL_AXIS, required: true },
272
+ { role: 'target', kind: AXIS_KIND.CATEGORICAL, channel: ENCODING_CHANNEL.RADIAL_AXIS, required: true },
273
+ { role: 'value', kind: AXIS_KIND.NUMERIC, channel: ENCODING_CHANNEL.SHAPE_WIDTH, required: true },
274
+ ],
275
+ dataShape: '{nodes?: Array<{id,label?,color?}>, links: Array<{source,target,value}>} — nodes on a circle with curved chords of proportional thickness',
276
+ streamShape: 'none',
277
+ },
278
+ {
279
+ key: 'wordCloud', label: 'Word Cloud', method: 'wordCloud', category: '2d',
280
+ coordSystem: COORD_SYSTEM.CARTESIAN, title: true, legend: false, colorMode: COLOR_MODE.PALETTE, camera: CAMERA_MODE.NONE,
281
+ axes: [
282
+ { role: 'text', kind: AXIS_KIND.CATEGORICAL, channel: ENCODING_CHANNEL.TEXT_VALUE, required: true },
283
+ { role: 'value', kind: AXIS_KIND.NUMERIC, channel: ENCODING_CHANNEL.SHAPE_SIZE, required: true },
284
+ ],
285
+ dataShape: 'Array<{text: string, value: number}> — words sized by value, laid out with spiral placement and bounding-box collision avoidance',
286
+ streamShape: 'flat',
287
+ },
288
+ {
289
+ key: 'parallelCoordinates', label: 'Parallel Coordinates', method: 'parallelCoordinates', category: '2d',
290
+ coordSystem: COORD_SYSTEM.CARTESIAN, title: true, legend: true, colorMode: COLOR_MODE.PALETTE, camera: CAMERA_MODE.NONE,
291
+ axes: [
292
+ { role: 'dimension', kind: AXIS_KIND.NUMERIC, channel: ENCODING_CHANNEL.POSITION_Y, required: true, repeats: true },
293
+ { role: 'category', kind: AXIS_KIND.CATEGORICAL, channel: ENCODING_CHANNEL.COLOR, required: false },
294
+ ],
295
+ dataShape: 'Array<{label?, category?, [dim: number]}> — one vertical axis per numeric dimension; each row is a polyline; category drives color',
296
+ streamShape: 'flat',
297
+ },
298
+ {
299
+ key: 'geoMap', label: 'Geospatial Map', method: 'geoMap', category: '2d',
300
+ coordSystem: COORD_SYSTEM.CARTESIAN, title: true, legend: false, colorMode: COLOR_MODE.SCALE, camera: CAMERA_MODE.NONE,
301
+ axes: [
302
+ { role: 'longitude', kind: AXIS_KIND.NUMERIC, channel: ENCODING_CHANNEL.POSITION_X, required: true },
303
+ { role: 'latitude', kind: AXIS_KIND.NUMERIC, channel: ENCODING_CHANNEL.POSITION_Y, required: true },
304
+ { role: 'value', kind: AXIS_KIND.NUMERIC, channel: ENCODING_CHANNEL.COLOR_SCALE, required: false },
305
+ ],
306
+ dataShape: '{features: Array<{id, name, value?, color?, geometry:{type, coordinates}}>, bubbles?: Array<{lat, lon, value}>} — equirectangular-projection choropleth and bubble map; no external geo library',
307
+ streamShape: 'none',
308
+ },
309
+ {
310
+ key: 'candlestick', label: 'Candlestick / OHLC', method: 'candlestick', category: '2d',
311
+ coordSystem: COORD_SYSTEM.CARTESIAN, title: true, legend: false, colorMode: COLOR_MODE.SEMANTIC, camera: CAMERA_MODE.NONE,
312
+ axes: [
313
+ { role: 'time', kind: AXIS_KIND.CATEGORICAL, channel: ENCODING_CHANNEL.POSITION_X, required: true },
314
+ { role: 'ohlc', kind: AXIS_KIND.NUMERIC_LIST, channel: ENCODING_CHANNEL.SHAPE_GLYPH, required: true, fields: ['open', 'high', 'low', 'close'] },
315
+ ],
316
+ dataShape: 'Array<{label, open, high, low, close}> — optional `markers` overlay point-in-time tooltip annotations',
317
+ streamShape: 'flat',
318
+ },
319
+ {
320
+ key: 'stackedBar', label: 'Stacked Bar', method: 'stackedBarChart', category: '2d',
321
+ coordSystem: COORD_SYSTEM.CARTESIAN, title: true, legend: false, colorMode: COLOR_MODE.PALETTE, camera: CAMERA_MODE.NONE,
322
+ axes: [
323
+ { role: 'category', kind: AXIS_KIND.CATEGORICAL, channel: ENCODING_CHANNEL.POSITION_X, required: true },
324
+ { role: 'values', kind: AXIS_KIND.NUMERIC_LIST, channel: ENCODING_CHANNEL.POSITION_Y_STACKED, required: true },
325
+ ],
326
+ dataShape: "Array<{label, values:number[]}> e.g. [{label:'Jan', values:[10,20]}] — no built-in legend option despite being multi-series (a real gap; areaChart's stacked mode has one, this doesn't)",
327
+ streamShape: 'flat', // a new stacked bar is a whole new {label,values} record appended to the outer array, not growth of an existing record's values
328
+ },
329
+ {
330
+ key: 'pipe', label: 'Pipe', method: 'pipeChart', category: '2d',
331
+ coordSystem: COORD_SYSTEM.CARTESIAN, title: true, legend: true, colorMode: COLOR_MODE.PALETTE, camera: CAMERA_MODE.NONE,
332
+ seriesCapable: true,
333
+ axes: [
334
+ { role: 'category', kind: AXIS_KIND.CATEGORICAL, channel: ENCODING_CHANNEL.POSITION_X, required: true },
335
+ { role: 'value', kind: AXIS_KIND.NUMERIC, channel: ENCODING_CHANNEL.POSITION_Y, required: true },
336
+ { role: 'width', kind: AXIS_KIND.NUMERIC, channel: ENCODING_CHANNEL.SHAPE_WIDTH, required: false },
337
+ ],
338
+ dataShape: 'Array<{label, value, metric?}> or multi-series — metric drives tapering line width ("axis within object", same idea as bubble size)',
339
+ streamShape: 'series',
340
+ },
341
+ {
342
+ key: 'radar', label: 'Radar / Spider', method: 'radarChart', category: '2d',
343
+ coordSystem: COORD_SYSTEM.RADIAL, title: true, legend: true, colorMode: COLOR_MODE.PALETTE, camera: CAMERA_MODE.NONE,
344
+ seriesCapable: true,
345
+ axes: [
346
+ { role: 'axis', kind: AXIS_KIND.CATEGORICAL, channel: ENCODING_CHANNEL.RADIAL_AXIS, required: true, repeats: true },
347
+ { role: 'value', kind: AXIS_KIND.NUMERIC, channel: ENCODING_CHANNEL.RADIAL_DISTANCE, required: true },
348
+ ],
349
+ dataShape: 'Array<{axis, value}> or multi-series Array<{name, values:Array<{axis,value}>}> — each axis scaled independently by its own max',
350
+ streamShape: 'none', // fixed radial axis set — "add one point" would mean adding a new axis to every series at once, not a single value
351
+ },
352
+ {
353
+ key: 'funnel', label: 'Funnel', method: 'funnelChart', category: '2d',
354
+ coordSystem: COORD_SYSTEM.CARTESIAN, title: true, legend: false, colorMode: COLOR_MODE.PALETTE, camera: CAMERA_MODE.NONE,
355
+ axes: [
356
+ { role: 'stage', kind: AXIS_KIND.CATEGORICAL, channel: ENCODING_CHANNEL.POSITION_ORDER, required: true },
357
+ { role: 'value', kind: AXIS_KIND.NUMERIC, channel: ENCODING_CHANNEL.SHAPE_WIDTH, required: true },
358
+ ],
359
+ dataShape: 'Array<{label, value}> ordered largest-first by convention',
360
+ streamShape: 'flat',
361
+ },
362
+ {
363
+ key: 'waterfall', label: 'Waterfall', method: 'waterfallChart', category: '2d',
364
+ coordSystem: COORD_SYSTEM.CARTESIAN, title: true, legend: false, colorMode: COLOR_MODE.SEMANTIC, camera: CAMERA_MODE.NONE,
365
+ axes: [
366
+ { role: 'label', kind: AXIS_KIND.CATEGORICAL, channel: ENCODING_CHANNEL.POSITION_X, required: true },
367
+ { role: 'value', kind: AXIS_KIND.NUMERIC, channel: ENCODING_CHANNEL.POSITION_Y_DELTA, required: true },
368
+ { role: 'type', kind: AXIS_KIND.CATEGORICAL, channel: ENCODING_CHANNEL.SEMANTIC_COLOR, required: false, values: ['delta', 'total'] },
369
+ ],
370
+ dataShape: "Array<{label, value, type?:'delta'|'total'}> — 'total' entries draw full-height checkpoints",
371
+ streamShape: 'flat',
372
+ },
373
+ {
374
+ key: 'histogram', label: 'Histogram', method: 'histogram', category: 'statistical',
375
+ coordSystem: COORD_SYSTEM.CARTESIAN, title: true, legend: false, colorMode: COLOR_MODE.SINGLE, camera: CAMERA_MODE.NONE,
376
+ axes: [
377
+ { role: 'sample', kind: AXIS_KIND.RAW_SAMPLE, channel: ENCODING_CHANNEL.DERIVED, required: true },
378
+ ],
379
+ dataShape: 'number[] — a raw sample, binned internally (not pre-aggregated); no category axis at all, unlike every other cartesian type here',
380
+ streamShape: 'flat',
381
+ },
382
+ {
383
+ key: 'boxPlot', label: 'Box Plot', method: 'boxPlot', category: 'statistical',
384
+ coordSystem: COORD_SYSTEM.CARTESIAN, title: true, legend: false, colorMode: COLOR_MODE.SINGLE, camera: CAMERA_MODE.NONE,
385
+ axes: [
386
+ { role: 'group', kind: AXIS_KIND.CATEGORICAL, channel: ENCODING_CHANNEL.POSITION_X, required: true },
387
+ { role: 'sample', kind: AXIS_KIND.RAW_SAMPLE, channel: ENCODING_CHANNEL.DERIVED, required: true },
388
+ ],
389
+ dataShape: 'Array<{label, values:number[]}> — raw per-group samples, quartiles/whiskers/outliers computed internally (1.5×IQR Tukey fences)',
390
+ streamShape: 'grouped-sample',
391
+ },
392
+ {
393
+ key: 'density', label: 'Density Plot', method: 'densityChart', category: 'statistical',
394
+ coordSystem: COORD_SYSTEM.CARTESIAN, title: true, legend: true, colorMode: COLOR_MODE.PALETTE, camera: CAMERA_MODE.NONE,
395
+ axes: [
396
+ { role: 'group', kind: AXIS_KIND.CATEGORICAL, channel: ENCODING_CHANNEL.COLOR, required: true },
397
+ { role: 'sample', kind: AXIS_KIND.RAW_SAMPLE, channel: ENCODING_CHANNEL.DERIVED, required: true },
398
+ ],
399
+ dataShape: "Array<{label, values:number[]}> — same shape as boxPlot; each group's raw sample becomes an overlaid Gaussian-KDE curve on one shared value-axis, colored per group (not positioned — group drives color here, unlike boxPlot where it drives x-position)",
400
+ streamShape: 'grouped-sample',
401
+ },
402
+ {
403
+ key: 'violin', label: 'Violin Plot', method: 'violinChart', category: 'statistical',
404
+ coordSystem: COORD_SYSTEM.CARTESIAN, title: true, legend: false, colorMode: COLOR_MODE.PALETTE, camera: CAMERA_MODE.NONE,
405
+ axes: [
406
+ { role: 'group', kind: AXIS_KIND.CATEGORICAL, channel: ENCODING_CHANNEL.POSITION_X, required: true },
407
+ { role: 'sample', kind: AXIS_KIND.RAW_SAMPLE, channel: ENCODING_CHANNEL.DERIVED, required: true },
408
+ ],
409
+ dataShape: "Array<{label, values:number[]}> — same shape as boxPlot (and interchangeable with it); each group's raw sample becomes a mirrored Gaussian-KDE silhouette in its own x-slot, colored per group",
410
+ streamShape: 'grouped-sample',
411
+ },
412
+ {
413
+ key: 'qq', label: 'Q-Q Plot', method: 'qqPlot', category: 'statistical',
414
+ coordSystem: COORD_SYSTEM.CARTESIAN, title: true, legend: false, colorMode: COLOR_MODE.SINGLE, camera: CAMERA_MODE.NONE,
415
+ axes: [
416
+ { role: 'sample', kind: AXIS_KIND.RAW_SAMPLE, channel: ENCODING_CHANNEL.DERIVED, required: true },
417
+ ],
418
+ dataShape: "number[] — a raw sample; each point is (theoretical normal quantile, sample quantile), with a dashed reference line fit through the sample's own Q1/Q3 — deviation signals non-normality (fat tails, skew); delegates entirely to scatterChart",
419
+ streamShape: 'flat',
420
+ },
421
+ {
422
+ key: 'lag', label: 'Lag Plot', method: 'lagPlot', category: 'statistical',
423
+ coordSystem: COORD_SYSTEM.CARTESIAN, title: true, legend: false, colorMode: COLOR_MODE.SINGLE, camera: CAMERA_MODE.NONE,
424
+ axes: [
425
+ { role: 'sample', kind: AXIS_KIND.RAW_SAMPLE, channel: ENCODING_CHANNEL.DERIVED, required: true },
426
+ ],
427
+ dataShape: 'number[] — an ordered series (e.g. daily returns); plots each value against itself lagged by options.lag (default 1) to visually check autocorrelation — delegates entirely to scatterChart',
428
+ streamShape: 'flat',
429
+ },
430
+ {
431
+ key: 'treemap', label: 'Treemap', method: 'treemapChart', category: '2d',
432
+ coordSystem: COORD_SYSTEM.CARTESIAN, title: true, legend: false, colorMode: COLOR_MODE.PALETTE, camera: CAMERA_MODE.NONE,
433
+ axes: [
434
+ { role: 'value', kind: AXIS_KIND.NUMERIC, channel: ENCODING_CHANNEL.ANGLE_OR_AREA, required: true },
435
+ { role: 'group', kind: AXIS_KIND.CATEGORICAL, channel: ENCODING_CHANNEL.POSITION_ORDER, required: false },
436
+ ],
437
+ dataShape: 'Array<{label, value?, children?}> — a leaf has `value` (no children); a branch has `children` (value computed as their sum) and can nest to any depth; rectangle AREA is proportional to value (squarified layout); color comes from each top-level branch, descendants shaded progressively lighter by depth',
438
+ streamShape: 'flat', // appends a new top-level leaf; adding a point below an existing branch isn't supported by addDataPoint
439
+ },
440
+ {
441
+ key: 'sunburst', label: 'Sunburst', method: 'sunburstChart', category: '2d',
442
+ coordSystem: COORD_SYSTEM.RADIAL, title: true, legend: false, colorMode: COLOR_MODE.PALETTE, camera: CAMERA_MODE.NONE,
443
+ axes: [
444
+ { role: 'value', kind: AXIS_KIND.NUMERIC, channel: ENCODING_CHANNEL.ANGLE_OR_AREA, required: true },
445
+ { role: 'group', kind: AXIS_KIND.CATEGORICAL, channel: ENCODING_CHANNEL.POSITION_ORDER, required: false },
446
+ ],
447
+ dataShape: 'Array<{label, value?, children?}> — same hierarchical shape as treemap (shares _hierarchyValue); angle (not area) is proportional to value within each ring, ring = depth',
448
+ streamShape: 'flat',
449
+ },
450
+ {
451
+ key: 'outline', label: 'Outline / Tree List', method: 'outlineChart', category: '2d',
452
+ coordSystem: COORD_SYSTEM.CARTESIAN, title: true, legend: false, colorMode: COLOR_MODE.PALETTE, camera: CAMERA_MODE.NONE,
453
+ axes: [
454
+ { role: 'value', kind: AXIS_KIND.NUMERIC, channel: ENCODING_CHANNEL.TEXT_VALUE, required: false },
455
+ { role: 'group', kind: AXIS_KIND.CATEGORICAL, channel: ENCODING_CHANNEL.POSITION_ORDER, required: false },
456
+ ],
457
+ dataShape: 'Array<{label, value?, children?}> — same hierarchical shape as treemap/sunburst (shares _hierarchyValue); drawn as an indented, collapsible list instead of nested rectangles/rings — a branch\'s value is auto-summed from its descendants and shown as a trailing count, a leaf\'s own extra fields (anything beyond label/value/children) shown as trailing descriptive text instead',
458
+ streamShape: 'flat',
459
+ },
460
+ {
461
+ key: 'gauge-dial', label: 'Gauge (Dial)', method: 'dialGauge', category: 'gauge',
462
+ coordSystem: COORD_SYSTEM.RADIAL, title: true, legend: false, colorMode: COLOR_MODE.SINGLE, camera: CAMERA_MODE.NONE,
463
+ axes: [
464
+ { role: 'value', kind: AXIS_KIND.NUMERIC, channel: ENCODING_CHANNEL.FILL_PERCENT, required: true, range: [0, 100] }, // the default; the min/max options change it
465
+ ],
466
+ dataShape: 'number, {value, target?}, or [{value, label?, color?}] (a needle each) — no category axis; the only role IS the value (0-100 unless min/max are given)',
467
+ streamShape: 'none', // no array/window at all — update by calling dialGauge(newValue) again directly
468
+ },
469
+ {
470
+ key: 'gauge-bar', label: 'Gauge (Bar)', method: 'barGauge', category: 'gauge',
471
+ coordSystem: COORD_SYSTEM.CARTESIAN, title: true, legend: false, colorMode: COLOR_MODE.SINGLE, camera: CAMERA_MODE.NONE,
472
+ axes: [
473
+ { role: 'value', kind: AXIS_KIND.NUMERIC, channel: ENCODING_CHANNEL.FILL_PERCENT, required: true, range: [0, 100] }, // the default; the min/max options change it
474
+ ],
475
+ dataShape: 'number, or {value, target?} (0-100 unless min/max are given)',
476
+ streamShape: 'none', // no array/window at all — update by calling barGauge(newValue) again directly
477
+ },
478
+ {
479
+ key: 'bullet', label: 'Bullet Graph', method: 'bulletGauge', category: 'gauge',
480
+ coordSystem: COORD_SYSTEM.CARTESIAN, title: true, legend: false, colorMode: COLOR_MODE.SEMANTIC, camera: CAMERA_MODE.NONE,
481
+ axes: [
482
+ { role: 'value', kind: AXIS_KIND.NUMERIC, channel: ENCODING_CHANNEL.FILL_PERCENT, required: true },
483
+ { role: 'target', kind: AXIS_KIND.NUMERIC, channel: ENCODING_CHANNEL.POSITION_X, required: false },
484
+ ],
485
+ dataShape: 'number or {value, target?, ranges?:Array<{max, label?, color?}>}',
486
+ streamShape: 'none',
487
+ },
488
+ {
489
+ key: 'gauge-arc', label: 'Gauge (Arc)', method: 'arcGauge', category: 'gauge',
490
+ coordSystem: COORD_SYSTEM.RADIAL, title: true, legend: false, colorMode: COLOR_MODE.SINGLE, camera: CAMERA_MODE.NONE,
491
+ axes: [
492
+ { role: 'value', kind: AXIS_KIND.NUMERIC, channel: ENCODING_CHANNEL.FILL_PERCENT, required: true, range: [0, 100] }, // the default; the min/max options change it
493
+ ],
494
+ dataShape: 'number, or {value, target?} (0-100 unless min/max are given) — a half circle by default, any startAngle/sweep',
495
+ streamShape: 'none',
496
+ },
497
+ {
498
+ key: 'gauge-ring', label: 'Gauge (Ring)', method: 'ringGauge', category: 'gauge',
499
+ coordSystem: COORD_SYSTEM.RADIAL, title: true, legend: false, colorMode: COLOR_MODE.SINGLE, camera: CAMERA_MODE.NONE,
500
+ axes: [
501
+ { role: 'value', kind: AXIS_KIND.NUMERIC, channel: ENCODING_CHANNEL.FILL_PERCENT, required: true, range: [0, 100] }, // the default; the min/max options change it
502
+ ],
503
+ dataShape: 'number, or {value, target?} (0-100 unless min/max are given)',
504
+ streamShape: 'none',
505
+ },
506
+ {
507
+ key: 'gauge-rings', label: 'Gauge (Rings)', method: 'multiRingGauge', category: 'gauge',
508
+ coordSystem: COORD_SYSTEM.RADIAL, title: true, legend: true, colorMode: COLOR_MODE.PALETTE, camera: CAMERA_MODE.NONE,
509
+ axes: [
510
+ { role: 'value', kind: AXIS_KIND.NUMERIC, channel: ENCODING_CHANNEL.FILL_PERCENT, required: true, range: [0, 100] }, // the default; the min/max options change it
511
+ ],
512
+ dataShape: 'Array<number|{value, label?, color?, min?, max?}> — one ring per value, outer first, each on its own scale',
513
+ streamShape: 'none',
514
+ },
515
+ {
516
+ key: 'gauge-thermometer', label: 'Gauge (Thermometer)', method: 'thermometerGauge', category: 'gauge',
517
+ coordSystem: COORD_SYSTEM.CARTESIAN, title: true, legend: false, colorMode: COLOR_MODE.SINGLE, camera: CAMERA_MODE.NONE,
518
+ axes: [
519
+ { role: 'value', kind: AXIS_KIND.NUMERIC, channel: ENCODING_CHANNEL.FILL_PERCENT, required: true, range: [0, 100] }, // the default; the min/max options change it
520
+ ],
521
+ dataShape: 'number, or {value, target?} (0-100 unless min/max are given)',
522
+ streamShape: 'none',
523
+ },
524
+ {
525
+ key: 'kpi-tile', label: 'KPI Tile', method: 'kpiTile', category: 'gauge',
526
+ coordSystem: COORD_SYSTEM.CARTESIAN, title: true, legend: false, colorMode: COLOR_MODE.SINGLE, camera: CAMERA_MODE.NONE,
527
+ axes: [
528
+ { role: 'value', kind: AXIS_KIND.NUMERIC, channel: ENCODING_CHANNEL.FILL_PERCENT, required: true, range: [0, 100] }, // the default; the min/max options change it
529
+ ],
530
+ dataShape: 'number, or {value?, previous?, history?:number[]} — the figure, its change since the previous value, a sparkline of the history',
531
+ streamShape: 'none',
532
+ },
533
+ {
534
+ key: 'bar3D', label: 'Bar (3D)', method: 'barChart3D', category: '3d',
535
+ coordSystem: COORD_SYSTEM.CARTESIAN, title: true, legend: false, colorMode: COLOR_MODE.PALETTE, camera: CAMERA_MODE.ISOMETRIC,
536
+ axes: [
537
+ { role: 'category', kind: AXIS_KIND.CATEGORICAL, channel: ENCODING_CHANNEL.POSITION_X, required: true },
538
+ { role: 'value', kind: AXIS_KIND.NUMERIC, channel: ENCODING_CHANNEL.POSITION_Y_LENGTH, required: true },
539
+ { role: 'depth', kind: AXIS_KIND.NUMERIC, channel: ENCODING_CHANNEL.SHAPE_DEPTH, required: false },
540
+ ],
541
+ dataShape: 'Array<{label, value, depth?}> — a single fixed-angle isometric shadow per bar, not a real camera (see bar3DOrbit for that)',
542
+ streamShape: 'flat',
543
+ },
544
+ {
545
+ key: 'bubble3D', label: 'Bubble (3D)', method: 'bubbleChart3D', category: '3d',
546
+ coordSystem: COORD_SYSTEM.ORBIT_3D, title: true, legend: false, colorMode: COLOR_MODE.GROUPED_FIELD, camera: CAMERA_MODE.ORBIT,
547
+ axes: [
548
+ { role: 'x', kind: AXIS_KIND.NUMERIC, channel: ENCODING_CHANNEL.POSITION_X, required: true },
549
+ { role: 'y', kind: AXIS_KIND.NUMERIC, channel: ENCODING_CHANNEL.POSITION_Y, required: true },
550
+ { role: 'z', kind: AXIS_KIND.NUMERIC, channel: ENCODING_CHANNEL.POSITION_Z, required: true },
551
+ { role: 'size', kind: AXIS_KIND.NUMERIC, channel: ENCODING_CHANNEL.SHAPE_SIZE, required: false },
552
+ { role: 'group', kind: AXIS_KIND.CATEGORICAL, channel: ENCODING_CHANNEL.COLOR, required: false },
553
+ ],
554
+ dataShape: 'Array<{label, x, y, z, size?, category?}> — real orbit camera (drag-rotate/wheel-zoom); a future sphere/ellipsoid variant is this same shape with a second shape-size-channeled role, not a new chart type',
555
+ streamShape: 'flat',
556
+ },
557
+ {
558
+ key: 'bar3DOrbit', label: 'Bar (3D Orbit)', method: 'barChart3DOrbit', category: '3d',
559
+ coordSystem: COORD_SYSTEM.ORBIT_3D, title: true, legend: false, colorMode: COLOR_MODE.PALETTE, camera: CAMERA_MODE.ORBIT,
560
+ axes: [
561
+ { role: 'x', kind: AXIS_KIND.CATEGORICAL, channel: ENCODING_CHANNEL.POSITION_X, required: true },
562
+ { role: 'z', kind: AXIS_KIND.CATEGORICAL, channel: ENCODING_CHANNEL.POSITION_Z, required: true },
563
+ { role: 'value', kind: AXIS_KIND.NUMERIC, channel: ENCODING_CHANNEL.POSITION_Y_HEIGHT, required: true },
564
+ ],
565
+ dataShape: 'Array<{x, z, value}> — grouped across two categorical axes, real orbit camera; colors indexed by z-group',
566
+ streamShape: 'none', // fixed x*z grid
567
+ },
568
+ {
569
+ key: 'stackedBar3DOrbit', label: 'Stacked Bar (3D Orbit)', method: 'stackedBarChart3DOrbit', category: '3d',
570
+ coordSystem: COORD_SYSTEM.ORBIT_3D, title: true, legend: false, colorMode: COLOR_MODE.PALETTE, camera: CAMERA_MODE.ORBIT,
571
+ axes: [
572
+ { role: 'x', kind: AXIS_KIND.CATEGORICAL, channel: ENCODING_CHANNEL.POSITION_X, required: true },
573
+ { role: 'z', kind: AXIS_KIND.CATEGORICAL, channel: ENCODING_CHANNEL.POSITION_Z, required: true },
574
+ { role: 'values', kind: AXIS_KIND.NUMERIC_LIST, channel: ENCODING_CHANNEL.POSITION_Y_HEIGHT, required: true },
575
+ ],
576
+ dataShape: 'Array<{x, z, values:number[]}> — same grid as bar3DOrbit, each cell a stack of segments; colors indexed by segment position, not z-group',
577
+ streamShape: 'none', // fixed x*z grid
578
+ },
579
+ ];
580
+
581
+ import { ChartRegistry } from './charting/ChartRegistry.js';
582
+
583
+ /** Canonical registry instance seeded with the built-in chart types. */
584
+ export const chartRegistry = new ChartRegistry(CHART_CATALOG);
585
+
586
+ /** Look up one catalog entry by key, or undefined if the key is unknown. */
587
+ export function getChartCatalogEntry(key) {
588
+ return chartRegistry.get(key);
589
+ }