import type { UhuruColorConfig, UhuruColorPalette, UhuruTheme } from "./provider"; export type UhuruAccentPresetMap = Record; type ThemePalette = Partial; const LIGHT_BASE = "#ffffff"; const DARK_BASE = "#111111"; function mix(accent: string, percentage: number, base: string) { return `color-mix(in srgb, ${accent} ${percentage}%, ${base})`; } function createPreset(light: ThemePalette, dark: ThemePalette): UhuruColorConfig { return { light, dark }; } function buildPreset({ darkAccent, darkAccentStrong, lightAccent, lightAccentStrong, }: { darkAccent: string; darkAccentStrong: string; lightAccent: string; lightAccentStrong: string; }) { return createPreset( { bgBase: mix(lightAccent, 2, LIGHT_BASE), bgMuted: mix(lightAccent, 4, LIGHT_BASE), bgSubtle: mix(lightAccent, 1, LIGHT_BASE), actionPrimary: lightAccent, actionPrimaryHover: lightAccentStrong, accentSolid: lightAccent, accentStrong: lightAccentStrong, accentSubtle: mix(lightAccent, 8, LIGHT_BASE), borderAccent: mix(lightAccent, 34, LIGHT_BASE), borderDefault: mix(lightAccent, 10, LIGHT_BASE), borderDisabled: mix(lightAccent, 4, LIGHT_BASE), borderStrong: mix(lightAccent, 24, LIGHT_BASE), borderSubtle: mix(lightAccent, 6, LIGHT_BASE), surfaceDefault: mix(lightAccent, 1, LIGHT_BASE), surfaceMuted: mix(lightAccent, 4, LIGHT_BASE), surfaceOverlay: "rgba(0, 0, 0, 0.08)", }, { bgBase: mix(darkAccent, 3, DARK_BASE), bgMuted: mix(darkAccent, 6, DARK_BASE), bgSubtle: mix(darkAccent, 2, DARK_BASE), actionPrimary: darkAccent, actionPrimaryHover: darkAccentStrong, accentSolid: darkAccent, accentStrong: darkAccentStrong, accentSubtle: mix(darkAccent, 9, DARK_BASE), borderAccent: mix(darkAccent, 30, DARK_BASE), borderDefault: mix(darkAccent, 12, DARK_BASE), borderDisabled: mix(darkAccent, 5, DARK_BASE), borderStrong: mix(darkAccent, 26, DARK_BASE), borderSubtle: mix(darkAccent, 7, DARK_BASE), surfaceDefault: mix(darkAccent, 1, DARK_BASE), surfaceMuted: mix(darkAccent, 4, DARK_BASE), surfaceOverlay: "rgba(0, 0, 0, 0.72)", }, ); } export const defaultAccentPresets = { black: buildPreset({ lightAccent: "#111111", lightAccentStrong: "#000000", darkAccent: "#f5f3ef", darkAccentStrong: "#ffffff", }), brown: buildPreset({ lightAccent: "#8b6438", lightAccentStrong: "#6e4c28", darkAccent: "#c49a71", darkAccentStrong: "#dfc1a5", }), blue: buildPreset({ lightAccent: "#2563eb", lightAccentStrong: "#1d4ed8", darkAccent: "#93c5fd", darkAccentStrong: "#dbeafe", }), teal: buildPreset({ lightAccent: "#0f766e", lightAccentStrong: "#115e59", darkAccent: "#5eead4", darkAccentStrong: "#99f6e4", }), rose: buildPreset({ lightAccent: "#e11d48", lightAccentStrong: "#be123c", darkAccent: "#fda4af", darkAccentStrong: "#fecdd3", }), amber: buildPreset({ lightAccent: "#d97706", lightAccentStrong: "#b45309", darkAccent: "#fcd34d", darkAccentStrong: "#fbbf24", }), } satisfies UhuruAccentPresetMap; export function flattenColorConfig(config: UhuruColorConfig | undefined, theme: UhuruTheme) { if (!config) { return {}; } const { dark, light, ...rest } = config; return { ...rest, ...(theme === "light" ? light : dark), }; }