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 |