import definitions from "./palette.json" with { type: "json" }; type Entries = { [K in keyof T]: [K, T[K]]; }[keyof T][]; const entriesFromObject = (obj: T): Entries => Object.entries(obj) as Entries; /** * All flavor names of Catppuccin */ export type FlavorName = "latte" | "frappe" | "macchiato" | "mocha"; /** * Accent colors of Catppuccin. */ export type AccentName = | "rosewater" | "flamingo" | "pink" | "mauve" | "red" | "maroon" | "peach" | "yellow" | "green" | "teal" | "sky" | "sapphire" | "blue" | "lavender"; /** * Monochromatic colors of Catppuccin, * from `text` to `crust` */ export type MonochromaticName = | "text" | "subtext1" | "subtext0" | "overlay2" | "overlay1" | "overlay0" | "surface2" | "surface1" | "surface0" | "base" | "mantle" | "crust"; /** * All color names of Catppuccin */ export type ColorName = AccentName | MonochromaticName; /** * Generic to map type T to all Catppuccin color names */ export type Colors = Record; /** * A flavor of Catppuccin */ export type CatppuccinFlavor = Readonly<{ /** * Name of the flavor */ name: string; /** * Emoji associated with the flavor. Requires Unicode 13.0 (2020) or later to render */ emoji: string; /** * Order of the flavor in the palette spec */ order: number; /** * Whether the flavor is a dark theme */ dark: boolean; /** * An object containing all the colors of the flavor */ colors: CatppuccinColors; /** * A typed Object.entries iterable of the colors of the flavor */ colorEntries: Entries; }>; /** * All colors of Catppuccin */ export type CatppuccinColors = Readonly>; /** * All flavors of Catppuccin */ export type CatppuccinFlavors = Flavors; export type Flavors = { /** * Light variant */ latte: T; /** * Low-saturation, low-contrast dark variant */ frappe: T; /** * Mid-saturation, mid-contrast dark variant */ macchiato: T; /** * High-saturation, High-contrast dark variant */ mocha: T; }; export type ColorFormat = Readonly<{ /** * Name of the color */ name: string; /** * Order of the color in the palette spec */ order: number; /** * String-formatted hex value * @example "#babbf1" */ hex: string; /** * Formatted rgb value * @example { r: 186, g: 187, b: 241} */ rgb: { /** * Red, 0-255 */ r: number; /** * Green, 0-255 */ g: number; /** * Blue, 0-255 */ b: number; }; /** * Formatted hsl value * @example { h: 238.9, s: 12.1, l: 83.5 } */ hsl: { /** * Hue, 0-360 */ h: number; /** * Saturation, 0-100 */ s: number; /** * Lightness, 0-100 */ l: number; }; /** * Indicates whether the color is intended to be used as an accent color. */ accent: boolean; }>; const { version: _, ...jsonFlavors } = definitions; /** * The version of the Catppuccin palette */ export const version = definitions.version; /** * All flavors of Catppuccin */ export const flavors: CatppuccinFlavors = entriesFromObject( jsonFlavors, ).reduce((acc, [flavorName, flavor]) => { acc[flavorName] = { ...flavor, colorEntries: entriesFromObject(flavor.colors), }; return acc; }, {} as CatppuccinFlavors); /** * A typed `Object.entries()` iterable of all Catppuccin flavors */ export const flavorEntries: Entries = entriesFromObject( flavors, );