Generates a professionally designed case study PDF for B2B SaaS sales and marketing. Supports 7 page layouts, 9 style presets, 1-4 page output. Trigger when user says "create a case study", "write a customer story", "make a case study PDF", "design a success story", "turn this customer win into a PDF".
npx skills add https://github.com/Varnan-Tech/opendirectory --skill graphic-case-study
Generate a professionally designed B2B case study PDF from customer story details. Output is a single self-contained HTML file (opens in any browser) plus a print-ready PDF. Supports 7 page section layouts and 9 style presets.
Critical rules -- non-negotiable:
clamp(). Fixed px only for structural borders/lines.Need four things to start. If all four present in the message: skip to Step 2.
If any missing, ask exactly:
> "To create your case study, I need four things:
> 1. Customer name -- company name (or a descriptor to anonymize: "Fortune 500 Retailer")
> 2. Challenge -- what problem did they have before using your product? (2-5 sentences)
> 3. Solution -- what did your product do to solve it? (features, approach)
> 4. Results -- measurable outcomes: ideally 3 stats (%, time saved, revenue impact, etc.)"
Wait for all four before continuing.
Ask all questions in one message, grouped by category. User can skip any -- defaults apply.
> "A few questions before I start:
>
> Content
> 1. Customer context -- industry, company size, location? (optional, used for overview page)
> 2. Testimonial -- customer quote (40 words max) + speaker name + title? (or "I'll add later")
> 3. Page count -- 1-pager (summary card) / 2-pager (standard, default) / 4-pager (detailed)
> 4. Customer logo -- URL or "none"
>
> Design
> 5. Your company name -- vendor name for the CTA page (+ logo URL if available)
> 6. Style -- clean-slate / midnight-editorial / matt-gray / product-minimal / mint-pixel-corporate / warm-earth / brutalist / magazine-red / "show me options"
> 7. Orientation -- A4 portrait (default, 1200×1697) / landscape 4:3 (1200×900)
>
> Output
> 8. Anonymize? -- Keep company name / replace with industry descriptor
> 9. Slug -- filename slug (e.g. "acme-corp-2025"); I'll derive from customer name if skipped"
Defaults if skipped:
| Question | Default |
|---|---|
| Customer context | none |
| Testimonial | none |
| Page count | 2 |
| Customer logo | none |
| Your company name | derived from context |
| Style | clean-slate |
| Orientation | A4 portrait |
| Anonymize | keep name |
| Slug | kebab-case of customer name |
If style = "show me options":
Generate 3 single-page HTML previews (cover page only). Save to .claude-design/previews/style-a.html, style-b.html, style-c.html. Open each: open .claude-design/previews/style-a.html etc. Choose 3 style presets that match the case study context. Ask user to pick before Step 3.
Derive internally before Step 3. Never ask the user.
Hero metric identification:
Scan results for the single most impressive number (largest %, biggest $, greatest multiplier). This metric gets accent-color treatment and maximum visual weight on the results page.
Page count -> structure template:
| Count | Page sequence |
|---|---|
| 1-pager | 1 page: [cover-compact] -- all content condensed into one page |
| 2-pager | Page 1: [cover] + [challenge-solution] stacked · Page 2: [results] + [testimonial-cta] stacked |
| 4-pager | Page 1: [cover] · Page 2: [overview] + [challenge] · Page 3: [solution] + [results] · Page 4: [testimonial] + [closing-cta] |
Visual character derived from style choice:
Read references/page-library.md before planning.
Plan the full page sequence. Assign section types from the 7 in references/page-library.md to each page section. Multiple sections can stack within one page.
Output as numbered list with [section-type] labels per page. Example for 2-pager:
Proposed structure (2 pages, clean-slate style):
Page 1:
[cover] -- Acme Corp cut reporting time by 80%
[challenge-solution] -- manual process / DataPulse automation
Page 2:
[results] -- 80% time saved, 95% error reduction, $200K saved
[closing-cta] -- Get in touch: [email protected]
Does this structure work, or should I adjust anything?
Wait for confirmation before Step 4.
Write per-page-section copy. Plain text only -- no HTML yet.
Copy rules per section:
cover: company name + headline result (12 words max, MUST lead with the number: "Acme cut reporting time by 80%") + optional category label ("Customer Success Story")overview: 4 facts only -- Industry / Company size / Location / Use case -- each value 4 words maxchallenge: context paragraph (2-3 sentences) + 3 pain points (1 sentence each, no bullet filler)solution: 2-3 feature callouts -- feature name (3 words max) + 1-sentence outcome description eachresults: 3 metrics (number + short label + 1-line context). Optional: 2-sentence narrative. ZERO body copy at same weight as the numbers.testimonial: exact quote (40 words max) + speaker name + title + companyclosing-cta: headline (5 words max) + CTA action text (3 words) + email + URL (both required)Forbidden words (no exceptions): "powerful", "seamless", "game-changing", "leverage", "innovative", "revolutionary", "transform", "cutting-edge", "robust", "unlock", "scalable" (as filler adjective).
Copy philosophy: Numbers beat adjectives. Lead every section with the outcome, not the feature. Fragments are fine.
Read ALL before generating any HTML:
This skill's references:
references/design-system.mdreferences/page-library.mdreferences/style-presets.mdfrontend-slides cross-references (read this exact file):
/Users/ksd/Desktop/Varnan_skills/frontend-slides/viewport-base.css -- include FULL contents verbatim inside <style> blockGeneration rules:
<link> is the only external reference.viewport-base.css inside the <style> block -- do not paraphrase or shorten it. /* A4 portrait overrides */
html { scroll-snap-type: none; scroll-behavior: auto; }
.slide {
width: 100vw;
height: 100vh;
height: 100dvh;
overflow: hidden;
display: flex;
flex-direction: column;
position: relative;
scroll-snap-align: none;
}
<section class="slide"> -- required for export-pdf.sh detection./* === PAGE N: SECTION-TYPES === */clamp(2.5rem, 7vw, 5rem) minimum. Hero metric in accent color. Other metrics in secondary text color..reveal entrance animations (viewer experience; PDF export renders to final state automatically).clamp() values from graphic-slide-deck proportions -- landscape 1200×900 means 1vw=12px, similar to portrait.Typography discipline (all clamp-based, tuned for 1200px A4 portrait):
clamp(2rem, 5vw, 3.5rem)clamp(1.25rem, 2.5vw, 2rem)clamp(0.875rem, 1.25vw, 1.1rem)clamp(3rem, 8vw, 5.5rem) in accent colorclamp(2.5rem, 7vw, 5rem) in secondary colorclamp(1.1rem, 2vw, 1.5rem) italicclamp(0.65rem, 0.9vw, 0.8rem) uppercaseCheck every item. Fix every failure -- do not skip.
Layout and rendering:
.slide has height:100vh; height:100dvh; overflow:hiddenclamp()references/page-library.md limits-clamp(), -min(), -max() in CSS -- wrap negatives in calc(-1 * ...)Structure:
class="slide"class="slide" only on <section> elements, not inner divsDesign quality:
references/style-presets.md)references/style-presets.md)Content:
Save the main HTML:
mkdir -p case-study/[slug]
Write to: case-study/[slug]/index.html
Open it: open case-study/[slug]/index.html
Per-page HTML files (always generate these):
Extract each <section class="slide"> from the main HTML. For each one, create a standalone file with:
<style> block from the main HTML (copied verbatim)<section class="slide"> wrapped in a minimal HTML shellWrite to: case-study/[slug]/page-01.html, page-02.html, etc.
PDF export (always do this for A4 portrait):
bash /Users/ksd/Desktop/Varnan_skills/frontend-slides/scripts/export-pdf.sh \
case-study/[slug]/index.html \
case-study/[slug].pdf --portrait
If landscape 4:3 was requested, omit --portrait and use --compact instead (1280×720).
Note: first run installs Playwright automatically (~30-60 seconds). Inform the user.
Cleanup: Delete .claude-design/previews/ if style preview files were generated in Step 2.
Present in chat:
## Case Study: [customer name]
Date: [today] | Style: [style] | Pages: [N] | Format: A4 portrait
Vendor: [your company] | Customer: [customer name]
---
### Files
Main: case-study/[slug]/index.html
Per-page: case-study/[slug]/page-01.html -> page-0N.html
PDF: case-study/[slug].pdf
---
### Case Study Checklist
- [ ] Replace [IMAGE: logo] placeholder with real logo file
- [ ] Verify all stats are accurate (page [results page number])
- [ ] Confirm customer has approved quote usage
- [ ] Proof company name spelling, speaker title accuracy
- [ ] Test PDF page count = [N] and no content clips
- [ ] Share PDF at case-study/[slug].pdf
Do not print HTML in chat.
| Section | Purpose |
|---|---|
| cover | Opening page -- customer name, headline result, logos |
| overview | At-a-glance profile -- industry, size, use case |
| challenge | The problem -- context + pain points |
| solution | How your product solved it -- feature callouts |
| results | Key metrics + supporting narrative |
| testimonial | Full-width pull quote from customer |
| closing-cta | Vendor logo + contact info + next step |
Low-level plotting library for full customization. Use when you need fine-grained control over every plot element, creating novel plot types, or integrating with specific scientific workflows. Export to PNG/PDF/SVG for publication. For quick statistical plots use seaborn; for interactive plots use plotly; for publication-ready multi-panel figures with journal styling, use scientific-visualization.
Create stunning, animation-rich HTML presentations from scratch or by converting PowerPoint files. Use when the user wants to build a presentation, convert a PPT/PPTX to web, or create slides for a talk/pitch. Helps non-designers discover their aesthetic through visual exploration rather than abstract choices.
> This skill orchestrates autonomous discovery of brand materials across enterprise platforms (Notion, Confluence, Google Drive, Box, SharePoint, Figma, Gong, Granola, Slack). It should be used when the user asks to "discover brand materials", "find brand documents", "search for brand guidelines", "audit brand content", "what brand materials do we have", "find our style guide", "where are our brand docs", "do we have a style guide", "discover brand voice", "brand content audit", or "find brand assets".
Low-level Python plotting for scientific figures: publication-quality line, scatter, bar, heatmap, contour, 3D; multi-panel layouts; fine control of every element. PNG/PDF/SVG export. Use seaborn for quick stats, plotly for interactive.
Formats plain text or markdown files with frontmatter, titles, summaries, headings, bold, lists, and code blocks. Use when user asks to "format markdown", "beautify article", "add formatting", or improve article layout. Outputs to {filename}-formatted.md.
Enterprise-grade PowerPoint deck generation system using evidence-based prompting techniques, workflow enforcement, and constraint-based design. Use when creating professional presentations (board decks, reports, analyses) requiring consistent visual quality, accessibility compliance, and integration of complex data from multiple sources. Implements html2pptx workflow with spatial layout optimization, validation gates, and multi-chat architecture for 30+ slide decks.
Create stunning, animation-rich HTML presentations from scratch or by converting PowerPoint files. Use when the user wants to build a presentation, convert a PPT/PPTX to web, or create slides for a talk/pitch. Helps non-designers discover their aesthetic through visual exploration rather than abstract choices.
Audit a python-pptx export against its source HTML deck, identify layout/content drift (footer overflow, cropped content, missing italic/em, lost styling, off-rhythm spacing), and re-export with strict footer-rail + cursor-flow layout discipline. Use this skill whenever the user has a .pptx that was generated from an HTML slide deck and asks to compare/audit/verify/fix the export — including phrases like "compare ppt with html", "fidelity audit", "fix the pptx", "ppt is cut off", "footer overlap", "italic missing in pptx", "re-export the deck", "pptx-html-fidelity-audit", or any case where a python-pptx → HTML round-trip needs verification or repair. Also trigger when the user shows you a deck.html and a deck.pptx side by side and is debugging visual differences.
Take varnan-tech/graphic-case-study from the repository into ~/.claude/skills for personal
use, or into .claude/skills inside a project.
The agent identifies a skill by the name field in its header. Two skills with the
same name cannot sit side by side — one of them will be ignored.