import * as Y from 'yjs'; export declare const ROOT_TYPE = "Root"; export declare const PAGE_TYPE = "Page"; export declare const SECTION_TYPE = "Section"; export declare const BLOCK_TYPE = "Block"; export declare const WIDGET_TYPE = "Widget"; export declare const getNewPartId: () => string; export interface IPart { type: string; partId: string; properties?: Record; children?: IPart[]; parent?: IPart; getName(): string | undefined; getProperty(propertyName: string): string | undefined; syncPart(element: Y.XmlElement): void; isRoot(): boolean; isPage(): boolean; isSection(): boolean; isBlock(): boolean; isWidget(): boolean; isNestedWidget(): boolean; } export declare class Part implements IPart { readonly type: string; readonly partId: string; properties?: Record; children?: Part[]; parent?: Part; constructor(element?: Y.XmlElement, defaultType?: string); getName(): string | undefined; getProperty(propertyName: string): string | undefined; findPartById(partId: string): IPart | undefined; syncPart(element: Y.XmlElement): void; isRoot(): boolean; isPage(): boolean; isSection(): boolean; isBlock(): boolean; isWidget(): boolean; isNestedWidget(): boolean; private syncProperties; private syncChildren; private findChildById; private createPart; } export interface IRootPart extends IPart { applyChangeEvents(events: Y.YEvent[]): void; } export declare class RootPart extends Part implements IRootPart { constructor(element?: Y.XmlElement); applyChangeEvents(events: Y.YEvent[]): void; applyChangeEvent(event: Y.YEvent): void; private findEventTargets; } export declare class Page extends Part { children?: Block[]; parent?: RootPart; constructor(element: Y.XmlElement); isPage(): boolean; } export declare class Section extends Part { children?: Block[]; parent?: Page; constructor(element: Y.XmlElement); isSection(): boolean; } export declare class Block extends Part { children?: Part[]; parent?: Section; constructor(element: Y.XmlElement); isBlock(): boolean; } export declare class Widget extends Part { children?: Part[]; parent?: Block; constructor(element: Y.XmlElement); isWidget(): boolean; isNestedWidget(): boolean; } export declare class Model { yjsDoc: Y.Doc; yjsRoot: Y.XmlElement; undoManager: Y.UndoManager; rootPart: IRootPart; constructor(); getRootPartId(): string; updateModel(param: ModelUpdateParam): ModelUpdateResult; toXmlString(): string; findPartById(partId?: string): IPart | undefined; findCopyTargetElements(partId: string[]): Y.XmlElement[]; serializePageModelXml: (partIds: string[]) => string; parsePageModelXmlString: (xml: string, removePartId: boolean) => ElementParam[] | undefined; moveElements(partId: string, destPartId: string, destIndex: number, update?: ElementUpdateParam[]): void; isMobilePart(part: IPart): boolean; isPcPart(part: IPart): boolean; private insertElements; private deleteElements; private updateElements; private createElement; private getIndexOfElement; private emitUpdateModelEvent; } export type ElementParam = { nodeName: string; attributes?: Record; children?: ElementParam[]; }; export type ElementResult = { target: Y.XmlElement; partId: string; }; export type ElementInsertParam = { partId: string; index: number; elements: ElementParam[] | Y.XmlElement[]; }; export type ElementUpdateParam = { partId: string; attributes: Record; removeOtherAttributes?: boolean; }; export type ElementUpdateResult = { target: Y.XmlElement; attributes: Record; removeOtherAttributes?: boolean; }; export type ModelUpdateParam = { delete?: string[]; insert?: ElementInsertParam[]; update?: ElementUpdateParam[]; }; export type ModelUpdateResult = { deleted?: ElementResult[]; inserted?: ElementResult[]; updated?: ElementUpdateResult[]; };