catppuccin-css/index.js

65 lines
1.9 KiB
JavaScript

const { flavors, version: versionPalette } = require('@catppuccin/palette')
const { version: versionPackage } = require('./package.json')
const fs = require('node:fs/promises');
const [PREFIX = ''] = process.argv.slice(2)
const INDENTATION = ' '
const COLOR_TYPE_HEX = 'hex'
const COLOR_TYPE_RGB = 'rgb'
const COLOR_TYPE_HSL = 'hsl'
const COLOR_TYPES = [COLOR_TYPE_HEX, COLOR_TYPE_RGB, COLOR_TYPE_HSL]
console.log('Generating ./theme CSS files from Catppuccin palette', versionPalette)
COLOR_TYPES.forEach(color_type => {
console.log('Generating color type', color_type)
for (const flavorKey in flavors) {
const { emoji, colors, name } = flavors[flavorKey]
create_theme(name, color_type, parse_theme(color_type, colors, name, emoji))
}
})
function parse_theme(color_type, colors, name, emoji) {
return `/*
Catppuccin CSS Theme v${versionPackage} ${color_type.toUpperCase()} from palette v${versionPalette}
${emoji} ${name}
*/
:root {
${cssClasses(colors, color_type)}
}`
}
async function create_theme(name, color_type, output) {
try {
await fs.writeFile(`./themes/Catppuccin-${name}.${color_type}.css`, output)
} catch (error) {
console.error(error)
}
}
function cssClasses(colors, color_type) {
const LINE_BREAK = '\n'
let result = []
for (const colorKey in colors) {
result.push(cssClass(colors[colorKey].name, colors[colorKey][color_type], color_type))
}
return result.join(LINE_BREAK)
}
function cssClass(name, color, color_type) {
name = name.toLowerCase().replace(' ', '-')
return `${INDENTATION}--${PREFIX.length > 0 ? PREFIX + '-' : ''}${name}: ${handle_color_type(color, color_type)};`
}
function handle_color_type(color, color_type) {
switch (color_type) {
case COLOR_TYPE_RGB:
const { r, g, b } = color
return `rgb(${r}, ${g}, ${b})`
case COLOR_TYPE_HSL:
const { h, s, l } = color
return `hsl(${h}, ${s}, ${l})`
}
return color
}