How the Style Guide Token System Maps to Semantic Roles in Diagram-Design
The style guide token system in Diagram-Design maps abstract semantic roles—such as paper, ink, and accent—to concrete color values, enabling automatic light and dark skin switching without modifying individual diagram specifications.
The cathrynlavery/diagram-design repository employs a centralized style guide token system to maintain visual consistency across all diagram types. Rather than scattering hard-coded hex values throughout type specifications, the system defines semantic roles that describe the purpose of each visual element. This architecture allows the rendering engine to resolve actual colors at runtime based on the active skin, ensuring that a single source of truth drives every visual decision.
The Three-Layer Architecture of the Token System
The mapping between tokens and semantic roles operates through three distinct layers that separate definition from implementation.
Token Tables: The Source of Truth
All visual tokens originate in skills/diagram-design/references/style-guide.md. This file contains the "Tokens → Semantic roles" table (lines 15-29), which lists each token with its hex or rgba values and a description of the role it fulfills.
Key tokens defined in this table include:
paper– Page background and default node fillink– Primary text and stroke colormuted– Secondary text and arrow strokesaccent– Focal color limited to one or two elements per diagramlink– Specific to HTTP/API arrows
Each token specifies default values for both light and dark skins, creating a complete color palette that responds to the rendering context.
Semantic-Role Usage in Type Specifications
Diagram specifications—such as skills/diagram-design/references/type-process.md and skills/diagram-design/references/type-tree.md—reference these semantic roles when describing fills, strokes, and other visual attributes. The role name is used directly in the specification, allowing the renderer to look up the concrete value at runtime.
This design means that type files contain no hard-coded color values. Instead, they declare intent (e.g., "use the accent color for this focal node"), while the actual value remains decoupled in the style guide.
Runtime Resolution in the Rendering Engine
When a diagram is generated, the rendering engine reads the token definitions from the style guide, resolves the appropriate value for the current skin (light or dark), and applies it to the SVG or HTML output. Because tokens are the only location where color and opacity are defined, changing a palette or swapping skins automatically updates all diagrams without requiring edits to individual type files.
Core Semantic Roles and Their Values
The semantic roles abstract color purpose from implementation. Below are the primary roles and their default values as defined in the style guide:
| Semantic Role | Purpose | Light Default | Dark Default |
|---|---|---|---|
paper |
Page background / default node fill | #f5f5f5 (white-smoke) |
#2d3142 (jet-black) |
ink |
Primary text and primary stroke | #2d3142 (jet-black) |
#f5f5f5 (white-smoke) |
muted |
Secondary text and default arrow stroke | #4f5d75 (blue-slate) |
#bfc0c0 (silver) |
soft |
Subtle backgrounds and borders | Varies by skin | Varies by skin |
accent |
Focal colour (limited to 1-2 per diagram) | #eb6c36 (atomic-tangerine) |
#f08a59 |
link |
HTTP/API arrows | #2e5aa8 |
#6a95d8 |
These definitions ensure that semantic meaning remains constant while concrete values adapt to the viewing environment.
Node-Type to Token Mapping in Practice
The "Node type → treatment" section in skills/diagram-design/references/style-guide.md (lines 53-62) maps logical node categories to specific fill and stroke tokens. This mapping illustrates how semantic roles translate to visual treatments:
| Node Type | Fill Token | Stroke Token |
|---|---|---|
focal |
accent-tint |
accent |
backend |
#ffffff (white) |
ink |
store |
ink @ 0.05 |
muted |
external |
ink @ 0.03 |
ink @ 0.30 |
input |
muted @ 0.10 |
soft |
optional |
ink @ 0.02 |
ink @ 0.20 (dashed) |
security |
accent @ 0.05 |
accent @ 0.50 (dashed) |
Note that some entries use opacity modifiers (e.g., @ 0.05) to create variations without defining new tokens, maintaining the constraint that all color values derive from the base token set.
Practical Implementation Examples
Diagram authors reference semantic roles directly in YAML specifications. The rendering layer handles token resolution:
# Example diagram spec using semantic roles
nodes:
- id: api
type: external # → fill: ink @ 0.03, stroke: ink @ 0.30
- id: db
type: store # → fill: ink @ 0.05, stroke: muted
edges:
- from: api
to: db
style: accent # uses the `accent` token for colour & thickness
The rendering engine implements resolution logic similar to the following Python pattern:
# Python snippet that resolves a token to its concrete colour
def resolve_token(token, skin="light"):
tokens = {
"paper": {"light": "#f5f5f5", "dark": "#2d3142"},
"ink": {"light": "#2d3142", "dark": "#f5f5f5"},
"accent":{"light": "#eb6c36", "dark": "#f08a59"},
# … other tokens omitted for brevity …
}
return tokens[token][skin]
print(resolve_token("accent", "dark")) # → #f08a59
This separation allows designers to update the color palette in one location while all diagram specifications automatically inherit the new values.
Validation and Quality Assurance
The repository includes skills/diagram-design/scripts/self_check.py to enforce token system compliance. This validation script ensures that generated diagrams contain no stray hex colors or hard-coded values outside the semantic token system.
For implementation patterns and end-user examples, docs/cookbook.md provides practical guidance on applying these semantic tokens correctly across different diagram types.
Summary
- Centralized definitions in
skills/diagram-design/references/style-guide.mdserve as the single source of truth for all color values. - Three-layer architecture separates token definition, semantic-role usage in type files, and runtime resolution.
- Semantic roles abstract color purpose (e.g.,
paper,ink,accent) from concrete hex values, enabling automatic skin switching. - Node-type mapping assigns specific fill and stroke tokens to logical categories like
external,store, andfocal. - Validation tools like
self_check.pyprevent drift from the token system by detecting unauthorized color values.
Frequently Asked Questions
What is the purpose of semantic roles in Diagram-Design?
Semantic roles abstract the purpose of a color from its specific value. By labeling elements as paper, ink, or accent rather than using hex codes, the system allows global palette changes—such as implementing dark mode—to propagate automatically without editing individual diagram files.
How does the style guide token system handle dark mode?
Each token definition in skills/diagram-design/references/style-guide.md specifies both a light and dark default value. The rendering engine detects the active skin context and resolves the appropriate value at runtime, ensuring consistent contrast ratios across themes.
Where are the token definitions stored in the repository?
The canonical token definitions reside in skills/diagram-design/references/style-guide.md, specifically within the "Tokens → Semantic roles" table (lines 15-29) and the "Node type → treatment" mappings (lines 53-62).
How can I validate that my diagram uses only approved tokens?
Run skills/diagram-design/scripts/self_check.py to validate that your diagram specifications contain no hard-coded colors outside the token system. This script checks that all visual attributes reference valid semantic roles as defined in the style guide.
Have a question about this repo?
These articles cover the highlights, but your codebase questions are specific. Give your agent direct access to the source. Share this with your agent to get started:
curl -s "https://instagit.com/install.md" Maintain an open-source project? Get it listed too →