blog-article-design
Design and implement high-quality blog post and article page layouts with professional typography, spacing, and visual hierarchy. Use when building blog pages, article templates, technical documentation readers, use-case pages, or long-form content layouts. Covers dark and light themes.
What this skill does
# Blog & Article Design
## Overview
Professional design system for blog posts, articles, and long-form content pages. Based on patterns from Stripe, Vercel, Tailwind, and Linear documentation. Provides specific typography scales, spacing rules, code block styling, and visual hierarchy guidelines optimized for readability on both dark and light themes.
## Instructions
When designing or improving a blog/article page, follow these steps in order.
### Step 1: Set the content container
The single most important decision is content width. Optimal reading length is 60-70 characters per line.
```
Container width: max-w-2xl (672px) for prose-heavy articles
max-w-3xl (768px) if content includes wide code blocks or tables
Centering: mx-auto
Horizontal pad: px-6 (24px on each side)
Top padding: pt-24 (96px) to clear fixed headers
Bottom padding: pb-16 (64px)
```
Never use `max-w-4xl` or wider for article text — lines become too long to read comfortably.
### Step 2: Define the typography scale
Use a constrained type scale with clear hierarchy. Every level must be visually distinct.
**Dark theme (zinc palette):**
```
H1: text-3xl md:text-4xl font-bold text-zinc-50 — Page title, one per page
H2: text-2xl font-semibold tracking-tight text-zinc-50 — Major sections, mt-12 mb-4
H3: text-xl font-semibold tracking-tight text-zinc-50 — Subsections, mt-8 mb-3
H4: text-lg font-semibold text-zinc-100 — Minor headings, mt-6 mb-2
Body: text-base leading-7 text-zinc-300 mb-6 — Paragraphs, 16px/28px
Strong: text-zinc-50 font-semibold — Emphasis within body
Muted: text-zinc-400 — Captions, metadata
Link: text-accent underline decoration-accent/40 — Visible, accessible links
```
**Light theme (gray palette):**
```
H1: text-3xl md:text-4xl font-bold text-gray-900
H2: text-2xl font-semibold tracking-tight text-gray-900
H3: text-xl font-semibold tracking-tight text-gray-900
Body: text-base leading-7 text-gray-600 mb-6
Strong: text-gray-900 font-semibold
Muted: text-gray-500
```
Key rules:
- Body line-height must be `leading-7` (1.75) for comfortable reading
- Paragraph spacing `mb-6` creates clear separation without feeling sparse
- Headings use `tracking-tight` for a polished, dense feel
- H2 gets `mt-12` — generous top margin signals a new major section
### Step 3: Style lists and inline elements
```
Unordered: list-disc list-outside pl-6 space-y-2 text-zinc-300 my-6
Ordered: list-decimal list-outside pl-6 space-y-2 text-zinc-300 my-6
List item: text-base leading-7
Inline code: bg-white/10 px-1.5 py-0.5 rounded-md text-[0.9em] font-mono text-zinc-200
Blockquote: border-l-4 border-zinc-700 pl-4 my-6 text-zinc-400 italic
Horizontal rule: border-white/10 my-12
```
For ordered lists interrupted by other elements (code blocks), preserve the `start` attribute to maintain correct numbering.
### Step 4: Design code blocks
Two distinct code block types:
**Language-tagged blocks (syntax-highlighted code):**
```
Container: my-6 rounded-xl border border-white/10 bg-zinc-900 overflow-hidden
Header: flex items-center gap-2 px-4 py-2.5 border-b border-white/5 bg-zinc-900/80
Lang label: text-xs font-mono text-zinc-500
Code area: px-5 py-4 overflow-x-auto
Pre: text-sm leading-relaxed whitespace-pre-wrap break-words
```
**Text/output blocks (untagged or `text` language):**
```
Container: my-6 rounded-xl border border-white/10 bg-zinc-900 overflow-x-auto
Pre: px-5 py-4 text-sm leading-relaxed whitespace-pre-wrap break-words font-mono
```
For output blocks, apply line-by-line visual hierarchy:
- First non-empty line → `text-zinc-50 font-semibold` (title)
- ALL CAPS lines → `text-zinc-100 font-medium` (section header)
- Lines ending with `:` (under 60 chars) → section header style
- Numbered items (`1. ...`) → `text-zinc-200`
- Divider lines (`---`, `===`) → `text-zinc-700`
- Dollar amounts, percentages → `text-emerald-400` highlight
- Everything else → `text-zinc-400` (body)
- Blank lines → `h-3` spacer
### Step 5: Design tables
```
Wrapper: overflow-x-auto my-6 rounded-xl border border-white/10
Table: w-full text-sm border-collapse
Thead: bg-zinc-900/50
Th: text-left py-3 px-4 text-zinc-200 font-semibold text-xs uppercase tracking-wider
Tr: border-b border-white/5
Td: py-3 px-4 text-zinc-300
```
### Step 6: Add page-level structure
A well-structured article page has these sections in order:
```
1. Breadcrumb — text-sm text-muted, links with hover:text-white
2. Title — H1, single line preferred, bold
3. Metadata bar — category badge, tags, author, date (flex-wrap gap-3)
4. Related resources — linked cards (if applicable)
5. Article body — markdown-rendered content
6. Footer — related articles, share buttons (optional)
```
Category badge style: `text-xs bg-accent/20 text-accent px-2 py-1 rounded capitalize`
Tags: `text-xs text-muted` with `#` prefix
### Step 7: Responsive behavior
```
Mobile (<640px): px-6, text-3xl title, full-width code blocks
Tablet (640px+): Same as mobile but wider line length
Desktop (768px+): text-4xl title, centered container
```
Code blocks should use `overflow-x-auto` on mobile and `whitespace-pre-wrap break-words` to avoid horizontal scroll when possible.
## Examples
### Example 1: React markdown component overrides for a dark-theme article
**User request:** "Create custom markdown components for my blog's article pages with a dark theme"
**Implementation:**
```tsx
import React from 'react'
export const markdownComponents = {
h1: () => null, // Title rendered separately above the article
h2: ({ children }: any) => (
<h2 className="text-2xl font-semibold tracking-tight text-zinc-50 mt-12 mb-4">{children}</h2>
),
h3: ({ children }: any) => (
<h3 className="text-xl font-semibold tracking-tight text-zinc-50 mt-8 mb-3">{children}</h3>
),
p: ({ children }: any) => (
<p className="text-base leading-7 text-zinc-300 mb-6">{children}</p>
),
strong: ({ children }: any) => (
<strong className="text-zinc-50 font-semibold">{children}</strong>
),
a: ({ href, children }: any) => (
<a href={href} className="text-emerald-400 underline decoration-emerald-400/40 underline-offset-2 hover:decoration-emerald-400 transition-colors" target="_blank" rel="noopener noreferrer">{children}</a>
),
ul: ({ children }: any) => (
<ul className="list-disc list-outside pl-6 space-y-2 text-zinc-300 my-6">{children}</ul>
),
ol: ({ children, start }: any) => (
<ol start={start} className="list-decimal list-outside pl-6 space-y-2 text-zinc-300 my-6">{children}</ol>
),
li: ({ children }: any) => (
<li className="text-base leading-7 [&>p]:mb-0">{children}</li>
),
code: ({ className, children }: any) => {
if (className?.includes('language-')) return <code className={className}>{children}</code>
return <code className="bg-white/10 px-1.5 py-0.5 rounded-md text-[0.9em] font-mono text-zinc-200">{children}</code>
},
pre: ({ children }: any) => (
<div className="my-6 rounded-xl border border-white/10 bg-zinc-900 overflow-x-auto">
<pre className="px-5 py-4 text-sm leading-relaxed whitespace-pre-wrap break-words">{children}</pre>
</div>
),
table: ({ children }: any) => (
<div className="overflow-x-auto my-6 rounded-xl border border-white/10">
<table className="w-full text-sm border-collapse">{children}</table>
</div>
),
blockquote: ({ children }: any) => (
<blockquote className="border-l-4 border-zinc-700 pl-4 my-6 text-zinc-400 italic [&>p]:mb-0">{children}</blockquote>
),
}
```
### Example 2: Article page layout with breadcrumbs and metadata
**User request:** "Build a use-case article page with a breadcrumb, title, category badge, and markdown body"
**Implementation:**
```tsx
export default function ArticlePage({ article }) {
return (
Related in Design
contribute
IncludedLocal-only OSS contribution command center. Auto-refreshes the user's in-flight PR and issue state on invoke so conversations start with full context — no need to brief Claude on what's in flight. Helps the user find issues to contribute to on GitHub, builds per-repo dossiers of what each upstream expects (CLA, DCO, branch convention, AI policy, draft-first, review bots, issue templates), runs deterministic gates before any external action so AI-assisted contributions don't reach maintainers as slop. State is markdown-only: candidate files at ~/.contribute-system/candidates/, repo dossiers at ~/.contribute-system/research/, append-only event log at ~/.contribute-system/log.jsonl. No database, no cloud calls. Use when the user asks about their PRs / issues / contributions, wants to find new work to take on, claim an issue, build/refresh a repo's dossier, or draft a Design Issue or PR. Trigger with "/contribute", "what's my PR status", "find a contribution", "claim issue X", "draft a Design Issue for Y", "refresh dossier for Z".
architectural-analysis
IncludedUser-triggered deep architectural analysis of a codebase or scoped subtree across eight modes — information architecture, data flow, integration points, UI surfaces, interaction patterns, data model, control flow, and failure modes. This skill should be used when the user asks to "diagram this codebase," "map the architecture," "show the data flow," "give me an ERD," "trace control flow," "find the integration points," "verify the layout pattern," "audit the UX architecture," or any similar request whose primary deliverable is mermaid diagrams plus cited reports under docs/architecture/. Dispatches haiku/sonnet sub-agents in parallel for per-mode exploration, then verifies every citation mechanically before any node lands in a diagram. Not for one-off prose explanations of code (use code-explanation) or for high-level system design from scratch (use system-design).
mcp
IncludedModel Context Protocol (MCP) server development and tool management. Languages: Python, TypeScript. Capabilities: build MCP servers, integrate external APIs, discover/execute MCP tools, manage multi-server configs, design agent-centric tools. Actions: create, build, integrate, discover, execute, configure MCP servers/tools. Keywords: MCP, Model Context Protocol, MCP server, MCP tool, stdio transport, SSE transport, tool discovery, resource provider, prompt template, external API integration, Gemini CLI MCP, Claude MCP, agent tools, tool execution, server config. Use when: building MCP servers, integrating external APIs as MCP tools, discovering available MCP tools, executing MCP capabilities, configuring multi-server setups, designing tools for AI agents.
react-native-skia
IncludedDesign, build, debug, and optimise high-polish animated graphics in React Native or Expo using @shopify/react-native-skia, Reanimated, and Gesture Handler. Use when the user wants canvas-driven UI, shaders, paths, rich text, image filters, sprite fields, Skottie, video frames, snapshots, web CanvasKit setup, or performance tuning for custom motion-heavy elements such as loaders, hero art, cards, charts, progress indicators, particle systems, or gesture-driven surfaces. Also use when the user asks for fluid, glow, glass, blob, parallax, 60fps/120fps, or GPU-friendly animated effects in React Native, even if they do not explicitly say "Skia". Do not use for ordinary form/layout work with standard views.
plaid
IncludedProduct Led AI Development — guides founders from idea to launched product. Six capabilities: Idea (discover a product idea), Validate (pressure-test the idea against fatal flaws, problem reality, competition, and 2-week MVP feasibility), Plan (vision intake + document generation), Design (translate image references into a design.md spec), Launch (go-to-market strategy), and Build (roadmap execution). Use when someone says "PLAID", "plaid idea", "help me find an idea", "product idea", "idea from my business", "idea from my expertise", "plaid validate", "validate my idea", "pressure-test", "is this idea good", "find fatal flaws", "validate the problem", "plan a product", "define my vision", "generate a PRD", "product strategy", "plaid design", "design from image", "translate image to design", "create design.md", "extract design tokens", "plaid launch", "go-to-market", "launch plan", "GTM strategy", "launch playbook", "plaid build", "build the app", "start building", or "execute the roadmap".
nextjs-framer-motion-animations
IncludedAdds production-safe Motion for React or Framer Motion animations to Next.js apps, including reveal, hover and tap micro-interactions, whileInView, stagger, AnimatePresence, layout and layoutId transitions, reorder, scroll-linked UI, and lightweight route-content transitions. Use when the user asks to add, refactor, or debug Motion or Framer Motion in App Router or Pages Router codebases, especially around server/client boundaries, reduced motion, LazyMotion, bundle size, hydration, or route transitions. Avoid for GSAP-style timelines, WebGL or 3D scenes, heavy scroll storytelling, or CSS-only effects unless Motion is explicitly requested.