professional-report-design

star 5

Professional PDF Reports: IBM/McKinsey style, infographics, data visualization, perfect pagination, print-ready A4/Letter layouts.

mikailustuner By mikailustuner schedule Updated 5/8/2026

name: professional-report-design description: "Professional PDF Reports: IBM/McKinsey style, infographics, data visualization, perfect pagination, print-ready A4/Letter layouts." triggers: extensions: [".html", ".pdf", ".pptx"] directories: ["reports/", "documents/", "pdf/", "presentation/"] keywords: ["pdf", "report", "professional", "document", "print", "infographic", "chart", "presentation"] auto_load_when: "Creating professional PDF reports, executive summaries, data-driven presentations" agent: document-creator tools: ["Read", "Write", "Bash"]

Professional Report Design (IBM/McKinsey Style)

Focus: Print-perfect PDF generation, infographics, professional layouts, data visualization


1. Core Philosophy

Every page is a canvas:
├── Cover → Executive Summary → Findings → Recommendations → Appendix
├── Every element must survive print (300 DPI, A4/Letter)
├── White space = luxury, not waste
└── Infographics > tables > text for complex data

2. A4 Page Architecture

A4 Page Layout (210mm x 297mm):
┌─────────────────────────────────────────────────────┐
│  Header (optional): Logo, report title, page info │
├─────────────────────────────────────────────────────┤
│                                                     │
│  Main Content Area                                  │
│  - Full width: 160mm (25mm margins each side)      │
│  - Two columns: 77mm each + 6mm gap                 │
│                                                     │
├─────────────────────────────────────────────────────┤
│  Footer: Page N of M | Date | Confidentiality      │
└─────────────────────────────────────────────────────┘

3. IBM/McKinsey Design System

:root {
  /* Primary Colors */
  --primary: #101828;         /* Deep charcoal - headings */
  --primary-light: #1E293B; /* Secondary headings */
  
  /* Brand Colors */
  --mckinsey-blue: #056DAE;  /* McKinsey blue */
  --ibm-blue: #0F62FE;       /* IBM blue */
  --accent-teal: #0D9488;    /* Accent for highlights */
  --accent-amber: #D97706;   /* Warning/attention */
  --accent-red: #DC2626;     /* Critical/alerts */
  
  /* Neutrals */
  --surface: #F8FAFC;        /* Background */
  --surface-alt: #F1F5F9;    /* Alternate background */
  --border: #E2E8F0;         /* Lines, dividers */
  --text: #1E293B;          /* Body text */
  --text-muted: #64748B;     /* Secondary text */
  --text-subtle: #94A3B8;    /* Tertiary, captions */
  
  /* Typography */
  --font-display: 'IBM Plex Sans', 'Inter', system-ui, sans-serif;
  --font-mono: 'IBM Plex Mono', 'Fira Code', monospace;
  
  /* Spacing */
  --space-xs: 4px;
  --space-sm: 8px;
  --space-md: 16px;
  --space-lg: 24px;
  --space-xl: 32px;
  --space-2xl: 48px;
}

/* Page Setup */
@page {
  size: A4;
  margin: 20mm 25mm 18mm 25mm; /* Top, Right, Bottom, Left */
  
  @bottom-left {
    content: element(footer);
  }
  @bottom-right {
    content: counter(page) " / " counter(pages);
    font-size: 9pt;
    color: var(--text-subtle);
  }
}

4. Typography System

/* Headings */
h1 {
  font-family: var(--font-display);
  font-size: 26pt;
  font-weight: 700;
  color: var(--primary);
  line-height: 1.2;
  margin: 0 0 16px 0;
  padding-bottom: 12px;
  border-bottom: 3px solid var(--mckinsey-blue);
}

h2 {
  font-family: var(--font-display);
  font-size: 18pt;
  font-weight: 600;
  color: var(--primary-light);
  margin: 32px 0 12px 0;
  letter-spacing: -0.02em;
}

h3 {
  font-family: var(--font-display);
  font-size: 13pt;
  font-weight: 600;
  color: var(--mckinsey-blue);
  margin: 20px 0 8px 0;
  text-transform: uppercase;
  letter-spacing: 0.05em;
}

/* Body */
p {
  font-family: var(--font-display);
  font-size: 10.5pt;
  line-height: 1.65;
  color: var(--text);
  margin: 0 0 12px 0;
  text-align: justify;
}

/* Captions */
.caption {
  font-size: 9pt;
  color: var(--text-muted);
  line-height: 1.4;
}

/* Label */
.label {
  font-size: 8pt;
  font-weight: 600;
  color: var(--text-subtle);
  text-transform: uppercase;
  letter-spacing: 0.08em;
}

5. Infographic Components

5.1 Metric Card (Key Insight)

<div class="metric-card">
  <div class="metric-value">47%</div>
  <div class="metric-label">Cost Reduction</div>
  <div class="metric-context">vs. Industry Average</div>
</div>

<style>
.metric-card {
  display: inline-block;
  background: var(--primary);
  color: #fff;
  padding: 20px 28px;
  border-radius: 4px;
  text-align: center;
  break-inside: avoid;
}
.metric-value {
  font-size: 36pt;
  font-weight: 700;
  line-height: 1;
}
.metric-label {
  font-size: 11pt;
  font-weight: 600;
  margin-top: 8px;
  text-transform: uppercase;
  letter-spacing: 0.05em;
}
.metric-context {
  font-size: 9pt;
  opacity: 0.8;
  margin-top: 4px;
}
</style>

5.2 Progress Ring

<div class="progress-ring">
  <svg viewBox="0 0 100 100">
    <circle cx="50" cy="50" r="45" fill="none" stroke="var(--border)" stroke-width="8"/>
    <circle cx="50" cy="50" r="45" fill="none" stroke="var(--mckinsey-blue)" 
            stroke-width="8" stroke-dasharray="283" stroke-dashoffset="70"/>
  </svg>
  <span class="progress-value">75%</span>
</div>

5.3 Comparison Bar

<div class="comparison-bar">
  <div class="bar-row">
    <span class="bar-label">Current State</span>
    <div class="bar-track"><div class="bar-fill" style="width: 35%"></div></div>
    <span class="bar-value">35%</span>
  </div>
  <div class="bar-row">
    <span class="bar-label">Target State</span>
    <div class="bar-track"><div class="bar-fill target" style="width: 78%"></div></div>
    <span class="bar-value">78%</span>
  </div>
</div>

6. Data Visualization

6.1 Simple Bar Chart (CSS-only)

<div class="chart-container">
  <h4>Revenue by Region (USD Millions)</h4>
  <div class="bar-chart">
    <div class="bar-item">
      <span class="bar-label">North America</span>
      <div class="bar-wrapper"><div class="bar" style="width: 92%"></div></div>
      <span class="bar-value">$42.5M</span>
    </div>
    <div class="bar-item">
      <span class="bar-label">Europe</span>
      <div class="bar-wrapper"><div class="bar" style="width: 68%"></div></div>
      <span class="bar-value">$31.2M</span>
    </div>
    <div class="bar-item">
      <span class="bar-label">Asia Pacific</span>
      <div class="bar-wrapper"><div class="bar" style="width: 54%"></div></div>
      <span class="bar-value">$24.8M</span>
    </div>
  </div>
</div>

6.2 Timeline

<div class="timeline">
  <div class="timeline-item">
    <div class="timeline-marker"></div>
    <div class="timeline-date">Q1 2024</div>
    <div class="timeline-content">
      <h4>Assessment Complete</h4>
      <p>Initial baseline analysis and stakeholder interviews</p>
    </div>
  </div>
  <div class="timeline-item">
    <div class="timeline-marker"></div>
    <div class="timeline-date">Q2 2024</div>
    <div class="timeline-content">
      <h4>Implementation Started</h4>
      <p>Phase 1 rollout to pilot markets</p>
    </div>
  </div>
</div>

7. Table Patterns

7.1 Executive Summary Table

<table class="executive-table">
  <thead>
    <tr>
      <th>Metric</th>
      <th>Current</th>
      <th>Target</th>
      <th>Change</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Customer Satisfaction</td>
      <td>72%</td>
      <td>85%</td>
      <td class="positive">+13%</td>
    </tr>
    <tr>
      <td>Operating Cost</td>
      <td>$4.2M</td>
      <td>$3.1M</td>
      <td class="positive">-26%</td>
    </tr>
  </tbody>
</table>

8. Page Overflow Prevention (CRITICAL)

8.1 The Golden Rules

/* NEVER split these across pages */
.no-break, 
.table, 
figure, 
.chart-container,
.infographic,
.metric-card,
.callout-box,
.key-insight {
  break-inside: avoid;
  page-break-inside: avoid;
}

/* Keep paragraphs together */
p {
  orphans: 3;   /* Min 3 lines at bottom of page */
  widows: 3;    /* Min 3 lines at top of page */
}

/* Images max-width */
img, svg {
  max-width: 100%;
  max-height: 180mm; /* Prevent tall images */
  object-fit: contain;
}

8.2 Long Tables

/* For tables longer than half a page */
table.long-table {
  font-size: 9pt;
}

table.long-table thead {
  position: sticky;
  top: 0;
}

/* Table row keeps together */
table tbody tr {
  break-inside: avoid;
}

8.3 Section Break Strategy

/* Major sections get new page */
.section-intro {
  break-before: page;
}

.section-findings {
  break-before: page;
}

.section-appendix {
  break-before: page;
}

/* Subsections stay on same page when possible */
h2 {
  break-after: avoid;
  page-break-after: avoid;
}

9. Professional Layouts

9.1 Cover Page

<div class="cover-page">
  <div class="cover-header-bar"></div>
  
  <div class="cover-logo">
    <img src="logo.svg" style="height: 40px;"/>
  </div>
  
  <div class="cover-title-block">
    <div class="cover-category">STRATEGIC ASSESSMENT</div>
    <h1>Digital Transformation<br/>Initiative 2024</h1>
    <div class="cover-subtitle">Executive Summary & Recommendations</div>
  </div>
  
  <div class="cover-meta">
    <div class="meta-row">
      <span class="meta-label">Prepared for</span>
      <span class="meta-value">Executive Leadership Team</span>
    </div>
    <div class="meta-row">
      <span class="meta-label">Date</span>
      <span class="meta-value">May 2024</span>
    </div>
    <div class="meta-row">
      <span class="meta-label">Classification</span>
      <span class="meta-value">CONFIDENTIAL</span>
    </div>
  </div>
  
  <div class="cover-footer-bar">
    <span>OmniRule Analytics</span>
  </div>
</div>

9.2 Executive Summary (2-column)

<div class="two-column">
  <div class="column">
    <h3>Key Findings</h3>
    <ul class="summary-list">
      <li><strong>73%</strong> of processes require automation</li>
      <li><strong>$2.4M</strong> potential annual savings identified</li>
      <li><strong>8 weeks</strong> estimated implementation timeline</li>
    </ul>
  </div>
  <div class="column">
    <h3>Recommendations</h3>
    <ul class="summary-list">
      <li>Implement RPA for finance operations</li>
      <li>Consolidate vendor contracts</li>
      <li>Establish Center of Excellence</li>
    </ul>
  </div>
</div>

10. Playwright PDF Generation

import { chromium } from 'playwright';

interface PDFOptions {
  format?: 'A4' | 'Letter';
  margin?: { top: string; right: string; bottom: string; left: string };
  scale?: number;
}

async function generatePDF(html: string, outputPath: string, options: PDFOptions = {}) {
  const browser = await chromium.launch({ 
    headless: true,
    args: ['--no-sandbox']  // For server environments
  });
  
  const page = await browser.newPage({
    viewport: { width: 2480, height: 3508 },  // A4 at 300 DPI
  });
  
  // Set content with proper viewport
  await page.setContent(html, { 
    waitUntil: 'networkidle',
    timeout: 30000
  });
  
  // Wait for fonts to load
  await page.evaluate(() => document.fonts.ready);
  
  // Generate PDF
  await page.pdf({
    path: outputPath,
    format: options.format || 'A4',
    printBackground: true,
    scale: 1,
    margin: options.margin || {
      top: '20mm',
      right: '25mm', 
      bottom: '18mm',
      left: '25mm'
    },
    preferCSSPageSize: true,
  });
  
  await browser.close();
}

11. Common Issues & Solutions

Problem Solution
Text cuts off mid-sentence Add orphans: 3; widows: 3; to paragraphs
Table header repeats on each page Use <thead> with position: sticky
Image too large/broken Set max-height: 170mm; object-fit: contain
Footer overlaps content Increase bottom margin in @page
Colors wrong in print Add print-color-adjust: exact to colored elements
Chinese/Japanese fonts missing Embed as WOFF2 base64 or use system fonts
Charts look blurry Use SVG instead of PNG, 2x resolution
Page numbers wrong Use CSS counters: counter(pages)

12. Quick Reference

Element CSS Property Value
Page size @page size A4 (210 × 297mm)
Margins @page margin 20mm 25mm 18mm 25mm
No page break break-inside avoid
New page break-before page
Keep together break-after avoid
Orphan lines orphans 3
Widow lines widows 3
Print colors print-color-adjust exact

Anti-Patterns

❌ Never Do ✅ Do Instead
Fixed heights in mm for text containers Use min-height or let content expand
Position: fixed for headers Use @page margin boxes
overflow: hidden on main containers Use break-inside: avoid on children
Images larger than 170mm Scale down, use object-fit: contain
Different margins per page Use consistent @page margins
Screen-only @media for print Write print-first CSS by default
PNG for charts at 72 DPI Use SVG or 300 DPI PNG
External fonts via @import Embed as base64 WOFF2

🌍 Universal Language Support

  • Turkish Native: This skill natively supports Turkish. If the user prompt is in Turkish, all analysis, formatting, and output MUST be entirely in Turkish. You do not need explicit "write in Turkish" instructions.
Install via CLI
npx skills add https://github.com/mikailustuner/OmniRule --skill professional-report-design
Repository Details
star Stars 5
call_split Forks 0
navigation Branch main
article Path SKILL.md
More from Creator
mikailustuner
mikailustuner Explore all skills →