mirror of
https://github.com/catlog22/Claude-Code-Workflow.git
synced 2026-02-05 01:50:27 +08:00
- Simplified UI design command workflows (batch-generate, explore-auto, generate, update) - Enhanced style-extract and layout-extract with improved documentation - Refactored imitate-auto for better usability - Removed obsolete consolidate workflow - Added extract-computed-styles.js and extract-layout-structure.js utilities - Updated UI generation and instantiation scripts 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
119 lines
3.5 KiB
JavaScript
119 lines
3.5 KiB
JavaScript
/**
|
|
* Extract Computed Styles from DOM
|
|
*
|
|
* This script extracts real CSS computed styles from a webpage's DOM
|
|
* to provide accurate design tokens for UI replication.
|
|
*
|
|
* Usage: Execute this function via Chrome DevTools evaluate_script
|
|
*/
|
|
|
|
(() => {
|
|
/**
|
|
* Extract unique values from a set and sort them
|
|
*/
|
|
const uniqueSorted = (set) => {
|
|
return Array.from(set)
|
|
.filter(v => v && v !== 'none' && v !== '0px' && v !== 'rgba(0, 0, 0, 0)')
|
|
.sort();
|
|
};
|
|
|
|
/**
|
|
* Parse rgb/rgba to OKLCH format (placeholder - returns original for now)
|
|
*/
|
|
const toOKLCH = (color) => {
|
|
// TODO: Implement actual RGB to OKLCH conversion
|
|
// For now, return the original color with a note
|
|
return `${color} /* TODO: Convert to OKLCH */`;
|
|
};
|
|
|
|
/**
|
|
* Extract only key styles from an element
|
|
*/
|
|
const extractKeyStyles = (element) => {
|
|
const s = window.getComputedStyle(element);
|
|
return {
|
|
color: s.color,
|
|
bg: s.backgroundColor,
|
|
borderRadius: s.borderRadius,
|
|
boxShadow: s.boxShadow,
|
|
fontSize: s.fontSize,
|
|
fontWeight: s.fontWeight,
|
|
padding: s.padding,
|
|
margin: s.margin
|
|
};
|
|
};
|
|
|
|
/**
|
|
* Main extraction function - extract all critical design tokens
|
|
*/
|
|
const extractDesignTokens = () => {
|
|
// Include all key UI elements
|
|
const selectors = [
|
|
'button', '.btn', '[role="button"]',
|
|
'input', 'textarea', 'select',
|
|
'h1', 'h2', 'h3', 'h4', 'h5', 'h6',
|
|
'.card', 'article', 'section',
|
|
'a', 'p', 'nav', 'header', 'footer'
|
|
];
|
|
|
|
// Collect all design tokens
|
|
const tokens = {
|
|
colors: new Set(),
|
|
borderRadii: new Set(),
|
|
shadows: new Set(),
|
|
fontSizes: new Set(),
|
|
fontWeights: new Set(),
|
|
spacing: new Set()
|
|
};
|
|
|
|
// Extract from all elements
|
|
selectors.forEach(selector => {
|
|
try {
|
|
const elements = document.querySelectorAll(selector);
|
|
elements.forEach(element => {
|
|
const s = extractKeyStyles(element);
|
|
|
|
// Collect all tokens (no limits)
|
|
if (s.color && s.color !== 'rgba(0, 0, 0, 0)') tokens.colors.add(s.color);
|
|
if (s.bg && s.bg !== 'rgba(0, 0, 0, 0)') tokens.colors.add(s.bg);
|
|
if (s.borderRadius && s.borderRadius !== '0px') tokens.borderRadii.add(s.borderRadius);
|
|
if (s.boxShadow && s.boxShadow !== 'none') tokens.shadows.add(s.boxShadow);
|
|
if (s.fontSize) tokens.fontSizes.add(s.fontSize);
|
|
if (s.fontWeight) tokens.fontWeights.add(s.fontWeight);
|
|
|
|
// Extract all spacing values
|
|
[s.padding, s.margin].forEach(val => {
|
|
if (val && val !== '0px') {
|
|
val.split(' ').forEach(v => {
|
|
if (v && v !== '0px') tokens.spacing.add(v);
|
|
});
|
|
}
|
|
});
|
|
});
|
|
} catch (e) {
|
|
console.warn(`Error: ${selector}`, e);
|
|
}
|
|
});
|
|
|
|
// Return all tokens (no element details to save context)
|
|
return {
|
|
metadata: {
|
|
extractedAt: new Date().toISOString(),
|
|
url: window.location.href,
|
|
method: 'computed-styles'
|
|
},
|
|
tokens: {
|
|
colors: uniqueSorted(tokens.colors),
|
|
borderRadii: uniqueSorted(tokens.borderRadii), // ALL radius values
|
|
shadows: uniqueSorted(tokens.shadows), // ALL shadows
|
|
fontSizes: uniqueSorted(tokens.fontSizes),
|
|
fontWeights: uniqueSorted(tokens.fontWeights),
|
|
spacing: uniqueSorted(tokens.spacing)
|
|
}
|
|
};
|
|
};
|
|
|
|
// Execute and return results
|
|
return extractDesignTokens();
|
|
})();
|