From aradotso-trending-skills-37
Extracts design tokens like typography, colors, spacing, border radius, and shadows from any website via Chrome extension and generates DESIGN.md or SKILL.md files for AI coding agents.
npx claudepluginhub joshuarweaver/cascade-ai-ml-agents-misc-1 --plugin aradotso-trending-skills-37This skill uses the workspace's default tool permissions.
```markdown
Guides Next.js Cache Components and Partial Prerendering (PPR) with cacheComponents enabled. Implements 'use cache', cacheLife(), cacheTag(), revalidateTag(), static/dynamic optimization, and cache debugging.
Guides building MCP servers enabling LLMs to interact with external services via tools. Covers best practices, TypeScript/Node (MCP SDK), Python (FastMCP).
Generates original PNG/PDF visual art via design philosophy manifestos for posters, graphics, and static designs on user request.
---
name: design-md-chrome-extractor
description: Chrome extension that extracts design tokens from any website and generates DESIGN.md or SKILL.md files for use with AI coding agents
triggers:
- extract design system from website
- generate DESIGN.md from site styles
- create design skill for AI agent
- extract colors and typography from webpage
- generate SKILL.md design file
- build design system documentation from URL
- capture website design tokens
- create TypeUI design blueprint
---
# TypeUI DESIGN.md Extractor (Chrome Extension)
> Skill by [ara.so](https://ara.so) — Daily 2026 Skills collection.
A Chrome extension that reads visual styles from any live website — typography, colors, spacing, border radius, shadows, and motion — and generates structured `DESIGN.md` or `SKILL.md` files compatible with AI coding agents like Claude Code, Cursor, Codex, and Google Stitch.
---
## What It Does
- **Auto-extracts** computed CSS styles from any active browser tab
- **Generates `DESIGN.md`** — a human-readable design system documentation file
- **Generates `SKILL.md`** — an agent-ready skill file for AI coding assistants
- Follows the open-source [TypeUI DESIGN.md](https://www.typeui.sh/design-skills) format
- Outputs downloadable markdown files for immediate use in AI workflows
---
## Installation (Developer / Load Unpacked)
```bash
# 1. Clone the repository
git clone https://github.com/bergside/design-md-chrome.git
cd design-md-chrome
# 2. Open Chrome and navigate to extensions
# chrome://extensions
# 3. Enable Developer Mode (toggle top-right)
# 4. Click "Load unpacked" and select the project folder
After loading:
design-md-chrome/
├── manifest.json # Chrome extension manifest (MV3)
├── popup.html # Extension popup UI
├── popup.js # Popup logic, UI interactions, file download
├── content.js # Content script — injected into active tab to extract styles
├── background.js # Service worker for Chrome extension messaging
├── generator.js # DESIGN.md / SKILL.md markdown generation logic
├── tests/
│ └── run-tests.mjs # Node.js test runner
└── README.md
The content script (content.js) is injected into the active tab and uses getComputedStyle to sample elements across the DOM, collecting:
| Token Category | What Gets Extracted |
|---|---|
| Typography | Font families, sizes, weights, line heights, letter spacing |
| Colors | Background, text, border, and accent colors (deduped) |
| Spacing | Margin/padding values across key elements |
| Border Radius | Extracted from buttons, cards, inputs |
| Shadows | box-shadow values from elevated elements |
| Motion | transition and animation properties |
// content.js — core extraction logic pattern
function extractDesignTokens() {
const elements = document.querySelectorAll(
'h1, h2, h3, p, a, button, input, [class*="card"], [class*="container"]'
);
const tokens = {
typography: new Set(),
colors: new Set(),
spacing: new Set(),
borderRadius: new Set(),
shadows: new Set(),
motion: new Set(),
};
elements.forEach((el) => {
const styles = window.getComputedStyle(el);
// Typography
tokens.typography.add({
fontFamily: styles.fontFamily,
fontSize: styles.fontSize,
fontWeight: styles.fontWeight,
lineHeight: styles.lineHeight,
letterSpacing: styles.letterSpacing,
});
// Colors
tokens.colors.add(styles.color);
tokens.colors.add(styles.backgroundColor);
tokens.colors.add(styles.borderColor);
// Spacing
tokens.spacing.add(styles.padding);
tokens.spacing.add(styles.margin);
// Radius
tokens.borderRadius.add(styles.borderRadius);
// Shadows
if (styles.boxShadow !== 'none') {
tokens.shadows.add(styles.boxShadow);
}
// Motion
if (styles.transition !== 'all 0s ease 0s') {
tokens.motion.add(styles.transition);
}
});
return {
typography: [...tokens.typography],
colors: [...tokens.colors].filter(Boolean),
spacing: [...tokens.spacing].filter(Boolean),
borderRadius: [...tokens.borderRadius].filter(Boolean),
shadows: [...tokens.shadows],
motion: [...tokens.motion],
url: window.location.href,
title: document.title,
};
}
// Send extracted tokens back to popup via Chrome messaging
chrome.runtime.onMessage.addListener((request, sender, sendResponse) => {
if (request.action === 'extractStyles') {
sendResponse(extractDesignTokens());
}
});
// popup.js — trigger content script and receive tokens
async function runExtraction() {
const [tab] = await chrome.tabs.query({ active: true, currentWindow: true });
// Inject content script if not already present
await chrome.scripting.executeScript({
target: { tabId: tab.id },
files: ['content.js'],
});
// Request extraction
chrome.tabs.sendMessage(tab.id, { action: 'extractStyles' }, (tokens) => {
if (chrome.runtime.lastError) {
console.error('Extraction failed:', chrome.runtime.lastError.message);
return;
}
displayTokens(tokens);
window.__extractedTokens = tokens; // store for generation
});
}
document.getElementById('btn-extract').addEventListener('click', runExtraction);
// generator.js — generate DESIGN.md from extracted tokens
function generateDesignMd(tokens) {
const { url, title, typography, colors, spacing, borderRadius, shadows, motion } = tokens;
return `# DESIGN.md — ${title}
## Mission
Define a consistent, accessible design system for ${title} (${url}).
## Brand
- **Product**: ${title}
- **URL**: ${url}
- **Audience**: Web users
- **Surface**: Web application
## Style Foundations
### Typography
${typography.map(t => `- Font: ${t.fontFamily}, Size: ${t.fontSize}, Weight: ${t.fontWeight}`).join('\n')}
### Colors
${colors.slice(0, 20).map(c => `- \`${c}\``).join('\n')}
### Spacing
${[...new Set(spacing)].slice(0, 10).map(s => `- ${s}`).join('\n')}
### Border Radius
${[...new Set(borderRadius)].slice(0, 8).map(r => `- ${r}`).join('\n')}
### Shadows
${shadows.slice(0, 6).map(s => `- ${s}`).join('\n')}
### Motion
${motion.slice(0, 6).map(m => `- ${m}`).join('\n')}
## Accessibility
- Follow WCAG 2.2 AA standards
- Minimum contrast ratio: 4.5:1 for text, 3:1 for UI components
- All interactive elements must have visible focus states
- Support keyboard navigation throughout
## Writing Tone
- Implementation-ready and precise
- Avoid ambiguity in component descriptions
- Use design token references over raw values
## Rules: Do
- Use extracted color tokens consistently
- Apply spacing scale from extracted values
- Maintain border radius consistency per component type
- Use motion values for transitions
## Rules: Don't
- Do not introduce new colors outside the extracted palette
- Do not use arbitrary spacing values
- Do not remove focus indicators
- Do not use motion that violates prefers-reduced-motion
## Quality Gates
- [ ] All colors reference extracted tokens
- [ ] Typography scale applied consistently
- [ ] WCAG AA contrast validated
- [ ] Keyboard navigation verified
`;
}
// generator.js — generate agent-ready SKILL.md
function generateSkillMd(tokens) {
const { url, title } = tokens;
return `---
name: ${title.toLowerCase().replace(/\s+/g, '-')}-design-system
description: Design system skill extracted from ${title} (${url})
triggers:
- implement ${title} design
- use ${title} styles
- apply ${title} design system
- build UI matching ${title}
---
# ${title} Design System Skill
Extracted design system from ${url}.
## Style Foundations
[...generated token documentation...]
## Component Patterns
[...inferred patterns from extracted styles...]
`;
}
// popup.js — download as .md file
function downloadMarkdown(content, filename) {
const blob = new Blob([content], { type: 'text/markdown' });
const url = URL.createObjectURL(blob);
const a = document.createElement('a');
a.href = url;
a.download = filename;
a.click();
URL.revokeObjectURL(url);
}
// Usage
document.getElementById('btn-download-design').addEventListener('click', () => {
const tokens = window.__extractedTokens;
const content = generateDesignMd(tokens);
downloadMarkdown(content, 'DESIGN.md');
});
document.getElementById('btn-download-skill').addEventListener('click', () => {
const tokens = window.__extractedTokens;
const content = generateSkillMd(tokens);
downloadMarkdown(content, 'SKILL.md');
});
# Place DESIGN.md in your project root
cp ~/Downloads/DESIGN.md ./DESIGN.md
# Reference in CLAUDE.md
echo "Follow the design system defined in DESIGN.md" >> CLAUDE.md
# Add to .cursorrules
Follow the design system documented in DESIGN.md for all UI implementations.
# Pass as context file
codex --context DESIGN.md "build a login page"
Upload DESIGN.md as a project reference document in the Stitch workspace.
# Run the test suite locally (Node.js required)
node tests/run-tests.mjs
// tests/run-tests.mjs
import { generateDesignMd, generateSkillMd } from '../generator.js';
const mockTokens = {
url: 'https://example.com',
title: 'Example Site',
typography: [
{ fontFamily: 'Inter, sans-serif', fontSize: '16px', fontWeight: '400', lineHeight: '1.5', letterSpacing: '0px' }
],
colors: ['rgb(0, 0, 0)', 'rgb(255, 255, 255)', 'rgb(59, 130, 246)'],
spacing: ['16px', '24px', '32px'],
borderRadius: ['4px', '8px', '9999px'],
shadows: ['0 1px 3px rgba(0,0,0,0.1)'],
motion: ['all 0.2s ease'],
};
// Test DESIGN.md generation
const designMd = generateDesignMd(mockTokens);
console.assert(designMd.includes('## Mission'), 'Missing Mission section');
console.assert(designMd.includes('Inter, sans-serif'), 'Missing font family');
console.assert(designMd.includes('WCAG'), 'Missing accessibility section');
console.log('✅ DESIGN.md generation tests passed');
// Test SKILL.md generation
const skillMd = generateSkillMd(mockTokens);
console.assert(skillMd.includes('---'), 'Missing YAML frontmatter');
console.assert(skillMd.includes('triggers:'), 'Missing triggers');
console.log('✅ SKILL.md generation tests passed');
{
"manifest_version": 3,
"name": "TypeUI DESIGN.md Extractor",
"version": "1.0.0",
"description": "Extract design tokens from any website and generate DESIGN.md / SKILL.md",
"permissions": [
"activeTab",
"scripting",
"downloads"
],
"action": {
"default_popup": "popup.html",
"default_icon": "icon.png"
},
"background": {
"service_worker": "background.js"
},
"content_scripts": [],
"host_permissions": [
"<all_urls>"
]
}
Note:
"content_scripts"is intentionally empty — scripts are injected programmatically viachrome.scripting.executeScriptfor on-demand extraction only.
| Button | Action |
|---|---|
| Auto-extract | Injects content script and collects computed styles |
| Generate DESIGN.md | Produces design system documentation from tokens |
| Generate SKILL.md | Produces agent-ready skill file from tokens |
| Refresh | Re-runs extraction for current page state |
| Download | Saves the generated file locally |
| ? (Explain) | Shows how the file was generated with TypeUI reference |
Problem: Extension shows no data after clicking extract
Fix: Refresh the page, then re-click extract. Some SPAs need full load.
// Check if content script is reachable
chrome.tabs.sendMessage(tabId, { action: 'ping' }, (response) => {
if (chrome.runtime.lastError) {
// Re-inject the content script
chrome.scripting.executeScript({
target: { tabId },
files: ['content.js'],
});
}
});
Problem: Extension cannot inject scripts on chrome://, file://, or CSP-restricted pages
Fix: Navigate to a public HTTP/HTTPS website. Extension requires scripting access.
Problem: Colors list is empty or shows only defaults
Fix: Scroll through the page before extracting — lazy-loaded components need to render first.
Problem: Download button clicks but no file appears
Fix: Check Chrome's download settings. Ensure the "downloads" permission is in manifest.json.
# Ensure you're using Node.js 18+ for ESM support
node --version # should be v18+
# Run with explicit ESM flag if needed
node --experimental-vm-modules tests/run-tests.mjs
Browse pre-extracted design systems at typeui.sh/design-skills — ready-to-use SKILL.md files for popular products and design systems.
MIT — open source, free to use and modify.