// This skill generates interactive timeline visualizations using the vis-timeline JavaScript library. Use this skill when users need to create historical timelines, project timelines, event sequences, or any chronological data visualization with optional category filtering. The skill creates a complete MicroSim package with HTML, CSS, JSON data, and documentation.
| name | timeline-generator |
| description | This skill generates interactive timeline visualizations using the vis-timeline JavaScript library. Use this skill when users need to create historical timelines, project timelines, event sequences, or any chronological data visualization with optional category filtering. The skill creates a complete MicroSim package with HTML, CSS, JSON data, and documentation. |
This skill generates professional, interactive timeline visualizations using vis-timeline.js. Timelines are ideal for displaying chronological events with rich context including descriptions, notes, and category groupings. The skill creates a complete MicroSim package suitable for embedding in educational content or documentation sites built with MkDocs.
Use this skill when users request:
Common trigger phrases:
Before generating the timeline, collect information about:
Timeline content:
Event data (for each event):
Category filtering:
Integration context:
IMPORTANT: If the user has not provided a specific event list, prompt them:
"I'll create an interactive timeline for you. Please provide the events you'd like to include with:
- Event title/headline
- Date (at least the year)
- Description
- Category (optional)
- Any additional context notes for tooltips (optional)
Would you also like category filter buttons to allow viewing specific types of events?"
Create a new directory for the MicroSim following this pattern:
docs/sims/<timeline-name>/
├── main.html # Main visualization file
├── style.css # External stylesheet
├── timeline.json # Event data in TimelineJS format
└── index.md # Documentation (if part of MkDocs)
Naming convention: Use kebab-case (lowercase with hyphens) for directory names that are descriptive and URL-friendly (e.g., project-history-timeline, course-schedule, family-heritage-timeline).
Generate a JSON file following this structure:
{
"title": "Timeline Title",
"events": [
{
"start_date": {
"year": "2024",
"month": "1",
"day": "15",
"display_date": "January 15, 2024"
},
"text": {
"headline": "Event Title",
"text": "Detailed description of the event."
},
"group": "Category Name",
"notes": "Additional context that appears in the tooltip."
}
]
}
Key data structure notes:
year is required in start_datemonth and day are optional (default to 1 if omitted)display_date is optional (for custom date formatting)group is the category used for filteringnotes provides tooltip/hover text with additional contextData preparation guidelines:
Create an external CSS file for styling. Use the template at resources/template-style.css as the base.
Key CSS features:
aliceblue backgroundTemplate placeholders in style.css:
{{FILTER_BUTTON_STYLES}}: CSS rules for category-specific filter button colorsCritical tooltip styling (ensures text wraps properly):
.vis-tooltip {
background: #2c3e50 !important;
color: white !important;
padding: 10px 15px !important;
border-radius: 8px !important;
font-size: 13px !important;
max-width: 300px !important;
line-height: 1.4 !important;
word-wrap: break-word !important;
overflow-wrap: break-word !important;
white-space: normal !important;
box-sizing: border-box !important;
}
.vis-tooltip div {
max-width: 280px !important;
word-wrap: break-word !important;
overflow-wrap: break-word !important;
white-space: normal !important;
}
Generate the main HTML file using the template at resources/template-main.html.
Key structure:
Template placeholders in main.html:
{{TIMELINE_TITLE}}: The main title of the timeline{{TIMELINE_SUBTITLE}}: Descriptive subtitle with date range{{FILTER_BUTTONS}}: HTML for category filter buttons{{LEGEND_ITEMS}}: HTML for legend color/label pairs{{CATEGORY_COLORS}}: JavaScript object mapping categories to colors{{ZOOM_MIN_YEARS}}: Minimum zoom level in years (e.g., 10){{ZOOM_MAX_YEARS}}: Maximum zoom level in years (e.g., 1000){{MIN_YEAR}}: Earliest year the timeline can pan to{{MAX_YEAR}}: Latest year the timeline can pan toKey vis-timeline configuration:
// Timeline options - important settings
// Note: See "Event Text Clipped at Edges" in Troubleshooting for edge clipping fixes
const options = {
width: '100%',
height: '400px',
margin: {
item: { horizontal: 50, vertical: 10 }, // Explicit horizontal margin for edge padding
axis: 40
},
orientation: 'top',
zoomMin: 1000 * 60 * 60 * 24 * 365 * 5, // 5 years minimum zoom
zoomMax: 1000 * 60 * 60 * 24 * 365 * 50, // 50 years maximum zoom
min: new Date(1500, 0, 1), // Earliest panning limit
max: new Date(2030, 0, 1), // Latest panning limit
tooltip: {
followMouse: true
},
stack: true,
selectable: true,
showCurrentTime: false,
moveable: true, // Enable click-and-drag panning
zoomable: false, // Disable scroll-wheel zoom (use buttons instead to avoid page scroll interference)
align: 'center' // Center items on their date point to reduce edge overflow
};
Navigation controls: Since scroll-wheel zoom is disabled to prevent interference with page scrolling, the template includes explicit zoom/pan buttons:
Important implementation features:
Category filtering: Filter button implementation
function filterCategory(category) {
if (category === 'all') {
timelineData.clear();
timelineData.add(allItems);
} else {
const filtered = allItems.filter(item => item.category === category);
timelineData.clear();
timelineData.add(filtered);
}
timeline.fit();
}
Event detail display: Show full event information on click
timeline.on('select', function(properties) {
if (properties.items.length > 0) {
showEventDetails(properties.items[0]);
}
});
Color-coded events: Apply category colors to timeline items
Responsive tooltips: Show context notes on hover
Legend display: Visual guide for category colors
Design considerations:
If the timeline is part of a MkDocs site, create comprehensive documentation:
# [Timeline Title]
[Brief description of what this timeline visualizes]
[Run the [Timeline Name]](./main.html)
[View the Raw Timeline Data](timeline.json)
## Overview
[Detailed explanation of the timeline's purpose, content, and coverage]
## Features
### Interactive Elements
- **Zoom and Pan**: Click and drag to pan, scroll to zoom in/out
- **Event Details**: Click any event to see full details below the timeline
- **Hover Tooltips**: Hover over events to see historical context notes
- **Category Filtering**: Use filter buttons to view specific event categories
### Visual Design
- **Color-coded categories**: Each event category has a distinct color
- **Responsive layout**: Works on desktop, tablet, and mobile devices
- **Legend**: Visual guide showing category colors and meanings
## Data Structure
The timeline data is stored in `timeline.json` following this format:
[Include JSON structure example]
## Customization Guide
### Adding New Events
1. Open `timeline.json`
2. Add a new event object to the `events` array
3. Reload the page to see your changes
### Changing Colors
To modify category colors, edit the `categoryColors` object in `main.html`:
[Code example]
### Adjusting Time Range
To change the zoom limits, modify the `zoomMin` and `zoomMax` options:
[Code example]
## Technical Details
- **Timeline Library**: vis-timeline 7.7.3
- **Data Format**: TimelineJS-compatible JSON
- **Browser Compatibility**: Modern browsers (Chrome, Firefox, Safari, Edge)
- **Dependencies**: vis-timeline.js (loaded from CDN)
## Use Cases
This timeline pattern can be adapted for:
- Historical education
- Project planning and tracking
- Course schedules and curricula
- Organizational history
- Personal timelines and biographies
Documentation best practices:
If using MkDocs, add the timeline to the navigation in mkdocs.yml:
nav:
- MicroSims:
- Introduction: sims/index.md
- [Timeline Name]: sims/[timeline-name]/index.md
- [Other sims...]: ...
Place the entry in a logical position based on:
Before considering the timeline complete:
Data validation:
Visual testing:
main.html directly in browsermkdocs serve if applicableInteractive testing:
Content review:
Browser compatibility:
Use the shell script bk-capture-screenshot
To use this you must pass a path to the microsim directory as the parameter:
Example bk-capture-screenshot docs/sims/[timeline-name]
This will create a png file in that directory with the file name of the directory:
docs/sims/[timeline-name]/[timeline-name].png
This is what will be references in the YML metadata in the index.md file
In the main microsim index.md file we will insert metadata required for social media preview images.
docs/sims/[timeline-name]/index.md
---
title: [Timeline Name]
description: [Timeline Description]
image: /sims/[timeline-name]/[timeline-name].png
og:image: /sims/[timeline-name]/[timeline-name].png
---
# [Timeline Name]:
Omit the category filtering UI and use a single color:
const categoryColors = {
'Default': '#2d5016'
};
Change orientation for a vertical layout:
options: {
orientation: 'left' // or 'right'
}
For events with duration, add an end_date:
{
"start_date": {"year": "2020", "month": "1"},
"end_date": {"year": "2021", "month": "12"},
"text": {"headline": "Multi-year Project"}
}
Add images or videos to events (requires additional configuration).
Solution: Check browser console for errors, verify timeline.json loads correctly, ensure CDN resources are accessible.
Solution: Increase margin.item value in options or enable stack: true for automatic vertical stacking.
Solution: Adjust zoomMin and zoomMax values based on your date range.
Solution: Verify category names match exactly between JSON data and filter buttons, check JavaScript console for errors.
Solution: Ensure month values are 1-12, not 0-11. The conversion to JavaScript Date handles this in the code.
Problem: vis-timeline clips event boxes when they extend beyond the visible date range. Events near the left or right edges appear cut off, especially when using timeline.fit().
Root Cause: vis-timeline's default overflow: hidden behavior clips content at container boundaries.
Solution: Apply a three-part fix combining CSS and JavaScript:
Part 1 - CSS Container Padding and Overflow (in style.css):
/* Timeline Container - add padding for edge events */
#timeline {
padding-left: 80px;
padding-right: 80px;
overflow: hidden;
}
/* Override vis-timeline's default clipping behavior */
.vis-timeline {
overflow: visible !important;
}
.vis-panel.vis-center {
overflow: visible !important;
}
.vis-item .vis-item-overflow {
overflow: visible !important;
}
Part 2 - JavaScript Options (in main.html):
const options = {
// ... other options ...
margin: {
item: { horizontal: 50, vertical: 10 }, // Explicit horizontal margin
axis: 40
},
align: 'center', // Center items on their date point
zoomable: false // Disable scroll-wheel zoom (use buttons instead)
};
Part 3 - Window Padding Instead of fit() (in main.html):
// DON'T use: timeline.fit();
// INSTEAD, calculate padded window manually:
const dates = allItems.map(item => item.start.getTime());
const minDate = Math.min(...dates);
const maxDate = Math.max(...dates);
// Add 2 years padding on each side
const twoYears = 2 * 365 * 24 * 60 * 60 * 1000;
timeline.setWindow(
new Date(minDate - twoYears),
new Date(maxDate + twoYears),
{ animation: false }
);
Note: The same padding logic must be applied in the filterCategory() and fitAll() functions to maintain consistency when filtering or resetting the view.
This skill uses the following assets and references:
https://unpkg.com/vis-timeline/standalone/umd/vis-timeline-graph2d.min.jshttps://unpkg.com/vis-timeline/standalone/umd/vis-timeline-graph2d.min.cssSee the timeline example at /docs/sims/timeline/ for a complete reference implementation showcasing McCreary family heritage timeline.
This skill is provided under the same license as the claude-skills repository. The vis-timeline library is licensed under Apache-2.0/MIT dual license.