Extract Design
by @vintlin
Use this skill when the user wants to extract a webpage's design language into a reusable HTML style reference file, including typography, colors, spacing, s...
clawhub install extract-design📖 About This Skill
name: extract-design description: Use this skill when the user wants to extract a webpage's design language into a reusable HTML style reference file, including typography, colors, spacing, surfaces, components, states, themes, motion, code-block styles, background atmosphere, decorative motifs, and art direction. The output should be a universal style specimen HTML for future AI-generated pages, not a 1:1 copy of the original page. Extracted style files are saved to the skill's own
assets/theme/ directory, never to the user's project.
Extract Design
Output Location
CRITICAL: All extracted style files MUST be saved to the skill's own assets/theme/ directory — never to the user's project directory, never to a relative path from the current working directory.
Before writing any output file, resolve the skill directory by running:
Glob pattern: **/skills/extract-design/SKILL.md
The directory containing that SKILL.md file is SKILL_DIR. All output goes under SKILL_DIR/assets/theme/.
Output files use the source domain or project name as a prefix:
SKILL_DIR/assets/theme/
├── {name}-style-manifest.json # Structured style manifest
└── {name}-style-specimen.html # Universal style specimen HTML
Examples (where SKILL_DIR is whatever path the Glob resolved):
{SKILL_DIR}/assets/theme/ampcode-style-manifest.json{SKILL_DIR}/assets/theme/ampcode-style-specimen.html{SKILL_DIR}/assets/theme/vercel-style-manifest.json{SKILL_DIR}/assets/theme/vercel-style-specimen.htmlCreate the assets/theme/ directory if it does not exist before writing.
Reference Files
The references/ directory inside this skill contains two files you MUST use during every extraction. Both paths are relative to SKILL_DIR (resolved via Glob above):
{SKILL_DIR}/references/extraction-checklist.md — comprehensive checklist for all extraction dimensions. Work through every section; note why if a dimension is not applicable.{SKILL_DIR}/references/style-specimen.html — structural template for Output C. Your generated specimen must follow the same structure.WARNING: The template contains /* REPLACE */ placeholders for every CSS token value. You MUST replace ALL of them with values measured from the target site. Do NOT keep any placeholder value in the final output. A /* REPLACE */ in the output file means the extraction is incomplete.
When to use
Use this skill when the user wants to:
Do not use this skill if the user wants:
This skill is for style system extraction, not page cloning.
Core principle
Your task is not to reproduce the page structure.
Your task is to extract the page's visual system and represent it as:
1. Primitive tokens 2. Semantic tokens 3. Background / atmosphere system 4. Decorative motif system 5. Component archetypes 6. Interaction rules 7. A universal style specimen HTML
The final result must be a general-purpose reference file that another AI can read and use to generate new pages in the same style.
Think in terms of:
Do not think in terms of:
The goal is:
Preserve not only the component language, but also the page atmosphere, decorative motifs, and art direction. A faithful extraction must capture both system structure and visual mood.
Output contract
When using this skill, produce three outputs:
Output A — Extraction summary
A concise explanation of the extracted style system:Output B — Structured style manifest
A required machine-readable JSON file saved to{SKILL_DIR}/assets/theme/{name}-style-manifest.json, describing:Output C — Universal style specimen HTML
A single HTML file containing:This HTML file should be general and reusable.
Required extraction dimensions
You must extract the following categories.
1. Meta context
Capture:2. Typography
Extract:Do not only report raw values. Abstract them into roles such as:
--font-family-sans--font-family-mono--font-size-body--font-size-heading-lg--line-height-body--font-weight-semibold3. Color system
Extract:Abstract colors into semantic roles, not just raw hex values.
Examples:
--color-bg-page--color-surface-card--color-text-primary--color-text-secondary--color-border-default--color-brand-primary--color-code-bg4. Spacing and layout
Extract:Abstract into spacing and layout tokens.
5. Surface / shape / elevation
Extract:Examples:
--radius-sm--radius-card--shadow-sm--shadow-elevated--focus-ring6. Motion / Animation
Extract motion and animation tokens:Transitions (via computed styles):
@keyframes animations (require direct stylesheet parsing):
@keyframes rule must be captured separately — extract-styles.py does NOT capture theseHow to extract @keyframes — run {SKILL_DIR}/scripts/extract-keyframes.py or this browser console snippet:
const keyframes = [];
for (const sheet of document.styleSheets) {
try {
for (const rule of sheet.cssRules) {
if (rule.type === CSSRule.KEYFRAMES_RULE) {
keyframes.push({ name: rule.name, cssText: rule.cssText });
}
}
} catch(e) { /* CORS restriction, skip */ }
}
console.log(JSON.stringify(keyframes, null, 2));
Abstract into motion tokens:
--motion-duration-fast, --motion-duration-normal--motion-ease-standard, --motion-ease-emphasizedAnimation archetypes to look for:
7. Component archetypes
Extract reusable component families rather than page-specific instances.At minimum inspect:
For each component archetype record:
8. Code block system
This is mandatory if code blocks exist or may matter later.Extract:
9. Responsive and theme rules
Capture:10. Atmosphere / Background System
Extract the page-level and section-level visual atmosphere, not only flat background colors.You must inspect and abstract:
::before, ::after)Do not flatten atmospheric styling into a single background-color.
Always model it as a distinct system.
Examples of useful semantic outputs:
--bg-page-base--bg-page-overlay--bg-page-pattern--bg-hero-gradient--bg-section-muted--pattern-stripe-color--pattern-grid-color--texture-noise-opacity--ambient-glow-primary--ambient-glow-blur--decorative-line-opacity11. Decorative Motif System
Extract repeated visual motifs that may appear in only a few places but clearly shape the site’s identity.You must inspect and abstract:
A motif may originate in one component but still represent page-level visual DNA. Elevate it when appropriate.
Useful outputs include:
motifs.diagonal-stripemotifs.gridlinemotifs.editorial-rulemotifs.noise-overlaymotifs.ambient-glowmotifs.scanlineExtraction method
Rule 1: Prefer rendered reality over source intent
Use the final rendered/computed result as the ground truth.Prioritize:
Do not rely solely on authored CSS.
Mandatory computed style checks — before recording any token value, use browser tools to read the actual computed value. Do not infer from class names, design system conventions, or framework patterns. Specifically:
document.documentElement.getAttribute('data-theme') to confirm the actual default theme on page load. Never assume dark-first or light-first from visual appearance alone.getComputedStyle(document.documentElement).getPropertyValue('--var-name') to get exact values.getComputedStyle(el).backgroundColor, .color, .borderColor etc. — not from class names.getComputedStyle(el).transition to get the actual easing curve, not a generic approximation.background-image on all elements to detect patterns, gradients, and motifs.If a value cannot be read via computed style (e.g. cross-origin stylesheet blocked, canvas-only visuals), you must label it as "inferred" in the manifest's limitations field. Do not silently use an approximated value as if it were measured.
Rule 2: Cluster before naming
Do not emit a token for every distinct observed value.Instead:
1. collect raw values 2. group near-equivalent visual values 3. infer the system 4. assign semantic names
Example:
Bad:
--blue-1--blue-2--blue-3--text-gray-7Better:
--color-brand-primary--color-link-default--color-link-hover--color-text-secondaryRule 3: Extract semantic roles, not only raw values
A useful reference file must explain what a value does, not only what the value is.Always try to map raw observations into roles.
Rule 4: Extract states actively
Do not assume the static DOM shows all relevant UI states.For every component archetype in the manifest, you must record all of the following states:
If a state cannot be reliably observed, you must explicitly record it as "inferred" or "unavailable" — do not omit it silently. A missing state entry is not the same as an unavailable state.
Rule 5: Build archetypes, not clones
If you see 11 cards, do not export 11 card classes unless they are meaningfully distinct.Instead compress them into a small set of archetypes, for example:
Rule 6: Separate content from style
The specimen file should use neutral placeholder content.Do not preserve source page copy unless the user explicitly asks.
Rule 7: Report uncertainty honestly
If some styles are not reliably extractable, say so.Never emit an empty object or empty array for a field you could not extract. Instead:
null and add a note to limitations."inferred: " or add it to limitations.Bad:
"shadow": {}
"surfaces": {}
Good:
"shadow": null,
"limitations": ["Shadow styles not observed — site appears to use no box-shadow"]
Typical limitations include:
Rule 8: Extract atmosphere separately from components
A page may feel distinctive because of background treatment, not because of buttons or cards.Always inspect atmosphere at 4 levels: page-level (html/body/main wrappers), section-level (hero, feature, CTA), decorative-layer (pseudo-elements, absolutely positioned ornaments, SVG art-direction layers), and motif system (stripes, grids, scan lines, grain, glows, repeated patterns).
When inspecting, always check: background, background-image, background-size/repeat/position/attachment, mask, mask-image, filter, backdrop-filter, opacity, mix-blend-mode, isolation, decorative SVGs, data URI / base64 backgrounds, and pseudo-element paint layers.
If an atmospheric pattern appears only in one component but clearly represents the site's broader visual language, elevate it into a motif token rather than leaving it inside that component.
Rule 9: Capture mood, not only implementation
In addition to CSS facts, summarize the visual mood in plain language.
Examples:
This mood description should align with the extracted tokens and motifs.
Browser tool
Do not attempt to extract styles by reading static HTML source or stylesheet files alone — computed styles, CSS variable resolution, and theme state require a live browser context.
This skill ships a self-contained Python/Playwright script. Before running it, resolve SKILL_DIR using the Glob pattern /skills/extract-design/SKILL.md (as described in Output Location** above), then substitute it into the path below.
Setup (one-time):
pip install playwright
playwright install chromium
Usage:
# Light mode only
python3 {SKILL_DIR}/scripts/extract-styles.py https://example.comLight + dark mode
python3 {SKILL_DIR}/scripts/extract-styles.py https://example.com --darkSave to file
python3 {SKILL_DIR}/scripts/extract-styles.py https://example.com --dark --out /tmp/styles.json
For @keyframes extraction (required for animation system):
python3 {SKILL_DIR}/scripts/extract-keyframes.py https://example.com --out /tmp/keyframes.json
The script outputs structured JSON with light and dark keys, each containing:
cssVars — all CSS custom properties (--*) from stylesheetscolors — computed backgroundColor, color on html/body/card elementsfonts — computed fontFamily, fontSize, fontWeight on body, h1, h2button — computed styles on the first backgroundImages — all elements with background-image !== none (patterns, gradients)accentColors — computed colors on links and accent/brand-classed elementstypography — h1 size, weight, letter-spacing, line-height, colorRecommended extraction workflow
Before starting: Open {SKILL_DIR}/references/extraction-checklist.md and keep it open throughout. Check off each item as you complete it. Use {SKILL_DIR}/references/style-specimen.html as your structural template when building Output C.
Step 1 — Characterize the page
Summarize:Step 2 — Gather raw observations
Collect all observed values by reading computed styles directly, not by inferring from class names or source code.Required checks (run these before proceeding to Step 3):
1. Default theme: document.documentElement.getAttribute('data-theme') — record the actual value on page load
2. Body background: getComputedStyle(document.body).backgroundColor
3. Body color: getComputedStyle(document.body).color
4. Font family: getComputedStyle(document.body).fontFamily
5. CSS custom properties: iterate document.styleSheets to extract all -- variables with their actual values
6. Accent/brand colors: query key elements (links, buttons, badges) and read .color and .backgroundColor
7. Background patterns: query all elements for backgroundImage !== 'none' — record the full value including gradient stops and background-size
8. Transitions: read getComputedStyle(el).transition on buttons and interactive elements — record the exact easing function
9. Card/surface styles: read backgroundColor, borderColor, borderRadius, boxShadow on card elements
10. Dark mode: if a theme toggle exists, activate dark mode and re-read the above values
11. @keyframes: extract all @keyframes rules from stylesheets (see section 6b for method)
Record raw values first. Do not skip to naming or abstracting until all raw values are collected.
Step 3 — Normalize into primitives
Reduce noise and create primitive tokens.Step 4 — Map to semantic tokens
Assign role-based names.Step 5 — Build background and motif systems
Identify:Step 6 — Build component archetypes
Identify reusable component families.Step 7 — Derive interaction rules and extract @keyframes
Summarize state transitions and motion behavior. If the site uses @keyframes (backgrounds, modals, loading states, hover effects):1. Run {SKILL_DIR}/scripts/extract-keyframes.py or extract via browser console
2. For each keyframe, abstract into semantic description
3. Map to component archetypes where used
4. Add to manifest's motion.keyframes array
5. Add animation demo section to specimen HTML
Step 8 — Build the specimen HTML
Create a general-purpose design reference page following the structure in{SKILL_DIR}/references/style-specimen.html. Save to {SKILL_DIR}/assets/theme/{name}-style-specimen.html.The template uses /* REPLACE */ as placeholders for every CSS token value. You must replace every single one with a value measured from the target site. Search the output file for /* REPLACE */ before saving — if any remain, the step is not complete. Add or remove motif cards and background sample cards to match what was actually found.
Step 9 — Validate usefulness
Ask:If not, revise.
Step 10 — Sync manifest and specimen
Before saving, verify that the manifest and specimen HTML are consistent:manifest.components must have a corresponding rendered section in the specimen HTML.manifest.components.{} or empty array [] — use null with a limitations note instead.If they are out of sync, fix both files before finishing.
Required style manifest schema
The structured manifest should generally follow this shape:
{
"meta": {},
"style_character": {},
"primitives": {},
"semantic": {},
"background": {
"page": {},
"sections": [],
"layers": [],
"gradients": [],
"patterns": [],
"images": [],
"overlays": []
},
"motifs": [],
"themes": {},
"motion": {
"duration": {},
"easing": {},
"keyframes": [
{
"name": "animationName",
"description": "What the animation does",
"from": "opacity: 0; transform: scale(0.95)",
"to": "opacity: 1; transform: scale(1)"
}
]
},
"components": [],
"responsive_rules": [],
"accessibility_notes": [],
"limitations": []
}
Note: If no @keyframes were found on the site, set motion.keyframes to null with a note in limitations.