From pdf-playground
Creates print-ready HTML documents for PDF export using brand configs, print CSS patterns, and design best practices for proposals, reports, flyers.
npx claudepluginhub jamditis/claude-skills-journalism --plugin pdf-playgroundThis skill uses the workspace's default tool permissions.
Create professional, print-ready HTML documents that export to PDF with customizable branding.
Generates professionally designed case study PDFs for B2B SaaS sales and marketing from customer details. Supports 7 page layouts, 9 style presets, 1-4 page output.
Generates self-contained HTML documents (resumes, slides, one-pagers, portfolios, letters, white papers) in warm-parchment aesthetic with ink-blue accents and editorial typography for PDF rendering via WeasyPrint.
Generates website style guides and design systems from URLs, screenshots, and docs. Outputs professional PDFs with colors, typography, logos, components, and brand guidelines.
Share bugs, ideas, or general feedback.
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:
---
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:
: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;
}
@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;
}
}
.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;
}
.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:
.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 change@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;
}
.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;
}
<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>
.budget-table thead {
background: var(--secondary);
color: white;
}
.budget-table tbody tr:last-child {
background: var(--primary);
color: white;
font-weight: 700;
}
.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