| 1 | import * as NodeFS from "node:fs"; |
| 2 | |
| 3 | import { |
| 4 | MOBILE_THEME_VARIABLE_NAMES, |
| 5 | type MobileThemeAppearance, |
| 6 | type MobileThemeVariables, |
| 7 | } from "./mobileTheme"; |
| 8 | |
| 9 | export function readDefaultMobileThemeVariables( |
| 10 | appearance: MobileThemeAppearance, |
| 11 | ): MobileThemeVariables { |
| 12 | return readGeneratedMobileThemeVariables(appearance); |
| 13 | } |
| 14 | |
| 15 | export function readGeneratedMobileThemeVariables(themeName: string): MobileThemeVariables { |
| 16 | const stylesheet = NodeFS.readFileSync( |
| 17 | new URL("../../generated-uniwind-themes.css", import.meta.url), |
| 18 | "utf8", |
| 19 | ); |
| 20 | const variant = new RegExp(`@variant ${themeName} \\{([\\s\\S]*?)\\n \\}`, "u").exec( |
| 21 | stylesheet, |
| 22 | )?.[1]; |
| 23 | if (variant === undefined) throw new Error(`Missing generated ${themeName} theme.`); |
| 24 | |
| 25 | return Object.fromEntries( |
| 26 | Array.from(variant.matchAll(/(--color-[a-z0-9-]+):\s*([^;]+);/gu), ([, name, value]) => [ |
| 27 | name, |
| 28 | (value ?? "").trim(), |
| 29 | ]).filter(([name]) => |
| 30 | MOBILE_THEME_VARIABLE_NAMES.includes(name as (typeof MOBILE_THEME_VARIABLE_NAMES)[number]), |
| 31 | ), |
| 32 | ) as MobileThemeVariables; |
| 33 | } |