@peter.prib/renderengine 0.0.0-stage → 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (436) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +203 -2
  3. package/REFERENCE.md +2159 -0
  4. package/dist/renderengine-workspace.umd.js +45944 -0
  5. package/dist/renderengine.umd.js +41262 -0
  6. package/examples/archimate.html +66 -0
  7. package/examples/diagram-editor.html +51 -0
  8. package/package.json +65 -4
  9. package/src/BaseRenderer.js +57 -0
  10. package/src/CanvasRenderer.js +194 -0
  11. package/src/Mat4.js +111 -0
  12. package/src/OrbitCamera.js +57 -0
  13. package/src/RendererFactory.js +50 -0
  14. package/src/SVGRenderer.js +439 -0
  15. package/src/archimate.js +723 -0
  16. package/src/archimateArchiFormat.js +1693 -0
  17. package/src/archimateArchiTypes.js +72 -0
  18. package/src/archimateArchive.js +140 -0
  19. package/src/archimateCSV.js +127 -0
  20. package/src/archimateDrawio.js +182 -0
  21. package/src/archimateExchangeFormat.js +546 -0
  22. package/src/archimateRelationshipTable.js +93 -0
  23. package/src/archimateSpecializations.js +161 -0
  24. package/src/chartCatalog.js +544 -0
  25. package/src/charting/ArchimateDiagramEditor.js +1624 -0
  26. package/src/charting/ArchimateSpecializationSelector.js +134 -0
  27. package/src/charting/Axis.js +68 -0
  28. package/src/charting/CameraSeeder.js +30 -0
  29. package/src/charting/CatalogDialog.js +92 -0
  30. package/src/charting/Chart.js +37 -0
  31. package/src/charting/Chart3D.js +99 -0
  32. package/src/charting/ChartBox.js +80 -0
  33. package/src/charting/ChartData.js +27 -0
  34. package/src/charting/ChartRegistry.js +76 -0
  35. package/src/charting/CheckboxTreeSelector.js +304 -0
  36. package/src/charting/ColorField.js +107 -0
  37. package/src/charting/ColorPalette.js +88 -0
  38. package/src/charting/CommandHistory.js +176 -0
  39. package/src/charting/DataFilter.js +52 -0
  40. package/src/charting/Diagram.js +36 -0
  41. package/src/charting/Diagram3D.js +29 -0
  42. package/src/charting/DiagramClipboard.js +31 -0
  43. package/src/charting/DiagramEditor.js +3330 -0
  44. package/src/charting/DiagramEditorCommand.js +110 -0
  45. package/src/charting/DiagramEditorCommands.js +237 -0
  46. package/src/charting/DiagramEditorEdgeCommands.js +142 -0
  47. package/src/charting/DiagramEditorState.js +98 -0
  48. package/src/charting/DiagramRegistry.js +86 -0
  49. package/src/charting/DiagramTypeRegistry.js +326 -0
  50. package/src/charting/DiagramViewPropertiesDialog.js +46 -0
  51. package/src/charting/Edge.js +113 -0
  52. package/src/charting/ErrorBars.js +37 -0
  53. package/src/charting/FilterSystem.js +285 -0
  54. package/src/charting/FindReplaceDialog.js +139 -0
  55. package/src/charting/FormDialog.js +385 -0
  56. package/src/charting/Gauge.js +52 -0
  57. package/src/charting/Hierarchy.js +175 -0
  58. package/src/charting/HintPanel.js +86 -0
  59. package/src/charting/ImageSelector.js +148 -0
  60. package/src/charting/InteractionManager.js +725 -0
  61. package/src/charting/Legend.js +58 -0
  62. package/src/charting/MenuBar.js +62 -0
  63. package/src/charting/ModelFileFormat.js +115 -0
  64. package/src/charting/OrbitControls.js +77 -0
  65. package/src/charting/Palette.js +119 -0
  66. package/src/charting/PopupMenu.js +117 -0
  67. package/src/charting/PropertiesPanel.js +155 -0
  68. package/src/charting/PropertyListEditor.js +96 -0
  69. package/src/charting/PropertyLog.js +92 -0
  70. package/src/charting/SettingsCascade.js +93 -0
  71. package/src/charting/SettingsDialog.js +53 -0
  72. package/src/charting/SettingsManager.js +179 -0
  73. package/src/charting/SettingsViewPropertiesDialog.js +58 -0
  74. package/src/charting/ShapePaths.js +27 -0
  75. package/src/charting/Statistics.js +134 -0
  76. package/src/charting/TemplateCatalog.js +59 -0
  77. package/src/charting/TemplateLibrary.js +103 -0
  78. package/src/charting/TextStyle.js +168 -0
  79. package/src/charting/ViewFit.js +55 -0
  80. package/src/charting/ViewMenu.js +70 -0
  81. package/src/charting/ViewPropertiesDialog.js +77 -0
  82. package/src/charting/ViewTabStrip.js +81 -0
  83. package/src/charting/archimate/ArchiFileFormat.js +32 -0
  84. package/src/charting/archimate/ArchimateCanvasEditor.js +815 -0
  85. package/src/charting/archimate/ArchimateCsvFileFormat.js +35 -0
  86. package/src/charting/archimate/ArchimateEdge.js +137 -0
  87. package/src/charting/archimate/ArchimateElementTemplate.js +195 -0
  88. package/src/charting/archimate/ArchimatePalette.js +102 -0
  89. package/src/charting/archimate/CsvImportDialog.js +105 -0
  90. package/src/charting/archimate/CustomViewpoints.js +74 -0
  91. package/src/charting/archimate/DerivedEdge.js +29 -0
  92. package/src/charting/archimate/DrawioFileFormat.js +24 -0
  93. package/src/charting/archimate/ElementFilterRule.js +21 -0
  94. package/src/charting/archimate/ExchangeFileFormat.js +28 -0
  95. package/src/charting/archimate/ViewGroupTemplate.js +137 -0
  96. package/src/charting/archimate/ViewLineEdge.js +84 -0
  97. package/src/charting/archimate/ViewpointRule.js +45 -0
  98. package/src/charting/archimate/archimateFileFormats.js +12 -0
  99. package/src/charting/archimate/archimateNames.js +5 -0
  100. package/src/charting/archimate/csvMapping.js +122 -0
  101. package/src/charting/archimate/elementMenuItems.js +32 -0
  102. package/src/charting/archimate/elementProperties.js +146 -0
  103. package/src/charting/archimate/elementTypeChoices.js +7 -0
  104. package/src/charting/archimate/elementTypeGroups.js +19 -0
  105. package/src/charting/archimate/index.js +17 -0
  106. package/src/charting/archimate/specializationCatalogDialog.js +64 -0
  107. package/src/charting/archimate/typeGlyph.js +29 -0
  108. package/src/charting/arrangement/Arrangement.js +112 -0
  109. package/src/charting/arrangement/ArrangementCommand.js +29 -0
  110. package/src/charting/arrangement/BackgroundCommand.js +41 -0
  111. package/src/charting/arrangement/BackgroundGroup.js +18 -0
  112. package/src/charting/arrangement/GroupCommand.js +46 -0
  113. package/src/charting/arrangement/ItemGroup.js +62 -0
  114. package/src/charting/arrangement/LockCommand.js +32 -0
  115. package/src/charting/arrangement/UngroupCommand.js +27 -0
  116. package/src/charting/arrangement/alignment.js +88 -0
  117. package/src/charting/arrangement/arrangeMenuItems.js +25 -0
  118. package/src/charting/arrangement/index.js +11 -0
  119. package/src/charting/arrangement/layouts.js +233 -0
  120. package/src/charting/canvas/ArchiHint.js +78 -0
  121. package/src/charting/canvas/CanvasBoxKind.js +39 -0
  122. package/src/charting/canvas/CanvasPalette.js +49 -0
  123. package/src/charting/canvas/CanvasTemplateLibrary.js +61 -0
  124. package/src/charting/canvas/CanvasTemplateMenu.js +151 -0
  125. package/src/charting/canvas/EditHintCommand.js +28 -0
  126. package/src/charting/canvas/canvasBoxKinds.js +27 -0
  127. package/src/charting/canvas/canvasBoxMenuItems.js +40 -0
  128. package/src/charting/canvas/defaultCanvasTemplates.js +186 -0
  129. package/src/charting/canvas/diagramBoxKinds.js +12 -0
  130. package/src/charting/canvas/hintMenuItems.js +49 -0
  131. package/src/charting/charts/AreaChart.js +71 -0
  132. package/src/charting/charts/BarChart.js +80 -0
  133. package/src/charting/charts/BarChart3D.js +56 -0
  134. package/src/charting/charts/BarChart3DOrbit.js +53 -0
  135. package/src/charting/charts/BarChartBase.js +70 -0
  136. package/src/charting/charts/BarGauge.js +21 -0
  137. package/src/charting/charts/BoxPlotChart.js +41 -0
  138. package/src/charting/charts/BubbleChart.js +99 -0
  139. package/src/charting/charts/BubbleChart3D.js +78 -0
  140. package/src/charting/charts/BulletGauge.js +91 -0
  141. package/src/charting/charts/CalendarHeatmapChart.js +204 -0
  142. package/src/charting/charts/CandlestickChart.js +54 -0
  143. package/src/charting/charts/ChordDiagram.js +130 -0
  144. package/src/charting/charts/DensityChart.js +73 -0
  145. package/src/charting/charts/DialGauge.js +37 -0
  146. package/src/charting/charts/DonutChart.js +15 -0
  147. package/src/charting/charts/FunnelChart.js +47 -0
  148. package/src/charting/charts/GanttChart.js +201 -0
  149. package/src/charting/charts/GaugeChart.js +47 -0
  150. package/src/charting/charts/GeoMapChart.js +146 -0
  151. package/src/charting/charts/GroupedBarChart.js +88 -0
  152. package/src/charting/charts/GroupedDistributionChart.js +70 -0
  153. package/src/charting/charts/HeatmapChart.js +80 -0
  154. package/src/charting/charts/HierarchyChart.js +39 -0
  155. package/src/charting/charts/HistogramChart.js +45 -0
  156. package/src/charting/charts/LagPlotChart.js +41 -0
  157. package/src/charting/charts/LineChart.js +124 -0
  158. package/src/charting/charts/OutlineChart.js +95 -0
  159. package/src/charting/charts/ParallelCoordinatesChart.js +130 -0
  160. package/src/charting/charts/PieChart.js +56 -0
  161. package/src/charting/charts/PipeChart.js +88 -0
  162. package/src/charting/charts/PopulationPyramidChart.js +106 -0
  163. package/src/charting/charts/QQPlotChart.js +64 -0
  164. package/src/charting/charts/RadarChart.js +76 -0
  165. package/src/charting/charts/RadialBarChart.js +96 -0
  166. package/src/charting/charts/SankeyDiagram.js +174 -0
  167. package/src/charting/charts/ScatterChart.js +104 -0
  168. package/src/charting/charts/StackedAreaChart.js +15 -0
  169. package/src/charting/charts/StackedBarChart.js +33 -0
  170. package/src/charting/charts/StackedBarChart3DOrbit.js +58 -0
  171. package/src/charting/charts/StreamGraphChart.js +131 -0
  172. package/src/charting/charts/SunburstChart.js +57 -0
  173. package/src/charting/charts/TreemapChart.js +54 -0
  174. package/src/charting/charts/ViolinChart.js +37 -0
  175. package/src/charting/charts/WaterfallChart.js +66 -0
  176. package/src/charting/charts/WordCloudChart.js +104 -0
  177. package/src/charting/diagramModel/AddViewCommand.js +33 -0
  178. package/src/charting/diagramModel/DiagramModel.js +39 -0
  179. package/src/charting/diagramModel/DiagramModelSearch.js +22 -0
  180. package/src/charting/diagramModel/DiagramView.js +50 -0
  181. package/src/charting/diagramModel/ModelHistory.js +43 -0
  182. package/src/charting/diagramModel/ModelReport.js +153 -0
  183. package/src/charting/diagramModel/ModelSearch.js +223 -0
  184. package/src/charting/diagramModel/RemoveViewCommand.js +25 -0
  185. package/src/charting/diagramModel/RenameViewCommand.js +21 -0
  186. package/src/charting/diagramModel/ReplaceTextCommand.js +25 -0
  187. package/src/charting/diagramModel/ViewSetChecker.js +34 -0
  188. package/src/charting/diagramModel/ViewSetModel.js +243 -0
  189. package/src/charting/diagramModel/index.js +6 -0
  190. package/src/charting/diagramModel/nameTransforms.js +29 -0
  191. package/src/charting/diagrams/ArchimateCommands.js +141 -0
  192. package/src/charting/diagrams/ArchimateDiagram.js +263 -0
  193. package/src/charting/diagrams/ArchimateModel.js +1155 -0
  194. package/src/charting/diagrams/ArchimateModelChecker.js +125 -0
  195. package/src/charting/diagrams/ArchimateModelReport.js +128 -0
  196. package/src/charting/diagrams/ArchimateModelSearch.js +41 -0
  197. package/src/charting/diagrams/ArchimateValidator.js +357 -0
  198. package/src/charting/diagrams/CanvasView.js +112 -0
  199. package/src/charting/diagrams/ContextMenu.js +37 -0
  200. package/src/charting/diagrams/DataModelDiagram.js +86 -0
  201. package/src/charting/diagrams/DataModelRelationshipStrategy.js +38 -0
  202. package/src/charting/diagrams/DerivedRelationships.js +102 -0
  203. package/src/charting/diagrams/EbnfDiagram.js +39 -0
  204. package/src/charting/diagrams/EdgeGeometry.js +553 -0
  205. package/src/charting/diagrams/EditViewItemCommand.js +128 -0
  206. package/src/charting/diagrams/ElementInstance.js +157 -0
  207. package/src/charting/diagrams/GraphDiagram.js +1340 -0
  208. package/src/charting/diagrams/GraphDiagram3D.js +152 -0
  209. package/src/charting/diagrams/GraphMetrics.js +81 -0
  210. package/src/charting/diagrams/GridOverlay.js +137 -0
  211. package/src/charting/diagrams/ImportRowsCommand.js +62 -0
  212. package/src/charting/diagrams/LabelHelper.js +108 -0
  213. package/src/charting/diagrams/MergeElementsCommand.js +101 -0
  214. package/src/charting/diagrams/NestInstanceCommand.js +34 -0
  215. package/src/charting/diagrams/NodeGeometry.js +158 -0
  216. package/src/charting/diagrams/PlaceItemsCommand.js +77 -0
  217. package/src/charting/diagrams/RadialLayout.js +101 -0
  218. package/src/charting/diagrams/RelationshipInstance.js +93 -0
  219. package/src/charting/diagrams/RemoveGroupFromViewCommand.js +28 -0
  220. package/src/charting/diagrams/RemoveLineCommand.js +27 -0
  221. package/src/charting/diagrams/ShowElementCommand.js +43 -0
  222. package/src/charting/diagrams/SvgCoordinate.js +17 -0
  223. package/src/charting/diagrams/SvgZoom.js +127 -0
  224. package/src/charting/diagrams/Tooltip.js +62 -0
  225. package/src/charting/diagrams/ViewConnectionInstance.js +102 -0
  226. package/src/charting/diagrams/ViewObjectInstance.js +56 -0
  227. package/src/charting/diagrams/commands/AddEdgeCommand.js +34 -0
  228. package/src/charting/diagrams/commands/AddNodeCommand.js +28 -0
  229. package/src/charting/diagrams/commands/AddWaypointCommand.js +27 -0
  230. package/src/charting/diagrams/commands/CreateFolderCommand.js +27 -0
  231. package/src/charting/diagrams/commands/DeleteEdgeCommand.js +30 -0
  232. package/src/charting/diagrams/commands/DeleteFolderCommand.js +47 -0
  233. package/src/charting/diagrams/commands/DeleteNodeCommand.js +35 -0
  234. package/src/charting/diagrams/commands/DeleteWaypointCommand.js +24 -0
  235. package/src/charting/diagrams/commands/GraphCommand.js +65 -0
  236. package/src/charting/diagrams/commands/InvertEdgeCommand.js +24 -0
  237. package/src/charting/diagrams/commands/MoveNodeCommand.js +44 -0
  238. package/src/charting/diagrams/commands/MoveWaypointCommand.js +27 -0
  239. package/src/charting/diagrams/commands/RenameEdgeCommand.js +23 -0
  240. package/src/charting/diagrams/commands/RenameFolderCommand.js +31 -0
  241. package/src/charting/diagrams/commands/RenameNodeCommand.js +27 -0
  242. package/src/charting/diagrams/commands/ResizeNodeCommand.js +46 -0
  243. package/src/charting/diagrams/commands/UpdateEdgeSideCommand.js +40 -0
  244. package/src/charting/diagrams/commands/index.js +17 -0
  245. package/src/charting/diagrams/duplicates.js +49 -0
  246. package/src/charting/diagrams/nesting.js +30 -0
  247. package/src/charting/diagrams/roadmap.js +77 -0
  248. package/src/charting/edgeMarkers/ArrowMarker.js +15 -0
  249. package/src/charting/edgeMarkers/CircleMarker.js +13 -0
  250. package/src/charting/edgeMarkers/CrowsFootMarker.js +16 -0
  251. package/src/charting/edgeMarkers/DiamondMarker.js +15 -0
  252. package/src/charting/edgeMarkers/EdgeMarker.js +34 -0
  253. package/src/charting/edgeMarkers/HalfArrowMarker.js +8 -0
  254. package/src/charting/edgeMarkers/HollowDiamondMarker.js +18 -0
  255. package/src/charting/edgeMarkers/HollowTriangleMarker.js +18 -0
  256. package/src/charting/edgeMarkers/OpenArrowMarker.js +17 -0
  257. package/src/charting/edgeMarkers/index.js +27 -0
  258. package/src/charting/edgeStyle/EdgeStyleCascade.js +22 -0
  259. package/src/charting/edgeStyle/EdgeStyleDialog.js +51 -0
  260. package/src/charting/edgeStyle/EdgeStyleSchema.js +43 -0
  261. package/src/charting/edgeStyle/SetStyleCommand.js +12 -0
  262. package/src/charting/edgeStyle/index.js +4 -0
  263. package/src/charting/emphasis/EmphasisRule.js +42 -0
  264. package/src/charting/emphasis/HighlightRule.js +24 -0
  265. package/src/charting/glyphs/ArrowGlyph.js +21 -0
  266. package/src/charting/glyphs/BatteryGlyph.js +18 -0
  267. package/src/charting/glyphs/ChevronGlyph.js +18 -0
  268. package/src/charting/glyphs/CircleGlyph.js +15 -0
  269. package/src/charting/glyphs/CloudGlyph.js +19 -0
  270. package/src/charting/glyphs/ComponentGlyph.js +18 -0
  271. package/src/charting/glyphs/ConstraintGlyph.js +24 -0
  272. package/src/charting/glyphs/ContractBoxGlyph.js +10 -0
  273. package/src/charting/glyphs/CubeGlyph.js +19 -0
  274. package/src/charting/glyphs/CylinderGlyph.js +19 -0
  275. package/src/charting/glyphs/DashedDoubleArrowGlyph.js +11 -0
  276. package/src/charting/glyphs/DeviceGlyph.js +17 -0
  277. package/src/charting/glyphs/DiamondGlyph.js +17 -0
  278. package/src/charting/glyphs/DocumentGlyph.js +17 -0
  279. package/src/charting/glyphs/DoubleArrowGlyph.js +23 -0
  280. package/src/charting/glyphs/DoubleCircleGlyph.js +24 -0
  281. package/src/charting/glyphs/EllipseGlyph.js +18 -0
  282. package/src/charting/glyphs/FactoryGlyph.js +20 -0
  283. package/src/charting/glyphs/FlagGlyph.js +16 -0
  284. package/src/charting/glyphs/GapCircleGlyph.js +17 -0
  285. package/src/charting/glyphs/GearGlyph.js +37 -0
  286. package/src/charting/glyphs/Glyph.js +98 -0
  287. package/src/charting/glyphs/GroupingBoxGlyph.js +13 -0
  288. package/src/charting/glyphs/HalfCircleGlyph.js +22 -0
  289. package/src/charting/glyphs/HexagonGlyph.js +28 -0
  290. package/src/charting/glyphs/IconGlyph.js +22 -0
  291. package/src/charting/glyphs/ImageGlyph.js +16 -0
  292. package/src/charting/glyphs/JunctionGlyph.js +17 -0
  293. package/src/charting/glyphs/LollipopGlyph.js +22 -0
  294. package/src/charting/glyphs/MagnifierGlyph.js +17 -0
  295. package/src/charting/glyphs/NoteGlyph.js +33 -0
  296. package/src/charting/glyphs/ObjectBoxGlyph.js +21 -0
  297. package/src/charting/glyphs/OrJunctionGlyph.js +17 -0
  298. package/src/charting/glyphs/ParallelogramGlyph.js +20 -0
  299. package/src/charting/glyphs/PersonGlyph.js +23 -0
  300. package/src/charting/glyphs/PillGlyph.js +23 -0
  301. package/src/charting/glyphs/PinGlyph.js +18 -0
  302. package/src/charting/glyphs/PrincipleGlyph.js +23 -0
  303. package/src/charting/glyphs/ProductBoxGlyph.js +16 -0
  304. package/src/charting/glyphs/RectGlyph.js +15 -0
  305. package/src/charting/glyphs/RoundedBoxGlyph.js +13 -0
  306. package/src/charting/glyphs/StackGlyph.js +14 -0
  307. package/src/charting/glyphs/StepsGlyph.js +20 -0
  308. package/src/charting/glyphs/StickFigureGlyph.js +32 -0
  309. package/src/charting/glyphs/SystemSoftwareBoxGlyph.js +16 -0
  310. package/src/charting/glyphs/TabbedBoxGlyph.js +37 -0
  311. package/src/charting/glyphs/TargetGlyph.js +23 -0
  312. package/src/charting/glyphs/WavyBoxGlyph.js +17 -0
  313. package/src/charting/glyphs/WheelGlyph.js +28 -0
  314. package/src/charting/glyphs/drawGlyph.js +28 -0
  315. package/src/charting/glyphs/glyphSvg.js +55 -0
  316. package/src/charting/glyphs/index.js +109 -0
  317. package/src/charting/modelTree/AnalysisPanel.js +159 -0
  318. package/src/charting/modelTree/DiagramTabs.js +217 -0
  319. package/src/charting/modelTree/ModelTree.js +164 -0
  320. package/src/charting/modelTree/ModelTreePanel.js +914 -0
  321. package/src/charting/modelTree/TreeBuilder.js +238 -0
  322. package/src/charting/modelTree/TreeModeRegistry.js +51 -0
  323. package/src/charting/modelTree/TreeViewMode.js +110 -0
  324. package/src/charting/modelTree/buildFilterTrees.js +138 -0
  325. package/src/charting/modelTree/modes/FlatTreeMode.js +46 -0
  326. package/src/charting/modelTree/modes/LayerGroupedTreeMode.js +62 -0
  327. package/src/charting/modelTree/modes/TypeGroupedTreeMode.js +60 -0
  328. package/src/charting/modelTree/treeLayers.js +11 -0
  329. package/src/charting/report/reportHtml.js +82 -0
  330. package/src/charting/report/reportViewer.js +118 -0
  331. package/src/charting/shapes/CircleShape.js +19 -0
  332. package/src/charting/shapes/PathShape.js +17 -0
  333. package/src/charting/shapes/RectShape.js +20 -0
  334. package/src/charting/shapes/Shape.js +20 -0
  335. package/src/charting/shapes/ShapeFactory.js +23 -0
  336. package/src/charting/storage/LocalJsonStore.js +43 -0
  337. package/src/charting/templates/ActorTemplate.js +36 -0
  338. package/src/charting/templates/BoxTemplate.js +27 -0
  339. package/src/charting/templates/CircleTemplate.js +18 -0
  340. package/src/charting/templates/ClassTemplate.js +20 -0
  341. package/src/charting/templates/CloudTemplate.js +43 -0
  342. package/src/charting/templates/ComponentTemplate.js +19 -0
  343. package/src/charting/templates/CylinderTemplate.js +30 -0
  344. package/src/charting/templates/DataStoreTemplate.js +16 -0
  345. package/src/charting/templates/DiamondTemplate.js +10 -0
  346. package/src/charting/templates/DocumentTemplate.js +32 -0
  347. package/src/charting/templates/EllipseTemplate.js +15 -0
  348. package/src/charting/templates/FinalStateTemplate.js +12 -0
  349. package/src/charting/templates/GlyphTemplate.js +47 -0
  350. package/src/charting/templates/HexagonTemplate.js +17 -0
  351. package/src/charting/templates/LifelineTemplate.js +20 -0
  352. package/src/charting/templates/ManualInputTemplate.js +12 -0
  353. package/src/charting/templates/NoteTemplate.js +23 -0
  354. package/src/charting/templates/OctagonTemplate.js +7 -0
  355. package/src/charting/templates/PackageTemplate.js +25 -0
  356. package/src/charting/templates/ParallelogramTemplate.js +11 -0
  357. package/src/charting/templates/PentagonTemplate.js +5 -0
  358. package/src/charting/templates/PolygonTemplate.js +18 -0
  359. package/src/charting/templates/PredefinedProcessTemplate.js +13 -0
  360. package/src/charting/templates/RectangleTemplate.js +28 -0
  361. package/src/charting/templates/RegularPolygonTemplate.js +21 -0
  362. package/src/charting/templates/RoundedRectangleTemplate.js +5 -0
  363. package/src/charting/templates/StadiumTemplate.js +8 -0
  364. package/src/charting/templates/StarTemplate.js +17 -0
  365. package/src/charting/templates/SwimlaneTemplate.js +18 -0
  366. package/src/charting/templates/Template.js +208 -0
  367. package/src/charting/templates/TrapezoidTemplate.js +11 -0
  368. package/src/charting/templates/TriangleTemplate.js +12 -0
  369. package/src/charting/templates/index.js +31 -0
  370. package/src/charting/templates/outline.js +59 -0
  371. package/src/charting/templates/svg.js +19 -0
  372. package/src/charting/textToShapes.js +61 -0
  373. package/src/charting/toolbar/ToolbarButton.js +38 -0
  374. package/src/charting/toolbar/ToolbarCheckbox.js +31 -0
  375. package/src/charting/toolbar/ToolbarItem.js +19 -0
  376. package/src/charting/toolbar/ToolbarMenu.js +36 -0
  377. package/src/charting/toolbar/ToolbarSelect.js +38 -0
  378. package/src/charting/toolbar/ToolbarSeparator.js +7 -0
  379. package/src/charting/toolbar/ToolbarText.js +22 -0
  380. package/src/charting/toolbar/index.js +8 -0
  381. package/src/charting/toolbar/pickFile.js +14 -0
  382. package/src/charting/viewDecorations.js +85 -0
  383. package/src/charting/zOrder.js +57 -0
  384. package/src/csvTable.js +61 -0
  385. package/src/datamodel.js +122 -0
  386. package/src/datawindow/BoundedWindow.js +36 -0
  387. package/src/datawindow/FlatDataWindow.js +34 -0
  388. package/src/datawindow/GraphDataWindow.js +40 -0
  389. package/src/datawindow/GroupedSampleDataWindow.js +16 -0
  390. package/src/datawindow/SeriesDataWindow.js +42 -0
  391. package/src/datawindow/index.js +31 -0
  392. package/src/diagramCatalog.js +30 -0
  393. package/src/ebnfDiagram.js +57 -0
  394. package/src/ebnfParser.js +129 -0
  395. package/src/exportImage.js +233 -0
  396. package/src/index.js +2564 -0
  397. package/src/itIcons.js +84 -0
  398. package/src/kernelExpr.js +243 -0
  399. package/src/propertiesDialog.js +463 -0
  400. package/src/railroadDiagram.js +571 -0
  401. package/src/treeModeCatalog.js +16 -0
  402. package/src/workspace/ContextBus.js +79 -0
  403. package/src/workspace/EditorShell.js +67 -0
  404. package/src/workspace/Part.js +163 -0
  405. package/src/workspace/PartFactory.js +49 -0
  406. package/src/workspace/PartRegistry.js +86 -0
  407. package/src/workspace/Workspace.js +321 -0
  408. package/src/workspace/archimateServices.js +33 -0
  409. package/src/workspace/dom.js +120 -0
  410. package/src/workspace/index.js +75 -0
  411. package/src/workspace/layout/GridNode.js +280 -0
  412. package/src/workspace/layout/LayoutNode.js +89 -0
  413. package/src/workspace/layout/PartNode.js +77 -0
  414. package/src/workspace/layout/SplitNode.js +114 -0
  415. package/src/workspace/layout/TabsNode.js +191 -0
  416. package/src/workspace/layout/index.js +24 -0
  417. package/src/workspace/parts/AdapterPart.js +33 -0
  418. package/src/workspace/parts/ArchimateCanvasPart.js +345 -0
  419. package/src/workspace/parts/ArchimateEditorPart.js +79 -0
  420. package/src/workspace/parts/ChartPart.js +115 -0
  421. package/src/workspace/parts/ContentPart.js +34 -0
  422. package/src/workspace/parts/DetailPart.js +46 -0
  423. package/src/workspace/parts/DiagramEditorPart.js +135 -0
  424. package/src/workspace/parts/EditorPart.js +388 -0
  425. package/src/workspace/parts/HtmlPart.js +25 -0
  426. package/src/workspace/parts/ListPart.js +57 -0
  427. package/src/workspace/parts/ModelFile.js +187 -0
  428. package/src/workspace/parts/ModelsPart.js +135 -0
  429. package/src/workspace/styles.js +258 -0
  430. package/src/workspace/themes.js +96 -0
  431. package/src/workspace/workArea.js +413 -0
  432. package/src/workspace/workAreaModel.js +197 -0
  433. package/src/workspace.js +16 -0
  434. package/src/zip/ZipArchive.js +160 -0
  435. package/src/zip/crc32.js +25 -0
  436. package/src/zip/inflate.js +159 -0
@@ -0,0 +1,28 @@
1
+ import { Glyph } from './Glyph.js';
2
+
3
+ /** Material: a hexagon, flat top and bottom, with the spec's two slashes and underscore. */
4
+ export class HexagonGlyph extends Glyph {
5
+ static key = 'hexagon';
6
+ static ownsInterior = true;
7
+
8
+ parts(ctx) {
9
+ const { w, h } = ctx;
10
+ const G = Glyph, st = (k) => this.stroke(ctx, k);
11
+ const pts = [0, 1, 2, 3, 4, 5].map(i => {
12
+ const a = (Math.PI / 3) * i;
13
+ return [Math.cos(a) * w / 2, Math.sin(a) * h / 2];
14
+ });
15
+ return G.group([
16
+ G.path(`M${pts.map(p => p.join(',')).join(' L')}Z`, ctx.color, st()),
17
+ G.path(
18
+ `M ${-w * 0.16},${-h * 0.18} L ${-w * 0.06},${h * 0.10}`
19
+ + ` M ${w * 0.04},${-h * 0.18} L ${w * 0.14},${h * 0.10}`
20
+ + ` M ${-w * 0.18},${h * 0.26} L ${w * 0.06},${h * 0.26}`,
21
+ 'none', st(0.75)),
22
+ ]);
23
+ }
24
+ outline(ctx) {
25
+ const { w, h } = ctx;
26
+ return [0, 1, 2, 3, 4, 5].map(i => [Math.cos((Math.PI / 3) * i) * w / 2, Math.sin((Math.PI / 3) * i) * h / 2]);
27
+ }
28
+ }
@@ -0,0 +1,22 @@
1
+ import { Glyph } from './Glyph.js';
2
+
3
+ /** A box with the node's own icon (`iconUrl` or `icon` text) large in the middle. */
4
+ export class IconGlyph extends Glyph {
5
+ static key = 'icon';
6
+ static ownsInterior = true;
7
+
8
+ parts(ctx) {
9
+ const { w, h } = ctx;
10
+ const G = Glyph, st = (k) => this.stroke(ctx, k);
11
+ const rx = Glyph.cornerRadius(ctx.cornerStyle, w, h);
12
+ const parts = [G.rect(-w / 2, -h / 2, w, h, ctx.color, st(), { rx })];
13
+ if (ctx.iconUrl) {
14
+ const imgSize = Math.min(w, h) * 0.7;
15
+ parts.push(G.image(ctx.iconUrl, -imgSize / 2, -imgSize / 2, imgSize, imgSize, { 'pointer-events': 'none' }));
16
+ } else if (ctx.icon) {
17
+ const iconSize = Math.min(w, h) * 0.6;
18
+ parts.push(G.text(ctx.icon, 0, 0, { fill: '#fff', textAnchor: 'middle', verticalAlign: 'middle', fontSize: `${iconSize}px`, 'pointer-events': 'none' }));
19
+ }
20
+ return G.group(parts);
21
+ }
22
+ }
@@ -0,0 +1,16 @@
1
+ import { Glyph } from './Glyph.js';
2
+
3
+ /** A picture filling the box (`iconUrl`), with a light border showing its bounds. */
4
+ export class ImageGlyph extends Glyph {
5
+ static key = 'image';
6
+ static ownsInterior = true;
7
+
8
+ parts(ctx) {
9
+ const { w, h } = ctx;
10
+ const G = Glyph, st = (k) => this.stroke(ctx, k);
11
+ return G.group([
12
+ G.rect(-w / 2, -h / 2, w, h, 'none', { color: '#ccc', width: 1 }),
13
+ G.image(ctx.iconUrl || '', -w / 2, -h / 2, w, h, { preserveAspectRatio: 'none', 'pointer-events': 'none' }),
14
+ ]);
15
+ }
16
+ }
@@ -0,0 +1,17 @@
1
+ import { sampleArc } from '../templates/outline.js';
2
+ import { Glyph } from './Glyph.js';
3
+
4
+ /** (And) Junction: a small solid dot. */
5
+ export class JunctionGlyph extends Glyph {
6
+ static key = 'junction';
7
+ static ownsInterior = true;
8
+
9
+ parts(ctx) {
10
+ const G = Glyph, st = (k) => this.stroke(ctx, k);
11
+ return G.circle(0, 0, ctx.circleR * 0.4, ctx.strokeColor, st(0.75));
12
+ }
13
+ outline(ctx) {
14
+ const r = ctx.circleR * 0.4;
15
+ return sampleArc(0, 0, r, r, 0, Math.PI * 2, 24).slice(0, -1);
16
+ }
17
+ }
@@ -0,0 +1,22 @@
1
+ import { Glyph } from './Glyph.js';
2
+
3
+ /** Interface: a stub line into a small circle. */
4
+ export class LollipopGlyph extends Glyph {
5
+ static key = 'lollipop';
6
+ static ownsInterior = true;
7
+
8
+ parts(ctx) {
9
+ const { w, h } = ctx;
10
+ const G = Glyph, st = (k) => this.stroke(ctx, k);
11
+ const cr = Math.min(w, h) * 0.28;
12
+ return G.group([
13
+ G.path(`M ${-w / 2},0 L ${w / 2 - cr * 2},0`, 'none', st(1.25)),
14
+ G.circle(w / 2 - cr, 0, cr, ctx.color, st()),
15
+ ]);
16
+ }
17
+ /** The stub and circle: full width, the circle's height. */
18
+ outline(ctx) {
19
+ const cr = Math.min(ctx.w, ctx.h) * 0.28;
20
+ return [[-ctx.w / 2, -cr], [ctx.w / 2, -cr], [ctx.w / 2, cr], [-ctx.w / 2, cr]];
21
+ }
22
+ }
@@ -0,0 +1,17 @@
1
+ import { Glyph } from './Glyph.js';
2
+
3
+ /** Assessment: a magnifying glass. */
4
+ export class MagnifierGlyph extends Glyph {
5
+ static key = 'magnifier';
6
+ static ownsInterior = true;
7
+
8
+ parts(ctx) {
9
+ const { w, h } = ctx;
10
+ const G = Glyph, st = (k) => this.stroke(ctx, k);
11
+ const gr = Math.min(w, h) * 0.30, cx = w * 0.10, cy = -h * 0.12;
12
+ return G.group([
13
+ G.circle(cx, cy, gr, ctx.color, st()),
14
+ G.path(`M ${cx - gr * 0.72},${cy + gr * 0.72} L ${-w * 0.40},${h * 0.44}`, 'none', st(1.25)),
15
+ ]);
16
+ }
17
+ }
@@ -0,0 +1,33 @@
1
+ import { Glyph } from './Glyph.js';
2
+
3
+ /**
4
+ * A sticky note: a body with a folded bottom-right corner (a view annotation,
5
+ * not an element), yellow unless the note has a fill of its own (ctx.ownFill);
6
+ * the fold a shade darker.
7
+ */
8
+ export class NoteGlyph extends Glyph {
9
+ static DEFAULT_FILL = '#fff9c4';
10
+ static DEFAULT_FOLD = '#e8df9e';
11
+
12
+ static key = 'note';
13
+ static ownsInterior = true;
14
+
15
+ parts(ctx) {
16
+ const { w, h } = ctx;
17
+ const G = Glyph, st = (k) => this.stroke(ctx, k);
18
+ const fold = Math.min(w, h) * 0.22;
19
+ const noteFill = ctx.ownFill || NoteGlyph.DEFAULT_FILL;
20
+ const noteStroke = { color: '#b8ad76', width: 1.2 };
21
+ const outline = `M ${-w / 2},${-h / 2} L ${w / 2},${-h / 2} L ${w / 2},${h / 2 - fold} L ${w / 2 - fold},${h / 2} L ${-w / 2},${h / 2} Z`;
22
+ const flap = `M ${w / 2 - fold},${h / 2} L ${w / 2},${h / 2 - fold} L ${w / 2},${h / 2} Z`;
23
+ return G.group([G.path(outline, noteFill, noteStroke), G.path(flap, ctx.ownFill ? NoteGlyph.shade(noteFill) : NoteGlyph.DEFAULT_FOLD, noteStroke)]);
24
+ }
25
+
26
+ /** A colour a shade darker (the fold); one it cannot read (none, a name) as it is. */
27
+ static shade(colour, factor = 0.88) {
28
+ const m = String(colour).match(/^#([0-9a-f]{3}|[0-9a-f]{6})$/i);
29
+ if (!m) return colour;
30
+ const hex = m[1].length === 3 ? [...m[1]].map(c => c + c).join('') : m[1];
31
+ return '#' + [0, 2, 4].map(i => Math.round(parseInt(hex.slice(i, i + 2), 16) * factor).toString(16).padStart(2, '0')).join('');
32
+ }
33
+ }
@@ -0,0 +1,21 @@
1
+ import { Glyph } from './Glyph.js';
2
+
3
+ /** Business/Data Object: a box with one bar under its top. */
4
+ export class ObjectBoxGlyph extends Glyph {
5
+ static key = 'object-box';
6
+ static ownsInterior = true;
7
+
8
+ parts(ctx) {
9
+ const { w, h } = ctx;
10
+ const G = Glyph, st = (k) => this.stroke(ctx, k);
11
+ return G.group([
12
+ G.rect(-w / 2, -h / 2, w, h, ctx.color, st()),
13
+ G.path(this.bars(h).map(y => `M ${-w / 2},${y} L ${w / 2},${y}`).join(' '), 'none', st()),
14
+ ]);
15
+ }
16
+
17
+ /** Heights of the bars across the box. */
18
+ bars(h) {
19
+ return [-h * 0.22];
20
+ }
21
+ }
@@ -0,0 +1,17 @@
1
+ import { sampleArc } from '../templates/outline.js';
2
+ import { Glyph } from './Glyph.js';
3
+
4
+ /** (Or) Junction: the same dot, hollow. */
5
+ export class OrJunctionGlyph extends Glyph {
6
+ static key = 'junction-or';
7
+ static ownsInterior = true;
8
+
9
+ parts(ctx) {
10
+ const G = Glyph, st = (k) => this.stroke(ctx, k);
11
+ return G.circle(0, 0, ctx.circleR * 0.4, '#ffffff', st());
12
+ }
13
+ outline(ctx) {
14
+ const r = ctx.circleR * 0.4;
15
+ return sampleArc(0, 0, r, r, 0, Math.PI * 2, 24).slice(0, -1);
16
+ }
17
+ }
@@ -0,0 +1,20 @@
1
+ import { Glyph } from './Glyph.js';
2
+
3
+ /** Requirement: a skewed box. */
4
+ export class ParallelogramGlyph extends Glyph {
5
+ static key = 'parallelogram';
6
+ static ownsInterior = true;
7
+
8
+ parts(ctx) {
9
+ const { w, h } = ctx;
10
+ const G = Glyph, st = (k) => this.stroke(ctx, k);
11
+ const skew = w * 0.15;
12
+ const d = `M ${-w / 2 + skew},${-h / 2} L ${w / 2},${-h / 2} L ${w / 2 - skew},${h / 2} L ${-w / 2},${h / 2} Z`;
13
+ return G.path(d, ctx.color, st());
14
+ }
15
+ outline(ctx) {
16
+ const { w, h } = ctx;
17
+ const skew = w * 0.15;
18
+ return [[-w / 2 + skew, -h / 2], [w / 2, -h / 2], [w / 2 - skew, h / 2], [-w / 2, h / 2]];
19
+ }
20
+ }
@@ -0,0 +1,23 @@
1
+ import { Glyph } from './Glyph.js';
2
+
3
+ /** A disc with a white head-and-shoulders silhouette. */
4
+ export class PersonGlyph extends Glyph {
5
+ static key = 'person';
6
+ static ownsInterior = true;
7
+
8
+ parts(ctx) {
9
+ const G = Glyph, st = (k) => this.stroke(ctx, k);
10
+ const r = ctx.circleR;
11
+ const headR = r * 0.30;
12
+ const headY = -(r * 0.28);
13
+ const neckY = headY + headR + r * 0.05;
14
+ const bodyW = r * 0.55;
15
+ const bodyH = r * 0.88;
16
+ const bodyPath = `M ${-bodyW},${bodyH} Q ${-bodyW},${neckY} 0,${neckY} Q ${bodyW},${neckY} ${bodyW},${bodyH} Z`;
17
+ return G.group([
18
+ G.circle(0, 0, r, ctx.color, st()),
19
+ G.circle(0, headY, headR, '#fff', null, { opacity: 0.92 }),
20
+ G.path(bodyPath, '#fff', null, { opacity: 0.92 }),
21
+ ]);
22
+ }
23
+ }
@@ -0,0 +1,23 @@
1
+ import { sampleArc } from '../templates/outline.js';
2
+ import { Glyph } from './Glyph.js';
3
+
4
+ /** Service: a fully rounded "stadium" box. */
5
+ export class PillGlyph extends Glyph {
6
+ static key = 'pill';
7
+ static ownsInterior = true;
8
+
9
+ parts(ctx) {
10
+ const { w, h } = ctx;
11
+ const G = Glyph, st = (k) => this.stroke(ctx, k);
12
+ return G.rect(-w / 2, -h / 2, w, h, ctx.color, st(), { rx: h / 2 });
13
+ }
14
+ /** Two semicircular caps joined by straight sides. */
15
+ outline(ctx) {
16
+ const { w, h } = ctx;
17
+ const r = Math.min(h / 2, w / 2), cx = w / 2 - r;
18
+ return [
19
+ ...sampleArc(cx, 0, r, r, -Math.PI / 2, Math.PI / 2, 16),
20
+ ...sampleArc(-cx, 0, r, r, Math.PI / 2, Math.PI * 1.5, 16),
21
+ ];
22
+ }
23
+ }
@@ -0,0 +1,18 @@
1
+ import { Glyph } from './Glyph.js';
2
+
3
+ /** Location: a map pin. */
4
+ export class PinGlyph extends Glyph {
5
+ static key = 'pin';
6
+ static ownsInterior = true;
7
+
8
+ parts(ctx) {
9
+ const { w, h } = ctx;
10
+ const G = Glyph, st = (k) => this.stroke(ctx, k);
11
+ const hr = Math.min(w, h) * 0.36, cy = -h / 2 + hr;
12
+ return G.path(
13
+ `M 0,${h / 2} C ${-hr * 0.78},${cy + hr * 1.05} ${-hr},${cy + hr * 0.55} ${-hr},${cy}`
14
+ + ` A ${hr} ${hr} 0 1 1 ${hr},${cy}`
15
+ + ` C ${hr},${cy + hr * 0.55} ${hr * 0.78},${cy + hr * 1.05} 0,${h / 2} Z`,
16
+ ctx.color, st());
17
+ }
18
+ }
@@ -0,0 +1,23 @@
1
+ import { Glyph } from './Glyph.js';
2
+
3
+ /** Principle: a rounded square with an exclamation mark. */
4
+ export class PrincipleGlyph extends Glyph {
5
+ static key = 'principle';
6
+ static ownsInterior = true;
7
+
8
+ parts(ctx) {
9
+ const { w, h } = ctx;
10
+ const G = Glyph, st = (k) => this.stroke(ctx, k);
11
+ const s = Math.min(w, h) * 0.7;
12
+ return G.group([
13
+ G.rect(-s / 2, -s / 2, s, s, ctx.color, st(), { rx: s * 0.15 }),
14
+ G.path(`M0,${-s * 0.30} L0,${s * 0.06}`, 'none', { color: ctx.strokeColor, width: s * 0.17 }),
15
+ G.circle(0, s * 0.27, s * 0.095, ctx.strokeColor, null),
16
+ ]);
17
+ }
18
+ /** The square it draws, smaller than its box. */
19
+ outline(ctx) {
20
+ const s = Math.min(ctx.w, ctx.h) * 0.7;
21
+ return [[-s / 2, -s / 2], [s / 2, -s / 2], [s / 2, s / 2], [-s / 2, s / 2]];
22
+ }
23
+ }
@@ -0,0 +1,16 @@
1
+ import { Glyph } from './Glyph.js';
2
+
3
+ /** Product: a box with a short bar, top-left only. */
4
+ export class ProductBoxGlyph extends Glyph {
5
+ static key = 'product-box';
6
+ static ownsInterior = true;
7
+
8
+ parts(ctx) {
9
+ const { w, h } = ctx;
10
+ const G = Glyph, st = (k) => this.stroke(ctx, k);
11
+ return G.group([
12
+ G.rect(-w / 2, -h / 2, w, h, ctx.color, st()),
13
+ G.path(`M ${-w / 2},${-h * 0.22} L ${-w * 0.1},${-h * 0.22} L ${-w * 0.1},${-h / 2}`, 'none', st()),
14
+ ]);
15
+ }
16
+ }
@@ -0,0 +1,15 @@
1
+ import { Glyph } from './Glyph.js';
2
+
3
+ /** A box; `cornerStyle` picks sharp, rounded or chamfered (ArchiMate Motivation) corners. */
4
+ export class RectGlyph extends Glyph {
5
+ static key = 'rect';
6
+
7
+ parts(ctx) {
8
+ const { w, h } = ctx;
9
+ const G = Glyph, st = (k) => this.stroke(ctx, k);
10
+ if (ctx.cornerStyle === 'chamfered') return G.path(Glyph.chamferedRectPath(w, h), ctx.color, st());
11
+ // undefined (plain graphDiagram) -> a small rx 3; 'sharp' is a real 0; 'rounded' (ArchiMate
12
+ // behavior) is quite round, capped so a small box doesn't turn circular.
13
+ return G.rect(-w / 2, -h / 2, w, h, ctx.color, st(), { rx: Glyph.cornerRadius(ctx.cornerStyle, w, h) });
14
+ }
15
+ }
@@ -0,0 +1,13 @@
1
+ import { Glyph } from './Glyph.js';
2
+
3
+ /** Work Package: a plain rounded box. */
4
+ export class RoundedBoxGlyph extends Glyph {
5
+ static key = 'rounded-box';
6
+ static ownsInterior = true;
7
+
8
+ parts(ctx) {
9
+ const { w, h } = ctx;
10
+ const G = Glyph, st = (k) => this.stroke(ctx, k);
11
+ return G.rect(-w / 2, -h / 2, w, h, ctx.color, st(), { rx: Math.min(w, h) * 0.22 });
12
+ }
13
+ }
@@ -0,0 +1,14 @@
1
+ import { Glyph } from './Glyph.js';
2
+
3
+ /** Plateau: three stacked bars. */
4
+ export class StackGlyph extends Glyph {
5
+ static key = 'stack';
6
+ static ownsInterior = true;
7
+
8
+ parts(ctx) {
9
+ const { w, h } = ctx;
10
+ const G = Glyph, st = (k) => this.stroke(ctx, k);
11
+ const barH = h * 0.15, gap = h * 0.25, bw = w * 0.86;
12
+ return G.group([-gap, 0, gap].map(dy => G.rect(-bw / 2, dy - barH / 2, bw, barH, ctx.strokeColor, null)));
13
+ }
14
+ }
@@ -0,0 +1,20 @@
1
+ import { Glyph } from './Glyph.js';
2
+
3
+ /** Capability: an ascending staircase of squares. */
4
+ export class StepsGlyph extends Glyph {
5
+ static key = 'steps';
6
+ static ownsInterior = true;
7
+
8
+ parts(ctx) {
9
+ const { w, h } = ctx;
10
+ const G = Glyph, st = (k) => this.stroke(ctx, k);
11
+ const cols = 3, cellW = w / cols, cellH = h / cols;
12
+ const parts = [];
13
+ for (let col = 0; col < cols; col++) {
14
+ for (let row = cols - 1 - col; row < cols; row++) {
15
+ parts.push(G.rect(-w / 2 + col * cellW, -h / 2 + row * cellH, cellW, cellH, ctx.color, st(0.75)));
16
+ }
17
+ }
18
+ return G.group(parts);
19
+ }
20
+ }
@@ -0,0 +1,32 @@
1
+ import { Glyph } from './Glyph.js';
2
+
3
+ /** Business Actor: the spec's stick figure. */
4
+ export class StickFigureGlyph extends Glyph {
5
+ static key = 'stick-figure';
6
+ static ownsInterior = true;
7
+
8
+ parts(ctx) {
9
+ const { w, h } = ctx;
10
+ const G = Glyph, st = (k) => this.stroke(ctx, k);
11
+ const s = Math.min(w, h);
12
+ const headR = s * 0.17;
13
+ const headCy = -s / 2 + headR;
14
+ const neckY = headCy + headR;
15
+ const hipY = neckY + s * 0.26;
16
+ const footY = s / 2;
17
+ const armY = neckY + s * 0.07;
18
+ return G.group([
19
+ G.circle(0, headCy, headR, ctx.color, st()),
20
+ G.path(
21
+ `M0,${neckY} L0,${hipY}`
22
+ + ` M${-s * 0.30},${armY} L${s * 0.30},${armY}`
23
+ + ` M0,${hipY} L${-s * 0.26},${footY} M0,${hipY} L${s * 0.26},${footY}`,
24
+ 'none', st(1.4)),
25
+ ]);
26
+ }
27
+ /** The figure's own extent: arm span by head-to-feet. */
28
+ outline(ctx) {
29
+ const s = Math.min(ctx.w, ctx.h);
30
+ return [[-s * 0.30, -s / 2], [s * 0.30, -s / 2], [s * 0.30, s / 2], [-s * 0.30, s / 2]];
31
+ }
32
+ }
@@ -0,0 +1,16 @@
1
+ import { Glyph } from './Glyph.js';
2
+
3
+ /** System Software: a box with a circle on it. */
4
+ export class SystemSoftwareBoxGlyph extends Glyph {
5
+ static key = 'system-software-box';
6
+ static ownsInterior = true;
7
+
8
+ parts(ctx) {
9
+ const { w, h } = ctx;
10
+ const G = Glyph, st = (k) => this.stroke(ctx, k);
11
+ return G.group([
12
+ G.rect(-w / 2, -h / 2, w, h, ctx.color, st()),
13
+ G.circle(w * 0.22, -h * 0.08, Math.min(w, h) * 0.26, ctx.color, st()),
14
+ ]);
15
+ }
16
+ }
@@ -0,0 +1,37 @@
1
+ import { Glyph } from './Glyph.js';
2
+
3
+ /** How tall the tab is, and its share of the width (capped), as Archi draws a group. */
4
+ export const TAB_HEIGHT = 18;
5
+ const TAB_SHARE = 0.5, TAB_MAX = 160;
6
+
7
+ /**
8
+ * Archi's group: a box with a name tab on its top-left corner. The tab is
9
+ * part of the outline, so lines end at it; `ctx.size` is the whole shape,
10
+ * tab included.
11
+ */
12
+ export class TabbedBoxGlyph extends Glyph {
13
+ static key = 'tabbed-box';
14
+ static ownsInterior = true;
15
+
16
+ /** The tab's width for a shape `w` wide. */
17
+ static tabWidth(w) {
18
+ return Math.min(w * TAB_SHARE, TAB_MAX);
19
+ }
20
+
21
+ parts(ctx) {
22
+ const { w, h } = ctx;
23
+ const tab = TabbedBoxGlyph.tabWidth(w);
24
+ const st = this.stroke(ctx);
25
+ return Glyph.group([
26
+ Glyph.rect(-w / 2, -h / 2, tab, TAB_HEIGHT, ctx.color, st),
27
+ Glyph.rect(-w / 2, -h / 2 + TAB_HEIGHT, w, h - TAB_HEIGHT, ctx.color, st),
28
+ ]);
29
+ }
30
+
31
+ outline(ctx) {
32
+ const { w, h } = ctx;
33
+ const tab = TabbedBoxGlyph.tabWidth(w);
34
+ const top = -h / 2, body = top + TAB_HEIGHT;
35
+ return [[-w / 2, top], [-w / 2 + tab, top], [-w / 2 + tab, body], [w / 2, body], [w / 2, h / 2], [-w / 2, h / 2]];
36
+ }
37
+ }
@@ -0,0 +1,23 @@
1
+ import { sampleArc } from '../templates/outline.js';
2
+ import { Glyph } from './Glyph.js';
3
+
4
+ /** Goal/Outcome/Course of Action: a bullseye. */
5
+ export class TargetGlyph extends Glyph {
6
+ static key = 'target';
7
+ static ownsInterior = true;
8
+
9
+ parts(ctx) {
10
+ const G = Glyph, st = (k) => this.stroke(ctx, k);
11
+ const rr = ctx.circleR * 0.92;
12
+ return G.group([
13
+ G.circle(0, 0, rr, ctx.color, st()),
14
+ G.circle(0, 0, rr * 0.62, 'none', st()),
15
+ G.circle(0, 0, rr * 0.26, ctx.strokeColor, null),
16
+ ]);
17
+ }
18
+ /** The bullseye's outer ring. */
19
+ outline(ctx) {
20
+ const r = ctx.circleR * 0.92;
21
+ return sampleArc(0, 0, r, r, 0, Math.PI * 2, 48).slice(0, -1);
22
+ }
23
+ }
@@ -0,0 +1,17 @@
1
+ import { Glyph } from './Glyph.js';
2
+
3
+ /** Representation/Deliverable: a box with a wavy bottom edge. */
4
+ export class WavyBoxGlyph extends Glyph {
5
+ static key = 'wavy-box';
6
+ static ownsInterior = true;
7
+
8
+ parts(ctx) {
9
+ const { w, h } = ctx;
10
+ const G = Glyph, st = (k) => this.stroke(ctx, k);
11
+ const y0 = h * 0.30, amp = h * 0.22;
12
+ return G.path(
13
+ `M ${-w / 2},${-h / 2} L ${w / 2},${-h / 2} L ${w / 2},${y0}`
14
+ + ` Q ${w * 0.25},${y0 + amp} 0,${y0} Q ${-w * 0.25},${y0 - amp} ${-w / 2},${y0} Z`,
15
+ ctx.color, st());
16
+ }
17
+ }
@@ -0,0 +1,28 @@
1
+ import { sampleArc } from '../templates/outline.js';
2
+ import { Glyph } from './Glyph.js';
3
+
4
+ /** Driver: a steering wheel (rim, spokes, hub). */
5
+ export class WheelGlyph extends Glyph {
6
+ static key = 'wheel';
7
+ static ownsInterior = true;
8
+
9
+ parts(ctx) {
10
+ const G = Glyph, st = (k) => this.stroke(ctx, k);
11
+ const gr = ctx.circleR * 0.9, spokes = 8;
12
+ let spokePaths = '';
13
+ for (let i = 0; i < spokes; i++) {
14
+ const a = (i / spokes) * Math.PI * 2;
15
+ spokePaths += `M0,0 L${Math.cos(a) * gr * 0.85},${Math.sin(a) * gr * 0.85} `;
16
+ }
17
+ return G.group([
18
+ G.circle(0, 0, gr * 0.9, 'none', { color: ctx.strokeColor, width: gr * 0.2 }),
19
+ G.path(spokePaths, 'none', st(1.25)),
20
+ G.circle(0, 0, gr * 0.26, ctx.strokeColor, null),
21
+ ]);
22
+ }
23
+ /** The rim's outer edge. */
24
+ outline(ctx) {
25
+ const r = ctx.circleR * 0.9;
26
+ return sampleArc(0, 0, r, r, 0, Math.PI * 2, 48).slice(0, -1);
27
+ }
28
+ }
@@ -0,0 +1,28 @@
1
+ /**
2
+ * Replay a glyph's descriptor tree (see Glyph) through a renderer's
3
+ * primitives. A group is created before its children, as hand-written
4
+ * drawing code does, so the renderer's element map keeps the same order.
5
+ * @returns {Element} the drawn element (a group for a group descriptor)
6
+ */
7
+ export function drawGlyph(renderer, part) {
8
+ const el = part.type === 'group' ? drawGroup(renderer, part) : drawOne(renderer, part);
9
+ for (const [name, value] of Object.entries(part.attrs ?? {})) el.setAttribute(name, value);
10
+ return el;
11
+ }
12
+
13
+ function drawGroup(renderer, part) {
14
+ const group = renderer.group();
15
+ for (const child of part.children) group.appendChild(drawGlyph(renderer, child));
16
+ return group;
17
+ }
18
+
19
+ function drawOne(renderer, part) {
20
+ switch (part.type) {
21
+ case 'rect': return renderer.rect(part.x, part.y, part.w, part.h, part.fill, part.stroke, part.extra);
22
+ case 'circle': return renderer.circle(part.cx, part.cy, part.r, part.fill, part.stroke);
23
+ case 'path': return renderer.path(part.d, part.fill, part.stroke);
24
+ case 'image': return renderer.image(part.href, part.x, part.y, part.w, part.h, part.options);
25
+ case 'text': return renderer.text(part.text, part.x, part.y, part.options);
26
+ default: throw new TypeError(`Unknown glyph part "${part.type}"`);
27
+ }
28
+ }
@@ -0,0 +1,55 @@
1
+ import { svgEl } from '../templates/svg.js';
2
+
3
+ /**
4
+ * The SVG tag, attributes and text for one glyph part, by the same rules the
5
+ * SVG renderer applies to its primitives (an unset fill is `none`; a stroke
6
+ * gives `stroke` and `stroke-width`), so a glyph drawn by the editor's
7
+ * templates looks like the one the graph engine draws. Pure: no DOM.
8
+ * @returns {{tag: string, attrs: Object, text?: string, children?: Array}}
9
+ */
10
+ export function glyphElement(part) {
11
+ const stroke = (s) => (s ? { stroke: s.color || 'none', 'stroke-width': s.width || 1 } : {});
12
+ const withAttrs = (attrs) => ({ ...attrs, ...(part.attrs ?? {}) });
13
+ switch (part.type) {
14
+ case 'group':
15
+ return { tag: 'g', attrs: withAttrs({}), children: part.children.map(glyphElement) };
16
+ case 'rect':
17
+ return { tag: 'rect', attrs: withAttrs({ x: part.x, y: part.y, width: part.w, height: part.h, fill: part.fill || 'none', ...(part.extra ?? {}), ...stroke(part.stroke) }) };
18
+ case 'circle':
19
+ return { tag: 'circle', attrs: withAttrs({ cx: part.cx, cy: part.cy, r: part.r, fill: part.fill || 'none', ...stroke(part.stroke) }) };
20
+ case 'path':
21
+ return { tag: 'path', attrs: withAttrs({ d: part.d, fill: part.fill || 'none', ...stroke(part.stroke) }) };
22
+ case 'image': {
23
+ const o = part.options ?? {};
24
+ return {
25
+ tag: 'image',
26
+ attrs: { href: part.href, x: part.x, y: part.y, width: part.w, height: part.h, preserveAspectRatio: o.preserveAspectRatio || 'xMidYMid meet', 'pointer-events': o['pointer-events'] },
27
+ };
28
+ }
29
+ case 'text': {
30
+ const o = part.options ?? {};
31
+ return {
32
+ tag: 'text',
33
+ text: part.text,
34
+ attrs: {
35
+ x: part.x, y: part.y, fill: o.fill || 'black', 'font-family': o.fontFamily || 'sans-serif',
36
+ 'font-size': o.fontSize || '12px', 'text-anchor': o.textAnchor || 'start',
37
+ 'dominant-baseline': o.verticalAlign === 'middle' ? 'middle' : null, 'pointer-events': o['pointer-events'],
38
+ },
39
+ };
40
+ }
41
+ default:
42
+ throw new TypeError(`Unknown glyph part "${part.type}"`);
43
+ }
44
+ }
45
+
46
+ /** Build a glyph's parts as SVG elements (a group stays a <g>). */
47
+ export function glyphToSvg(part, doc = document) {
48
+ const build = ({ tag, attrs, text, children }) => {
49
+ const el = svgEl(tag, attrs, doc);
50
+ if (text !== undefined) el.textContent = text;
51
+ for (const child of children ?? []) el.appendChild(build(child));
52
+ return el;
53
+ };
54
+ return build(glyphElement(part));
55
+ }