UNPKG

@poupe/theme-builder

Version:

Design token management and theme generation system for Poupe UI framework

1 lines 45.7 kB
{"version":3,"file":"index.mjs","sources":["../src/theme/utils.ts","../src/theme/colors.ts","../src/theme/palettes.ts","../src/theme/states.ts","../src/theme/theme.ts","../src/css/css.ts","../src/from-image.ts"],"sourcesContent":["export {\n camelCase,\n} from '@poupe/css';\n\nexport * from '../core/index';\nexport * from '../core/utils';\n\n/**\n * Checks if an object is non-empty (has at least one own property).\n *\n * @param obj - The object to check\n * @returns true if the object exists and has at least one key\n */\nexport function isNonEmpty<T extends Record<string, unknown>>(\n object?: T,\n): object is T {\n return !!object && Object.keys(object).length > 0;\n}\n","// imports\n//\nimport type { KebabCase } from 'type-fest';\n\nimport {\n kebabCase,\n pairs,\n unsafeKeys,\n} from '@poupe/css';\n\nimport {\n type Color,\n type CorePalettes,\n DynamicScheme,\n Hct,\n TonalPalette,\n Variant,\n\n hct,\n makeCustomColor,\n makeCustomColorFromPalette,\n} from '../core';\n\nimport {\n type CustomDynamicColorKey,\n type StandardDynamicColorKey,\n type StandardPaletteKey,\n\n standardDynamicColors,\n customDynamicColors,\n standardPalettes,\n} from './data';\n\nimport {\n type ColorOptions,\n} from './types';\n\n// types\n//\n\nexport type StandardDynamicColors = { [K in StandardDynamicColorKey]: Hct };\ntype StandardPaletteColors = { [K in KebabCase<StandardPaletteKey>]: Hct };\ntype StandardPalettes = { [K in KebabCase<StandardPaletteKey>]: TonalPalette };\n\nexport type CustomDynamicColors<T extends string> = { [K in CustomDynamicColorKey<KebabCase<T>>]: Hct };\n\nexport function makeStandardColorsFromScheme(scheme: DynamicScheme) {\n const out = {} as StandardDynamicColors;\n\n for (const [name, fn] of pairs(standardDynamicColors)) {\n out[name] = Hct.fromInt(fn(scheme));\n }\n\n return out;\n}\n\nexport function makeStandardPaletteKeyColorsFromScheme(scheme: DynamicScheme) {\n const out = {} as StandardPaletteColors;\n for (const [kebabName, palette] of pairs(makeStandardPaletteFromScheme(scheme))) {\n out[kebabName] = palette.keyColor;\n }\n return out;\n}\n\nexport function makeStandardPaletteFromScheme(scheme: DynamicScheme) {\n const out = {} as StandardPalettes;\n\n for (const [name, fn] of pairs(standardPalettes)) {\n const kebabName = kebabCase(name) as KebabCase<StandardPaletteKey>;\n out[kebabName] = fn(scheme);\n }\n\n return out;\n}\n\nexport function makeCustomColors<K extends string>(source: Color, colors: Record<K, ColorOptions>) {\n const $source = hct(source);\n\n const colorOptions = {} as Record<KebabCase<K>, ColorOptions>;\n const palettes = {} as Record<KebabCase<K>, TonalPalette>;\n const darkColors = {} as CustomDynamicColors<K>;\n const lightColors = {} as CustomDynamicColors<K>;\n\n for (const [color, options] of pairs(colors)) {\n const kebabName = kebabCase(color) as KebabCase<K>;\n const $color = hct(options.value);\n const harmonize = options.harmonize ?? true;\n\n const { tones, dark, light } = makeCustomColor($color, harmonize ? $source : undefined, kebabName);\n\n colorOptions[kebabName] = options;\n palettes[kebabName] = tones;\n\n for (const [pattern, fn] of Object.entries(customDynamicColors)) {\n const name = pattern.replace('{}', kebabName) as keyof CustomDynamicColors<K>;\n\n darkColors[name] = fn(dark);\n lightColors[name] = fn(light);\n }\n }\n\n return {\n source,\n colors: unsafeKeys(colorOptions),\n colorOptions,\n palettes,\n dark: darkColors,\n light: lightColors,\n };\n}\n\nexport function makeCustomColorsFromPalettes<K extends string>(colors: Record<K, TonalPalette> = {} as Record<K, TonalPalette>) {\n const palettes = {} as Record<KebabCase<K>, TonalPalette>;\n const darkColors = {} as CustomDynamicColors<K>;\n const lightColors = {} as CustomDynamicColors<K>;\n\n for (const [color, tones] of pairs(colors)) {\n const kebabName = kebabCase(color) as KebabCase<K>;\n const { dark, light } = makeCustomColorFromPalette(tones, kebabName);\n\n palettes[kebabName] = tones;\n for (const [pattern, fn] of pairs(customDynamicColors)) {\n const name = pattern.replace('{}', kebabName) as keyof CustomDynamicColors<K>;\n\n darkColors[name] = fn(dark);\n lightColors[name] = fn(light);\n }\n }\n\n return {\n colors: unsafeKeys(palettes),\n palettes,\n dark: darkColors,\n light: lightColors,\n };\n}\n\n/**\n * Creates a dynamic color scheme based on the provided source color, variant, and other parameters.\n * Uses Material Design 2025 specification with phone platform.\n *\n * @param source - The source color in HCT color space\n * @param variant - The color scheme to apply\n * @param contrastLevel - The desired contrast level\n * @param isDark - Whether the scheme is for a dark or light theme\n * @param palettes - Optional color palettes to customize the scheme\n * @returns A configured DynamicScheme instance\n */\nexport function makeDynamicScheme(\n source: Hct,\n variant: Variant,\n contrastLevel: number,\n isDark: boolean,\n palettes: Partial<CorePalettes> = {},\n): DynamicScheme {\n return new DynamicScheme({\n sourceColorHct: source,\n variant,\n contrastLevel,\n isDark,\n primaryPalette: palettes.primary,\n secondaryPalette: palettes.secondary,\n tertiaryPalette: palettes.tertiary,\n neutralPalette: palettes.neutral,\n neutralVariantPalette: palettes.neutralVariant,\n errorPalette: palettes.error,\n specVersion: '2025',\n platform: 'phone',\n });\n}\n","import {\n ColorOptions,\n CustomColorOptions,\n Palettes,\n ThemeColors,\n} from './types';\n\nimport {\n type Color,\n type CorePalettes,\n type CorePaletteKey,\n Colord,\n Hct,\n TonalPalette,\n\n corePaletteKeys,\n camelCase,\n hct,\n isObjectColor,\n makeTonalPalette,\n pairs,\n unsafeKeys,\n} from './utils';\n\n/**\n * Normalizes a value that could be a direct Color or a partial CustomColorOptions\n * to a partial CustomColorOptions object.\n *\n * @param c - A color, custom color options, or partial custom color options to flatten\n * @returns A normalized (partial) CustomColorOptions object\n */\nexport function flattenPartialColorOptions(c: Color | CustomColorOptions): CustomColorOptions;\nexport function flattenPartialColorOptions(c: Color | CustomColorOptions | Partial<CustomColorOptions> | undefined): CustomColorOptions | Partial<CustomColorOptions>;\nexport function flattenPartialColorOptions(c: Color | CustomColorOptions | Partial<CustomColorOptions> | undefined): CustomColorOptions | Partial<CustomColorOptions> {\n if (c === undefined || c === null) {\n return {};\n } else if (c instanceof Hct || c instanceof Colord) {\n return { value: c };\n } else if (typeof c !== 'object') {\n return { value: c };\n } else if ('value' in c) {\n return c as CustomColorOptions;\n } else if (isObjectColor(c)) {\n return { value: c as Color };\n } else {\n return c as Partial<CustomColorOptions>;\n }\n}\n\n/**\n * Normalizes color input to a CustomColorOptions object.\n * Converts raw Color values to CustomColorOptions with HCT color representation.\n *\n * @param c - Color or CustomColorOptions to normalize\n * @returns Normalized CustomColorOptions with HCT color value\n */\nexport const flattenColorOptions = (c: Color | CustomColorOptions): CustomColorOptions => {\n const c2 = flattenPartialColorOptions(c);\n if (c2.value === undefined) {\n // Partial\n throw new Error('invalid color');\n } else if (c2.value instanceof Hct) {\n // ready\n return c2;\n } else {\n // Color\n return {\n ...c2,\n value: hct(c2.value),\n };\n }\n};\n\n/**\n * Creates a complete theme palette system from a set of palette colors.\n * Processes primary color as the source for harmonization and generates\n * tonal palettes for all defined colors.\n *\n * @typeParam K - Custom color key names\n * @param colors - Complete set of palette colors including primary and optional colors\n * @returns Object containing source color, core palettes, all palettes, and color configurations\n */\nexport const makeThemePalettes = <K extends string>(colors: ThemeColors<K>) => {\n const { colors: $colors } = cookThemeColors(colors);\n const { primary, ...rest } = $colors;\n const { value: primaryValue } = primary;\n const source = hct(primaryValue);\n\n const corePalettes: CorePalettes = {\n primary: makeTonalPalette(source),\n };\n\n type ExtraColorKey = Exclude<keyof typeof $colors, CorePaletteKey>;\n const extraPalettes: Record<ExtraColorKey, TonalPalette> = {};\n\n for (const [name, options] of pairs(rest)) {\n const { value, harmonize = true } = options;\n const tones = makeTonalPalette(value, harmonize ? source : undefined);\n\n if (corePaletteKeys.includes(name as CorePaletteKey)) {\n corePalettes[name as CorePaletteKey] = tones;\n } else {\n extraPalettes[name as ExtraColorKey] = tones;\n }\n }\n\n const palettes: Palettes<ExtraColorKey> = { ...corePalettes, ...extraPalettes };\n\n return {\n source,\n corePalettes,\n extraPalettes,\n palettes,\n colors: $colors as Record<CorePaletteKey | ExtraColorKey, ColorOptions>,\n };\n};\n\nfunction cookThemeColors<K extends string>(colors: ThemeColors<K>) {\n const { primary, ...rest } = colors;\n const out: Record<string, ColorOptions> = {\n primary: flattenColorOptions(primary),\n };\n\n for (const key of unsafeKeys(rest)) {\n const $options = flattenColorOptions(rest[key]);\n const { name = key } = $options;\n out[camelCase(name)] = $options;\n }\n\n const keys = Object.keys(out);\n\n return {\n keys, // just to avoid having the as unused\n colors: out as Record<typeof keys[number], ColorOptions>,\n };\n}\n","import type { KebabCase } from 'type-fest';\nimport { Hct } from '@poupe/material-color-utilities';\n\nimport { makeStateLayerColors } from '../core';\n\nimport type { StandardDynamicColors, CustomDynamicColors } from './colors';\n\n/**\n * Base color keys that support state variants\n */\ntype StandardInteractiveColorKey =\n | 'primary' | 'secondary' | 'tertiary' | 'error'\n | 'surface' | 'surface-variant'\n | 'primary-container' | 'secondary-container' | 'tertiary-container' | 'error-container';\n\n/**\n * State variant types for standard Material Design 3 colors\n */\ntype StandardStateVariants = {\n [K in StandardInteractiveColorKey as `${K}-hover` | `${K}-focus` | `${K}-pressed` | `${K}-dragged` | `${K}-disabled`]: Hct;\n};\n\n/**\n * Generates Material Design 3 state layer variants for standard theme colors\n *\n * @param colors - Standard theme colors generated from scheme\n * @returns Object with state variants for interactive colors\n */\nexport function makeStandardStateVariants(colors: StandardDynamicColors): StandardStateVariants {\n const variants: Record<string, Hct> = {};\n\n // Define color pairs that need state variants\n const colorPairs: Array<[keyof StandardDynamicColors, keyof StandardDynamicColors]> = [\n ['primary', 'on-primary'],\n ['secondary', 'on-secondary'],\n ['tertiary', 'on-tertiary'],\n ['error', 'on-error'],\n ['surface', 'on-surface'],\n ['surface-variant', 'on-surface-variant'],\n ['primary-container', 'on-primary-container'],\n ['secondary-container', 'on-secondary-container'],\n ['tertiary-container', 'on-tertiary-container'],\n ['error-container', 'on-error-container'],\n ];\n\n for (const [baseKey, onKey] of colorPairs) {\n const baseColor = colors[baseKey];\n const onColor = colors[onKey];\n\n if (baseColor && onColor) {\n const states = makeStateLayerColors(baseColor, onColor);\n\n variants[`${baseKey}-hover`] = states.hover;\n variants[`${baseKey}-focus`] = states.focus;\n variants[`${baseKey}-pressed`] = states.pressed;\n variants[`${baseKey}-dragged`] = states.dragged;\n variants[`${baseKey}-disabled`] = states.disabled;\n }\n }\n\n return variants as StandardStateVariants;\n}\n\n/**\n * Custom color state variant type\n */\ntype CustomStateVariantKey<T extends string> =\n | `${T}-hover` | `${T}-focus` | `${T}-pressed` | `${T}-dragged` | `${T}-disabled`\n | `${T}-container-hover` | `${T}-container-focus` | `${T}-container-pressed` | `${T}-container-dragged` | `${T}-container-disabled`;\n\ntype CustomStateVariants<T extends string> = { [K in CustomStateVariantKey<KebabCase<T>>]: Hct };\n\n/**\n * Generates Material Design 3 state layer variants for custom colors\n *\n * @param customColors - Custom colors with their on-colors\n * @returns Object with state variants for custom colors\n */\nexport function makeCustomStateVariants<K extends string>(\n customColors: CustomDynamicColors<K>,\n): CustomStateVariants<K> {\n const variants: Record<string, Hct> = {};\n\n // Extract base color names from the custom colors\n const colorNames = new Set<KebabCase<K>>();\n for (const key in customColors) {\n // Extract base name from patterns like \"color\", \"color-container\", \"on-color\", \"on-color-container\"\n const match = key.match(/^(?:on-)?([^-]+(?:-[^-]+)*)(?:-container)?$/);\n if (match) {\n colorNames.add(match[1] as KebabCase<K>);\n }\n }\n\n // Generate state variants for each color and its container variant\n for (const colorName of colorNames) {\n const baseKey = colorName as keyof CustomDynamicColors<K>;\n const onKey = `on-${colorName}` as keyof CustomDynamicColors<K>;\n const containerKey = `${colorName}-container` as keyof CustomDynamicColors<K>;\n const onContainerKey = `on-${colorName}-container` as keyof CustomDynamicColors<K>;\n\n // Base color states\n if (customColors[baseKey] && customColors[onKey]) {\n const states = makeStateLayerColors(customColors[baseKey], customColors[onKey]);\n\n variants[`${colorName}-hover`] = states.hover;\n variants[`${colorName}-focus`] = states.focus;\n variants[`${colorName}-pressed`] = states.pressed;\n variants[`${colorName}-dragged`] = states.dragged;\n variants[`${colorName}-disabled`] = states.disabled;\n }\n\n // Container color states\n if (customColors[containerKey] && customColors[onContainerKey]) {\n const states = makeStateLayerColors(customColors[containerKey], customColors[onContainerKey]);\n\n variants[`${colorName}-container-hover`] = states.hover;\n variants[`${colorName}-container-focus`] = states.focus;\n variants[`${colorName}-container-pressed`] = states.pressed;\n variants[`${colorName}-container-dragged`] = states.dragged;\n variants[`${colorName}-container-disabled`] = states.disabled;\n }\n }\n\n return variants as CustomStateVariants<K>;\n}\n","import type { KebabCase } from 'type-fest';\n\nimport {\n kebabCase,\n pairs,\n unsafeKeys,\n} from '@poupe/css';\n\nimport {\n DynamicScheme,\n Hct,\n TonalPalette,\n} from '../core';\n\nimport {\n type StandardDynamicColors,\n makeCustomColorsFromPalettes,\n makeDynamicScheme,\n makeStandardColorsFromScheme,\n makeStandardPaletteFromScheme,\n makeStandardPaletteKeyColorsFromScheme,\n} from './colors';\n\nimport {\n makeStandardStateVariants,\n makeCustomStateVariants,\n} from './states';\n\nimport {\n type CustomDynamicColorKey,\n type StandardDynamicSchemeKey,\n type StandardDynamicColorKey,\n type StandardPaletteKey,\n\n customDynamicColors,\n standardDynamicColorKeys,\n standardDynamicSchemes,\n standardPaletteKeys,\n} from './data';\n\nimport {\n flattenPartialColorOptions,\n makeThemePalettes,\n} from './palettes';\n\nimport {\n type ColorOptions,\n type ThemeColors,\n type ThemeGenerationOptions,\n} from './types';\n\nimport {\n isNonEmpty,\n} from './utils';\n\n/**\n * FlatThemeColors defines the colors of the theme\n */\nexport type FlatThemeColors<K extends string> = { primary: ColorOptions } & Record<K, ColorOptions>;\n\n/**\n * makeThemeKeys returns the keys of makeTheme makes without calculating\n * the values.\n */\nexport function makeThemeKeys<K extends string>(colors: Partial<ThemeColors<K>>) {\n type PaletteKey = KebabCase<StandardPaletteKey> | KebabCase<K>;\n type ColorKey = PaletteKey | StandardDynamicColorKey | CustomDynamicColorKey<KebabCase<K>>;\n\n const colorOptions = {} as Record<PaletteKey, Partial<ColorOptions>>;\n const kebabStandardPaletteKeys = standardPaletteKeys.map(s => kebabCase(s)) as PaletteKey[];\n const paletteKeys = [...kebabStandardPaletteKeys];\n const keys: ColorKey[] = [...standardDynamicColorKeys];\n\n for (const name of unsafeKeys(colors)) {\n const kebabName = kebabCase(name) as KebabCase<K>;\n\n // preserve config\n colorOptions[kebabName] = flattenPartialColorOptions(colors[name]);\n\n if (!keys.includes(kebabName)) {\n // custom color\n paletteKeys.push(kebabName);\n for (const pattern in customDynamicColors) {\n keys.push(pattern.replace('{}', kebabName) as CustomDynamicColorKey<KebabCase<K>>);\n }\n }\n }\n\n // additional standard palette colors\n for (const kebabName of kebabStandardPaletteKeys) {\n if (!keys.includes(kebabName)) {\n keys.push(kebabName);\n }\n if (!(kebabName in colorOptions)) {\n colorOptions[kebabName] = {};\n }\n }\n\n return {\n keys,\n paletteKeys,\n colorOptions,\n };\n}\n\n/**\n * @param colors - base colors of the theme.\n * @param scheme - Material color scheme to use.\n * @param contrastLevel - contrast level from -1 (minimum) to 1 (maximum). 0 represents standard.\n * @param extraOptions - Additional theme generation options.\n * @returns dark and light themes.\n */\nexport function makeTheme<K extends string>(\n colors: ThemeColors<K>,\n scheme: StandardDynamicSchemeKey = 'content',\n contrastLevel: number = 0,\n extraOptions?: Partial<ThemeGenerationOptions>,\n) {\n const options: ThemeGenerationOptions = {\n scheme,\n contrastLevel,\n useColorMix: false,\n ...extraOptions,\n };\n\n return makeThemeWithOptions(colors, options);\n}\n\nfunction makeThemeWithOptions<K extends string>(\n colors: ThemeColors<K>,\n options: ThemeGenerationOptions,\n) {\n const { source, corePalettes, extraPalettes, colors: colorOptions } = makeThemePalettes(colors);\n const { contrastLevel = 0, scheme = 'content' } = options;\n\n const variant = standardDynamicSchemes[scheme] || standardDynamicSchemes.content;\n const darkScheme = makeDynamicScheme(source, variant, contrastLevel, true, corePalettes);\n const lightScheme = makeDynamicScheme(source, variant, contrastLevel, false, corePalettes);\n\n const baseResult = {\n source,\n colorOptions,\n darkScheme,\n lightScheme,\n extraPalettes,\n ...makeThemeFromSchemes(darkScheme, lightScheme, extraPalettes),\n };\n\n if (options.useColorMix) {\n return baseResult;\n }\n\n // Generate state colors\n const { dark, light } = baseResult;\n const darkStateColors = makeStandardStateVariants(dark as StandardDynamicColors);\n const lightStateColors = makeStandardStateVariants(light as StandardDynamicColors);\n\n // Add custom state colors if there are extra palettes\n const darkCustomStateColors = isNonEmpty(extraPalettes) ? makeCustomStateVariants(baseResult.dark) : {};\n const lightCustomStateColors = isNonEmpty(extraPalettes) ? makeCustomStateVariants(baseResult.light) : {};\n\n return {\n ...baseResult,\n dark: {\n ...dark,\n ...darkStateColors,\n ...darkCustomStateColors,\n },\n light: {\n ...light,\n ...lightStateColors,\n ...lightCustomStateColors,\n },\n };\n}\n\nexport function makeThemeFromSchemes<K extends string>(\n darkScheme: DynamicScheme,\n lightScheme: DynamicScheme,\n extraPalettes?: Record<K, TonalPalette>,\n) {\n const {\n palettes: darkPalettes,\n keyColors: darkKeyColors,\n colors: darkStandardColors,\n } = cookThemeScheme(darkScheme);\n\n const {\n palettes: lightPalettes,\n keyColors: lightKeyColors,\n colors: lightStandardColors,\n } = cookThemeScheme(lightScheme);\n\n const {\n dark: darkCustomColors,\n light: lightCustomColors,\n keyColors: extraKeyColors,\n } = cookThemeCustomColors(extraPalettes);\n\n type ColorKey = keyof typeof darkKeyColors & keyof typeof darkStandardColors & keyof typeof darkCustomColors;\n type ThemeKeyColor = keyof typeof darkKeyColors & keyof typeof extraPalettes;\n\n const dark: { [P in ColorKey]: Hct } = {\n ...darkKeyColors,\n ...darkStandardColors,\n ...darkCustomColors,\n };\n\n const light: { [P in ColorKey]: Hct } = {\n ...lightKeyColors,\n ...lightStandardColors,\n ...lightCustomColors,\n };\n\n const $darkKeyColors: { [P in ThemeKeyColor]: Hct } = {\n ...darkKeyColors,\n ...extraKeyColors,\n };\n\n const $lightKeyColors: { [P in ThemeKeyColor]: Hct } = {\n ...lightKeyColors,\n ...extraKeyColors,\n };\n\n const $darkPalettes: { [P in ThemeKeyColor]: TonalPalette } = {\n ...darkPalettes,\n ...extraPalettes,\n };\n\n const $lightPalettes: { [P in ThemeKeyColor]: TonalPalette } = {\n ...lightPalettes,\n ...extraPalettes,\n };\n\n return {\n darkKeyColors: $darkKeyColors,\n lightKeyColors: $lightKeyColors,\n darkPalettes: $darkPalettes,\n lightPalettes: $lightPalettes,\n dark,\n light,\n };\n}\n\nfunction cookThemeScheme(scheme: DynamicScheme) {\n return {\n palettes: makeStandardPaletteFromScheme(scheme),\n keyColors: makeStandardPaletteKeyColorsFromScheme(scheme),\n colors: makeStandardColorsFromScheme(scheme),\n };\n}\n\nfunction cookThemeCustomColors<K extends string>(palettes?: Record<K, TonalPalette>) {\n const { dark, light, palettes: tones } = makeCustomColorsFromPalettes(palettes);\n const keyColors = {} as Record<keyof typeof tones, Hct>;\n\n for (const [name, palette] of pairs(tones)) {\n keyColors[name] = palette.keyColor;\n }\n\n return {\n dark,\n light,\n keyColors,\n };\n}\n","import {\n defu,\n} from 'defu';\n\nimport {\n type CSSRuleObject,\n unsafeKeys,\n setDeepRule,\n processCSSSelectors,\n} from '@poupe/css';\n\nimport {\n type ColorMap,\n type Hct,\n\n rgbaString,\n} from '../core';\n\nimport {\n type StandardDynamicSchemeKey,\n type ThemeColors,\n\n makeTheme,\n} from '../theme';\n\nexport interface CSSThemeOptions {\n /** @defaultValue `'.dark'` */\n darkMode: boolean | string | string[]\n /** @defaultValue `'.light'` */\n lightMode: boolean | string | string[]\n /** @defaultValue `'md-'` */\n prefix: string\n /** @defaultValue `'-dark'` */\n darkSuffix: string\n /** @defaultValue `'-light'` */\n lightSuffix: string\n /** @defaultValue `rgb('{r} {g} {b}')` */\n stringify: (c: Hct) => string\n /** @defaultValue `true` */\n addStarVariantsToDark?: boolean\n /** @defaultValue `true` */\n addStarVariantsToLight?: boolean\n};\n\n/** apply defaults to {@link CSSThemeOptions} */\nexport function defaultCSSThemeOptions(options: Partial<CSSThemeOptions> = {}): CSSThemeOptions {\n return defu(options, {\n darkMode: '.dark',\n lightMode: '.light',\n prefix: 'md-',\n darkSuffix: '-dark',\n lightSuffix: '-light',\n stringify: rgbaString,\n });\n}\n\n/** @returns the dark mode selector or media rule */\nexport function defaultDarkSelector(options: Partial<CSSThemeOptions>): string[] {\n const { addStarVariantsToDark = true } = options;\n let { darkMode = true } = options;\n\n if (darkMode === true)\n darkMode = '.dark';\n else if (darkMode === false || darkMode === '')\n darkMode = 'media';\n\n const result = processCSSSelectors(darkMode, {\n addStarVariants: addStarVariantsToDark,\n });\n return result ?? ['.dark, .dark *'];\n}\n\n/** @returns the light mode selector, or undefined if disabled */\nexport function defaultLightSelector(options: Partial<CSSThemeOptions>): string[] | undefined {\n const { addStarVariantsToLight = true } = options;\n let { lightMode = true } = options;\n\n if (lightMode === true)\n lightMode = '.light';\n else if (lightMode === false || lightMode === '')\n return undefined;\n\n const result = processCSSSelectors(lightMode, {\n addStarVariants: addStarVariantsToLight,\n });\n return result ?? ['.light, .light *'];\n}\n\nexport function defaultRootLightSelector(options: Partial<CSSThemeOptions>): string[] {\n const rootSelector = [':root'];\n const lightSelector = defaultLightSelector(options);\n\n if (lightSelector) {\n const combined = processCSSSelectors([\n ...rootSelector,\n ...lightSelector,\n ], {\n addStarVariants: false, // already added.\n });\n\n if (combined) { // always true\n return combined;\n }\n }\n\n return rootSelector;\n}\n\n/** creates resulting {@link CSSRuleObject} array */\nexport function assembleCSSRules(root: CSSRuleObject | undefined,\n light: CSSRuleObject, dark: CSSRuleObject,\n options: CSSThemeOptions): CSSRuleObject[] {\n /*\n * options\n */\n const rootSelector = ':root';\n const darkSelector = defaultDarkSelector(options);\n const rootLightSelector = defaultRootLightSelector(options);\n\n const styles: CSSRuleObject[] = [];\n\n if (root) {\n styles.push({\n [rootSelector]: root,\n });\n }\n\n const combinedRules: CSSRuleObject = {};\n\n // Set light mode rules\n setDeepRule(combinedRules, rootLightSelector, light);\n\n // Set dark mode rules\n setDeepRule(combinedRules, darkSelector, dark);\n\n styles.push(combinedRules);\n\n return styles;\n}\n\nexport function generateCSSColorVariables<K extends string>(dark: ColorMap<K>, light: ColorMap<K>, options: CSSThemeOptions) {\n const {\n prefix,\n darkSuffix,\n lightSuffix,\n stringify,\n } = options;\n\n let darkVars: CSSRuleObject | undefined = {};\n let lightVars: CSSRuleObject | undefined = {};\n const darkValues: CSSRuleObject = {};\n const lightValues: CSSRuleObject = {};\n const vars: Record<K, string> = {} as Record<K, string>;\n\n for (const k of unsafeKeys(dark)) {\n const k0 = `--${prefix}${k}`;\n const k1 = `${k0}${darkSuffix}`;\n const k2 = `${k0}${lightSuffix}`;\n const v1 = stringify(dark[k]);\n const v2 = stringify(light[k]);\n\n darkValues[k1] = v1;\n lightValues[k2] = v2;\n vars[k] = k0;\n\n if (k1 !== k0) {\n darkVars[k0] = `var(${k1})`;\n }\n\n if (k2 !== k0) {\n lightVars[k0] = `var(${k2})`;\n }\n }\n\n if (darkSuffix === lightSuffix) {\n // deduplicate\n for (const key of Object.keys(darkValues)) {\n if (key in lightValues && darkValues[key] === lightValues[key]) {\n delete darkValues[key];\n }\n }\n\n for (const key of Object.keys(darkVars)) {\n if (key in lightVars && darkVars[key] === lightVars[key]) {\n delete darkVars[key];\n }\n }\n }\n\n if (unsafeKeys(darkVars).length === 0) {\n darkVars = undefined;\n }\n if (unsafeKeys(lightVars).length === 0) {\n lightVars = undefined;\n }\n\n return { vars, darkValues, lightValues, darkVars, lightVars };\n}\n\n/** generates CSS color tables */\nexport function assembleCSSColors<K extends string>(dark: ColorMap<K>, light: ColorMap<K>, options: Partial<CSSThemeOptions> = {}) {\n /*\n * options\n */\n const $options = defaultCSSThemeOptions(options);\n\n /*\n * color variables\n */\n const { vars, darkValues, lightValues, darkVars, lightVars } = generateCSSColorVariables(dark, light, $options);\n\n /*\n * styles\n */\n let rootStyles: CSSRuleObject | undefined;\n let lightStyles: CSSRuleObject;\n let darkStyles: CSSRuleObject;\n\n if (darkVars) {\n rootStyles = {\n ...darkValues,\n };\n darkStyles = darkVars;\n } else {\n darkStyles = darkValues;\n }\n\n if (lightVars) {\n rootStyles = {\n ...rootStyles,\n ...lightValues,\n };\n lightStyles = lightVars;\n } else {\n lightStyles = lightValues;\n }\n\n /*\n * CSS Rules\n */\n const styles: CSSRuleObject[] = assembleCSSRules(rootStyles, lightStyles, darkStyles, $options);\n\n return { vars, darkValues, lightValues, darkVars, lightVars, styles, options: $options };\n}\n\nexport interface MakeCSSThemeOptions extends CSSThemeOptions {\n /** @defaultValue `'content'` */\n scheme?: StandardDynamicSchemeKey\n /** @defaultValue `0` */\n contrastLevel?: number\n}\n\n/**\n * makeCSSTheme assembles CSS variables to use in M3 dark/light themes.\n *\n * @param colors - base colors of the theme.\n * @param options - configuration options.\n * @returns CSSRuleObjects to set up dark/light themes.\n */\nexport function makeCSSTheme<K extends string>(colors: ThemeColors<K>,\n options: Partial<MakeCSSThemeOptions> = {},\n) {\n const { dark, light } = makeTheme(colors, options.scheme, options.contrastLevel);\n return assembleCSSColors(dark, light, options);\n}\n","import {\n Hct,\n\n sourceColorFromImage,\n} from '@poupe/material-color-utilities';\n\n/** @returns a color suitable to make a theme from the given image element. */\nexport async function fromImageElement(image: HTMLImageElement): Promise<Hct> {\n const color = await sourceColorFromImage(image);\n\n return Hct.fromInt(color);\n}\n"],"names":[],"mappings":"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"}