{"_id":"grid","_rev":"136-442c2b81b07d57d1d6c0c60a82543454","name":"grid","time":{"modified":"2022-09-07T00:05:48.027Z","created":"2014-04-09T12:08:31.630Z","0.0.0":"2014-04-09T12:08:31.630Z","0.0.1":"2014-05-09T08:06:30.706Z","0.0.2":"2014-05-11T09:49:43.451Z","0.0.3":"2014-05-13T11:37:20.124Z","0.0.4":"2014-05-13T11:40:57.981Z","0.0.5":"2014-05-13T19:25:18.292Z","0.1.0":"2014-12-24T15:36:01.736Z","0.1.1":"2015-04-09T15:17:48.346Z","1.0.0":"2015-06-16T23:29:43.201Z","1.0.1":"2015-06-17T00:00:40.820Z","1.0.2":"2015-06-19T00:25:38.239Z","1.0.3":"2015-07-29T23:43:22.149Z","1.0.4":"2015-08-11T21:21:52.130Z","1.1.0":"2015-08-27T18:22:20.106Z","1.2.0":"2015-08-28T00:26:41.731Z","1.2.1":"2015-09-10T21:49:28.171Z","1.2.2":"2015-09-22T21:21:56.877Z","1.2.3":"2015-09-22T21:41:06.863Z","1.2.4":"2015-09-24T19:49:28.330Z","1.2.5":"2015-09-26T22:47:42.271Z","1.3.0":"2015-10-06T18:43:37.876Z","1.4.0":"2015-10-07T20:11:51.879Z","1.4.1":"2015-12-01T22:41:01.542Z","1.4.2":"2016-02-10T21:15:40.171Z","1.5.0":"2016-02-17T00:25:24.104Z","1.5.1":"2016-02-19T19:22:32.544Z","1.6.0":"2016-02-23T19:41:51.978Z","1.8.0":"2016-02-24T22:39:06.351Z","1.9.0":"2016-03-08T01:15:12.238Z","1.10.0":"2016-03-25T22:40:25.370Z","2.0.0":"2016-04-13T23:48:02.317Z","3.0.0":"2016-04-26T00:59:46.961Z","3.0.1":"2016-04-26T22:21:17.264Z","3.0.2":"2016-04-29T21:11:46.774Z","3.1.0":"2016-06-22T21:02:35.306Z","3.1.1":"2016-06-30T21:59:53.820Z","3.1.2":"2016-07-18T17:57:19.987Z","3.1.3":"2016-07-21T19:56:49.425Z","3.1.4":"2016-07-21T20:29:19.920Z","3.1.5":"2016-07-21T23:18:24.478Z","3.1.6":"2016-08-04T23:27:19.468Z","3.2.0":"2016-08-08T22:40:01.524Z","3.3.0":"2016-08-19T19:41:56.869Z","3.3.1":"2016-09-22T00:44:47.513Z","3.3.2":"2016-09-30T21:07:30.866Z","3.3.3":"2016-10-11T17:54:04.197Z","3.3.4":"2016-10-12T03:22:04.585Z","3.3.5":"2016-10-12T03:23:56.355Z","3.3.6":"2016-11-02T18:29:59.936Z","3.3.7":"2017-05-26T00:12:17.561Z","4.0.0":"2017-08-23T23:14:13.029Z","4.1.0":"2017-10-05T22:14:38.250Z","4.1.1":"2017-10-06T00:04:37.639Z","4.1.2":"2017-10-06T00:56:05.215Z","4.1.3":"2017-10-07T00:26:28.295Z","4.1.4":"2017-10-10T00:51:38.670Z","4.1.5":"2017-10-11T22:46:37.005Z","4.2.0":"2017-10-11T23:35:05.595Z","4.3.0":"2017-10-17T21:06:37.801Z","4.3.1":"2017-10-19T22:24:13.557Z","4.4.0":"2017-10-27T23:49:49.849Z","4.5.0":"2018-01-24T19:31:43.740Z","4.6.0":"2018-09-21T18:45:10.078Z","4.6.1":"2019-04-22T23:28:24.234Z","4.7.0":"2019-04-24T23:36:49.344Z","4.8.0":"2020-02-13T19:59:37.328Z","4.9.0":"2020-04-30T23:13:48.704Z","4.9.1":"2020-04-30T23:52:14.996Z","4.9.2":"2020-05-01T18:36:59.821Z","4.10.0":"2020-08-12T20:17:22.438Z","4.10.1":"2020-08-12T20:45:19.487Z","4.10.2":"2020-08-13T00:06:37.339Z","4.10.3":"2020-08-13T01:58:57.152Z","4.10.4":"2020-08-19T21:56:54.074Z","4.10.5":"2020-08-25T16:28:26.845Z","4.10.6":"2021-05-18T18:28:43.593Z","4.10.7":"2021-05-19T05:31:10.180Z","4.10.8":"2021-05-19T06:10:41.373Z","4.10.9":"2021-08-12T17:06:55.163Z"},"maintainers":[{"email":"rusty.camden@gmail.com","name":"scamden"},{"email":"sterling.camden+grid@gmail.com","name":"grid-ci"}],"dist-tags":{"latest":"4.10.8","next":"4.10.9"},"description":"A highly scalable grid component written in Typescript","readme":"[![npm](https://img.shields.io/npm/v/grid.svg)]( https://www.npmjs.com/package/grid) [![CircleCI](https://circleci.com/gh/gridgrid/grid.svg?style=shield)](https://circleci.com/gh/gridgrid/grid)  [![semantic-release](https://img.shields.io/badge/%20%20%F0%9F%93%A6%F0%9F%9A%80-semantic--release-e10079.svg)](https://github.com/semantic-release/semantic-release) [![Commitizen friendly](https://img.shields.io/badge/commitizen-friendly-brightgreen.svg)](http://commitizen.github.io/cz-cli/)\n\nGrid\n===\n\nA highly scalable grid component written in javscript [DEMO](https://gridgrid.github.io/grid/ \"Grid Demo\")\n\nNote: while Grid is fully functional it is still in beta. Use at your own risk and please file any issues on GitHub. \n\nAlso the grid is currently packaged for use with browserify. If you need a build for a non browserify (or webpack) environment please open an issue on github.\n\n\nInstallation\n===\n`npm install --save grid`\n\n\nExample / Quick-Start\n===\n\nTo run the sample app locally, run `npm start` and hit http://localhost:8082\n\n##### Create a Grid Instance\n`var core = require('grid')`\n`var grid = core();`\n\nThe grid handles most complexity for you. There are only three user supplied requirements to a get a grid up and running\n\n##### Row and Column Descriptors\nRow and column descriptors are objects that tell the grid how wide or high to make your cells. They also control things like whether or not a column is hidden and describe the overall dimensions of the grid.\n\n``` javascript\n\t// add some columns\n    var colDescriptors = [];\n    var colDescriptor;\n    for (var c = 0; c < 20; c++) {\n        // create a col descriptor\n        colDescriptor = grid.colModel.create();\n        colDescriptor.width = 78;\n        colDescriptor.hidden = !!(c % 2); // hide every other column for fun and profit\n    }\n    grid.colModel.add(colDescriptors);\n\n    // add some rows\n    var rowDescriptors = [];\n    var rowDescriptor;\n    for (var r = 0; r < 20; r++) {\n        // create a row descriptor\n        rowDescriptor = grid.rowModel.create();\n        rowDescriptor.height = 24;\n        if(r === 0){\n        \trowDescriptor.header = true;\n        }\n    }\n    grid.rowModel.add(rowDescriptors);\n```\n\n##### The DataModel\n\nThe grid determines what to render for a given cell by calling the supplied data model. This gives the client massive flexbility to generate and return the data however they need to.\n\nThe datamodel can be a simple object that the user sets on the grid instance `dataModel` field and needs to implement at a minimum\n\n`get`, `getHeader`, and `isDirty`, \n\nif you support user data entry and want paste to work you should also implement `set`\n\nHere's a basic read only implementation:\n\n``` javascript\n// use the grid's default dirty clean implementation almost always\n// (it will automatically be set clean on each draw by the grid)\nvar dataDirtyClean = grid.makeDirtyClean();\n\ngrid.dataModel = {\n\n    get: function(dataRowIndex, dataColIndex, isCopy) {\n        var rawValue = [dataRowIndex, dataColIndex];\n        return {\n            value: rawValue,\n            formatted: 'r' + rawValue[0] + ', c' + rawValue[1]\n        };\n    },\n    \n    getHeader: function(headerRowIndex, headerColIndex) {\n        var rawValue = [headerRowIndex, headerColIndex];\n        return {\n            value: rawValue,\n            formatted: 'hr' + rawValue[0] + ', hc' + rawValue[1]\n        };\n    },\n    \n    isDirty: dataDirtyClean.isDirty\n};\n```\n\n##### Call Build\nFinally we just need to tell the grid to set itself up in a container of our choosing:\n\n``` javascript\nvar container = document.createElement('div');\ncontainer.style.width = '800px';\ncontainer.style.height = '800px';\ndocument.body.appendChild(container);\ngrid.build(container);\n```\n\nConcepts\n===\n\nMany of the apis in the grid utilize two concepts when referencing coordinates: spaces and units. It's good to understand these before using the more advanced features.\n\n## Spaces\nCoordinates in the grid exist in one of three spaces.\n\n**virtual** - represents all of the data in your grid including the headers. for example, if you have a grid with one header row, then `(0, 20)` in the `'virtual'` space references the column 20 of the header. `(1, 20)` would reference column 20 of the first data row.\n\n**data** - very similar to virtual but does not include the headers. so `(0,20)` references the first row of data at the 20th column and technically `(-1, 20)` would represent the 20th column in the header although negative indexes are rarely used\n\n**view** - the view space represents the actual dom nodes that are rendered for the grid's virtualization. the grid's implementation renders enough cells to fill the entire viewport and no more (usually around 20-30 rows and 10 cols depending on sizes). in this space `(0,20)` would reference the dom cell at column 20 of the first row. even if you scroll the grid it will always point at that cell, so a view coordinate can be translated to different virtual coordinates depending on the scroll. you could think of view coordinates as a correlary for `position: fixed` in css\n\n## Units\nUnits in the grid are straightforward. They are either\n\n**px** - pixels, so `(0,0)` in the view space is the very top left pixel of the grid no matter the scroll, whereas `(0,0)` in the virtual space is the top left pixel only when the grid hasn't been scrolled, and would technically refer to a pixel out of view if the grid has been scrolled\n\nor\n\n**cell** - cells, so `(0,0)` in the view space represents the top left cell regardless of scroll, and `(0,0)` in the virtual space would represent an off screen cell if scrolled and top left if not scrolled\n\nUsing Custom HTML\n===\n\nThere are two ways to get non text (read html) into a grid:\n\n## Decorators\nDecorators are great for adding a piece of one-off ui that doesn't relate directly to the content of a cell or doesn't need to be in every row of a column or vice versa. For example, the grid internally uses decorators to render the focus and selection highlight as well as resize handles.\n\n**basic decorator**\n``` javascript\n\tvar top = 1,\n    left = 2,\n    height = 1,\n    width = 1,\n    unit = 'cell',\n    space = 'view';\n    var d = grid.decorators.create(top, left, height, width, unit, space);\n\n    // return some element\n    d.render = function() {\n        var a = document.createElement('a')\n        a.textContent = 'link Text!'\n        return a;\n    };\n    grid.decorators.add(d);\n```\n\nPuts a link over the cell at row 1 col 2 that doesn’t move with the scroll (why you would do this is questionable but it's just an example).\n\nYou can do more complicated things like render directives: (requires grid-angular-adapter)\n\n**angular directive decorator**\n``` javascript\nangular.module('myCoolGrid', [require('grid')])\n\n  .controller('MyGridCtrl', function($scope, GridSrvc, GridDecoratorSrvc) {\n      var grid = GridSrvc.core();\n\n      // do row col and datamodel setup...\n\n      var top = 20,\n          left = 10,\n          height = 2,\n          width = 2,\n          unit = 'cell',\n          space = 'virtual';\n      var d = grid.decorators.create(top, left, height, width, unit, space);\n\n      // return some element\n      d.render = function() {\n          var scope = $scope.$new();\n          scope.interestingData = 'INTERESTING DATA!!!';\n          return GridDecoratorSrvc.render({\n              $scope: scope,\n              template: '<my-directive data=\"interestingData\"></my-directive>',\n              events: true\n          });\n      };\n      grid.decorators.add(d);\n  });\n```\n\nThis will put your compiled directive in a box that spans from `row 20-22` and `col 10-12`, and moves appropriately with the scroll. The `events` flag lets the grid know that this decorator is interactable and should receive mouse events. (Otherwise pointer events are set to none.) The GridDecoratorSrvc takes care of destroying the scope and properly removing elements to avoid memory leaks with angular. You definitely should use it for any angular decorators.\n\n\n## Builders\nBuilders help you to get html into the actual cells of a given row or column instead of the text that would have been rendered.\n\n\n**basic builders**\n``` javascript\nvar builder = grid.colModel.createBuilder(function render() {\n    return angular.element('<a href=\"#\"></a>')[0];\n}, function update(elem, ctx) {\n    grid.viewLayer.setTextContent(elem, ctx.data.formatted);\n    return elem;\n});\nvar colDescriptor = grid.colModel.create(builder);\n```\n\nhave `<a>` tags in your cells for all the rows in that column\n\nNote: it's important for the update function of a builder to be extremely fast. Call `scope.$digest` not `scope.$apply`, and  use `grid.viewLayer.setTextContent` not `elem.innerHTML` where possible\n\n\nStyling\n===\nIf you want to update the look and feel of the grid, here are a few classes that you can override to give you the look you want.\n\n\n## Classes\n\n**`.grid-cell`:**\nThis class is responsible for the look of individual cells. \n\n**`.grid-focus-decorator`:** This decorator class is applied when you click('focus') on a cell\n\nEx. Adding the following style will give you a cell with a blue border around it when the cell is selected.\n``` css\n.grid-focus-decorator {\n  border: 2px solid blue;\n}\n```\n\n**`.grid-selection`:**\nWhen selecting rows and columns, this class sets the border and background so you know which rows you are exactly selecting\n\nEx.\n```css\n$grid-teal: #39CCCC !default;\n.grid-selection {\n  border: 1px solid $grid-teal;\n  background: transparentize($grid-teal, .8);\n}\n```\n\n**`.grid-row`:**\nThis class is responsible for the look of the row of cells.\n\nEx. To apply, a background color when hovering over each row, add the following:\n```css\n.grid-row {\n  &.hover {\n    background-color: lighten($grid-teal, 30) !important;\n  }\n}\n```\n\nTo apply styles only to the header row, use the following class:\n```css\n.grid-row {\n  &.grid-is-header {\n  }\n}\n\n```\n**`.col-resize`:** This class changes the look of the column resizing element. \n\n**`.grid-drag-line`**: This class is used when you are resizing a column. A vertical line is added to guide you of how much to resize your columns.\n\nEx. To show a blue vertical line when resizing a column, add the following\n```css\n.grid-drag-line {\n  background: #7FDBFF;\n}\n```\n\n","versions":{"0.1.0":{"name":"grid","version":"0.1.0","description":"An experiment","keywords":["grid","cluster"],"homepage":"https://github.com/sgmonda/grid","license":"MIT","main":"main.js","author":{"name":"Sergio Garcia Mondaray","email":"sgmonda@gmail.com","url":"http://www.sgmonda.com"},"repository":{"type":"git","url":"https://github.com/sgmonda/grid"},"dependencies":{},"devDependencies":{"jasmine-node":"1.14.2","jshint":"2.5.1"},"engines":{"node":"*"},"scripts":{"jshint":"jshint main.js tests","test":"jasmine-node --matchall tests/"},"gitHead":"a27b07a01a7362c8a18878ba362cae4c0f3a4f6f","bugs":{"url":"https://github.com/sgmonda/grid/issues"},"_id":"grid@0.1.0","_shasum":"63d8ad1babe7675c4ec89df6da6837b1cace9698","_from":".","_npmVersion":"1.4.28","_npmUser":{"name":"sgmonda","email":"sgmonda@gmail.com"},"maintainers":[{"name":"sgmonda","email":"sgmonda@gmail.com"}],"dist":{"shasum":"63d8ad1babe7675c4ec89df6da6837b1cace9698","tarball":"https://registry.npmjs.org/grid/-/grid-0.1.0.tgz","integrity":"sha512-cUvaUELYInqi24FS7aqhPkjRRcodlcsLyMbcLSnrrrmjsfZGtzwZecb5mEJKgWCk/xP/5tN/LtAd77t56WyOew==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQC58I9brHTjkEquHoAh3i7QXoM7yXz0X3qgiFJk5o5NcQIhAN7wCGs9D6Z+pAOMetQNfpbFglSRXNJEeYx7RmBz1V49"}]},"directories":{}},"0.1.1":{"name":"grid","version":"0.1.1","description":"An experiment","keywords":["grid","cluster"],"homepage":"https://github.com/sgmonda/grid","license":"MIT","main":"main.js","author":{"name":"Sergio Garcia Mondaray","email":"sgmonda@gmail.com","url":"http://www.sgmonda.com"},"repository":{"type":"git","url":"https://github.com/sgmonda/grid"},"dependencies":{},"devDependencies":{"jasmine-node":"1.14.2","jshint":"2.5.1"},"engines":{"node":"*"},"scripts":{"jshint":"jshint main.js tests","test":"jasmine-node --matchall tests/"},"bugs":{"url":"https://github.com/sgmonda/grid/issues"},"_id":"grid@0.1.1","_shasum":"b728d34e3a4cf66befb9883f4ce890c38a761bcd","_from":".","_npmVersion":"1.4.9","_npmUser":{"name":"sgmonda","email":"sgmonda@gmail.com"},"maintainers":[{"name":"sgmonda","email":"sgmonda@gmail.com"}],"dist":{"shasum":"b728d34e3a4cf66befb9883f4ce890c38a761bcd","tarball":"https://registry.npmjs.org/grid/-/grid-0.1.1.tgz","integrity":"sha512-Un2EYNKj2DQ9Yrw+dYPWxZZfoQfDGD/26gDKMpsDY3V3Js9rbQPFfgUfL1R7Z+Vce+yYNC0Kd/6C3bhzqMZuZg==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIGuCNCPfVpQsR6nHCSUVkj4IAv+fxbnPaEF0qdqWYpD+AiBdajgVZSCHvneYO9LvMQ7710JX6rylKkgOAWqOfA+B1w=="}]},"directories":{}},"1.0.0":{"name":"grid","version":"1.0.0","description":"A highly scalable grid component written in javscript","main":"src/modules/grid-entry.js","publishConfig":{"registry":"https://registry.npmjs.org/"},"engines":{"node":">=0.10.0"},"scripts":{},"dependencies":{"capitalize":"^0.5.0","element-class":"^0.1.1","es6-set":"~0.1.1","key":"^0.1.11","sanitize-html":"^1.5.1"},"devDependencies":{"aliasify":"^1.5.0","gulp":"^3.8.0","gulp-tasks-riq":"^0.1.0","jasmine-tools-riq":"~0.1.0","jquery":"^2.1.0","karma-jasmine-jquery":"~0.1.1","polyfill-function-prototype-bind":"0.0.1","yargs":"^1.2.2"},"peerDependencies":{"aliasify":"^1.5.0"},"browserify":{"transform":["aliasify"]},"browser":{"angular":"./bower_components/angular/angular.js","angular-route":"./bower_components/angular-route/angular-route.js"},"aliasify":{"aliases":{"@grid":"./src/modules"}},"gitHead":"e2c0e450884cc729733bb77a8d498fc3f5d4f4f0","_id":"grid@1.0.0","_shasum":"6b2c5e808054d37d713a31abd285c8b155f804f5","_from":".","_npmVersion":"2.1.17","_nodeVersion":"0.10.30","_npmUser":{"name":"scamden","email":"rusty.camden@gmail.com"},"maintainers":[{"name":"scamden","email":"rusty.camden@gmail.com"}],"dist":{"shasum":"6b2c5e808054d37d713a31abd285c8b155f804f5","tarball":"https://registry.npmjs.org/grid/-/grid-1.0.0.tgz","integrity":"sha512-E8P1LuZ9OVnv/qpXBkNsVURfOCTKyZmnDkxHIp56XArkrwcVzUipnNypzBhaEtjL/Lje17t7qs1DqAgiPxLsLg==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCmc9GjUJtakx8LjNZEPGYqur74pwQWo2iYDLjTi7cnRwIhAKhLREt3izNJI/G6G3UrKLpVOIMYBcjeJjGs7K6OAZQ0"}]},"directories":{}},"1.0.1":{"name":"grid","version":"1.0.1","description":"A highly scalable grid component written in javscript","main":"src/modules/grid-entry.js","publishConfig":{"registry":"https://registry.npmjs.org/"},"engines":{"node":">=0.10.0"},"scripts":{},"dependencies":{"capitalize":"^0.5.0","element-class":"^0.1.1","key":"^0.1.11"},"devDependencies":{"aliasify":"^1.5.0","gulp":"^3.8.0","gulp-tasks-riq":"^0.1.0","jasmine-tools-riq":"~0.1.0","jquery":"^2.1.0","karma-jasmine-jquery":"~0.1.1","polyfill-function-prototype-bind":"0.0.1","yargs":"^1.2.2"},"peerDependencies":{"aliasify":"^1.5.0"},"browserify":{"transform":["aliasify"]},"browser":{"angular":"./bower_components/angular/angular.js","angular-route":"./bower_components/angular-route/angular-route.js"},"aliasify":{"aliases":{"@grid":"./src/modules"}},"repository":{"type":"git","url":"https://github.com/relateiq/grid.git"},"keywords":["grid","spreadsheet","virtual","scroll"],"author":{"name":"Sterling Camden"},"license":"MIT","bugs":{"url":"https://github.com/relateiq/grid/issues"},"homepage":"https://github.com/relateiq/grid","gitHead":"9b237a975d83e20ee20e0d7b87a662dc91256eda","_id":"grid@1.0.1","_shasum":"bafc1463650bd9ce4bd8b16ce1536f3852177015","_from":".","_npmVersion":"2.1.17","_nodeVersion":"0.10.30","_npmUser":{"name":"scamden","email":"rusty.camden@gmail.com"},"maintainers":[{"name":"scamden","email":"rusty.camden@gmail.com"},{"name":"anthonyl","email":"anthony.liatsis@gmail.com"},{"name":"lerhaupt","email":"gary@relateiq.com"},{"name":"jontomas","email":"jon@relateiq.com"},{"name":"john.fox","email":"john.fox@relateiq.com"},{"name":"joechrz","email":"joechrz@gmail.com"},{"name":"keven425","email":"keven425@gmail.com"},{"name":"joemun","email":"joe.mun@relateiq.com"},{"name":"voxmatt","email":"mattm@relateiq.com"},{"name":"cdennison","email":"christy@relateiq.com"}],"dist":{"shasum":"bafc1463650bd9ce4bd8b16ce1536f3852177015","tarball":"https://registry.npmjs.org/grid/-/grid-1.0.1.tgz","integrity":"sha512-959mgh9C2PZD6smutOJI2vkiuMrpkhrJxT04UBeBqk1qAKCx+t4DWsjySHDMg4KYOBqXx7kzmI88S1Q5KzVEiQ==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIAjruGrLB2pQ5Jf5zt71y0AzqjqmSqEAhM3BR7IbstMJAiAbEJG60WfnJYMeRXxx/3Zmzp5ZPYnOM1AL0uEy813fNg=="}]},"directories":{}},"1.0.2":{"name":"grid","version":"1.0.2","description":"A highly scalable grid component written in javscript","main":"src/modules/grid-entry.js","publishConfig":{"registry":"https://registry.npmjs.org/"},"engines":{"node":">=0.10.0"},"scripts":{},"dependencies":{"capitalize":"^0.5.0","element-class":"^0.1.1","key":"^0.1.11"},"devDependencies":{"aliasify":"^1.5.0","gulp":"^3.8.0","gulp-tasks-riq":"^0.1.0","jasmine-tools-riq":"~0.1.0","jquery":"^2.1.0","karma-jasmine-jquery":"~0.1.1","polyfill-function-prototype-bind":"0.0.1","yargs":"^1.2.2"},"peerDependencies":{"aliasify":"^1.5.0"},"browserify":{"transform":["aliasify"]},"browser":{"angular":"./bower_components/angular/angular.js","angular-route":"./bower_components/angular-route/angular-route.js"},"aliasify":{"aliases":{"@grid":"./src/modules"}},"repository":{"type":"git","url":"https://github.com/relateiq/grid.git"},"keywords":["grid","spreadsheet","virtual","scroll"],"author":{"name":"Sterling Camden"},"license":"MIT","bugs":{"url":"https://github.com/relateiq/grid/issues"},"homepage":"https://github.com/relateiq/grid","gitHead":"593da0082967e05b78d7e9810dcb9e73c3538776","_id":"grid@1.0.2","_shasum":"c554274b674d01d5d248caf816cf39fbb4fb596a","_from":".","_npmVersion":"2.1.17","_nodeVersion":"0.10.30","_npmUser":{"name":"scamden","email":"rusty.camden@gmail.com"},"maintainers":[{"name":"scamden","email":"rusty.camden@gmail.com"},{"name":"anthonyl","email":"anthony.liatsis@gmail.com"},{"name":"lerhaupt","email":"gary@relateiq.com"},{"name":"jontomas","email":"jon@relateiq.com"},{"name":"john.fox","email":"john.fox@relateiq.com"},{"name":"joechrz","email":"joechrz@gmail.com"},{"name":"keven425","email":"keven425@gmail.com"},{"name":"joemun","email":"joe.mun@relateiq.com"},{"name":"voxmatt","email":"mattm@relateiq.com"},{"name":"cdennison","email":"christy@relateiq.com"}],"dist":{"shasum":"c554274b674d01d5d248caf816cf39fbb4fb596a","tarball":"https://registry.npmjs.org/grid/-/grid-1.0.2.tgz","integrity":"sha512-xST2kf3RXnTh1AT71o0THzAjWgGsJ9Qb/rvjkBCEAN9dUMCq7j3Smszbl13tygzqWLTeBNZx8o/nJaQaIK4K0Q==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCe8acPmUH7S4kirYeP0RImURa9LHKz6NacRmu4n9FGcgIgcoB+HG/ZUlQ7SwPdZW56JekuV10loKYZQC/xuBaGuUs="}]},"directories":{}},"1.0.3":{"name":"grid","version":"1.0.3","description":"A highly scalable grid component written in javscript","main":"src/modules/grid-entry.js","publishConfig":{"registry":"https://registry.npmjs.org/"},"engines":{"node":">=0.10.0"},"scripts":{},"dependencies":{"capitalize":"^0.5.0","element-class":"^0.1.1","key":"^0.1.11"},"devDependencies":{"aliasify":"^1.5.0","gulp":"^3.8.0","gulp-tasks-riq":"^0.1.0","jasmine-tools-riq":"~0.1.0","jquery":"^2.1.0","karma-jasmine-jquery":"~0.1.1","polyfill-function-prototype-bind":"0.0.1","yargs":"^1.2.2"},"peerDependencies":{"aliasify":"^1.5.0"},"browserify":{"transform":["aliasify"]},"browser":{"angular":"./bower_components/angular/angular.js","angular-route":"./bower_components/angular-route/angular-route.js"},"aliasify":{"aliases":{"@grid":"./src/modules"}},"repository":{"type":"git","url":"https://github.com/relateiq/grid.git"},"keywords":["grid","spreadsheet","virtual","scroll"],"author":{"name":"Sterling Camden"},"license":"MIT","bugs":{"url":"https://github.com/relateiq/grid/issues"},"homepage":"https://github.com/relateiq/grid","gitHead":"896e4efc19a6782b0dd4731f3adeba131af53362","_id":"grid@1.0.3","_shasum":"782889ddc88c9820ea52f26d89a066b7f6ab5207","_from":".","_npmVersion":"2.1.17","_nodeVersion":"0.10.30","_npmUser":{"name":"scamden","email":"rusty.camden@gmail.com"},"maintainers":[{"name":"scamden","email":"rusty.camden@gmail.com"},{"name":"anthonyl","email":"anthony.liatsis@gmail.com"},{"name":"lerhaupt","email":"gary@relateiq.com"},{"name":"jontomas","email":"jon@relateiq.com"},{"name":"john.fox","email":"john.fox@relateiq.com"},{"name":"joechrz","email":"joechrz@gmail.com"},{"name":"keven425","email":"keven425@gmail.com"},{"name":"joemun","email":"joe.mun@relateiq.com"},{"name":"voxmatt","email":"mattm@relateiq.com"},{"name":"cdennison","email":"christy@relateiq.com"}],"dist":{"shasum":"782889ddc88c9820ea52f26d89a066b7f6ab5207","tarball":"https://registry.npmjs.org/grid/-/grid-1.0.3.tgz","integrity":"sha512-0Lt8JafHBaVi5LIT8i1m1WiXx7Jzo9xWPEnV5BEJppaBD+deefO7mYUvl6rlpoPUvGhrCEvr5CLV9AnpkakWeQ==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIH/IuBP6Sxhh/0SK4zyF+Wj2PX7uPkjpHXjxzR84cZQIAiEAxxtDHOLyOSGGd/6diipqxliBDYbkm6YDGpn9cpdJvs4="}]},"directories":{}},"1.0.4":{"name":"grid","version":"1.0.4","description":"A highly scalable grid component written in javscript","main":"src/modules/grid-entry.js","publishConfig":{"registry":"https://registry.npmjs.org/"},"engines":{"node":">=0.10.0"},"scripts":{},"dependencies":{"capitalize":"^0.5.0","element-class":"^0.1.1","key":"^0.1.11"},"devDependencies":{"aliasify":"^1.5.0","gulp":"^3.8.0","gulp-tasks-riq":"^0.1.0","jasmine-tools-riq":"~0.1.0","jquery":"^2.1.0","karma-jasmine-jquery":"~0.1.1","polyfill-function-prototype-bind":"0.0.1","yargs":"^1.2.2"},"peerDependencies":{"aliasify":"^1.5.0"},"browserify":{"transform":["aliasify"]},"browser":{"angular":"./bower_components/angular/angular.js","angular-route":"./bower_components/angular-route/angular-route.js"},"aliasify":{"aliases":{"@grid":"./src/modules"}},"repository":{"type":"git","url":"https://github.com/relateiq/grid.git"},"keywords":["grid","spreadsheet","virtual","scroll"],"author":{"name":"Sterling Camden"},"license":"MIT","bugs":{"url":"https://github.com/relateiq/grid/issues"},"homepage":"https://github.com/relateiq/grid","gitHead":"b3b1209137d10caa1ba6473991516b0bcb5f7de8","_id":"grid@1.0.4","_shasum":"c5f2998758c8d2742f33d722d0babade106d8d1e","_from":".","_npmVersion":"2.1.17","_nodeVersion":"0.10.30","_npmUser":{"name":"scamden","email":"rusty.camden@gmail.com"},"maintainers":[{"name":"scamden","email":"rusty.camden@gmail.com"},{"name":"anthonyl","email":"anthony.liatsis@gmail.com"},{"name":"lerhaupt","email":"gary@relateiq.com"},{"name":"jontomas","email":"jon@relateiq.com"},{"name":"john.fox","email":"john.fox@relateiq.com"},{"name":"joechrz","email":"joechrz@gmail.com"},{"name":"keven425","email":"keven425@gmail.com"},{"name":"joemun","email":"joe.mun@relateiq.com"},{"name":"voxmatt","email":"mattm@relateiq.com"},{"name":"cdennison","email":"christy@relateiq.com"}],"dist":{"shasum":"c5f2998758c8d2742f33d722d0babade106d8d1e","tarball":"https://registry.npmjs.org/grid/-/grid-1.0.4.tgz","integrity":"sha512-fQQQYL+JNoefLtPoNRnvf3xisIDzmxqmdXsfm+r6BqPZJEP0/IRtDUoiz2Sh3BkXDwYDS25+bd0aSLDaxYTc0Q==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDtd+F3s3/pYp6+B3nxT+PCBE3D7DdaBkkGEp2G6V6cpAIgPA29qzp7zV1npTL/vtK6CgXjun7Le1zRnc0bzzWKRfM="}]},"directories":{}},"1.1.0":{"name":"grid","version":"1.1.0","description":"A highly scalable grid component written in javscript","main":"src/modules/grid-entry.js","publishConfig":{"registry":"https://registry.npmjs.org/"},"engines":{"node":">=0.10.0"},"scripts":{},"dependencies":{"capitalize":"^0.5.0","element-class":"^0.1.1","key":"^0.1.11"},"devDependencies":{"aliasify":"^1.5.0","gulp":"^3.8.0","gulp-tasks-riq":"^0.1.0","jasmine-tools-riq":"~0.1.0","jquery":"^2.1.0","karma-jasmine-jquery":"~0.1.1","polyfill-function-prototype-bind":"0.0.1","yargs":"^1.2.2"},"peerDependencies":{"aliasify":"^1.5.0"},"browserify":{"transform":["aliasify"]},"browser":{"angular":"./bower_components/angular/angular.js","angular-route":"./bower_components/angular-route/angular-route.js"},"aliasify":{"aliases":{"@grid":"./src/modules"}},"repository":{"type":"git","url":"https://github.com/relateiq/grid.git"},"keywords":["grid","spreadsheet","virtual","scroll"],"author":{"name":"Sterling Camden"},"license":"MIT","bugs":{"url":"https://github.com/relateiq/grid/issues"},"homepage":"https://github.com/relateiq/grid","gitHead":"c588c3404374baafb835a0c2498e79ce90fb23f1","_id":"grid@1.1.0","_shasum":"cceb6c762d1705f65d00de97a7dceaa6229153d0","_from":".","_npmVersion":"2.1.17","_nodeVersion":"0.10.30","_npmUser":{"name":"scamden","email":"rusty.camden@gmail.com"},"maintainers":[{"name":"scamden","email":"rusty.camden@gmail.com"},{"name":"anthonyl","email":"anthony.liatsis@gmail.com"},{"name":"lerhaupt","email":"gary@relateiq.com"},{"name":"jontomas","email":"jon@relateiq.com"},{"name":"john.fox","email":"john.fox@relateiq.com"},{"name":"joechrz","email":"joechrz@gmail.com"},{"name":"keven425","email":"keven425@gmail.com"},{"name":"joemun","email":"joe.mun@relateiq.com"},{"name":"voxmatt","email":"mattm@relateiq.com"},{"name":"cdennison","email":"christy@relateiq.com"}],"dist":{"shasum":"cceb6c762d1705f65d00de97a7dceaa6229153d0","tarball":"https://registry.npmjs.org/grid/-/grid-1.1.0.tgz","integrity":"sha512-49C+HbUh5yDAZ5t9nPF1D2+8sR0IKYoefgWCeOhrJSjSCEr4oKOB+/uWD9zCRjUIzeofAuB/4MXp8iZ/3V0kTA==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDldc+CanjdgbSyjGgw4yTPtMb8pli44H6ar5Ev+2uscQIgKZ/9EcuwJsxyi89hIOoq1p9D2ohODg3RMcBfA56FYvA="}]},"directories":{}},"1.2.0":{"name":"grid","version":"1.2.0","description":"A highly scalable grid component written in javscript","main":"src/modules/grid-entry.js","publishConfig":{"registry":"https://registry.npmjs.org/"},"engines":{"node":">=0.10.0"},"scripts":{},"dependencies":{"capitalize":"^0.5.0","element-class":"^0.1.1","key":"^0.1.11"},"devDependencies":{"aliasify":"^1.5.0","gulp":"^3.8.0","gulp-tasks-riq":"^0.1.0","jasmine-tools-riq":"~0.1.0","jquery":"^2.1.0","karma-jasmine-jquery":"~0.1.1","polyfill-function-prototype-bind":"0.0.1","yargs":"^1.2.2"},"peerDependencies":{"aliasify":"^1.5.0"},"browserify":{"transform":["aliasify"]},"browser":{"angular":"./bower_components/angular/angular.js","angular-route":"./bower_components/angular-route/angular-route.js"},"aliasify":{"aliases":{"@grid":"./src/modules"}},"repository":{"type":"git","url":"https://github.com/relateiq/grid.git"},"keywords":["grid","spreadsheet","virtual","scroll"],"author":{"name":"Sterling Camden"},"license":"MIT","bugs":{"url":"https://github.com/relateiq/grid/issues"},"homepage":"https://github.com/relateiq/grid","gitHead":"766573d5091762d706568433c67e391938092fb2","_id":"grid@1.2.0","_shasum":"5ef24830d11afab6d3463583f2739d2a9c27e2d3","_from":".","_npmVersion":"2.1.17","_nodeVersion":"0.10.30","_npmUser":{"name":"scamden","email":"rusty.camden@gmail.com"},"maintainers":[{"name":"scamden","email":"rusty.camden@gmail.com"},{"name":"anthonyl","email":"anthony.liatsis@gmail.com"},{"name":"lerhaupt","email":"gary@relateiq.com"},{"name":"jontomas","email":"jon@relateiq.com"},{"name":"john.fox","email":"john.fox@relateiq.com"},{"name":"joechrz","email":"joechrz@gmail.com"},{"name":"keven425","email":"keven425@gmail.com"},{"name":"joemun","email":"joe.mun@relateiq.com"},{"name":"voxmatt","email":"mattm@relateiq.com"},{"name":"cdennison","email":"christy@relateiq.com"}],"dist":{"shasum":"5ef24830d11afab6d3463583f2739d2a9c27e2d3","tarball":"https://registry.npmjs.org/grid/-/grid-1.2.0.tgz","integrity":"sha512-DsXTIp2omDE2XR7UzcsZaafHLHo42P/nM3+xStVziVbY8Uye6lo1F/vL0D1m7DJXtu0aYNwBae6FCmLRj7r81A==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIEyeP08JMJPX1l2iGGe90UDawqZMb/RfUCB7HSbN9HxHAiEAm1QdMG3FZ8kBFL22/GugrM7hLI1HoO9RCqdOcrz34oQ="}]},"directories":{}},"1.2.1":{"name":"grid","version":"1.2.1","description":"A highly scalable grid component written in javscript","main":"src/modules/grid-entry.js","publishConfig":{"registry":"https://registry.npmjs.org/"},"engines":{"node":">=0.10.0"},"scripts":{},"dependencies":{"capitalize":"^0.5.0","element-class":"^0.1.1","key":"^0.1.11"},"devDependencies":{"aliasify":"^1.5.0","gulp":"^3.8.0","gulp-tasks-riq":"^0.1.0","jasmine-tools-riq":"~0.1.0","jquery":"^2.1.0","karma-jasmine-jquery":"~0.1.1","polyfill-function-prototype-bind":"0.0.1","requestanimationframe":"0.0.22","yargs":"^1.2.2"},"peerDependencies":{"aliasify":"^1.5.0"},"browserify":{"transform":["aliasify"]},"browser":{"angular":"./bower_components/angular/angular.js","angular-route":"./bower_components/angular-route/angular-route.js"},"aliasify":{"aliases":{"@grid":"./src/modules"}},"repository":{"type":"git","url":"https://github.com/relateiq/grid.git"},"keywords":["grid","spreadsheet","virtual","scroll"],"author":{"name":"Sterling Camden"},"license":"MIT","bugs":{"url":"https://github.com/relateiq/grid/issues"},"homepage":"https://github.com/relateiq/grid","gitHead":"8a5c6daa1cd9ba7f2828257f55a1747efe9a7395","_id":"grid@1.2.1","_shasum":"cab94c9392801545176498e26ab6cef7a7ecd2bb","_from":".","_npmVersion":"2.1.17","_nodeVersion":"0.10.30","_npmUser":{"name":"scamden","email":"rusty.camden@gmail.com"},"maintainers":[{"name":"scamden","email":"rusty.camden@gmail.com"},{"name":"anthonyl","email":"anthony.liatsis@gmail.com"},{"name":"lerhaupt","email":"gary@relateiq.com"},{"name":"jontomas","email":"jon@relateiq.com"},{"name":"john.fox","email":"john.fox@relateiq.com"},{"name":"joechrz","email":"joechrz@gmail.com"},{"name":"keven425","email":"keven425@gmail.com"},{"name":"joemun","email":"joe.mun@relateiq.com"},{"name":"voxmatt","email":"mattm@relateiq.com"},{"name":"cdennison","email":"christy@relateiq.com"}],"dist":{"shasum":"cab94c9392801545176498e26ab6cef7a7ecd2bb","tarball":"https://registry.npmjs.org/grid/-/grid-1.2.1.tgz","integrity":"sha512-bjE8vXYkyUBZlBEBKQ2x33wxyX5o+jBhxGtgVdjr6LjVxyxkFffRrGbFL3eZqnf0UVVs/BUGPPzMlcOExnOeCg==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIGn77/hFOsh6NGpEKLt3m6VPIVuFjweWYsFhU+S4PKVoAiBtzjmR0kHqI94fPZzCMIrQGbp4cdNRF8wcLxq29agkNw=="}]},"directories":{}},"1.2.2":{"name":"grid","version":"1.2.2","description":"A highly scalable grid component written in javscript","main":"src/modules/grid-entry.js","publishConfig":{"registry":"https://registry.npmjs.org/"},"engines":{"node":">=0.10.0"},"scripts":{},"dependencies":{"capitalize":"^0.5.0","element-class":"^0.1.1","key":"^0.1.11"},"devDependencies":{"aliasify":"^1.5.0","gulp":"^3.8.0","gulp-tasks-riq":"^0.1.0","jasmine-tools-riq":"~0.1.0","jquery":"^2.1.0","karma-jasmine-jquery":"~0.1.1","polyfill-function-prototype-bind":"0.0.1","requestanimationframe":"0.0.22","yargs":"^1.2.2"},"peerDependencies":{"aliasify":"^1.5.0"},"browserify":{"transform":["aliasify"]},"browser":{"angular":"./bower_components/angular/angular.js","angular-route":"./bower_components/angular-route/angular-route.js"},"aliasify":{"aliases":{"@grid":"./src/modules"}},"repository":{"type":"git","url":"https://github.com/relateiq/grid.git"},"keywords":["grid","spreadsheet","virtual","scroll"],"author":{"name":"Sterling Camden"},"license":"MIT","bugs":{"url":"https://github.com/relateiq/grid/issues"},"homepage":"https://github.com/relateiq/grid","gitHead":"eb07d8dcc55a9e75c4eab2612e801dbc65621aae","_id":"grid@1.2.2","_shasum":"12e38df85d0cb2d8fbfe8abb4ff717b13e0cafa0","_from":".","_npmVersion":"2.1.17","_nodeVersion":"0.10.30","_npmUser":{"name":"scamden","email":"rusty.camden@gmail.com"},"maintainers":[{"name":"scamden","email":"rusty.camden@gmail.com"},{"name":"anthonyl","email":"anthony.liatsis@gmail.com"},{"name":"lerhaupt","email":"gary@relateiq.com"},{"name":"jontomas","email":"jon@relateiq.com"},{"name":"john.fox","email":"john.fox@relateiq.com"},{"name":"joechrz","email":"joechrz@gmail.com"},{"name":"keven425","email":"keven425@gmail.com"},{"name":"joemun","email":"joe.mun@relateiq.com"},{"name":"voxmatt","email":"mattm@relateiq.com"},{"name":"cdennison","email":"christy@relateiq.com"}],"dist":{"shasum":"12e38df85d0cb2d8fbfe8abb4ff717b13e0cafa0","tarball":"https://registry.npmjs.org/grid/-/grid-1.2.2.tgz","integrity":"sha512-Im+RsTYN01dGx0nEyZKoMvFaHwMpmE1mZjd9ZxW/R3uUPt1ijzZt7tT++ClklnvdBCJzdFnBP9vqS/JY/jy1OQ==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIAhWWhVGC2QkAkf4FsaTS5UFV9/raSHi1HQ6gJInM2G5AiBe+9dhbnTrcgKG6ahpPwzYb/j2wsIkq3IRzVTWYKCyoA=="}]},"directories":{}},"1.2.3":{"name":"grid","version":"1.2.3","description":"A highly scalable grid component written in javscript","main":"src/modules/grid-entry.js","publishConfig":{"registry":"https://registry.npmjs.org/"},"engines":{"node":">=0.10.0"},"scripts":{},"dependencies":{"capitalize":"^0.5.0","element-class":"^0.1.1","key":"^0.1.11"},"devDependencies":{"aliasify":"^1.5.0","gulp":"^3.8.0","gulp-tasks-riq":"^0.1.0","jasmine-tools-riq":"~0.1.0","jquery":"^2.1.0","karma-jasmine-jquery":"~0.1.1","polyfill-function-prototype-bind":"0.0.1","requestanimationframe":"0.0.22","yargs":"^1.2.2"},"peerDependencies":{"aliasify":"^1.5.0"},"browserify":{"transform":["aliasify"]},"browser":{"angular":"./bower_components/angular/angular.js","angular-route":"./bower_components/angular-route/angular-route.js"},"aliasify":{"aliases":{"@grid":"./src/modules"}},"repository":{"type":"git","url":"https://github.com/relateiq/grid.git"},"keywords":["grid","spreadsheet","virtual","scroll"],"author":{"name":"Sterling Camden"},"license":"MIT","bugs":{"url":"https://github.com/relateiq/grid/issues"},"homepage":"https://github.com/relateiq/grid","gitHead":"d74d40d671e6c75670ac1c49c02518054b28877e","_id":"grid@1.2.3","_shasum":"66a0058dad45ccfa744a0d86a1ba8c7fbcc36a15","_from":".","_npmVersion":"2.1.17","_nodeVersion":"0.10.30","_npmUser":{"name":"scamden","email":"rusty.camden@gmail.com"},"maintainers":[{"name":"scamden","email":"rusty.camden@gmail.com"},{"name":"anthonyl","email":"anthony.liatsis@gmail.com"},{"name":"lerhaupt","email":"gary@relateiq.com"},{"name":"jontomas","email":"jon@relateiq.com"},{"name":"john.fox","email":"john.fox@relateiq.com"},{"name":"joechrz","email":"joechrz@gmail.com"},{"name":"keven425","email":"keven425@gmail.com"},{"name":"joemun","email":"joe.mun@relateiq.com"},{"name":"voxmatt","email":"mattm@relateiq.com"},{"name":"cdennison","email":"christy@relateiq.com"}],"dist":{"shasum":"66a0058dad45ccfa744a0d86a1ba8c7fbcc36a15","tarball":"https://registry.npmjs.org/grid/-/grid-1.2.3.tgz","integrity":"sha512-yBpiTY7dqmHFO9Zeotqf8rbU70SM1c561Tun4RCdnI/6OlRlT/rHpTRQepUleCGKN43HRX58xweCkO/AP8o1yg==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIE4ZdTSaXQuSN7xYz73SIBYAtxQHKrLZ95O8mvX2pnRPAiEAk+THe0Q2fGhSNTkAOF8DGcjZx3ax+cnFIYeN0kOgCfs="}]},"directories":{}},"1.2.4":{"name":"grid","version":"1.2.4","description":"A highly scalable grid component written in javscript","main":"src/modules/grid-entry.js","publishConfig":{"registry":"https://registry.npmjs.org/"},"engines":{"node":">=0.10.0"},"scripts":{},"dependencies":{"capitalize":"^0.5.0","element-class":"^0.1.1","key":"^0.1.11"},"devDependencies":{"aliasify":"^1.5.0","gulp":"^3.8.0","gulp-tasks-riq":"^0.1.0","jasmine-tools-riq":"~0.1.0","jquery":"^2.1.0","karma-chrome-launcher":"~0.1.4","karma-jasmine-jquery":"~0.1.1","polyfill-function-prototype-bind":"0.0.1","requestanimationframe":"0.0.22","yargs":"^1.2.2"},"peerDependencies":{"aliasify":"^1.5.0"},"browserify":{"transform":["aliasify"]},"browser":{"angular":"./bower_components/angular/angular.js","angular-route":"./bower_components/angular-route/angular-route.js"},"aliasify":{"aliases":{"@grid":"./src/modules"}},"repository":{"type":"git","url":"https://github.com/relateiq/grid.git"},"keywords":["grid","spreadsheet","virtual","scroll"],"author":{"name":"Sterling Camden"},"license":"MIT","bugs":{"url":"https://github.com/relateiq/grid/issues"},"homepage":"https://github.com/relateiq/grid","gitHead":"92deb2b165cb13e4bf8ba229f6e2d992bfb47680","_id":"grid@1.2.4","_shasum":"d44d29f512c1585a5b59d84389365cb2a9ffdb17","_from":".","_npmVersion":"2.1.17","_nodeVersion":"0.10.30","_npmUser":{"name":"scamden","email":"rusty.camden@gmail.com"},"maintainers":[{"name":"scamden","email":"rusty.camden@gmail.com"},{"name":"anthonyl","email":"anthony.liatsis@gmail.com"},{"name":"lerhaupt","email":"gary@relateiq.com"},{"name":"jontomas","email":"jon@relateiq.com"},{"name":"john.fox","email":"john.fox@relateiq.com"},{"name":"joechrz","email":"joechrz@gmail.com"},{"name":"keven425","email":"keven425@gmail.com"},{"name":"joemun","email":"joe.mun@relateiq.com"},{"name":"voxmatt","email":"mattm@relateiq.com"},{"name":"cdennison","email":"christy@relateiq.com"}],"dist":{"shasum":"d44d29f512c1585a5b59d84389365cb2a9ffdb17","tarball":"https://registry.npmjs.org/grid/-/grid-1.2.4.tgz","integrity":"sha512-n+BeJTXtQc7yBxmsFd9NrQUE1MgKH9FGkEWanhLmJTH9xf2grJ6LWPe7J7fgWv27ug5eGe99zV74AUMLyVbhSA==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCarPDJ6I2d5W+12rgdBRTpH6A+h86x6jb+DurcAv1mZQIgd9j3AckR4Vx3uQCl4Ddsk+Nh86LoHYc9tyG7t9wVq58="}]},"directories":{}},"1.2.5":{"name":"grid","version":"1.2.5","description":"A highly scalable grid component written in javscript","main":"src/modules/grid-entry.js","publishConfig":{"registry":"https://registry.npmjs.org/"},"engines":{"node":">=0.10.0"},"scripts":{},"dependencies":{"capitalize":"^0.5.0","element-class":"^0.1.1","key":"^0.1.11"},"devDependencies":{"aliasify":"^1.5.0","gulp":"^3.8.0","gulp-tasks-riq":"~0.2.3","jasmine-tools-riq":"~0.1.0","jquery":"^2.1.0","karma-chrome-launcher":"~0.1.4","karma-jasmine-jquery":"~0.1.1","polyfill-function-prototype-bind":"0.0.1","requestanimationframe":"0.0.22","yargs":"^1.2.2"},"peerDependencies":{"aliasify":"^1.5.0"},"browserify":{"transform":["aliasify"]},"browser":{"angular":"./bower_components/angular/angular.js","angular-route":"./bower_components/angular-route/angular-route.js"},"aliasify":{"aliases":{"@grid":"./src/modules"}},"repository":{"type":"git","url":"https://github.com/relateiq/grid.git"},"keywords":["grid","spreadsheet","virtual","scroll"],"author":{"name":"Sterling Camden"},"license":"MIT","bugs":{"url":"https://github.com/relateiq/grid/issues"},"homepage":"https://github.com/relateiq/grid","gitHead":"b90a555fdfc5b05667525455cb032e36566d26d7","_id":"grid@1.2.5","_shasum":"2be231bda1ef05c3aab3f2a5305ae5c8e24255a8","_from":".","_npmVersion":"2.1.17","_nodeVersion":"0.10.30","_npmUser":{"name":"scamden","email":"rusty.camden@gmail.com"},"maintainers":[{"name":"scamden","email":"rusty.camden@gmail.com"},{"name":"anthonyl","email":"anthony.liatsis@gmail.com"},{"name":"lerhaupt","email":"gary@relateiq.com"},{"name":"jontomas","email":"jon@relateiq.com"},{"name":"john.fox","email":"john.fox@relateiq.com"},{"name":"joechrz","email":"joechrz@gmail.com"},{"name":"keven425","email":"keven425@gmail.com"},{"name":"joemun","email":"joe.mun@relateiq.com"},{"name":"voxmatt","email":"mattm@relateiq.com"},{"name":"cdennison","email":"christy@relateiq.com"}],"dist":{"shasum":"2be231bda1ef05c3aab3f2a5305ae5c8e24255a8","tarball":"https://registry.npmjs.org/grid/-/grid-1.2.5.tgz","integrity":"sha512-GuQvM5aLWNBMaRPPBT2q4ZTC09sfMNcwjpSxjkAi+J7Q9lEzLwnvC+ZMaQNMIGMCDA0PplM85TNqSk+dHFS7Wg==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCHs9bB1i86SsT5rMjo95vlwsnMrsAtxWvTTcs5kbGpJgIhAM56ynZLsqCiHTmwahqpWLpDl+FbSX10zXWUNjX5aH+I"}]},"directories":{}},"1.3.0":{"name":"grid","version":"1.3.0","description":"A highly scalable grid component written in javscript","main":"src/modules/grid-entry.js","publishConfig":{"registry":"https://registry.npmjs.org/"},"engines":{"node":">=0.10.0"},"scripts":{},"dependencies":{"capitalize":"^0.5.0","element-class":"^0.1.1","key":"^0.1.11"},"devDependencies":{"aliasify":"^1.5.0","gulp":"^3.8.0","gulp-tasks-riq":"^0.1.0","jasmine-tools-riq":"~0.1.0","jquery":"^2.1.0","karma-jasmine-jquery":"~0.1.1","polyfill-function-prototype-bind":"0.0.1","yargs":"^1.2.2"},"peerDependencies":{"aliasify":"^1.5.0"},"browserify":{"transform":["aliasify"]},"browser":{"angular":"./bower_components/angular/angular.js","angular-route":"./bower_components/angular-route/angular-route.js"},"aliasify":{"aliases":{"@grid":"./src/modules"}},"repository":{"type":"git","url":"https://github.com/relateiq/grid.git"},"keywords":["grid","spreadsheet","virtual","scroll"],"author":{"name":"Sterling Camden"},"license":"MIT","bugs":{"url":"https://github.com/relateiq/grid/issues"},"homepage":"https://github.com/relateiq/grid","gitHead":"c660425eef61aacbab080f782d0496dab6df0bfa","_id":"grid@1.3.0","_shasum":"d99ff01729b6b979889f51772e320d81e3c031f2","_from":".","_npmVersion":"2.1.17","_nodeVersion":"0.10.30","_npmUser":{"name":"scamden","email":"rusty.camden@gmail.com"},"maintainers":[{"name":"scamden","email":"rusty.camden@gmail.com"},{"name":"anthonyl","email":"anthony.liatsis@gmail.com"},{"name":"lerhaupt","email":"gary@relateiq.com"},{"name":"jontomas","email":"jon@relateiq.com"},{"name":"john.fox","email":"john.fox@relateiq.com"},{"name":"joechrz","email":"joechrz@gmail.com"},{"name":"keven425","email":"keven425@gmail.com"},{"name":"joemun","email":"joe.mun@relateiq.com"},{"name":"voxmatt","email":"mattm@relateiq.com"},{"name":"cdennison","email":"christy@relateiq.com"}],"dist":{"shasum":"d99ff01729b6b979889f51772e320d81e3c031f2","tarball":"https://registry.npmjs.org/grid/-/grid-1.3.0.tgz","integrity":"sha512-K6PDM+MYMrTlKnX6eyNJS1kciQLSi5gemH8f+eMrR0ic5vMB1HM6eQQZsBi8bN2stizPnfDrkhp3dCIC8eOGJQ==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDs8QgyWbDwIJ2RTDOlyZJea6vXHzV5WqSr4f7sQvTlwQIhAJYsbeYAa2mK7ZXK2vM8qGym/6eTUHRwp35y/hy2Qgdp"}]},"directories":{}},"1.4.0":{"name":"grid","version":"1.4.0","description":"A highly scalable grid component written in javscript","main":"src/modules/grid-entry.js","publishConfig":{"registry":"https://registry.npmjs.org/"},"engines":{"node":">=0.10.0"},"scripts":{},"dependencies":{"capitalize":"^0.5.0","element-class":"^0.1.1","key":"^0.1.11"},"devDependencies":{"aliasify":"^1.5.0","gulp":"^3.8.0","gulp-tasks-riq":"^0.1.0","jasmine-tools-riq":"~0.1.0","jquery":"^2.1.0","karma-jasmine-jquery":"~0.1.1","polyfill-function-prototype-bind":"0.0.1","yargs":"^1.2.2"},"peerDependencies":{"aliasify":"^1.5.0"},"browserify":{"transform":["aliasify"]},"browser":{"angular":"./bower_components/angular/angular.js","angular-route":"./bower_components/angular-route/angular-route.js"},"aliasify":{"aliases":{"@grid":"./src/modules"}},"repository":{"type":"git","url":"https://github.com/relateiq/grid.git"},"keywords":["grid","spreadsheet","virtual","scroll"],"author":{"name":"Sterling Camden"},"license":"MIT","bugs":{"url":"https://github.com/relateiq/grid/issues"},"homepage":"https://github.com/relateiq/grid","gitHead":"1ba02618d6824aad9fffa83e9172e36fc7c72310","_id":"grid@1.4.0","_shasum":"95a8229114edde280d8cf22154d6105740c17b49","_from":".","_npmVersion":"2.1.17","_nodeVersion":"0.10.30","_npmUser":{"name":"scamden","email":"rusty.camden@gmail.com"},"maintainers":[{"name":"scamden","email":"rusty.camden@gmail.com"},{"name":"anthonyl","email":"anthony.liatsis@gmail.com"},{"name":"lerhaupt","email":"gary@relateiq.com"},{"name":"jontomas","email":"jon@relateiq.com"},{"name":"john.fox","email":"john.fox@relateiq.com"},{"name":"joechrz","email":"joechrz@gmail.com"},{"name":"keven425","email":"keven425@gmail.com"},{"name":"joemun","email":"joe.mun@relateiq.com"},{"name":"voxmatt","email":"mattm@relateiq.com"},{"name":"cdennison","email":"christy@relateiq.com"}],"dist":{"shasum":"95a8229114edde280d8cf22154d6105740c17b49","tarball":"https://registry.npmjs.org/grid/-/grid-1.4.0.tgz","integrity":"sha512-EeRmyQ0RZexycHS5XwXQ6Yk8zFOZ3YD6xsyxhVKC7OWcGMtTTEOzD/weQafu1SR1BHq0M6sxYF64SeFwKKX0BQ==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDMTkFUqNDVuJ5tQ2ikbEDzz6+Penb2uj3lu1p/CZQZZgIgTwnsvNpH6bZ5l808F1uvy5Sg28+FFkdCIXBD/nsBivI="}]},"directories":{}},"1.4.1":{"name":"grid","version":"1.4.1","description":"A highly scalable grid component written in javscript","main":"src/modules/grid-entry.js","publishConfig":{"registry":"https://registry.npmjs.org/"},"engines":{"node":">=0.10.0"},"iqproj":{"app":true},"scripts":{"test":"bin/iqb karma","start":"bin/iqb start","preversion":"bin/iqb karma"},"dependencies":{"angular":"~1.4.7","angular-mocks":"~1.4.7","angular-route":"~1.4.7","capitalize":"^0.5.0","element-class":"^0.1.1","key":"^0.1.11"},"devDependencies":{"aliasify":"^1.5.0","browserify":"~12.0.1","browserify-istanbul":"~0.2.1","chokidar-cli":"~1.1.1","connect-livereload":"~0.5.3","exorcist":"~0.4.0","express":"~4.13.3","jasmine":"~2.3.2","jasmine-tools-riq":"~0.1.0","jquery":"^2.1.0","karma":"~0.13.14","karma-browserify":"~4.4.0","karma-chrome-launcher":"~0.2.1","karma-jasmine":"~0.3.6","karma-jasmine-jquery":"~0.1.1","karma-phantomjs-launcher":"~0.2.1","node-sass":"~3.4.1","phantomjs":"~1.9.18","polyfill-function-prototype-bind":"0.0.1","tiny-lr":"~0.2.1","watchify":"~3.6.0","yargs":"^1.2.2"},"peerDependencies":{"aliasify":"^1.5.0"},"browserify":{"transform":["aliasify"]},"aliasify":{"aliases":{"@grid":"./src/modules"}},"repository":{"type":"git","url":"git+https://github.com/relateiq/grid.git"},"keywords":["grid","spreadsheet","virtual","scroll"],"author":{"name":"Sterling Camden"},"license":"MIT","bugs":{"url":"https://github.com/relateiq/grid/issues"},"homepage":"https://github.com/relateiq/grid","gitHead":"ce2debcf370f062e54c75c5b54dfa20020599b2a","_id":"grid@1.4.1","_shasum":"8d097953e19249047a51e2a024678dab428b58d6","_from":".","_npmVersion":"2.10.1","_nodeVersion":"0.12.4","_npmUser":{"name":"anthonyl","email":"anthony.liatsis@gmail.com"},"dist":{"shasum":"8d097953e19249047a51e2a024678dab428b58d6","tarball":"https://registry.npmjs.org/grid/-/grid-1.4.1.tgz","integrity":"sha512-n0aAyxdlddsgqSYP8lVrm+A/9scA0drpKXiNGQam85GnhG/ybgmCnBU2mQ1eNbeNNdFfP2vU9TZxJSyanOa1mA==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDSlskddiu5sS0R1dhQS055TqSGzLuPwKfCr0hS7XLxogIgWX/6Y/c/C+aUBOsLvCnTE2mWa7noAJF21lMhwBNjiak="}]},"maintainers":[{"name":"scamden","email":"rusty.camden@gmail.com"},{"name":"anthonyl","email":"anthony.liatsis@gmail.com"},{"name":"lerhaupt","email":"gary@relateiq.com"},{"name":"jontomas","email":"jon@relateiq.com"},{"name":"john.fox","email":"john.fox@relateiq.com"},{"name":"joechrz","email":"joechrz@gmail.com"},{"name":"keven425","email":"keven425@gmail.com"},{"name":"joemun","email":"joe.mun@relateiq.com"},{"name":"voxmatt","email":"mattm@relateiq.com"},{"name":"cdennison","email":"christy@relateiq.com"}],"directories":{}},"1.4.2":{"name":"grid","version":"1.4.2","description":"A highly scalable grid component written in javscript","main":"src/modules/grid-entry.js","publishConfig":{"registry":"https://registry.npmjs.org/"},"engines":{"node":">=0.10.0"},"iqproj":{"app":true},"scripts":{"test":"bin/iqb karma","start":"bin/iqb start","preversion":"bin/iqb karma"},"dependencies":{"angular":"~1.4.7","angular-mocks":"~1.4.7","angular-route":"~1.4.7","capitalize":"^0.5.0","element-class":"^0.1.1","key":"^0.1.11"},"devDependencies":{"aliasify":"^1.5.0","browserify":"~12.0.1","browserify-istanbul":"~0.2.1","chokidar-cli":"~1.1.1","connect-livereload":"~0.5.3","exorcist":"~0.4.0","express":"~4.13.3","jasmine":"~2.3.2","jasmine-tools-riq":"~0.1.0","jquery":"^2.1.0","karma":"~0.13.14","karma-browserify":"~4.4.0","karma-chrome-launcher":"~0.2.1","karma-jasmine":"~0.3.6","karma-jasmine-jquery":"~0.1.1","karma-phantomjs-launcher":"~0.2.1","node-sass":"~3.4.1","phantomjs":"~1.9.18","polyfill-function-prototype-bind":"0.0.1","tiny-lr":"~0.2.1","watchify":"~3.6.0","yargs":"^1.2.2"},"peerDependencies":{"aliasify":"^1.5.0"},"browserify":{"transform":["aliasify"]},"aliasify":{"aliases":{"@grid":"./src/modules"}},"repository":{"type":"git","url":"https://github.com/relateiq/grid.git"},"keywords":["grid","spreadsheet","virtual","scroll"],"author":{"name":"Sterling Camden"},"license":"MIT","bugs":{"url":"https://github.com/relateiq/grid/issues"},"homepage":"https://github.com/relateiq/grid","gitHead":"4b1506e1d5ffbe16061bb14731312b4f8a19af00","_id":"grid@1.4.2","_shasum":"3b3d0e3c7a00468e8185356f3c80a0be79fee5e9","_from":".","_npmVersion":"2.1.17","_nodeVersion":"0.10.30","_npmUser":{"name":"scamden","email":"rusty.camden@gmail.com"},"maintainers":[{"name":"scamden","email":"rusty.camden@gmail.com"},{"name":"anthonyl","email":"anthony.liatsis@gmail.com"},{"name":"lerhaupt","email":"gary@relateiq.com"},{"name":"jontomas","email":"jon@relateiq.com"},{"name":"john.fox","email":"john.fox@relateiq.com"},{"name":"joechrz","email":"joechrz@gmail.com"},{"name":"keven425","email":"keven425@gmail.com"},{"name":"joemun","email":"joe.mun@relateiq.com"},{"name":"voxmatt","email":"mattm@relateiq.com"},{"name":"cdennison","email":"christy@relateiq.com"}],"dist":{"shasum":"3b3d0e3c7a00468e8185356f3c80a0be79fee5e9","tarball":"https://registry.npmjs.org/grid/-/grid-1.4.2.tgz","integrity":"sha512-sBySryXDQCGvm3jk5kxdn3BcnHaYLV3ZdwNfnY6Z+fFUmTzL6N3KFm2iO8uiVhSoqvW8DLPIlZwshdZMQncrrA==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIFJF8bFpbUftj6cj0Z4rkGpuQ+EViQ5MrSXDvQvoMeO6AiEA58C2Fd6xm7JShZghn861QFqXtEdKg4X4IVu7tB1ZxLw="}]},"_npmOperationalInternal":{"host":"packages-6-west.internal.npmjs.com","tmp":"tmp/grid-1.4.2.tgz_1455138938699_0.06015116674825549"},"directories":{}},"1.5.0":{"name":"grid","version":"1.5.0","description":"A highly scalable grid component written in javscript","main":"src/modules/grid-entry.js","publishConfig":{"registry":"https://registry.npmjs.org/"},"engines":{"node":">=0.10.0"},"iqproj":{"app":true},"scripts":{"test":"bin/iqb karma","start":"bin/iqb start","preversion":"bin/iqb karma"},"dependencies":{"angular":"~1.4.7","angular-mocks":"~1.4.7","angular-route":"~1.4.7","capitalize":"^0.5.0","element-class":"^0.1.1","inner-text-shim":"~1.0.1","key":"^0.1.11"},"devDependencies":{"aliasify":"^1.5.0","browserify":"~12.0.1","browserify-istanbul":"~0.2.1","chokidar-cli":"~1.1.1","connect-livereload":"~0.5.3","exorcist":"~0.4.0","express":"~4.13.3","jasmine":"~2.3.2","jasmine-tools-riq":"~0.1.0","jquery":"^2.1.0","karma":"~0.13.14","karma-browserify":"~4.4.0","karma-chrome-launcher":"~0.2.1","karma-jasmine":"~0.3.6","karma-jasmine-jquery":"~0.1.1","karma-phantomjs-launcher":"~0.2.1","node-sass":"~3.4.1","phantomjs":"~1.9.18","polyfill-function-prototype-bind":"0.0.1","tiny-lr":"~0.2.1","watchify":"~3.6.0","yargs":"^1.2.2"},"peerDependencies":{"aliasify":"^1.5.0"},"browserify":{"transform":["aliasify"]},"aliasify":{"aliases":{"@grid":"./src/modules"}},"browserify-shim":{},"repository":{"type":"git","url":"https://github.com/relateiq/grid.git"},"keywords":["grid","spreadsheet","virtual","scroll"],"author":{"name":"Sterling Camden"},"license":"MIT","bugs":{"url":"https://github.com/relateiq/grid/issues"},"homepage":"https://github.com/relateiq/grid","gitHead":"22b2b03e38af1b6b896246d524262707993e25d3","_id":"grid@1.5.0","_shasum":"9a8dc7af58c8f2a383f1b082645ce5163b8923e6","_from":".","_npmVersion":"2.1.17","_nodeVersion":"0.10.30","_npmUser":{"name":"scamden","email":"rusty.camden@gmail.com"},"maintainers":[{"name":"scamden","email":"rusty.camden@gmail.com"},{"name":"anthonyl","email":"anthony.liatsis@gmail.com"},{"name":"lerhaupt","email":"gary@relateiq.com"},{"name":"jontomas","email":"jon@relateiq.com"},{"name":"john.fox","email":"john.fox@relateiq.com"},{"name":"joechrz","email":"joechrz@gmail.com"},{"name":"keven425","email":"keven425@gmail.com"},{"name":"joemun","email":"joe.mun@relateiq.com"},{"name":"voxmatt","email":"mattm@relateiq.com"},{"name":"cdennison","email":"christy@relateiq.com"}],"dist":{"shasum":"9a8dc7af58c8f2a383f1b082645ce5163b8923e6","tarball":"https://registry.npmjs.org/grid/-/grid-1.5.0.tgz","integrity":"sha512-+BU7CZ3/bb9lkbiiE3haYRiQAcL1AXg4CZWR8gbhiyrX/3VTV2b5GGjAQ9k1vxq2uCnrjcHFeiDxZaCvNlaPVw==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDh2b8xGvqMHoL7R9vhLTF/BV82CjgWaZ3SQZ0UDouJCQIgaWJ68xUhXQAVcoL6s+QXosxlaNV8zRUIoINd32tzy90="}]},"_npmOperationalInternal":{"host":"packages-6-west.internal.npmjs.com","tmp":"tmp/grid-1.5.0.tgz_1455668721848_0.3902859683148563"},"directories":{}},"1.5.1":{"name":"grid","version":"1.5.1","description":"A highly scalable grid component written in javscript","main":"src/modules/grid-entry.js","publishConfig":{"registry":"https://registry.npmjs.org/"},"engines":{"node":">=0.10.0"},"iqproj":{"app":true},"scripts":{"test":"bin/iqb karma","start":"bin/iqb start","preversion":"bin/iqb karma"},"dependencies":{"angular":"~1.4.7","angular-mocks":"~1.4.7","angular-route":"~1.4.7","capitalize":"^0.5.0","element-class":"^0.1.1","inner-text-shim":"~1.0.1","key":"^0.1.11"},"devDependencies":{"aliasify":"^1.5.0","browserify":"~12.0.1","browserify-istanbul":"~0.2.1","chokidar-cli":"~1.1.1","connect-livereload":"~0.5.3","exorcist":"~0.4.0","express":"~4.13.3","jasmine":"~2.3.2","jasmine-tools-riq":"~0.1.0","jquery":"^2.1.0","karma":"~0.13.14","karma-browserify":"~4.4.0","karma-chrome-launcher":"~0.2.1","karma-jasmine":"~0.3.6","karma-jasmine-jquery":"~0.1.1","karma-phantomjs-launcher":"~0.2.1","node-sass":"~3.4.1","phantomjs":"~1.9.18","polyfill-function-prototype-bind":"0.0.1","tiny-lr":"~0.2.1","watchify":"~3.6.0","yargs":"^1.2.2"},"peerDependencies":{"aliasify":"^1.5.0"},"browserify":{"transform":["aliasify"]},"aliasify":{"aliases":{"@grid":"./src/modules"}},"browserify-shim":{},"repository":{"type":"git","url":"https://github.com/relateiq/grid.git"},"keywords":["grid","spreadsheet","virtual","scroll"],"author":{"name":"Sterling Camden"},"license":"MIT","bugs":{"url":"https://github.com/relateiq/grid/issues"},"homepage":"https://github.com/relateiq/grid","gitHead":"1e528cae207d473119e0d4225501ea88ea3dd25b","_id":"grid@1.5.1","_shasum":"774dbd1c3408ea69ed81f58fe26df82bd38c715d","_from":".","_npmVersion":"2.1.17","_nodeVersion":"0.10.30","_npmUser":{"name":"scamden","email":"rusty.camden@gmail.com"},"maintainers":[{"name":"scamden","email":"rusty.camden@gmail.com"},{"name":"anthonyl","email":"anthony.liatsis@gmail.com"},{"name":"lerhaupt","email":"gary@relateiq.com"},{"name":"jontomas","email":"jon@relateiq.com"},{"name":"john.fox","email":"john.fox@relateiq.com"},{"name":"joechrz","email":"joechrz@gmail.com"},{"name":"keven425","email":"keven425@gmail.com"},{"name":"joemun","email":"joe.mun@relateiq.com"},{"name":"voxmatt","email":"mattm@relateiq.com"},{"name":"cdennison","email":"christy@relateiq.com"}],"dist":{"shasum":"774dbd1c3408ea69ed81f58fe26df82bd38c715d","tarball":"https://registry.npmjs.org/grid/-/grid-1.5.1.tgz","integrity":"sha512-s6iHvJJxG2vk4jhDB4y3bYaTlcNh8Vds+TtJywsN/C63V10OYvkQkaG3gpIraKPFnyPbqLqFWBDZgXuUTEmnxA==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCICYgsoLbsVPswiOQampyDAEH0ykxuY2TkUhfD4gwS3RyAiEAlIN7K8HgKwktfi3W7hP+b+CVbnGLqHmO6V3IMnCq3kQ="}]},"_npmOperationalInternal":{"host":"packages-6-west.internal.npmjs.com","tmp":"tmp/grid-1.5.1.tgz_1455909749989_0.1710960112977773"},"directories":{}},"1.6.0":{"name":"grid","version":"1.6.0","description":"A highly scalable grid component written in javscript","main":"src/modules/grid-entry.js","publishConfig":{"registry":"https://registry.npmjs.org/"},"engines":{"node":">=0.10.0"},"iqproj":{"app":true},"scripts":{"test":"bin/iqb karma","start":"bin/iqb start","preversion":"bin/iqb karma"},"dependencies":{"angular":"~1.4.7","angular-mocks":"~1.4.7","angular-route":"~1.4.7","capitalize":"^0.5.0","element-class":"^0.1.1","inner-text-shim":"~1.0.1","key":"^0.1.11"},"devDependencies":{"aliasify":"^1.5.0","browserify":"~12.0.1","browserify-istanbul":"~0.2.1","chokidar-cli":"~1.1.1","connect-livereload":"~0.5.3","exorcist":"~0.4.0","express":"~4.13.3","jasmine":"~2.3.2","jasmine-tools-riq":"~0.1.0","jquery":"^2.1.0","karma":"~0.13.14","karma-browserify":"~4.4.0","karma-chrome-launcher":"~0.2.1","karma-jasmine":"~0.3.6","karma-jasmine-jquery":"~0.1.1","karma-phantomjs-launcher":"~0.2.1","node-sass":"~3.4.1","phantomjs":"~1.9.18","polyfill-function-prototype-bind":"0.0.1","tiny-lr":"~0.2.1","watchify":"~3.6.0","yargs":"^1.2.2"},"peerDependencies":{"aliasify":"^1.5.0"},"browserify":{"transform":["aliasify"]},"aliasify":{"aliases":{"@grid":"./src/modules"}},"browserify-shim":{},"repository":{"type":"git","url":"https://github.com/relateiq/grid.git"},"keywords":["grid","spreadsheet","virtual","scroll"],"author":{"name":"Sterling Camden"},"license":"MIT","bugs":{"url":"https://github.com/relateiq/grid/issues"},"homepage":"https://github.com/relateiq/grid","gitHead":"3d429136377b642068b39ef02103649ea301bb1f","_id":"grid@1.6.0","_shasum":"729ed9bf2e8182a35d449ef0715263e02c632dbf","_from":".","_npmVersion":"2.1.17","_nodeVersion":"0.10.30","_npmUser":{"name":"scamden","email":"rusty.camden@gmail.com"},"maintainers":[{"name":"scamden","email":"rusty.camden@gmail.com"},{"name":"anthonyl","email":"anthony.liatsis@gmail.com"},{"name":"lerhaupt","email":"gary@relateiq.com"},{"name":"jontomas","email":"jon@relateiq.com"},{"name":"john.fox","email":"john.fox@relateiq.com"},{"name":"joechrz","email":"joechrz@gmail.com"},{"name":"keven425","email":"keven425@gmail.com"},{"name":"joemun","email":"joe.mun@relateiq.com"},{"name":"voxmatt","email":"mattm@relateiq.com"},{"name":"cdennison","email":"christy@relateiq.com"}],"dist":{"shasum":"729ed9bf2e8182a35d449ef0715263e02c632dbf","tarball":"https://registry.npmjs.org/grid/-/grid-1.6.0.tgz","integrity":"sha512-t5XVnPmTq8aCum3+EahobmK7Hnd/988cxp32IdcMRINYhJ50w+HOs+Ihdyy2IhZICCAeEPEpfzI2Ur/U9dEQwQ==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIDPb6P/N/4SnF8Xe/ozDOS+muNiCXlSTeo3gG3S17feBAiEA8NmqLiKSrYPEkr0weqhQ0PNDLBQFk7lC1SH41sTg8Jo="}]},"_npmOperationalInternal":{"host":"packages-9-west.internal.npmjs.com","tmp":"tmp/grid-1.6.0.tgz_1456256508352_0.5742796300910413"},"directories":{}},"1.8.0":{"name":"grid","version":"1.8.0","description":"A highly scalable grid component written in javscript","main":"src/modules/grid-entry.js","publishConfig":{"registry":"https://registry.npmjs.org/"},"engines":{"node":">=0.10.0"},"iqproj":{"app":true},"scripts":{"test":"bin/iqb test","start":"bin/iqb start","preversion":"bin/iqb test"},"dependencies":{"angular":"~1.4.7","angular-mocks":"~1.4.7","angular-route":"~1.4.7","capitalize":"^0.5.0","element-class":"^0.1.1","inner-text-shim":"~1.0.1","key":"^0.1.11"},"devDependencies":{"aliasify":"^1.5.0","browserify":"~12.0.1","browserify-istanbul":"~0.2.1","chokidar-cli":"~1.1.1","connect-livereload":"~0.5.3","exorcist":"~0.4.0","express":"~4.13.3","jasmine":"~2.3.2","jasmine-tools-riq":"~0.1.0","jquery":"^2.1.0","karma":"~0.13.14","karma-browserify":"~4.4.0","karma-chrome-launcher":"~0.2.1","karma-jasmine":"~0.3.6","karma-jasmine-jquery":"~0.1.1","karma-phantomjs-launcher":"~0.2.1","node-sass":"~3.4.1","phantomjs":"~1.9.18","polyfill-function-prototype-bind":"0.0.1","tiny-lr":"~0.2.1","watchify":"~3.6.0","yargs":"^1.2.2"},"peerDependencies":{"aliasify":"^1.5.0"},"browserify":{"transform":["aliasify"]},"aliasify":{"aliases":{"@grid":"./src/modules"}},"browserify-shim":{},"repository":{"type":"git","url":"git+https://github.com/relateiq/grid.git"},"keywords":["grid","spreadsheet","virtual","scroll"],"author":{"name":"Sterling Camden"},"license":"MIT","bugs":{"url":"https://github.com/relateiq/grid/issues"},"homepage":"https://github.com/relateiq/grid","gitHead":"00eed4b002fbb6f97cd39d212d9e6842fcc058b6","_id":"grid@1.8.0","_shasum":"5eedda2bc28e48c6dae626f9d4ec2f3add538e1e","_from":".","_npmVersion":"2.14.4","_nodeVersion":"0.12.7","_npmUser":{"name":"voxmatt","email":"public@matthewmartin.com"},"dist":{"shasum":"5eedda2bc28e48c6dae626f9d4ec2f3add538e1e","tarball":"https://registry.npmjs.org/grid/-/grid-1.8.0.tgz","integrity":"sha512-IF00Z1SpxeYhQvUr45wuCpTG05AiFW4E4fuePE6wD/qkRFho7d12RnUNeqyV+O5GL+NCG413NjlBXAG7JVM0tg==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCSlgHLuKtoT1efNkbcf1mY25N0/Nm0etplsCBX8CUJuAIgNpvfUKsk5LlbvgEcOPjB7Nt6AuM7attTWu5mk0C9wJ4="}]},"maintainers":[{"name":"scamden","email":"rusty.camden@gmail.com"},{"name":"anthonyl","email":"anthony.liatsis@gmail.com"},{"name":"lerhaupt","email":"gary@relateiq.com"},{"name":"jontomas","email":"jon@relateiq.com"},{"name":"john.fox","email":"john.fox@relateiq.com"},{"name":"joechrz","email":"joechrz@gmail.com"},{"name":"keven425","email":"keven425@gmail.com"},{"name":"joemun","email":"joe.mun@relateiq.com"},{"name":"voxmatt","email":"mattm@relateiq.com"},{"name":"cdennison","email":"christy@relateiq.com"}],"_npmOperationalInternal":{"host":"packages-6-west.internal.npmjs.com","tmp":"tmp/grid-1.8.0.tgz_1456353545676_0.6414246540516615"},"directories":{}},"1.9.0":{"name":"grid","version":"1.9.0","description":"A highly scalable grid component written in javscript","main":"src/modules/grid-entry.js","publishConfig":{"registry":"https://registry.npmjs.org/"},"engines":{"node":">=0.10.0"},"iqproj":{"app":true},"scripts":{"test":"bin/iqb karma","start":"bin/iqb start","preversion":"bin/iqb karma"},"dependencies":{"angular":"~1.4.7","angular-mocks":"~1.4.7","angular-route":"~1.4.7","capitalize":"^0.5.0","element-class":"^0.1.1","inner-text-shim":"~1.0.1","key":"^0.1.11"},"devDependencies":{"aliasify":"^1.5.0","browserify":"~12.0.1","browserify-istanbul":"~0.2.1","chokidar-cli":"~1.1.1","connect-livereload":"~0.5.3","exorcist":"~0.4.0","express":"~4.13.3","jasmine":"~2.3.2","jasmine-tools-riq":"~0.1.0","jquery":"^2.1.0","karma":"~0.13.14","karma-browserify":"~4.4.0","karma-chrome-launcher":"~0.2.1","karma-jasmine":"~0.3.6","karma-jasmine-jquery":"~0.1.1","karma-phantomjs-launcher":"~0.2.1","node-sass":"~3.4.1","phantomjs":"~1.9.18","polyfill-function-prototype-bind":"0.0.1","tiny-lr":"~0.2.1","watchify":"~3.6.0","yargs":"^1.2.2"},"peerDependencies":{"aliasify":"^1.5.0"},"browserify":{"transform":["aliasify"]},"aliasify":{"aliases":{"@grid":"./src/modules"}},"browserify-shim":{},"repository":{"type":"git","url":"https://github.com/relateiq/grid.git"},"keywords":["grid","spreadsheet","virtual","scroll"],"author":{"name":"Sterling Camden"},"license":"MIT","bugs":{"url":"https://github.com/relateiq/grid/issues"},"homepage":"https://github.com/relateiq/grid","gitHead":"ad385114ad5eae05c7ac46675232800095e3e1fc","_id":"grid@1.9.0","_shasum":"aefb45f152117636e7ecc5cb040632f058eaf343","_from":".","_npmVersion":"2.1.17","_nodeVersion":"0.10.30","_npmUser":{"name":"scamden","email":"rusty.camden@gmail.com"},"maintainers":[{"name":"scamden","email":"rusty.camden@gmail.com"},{"name":"anthonyl","email":"anthony.liatsis@gmail.com"},{"name":"lerhaupt","email":"gary@relateiq.com"},{"name":"jontomas","email":"jon@relateiq.com"},{"name":"john.fox","email":"john.fox@relateiq.com"},{"name":"joechrz","email":"joechrz@gmail.com"},{"name":"keven425","email":"keven425@gmail.com"},{"name":"joemun","email":"joe.mun@relateiq.com"},{"name":"voxmatt","email":"mattm@relateiq.com"},{"name":"cdennison","email":"christy@relateiq.com"}],"dist":{"shasum":"aefb45f152117636e7ecc5cb040632f058eaf343","tarball":"https://registry.npmjs.org/grid/-/grid-1.9.0.tgz","integrity":"sha512-G6kJJ47et34xFVTa23VImTeRHnPI9UiMsim1LLCKFfP1x7xOmTiHx9up+F95cWmnNytWqxJvF5xvxQJ1qw6FrA==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQD0MwGzMHt07FGEu4qGu5m9gaOhy5SvuPLfbivDznoLbwIhAP6ipBvFSRL0zJL5q175NkfW48bIWMe2qFD7q3e4iQK+"}]},"_npmOperationalInternal":{"host":"packages-13-west.internal.npmjs.com","tmp":"tmp/grid-1.9.0.tgz_1457399710186_0.10187089489772916"},"directories":{}},"1.10.0":{"name":"grid","version":"1.10.0","description":"A highly scalable grid component written in javscript","main":"src/modules/grid-entry.js","publishConfig":{"registry":"https://registry.npmjs.org/"},"engines":{"node":">=0.10.0"},"iqproj":{"app":true},"scripts":{"test":"bin/iqb karma","start":"bin/iqb start","preversion":"bin/iqb karma"},"dependencies":{"angular":"~1.4.7","angular-mocks":"~1.4.7","angular-route":"~1.4.7","capitalize":"^0.5.0","element-class":"^0.1.1","inner-text-shim":"~1.0.1","key":"^0.1.11"},"devDependencies":{"aliasify":"^1.5.0","browserify":"~12.0.1","browserify-istanbul":"~0.2.1","chokidar-cli":"~1.1.1","connect-livereload":"~0.5.3","exorcist":"~0.4.0","express":"~4.13.3","jasmine":"~2.3.2","jasmine-tools-riq":"~0.1.0","jquery":"^2.1.0","karma":"~0.13.14","karma-browserify":"~4.4.0","karma-chrome-launcher":"~0.2.1","karma-jasmine":"~0.3.6","karma-jasmine-jquery":"~0.1.1","karma-phantomjs-launcher":"~0.2.1","node-sass":"~3.4.1","phantomjs":"~1.9.18","polyfill-function-prototype-bind":"0.0.1","tiny-lr":"~0.2.1","watchify":"~3.6.0","yargs":"^1.2.2"},"peerDependencies":{"aliasify":"^1.5.0"},"browserify":{"transform":["aliasify"]},"aliasify":{"aliases":{"@grid":"./src/modules"}},"browserify-shim":{},"repository":{"type":"git","url":"https://github.com/relateiq/grid.git"},"keywords":["grid","spreadsheet","virtual","scroll"],"author":{"name":"Sterling Camden"},"license":"MIT","bugs":{"url":"https://github.com/relateiq/grid/issues"},"homepage":"https://github.com/relateiq/grid","gitHead":"27e13a7eebf608284bc784bb81e222b64bb66324","_id":"grid@1.10.0","_shasum":"7d010844aaac94ee58bba6fdb734b5d6502949ba","_from":".","_npmVersion":"2.1.17","_nodeVersion":"0.12.7","_npmUser":{"name":"benshope","email":"ben@benshope.com"},"dist":{"shasum":"7d010844aaac94ee58bba6fdb734b5d6502949ba","tarball":"https://registry.npmjs.org/grid/-/grid-1.10.0.tgz","integrity":"sha512-nyjRF5hHYV1OCcrvrnXoIbihlbjJ6BKHuD8UoMpJHvwzisI9X2v9Yslp40yo+Bo2lYWTfRlSe4zuNkwIIc1RTA==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDixMn4pLAbHfYIrFITYxbItZgk6fYjwj7zPsevTw9BAwIhANehBng13hdvoR/Bqqf0K7+QkeXv71CmUAxkdWDDPc1M"}]},"maintainers":[{"name":"anthonyl","email":"anthony.liatsis@gmail.com"},{"name":"benshope","email":"ben@benshope.com"},{"name":"cdennison","email":"christy@relateiq.com"},{"name":"joechrz","email":"joechrz@gmail.com"},{"name":"joemun","email":"joe.mun@relateiq.com"},{"name":"john.fox","email":"john.fox@relateiq.com"},{"name":"jontomas","email":"jon@relateiq.com"},{"name":"keven425","email":"keven425@gmail.com"},{"name":"lerhaupt","email":"gary@relateiq.com"},{"name":"scamden","email":"rusty.camden@gmail.com"},{"name":"voxmatt","email":"public@matthewmartin.com"}],"_npmOperationalInternal":{"host":"packages-12-west.internal.npmjs.com","tmp":"tmp/grid-1.10.0.tgz_1458945621624_0.9012852779123932"},"directories":{}},"2.0.0":{"name":"grid","version":"2.0.0","description":"A highly scalable grid component written in javscript","main":"src/modules/grid-entry.js","publishConfig":{"registry":"https://registry.npmjs.org/"},"engines":{"node":">=0.10.0"},"iqproj":{"app":true},"scripts":{"test":"bin/iqb karma","start":"bin/iqb start","preversion":"bin/iqb karma"},"dependencies":{"angular":"~1.4.7","angular-mocks":"~1.4.7","angular-route":"~1.4.7","capitalize":"^0.5.0","click-off":"~0.2.1","element-class":"^0.1.1","escape-stack":"~0.1.2","inner-text-shim":"~1.0.1","key":"^0.1.11"},"devDependencies":{"aliasify":"^1.5.0","browserify":"~12.0.1","browserify-istanbul":"~0.2.1","chokidar-cli":"~1.1.1","connect-livereload":"~0.5.3","es6-promise":"~3.1.2","exorcist":"~0.4.0","express":"~4.13.3","jasmine":"~2.3.2","jasmine-tools-riq":"~0.3.0","jquery":"^2.1.0","karma":"~0.13.14","karma-browserify":"~4.4.0","karma-chrome-launcher":"~0.2.1","karma-jasmine":"~0.3.6","karma-jasmine-jquery":"~0.1.1","karma-phantomjs-launcher":"~0.2.1","lodash":"~4.11.0","node-sass":"~3.4.1","phantomjs":"~1.9.18","polyfill-function-prototype-bind":"0.0.1","tiny-lr":"~0.2.1","watchify":"~3.6.0","yargs":"^1.2.2"},"peerDependencies":{"aliasify":"^1.5.0"},"browserify":{"transform":["aliasify"]},"aliasify":{"aliases":{"@grid":"./src/modules"}},"browserify-shim":{},"repository":{"type":"git","url":"https://github.com/relateiq/grid.git"},"keywords":["grid","spreadsheet","virtual","scroll"],"author":{"name":"Sterling Camden"},"license":"MIT","bugs":{"url":"https://github.com/relateiq/grid/issues"},"homepage":"https://github.com/relateiq/grid","gitHead":"85fcd65d6f2c7cba0d7bf46a1bc6593a2a2179a6","_id":"grid@2.0.0","_shasum":"cdfe31d0ed14fd225da20477a50d40943f98e619","_from":".","_npmVersion":"2.1.17","_nodeVersion":"0.10.30","_npmUser":{"name":"scamden","email":"rusty.camden@gmail.com"},"maintainers":[{"name":"anthonyl","email":"anthony.liatsis@gmail.com"},{"name":"benshope","email":"ben@benshope.com"},{"name":"cdennison","email":"christy@relateiq.com"},{"name":"joechrz","email":"joechrz@gmail.com"},{"name":"joemun","email":"joe.mun@relateiq.com"},{"name":"john.fox","email":"john.fox@relateiq.com"},{"name":"jontomas","email":"jon@relateiq.com"},{"name":"keven425","email":"keven425@gmail.com"},{"name":"lerhaupt","email":"gary@relateiq.com"},{"name":"scamden","email":"rusty.camden@gmail.com"},{"name":"voxmatt","email":"public@matthewmartin.com"}],"dist":{"shasum":"cdfe31d0ed14fd225da20477a50d40943f98e619","tarball":"https://registry.npmjs.org/grid/-/grid-2.0.0.tgz","integrity":"sha512-JFtnYoT6chGUx6Nknw3G1srAGCBfWNZMKdMN7xgRtnqMYsVA0GmFXjoeZPli4ed7ZVJOLIjYsw7ezkTZY8izaA==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCkgq77NqJdtEupG9BteFa9ocspPCrwdcLatsfDSbJAbgIgTseE4AqV52cXhRxx7FHuaSFIFmM6GbTzBFLTO1BXvpg="}]},"_npmOperationalInternal":{"host":"packages-16-east.internal.npmjs.com","tmp":"tmp/grid-2.0.0.tgz_1460591280580_0.05102238664403558"},"directories":{}},"3.0.0":{"name":"grid","version":"3.0.0","description":"A highly scalable grid component written in javscript","main":"src/modules/grid-entry.js","publishConfig":{"registry":"https://registry.npmjs.org/"},"engines":{"node":">=0.10.0"},"iqproj":{"app":true},"scripts":{"test":"bin/iqb karma","start":"bin/iqb start","preversion":"bin/iqb karma"},"dependencies":{"angular":"~1.4.7","angular-mocks":"~1.4.7","angular-route":"~1.4.7","capitalize":"^0.5.0","click-off":"~0.2.1","element-class":"^0.1.1","escape-stack":"~0.1.2","inner-text-shim":"~1.0.1","key":"^0.1.11","time-now":"~0.2.1"},"devDependencies":{"aliasify":"^1.5.0","browserify":"~12.0.1","browserify-istanbul":"~0.2.1","chokidar-cli":"~1.1.1","connect-livereload":"~0.5.3","es6-promise":"~3.1.2","exorcist":"~0.4.0","express":"~4.13.3","jasmine":"~2.3.2","jasmine-tools-riq":"~0.3.0","jquery":"^2.1.0","karma":"~0.13.14","karma-browserify":"~4.4.0","karma-chrome-launcher":"~0.2.1","karma-jasmine":"~0.3.6","karma-jasmine-jquery":"~0.1.1","karma-phantomjs-launcher":"~0.2.1","lodash":"~4.11.0","node-sass":"~3.4.1","phantomjs":"~1.9.18","polyfill-function-prototype-bind":"0.0.1","tiny-lr":"~0.2.1","watchify":"~3.6.0","yargs":"^1.2.2"},"peerDependencies":{"aliasify":"^1.5.0"},"browserify":{"transform":["aliasify"]},"aliasify":{"aliases":{"@grid":"./src/modules"}},"browserify-shim":{},"repository":{"type":"git","url":"https://github.com/relateiq/grid.git"},"keywords":["grid","spreadsheet","virtual","scroll"],"author":{"name":"Sterling Camden"},"license":"MIT","bugs":{"url":"https://github.com/relateiq/grid/issues"},"homepage":"https://github.com/relateiq/grid","gitHead":"64b4018300ba9ab7fffba3c0b53ca9044ed1fe53","_id":"grid@3.0.0","_shasum":"f119e8486a0c0f6ade90479f85b616d51d143678","_from":".","_npmVersion":"2.1.17","_nodeVersion":"0.10.30","_npmUser":{"name":"scamden","email":"rusty.camden@gmail.com"},"maintainers":[{"name":"anthonyl","email":"anthony.liatsis@gmail.com"},{"name":"benshope","email":"ben@benshope.com"},{"name":"cdennison","email":"christy@relateiq.com"},{"name":"joechrz","email":"joechrz@gmail.com"},{"name":"joemun","email":"joe.mun@relateiq.com"},{"name":"john.fox","email":"john.fox@relateiq.com"},{"name":"jontomas","email":"jon@relateiq.com"},{"name":"keven425","email":"keven425@gmail.com"},{"name":"lerhaupt","email":"gary@relateiq.com"},{"name":"scamden","email":"rusty.camden@gmail.com"},{"name":"voxmatt","email":"public@matthewmartin.com"}],"dist":{"shasum":"f119e8486a0c0f6ade90479f85b616d51d143678","tarball":"https://registry.npmjs.org/grid/-/grid-3.0.0.tgz","integrity":"sha512-6jg5c8L+KMd1xzrq240iy3ynH2NI40LReLeVWoQ9YT5KIbLsYiBSErR/I/jgrUHE3LyVci3uaM2lsxXSTvVlcQ==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIFh1/zEzjHrmdUCuIwj9VzKupviFyLEwTn7oG7kM5nNBAiEAq0rnu8P9ku6xtZmpajGh49Lw2OKdfIbkFdDcVW3rlQ4="}]},"_npmOperationalInternal":{"host":"packages-12-west.internal.npmjs.com","tmp":"tmp/grid-3.0.0.tgz_1461632384176_0.20923614548519254"},"directories":{}},"3.0.1":{"name":"grid","version":"3.0.1","description":"A highly scalable grid component written in javscript","main":"src/modules/grid-entry.js","publishConfig":{"registry":"https://registry.npmjs.org/"},"engines":{"node":">=0.10.0"},"iqproj":{"app":true},"scripts":{"test":"bin/iqb test","start":"bin/iqb start","preversion":"bin/iqb test"},"dependencies":{"angular":"~1.4.7","angular-mocks":"~1.4.7","angular-route":"~1.4.7","capitalize":"^0.5.0","click-off":"~0.2.1","element-class":"^0.1.1","escape-stack":"~0.1.2","inner-text-shim":"~1.0.1","key":"^0.1.11","time-now":"~0.2.1"},"devDependencies":{"aliasify":"^1.5.0","browserify":"~12.0.1","browserify-istanbul":"~0.2.1","chokidar-cli":"~1.1.1","connect-livereload":"~0.5.3","es6-promise":"~3.1.2","exorcist":"~0.4.0","express":"~4.13.3","jasmine":"~2.3.2","jasmine-tools-riq":"~0.3.0","jquery":"^2.1.0","karma":"~0.13.14","karma-browserify":"~4.4.0","karma-chrome-launcher":"~0.2.1","karma-jasmine":"~0.3.6","karma-jasmine-jquery":"~0.1.1","karma-phantomjs-launcher":"~0.2.1","lodash":"~4.11.0","node-sass":"~3.4.1","phantomjs":"~1.9.18","polyfill-function-prototype-bind":"0.0.1","tiny-lr":"~0.2.1","watchify":"~3.6.0","yargs":"^1.2.2"},"peerDependencies":{"aliasify":"^1.5.0"},"browserify":{"transform":["aliasify"]},"aliasify":{"aliases":{"@grid":"./src/modules"}},"browserify-shim":{},"repository":{"type":"git","url":"https://github.com/relateiq/grid.git"},"keywords":["grid","spreadsheet","virtual","scroll"],"author":{"name":"Sterling Camden"},"license":"MIT","bugs":{"url":"https://github.com/relateiq/grid/issues"},"homepage":"https://github.com/relateiq/grid","gitHead":"df60490a9f31722401d8ce00517333c9ec374e3c","_id":"grid@3.0.1","_shasum":"b5986e7a603f66882e8a51962d726df443f38929","_from":".","_npmVersion":"2.1.17","_nodeVersion":"0.10.30","_npmUser":{"name":"scamden","email":"rusty.camden@gmail.com"},"maintainers":[{"name":"anthonyl","email":"anthony.liatsis@gmail.com"},{"name":"benshope","email":"ben@benshope.com"},{"name":"cdennison","email":"christy@relateiq.com"},{"name":"joechrz","email":"joechrz@gmail.com"},{"name":"joemun","email":"joe.mun@relateiq.com"},{"name":"john.fox","email":"john.fox@relateiq.com"},{"name":"jontomas","email":"jon@relateiq.com"},{"name":"keven425","email":"keven425@gmail.com"},{"name":"lerhaupt","email":"gary@relateiq.com"},{"name":"scamden","email":"rusty.camden@gmail.com"},{"name":"voxmatt","email":"public@matthewmartin.com"}],"dist":{"shasum":"b5986e7a603f66882e8a51962d726df443f38929","tarball":"https://registry.npmjs.org/grid/-/grid-3.0.1.tgz","integrity":"sha512-iSZDBzHY+SNXkOIwXfJLFfiCzhpF4p/z+xk+SyXJq9dhmzloG9XS92QnYlrN89K8Kaj6mHGTdSmJiO5f5XnPNA==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIBL43fAL4YtT4AnCV6/7WjojVYHhhpS564U5qlhiDgaIAiEAtm0/PwQjs2yYSOtdUBLR+KQYX+Ou044NfwFGJ+cvuH8="}]},"_npmOperationalInternal":{"host":"packages-12-west.internal.npmjs.com","tmp":"tmp/grid-3.0.1.tgz_1461709274019_0.1308051091618836"},"directories":{}},"3.0.2":{"name":"grid","version":"3.0.2","description":"A highly scalable grid component written in javscript","main":"src/modules/grid-entry.js","publishConfig":{"registry":"https://registry.npmjs.org/"},"engines":{"node":">=0.10.0"},"iqproj":{"app":true},"scripts":{"test":"bin/iqb test","start":"bin/iqb start","preversion":"bin/iqb test"},"dependencies":{"angular":"~1.4.7","angular-mocks":"~1.4.7","angular-route":"~1.4.7","capitalize":"^0.5.0","click-off":"~0.2.1","element-class":"^0.1.1","escape-stack":"~0.1.2","inner-text-shim":"~1.0.1","key":"^0.1.11","time-now":"~0.2.1"},"devDependencies":{"aliasify":"^1.5.0","browserify":"~12.0.1","browserify-istanbul":"~0.2.1","chokidar-cli":"~1.1.1","connect-livereload":"~0.5.3","es6-promise":"~3.1.2","exorcist":"~0.4.0","express":"~4.13.3","jasmine":"~2.3.2","jasmine-tools-riq":"~0.3.0","jquery":"^2.1.0","karma":"~0.13.14","karma-browserify":"~4.4.0","karma-chrome-launcher":"~0.2.1","karma-jasmine":"~0.3.6","karma-jasmine-jquery":"~0.1.1","karma-phantomjs-launcher":"~0.2.1","lodash":"~4.11.0","node-sass":"~3.4.1","phantomjs":"~1.9.18","polyfill-function-prototype-bind":"0.0.1","tiny-lr":"~0.2.1","watchify":"~3.6.0","yargs":"^1.2.2"},"peerDependencies":{"aliasify":"^1.5.0"},"browserify":{"transform":["aliasify"]},"aliasify":{"aliases":{"@grid":"./src/modules"}},"browserify-shim":{},"repository":{"type":"git","url":"https://github.com/relateiq/grid.git"},"keywords":["grid","spreadsheet","virtual","scroll"],"author":{"name":"Sterling Camden"},"license":"MIT","bugs":{"url":"https://github.com/relateiq/grid/issues"},"homepage":"https://github.com/relateiq/grid","gitHead":"4949dfc4746313ca1c1916c85270bf30579b0713","_id":"grid@3.0.2","_shasum":"b79f174ff0eed05380f4b78a9fae3f247967b0dc","_from":".","_npmVersion":"2.1.17","_nodeVersion":"0.10.30","_npmUser":{"name":"scamden","email":"rusty.camden@gmail.com"},"maintainers":[{"name":"anthonyl","email":"anthony.liatsis@gmail.com"},{"name":"benshope","email":"ben@benshope.com"},{"name":"cdennison","email":"christy@relateiq.com"},{"name":"joechrz","email":"joechrz@gmail.com"},{"name":"joemun","email":"joe.mun@relateiq.com"},{"name":"john.fox","email":"john.fox@relateiq.com"},{"name":"jontomas","email":"jon@relateiq.com"},{"name":"keven425","email":"keven425@gmail.com"},{"name":"lerhaupt","email":"gary@relateiq.com"},{"name":"scamden","email":"rusty.camden@gmail.com"},{"name":"voxmatt","email":"public@matthewmartin.com"}],"dist":{"shasum":"b79f174ff0eed05380f4b78a9fae3f247967b0dc","tarball":"https://registry.npmjs.org/grid/-/grid-3.0.2.tgz","integrity":"sha512-5Xy2tm+vPWy3Sl75uwCjcNu1Vdesww+YqKnVfFsRggwKexQEp4fsT/85Ql/zOpSxcmd4EC4p5D1or/Pl1+nI/Q==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCRpRm2RDCf+8rztD938xCEf6uJXd3fajTjnspW3UBIwwIhAJbQaSnFy3PXJXgZAvZxjzJHSBb0jupmTdADWbHN1fMl"}]},"_npmOperationalInternal":{"host":"packages-12-west.internal.npmjs.com","tmp":"tmp/grid-3.0.2.tgz_1461964303597_0.13894999492913485"},"directories":{}},"3.1.0":{"name":"grid","version":"3.1.0","description":"A highly scalable grid component written in javscript","main":"src/modules/grid-entry.js","publishConfig":{"registry":"https://registry.npmjs.org/"},"engines":{"node":">=0.10.0"},"iqproj":{"app":true},"scripts":{"test":"bin/iqb test","start":"bin/iqb start","preversion":"bin/iqb test"},"dependencies":{"angular":"~1.4.7","angular-mocks":"~1.4.7","angular-route":"~1.4.7","capitalize":"^0.5.0","click-off":"~0.2.1","element-class":"^0.1.1","escape-stack":"~0.1.2","inner-text-shim":"~1.0.1","key":"^0.1.11","time-now":"~0.2.1"},"devDependencies":{"aliasify":"^1.5.0","browserify":"~12.0.1","browserify-istanbul":"~0.2.1","chokidar-cli":"~1.1.1","connect-livereload":"~0.5.3","es6-promise":"~3.1.2","exorcist":"~0.4.0","express":"~4.13.3","jasmine":"~2.3.2","jasmine-tools-riq":"~0.3.0","jquery":"^2.1.0","karma":"~0.13.14","karma-browserify":"~4.4.0","karma-chrome-launcher":"~0.2.1","karma-jasmine":"~0.3.6","karma-jasmine-jquery":"~0.1.1","karma-phantomjs-launcher":"~0.2.1","lodash":"~4.11.0","node-sass":"~3.4.1","phantomjs":"~1.9.18","polyfill-function-prototype-bind":"0.0.1","tiny-lr":"~0.2.1","watchify":"~3.6.0","yargs":"^1.2.2"},"peerDependencies":{"aliasify":"^1.5.0"},"browserify":{"transform":["aliasify"]},"aliasify":{"aliases":{"@grid":"./src/modules"}},"browserify-shim":{},"repository":{"type":"git","url":"git+https://github.com/relateiq/grid.git"},"keywords":["grid","spreadsheet","virtual","scroll"],"author":{"name":"Sterling Camden"},"license":"MIT","bugs":{"url":"https://github.com/relateiq/grid/issues"},"homepage":"https://github.com/relateiq/grid","gitHead":"e6769d72f85dc66e69e5cd94dcaaade0ffcd8aed","_id":"grid@3.1.0","_shasum":"6c5a95bbb91cb7c4a1532d3d9290ccc844508698","_from":".","_npmVersion":"2.15.1","_nodeVersion":"0.12.14","_npmUser":{"name":"scamden","email":"rusty.camden@gmail.com"},"maintainers":[{"name":"anthonyl","email":"anthony.liatsis@gmail.com"},{"name":"benshope","email":"ben@benshope.com"},{"name":"cdennison","email":"christy@relateiq.com"},{"name":"joechrz","email":"joechrz@gmail.com"},{"name":"joemun","email":"joe.mun@relateiq.com"},{"name":"john.fox","email":"john.fox@relateiq.com"},{"name":"jontomas","email":"jon@relateiq.com"},{"name":"keven425","email":"keven425@gmail.com"},{"name":"lerhaupt","email":"gary@relateiq.com"},{"name":"scamden","email":"rusty.camden@gmail.com"},{"name":"voxmatt","email":"public@matthewmartin.com"}],"dist":{"shasum":"6c5a95bbb91cb7c4a1532d3d9290ccc844508698","tarball":"https://registry.npmjs.org/grid/-/grid-3.1.0.tgz","integrity":"sha512-U3Gpalc8/bgJ+s8oJ4ScgK3ZGrJ6+KCg0z+HN60ZQ8jN+E/oN2OZZ6MFH8bl3CJ2WntRV4twWzCNKh0vlKFtuA==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDVGT5pmrruBxgrajER0S60mJE06FYDjrYKcbrVE1Z2kgIhAKctYj5s09euHYZqINejrXzgwxClbQTv2Q+Dpa7mOQWK"}]},"_npmOperationalInternal":{"host":"packages-12-west.internal.npmjs.com","tmp":"tmp/grid-3.1.0.tgz_1466629354716_0.834216887364164"},"directories":{}},"3.1.1":{"name":"grid","version":"3.1.1","description":"A highly scalable grid component written in javscript","main":"src/modules/grid-entry.js","publishConfig":{"registry":"https://registry.npmjs.org/"},"engines":{"node":">=0.10.0"},"iqproj":{"app":true},"scripts":{"test":"bin/iqb test","start":"bin/iqb start","preversion":"bin/iqb test"},"dependencies":{"angular":"~1.4.7","angular-mocks":"~1.4.7","angular-route":"~1.4.7","capitalize":"^0.5.0","click-off":"~0.2.1","element-class":"^0.1.1","escape-stack":"~0.1.2","inner-text-shim":"~1.0.1","key":"^0.1.11","time-now":"~0.2.1"},"devDependencies":{"aliasify":"^1.5.0","browserify":"~12.0.1","browserify-istanbul":"~0.2.1","chokidar-cli":"~1.1.1","connect-livereload":"~0.5.3","es6-promise":"~3.1.2","exorcist":"~0.4.0","express":"~4.13.3","jasmine":"~2.3.2","jasmine-tools-riq":"~0.3.0","jquery":"^2.1.0","karma":"~0.13.14","karma-browserify":"~4.4.0","karma-chrome-launcher":"~0.2.1","karma-jasmine":"~0.3.6","karma-jasmine-jquery":"~0.1.1","karma-phantomjs-launcher":"~0.2.1","lodash":"~4.11.0","node-sass":"~3.4.1","phantomjs":"~1.9.18","polyfill-function-prototype-bind":"0.0.1","tiny-lr":"~0.2.1","watchify":"~3.6.0","yargs":"^1.2.2"},"peerDependencies":{"aliasify":"^1.5.0"},"browserify":{"transform":["aliasify"]},"aliasify":{"aliases":{"@grid":"./src/modules"}},"browserify-shim":{},"repository":{"type":"git","url":"git+https://github.com/relateiq/grid.git"},"keywords":["grid","spreadsheet","virtual","scroll"],"author":{"name":"Sterling Camden"},"license":"MIT","bugs":{"url":"https://github.com/relateiq/grid/issues"},"homepage":"https://github.com/relateiq/grid","gitHead":"20556d9ac3f40edb6aa49ce1c2b55325d5ccc5a1","_id":"grid@3.1.1","_shasum":"560f77509ffd16879307497779730083dfae930b","_from":".","_npmVersion":"2.15.1","_nodeVersion":"0.12.14","_npmUser":{"name":"scamden","email":"rusty.camden@gmail.com"},"maintainers":[{"name":"anthonyl","email":"anthony.liatsis@gmail.com"},{"name":"benshope","email":"ben@benshope.com"},{"name":"cdennison","email":"christy@relateiq.com"},{"name":"joechrz","email":"joechrz@gmail.com"},{"name":"joemun","email":"joe.mun@relateiq.com"},{"name":"john.fox","email":"john.fox@relateiq.com"},{"name":"jontomas","email":"jon@relateiq.com"},{"name":"keven425","email":"keven425@gmail.com"},{"name":"lerhaupt","email":"gary@relateiq.com"},{"name":"scamden","email":"rusty.camden@gmail.com"},{"name":"voxmatt","email":"public@matthewmartin.com"}],"dist":{"shasum":"560f77509ffd16879307497779730083dfae930b","tarball":"https://registry.npmjs.org/grid/-/grid-3.1.1.tgz","integrity":"sha512-rcbP8eqwx8iMC5PIT09+14DZL3OwpMPYD+NrFVqDLNSrhtRejFDKVlKcm8wiMNHYhTEa9BbuxzI6ji0I/gj4vw==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIHrTwylMhf5u8mmpAFA/7D+ZKKIJx+mdOY1TUtJpw//3AiB6k80b7T91Ru9izLO/RHVfqssWMMoGqpTrEb6Bb6AAAQ=="}]},"_npmOperationalInternal":{"host":"packages-16-east.internal.npmjs.com","tmp":"tmp/grid-3.1.1.tgz_1467323989963_0.15614572679623961"},"directories":{}},"3.1.2":{"name":"grid","version":"3.1.2","description":"A highly scalable grid component written in javscript","main":"src/modules/grid-entry.js","publishConfig":{"registry":"https://registry.npmjs.org/"},"engines":{"node":">=0.10.0"},"iqproj":{"app":true},"scripts":{"test":"bin/iqb test","start":"bin/iqb start","preversion":"bin/iqb test"},"dependencies":{"angular":"~1.4.7","angular-mocks":"~1.4.7","angular-route":"~1.4.7","capitalize":"^0.5.0","click-off":"~0.2.1","element-class":"^0.1.1","escape-stack":"~0.1.2","inner-text-shim":"~1.0.1","key":"^0.1.11","time-now":"~0.2.1"},"devDependencies":{"aliasify":"^1.5.0","browserify":"~12.0.1","browserify-istanbul":"~0.2.1","chokidar-cli":"~1.1.1","connect-livereload":"~0.5.3","es6-promise":"~3.1.2","exorcist":"~0.4.0","express":"~4.13.3","jasmine":"~2.3.2","jasmine-tools-riq":"~0.3.0","jquery":"^2.1.0","karma":"~0.13.14","karma-browserify":"~4.4.0","karma-chrome-launcher":"~0.2.1","karma-jasmine":"~0.3.6","karma-jasmine-jquery":"~0.1.1","karma-phantomjs-launcher":"~0.2.1","lodash":"~4.11.0","node-sass":"~3.4.1","phantomjs":"~1.9.18","polyfill-function-prototype-bind":"0.0.1","tiny-lr":"~0.2.1","watchify":"~3.6.0","yargs":"^1.2.2"},"peerDependencies":{"aliasify":"^1.5.0"},"browserify":{"transform":["aliasify"]},"aliasify":{"aliases":{"@grid":"./src/modules"}},"browserify-shim":{},"repository":{"type":"git","url":"git+https://github.com/relateiq/grid.git"},"keywords":["grid","spreadsheet","virtual","scroll"],"author":{"name":"Sterling Camden"},"license":"MIT","bugs":{"url":"https://github.com/relateiq/grid/issues"},"homepage":"https://github.com/relateiq/grid","gitHead":"7eb40bb962a1a3bb190a5bb057ef36918bbb2338","_id":"grid@3.1.2","_shasum":"2c49656f0a2b8d40049c3e595c088fee723f4809","_from":".","_npmVersion":"2.15.1","_nodeVersion":"0.12.14","_npmUser":{"name":"scamden","email":"rusty.camden@gmail.com"},"maintainers":[{"name":"anthonyl","email":"anthony.liatsis@gmail.com"},{"name":"benshope","email":"ben@benshope.com"},{"name":"cdennison","email":"christy@relateiq.com"},{"name":"joechrz","email":"joechrz@gmail.com"},{"name":"joemun","email":"joe.mun@relateiq.com"},{"name":"john.fox","email":"john.fox@relateiq.com"},{"name":"jontomas","email":"jon@relateiq.com"},{"name":"keven425","email":"keven425@gmail.com"},{"name":"lerhaupt","email":"gary@relateiq.com"},{"name":"scamden","email":"rusty.camden@gmail.com"},{"name":"voxmatt","email":"public@matthewmartin.com"}],"dist":{"shasum":"2c49656f0a2b8d40049c3e595c088fee723f4809","tarball":"https://registry.npmjs.org/grid/-/grid-3.1.2.tgz","integrity":"sha512-HxHsiQSZiy4+LkhSdJdlb5wIh1b5A18jeDSqepieEPW86JtKhdFW850BRNx7Uj2X848qgD4np4REdb4N0StBYw==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDjK13ivoOdTLulXJ+yoOAMAkZ0zCs5xMXGZ15sJKgGIQIhAIReTU+WvPLApm2lXHDN9CAjJyVbwEQ0kXbmnKAh2ce3"}]},"_npmOperationalInternal":{"host":"packages-16-east.internal.npmjs.com","tmp":"tmp/grid-3.1.2.tgz_1468864637546_0.35635749716311693"},"directories":{}},"3.1.3":{"name":"grid","version":"3.1.3","description":"A highly scalable grid component written in javscript","main":"src/modules/grid-entry.js","publishConfig":{"registry":"https://registry.npmjs.org/"},"engines":{"node":">=0.10.0"},"iqproj":{"app":true},"scripts":{"test":"bin/iqb test","start":"bin/iqb start","preversion":"bin/iqb test"},"dependencies":{"angular":"~1.4.7","angular-mocks":"~1.4.7","angular-route":"~1.4.7","capitalize":"^0.5.0","click-off":"~0.2.1","element-class":"^0.1.1","escape-stack":"~0.1.2","inner-text-shim":"~1.0.1","key":"^0.1.11","time-now":"~0.2.1"},"devDependencies":{"aliasify":"^1.5.0","browserify":"~12.0.1","browserify-istanbul":"~0.2.1","chokidar-cli":"~1.1.1","connect-livereload":"~0.5.3","es6-promise":"~3.1.2","exorcist":"~0.4.0","express":"~4.13.3","jasmine":"~2.3.2","jasmine-tools-riq":"~0.3.0","jquery":"^2.1.0","karma":"~0.13.14","karma-browserify":"~4.4.0","karma-chrome-launcher":"~0.2.1","karma-jasmine":"~0.3.6","karma-jasmine-jquery":"~0.1.1","karma-phantomjs-launcher":"~0.2.1","lodash":"~4.11.0","node-sass":"~3.4.1","phantomjs":"~1.9.18","polyfill-function-prototype-bind":"0.0.1","tiny-lr":"~0.2.1","watchify":"~3.6.0","yargs":"^1.2.2"},"peerDependencies":{"aliasify":"^1.5.0"},"browserify":{"transform":["aliasify"]},"aliasify":{"aliases":{"@grid":"./src/modules"}},"browserify-shim":{},"repository":{"type":"git","url":"git+https://github.com/relateiq/grid.git"},"keywords":["grid","spreadsheet","virtual","scroll"],"author":{"name":"Sterling Camden"},"license":"MIT","bugs":{"url":"https://github.com/relateiq/grid/issues"},"homepage":"https://github.com/relateiq/grid","gitHead":"b1ea3cf8de37082179a99fb7c252ec35b495799b","_id":"grid@3.1.3","_shasum":"101cf44f26a400769b30cb0082ffe898a53b53b7","_from":".","_npmVersion":"2.15.1","_nodeVersion":"0.12.14","_npmUser":{"name":"scamden","email":"rusty.camden@gmail.com"},"maintainers":[{"name":"anthonyl","email":"anthony.liatsis@gmail.com"},{"name":"benshope","email":"ben@benshope.com"},{"name":"cdennison","email":"christy@relateiq.com"},{"name":"joechrz","email":"joechrz@gmail.com"},{"name":"joemun","email":"joe.mun@relateiq.com"},{"name":"john.fox","email":"john.fox@relateiq.com"},{"name":"jontomas","email":"jon@relateiq.com"},{"name":"keven425","email":"keven425@gmail.com"},{"name":"lerhaupt","email":"gary@relateiq.com"},{"name":"scamden","email":"rusty.camden@gmail.com"},{"name":"voxmatt","email":"public@matthewmartin.com"}],"dist":{"shasum":"101cf44f26a400769b30cb0082ffe898a53b53b7","tarball":"https://registry.npmjs.org/grid/-/grid-3.1.3.tgz","integrity":"sha512-OfGi1cvhR/uE4HNWsRCZPU03OLpzvMUzPVaIsrkfLQNFb+7Kcq8N8i2oE8oCEw1PqYbcMEoNdzQJfa59qQA71A==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDE9RhSdGFlyECeUP/iyVXaicE9EiNRLjtM3YrWnf+lzwIhAOV2Qcaz0T8y4IVRH5OntvAn6Cqz5Wzag8yrsISaNkWA"}]},"_npmOperationalInternal":{"host":"packages-12-west.internal.npmjs.com","tmp":"tmp/grid-3.1.3.tgz_1469131009203_0.5962502781767398"},"directories":{}},"3.1.4":{"name":"grid","version":"3.1.4","description":"A highly scalable grid component written in javscript","main":"src/modules/grid-entry.js","publishConfig":{"registry":"https://registry.npmjs.org/"},"engines":{"node":">=0.10.0"},"iqproj":{"app":true},"scripts":{"test":"bin/iqb test","start":"bin/iqb start","preversion":"bin/iqb test"},"dependencies":{"angular":"~1.4.7","angular-mocks":"~1.4.7","angular-route":"~1.4.7","capitalize":"^0.5.0","click-off":"~0.2.1","element-class":"^0.1.1","escape-stack":"~0.1.2","inner-text-shim":"~1.0.1","key":"^0.1.11","time-now":"~0.2.1"},"devDependencies":{"aliasify":"^1.5.0","browserify":"~12.0.1","browserify-istanbul":"~0.2.1","chokidar-cli":"~1.1.1","connect-livereload":"~0.5.3","es6-promise":"~3.1.2","exorcist":"~0.4.0","express":"~4.13.3","jasmine":"~2.3.2","jasmine-tools-riq":"~0.3.0","jquery":"^2.1.0","karma":"~0.13.14","karma-browserify":"~4.4.0","karma-chrome-launcher":"~0.2.1","karma-jasmine":"~0.3.6","karma-jasmine-jquery":"~0.1.1","karma-phantomjs-launcher":"~0.2.1","lodash":"~4.11.0","node-sass":"~3.4.1","phantomjs":"~1.9.18","polyfill-function-prototype-bind":"0.0.1","tiny-lr":"~0.2.1","watchify":"~3.6.0","yargs":"^1.2.2"},"peerDependencies":{"aliasify":"^1.5.0"},"browserify":{"transform":["aliasify"]},"aliasify":{"aliases":{"@grid":"./src/modules"}},"browserify-shim":{},"repository":{"type":"git","url":"git+https://github.com/relateiq/grid.git"},"keywords":["grid","spreadsheet","virtual","scroll"],"author":{"name":"Sterling Camden"},"license":"MIT","bugs":{"url":"https://github.com/relateiq/grid/issues"},"homepage":"https://github.com/relateiq/grid","gitHead":"58fb0cf76c76b4318e1333ed8b2b5d4af74d3f3e","_id":"grid@3.1.4","_shasum":"902e9c7ae4c5d3e2bf215a69b1f07edd09826f2a","_from":".","_npmVersion":"2.15.1","_nodeVersion":"0.12.14","_npmUser":{"name":"scamden","email":"rusty.camden@gmail.com"},"maintainers":[{"name":"anthonyl","email":"anthony.liatsis@gmail.com"},{"name":"benshope","email":"ben@benshope.com"},{"name":"cdennison","email":"christy@relateiq.com"},{"name":"joechrz","email":"joechrz@gmail.com"},{"name":"joemun","email":"joe.mun@relateiq.com"},{"name":"john.fox","email":"john.fox@relateiq.com"},{"name":"jontomas","email":"jon@relateiq.com"},{"name":"keven425","email":"keven425@gmail.com"},{"name":"lerhaupt","email":"gary@relateiq.com"},{"name":"scamden","email":"rusty.camden@gmail.com"},{"name":"voxmatt","email":"public@matthewmartin.com"}],"dist":{"shasum":"902e9c7ae4c5d3e2bf215a69b1f07edd09826f2a","tarball":"https://registry.npmjs.org/grid/-/grid-3.1.4.tgz","integrity":"sha512-uKgVyQEUZEXNd4SCe9wQbfHNAH/HLcPnhMhNDNrJDdLxPjm/pCt3wrpB0UIj8fpMFTqy8xDv83ImDFtQdB9Zjg==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCFFzclImegcJGzAgMNX6fTG9yCFK6jYr8dkuSqwm3cAAIgQUKDAum89UtOelZtmSwecsHoJ+4w1yjI2T9+kSqa+Vw="}]},"_npmOperationalInternal":{"host":"packages-16-east.internal.npmjs.com","tmp":"tmp/grid-3.1.4.tgz_1469132956207_0.21656526601873338"},"directories":{}},"3.1.5":{"name":"grid","version":"3.1.5","description":"A highly scalable grid component written in javscript","main":"src/modules/grid-entry.js","publishConfig":{"registry":"https://registry.npmjs.org/"},"engines":{"node":">=0.10.0"},"iqproj":{"app":true},"scripts":{"test":"bin/iqb test","start":"bin/iqb start","preversion":"bin/iqb test"},"dependencies":{"angular":"~1.4.7","angular-mocks":"~1.4.7","angular-route":"~1.4.7","capitalize":"^0.5.0","click-off":"~0.2.1","element-class":"^0.1.1","escape-stack":"~0.1.2","inner-text-shim":"~1.0.1","key":"^0.1.11","time-now":"~0.2.1"},"devDependencies":{"aliasify":"^1.5.0","browserify":"~12.0.1","browserify-istanbul":"~0.2.1","chokidar-cli":"~1.1.1","connect-livereload":"~0.5.3","es6-promise":"~3.1.2","exorcist":"~0.4.0","express":"~4.13.3","jasmine":"~2.3.2","jasmine-tools-riq":"~0.3.0","jquery":"^2.1.0","karma":"~0.13.14","karma-browserify":"~4.4.0","karma-chrome-launcher":"~0.2.1","karma-jasmine":"~0.3.6","karma-jasmine-jquery":"~0.1.1","karma-phantomjs-launcher":"~0.2.1","lodash":"~4.11.0","node-sass":"~3.4.1","phantomjs":"~1.9.18","polyfill-function-prototype-bind":"0.0.1","tiny-lr":"~0.2.1","watchify":"~3.6.0","yargs":"^1.2.2"},"browserify":{"transform":["aliasify"]},"aliasify":{"aliases":{"@grid":"./src/modules"}},"browserify-shim":{},"repository":{"type":"git","url":"git+https://github.com/relateiq/grid.git"},"keywords":["grid","spreadsheet","virtual","scroll"],"author":{"name":"Sterling Camden"},"license":"MIT","bugs":{"url":"https://github.com/relateiq/grid/issues"},"homepage":"https://github.com/relateiq/grid","gitHead":"d8c59f481df1157f25788fcae3cbeb3c053e10f9","_id":"grid@3.1.5","_shasum":"70440f98509f8a0644c44a86cf70ee98149086f5","_from":".","_npmVersion":"2.15.1","_nodeVersion":"0.12.14","_npmUser":{"name":"scamden","email":"rusty.camden@gmail.com"},"maintainers":[{"name":"anthonyl","email":"anthony.liatsis@gmail.com"},{"name":"benshope","email":"ben@benshope.com"},{"name":"cdennison","email":"christy@relateiq.com"},{"name":"joechrz","email":"joechrz@gmail.com"},{"name":"joemun","email":"joe.mun@relateiq.com"},{"name":"john.fox","email":"john.fox@relateiq.com"},{"name":"jontomas","email":"jon@relateiq.com"},{"name":"keven425","email":"keven425@gmail.com"},{"name":"lerhaupt","email":"gary@relateiq.com"},{"name":"scamden","email":"rusty.camden@gmail.com"},{"name":"voxmatt","email":"public@matthewmartin.com"}],"dist":{"shasum":"70440f98509f8a0644c44a86cf70ee98149086f5","tarball":"https://registry.npmjs.org/grid/-/grid-3.1.5.tgz","integrity":"sha512-7w1siC0qBu/EYZsURKQNFyFR5itBteSvItsr5OVA0IKpj9Pbh4Ik6rGn0mm+dmZEs+aEGU1eUePQmW/dxXAYpw==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIGvqS+e4JCqH45oxEdo78V0180dcet5hT2rd8ZsvZGsDAiEAthL20nh3iLiCKsDZ884NXc2ox+c9wr05pJSINdSWHSE="}]},"_npmOperationalInternal":{"host":"packages-12-west.internal.npmjs.com","tmp":"tmp/grid-3.1.5.tgz_1469143104235_0.20284552942030132"},"directories":{}},"3.1.6":{"name":"grid","version":"3.1.6","description":"A highly scalable grid component written in javscript","main":"src/modules/grid-entry.js","publishConfig":{"registry":"https://registry.npmjs.org/"},"engines":{"node":">=0.10.0"},"iqproj":{"app":true},"scripts":{"test":"bin/iqb test","start":"bin/iqb start","preversion":"bin/iqb test"},"dependencies":{"angular":"~1.4.7","angular-mocks":"~1.4.7","angular-route":"~1.4.7","capitalize":"^0.5.0","click-off":"~0.2.1","element-class":"^0.1.1","escape-stack":"~0.1.2","inner-text-shim":"~1.0.1","key":"^0.1.11","time-now":"~0.2.1"},"devDependencies":{"aliasify":"^1.5.0","browserify":"~12.0.1","browserify-istanbul":"~0.2.1","chokidar-cli":"~1.1.1","connect-livereload":"~0.5.3","es6-promise":"~3.1.2","exorcist":"~0.4.0","express":"~4.13.3","jasmine":"~2.3.2","jasmine-tools-riq":"~0.3.0","jquery":"^2.1.0","karma":"~0.13.14","karma-browserify":"~4.4.0","karma-chrome-launcher":"~0.2.1","karma-jasmine":"~0.3.6","karma-jasmine-jquery":"~0.1.1","karma-phantomjs-launcher":"~0.2.1","lodash":"~4.11.0","node-sass":"~3.4.1","phantomjs":"~1.9.18","polyfill-function-prototype-bind":"0.0.1","tiny-lr":"~0.2.1","watchify":"~3.6.0","yargs":"^1.2.2"},"browserify":{"transform":["aliasify"]},"aliasify":{"aliases":{"@grid":"./src/modules"}},"browserify-shim":{},"repository":{"type":"git","url":"git+https://github.com/relateiq/grid.git"},"keywords":["grid","spreadsheet","virtual","scroll"],"author":{"name":"Sterling Camden"},"license":"MIT","bugs":{"url":"https://github.com/relateiq/grid/issues"},"homepage":"https://github.com/relateiq/grid","gitHead":"192244b4bd3e9e9a1a52cc5069a03aa51fdafa13","_id":"grid@3.1.6","_shasum":"2407ce07924e4dbb569019c194324142a9e1dd0c","_from":".","_npmVersion":"2.15.1","_nodeVersion":"0.12.14","_npmUser":{"name":"scamden","email":"rusty.camden@gmail.com"},"maintainers":[{"name":"anthonyl","email":"anthony.liatsis@gmail.com"},{"name":"benshope","email":"ben@benshope.com"},{"name":"cdennison","email":"christy@relateiq.com"},{"name":"joechrz","email":"joechrz@gmail.com"},{"name":"joemun","email":"joe.mun@relateiq.com"},{"name":"john.fox","email":"john.fox@relateiq.com"},{"name":"jontomas","email":"jon@relateiq.com"},{"name":"keven425","email":"keven425@gmail.com"},{"name":"lerhaupt","email":"gary@relateiq.com"},{"name":"scamden","email":"rusty.camden@gmail.com"},{"name":"voxmatt","email":"public@matthewmartin.com"}],"dist":{"shasum":"2407ce07924e4dbb569019c194324142a9e1dd0c","tarball":"https://registry.npmjs.org/grid/-/grid-3.1.6.tgz","integrity":"sha512-11ruA2QUfnNHROVOkLQImFeDX7/fZZMy+huU2ht4a4zn7SjyOteVkU1tJs+e4zivgbvo4UNCaQGR5dlqCP2+Lg==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCZCOlmm+RRUorbRHvUN206WIx8vEy03oesCJ8FneWspQIgfWfAU3e1sEVqOuiqwLLj3/vgFSYaGciSgYZSTlaam0o="}]},"_npmOperationalInternal":{"host":"packages-16-east.internal.npmjs.com","tmp":"tmp/grid-3.1.6.tgz_1470353236165_0.9928892173338681"},"directories":{}},"3.2.0":{"name":"grid","version":"3.2.0","description":"A highly scalable grid component written in javscript","main":"src/modules/grid-entry.js","publishConfig":{"registry":"https://registry.npmjs.org/"},"engines":{"node":">=0.10.0"},"iqproj":{"app":true},"scripts":{"test":"bin/iqb test","start":"bin/iqb start","preversion":"bin/iqb test"},"dependencies":{"angular":"~1.4.7","angular-mocks":"~1.4.7","angular-route":"~1.4.7","capitalize":"^0.5.0","click-off":"~0.2.1","element-class":"^0.1.1","escape-stack":"~0.1.2","inner-text-shim":"~1.0.1","key":"^0.1.11","time-now":"~0.2.1"},"devDependencies":{"aliasify":"^1.5.0","browserify":"~12.0.1","browserify-istanbul":"~0.2.1","chokidar-cli":"~1.1.1","connect-livereload":"~0.5.3","es6-promise":"~3.1.2","exorcist":"~0.4.0","express":"~4.13.3","jasmine":"~2.3.2","jasmine-tools-riq":"~0.3.0","jquery":"^2.1.0","karma":"~0.13.14","karma-browserify":"~4.4.0","karma-chrome-launcher":"~0.2.1","karma-jasmine":"~0.3.6","karma-jasmine-jquery":"~0.1.1","karma-phantomjs-launcher":"~0.2.1","lodash":"~4.11.0","node-sass":"~3.4.1","phantomjs":"~1.9.18","polyfill-function-prototype-bind":"0.0.1","tiny-lr":"~0.2.1","watchify":"~3.6.0","yargs":"^1.2.2"},"browserify":{"transform":["aliasify"]},"aliasify":{"aliases":{"@grid":"./src/modules"}},"browserify-shim":{},"repository":{"type":"git","url":"git+https://github.com/relateiq/grid.git"},"keywords":["grid","spreadsheet","virtual","scroll"],"author":{"name":"Sterling Camden"},"license":"MIT","bugs":{"url":"https://github.com/relateiq/grid/issues"},"homepage":"https://github.com/relateiq/grid","gitHead":"eda7ee4d03172fbb068a18e139262303d4ded305","_id":"grid@3.2.0","_shasum":"cf3fd7203a0e08a0c488cd75fe9c829844214c0d","_from":".","_npmVersion":"2.15.1","_nodeVersion":"0.12.14","_npmUser":{"name":"scamden","email":"rusty.camden@gmail.com"},"maintainers":[{"name":"anthonyl","email":"anthony.liatsis@gmail.com"},{"name":"benshope","email":"ben@benshope.com"},{"name":"cdennison","email":"christy@relateiq.com"},{"name":"joechrz","email":"joechrz@gmail.com"},{"name":"joemun","email":"joe.mun@relateiq.com"},{"name":"john.fox","email":"john.fox@relateiq.com"},{"name":"jontomas","email":"jon@relateiq.com"},{"name":"keven425","email":"keven425@gmail.com"},{"name":"lerhaupt","email":"gary@relateiq.com"},{"name":"scamden","email":"rusty.camden@gmail.com"},{"name":"voxmatt","email":"public@matthewmartin.com"}],"dist":{"shasum":"cf3fd7203a0e08a0c488cd75fe9c829844214c0d","tarball":"https://registry.npmjs.org/grid/-/grid-3.2.0.tgz","integrity":"sha512-dAaMu40Oivrtfy2agaA7vC1egFym/KmCo8WkcNcvZLVPN9GjyYBpFCjiCwiPBIOMVqznYnz9DMCQiDrMfTeAIw==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIHdlyYA+iMe8Lll0Ok9ifoDUQYjoF5PSoukN2vMPgxq+AiEA35KtaXF6JRlC7G7iNEmukqLBBCKh+e1BXdZnVnw3d1k="}]},"_npmOperationalInternal":{"host":"packages-16-east.internal.npmjs.com","tmp":"tmp/grid-3.2.0.tgz_1470695997579_0.8599394573830068"},"directories":{}},"3.3.0":{"name":"grid","version":"3.3.0","description":"A highly scalable grid component written in javscript","main":"src/modules/grid-entry.js","publishConfig":{"registry":"https://registry.npmjs.org/"},"engines":{"node":">=0.10.0"},"iqproj":{"app":true},"scripts":{"test":"bin/iqb test","start":"bin/iqb start","preversion":"bin/iqb test"},"dependencies":{"angular":"~1.4.7","angular-mocks":"~1.4.7","angular-route":"~1.4.7","capitalize":"^0.5.0","click-off":"~0.2.1","element-class":"^0.1.1","escape-stack":"~0.1.2","inner-text-shim":"~1.0.1","key":"^0.1.11","time-now":"~0.2.1"},"devDependencies":{"aliasify":"^1.5.0","browserify":"~12.0.1","browserify-istanbul":"~0.2.1","chokidar-cli":"~1.1.1","connect-livereload":"~0.5.3","es6-promise":"~3.1.2","exorcist":"~0.4.0","express":"~4.13.3","jasmine":"~2.3.2","jasmine-tools-riq":"~0.3.0","jquery":"^2.1.0","karma":"~0.13.14","karma-browserify":"~4.4.0","karma-chrome-launcher":"~0.2.1","karma-jasmine":"~0.3.6","karma-jasmine-jquery":"~0.1.1","karma-phantomjs-launcher":"~0.2.1","lodash":"~4.11.0","node-sass":"~3.4.1","phantomjs":"~1.9.18","polyfill-function-prototype-bind":"0.0.1","tiny-lr":"~0.2.1","watchify":"~3.6.0","yargs":"^1.2.2"},"browserify":{"transform":["aliasify"]},"aliasify":{"aliases":{"@grid":"./src/modules"}},"browserify-shim":{},"repository":{"type":"git","url":"git+https://github.com/relateiq/grid.git"},"keywords":["grid","spreadsheet","virtual","scroll"],"author":{"name":"Sterling Camden"},"license":"MIT","bugs":{"url":"https://github.com/relateiq/grid/issues"},"homepage":"https://github.com/relateiq/grid","gitHead":"1dc619aea0baf9b8bcb8135ecc5cacdd9f4c2f82","_id":"grid@3.3.0","_shasum":"3e6fb5ea2758189d5d8596373ae556969f93bb6a","_from":".","_npmVersion":"2.15.1","_nodeVersion":"0.12.14","_npmUser":{"name":"scamden","email":"rusty.camden@gmail.com"},"maintainers":[{"name":"anthonyl","email":"anthony.liatsis@gmail.com"},{"name":"benshope","email":"ben@benshope.com"},{"name":"cdennison","email":"christy@relateiq.com"},{"name":"joechrz","email":"joechrz@gmail.com"},{"name":"joemun","email":"joe.mun@relateiq.com"},{"name":"john.fox","email":"john.fox@relateiq.com"},{"name":"jontomas","email":"jon@relateiq.com"},{"name":"keven425","email":"keven425@gmail.com"},{"name":"lerhaupt","email":"gary@relateiq.com"},{"name":"scamden","email":"rusty.camden@gmail.com"},{"name":"voxmatt","email":"public@matthewmartin.com"}],"dist":{"shasum":"3e6fb5ea2758189d5d8596373ae556969f93bb6a","tarball":"https://registry.npmjs.org/grid/-/grid-3.3.0.tgz","integrity":"sha512-C2eRERxJlCebF5s5NLACAvO5+foreOEHIOqZXD8ztLAuftgyZgYP7tC1eQ2ee+jOrC63wGH9JlJx4eumgTUJvQ==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQD2+yBu/OOe2yGS5EMACjJ0iqjgl3gV7XOj3/kYDzb/KAIgHYRdubmw9OUreKHB77dmRTLKIPb7wMUStZDK5v71bMo="}]},"_npmOperationalInternal":{"host":"packages-16-east.internal.npmjs.com","tmp":"tmp/grid-3.3.0.tgz_1471635713392_0.6726970092859119"},"directories":{}},"3.3.1":{"name":"grid","version":"3.3.1","description":"A highly scalable grid component written in javscript","main":"src/modules/grid-entry.js","publishConfig":{"registry":"https://registry.npmjs.org/"},"engines":{"node":">=0.10.0"},"iqproj":{"app":true},"scripts":{"test":"bin/iqb test","start":"bin/iqb start","preversion":"bin/iqb test"},"dependencies":{"angular":"~1.4.7","angular-mocks":"~1.4.7","angular-route":"~1.4.7","capitalize":"^0.5.0","click-off":"~0.2.1","element-class":"^0.1.1","escape-stack":"~0.1.2","inner-text-shim":"~1.0.1","key":"^0.1.11","time-now":"~0.2.1"},"devDependencies":{"aliasify":"^1.5.0","browserify":"~12.0.1","browserify-istanbul":"~0.2.1","chokidar-cli":"~1.1.1","connect-livereload":"~0.5.3","es6-promise":"~3.1.2","exorcist":"~0.4.0","express":"~4.13.3","jasmine":"~2.3.2","jasmine-tools-riq":"~0.3.0","jquery":"^2.1.0","karma":"~0.13.14","karma-browserify":"~4.4.0","karma-chrome-launcher":"~0.2.1","karma-jasmine":"~0.3.6","karma-jasmine-jquery":"~0.1.1","karma-phantomjs-launcher":"~0.2.1","lodash":"~4.11.0","node-sass":"~3.4.1","phantomjs":"~1.9.18","polyfill-function-prototype-bind":"0.0.1","tiny-lr":"~0.2.1","watchify":"~3.6.0","yargs":"^1.2.2"},"browserify":{"transform":["aliasify"]},"aliasify":{"aliases":{"@grid":"./src/modules"}},"browserify-shim":{},"repository":{"type":"git","url":"git+https://github.com/relateiq/grid.git"},"keywords":["grid","spreadsheet","virtual","scroll"],"author":{"name":"Sterling Camden"},"license":"MIT","bugs":{"url":"https://github.com/relateiq/grid/issues"},"homepage":"https://github.com/relateiq/grid","gitHead":"835a9ce2de25d1811872d57ed7248466951c61ce","_id":"grid@3.3.1","_shasum":"6523d6b961f9795a736b461c36df179a0c3e6df2","_from":".","_npmVersion":"2.15.1","_nodeVersion":"0.12.14","_npmUser":{"name":"scamden","email":"rusty.camden@gmail.com"},"maintainers":[{"name":"anthonyl","email":"anthony.liatsis@gmail.com"},{"name":"benshope","email":"ben@benshope.com"},{"name":"cdennison","email":"christy@relateiq.com"},{"name":"joechrz","email":"joechrz@gmail.com"},{"name":"joemun","email":"joe.mun@relateiq.com"},{"name":"john.fox","email":"john.fox@relateiq.com"},{"name":"jontomas","email":"jon@relateiq.com"},{"name":"keven425","email":"keven425@gmail.com"},{"name":"lerhaupt","email":"gary@relateiq.com"},{"name":"scamden","email":"rusty.camden@gmail.com"},{"name":"voxmatt","email":"public@matthewmartin.com"}],"dist":{"shasum":"6523d6b961f9795a736b461c36df179a0c3e6df2","tarball":"https://registry.npmjs.org/grid/-/grid-3.3.1.tgz","integrity":"sha512-i42eXavFB2OjrJRWwMeG7h9P9RMm1ud0La8qsrGfxspSPp7ZU3n//LPbP4cWJ0OU78J404J2GrMQu5LJ0iZERA==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQChjKzvhh03lyamhfxWh6UA4jpnKPmYMFB9LzmTKmsoaQIgSeEO4HFECPPrU5x/i1DzyGy08fmLws63oebHJEPDI8g="}]},"_npmOperationalInternal":{"host":"packages-12-west.internal.npmjs.com","tmp":"tmp/grid-3.3.1.tgz_1474505087244_0.1286177639849484"},"directories":{}},"3.3.2":{"name":"grid","version":"3.3.2","description":"A highly scalable grid component written in javscript","main":"src/modules/grid-entry.js","publishConfig":{"registry":"https://registry.npmjs.org/"},"engines":{"node":">=0.10.0"},"iqproj":{"app":true},"scripts":{"test":"bin/iqb test","start":"bin/iqb start","preversion":"bin/iqb test"},"dependencies":{"angular":"~1.4.7","angular-mocks":"~1.4.7","angular-route":"~1.4.7","capitalize":"^0.5.0","click-off":"~0.2.1","element-class":"^0.1.1","escape-stack":"~0.1.2","inner-text-shim":"~1.0.1","key":"^0.1.11","time-now":"~0.2.1"},"devDependencies":{"aliasify":"^1.5.0","browserify":"~12.0.1","browserify-istanbul":"~0.2.1","chokidar-cli":"~1.1.1","connect-livereload":"~0.5.3","es6-promise":"~3.1.2","exorcist":"~0.4.0","express":"~4.13.3","jasmine":"~2.3.2","jasmine-tools-riq":"~0.3.0","jquery":"^2.1.0","karma":"~0.13.14","karma-browserify":"~4.4.0","karma-chrome-launcher":"~0.2.1","karma-jasmine":"~0.3.6","karma-jasmine-jquery":"~0.1.1","karma-phantomjs-launcher":"~0.2.1","lodash":"~4.11.0","node-sass":"~3.4.1","phantomjs":"~1.9.18","polyfill-function-prototype-bind":"0.0.1","tiny-lr":"~0.2.1","watchify":"~3.6.0","yargs":"^1.2.2"},"browserify":{"transform":["aliasify"]},"aliasify":{"aliases":{"@grid":"./src/modules"}},"browserify-shim":{},"repository":{"type":"git","url":"git+https://github.com/relateiq/grid.git"},"keywords":["grid","spreadsheet","virtual","scroll"],"author":{"name":"Sterling Camden"},"license":"MIT","bugs":{"url":"https://github.com/relateiq/grid/issues"},"homepage":"https://github.com/relateiq/grid","gitHead":"0080257c210269775ef4a9ba83682bec19b6ae87","_id":"grid@3.3.2","_shasum":"24cae044cdc07466989ed54a56de37d6ce27684d","_from":".","_npmVersion":"2.15.1","_nodeVersion":"0.12.14","_npmUser":{"name":"scamden","email":"rusty.camden@gmail.com"},"maintainers":[{"name":"anthonyl","email":"anthony.liatsis@gmail.com"},{"name":"benshope","email":"ben@benshope.com"},{"name":"cdennison","email":"christy@relateiq.com"},{"name":"joechrz","email":"joechrz@gmail.com"},{"name":"joemun","email":"joe.mun@relateiq.com"},{"name":"john.fox","email":"john.fox@relateiq.com"},{"name":"jontomas","email":"jon@relateiq.com"},{"name":"keven425","email":"keven425@gmail.com"},{"name":"lerhaupt","email":"gary@relateiq.com"},{"name":"scamden","email":"rusty.camden@gmail.com"},{"name":"voxmatt","email":"public@matthewmartin.com"}],"dist":{"shasum":"24cae044cdc07466989ed54a56de37d6ce27684d","tarball":"https://registry.npmjs.org/grid/-/grid-3.3.2.tgz","integrity":"sha512-rkgf47pllfvBpNyd3KgKPMqIgbzR9/i1U7JGsJgRK/n9t6LajLCw39YCWs9L1qWVfCxbMUWwooRqzwrlR8SR7g==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIGCfCvrnfEtfbSbB3GJR+ubBM1ef+a1mkDj9Qopd7mPLAiEAryNi3r/WfUGYB3idYCQ42YPxMLZ8HOrh1/pZRppk+wM="}]},"_npmOperationalInternal":{"host":"packages-16-east.internal.npmjs.com","tmp":"tmp/grid-3.3.2.tgz_1475269647454_0.9704709737561643"},"directories":{}},"3.3.3":{"name":"grid","version":"3.3.3","description":"A highly scalable grid component written in javscript","main":"src/modules/grid-entry.js","publishConfig":{"registry":"https://registry.npmjs.org/"},"engines":{"node":">=0.10.0"},"iqproj":{"app":true},"scripts":{"test":"bin/iqb test","start":"bin/iqb start","preversion":"bin/iqb test"},"dependencies":{"angular":"~1.4.7","angular-mocks":"~1.4.7","angular-route":"~1.4.7","capitalize":"^0.5.0","click-off":"~0.2.1","element-class":"^0.1.1","escape-stack":"~0.1.2","inner-text-shim":"~1.0.1","key":"^0.1.11","time-now":"~0.2.1"},"devDependencies":{"aliasify":"^1.5.0","browserify":"~12.0.1","browserify-istanbul":"~0.2.1","chokidar-cli":"~1.1.1","connect-livereload":"~0.5.3","es6-promise":"~3.1.2","exorcist":"~0.4.0","express":"~4.13.3","jasmine":"~2.3.2","jasmine-tools-riq":"~0.3.0","jquery":"^2.1.0","karma":"~0.13.14","karma-browserify":"~4.4.0","karma-chrome-launcher":"~0.2.1","karma-jasmine":"~0.3.6","karma-jasmine-jquery":"~0.1.1","karma-phantomjs-launcher":"~0.2.1","lodash":"~4.11.0","node-sass":"~3.4.1","phantomjs":"~1.9.18","polyfill-function-prototype-bind":"0.0.1","tiny-lr":"~0.2.1","watchify":"~3.6.0","yargs":"^1.2.2"},"browserify":{"transform":["aliasify"]},"aliasify":{"aliases":{"@grid":"./src/modules"}},"browserify-shim":{},"repository":{"type":"git","url":"git+https://github.com/relateiq/grid.git"},"keywords":["grid","spreadsheet","virtual","scroll"],"author":{"name":"Sterling Camden"},"license":"MIT","bugs":{"url":"https://github.com/relateiq/grid/issues"},"homepage":"https://github.com/relateiq/grid","gitHead":"e023670b8869b0bee03159d46d1b51dbbed13bc4","_id":"grid@3.3.3","_shasum":"2baac4245b77c1eff2e46d87bc2aa00471a40419","_from":".","_npmVersion":"2.15.1","_nodeVersion":"0.12.14","_npmUser":{"name":"scamden","email":"rusty.camden@gmail.com"},"maintainers":[{"name":"anthonyl","email":"anthony.liatsis@gmail.com"},{"name":"benshope","email":"ben@benshope.com"},{"name":"cdennison","email":"christy@relateiq.com"},{"name":"joechrz","email":"joechrz@gmail.com"},{"name":"joemun","email":"joe.mun@relateiq.com"},{"name":"john.fox","email":"john.fox@relateiq.com"},{"name":"jontomas","email":"jon@relateiq.com"},{"name":"keven425","email":"keven425@gmail.com"},{"name":"lerhaupt","email":"gary@relateiq.com"},{"name":"scamden","email":"rusty.camden@gmail.com"},{"name":"voxmatt","email":"public@matthewmartin.com"}],"dist":{"shasum":"2baac4245b77c1eff2e46d87bc2aa00471a40419","tarball":"https://registry.npmjs.org/grid/-/grid-3.3.3.tgz","integrity":"sha512-9/7v4EJtT+gpaY5DH1lYcGjfCNnTVIX0GF2PoDD9Pkidcc0XqT16wzwrtHe7YhsynQKAzUAwGqmrN2Lfm0jrBA==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDE0NWaMCGLOVZxBXQioOXDdZVR/2dB7gec2ljkHGKglQIgKA//ItlU1W5wrAG13Am0VtEJaDY4VDkLhctf51UBOrQ="}]},"_npmOperationalInternal":{"host":"packages-16-east.internal.npmjs.com","tmp":"tmp/grid-3.3.3.tgz_1476208441188_0.6934354000259191"},"directories":{}},"3.3.4":{"name":"grid","version":"3.3.4","description":"A highly scalable grid component written in javscript","main":"src/modules/grid-entry.js","publishConfig":{"registry":"https://registry.npmjs.org/"},"engines":{"node":">=0.10.0"},"iqproj":{"app":true},"scripts":{"test":"bin/iqb test","start":"bin/iqb start","preversion":"bin/iqb test"},"dependencies":{"angular":"~1.4.7","angular-mocks":"~1.4.7","angular-route":"~1.4.7","capitalize":"^0.5.0","click-off":"~0.2.1","element-class":"^0.1.1","escape-stack":"~0.1.2","inner-text-shim":"~1.0.1","key":"^0.1.11","time-now":"~0.2.1"},"devDependencies":{"aliasify":"^1.5.0","browserify":"~12.0.1","browserify-istanbul":"~0.2.1","chokidar-cli":"~1.1.1","connect-livereload":"~0.5.3","es6-promise":"~3.1.2","exorcist":"~0.4.0","express":"~4.13.3","jasmine":"~2.3.2","jasmine-tools-riq":"~0.3.0","jquery":"^2.1.0","karma":"~0.13.14","karma-browserify":"~4.4.0","karma-chrome-launcher":"~0.2.1","karma-jasmine":"~0.3.6","karma-jasmine-jquery":"~0.1.1","karma-phantomjs-launcher":"~0.2.1","lodash":"~4.11.0","node-sass":"~3.4.1","phantomjs":"~1.9.18","polyfill-function-prototype-bind":"0.0.1","tiny-lr":"~0.2.1","watchify":"~3.6.0","yargs":"^1.2.2"},"browserify":{"transform":["aliasify"]},"aliasify":{"aliases":{"@grid":"./src/modules"}},"browserify-shim":{},"repository":{"type":"git","url":"git+https://github.com/relateiq/grid.git"},"keywords":["grid","spreadsheet","virtual","scroll"],"author":{"name":"Sterling Camden"},"license":"MIT","bugs":{"url":"https://github.com/relateiq/grid/issues"},"homepage":"https://github.com/relateiq/grid","gitHead":"8be1ac8280301ef1c59be9096aec3fb4ee867095","_id":"grid@3.3.4","_shasum":"9515f65bb04d4eb6e5912b744031cfed9fb27609","_from":".","_npmVersion":"2.13.5","_nodeVersion":"0.12.2","_npmUser":{"name":"joemun","email":"joe.mun@relateiq.com"},"dist":{"shasum":"9515f65bb04d4eb6e5912b744031cfed9fb27609","tarball":"https://registry.npmjs.org/grid/-/grid-3.3.4.tgz","integrity":"sha512-zyrE8PGIw78lGn9+nkyjG2qIvCrw63VO81YnWwMLYEpVscY/1UC5xoVInTAi+wNvW+by98rYR9jNxMrtOFM3uw==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIHiIS5UN5UcvP4thfGQ1jb0UJuU1h+/HzX5yiuJLn3dhAiEA6XVwNK1JRI3U0g0Z/d0rTr6Ok7v0YCe4X1RKywzm25w="}]},"maintainers":[{"name":"anthonyl","email":"anthony.liatsis@gmail.com"},{"name":"benshope","email":"ben@benshope.com"},{"name":"cdennison","email":"christy@relateiq.com"},{"name":"joechrz","email":"joechrz@gmail.com"},{"name":"joemun","email":"joe.mun@relateiq.com"},{"name":"john.fox","email":"john.fox@relateiq.com"},{"name":"jontomas","email":"jon@relateiq.com"},{"name":"keven425","email":"keven425@gmail.com"},{"name":"lerhaupt","email":"gary@relateiq.com"},{"name":"scamden","email":"rusty.camden@gmail.com"},{"name":"voxmatt","email":"public@matthewmartin.com"}],"_npmOperationalInternal":{"host":"packages-16-east.internal.npmjs.com","tmp":"tmp/grid-3.3.4.tgz_1476242523722_0.39006334263831377"},"directories":{}},"3.3.5":{"name":"grid","version":"3.3.5","description":"A highly scalable grid component written in javscript","main":"src/modules/grid-entry.js","publishConfig":{"registry":"https://registry.npmjs.org/"},"engines":{"node":">=0.10.0"},"iqproj":{"app":true},"scripts":{"test":"bin/iqb test","start":"bin/iqb start","preversion":"bin/iqb test"},"dependencies":{"angular":"~1.4.7","angular-mocks":"~1.4.7","angular-route":"~1.4.7","capitalize":"^0.5.0","click-off":"~0.2.1","element-class":"^0.1.1","escape-stack":"~0.1.2","inner-text-shim":"~1.0.1","key":"^0.1.11","time-now":"~0.2.1"},"devDependencies":{"aliasify":"^1.5.0","browserify":"~12.0.1","browserify-istanbul":"~0.2.1","chokidar-cli":"~1.1.1","connect-livereload":"~0.5.3","es6-promise":"~3.1.2","exorcist":"~0.4.0","express":"~4.13.3","jasmine":"~2.3.2","jasmine-tools-riq":"~0.3.0","jquery":"^2.1.0","karma":"~0.13.14","karma-browserify":"~4.4.0","karma-chrome-launcher":"~0.2.1","karma-jasmine":"~0.3.6","karma-jasmine-jquery":"~0.1.1","karma-phantomjs-launcher":"~0.2.1","lodash":"~4.11.0","node-sass":"~3.4.1","phantomjs":"~1.9.18","polyfill-function-prototype-bind":"0.0.1","tiny-lr":"~0.2.1","watchify":"~3.6.0","yargs":"^1.2.2"},"browserify":{"transform":["aliasify"]},"aliasify":{"aliases":{"@grid":"./src/modules"}},"browserify-shim":{},"repository":{"type":"git","url":"git+https://github.com/relateiq/grid.git"},"keywords":["grid","spreadsheet","virtual","scroll"],"author":{"name":"Sterling Camden"},"license":"MIT","bugs":{"url":"https://github.com/relateiq/grid/issues"},"homepage":"https://github.com/relateiq/grid","gitHead":"f56e3f1d33b1f9473360ddce5edad46ed1f600bc","_id":"grid@3.3.5","_shasum":"6d2f07f8983f3d81236f8ef1fbc048263e7d48ce","_from":".","_npmVersion":"2.13.5","_nodeVersion":"0.12.2","_npmUser":{"name":"joemun","email":"joe.mun@relateiq.com"},"dist":{"shasum":"6d2f07f8983f3d81236f8ef1fbc048263e7d48ce","tarball":"https://registry.npmjs.org/grid/-/grid-3.3.5.tgz","integrity":"sha512-FtiIdzxv8AlM0dgLPdMQttJCVoNpdMxSJ0GjhUn3ZqxU1LdEEZsQ/h/zI8yVZe6+lFHYwlIKWNokciiaUFAr3Q==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIBdusnL7rekIdbQDPRcHf2R6jrFHzn5rjo4cJom2yX24AiAQi2AWF51Heo24RYTxv8moKGy92JMjdfR3KgrIMYHFHg=="}]},"maintainers":[{"name":"anthonyl","email":"anthony.liatsis@gmail.com"},{"name":"benshope","email":"ben@benshope.com"},{"name":"cdennison","email":"christy@relateiq.com"},{"name":"joechrz","email":"joechrz@gmail.com"},{"name":"joemun","email":"joe.mun@relateiq.com"},{"name":"john.fox","email":"john.fox@relateiq.com"},{"name":"jontomas","email":"jon@relateiq.com"},{"name":"keven425","email":"keven425@gmail.com"},{"name":"lerhaupt","email":"gary@relateiq.com"},{"name":"scamden","email":"rusty.camden@gmail.com"},{"name":"voxmatt","email":"public@matthewmartin.com"}],"_npmOperationalInternal":{"host":"packages-12-west.internal.npmjs.com","tmp":"tmp/grid-3.3.5.tgz_1476242636104_0.6429879167117178"},"directories":{}},"3.3.6":{"name":"grid","version":"3.3.6","description":"A highly scalable grid component written in javscript","main":"src/modules/grid-entry.js","publishConfig":{"registry":"https://registry.npmjs.org/"},"engines":{"node":">=0.10.0"},"iqproj":{"app":true},"scripts":{"test":"bin/iqb test","start":"bin/iqb start","preversion":"bin/iqb test","semantic-release":"semantic-release pre && npm publish && semantic-release post"},"dependencies":{"angular":"~1.4.7","angular-mocks":"~1.4.7","angular-route":"~1.4.7","capitalize":"^0.5.0","click-off":"~0.2.1","element-class":"^0.1.1","escape-stack":"~0.1.2","inner-text-shim":"~1.0.1","key":"^0.1.11","time-now":"~0.2.1"},"devDependencies":{"aliasify":"^1.5.0","browserify":"~12.0.1","browserify-istanbul":"~0.2.1","chokidar-cli":"~1.1.1","condition-circle":"~1.5.0","connect-livereload":"~0.5.3","es6-promise":"~3.1.2","exorcist":"~0.4.0","express":"~4.13.3","jasmine":"~2.3.2","jasmine-tools-riq":"~0.3.0","jquery":"^2.1.0","karma":"~0.13.14","karma-browserify":"~4.4.0","karma-chrome-launcher":"~0.2.1","karma-jasmine":"~0.3.6","karma-jasmine-jquery":"~0.1.1","karma-phantomjs-launcher":"~0.2.1","lodash":"~4.11.0","node-sass":"~3.4.1","phantomjs":"~1.9.18","polyfill-function-prototype-bind":"0.0.1","semantic-release":"^4.3.5","tiny-lr":"~0.2.1","watchify":"~3.6.0","yargs":"^1.2.2"},"browserify":{"transform":["aliasify"]},"aliasify":{"aliases":{"@grid":"./src/modules"}},"browserify-shim":{},"repository":{"type":"git","url":"git+https://github.com/relateiq/grid.git"},"keywords":["grid","spreadsheet","virtual","scroll"],"author":{"name":"Sterling Camden"},"license":"MIT","bugs":{"url":"https://github.com/relateiq/grid/issues"},"homepage":"https://github.com/relateiq/grid","config":{"commitizen":{"path":"cz-conventional-changelog"}},"release":{"verifyConditions":"condition-circle"},"gitHead":"f018030bb0a9643ebcd0e83f152d392a8e3e01ca","_id":"grid@3.3.6","_shasum":"826eb9382afd00ff7bff2f77b863054dfdfe91a6","_from":".","_npmVersion":"2.14.12","_nodeVersion":"4.2.6","_npmUser":{"name":"riqlandia-ci","email":"rusty.camden@gmail.com"},"dist":{"shasum":"826eb9382afd00ff7bff2f77b863054dfdfe91a6","tarball":"https://registry.npmjs.org/grid/-/grid-3.3.6.tgz","integrity":"sha512-GGjOTzG75J5h4hGDuvMZGoMeW+q80fiGCCU+5vd+Nm68nECKxAcO448k7J3rUfcznJssD03DWq5fJpGF7PeIeQ==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIQCivlN/oPuYaCt2dHLT7jDJ/pSRL/wrfeZEiJ+b1ms/fAIfExeXtn4MbKRWckw0VBZQw4FMCUpySy3pqa7rnItA/w=="}]},"maintainers":[{"name":"anthonyl","email":"anthony.liatsis@gmail.com"},{"name":"benshope","email":"ben@benshope.com"},{"name":"cdennison","email":"christy@relateiq.com"},{"name":"joechrz","email":"joechrz@gmail.com"},{"name":"joemun","email":"joe.mun@relateiq.com"},{"name":"john.fox","email":"john.fox@relateiq.com"},{"name":"jontomas","email":"jon@relateiq.com"},{"name":"keven425","email":"keven425@gmail.com"},{"name":"lerhaupt","email":"lerhaupt@gmail.com"},{"name":"riqlandia-ci","email":"rusty.camden@gmail.com"},{"name":"scamden","email":"rusty.camden@gmail.com"},{"name":"voxmatt","email":"public@matthewmartin.com"}],"_npmOperationalInternal":{"host":"packages-18-east.internal.npmjs.com","tmp":"tmp/grid-3.3.6.tgz_1478111399275_0.5389924799092114"},"directories":{}},"3.3.7":{"name":"grid","version":"3.3.7","description":"A highly scalable grid component written in javscript","main":"src/modules/grid-entry.js","publishConfig":{"registry":"https://registry.npmjs.org/"},"engines":{"node":">=0.10.0"},"iqproj":{"app":true},"scripts":{"test":"bin/iqb test","start":"bin/iqb start","preversion":"bin/iqb test","semantic-release":"semantic-release pre && npm publish && semantic-release post"},"dependencies":{"angular":"~1.4.7","angular-mocks":"~1.4.7","angular-route":"~1.4.7","capitalize":"^0.5.0","click-off":"~0.2.1","element-class":"^0.1.1","escape-stack":"~0.1.2","inner-text-shim":"~1.0.1","key":"^0.1.11","time-now":"~0.2.1"},"devDependencies":{"aliasify":"^1.5.0","browserify":"~12.0.1","browserify-istanbul":"~0.2.1","chokidar-cli":"~1.1.1","condition-circle":"~1.5.0","connect-livereload":"~0.5.3","es6-promise":"~3.1.2","exorcist":"~0.4.0","express":"~4.13.3","jasmine":"~2.3.2","jasmine-tools-riq":"~0.3.0","jquery":"^2.1.0","karma":"~0.13.14","karma-browserify":"~4.4.0","karma-chrome-launcher":"~0.2.1","karma-jasmine":"~0.3.6","karma-jasmine-jquery":"~0.1.1","karma-phantomjs-launcher":"~0.2.1","lodash":"~4.11.0","node-sass":"~3.4.1","phantomjs":"~1.9.18","polyfill-function-prototype-bind":"0.0.1","semantic-release":"^4.3.5","tiny-lr":"~0.2.1","watchify":"~3.6.0","yargs":"^1.2.2"},"browserify":{"transform":["aliasify"]},"aliasify":{"aliases":{"@grid":"./src/modules"}},"browserify-shim":{},"repository":{"type":"git","url":"git+https://github.com/relateiq/grid.git"},"keywords":["grid","spreadsheet","virtual","scroll"],"author":{"name":"Sterling Camden"},"license":"MIT","bugs":{"url":"https://github.com/relateiq/grid/issues"},"homepage":"https://github.com/relateiq/grid","config":{"commitizen":{"path":"cz-conventional-changelog"}},"release":{"verifyConditions":"condition-circle"},"gitHead":"6109c03ac2f26630363b754624774b05e781a9f0","_id":"grid@3.3.7","_shasum":"491a9f03acbc1e76c706588f70264b0fed09db70","_from":".","_npmVersion":"2.14.12","_nodeVersion":"4.2.6","_npmUser":{"name":"riqlandia-ci","email":"rusty.camden@gmail.com"},"dist":{"shasum":"491a9f03acbc1e76c706588f70264b0fed09db70","tarball":"https://registry.npmjs.org/grid/-/grid-3.3.7.tgz","integrity":"sha512-BAObZ56SUxpevh5VsI/JAj1WMMIKTYtn85G8QZiY4PPl9mB2waOP/bJdA1T/DgZ433rSblu1gMU2KF/Kw/QE9Q==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIFFhwI3jza2P/ynRwKa/u3BgBRoUsQ9WWIw7GMv3gDnEAiAh8ecVL18OE2Q3a5O8q12sTkElHfpyWiiyqCyq3ngk7A=="}]},"maintainers":[{"name":"anthonyl","email":"anthony.liatsis@gmail.com"},{"name":"benshope","email":"ben@benshope.com"},{"name":"cdennison","email":"christy@relateiq.com"},{"name":"joechrz","email":"joechrz@gmail.com"},{"name":"joemun","email":"joe.mun@relateiq.com"},{"name":"john.fox","email":"john.fox@relateiq.com"},{"name":"jontomas","email":"jon@relateiq.com"},{"name":"keven425","email":"keven425@gmail.com"},{"name":"lerhaupt","email":"lerhaupt@gmail.com"},{"name":"riqlandia-ci","email":"rusty.camden@gmail.com"},{"name":"scamden","email":"rusty.camden@gmail.com"},{"name":"voxmatt","email":"public@matthewmartin.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/grid-3.3.7.tgz_1495757535551_0.440311475424096"},"directories":{}},"4.0.0":{"name":"grid","version":"4.0.0","description":"A highly scalable grid component written in javscript","main":"src/modules/core/index.js","publishConfig":{"registry":"https://registry.npmjs.org/","tag":"next"},"engines":{"node":">=0.10.0"},"iqproj":{"app":true},"scripts":{"commitmsg":"validate-commit-msg","preversion":"npm run build","open:src":"babel-node tools/srcServer.js","dev":"npm-run-all --parallel open:src test:watch","clean":"rm -rf ./dist && mkdir dist","prebuild":"npm run clean && npm run test","build":"node tools/build.js","test":"node_modules/karma/bin/karma start --single-run --no-auto-watch karma.conf.js","test:watch":"node_modules/karma/bin/karma start karma.conf.js","semantic-release":"semantic-release pre && npm publish && semantic-release post"},"dependencies":{"capitalize":"^0.5.0","click-off":"~0.2.1","element-class":"^0.1.1","es6-object-assign":"~1.1.0","escape-stack":"~0.1.2","inner-text-shim":"~1.0.1","key":"^0.1.11","time-now":"~0.2.1"},"devDependencies":{"autoprefixer":"~6.4.0","awesome-typescript-loader":"~3.1.3","babel-cli":"~6.24.1","babel-loader":"~6.2.5","babel-preset-es2015":"~6.18.0","babel-preset-stage-1":"~6.13.0","browser-sync":"~2.18.12","condition-circle":"~1.5.0","copy-webpack-plugin":"~3.0.1","core-js-webpack-plugin":"~1.0.3","css-loader":"~0.24.0","ejs-compiled-loader":"~1.1.0","es6-promise":"~3.1.2","extract-text-webpack-plugin":"~1.0.1","file-loader":"~0.9.0","html-webpack-plugin":"~2.22.0","husky":"~0.13.3","jasmine":"~2.3.2","jasmine-tools-riq":"~0.3.2","jquery":"^2.1.0","karma":"~1.7.0","karma-chrome-launcher":"~0.2.1","karma-jasmine":"~0.3.6","karma-jasmine-jquery":"~0.1.1","karma-phantomjs-launcher":"~1.0.4","karma-sourcemap-loader":"~0.3.7","karma-webpack":"~2.0.3","lodash":"~4.11.0","node-sass":"~3.8.0","npm-run-all":"~4.0.2","phantomjs-prebuilt":"~2.1.14","polyfill-function-prototype-bind":"0.0.1","postcss-loader":"~0.11.0","sass-loader":"~4.1.1","semantic-release":"^4.3.5","source-map-loader":"~0.2.0","style-loader":"~0.13.1","transform-ts-paths":"^1.0.0","tslint":"^5.4.2","tslint-eslint-rules":"^4.1.1","typescript":"~2.4.1","url-loader":"~0.5.7","validate-commit-msg":"~2.12.1","webpack":"~1.14.0","webpack-bundle-analyzer":"^2.8.2","webpack-dev-middleware":"~1.6.1","webpack-fail-plugin":"~1.0.5","webpack-hot-middleware":"~2.12.2","webpack-md5-hash":"~0.0.5"},"repository":{"type":"git","url":"git+https://github.com/gridgrid/grid.git"},"keywords":["grid","spreadsheet","virtual","scroll"],"author":{"name":"Sterling Camden"},"license":"MIT","bugs":{"url":"https://github.com/gridgrid/grid/issues"},"homepage":"https://github.com/gridgrid/grid","config":{"commitizen":{"path":"cz-conventional-changelog"}},"release":{"verifyConditions":"condition-circle","branch":"next","fallbackTags":{"next":"latest"}},"gitHead":"caaac48d979768e6048f43adaff281181221050c","_id":"grid@4.0.0","_shasum":"95d45dabe5d6d38ff5ccdf952a8ac017e65ccb54","_from":".","_npmVersion":"3.10.10","_nodeVersion":"4.2.6","_npmUser":{"name":"riqlandia-ci","email":"rusty.camden@gmail.com"},"dist":{"shasum":"95d45dabe5d6d38ff5ccdf952a8ac017e65ccb54","tarball":"https://registry.npmjs.org/grid/-/grid-4.0.0.tgz","integrity":"sha512-8D9+/1tjJH0258A9TP5IEIObI1wFPD0zhcVgo0ygoX3MCxGFjUsKIIOrr8xEwE8sm2/BbR4QjG3jtJgfe4I7XQ==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDsCnztFyI3QMdY53n0sVDUaLtuyGXphvE+3bDXoa7A4wIhAJq36NeY2MnGqBGKPCqyH7k/9NDttYsDrb8uXhlv4YOu"}]},"maintainers":[{"email":"rusty.camden@gmail.com","name":"riqlandia-ci"},{"email":"ben@benshope.com","name":"benshope"},{"email":"christy@relateiq.com","name":"cdennison"},{"email":"public@matthewmartin.com","name":"voxmatt"},{"email":"joe.mun@salesforce.com","name":"joemun"},{"email":"keven425@gmail.com","name":"keven425"},{"email":"joechrz@gmail.com","name":"joechrz"},{"email":"john.fox@relateiq.com","name":"john.fox"},{"email":"jon@relateiq.com","name":"jontomas"},{"email":"lerhaupt@gmail.com","name":"lerhaupt"},{"email":"anthony.liatsis@gmail.com","name":"anthonyl"},{"email":"rusty.camden@gmail.com","name":"scamden"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/grid-4.0.0.tgz_1503530051236_0.1615524017252028"},"directories":{}},"4.1.0":{"name":"grid","version":"4.1.0","description":"A highly scalable grid component written in javscript","main":"dist/bundle.js","typings":"dist/modules/core/index.d.ts","publishConfig":{"registry":"https://registry.npmjs.org/","tag":"next"},"engines":{"node":">=0.10.0"},"iqproj":{"app":true},"scripts":{"commitmsg":"validate-commit-msg","preversion":"npm run build","open:src":"babel-node tools/srcServer.js","dev":"npm-run-all --parallel open:src test:watch","clean":"rm -rf ./dist && mkdir dist","prebuild":"npm run clean && npm run test","build":"node tools/build.js","test":"node_modules/karma/bin/karma start --single-run --no-auto-watch karma.conf.js","test:watch":"node_modules/karma/bin/karma start karma.conf.js","semantic-release":"semantic-release pre && npm publish && semantic-release post"},"dependencies":{"capitalize":"^0.5.0","click-off":"~0.2.1","element-class":"^0.1.1","es6-object-assign":"~1.1.0","escape-stack":"~0.1.2","inner-text-shim":"~1.0.1","key":"^0.1.11","time-now":"~0.2.1"},"devDependencies":{"autoprefixer":"~6.4.0","awesome-typescript-loader":"~3.2.3","babel-cli":"~6.24.1","babel-loader":"~6.2.5","babel-preset-es2015":"~6.18.0","babel-preset-stage-1":"~6.13.0","browser-sync":"~2.18.12","condition-circle":"~1.5.0","copy-webpack-plugin":"~3.0.1","core-js-webpack-plugin":"~1.0.3","css-loader":"~0.24.0","ejs-compiled-loader":"~1.1.0","es6-promise":"~3.1.2","extract-text-webpack-plugin":"~3.0.1","file-loader":"~0.9.0","html-webpack-plugin":"~2.22.0","husky":"~0.13.3","jasmine":"~2.3.2","jasmine-tools-riq":"~0.3.2","jquery":"^2.1.0","karma":"~1.7.1","karma-chrome-launcher":"~0.2.1","karma-jasmine":"~0.3.6","karma-jasmine-jquery":"~0.1.1","karma-phantomjs-launcher":"~1.0.4","karma-sourcemap-loader":"~0.3.7","karma-webpack":"~2.0.4","lodash":"~4.11.0","node-sass":"~4.5.3","npm-run-all":"~4.0.2","phantomjs-prebuilt":"~2.1.14","polyfill-function-prototype-bind":"0.0.1","postcss-loader":"~0.11.0","sass-loader":"~4.1.1","semantic-release":"^4.3.5","source-map-loader":"~0.2.0","style-loader":"~0.13.1","transform-ts-paths":"^1.0.0","ts-loader":"~2.3.7","tslint":"^5.4.2","tslint-eslint-rules":"^4.1.1","typescript":"~2.4.1","url-loader":"~0.5.7","validate-commit-msg":"~2.12.1","webpack":"~3.6.0","webpack-bundle-analyzer":"^2.8.2","webpack-dev-middleware":"~1.6.1","webpack-fail-plugin":"~1.0.5","webpack-hot-middleware":"~2.12.2","webpack-md5-hash":"~0.0.5"},"repository":{"type":"git","url":"git+https://github.com/gridgrid/grid.git"},"keywords":["grid","spreadsheet","virtual","scroll"],"author":{"name":"Sterling Camden"},"license":"MIT","bugs":{"url":"https://github.com/gridgrid/grid/issues"},"homepage":"https://github.com/gridgrid/grid","config":{"commitizen":{"path":"cz-conventional-changelog"}},"release":{"verifyConditions":"condition-circle","branch":"next","fallbackTags":{"next":"latest"}},"gitHead":"7972c7a4fc442cb3d1fb2efd15d1691a8bc405b4","_id":"grid@4.1.0","_npmVersion":"5.4.2","_nodeVersion":"6.3.0","_npmUser":{"name":"riqlandia-ci","email":"rusty.camden@gmail.com"},"dist":{"integrity":"sha512-t5UzTzRQwSgbVOGDMnD3xP2GLIvqiWtjIJA1jyHnS/WufhK2I0rFgLC0wCcDU1WozSeJtBZPlIlGQ62YpW6xVg==","shasum":"48ea76331669a3c03d09ce83cfc2b3b52c59d70d","tarball":"https://registry.npmjs.org/grid/-/grid-4.1.0.tgz","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCTiW7wYa4Qtu4O1770neXv/HzHPDvufNZtn1BANYkNGQIhAJegHbNfKZoHYaBA6co7tQ1MRrFtdp4b1mggTgt+0/3n"}]},"maintainers":[{"email":"rusty.camden@gmail.com","name":"riqlandia-ci"},{"email":"ben@benshope.com","name":"benshope"},{"email":"christy@relateiq.com","name":"cdennison"},{"email":"public@matthewmartin.com","name":"voxmatt"},{"email":"joe.mun@salesforce.com","name":"joemun"},{"email":"keven425@gmail.com","name":"keven425"},{"email":"joechrz@gmail.com","name":"joechrz"},{"email":"john.fox@relateiq.com","name":"john.fox"},{"email":"jon@relateiq.com","name":"jontomas"},{"email":"lerhaupt@gmail.com","name":"lerhaupt"},{"email":"anthony.liatsis@gmail.com","name":"anthonyl"},{"email":"rusty.camden@gmail.com","name":"scamden"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/grid-4.1.0.tgz_1507241675104_0.6379747446626425"},"directories":{}},"4.1.1":{"name":"grid","version":"4.1.1","description":"A highly scalable grid component written in javscript","main":"dist/bundle.js","typings":"dist/modules/core/index.d.ts","publishConfig":{"registry":"https://registry.npmjs.org/","tag":"next"},"engines":{"node":">=0.10.0"},"iqproj":{"app":true},"scripts":{"commitmsg":"validate-commit-msg","preversion":"npm run build","open:src":"babel-node tools/srcServer.js","dev":"npm-run-all --parallel open:src test:watch","clean":"rm -rf ./dist && mkdir dist","prebuild":"npm run clean && npm run test","build":"node tools/build.js","test":"node_modules/karma/bin/karma start --single-run --no-auto-watch karma.conf.js","test:watch":"node_modules/karma/bin/karma start karma.conf.js","semantic-release":"semantic-release pre && npm publish && semantic-release post"},"dependencies":{"capitalize":"^0.5.0","click-off":"~0.2.1","element-class":"^0.1.1","es6-object-assign":"~1.1.0","escape-stack":"~0.1.2","inner-text-shim":"~1.0.1","key":"^0.1.11","time-now":"~0.2.1"},"devDependencies":{"autoprefixer":"~6.4.0","awesome-typescript-loader":"~3.2.3","babel-cli":"~6.24.1","babel-loader":"~6.2.5","babel-preset-es2015":"~6.18.0","babel-preset-stage-1":"~6.13.0","browser-sync":"~2.18.12","condition-circle":"~1.5.0","copy-webpack-plugin":"~3.0.1","core-js-webpack-plugin":"~1.0.3","css-loader":"~0.24.0","ejs-compiled-loader":"~1.1.0","es6-promise":"~3.1.2","extract-text-webpack-plugin":"~3.0.1","file-loader":"~0.9.0","html-webpack-plugin":"~2.22.0","husky":"~0.13.3","jasmine":"~2.3.2","jasmine-tools-riq":"~0.3.2","jquery":"^2.1.0","karma":"~1.7.1","karma-chrome-launcher":"~0.2.1","karma-jasmine":"~0.3.6","karma-jasmine-jquery":"~0.1.1","karma-phantomjs-launcher":"~1.0.4","karma-sourcemap-loader":"~0.3.7","karma-webpack":"~2.0.4","lodash":"~4.11.0","node-sass":"~4.5.3","npm-run-all":"~4.0.2","phantomjs-prebuilt":"~2.1.14","polyfill-function-prototype-bind":"0.0.1","postcss-loader":"~0.11.0","sass-loader":"~4.1.1","semantic-release":"^4.3.5","source-map-loader":"~0.2.0","style-loader":"~0.13.1","transform-ts-paths":"^1.0.0","ts-loader":"~2.3.7","tslint":"^5.4.2","tslint-eslint-rules":"^4.1.1","typescript":"~2.4.1","url-loader":"~0.5.7","validate-commit-msg":"~2.12.1","webpack":"~3.6.0","webpack-bundle-analyzer":"^2.8.2","webpack-dev-middleware":"~1.6.1","webpack-fail-plugin":"~1.0.5","webpack-hot-middleware":"~2.12.2","webpack-md5-hash":"~0.0.5"},"repository":{"type":"git","url":"git+https://github.com/gridgrid/grid.git"},"keywords":["grid","spreadsheet","virtual","scroll"],"author":{"name":"Sterling Camden"},"license":"MIT","bugs":{"url":"https://github.com/gridgrid/grid/issues"},"homepage":"https://github.com/gridgrid/grid","config":{"commitizen":{"path":"cz-conventional-changelog"}},"release":{"verifyConditions":"condition-circle","branch":"next","fallbackTags":{"next":"latest"}},"gitHead":"bf0519286b02b6f58e198e925d490f12d8ee171a","_id":"grid@4.1.1","_npmVersion":"5.4.2","_nodeVersion":"6.3.0","_npmUser":{"name":"riqlandia-ci","email":"rusty.camden@gmail.com"},"dist":{"integrity":"sha512-RxwzqrR3vadkPqV3i80thn1EigEyt+Yh1rZDQHQC+D7JIr1dPB6cJaXxJPcjGEzCS2lKqlwN/l2OcpdbjQeh1g==","shasum":"65778a1085d4f5621a1166f83adf1953a25ed323","tarball":"https://registry.npmjs.org/grid/-/grid-4.1.1.tgz","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIHLfkvalJTXu3Vh1TiGWa1vA/pUBi8dH+fFCwov5J5O8AiAlyjRs4ynQf3tTRl8uIknUM7eA6VXOemRcv5PBJS7inw=="}]},"maintainers":[{"email":"rusty.camden@gmail.com","name":"riqlandia-ci"},{"email":"ben@benshope.com","name":"benshope"},{"email":"christy@relateiq.com","name":"cdennison"},{"email":"public@matthewmartin.com","name":"voxmatt"},{"email":"joe.mun@salesforce.com","name":"joemun"},{"email":"keven425@gmail.com","name":"keven425"},{"email":"joechrz@gmail.com","name":"joechrz"},{"email":"john.fox@relateiq.com","name":"john.fox"},{"email":"jon@relateiq.com","name":"jontomas"},{"email":"lerhaupt@gmail.com","name":"lerhaupt"},{"email":"anthony.liatsis@gmail.com","name":"anthonyl"},{"email":"rusty.camden@gmail.com","name":"scamden"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/grid-4.1.1.tgz_1507248274909_0.04502895753830671"},"directories":{}},"4.1.2":{"name":"grid","version":"4.1.2","description":"A highly scalable grid component written in javscript","main":"dist/bundle.js","typings":"dist/modules/core/index.d.ts","publishConfig":{"registry":"https://registry.npmjs.org/","tag":"next"},"engines":{"node":">=0.10.0"},"iqproj":{"app":true},"scripts":{"commitmsg":"validate-commit-msg","preversion":"npm run build","open:src":"babel-node tools/srcServer.js","dev":"npm-run-all --parallel open:src test:watch","clean":"rm -rf ./dist && mkdir dist","prebuild":"npm run clean && npm run test","build":"node tools/build.js","test":"node_modules/karma/bin/karma start --single-run --no-auto-watch karma.conf.js","test:watch":"node_modules/karma/bin/karma start karma.conf.js","semantic-release":"semantic-release pre && npm publish && semantic-release post"},"dependencies":{"capitalize":"^0.5.0","click-off":"~0.2.1","element-class":"^0.1.1","es6-object-assign":"~1.1.0","escape-stack":"~0.1.2","inner-text-shim":"~1.0.1","key":"^0.1.11","time-now":"~0.2.1"},"devDependencies":{"@types/jasmine":"~2.6.0","@types/karma":"~1.7.0","autoprefixer":"~6.4.0","awesome-typescript-loader":"~3.2.3","babel-cli":"~6.24.1","babel-loader":"~6.2.5","babel-preset-es2015":"~6.18.0","babel-preset-stage-1":"~6.13.0","browser-sync":"~2.18.12","condition-circle":"~1.5.0","copy-webpack-plugin":"~3.0.1","core-js-webpack-plugin":"~1.0.3","css-loader":"~0.24.0","ejs-compiled-loader":"~1.1.0","es6-promise":"~3.1.2","extract-text-webpack-plugin":"~3.0.1","file-loader":"~0.9.0","html-webpack-plugin":"~2.22.0","husky":"~0.13.3","jasmine":"~2.3.2","jasmine-tools-riq":"~0.3.2","jquery":"^2.1.0","karma":"~1.7.1","karma-chrome-launcher":"~0.2.1","karma-jasmine":"~0.3.6","karma-jasmine-jquery":"~0.1.1","karma-phantomjs-launcher":"~1.0.4","karma-sourcemap-loader":"~0.3.7","karma-webpack":"~2.0.4","lodash":"~4.11.0","node-sass":"~4.5.3","npm-run-all":"~4.0.2","phantomjs-prebuilt":"~2.1.14","polyfill-function-prototype-bind":"0.0.1","postcss-loader":"~0.11.0","sass-loader":"~4.1.1","semantic-release":"^4.3.5","source-map-loader":"~0.2.0","style-loader":"~0.13.1","transform-ts-paths":"^1.0.0","ts-loader":"~2.3.7","tslint":"^5.4.2","tslint-eslint-rules":"^4.1.1","typescript":"~2.4.1","url-loader":"~0.5.7","validate-commit-msg":"~2.12.1","webpack":"~3.6.0","webpack-bundle-analyzer":"^2.8.2","webpack-dev-middleware":"~1.6.1","webpack-fail-plugin":"~1.0.5","webpack-hot-middleware":"~2.12.2","webpack-md5-hash":"~0.0.5"},"repository":{"type":"git","url":"git+https://github.com/gridgrid/grid.git"},"keywords":["grid","spreadsheet","virtual","scroll"],"author":{"name":"Sterling Camden"},"license":"MIT","bugs":{"url":"https://github.com/gridgrid/grid/issues"},"homepage":"https://github.com/gridgrid/grid","config":{"commitizen":{"path":"cz-conventional-changelog"}},"release":{"verifyConditions":"condition-circle","branch":"next","fallbackTags":{"next":"latest"}},"gitHead":"e7d8ab5768907140319af33ad4c9d3501bbd1fae","_id":"grid@4.1.2","_npmVersion":"5.4.2","_nodeVersion":"6.3.0","_npmUser":{"name":"riqlandia-ci","email":"rusty.camden@gmail.com"},"dist":{"integrity":"sha512-0MGelvFCTrjmuplygey0KGMNk2zr8gKs693Pye9TCVH3kyWXRH88boFGhT6DcyT3XQL+4xIOVcnSNr0m3ogVfw==","shasum":"78c31ce2a23ff6305d4507cccf0bb2bf3479945a","tarball":"https://registry.npmjs.org/grid/-/grid-4.1.2.tgz","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDG9kc91iA9L+6na/BF+B3YSej6zt3Zf32BPGDTdV26NwIgUgubDoL6p9h9PEmagAjIUaMtgWcsfNpijU3BH+QJdtA="}]},"maintainers":[{"email":"rusty.camden@gmail.com","name":"riqlandia-ci"},{"email":"ben@benshope.com","name":"benshope"},{"email":"christy@relateiq.com","name":"cdennison"},{"email":"public@matthewmartin.com","name":"voxmatt"},{"email":"joe.mun@salesforce.com","name":"joemun"},{"email":"keven425@gmail.com","name":"keven425"},{"email":"joechrz@gmail.com","name":"joechrz"},{"email":"john.fox@relateiq.com","name":"john.fox"},{"email":"jon@relateiq.com","name":"jontomas"},{"email":"lerhaupt@gmail.com","name":"lerhaupt"},{"email":"anthony.liatsis@gmail.com","name":"anthonyl"},{"email":"rusty.camden@gmail.com","name":"scamden"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/grid-4.1.2.tgz_1507251362756_0.14969620038755238"},"directories":{}},"4.1.3":{"name":"grid","version":"4.1.3","description":"A highly scalable grid component written in javscript","main":"dist/bundle.js","typings":"dist/modules/core/index.d.ts","publishConfig":{"registry":"https://registry.npmjs.org/","tag":"next"},"engines":{"node":">=0.10.0"},"iqproj":{"app":true},"scripts":{"commitmsg":"validate-commit-msg","preversion":"npm run build","open:src":"babel-node tools/srcServer.js","dev":"npm-run-all --parallel open:src test:watch","clean":"rm -rf ./dist && mkdir dist","prebuild":"npm run clean && npm run test","build":"node tools/build.js","test":"node_modules/karma/bin/karma start --single-run --no-auto-watch karma.conf.js","test:watch":"node_modules/karma/bin/karma start karma.conf.js","semantic-release":"semantic-release pre && npm publish && semantic-release post"},"dependencies":{"capitalize":"^0.5.0","click-off":"~0.2.1","element-class":"^0.1.1","es6-object-assign":"~1.1.0","escape-stack":"~0.1.2","inner-text-shim":"~1.0.1","key":"^0.1.11","time-now":"~0.2.1"},"devDependencies":{"@types/jasmine":"~2.6.0","@types/karma":"~1.7.0","autoprefixer":"~6.4.0","awesome-typescript-loader":"~3.2.3","babel-cli":"~6.24.1","babel-loader":"~6.2.5","babel-preset-es2015":"~6.18.0","babel-preset-stage-1":"~6.13.0","browser-sync":"~2.18.12","condition-circle":"~1.5.0","copy-webpack-plugin":"~3.0.1","core-js-webpack-plugin":"~1.0.3","css-loader":"~0.24.0","ejs-compiled-loader":"~1.1.0","es6-promise":"~3.1.2","extract-text-webpack-plugin":"~3.0.1","file-loader":"~0.9.0","html-webpack-plugin":"~2.22.0","husky":"~0.13.3","jasmine":"~2.3.2","jasmine-tools-riq":"~0.3.2","jquery":"^2.1.0","karma":"~1.7.1","karma-chrome-launcher":"~0.2.1","karma-jasmine":"~0.3.6","karma-jasmine-jquery":"~0.1.1","karma-phantomjs-launcher":"~1.0.4","karma-sourcemap-loader":"~0.3.7","karma-webpack":"~2.0.4","lodash":"~4.11.0","node-sass":"~4.5.3","npm-run-all":"~4.0.2","phantomjs-prebuilt":"~2.1.14","polyfill-function-prototype-bind":"0.0.1","postcss-loader":"~0.11.0","sass-loader":"~4.1.1","semantic-release":"^4.3.5","source-map-loader":"~0.2.0","style-loader":"~0.13.1","transform-ts-paths":"^1.0.0","ts-loader":"~2.3.7","tslint":"^5.4.2","tslint-eslint-rules":"^4.1.1","typescript":"~2.4.1","url-loader":"~0.5.7","validate-commit-msg":"~2.12.1","webpack":"~3.6.0","webpack-bundle-analyzer":"^2.8.2","webpack-dev-middleware":"~1.6.1","webpack-fail-plugin":"~1.0.5","webpack-hot-middleware":"~2.12.2","webpack-md5-hash":"~0.0.5"},"repository":{"type":"git","url":"git+https://github.com/gridgrid/grid.git"},"keywords":["grid","spreadsheet","virtual","scroll"],"author":{"name":"Sterling Camden"},"license":"MIT","bugs":{"url":"https://github.com/gridgrid/grid/issues"},"homepage":"https://github.com/gridgrid/grid","config":{"commitizen":{"path":"cz-conventional-changelog"}},"release":{"verifyConditions":"condition-circle","branch":"next","fallbackTags":{"next":"latest"}},"gitHead":"569a1fc1ee5e763de0cdbe5b89070d938179f545","_id":"grid@4.1.3","_npmVersion":"5.4.2","_nodeVersion":"6.3.0","_npmUser":{"name":"riqlandia-ci","email":"rusty.camden@gmail.com"},"dist":{"integrity":"sha512-2rW104c7IXf7GlxO656D4AQp5GJZT7wl0AcJUgB3k0u1KuJNM5buks20FjrVJJrQ9u43V73GDO4JEWSMeR/+mg==","shasum":"c9a196d680116040662bf7feac45ee7bc7c9585e","tarball":"https://registry.npmjs.org/grid/-/grid-4.1.3.tgz","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIFjiU09EyjE38pZTIdOlR4lTEvoMtrP+3TBW2Qdm4RoWAiA5xTqlB36jyk5Ch2NGn6bT+47jelBNbiC4ckYTLOfihg=="}]},"maintainers":[{"email":"rusty.camden@gmail.com","name":"riqlandia-ci"},{"email":"ben@benshope.com","name":"benshope"},{"email":"christy@relateiq.com","name":"cdennison"},{"email":"public@matthewmartin.com","name":"voxmatt"},{"email":"joe.mun@salesforce.com","name":"joemun"},{"email":"keven425@gmail.com","name":"keven425"},{"email":"joechrz@gmail.com","name":"joechrz"},{"email":"john.fox@relateiq.com","name":"john.fox"},{"email":"jon@relateiq.com","name":"jontomas"},{"email":"lerhaupt@gmail.com","name":"lerhaupt"},{"email":"anthony.liatsis@gmail.com","name":"anthonyl"},{"email":"rusty.camden@gmail.com","name":"scamden"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/grid-4.1.3.tgz_1507335986722_0.3996139189694077"},"directories":{}},"4.1.4":{"name":"grid","version":"4.1.4","description":"A highly scalable grid component written in javscript","main":"dist/bundle.js","typings":"dist/modules/core/index.d.ts","publishConfig":{"registry":"https://registry.npmjs.org/","tag":"next"},"engines":{"node":">=0.10.0"},"iqproj":{"app":true},"scripts":{"commitmsg":"validate-commit-msg","preversion":"npm run build","open:src":"babel-node tools/srcServer.js","dev":"npm-run-all --parallel open:src test:watch","clean":"rm -rf ./dist && mkdir dist","prebuild":"npm run clean && npm run test","build":"node tools/build.js","test":"node_modules/karma/bin/karma start --single-run --no-auto-watch karma.conf.js","test:watch":"node_modules/karma/bin/karma start karma.conf.js","semantic-release":"semantic-release pre && npm publish && semantic-release post"},"dependencies":{"capitalize":"^0.5.0","click-off":"~0.2.1","element-class":"^0.1.1","es6-object-assign":"~1.1.0","escape-stack":"~0.1.2","inner-text-shim":"~1.0.1","key":"^0.1.11","time-now":"~0.2.1"},"devDependencies":{"@types/jasmine":"~2.6.0","@types/karma":"~1.7.0","autoprefixer":"~6.4.0","awesome-typescript-loader":"~3.2.3","babel-cli":"~6.24.1","babel-loader":"~6.2.5","babel-preset-es2015":"~6.18.0","babel-preset-stage-1":"~6.13.0","browser-sync":"~2.18.12","condition-circle":"~1.5.0","copy-webpack-plugin":"~3.0.1","core-js-webpack-plugin":"~1.0.3","css-loader":"~0.24.0","ejs-compiled-loader":"~1.1.0","es6-promise":"~3.1.2","extract-text-webpack-plugin":"~3.0.1","file-loader":"~0.9.0","html-webpack-plugin":"~2.22.0","husky":"~0.13.3","jasmine":"~2.3.2","jasmine-tools-riq":"~0.3.2","jquery":"^2.1.0","karma":"~1.7.1","karma-chrome-launcher":"~0.2.1","karma-jasmine":"~0.3.6","karma-jasmine-jquery":"~0.1.1","karma-phantomjs-launcher":"~1.0.4","karma-sourcemap-loader":"~0.3.7","karma-webpack":"~2.0.4","lodash":"~4.11.0","node-sass":"~4.5.3","npm-run-all":"~4.0.2","phantomjs-prebuilt":"~2.1.14","polyfill-function-prototype-bind":"0.0.1","postcss-loader":"~0.11.0","sass-loader":"~4.1.1","semantic-release":"^4.3.5","source-map-loader":"~0.2.0","style-loader":"~0.13.1","transform-ts-paths":"^1.0.0","ts-loader":"~2.3.7","tslint":"^5.4.2","tslint-eslint-rules":"^4.1.1","typescript":"~2.4.1","url-loader":"~0.5.7","validate-commit-msg":"~2.12.1","webpack":"~3.6.0","webpack-bundle-analyzer":"^2.8.2","webpack-dev-middleware":"~1.6.1","webpack-fail-plugin":"~1.0.5","webpack-hot-middleware":"~2.12.2","webpack-md5-hash":"~0.0.5"},"repository":{"type":"git","url":"git+https://github.com/gridgrid/grid.git"},"keywords":["grid","spreadsheet","virtual","scroll"],"author":{"name":"Sterling Camden"},"license":"MIT","bugs":{"url":"https://github.com/gridgrid/grid/issues"},"homepage":"https://github.com/gridgrid/grid","config":{"commitizen":{"path":"cz-conventional-changelog"}},"release":{"verifyConditions":"condition-circle","branch":"next","fallbackTags":{"next":"latest"}},"gitHead":"a4b4da3eec9b25ea6a445b138d861fad57f0a5ef","_id":"grid@4.1.4","_npmVersion":"5.4.2","_nodeVersion":"6.3.0","_npmUser":{"name":"riqlandia-ci","email":"rusty.camden@gmail.com"},"dist":{"integrity":"sha512-J5zkAWwQcQobwrN0eslwoXS3DMI+l1SfODm0z2hJTO0+01rF3Pfq9HwbDrCF5G8/rsdVE9pkvjAFaLsYOUCJUg==","shasum":"dec4fbf9a82b21821282e990c9518aa274128b64","tarball":"https://registry.npmjs.org/grid/-/grid-4.1.4.tgz","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCICmh7ycNa4mG1DhKsXNYVq+k1S/UBcRg8c/p0WxPIM4YAiEA1TaWNmC6Ba9uYb5qPqVapRmDDLh5FRf86Pjc3e55bnE="}]},"maintainers":[{"email":"rusty.camden@gmail.com","name":"riqlandia-ci"},{"email":"ben@benshope.com","name":"benshope"},{"email":"christy@relateiq.com","name":"cdennison"},{"email":"public@matthewmartin.com","name":"voxmatt"},{"email":"joe.mun@salesforce.com","name":"joemun"},{"email":"keven425@gmail.com","name":"keven425"},{"email":"joechrz@gmail.com","name":"joechrz"},{"email":"john.fox@relateiq.com","name":"john.fox"},{"email":"jon@relateiq.com","name":"jontomas"},{"email":"lerhaupt@gmail.com","name":"lerhaupt"},{"email":"anthony.liatsis@gmail.com","name":"anthonyl"},{"email":"rusty.camden@gmail.com","name":"scamden"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/grid-4.1.4.tgz_1507596697038_0.612455508671701"},"directories":{}},"4.1.5":{"name":"grid","version":"4.1.5","description":"A highly scalable grid component written in javscript","main":"dist/bundle.js","typings":"dist/modules/core/index.d.ts","publishConfig":{"registry":"https://registry.npmjs.org/","tag":"next"},"engines":{"node":">=0.10.0"},"iqproj":{"app":true},"scripts":{"commitmsg":"validate-commit-msg","preversion":"npm run build","open:src":"babel-node tools/srcServer.js","dev":"npm-run-all --parallel open:src test:watch","clean":"rm -rf ./dist && mkdir dist","prebuild":"npm run clean && npm run test","build":"node tools/build.js","test":"node_modules/karma/bin/karma start --single-run --no-auto-watch karma.conf.js","test:watch":"node_modules/karma/bin/karma start karma.conf.js","semantic-release":"semantic-release pre && npm publish && semantic-release post"},"dependencies":{"capitalize":"^0.5.0","click-off":"~0.2.1","element-class":"^0.1.1","es6-object-assign":"~1.1.0","escape-stack":"~0.1.2","inner-text-shim":"~1.0.1","key":"^0.1.11","time-now":"~0.2.1"},"devDependencies":{"@types/jasmine":"~2.6.0","@types/karma":"~1.7.0","autoprefixer":"~6.4.0","awesome-typescript-loader":"~3.2.3","babel-cli":"~6.24.1","babel-loader":"~6.2.5","babel-preset-es2015":"~6.18.0","babel-preset-stage-1":"~6.13.0","browser-sync":"~2.18.12","condition-circle":"~1.5.0","copy-webpack-plugin":"~3.0.1","core-js-webpack-plugin":"~1.0.3","css-loader":"~0.24.0","ejs-compiled-loader":"~1.1.0","es6-promise":"~3.1.2","extract-text-webpack-plugin":"~3.0.1","file-loader":"~0.9.0","html-webpack-plugin":"~2.22.0","husky":"~0.13.3","jasmine":"~2.3.2","jasmine-tools-riq":"~0.3.2","jquery":"^2.1.0","karma":"~1.7.1","karma-chrome-launcher":"~0.2.1","karma-jasmine":"~0.3.6","karma-jasmine-jquery":"~0.1.1","karma-phantomjs-launcher":"~1.0.4","karma-sourcemap-loader":"~0.3.7","karma-webpack":"~2.0.4","lodash":"~4.11.0","node-sass":"~4.5.3","npm-run-all":"~4.0.2","phantomjs-prebuilt":"~2.1.14","polyfill-function-prototype-bind":"0.0.1","postcss-loader":"~0.11.0","sass-loader":"~4.1.1","semantic-release":"^4.3.5","source-map-loader":"~0.2.0","style-loader":"~0.13.1","transform-ts-paths":"^1.0.0","ts-loader":"~2.3.7","tslint":"^5.4.2","tslint-eslint-rules":"^4.1.1","typescript":"~2.4.1","url-loader":"~0.5.7","validate-commit-msg":"~2.12.1","webpack":"~3.6.0","webpack-bundle-analyzer":"^2.8.2","webpack-dev-middleware":"~1.6.1","webpack-fail-plugin":"~1.0.5","webpack-hot-middleware":"~2.12.2","webpack-md5-hash":"~0.0.5"},"repository":{"type":"git","url":"git+https://github.com/gridgrid/grid.git"},"keywords":["grid","spreadsheet","virtual","scroll"],"author":{"name":"Sterling Camden"},"license":"MIT","bugs":{"url":"https://github.com/gridgrid/grid/issues"},"homepage":"https://github.com/gridgrid/grid","config":{"commitizen":{"path":"cz-conventional-changelog"}},"release":{"verifyConditions":"condition-circle","branch":"next","fallbackTags":{"next":"latest"}},"gitHead":"85cdcf12362980775f602ac6b40129cec4da8677","_id":"grid@4.1.5","_npmVersion":"5.4.2","_nodeVersion":"6.3.0","_npmUser":{"name":"riqlandia-ci","email":"rusty.camden@gmail.com"},"dist":{"integrity":"sha512-sxTJiOxmTMkdSg35sAdgk4RZcnGslDR1F0P9LRGLvZNW2rN4C4jABfs/60z6qdxevfk1FnUM+Xbi3xZhwEN5MQ==","shasum":"0ab3676d9583e7a2b0887ab7c233c48d58ac8acd","tarball":"https://registry.npmjs.org/grid/-/grid-4.1.5.tgz","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDkOEnDC5iAiEvDa2lDNF5NXYtr3IbgZLjB7X/6kFplYwIgac/ZEKiC+wiF8AZiksrWBZMM+5zcJ5E5NfocmpZ1fUY="}]},"maintainers":[{"email":"rusty.camden@gmail.com","name":"riqlandia-ci"},{"email":"ben@benshope.com","name":"benshope"},{"email":"christy@relateiq.com","name":"cdennison"},{"email":"public@matthewmartin.com","name":"voxmatt"},{"email":"joe.mun@salesforce.com","name":"joemun"},{"email":"keven425@gmail.com","name":"keven425"},{"email":"joechrz@gmail.com","name":"joechrz"},{"email":"john.fox@relateiq.com","name":"john.fox"},{"email":"jon@relateiq.com","name":"jontomas"},{"email":"lerhaupt@gmail.com","name":"lerhaupt"},{"email":"anthony.liatsis@gmail.com","name":"anthonyl"},{"email":"rusty.camden@gmail.com","name":"scamden"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/grid-4.1.5.tgz_1507761995456_0.9982403828762472"},"directories":{}},"4.2.0":{"name":"grid","version":"4.2.0","description":"A highly scalable grid component written in javscript","main":"dist/bundle.js","typings":"dist/modules/core/index.d.ts","publishConfig":{"registry":"https://registry.npmjs.org/","tag":"next"},"engines":{"node":">=0.10.0"},"iqproj":{"app":true},"scripts":{"commitmsg":"validate-commit-msg","preversion":"npm run build","open:src":"babel-node tools/srcServer.js","dev":"npm-run-all --parallel open:src test:watch","clean":"rm -rf ./dist && mkdir dist","prebuild":"npm run clean && npm run test","build":"node tools/build.js","test":"node_modules/karma/bin/karma start --single-run --no-auto-watch karma.conf.js","test:watch":"node_modules/karma/bin/karma start karma.conf.js","semantic-release":"semantic-release pre && npm publish && semantic-release post"},"dependencies":{"capitalize":"^0.5.0","click-off":"~0.2.1","element-class":"^0.1.1","es6-object-assign":"~1.1.0","escape-stack":"~0.1.2","inner-text-shim":"~1.0.1","key":"^0.1.11","time-now":"~0.2.1"},"devDependencies":{"@types/jasmine":"~2.6.0","@types/karma":"~1.7.0","autoprefixer":"~6.4.0","awesome-typescript-loader":"~3.2.3","babel-cli":"~6.24.1","babel-loader":"~6.2.5","babel-preset-es2015":"~6.18.0","babel-preset-stage-1":"~6.13.0","browser-sync":"~2.18.12","condition-circle":"~1.5.0","copy-webpack-plugin":"~3.0.1","core-js-webpack-plugin":"~1.0.3","css-loader":"~0.24.0","ejs-compiled-loader":"~1.1.0","es6-promise":"~3.1.2","extract-text-webpack-plugin":"~3.0.1","file-loader":"~0.9.0","html-webpack-plugin":"~2.22.0","husky":"~0.13.3","jasmine":"~2.3.2","jasmine-tools-riq":"~0.3.2","jquery":"^2.1.0","karma":"~1.7.1","karma-chrome-launcher":"~0.2.1","karma-jasmine":"~0.3.6","karma-jasmine-jquery":"~0.1.1","karma-phantomjs-launcher":"~1.0.4","karma-sourcemap-loader":"~0.3.7","karma-webpack":"~2.0.4","lodash":"~4.11.0","node-sass":"~4.5.3","npm-run-all":"~4.0.2","phantomjs-prebuilt":"~2.1.14","polyfill-function-prototype-bind":"0.0.1","postcss-loader":"~0.11.0","sass-loader":"~4.1.1","semantic-release":"^4.3.5","source-map-loader":"~0.2.0","style-loader":"~0.13.1","transform-ts-paths":"^1.0.0","ts-loader":"~2.3.7","tslint":"^5.4.2","tslint-eslint-rules":"^4.1.1","typescript":"~2.4.1","url-loader":"~0.5.7","validate-commit-msg":"~2.12.1","webpack":"~3.6.0","webpack-bundle-analyzer":"^2.8.2","webpack-dev-middleware":"~1.6.1","webpack-fail-plugin":"~1.0.5","webpack-hot-middleware":"~2.12.2","webpack-md5-hash":"~0.0.5"},"repository":{"type":"git","url":"git+https://github.com/gridgrid/grid.git"},"keywords":["grid","spreadsheet","virtual","scroll"],"author":{"name":"Sterling Camden"},"license":"MIT","bugs":{"url":"https://github.com/gridgrid/grid/issues"},"homepage":"https://github.com/gridgrid/grid","config":{"commitizen":{"path":"cz-conventional-changelog"}},"release":{"verifyConditions":"condition-circle","branch":"next","fallbackTags":{"next":"latest"}},"gitHead":"b5e58c4b5343354462a8d62484c7641030c5dd6b","_id":"grid@4.2.0","_npmVersion":"5.4.2","_nodeVersion":"6.3.0","_npmUser":{"name":"riqlandia-ci","email":"rusty.camden@gmail.com"},"dist":{"integrity":"sha512-q5GD/kNTWHW6bhjxuyrU+0y+b1UxFsaPvXSpK0qVV90JdOST1Kl66wREID19DZv5TPWH2LNfWzNvkhC7qr2j1g==","shasum":"2c0640d6c9dceeef597763fcef97d6f956c6cd40","tarball":"https://registry.npmjs.org/grid/-/grid-4.2.0.tgz","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDOhvnmkIwwRUulaaLCABvcfhZsJ6oRapsaJMHNJ3vQXgIhAK+W8wTCSmsPW48E6h9u/uXXr6xu9a+39BFVY7dpwbR1"}]},"maintainers":[{"email":"rusty.camden@gmail.com","name":"riqlandia-ci"},{"email":"ben@benshope.com","name":"benshope"},{"email":"christy@relateiq.com","name":"cdennison"},{"email":"public@matthewmartin.com","name":"voxmatt"},{"email":"joe.mun@salesforce.com","name":"joemun"},{"email":"keven425@gmail.com","name":"keven425"},{"email":"joechrz@gmail.com","name":"joechrz"},{"email":"john.fox@relateiq.com","name":"john.fox"},{"email":"jon@relateiq.com","name":"jontomas"},{"email":"lerhaupt@gmail.com","name":"lerhaupt"},{"email":"anthony.liatsis@gmail.com","name":"anthonyl"},{"email":"rusty.camden@gmail.com","name":"scamden"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/grid-4.2.0.tgz_1507764902932_0.8242174626793712"},"directories":{}},"4.3.0":{"name":"grid","version":"4.3.0","description":"A highly scalable grid component written in javscript","main":"dist/bundle.js","typings":"dist/modules/core/index.d.ts","publishConfig":{"registry":"https://registry.npmjs.org/","tag":"next"},"engines":{"node":">=0.10.0"},"iqproj":{"app":true},"scripts":{"commitmsg":"validate-commit-msg","preversion":"npm run build","open:src":"babel-node tools/srcServer.js","dev":"npm-run-all --parallel open:src test:watch","clean":"rm -rf ./dist && mkdir dist","prebuild":"npm run clean && npm run test","build":"node tools/build.js","test":"node_modules/karma/bin/karma start --single-run --no-auto-watch karma.conf.js","test:watch":"node_modules/karma/bin/karma start karma.conf.js","semantic-release":"semantic-release pre && npm publish && semantic-release post"},"dependencies":{"capitalize":"^0.5.0","click-off":"~0.2.1","element-class":"^0.1.1","es6-object-assign":"~1.1.0","escape-stack":"~0.1.2","inner-text-shim":"~1.0.1","key":"^0.1.11","time-now":"~0.2.1"},"devDependencies":{"@types/jasmine":"~2.6.0","@types/karma":"~1.7.0","autoprefixer":"~6.4.0","awesome-typescript-loader":"~3.2.3","babel-cli":"~6.24.1","babel-loader":"~6.2.5","babel-preset-es2015":"~6.18.0","babel-preset-stage-1":"~6.13.0","browser-sync":"~2.18.12","condition-circle":"~1.5.0","copy-webpack-plugin":"~3.0.1","core-js-webpack-plugin":"~1.0.3","css-loader":"~0.24.0","ejs-compiled-loader":"~1.1.0","es6-promise":"~3.1.2","extract-text-webpack-plugin":"~3.0.1","file-loader":"~0.9.0","html-webpack-plugin":"~2.22.0","husky":"~0.13.3","jasmine":"~2.3.2","jasmine-tools-riq":"~0.3.2","jquery":"^2.1.0","karma":"~1.7.1","karma-chrome-launcher":"~0.2.1","karma-jasmine":"~0.3.6","karma-jasmine-jquery":"~0.1.1","karma-phantomjs-launcher":"~1.0.4","karma-sourcemap-loader":"~0.3.7","karma-webpack":"~2.0.4","lodash":"~4.11.0","node-sass":"~4.5.3","npm-run-all":"~4.0.2","phantomjs-prebuilt":"~2.1.14","polyfill-function-prototype-bind":"0.0.1","postcss-loader":"~0.11.0","sass-loader":"~4.1.1","semantic-release":"^4.3.5","source-map-loader":"~0.2.0","style-loader":"~0.13.1","transform-ts-paths":"^1.0.0","ts-loader":"~2.3.7","tslint":"^5.4.2","tslint-eslint-rules":"^4.1.1","typescript":"~2.4.2","url-loader":"~0.5.7","validate-commit-msg":"~2.12.1","webpack":"~3.6.0","webpack-bundle-analyzer":"^2.8.2","webpack-dev-middleware":"~1.6.1","webpack-fail-plugin":"~1.0.5","webpack-hot-middleware":"~2.12.2","webpack-md5-hash":"~0.0.5"},"repository":{"type":"git","url":"git+https://github.com/gridgrid/grid.git"},"keywords":["grid","spreadsheet","virtual","scroll"],"author":{"name":"Sterling Camden"},"license":"MIT","bugs":{"url":"https://github.com/gridgrid/grid/issues"},"homepage":"https://github.com/gridgrid/grid","config":{"commitizen":{"path":"cz-conventional-changelog"}},"release":{"verifyConditions":"condition-circle","branch":"next","fallbackTags":{"next":"latest"}},"gitHead":"22ba4a7b160e14a6d363b7096b9c010568189356","_id":"grid@4.3.0","_npmVersion":"5.5.1","_nodeVersion":"6.3.0","_npmUser":{"name":"riqlandia-ci","email":"rusty.camden@gmail.com"},"dist":{"integrity":"sha512-FC3TKIFgXJvQy38njWhmIvHjXmMCorfcCb4Or1Aeeu0ZhLx+B8juPV/ONJ9f+ZCB5/s5XuhrLS/hNLURaHkvbw==","shasum":"63f98492c04e890591c9e2f6a9da5df78b01e84c","tarball":"https://registry.npmjs.org/grid/-/grid-4.3.0.tgz","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIBZTezN/fCL91JjSW2xf+JOeL8A8BMVFeWzJKGufeK3OAiACP3hXRPnHPdt6TVl9x7MEIqD0MJoW+VTekPuIhgl2hw=="}]},"maintainers":[{"email":"rusty.camden@gmail.com","name":"riqlandia-ci"},{"email":"ben@benshope.com","name":"benshope"},{"email":"christy@relateiq.com","name":"cdennison"},{"email":"public@matthewmartin.com","name":"voxmatt"},{"email":"joe.mun@salesforce.com","name":"joemun"},{"email":"keven425@gmail.com","name":"keven425"},{"email":"joechrz@gmail.com","name":"joechrz"},{"email":"john.fox@relateiq.com","name":"john.fox"},{"email":"jon@relateiq.com","name":"jontomas"},{"email":"lerhaupt@gmail.com","name":"lerhaupt"},{"email":"anthony.liatsis@gmail.com","name":"anthonyl"},{"email":"rusty.camden@gmail.com","name":"scamden"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/grid-4.3.0.tgz_1508274396217_0.6064621198456734"},"directories":{}},"4.3.1":{"name":"grid","version":"4.3.1","description":"A highly scalable grid component written in javscript","main":"dist/bundle.js","typings":"dist/modules/core/index.d.ts","publishConfig":{"registry":"https://registry.npmjs.org/","tag":"next"},"engines":{"node":">=0.10.0"},"iqproj":{"app":true},"scripts":{"commitmsg":"validate-commit-msg","preversion":"npm run build","open:src":"babel-node tools/srcServer.js","dev":"npm-run-all --parallel open:src test:watch","clean":"rm -rf ./dist && mkdir dist","prebuild":"npm run clean && npm run test","build":"node tools/build.js","test":"node_modules/karma/bin/karma start --single-run --no-auto-watch karma.conf.js","test:watch":"node_modules/karma/bin/karma start karma.conf.js","semantic-release":"semantic-release pre && npm publish && semantic-release post"},"dependencies":{"capitalize":"^0.5.0","click-off":"~0.2.1","element-class":"^0.1.1","es6-object-assign":"~1.1.0","escape-stack":"~0.1.2","inner-text-shim":"~1.0.1","key":"^0.1.11","time-now":"~0.2.1"},"devDependencies":{"@types/jasmine":"~2.6.0","@types/karma":"~1.7.0","autoprefixer":"~6.4.0","awesome-typescript-loader":"~3.2.3","babel-cli":"~6.24.1","babel-loader":"~6.2.5","babel-preset-es2015":"~6.18.0","babel-preset-stage-1":"~6.13.0","browser-sync":"~2.18.12","condition-circle":"~1.5.0","copy-webpack-plugin":"~3.0.1","core-js-webpack-plugin":"~1.0.3","css-loader":"~0.24.0","ejs-compiled-loader":"~1.1.0","es6-promise":"~3.1.2","extract-text-webpack-plugin":"~3.0.1","file-loader":"~0.9.0","html-webpack-plugin":"~2.22.0","husky":"~0.13.3","jasmine":"~2.3.2","jasmine-tools-riq":"~0.3.2","jquery":"^2.1.0","karma":"~1.7.1","karma-chrome-launcher":"~0.2.1","karma-jasmine":"~0.3.6","karma-jasmine-jquery":"~0.1.1","karma-phantomjs-launcher":"~1.0.4","karma-sourcemap-loader":"~0.3.7","karma-webpack":"~2.0.4","lodash":"~4.11.0","node-sass":"~4.5.3","npm-run-all":"~4.0.2","phantomjs-prebuilt":"~2.1.14","polyfill-function-prototype-bind":"0.0.1","postcss-loader":"~0.11.0","sass-loader":"~4.1.1","semantic-release":"^4.3.5","source-map-loader":"~0.2.0","style-loader":"~0.13.1","transform-ts-paths":"^1.0.0","ts-loader":"~2.3.7","tslint":"^5.4.2","tslint-eslint-rules":"^4.1.1","typescript":"~2.4.2","url-loader":"~0.5.7","validate-commit-msg":"~2.12.1","webpack":"~3.6.0","webpack-bundle-analyzer":"^2.8.2","webpack-dev-middleware":"~1.6.1","webpack-fail-plugin":"~1.0.5","webpack-hot-middleware":"~2.12.2","webpack-md5-hash":"~0.0.5"},"repository":{"type":"git","url":"git+https://github.com/gridgrid/grid.git"},"keywords":["grid","spreadsheet","virtual","scroll"],"author":{"name":"Sterling Camden"},"license":"MIT","bugs":{"url":"https://github.com/gridgrid/grid/issues"},"homepage":"https://github.com/gridgrid/grid","config":{"commitizen":{"path":"cz-conventional-changelog"}},"release":{"verifyConditions":"condition-circle","branch":"next","fallbackTags":{"next":"latest"}},"gitHead":"208eb8dca729fe9c6b939a73e56967f477dba5c6","_id":"grid@4.3.1","_npmVersion":"5.5.1","_nodeVersion":"6.3.0","_npmUser":{"name":"riqlandia-ci","email":"rusty.camden@gmail.com"},"dist":{"integrity":"sha512-qqenLIWiAFnvWw9EUxDyrmDm3JHbQTtvf5KFJoryEMP7rFec+e4gr/3sFWfQtbvbgZQVHGLgBeXRBHgl7j7lvA==","shasum":"f429de7d060cbbfb622d59e92329ae1777827b01","tarball":"https://registry.npmjs.org/grid/-/grid-4.3.1.tgz","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIHaAdzL5hWVliEGCce/BYXUy6ghlNgIqaf2Cy/RPwJUeAiEAhmqKc+vgQtm/fyNsRFT72D9PnynlbUYrfvr98ZK84MM="}]},"maintainers":[{"email":"rusty.camden@gmail.com","name":"riqlandia-ci"},{"email":"ben@benshope.com","name":"benshope"},{"email":"christy@relateiq.com","name":"cdennison"},{"email":"public@matthewmartin.com","name":"voxmatt"},{"email":"joe.mun@salesforce.com","name":"joemun"},{"email":"keven425@gmail.com","name":"keven425"},{"email":"joechrz@gmail.com","name":"joechrz"},{"email":"john.fox@relateiq.com","name":"john.fox"},{"email":"jon@relateiq.com","name":"jontomas"},{"email":"lerhaupt@gmail.com","name":"lerhaupt"},{"email":"anthony.liatsis@gmail.com","name":"anthonyl"},{"email":"rusty.camden@gmail.com","name":"scamden"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/grid-4.3.1.tgz_1508451851999_0.20305133797228336"},"directories":{}},"4.4.0":{"name":"grid","version":"4.4.0","description":"A highly scalable grid component written in javscript","main":"dist/bundle.js","typings":"dist/modules/core/index.d.ts","publishConfig":{"registry":"https://registry.npmjs.org/","tag":"next"},"engines":{"node":">=0.10.0"},"iqproj":{"app":true},"scripts":{"commitmsg":"validate-commit-msg","preversion":"npm run build","open:src":"babel-node tools/srcServer.js","dev":"npm-run-all --parallel open:src test:watch","clean":"rm -rf ./dist && mkdir dist","prebuild":"npm run clean && npm run test","build":"node tools/build.js","test":"node_modules/karma/bin/karma start --single-run --no-auto-watch karma.conf.js","test:watch":"node_modules/karma/bin/karma start karma.conf.js","semantic-release":"semantic-release pre && npm publish && semantic-release post"},"dependencies":{"capitalize":"^0.5.0","click-off":"~0.2.1","element-class":"^0.1.1","es6-object-assign":"~1.1.0","escape-stack":"~0.1.2","inner-text-shim":"~1.0.1","key":"^0.1.11","time-now":"~0.2.1"},"devDependencies":{"@types/jasmine":"~2.6.0","@types/karma":"~1.7.0","autoprefixer":"~6.4.0","awesome-typescript-loader":"~3.2.3","babel-cli":"~6.24.1","babel-loader":"~6.2.5","babel-preset-es2015":"~6.18.0","babel-preset-stage-1":"~6.13.0","browser-sync":"~2.18.12","condition-circle":"~1.5.0","copy-webpack-plugin":"~3.0.1","core-js-webpack-plugin":"~1.0.3","css-loader":"~0.24.0","ejs-compiled-loader":"~1.1.0","es6-promise":"~3.1.2","extract-text-webpack-plugin":"~3.0.1","file-loader":"~0.9.0","html-webpack-plugin":"~2.22.0","husky":"~0.13.3","jasmine":"~2.3.2","jasmine-tools-riq":"~0.3.2","jquery":"^2.1.0","karma":"~1.7.1","karma-chrome-launcher":"~0.2.1","karma-jasmine":"~0.3.6","karma-jasmine-jquery":"~0.1.1","karma-phantomjs-launcher":"~1.0.4","karma-sourcemap-loader":"~0.3.7","karma-webpack":"~2.0.4","lodash":"~4.11.0","node-sass":"~4.5.3","npm-run-all":"~4.0.2","phantomjs-prebuilt":"~2.1.14","polyfill-function-prototype-bind":"0.0.1","postcss-loader":"~0.11.0","sass-loader":"~4.1.1","semantic-release":"^4.3.5","source-map-loader":"~0.2.0","style-loader":"~0.13.1","transform-ts-paths":"^1.0.0","ts-loader":"~2.3.7","tslint":"^5.4.2","tslint-eslint-rules":"^4.1.1","typescript":"~2.4.2","url-loader":"~0.5.7","validate-commit-msg":"~2.12.1","webpack":"~3.6.0","webpack-bundle-analyzer":"^2.8.2","webpack-dev-middleware":"~1.6.1","webpack-fail-plugin":"~1.0.5","webpack-hot-middleware":"~2.12.2","webpack-md5-hash":"~0.0.5"},"repository":{"type":"git","url":"git+https://github.com/gridgrid/grid.git"},"keywords":["grid","spreadsheet","virtual","scroll"],"author":{"name":"Sterling Camden"},"license":"MIT","bugs":{"url":"https://github.com/gridgrid/grid/issues"},"homepage":"https://github.com/gridgrid/grid","config":{"commitizen":{"path":"cz-conventional-changelog"}},"release":{"verifyConditions":"condition-circle","branch":"next","fallbackTags":{"next":"latest"}},"gitHead":"08921660a85cbbad85376239a198ce5dfc6c9867","_id":"grid@4.4.0","_npmVersion":"5.5.1","_nodeVersion":"6.3.0","_npmUser":{"name":"riqlandia-ci","email":"rusty.camden@gmail.com"},"dist":{"integrity":"sha512-8zUVkqQeTyEI+PI92C7NMOu7LzUF35CcJSA7SU4s0USSzr4cXXUJvsfBF4KdjffEDTiiNvekn8YMuJXvUouhSA==","shasum":"0ff4ae370989e671811ab155d0a2b56bb5ecb2e2","tarball":"https://registry.npmjs.org/grid/-/grid-4.4.0.tgz","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQD1t+pePEGS6RpxjFhsZI8WKkHSqD1mR48IJeCg/k6VigIhAKvCWeiqcZoW/pnvLYtMRa1IsrT8cmjTeK2DYEmc9Ff1"}]},"maintainers":[{"email":"rusty.camden@gmail.com","name":"riqlandia-ci"},{"email":"ben@benshope.com","name":"benshope"},{"email":"christy@relateiq.com","name":"cdennison"},{"email":"public@matthewmartin.com","name":"voxmatt"},{"email":"joe.mun@salesforce.com","name":"joemun"},{"email":"keven425@gmail.com","name":"keven425"},{"email":"joechrz@gmail.com","name":"joechrz"},{"email":"john.fox@relateiq.com","name":"john.fox"},{"email":"jon@relateiq.com","name":"jontomas"},{"email":"lerhaupt@gmail.com","name":"lerhaupt"},{"email":"anthony.liatsis@gmail.com","name":"anthonyl"},{"email":"rusty.camden@gmail.com","name":"scamden"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/grid-4.4.0.tgz_1509148188169_0.447641791542992"},"directories":{}},"4.5.0":{"name":"grid","version":"4.5.0","description":"A highly scalable grid component written in javscript","main":"dist/bundle.js","typings":"dist/modules/core/index.d.ts","publishConfig":{"registry":"https://registry.npmjs.org/","tag":"next"},"engines":{"node":">=0.10.0"},"iqproj":{"app":true},"scripts":{"commitmsg":"validate-commit-msg","preversion":"npm run build","open:src":"babel-node tools/srcServer.js","dev":"npm-run-all --parallel open:src test:watch","clean":"rm -rf ./dist && mkdir dist","prebuild":"npm run clean && npm run test","build":"node tools/build.js","test":"node_modules/karma/bin/karma start --single-run --no-auto-watch karma.conf.js","test:watch":"node_modules/karma/bin/karma start karma.conf.js","semantic-release":"semantic-release pre && npm publish && semantic-release post"},"dependencies":{"capitalize":"^0.5.0","click-off":"~0.2.1","element-class":"^0.1.1","es6-object-assign":"~1.1.0","escape-stack":"~0.1.2","inner-text-shim":"~1.0.1","key":"^0.1.11","time-now":"~0.2.1"},"devDependencies":{"@types/jasmine":"~2.6.0","@types/karma":"~1.7.0","autoprefixer":"~6.4.0","awesome-typescript-loader":"~3.2.3","babel-cli":"~6.24.1","babel-loader":"~6.2.5","babel-preset-es2015":"~6.18.0","babel-preset-stage-1":"~6.13.0","browser-sync":"~2.18.12","condition-circle":"~1.5.0","copy-webpack-plugin":"~3.0.1","core-js-webpack-plugin":"~1.0.3","css-loader":"~0.24.0","ejs-compiled-loader":"~1.1.0","es6-promise":"~3.1.2","extract-text-webpack-plugin":"~3.0.1","file-loader":"~0.9.0","html-webpack-plugin":"~2.22.0","husky":"~0.13.3","jasmine":"~2.3.2","jasmine-tools-riq":"~0.3.2","jquery":"^2.1.0","karma":"~1.7.1","karma-chrome-launcher":"~0.2.1","karma-jasmine":"~0.3.6","karma-jasmine-jquery":"~0.1.1","karma-phantomjs-launcher":"~1.0.4","karma-sourcemap-loader":"~0.3.7","karma-webpack":"~2.0.4","lodash":"~4.11.0","node-sass":"~4.5.3","npm-run-all":"~4.0.2","phantomjs-prebuilt":"~2.1.14","polyfill-function-prototype-bind":"0.0.1","postcss-loader":"~0.11.0","sass-loader":"~4.1.1","semantic-release":"^4.3.5","source-map-loader":"~0.2.0","style-loader":"~0.13.1","transform-ts-paths":"^1.0.0","ts-loader":"~2.3.7","tslint":"^5.4.2","tslint-eslint-rules":"^4.1.1","typescript":"~2.4.2","url-loader":"~0.5.7","validate-commit-msg":"~2.12.1","webpack":"~3.6.0","webpack-bundle-analyzer":"^2.8.2","webpack-dev-middleware":"~1.6.1","webpack-fail-plugin":"~1.0.5","webpack-hot-middleware":"~2.12.2","webpack-md5-hash":"~0.0.5"},"repository":{"type":"git","url":"git+https://github.com/gridgrid/grid.git"},"keywords":["grid","spreadsheet","virtual","scroll"],"author":{"name":"Sterling Camden"},"license":"MIT","bugs":{"url":"https://github.com/gridgrid/grid/issues"},"homepage":"https://github.com/gridgrid/grid","config":{"commitizen":{"path":"cz-conventional-changelog"}},"release":{"verifyConditions":"condition-circle","branch":"next","fallbackTags":{"next":"latest"}},"gitHead":"a9b2ecb4b949d5fbe2485549c249f1ab4e9b6271","_id":"grid@4.5.0","_npmVersion":"5.6.0","_nodeVersion":"6.3.0","_npmUser":{"name":"riqlandia-ci","email":"rusty.camden@gmail.com"},"dist":{"integrity":"sha512-qr4bNXq8luROUroM2uxE+zRrtaFfZgtoF54qriiAZzTG9GfImvffrIap+kCEM4RHRcJZUpFnteremMHRry39XQ==","shasum":"04ae082d284e0ef0abc1ee015c0ebb688d7ee125","tarball":"https://registry.npmjs.org/grid/-/grid-4.5.0.tgz","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCNUQD9zG8JZy46k6u0iQ6wYwAD9/4H88VBdBDy7SVLrQIhAMVCdQRyJIQ2kfiMeuLNAYmjygFTxt5Y1Nr8sKRSNX6N"}]},"maintainers":[{"email":"rusty.camden@gmail.com","name":"riqlandia-ci"},{"email":"ben@benshope.com","name":"benshope"},{"email":"christy@relateiq.com","name":"cdennison"},{"email":"public@matthewmartin.com","name":"voxmatt"},{"email":"joe.mun@salesforce.com","name":"joemun"},{"email":"keven425@gmail.com","name":"keven425"},{"email":"joechrz@gmail.com","name":"joechrz"},{"email":"john.fox@relateiq.com","name":"john.fox"},{"email":"jon@relateiq.com","name":"jontomas"},{"email":"lerhaupt@gmail.com","name":"lerhaupt"},{"email":"anthony.liatsis@gmail.com","name":"anthonyl"},{"email":"rusty.camden@gmail.com","name":"scamden"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/grid-4.5.0.tgz_1516822303490_0.29869798058643937"},"directories":{}},"4.6.0":{"name":"grid","version":"4.6.0","description":"A highly scalable grid component written in javscript","main":"dist/bundle.js","typings":"dist/modules/core/index.d.ts","publishConfig":{"registry":"https://registry.npmjs.org/","tag":"next"},"engines":{"node":">=0.10.0"},"iqproj":{"app":true},"scripts":{"commitmsg":"validate-commit-msg","preversion":"npm run build","open:src":"babel-node tools/srcServer.js","dev":"npm-run-all --parallel open:src test:watch","clean":"rm -rf ./dist && mkdir dist","prebuild":"npm run clean && npm run test","build":"node tools/build.js","test":"node_modules/karma/bin/karma start --single-run --no-auto-watch karma.conf.js","test:watch":"node_modules/karma/bin/karma start karma.conf.js","semantic-release":"semantic-release pre && npm publish && semantic-release post"},"dependencies":{"capitalize":"^0.5.0","click-off":"~0.2.1","element-class":"^0.1.1","es6-object-assign":"~1.1.0","escape-stack":"~0.1.2","inner-text-shim":"~1.0.1","key":"^0.1.11","time-now":"~0.2.1"},"devDependencies":{"@types/jasmine":"~2.6.0","@types/karma":"~1.7.0","autoprefixer":"~6.4.0","awesome-typescript-loader":"~3.2.3","babel-cli":"~6.24.1","babel-loader":"~6.2.5","babel-preset-es2015":"~6.18.0","babel-preset-stage-1":"~6.13.0","browser-sync":"~2.18.12","condition-circle":"~1.5.0","copy-webpack-plugin":"~3.0.1","core-js-webpack-plugin":"~1.0.3","css-loader":"~0.24.0","ejs-compiled-loader":"~1.1.0","es6-promise":"~3.1.2","extract-text-webpack-plugin":"~3.0.1","file-loader":"~0.9.0","html-webpack-plugin":"~2.22.0","husky":"~0.13.3","jasmine":"~2.3.2","jasmine-tools-riq":"~0.3.2","jquery":"^2.1.0","karma":"~1.7.1","karma-chrome-launcher":"~0.2.1","karma-jasmine":"~0.3.6","karma-jasmine-jquery":"~0.1.1","karma-phantomjs-launcher":"~1.0.4","karma-sourcemap-loader":"~0.3.7","karma-webpack":"~2.0.4","lodash":"~4.11.0","node-sass":"~4.9.3","npm-run-all":"~4.0.2","phantomjs-prebuilt":"~2.1.14","polyfill-function-prototype-bind":"0.0.1","postcss-loader":"~0.11.0","sass-loader":"~4.1.1","semantic-release":"^4.3.5","source-map-loader":"~0.2.0","style-loader":"~0.13.1","transform-ts-paths":"^1.0.0","ts-loader":"~2.3.7","tslint":"^5.4.2","tslint-eslint-rules":"^4.1.1","typescript":"~3.0.3","url-loader":"~0.5.7","validate-commit-msg":"~2.12.1","webpack":"~3.6.0","webpack-bundle-analyzer":"^2.8.2","webpack-dev-middleware":"~1.6.1","webpack-fail-plugin":"~1.0.5","webpack-hot-middleware":"~2.12.2","webpack-md5-hash":"~0.0.5"},"repository":{"type":"git","url":"git+https://github.com/gridgrid/grid.git"},"keywords":["grid","spreadsheet","virtual","scroll"],"author":{"name":"Sterling Camden"},"license":"MIT","bugs":{"url":"https://github.com/gridgrid/grid/issues"},"homepage":"https://github.com/gridgrid/grid","config":{"commitizen":{"path":"cz-conventional-changelog"}},"release":{"verifyConditions":"condition-circle","branch":"next","fallbackTags":{"next":"latest"}},"readme":"[![npm](https://img.shields.io/npm/v/grid.svg)]( https://www.npmjs.com/package/grid) [![CircleCI](https://circleci.com/gh/gridgrid/grid.svg?style=shield)](https://circleci.com/gh/gridgrid/grid)  [![semantic-release](https://img.shields.io/badge/%20%20%F0%9F%93%A6%F0%9F%9A%80-semantic--release-e10079.svg)](https://github.com/semantic-release/semantic-release) [![Commitizen friendly](https://img.shields.io/badge/commitizen-friendly-brightgreen.svg)](http://commitizen.github.io/cz-cli/)\n\nGrid\n===\n\nA highly scalable grid component written in javscript [DEMO](https://gridgrid.github.io/grid/ \"Grid Demo\")\n\nNote: while Grid is fully functional it is still in beta. Use at your own risk and please file any issues on GitHub. \n\nAlso the grid is currently packaged for use with browserify. If you need a build for a non browserify (or webpack) environment please open an issue on github.\n\n\nInstallation\n===\n`npm install --save grid`\n\n\nExample / Quick-Start\n===\n\nTo run the sample app locally, run `npm start` and hit http://localhost:8082\n\n##### Create a Grid Instance\n`var core = require('grid')`\n`var grid = core();`\n\nThe grid handles most complexity for you. There are only three user supplied requirements to a get a grid up and running\n\n##### Row and Column Descriptors\nRow and column descriptors are objects that tell the grid how wide or high to make your cells. They also control things like whether or not a column is hidden and describe the overall dimensions of the grid.\n\n``` javascript\n\t// add some columns\n    var colDescriptors = [];\n    var colDescriptor;\n    for (var c = 0; c < 20; c++) {\n        // create a col descriptor\n        colDescriptor = grid.colModel.create();\n        colDescriptor.width = 78;\n        colDescriptor.hidden = !!(c % 2); // hide every other column for fun and profit\n    }\n    grid.colModel.add(colDescriptors);\n\n    // add some rows\n    var rowDescriptors = [];\n    var rowDescriptor;\n    for (var r = 0; r < 20; r++) {\n        // create a row descriptor\n        rowDescriptor = grid.rowModel.create();\n        rowDescriptor.height = 24;\n        if(r === 0){\n        \trowDescriptor.header = true;\n        }\n    }\n    grid.rowModel.add(rowDescriptors);\n```\n\n##### The DataModel\n\nThe grid determines what to render for a given cell by calling the supplied data model. This gives the client massive flexbility to generate and return the data however they need to.\n\nThe datamodel can be a simple object that the user sets on the grid instance `dataModel` field and needs to implement at a minimum\n\n`get`, `getHeader`, and `isDirty`, \n\nif you support user data entry and want paste to work you should also implement `set`\n\nHere's a basic read only implementation:\n\n``` javascript\n// use the grid's default dirty clean implementation almost always\n// (it will automatically be set clean on each draw by the grid)\nvar dataDirtyClean = grid.makeDirtyClean();\n\ngrid.dataModel = {\n\n    get: function(dataRowIndex, dataColIndex, isCopy) {\n        var rawValue = [dataRowIndex, dataColIndex];\n        return {\n            value: rawValue,\n            formatted: 'r' + rawValue[0] + ', c' + rawValue[1]\n        };\n    },\n    \n    getHeader: function(headerRowIndex, headerColIndex) {\n        var rawValue = [headerRowIndex, headerColIndex];\n        return {\n            value: rawValue,\n            formatted: 'hr' + rawValue[0] + ', hc' + rawValue[1]\n        };\n    },\n    \n    isDirty: dataDirtyClean.isDirty\n};\n```\n\n##### Call Build\nFinally we just need to tell the grid to set itself up in a container of our choosing:\n\n``` javascript\nvar container = document.createElement('div');\ncontainer.style.width = '800px';\ncontainer.style.height = '800px';\ndocument.body.appendChild(container);\ngrid.build(container);\n```\n\nConcepts\n===\n\nMany of the apis in the grid utilize two concepts when referencing coordinates: spaces and units. It's good to understand these before using the more advanced features.\n\n## Spaces\nCoordinates in the grid exist in one of three spaces.\n\n**virtual** - represents all of the data in your grid including the headers. for example, if you have a grid with one header row, then `(0, 20)` in the `'virtual'` space references the column 20 of the header. `(1, 20)` would reference column 20 of the first data row.\n\n**data** - very similar to virtual but does not include the headers. so `(0,20)` references the first row of data at the 20th column and technically `(-1, 20)` would represent the 20th column in the header although negative indexes are rarely used\n\n**view** - the view space represents the actual dom nodes that are rendered for the grid's virtualization. the grid's implementation renders enough cells to fill the entire viewport and no more (usually around 20-30 rows and 10 cols depending on sizes). in this space `(0,20)` would reference the dom cell at column 20 of the first row. even if you scroll the grid it will always point at that cell, so a view coordinate can be translated to different virtual coordinates depending on the scroll. you could think of view coordinates as a correlary for `position: fixed` in css\n\n## Units\nUnits in the grid are straightforward. They are either\n\n**px** - pixels, so `(0,0)` in the view space is the very top left pixel of the grid no matter the scroll, whereas `(0,0)` in the virtual space is the top left pixel only when the grid hasn't been scrolled, and would technically refer to a pixel out of view if the grid has been scrolled\n\nor\n\n**cell** - cells, so `(0,0)` in the view space represents the top left cell regardless of scroll, and `(0,0)` in the virtual space would represent an off screen cell if scrolled and top left if not scrolled\n\nUsing Custom HTML\n===\n\nThere are two ways to get non text (read html) into a grid:\n\n## Decorators\nDecorators are great for adding a piece of one-off ui that doesn't relate directly to the content of a cell or doesn't need to be in every row of a column or vice versa. For example, the grid internally uses decorators to render the focus and selection highlight as well as resize handles.\n\n**basic decorator**\n``` javascript\n\tvar top = 1,\n    left = 2,\n    height = 1,\n    width = 1,\n    unit = 'cell',\n    space = 'view';\n    var d = grid.decorators.create(top, left, height, width, unit, space);\n\n    // return some element\n    d.render = function() {\n        var a = document.createElement('a')\n        a.textContent = 'link Text!'\n        return a;\n    };\n    grid.decorators.add(d);\n```\n\nPuts a link over the cell at row 1 col 2 that doesn’t move with the scroll (why you would do this is questionable but it's just an example).\n\nYou can do more complicated things like render directives: (requires grid-angular-adapter)\n\n**angular directive decorator**\n``` javascript\nangular.module('myCoolGrid', [require('grid')])\n\n  .controller('MyGridCtrl', function($scope, GridSrvc, GridDecoratorSrvc) {\n      var grid = GridSrvc.core();\n\n      // do row col and datamodel setup...\n\n      var top = 20,\n          left = 10,\n          height = 2,\n          width = 2,\n          unit = 'cell',\n          space = 'virtual';\n      var d = grid.decorators.create(top, left, height, width, unit, space);\n\n      // return some element\n      d.render = function() {\n          var scope = $scope.$new();\n          scope.interestingData = 'INTERESTING DATA!!!';\n          return GridDecoratorSrvc.render({\n              $scope: scope,\n              template: '<my-directive data=\"interestingData\"></my-directive>',\n              events: true\n          });\n      };\n      grid.decorators.add(d);\n  });\n```\n\nThis will put your compiled directive in a box that spans from `row 20-22` and `col 10-12`, and moves appropriately with the scroll. The `events` flag lets the grid know that this decorator is interactable and should receive mouse events. (Otherwise pointer events are set to none.) The GridDecoratorSrvc takes care of destroying the scope and properly removing elements to avoid memory leaks with angular. You definitely should use it for any angular decorators.\n\n\n## Builders\nBuilders help you to get html into the actual cells of a given row or column instead of the text that would have been rendered.\n\n\n**basic builders**\n``` javascript\nvar builder = grid.colModel.createBuilder(function render() {\n    return angular.element('<a href=\"#\"></a>')[0];\n}, function update(elem, ctx) {\n    grid.viewLayer.setTextContent(elem, ctx.data.formatted);\n    return elem;\n});\nvar colDescriptor = grid.colModel.create(builder);\n```\n\nhave `<a>` tags in your cells for all the rows in that column\n\nNote: it's important for the update function of a builder to be extremely fast. Call `scope.$digest` not `scope.$apply`, and  use `grid.viewLayer.setTextContent` not `elem.innerHTML` where possible\n\n\nStyling\n===\nIf you want to update the look and feel of the grid, here are a few classes that you can override to give you the look you want.\n\n\n## Classes\n\n**`.grid-cell`:**\nThis class is responsible for the look of individual cells. \n\n**`.grid-focus-decorator`:** This decorator class is applied when you click('focus') on a cell\n\nEx. Adding the following style will give you a cell with a blue border around it when the cell is selected.\n``` css\n.grid-focus-decorator {\n  border: 2px solid blue;\n}\n```\n\n**`.grid-selection`:**\nWhen selecting rows and columns, this class sets the border and background so you know which rows you are exactly selecting\n\nEx.\n```css\n$grid-teal: #39CCCC !default;\n.grid-selection {\n  border: 1px solid $grid-teal;\n  background: transparentize($grid-teal, .8);\n}\n```\n\n**`.grid-row`:**\nThis class is responsible for the look of the row of cells.\n\nEx. To apply, a background color when hovering over each row, add the following:\n```css\n.grid-row {\n  &.hover {\n    background-color: lighten($grid-teal, 30) !important;\n  }\n}\n```\n\nTo apply styles only to the header row, use the following class:\n```css\n.grid-row {\n  &.grid-is-header {\n  }\n}\n\n```\n**`.col-resize`:** This class changes the look of the column resizing element. \n\n**`.grid-drag-line`**: This class is used when you are resizing a column. A vertical line is added to guide you of how much to resize your columns.\n\nEx. To show a blue vertical line when resizing a column, add the following\n```css\n.grid-drag-line {\n  background: #7FDBFF;\n}\n```\n\n","readmeFilename":"README.md","gitHead":"debecc3b98685cd566340cfdd5c40cac44b5b53f","_id":"grid@4.6.0","_npmVersion":"6.4.1","_nodeVersion":"8.12.0","_npmUser":{"name":"riqlandia-ci","email":"rusty.camden@gmail.com"},"dist":{"integrity":"sha512-EOu6AmyYEG92twzu0Bf+axGj4XztvRMP0+ARi5VaT4aykXi55TLrxUwR/jT0wfOfX7xbgl+qCajKEoInoxCrkQ==","shasum":"63fc527b380ba89c901d2b8b29f861a6a7764e5a","tarball":"https://registry.npmjs.org/grid/-/grid-4.6.0.tgz","fileCount":119,"unpackedSize":1323692,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJbpTw2CRA9TVsSAnZWagAAW/MP/RmGI9n58YhMCC/IUkgs\n+RNqGrhutygjlZ2jEh4vzrmSmsjQjZ/qM6BZbI1/pk5NpxTUXQZX09xUBjSg\nAAB3KcVJFMOtYiefnxaegNrbbIDpFnPvU6fdPgdAp2nl3VFh24eZcW0SkbnO\nhv3TAdV4eb+7g5Vai0scfI1WD6aJxQ9Mx1u0Krb5kvA3PcITnzZj/rQYHVA4\nPbLJDrPb/xueU97ZvYh0pCX4pUcKGt99su+hCOXVuFDFUR/Sa3j+WsqormTC\nSMlD+/N6MMI6EMqyMojTQVUWeLKoJVFT7gL6HVmBU3Sx0KSFtc5JY8X4EasE\nOvXdcZQa1F8dMZ+uUFZEFhKcwSSuUInBQqc3GO011pCU0/Ia9mJhLBVxU1oB\nYGzeyYwgwDXmCnWLYJ3F4dm2Ckks9+6JOYnbAehjdQOhOa5rRbTAr1wzi5WX\nWkmWB9x+jUAq7hm57Ndo/nM+E9QxeWEO3SJ9b84pgz9c1lfitlDRY9XsS2l7\nLpU+tSkutoN0+6Dbmiux/rX5JISQvLd0p7VcCYm1LJrRToU+93uZFdeSPKNs\n8bODHB/ZlhqWPm0T9fs+BTCEpCk12aBl2dZzq3CoYQhczxYX7Xf9KW8skTaX\n/i206bk1f6Ks7CkWvQocKMHDTaSCLQwMXAaL+QpKe+1h6x20LtRzMaXfjFi3\nAPRK\r\n=yMND\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIE+DeOUOC4bBPUZAh788ZcGaXvEn57s9czchVfTaoSEnAiBqc4IMO2I6bVxTdoyBNlrpLyxTASO4OhZFwO1yHmQE7g=="}]},"maintainers":[{"email":"anthony.liatsis@gmail.com","name":"anthonyl"},{"email":"ben@benshope.com","name":"benshope"},{"email":"christy@relateiq.com","name":"cdennison"},{"email":"joechrz@gmail.com","name":"joechrz"},{"email":"joe.mun@salesforce.com","name":"joemun"},{"email":"john.fox@relateiq.com","name":"john.fox"},{"email":"jon@relateiq.com","name":"jontomas"},{"email":"keven425@gmail.com","name":"keven425"},{"email":"lerhaupt@gmail.com","name":"lerhaupt"},{"email":"rusty.camden@gmail.com","name":"riqlandia-ci"},{"email":"rusty.camden@gmail.com","name":"scamden"},{"email":"public@matthewmartin.com","name":"voxmatt"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/grid_4.6.0_1537555509891_0.6230953319764099"},"_hasShrinkwrap":false},"4.6.1":{"name":"grid","version":"4.6.1","description":"A highly scalable grid component written in javscript","main":"dist/bundle.js","typings":"dist/modules/core/index.d.ts","publishConfig":{"registry":"https://registry.npmjs.org/","tag":"next"},"engines":{"node":">=0.10.0"},"iqproj":{"app":true},"scripts":{"commitmsg":"validate-commit-msg","preversion":"npm run build","open:src":"babel-node tools/srcServer.js","dev":"npm-run-all --parallel open:src test:watch","clean":"rm -rf ./dist && mkdir dist","prebuild":"npm run clean && npm run test","build":"node tools/build.js","test":"node_modules/karma/bin/karma start --single-run --no-auto-watch karma.conf.js","test:watch":"node_modules/karma/bin/karma start karma.conf.js","semantic-release":"semantic-release pre && npm publish && semantic-release post"},"dependencies":{"capitalize":"^0.5.0","click-off":"~0.2.1","element-class":"^0.1.1","es6-object-assign":"~1.1.0","escape-stack":"~0.1.2","inner-text-shim":"~1.0.1","key":"^0.1.11","time-now":"~0.2.1"},"devDependencies":{"@types/jasmine":"~2.6.0","@types/karma":"~1.7.0","autoprefixer":"~6.4.0","awesome-typescript-loader":"~3.2.3","babel-cli":"~6.24.1","babel-loader":"~6.2.5","babel-preset-es2015":"~6.18.0","babel-preset-stage-1":"~6.13.0","browser-sync":"~2.18.12","condition-circle":"~1.5.0","copy-webpack-plugin":"~3.0.1","core-js-webpack-plugin":"~1.0.3","css-loader":"~0.24.0","ejs-compiled-loader":"~1.1.0","es6-promise":"~3.1.2","extract-text-webpack-plugin":"~3.0.1","file-loader":"~0.9.0","html-webpack-plugin":"~2.22.0","husky":"~0.13.3","jasmine":"~2.3.2","jasmine-tools-riq":"~0.3.2","jquery":"^2.1.0","karma":"~1.7.1","karma-chrome-launcher":"~0.2.1","karma-jasmine":"~0.3.6","karma-jasmine-jquery":"~0.1.1","karma-phantomjs-launcher":"~1.0.4","karma-sourcemap-loader":"~0.3.7","karma-webpack":"~2.0.4","lodash":"~4.11.0","node-sass":"~4.9.3","npm-run-all":"~4.0.2","phantomjs-prebuilt":"~2.1.14","polyfill-function-prototype-bind":"0.0.1","postcss-loader":"~0.11.0","sass-loader":"~4.1.1","semantic-release":"^4.3.5","source-map-loader":"~0.2.0","style-loader":"~0.13.1","transform-ts-paths":"^1.0.0","ts-loader":"~2.3.7","tslint":"^5.4.2","tslint-eslint-rules":"^4.1.1","typescript":"~3.0.3","url-loader":"~0.5.7","validate-commit-msg":"~2.12.1","webpack":"~3.6.0","webpack-bundle-analyzer":"^2.8.2","webpack-dev-middleware":"~1.6.1","webpack-fail-plugin":"~1.0.5","webpack-hot-middleware":"~2.12.2","webpack-md5-hash":"~0.0.5"},"repository":{"type":"git","url":"git+https://github.com/gridgrid/grid.git"},"keywords":["grid","spreadsheet","virtual","scroll"],"author":{"name":"Sterling Camden"},"license":"MIT","bugs":{"url":"https://github.com/gridgrid/grid/issues"},"homepage":"https://github.com/gridgrid/grid","config":{"commitizen":{"path":"cz-conventional-changelog"}},"release":{"verifyConditions":"condition-circle","branch":"next","fallbackTags":{"next":"latest"}},"readme":"[![npm](https://img.shields.io/npm/v/grid.svg)]( https://www.npmjs.com/package/grid) [![CircleCI](https://circleci.com/gh/gridgrid/grid.svg?style=shield)](https://circleci.com/gh/gridgrid/grid)  [![semantic-release](https://img.shields.io/badge/%20%20%F0%9F%93%A6%F0%9F%9A%80-semantic--release-e10079.svg)](https://github.com/semantic-release/semantic-release) [![Commitizen friendly](https://img.shields.io/badge/commitizen-friendly-brightgreen.svg)](http://commitizen.github.io/cz-cli/)\n\nGrid\n===\n\nA highly scalable grid component written in javscript [DEMO](https://gridgrid.github.io/grid/ \"Grid Demo\")\n\nNote: while Grid is fully functional it is still in beta. Use at your own risk and please file any issues on GitHub. \n\nAlso the grid is currently packaged for use with browserify. If you need a build for a non browserify (or webpack) environment please open an issue on github.\n\n\nInstallation\n===\n`npm install --save grid`\n\n\nExample / Quick-Start\n===\n\nTo run the sample app locally, run `npm start` and hit http://localhost:8082\n\n##### Create a Grid Instance\n`var core = require('grid')`\n`var grid = core();`\n\nThe grid handles most complexity for you. There are only three user supplied requirements to a get a grid up and running\n\n##### Row and Column Descriptors\nRow and column descriptors are objects that tell the grid how wide or high to make your cells. They also control things like whether or not a column is hidden and describe the overall dimensions of the grid.\n\n``` javascript\n\t// add some columns\n    var colDescriptors = [];\n    var colDescriptor;\n    for (var c = 0; c < 20; c++) {\n        // create a col descriptor\n        colDescriptor = grid.colModel.create();\n        colDescriptor.width = 78;\n        colDescriptor.hidden = !!(c % 2); // hide every other column for fun and profit\n    }\n    grid.colModel.add(colDescriptors);\n\n    // add some rows\n    var rowDescriptors = [];\n    var rowDescriptor;\n    for (var r = 0; r < 20; r++) {\n        // create a row descriptor\n        rowDescriptor = grid.rowModel.create();\n        rowDescriptor.height = 24;\n        if(r === 0){\n        \trowDescriptor.header = true;\n        }\n    }\n    grid.rowModel.add(rowDescriptors);\n```\n\n##### The DataModel\n\nThe grid determines what to render for a given cell by calling the supplied data model. This gives the client massive flexbility to generate and return the data however they need to.\n\nThe datamodel can be a simple object that the user sets on the grid instance `dataModel` field and needs to implement at a minimum\n\n`get`, `getHeader`, and `isDirty`, \n\nif you support user data entry and want paste to work you should also implement `set`\n\nHere's a basic read only implementation:\n\n``` javascript\n// use the grid's default dirty clean implementation almost always\n// (it will automatically be set clean on each draw by the grid)\nvar dataDirtyClean = grid.makeDirtyClean();\n\ngrid.dataModel = {\n\n    get: function(dataRowIndex, dataColIndex, isCopy) {\n        var rawValue = [dataRowIndex, dataColIndex];\n        return {\n            value: rawValue,\n            formatted: 'r' + rawValue[0] + ', c' + rawValue[1]\n        };\n    },\n    \n    getHeader: function(headerRowIndex, headerColIndex) {\n        var rawValue = [headerRowIndex, headerColIndex];\n        return {\n            value: rawValue,\n            formatted: 'hr' + rawValue[0] + ', hc' + rawValue[1]\n        };\n    },\n    \n    isDirty: dataDirtyClean.isDirty\n};\n```\n\n##### Call Build\nFinally we just need to tell the grid to set itself up in a container of our choosing:\n\n``` javascript\nvar container = document.createElement('div');\ncontainer.style.width = '800px';\ncontainer.style.height = '800px';\ndocument.body.appendChild(container);\ngrid.build(container);\n```\n\nConcepts\n===\n\nMany of the apis in the grid utilize two concepts when referencing coordinates: spaces and units. It's good to understand these before using the more advanced features.\n\n## Spaces\nCoordinates in the grid exist in one of three spaces.\n\n**virtual** - represents all of the data in your grid including the headers. for example, if you have a grid with one header row, then `(0, 20)` in the `'virtual'` space references the column 20 of the header. `(1, 20)` would reference column 20 of the first data row.\n\n**data** - very similar to virtual but does not include the headers. so `(0,20)` references the first row of data at the 20th column and technically `(-1, 20)` would represent the 20th column in the header although negative indexes are rarely used\n\n**view** - the view space represents the actual dom nodes that are rendered for the grid's virtualization. the grid's implementation renders enough cells to fill the entire viewport and no more (usually around 20-30 rows and 10 cols depending on sizes). in this space `(0,20)` would reference the dom cell at column 20 of the first row. even if you scroll the grid it will always point at that cell, so a view coordinate can be translated to different virtual coordinates depending on the scroll. you could think of view coordinates as a correlary for `position: fixed` in css\n\n## Units\nUnits in the grid are straightforward. They are either\n\n**px** - pixels, so `(0,0)` in the view space is the very top left pixel of the grid no matter the scroll, whereas `(0,0)` in the virtual space is the top left pixel only when the grid hasn't been scrolled, and would technically refer to a pixel out of view if the grid has been scrolled\n\nor\n\n**cell** - cells, so `(0,0)` in the view space represents the top left cell regardless of scroll, and `(0,0)` in the virtual space would represent an off screen cell if scrolled and top left if not scrolled\n\nUsing Custom HTML\n===\n\nThere are two ways to get non text (read html) into a grid:\n\n## Decorators\nDecorators are great for adding a piece of one-off ui that doesn't relate directly to the content of a cell or doesn't need to be in every row of a column or vice versa. For example, the grid internally uses decorators to render the focus and selection highlight as well as resize handles.\n\n**basic decorator**\n``` javascript\n\tvar top = 1,\n    left = 2,\n    height = 1,\n    width = 1,\n    unit = 'cell',\n    space = 'view';\n    var d = grid.decorators.create(top, left, height, width, unit, space);\n\n    // return some element\n    d.render = function() {\n        var a = document.createElement('a')\n        a.textContent = 'link Text!'\n        return a;\n    };\n    grid.decorators.add(d);\n```\n\nPuts a link over the cell at row 1 col 2 that doesn’t move with the scroll (why you would do this is questionable but it's just an example).\n\nYou can do more complicated things like render directives: (requires grid-angular-adapter)\n\n**angular directive decorator**\n``` javascript\nangular.module('myCoolGrid', [require('grid')])\n\n  .controller('MyGridCtrl', function($scope, GridSrvc, GridDecoratorSrvc) {\n      var grid = GridSrvc.core();\n\n      // do row col and datamodel setup...\n\n      var top = 20,\n          left = 10,\n          height = 2,\n          width = 2,\n          unit = 'cell',\n          space = 'virtual';\n      var d = grid.decorators.create(top, left, height, width, unit, space);\n\n      // return some element\n      d.render = function() {\n          var scope = $scope.$new();\n          scope.interestingData = 'INTERESTING DATA!!!';\n          return GridDecoratorSrvc.render({\n              $scope: scope,\n              template: '<my-directive data=\"interestingData\"></my-directive>',\n              events: true\n          });\n      };\n      grid.decorators.add(d);\n  });\n```\n\nThis will put your compiled directive in a box that spans from `row 20-22` and `col 10-12`, and moves appropriately with the scroll. The `events` flag lets the grid know that this decorator is interactable and should receive mouse events. (Otherwise pointer events are set to none.) The GridDecoratorSrvc takes care of destroying the scope and properly removing elements to avoid memory leaks with angular. You definitely should use it for any angular decorators.\n\n\n## Builders\nBuilders help you to get html into the actual cells of a given row or column instead of the text that would have been rendered.\n\n\n**basic builders**\n``` javascript\nvar builder = grid.colModel.createBuilder(function render() {\n    return angular.element('<a href=\"#\"></a>')[0];\n}, function update(elem, ctx) {\n    grid.viewLayer.setTextContent(elem, ctx.data.formatted);\n    return elem;\n});\nvar colDescriptor = grid.colModel.create(builder);\n```\n\nhave `<a>` tags in your cells for all the rows in that column\n\nNote: it's important for the update function of a builder to be extremely fast. Call `scope.$digest` not `scope.$apply`, and  use `grid.viewLayer.setTextContent` not `elem.innerHTML` where possible\n\n\nStyling\n===\nIf you want to update the look and feel of the grid, here are a few classes that you can override to give you the look you want.\n\n\n## Classes\n\n**`.grid-cell`:**\nThis class is responsible for the look of individual cells. \n\n**`.grid-focus-decorator`:** This decorator class is applied when you click('focus') on a cell\n\nEx. Adding the following style will give you a cell with a blue border around it when the cell is selected.\n``` css\n.grid-focus-decorator {\n  border: 2px solid blue;\n}\n```\n\n**`.grid-selection`:**\nWhen selecting rows and columns, this class sets the border and background so you know which rows you are exactly selecting\n\nEx.\n```css\n$grid-teal: #39CCCC !default;\n.grid-selection {\n  border: 1px solid $grid-teal;\n  background: transparentize($grid-teal, .8);\n}\n```\n\n**`.grid-row`:**\nThis class is responsible for the look of the row of cells.\n\nEx. To apply, a background color when hovering over each row, add the following:\n```css\n.grid-row {\n  &.hover {\n    background-color: lighten($grid-teal, 30) !important;\n  }\n}\n```\n\nTo apply styles only to the header row, use the following class:\n```css\n.grid-row {\n  &.grid-is-header {\n  }\n}\n\n```\n**`.col-resize`:** This class changes the look of the column resizing element. \n\n**`.grid-drag-line`**: This class is used when you are resizing a column. A vertical line is added to guide you of how much to resize your columns.\n\nEx. To show a blue vertical line when resizing a column, add the following\n```css\n.grid-drag-line {\n  background: #7FDBFF;\n}\n```\n\n","readmeFilename":"README.md","gitHead":"f69f1747373f840b7766143c5afda262e8c04f77","_id":"grid@4.6.1","_npmVersion":"6.4.1","_nodeVersion":"8.16.0","_npmUser":{"name":"riqlandia-ci","email":"rusty.camden@gmail.com"},"dist":{"integrity":"sha512-ai/cyBSKVAnaIOIoYIIjpsFYGwk+TWC6+b9YJg8qtwNHsjFQVLwPvxS81yxaSnIPXaKDwGQ2uGUsbyASNE4ktQ==","shasum":"5556b861ac705f83a81eada6ab8f69c142be5da6","tarball":"https://registry.npmjs.org/grid/-/grid-4.6.1.tgz","fileCount":119,"unpackedSize":1326691,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJcvk4YCRA9TVsSAnZWagAA7ycP/isqlWGs+IU69wImhcVZ\nzPCuBd8t2cEocNnI30aRH/Lhk83qzLYdTOIjJDSN0Wksg304WC2cFE2k6Nxq\n5GKKDzkCAavy+x4XVLQhCJHTuA3RK/YiNZnqx5vJf+3qWLUU8+ufLDezFjMo\nPL1jciBLqB7DkT6WUrWzxbURf/b+SOE41+CtfxpToi/dt3jqs2x/CgSkcrb2\nSF3OqX+SL4RO9+OWCFv/OfSBnuROQffa0ffo+gObos1NNt9vt6BfdDZDSyNz\nxKOo9ZK637ZYXoBdQIBnqqwC4t7XdcfSc+P4metOZZeAIDLd1Bo+3ve2wMYy\n78Phsybtojd1pYZDTqpf2xcykW1sPfCLftpV4A8PVs9zfCQicPH9VqqZWq4G\nNgj7TXwhhcYZ/IDLV9RitvFsf/wjfZUBtqBCLn6xEgiMjXrDtuefzk5HFq+i\nI7qoauk4LsS/8bMOXqy7b9jh6RcPHl3Pcw+5TNoL2FTack0Hb1vzHVIRGYmj\nnzSPClAJmhQCA+t+ne/wdpJZA9/vGFNwURL4f0lh3pE1gPlL1vSJquyneUbX\nq78rO3UhdkBc51rvCjFyGstKe4ArjHFTVGSMdgot1bc9/vuyHCOeHSaNMuG3\nOuVJly/DAXGcN+pZgUyRiqItmLi/NdTJIUsv3Y85vNqcnTwjrETBVNUrkD3b\nOKO0\r\n=/jEs\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIBuPB0/gKrxTLmMFWKutV7R0qIl8ipK3ROa55DzuKCEEAiBySYkbVuVRtoSfE3D2eVWYTn1KFNqFDp7bEtpKtBwchQ=="}]},"maintainers":[{"email":"anthony.liatsis@gmail.com","name":"anthonyl"},{"email":"ben@benshope.com","name":"benshope"},{"email":"christy@relateiq.com","name":"cdennison"},{"email":"joechrz@gmail.com","name":"joechrz"},{"email":"joe.mun@salesforce.com","name":"joemun"},{"email":"john.fox@relateiq.com","name":"john.fox"},{"email":"jon@relateiq.com","name":"jontomas"},{"email":"keven425@gmail.com","name":"keven425"},{"email":"lerhaupt@gmail.com","name":"lerhaupt"},{"email":"rusty.camden@gmail.com","name":"riqlandia-ci"},{"email":"rusty.camden@gmail.com","name":"scamden"},{"email":"public@matthewmartin.com","name":"voxmatt"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/grid_4.6.1_1555975704050_0.6776559137964449"},"_hasShrinkwrap":false},"4.7.0":{"name":"grid","version":"4.7.0","description":"A highly scalable grid component written in javscript","main":"dist/bundle.js","typings":"dist/modules/core/index.d.ts","publishConfig":{"registry":"https://registry.npmjs.org/","tag":"next"},"engines":{"node":">=0.10.0"},"iqproj":{"app":true},"scripts":{"commitmsg":"validate-commit-msg","preversion":"npm run build","open:src":"babel-node tools/srcServer.js","dev":"npm-run-all --parallel open:src test:watch","clean":"rm -rf ./dist && mkdir dist","prebuild":"npm run clean && npm run test","build":"node tools/build.js","test":"node_modules/karma/bin/karma start --single-run --no-auto-watch karma.conf.js","test:watch":"node_modules/karma/bin/karma start karma.conf.js","semantic-release":"semantic-release pre && npm publish && semantic-release post"},"dependencies":{"capitalize":"^0.5.0","click-off":"~0.2.1","element-class":"^0.1.1","es6-object-assign":"~1.1.0","escape-stack":"~0.1.2","inner-text-shim":"~1.0.1","key":"^0.1.11","time-now":"~0.2.1"},"devDependencies":{"@types/jasmine":"~2.6.0","@types/karma":"~1.7.0","autoprefixer":"~6.4.0","awesome-typescript-loader":"~3.2.3","babel-cli":"~6.24.1","babel-loader":"~6.2.5","babel-preset-es2015":"~6.18.0","babel-preset-stage-1":"~6.13.0","browser-sync":"~2.18.12","condition-circle":"~1.5.0","copy-webpack-plugin":"~3.0.1","core-js-webpack-plugin":"~1.0.3","css-loader":"~0.24.0","ejs-compiled-loader":"~1.1.0","es6-promise":"~3.1.2","extract-text-webpack-plugin":"~3.0.1","file-loader":"~0.9.0","html-webpack-plugin":"~2.22.0","husky":"~0.13.3","jasmine":"~2.3.2","jasmine-tools-riq":"~0.3.2","jquery":"^2.1.0","karma":"~1.7.1","karma-chrome-launcher":"~0.2.1","karma-jasmine":"~0.3.6","karma-jasmine-jquery":"~0.1.1","karma-phantomjs-launcher":"~1.0.4","karma-sourcemap-loader":"~0.3.7","karma-webpack":"~2.0.4","lodash":"~4.11.0","node-sass":"~4.9.3","npm-run-all":"~4.0.2","phantomjs-prebuilt":"~2.1.14","polyfill-function-prototype-bind":"0.0.1","postcss-loader":"~0.11.0","sass-loader":"~4.1.1","semantic-release":"^4.3.5","source-map-loader":"~0.2.0","style-loader":"~0.13.1","transform-ts-paths":"^1.0.0","ts-loader":"~2.3.7","tslint":"^5.4.2","tslint-eslint-rules":"^4.1.1","typescript":"~3.0.3","url-loader":"~0.5.7","validate-commit-msg":"~2.12.1","webpack":"~3.6.0","webpack-bundle-analyzer":"^2.8.2","webpack-dev-middleware":"~1.6.1","webpack-fail-plugin":"~1.0.5","webpack-hot-middleware":"~2.12.2","webpack-md5-hash":"~0.0.5"},"repository":{"type":"git","url":"git+https://github.com/gridgrid/grid.git"},"keywords":["grid","spreadsheet","virtual","scroll"],"author":{"name":"Sterling Camden"},"license":"MIT","bugs":{"url":"https://github.com/gridgrid/grid/issues"},"homepage":"https://github.com/gridgrid/grid","config":{"commitizen":{"path":"cz-conventional-changelog"}},"release":{"verifyConditions":"condition-circle","branch":"next","fallbackTags":{"next":"latest"}},"readme":"[![npm](https://img.shields.io/npm/v/grid.svg)]( https://www.npmjs.com/package/grid) [![CircleCI](https://circleci.com/gh/gridgrid/grid.svg?style=shield)](https://circleci.com/gh/gridgrid/grid)  [![semantic-release](https://img.shields.io/badge/%20%20%F0%9F%93%A6%F0%9F%9A%80-semantic--release-e10079.svg)](https://github.com/semantic-release/semantic-release) [![Commitizen friendly](https://img.shields.io/badge/commitizen-friendly-brightgreen.svg)](http://commitizen.github.io/cz-cli/)\n\nGrid\n===\n\nA highly scalable grid component written in javscript [DEMO](https://gridgrid.github.io/grid/ \"Grid Demo\")\n\nNote: while Grid is fully functional it is still in beta. Use at your own risk and please file any issues on GitHub. \n\nAlso the grid is currently packaged for use with browserify. If you need a build for a non browserify (or webpack) environment please open an issue on github.\n\n\nInstallation\n===\n`npm install --save grid`\n\n\nExample / Quick-Start\n===\n\nTo run the sample app locally, run `npm start` and hit http://localhost:8082\n\n##### Create a Grid Instance\n`var core = require('grid')`\n`var grid = core();`\n\nThe grid handles most complexity for you. There are only three user supplied requirements to a get a grid up and running\n\n##### Row and Column Descriptors\nRow and column descriptors are objects that tell the grid how wide or high to make your cells. They also control things like whether or not a column is hidden and describe the overall dimensions of the grid.\n\n``` javascript\n\t// add some columns\n    var colDescriptors = [];\n    var colDescriptor;\n    for (var c = 0; c < 20; c++) {\n        // create a col descriptor\n        colDescriptor = grid.colModel.create();\n        colDescriptor.width = 78;\n        colDescriptor.hidden = !!(c % 2); // hide every other column for fun and profit\n    }\n    grid.colModel.add(colDescriptors);\n\n    // add some rows\n    var rowDescriptors = [];\n    var rowDescriptor;\n    for (var r = 0; r < 20; r++) {\n        // create a row descriptor\n        rowDescriptor = grid.rowModel.create();\n        rowDescriptor.height = 24;\n        if(r === 0){\n        \trowDescriptor.header = true;\n        }\n    }\n    grid.rowModel.add(rowDescriptors);\n```\n\n##### The DataModel\n\nThe grid determines what to render for a given cell by calling the supplied data model. This gives the client massive flexbility to generate and return the data however they need to.\n\nThe datamodel can be a simple object that the user sets on the grid instance `dataModel` field and needs to implement at a minimum\n\n`get`, `getHeader`, and `isDirty`, \n\nif you support user data entry and want paste to work you should also implement `set`\n\nHere's a basic read only implementation:\n\n``` javascript\n// use the grid's default dirty clean implementation almost always\n// (it will automatically be set clean on each draw by the grid)\nvar dataDirtyClean = grid.makeDirtyClean();\n\ngrid.dataModel = {\n\n    get: function(dataRowIndex, dataColIndex, isCopy) {\n        var rawValue = [dataRowIndex, dataColIndex];\n        return {\n            value: rawValue,\n            formatted: 'r' + rawValue[0] + ', c' + rawValue[1]\n        };\n    },\n    \n    getHeader: function(headerRowIndex, headerColIndex) {\n        var rawValue = [headerRowIndex, headerColIndex];\n        return {\n            value: rawValue,\n            formatted: 'hr' + rawValue[0] + ', hc' + rawValue[1]\n        };\n    },\n    \n    isDirty: dataDirtyClean.isDirty\n};\n```\n\n##### Call Build\nFinally we just need to tell the grid to set itself up in a container of our choosing:\n\n``` javascript\nvar container = document.createElement('div');\ncontainer.style.width = '800px';\ncontainer.style.height = '800px';\ndocument.body.appendChild(container);\ngrid.build(container);\n```\n\nConcepts\n===\n\nMany of the apis in the grid utilize two concepts when referencing coordinates: spaces and units. It's good to understand these before using the more advanced features.\n\n## Spaces\nCoordinates in the grid exist in one of three spaces.\n\n**virtual** - represents all of the data in your grid including the headers. for example, if you have a grid with one header row, then `(0, 20)` in the `'virtual'` space references the column 20 of the header. `(1, 20)` would reference column 20 of the first data row.\n\n**data** - very similar to virtual but does not include the headers. so `(0,20)` references the first row of data at the 20th column and technically `(-1, 20)` would represent the 20th column in the header although negative indexes are rarely used\n\n**view** - the view space represents the actual dom nodes that are rendered for the grid's virtualization. the grid's implementation renders enough cells to fill the entire viewport and no more (usually around 20-30 rows and 10 cols depending on sizes). in this space `(0,20)` would reference the dom cell at column 20 of the first row. even if you scroll the grid it will always point at that cell, so a view coordinate can be translated to different virtual coordinates depending on the scroll. you could think of view coordinates as a correlary for `position: fixed` in css\n\n## Units\nUnits in the grid are straightforward. They are either\n\n**px** - pixels, so `(0,0)` in the view space is the very top left pixel of the grid no matter the scroll, whereas `(0,0)` in the virtual space is the top left pixel only when the grid hasn't been scrolled, and would technically refer to a pixel out of view if the grid has been scrolled\n\nor\n\n**cell** - cells, so `(0,0)` in the view space represents the top left cell regardless of scroll, and `(0,0)` in the virtual space would represent an off screen cell if scrolled and top left if not scrolled\n\nUsing Custom HTML\n===\n\nThere are two ways to get non text (read html) into a grid:\n\n## Decorators\nDecorators are great for adding a piece of one-off ui that doesn't relate directly to the content of a cell or doesn't need to be in every row of a column or vice versa. For example, the grid internally uses decorators to render the focus and selection highlight as well as resize handles.\n\n**basic decorator**\n``` javascript\n\tvar top = 1,\n    left = 2,\n    height = 1,\n    width = 1,\n    unit = 'cell',\n    space = 'view';\n    var d = grid.decorators.create(top, left, height, width, unit, space);\n\n    // return some element\n    d.render = function() {\n        var a = document.createElement('a')\n        a.textContent = 'link Text!'\n        return a;\n    };\n    grid.decorators.add(d);\n```\n\nPuts a link over the cell at row 1 col 2 that doesn’t move with the scroll (why you would do this is questionable but it's just an example).\n\nYou can do more complicated things like render directives: (requires grid-angular-adapter)\n\n**angular directive decorator**\n``` javascript\nangular.module('myCoolGrid', [require('grid')])\n\n  .controller('MyGridCtrl', function($scope, GridSrvc, GridDecoratorSrvc) {\n      var grid = GridSrvc.core();\n\n      // do row col and datamodel setup...\n\n      var top = 20,\n          left = 10,\n          height = 2,\n          width = 2,\n          unit = 'cell',\n          space = 'virtual';\n      var d = grid.decorators.create(top, left, height, width, unit, space);\n\n      // return some element\n      d.render = function() {\n          var scope = $scope.$new();\n          scope.interestingData = 'INTERESTING DATA!!!';\n          return GridDecoratorSrvc.render({\n              $scope: scope,\n              template: '<my-directive data=\"interestingData\"></my-directive>',\n              events: true\n          });\n      };\n      grid.decorators.add(d);\n  });\n```\n\nThis will put your compiled directive in a box that spans from `row 20-22` and `col 10-12`, and moves appropriately with the scroll. The `events` flag lets the grid know that this decorator is interactable and should receive mouse events. (Otherwise pointer events are set to none.) The GridDecoratorSrvc takes care of destroying the scope and properly removing elements to avoid memory leaks with angular. You definitely should use it for any angular decorators.\n\n\n## Builders\nBuilders help you to get html into the actual cells of a given row or column instead of the text that would have been rendered.\n\n\n**basic builders**\n``` javascript\nvar builder = grid.colModel.createBuilder(function render() {\n    return angular.element('<a href=\"#\"></a>')[0];\n}, function update(elem, ctx) {\n    grid.viewLayer.setTextContent(elem, ctx.data.formatted);\n    return elem;\n});\nvar colDescriptor = grid.colModel.create(builder);\n```\n\nhave `<a>` tags in your cells for all the rows in that column\n\nNote: it's important for the update function of a builder to be extremely fast. Call `scope.$digest` not `scope.$apply`, and  use `grid.viewLayer.setTextContent` not `elem.innerHTML` where possible\n\n\nStyling\n===\nIf you want to update the look and feel of the grid, here are a few classes that you can override to give you the look you want.\n\n\n## Classes\n\n**`.grid-cell`:**\nThis class is responsible for the look of individual cells. \n\n**`.grid-focus-decorator`:** This decorator class is applied when you click('focus') on a cell\n\nEx. Adding the following style will give you a cell with a blue border around it when the cell is selected.\n``` css\n.grid-focus-decorator {\n  border: 2px solid blue;\n}\n```\n\n**`.grid-selection`:**\nWhen selecting rows and columns, this class sets the border and background so you know which rows you are exactly selecting\n\nEx.\n```css\n$grid-teal: #39CCCC !default;\n.grid-selection {\n  border: 1px solid $grid-teal;\n  background: transparentize($grid-teal, .8);\n}\n```\n\n**`.grid-row`:**\nThis class is responsible for the look of the row of cells.\n\nEx. To apply, a background color when hovering over each row, add the following:\n```css\n.grid-row {\n  &.hover {\n    background-color: lighten($grid-teal, 30) !important;\n  }\n}\n```\n\nTo apply styles only to the header row, use the following class:\n```css\n.grid-row {\n  &.grid-is-header {\n  }\n}\n\n```\n**`.col-resize`:** This class changes the look of the column resizing element. \n\n**`.grid-drag-line`**: This class is used when you are resizing a column. A vertical line is added to guide you of how much to resize your columns.\n\nEx. To show a blue vertical line when resizing a column, add the following\n```css\n.grid-drag-line {\n  background: #7FDBFF;\n}\n```\n\n","readmeFilename":"README.md","gitHead":"6b64afed21eec6c7bb418fa2d530bb59df16e14d","_id":"grid@4.7.0","_npmVersion":"6.4.1","_nodeVersion":"8.16.0","_npmUser":{"name":"riqlandia-ci","email":"rusty.camden@gmail.com"},"dist":{"integrity":"sha512-hTz6ceu0HN40cwyKst6t6cbJ9eDIBxXvGlGyf1wMztYJ/xQ5pp2Pv4N1vGQwh8I9i+o0gpLP1kH1WydKHfxWAg==","shasum":"f367768f0c339cbf2cbf650ffb908067f5a62014","tarball":"https://registry.npmjs.org/grid/-/grid-4.7.0.tgz","fileCount":119,"unpackedSize":1327034,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJcwPMRCRA9TVsSAnZWagAA5PkP/1BIr5JRduPOo7jbAS69\nfOU4q/UwT223lz5YuR/l8Rn9pYPTgkcE4uBw9J+Licg0aSjNC0XiDXt1Casw\nNjA4BilZMzMVZcEoExp9yIroFt/xLesAM1FjpPlnq/ph7KrqUNJ5q1G3GAO1\nUUUnhxeKBQ7bhzsCSdggilsUOQ2w3F44ZpCQ+zTCuQihGEw00GlJd7mMmGQv\nRd0huZy6Q7F1U+P/HJnfYI/uSi5W1oc8NKY32MJ4Nfih5CZeq+wd7e2lNOEi\nL/rOZ7oIZqUg7i1B1dVXkcP+z7ODgUqURGx0OrqISS5wq1cJWlqJRmSVQRsW\ndd88mLX4KSPVG77uRuy3/LKBUlcHLMvHUXSrXQUA1ARhC/XWaTMby5V87BV9\n9dzdYB2uILEkYAl7B7onHLehm8Af2NGKrxe5zs8MJsUZACM9JukoJNRBxPav\nSeMUq8+RMlyRInvxuRSAftZFvIpI5Fh6KUasTGVnVDBxZOEZWc6YepvmRb/X\ndNRCz80rW55eYFX3NDDUUXfXWUIGG7cgN6eubYsPjyhnIPeRL3SWaK7kbKJ5\nudjBzseZ7/Ee1YaqsT+I9nKYJ7clr/a9RLTHxYwL645I6LWE074UwyIHm20N\nFQTbcfn00yBQ6hjGk1BlfAubPz6GNmYBN93xYm/7tygrjlzryCCrd/q2CLhn\nOwKk\r\n=I53y\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIEMRVYDMExcqoUm8EPQ510VizmK9a3v0lO7vKK+FsXIxAiEAmRk7NLbDyXs7m1QIxUSu08MhFPFKhM8vRs2HAqrXaow="}]},"maintainers":[{"email":"anthony.liatsis@gmail.com","name":"anthonyl"},{"email":"ben@benshope.com","name":"benshope"},{"email":"christy@relateiq.com","name":"cdennison"},{"email":"joechrz@gmail.com","name":"joechrz"},{"email":"joe.mun@salesforce.com","name":"joemun"},{"email":"john.fox@relateiq.com","name":"john.fox"},{"email":"jon@relateiq.com","name":"jontomas"},{"email":"keven425@gmail.com","name":"keven425"},{"email":"lerhaupt@gmail.com","name":"lerhaupt"},{"email":"rusty.camden@gmail.com","name":"riqlandia-ci"},{"email":"rusty.camden@gmail.com","name":"scamden"},{"email":"public@matthewmartin.com","name":"voxmatt"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/grid_4.7.0_1556149009160_0.7101722380136939"},"_hasShrinkwrap":false},"4.8.0":{"name":"grid","version":"4.8.0","description":"A highly scalable grid component written in javscript","main":"dist/bundle.js","typings":"dist/modules/core/index.d.ts","publishConfig":{"registry":"https://registry.npmjs.org/","tag":"next"},"engines":{"node":">=0.10.0"},"iqproj":{"app":true},"scripts":{"commitmsg":"validate-commit-msg","preversion":"npm run build","open:src":"babel-node tools/srcServer.js","dev":"npm-run-all --parallel open:src test:watch","clean":"rm -rf ./dist && mkdir dist","prebuild":"npm run clean && npm run test","build":"node tools/build.js","test":"node_modules/karma/bin/karma start --single-run --no-auto-watch karma.conf.js","test:watch":"node_modules/karma/bin/karma start karma.conf.js","semantic-release":"semantic-release pre && npm publish && semantic-release post"},"dependencies":{"capitalize":"^0.5.0","click-off":"~0.2.1","element-class":"^0.1.1","es6-object-assign":"~1.1.0","escape-stack":"~0.1.2","inner-text-shim":"~1.0.1","key":"^0.1.11","time-now":"~0.2.1"},"devDependencies":{"@types/jasmine":"~2.6.0","@types/karma":"~1.7.0","autoprefixer":"~6.4.0","awesome-typescript-loader":"~3.2.3","babel-cli":"~6.24.1","babel-loader":"~6.2.5","babel-preset-es2015":"~6.18.0","babel-preset-stage-1":"~6.13.0","browser-sync":"~2.18.12","condition-circle":"~1.5.0","copy-webpack-plugin":"~3.0.1","core-js-webpack-plugin":"~1.0.3","css-loader":"~0.24.0","ejs-compiled-loader":"~1.1.0","es6-promise":"~3.1.2","extract-text-webpack-plugin":"~3.0.1","file-loader":"~0.9.0","html-webpack-plugin":"~2.22.0","husky":"~0.13.3","jasmine":"~2.3.2","jasmine-tools-riq":"~0.3.2","jquery":"^2.1.0","karma":"~1.7.1","karma-chrome-launcher":"~0.2.1","karma-jasmine":"~0.3.6","karma-jasmine-jquery":"~0.1.1","karma-phantomjs-launcher":"~1.0.4","karma-sourcemap-loader":"~0.3.7","karma-webpack":"~2.0.4","lodash":"~4.11.0","node-sass":"~4.9.3","npm-run-all":"~4.0.2","phantomjs-prebuilt":"~2.1.14","polyfill-function-prototype-bind":"0.0.1","postcss-loader":"~0.11.0","sass-loader":"~4.1.1","semantic-release":"^4.3.5","source-map-loader":"~0.2.0","style-loader":"~0.13.1","transform-ts-paths":"^1.0.0","ts-loader":"~2.3.7","tslint":"^5.4.2","tslint-eslint-rules":"^4.1.1","typescript":"~3.0.3","url-loader":"~0.5.7","validate-commit-msg":"~2.12.1","webpack":"~3.6.0","webpack-bundle-analyzer":"^2.8.2","webpack-dev-middleware":"~1.6.1","webpack-fail-plugin":"~1.0.5","webpack-hot-middleware":"~2.12.2","webpack-md5-hash":"~0.0.5"},"repository":{"type":"git","url":"git+https://github.com/gridgrid/grid.git"},"keywords":["grid","spreadsheet","virtual","scroll"],"author":{"name":"Sterling Camden"},"license":"MIT","bugs":{"url":"https://github.com/gridgrid/grid/issues"},"homepage":"https://github.com/gridgrid/grid","config":{"commitizen":{"path":"cz-conventional-changelog"}},"release":{"verifyConditions":"condition-circle","branch":"next","fallbackTags":{"next":"latest"}},"readme":"[![npm](https://img.shields.io/npm/v/grid.svg)]( https://www.npmjs.com/package/grid) [![CircleCI](https://circleci.com/gh/gridgrid/grid.svg?style=shield)](https://circleci.com/gh/gridgrid/grid)  [![semantic-release](https://img.shields.io/badge/%20%20%F0%9F%93%A6%F0%9F%9A%80-semantic--release-e10079.svg)](https://github.com/semantic-release/semantic-release) [![Commitizen friendly](https://img.shields.io/badge/commitizen-friendly-brightgreen.svg)](http://commitizen.github.io/cz-cli/)\n\nGrid\n===\n\nA highly scalable grid component written in javscript [DEMO](https://gridgrid.github.io/grid/ \"Grid Demo\")\n\nNote: while Grid is fully functional it is still in beta. Use at your own risk and please file any issues on GitHub. \n\nAlso the grid is currently packaged for use with browserify. If you need a build for a non browserify (or webpack) environment please open an issue on github.\n\n\nInstallation\n===\n`npm install --save grid`\n\n\nExample / Quick-Start\n===\n\nTo run the sample app locally, run `npm start` and hit http://localhost:8082\n\n##### Create a Grid Instance\n`var core = require('grid')`\n`var grid = core();`\n\nThe grid handles most complexity for you. There are only three user supplied requirements to a get a grid up and running\n\n##### Row and Column Descriptors\nRow and column descriptors are objects that tell the grid how wide or high to make your cells. They also control things like whether or not a column is hidden and describe the overall dimensions of the grid.\n\n``` javascript\n\t// add some columns\n    var colDescriptors = [];\n    var colDescriptor;\n    for (var c = 0; c < 20; c++) {\n        // create a col descriptor\n        colDescriptor = grid.colModel.create();\n        colDescriptor.width = 78;\n        colDescriptor.hidden = !!(c % 2); // hide every other column for fun and profit\n    }\n    grid.colModel.add(colDescriptors);\n\n    // add some rows\n    var rowDescriptors = [];\n    var rowDescriptor;\n    for (var r = 0; r < 20; r++) {\n        // create a row descriptor\n        rowDescriptor = grid.rowModel.create();\n        rowDescriptor.height = 24;\n        if(r === 0){\n        \trowDescriptor.header = true;\n        }\n    }\n    grid.rowModel.add(rowDescriptors);\n```\n\n##### The DataModel\n\nThe grid determines what to render for a given cell by calling the supplied data model. This gives the client massive flexbility to generate and return the data however they need to.\n\nThe datamodel can be a simple object that the user sets on the grid instance `dataModel` field and needs to implement at a minimum\n\n`get`, `getHeader`, and `isDirty`, \n\nif you support user data entry and want paste to work you should also implement `set`\n\nHere's a basic read only implementation:\n\n``` javascript\n// use the grid's default dirty clean implementation almost always\n// (it will automatically be set clean on each draw by the grid)\nvar dataDirtyClean = grid.makeDirtyClean();\n\ngrid.dataModel = {\n\n    get: function(dataRowIndex, dataColIndex, isCopy) {\n        var rawValue = [dataRowIndex, dataColIndex];\n        return {\n            value: rawValue,\n            formatted: 'r' + rawValue[0] + ', c' + rawValue[1]\n        };\n    },\n    \n    getHeader: function(headerRowIndex, headerColIndex) {\n        var rawValue = [headerRowIndex, headerColIndex];\n        return {\n            value: rawValue,\n            formatted: 'hr' + rawValue[0] + ', hc' + rawValue[1]\n        };\n    },\n    \n    isDirty: dataDirtyClean.isDirty\n};\n```\n\n##### Call Build\nFinally we just need to tell the grid to set itself up in a container of our choosing:\n\n``` javascript\nvar container = document.createElement('div');\ncontainer.style.width = '800px';\ncontainer.style.height = '800px';\ndocument.body.appendChild(container);\ngrid.build(container);\n```\n\nConcepts\n===\n\nMany of the apis in the grid utilize two concepts when referencing coordinates: spaces and units. It's good to understand these before using the more advanced features.\n\n## Spaces\nCoordinates in the grid exist in one of three spaces.\n\n**virtual** - represents all of the data in your grid including the headers. for example, if you have a grid with one header row, then `(0, 20)` in the `'virtual'` space references the column 20 of the header. `(1, 20)` would reference column 20 of the first data row.\n\n**data** - very similar to virtual but does not include the headers. so `(0,20)` references the first row of data at the 20th column and technically `(-1, 20)` would represent the 20th column in the header although negative indexes are rarely used\n\n**view** - the view space represents the actual dom nodes that are rendered for the grid's virtualization. the grid's implementation renders enough cells to fill the entire viewport and no more (usually around 20-30 rows and 10 cols depending on sizes). in this space `(0,20)` would reference the dom cell at column 20 of the first row. even if you scroll the grid it will always point at that cell, so a view coordinate can be translated to different virtual coordinates depending on the scroll. you could think of view coordinates as a correlary for `position: fixed` in css\n\n## Units\nUnits in the grid are straightforward. They are either\n\n**px** - pixels, so `(0,0)` in the view space is the very top left pixel of the grid no matter the scroll, whereas `(0,0)` in the virtual space is the top left pixel only when the grid hasn't been scrolled, and would technically refer to a pixel out of view if the grid has been scrolled\n\nor\n\n**cell** - cells, so `(0,0)` in the view space represents the top left cell regardless of scroll, and `(0,0)` in the virtual space would represent an off screen cell if scrolled and top left if not scrolled\n\nUsing Custom HTML\n===\n\nThere are two ways to get non text (read html) into a grid:\n\n## Decorators\nDecorators are great for adding a piece of one-off ui that doesn't relate directly to the content of a cell or doesn't need to be in every row of a column or vice versa. For example, the grid internally uses decorators to render the focus and selection highlight as well as resize handles.\n\n**basic decorator**\n``` javascript\n\tvar top = 1,\n    left = 2,\n    height = 1,\n    width = 1,\n    unit = 'cell',\n    space = 'view';\n    var d = grid.decorators.create(top, left, height, width, unit, space);\n\n    // return some element\n    d.render = function() {\n        var a = document.createElement('a')\n        a.textContent = 'link Text!'\n        return a;\n    };\n    grid.decorators.add(d);\n```\n\nPuts a link over the cell at row 1 col 2 that doesn’t move with the scroll (why you would do this is questionable but it's just an example).\n\nYou can do more complicated things like render directives: (requires grid-angular-adapter)\n\n**angular directive decorator**\n``` javascript\nangular.module('myCoolGrid', [require('grid')])\n\n  .controller('MyGridCtrl', function($scope, GridSrvc, GridDecoratorSrvc) {\n      var grid = GridSrvc.core();\n\n      // do row col and datamodel setup...\n\n      var top = 20,\n          left = 10,\n          height = 2,\n          width = 2,\n          unit = 'cell',\n          space = 'virtual';\n      var d = grid.decorators.create(top, left, height, width, unit, space);\n\n      // return some element\n      d.render = function() {\n          var scope = $scope.$new();\n          scope.interestingData = 'INTERESTING DATA!!!';\n          return GridDecoratorSrvc.render({\n              $scope: scope,\n              template: '<my-directive data=\"interestingData\"></my-directive>',\n              events: true\n          });\n      };\n      grid.decorators.add(d);\n  });\n```\n\nThis will put your compiled directive in a box that spans from `row 20-22` and `col 10-12`, and moves appropriately with the scroll. The `events` flag lets the grid know that this decorator is interactable and should receive mouse events. (Otherwise pointer events are set to none.) The GridDecoratorSrvc takes care of destroying the scope and properly removing elements to avoid memory leaks with angular. You definitely should use it for any angular decorators.\n\n\n## Builders\nBuilders help you to get html into the actual cells of a given row or column instead of the text that would have been rendered.\n\n\n**basic builders**\n``` javascript\nvar builder = grid.colModel.createBuilder(function render() {\n    return angular.element('<a href=\"#\"></a>')[0];\n}, function update(elem, ctx) {\n    grid.viewLayer.setTextContent(elem, ctx.data.formatted);\n    return elem;\n});\nvar colDescriptor = grid.colModel.create(builder);\n```\n\nhave `<a>` tags in your cells for all the rows in that column\n\nNote: it's important for the update function of a builder to be extremely fast. Call `scope.$digest` not `scope.$apply`, and  use `grid.viewLayer.setTextContent` not `elem.innerHTML` where possible\n\n\nStyling\n===\nIf you want to update the look and feel of the grid, here are a few classes that you can override to give you the look you want.\n\n\n## Classes\n\n**`.grid-cell`:**\nThis class is responsible for the look of individual cells. \n\n**`.grid-focus-decorator`:** This decorator class is applied when you click('focus') on a cell\n\nEx. Adding the following style will give you a cell with a blue border around it when the cell is selected.\n``` css\n.grid-focus-decorator {\n  border: 2px solid blue;\n}\n```\n\n**`.grid-selection`:**\nWhen selecting rows and columns, this class sets the border and background so you know which rows you are exactly selecting\n\nEx.\n```css\n$grid-teal: #39CCCC !default;\n.grid-selection {\n  border: 1px solid $grid-teal;\n  background: transparentize($grid-teal, .8);\n}\n```\n\n**`.grid-row`:**\nThis class is responsible for the look of the row of cells.\n\nEx. To apply, a background color when hovering over each row, add the following:\n```css\n.grid-row {\n  &.hover {\n    background-color: lighten($grid-teal, 30) !important;\n  }\n}\n```\n\nTo apply styles only to the header row, use the following class:\n```css\n.grid-row {\n  &.grid-is-header {\n  }\n}\n\n```\n**`.col-resize`:** This class changes the look of the column resizing element. \n\n**`.grid-drag-line`**: This class is used when you are resizing a column. A vertical line is added to guide you of how much to resize your columns.\n\nEx. To show a blue vertical line when resizing a column, add the following\n```css\n.grid-drag-line {\n  background: #7FDBFF;\n}\n```\n\n","readmeFilename":"README.md","gitHead":"78b9cb8d423fc196b56b00d4d5ee0e88bd4c5f97","_id":"grid@4.8.0","_nodeVersion":"8.17.0","_npmVersion":"6.13.4","dist":{"integrity":"sha512-IhtBTnoJyJlkXI4yUemCqvVNdl3x6xQAu4Dzyce6Wn4Z3Fu1kBafkxCsyiQ4I7wZVY8Uhz8a3S8tuIyOZ0Ovhw==","shasum":"409d7948e414536a9906222c751778e9ab9b5b15","tarball":"https://registry.npmjs.org/grid/-/grid-4.8.0.tgz","fileCount":119,"unpackedSize":1327109,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJeRaqpCRA9TVsSAnZWagAA+2EP/01a8bK8tr7hvxEDvy6Z\n7MxDld3zjzShfefgnjiVoLvf+MavGDZiWwe6clgmImSJoimGIgCXz7SWKgxI\nG5NxkiKEfVEADOq4g6mJfwWOlGQ56Typj/l+tGAmY6tZOqixvwbSFKJwmcAr\nqVovsp/weqlAEHcQ91f/MO56uKZhhPOX1hA3Cr8ZxM3ZYAL0Oi9BGOzY7eHH\nnvXc3l6rWKGtAR6pYpusp+bO72oe/KDDrnERZIFh+lGtMQJ7o4oM2/4sYQG+\nbJDgv4BreejexaoSMuMeb2aUi65eR+UlXdQtlXZAN1CYcfX6J8zTbzydurln\nVnquogt9dOxvMegoLQj3RxA6pbu5gxOhlLGKhHfodl7fVn4tc/y/2rJgMXuc\nFWnzv7EMsCh7QFZ/4FUEZ23gFf5ZiDTVaXGr7X+AqUDqkQQCEuJBBcxUQedT\nRfyNQwYfwp73C1WV1D9m/veCFK6TYDGxiJN6Nt15a7PFJ57k5/BAx1GAs/Ml\nz/2TOQtAXZ/Yc2RsSUGK6MFAl5+fm2kJBqKH4i4Li8J63WA/t0wIA9/kw6GM\nONX0xYoC/O0ZJXuMvTfOH3K22+tpw7EP/H9PYez+tKjrYfQmGEquBhJs/2c2\n3LZSV7llUmt7rh9BM5I8JGmWwXBypRqGLzHJhDG9n6or8xrOyqEWuf6RaEDB\n4+XA\r\n=d4Jh\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIBxQewnuvQ8rmqGomlRJeb6DHyNZ5FVxqaxWE4om5KEuAiAsBA2NvXREyG4j2OldNcsCBNsTR44U0SlzhVKBIbmYGw=="}]},"maintainers":[{"email":"anthony.liatsis@gmail.com","name":"anthonyl"},{"email":"ben@benshope.com","name":"benshope"},{"email":"christy@relateiq.com","name":"cdennison"},{"email":"joechrz@gmail.com","name":"joechrz"},{"email":"joe.mun@salesforce.com","name":"joemun"},{"email":"john.fox@relateiq.com","name":"john.fox"},{"email":"jon@relateiq.com","name":"jontomas"},{"email":"keven425@gmail.com","name":"keven425"},{"email":"lerhaupt@gmail.com","name":"lerhaupt"},{"email":"rusty.camden@gmail.com","name":"riqlandia-ci"},{"email":"rusty.camden@gmail.com","name":"scamden"},{"email":"public@matthewmartin.com","name":"voxmatt"}],"_npmUser":{"name":"riqlandia-ci","email":"rusty.camden@gmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/grid_4.8.0_1581623977162_0.4223148128064209"},"_hasShrinkwrap":false},"4.9.0":{"name":"grid","version":"4.9.0","description":"A highly scalable grid component written in javscript","main":"dist/bundle.js","typings":"dist/modules/core/index.d.ts","publishConfig":{"registry":"https://registry.npmjs.org/","tag":"next"},"engines":{"node":">=0.10.0"},"iqproj":{"app":true},"scripts":{"commitmsg":"validate-commit-msg","preversion":"npm run build","open:src":"babel-node tools/srcServer.js","dev":"npm-run-all --parallel open:src test:watch","clean":"rm -rf ./dist && mkdir dist","prebuild":"npm run clean && npm run test","build":"node tools/build.js","test":"node_modules/karma/bin/karma start --single-run --no-auto-watch karma.conf.js","test:watch":"node_modules/karma/bin/karma start karma.conf.js","semantic-release":"semantic-release pre && npm publish && semantic-release post"},"dependencies":{"capitalize":"^0.5.0","click-off":"~0.2.1","element-class":"^0.1.1","es6-object-assign":"~1.1.0","escape-stack":"~0.1.2","inner-text-shim":"~1.0.1","key":"^0.1.11","time-now":"~0.2.1"},"devDependencies":{"@types/jasmine":"~2.6.0","@types/karma":"~1.7.0","autoprefixer":"~6.4.0","awesome-typescript-loader":"~3.2.3","babel-cli":"~6.24.1","babel-loader":"~6.2.5","babel-preset-es2015":"~6.18.0","babel-preset-stage-1":"~6.13.0","browser-sync":"~2.18.12","condition-circle":"~1.5.0","copy-webpack-plugin":"~3.0.1","core-js-webpack-plugin":"~1.0.3","css-loader":"~0.24.0","ejs-compiled-loader":"~1.1.0","es6-promise":"~3.1.2","extract-text-webpack-plugin":"~3.0.1","file-loader":"~0.9.0","html-webpack-plugin":"~2.22.0","husky":"~0.13.3","jasmine":"~2.3.2","jasmine-tools-riq":"~0.3.2","jquery":"^2.1.0","karma":"~1.7.1","karma-chrome-launcher":"~0.2.1","karma-jasmine":"~0.3.6","karma-jasmine-jquery":"~0.1.1","karma-phantomjs-launcher":"~1.0.4","karma-sourcemap-loader":"~0.3.7","karma-webpack":"~2.0.4","lodash":"~4.11.0","node-sass":"~4.9.3","npm-run-all":"~4.0.2","phantomjs-prebuilt":"~2.1.14","polyfill-function-prototype-bind":"0.0.1","postcss-loader":"~0.11.0","sass-loader":"~4.1.1","semantic-release":"^4.3.5","source-map-loader":"~0.2.0","style-loader":"~0.13.1","transform-ts-paths":"^1.0.0","ts-loader":"~2.3.7","tslint":"^5.4.2","tslint-eslint-rules":"^4.1.1","typescript":"~3.7.5","url-loader":"~0.5.7","validate-commit-msg":"~2.12.1","webpack":"~3.6.0","webpack-bundle-analyzer":"^2.8.2","webpack-dev-middleware":"~1.6.1","webpack-fail-plugin":"~1.0.5","webpack-hot-middleware":"~2.12.2","webpack-md5-hash":"~0.0.5"},"repository":{"type":"git","url":"git+https://github.com/gridgrid/grid.git"},"keywords":["grid","spreadsheet","virtual","scroll"],"author":{"name":"Sterling Camden"},"license":"MIT","bugs":{"url":"https://github.com/gridgrid/grid/issues"},"homepage":"https://github.com/gridgrid/grid","config":{"commitizen":{"path":"cz-conventional-changelog"}},"release":{"verifyConditions":"condition-circle","branch":"next","fallbackTags":{"next":"latest"}},"readme":"[![npm](https://img.shields.io/npm/v/grid.svg)]( https://www.npmjs.com/package/grid) [![CircleCI](https://circleci.com/gh/gridgrid/grid.svg?style=shield)](https://circleci.com/gh/gridgrid/grid)  [![semantic-release](https://img.shields.io/badge/%20%20%F0%9F%93%A6%F0%9F%9A%80-semantic--release-e10079.svg)](https://github.com/semantic-release/semantic-release) [![Commitizen friendly](https://img.shields.io/badge/commitizen-friendly-brightgreen.svg)](http://commitizen.github.io/cz-cli/)\n\nGrid\n===\n\nA highly scalable grid component written in javscript [DEMO](https://gridgrid.github.io/grid/ \"Grid Demo\")\n\nNote: while Grid is fully functional it is still in beta. Use at your own risk and please file any issues on GitHub. \n\nAlso the grid is currently packaged for use with browserify. If you need a build for a non browserify (or webpack) environment please open an issue on github.\n\n\nInstallation\n===\n`npm install --save grid`\n\n\nExample / Quick-Start\n===\n\nTo run the sample app locally, run `npm start` and hit http://localhost:8082\n\n##### Create a Grid Instance\n`var core = require('grid')`\n`var grid = core();`\n\nThe grid handles most complexity for you. There are only three user supplied requirements to a get a grid up and running\n\n##### Row and Column Descriptors\nRow and column descriptors are objects that tell the grid how wide or high to make your cells. They also control things like whether or not a column is hidden and describe the overall dimensions of the grid.\n\n``` javascript\n\t// add some columns\n    var colDescriptors = [];\n    var colDescriptor;\n    for (var c = 0; c < 20; c++) {\n        // create a col descriptor\n        colDescriptor = grid.colModel.create();\n        colDescriptor.width = 78;\n        colDescriptor.hidden = !!(c % 2); // hide every other column for fun and profit\n    }\n    grid.colModel.add(colDescriptors);\n\n    // add some rows\n    var rowDescriptors = [];\n    var rowDescriptor;\n    for (var r = 0; r < 20; r++) {\n        // create a row descriptor\n        rowDescriptor = grid.rowModel.create();\n        rowDescriptor.height = 24;\n        if(r === 0){\n        \trowDescriptor.header = true;\n        }\n    }\n    grid.rowModel.add(rowDescriptors);\n```\n\n##### The DataModel\n\nThe grid determines what to render for a given cell by calling the supplied data model. This gives the client massive flexbility to generate and return the data however they need to.\n\nThe datamodel can be a simple object that the user sets on the grid instance `dataModel` field and needs to implement at a minimum\n\n`get`, `getHeader`, and `isDirty`, \n\nif you support user data entry and want paste to work you should also implement `set`\n\nHere's a basic read only implementation:\n\n``` javascript\n// use the grid's default dirty clean implementation almost always\n// (it will automatically be set clean on each draw by the grid)\nvar dataDirtyClean = grid.makeDirtyClean();\n\ngrid.dataModel = {\n\n    get: function(dataRowIndex, dataColIndex, isCopy) {\n        var rawValue = [dataRowIndex, dataColIndex];\n        return {\n            value: rawValue,\n            formatted: 'r' + rawValue[0] + ', c' + rawValue[1]\n        };\n    },\n    \n    getHeader: function(headerRowIndex, headerColIndex) {\n        var rawValue = [headerRowIndex, headerColIndex];\n        return {\n            value: rawValue,\n            formatted: 'hr' + rawValue[0] + ', hc' + rawValue[1]\n        };\n    },\n    \n    isDirty: dataDirtyClean.isDirty\n};\n```\n\n##### Call Build\nFinally we just need to tell the grid to set itself up in a container of our choosing:\n\n``` javascript\nvar container = document.createElement('div');\ncontainer.style.width = '800px';\ncontainer.style.height = '800px';\ndocument.body.appendChild(container);\ngrid.build(container);\n```\n\nConcepts\n===\n\nMany of the apis in the grid utilize two concepts when referencing coordinates: spaces and units. It's good to understand these before using the more advanced features.\n\n## Spaces\nCoordinates in the grid exist in one of three spaces.\n\n**virtual** - represents all of the data in your grid including the headers. for example, if you have a grid with one header row, then `(0, 20)` in the `'virtual'` space references the column 20 of the header. `(1, 20)` would reference column 20 of the first data row.\n\n**data** - very similar to virtual but does not include the headers. so `(0,20)` references the first row of data at the 20th column and technically `(-1, 20)` would represent the 20th column in the header although negative indexes are rarely used\n\n**view** - the view space represents the actual dom nodes that are rendered for the grid's virtualization. the grid's implementation renders enough cells to fill the entire viewport and no more (usually around 20-30 rows and 10 cols depending on sizes). in this space `(0,20)` would reference the dom cell at column 20 of the first row. even if you scroll the grid it will always point at that cell, so a view coordinate can be translated to different virtual coordinates depending on the scroll. you could think of view coordinates as a correlary for `position: fixed` in css\n\n## Units\nUnits in the grid are straightforward. They are either\n\n**px** - pixels, so `(0,0)` in the view space is the very top left pixel of the grid no matter the scroll, whereas `(0,0)` in the virtual space is the top left pixel only when the grid hasn't been scrolled, and would technically refer to a pixel out of view if the grid has been scrolled\n\nor\n\n**cell** - cells, so `(0,0)` in the view space represents the top left cell regardless of scroll, and `(0,0)` in the virtual space would represent an off screen cell if scrolled and top left if not scrolled\n\nUsing Custom HTML\n===\n\nThere are two ways to get non text (read html) into a grid:\n\n## Decorators\nDecorators are great for adding a piece of one-off ui that doesn't relate directly to the content of a cell or doesn't need to be in every row of a column or vice versa. For example, the grid internally uses decorators to render the focus and selection highlight as well as resize handles.\n\n**basic decorator**\n``` javascript\n\tvar top = 1,\n    left = 2,\n    height = 1,\n    width = 1,\n    unit = 'cell',\n    space = 'view';\n    var d = grid.decorators.create(top, left, height, width, unit, space);\n\n    // return some element\n    d.render = function() {\n        var a = document.createElement('a')\n        a.textContent = 'link Text!'\n        return a;\n    };\n    grid.decorators.add(d);\n```\n\nPuts a link over the cell at row 1 col 2 that doesn’t move with the scroll (why you would do this is questionable but it's just an example).\n\nYou can do more complicated things like render directives: (requires grid-angular-adapter)\n\n**angular directive decorator**\n``` javascript\nangular.module('myCoolGrid', [require('grid')])\n\n  .controller('MyGridCtrl', function($scope, GridSrvc, GridDecoratorSrvc) {\n      var grid = GridSrvc.core();\n\n      // do row col and datamodel setup...\n\n      var top = 20,\n          left = 10,\n          height = 2,\n          width = 2,\n          unit = 'cell',\n          space = 'virtual';\n      var d = grid.decorators.create(top, left, height, width, unit, space);\n\n      // return some element\n      d.render = function() {\n          var scope = $scope.$new();\n          scope.interestingData = 'INTERESTING DATA!!!';\n          return GridDecoratorSrvc.render({\n              $scope: scope,\n              template: '<my-directive data=\"interestingData\"></my-directive>',\n              events: true\n          });\n      };\n      grid.decorators.add(d);\n  });\n```\n\nThis will put your compiled directive in a box that spans from `row 20-22` and `col 10-12`, and moves appropriately with the scroll. The `events` flag lets the grid know that this decorator is interactable and should receive mouse events. (Otherwise pointer events are set to none.) The GridDecoratorSrvc takes care of destroying the scope and properly removing elements to avoid memory leaks with angular. You definitely should use it for any angular decorators.\n\n\n## Builders\nBuilders help you to get html into the actual cells of a given row or column instead of the text that would have been rendered.\n\n\n**basic builders**\n``` javascript\nvar builder = grid.colModel.createBuilder(function render() {\n    return angular.element('<a href=\"#\"></a>')[0];\n}, function update(elem, ctx) {\n    grid.viewLayer.setTextContent(elem, ctx.data.formatted);\n    return elem;\n});\nvar colDescriptor = grid.colModel.create(builder);\n```\n\nhave `<a>` tags in your cells for all the rows in that column\n\nNote: it's important for the update function of a builder to be extremely fast. Call `scope.$digest` not `scope.$apply`, and  use `grid.viewLayer.setTextContent` not `elem.innerHTML` where possible\n\n\nStyling\n===\nIf you want to update the look and feel of the grid, here are a few classes that you can override to give you the look you want.\n\n\n## Classes\n\n**`.grid-cell`:**\nThis class is responsible for the look of individual cells. \n\n**`.grid-focus-decorator`:** This decorator class is applied when you click('focus') on a cell\n\nEx. Adding the following style will give you a cell with a blue border around it when the cell is selected.\n``` css\n.grid-focus-decorator {\n  border: 2px solid blue;\n}\n```\n\n**`.grid-selection`:**\nWhen selecting rows and columns, this class sets the border and background so you know which rows you are exactly selecting\n\nEx.\n```css\n$grid-teal: #39CCCC !default;\n.grid-selection {\n  border: 1px solid $grid-teal;\n  background: transparentize($grid-teal, .8);\n}\n```\n\n**`.grid-row`:**\nThis class is responsible for the look of the row of cells.\n\nEx. To apply, a background color when hovering over each row, add the following:\n```css\n.grid-row {\n  &.hover {\n    background-color: lighten($grid-teal, 30) !important;\n  }\n}\n```\n\nTo apply styles only to the header row, use the following class:\n```css\n.grid-row {\n  &.grid-is-header {\n  }\n}\n\n```\n**`.col-resize`:** This class changes the look of the column resizing element. \n\n**`.grid-drag-line`**: This class is used when you are resizing a column. A vertical line is added to guide you of how much to resize your columns.\n\nEx. To show a blue vertical line when resizing a column, add the following\n```css\n.grid-drag-line {\n  background: #7FDBFF;\n}\n```\n\n","readmeFilename":"README.md","gitHead":"9407a9f2a0086180c1c7b2183fd860a8f089ea98","_id":"grid@4.9.0","_nodeVersion":"8.17.0","_npmVersion":"6.13.4","dist":{"integrity":"sha512-H8lzzjSibI5CL890jF0/as0zXVKBNLIgOD6Hku0fSCI/EJWJgut7IHZYhqVSCTDupCFoV6/SCBbvONN3vMhj9w==","shasum":"5b523d387e4381175d91b08583cdb515bdb87dba","tarball":"https://registry.npmjs.org/grid/-/grid-4.9.0.tgz","fileCount":119,"unpackedSize":1312074,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJeq1utCRA9TVsSAnZWagAAv3sP/1FNDu/eZMRDO2qfcNG5\nxp1V6Uqn7Qy+t3Y6rsileXLrOPpc/4Lboc/d/rfUDw7ILntF+rymuV/2kMOE\nTWN28TJTTtUWUyzEOzkE1hf7B0FCfYAV8D8dJokimG+1rmto2YxID97ECCJ+\nnAU0ouAwEY3gmJlEZqHXa6VQajuhN3h/JFKw201nkadS7OCW31E59dQC9rNj\n+yVhoPW/juN4KhJz+HmDL2Rpto+4nte1vEOPZDi9ucdjX0K1CHJmQ7BCO50P\n5CR2MNW67/7k9Jb5+FD5lZ0KwMznLvLT/ZxwDPviMWKtCD4LbCBzXMSnKY78\nEp+7TRTB25RqWddZePYU1y27qIdmO/R9hUr9/qvdwDeSoZeQ1nS6e0WuZSua\nAVSavzlweFMAOqTI5yLSTFOhie6wyMRq36laaWYGlsYYuH9Oz1WnSYxggPD4\nWN7UwRyUBKRDbqGtFXYUU98oiyEuqwwSbswxR6HB4Dnjp8gjdH0DyxIARobk\nVcxHy9GMX6O/NgUGeXpmpiy8jNI8JFmwxAqzg7iFOHfJum4LmGJeEzddejuN\nfxWIa2PS+6sSlJYrNtkEcxHc0jd4bKUQ1Txsa83hQ7cFp5T3qi8tsh0hlEH/\nNZMq+aEa6NssSf4Kw94F5Y73G/KP9ApLGtkjJLGaj0feJKKiBrxa8axrJAgb\nqe2u\r\n=No2K\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQD6d4Y29x37jRnt20Vv2FqR8Uz7Q4t2ZRrubU8zZxAyUgIgYImY7+PamNiHxfxsrv21N7/U4QKwYxc/t+k2rZlVExQ="}]},"maintainers":[{"email":"anthony.liatsis@gmail.com","name":"anthonyl"},{"email":"ben@benshope.com","name":"benshope"},{"email":"christy@relateiq.com","name":"cdennison"},{"email":"joechrz@gmail.com","name":"joechrz"},{"email":"joe.mun@salesforce.com","name":"joemun"},{"email":"john.fox@relateiq.com","name":"john.fox"},{"email":"jon@relateiq.com","name":"jontomas"},{"email":"keven425@gmail.com","name":"keven425"},{"email":"lerhaupt@gmail.com","name":"lerhaupt"},{"email":"rusty.camden@gmail.com","name":"riqlandia-ci"},{"email":"rusty.camden@gmail.com","name":"scamden"},{"email":"public@matthewmartin.com","name":"voxmatt"}],"_npmUser":{"name":"riqlandia-ci","email":"rusty.camden@gmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/grid_4.9.0_1588288428530_0.6116186202405396"},"_hasShrinkwrap":false},"4.9.1":{"name":"grid","version":"4.9.1","description":"A highly scalable grid component written in javscript","main":"dist/bundle.js","typings":"dist/modules/core/index.d.ts","publishConfig":{"registry":"https://registry.npmjs.org/","tag":"next"},"engines":{"node":">=0.10.0"},"iqproj":{"app":true},"scripts":{"commitmsg":"validate-commit-msg","preversion":"npm run build","open:src":"babel-node tools/srcServer.js","dev":"npm-run-all --parallel open:src test:watch","clean":"rm -rf ./dist && mkdir dist","prebuild":"npm run clean && npm run test","build":"node tools/build.js","test":"node_modules/karma/bin/karma start --single-run --no-auto-watch karma.conf.js","test:watch":"node_modules/karma/bin/karma start karma.conf.js","semantic-release":"semantic-release pre && npm publish && semantic-release post"},"dependencies":{"capitalize":"^0.5.0","click-off":"~0.2.1","element-class":"^0.1.1","es6-object-assign":"~1.1.0","escape-stack":"~0.1.2","inner-text-shim":"~1.0.1","key":"^0.1.11","time-now":"~0.2.1"},"devDependencies":{"@types/jasmine":"~2.6.0","@types/karma":"~1.7.0","autoprefixer":"~6.4.0","awesome-typescript-loader":"~3.2.3","babel-cli":"~6.24.1","babel-loader":"~6.2.5","babel-preset-es2015":"~6.18.0","babel-preset-stage-1":"~6.13.0","browser-sync":"~2.18.12","condition-circle":"~1.5.0","copy-webpack-plugin":"~3.0.1","core-js-webpack-plugin":"~1.0.3","css-loader":"~0.24.0","ejs-compiled-loader":"~1.1.0","es6-promise":"~3.1.2","extract-text-webpack-plugin":"~3.0.1","file-loader":"~0.9.0","html-webpack-plugin":"~2.22.0","husky":"~0.13.3","jasmine":"~2.3.2","jasmine-tools-riq":"~0.3.2","jquery":"^2.1.0","karma":"~1.7.1","karma-chrome-launcher":"~0.2.1","karma-jasmine":"~0.3.6","karma-jasmine-jquery":"~0.1.1","karma-phantomjs-launcher":"~1.0.4","karma-sourcemap-loader":"~0.3.7","karma-webpack":"~2.0.4","lodash":"~4.11.0","node-sass":"~4.9.3","npm-run-all":"~4.0.2","phantomjs-prebuilt":"~2.1.14","polyfill-function-prototype-bind":"0.0.1","postcss-loader":"~0.11.0","sass-loader":"~4.1.1","semantic-release":"^4.3.5","source-map-loader":"~0.2.0","style-loader":"~0.13.1","transform-ts-paths":"^1.0.0","ts-loader":"~2.3.7","tslint":"^5.4.2","tslint-eslint-rules":"^4.1.1","typescript":"~3.7.5","url-loader":"~0.5.7","validate-commit-msg":"~2.12.1","webpack":"~3.6.0","webpack-bundle-analyzer":"^2.8.2","webpack-dev-middleware":"~1.6.1","webpack-fail-plugin":"~1.0.5","webpack-hot-middleware":"~2.12.2","webpack-md5-hash":"~0.0.5"},"repository":{"type":"git","url":"git+https://github.com/gridgrid/grid.git"},"keywords":["grid","spreadsheet","virtual","scroll"],"author":{"name":"Sterling Camden"},"license":"MIT","bugs":{"url":"https://github.com/gridgrid/grid/issues"},"homepage":"https://github.com/gridgrid/grid","config":{"commitizen":{"path":"cz-conventional-changelog"}},"release":{"verifyConditions":"condition-circle","branch":"next","fallbackTags":{"next":"latest"}},"readme":"[![npm](https://img.shields.io/npm/v/grid.svg)]( https://www.npmjs.com/package/grid) [![CircleCI](https://circleci.com/gh/gridgrid/grid.svg?style=shield)](https://circleci.com/gh/gridgrid/grid)  [![semantic-release](https://img.shields.io/badge/%20%20%F0%9F%93%A6%F0%9F%9A%80-semantic--release-e10079.svg)](https://github.com/semantic-release/semantic-release) [![Commitizen friendly](https://img.shields.io/badge/commitizen-friendly-brightgreen.svg)](http://commitizen.github.io/cz-cli/)\n\nGrid\n===\n\nA highly scalable grid component written in javscript [DEMO](https://gridgrid.github.io/grid/ \"Grid Demo\")\n\nNote: while Grid is fully functional it is still in beta. Use at your own risk and please file any issues on GitHub. \n\nAlso the grid is currently packaged for use with browserify. If you need a build for a non browserify (or webpack) environment please open an issue on github.\n\n\nInstallation\n===\n`npm install --save grid`\n\n\nExample / Quick-Start\n===\n\nTo run the sample app locally, run `npm start` and hit http://localhost:8082\n\n##### Create a Grid Instance\n`var core = require('grid')`\n`var grid = core();`\n\nThe grid handles most complexity for you. There are only three user supplied requirements to a get a grid up and running\n\n##### Row and Column Descriptors\nRow and column descriptors are objects that tell the grid how wide or high to make your cells. They also control things like whether or not a column is hidden and describe the overall dimensions of the grid.\n\n``` javascript\n\t// add some columns\n    var colDescriptors = [];\n    var colDescriptor;\n    for (var c = 0; c < 20; c++) {\n        // create a col descriptor\n        colDescriptor = grid.colModel.create();\n        colDescriptor.width = 78;\n        colDescriptor.hidden = !!(c % 2); // hide every other column for fun and profit\n    }\n    grid.colModel.add(colDescriptors);\n\n    // add some rows\n    var rowDescriptors = [];\n    var rowDescriptor;\n    for (var r = 0; r < 20; r++) {\n        // create a row descriptor\n        rowDescriptor = grid.rowModel.create();\n        rowDescriptor.height = 24;\n        if(r === 0){\n        \trowDescriptor.header = true;\n        }\n    }\n    grid.rowModel.add(rowDescriptors);\n```\n\n##### The DataModel\n\nThe grid determines what to render for a given cell by calling the supplied data model. This gives the client massive flexbility to generate and return the data however they need to.\n\nThe datamodel can be a simple object that the user sets on the grid instance `dataModel` field and needs to implement at a minimum\n\n`get`, `getHeader`, and `isDirty`, \n\nif you support user data entry and want paste to work you should also implement `set`\n\nHere's a basic read only implementation:\n\n``` javascript\n// use the grid's default dirty clean implementation almost always\n// (it will automatically be set clean on each draw by the grid)\nvar dataDirtyClean = grid.makeDirtyClean();\n\ngrid.dataModel = {\n\n    get: function(dataRowIndex, dataColIndex, isCopy) {\n        var rawValue = [dataRowIndex, dataColIndex];\n        return {\n            value: rawValue,\n            formatted: 'r' + rawValue[0] + ', c' + rawValue[1]\n        };\n    },\n    \n    getHeader: function(headerRowIndex, headerColIndex) {\n        var rawValue = [headerRowIndex, headerColIndex];\n        return {\n            value: rawValue,\n            formatted: 'hr' + rawValue[0] + ', hc' + rawValue[1]\n        };\n    },\n    \n    isDirty: dataDirtyClean.isDirty\n};\n```\n\n##### Call Build\nFinally we just need to tell the grid to set itself up in a container of our choosing:\n\n``` javascript\nvar container = document.createElement('div');\ncontainer.style.width = '800px';\ncontainer.style.height = '800px';\ndocument.body.appendChild(container);\ngrid.build(container);\n```\n\nConcepts\n===\n\nMany of the apis in the grid utilize two concepts when referencing coordinates: spaces and units. It's good to understand these before using the more advanced features.\n\n## Spaces\nCoordinates in the grid exist in one of three spaces.\n\n**virtual** - represents all of the data in your grid including the headers. for example, if you have a grid with one header row, then `(0, 20)` in the `'virtual'` space references the column 20 of the header. `(1, 20)` would reference column 20 of the first data row.\n\n**data** - very similar to virtual but does not include the headers. so `(0,20)` references the first row of data at the 20th column and technically `(-1, 20)` would represent the 20th column in the header although negative indexes are rarely used\n\n**view** - the view space represents the actual dom nodes that are rendered for the grid's virtualization. the grid's implementation renders enough cells to fill the entire viewport and no more (usually around 20-30 rows and 10 cols depending on sizes). in this space `(0,20)` would reference the dom cell at column 20 of the first row. even if you scroll the grid it will always point at that cell, so a view coordinate can be translated to different virtual coordinates depending on the scroll. you could think of view coordinates as a correlary for `position: fixed` in css\n\n## Units\nUnits in the grid are straightforward. They are either\n\n**px** - pixels, so `(0,0)` in the view space is the very top left pixel of the grid no matter the scroll, whereas `(0,0)` in the virtual space is the top left pixel only when the grid hasn't been scrolled, and would technically refer to a pixel out of view if the grid has been scrolled\n\nor\n\n**cell** - cells, so `(0,0)` in the view space represents the top left cell regardless of scroll, and `(0,0)` in the virtual space would represent an off screen cell if scrolled and top left if not scrolled\n\nUsing Custom HTML\n===\n\nThere are two ways to get non text (read html) into a grid:\n\n## Decorators\nDecorators are great for adding a piece of one-off ui that doesn't relate directly to the content of a cell or doesn't need to be in every row of a column or vice versa. For example, the grid internally uses decorators to render the focus and selection highlight as well as resize handles.\n\n**basic decorator**\n``` javascript\n\tvar top = 1,\n    left = 2,\n    height = 1,\n    width = 1,\n    unit = 'cell',\n    space = 'view';\n    var d = grid.decorators.create(top, left, height, width, unit, space);\n\n    // return some element\n    d.render = function() {\n        var a = document.createElement('a')\n        a.textContent = 'link Text!'\n        return a;\n    };\n    grid.decorators.add(d);\n```\n\nPuts a link over the cell at row 1 col 2 that doesn’t move with the scroll (why you would do this is questionable but it's just an example).\n\nYou can do more complicated things like render directives: (requires grid-angular-adapter)\n\n**angular directive decorator**\n``` javascript\nangular.module('myCoolGrid', [require('grid')])\n\n  .controller('MyGridCtrl', function($scope, GridSrvc, GridDecoratorSrvc) {\n      var grid = GridSrvc.core();\n\n      // do row col and datamodel setup...\n\n      var top = 20,\n          left = 10,\n          height = 2,\n          width = 2,\n          unit = 'cell',\n          space = 'virtual';\n      var d = grid.decorators.create(top, left, height, width, unit, space);\n\n      // return some element\n      d.render = function() {\n          var scope = $scope.$new();\n          scope.interestingData = 'INTERESTING DATA!!!';\n          return GridDecoratorSrvc.render({\n              $scope: scope,\n              template: '<my-directive data=\"interestingData\"></my-directive>',\n              events: true\n          });\n      };\n      grid.decorators.add(d);\n  });\n```\n\nThis will put your compiled directive in a box that spans from `row 20-22` and `col 10-12`, and moves appropriately with the scroll. The `events` flag lets the grid know that this decorator is interactable and should receive mouse events. (Otherwise pointer events are set to none.) The GridDecoratorSrvc takes care of destroying the scope and properly removing elements to avoid memory leaks with angular. You definitely should use it for any angular decorators.\n\n\n## Builders\nBuilders help you to get html into the actual cells of a given row or column instead of the text that would have been rendered.\n\n\n**basic builders**\n``` javascript\nvar builder = grid.colModel.createBuilder(function render() {\n    return angular.element('<a href=\"#\"></a>')[0];\n}, function update(elem, ctx) {\n    grid.viewLayer.setTextContent(elem, ctx.data.formatted);\n    return elem;\n});\nvar colDescriptor = grid.colModel.create(builder);\n```\n\nhave `<a>` tags in your cells for all the rows in that column\n\nNote: it's important for the update function of a builder to be extremely fast. Call `scope.$digest` not `scope.$apply`, and  use `grid.viewLayer.setTextContent` not `elem.innerHTML` where possible\n\n\nStyling\n===\nIf you want to update the look and feel of the grid, here are a few classes that you can override to give you the look you want.\n\n\n## Classes\n\n**`.grid-cell`:**\nThis class is responsible for the look of individual cells. \n\n**`.grid-focus-decorator`:** This decorator class is applied when you click('focus') on a cell\n\nEx. Adding the following style will give you a cell with a blue border around it when the cell is selected.\n``` css\n.grid-focus-decorator {\n  border: 2px solid blue;\n}\n```\n\n**`.grid-selection`:**\nWhen selecting rows and columns, this class sets the border and background so you know which rows you are exactly selecting\n\nEx.\n```css\n$grid-teal: #39CCCC !default;\n.grid-selection {\n  border: 1px solid $grid-teal;\n  background: transparentize($grid-teal, .8);\n}\n```\n\n**`.grid-row`:**\nThis class is responsible for the look of the row of cells.\n\nEx. To apply, a background color when hovering over each row, add the following:\n```css\n.grid-row {\n  &.hover {\n    background-color: lighten($grid-teal, 30) !important;\n  }\n}\n```\n\nTo apply styles only to the header row, use the following class:\n```css\n.grid-row {\n  &.grid-is-header {\n  }\n}\n\n```\n**`.col-resize`:** This class changes the look of the column resizing element. \n\n**`.grid-drag-line`**: This class is used when you are resizing a column. A vertical line is added to guide you of how much to resize your columns.\n\nEx. To show a blue vertical line when resizing a column, add the following\n```css\n.grid-drag-line {\n  background: #7FDBFF;\n}\n```\n\n","readmeFilename":"README.md","gitHead":"fbb27fb8dee7065b840910486f634a6d2b7712c1","_id":"grid@4.9.1","_nodeVersion":"8.17.0","_npmVersion":"6.13.4","dist":{"integrity":"sha512-30hUbQHMCiqD7hQqEMRTTe6weC2frp3O5x3mLizyPeCSHjgZpI5dyXMjq5GRW1/htSBVn7PtlAUVnQF9Af0Xhg==","shasum":"3ca81a56dceb881ca678bfb7a1b68989c001eaa8","tarball":"https://registry.npmjs.org/grid/-/grid-4.9.1.tgz","fileCount":119,"unpackedSize":1312240,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJeq2SvCRA9TVsSAnZWagAAubUP/jQ8Pkmz/1kCMwG+XCQe\nC37AfOqYdcDEFwhU/iFpErsWfay1yqUPh/snp1OfrjS7WYfX96xxmeUo0/14\nfq1FfmxgoC+q0izQg6rMlFE2LUWjsDyl+/L3b3Jc5Lm9a/RcgyOa6i/4k/av\nQiHzDHGo2PLHpPxxp05hebiWAPmac1DFvsA+8uLEX9/n/KhsV2KAZCZQyA/M\n6ICjEMTU66AxWKDLg3w3IqMEVrnjwvduRohlO3Up3IYQuDTEODNtd7Y7aeFd\nSu/WM5ici6qOZm2murz0DGhmKXh71qs+bfQSlJ6MDTCyl/wF7UmwKr/Esi4U\nuQYxphD8Pn8i7YkEb8Ph/Zq64XdKwWxiA5145AF1qrXlKH6Y6/3xc5DLc3et\nbnT0SyKZy9ZLXdC9SpM4DOBoTVryxC/TAfAJKWhE7x64aitc3ig3DIsHSi55\nVNwykiEbSO8h0mvr1AAyN1OS6IJBBveAA2fmhD8GrHkZP/pvx4wOMmTi14h/\n9IVbxus/iqH94eJNx39eL3Cr6DSGc3WbI+0owL/jpxXm7x5e1A877IM6sNz5\nVao+s7waPB9QIt81NYTeP1L26x5lh7qL/H+N7RPYoFZWSducjwbrR7gquFXg\nGh6alXWEVk9qa0CmESJju3IltomMNUEBEhKA0MIoYrO8//5DXZIPhAAVv3rr\nSDqS\r\n=Upir\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIEayVXEUtua+C68QgHhkO5YUW70HwfKdOyS2mFeeRiVHAiEAzed89TPu2dp2EMEmkmrrja2QDyfKx67hNwFy2iUu49k="}]},"maintainers":[{"email":"anthony.liatsis@gmail.com","name":"anthonyl"},{"email":"ben@benshope.com","name":"benshope"},{"email":"christy@relateiq.com","name":"cdennison"},{"email":"joechrz@gmail.com","name":"joechrz"},{"email":"joe.mun@salesforce.com","name":"joemun"},{"email":"john.fox@relateiq.com","name":"john.fox"},{"email":"jon@relateiq.com","name":"jontomas"},{"email":"keven425@gmail.com","name":"keven425"},{"email":"lerhaupt@gmail.com","name":"lerhaupt"},{"email":"rusty.camden@gmail.com","name":"riqlandia-ci"},{"email":"rusty.camden@gmail.com","name":"scamden"},{"email":"public@matthewmartin.com","name":"voxmatt"}],"_npmUser":{"name":"riqlandia-ci","email":"rusty.camden@gmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/grid_4.9.1_1588290734826_0.19469743849645593"},"_hasShrinkwrap":false},"4.9.2":{"name":"grid","version":"4.9.2","description":"A highly scalable grid component written in javscript","main":"dist/bundle.js","typings":"dist/modules/core/index.d.ts","publishConfig":{"registry":"https://registry.npmjs.org/","tag":"next"},"engines":{"node":">=0.10.0"},"iqproj":{"app":true},"scripts":{"commitmsg":"validate-commit-msg","preversion":"npm run build","open:src":"babel-node tools/srcServer.js","dev":"npm-run-all --parallel open:src test:watch","clean":"rm -rf ./dist && mkdir dist","prebuild":"npm run clean && npm run test","build":"node tools/build.js","test":"node_modules/karma/bin/karma start --single-run --no-auto-watch karma.conf.js","test:watch":"node_modules/karma/bin/karma start karma.conf.js","semantic-release":"semantic-release pre && npm publish && semantic-release post"},"dependencies":{"capitalize":"^0.5.0","click-off":"~0.2.1","element-class":"^0.1.1","es6-object-assign":"~1.1.0","escape-stack":"~0.1.2","inner-text-shim":"~1.0.1","key":"^0.1.11","time-now":"~0.2.1"},"devDependencies":{"@types/jasmine":"~2.6.0","@types/karma":"~1.7.0","autoprefixer":"~6.4.0","awesome-typescript-loader":"~3.2.3","babel-cli":"~6.24.1","babel-loader":"~6.2.5","babel-preset-es2015":"~6.18.0","babel-preset-stage-1":"~6.13.0","browser-sync":"~2.18.12","condition-circle":"~1.5.0","copy-webpack-plugin":"~3.0.1","core-js-webpack-plugin":"~1.0.3","css-loader":"~0.24.0","ejs-compiled-loader":"~1.1.0","es6-promise":"~3.1.2","extract-text-webpack-plugin":"~3.0.1","file-loader":"~0.9.0","html-webpack-plugin":"~2.22.0","husky":"~0.13.3","jasmine":"~2.3.2","jasmine-tools-riq":"~0.3.2","jquery":"^2.1.0","karma":"~1.7.1","karma-chrome-launcher":"~0.2.1","karma-jasmine":"~0.3.6","karma-jasmine-jquery":"~0.1.1","karma-phantomjs-launcher":"~1.0.4","karma-sourcemap-loader":"~0.3.7","karma-webpack":"~2.0.4","lodash":"~4.11.0","node-sass":"~4.9.3","npm-run-all":"~4.0.2","phantomjs-prebuilt":"~2.1.14","polyfill-function-prototype-bind":"0.0.1","postcss-loader":"~0.11.0","sass-loader":"~4.1.1","semantic-release":"^4.3.5","source-map-loader":"~0.2.0","style-loader":"~0.13.1","transform-ts-paths":"^1.0.0","ts-loader":"~2.3.7","tslint":"^5.4.2","tslint-eslint-rules":"^4.1.1","typescript":"~3.7.5","url-loader":"~0.5.7","validate-commit-msg":"~2.12.1","webpack":"~3.6.0","webpack-bundle-analyzer":"^2.8.2","webpack-dev-middleware":"~1.6.1","webpack-fail-plugin":"~1.0.5","webpack-hot-middleware":"~2.12.2","webpack-md5-hash":"~0.0.5"},"repository":{"type":"git","url":"git+https://github.com/gridgrid/grid.git"},"keywords":["grid","spreadsheet","virtual","scroll"],"author":{"name":"Sterling Camden"},"license":"MIT","bugs":{"url":"https://github.com/gridgrid/grid/issues"},"homepage":"https://github.com/gridgrid/grid","config":{"commitizen":{"path":"cz-conventional-changelog"}},"release":{"verifyConditions":"condition-circle","branch":"next","fallbackTags":{"next":"latest"}},"readme":"[![npm](https://img.shields.io/npm/v/grid.svg)]( https://www.npmjs.com/package/grid) [![CircleCI](https://circleci.com/gh/gridgrid/grid.svg?style=shield)](https://circleci.com/gh/gridgrid/grid)  [![semantic-release](https://img.shields.io/badge/%20%20%F0%9F%93%A6%F0%9F%9A%80-semantic--release-e10079.svg)](https://github.com/semantic-release/semantic-release) [![Commitizen friendly](https://img.shields.io/badge/commitizen-friendly-brightgreen.svg)](http://commitizen.github.io/cz-cli/)\n\nGrid\n===\n\nA highly scalable grid component written in javscript [DEMO](https://gridgrid.github.io/grid/ \"Grid Demo\")\n\nNote: while Grid is fully functional it is still in beta. Use at your own risk and please file any issues on GitHub. \n\nAlso the grid is currently packaged for use with browserify. If you need a build for a non browserify (or webpack) environment please open an issue on github.\n\n\nInstallation\n===\n`npm install --save grid`\n\n\nExample / Quick-Start\n===\n\nTo run the sample app locally, run `npm start` and hit http://localhost:8082\n\n##### Create a Grid Instance\n`var core = require('grid')`\n`var grid = core();`\n\nThe grid handles most complexity for you. There are only three user supplied requirements to a get a grid up and running\n\n##### Row and Column Descriptors\nRow and column descriptors are objects that tell the grid how wide or high to make your cells. They also control things like whether or not a column is hidden and describe the overall dimensions of the grid.\n\n``` javascript\n\t// add some columns\n    var colDescriptors = [];\n    var colDescriptor;\n    for (var c = 0; c < 20; c++) {\n        // create a col descriptor\n        colDescriptor = grid.colModel.create();\n        colDescriptor.width = 78;\n        colDescriptor.hidden = !!(c % 2); // hide every other column for fun and profit\n    }\n    grid.colModel.add(colDescriptors);\n\n    // add some rows\n    var rowDescriptors = [];\n    var rowDescriptor;\n    for (var r = 0; r < 20; r++) {\n        // create a row descriptor\n        rowDescriptor = grid.rowModel.create();\n        rowDescriptor.height = 24;\n        if(r === 0){\n        \trowDescriptor.header = true;\n        }\n    }\n    grid.rowModel.add(rowDescriptors);\n```\n\n##### The DataModel\n\nThe grid determines what to render for a given cell by calling the supplied data model. This gives the client massive flexbility to generate and return the data however they need to.\n\nThe datamodel can be a simple object that the user sets on the grid instance `dataModel` field and needs to implement at a minimum\n\n`get`, `getHeader`, and `isDirty`, \n\nif you support user data entry and want paste to work you should also implement `set`\n\nHere's a basic read only implementation:\n\n``` javascript\n// use the grid's default dirty clean implementation almost always\n// (it will automatically be set clean on each draw by the grid)\nvar dataDirtyClean = grid.makeDirtyClean();\n\ngrid.dataModel = {\n\n    get: function(dataRowIndex, dataColIndex, isCopy) {\n        var rawValue = [dataRowIndex, dataColIndex];\n        return {\n            value: rawValue,\n            formatted: 'r' + rawValue[0] + ', c' + rawValue[1]\n        };\n    },\n    \n    getHeader: function(headerRowIndex, headerColIndex) {\n        var rawValue = [headerRowIndex, headerColIndex];\n        return {\n            value: rawValue,\n            formatted: 'hr' + rawValue[0] + ', hc' + rawValue[1]\n        };\n    },\n    \n    isDirty: dataDirtyClean.isDirty\n};\n```\n\n##### Call Build\nFinally we just need to tell the grid to set itself up in a container of our choosing:\n\n``` javascript\nvar container = document.createElement('div');\ncontainer.style.width = '800px';\ncontainer.style.height = '800px';\ndocument.body.appendChild(container);\ngrid.build(container);\n```\n\nConcepts\n===\n\nMany of the apis in the grid utilize two concepts when referencing coordinates: spaces and units. It's good to understand these before using the more advanced features.\n\n## Spaces\nCoordinates in the grid exist in one of three spaces.\n\n**virtual** - represents all of the data in your grid including the headers. for example, if you have a grid with one header row, then `(0, 20)` in the `'virtual'` space references the column 20 of the header. `(1, 20)` would reference column 20 of the first data row.\n\n**data** - very similar to virtual but does not include the headers. so `(0,20)` references the first row of data at the 20th column and technically `(-1, 20)` would represent the 20th column in the header although negative indexes are rarely used\n\n**view** - the view space represents the actual dom nodes that are rendered for the grid's virtualization. the grid's implementation renders enough cells to fill the entire viewport and no more (usually around 20-30 rows and 10 cols depending on sizes). in this space `(0,20)` would reference the dom cell at column 20 of the first row. even if you scroll the grid it will always point at that cell, so a view coordinate can be translated to different virtual coordinates depending on the scroll. you could think of view coordinates as a correlary for `position: fixed` in css\n\n## Units\nUnits in the grid are straightforward. They are either\n\n**px** - pixels, so `(0,0)` in the view space is the very top left pixel of the grid no matter the scroll, whereas `(0,0)` in the virtual space is the top left pixel only when the grid hasn't been scrolled, and would technically refer to a pixel out of view if the grid has been scrolled\n\nor\n\n**cell** - cells, so `(0,0)` in the view space represents the top left cell regardless of scroll, and `(0,0)` in the virtual space would represent an off screen cell if scrolled and top left if not scrolled\n\nUsing Custom HTML\n===\n\nThere are two ways to get non text (read html) into a grid:\n\n## Decorators\nDecorators are great for adding a piece of one-off ui that doesn't relate directly to the content of a cell or doesn't need to be in every row of a column or vice versa. For example, the grid internally uses decorators to render the focus and selection highlight as well as resize handles.\n\n**basic decorator**\n``` javascript\n\tvar top = 1,\n    left = 2,\n    height = 1,\n    width = 1,\n    unit = 'cell',\n    space = 'view';\n    var d = grid.decorators.create(top, left, height, width, unit, space);\n\n    // return some element\n    d.render = function() {\n        var a = document.createElement('a')\n        a.textContent = 'link Text!'\n        return a;\n    };\n    grid.decorators.add(d);\n```\n\nPuts a link over the cell at row 1 col 2 that doesn’t move with the scroll (why you would do this is questionable but it's just an example).\n\nYou can do more complicated things like render directives: (requires grid-angular-adapter)\n\n**angular directive decorator**\n``` javascript\nangular.module('myCoolGrid', [require('grid')])\n\n  .controller('MyGridCtrl', function($scope, GridSrvc, GridDecoratorSrvc) {\n      var grid = GridSrvc.core();\n\n      // do row col and datamodel setup...\n\n      var top = 20,\n          left = 10,\n          height = 2,\n          width = 2,\n          unit = 'cell',\n          space = 'virtual';\n      var d = grid.decorators.create(top, left, height, width, unit, space);\n\n      // return some element\n      d.render = function() {\n          var scope = $scope.$new();\n          scope.interestingData = 'INTERESTING DATA!!!';\n          return GridDecoratorSrvc.render({\n              $scope: scope,\n              template: '<my-directive data=\"interestingData\"></my-directive>',\n              events: true\n          });\n      };\n      grid.decorators.add(d);\n  });\n```\n\nThis will put your compiled directive in a box that spans from `row 20-22` and `col 10-12`, and moves appropriately with the scroll. The `events` flag lets the grid know that this decorator is interactable and should receive mouse events. (Otherwise pointer events are set to none.) The GridDecoratorSrvc takes care of destroying the scope and properly removing elements to avoid memory leaks with angular. You definitely should use it for any angular decorators.\n\n\n## Builders\nBuilders help you to get html into the actual cells of a given row or column instead of the text that would have been rendered.\n\n\n**basic builders**\n``` javascript\nvar builder = grid.colModel.createBuilder(function render() {\n    return angular.element('<a href=\"#\"></a>')[0];\n}, function update(elem, ctx) {\n    grid.viewLayer.setTextContent(elem, ctx.data.formatted);\n    return elem;\n});\nvar colDescriptor = grid.colModel.create(builder);\n```\n\nhave `<a>` tags in your cells for all the rows in that column\n\nNote: it's important for the update function of a builder to be extremely fast. Call `scope.$digest` not `scope.$apply`, and  use `grid.viewLayer.setTextContent` not `elem.innerHTML` where possible\n\n\nStyling\n===\nIf you want to update the look and feel of the grid, here are a few classes that you can override to give you the look you want.\n\n\n## Classes\n\n**`.grid-cell`:**\nThis class is responsible for the look of individual cells. \n\n**`.grid-focus-decorator`:** This decorator class is applied when you click('focus') on a cell\n\nEx. Adding the following style will give you a cell with a blue border around it when the cell is selected.\n``` css\n.grid-focus-decorator {\n  border: 2px solid blue;\n}\n```\n\n**`.grid-selection`:**\nWhen selecting rows and columns, this class sets the border and background so you know which rows you are exactly selecting\n\nEx.\n```css\n$grid-teal: #39CCCC !default;\n.grid-selection {\n  border: 1px solid $grid-teal;\n  background: transparentize($grid-teal, .8);\n}\n```\n\n**`.grid-row`:**\nThis class is responsible for the look of the row of cells.\n\nEx. To apply, a background color when hovering over each row, add the following:\n```css\n.grid-row {\n  &.hover {\n    background-color: lighten($grid-teal, 30) !important;\n  }\n}\n```\n\nTo apply styles only to the header row, use the following class:\n```css\n.grid-row {\n  &.grid-is-header {\n  }\n}\n\n```\n**`.col-resize`:** This class changes the look of the column resizing element. \n\n**`.grid-drag-line`**: This class is used when you are resizing a column. A vertical line is added to guide you of how much to resize your columns.\n\nEx. To show a blue vertical line when resizing a column, add the following\n```css\n.grid-drag-line {\n  background: #7FDBFF;\n}\n```\n\n","readmeFilename":"README.md","gitHead":"04fc54aefa8cd1b4e269c0493381040e1cb414bb","_id":"grid@4.9.2","_nodeVersion":"8.17.0","_npmVersion":"6.13.4","dist":{"integrity":"sha512-uEZhabYhsPEI2GB3GRSk1pI5mg7ekHLD57ffzfmNDyhK/DB0BvmZry1K83QXRkPn734IxnwHvPD2Gnyh+igtrg==","shasum":"7a833257a545d9dc661fa13b64f220ef619c7fa9","tarball":"https://registry.npmjs.org/grid/-/grid-4.9.2.tgz","fileCount":119,"unpackedSize":1312506,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJerGxMCRA9TVsSAnZWagAAzj8P/025dsVmVPheuXIpqqgH\nwLG7fblM0GpCrQMKQ5vWli5GWFzX9/TGfqoYCXcAeCLaUciHEna6Kpm/gE4/\nPdMvieP9YPkmhf6+Z9HkeVtXbyYPBahohmql27+MwdjZiPbEYJXxzM3rQEb6\nedYzmRmPkxsPJQpltRJQ5onOmlnD0C1U3pq8CXis3Rb8sUGwH0W+h4da1Phz\n2i5+RAMPBe3CV627hS7F3K9mi5eDRxKf/CRpE0zb5UBdl/NjYTNtklhXyvq4\n2j086IzCzMgX6d1o4mg/0/VVXehM4/6A5/8en0z1j5gUIcyuMrAEQYpgVidx\n96fPJXh0S2qNk/6sD2sVprt5b+3Kk+M+LyQ6GzI0fyiwLQ5GgcpSYmS+6KBd\n4NwRkyrKMEuqeoZDmyRk8ZTCzedGEtlsWAi+Yhze0hbA5N71YmclUU9XU/CL\nNmVF/4ArC8uLqsJ6dKC7EY3FGmkFc3FKrkj1bSRPwUG2UEypK3ZAM6CzT2Kx\nKQNaI8IkYMI324d6IhyUArXQ+J5bdcoaQOon868SjBVjLPf8AuFaYkvyKjtz\nqfLVZ+uz2UxAZwBZCpZY59r43QkY6K9OFlDo5LX3tT0sI3/Zys0BKBwFh3xK\nIjOKz9/n4+ydtke4bnQCWfb7ebXtWbGdbLBs7gQBKP9WiZ9bM8xOSIxzJyL0\nC/t4\r\n=v5ku\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQD0YemhJEZAbvwz0HDClvVipkyImXAUUWlrx0SF6Aa3gQIgQfNVOda9fbIljARzHHJ+PfOQsugpOqVqqtFHZ/0gxsw="}]},"maintainers":[{"email":"anthony.liatsis@gmail.com","name":"anthonyl"},{"email":"ben@benshope.com","name":"benshope"},{"email":"christy@relateiq.com","name":"cdennison"},{"email":"joechrz@gmail.com","name":"joechrz"},{"email":"joe.mun@salesforce.com","name":"joemun"},{"email":"john.fox@relateiq.com","name":"john.fox"},{"email":"jon@relateiq.com","name":"jontomas"},{"email":"keven425@gmail.com","name":"keven425"},{"email":"lerhaupt@gmail.com","name":"lerhaupt"},{"email":"rusty.camden@gmail.com","name":"riqlandia-ci"},{"email":"rusty.camden@gmail.com","name":"scamden"},{"email":"public@matthewmartin.com","name":"voxmatt"}],"_npmUser":{"name":"riqlandia-ci","email":"rusty.camden@gmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/grid_4.9.2_1588358219656_0.7791067832246865"},"_hasShrinkwrap":false},"4.10.0":{"name":"grid","version":"4.10.0","description":"A highly scalable grid component written in Typescript",".browser":"dist/grid.js","main":"dist/modules/core/index.js","typings":"dist/modules/core/index.d.ts","publishConfig":{"registry":"https://registry.npmjs.org/","tag":"next"},"engines":{"node":">=10"},"iqproj":{"app":true},"scripts":{"commitmsg":"commitlint -E GIT_PARAMS","preversion":"npm run build","open:src":"ts-node -P tsconfig.srv.json tools/srcServer.ts","ts:watch":"tsc --watch --incremental","dev":"npm-run-all --parallel open:src test:watch ts:watch","clean":"rm -rf ./dist && mkdir dist","prebuild":"npm run clean && npm run test","build":"NODE_ENV=production node tools/build.js","test":"node_modules/karma/bin/karma start --single-run --no-auto-watch karma.conf.js","test:watch":"node_modules/karma/bin/karma start karma.conf.js","semantic-release":"semantic-release"},"dependencies":{"capitalize":"^0.5.0","click-off":"~0.2.1","element-class":"^0.1.1","es6-object-assign":"~1.1.0","escape-stack":"~0.1.2","inner-text-shim":"~1.0.1","key":"^0.1.11","time-now":"~0.2.1"},"devDependencies":{"@commitlint/cli":"~9.1.2","@commitlint/config-conventional":"~9.1.1","@types/browser-sync":"~2.26.1","@types/jasmine":"~2.6.0","@types/karma":"~1.7.0","@types/webpack-dev-middleware":"~3.7.1","@types/webpack-hot-middleware":"~2.25.3","autoprefixer":"~9.8.6","awesome-typescript-loader":"~5.2.1","browser-sync":"~2.26.12","condition-circle":"~2.0.2","copy-webpack-plugin":"~3.0.1","css-loader":"~4.2.1","ejs-compiled-loader":"~3.0.0","es6-promise":"~3.1.2","fibers":"~5.0.0","file-loader":"~0.9.0","html-webpack-plugin":"~4.3.0","husky":"~0.13.3","install":"~0.13.0","jasmine":"~3.6.1","jquery":"~3.5.1","karma":"~5.1.1","karma-chrome-launcher":"~3.1.0","karma-jasmine":"~0.3.6","karma-sourcemap-loader":"~0.3.7","karma-webpack":"~4.0.2","lodash":"~4.17.19","mini-css-extract-plugin":"~0.10.0","node-sass":"~4.12.0","npm":"~6.14.7","npm-run-all":"~4.0.2","polyfill-function-prototype-bind":"0.0.1","postcss-loader":"~0.11.0","sass-loader":"~9.0.3","semantic-release":"~17.1.1","source-map-loader":"~1.0.1","style-loader":"~1.2.1","transform-ts-paths":"^1.0.0","ts-loader":"~8.0.2","ts-node":"~8.10.2","tslint":"^5.4.2","tslint-eslint-rules":"^4.1.1","typescript":"~3.7.5","url-loader":"~4.1.0","webpack":"~4.44.1","webpack-bundle-analyzer":"~3.8.0","webpack-cli":"~3.3.12","webpack-dev-middleware":"~3.7.2","webpack-hot-middleware":"~2.25.0","webpack-md5-hash":"~0.0.5"},"repository":{"type":"git","url":"git+https://github.com/gridgrid/grid.git"},"keywords":["grid","spreadsheet","virtual","scroll"],"author":{"name":"Sterling Camden"},"license":"MIT","bugs":{"url":"https://github.com/gridgrid/grid/issues"},"homepage":"https://github.com/gridgrid/grid","release":{"verifyConditions":"condition-circle","branch":"next","fallbackTags":{"next":"latest"}},"readme":"[![npm](https://img.shields.io/npm/v/grid.svg)]( https://www.npmjs.com/package/grid) [![CircleCI](https://circleci.com/gh/gridgrid/grid.svg?style=shield)](https://circleci.com/gh/gridgrid/grid)  [![semantic-release](https://img.shields.io/badge/%20%20%F0%9F%93%A6%F0%9F%9A%80-semantic--release-e10079.svg)](https://github.com/semantic-release/semantic-release) [![Commitizen friendly](https://img.shields.io/badge/commitizen-friendly-brightgreen.svg)](http://commitizen.github.io/cz-cli/)\n\nGrid\n===\n\nA highly scalable grid component written in javscript [DEMO](https://gridgrid.github.io/grid/ \"Grid Demo\")\n\nNote: while Grid is fully functional it is still in beta. Use at your own risk and please file any issues on GitHub. \n\nAlso the grid is currently packaged for use with browserify. If you need a build for a non browserify (or webpack) environment please open an issue on github.\n\n\nInstallation\n===\n`npm install --save grid`\n\n\nExample / Quick-Start\n===\n\nTo run the sample app locally, run `npm start` and hit http://localhost:8082\n\n##### Create a Grid Instance\n`var core = require('grid')`\n`var grid = core();`\n\nThe grid handles most complexity for you. There are only three user supplied requirements to a get a grid up and running\n\n##### Row and Column Descriptors\nRow and column descriptors are objects that tell the grid how wide or high to make your cells. They also control things like whether or not a column is hidden and describe the overall dimensions of the grid.\n\n``` javascript\n\t// add some columns\n    var colDescriptors = [];\n    var colDescriptor;\n    for (var c = 0; c < 20; c++) {\n        // create a col descriptor\n        colDescriptor = grid.colModel.create();\n        colDescriptor.width = 78;\n        colDescriptor.hidden = !!(c % 2); // hide every other column for fun and profit\n    }\n    grid.colModel.add(colDescriptors);\n\n    // add some rows\n    var rowDescriptors = [];\n    var rowDescriptor;\n    for (var r = 0; r < 20; r++) {\n        // create a row descriptor\n        rowDescriptor = grid.rowModel.create();\n        rowDescriptor.height = 24;\n        if(r === 0){\n        \trowDescriptor.header = true;\n        }\n    }\n    grid.rowModel.add(rowDescriptors);\n```\n\n##### The DataModel\n\nThe grid determines what to render for a given cell by calling the supplied data model. This gives the client massive flexbility to generate and return the data however they need to.\n\nThe datamodel can be a simple object that the user sets on the grid instance `dataModel` field and needs to implement at a minimum\n\n`get`, `getHeader`, and `isDirty`, \n\nif you support user data entry and want paste to work you should also implement `set`\n\nHere's a basic read only implementation:\n\n``` javascript\n// use the grid's default dirty clean implementation almost always\n// (it will automatically be set clean on each draw by the grid)\nvar dataDirtyClean = grid.makeDirtyClean();\n\ngrid.dataModel = {\n\n    get: function(dataRowIndex, dataColIndex, isCopy) {\n        var rawValue = [dataRowIndex, dataColIndex];\n        return {\n            value: rawValue,\n            formatted: 'r' + rawValue[0] + ', c' + rawValue[1]\n        };\n    },\n    \n    getHeader: function(headerRowIndex, headerColIndex) {\n        var rawValue = [headerRowIndex, headerColIndex];\n        return {\n            value: rawValue,\n            formatted: 'hr' + rawValue[0] + ', hc' + rawValue[1]\n        };\n    },\n    \n    isDirty: dataDirtyClean.isDirty\n};\n```\n\n##### Call Build\nFinally we just need to tell the grid to set itself up in a container of our choosing:\n\n``` javascript\nvar container = document.createElement('div');\ncontainer.style.width = '800px';\ncontainer.style.height = '800px';\ndocument.body.appendChild(container);\ngrid.build(container);\n```\n\nConcepts\n===\n\nMany of the apis in the grid utilize two concepts when referencing coordinates: spaces and units. It's good to understand these before using the more advanced features.\n\n## Spaces\nCoordinates in the grid exist in one of three spaces.\n\n**virtual** - represents all of the data in your grid including the headers. for example, if you have a grid with one header row, then `(0, 20)` in the `'virtual'` space references the column 20 of the header. `(1, 20)` would reference column 20 of the first data row.\n\n**data** - very similar to virtual but does not include the headers. so `(0,20)` references the first row of data at the 20th column and technically `(-1, 20)` would represent the 20th column in the header although negative indexes are rarely used\n\n**view** - the view space represents the actual dom nodes that are rendered for the grid's virtualization. the grid's implementation renders enough cells to fill the entire viewport and no more (usually around 20-30 rows and 10 cols depending on sizes). in this space `(0,20)` would reference the dom cell at column 20 of the first row. even if you scroll the grid it will always point at that cell, so a view coordinate can be translated to different virtual coordinates depending on the scroll. you could think of view coordinates as a correlary for `position: fixed` in css\n\n## Units\nUnits in the grid are straightforward. They are either\n\n**px** - pixels, so `(0,0)` in the view space is the very top left pixel of the grid no matter the scroll, whereas `(0,0)` in the virtual space is the top left pixel only when the grid hasn't been scrolled, and would technically refer to a pixel out of view if the grid has been scrolled\n\nor\n\n**cell** - cells, so `(0,0)` in the view space represents the top left cell regardless of scroll, and `(0,0)` in the virtual space would represent an off screen cell if scrolled and top left if not scrolled\n\nUsing Custom HTML\n===\n\nThere are two ways to get non text (read html) into a grid:\n\n## Decorators\nDecorators are great for adding a piece of one-off ui that doesn't relate directly to the content of a cell or doesn't need to be in every row of a column or vice versa. For example, the grid internally uses decorators to render the focus and selection highlight as well as resize handles.\n\n**basic decorator**\n``` javascript\n\tvar top = 1,\n    left = 2,\n    height = 1,\n    width = 1,\n    unit = 'cell',\n    space = 'view';\n    var d = grid.decorators.create(top, left, height, width, unit, space);\n\n    // return some element\n    d.render = function() {\n        var a = document.createElement('a')\n        a.textContent = 'link Text!'\n        return a;\n    };\n    grid.decorators.add(d);\n```\n\nPuts a link over the cell at row 1 col 2 that doesn’t move with the scroll (why you would do this is questionable but it's just an example).\n\nYou can do more complicated things like render directives: (requires grid-angular-adapter)\n\n**angular directive decorator**\n``` javascript\nangular.module('myCoolGrid', [require('grid')])\n\n  .controller('MyGridCtrl', function($scope, GridSrvc, GridDecoratorSrvc) {\n      var grid = GridSrvc.core();\n\n      // do row col and datamodel setup...\n\n      var top = 20,\n          left = 10,\n          height = 2,\n          width = 2,\n          unit = 'cell',\n          space = 'virtual';\n      var d = grid.decorators.create(top, left, height, width, unit, space);\n\n      // return some element\n      d.render = function() {\n          var scope = $scope.$new();\n          scope.interestingData = 'INTERESTING DATA!!!';\n          return GridDecoratorSrvc.render({\n              $scope: scope,\n              template: '<my-directive data=\"interestingData\"></my-directive>',\n              events: true\n          });\n      };\n      grid.decorators.add(d);\n  });\n```\n\nThis will put your compiled directive in a box that spans from `row 20-22` and `col 10-12`, and moves appropriately with the scroll. The `events` flag lets the grid know that this decorator is interactable and should receive mouse events. (Otherwise pointer events are set to none.) The GridDecoratorSrvc takes care of destroying the scope and properly removing elements to avoid memory leaks with angular. You definitely should use it for any angular decorators.\n\n\n## Builders\nBuilders help you to get html into the actual cells of a given row or column instead of the text that would have been rendered.\n\n\n**basic builders**\n``` javascript\nvar builder = grid.colModel.createBuilder(function render() {\n    return angular.element('<a href=\"#\"></a>')[0];\n}, function update(elem, ctx) {\n    grid.viewLayer.setTextContent(elem, ctx.data.formatted);\n    return elem;\n});\nvar colDescriptor = grid.colModel.create(builder);\n```\n\nhave `<a>` tags in your cells for all the rows in that column\n\nNote: it's important for the update function of a builder to be extremely fast. Call `scope.$digest` not `scope.$apply`, and  use `grid.viewLayer.setTextContent` not `elem.innerHTML` where possible\n\n\nStyling\n===\nIf you want to update the look and feel of the grid, here are a few classes that you can override to give you the look you want.\n\n\n## Classes\n\n**`.grid-cell`:**\nThis class is responsible for the look of individual cells. \n\n**`.grid-focus-decorator`:** This decorator class is applied when you click('focus') on a cell\n\nEx. Adding the following style will give you a cell with a blue border around it when the cell is selected.\n``` css\n.grid-focus-decorator {\n  border: 2px solid blue;\n}\n```\n\n**`.grid-selection`:**\nWhen selecting rows and columns, this class sets the border and background so you know which rows you are exactly selecting\n\nEx.\n```css\n$grid-teal: #39CCCC !default;\n.grid-selection {\n  border: 1px solid $grid-teal;\n  background: transparentize($grid-teal, .8);\n}\n```\n\n**`.grid-row`:**\nThis class is responsible for the look of the row of cells.\n\nEx. To apply, a background color when hovering over each row, add the following:\n```css\n.grid-row {\n  &.hover {\n    background-color: lighten($grid-teal, 30) !important;\n  }\n}\n```\n\nTo apply styles only to the header row, use the following class:\n```css\n.grid-row {\n  &.grid-is-header {\n  }\n}\n\n```\n**`.col-resize`:** This class changes the look of the column resizing element. \n\n**`.grid-drag-line`**: This class is used when you are resizing a column. A vertical line is added to guide you of how much to resize your columns.\n\nEx. To show a blue vertical line when resizing a column, add the following\n```css\n.grid-drag-line {\n  background: #7FDBFF;\n}\n```\n\n","readmeFilename":"README.md","gitHead":"c482eed403d720bd6aa98faefde0e9434c1ad64d","_id":"grid@4.10.0","_nodeVersion":"12.18.3","_npmVersion":"6.14.7","dist":{"integrity":"sha512-/9h1RD5AfZwXgW5O1b9NDvWYSsmnem6iaxmjA38bwllv2zxaHvd3AHGDqGYwyYDivWhoS6cVPDvn9Aijwry9gg==","shasum":"7e4c88f0d882e8b0e0ff654018dde70c11594243","tarball":"https://registry.npmjs.org/grid/-/grid-4.10.0.tgz","fileCount":131,"unpackedSize":1621308,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJfNE5SCRA9TVsSAnZWagAAy6oQAKCR3gdItfpmZxXbp3PS\n5AhAeRlKWNBAUWwjRRSaTwaHGgCpIwZEKvJacGkl457+FN0OUK6tMbChHn+4\nQzZC73tb3UzVCV5TzTVbMi1xg6qc42Gl+ab9VC2jXlrPBkUvKspx44WcSyDK\nWl40GAQON29vVrYaahwxct/zyKiGnGAdQl2MVfNXC+qD/neMBpzhYY59VGV4\nKYrRmnXJTGSO/2Qko91SAynGecmi1HjxtYxd9hCqO5rPX2cfPYq2WlLpGYMu\nvs/NLx0f569LmDFXSaIf8CerkQopBar/F+1+fxSkVxErBP8Kigemi0oDQYps\n3DMGZih0y+gP67jHZqeHDH6TPkBAykiTizKnaejNu/AlvEI66G9jiQIeQzZd\nJEj1xu+W+mMGK46k+tQKJoHNVadSmQoCkfhRzinXlpE+tmR7JLrty1xHkZMg\nTTk5BW6hErDzezqgMljkgryDF0N/ejpplt2fUCTvuIMlDjqWPN/afK8SB6w5\nmjDJf/+EnMxazrqUduOwPvCPtjE1gOcfBu3jNeuZRdDP7ZAlZgWTqvdmwkVk\n+Bnuf8AQuGCGFJ4LZKeajyfUl+p8k0/8+viR5y6SINVPal1o2ZyUs17cPUPR\nE0t20n56g5mzTmtgkOLeQJtajTBlLwu3ZyckeQs2CjOBc71lTW/VlvyWiBAX\nGaNu\r\n=gMGo\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDYd8khAM3Li/F+N13BdXT33pRSjRBMQ146EwTwZ7UbLQIhAONY6SF47Qe7txYsRKnnQhKUrwEVMyAWqJF8u/KMzbgT"}]},"maintainers":[{"email":"anthony.liatsis@gmail.com","name":"anthonyl"},{"email":"ben@benshope.com","name":"benshope"},{"email":"christy@relateiq.com","name":"cdennison"},{"email":"joechrz@gmail.com","name":"joechrz"},{"email":"joe.mun@salesforce.com","name":"joemun"},{"email":"john.fox@relateiq.com","name":"john.fox"},{"email":"jon@relateiq.com","name":"jontomas"},{"email":"keven425@gmail.com","name":"keven425"},{"email":"lerhaupt@gmail.com","name":"lerhaupt"},{"email":"rusty.camden@gmail.com","name":"riqlandia-ci"},{"email":"rusty.camden@gmail.com","name":"scamden"},{"email":"public@matthewmartin.com","name":"voxmatt"}],"_npmUser":{"name":"riqlandia-ci","email":"rusty.camden@gmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/grid_4.10.0_1597263442260_0.3682982807978734"},"_hasShrinkwrap":false},"4.10.1":{"name":"grid","version":"4.10.1","description":"A highly scalable grid component written in Typescript",".browser":"dist/grid.js","main":"dist/modules/core/index.js","typings":"dist/modules/core/index.d.ts","publishConfig":{"registry":"https://registry.npmjs.org/","tag":"next"},"engines":{"node":">=10"},"iqproj":{"app":true},"scripts":{"commitmsg":"commitlint -E GIT_PARAMS","preversion":"npm run build","open:src":"ts-node -P tsconfig.srv.json tools/srcServer.ts","ts:watch":"tsc --watch --incremental","dev":"npm-run-all --parallel open:src test:watch ts:watch","clean":"rm -rf ./dist && mkdir dist","prebuild":"npm run clean && npm run test","build":"tsc -P tsconfig.json && NODE_ENV=production node tools/build.js","test":"node_modules/karma/bin/karma start --single-run --no-auto-watch karma.conf.js","test:watch":"node_modules/karma/bin/karma start karma.conf.js","semantic-release":"semantic-release"},"dependencies":{"capitalize":"^0.5.0","click-off":"~0.2.1","element-class":"^0.1.1","es6-object-assign":"~1.1.0","escape-stack":"~0.1.2","inner-text-shim":"~1.0.1","key":"^0.1.11","time-now":"~0.2.1"},"devDependencies":{"@commitlint/cli":"~9.1.2","@commitlint/config-conventional":"~9.1.1","@types/browser-sync":"~2.26.1","@types/jasmine":"~2.6.0","@types/karma":"~1.7.0","@types/webpack-dev-middleware":"~3.7.1","@types/webpack-hot-middleware":"~2.25.3","autoprefixer":"~9.8.6","awesome-typescript-loader":"~5.2.1","browser-sync":"~2.26.12","condition-circle":"~2.0.2","copy-webpack-plugin":"~3.0.1","css-loader":"~4.2.1","ejs-compiled-loader":"~3.0.0","es6-promise":"~3.1.2","fibers":"~5.0.0","file-loader":"~0.9.0","html-webpack-plugin":"~4.3.0","husky":"~0.13.3","install":"~0.13.0","jasmine":"~3.6.1","jquery":"~3.5.1","karma":"~5.1.1","karma-chrome-launcher":"~3.1.0","karma-jasmine":"~0.3.6","karma-sourcemap-loader":"~0.3.7","karma-webpack":"~4.0.2","lodash":"~4.17.19","mini-css-extract-plugin":"~0.10.0","node-sass":"~4.12.0","npm":"~6.14.7","npm-run-all":"~4.0.2","polyfill-function-prototype-bind":"0.0.1","postcss-loader":"~0.11.0","sass-loader":"~9.0.3","semantic-release":"~17.1.1","source-map-loader":"~1.0.1","style-loader":"~1.2.1","transform-ts-paths":"^1.0.0","ts-loader":"~8.0.2","ts-node":"~8.10.2","tslint":"^5.4.2","tslint-eslint-rules":"^4.1.1","typescript":"~3.7.5","url-loader":"~4.1.0","webpack":"~4.44.1","webpack-bundle-analyzer":"~3.8.0","webpack-cli":"~3.3.12","webpack-dev-middleware":"~3.7.2","webpack-hot-middleware":"~2.25.0","webpack-md5-hash":"~0.0.5"},"repository":{"type":"git","url":"git+https://github.com/gridgrid/grid.git"},"keywords":["grid","spreadsheet","virtual","scroll"],"author":{"name":"Sterling Camden"},"license":"MIT","bugs":{"url":"https://github.com/gridgrid/grid/issues"},"homepage":"https://github.com/gridgrid/grid","release":{"verifyConditions":"condition-circle","branch":"next","fallbackTags":{"next":"latest"}},"readme":"[![npm](https://img.shields.io/npm/v/grid.svg)]( https://www.npmjs.com/package/grid) [![CircleCI](https://circleci.com/gh/gridgrid/grid.svg?style=shield)](https://circleci.com/gh/gridgrid/grid)  [![semantic-release](https://img.shields.io/badge/%20%20%F0%9F%93%A6%F0%9F%9A%80-semantic--release-e10079.svg)](https://github.com/semantic-release/semantic-release) [![Commitizen friendly](https://img.shields.io/badge/commitizen-friendly-brightgreen.svg)](http://commitizen.github.io/cz-cli/)\n\nGrid\n===\n\nA highly scalable grid component written in javscript [DEMO](https://gridgrid.github.io/grid/ \"Grid Demo\")\n\nNote: while Grid is fully functional it is still in beta. Use at your own risk and please file any issues on GitHub. \n\nAlso the grid is currently packaged for use with browserify. If you need a build for a non browserify (or webpack) environment please open an issue on github.\n\n\nInstallation\n===\n`npm install --save grid`\n\n\nExample / Quick-Start\n===\n\nTo run the sample app locally, run `npm start` and hit http://localhost:8082\n\n##### Create a Grid Instance\n`var core = require('grid')`\n`var grid = core();`\n\nThe grid handles most complexity for you. There are only three user supplied requirements to a get a grid up and running\n\n##### Row and Column Descriptors\nRow and column descriptors are objects that tell the grid how wide or high to make your cells. They also control things like whether or not a column is hidden and describe the overall dimensions of the grid.\n\n``` javascript\n\t// add some columns\n    var colDescriptors = [];\n    var colDescriptor;\n    for (var c = 0; c < 20; c++) {\n        // create a col descriptor\n        colDescriptor = grid.colModel.create();\n        colDescriptor.width = 78;\n        colDescriptor.hidden = !!(c % 2); // hide every other column for fun and profit\n    }\n    grid.colModel.add(colDescriptors);\n\n    // add some rows\n    var rowDescriptors = [];\n    var rowDescriptor;\n    for (var r = 0; r < 20; r++) {\n        // create a row descriptor\n        rowDescriptor = grid.rowModel.create();\n        rowDescriptor.height = 24;\n        if(r === 0){\n        \trowDescriptor.header = true;\n        }\n    }\n    grid.rowModel.add(rowDescriptors);\n```\n\n##### The DataModel\n\nThe grid determines what to render for a given cell by calling the supplied data model. This gives the client massive flexbility to generate and return the data however they need to.\n\nThe datamodel can be a simple object that the user sets on the grid instance `dataModel` field and needs to implement at a minimum\n\n`get`, `getHeader`, and `isDirty`, \n\nif you support user data entry and want paste to work you should also implement `set`\n\nHere's a basic read only implementation:\n\n``` javascript\n// use the grid's default dirty clean implementation almost always\n// (it will automatically be set clean on each draw by the grid)\nvar dataDirtyClean = grid.makeDirtyClean();\n\ngrid.dataModel = {\n\n    get: function(dataRowIndex, dataColIndex, isCopy) {\n        var rawValue = [dataRowIndex, dataColIndex];\n        return {\n            value: rawValue,\n            formatted: 'r' + rawValue[0] + ', c' + rawValue[1]\n        };\n    },\n    \n    getHeader: function(headerRowIndex, headerColIndex) {\n        var rawValue = [headerRowIndex, headerColIndex];\n        return {\n            value: rawValue,\n            formatted: 'hr' + rawValue[0] + ', hc' + rawValue[1]\n        };\n    },\n    \n    isDirty: dataDirtyClean.isDirty\n};\n```\n\n##### Call Build\nFinally we just need to tell the grid to set itself up in a container of our choosing:\n\n``` javascript\nvar container = document.createElement('div');\ncontainer.style.width = '800px';\ncontainer.style.height = '800px';\ndocument.body.appendChild(container);\ngrid.build(container);\n```\n\nConcepts\n===\n\nMany of the apis in the grid utilize two concepts when referencing coordinates: spaces and units. It's good to understand these before using the more advanced features.\n\n## Spaces\nCoordinates in the grid exist in one of three spaces.\n\n**virtual** - represents all of the data in your grid including the headers. for example, if you have a grid with one header row, then `(0, 20)` in the `'virtual'` space references the column 20 of the header. `(1, 20)` would reference column 20 of the first data row.\n\n**data** - very similar to virtual but does not include the headers. so `(0,20)` references the first row of data at the 20th column and technically `(-1, 20)` would represent the 20th column in the header although negative indexes are rarely used\n\n**view** - the view space represents the actual dom nodes that are rendered for the grid's virtualization. the grid's implementation renders enough cells to fill the entire viewport and no more (usually around 20-30 rows and 10 cols depending on sizes). in this space `(0,20)` would reference the dom cell at column 20 of the first row. even if you scroll the grid it will always point at that cell, so a view coordinate can be translated to different virtual coordinates depending on the scroll. you could think of view coordinates as a correlary for `position: fixed` in css\n\n## Units\nUnits in the grid are straightforward. They are either\n\n**px** - pixels, so `(0,0)` in the view space is the very top left pixel of the grid no matter the scroll, whereas `(0,0)` in the virtual space is the top left pixel only when the grid hasn't been scrolled, and would technically refer to a pixel out of view if the grid has been scrolled\n\nor\n\n**cell** - cells, so `(0,0)` in the view space represents the top left cell regardless of scroll, and `(0,0)` in the virtual space would represent an off screen cell if scrolled and top left if not scrolled\n\nUsing Custom HTML\n===\n\nThere are two ways to get non text (read html) into a grid:\n\n## Decorators\nDecorators are great for adding a piece of one-off ui that doesn't relate directly to the content of a cell or doesn't need to be in every row of a column or vice versa. For example, the grid internally uses decorators to render the focus and selection highlight as well as resize handles.\n\n**basic decorator**\n``` javascript\n\tvar top = 1,\n    left = 2,\n    height = 1,\n    width = 1,\n    unit = 'cell',\n    space = 'view';\n    var d = grid.decorators.create(top, left, height, width, unit, space);\n\n    // return some element\n    d.render = function() {\n        var a = document.createElement('a')\n        a.textContent = 'link Text!'\n        return a;\n    };\n    grid.decorators.add(d);\n```\n\nPuts a link over the cell at row 1 col 2 that doesn’t move with the scroll (why you would do this is questionable but it's just an example).\n\nYou can do more complicated things like render directives: (requires grid-angular-adapter)\n\n**angular directive decorator**\n``` javascript\nangular.module('myCoolGrid', [require('grid')])\n\n  .controller('MyGridCtrl', function($scope, GridSrvc, GridDecoratorSrvc) {\n      var grid = GridSrvc.core();\n\n      // do row col and datamodel setup...\n\n      var top = 20,\n          left = 10,\n          height = 2,\n          width = 2,\n          unit = 'cell',\n          space = 'virtual';\n      var d = grid.decorators.create(top, left, height, width, unit, space);\n\n      // return some element\n      d.render = function() {\n          var scope = $scope.$new();\n          scope.interestingData = 'INTERESTING DATA!!!';\n          return GridDecoratorSrvc.render({\n              $scope: scope,\n              template: '<my-directive data=\"interestingData\"></my-directive>',\n              events: true\n          });\n      };\n      grid.decorators.add(d);\n  });\n```\n\nThis will put your compiled directive in a box that spans from `row 20-22` and `col 10-12`, and moves appropriately with the scroll. The `events` flag lets the grid know that this decorator is interactable and should receive mouse events. (Otherwise pointer events are set to none.) The GridDecoratorSrvc takes care of destroying the scope and properly removing elements to avoid memory leaks with angular. You definitely should use it for any angular decorators.\n\n\n## Builders\nBuilders help you to get html into the actual cells of a given row or column instead of the text that would have been rendered.\n\n\n**basic builders**\n``` javascript\nvar builder = grid.colModel.createBuilder(function render() {\n    return angular.element('<a href=\"#\"></a>')[0];\n}, function update(elem, ctx) {\n    grid.viewLayer.setTextContent(elem, ctx.data.formatted);\n    return elem;\n});\nvar colDescriptor = grid.colModel.create(builder);\n```\n\nhave `<a>` tags in your cells for all the rows in that column\n\nNote: it's important for the update function of a builder to be extremely fast. Call `scope.$digest` not `scope.$apply`, and  use `grid.viewLayer.setTextContent` not `elem.innerHTML` where possible\n\n\nStyling\n===\nIf you want to update the look and feel of the grid, here are a few classes that you can override to give you the look you want.\n\n\n## Classes\n\n**`.grid-cell`:**\nThis class is responsible for the look of individual cells. \n\n**`.grid-focus-decorator`:** This decorator class is applied when you click('focus') on a cell\n\nEx. Adding the following style will give you a cell with a blue border around it when the cell is selected.\n``` css\n.grid-focus-decorator {\n  border: 2px solid blue;\n}\n```\n\n**`.grid-selection`:**\nWhen selecting rows and columns, this class sets the border and background so you know which rows you are exactly selecting\n\nEx.\n```css\n$grid-teal: #39CCCC !default;\n.grid-selection {\n  border: 1px solid $grid-teal;\n  background: transparentize($grid-teal, .8);\n}\n```\n\n**`.grid-row`:**\nThis class is responsible for the look of the row of cells.\n\nEx. To apply, a background color when hovering over each row, add the following:\n```css\n.grid-row {\n  &.hover {\n    background-color: lighten($grid-teal, 30) !important;\n  }\n}\n```\n\nTo apply styles only to the header row, use the following class:\n```css\n.grid-row {\n  &.grid-is-header {\n  }\n}\n\n```\n**`.col-resize`:** This class changes the look of the column resizing element. \n\n**`.grid-drag-line`**: This class is used when you are resizing a column. A vertical line is added to guide you of how much to resize your columns.\n\nEx. To show a blue vertical line when resizing a column, add the following\n```css\n.grid-drag-line {\n  background: #7FDBFF;\n}\n```\n\n","readmeFilename":"README.md","gitHead":"8871f364afae695556e3507b7a4eadedbefc27b5","_id":"grid@4.10.1","_nodeVersion":"12.18.3","_npmVersion":"6.14.7","dist":{"integrity":"sha512-ZLbJ5hgKvdB03fnJCETbyE/RymaeKiOxlqruTKrcSUxk75cF5CzPXllltyT6fJtbIylX5yf2aG8ATKTEKAfp3w==","shasum":"d0a697251cb5a916ea2499d257f358f0c400d251","tarball":"https://registry.npmjs.org/grid/-/grid-4.10.1.tgz","fileCount":219,"unpackedSize":2019251,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJfNFTfCRA9TVsSAnZWagAA59oP/3mer7MJADC3AW6o0nt0\nCQHeatrriodBLjRhiiCALJUqOkQBLYeNzsQ0zBdbeYP6LUA2pZJMz2rwCnGG\nlAj8g98QP+87oZv64B3UHJBuyv0r7/hfsZdH7ZDM19609THXZ3kf1SJwfqP5\nmuzi0/YTdi7DrOiL+/oaELoCPbyRLxCIvARDSvcoum/kBgwQdHPOhxkim4Qo\n+E4WQLb5EmPbojeepyeHTi8yvG+q19P6cBRZvJ/fHgrn+SemdrTdRvTxHc8s\nrReflShMVN8TplKoV88WPTCyKgoqnYJTKhE+zLhDznB90AshMki4msV4yL1c\nA8s3zzQbqy6VnRxBDCipz15QKvnNUQN94gI7OKuFx9Fe2p7I96z3v+Wh+Hb+\n4gpd+2RPOZbUgJ/oHKg/bTytYKD4yaKF8yZTqyHPbxoiaNlODEqRQqGXtAJS\npx7zXLp61bgTq15Ye5xt/yys1CbTKAr9vrBacIhWvXfGDLgATR+FIuB6N8kc\nXe8/5OKH3/IBfhsFhxdlznQUD+fbBDWBykPjOg5GosdK8+7OneZ3OIXETqN4\nbKEzjW5Jwevu05vKLvlUHFZoAbBLYmQnSIeebwsNsLdwcifrPvWi3pAHSe1r\n68vaJkOw9NXL49gCUzujaPmI7s9rGVHcsxPriDje+lRswAIc9gDwcIanrUjH\n+uRC\r\n=TfZb\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCID0pnpDL/z9svZUT8lMXf8nkLWoskutlTkxSVQigdl5OAiEA4+ikQnobSZtAd77jkW5/PYZj24xGc619fBYadazl+40="}]},"maintainers":[{"email":"anthony.liatsis@gmail.com","name":"anthonyl"},{"email":"ben@benshope.com","name":"benshope"},{"email":"christy@relateiq.com","name":"cdennison"},{"email":"joechrz@gmail.com","name":"joechrz"},{"email":"joe.mun@salesforce.com","name":"joemun"},{"email":"john.fox@relateiq.com","name":"john.fox"},{"email":"jon@relateiq.com","name":"jontomas"},{"email":"keven425@gmail.com","name":"keven425"},{"email":"lerhaupt@gmail.com","name":"lerhaupt"},{"email":"rusty.camden@gmail.com","name":"riqlandia-ci"},{"email":"rusty.camden@gmail.com","name":"scamden"},{"email":"public@matthewmartin.com","name":"voxmatt"}],"_npmUser":{"name":"riqlandia-ci","email":"rusty.camden@gmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/grid_4.10.1_1597265119284_0.5657252156940387"},"_hasShrinkwrap":false},"4.10.2":{"name":"grid","version":"4.10.2","description":"A highly scalable grid component written in Typescript",".browser":"dist/grid.js","main":"dist/modules/core/index.js","typings":"dist/modules/core/index.d.ts","publishConfig":{"registry":"https://registry.npmjs.org/","tag":"next"},"engines":{"node":">=10"},"iqproj":{"app":true},"scripts":{"commitmsg":"commitlint -E GIT_PARAMS","preversion":"npm run build","open:src":"ts-node -P tsconfig.srv.json tools/srcServer.ts","ts:watch":"tsc --watch --incremental","dev":"npm-run-all --parallel open:src test:watch ts:watch","clean":"rm -rf ./dist && mkdir dist","prebuild":"npm run clean && npm run test","build":"tsc -P tsconfig.json && NODE_ENV=production node tools/build.js","test":"node_modules/karma/bin/karma start --single-run --no-auto-watch karma.conf.js","test:watch":"node_modules/karma/bin/karma start karma.conf.js","semantic-release":"semantic-release"},"dependencies":{"capitalize":"^0.5.0","click-off":"~0.2.1","element-class":"^0.1.1","es6-object-assign":"~1.1.0","escape-stack":"~0.1.2","inner-text-shim":"~1.0.1","key":"^0.1.11","time-now":"~0.2.1"},"devDependencies":{"@commitlint/cli":"~9.1.2","@commitlint/config-conventional":"~9.1.1","@types/browser-sync":"~2.26.1","@types/jasmine":"~2.6.0","@types/karma":"~1.7.0","@types/webpack-dev-middleware":"~3.7.1","@types/webpack-hot-middleware":"~2.25.3","autoprefixer":"~9.8.6","awesome-typescript-loader":"~5.2.1","browser-sync":"~2.26.12","condition-circle":"~2.0.2","copy-webpack-plugin":"~3.0.1","css-loader":"~4.2.1","ejs-compiled-loader":"~3.0.0","es6-promise":"~3.1.2","fibers":"~5.0.0","file-loader":"~0.9.0","html-webpack-plugin":"~4.3.0","husky":"~0.13.3","install":"~0.13.0","jasmine":"~3.6.1","jquery":"~3.5.1","karma":"~5.1.1","karma-chrome-launcher":"~3.1.0","karma-jasmine":"~0.3.6","karma-sourcemap-loader":"~0.3.7","karma-webpack":"~4.0.2","lodash":"~4.17.19","mini-css-extract-plugin":"~0.10.0","node-sass":"~4.12.0","npm":"~6.14.7","npm-run-all":"~4.0.2","polyfill-function-prototype-bind":"0.0.1","postcss-loader":"~0.11.0","sass-loader":"~9.0.3","semantic-release":"~17.1.1","source-map-loader":"~1.0.1","style-loader":"~1.2.1","transform-ts-paths":"^1.0.0","ts-loader":"~8.0.2","ts-node":"~8.10.2","tslint":"^5.4.2","tslint-eslint-rules":"^4.1.1","typescript":"~3.7.5","url-loader":"~4.1.0","webpack":"~4.44.1","webpack-bundle-analyzer":"~3.8.0","webpack-cli":"~3.3.12","webpack-dev-middleware":"~3.7.2","webpack-hot-middleware":"~2.25.0","webpack-md5-hash":"~0.0.5"},"repository":{"type":"git","url":"git+https://github.com/gridgrid/grid.git"},"keywords":["grid","spreadsheet","virtual","scroll"],"author":{"name":"Sterling Camden"},"license":"MIT","bugs":{"url":"https://github.com/gridgrid/grid/issues"},"homepage":"https://github.com/gridgrid/grid","release":{"verifyConditions":"condition-circle","branch":"next","fallbackTags":{"next":"latest"}},"readme":"[![npm](https://img.shields.io/npm/v/grid.svg)]( https://www.npmjs.com/package/grid) [![CircleCI](https://circleci.com/gh/gridgrid/grid.svg?style=shield)](https://circleci.com/gh/gridgrid/grid)  [![semantic-release](https://img.shields.io/badge/%20%20%F0%9F%93%A6%F0%9F%9A%80-semantic--release-e10079.svg)](https://github.com/semantic-release/semantic-release) [![Commitizen friendly](https://img.shields.io/badge/commitizen-friendly-brightgreen.svg)](http://commitizen.github.io/cz-cli/)\n\nGrid\n===\n\nA highly scalable grid component written in javscript [DEMO](https://gridgrid.github.io/grid/ \"Grid Demo\")\n\nNote: while Grid is fully functional it is still in beta. Use at your own risk and please file any issues on GitHub. \n\nAlso the grid is currently packaged for use with browserify. If you need a build for a non browserify (or webpack) environment please open an issue on github.\n\n\nInstallation\n===\n`npm install --save grid`\n\n\nExample / Quick-Start\n===\n\nTo run the sample app locally, run `npm start` and hit http://localhost:8082\n\n##### Create a Grid Instance\n`var core = require('grid')`\n`var grid = core();`\n\nThe grid handles most complexity for you. There are only three user supplied requirements to a get a grid up and running\n\n##### Row and Column Descriptors\nRow and column descriptors are objects that tell the grid how wide or high to make your cells. They also control things like whether or not a column is hidden and describe the overall dimensions of the grid.\n\n``` javascript\n\t// add some columns\n    var colDescriptors = [];\n    var colDescriptor;\n    for (var c = 0; c < 20; c++) {\n        // create a col descriptor\n        colDescriptor = grid.colModel.create();\n        colDescriptor.width = 78;\n        colDescriptor.hidden = !!(c % 2); // hide every other column for fun and profit\n    }\n    grid.colModel.add(colDescriptors);\n\n    // add some rows\n    var rowDescriptors = [];\n    var rowDescriptor;\n    for (var r = 0; r < 20; r++) {\n        // create a row descriptor\n        rowDescriptor = grid.rowModel.create();\n        rowDescriptor.height = 24;\n        if(r === 0){\n        \trowDescriptor.header = true;\n        }\n    }\n    grid.rowModel.add(rowDescriptors);\n```\n\n##### The DataModel\n\nThe grid determines what to render for a given cell by calling the supplied data model. This gives the client massive flexbility to generate and return the data however they need to.\n\nThe datamodel can be a simple object that the user sets on the grid instance `dataModel` field and needs to implement at a minimum\n\n`get`, `getHeader`, and `isDirty`, \n\nif you support user data entry and want paste to work you should also implement `set`\n\nHere's a basic read only implementation:\n\n``` javascript\n// use the grid's default dirty clean implementation almost always\n// (it will automatically be set clean on each draw by the grid)\nvar dataDirtyClean = grid.makeDirtyClean();\n\ngrid.dataModel = {\n\n    get: function(dataRowIndex, dataColIndex, isCopy) {\n        var rawValue = [dataRowIndex, dataColIndex];\n        return {\n            value: rawValue,\n            formatted: 'r' + rawValue[0] + ', c' + rawValue[1]\n        };\n    },\n    \n    getHeader: function(headerRowIndex, headerColIndex) {\n        var rawValue = [headerRowIndex, headerColIndex];\n        return {\n            value: rawValue,\n            formatted: 'hr' + rawValue[0] + ', hc' + rawValue[1]\n        };\n    },\n    \n    isDirty: dataDirtyClean.isDirty\n};\n```\n\n##### Call Build\nFinally we just need to tell the grid to set itself up in a container of our choosing:\n\n``` javascript\nvar container = document.createElement('div');\ncontainer.style.width = '800px';\ncontainer.style.height = '800px';\ndocument.body.appendChild(container);\ngrid.build(container);\n```\n\nConcepts\n===\n\nMany of the apis in the grid utilize two concepts when referencing coordinates: spaces and units. It's good to understand these before using the more advanced features.\n\n## Spaces\nCoordinates in the grid exist in one of three spaces.\n\n**virtual** - represents all of the data in your grid including the headers. for example, if you have a grid with one header row, then `(0, 20)` in the `'virtual'` space references the column 20 of the header. `(1, 20)` would reference column 20 of the first data row.\n\n**data** - very similar to virtual but does not include the headers. so `(0,20)` references the first row of data at the 20th column and technically `(-1, 20)` would represent the 20th column in the header although negative indexes are rarely used\n\n**view** - the view space represents the actual dom nodes that are rendered for the grid's virtualization. the grid's implementation renders enough cells to fill the entire viewport and no more (usually around 20-30 rows and 10 cols depending on sizes). in this space `(0,20)` would reference the dom cell at column 20 of the first row. even if you scroll the grid it will always point at that cell, so a view coordinate can be translated to different virtual coordinates depending on the scroll. you could think of view coordinates as a correlary for `position: fixed` in css\n\n## Units\nUnits in the grid are straightforward. They are either\n\n**px** - pixels, so `(0,0)` in the view space is the very top left pixel of the grid no matter the scroll, whereas `(0,0)` in the virtual space is the top left pixel only when the grid hasn't been scrolled, and would technically refer to a pixel out of view if the grid has been scrolled\n\nor\n\n**cell** - cells, so `(0,0)` in the view space represents the top left cell regardless of scroll, and `(0,0)` in the virtual space would represent an off screen cell if scrolled and top left if not scrolled\n\nUsing Custom HTML\n===\n\nThere are two ways to get non text (read html) into a grid:\n\n## Decorators\nDecorators are great for adding a piece of one-off ui that doesn't relate directly to the content of a cell or doesn't need to be in every row of a column or vice versa. For example, the grid internally uses decorators to render the focus and selection highlight as well as resize handles.\n\n**basic decorator**\n``` javascript\n\tvar top = 1,\n    left = 2,\n    height = 1,\n    width = 1,\n    unit = 'cell',\n    space = 'view';\n    var d = grid.decorators.create(top, left, height, width, unit, space);\n\n    // return some element\n    d.render = function() {\n        var a = document.createElement('a')\n        a.textContent = 'link Text!'\n        return a;\n    };\n    grid.decorators.add(d);\n```\n\nPuts a link over the cell at row 1 col 2 that doesn’t move with the scroll (why you would do this is questionable but it's just an example).\n\nYou can do more complicated things like render directives: (requires grid-angular-adapter)\n\n**angular directive decorator**\n``` javascript\nangular.module('myCoolGrid', [require('grid')])\n\n  .controller('MyGridCtrl', function($scope, GridSrvc, GridDecoratorSrvc) {\n      var grid = GridSrvc.core();\n\n      // do row col and datamodel setup...\n\n      var top = 20,\n          left = 10,\n          height = 2,\n          width = 2,\n          unit = 'cell',\n          space = 'virtual';\n      var d = grid.decorators.create(top, left, height, width, unit, space);\n\n      // return some element\n      d.render = function() {\n          var scope = $scope.$new();\n          scope.interestingData = 'INTERESTING DATA!!!';\n          return GridDecoratorSrvc.render({\n              $scope: scope,\n              template: '<my-directive data=\"interestingData\"></my-directive>',\n              events: true\n          });\n      };\n      grid.decorators.add(d);\n  });\n```\n\nThis will put your compiled directive in a box that spans from `row 20-22` and `col 10-12`, and moves appropriately with the scroll. The `events` flag lets the grid know that this decorator is interactable and should receive mouse events. (Otherwise pointer events are set to none.) The GridDecoratorSrvc takes care of destroying the scope and properly removing elements to avoid memory leaks with angular. You definitely should use it for any angular decorators.\n\n\n## Builders\nBuilders help you to get html into the actual cells of a given row or column instead of the text that would have been rendered.\n\n\n**basic builders**\n``` javascript\nvar builder = grid.colModel.createBuilder(function render() {\n    return angular.element('<a href=\"#\"></a>')[0];\n}, function update(elem, ctx) {\n    grid.viewLayer.setTextContent(elem, ctx.data.formatted);\n    return elem;\n});\nvar colDescriptor = grid.colModel.create(builder);\n```\n\nhave `<a>` tags in your cells for all the rows in that column\n\nNote: it's important for the update function of a builder to be extremely fast. Call `scope.$digest` not `scope.$apply`, and  use `grid.viewLayer.setTextContent` not `elem.innerHTML` where possible\n\n\nStyling\n===\nIf you want to update the look and feel of the grid, here are a few classes that you can override to give you the look you want.\n\n\n## Classes\n\n**`.grid-cell`:**\nThis class is responsible for the look of individual cells. \n\n**`.grid-focus-decorator`:** This decorator class is applied when you click('focus') on a cell\n\nEx. Adding the following style will give you a cell with a blue border around it when the cell is selected.\n``` css\n.grid-focus-decorator {\n  border: 2px solid blue;\n}\n```\n\n**`.grid-selection`:**\nWhen selecting rows and columns, this class sets the border and background so you know which rows you are exactly selecting\n\nEx.\n```css\n$grid-teal: #39CCCC !default;\n.grid-selection {\n  border: 1px solid $grid-teal;\n  background: transparentize($grid-teal, .8);\n}\n```\n\n**`.grid-row`:**\nThis class is responsible for the look of the row of cells.\n\nEx. To apply, a background color when hovering over each row, add the following:\n```css\n.grid-row {\n  &.hover {\n    background-color: lighten($grid-teal, 30) !important;\n  }\n}\n```\n\nTo apply styles only to the header row, use the following class:\n```css\n.grid-row {\n  &.grid-is-header {\n  }\n}\n\n```\n**`.col-resize`:** This class changes the look of the column resizing element. \n\n**`.grid-drag-line`**: This class is used when you are resizing a column. A vertical line is added to guide you of how much to resize your columns.\n\nEx. To show a blue vertical line when resizing a column, add the following\n```css\n.grid-drag-line {\n  background: #7FDBFF;\n}\n```\n\n","readmeFilename":"README.md","gitHead":"4ca9e93a69763e46c9df03567232abef7385b6c5","_id":"grid@4.10.2","_nodeVersion":"12.18.3","_npmVersion":"6.14.7","dist":{"integrity":"sha512-fvL1iNVo1JCQ8jR264yufvooFOnEIyIC8z4eKqbP7ikU27AsFhAg0Bd6T9WzYFIsbvoxjuuzdPQyOEh8x7BlJA==","shasum":"8b48f37a75e9cdb2212bdac1c3870c8ed7e16f8e","tarball":"https://registry.npmjs.org/grid/-/grid-4.10.2.tgz","fileCount":219,"unpackedSize":2018391,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJfNIQNCRA9TVsSAnZWagAACS4P/1H7+h8R/Qn5doMdZOqe\nhsJEdnspKNVRJLgt/3fd/D2jBpYr4618fMg7fvCtPwicpYdIbX2VrvSX6J06\nb8qKBf3RxvuqX0OjJzfMdiyO8DqsnEcsmM2i2rd3cBOgTNSeuAXbb0gajmKL\nCRlIX9xpmg7xbJKLkz6jzZWCWApeb94OtQ0Kk7l6NZt9ISQeuDMlwZVQZDSB\nqD26oIdFLoAa9GtS8rQ8h+VXdcUeLKrdtKHWwnRC6VWHW0/SRSRTqB0NcayO\noo8F6TB/Xfp/h5zSUC1VDy72NLH0o4s+lxcOeDIo4HNHEcMMxHpfnPAfLhKc\ngDIBtTOIWueYf1bvmKE6fe4gQSYw1pQ0rVLIfhJl9hrQGqIDnvlixyl+xuur\nLCLreT3BDDokQDyS8Xnqzg7l++1Ganxc9DS91Nk2zdNlS4yqZNpr3JkaS3XH\nJX4GkTkVQoeaV939eGB9NOCelEzQj7IB7vE83rOx37DRJ8CSlQ0QNxgua/HK\nKxwy7kBpHho+RATZWtdnvuAYy/cgy1lBD/UZcm0q0tc2+6OW4YeBjLZQ8dOR\nrbw83MYGys+kglP2HdBHlXWOiBOnZ5fb2G86S4dbyIFQKdQsnu/syQX8/RgJ\nPJVIrZAhhSazZxqJag2AXVOdce5xuZmLYtj49bFq8tPtghQCz1wfewz0qzIO\n8ljd\r\n=RDoz\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCNVIzbeRdAhCQ1MtFs2jIKPSABgyZfJBOp7Fyy9KHPvgIhAJtafQ/O1Q/FMYoDi8Vu72ODkUcm7ui3HNJvDUD0nN/h"}]},"maintainers":[{"email":"anthony.liatsis@gmail.com","name":"anthonyl"},{"email":"ben@benshope.com","name":"benshope"},{"email":"christy@relateiq.com","name":"cdennison"},{"email":"joechrz@gmail.com","name":"joechrz"},{"email":"joe.mun@salesforce.com","name":"joemun"},{"email":"john.fox@relateiq.com","name":"john.fox"},{"email":"jon@relateiq.com","name":"jontomas"},{"email":"keven425@gmail.com","name":"keven425"},{"email":"lerhaupt@gmail.com","name":"lerhaupt"},{"email":"rusty.camden@gmail.com","name":"riqlandia-ci"},{"email":"rusty.camden@gmail.com","name":"scamden"},{"email":"public@matthewmartin.com","name":"voxmatt"}],"_npmUser":{"name":"riqlandia-ci","email":"rusty.camden@gmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/grid_4.10.2_1597277197079_0.1681342152660097"},"_hasShrinkwrap":false},"4.10.3":{"name":"grid","version":"4.10.3","description":"A highly scalable grid component written in Typescript",".browser":"dist/grid.js","main":"dist/modules/core/index.js","typings":"dist/modules/core/index.d.ts","publishConfig":{"registry":"https://registry.npmjs.org/","tag":"next"},"engines":{"node":">=10"},"iqproj":{"app":true},"scripts":{"commitmsg":"commitlint -E GIT_PARAMS","preversion":"npm run build","open:src":"ts-node -P tsconfig.srv.json tools/srcServer.ts","ts:watch":"tsc --watch --incremental","dev":"npm-run-all --parallel open:src test:watch ts:watch","clean":"rm -rf ./dist && mkdir dist","prebuild":"npm run clean && npm run test","build":"tsc -P tsconfig.json && NODE_ENV=production node tools/build.js","test":"node_modules/karma/bin/karma start --single-run --no-auto-watch karma.conf.js","test:watch":"node_modules/karma/bin/karma start karma.conf.js","semantic-release":"semantic-release"},"dependencies":{"capitalize":"^0.5.0","click-off":"~0.2.1","element-class":"^0.1.1","es6-object-assign":"~1.1.0","escape-stack":"~0.1.2","inner-text-shim":"~1.0.1","key":"^0.1.11","time-now":"~0.2.1"},"devDependencies":{"@commitlint/cli":"~9.1.2","@commitlint/config-conventional":"~9.1.1","@types/browser-sync":"~2.26.1","@types/jasmine":"~2.6.0","@types/karma":"~1.7.0","@types/webpack-dev-middleware":"~3.7.1","@types/webpack-hot-middleware":"~2.25.3","autoprefixer":"~9.8.6","awesome-typescript-loader":"~5.2.1","browser-sync":"~2.26.12","condition-circle":"~2.0.2","copy-webpack-plugin":"~3.0.1","css-loader":"~4.2.1","ejs-compiled-loader":"~3.0.0","es6-promise":"~3.1.2","fibers":"~5.0.0","file-loader":"~0.9.0","html-webpack-plugin":"~4.3.0","husky":"~0.13.3","install":"~0.13.0","jasmine":"~3.6.1","jquery":"~3.5.1","karma":"~5.1.1","karma-chrome-launcher":"~3.1.0","karma-jasmine":"~0.3.6","karma-sourcemap-loader":"~0.3.7","karma-webpack":"~4.0.2","lodash":"~4.17.19","mini-css-extract-plugin":"~0.10.0","node-sass":"~4.12.0","npm":"~6.14.7","npm-run-all":"~4.0.2","polyfill-function-prototype-bind":"0.0.1","postcss-loader":"~0.11.0","sass-loader":"~9.0.3","semantic-release":"~17.1.1","source-map-loader":"~1.0.1","style-loader":"~1.2.1","transform-ts-paths":"^1.0.0","ts-loader":"~8.0.2","ts-node":"~8.10.2","tslint":"^5.4.2","tslint-eslint-rules":"^4.1.1","typescript":"~3.7.5","url-loader":"~4.1.0","webpack":"~4.44.1","webpack-bundle-analyzer":"~3.8.0","webpack-cli":"~3.3.12","webpack-dev-middleware":"~3.7.2","webpack-hot-middleware":"~2.25.0","webpack-md5-hash":"~0.0.5"},"repository":{"type":"git","url":"git+https://github.com/gridgrid/grid.git"},"keywords":["grid","spreadsheet","virtual","scroll"],"author":{"name":"Sterling Camden"},"license":"MIT","bugs":{"url":"https://github.com/gridgrid/grid/issues"},"homepage":"https://github.com/gridgrid/grid","release":{"verifyConditions":"condition-circle","branch":"next","fallbackTags":{"next":"latest"}},"readme":"[![npm](https://img.shields.io/npm/v/grid.svg)]( https://www.npmjs.com/package/grid) [![CircleCI](https://circleci.com/gh/gridgrid/grid.svg?style=shield)](https://circleci.com/gh/gridgrid/grid)  [![semantic-release](https://img.shields.io/badge/%20%20%F0%9F%93%A6%F0%9F%9A%80-semantic--release-e10079.svg)](https://github.com/semantic-release/semantic-release) [![Commitizen friendly](https://img.shields.io/badge/commitizen-friendly-brightgreen.svg)](http://commitizen.github.io/cz-cli/)\n\nGrid\n===\n\nA highly scalable grid component written in javscript [DEMO](https://gridgrid.github.io/grid/ \"Grid Demo\")\n\nNote: while Grid is fully functional it is still in beta. Use at your own risk and please file any issues on GitHub. \n\nAlso the grid is currently packaged for use with browserify. If you need a build for a non browserify (or webpack) environment please open an issue on github.\n\n\nInstallation\n===\n`npm install --save grid`\n\n\nExample / Quick-Start\n===\n\nTo run the sample app locally, run `npm start` and hit http://localhost:8082\n\n##### Create a Grid Instance\n`var core = require('grid')`\n`var grid = core();`\n\nThe grid handles most complexity for you. There are only three user supplied requirements to a get a grid up and running\n\n##### Row and Column Descriptors\nRow and column descriptors are objects that tell the grid how wide or high to make your cells. They also control things like whether or not a column is hidden and describe the overall dimensions of the grid.\n\n``` javascript\n\t// add some columns\n    var colDescriptors = [];\n    var colDescriptor;\n    for (var c = 0; c < 20; c++) {\n        // create a col descriptor\n        colDescriptor = grid.colModel.create();\n        colDescriptor.width = 78;\n        colDescriptor.hidden = !!(c % 2); // hide every other column for fun and profit\n    }\n    grid.colModel.add(colDescriptors);\n\n    // add some rows\n    var rowDescriptors = [];\n    var rowDescriptor;\n    for (var r = 0; r < 20; r++) {\n        // create a row descriptor\n        rowDescriptor = grid.rowModel.create();\n        rowDescriptor.height = 24;\n        if(r === 0){\n        \trowDescriptor.header = true;\n        }\n    }\n    grid.rowModel.add(rowDescriptors);\n```\n\n##### The DataModel\n\nThe grid determines what to render for a given cell by calling the supplied data model. This gives the client massive flexbility to generate and return the data however they need to.\n\nThe datamodel can be a simple object that the user sets on the grid instance `dataModel` field and needs to implement at a minimum\n\n`get`, `getHeader`, and `isDirty`, \n\nif you support user data entry and want paste to work you should also implement `set`\n\nHere's a basic read only implementation:\n\n``` javascript\n// use the grid's default dirty clean implementation almost always\n// (it will automatically be set clean on each draw by the grid)\nvar dataDirtyClean = grid.makeDirtyClean();\n\ngrid.dataModel = {\n\n    get: function(dataRowIndex, dataColIndex, isCopy) {\n        var rawValue = [dataRowIndex, dataColIndex];\n        return {\n            value: rawValue,\n            formatted: 'r' + rawValue[0] + ', c' + rawValue[1]\n        };\n    },\n    \n    getHeader: function(headerRowIndex, headerColIndex) {\n        var rawValue = [headerRowIndex, headerColIndex];\n        return {\n            value: rawValue,\n            formatted: 'hr' + rawValue[0] + ', hc' + rawValue[1]\n        };\n    },\n    \n    isDirty: dataDirtyClean.isDirty\n};\n```\n\n##### Call Build\nFinally we just need to tell the grid to set itself up in a container of our choosing:\n\n``` javascript\nvar container = document.createElement('div');\ncontainer.style.width = '800px';\ncontainer.style.height = '800px';\ndocument.body.appendChild(container);\ngrid.build(container);\n```\n\nConcepts\n===\n\nMany of the apis in the grid utilize two concepts when referencing coordinates: spaces and units. It's good to understand these before using the more advanced features.\n\n## Spaces\nCoordinates in the grid exist in one of three spaces.\n\n**virtual** - represents all of the data in your grid including the headers. for example, if you have a grid with one header row, then `(0, 20)` in the `'virtual'` space references the column 20 of the header. `(1, 20)` would reference column 20 of the first data row.\n\n**data** - very similar to virtual but does not include the headers. so `(0,20)` references the first row of data at the 20th column and technically `(-1, 20)` would represent the 20th column in the header although negative indexes are rarely used\n\n**view** - the view space represents the actual dom nodes that are rendered for the grid's virtualization. the grid's implementation renders enough cells to fill the entire viewport and no more (usually around 20-30 rows and 10 cols depending on sizes). in this space `(0,20)` would reference the dom cell at column 20 of the first row. even if you scroll the grid it will always point at that cell, so a view coordinate can be translated to different virtual coordinates depending on the scroll. you could think of view coordinates as a correlary for `position: fixed` in css\n\n## Units\nUnits in the grid are straightforward. They are either\n\n**px** - pixels, so `(0,0)` in the view space is the very top left pixel of the grid no matter the scroll, whereas `(0,0)` in the virtual space is the top left pixel only when the grid hasn't been scrolled, and would technically refer to a pixel out of view if the grid has been scrolled\n\nor\n\n**cell** - cells, so `(0,0)` in the view space represents the top left cell regardless of scroll, and `(0,0)` in the virtual space would represent an off screen cell if scrolled and top left if not scrolled\n\nUsing Custom HTML\n===\n\nThere are two ways to get non text (read html) into a grid:\n\n## Decorators\nDecorators are great for adding a piece of one-off ui that doesn't relate directly to the content of a cell or doesn't need to be in every row of a column or vice versa. For example, the grid internally uses decorators to render the focus and selection highlight as well as resize handles.\n\n**basic decorator**\n``` javascript\n\tvar top = 1,\n    left = 2,\n    height = 1,\n    width = 1,\n    unit = 'cell',\n    space = 'view';\n    var d = grid.decorators.create(top, left, height, width, unit, space);\n\n    // return some element\n    d.render = function() {\n        var a = document.createElement('a')\n        a.textContent = 'link Text!'\n        return a;\n    };\n    grid.decorators.add(d);\n```\n\nPuts a link over the cell at row 1 col 2 that doesn’t move with the scroll (why you would do this is questionable but it's just an example).\n\nYou can do more complicated things like render directives: (requires grid-angular-adapter)\n\n**angular directive decorator**\n``` javascript\nangular.module('myCoolGrid', [require('grid')])\n\n  .controller('MyGridCtrl', function($scope, GridSrvc, GridDecoratorSrvc) {\n      var grid = GridSrvc.core();\n\n      // do row col and datamodel setup...\n\n      var top = 20,\n          left = 10,\n          height = 2,\n          width = 2,\n          unit = 'cell',\n          space = 'virtual';\n      var d = grid.decorators.create(top, left, height, width, unit, space);\n\n      // return some element\n      d.render = function() {\n          var scope = $scope.$new();\n          scope.interestingData = 'INTERESTING DATA!!!';\n          return GridDecoratorSrvc.render({\n              $scope: scope,\n              template: '<my-directive data=\"interestingData\"></my-directive>',\n              events: true\n          });\n      };\n      grid.decorators.add(d);\n  });\n```\n\nThis will put your compiled directive in a box that spans from `row 20-22` and `col 10-12`, and moves appropriately with the scroll. The `events` flag lets the grid know that this decorator is interactable and should receive mouse events. (Otherwise pointer events are set to none.) The GridDecoratorSrvc takes care of destroying the scope and properly removing elements to avoid memory leaks with angular. You definitely should use it for any angular decorators.\n\n\n## Builders\nBuilders help you to get html into the actual cells of a given row or column instead of the text that would have been rendered.\n\n\n**basic builders**\n``` javascript\nvar builder = grid.colModel.createBuilder(function render() {\n    return angular.element('<a href=\"#\"></a>')[0];\n}, function update(elem, ctx) {\n    grid.viewLayer.setTextContent(elem, ctx.data.formatted);\n    return elem;\n});\nvar colDescriptor = grid.colModel.create(builder);\n```\n\nhave `<a>` tags in your cells for all the rows in that column\n\nNote: it's important for the update function of a builder to be extremely fast. Call `scope.$digest` not `scope.$apply`, and  use `grid.viewLayer.setTextContent` not `elem.innerHTML` where possible\n\n\nStyling\n===\nIf you want to update the look and feel of the grid, here are a few classes that you can override to give you the look you want.\n\n\n## Classes\n\n**`.grid-cell`:**\nThis class is responsible for the look of individual cells. \n\n**`.grid-focus-decorator`:** This decorator class is applied when you click('focus') on a cell\n\nEx. Adding the following style will give you a cell with a blue border around it when the cell is selected.\n``` css\n.grid-focus-decorator {\n  border: 2px solid blue;\n}\n```\n\n**`.grid-selection`:**\nWhen selecting rows and columns, this class sets the border and background so you know which rows you are exactly selecting\n\nEx.\n```css\n$grid-teal: #39CCCC !default;\n.grid-selection {\n  border: 1px solid $grid-teal;\n  background: transparentize($grid-teal, .8);\n}\n```\n\n**`.grid-row`:**\nThis class is responsible for the look of the row of cells.\n\nEx. To apply, a background color when hovering over each row, add the following:\n```css\n.grid-row {\n  &.hover {\n    background-color: lighten($grid-teal, 30) !important;\n  }\n}\n```\n\nTo apply styles only to the header row, use the following class:\n```css\n.grid-row {\n  &.grid-is-header {\n  }\n}\n\n```\n**`.col-resize`:** This class changes the look of the column resizing element. \n\n**`.grid-drag-line`**: This class is used when you are resizing a column. A vertical line is added to guide you of how much to resize your columns.\n\nEx. To show a blue vertical line when resizing a column, add the following\n```css\n.grid-drag-line {\n  background: #7FDBFF;\n}\n```\n\n","readmeFilename":"README.md","gitHead":"d8b35dce5499d91dddab61d701a1fa8af46a3973","_id":"grid@4.10.3","_nodeVersion":"12.18.3","_npmVersion":"6.14.7","dist":{"integrity":"sha512-7a01EIWCmeAufxaP3ngOhHC/8LO16eZMHwju9MebPW7WzXqyn+H/4k7Wa4ACTN9ljb3lcxpKYiPqkw9FlWBpFQ==","shasum":"7e1beb64376a693aed1f5f439e87c37f451b5601","tarball":"https://registry.npmjs.org/grid/-/grid-4.10.3.tgz","fileCount":219,"unpackedSize":2020337,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJfNJ5hCRA9TVsSAnZWagAAgYcP/3y+2ivKO92z74HFt/Qa\na5sh4DfVkXteo0T35rZBrKjI+7hYZVaLcowDBY/6d/s2LJ9FoOlFTK+tvHkD\nMcha195AUMcJfJ9Exy1ESTUVFZTXwLwkCARN8HPVLOWF0BWDgC0jwcUVI4qO\nCwgp3SVd2YGhWj/lv6wYbzqU4yGn+JRTFe/Odh1iSFj4LJ4hQu0FGJfvhcaP\nh3DKnuP+nkgn4WokEuZ81NUvTFVrXFc4fAeie3GCq5y3C8eJomQUSHvc6gTm\n00tyAu+p0rT+nwRPnGSno/qZaQiAl3Lvlab6HLi4YcxibSe0YPL3/x3VqTPu\nHRAEPk+cWueCJwtmLQemSA9rX8GQ1TVslYkOG+xm1qVjLJ1wFzwMQKRT+Fxa\nmE+hRuNK7KtF4dFOHeS8k4RdwOtANedQKqHfJVR9b7O9N6zEtdjXN7RHMyJB\nYonlVcWI5jTtrNsFEGMcHI3mw+Bq1G6uQ/ZOZBm9vyR0NjrgfRoe3W2ADkKv\nRn28bkW7vyY4wsw9BeYZ7YA0GMFs5zAFpyAhoAJTEHN0A+eTev9vMNc4MZV/\nRhV32cPyS9vCHayclvgC5Xz8+pVM7F0d4ZOQCXFVs0a4MLHvmbUf4P+ygxpn\no9GoDA5lW6qKV/VHlBKRZd8lM76aaeeKF5Nyo8NezvePKfQNF8C+pqEQmryM\nM4z2\r\n=xMZm\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIE7071uGmFpaRgKON84kBPkC4Yck55it4+DyO5/gO6GXAiEA4bZGx5myQTpBkvdWyuzpyPH/D/vm9GkTWGryhasqdUg="}]},"maintainers":[{"email":"anthony.liatsis@gmail.com","name":"anthonyl"},{"email":"ben@benshope.com","name":"benshope"},{"email":"christy@relateiq.com","name":"cdennison"},{"email":"joechrz@gmail.com","name":"joechrz"},{"email":"joe.mun@salesforce.com","name":"joemun"},{"email":"john.fox@relateiq.com","name":"john.fox"},{"email":"jon@relateiq.com","name":"jontomas"},{"email":"keven425@gmail.com","name":"keven425"},{"email":"lerhaupt@gmail.com","name":"lerhaupt"},{"email":"rusty.camden@gmail.com","name":"riqlandia-ci"},{"email":"rusty.camden@gmail.com","name":"scamden"},{"email":"public@matthewmartin.com","name":"voxmatt"}],"_npmUser":{"name":"riqlandia-ci","email":"rusty.camden@gmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/grid_4.10.3_1597283936910_0.07786814572614853"},"_hasShrinkwrap":false},"4.10.4":{"name":"grid","version":"4.10.4","description":"A highly scalable grid component written in Typescript",".browser":"dist/grid.js","main":"dist/modules/core/index.js","typings":"dist/modules/core/index.d.ts","publishConfig":{"registry":"https://registry.npmjs.org/","tag":"next"},"engines":{"node":">=10"},"iqproj":{"app":true},"scripts":{"commitmsg":"commitlint -E GIT_PARAMS","preversion":"npm run build","open:src":"ts-node -P tsconfig.srv.json tools/srcServer.ts","ts:watch":"tsc --watch --incremental","dev":"npm-run-all --parallel open:src test:watch ts:watch","clean":"rm -rf ./dist && mkdir dist","prebuild":"npm run clean && npm run test","build":"tsc -P tsconfig.json && NODE_ENV=production node tools/build.js","test":"node_modules/karma/bin/karma start --single-run --no-auto-watch karma.conf.js","test:watch":"node_modules/karma/bin/karma start karma.conf.js","semantic-release":"semantic-release"},"dependencies":{"capitalize":"^0.5.0","click-off":"~0.2.1","element-class":"^0.1.1","es6-object-assign":"~1.1.0","escape-stack":"~0.1.2","inner-text-shim":"~1.0.1","key":"^0.1.11","time-now":"~0.2.1"},"devDependencies":{"@commitlint/cli":"~9.1.2","@commitlint/config-conventional":"~9.1.1","@types/browser-sync":"~2.26.1","@types/jasmine":"~2.6.0","@types/karma":"~1.7.0","@types/webpack-dev-middleware":"~3.7.1","@types/webpack-hot-middleware":"~2.25.3","autoprefixer":"~9.8.6","awesome-typescript-loader":"~5.2.1","browser-sync":"~2.26.12","condition-circle":"~2.0.2","copy-webpack-plugin":"~3.0.1","css-loader":"~4.2.1","ejs-compiled-loader":"~3.0.0","es6-promise":"~3.1.2","fibers":"~5.0.0","file-loader":"~0.9.0","html-webpack-plugin":"~4.3.0","husky":"~0.13.3","install":"~0.13.0","jasmine":"~3.6.1","jquery":"~3.5.1","karma":"~5.1.1","karma-chrome-launcher":"~3.1.0","karma-jasmine":"~0.3.6","karma-sourcemap-loader":"~0.3.7","karma-webpack":"~4.0.2","lodash":"~4.17.19","mini-css-extract-plugin":"~0.10.0","node-sass":"~4.12.0","npm":"~6.14.7","npm-run-all":"~4.0.2","polyfill-function-prototype-bind":"0.0.1","postcss-loader":"~0.11.0","sass-loader":"~9.0.3","semantic-release":"~17.1.1","source-map-loader":"~1.0.1","style-loader":"~1.2.1","transform-ts-paths":"^1.0.0","ts-loader":"~8.0.2","ts-node":"~8.10.2","tslint":"^5.4.2","tslint-eslint-rules":"^4.1.1","typescript":"~3.7.5","url-loader":"~4.1.0","webpack":"~4.44.1","webpack-bundle-analyzer":"~3.8.0","webpack-cli":"~3.3.12","webpack-dev-middleware":"~3.7.2","webpack-hot-middleware":"~2.25.0","webpack-md5-hash":"~0.0.5"},"repository":{"type":"git","url":"git+https://github.com/gridgrid/grid.git"},"keywords":["grid","spreadsheet","virtual","scroll"],"author":{"name":"Sterling Camden"},"license":"MIT","bugs":{"url":"https://github.com/gridgrid/grid/issues"},"homepage":"https://github.com/gridgrid/grid","release":{"verifyConditions":"condition-circle","branch":"next","fallbackTags":{"next":"latest"}},"readme":"[![npm](https://img.shields.io/npm/v/grid.svg)]( https://www.npmjs.com/package/grid) [![CircleCI](https://circleci.com/gh/gridgrid/grid.svg?style=shield)](https://circleci.com/gh/gridgrid/grid)  [![semantic-release](https://img.shields.io/badge/%20%20%F0%9F%93%A6%F0%9F%9A%80-semantic--release-e10079.svg)](https://github.com/semantic-release/semantic-release) [![Commitizen friendly](https://img.shields.io/badge/commitizen-friendly-brightgreen.svg)](http://commitizen.github.io/cz-cli/)\n\nGrid\n===\n\nA highly scalable grid component written in javscript [DEMO](https://gridgrid.github.io/grid/ \"Grid Demo\")\n\nNote: while Grid is fully functional it is still in beta. Use at your own risk and please file any issues on GitHub. \n\nAlso the grid is currently packaged for use with browserify. If you need a build for a non browserify (or webpack) environment please open an issue on github.\n\n\nInstallation\n===\n`npm install --save grid`\n\n\nExample / Quick-Start\n===\n\nTo run the sample app locally, run `npm start` and hit http://localhost:8082\n\n##### Create a Grid Instance\n`var core = require('grid')`\n`var grid = core();`\n\nThe grid handles most complexity for you. There are only three user supplied requirements to a get a grid up and running\n\n##### Row and Column Descriptors\nRow and column descriptors are objects that tell the grid how wide or high to make your cells. They also control things like whether or not a column is hidden and describe the overall dimensions of the grid.\n\n``` javascript\n\t// add some columns\n    var colDescriptors = [];\n    var colDescriptor;\n    for (var c = 0; c < 20; c++) {\n        // create a col descriptor\n        colDescriptor = grid.colModel.create();\n        colDescriptor.width = 78;\n        colDescriptor.hidden = !!(c % 2); // hide every other column for fun and profit\n    }\n    grid.colModel.add(colDescriptors);\n\n    // add some rows\n    var rowDescriptors = [];\n    var rowDescriptor;\n    for (var r = 0; r < 20; r++) {\n        // create a row descriptor\n        rowDescriptor = grid.rowModel.create();\n        rowDescriptor.height = 24;\n        if(r === 0){\n        \trowDescriptor.header = true;\n        }\n    }\n    grid.rowModel.add(rowDescriptors);\n```\n\n##### The DataModel\n\nThe grid determines what to render for a given cell by calling the supplied data model. This gives the client massive flexbility to generate and return the data however they need to.\n\nThe datamodel can be a simple object that the user sets on the grid instance `dataModel` field and needs to implement at a minimum\n\n`get`, `getHeader`, and `isDirty`, \n\nif you support user data entry and want paste to work you should also implement `set`\n\nHere's a basic read only implementation:\n\n``` javascript\n// use the grid's default dirty clean implementation almost always\n// (it will automatically be set clean on each draw by the grid)\nvar dataDirtyClean = grid.makeDirtyClean();\n\ngrid.dataModel = {\n\n    get: function(dataRowIndex, dataColIndex, isCopy) {\n        var rawValue = [dataRowIndex, dataColIndex];\n        return {\n            value: rawValue,\n            formatted: 'r' + rawValue[0] + ', c' + rawValue[1]\n        };\n    },\n    \n    getHeader: function(headerRowIndex, headerColIndex) {\n        var rawValue = [headerRowIndex, headerColIndex];\n        return {\n            value: rawValue,\n            formatted: 'hr' + rawValue[0] + ', hc' + rawValue[1]\n        };\n    },\n    \n    isDirty: dataDirtyClean.isDirty\n};\n```\n\n##### Call Build\nFinally we just need to tell the grid to set itself up in a container of our choosing:\n\n``` javascript\nvar container = document.createElement('div');\ncontainer.style.width = '800px';\ncontainer.style.height = '800px';\ndocument.body.appendChild(container);\ngrid.build(container);\n```\n\nConcepts\n===\n\nMany of the apis in the grid utilize two concepts when referencing coordinates: spaces and units. It's good to understand these before using the more advanced features.\n\n## Spaces\nCoordinates in the grid exist in one of three spaces.\n\n**virtual** - represents all of the data in your grid including the headers. for example, if you have a grid with one header row, then `(0, 20)` in the `'virtual'` space references the column 20 of the header. `(1, 20)` would reference column 20 of the first data row.\n\n**data** - very similar to virtual but does not include the headers. so `(0,20)` references the first row of data at the 20th column and technically `(-1, 20)` would represent the 20th column in the header although negative indexes are rarely used\n\n**view** - the view space represents the actual dom nodes that are rendered for the grid's virtualization. the grid's implementation renders enough cells to fill the entire viewport and no more (usually around 20-30 rows and 10 cols depending on sizes). in this space `(0,20)` would reference the dom cell at column 20 of the first row. even if you scroll the grid it will always point at that cell, so a view coordinate can be translated to different virtual coordinates depending on the scroll. you could think of view coordinates as a correlary for `position: fixed` in css\n\n## Units\nUnits in the grid are straightforward. They are either\n\n**px** - pixels, so `(0,0)` in the view space is the very top left pixel of the grid no matter the scroll, whereas `(0,0)` in the virtual space is the top left pixel only when the grid hasn't been scrolled, and would technically refer to a pixel out of view if the grid has been scrolled\n\nor\n\n**cell** - cells, so `(0,0)` in the view space represents the top left cell regardless of scroll, and `(0,0)` in the virtual space would represent an off screen cell if scrolled and top left if not scrolled\n\nUsing Custom HTML\n===\n\nThere are two ways to get non text (read html) into a grid:\n\n## Decorators\nDecorators are great for adding a piece of one-off ui that doesn't relate directly to the content of a cell or doesn't need to be in every row of a column or vice versa. For example, the grid internally uses decorators to render the focus and selection highlight as well as resize handles.\n\n**basic decorator**\n``` javascript\n\tvar top = 1,\n    left = 2,\n    height = 1,\n    width = 1,\n    unit = 'cell',\n    space = 'view';\n    var d = grid.decorators.create(top, left, height, width, unit, space);\n\n    // return some element\n    d.render = function() {\n        var a = document.createElement('a')\n        a.textContent = 'link Text!'\n        return a;\n    };\n    grid.decorators.add(d);\n```\n\nPuts a link over the cell at row 1 col 2 that doesn’t move with the scroll (why you would do this is questionable but it's just an example).\n\nYou can do more complicated things like render directives: (requires grid-angular-adapter)\n\n**angular directive decorator**\n``` javascript\nangular.module('myCoolGrid', [require('grid')])\n\n  .controller('MyGridCtrl', function($scope, GridSrvc, GridDecoratorSrvc) {\n      var grid = GridSrvc.core();\n\n      // do row col and datamodel setup...\n\n      var top = 20,\n          left = 10,\n          height = 2,\n          width = 2,\n          unit = 'cell',\n          space = 'virtual';\n      var d = grid.decorators.create(top, left, height, width, unit, space);\n\n      // return some element\n      d.render = function() {\n          var scope = $scope.$new();\n          scope.interestingData = 'INTERESTING DATA!!!';\n          return GridDecoratorSrvc.render({\n              $scope: scope,\n              template: '<my-directive data=\"interestingData\"></my-directive>',\n              events: true\n          });\n      };\n      grid.decorators.add(d);\n  });\n```\n\nThis will put your compiled directive in a box that spans from `row 20-22` and `col 10-12`, and moves appropriately with the scroll. The `events` flag lets the grid know that this decorator is interactable and should receive mouse events. (Otherwise pointer events are set to none.) The GridDecoratorSrvc takes care of destroying the scope and properly removing elements to avoid memory leaks with angular. You definitely should use it for any angular decorators.\n\n\n## Builders\nBuilders help you to get html into the actual cells of a given row or column instead of the text that would have been rendered.\n\n\n**basic builders**\n``` javascript\nvar builder = grid.colModel.createBuilder(function render() {\n    return angular.element('<a href=\"#\"></a>')[0];\n}, function update(elem, ctx) {\n    grid.viewLayer.setTextContent(elem, ctx.data.formatted);\n    return elem;\n});\nvar colDescriptor = grid.colModel.create(builder);\n```\n\nhave `<a>` tags in your cells for all the rows in that column\n\nNote: it's important for the update function of a builder to be extremely fast. Call `scope.$digest` not `scope.$apply`, and  use `grid.viewLayer.setTextContent` not `elem.innerHTML` where possible\n\n\nStyling\n===\nIf you want to update the look and feel of the grid, here are a few classes that you can override to give you the look you want.\n\n\n## Classes\n\n**`.grid-cell`:**\nThis class is responsible for the look of individual cells. \n\n**`.grid-focus-decorator`:** This decorator class is applied when you click('focus') on a cell\n\nEx. Adding the following style will give you a cell with a blue border around it when the cell is selected.\n``` css\n.grid-focus-decorator {\n  border: 2px solid blue;\n}\n```\n\n**`.grid-selection`:**\nWhen selecting rows and columns, this class sets the border and background so you know which rows you are exactly selecting\n\nEx.\n```css\n$grid-teal: #39CCCC !default;\n.grid-selection {\n  border: 1px solid $grid-teal;\n  background: transparentize($grid-teal, .8);\n}\n```\n\n**`.grid-row`:**\nThis class is responsible for the look of the row of cells.\n\nEx. To apply, a background color when hovering over each row, add the following:\n```css\n.grid-row {\n  &.hover {\n    background-color: lighten($grid-teal, 30) !important;\n  }\n}\n```\n\nTo apply styles only to the header row, use the following class:\n```css\n.grid-row {\n  &.grid-is-header {\n  }\n}\n\n```\n**`.col-resize`:** This class changes the look of the column resizing element. \n\n**`.grid-drag-line`**: This class is used when you are resizing a column. A vertical line is added to guide you of how much to resize your columns.\n\nEx. To show a blue vertical line when resizing a column, add the following\n```css\n.grid-drag-line {\n  background: #7FDBFF;\n}\n```\n\n","readmeFilename":"README.md","gitHead":"3849586c50a5aedce8c7dd0454a742f6a12bb930","_id":"grid@4.10.4","_nodeVersion":"12.18.3","_npmVersion":"6.14.7","dist":{"integrity":"sha512-wE3u06ZxK2UZ779upLXZ9phKbxCINFi4B2LLktReQ3mSUWNFwRxxq7mvuF8KB2Xja1XuFlB9IGN6PJsTiWsO6g==","shasum":"35d8c615698b44e8f957b20a7d6b24439e079faa","tarball":"https://registry.npmjs.org/grid/-/grid-4.10.4.tgz","fileCount":219,"unpackedSize":2014439,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJfPaAmCRA9TVsSAnZWagAANbQQAJHtuti7jizOo4mgzPno\nJwUQ0eqZMN/iQzJLrajfOBtow9b9ised5bhitw0LeUhhwIxe3QfdKMB3/gNn\nOO8Cdf+HOBLvTGRee/GN0WyYOHZeHreM270gL9kkpcy3/OrmLMsgTr2z4Zb/\nzDIQSvAKab8Xee6zxZyz3Z47YoowRRMde3blz8tkuAfbPOfim62RdnKoMXZR\nfn9VLPfxfZLHDZOh1t29HCHPGlaxheEiHO6l9kBCXMj2fRC33KFXyWx9GvkN\nCHryEH2igf6FKA1Rb8FEbpxrKgPj/NR42boUBrIC8B/CurH+iLrRpFUm9ET2\nGYHy3xBfFXCeh1+rYe8l9Auv/1uDOhrioFwI+7KkntSOc7jWqHWNsMu7u8Vi\n6D/G/jqxya/HuzBGSCmqQSaNiNQ2pg6COiqfybO2hcOSTa37sGULUBztgBLo\nV5/HFFr//NjOcXGPqq47gHjOp/u++49ADEbnT4t/VcbdbOimfe6gybEO0CI6\nvdoDPv8ECn8ag4Jif80vE1ormK/n8mvPhRNmxlWoZ3TvD6z6uujMZhtRdbGA\nLsUe7+7vF4/D8SFixRL3py6rZlHXe/wQkCehZLPwrDDfDYFNW8yMWgdJJW8a\n/isvIKU7ug3MgnBNOA/zKgQEBcmWjgQ/k1bYglWOCr+sS7N1K8LH3PrC3auI\nLOTK\r\n=iyCb\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCID4FVq2tV0YWwhB63OwevAjmRxrTUz/tqq0eC0B5DJcQAiEAxJxwO3pGOFBngKj/LSD8oCrF7pbLLpfYp4hE61zbG3U="}]},"maintainers":[{"email":"anthony.liatsis@gmail.com","name":"anthonyl"},{"email":"ben@benshope.com","name":"benshope"},{"email":"christy@relateiq.com","name":"cdennison"},{"email":"joechrz@gmail.com","name":"joechrz"},{"email":"joe.mun@salesforce.com","name":"joemun"},{"email":"john.fox@relateiq.com","name":"john.fox"},{"email":"jon@relateiq.com","name":"jontomas"},{"email":"keven425@gmail.com","name":"keven425"},{"email":"lerhaupt@gmail.com","name":"lerhaupt"},{"email":"rusty.camden@gmail.com","name":"riqlandia-ci"},{"email":"rusty.camden@gmail.com","name":"scamden"},{"email":"public@matthewmartin.com","name":"voxmatt"}],"_npmUser":{"name":"riqlandia-ci","email":"rusty.camden@gmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/grid_4.10.4_1597874213914_0.4085669251568458"},"_hasShrinkwrap":false},"4.10.5":{"name":"grid","version":"4.10.5","description":"A highly scalable grid component written in Typescript",".browser":"dist/grid.js","main":"dist/modules/core/index.js","typings":"dist/modules/core/index.d.ts","publishConfig":{"registry":"https://registry.npmjs.org/","tag":"next"},"engines":{"node":">=10"},"iqproj":{"app":true},"scripts":{"commitmsg":"commitlint -E GIT_PARAMS","preversion":"npm run build","open:src":"ts-node -P tsconfig.srv.json tools/srcServer.ts","ts:watch":"tsc --watch --incremental","dev":"npm-run-all --parallel open:src test:watch ts:watch","clean":"rm -rf ./dist && mkdir dist","prebuild":"npm run clean && npm run test","build":"tsc -P tsconfig.json && NODE_ENV=production node tools/build.js","test":"node_modules/karma/bin/karma start --single-run --no-auto-watch karma.conf.js","test:watch":"node_modules/karma/bin/karma start karma.conf.js","semantic-release":"semantic-release"},"dependencies":{"capitalize":"^0.5.0","click-off":"~0.2.1","element-class":"^0.1.1","es6-object-assign":"~1.1.0","escape-stack":"~0.1.2","inner-text-shim":"~1.0.1","key":"^0.1.11","time-now":"~0.2.1"},"devDependencies":{"@commitlint/cli":"~9.1.2","@commitlint/config-conventional":"~9.1.1","@types/browser-sync":"~2.26.1","@types/jasmine":"~2.6.0","@types/karma":"~1.7.0","@types/webpack-dev-middleware":"~3.7.1","@types/webpack-hot-middleware":"~2.25.3","autoprefixer":"~9.8.6","awesome-typescript-loader":"~5.2.1","browser-sync":"~2.26.12","condition-circle":"~2.0.2","copy-webpack-plugin":"~3.0.1","css-loader":"~4.2.1","ejs-compiled-loader":"~3.0.0","es6-promise":"~3.1.2","fibers":"~5.0.0","file-loader":"~0.9.0","html-webpack-plugin":"~4.3.0","husky":"~0.13.3","install":"~0.13.0","jasmine":"~3.6.1","jquery":"~3.5.1","karma":"~5.1.1","karma-chrome-launcher":"~3.1.0","karma-jasmine":"~0.3.6","karma-sourcemap-loader":"~0.3.7","karma-webpack":"~4.0.2","lodash":"~4.17.19","mini-css-extract-plugin":"~0.10.0","node-sass":"~4.12.0","npm":"~6.14.7","npm-run-all":"~4.0.2","polyfill-function-prototype-bind":"0.0.1","postcss-loader":"~0.11.0","sass-loader":"~9.0.3","semantic-release":"~17.1.1","source-map-loader":"~1.0.1","style-loader":"~1.2.1","transform-ts-paths":"^1.0.0","ts-loader":"~8.0.2","ts-node":"~8.10.2","tslint":"^5.4.2","tslint-eslint-rules":"^4.1.1","typescript":"~3.7.5","url-loader":"~4.1.0","webpack":"~4.44.1","webpack-bundle-analyzer":"~3.8.0","webpack-cli":"~3.3.12","webpack-dev-middleware":"~3.7.2","webpack-hot-middleware":"~2.25.0","webpack-md5-hash":"~0.0.5"},"repository":{"type":"git","url":"git+https://github.com/gridgrid/grid.git"},"keywords":["grid","spreadsheet","virtual","scroll"],"author":{"name":"Sterling Camden"},"license":"MIT","bugs":{"url":"https://github.com/gridgrid/grid/issues"},"homepage":"https://github.com/gridgrid/grid","release":{"verifyConditions":"condition-circle","branch":"next","fallbackTags":{"next":"latest"}},"readme":"[![npm](https://img.shields.io/npm/v/grid.svg)]( https://www.npmjs.com/package/grid) [![CircleCI](https://circleci.com/gh/gridgrid/grid.svg?style=shield)](https://circleci.com/gh/gridgrid/grid)  [![semantic-release](https://img.shields.io/badge/%20%20%F0%9F%93%A6%F0%9F%9A%80-semantic--release-e10079.svg)](https://github.com/semantic-release/semantic-release) [![Commitizen friendly](https://img.shields.io/badge/commitizen-friendly-brightgreen.svg)](http://commitizen.github.io/cz-cli/)\n\nGrid\n===\n\nA highly scalable grid component written in javscript [DEMO](https://gridgrid.github.io/grid/ \"Grid Demo\")\n\nNote: while Grid is fully functional it is still in beta. Use at your own risk and please file any issues on GitHub. \n\nAlso the grid is currently packaged for use with browserify. If you need a build for a non browserify (or webpack) environment please open an issue on github.\n\n\nInstallation\n===\n`npm install --save grid`\n\n\nExample / Quick-Start\n===\n\nTo run the sample app locally, run `npm start` and hit http://localhost:8082\n\n##### Create a Grid Instance\n`var core = require('grid')`\n`var grid = core();`\n\nThe grid handles most complexity for you. There are only three user supplied requirements to a get a grid up and running\n\n##### Row and Column Descriptors\nRow and column descriptors are objects that tell the grid how wide or high to make your cells. They also control things like whether or not a column is hidden and describe the overall dimensions of the grid.\n\n``` javascript\n\t// add some columns\n    var colDescriptors = [];\n    var colDescriptor;\n    for (var c = 0; c < 20; c++) {\n        // create a col descriptor\n        colDescriptor = grid.colModel.create();\n        colDescriptor.width = 78;\n        colDescriptor.hidden = !!(c % 2); // hide every other column for fun and profit\n    }\n    grid.colModel.add(colDescriptors);\n\n    // add some rows\n    var rowDescriptors = [];\n    var rowDescriptor;\n    for (var r = 0; r < 20; r++) {\n        // create a row descriptor\n        rowDescriptor = grid.rowModel.create();\n        rowDescriptor.height = 24;\n        if(r === 0){\n        \trowDescriptor.header = true;\n        }\n    }\n    grid.rowModel.add(rowDescriptors);\n```\n\n##### The DataModel\n\nThe grid determines what to render for a given cell by calling the supplied data model. This gives the client massive flexbility to generate and return the data however they need to.\n\nThe datamodel can be a simple object that the user sets on the grid instance `dataModel` field and needs to implement at a minimum\n\n`get`, `getHeader`, and `isDirty`, \n\nif you support user data entry and want paste to work you should also implement `set`\n\nHere's a basic read only implementation:\n\n``` javascript\n// use the grid's default dirty clean implementation almost always\n// (it will automatically be set clean on each draw by the grid)\nvar dataDirtyClean = grid.makeDirtyClean();\n\ngrid.dataModel = {\n\n    get: function(dataRowIndex, dataColIndex, isCopy) {\n        var rawValue = [dataRowIndex, dataColIndex];\n        return {\n            value: rawValue,\n            formatted: 'r' + rawValue[0] + ', c' + rawValue[1]\n        };\n    },\n    \n    getHeader: function(headerRowIndex, headerColIndex) {\n        var rawValue = [headerRowIndex, headerColIndex];\n        return {\n            value: rawValue,\n            formatted: 'hr' + rawValue[0] + ', hc' + rawValue[1]\n        };\n    },\n    \n    isDirty: dataDirtyClean.isDirty\n};\n```\n\n##### Call Build\nFinally we just need to tell the grid to set itself up in a container of our choosing:\n\n``` javascript\nvar container = document.createElement('div');\ncontainer.style.width = '800px';\ncontainer.style.height = '800px';\ndocument.body.appendChild(container);\ngrid.build(container);\n```\n\nConcepts\n===\n\nMany of the apis in the grid utilize two concepts when referencing coordinates: spaces and units. It's good to understand these before using the more advanced features.\n\n## Spaces\nCoordinates in the grid exist in one of three spaces.\n\n**virtual** - represents all of the data in your grid including the headers. for example, if you have a grid with one header row, then `(0, 20)` in the `'virtual'` space references the column 20 of the header. `(1, 20)` would reference column 20 of the first data row.\n\n**data** - very similar to virtual but does not include the headers. so `(0,20)` references the first row of data at the 20th column and technically `(-1, 20)` would represent the 20th column in the header although negative indexes are rarely used\n\n**view** - the view space represents the actual dom nodes that are rendered for the grid's virtualization. the grid's implementation renders enough cells to fill the entire viewport and no more (usually around 20-30 rows and 10 cols depending on sizes). in this space `(0,20)` would reference the dom cell at column 20 of the first row. even if you scroll the grid it will always point at that cell, so a view coordinate can be translated to different virtual coordinates depending on the scroll. you could think of view coordinates as a correlary for `position: fixed` in css\n\n## Units\nUnits in the grid are straightforward. They are either\n\n**px** - pixels, so `(0,0)` in the view space is the very top left pixel of the grid no matter the scroll, whereas `(0,0)` in the virtual space is the top left pixel only when the grid hasn't been scrolled, and would technically refer to a pixel out of view if the grid has been scrolled\n\nor\n\n**cell** - cells, so `(0,0)` in the view space represents the top left cell regardless of scroll, and `(0,0)` in the virtual space would represent an off screen cell if scrolled and top left if not scrolled\n\nUsing Custom HTML\n===\n\nThere are two ways to get non text (read html) into a grid:\n\n## Decorators\nDecorators are great for adding a piece of one-off ui that doesn't relate directly to the content of a cell or doesn't need to be in every row of a column or vice versa. For example, the grid internally uses decorators to render the focus and selection highlight as well as resize handles.\n\n**basic decorator**\n``` javascript\n\tvar top = 1,\n    left = 2,\n    height = 1,\n    width = 1,\n    unit = 'cell',\n    space = 'view';\n    var d = grid.decorators.create(top, left, height, width, unit, space);\n\n    // return some element\n    d.render = function() {\n        var a = document.createElement('a')\n        a.textContent = 'link Text!'\n        return a;\n    };\n    grid.decorators.add(d);\n```\n\nPuts a link over the cell at row 1 col 2 that doesn’t move with the scroll (why you would do this is questionable but it's just an example).\n\nYou can do more complicated things like render directives: (requires grid-angular-adapter)\n\n**angular directive decorator**\n``` javascript\nangular.module('myCoolGrid', [require('grid')])\n\n  .controller('MyGridCtrl', function($scope, GridSrvc, GridDecoratorSrvc) {\n      var grid = GridSrvc.core();\n\n      // do row col and datamodel setup...\n\n      var top = 20,\n          left = 10,\n          height = 2,\n          width = 2,\n          unit = 'cell',\n          space = 'virtual';\n      var d = grid.decorators.create(top, left, height, width, unit, space);\n\n      // return some element\n      d.render = function() {\n          var scope = $scope.$new();\n          scope.interestingData = 'INTERESTING DATA!!!';\n          return GridDecoratorSrvc.render({\n              $scope: scope,\n              template: '<my-directive data=\"interestingData\"></my-directive>',\n              events: true\n          });\n      };\n      grid.decorators.add(d);\n  });\n```\n\nThis will put your compiled directive in a box that spans from `row 20-22` and `col 10-12`, and moves appropriately with the scroll. The `events` flag lets the grid know that this decorator is interactable and should receive mouse events. (Otherwise pointer events are set to none.) The GridDecoratorSrvc takes care of destroying the scope and properly removing elements to avoid memory leaks with angular. You definitely should use it for any angular decorators.\n\n\n## Builders\nBuilders help you to get html into the actual cells of a given row or column instead of the text that would have been rendered.\n\n\n**basic builders**\n``` javascript\nvar builder = grid.colModel.createBuilder(function render() {\n    return angular.element('<a href=\"#\"></a>')[0];\n}, function update(elem, ctx) {\n    grid.viewLayer.setTextContent(elem, ctx.data.formatted);\n    return elem;\n});\nvar colDescriptor = grid.colModel.create(builder);\n```\n\nhave `<a>` tags in your cells for all the rows in that column\n\nNote: it's important for the update function of a builder to be extremely fast. Call `scope.$digest` not `scope.$apply`, and  use `grid.viewLayer.setTextContent` not `elem.innerHTML` where possible\n\n\nStyling\n===\nIf you want to update the look and feel of the grid, here are a few classes that you can override to give you the look you want.\n\n\n## Classes\n\n**`.grid-cell`:**\nThis class is responsible for the look of individual cells. \n\n**`.grid-focus-decorator`:** This decorator class is applied when you click('focus') on a cell\n\nEx. Adding the following style will give you a cell with a blue border around it when the cell is selected.\n``` css\n.grid-focus-decorator {\n  border: 2px solid blue;\n}\n```\n\n**`.grid-selection`:**\nWhen selecting rows and columns, this class sets the border and background so you know which rows you are exactly selecting\n\nEx.\n```css\n$grid-teal: #39CCCC !default;\n.grid-selection {\n  border: 1px solid $grid-teal;\n  background: transparentize($grid-teal, .8);\n}\n```\n\n**`.grid-row`:**\nThis class is responsible for the look of the row of cells.\n\nEx. To apply, a background color when hovering over each row, add the following:\n```css\n.grid-row {\n  &.hover {\n    background-color: lighten($grid-teal, 30) !important;\n  }\n}\n```\n\nTo apply styles only to the header row, use the following class:\n```css\n.grid-row {\n  &.grid-is-header {\n  }\n}\n\n```\n**`.col-resize`:** This class changes the look of the column resizing element. \n\n**`.grid-drag-line`**: This class is used when you are resizing a column. A vertical line is added to guide you of how much to resize your columns.\n\nEx. To show a blue vertical line when resizing a column, add the following\n```css\n.grid-drag-line {\n  background: #7FDBFF;\n}\n```\n\n","readmeFilename":"README.md","gitHead":"0dbe00e46481a0a3f40772542d9edb7aa6aec557","_id":"grid@4.10.5","_nodeVersion":"12.18.3","_npmVersion":"6.14.7","dist":{"integrity":"sha512-GI7wHmcSJsEE8O9Xii2XsdIK2j4nkhXdd/Bq5b84tGktbCfK1cfljTO+PYUVzgxayCoKPRf/9bi/NGt+E9ck2A==","shasum":"cffcf30f8bffefc0e174e7d0c933c240585c271b","tarball":"https://registry.npmjs.org/grid/-/grid-4.10.5.tgz","fileCount":219,"unpackedSize":2014093,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJfRTwrCRA9TVsSAnZWagAAn54P/jI6Z9qnkcIh0juJzw0v\n6YbETJO7jRFyj9LNlKygEWJFQQUg83GWLEME7MTj6dmdwS4AyYNoCWCk8r8R\nmJ1DPDYbevLMeJ3ft3IMZC6Z8R33STKVnff4N0wM7ZdXZucgu652h6LKLPTg\nJWGoNy5O4oHnbel19xNwvfe5Nh7GTQFDHDaSR1smUh2qEGjdvEe4Yh/vP+v5\n8myfbp10mVuK/8WOSUBgJo/RriG4uhaznRK+zTxb204teyP0Vl4t2nI85iEa\niRgfoZvM1Pd9hBndGDMWZUcDYLyc2YoBg1CMEkC+TQzC6LepvjV9IuHmb7BW\n73RQcmE9LrIBfjvFaPBYLpMq4KBypR/4q7ISyWE7QN+7Lllsdh17HlwZcL5+\n0QuswF9fwgSjiGgiTBV2YAw/yfw19fgHrJNPu0+uXp63eCSbPu03UW195TOB\nKKoIeB/q9gIXcLXZA4fdO3NvFg2AuEGyXuv87JL/c9rMaZjve7KcL47xUxKy\ngY97+xu/X007598c9/9iS4yf8jgcGyKAQZegtE0p4oZS2jkW5uBeKZfxFleS\nut+xaRa5P8jc42C1oezh4QpZNCuqV8NdyPAlUCTIpx9j6dWWK8UQ2jbo90Se\n4OBMag2W9MPu64mDz/sGhQh7+EHILjbD0cBCjE2FkZSo/218lF0866w5YLOx\n/Q6r\r\n=/2s7\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCLcN4h34X/20o1scGiOrSgu182qwQlbELWw51SebgcLgIge5WD2npkJr62GRE0jvy2btgfQ64lRUBwILKps8qUZmk="}]},"maintainers":[{"email":"anthony.liatsis@gmail.com","name":"anthonyl"},{"email":"ben@benshope.com","name":"benshope"},{"email":"christy@relateiq.com","name":"cdennison"},{"email":"joechrz@gmail.com","name":"joechrz"},{"email":"joe.mun@salesforce.com","name":"joemun"},{"email":"john.fox@relateiq.com","name":"john.fox"},{"email":"jon@relateiq.com","name":"jontomas"},{"email":"keven425@gmail.com","name":"keven425"},{"email":"lerhaupt@gmail.com","name":"lerhaupt"},{"email":"rusty.camden@gmail.com","name":"riqlandia-ci"},{"email":"rusty.camden@gmail.com","name":"scamden"},{"email":"public@matthewmartin.com","name":"voxmatt"}],"_npmUser":{"name":"riqlandia-ci","email":"rusty.camden@gmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/grid_4.10.5_1598372906706_0.167957854979498"},"_hasShrinkwrap":false},"4.10.6":{"name":"grid","version":"4.10.6","description":"A highly scalable grid component written in Typescript",".browser":"dist/grid.js","main":"dist/modules/core/index.js","typings":"dist/modules/core/index.d.ts","publishConfig":{"registry":"https://registry.npmjs.org/","tag":"next"},"engines":{"node":">=10"},"iqproj":{"app":true},"scripts":{"commitmsg":"commitlint -E GIT_PARAMS","preversion":"npm run build","open:src":"ts-node -P tsconfig.srv.json tools/srcServer.ts","ts:watch":"tsc --watch --incremental","dev":"npm-run-all --parallel open:src test:watch ts:watch","clean":"rm -rf ./dist && mkdir dist","prebuild":"npm run clean && npm run test","build":"tsc -P tsconfig.json && NODE_ENV=production node tools/build.js","test":"node_modules/karma/bin/karma start --single-run --no-auto-watch karma.conf.js","test:watch":"node_modules/karma/bin/karma start karma.conf.js","semantic-release":"semantic-release"},"dependencies":{"capitalize":"^0.5.0","click-off":"~0.2.1","element-class":"^0.1.1","es6-object-assign":"~1.1.0","escape-stack":"~0.1.2","inner-text-shim":"~1.0.1","key":"^0.1.11","time-now":"~0.2.1"},"devDependencies":{"@commitlint/cli":"~9.1.2","@commitlint/config-conventional":"~12.1.4","@types/browser-sync":"~2.26.1","@types/jasmine":"~2.6.0","@types/karma":"~1.7.0","@types/webpack-dev-middleware":"~3.7.1","@types/webpack-hot-middleware":"~2.25.3","autoprefixer":"~10.2.5","awesome-typescript-loader":"~5.2.1","browser-sync":"~2.26.12","condition-circle":"~2.0.2","copy-webpack-plugin":"~3.0.1","css-loader":"~5.2.4","ejs-compiled-loader":"~3.0.0","es6-promise":"~3.1.2","fibers":"~5.0.0","file-loader":"~0.9.0","html-webpack-plugin":"~4.3.0","husky":"~0.13.3","install":"~0.13.0","jasmine":"~3.6.1","jquery":"~3.5.1","karma":"~6.3.2","karma-chrome-launcher":"~3.1.0","karma-jasmine":"~0.3.6","karma-sourcemap-loader":"~0.3.7","karma-webpack":"~4.0.2","lodash":"~4.17.19","mini-css-extract-plugin":"~0.10.0","node-sass":"~4.14.1","npm-run-all":"~4.0.2","polyfill-function-prototype-bind":"0.0.1","postcss-loader":"~0.11.0","sass-loader":"~9.0.3","semantic-release":"~17.4.3","source-map-loader":"~1.0.1","style-loader":"~1.2.1","transform-ts-paths":"^1.0.0","ts-loader":"~8.0.2","ts-node":"~8.10.2","tslint":"^5.4.2","tslint-eslint-rules":"^4.1.1","typescript":"~3.7.5","url-loader":"~4.1.0","webpack":"^4.44.1","webpack-bundle-analyzer":"~3.8.0","webpack-cli":"~3.3.12","webpack-dev-middleware":"~3.7.2","webpack-hot-middleware":"~2.25.0","webpack-md5-hash":"~0.0.5"},"repository":{"type":"git","url":"git+https://github.com/gridgrid/grid.git"},"keywords":["grid","spreadsheet","virtual","scroll"],"author":{"name":"Sterling Camden"},"license":"MIT","bugs":{"url":"https://github.com/gridgrid/grid/issues"},"homepage":"https://github.com/gridgrid/grid","release":{"verifyConditions":"condition-circle","branch":"next","fallbackTags":{"next":"latest"}},"readme":"[![npm](https://img.shields.io/npm/v/grid.svg)]( https://www.npmjs.com/package/grid) [![CircleCI](https://circleci.com/gh/gridgrid/grid.svg?style=shield)](https://circleci.com/gh/gridgrid/grid)  [![semantic-release](https://img.shields.io/badge/%20%20%F0%9F%93%A6%F0%9F%9A%80-semantic--release-e10079.svg)](https://github.com/semantic-release/semantic-release) [![Commitizen friendly](https://img.shields.io/badge/commitizen-friendly-brightgreen.svg)](http://commitizen.github.io/cz-cli/)\n\nGrid\n===\n\nA highly scalable grid component written in javscript [DEMO](https://gridgrid.github.io/grid/ \"Grid Demo\")\n\nNote: while Grid is fully functional it is still in beta. Use at your own risk and please file any issues on GitHub. \n\nAlso the grid is currently packaged for use with browserify. If you need a build for a non browserify (or webpack) environment please open an issue on github.\n\n\nInstallation\n===\n`npm install --save grid`\n\n\nExample / Quick-Start\n===\n\nTo run the sample app locally, run `npm start` and hit http://localhost:8082\n\n##### Create a Grid Instance\n`var core = require('grid')`\n`var grid = core();`\n\nThe grid handles most complexity for you. There are only three user supplied requirements to a get a grid up and running\n\n##### Row and Column Descriptors\nRow and column descriptors are objects that tell the grid how wide or high to make your cells. They also control things like whether or not a column is hidden and describe the overall dimensions of the grid.\n\n``` javascript\n\t// add some columns\n    var colDescriptors = [];\n    var colDescriptor;\n    for (var c = 0; c < 20; c++) {\n        // create a col descriptor\n        colDescriptor = grid.colModel.create();\n        colDescriptor.width = 78;\n        colDescriptor.hidden = !!(c % 2); // hide every other column for fun and profit\n    }\n    grid.colModel.add(colDescriptors);\n\n    // add some rows\n    var rowDescriptors = [];\n    var rowDescriptor;\n    for (var r = 0; r < 20; r++) {\n        // create a row descriptor\n        rowDescriptor = grid.rowModel.create();\n        rowDescriptor.height = 24;\n        if(r === 0){\n        \trowDescriptor.header = true;\n        }\n    }\n    grid.rowModel.add(rowDescriptors);\n```\n\n##### The DataModel\n\nThe grid determines what to render for a given cell by calling the supplied data model. This gives the client massive flexbility to generate and return the data however they need to.\n\nThe datamodel can be a simple object that the user sets on the grid instance `dataModel` field and needs to implement at a minimum\n\n`get`, `getHeader`, and `isDirty`, \n\nif you support user data entry and want paste to work you should also implement `set`\n\nHere's a basic read only implementation:\n\n``` javascript\n// use the grid's default dirty clean implementation almost always\n// (it will automatically be set clean on each draw by the grid)\nvar dataDirtyClean = grid.makeDirtyClean();\n\ngrid.dataModel = {\n\n    get: function(dataRowIndex, dataColIndex, isCopy) {\n        var rawValue = [dataRowIndex, dataColIndex];\n        return {\n            value: rawValue,\n            formatted: 'r' + rawValue[0] + ', c' + rawValue[1]\n        };\n    },\n    \n    getHeader: function(headerRowIndex, headerColIndex) {\n        var rawValue = [headerRowIndex, headerColIndex];\n        return {\n            value: rawValue,\n            formatted: 'hr' + rawValue[0] + ', hc' + rawValue[1]\n        };\n    },\n    \n    isDirty: dataDirtyClean.isDirty\n};\n```\n\n##### Call Build\nFinally we just need to tell the grid to set itself up in a container of our choosing:\n\n``` javascript\nvar container = document.createElement('div');\ncontainer.style.width = '800px';\ncontainer.style.height = '800px';\ndocument.body.appendChild(container);\ngrid.build(container);\n```\n\nConcepts\n===\n\nMany of the apis in the grid utilize two concepts when referencing coordinates: spaces and units. It's good to understand these before using the more advanced features.\n\n## Spaces\nCoordinates in the grid exist in one of three spaces.\n\n**virtual** - represents all of the data in your grid including the headers. for example, if you have a grid with one header row, then `(0, 20)` in the `'virtual'` space references the column 20 of the header. `(1, 20)` would reference column 20 of the first data row.\n\n**data** - very similar to virtual but does not include the headers. so `(0,20)` references the first row of data at the 20th column and technically `(-1, 20)` would represent the 20th column in the header although negative indexes are rarely used\n\n**view** - the view space represents the actual dom nodes that are rendered for the grid's virtualization. the grid's implementation renders enough cells to fill the entire viewport and no more (usually around 20-30 rows and 10 cols depending on sizes). in this space `(0,20)` would reference the dom cell at column 20 of the first row. even if you scroll the grid it will always point at that cell, so a view coordinate can be translated to different virtual coordinates depending on the scroll. you could think of view coordinates as a correlary for `position: fixed` in css\n\n## Units\nUnits in the grid are straightforward. They are either\n\n**px** - pixels, so `(0,0)` in the view space is the very top left pixel of the grid no matter the scroll, whereas `(0,0)` in the virtual space is the top left pixel only when the grid hasn't been scrolled, and would technically refer to a pixel out of view if the grid has been scrolled\n\nor\n\n**cell** - cells, so `(0,0)` in the view space represents the top left cell regardless of scroll, and `(0,0)` in the virtual space would represent an off screen cell if scrolled and top left if not scrolled\n\nUsing Custom HTML\n===\n\nThere are two ways to get non text (read html) into a grid:\n\n## Decorators\nDecorators are great for adding a piece of one-off ui that doesn't relate directly to the content of a cell or doesn't need to be in every row of a column or vice versa. For example, the grid internally uses decorators to render the focus and selection highlight as well as resize handles.\n\n**basic decorator**\n``` javascript\n\tvar top = 1,\n    left = 2,\n    height = 1,\n    width = 1,\n    unit = 'cell',\n    space = 'view';\n    var d = grid.decorators.create(top, left, height, width, unit, space);\n\n    // return some element\n    d.render = function() {\n        var a = document.createElement('a')\n        a.textContent = 'link Text!'\n        return a;\n    };\n    grid.decorators.add(d);\n```\n\nPuts a link over the cell at row 1 col 2 that doesn’t move with the scroll (why you would do this is questionable but it's just an example).\n\nYou can do more complicated things like render directives: (requires grid-angular-adapter)\n\n**angular directive decorator**\n``` javascript\nangular.module('myCoolGrid', [require('grid')])\n\n  .controller('MyGridCtrl', function($scope, GridSrvc, GridDecoratorSrvc) {\n      var grid = GridSrvc.core();\n\n      // do row col and datamodel setup...\n\n      var top = 20,\n          left = 10,\n          height = 2,\n          width = 2,\n          unit = 'cell',\n          space = 'virtual';\n      var d = grid.decorators.create(top, left, height, width, unit, space);\n\n      // return some element\n      d.render = function() {\n          var scope = $scope.$new();\n          scope.interestingData = 'INTERESTING DATA!!!';\n          return GridDecoratorSrvc.render({\n              $scope: scope,\n              template: '<my-directive data=\"interestingData\"></my-directive>',\n              events: true\n          });\n      };\n      grid.decorators.add(d);\n  });\n```\n\nThis will put your compiled directive in a box that spans from `row 20-22` and `col 10-12`, and moves appropriately with the scroll. The `events` flag lets the grid know that this decorator is interactable and should receive mouse events. (Otherwise pointer events are set to none.) The GridDecoratorSrvc takes care of destroying the scope and properly removing elements to avoid memory leaks with angular. You definitely should use it for any angular decorators.\n\n\n## Builders\nBuilders help you to get html into the actual cells of a given row or column instead of the text that would have been rendered.\n\n\n**basic builders**\n``` javascript\nvar builder = grid.colModel.createBuilder(function render() {\n    return angular.element('<a href=\"#\"></a>')[0];\n}, function update(elem, ctx) {\n    grid.viewLayer.setTextContent(elem, ctx.data.formatted);\n    return elem;\n});\nvar colDescriptor = grid.colModel.create(builder);\n```\n\nhave `<a>` tags in your cells for all the rows in that column\n\nNote: it's important for the update function of a builder to be extremely fast. Call `scope.$digest` not `scope.$apply`, and  use `grid.viewLayer.setTextContent` not `elem.innerHTML` where possible\n\n\nStyling\n===\nIf you want to update the look and feel of the grid, here are a few classes that you can override to give you the look you want.\n\n\n## Classes\n\n**`.grid-cell`:**\nThis class is responsible for the look of individual cells. \n\n**`.grid-focus-decorator`:** This decorator class is applied when you click('focus') on a cell\n\nEx. Adding the following style will give you a cell with a blue border around it when the cell is selected.\n``` css\n.grid-focus-decorator {\n  border: 2px solid blue;\n}\n```\n\n**`.grid-selection`:**\nWhen selecting rows and columns, this class sets the border and background so you know which rows you are exactly selecting\n\nEx.\n```css\n$grid-teal: #39CCCC !default;\n.grid-selection {\n  border: 1px solid $grid-teal;\n  background: transparentize($grid-teal, .8);\n}\n```\n\n**`.grid-row`:**\nThis class is responsible for the look of the row of cells.\n\nEx. To apply, a background color when hovering over each row, add the following:\n```css\n.grid-row {\n  &.hover {\n    background-color: lighten($grid-teal, 30) !important;\n  }\n}\n```\n\nTo apply styles only to the header row, use the following class:\n```css\n.grid-row {\n  &.grid-is-header {\n  }\n}\n\n```\n**`.col-resize`:** This class changes the look of the column resizing element. \n\n**`.grid-drag-line`**: This class is used when you are resizing a column. A vertical line is added to guide you of how much to resize your columns.\n\nEx. To show a blue vertical line when resizing a column, add the following\n```css\n.grid-drag-line {\n  background: #7FDBFF;\n}\n```\n\n","readmeFilename":"README.md","gitHead":"b12aedeedf766fff50907ff9fad0b90e130a417f","_id":"grid@4.10.6","_nodeVersion":"12.18.3","_npmVersion":"7.13.0","dist":{"integrity":"sha512-1FUCAIS7c68DI8cBsG7DexKZuOWF2Fgyr4raL7MiUEEbujAfIYo3M2nDKxnSXvBa34xLfXX1oLwHcQ/bnlxq3g==","shasum":"247b32d1014698b9381f716af1a194068df5bb2f","tarball":"https://registry.npmjs.org/grid/-/grid-4.10.6.tgz","fileCount":219,"unpackedSize":2014073,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJgpAdbCRA9TVsSAnZWagAAqk8P/2d21wPTfOcGfvxohxJ+\nTEuB+bfuHglNRHgQe/py/kY6INaBV6DgJklGi1kRFoi9QXG9kheblQtXIYfb\nG0m0aGC5DrD/0H6lnPjXa1rayx4DVol7g9fmDNCyLWaFBYwUhiRiD28XWhSz\n36i9vADmJVk17qZqY5WmWSvqc5UGuA2c3f59H5AmjdJZ/wQv+hNk/I4QHf8r\ntgVGNnxPNWT1v14xPKXP0e1RvyaJINwGbKVZvU4k0xAOSvQ8vVWFJ7p3lfNw\nzfUmEP/kcUIrVnWkkSYV4ZPGhE/C7MnQRvdEn1cgj7FOl8iUq92HPIyIf923\n9mLHj8FajS4+9bvemOCTqe9TLp6CM0/0c1gHr8LmZbuuzYjnFUBPeYoelg0E\nGT5J+bLJ3XWF645Taf7B1gh/AP86vR+w4W1wxAW7nt9LmpurGm3e50JMUoVi\n8M3BPjWl2lsh6EX7stMMG9YkkEynC2Qi5FJoCbCIXkVYh6cqjt1qfd0yrSS9\nbBkD4aWQwKLVuz2W/2bUXaFGZUTP0a+NHxfukowr+1dVgNMOok2HEfqTVrEs\nLS1NszwhQuY1HN1rVSoU0dPbgszrkQHpqsLoY75YCla5GXDzJQQaZsZfwBSf\njapdtou+bGK1noE3AhOh09cLscKGyYEAanuaYmoFwl10t+Nrp8FhCxxKUhg6\nP1rz\r\n=mIPe\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDPC8Ydk1aqvItkeE6UeXwBPg4SPL6GssW7ZMlCearsGwIgVKDtT0G9Z2aM1lT/4l3p7JCxz1+uKhpsl+A7NML6xVM="}]},"_npmUser":{"name":"scamden","email":"rusty.camden@gmail.com"},"directories":{},"maintainers":[{"name":"scamden","email":"rusty.camden@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/grid_4.10.6_1621362523357_0.8893123633755944"},"_hasShrinkwrap":false},"4.10.7":{"name":"grid","version":"4.10.7","description":"A highly scalable grid component written in Typescript",".browser":"dist/grid.js","main":"dist/modules/core/index.js","typings":"dist/modules/core/index.d.ts","publishConfig":{"registry":"https://registry.npmjs.org/","tag":"next"},"engines":{"node":">=10"},"iqproj":{"app":true},"scripts":{"commitmsg":"commitlint -E GIT_PARAMS","preversion":"npm run build","open:src":"ts-node -P tsconfig.srv.json tools/srcServer.ts","ts:watch":"tsc --watch --incremental","dev":"npm-run-all --parallel open:src test:watch ts:watch","clean":"rm -rf ./dist && mkdir dist","prebuild":"npm run clean && npm run test","build":"tsc -P tsconfig.json && NODE_ENV=production node tools/build.js","test":"node_modules/karma/bin/karma start --single-run --no-auto-watch karma.conf.js","test:watch":"node_modules/karma/bin/karma start karma.conf.js","semantic-release":"semantic-release"},"dependencies":{"capitalize":"^0.5.0","click-off":"~0.2.1","element-class":"^0.1.1","es6-object-assign":"~1.1.0","escape-stack":"~0.1.2","inner-text-shim":"~1.0.1","key":"^0.1.11","time-now":"~0.2.1"},"devDependencies":{"@commitlint/cli":"~9.1.2","@commitlint/config-conventional":"~12.1.4","@types/anymatch":"~3.0.0","@types/browser-sync":"~2.26.1","@types/jasmine":"~2.6.0","@types/karma":"~1.7.0","@types/webpack-dev-middleware":"~3.7.1","@types/webpack-hot-middleware":"~2.25.3","autoprefixer":"~10.2.5","browser-sync":"~2.26.12","condition-circle":"~2.0.2","copy-webpack-plugin":"~3.0.1","css-loader":"~5.2.4","ejs-compiled-loader":"~3.0.0","es6-promise":"~3.1.2","fibers":"~5.0.0","file-loader":"~0.9.0","html-webpack-plugin":"~4.3.0","husky":"~0.13.3","install":"~0.13.0","jasmine":"~3.6.1","jquery":"~3.5.1","karma":"~6.3.2","karma-chrome-launcher":"~3.1.0","karma-jasmine":"~0.3.6","karma-sourcemap-loader":"~0.3.7","karma-webpack":"~4.0.2","lodash":"~4.17.19","mini-css-extract-plugin":"~0.10.0","node-sass":"~4.14.1","npm-run-all":"~4.0.2","polyfill-function-prototype-bind":"0.0.1","postcss-loader":"~0.11.0","sass-loader":"~9.0.3","semantic-release":"~15.14.0","source-map-loader":"~1.0.1","style-loader":"~1.2.1","transform-ts-paths":"^1.0.0","ts-loader":"~8.0.2","ts-node":"~8.10.2","tslint":"^5.4.2","tslint-eslint-rules":"^4.1.1","typescript":"~4.2.4","url-loader":"~4.1.0","webpack":"^4.44.1","webpack-bundle-analyzer":"~3.8.0","webpack-cli":"~3.3.12","webpack-dev-middleware":"~3.7.2","webpack-hot-middleware":"~2.25.0","webpack-md5-hash":"~0.0.5"},"repository":{"type":"git","url":"git+https://github.com/gridgrid/grid.git"},"keywords":["grid","spreadsheet","virtual","scroll"],"author":{"name":"Sterling Camden"},"license":"MIT","bugs":{"url":"https://github.com/gridgrid/grid/issues"},"homepage":"https://github.com/gridgrid/grid","release":{"verifyConditions":"condition-circle"},"readme":"[![npm](https://img.shields.io/npm/v/grid.svg)]( https://www.npmjs.com/package/grid) [![CircleCI](https://circleci.com/gh/gridgrid/grid.svg?style=shield)](https://circleci.com/gh/gridgrid/grid)  [![semantic-release](https://img.shields.io/badge/%20%20%F0%9F%93%A6%F0%9F%9A%80-semantic--release-e10079.svg)](https://github.com/semantic-release/semantic-release) [![Commitizen friendly](https://img.shields.io/badge/commitizen-friendly-brightgreen.svg)](http://commitizen.github.io/cz-cli/)\n\nGrid\n===\n\nA highly scalable grid component written in javscript [DEMO](https://gridgrid.github.io/grid/ \"Grid Demo\")\n\nNote: while Grid is fully functional it is still in beta. Use at your own risk and please file any issues on GitHub. \n\nAlso the grid is currently packaged for use with browserify. If you need a build for a non browserify (or webpack) environment please open an issue on github.\n\n\nInstallation\n===\n`npm install --save grid`\n\n\nExample / Quick-Start\n===\n\nTo run the sample app locally, run `npm start` and hit http://localhost:8082\n\n##### Create a Grid Instance\n`var core = require('grid')`\n`var grid = core();`\n\nThe grid handles most complexity for you. There are only three user supplied requirements to a get a grid up and running\n\n##### Row and Column Descriptors\nRow and column descriptors are objects that tell the grid how wide or high to make your cells. They also control things like whether or not a column is hidden and describe the overall dimensions of the grid.\n\n``` javascript\n\t// add some columns\n    var colDescriptors = [];\n    var colDescriptor;\n    for (var c = 0; c < 20; c++) {\n        // create a col descriptor\n        colDescriptor = grid.colModel.create();\n        colDescriptor.width = 78;\n        colDescriptor.hidden = !!(c % 2); // hide every other column for fun and profit\n    }\n    grid.colModel.add(colDescriptors);\n\n    // add some rows\n    var rowDescriptors = [];\n    var rowDescriptor;\n    for (var r = 0; r < 20; r++) {\n        // create a row descriptor\n        rowDescriptor = grid.rowModel.create();\n        rowDescriptor.height = 24;\n        if(r === 0){\n        \trowDescriptor.header = true;\n        }\n    }\n    grid.rowModel.add(rowDescriptors);\n```\n\n##### The DataModel\n\nThe grid determines what to render for a given cell by calling the supplied data model. This gives the client massive flexbility to generate and return the data however they need to.\n\nThe datamodel can be a simple object that the user sets on the grid instance `dataModel` field and needs to implement at a minimum\n\n`get`, `getHeader`, and `isDirty`, \n\nif you support user data entry and want paste to work you should also implement `set`\n\nHere's a basic read only implementation:\n\n``` javascript\n// use the grid's default dirty clean implementation almost always\n// (it will automatically be set clean on each draw by the grid)\nvar dataDirtyClean = grid.makeDirtyClean();\n\ngrid.dataModel = {\n\n    get: function(dataRowIndex, dataColIndex, isCopy) {\n        var rawValue = [dataRowIndex, dataColIndex];\n        return {\n            value: rawValue,\n            formatted: 'r' + rawValue[0] + ', c' + rawValue[1]\n        };\n    },\n    \n    getHeader: function(headerRowIndex, headerColIndex) {\n        var rawValue = [headerRowIndex, headerColIndex];\n        return {\n            value: rawValue,\n            formatted: 'hr' + rawValue[0] + ', hc' + rawValue[1]\n        };\n    },\n    \n    isDirty: dataDirtyClean.isDirty\n};\n```\n\n##### Call Build\nFinally we just need to tell the grid to set itself up in a container of our choosing:\n\n``` javascript\nvar container = document.createElement('div');\ncontainer.style.width = '800px';\ncontainer.style.height = '800px';\ndocument.body.appendChild(container);\ngrid.build(container);\n```\n\nConcepts\n===\n\nMany of the apis in the grid utilize two concepts when referencing coordinates: spaces and units. It's good to understand these before using the more advanced features.\n\n## Spaces\nCoordinates in the grid exist in one of three spaces.\n\n**virtual** - represents all of the data in your grid including the headers. for example, if you have a grid with one header row, then `(0, 20)` in the `'virtual'` space references the column 20 of the header. `(1, 20)` would reference column 20 of the first data row.\n\n**data** - very similar to virtual but does not include the headers. so `(0,20)` references the first row of data at the 20th column and technically `(-1, 20)` would represent the 20th column in the header although negative indexes are rarely used\n\n**view** - the view space represents the actual dom nodes that are rendered for the grid's virtualization. the grid's implementation renders enough cells to fill the entire viewport and no more (usually around 20-30 rows and 10 cols depending on sizes). in this space `(0,20)` would reference the dom cell at column 20 of the first row. even if you scroll the grid it will always point at that cell, so a view coordinate can be translated to different virtual coordinates depending on the scroll. you could think of view coordinates as a correlary for `position: fixed` in css\n\n## Units\nUnits in the grid are straightforward. They are either\n\n**px** - pixels, so `(0,0)` in the view space is the very top left pixel of the grid no matter the scroll, whereas `(0,0)` in the virtual space is the top left pixel only when the grid hasn't been scrolled, and would technically refer to a pixel out of view if the grid has been scrolled\n\nor\n\n**cell** - cells, so `(0,0)` in the view space represents the top left cell regardless of scroll, and `(0,0)` in the virtual space would represent an off screen cell if scrolled and top left if not scrolled\n\nUsing Custom HTML\n===\n\nThere are two ways to get non text (read html) into a grid:\n\n## Decorators\nDecorators are great for adding a piece of one-off ui that doesn't relate directly to the content of a cell or doesn't need to be in every row of a column or vice versa. For example, the grid internally uses decorators to render the focus and selection highlight as well as resize handles.\n\n**basic decorator**\n``` javascript\n\tvar top = 1,\n    left = 2,\n    height = 1,\n    width = 1,\n    unit = 'cell',\n    space = 'view';\n    var d = grid.decorators.create(top, left, height, width, unit, space);\n\n    // return some element\n    d.render = function() {\n        var a = document.createElement('a')\n        a.textContent = 'link Text!'\n        return a;\n    };\n    grid.decorators.add(d);\n```\n\nPuts a link over the cell at row 1 col 2 that doesn’t move with the scroll (why you would do this is questionable but it's just an example).\n\nYou can do more complicated things like render directives: (requires grid-angular-adapter)\n\n**angular directive decorator**\n``` javascript\nangular.module('myCoolGrid', [require('grid')])\n\n  .controller('MyGridCtrl', function($scope, GridSrvc, GridDecoratorSrvc) {\n      var grid = GridSrvc.core();\n\n      // do row col and datamodel setup...\n\n      var top = 20,\n          left = 10,\n          height = 2,\n          width = 2,\n          unit = 'cell',\n          space = 'virtual';\n      var d = grid.decorators.create(top, left, height, width, unit, space);\n\n      // return some element\n      d.render = function() {\n          var scope = $scope.$new();\n          scope.interestingData = 'INTERESTING DATA!!!';\n          return GridDecoratorSrvc.render({\n              $scope: scope,\n              template: '<my-directive data=\"interestingData\"></my-directive>',\n              events: true\n          });\n      };\n      grid.decorators.add(d);\n  });\n```\n\nThis will put your compiled directive in a box that spans from `row 20-22` and `col 10-12`, and moves appropriately with the scroll. The `events` flag lets the grid know that this decorator is interactable and should receive mouse events. (Otherwise pointer events are set to none.) The GridDecoratorSrvc takes care of destroying the scope and properly removing elements to avoid memory leaks with angular. You definitely should use it for any angular decorators.\n\n\n## Builders\nBuilders help you to get html into the actual cells of a given row or column instead of the text that would have been rendered.\n\n\n**basic builders**\n``` javascript\nvar builder = grid.colModel.createBuilder(function render() {\n    return angular.element('<a href=\"#\"></a>')[0];\n}, function update(elem, ctx) {\n    grid.viewLayer.setTextContent(elem, ctx.data.formatted);\n    return elem;\n});\nvar colDescriptor = grid.colModel.create(builder);\n```\n\nhave `<a>` tags in your cells for all the rows in that column\n\nNote: it's important for the update function of a builder to be extremely fast. Call `scope.$digest` not `scope.$apply`, and  use `grid.viewLayer.setTextContent` not `elem.innerHTML` where possible\n\n\nStyling\n===\nIf you want to update the look and feel of the grid, here are a few classes that you can override to give you the look you want.\n\n\n## Classes\n\n**`.grid-cell`:**\nThis class is responsible for the look of individual cells. \n\n**`.grid-focus-decorator`:** This decorator class is applied when you click('focus') on a cell\n\nEx. Adding the following style will give you a cell with a blue border around it when the cell is selected.\n``` css\n.grid-focus-decorator {\n  border: 2px solid blue;\n}\n```\n\n**`.grid-selection`:**\nWhen selecting rows and columns, this class sets the border and background so you know which rows you are exactly selecting\n\nEx.\n```css\n$grid-teal: #39CCCC !default;\n.grid-selection {\n  border: 1px solid $grid-teal;\n  background: transparentize($grid-teal, .8);\n}\n```\n\n**`.grid-row`:**\nThis class is responsible for the look of the row of cells.\n\nEx. To apply, a background color when hovering over each row, add the following:\n```css\n.grid-row {\n  &.hover {\n    background-color: lighten($grid-teal, 30) !important;\n  }\n}\n```\n\nTo apply styles only to the header row, use the following class:\n```css\n.grid-row {\n  &.grid-is-header {\n  }\n}\n\n```\n**`.col-resize`:** This class changes the look of the column resizing element. \n\n**`.grid-drag-line`**: This class is used when you are resizing a column. A vertical line is added to guide you of how much to resize your columns.\n\nEx. To show a blue vertical line when resizing a column, add the following\n```css\n.grid-drag-line {\n  background: #7FDBFF;\n}\n```\n\n","readmeFilename":"README.md","gitHead":"ff500c6d423552c02de8cbdb9279a1a04210aed9","_id":"grid@4.10.7","_nodeVersion":"12.18.3","_npmVersion":"6.14.13","dist":{"integrity":"sha512-/NYLtEnUP6r4qwKzcI1gztqgqHbpXN5hQSaWQfo538J7pjPqqvcan6OF9sobAZczV4SU+ocrElCzrLd2yCc5pQ==","shasum":"ebc37e6d19c8e369776cfd1fac2c975a1e15d292","tarball":"https://registry.npmjs.org/grid/-/grid-4.10.7.tgz","fileCount":219,"unpackedSize":2022519,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJgpKKeCRA9TVsSAnZWagAA/XQP/jDA6fPpdSDJlWxBPyUg\nVRgWzcEx0smDvm174QM8fEiZGlhhya1mlIIKPoDzHr82EpTW1tbLbZ+8r9CF\nCMq0P7lzVCDaYmfLPmN222S1rfvAm3bRd+xtJIFHLqqfpZSMbXdMJY8aCYk9\n76kFDsHeCWR7rloKiikvwqv8f65wOcLTzKGIVm7pCJXecc+a8x/IPDhpahah\nzqXf9A60wtLFPdnbFC3I7G4vM7Nqon2fRmc9z0VxzgVsTpihnpXMxJoO3PEX\nQ8uo0vm/Qtuougi4acpt4fKIr7UMElfo0JiKhufPHDwsBTLQgzAruQgQOXfY\n4M+u+kvwrbWOtbHKntJPybV6GODNxq6ai11jppmy39PkdzivJAKYExQqqPoo\nxCbkgpSl0wvV7I53AK2PYaZH/QEmbJ/Y8y3soVGSl/O1aBcpSE7/1RLdCJ5c\nOq8IWiFI/xflPlmDJryG6er3bSOXKVn0o5l6sby4/3husKjVZnrT2GxmgJ3p\nbf8YjIci/dtXMCIz6u4F2qnsshnprtPREqMZzxVpJNndujSzP+USt8ULZjcZ\n8pUgS///qaUm1kIJ3IlCDzbnZa3ISKtF2c3I0P7s/4P5w6OTrCKXJsjDANcd\nVnN2sX6OcOTJnf8cxk8m86ZhquxqyYV9Fqycxvz0bD1rmitEbC8SUs7/9ZdX\nDryw\r\n=b6dP\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDxAaGh51OTEM3FK4UabfioRBXNIwsJN2JEuK9VGLjmfQIgHCr22PtNSUwFyneDD7cwhs6MYrSkhm0jb3Rmg8rZZKQ="}]},"_npmUser":{"name":"scamden","email":"rusty.camden@gmail.com"},"directories":{},"maintainers":[{"name":"scamden","email":"rusty.camden@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/grid_4.10.7_1621402269926_0.2215678982349465"},"_hasShrinkwrap":false},"4.10.8":{"name":"grid","version":"4.10.8","description":"A highly scalable grid component written in Typescript",".browser":"dist/grid.js","main":"dist/modules/core/index.js","typings":"dist/modules/core/index.d.ts","publishConfig":{"registry":"https://registry.npmjs.org/","tag":"next"},"engines":{"node":">=10"},"iqproj":{"app":true},"scripts":{"commitmsg":"commitlint -E GIT_PARAMS","preversion":"npm run build","open:src":"ts-node -P tsconfig.srv.json tools/srcServer.ts","ts:watch":"tsc --watch --incremental","dev":"npm-run-all --parallel open:src test:watch ts:watch","clean":"rm -rf ./dist && mkdir dist","prebuild":"npm run clean && npm run test","build":"tsc -P tsconfig.json && NODE_ENV=production node tools/build.js","test":"node_modules/karma/bin/karma start --single-run --no-auto-watch karma.conf.js","test:watch":"node_modules/karma/bin/karma start karma.conf.js","semantic-release":"semantic-release"},"dependencies":{"capitalize":"^0.5.0","click-off":"~0.2.1","element-class":"^0.1.1","es6-object-assign":"~1.1.0","escape-stack":"~0.1.2","inner-text-shim":"~1.0.1","key":"^0.1.11","time-now":"~0.2.1"},"devDependencies":{"@commitlint/cli":"~9.1.2","@commitlint/config-conventional":"~12.1.4","@types/anymatch":"~3.0.0","@types/browser-sync":"~2.26.1","@types/jasmine":"~2.6.0","@types/karma":"~1.7.0","@types/webpack-dev-middleware":"~3.7.1","@types/webpack-hot-middleware":"~2.25.3","autoprefixer":"~10.2.5","browser-sync":"~2.26.12","condition-circle":"~2.0.2","copy-webpack-plugin":"~3.0.1","css-loader":"~5.2.4","ejs-compiled-loader":"~3.0.0","es6-promise":"~3.1.2","fibers":"~5.0.0","file-loader":"~0.9.0","html-webpack-plugin":"~4.3.0","husky":"~0.13.3","install":"~0.13.0","jasmine":"~3.6.1","jquery":"~3.5.1","karma":"~6.3.2","karma-chrome-launcher":"~3.1.0","karma-jasmine":"~0.3.6","karma-sourcemap-loader":"~0.3.7","karma-webpack":"~4.0.2","lodash":"~4.17.21","mini-css-extract-plugin":"~0.10.0","node-sass":"~4.14.1","npm-run-all":"~4.0.2","polyfill-function-prototype-bind":"0.0.1","postcss-loader":"~0.11.0","sass-loader":"~9.0.3","semantic-release":"~15.14.0","source-map-loader":"~1.0.1","style-loader":"~1.2.1","transform-ts-paths":"^1.0.0","ts-loader":"~8.0.2","ts-node":"~8.10.2","tslint":"^5.4.2","tslint-eslint-rules":"^4.1.1","typescript":"~4.2.4","url-loader":"~4.1.0","webpack":"^4.44.1","webpack-bundle-analyzer":"~3.8.0","webpack-cli":"~3.3.12","webpack-dev-middleware":"~3.7.2","webpack-hot-middleware":"~2.25.0","webpack-md5-hash":"~0.0.5"},"repository":{"type":"git","url":"git+https://github.com/gridgrid/grid.git"},"keywords":["grid","spreadsheet","virtual","scroll"],"author":{"name":"Sterling Camden"},"license":"MIT","bugs":{"url":"https://github.com/gridgrid/grid/issues"},"homepage":"https://github.com/gridgrid/grid","release":{"verifyConditions":"condition-circle"},"gitHead":"115f707ebdb59afa4024153be1ae89aae0dc17da","_id":"grid@4.10.8","_nodeVersion":"12.18.3","_npmVersion":"6.14.13","dist":{"integrity":"sha512-OKq4zhEj0ojpV+DyskQLpaGr8mSa1ZgA753NPTlJ67xeagqUA0tUjhDg3s0kEF0dEOigxVQ/cWjBMNfzcExtyg==","shasum":"c6dc787cef0ace3b59e62162384178281a06ccd7","tarball":"https://registry.npmjs.org/grid/-/grid-4.10.8.tgz","fileCount":219,"unpackedSize":2022519,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJgpKvhCRA9TVsSAnZWagAAYDcQAJzRmsHKTWojbjXad802\nTDjO9oU2l/y/avVuTq4xm2+R7ScUfiPBu/CXHSDGAfP6dc/Jg8gaoES7wviD\nvgfHySJQHEYx0mPWRgaaNYRB1k+SkmWi12W+qolGHF9yyV+4EFycaD4FdUxA\nMNyF+XViiQszmpzsf88d1oiOD2kKhc1JH6GbzVDAJT1YHYyIW176eMvTRWTZ\nN/mWAsbMJ3gvMWOUePlx05C0saOFLuFFy5fSoZRIbvX9kmRrQD2aDe2h4Igg\nP9cjCb2k+B53h5UJiBbmYC1sFGS+D0biD+0iCarTohIwShMR2ekUaUNgvYHH\ndyEHowNrvn1EuNZ7OJ3EndP3D7xDb1ICVWEho4USawKgUqcwWJmjBNCpmny4\n9Gl3EZgShXCCpTRu4Mfj3UH3sa86YCQ0Hw4n7+iHmehGShakzuJXXs1WKoY3\n2wfW7EUv1EnEG8pA9PYFFh2UCklqbEpwxZAzS/A0xgHojnPc129DbRCmd7ey\na5bwfrQqZ9he/LCXEaMTg3Qot/6LWuHV5PgjG+CzKob6x31zXm9rsViETjoJ\nHnfqj7/0UjNhSVMiRshMNP+LbC88S7Y0Xk6wFHqbgDnkv70nhuPZ727e4IxY\nZEhsshrkME/S9OHaLJUzW1NfjQpMsUoad8cEc9xf+wmo494Te9chC8SV7LEh\nockM\r\n=TwYJ\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIGsDBMeDm2cwR+DMohEfGHbbYTxYXVdaB8EuT70Vop2hAiEArV2eFsf1naMjBksJsKvZbNXz80GTqYB2NMFXJUjhBos="}]},"_npmUser":{"name":"scamden","email":"rusty.camden@gmail.com"},"directories":{},"maintainers":[{"name":"scamden","email":"rusty.camden@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/grid_4.10.8_1621404641030_0.02257240159481233"},"_hasShrinkwrap":false},"4.10.9":{"name":"grid","version":"4.10.9","description":"A highly scalable grid component written in Typescript",".browser":"dist/grid.js","main":"dist/modules/core/index.js","typings":"dist/modules/core/index.d.ts","publishConfig":{"registry":"https://registry.npmjs.org/","tag":"next"},"engines":{"node":">=10"},"iqproj":{"app":true},"scripts":{"commitmsg":"commitlint -E GIT_PARAMS","preversion":"npm run build","open:src":"ts-node -P tsconfig.srv.json tools/srcServer.ts","ts:watch":"tsc --watch --incremental","dev":"npm-run-all --parallel open:src test:watch ts:watch","clean":"rm -rf ./dist && mkdir dist","prebuild":"npm run clean && npm run test","build":"tsc -P tsconfig.json && NODE_ENV=production node tools/build.js","test":"node_modules/karma/bin/karma start --single-run --no-auto-watch karma.conf.js","test:watch":"node_modules/karma/bin/karma start karma.conf.js","semantic-release":"semantic-release"},"dependencies":{"capitalize":"^0.5.0","click-off":"~0.2.1","element-class":"^0.1.1","es6-object-assign":"~1.1.0","escape-stack":"~0.1.2","inner-text-shim":"~1.0.1","key":"^0.1.11","time-now":"~0.2.1"},"devDependencies":{"@commitlint/cli":"~9.1.2","@commitlint/config-conventional":"~12.1.4","@types/anymatch":"~3.0.0","@types/browser-sync":"~2.26.1","@types/jasmine":"~2.6.0","@types/karma":"~1.7.0","@types/webpack-dev-middleware":"~3.7.1","@types/webpack-hot-middleware":"~2.25.3","autoprefixer":"~10.2.5","browser-sync":"~2.26.12","condition-circle":"~2.0.2","copy-webpack-plugin":"~3.0.1","css-loader":"~5.2.4","ejs-compiled-loader":"~3.0.0","es6-promise":"~3.1.2","fibers":"~5.0.0","file-loader":"~0.9.0","html-webpack-plugin":"~4.3.0","husky":"~0.13.3","install":"~0.13.0","jasmine":"~3.6.1","jquery":"~3.5.1","karma":"~6.3.2","karma-chrome-launcher":"~3.1.0","karma-jasmine":"~0.3.6","karma-sourcemap-loader":"~0.3.7","karma-webpack":"~4.0.2","lodash":"~4.17.21","mini-css-extract-plugin":"~0.10.0","node-sass":"~4.14.1","npm-run-all":"~4.0.2","polyfill-function-prototype-bind":"0.0.1","postcss-loader":"~0.11.0","sass-loader":"~9.0.3","semantic-release":"~15.14.0","source-map-loader":"~1.0.1","style-loader":"~1.2.1","transform-ts-paths":"^1.0.0","ts-loader":"~8.0.2","ts-node":"~8.10.2","tslint":"^5.4.2","tslint-eslint-rules":"^4.1.1","typescript":"~4.2.4","url-loader":"~4.1.0","webpack":"^4.44.1","webpack-bundle-analyzer":"~3.8.0","webpack-cli":"~3.3.12","webpack-dev-middleware":"~3.7.2","webpack-hot-middleware":"~2.25.0","webpack-md5-hash":"~0.0.5"},"repository":{"type":"git","url":"git+https://github.com/gridgrid/grid.git"},"keywords":["grid","spreadsheet","virtual","scroll"],"author":{"name":"Sterling Camden"},"license":"MIT","bugs":{"url":"https://github.com/gridgrid/grid/issues"},"homepage":"https://github.com/gridgrid/grid","release":{"verifyConditions":"condition-circle"},"readme":"[![npm](https://img.shields.io/npm/v/grid.svg)]( https://www.npmjs.com/package/grid) [![CircleCI](https://circleci.com/gh/gridgrid/grid.svg?style=shield)](https://circleci.com/gh/gridgrid/grid)  [![semantic-release](https://img.shields.io/badge/%20%20%F0%9F%93%A6%F0%9F%9A%80-semantic--release-e10079.svg)](https://github.com/semantic-release/semantic-release) [![Commitizen friendly](https://img.shields.io/badge/commitizen-friendly-brightgreen.svg)](http://commitizen.github.io/cz-cli/)\n\nGrid\n===\n\nA highly scalable grid component written in javscript [DEMO](https://gridgrid.github.io/grid/ \"Grid Demo\")\n\nNote: while Grid is fully functional it is still in beta. Use at your own risk and please file any issues on GitHub. \n\nAlso the grid is currently packaged for use with browserify. If you need a build for a non browserify (or webpack) environment please open an issue on github.\n\n\nInstallation\n===\n`npm install --save grid`\n\n\nExample / Quick-Start\n===\n\nTo run the sample app locally, run `npm start` and hit http://localhost:8082\n\n##### Create a Grid Instance\n`var core = require('grid')`\n`var grid = core();`\n\nThe grid handles most complexity for you. There are only three user supplied requirements to a get a grid up and running\n\n##### Row and Column Descriptors\nRow and column descriptors are objects that tell the grid how wide or high to make your cells. They also control things like whether or not a column is hidden and describe the overall dimensions of the grid.\n\n``` javascript\n\t// add some columns\n    var colDescriptors = [];\n    var colDescriptor;\n    for (var c = 0; c < 20; c++) {\n        // create a col descriptor\n        colDescriptor = grid.colModel.create();\n        colDescriptor.width = 78;\n        colDescriptor.hidden = !!(c % 2); // hide every other column for fun and profit\n    }\n    grid.colModel.add(colDescriptors);\n\n    // add some rows\n    var rowDescriptors = [];\n    var rowDescriptor;\n    for (var r = 0; r < 20; r++) {\n        // create a row descriptor\n        rowDescriptor = grid.rowModel.create();\n        rowDescriptor.height = 24;\n        if(r === 0){\n        \trowDescriptor.header = true;\n        }\n    }\n    grid.rowModel.add(rowDescriptors);\n```\n\n##### The DataModel\n\nThe grid determines what to render for a given cell by calling the supplied data model. This gives the client massive flexbility to generate and return the data however they need to.\n\nThe datamodel can be a simple object that the user sets on the grid instance `dataModel` field and needs to implement at a minimum\n\n`get`, `getHeader`, and `isDirty`, \n\nif you support user data entry and want paste to work you should also implement `set`\n\nHere's a basic read only implementation:\n\n``` javascript\n// use the grid's default dirty clean implementation almost always\n// (it will automatically be set clean on each draw by the grid)\nvar dataDirtyClean = grid.makeDirtyClean();\n\ngrid.dataModel = {\n\n    get: function(dataRowIndex, dataColIndex, isCopy) {\n        var rawValue = [dataRowIndex, dataColIndex];\n        return {\n            value: rawValue,\n            formatted: 'r' + rawValue[0] + ', c' + rawValue[1]\n        };\n    },\n    \n    getHeader: function(headerRowIndex, headerColIndex) {\n        var rawValue = [headerRowIndex, headerColIndex];\n        return {\n            value: rawValue,\n            formatted: 'hr' + rawValue[0] + ', hc' + rawValue[1]\n        };\n    },\n    \n    isDirty: dataDirtyClean.isDirty\n};\n```\n\n##### Call Build\nFinally we just need to tell the grid to set itself up in a container of our choosing:\n\n``` javascript\nvar container = document.createElement('div');\ncontainer.style.width = '800px';\ncontainer.style.height = '800px';\ndocument.body.appendChild(container);\ngrid.build(container);\n```\n\nConcepts\n===\n\nMany of the apis in the grid utilize two concepts when referencing coordinates: spaces and units. It's good to understand these before using the more advanced features.\n\n## Spaces\nCoordinates in the grid exist in one of three spaces.\n\n**virtual** - represents all of the data in your grid including the headers. for example, if you have a grid with one header row, then `(0, 20)` in the `'virtual'` space references the column 20 of the header. `(1, 20)` would reference column 20 of the first data row.\n\n**data** - very similar to virtual but does not include the headers. so `(0,20)` references the first row of data at the 20th column and technically `(-1, 20)` would represent the 20th column in the header although negative indexes are rarely used\n\n**view** - the view space represents the actual dom nodes that are rendered for the grid's virtualization. the grid's implementation renders enough cells to fill the entire viewport and no more (usually around 20-30 rows and 10 cols depending on sizes). in this space `(0,20)` would reference the dom cell at column 20 of the first row. even if you scroll the grid it will always point at that cell, so a view coordinate can be translated to different virtual coordinates depending on the scroll. you could think of view coordinates as a correlary for `position: fixed` in css\n\n## Units\nUnits in the grid are straightforward. They are either\n\n**px** - pixels, so `(0,0)` in the view space is the very top left pixel of the grid no matter the scroll, whereas `(0,0)` in the virtual space is the top left pixel only when the grid hasn't been scrolled, and would technically refer to a pixel out of view if the grid has been scrolled\n\nor\n\n**cell** - cells, so `(0,0)` in the view space represents the top left cell regardless of scroll, and `(0,0)` in the virtual space would represent an off screen cell if scrolled and top left if not scrolled\n\nUsing Custom HTML\n===\n\nThere are two ways to get non text (read html) into a grid:\n\n## Decorators\nDecorators are great for adding a piece of one-off ui that doesn't relate directly to the content of a cell or doesn't need to be in every row of a column or vice versa. For example, the grid internally uses decorators to render the focus and selection highlight as well as resize handles.\n\n**basic decorator**\n``` javascript\n\tvar top = 1,\n    left = 2,\n    height = 1,\n    width = 1,\n    unit = 'cell',\n    space = 'view';\n    var d = grid.decorators.create(top, left, height, width, unit, space);\n\n    // return some element\n    d.render = function() {\n        var a = document.createElement('a')\n        a.textContent = 'link Text!'\n        return a;\n    };\n    grid.decorators.add(d);\n```\n\nPuts a link over the cell at row 1 col 2 that doesn’t move with the scroll (why you would do this is questionable but it's just an example).\n\nYou can do more complicated things like render directives: (requires grid-angular-adapter)\n\n**angular directive decorator**\n``` javascript\nangular.module('myCoolGrid', [require('grid')])\n\n  .controller('MyGridCtrl', function($scope, GridSrvc, GridDecoratorSrvc) {\n      var grid = GridSrvc.core();\n\n      // do row col and datamodel setup...\n\n      var top = 20,\n          left = 10,\n          height = 2,\n          width = 2,\n          unit = 'cell',\n          space = 'virtual';\n      var d = grid.decorators.create(top, left, height, width, unit, space);\n\n      // return some element\n      d.render = function() {\n          var scope = $scope.$new();\n          scope.interestingData = 'INTERESTING DATA!!!';\n          return GridDecoratorSrvc.render({\n              $scope: scope,\n              template: '<my-directive data=\"interestingData\"></my-directive>',\n              events: true\n          });\n      };\n      grid.decorators.add(d);\n  });\n```\n\nThis will put your compiled directive in a box that spans from `row 20-22` and `col 10-12`, and moves appropriately with the scroll. The `events` flag lets the grid know that this decorator is interactable and should receive mouse events. (Otherwise pointer events are set to none.) The GridDecoratorSrvc takes care of destroying the scope and properly removing elements to avoid memory leaks with angular. You definitely should use it for any angular decorators.\n\n\n## Builders\nBuilders help you to get html into the actual cells of a given row or column instead of the text that would have been rendered.\n\n\n**basic builders**\n``` javascript\nvar builder = grid.colModel.createBuilder(function render() {\n    return angular.element('<a href=\"#\"></a>')[0];\n}, function update(elem, ctx) {\n    grid.viewLayer.setTextContent(elem, ctx.data.formatted);\n    return elem;\n});\nvar colDescriptor = grid.colModel.create(builder);\n```\n\nhave `<a>` tags in your cells for all the rows in that column\n\nNote: it's important for the update function of a builder to be extremely fast. Call `scope.$digest` not `scope.$apply`, and  use `grid.viewLayer.setTextContent` not `elem.innerHTML` where possible\n\n\nStyling\n===\nIf you want to update the look and feel of the grid, here are a few classes that you can override to give you the look you want.\n\n\n## Classes\n\n**`.grid-cell`:**\nThis class is responsible for the look of individual cells. \n\n**`.grid-focus-decorator`:** This decorator class is applied when you click('focus') on a cell\n\nEx. Adding the following style will give you a cell with a blue border around it when the cell is selected.\n``` css\n.grid-focus-decorator {\n  border: 2px solid blue;\n}\n```\n\n**`.grid-selection`:**\nWhen selecting rows and columns, this class sets the border and background so you know which rows you are exactly selecting\n\nEx.\n```css\n$grid-teal: #39CCCC !default;\n.grid-selection {\n  border: 1px solid $grid-teal;\n  background: transparentize($grid-teal, .8);\n}\n```\n\n**`.grid-row`:**\nThis class is responsible for the look of the row of cells.\n\nEx. To apply, a background color when hovering over each row, add the following:\n```css\n.grid-row {\n  &.hover {\n    background-color: lighten($grid-teal, 30) !important;\n  }\n}\n```\n\nTo apply styles only to the header row, use the following class:\n```css\n.grid-row {\n  &.grid-is-header {\n  }\n}\n\n```\n**`.col-resize`:** This class changes the look of the column resizing element. \n\n**`.grid-drag-line`**: This class is used when you are resizing a column. A vertical line is added to guide you of how much to resize your columns.\n\nEx. To show a blue vertical line when resizing a column, add the following\n```css\n.grid-drag-line {\n  background: #7FDBFF;\n}\n```\n\n","readmeFilename":"README.md","gitHead":"a0a296c6334c4caf341866c9eb7fda57a7f733c5","_id":"grid@4.10.9","_nodeVersion":"12.18.3","_npmVersion":"6.14.13","dist":{"integrity":"sha512-FxkXSXomQ+lDraGV758Z2PSkI41u956nU7cRfh7I9UHk/pfGZ148CW7aoutN65SYgMi8GeYmDQxhuyg4O03upg==","shasum":"4bf8989308a2267946631ca1634c52d3188f920b","tarball":"https://registry.npmjs.org/grid/-/grid-4.10.9.tgz","fileCount":219,"unpackedSize":2026410,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJhFVUvCRA9TVsSAnZWagAAhtAP/RP5KFwY9egwPzybDLZF\nh57S2l5QLci4JbQirtGyLoxxehj5Ldayfm80RM3Oty6rDbtAMZmgFBZZn0qu\nQXnyIOvz9eXfZrEQESVDnFrEAnhb1cnCukPbqdgXW6vtWeUrFOskC5yro6K6\nni4Jw5x3Fs/WEtdKrm/MiYdEEYzcrvygIulEpriWLJUDGyL1XkaSnccYSuC1\nTFQtl0t286EBRD0Vxvfd+IAbznwamPTPH92QhaDi5RpFGsPwWM07TvWACdSk\nyUUZKiRS0uIVVHL0E9qbUzgcotaYw/fhWbeTUiESXls0Ws3Vmki+XvesGVoU\n6z6fNx8le0wKfjutFY/bfcTs97GCp7a7GzTkIvTLqkZHMAtaoNBi58dbQyCU\nvEF/Mdg1GPopZeZwZbyc9xn7i75wkmBhkKsBd+adSFLDQQxo+OobfbGw9GV3\n4spaeCFFXW0H3/4RiIhDaD+t/soAM/lU3p/EQ9Benj9tveM7Dp0G/Ytir+bG\nZuwnNiWaSBwXSf+zQq+xoAJXDteaRZFhdWR+5DJx80EZvSrPEjw6MNXR2A5R\n3nHIlQcWr+NNUlYtw6HbaaVk4ZB/QiF+YMBV+HVBtLCwWjhHRpLdqdQupM0y\nOSUoJfZW+rbdpgQmNFhz4IO+Q0WFfucHJuNqUHukrDsowV8+pqyatayRvSBb\ndI8S\r\n=g0OZ\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDG+KdFtBVs5vxan7RxBQDJMCwWokzL1MRdVNbiWrLirwIgZ8yFVLa4X2EhtlX1wn1VWxh0ErbIrntCS4y17WCh5NI="}]},"_npmUser":{"name":"scamden","email":"rusty.camden@gmail.com"},"directories":{},"maintainers":[{"name":"scamden","email":"rusty.camden@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/grid_4.10.9_1628788014776_0.4910694468484551"},"_hasShrinkwrap":false}},"readmeFilename":"README.md","homepage":"https://github.com/gridgrid/grid","keywords":["grid","spreadsheet","virtual","scroll"],"repository":{"type":"git","url":"git+https://github.com/gridgrid/grid.git"},"author":{"name":"Sterling Camden"},"bugs":{"url":"https://github.com/gridgrid/grid/issues"},"license":"MIT","users":{"voxmatt":true,"scamden":true,"retorillo":true,"sitherine":true}}