Extract evidence-based style guides and motion appendices from websites or web apps. Use when Codex needs reusable visual language, semantic tokens, component/state rules, runtime animation evidence, or style references that preserve design signal while stripping product-specific structure and content.
Extract a reusable design system from web UIs: colors, typography, spacing, components, states, and, when relevant, motion (timings, keyframes, delay chains, JS-driven behavior).
Core principle:
%USERPROFILE%\\style-extractor\\.codex/skills/...)Each extraction must create a dedicated project folder:
%USERPROFILE%\style-extractor\
<project>-<style>\
guides\
style-guide.md
motion-guide.md
evidence-manifest.md
evidence\
screenshots\
assets\
notes\
Required deliverables for every extraction:
%USERPROFILE%\\style-extractor\\<project>-<style>\\guides\\style-guide.md%USERPROFILE%\\style-extractor\\<project>-<style>\\guides\\evidence-manifest.md%USERPROFILE%\\style-extractor\\<project>-<style>\\evidence\\Required when motion is meaningful:
%USERPROFILE%\\style-extractor\\<project>-<style>\\guides\\motion-guide.mdSubdirectory rules:
guides/ only for final Markdown deliverablesevidence/screenshots/ only for PNG/JPG/WebP capturesevidence/assets/ only for downloaded CSS/JS/SVG/font stylesheetsevidence/notes/ only for raw dumps, runtime notes, traces, or helper text filesUse these reference files:
references/output-contract.md — required output structure and anti-patternsreferences/style-guide-template.md — required sections for the style guidereferences/motion-guide-template.md — required sections for the motion appendixreferences/evidence-manifest-template.md — required sections for the evidence manifestreferences/9nine-visual-novel/ — best-practice style + motion reference packagereferences/motherduck-design-system-reference/ — strong static style reference packageWhat to learn from these references:
What not to copy blindly:
Before starting any extraction, read in this order:
references/output-contract.mdreferences/style-guide-template.mdreferences/motion-guide-template.mdreferences/evidence-manifest-template.mdreferences/9nine-visual-novel/guides/references/motherduck-design-system-reference/guides/Reference package selection rule:
references/9nine-visual-novel/ as the primary quality barreferences/motherduck-design-system-reference/Do not start evidence collection, screenshotting, script execution, or drafting until both reference packages have been reviewed. Extraction is incomplete if the final deliverable does not explicitly state:
Before gathering evidence, decide which source traits belong in the reusable style and which should be excluded. Use this simple filter:
Complete all of the following before Phase 1A:
references/output-contract.mdreferences/style-guide-template.mdreferences/motion-guide-template.mdreferences/evidence-manifest-template.mdreferences/9nine-visual-novel/guides/style-guide.mdreferences/9nine-visual-novel/guides/motion-guide.mdreferences/9nine-visual-novel/guides/evidence-manifest.mdreferences/motherduck-design-system-reference/guides/style-guide.mdreferences/motherduck-design-system-reference/guides/motion-guide.mdreferences/motherduck-design-system-reference/guides/evidence-manifest.mdIf both packages are not read first, the extraction is invalid.
Use Chrome MCP tools:
new_page / select_page / navigate_pagetake_screenshot (fullPage when helpful)Minimum screenshot set:
Use evaluate_script to pull:
:root and scoped)getComputedStylelist_network_requests / get_network_request to download CSS files@keyframes, CSS variables, and media queries offlineMinimum static evidence to keep in ...\\evidence\\:
evidence/screenshots/evidence/assets/evidence/notes/Static and motion are independent paths. Skip this phase if the site has no meaningful animation.
Follow these steps in priority order. Each level captures more; stop when you have enough evidence.
Paste scripts/transition-scanner.js, then call:
__seTransition.keyframes()
Returns all @keyframes definitions from stylesheets. This is deterministic and complete—no timing issues.
Same script, call:
__seTransition.scan() // scan entire page
__seTransition.scan('.my-section') // scan specific section
Returns every element's transition-property / duration / easing / delay + clusters by pattern. This shows what can animate even if nothing is animating yet.
This captures the dominant pattern on modern sites: JS sets inline style → CSS transition interpolates.
Paste scripts/interaction-diff.js, then:
// 1. Watch elements you care about
__seDiff.watch([
'[class*="sectionContainer"]',
'[class*="illustration"]',
'[class*="navItem"]',
'button, a[class*="cta"], a[class*="CTA"]'
])
// 2. Trigger interaction and capture diff
__seDiff.triggerAndCapture(
() => document.querySelector('.nav-item-2').click(),
{ captureAt: 50, settleAt: 500 }
)
Returns:
diffs — per-element before/after inline style + computed style changesduringAnimations — document.getAnimations() captured within the 50ms transition windowafterAnimations — what's still running after settleKey insight: document.getAnimations() only returns results during active CSS transitions. The capture window is typically <300ms. This script captures within that window automatically.
Repeat for 3+ key interactions (section change, component switch, hover, scroll).
Paste scripts/library-detect.js to detect third-party animation libraries.
Returns { globals, instances, dom, fingerprints, assets }.
Key: many modern sites bundle libraries as modules, so window.Swiper etc. may be undefined. The script also checks:
el.swiper — Swiper instance on DOM elements (works when bundled)[data-aos-*] — AOS attributes on elements[data-framer-*] — Framer Motion attributesWhen instances are found, configs are extracted directly (Swiper params, AOS settings, etc.).
When the above levels don't capture enough (e.g., hand-written requestAnimationFrame loops), use scripts/motion-tools.js:
__seMotion.sample('.animated-element', { durationMs: 800, include: ['transform', 'opacity'] })
Records computed style values every frame. Useful for inferring duration and property ranges, but cannot capture easing or intent.
For very complex orchestrated animations:
performance_start_trace / performance_stop_traceperformance_analyze_insightDo not write the guide as a product teardown. Convert evidence into reusable rules.
For each major finding, classify it explicitly:
Reusable: can be copied directly as a token, component rule, state rule, or motion primitiveAdapted: useful idea, but needs reshaping for the target product typeDiscarded: source-specific structure or content that should not be copiedExamples:
ReusableAdaptedDiscardedAdapted or Discarded, depending on targetDo not stop at raw values. Convert repeated values into semantic tokens:
--color-accent, --motion-300, nav.switch.iconColor)Start from the reference templates. Do not improvise the top-level structure unless the source clearly requires one.
Follow references/style-guide-template.md.
This file must answer:
Follow references/motion-guide-template.md.
This file must answer:
Follow references/evidence-manifest-template.md.
Include:
Component state matrix must include at least:
| Script | Namespace | Purpose |
|---|---|---|
scripts/transition-scanner.js | __seTransition | Scan CSS transitions + extract @keyframes |
scripts/interaction-diff.js | __seDiff | Before/after inline style diff + instant getAnimations |
scripts/motion-tools.js | __seMotion | getAnimations snapshot + rAF sampling |
scripts/library-detect.js | (returns directly) | Library detection + instance config extraction |
scripts/extract-keyframes.py | CLI | Offline @keyframes extraction from downloaded CSS files |
Do not consider the extraction complete if any of the following are true: