YAML Front Matter
YChart supports YAML front matter to configure options, define schemas, and create custom card templates directly in your data file.
Basic Structure
YAML front matter is enclosed between --- markers at the beginning of your YAML file:
---
# Front matter section
options:
nodeWidth: 220
nodeHeight: 110
schema:
id: number | required
name: string | required
---
# Your actual data starts here
- id: 1
name: CEO
Three Front Matter Sections
1. Options Section
Configure chart layout and appearance:
---
options:
nodeWidth: 250
nodeHeight: 120
siblingSeparation: 120
subtreeSeparation: 150
levelSeparation: 120
editorTheme: light
initialZoom: 0.9
---
Available Options:
nodeWidth: Width of nodes (pixels)nodeHeight: Height of nodes (pixels)siblingSeparation: Horizontal spacing between siblings (pixels)subtreeSeparation: Horizontal spacing between subtrees (pixels)levelSeparation: Vertical spacing between levels (pixels)editorTheme:lightordarkeditorWidth: Width of editor sidebar (pixels)initialZoom: Initial zoom level (0.1 - 3.0)minZoom: Minimum zoom levelmaxZoom: Maximum zoom level
2. Schema Section
Define data validation rules:
---
schema:
id: number | required
name: string | required
role: string
email: string
department: string
phone: string
hireDate: date
---
Schema Types:
string: Text valuesnumber: Numeric valuesboolean: True/false valuesdate: Date valuesarray: Array of valuesobject: Nested object
Schema Modifiers:
required: Field must be presentoptional: Field is optional (default)
Example:
schema:
id: number | required
name: string | required
role: string
email: string
age: number
isActive: boolean
tags: array
3. Card Template Section
Define custom HTML structure for node cards:
---
card:
- div:
class: card-wrapper
style: "padding: 20px; background: white; border-radius: 8px;"
children:
- h2:
class: card-title
content: $name$
- p:
class: card-subtitle
content: $role$
- div:
class: card-footer
children:
- span:
content: $email$
---
Template Variables:
Use $fieldName$ to reference data fields:
$name$- Will be replaced withdata.name$role$- Will be replaced withdata.role$email$- Will be replaced withdata.email
Template Structure:
card:
- element:
class: css-class-name
style: inline-styles
content: $fieldName$ # For text content
children: # For nested elements
- childElement:
# ... child element definition
Complete Example
Here's a complete example using all three sections:
---
options:
nodeWidth: 280
nodeHeight: 160
siblingSeparation: 120
levelSeparation: 140
editorTheme: light
initialZoom: 0.85
schema:
id: number | required
name: string | required
role: string | required
email: string
department: string
phone: string
avatar: string
status: string
card:
- div:
class: employee-card
style: >
padding: 24px;
background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
color: white;
border-radius: 12px;
box-shadow: 0 4px 12px rgba(0,0,0,0.15);
children:
- div:
class: card-header
style: "display: flex; align-items: center; margin-bottom: 16px;"
children:
- img:
class: avatar
src: $avatar$
style: >
width: 48px;
height: 48px;
border-radius: 50%;
margin-right: 12px;
border: 2px solid white;
- div:
children:
- h3:
style: "margin: 0; font-size: 18px; font-weight: 600;"
content: $name$
- p:
style: "margin: 4px 0 0 0; opacity: 0.9; font-size: 14px;"
content: $role$
- div:
class: card-body
style: "border-top: 1px solid rgba(255,255,255,0.2); padding-top: 12px;"
children:
- div:
style: "margin: 8px 0; font-size: 13px;"
children:
- i:
class: icon-mail
style: "margin-right: 8px;"
- span:
content: $email$
- div:
style: "margin: 8px 0; font-size: 13px;"
children:
- i:
class: icon-dept
style: "margin-right: 8px;"
- span:
content: $department$
- div:
style: "margin: 8px 0; font-size: 13px;"
children:
- i:
class: icon-phone
style: "margin-right: 8px;"
- span:
content: $phone$
- div:
class: card-status
style: >
margin-top: 12px;
padding: 6px 12px;
background: rgba(255,255,255,0.2);
border-radius: 20px;
font-size: 12px;
text-align: center;
content: $status$
---
# Actual organizational data
- id: 1
name: Sarah Johnson
role: Chief Executive Officer
email: sarah.johnson@company.com
department: Executive
phone: +1 (555) 0100
avatar: https://i.pravatar.cc/150?img=1
status: Active
children:
- id: 2
name: Mike Chen
role: Chief Technology Officer
email: mike.chen@company.com
department: Technology
phone: +1 (555) 0101
avatar: https://i.pravatar.cc/150?img=12
status: Active
children:
- id: 4
name: Alex Kim
role: Senior Developer
email: alex.kim@company.com
department: Engineering
phone: +1 (555) 0103
avatar: https://i.pravatar.cc/150?img=33
status: Active
- id: 5
name: Emma Davis
role: DevOps Engineer
email: emma.davis@company.com
department: Operations
phone: +1 (555) 0104
avatar: https://i.pravatar.cc/150?img=47
status: Active
- id: 3
name: Rachel Brown
role: Chief Financial Officer
email: rachel.brown@company.com
department: Finance
phone: +1 (555) 0102
avatar: https://i.pravatar.cc/150?img=20
status: Active
children:
- id: 6
name: Tom Wilson
role: Senior Accountant
email: tom.wilson@company.com
department: Accounting
phone: +1 (555) 0105
avatar: https://i.pravatar.cc/150?img=52
status: Active
Priority Order
When rendering nodes, YChart uses this priority:
- Custom Template (set via
.template()method) - Highest priority - Card Template (from YAML front matter
card:section) - Default Template (built-in fallback) - Lowest priority
Conditional Fields
You can use conditional rendering in your templates:
card:
- div:
children:
- h3:
content: $name$
- p:
content: $role$
# Email will only render if it exists
- p:
class: email
content: $email$
# Empty if email doesn't exist
Best Practices
1. Keep It Readable
Use YAML's block scalar style for long inline styles:
style: >
padding: 20px;
background: white;
border-radius: 8px;
box-shadow: 0 2px 8px rgba(0,0,0,0.1);
2. Organize Your Schema
List required fields first:
schema:
id: number | required
name: string | required
role: string | required
email: string
phone: string
3. Use Semantic Class Names
card:
- div:
class: employee-card
children:
- div:
class: card-header
- div:
class: card-body
- div:
class: card-footer
4. Validate Your YAML
Use a YAML validator to check syntax before using:
- YAML Lint
- VS Code YAML extension
Troubleshooting
Front Matter Not Recognized
Make sure:
- Front matter starts at the very beginning of the file
- Both opening and closing
---markers are present - No spaces before the
---markers - YAML syntax is valid
Template Variables Not Replaced
Check that:
- Variable names match your data fields exactly
- Variables use
$fieldName$syntax (with dollar signs) - Field names are case-sensitive
Schema Validation Issues
Remember:
- Schema is for documentation and validation hints
- Data can still contain fields not in schema
- Required fields will show warnings if missing
Next Steps
- Custom Templates - Advanced template customization
- Configuration Options - All available options
- Basic Example - See YAML front matter in action