{"version":3,"file":"angular2gridster.mjs","sources":["../../../projects/angular2gridster/src/lib/utils/utils.ts","../../../projects/angular2gridster/src/lib/gridList/gridList.ts","../../../projects/angular2gridster/src/lib/gridster.service.ts","../../../projects/angular2gridster/src/lib/GridsterOptions.ts","../../../projects/angular2gridster/src/lib/gridster-prototype/gridster-prototype.service.ts","../../../projects/angular2gridster/src/lib/gridster.component.ts","../../../projects/angular2gridster/src/lib/gridList/GridListItem.ts","../../../projects/angular2gridster/src/lib/utils/DraggableEvent.ts","../../../projects/angular2gridster/src/lib/utils/draggable.ts","../../../projects/angular2gridster/src/lib/gridster-item/gridster-item.component.ts","../../../projects/angular2gridster/src/lib/gridster-prototype/gridster-item-prototype.directive.ts","../../../projects/angular2gridster/src/lib/gridster.module.ts","../../../projects/angular2gridster/src/public_api.ts","../../../projects/angular2gridster/src/angular2gridster.ts"],"sourcesContent":["\nimport { DraggableEvent } from './DraggableEvent';\n\nexport const utils = {\n    setCssElementPosition: function ($element: HTMLElement, position: {x: number, y: number}) {\n        $element.style.left = position.x + 'px';\n        $element.style.top = position.y + 'px';\n    },\n    resetCSSElementPosition: function ($element: HTMLElement) {\n        $element.style.left = '';\n        $element.style.top = '';\n    },\n    setTransform: function ($element: HTMLElement, position: {x: number, y: number}) {\n        const left = position.x;\n        const top = position.y;\n\n        // Replace unitless items with px\n        const translate = `translate(${left}px,${top}px)`;\n\n        $element.style['transform'] = translate;\n        $element.style['WebkitTransform'] = translate;\n        $element.style['MozTransform'] = translate;\n        $element.style['msTransform'] = translate;\n        $element.style['OTransform'] = translate;\n    },\n    resetTransform: function ($element: HTMLElement) {\n        $element.style['transform'] = '';\n        $element.style['WebkitTransform'] = '';\n        $element.style['MozTransform'] = '';\n        $element.style['msTransform'] = '';\n        $element.style['OTransform'] = '';\n    },\n    clearSelection: () => {\n        if (document['selection']) {\n            document['selection'].empty();\n        } else if (window.getSelection) {\n            window.getSelection().removeAllRanges();\n        }\n    },\n    isElementFitContainer: function (element: HTMLElement, containerEl: HTMLElement): boolean {\n        const containerRect = containerEl.getBoundingClientRect();\n        const elRect = element.getBoundingClientRect();\n\n        return elRect.left > containerRect.left &&\n            elRect.right < containerRect.right &&\n            elRect.top > containerRect.top &&\n            elRect.bottom < containerRect.bottom;\n    },\n    isElementIntersectContainer: function (element: HTMLElement, containerEl: HTMLElement): boolean {\n        const containerRect = containerEl.getBoundingClientRect();\n        const elRect = element.getBoundingClientRect();\n\n        const elWidth = elRect.right - elRect.left;\n        const elHeight = elRect.bottom - elRect.top;\n\n        return (elRect.left + (elWidth / 2)) > containerRect.left &&\n            (elRect.right - (elWidth / 2)) < containerRect.right &&\n            (elRect.top + (elHeight / 2)) > containerRect.top &&\n            (elRect.bottom - (elHeight / 2)) < containerRect.bottom;\n    },\n    isElementTouchContainer: function (element: HTMLElement, containerEl: HTMLElement): boolean {\n        const containerRect = containerEl.getBoundingClientRect();\n        const elRect = element.getBoundingClientRect();\n\n        return elRect.right > containerRect.left &&\n            elRect.bottom > containerRect.top &&\n            elRect.left < containerRect.right &&\n            elRect.top < containerRect.bottom;\n    },\n    isCursorAboveElement: function (event: DraggableEvent, element): boolean {\n        const elRect = element.getBoundingClientRect();\n\n        return event.pageX > elRect.left &&\n            event.pageX < elRect.right &&\n            event.pageY > elRect.top &&\n            event.pageY < elRect.bottom;\n    },\n    getElementOuterHeight: function ($element: HTMLElement) {\n        const styleObj = window.getComputedStyle($element);\n        // NOTE: Manually calculating height because IE's `clientHeight` isn't always\n        // reliable.\n        return parseFloat(styleObj.getPropertyValue('height')) +\n            parseFloat(styleObj.getPropertyValue('padding-top')) +\n            parseFloat(styleObj.getPropertyValue('padding-bottom'));\n    },\n    getRelativeCoordinates: (element, parentElement): {top: number, left: number} => {\n        const parentElementRect = parentElement.getBoundingClientRect();\n        const elementRect = element.getBoundingClientRect();\n\n        return {\n            top: elementRect.top - parentElementRect.top,\n            left: elementRect.left - parentElementRect.left\n        };\n    },\n    getScrollableContainer(node) {\n        const regex = /(auto|scroll)/;\n        const parents = (_node, ps) => {\n            if (_node.parentNode === null) {\n                return ps;\n            }\n            return parents(_node.parentNode, ps.concat([_node]));\n        };\n\n        const style = (_node, prop) => {\n            return getComputedStyle(_node, null).getPropertyValue(prop);\n        };\n        const overflow = _node => {\n            return (\n                style(_node, 'overflow') + style(_node, 'overflow-y') + style(_node, 'overflow-x')\n            );\n        };\n        const scroll = _node => regex.test(overflow(_node));\n\n        /* eslint-disable consistent-return */\n        const scrollParent = _node => {\n            if (!(_node instanceof HTMLElement || _node instanceof SVGElement)) {\n                return;\n            }\n\n            const ps = parents(_node.parentNode, []);\n\n            for (let i = 0; i < ps.length; i += 1) {\n                if (scroll(ps[i])) {\n                    return ps[i];\n                }\n            }\n\n            return document.scrollingElement || document.documentElement;\n        };\n\n        return scrollParent(node);\n    }\n};\n","import { GridListItem } from './GridListItem';\nimport { IGridsterOptions } from '../IGridsterOptions';\n\nconst GridCol = function(lanes) {\n    for (let i = 0; i < lanes; i++) {\n        this.push(null);\n    }\n};\n// Extend the Array prototype\nGridCol.prototype = [];\n\n/**\n * A GridList manages the two-dimensional positions from a list of items,\n * within a virtual matrix.\n *\n * The GridList's main function is to convert the item positions from one\n * grid size to another, maintaining as much of their order as possible.\n *\n * The GridList's second function is to handle collisions when moving an item\n * over another.\n *\n * The positioning algorithm places items in columns. Starting from left to\n * right, going through each column top to bottom.\n *\n * The size of an item is expressed using the number of cols and rows it\n * takes up within the grid (w and h)\n *\n * The position of an item is express using the col and row position within\n * the grid (x and y)\n *\n * An item is an object of structure:\n * {\n *   w: 3, h: 1,\n *   x: 0, y: 1\n * }\n */\nexport class GridList {\n    items: Array<GridListItem>;\n    grid: Array<Array<GridListItem>>;\n\n    options: IGridsterOptions;\n\n    constructor(items: Array<GridListItem>, options: IGridsterOptions) {\n        this.options = options;\n\n        this.items = items;\n\n        this.adjustSizeOfItems();\n\n        this.generateGrid();\n    }\n\n    /**\n     * Illustrates grid as text-based table, using a number identifier for each\n     * item. E.g.\n     *\n     *  #|  0  1  2  3  4  5  6  7  8  9 10 11 12 13\n     *  --------------------------------------------\n     *  0| 00 02 03 04 04 06 08 08 08 12 12 13 14 16\n     *  1| 01 -- 03 05 05 07 09 10 11 11 -- 13 15 --\n     *\n     * Warn: Does not work if items don't have a width or height specified\n     * besides their position in the grid.\n     */\n    toString() {\n        const widthOfGrid = this.grid.length;\n        let output = '\\n #|',\n            border = '\\n --',\n            item,\n            i,\n            j;\n\n        // Render the table header\n        for (i = 0; i < widthOfGrid; i++) {\n            output += ' ' + this.padNumber(i, ' ');\n            border += '---';\n        }\n        output += border;\n\n        // Render table contents row by row, as we go on the y axis\n        for (i = 0; i < this.options.lanes; i++) {\n            output += '\\n' + this.padNumber(i, ' ') + '|';\n            for (j = 0; j < widthOfGrid; j++) {\n                output += ' ';\n                item = this.grid[j][i];\n                output += item\n                    ? this.padNumber(this.items.indexOf(item), '0')\n                    : '--';\n            }\n        }\n        output += '\\n';\n        return output;\n    }\n\n    setOption(name: string, value: any) {\n        this.options[name] = value;\n    }\n\n    /**\n     * Build the grid structure from scratch, with the current item positions\n     */\n    generateGrid() {\n        let i;\n        this.resetGrid();\n        for (i = 0; i < this.items.length; i++) {\n            this.markItemPositionToGrid(this.items[i]);\n        }\n    }\n\n    resizeGrid(lanes: number) {\n        let currentColumn = 0;\n\n        this.options.lanes = lanes;\n        this.adjustSizeOfItems();\n\n        this.sortItemsByPosition();\n        this.resetGrid();\n\n        // The items will be sorted based on their index within the this.items array,\n        // that is their \"1d position\"\n        for (let i = 0; i < this.items.length; i++) {\n            const item = this.items[i],\n                position = this.getItemPosition(item);\n\n            this.updateItemPosition(\n                item,\n                this.findPositionForItem(item, { x: currentColumn, y: 0 })\n            );\n\n            // New items should never be placed to the left of previous items\n            currentColumn = Math.max(currentColumn, position.x);\n        }\n\n        this.pullItemsToLeft();\n    }\n\n    /**\n     * This method has two options for the position we want for the item:\n     * - Starting from a certain row/column number and only looking for\n     *   positions to its right\n     * - Accepting positions for a certain row number only (use-case: items\n     *   being shifted to the left/right as a result of collisions)\n     *\n     * @param Object item\n     * @param Object start Position from which to start\n     *     the search.\n     * @param number [fixedRow] If provided, we're going to try to find a\n     *     position for the new item on it. If doesn't fit there, we're going\n     *     to put it on the first row.\n     *\n     * @returns Array x and y.\n     */\n    findPositionForItem(\n        item: GridListItem,\n        start: { x: number; y: number },\n        fixedRow?: number\n    ): Array<number> {\n        let x, y, position;\n\n        // Start searching for a position from the horizontal position of the\n        // rightmost item from the grid\n        for (x = start.x; x < this.grid.length; x++) {\n            if (fixedRow !== undefined) {\n                position = [x, fixedRow];\n\n                if (this.itemFitsAtPosition(item, position)) {\n                    return position;\n                }\n            } else {\n                for (y = start.y; y < this.options.lanes; y++) {\n                    position = [x, y];\n\n                    if (this.itemFitsAtPosition(item, position)) {\n                        return position;\n                    }\n                }\n            }\n        }\n\n        // If we've reached this point, we need to start a new column\n        const newCol = this.grid.length;\n        let newRow = 0;\n\n        if (\n            fixedRow !== undefined &&\n            this.itemFitsAtPosition(item, [newCol, fixedRow])\n        ) {\n            newRow = fixedRow;\n        }\n\n        return [newCol, newRow];\n    }\n\n    moveAndResize(\n        item: GridListItem,\n        newPosition: Array<number>,\n        size: { w: number; h: number }\n    ) {\n        const position = this.getItemPosition({\n            x: newPosition[0],\n            y: newPosition[1],\n            w: item.w,\n            h: item.h\n        });\n        const width = size.w || item.w,\n            height = size.h || item.h;\n\n        this.updateItemPosition(item, [position.x, position.y]);\n        this.updateItemSize(item, width, height);\n\n        this.resolveCollisions(item);\n    }\n\n    moveItemToPosition(item: GridListItem, newPosition: Array<number>) {\n        const position = this.getItemPosition({\n            x: newPosition[0],\n            y: newPosition[1],\n            w: item.w,\n            h: item.h\n        });\n\n        this.updateItemPosition(item, [position.x, position.y]);\n        this.resolveCollisions(item);\n    }\n\n    /**\n     * Resize an item and resolve collisions.\n     *\n     * @param Object item A reference to an item that's part of the grid.\n     * @param Object size\n     * @param number [size.w=item.w] The new width.\n     * @param number [size.h=item.h] The new height.\n     */\n    resizeItem(item: GridListItem, size: { w: number; h: number }) {\n        const width = size.w || item.w,\n            height = size.h || item.h;\n\n        this.updateItemSize(item, width, height);\n\n        this.pullItemsToLeft(item);\n    }\n\n    /**\n     * Compare the current items against a previous snapshot and return only\n     * the ones that changed their attributes in the meantime. This includes both\n     * position (x, y) and size (w, h)\n     *\n     * Each item that is returned is not the GridListItem but the helper that holds GridListItem\n     * and list of changed properties.\n     */\n    getChangedItems(\n        initialItems: Array<GridListItem>,\n        breakpoint?\n    ): Array<{\n        item: GridListItem;\n        changes: Array<string>;\n        isNew: boolean;\n    }> {\n        return this.items\n            .map((item: GridListItem) => {\n                const changes = [];\n                const oldValues: {\n                    x?: number;\n                    y?: number;\n                    w?: number;\n                    h?: number;\n                } = {};\n                const initItem = initialItems.find(\n                    initItm => initItm.$element === item.$element\n                );\n\n                if (!initItem) {\n                    return { item, changes: ['x', 'y', 'w', 'h'], isNew: true };\n                }\n\n                const oldX = initItem.getValueX(breakpoint);\n                if (item.getValueX(breakpoint) !== oldX) {\n                    changes.push('x');\n                    if (oldX || oldX === 0) {\n                        oldValues.x = oldX;\n                    }\n                }\n\n                const oldY = initItem.getValueY(breakpoint);\n                if (item.getValueY(breakpoint) !== oldY) {\n                    changes.push('y');\n                    if (oldY || oldY === 0) {\n                        oldValues.y = oldY;\n                    }\n                }\n                if (\n                    item.getValueW(breakpoint) !==\n                    initItem.getValueW(breakpoint)\n                ) {\n                    changes.push('w');\n                    oldValues.w = initItem.w;\n                }\n                if (\n                    item.getValueH(breakpoint) !==\n                    initItem.getValueH(breakpoint)\n                ) {\n                    changes.push('h');\n                    oldValues.h = initItem.h;\n                }\n\n                return { item, oldValues, changes, isNew: false };\n            })\n            .filter(\n                (itemChange: {\n                    item: GridListItem;\n                    changes: Array<string>;\n                }) => {\n                    return itemChange.changes.length;\n                }\n            );\n    }\n\n    resolveCollisions(item: GridListItem) {\n        if (!this.tryToResolveCollisionsLocally(item)) {\n            this.pullItemsToLeft(item);\n        }\n        if (this.options.floating) {\n            this.pullItemsToLeft();\n        } else if (this.getItemsCollidingWithItem(item).length) {\n            this.pullItemsToLeft();\n        }\n    }\n\n    pushCollidingItems(fixedItem?: GridListItem) {\n        // Start a fresh grid with the fixed item already placed inside\n        this.sortItemsByPosition();\n        this.resetGrid();\n        this.generateGrid();\n\n        this.items\n            .filter(item => !this.isItemFloating(item) && item !== fixedItem)\n            .forEach(item => {\n                if (!this.tryToResolveCollisionsLocally(item)) {\n                    this.pullItemsToLeft(item);\n                }\n            });\n    }\n\n    /**\n     * Build the grid from scratch, by using the current item positions and\n     * pulling them as much to the left as possible, removing as space between\n     * them as possible.\n     *\n     * If a \"fixed item\" is provided, its position will be kept intact and the\n     * rest of the items will be layed around it.\n     */\n    pullItemsToLeft(fixedItem?) {\n        if (this.options.direction === 'none') {\n            return;\n        }\n\n        // Start a fresh grid with the fixed item already placed inside\n        this.sortItemsByPosition();\n        this.resetGrid();\n\n        // Start the grid with the fixed item as the first positioned item\n        if (fixedItem) {\n            const fixedPosition = this.getItemPosition(fixedItem);\n            this.updateItemPosition(fixedItem, [\n                fixedPosition.x,\n                fixedPosition.y\n            ]);\n        }\n\n        this.items\n            .filter((item: GridListItem) => {\n                return !item.dragAndDrop && item !== fixedItem;\n            })\n            .forEach((item: GridListItem) => {\n                const fixedPosition = this.getItemPosition(item);\n                this.updateItemPosition(item, [\n                    fixedPosition.x,\n                    fixedPosition.y\n                ]);\n            });\n\n        for (let i = 0; i < this.items.length; i++) {\n            const item = this.items[i],\n                position = this.getItemPosition(item);\n\n            // The fixed item keeps its exact position\n            if (\n                (fixedItem && item === fixedItem) ||\n                !item.dragAndDrop ||\n                (!this.options.floating &&\n                    this.isItemFloating(item) &&\n                    !this.getItemsCollidingWithItem(item).length)\n            ) {\n                continue;\n            }\n\n            const x = this.findLeftMostPositionForItem(item),\n                newPosition = this.findPositionForItem(\n                    item,\n                    { x: x, y: 0 },\n                    position.y\n                );\n\n            this.updateItemPosition(item, newPosition);\n        }\n    }\n\n    isOverFixedArea(\n        x: number,\n        y: number,\n        w: number,\n        h: number,\n        item: GridListItem = null\n    ): boolean {\n        let itemData = { x, y, w, h };\n\n        if (this.options.direction !== 'horizontal') {\n            itemData = { x: y, y: x, w: h, h: w };\n        }\n\n        for (let i = itemData.x; i < itemData.x + itemData.w; i++) {\n            for (let j = itemData.y; j < itemData.y + itemData.h; j++) {\n                if (\n                    this.grid[i] &&\n                    this.grid[i][j] &&\n                    this.grid[i][j] !== item &&\n                    !this.grid[i][j].dragAndDrop\n                ) {\n                    return true;\n                }\n            }\n        }\n        return false;\n    }\n\n    checkItemAboveEmptyArea(\n        item: GridListItem,\n        newPosition: { x: number; y: number }\n    ) {\n        let itemData = {\n            x: newPosition.x,\n            y: newPosition.y,\n            w: item.w,\n            h: item.h\n        };\n        if (\n            !item.itemPrototype &&\n            item.x === newPosition.x &&\n            item.y === newPosition.y\n        ) {\n            return true;\n        }\n\n        if (this.options.direction === 'horizontal') {\n            itemData = {\n                x: newPosition.y,\n                y: newPosition.x,\n                w: itemData.h,\n                h: itemData.w\n            };\n        }\n        return !this.checkItemsInArea(\n            itemData.y,\n            itemData.y + itemData.h - 1,\n            itemData.x,\n            itemData.x + itemData.w - 1,\n            item\n        );\n    }\n\n    fixItemsPositions(options: IGridsterOptions) {\n        // items with x, y that fits gird with size of options.lanes\n        const validItems = this.items\n            .filter((item: GridListItem) => item.itemComponent)\n            .filter((item: GridListItem) =>\n                this.isItemValidForGrid(item, options)\n            );\n        // items that x, y must be generated\n        const invalidItems = this.items\n            .filter((item: GridListItem) => item.itemComponent)\n            .filter(\n                (item: GridListItem) => !this.isItemValidForGrid(item, options)\n            );\n\n        const gridList = new GridList([], options);\n\n        // put items with defined positions to the grid\n        gridList.items = validItems.map((item: GridListItem) => {\n            return item.copyForBreakpoint(options.breakpoint);\n        });\n\n        gridList.generateGrid();\n\n        invalidItems.forEach(item => {\n            // TODO: check if this change does not broke anything\n            // const itemCopy = item.copy();\n            const itemCopy = item.copyForBreakpoint(options.breakpoint);\n            const position = gridList.findPositionForItem(itemCopy, {\n                x: 0,\n                y: 0\n            });\n\n            gridList.items.push(itemCopy);\n            gridList.setItemPosition(itemCopy, position);\n            gridList.markItemPositionToGrid(itemCopy);\n        });\n\n        gridList.pullItemsToLeft();\n        gridList.pushCollidingItems();\n\n        this.items.forEach((itm: GridListItem) => {\n            const cachedItem = gridList.items.filter(cachedItm => {\n                return cachedItm.$element === itm.$element;\n            })[0];\n\n            itm.setValueX(cachedItem.x, options.breakpoint);\n            itm.setValueY(cachedItem.y, options.breakpoint);\n            itm.setValueW(cachedItem.w, options.breakpoint);\n            itm.setValueH(cachedItem.h, options.breakpoint);\n            itm.autoSize = cachedItem.autoSize;\n        });\n    }\n\n    deleteItemPositionFromGrid(item: GridListItem) {\n        const position = this.getItemPosition(item);\n        let x, y;\n\n        for (x = position.x; x < position.x + position.w; x++) {\n            // It can happen to try to remove an item from a position not generated\n            // in the grid, probably when loading a persisted grid of items. No need\n            // to create a column to be able to remove something from it, though\n            if (!this.grid[x]) {\n                continue;\n            }\n\n            for (y = position.y; y < position.y + position.h; y++) {\n                // Don't clear the cell if it's been occupied by a different widget in\n                // the meantime (e.g. when an item has been moved over this one, and\n                // thus by continuing to clear this item's previous position you would\n                // cancel the first item's move, leaving it without any position even)\n                if (this.grid[x][y] === item) {\n                    this.grid[x][y] = null;\n                }\n            }\n        }\n    }\n\n    private isItemFloating(item) {\n        if (item.itemComponent && item.itemComponent.isDragging) {\n            return false;\n        }\n        const position = this.getItemPosition(item);\n\n        if (position.x === 0) {\n            return false;\n        }\n        const rowBelowItem = this.grid[position.x - 1];\n\n        return (rowBelowItem || [])\n            .slice(position.y, position.y + position.h)\n            .reduce((isFloating, cellItem) => {\n                return isFloating && !cellItem;\n            }, true);\n    }\n\n    private isItemValidForGrid(item: GridListItem, options: IGridsterOptions) {\n        const itemData =\n            options.direction === 'horizontal'\n                ? {\n                      x: item.getValueY(options.breakpoint),\n                      y: item.getValueX(options.breakpoint),\n                      w: item.getValueH(options.breakpoint),\n                      h: Math.min(\n                          item.getValueW(this.options.breakpoint),\n                          options.lanes\n                      )\n                  }\n                : {\n                      x: item.getValueX(options.breakpoint),\n                      y: item.getValueY(options.breakpoint),\n                      w: Math.min(\n                          item.getValueW(this.options.breakpoint),\n                          options.lanes\n                      ),\n                      h: item.getValueH(options.breakpoint)\n                  };\n\n        return (\n            typeof itemData.x === 'number' &&\n            typeof itemData.y === 'number' &&\n            itemData.x + itemData.w <= options.lanes\n        );\n    }\n\n    private findDefaultPositionHorizontal(width: number, height: number) {\n        for (const col of this.grid) {\n            const colIdx = this.grid.indexOf(col);\n            let rowIdx = 0;\n            while (rowIdx < col.length - height + 1) {\n                if (\n                    !this.checkItemsInArea(\n                        colIdx,\n                        colIdx + width - 1,\n                        rowIdx,\n                        rowIdx + height - 1\n                    )\n                ) {\n                    return [colIdx, rowIdx];\n                }\n                rowIdx++;\n            }\n        }\n        return [this.grid.length, 0];\n    }\n\n    private findDefaultPositionVertical(width: number, height: number) {\n        for (const row of this.grid) {\n            const rowIdx = this.grid.indexOf(row);\n            let colIdx = 0;\n            while (colIdx < row.length - width + 1) {\n                if (\n                    !this.checkItemsInArea(\n                        rowIdx,\n                        rowIdx + height - 1,\n                        colIdx,\n                        colIdx + width - 1\n                    )\n                ) {\n                    return [colIdx, rowIdx];\n                }\n                colIdx++;\n            }\n        }\n        return [0, this.grid.length];\n    }\n\n    private checkItemsInArea(\n        rowStart: number,\n        rowEnd: number,\n        colStart: number,\n        colEnd: number,\n        item?: GridListItem\n    ) {\n        for (let i = rowStart; i <= rowEnd; i++) {\n            for (let j = colStart; j <= colEnd; j++) {\n                if (\n                    this.grid[i] &&\n                    this.grid[i][j] &&\n                    (item ? this.grid[i][j] !== item : true)\n                ) {\n                    return true;\n                }\n            }\n        }\n        return false;\n    }\n\n    private sortItemsByPosition() {\n        this.items.sort((item1, item2) => {\n            const position1 = this.getItemPosition(item1),\n                position2 = this.getItemPosition(item2);\n\n            // Try to preserve columns.\n            if (position1.x !== position2.x) {\n                return position1.x - position2.x;\n            }\n\n            if (position1.y !== position2.y) {\n                return position1.y - position2.y;\n            }\n\n            // The items are placed on the same position.\n            return 0;\n        });\n    }\n\n    /**\n     * Some items can have 100% height or 100% width. Those dimmensions are\n     * expressed as 0. We need to ensure a valid width and height for each of\n     * those items as the number of items per lane.\n     */\n    private adjustSizeOfItems() {\n        for (let i = 0; i < this.items.length; i++) {\n            const item = this.items[i];\n\n            // This can happen only the first time items are checked.\n            // We need the property to have a value for all the items so that the\n            // `cloneItems` method will merge the properties properly. If we only set\n            // it to the items that need it then the following can happen:\n            //\n            // cloneItems([{id: 1, autoSize: true}, {id: 2}],\n            //            [{id: 2}, {id: 1, autoSize: true}]);\n            //\n            // will result in\n            //\n            // [{id: 1, autoSize: true}, {id: 2, autoSize: true}]\n            if (item.autoSize === undefined) {\n                item.autoSize = item.w === 0 || item.h === 0;\n            }\n\n            if (item.autoSize) {\n                if (this.options.direction === 'horizontal') {\n                    item.h = this.options.lanes;\n                } else {\n                    item.w = this.options.lanes;\n                }\n            }\n        }\n    }\n\n    private resetGrid() {\n        this.grid = [];\n    }\n\n    /**\n     * Check that an item wouldn't overlap with another one if placed at a\n     * certain position within the grid\n     */\n    private itemFitsAtPosition(item: GridListItem, newPosition) {\n        const position = this.getItemPosition(item);\n        let x, y;\n\n        // No coordonate can be negative\n        if (newPosition[0] < 0 || newPosition[1] < 0) {\n            return false;\n        }\n\n        // Make sure the item isn't larger than the entire grid\n        if (\n            newPosition[1] + Math.min(position.h, this.options.lanes) >\n            this.options.lanes\n        ) {\n            return false;\n        }\n\n        if (this.isOverFixedArea(item.x, item.y, item.w, item.h)) {\n            return false;\n        }\n\n        // Make sure the position doesn't overlap with an already positioned\n        // item.\n        for (x = newPosition[0]; x < newPosition[0] + position.w; x++) {\n            const col = this.grid[x];\n            // Surely a column that hasn't even been created yet is available\n            if (!col) {\n                continue;\n            }\n\n            for (y = newPosition[1]; y < newPosition[1] + position.h; y++) {\n                // Any space occupied by an item can continue to be occupied by the\n                // same item.\n                if (col[y] && col[y] !== item) {\n                    return false;\n                }\n            }\n        }\n\n        return true;\n    }\n\n    private updateItemPosition(item: GridListItem, position: Array<any>) {\n        if (item.x !== null && item.y !== null) {\n            this.deleteItemPositionFromGrid(item);\n        }\n\n        this.setItemPosition(item, position);\n\n        this.markItemPositionToGrid(item);\n    }\n\n    /**\n     * @param Object item A reference to a grid item.\n     * @param number width The new width.\n     * @param number height The new height.\n     */\n    private updateItemSize(item: GridListItem, width, height) {\n        if (item.x !== null && item.y !== null) {\n            this.deleteItemPositionFromGrid(item);\n        }\n\n        item.w = width;\n        item.h = height;\n\n        this.markItemPositionToGrid(item);\n    }\n\n    /**\n     * Mark the grid cells that are occupied by an item. This prevents items\n     * from overlapping in the grid\n     */\n    private markItemPositionToGrid(item: GridListItem) {\n        const position = this.getItemPosition(item);\n        let x, y;\n\n        // Ensure that the grid has enough columns to accomodate the current item.\n        this.ensureColumns(position.x + position.w);\n\n        for (x = position.x; x < position.x + position.w; x++) {\n            for (y = position.y; y < position.y + position.h; y++) {\n                this.grid[x][y] = item;\n            }\n        }\n    }\n\n    /**\n     * Ensure that the grid has at least N columns available.\n     */\n    private ensureColumns(N) {\n        for (let i = 0; i < N; i++) {\n            if (!this.grid[i]) {\n                this.grid.push(new GridCol(this.options.lanes));\n            }\n        }\n    }\n\n    private getItemsCollidingWithItem(item: GridListItem): number[] {\n        const collidingItems = [];\n        for (let i = 0; i < this.items.length; i++) {\n            if (\n                item !== this.items[i] &&\n                this.itemsAreColliding(item, this.items[i])\n            ) {\n                collidingItems.push(i);\n            }\n        }\n        return collidingItems;\n    }\n\n    private itemsAreColliding(item1: GridListItem, item2: GridListItem) {\n        const position1 = this.getItemPosition(item1),\n            position2 = this.getItemPosition(item2);\n\n        return !(\n            position2.x >= position1.x + position1.w ||\n            position2.x + position2.w <= position1.x ||\n            position2.y >= position1.y + position1.h ||\n            position2.y + position2.h <= position1.y\n        );\n    }\n\n    /**\n     * Attempt to resolve the collisions after moving an item over one or more\n     * other items within the grid, by shifting the position of the colliding\n     * items around the moving one. This might result in subsequent collisions,\n     * in which case we will revert all position permutations. To be able to\n     * revert to the initial item positions, we create a virtual grid in the\n     * process\n     */\n    private tryToResolveCollisionsLocally(item: GridListItem) {\n        const collidingItems = this.getItemsCollidingWithItem(item);\n        if (!collidingItems.length) {\n            return true;\n        }\n\n        const _gridList = new GridList(\n            this.items.map(itm => {\n                return itm.copy();\n            }),\n            this.options\n        );\n\n        let leftOfItem;\n        let rightOfItem;\n        let aboveOfItem;\n        let belowOfItem;\n\n        for (let i = 0; i < collidingItems.length; i++) {\n            const collidingItem = _gridList.items[collidingItems[i]],\n                collidingPosition = this.getItemPosition(collidingItem);\n\n            // We use a simple algorithm for moving items around when collisions occur:\n            // In this prioritized order, we try to move a colliding item around the\n            // moving one:\n            // 1. to its left side\n            // 2. above it\n            // 3. under it\n            // 4. to its right side\n            const position = this.getItemPosition(item);\n\n            leftOfItem = [\n                position.x - collidingPosition.w,\n                collidingPosition.y\n            ];\n            rightOfItem = [position.x + position.w, collidingPosition.y];\n            aboveOfItem = [\n                collidingPosition.x,\n                position.y - collidingPosition.h\n            ];\n            belowOfItem = [collidingPosition.x, position.y + position.h];\n\n            if (_gridList.itemFitsAtPosition(collidingItem, leftOfItem)) {\n                _gridList.updateItemPosition(collidingItem, leftOfItem);\n            } else if (\n                _gridList.itemFitsAtPosition(collidingItem, aboveOfItem)\n            ) {\n                _gridList.updateItemPosition(collidingItem, aboveOfItem);\n            } else if (\n                _gridList.itemFitsAtPosition(collidingItem, belowOfItem)\n            ) {\n                _gridList.updateItemPosition(collidingItem, belowOfItem);\n            } else if (\n                _gridList.itemFitsAtPosition(collidingItem, rightOfItem)\n            ) {\n                _gridList.updateItemPosition(collidingItem, rightOfItem);\n            } else {\n                // Collisions failed, we must use the pullItemsToLeft method to arrange\n                // the other items around this item with fixed position. This is our\n                // plan B for when local collision resolving fails.\n                return false;\n            }\n        }\n        // If we reached this point it means we managed to resolve the collisions\n        // from one single iteration, just by moving the colliding items around. So\n        // we accept this scenario and merge the branched-out grid instance into the\n        // original one\n\n        this.items.forEach((itm: GridListItem, idx: number) => {\n            const cachedItem = _gridList.items.filter(cachedItm => {\n                return cachedItm.$element === itm.$element;\n            })[0];\n\n            itm.x = cachedItem.x;\n            itm.y = cachedItem.y;\n            itm.w = cachedItem.w;\n            itm.h = cachedItem.h;\n            itm.autoSize = cachedItem.autoSize;\n        });\n        this.generateGrid();\n        return true;\n    }\n\n    /**\n     * When pulling items to the left, we need to find the leftmost position for\n     * an item, with two considerations in mind:\n     * - preserving its current row\n     * - preserving the previous horizontal order between items\n     */\n    private findLeftMostPositionForItem(item) {\n        let tail = 0;\n        const position = this.getItemPosition(item);\n\n        for (let i = 0; i < this.grid.length; i++) {\n            for (let j = position.y; j < position.y + position.h; j++) {\n                const otherItem = this.grid[i][j];\n\n                if (!otherItem) {\n                    continue;\n                }\n\n                const otherPosition = this.getItemPosition(otherItem);\n\n                if (this.items.indexOf(otherItem) < this.items.indexOf(item)) {\n                    tail = otherPosition.x + otherPosition.w;\n                }\n            }\n        }\n\n        return tail;\n    }\n\n    private findItemByPosition(x: number, y: number): GridListItem {\n        for (let i = 0; i < this.items.length; i++) {\n            if (this.items[i].x === x && this.items[i].y === y) {\n                return this.items[i];\n            }\n        }\n    }\n\n    private getItemByAttribute(key, value) {\n        for (let i = 0; i < this.items.length; i++) {\n            if (this.items[i][key] === value) {\n                return this.items[i];\n            }\n        }\n        return null;\n    }\n\n    private padNumber(nr, prefix) {\n        // Currently works for 2-digit numbers (<100)\n        return nr >= 10 ? nr : prefix + nr;\n    }\n\n    /**\n     * If the direction is vertical we need to rotate the grid 90 deg to the\n     * left. Thus, we simulate the fact that items are being pulled to the top.\n     *\n     * Since the items have widths and heights, if we apply the classic\n     * counter-clockwise 90 deg rotation\n     *\n     *     [0 -1]\n     *     [1  0]\n     *\n     * then the top left point of an item will become the bottom left point of\n     * the rotated item. To adjust for this, we need to subtract from the y\n     * position the height of the original item - the width of the rotated item.\n     *\n     * However, if we do this then we'll reverse some actions: resizing the\n     * width of an item will stretch the item to the left instead of to the\n     * right; resizing an item that doesn't fit into the grid will push the\n     * items around it instead of going on a new row, etc.\n     *\n     * We found it better to do a vertical flip of the grid after rotating it.\n     * This restores the direction of the actions and greatly simplifies the\n     * transformations.\n     */\n    private getItemPosition(item: any) {\n        if (this.options.direction === 'horizontal') {\n            return item;\n        } else {\n            return {\n                x: item.y,\n                y: item.x,\n                w: item.h,\n                h: item.w\n            };\n        }\n    }\n\n    /**\n     * See getItemPosition.\n     */\n    private setItemPosition(item, position) {\n        if (this.options.direction === 'horizontal') {\n            item.x = position[0];\n            item.y = position[1];\n        } else {\n            // We're supposed to subtract the rotated item's height which is actually\n            // the non-rotated item's width.\n            item.x = position[1];\n            item.y = position[0];\n        }\n    }\n}\n","import { Injectable } from '@angular/core';\nimport { Subject } from 'rxjs';\nimport { debounceTime } from 'rxjs/operators';\n\nimport { GridList } from './gridList/gridList';\nimport { IGridsterOptions } from './IGridsterOptions';\nimport { IGridsterDraggableOptions } from './IGridsterDraggableOptions';\nimport { GridListItem } from './gridList/GridListItem';\nimport { GridsterComponent } from './gridster.component';\nimport { GridsterOptions } from './GridsterOptions';\n\n@Injectable()\nexport class GridsterService {\n    $element: HTMLElement;\n\n    gridList: GridList;\n\n    items: Array<GridListItem> = [];\n    _items: Array<GridListItem> = [];\n    _itemsMap: { [breakpoint: string]: Array<GridListItem> } = {};\n    disabledItems: Array<GridListItem> = [];\n\n    options: IGridsterOptions;\n    draggableOptions: IGridsterDraggableOptions;\n\n    gridsterRect: ClientRect;\n    gridsterScrollData: { scrollTop: number, scrollLeft: number };\n\n    gridsterOptions: GridsterOptions;\n\n    gridsterComponent: GridsterComponent;\n\n    debounceRenderSubject = new Subject();\n\n    public $positionHighlight: HTMLElement;\n\n    public maxItemWidth: number;\n    public maxItemHeight: number;\n\n    public cellWidth: number;\n    public cellHeight: number;\n\n    public itemRemoveSubject: Subject<GridListItem> = new Subject();\n\n    private _fontSize: number;\n\n    private previousDragPosition: Array<number>;\n    private previousDragSize: Array<number>;\n\n    private currentElement: HTMLElement;\n\n    private _maxGridCols: number;\n\n    private isInit = false;\n\n    constructor() {\n        this.itemRemoveSubject.pipe(debounceTime(0)).subscribe(() => {\n            this.gridList.pullItemsToLeft();\n            this.render();\n            this.updateCachedItems();\n        });\n\n        this.debounceRenderSubject.pipe(debounceTime(0)).subscribe(() => this.render());\n    }\n\n    isInitialized(): boolean {\n        return this.isInit;\n    }\n\n    /**\n     * Must be called before init\n     * @param item\n     */\n    registerItem(item: GridListItem) {\n\n        this.items.push(item);\n        return item;\n    }\n\n    init(gridsterComponent: GridsterComponent) {\n\n        this.gridsterComponent = gridsterComponent;\n\n        this.draggableOptions = gridsterComponent.draggableOptions;\n\n        this.gridsterOptions = gridsterComponent.gridsterOptions;\n    }\n\n    start() {\n        this.updateMaxItemSize();\n\n        // Used to highlight a position an element will land on upon drop\n        if (this.$positionHighlight) {\n            this.removePositionHighlight();\n        }\n\n        this.initGridList();\n\n        this.isInit = true;\n\n        setTimeout(() => {\n            this.copyItems();\n            this.fixItemsPositions();\n\n            this.gridsterComponent.reflowGridster(true);\n            this.gridsterComponent.setReady();\n        });\n    }\n\n    initGridList() {\n        // Create instance of GridList (decoupled lib for handling the grid\n        // positioning and sorting post-drag and dropping)\n        this.gridList = new GridList(this.items, this.options);\n    }\n\n    render() {\n        this.updateMaxItemSize();\n        this.gridList.generateGrid();\n        this.applySizeToItems();\n        this.applyPositionToItems();\n        this.refreshLines();\n    }\n\n    reflow() {\n        this.calculateCellSize();\n        this.render();\n    }\n\n    fixItemsPositions() {\n        if (this.options.responsiveSizes) {\n            this.gridList.fixItemsPositions(this.options);\n        } else {\n            this.gridList.fixItemsPositions(this.gridsterOptions.basicOptions);\n            this.gridsterOptions.responsiveOptions.forEach((options: IGridsterOptions) => {\n                this.gridList.fixItemsPositions(options);\n            });\n        }\n\n        this.updateCachedItems();\n    }\n\n    removeItem(item: GridListItem) {\n        const idx = this.items.indexOf(item);\n\n        if (idx >= 0) {\n            this.items.splice(this.items.indexOf(item), 1);\n        }\n\n        this.gridList.deleteItemPositionFromGrid(item);\n        this.removeItemFromCache(item);\n    }\n\n    onResizeStart(item: GridListItem) {\n        this.currentElement = item.$element;\n\n        this.copyItems();\n\n        this._maxGridCols = this.gridList.grid.length;\n\n        this.highlightPositionForItem(item);\n\n        this.gridsterComponent.isResizing = true;\n\n        this.refreshLines();\n    }\n\n    onResizeDrag(item: GridListItem) {\n        const newSize = this.snapItemSizeToGrid(item);\n        const sizeChanged = this.dragSizeChanged(newSize);\n        const newPosition = this.snapItemPositionToGrid(item);\n        const positionChanged = this.dragPositionChanged(newPosition);\n\n        if (sizeChanged || positionChanged) {\n            // Regenerate the grid with the positions from when the drag started\n            this.restoreCachedItems();\n            this.gridList.generateGrid();\n\n            this.previousDragPosition = newPosition;\n            this.previousDragSize = newSize;\n\n            this.gridList.moveAndResize(item, newPosition, {w: newSize[0], h: newSize[1]});\n\n            // Visually update item positions and highlight shape\n            this.applyPositionToItems(true);\n            this.highlightPositionForItem(item);\n        }\n    }\n\n    onResizeStop(item: GridListItem) {\n        this.currentElement = undefined;\n        this.updateCachedItems();\n        this.previousDragSize = null;\n\n        this.removePositionHighlight();\n\n        this.gridsterComponent.isResizing = false;\n\n        this.gridList.pullItemsToLeft(item);\n        this.debounceRenderSubject.next();\n\n        this.fixItemsPositions();\n    }\n\n    onStart(item: GridListItem) {\n        this.currentElement = item.$element;\n        // itemCtrl.isDragging = true;\n        // Create a deep copy of the items; we use them to revert the item\n        // positions after each drag change, making an entire drag operation less\n        // distructable\n        this.copyItems();\n\n        // Since dragging actually alters the grid, we need to establish the number\n        // of cols (+1 extra) before the drag starts\n\n        this._maxGridCols = this.gridList.grid.length;\n\n        this.gridsterComponent.isDragging = true;\n        this.gridsterComponent.updateGridsterElementData();\n\n        this.refreshLines();\n    }\n\n    onDrag(item: GridListItem) {\n        const newPosition = this.snapItemPositionToGrid(item);\n\n        if (this.dragPositionChanged(newPosition)) {\n\n            // Regenerate the grid with the positions from when the drag started\n            this.restoreCachedItems();\n            this.gridList.generateGrid();\n\n            this.previousDragPosition = newPosition;\n            if (this.options.direction === 'none' &&\n                !this.gridList.checkItemAboveEmptyArea(item, {x: newPosition[0], y: newPosition[1]})) {\n                return;\n            }\n\n            // Since the items list is a deep copy, we need to fetch the item\n            // corresponding to this drag action again\n            this.gridList.moveItemToPosition(item, newPosition);\n\n            // Visually update item positions and highlight shape\n            this.applyPositionToItems(true);\n            this.highlightPositionForItem(item);\n        }\n    }\n\n    cancel() {\n        this.restoreCachedItems();\n        this.previousDragPosition = null;\n        this.updateMaxItemSize();\n        this.applyPositionToItems();\n        this.removePositionHighlight();\n        this.currentElement = undefined;\n        this.gridsterComponent.isDragging = false;\n    }\n\n    onDragOut (item: GridListItem) {\n\n        this.cancel();\n\n        const idx = this.items.indexOf(item);\n        if (idx >= 0) {\n            this.items.splice(idx, 1);\n        }\n\n        this.gridList.pullItemsToLeft();\n        this.render();\n    }\n\n    onStop(item: GridListItem) {\n        this.currentElement = undefined;\n        this.updateCachedItems();\n        this.previousDragPosition = null;\n\n        this.removePositionHighlight();\n\n        this.gridList.pullItemsToLeft(item);\n\n        this.gridsterComponent.isDragging = false;\n\n        this.refreshLines();\n    }\n\n    calculateCellSize() {\n        if (this.options.direction === 'horizontal') {\n            this.cellHeight = this.calculateCellHeight();\n            this.cellWidth = this.options.cellWidth || this.cellHeight * this.options.widthHeightRatio;\n        } else {\n            this.cellWidth = this.calculateCellWidth();\n            this.cellHeight = this.options.cellHeight || this.cellWidth / this.options.widthHeightRatio;\n        }\n        if (this.options.heightToFontSizeRatio) {\n            this._fontSize = this.cellHeight * this.options.heightToFontSizeRatio;\n        }\n    }\n\n    applyPositionToItems(increaseGridsterSize?) {\n        if (!this.options.shrink) {\n            increaseGridsterSize = true;\n        }\n        // TODO: Implement group separators\n        for (let i = 0; i < this.items.length; i++) {\n            // Don't interfere with the positions of the dragged items\n            if (this.isCurrentElement(this.items[i].$element)) {\n                continue;\n            }\n            this.items[i].applyPosition(this);\n        }\n\n        const child = <HTMLElement>this.gridsterComponent.$element.firstChild;\n        // Update the width of the entire grid container with enough room on the\n        // right to allow dragging items to the end of the grid.\n        if (this.options.direction === 'horizontal') {\n            const increaseWidthWith = (increaseGridsterSize) ? this.maxItemWidth : 0;\n            child.style.height = '';\n            child.style.width = ((this.gridList.grid.length + increaseWidthWith) * this.cellWidth) + 'px';\n\n        } else if (this.gridList.grid.length) {\n            const increaseHeightWith = (increaseGridsterSize) ? this.maxItemHeight : 0;\n            child.style.height = ((this.gridList.grid.length + increaseHeightWith) * this.cellHeight) + 'px';\n            child.style.width = '';\n        }\n    }\n\n    refreshLines() {\n        const gridsterContainer = <HTMLElement>this.gridsterComponent.$element.firstChild;\n\n        if (this.options.lines && this.options.lines.visible &&\n            (this.gridsterComponent.isDragging || this.gridsterComponent.isResizing || this.options.lines.always)) {\n            const linesColor = this.options.lines.color || '#d8d8d8';\n            const linesBgColor = this.options.lines.backgroundColor || 'transparent';\n            const linesWidth = this.options.lines.width || 1;\n            const bgPosition = linesWidth / 2;\n\n            gridsterContainer.style.backgroundSize = `${this.cellWidth}px ${this.cellHeight}px`;\n            gridsterContainer.style.backgroundPosition = `-${bgPosition}px -${bgPosition}px`;\n            gridsterContainer.style.backgroundImage = `\n                linear-gradient(to right, ${linesColor} ${linesWidth}px, ${linesBgColor} ${linesWidth}px),\n                linear-gradient(to bottom, ${linesColor} ${linesWidth}px, ${linesBgColor} ${linesWidth}px)\n            `;\n        } else {\n            gridsterContainer.style.backgroundSize = '';\n            gridsterContainer.style.backgroundPosition = '';\n            gridsterContainer.style.backgroundImage = '';\n        }\n    }\n\n    private removeItemFromCache(item: GridListItem) {\n        this._items = this._items\n            .filter(cachedItem => cachedItem.$element !== item.$element);\n\n        Object.keys(this._itemsMap)\n            .forEach((breakpoint: string) => {\n                this._itemsMap[breakpoint] = this._itemsMap[breakpoint]\n                    .filter(cachedItem => cachedItem.$element !== item.$element);\n            });\n    }\n\n    private copyItems(): void {\n        this._items = this.items\n            .filter(item => this.isValidGridItem(item))\n            .map((item: GridListItem) => {\n                return item.copyForBreakpoint(null);\n            });\n\n        this.gridsterOptions.responsiveOptions.forEach((options: IGridsterOptions) => {\n            this._itemsMap[options.breakpoint] = this.items\n                .filter(item => this.isValidGridItem(item))\n                .map((item: GridListItem) => {\n                    return item.copyForBreakpoint(options.breakpoint);\n                });\n        });\n    }\n\n    /**\n     * Update maxItemWidth and maxItemHeight vales according to current state of items\n     */\n    private updateMaxItemSize() {\n        this.maxItemWidth = Math.max.apply(\n            null, this.items.map((item) => {\n                return item.w;\n            }));\n        this.maxItemHeight = Math.max.apply(\n            null, this.items.map((item) => {\n                return item.h;\n            }));\n    }\n\n    /**\n     * Update items properties of previously cached items\n     */\n    private restoreCachedItems() {\n        const items = this.options.breakpoint ? this._itemsMap[this.options.breakpoint] : this._items;\n\n        this.items\n            .filter(item => this.isValidGridItem(item))\n            .forEach((item: GridListItem) => {\n                const cachedItem: GridListItem = items.filter(cachedItm => {\n                    return cachedItm.$element === item.$element;\n                })[0];\n\n                item.x = cachedItem.x;\n                item.y = cachedItem.y;\n\n                item.w = cachedItem.w;\n                item.h = cachedItem.h;\n                item.autoSize = cachedItem.autoSize;\n            });\n    }\n\n    /**\n     * If item should react on grid\n     * @param GridListItem item\n     * @returns boolean\n     */\n    private isValidGridItem(item: GridListItem): boolean {\n        if (this.options.direction === 'none') {\n            return !!item.itemComponent;\n        }\n        return true;\n    }\n\n    private calculateCellWidth() {\n        const gridsterWidth = parseFloat(window.getComputedStyle(this.gridsterComponent.$element).width);\n\n        return gridsterWidth / this.options.lanes;\n    }\n\n    private calculateCellHeight() {\n        const gridsterHeight = parseFloat(window.getComputedStyle(this.gridsterComponent.$element).height);\n\n        return gridsterHeight / this.options.lanes;\n    }\n\n    private applySizeToItems() {\n        for (let i = 0; i < this.items.length; i++) {\n            this.items[i].applySize();\n\n            if (this.options.heightToFontSizeRatio) {\n                this.items[i].$element.style['font-size'] = this._fontSize;\n            }\n        }\n    }\n\n    private isCurrentElement(element) {\n        if (!this.currentElement) {\n            return false;\n        }\n        return element === this.currentElement;\n    }\n\n    private snapItemSizeToGrid(item: GridListItem): Array<number> {\n        const itemSize = {\n            width: parseInt(item.$element.style.width, 10) - 1,\n            height: parseInt(item.$element.style.height, 10) - 1\n        };\n\n        let colSize = Math.round(itemSize.width / this.cellWidth);\n        let rowSize = Math.round(itemSize.height / this.cellHeight);\n\n        // Keep item minimum 1\n        colSize = Math.max(colSize, 1);\n        rowSize = Math.max(rowSize, 1);\n\n        // check if element is pinned\n        if (this.gridList.isOverFixedArea(item.x, item.y, colSize, rowSize, item)) {\n            return [item.w, item.h];\n        }\n\n        return [colSize, rowSize];\n    }\n\n    private generateItemPosition(item: GridListItem): { x: number, y: number } {\n        let position;\n\n        if (item.itemPrototype) {\n            const coords = item.itemPrototype.getPositionToGridster(this);\n            position = {\n                x: Math.round(coords.x / this.cellWidth),\n                y: Math.round(coords.y / this.cellHeight)\n            };\n        } else {\n            position = {\n                x: Math.round(item.positionX / this.cellWidth),\n                y: Math.round(item.positionY / this.cellHeight)\n            };\n        }\n\n        return position;\n    }\n\n    private snapItemPositionToGrid(item: GridListItem) {\n        const position = this.generateItemPosition(item);\n        let col = position.x;\n        let row = position.y;\n\n        // Keep item position within the grid and don't let the item create more\n        // than one extra column\n        col = Math.max(col, 0);\n        row = Math.max(row, 0);\n\n        if (this.options.direction === 'horizontal') {\n            col = Math.min(col, this._maxGridCols);\n        } else {\n            col = Math.min(col, Math.max(0, this.options.lanes - item.w));\n        }\n\n        // check if element is pinned\n        if (this.gridList.isOverFixedArea(col, row, item.w, item.h)) {\n            return [item.x, item.y];\n        }\n\n        return [col, row];\n    }\n\n    private dragSizeChanged(newSize): boolean {\n        if (!this.previousDragSize) {\n            return true;\n        }\n        return (newSize[0] !== this.previousDragSize[0] ||\n            newSize[1] !== this.previousDragSize[1]);\n    }\n\n    private dragPositionChanged(newPosition): boolean {\n        if (!this.previousDragPosition) {\n            return true;\n        }\n        return (newPosition[0] !== this.previousDragPosition[0] ||\n            newPosition[1] !== this.previousDragPosition[1]);\n    }\n\n    private highlightPositionForItem(item) {\n        const size = item.calculateSize(this);\n        const position = item.calculatePosition(this);\n\n        this.$positionHighlight.style.width = size.width + 'px';\n        this.$positionHighlight.style.height = size.height + 'px';\n        this.$positionHighlight.style.left = position.left + 'px';\n        this.$positionHighlight.style.top = position.top + 'px';\n        this.$positionHighlight.style.display = '';\n\n        if (this.options.heightToFontSizeRatio) {\n            this.$positionHighlight.style['font-size'] = this._fontSize;\n        }\n    }\n\n    public updateCachedItems() {\n        // Notify the user with the items that changed since the previous snapshot\n        this.triggerOnChange(null);\n        this.gridsterOptions.responsiveOptions.forEach((options: IGridsterOptions) => {\n            this.triggerOnChange(options.breakpoint);\n        });\n\n        this.copyItems();\n    }\n\n    private triggerOnChange(breakpoint?) {\n        const items = breakpoint ? this._itemsMap[breakpoint] : this._items;\n        const changeItems = this.gridList.getChangedItems(items || [], breakpoint);\n\n        changeItems\n            .filter((itemChange: any) => {\n                return itemChange.item.itemComponent;\n            })\n            .forEach((itemChange: any) => {\n\n                if (itemChange.changes.indexOf('x') >= 0) {\n                    itemChange.item.triggerChangeX(breakpoint);\n                }\n                if (itemChange.changes.indexOf('y') >= 0) {\n                    itemChange.item.triggerChangeY(breakpoint);\n                }\n                if (itemChange.changes.indexOf('w') >= 0) {\n                    itemChange.item.triggerChangeW(breakpoint);\n                }\n                if (itemChange.changes.indexOf('h') >= 0) {\n                    itemChange.item.triggerChangeH(breakpoint);\n                }\n                // should be called only once (not for each breakpoint)\n                itemChange.item.itemComponent.change.emit({\n                    item: itemChange.item,\n                    oldValues: itemChange.oldValues || {},\n                    isNew: itemChange.isNew,\n                    changes: itemChange.changes,\n                    breakpoint: breakpoint\n                });\n            });\n    }\n\n    private removePositionHighlight() {\n        this.$positionHighlight.style.display = 'none';\n    }\n\n}\n","import { Observable, of, fromEvent, pipe, merge } from 'rxjs';\nimport { debounceTime, map, distinctUntilChanged } from 'rxjs/operators';\n\nimport { IGridsterOptions } from './IGridsterOptions';\n\nexport class GridsterOptions {\n    direction: string;\n    lanes: number;\n    widthHeightRatio: number;\n    heightToFontSizeRatio: number;\n    responsiveView: boolean;\n    responsiveSizes: boolean;\n    responsiveToParent: boolean;\n    dragAndDrop: boolean;\n    resizable: boolean;\n    shrink: boolean;\n    minWidth: number;\n    useCSSTransforms: boolean;\n\n    defaults: IGridsterOptions = {\n        lanes: 5,\n        direction: 'horizontal',\n        widthHeightRatio: 1,\n        shrink: false,\n        responsiveView: true,\n        responsiveSizes: false,\n        responsiveToParent: false,\n        dragAndDrop: true,\n        resizable: false,\n        useCSSTransforms: false,\n        floating: true,\n        tolerance: 'pointer'\n    };\n\n    change: Observable<IGridsterOptions>;\n\n    responsiveOptions: Array<IGridsterOptions> = [];\n    basicOptions: IGridsterOptions;\n\n    breakpointsMap = {\n        sm: 576, // Small devices\n        md: 768, // Medium devices\n        lg: 992, // Large devices\n        xl: 1200 // Extra large\n    };\n\n    constructor(config: IGridsterOptions, gridsterElement: HTMLElement) {\n        const responsiveContainer = config.responsiveToParent ? gridsterElement : window;\n\n        this.basicOptions = config;\n        this.responsiveOptions = this.extendResponsiveOptions(config.responsiveOptions || []);\n\n        this.change = merge(\n                of(this.getOptionsByWidth(this.getElementWidth(responsiveContainer))),\n                fromEvent(window, 'resize').pipe(\n                    debounceTime(config.responsiveDebounce || 0),\n                    map((event: Event) => this.getOptionsByWidth(this.getElementWidth(responsiveContainer)))\n                )\n            ).pipe(distinctUntilChanged(null, (options: any) => options.minWidth));\n    }\n\n    getOptionsByWidth(width: number): IGridsterOptions {\n        let i = 0;\n        let options: IGridsterOptions = Object.assign({}, this.defaults, this.basicOptions);\n\n        while (this.responsiveOptions[i]) {\n            if (this.responsiveOptions[i].minWidth <= width) {\n                options = this.responsiveOptions[i];\n            }\n            i++;\n        }\n\n        return options;\n    }\n\n    private extendResponsiveOptions(responsiveOptions: Array<IGridsterOptions>): Array<IGridsterOptions> {\n        return responsiveOptions\n            // responsive options are valid only with \"breakpoint\" property\n            .filter(options => options.breakpoint)\n            // set default minWidth if not given\n            .map((options) => {\n                return Object.assign({\n                    minWidth: this.breakpointsMap[options.breakpoint] || 0\n                }, options);\n            })\n            .sort((curr, next) => curr.minWidth - next.minWidth)\n            .map((options) => <IGridsterOptions>Object.assign({}, this.defaults, this.basicOptions, options));\n    }\n\n    private getElementWidth($element: any) {\n        if ($element === window) {\n            return window.innerWidth || document.documentElement.clientWidth || document.body.clientWidth;\n        }\n\n        return $element.clientWidth;\n    }\n}\n","import { Injectable } from '@angular/core';\nimport { Observable, Subject, merge } from 'rxjs';\nimport { takeUntil, switchMap, map, scan, filter, share, tap } from 'rxjs/operators';\n\nimport { GridsterService } from '../gridster.service';\nimport { GridsterItemPrototypeDirective } from './gridster-item-prototype.directive';\nimport { utils } from '../utils/utils';\nimport { DraggableEvent } from '../utils/DraggableEvent';\n\n@Injectable()\nexport class GridsterPrototypeService {\n\n    private isDragging = false;\n\n    private dragSubject = new Subject<any>();\n\n    private dragStartSubject = new Subject<any>();\n\n    private dragStopSubject = new Subject<any>();\n\n    constructor() {}\n\n    observeDropOver (gridster: GridsterService) {\n        return this.dragStopSubject.pipe(\n            filter((data) => {\n                const gridsterEl = gridster.gridsterComponent.$element;\n                const isOverNestedGridster = [].slice.call(gridsterEl.querySelectorAll('gridster'))\n                    .reduce((isOverGridster, nestedGridsterEl) => {\n                        return isOverGridster ||\n                            this.isOverGridster(data.item, nestedGridsterEl, data.event, gridster.options);\n                    }, false);\n\n                if (isOverNestedGridster) {\n                    return false;\n                }\n\n                return this.isOverGridster(data.item, gridsterEl, data.event, gridster.options);\n            }),\n            tap((data) => {\n                // TODO: what we should provide as a param?\n                // prototype.drop.emit({item: prototype.item});\n                data.item.onDrop(gridster);\n            })\n        );\n    }\n\n    observeDropOut (gridster: GridsterService) {\n        return this.dragStopSubject.pipe(\n            filter((data) => {\n                const gridsterEl = gridster.gridsterComponent.$element;\n\n                return !this.isOverGridster(data.item, gridsterEl, data.event, gridster.options);\n            }),\n            tap((data) => {\n                // TODO: what we should provide as a param?\n                data.item.onCancel();\n            })\n        );\n    }\n\n    observeDragOver(gridster: GridsterService): {\n        dragOver: Observable<GridsterItemPrototypeDirective>,\n        dragEnter: Observable<GridsterItemPrototypeDirective>,\n        dragOut: Observable<GridsterItemPrototypeDirective>\n    } {\n        const over = this.dragSubject.pipe(\n            map((data) => {\n                const gridsterEl = gridster.gridsterComponent.$element;\n\n                return {\n                  item: data.item,\n                  event: data.event,\n                  isOver: this.isOverGridster(data.item, gridsterEl, data.event, gridster.options),\n                  isDrop: false\n                };\n            })\n        );\n\n        const drop = this.dragStopSubject.pipe(\n            map((data) => {\n                const gridsterEl = gridster.gridsterComponent.$element;\n\n                return {\n                    item: data.item,\n                    event: data.event,\n                    isOver: this.isOverGridster(data.item, gridsterEl, data.event, gridster.options),\n                    isDrop: true\n                };\n            })\n        );\n\n        const dragExt = merge(\n                // dragStartSubject is connected in case when item prototype is placed above gridster\n                // and drag enter is not fired\n                this.dragStartSubject.pipe(map(() => ({ item: null, isOver: false, isDrop: false }))),\n                over,\n                drop\n            ).pipe(\n                scan((prev: any, next: any) => {\n                    return {\n                        item: next.item,\n                        event: next.event,\n                        isOver: next.isOver,\n                        isEnter: prev.isOver === false && next.isOver === true,\n                        isOut: prev.isOver === true && next.isOver === false && !prev.isDrop,\n                        isDrop: next.isDrop\n                    };\n                }),\n                filter((data: any) => {\n                    return !data.isDrop;\n                }),\n                share()\n            );\n\n        const dragEnter = this.createDragEnterObservable(dragExt, gridster);\n        const dragOut = this.createDragOutObservable(dragExt, gridster);\n        const dragOver = dragEnter\n            .pipe(\n                switchMap(() => this.dragSubject.pipe(takeUntil(dragOut))),\n                map((data: any) => data.item)\n            );\n\n        return { dragEnter, dragOut, dragOver };\n    }\n\n    dragItemStart(item: GridsterItemPrototypeDirective, event: DraggableEvent) {\n        this.isDragging = true;\n        this.dragStartSubject.next({ item, event });\n    }\n\n    dragItemStop(item: GridsterItemPrototypeDirective, event: DraggableEvent) {\n        this.isDragging = false;\n        this.dragStopSubject.next({ item, event });\n    }\n\n    updatePrototypePosition(item: GridsterItemPrototypeDirective, event: DraggableEvent) {\n        this.dragSubject.next({ item, event });\n    }\n\n    /**\n     * Creates observable that is fired on dragging over gridster container.\n     */\n    private createDragOverObservable (\n        dragIsOver: Observable<{item: GridsterItemPrototypeDirective, isOver: boolean}>,\n        gridster: GridsterService\n    ) {\n        return dragIsOver.pipe(\n            filter((data: any) => data.isOver && !data.isEnter && !data.isOut),\n            map((data: any): GridsterItemPrototypeDirective => data.item),\n            tap((item) => item.onOver(gridster))\n        );\n    }\n    /**\n     * Creates observable that is fired on drag enter gridster container.\n     */\n    private createDragEnterObservable (\n        dragIsOver: Observable<{item: GridsterItemPrototypeDirective, isOver: boolean}>,\n        gridster: GridsterService\n    ) {\n        return dragIsOver.pipe(\n            filter((data: any) => data.isEnter),\n            map((data: any): GridsterItemPrototypeDirective => data.item),\n            tap((item) => item.onEnter(gridster))\n        );\n    }\n    /**\n     * Creates observable that is fired on drag out gridster container.\n     */\n    private createDragOutObservable (\n        dragIsOver: Observable<{item: GridsterItemPrototypeDirective,\n        isOver: boolean}>,\n        gridster: GridsterService\n    ) {\n        return dragIsOver.pipe(\n            filter((data: any) => data.isOut),\n            map((data: any): GridsterItemPrototypeDirective => data.item),\n            tap((item) => item.onOut(gridster))\n        );\n    }\n\n    /**\n     * Checks whether \"element\" position fits inside \"containerEl\" position.\n     * It checks if \"element\" is totally covered by \"containerEl\" area.\n     */\n    private isOverGridster(item: GridsterItemPrototypeDirective, gridsterEl: HTMLElement, event, options): boolean {\n        const el = item.$element;\n        const parentItem = <HTMLElement>gridsterEl.parentElement &&\n            <HTMLElement>gridsterEl.parentElement.closest('gridster-item');\n\n        if (parentItem) {\n            return this.isOverGridster(item, parentItem, event, options);\n        }\n\n        switch (options.tolerance) {\n            case 'fit':\n                return utils.isElementFitContainer(el, gridsterEl);\n            case 'intersect':\n                return utils.isElementIntersectContainer(el, gridsterEl);\n            case 'touch':\n                return utils.isElementTouchContainer(el, gridsterEl);\n            default:\n                return utils.isCursorAboveElement(event, gridsterEl);\n        }\n    }\n}\n","import {\n    Component,\n    OnInit,\n    AfterContentInit,\n    OnDestroy,\n    ElementRef,\n    ViewChild,\n    NgZone,\n    Input,\n    Output,\n    EventEmitter,\n    ChangeDetectionStrategy,\n    HostBinding,\n    ViewEncapsulation\n} from '@angular/core';\nimport {\n    Observable,\n    Subscription,\n    fromEvent,\n    ConnectableObservable\n} from 'rxjs';\nimport { debounceTime, filter, publish } from 'rxjs/operators';\n\nimport { utils } from './utils/utils';\nimport { GridsterService } from './gridster.service';\nimport { IGridsterOptions } from './IGridsterOptions';\nimport { IGridsterDraggableOptions } from './IGridsterDraggableOptions';\nimport { GridsterPrototypeService } from './gridster-prototype/gridster-prototype.service';\nimport { GridsterItemPrototypeDirective } from './gridster-prototype/gridster-item-prototype.directive';\nimport { GridListItem } from './gridList/GridListItem';\nimport { GridsterOptions } from './GridsterOptions';\n\n@Component({\n    selector: 'ngx-gridster',\n    template: `<div class=\"gridster-container\">\n      <ng-content></ng-content>\n      <div class=\"position-highlight\" style=\"display:none;\" #positionHighlight>\n        <div class=\"inner\"></div>\n      </div>\n    </div>`,\n    styles: [\n        `\n            ngx-gridster {\n                position: relative;\n                display: block;\n                left: 0;\n                width: 100%;\n            }\n\n            ngx-gridster.gridster--dragging {\n                -moz-user-select: none;\n                -khtml-user-select: none;\n                -webkit-user-select: none;\n                -ms-user-select: none;\n                user-select: none;\n            }\n\n            ngx-gridster .gridster-container {\n                position: relative;\n                width: 100%;\n                list-style: none;\n                -webkit-transition: width 0.2s, height 0.2s;\n                transition: width 0.2s, height 0.2s;\n            }\n\n            ngx-gridster .position-highlight {\n                display: block;\n                position: absolute;\n                z-index: 1;\n            }\n        `\n    ],\n    providers: [GridsterService],\n    changeDetection: ChangeDetectionStrategy.OnPush,\n    encapsulation: ViewEncapsulation.None\n})\nexport class GridsterComponent implements OnInit, AfterContentInit, OnDestroy {\n    @Input() options: IGridsterOptions;\n    @Output() optionsChange = new EventEmitter<any>();\n    @Output() ready = new EventEmitter<any>();\n    @Output() reflow = new EventEmitter<any>();\n    @Output() prototypeDrop = new EventEmitter<{ item: GridListItem }>();\n    @Output() prototypeEnter = new EventEmitter<{ item: GridListItem }>();\n    @Output() prototypeOut = new EventEmitter<{ item: GridListItem }>();\n    @Input() draggableOptions: IGridsterDraggableOptions = {};\n    @Input() parent: GridsterComponent;\n\n    @ViewChild('positionHighlight', { static: true }) $positionHighlight;\n    @HostBinding('class.gridster--dragging') isDragging = false;\n    @HostBinding('class.gridster--resizing') isResizing = false;\n\n    @HostBinding('class.gridster--ready') isReady = false;\n    gridster: GridsterService;\n    $element: HTMLElement;\n\n    gridsterOptions: GridsterOptions;\n    isPrototypeEntered = false;\n    private isDisabled = false;\n    private subscription = new Subscription();\n\n    constructor(\n        private zone: NgZone,\n        elementRef: ElementRef,\n        gridster: GridsterService,\n        private gridsterPrototype: GridsterPrototypeService\n    ) {\n        this.gridster = gridster;\n        this.$element = elementRef.nativeElement;\n    }\n\n    ngOnInit() {\n        this.gridsterOptions = new GridsterOptions(this.options, this.$element);\n\n        if (this.options.useCSSTransforms) {\n            this.$element.classList.add('css-transform');\n        }\n\n        this.subscription.add(\n            this.gridsterOptions.change.subscribe(options => {\n                this.gridster.options = options;\n                if (this.gridster.gridList) {\n                    this.gridster.gridList.options = options;\n                }\n                setTimeout(() => this.optionsChange.emit(options));\n            })\n        );\n\n        this.gridster.init(this);\n\n        this.subscription.add(\n            fromEvent(window, 'resize')\n                .pipe(\n                    debounceTime(this.gridster.options.responsiveDebounce || 0),\n                    filter(() => this.gridster.options.responsiveView)\n                )\n                .subscribe(() => this.reload())\n        );\n\n        this.zone.runOutsideAngular(() => {\n            this.subscription.add(\n                fromEvent(document, 'scroll', { passive: true }).subscribe(() =>\n                    this.updateGridsterElementData()\n                )\n            );\n            const scrollableContainer = utils.getScrollableContainer(this.$element);\n            if (scrollableContainer) {\n                this.subscription.add(\n                    fromEvent(scrollableContainer, 'scroll', { passive: true })\n                    .subscribe(() =>\n                        this.updateGridsterElementData()\n                    )\n                );\n            }\n        });\n    }\n\n    ngAfterContentInit() {\n        this.gridster.start();\n\n        this.updateGridsterElementData();\n\n        this.connectGridsterPrototype();\n\n        this.gridster.$positionHighlight = this.$positionHighlight.nativeElement;\n    }\n\n    ngOnDestroy() {\n        this.subscription.unsubscribe();\n    }\n\n    /**\n     * Change gridster config option and rebuild\n     * @param string name\n     * @param any value\n     * @return GridsterComponent\n     */\n    setOption(name: string, value: any) {\n        if (name === 'dragAndDrop') {\n            if (value) {\n                this.enableDraggable();\n            } else {\n                this.disableDraggable();\n            }\n        }\n        if (name === 'resizable') {\n            if (value) {\n                this.enableResizable();\n            } else {\n                this.disableResizable();\n            }\n        }\n        if (name === 'lanes') {\n            this.gridster.options.lanes = value;\n\n            this.gridster.gridList.fixItemsPositions(this.gridster.options);\n            this.reflowGridster();\n        }\n        if (name === 'direction') {\n            this.gridster.options.direction = value;\n            this.gridster.gridList.pullItemsToLeft();\n        }\n        if (name === 'widthHeightRatio') {\n            this.gridster.options.widthHeightRatio = parseFloat(value || 1);\n        }\n        if (name === 'responsiveView') {\n            this.gridster.options.responsiveView = !!value;\n        }\n        this.gridster.gridList.setOption(name, value);\n\n        return this;\n    }\n\n    reload() {\n        setTimeout(() => {\n            this.gridster.fixItemsPositions();\n            this.reflowGridster();\n        });\n\n        return this;\n    }\n\n    reflowGridster(isInit = false) {\n        this.gridster.reflow();\n        this.reflow.emit({\n            isInit: isInit,\n            gridsterComponent: this\n        });\n    }\n\n    updateGridsterElementData() {\n        this.gridster.gridsterScrollData = this.getScrollPositionFromParents(\n            this.$element\n        );\n        this.gridster.gridsterRect = this.$element.getBoundingClientRect();\n    }\n\n    setReady() {\n        setTimeout(() => (this.isReady = true));\n        this.ready.emit();\n    }\n\n    adjustItemsHeightToContent(\n        scrollableItemElementSelector: string = '.gridster-item-inner'\n    ) {\n        this.gridster.items\n            // convert each item to object with information about content height and scroll height\n            .map((item: GridListItem) => {\n                const scrollEl = item.$element.querySelector(\n                    scrollableItemElementSelector\n                );\n                const contentEl = scrollEl.lastElementChild;\n                const scrollElDistance = utils.getRelativeCoordinates(\n                    scrollEl,\n                    item.$element\n                );\n                const scrollElRect = scrollEl.getBoundingClientRect();\n                const contentRect = contentEl.getBoundingClientRect();\n\n                return {\n                    item,\n                    contentHeight: contentRect.bottom - scrollElRect.top,\n                    scrollElDistance\n                };\n            })\n            // calculate required height in lanes amount and update item \"h\"\n            .forEach(data => {\n                data.item.h = Math.ceil(<any>(\n                    (data.contentHeight /\n                        (this.gridster.cellHeight - data.scrollElDistance.top))\n                ));\n            });\n\n        this.gridster.fixItemsPositions();\n        this.gridster.reflow();\n    }\n\n    disable(item) {\n        const itemIdx = this.gridster.items.indexOf(item.itemComponent);\n\n        this.isDisabled = true;\n        if (itemIdx >= 0) {\n            delete this.gridster.items[\n                this.gridster.items.indexOf(item.itemComponent)\n            ];\n        }\n        this.gridster.onDragOut(item);\n    }\n\n    enable() {\n        this.isDisabled = false;\n    }\n\n    private getScrollPositionFromParents(\n        element: Element,\n        data = { scrollTop: 0, scrollLeft: 0 }\n    ): { scrollTop: number; scrollLeft: number } {\n        if (element.parentElement && element.parentElement !== document.body) {\n            data.scrollTop += element.parentElement.scrollTop;\n            data.scrollLeft += element.parentElement.scrollLeft;\n\n            return this.getScrollPositionFromParents(\n                element.parentElement,\n                data\n            );\n        }\n\n        return {\n            scrollTop: data.scrollTop,\n            scrollLeft: data.scrollLeft\n        };\n    }\n\n    /**\n     * Connect gridster prototype item to gridster dragging hooks (onStart, onDrag, onStop).\n     */\n    private connectGridsterPrototype() {\n        this.gridsterPrototype.observeDropOut(this.gridster).subscribe();\n\n        const dropOverObservable = <ConnectableObservable<any>>(\n            this.gridsterPrototype\n                .observeDropOver(this.gridster)\n                .pipe(publish())\n        );\n\n        const dragObservable = this.gridsterPrototype.observeDragOver(\n            this.gridster\n        );\n\n        dragObservable.dragOver\n            .pipe(filter(() => !this.isDisabled))\n            .subscribe((prototype: GridsterItemPrototypeDirective) => {\n                if (!this.isPrototypeEntered) {\n                    return;\n                }\n                this.gridster.onDrag(prototype.item);\n            });\n\n        dragObservable.dragEnter\n            .pipe(filter(() => !this.isDisabled))\n            .subscribe((prototype: GridsterItemPrototypeDirective) => {\n                this.isPrototypeEntered = true;\n\n                if (this.gridster.items.indexOf(prototype.item) < 0) {\n                    this.gridster.items.push(prototype.item);\n                }\n                this.gridster.onStart(prototype.item);\n                prototype.setDragContextGridster(this.gridster);\n\n                if (this.parent) {\n                    this.parent.disable(prototype.item);\n                }\n                this.prototypeEnter.emit({ item: prototype.item });\n            });\n\n        dragObservable.dragOut\n            .pipe(filter(() => !this.isDisabled))\n            .subscribe((prototype: GridsterItemPrototypeDirective) => {\n                if (!this.isPrototypeEntered) {\n                    return;\n                }\n                this.gridster.onDragOut(prototype.item);\n                this.isPrototypeEntered = false;\n\n                this.prototypeOut.emit({ item: prototype.item });\n\n                if (this.parent) {\n                    this.parent.enable();\n\n                    this.parent.isPrototypeEntered = true;\n                    if (\n                        this.parent.gridster.items.indexOf(prototype.item) < 0\n                    ) {\n                        this.parent.gridster.items.push(prototype.item);\n                    }\n                    this.parent.gridster.onStart(prototype.item);\n                    prototype.setDragContextGridster(this.parent.gridster);\n                    // timeout is needed to be sure that \"enter\" event is fired after \"out\"\n                    setTimeout(() => {\n                        this.parent.prototypeEnter.emit({\n                            item: prototype.item\n                        });\n                        prototype.onEnter(this.parent.gridster);\n                    });\n                }\n            });\n\n        dropOverObservable\n            .pipe(filter(() => !this.isDisabled))\n            .subscribe(data => {\n                if (!this.isPrototypeEntered) {\n                    return;\n                }\n\n                this.gridster.onStop(data.item.item);\n                this.gridster.removeItem(data.item.item);\n\n                this.isPrototypeEntered = false;\n                if (this.parent) {\n                    this.parent.enable();\n                }\n                this.prototypeDrop.emit({ item: data.item.item });\n            });\n\n        dropOverObservable.connect();\n    }\n\n    private enableDraggable() {\n        this.gridster.options.dragAndDrop = true;\n\n        this.gridster.items\n            .filter(\n                item => item.itemComponent && item.itemComponent.dragAndDrop\n            )\n            .forEach((item: GridListItem) =>\n                item.itemComponent.enableDragDrop()\n            );\n    }\n\n    private disableDraggable() {\n        this.gridster.options.dragAndDrop = false;\n\n        this.gridster.items\n            .filter(item => item.itemComponent)\n            .forEach((item: GridListItem) =>\n                item.itemComponent.disableDraggable()\n            );\n    }\n\n    private enableResizable() {\n        this.gridster.options.resizable = true;\n\n        this.gridster.items\n            .filter(item => item.itemComponent && item.itemComponent.resizable)\n            .forEach((item: GridListItem) =>\n                item.itemComponent.enableResizable()\n            );\n    }\n\n    private disableResizable() {\n        this.gridster.options.resizable = false;\n\n        this.gridster.items.forEach((item: GridListItem) =>\n            item.itemComponent.disableResizable()\n        );\n    }\n}\n","import { GridsterItemComponent } from '../gridster-item/gridster-item.component';\nimport { GridsterItemPrototypeDirective } from '../gridster-prototype/gridster-item-prototype.directive';\nimport { GridsterService } from '../gridster.service';\n\nexport class GridListItem {\n    static BREAKPOINTS: Array<string> = ['sm', 'md', 'lg', 'xl'];\n    static X_PROPERTY_MAP: any = {\n        sm: 'xSm',\n        md: 'xMd',\n        lg: 'xLg',\n        xl: 'xXl'\n    };\n\n    static Y_PROPERTY_MAP: any = {\n        sm: 'ySm',\n        md: 'yMd',\n        lg: 'yLg',\n        xl: 'yXl'\n    };\n\n    static W_PROPERTY_MAP: any = {\n        sm: 'wSm',\n        md: 'wMd',\n        lg: 'wLg',\n        xl: 'wXl'\n    };\n\n    static H_PROPERTY_MAP: any = {\n        sm: 'hSm',\n        md: 'hMd',\n        lg: 'hLg',\n        xl: 'hXl'\n    };\n\n    itemComponent: GridsterItemComponent;\n    itemPrototype: GridsterItemPrototypeDirective;\n    itemObject: any;\n\n    get $element () {\n        return this.getItem().$element;\n    }\n\n    get x () {\n        const item = this.getItem();\n        const breakpoint = item.gridster ? item.gridster.options.breakpoint : null;\n\n        return this.getValueX(breakpoint);\n    }\n    set x (value: number) {\n        const item = this.getItem();\n        const breakpoint = item.gridster ? item.gridster.options.breakpoint : null;\n\n        this.setValueX(value, breakpoint);\n    }\n\n    get y () {\n        const item = this.getItem();\n        const breakpoint = item.gridster ? item.gridster.options.breakpoint : null;\n\n        return this.getValueY(breakpoint);\n    }\n    set y (value: number) {\n        const item = this.getItem();\n        const breakpoint = item.gridster ? item.gridster.options.breakpoint : null;\n\n        this.setValueY(value, breakpoint);\n    }\n\n    get w () {\n        const item = this.getItem();\n        const breakpoint = item.gridster ? item.gridster.options.breakpoint : null;\n\n        return this.getValueW(breakpoint);\n    }\n    set w (value: number) {\n        const item = this.getItem();\n        const breakpoint = item.gridster ? item.gridster.options.breakpoint : null;\n\n        this.setValueW(value, breakpoint);\n    }\n\n    get h () {\n        const item = this.getItem();\n        const breakpoint = item.gridster ? item.gridster.options.breakpoint : null;\n\n        return this.getValueH(breakpoint);\n    }\n    set h (value: number) {\n        const item = this.getItem();\n        const breakpoint = item.gridster ? item.gridster.options.breakpoint : null;\n\n        this.setValueH(value, breakpoint);\n    }\n\n    get autoSize () {\n        return this.getItem().autoSize;\n    }\n    set autoSize (value: boolean) {\n        this.getItem().autoSize = value;\n    }\n\n    get dragAndDrop() {\n        return !!this.getItem().dragAndDrop;\n    }\n\n    get resizable() {\n        return !!this.getItem().resizable;\n    }\n\n    get positionX() {\n        const item = this.itemComponent || this.itemPrototype;\n\n        if (!item) {\n            return null;\n        }\n\n        return item.positionX;\n    }\n\n    get positionY() {\n        const item = this.itemComponent || this.itemPrototype;\n\n        if (!item) {\n            return null;\n        }\n\n        return item.positionY;\n    }\n\n    public setFromGridsterItem (item: GridsterItemComponent): GridListItem {\n        if (this.isItemSet()) {\n            throw new Error('GridListItem is already set.');\n        }\n        this.itemComponent = item;\n        return this;\n    }\n\n    public setFromGridsterItemPrototype (item: GridsterItemPrototypeDirective): GridListItem {\n        if (this.isItemSet()) {\n            throw new Error('GridListItem is already set.');\n        }\n        this.itemPrototype = item;\n        return this;\n    }\n\n    public setFromObjectLiteral (item: Object): GridListItem {\n        if (this.isItemSet()) {\n            throw new Error('GridListItem is already set.');\n        }\n        this.itemObject = item;\n        return this;\n    }\n\n    public copy() {\n        const itemCopy = new GridListItem();\n\n        return itemCopy.setFromObjectLiteral({\n            $element: this.$element,\n            x: this.x,\n            y: this.y,\n            w: this.w,\n            h: this.h,\n            autoSize: this.autoSize,\n            dragAndDrop: this.dragAndDrop,\n            resizable: this.resizable\n        });\n    }\n\n    public copyForBreakpoint(breakpoint?) {\n        const itemCopy = new GridListItem();\n\n        return itemCopy.setFromObjectLiteral({\n            $element: this.$element,\n            x: this.getValueX(breakpoint),\n            y: this.getValueY(breakpoint),\n            w: this.getValueW(breakpoint),\n            h: this.getValueH(breakpoint),\n            autoSize: this.autoSize,\n            dragAndDrop: this.dragAndDrop,\n            resizable: this.resizable\n        });\n    }\n\n    public getValueX(breakpoint?) {\n        const item = this.getItem();\n\n        return item[this.getXProperty(breakpoint)];\n    }\n\n    public getValueY(breakpoint?) {\n        const item = this.getItem();\n\n        return item[this.getYProperty(breakpoint)];\n    }\n\n    public getValueW(breakpoint?) {\n        const item = this.getItem();\n\n        return item[this.getWProperty(breakpoint)] || 1;\n    }\n\n    public getValueH(breakpoint?) {\n        const item = this.getItem();\n\n        return item[this.getHProperty(breakpoint)] || 1;\n    }\n\n    public setValueX(value: number, breakpoint?) {\n        const item = this.getItem();\n\n        item[this.getXProperty(breakpoint)] = value;\n    }\n\n    public setValueY(value: number, breakpoint?) {\n        const item = this.getItem();\n\n        item[this.getYProperty(breakpoint)] = value;\n    }\n\n    public setValueW(value: number, breakpoint?) {\n        const item = this.getItem();\n\n        item[this.getWProperty(breakpoint)] = value;\n    }\n\n    public setValueH(value: number, breakpoint?) {\n        const item = this.getItem();\n\n        item[this.getHProperty(breakpoint)] = value;\n    }\n\n    public triggerChangeX(breakpoint?) {\n        const item = this.itemComponent;\n        if (item) {\n            item[this.getXProperty(breakpoint) + 'Change'].emit(this.getValueX(breakpoint));\n        }\n    }\n\n    public triggerChangeY(breakpoint?) {\n        const item = this.itemComponent;\n        if (item) {\n            item[this.getYProperty(breakpoint) + 'Change'].emit(this.getValueY(breakpoint));\n        }\n    }\n\n    public triggerChangeW(breakpoint?) {\n        const item = this.itemComponent;\n        if (item) {\n            item[this.getWProperty(breakpoint) + 'Change'].emit(this.getValueW(breakpoint));\n        }\n    }\n\n    public triggerChangeH(breakpoint?) {\n        const item = this.itemComponent;\n        if (item) {\n            item[this.getHProperty(breakpoint) + 'Change'].emit(this.getValueH(breakpoint));\n        }\n    }\n\n    public hasPositions(breakpoint?) {\n        const x = this.getValueX(breakpoint);\n        const y = this.getValueY(breakpoint);\n\n        return (x || x === 0) && (y || y === 0);\n    }\n\n    public applyPosition(gridster?: GridsterService) {\n        const position = this.calculatePosition(gridster);\n\n        this.itemComponent.positionX = position.left;\n        this.itemComponent.positionY = position.top;\n        this.itemComponent.updateElemenetPosition();\n    }\n\n    public calculatePosition(gridster?: GridsterService): {left: number, top: number} {\n        if (!gridster && !this.itemComponent) {\n            return {left: 0, top: 0};\n        }\n        gridster = gridster || this.itemComponent.gridster;\n\n        return {\n            left: this.x * gridster.cellWidth,\n            top: this.y * gridster.cellHeight\n        };\n    }\n\n    public applySize(gridster?: GridsterService): void {\n        const size = this.calculateSize(gridster);\n\n        this.$element.style.width = size.width + 'px';\n        this.$element.style.height = size.height + 'px';\n    }\n\n    public calculateSize(gridster?: GridsterService): {width: number, height: number} {\n        if (!gridster && !this.itemComponent) {\n            return {width: 0, height: 0};\n        }\n        gridster = gridster || this.itemComponent.gridster;\n\n        let width = this.getValueW(gridster.options.breakpoint);\n        let height = this.getValueH(gridster.options.breakpoint);\n\n        if (gridster.options.direction === 'vertical') {\n            width = Math.min(width, gridster.options.lanes);\n        }\n        if (gridster.options.direction === 'horizontal') {\n            height = Math.min(height, gridster.options.lanes);\n        }\n\n        return {\n            width: width * gridster.cellWidth,\n            height: height * gridster.cellHeight\n        };\n    }\n\n    private getXProperty(breakpoint?: string) {\n\n        if (breakpoint && this.itemComponent) {\n            return GridListItem.X_PROPERTY_MAP[breakpoint];\n        } else {\n            return 'x';\n        }\n    }\n\n    private getYProperty(breakpoint?: string) {\n\n        if (breakpoint && this.itemComponent) {\n            return GridListItem.Y_PROPERTY_MAP[breakpoint];\n        } else {\n            return 'y';\n        }\n    }\n\n    private getWProperty(breakpoint?: string) {\n        if (this.itemPrototype) {\n            return this.itemPrototype[GridListItem.W_PROPERTY_MAP[breakpoint]] ?\n                GridListItem.W_PROPERTY_MAP[breakpoint] : 'w';\n        }\n\n        const item = this.getItem();\n        const responsiveSizes = item.gridster && item.gridster.options.responsiveSizes;\n\n        if (breakpoint && responsiveSizes) {\n            return GridListItem.W_PROPERTY_MAP[breakpoint];\n        } else {\n            return 'w';\n        }\n    }\n\n    private getHProperty(breakpoint?: string) {\n        if (this.itemPrototype) {\n            return this.itemPrototype[GridListItem.H_PROPERTY_MAP[breakpoint]] ?\n                GridListItem.H_PROPERTY_MAP[breakpoint] : 'h';\n        }\n\n        const item = this.getItem();\n        const responsiveSizes = item.gridster && item.gridster.options.responsiveSizes;\n\n        if (breakpoint && responsiveSizes) {\n            return GridListItem.H_PROPERTY_MAP[breakpoint];\n        } else {\n            return 'h';\n        }\n    }\n\n    private getItem(): any {\n        const item = this.itemComponent || this.itemPrototype || this.itemObject;\n\n        if (!item) {\n            throw new Error('GridListItem is not set.');\n        }\n        return item;\n    }\n\n    private isItemSet() {\n        return this.itemComponent || this.itemPrototype || this.itemObject;\n    }\n}\n","export class DraggableEvent {\n    clientX: number;\n\n    clientY: number;\n\n    pageX: number;\n\n    pageY: number;\n\n    target: any;\n\n    type: string;\n\n\n    private touchEvent: TouchEvent;\n\n    private mouseEvent: MouseEvent;\n\n    constructor(event: any) {\n        if (event.touches) {\n            this.touchEvent = (<TouchEvent>event);\n            this.setDataFromTouchEvent(this.touchEvent);\n        } else {\n            this.mouseEvent = (<MouseEvent>event);\n            this.setDataFromMouseEvent(this.mouseEvent);\n        }\n    }\n\n    isTouchEvent(): boolean {\n        return !!this.touchEvent;\n    }\n\n    pauseEvent() {\n        const event: Event = this.touchEvent || this.mouseEvent;\n\n        if (event.stopPropagation) {\n            event.stopPropagation();\n        }\n        if (event.preventDefault) {\n            event.preventDefault();\n        }\n        event.cancelBubble = true;\n        event.returnValue = false;\n        return false;\n    }\n\n    getRelativeCoordinates(container: HTMLElement): {x: number, y: number} {\n        const scrollTop = window.pageYOffset || document.documentElement.scrollTop || document.body.scrollTop;\n        const scrollLeft = window.pageXOffset || document.documentElement.scrollLeft || document.body.scrollLeft;\n\n        const rect = container.getBoundingClientRect();\n\n        return {\n            x: this.pageX - rect.left - scrollLeft,\n            y: this.pageY - rect.top - scrollTop,\n        };\n    }\n\n    private setDataFromMouseEvent(event: MouseEvent): void {\n        this.target = event.target;\n        this.clientX = event.clientX;\n        this.clientY = event.clientY;\n        this.pageX = event.pageX;\n        this.pageY = event.pageY;\n        this.type = event.type;\n    }\n\n    private setDataFromTouchEvent(event: TouchEvent): void {\n        const touch = event.touches[0] || event.changedTouches[0];\n\n        this.target = event.target;\n        this.clientX = touch.clientX;\n        this.clientY = touch.clientY;\n        this.pageX = touch.pageX;\n        this.pageY = touch.pageY;\n        this.type = event.type;\n\n    }\n}\n","import { Observable, fromEvent, merge, pipe } from 'rxjs';\nimport { share, map, filter, tap, switchMap, takeUntil, take, skip } from 'rxjs/operators';\n\nimport { DraggableEvent } from './DraggableEvent';\nimport { utils } from './utils';\n\nexport class Draggable {\n    static SCROLL_SPEED = 20;\n    element: Element;\n\n    dragStart: Observable<DraggableEvent>;\n    dragMove: Observable<DraggableEvent>;\n    dragStop: Observable<DraggableEvent>;\n    // A simple requestAnimationFrame polyfill\n    private requestAnimationFrame: Function;\n    private cancelAnimationFrame: Function;\n    private mousemove: Observable<{} | Event> = merge(\n        fromEvent(document, 'mousemove'),\n        fromEvent(document, 'touchmove', { passive: false })\n    ).pipe(share());\n    private mouseup: Observable<{} | Event> = merge(\n        fromEvent(document, 'mouseup'),\n        fromEvent(document, 'touchend'),\n        fromEvent(document, 'touchcancel')\n    ).pipe(share());\n    private mousedown: Observable<{} | Event>;\n    private config = {\n        handlerClass: null,\n        scroll: true,\n        scrollEdge: 36,\n        scrollDirection: null\n    };\n    // reference to auto scrolling listeners\n    private autoScrollingInterval = [];\n\n    constructor(element: Element, config = {}) {\n        this.element = element;\n        this.mousedown = merge(\n            fromEvent(element, 'mousedown'),\n            fromEvent(element, 'touchstart')\n        ).pipe(share());\n\n        this.config = { ...this.config, ...config };\n\n        this.dragStart = this.createDragStartObservable().pipe(share());\n        this.dragMove = this.createDragMoveObservable(this.dragStart);\n        this.dragStop = this.createDragStopObservable(this.dragStart);\n\n        this.fixProblemWithDnDForIE(element);\n\n        this.requestAnimationFrame =\n            window.requestAnimationFrame || (callback => setTimeout(callback, 1000 / 60));\n        this.cancelAnimationFrame = window.cancelAnimationFrame || (cafID => clearTimeout(cafID));\n    }\n\n    private createDragStartObservable(): Observable<DraggableEvent> {\n        return this.mousedown.pipe(\n            map(md => new DraggableEvent(md)),\n            filter((event: DraggableEvent) => this.isDragingByHandler(event)),\n            tap(e => {\n                if (!e.isTouchEvent()) {\n                    e.pauseEvent();\n                }\n                if (document.activeElement) {\n                    (<any>document.activeElement).blur();\n                }\n                // prevents rendering performance issues while dragging item with selection inside\n                utils.clearSelection();\n            }),\n            switchMap((startEvent: DraggableEvent) => {\n                return this.mousemove.pipe(\n                    map(mm => new DraggableEvent(mm)),\n                    filter((moveEvent: DraggableEvent) => this.inRange(startEvent, moveEvent, 5)),\n                    map(() => startEvent),\n                    takeUntil(this.mouseup),\n                    take(1)\n                );\n            })\n        );\n    }\n\n    private createDragMoveObservable(\n        dragStart: Observable<DraggableEvent>\n    ): Observable<DraggableEvent> {\n        return dragStart.pipe(\n            tap(event => {\n                this.addTouchActionNone(event.target);\n            }),\n            switchMap(startEvent => {\n                return this.mousemove.pipe(\n                    skip(1),\n                    map(mm => new DraggableEvent(mm)),\n                    tap(event => {\n                        event.pauseEvent();\n                        startEvent.pauseEvent();\n                    }),\n                    takeUntil(this.mouseup)\n                );\n            }),\n            filter(val => !!val),\n            tap((event: DraggableEvent) => {\n                if (this.config.scroll) {\n                    this.startScroll(this.element, event);\n                }\n            })\n        );\n    }\n\n    private createDragStopObservable(dragStart: Observable<DraggableEvent>): Observable<any> {\n        return dragStart.pipe(\n            switchMap(() => {\n                return this.mouseup.pipe(take(1));\n            }),\n            map(e => new DraggableEvent(e)),\n            tap(e => {\n                if (e.target) {\n                    this.removeTouchActionNone(e.target);\n                }\n                this.autoScrollingInterval.forEach(raf => this.cancelAnimationFrame(raf));\n            })\n        );\n    }\n\n    private startScroll(item: Element, event: DraggableEvent) {\n        const scrollContainer = this.getScrollContainer(item);\n        this.autoScrollingInterval.forEach(raf => this.cancelAnimationFrame(raf));\n\n        if (scrollContainer) {\n            this.startScrollForContainer(event, scrollContainer);\n        } else {\n            this.startScrollForWindow(event);\n        }\n    }\n\n    private startScrollForContainer(event: DraggableEvent, scrollContainer: HTMLElement): void {\n        if (!this.config.scrollDirection || this.config.scrollDirection === 'vertical') {\n            this.startScrollVerticallyForContainer(event, scrollContainer);\n        }\n\n        if (!this.config.scrollDirection || this.config.scrollDirection === 'horizontal') {\n            this.startScrollHorizontallyForContainer(event, scrollContainer);\n        }\n    }\n\n    private startScrollVerticallyForContainer(\n        event: DraggableEvent,\n        scrollContainer: HTMLElement\n    ): void {\n        if (event.pageY - this.getOffset(scrollContainer).top < this.config.scrollEdge) {\n            this.startAutoScrolling(scrollContainer, -Draggable.SCROLL_SPEED, 'scrollTop');\n        } else if (\n            this.getOffset(scrollContainer).top +\n                scrollContainer.getBoundingClientRect().height -\n                event.pageY <\n            this.config.scrollEdge\n        ) {\n            this.startAutoScrolling(scrollContainer, Draggable.SCROLL_SPEED, 'scrollTop');\n        }\n    }\n\n    private startScrollHorizontallyForContainer(\n        event: DraggableEvent,\n        scrollContainer: HTMLElement\n    ): void {\n        if (event.pageX - scrollContainer.getBoundingClientRect().left < this.config.scrollEdge) {\n            this.startAutoScrolling(scrollContainer, -Draggable.SCROLL_SPEED, 'scrollLeft');\n        } else if (\n            this.getOffset(scrollContainer).left +\n                scrollContainer.getBoundingClientRect().width -\n                event.pageX <\n            this.config.scrollEdge\n        ) {\n            this.startAutoScrolling(scrollContainer, Draggable.SCROLL_SPEED, 'scrollLeft');\n        }\n    }\n\n    private startScrollForWindow(event) {\n        if (!this.config.scrollDirection || this.config.scrollDirection === 'vertical') {\n            this.startScrollVerticallyForWindow(event);\n        }\n\n        if (!this.config.scrollDirection || this.config.scrollDirection === 'horizontal') {\n            this.startScrollHorizontallyForWindow(event);\n        }\n    }\n\n    private startScrollVerticallyForWindow(event: DraggableEvent): void {\n        const scrollingElement =\n            document.scrollingElement || document.documentElement || document.body;\n\n        // NOTE: Using `window.pageYOffset` here because IE doesn't have `window.scrollY`.\n        if (event.pageY - window.pageYOffset < this.config.scrollEdge) {\n            this.startAutoScrolling(scrollingElement, -Draggable.SCROLL_SPEED, 'scrollTop');\n        } else if (\n            window.innerHeight - (event.pageY - window.pageYOffset) <\n            this.config.scrollEdge\n        ) {\n            this.startAutoScrolling(scrollingElement, Draggable.SCROLL_SPEED, 'scrollTop');\n        }\n    }\n\n    private startScrollHorizontallyForWindow(event: DraggableEvent): void {\n        const scrollingElement =\n            document.scrollingElement || document.documentElement || document.body;\n\n        // NOTE: Using `window.pageXOffset` here because IE doesn't have `window.scrollX`.\n        if (event.pageX - window.pageXOffset < this.config.scrollEdge) {\n            this.startAutoScrolling(scrollingElement, -Draggable.SCROLL_SPEED, 'scrollLeft');\n        } else if (\n            window.innerWidth - (event.pageX - window.pageXOffset) <\n            this.config.scrollEdge\n        ) {\n            this.startAutoScrolling(scrollingElement, Draggable.SCROLL_SPEED, 'scrollLeft');\n        }\n    }\n\n    private getScrollContainer(node): HTMLElement {\n        const nodeOuterHeight = utils.getElementOuterHeight(node);\n\n        if (node.scrollHeight > Math.ceil(nodeOuterHeight)) {\n            return node;\n        }\n\n        if (!new RegExp('(body|html)', 'i').test(node.parentNode.tagName)) {\n            return this.getScrollContainer(node.parentNode);\n        }\n\n        return null;\n    }\n\n    private startAutoScrolling(node, amount, direction) {\n        this.autoScrollingInterval.push(\n            this.requestAnimationFrame(\n                function() {\n                    this.startAutoScrolling(node, amount, direction);\n                }.bind(this)\n            )\n        );\n\n        return (node[direction] += amount * 0.25);\n    }\n\n    private getOffset(el) {\n        const rect = el.getBoundingClientRect();\n        return {\n            left: rect.left + this.getScroll('scrollLeft', 'pageXOffset'),\n            top: rect.top + this.getScroll('scrollTop', 'pageYOffset')\n        };\n    }\n\n    private getScroll(scrollProp, offsetProp) {\n        if (typeof window[offsetProp] !== 'undefined') {\n            return window[offsetProp];\n        }\n        if (document.documentElement.clientHeight) {\n            return document.documentElement[scrollProp];\n        }\n        return document.body[scrollProp];\n    }\n\n    private isDragingByHandler(event: DraggableEvent): boolean {\n        if (!this.isValidDragHandler(event.target)) {\n            return false;\n        }\n\n        return (\n            !this.config.handlerClass ||\n            (this.config.handlerClass &&\n                this.hasElementWithClass(this.config.handlerClass, event.target))\n        );\n    }\n\n    private isValidDragHandler(targetEl: any): boolean {\n        return ['input', 'textarea'].indexOf(targetEl.tagName.toLowerCase()) === -1;\n    }\n\n    private inRange(startEvent: DraggableEvent, moveEvent: DraggableEvent, range: number): boolean {\n        return (\n            Math.abs(moveEvent.clientX - startEvent.clientX) > range ||\n            Math.abs(moveEvent.clientY - startEvent.clientY) > range\n        );\n    }\n\n    private hasElementWithClass(className: string, target: any): boolean {\n        while (target !== this.element) {\n            if (target.classList.contains(className)) {\n                return true;\n            }\n            target = target.parentElement;\n        }\n        return false;\n    }\n\n    private pauseEvent(e: Event): void {\n        if (e.stopPropagation) {\n            e.stopPropagation();\n        }\n        if (e.preventDefault) {\n            e.preventDefault();\n        }\n        e.cancelBubble = true;\n        e.returnValue = false;\n    }\n\n    private fixProblemWithDnDForIE(element: Element) {\n        if (this.isTouchDevice() && this.isIEorEdge() && (<HTMLElement>element).style) {\n            (<HTMLElement>element).style['touch-action'] = 'none';\n        }\n    }\n\n    private removeTouchActionNone(element: Element) {\n        if (!(<HTMLElement>element).style) {\n            return;\n        }\n        (<HTMLElement>element).style['touch-action'] = '';\n    }\n\n    private addTouchActionNone(element) {\n        if (!(<HTMLElement>element).style) {\n            return;\n        }\n        (<HTMLElement>element).style['touch-action'] = 'none';\n    }\n\n    private isTouchDevice() {\n        return (\n            'ontouchstart' in window || navigator.maxTouchPoints // works on most browsers\n        ); // works on IE10/11 and Surface\n    }\n\n    private isIEorEdge() {\n        const ua = window.navigator.userAgent;\n\n        const msie = ua.indexOf('MSIE ');\n        if (msie > 0) {\n            // IE 10 or older => return version number\n            return parseInt(ua.substring(msie + 5, ua.indexOf('.', msie)), 10);\n        }\n\n        const trident = ua.indexOf('Trident/');\n        if (trident > 0) {\n            // IE 11 => return version number\n            const rv = ua.indexOf('rv:');\n            return parseInt(ua.substring(rv + 3, ua.indexOf('.', rv)), 10);\n        }\n\n        const edge = ua.indexOf('Edge/');\n        if (edge > 0) {\n            // Edge (IE 12+) => return version number\n            return parseInt(ua.substring(edge + 5, ua.indexOf('.', edge)), 10);\n        }\n\n        // other browser\n        return false;\n    }\n}\n","import { Component, OnInit, ElementRef, Inject, Host, Input, Output,\n    EventEmitter, SimpleChanges, OnChanges, OnDestroy, HostBinding,\n    ChangeDetectionStrategy, AfterViewInit, NgZone, ViewEncapsulation } from '@angular/core';\nimport { Subscription } from 'rxjs';\n\nimport { GridsterService } from '../gridster.service';\nimport { GridsterPrototypeService } from '../gridster-prototype/gridster-prototype.service';\n\nimport { GridListItem } from '../gridList/GridListItem';\nimport { DraggableEvent } from '../utils/DraggableEvent';\nimport { Draggable } from '../utils/draggable';\nimport { IGridsterOptions } from '../IGridsterOptions';\nimport { GridList } from '../gridList/gridList';\nimport { utils } from '../utils/utils';\n\n@Component({\n    selector: 'ngx-gridster-item',\n    template: `<div class=\"gridster-item-inner\">\n      <ng-content></ng-content>\n      <div class=\"gridster-item-resizable-handler handle-s\"></div>\n      <div class=\"gridster-item-resizable-handler handle-e\"></div>\n      <div class=\"gridster-item-resizable-handler handle-n\"></div>\n      <div class=\"gridster-item-resizable-handler handle-w\"></div>\n      <div class=\"gridster-item-resizable-handler handle-se\"></div>\n      <div class=\"gridster-item-resizable-handler handle-ne\"></div>\n      <div class=\"gridster-item-resizable-handler handle-sw\"></div>\n      <div class=\"gridster-item-resizable-handler handle-nw\"></div>\n    </div>`,\n    styles: [`\n    ngx-gridster-item {\n        display: block;\n        position: absolute;\n        top: 0;\n        left: 0;\n        z-index: 1;\n        -webkit-transition: none;\n        transition: none;\n    }\n\n    .gridster--ready ngx-gridster-item {\n        transition: all 200ms ease;\n        transition-property: left, top;\n    }\n\n    .gridster--ready.css-transform ngx-gridster-item  {\n        transition-property: transform;\n    }\n\n    .gridster--ready ngx-gridster-item.is-dragging,\n    .gridster--ready ngx-gridster-item.is-resizing {\n        -webkit-transition: none;\n        transition: none;\n        z-index: 9999;\n    }\n\n    ngx-gridster-item.no-transition {\n        -webkit-transition: none;\n        transition: none;\n    }\n    ngx-gridster-item .gridster-item-resizable-handler {\n        position: absolute;\n        z-index: 2;\n        display: none;\n    }\n\n    ngx-gridster-item .gridster-item-resizable-handler.handle-n {\n      cursor: n-resize;\n      height: 10px;\n      right: 0;\n      top: 0;\n      left: 0;\n    }\n\n    ngx-gridster-item .gridster-item-resizable-handler.handle-e {\n      cursor: e-resize;\n      width: 10px;\n      bottom: 0;\n      right: 0;\n      top: 0;\n    }\n\n    ngx-gridster-item .gridster-item-resizable-handler.handle-s {\n      cursor: s-resize;\n      height: 10px;\n      right: 0;\n      bottom: 0;\n      left: 0;\n    }\n\n    ngx-gridster-item .gridster-item-resizable-handler.handle-w {\n      cursor: w-resize;\n      width: 10px;\n      left: 0;\n      top: 0;\n      bottom: 0;\n    }\n\n    ngx-gridster-item .gridster-item-resizable-handler.handle-ne {\n      cursor: ne-resize;\n      width: 10px;\n      height: 10px;\n      right: 0;\n      top: 0;\n    }\n\n    ngx-gridster-item .gridster-item-resizable-handler.handle-nw {\n      cursor: nw-resize;\n      width: 10px;\n      height: 10px;\n      left: 0;\n      top: 0;\n    }\n\n    ngx-gridster-item .gridster-item-resizable-handler.handle-se {\n      cursor: se-resize;\n      width: 0;\n      height: 0;\n      right: 0;\n      bottom: 0;\n      border-style: solid;\n      border-width: 0 0 10px 10px;\n      border-color: transparent;\n    }\n\n    ngx-gridster-item .gridster-item-resizable-handler.handle-sw {\n      cursor: sw-resize;\n      width: 10px;\n      height: 10px;\n      left: 0;\n      bottom: 0;\n    }\n\n    ngx-gridster-item:hover .gridster-item-resizable-handler.handle-se {\n      border-color: transparent transparent #ccc\n    }\n    `],\n    changeDetection: ChangeDetectionStrategy.OnPush,\n    encapsulation: ViewEncapsulation.None\n})\nexport class GridsterItemComponent implements OnInit, OnChanges, AfterViewInit, OnDestroy {\n    @Input() x: number;\n    @Output() xChange = new EventEmitter<number>(true);\n    @Input() y: number;\n    @Output() yChange = new EventEmitter<number>(true);\n\n    @Input() xSm: number;\n    @Output() xSmChange = new EventEmitter<number>(true);\n    @Input() ySm: number;\n    @Output() ySmChange = new EventEmitter<number>(true);\n\n    @Input() xMd: number;\n    @Output() xMdChange = new EventEmitter<number>(true);\n    @Input() yMd: number;\n    @Output() yMdChange = new EventEmitter<number>(true);\n\n    @Input() xLg: number;\n    @Output() xLgChange = new EventEmitter<number>(true);\n    @Input() yLg: number;\n    @Output() yLgChange = new EventEmitter<number>(true);\n\n    @Input() xXl: number;\n    @Output() xXlChange = new EventEmitter<number>(true);\n    @Input() yXl: number;\n    @Output() yXlChange = new EventEmitter<number>(true);\n\n\n    @Input() w: number;\n    @Output() wChange = new EventEmitter<number>(true);\n    @Input() h: number;\n    @Output() hChange = new EventEmitter<number>(true);\n\n    @Input() wSm: number;\n    @Output() wSmChange = new EventEmitter<number>(true);\n    @Input() hSm: number;\n    @Output() hSmChange = new EventEmitter<number>(true);\n\n    @Input() wMd: number;\n    @Output() wMdChange = new EventEmitter<number>(true);\n    @Input() hMd: number;\n    @Output() hMdChange = new EventEmitter<number>(true);\n\n    @Input() wLg: number;\n    @Output() wLgChange = new EventEmitter<number>(true);\n    @Input() hLg: number;\n    @Output() hLgChange = new EventEmitter<number>(true);\n\n    @Input() wXl: number;\n    @Output() wXlChange = new EventEmitter<number>(true);\n    @Input() hXl: number;\n    @Output() hXlChange = new EventEmitter<number>(true);\n\n    @Output() change = new EventEmitter<any>(true);\n    @Output() start = new EventEmitter<any>(true);\n    @Output() end = new EventEmitter<any>(true);\n\n    @Input() dragAndDrop = true;\n    @Input() resizable = true;\n\n    @Input() options: any = {};\n\n    autoSize: boolean;\n\n    @HostBinding('class.is-dragging') isDragging = false;\n    @HostBinding('class.is-resizing') isResizing = false;\n\n    $element: HTMLElement;\n    elementRef: ElementRef;\n    /**\n     * Gridster provider service\n     */\n    gridster: GridsterService;\n\n    item: GridListItem;\n\n    set positionX(value: number) {\n        this._positionX = value;\n    }\n    get positionX() {\n        return this._positionX;\n    }\n    set positionY(value: number) {\n        this._positionY = value;\n    }\n    get positionY() {\n        return this._positionY;\n    }\n    private _positionX: number;\n    private _positionY: number;\n\n    private defaultOptions: any = {\n        minWidth: 1,\n        minHeight: 1,\n        maxWidth: Infinity,\n        maxHeight: Infinity,\n        defaultWidth: 1,\n        defaultHeight: 1\n    };\n    private subscriptions: Array<Subscription> = [];\n    private dragSubscriptions: Array<Subscription> = [];\n    private resizeSubscriptions: Array<Subscription> = [];\n\n    constructor(private zone: NgZone,\n                private gridsterPrototypeService: GridsterPrototypeService,\n                @Inject(ElementRef) elementRef: ElementRef,\n                @Inject(GridsterService) gridster: GridsterService) {\n\n        this.gridster = gridster;\n        this.elementRef = elementRef;\n        this.$element = elementRef.nativeElement;\n\n        this.item = (new GridListItem()).setFromGridsterItem(this);\n\n        // if gridster is initialized do not show animation on new grid-item construct\n        if (this.gridster.isInitialized()) {\n            this.preventAnimation();\n        }\n    }\n\n    ngOnInit() {\n        this.options = Object.assign(this.defaultOptions, this.options);\n\n        this.w = this.w || this.options.defaultWidth;\n        this.h = this.h || this.options.defaultHeight;\n        this.wSm = this.wSm || this.w;\n        this.hSm = this.hSm || this.h;\n        this.wMd = this.wMd || this.w;\n        this.hMd = this.hMd || this.h;\n        this.wLg = this.wLg || this.w;\n        this.hLg = this.hLg || this.h;\n        this.wXl = this.wXl || this.w;\n        this.hXl = this.hXl || this.h;\n\n        if (this.gridster.isInitialized()) {\n            this.setPositionsOnItem();\n        }\n\n        this.gridster.registerItem(this.item);\n\n        this.gridster.calculateCellSize();\n        this.item.applySize();\n        this.item.applyPosition();\n\n        if (this.gridster.options.dragAndDrop && this.dragAndDrop) {\n            this.enableDragDrop();\n        }\n\n        if (this.gridster.isInitialized()) {\n            this.gridster.render();\n            this.gridster.updateCachedItems();\n        }\n    }\n\n    ngAfterViewInit() {\n        if (this.gridster.options.resizable && this.item.resizable) {\n            this.enableResizable();\n        }\n    }\n\n    ngOnChanges(changes: SimpleChanges) {\n        if (!this.gridster.gridList) {\n            return;\n        }\n        let rerender = false;\n\n        ['w', ...Object.keys(GridListItem.W_PROPERTY_MAP).map(breakpoint => GridListItem.W_PROPERTY_MAP[breakpoint])]\n        .filter(propName => changes[propName] && !changes[propName].isFirstChange())\n        .forEach((propName: string) => {\n            if (changes[propName].currentValue > this.options.maxWidth) {\n                this[propName] = this.options.maxWidth;\n                setTimeout(() => this[propName + 'Change'].emit(this[propName]));\n            }\n            rerender = true;\n        });\n\n        ['h', ...Object.keys(GridListItem.H_PROPERTY_MAP).map(breakpoint => GridListItem.H_PROPERTY_MAP[breakpoint])]\n            .filter(propName => changes[propName] && !changes[propName].isFirstChange())\n            .forEach((propName: string) => {\n                if (changes[propName].currentValue > this.options.maxHeight) {\n                    this[propName] = this.options.maxHeight;\n                    setTimeout(() => this[propName + 'Change'].emit(this[propName]));\n                }\n                rerender = true;\n            });\n\n        ['x', 'y',\n        ...Object.keys(GridListItem.X_PROPERTY_MAP).map(breakpoint => GridListItem.X_PROPERTY_MAP[breakpoint]),\n        ...Object.keys(GridListItem.Y_PROPERTY_MAP).map(breakpoint => GridListItem.Y_PROPERTY_MAP[breakpoint])]\n            .filter(propName => changes[propName] && !changes[propName].isFirstChange())\n            .forEach((propName: string) => rerender = true);\n\n        if (changes['dragAndDrop'] && !changes['dragAndDrop'].isFirstChange()) {\n            if (changes['dragAndDrop'].currentValue && this.gridster.options.dragAndDrop) {\n                this.enableDragDrop();\n            } else {\n                this.disableDraggable();\n            }\n        }\n        if (changes['resizable'] && !changes['resizable'].isFirstChange()) {\n            if (changes['resizable'].currentValue && this.gridster.options.resizable) {\n                this.enableResizable();\n            } else {\n                this.disableResizable();\n            }\n        }\n\n        if (rerender && this.gridster.gridsterComponent.isReady) {\n            this.gridster.debounceRenderSubject.next();\n        }\n    }\n\n    ngOnDestroy() {\n        this.gridster.removeItem(this.item);\n        this.gridster.itemRemoveSubject.next(this.item);\n\n        this.subscriptions.forEach((sub: Subscription) => {\n            sub.unsubscribe();\n        });\n        this.disableDraggable();\n        this.disableResizable();\n    }\n\n    updateElemenetPosition() {\n        if (this.gridster.options.useCSSTransforms) {\n            utils.setTransform(this.$element, {x: this._positionX, y: this._positionY});\n        } else {\n            utils.setCssElementPosition(this.$element, {x: this._positionX, y: this._positionY});\n        }\n    }\n\n    setPositionsOnItem() {\n        if (!this.item.hasPositions(this.gridster.options.breakpoint)) {\n            this.setPositionsForGrid(this.gridster.options);\n        }\n\n        this.gridster.gridsterOptions.responsiveOptions\n            .filter((options: IGridsterOptions) => !this.item.hasPositions(options.breakpoint))\n            .forEach((options: IGridsterOptions) => this.setPositionsForGrid(options));\n    }\n\n    public enableResizable() {\n        if (this.resizeSubscriptions.length) {\n            return;\n        }\n\n        this.zone.runOutsideAngular(() => {\n            this.getResizeHandlers().forEach((handler) => {\n                const direction = this.getResizeDirection(handler);\n\n                if (this.hasResizableHandle(direction)) {\n                    handler.style.display = 'block';\n                }\n\n                const draggable = new Draggable(handler, this.getResizableOptions());\n\n                let startEvent;\n                let startData;\n                let cursorToElementPosition;\n\n                const dragStartSub = draggable.dragStart\n                    .subscribe((event: DraggableEvent) => {\n                        this.zone.run(() => {\n                            this.isResizing = true;\n\n                            startEvent = event;\n                            startData = this.createResizeStartObject(direction);\n                            cursorToElementPosition = event.getRelativeCoordinates(this.$element);\n\n                            this.gridster.onResizeStart(this.item);\n                            this.onStart('resize');\n                        });\n                    });\n\n                const dragSub = draggable.dragMove\n                    .subscribe((event: DraggableEvent) => {\n                        const scrollData = this.gridster.gridsterScrollData;\n\n                        this.resizeElement({\n                            direction,\n                            startData,\n                            position: {\n                                x: event.clientX - cursorToElementPosition.x - this.gridster.gridsterRect.left,\n                                y: event.clientY - cursorToElementPosition.y - this.gridster.gridsterRect.top\n                            },\n                            startEvent,\n                            moveEvent: event,\n                            scrollDiffX: scrollData.scrollLeft - startData.scrollLeft,\n                            scrollDiffY: scrollData.scrollTop - startData.scrollTop\n                        });\n\n                        this.gridster.onResizeDrag(this.item);\n                    });\n\n                const dragStopSub = draggable.dragStop\n                    .subscribe(() => {\n                        this.zone.run(() => {\n                            this.isResizing = false;\n\n                            this.gridster.onResizeStop(this.item);\n                            this.onEnd('resize');\n                        });\n                    });\n\n                this.resizeSubscriptions = this.resizeSubscriptions.concat([dragStartSub, dragSub, dragStopSub]);\n\n            });\n        });\n    }\n\n    public disableResizable() {\n        this.resizeSubscriptions.forEach((sub: Subscription) => {\n            sub.unsubscribe();\n        });\n        this.resizeSubscriptions = [];\n\n        [].forEach.call(this.$element.querySelectorAll('.gridster-item-resizable-handler'), (handler) => {\n            handler.style.display = '';\n        });\n    }\n\n    public enableDragDrop() {\n        if (this.dragSubscriptions.length) {\n            return;\n        }\n        this.zone.runOutsideAngular(() => {\n            let cursorToElementPosition;\n\n            const draggable = new Draggable(this.$element, this.getDraggableOptions());\n\n            const dragStartSub = draggable.dragStart\n                .subscribe((event: DraggableEvent) => {\n                    this.zone.run(() => {\n                        this.gridster.onStart(this.item);\n                        this.isDragging = true;\n                        this.onStart('drag');\n\n                        cursorToElementPosition = event.getRelativeCoordinates(this.$element);\n                    });\n                });\n\n            const dragSub = draggable.dragMove\n                .subscribe((event: DraggableEvent) => {\n\n                    this.positionY = (event.clientY - cursorToElementPosition.y -\n                        this.gridster.gridsterRect.top);\n                    this.positionX = (event.clientX - cursorToElementPosition.x -\n                        this.gridster.gridsterRect.left);\n                    this.updateElemenetPosition();\n\n                    this.gridster.onDrag(this.item);\n                });\n\n            const dragStopSub = draggable.dragStop\n                .subscribe(() => {\n                    this.zone.run(() => {\n                        this.gridster.onStop(this.item);\n                        this.gridster.debounceRenderSubject.next();\n                        this.isDragging = false;\n                        this.onEnd('drag');\n                    });\n                });\n\n            this.dragSubscriptions = this.dragSubscriptions.concat([dragStartSub, dragSub, dragStopSub]);\n        });\n    }\n\n    public disableDraggable() {\n        this.dragSubscriptions.forEach((sub: Subscription) => {\n            sub.unsubscribe();\n        });\n        this.dragSubscriptions = [];\n    }\n\n    private getResizeHandlers(): HTMLElement[]  {\n        return [].filter.call(this.$element.children[0].children, (el) => {\n\n            return el.classList.contains('gridster-item-resizable-handler');\n        });\n    }\n\n    private getDraggableOptions() {\n        return { scrollDirection: this.gridster.options.direction, ...this.gridster.draggableOptions };\n    }\n\n    private getResizableOptions() {\n        const resizableOptions: any = {};\n\n        if (this.gridster.draggableOptions.scroll || this.gridster.draggableOptions.scroll === false) {\n            resizableOptions.scroll = this.gridster.draggableOptions.scroll;\n        }\n        if (this.gridster.draggableOptions.scrollEdge) {\n            resizableOptions.scrollEdge = this.gridster.draggableOptions.scrollEdge;\n        }\n\n        resizableOptions.scrollDirection = this.gridster.options.direction;\n\n        return resizableOptions;\n    }\n\n    private hasResizableHandle(direction: string): boolean {\n        const isItemResizable = this.gridster.options.resizable && this.item.resizable;\n        const resizeHandles = this.gridster.options.resizeHandles;\n\n        return isItemResizable && (!resizeHandles || (resizeHandles && !!resizeHandles[direction]));\n    }\n\n    private setPositionsForGrid(options: IGridsterOptions) {\n        let x, y;\n\n        const position = this.findPosition(options);\n        x = options.direction === 'horizontal' ? position[0] : position[1];\n        y = options.direction === 'horizontal' ? position[1] : position[0];\n\n        this.item.setValueX(x, options.breakpoint);\n        this.item.setValueY(y, options.breakpoint);\n\n        setTimeout(() => {\n            this.item.triggerChangeX(options.breakpoint);\n            this.item.triggerChangeY(options.breakpoint);\n        });\n    }\n\n    private findPosition(options: IGridsterOptions): Array<number> {\n        const gridList = new GridList(\n            this.gridster.items.map(item => item.copyForBreakpoint(options.breakpoint)),\n            options\n        );\n\n        return gridList.findPositionForItem(this.item, {x: 0, y: 0});\n    }\n\n    private createResizeStartObject(direction: string) {\n        const scrollData = this.gridster.gridsterScrollData;\n\n        return {\n            top: this.positionY,\n            left: this.positionX,\n            height: parseInt(this.$element.style.height, 10),\n            width: parseInt(this.$element.style.width, 10),\n            minX: Math.max(this.item.x + this.item.w - this.options.maxWidth, 0),\n            maxX: this.item.x + this.item.w - this.options.minWidth,\n            minY: Math.max(this.item.y + this.item.h - this.options.maxHeight, 0),\n            maxY: this.item.y + this.item.h - this.options.minHeight,\n            minW: this.options.minWidth,\n            maxW: Math.min(\n                this.options.maxWidth,\n                (this.gridster.options.direction === 'vertical' && direction.indexOf('w') < 0) ?\n                this.gridster.options.lanes - this.item.x : this.options.maxWidth,\n                direction.indexOf('w') >= 0 ?\n                this.item.x + this.item.w : this.options.maxWidth\n            ),\n            minH: this.options.minHeight,\n            maxH: Math.min(\n                this.options.maxHeight,\n                (this.gridster.options.direction === 'horizontal' && direction.indexOf('n') < 0) ?\n                this.gridster.options.lanes - this.item.y : this.options.maxHeight,\n                direction.indexOf('n') >= 0 ?\n                this.item.y + this.item.h : this.options.maxHeight\n            ),\n            scrollLeft: scrollData.scrollLeft,\n            scrollTop: scrollData.scrollTop\n        };\n    }\n\n    private onEnd(actionType: string): void {\n        this.end.emit({action: actionType, item: this.item});\n    }\n\n    private onStart(actionType: string): void {\n        this.start.emit({action: actionType, item: this.item});\n    }\n\n    /**\n     * Assign class for short while to prevent animation of grid item component\n     */\n    private preventAnimation(): GridsterItemComponent {\n        this.$element.classList.add('no-transition');\n        setTimeout(() => {\n            this.$element.classList.remove('no-transition');\n        }, 500);\n\n        return this;\n    }\n\n    private getResizeDirection(handler: Element): string {\n        for (let i = handler.classList.length - 1; i >= 0; i--) {\n            if (handler.classList[i].match('handle-')) {\n                return handler.classList[i].split('-')[1];\n            }\n        }\n    }\n\n    private resizeElement(config: any): void {\n        // north\n        if (config.direction.indexOf('n') >= 0) {\n            this.resizeToNorth(config);\n        }\n        // west\n        if (config.direction.indexOf('w') >= 0) {\n            this.resizeToWest(config);\n        }\n        // east\n        if (config.direction.indexOf('e') >= 0) {\n            this.resizeToEast(config);\n        }\n        // south\n        if (config.direction.indexOf('s') >= 0) {\n            this.resizeToSouth(config);\n        }\n    }\n\n    private resizeToNorth(config: any): void {\n        const height = config.startData.height + config.startEvent.clientY -\n            config.moveEvent.clientY - config.scrollDiffY;\n\n        if (height < (config.startData.minH * this.gridster.cellHeight)) {\n            this.setMinHeight('n', config);\n        } else if (height > (config.startData.maxH * this.gridster.cellHeight)) {\n            this.setMaxHeight('n', config);\n        } else {\n            this.positionY = config.position.y;\n            this.$element.style.height = height + 'px';\n        }\n    }\n\n    private resizeToWest(config: any): void {\n        const width = config.startData.width + config.startEvent.clientX -\n            config.moveEvent.clientX - config.scrollDiffX;\n\n        if (width < (config.startData.minW * this.gridster.cellWidth)) {\n            this.setMinWidth('w', config);\n        } else if (width > (config.startData.maxW * this.gridster.cellWidth)) {\n            this.setMaxWidth('w', config);\n        } else {\n            this.positionX = config.position.x;\n            this.updateElemenetPosition();\n            this.$element.style.width = width + 'px';\n        }\n    }\n\n    private resizeToEast(config: any): void {\n        const width = config.startData.width + config.moveEvent.clientX -\n            config.startEvent.clientX + config.scrollDiffX;\n\n        if (width > (config.startData.maxW * this.gridster.cellWidth)) {\n            this.setMaxWidth('e', config);\n        } else if (width < (config.startData.minW * this.gridster.cellWidth)) {\n            this.setMinWidth('e', config);\n        } else {\n            this.$element.style.width = width + 'px';\n        }\n    }\n\n    private resizeToSouth(config: any): void {\n        const height = config.startData.height + config.moveEvent.clientY -\n            config.startEvent.clientY + config.scrollDiffY;\n\n        if (height > config.startData.maxH * this.gridster.cellHeight) {\n            this.setMaxHeight('s', config);\n        } else if (height < config.startData.minH * this.gridster.cellHeight) {\n            this.setMinHeight('s', config);\n        } else {\n            this.$element.style.height = height + 'px';\n        }\n    }\n\n    private setMinHeight(direction: string, config: any): void {\n        if (direction === 'n') {\n            this.$element.style.height = (config.startData.minH * this.gridster.cellHeight) + 'px';\n            this.positionY = config.startData.maxY * this.gridster.cellHeight;\n        } else {\n            this.$element.style.height = (config.startData.minH * this.gridster.cellHeight) + 'px';\n        }\n    }\n\n    private setMinWidth(direction: string, config: any): void {\n        if (direction === 'w') {\n            this.$element.style.width = (config.startData.minW * this.gridster.cellWidth) + 'px';\n            this.positionX = config.startData.maxX * this.gridster.cellWidth;\n            this.updateElemenetPosition();\n        } else {\n            this.$element.style.width = (config.startData.minW * this.gridster.cellWidth) + 'px';\n        }\n    }\n\n    private setMaxHeight(direction: string, config: any): void {\n\n        if (direction === 'n') {\n            this.$element.style.height = (config.startData.maxH * this.gridster.cellHeight) + 'px';\n            this.positionY = config.startData.minY * this.gridster.cellHeight;\n        } else {\n            this.$element.style.height = (config.startData.maxH * this.gridster.cellHeight) + 'px';\n        }\n    }\n\n    private setMaxWidth(direction: string, config: any): void {\n\n        if (direction === 'w') {\n            this.$element.style.width = (config.startData.maxW * this.gridster.cellWidth) + 'px';\n            this.positionX = config.startData.minX * this.gridster.cellWidth;\n            this.updateElemenetPosition();\n        } else {\n            this.$element.style.width = (config.startData.maxW * this.gridster.cellWidth) + 'px';\n        }\n    }\n}\n","import { Directive, ElementRef, Input, Output, HostBinding, EventEmitter, OnInit, OnDestroy,\n    NgZone} from '@angular/core';\nimport { Observable, Subscription, fromEvent } from 'rxjs';\n\nimport { GridsterPrototypeService } from './gridster-prototype.service';\nimport { GridListItem } from '../gridList/GridListItem';\nimport { GridsterService } from '../gridster.service';\nimport { DraggableEvent } from '../utils/DraggableEvent';\nimport { Draggable } from '../utils/draggable';\nimport { utils } from '../utils/utils';\n\n@Directive({\n    selector: '[ngxGridsterItemPrototype]'\n})\nexport class GridsterItemPrototypeDirective implements OnInit, OnDestroy {\n    @Output() drop = new EventEmitter();\n    @Output() start = new EventEmitter();\n    @Output() cancel = new EventEmitter();\n    @Output() enter = new EventEmitter();\n    @Output() out = new EventEmitter();\n\n    @Input() data: any;\n    @Input() config: any = {};\n\n    public x = 0;\n    public y = 0;\n    @Input() w: number;\n    @Input() wSm: number;\n    @Input() wMd: number;\n    @Input() wLg: number;\n    @Input() wXl: number;\n    @Input() h: number;\n    @Input() hSm: number;\n    @Input() hMd: number;\n    @Input() hLg: number;\n    @Input() hXl: number;\n\n    positionX: number;\n    positionY: number;\n\n    autoSize = false;\n\n    $element: HTMLElement;\n\n    /**\n     * Mouse drag observable\n     */\n    drag: Observable<any>;\n\n    /**\n     * Subscribtion for drag observable\n     */\n    dragSubscription: Subscription;\n\n    isDragging = false;\n\n    item: GridListItem;\n\n    containerRectange: ClientRect;\n\n    private dragContextGridster: GridsterService;\n    private parentRect: ClientRect;\n    private parentOffset: {left: number, top: number};\n\n    private subscribtions: Array<Subscription> = [];\n\n    // must be set to true because of item dragAndDrop configuration\n    get dragAndDrop(): boolean {\n        return true;\n    }\n\n    get gridster(): GridsterService {\n        return this.dragContextGridster;\n    }\n\n    constructor(private zone: NgZone,\n                private elementRef: ElementRef,\n                private gridsterPrototype: GridsterPrototypeService) {\n\n        this.item = (new GridListItem()).setFromGridsterItemPrototype(this);\n    }\n\n    ngOnInit() {\n        this.wSm = this.wSm || this.w;\n        this.hSm = this.hSm || this.h;\n        this.wMd = this.wMd || this.w;\n        this.hMd = this.hMd || this.h;\n        this.wLg = this.wLg || this.w;\n        this.hLg = this.hLg || this.h;\n        this.wXl = this.wXl || this.w;\n        this.hXl = this.hXl || this.h;\n        this.zone.runOutsideAngular(() => {\n            this.enableDragDrop();\n        });\n    }\n\n    ngOnDestroy() {\n        this.subscribtions.forEach((sub: Subscription) => {\n            sub.unsubscribe();\n        });\n    }\n\n    onDrop (gridster: GridsterService): void {\n        if (!this.config.helper) {\n            this.$element.parentNode.removeChild(this.$element);\n        }\n\n        this.drop.emit({\n            item: this.item,\n            gridster: gridster\n        });\n    }\n\n    onCancel (): void {\n        this.cancel.emit({item: this.item});\n    }\n\n    onEnter (gridster: GridsterService): void {\n        this.enter.emit({\n            item: this.item,\n            gridster: gridster\n        });\n    }\n\n    onOver (gridster: GridsterService): void {}\n\n    onOut (gridster: GridsterService): void {\n        this.out.emit({\n            item: this.item,\n            gridster: gridster\n        });\n    }\n\n    getPositionToGridster(gridster: GridsterService) {\n        const relativeContainerCoords = this.getContainerCoordsToGridster(gridster);\n\n        return {\n            y: this.positionY - relativeContainerCoords.top,\n            x: this.positionX - relativeContainerCoords.left\n        };\n    }\n\n    setDragContextGridster(gridster: GridsterService) {\n        this.dragContextGridster = gridster;\n    }\n\n    private getContainerCoordsToGridster(gridster: GridsterService): {top: number, left: number} {\n        return {\n            left: gridster.gridsterRect.left - this.parentRect.left,\n            top: gridster.gridsterRect.top - this.parentRect.top\n        };\n    }\n\n    private enableDragDrop() {\n        let cursorToElementPosition;\n        const draggable = new Draggable(this.elementRef.nativeElement);\n\n        const dragStartSub = draggable.dragStart\n            .subscribe((event: DraggableEvent) => {\n                this.zone.run(() => {\n                    this.$element = this.provideDragElement();\n                    this.containerRectange = this.$element.parentElement.getBoundingClientRect();\n                    this.updateParentElementData();\n                    this.onStart(event);\n\n                    cursorToElementPosition = event.getRelativeCoordinates(this.$element);\n                });\n            });\n\n        const dragSub = draggable.dragMove\n            .subscribe((event: DraggableEvent) => {\n\n                this.setElementPosition(this.$element, {\n                    x: event.clientX - cursorToElementPosition.x  - this.parentRect.left,\n                    y: event.clientY - cursorToElementPosition.y  - this.parentRect.top\n                });\n\n                this.onDrag(event);\n            });\n\n        const dragStopSub = draggable.dragStop\n            .subscribe((event: DraggableEvent) => {\n                this.zone.run(() => {\n                    this.onStop(event);\n                    this.$element = null;\n                });\n            });\n\n        const scrollSub = fromEvent(document, 'scroll')\n            .subscribe(() => {\n                if (this.$element) {\n                    this.updateParentElementData();\n                }\n            });\n\n        this.subscribtions = this.subscribtions.concat([dragStartSub, dragSub, dragStopSub, scrollSub]);\n    }\n\n    private setElementPosition(element: HTMLElement, position: {x: number, y: number}) {\n        this.positionX = position.x;\n        this.positionY = position.y;\n        utils.setCssElementPosition(element, position);\n    }\n\n    private updateParentElementData() {\n        this.parentRect = this.$element.parentElement.getBoundingClientRect();\n        this.parentOffset = {\n            left: this.$element.parentElement.offsetLeft,\n            top: this.$element.parentElement.offsetTop\n        };\n    }\n\n    private onStart (event: DraggableEvent): void {\n        this.isDragging = true;\n\n        this.$element.style.pointerEvents = 'none';\n        this.$element.style.position = 'absolute';\n\n        this.gridsterPrototype.dragItemStart(this, event);\n\n        this.start.emit({item: this.item});\n    }\n\n    private onDrag (event: DraggableEvent): void {\n        this.gridsterPrototype.updatePrototypePosition(this, event);\n    }\n\n    private onStop (event: DraggableEvent): void {\n        this.gridsterPrototype.dragItemStop(this, event);\n\n        this.isDragging = false;\n        this.$element.style.pointerEvents = 'auto';\n        this.$element.style.position = '';\n        utils.resetCSSElementPosition(this.$element);\n\n        if (this.config.helper) {\n            this.$element.parentNode.removeChild(this.$element);\n        }\n    }\n\n    private provideDragElement (): HTMLElement {\n        let dragElement = this.elementRef.nativeElement;\n\n        if (this.config.helper) {\n            dragElement = <any>(dragElement).cloneNode(true);\n\n            document.body.appendChild(this.fixStylesForBodyHelper(dragElement));\n        } else {\n            this.fixStylesForRelativeElement(dragElement);\n        }\n\n        return dragElement;\n    }\n\n    private fixStylesForRelativeElement(el: HTMLElement) {\n        if (window.getComputedStyle(el).position === 'absolute') {\n            return el;\n        }\n        const rect = this.elementRef.nativeElement.getBoundingClientRect();\n        this.containerRectange = el.parentElement.getBoundingClientRect();\n\n        el.style.position = 'absolute';\n        this.setElementPosition(el, {\n            x: rect.left - this.containerRectange.left,\n            y: rect.top - this.containerRectange.top\n        });\n\n        return el;\n    }\n\n    /**\n     * When element is cloned and append to body it should have position absolute and coords set by original\n     * relative prototype element position.\n     */\n    private fixStylesForBodyHelper (el: HTMLElement) {\n        const bodyRect = document.body.getBoundingClientRect();\n        const rect = this.elementRef.nativeElement.getBoundingClientRect();\n\n        el.style.position = 'absolute';\n        this.setElementPosition(el, {\n            x: rect.left - bodyRect.left,\n            y: rect.top - bodyRect.top\n        });\n\n        return el;\n    }\n\n}\n","import { NgModule, ModuleWithProviders } from '@angular/core';\nimport { CommonModule } from '@angular/common';\n\nimport { GridsterComponent } from './gridster.component';\nimport { GridsterItemComponent } from './gridster-item/gridster-item.component';\nimport { GridsterItemPrototypeDirective } from './gridster-prototype/gridster-item-prototype.directive';\nimport { GridsterPrototypeService } from './gridster-prototype/gridster-prototype.service';\n\n@NgModule({\n    imports: [\n        CommonModule\n    ],\n    declarations: [\n        GridsterComponent,\n        GridsterItemComponent,\n        GridsterItemPrototypeDirective\n    ],\n    exports: [\n        GridsterComponent,\n        GridsterItemComponent,\n        GridsterItemPrototypeDirective\n    ]\n})\nexport class GridsterModule {\n    static forRoot(): ModuleWithProviders<GridsterModule> {\n    return {\n        ngModule: GridsterModule,\n        providers: [GridsterPrototypeService]\n    };\n}\n}\n\n","/*\n * Public API Surface of gridster\n */\n\nexport * from './lib/gridster.module';\nexport * from './lib/gridster.component';\nexport * from './lib/gridster-item/gridster-item.component';\nexport * from './lib/gridster-prototype/gridster-item-prototype.directive';\nexport * from './lib/IGridsterOptions';\nexport * from './lib/IGridsterDraggableOptions';\nexport * from './lib/GridsterOptions';\nexport * from './lib/gridster-prototype/gridster-prototype.service';\nexport * from './lib/gridster.service';\nexport * from './lib/gridList/GridListItem';\n\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public_api';\n"],"names":[],"mappings":"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"}