/** Inactive and active hex shades of one colour in one theme. */ export interface IPaletteEntry { inactive: string; active: string; } /** Shades per colour id for a single theme. */ export type ThemePalette = { [colourId: string]: IPaletteEntry; }; /** The full palette: shades for both themes. */ export interface IPalette { light: ThemePalette; dark: ThemePalette; } /** Divider contrast magnitude selectable in settings. */ export type DividerContrast = 'low' | 'medium' | 'high'; /** * Target contrast ratio per magnitude. Retuned one notch subtler after live * use (the 1.1.14 ladder read too strong): high is the original 4.0:1 * strength, medium the WCAG non-text minimum, and low a deliberate hairline * BELOW that floor - the divider is an aesthetic aid, not text, so subtlety * on explicit user choice outranks the guideline. Must stay identical to the * dividerContrast enum in schema/plugin.json - the anti-drift test pins the * two together. */ export declare const CONTRAST_TARGETS: { [K in DividerContrast]: number; }; /** * The value if it is a known contrast magnitude, otherwise 'medium'. Guards * the raw settings value the same way mergePalette guards the palette. * Membership is derived from CONTRAST_TARGETS so a new magnitude added there * is accepted without touching this guard. * * @param value - the raw dividerContrast value from the setting registry */ export declare function asDividerContrast(value: unknown): DividerContrast; /** * The canonical palette. Must stay identical to the variable values in * style/base.css and the settings schema defaults - the anti-drift test in * src/__tests__/dynamicStyle.spec.ts pins all three copies together. */ export declare const DEFAULT_PALETTE: IPalette; /** * Deep-merge user settings data over DEFAULT_PALETTE, field by field. * * A user value replaces the default only when it is a 6-digit hex string; * anything else (missing, malformed, wrong type) leaves that field's default * in place. Unknown colour keys are ignored. Never throws, whatever shape the * settings hand over. * * @param user - the raw palette value from the setting registry */ export declare function mergePalette(user: unknown): IPalette; /** * The CSS for the injected style element: variable redefinitions for both * themes and, when enabled, the same-colour divider rules. * * The divider grey is computed from the palette at runtime (never hardcoded) * so user palette edits keep their contrast: darker than the tab colour in the * light theme, brighter in the dark theme, targeting the configured ratio * (CONTRAST_TARGETS[contrast]) against the inactive shade only - the divider * separates pairs of inactive tabs, never the active tab (DEF-7). * * @param palette - the merged palette to emit * @param dynamicDivider - whether to emit the divider rules * @param contrast - divider contrast magnitude; default 'medium' (3.0:1) */ export declare function buildDynamicCss(palette: IPalette, dynamicDivider: boolean, contrast?: DividerContrast): string; /** * Upsert the injected