drawio_dsl 0.8.4 → 0.8.5

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 (49) hide show
  1. checksums.yaml +4 -4
  2. data/.builders/.data/shapes.json +9 -0
  3. data/.builders/.templates/basic/drawio_extensions.rb +2 -1
  4. data/.builders/.templates/basic/drawio_shapes.rb +1 -1
  5. data/.builders/blueprint/shapes.rb +1 -0
  6. data/.builders/generators/20-drawio-extensions.rb +1 -1
  7. data/.builders/generators/domain_diagram.rb +448 -15
  8. data/.builders/generators/parking-map.png +0 -0
  9. data/.builders/generators/parking_app.rb +110 -0
  10. data/.builders/generators/printspeak-architecture-generator.rb +15 -10
  11. data/.builders/generators/project-plan.rb +4 -2
  12. data/CHANGELOG.md +7 -0
  13. data/README.md +5 -3
  14. data/docs/domain-modal/domain_model.drawio +265 -0
  15. data/docs/domain-modal/domain_model.svg +3 -0
  16. data/docs/domain-modal/domain_model_custom.drawio +408 -0
  17. data/docs/domain-modal/domain_model_custom.png +0 -0
  18. data/docs/domain-modal.md +9 -0
  19. data/docs/parking_app.drawio +25 -0
  20. data/docs/parking_app.svg +3 -0
  21. data/docs/printspeak-architecture-generator.drawio +31 -0
  22. data/docs/printspeak-architecture-generator.svg +3 -0
  23. data/docs/project-plan/project.drawio +60 -54
  24. data/docs/project-plan/project_in_progress.svg +1 -1
  25. data/docs/project-plan/project_todo.svg +1 -1
  26. data/lib/drawio_dsl/configuration_shapes.rb +3 -1
  27. data/lib/drawio_dsl/dom_builder.rb +1 -1
  28. data/lib/drawio_dsl/dom_builder_shapes.rb +7 -1
  29. data/lib/drawio_dsl/drawio.rb +0 -19
  30. data/lib/drawio_dsl/drawio_extensions.rb +3 -2
  31. data/lib/drawio_dsl/drawio_extensions_active.rb +1 -1
  32. data/lib/drawio_dsl/drawio_page.rb +22 -0
  33. data/lib/drawio_dsl/drawio_shapes.rb +26 -20
  34. data/lib/drawio_dsl/formatters/base_formatter.rb +1 -1
  35. data/lib/drawio_dsl/formatters/html_builder.rb +1 -1
  36. data/lib/drawio_dsl/formatters/interface_formatter.rb +1 -1
  37. data/lib/drawio_dsl/formatters/klass_formatter.rb +1 -1
  38. data/lib/drawio_dsl/formatters/style_builder.rb +1 -1
  39. data/lib/drawio_dsl/schema/_.rb +1 -0
  40. data/lib/drawio_dsl/schema/shapes/db_json.rb +9 -0
  41. data/lib/drawio_dsl/schema/shapes/shape.rb +2 -2
  42. data/lib/drawio_dsl/version.rb +1 -1
  43. data/lib/drawio_dsl/xml_builder.rb +1 -1
  44. data/lib/drawio_dsl.rb +1 -0
  45. data/package-lock.json +2 -2
  46. data/package.json +1 -1
  47. metadata +15 -4
  48. data/docs/domain.drawio +0 -31
  49. data/docs/domain_model.svg +0 -3
@@ -2,7 +2,7 @@
2
2
 
3
3
  # :nocov:
4
4
  module DrawioDsl
5
- # DrawioDsl is a DSL for draw-io diagrams.
5
+ # Builder methods for each shape, line and text element to attach to DomBuilder.
6
6
  module DomBuilderShapes
7
7
  def add_line(id = nil, **opts, &block)
8
8
  opts = { id: id }.merge(opts) if id
@@ -142,6 +142,12 @@ module DrawioDsl
142
142
  add_shape(database)
143
143
  end
144
144
 
145
+ def add_db_json(id = nil, **opts, &block)
146
+ opts = { id: id }.merge(opts) if id
147
+ db_json = DrawioDsl::Schema::DbJson.new(current_page, **opts, &block)
148
+ add_shape(db_json)
149
+ end
150
+
145
151
  def add_diamond(id = nil, **opts, &block)
146
152
  opts = { id: id }.merge(opts) if id
147
153
  diamond = DrawioDsl::Schema::Diamond.new(current_page, **opts, &block)
@@ -67,23 +67,4 @@ module DrawioDsl
67
67
  self
68
68
  end
69
69
  end
70
-
71
- # DrawioDsl::DrawioPage is created when you call .page on the draw-io DSL.
72
- class DrawioPage < KDirector::Directors::ChildDirector
73
- include DrawioDsl::DrawioShapes
74
-
75
- def initialize(parent, **opts)
76
- super(parent, **opts)
77
-
78
- builder.add_page(**opts)
79
- end
80
-
81
- def grid_layout(**opts)
82
- builder.add_grid_layout(**opts)
83
- end
84
-
85
- def flex_layout(**opts)
86
- builder.add_flex_layout(**opts)
87
- end
88
- end
89
70
  end
@@ -2,8 +2,9 @@
2
2
 
3
3
  module DrawioDsl
4
4
  # :nocov:
5
- class DrawIoExtensions
6
- include DrawioDsl::DrawIoExtensionsActive
5
+ # 1000's of extension shapes derived from Extensions.js that can be used via the add_shape method
6
+ class DrawioExtensions
7
+ include DrawioDsl::DrawioExtensionsActive
7
8
 
8
9
  attr_reader :sections
9
10
  attr_reader :current_section
@@ -1,7 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module DrawioDsl
4
- module DrawIoExtensionsActive
4
+ module DrawioExtensionsActive
5
5
  def apply_active_flags
6
6
  sections.each do |section|
7
7
  section[:shapes].each do |shape|
@@ -0,0 +1,22 @@
1
+ # frozen_string_literal: true
2
+
3
+ module DrawioDsl
4
+ # DrawioDsl::DrawioPage is created when you call .page on the draw-io DSL.
5
+ class DrawioPage < KDirector::Directors::ChildDirector
6
+ include DrawioDsl::DrawioShapes
7
+
8
+ def initialize(parent, **opts)
9
+ super(parent, **opts)
10
+
11
+ builder.add_page(**opts)
12
+ end
13
+
14
+ def grid_layout(**opts)
15
+ builder.add_grid_layout(**opts)
16
+ end
17
+
18
+ def flex_layout(**opts)
19
+ builder.add_flex_layout(**opts)
20
+ end
21
+ end
22
+ end
@@ -1,11 +1,11 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module DrawioDsl
4
- # DrawioDsl::Shapes is a list of DSL methods (one per shape)
4
+ # List of DSL methods for each common shape
5
5
  # :nocov:
6
6
  module DrawioShapes
7
7
  def random(**opts)
8
- case rand(42)
8
+ case rand(43)
9
9
  when 0
10
10
  line(**opts)
11
11
  when 1
@@ -53,42 +53,44 @@ module DrawioDsl
53
53
  when 22
54
54
  database(**opts)
55
55
  when 23
56
- diamond(**opts)
56
+ db_json(**opts)
57
57
  when 24
58
- document(**opts)
58
+ diamond(**opts)
59
59
  when 25
60
- ellipse(**opts)
60
+ document(**opts)
61
61
  when 26
62
- hexagon(**opts)
62
+ ellipse(**opts)
63
63
  when 27
64
- interface(**opts)
64
+ hexagon(**opts)
65
65
  when 28
66
- klass(**opts)
66
+ interface(**opts)
67
67
  when 29
68
- note(**opts)
68
+ klass(**opts)
69
69
  when 30
70
- process(**opts)
70
+ note(**opts)
71
71
  when 31
72
- rectangle(**opts)
72
+ process(**opts)
73
73
  when 32
74
- rectangle2(**opts)
74
+ rectangle(**opts)
75
75
  when 33
76
- square(**opts)
76
+ rectangle2(**opts)
77
77
  when 34
78
- step(**opts)
78
+ square(**opts)
79
79
  when 35
80
- tick(**opts)
80
+ step(**opts)
81
81
  when 36
82
- todo(**opts)
82
+ tick(**opts)
83
83
  when 37
84
- face(**opts)
84
+ todo(**opts)
85
85
  when 38
86
- triangle(**opts)
86
+ face(**opts)
87
87
  when 39
88
- embed_row(**opts)
88
+ triangle(**opts)
89
89
  when 40
90
- embed_col50(**opts)
90
+ embed_row(**opts)
91
91
  when 41
92
+ embed_col50(**opts)
93
+ when 42
92
94
  embed_col200(**opts)
93
95
  end
94
96
  end
@@ -185,6 +187,10 @@ module DrawioDsl
185
187
  builder.add_database(id, **opts, &block)
186
188
  end
187
189
 
190
+ def db_json(id = nil, **opts, &block)
191
+ builder.add_db_json(id, **opts, &block)
192
+ end
193
+
188
194
  def diamond(id = nil, **opts, &block)
189
195
  builder.add_diamond(id, **opts, &block)
190
196
  end
@@ -4,7 +4,7 @@
4
4
  module DrawioDsl
5
5
  # HTML formatters can be used on shapes to render HTML using a DSL
6
6
  module Formatters
7
- # Create an instance of a HTML formatter on the shape
7
+ # Base for any HTML formatter
8
8
  class BaseFormatter
9
9
  attr_reader :html
10
10
 
@@ -4,7 +4,7 @@
4
4
  module DrawioDsl
5
5
  # HTML formatters can be used on shapes to render HTML using a DSL
6
6
  module Formatters
7
- # Create an instance of a HTML formatter on the shape
7
+ # HTML builder has methods for common HTML elements that get written sequentially
8
8
  class HtmlBuilder
9
9
  attr_reader :element_style_defaults
10
10
 
@@ -4,7 +4,7 @@
4
4
  module DrawioDsl
5
5
  # HTML formatters can be used on shapes to render HTML using a DSL
6
6
  module Formatters
7
- # Create an instance of a HTML formatter on the shape
7
+ # Format the HTML to display an interface on a class diagram
8
8
  class InterfaceFormatter < BaseFormatter
9
9
  def initialize
10
10
  super({ p: { margin: '0px', margin_left: '4px', margin_top: '4px' } })
@@ -4,7 +4,7 @@
4
4
  module DrawioDsl
5
5
  # HTML formatters can be used on shapes to render HTML using a DSL
6
6
  module Formatters
7
- # Create an instance of a HTML formatter on the shape
7
+ # Format the HTML to display an class on a class diagram
8
8
  class KlassFormatter < BaseFormatter
9
9
  def initialize
10
10
  super({ p: { margin: '0px', margin_left: '4px', margin_top: '4px' } })
@@ -4,7 +4,7 @@
4
4
  module DrawioDsl
5
5
  # HTML formatters can be used on shapes to render HTML using a DSL
6
6
  module Formatters
7
- # Create an instance of a HTML formatter on the shape
7
+ # Build the style attribute for a HTML element
8
8
  class StyleBuilder
9
9
  MAPPINGS = {
10
10
  margin: 'margin',
@@ -35,6 +35,7 @@ require_relative 'shapes/container4'
35
35
  require_relative 'shapes/cross'
36
36
  require_relative 'shapes/envelop'
37
37
  require_relative 'shapes/database'
38
+ require_relative 'shapes/db_json'
38
39
  require_relative 'shapes/diamond'
39
40
  require_relative 'shapes/document'
40
41
  require_relative 'shapes/ellipse'
@@ -0,0 +1,9 @@
1
+ # frozen_string_literal: true
2
+
3
+ module DrawioDsl
4
+ module Schema
5
+ class DbJson < Shape
6
+ configure_shape(:db_json)
7
+ end
8
+ end
9
+ end
@@ -119,8 +119,8 @@ module DrawioDsl
119
119
  # rubocop:enable Metrics/AbcSize, Metrics/CyclomaticComplexity, Metrics/PerceivedComplexity
120
120
 
121
121
  def as_xml(xml)
122
- log.error category
123
- log.error type
122
+ # log.error category
123
+ # log.error type
124
124
  draw_element(xml) if category == :element
125
125
  draw_line(xml) if category == :line
126
126
  end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module DrawioDsl
4
- VERSION = '0.8.4'
4
+ VERSION = '0.8.5'
5
5
  end
@@ -1,7 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module DrawioDsl
4
- # DrawioDsl is a DSL for draw-io diagrams.
4
+ # Build the DrawioDsl XML file that is the basis of any draw-io diagrams.
5
5
  class XmlBuilder
6
6
  include KLog::Logging
7
7
 
data/lib/drawio_dsl.rb CHANGED
@@ -21,6 +21,7 @@ require_relative 'drawio_dsl/layout_engine'
21
21
  require_relative 'drawio_dsl/drawio_shapes'
22
22
  require_relative 'drawio_dsl/drawio_extensions_active'
23
23
  require_relative 'drawio_dsl/drawio_extensions'
24
+ require_relative 'drawio_dsl/drawio_page'
24
25
  require_relative 'drawio_dsl/drawio'
25
26
 
26
27
  module DrawioDsl
data/package-lock.json CHANGED
@@ -1,12 +1,12 @@
1
1
  {
2
2
  "name": "drawio_dsl",
3
- "version": "0.8.4",
3
+ "version": "0.8.5",
4
4
  "lockfileVersion": 2,
5
5
  "requires": true,
6
6
  "packages": {
7
7
  "": {
8
8
  "name": "drawio_dsl",
9
- "version": "0.8.4",
9
+ "version": "0.8.5",
10
10
  "devDependencies": {
11
11
  "@klueless-js/semantic-release-rubygem": "github:klueless-js/semantic-release-rubygem",
12
12
  "@semantic-release/changelog": "^6.0.1",
data/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "drawio_dsl",
3
- "version": "0.8.4",
3
+ "version": "0.8.5",
4
4
  "description": "DrawIO DSL can build DrawIO diagrams using a Domain Specific Language",
5
5
  "scripts": {
6
6
  "release": "semantic-release"
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: drawio_dsl
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.8.4
4
+ version: 0.8.5
5
5
  platform: ruby
6
6
  authors:
7
7
  - David Cruwys
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2022-03-17 00:00:00.000000000 Z
11
+ date: 2022-03-20 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: k_config
@@ -89,6 +89,8 @@ files:
89
89
  - ".builders/generators/10-transform-drawio-js.rb"
90
90
  - ".builders/generators/20-drawio-extensions.rb"
91
91
  - ".builders/generators/domain_diagram.rb"
92
+ - ".builders/generators/parking-map.png"
93
+ - ".builders/generators/parking_app.rb"
92
94
  - ".builders/generators/printspeak-architecture-generator.rb"
93
95
  - ".builders/generators/project-plan.rb"
94
96
  - ".builders/generators/sample_diagrams/05-samples.rb"
@@ -113,8 +115,11 @@ files:
113
115
  - Rakefile
114
116
  - bin/console
115
117
  - bin/setup
116
- - docs/domain.drawio
117
- - docs/domain_model.svg
118
+ - docs/domain-modal.md
119
+ - docs/domain-modal/domain_model.drawio
120
+ - docs/domain-modal/domain_model.svg
121
+ - docs/domain-modal/domain_model_custom.drawio
122
+ - docs/domain-modal/domain_model_custom.png
118
123
  - docs/extensions.md
119
124
  - docs/extensions/analyti_cs.svg
120
125
  - docs/extensions/android_inputs.svg
@@ -269,6 +274,10 @@ files:
269
274
  - docs/extensions/venn_gradient.svg
270
275
  - docs/extensions/venn_plain.svg
271
276
  - docs/extensions/vessels.svg
277
+ - docs/parking_app.drawio
278
+ - docs/parking_app.svg
279
+ - docs/printspeak-architecture-generator.drawio
280
+ - docs/printspeak-architecture-generator.svg
272
281
  - docs/project-plan.md
273
282
  - docs/project-plan/project.drawio
274
283
  - docs/project-plan/project_done.svg
@@ -301,6 +310,7 @@ files:
301
310
  - lib/drawio_dsl/drawio_extensions.json
302
311
  - lib/drawio_dsl/drawio_extensions.rb
303
312
  - lib/drawio_dsl/drawio_extensions_active.rb
313
+ - lib/drawio_dsl/drawio_page.rb
304
314
  - lib/drawio_dsl/drawio_shapes.rb
305
315
  - lib/drawio_dsl/formatters/_.rb
306
316
  - lib/drawio_dsl/formatters/base_formatter.rb
@@ -334,6 +344,7 @@ files:
334
344
  - lib/drawio_dsl/schema/shapes/container4.rb
335
345
  - lib/drawio_dsl/schema/shapes/cross.rb
336
346
  - lib/drawio_dsl/schema/shapes/database.rb
347
+ - lib/drawio_dsl/schema/shapes/db_json.rb
337
348
  - lib/drawio_dsl/schema/shapes/diamond.rb
338
349
  - lib/drawio_dsl/schema/shapes/document.rb
339
350
  - lib/drawio_dsl/schema/shapes/ellipse.rb
data/docs/domain.drawio DELETED
@@ -1,31 +0,0 @@
1
- <mxfile host="65bd71144e">
2
- <diagram id="X2d" name="Style-Plain">
3
- <mxGraphModel dx="862" dy="583" grid="0" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="1169" pageHeight="827" background="#fafafa" math="0" shadow="0">
4
- <root>
5
- <mxCell id="page_root_X2d"/>
6
- <mxCell id="node_root_X2d" parent="page_root_X2d"/>
7
- <mxCell id="X2d-2" value="&lt;p style=&quot;margin:0px;margin-left:4px;margin-top:4px;text-align:center&quot;&gt;&lt;b&gt;Container&lt;/b&gt;&lt;/p&gt;&lt;hr size=&quot;1&quot;/&gt;" style="whiteSpace=wrap;html=1;rounded=0;fillColor=#ffe6cc;strokeColor=#d79b00;fontColor=#333333;align=left;overflow=fill;fontSize=12;fontFamily=Helvetica" parent="node_root_X2d" vertex="1">
8
- <mxGeometry x="30" y="30" width="160" height="160" as="geometry"/>
9
- </mxCell>
10
- <mxCell id="X2d-3" value="&lt;p style=&quot;margin:0px;margin-left:4px;margin-top:4px;text-align:center&quot;&gt;&lt;i&gt;&amp;lt;&amp;lt; MixIn &amp;gt;&amp;gt;&lt;/i&gt;&lt;/p&gt;&lt;p style=&quot;margin:0px;margin-left:4px;margin-top:4px;text-align:center&quot;&gt;&lt;b&gt;Block Processor&lt;/b&gt;&lt;/p&gt;&lt;hr size=&quot;1&quot;/&gt;" style="whiteSpace=wrap;html=1;rounded=0;fillColor=#dae8fc;strokeColor=#6c8ebf;fontColor=#333333;align=left;overflow=fill;fontSize=12;fontFamily=Helvetica" parent="node_root_X2d" vertex="1">
11
- <mxGeometry x="250" y="30" width="160" height="160" as="geometry"/>
12
- </mxCell>
13
- <mxCell id="X2d-4" value="Documents" style="whiteSpace=wrap;html=1;rounded=0;fillColor=#f5f5f5;strokeColor=#666666;fontColor=#333333" parent="node_root_X2d" vertex="1">
14
- <mxGeometry x="470" y="30" width="160" height="160" as="geometry"/>
15
- </mxCell>
16
- <mxCell id="X2d-5" value="&lt;p style=&quot;margin:0px;margin-left:4px;margin-top:4px;text-align:center&quot;&gt;&lt;i&gt;&amp;lt;&amp;lt; MixIn &amp;gt;&amp;gt;&lt;/i&gt;&lt;/p&gt;&lt;p style=&quot;margin:0px;margin-left:4px;margin-top:4px;text-align:center&quot;&gt;&lt;b&gt;Block Processor&lt;/b&gt;&lt;/p&gt;&lt;hr size=&quot;1&quot;/&gt;&lt;p style=&quot;margin:0px;margin-left:4px;margin-top:4px&quot;&gt;block: proc&lt;/p&gt;&lt;p style=&quot;margin:0px;margin-left:4px;margin-top:4px&quot;&gt;block_state: symbol&lt;/p&gt;&lt;hr size=&quot;1&quot;/&gt;&lt;p style=&quot;margin:0px;margin-left:4px;margin-top:4px&quot;&gt;depend_on()&lt;/p&gt;" style="whiteSpace=wrap;html=1;rounded=0;fillColor=#dae8fc;strokeColor=#6c8ebf;fontColor=#333333;align=left;overflow=fill;fontSize=12;fontFamily=Helvetica" parent="node_root_X2d" vertex="1">
17
- <mxGeometry x="690" y="30" width="160" height="160" as="geometry"/>
18
- </mxCell>
19
- <mxCell id="4tbYCbTjaN7O87TdMOiT-0" value="&lt;div style=&quot;color: rgb(212 , 212 , 212) ; background-color: rgb(30 , 30 , 30) ; font-family: &amp;#34;menlo&amp;#34; , &amp;#34;monaco&amp;#34; , &amp;#34;courier new&amp;#34; , monospace ; line-height: 18px&quot;&gt;&lt;span style=&quot;color: #ce9178&quot;&gt;db_schema.json&lt;/span&gt;&lt;/div&gt;" style="shape=cylinder3;whiteSpace=wrap;html=1;boundedLbl=1;backgroundOutline=1;size=15;" vertex="1" parent="node_root_X2d">
20
- <mxGeometry x="50" y="199" width="60" height="80" as="geometry"/>
21
- </mxCell>
22
- <mxCell id="4tbYCbTjaN7O87TdMOiT-1" value="11111111" style="shape=datastore;whiteSpace=wrap;html=1;" vertex="1" parent="node_root_X2d">
23
- <mxGeometry x="182" y="112" width="60" height="60" as="geometry"/>
24
- </mxCell>
25
- <mxCell id="4tbYCbTjaN7O87TdMOiT-2" value="db_schema.json" style="strokeWidth=1;html=1;shape=mxgraph.flowchart.database;whiteSpace=wrap;" vertex="1" parent="node_root_X2d">
26
- <mxGeometry x="193" y="249" width="138" height="60" as="geometry"/>
27
- </mxCell>
28
- </root>
29
- </mxGraphModel>
30
- </diagram>
31
- </mxfile>
@@ -1,3 +0,0 @@
1
- <?xml version="1.0" encoding="UTF-8"?>
2
- <!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
3
- <svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="822px" height="162px" viewBox="-0.5 -0.5 822 162"><defs/><g><rect x="0" y="0" width="160" height="160" fill="#ffe6cc" stroke="#d79b00" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe flex-start; width: 162px; height: 160px; padding-top: 0px; margin-left: 0px;"><div data-drawio-colors="color: #333333; " style="box-sizing: border-box; font-size: 0px; text-align: left; width: 160px; height: 160px; overflow: hidden;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(51, 51, 51); line-height: 1.2; pointer-events: all; width: 100%; height: 100%; white-space: normal; overflow-wrap: normal;"><p style="margin: 0px ; margin-left: 4px ; margin-top: 4px ; text-align: center"><b>Container</b></p><hr size="1" /></div></div></div></foreignObject><text x="0" y="84" fill="#333333" font-family="Helvetica" font-size="12px">Container</text></switch></g><rect x="220" y="0" width="160" height="160" fill="#dae8fc" stroke="#6c8ebf" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe flex-start; width: 162px; height: 160px; padding-top: 0px; margin-left: 220px;"><div data-drawio-colors="color: #333333; " style="box-sizing: border-box; font-size: 0px; text-align: left; width: 160px; height: 160px; overflow: hidden;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(51, 51, 51); line-height: 1.2; pointer-events: all; width: 100%; height: 100%; white-space: normal; overflow-wrap: normal;"><p style="margin: 0px ; margin-left: 4px ; margin-top: 4px ; text-align: center"><i>&lt;&lt; MixIn &gt;&gt;</i></p><p style="margin: 0px ; margin-left: 4px ; margin-top: 4px ; text-align: center"><b>Block Processor</b></p><hr size="1" /></div></div></div></foreignObject><text x="220" y="84" fill="#333333" font-family="Helvetica" font-size="12px">&lt;&lt; MixIn &gt;&gt;...</text></switch></g><rect x="440" y="0" width="160" height="160" fill="#f5f5f5" stroke="#666666" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 158px; height: 1px; padding-top: 80px; margin-left: 441px;"><div data-drawio-colors="color: #333333; " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(51, 51, 51); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">Documents</div></div></div></foreignObject><text x="520" y="84" fill="#333333" font-family="Helvetica" font-size="12px" text-anchor="middle">Documents</text></switch></g><rect x="660" y="0" width="160" height="160" fill="#dae8fc" stroke="#6c8ebf" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe flex-start; width: 162px; height: 160px; padding-top: 0px; margin-left: 660px;"><div data-drawio-colors="color: #333333; " style="box-sizing: border-box; font-size: 0px; text-align: left; width: 160px; height: 160px; overflow: hidden;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(51, 51, 51); line-height: 1.2; pointer-events: all; width: 100%; height: 100%; white-space: normal; overflow-wrap: normal;"><p style="margin: 0px ; margin-left: 4px ; margin-top: 4px ; text-align: center"><i>&lt;&lt; MixIn &gt;&gt;</i></p><p style="margin: 0px ; margin-left: 4px ; margin-top: 4px ; text-align: center"><b>Block Processor</b></p><hr size="1" /><p style="margin: 0px ; margin-left: 4px ; margin-top: 4px">block: proc</p><p style="margin: 0px ; margin-left: 4px ; margin-top: 4px">block_state: symbol</p><hr size="1" /><p style="margin: 0px ; margin-left: 4px ; margin-top: 4px">depend_on()</p></div></div></div></foreignObject><text x="660" y="84" fill="#333333" font-family="Helvetica" font-size="12px">&lt;&lt; MixIn &gt;&gt;...</text></switch></g></g><switch><g requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"/><a transform="translate(0,-5)" xlink:href="https://www.diagrams.net/doc/faq/svg-export-text-problems" target="_blank"><text text-anchor="middle" font-size="10px" x="50%" y="100%">Text is not SVG - cannot display</text></a></switch></svg>