- Having individual json files for themes and core is useful for copy+pasting while exploring changes - Figma github sync requires a single json file to pull down
115 lines
2.8 KiB
TypeScript
115 lines
2.8 KiB
TypeScript
import * as fs from "fs";
|
|
import * as path from "path";
|
|
import dark from "./themes/dark";
|
|
import light from "./themes/light";
|
|
import Theme from "./themes/theme";
|
|
import { colors, fontFamilies, fontSizes, fontWeights } from "./tokens";
|
|
|
|
let themes = [
|
|
dark,
|
|
light
|
|
];
|
|
|
|
// Organize theme tokens
|
|
function themeTokens(theme: Theme) {
|
|
return {
|
|
meta: {
|
|
themeName: theme.name,
|
|
},
|
|
text: theme.textColor,
|
|
icon: theme.iconColor,
|
|
background: theme.backgroundColor,
|
|
border: theme.borderColor,
|
|
editor: theme.editor,
|
|
syntax: {
|
|
primary: {
|
|
value: theme.syntax.primary.color.value,
|
|
type: "color",
|
|
},
|
|
comment: {
|
|
value: theme.syntax.comment.color.value,
|
|
type: "color",
|
|
},
|
|
keyword: {
|
|
value: theme.syntax.keyword.color.value,
|
|
type: "color",
|
|
},
|
|
function: {
|
|
value: theme.syntax.function.color.value,
|
|
type: "color",
|
|
},
|
|
type: {
|
|
value: theme.syntax.type.color.value,
|
|
type: "color",
|
|
},
|
|
variant: {
|
|
value: theme.syntax.variant.color.value,
|
|
type: "color",
|
|
},
|
|
property: {
|
|
value: theme.syntax.property.color.value,
|
|
type: "color",
|
|
},
|
|
enum: {
|
|
value: theme.syntax.enum.color.value,
|
|
type: "color",
|
|
},
|
|
operator: {
|
|
value: theme.syntax.operator.color.value,
|
|
type: "color",
|
|
},
|
|
string: {
|
|
value: theme.syntax.string.color.value,
|
|
type: "color",
|
|
},
|
|
number: {
|
|
value: theme.syntax.number.color.value,
|
|
type: "color",
|
|
},
|
|
boolean: {
|
|
value: theme.syntax.boolean.color.value,
|
|
type: "color",
|
|
},
|
|
},
|
|
player: theme.player,
|
|
shadowAlpha: theme.shadowAlpha,
|
|
};
|
|
}
|
|
|
|
// Organize core tokens
|
|
const coreTokens = {
|
|
color: {
|
|
...colors,
|
|
},
|
|
text: {
|
|
family: fontFamilies,
|
|
weight: fontWeights,
|
|
},
|
|
size: fontSizes,
|
|
};
|
|
|
|
const combinedTokens = {
|
|
core: coreTokens,
|
|
dark: themeTokens(dark),
|
|
light: themeTokens(light)
|
|
}
|
|
|
|
// Create core.json
|
|
const corePath = path.resolve(`${__dirname}/figma/core.json`);
|
|
const coreJSON = JSON.stringify(coreTokens, null, 2);
|
|
fs.writeFileSync(corePath, coreJSON);
|
|
console.log(`- Core: core.json created`);
|
|
|
|
// Create {theme}.json
|
|
const themePath = path.resolve(`${__dirname}/figma`);
|
|
themes.forEach((theme) => {
|
|
const tokenJSON = JSON.stringify(themeTokens(theme), null, 2);
|
|
fs.writeFileSync(`${themePath}/${theme.name}.json`, tokenJSON);
|
|
console.log(`- Theme: ${theme.name}.json created`);
|
|
});
|
|
|
|
// Create combined tokens.json
|
|
const combinedPath = path.resolve(`${__dirname}/figma/tokens.json`);
|
|
const combinedJSON = JSON.stringify(combinedTokens, null, 2);
|
|
fs.writeFileSync(combinedPath, combinedJSON);
|
|
console.log(`- Combined: tokens.json created`); |