import { MODES, PLATFORMS, PRESETS } from './constants'; export { OVERRIDE_SCHEMA_VERSION, SUPPORTED_OVERRIDE_SCHEMA_VERSIONS, THEME_SCHEMA_VERSION, } from './constants'; // --------------------------------------------------------------------------- // Types // --------------------------------------------------------------------------- /** A DTCG token leaf node. */ export interface TokenValue { $type: string; $value: string | number; $extensions?: Record; } /** Recursive token group — every non-leaf node in a theme object. */ export interface TokenGroup { [key: string]: TokenValue | TokenGroup; } /** The three built-in Forge UI theme presets. */ export type Preset = (typeof PRESETS)[number]; /** Theme metadata stored under `$extensions.com.forge.ui.theme`. */ export interface ThemeMetadata { name: string; preset: Preset; schemaVersion: string; } /** Override metadata stored under `$extensions.com.forge.ui.themeOverride`. */ export interface ThemeOverrideMetadata { basePreset: Preset; schemaVersion: string; } /** * A complete Forge UI theme object (DTCG-compatible). * * Presets (Poise, Prestige, Pulse) are full theme objects. At runtime the * build-time default preset is augmented by FI overrides via * `applyThemeOverride`. */ export type ThemeObject = TokenGroup & { $extensions: { 'com.forge.ui.theme': ThemeMetadata; [key: string]: unknown; }; modes: { light: TokenGroup; dark: TokenGroup; }; platform: { web: TokenGroup; ios: TokenGroup; android: TokenGroup; }; }; export type { ThemeInputs, ThemeSelections, ThemeOverride, TokenReference, LiteralValue, SelectedValue, LinkedSelection, InvariantSelection, ModeSpecificOverride, TokenOverride, TokenOverrides, } from './override/contracts'; export type Mode = (typeof MODES)[number]; export type Platform = (typeof PLATFORMS)[number]; /** * Allowed display font families per preset, consumed by the theme editor for * font selection and by consuming apps for validation. */ export const presetFonts: Record = { poise: ['Crimson Pro', 'Bitter', 'DM Sans'], prestige: ['Libre Caslon Text', 'Cormorant', 'Libre Franklin'], pulse: ['Outfit', 'Manrope', 'Public Sans'], } as const;