import { EnableSystemFromOptions, LightOrDark, ThemeNameFromOptions, ThemeOptions, ThemeScriptRuntimeOptions, ThemeState, WithSystem } from './types';
export interface ThemeControllerOptions<TTheme extends string = LightOrDark, TEnableSystem extends boolean = true> extends ThemeOptions<TTheme, TEnableSystem>, ThemeScriptRuntimeOptions<TTheme> {
    disableTransition?: boolean | undefined;
    initial?: ThemeState<TTheme, TEnableSystem> | undefined;
    nonce?: string | undefined;
}
type DefaultThemeControllerOptions<TEnableSystem extends boolean = true> = ThemeControllerOptions<LightOrDark, TEnableSystem>;
type CustomThemeControllerOptions<TTheme extends string, TEnableSystem extends boolean = true> = Omit<ThemeControllerOptions<TTheme, TEnableSystem>, 'themes'> & {
    themes: readonly TTheme[];
};
type ThemeControllerFromOptions<TOptions extends CustomThemeControllerOptions<string, boolean>> = ThemeController<ThemeNameFromOptions<TOptions>, EnableSystemFromOptions<TOptions>>;
export type ThemeControllerSetValue<TTheme extends string = LightOrDark, TEnableSystem extends boolean = true> = WithSystem<TTheme, TEnableSystem> | ((previous: WithSystem<TTheme, TEnableSystem>) => WithSystem<TTheme, TEnableSystem>);
export interface ThemeControllerSnapshot<TTheme extends string = LightOrDark, TEnableSystem extends boolean = true> {
    selected: WithSystem<TTheme, TEnableSystem> | undefined;
    forced: TTheme | undefined;
    resolved: Exclude<TTheme, 'system'> | undefined;
    system: LightOrDark | undefined;
    themes: ReadonlyArray<WithSystem<TTheme, TEnableSystem>>;
}
export interface ThemeController<TTheme extends string = LightOrDark, TEnableSystem extends boolean = true> {
    getSnapshot: () => ThemeControllerSnapshot<TTheme, TEnableSystem>;
    setSelected: (value: ThemeControllerSetValue<TTheme, TEnableSystem>) => void;
    start: () => void;
    stop: () => void;
    subscribe: (listener: () => void) => () => void;
    update: (options: ThemeControllerOptions<TTheme, TEnableSystem>) => void;
}
type ThemeControllerOptionSource<TTheme extends string, TEnableSystem extends boolean> = {
    attribute?: ThemeControllerOptions<TTheme, TEnableSystem>['attribute'] | undefined;
    cookie?: ThemeControllerOptions<TTheme, TEnableSystem>['cookie'] | undefined;
    defaultTheme?: ThemeControllerOptions<TTheme, TEnableSystem>['defaultTheme'] | undefined;
    disableTransition?: boolean | undefined;
    enableColorScheme?: boolean | undefined;
    enableSystem?: ThemeControllerOptions<TTheme, TEnableSystem>['enableSystem'] | undefined;
    forced?: TTheme | undefined;
    initial?: ThemeState<TTheme, TEnableSystem> | undefined;
    nonce?: string | undefined;
    themes?: readonly TTheme[] | undefined;
    valueMap?: ThemeControllerOptions<TTheme, TEnableSystem>['valueMap'] | undefined;
};
export declare const pickThemeControllerOptions: <TTheme extends string, TEnableSystem extends boolean>(options: ThemeControllerOptionSource<TTheme, TEnableSystem>) => ThemeControllerOptions<TTheme, TEnableSystem>;
export declare function createThemeController<const TOptions extends CustomThemeControllerOptions<string, boolean>>(initialOptions: TOptions): ThemeControllerFromOptions<TOptions>;
export declare function createThemeController<TEnableSystem extends boolean = true>(initialOptions?: DefaultThemeControllerOptions<TEnableSystem>): ThemeController<LightOrDark, TEnableSystem>;
export declare function createThemeController<TTheme extends string, TEnableSystem extends boolean = true>(initialOptions: CustomThemeControllerOptions<TTheme, TEnableSystem>): ThemeController<TTheme, TEnableSystem>;
export declare function createThemeController<TTheme extends string = LightOrDark, TEnableSystem extends boolean = true>(initialOptions: ThemeControllerOptions<TTheme, TEnableSystem>): ThemeController<TTheme, TEnableSystem>;
export declare function createThemeController(initialOptions: ThemeControllerOptions<string, boolean>): ThemeController<string, boolean>;
export {};
//# sourceMappingURL=theme-controller.d.ts.map