@diagrammo/dgmo 0.10.1 → 0.10.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/auto.cjs +1 -1
- package/dist/auto.js +1 -1
- package/dist/auto.mjs +1 -1
- package/package.json +2 -2
- package/docs/guide/chart-arc.md +0 -71
- package/docs/guide/chart-area.md +0 -73
- package/docs/guide/chart-bar-stacked.md +0 -61
- package/docs/guide/chart-bar.md +0 -62
- package/docs/guide/chart-boxes-and-lines.md +0 -243
- package/docs/guide/chart-c4.md +0 -298
- package/docs/guide/chart-chord.md +0 -43
- package/docs/guide/chart-class.md +0 -204
- package/docs/guide/chart-cycle.md +0 -156
- package/docs/guide/chart-doughnut.md +0 -38
- package/docs/guide/chart-er.md +0 -218
- package/docs/guide/chart-flowchart.md +0 -102
- package/docs/guide/chart-function.md +0 -56
- package/docs/guide/chart-funnel.md +0 -38
- package/docs/guide/chart-gantt.md +0 -368
- package/docs/guide/chart-heatmap.md +0 -41
- package/docs/guide/chart-infra.md +0 -694
- package/docs/guide/chart-journey-map.md +0 -179
- package/docs/guide/chart-kanban.md +0 -158
- package/docs/guide/chart-line.md +0 -79
- package/docs/guide/chart-mindmap.md +0 -198
- package/docs/guide/chart-multi-line.md +0 -84
- package/docs/guide/chart-org.md +0 -209
- package/docs/guide/chart-pie.md +0 -39
- package/docs/guide/chart-polar-area.md +0 -38
- package/docs/guide/chart-pyramid.md +0 -111
- package/docs/guide/chart-quadrant.md +0 -69
- package/docs/guide/chart-radar.md +0 -38
- package/docs/guide/chart-sankey.md +0 -103
- package/docs/guide/chart-scatter.md +0 -91
- package/docs/guide/chart-sequence.md +0 -354
- package/docs/guide/chart-sitemap.md +0 -265
- package/docs/guide/chart-slope.md +0 -56
- package/docs/guide/chart-state.md +0 -171
- package/docs/guide/chart-tech-radar.md +0 -219
- package/docs/guide/chart-timeline.md +0 -229
- package/docs/guide/chart-venn.md +0 -81
- package/docs/guide/chart-wireframe.md +0 -100
- package/docs/guide/chart-wordcloud.md +0 -66
- package/docs/guide/colors.md +0 -287
- package/docs/guide/how-dgmo-thinks.md +0 -277
- package/docs/guide/index.md +0 -63
- package/docs/guide/keyboard-shortcuts.md +0 -49
- package/docs/guide/registry.json +0 -58
|
@@ -1,100 +0,0 @@
|
|
|
1
|
-
# Wireframe
|
|
2
|
-
|
|
3
|
-
```dgmo
|
|
4
|
-
wireframe Login Page
|
|
5
|
-
|
|
6
|
-
[Header]
|
|
7
|
-
Acme App
|
|
8
|
-
nav
|
|
9
|
-
Home | active
|
|
10
|
-
About
|
|
11
|
-
Pricing
|
|
12
|
-
|
|
13
|
-
[Main]
|
|
14
|
-
# Sign In
|
|
15
|
-
|
|
16
|
-
Email [user@example.com]
|
|
17
|
-
Password [****] | password
|
|
18
|
-
|
|
19
|
-
<x> Remember me
|
|
20
|
-
|
|
21
|
-
(Sign In)
|
|
22
|
-
(Forgot Password?) | ghost
|
|
23
|
-
|
|
24
|
-
---
|
|
25
|
-
|
|
26
|
-
New here? (Create Account) | ghost
|
|
27
|
-
```
|
|
28
|
-
|
|
29
|
-
## Overview
|
|
30
|
-
|
|
31
|
-
Wireframe diagrams use **visual-mnemonic syntax** where bracket characters communicate the element type. The source text reads as a wireframe even before rendering.
|
|
32
|
-
|
|
33
|
-
## Elements
|
|
34
|
-
|
|
35
|
-
| Syntax | Element |
|
|
36
|
-
|--------|---------|
|
|
37
|
-
| `[text]` (no children) | Text input |
|
|
38
|
-
| `[Name]` (with children) | Group / region |
|
|
39
|
-
| `(Label)` | Button |
|
|
40
|
-
| `{A \| B \| C}` | Dropdown |
|
|
41
|
-
| `<x>` / `< >` | Checkbox |
|
|
42
|
-
| `(*) Label` / `( ) Label` | Radio button |
|
|
43
|
-
| `# Text` | Heading |
|
|
44
|
-
| `## Text` | Subheading |
|
|
45
|
-
| `---` | Divider |
|
|
46
|
-
| `- text` | List item |
|
|
47
|
-
|
|
48
|
-
## Keywords
|
|
49
|
-
|
|
50
|
-
`nav`, `tabs`, `table`, `image`, `modal`, `skeleton`, `alert`, `progress`, `chart`
|
|
51
|
-
|
|
52
|
-
- `image round` / `image wide` — shape hints
|
|
53
|
-
- `chart line` / `chart bar` / `chart pie` — chart silhouettes
|
|
54
|
-
- `progress 60` — percentage bar
|
|
55
|
-
- `table 5x4` — skeleton table with dimensions
|
|
56
|
-
|
|
57
|
-
## States
|
|
58
|
-
|
|
59
|
-
Pipe metadata flags on elements:
|
|
60
|
-
|
|
61
|
-
```
|
|
62
|
-
(Submit) | disabled
|
|
63
|
-
(Delete) | destructive
|
|
64
|
-
(Cancel) | ghost
|
|
65
|
-
[Email] | password
|
|
66
|
-
[Notes] | textarea
|
|
67
|
-
<x> Dark mode | toggle
|
|
68
|
-
[Cards] | horizontal
|
|
69
|
-
```
|
|
70
|
-
|
|
71
|
-
## Layout
|
|
72
|
-
|
|
73
|
-
- **Desktop** (default): 1200px, top-level regions side-by-side
|
|
74
|
-
- **Mobile**: `mobile` keyword, 375px vertical stacking
|
|
75
|
-
- **Smart sizing**: `sidebar` gets ~25%, `main` fills remaining
|
|
76
|
-
- `| horizontal` on any group arranges children in a row
|
|
77
|
-
|
|
78
|
-
## Multi-Element Lines
|
|
79
|
-
|
|
80
|
-
Two or more spaces between elements on one line:
|
|
81
|
-
|
|
82
|
-
```
|
|
83
|
-
Email [user@example.com] // label + field
|
|
84
|
-
(-) 1 (+) // inline stepper
|
|
85
|
-
```
|
|
86
|
-
|
|
87
|
-
## Tables
|
|
88
|
-
|
|
89
|
-
```dgmo
|
|
90
|
-
wireframe Data
|
|
91
|
-
|
|
92
|
-
table
|
|
93
|
-
Name, Email, Role
|
|
94
|
-
John, john@, Admin
|
|
95
|
-
Sally, sally@, Editor
|
|
96
|
-
|
|
97
|
-
// Skeleton shorthand:
|
|
98
|
-
table 5x4
|
|
99
|
-
Name, Email, Role, Status
|
|
100
|
-
```
|
|
@@ -1,66 +0,0 @@
|
|
|
1
|
-
# Word Cloud
|
|
2
|
-
|
|
3
|
-
```dgmo
|
|
4
|
-
wordcloud Pirate Skills
|
|
5
|
-
|
|
6
|
-
swordsmanship 95
|
|
7
|
-
navigation 88
|
|
8
|
-
seamanship 85
|
|
9
|
-
gunnery 80
|
|
10
|
-
leadership 75
|
|
11
|
-
cartography 70
|
|
12
|
-
intimidation 68
|
|
13
|
-
sailing 65
|
|
14
|
-
plundering 60
|
|
15
|
-
knot-tying 55
|
|
16
|
-
lookout 50
|
|
17
|
-
cooking 45
|
|
18
|
-
carpentry 40
|
|
19
|
-
fishing 35
|
|
20
|
-
```
|
|
21
|
-
|
|
22
|
-
## Syntax
|
|
23
|
-
|
|
24
|
-
```
|
|
25
|
-
wordcloud Chart Title
|
|
26
|
-
rotate none
|
|
27
|
-
max 50
|
|
28
|
-
size 14 80
|
|
29
|
-
|
|
30
|
-
Word weight
|
|
31
|
-
```
|
|
32
|
-
|
|
33
|
-
## Metadata Keys
|
|
34
|
-
|
|
35
|
-
| Key | Description | Required |
|
|
36
|
-
| -------- | ------------------------------------------------------------------- | -------- |
|
|
37
|
-
| `chart` | Must be `wordcloud` | Yes |
|
|
38
|
-
| `title` | Chart title displayed above the chart | No |
|
|
39
|
-
| `rotate` | Word rotation: `none` (default), `mixed`, or `angled` | No |
|
|
40
|
-
| `max` | Maximum number of words to display (0 = unlimited) | No |
|
|
41
|
-
| `size` | Min and max font size in pixels, space-separated (default: `14 80`) | No |
|
|
42
|
-
|
|
43
|
-
## Data Format
|
|
44
|
-
|
|
45
|
-
Each data line assigns a weight to a word. Higher weights produce larger text:
|
|
46
|
-
|
|
47
|
-
```
|
|
48
|
-
swordsmanship 95
|
|
49
|
-
navigation 88
|
|
50
|
-
seamanship 85
|
|
51
|
-
```
|
|
52
|
-
|
|
53
|
-
## Body Text Mode
|
|
54
|
-
|
|
55
|
-
You can also paste raw text directly — the word cloud will count word frequencies automatically. Common stop words (a, the, is, etc.) are filtered out.
|
|
56
|
-
|
|
57
|
-
```dgmo
|
|
58
|
-
wordcloud Gettysburg Address
|
|
59
|
-
|
|
60
|
-
Four score and seven years ago our fathers brought forth
|
|
61
|
-
on this continent a new nation conceived in Liberty and
|
|
62
|
-
dedicated to the proposition that all men are created equal.
|
|
63
|
-
Now we are engaged in a great civil war testing whether
|
|
64
|
-
that nation or any nation so conceived and so dedicated
|
|
65
|
-
can long endure.
|
|
66
|
-
```
|
package/docs/guide/colors.md
DELETED
|
@@ -1,287 +0,0 @@
|
|
|
1
|
-
# Colors
|
|
2
|
-
|
|
3
|
-
Diagrammo uses named colors throughout. There are two ways colors appear in diagrams: **inline annotations** directly on elements, and **tags** that map metadata values to colors across many elements at once.
|
|
4
|
-
|
|
5
|
-
## Named Colors
|
|
6
|
-
|
|
7
|
-
Eleven color names are available everywhere colors are accepted:
|
|
8
|
-
|
|
9
|
-
<table>
|
|
10
|
-
<tr><th>Name</th><th>Swatch (Nord)</th></tr>
|
|
11
|
-
<tr><td><code>red</code></td><td><span style="display:inline-block;width:20px;height:20px;background:#bf616a;border-radius:3px;vertical-align:middle"></span></td></tr>
|
|
12
|
-
<tr><td><code>orange</code></td><td><span style="display:inline-block;width:20px;height:20px;background:#d08770;border-radius:3px;vertical-align:middle"></span></td></tr>
|
|
13
|
-
<tr><td><code>yellow</code></td><td><span style="display:inline-block;width:20px;height:20px;background:#ebcb8b;border-radius:3px;vertical-align:middle"></span></td></tr>
|
|
14
|
-
<tr><td><code>green</code></td><td><span style="display:inline-block;width:20px;height:20px;background:#a3be8c;border-radius:3px;vertical-align:middle"></span></td></tr>
|
|
15
|
-
<tr><td><code>blue</code></td><td><span style="display:inline-block;width:20px;height:20px;background:#5e81ac;border-radius:3px;vertical-align:middle"></span></td></tr>
|
|
16
|
-
<tr><td><code>purple</code></td><td><span style="display:inline-block;width:20px;height:20px;background:#b48ead;border-radius:3px;vertical-align:middle"></span></td></tr>
|
|
17
|
-
<tr><td><code>teal</code></td><td><span style="display:inline-block;width:20px;height:20px;background:#8fbcbb;border-radius:3px;vertical-align:middle"></span></td></tr>
|
|
18
|
-
<tr><td><code>cyan</code></td><td><span style="display:inline-block;width:20px;height:20px;background:#88c0d0;border-radius:3px;vertical-align:middle"></span></td></tr>
|
|
19
|
-
<tr><td><code>gray</code></td><td><span style="display:inline-block;width:20px;height:20px;background:#4c566a;border-radius:3px;vertical-align:middle"></span></td></tr>
|
|
20
|
-
<tr><td><code>black</code></td><td><span style="display:inline-block;width:20px;height:20px;background:#2e3440;border-radius:3px;vertical-align:middle"></span></td></tr>
|
|
21
|
-
<tr><td><code>white</code></td><td><span style="display:inline-block;width:20px;height:20px;background:#e5e9f0;border-radius:3px;vertical-align:middle;border:1px solid #d8dee9"></span></td></tr>
|
|
22
|
-
</table>
|
|
23
|
-
|
|
24
|
-
`black` and `white` are theme-stable — each palette picks near-darkest / near-lightest values that stay distinct from the canvas.
|
|
25
|
-
|
|
26
|
-
Swatches above use Nord values. The actual color rendered depends on your active color scheme — see [Color Schemes](#color-schemes) below.
|
|
27
|
-
|
|
28
|
-
---
|
|
29
|
-
|
|
30
|
-
## Color Schemes
|
|
31
|
-
|
|
32
|
-
Diagrammo includes ten built-in color schemes. Change yours in **Settings**. The same eleven color names resolve to different hex values in each scheme. Swatches show all eleven colors (red → white) for light / dark mode.
|
|
33
|
-
|
|
34
|
-
<table>
|
|
35
|
-
<tr><th>Scheme</th><th style="text-align:center">Light</th><th style="text-align:center">Dark</th></tr>
|
|
36
|
-
<tr>
|
|
37
|
-
<td><strong>Bold</strong></td>
|
|
38
|
-
<td><span style="display:inline-flex;gap:2px;background:#ffffff;padding:4px 6px;border-radius:4px;border:1px solid #cccccc"><span style="display:inline-block;width:14px;height:14px;background:#ff0000;border-radius:2px"></span><span style="display:inline-block;width:14px;height:14px;background:#ff8000;border-radius:2px"></span><span style="display:inline-block;width:14px;height:14px;background:#ffcc00;border-radius:2px"></span><span style="display:inline-block;width:14px;height:14px;background:#00cc00;border-radius:2px"></span><span style="display:inline-block;width:14px;height:14px;background:#0000ff;border-radius:2px"></span><span style="display:inline-block;width:14px;height:14px;background:#cc00cc;border-radius:2px"></span><span style="display:inline-block;width:14px;height:14px;background:#009999;border-radius:2px"></span><span style="display:inline-block;width:14px;height:14px;background:#00bfff;border-radius:2px"></span><span style="display:inline-block;width:14px;height:14px;background:#666666;border-radius:2px"></span><span style="display:inline-block;width:14px;height:14px;background:#000000;border-radius:2px"></span><span style="display:inline-block;width:14px;height:14px;background:#f0f0f0;border-radius:2px"></span></span></td>
|
|
39
|
-
<td><span style="display:inline-flex;gap:2px;background:#000000;padding:4px 6px;border-radius:4px;border:1px solid #333333"><span style="display:inline-block;width:14px;height:14px;background:#ff0000;border-radius:2px"></span><span style="display:inline-block;width:14px;height:14px;background:#ff8000;border-radius:2px"></span><span style="display:inline-block;width:14px;height:14px;background:#ffff00;border-radius:2px"></span><span style="display:inline-block;width:14px;height:14px;background:#00ff00;border-radius:2px"></span><span style="display:inline-block;width:14px;height:14px;background:#0066ff;border-radius:2px"></span><span style="display:inline-block;width:14px;height:14px;background:#ff00ff;border-radius:2px"></span><span style="display:inline-block;width:14px;height:14px;background:#00cccc;border-radius:2px"></span><span style="display:inline-block;width:14px;height:14px;background:#00ffff;border-radius:2px"></span><span style="display:inline-block;width:14px;height:14px;background:#999999;border-radius:2px"></span><span style="display:inline-block;width:14px;height:14px;background:#111111;border-radius:2px"></span><span style="display:inline-block;width:14px;height:14px;background:#ffffff;border-radius:2px"></span></span></td>
|
|
40
|
-
</tr>
|
|
41
|
-
<tr>
|
|
42
|
-
<td><strong>Catppuccin</strong></td>
|
|
43
|
-
<td><span style="display:inline-flex;gap:2px;background:#eff1f5;padding:4px 6px;border-radius:4px;border:1px solid #ccd0da"><span style="display:inline-block;width:14px;height:14px;background:#d20f39;border-radius:2px"></span><span style="display:inline-block;width:14px;height:14px;background:#fe640b;border-radius:2px"></span><span style="display:inline-block;width:14px;height:14px;background:#df8e1d;border-radius:2px"></span><span style="display:inline-block;width:14px;height:14px;background:#40a02b;border-radius:2px"></span><span style="display:inline-block;width:14px;height:14px;background:#1e66f5;border-radius:2px"></span><span style="display:inline-block;width:14px;height:14px;background:#8839ef;border-radius:2px"></span><span style="display:inline-block;width:14px;height:14px;background:#179299;border-radius:2px"></span><span style="display:inline-block;width:14px;height:14px;background:#04a5e5;border-radius:2px"></span><span style="display:inline-block;width:14px;height:14px;background:#9ca0b0;border-radius:2px"></span><span style="display:inline-block;width:14px;height:14px;background:#4c4f69;border-radius:2px"></span><span style="display:inline-block;width:14px;height:14px;background:#e6e9ef;border-radius:2px"></span></span></td>
|
|
44
|
-
<td><span style="display:inline-flex;gap:2px;background:#1e1e2e;padding:4px 6px;border-radius:4px;border:1px solid #45475a"><span style="display:inline-block;width:14px;height:14px;background:#f38ba8;border-radius:2px"></span><span style="display:inline-block;width:14px;height:14px;background:#fab387;border-radius:2px"></span><span style="display:inline-block;width:14px;height:14px;background:#f9e2af;border-radius:2px"></span><span style="display:inline-block;width:14px;height:14px;background:#a6e3a1;border-radius:2px"></span><span style="display:inline-block;width:14px;height:14px;background:#89b4fa;border-radius:2px"></span><span style="display:inline-block;width:14px;height:14px;background:#cba6f7;border-radius:2px"></span><span style="display:inline-block;width:14px;height:14px;background:#94e2d5;border-radius:2px"></span><span style="display:inline-block;width:14px;height:14px;background:#89dceb;border-radius:2px"></span><span style="display:inline-block;width:14px;height:14px;background:#a6adc8;border-radius:2px"></span><span style="display:inline-block;width:14px;height:14px;background:#313244;border-radius:2px"></span><span style="display:inline-block;width:14px;height:14px;background:#cdd6f4;border-radius:2px"></span></span></td>
|
|
45
|
-
</tr>
|
|
46
|
-
<tr>
|
|
47
|
-
<td><strong>Dracula</strong></td>
|
|
48
|
-
<td><span style="display:inline-flex;gap:2px;background:#f8f8f2;padding:4px 6px;border-radius:4px;border:1px solid #d8d8d2"><span style="display:inline-block;width:14px;height:14px;background:#ff5555;border-radius:2px"></span><span style="display:inline-block;width:14px;height:14px;background:#ffb86c;border-radius:2px"></span><span style="display:inline-block;width:14px;height:14px;background:#f1fa8c;border-radius:2px"></span><span style="display:inline-block;width:14px;height:14px;background:#50fa7b;border-radius:2px"></span><span style="display:inline-block;width:14px;height:14px;background:#6272a4;border-radius:2px"></span><span style="display:inline-block;width:14px;height:14px;background:#bd93f9;border-radius:2px"></span><span style="display:inline-block;width:14px;height:14px;background:#8be9fd;border-radius:2px"></span><span style="display:inline-block;width:14px;height:14px;background:#8be9fd;border-radius:2px"></span><span style="display:inline-block;width:14px;height:14px;background:#6272a4;border-radius:2px"></span><span style="display:inline-block;width:14px;height:14px;background:#282a36;border-radius:2px"></span><span style="display:inline-block;width:14px;height:14px;background:#f0f0ec;border-radius:2px"></span></span></td>
|
|
49
|
-
<td><span style="display:inline-flex;gap:2px;background:#282a36;padding:4px 6px;border-radius:4px;border:1px solid #6272a4"><span style="display:inline-block;width:14px;height:14px;background:#ff5555;border-radius:2px"></span><span style="display:inline-block;width:14px;height:14px;background:#ffb86c;border-radius:2px"></span><span style="display:inline-block;width:14px;height:14px;background:#f1fa8c;border-radius:2px"></span><span style="display:inline-block;width:14px;height:14px;background:#50fa7b;border-radius:2px"></span><span style="display:inline-block;width:14px;height:14px;background:#6272a4;border-radius:2px"></span><span style="display:inline-block;width:14px;height:14px;background:#bd93f9;border-radius:2px"></span><span style="display:inline-block;width:14px;height:14px;background:#8be9fd;border-radius:2px"></span><span style="display:inline-block;width:14px;height:14px;background:#8be9fd;border-radius:2px"></span><span style="display:inline-block;width:14px;height:14px;background:#6272a4;border-radius:2px"></span><span style="display:inline-block;width:14px;height:14px;background:#343746;border-radius:2px"></span><span style="display:inline-block;width:14px;height:14px;background:#f8f8f2;border-radius:2px"></span></span></td>
|
|
50
|
-
</tr>
|
|
51
|
-
<tr>
|
|
52
|
-
<td><strong>Gruvbox</strong></td>
|
|
53
|
-
<td><span style="display:inline-flex;gap:2px;background:#fbf1c7;padding:4px 6px;border-radius:4px;border:1px solid #d5c4a1"><span style="display:inline-block;width:14px;height:14px;background:#9d0006;border-radius:2px"></span><span style="display:inline-block;width:14px;height:14px;background:#af3a03;border-radius:2px"></span><span style="display:inline-block;width:14px;height:14px;background:#b57614;border-radius:2px"></span><span style="display:inline-block;width:14px;height:14px;background:#79740e;border-radius:2px"></span><span style="display:inline-block;width:14px;height:14px;background:#076678;border-radius:2px"></span><span style="display:inline-block;width:14px;height:14px;background:#8f3f71;border-radius:2px"></span><span style="display:inline-block;width:14px;height:14px;background:#427b58;border-radius:2px"></span><span style="display:inline-block;width:14px;height:14px;background:#689d6a;border-radius:2px"></span><span style="display:inline-block;width:14px;height:14px;background:#7c6f64;border-radius:2px"></span><span style="display:inline-block;width:14px;height:14px;background:#3c3836;border-radius:2px"></span><span style="display:inline-block;width:14px;height:14px;background:#ebdbb2;border-radius:2px"></span></span></td>
|
|
54
|
-
<td><span style="display:inline-flex;gap:2px;background:#282828;padding:4px 6px;border-radius:4px;border:1px solid #504945"><span style="display:inline-block;width:14px;height:14px;background:#fb4934;border-radius:2px"></span><span style="display:inline-block;width:14px;height:14px;background:#fe8019;border-radius:2px"></span><span style="display:inline-block;width:14px;height:14px;background:#fabd2f;border-radius:2px"></span><span style="display:inline-block;width:14px;height:14px;background:#b8bb26;border-radius:2px"></span><span style="display:inline-block;width:14px;height:14px;background:#83a598;border-radius:2px"></span><span style="display:inline-block;width:14px;height:14px;background:#d3869b;border-radius:2px"></span><span style="display:inline-block;width:14px;height:14px;background:#8ec07c;border-radius:2px"></span><span style="display:inline-block;width:14px;height:14px;background:#8ec07c;border-radius:2px"></span><span style="display:inline-block;width:14px;height:14px;background:#928374;border-radius:2px"></span><span style="display:inline-block;width:14px;height:14px;background:#3c3836;border-radius:2px"></span><span style="display:inline-block;width:14px;height:14px;background:#ebdbb2;border-radius:2px"></span></span></td>
|
|
55
|
-
</tr>
|
|
56
|
-
<tr>
|
|
57
|
-
<td><strong>Monokai</strong></td>
|
|
58
|
-
<td><span style="display:inline-flex;gap:2px;background:#fafaf8;padding:4px 6px;border-radius:4px;border:1px solid #d4d3cc"><span style="display:inline-block;width:14px;height:14px;background:#f92672;border-radius:2px"></span><span style="display:inline-block;width:14px;height:14px;background:#fd971f;border-radius:2px"></span><span style="display:inline-block;width:14px;height:14px;background:#e6db74;border-radius:2px"></span><span style="display:inline-block;width:14px;height:14px;background:#a6e22e;border-radius:2px"></span><span style="display:inline-block;width:14px;height:14px;background:#5c7eab;border-radius:2px"></span><span style="display:inline-block;width:14px;height:14px;background:#ae81ff;border-radius:2px"></span><span style="display:inline-block;width:14px;height:14px;background:#66d9ef;border-radius:2px"></span><span style="display:inline-block;width:14px;height:14px;background:#66d9ef;border-radius:2px"></span><span style="display:inline-block;width:14px;height:14px;background:#75715e;border-radius:2px"></span><span style="display:inline-block;width:14px;height:14px;background:#272822;border-radius:2px"></span><span style="display:inline-block;width:14px;height:14px;background:#f0efe8;border-radius:2px"></span></span></td>
|
|
59
|
-
<td><span style="display:inline-flex;gap:2px;background:#272822;padding:4px 6px;border-radius:4px;border:1px solid #49483e"><span style="display:inline-block;width:14px;height:14px;background:#f92672;border-radius:2px"></span><span style="display:inline-block;width:14px;height:14px;background:#fd971f;border-radius:2px"></span><span style="display:inline-block;width:14px;height:14px;background:#e6db74;border-radius:2px"></span><span style="display:inline-block;width:14px;height:14px;background:#a6e22e;border-radius:2px"></span><span style="display:inline-block;width:14px;height:14px;background:#5c7eab;border-radius:2px"></span><span style="display:inline-block;width:14px;height:14px;background:#ae81ff;border-radius:2px"></span><span style="display:inline-block;width:14px;height:14px;background:#66d9ef;border-radius:2px"></span><span style="display:inline-block;width:14px;height:14px;background:#66d9ef;border-radius:2px"></span><span style="display:inline-block;width:14px;height:14px;background:#75715e;border-radius:2px"></span><span style="display:inline-block;width:14px;height:14px;background:#2d2e27;border-radius:2px"></span><span style="display:inline-block;width:14px;height:14px;background:#f8f8f2;border-radius:2px"></span></span></td>
|
|
60
|
-
</tr>
|
|
61
|
-
<tr>
|
|
62
|
-
<td><strong>Nord</strong></td>
|
|
63
|
-
<td><span style="display:inline-flex;gap:2px;background:#eceff4;padding:4px 6px;border-radius:4px;border:1px solid #d8dee9"><span style="display:inline-block;width:14px;height:14px;background:#bf616a;border-radius:2px"></span><span style="display:inline-block;width:14px;height:14px;background:#d08770;border-radius:2px"></span><span style="display:inline-block;width:14px;height:14px;background:#ebcb8b;border-radius:2px"></span><span style="display:inline-block;width:14px;height:14px;background:#a3be8c;border-radius:2px"></span><span style="display:inline-block;width:14px;height:14px;background:#5e81ac;border-radius:2px"></span><span style="display:inline-block;width:14px;height:14px;background:#b48ead;border-radius:2px"></span><span style="display:inline-block;width:14px;height:14px;background:#8fbcbb;border-radius:2px"></span><span style="display:inline-block;width:14px;height:14px;background:#88c0d0;border-radius:2px"></span><span style="display:inline-block;width:14px;height:14px;background:#4c566a;border-radius:2px"></span><span style="display:inline-block;width:14px;height:14px;background:#2e3440;border-radius:2px"></span><span style="display:inline-block;width:14px;height:14px;background:#e5e9f0;border-radius:2px"></span></span></td>
|
|
64
|
-
<td><span style="display:inline-flex;gap:2px;background:#2e3440;padding:4px 6px;border-radius:4px;border:1px solid #4c566a"><span style="display:inline-block;width:14px;height:14px;background:#bf616a;border-radius:2px"></span><span style="display:inline-block;width:14px;height:14px;background:#d08770;border-radius:2px"></span><span style="display:inline-block;width:14px;height:14px;background:#ebcb8b;border-radius:2px"></span><span style="display:inline-block;width:14px;height:14px;background:#a3be8c;border-radius:2px"></span><span style="display:inline-block;width:14px;height:14px;background:#5e81ac;border-radius:2px"></span><span style="display:inline-block;width:14px;height:14px;background:#b48ead;border-radius:2px"></span><span style="display:inline-block;width:14px;height:14px;background:#8fbcbb;border-radius:2px"></span><span style="display:inline-block;width:14px;height:14px;background:#88c0d0;border-radius:2px"></span><span style="display:inline-block;width:14px;height:14px;background:#4c566a;border-radius:2px"></span><span style="display:inline-block;width:14px;height:14px;background:#3b4252;border-radius:2px"></span><span style="display:inline-block;width:14px;height:14px;background:#eceff4;border-radius:2px"></span></span></td>
|
|
65
|
-
</tr>
|
|
66
|
-
<tr>
|
|
67
|
-
<td><strong>One Dark</strong></td>
|
|
68
|
-
<td><span style="display:inline-flex;gap:2px;background:#fafafa;padding:4px 6px;border-radius:4px;border:1px solid #d0d0d0"><span style="display:inline-block;width:14px;height:14px;background:#e45649;border-radius:2px"></span><span style="display:inline-block;width:14px;height:14px;background:#c18401;border-radius:2px"></span><span style="display:inline-block;width:14px;height:14px;background:#c18401;border-radius:2px"></span><span style="display:inline-block;width:14px;height:14px;background:#50a14f;border-radius:2px"></span><span style="display:inline-block;width:14px;height:14px;background:#4078f2;border-radius:2px"></span><span style="display:inline-block;width:14px;height:14px;background:#a626a4;border-radius:2px"></span><span style="display:inline-block;width:14px;height:14px;background:#0184bc;border-radius:2px"></span><span style="display:inline-block;width:14px;height:14px;background:#0184bc;border-radius:2px"></span><span style="display:inline-block;width:14px;height:14px;background:#a0a1a7;border-radius:2px"></span><span style="display:inline-block;width:14px;height:14px;background:#383a42;border-radius:2px"></span><span style="display:inline-block;width:14px;height:14px;background:#f0f0f0;border-radius:2px"></span></span></td>
|
|
69
|
-
<td><span style="display:inline-flex;gap:2px;background:#282c34;padding:4px 6px;border-radius:4px;border:1px solid #3e4451"><span style="display:inline-block;width:14px;height:14px;background:#e06c75;border-radius:2px"></span><span style="display:inline-block;width:14px;height:14px;background:#d19a66;border-radius:2px"></span><span style="display:inline-block;width:14px;height:14px;background:#e5c07b;border-radius:2px"></span><span style="display:inline-block;width:14px;height:14px;background:#98c379;border-radius:2px"></span><span style="display:inline-block;width:14px;height:14px;background:#61afef;border-radius:2px"></span><span style="display:inline-block;width:14px;height:14px;background:#c678dd;border-radius:2px"></span><span style="display:inline-block;width:14px;height:14px;background:#56b6c2;border-radius:2px"></span><span style="display:inline-block;width:14px;height:14px;background:#56b6c2;border-radius:2px"></span><span style="display:inline-block;width:14px;height:14px;background:#abb2bf;border-radius:2px"></span><span style="display:inline-block;width:14px;height:14px;background:#21252b;border-radius:2px"></span><span style="display:inline-block;width:14px;height:14px;background:#abb2bf;border-radius:2px"></span></span></td>
|
|
70
|
-
</tr>
|
|
71
|
-
<tr>
|
|
72
|
-
<td><strong>Rosé Pine</strong></td>
|
|
73
|
-
<td><span style="display:inline-flex;gap:2px;background:#faf4ed;padding:4px 6px;border-radius:4px;border:1px solid #f2e9e1"><span style="display:inline-block;width:14px;height:14px;background:#b4637a;border-radius:2px"></span><span style="display:inline-block;width:14px;height:14px;background:#d7827e;border-radius:2px"></span><span style="display:inline-block;width:14px;height:14px;background:#ea9d34;border-radius:2px"></span><span style="display:inline-block;width:14px;height:14px;background:#286983;border-radius:2px"></span><span style="display:inline-block;width:14px;height:14px;background:#56949f;border-radius:2px"></span><span style="display:inline-block;width:14px;height:14px;background:#907aa9;border-radius:2px"></span><span style="display:inline-block;width:14px;height:14px;background:#56949f;border-radius:2px"></span><span style="display:inline-block;width:14px;height:14px;background:#56949f;border-radius:2px"></span><span style="display:inline-block;width:14px;height:14px;background:#9893a5;border-radius:2px"></span><span style="display:inline-block;width:14px;height:14px;background:#575279;border-radius:2px"></span><span style="display:inline-block;width:14px;height:14px;background:#fffaf3;border-radius:2px"></span></span></td>
|
|
74
|
-
<td><span style="display:inline-flex;gap:2px;background:#191724;padding:4px 6px;border-radius:4px;border:1px solid #26233a"><span style="display:inline-block;width:14px;height:14px;background:#eb6f92;border-radius:2px"></span><span style="display:inline-block;width:14px;height:14px;background:#ea9a97;border-radius:2px"></span><span style="display:inline-block;width:14px;height:14px;background:#f6c177;border-radius:2px"></span><span style="display:inline-block;width:14px;height:14px;background:#3e8fb0;border-radius:2px"></span><span style="display:inline-block;width:14px;height:14px;background:#9ccfd8;border-radius:2px"></span><span style="display:inline-block;width:14px;height:14px;background:#c4a7e7;border-radius:2px"></span><span style="display:inline-block;width:14px;height:14px;background:#9ccfd8;border-radius:2px"></span><span style="display:inline-block;width:14px;height:14px;background:#9ccfd8;border-radius:2px"></span><span style="display:inline-block;width:14px;height:14px;background:#908caa;border-radius:2px"></span><span style="display:inline-block;width:14px;height:14px;background:#2a273f;border-radius:2px"></span><span style="display:inline-block;width:14px;height:14px;background:#e0def4;border-radius:2px"></span></span></td>
|
|
75
|
-
</tr>
|
|
76
|
-
<tr>
|
|
77
|
-
<td><strong>Solarized</strong></td>
|
|
78
|
-
<td><span style="display:inline-flex;gap:2px;background:#fdf6e3;padding:4px 6px;border-radius:4px;border:1px solid #eee8d5"><span style="display:inline-block;width:14px;height:14px;background:#dc322f;border-radius:2px"></span><span style="display:inline-block;width:14px;height:14px;background:#cb4b16;border-radius:2px"></span><span style="display:inline-block;width:14px;height:14px;background:#b58900;border-radius:2px"></span><span style="display:inline-block;width:14px;height:14px;background:#859900;border-radius:2px"></span><span style="display:inline-block;width:14px;height:14px;background:#268bd2;border-radius:2px"></span><span style="display:inline-block;width:14px;height:14px;background:#6c71c4;border-radius:2px"></span><span style="display:inline-block;width:14px;height:14px;background:#2aa198;border-radius:2px"></span><span style="display:inline-block;width:14px;height:14px;background:#2aa198;border-radius:2px"></span><span style="display:inline-block;width:14px;height:14px;background:#93a1a1;border-radius:2px"></span><span style="display:inline-block;width:14px;height:14px;background:#657b83;border-radius:2px"></span><span style="display:inline-block;width:14px;height:14px;background:#eee8d5;border-radius:2px"></span></span></td>
|
|
79
|
-
<td><span style="display:inline-flex;gap:2px;background:#002b36;padding:4px 6px;border-radius:4px;border:1px solid #073642"><span style="display:inline-block;width:14px;height:14px;background:#dc322f;border-radius:2px"></span><span style="display:inline-block;width:14px;height:14px;background:#cb4b16;border-radius:2px"></span><span style="display:inline-block;width:14px;height:14px;background:#b58900;border-radius:2px"></span><span style="display:inline-block;width:14px;height:14px;background:#859900;border-radius:2px"></span><span style="display:inline-block;width:14px;height:14px;background:#268bd2;border-radius:2px"></span><span style="display:inline-block;width:14px;height:14px;background:#6c71c4;border-radius:2px"></span><span style="display:inline-block;width:14px;height:14px;background:#2aa198;border-radius:2px"></span><span style="display:inline-block;width:14px;height:14px;background:#2aa198;border-radius:2px"></span><span style="display:inline-block;width:14px;height:14px;background:#586e75;border-radius:2px"></span><span style="display:inline-block;width:14px;height:14px;background:#073642;border-radius:2px"></span><span style="display:inline-block;width:14px;height:14px;background:#839496;border-radius:2px"></span></span></td>
|
|
80
|
-
</tr>
|
|
81
|
-
<tr>
|
|
82
|
-
<td><strong>Tokyo Night</strong></td>
|
|
83
|
-
<td><span style="display:inline-flex;gap:2px;background:#d5d6db;padding:4px 6px;border-radius:4px;border:1px solid #9699a3"><span style="display:inline-block;width:14px;height:14px;background:#f52a65;border-radius:2px"></span><span style="display:inline-block;width:14px;height:14px;background:#b15c00;border-radius:2px"></span><span style="display:inline-block;width:14px;height:14px;background:#8c6c3e;border-radius:2px"></span><span style="display:inline-block;width:14px;height:14px;background:#587539;border-radius:2px"></span><span style="display:inline-block;width:14px;height:14px;background:#2e7de9;border-radius:2px"></span><span style="display:inline-block;width:14px;height:14px;background:#7847bd;border-radius:2px"></span><span style="display:inline-block;width:14px;height:14px;background:#118c74;border-radius:2px"></span><span style="display:inline-block;width:14px;height:14px;background:#007197;border-radius:2px"></span><span style="display:inline-block;width:14px;height:14px;background:#8990b3;border-radius:2px"></span><span style="display:inline-block;width:14px;height:14px;background:#1a1b26;border-radius:2px"></span><span style="display:inline-block;width:14px;height:14px;background:#d0d5e3;border-radius:2px"></span></span></td>
|
|
84
|
-
<td><span style="display:inline-flex;gap:2px;background:#1a1b26;padding:4px 6px;border-radius:4px;border:1px solid #3b4261"><span style="display:inline-block;width:14px;height:14px;background:#f7768e;border-radius:2px"></span><span style="display:inline-block;width:14px;height:14px;background:#ff9e64;border-radius:2px"></span><span style="display:inline-block;width:14px;height:14px;background:#e0af68;border-radius:2px"></span><span style="display:inline-block;width:14px;height:14px;background:#9ece6a;border-radius:2px"></span><span style="display:inline-block;width:14px;height:14px;background:#7aa2f7;border-radius:2px"></span><span style="display:inline-block;width:14px;height:14px;background:#bb9af7;border-radius:2px"></span><span style="display:inline-block;width:14px;height:14px;background:#1abc9c;border-radius:2px"></span><span style="display:inline-block;width:14px;height:14px;background:#7dcfff;border-radius:2px"></span><span style="display:inline-block;width:14px;height:14px;background:#565f89;border-radius:2px"></span><span style="display:inline-block;width:14px;height:14px;background:#292e42;border-radius:2px"></span><span style="display:inline-block;width:14px;height:14px;background:#c0caf5;border-radius:2px"></span></span></td>
|
|
85
|
-
</tr>
|
|
86
|
-
</table>
|
|
87
|
-
|
|
88
|
-
---
|
|
89
|
-
|
|
90
|
-
## Editor vs Export Palette
|
|
91
|
-
|
|
92
|
-
Your editor palette and your export palette don't have to match. You might prefer a dark scheme like Dracula or Tokyo Night while working — easier on the eyes during long sessions — but switch to a light scheme for exports that will end up in presentations, documentation, or shared links.
|
|
93
|
-
|
|
94
|
-
Diagrammo lets you set a separate **Export Color Scheme** in **Settings**. When configured, all exports (PNG, SVG, clipboard, share links) use that palette instead of your editor palette. The export theme (light, dark, or transparent background) is also independent and can be set in the **Export** dialog.
|
|
95
|
-
|
|
96
|
-
If no export palette is set, exports use whatever palette and theme you're currently editing in.
|
|
97
|
-
|
|
98
|
-
---
|
|
99
|
-
|
|
100
|
-
## Inline Color Annotations
|
|
101
|
-
|
|
102
|
-
Place a color name in parentheses directly on an element to color it explicitly.
|
|
103
|
-
|
|
104
|
-
### Flowchart nodes and edges
|
|
105
|
-
|
|
106
|
-
Append `(color)` inside the node definition or on an edge label:
|
|
107
|
-
|
|
108
|
-
```
|
|
109
|
-
flowchart Request Pipeline
|
|
110
|
-
|
|
111
|
-
(Start(green)) -> [Parse Input] -> <Valid?(blue)>
|
|
112
|
-
-yes(green)-> [Process(teal)] -> (Success(green))
|
|
113
|
-
-no(red)-> [Error Handler(red)] -> /Log Error(orange)/ -> (Failure(red))
|
|
114
|
-
```
|
|
115
|
-
|
|
116
|
-
Every node shape supports inline color — rounds `()`, rectangles `[]`, diamonds `<>`, parallelograms `//`, and more.
|
|
117
|
-
|
|
118
|
-
### Timeline eras and markers
|
|
119
|
-
|
|
120
|
-
```
|
|
121
|
-
timeline Project Roadmap
|
|
122
|
-
|
|
123
|
-
era 2025-01 -> 2025-06 Foundation (blue)
|
|
124
|
-
era 2025-07 -> 2025-12 Growth (green)
|
|
125
|
-
|
|
126
|
-
marker 2025-03 Beta Launch (orange)
|
|
127
|
-
marker 2025-09 GA Release (purple)
|
|
128
|
-
```
|
|
129
|
-
|
|
130
|
-
---
|
|
131
|
-
|
|
132
|
-
## Tags: Color by Metadata
|
|
133
|
-
|
|
134
|
-
Tags let you define named groups of values, assign a color to each value, then annotate your diagram elements with metadata. When a tag group is active, every element is colored by its matching value — without scattering color names throughout the diagram.
|
|
135
|
-
|
|
136
|
-
This is the primary way to color sequence diagrams, org charts, infrastructure diagrams, and timelines.
|
|
137
|
-
|
|
138
|
-
### Declaring a tag group
|
|
139
|
-
|
|
140
|
-
```
|
|
141
|
-
tag GroupName alias g
|
|
142
|
-
Value1(blue)
|
|
143
|
-
Value2(green)
|
|
144
|
-
Value3(orange) default
|
|
145
|
-
```
|
|
146
|
-
|
|
147
|
-
- **`alias g`** — a short alias you use when assigning metadata (optional but recommended)
|
|
148
|
-
- **`(color)`** — the color for that value
|
|
149
|
-
- **`default`** — the fallback value applied to elements that have no explicit tag assignment
|
|
150
|
-
|
|
151
|
-
You can define multiple tag groups in one diagram. Only one group is "active" (coloring the diagram) at a time — the active group is selected in the diagram legend.
|
|
152
|
-
|
|
153
|
-
### Assigning metadata to elements
|
|
154
|
-
|
|
155
|
-
Use `| key: Value` after any element to attach metadata:
|
|
156
|
-
|
|
157
|
-
```
|
|
158
|
-
Gateway | t: Platform
|
|
159
|
-
Redis | c: Caching, t: Platform
|
|
160
|
-
```
|
|
161
|
-
|
|
162
|
-
Multiple metadata keys are separated by commas. Use the tag alias as the key.
|
|
163
|
-
|
|
164
|
-
### Sequence diagrams
|
|
165
|
-
|
|
166
|
-
Tags color participant boxes, self-messages, and message arrows. Use `active-tag` to set which tag group is shown by default.
|
|
167
|
-
|
|
168
|
-
```
|
|
169
|
-
sequence API Gateway — Infrastructure Concerns
|
|
170
|
-
active-tag Concern
|
|
171
|
-
|
|
172
|
-
tag Concern alias c
|
|
173
|
-
Caching(blue)
|
|
174
|
-
Auth(green)
|
|
175
|
-
RateLimiting(orange)
|
|
176
|
-
BusinessLogic(purple) default
|
|
177
|
-
|
|
178
|
-
tag Team alias t
|
|
179
|
-
Platform(teal)
|
|
180
|
-
Product(orange)
|
|
181
|
-
Security(red)
|
|
182
|
-
|
|
183
|
-
Mobile is an actor
|
|
184
|
-
Gateway is a gateway | t: Platform
|
|
185
|
-
Redis is a cache | c: Caching, t: Platform
|
|
186
|
-
|
|
187
|
-
[Backend | t: Product]
|
|
188
|
-
UserAPI is a service
|
|
189
|
-
OrderAPI is a service
|
|
190
|
-
DB is a database
|
|
191
|
-
|
|
192
|
-
== Authentication ==
|
|
193
|
-
Mobile -POST /orders-> Gateway
|
|
194
|
-
Gateway -verify token-> Gateway | c: Auth
|
|
195
|
-
Gateway -check rate limit-> Redis | c: RateLimiting
|
|
196
|
-
|
|
197
|
-
== Business Logic ==
|
|
198
|
-
Gateway -POST /orders-> OrderAPI
|
|
199
|
-
OrderAPI -INSERT order-> DB
|
|
200
|
-
OrderAPI -201 Created-> Gateway
|
|
201
|
-
|
|
202
|
-
== Response ==
|
|
203
|
-
Gateway -cache response-> Redis | c: Caching
|
|
204
|
-
Gateway -201 Created-> Mobile
|
|
205
|
-
```
|
|
206
|
-
|
|
207
|
-
Elements that share a tag value with the active group are highlighted in that color. Elements with no matching tag are shown in a neutral gray.
|
|
208
|
-
|
|
209
|
-
### Org charts
|
|
210
|
-
|
|
211
|
-
Org charts use tag groups to color nodes by any metadata field — location, seniority, status, team, etc. Switch between views using the legend.
|
|
212
|
-
|
|
213
|
-
```
|
|
214
|
-
org Acme Corp
|
|
215
|
-
|
|
216
|
-
tag Location
|
|
217
|
-
NY(blue)
|
|
218
|
-
LA(yellow)
|
|
219
|
-
Remote(purple)
|
|
220
|
-
|
|
221
|
-
tag Status
|
|
222
|
-
FTE(green)
|
|
223
|
-
Contractor(orange)
|
|
224
|
-
|
|
225
|
-
Jane Smith
|
|
226
|
-
role: CEO
|
|
227
|
-
location: NY
|
|
228
|
-
status: FTE
|
|
229
|
-
|
|
230
|
-
Alex Chen
|
|
231
|
-
role: CTO
|
|
232
|
-
location: LA
|
|
233
|
-
status: FTE
|
|
234
|
-
|
|
235
|
-
[Platform Team]
|
|
236
|
-
Alice Park
|
|
237
|
-
role: Senior Engineer
|
|
238
|
-
location: NY
|
|
239
|
-
status: FTE
|
|
240
|
-
Bob Torres
|
|
241
|
-
role: Junior Engineer
|
|
242
|
-
location: Remote
|
|
243
|
-
status: Contractor
|
|
244
|
-
```
|
|
245
|
-
|
|
246
|
-
### Infrastructure diagrams
|
|
247
|
-
|
|
248
|
-
```
|
|
249
|
-
infra Production Traffic Flow
|
|
250
|
-
|
|
251
|
-
tag Team alias t
|
|
252
|
-
Backend(blue)
|
|
253
|
-
Platform(teal)
|
|
254
|
-
|
|
255
|
-
CloudFront | t: Platform
|
|
256
|
-
-> CloudArmor
|
|
257
|
-
|
|
258
|
-
CloudArmor | t: Platform
|
|
259
|
-
-> ALB
|
|
260
|
-
|
|
261
|
-
ALB | t: Platform
|
|
262
|
-
-/api-> [API Pods]
|
|
263
|
-
|
|
264
|
-
[API Pods]
|
|
265
|
-
APIServer | t: Backend
|
|
266
|
-
instances: 3
|
|
267
|
-
latency-ms: 45
|
|
268
|
-
```
|
|
269
|
-
|
|
270
|
-
### Timeline diagrams
|
|
271
|
-
|
|
272
|
-
Tags in timelines sort and color swim lanes. Use `sort tag:GroupName` to arrange items by tag value.
|
|
273
|
-
|
|
274
|
-
```
|
|
275
|
-
timeline Product Roadmap 2025
|
|
276
|
-
|
|
277
|
-
tag Team alias t
|
|
278
|
-
Engineering(blue)
|
|
279
|
-
Design(purple)
|
|
280
|
-
Product(green)
|
|
281
|
-
|
|
282
|
-
era 2025-01 -> 2025-06 Phase 1 - Foundation
|
|
283
|
-
|
|
284
|
-
2025-01->2025-03 Core API Development | t: Engineering
|
|
285
|
-
2025-01->2025-02 Design System v1 | t: Design
|
|
286
|
-
2025-02 Competitor Analysis | t: Product
|
|
287
|
-
```
|