'use strict'; const materialColorUtilities = require('@importantimport/material-color-utilities'); class RgbColor { constructor(r, g, b) { this.toString = () => `${this.r},${this.g},${this.b}`; this.r = r; this.g = g; this.b = b; } static fromArgb(argb) { return new RgbColor(materialColorUtilities.redFromArgb(argb), materialColorUtilities.greenFromArgb(argb), materialColorUtilities.blueFromArgb(argb)); } } class CssVarBuilder { constructor() { this.content = ""; } static create() { return new CssVarBuilder(); } add(name, value) { let cssVar = ` ${name}: ${value}; `; this.content += cssVar; return this; } addFromArgb(name, argb) { this.add(`--u-${name}-color`, materialColorUtilities.hexFromArgb(argb)); this.add(`--u-${name}-color-rgb`, RgbColor.fromArgb(argb).toString()); return this; } build() { return this.content; } } const elevationTintsOpacities = [0.05, 0.08, 0.11, 0.12, 0.14]; function getElevationTints() { let tints = ""; let elevationLevel = 1; for (const opacity of elevationTintsOpacities) { tints += ` --u-elevation-tint${elevationLevel}-color: rgba(var(--u-elevation-tint-color-rgb), var(--u-elevation-tint${elevationLevel}-opacity)); `; elevationLevel++; } return tints; } function getCss(selector, content) { return `${selector} { ${content}}`; } class ThemeBuilder { constructor() { this.colors = []; this.commonColors = []; this.neutralColorPalette = null; this.neutralVariantColorPalette = null; this.partial = false; this.cssClass = null; } static create(primaryColorHex) { return new ThemeBuilder().addColor("primary", primaryColorHex); } static createPartial() { const themeBuilder = new ThemeBuilder(); themeBuilder.partial = true; return themeBuilder; } addColor(name, hex) { this.colors.push({ name, tonalPalette: materialColorUtilities.TonalPalette.fromInt(materialColorUtilities.argbFromHex(hex)) }); return this; } addCommonColor(name, hex) { this.commonColors.push({ name, tonalPalette: materialColorUtilities.TonalPalette.fromInt(materialColorUtilities.argbFromHex(hex)) }); return this; } setCssClass(cssClass) { this.cssClass = cssClass; return this; } ensureCssClassStartsWithDot() { if (!this.cssClass || this.cssClass.startsWith(".")) { return; } this.cssClass = `.${this.cssClass}`; } ensureThemeColors() { const primaryColor = this.colors.find((c) => c.name === "primary"); const palette = materialColorUtilities.CorePalette.of(primaryColor.tonalPalette.tone(40)); if (!this.colors.find((c) => c.name === "secondary")) { this.colors.push({ name: "secondary", tonalPalette: palette.a2 }); } if (!this.colors.find((c) => c.name === "tertiary")) { this.colors.push({ name: "tertiary", tonalPalette: palette.a3 }); } if (!this.neutralColorPalette) { this.neutralColorPalette = palette.n1; } if (!this.neutralVariantColorPalette) { this.neutralVariantColorPalette = palette.n2; } } getLightModeNeultralVariables() { return CssVarBuilder.create().addFromArgb("background", this.neutralColorPalette.tone(99)).addFromArgb("light-background", this.neutralColorPalette.tone(99)).addFromArgb("dark-background", this.neutralColorPalette.tone(10)).addFromArgb("inverse-background", this.neutralColorPalette.tone(10)).addFromArgb("on-background", this.neutralColorPalette.tone(10)).addFromArgb("on-light-background", this.neutralColorPalette.tone(10)).addFromArgb("on-dark-background", this.neutralColorPalette.tone(90)).addFromArgb("on-inverse-background", this.neutralColorPalette.tone(90)).addFromArgb("surface", this.neutralColorPalette.tone(99)).addFromArgb("light-surface", this.neutralColorPalette.tone(99)).addFromArgb("dark-surface", this.neutralColorPalette.tone(10)).addFromArgb("inverse-surface", this.neutralColorPalette.tone(10)).addFromArgb("on-surface", this.neutralColorPalette.tone(10)).addFromArgb("on-light-surface", this.neutralColorPalette.tone(10)).addFromArgb("on-dark-surface", this.neutralColorPalette.tone(90)).addFromArgb("on-inverse-surface", this.neutralColorPalette.tone(90)).addFromArgb("shadow", this.neutralColorPalette.tone(0)).addFromArgb("scrim", this.neutralColorPalette.tone(0)).build(); } getDarkModeNeultralVariables() { return CssVarBuilder.create().addFromArgb("background", this.neutralColorPalette.tone(10)).addFromArgb("inverse-background", this.neutralColorPalette.tone(99)).addFromArgb("on-background", this.neutralColorPalette.tone(90)).addFromArgb("on-inverse-background", this.neutralColorPalette.tone(10)).addFromArgb("surface", this.neutralColorPalette.tone(10)).addFromArgb("inverse-surface", this.neutralColorPalette.tone(99)).addFromArgb("on-surface", this.neutralColorPalette.tone(90)).addFromArgb("on-inverse-surface", this.neutralColorPalette.tone(10)).build(); } getLightNeultralVariantVariables() { return CssVarBuilder.create().addFromArgb("surface-variant", this.neutralVariantColorPalette.tone(90)).addFromArgb("light-surface-variant", this.neutralVariantColorPalette.tone(90)).addFromArgb("dark-surface-variant", this.neutralVariantColorPalette.tone(30)).addFromArgb("inverse-surface-variant", this.neutralVariantColorPalette.tone(30)).addFromArgb("on-surface-variant", this.neutralVariantColorPalette.tone(30)).addFromArgb("on-light-surface-variant", this.neutralVariantColorPalette.tone(30)).addFromArgb("on-dark-surface-variant", this.neutralVariantColorPalette.tone(80)).addFromArgb("on-inverse-surface-variant", this.neutralVariantColorPalette.tone(80)).addFromArgb("outline", this.neutralVariantColorPalette.tone(50)).addFromArgb("light-outline", this.neutralVariantColorPalette.tone(50)).addFromArgb("dark-outline", this.neutralVariantColorPalette.tone(60)).addFromArgb("inverse-outline", this.neutralVariantColorPalette.tone(60)).addFromArgb("outline-variant", this.neutralVariantColorPalette.tone(80)).addFromArgb("light-outline-variant", this.neutralVariantColorPalette.tone(80)).addFromArgb("dark-outline-variant", this.neutralVariantColorPalette.tone(30)).addFromArgb("inverse-outline-variant", this.neutralVariantColorPalette.tone(30)).build(); } getDarkNeultralVariantVariables() { return CssVarBuilder.create().addFromArgb("surface-variant", this.neutralVariantColorPalette.tone(30)).addFromArgb("inverse-surface-variant", this.neutralVariantColorPalette.tone(90)).addFromArgb("on-surface-variant", this.neutralVariantColorPalette.tone(80)).addFromArgb("on-inverse-surface-variant", this.neutralVariantColorPalette.tone(30)).addFromArgb("outline", this.neutralVariantColorPalette.tone(60)).addFromArgb("inverse-outline", this.neutralVariantColorPalette.tone(50)).addFromArgb("outline-variant", this.neutralVariantColorPalette.tone(30)).addFromArgb("inverse-outline-variant", this.neutralVariantColorPalette.tone(80)).build(); } getColorVariables(color, colorTone, containerTone, onColorTone, onContainerTone, inverseColorTone = null) { const tonalPalette = color.tonalPalette; const mainColor = tonalPalette.tone(colorTone); const containerColor = tonalPalette.tone(containerTone); const onColor = tonalPalette.tone(onColorTone); const onContainerColor = tonalPalette.tone(onContainerTone); const builder = CssVarBuilder.create().addFromArgb(color.name, mainColor).addFromArgb(`${color.name}-container`, containerColor).addFromArgb(`on-${color.name}`, onColor).addFromArgb(`on-${color.name}-container`, onContainerColor); if (color.name !== "primary") { return builder.build(); } const onInverseColor = tonalPalette.tone(inverseColorTone); builder.addFromArgb(`inverse-${color.name}`, onInverseColor).add(`--u-elevation-tint-color-rgb`, "var(--u-primary-color-rgb)"); return builder.build() + getElevationTints(); } getCommonColorsVariables() { let variables = ""; for (const color of this.commonColors) { variables += this.getColorVariables(color, 80, 90, 15, 15); } return variables; } getLightModeColorsVariables() { let variables = ""; for (const color of this.colors) { variables += this.getColorVariables(color, 40, 90, 100, 10, 80); } if (this.neutralColorPalette) { variables += this.getLightModeNeultralVariables(); } if (this.neutralVariantColorPalette) { variables += this.getLightNeultralVariantVariables(); } return variables; } getDarkModeColorsVariables() { let variables = ""; for (const color of this.colors) { variables += this.getColorVariables(color, 80, 30, 20, 90, 40); } if (this.neutralColorPalette) { variables += this.getDarkModeNeultralVariables(); } if (this.neutralVariantColorPalette) { variables += this.getDarkNeultralVariantVariables(); } return variables; } getCssVar(name, argb, generateRgbVar = true) { let cssVar = ` --u-${name}-color: ${materialColorUtilities.hexFromArgb(argb)}; `; if (!generateRgbVar) { return cssVar; } cssVar += ` --u-${name}-color-rgb: ${RgbColor.fromArgb(argb)}; `; return cssVar; } build() { this.ensureCssClassStartsWithDot(); const lightCssClass = this.cssClass ?? ":root"; const darkCssClass = this.cssClass ? `${this.cssClass}.u-dark-mode, ${this.cssClass} .u-dark-mode` : ".u-dark-mode"; if (!this.partial) { this.ensureThemeColors(); } let variables = `${getCss(lightCssClass, `${this.getLightModeColorsVariables()}${this.getCommonColorsVariables()}`)} ${getCss(darkCssClass, this.getDarkModeColorsVariables())} `; return variables; } } exports.ThemeBuilder = ThemeBuilder;