UNPKG

grapesjs

Version:

Free and Open Source Web Builder Framework

1,732 lines (1,731 loc) 360 kB
import Backbone from 'backbone'; export interface NOOP { } export type Debounced = Function & { cancel(): void; }; export type SetOptions = Backbone.ModelSetOptions & { avoidStore?: boolean; }; export type AddOptions = Backbone.AddOptions & { temporary?: boolean; }; export type DisableOptions = { fromMove?: boolean; }; export type LocaleOptions = { locale?: boolean; }; export type RemoveOptions = Backbone.Silenceable; export type EventHandler = Backbone.EventHandler; export type ObjectHash = Backbone.ObjectHash; export type ObjectAny = Record<string, any>; export type Nullable = undefined | null | false; export type LiteralUnion<T, U> = T | (U & NOOP); export type Position = { x: number; y: number; }; export interface Coordinates { x: number; y: number; } export interface Dimensions { height: number; width: number; } export interface BoxRect extends Coordinates, Dimensions { } export type ElementRect = { top: number; left: number; width: number; height: number; }; export type CombinedModelConstructorOptions<E, M extends Model<any, any, E> = Model> = Backbone.ModelConstructorOptions<M> & E; export interface ViewOptions<TModel extends Model | undefined = Model, TElement extends Element = HTMLElement> extends Backbone.ViewOptions<TModel, TElement> { } declare class Model<T extends ObjectHash = any, S = SetOptions, E = any> extends Backbone.Model<T, S, E> { } declare class Collection<T extends Model = Model> extends Backbone.Collection<T> { } declare class View<T extends Model | undefined = Model, E extends Element = HTMLElement> extends Backbone.View<T, E> { } export type PickMatching<T, V> = { [K in keyof T as T[K] extends V ? K : never]: T[K]; }; export type ExtractMethods<T> = PickMatching<T, Function>; declare enum CoordinatesTypes { Screen = "screen", World = "world" } export type PrevToNewIdMap = Record<string, string>; export interface SelectorProps { name: string; label?: string; type?: number; active?: boolean; private?: boolean; protected?: boolean; } /** * @typedef Selector * @property {String} name Selector name, eg. `my-class` * @property {String} label Selector label, eg. `My Class` * @property {Number} [type=1] Type of the selector. 1 (class) | 2 (id) * @property {Boolean} [active=true] If not active, it's not selectable by the Style Manager. * @property {Boolean} [private=false] If true, it can't be seen by the Style Manager, but it will be rendered in the canvas and in export code. * @property {Boolean} [protected=false] If true, it can't be removed from the attached component. */ export declare class Selector extends Model<SelectorProps & { [key: string]: unknown; }> { defaults(): { name: string; label: string; type: number; active: boolean; private: boolean; protected: boolean; _undo: boolean; }; static readonly TYPE_CLASS = 1; static readonly TYPE_ID = 2; em: EditorModel; /** * @hideconstructor */ constructor(props: any, opts?: any); isId(): boolean; isClass(): boolean; getFullName(opts?: any): string; /** * Get selector as a string. * @returns {String} * @example * // Given such selector: { name: 'my-selector', type: 2 } * console.log(selector.toString()); * // -> `#my-selector` */ toString(): string; /** * Get selector name. * @returns {String} * @example * // Given such selector: { name: 'my-selector', label: 'My selector' } * console.log(selector.getName()); * // -> `my-selector` */ getName(): string; /** * Get selector label. * @returns {String} * @example * // Given such selector: { name: 'my-selector', label: 'My selector' } * console.log(selector.getLabel()); * // -> `My selector` */ getLabel(): string; /** * Update selector label. * @param {String} label New label * @example * // Given such selector: { name: 'my-selector', label: 'My selector' } * selector.setLabel('New Label') * console.log(selector.getLabel()); * // -> `New Label` */ setLabel(label: string): this; /** * Get selector active state. * @returns {Boolean} */ getActive(): boolean; /** * Update selector active state. * @param {Boolean} value New active state */ setActive(value: boolean): this; toJSON(opts?: {}): any; /** * Escape string * @param {string} name * @return {string} * @private */ static escapeName(name: string): string; } export interface FullNameOptions { combination?: boolean; array?: boolean; } export declare class Selectors extends Collection<Selector> { modelId(attr: any): string; getStyleable(): Selector[]; getValid({ noDisabled }?: any): Selector[]; getFullString(collection?: Selector[] | null, opts?: { sort?: boolean; }): string; getFullName<T extends FullNameOptions>(opts?: T): T["array"] extends true ? string[] : string; } export type StyleProps = Record<string, string | string[]>; export type UpdateStyleOptions = ObjectAny & { partial?: boolean; addStyle?: StyleProps; }; declare class StyleableModel<T extends ObjectHash = any> extends Model<T> { /** * Forward style string to `parseStyle` to be parse to an object * @param {string} str * @returns */ parseStyle(str: string): Record<string, string | string[]>; /** * To trigger the style change event on models I have to * pass a new object instance * @param {Object} prop * @return {Object} */ extendStyle(prop: ObjectAny): ObjectAny; /** * Get style object * @return {Object} */ getStyle(prop?: string | ObjectAny): StyleProps; /** * Set new style object * @param {Object|string} prop * @param {Object} opts * @return {Object} Applied properties */ setStyle(prop?: string | ObjectAny, opts?: UpdateStyleOptions): { [x: string]: any; }; /** * Add style property * @param {Object|string} prop * @param {string} value * @example * this.addStyle({color: 'red'}); * this.addStyle('color', 'blue'); */ addStyle(prop: string | ObjectAny, value?: any, opts?: UpdateStyleOptions): void; /** * Remove style property * @param {string} prop */ removeStyle(prop: string): void; /** * Returns string of style properties * @param {Object} [opts={}] Options * @return {String} */ styleToString(opts?: ObjectAny): string; getSelectors(): Selectors; getSelectorsString(opts?: ObjectAny): any; } export interface DomComponentsConfig { stylePrefix?: string; /** * Could be used for default components. */ components?: Record<string, any>[]; /** * If the component is draggable you can drag the component itself (not only from the toolbar). * @default true */ draggableComponents?: boolean; /** * Experimental: Disable text inner components. * With this option, you're able to decide which inner component inside text should be * disabled (eg. no select, no hover, no layer visibility) once edited. * @default false * @example * // disable all inner childs * disableTextInnerChilds: true, * // disable all except link components * disableTextInnerChilds: (child) => !child.is('link'), */ disableTextInnerChilds?: boolean | ((cmp: Component) => boolean | void); /** * You can setup a custom component definition processor before adding it into the editor. * It might be useful to transform custom objects (es. some framework specific JSX) to GrapesJS component one. * This custom function will be executed on ANY new added component to the editor so make smart checks/conditions * to avoid doing useless executions * By default, GrapesJS supports already elements generated from React JSX preset * @example * processor: (obj) => { * if (obj.$$typeof) { // eg. this is a React Element * const gjsComponent = { * type: obj.type, * components: obj.props.children, * ... * }; * ... * return gjsComponent; * } * } */ processor?: (obj: any) => Record<string, any> | undefined; /** * List of HTML void elements. * https://www.w3.org/TR/2011/WD-html-markup-20110113/syntax.html#void-elements */ voidElements?: string[]; /** * Experimental: Use the frame document for DOM element creation. * This option might be useful when elements require the local document context to * work properly (eg. Web Components). */ useFrameDoc?: boolean; } declare class ComponentWrapper extends Component { get defaults(): { tagName: string; removable: boolean; copyable: boolean; draggable: boolean; components: never[]; traits: never[]; stylable: string[]; }; __postAdd(): void; __postRemove(): void; static isComponent(): boolean; } declare class ModuleModel<TModule extends IBaseModule<any> = Module, T extends ObjectHash = any, S = SetOptions, E = any> extends Model<T, S, E> { private _module; constructor(module: TModule, attributes?: T, options?: CombinedModelConstructorOptions<E>); get module(): TModule; get config(): TModule extends IBaseModule<infer C> ? C : unknown; get em(): EditorModel; } export type ModuleExt<TModel extends ModuleModel> = TModel extends ModuleModel<infer M> ? M : unknown; export type ModelConstructor<TModel extends ModuleModel> = { new (mod: ModuleExt<TModel>, attr: any): TModel; }; declare class ModuleCollection<TModel extends ModuleModel = ModuleModel> extends Collection<TModel> { module: ModuleExt<TModel>; private newModel; add(model: Array<Record<string, any>> | TModel, options?: AddOptions): TModel; add(models: Array<Array<Record<string, any>> | TModel>, options?: AddOptions): TModel[]; constructor(module: ModuleExt<TModel>, models: TModel[] | Array<Record<string, any>>, modelConstructor: ModelConstructor<TModel>); preinitialize(models?: TModel[] | Array<Record<string, any>>, options?: any): void; } export type ModuleFromModel<TModel extends ModuleModel> = TModel extends ModuleModel<infer M> ? M : unknown; export type ModuleModelExt<TItem extends ModuleModel | ModuleCollection> = TItem extends ModuleCollection<infer M> ? ModuleFromModel<M> : TItem extends ModuleModel<infer M> ? M : unknown; declare class ModuleView<TModel extends ModuleModel | ModuleCollection = ModuleModel, TElement extends Element = HTMLElement> extends View<TModel extends ModuleModel ? TModel : undefined, TElement> { protected get pfx(): string; protected get ppfx(): string; collection: TModel extends ModuleModel ? ModuleCollection<ModuleModel> : TModel; protected get module(): ModuleModelExt<TModel>; protected get em(): EditorModel; protected get config(): ModuleModelExt<TModel> extends IBaseModule<infer C> ? C : unknown; className: string; preinitialize(options?: any): void; } export type DragStop = (cancel?: boolean) => void; export type DragContent = (content: any) => void; declare class Droppable { em: EditorModel; canvas: CanvasModule; el: HTMLElement; counter: number; sortOpts?: Record<string, any> | null; over?: boolean; dragStop?: DragStop; dragContent?: DragContent; sorter?: any; constructor(em: EditorModel, rootEl?: HTMLElement); toggleEffects(el: HTMLElement, enable: boolean): void; __customTglEff(enable: boolean): void; startCustom(): void; endCustom(cancel?: boolean): void; /** * This function is expected to be always executed at the end of d&d. */ endDrop(cancel?: boolean, ev?: Event): void; handleDragLeave(ev: Event): void; updateCounter(value: number, ev: Event): void; handleDragEnter(ev: DragEvent | Event): void; handleDragEnd(model: any, dt: any): void; /** * Always need to have this handler active for enabling the drop * @param {Event} ev */ handleDragOver(ev: Event): void; /** * WARNING: This function might fail to run on drop, for example, when the * drop, accidentally, happens on some external element (DOM not inside the iframe) */ handleDrop(ev: Event | DragEvent): void; getContentByData(dt: any): { content: any; }; } export interface PageManagerConfig extends ModuleConfig { pages?: any[]; } export interface SelectableOption { /** * Select the page. */ select?: boolean; } export interface AbortOption { abort?: boolean; } declare enum PagesEvents { /** * @event `page:add` Added new page. The page is passed as an argument to the callback. * @example * editor.on('page:add', (page) => { ... }); */ add = "page:add", addBefore = "page:add:before", /** * @event `page:remove` Page removed. The page is passed as an argument to the callback. * @example * editor.on('page:remove', (page) => { ... }); */ remove = "page:remove", removeBefore = "page:remove:before", /** * @event `page:select` New page selected. The newly selected page and the previous one, are passed as arguments to the callback. * @example * editor.on('page:select', (page, previousPage) => { ... }); */ select = "page:select", selectBefore = "page:select:before", /** * @event `page:update` Page updated. The updated page and the object containing changes are passed as arguments to the callback. * @example * editor.on('page:update', (page, changes) => { ... }); */ update = "page:update", /** * @event `page` Catch-all event for all the events mentioned above. An object containing all the available data about the triggered event is passed as an argument to the callback. * @example * editor.on('page', ({ event, model, ... }) => { ... }); */ all = "page" } export declare class Frames extends ModuleCollection<Frame> { loadedItems: number; itemsToLoad: number; page?: Page; constructor(module: CanvasModule, models?: Frame[] | Array<Record<string, any>>); onAdd(frame: Frame): void; onReset(m: Frame, opts?: { previousModels?: Frame[]; }): void; onRemove(frame: Frame): void; initRefs(): void; itemLoaded(): void; listenToLoad(): void; listenToLoadItems(on: boolean): void; } /** @private */ export interface CssRuleProperties { /** * Array of selectors */ selectors: Selector[]; /** * Object containing style definitions * @default {} */ style?: Record<string, any>; /** * Additional string css selectors * @default '' */ selectorsAdd?: string; /** * Type of at-rule, eg. `media`, 'font-face' * @default '' */ atRuleType?: string; /** * At-rule value, eg. `(max-width: 1000px)` * @default '' */ mediaText?: string; /** * This property is used only on at-rules, like 'page' or 'font-face', where the block containes only style declarations. * @default false */ singleAtRule?: boolean; /** * State of the rule, eg: `hover`, `focused` * @default '' */ state?: string; /** * If true, sets `!important` on all properties. You can also pass an array to specify properties on which to use important. * @default false */ important?: boolean | string[]; /** * Indicates if the rule is stylable from the editor. * @default true */ stylable?: boolean | string[]; /** * Group for rules. * @default '' */ group?: string; /** * If true, the rule won't be stored in JSON or showed in CSS export. * @default false */ shallow?: boolean; } export interface CssRuleJSON extends Omit<CssRuleProperties, "selectors"> { selectors: (string | SelectorProps)[]; } /** * @typedef CssRule * @property {Array<Selector>} selectors Array of selectors * @property {Object} style Object containing style definitions * @property {String} [selectorsAdd=''] Additional string css selectors * @property {String} [atRuleType=''] Type of at-rule, eg. `media`, 'font-face' * @property {String} [mediaText=''] At-rule value, eg. `(max-width: 1000px)` * @property {Boolean} [singleAtRule=false] This property is used only on at-rules, like 'page' or 'font-face', where the block containes only style declarations * @property {String} [state=''] State of the rule, eg: `hover`, `focused` * @property {Boolean|Array<String>} [important=false] If true, sets `!important` on all properties. You can also pass an array to specify properties on which use important * @property {Boolean} [stylable=true] Indicates if the rule is stylable from the editor * * [Device]: device.html * [State]: state.html * [Component]: component.html */ export declare class CssRule extends StyleableModel<CssRuleProperties> { config: CssRuleProperties; em?: EditorModel; opt: any; defaults(): { selectors: never[]; selectorsAdd: string; style: {}; mediaText: string; state: string; stylable: boolean; atRuleType: string; singleAtRule: boolean; important: boolean; group: string; shallow: boolean; _undo: boolean; }; constructor(props: CssRuleProperties, opt?: any); __onChange(m: CssRule, opts: any): void; clone(): CssRule; ensureSelectors(m: any, c: any, opts: any): void; /** * Returns the at-rule statement when exists, eg. `@media (...)`, `@keyframes` * @returns {String} * @example * const cssRule = editor.Css.setRule('.class1', { color: 'red' }, { * atRuleType: 'media', * atRuleParams: '(min-width: 500px)' * }); * cssRule.getAtRule(); // "@media (min-width: 500px)" */ getAtRule(): string; /** * Return selectors of the rule as a string * @param {Object} [opts] Options * @param {Boolean} [opts.skipState] Skip state from the result * @returns {String} * @example * const cssRule = editor.Css.setRule('.class1:hover', { color: 'red' }); * cssRule.selectorsToString(); // ".class1:hover" * cssRule.selectorsToString({ skipState: true }); // ".class1" */ selectorsToString(opts?: ObjectAny): string; /** * Get declaration block (without the at-rule statement) * @param {Object} [opts={}] Options (same as in `selectorsToString`) * @returns {String} * @example * const cssRule = editor.Css.setRule('.class1', { color: 'red' }, { * atRuleType: 'media', * atRuleParams: '(min-width: 500px)' * }); * cssRule.getDeclaration() // ".class1{color:red;}" */ getDeclaration(opts?: ObjectAny): string; /** * Get the Device the rule is related to. * @returns {[Device]|null} * @example * const device = rule.getDevice(); * console.log(device?.getName()); */ getDevice(): any; /** * Get the State the rule is related to. * @returns {[State]|null} * @example * const state = rule.getState(); * console.log(state?.getLabel()); */ getState(): any; /** * Returns the related Component (valid only for component-specific rules). * @returns {[Component]|null} * @example * const cmp = rule.getComponent(); * console.log(cmp?.toHTML()); */ getComponent(): any; /** * Return the CSS string of the rule * @param {Object} [opts={}] Options (same as in `getDeclaration`) * @return {String} CSS string * @example * const cssRule = editor.Css.setRule('.class1', { color: 'red' }, { * atRuleType: 'media', * atRuleParams: '(min-width: 500px)' * }); * cssRule.toCSS() // "@media (min-width: 500px){.class1{color:red;}}" */ toCSS(opts?: ObjectAny): string; toJSON(...args: any): any; /** * Compare the actual model with parameters * @param {Object} selectors Collection of selectors * @param {String} state Css rule state * @param {String} width For which device this style is oriented * @param {Object} ruleProps Other rule props * @returns {Boolean} * @private */ compare(selectors: any, state?: string, width?: string, ruleProps?: Partial<CssRuleProperties>): boolean; } /** @private */ export interface PageProperties { /** * Panel id. */ id?: string; /** * Page name. */ name?: string; /** * HTML to load as page content. */ component?: string | ComponentDefinition | ComponentDefinition[]; /** * CSS to load with the page. */ styles?: string | CssRuleJSON[]; [key: string]: unknown; } export interface PagePropertiesDefined extends Pick<PageProperties, "id" | "name"> { frames: Frames; [key: string]: unknown; } export declare class Page extends Model<PagePropertiesDefined> { defaults(): { name: string; frames: Frames; _undo: boolean; }; em: EditorModel; constructor(props: any, opts?: { em?: EditorModel; config?: PageManagerConfig; }); onRemove(): void; getFrames(): Frames; /** * Get page id * @returns {String} */ getId(): string; /** * Get page name * @returns {String} */ getName(): string; /** * Update page name * @param {String} name New page name * @example * page.setName('New name'); */ setName(name: string): this; /** * Get all frames * @returns {Array<Frame>} * @example * const arrayOfFrames = page.getAllFrames(); */ getAllFrames(): Frame[]; /** * Get the first frame of the page (identified always as the main one) * @returns {Frame} * @example * const mainFrame = page.getMainFrame(); */ getMainFrame(): Frame; /** * Get the root component (usually is the `wrapper` component) from the main frame * @returns {Component} * @example * const rootComponent = page.getMainComponent(); * console.log(rootComponent.toHTML()); */ getMainComponent(): ComponentWrapper; toJSON(opts?: {}): any; } export declare class Canvas extends ModuleModel<CanvasModule> { defaults(): { frame: string; frames: never[]; rulers: boolean; zoom: number; x: number; y: number; scripts: never[]; styles: never[]; pointer: Coordinates; pointerScreen: Coordinates; }; constructor(module: CanvasModule); get frames(): Frames; init(): void; _pageUpdated(page: Page, prev?: Page): void; updateDevice(opts?: any): void; onZoomChange(): void; onCoordsChange(): void; onPointerChange(): void; getPointerCoords(type?: CoordinatesTypes): Coordinates; } export type DraggerPosition = Position & { end?: boolean; }; export type Guide = { x: number; y: number; lock?: number; active?: boolean; }; export interface DraggerOptions { /** * Element on which the drag will be executed. By default, the document will be used */ container?: HTMLElement; /** * Callback on drag start. * @example * onStart(ev, dragger) { * console.log('pointer start', dragger.startPointer, 'position start', dragger.startPosition); * } */ onStart?: (ev: Event, dragger: Dragger) => void; /** * Callback on drag. * @example * onDrag(ev, dragger) { * console.log('pointer', dragger.currentPointer, 'position', dragger.position, 'delta', dragger.delta); * } */ onDrag?: (ev: Event, dragger: Dragger) => void; /** * Callback on drag end. * @example * onEnd(ev, dragger) { * console.log('pointer', dragger.currentPointer, 'position', dragger.position, 'delta', dragger.delta); * } */ onEnd?: (ev: Event, dragger: Dragger, opts: { cancelled: boolean; }) => void; /** * Indicate a callback where to pass an object with new coordinates */ setPosition?: (position: DraggerPosition) => void; /** * Indicate a callback where to get initial coordinates. * @example * getPosition: () => { * // ... * return { x: 10, y: 100 } * } */ getPosition?: () => DraggerPosition; /** * Indicate a callback where to get pointer coordinates. */ getPointerPosition?: (ev: Event) => DraggerPosition; /** * Static guides to be snapped. */ guidesStatic?: () => Guide[]; /** * Target guides that will snap to static one. */ guidesTarget?: () => Guide[]; /** * Offset before snap to guides. * @default 5 */ snapOffset?: number; /** * Document on which listen to pointer events. */ doc?: Document; /** * Scale result points, can also be a function. * @default 1 */ scale?: number | (() => number); } declare class Dragger { opts: DraggerOptions; startPointer: DraggerPosition; delta: DraggerPosition; lastScroll: DraggerPosition; lastScrollDiff: DraggerPosition; startPosition: DraggerPosition; globScrollDiff: DraggerPosition; currentPointer: DraggerPosition; position: DraggerPosition; el?: HTMLElement; guidesStatic: Guide[]; guidesTarget: Guide[]; lockedAxis?: any; docs: Document[]; trgX?: Guide; trgY?: Guide; /** * Init the dragger * @param {Object} opts */ constructor(opts?: DraggerOptions); /** * Update options * @param {Object} options */ setOptions(opts?: Partial<DraggerOptions>): void; toggleDrag(enable?: boolean): void; handleScroll(): void; /** * Start dragging * @param {Event} e */ start(ev: Event): void; /** * Drag event * @param {Event} event */ drag(ev: Event): void; /** * Check if the delta hits some guide */ snapGuides(delta: DraggerPosition): { newDelta: DraggerPosition; trgX: Guide | undefined; trgY: Guide | undefined; }; isPointIn(src: number, trg: number, { offset }?: { offset?: number; }): boolean; setGuideLock(guide: Guide, value: any): Guide; /** * Stop dragging */ stop(ev: Event, opts?: { cancel?: boolean; }): void; keyHandle(ev: Event): void; /** * Move the element * @param {integer} x * @param {integer} y */ move(x: number, y: number, end?: boolean): void; getContainerEl(): HTMLElement[] | Document[]; getWindowEl(): any[]; /** * Returns documents */ getDocumentEl(el?: HTMLElement): Document[]; /** * Get mouse coordinates * @param {Event} event * @return {Object} */ getPointerPos(ev: Event): DraggerPosition; getStartPosition(): { x: number; y: number; }; getScrollInfo(): { y: number; x: number; }; detectAxisLock(x: number, y: number): "x" | "y" | undefined; } export interface ToScreenOption { toScreen?: boolean; } export interface ToWorldOption { toWorld?: boolean; } export interface GetBoxRectOptions extends ToScreenOption { local?: boolean; } export interface CanvasRefreshOptions { /** * Refresh canvas spots. */ spots?: boolean; all?: boolean; } declare enum CanvasEvents { /** * @event `canvas:dragenter` Something is dragged inside the canvas, `DataTransfer` instance passed as an argument. */ dragEnter = "canvas:dragenter", /** * @event `canvas:dragover` Something is dragging on the canvas, `DataTransfer` instance passed as an argument. */ dragOver = "canvas:dragover", /** * @event `canvas:dragend` When a drag operation is ended, `DataTransfer` instance passed as an argument. */ dragEnd = "canvas:dragend", /** * @event `canvas:dragdata` On any dataTransfer parse, `DataTransfer` instance and the `result` are passed as arguments. * By changing `result.content` you're able to customize what is dropped. */ dragData = "canvas:dragdata", /** * @event `canvas:drop` Something is dropped in canvas, `DataTransfer` instance and the dropped model are passed as arguments. */ drop = "canvas:drop", /** * @event `canvas:spot` Spots updated. * @example * editor.on('canvas:spot', () => { * console.log('Spots', editor.Canvas.getSpots()); * }); */ spot = "canvas:spot", /** * @event `canvas:spot:add` New canvas spot added. * @example * editor.on('canvas:spot:add', ({ spot }) => { * console.log('Spot added', spot); * }); */ spotAdd = "canvas:spot:add", /** * @event `canvas:spot:update` Canvas spot updated. * @example * editor.on('canvas:spot:update', ({ spot }) => { * console.log('Spot updated', spot); * }); */ spotUpdate = "canvas:spot:update", /** * @event `canvas:spot:remove` Canvas spot removed. * @example * editor.on('canvas:spot:remove', ({ spot }) => { * console.log('Spot removed', spot); * }); */ spotRemove = "canvas:spot:remove", /** * @event `canvas:coords` Canvas coordinates updated. * @example * editor.on('canvas:coords', () => { * console.log('Canvas coordinates updated:', editor.Canvas.getCoords()); * }); */ coords = "canvas:coords", /** * @event `canvas:zoom` Canvas zoom updated. * @example * editor.on('canvas:zoom', () => { * console.log('Canvas zoom updated:', editor.Canvas.getZoom()); * }); */ zoom = "canvas:zoom", /** * @event `canvas:pointer` Canvas pointer updated. * @example * editor.on('canvas:pointer', () => { * console.log('Canvas pointer updated:', editor.Canvas.getPointer()); * }); */ pointer = "canvas:pointer", /** * @event `canvas:refresh` Canvas was refreshed to update elements on top, * like spots/tools (eg. via `editor.Canvas.refresh()` or on frame resize). * @example * editor.on('canvas:refresh', (canvasRefreshOptions) => { * console.log('Canvas refreshed with options:', canvasRefreshOptions); * }); */ refresh = "canvas:refresh", /** * @event `canvas:frame:load` Frame loaded in canvas. * The event is triggered right after iframe's `onload`. * @example * editor.on('canvas:frame:load', ({ window }) => { * console.log('Frame loaded', window); * }); */ frameLoad = "canvas:frame:load", /** * @event `canvas:frame:load:head` Frame head loaded in canvas. * The event is triggered right after iframe's finished to load the head elemenets (eg. scripts) * @example * editor.on('canvas:frame:load:head', ({ window }) => { * console.log('Frame head loaded', window); * }); */ frameLoadHead = "canvas:frame:load:head", /** * @event `canvas:frame:load:body` Frame body loaded in canvas. * The event is triggered when the body is rendered with components. * @example * editor.on('canvas:frame:load:body', ({ window }) => { * console.log('Frame completed the body render', window); * }); */ frameLoadBody = "canvas:frame:load:body" } declare abstract class ModuleDomainViews<TCollection extends ModuleCollection, TItemView extends ModuleView> extends ModuleView<TCollection> { itemsView: string; protected itemType: string; reuseView: boolean; viewCollection: TItemView[]; constructor(opts?: any, autoAdd?: boolean); /** * Add new model to the collection * @param {ModuleModel} model * @private * */ private addTo; private itemViewNotFound; protected abstract renderView(model: ModuleModel, itemType: string): TItemView; /** * Render new model inside the view * @param {ModuleModel} model * @param {Object} fragment Fragment collection * @private * */ private add; render(): this; onRender(): void; onRemoveBefore(items: TItemView[], opts: any): void; onRemove(items: TItemView[], opts: any): void; remove(opts?: any): this; clearItems(): void; } declare class FramesView extends ModuleDomainViews<Frames, FrameWrapView> { canvasView: CanvasView; private _module; constructor(opts: {} | undefined, config: any); onRemoveBefore(items: FrameWrapView[], opts?: {}): void; onRender(): void; clearItems(): void; protected renderView(item: any, type: string): FrameWrapView; } export interface MarginPaddingOffsets { marginTop?: number; marginRight?: number; marginBottom?: number; marginLeft?: number; paddingTop?: number; paddingRight?: number; paddingBottom?: number; paddingLeft?: number; borderTopWidth?: number; borderRightWidth?: number; borderBottomWidth?: number; borderLeftWidth?: number; } export type ElementPosOpts = { avoidFrameOffset?: boolean; avoidFrameZoom?: boolean; noScroll?: boolean; }; export interface FitViewportOptions { frame?: Frame; gap?: number | { x: number; y: number; }; ignoreHeight?: boolean; el?: HTMLElement; } declare class CanvasView extends ModuleView<Canvas> { template(): string; hlEl?: HTMLElement; badgeEl?: HTMLElement; placerEl?: HTMLElement; ghostEl?: HTMLElement; toolbarEl?: HTMLElement; resizerEl?: HTMLElement; offsetEl?: HTMLElement; fixedOffsetEl?: HTMLElement; toolsGlobEl?: HTMLElement; toolsEl?: HTMLElement; framesArea?: HTMLElement; toolsWrapper?: HTMLElement; spotsEl?: HTMLElement; cvStyle?: HTMLElement; clsUnscale: string; ready: boolean; frames: FramesView; frame?: FrameView; private timerZoom?; private frmOff?; private cvsOff?; constructor(model: Canvas); _onFramesUpdate(): void; _initFrames(): void; checkSelected(component: Component, opts?: { scroll?: ScrollIntoViewOptions; }): void; remove(...args: any): this; preventDefault(ev: Event): void; toggleListeners(enable: boolean): void; screenToWorld(x: number, y: number): Coordinates; onPointer(ev: WheelEvent): void; onKeyPress(ev: KeyboardEvent): void; onWheel(ev: WheelEvent): void; updateFrames(ev: Event): void; updateFramesArea(): void; fitViewport(opts?: FitViewportOptions): void; /** * Checks if the element is visible in the canvas's viewport * @param {HTMLElement} el * @return {Boolean} */ isElInViewport(el: HTMLElement): boolean; /** * Get the offset of the element * @param {HTMLElement} el * @return { {top: number, left: number, width: number, height: number} } */ offset(el?: HTMLElement, opts?: ElementPosOpts): { top: number; left: number; width: number; height: number; }; getRectToScreen(boxRect: Partial<BoxRect>): BoxRect; getElBoxRect(el: HTMLElement, opts?: GetBoxRectOptions): BoxRect; getViewportRect(opts?: ToWorldOption): BoxRect; getViewportDelta(opts?: { withZoom?: number; }): Coordinates; /** * Cleare cached offsets * @private */ clearOff(): void; /** * Return frame offset * @return { {top: number, left: number, width: number, height: number} } * @public */ getFrameOffset(el?: HTMLElement): { top: number; left: number; width: number; height: number; }; /** * Return canvas offset * @return { {top: number, left: number, width: number, height: number} } * @public */ getCanvasOffset(): { top: number; left: number; width: number; height: number; }; /** * Returns element's rect info * @param {HTMLElement} el * @param {object} opts * @return { {top: number, left: number, width: number, height: number, zoom: number, rect: any} } * @public */ getElementPos(el: HTMLElement, opts?: ElementPosOpts): { top: number; left: number; height: number; width: number; zoom: number; rect: { top: number; left: number; width: number; height: number; }; }; /** * Returns element's offsets like margins and paddings * @param {HTMLElement} el * @return { MarginPaddingOffsets } * @public */ getElementOffsets(el: HTMLElement): MarginPaddingOffsets; /** * Returns position data of the canvas element * @return { {top: number, left: number, width: number, height: number} } obj Position object * @public */ getPosition(opts?: any): ElementRect; /** * Update javascript of a specific component passed by its View * @param {ModuleView} view Component's View * @private */ updateScript(view: any): void; /** * Get javascript container * @private */ getJsContainer(view?: ComponentView): HTMLElement | undefined; getFrameView(view?: ComponentView): FrameView | undefined; _renderFrames(): void; renderFrames(): void; render(): this; } declare class FrameWrapView extends ModuleView<Frame> { events(): { "click [data-action-remove]": string; "mousedown [data-action-move]": string; }; elTools?: HTMLElement; frame: FrameView; dragger?: Dragger; cv: CanvasView; classAnim: string; sizeObserver?: ResizeObserver; constructor(model: Frame, canvasView: CanvasView); setupDragger(): void; startDrag(ev?: Event): void; __clear(opts?: any): void; remove(opts?: any): this; updateOffset(): void; updatePos(md?: boolean): void; updateSize(): void; /** * Update dimensions of the frame * @private */ updateDim(): void; onScroll(): void; frameLoaded(): void; __handleSize(): { noChanges: boolean; width: any; height: any; newW: any; newH: any; }; render(): this; } declare class FrameView extends ModuleView<Frame, HTMLIFrameElement> { /** @ts-ignore */ get tagName(): string; /** @ts-ignore */ get attributes(): { allowfullscreen: string; }; dragging: boolean; loaded: boolean; droppable?: Droppable; rect?: DOMRect; lastClientY?: number; lastMaxHeight: number; private jsContainer?; private tools; private wrapper?; private frameWrapView?; constructor(model: Frame, view?: FrameWrapView); getBoxRect(): BoxRect; /** * Update `<head>` content of the frame */ updateHead(): void; getEl(): HTMLIFrameElement; getCanvasModel(): Canvas; getWindow(): Window; getDoc(): Document; getHead(): HTMLHeadElement; getBody(): HTMLBodyElement; getWrapper(): HTMLElement; getJsContainer(): HTMLElement; getToolsEl(): HTMLElement; getGlobalToolsEl(): HTMLElement; getHighlighter(): HTMLElement; getBadgeEl(): HTMLElement; getOffsetViewerEl(): HTMLElement; getRect(): DOMRect; /** * Get rect data, not affected by the canvas zoom */ getOffsetRect(): { top: number; left: number; height: number; width: number; scrollTop: number; scrollLeft: number; scrollBottom: number; scrollRight: number; }; _getTool(name: string): HTMLElement; remove(...args: any): this; startAutoscroll(): void; autoscroll(): void; updateClientY(ev: Event): void; showGlobalTools(): void; stopAutoscroll(): void; _toggleAutoscrollFx(enable: boolean): void; render(): this; renderScripts(): void; renderStyles(opts?: any): void; renderBody(): void; _toggleEffects(enable: boolean): void; _emitUpdate(): void; } export interface CssComposerConfig { /** * Style prefix. * @default 'css-' */ stylePrefix?: string; /** * Default CSS style rules */ rules?: Array<string>; } export declare class CssRules extends Collection<CssRule> { editor: EditorModel; constructor(props: any, opt: any); toJSON(opts?: any): any; onAdd(model: CssRule, c: CssRules, o: any): void; onRemove(removed: CssRule): void; /** @ts-ignore */ add(models: any, opt?: any): any[]; } declare class CssRulesView extends View { atRules: Record<string, any>; config: Record<string, any>; em: EditorModel; pfx: string; renderStarted?: boolean; constructor(o: any); /** * Add to collection * @param {Object} model * @private * */ addTo(model: CssRule): void; /** * Add new object to collection * @param {Object} model * @param {Object} fragmentEl * @return {Object} * @private * */ addToCollection(model: CssRule, fragmentEl?: DocumentFragment): HTMLElement | undefined; getMediaWidth(mediaText: string): string; sortRules(a: number, b: number): number; render(): this; } /** @private */ export interface RuleOptions { /** * At-rule type, eg. `media` */ atRuleType?: string; /** * At-rule parameters, eg. `(min-width: 500px)` */ atRuleParams?: string; } /** @private */ export interface SetRuleOptions extends RuleOptions { /** * If the rule exists already, merge passed styles instead of replacing them. */ addStyles?: boolean; } /** @private */ export interface GetSetRuleOptions { state?: string; mediaText?: string; addOpts?: ObjectAny; current?: boolean; } export type CssRuleStyle = Required<CssRuleProperties>["style"]; declare class CssComposer extends ItemManagerModule<CssComposerConfig & { pStylePrefix?: string; }> { rules: CssRules; rulesView?: CssRulesView; Selectors: typeof Selectors; storageKey: string; /** * Initializes module. Automatically called with a new instance of the editor * @param {Object} config Configurations * @private */ constructor(em: EditorModel); /** * On load callback * @private */ onLoad(): void; /** * Do stuff after load * @param {Editor} em * @private */ postLoad(): void; store(): any; load(data: any): any; /** * Add new rule to the collection, if not yet exists with the same selectors * @param {Array<Selector>} selectors Array of selectors * @param {String} state Css rule state * @param {String} width For which device this style is oriented * @param {Object} props Other props for the rule * @param {Object} opts Options for the add of new rule * @return {Model} * @private * @example * var sm = editor.SelectorManager; * var sel1 = sm.add('myClass1'); * var sel2 = sm.add('myClass2'); * var rule = cssComposer.add([sel1, sel2], 'hover'); * rule.set('style', { * width: '100px', * color: '#fff', * }); * */ add(selectors: any, state?: string, width?: string, opts?: {}, addOpts?: {}): CssRule; /** * Get the rule * @param {String|Array<Selector>} selectors Array of selectors or selector string, eg `.myClass1.myClass2` * @param {String} state Css rule state, eg. 'hover' * @param {String} width Media rule value, eg. '(max-width: 992px)' * @param {Object} ruleProps Other rule props * @return {Model|null} * @private * @example * const sm = editor.SelectorManager; * const sel1 = sm.add('myClass1'); * const sel2 = sm.add('myClass2'); * const rule = cssComposer.get([sel1, sel2], 'hover', '(max-width: 992px)'); * // Update the style * rule.set('style', { * width: '300px', * color: '#000', * }); * */ get(selectors: any, state?: string, width?: string, ruleProps?: Omit<CssRuleProperties, "selectors">): CssRule | undefined; getAll(): CssRules; /** * Add a raw collection of rule objects * This method overrides styles, in case, of already defined rule * @param {String|Array<Object>} data CSS string or an array of rule objects, eg. [{selectors: ['class1'], style: {....}}, ..] * @param {Object} opts Options * @param {Object} props Additional properties to add on rules * @return {Array<Model>} * @private */ addCollection(data: string | CssRuleJSON[], opts?: Record<string, any>, props?: {}): CssRule[]; /** * Add CssRules via CSS string. * @param {String} css CSS string of rules to add. * @returns {Array<[CssRule]>} Array of rules * @example * const addedRules = css.addRules('.my-cls{ color: red } @media (max-width: 992px) { .my-cls{ color: darkred } }'); * // Check rules * console.log(addedRules.map(rule => rule.toCSS())); */ addRules(css: string): CssRule[]; /** * Add/update the CssRule. * @param {String} selectors Selector string, eg. `.myclass` * @param {Object} style Style properties and values. If the rule exists, styles will be replaced unless `addStyles` option is used. * @param {Object} [opts={}] Additional properties. * @param {String} [opts.atRuleType=''] At-rule type, eg. `media`. * @param {String} [opts.atRuleParams=''] At-rule parameters, eg. `(min-width: 500px)`. * @param {Boolean} [opts.addStyles=false] If the rule exists already, merge passed styles instead of replacing them. * @returns {[CssRule]} The new/updated CssRule. * @example * // Simple class-based rule * const rule = css.setRule('.class1.class2', { color: 'red' }); * console.log(rule.toCSS()) // output: .class1.class2 { color: red } * // With state and other mixed selector * const rule = css.setRule('.class1.class2:hover, div#myid', { color: 'red' }); * // output: .class1.class2:hover, div#myid { color: red } * // With media * const rule = css.setRule('.class1:hover', { color: 'red' }, { * atRuleType: 'media', * atRuleParams: '(min-width: 500px)', * }); * // output: `@media (min-width: 500px) { .class1:hover { color: red } }` * * // Update styles of existent rule * css.setRule('.class1', { color: 'red', background: 'red' }); * css.setRule('.class1', { color: 'blue' }, { addStyles: true }); * // output: .class1 { color: blue; background: red } */ setRule(selectors: any, style?: CssRuleProperties["style"], opts?: SetRuleOptions): CssRule; /** * Get the CssRule. * @param {String} selectors Selector string, eg. `.myclass:hover` * @param {Object} [opts={}] Additional properties * @param {String} [opts.atRuleType=''] At-rule type, eg. `media` * @param {String} [opts.atRuleParams=''] At-rule parameters, eg. '(min-width: 500px)' * @returns {[CssRule]} * @example * const rule = css.getRule('.myclass1:hover'); * const rule2 = css.getRule('.myclass1:hover, div#myid'); * const rule3 = css.getRule('.myclass1', { * atRuleType: 'media', * atRuleParams: '(min-width: 500px)', * }); */ getRule(selectors: any, opts?: RuleOptions): CssRule | undefined; /** * Get all rules or filtered by a matching selector. * @param {String} [selector=''] Selector, eg. `.myclass` * @returns {Array<[CssRule]>} * @example * // Take all the component specific rules * const id = someComponent.getId(); * const rules = css.getRules(`#${id}`); * console.log(rules.map(rule => rule.toCSS())) * // All rules in the project * console.log(css.getRules()) */ getRules(selector?: string): CssRule[]; /** * Add/update the CSS rule with id selector * @param {string} name Id selector name, eg. 'my-id' * @param {Object} style Style properties and values * @param {Object} [opts={}] Custom options, like `state` and `mediaText` * @return {CssRule} The new/updated rule * @private * @example * const rule = css.setIdRule('myid', { color: 'red' }); * const ruleHover = css.setIdRule('myid', { color: 'blue' }, { state: 'hover' }); * // This will add current CSS: * // #myid { color: red } * // #myid:hover { color: blue } */ setIdRule(name: string, style?: CssRuleStyle, opts?: GetSetRuleOptions): CssRule; /** * Get the CSS rule by id selector * @param {string} name Id selector name, eg. 'my-id' * @param {Object} [opts={}] Custom options, like `state` and `mediaText` * @return {CssRule} * @private * @example * const rule = css.getIdRule('myid'); * const ruleHover = css.setIdRule('myid', { state: 'hover' }); */ getIdRule(name: string, opts?: GetSetRuleOptions): CssRule | undefined; /** * Add/update the CSS rule with class selector * @param {string} name Class selector name, eg. 'my-class' * @param {Object} style Style properties and values * @param {Object} [opts={}] Custom options, like `state` and `mediaText` * @return {CssRule} The new/updated rule * @private * @example * const rule = css.setClassRule('myclass', { color: 'red' }); * const ruleHover = css.setClassRule('myclass', { color: 'blue' }, { state: 'hover' }); * // This will add current CSS: * // .myclass { color: red } * // .myclass:hover { color: blue } */ setClassRule(name: string, style?: CssRuleStyle, opts?: GetSetRuleOptions): CssRule; /** * Get the CSS rule by class selector * @param {string} name Class selector name, eg. 'my-class' * @param {Object} [opts={}] Custom options, like `state` and `mediaText` * @return {CssRule} * @private * @example * const rule = css.getClassRule('myclass'); * const ruleHover = css.getClassRule('myclass', { state: 'hover' }); */ getClassRule(name: string, opts?: GetSetRuleOptions): CssRule | undefined; /** * Remove rule, by CssRule or matching selector (eg. the selector will match also at-rules like `@media`) * @param {String|[CssRule]|Array<[CssRule]>} rule CssRule or matching selector. * @return {Array<[CssRule]>} Removed rules * @example * // Remove by CssRule * const toRemove = css.getRules('.my-cls'); * css.remove(toRemove); * // Remove by selector * css.remove('.my-cls-2'); */ remove(rule: string | CssRule, opts?: any): CssRule[] | (CssRule & any[]); /** * Remove all rules * @return {this} */ clear(opts?: {}): this; getComponentRules(cmp: Component, opts?: GetSetRuleOptions): CssRule[]; /** * Render the block of CSS rules * @return {HTMLElement} * @private */ render(): HTMLElement; checkId(rule: CssRuleJSON | CssRuleJSON[], opts?: { idMap?: PrevToNewIdMap; }): CssRuleJSON[]; destroy(): void; } declare class ComponentsView extends View { opts: any; config: DomComponentsConfig & { frameView?: FrameView; }; em: EditorModel; parentEl?: HTMLElement; compView: typeof ComponentView; initialize(o: any): void; removeChildren(removed: Component, coll: any, opts?: {}): void; /** * Add to collection * @param {Model} model * @param {Collection} coll * @param {Object} opts * @private * */ addTo(model: Component, coll?: any, opts?: { temporary?: boolean; }): void; /** * Add new object to collection * @param {Object} Model * @param {Object} Fragment collection * @param {Integer} Index of append * * @return {Object} Object rendered * @private * */ addToCollection(model: Component, fragmentEl?: DocumentFragment | null, index?: number): HTMLElement | Text; resetChildren(models: Components, { previousModels }?: { previousModels?: never[] | undefined; }): void; render(parent?: HTMLElement): this; } export type ClbObj = ReturnType<ComponentView["_clbObj"]>; export interface IComponentView extends ExtractMethods<ComponentView> { } export declare class ComponentView<TComp extends Component = Component> extends View</** * Keep this format to avoid errors in TS bundler */ /** @ts-ignore */ TComp> { /** @ts-ignore */ model: TComp; /** @ts-ignore */ className(): any; /** @ts-ignore */ tagName(): string; modelOpt: ComponentOptions; em: EditorModel; opts?: any; pfx?: string; ppfx?: string; attr?: Record<string, any>; classe?: string; config: DomComponentsConfig; childrenView?: ComponentsView; getChildrenSelector?: Function; getTemplate?: Function; scriptContainer?: HTMLElement; preinitialize(opt?: any): void; initialize(opt?: any): void; get __cmpStyleOpts(): GetSetRuleOptions; get frameView(): FrameView; get createDoc(): Document; __isDraggable(): string | boolean | DraggableDroppableFn | undefined; _clbObj(): { editor: Editor; model: TComp; el: HTMLElement; }; /** * Initialize callback */ init(opts: ClbObj): void; /** * Remove callback */ removed(opts: ClbObj): void; /** * On render callback */ onRender(opts: ClbObj): void; /** * Callback executed when the `active` event is triggered on component */ onActive(ev: Event): void; /** * Callback executed when the `disable` event is triggered on component */ onDisable(opts?: DisableOptions): void; remove(): this; handleDragStart(event: Event): false | undefined; initClasses(): void; initComponents(opts?: { avoidRender?: boolean; }): void; /** * Handle any property change * @private */ handleChange(): void; /** * Import, if possible, classes inside main container * @private * */ importClasses(): void; /** * Update item on status change * @param {Event} e * @private * */ updateStatus(opts?: { noExtHl?: boolean; avoidHover?: boolean; }): void; /** * Update highlight attribute * @private * */ updateHighlight(): void; /** * Update style attribute * @private * */ updateStyle(m?: any, v?: any,