Spaces:
Sleeping
Sleeping
| import json | |
| class TokenCodeGenerator: | |
| def generate_css_variables(self, tokens): | |
| """Generate CSS custom properties""" | |
| css = ":root {\n" | |
| # Colors | |
| for name, color in tokens.get('colors', {}).items(): | |
| css += f" --color-{name}: {color['hex']};\n" | |
| css += f" --color-{name}-rgb: {color['rgb']};\n" | |
| css += "\n" | |
| # Spacing | |
| for name, value in tokens.get('spacing', {}).items(): | |
| css += f" --spacing-{name}: {value};\n" | |
| css += "\n" | |
| # Typography | |
| if 'typography' in tokens: | |
| for name, props in tokens['typography'].items(): | |
| css += f" --font-{name}: {props.get('family', 'sans-serif')};\n" | |
| css += f" --font-size-{name}: {props.get('size', '16px')};\n" | |
| css += f" --font-weight-{name}: {props.get('weight', '400')};\n" | |
| css += "}\n\n" | |
| # Add example usage comments | |
| css += "/* Example usage:\n" | |
| css += " * color: var(--color-primary);\n" | |
| css += " * padding: var(--spacing-medium);\n" | |
| css += " * font-family: var(--font-body);\n" | |
| css += " */\n" | |
| return css | |
| def generate_tailwind_config(self, tokens): | |
| """Generate Tailwind configuration""" | |
| config = { | |
| "theme": { | |
| "extend": { | |
| "colors": {}, | |
| "spacing": {}, | |
| "fontFamily": {}, | |
| "fontSize": {}, | |
| "fontWeight": {} | |
| } | |
| } | |
| } | |
| # Add colors | |
| for name, color in tokens.get('colors', {}).items(): | |
| config["theme"]["extend"]["colors"][name] = color['hex'] | |
| # Add spacing | |
| for name, value in tokens.get('spacing', {}).items(): | |
| config["theme"]["extend"]["spacing"][name] = value | |
| # Add typography | |
| if 'typography' in tokens: | |
| for name, props in tokens['typography'].items(): | |
| if 'family' in props: | |
| config["theme"]["extend"]["fontFamily"][name] = props['family'] | |
| if 'size' in props: | |
| config["theme"]["extend"]["fontSize"][name] = props['size'] | |
| if 'weight' in props: | |
| config["theme"]["extend"]["fontWeight"][name] = props['weight'] | |
| # Format as JavaScript module | |
| output = "/** @type {import('tailwindcss').Config} */\n" | |
| output += f"module.exports = {json.dumps(config, indent=2)}" | |
| return output | |
| def generate_json_tokens(self, tokens): | |
| """Generate W3C Design Token Community Group format""" | |
| formatted_tokens = { | |
| "$schema": "https://design-tokens.github.io/community-group/format.json", | |
| "tokens": {} | |
| } | |
| # Colors | |
| if 'colors' in tokens: | |
| formatted_tokens["tokens"]["color"] = {} | |
| for name, color in tokens['colors'].items(): | |
| formatted_tokens["tokens"]["color"][name] = { | |
| "$value": color['hex'], | |
| "$type": "color", | |
| "$description": f"Color {name} - {color.get('proportion', 0)*100:.1f}% of design" | |
| } | |
| # Spacing | |
| if 'spacing' in tokens: | |
| formatted_tokens["tokens"]["spacing"] = {} | |
| for name, value in tokens['spacing'].items(): | |
| formatted_tokens["tokens"]["spacing"][name] = { | |
| "$value": value, | |
| "$type": "dimension" | |
| } | |
| # Typography | |
| if 'typography' in tokens: | |
| formatted_tokens["tokens"]["typography"] = {} | |
| for name, props in tokens['typography'].items(): | |
| formatted_tokens["tokens"]["typography"][name] = { | |
| "fontFamily": { | |
| "$value": props.get('family', 'sans-serif'), | |
| "$type": "fontFamily" | |
| }, | |
| "fontSize": { | |
| "$value": props.get('size', '16px'), | |
| "$type": "dimension" | |
| }, | |
| "fontWeight": { | |
| "$value": props.get('weight', '400'), | |
| "$type": "fontWeight" | |
| } | |
| } | |
| return json.dumps(formatted_tokens, indent=2) | |
| def generate_style_dictionary(self, tokens): | |
| """Generate Style Dictionary format tokens""" | |
| sd_tokens = { | |
| "color": {}, | |
| "spacing": {}, | |
| "typography": {} | |
| } | |
| # Transform colors | |
| for name, color in tokens.get('colors', {}).items(): | |
| sd_tokens["color"][name] = { | |
| "value": color['hex'], | |
| "type": "color", | |
| "attributes": { | |
| "rgb": color.get('rgb', ''), | |
| "proportion": color.get('proportion', 0) | |
| } | |
| } | |
| # Transform spacing | |
| for name, value in tokens.get('spacing', {}).items(): | |
| sd_tokens["spacing"][name] = { | |
| "value": value, | |
| "type": "spacing" | |
| } | |
| # Transform typography | |
| if 'typography' in tokens: | |
| for name, props in tokens['typography'].items(): | |
| sd_tokens["typography"][name] = { | |
| "fontFamily": { | |
| "value": props.get('family', 'sans-serif') | |
| }, | |
| "fontSize": { | |
| "value": props.get('size', '16px') | |
| }, | |
| "fontWeight": { | |
| "value": props.get('weight', '400') | |
| } | |
| } | |
| return json.dumps(sd_tokens, indent=2) | |
| def generate_scss_variables(self, tokens): | |
| """Generate SCSS variables""" | |
| scss = "// Design Tokens - SCSS Variables\n\n" | |
| # Colors | |
| scss += "// Colors\n" | |
| for name, color in tokens.get('colors', {}).items(): | |
| scss += f"$color-{name}: {color['hex']};\n" | |
| scss += "\n// Spacing\n" | |
| for name, value in tokens.get('spacing', {}).items(): | |
| scss += f"$spacing-{name}: {value};\n" | |
| scss += "\n// Typography\n" | |
| if 'typography' in tokens: | |
| for name, props in tokens['typography'].items(): | |
| scss += f"$font-{name}: {props.get('family', 'sans-serif')};\n" | |
| scss += f"$font-size-{name}: {props.get('size', '16px')};\n" | |
| scss += f"$font-weight-{name}: {props.get('weight', '400')};\n" | |
| scss += "\n" | |
| # Add mixins for common patterns | |
| scss += "\n// Utility Mixins\n" | |
| scss += "@mixin text-style($style) {\n" | |
| scss += " @if $style == 'heading' {\n" | |
| scss += " font-family: $font-heading;\n" | |
| scss += " font-size: $font-size-heading;\n" | |
| scss += " font-weight: $font-weight-heading;\n" | |
| scss += " } @else if $style == 'body' {\n" | |
| scss += " font-family: $font-body;\n" | |
| scss += " font-size: $font-size-body;\n" | |
| scss += " font-weight: $font-weight-body;\n" | |
| scss += " }\n" | |
| scss += "}\n" | |
| return scss |