@diagrammo/dgmo 0.8.21 → 0.8.23

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 (114) hide show
  1. package/AGENTS.md +2 -1
  2. package/README.md +1 -0
  3. package/dist/cli.cjs +145 -93
  4. package/dist/editor.cjs +20 -3
  5. package/dist/editor.cjs.map +1 -1
  6. package/dist/editor.js +20 -3
  7. package/dist/editor.js.map +1 -1
  8. package/dist/highlight.cjs +15 -2
  9. package/dist/highlight.cjs.map +1 -1
  10. package/dist/highlight.js +15 -2
  11. package/dist/highlight.js.map +1 -1
  12. package/dist/index.cjs +20843 -14937
  13. package/dist/index.cjs.map +1 -1
  14. package/dist/index.d.cts +426 -17
  15. package/dist/index.d.ts +426 -17
  16. package/dist/index.js +20795 -14912
  17. package/dist/index.js.map +1 -1
  18. package/dist/internal.cjs +380 -0
  19. package/dist/internal.cjs.map +1 -0
  20. package/dist/internal.d.cts +179 -0
  21. package/dist/internal.d.ts +179 -0
  22. package/dist/internal.js +337 -0
  23. package/dist/internal.js.map +1 -0
  24. package/docs/guide/chart-cycle.md +156 -0
  25. package/docs/guide/chart-journey-map.md +179 -0
  26. package/docs/guide/chart-pyramid.md +111 -0
  27. package/docs/guide/chart-sitemap.md +18 -1
  28. package/docs/guide/chart-tech-radar.md +219 -0
  29. package/docs/guide/registry.json +6 -0
  30. package/docs/language-reference.md +177 -6
  31. package/gallery/fixtures/boxes-and-lines.dgmo +10 -3
  32. package/gallery/fixtures/c4-full.dgmo +2 -2
  33. package/gallery/fixtures/cycle/ooda-loop.dgmo +25 -0
  34. package/gallery/fixtures/cycle/pdca-circle-nodes.dgmo +12 -0
  35. package/gallery/fixtures/cycle/pdca-minimal.dgmo +6 -0
  36. package/gallery/fixtures/cycle/sprint-cycle-span.dgmo +17 -0
  37. package/gallery/fixtures/gantt-full.dgmo +2 -2
  38. package/gallery/fixtures/gantt.dgmo +2 -2
  39. package/gallery/fixtures/infra-full.dgmo +2 -2
  40. package/gallery/fixtures/infra.dgmo +1 -1
  41. package/gallery/fixtures/pyramid/dikw.dgmo +17 -0
  42. package/gallery/fixtures/pyramid/inverted-funnel.dgmo +16 -0
  43. package/gallery/fixtures/pyramid/minimal.dgmo +5 -0
  44. package/gallery/fixtures/sequence-tags-protocols.dgmo +2 -2
  45. package/gallery/fixtures/sequence-tags.dgmo +2 -2
  46. package/gallery/fixtures/tech-radar-dense.dgmo +77 -0
  47. package/gallery/fixtures/tech-radar.dgmo +36 -0
  48. package/gallery/fixtures/timeline.dgmo +1 -1
  49. package/package.json +11 -1
  50. package/src/boxes-and-lines/layout.ts +309 -33
  51. package/src/boxes-and-lines/parser.ts +86 -10
  52. package/src/boxes-and-lines/renderer.ts +250 -91
  53. package/src/boxes-and-lines/types.ts +1 -1
  54. package/src/c4/layout.ts +8 -8
  55. package/src/c4/parser.ts +35 -2
  56. package/src/c4/renderer.ts +19 -3
  57. package/src/c4/types.ts +1 -0
  58. package/src/chart.ts +14 -7
  59. package/src/cli.ts +5 -35
  60. package/src/completion.ts +233 -41
  61. package/src/cycle/layout.ts +723 -0
  62. package/src/cycle/parser.ts +352 -0
  63. package/src/cycle/renderer.ts +566 -0
  64. package/src/cycle/types.ts +98 -0
  65. package/src/d3.ts +107 -8
  66. package/src/dgmo-router.ts +82 -3
  67. package/src/echarts.ts +8 -5
  68. package/src/editor/dgmo.grammar +5 -1
  69. package/src/editor/dgmo.grammar.js +1 -1
  70. package/src/editor/keywords.ts +17 -0
  71. package/src/gantt/parser.ts +2 -8
  72. package/src/graph/flowchart-parser.ts +15 -21
  73. package/src/graph/state-parser.ts +5 -10
  74. package/src/index.ts +63 -2
  75. package/src/infra/layout.ts +218 -74
  76. package/src/infra/parser.ts +32 -8
  77. package/src/infra/renderer.ts +14 -8
  78. package/src/infra/types.ts +10 -3
  79. package/src/internal.ts +16 -0
  80. package/src/journey-map/layout.ts +386 -0
  81. package/src/journey-map/parser.ts +540 -0
  82. package/src/journey-map/renderer.ts +1521 -0
  83. package/src/journey-map/types.ts +47 -0
  84. package/src/kanban/parser.ts +3 -10
  85. package/src/kanban/renderer.ts +31 -15
  86. package/src/mindmap/parser.ts +12 -18
  87. package/src/mindmap/renderer.ts +14 -13
  88. package/src/mindmap/text-wrap.ts +22 -12
  89. package/src/mindmap/types.ts +2 -2
  90. package/src/org/collapse.ts +81 -0
  91. package/src/org/parser.ts +2 -6
  92. package/src/org/renderer.ts +212 -4
  93. package/src/pyramid/parser.ts +172 -0
  94. package/src/pyramid/renderer.ts +684 -0
  95. package/src/pyramid/types.ts +28 -0
  96. package/src/render.ts +2 -8
  97. package/src/sequence/parser.ts +62 -20
  98. package/src/sequence/renderer.ts +146 -40
  99. package/src/sharing.ts +1 -0
  100. package/src/sitemap/layout.ts +21 -6
  101. package/src/sitemap/parser.ts +26 -17
  102. package/src/sitemap/renderer.ts +34 -0
  103. package/src/sitemap/types.ts +1 -0
  104. package/src/tech-radar/index.ts +14 -0
  105. package/src/tech-radar/interactive.ts +1112 -0
  106. package/src/tech-radar/layout.ts +190 -0
  107. package/src/tech-radar/parser.ts +385 -0
  108. package/src/tech-radar/renderer.ts +1159 -0
  109. package/src/tech-radar/shared.ts +187 -0
  110. package/src/tech-radar/types.ts +81 -0
  111. package/src/utils/description-helpers.ts +33 -0
  112. package/src/utils/legend-layout.ts +3 -1
  113. package/src/utils/parsing.ts +47 -7
  114. package/src/utils/tag-groups.ts +46 -60
@@ -0,0 +1,156 @@
1
+ # Cycle Diagram
2
+
3
+ ```dgmo
4
+ cycle OODA Loop
5
+
6
+ Observe | color: blue
7
+ Gather raw information from the environment
8
+ Monitor unfolding circumstances
9
+ -Unfold circumstances-> | color: blue
10
+
11
+ Orient | color: green
12
+ Analyze and synthesize observations
13
+ Form a mental model of the situation
14
+ -Form hypothesis-> | color: green
15
+
16
+ Decide | color: orange
17
+ Select a course of action
18
+ -Commit to action-> | color: orange
19
+
20
+ Act | color: red
21
+ Execute the chosen course of action
22
+ Generate results that feed back
23
+ -Generate feedback-> | color: red
24
+ ```
25
+
26
+ ## Overview
27
+
28
+ Cycle diagrams show a circular process flow where nodes are arranged on a circle and directed edges connect each to the next, with the last wrapping back to the first. They are ideal for OODA loops, PDCA cycles, product lifecycles, continuous improvement processes, and any workflow that repeats.
29
+
30
+ ## Syntax
31
+
32
+ ```
33
+ cycle Title
34
+
35
+ NodeLabel
36
+ NodeLabel | color: blue, span: 2
37
+ ```
38
+
39
+ The first line declares the chart type and title. Each top-level line declares a node. Nodes are positioned around a circle in declaration order.
40
+
41
+ ## Nodes
42
+
43
+ Every non-indented, non-directive line is a node:
44
+
45
+ ```
46
+ cycle Seasons
47
+
48
+ Spring | color: green
49
+ Summer | color: yellow
50
+ Autumn | color: orange
51
+ Winter | color: blue
52
+ ```
53
+
54
+ ### Node Pipe Metadata
55
+
56
+ | Key | Type | Default | Description |
57
+ |-----|------|---------|-------------|
58
+ | `color` | palette name | auto | Node fill color |
59
+ | `span` | positive number | `1` | Relative arc distance to next node |
60
+ | `description` | string | — | One-liner shown below the label |
61
+
62
+ ### Descriptions
63
+
64
+ Indented lines under a node add description text. Markdown inline formatting is supported (`**bold**`, `*italic*`, `` `code` ``, `[links](url)`). Bullet points with `- item` render as `• item`.
65
+
66
+ ```
67
+ Observe | color: blue
68
+ Gather raw information from the environment
69
+ Monitor unfolding circumstances
70
+ ```
71
+
72
+ If both `| description: text` and indented lines exist, they concatenate (pipe first, then indented).
73
+
74
+ ## Edges
75
+
76
+ Edges are **implicit** — every node connects to the next, with the last wrapping to the first. The `->` syntax annotates edges with labels, descriptions, and styling:
77
+
78
+ ```
79
+ Observe | color: blue
80
+ -Unfold circumstances-> | color: blue
81
+ Synthesize raw data into context
82
+
83
+ Orient | color: green
84
+ -> | width: 4
85
+ ```
86
+
87
+ Edge lines are indented under their source node. A label goes between `-` and `->`. Pipe metadata supports `color` and `width`.
88
+
89
+ ### Edge Descriptions
90
+
91
+ Indented lines under an edge line add description text:
92
+
93
+ ```
94
+ Observe
95
+ -Analyze->
96
+ Break down observations into components
97
+ Identify **key patterns**
98
+ ```
99
+
100
+ ## Span
101
+
102
+ The `span` metadata controls relative arc distance between nodes. A node with `span: 2` gets twice the arc space to the next node:
103
+
104
+ ```
105
+ cycle Weighted Process
106
+
107
+ Important Step | span: 2
108
+ Quick Step
109
+ Another Step | span: 1.5
110
+ ```
111
+
112
+ ## Directives
113
+
114
+ | Directive | Effect |
115
+ |-----------|--------|
116
+ | `direction-counterclockwise` | Reverse cycle direction (default: clockwise) |
117
+ | `hide-descriptions` | Hide description text on all nodes and edges |
118
+ | `circle-nodes` | Render nodes as circles instead of rounded rectangles |
119
+
120
+ ```
121
+ cycle Simple Loop
122
+
123
+ direction-counterclockwise
124
+
125
+ Plan
126
+ Do
127
+ Check
128
+ Act
129
+ ```
130
+
131
+ ## Complete Example
132
+
133
+ ```dgmo
134
+ cycle PDCA Continuous Improvement
135
+
136
+ Plan | color: blue, span: 1.5
137
+ Define objectives and processes
138
+ Establish expected outcomes
139
+ -Start implementation->
140
+
141
+ Do | color: green
142
+ Execute the plan on a small scale
143
+ Collect data for analysis
144
+ -Gather results->
145
+
146
+ Check | color: orange
147
+ Compare results against expectations
148
+ Identify deviations and root causes
149
+ -Propose changes-> | color: orange
150
+
151
+ Act | color: red
152
+ Standardize successful changes
153
+ Address remaining gaps
154
+ -Feed back into planning-> | color: red
155
+ Begin the next improvement cycle
156
+ ```
@@ -0,0 +1,179 @@
1
+ # Journey Map
2
+
3
+ ```dgmo
4
+ journey-map Coffee Shop Visit
5
+
6
+ [Order]
7
+ Walk in | 4
8
+ Wait in line | 2
9
+ Order drink | 4
10
+
11
+ [Wait]
12
+ Find a seat | 3
13
+ Wait for drink | 2
14
+
15
+ [Enjoy]
16
+ Get drink | 5
17
+ ```
18
+
19
+ ## Overview
20
+
21
+ Journey maps visualize a user's experience across a process or service, plotting emotional highs and lows as a continuous curve. Each step has a score (1–5, high is good) that drives the emotion landscape. Phases group related steps, annotations capture pain points, opportunities, and thoughts, and tags add cross-cutting dimensions like channel or touchpoint.
22
+
23
+ Journey maps are ideal for UX research, customer experience mapping, service design, and identifying friction points.
24
+
25
+ ## Syntax
26
+
27
+ ```
28
+ journey-map Title
29
+
30
+ persona Name
31
+
32
+ [Phase Name]
33
+ Step Name | score
34
+ Step Name | score Emotion
35
+ ```
36
+
37
+ The first line must be `journey-map` followed by a title. Phases use bracket syntax at indent 0. Steps are indented within phases.
38
+
39
+ ## Persona
40
+
41
+ Declares the journey's protagonist:
42
+
43
+ ```
44
+ persona Tech-Savvy Shopper
45
+ 28yo developer, price-sensitive, does extensive research
46
+ ```
47
+
48
+ Name is everything after `persona `. Indented lines add description text. Only one persona per diagram.
49
+
50
+ ## Phases
51
+
52
+ Phases group steps into logical stages:
53
+
54
+ ```
55
+ [Research]
56
+ Compare specs | 4
57
+ Watch reviews | 5
58
+
59
+ [Purchase]
60
+ Add to cart | 3
61
+ Complete payment | 3
62
+ ```
63
+
64
+ Phases are optional — steps can appear at root level for a flat continuous flow.
65
+
66
+ ## Steps
67
+
68
+ Steps appear indented within phases (or at indent 0 in flat mode).
69
+
70
+ ### Score Syntax
71
+
72
+ The score goes in the pipe, separating step name from data:
73
+
74
+ ```
75
+ Step Name | 4 // bare score
76
+ Step Name | 4 Delighted // score + emotion label
77
+ Step Name | 4, ch: Web // score + tag metadata
78
+ Step Name | 4 Delighted, ch: Web // score + label + metadata
79
+ Step Name | score: 4, ch: Web // explicit score key
80
+ Step Name // no pipe = scoreless step
81
+ ```
82
+
83
+ - **Score scale**: 1–5 integer (high = good)
84
+ - **Emotion label**: optional single word after the score (e.g., `Frustrated`, `Delighted`, `Neutral`)
85
+ - **Scoreless steps**: render as cards but produce no emotion curve point
86
+
87
+ ## Annotations
88
+
89
+ Deeper-indented lines under a step add context:
90
+
91
+ ```
92
+ Forced account creation | 1 Frustrated
93
+ pain: Wants guest checkout
94
+ opportunity: Add guest checkout option
95
+ thought: Why do I need an account?
96
+ description: User abandoned cart twice
97
+ ```
98
+
99
+ | Prefix | Rendering |
100
+ |--------|-----------|
101
+ | `pain:` | Pain point (red accent) |
102
+ | `opportunity:` | Improvement opportunity (green accent) |
103
+ | `thought:` | User thought (italic) |
104
+ | `description:` | General context text |
105
+
106
+ Multiple annotations per step are allowed.
107
+
108
+ ## Tag Groups
109
+
110
+ Tags add color-coded dimensions like channel or touchpoint:
111
+
112
+ ```
113
+ tag Channel ch
114
+ Web(blue)
115
+ Mobile(purple)
116
+ In-Person(green)
117
+
118
+ [Research]
119
+ Compare specs | 4, ch: Web
120
+ Ask friends | 4, ch: In-Person
121
+ ```
122
+
123
+ Reference tag values in step pipes via the alias.
124
+
125
+ ## Flat Mode
126
+
127
+ Steps at root level (no `[Phase]` brackets) render as a continuous horizontal strip:
128
+
129
+ ```dgmo
130
+ journey-map Quick Feedback
131
+
132
+ Opened app | 4
133
+ Searched for feature | 3
134
+ Hit error | 1 Frustrated
135
+ pain: No helpful error message
136
+ Contacted support | 2
137
+ Got resolution | 5 Relieved
138
+ ```
139
+
140
+ ## Directives
141
+
142
+ | Directive | Effect |
143
+ |-----------|--------|
144
+ | `no-legend` | Hide the score legend |
145
+ | `active-tag GroupName` | Set the active tag group for coloring |
146
+
147
+ ## Complete Example
148
+
149
+ ```dgmo
150
+ journey-map Buying a Laptop
151
+
152
+ persona Tech-Savvy Shopper
153
+ 28yo developer, price-sensitive, does extensive research
154
+
155
+ tag Channel ch
156
+ Web(blue)
157
+ Mobile(purple)
158
+ Email(teal)
159
+ In-Person(green)
160
+
161
+ [Research]
162
+ Compare specs | 4, ch: Web
163
+ description: Checked 12 laptops across 4 review sites
164
+ Watch reviews | 5 Engaged, ch: Mobile
165
+ Ask friends | 4, ch: In-Person
166
+
167
+ [Purchase]
168
+ Add to cart | 3, ch: Web
169
+ Forced account creation | 1 Frustrated, ch: Web
170
+ pain: Wants guest checkout
171
+ pain: Password requirements too strict
172
+ Complete payment | 3, ch: Web
173
+
174
+ [Delivery]
175
+ Track package | 4, ch: Mobile
176
+ Unboxing | 5 Delighted, ch: In-Person
177
+ opportunity: Include setup guide
178
+ thought: Excited to try it out
179
+ ```
@@ -0,0 +1,111 @@
1
+ # Pyramid Diagram
2
+
3
+ ```dgmo
4
+ pyramid Maslow's Hierarchy of Needs
5
+
6
+ Self-Actualization | color: purple
7
+ Morality, creativity, acceptance of facts.
8
+
9
+ Esteem | color: blue
10
+ Respect, recognition, confidence.
11
+
12
+ Love & Belonging | color: green
13
+ Friendship, intimacy, family.
14
+
15
+ Safety | color: yellow
16
+ Security, employment, health.
17
+
18
+ Physiological | color: orange
19
+ Food, water, warmth, rest.
20
+ ```
21
+
22
+ ## Overview
23
+
24
+ Pyramid diagrams show a hierarchy of stacked layers. Each layer gets a colored band with a label and an optional description. Source order reads apex-first — the first layer in the file is the narrowest (visual top), the last is the widest (visual bottom). Use `inverted` to flip into a funnel orientation.
25
+
26
+ ## Syntax
27
+
28
+ ```
29
+ pyramid Title
30
+
31
+ LayerLabel
32
+ LayerLabel | color: blue
33
+ LayerLabel | color: green
34
+ Indented description
35
+ ```
36
+
37
+ The first line declares the chart type and an optional title. Each non-indented, non-directive line declares one layer. At least two layers are required.
38
+
39
+ ## Layers
40
+
41
+ ```
42
+ pyramid Roles
43
+
44
+ Executives | color: purple
45
+ Managers | color: blue
46
+ Individual Contributors | color: green
47
+ ```
48
+
49
+ ### Layer Pipe Metadata
50
+
51
+ | Key | Type | Default | Description |
52
+ |-----|------|---------|-------------|
53
+ | `color` | palette name | auto-assigned | Layer color |
54
+ | `description` | string | — | One-liner shown beside the layer |
55
+
56
+ ### Descriptions
57
+
58
+ Indented lines under a layer add description text. Markdown inline formatting is supported (`**bold**`, `*italic*`, `` `code` ``, `[links](url)`). Bullet points with `- item` render as `• item`.
59
+
60
+ ```
61
+ Wisdom | color: purple
62
+ Ethical judgment, acting with insight.
63
+ - Knowing *why* something matters
64
+ - Acting with long-term perspective
65
+ ```
66
+
67
+ If both `| description: text` and indented lines exist, they concatenate (pipe first, then indented).
68
+
69
+ ## Directives
70
+
71
+ | Directive | Effect |
72
+ |-----------|--------|
73
+ | `inverted` | Flip apex to the bottom (funnel orientation). Source order is preserved — the first layer is always the visual top. |
74
+
75
+ ```
76
+ pyramid Acquisition Funnel
77
+
78
+ inverted
79
+
80
+ Visitors | color: blue
81
+ Signups | color: cyan
82
+ Activated | color: green
83
+ Paid | color: orange
84
+ ```
85
+
86
+ ## Overflow Handling
87
+
88
+ When descriptions don't fit a layer's band, the renderer automatically:
89
+
90
+ - **Wraps** text at the column edge so nothing leaves the canvas
91
+ - **Truncates** with "…" when content exceeds the available lines
92
+ - **Alternates** descriptions left ↔ right when a single column can't hold them
93
+ - **Reveals** the full description when a layer is highlighted (in-app), hiding siblings so it has room
94
+
95
+ ## Complete Example
96
+
97
+ ```dgmo
98
+ pyramid The DIKW Pyramid
99
+
100
+ Wisdom | color: purple
101
+ Ethical judgment, acting with insight — knowing *why*.
102
+
103
+ Knowledge | color: blue
104
+ Synthesized information — knowing *how*.
105
+
106
+ Information | color: green
107
+ Processed data with context — knowing *what*.
108
+
109
+ Data | color: yellow
110
+ Raw facts and measurements — unprocessed signals.
111
+ ```
@@ -7,7 +7,7 @@ tag Auth
7
7
  Public(green)
8
8
  Crew Only(blue)
9
9
 
10
- Home | Auth: Public
10
+ Home | Auth: Public, description: Landing page with interactive demos
11
11
  -shop-> Shop
12
12
  -voyages-> Upcoming Voyages
13
13
  -join crew-> Sign Up
@@ -39,6 +39,7 @@ Home | Auth: Public
39
39
  Sign Up | Auth: Public
40
40
  -welcome aboard-> Dashboard
41
41
  Dashboard | Auth: Crew Only
42
+ description Full overview of crew activity and orders
42
43
  -> My Orders
43
44
  My Orders | Auth: Crew Only
44
45
  -reorder-> Shop
@@ -140,6 +141,22 @@ Home | status: Live | owner: Marketing
140
141
  Products | status: Draft | owner: Product Team
141
142
  ```
142
143
 
144
+ ## Descriptions
145
+
146
+ Add a description to any page using the `description` keyword (indented) or pipe metadata:
147
+
148
+ ```
149
+ // Pipe metadata form
150
+ Pricing | description: Compare plans and features
151
+
152
+ // Indented keyword form (colon optional)
153
+ Dashboard
154
+ description Full overview of crew activity and orders
155
+ My Orders
156
+ ```
157
+
158
+ Descriptions render as secondary text on the page card. The indented form must come before child pages. Multiple `description` lines accumulate into a multi-line description.
159
+
143
160
  ## Node Colors
144
161
 
145
162
  Add a color name in parentheses after a page or group name:
@@ -0,0 +1,219 @@
1
+ # Technology Radar
2
+
3
+ ```dgmo
4
+ tech-radar Pirate Operations Radar — Q2 1718
5
+
6
+ rings
7
+ Full Sail
8
+ Trial Run
9
+ Spyglass
10
+ Davy Jones
11
+
12
+ Tactics | quadrant: top-right
13
+ Ambush at Dawn | ring: Full Sail, trend: stable
14
+ Our most reliable boarding tactic. **90% success rate** when
15
+ approaching from the east with the sun behind us.
16
+ - Crew morale peaks at dawn — grog hasn't worn off yet
17
+ - Reduced cannon fire needed: *3 volleys* vs 8 at midday
18
+ Boarding Parties | ring: Full Sail, trend: stable
19
+ Decoy Flags | ring: Trial Run, trend: up
20
+ Flying false colours until within cannon range. Early results
21
+ are promising — merchant ships drop anchor **40% more often**.
22
+ Smoke Screens | ring: Trial Run, trend: new
23
+ Kraken Diplomacy | ring: Spyglass, trend: new
24
+ Exploring alliances with *sea monsters*. Negotiations ongoing.
25
+
26
+ Vessels | quadrant: top-left
27
+ Brigantine | ring: Full Sail, trend: stable
28
+ Our workhorse. Fast, manoeuvrable, carries **18 cannons**.
29
+ - Crew capacity: 100 pirates
30
+ - Top speed: *11 knots* in fair wind
31
+ Sloop | ring: Full Sail, trend: up
32
+ War Galleon | ring: Trial Run, trend: up
33
+ Captured from the Spanish fleet. Massive firepower but
34
+ **slow to turn** — best for convoy raids, not chases.
35
+ Longboat | ring: Davy Jones, trend: down
36
+
37
+ Plunder Targets | quadrant: bottom-left
38
+ Merchant Convoys | ring: Full Sail, trend: stable
39
+ Core revenue stream — **78% of total plunder**. East India
40
+ Company ships running the spice route remain most lucrative.
41
+ Port Raids | ring: Trial Run, trend: up
42
+ Rival Pirates | ring: Trial Run, trend: new
43
+ Royal Treasury Ships | ring: Spyglass, trend: new
44
+ High risk, astronomical reward. Requires:
45
+ - Inside information from *corrupt harbourmasters*
46
+ - At least **3 allied ships** for the blockade
47
+ - A really good escape plan
48
+ Whaling Ships | ring: Spyglass, trend: stable
49
+ Fishing Villages | ring: Davy Jones, trend: down
50
+ Terrible ROI and **bad for reputation**. The parrot union
51
+ filed a formal complaint.
52
+
53
+ Crew Welfare | quadrant: bottom-right
54
+ Grog Rations | ring: Full Sail, trend: stable
55
+ Non-negotiable. Cutting grog rations caused the *Great Mutiny of 1716*.
56
+ Sea Shanty Program | ring: Trial Run, trend: new
57
+ Hired a shanty master. Crew productivity up **25%** during
58
+ long voyages. Signature tune: *"Yo Ho Ho and a Bottle of Rum"*.
59
+ Dental Plan | ring: Spyglass, trend: up
60
+ Exploring options. Most crew down to **4 teeth** on average.
61
+ Parley with a Port Royal dentist scheduled for Q3.
62
+ ```
63
+
64
+ ## Overview
65
+
66
+ Technology radars visualize how an organization adopts and evaluates technologies, practices, or strategies. Inspired by the [ThoughtWorks Technology Radar](https://www.thoughtworks.com/radar), each radar arranges items ("blips") into concentric rings indicating adoption stage, grouped by quadrant categories.
67
+
68
+ Click any quadrant label to drill down into a detail view with expanded blip descriptions. Click the "Blip Legend" toggle to show or hide the numbered reference listing below the radar.
69
+
70
+ ## Syntax
71
+
72
+ ```
73
+ tech-radar Title
74
+
75
+ rings
76
+ Ring1
77
+ Ring2
78
+
79
+ Quadrant Name | quadrant: position
80
+ Blip Name | ring: RingName, trend: value
81
+ Description text (markdown supported)
82
+ ```
83
+
84
+ ## Settings
85
+
86
+ | Key | Description | Default |
87
+ | --- | ----------- | ------- |
88
+ | `chart` | Must be `tech-radar` | — |
89
+ | `title` | Radar title | None |
90
+
91
+ ## Rings
92
+
93
+ Rings represent adoption stages, ordered from innermost (highest commitment) to outermost (lowest). Declare them in a `rings` block:
94
+
95
+ ```
96
+ rings
97
+ Adopt
98
+ Trial
99
+ Assess
100
+ Hold
101
+ ```
102
+
103
+ You can use any ring names — the classic Adopt/Trial/Assess/Hold is common but not required.
104
+
105
+ ### Ring Aliases
106
+
107
+ Rings support aliases for shorter blip references:
108
+
109
+ ```
110
+ rings
111
+ Adopt alias a
112
+ Trial alias t
113
+ Assess alias x
114
+ Hold alias h
115
+
116
+ Quadrant | quadrant: top-right
117
+ Item Name | ring: a, trend: up
118
+ ```
119
+
120
+ ## Quadrants
121
+
122
+ Exactly 4 quadrants are required. Each needs a unique position:
123
+
124
+ ```
125
+ Techniques | quadrant: top-right
126
+ Tools | quadrant: top-left
127
+ Platforms | quadrant: bottom-left
128
+ Languages | quadrant: bottom-right
129
+ ```
130
+
131
+ **Positions:** `top-left`, `top-right`, `bottom-left`, `bottom-right`
132
+
133
+ ### Custom Colors
134
+
135
+ Override the default quadrant color with `color`:
136
+
137
+ ```
138
+ Tools | quadrant: top-left, color: purple
139
+ ```
140
+
141
+ Default colors: top-left=blue, top-right=green, bottom-left=red, bottom-right=orange.
142
+
143
+ ## Blips
144
+
145
+ Blips are items placed on the radar. Each is indented under its quadrant and requires a `ring` reference:
146
+
147
+ ```
148
+ Kubernetes | ring: Adopt
149
+ Micro Frontends | ring: Trial, trend: up
150
+ ```
151
+
152
+ Ring matching is case-insensitive — `ring: adopt` and `ring: Adopt` both work.
153
+
154
+ ## Trends
155
+
156
+ The optional `trend` metadata controls the visual indicator on each blip:
157
+
158
+ | Trend | Indicator | Meaning |
159
+ | ----- | --------- | ------- |
160
+ | `new` | Double circle | Newly added to the radar |
161
+ | `up` | Inward crescent | Moving toward center (higher adoption) |
162
+ | `down` | Outward crescent | Moving away from center (declining) |
163
+ | `stable` | Plain circle | No change since last assessment |
164
+
165
+ Omitting `trend` renders a plain circle (same as `stable`).
166
+
167
+ ## Descriptions
168
+
169
+ Further-indented lines below a blip become its description. Descriptions support inline markdown:
170
+
171
+ ```
172
+ Rust | ring: Assess, trend: new
173
+ Evaluating for **performance-critical** services.
174
+ Key benefits: *zero-cost abstractions* and `no GC pauses`.
175
+ - 12x throughput improvement in image pipeline
176
+ - See [evaluation doc](https://wiki.example.com/rust)
177
+ ```
178
+
179
+ Descriptions appear in the quadrant detail view and on hover/click in the main radar view.
180
+
181
+ ## Complete Example
182
+
183
+ ```dgmo
184
+ tech-radar Fleet Readiness Radar
185
+
186
+ rings
187
+ Battle Ready
188
+ Sea Trials
189
+ Scouting
190
+ Scuttle
191
+
192
+ Navigation | quadrant: top-right
193
+ Star Charts | ring: Battle Ready, trend: stable
194
+ Compass Calibration | ring: Sea Trials, trend: up
195
+ New lodestone from Madagascar shows **30% better accuracy**.
196
+ Sextant | ring: Battle Ready, trend: stable
197
+ Treasure Maps | ring: Scouting, trend: new
198
+ Celestial Tables | ring: Scouting, trend: new
199
+
200
+ Armaments | quadrant: top-left
201
+ Cannon Broadside | ring: Battle Ready, trend: stable
202
+ Greek Fire | ring: Sea Trials, trend: new
203
+ Chain Shot | ring: Sea Trials, trend: up
204
+ Catapult | ring: Scuttle, trend: down
205
+
206
+ Provisions | quadrant: bottom-left
207
+ Salted Pork | ring: Battle Ready, trend: stable
208
+ Citrus Rations | ring: Sea Trials, trend: up
209
+ Reduced scurvy cases by **80%** in trial crews.
210
+ Rum Distillation | ring: Scouting, trend: new
211
+ Hardtack | ring: Scuttle, trend: down
212
+ Barnacle Soup | ring: Scuttle, trend: down
213
+
214
+ Morale | quadrant: bottom-right
215
+ Shore Leave | ring: Battle Ready, trend: stable
216
+ Sea Shanties | ring: Battle Ready, trend: up
217
+ Parrot Companions | ring: Scouting, trend: new
218
+ Plank Walking | ring: Scuttle, trend: down
219
+ ```