import { ReactNode } from "react";
import { TranslationKey } from "../languageHandler";
import { SettingLevel } from "./SettingLevel";
import SettingController from "./controllers/SettingController";
import { WatchManager } from "./WatchManager";
export declare const defaultWatchManager: WatchManager;
export declare enum LabGroup {
    Messaging = 0,
    Profile = 1,
    Spaces = 2,
    Widgets = 3,
    Rooms = 4,
    Threads = 5,
    VoiceAndVideo = 6,
    Moderation = 7,
    Analytics = 8,
    Themes = 9,
    Encryption = 10,
    Experimental = 11,
    Developer = 12
}
export declare enum Features {
    VoiceBroadcast = "feature_voice_broadcast",
    VoiceBroadcastForceSmallChunks = "feature_voice_broadcast_force_small_chunks",
    NotificationSettings2 = "feature_notification_settings2",
    OidcNativeFlow = "feature_oidc_native_flow",
    RustCrypto = "feature_rust_crypto"
}
export declare const labGroupNames: Record<LabGroup, TranslationKey>;
export type SettingValueType = boolean | number | string | number[] | string[] | Record<string, unknown> | Record<string, unknown>[] | null;
export interface IBaseSetting<T extends SettingValueType = SettingValueType> {
    isFeature?: false | undefined;
    /**
     * If true, then the presence of this setting in `config.json` will disable the option in the UI.
     *
     * In other words, we prevent the user overriding the setting if an explicit value is given in `config.json`.
     * XXX:  note that users who have already set a non-default value before `config.json` is update will continue
     * to use that value (and, indeed, won't be able to change it!): https://github.com/element-hq/element-web/issues/26877
     *
     * Obviously, this only really makes sense if `supportedLevels` includes {@link SettingLevel.CONFIG}.
     */
    configDisablesSetting?: true;
    displayName?: TranslationKey | Partial<{
        [level in SettingLevel]: TranslationKey;
    }>;
    description?: TranslationKey | (() => ReactNode);
    supportedLevels: SettingLevel[];
    default: T;
    controller?: SettingController;
    supportedLevelsAreOrdered?: boolean;
    invertedSettingName?: string;
    betaInfo?: {
        title: TranslationKey;
        caption: () => ReactNode;
        faq?: (enabled: boolean) => ReactNode;
        image?: string;
        feedbackSubheading?: TranslationKey;
        feedbackLabel?: string;
        extraSettings?: string[];
        requiresRefresh?: boolean;
    };
    shouldWarn?: boolean;
}
export interface IFeature extends Omit<IBaseSetting<boolean>, "isFeature"> {
    isFeature: true;
    labsGroup: LabGroup;
}
export type ISetting = IBaseSetting | IFeature;
export declare const SETTINGS: {
    [setting: string]: ISetting;
};
