72 lines
2.0 KiB
Python
72 lines
2.0 KiB
Python
"""Design tokens CSS generator for VoIdeaAI.
|
|
|
|
Reads docs/design-system/tokens.json and generates:
|
|
- app/design-tokens/css/tokens.css
|
|
"""
|
|
|
|
import json
|
|
from pathlib import Path
|
|
|
|
TOKENS_PATH = Path(__file__).parent.parent.parent / "docs" / "design-system" / "tokens.json"
|
|
OUTPUT_PATH = Path(__file__).parent / "css" / "tokens.css"
|
|
|
|
|
|
def load_tokens() -> dict:
|
|
if not TOKENS_PATH.exists():
|
|
return {}
|
|
return json.loads(TOKENS_PATH.read_text(encoding="utf-8-sig"))
|
|
|
|
|
|
def generate_css(tokens: dict) -> str:
|
|
lines = [
|
|
"/* VoIdeaAI Design Tokens — auto-generated */",
|
|
"/* Source: docs/design-system/tokens.json */",
|
|
":root {",
|
|
]
|
|
|
|
for category, values in tokens.items():
|
|
if not isinstance(values, dict):
|
|
continue
|
|
for key, value in values.items():
|
|
if key == "$schema":
|
|
continue
|
|
if isinstance(value, dict):
|
|
for mode, val in value.items():
|
|
if mode == "light":
|
|
lines.append(f" --{category}-{key}: {val};")
|
|
elif isinstance(value, (str, int, float)):
|
|
lines.append(f" --{category}-{key}: {value};")
|
|
|
|
lines.append("}")
|
|
lines.append("")
|
|
lines.append(".dark {")
|
|
for category, values in tokens.items():
|
|
if not isinstance(values, dict):
|
|
continue
|
|
for key, value in values.items():
|
|
if key == "$schema":
|
|
continue
|
|
if isinstance(value, dict):
|
|
for mode, val in value.items():
|
|
if mode == "dark":
|
|
lines.append(f" --{category}-{key}: {val};")
|
|
lines.append("}")
|
|
|
|
return "\n".join(lines)
|
|
|
|
|
|
def main():
|
|
tokens = load_tokens()
|
|
if not tokens:
|
|
print("tokens.json not found, skipping")
|
|
return
|
|
|
|
OUTPUT_PATH.parent.mkdir(parents=True, exist_ok=True)
|
|
css = generate_css(tokens)
|
|
OUTPUT_PATH.write_text(css, encoding="utf-8")
|
|
print(f"Generated {OUTPUT_PATH} ({len(css)} bytes)")
|
|
|
|
|
|
if __name__ == "__main__":
|
|
main()
|