Install any skill in seconds. Free to start, no credit card required.
Get Started Free →This skill should be used when the user asks to "create a proposal", "design a report", "make a one-pager", "build a PDF", "create a newsletter", "design slides", "make event materials", "design a flyer", or needs help with print-ready HTML documents. Provides brand configuration, CSS patterns for print layout, and document design best practices.
.claude/skills/jamditis-document-design/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-01 | ✗→✓ | ▲ Improved | -1% | 0% |
| case-20 | ✗→✓ | ▲ Improved | -9% | 0% |
| case-03 | ✗→✓ | ▲ Improved | 11% | 0% |
| case-04 | ✗→✓ | ▲ Improved | 38% | 0% |
| case-05 | ✗→✓ | ▲ Improved | -17% | 0% |
Create professional, print-ready HTML documents that export to PDF with customizable branding.
Before creating documents, check for brand configuration in .claude/pdf-playground.local.md. If found, use those settings. If not, use sensible defaults or ask the user for their brand colors.
Look for .claude/pdf-playground.local.md in the project root. Parse the YAML frontmatter:
yaml--- brand: name: "Organization Name" tagline: "Tagline" website: "https://example.com" email: "contact@example.com" colors: primary: "#CA3553" secondary: "#000000" background: "#FFFFFF" text: "#2d2a28" muted: "#666666" fonts: heading: "Playfair Display" body: "Source Sans 3" style: headingCase: "sentence" useOxfordComma: true ---
If no config exists, use these defaults:
#CA3553 (red)#000000 (black)Generate CSS variables from brand config:
css:root { --primary: [colors.primary]; --secondary: [colors.secondary]; --background: [colors.background]; --text: [colors.text]; --muted: [colors.muted]; /* Derived colors */ --primary-dark: [darken primary by 15%]; --gray-100: #f5f4f2; --gray-200: #e8e6e3; }
css@page { size: 8.5in 11in; margin: 0; } @media print { body { -webkit-print-color-adjust: exact !important; print-color-adjust: exact !important; } .page { page-break-after: always; page-break-inside: avoid; } }
css.page { width: 8.5in; height: 11in; padding: 0.5in 0.75in; padding-bottom: 1in; /* Space for footer */ position: relative; box-sizing: border-box; overflow: hidden; }
css.page-footer { position: absolute; bottom: 0.4in; left: 0.75in; right: 0.75in; font-size: 9pt; border-top: 1px solid var(--gray-200); padding-top: 0.1in; background: var(--background); }
Content overlapping or touching the footer is a recurring issue.
Preferred layout, grid rows auto 1fr auto:
css.page { display: grid; grid-template-rows: auto 1fr auto; overflow: hidden; }
This makes the header and footer take their natural height, and the content fills the remaining space. No magic-number calc() needed, the footer clearance is structural.
Required safeguards:
grid-template-rows: auto 1fr auto on the page so content automatically gets the space between header and footeroverflow: hidden on the content container to prevent text bleeding past its boundspadding-bottom: 0.3in (minimum) inside the content area as a bufferheight: calc(...) with magic numbers for header/footer heights, they drift when padding or font sizes changecss@import url('https://fonts.googleapis.com/css2?family=[heading-font]:wght@400;600;700&family=[body-font]:wght@400;500;600;700&display=swap'); body { font-family: '[body-font]', Arial, sans-serif; font-size: 11pt; line-height: 1.6; color: var(--text); } h1, h2, h3 { font-family: '[heading-font]', Georgia, serif; font-weight: 700; }
css.section-title { font-size: 26pt; color: var(--secondary); margin-bottom: 0.25in; } .section-title::after { content: ''; display: block; width: 0.5in; height: 3px; background: var(--primary); margin-top: 0.12in; }
html<header class="cover-header"> <div class="logo-bar"> <div class="logo-primary">[brand.name]</div> </div> <div class="cover-title-block"> <div class="cover-eyebrow">[Document type] • [Date]</div> <h1 class="cover-title">[Title in configured case]</h1> </div> </header>
css.budget-table thead { background: var(--secondary); color: white; } .budget-table tbody tr:last-child { background: var(--primary); color: white; font-weight: 700; }
css.highlight-box { background: linear-gradient(135deg, var(--primary) 0%, var(--primary-dark) 100%); color: white; padding: 0.3in; }
.claude/pdf-playground.local.md${CLAUDE_PLUGIN_ROOT}/templates/Pre-built templates in ${CLAUDE_PLUGIN_ROOT}/templates/:
proposal-template.htmlreport-template.htmlonepager-template.htmlnewsletter-template.htmlslides-template.htmlevent-template.htmlExample brand configurations in ${CLAUDE_PLUGIN_ROOT}/brands/:
default.yaml - Default brand settingsccm.yaml - Center for Cooperative Mediaexample-newsroom.yaml - Sample newsroom configFor detailed CSS patterns: references/css-patterns.md
| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-01 | fail→pass | 36,517 | 25,669 | -30% | 1 | 1 | 0% | 8,261 | 8,146 | -1% | 0 | 0 | — |
case-20 | fail→pass | 14,214 | 1,806 | -87% | 1 | 1 | 0% | 2,474 | 2,242 | -9% | 0 | 0 | — |
case-02 | fail→fail | 4,253 | 6,376 | +50% | 1 | 1 | 0% | 376 | 2,424 | +545% | 0 | 0 | — |
case-03 | fail→pass | 35,296 | 29,792 | -16% | 1 | 1 | 0% | 8,246 | 9,152 | +11% | 0 | 0 | — |
case-04 | fail→pass | 9,660 | 1,929 | -80% | 1 | 1 | 0% | 1,680 | 2,317 | +38% | 0 | 0 | — |
case-05 | fail→pass | 14,224 | 2,067 | -85% | 1 | 1 | 0% | 2,673 | 2,219 | -17% | 0 | 0 | — |
case-06 | fail→pass | 15,124 | 3,160 | -79% | 1 | 1 | 0% | 2,515 | 2,600 | +3% | 0 | 0 | — |
case-07 | fail→pass | 13,288 | 2,125 | -84% | 1 | 1 | 0% | 2,413 | 2,311 | -4% | 0 | 0 | — |
case-08 | fail→fail | 9,024 | 4,514 | -50% | 1 | 1 | 0% | 1,790 | 2,882 | +61% | 0 | 0 | — |
case-09 | pass→pass | 17,360 | 19,801 | +14% | 1 | 1 | 0% | 3,032 | 3,451 | +14% | 0 | 0 | — |
case-10 | fail→pass | 8,319 | 2,309 | -72% | 1 | 1 | 0% | 1,496 | 2,344 | +57% | 0 | 0 | — |
case-11 | fail→pass | 9,964 | 3,228 | -68% | 1 | 1 | 0% | 1,671 | 2,436 | +46% | 0 | 0 | — |
case-12 | fail→pass | 11,197 | 2,147 | -81% | 1 | 1 | 0% | 1,796 | 2,267 | +26% | 0 | 0 | — |
case-13 | fail→pass | 6,975 | 5,016 | -28% | 1 | 1 | 0% | 1,389 | 2,838 | +104% | 0 | 0 | — |
case-14 | fail→pass | 11,186 | 3,600 | -68% | 1 | 1 | 0% | 2,006 | 2,637 | +31% | 0 | 0 | — |
case-15 | fail→pass | 12,611 | 2,546 | -80% | 1 | 1 | 0% | 2,194 | 2,398 | +9% | 0 | 0 | — |
case-16 | pass→pass | 7,709 | 3,638 | -53% | 1 | 1 | 0% | 1,269 | 2,609 | +106% | 0 | 0 | — |
case-17 | pass→pass | 4,926 | 1,897 | -61% | 1 | 1 | 0% | 783 | 2,214 | +183% | 0 | 0 | — |
case-18 | fail→pass | 11,887 | 5,295 | -55% | 1 | 1 | 0% | 2,451 | 2,592 | +6% | 0 | 0 | — |
case-19 | fail→pass | 14,772 | 1,505 | -90% | 1 | 1 | 0% | 2,663 | 2,148 | -19% | 0 | 0 | — |
case-21 | pass→pass | 6,347 | 5,340 | -16% | 1 | 1 | 0% | 1,287 | 2,985 | +132% | 0 | 0 | — |
case-22 | fail→pass | 10,999 | 1,264 | -89% | 1 | 1 | 0% | 1,926 | 2,146 | +11% | 0 | 0 | — |
case-23 | pass→pass | 10,492 | 8,709 | -17% | 1 | 1 | 0% | 1,960 | 3,486 | +78% | 0 | 0 | — |
case-24 | pass→pass | 12,004 | 8,327 | -31% | 1 | 1 | 0% | 2,317 | 3,517 | +52% | 0 | 0 | — |
case-25 | pass→pass | 12,809 | 11,312 | -12% | 1 | 1 | 0% | 2,360 | 3,913 | +66% | 0 | 0 | — |
DecimalAI ran this skill against gemini-3.6-flash twice over the same eval suite — once with the skill loaded and once without — and compared the two runs case by case. 25 cases were attempted, and 24 counted toward the lift figure. The other 1 produced results that are not comparable between the two arms, so they are excluded from the headline rather than averaged into it. The headline lift of +64 percentage points is the difference between those two pass rates over the 24 comparable cases.
Without the skill loaded, the model failed this case. With it loaded, the same prompt on the same model passed. This is one improved case from the latest verified run; every case, including any that regressed, is in the table above.
| Model | Method | Date | Lift |
|---|---|---|---|
| gemini-3.6-flash | verified | 8/21/2026 | +50% |
Other measured skills in the registry, with their headline benchmark lift.