import { IReactionDisposer } from 'mobx';
import type { BaseSyncModel, ConnectionStatus, HybridSyncProviderOptions, PresenceInfo } from '../../../core/src';
export interface SyncElementConfig extends Partial<HybridSyncProviderOptions> {
    room?: string;
    initialValue?: unknown;
    debug?: boolean;
}
export declare abstract class BaseSyncElement<T = unknown, M extends BaseSyncModel<T> = BaseSyncModel<T>> extends HTMLElement {
    protected model: M;
    protected disposers: IReactionDisposer[];
    protected shadow: ShadowRoot;
    protected value: T | null;
    protected connectionStatus: ConnectionStatus;
    protected presence: PresenceInfo;
    constructor();
    connectedCallback(): void;
    disconnectedCallback(): void;
    protected abstract createModel(): M;
    protected abstract render(): void;
    protected setupObservers(): void;
    protected onConnected(): void;
    protected onDisconnected(): void;
    protected onValueChanged(value: T): void;
    protected onConnectionChanged(status: ConnectionStatus): void;
    protected onPresenceChanged(presence: PresenceInfo): void;
    protected setValue(value: T): void;
    protected getValue(): T;
    protected get isSyncConnected(): boolean;
    protected get activeUsers(): number;
    protected get connectionType(): string;
    protected html(strings: TemplateStringsArray, ...values: unknown[]): string;
    protected addStyles(css: string): void;
    protected $(selector: string): Element | null;
    protected $$(selector: string): NodeListOf<Element>;
    protected on(selector: string, event: string, handler: EventListener): void;
    protected emit(eventName: string, detail?: unknown): void;
}
export declare function customElement(tagName: string): (constructor: CustomElementConstructor) => void;
export declare function createSyncElement<T, M extends BaseSyncModel<T>>(tagName: string, ModelClass: new (config?: unknown) => M, config: SyncElementConfig & {
    template: (value: T, element: BaseSyncElement<T, M>) => string;
    styles?: string;
}): typeof BaseSyncElement;
