WK 0d217e466f
refactor: optimization (#5362)
* chore(deps): bump RA versions

* chore(deps): bump RA versions

* chore(deps): bump RA versions

* chore: changeset

* chore(deps): remove unnecessary dependencies

* fix(calendar): typing issue

* refactor(system): remove unused SupportedCalendars

* refactor(system): move I18nProviderProps to type

* refactor: use `spectrumCalendarProps<DateValue>["createCalendar"]`

* feat: add consistent-type-imports

* fix: eslint

* chore: add changeset

* refactor: remove unused deps
2025-06-09 14:17:44 +08:00

231 lines
8.0 KiB
TypeScript

import type {ColorPickerType, Config, ConfigLayout, ThemeType, ThemeColor} from "./types";
import {readableColor} from "color2k";
import {colorsId, baseColorsId, showcaseId, otherColorsId, defaultColorsId} from "./constants";
import {generateThemeColor, hexToHsl} from "./utils/colors";
import {templates} from "./templates";
export function setCssColor(
colorType: ColorPickerType,
value: string,
heroUIValue: string,
theme: ThemeType,
) {
const baseColorEl = document.getElementById(colorsId);
const commonColorsEl = document.getElementById(baseColorsId);
const showcaseEl = document.getElementById(showcaseId);
const defaultColorEl = document.getElementById(defaultColorsId);
const configurationContainer = document.getElementById("configuration-container");
const themeColor = generateThemeColor(value, colorType, theme);
const heroThemeColor = generateThemeColor(heroUIValue, colorType, theme);
if (!baseColorEl || !commonColorsEl || !showcaseEl || !defaultColorEl) {
// eslint-disable-next-line no-console
console.error("One or more required elements are missing from the DOM.");
return;
}
Object.keys(themeColor).forEach((key) => {
const value = hexToHsl(themeColor[key as keyof ThemeColor]);
const heroValue = hexToHsl(heroThemeColor[key as keyof ThemeColor]);
if (key === "DEFAULT") {
baseColorEl.style.setProperty(`--heroui-${colorType}`, value);
commonColorsEl.style.setProperty(`--heroui-${colorType}`, value);
showcaseEl.style.setProperty(`--heroui-${colorType}`, value);
defaultColorEl.style.setProperty(`--heroui-${colorType}`, value);
configurationContainer?.style.setProperty(`--heroui-${colorType}`, heroValue);
} else {
baseColorEl.style.setProperty(`--heroui-${colorType}-${key}`, value);
commonColorsEl.style.setProperty(`--heroui-${colorType}-${key}`, value);
showcaseEl.style.setProperty(`--heroui-${colorType}-${key}`, value);
defaultColorEl.style.setProperty(`--heroui-${colorType}`, value);
configurationContainer?.style.setProperty(`--heroui-${colorType}-${key}`, heroValue);
}
});
}
export function setCssBackground(value: string) {
const showcaseEl = document.getElementById(showcaseId);
const baseColor = document.getElementById(baseColorsId);
const hslValue = hexToHsl(value);
baseColor?.style.setProperty("--heroui-background", hslValue);
showcaseEl?.style.setProperty("--heroui-background", hslValue);
}
export function setCssFontSize(type: keyof ConfigLayout["fontSize"], value: string) {
const el = document.getElementById(showcaseId);
el?.style.setProperty(`--heroui-font-size-${type}`, `${value}rem`);
}
export function setCssLineHeight(type: keyof ConfigLayout["lineHeight"], value: string) {
const el = document.getElementById(showcaseId);
el?.style.setProperty(`--heroui-line-height-${type}`, `${value}rem`);
}
export function setCssRadius(type: keyof ConfigLayout["radius"], value: string) {
const el = document.getElementById(showcaseId);
el?.style.setProperty(`--heroui-radius-${type}`, `${value}rem`);
}
export function setCssBorderWidth(type: keyof ConfigLayout["borderWidth"], value: string) {
const el = document.getElementById(showcaseId);
el?.style.setProperty(`--heroui-border-width-${type}`, `${value}px`);
}
export function setCssContentColor(level: 1 | 2 | 3 | 4, value: string, heroValue: string) {
const showcaseEl = document.getElementById(showcaseId);
const baseColorEl = document.getElementById(baseColorsId);
const configurationContainer = document.getElementById("configuration-container");
const hslValue = hexToHsl(value);
const heroHslValue = hexToHsl(heroValue);
showcaseEl?.style.setProperty(`--heroui-content${level}`, hslValue);
showcaseEl?.style.setProperty(
`--heroui-content${level}-foreground`,
hexToHsl(readableColor(value)),
);
baseColorEl?.style.setProperty(`--heroui-content${level}`, hslValue);
baseColorEl?.style.setProperty(
`--heroui-content${level}-foreground`,
hexToHsl(readableColor(value)),
);
configurationContainer?.style.setProperty(`--heroui-content${level}`, heroHslValue);
configurationContainer?.style.setProperty(
`--heroui-content${level}-foreground`,
hexToHsl(readableColor(heroValue)),
);
}
export function setCssOtherColor(
type: "background" | "foreground" | "focus" | "overlay",
value: string,
) {
const showcaseEl = document.getElementById(showcaseId);
const otherColors = document.getElementById(otherColorsId);
const hslValue = hexToHsl(value);
otherColors?.style.setProperty(`--heroui-${type}`, hslValue);
showcaseEl?.style.setProperty(`--heroui-${type}`, hslValue);
}
export function setOtherCssParams(type: keyof ConfigLayout["otherParams"], value: string) {
const el = document.getElementById(showcaseId);
if (!el) return;
switch (type) {
case "disabledOpacity":
el.style.setProperty("--heroui-disabled-opacity", value);
break;
case "dividerWeight":
el.style.setProperty("--heroui-divider-weight", `${value}px`);
break;
case "hoverOpacity":
el.style.setProperty("--heroui-hover-opacity", value);
break;
}
}
export function setAllCssVars(config: Config, theme: ThemeType) {
if (!config[theme] || !config[theme].baseColor || !config[theme].layoutColor || !config.layout) {
// eslint-disable-next-line no-console
console.error("Invalid configuration or theme provided.");
return;
}
setCssColor(
"default",
config[theme].defaultColor.default,
templates[0].value[theme].defaultColor.default,
theme,
);
setCssColor(
"primary",
config[theme].baseColor.primary,
templates[0].value[theme].baseColor.primary,
theme,
);
setCssColor(
"secondary",
config[theme].baseColor.secondary,
templates[0].value[theme].baseColor.secondary,
theme,
);
setCssColor(
"success",
config[theme].baseColor.success,
templates[0].value[theme].baseColor.success,
theme,
);
setCssColor(
"warning",
config[theme].baseColor.warning,
templates[0].value[theme].baseColor.warning,
theme,
);
setCssColor(
"danger",
config[theme].baseColor.danger,
templates[0].value[theme].baseColor.danger,
theme,
);
setCssColor(
"foreground",
config[theme].layoutColor.foreground,
templates[0].value[theme].layoutColor.foreground,
theme,
);
setCssContentColor(
1,
config[theme].contentColor.content1,
templates[0].value[theme].contentColor.content1,
);
setCssContentColor(
2,
config[theme].contentColor.content2,
templates[0].value[theme].contentColor.content2,
);
setCssContentColor(
3,
config[theme].contentColor.content3,
templates[0].value[theme].contentColor.content3,
);
setCssContentColor(
4,
config[theme].contentColor.content4,
templates[0].value[theme].contentColor.content4,
);
setCssBackground(config[theme].layoutColor.background);
setCssFontSize("tiny", config.layout.fontSize.tiny);
setCssFontSize("small", config.layout.fontSize.small);
setCssFontSize("medium", config.layout.fontSize.medium);
setCssFontSize("large", config.layout.fontSize.large);
setCssLineHeight("tiny", config.layout.lineHeight.tiny);
setCssLineHeight("small", config.layout.lineHeight.small);
setCssLineHeight("medium", config.layout.lineHeight.medium);
setCssLineHeight("large", config.layout.lineHeight.large);
setCssRadius("small", config.layout.radius.small);
setCssRadius("medium", config.layout.radius.medium);
setCssRadius("large", config.layout.radius.large);
setCssBorderWidth("small", config.layout.borderWidth.small);
setCssBorderWidth("medium", config.layout.borderWidth.medium);
setCssBorderWidth("large", config.layout.borderWidth.large);
setCssOtherColor("focus", config[theme].layoutColor.focus);
setCssOtherColor("overlay", config[theme].layoutColor.overlay);
setOtherCssParams("disabledOpacity", config.layout.otherParams.disabledOpacity);
setOtherCssParams("dividerWeight", config.layout.otherParams.dividerWeight);
setOtherCssParams("hoverOpacity", config.layout.otherParams.hoverOpacity);
}