UNPKG

alouette

Version:

A modern, customizable design system built on top of NativeWind v5 with configurable defaults

1 lines 33.2 kB
{"version":3,"file":"theme-generator-node22.cjs","sources":["../src/theme-generator/paletteSpecs.ts","../src/theme-generator/createColorScale.ts","../src/theme-generator/tokenScaleMap.ts","../src/theme-generator/buildTheme.ts","../src/theme-generator/generateTheme.ts","../src/theme-generator/writeTheme.ts"],"sourcesContent":["/* eslint-disable import-x/extensions */\n// Palette definitions: the single place declaring each accent — its hue\n// parameters (turned into OKLCH color scales by `createColorScale`) and its\n// traits (consumed by `tokenScaleMap.ts` when a token's step depends on the\n// accent). Apps override these via `generateTheme(overrides)` to re-color the\n// same accents while staying on alouette's OKLCH ramp.\n\nimport type { Accent } from \"../core/AlouetteConfig.ts\";\n\nexport type AccentName = Accent | \"grayscale\";\n\nexport interface PaletteSpec {\n type: \"accent\" | \"brightAccent\" | \"grayscale\";\n hue: number;\n // Optional hue ramp keyed on perceptual lightness: `hueHi` applies at the\n // lightest end, `hueLo` at the darkest. Both default to `hue` (no ramp).\n hueHi?: number;\n hueLo?: number;\n // Uniform multiplier on the relative chroma curve (grayscale = 0).\n intensity?: number;\n}\n\n// Insertion order is the order palettes are emitted into the generated scales.\nexport const defaultPaletteSpecs: Record<AccentName, PaletteSpec> = {\n grayscale: { type: \"grayscale\", hue: 0, intensity: 0 },\n brand: { type: \"accent\", hue: 225 },\n // Slightly pinker tints (hueHi 20) matching the old palette's pale reds.\n danger: { type: \"accent\", hue: 27, hueHi: 20 },\n info: { type: \"accent\", hue: 233 },\n success: { type: \"accent\", hue: 145 },\n // Amber ramp: cream tints at the light end, bronze shadows — the classic\n // warning gold rather than lemon yellow.\n warning: { type: \"brightAccent\", hue: 85, hueHi: 95, hueLo: 75 },\n};\n","/* eslint-disable import-x/extensions */\n// OKLCH color-scale generator. Palettes are generated in OKLCH so a single\n// lightness ramp is perceptually uniform across every hue (HSL lightness is not\n// — yellow at HSL L=56 reads far brighter than blue at the same L). Chroma is\n// specified *relative to the sRGB gamut*: each step requests a fraction of the\n// maximum chroma sRGB can render at that step's lightness and hue. The fraction\n// curve is shared by every palette and tiered by usage (muted surface tints,\n// medium highlight mids, near-vivid interactive and text steps), so all hues are\n// equally saturated relative to what's possible — no per-palette chroma table.\n\nimport Color from \"colorjs.io\";\nimport type { PaletteSpec } from \"./paletteSpecs.ts\";\nimport type { Mode, ScaleNum } from \"./tokenScaleMap.ts\";\n\nexport type ColorScale = Record<ScaleNum, string>;\n\n// step: 1 2 3 4 5 6 7 8 9 10 11\nconst lightnessRamps = {\n grayscale: {\n dark: [0.18, 0.24, 0.28, 0.32, 0.36, 0.4, 0.45, 0.795, 0.865, 0.96, 1],\n // only diff is on the first 2 values\n light: [1, 0.98, 0.948, 0.89, 0.85, 0.79, 0.61, 0.54, 0.48, 0.42, 0.27],\n },\n accent: {\n dark: [0.18, 0.22, 0.26, 0.3, 0.34, 0.4, 0.5, 0.7, 0.82, 0.865, 0.955],\n light: [\n 0.988, 0.968, 0.948, 0.89, 0.85, 0.79, 0.62, 0.54, 0.48, 0.42, 0.27,\n ],\n },\n brightAccent: {\n dark: [0.28, 0.32, 0.4, 0.45, 0.5, 0.53, 0.56, 0.8, 0.86, 0.9, 0.955],\n light: [0.988, 0.968, 0.948, 0.928, 0.89, 0.82, 0.8, 0.6, 0.56, 0.44, 0.27],\n },\n} as const;\n\n// Fraction of the max in-gamut chroma requested at each step. Usage tiers\n// mirror the old HSL generator's 56/82/96 saturation bands: steps 1-3 pale\n// surfaces, 4-6 highlight/message tints, 7-11 interactive fills and text.\nconst relativeChromaCurve: Record<Mode, number[]> = {\n dark: [0.6, 0.68, 0.72, 0.76, 0.78, 0.84, 0.88, 0.88, 0.85, 0.82, 0.86],\n light: [0.5, 0.52, 0.55, 0.6, 0.75, 0.78, 0.92, 0.97, 0.97, 0.97, 0.95],\n};\n\n// Largest OKLCH chroma still inside the sRGB gamut at this lightness/hue.\nexport const maxSrgbChroma = (lightness: number, hue: number): number => {\n let low = 0;\n let high = 0.5;\n for (let i = 0; i < 20; i++) {\n const mid = (low + high) / 2;\n if (new Color(\"oklch\", [lightness, mid, hue]).to(\"srgb\").inGamut()) {\n low = mid;\n } else {\n high = mid;\n }\n }\n return low;\n};\n\nconst toHex = (lightness: number, chroma: number, hue: number): string => {\n const color = new Color(\"oklch\", [lightness, chroma, hue]).to(\"srgb\");\n const hex = color.toGamut({ method: \"css\" }).toString({ format: \"hex\" });\n // colorjs collapses to 3-digit shorthand (#050); expand so appended alpha\n // suffixes (e.g. selection = step + \"40\") stay valid 8-digit hex.\n const full =\n hex.length === 4 ? hex.replace(/^#(.)(.)(.)$/, \"#$1$1$2$2$3$3\") : hex;\n return full.toUpperCase();\n};\n\nexport const createColorScale = (spec: PaletteSpec, mode: Mode): ColorScale => {\n const hueHi = spec.hueHi ?? spec.hue;\n const hueLo = spec.hueLo ?? spec.hue;\n const intensity = spec.intensity ?? 1;\n const ramp = lightnessRamps[spec.type][mode];\n const steps = ramp.map((lightness, index) => {\n const hue = hueLo + (hueHi - hueLo) * lightness;\n const chroma =\n relativeChromaCurve[mode][index]! *\n intensity *\n maxSrgbChroma(lightness, hue);\n return toHex(lightness, chroma, hue);\n });\n return Object.fromEntries(\n steps.map((hex, index) => [index + 1, hex]),\n ) as unknown as ColorScale;\n};\n","/* eslint-disable import-x/extensions */\n// Single source of truth mapping each semantic token to a color-scale step,\n// per mode and accent. Shared by `buildTheme.ts` (emits the CSS variables /\n// themeVariables) and the repo-root `scripts/generate-palette.ts` contrast\n// audit (resolves the steps a token pair actually uses), so the two can never\n// drift. A token resolves to a `{ source, step }` (which palette + which scale\n// step for this mode), a `{ literal }` (a fixed value), or `null` when the\n// token is not emitted for the given accent.\n\nimport type { AccentName } from \"./paletteSpecs.ts\";\n\nexport type { AccentName } from \"./paletteSpecs.ts\";\n\nexport type Mode = \"dark\" | \"light\";\nexport type ScaleNum = 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11;\n\nexport interface TokenStep {\n source: \"grayscale\" | \"self\";\n step: ScaleNum;\n alpha?: string;\n}\nexport interface TokenLiteral {\n literal: string;\n}\nexport type ResolvedToken = TokenLiteral | TokenStep;\n\nexport interface TokenContext {\n mode: Mode;\n isGrayscale: boolean;\n accent: AccentName;\n}\n\nexport type TokenResolver = (ctx: TokenContext) => ResolvedToken | null;\n\n// `self` reads the accent's own palette; `gray` always reads grayscale (base\n// tokens whose value is fixed regardless of accent, e.g. text-muted/on-accent).\nconst step = (\n source: \"grayscale\" | \"self\",\n dark: ScaleNum,\n light: ScaleNum,\n alpha?: string,\n): TokenResolver => {\n return ({ mode }) => {\n const resolved: TokenStep = {\n source,\n step: mode === \"dark\" ? dark : light,\n };\n if (alpha) resolved.alpha = alpha;\n return resolved;\n };\n};\n\nconst self = (dark: ScaleNum, light: ScaleNum = dark, alpha?: string) =>\n step(\"self\", dark, light, alpha);\nconst gray = (dark: ScaleNum, light: ScaleNum = dark) =>\n step(\"grayscale\", dark, light);\n// Branches on both grayscale/colored and dark/light mode.\nconst selfAdaptive =\n (\n grayscaleDark: ScaleNum,\n coloredDark: ScaleNum,\n grayscaleLight: ScaleNum = grayscaleDark,\n coloredLight: ScaleNum = coloredDark,\n ): TokenResolver =>\n ({ isGrayscale, mode }) => ({\n source: \"self\",\n step: (() => {\n if (mode === \"dark\") return isGrayscale ? grayscaleDark : coloredDark;\n return isGrayscale ? grayscaleLight : coloredLight;\n })(),\n });\n\n// Emitted only in the grayscale theme; colored sub-themes inherit the value\n// through the CSS cascade (they never override it).\nconst grayscaleOnly =\n (resolver: TokenResolver): TokenResolver =>\n (ctx) =>\n ctx.isGrayscale ? resolver(ctx) : null;\n\nconst translucent: Record<Mode, string> = {\n dark: \"#1f1e1e55\",\n light: \"#ffffff66\",\n};\n\n// Insertion order is significant: it is the order tokens are emitted into\n// the palette CSS / themeVariables, with the grayscale-only block first.\nexport const tokenScaleMap: Record<string, TokenResolver> = {\n /* grayscale-only base tokens */\n translucent: grayscaleOnly(({ mode }) => ({ literal: translucent[mode] })),\n\n /* grayscale-only backgrounds */\n screen: grayscaleOnly(self(2, 3)),\n highlight: grayscaleOnly(self(4, 1)),\n\n /* grayscale-only texts */\n \"disabled-sharp\": grayscaleOnly(gray(9, 9)),\n \"disabled-muted\": grayscaleOnly(gray(9, 7)),\n \"disabled-interactive\": grayscaleOnly(gray(7, 6)),\n \"disabled-interactive-muted\": grayscaleOnly(gray(4, 4)),\n sharp: grayscaleOnly(gray(10, 11)),\n muted: grayscaleOnly(gray(9, 10)),\n\n /* grayscale-only unsorted */\n \"form-border-disabled\": grayscaleOnly(gray(7, 6)),\n \"form-placeholder\": grayscaleOnly(gray(8, 9)),\n \"form-disabled-text\": grayscaleOnly(gray(9, 10)),\n \"interactive-contained-disabled\": grayscaleOnly(gray(5, 6)),\n \"interactive-outlined-disabled\": grayscaleOnly(gray(6, 6)),\n \"interactive-accent-outlined-disabled\": grayscaleOnly(gray(6, 6)),\n\n /* backgrounds */\n surface: self(3, 2),\n enabled: self(7, 9),\n \"highlight-accent\": self(4),\n lowered: self(1, 4),\n \"screen-gradient-start\": self(3, 4),\n \"screen-gradient-middle\": self(2, 5),\n \"screen-gradient-end\": self(1, 6),\n\n /* borders */\n \"border-muted\": self(7, 5),\n \"border-sharp\": self(8, 9),\n\n /* interactive */\n \"interactive-contained-pressable\": selfAdaptive(6, 6, 1, 9),\n \"interactive-contained-hover\": selfAdaptive(7, 7, 2, 8),\n \"interactive-contained-focus\": selfAdaptive(7, 7, 2, 8),\n \"interactive-contained-active\": selfAdaptive(7, 7, 3, 7),\n\n \"interactive-outlined-pressable\": self(7, 9),\n \"interactive-outlined-hover\": self(8, 7),\n \"interactive-outlined-focus\": self(8, 7),\n \"interactive-outlined-active\": self(8, 7),\n \"interactive-outlined-outline-focus\": self(8, 7),\n\n \"interactive-active\": self(9),\n \"interactive-pressable\": self(10),\n \"interactive-hover\": self(11),\n\n /* texts */\n accent: selfAdaptive(11, 10),\n \"on-accent\": ({ isGrayscale, mode }) => ({\n source: \"grayscale\",\n step: ((): ScaleNum => {\n if (mode === \"dark\") return 11;\n return isGrayscale ? 11 : 1;\n })(),\n }),\n \"on-accent-muted\": selfAdaptive(10, 10, 9, 4),\n\n /* specials */\n selection: self(10, 10, \"40\"),\n};\n\nexport const resolveToken = (\n token: string,\n ctx: TokenContext,\n): ResolvedToken | null => {\n const resolver = tokenScaleMap[token];\n if (!resolver) throw new Error(`Unknown token: ${token}`);\n return resolver(ctx);\n};\n\n// The value a token actually resolves to in a theme, following grayscale-only\n// base tokens into their inherited grayscale value (used by the contrast audit,\n// where e.g. `text-muted` must resolve even on a colored surface).\nexport const resolveTokenEffective = (\n token: string,\n ctx: TokenContext,\n): ResolvedToken => {\n return (\n resolveToken(token, ctx) ??\n resolveToken(token, {\n mode: ctx.mode,\n isGrayscale: true,\n accent: \"grayscale\",\n })!\n );\n};\n","/* eslint-disable import-x/extensions */\n// Assembles resolved color scales + the semantic tokenScaleMap into the two\n// coupled outputs of a theme: the palette CSS (the `@theme` color defaults that\n// generate bg-*/text-*/border-* utilities, plus the twelve `:where(.<theme>)`\n// blocks) and the resolved `themeVariables` map (fully merged per theme so a\n// theme can be applied at any depth in JS). Shared by the internal default\n// build (`scripts/build-css.ts`) and the exposed `generateTheme`.\n\nimport type { AlouetteTheme } from \"../core/AlouetteConfig.ts\";\nimport type { ColorScale } from \"./createColorScale.ts\";\nimport type { AccentName } from \"./paletteSpecs.ts\";\nimport type { Mode, ScaleNum } from \"./tokenScaleMap.ts\";\nimport { tokenScaleMap } from \"./tokenScaleMap.ts\";\n\nexport type ThemeScales = Record<`${AccentName}.${Mode}`, ColorScale>;\n\n// Emit order (grayscale first, then accents) — the order tokens/blocks appear in\n// the generated CSS and themeVariables. Kept explicit so the output is stable\n// regardless of the palette-specs insertion order.\nconst accentEmitOrder: AccentName[] = [\n \"grayscale\",\n \"brand\",\n \"info\",\n \"success\",\n \"warning\",\n \"danger\",\n];\n\nconst colorAt = (\n scales: ThemeScales,\n mode: Mode,\n accentName: AccentName,\n step: ScaleNum,\n): string => scales[`${accentName}.${mode}`][step];\n\n// Resolve every token's scale step to a concrete color for this mode/accent.\n// Grayscale-only tokens resolve to null on colored accents and are skipped\n// (they inherit through the CSS cascade / the merged themeVariables map).\nconst buildThemeVars = (\n scales: ThemeScales,\n mode: Mode,\n accentName: AccentName,\n): Record<string, string> => {\n const isGrayscale = accentName === \"grayscale\";\n const vars: Record<string, string> = {};\n\n for (const [token, resolver] of Object.entries(tokenScaleMap)) {\n const resolved = resolver({ mode, isGrayscale, accent: accentName });\n if (!resolved) continue;\n\n vars[token] =\n \"literal\" in resolved\n ? resolved.literal\n : colorAt(\n scales,\n mode,\n resolved.source === \"grayscale\" ? \"grayscale\" : accentName,\n resolved.step,\n ) + (resolved.alpha ?? \"\");\n }\n\n return vars;\n};\n\nconst emit = (vars: Record<string, string>, indent: string): string =>\n Object.entries(vars)\n .map(([key, value]) => `${indent}--color-${key}: ${value};`)\n .join(\"\\n\");\n\nconst prefixVars = (\n vars: Record<string, string>,\n): Record<`--color-${string}`, string> =>\n Object.fromEntries(\n Object.entries(vars).map(([key, value]) => [`--color-${key}`, value]),\n );\n\nconst accents = accentEmitOrder.filter((name) => name !== \"grayscale\");\n\n/**\n * The palette CSS for a set of scales: the `@theme` color defaults (light\n * grayscale, which generate the color utilities) plus the twelve\n * `:where(.<theme>)` selector blocks. Structural CSS (fonts, spacing, keyframes,\n * utilities) lives in `core.css`, not here.\n */\nexport const buildPaletteCss = (scales: ThemeScales): string => {\n const lightVars = buildThemeVars(scales, \"light\", \"grayscale\");\n const darkVars = buildThemeVars(scales, \"dark\", \"grayscale\");\n\n const baseBlocks = (\n [\n [\"light\", lightVars],\n [\"dark\", darkVars],\n ] as const\n )\n .map(\n ([name, vars]) =>\n ` :where(.${name}, .${name} *) {\\n${emit(vars, \" \")}\\n }`,\n )\n .join(\"\\n\\n\");\n\n const accentBlocks = ([\"light\", \"dark\"] as const)\n .flatMap((mode) =>\n accents.map((accentName) => {\n const vars = buildThemeVars(scales, mode, accentName);\n return ` :where(.${mode}_${accentName}, .${mode}_${accentName} *) {\\n${emit(vars, \" \")}\\n }`;\n }),\n )\n .join(\"\\n\\n\");\n\n return `@theme {\n /* color tokens — light theme as defaults, enabling bg-*, text-*, border-*\n color utilities. Other themes override via the :where(.<theme>) blocks below,\n applied at runtime through ScopedTheme (NativeWind's VariableContextProvider). */\n${emit(lightVars, \" \")}\n}\n\n@layer theme {\n${baseBlocks}\n\n${accentBlocks}\n}\n`;\n};\n\n/**\n * The fully-resolved CSS-variable map for every theme (base mode tokens + accent\n * overrides merged), keyed `--color-*`. Feeds `ScopedTheme` and `useThemeToken`.\n */\nexport const buildThemeVariables = (\n scales: ThemeScales,\n): Record<AlouetteTheme, Record<`--color-${string}`, string>> => {\n const resolved: Record<string, Record<`--color-${string}`, string>> = {\n light: prefixVars(buildThemeVars(scales, \"light\", \"grayscale\")),\n dark: prefixVars(buildThemeVars(scales, \"dark\", \"grayscale\")),\n };\n\n for (const mode of [\"light\", \"dark\"] as const) {\n const base = buildThemeVars(scales, mode, \"grayscale\");\n for (const accent of accents) {\n resolved[`${mode}_${accent}`] = prefixVars({\n ...base,\n ...buildThemeVars(scales, mode, accent),\n });\n }\n }\n\n return resolved;\n};\n","/* eslint-disable import-x/extensions */\n// Public entry: turn per-accent hue params into a theme's two coupled outputs.\n\nimport type { AlouetteTheme } from \"../core/AlouetteConfig.ts\";\nimport type { ThemeScales } from \"./buildTheme.ts\";\nimport { buildPaletteCss, buildThemeVariables } from \"./buildTheme.ts\";\nimport { createColorScale } from \"./createColorScale.ts\";\nimport type { AccentName, PaletteSpec } from \"./paletteSpecs.ts\";\nimport { defaultPaletteSpecs } from \"./paletteSpecs.ts\";\n\nexport interface GenerateThemeResult {\n /**\n * Palette CSS to import after `alouette/core.css`: the `@theme` color defaults\n * (which generate the color utilities — bg-, text-, border-) plus the twelve\n * `:where(.<theme>)` selector blocks.\n */\n css: string;\n /**\n * Resolved CSS-variable map for every theme, to pass to\n * `<AlouetteProvider themeVariables={...}>` so JS token reads (gradients,\n * native Switch, placeholder/SVG tint) match the CSS.\n */\n themeVariables: Record<AlouetteTheme, Record<`--color-${string}`, string>>;\n}\n\n/**\n * Generate a coherent theme for the alouette accents from hue params. Overrides\n * are merged over {@link defaultPaletteSpecs}, so an app can re-color only the\n * accents it cares about (e.g. `brand`) and inherit the rest.\n */\nexport const generateTheme = (\n overrides?: Partial<Record<AccentName, PaletteSpec>>,\n): GenerateThemeResult => {\n const specs: Record<AccentName, PaletteSpec> = {\n ...defaultPaletteSpecs,\n ...overrides,\n };\n\n const scales = Object.fromEntries(\n (Object.keys(specs) as AccentName[]).flatMap((name) => [\n [`${name}.light`, createColorScale(specs[name], \"light\")],\n [`${name}.dark`, createColorScale(specs[name], \"dark\")],\n ]),\n ) as ThemeScales;\n\n return {\n css: buildPaletteCss(scales),\n themeVariables: buildThemeVariables(scales),\n };\n};\n","/* eslint-disable import-x/extensions */\n// Build-script driver: turn palette params into the two files an app imports.\n// Node-only — call it from a script, never from app code.\n\nimport { mkdirSync, writeFileSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport type { GenerateThemeResult } from \"./generateTheme.ts\";\nimport { generateTheme } from \"./generateTheme.ts\";\nimport type { AccentName, PaletteSpec } from \"./paletteSpecs.ts\";\n\nconst generatedHeader = \"/* Generated by alouette writeTheme. DO NOT EDIT. */\";\n\n// Emitted the way a formatter would leave it — unquoted theme keys (hence the\n// camelcase disable in the file header) and trailing commas — so a generated\n// file never churns the first time the app runs prettier/oxfmt over it.\nconst serializeThemeVariables = (\n themeVariables: GenerateThemeResult[\"themeVariables\"],\n): string =>\n `{\\n${Object.entries(themeVariables)\n .map(([theme, variables]) => {\n const entries = Object.entries(variables)\n .map(([name, value]) => ` \"${name}\": \"${value}\",`)\n .join(\"\\n\");\n return ` ${theme}: {\\n${entries}\\n },`;\n })\n .join(\"\\n\")}\\n}`;\n\nexport interface WriteThemeParams {\n /** Directory the two files are written to, created if missing. */\n outDir: string;\n /**\n * Per-accent params merged over the alouette defaults, so only the accents\n * the app re-colors need to be listed. Omit to reproduce the default palette.\n */\n overrides?: Partial<Record<AccentName, PaletteSpec>>;\n cssFileName?: string;\n themeVariablesFileName?: string;\n}\n\nexport interface WriteThemeResult {\n cssPath: string;\n themeVariablesPath: string;\n}\n\n/**\n * Generate an app's palette and write both halves of it to disk: the palette\n * CSS to import after `alouette/core.css`, and the `themeVariables` module to\n * pass to `<AlouetteProvider themeVariables={...}>`. Writing both from one call\n * is what keeps the className tokens and the JS token reads on the same colors.\n */\nexport const writeTheme = ({\n outDir,\n overrides,\n cssFileName = \"palette.css\",\n themeVariablesFileName = \"themeVariables.ts\",\n}: WriteThemeParams): WriteThemeResult => {\n const { css, themeVariables } = generateTheme(overrides);\n\n mkdirSync(outDir, { recursive: true });\n\n const cssPath = join(outDir, cssFileName);\n writeFileSync(\n cssPath,\n `${generatedHeader}\n/* App palette. Import after \"alouette/core.css\", instead of\n \"alouette/global.css\" — which carries alouette's default palette. */\n${css}`,\n );\n\n const themeVariablesPath = join(outDir, themeVariablesFileName);\n writeFileSync(\n themeVariablesPath,\n `${generatedHeader}\n/* eslint-disable camelcase */\nimport type { ThemeVariablesMap } from \"alouette\";\n\n/**\n * Resolved CSS-variable maps for every theme, paired with the generated palette\n * CSS. Pass to \\`<AlouetteProvider themeVariables={...}>\\`.\n */\nexport const themeVariables: ThemeVariablesMap = ${serializeThemeVariables(themeVariables)};\n`,\n );\n\n return { cssPath, themeVariablesPath };\n};\n"],"names":["mkdirSync","join","writeFileSync"],"mappings":"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"}