Concept Diagrams
Generate production-quality SVG diagrams with a unified flat, minimal design system. Output is a single self-contained HTML file that renders identically in any modern browser, with automatic light/dark mode.
Scope
Best suited for:
- Physics setups, chemistry mechanisms, math curves, biology
- Physical objects (aircraft, turbines, smartphones, mechanical watches, cells)
- Anatomy, cross-sections, exploded layer views
- Floor plans, architectural conversions
- Narrative journeys (lifecycle of X, process of Y)
- Hub-spoke system integrations (smart city, IoT networks, electricity grids)
- Educational / textbook-style visuals in any domain
- Quantitative charts (grouped bars, energy profiles)
Look elsewhere first for:
- Dedicated software / cloud infrastructure architecture with a dark tech aesthetic (consider
architecture-diagram if available)
- Hand-drawn whiteboard sketches (consider
excalidraw if available)
- Animated explainers or video output (consider an animation skill)
If a more specialized skill is available for the subject, prefer that. If none fits, this skill can serve as a general-purpose SVG diagram fallback — the output will carry the clean educational aesthetic described below, which is a reasonable default for almost any subject.
Workflow
- Decide on the diagram type (see Diagram Types below).
- Lay out components using the Design System rules.
- Write the full HTML page using
templates/template.html as the wrapper — paste your SVG where the template says <!-- PASTE SVG HERE -->.
- Save as a standalone
.html file (for example ~/my-diagram.html or ./my-diagram.html).
- User opens it directly in a browser — no server, no dependencies.
Optional: if the user wants a browsable gallery of multiple diagrams, see "Local Preview Server" at the bottom.
Load the HTML template:
skill_view(name="concept-diagrams", file_path="templates/template.html")
The template embeds the full CSS design system (c-* color classes, text classes, light/dark variables, arrow marker styles). The SVG you generate relies on these classes being present on the hosting page.
Design System
Philosophy
- Flat: no gradients, drop shadows, blur, glow, or neon effects.
- Minimal: show the essential. No decorative icons inside boxes.
- Consistent: same colors, spacing, typography, and stroke widths across every diagram.
- Dark-mode ready: all colors auto-adapt via CSS classes — no per-mode SVG.
Color Palette
9 color ramps, each with 7 stops. Put the class name on a <g> or shape element; the template CSS handles both modes.
| Class |
50 (lightest) |
100 |
200 |
400 |
600 |
800 |
900 (darkest) |
c-purple |
#EEEDFE |
#CECBF6 |
#AFA9EC |
#7F77DD |
#534AB7 |
#3C3489 |
#26215C |
c-teal |
#E1F5EE |
#9FE1CB |
#5DCAA5 |
#1D9E75 |
#0F6E56 |
#085041 |
#04342C |
c-coral |
#FAECE7 |
#F5C4B3 |
#F0997B |
#D85A30 |
#993C1D |
#712B13 |
#4A1B0C |
c-pink |
#FBEAF0 |
#F4C0D1 |
#ED93B1 |
#D4537E |
#993556 |
#72243E |
#4B1528 |
c-gray |
#F1EFE8 |
#D3D1C7 |
#B4B2A9 |
#888780 |
#5F5E5A |
#444441 |
#2C2C2A |
c-blue |
#E6F1FB |
#B5D4F4 |
#85B7EB |
#378ADD |
#185FA5 |
#0C447C |
#042C53 |
c-green |
#EAF3DE |
#C0DD97 |
#97C459 |
#639922 |
#3B6D11 |
#27500A |
#173404 |
c-amber |
#FAEEDA |
#FAC775 |
#EF9F27 |
#BA7517 |
#854F0B |
#633806 |
#412402 |
c-red |
#FCEBEB |
#F7C1C1 |
#F09595 |
#E24B4A |
#A32D2D |
#791F1F |
#501313 |
Color Assignment Rules
Color encodes meaning, not sequence. Never cycle through colors like a rainbow.
- Group nodes by category — all nodes of the same type share one color.
- Use
c-gray for neutral/structural nodes (start, end, generic steps, users).
- Use 2-3 colors per diagram, not 6+.
- Prefer
c-purple, c-teal, c-coral, c-pink for general categories.
- Reserve
c-blue, c-green, c-amber, c-red for semantic meaning (info, success, warning, error).
Light/dark stop mapping (handled by the template CSS — just use the class):
- Light mode: 50 fill + 600 stroke + 800 title / 600 subtitle
- Dark mode: 800 fill + 200 stroke + 100 title / 200 subtitle
Typography
Only two font sizes. No exceptions.
| Class |
Size |
Weight |
Use |
th |
14px |
500 |
Node titles, region labels |
ts |
12px |
400 |
Subtitles, descriptions, arrow labels |
t |
14px |
400 |
General text |
- Sentence case always. Never Title Case, never ALL CAPS.
- Every
<text> MUST carry a class (t, ts, or th). No unclassed text.
dominant-baseline="central" on all text inside boxes.
text-anchor="middle" for centered text in boxes.
Width estimation (approx):
- 14px weight 500: ~8px per character
- 12px weight 400: ~6.5px per character
- Always verify:
box_width >= (char_count × px_per_char) + 48 (24px padding each side)
Spacing & Layout
- ViewBox:
viewBox="0 0 680 H" where H = content height + 40px buffer.
- Safe area: x=40 to x=640, y=40 to y=(H-40).
- Between boxes: 60px minimum gap.
- Inside boxes: 24px horizontal padding, 12px vertical padding.
- Arrowhead gap: 10px between arrowhead and box edge.
- Single-line box: 44px height.
- Two-line box: 56px height, 18px between title and subtitle baselines.
- Container padding: 20px minimum inside every container.
- Max nesting: 2-3 levels deep. Deeper gets unreadable at 680px width.
Stroke & Shape
- Stroke width: 0.5px on all node borders. Not 1px, not 2px.
- Rect rounding:
rx="8" for nodes, rx="12" for inner containers, rx="16" to rx="20" for outer containers.
- Connector paths: MUST have
fill="none". SVG defaults to fill: black otherwise.
Arrow Marker
Include this <defs> block at the start of every SVG:
<defs>
<marker id="arrow" viewBox="0 0 10 10" refX="8" refY="5"
markerWidth="6" markerHeight="6" orient="auto-start-reverse">
<path d="M2 1L8 5L2 9" fill="none" stroke="context-stroke"
stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
</marker>
</defs>
Use marker-end="url(#arrow)" on lines. The arrowhead inherits the line color via context-stroke.
CSS Classes (Provided by the Template)
The template page provides:
- Text:
.t, .ts, .th
- Neutral:
.box, .arr, .leader, .node
- Color ramps:
.c-purple, .c-teal, .c-coral, .c-pink, .c-gray, .c-blue, .c-green, .c-amber, .c-red (all with automatic light/dark mode)
You do not need to redefine these — just apply them in your SVG. The template file contains the full CSS definitions.
SVG Boilerplate
Every SVG inside the template page starts with this exact structure:
<svg width="100%" viewBox="0 0 680 {HEIGHT}" xmlns="http://www.w3.org/2000/svg">
<defs>
<marker id="arrow" viewBox="0 0 10 10" refX="8" refY="5"
markerWidth="6" markerHeight="6" orient="auto-start-reverse">
<path d="M2 1L8 5L2 9" fill="none" stroke="context-stroke"
stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
</marker>
</defs>
<!-- Diagram content here -->
</svg>
Replace {HEIGHT} with the actual computed height (last element bottom + 40px).
Node Patterns
Single-line node (44px):
<g class="node c-blue">
<rect x="100" y="20" width="180" height="44" rx="8" stroke-width="0.5"/>
<text class="th" x="190" y="42" text-anchor="middle" dominant-baseline="central">Service name</text>
</g>
Two-line node (56px):
<g class="node c-teal">
<rect x="100" y="20" width="200" height="56" rx="8" stroke-width="0.5"/>
<text class="th" x="200" y="38" text-anchor="middle" dominant-baseline="central">Service name</text>
<text class="ts" x="200" y="56" text-anchor="middle" dominant-baseline="central">Short description</text>
</g>
Connector (no label):
<line x1="200" y1="76" x2="200" y2="120" class="arr" marker-end="url(#arrow)"/>
Container (dashed or solid):
<g class="c-purple">
<rect x="40" y="92" width="600" height="300" rx="16" stroke-width="0.5"/>
<text class="th" x="66" y="116">Container label</text>
<text class="ts" x="66" y="134">Subtitle info</text>
</g>
Diagram Types
Choose the layout that fits the subject:
- Flowchart — CI/CD pipelines, request lifecycles, approval workflows, data processing. Single-direction flow (top-down or left-right). Max 4-5 nodes per row.
- Structural / Containment — Cloud infrastructure nesting, system architecture with layers. Large outer containers with inner regions. Dashed rects for logical groupings.
- API / Endpoint Map — REST routes, GraphQL schemas. Tree from root, branching to resource groups, each containing endpoint nodes.
- Microservice Topology — Service mesh, event-driven systems. Services as nodes, arrows for communication patterns, message queues between.
- Data Flow — ETL pipelines, streaming architectures. Left-to-right flow from sources through processing to sinks.
- Physical / Structural — Vehicles, buildings, hardware, anatomy. Use shapes that match the physical form —
<path> for curved bodies, <polygon> for tapered shapes, <ellipse>/<circle> for cylindrical parts, nested <rect> for compartments. See references/physical-shape-cookbook.md.
- Infrastructure / Systems Integration — Smart cities, IoT networks, multi-domain systems. Hub-spoke layout with central platform connecting subsystems. Semantic line styles (
.data-line, .power-line, .water-pipe, .road). See references/infrastructure-patterns.md.
- UI / Dashboard Mockups — Admin panels, monitoring dashboards. Screen frame with nested chart/gauge/indicator elements. See
references/dashboard-patterns.md.
For physical, infrastructure, and dashboard diagrams, load the matching reference file before generating — each one provides ready-made CSS classes and shape primitives.
Validation Checklist
Before finalizing any SVG, verify ALL of the following:
- Every
<text> has class t, ts, or th.
- Every
<text> inside a box has dominant-baseline="central".
- Every connector
<path> or <line> used as arrow has fill="none".
- No arrow line crosses through an unrelated box.
box_width >= (longest_label_chars × 8) + 48 for 14px text.
box_width >= (longest_label_chars × 6.5) + 48 for 12px text.
- ViewBox height = bottom-most element + 40px.
- All content stays within x=40 to x=640.
- Color classes (
c-*) are on <g> or shape elements, never on <path> connectors.
- Arrow
<defs> block is present.
- No gradients, shadows, blur, or glow effects.
- Stroke width is 0.5px on all node borders.
Output & Preview
Default: standalone HTML file
Write a single .html file the user can open directly. No server, no dependencies, works offline. Pattern:
# 1. Load the template
template = skill_view("concept-diagrams", "templates/template.html")
# 2. Fill in title, subtitle, and paste your SVG
html = template.replace(
"<!-- DIAGRAM TITLE HERE -->", "SN2 reaction mechanism"
).replace(
"<!-- OPTIONAL SUBTITLE HERE -->", "Bimolecular nucleophilic substitution"
).replace(
"<!-- PASTE SVG HERE -->", svg_content
)
# 3. Write to a user-chosen path (or ./ by default)
write_file("./sn2-mechanism.html", html)
Tell the user how to open it:
# macOS
open ./sn2-mechanism.html
# Linux
xdg-open ./sn2-mechanism.html
Optional: local preview server (multi-diagram gallery)
Only use this when the user explicitly wants a browsable gallery of multiple diagrams.
Rules:
- Bind to
127.0.0.1 only. Never 0.0.0.0. Exposing diagrams on all network interfaces is a security hazard on shared networks.
- Pick a free port (do NOT hard-code one) and tell the user the chosen URL.
- The server is optional and opt-in — prefer the standalone HTML file first.
Recommended pattern (lets the OS pick a free ephemeral port):
# Put each diagram in its own folder under .diagrams/
mkdir -p .diagrams/sn2-mechanism
# ...write .diagrams/sn2-mechanism/index.html...
# Serve on loopback only, free port
cd .diagrams && python3 -c "
import http.server, socketserver
with socketserver.TCPServer(('127.0.0.1', 0), http.server.SimpleHTTPRequestHandler) as s:
print(f'Serving at http://127.0.0.1:{s.server_address[1]}/')
s.serve_forever()
" &
If the user insists on a fixed port, use 127.0.0.1:<port> — still never 0.0.0.0. Document how to stop the server (kill %1 or pkill -f "http.server").
Examples Reference
The examples/ directory ships 15 complete, tested diagrams. Browse them for working patterns before writing a new diagram of a similar type:
| File |
Type |
Demonstrates |
hospital-emergency-department-flow.md |
Flowchart |
Priority routing with semantic colors |
feature-film-production-pipeline.md |
Flowchart |
Phased workflow, horizontal sub-flows |
automated-password-reset-flow.md |
Flowchart |
Auth flow with error branches |
autonomous-llm-research-agent-flow.md |
Flowchart |
Loop-back arrows, decision branches |
place-order-uml-sequence.md |
Sequence |
UML sequence diagram style |
commercial-aircraft-structure.md |
Physical |
Paths, polygons, ellipses for realistic shapes |
wind-turbine-structure.md |
Physical cross-section |
Underground/above-ground separation, color coding |
smartphone-layer-anatomy.md |
Exploded view |
Alternating left/right labels, layered components |
apartment-floor-plan-conversion.md |
Floor plan |
Walls, doors, proposed changes in dotted red |
banana-journey-tree-to-smoothie.md |
Narrative journey |
Winding path, progressive state changes |
cpu-ooo-microarchitecture.md |
Hardware pipeline |
Fan-out, memory hierarchy sidebar |
sn2-reaction-mechanism.md |
Chemistry |
Molecules, curved arrows, energy profile |
smart-city-infrastructure.md |
Hub-spoke |
Semantic line styles per system |
electricity-grid-flow.md |
Multi-stage flow |
Voltage hierarchy, flow markers |
ml-benchmark-grouped-bar-chart.md |
Chart |
Grouped bars, dual axis |
Load any example with:
skill_view(name="concept-diagrams", file_path="examples/<filename>")
Quick Reference: What to Use When
| User says |
Diagram type |
Suggested colors |
| "show the pipeline" |
Flowchart |
gray start/end, purple steps, red errors, teal deploy |
| "draw the data flow" |
Data pipeline (left-right) |
gray sources, purple processing, teal sinks |
| "visualize the system" |
Structural (containment) |
purple container, teal services, coral data |
| "map the endpoints" |
API tree |
purple root, one ramp per resource group |
| "show the services" |
Microservice topology |
gray ingress, teal services, purple bus, coral workers |
| "draw the aircraft/vehicle" |
Physical |
paths, polygons, ellipses for realistic shapes |
| "smart city / IoT" |
Hub-spoke integration |
semantic line styles per subsystem |
| "show the dashboard" |
UI mockup |
dark screen, chart colors: teal, purple, coral for alerts |
| "power grid / electricity" |
Multi-stage flow |
voltage hierarchy (HV/MV/LV line weights) |
| "wind turbine / turbine" |
Physical cross-section |
foundation + tower cutaway + nacelle color-coded |
| "journey of X / lifecycle" |
Narrative journey |
winding path, progressive state changes |
| "layers of X / exploded" |
Exploded layer view |
vertical stack, alternating labels |
| "CPU / pipeline" |
Hardware pipeline |
vertical stages, fan-out to execution ports |
| "floor plan / apartment" |
Floor plan |
walls, doors, proposed changes in dotted red |
| "reaction mechanism" |
Chemistry |
atoms, bonds, curved arrows, transition state, energy profile |
1---2name: concept-diagrams3description: Generate flat, minimal educational SVG visuals as HTML.4license: MIT5---6
7# Concept Diagrams
8
9Generate production-quality SVG diagrams with a unified flat, minimal design system. Output is a single self-contained HTML file that renders identically in any modern browser, with automatic light/dark mode.
10
11## Scope
12
13**Best suited for:**
14- Physics setups, chemistry mechanisms, math curves, biology
15- Physical objects (aircraft, turbines, smartphones, mechanical watches, cells)
16- Anatomy, cross-sections, exploded layer views
17- Floor plans, architectural conversions
18- Narrative journeys (lifecycle of X, process of Y)
19- Hub-spoke system integrations (smart city, IoT networks, electricity grids)
20- Educational / textbook-style visuals in any domain
21- Quantitative charts (grouped bars, energy profiles)
22
23**Look elsewhere first for:**
24- Dedicated software / cloud infrastructure architecture with a dark tech aesthetic (consider `architecture-diagram` if available)
25- Hand-drawn whiteboard sketches (consider `excalidraw` if available)
26- Animated explainers or video output (consider an animation skill)
27
28If a more specialized skill is available for the subject, prefer that. If none fits, this skill can serve as a general-purpose SVG diagram fallback — the output will carry the clean educational aesthetic described below, which is a reasonable default for almost any subject.
29
30## Workflow
31
321. Decide on the diagram type (see Diagram Types below).
332. Lay out components using the Design System rules.
343. Write the full HTML page using `templates/template.html` as the wrapper — paste your SVG where the template says `<!-- PASTE SVG HERE -->`.
354. Save as a standalone `.html` file (for example `~/my-diagram.html` or `./my-diagram.html`).
365. User opens it directly in a browser — no server, no dependencies.
37
38Optional: if the user wants a browsable gallery of multiple diagrams, see "Local Preview Server" at the bottom.
39
40Load the HTML template:
41```
42skill_view(name="concept-diagrams", file_path="templates/template.html")
43```
44
45The template embeds the full CSS design system (`c-*` color classes, text classes, light/dark variables, arrow marker styles). The SVG you generate relies on these classes being present on the hosting page.
46
47---
48
49## Design System
50
51### Philosophy
52
53- **Flat**: no gradients, drop shadows, blur, glow, or neon effects.
54- **Minimal**: show the essential. No decorative icons inside boxes.
55- **Consistent**: same colors, spacing, typography, and stroke widths across every diagram.
56- **Dark-mode ready**: all colors auto-adapt via CSS classes — no per-mode SVG.
57
58### Color Palette
59
609 color ramps, each with 7 stops. Put the class name on a `<g>` or shape element; the template CSS handles both modes.
61
62| Class | 50 (lightest) | 100 | 200 | 400 | 600 | 800 | 900 (darkest) |
63|------------|---------------|---------|---------|---------|---------|---------|---------------|
64| `c-purple` | #EEEDFE | #CECBF6 | #AFA9EC | #7F77DD | #534AB7 | #3C3489 | #26215C |
65| `c-teal` | #E1F5EE | #9FE1CB | #5DCAA5 | #1D9E75 | #0F6E56 | #085041 | #04342C |
66| `c-coral` | #FAECE7 | #F5C4B3 | #F0997B | #D85A30 | #993C1D | #712B13 | #4A1B0C |
67| `c-pink` | #FBEAF0 | #F4C0D1 | #ED93B1 | #D4537E | #993556 | #72243E | #4B1528 |
68| `c-gray` | #F1EFE8 | #D3D1C7 | #B4B2A9 | #888780 | #5F5E5A | #444441 | #2C2C2A |
69| `c-blue` | #E6F1FB | #B5D4F4 | #85B7EB | #378ADD | #185FA5 | #0C447C | #042C53 |
70| `c-green` | #EAF3DE | #C0DD97 | #97C459 | #639922 | #3B6D11 | #27500A | #173404 |
71| `c-amber` | #FAEEDA | #FAC775 | #EF9F27 | #BA7517 | #854F0B | #633806 | #412402 |
72| `c-red` | #FCEBEB | #F7C1C1 | #F09595 | #E24B4A | #A32D2D | #791F1F | #501313 |
73
74#### Color Assignment Rules
75
76Color encodes **meaning**, not sequence. Never cycle through colors like a rainbow.
77
78- Group nodes by **category** — all nodes of the same type share one color.
79- Use `c-gray` for neutral/structural nodes (start, end, generic steps, users).
80- Use **2-3 colors per diagram**, not 6+.
81- Prefer `c-purple`, `c-teal`, `c-coral`, `c-pink` for general categories.
82- Reserve `c-blue`, `c-green`, `c-amber`, `c-red` for semantic meaning (info, success, warning, error).
83
84Light/dark stop mapping (handled by the template CSS — just use the class):
85- Light mode: 50 fill + 600 stroke + 800 title / 600 subtitle
86- Dark mode: 800 fill + 200 stroke + 100 title / 200 subtitle
87
88### Typography
89
90Only two font sizes. No exceptions.
91
92| Class | Size | Weight | Use |
93|-------|------|--------|-----|
94| `th` | 14px | 500 | Node titles, region labels |
95| `ts` | 12px | 400 | Subtitles, descriptions, arrow labels |
96| `t` | 14px | 400 | General text |
97
98- **Sentence case always.** Never Title Case, never ALL CAPS.
99- Every `<text>` MUST carry a class (`t`, `ts`, or `th`). No unclassed text.
100- `dominant-baseline="central"` on all text inside boxes.
101- `text-anchor="middle"` for centered text in boxes.
102
103**Width estimation (approx):**
104- 14px weight 500: ~8px per character
105- 12px weight 400: ~6.5px per character
106- Always verify: `box_width >= (char_count × px_per_char) + 48` (24px padding each side)
107
108### Spacing & Layout
109
110- **ViewBox**: `viewBox="0 0 680 H"` where H = content height + 40px buffer.
111- **Safe area**: x=40 to x=640, y=40 to y=(H-40).
112- **Between boxes**: 60px minimum gap.
113- **Inside boxes**: 24px horizontal padding, 12px vertical padding.
114- **Arrowhead gap**: 10px between arrowhead and box edge.
115- **Single-line box**: 44px height.
116- **Two-line box**: 56px height, 18px between title and subtitle baselines.
117- **Container padding**: 20px minimum inside every container.
118- **Max nesting**: 2-3 levels deep. Deeper gets unreadable at 680px width.
119
120### Stroke & Shape
121
122- **Stroke width**: 0.5px on all node borders. Not 1px, not 2px.
123- **Rect rounding**: `rx="8"` for nodes, `rx="12"` for inner containers, `rx="16"` to `rx="20"` for outer containers.
124- **Connector paths**: MUST have `fill="none"`. SVG defaults to `fill: black` otherwise.
125
126### Arrow Marker
127
128Include this `<defs>` block at the start of **every** SVG:
129
130```xml
131<defs>
132 <marker id="arrow" viewBox="0 0 10 10" refX="8" refY="5"
133 markerWidth="6" markerHeight="6" orient="auto-start-reverse">
134 <path d="M2 1L8 5L2 9" fill="none" stroke="context-stroke"
135 stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
136 </marker>
137</defs>
138```
139
140Use `marker-end="url(#arrow)"` on lines. The arrowhead inherits the line color via `context-stroke`.
141
142### CSS Classes (Provided by the Template)
143
144The template page provides:
145
146- Text: `.t`, `.ts`, `.th`
147- Neutral: `.box`, `.arr`, `.leader`, `.node`
148- Color ramps: `.c-purple`, `.c-teal`, `.c-coral`, `.c-pink`, `.c-gray`, `.c-blue`, `.c-green`, `.c-amber`, `.c-red` (all with automatic light/dark mode)
149
150You do **not** need to redefine these — just apply them in your SVG. The template file contains the full CSS definitions.
151
152---
153
154## SVG Boilerplate
155
156Every SVG inside the template page starts with this exact structure:
157
158```xml
159<svg width="100%" viewBox="0 0 680 {HEIGHT}" xmlns="http://www.w3.org/2000/svg">
160 <defs>
161 <marker id="arrow" viewBox="0 0 10 10" refX="8" refY="5"
162 markerWidth="6" markerHeight="6" orient="auto-start-reverse">
163 <path d="M2 1L8 5L2 9" fill="none" stroke="context-stroke"
164 stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
165 </marker>
166 </defs>
167
168 <!-- Diagram content here -->
169
170</svg>
171```
172
173Replace `{HEIGHT}` with the actual computed height (last element bottom + 40px).
174
175### Node Patterns
176
177**Single-line node (44px):**
178```xml
179<g class="node c-blue">
180 <rect x="100" y="20" width="180" height="44" rx="8" stroke-width="0.5"/>
181 <text class="th" x="190" y="42" text-anchor="middle" dominant-baseline="central">Service name</text>
182</g>
183```
184
185**Two-line node (56px):**
186```xml
187<g class="node c-teal">
188 <rect x="100" y="20" width="200" height="56" rx="8" stroke-width="0.5"/>
189 <text class="th" x="200" y="38" text-anchor="middle" dominant-baseline="central">Service name</text>
190 <text class="ts" x="200" y="56" text-anchor="middle" dominant-baseline="central">Short description</text>
191</g>
192```
193
194**Connector (no label):**
195```xml
196<line x1="200" y1="76" x2="200" y2="120" class="arr" marker-end="url(#arrow)"/>
197```
198
199**Container (dashed or solid):**
200```xml
201<g class="c-purple">
202 <rect x="40" y="92" width="600" height="300" rx="16" stroke-width="0.5"/>
203 <text class="th" x="66" y="116">Container label</text>
204 <text class="ts" x="66" y="134">Subtitle info</text>
205</g>
206```
207
208---
209
210## Diagram Types
211
212Choose the layout that fits the subject:
213
2141. **Flowchart** — CI/CD pipelines, request lifecycles, approval workflows, data processing. Single-direction flow (top-down or left-right). Max 4-5 nodes per row.
2152. **Structural / Containment** — Cloud infrastructure nesting, system architecture with layers. Large outer containers with inner regions. Dashed rects for logical groupings.
2163. **API / Endpoint Map** — REST routes, GraphQL schemas. Tree from root, branching to resource groups, each containing endpoint nodes.
2174. **Microservice Topology** — Service mesh, event-driven systems. Services as nodes, arrows for communication patterns, message queues between.
2185. **Data Flow** — ETL pipelines, streaming architectures. Left-to-right flow from sources through processing to sinks.
2196. **Physical / Structural** — Vehicles, buildings, hardware, anatomy. Use shapes that match the physical form — `<path>` for curved bodies, `<polygon>` for tapered shapes, `<ellipse>`/`<circle>` for cylindrical parts, nested `<rect>` for compartments. See `references/physical-shape-cookbook.md`.
2207. **Infrastructure / Systems Integration** — Smart cities, IoT networks, multi-domain systems. Hub-spoke layout with central platform connecting subsystems. Semantic line styles (`.data-line`, `.power-line`, `.water-pipe`, `.road`). See `references/infrastructure-patterns.md`.
2218. **UI / Dashboard Mockups** — Admin panels, monitoring dashboards. Screen frame with nested chart/gauge/indicator elements. See `references/dashboard-patterns.md`.
222
223For physical, infrastructure, and dashboard diagrams, load the matching reference file before generating — each one provides ready-made CSS classes and shape primitives.
224
225---
226
227## Validation Checklist
228
229Before finalizing any SVG, verify ALL of the following:
230
2311. Every `<text>` has class `t`, `ts`, or `th`.
2322. Every `<text>` inside a box has `dominant-baseline="central"`.
2333. Every connector `<path>` or `<line>` used as arrow has `fill="none"`.
2344. No arrow line crosses through an unrelated box.
2355. `box_width >= (longest_label_chars × 8) + 48` for 14px text.
2366. `box_width >= (longest_label_chars × 6.5) + 48` for 12px text.
2377. ViewBox height = bottom-most element + 40px.
2388. All content stays within x=40 to x=640.
2399. Color classes (`c-*`) are on `<g>` or shape elements, never on `<path>` connectors.
24010. Arrow `<defs>` block is present.
24111. No gradients, shadows, blur, or glow effects.
24212. Stroke width is 0.5px on all node borders.
243
244---
245
246## Output & Preview
247
248### Default: standalone HTML file
249
250Write a single `.html` file the user can open directly. No server, no dependencies, works offline. Pattern:
251
252```python
253# 1. Load the template
254template = skill_view("concept-diagrams", "templates/template.html")
255
256# 2. Fill in title, subtitle, and paste your SVG
257html = template.replace(
258 "<!-- DIAGRAM TITLE HERE -->", "SN2 reaction mechanism"
259).replace(
260 "<!-- OPTIONAL SUBTITLE HERE -->", "Bimolecular nucleophilic substitution"
261).replace(
262 "<!-- PASTE SVG HERE -->", svg_content
263)
264
265# 3. Write to a user-chosen path (or ./ by default)
266write_file("./sn2-mechanism.html", html)
267```
268
269Tell the user how to open it:
270
271```
272# macOS
273open ./sn2-mechanism.html
274# Linux
275xdg-open ./sn2-mechanism.html
276```
277
278### Optional: local preview server (multi-diagram gallery)
279
280Only use this when the user explicitly wants a browsable gallery of multiple diagrams.
281
282**Rules:**
283- Bind to `127.0.0.1` only. Never `0.0.0.0`. Exposing diagrams on all network interfaces is a security hazard on shared networks.
284- Pick a free port (do NOT hard-code one) and tell the user the chosen URL.
285- The server is optional and opt-in — prefer the standalone HTML file first.
286
287Recommended pattern (lets the OS pick a free ephemeral port):
288
289```bash
290# Put each diagram in its own folder under .diagrams/
291mkdir -p .diagrams/sn2-mechanism
292# ...write .diagrams/sn2-mechanism/index.html...
293
294# Serve on loopback only, free port
295cd .diagrams && python3 -c "
296import http.server, socketserver
297with socketserver.TCPServer(('127.0.0.1', 0), http.server.SimpleHTTPRequestHandler) as s:
298 print(f'Serving at http://127.0.0.1:{s.server_address[1]}/')
299 s.serve_forever()
300" &
301```
302
303If the user insists on a fixed port, use `127.0.0.1:<port>` — still never `0.0.0.0`. Document how to stop the server (`kill %1` or `pkill -f "http.server"`).
304
305---
306
307## Examples Reference
308
309The `examples/` directory ships 15 complete, tested diagrams. Browse them for working patterns before writing a new diagram of a similar type:
310
311| File | Type | Demonstrates |
312|------|------|--------------|
313| `hospital-emergency-department-flow.md` | Flowchart | Priority routing with semantic colors |
314| `feature-film-production-pipeline.md` | Flowchart | Phased workflow, horizontal sub-flows |
315| `automated-password-reset-flow.md` | Flowchart | Auth flow with error branches |
316| `autonomous-llm-research-agent-flow.md` | Flowchart | Loop-back arrows, decision branches |
317| `place-order-uml-sequence.md` | Sequence | UML sequence diagram style |
318| `commercial-aircraft-structure.md` | Physical | Paths, polygons, ellipses for realistic shapes |
319| `wind-turbine-structure.md` | Physical cross-section | Underground/above-ground separation, color coding |
320| `smartphone-layer-anatomy.md` | Exploded view | Alternating left/right labels, layered components |
321| `apartment-floor-plan-conversion.md` | Floor plan | Walls, doors, proposed changes in dotted red |
322| `banana-journey-tree-to-smoothie.md` | Narrative journey | Winding path, progressive state changes |
323| `cpu-ooo-microarchitecture.md` | Hardware pipeline | Fan-out, memory hierarchy sidebar |
324| `sn2-reaction-mechanism.md` | Chemistry | Molecules, curved arrows, energy profile |
325| `smart-city-infrastructure.md` | Hub-spoke | Semantic line styles per system |
326| `electricity-grid-flow.md` | Multi-stage flow | Voltage hierarchy, flow markers |
327| `ml-benchmark-grouped-bar-chart.md` | Chart | Grouped bars, dual axis |
328
329Load any example with:
330```
331skill_view(name="concept-diagrams", file_path="examples/<filename>")
332```
333
334---
335
336## Quick Reference: What to Use When
337
338| User says | Diagram type | Suggested colors |
339|-----------|--------------|------------------|
340| "show the pipeline" | Flowchart | gray start/end, purple steps, red errors, teal deploy |
341| "draw the data flow" | Data pipeline (left-right) | gray sources, purple processing, teal sinks |
342| "visualize the system" | Structural (containment) | purple container, teal services, coral data |
343| "map the endpoints" | API tree | purple root, one ramp per resource group |
344| "show the services" | Microservice topology | gray ingress, teal services, purple bus, coral workers |
345| "draw the aircraft/vehicle" | Physical | paths, polygons, ellipses for realistic shapes |
346| "smart city / IoT" | Hub-spoke integration | semantic line styles per subsystem |
347| "show the dashboard" | UI mockup | dark screen, chart colors: teal, purple, coral for alerts |
348| "power grid / electricity" | Multi-stage flow | voltage hierarchy (HV/MV/LV line weights) |
349| "wind turbine / turbine" | Physical cross-section | foundation + tower cutaway + nacelle color-coded |
350| "journey of X / lifecycle" | Narrative journey | winding path, progressive state changes |
351| "layers of X / exploded" | Exploded layer view | vertical stack, alternating labels |
352| "CPU / pipeline" | Hardware pipeline | vertical stages, fan-out to execution ports |
353| "floor plan / apartment" | Floor plan | walls, doors, proposed changes in dotted red |
354| "reaction mechanism" | Chemistry | atoms, bonds, curved arrows, transition state, energy profile |