{"version":3,"file":"deja-js-component-tiles.mjs","sources":["../../../../projects/deja-js/component/tiles/tile.component.ts","../../../../projects/deja-js/component/tiles/tile.component.html","../../../../projects/deja-js/component/tiles/tile-position.directive.ts","../../../../projects/deja-js/component/tiles/tiles-layout.provider.ts","../../../../projects/deja-js/component/tiles/tiles.component.ts","../../../../projects/deja-js/component/tiles/tiles.component.html","../../../../projects/deja-js/component/tiles/tiles-refresh-params.interface.ts","../../../../projects/deja-js/component/tiles/tile.class.ts","../../../../projects/deja-js/component/tiles/tiles.event.ts","../../../../projects/deja-js/component/tiles/index.ts","../../../../projects/deja-js/component/tiles/deja-js-component-tiles.ts"],"sourcesContent":["/*\n *  @license\n *  Copyright Hôpitaux Universitaires de Genève. All Rights Reserved.\n *\n *  Use of this source code is governed by an Apache-2.0 license that can be\n *  found in the LICENSE file at https://github.com/DSI-HUG/dejajs-components/blob/master/LICENSE\n */\n\nimport { BooleanInput } from '@angular/cdk/coercion';\nimport { ChangeDetectionStrategy, ChangeDetectorRef, Component, ElementRef, EventEmitter, Input, Output, TemplateRef } from '@angular/core';\nimport { Destroy } from '@deja-js/component/core';\nimport { debounceTime, delay, filter, take, takeUntil, tap } from 'rxjs';\n\nimport { DejaTile } from './tile.class';\n\n@Component({\n    changeDetection: ChangeDetectionStrategy.OnPush,\n    selector: 'deja-tile',\n    styleUrls: [\n        './tile.component.scss'\n    ],\n    templateUrl: './tile.component.html'\n})\nexport class DejaTileComponent extends Destroy {\n    @Input() public template: TemplateRef<unknown>;\n    // eslint-disable-next-line @angular-eslint/no-output-native\n    @Output() public readonly close = new EventEmitter<Event>();\n\n    public progressDiameter = 100;\n\n    private element: HTMLElement;\n    private _tile: DejaTile;\n\n    public constructor(el: ElementRef, private changeDetectorRef: ChangeDetectorRef) {\n        super();\n        this.element = el.nativeElement as HTMLElement;\n        this.element.setAttribute('hidden', '0');\n    }\n\n    @Input()\n    public set tile(tile: DejaTile) {\n        this._tile = tile;\n\n        if (tile) {\n            const toggleAttribute = (attribute: string, value: BooleanInput): void => {\n                if (value) {\n                    this.element.setAttribute(attribute, value.toString());\n                } else {\n                    this.element.removeAttribute(attribute);\n                }\n            };\n\n            if (tile.fading) {\n                this.element.setAttribute('fading', '0');\n                this.changeDetectorRef.markForCheck();\n            }\n\n            tile.pixelBounds$.pipe(\n                filter(bounds => !!bounds),\n                take(1),\n                filter(() => tile.fading),\n                tap(() => {\n                    this.element.setAttribute('fading', '1');\n                    this.changeDetectorRef.markForCheck();\n                }),\n                delay(200),\n                takeUntil(this.destroyed$)\n            ).subscribe(() => {\n                this.element.removeAttribute('fading');\n                this.changeDetectorRef.markForCheck();\n            });\n\n            tile.pixelBounds$.pipe(\n                filter(bounds => !!bounds),\n                takeUntil(this.destroyed$)\n            ).subscribe(bounds => {\n                if (!tile.isHidden) {\n                    this.element.removeAttribute('hidden');\n                }\n                this.element.style.left = `${bounds.left}px`;\n                this.element.style.top = `${bounds.top}px`;\n                this.element.style.width = `${bounds.width}px`;\n                this.element.style.height = `${bounds.height}px`;\n                this.progressDiameter = Math.min(100, Math.round(Math.max(bounds.width * 0.4, bounds.height * 0.4)));\n                this.changeDetectorRef.markForCheck();\n            });\n\n            tile.pressed$.pipe(\n                tap(value => toggleAttribute('pressed', value)),\n                takeUntil(this.destroyed$)\n            ).subscribe(() => this.changeDetectorRef.markForCheck());\n\n            tile.selected$.pipe(\n                tap(value => toggleAttribute('selected', value)),\n                takeUntil(this.destroyed$)\n            ).subscribe(() => this.changeDetectorRef.markForCheck());\n\n            tile.dragging$.pipe(\n                tap(value => toggleAttribute('drag', value)),\n                takeUntil(this.destroyed$)\n            ).subscribe(() => this.changeDetectorRef.markForCheck());\n\n            tile.dropping$.pipe(\n                tap(value => toggleAttribute('drop', value)),\n                takeUntil(this.destroyed$)\n            ).subscribe(() => this.changeDetectorRef.markForCheck());\n\n            tile.cutted$.pipe(\n                tap(value => toggleAttribute('cutted', value)),\n                takeUntil(this.destroyed$)\n            ).subscribe(() => this.changeDetectorRef.markForCheck());\n\n            tile.deleted$.pipe(\n                tap(() => this.element.remove()),\n                takeUntil(this.destroyed$)\n            ).subscribe(() => this.changeDetectorRef.markForCheck());\n\n            const toggleHide$ = tile.hidden$.pipe(\n                tap(value => toggleAttribute('hidden', value ? '1' : '2')));\n\n            // Hide\n            toggleHide$.pipe(\n                debounceTime(1000),\n                filter(value => value),\n                tap(() => this.element.setAttribute('hidden', '0')),\n                takeUntil(this.destroyed$)\n            ).subscribe(() => this.changeDetectorRef.markForCheck());\n\n            // Show\n            toggleHide$.pipe(\n                debounceTime(1),\n                filter(value => !value),\n                tap(() => this.element.removeAttribute('hidden')),\n                takeUntil(this.destroyed$)\n            ).subscribe(() => this.changeDetectorRef.markForCheck());\n\n            // Refresh\n            tile.refresh$.pipe(\n                debounceTime(1),\n                takeUntil(this.destroyed$)\n            ).subscribe(() => this.changeDetectorRef.markForCheck());\n        }\n    }\n\n    public get tile(): DejaTile {\n        return this._tile;\n    }\n}\n","<ng-template [ngTemplateOutlet]=\"template\" [ngTemplateOutletContext]=\"{ $implicit: tile }\"></ng-template>\n<mat-progress-spinner *ngIf=\"tile && tile.isPending\" mode=\"indeterminate\" [diameter]=\"progressDiameter\" class=\"accent\"></mat-progress-spinner>\n","/*\n *  @license\n *  Copyright Hôpitaux Universitaires de Genève. All Rights Reserved.\n *\n *  Use of this source code is governed by an Apache-2.0 license that can be\n *  found in the LICENSE file at https://github.com/DSI-HUG/dejajs-components/blob/master/LICENSE\n */\n\nimport { Directive, ElementRef, Input } from '@angular/core';\nimport { Rect } from '@deja-js/component/core/graphics';\n\n@Directive({\n    selector: '[deja-tile-position]'\n})\nexport class DejaTilePositionDirective {\n    private element: HTMLElement;\n\n    public constructor(el: ElementRef) {\n        this.element = el.nativeElement as HTMLElement;\n        this.element.style.display = 'none';\n    }\n\n    @Input()\n    public set bounds(rect: Rect) {\n        if (rect) {\n            const { left, top, width, height } = rect;\n            this.element.style.left = `${left}px`;\n            this.element.style.top = `${top}px`;\n            this.element.style.width = `${width}px`;\n            this.element.style.height = `${height}px`;\n            this.element.style.display = 'block';\n        } else {\n            this.element.style.display = 'none';\n        }\n    }\n}\n","/*\n *  @license\n *  Copyright Hôpitaux Universitaires de Genève. All Rights Reserved.\n *\n *  Use of this source code is governed by an Apache-2.0 license that can be\n *  found in the LICENSE file at https://github.com/DSI-HUG/dejajs-components/blob/master/LICENSE\n */\n\n/* eslint-disable rxjs/finnish */\nimport { Injectable, Optional } from '@angular/core';\nimport { DejaClipboardService, Destroy, KeyCodes } from '@deja-js/component/core';\nimport { Directions, Position, Rect, Size } from '@deja-js/component/core/graphics';\nimport { DragCursorInfos } from '@deja-js/component/v2/mouse-dragdrop';\nimport { BehaviorSubject, debounceTime, delay, filter, from, fromEvent, map, mergeWith, of, reduce, Subject, Subscription, switchMap, take, takeUntil, tap, timer } from 'rxjs';\n\nimport { DejaTile } from './tile.class';\nimport { IDejaTilesAddedEvent, IDejaTilesAddEvent, IDejaTilesDeletedEvent, IDejaTilesEvent, IDejaTilesRemoveEvent } from './tiles.event';\nimport { IDejaTilesRefreshParams } from './tiles-refresh-params.interface';\n\n\ninterface ILayoutInfo {\n    id: string;\n    bounds: Rect;\n}\n\ninterface ILayoutInfos {\n    [id: string]: ILayoutInfo | number | Rect;\n    height: number;\n    targetBounds: Rect;\n    validBounds: Rect;\n}\n\nexport interface IDragSelection {\n    startPosition: Position;\n    selectedRect: Rect;\n}\n\nexport interface IDragDropInfos {\n    enabled: boolean;\n    startX: number;\n    startY: number;\n    currentTile: DejaTile;\n    tiles?: Array<DejaTile>;\n}\n\nexport interface ITileDragDropContext {\n    tile: DejaTile;\n}\n\n@Injectable()\nexport class DejaTilesLayoutProvider extends Destroy {\n    public refreshTiles$ = new Subject<IDejaTilesRefreshParams>();\n    public ensureVisible$ = new Subject<string>();\n    public ensureBounds$ = new Subject<Rect>();\n    public dragging$ = new BehaviorSubject<boolean>(false);\n    public dragSelection$ = new Subject<IDragSelection>();\n    public dragDropInfos$ = new Subject<IDragDropInfos>();\n    public selectionRect$ = new Subject<Rect>();\n    public dragover$ = new Subject<DragCursorInfos>();\n    public dragleave$ = new Subject<void>();\n    public deleteTiles$ = new Subject<Array<DejaTile>>();\n    public designMode = false;\n\n    public layoutCompleted = new Subject<IDejaTilesEvent>();\n    public layoutChanged = new Subject<IDejaTilesEvent>();\n    public tilesAdded = new Subject<IDejaTilesAddedEvent>();\n    public tilesDeleted = new Subject<IDejaTilesDeletedEvent>();\n    public selectionChanged = new Subject<IDejaTilesEvent>();\n    public contentAdding = new Subject<IDejaTilesAddEvent>();\n    public contentRemoving = new Subject<IDejaTilesRemoveEvent>();\n\n    protected _tileMinWidth = 10;\n    protected _tileMinWidthUnit = '%';\n    protected _tileMaxWidth = 100;\n    protected _tileMaxWidthUnit = '%';\n    protected _tileMinHeight = 10;\n    protected _tileMinHeightUnit = '%';\n    protected _tileMaxHeight = 100;\n    protected _tileMaxHeightUnit = '%';\n    protected _maxWidth = 100;\n    protected _maxWidthUnit = '%';\n\n    private tilesDic = new Map<string, DejaTile>();\n    private _tiles: Array<DejaTile>;\n    private _cursor: string;\n    private _targetBounds = new Rect();\n    private destination = new Rect();\n    private lastTargetBounds: Rect;\n    private moveTimOut: Subscription;\n    private originalLayout: ILayoutInfos;\n    private validLayout: ILayoutInfos;\n    private dragPageOffset = new Position();\n    private dragOriginalPosition = new Position();\n    private dragRelativePosition: Map<string, Position>;\n    private _container: HTMLElement;\n    private currentTile: DejaTile;\n    private hundredPercentWith: number;\n    private dragTarget: Rect;\n\n    private selectedIds = new Array<string>();\n\n    public constructor(@Optional() private clipboardService: DejaClipboardService) {\n        super();\n\n        this.refreshTiles$.pipe(\n            debounceTime(30),\n            tap(() => {\n                // Size the container\n                this.container.style.width = '';\n                this.container.style.height = '';\n            }),\n            delay(10),\n            takeUntil(this.destroyed$)\n        ).subscribe(params => {\n            const placeAtTheEnd = new Array<DejaTile>();\n\n            const containerBounds = this.container.getBoundingClientRect();\n            if (params?.resetWidth || !this.hundredPercentWith) {\n                this.hundredPercentWith = containerBounds.width;\n            }\n            let height = containerBounds.height;\n            let width = containerBounds.width;\n            let maxWidth = 0;\n            let maxHeight = 0;\n            const tiles = this.tiles || new Array<DejaTile>();\n\n            const selectedTileIds = new Array<string>();\n            tiles.forEach((tile: DejaTile) => {\n                if (tile.percentBounds && !tile.percentBounds.isEmpty()) {\n                    const bounds = this.getPixelBounds(tile.percentBounds);\n                    if (bounds.bottom > maxWidth) {\n                        maxWidth = bounds.right;\n                    }\n                    if (bounds.right > maxHeight) {\n                        maxHeight = bounds.bottom;\n                    }\n                    if (!tile.isDragging) {\n                        tile.pixelBounds = bounds;\n                    }\n                } else {\n                    placeAtTheEnd.push(tile);\n                }\n                if (tile.isSelected && !tile.isHidden) {\n                    selectedTileIds.push(tile.id);\n                }\n                if (tile.pixelBounds && tile.pixelBounds.bottom > height) {\n                    height = tile.pixelBounds.bottom;\n                }\n            });\n\n            let top = maxHeight;\n            let left = 0;\n            placeAtTheEnd.forEach(tile => {\n                tile.percentBounds = tile.percentBounds || new Rect(this.getPercentSize(left), this.getPercentSize(top), 3 * this.getTileMinPercentWidth(), 3 * this.getTileMinPercentHeight());\n                let pixelBounds = this.getPixelBounds(tile.percentBounds);\n\n                if (pixelBounds.right > width) {\n                    top = maxHeight;\n                    left = 0;\n                    tile.percentBounds.left = 0;\n                    tile.percentBounds.top = this.getPercentSize(top);\n                    pixelBounds = this.getPixelBounds(tile.percentBounds);\n                }\n\n                if (pixelBounds.bottom > maxHeight) {\n                    maxHeight = pixelBounds.bottom;\n                }\n\n                tile.pixelBounds = this.getPixelBounds(tile.percentBounds);\n                left += pixelBounds.width;\n            });\n\n            if (this.dragTarget) {\n                const dragBounds = this.getPixelBounds(this.dragTarget);\n                if (height <= dragBounds.bottom) {\n                    height = dragBounds.bottom + dragBounds.height;\n                }\n                if (width <= dragBounds.right) {\n                    width = dragBounds.right + dragBounds.width;\n                }\n            }\n\n            const minHeight = this.getPixelSize(2 * this._tileMinHeight, this._tileMinHeightUnit);\n            if (height < minHeight) {\n                height = minHeight;\n            }\n\n            this.container.style.width = `${width}px`;\n            this.container.style.height = `${height}px`;\n\n            if (params?.ensureVisible) {\n                this.ensureVisible$.next(params.ensureVisible);\n            }\n            if (params?.ensureBounds) {\n                this.ensureBounds$.next(params.ensureBounds);\n            }\n\n            this.selectedTiles = selectedTileIds;\n\n            const event = new CustomEvent('DejaTilesEvent', { cancelable: false }) as IDejaTilesEvent;\n            if (placeAtTheEnd.length > 0) {\n                event.tiles = placeAtTheEnd;\n                this.layoutChanged.next(event);\n            }\n\n            event.tiles = tiles;\n            this.layoutCompleted.next(event);\n        });\n\n        const ensureTile$ = this.ensureVisible$.pipe(\n            delay(1),\n            map(id => this.tilesDic.get(id)),\n            filter(tile => !!tile),\n            map(tile => tile.percentBounds));\n\n        this.ensureBounds$.pipe(\n            mergeWith(ensureTile$),\n            takeUntil(this.destroyed$)\n        ).subscribe(percentBounds => {\n            const { left, right, top, bottom } = this.getPixelBounds(percentBounds);\n\n            const findScrollContainer = (container: HTMLElement): HTMLElement => {\n                // eslint-disable-next-line no-loops/no-loops\n                while (container && container.tagName !== 'DEJA-TILES') {\n                    container = container.parentElement;\n                }\n\n                return container;\n            };\n\n            const scrollContainer = findScrollContainer(this.container);\n            if (!scrollContainer) {\n                return;\n            }\n\n            const containerBounds = this.container.getBoundingClientRect();\n            const scrollBounds = scrollContainer.getBoundingClientRect();\n\n            if (left + containerBounds.left < scrollBounds.bottom) {\n                scrollContainer.scrollLeft += left + containerBounds.left - scrollBounds.bottom;\n            } else if (right + containerBounds.left > scrollBounds.right) {\n                scrollContainer.scrollLeft += right + containerBounds.left - scrollBounds.right;\n            }\n\n            if (top + containerBounds.top < scrollBounds.top) {\n                scrollContainer.scrollTop += top + containerBounds.top - scrollBounds.top;\n            } else if (bottom + containerBounds.top > scrollBounds.bottom) {\n                scrollContainer.scrollTop += bottom + containerBounds.top - scrollBounds.bottom;\n            }\n        });\n\n        this.dragSelection$.pipe(\n            switchMap(dragSelection => {\n                const mouseUp$ = fromEvent<MouseEvent>(this._container.ownerDocument, 'mouseup').pipe(\n                    tap(() => this.selectionRect$.next(null))\n                );\n\n                const mouseMove$ = fromEvent<MouseEvent>(this._container, 'mousemove');\n                return mouseMove$.pipe(\n                    // eslint-disable-next-line rxjs/no-unsafe-takeuntil\n                    takeUntil(mouseUp$),\n                    filter(event => event.buttons === 1),\n                    tap(event => {\n                        const containerBounds = this._container.getBoundingClientRect();\n\n                        // Select all tiles between start position and current position\n                        dragSelection.selectedRect = Rect.fromPoints(dragSelection.startPosition, new Position(event.pageX - containerBounds.left, event.pageY - containerBounds.top));\n                        this.selectionRect$.next(dragSelection.selectedRect);\n\n                        const selection = this.hitTest(dragSelection.selectedRect);\n                        this.selectedTiles = selection.map(tile => tile.id);\n                    })\n                );\n            }),\n            takeUntil(this.destroyed$)\n        ).subscribe();\n\n        const leave$ = this.dragleave$;\n\n        this.dragDropInfos$.pipe(\n            switchMap(dragDropInfos => {\n                const tiles = dragDropInfos && ((dragDropInfos.tiles?.length && dragDropInfos.tiles) || (dragDropInfos.currentTile && [dragDropInfos.currentTile]));\n                if (!tiles) {\n                    return of(null as MouseEvent);\n                }\n\n                const externalDrop = !dragDropInfos.tiles;\n                const mouseMove$ = fromEvent<MouseEvent>(this._container, 'mousemove');\n                const keyUp$ = fromEvent<KeyboardEvent>(this._container.ownerDocument, 'keyup');\n                const escape$ = keyUp$.pipe(filter(event => event.code === KeyCodes.Escape));\n\n                const mouseButtonReleased$ = mouseMove$.pipe(\n                    filter(event => event.buttons !== 1)\n                );\n\n                const cancel$ = leave$.pipe(\n                    mergeWith(mouseButtonReleased$, escape$),\n                    tap(() => {\n                        this.removeTemporaryTile();\n                        this.cancelDrag(tiles);\n                    })\n                );\n\n                const mouseUp$ = fromEvent<MouseEvent>(this._container.ownerDocument, 'mouseup').pipe(\n                    tap(() => this.drop(tiles))\n                );\n\n                const kill$ = mouseUp$.pipe(\n                    mergeWith(cancel$)\n                );\n\n                const dragover$ = this.dragover$.pipe(\n                    map(cursor => cursor.originalEvent)\n                );\n\n                return mouseMove$.pipe(\n                    mergeWith(dragover$),\n                    // eslint-disable-next-line rxjs/no-unsafe-takeuntil\n                    takeUntil(kill$),\n                    tap(event => {\n                        const containerBounds = this._container.getBoundingClientRect();\n                        const x = event.pageX - containerBounds.left;\n                        const y = event.pageY - containerBounds.top;\n                        if (!dragDropInfos.enabled) {\n                            if (Math.abs(dragDropInfos.startX - x) >= 15 || Math.abs(dragDropInfos.startY - y) >= 15) {\n                                if (externalDrop) {\n                                    // Allow drag and drop of new tiles from outside the component\n                                    const tempTile = dragDropInfos.currentTile;\n\n                                    // Clear current selection\n                                    this.selectedTiles = [tempTile.id];\n\n                                    let bounds = tempTile.percentBounds;\n                                    if (!bounds || bounds.isEmpty()) {\n                                        bounds = new Rect(0, 0, 15, 15);\n                                    }\n\n                                    const idealBounds = this.getFreePlace(new Rect(this.getPercentSize(x) - bounds.width / 2, this.getPercentSize(y) - bounds.height / 2, bounds.width, bounds.height));\n                                    dragDropInfos.startX = idealBounds.left - bounds.width / 2;\n                                    dragDropInfos.startY = idealBounds.top - bounds.height / 2;\n\n                                    tempTile.percentBounds = idealBounds;\n                                    tempTile.dragging$.next(true);\n\n                                    this._cursor = 'move';\n\n                                    this.tiles.push(tempTile);\n                                    this.tilesDic.set(tempTile.id, tempTile);\n\n                                    // Start tile drag and drop\n                                    this.dragging$.next(true);\n                                    dragDropInfos.enabled = true;\n                                    this.startDrag(tiles, this.getPixelSize(idealBounds.left + idealBounds.width / 2), this.getPixelSize(idealBounds.top + idealBounds.height / 2));\n\n                                } else {\n                                    // Start tile drag and drop\n                                    this.dragging$.next(true);\n                                    dragDropInfos.enabled = true;\n                                    this.startDrag(tiles, dragDropInfos.startX, dragDropInfos.startY);\n                                }\n\n                            }\n                        } else {\n                            this.drag(tiles, x, y);\n                        }\n                    })\n                );\n            }),\n            takeUntil(this.destroyed$)\n        ).subscribe();\n\n        // Delete stream for clipboard\n        this.deleteTiles$.pipe(\n            takeUntil(this.destroyed$)\n        ).subscribe(tilesToDelete => this.deleteTiles(tilesToDelete));\n    }\n\n    public set container(container: HTMLElement) {\n        this._container = container;\n\n        if (this._container) {\n            const leave$ = fromEvent<MouseEvent>(container, 'mouseleave');\n            const mouseUp$ = fromEvent<MouseEvent>(container.ownerDocument, 'mouseup');\n            const mouseEnter$ = fromEvent<MouseEvent>(container, 'mouseenter');\n\n            // Cursor provider\n            mouseEnter$.pipe(\n                switchMap(() => {\n                    if (this.designMode) {\n                        const leaveCursor$ = leave$.pipe(\n                            tap(() => this.container.style.cursor = '')\n                        );\n\n                        const mouseMove$ = fromEvent<MouseEvent>(container, 'mousemove');\n                        return mouseMove$.pipe(\n                            // eslint-disable-next-line rxjs/no-unsafe-takeuntil\n                            takeUntil(leaveCursor$),\n                            filter(event => !!this.container && event.buttons === 0),\n                            map(event => this._cursor = this.getCursorFromHtmlElement(event.pageX, event.pageY, event.target as HTMLElement))\n                        );\n                    } else {\n                        return of('');\n                    }\n                }),\n                takeUntil(this.destroyed$)\n            ).subscribe(cursor => this.container.style.cursor = cursor);\n\n            mouseEnter$.pipe(\n                switchMap(() => {\n                    const mouseDownEvent$ = fromEvent<MouseEvent>(container, 'mousedown');\n                    const mouseDown$ = mouseDownEvent$.pipe(\n                        filter(event => event.buttons === 1),\n                        filter(event => !this.isElementInsideDejaEditor(event.target as HTMLElement)),\n                        map(event => ({ event: event, clickedTile: this.getTileComponentFromHTMLElement(event.target as HTMLElement) })));\n\n                    // Pressed and selected tile observers\n                    return mouseDown$.pipe(\n                        // eslint-disable-next-line rxjs/no-unsafe-takeuntil\n                        takeUntil(leave$),\n                        switchMap(({ event, clickedTile }) => {\n                            const target = event.target as HTMLElement;\n                            if (this.currentTile) {\n                                this.currentTile.isPressed = false;\n                            }\n                            this.currentTile = clickedTile;\n                            if (this.currentTile) {\n                                this.currentTile.isPressed = true;\n                                if (event.ctrlKey) {\n                                    // Multi-selection is available in design mode, selection on the mouse up\n                                } else {\n                                    if (!this.currentTile.isSelected || this._cursor !== 'move') {\n                                        this.selectedTiles = [this.currentTile.id];\n                                    }\n\n                                    if (this.designMode) {\n                                        const containerBounds = this._container.getBoundingClientRect();\n                                        const x = event.pageX - containerBounds.left;\n                                        const y = event.pageY - containerBounds.top;\n\n                                        this.dragDropInfos$.next({\n                                            enabled: false,\n                                            startX: x,\n                                            startY: y,\n                                            currentTile: this.currentTile,\n                                            tiles: this.tiles.filter(tile => tile.isSelected)\n                                        } as IDragDropInfos);\n                                    }\n                                }\n\n                                return mouseUp$.pipe(\n                                    take(1),\n                                    filter(() => !!this.currentTile)\n                                );\n                            } else if (target === this.container || target.parentElement === this.container) {\n                                if (event.buttons === 1) {\n                                    // Start drag selection\n                                    const containerBounds = this._container.getBoundingClientRect();\n                                    this.dragSelection$.next({ startPosition: new Position(event.pageX - containerBounds.left, event.pageY - containerBounds.top), selectedRect: new Rect() } as IDragSelection);\n                                }\n\n                                // Unselect all tiles\n                                if (this.currentTile) {\n                                    this.currentTile.isPressed = false;\n                                }\n                                this.selectedTiles = [];\n                            }\n\n                            return of(null as MouseEvent);\n                        })\n                    );\n                }),\n                filter(mouseUpEvent => !!mouseUpEvent),\n                takeUntil(this.destroyed$)\n            ).subscribe(mouseUpEvent => {\n                if (this.currentTile.isPressed) {\n                    this.currentTile.isPressed = false;\n                    // Multi-selection\n                    if (mouseUpEvent.ctrlKey) {\n                        this.currentTile.isSelected = !this.currentTile.isSelected;\n                        this.selectedTiles = this.tiles\n                            .filter(tile => tile.isSelected)\n                            .map(tile => tile.id);\n                    }\n                }\n\n                if (this.designMode) {\n                    this._cursor = this.getCursorFromHtmlElement(mouseUpEvent.pageX, mouseUpEvent.pageY, mouseUpEvent.target as HTMLElement);\n                    this.container.style.cursor = this._cursor;\n                }\n\n                this.currentTile = undefined;\n            });\n        }\n    }\n\n    public get container(): HTMLElement {\n        return this._container;\n    }\n\n    public set tiles(tiles: Array<DejaTile>) {\n        this._tiles = tiles;\n        this.tilesDic = this.tiles.reduce((dic, t) => dic.set(t.id, t), new Map<string, DejaTile>());\n        this.refreshTiles$.next({ resetWidth: true });\n    }\n\n    public get tiles(): DejaTile[] {\n        return this._tiles || (this._tiles = new Array<DejaTile>());\n    }\n\n    public set selectedTiles(selectedIds: Array<string>) {\n        const selectedTiles = new Array<DejaTile>();\n        let raiseEvent = false;\n\n        const idsDic = selectedIds.reduce((set, id) => set.add(id), new Set<string>());\n\n        const previousIdsDic = this.selectedIds.reduce((set, id) => set.add(id), new Set<string>());\n\n        if (this.tiles?.length) {\n            this.tiles.forEach((tile: DejaTile) => {\n                if (idsDic.has(tile.id) !== previousIdsDic.has(tile.id)) {\n                    raiseEvent = true;\n                }\n                tile.isSelected = idsDic.has(tile.id);\n                if (tile.isSelected) {\n                    selectedTiles.push(tile);\n                }\n            });\n        } else {\n            raiseEvent = this.selectedIds.length > 0;\n        }\n\n        this.selectedIds = selectedIds;\n\n        if (raiseEvent) {\n            const event = new CustomEvent('DejaTilesAddEvent', { cancelable: false }) as IDejaTilesEvent;\n            event.tiles = selectedTiles;\n            this.selectionChanged.next(event);\n        }\n    }\n\n    public set tileMinWidth(value: string) {\n        this.extractValueAndUnit('_tileMinWidth', value);\n    }\n\n    public set tileMaxWidth(value: string) {\n        this.extractValueAndUnit('_tileMaxWidth', value);\n    }\n\n    public set tileMinHeight(value: string) {\n        this.extractValueAndUnit('_tileMinHeight', value);\n    }\n\n    public set tileMaxHeight(value: string) {\n        this.extractValueAndUnit('_tileMaxHeight', value);\n    }\n\n    public set maxWidth(value: string) {\n        this.extractValueAndUnit('_maxWidth', value);\n    }\n\n    private get targetBounds(): Rect {\n        return this._targetBounds;\n    }\n\n    private set targetBounds(targetBounds: Rect) {\n        this._targetBounds = targetBounds;\n        if (targetBounds) {\n            this.selectionRect$.next(new Rect({\n                height: this.getPixelSize(targetBounds.height || 0),\n                left: this.getPixelSize(targetBounds.left || 0),\n                top: this.getPixelSize(targetBounds.top || 0),\n                width: this.getPixelSize(targetBounds.width || 0)\n            }));\n        } else {\n            this.selectionRect$.next(null);\n        }\n    }\n\n    public copySelection(): DejaTile[] {\n        const selectedTiles = this.tiles.filter(tile => tile.isSelected);\n        if (selectedTiles.length) {\n            this.copyTiles(selectedTiles, false);\n        }\n        return selectedTiles;\n    }\n\n    public cutSelection(): DejaTile[] {\n        const selectedTiles = this.tiles.filter(tile => tile.isSelected);\n        if (selectedTiles.length) {\n            this.copyTiles(selectedTiles, true);\n        }\n        return selectedTiles;\n    }\n\n    public deleteSelection(): DejaTile[] {\n        const selectedTiles = this.tiles.filter(tile => tile.isSelected);\n        if (selectedTiles.length) {\n            this.removeTiles(selectedTiles.map(tile => tile.id));\n        }\n        return selectedTiles;\n    }\n\n    public paste(): DejaTile[] {\n        if (!this.clipboardService || !this.clipboardService.isAvailable('tiles')) {\n            return new Array<DejaTile>();\n        }\n\n        const sourceTiles = this.clipboardService.get('tiles') as Array<DejaTile>;\n\n        // Unselect all tiles\n        this.tiles.forEach(tile => tile.isSelected = false);\n\n        // Get max rectangle\n        let bounds: Rect;\n        sourceTiles.forEach(tile => {\n            bounds = bounds ? Rect.union(bounds, tile.percentBounds) : new Rect(tile.percentBounds);\n        });\n\n        const targetBounds = this.getFreePlace(new Rect(0, 0, bounds.width, bounds.height));\n\n        const newTiles = sourceTiles.map(tile => {\n            const newTile = tile.clone();\n            newTile.percentBounds = new Rect(targetBounds.left + tile.percentBounds.left - bounds.left, targetBounds.top + tile.percentBounds.top - bounds.top, tile.percentBounds.width, tile.percentBounds.height);\n            newTile.isSelected = true;\n            return newTile;\n        });\n\n        this.addTiles(newTiles);\n\n        return newTiles;\n    }\n\n    // eslint-disable-next-line @typescript-eslint/naming-convention\n    public getTileElementFromHTMLElement(element: HTMLElement): HTMLElement {\n        let tileElement = element;\n\n        // eslint-disable-next-line no-loops/no-loops\n        while (tileElement && tileElement.tagName !== 'DEJA-TILE') {\n            tileElement = tileElement.parentElement;\n            if (tileElement === this.container) {\n                return undefined;\n            }\n        }\n\n        if (tileElement?.parentElement !== this.container) {\n            return undefined; // For nested tiles components\n        }\n\n        return tileElement;\n    }\n\n    public isElementInsideDejaEditor(element: HTMLElement): boolean {\n        let tileElement = element;\n\n        // eslint-disable-next-line no-loops/no-loops\n        while (tileElement && tileElement !== this.container) {\n            if (tileElement.tagName === 'DEJA-EDITOR') {\n                return true;\n            }\n            tileElement = tileElement.parentElement;\n        }\n\n        return false;\n    }\n\n    // eslint-disable-next-line @typescript-eslint/naming-convention\n    public getTileComponentFromHTMLElement(element: HTMLElement): DejaTile {\n        const tileElement = this.getTileElementFromHTMLElement(element);\n        return tileElement && this.tilesDic.get(tileElement.id);\n    }\n\n    public deleteTiles(tilesToDelete: Array<DejaTile>): void {\n        if (!tilesToDelete || tilesToDelete.length === 0) {\n            return;\n        }\n\n        // For event after removed finished\n        const event = new CustomEvent('DejaTilesDeletedEvent', { cancelable: false }) as IDejaTilesDeletedEvent;\n        event.tiles = tilesToDelete;\n\n        tilesToDelete.forEach(tile => {\n            this.tilesDic.delete(tile.id);\n            tile.delete();\n        });\n\n        let index = this.tiles.length;\n        // eslint-disable-next-line no-loops/no-loops\n        while (--index >= 0) {\n            const tile = this.tiles[index];\n            if (!this.tilesDic.has(tile.id)) {\n                this.tiles.splice(index, 1);\n            }\n        }\n\n        this.refreshTiles$.next({ resetWidth: true });\n\n        event.tiles = this.tiles;\n        this.tilesDeleted.next(event);\n    }\n\n    public removeTiles(tileIdsToRemove: Array<string>): void {\n        if (!tileIdsToRemove || tileIdsToRemove.length === 0) {\n            return;\n        }\n\n        const tilesToRemove = tileIdsToRemove.map(id => this.tilesDic.get(id));\n\n        // Delete selected tiles components\n        tilesToRemove.forEach(tile => {\n            tile.isHidden = true;\n        });\n\n        const event = new CustomEvent('DejaTilesRemoveEvent', { cancelable: true }) as IDejaTilesRemoveEvent;\n        event.tiles = this.tiles;\n        event.removed = tilesToRemove;\n        event.cancel$ = new Subject<void>();\n\n        const cancelSubscription = event.cancel$.pipe(\n            take(1),\n            takeUntil(this.destroyed$)\n        ).subscribe(value => {\n            if (value) {\n                tilesToRemove.forEach(tile => tile.isHidden = false);\n            } else {\n                this.deleteTiles(tilesToRemove);\n            }\n        });\n\n        // Forward event\n        this.contentRemoving.next(event);\n\n        // Remove immediately\n        if (!event.defaultPrevented) {\n            cancelSubscription.unsubscribe();\n            this.deleteTiles(tilesToRemove);\n        }\n    }\n\n    public getFreePlace(idealBounds: Rect): Rect {\n        const freePlaces = new Array<Rect>();\n\n        const tiles = this.tiles.filter(t => !t.isDragging);\n\n        let maxHeight = 0;\n        tiles.forEach(t => {\n            if (t.percentBounds.bottom > maxHeight) {\n                maxHeight = t.percentBounds.bottom;\n            }\n        });\n\n        // eslint-disable-next-line no-loops/no-loops\n        for (let x = 0; x <= this._maxWidth - idealBounds.width; x += this._tileMinWidth) {\n            // eslint-disable-next-line no-loops/no-loops\n            for (let y = 0; y <= maxHeight - idealBounds.height; y += this._tileMinHeight) {\n                const currentBounds = new Rect(x, y, idealBounds.width, idealBounds.height);\n\n                if (!tiles.find(t => t.percentBounds.intersectWith(currentBounds))) {\n                    freePlaces.push(currentBounds);\n                }\n            }\n        }\n\n        if (freePlaces.length > 0) {\n            // add at the nearest free place\n            freePlaces.sort((bounds1, bounds2) => {\n                const calcDistance = (bounds: Rect): number => Math.min(Math.abs(bounds.left - idealBounds.left), Math.abs(bounds.right - idealBounds.right)) + 200 * Math.min(Math.abs(bounds.top - idealBounds.top), Math.abs(bounds.bottom - idealBounds.bottom));\n                return calcDistance(bounds1) - calcDistance(bounds2);\n            });\n\n            return freePlaces[0];\n        }\n\n        // Add at the end\n        return new Rect(0, maxHeight, idealBounds.width, idealBounds.height);\n    }\n\n    public moveTile(id: string, bounds: Rect): void {\n        const tile = this.tiles.find(t => t.id === id);\n        if (tile) {\n            tile.percentBounds = bounds;\n            this.refreshTiles$.next(null);\n        }\n    }\n\n    public hitTest(pixelBounds: Rect): DejaTile[] {\n        const percentBounds = new Rect(this.getPercentSize(pixelBounds.left), this.getPercentSize(pixelBounds.top), this.getPercentSize(pixelBounds.width), this.getPercentSize(pixelBounds.height));\n        return this.tiles.filter(t => t.percentBounds.intersectWith(percentBounds));\n    }\n\n    public getPercentSize(value: number): number {\n        return Math.round(value * 100 / this.hundredPercentWith);\n    }\n\n    // Drag and drop from outside provider\n    public dragEnter(dragContext: ITileDragDropContext, dragCursor: DragCursorInfos): boolean {\n        if (!this.designMode || !this._container) {\n            return false;\n        }\n\n        const tile = dragContext.tile;\n        if (!tile) {\n            return false;\n        }\n\n        const containerBounds = this._container.getBoundingClientRect();\n        const { pageX, pageY } = dragCursor.originalEvent;\n\n        const x = pageX - containerBounds.left;\n        const y = pageY - containerBounds.top;\n\n        // Create a temporary tile for drag and drop\n        const tempTile = tile.clone();\n        tempTile.isTemporary = true;\n\n        this.dragDropInfos$.next({\n            enabled: false,\n            startX: x,\n            startY: y,\n            currentTile: tempTile\n        } as IDragDropInfos);\n\n        return true;\n    }\n\n    public startDrag(tiles: Array<DejaTile>, pageX: number, pageY: number): void {\n        // Save layout\n        const savedLayout = this.saveLayout();\n\n        // Bring all tiles together\n        let targetBounds: Rect;\n        tiles.forEach(tile => {\n            targetBounds = targetBounds ? Rect.union(targetBounds, tile.percentBounds) : tile.percentBounds;\n            tile.isDragging = true;\n        });\n\n        this.dragRelativePosition = new Map<string, Position>();\n        tiles.forEach(tile => this.dragRelativePosition.set(tile.id, new Position(tile.percentBounds.left - targetBounds.left, tile.percentBounds.top - targetBounds.top)));\n\n        this.dragPageOffset = new Position(pageX, pageY);\n\n        this.dragOriginalPosition = new Position(targetBounds.left, targetBounds.top);\n\n        this.targetBounds = savedLayout.targetBounds = savedLayout.validBounds = targetBounds;\n        this.originalLayout = savedLayout;\n        this.validLayout = undefined;\n    }\n\n    public cancelDrag(tiles: Array<DejaTile>): void {\n        this.clearMoveTimer();\n\n        from(tiles).pipe(\n            filter(tile => !!tile),\n            takeUntil(this.destroyed$)\n        ).subscribe(tile => {\n            tile.isDragging = false;\n            tile.isDropping = true;\n        });\n\n        // Restore original layout\n        if (this.originalLayout) {\n            this.restoreLayout(this.originalLayout);\n        }\n\n        this.endDrag();\n    }\n\n    public drop(tiles: Array<DejaTile>): DejaTile[] {\n        let changed: Array<DejaTile>;\n        this.clearMoveTimer();\n\n        if (this.validLayout) {\n            this.restoreLayout(this.validLayout);\n\n            if (this._cursor !== 'move') {\n                // Only one tile can be resized at time\n                const tile = tiles[0];\n                tile.percentBounds = new Rect(this.validLayout.validBounds);\n                tile.isDragging = false;\n            } else {\n                from(tiles).pipe(\n                    filter(tile => !!tile),\n                    tap(tile => {\n                        const left = this.validLayout.validBounds.left + this.dragRelativePosition.get(tile.id).left;\n                        const top = this.validLayout.validBounds.top + this.dragRelativePosition.get(tile.id).top;\n                        tile.percentBounds = new Rect(left, top, tile.percentBounds.width, tile.percentBounds.height);\n                        tile.isDragging = false;\n                        tile.isDropping = true;\n                        if (tile.isTemporary) {\n                            this.tilesDic.delete(tile.id);\n                            tile.makeId();\n                            this.tilesDic.set(tile.id, tile);\n                            this.addTiles([tile]);\n                        }\n                    }),\n                    delay(1000),\n                    takeUntil(this.destroyed$)\n                ).subscribe(tile => tile.isDropping = false);\n            }\n\n            changed = this.tiles.filter(t => {\n                const layoutInfo = this.originalLayout[t.id] as ILayoutInfo;\n                return !Rect.equals(t.percentBounds, layoutInfo?.bounds);\n            });\n            this.endDrag();\n        } else {\n            this.removeTemporaryTile();\n            this.cancelDrag(tiles);\n        }\n\n        if (changed) {\n            const event = new CustomEvent('DejaTilesEvent', { cancelable: true }) as IDejaTilesEvent;\n            event.tiles = this.tiles;\n            this.layoutChanged.next(event);\n        }\n\n        return changed;\n    }\n\n    public endDrag(): void {\n        this.originalLayout = undefined;\n        this.validLayout = undefined;\n        this.targetBounds = undefined;\n        this.dragging$.next(false);\n        this.dragDropInfos$.next(null);\n        this.dragTarget = undefined;\n        this.copyTiles(null);\n        this.refreshTiles$.next(null);\n    }\n\n    public drag(tiles: Array<DejaTile>, pageX: number, pageY: number): void {\n        // Search related coords\n        const offset = new Position(pageX - this.dragPageOffset.left, pageY - this.dragPageOffset.top);\n        const offsetLeft = offset.left + this.getPixelSize(this.dragOriginalPosition.left);\n        const offsetTop = offset.top + this.getPixelSize(this.dragOriginalPosition.top);\n\n        const sizeMin = this.getTileMinPixelSize();\n        const sizeMax = this.getTileMaxPixelSize();\n\n        if (this._cursor !== 'move') {\n            // Only one tile can be resized at time\n            const tile = tiles[0];\n            const bounds = this.getPixelBounds(tile.percentBounds);\n            const offsetRight = offsetLeft + bounds.width;\n            const offsetBottom = offsetTop + bounds.height;\n            const right = bounds.right;\n            const bottom = bounds.bottom;\n            switch (this._cursor) {\n                case 'nw-resize':\n                    bounds.left = Math.max(Math.min(offsetLeft, bounds.right - sizeMin.width), bounds.right - sizeMax.width);\n                    bounds.right = right;\n                    bounds.top = Math.max(Math.min(offsetTop, bounds.bottom - sizeMin.height), bounds.bottom - sizeMax.height);\n                    bounds.bottom = bottom;\n                    this.size(tile, new Position(offsetLeft, offsetTop), Directions.left + Directions.top);\n                    break;\n                case 'sw-resize':\n                    bounds.left = Math.max(Math.min(offsetLeft, bounds.right - sizeMin.width), bounds.right - sizeMax.width);\n                    bounds.right = right;\n                    bounds.bottom = Math.max(Math.min(offsetBottom, bounds.top + sizeMax.height), bounds.top + sizeMin.height);\n                    this.size(tile, new Position(offsetLeft, offsetBottom), Directions.left + Directions.bottom);\n                    break;\n                case 'w-resize':\n                    bounds.left = Math.max(Math.min(offsetLeft, bounds.right - sizeMin.width), bounds.right - sizeMax.width);\n                    bounds.right = right;\n                    this.size(tile, new Position(offsetLeft, 0), Directions.left);\n                    break;\n                case 'ne-resize':\n                    bounds.right = Math.max(Math.min(offsetRight, bounds.left + sizeMax.width), bounds.left + sizeMin.width);\n                    bounds.top = Math.max(Math.min(offsetTop, bounds.bottom - sizeMin.height), bounds.bottom - sizeMax.height);\n                    bounds.bottom = bottom;\n                    this.size(tile, new Position(offsetRight, offsetTop), Directions.right + Directions.top);\n                    break;\n                case 'se-resize':\n                    bounds.right = Math.max(Math.min(offsetRight, bounds.left + sizeMax.width), bounds.left + sizeMin.width);\n                    bounds.bottom = Math.max(Math.min(offsetBottom, bounds.top + sizeMax.height), bounds.top + sizeMin.height);\n                    this.size(tile, new Position(offsetRight, offsetBottom), Directions.right + Directions.bottom);\n                    break;\n                case 'e-resize':\n                    bounds.right = Math.max(Math.min(offsetRight, bounds.left + sizeMax.width), bounds.left + sizeMin.width);\n                    this.size(tile, new Position(offsetRight, 0), Directions.right);\n                    break;\n                case 'n-resize':\n                    bounds.top = Math.max(Math.min(offsetTop, bounds.bottom - sizeMin.height), bounds.bottom - sizeMax.height);\n                    bounds.bottom = bottom;\n                    this.size(tile, new Position(0, offsetTop), Directions.top);\n                    break;\n                case 's-resize':\n                    bounds.bottom = Math.max(Math.min(offsetBottom, bounds.top + sizeMax.height), bounds.top + sizeMin.height);\n                    this.size(tile, new Position(0, offsetBottom), Directions.bottom);\n                    break;\n                default:\n                // throw new Error('Invalid direction');\n            }\n            tile.pixelBounds = bounds;\n\n        } else {\n            tiles.forEach(tile => {\n                tile.pixelBounds = new Rect(offsetLeft + this.getPixelSize(this.dragRelativePosition.get(tile.id).left), offsetTop + this.getPixelSize(this.dragRelativePosition.get(tile.id).top), this.getPixelSize(tile.percentBounds.width), this.getPixelSize(tile.percentBounds.height));\n            });\n\n            // Assign new drag and drop rectangle\n            this.dragTarget = new Rect(this.getPercentSize(offsetLeft), this.getPercentSize(offsetTop), this.targetBounds.width, this.targetBounds.height);\n\n            this.move();\n        }\n    }\n\n    public addTiles(newTiles: Array<DejaTile>): void {\n        if (!newTiles || newTiles.length === 0) {\n            return;\n        }\n\n        newTiles.forEach(newTile => {\n            if (!this.tiles.find(t => t.id === newTile.id)) {\n                if (this.tiles.find(t => newTile.percentBounds && t.percentBounds?.intersectWith(newTile.percentBounds))) {\n                    newTile.percentBounds = undefined;\n                }\n\n                if (!newTile.percentBounds) {\n                    newTile.percentBounds = this.getFreePlace(newTile.idealBounds);\n                }\n\n                this.tiles.push(newTile);\n                this.tilesDic.set(newTile.id, newTile);\n            }\n        });\n\n        const event = new CustomEvent('DejaTilesAddEvent', { cancelable: true }) as IDejaTilesAddEvent;\n        event.tiles = this.tiles;\n        event.added = newTiles;\n        event.cancel$ = new Subject<void>();\n\n        // Delete provider if cut operation\n        const deleteSourceProvider$ = this.clipboardService?.get('tiles-provider') as Subject<Array<DejaTile>>;\n\n        // Hide originals if cut\n        let sourceTiles: Array<DejaTile>;\n        if (deleteSourceProvider$) {\n            sourceTiles = this.clipboardService.get('tiles') as Array<DejaTile>;\n            sourceTiles.forEach(tile => {\n                tile.isHidden = true;\n            });\n        }\n\n        const deleteSourceTiles = (): void => {\n            if (sourceTiles) {\n                deleteSourceProvider$.next(sourceTiles);\n                this.clipboardService.clear();\n            }\n        };\n\n        const validateNewTiles = (tiles: Array<DejaTile>): void => {\n            // Remove original tiles if cut operation\n            deleteSourceTiles();\n\n            const e = new CustomEvent('DejaTileAddedEvent', { cancelable: false }) as IDejaTilesAddedEvent;\n            e.tiles = this.tiles;\n            e.added = tiles;\n            this.tilesAdded.next(e);\n        };\n\n        // Get total rectangle\n        let bounds: Rect;\n        newTiles.forEach(tile => {\n            bounds = bounds ? Rect.union(bounds, tile.percentBounds) : new Rect(tile.percentBounds);\n        });\n\n        this.refreshTiles$.next({ ensureBounds: bounds });\n\n        this.contentAdding.next(event);\n\n        if (!event.defaultPrevented) {\n            // Add immediately\n            validateNewTiles(newTiles);\n        } else {\n            event.cancel$.pipe(\n                take(1),\n                filter(value => !value),\n                takeUntil(this.destroyed$)\n            ).subscribe(validateNewTiles);\n\n            event.cancel$.pipe(\n                take(1),\n                filter(value => !!value),\n                switchMap(() => {\n                    // Reshow original tiles if cut operation\n                    if (sourceTiles) {\n                        sourceTiles.forEach(tile => {\n                            tile.isHidden = false;\n                            tile.isCutted = true;\n                        });\n                    }\n\n                    // Canceled, hide and remove added after effect\n                    return from(newTiles);\n                }),\n                tap(tile => tile.isHidden = true),\n                delay(1000),\n                // eslint-disable-next-line @typescript-eslint/no-unsafe-return\n                reduce((acc, cur) => [...acc, cur], new Array<DejaTile>()),\n                take(1),\n                takeUntil(this.destroyed$)\n            ).subscribe(tiles => this.deleteTiles(tiles));\n        }\n    }\n\n    private size(tile: DejaTile, pixelPos: Position, directions: Directions): void {\n        // Calc new tile bounds\n        const percentPos = new Position(this.getPercentSize(pixelPos.left), this.getPercentSize(pixelPos.top));\n        const dragBounds = tile.percentBounds.clone();\n        const newTargetBounds = tile.percentBounds.clone();\n        let minWidth: number;\n        let minHeight: number;\n        let maxWidth: number;\n        let maxHeight: number;\n\n        // eslint-disable-next-line no-bitwise\n        if (directions & Directions.left) {\n            minWidth = this.getTileMinPercentWidth();\n            maxWidth = this.getTileMaxPercentWidth();\n            const dLeft = percentPos.left;\n            const tLeft = dragBounds.left < dLeft ? minWidth * Math.ceil(dLeft / minWidth) : minWidth * Math.floor(dLeft / minWidth);\n            const tWidth = Math.min(maxWidth, Math.max(minWidth, newTargetBounds.right - tLeft));\n            dragBounds.width = dragBounds.right - dLeft;\n            dragBounds.left = dLeft;\n            newTargetBounds.left = newTargetBounds.right - tWidth;\n            newTargetBounds.width = tWidth;\n        }\n        // eslint-disable-next-line no-bitwise\n        if (directions & Directions.right) {\n            minWidth = minWidth || this.getTileMinPercentWidth();\n            maxWidth = maxWidth || this.getTileMaxPercentWidth();\n            const dRight = percentPos.left;\n            const tRight = dragBounds.right < dRight ? minWidth * Math.ceil(dRight / minWidth) : minWidth * Math.floor(dRight / minWidth);\n            dragBounds.width = dRight - dragBounds.left;\n            newTargetBounds.width = Math.min(maxWidth, Math.max(minWidth, tRight - newTargetBounds.left));\n        }\n        // eslint-disable-next-line no-bitwise\n        if (directions & Directions.top) {\n            minHeight = this.getTileMinPercentHeight();\n            maxHeight = this.getTileMaxPercentHeight();\n            const dTop = percentPos.top;\n            const tTop = dragBounds.top < dTop ? minHeight * Math.ceil(dTop / minHeight) : minHeight * Math.floor(dTop / minHeight);\n            const tHeight = Math.min(maxHeight, Math.max(minHeight, newTargetBounds.bottom - tTop));\n            dragBounds.height = dragBounds.bottom - dTop;\n            dragBounds.top = dTop;\n            newTargetBounds.top = newTargetBounds.bottom - tHeight;\n            newTargetBounds.height = tHeight;\n        }\n        // eslint-disable-next-line no-bitwise\n        if (directions & Directions.bottom) {\n            minHeight = minHeight || this.getTileMinPercentHeight();\n            maxHeight = maxHeight || this.getTileMaxPercentHeight();\n            const dBottom = percentPos.top;\n            const tBottom = dragBounds.bottom < dBottom ? minHeight * Math.ceil(dBottom / minHeight) : minHeight * Math.floor(dBottom / minHeight);\n            dragBounds.height = dBottom - dragBounds.top;\n            newTargetBounds.height = Math.min(maxHeight, Math.max(minHeight, tBottom - newTargetBounds.top));\n        }\n\n        if (Rect.equals(newTargetBounds, this.destination)) {\n            // Nothing change, wait for timers\n            return;\n        }\n\n        // Restore the original layout before moving something\n        this.restoreLayout(this.originalLayout);\n\n        this.destination = newTargetBounds.clone();\n\n        // Check if location is free without pushing tiles\n        const result = this.tiles.find(t => !t.isDragging && t.percentBounds.intersectWith(newTargetBounds));\n\n        if (!result) {\n            this.targetBounds = newTargetBounds;\n\n            // Save layout\n            this.validLayout = this.saveLayout();\n            this.validLayout.targetBounds = this.validLayout.validBounds = newTargetBounds;\n            this.refreshTiles$.next(null);\n        } else if (newTargetBounds) {\n            // Location must be freed\n            // Ensure new destination\n            const ensureBounds = this.ensureTarget(newTargetBounds, dragBounds, directions);\n            if (ensureBounds) {\n                this.targetBounds = ensureBounds;\n                this.validLayout = this.saveLayout();\n                this.validLayout.targetBounds = newTargetBounds;\n                this.validLayout.validBounds = ensureBounds;\n                this.refreshTiles$.next(null);\n            }\n        }\n    }\n\n    private clearMoveTimer(): void {\n        if (this.moveTimOut) {\n            this.moveTimOut.unsubscribe();\n            this.moveTimOut = undefined;\n        }\n    }\n\n    private move(): void {\n        const minWidth = this.getTileMinPercentWidth();\n        const minHeight = this.getTileMinPercentHeight();\n\n        // Search a new target\n        let newTargetBounds = this.ensureContainer(new Rect(minWidth * Math.round(this.dragTarget.left / minWidth), minHeight * Math.round(this.dragTarget.top / minHeight), this.dragTarget.width, this.dragTarget.height));\n\n        if (this.lastTargetBounds && Math.abs(newTargetBounds.left - this.lastTargetBounds.left) < minWidth && Math.abs(newTargetBounds.top - this.lastTargetBounds.top) < minHeight) {\n            // Nothing change, wait for timers\n            return;\n        }\n        this.lastTargetBounds = newTargetBounds;\n\n        // Check if location is free without pushing tiles\n        const maxOverlaps = this.tiles\n            .filter(tile => !tile.isDragging)\n            .reduce((overlaps, tile) => {\n                const overlapsInfos = Rect.overlapInfos(tile.percentBounds, newTargetBounds);\n                return Math.max(Math.min(overlapsInfos.height, overlapsInfos.width), overlaps);\n            }, 0);\n\n        // Restore the original layout before moving something if the user move back in an empty original position\n        if (!this.tiles.find(t => {\n            const config = this.originalLayout[t.id] as ILayoutInfo;\n            return config?.bounds.intersectWith(newTargetBounds);\n        })) {\n            this.restoreLayout(this.originalLayout);\n        }\n\n        if (maxOverlaps === 0) {\n            this.clearMoveTimer();\n\n            this.targetBounds = newTargetBounds.clone();\n            this.destination = newTargetBounds.clone();\n\n            // Save layout\n            this.validLayout = this.saveLayout();\n            this.validLayout.targetBounds = this.validLayout.validBounds = newTargetBounds;\n            this.refreshTiles$.next(null);\n\n        } else {\n            if (!Rect.equals(this.targetBounds, newTargetBounds)) {\n                this.clearMoveTimer();\n            }\n\n            if (maxOverlaps > 3) {\n                const timerBounds = newTargetBounds.clone();\n                this.moveTimOut = timer(500).pipe(\n                    take(1),\n                    takeUntil(this.destroyed$)\n                ).subscribe(() => {\n                    // Restore the original layout before moving something\n                    this.restoreLayout(this.originalLayout);\n\n                    this.destination = timerBounds;\n\n                    // Ensure new destination\n                    const ensureBounds = this.ensureTarget(timerBounds, this.dragTarget, Directions.all);\n\n                    if (ensureBounds) {\n                        this.targetBounds = ensureBounds;\n                        this.validLayout = this.saveLayout();\n                        this.validLayout.targetBounds = timerBounds;\n                        this.validLayout.validBounds = ensureBounds;\n                        this.refreshTiles$.next(null);\n                    }\n                });\n            }\n\n            // Find best location between last valid bounds and current bounds\n            const freePlaces = new Array<Rect>();\n            const tiles = this.tiles.filter(t => !t.isDragging);\n\n            // eslint-disable-next-line no-loops/no-loops\n            for (let x = Math.min(this.targetBounds.left, newTargetBounds.left); x <= Math.max(this.targetBounds.left, newTargetBounds.left); x++) {\n                // eslint-disable-next-line no-loops/no-loops\n                for (let y = Math.min(this.targetBounds.top, newTargetBounds.top); y <= Math.max(this.targetBounds.top, newTargetBounds.top); y++) {\n                    const currentBounds = new Rect(x, y, newTargetBounds.width, newTargetBounds.height);\n\n                    if (!tiles.find(t => t.percentBounds.intersectWith(currentBounds))) {\n                        freePlaces.push(currentBounds);\n                    }\n                }\n            }\n\n            if (freePlaces.length > 0) {\n                // add at the nearest free place\n                freePlaces.sort((bounds1, bounds2) => {\n                    const calcDistance = (bounds: Rect): number => Math.min(Math.abs(bounds.left - newTargetBounds.left), Math.abs(bounds.right - newTargetBounds.right)) + 200 * Math.min(Math.abs(bounds.top - newTargetBounds.top), Math.abs(bounds.bottom - newTargetBounds.bottom));\n                    return calcDistance(bounds1) - calcDistance(bounds2);\n                });\n\n                newTargetBounds = freePlaces[0];\n\n                this.targetBounds = newTargetBounds.clone();\n                this.destination = newTargetBounds.clone();\n\n                // Save layout\n                this.validLayout = this.saveLayout();\n                this.validLayout.targetBounds = this.validLayout.validBounds = newTargetBounds;\n                this.refreshTiles$.next(null);\n            }\n        }\n    }\n\n    // Ensure that the specified bounds are inside the tiles area. Return the corrected rectangle.\n    private ensureContainer(percentBounds: Rect): Rect {\n        if (percentBounds.left < 0) {\n            percentBounds = percentBounds.offset(-percentBounds.left, 0);\n        }\n\n        if (percentBounds.top < 0) {\n            percentBounds = percentBounds.offset(0, -percentBounds.top);\n        }\n\n        const maxPercentWidth = this.getMaxPercentWidth();\n        if (maxPercentWidth && percentBounds.right > maxPercentWidth) {\n            percentBounds = percentBounds.offset(maxPercentWidth - percentBounds.right, 0);\n        }\n\n        const maxPercentHeight = this.getMaxPercentHeight();\n        if (maxPercentHeight && percentBounds.bottom > maxPercentHeight) {\n            percentBounds = percentBounds.offset(0, maxPercentHeight - percentBounds.bottom);\n        }\n\n        return percentBounds;\n    }\n\n    // Ensure that a tile can be dropped at the specified bounds. Return the corrected rectangle.\n    private ensureTarget(bounds: Rect, effectiveBounds?: Rect, directions?: Directions, originalBounds?: Rect, retryCount = 10): Rect {\n        if (!effectiveBounds) {\n            effectiveBounds = bounds;\n        }\n\n        // Backup bounds\n        if (!originalBounds) {\n            originalBounds = bounds.clone();\n        }\n\n        if (!directions) {\n            directions = Directions.all;\n        }\n\n        const leftTilesToPush = new Array<DejaTile>();\n        const rightTilesToPush = new Array<DejaTile>();\n        const topTilesToPush = new Array<DejaTile>();\n        const bottomTilesToPush = new Array<DejaTile>();\n\n        // eslint-disable-next-line no-loops/no-loops\n        const swap = this.tiles\n            .filter(tile => !tile.isDragging && tile.percentBounds.intersectWith(bounds))\n            .find(tile => {\n                const swapTargetRect = new Rect(this.dragOriginalPosition.left, this.dragOriginalPosition.top, bounds.width, bounds.height);\n                if (Math.abs(tile.percentBounds.left - effectiveBounds.left) < 1 &&\n                    Math.abs(tile.percentBounds.top - effectiveBounds.top) < 1 &&\n                    Math.abs(tile.percentBounds.width - effectiveBounds.width) < 1 &&\n                    Math.abs(tile.percentBounds.height - effectiveBounds.height) < 1 &&\n                    (Math.abs(effectiveBounds.left - swapTargetRect.right) <= 4 || Math.abs(effectiveBounds.right - swapTargetRect.left) <= 4 || Math.abs(effectiveBounds.top - swapTargetRect.bottom) <= 4 || Math.abs(effectiveBounds.bottom - swapTargetRect.top) <= 4)) {\n                    // swap\n                    tile.percentBounds = swapTargetRect;\n                    return true;\n                } else {\n                    const hol = tile.percentBounds.left - effectiveBounds.left; // Ce qui depasse a gauche\n                    const hor = effectiveBounds.right - tile.percentBounds.right; // Ce qui depasse a droite\n                    const vot = tile.percentBounds.top - effectiveBounds.top; // Ce qui depasse en haut\n                    const vob = effectiveBounds.bottom - tile.percentBounds.bottom; // Ce qui depasse en bas\n                    const hoe = Math.max(0, Math.min(tile.percentBounds.right, effectiveBounds.right) - Math.max(tile.percentBounds.left, effectiveBounds.left)) / Math.min(tile.percentBounds.width, effectiveBounds.width);\n                    const voe = Math.max(0, Math.min(tile.percentBounds.bottom, effectiveBounds.bottom) - Math.max(tile.percentBounds.top, effectiveBounds.top)) / Math.min(tile.percentBounds.height, effectiveBounds.height);\n\n                    // Calc preferred direction\n                    let preferredDirection: Directions;\n                    // eslint-disable-next-line no-bitwise\n                    if (voe >= hoe && directions & Directions.horizontal) {\n                        // horizontal\n                        // eslint-disable-next-line no-bitwise\n                        preferredDirection = hor >= hol && (directions & Directions.left) ? Directions.left : Directions.right;\n                        // eslint-disable-next-line no-bitwise\n                    } else if (directions & Directions.vertical) {\n                        // vertical\n                        // eslint-disable-next-line no-bitwise\n                        preferredDirection = vob >= vot && (directions & Directions.top) ? Directions.top : Directions.bottom;\n                    }\n\n                    switch (preferredDirection) {\n                        case Directions.left:\n                            leftTilesToPush.push(tile);\n                            break;\n                        case Directions.top:\n                            topTilesToPush.push(tile);\n                            break;\n                        case Directions.right:\n                            rightTilesToPush.push(tile);\n                            break;\n                        default:\n                            bottomTilesToPush.push(tile);\n                            break;\n                    }\n                }\n                return undefined;\n            });\n\n        if (swap) {\n            return bounds;\n        }\n\n        // try first horizontal move\n        let remain = 0;\n        if (leftTilesToPush.length) {\n            remain = this.pushHorizontal(bounds, -1, leftTilesToPush);\n            if (remain) {\n                bounds = this.ensureContainer(bounds.offset(remain, 0));\n                // eslint-disable-next-line no-bitwise\n                return retryCount ? this.ensureTarget(bounds, effectiveBounds, directions & ~Directions.left, originalBounds, retryCount - 1) : null;\n            }\n        }\n\n        // Now try right\n        if (rightTilesToPush.length) {\n            remain = this.pushHorizontal(bounds, 1, rightTilesToPush);\n        }\n\n        if (remain > 0) {\n            // No horizontal place, restore original position\n            this.restoreLayout(this.originalLayout);\n            // eslint-disable-next-line no-bitwise\n            return retryCount ? this.ensureTarget(originalBounds, effectiveBounds, directions & Directions.vertical, undefined, retryCount - 1) : null;\n        } else {\n            // Try top\n            if (topTilesToPush.length) {\n                remain = this.pushVertical(bounds, -1, topTilesToPush);\n                if (remain) {\n                    bounds = this.ensureContainer(bounds.offset(0, remain));\n                    return retryCount ? this.ensureTarget(bounds, effectiveBounds, Directions.bottom, undefined, retryCount - 1) : null;\n                }\n            }\n\n            // And finally bottom\n            remain = this.pushVertical(bounds, 1, bottomTilesToPush);\n            if (remain) {\n                // Destination is not available, keep tile at the original place\n                return null;\n            }\n        }\n\n        return bounds;\n    }\n\n    private saveLayout(): ILayoutInfos {\n        const layout = {} as ILayoutInfos;\n        layout.height = this.getTileMinPercentHeight();\n        this.tiles.forEach(tile => {\n            const y = this.getPixelSize(tile.percentBounds.top || 0);\n            const h = this.getPixelSize(tile.percentBounds.height || this._tileMinHeight);\n            if (y + h > layout.height) {\n                layout.height = y + h;\n            }\n            layout[tile.id] = {\n                bounds: tile.percentBounds.clone(),\n                id: tile.id\n            } as ILayoutInfo;\n        });\n\n        return layout;\n    }\n\n    private getPixelBounds(rect: Rect): Rect {\n        return Rect.fromLTRB(Math.round(rect.left * this.hundredPercentWith / 100), Math.round(rect.top * this.hundredPercentWith / 100), Math.round(rect.right * this.hundredPercentWith / 100), Math.round(rect.bottom * this.hundredPercentWith / 100));\n    }\n\n    private getPixelSize(value: number, unit?: string): number {\n        if (!unit || unit === '%') {\n            return Math.round(value * this.hundredPercentWith / 100);\n        } else {\n            return value;\n        }\n    }\n\n    private getSizePercentLimit(prop: string): number {\n        const self = this as Record<string, unknown>;\n        const unit = self[`${prop}Unit`];\n        if (!unit || unit === 'px') {\n            return this.getPercentSize(self[prop] as number);\n        } else {\n            return self[prop] as number;\n        }\n    }\n\n    private getSizePixelLimit(prop: string): number {\n        const self = this as Record<string, unknown>;\n        const unit = self[`${prop}Unit`];\n        if (!unit || unit === 'px') {\n            return self[prop] as number;\n        } else {\n            return this.getPixelSize(self[prop] as number);\n        }\n    }\n\n    private getTileMinPixelSize(): Size {\n        return new Size(this.getSizePixelLimit('_tileMinWidth'), this.getSizePixelLimit('_tileMinHeight'));\n    }\n\n    private getTileMaxPixelSize(): Size {\n        return new Size(this.getSizePixelLimit('_tileMaxWidth'), this.getSizePixelLimit('_tileMaxHeight'));\n    }\n\n    private getTileMinPercentWidth(): number {\n        return Math.max(1, this.getSizePercentLimit('_tileMinWidth'));\n    }\n\n    private getTileMaxPercentWidth(): number {\n        return Math.max(5, this.getSizePercentLimit('_tileMaxWidth'));\n    }\n\n    private getTileMinPercentHeight(): number {\n        return Math.max(1, this.getSizePercentLimit('_tileMinHeight'));\n    }\n\n    private getTileMaxPercentHeight(): number {\n        return Math.max(5, this.getSizePercentLimit('_tileMaxHeight'));\n    }\n\n    private getMaxPercentWidth(): number {\n        return Math.max(5, this.getSizePercentLimit('_maxWidth'));\n    }\n\n    private getMaxPercentHeight(): number {\n        return Math.max(5, this.getSizePercentLimit('_maxHeight'));\n    }\n\n    private getCursorFromHtmlElement(x: number, y: number, element: HTMLElement): string {\n        const tileElement = this.getTileElementFromHTMLElement(element);\n        if (!tileElement) {\n            return null;\n        }\n\n        const bounds = tileElement.getBoundingClientRect();\n        const horizontalDragSize = Math.min(15, bounds.width / 3);\n        const verticalDragSize = Math.min(15, bounds.height / 3);\n\n        if (x < bounds.left + horizontalDragSize) {\n            if (y < bounds.top + verticalDragSize) {\n                return 'nw-resize';\n            } else if (y > bounds.bottom - verticalDragSize) {\n                return 'sw-resize';\n            } else {\n                return 'w-resize';\n            }\n        } else if (x > bounds.right - horizontalDragSize) {\n            if (y < bounds.top + verticalDragSize) {\n                return 'ne-resize';\n            } else if (y > bounds.bottom - verticalDragSize) {\n                return 'se-resize';\n            } else {\n                return 'e-resize';\n            }\n        } else if (y < bounds.top + verticalDragSize) {\n            return 'n-resize';\n        } else if (y > bounds.bottom - verticalDragSize) {\n            return 's-resize';\n        } else {\n            return 'move';\n        }\n    }\n\n    private extractValueAndUnit(prop: string, value: string): void {\n        const regexp = /(\\d+)(.*)/i;\n        const matches = regexp.exec(value);\n\n        if (matches?.length >= 1) {\n            const self = this as Record<string, unknown>;\n            self[prop] = parseInt(matches[1], 10);\n            if (matches.length >= 2) {\n                self[`${prop}Unit`] = matches[2];\n            } else {\n                self[`${prop}Unit`] = 'px';\n            }\n        }\n    }\n\n    private restoreLayout(layout: ILayoutInfos): void {\n        this.tiles.forEach(tile => {\n            const config = layout[tile.id] as ILayoutInfo;\n            if (config) {\n                tile.percentBounds = config.bounds.clone();\n            }\n        });\n    }\n\n    private calcHorizontalOverflow(direction: number, tiles: Array<DejaTile>, offset: number, blackList?: Set<string>): number {\n        let overflow = 0;\n        blackList = blackList || new Set<string>();\n\n        tiles.forEach(t => {\n            if (!blackList.has(t.id)) {\n                blackList.add(t.id);\n\n                const tryBounds = t.percentBounds.offset(direction * offset, 0);\n                let rightOffset = 0;\n                const maxWidth = this.getMaxPercentWidth();\n                if (tryBounds.left < 0) {\n                    rightOffset = -tryBounds.left;\n                } else if (maxWidth && tryBounds.right > maxWidth) {\n                    rightOffset = tryBounds.right - maxWidth;\n                }\n\n                const adjacentTiles = this.tiles.filter((tile: DejaTile) => !tile.isDragging && !tile.equalsTo(t) && tile.percentBounds.intersectWith(tryBounds));\n\n                if (adjacentTiles.length) {\n                    rightOffset += this.calcHorizontalOverflow(direction, adjacentTiles, offset, blackList);\n                }\n\n                if (rightOffset > overflow) {\n                    overflow = rightOffset;\n                }\n            }\n        });\n\n        return overflow;\n    }\n\n    private moveHorizontal(direction: number, tiles: Array<DejaTile>, offset: number, targetBounds: Map<string, Rect>): void {\n        tiles.forEach(t => {\n            if (!targetBounds.has(t.id)) {\n                // Offset tile\n                const newBounds = t.percentBounds.offset(direction * offset, 0);\n                targetBounds.set(t.id, newBounds);\n                const adjacentTiles = this.tiles.filter((tile: DejaTile) => !tile.isDragging && !tile.equalsTo(t) && tile.percentBounds.intersectWith(newBounds));\n\n                if (adjacentTiles.length) {\n                    this.moveHorizontal(direction, adjacentTiles, offset, targetBounds);\n                }\n            }\n        });\n    }\n\n    private pushHorizontal(bounds: Rect, direction: number, tiles?: Array<DejaTile>, offset?: number): number {\n        let overflow = 0;\n        const targetBounds = new Map<string, Rect>();\n\n        if (!offset) {\n            offset = 0;\n            tiles.forEach(t => {\n                const ho = direction > 0 ? Math.max(0, bounds.right - t.percentBounds.left) : Math.max(0, t.percentBounds.right - bounds.left);\n                if (ho > offset) {\n                    offset = ho;\n                }\n            });\n        }\n\n        if (offset > 0) {\n            // Calc overflow space if all specified tiles are moved\n            overflow = this.calcHorizontalOverflow(direction, tiles, offset);\n            offset -= overflow;\n            if (offset > 0) {\n                this.moveHorizontal(direction, tiles, offset, targetBounds);\n\n                //  bounds array to tiles\n                this.tiles.forEach(t => {\n                    if (targetBounds.has(t.id)) {\n                        t.percentBounds = targetBounds.get(t.id);\n                    }\n                });\n            }\n        }\n\n        return overflow;\n    }\n\n    private calcVerticalOverflow(direction: number, tiles: Array<DejaTile>, offset: number, blackList?: Set<string>): number {\n        let overflow = 0;\n        blackList = blackList || new Set<string>();\n\n        tiles.forEach(t => {\n            if (!blackList.has(t.id)) {\n                blackList.add(t.id);\n\n                // Offset tile\n                const tryBounds = t.percentBounds.offset(0, direction * offset);\n                let rightOffset = 0;\n                const maxHeight = this.getMaxPercentHeight();\n                if (tryBounds.top < 0) {\n                    rightOffset = -tryBounds.top;\n                } else if (maxHeight && tryBounds.bottom > maxHeight) {\n                    rightOffset = tryBounds.bottom - maxHeight;\n                }\n\n                const adjacentTiles = this.tiles.filter((tile: DejaTile) => !tile.isDragging && !tile.equalsTo(t) && tile.percentBounds.intersectWith(tryBounds));\n\n                if (adjacentTiles.length) {\n                    rightOffset += this.calcVerticalOverflow(direction, adjacentTiles, offset, blackList);\n                }\n\n                if (rightOffset > overflow) {\n                    overflow = rightOffset;\n                }\n            }\n        });\n\n        return overflow;\n    }\n\n    private moveVertical(direction: number, tiles: Array<DejaTile>, offset: number, targetBounds: Map<string, Rect>): void {\n        tiles.forEach(t => {\n            if (!targetBounds.has(t.id)) {\n                // Offset tile\n                const newBounds = t.percentBounds.offset(0, direction * offset);\n                targetBounds.set(t.id, newBounds);\n                const adjacentTiles = this.tiles.filter((tile: DejaTile) => !tile.isDragging && !tile.equalsTo(t) && tile.percentBounds.intersectWith(newBounds));\n\n                if (adjacentTiles.length) {\n                    this.moveVertical(direction, adjacentTiles, offset, targetBounds);\n                }\n            }\n        });\n    }\n\n    private pushVertical(bounds: Rect, direction: number, tiles: Array<DejaTile>, offset?: number): number {\n        let overflow = 0;\n        const targetBounds = new Map<string, Rect>();\n\n        if (!offset) {\n            offset = 0;\n            tiles.forEach(t => {\n                const vo = direction > 0 ? Math.max(0, bounds.bottom - t.percentBounds.top) : Math.max(0, t.percentBounds.bottom - bounds.top);\n                if (vo > offset) {\n                    offset = vo;\n                }\n            });\n        }\n\n        if (offset > 0) {\n            // Calc overflow space if all specified tiles are moved\n            overflow = this.calcVerticalOverflow(direction, tiles, offset);\n            offset -= overflow;\n            if (offset > 0) {\n                this.moveVertical(direction, tiles, offset, targetBounds);\n\n                //  bounds array to tiles\n                this.tiles.forEach(t => targetBounds.has(t.id) && (t.percentBounds = targetBounds.get(t.id)));\n            }\n        }\n\n        return overflow;\n    }\n\n    private copyTiles(tiles: Array<DejaTile>, isCut?: boolean): void {\n        if (!this.clipboardService) {\n            if (!tiles) {\n                return;\n            }\n            throw new Error('DejaClipboardService must be imported by your application to use the copyTiles methode of DejaTilesComponent.');\n        }\n\n        const tt = this.clipboardService.get('tiles') as Array<DejaTile>;\n        if (tt) {\n            tt.forEach(tile => tile.isCutted = false);\n        }\n        this.clipboardService.set('tiles', tiles);\n        if (isCut) {\n            tiles.forEach(tile => tile.isCutted = true);\n            this.clipboardService.set('tiles-provider', this.deleteTiles$);\n        } else {\n            this.clipboardService.set('tiles-provider', undefined);\n        }\n    }\n\n    private removeTemporaryTile(): void {\n        let index = this.tiles.length;\n        // eslint-disable-next-line no-loops/no-loops\n        while (--index >= 0) {\n            const tile = this.tiles[index];\n            if (tile.isTemporary) {\n                this.tilesDic.delete(tile.id);\n                this.tiles.splice(index, 1);\n            }\n        }\n    }\n}\n","/*\n *  @license\n *  Copyright Hôpitaux Universitaires de Genève. All Rights Reserved.\n *\n *  Use of this source code is governed by an Apache-2.0 license that can be\n *  found in the LICENSE file at https://github.com/DSI-HUG/dejajs-components/blob/master/LICENSE\n */\n\nimport { BooleanInput, coerceBooleanProperty } from '@angular/cdk/coercion';\nimport { AfterViewInit, ChangeDetectionStrategy, ChangeDetectorRef, Component, ContentChild, ElementRef, EventEmitter, Input, OnDestroy, Optional, Output, Self, TemplateRef, ViewChild } from '@angular/core';\nimport { ControlValueAccessor, NgControl } from '@angular/forms';\nimport { Destroy, KeyCodes } from '@deja-js/component/core';\nimport { Position, Rect } from '@deja-js/component/core/graphics';\nimport { DropCursorInfos, MouseDroppableContext } from '@deja-js/component/v2/mouse-dragdrop';\nimport { debounceTime, filter, from, fromEvent, Observable, Subject, Subscription, takeUntil } from 'rxjs';\n\nimport { DejaTile } from './tile.class';\nimport { IDejaTilesAddedEvent, IDejaTilesAddEvent, IDejaTilesDeletedEvent, IDejaTilesEvent, IDejaTilesRemoveEvent } from './tiles.event';\nimport { DejaTilesLayoutProvider, ITileDragDropContext } from './tiles-layout.provider';\nimport { IDejaTilesRefreshParams } from './tiles-refresh-params.interface';\n\n@Component({\n    selector: 'deja-tiles',\n    changeDetection: ChangeDetectionStrategy.OnPush,\n    providers: [DejaTilesLayoutProvider],\n    styleUrls: [\n        './tiles.component.scss'\n    ],\n    templateUrl: './tiles.component.html'\n})\nexport class DejaTilesComponent extends Destroy implements AfterViewInit, ControlValueAccessor, OnDestroy {\n    /**\n     * Raised when the selected items has changed\n     */\n    @Output() public readonly selectionChanged = new EventEmitter<IDejaTilesEvent>();\n\n    /**\n     * Raised when the layout has changed with a drag and drop\n     */\n    @Output() public readonly layoutChanged = new EventEmitter<IDejaTilesEvent>();\n\n    /**\n     * Raised when the layout is completed and all tiles are binded\n     */\n    @Output() public readonly layoutCompleted = new EventEmitter<IDejaTilesEvent>();\n\n    /**\n     * Raised before some tiles will be added to the data model with a paste\n     */\n    @Output() public readonly contentAdding = new EventEmitter<IDejaTilesAddEvent>();\n\n    /**\n     * Raised before some tiles will be removed from the data model with a delete\n     */\n    @Output() public readonly contentRemoving = new EventEmitter<IDejaTilesRemoveEvent>();\n\n    /**\n     * Raised when tiles are added\n     */\n    @Output() public readonly tilesAdded = new EventEmitter<IDejaTilesAddedEvent>();\n\n    /**\n     * Raised when tiles are deleted\n     */\n    @Output() public readonly tilesDeleted = new EventEmitter<IDejaTilesDeletedEvent>();\n\n    /**\n     * Raised when some tiles are copied in the clipboard service. Can result from a copy or paste operation on the tiles.\n     */\n    @Output() public readonly contentCopied = new EventEmitter<IDejaTilesEvent>();\n\n    /**\n     * Tab index of the focusable element\n     */\n    @Input() public tabIndex = 0;\n\n    @ContentChild('tileTemplate') public tileTemplate: TemplateRef<unknown>;\n\n    @ViewChild('tilesContainer', { static: true }) private tilesContainer: ElementRef<HTMLElement>;\n\n    private _models = [] as DejaTile[];\n    private delete$sub: Subscription;\n    private copy$sub: Subscription;\n    private cut$sub: Subscription;\n    private paste$sub: Subscription;\n    private keyup$: Observable<KeyboardEvent>;\n    private hasFocus = false;\n\n    public get tiles(): DejaTile[] {\n        return this.layoutProvider.tiles;\n    }\n\n    public constructor(el: ElementRef, private changeDetectorRef: ChangeDetectorRef, private layoutProvider: DejaTilesLayoutProvider, @Self() @Optional() public control: NgControl) {\n        super();\n\n        if (this.control) {\n            this.control.valueAccessor = this;\n        }\n\n        const element = el.nativeElement as HTMLElement;\n\n        from(this.layoutProvider.selectionChanged).pipe(\n            takeUntil(this.destroyed$)\n        ).subscribe(event => this.selectionChanged.emit(event));\n\n        from(this.layoutProvider.contentAdding).pipe(\n            takeUntil(this.destroyed$)\n        ).subscribe(event => this.contentAdding.emit(event));\n\n        from(this.layoutProvider.contentRemoving).pipe(\n            takeUntil(this.destroyed$)\n        ).subscribe(event => this.contentRemoving.emit(event));\n\n        from(this.layoutProvider.tilesAdded).pipe(\n            takeUntil(this.destroyed$)\n        ).subscribe(event => {\n            this.tilesAdded.emit(event);\n            this.onChangeCallback(event.tiles);\n        });\n\n        from(this.layoutProvider.tilesDeleted).pipe(\n            takeUntil(this.destroyed$)\n        ).subscribe(event => {\n            this.tilesDeleted.emit(event);\n            this.onChangeCallback(event.tiles);\n        });\n\n        from(this.layoutProvider.layoutChanged).pipe(\n            takeUntil(this.destroyed$)\n        ).subscribe(event => {\n            this.layoutChanged.emit(event);\n            this.onChangeCallback(event.tiles);\n        });\n\n        from(this.layoutProvider.layoutCompleted).pipe(\n            takeUntil(this.destroyed$)\n        ).subscribe(event => this.layoutCompleted.emit(event));\n\n        this.keyup$ = fromEvent<KeyboardEvent>(element.ownerDocument, 'keyup');\n\n        fromEvent<Event>(window, 'resize').pipe(\n            debounceTime(5),\n            takeUntil(this.destroyed$)\n        ).subscribe(() => this.refresh({ resetWidth: true }));\n    }\n\n    // provide a public access\n    public get selectionRect$(): Subject<Rect> {\n        return this.layoutProvider.selectionRect$;\n    }\n\n    @Input()\n    public set tileminwidth(value: string) {\n        this.layoutProvider.tileMinWidth = value;\n    }\n\n    @Input()\n    public set tilemaxwidth(value: string) {\n        this.layoutProvider.tileMaxWidth = value;\n    }\n\n    @Input()\n    public set tileminheight(value: string) {\n        this.layoutProvider.tileMinHeight = value;\n    }\n\n    @Input()\n    public set tilemaxheight(value: string) {\n        this.layoutProvider.tileMaxHeight = value;\n    }\n\n    @Input()\n    public set maxwidth(value: string) {\n        this.layoutProvider.maxWidth = value;\n    }\n\n    @Input()\n    public set designMode(value: BooleanInput) {\n        this.layoutProvider.designMode = coerceBooleanProperty(value);\n    }\n\n    public get designMode(): BooleanInput {\n        return this.layoutProvider.designMode;\n    }\n\n    @Input()\n    public set models(models: DejaTile[]) {\n        this.writeValue(models);\n    }\n\n    @Input()\n    public set canDelete(value: BooleanInput) {\n        if (coerceBooleanProperty(value) && !this.delete$sub) {\n            this.delete$sub = this.keyup$.pipe(\n                filter(event => this.layoutProvider.designMode && event.code === KeyCodes.Delete && this.hasFocus),\n                takeUntil(this.destroyed$)\n            ).subscribe(() => this.layoutProvider.deleteSelection());\n\n        } else if (this.delete$sub) {\n            this.delete$sub.unsubscribe();\n            this.delete$sub = undefined;\n        }\n    }\n\n    @Input()\n    public set canCopy(value: BooleanInput) {\n        if (coerceBooleanProperty(value) && !this.copy$sub) {\n            this.copy$sub = this.keyup$.pipe(\n                filter(event => event.code === KeyCodes.KeyC && event.ctrlKey && this.hasFocus),\n                takeUntil(this.destroyed$)\n            ).subscribe(() => this.copySelection());\n\n        } else if (this.copy$sub) {\n            this.copy$sub.unsubscribe();\n            this.copy$sub = undefined;\n        }\n    }\n\n    @Input()\n    public set canCut(value: BooleanInput) {\n        if (coerceBooleanProperty(value) && !this.cut$sub) {\n            this.cut$sub = this.keyup$.pipe(\n                filter(event => this.layoutProvider.designMode && event.code === KeyCodes.KeyX && event.ctrlKey && this.hasFocus),\n                takeUntil(this.destroyed$)\n            ).subscribe(() => this.cutSelection());\n\n        } else if (this.cut$sub) {\n            this.cut$sub.unsubscribe();\n            this.cut$sub = undefined;\n        }\n    }\n\n    @Input()\n    public set canPaste(value: BooleanInput) {\n        if (coerceBooleanProperty(value) && !this.paste$sub) {\n            this.paste$sub = this.keyup$.pipe(\n                filter(event => this.layoutProvider.designMode && event.code === KeyCodes.KeyV && event.ctrlKey && this.hasFocus),\n                takeUntil(this.destroyed$)\n            ).subscribe(() => this.paste());\n\n        } else if (this.paste$sub) {\n            this.paste$sub.unsubscribe();\n            this.paste$sub = undefined;\n        }\n    }\n\n    @Input()\n    public set selectedTiles(selectedTiles: Array<DejaTile | string>) {\n        this.layoutProvider.selectedTiles = selectedTiles.map(tile => typeof tile === 'string' ? tile : (tile).id);\n    }\n\n    // ************* ControlValueAccessor Implementation **************\n    public writeValue(models: DejaTile[]): void {\n        this._models = models || [];\n        const tiles = this._models;\n        this.layoutProvider.tiles = tiles;\n        this.changeDetectorRef.markForCheck();\n    }\n\n    public registerOnChange(fn: (_a: unknown) => void): void {\n        this.onChangeCallback = fn;\n    }\n\n    public registerOnTouched(fn: () => void): void {\n        this.onTouchedCallback = fn;\n    }\n    // ************* End of ControlValueAccessor Implementation **************\n\n    public ngAfterViewInit(): void {\n        this.layoutProvider.container = this.tilesContainer.nativeElement;\n        this.refresh({ resetWidth: true });\n    }\n\n    public ngOnDestroy(): void {\n        super.ngOnDestroy();\n        this.canCopy = false;\n        this.canCut = false;\n        this.canDelete = false;\n        this.canPaste = false;\n    }\n\n    public copySelection(): void {\n        const tiles = this.layoutProvider.copySelection();\n        if (tiles?.length) {\n            const event = new CustomEvent('DejaTilesCopied', { cancelable: true }) as IDejaTilesEvent;\n            event.tiles = tiles;\n            this.contentCopied.emit(event);\n        }\n    }\n\n    public cutSelection(): void {\n        const tiles = this.layoutProvider.cutSelection();\n        if (tiles?.length) {\n            const event = new CustomEvent('DejaTilesCutted', { cancelable: true }) as IDejaTilesEvent;\n            event.tiles = tiles;\n            this.contentCopied.emit(event);\n        }\n    }\n\n    public deleteSelection(): DejaTile[] {\n        const tiles = this.layoutProvider.deleteSelection();\n        this.changeDetectorRef.markForCheck();\n        return tiles;\n    }\n\n    public paste(): DejaTile[] {\n        const tiles = this.layoutProvider.paste();\n        this.changeDetectorRef.markForCheck();\n        return tiles;\n    }\n\n    public ensureVisible(id: string): void {\n        this.layoutProvider.ensureVisible$.next(id);\n    }\n\n    public refresh(params?: IDejaTilesRefreshParams): void {\n        this.layoutProvider.refreshTiles$.next(params);\n    }\n\n    public addTiles(tiles: DejaTile[]): void {\n        this.layoutProvider.addTiles(tiles);\n    }\n\n    public removeTiles(tileIds: string[]): void {\n        this.layoutProvider.removeTiles(tileIds);\n    }\n\n    public hitTest(pageX: number, pageY: number): DejaTile {\n        const containerElement = this.tilesContainer.nativeElement;\n        const containerBounds = containerElement.getBoundingClientRect();\n\n        const x = pageX - containerBounds.left;\n        const y = pageY - containerBounds.top;\n\n        return this.tiles.find(t => t.pixelBounds?.containsPoint(new Position(x, y)));\n    }\n\n    public getFreePlace(pageX?: number, pageY?: number, width?: number, height?: number): Rect {\n        if (!this._models || this._models.length === 0) {\n            return new Rect(0, 0, width, height);\n        }\n\n        // Check if we drag on a tile\n        const containerElement = this.tilesContainer.nativeElement;\n        const containerBounds = containerElement.getBoundingClientRect();\n\n        const x = pageX ? (pageX - containerBounds.left) : 0;\n        const y = pageY ? (pageY - containerBounds.top) : 0;\n\n        const percentBounds = new Rect(this.layoutProvider.getPercentSize(x), this.layoutProvider.getPercentSize(y), width, height);\n        return this.layoutProvider.getFreePlace(percentBounds);\n    }\n\n    public moveTile(id: string, bounds: Rect): void {\n        this.layoutProvider.moveTile(id, bounds);\n    }\n\n    public getDropContext(): MouseDroppableContext<ITileDragDropContext> {\n        let cursorInfo: DropCursorInfos;\n\n        return {\n            dragEnter: (dragContext, dragCursor) => {\n                cursorInfo = this.layoutProvider.dragEnter(dragContext, dragCursor) ? {\n                    className: 'hidden' // Hide drag cursor\n                } as DropCursorInfos : null;\n                return cursorInfo;\n            },\n            dragOver: (_dragContext, dragCursor) => {\n                this.layoutProvider.dragover$.next(dragCursor);\n                return cursorInfo;\n            },\n            dragLeave: _dragContext => {\n                cursorInfo = null;\n                this.layoutProvider.dragleave$.next();\n            }\n        } as MouseDroppableContext<ITileDragDropContext>;\n    }\n\n    public trackBy(_index: number, tile: DejaTile): unknown {\n        return tile.trackBy || tile;\n    }\n\n    public onTileClosed(tile: DejaTile): void {\n        this.layoutProvider.removeTiles([tile.id]);\n    }\n\n    public onFocus(): void {\n        this.hasFocus = true;\n    }\n\n    public onBlur(): void {\n        this.hasFocus = false;\n    }\n\n    // NgModel implementation\n    public onTouchedCallback = (): void => undefined;\n    public onChangeCallback = (_a?: unknown): void => undefined;\n}\n","<div #tilesContainer id=\"tiles\" [class.design]=\"designMode\" [mouse-droppable]=\"getDropContext()\" [attr.tabindex]=\"tabIndex\" (focus)=\"onFocus()\" (blur)=\"onBlur()\">\n    <deja-tile *ngFor=\"let tile of tiles; trackBy: trackBy; let index = index;\" [id]=\"tile.id\" [tile]=\"tile\" [attr.tile-index]=\"index\" [template]=\"tileTemplate\" (close)=\"onTileClosed(tile)\"></deja-tile>\n    <div deja-tile-position [bounds]=\"selectionRect$ | async\"></div>\n</div>\n","/*\n *  @license\n *  Copyright Hôpitaux Universitaires de Genève. All Rights Reserved.\n *\n *  Use of this source code is governed by an Apache-2.0 license that can be\n *  found in the LICENSE file at https://github.com/DSI-HUG/dejajs-components/blob/master/LICENSE\n */\n\nimport { Rect } from '@deja-js/component/core/graphics';\n\nexport interface IDejaTilesRefreshParams {\n    resetWidth?: boolean;\n    ensureVisible?: string; // Tile id\n    ensureBounds?: Rect;\n}\n","/*\n *  @license\n *  Copyright Hôpitaux Universitaires de Genève. All Rights Reserved.\n *\n *  Use of this source code is governed by an Apache-2.0 license that can be\n *  found in the LICENSE file at https://github.com/DSI-HUG/dejajs-components/blob/master/LICENSE\n */\n\nimport { Rect } from '@deja-js/component/core/graphics';\nimport { BehaviorSubject, ReplaySubject, Subject } from 'rxjs';\n\nexport class DejaTile {\n    protected static CURRENT_ID = 0;\n\n    public cutted$ = new BehaviorSubject<boolean>(false);\n    public dragging$ = new BehaviorSubject<boolean>(false);\n    public dropping$ = new BehaviorSubject<boolean>(false);\n    public pressed$ = new BehaviorSubject<boolean>(false);\n    public selected$ = new BehaviorSubject<boolean>(false);\n    public hidden$ = new ReplaySubject<boolean>(1);\n    public pixelBounds$ = new BehaviorSubject<Rect>(null);\n    public deleted$ = new Subject<void>();\n    public refresh$ = new Subject<void>();\n    public isTemporary = false;\n\n    private _id: string;\n    private _color: string;\n    private _templateModel: unknown;\n    private _isDragging = false;\n    private _isDropping = false;\n    private _isPressed = false;\n    private _isHidden = false;\n    private _pixelBounds: Rect;\n    private _selected: boolean;\n    private _cutted: boolean;\n    private _pending: boolean;\n    private _fading: boolean;\n    private _percentBounds: Rect;\n    private _trackBy: unknown;\n\n    public constructor(id?: string) {\n        this._id = id || `#${DejaTile.CURRENT_ID++}`;\n    }\n\n    public get idealBounds(): Rect {\n        return new Rect(0, 0, 15, 15);\n    }\n\n    public set pixelBounds(value: Rect) {\n        if (!Rect.equals(this._pixelBounds, value)) {\n            this._pixelBounds = value;\n            this.pixelBounds$.next(value);\n        }\n    }\n\n    public get pixelBounds(): Rect {\n        return this._pixelBounds;\n    }\n\n    public set percentBounds(value: Rect) {\n        this._percentBounds = value;\n    }\n\n    public get percentBounds(): Rect {\n        return this._percentBounds;\n    }\n\n    public set templateModel(value: unknown) {\n        this._templateModel = value;\n    }\n\n    public get templateModel(): unknown {\n        return this._templateModel;\n    }\n\n    public get id(): string {\n        return this._id;\n    }\n\n    public set trackBy(value: unknown) {\n        this._trackBy = value;\n    }\n\n    public get trackBy(): unknown {\n        return this._trackBy;\n    }\n\n    public set isCutted(value: boolean) {\n        if (this._cutted !== value) {\n            this._cutted = value;\n            this.cutted$.next(value);\n        }\n    }\n\n    public get isCutted(): boolean {\n        return this._cutted;\n    }\n\n    public set color(value: string) {\n        this._color = value;\n    }\n\n    public get color(): string {\n        return this._color;\n    }\n\n    public set isDragging(value: boolean) {\n        if (this._isDragging !== value) {\n            this._isDragging = value;\n            this.dragging$.next(value);\n        }\n    }\n\n    public get isDragging(): boolean {\n        return this._isDragging;\n    }\n\n    public set isDropping(value: boolean) {\n        if (this._isDropping !== value) {\n            this._isDropping = value;\n            this.dropping$.next(value);\n        }\n    }\n\n    public get isDropping(): boolean {\n        return this._isDropping;\n    }\n\n    public set isPressed(value: boolean) {\n        if (this._isPressed !== value) {\n            this._isPressed = value;\n            this.pressed$.next(value);\n        }\n    }\n\n    public get isPressed(): boolean {\n        return this._isPressed;\n    }\n\n    public set isSelected(value: boolean) {\n        if (this._selected !== value) {\n            this._selected = value;\n            this.selected$.next(value);\n        }\n    }\n\n    public get isSelected(): boolean {\n        return this._selected;\n    }\n\n    public set isHidden(value: boolean) {\n        if (this._isHidden !== value) {\n            this._isHidden = value;\n            this.hidden$.next(value);\n        }\n    }\n\n    public get isHidden(): boolean {\n        return this._isHidden;\n    }\n\n    public set isPending(value: boolean) {\n        this._pending = value;\n    }\n\n    public get isPending(): boolean {\n        return this._pending;\n    }\n\n    public get fading(): boolean {\n        return this._fading;\n    }\n\n    public set fading(value: boolean) {\n        this._fading = value;\n    }\n\n    public makeId(): void {\n        this._id = `#${DejaTile.CURRENT_ID++}`;\n    }\n\n    public equalsTo(tile: DejaTile): boolean {\n        if (this._templateModel) {\n            return this._templateModel === tile._templateModel;\n        } else {\n            return this._id === tile._id;\n        }\n    }\n\n    public clone(tile?: DejaTile): DejaTile {\n        if (!tile) {\n            tile = new DejaTile(this.id);\n        }\n\n        tile._percentBounds = this.percentBounds;\n        tile._color = this.color;\n        tile._templateModel = this.templateModel;\n        tile._cutted = this._cutted;\n        tile._selected = this._selected;\n        tile._pending = this._pending;\n        tile._fading = this._fading;\n        return tile;\n    }\n\n    public delete(): void {\n        this.deleted$.next();\n    }\n\n    public refresh(): void {\n        this.refresh$.next();\n    }\n}\n","/*\n *  @license\n *  Copyright Hôpitaux Universitaires de Genève. All Rights Reserved.\n *\n *  Use of this source code is governed by an Apache-2.0 license that can be\n *  found in the LICENSE file at https://github.com/DSI-HUG/dejajs-components/blob/master/LICENSE\n */\n\nimport { IDejaCancelableEvent } from '@deja-js/component/core';\n\nimport { DejaTile } from './tile.class';\n\nexport interface IDejaTilesEvent extends CustomEvent {\n    tiles: DejaTile[];\n}\n\nexport interface IDejaTilesCancelableEvent extends IDejaCancelableEvent {\n    tiles: DejaTile[];\n}\n\nexport interface IDejaTilesRemoveEvent extends IDejaTilesCancelableEvent {\n    removed: DejaTile[];\n}\n\nexport interface IDejaTilesAddEvent extends IDejaTilesCancelableEvent {\n    added: DejaTile[];\n}\n\nexport interface IDejaTilesAddedEvent extends IDejaTilesEvent {\n    added?: DejaTile[];\n}\n\nexport interface IDejaTilesDeletedEvent extends IDejaTilesEvent {\n    deleted?: DejaTile[];\n}\n","/*\n *  @license\n *  Copyright Hôpitaux Universitaires de Genève. All Rights Reserved.\n *\n *  Use of this source code is governed by an Apache-2.0 license that can be\n *  found in the LICENSE file at https://github.com/DSI-HUG/dejajs-components/blob/master/LICENSE\n */\n\nimport { CommonModule } from '@angular/common';\nimport { NgModule } from '@angular/core';\nimport { FormsModule } from '@angular/forms';\nimport { MatProgressSpinnerModule } from '@angular/material/progress-spinner';\nimport { MouseDragDropModule } from '@deja-js/component/v2/mouse-dragdrop';\n\nimport { DejaTileComponent } from './tile.component';\nimport { DejaTilePositionDirective } from './tile-position.directive';\nimport { DejaTilesComponent } from './tiles.component';\n\n@NgModule({\n    declarations: [DejaTileComponent, DejaTilePositionDirective, DejaTilesComponent],\n    exports: [DejaTileComponent, DejaTilesComponent],\n    imports: [\n        CommonModule,\n        FormsModule,\n        MatProgressSpinnerModule,\n        MouseDragDropModule\n    ]\n})\nexport class DejaTilesModule { }\n\nexport * from './tiles-refresh-params.interface';\nexport * from './tile.class';\nexport * from './tile.component';\nexport * from './tile-position.directive';\nexport * from './tiles.event';\nexport * from './tiles-layout.provider';\nexport * from './tiles.component';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["i1","i1.DejaTilesLayoutProvider","i2","i3","i5.DejaTileComponent","i6.DejaTilePositionDirective"],"mappings":"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"}