/**
 * Color scale configuration.
 *
 * @example
 * ```
 * // Minimal — just a seed color
 * { accent: '#0064E0' }
 *
 * // Per-scheme seeds: light palettes from '#0064E0', dark from '#48CAE4'
 * { accent: ['#0064E0', '#48CAE4'] }
 *
 * // With customization
 * { accent: '#B7410E', neutralStyle: 'warm', contrast: 'high' }
 *
 * // Neutral-only — keeps the default accent, themes the neutrals
 * { neutralStyle: 'warm' }
 * ```
 */
export interface ColorScaleConfig {
    /**
     * Seed accent color. Everything derives from this.
     *
     * Either a single hex (#RRGGBB) used for both color schemes, or a
     * `[light, dark]` hex tuple: the light scheme's palettes derive from
     * the light seed and the dark scheme's palettes from the dark seed.
     *
     * Optional. When omitted, the neutral palettes are seeded from the
     * default accent's hue and the accent tokens (--color-accent,
     * --color-accent-muted, --color-on-accent) are not generated — they
     * fall through to colorDefaults.
     */
    accent?: string | [light: string, dark: string];
    /**
     * Neutral tone warmth. Controls how much of the seed's hue bleeds
     * into neutral/background colors.
     * @default 'cool'
     */
    neutralStyle?: 'warm' | 'cool' | 'neutral';
    /**
     * Contrast level. `'high'` pulls text, icons, and borders toward stronger
     * tones (and thickens the subtle border's alpha) so structural and textual
     * boundaries stay perceivable.
     * @default 'standard'
     */
    contrast?: 'standard' | 'high';
}
export type ColorScaleTokens = Record<string, string>;
/**
 * Walk tone in `step` increments from `startTone` until the color reaches
 * `minRatio` against `background`, and return the resulting hex.
 *
 * Used for tokens whose preferred tone is not guaranteed by tone spacing
 * alone (e.g. --color-border-emphasized). Because HCT tone is CIE L*,
 * each step moves luminance monotonically, so the loop always terminates —
 * at worst at pure black/white (21:1 against anything mid-range).
 */
export declare function ensureContrastTone(hue: number, chroma: number, startTone: number, step: -1 | 1, background: string, minRatio: number): string;
/**
 * Expand a color scale config into Astryx color token overrides.
 *
 * Only generates tokens that meaningfully derive from the accent color.
 * Tokens that are convention-bound (status colors, categorical hues,
 * --color-on-dark/on-light) are NOT generated — they fall through
 * to colorDefaults.
 *
 * A `[light, dark]` tuple accent seeds each scheme separately: the light
 * half of every generated `light-dark()` pair comes from the light seed's
 * palettes, the dark half from the dark seed's. A string accent seeds both
 * halves from the same palettes, exactly as before tuples were supported.
 *
 * Without an `accent`, the accent tokens join that fall-through set: the
 * neutrals are seeded from the default accent's hue, and --color-accent,
 * --color-accent-muted and --color-on-accent keep their colorDefaults values.
 *
 * @example
 * ```
 * const tokens = expandColorScale({ accent: '#0064E0' });
 * // tokens['--color-accent'] === 'light-dark(#..., #...)'
 *
 * const perScheme = expandColorScale({ accent: ['#0064E0', '#48CAE4'] });
 * // light half derives from #0064E0, dark half from #48CAE4
 *
 * const neutralOnly = expandColorScale({ neutralStyle: 'warm' });
 * // neutralOnly['--color-accent'] === undefined
 * ```
 */
export declare function expandColorScale(config: ColorScaleConfig): ColorScaleTokens;
//# sourceMappingURL=expandColorScale.d.ts.map