sirena 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.
- checksums.yaml +7 -0
- data/.github/workflows/build_deploy.yml +59 -0
- data/.github/workflows/links.yml +85 -0
- data/.github/workflows/rake.yml +15 -0
- data/.github/workflows/release.yml +27 -0
- data/.gitignore +68 -0
- data/.rspec +3 -0
- data/.rubocop.yml +14 -0
- data/.rubocop_todo.yml +70 -0
- data/ARCHITECTURE.md +744 -0
- data/Gemfile +12 -0
- data/LICENSE +25 -0
- data/README.adoc +357 -0
- data/Rakefile +11 -0
- data/docs/.gitignore +1 -0
- data/docs/Gemfile +13 -0
- data/docs/_config.yml +182 -0
- data/docs/_diagram_types/architecture-diagram.adoc +314 -0
- data/docs/_diagram_types/block-diagram.adoc +345 -0
- data/docs/_diagram_types/c4-diagram.adoc +559 -0
- data/docs/_diagram_types/class-diagram.adoc +816 -0
- data/docs/_diagram_types/er-diagram.adoc +719 -0
- data/docs/_diagram_types/error-diagram.adoc +114 -0
- data/docs/_diagram_types/examples/flowchart-examples.adoc +29 -0
- data/docs/_diagram_types/flowchart.adoc +488 -0
- data/docs/_diagram_types/gantt-chart.adoc +502 -0
- data/docs/_diagram_types/git-graph.adoc +600 -0
- data/docs/_diagram_types/index.adoc +192 -0
- data/docs/_diagram_types/info-diagram.adoc +103 -0
- data/docs/_diagram_types/kanban-diagram.adoc +262 -0
- data/docs/_diagram_types/mindmap.adoc +603 -0
- data/docs/_diagram_types/packet-diagram.adoc +378 -0
- data/docs/_diagram_types/pie-chart.adoc +335 -0
- data/docs/_diagram_types/quadrant-chart.adoc +406 -0
- data/docs/_diagram_types/radar-chart.adoc +528 -0
- data/docs/_diagram_types/requirement-diagram.adoc +416 -0
- data/docs/_diagram_types/sankey-diagram.adoc +357 -0
- data/docs/_diagram_types/sequence-diagram.adoc +664 -0
- data/docs/_diagram_types/state-diagram.adoc +658 -0
- data/docs/_diagram_types/timeline.adoc +352 -0
- data/docs/_diagram_types/treemap-diagram.adoc +462 -0
- data/docs/_diagram_types/user-journey.adoc +602 -0
- data/docs/_features/index.adoc +129 -0
- data/docs/_guides/cli-reference.adoc +203 -0
- data/docs/_guides/index.adoc +56 -0
- data/docs/_guides/installation.adoc +100 -0
- data/docs/_guides/quick-start.adoc +132 -0
- data/docs/_pages/comparison.adoc +441 -0
- data/docs/_pages/compatibility.adoc +300 -0
- data/docs/_pages/index.adoc +39 -0
- data/docs/_references/index.adoc +103 -0
- data/docs/_tutorials/index.adoc +57 -0
- data/docs/index.adoc +166 -0
- data/docs/lychee.toml +54 -0
- data/examples/.gitignore +10 -0
- data/examples/README.adoc +196 -0
- data/examples/README.md +64 -0
- data/examples/architecture/01-basic-services.mmd +9 -0
- data/examples/architecture/01-basic-services.svg +37 -0
- data/examples/architecture/02-service-groups.mmd +16 -0
- data/examples/architecture/02-service-groups.svg +55 -0
- data/examples/architecture/README.adoc +79 -0
- data/examples/block/01-basic-blocks.mmd +13 -0
- data/examples/block/01-basic-blocks.svg +44 -0
- data/examples/block/02-block-shapes.mmd +13 -0
- data/examples/block/02-block-shapes.svg +47 -0
- data/examples/block/README.adoc +85 -0
- data/examples/c4/01-context-diagram.mmd +10 -0
- data/examples/c4/01-context-diagram.svg +45 -0
- data/examples/c4/02-container-diagram.mmd +24 -0
- data/examples/c4/02-container-diagram.svg +105 -0
- data/examples/c4/README.adoc +92 -0
- data/examples/class_diagram/01-basic-classes.mmd +61 -0
- data/examples/class_diagram/01-basic-classes.svg +117 -0
- data/examples/class_diagram/02-relationships.mmd +61 -0
- data/examples/class_diagram/02-relationships.svg +129 -0
- data/examples/class_diagram/README.adoc +93 -0
- data/examples/er_diagram/01-basic-entities.mmd +64 -0
- data/examples/er_diagram/01-basic-entities.svg +5 -0
- data/examples/er_diagram/02-cardinality.mmd +57 -0
- data/examples/er_diagram/02-cardinality.svg +125 -0
- data/examples/er_diagram/README.adoc +88 -0
- data/examples/error/01-basic-error.mmd +1 -0
- data/examples/error/01-basic-error.svg +13 -0
- data/examples/error/02-error-display.mmd +1 -0
- data/examples/error/02-error-display.svg +13 -0
- data/examples/error/README.adoc +71 -0
- data/examples/error_message_example.svg +13 -0
- data/examples/flowchart/00-original.mmd +13 -0
- data/examples/flowchart/00-original.svg +5 -0
- data/examples/flowchart/01-basic-flow.mmd +7 -0
- data/examples/flowchart/01-basic-flow.svg +52 -0
- data/examples/flowchart/01-basic-flow.yml +13 -0
- data/examples/flowchart/02*.svg +87 -0
- data/examples/flowchart/02-node-shapes.mmd +9 -0
- data/examples/flowchart/02-node-shapes.svg +33 -0
- data/examples/flowchart/03-edge-types.mmd +7 -0
- data/examples/flowchart/03-edge-types.svg +53 -0
- data/examples/flowchart/04-subgraphs.mmd +9 -0
- data/examples/flowchart/04-subgraphs.svg +33 -0
- data/examples/flowchart/05-styling.mmd +9 -0
- data/examples/flowchart/05-styling.svg +33 -0
- data/examples/flowchart/06-complex-flow.mmd +8 -0
- data/examples/flowchart/06-complex-flow.svg +59 -0
- data/examples/flowchart/README.adoc +167 -0
- data/examples/gantt/01-simple-timeline.* +14 -0
- data/examples/gantt/01-simple-timeline.mmd +6 -0
- data/examples/gantt/01-simple-timeline.svg +26 -0
- data/examples/gantt/02-task-dependencies.mmd +6 -0
- data/examples/gantt/02-task-dependencies.svg +26 -0
- data/examples/gantt/README.adoc +86 -0
- data/examples/git_graph/01-linear-history.mmd +12 -0
- data/examples/git_graph/01-linear-history.svg +26 -0
- data/examples/git_graph/02-branching.mmd +12 -0
- data/examples/git_graph/02-branching.svg +26 -0
- data/examples/git_graph/README.adoc +73 -0
- data/examples/info/02-showinfo.mmd +1 -0
- data/examples/info/02-showinfo.svg +10 -0
- data/examples/info/README.adoc +58 -0
- data/examples/info_showinfo_example.svg +10 -0
- data/examples/kanban/01-simple-board.mmd +8 -0
- data/examples/kanban/01-simple-board.svg +43 -0
- data/examples/kanban/02-workflow.mmd +8 -0
- data/examples/kanban/02-workflow.svg +43 -0
- data/examples/kanban/README.adoc +79 -0
- data/examples/mindmap/01-simple-tree.mmd +19 -0
- data/examples/mindmap/01-simple-tree.svg +61 -0
- data/examples/mindmap/02-knowledge-map.mmd +19 -0
- data/examples/mindmap/02-knowledge-map.svg +61 -0
- data/examples/mindmap/README.adoc +77 -0
- data/examples/packet/01-basic-packet.* +17 -0
- data/examples/packet/01-basic-packet.mmd +4 -0
- data/examples/packet/01-basic-packet.svg +82 -0
- data/examples/packet/README.adoc +58 -0
- data/examples/pie/01-simple-chart.mmd +5 -0
- data/examples/pie/01-simple-chart.svg +17 -0
- data/examples/pie/02-labeled-slices.mmd +6 -0
- data/examples/pie/02-labeled-slices.svg +19 -0
- data/examples/pie/README.adoc +75 -0
- data/examples/quadrant/01-basic-quadrant.mmd +13 -0
- data/examples/quadrant/01-basic-quadrant.svg +33 -0
- data/examples/quadrant/02-positioned-items.mmd +14 -0
- data/examples/quadrant/02-positioned-items.svg +35 -0
- data/examples/quadrant/README.adoc +84 -0
- data/examples/radar/01-simple-radar.* +5 -0
- data/examples/radar/01-simple-radar.mmd +3 -0
- data/examples/radar/01-simple-radar.svg +25 -0
- data/examples/radar/02-multiple-curves.mmd +4 -0
- data/examples/radar/02-multiple-curves.svg +43 -0
- data/examples/radar/README.adoc +75 -0
- data/examples/requirement/01-basic-requirements.mmd +23 -0
- data/examples/requirement/01-basic-requirements.svg +49 -0
- data/examples/requirement/02-risk-levels.mmd +23 -0
- data/examples/requirement/02-risk-levels.svg +49 -0
- data/examples/requirement/README.adoc +85 -0
- data/examples/sankey/01-simple-flow.mmd +7 -0
- data/examples/sankey/01-simple-flow.svg +34 -0
- data/examples/sankey/02-multi-stage.mmd +11 -0
- data/examples/sankey/02-multi-stage.svg +44 -0
- data/examples/sankey/README.adoc +74 -0
- data/examples/sequence/01-basic-sequence.mmd +27 -0
- data/examples/sequence/01-basic-sequence.svg +5 -0
- data/examples/sequence/02-activations.mmd +17 -0
- data/examples/sequence/02-activations.svg +78 -0
- data/examples/sequence/README.adoc +86 -0
- data/examples/state_diagram/01-simple-states.mmd +29 -0
- data/examples/state_diagram/01-simple-states.svg +5 -0
- data/examples/state_diagram/02-composite.mmd +19 -0
- data/examples/state_diagram/02-composite.svg +81 -0
- data/examples/state_diagram/README.adoc +90 -0
- data/examples/timeline/01-simple-timeline.mmd +11 -0
- data/examples/timeline/01-simple-timeline.svg +36 -0
- data/examples/timeline/02-periods.mmd +15 -0
- data/examples/timeline/02-periods.svg +47 -0
- data/examples/timeline/README.adoc +78 -0
- data/examples/treemap/01-basic-treemap.mmd +12 -0
- data/examples/treemap/01-basic-treemap.svg +59 -0
- data/examples/treemap/README.adoc +59 -0
- data/examples/user_journey/01-simple-journey.mmd +23 -0
- data/examples/user_journey/01-simple-journey.svg +5 -0
- data/examples/user_journey/02-multi-actor.mmd +18 -0
- data/examples/user_journey/02-multi-actor.svg +129 -0
- data/examples/user_journey/README.adoc +81 -0
- data/examples/xychart/01-line-chart.mmd +5 -0
- data/examples/xychart/01-line-chart.svg +43 -0
- data/examples/xychart/02-bar-chart.mmd +7 -0
- data/examples/xychart/02-bar-chart.svg +48 -0
- data/examples/xychart/README.adoc +80 -0
- data/exe/sirena +7 -0
- data/lib/sirena/cli.rb +138 -0
- data/lib/sirena/commands/batch.rb +117 -0
- data/lib/sirena/commands/render.rb +80 -0
- data/lib/sirena/commands/types.rb +29 -0
- data/lib/sirena/commands/version.rb +24 -0
- data/lib/sirena/diagram/architecture.rb +46 -0
- data/lib/sirena/diagram/base.rb +61 -0
- data/lib/sirena/diagram/block.rb +81 -0
- data/lib/sirena/diagram/c4.rb +328 -0
- data/lib/sirena/diagram/class_diagram.rb +385 -0
- data/lib/sirena/diagram/er_diagram.rb +238 -0
- data/lib/sirena/diagram/error.rb +38 -0
- data/lib/sirena/diagram/flowchart.rb +160 -0
- data/lib/sirena/diagram/gantt.rb +71 -0
- data/lib/sirena/diagram/git_graph.rb +36 -0
- data/lib/sirena/diagram/info.rb +38 -0
- data/lib/sirena/diagram/kanban.rb +178 -0
- data/lib/sirena/diagram/mindmap.rb +54 -0
- data/lib/sirena/diagram/packet.rb +79 -0
- data/lib/sirena/diagram/pie.rb +115 -0
- data/lib/sirena/diagram/quadrant.rb +138 -0
- data/lib/sirena/diagram/radar.rb +52 -0
- data/lib/sirena/diagram/requirement.rb +133 -0
- data/lib/sirena/diagram/sankey.rb +217 -0
- data/lib/sirena/diagram/sequence.rb +242 -0
- data/lib/sirena/diagram/state_diagram.rb +237 -0
- data/lib/sirena/diagram/timeline.rb +171 -0
- data/lib/sirena/diagram/treemap.rb +84 -0
- data/lib/sirena/diagram/user_journey.rb +149 -0
- data/lib/sirena/diagram/xy_chart.rb +76 -0
- data/lib/sirena/diagram.rb +8 -0
- data/lib/sirena/diagram_registry.rb +101 -0
- data/lib/sirena/engine.rb +292 -0
- data/lib/sirena/parser/architecture.rb +41 -0
- data/lib/sirena/parser/base.rb +41 -0
- data/lib/sirena/parser/block.rb +72 -0
- data/lib/sirena/parser/c4.rb +53 -0
- data/lib/sirena/parser/class_diagram.rb +63 -0
- data/lib/sirena/parser/er_diagram.rb +40 -0
- data/lib/sirena/parser/error.rb +49 -0
- data/lib/sirena/parser/flowchart.rb +71 -0
- data/lib/sirena/parser/gantt.rb +60 -0
- data/lib/sirena/parser/git_graph.rb +95 -0
- data/lib/sirena/parser/grammars/architecture.rb +145 -0
- data/lib/sirena/parser/grammars/block.rb +190 -0
- data/lib/sirena/parser/grammars/c4.rb +226 -0
- data/lib/sirena/parser/grammars/class_diagram.rb +284 -0
- data/lib/sirena/parser/grammars/common.rb +84 -0
- data/lib/sirena/parser/grammars/er_diagram.rb +114 -0
- data/lib/sirena/parser/grammars/error.rb +40 -0
- data/lib/sirena/parser/grammars/flowchart.rb +298 -0
- data/lib/sirena/parser/grammars/gantt.rb +252 -0
- data/lib/sirena/parser/grammars/git_graph.rb +167 -0
- data/lib/sirena/parser/grammars/info.rb +58 -0
- data/lib/sirena/parser/grammars/kanban.rb +83 -0
- data/lib/sirena/parser/grammars/mindmap.rb +115 -0
- data/lib/sirena/parser/grammars/packet.rb +73 -0
- data/lib/sirena/parser/grammars/pie.rb +128 -0
- data/lib/sirena/parser/grammars/quadrant.rb +199 -0
- data/lib/sirena/parser/grammars/radar.rb +150 -0
- data/lib/sirena/parser/grammars/requirement.rb +188 -0
- data/lib/sirena/parser/grammars/sankey.rb +104 -0
- data/lib/sirena/parser/grammars/sequence.rb +247 -0
- data/lib/sirena/parser/grammars/state_diagram.rb +172 -0
- data/lib/sirena/parser/grammars/timeline.rb +142 -0
- data/lib/sirena/parser/grammars/treemap.rb +120 -0
- data/lib/sirena/parser/grammars/xy_chart.rb +120 -0
- data/lib/sirena/parser/info.rb +49 -0
- data/lib/sirena/parser/kanban.rb +97 -0
- data/lib/sirena/parser/mindmap.rb +106 -0
- data/lib/sirena/parser/packet.rb +76 -0
- data/lib/sirena/parser/pie.rb +49 -0
- data/lib/sirena/parser/quadrant.rb +57 -0
- data/lib/sirena/parser/radar.rb +104 -0
- data/lib/sirena/parser/requirement.rb +70 -0
- data/lib/sirena/parser/sankey.rb +64 -0
- data/lib/sirena/parser/sequence.rb +51 -0
- data/lib/sirena/parser/state_diagram.rb +69 -0
- data/lib/sirena/parser/timeline.rb +57 -0
- data/lib/sirena/parser/transforms/architecture.rb +97 -0
- data/lib/sirena/parser/transforms/block.rb +254 -0
- data/lib/sirena/parser/transforms/c4.rb +347 -0
- data/lib/sirena/parser/transforms/class_diagram.rb +352 -0
- data/lib/sirena/parser/transforms/er_diagram.rb +169 -0
- data/lib/sirena/parser/transforms/error.rb +58 -0
- data/lib/sirena/parser/transforms/flowchart.rb +293 -0
- data/lib/sirena/parser/transforms/gantt.rb +215 -0
- data/lib/sirena/parser/transforms/git_graph.rb +160 -0
- data/lib/sirena/parser/transforms/info.rb +58 -0
- data/lib/sirena/parser/transforms/kanban.rb +176 -0
- data/lib/sirena/parser/transforms/mindmap.rb +227 -0
- data/lib/sirena/parser/transforms/packet.rb +63 -0
- data/lib/sirena/parser/transforms/pie.rb +143 -0
- data/lib/sirena/parser/transforms/quadrant.rb +177 -0
- data/lib/sirena/parser/transforms/radar.rb +126 -0
- data/lib/sirena/parser/transforms/requirement.rb +272 -0
- data/lib/sirena/parser/transforms/sankey.rb +122 -0
- data/lib/sirena/parser/transforms/sequence.rb +342 -0
- data/lib/sirena/parser/transforms/state_diagram.rb +292 -0
- data/lib/sirena/parser/transforms/timeline.rb +177 -0
- data/lib/sirena/parser/transforms/treemap.rb +81 -0
- data/lib/sirena/parser/transforms/xy_chart.rb +132 -0
- data/lib/sirena/parser/treemap.rb +98 -0
- data/lib/sirena/parser/user_journey.rb +120 -0
- data/lib/sirena/parser/xy_chart.rb +114 -0
- data/lib/sirena/parser.rb +8 -0
- data/lib/sirena/renderer/architecture.rb +251 -0
- data/lib/sirena/renderer/base.rb +251 -0
- data/lib/sirena/renderer/block.rb +286 -0
- data/lib/sirena/renderer/c4.rb +490 -0
- data/lib/sirena/renderer/class_diagram.rb +499 -0
- data/lib/sirena/renderer/er_diagram.rb +417 -0
- data/lib/sirena/renderer/error.rb +131 -0
- data/lib/sirena/renderer/flowchart.rb +301 -0
- data/lib/sirena/renderer/gantt.rb +331 -0
- data/lib/sirena/renderer/git_graph.rb +368 -0
- data/lib/sirena/renderer/info.rb +93 -0
- data/lib/sirena/renderer/kanban.rb +295 -0
- data/lib/sirena/renderer/mindmap.rb +396 -0
- data/lib/sirena/renderer/packet.rb +239 -0
- data/lib/sirena/renderer/pie.rb +235 -0
- data/lib/sirena/renderer/quadrant.rb +292 -0
- data/lib/sirena/renderer/radar.rb +323 -0
- data/lib/sirena/renderer/requirement.rb +371 -0
- data/lib/sirena/renderer/sankey.rb +255 -0
- data/lib/sirena/renderer/sequence.rb +424 -0
- data/lib/sirena/renderer/state_diagram.rb +328 -0
- data/lib/sirena/renderer/timeline.rb +304 -0
- data/lib/sirena/renderer/treemap.rb +152 -0
- data/lib/sirena/renderer/user_journey.rb +331 -0
- data/lib/sirena/renderer/xy_chart.rb +452 -0
- data/lib/sirena/renderer.rb +8 -0
- data/lib/sirena/svg/circle.rb +41 -0
- data/lib/sirena/svg/document.rb +103 -0
- data/lib/sirena/svg/element.rb +65 -0
- data/lib/sirena/svg/ellipse.rb +33 -0
- data/lib/sirena/svg/group.rb +71 -0
- data/lib/sirena/svg/line.rb +49 -0
- data/lib/sirena/svg/path.rb +76 -0
- data/lib/sirena/svg/polygon.rb +43 -0
- data/lib/sirena/svg/polyline.rb +35 -0
- data/lib/sirena/svg/rect.rb +57 -0
- data/lib/sirena/svg/style.rb +44 -0
- data/lib/sirena/svg/text.rb +72 -0
- data/lib/sirena/svg.rb +19 -0
- data/lib/sirena/text_measurement.rb +71 -0
- data/lib/sirena/theme/builtin/dark.yml +70 -0
- data/lib/sirena/theme/builtin/default.yml +80 -0
- data/lib/sirena/theme/builtin/high_contrast.yml +70 -0
- data/lib/sirena/theme/builtin/light.yml +70 -0
- data/lib/sirena/theme/color_palette.rb +48 -0
- data/lib/sirena/theme/effect_styles.rb +28 -0
- data/lib/sirena/theme/registry.rb +41 -0
- data/lib/sirena/theme/shape_styles.rb +28 -0
- data/lib/sirena/theme/spacing_config.rb +24 -0
- data/lib/sirena/theme/typography.rb +30 -0
- data/lib/sirena/theme.rb +69 -0
- data/lib/sirena/transform/architecture.rb +273 -0
- data/lib/sirena/transform/base.rb +199 -0
- data/lib/sirena/transform/block.rb +215 -0
- data/lib/sirena/transform/c4.rb +288 -0
- data/lib/sirena/transform/class_diagram.rb +296 -0
- data/lib/sirena/transform/er_diagram.rb +204 -0
- data/lib/sirena/transform/error.rb +39 -0
- data/lib/sirena/transform/flowchart.rb +161 -0
- data/lib/sirena/transform/gantt.rb +253 -0
- data/lib/sirena/transform/git_graph.rb +283 -0
- data/lib/sirena/transform/info.rb +39 -0
- data/lib/sirena/transform/kanban.rb +180 -0
- data/lib/sirena/transform/mindmap.rb +251 -0
- data/lib/sirena/transform/packet.rb +185 -0
- data/lib/sirena/transform/pie.rb +62 -0
- data/lib/sirena/transform/quadrant.rb +167 -0
- data/lib/sirena/transform/radar.rb +227 -0
- data/lib/sirena/transform/requirement.rb +233 -0
- data/lib/sirena/transform/sankey.rb +212 -0
- data/lib/sirena/transform/sequence.rb +143 -0
- data/lib/sirena/transform/state_diagram.rb +228 -0
- data/lib/sirena/transform/timeline.rb +139 -0
- data/lib/sirena/transform/treemap.rb +120 -0
- data/lib/sirena/transform/user_journey.rb +207 -0
- data/lib/sirena/transform/xy_chart.rb +273 -0
- data/lib/sirena/transform.rb +8 -0
- data/lib/sirena/version.rb +5 -0
- data/lib/sirena.rb +328 -0
- data/lib/tasks/benchmark.rake +532 -0
- data/lib/tasks/examples.rake +468 -0
- data/lib/tasks/generate_mermaid_fixtures.rake +363 -0
- data/lib/tasks/mermaid_fixtures.rake +46 -0
- data/scripts/extract_mermaid_tests.rb +493 -0
- data/scripts/rename_to_sirena.rb +73 -0
- data/sirena.gemspec +47 -0
- metadata +529 -0
|
@@ -0,0 +1,314 @@
|
|
|
1
|
+
= Architecture Diagram
|
|
2
|
+
:toc:
|
|
3
|
+
:toclevels: 3
|
|
4
|
+
|
|
5
|
+
== Purpose
|
|
6
|
+
|
|
7
|
+
Architecture diagrams visualize software system architecture at different levels, showing system boundaries, services, components, and their relationships. This is useful for documenting system architecture, communicating design decisions, and understanding system topology.
|
|
8
|
+
|
|
9
|
+
== Features
|
|
10
|
+
|
|
11
|
+
=== General
|
|
12
|
+
|
|
13
|
+
Architecture diagrams support:
|
|
14
|
+
|
|
15
|
+
* Services with icons and labels
|
|
16
|
+
* Grouping services into boundaries
|
|
17
|
+
* Nested group hierarchies
|
|
18
|
+
* Directional connections between services
|
|
19
|
+
* Edge labels for protocols/technologies
|
|
20
|
+
* Metadata (title, accessibility)
|
|
21
|
+
|
|
22
|
+
The implementation follows Mermaid's `architecture-beta` syntax.
|
|
23
|
+
|
|
24
|
+
=== Basic services
|
|
25
|
+
|
|
26
|
+
Define services with icons and labels.
|
|
27
|
+
|
|
28
|
+
Syntax:
|
|
29
|
+
|
|
30
|
+
[source]
|
|
31
|
+
----
|
|
32
|
+
architecture-beta
|
|
33
|
+
service {id}({icon})[{label}]
|
|
34
|
+
----
|
|
35
|
+
|
|
36
|
+
Where,
|
|
37
|
+
|
|
38
|
+
`id`:: Unique identifier for the service
|
|
39
|
+
`icon`:: Icon type (database, server, disk, cloud, internet, browser, etc.)
|
|
40
|
+
`label`:: Display label for the service
|
|
41
|
+
|
|
42
|
+
.Defining basic services
|
|
43
|
+
[example]
|
|
44
|
+
====
|
|
45
|
+
[source,mermaid]
|
|
46
|
+
----
|
|
47
|
+
architecture-beta
|
|
48
|
+
service db(database)[Database]
|
|
49
|
+
service api(server)[API Server]
|
|
50
|
+
service ui(browser)[Web UI]
|
|
51
|
+
----
|
|
52
|
+
|
|
53
|
+
This creates three services:
|
|
54
|
+
|
|
55
|
+
* A database service with ID `db`
|
|
56
|
+
* An API server with ID `api`
|
|
57
|
+
* A web UI with ID `ui`
|
|
58
|
+
====
|
|
59
|
+
|
|
60
|
+
=== Service connections
|
|
61
|
+
|
|
62
|
+
Connect services with directional arrows.
|
|
63
|
+
|
|
64
|
+
Syntax:
|
|
65
|
+
|
|
66
|
+
[source]
|
|
67
|
+
----
|
|
68
|
+
{from_id}:{from_pos} --> {to_pos}:{to_id}
|
|
69
|
+
{from_id} --> {to_id}
|
|
70
|
+
----
|
|
71
|
+
|
|
72
|
+
Where,
|
|
73
|
+
|
|
74
|
+
`from_id`:: Source service identifier
|
|
75
|
+
`to_id`:: Target service identifier
|
|
76
|
+
`from_pos`:: Optional position hint (L/R/T/B for left/right/top/bottom)
|
|
77
|
+
`to_pos`:: Optional position hint for target side
|
|
78
|
+
|
|
79
|
+
.Connecting services with position hints
|
|
80
|
+
[example]
|
|
81
|
+
====
|
|
82
|
+
[source,mermaid]
|
|
83
|
+
----
|
|
84
|
+
architecture-beta
|
|
85
|
+
service db(database)[Database]
|
|
86
|
+
service server(server)[Server]
|
|
87
|
+
|
|
88
|
+
db:R --> L:server
|
|
89
|
+
----
|
|
90
|
+
|
|
91
|
+
This creates a connection from the right side of the database to the left side of the server.
|
|
92
|
+
====
|
|
93
|
+
|
|
94
|
+
=== Edge labels
|
|
95
|
+
|
|
96
|
+
Add labels to connections to indicate protocols or technologies.
|
|
97
|
+
|
|
98
|
+
Syntax:
|
|
99
|
+
|
|
100
|
+
[source]
|
|
101
|
+
----
|
|
102
|
+
{from_id} --> {to_id}: {label}
|
|
103
|
+
----
|
|
104
|
+
|
|
105
|
+
Where,
|
|
106
|
+
|
|
107
|
+
`label`:: Text describing the connection (e.g., HTTP, SQL, REST)
|
|
108
|
+
|
|
109
|
+
.Adding edge labels
|
|
110
|
+
[example]
|
|
111
|
+
====
|
|
112
|
+
[source,mermaid]
|
|
113
|
+
----
|
|
114
|
+
architecture-beta
|
|
115
|
+
service ui(browser)[Web UI]
|
|
116
|
+
service api(server)[API]
|
|
117
|
+
service db(database)[Database]
|
|
118
|
+
|
|
119
|
+
ui:R --> L:api: HTTP
|
|
120
|
+
api:R --> L:db: SQL
|
|
121
|
+
----
|
|
122
|
+
|
|
123
|
+
This shows the protocols used between services.
|
|
124
|
+
====
|
|
125
|
+
|
|
126
|
+
=== Groups and boundaries
|
|
127
|
+
|
|
128
|
+
Group related services using boundaries.
|
|
129
|
+
|
|
130
|
+
Syntax:
|
|
131
|
+
|
|
132
|
+
[source]
|
|
133
|
+
----
|
|
134
|
+
group {id}({icon})[{label}]
|
|
135
|
+
service {service_id}({icon})[{label}] in {group_id}
|
|
136
|
+
----
|
|
137
|
+
|
|
138
|
+
Where,
|
|
139
|
+
|
|
140
|
+
`group_id`:: Identifier for the group
|
|
141
|
+
`service_id`:: Service to place in the group
|
|
142
|
+
`icon`:: Optional icon for the group (e.g., cloud)
|
|
143
|
+
`label`:: Display label for the group boundary
|
|
144
|
+
|
|
145
|
+
.Grouping services
|
|
146
|
+
[example]
|
|
147
|
+
====
|
|
148
|
+
[source,mermaid]
|
|
149
|
+
----
|
|
150
|
+
architecture-beta
|
|
151
|
+
group api(cloud)[API Layer]
|
|
152
|
+
|
|
153
|
+
service db(database)[Database] in api
|
|
154
|
+
service server(server)[Server] in api
|
|
155
|
+
|
|
156
|
+
service gateway(internet)[Gateway]
|
|
157
|
+
|
|
158
|
+
gateway:R --> L:server
|
|
159
|
+
----
|
|
160
|
+
|
|
161
|
+
This creates an API Layer group containing the database and server, with an external gateway service.
|
|
162
|
+
====
|
|
163
|
+
|
|
164
|
+
=== Nested groups
|
|
165
|
+
|
|
166
|
+
Create hierarchical group structures.
|
|
167
|
+
|
|
168
|
+
Syntax:
|
|
169
|
+
|
|
170
|
+
[source]
|
|
171
|
+
----
|
|
172
|
+
group {parent_id}[{label}]
|
|
173
|
+
group {child_id}[{label}] in {parent_id}
|
|
174
|
+
----
|
|
175
|
+
|
|
176
|
+
.Creating nested groups
|
|
177
|
+
[example]
|
|
178
|
+
====
|
|
179
|
+
[source,mermaid]
|
|
180
|
+
----
|
|
181
|
+
architecture-beta
|
|
182
|
+
group api[API]
|
|
183
|
+
group public[Public API] in api
|
|
184
|
+
group private[Private API] in api
|
|
185
|
+
|
|
186
|
+
service web(server)[Web Server] in public
|
|
187
|
+
service admin(server)[Admin Server] in private
|
|
188
|
+
service db(database)[Database] in private
|
|
189
|
+
----
|
|
190
|
+
|
|
191
|
+
This creates a hierarchical structure with public and private API groups within a main API group.
|
|
192
|
+
====
|
|
193
|
+
|
|
194
|
+
=== Title and accessibility
|
|
195
|
+
|
|
196
|
+
Add metadata for documentation and accessibility.
|
|
197
|
+
|
|
198
|
+
Syntax:
|
|
199
|
+
|
|
200
|
+
[source]
|
|
201
|
+
----
|
|
202
|
+
architecture-beta
|
|
203
|
+
title {diagram title}
|
|
204
|
+
accTitle: {accessibility title}
|
|
205
|
+
accDescr: {accessibility description}
|
|
206
|
+
----
|
|
207
|
+
|
|
208
|
+
.Adding metadata
|
|
209
|
+
[example]
|
|
210
|
+
====
|
|
211
|
+
[source,mermaid]
|
|
212
|
+
----
|
|
213
|
+
architecture-beta
|
|
214
|
+
title E-Commerce System Architecture
|
|
215
|
+
accTitle: System Architecture Diagram
|
|
216
|
+
accDescr: Shows the main components of the e-commerce platform
|
|
217
|
+
|
|
218
|
+
service ui(browser)[Web UI]
|
|
219
|
+
service api(server)[API Gateway]
|
|
220
|
+
service db(database)[Database]
|
|
221
|
+
----
|
|
222
|
+
====
|
|
223
|
+
|
|
224
|
+
=== Icon types
|
|
225
|
+
|
|
226
|
+
Common icon types supported:
|
|
227
|
+
|
|
228
|
+
* `database` - Database systems
|
|
229
|
+
* `server` - Application servers
|
|
230
|
+
* `disk` - Storage systems
|
|
231
|
+
* `cloud` - Cloud services
|
|
232
|
+
* `internet` - Internet gateway
|
|
233
|
+
* `browser` - Web browsers/clients
|
|
234
|
+
|
|
235
|
+
Additional icon prefixes (for future extension):
|
|
236
|
+
|
|
237
|
+
* `logos:{name}` - Logo icons (e.g., `logos:aws-s3`)
|
|
238
|
+
* `fa:{name}` - Font Awesome icons (e.g., `fa:image`)
|
|
239
|
+
|
|
240
|
+
== Implementation
|
|
241
|
+
|
|
242
|
+
Architecture diagrams use a 7-file Parslet architecture:
|
|
243
|
+
|
|
244
|
+
. **Model** ([`lib/sirena/diagram/architecture.rb`](lib/sirena/diagram/architecture.rb)) - Lutaml::Model classes for diagram structure
|
|
245
|
+
. **Grammar** ([`lib/sirena/parser/grammars/architecture.rb`](lib/sirena/parser/grammars/architecture.rb)) - Parslet grammar for syntax parsing
|
|
246
|
+
. **Transform** ([`lib/sirena/parser/transforms/architecture.rb`](lib/sirena/parser/transforms/architecture.rb)) - Converts parse tree to model
|
|
247
|
+
. **Parser** ([`lib/sirena/parser/architecture.rb`](lib/sirena/parser/architecture.rb)) - Orchestrates parsing pipeline
|
|
248
|
+
. **Layout** ([`lib/sirena/transform/architecture.rb`](lib/sirena/transform/architecture.rb)) - Positions elements spatially
|
|
249
|
+
. **Renderer** ([`lib/sirena/renderer/architecture.rb`](lib/sirena/renderer/architecture.rb)) - Generates SVG output
|
|
250
|
+
. **Tests** - Parser and renderer test suites
|
|
251
|
+
|
|
252
|
+
The implementation follows MECE principles with clear separation of concerns between parsing, transformation, layout, and rendering stages.
|
|
253
|
+
|
|
254
|
+
== Examples
|
|
255
|
+
|
|
256
|
+
=== Simple three-tier architecture
|
|
257
|
+
|
|
258
|
+
[source,mermaid]
|
|
259
|
+
----
|
|
260
|
+
architecture-beta
|
|
261
|
+
service ui(browser)[Web UI]
|
|
262
|
+
service api(server)[API Server]
|
|
263
|
+
service db(database)[Database]
|
|
264
|
+
|
|
265
|
+
ui:R --> L:api: HTTPS
|
|
266
|
+
api:R --> L:db: SQL
|
|
267
|
+
----
|
|
268
|
+
|
|
269
|
+
=== Microservices with groups
|
|
270
|
+
|
|
271
|
+
[source,mermaid]
|
|
272
|
+
----
|
|
273
|
+
architecture-beta
|
|
274
|
+
group frontend[Frontend]
|
|
275
|
+
group backend[Backend Services]
|
|
276
|
+
group data[Data Layer]
|
|
277
|
+
|
|
278
|
+
service web(browser)[Web App] in frontend
|
|
279
|
+
service mobile(browser)[Mobile App] in frontend
|
|
280
|
+
|
|
281
|
+
service auth(server)[Auth Service] in backend
|
|
282
|
+
service orders(server)[Order Service] in backend
|
|
283
|
+
service inventory(server)[Inventory Service] in backend
|
|
284
|
+
|
|
285
|
+
service db(database)[Primary DB] in data
|
|
286
|
+
service cache(disk)[Cache] in data
|
|
287
|
+
|
|
288
|
+
web:B --> T:auth
|
|
289
|
+
mobile:B --> T:auth
|
|
290
|
+
auth:B --> T:db
|
|
291
|
+
orders:B --> T:db
|
|
292
|
+
inventory:R --> L:cache
|
|
293
|
+
----
|
|
294
|
+
|
|
295
|
+
=== Cloud architecture
|
|
296
|
+
|
|
297
|
+
[source,mermaid]
|
|
298
|
+
----
|
|
299
|
+
architecture-beta
|
|
300
|
+
title Cloud Infrastructure
|
|
301
|
+
|
|
302
|
+
group aws(cloud)[AWS Cloud]
|
|
303
|
+
|
|
304
|
+
service lb(internet)[Load Balancer] in aws
|
|
305
|
+
service web(server)[Web Servers] in aws
|
|
306
|
+
service app(server)[App Servers] in aws
|
|
307
|
+
service db(database)[RDS Database] in aws
|
|
308
|
+
service s3(disk)[S3 Storage] in aws
|
|
309
|
+
|
|
310
|
+
lb:B --> T:web: HTTPS
|
|
311
|
+
web:B --> T:app: HTTP
|
|
312
|
+
app:R --> L:db: SQL
|
|
313
|
+
app:B --> T:s3: S3 API
|
|
314
|
+
----
|
|
@@ -0,0 +1,345 @@
|
|
|
1
|
+
= Block Diagrams
|
|
2
|
+
:toc:
|
|
3
|
+
:toclevels: 3
|
|
4
|
+
|
|
5
|
+
== General
|
|
6
|
+
|
|
7
|
+
Block diagrams in Sirena provide a column-based layout system for visualizing hierarchical structures, data flows, and system architectures using blocks and connections. Unlike flowcharts which use graph-based layouts, block diagrams arrange elements in a structured grid with explicit column positioning.
|
|
8
|
+
|
|
9
|
+
Block diagrams are declared with the `block-beta` keyword and support:
|
|
10
|
+
|
|
11
|
+
* Column-based layouts with configurable column counts
|
|
12
|
+
* Blocks with optional labels and width specifications
|
|
13
|
+
* Compound/nested blocks for hierarchical structures
|
|
14
|
+
* Space placeholders for layout control
|
|
15
|
+
* Connections between blocks (arrows and lines)
|
|
16
|
+
* Multiple block shapes (rectangles, circles)
|
|
17
|
+
* Styling directives for customization
|
|
18
|
+
|
|
19
|
+
== Basic block diagram
|
|
20
|
+
|
|
21
|
+
The simplest block diagram contains blocks arranged in columns:
|
|
22
|
+
|
|
23
|
+
[source,mermaid]
|
|
24
|
+
----
|
|
25
|
+
block-beta
|
|
26
|
+
columns 2
|
|
27
|
+
A["Block A"]
|
|
28
|
+
B["Block B"]
|
|
29
|
+
----
|
|
30
|
+
|
|
31
|
+
This creates a two-column layout with two blocks side by side.
|
|
32
|
+
|
|
33
|
+
== Block declarations
|
|
34
|
+
|
|
35
|
+
=== Simple blocks
|
|
36
|
+
|
|
37
|
+
Blocks can be declared with just an identifier:
|
|
38
|
+
|
|
39
|
+
[source,mermaid]
|
|
40
|
+
----
|
|
41
|
+
block-beta
|
|
42
|
+
A
|
|
43
|
+
B
|
|
44
|
+
C
|
|
45
|
+
----
|
|
46
|
+
|
|
47
|
+
Without a label, the block displays its identifier as the label.
|
|
48
|
+
|
|
49
|
+
=== Blocks with labels
|
|
50
|
+
|
|
51
|
+
Blocks can have custom labels using bracket notation:
|
|
52
|
+
|
|
53
|
+
[source,mermaid]
|
|
54
|
+
----
|
|
55
|
+
block-beta
|
|
56
|
+
id1["Custom Label"]
|
|
57
|
+
id2["Another Block"]
|
|
58
|
+
----
|
|
59
|
+
|
|
60
|
+
The label text appears inside the block, while the identifier is used for connections.
|
|
61
|
+
|
|
62
|
+
=== Block widths
|
|
63
|
+
|
|
64
|
+
Blocks can span multiple columns using width specifications:
|
|
65
|
+
|
|
66
|
+
[source,mermaid]
|
|
67
|
+
----
|
|
68
|
+
block-beta
|
|
69
|
+
columns 3
|
|
70
|
+
A:2
|
|
71
|
+
B:1
|
|
72
|
+
C:3
|
|
73
|
+
----
|
|
74
|
+
|
|
75
|
+
Where:
|
|
76
|
+
|
|
77
|
+
`A:2`:: Block A spans 2 columns
|
|
78
|
+
`B:1`:: Block B spans 1 column (default)
|
|
79
|
+
`C:3`:: Block C spans 3 columns (entire row)
|
|
80
|
+
|
|
81
|
+
== Column layout
|
|
82
|
+
|
|
83
|
+
=== Columns statement
|
|
84
|
+
|
|
85
|
+
The `columns` directive specifies how many columns the layout uses:
|
|
86
|
+
|
|
87
|
+
[source,mermaid]
|
|
88
|
+
----
|
|
89
|
+
block-beta
|
|
90
|
+
columns 3
|
|
91
|
+
A
|
|
92
|
+
B
|
|
93
|
+
C
|
|
94
|
+
D
|
|
95
|
+
E
|
|
96
|
+
F
|
|
97
|
+
----
|
|
98
|
+
|
|
99
|
+
This creates a grid with 3 columns. Blocks flow left to right, top to bottom.
|
|
100
|
+
|
|
101
|
+
=== Default columns
|
|
102
|
+
|
|
103
|
+
If no `columns` statement is provided, the default is 1 column (vertical layout):
|
|
104
|
+
|
|
105
|
+
[source,mermaid]
|
|
106
|
+
----
|
|
107
|
+
block-beta
|
|
108
|
+
A
|
|
109
|
+
B
|
|
110
|
+
C
|
|
111
|
+
----
|
|
112
|
+
|
|
113
|
+
All blocks stack vertically in a single column.
|
|
114
|
+
|
|
115
|
+
== Block shapes
|
|
116
|
+
|
|
117
|
+
=== Rectangle shape (default)
|
|
118
|
+
|
|
119
|
+
Blocks are rectangles by default, but can be explicitly labeled:
|
|
120
|
+
|
|
121
|
+
[source,mermaid]
|
|
122
|
+
----
|
|
123
|
+
block-beta
|
|
124
|
+
A["Rectangle Block"]
|
|
125
|
+
----
|
|
126
|
+
|
|
127
|
+
=== Circle shape
|
|
128
|
+
|
|
129
|
+
Use double parentheses for circular blocks:
|
|
130
|
+
|
|
131
|
+
[source,mermaid]
|
|
132
|
+
----
|
|
133
|
+
block-beta
|
|
134
|
+
db(("Database"))
|
|
135
|
+
----
|
|
136
|
+
|
|
137
|
+
This creates a circular block, often used for databases or special nodes.
|
|
138
|
+
|
|
139
|
+
== Compound blocks
|
|
140
|
+
|
|
141
|
+
=== Basic compound blocks
|
|
142
|
+
|
|
143
|
+
Compound blocks contain nested child blocks:
|
|
144
|
+
|
|
145
|
+
[source,mermaid]
|
|
146
|
+
----
|
|
147
|
+
block-beta
|
|
148
|
+
block:group1
|
|
149
|
+
A
|
|
150
|
+
B
|
|
151
|
+
C
|
|
152
|
+
end
|
|
153
|
+
----
|
|
154
|
+
|
|
155
|
+
Where:
|
|
156
|
+
|
|
157
|
+
`block:group1`:: Declares a compound block with ID "group1"
|
|
158
|
+
`A`, `B`, `C`:: Child blocks nested inside
|
|
159
|
+
`end`:: Closes the compound block
|
|
160
|
+
|
|
161
|
+
=== Nested compound blocks
|
|
162
|
+
|
|
163
|
+
Compound blocks can be nested:
|
|
164
|
+
|
|
165
|
+
[source,mermaid]
|
|
166
|
+
----
|
|
167
|
+
block-beta
|
|
168
|
+
block:outer
|
|
169
|
+
A
|
|
170
|
+
block:inner
|
|
171
|
+
B
|
|
172
|
+
C
|
|
173
|
+
end
|
|
174
|
+
D
|
|
175
|
+
end
|
|
176
|
+
----
|
|
177
|
+
|
|
178
|
+
This creates a hierarchical structure with multiple levels.
|
|
179
|
+
|
|
180
|
+
== Space placeholders
|
|
181
|
+
|
|
182
|
+
=== Space blocks
|
|
183
|
+
|
|
184
|
+
Use `space` to create empty cells in the grid:
|
|
185
|
+
|
|
186
|
+
[source,mermaid]
|
|
187
|
+
----
|
|
188
|
+
block-beta
|
|
189
|
+
columns 3
|
|
190
|
+
A
|
|
191
|
+
space
|
|
192
|
+
B
|
|
193
|
+
C
|
|
194
|
+
space
|
|
195
|
+
space
|
|
196
|
+
----
|
|
197
|
+
|
|
198
|
+
Space blocks maintain grid alignment but don't render visually.
|
|
199
|
+
|
|
200
|
+
== Connections
|
|
201
|
+
|
|
202
|
+
=== Arrow connections
|
|
203
|
+
|
|
204
|
+
Connect blocks with arrows using `-->`:
|
|
205
|
+
|
|
206
|
+
[source,mermaid]
|
|
207
|
+
----
|
|
208
|
+
block-beta
|
|
209
|
+
A
|
|
210
|
+
B
|
|
211
|
+
A --> B
|
|
212
|
+
----
|
|
213
|
+
|
|
214
|
+
This draws an arrow from block A to block B.
|
|
215
|
+
|
|
216
|
+
=== Line connections
|
|
217
|
+
|
|
218
|
+
Use `---` for non-directed line connections:
|
|
219
|
+
|
|
220
|
+
[source,mermaid]
|
|
221
|
+
----
|
|
222
|
+
block-beta
|
|
223
|
+
A
|
|
224
|
+
B
|
|
225
|
+
A --- B
|
|
226
|
+
----
|
|
227
|
+
|
|
228
|
+
This draws a simple line without an arrowhead.
|
|
229
|
+
|
|
230
|
+
=== Multiple connections
|
|
231
|
+
|
|
232
|
+
A block can have multiple connections:
|
|
233
|
+
|
|
234
|
+
[source,mermaid]
|
|
235
|
+
----
|
|
236
|
+
block-beta
|
|
237
|
+
A
|
|
238
|
+
B
|
|
239
|
+
C
|
|
240
|
+
A --> B
|
|
241
|
+
A --> C
|
|
242
|
+
B --> C
|
|
243
|
+
----
|
|
244
|
+
|
|
245
|
+
== Styling
|
|
246
|
+
|
|
247
|
+
=== Block styling
|
|
248
|
+
|
|
249
|
+
Style individual blocks using the `style` directive:
|
|
250
|
+
|
|
251
|
+
[source,mermaid]
|
|
252
|
+
----
|
|
253
|
+
block-beta
|
|
254
|
+
A["Styled Block"]
|
|
255
|
+
style A fill:#969,stroke:#333,stroke-width:4px
|
|
256
|
+
----
|
|
257
|
+
|
|
258
|
+
Where:
|
|
259
|
+
|
|
260
|
+
`fill:#969`:: Background color
|
|
261
|
+
`stroke:#333`:: Border color
|
|
262
|
+
`stroke-width:4px`:: Border width
|
|
263
|
+
|
|
264
|
+
=== Style properties
|
|
265
|
+
|
|
266
|
+
Supported style properties include:
|
|
267
|
+
|
|
268
|
+
* `fill` - Background color
|
|
269
|
+
* `stroke` - Border color
|
|
270
|
+
* `stroke-width` - Border thickness
|
|
271
|
+
|
|
272
|
+
== Complete example
|
|
273
|
+
|
|
274
|
+
Here's a comprehensive example showing various features:
|
|
275
|
+
|
|
276
|
+
[source,mermaid]
|
|
277
|
+
----
|
|
278
|
+
block-beta
|
|
279
|
+
columns 3
|
|
280
|
+
|
|
281
|
+
db(("Database"))
|
|
282
|
+
space
|
|
283
|
+
api["API Server"]
|
|
284
|
+
|
|
285
|
+
block:services
|
|
286
|
+
auth["Auth Service"]
|
|
287
|
+
users["User Service"]
|
|
288
|
+
data["Data Service"]
|
|
289
|
+
end
|
|
290
|
+
|
|
291
|
+
web["Web Client"]:3
|
|
292
|
+
|
|
293
|
+
db --> services
|
|
294
|
+
services --> api
|
|
295
|
+
api --> web
|
|
296
|
+
|
|
297
|
+
style db fill:#69f,stroke:#333,stroke-width:2px
|
|
298
|
+
style api fill:#f96,stroke:#333,stroke-width:2px
|
|
299
|
+
----
|
|
300
|
+
|
|
301
|
+
This creates a multi-tier architecture diagram with:
|
|
302
|
+
|
|
303
|
+
* 3-column layout
|
|
304
|
+
* Circular database block
|
|
305
|
+
* Compound services block
|
|
306
|
+
* Full-width web client block
|
|
307
|
+
* Connections showing data flow
|
|
308
|
+
* Custom styling for key components
|
|
309
|
+
|
|
310
|
+
== Implementation notes
|
|
311
|
+
|
|
312
|
+
=== Column-based layout
|
|
313
|
+
|
|
314
|
+
Unlike flowcharts that use graph algorithms, block diagrams use explicit column-based positioning. Blocks are placed in columns from left to right, wrapping to the next row when a row is full.
|
|
315
|
+
|
|
316
|
+
=== Width calculation
|
|
317
|
+
|
|
318
|
+
Block widths are calculated based on:
|
|
319
|
+
|
|
320
|
+
* Explicit width specifications (`:N` syntax)
|
|
321
|
+
* Label text dimensions
|
|
322
|
+
* Minimum block size constraints
|
|
323
|
+
|
|
324
|
+
=== Connection routing
|
|
325
|
+
|
|
326
|
+
Connections are routed from the bottom center of the source block to the top center of the target block using straight lines. Future enhancements may include bezier curves for more aesthetic routing.
|
|
327
|
+
|
|
328
|
+
=== Compound block rendering
|
|
329
|
+
|
|
330
|
+
Compound blocks are rendered with:
|
|
331
|
+
|
|
332
|
+
* Dashed border to indicate grouping
|
|
333
|
+
* Padding around child blocks
|
|
334
|
+
* Automatic height calculation based on children
|
|
335
|
+
|
|
336
|
+
== Theme integration
|
|
337
|
+
|
|
338
|
+
Block diagrams support full theme integration:
|
|
339
|
+
|
|
340
|
+
* Block colors from theme palette
|
|
341
|
+
* Border colors and styles
|
|
342
|
+
* Text styling and fonts
|
|
343
|
+
* Connection colors and styles
|
|
344
|
+
|
|
345
|
+
All visual properties can be customized through themes or inline styling.
|