Loading source
Pulling the file list, source metadata, and syntax-aware rendering for this listing.
Source from repo
AI-powered slide deck design skill for creating professional presentations with consistent visual styling.
Files
Skill
Size
Entrypoint
Format
Open file
Syntax-highlighted preview of this file as included in the skill package.
references/html-template.md
1# HTML Slide Template23Complete HTML structure with navigation, tokens, and Chart.js integration.45## Base Structure67```html8<!DOCTYPE html>9<html lang="en">10<head>11<meta charset="UTF-8">12<meta name="viewport" content="width=device-width, initial-scale=1.0">13<title>Presentation Title</title>14<script src="https://cdn.jsdelivr.net/npm/[email protected]/dist/chart.umd.min.js"></script>15<style>16/* Paste embed-tokens.cjs output here */17:root {18--color-primary: #FF6B6B;19--color-background: #0D0D0D;20/* ... more tokens */21}2223/* Base slide styles */24* { margin: 0; padding: 0; box-sizing: border-box; }25body {26background: var(--color-background);27color: #fff;28font-family: var(--typography-font-body, 'Inter', sans-serif);29overflow: hidden;30}3132/* 16:9 Aspect Ratio Container (desktop) */33.slide-deck {34position: relative;35width: 100vw;36height: 100vh;37overflow: hidden;38}3940@media (min-width: 769px) {41.slide-deck {42/* Lock to 16:9 — letterbox if viewport ratio differs */43max-width: calc(100vh * 16 / 9);44max-height: calc(100vw * 9 / 16);45margin: auto;46position: absolute;47inset: 0;48}49}5051.slide {52position: absolute;53width: 100%; height: 100%;54display: flex;55flex-direction: column;56justify-content: center;57align-items: center;58text-align: center;59padding: 60px;60opacity: 0;61visibility: hidden;62transition: opacity 0.4s;63background: var(--color-background);64overflow: hidden; /* Prevent content overflow */65}6667.slide.active { opacity: 1; visibility: visible; }6869/* Slide inner wrapper — constrains content within safe area */70.slide-content {71width: 100%;72max-width: 100%;73max-height: 100%;74overflow: hidden;75display: flex;76flex-direction: column;77justify-content: center;78align-items: center;79gap: 16px;80}8182/* Typography */83h1, h2 { font-family: var(--typography-font-heading, 'Space Grotesk', sans-serif); }84.slide-title {85font-size: clamp(32px, 6vw, 80px);86background: var(--primitive-gradient-primary, linear-gradient(135deg, #FF6B6B, #FF8E53));87-webkit-background-clip: text;88-webkit-text-fill-color: transparent;89line-height: 1.1;90}9192/* ===== RESPONSIVE BREAKPOINTS ===== */9394/* Tablet (portrait) */95@media (max-width: 768px) {96.slide { padding: 32px 24px; }97.slide-title { font-size: clamp(28px, 5vw, 48px); }98h2 { font-size: clamp(20px, 4vw, 32px); }99p, li { font-size: clamp(14px, 2.5vw, 18px); }100}101102/* Mobile */103@media (max-width: 480px) {104.slide { padding: 24px 16px; }105.slide-title { font-size: clamp(22px, 6vw, 36px); }106h2 { font-size: clamp(18px, 4.5vw, 28px); }107p, li { font-size: clamp(12px, 3vw, 16px); }108.nav-controls { bottom: 16px; gap: 12px; }109.nav-btn { width: 32px; height: 32px; font-size: 14px; }110}111112/* Navigation */113.progress-bar {114position: fixed;115top: 0; left: 0;116height: 3px;117background: var(--color-primary);118transition: width 0.3s;119z-index: 1000;120}121.nav-controls {122position: fixed;123bottom: 30px;124left: 50%;125transform: translateX(-50%);126display: flex;127align-items: center;128gap: 20px;129z-index: 1000;130}131.nav-btn {132background: rgba(255,255,255,0.1);133border: none;134color: #fff;135width: 40px; height: 40px;136border-radius: 50%;137cursor: pointer;138font-size: 18px;139}140.nav-btn:hover { background: rgba(255,255,255,0.2); }141.slide-counter { color: rgba(255,255,255,0.6); font-size: 14px; }142</style>143</head>144<body>145<!-- Progress Bar -->146<div class="progress-bar" id="progressBar"></div>147148<!-- Slide Deck Container (16:9 on desktop) -->149<div class="slide-deck">150151<!-- Slides -->152<div class="slide active">153<div class="slide-content">154<h1 class="slide-title">Title Slide</h1>155<p>Subtitle or tagline</p>156</div>157</div>158159<!-- More slides... (always wrap content in .slide-content) -->160161</div><!-- /.slide-deck -->162163<!-- Navigation -->164<div class="nav-controls">165<button class="nav-btn" onclick="prevSlide()">←</button>166<span class="slide-counter"><span id="current">1</span> / <span id="total">9</span></span>167<button class="nav-btn" onclick="nextSlide()">→</button>168</div>169170<script>171let current = 1;172const total = document.querySelectorAll('.slide').length;173document.getElementById('total').textContent = total;174175function showSlide(n) {176if (n < 1) n = 1;177if (n > total) n = total;178current = n;179document.querySelectorAll('.slide').forEach((s, i) => {180s.classList.toggle('active', i === n - 1);181});182document.getElementById('current').textContent = n;183document.getElementById('progressBar').style.width = (n / total * 100) + '%';184}185186function nextSlide() { showSlide(current + 1); }187function prevSlide() { showSlide(current - 1); }188189document.addEventListener('keydown', (e) => {190if (e.key === 'ArrowRight' || e.key === ' ') { e.preventDefault(); nextSlide(); }191if (e.key === 'ArrowLeft') { e.preventDefault(); prevSlide(); }192});193194document.addEventListener('click', (e) => {195if (!e.target.closest('.nav-controls')) nextSlide();196});197198showSlide(1);199</script>200</body>201</html>202```203204## Chart.js Integration205206```html207<div class="chart-container" style="width: min(80%, 600px); height: clamp(200px, 40vh, 350px);">208<canvas id="revenueChart"></canvas>209</div>210211<script>212new Chart(document.getElementById('revenueChart'), {213type: 'line', // or 'bar', 'doughnut', 'radar'214data: {215labels: ['Sep', 'Oct', 'Nov', 'Dec'],216datasets: [{217label: 'MRR ($K)',218data: [5, 12, 28, 45],219borderColor: '#FF6B6B',220backgroundColor: 'rgba(255, 107, 107, 0.1)',221borderWidth: 3,222fill: true,223tension: 0.4224}]225},226options: {227responsive: true,228maintainAspectRatio: false,229plugins: { legend: { display: false } },230scales: {231x: { grid: { color: 'rgba(255,255,255,0.05)' }, ticks: { color: '#B8B8D0' } },232y: { grid: { color: 'rgba(255,255,255,0.05)' }, ticks: { color: '#B8B8D0' } }233}234}235});236</script>237```238239## Animation Classes240241```css242/* Fade Up */243.animate-fade-up {244animation: fadeUp 0.6s ease-out forwards;245opacity: 0;246}247@keyframes fadeUp {248from { opacity: 0; transform: translateY(30px); }249to { opacity: 1; transform: translateY(0); }250}251252/* Count Animation */253.animate-count { animation: countUp 1s ease-out forwards; }254255/* Scale */256.animate-scale {257animation: scaleIn 0.5s ease-out forwards;258}259@keyframes scaleIn {260from { opacity: 0; transform: scale(0.9); }261to { opacity: 1; transform: scale(1); }262}263264/* Stagger Children */265.animate-stagger > * {266opacity: 0;267animation: fadeUp 0.5s ease-out forwards;268}269.animate-stagger > *:nth-child(1) { animation-delay: 0.1s; }270.animate-stagger > *:nth-child(2) { animation-delay: 0.2s; }271.animate-stagger > *:nth-child(3) { animation-delay: 0.3s; }272.animate-stagger > *:nth-child(4) { animation-delay: 0.4s; }273```274275## Background Images276277```html278<div class="slide slide-with-bg" style="background-image: url('https://images.pexels.com/...')">279<div class="overlay" style="background: linear-gradient(135deg, rgba(13,13,13,0.9), rgba(13,13,13,0.7))"></div>280<div class="content" style="position: relative; z-index: 1;">281<!-- Slide content -->282</div>283</div>284```285286## CSS Variables Reference287288| Variable | Usage |289|----------|-------|290| `--color-primary` | Brand primary (CTA, highlights) |291| `--color-background` | Slide background |292| `--color-secondary` | Secondary elements |293| `--primitive-gradient-primary` | Title gradients |294| `--typography-font-heading` | Headlines |295| `--typography-font-body` | Body text |296