{"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(null);\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(null);\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(null);\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":["i1.GridsterService","i2.GridsterPrototypeService","i1.GridsterPrototypeService"],"mappings":"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"}