import StyleDictionary from "style-dictionary"; import type { Dictionary, TransformedToken } from "style-dictionary"; import * as prettier from "prettier"; import { trim } from "./utils.js"; import { colorClasses } from "./utility-class-builders/color.js"; import { gridClasses } from "./utility-class-builders/grid.js"; import { iconClasses } from "./utility-class-builders/icon.js"; import { iconSizeClasses } from "./utility-class-builders/iconSize.js"; import { spacingClasses } from "./utility-class-builders/spacing.js"; import { typeSizeClasses } from "./utility-class-builders/typeSize.js"; import { typeWeightClasses } from "./utility-class-builders/typeWeight.js"; import type { UtilityClassBuilder } from "./utility-class-builders/UtilityClassBuilder.js"; const classBuilders: UtilityClassBuilder[] = [ colorClasses, gridClasses, iconClasses, iconSizeClasses, spacingClasses, typeSizeClasses, typeWeightClasses, ]; function variableReference(varName: string, format: string): string { switch (format) { case "css": return `var(--${varName})`; case "scss": return `$${varName}`; default: throw new Error(`Unknown format: ${format}`); } } function addVariableReferences(allTokens: TransformedToken[], format: string): void { for (const token of allTokens) { token.variableReference = variableReference(token.name, format); } } function buildClasses(token: TransformedToken, dictionary: Dictionary): string { const applicableBuilder = classBuilders.find( (builder) => builder.appliesTo(token) ); if (applicableBuilder) { return trim(applicableBuilder.build(token, dictionary)); } // console.log("unhandled:", token); return ""; } ["css", "scss"].forEach((lang) => { StyleDictionary.registerFormat({ name: `${lang}/utility-classes`, formatter({ file, dictionary }) { addVariableReferences(dictionary.allTokens, lang); const builtClasses = dictionary.allTokens .map((token) => buildClasses(token, dictionary)) .join("\n"); const staticClasses = classBuilders .map((builder) => builder.staticClasses) .filter(Boolean) .join("\n"); return prettier.format(` ${StyleDictionary.formatHelpers.fileHeader({ file })} ${builtClasses} ${staticClasses} `, { parser: lang }); }, }); });