@nexim/tailwind-material-colors
Version:
A Tailwind CSS plugin to automatically generate and apply Material Design 3 color palettes.
224 lines (219 loc) • 12.2 kB
JavaScript
/* @nexim/tailwind-material-colors v1.0.0 */
;
var __create = Object.create;
var __defProp = Object.defineProperty;
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
var __getOwnPropNames = Object.getOwnPropertyNames;
var __getProtoOf = Object.getPrototypeOf;
var __hasOwnProp = Object.prototype.hasOwnProperty;
var __export = (target, all) => {
for (var name in all)
__defProp(target, name, { get: all[name], enumerable: true });
};
var __copyProps = (to, from, except, desc) => {
if (from && typeof from === "object" || typeof from === "function") {
for (let key of __getOwnPropNames(from))
if (!__hasOwnProp.call(to, key) && key !== except)
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
}
return to;
};
var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
// If the importer is in node compatibility mode or this is not an ESM
// file that has been converted to a CommonJS file using a Babel-
// compatible transform (i.e. "__esModule" has not been set), then set
// "default" to the CommonJS "module.exports" for node compatibility.
isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
mod
));
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
// src/main.ts
var main_exports = {};
__export(main_exports, {
materialThemeBuilder: () => materialThemeBuilder,
materialThemeBuilderTailwindPlugin: () => materialThemeBuilderTailwindPlugin
});
module.exports = __toCommonJS(main_exports);
var import_package_tracer = require("@alwatr/package-tracer");
var import_material_color_utilities3 = require("@material/material-color-utilities");
var import_change_case = require("change-case");
var import_plugin = __toESM(require("tailwindcss/plugin"), 1);
// src/lib/constants.ts
var import_material_color_utilities = require("@material/material-color-utilities");
var SchemeObjects = {
content: import_material_color_utilities.SchemeContent,
expressive: import_material_color_utilities.SchemeExpressive,
fidelity: import_material_color_utilities.SchemeFidelity,
monochrome: import_material_color_utilities.SchemeMonochrome,
neutral: import_material_color_utilities.SchemeNeutral,
tonalSpot: import_material_color_utilities.SchemeTonalSpot,
vibrant: import_material_color_utilities.SchemeVibrant,
rainbow: import_material_color_utilities.SchemeRainbow,
fruitsalad: import_material_color_utilities.SchemeFruitSalad
};
var AllMaterialDynamicColors = {
background: import_material_color_utilities.MaterialDynamicColors.background,
onBackground: import_material_color_utilities.MaterialDynamicColors.onBackground,
surface: import_material_color_utilities.MaterialDynamicColors.surface,
surfaceDim: import_material_color_utilities.MaterialDynamicColors.surfaceDim,
surfaceBright: import_material_color_utilities.MaterialDynamicColors.surfaceBright,
surfaceContainerLowest: import_material_color_utilities.MaterialDynamicColors.surfaceContainerLowest,
surfaceContainerLow: import_material_color_utilities.MaterialDynamicColors.surfaceContainerLow,
surfaceContainer: import_material_color_utilities.MaterialDynamicColors.surfaceContainer,
surfaceContainerHigh: import_material_color_utilities.MaterialDynamicColors.surfaceContainerHigh,
surfaceContainerHighest: import_material_color_utilities.MaterialDynamicColors.surfaceContainerHighest,
onSurface: import_material_color_utilities.MaterialDynamicColors.onSurface,
surfaceVariant: import_material_color_utilities.MaterialDynamicColors.surfaceVariant,
onSurfaceVariant: import_material_color_utilities.MaterialDynamicColors.onSurfaceVariant,
inverseSurface: import_material_color_utilities.MaterialDynamicColors.inverseSurface,
inverseOnSurface: import_material_color_utilities.MaterialDynamicColors.inverseOnSurface,
outline: import_material_color_utilities.MaterialDynamicColors.outline,
outlineVariant: import_material_color_utilities.MaterialDynamicColors.outlineVariant,
shadow: import_material_color_utilities.MaterialDynamicColors.shadow,
scrim: import_material_color_utilities.MaterialDynamicColors.scrim,
surfaceTint: import_material_color_utilities.MaterialDynamicColors.surfaceTint,
primary: import_material_color_utilities.MaterialDynamicColors.primary,
onPrimary: import_material_color_utilities.MaterialDynamicColors.onPrimary,
primaryContainer: import_material_color_utilities.MaterialDynamicColors.primaryContainer,
onPrimaryContainer: import_material_color_utilities.MaterialDynamicColors.onPrimaryContainer,
inversePrimary: import_material_color_utilities.MaterialDynamicColors.inversePrimary,
secondary: import_material_color_utilities.MaterialDynamicColors.secondary,
onSecondary: import_material_color_utilities.MaterialDynamicColors.onSecondary,
secondaryContainer: import_material_color_utilities.MaterialDynamicColors.secondaryContainer,
onSecondaryContainer: import_material_color_utilities.MaterialDynamicColors.onSecondaryContainer,
tertiary: import_material_color_utilities.MaterialDynamicColors.tertiary,
onTertiary: import_material_color_utilities.MaterialDynamicColors.onTertiary,
tertiaryContainer: import_material_color_utilities.MaterialDynamicColors.tertiaryContainer,
onTertiaryContainer: import_material_color_utilities.MaterialDynamicColors.onTertiaryContainer,
error: import_material_color_utilities.MaterialDynamicColors.error,
onError: import_material_color_utilities.MaterialDynamicColors.onError,
errorContainer: import_material_color_utilities.MaterialDynamicColors.errorContainer,
onErrorContainer: import_material_color_utilities.MaterialDynamicColors.onErrorContainer,
primaryFixed: import_material_color_utilities.MaterialDynamicColors.primaryFixed,
primaryFixedDim: import_material_color_utilities.MaterialDynamicColors.primaryFixedDim,
onPrimaryFixed: import_material_color_utilities.MaterialDynamicColors.onPrimaryFixed,
onPrimaryFixedVariant: import_material_color_utilities.MaterialDynamicColors.onPrimaryFixedVariant,
secondaryFixed: import_material_color_utilities.MaterialDynamicColors.secondaryFixed,
secondaryFixedDim: import_material_color_utilities.MaterialDynamicColors.secondaryFixedDim,
onSecondaryFixed: import_material_color_utilities.MaterialDynamicColors.onSecondaryFixed,
onSecondaryFixedVariant: import_material_color_utilities.MaterialDynamicColors.onSecondaryFixedVariant,
tertiaryFixed: import_material_color_utilities.MaterialDynamicColors.tertiaryFixed,
tertiaryFixedDim: import_material_color_utilities.MaterialDynamicColors.tertiaryFixedDim,
onTertiaryFixed: import_material_color_utilities.MaterialDynamicColors.onTertiaryFixed,
onTertiaryFixedVariant: import_material_color_utilities.MaterialDynamicColors.onTertiaryFixedVariant
};
// src/lib/utils.ts
var import_material_color_utilities2 = require("@material/material-color-utilities");
var colorToRgbString = (color) => `${(0, import_material_color_utilities2.redFromArgb)(color)}, ${(0, import_material_color_utilities2.greenFromArgb)(color)}, ${(0, import_material_color_utilities2.blueFromArgb)(color)}`;
// src/main.ts
__dev_mode__: import_package_tracer.packageTracer.add("@nexim/tailwind-material-colors", "1.0.0");
function materialThemeBuilder(options) {
const source = (0, import_material_color_utilities3.argbFromHex)(options.primaryColor);
const SchemeObject = SchemeObjects[options.scheme ?? "content"];
const lightScheme = new SchemeObject(import_material_color_utilities3.Hct.fromInt(source), false, options.contrast ?? 0);
const darkScheme = new SchemeObject(import_material_color_utilities3.Hct.fromInt(source), true, options.contrast ?? 0);
const lightColors = {};
const darkColors = {};
Object.entries(AllMaterialDynamicColors).forEach(([name, DynamicColor]) => {
name = (0, import_change_case.kebabCase)(name);
lightColors[name] = colorToRgbString(DynamicColor.getArgb(lightScheme));
darkColors[name] = colorToRgbString(DynamicColor.getArgb(darkScheme));
});
if (options.extraColors) {
for (let colorName of Object.keys(options.extraColors)) {
colorName = (0, import_change_case.kebabCase)(colorName);
const { hex, blend } = options.extraColors[colorName];
const { light, dark } = (0, import_material_color_utilities3.customColor)(source, {
name: colorName,
value: (0, import_material_color_utilities3.argbFromHex)(hex),
blend: blend ?? true
});
lightColors[colorName] = colorToRgbString(light.color);
lightColors[`on-${colorName}`] = colorToRgbString(light.onColor);
lightColors[`${colorName}-container`] = colorToRgbString(light.colorContainer);
lightColors[`on-${colorName}-container`] = colorToRgbString(light.onColorContainer);
darkColors[colorName] = colorToRgbString(dark.color);
darkColors[`on-${colorName}`] = colorToRgbString(dark.onColor);
darkColors[`${colorName}-container`] = colorToRgbString(dark.colorContainer);
darkColors[`on-${colorName}-container`] = colorToRgbString(dark.onColorContainer);
}
}
return { lightColors, darkColors };
}
function generateColorList(options) {
const allColorNames = [];
Object.keys(AllMaterialDynamicColors).forEach((name) => allColorNames.push((0, import_change_case.kebabCase)(name)));
if (options.extraColors) {
Object.keys(options.extraColors).forEach((colorName) => {
const kebabName = (0, import_change_case.kebabCase)(colorName);
allColorNames.push(kebabName);
allColorNames.push(`on-${kebabName}`);
allColorNames.push(`${kebabName}-container`);
allColorNames.push(`on-${kebabName}-container`);
});
}
return allColorNames;
}
var materialThemeBuilderTailwindPlugin = import_plugin.default.withOptions(
(options) => {
return (pluginApi) => {
if (options == void 0) {
throw new Error("Material Theme Plugin: options is undefined");
}
const { lightColors, darkColors } = materialThemeBuilder(options);
pluginApi.addBase({
":root": Object.fromEntries(Object.entries(lightColors).map(([name, value]) => [`--ref-color-${name}`, value])),
"@media (prefers-color-scheme: dark)": {
":root": Object.fromEntries(Object.entries(darkColors).map(([name, value]) => [`--ref-color-${name}`, value]))
},
".dark": Object.fromEntries(Object.entries(darkColors).map(([name, value]) => [`--ref-color-${name}`, value]))
});
const stateUtils = {};
for (const name of generateColorList(options)) {
const varName = `--ref-color-${name}`;
const colorVar = `rgb(var(${varName}))`;
const hoverBg = `linear-gradient(rgba(var(${varName}), 0.08), rgba(var(${varName}), 0.08))`;
const focusVisibleBg = `linear-gradient(rgba(var(${varName}), 0.12), rgba(var(${varName}), 0.12))`;
const activeBg = `linear-gradient(rgba(var(${varName}), 0.12), rgba(var(${varName}), 0.12))`;
stateUtils[`.state-${name}`] = {
color: colorVar,
"&:hover": {
backgroundImage: hoverBg
},
"&:focus-visible": {
backgroundImage: focusVisibleBg
},
"&:active": {
backgroundImage: activeBg
}
};
stateUtils[`.stateHover-${name}`] = {
color: colorVar,
"&:hover": {
backgroundImage: hoverBg
}
};
stateUtils[`.stateActive-${name}`] = {
color: colorVar,
"&:active": {
backgroundImage: activeBg
}
};
}
pluginApi.addUtilities(stateUtils);
};
},
(options) => ({
theme: {
extend: {
colors: () => {
if (options == void 0) {
throw new Error("Material Theme Plugin: options is undefined");
}
return Object.fromEntries(generateColorList(options).map((name) => [name, `rgb(var(--ref-color-${name}))`]));
}
}
}
})
);
//# sourceMappingURL=main.cjs.map