/// <reference path="../../../../src/@types/@kano/common/index.d.ts" />
/**
 * Defines the save/load logic for a value.
 */
export interface IComponentSerializer {
    /**
     * Transform a live object into a serializable value
     * @param data The initial values defined by the user
     */
    serialize(data: any): any;
    /**
     * Returns a hydrated object from the given value
     * @param data A serialized value
     */
    load(data: any): any;
}
/**
 * Property descriptor. Defines the type and default value for a property
 * This will be used to reset a property when the user's creation stop or when added for the first time
 */
export interface IComponentProperty<T> {
    type: T;
    value: T | (() => T);
    noReset?: boolean;
}
/**
 * Defines a serializer for a data type. That data type will then be able to be save and loaded by the editor
 * @param type The data type targetted by this serializer. e.g. String, Number, Function, MyClass...
 * @param serializer A serializer able to svae and load that specific deata type
 */
export declare function registerTypeSerializer(type: any, serializer: IComponentSerializer): void;
/**
 * A default serializer that handle native JSON types
 */
export declare const defaultSerializer: IComponentSerializer;
/**
 * A null serializer that save nothing, and load nothing.
 * Can be used when a data type for a property must not be exported
 */
export declare const noopSerializer: {
    serialize(): null;
    load(): null;
};
/**
 * Defines a set of properties working together. These properties will be reset when the user's creation stop.
 * This set of properties can be invalidated to notify the part or any piece of Editor UI that a render is required.
 */
export declare class PartComponent {
    invalidated: boolean;
    private _onDidInvalidate;
    private _properties;
    [K: string]: any;
    constructor();
    /**
     * Fires when the component is invalidated. Indicates that the data held by properties has changed since it was last applied
     * @event
     */
    readonly onDidInvalidate: import("@kano/common/index.js").IEvent<void>;
    protected _setupProperties(): void;
    /**
     * Reset all properties to their default values
     */
    reset(): void;
    /**
     * Mark this component as invalidated
     */
    invalidate(): void;
    /**
     * Mark this component as not invalidated. Use after the component data was rendered
     */
    apply(): void;
    static readonly properties: {};
    /**
     * Use the defined serializers for known data types to store all properties values into a serializable JSON object
     */
    serialize(): {
        [K: string]: any;
    };
    /**
     * Re-hydrate properties from a stored state
     * @param data A JSON object containing values for each properties
     */
    load(data: any): void;
    render(ctx: CanvasRenderingContext2D, el: HTMLElement): void;
}
