Skip to content

Commit

Permalink
feat: Add SCSS exports
Browse files Browse the repository at this point in the history
  • Loading branch information
kevintyj committed Dec 10, 2023
1 parent 3957278 commit 5cfdeb6
Show file tree
Hide file tree
Showing 8 changed files with 101 additions and 2 deletions.
2 changes: 1 addition & 1 deletion .changeset/curvy-mayflies-suffer.md
Expand Up @@ -2,4 +2,4 @@
"@kevintyj/color": minor
---

Generate CSS variable files
Generate CSS exports
5 changes: 5 additions & 0 deletions .changeset/green-books-jump.md
@@ -0,0 +1,5 @@
---
"@kevintyj/color": minor
---

Generate SCSS exports
5 changes: 5 additions & 0 deletions .changeset/tough-hornets-build.md
@@ -0,0 +1,5 @@
---
"@kevintyj/color": patch
---

Add BaseColors (white/black) to colorset
1 change: 1 addition & 0 deletions .gitignore
@@ -1,6 +1,7 @@
# dist
/dist
/css
/scss

# dependencies
/node_modules
Expand Down
1 change: 1 addition & 0 deletions package.json
Expand Up @@ -29,6 +29,7 @@
"watch": "tsup --watch",
"build": "tsup",
"build:css": "node --loader ts-node/esm scripts/generateCSS.ts",
"build:scss": "node --loader ts-node/esm scripts/generateSCSS.ts",
"prepare": "husky install",
"lint:es": "eslint .",
"clean": "git clean -fdX",
Expand Down
2 changes: 1 addition & 1 deletion scripts/generateCSS.ts
Expand Up @@ -69,7 +69,7 @@ const run = () => {
rootCSSBuilder('dark');
baseColorCSSBuilder();
writeFile(
'css',
OUT_DIR,
'colors.css',
`/* @kevintyj/color/css */
@import "./light.css";
Expand Down
83 changes: 83 additions & 0 deletions scripts/generateSCSS.ts
@@ -0,0 +1,83 @@
/// <reference path="../types/color.d.ts" />
import * as fs from 'node:fs';
import * as lightColors from '../src/light';
import * as darkColors from '../src/dark';
import { BaseBackground, BaseColors } from '../src';
import { camelToKebabCase, writeFile } from './utils';

const OUT_DIR = './scss';
const colorVariableBuilder = (colorScale: ColorScale<HexColor>, colorName: string) => {
const variableEntries: string[] = [];

const colorScaleName = camelToKebabCase(colorName);

Object.entries(colorScale)
.forEach(([colorScaleID, colorScaleValue]) => {
variableEntries.push(
`$${colorScaleName}-${colorScaleID}: ${colorScaleValue};`,
);
});

return variableEntries;
};
const CSSVarBuilder = (colorType: 'light' | 'dark') => {
const colorScale = colorType === 'light'
? lightColors
: darkColors;

Object.entries(colorScale).forEach(([colorName, colorScale]) => {
const cssVariableEntries: string[] = colorVariableBuilder(colorScale, colorName);
const comment = `// ${colorName.toUpperCase()} Color Variables`;
const cssVariableString = `${comment}\n${cssVariableEntries.join('\n')}\n`;
writeFile(OUT_DIR, `_${colorName}.scss`, cssVariableString);
});
};

const baseColorCSSBuilder = () => {
const baseColorEntries: string[] = [];

Object.entries(BaseColors).forEach(([colorName, colorValue]) => {
baseColorEntries.push(`$${camelToKebabCase(colorName)}: ${colorValue};`);
});

const COMMENT = `// BASE Color Variables`;

const baseColorString = `${COMMENT} \n${baseColorEntries.join('\n')}\n`;
const baseLightBackground = `$background: ${BaseBackground.light};\n`;
const baseDarkBackground = `$background-dark: ${BaseBackground.dark};\n`;

writeFile(OUT_DIR, 'base.scss', `${baseColorString}\n${baseLightBackground}\n${baseDarkBackground}`);
};

const rootCSSBuilder = (colorType: 'light' | 'dark') => {
const colorScale = colorType === 'light' ? lightColors : darkColors;
const cssImports: string[] = [];
Object.keys(colorScale).forEach((colorName) => {
cssImports.push(`@import './${colorName}';`);
});
writeFile(OUT_DIR, `${colorType}.scss`, cssImports.join('\n'));
};

const run = () => {
fs.mkdir(OUT_DIR, (err) => {
if (err) {
if (err.code !== 'EEXIST')
console.error(err);
}
});
CSSVarBuilder('light');
CSSVarBuilder('dark');
rootCSSBuilder('light');
rootCSSBuilder('dark');
baseColorCSSBuilder();
writeFile(
OUT_DIR,
'colors.scss',
`/* @kevintyj/color/scss */
@import "./light";
@import "./dark";
@import "./base";`,
);
};

run();
4 changes: 4 additions & 0 deletions scripts/utils.ts
Expand Up @@ -28,3 +28,7 @@ export const writeFile = (

exportFileContents();
};

export const camelToKebabCase = (str: string): string => {
return str.replace(/([a-z])([A-Z])/g, '$1-$2').toLowerCase();
};

0 comments on commit 5cfdeb6

Please sign in to comment.