@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.
- package/LICENSE +21 -0
- package/README.md +203 -2
- package/REFERENCE.md +2198 -0
- package/dist/renderengine-workspace.umd.js +46905 -0
- package/dist/renderengine.umd.js +42223 -0
- package/examples/archimate.html +66 -0
- package/examples/diagram-editor.html +51 -0
- package/package.json +65 -4
- package/src/BaseRenderer.js +57 -0
- package/src/CanvasRenderer.js +194 -0
- package/src/Mat4.js +111 -0
- package/src/OrbitCamera.js +57 -0
- package/src/RendererFactory.js +50 -0
- package/src/SVGRenderer.js +439 -0
- package/src/archimate.js +723 -0
- package/src/archimateArchiFormat.js +1693 -0
- package/src/archimateArchiTypes.js +72 -0
- package/src/archimateArchive.js +140 -0
- package/src/archimateCSV.js +127 -0
- package/src/archimateDrawio.js +182 -0
- package/src/archimateExchangeFormat.js +546 -0
- package/src/archimateRelationshipTable.js +93 -0
- package/src/archimateSpecializations.js +161 -0
- package/src/chartCatalog.js +589 -0
- package/src/charting/ArchimateDiagramEditor.js +1624 -0
- package/src/charting/ArchimateSpecializationSelector.js +134 -0
- package/src/charting/Axis.js +68 -0
- package/src/charting/CameraSeeder.js +30 -0
- package/src/charting/CatalogDialog.js +92 -0
- package/src/charting/Chart.js +37 -0
- package/src/charting/Chart3D.js +99 -0
- package/src/charting/ChartBox.js +80 -0
- package/src/charting/ChartData.js +27 -0
- package/src/charting/ChartRegistry.js +76 -0
- package/src/charting/CheckboxTreeSelector.js +304 -0
- package/src/charting/ColorField.js +107 -0
- package/src/charting/ColorPalette.js +88 -0
- package/src/charting/CommandHistory.js +176 -0
- package/src/charting/DataFilter.js +52 -0
- package/src/charting/Diagram.js +36 -0
- package/src/charting/Diagram3D.js +29 -0
- package/src/charting/DiagramClipboard.js +31 -0
- package/src/charting/DiagramEditor.js +3330 -0
- package/src/charting/DiagramEditorCommand.js +110 -0
- package/src/charting/DiagramEditorCommands.js +237 -0
- package/src/charting/DiagramEditorEdgeCommands.js +142 -0
- package/src/charting/DiagramEditorState.js +98 -0
- package/src/charting/DiagramRegistry.js +86 -0
- package/src/charting/DiagramTypeRegistry.js +326 -0
- package/src/charting/DiagramViewPropertiesDialog.js +46 -0
- package/src/charting/Edge.js +113 -0
- package/src/charting/ErrorBars.js +37 -0
- package/src/charting/FilterSystem.js +285 -0
- package/src/charting/FindReplaceDialog.js +139 -0
- package/src/charting/FormDialog.js +385 -0
- package/src/charting/Gauge.js +58 -0
- package/src/charting/Hierarchy.js +175 -0
- package/src/charting/HintPanel.js +86 -0
- package/src/charting/ImageSelector.js +148 -0
- package/src/charting/InteractionManager.js +725 -0
- package/src/charting/Legend.js +58 -0
- package/src/charting/MenuBar.js +62 -0
- package/src/charting/ModelFileFormat.js +115 -0
- package/src/charting/OrbitControls.js +77 -0
- package/src/charting/Palette.js +119 -0
- package/src/charting/PopupMenu.js +117 -0
- package/src/charting/PropertiesPanel.js +155 -0
- package/src/charting/PropertyListEditor.js +96 -0
- package/src/charting/PropertyLog.js +92 -0
- package/src/charting/SettingsCascade.js +93 -0
- package/src/charting/SettingsDialog.js +53 -0
- package/src/charting/SettingsManager.js +179 -0
- package/src/charting/SettingsViewPropertiesDialog.js +58 -0
- package/src/charting/ShapePaths.js +27 -0
- package/src/charting/Statistics.js +134 -0
- package/src/charting/TemplateCatalog.js +59 -0
- package/src/charting/TemplateLibrary.js +103 -0
- package/src/charting/TextStyle.js +168 -0
- package/src/charting/ViewFit.js +55 -0
- package/src/charting/ViewMenu.js +70 -0
- package/src/charting/ViewPropertiesDialog.js +77 -0
- package/src/charting/ViewTabStrip.js +81 -0
- package/src/charting/archimate/ArchiFileFormat.js +32 -0
- package/src/charting/archimate/ArchimateCanvasEditor.js +815 -0
- package/src/charting/archimate/ArchimateCsvFileFormat.js +35 -0
- package/src/charting/archimate/ArchimateEdge.js +137 -0
- package/src/charting/archimate/ArchimateElementTemplate.js +195 -0
- package/src/charting/archimate/ArchimatePalette.js +102 -0
- package/src/charting/archimate/CsvImportDialog.js +105 -0
- package/src/charting/archimate/CustomViewpoints.js +74 -0
- package/src/charting/archimate/DerivedEdge.js +29 -0
- package/src/charting/archimate/DrawioFileFormat.js +24 -0
- package/src/charting/archimate/ElementFilterRule.js +21 -0
- package/src/charting/archimate/ExchangeFileFormat.js +28 -0
- package/src/charting/archimate/ViewGroupTemplate.js +137 -0
- package/src/charting/archimate/ViewLineEdge.js +84 -0
- package/src/charting/archimate/ViewpointRule.js +45 -0
- package/src/charting/archimate/archimateFileFormats.js +12 -0
- package/src/charting/archimate/archimateNames.js +5 -0
- package/src/charting/archimate/csvMapping.js +122 -0
- package/src/charting/archimate/elementMenuItems.js +32 -0
- package/src/charting/archimate/elementProperties.js +146 -0
- package/src/charting/archimate/elementTypeChoices.js +7 -0
- package/src/charting/archimate/elementTypeGroups.js +19 -0
- package/src/charting/archimate/index.js +17 -0
- package/src/charting/archimate/specializationCatalogDialog.js +64 -0
- package/src/charting/archimate/typeGlyph.js +29 -0
- package/src/charting/arrangement/Arrangement.js +112 -0
- package/src/charting/arrangement/ArrangementCommand.js +29 -0
- package/src/charting/arrangement/BackgroundCommand.js +41 -0
- package/src/charting/arrangement/BackgroundGroup.js +18 -0
- package/src/charting/arrangement/GroupCommand.js +46 -0
- package/src/charting/arrangement/ItemGroup.js +62 -0
- package/src/charting/arrangement/LockCommand.js +32 -0
- package/src/charting/arrangement/UngroupCommand.js +27 -0
- package/src/charting/arrangement/alignment.js +88 -0
- package/src/charting/arrangement/arrangeMenuItems.js +25 -0
- package/src/charting/arrangement/index.js +11 -0
- package/src/charting/arrangement/layouts.js +233 -0
- package/src/charting/canvas/ArchiHint.js +78 -0
- package/src/charting/canvas/CanvasBoxKind.js +39 -0
- package/src/charting/canvas/CanvasPalette.js +49 -0
- package/src/charting/canvas/CanvasTemplateLibrary.js +61 -0
- package/src/charting/canvas/CanvasTemplateMenu.js +151 -0
- package/src/charting/canvas/EditHintCommand.js +28 -0
- package/src/charting/canvas/canvasBoxKinds.js +27 -0
- package/src/charting/canvas/canvasBoxMenuItems.js +40 -0
- package/src/charting/canvas/defaultCanvasTemplates.js +186 -0
- package/src/charting/canvas/diagramBoxKinds.js +12 -0
- package/src/charting/canvas/hintMenuItems.js +49 -0
- package/src/charting/charts/ArcGauge.js +55 -0
- package/src/charting/charts/AreaChart.js +71 -0
- package/src/charting/charts/BarChart.js +80 -0
- package/src/charting/charts/BarChart3D.js +56 -0
- package/src/charting/charts/BarChart3DOrbit.js +53 -0
- package/src/charting/charts/BarChartBase.js +70 -0
- package/src/charting/charts/BarGauge.js +42 -0
- package/src/charting/charts/BoxPlotChart.js +41 -0
- package/src/charting/charts/BubbleChart.js +99 -0
- package/src/charting/charts/BubbleChart3D.js +78 -0
- package/src/charting/charts/BulletGauge.js +87 -0
- package/src/charting/charts/CalendarHeatmapChart.js +204 -0
- package/src/charting/charts/CandlestickChart.js +54 -0
- package/src/charting/charts/ChordDiagram.js +130 -0
- package/src/charting/charts/DensityChart.js +73 -0
- package/src/charting/charts/DialGauge.js +65 -0
- package/src/charting/charts/DonutChart.js +15 -0
- package/src/charting/charts/FunnelChart.js +47 -0
- package/src/charting/charts/GanttChart.js +201 -0
- package/src/charting/charts/GaugeChart.js +175 -0
- package/src/charting/charts/GeoMapChart.js +146 -0
- package/src/charting/charts/GroupedBarChart.js +88 -0
- package/src/charting/charts/GroupedDistributionChart.js +70 -0
- package/src/charting/charts/HeatmapChart.js +80 -0
- package/src/charting/charts/HierarchyChart.js +39 -0
- package/src/charting/charts/HistogramChart.js +45 -0
- package/src/charting/charts/KpiTile.js +72 -0
- package/src/charting/charts/LagPlotChart.js +41 -0
- package/src/charting/charts/LineChart.js +124 -0
- package/src/charting/charts/MultiRingGauge.js +54 -0
- package/src/charting/charts/OutlineChart.js +95 -0
- package/src/charting/charts/ParallelCoordinatesChart.js +130 -0
- package/src/charting/charts/PieChart.js +56 -0
- package/src/charting/charts/PipeChart.js +88 -0
- package/src/charting/charts/PopulationPyramidChart.js +106 -0
- package/src/charting/charts/QQPlotChart.js +64 -0
- package/src/charting/charts/RadarChart.js +76 -0
- package/src/charting/charts/RadialBarChart.js +96 -0
- package/src/charting/charts/RingGauge.js +23 -0
- package/src/charting/charts/SankeyDiagram.js +174 -0
- package/src/charting/charts/ScatterChart.js +104 -0
- package/src/charting/charts/StackedAreaChart.js +15 -0
- package/src/charting/charts/StackedBarChart.js +33 -0
- package/src/charting/charts/StackedBarChart3DOrbit.js +58 -0
- package/src/charting/charts/StreamGraphChart.js +131 -0
- package/src/charting/charts/SunburstChart.js +57 -0
- package/src/charting/charts/ThermometerGauge.js +43 -0
- package/src/charting/charts/TreemapChart.js +54 -0
- package/src/charting/charts/ViolinChart.js +37 -0
- package/src/charting/charts/WaterfallChart.js +66 -0
- package/src/charting/charts/WordCloudChart.js +104 -0
- package/src/charting/diagramModel/AddViewCommand.js +33 -0
- package/src/charting/diagramModel/DiagramModel.js +39 -0
- package/src/charting/diagramModel/DiagramModelSearch.js +22 -0
- package/src/charting/diagramModel/DiagramView.js +50 -0
- package/src/charting/diagramModel/ModelHistory.js +43 -0
- package/src/charting/diagramModel/ModelReport.js +153 -0
- package/src/charting/diagramModel/ModelSearch.js +223 -0
- package/src/charting/diagramModel/RemoveViewCommand.js +25 -0
- package/src/charting/diagramModel/RenameViewCommand.js +21 -0
- package/src/charting/diagramModel/ReplaceTextCommand.js +25 -0
- package/src/charting/diagramModel/ViewSetChecker.js +34 -0
- package/src/charting/diagramModel/ViewSetModel.js +243 -0
- package/src/charting/diagramModel/index.js +6 -0
- package/src/charting/diagramModel/nameTransforms.js +29 -0
- package/src/charting/diagrams/ArchimateCommands.js +141 -0
- package/src/charting/diagrams/ArchimateDiagram.js +263 -0
- package/src/charting/diagrams/ArchimateModel.js +1155 -0
- package/src/charting/diagrams/ArchimateModelChecker.js +125 -0
- package/src/charting/diagrams/ArchimateModelReport.js +128 -0
- package/src/charting/diagrams/ArchimateModelSearch.js +41 -0
- package/src/charting/diagrams/ArchimateValidator.js +357 -0
- package/src/charting/diagrams/CanvasView.js +112 -0
- package/src/charting/diagrams/ContextMenu.js +37 -0
- package/src/charting/diagrams/DataModelDiagram.js +86 -0
- package/src/charting/diagrams/DataModelRelationshipStrategy.js +38 -0
- package/src/charting/diagrams/DerivedRelationships.js +102 -0
- package/src/charting/diagrams/EbnfDiagram.js +39 -0
- package/src/charting/diagrams/EdgeGeometry.js +553 -0
- package/src/charting/diagrams/EditViewItemCommand.js +128 -0
- package/src/charting/diagrams/ElementInstance.js +157 -0
- package/src/charting/diagrams/GraphDiagram.js +1340 -0
- package/src/charting/diagrams/GraphDiagram3D.js +152 -0
- package/src/charting/diagrams/GraphMetrics.js +81 -0
- package/src/charting/diagrams/GridOverlay.js +137 -0
- package/src/charting/diagrams/ImportRowsCommand.js +62 -0
- package/src/charting/diagrams/LabelHelper.js +108 -0
- package/src/charting/diagrams/MergeElementsCommand.js +101 -0
- package/src/charting/diagrams/NestInstanceCommand.js +34 -0
- package/src/charting/diagrams/NodeGeometry.js +158 -0
- package/src/charting/diagrams/PlaceItemsCommand.js +77 -0
- package/src/charting/diagrams/RadialLayout.js +101 -0
- package/src/charting/diagrams/RelationshipInstance.js +93 -0
- package/src/charting/diagrams/RemoveGroupFromViewCommand.js +28 -0
- package/src/charting/diagrams/RemoveLineCommand.js +27 -0
- package/src/charting/diagrams/ShowElementCommand.js +43 -0
- package/src/charting/diagrams/SvgCoordinate.js +17 -0
- package/src/charting/diagrams/SvgZoom.js +127 -0
- package/src/charting/diagrams/Tooltip.js +62 -0
- package/src/charting/diagrams/ViewConnectionInstance.js +102 -0
- package/src/charting/diagrams/ViewObjectInstance.js +56 -0
- package/src/charting/diagrams/commands/AddEdgeCommand.js +34 -0
- package/src/charting/diagrams/commands/AddNodeCommand.js +28 -0
- package/src/charting/diagrams/commands/AddWaypointCommand.js +27 -0
- package/src/charting/diagrams/commands/CreateFolderCommand.js +27 -0
- package/src/charting/diagrams/commands/DeleteEdgeCommand.js +30 -0
- package/src/charting/diagrams/commands/DeleteFolderCommand.js +47 -0
- package/src/charting/diagrams/commands/DeleteNodeCommand.js +35 -0
- package/src/charting/diagrams/commands/DeleteWaypointCommand.js +24 -0
- package/src/charting/diagrams/commands/GraphCommand.js +65 -0
- package/src/charting/diagrams/commands/InvertEdgeCommand.js +24 -0
- package/src/charting/diagrams/commands/MoveNodeCommand.js +44 -0
- package/src/charting/diagrams/commands/MoveWaypointCommand.js +27 -0
- package/src/charting/diagrams/commands/RenameEdgeCommand.js +23 -0
- package/src/charting/diagrams/commands/RenameFolderCommand.js +31 -0
- package/src/charting/diagrams/commands/RenameNodeCommand.js +27 -0
- package/src/charting/diagrams/commands/ResizeNodeCommand.js +46 -0
- package/src/charting/diagrams/commands/UpdateEdgeSideCommand.js +40 -0
- package/src/charting/diagrams/commands/index.js +17 -0
- package/src/charting/diagrams/duplicates.js +49 -0
- package/src/charting/diagrams/nesting.js +30 -0
- package/src/charting/diagrams/roadmap.js +77 -0
- package/src/charting/edgeMarkers/ArrowMarker.js +15 -0
- package/src/charting/edgeMarkers/CircleMarker.js +13 -0
- package/src/charting/edgeMarkers/CrowsFootMarker.js +16 -0
- package/src/charting/edgeMarkers/DiamondMarker.js +15 -0
- package/src/charting/edgeMarkers/EdgeMarker.js +34 -0
- package/src/charting/edgeMarkers/HalfArrowMarker.js +8 -0
- package/src/charting/edgeMarkers/HollowDiamondMarker.js +18 -0
- package/src/charting/edgeMarkers/HollowTriangleMarker.js +18 -0
- package/src/charting/edgeMarkers/OpenArrowMarker.js +17 -0
- package/src/charting/edgeMarkers/index.js +27 -0
- package/src/charting/edgeStyle/EdgeStyleCascade.js +22 -0
- package/src/charting/edgeStyle/EdgeStyleDialog.js +51 -0
- package/src/charting/edgeStyle/EdgeStyleSchema.js +43 -0
- package/src/charting/edgeStyle/SetStyleCommand.js +12 -0
- package/src/charting/edgeStyle/index.js +4 -0
- package/src/charting/emphasis/EmphasisRule.js +42 -0
- package/src/charting/emphasis/HighlightRule.js +24 -0
- package/src/charting/gauges/ArcTrack.js +51 -0
- package/src/charting/gauges/GaugeAnimation.js +51 -0
- package/src/charting/gauges/GaugeBands.js +48 -0
- package/src/charting/gauges/GaugeScale.js +87 -0
- package/src/charting/gauges/GaugeTrack.js +44 -0
- package/src/charting/gauges/GaugeValue.js +61 -0
- package/src/charting/gauges/HorizontalTrack.js +14 -0
- package/src/charting/gauges/LinearTrack.js +29 -0
- package/src/charting/gauges/Sparkline.js +42 -0
- package/src/charting/gauges/VerticalTrack.js +17 -0
- package/src/charting/glyphs/ArrowGlyph.js +21 -0
- package/src/charting/glyphs/BatteryGlyph.js +18 -0
- package/src/charting/glyphs/ChevronGlyph.js +18 -0
- package/src/charting/glyphs/CircleGlyph.js +15 -0
- package/src/charting/glyphs/CloudGlyph.js +19 -0
- package/src/charting/glyphs/ComponentGlyph.js +18 -0
- package/src/charting/glyphs/ConstraintGlyph.js +24 -0
- package/src/charting/glyphs/ContractBoxGlyph.js +10 -0
- package/src/charting/glyphs/CubeGlyph.js +19 -0
- package/src/charting/glyphs/CylinderGlyph.js +19 -0
- package/src/charting/glyphs/DashedDoubleArrowGlyph.js +11 -0
- package/src/charting/glyphs/DeviceGlyph.js +17 -0
- package/src/charting/glyphs/DiamondGlyph.js +17 -0
- package/src/charting/glyphs/DocumentGlyph.js +17 -0
- package/src/charting/glyphs/DoubleArrowGlyph.js +23 -0
- package/src/charting/glyphs/DoubleCircleGlyph.js +24 -0
- package/src/charting/glyphs/EllipseGlyph.js +18 -0
- package/src/charting/glyphs/FactoryGlyph.js +20 -0
- package/src/charting/glyphs/FlagGlyph.js +16 -0
- package/src/charting/glyphs/GapCircleGlyph.js +17 -0
- package/src/charting/glyphs/GearGlyph.js +37 -0
- package/src/charting/glyphs/Glyph.js +98 -0
- package/src/charting/glyphs/GroupingBoxGlyph.js +13 -0
- package/src/charting/glyphs/HalfCircleGlyph.js +22 -0
- package/src/charting/glyphs/HexagonGlyph.js +28 -0
- package/src/charting/glyphs/IconGlyph.js +22 -0
- package/src/charting/glyphs/ImageGlyph.js +16 -0
- package/src/charting/glyphs/JunctionGlyph.js +17 -0
- package/src/charting/glyphs/LollipopGlyph.js +22 -0
- package/src/charting/glyphs/MagnifierGlyph.js +17 -0
- package/src/charting/glyphs/NoteGlyph.js +33 -0
- package/src/charting/glyphs/ObjectBoxGlyph.js +21 -0
- package/src/charting/glyphs/OrJunctionGlyph.js +17 -0
- package/src/charting/glyphs/ParallelogramGlyph.js +20 -0
- package/src/charting/glyphs/PersonGlyph.js +23 -0
- package/src/charting/glyphs/PillGlyph.js +23 -0
- package/src/charting/glyphs/PinGlyph.js +18 -0
- package/src/charting/glyphs/PrincipleGlyph.js +23 -0
- package/src/charting/glyphs/ProductBoxGlyph.js +16 -0
- package/src/charting/glyphs/RectGlyph.js +15 -0
- package/src/charting/glyphs/RoundedBoxGlyph.js +13 -0
- package/src/charting/glyphs/StackGlyph.js +14 -0
- package/src/charting/glyphs/StepsGlyph.js +20 -0
- package/src/charting/glyphs/StickFigureGlyph.js +32 -0
- package/src/charting/glyphs/SystemSoftwareBoxGlyph.js +16 -0
- package/src/charting/glyphs/TabbedBoxGlyph.js +37 -0
- package/src/charting/glyphs/TargetGlyph.js +23 -0
- package/src/charting/glyphs/WavyBoxGlyph.js +17 -0
- package/src/charting/glyphs/WheelGlyph.js +28 -0
- package/src/charting/glyphs/drawGlyph.js +28 -0
- package/src/charting/glyphs/glyphSvg.js +55 -0
- package/src/charting/glyphs/index.js +109 -0
- package/src/charting/modelTree/AnalysisPanel.js +159 -0
- package/src/charting/modelTree/DiagramTabs.js +217 -0
- package/src/charting/modelTree/ModelTree.js +164 -0
- package/src/charting/modelTree/ModelTreePanel.js +914 -0
- package/src/charting/modelTree/TreeBuilder.js +238 -0
- package/src/charting/modelTree/TreeModeRegistry.js +51 -0
- package/src/charting/modelTree/TreeViewMode.js +110 -0
- package/src/charting/modelTree/buildFilterTrees.js +138 -0
- package/src/charting/modelTree/modes/FlatTreeMode.js +46 -0
- package/src/charting/modelTree/modes/LayerGroupedTreeMode.js +62 -0
- package/src/charting/modelTree/modes/TypeGroupedTreeMode.js +60 -0
- package/src/charting/modelTree/treeLayers.js +11 -0
- package/src/charting/report/reportHtml.js +82 -0
- package/src/charting/report/reportViewer.js +118 -0
- package/src/charting/shapes/CircleShape.js +19 -0
- package/src/charting/shapes/PathShape.js +17 -0
- package/src/charting/shapes/RectShape.js +20 -0
- package/src/charting/shapes/Shape.js +20 -0
- package/src/charting/shapes/ShapeFactory.js +23 -0
- package/src/charting/storage/LocalJsonStore.js +43 -0
- package/src/charting/templates/ActorTemplate.js +36 -0
- package/src/charting/templates/BoxTemplate.js +27 -0
- package/src/charting/templates/CircleTemplate.js +18 -0
- package/src/charting/templates/ClassTemplate.js +20 -0
- package/src/charting/templates/CloudTemplate.js +43 -0
- package/src/charting/templates/ComponentTemplate.js +19 -0
- package/src/charting/templates/CylinderTemplate.js +30 -0
- package/src/charting/templates/DataStoreTemplate.js +16 -0
- package/src/charting/templates/DiamondTemplate.js +10 -0
- package/src/charting/templates/DocumentTemplate.js +32 -0
- package/src/charting/templates/EllipseTemplate.js +15 -0
- package/src/charting/templates/FinalStateTemplate.js +12 -0
- package/src/charting/templates/GlyphTemplate.js +47 -0
- package/src/charting/templates/HexagonTemplate.js +17 -0
- package/src/charting/templates/LifelineTemplate.js +20 -0
- package/src/charting/templates/ManualInputTemplate.js +12 -0
- package/src/charting/templates/NoteTemplate.js +23 -0
- package/src/charting/templates/OctagonTemplate.js +7 -0
- package/src/charting/templates/PackageTemplate.js +25 -0
- package/src/charting/templates/ParallelogramTemplate.js +11 -0
- package/src/charting/templates/PentagonTemplate.js +5 -0
- package/src/charting/templates/PolygonTemplate.js +18 -0
- package/src/charting/templates/PredefinedProcessTemplate.js +13 -0
- package/src/charting/templates/RectangleTemplate.js +28 -0
- package/src/charting/templates/RegularPolygonTemplate.js +21 -0
- package/src/charting/templates/RoundedRectangleTemplate.js +5 -0
- package/src/charting/templates/StadiumTemplate.js +8 -0
- package/src/charting/templates/StarTemplate.js +17 -0
- package/src/charting/templates/SwimlaneTemplate.js +18 -0
- package/src/charting/templates/Template.js +208 -0
- package/src/charting/templates/TrapezoidTemplate.js +11 -0
- package/src/charting/templates/TriangleTemplate.js +12 -0
- package/src/charting/templates/index.js +31 -0
- package/src/charting/templates/outline.js +59 -0
- package/src/charting/templates/svg.js +19 -0
- package/src/charting/textToShapes.js +61 -0
- package/src/charting/toolbar/ToolbarButton.js +38 -0
- package/src/charting/toolbar/ToolbarCheckbox.js +31 -0
- package/src/charting/toolbar/ToolbarItem.js +19 -0
- package/src/charting/toolbar/ToolbarMenu.js +36 -0
- package/src/charting/toolbar/ToolbarSelect.js +38 -0
- package/src/charting/toolbar/ToolbarSeparator.js +7 -0
- package/src/charting/toolbar/ToolbarText.js +22 -0
- package/src/charting/toolbar/index.js +8 -0
- package/src/charting/toolbar/pickFile.js +14 -0
- package/src/charting/viewDecorations.js +85 -0
- package/src/charting/zOrder.js +57 -0
- package/src/csvTable.js +61 -0
- package/src/datamodel.js +122 -0
- package/src/datawindow/BoundedWindow.js +36 -0
- package/src/datawindow/FlatDataWindow.js +34 -0
- package/src/datawindow/GraphDataWindow.js +40 -0
- package/src/datawindow/GroupedSampleDataWindow.js +16 -0
- package/src/datawindow/SeriesDataWindow.js +42 -0
- package/src/datawindow/index.js +31 -0
- package/src/diagramCatalog.js +30 -0
- package/src/ebnfDiagram.js +57 -0
- package/src/ebnfParser.js +129 -0
- package/src/exportImage.js +233 -0
- package/src/index.js +2636 -0
- package/src/itIcons.js +84 -0
- package/src/kernelExpr.js +243 -0
- package/src/propertiesDialog.js +463 -0
- package/src/railroadDiagram.js +571 -0
- package/src/treeModeCatalog.js +16 -0
- package/src/workspace/ContextBus.js +79 -0
- package/src/workspace/EditorShell.js +67 -0
- package/src/workspace/Part.js +163 -0
- package/src/workspace/PartFactory.js +49 -0
- package/src/workspace/PartRegistry.js +86 -0
- package/src/workspace/Workspace.js +321 -0
- package/src/workspace/archimateServices.js +33 -0
- package/src/workspace/dom.js +120 -0
- package/src/workspace/index.js +75 -0
- package/src/workspace/layout/GridNode.js +280 -0
- package/src/workspace/layout/LayoutNode.js +89 -0
- package/src/workspace/layout/PartNode.js +77 -0
- package/src/workspace/layout/SplitNode.js +114 -0
- package/src/workspace/layout/TabsNode.js +191 -0
- package/src/workspace/layout/index.js +24 -0
- package/src/workspace/parts/AdapterPart.js +33 -0
- package/src/workspace/parts/ArchimateCanvasPart.js +345 -0
- package/src/workspace/parts/ArchimateEditorPart.js +79 -0
- package/src/workspace/parts/ChartPart.js +115 -0
- package/src/workspace/parts/ContentPart.js +34 -0
- package/src/workspace/parts/DetailPart.js +46 -0
- package/src/workspace/parts/DiagramEditorPart.js +135 -0
- package/src/workspace/parts/EditorPart.js +388 -0
- package/src/workspace/parts/HtmlPart.js +25 -0
- package/src/workspace/parts/ListPart.js +57 -0
- package/src/workspace/parts/ModelFile.js +187 -0
- package/src/workspace/parts/ModelsPart.js +135 -0
- package/src/workspace/styles.js +258 -0
- package/src/workspace/themes.js +96 -0
- package/src/workspace/workArea.js +413 -0
- package/src/workspace/workAreaModel.js +197 -0
- package/src/workspace.js +16 -0
- package/src/zip/ZipArchive.js +160 -0
- package/src/zip/crc32.js +25 -0
- 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 ? ` · <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
|
+
}
|