presentation-creator
Original:🇺🇸 English
Translated
Create data-driven presentation slides using React, Vite, and Recharts with Sentry branding. Use when asked to "create a presentation", "build slides", "make a deck", "create a data presentation", "build a Sentry presentation". Scaffolds a complete slide-based app with charts, animations, and single-file HTML output.
2installs
Sourcegetsentry/skills
Added on
NPX Install
npx skill4agent add getsentry/skills presentation-creatorTags
Translated version includes tags in frontmatterSKILL.md Content
View Translation Comparison →Sentry Presentation Builder
Create interactive, data-driven presentation slides using React + Vite + Recharts, styled with the Sentry design system and built as a single distributable HTML file.
Step 1: Gather Requirements
Ask the user:
- What is the presentation topic?
- How many slides (typically 5-8)?
- What data/charts are needed? (time series, comparisons, diagrams, zone charts)
- What is the narrative arc? (problem → solution, before → after, technical deep-dive)
Step 2: Scaffold the Project
Create the project structure:
<project-name>/
├── index.html
├── package.json
├── vite.config.js
└── src/
├── main.jsx
├── App.jsx
├── App.css
└── Charts.jsxindex.html
html
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<link rel="preconnect" href="https://fonts.googleapis.com" />
<link href="https://fonts.googleapis.com/css2?family=Rubik:wght@300;400;500;600;700&display=swap" rel="stylesheet" />
<link href="https://fonts.googleapis.com/css2?family=Material+Symbols+Outlined:opsz,wght,FILL,GRAD@20..48,100..700,0..1,-50..200&display=swap" rel="stylesheet" />
<title>TITLE</title>
</head>
<body>
<div id="root"></div>
<script type="module" src="/src/main.jsx"></script>
</body>
</html>package.json
json
{
"name": "PROJECT_NAME",
"private": true,
"type": "module",
"scripts": { "dev": "vite", "build": "vite build", "preview": "vite preview" },
"dependencies": { "react": "^18.3.1", "react-dom": "^18.3.1", "recharts": "^2.15.3" },
"devDependencies": { "@vitejs/plugin-react": "^4.3.4", "vite": "^6.0.0", "vite-plugin-singlefile": "^2.3.0" }
}vite.config.js
javascript
import { defineConfig } from 'vite'
import react from '@vitejs/plugin-react'
import { viteSingleFile } from 'vite-plugin-singlefile'
export default defineConfig({ plugins: [react(), viteSingleFile()] })main.jsx
jsx
import React from 'react'
import ReactDOM from 'react-dom/client'
import App from './App'
import './App.css'
ReactDOM.createRoot(document.getElementById('root')).render(<App />)Step 3: Build the Slide System
Read for the complete Sentry color palette, typography, CSS variables, layout utilities, and animation system.
${CLAUDE_SKILL_ROOT}/references/design-system.mdApp.jsx Structure
Define slides as an array of functions returning JSX:
jsx
const SLIDES = [
() => ( /* Slide 0: Title */ ),
() => ( /* Slide 1: Context */ ),
// ...
];Each slide function returns a with:
<div className="slide-content">- A label (e.g.,
.tag)<span className="tag tag-purple">Background</span> - An heading
<h2> - Optional subtitle paragraph
- Main content (charts, cards, diagrams, tables)
- Animation classes: ,
.anim,.d1,.d2for staggered fade-in.d3
Navigation
Implement keyboard navigation (ArrowRight/Space = next, ArrowLeft = prev) and a bottom nav overlay with prev/next buttons, dot indicators, and slide number. The nav has no border or background — it floats transparently. A small low-contrast Sentry glyph watermark sits fixed in the top-left corner of every slide.
jsx
function App() {
const [cur, setCur] = useState(0);
const go = useCallback((d) => setCur(c => Math.max(0, Math.min(SLIDES.length - 1, c + d))), []);
useEffect(() => {
const h = (e) => {
if (e.target.tagName === 'INPUT') return;
if (e.key === 'ArrowRight' || e.key === ' ') { e.preventDefault(); go(1); }
if (e.key === 'ArrowLeft') { e.preventDefault(); go(-1); }
};
window.addEventListener('keydown', h);
return () => window.removeEventListener('keydown', h);
}, [go]);
return (
<>
{cur > 0 && <div className="glyph-watermark"><SentryGlyph size={50} /><span className="watermark-title">TITLE</span></div>}
<div className="progress" style={{ width: `${((cur + 1) / SLIDES.length) * 100}%` }} />
{SLIDES.map((S, i) => (
<div key={i} className={`slide ${i === cur ? 'active' : ''}`}>
<div className={`slide-content${i === cur ? ' anim' : ''}`}>
<S />
</div>
</div>
))}
<Nav cur={cur} total={SLIDES.length} go={go} setCur={setCur} />
</>
);
}Step 4: Create Charts
Read for Recharts component patterns including axis configuration, color constants, chart types, and data generation techniques.
${CLAUDE_SKILL_ROOT}/references/chart-patterns.mdPut all chart components in . Key patterns:
Charts.jsx- Use with explicit height
ResponsiveContainer - Wrap in div with max-width 920px
.chart-wrap - Use for data generation
useMemo - Color rule: Use the Tableau-inspired categorical palette () for distinguishing data series and groups. Only use semantic colors (
CAT[],SEM_GREEN,SEM_RED) when the color itself carries meaning (good/bad, success/failure, warning).SEM_AMBER - Common charts: with stacked
ComposedChart/Area,Line, custom SVG diagramsBarChart
Step 5: Style with Sentry Design System
Apply the complete CSS from the design system reference. Key elements:
- Font: Rubik from Google Fonts
- Colors: CSS variables for UI chrome (,
--purple,--dark). Semantic CSS variables (--muted,--semantic-green,--semantic-red) only where color conveys meaning. Categorical palette (--semantic-amber) for all other data visualization.CAT[] - Slides: Absolute positioned, opacity transitions
- Animations: keyframe with staggered delays
fadeUp - Layout: flex rows,
.colsgrid,.cardscontainers.chart-wrap - Tags: ,
.tag-purple,.tag-red,.tag-greenfor slide labels.tag-amber - Logo: Read the official SVG from (full wordmark) or
${CLAUDE_SKILL_ROOT}/references/sentry-logo.svg(glyph only). Do NOT hardcode an approximation — always use the exact SVG paths from these files.sentry-glyph.svg
Step 6: Common Slide Patterns
Title Slide
Logo (from or ) + h1 + subtitle + author/date info.
${CLAUDE_SKILL_ROOT}/references/sentry-logo.svgsentry-glyph.svgProblem/Context Slide
Tag + heading + 2-column card grid with icon headers.
Data Comparison Slide
Tag + heading + side-by-side charts or before/after comparison table.
Technical Deep-Dive Slide
Tag + heading + full-width chart + annotation bullets below.
Summary/Decision Slide
Tag + heading + 3-column layout with category headers and bullet lists.
Step 7: Iterate and Refine
After initial scaffolding:
- Run to start the dev server
npm install && npm run dev - Iterate on chart data models and visual design
- Adjust animations, colors, and layout spacing
- Build final output: produces a single HTML file in
npm run builddist/
Output Expectations
A working React + Vite project that:
- Renders as a keyboard-navigable slide deck
- Uses Sentry branding (colors, fonts, icons)
- Contains data-driven Recharts visualizations
- Builds to a single distributable HTML file
- Has smooth fade-in animations on slide transitions