From sas-presentation
Create polished marcov / SAS-AM branded Reveal.js presentations. Use when the user asks to create slides, a presentation, a deck, or a slideshow. Supports 17 presentation types — from standard narrative decks to dashboards, proposals, and meeting minutes. Implements SAS brand guidelines with light/dark mode and professional layouts. Generates standalone HTML + CSS with no build step required. Complies with marcov-revealjs-standards v1.0.0.
How this skill is triggered — by the user, by Claude, or both
Slash command
/sas-presentation:sas-presentationThe summary Claude sees in its skill listing — used to decide when to auto-load this skill
Create professional HTML presentations using Reveal.js with SAS-AM brand guidelines. The output is a standalone HTML file that can be opened directly in any browser, shared via USB, or hosted on any static file server.
Create professional HTML presentations using Reveal.js with SAS-AM brand guidelines. The output is a standalone HTML file that can be opened directly in any browser, shared via USB, or hosted on any static file server.
Every presentation MUST include the SAS-AM tagline on at least one slide (typically the title slide, closing slide, or an "About Us" section):
"At SAS-AM we help organisations understand their strengths and weaknesses, model and predict the future, and make the right decisions through audit and benchmarking, advanced analytics and deep advisory services."
This skill creates presentations following the marcov / SAS-AM communication style, which features:
| Type | Slides | Layout | Best For |
|---|---|---|---|
| Presentation | 10–20 | Mixed (split / full-bleed) | Conference talks, workshops, strategy sessions |
| Report | 15–30 | Text-heavy with charts | Maturity assessments, audit findings, deep-dives |
| One Pager | 1–3 | Dense single-slide | Service summaries, leave-behinds, handouts |
| Dashboard | 3–8 | Grid / Card-based | Monthly reporting, operational reviews |
| Chart | 1–3 | Centred visual | LinkedIn posts, data storytelling |
| Resume / CV | 3–6 | Split (sidebar + main) | Tender submissions, team profiles |
| Proposal | 10–15 | Mixed (narrative + structured) | Client proposals, tender responses |
| Capability Brochure | 8–12 | Visual-heavy / Magazine | Business development, conference handouts |
| Case Study | 6–10 | Storytelling arc | BD meetings, tender evidence |
| Pitch Deck | 8–12 | Full-bleed / High-impact | Investor pitches, partnership discussions |
| Executive Briefing | 4–7 | Clean / Sparse | Board updates, sponsor briefings |
| Workshop / Training | 10–25 | Mixed (instructional) | Client workshops, training, tutorials |
| Project Status Update | 5–8 | Structured / Tabular | Weekly/monthly project reporting |
| Technical Architecture | 6–12 | Diagram-centric | Solution design reviews, system docs |
| Roadmap / Timeline | 5–10 | Horizontal timeline | Product roadmaps, transformation plans |
| Comparison Matrix | 4–8 | Grid / Table-centric | Technology selection, vendor evaluation |
| Meeting Minutes | 3–6 | Structured / List-based | Post-meeting distribution, governance |
For full type definitions including sections, components, and Reveal.js overrides, see references/presentation-types.md.
Before creating any presentation, you MUST conduct a discovery interview. The goal is to identify the right presentation type and gather content requirements.
Ask these questions to determine the best type:
What is the primary purpose of this document?
Who is the primary audience?
How many slides do you expect? (or how much content do you have?)
What is the dominant content format?
Once the type is determined, confirm with the user: "Based on what you've described, I'd recommend a [Type] format — it uses [key characteristic]. Does that sound right?"
Topic & Key Message
Delivery Context
Branding
Visual Assets
Content Outline
If the presentation includes data, metrics, or KPIs, walk the user through chart selection and data sourcing. This phase should happen after content details are gathered but before building begins.
For each slide or section that involves data, ask:
What are you trying to show with this data?
Use the answer to suggest chart types from this decision tree:
| You want to show… | Recommended charts |
|---|---|
| Ranking — which is biggest/smallest | Horizontal Bar, Treemap |
| Comparison — side by side across categories | Grouped Bar, Radar/Spider |
| Composition — parts of a whole | Stacked Bar, Donut, Treemap |
| Trend over time — how something changes | Line, Area, Sparkline |
| Correlation — relationship between two things | Scatter, Bubble |
| Distribution — how data is spread | Distribution, Violin, Histogram (Stacked Bar) |
| Flow / process — how things move between stages | Sankey, Funnel |
| Relationships / dependencies — what connects to what | Network, Chord Diagram |
| Status / health — where things stand right now | RAG Grid, Gauge, Progress Bars, Circular Bar |
| Strategic positioning — classify into quadrants | Quadrant Chart |
| Cumulative change — what added up or eroded a total | Waterfall |
| Intensity across two dimensions — where are the hotspots | Heatmap / Matrix |
| Single KPI headline — one big number with context | Gauge, Sparkline (inline), Circular Bar |
Present the recommendation: "To show [what they described], I'd suggest a [Chart Type] — it works well because [reason]. Here's what it looks like…" (describe or reference the pattern in chart-components.html).
If they're unsure, offer 2-3 options with a brief explanation of the visual difference.
Where is the data coming from?
Classify into one of three source types:
| Source Type | Description | How to Handle |
|---|---|---|
| Structured file | CSV, Excel, JSON, database export — real numbers exist in a file | Ask the user to provide or point to the file. Read it, extract relevant columns/rows, and map values to the SVG chart coordinates. Always cite the source on the slide (e.g. "Source: FY24 Asset Register extract"). |
| Anecdotal / estimated | The user knows rough numbers or proportions from experience but has no file | Ask them to provide the values conversationally (e.g. "About 60% roads, 25% bridges, 15% other"). Use their estimates directly. Label the chart appropriately (e.g. "Indicative" or "Estimated based on [context]"). |
| Mixed | Some data is from files, some is estimated or contextual | Handle each data series independently — structured data gets precise values, anecdotal gets estimates. Clearly distinguish sourced vs estimated in footnotes or labels. |
For structured data — ask:
For anecdotal data — ask:
For both — confirm the visual:
Once the data and chart type are confirmed:
Every chart MUST include a source attribution, either:
<text class="chart-axis-label" x="..." y="[bottom]" text-anchor="start">Source: [attribution]</text>| Data Source | Attribution Format |
|---|---|
| File / database | "Source: [File name or system], [date/period]" |
| Anecdotal (from user) | "Source: [User's role/name] estimates, [month year]" |
| Anecdotal (general) | "Indicative only — based on operational experience" |
| Published / external | "Source: [Publication/org], [year]" |
| Mixed | Cite each series separately in a footnote |
The default Presentation type uses this proven 7-section structure:
| Section | Purpose | Example |
|---|---|---|
| OPENING | Hook the audience, reframe the problem | "Your Million-Dollar EAM System Might Just Be A Very Expensive Filing Cabinet" |
| THE CONTEXT | Establish the current situation | "Siloed failures - one truck breaks down but the fleet learns nothing" |
| THE PROBLEM | Identify specific pain points | "Cloud analytics can't make split-second decisions" |
| THE SOLUTION | Present your answer | "Edge Federated Machine Learning" |
| THE IMPLEMENTATION | Show how it works practically | "Start small. One asset class. One location." |
| THE FUTURE | Vision and possibilities | "Maintenance schedules that write themselves" |
| THE CONNECTION | Call to action | "Ready to make your assets intelligent?" |
Other types have their own section structures — see references/presentation-types.md for the full mapping.
A SAS presentation consists of:
presentation-folder/
├── presentation.html # Main presentation file
├── styles.css # Custom theme styles
└── assets/ # Images (PNG, JPG, SVG)
└── [slide-images]-blue.png / -green.png
Note: SAS logos are loaded from the Webflow CDN — no local logo files needed.
SAS-AM logos are hosted on the Webflow CDN. No local logo files are required.
| Mode | URL | Description |
|---|---|---|
| Light mode | https://cdn.prod.website-files.com/653497186047abfdf821b2fc/69a77a2f0e9f223c5f196bd3_sas-logo.jpg | Full SAS wordmark (dual arrows + "SAS" text, dark navy on white) |
| Dark mode | https://cdn.prod.website-files.com/653497186047abfdf821b2fc/69a777cb2f01269a5c7f073e_sas-logo-lightmode.png | Green arrow brandmark on transparent background |
The CSS automatically switches logos based on the current theme:
logo-light (full wordmark)logo-dark (green brandmark)<img src="https://cdn.prod.website-files.com/653497186047abfdf821b2fc/69a77a2f0e9f223c5f196bd3_sas-logo.jpg" alt="SAS Logo" class="title-logo logo-light">
<img src="https://cdn.prod.website-files.com/653497186047abfdf821b2fc/69a777cb2f01269a5c7f073e_sas-logo-lightmode.png" alt="SAS Logo" class="title-logo logo-dark">
No local asset copying needed — logos load directly from CDN.
Every presentation MUST include these required elements:
<!DOCTYPE html> declarationlang="en-AU" on <html>data-theme="light" default attributecharset="UTF-8"| marcov suffix<!DOCTYPE html>
<html lang="en-AU" data-theme="light">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="description" content="Description of the presentation">
<meta name="author" content="marcov / SAS Asset Management">
<title>Presentation Title | marcov</title>
<!-- Reveal.js -->
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/[email protected]/dist/reveal.css">
<!-- Font Awesome -->
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.5.1/css/all.min.css">
<!-- Google Fonts -->
<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link href="https://fonts.googleapis.com/css2?family=Source+Sans+Pro:wght@300;400;600;700&family=Source+Code+Pro:wght@400;600&display=swap" rel="stylesheet">
<!-- marcov Styles -->
<link rel="stylesheet" href="styles.css">
</head>
See references/scaffold-template.html for the complete scaffold including JavaScript.
<section> element<section> requires a unique id<section> requires a data-section attribute<section>. Vertical sub-slides: nested <section> within parent<h1> — title slide only (one per deck)<h2> — slide titles. <h3> — card/section headings. <h4> — sub-headings. Never skip heading levels<img> tags must have alt text. Decorative images: alt="" role="presentation"<body>All types inherit this base configuration:
Reveal.initialize({
hash: true,
hashOneBasedIndex: false,
respondToHashChanges: true,
history: false,
slideNumber: 'c/t',
showSlideNumber: 'speaker',
center: false,
width: 1920,
height: 1080,
margin: 0,
minScale: 0.2,
maxScale: 2.0,
transition: 'slide',
transitionSpeed: 'default',
backgroundTransition: 'fade',
keyboard: true,
touch: true,
loop: false,
embedded: false,
help: true,
mouseWheel: false,
hideInactiveCursor: true,
hideCursorTime: 3000,
fragments: true,
fragmentInURL: true,
pdfMaxPagesPerSlide: 1,
pdfSeparateFragments: false,
});
Per-Type Overrides (apply only when the type specifies them):
| Type | Override |
|---|---|
| Dashboard | transition: 'fade' |
| Workshop / Training | help: true, showSlideNumber: 'all' |
| One Pager | loop: true (kiosk mode) |
| Project Status Update | transition: 'fade' |
Three states: light (default), dark, system (follows OS preference). Storage key: marcov-presentation-theme.
The data-theme attribute is applied to <html>, <body>, and .reveal-viewport. All colours use CSS custom properties.
ready eventtabindex="0", role="button", Enter/Space activationfixed outside Reveal containerThe opening slide with logo, main title, subtitle, and author.
<section id="title" class="title-slide" data-section="opening">
<div class="title-content">
<img src="https://cdn.prod.website-files.com/653497186047abfdf821b2fc/69a77a2f0e9f223c5f196bd3_sas-logo.jpg" alt="SAS Logo" class="title-logo logo-light">
<img src="https://cdn.prod.website-files.com/653497186047abfdf821b2fc/69a777cb2f01269a5c7f073e_sas-logo-lightmode.png" alt="SAS Logo" class="title-logo logo-dark">
<h1>From Worthless Data to Intelligent Assets</h1>
<h2>Edge Federated ML in Real Work Asset Management</h2>
<p class="author">Shane Scriven – Founder + Managing Director SAS-AM</p>
</div>
</section>
Typography:
<h1>: 64px, weight 300, text-primary colour<h2>: 36px, weight 400, accent colour (SAS Green).author: 24px, text-muted colourTwo-column layout with content on left, image/visual on right.
<section id="unique-id" data-section="opening">
<div class="slide-layout with-image">
<!-- Optional: Logo in top-right -->
<img src="https://cdn.prod.website-files.com/653497186047abfdf821b2fc/69a77a2f0e9f223c5f196bd3_sas-logo.jpg" alt="SAS Logo" class="slide-logo logo-light">
<img src="https://cdn.prod.website-files.com/653497186047abfdf821b2fc/69a777cb2f01269a5c7f073e_sas-logo-lightmode.png" alt="SAS Logo" class="slide-logo logo-dark">
<div class="slide-header">
<span class="section-tag">OPENING</span>
</div>
<div class="slide-body split">
<div class="slide-content">
<h2 class="slide-title">REFRAMING ASSET DATA</h2>
<p class="slide-subtitle">Your Million-Dollar EAM System Might Just Be A Very Expensive Filing Cabinet</p>
</div>
<div class="slide-image">
<img src="assets/visual-blue.png" alt="Description" class="logo-light">
<img src="assets/visual-green.png" alt="Description" class="logo-dark">
</div>
</div>
</div>
</section>
Typography:
.section-tag: 14px, weight 600, uppercase, letter-spacing 2px, accent colour.slide-title: 72px, weight 700, uppercase, letter-spacing -1px, max-width 50%.slide-subtitle: 36px, weight 300, text-secondary colourFor conceptual diagrams, use inline SVG with CSS variables for theme support.
<section id="concept" data-section="solution">
<div class="slide-layout">
<div class="slide-header">
<span class="section-tag">THE SOLUTION</span>
</div>
<div class="slide-body split">
<div class="slide-content">
<h2 class="slide-title">EDGE FEDERATED ML</h2>
<p class="slide-subtitle">Place The Intelligence On The Asset</p>
</div>
<div class="slide-image">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 600 400" width="600" height="400">
<!-- Use CSS variables for theme-aware colours -->
<rect fill="var(--bg-tertiary)" stroke="var(--card-border)" .../>
<circle fill="var(--accent)" .../>
<text fill="var(--text-primary)" font-family="Arial, sans-serif">...</text>
<!-- Animated elements -->
<circle r="5" fill="var(--accent)">
<animate attributeName="cy" values="0;100;0" dur="2s" repeatCount="indefinite"/>
</circle>
</svg>
</div>
</div>
</div>
</section>
Progressive reveal using Reveal.js fragments.
<section id="process" data-section="solution">
<div class="slide-layout">
<div class="slide-header">
<span class="section-tag">THE SOLUTION</span>
</div>
<div class="slide-body split">
<div class="slide-content">
<h2 class="slide-title">ON-ASSET TRAINING</h2>
<p class="slide-subtitle">Train a local ML model where the data is generated</p>
</div>
<div class="slide-image diagram-container">
<!-- Step 1: Visible by default, fades out when advancing -->
<div class="federated-diagram step-1 fragment fade-out" data-fragment-index="1">
<img src="assets/step-1-blue.png" class="logo-light">
<img src="assets/step-1-green.png" class="logo-dark">
</div>
<!-- Step 2: Fades in, then out -->
<div class="federated-diagram step-2 fragment fade-in-then-out" data-fragment-index="1">
<img src="assets/step-2-blue.png" class="logo-light">
<img src="assets/step-2-green.png" class="logo-dark">
</div>
<!-- Step 3: Final state, fades in and stays -->
<div class="federated-diagram step-3 fragment fade-in" data-fragment-index="2">
<img src="assets/step-3-blue.png" class="logo-light">
<img src="assets/step-3-green.png" class="logo-dark">
</div>
</div>
</div>
</div>
</section>
Call-to-action with QR code and branding.
<section id="closing" data-section="connection">
<div class="slide-layout closing">
<div class="slide-header">
<span class="section-tag">THE CONNECTION</span>
</div>
<div class="slide-body centered">
<h2 class="closing-headline">Ready To Make Your Assets Intelligent?</h2>
<div class="qr-wrapper">
<div class="qr-container">
<div class="qr-glow"></div>
<img src="assets/qr-code.png" alt="QR Code" class="qr-code">
</div>
<div class="qr-cta">
<span class="qr-action">SCAN TO CONNECT</span>
<p class="qr-label">Learn more about Edge AI in Asset Management</p>
</div>
</div>
<div class="closing-branding">
<img src="https://cdn.prod.website-files.com/653497186047abfdf821b2fc/69a77a2f0e9f223c5f196bd3_sas-logo.jpg" alt="SAS Logo" class="closing-logo logo-light">
<img src="https://cdn.prod.website-files.com/653497186047abfdf821b2fc/69a777cb2f01269a5c7f073e_sas-logo-lightmode.png" alt="SAS Logo" class="closing-logo logo-dark">
<p class="closing-search"><i class="fas fa-search"></i> EDGE AI ASSET MANAGEMENT</p>
</div>
</div>
</div>
</section>
:root,
:root[data-theme="light"] {
/* SAS Brand Colours */
--sas-green: #69BE28;
--sas-blue: #002244;
/* Backgrounds */
--bg-primary: #ffffff;
--bg-secondary: #f7f7f7;
--bg-tertiary: #ededed;
/* Text - ALL text is SAS Blue in light mode */
--text-primary: #002244;
--text-secondary: #334466;
--text-muted: #6b7280;
/* Accent */
--accent: #69BE28;
--accent-hover: #5AA822;
/* Cards and containers */
--card-bg: rgba(255, 255, 255, 0.95);
--card-border: rgba(0, 34, 68, 0.15);
/* Footer */
--footer-bg: #f7f7f7;
--footer-border: #ededed;
/* Shadows */
--shadow-sm: 0 2px 8px rgba(0, 34, 68, 0.08);
--shadow-md: 0 4px 16px rgba(0, 34, 68, 0.12);
--shadow-lg: 0 8px 24px rgba(0, 34, 68, 0.15);
/* Focus */
--focus-ring: 0 0 0 3px rgba(105, 190, 40, 0.5);
/* Code */
--code-bg: #f0f4f8;
--code-text: #1e3a5f;
}
:root[data-theme="dark"] {
/* SAS Brand (adjusted for dark) */
--sas-green: #7AD33B;
--sas-blue: #1a4d7a;
/* Backgrounds */
--bg-primary: #0a0f1a;
--bg-secondary: #141d2b;
--bg-tertiary: #1e2a3d;
/* Text */
--text-primary: #f4fbff;
--text-secondary: #d1e3ed;
--text-muted: #8ba3b5;
/* Accent */
--accent: #69BE28;
--accent-hover: #7AD33B;
/* Cards and containers */
--card-bg: rgba(20, 29, 43, 0.9);
--card-border: rgba(255, 255, 255, 0.08);
/* Footer */
--footer-bg: #141d2b;
--footer-border: #1e2a3d;
/* Shadows */
--shadow-sm: 0 2px 8px rgba(0, 10, 28, 0.3);
--shadow-md: 0 4px 16px rgba(0, 10, 28, 0.4);
--shadow-lg: 0 14px 30px rgba(0, 10, 28, 0.5);
/* Focus */
--focus-ring: 0 0 0 3px rgba(105, 190, 40, 0.4);
/* Code */
--code-bg: #1a2332;
--code-text: #d1e3ed;
}
| Element | Font Size | Weight | Colour | Other |
|---|---|---|---|---|
| Title Slide h1 | 64px | 300 | text-primary | line-height 1.2 |
| Title Slide h2 | 36px | 400 | accent | - |
| Author | 24px | 400 | text-muted | - |
| Section Tag | 14px | 600 | accent | uppercase, letter-spacing 2px |
| Slide Title | 72px | 700 | text-primary | uppercase, letter-spacing -1px, max-width 50% |
| Slide Subtitle | 36px | 300 | text-secondary | line-height 1.4 |
| Footer Nav | 11px | 600 | text-muted | uppercase, letter-spacing 1.5px |
Font Families:
For images that need different variants in light/dark mode:
assets/
├── visual-blue.png # Light mode (blue-tinted)
├── visual-green.png # Dark mode (green-tinted)
├── diagram-blue.png
├── diagram-green.png
└── ...
Use CSS classes to show/hide:
<img src="assets/visual-blue.png" class="logo-light">
<img src="assets/visual-green.png" class="logo-dark">
:root[data-theme="light"] .logo-light { display: block !important; }
:root[data-theme="light"] .logo-dark { display: none !important; }
:root[data-theme="dark"] .logo-light { display: none !important; }
:root[data-theme="dark"] .logo-dark { display: block !important; }
For images that work in both themes (photos, memes):
<img src="assets/photo.png" alt="Description">
Subtle falling binary code animation:
@keyframes binaryFall {
0% { transform: translateY(-100%); }
100% { transform: translateY(100vh); }
}
.binary-column {
position: absolute;
font-family: 'Courier New', monospace;
font-size: 14px;
animation: binaryFall linear infinite;
}
/* Light mode - very subtle */
:root[data-theme="light"] .binary-column {
color: rgba(0, 34, 68, 0.04);
}
/* Dark mode */
:root[data-theme="dark"] .binary-column {
color: rgba(255, 255, 255, 0.03);
}
@keyframes qrPulse {
0%, 100% { transform: translate(-50%, -50%) scale(1); opacity: 0.3; }
50% { transform: translate(-50%, -50%) scale(1.1); opacity: 0.5; }
}
.qr-glow {
animation: qrPulse 2s ease-in-out infinite;
background: radial-gradient(circle, var(--accent) 0%, transparent 70%);
}
Use <animate> elements for data flow visualisations:
<circle r="5" fill="var(--accent)">
<animate attributeName="cy" values="0;100;0" dur="2.5s" repeatCount="indefinite"/>
<animate attributeName="opacity" values="1;0;1" dur="2.5s" repeatCount="indefinite"/>
</circle>
These CSS components are available in base-styles.css for use across all presentation types:
| Component | CSS Class | Use For |
|---|---|---|
| Card | .card | Content container with border and shadow |
| Card Grid | .card-grid + .card-grid-2/3/4 | Responsive grid of cards |
| Table | .ref-table | Styled data table with accent headers |
| Checklist | .checklist + .check-icon | Lists with check/square icons |
| Badge | .badge + .badge-required/recommended/optional | Status indicator labels (RAG) |
| Code Block | .code-block | Monospace code display |
| Inline Code | .code-inline | Inline monospace text |
| Keyboard Key | .kbd | Keyboard shortcut badge |
| Split Layout | .split-layout | Two-column responsive layout |
| Scroll Container | .scroll-y | Scrollable content area for overflow |
| Section Tag | .ref-section-tag | Section label (uppercase, accent colour) |
| Title | .ref-title | Large slide heading (56px) |
| Subtitle | .ref-subtitle | Secondary heading (28px) |
| Body Text | .ref-body | Standard body copy (22px) |
| Small Text | .ref-small | Fine print / captions (16px) |
| Screen Reader | .sr-only | Visually hidden but accessible text |
A full library of inline SVG chart patterns is available in references/chart-components.html. All charts are theme-aware (light/dark), accessible (role="img" + aria-label), and interactive (hover highlights with sibling dimming via .chart-interactive).
| # | Chart Type | CSS Classes | Best For |
|---|---|---|---|
| 1 | Horizontal Bar | .chart-bar | Ranked categorical comparisons |
| 2 | Grouped Bar | .chart-bar + legend | Side-by-side multi-series comparison |
| 3 | Stacked Bar | .chart-bar | Composition of totals |
| 4 | Line Chart | .chart-line, .chart-point | Trends over time |
| 5 | Area Chart | .chart-area, .chart-line | Volume/magnitude trends |
| 6 | Sparkline | .chart-sparkline, .chart-sparkline-line | Inline KPI trend indicators |
| 7 | Donut | .chart-slice | Proportions of a whole (max 6 segments) |
| 8 | Waterfall | .chart-bar | Cumulative positive/negative changes |
| 9 | Treemap | .chart-treemap-cell | Hierarchical proportional data |
| 10 | Radar / Spider | .chart-radar-*, .chart-point | Multi-dimension comparison (5-8 axes) |
| 11 | Heatmap / Matrix | .chart-cell | Two-dimension intensity mapping |
| 12 | Gauge | .chart-gauge-bg, .chart-gauge-fill | Single KPI vs target |
| 13 | Scatter | .chart-point | Correlation between two variables |
| 14 | Bubble | .chart-bubble | Three-variable comparison (x, y, size) |
| 15 | RAG Status Grid | .chart-rag-grid, .rag-item | Red/Amber/Green health dashboards |
| 16 | Progress Bars | .chart-progress-* | Completion / utilisation rates |
| 17 | Quadrant | .chart-quadrant-*, .chart-point | Strategic classification (2x2) |
| 18 | Funnel | .chart-funnel-segment | Sequential stage drop-off |
| 19 | Sankey | .chart-sankey-node, .chart-sankey-link | Flow and transformation between stages |
| 20 | Distribution | .chart-distribution-area | Probability density / frequency curves |
| 21 | Violin Plot | .chart-violin-half, .chart-violin-box | Distribution shape + box plot combined |
| 22 | Circular Bar | .chart-circular-bar, .chart-circular-track | Radial KPI completion with centre value |
| 23 | Chord Diagram | .chart-chord-arc, .chart-chord-ribbon | Relationship flow between entities |
| 24 | Network Diagram | .chart-network-node, .chart-network-link | Entity relationship / dependency mapping |
Chart interactivity pattern:
class="chart-interactive" to the parent <svg> to enable sibling dimming on hover<g class="chart-svg-tooltip"> immediately after each data element for no-JS tooltip fallback--chart-1 through --chart-6 for the categorical colour palette (theme-aware)role="img" and aria-label on the SVG elementFor additional chart types or custom visualisation components, source them via the 21st CLI tool (see ~/.claude/CLAUDE.md § UI Component Sourcing). All fetched components must inherit the CSS variable theming system and meet WCAG 2.1 AA accessibility standards before integration.
Conduct the discovery interview to:
references/presentation-types.md) and confirm any additions or removalsbase-styles.css from references as styles.csspresentation.html using the scaffold template — adapt the sections and footer nav items to match the selected presentation typeassets/ directory for slide images (logos load from CDN automatically)Work through slides incrementally:
data-section attributes (matching references/presentation-types.md)references/chart-components.html where needed — copy the inline SVG pattern and adjust data values21st CLI outside Claude Code to search and fetch pre built React/SVG components:
21st search "animated progress bar"
21st fetch "data dashboard card"
Fetched components must be adapted to use SAS CSS variables (var(--chart-1) through var(--chart-6), var(--text-primary), etc.) and include role="img" with aria-label for accessibilityFor PDF export:
npx decktape reveal "presentation.html" output.pdf
For screenshots:
npx decktape reveal "presentation.html" output.pdf --screenshots --screenshots-directory screenshots/
@media screen and (max-width: 1400px) {
.slide-title { font-size: 56px; }
.slide-subtitle { font-size: 28px; }
.title-slide h1 { font-size: 48px; }
.title-slide h2 { font-size: 28px; }
.ref-title { font-size: 44px; }
.ref-subtitle { font-size: 24px; }
.card-grid-3 { grid-template-columns: repeat(2, 1fr); }
}
@media screen and (max-width: 1000px) {
.slide-body.split { flex-direction: column; }
.slide-image { max-height: 300px; }
.nav-items { gap: 15px; }
.nav-item { font-size: 10px; }
.split-layout { flex-direction: column; }
.card-grid-2, .card-grid-3, .card-grid-4 { grid-template-columns: 1fr; }
}
@media print {
.static-footer { display: none; }
.binary-background { display: none; }
.reveal .slides section { page-break-after: always; }
}
All presentations must meet these minimum standards:
--focus-ring variableoutline: none without a replacementrole="button" + tabindex="0"lang="en-AU" on <html>alt on all imagesalt="" role="presentation"aria-label on icon-only buttons.sr-only class for visually hidden labelsaria-hidden="true" on binary background columnsThis rule MUST appear in every stylesheet:
@media (prefers-reduced-motion: reduce) {
*, *::before, *::after {
animation-duration: 0.01ms !important;
animation-iteration-count: 1 !important;
transition-duration: 0.01ms !important;
scroll-behavior: auto !important;
}
}
<nav>, <main>, <footer> landmarks<ul>/<ol>)<th> headers)<button> for actions, <a> for navigationAll loaded from CDN — no npm install required:
When creating presentations for clients:
Example (Yarra Trams):
:root[data-theme="light"] {
--brand-primary: #007b4b; /* Yarra Green */
--accent: #69BE28; /* Keep SAS Green for buttons */
--text-primary: #1a1a1a;
}
<!DOCTYPE html> declaredlang="en-AU" set| marcov suffixdata-section attributesaria-hidden="true"role="img" and aria-label.chart-interactive for hover effects--chart-1 through --chart-6 (no hardcoded values)npx claudepluginhub sas-asset-management/sasamclaudecodeskills --plugin sas-presentationCreates reveal.js presentations with themes, multi-column layouts, code highlighting, animations, speaker notes, and custom styling. Generates HTML + CSS with no build step. Use for slides, decks, or slideshows.
Generates self-contained HTML slide decks from topics, outlines, data, or documents using 22 layout types, ALPA design system, responsive typography, and keyboard/touch navigation.
Generates a professionally designed HTML slide deck from a brief or content notes. Single-file output with 13 layout types and 8 style presets.