diff --git a/.pullapprove.yml b/.pullapprove.yml
new file mode 100644
index 000000000000..8388cb9a8519
--- /dev/null
+++ b/.pullapprove.yml
@@ -0,0 +1,328 @@
+# Configuration for pullapprove.com
+#
+# Approval access and primary role is determined by info in the project ownership spreadsheet:
+# https://docs.google.com/spreadsheets/d/1oTGX-keDOVNLOmMNIn3IGMvinTrIojSZXWI2dnXkGmQ/edit#gid=0
+#
+# === GitHub username to Full name map ===
+#
+# andrewseguin - Andrew Seguin
+# crisbeto - Kristiyan Kostadinov
+# devversion - Paul Gschwendtner
+# jelbourn - Jeremy Elbourn
+# josephperrott - Joey Perrott
+# kara - Kara Erickson
+# mmalerba - Miles Malerba
+# tinayuangao - Tina Gao
+
+version: 2
+
+group_defaults:
+ required: 1
+ reset_on_reopened:
+ enabled: true
+ approve_by_comment:
+ enabled: false
+
+groups:
+ # If no other groups apply, we at least require approval from a core member
+ fallback:
+ conditions:
+ files:
+ - '*'
+ users:
+ - andrewseguin
+ - crisbeto
+ - devversion
+ - jelbourn
+ - josephperrott
+ - kara
+ - mmalerba
+ - tinayuangao
+
+ tools-and-config:
+ conditions:
+ files:
+ - 'scripts/*'
+ - 'test/*'
+ - 'tools/*'
+ users:
+ - devversion # primary
+ - jelbourn
+
+ cdk:
+ conditions:
+ files:
+ - 'src/cdk/*'
+ users:
+ - jelbourn # primary
+ - mmalerba
+
+ autocomplete:
+ conditions:
+ files:
+ - 'src/(demo-app|e2e-app|lib)/autocomplete/*'
+ - 'src/material-examples/autocomplete-*'
+ users:
+ - kara # primary
+ - jelbourn
+
+ button:
+ conditions:
+ files:
+ include:
+ - 'src/(demo-app|e2e-app|lib)/button/*'
+ - 'src/material-examples/button-*'
+ exclude:
+ - 'src/material-examples/button-toggle-*'
+ users:
+ - tinayuangao # primary
+ - jelbourn
+
+ button-toggle:
+ conditions:
+ files:
+ - 'src/(demo-app|e2e-app|lib)/button-toggle/*'
+ - 'src/material-examples/button-toggle-*'
+ users:
+ - tinayuangao # primary
+ - jelbourn
+
+ card:
+ conditions:
+ files:
+ - 'src/(demo-app|e2e-app|lib)/card/*'
+ - 'src/material-examples/card-*'
+ users:
+ - kara # primary
+ - jelbourn
+
+ checkbox:
+ conditions:
+ files:
+ - 'src/(demo-app|e2e-app|lib)/checkbox/*'
+ - 'src/material-examples/checkbox-*'
+ users:
+ - tinayuangao # primary
+ - jelbourn
+
+ chips:
+ conditions:
+ files:
+ - 'src/(demo-app|e2e-app|lib)/chips/*'
+ - 'src/material-examples/chips-*'
+ users:
+ - tinayuangao # primary
+ - jelbourn
+
+ data-table:
+ conditions:
+ files:
+ - 'src/(demo-app|e2e-app|lib)/table/*'
+ - 'src/lib/core/table/*'
+ - 'src/material-examples/table-*'
+ users:
+ - andrewseguin # primary
+ - jelbourn
+
+ datepicker:
+ conditions:
+ files:
+ - 'src/(demo-app|e2e-app|lib)/datepicker/*'
+ - 'src/lib/core/datetime/*'
+ - 'src/material-examples/datepicker-*'
+ users:
+ - mmalerba # primary
+ - jelbourn
+
+ dialog:
+ conditions:
+ files:
+ - 'src/(demo-app|e2e-app|lib)/dialog/*'
+ - 'src/material-examples/dialog-*'
+ users:
+ - jelbourn # primary
+ - mmalerba
+
+ expansion:
+ conditions:
+ files:
+ - 'src/(demo-app|e2e-app|lib)/expansion/*'
+ - 'src/material-examples/expansion-*'
+ users:
+ - josephperrott # primary
+ - jelbourn
+
+ grid-list:
+ conditions:
+ files:
+ - 'src/(demo-app|e2e-app|lib)/grid-list/*'
+ - 'src/material-examples/grid-list-*'
+ users:
+ - kara # primary
+ - jelbourn
+
+ icon:
+ conditions:
+ files:
+ - 'src/(demo-app|e2e-app|lib)/icon/*'
+ - 'src/material-examples/icon-*'
+ users:
+ - jelbourn # primary
+ - mmalerba
+
+ input:
+ conditions:
+ files:
+ - 'src/(demo-app|e2e-app|lib)/input/*'
+ - 'src/material-examples/input-*'
+ users:
+ - mmalerba # primary
+ - jelbourn
+
+ list:
+ conditions:
+ files:
+ - 'src/(demo-app|e2e-app|lib)/list/*'
+ - 'src/material-examples/list-*'
+ users:
+ - kara # primary
+ - jelbourn
+
+ menu:
+ conditions:
+ files:
+ - 'src/(demo-app|e2e-app|lib)/menu/*'
+ - 'src/material-examples/menu-*'
+ users:
+ - kara # primary
+ - jelbourn
+
+ overlay:
+ conditions:
+ files:
+ - 'src/(demo-app|e2e-app)/overlay/*'
+ - 'src/lib/core/overlay/*'
+ - 'src/material-examples/overlay-*'
+ users:
+ - jelbourn # primary
+ - crisbeto
+
+ portal:
+ conditions:
+ files:
+ - 'src/(demo-app|e2e-app)/portal/*'
+ - 'src/lib/core/portal/*'
+ - 'src/material-examples/portal-*'
+ users:
+ - jelbourn # primary
+ - mmalerba
+
+ progress:
+ conditions:
+ files:
+ - 'src/(demo-app|e2e-app|lib)/progress-(bar|spinner)/*'
+ - 'src/material-examples/progress-(bar|spinner)-*'
+ users:
+ - josephperrott # primary
+ - jelbourn
+
+ radio:
+ conditions:
+ files:
+ - 'src/(demo-app|e2e-app|lib)/radio/*'
+ - 'src/material-examples/radio-*'
+ users:
+ - tinayuangao # primary
+ - jelbourn
+
+ ripple:
+ conditions:
+ files:
+ - 'src/(demo-app|e2e-app)/ripple/*'
+ - 'src/lib/core/ripple/*'
+ - 'src/material-examples/ripple-*'
+ users:
+ - devversion # primary
+ - jelbourn
+
+ select:
+ conditions:
+ files:
+ - 'src/(demo-app|e2e-app|lib)/select/*'
+ - 'src/material-examples/select-*'
+ users:
+ - kara # primary
+ - jelbourn
+
+ sidenav:
+ conditions:
+ files:
+ - 'src/(demo-app|e2e-app|lib)/sidenav/*'
+ - 'src/material-examples/sidenav-*'
+ users:
+ - mmalerba # primary
+ - jelbourn
+
+ slide-toggle:
+ conditions:
+ files:
+ - 'src/(demo-app|e2e-app|lib)/slide-toggle/*'
+ - 'src/material-examples/slide-toggle-*'
+ users:
+ - devversion # primary
+ - jelbourn
+
+ slider:
+ conditions:
+ files:
+ - 'src/(demo-app|e2e-app|lib)/slider/*'
+ - 'src/material-examples/slider-*'
+ users:
+ - mmalerba # primary
+ - jelbourn
+
+ snack-bar:
+ conditions:
+ files:
+ - 'src/(demo-app|e2e-app|lib)/snack-bar/*'
+ - 'src/material-examples/snack-bar-*'
+ users:
+ - jelbourn # primary
+ - mmalerba
+
+ tabs:
+ conditions:
+ files:
+ - 'src/(demo-app|e2e-app|lib)/tabs/*'
+ - 'src/material-examples/tabs-*'
+ users:
+ - andrewseguin # primary
+ - jelbourn
+
+ toolbar:
+ conditions:
+ files:
+ - 'src/(demo-app|e2e-app|lib)/toolbar/*'
+ - 'src/material-examples/toolbar-*'
+ users:
+ - devversion # primary
+ - jelbourn
+
+ tooltip:
+ conditions:
+ files:
+ - 'src/(demo-app|e2e-app|lib)/tooltip/*'
+ - 'src/material-examples/tooltip-*'
+ users:
+ - andrewseguin # primary
+ - jelbourn
+
+ typography:
+ conditions:
+ files:
+ - 'src/(demo-app|e2e-app)/typography/*'
+ - 'src/lib/core/typography/*'
+ - 'src/material-examples/typography-*'
+ users:
+ - crisbeto # primary
+ - jelbourn
diff --git a/CHANGELOG.md b/CHANGELOG.md
index c0eeb3c979ab..0074dd4528f9 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,3 +1,73 @@
+
+# [2.0.0-beta.8 plasma-abacus](https://github.com/angular/material2/compare/2.0.0-beta.7...2.0.0-beta.8) (2017-07-06)
+
+
+### Highlights
+* This version marks the release of `@angular/cdk` (component dev kit)! This package contains
+general building blocks for UI components decoupled from the visuals of Material Design. In the
+initial release, code from Angular Material's `core/` have been moved for `a11y/`, `bidi/`,
+`coercion/`, `observe-content/`, `platform/`, `portal/`. The `@angular/material` package now
+re-exports these symbols, marked as deprecated. The re-exports will be removed in a subsequent
+release.
+* Initial version of data-table component. There is both a `` (the core) and the
+`` (with Material Design styles). See the documentation on material.angular.io for more
+information.
+* Initial version of `` and `` components, which can be used either
+with `` or any other table.
+* Both `@angular/material` and `@angular/cdk` are now strict null compliant.
+
+
+### Breaking changes
+* `@angular/material` now depends on `@angular/cdk` as a peer dependency.
+* Some types have expanded to include `| null` or `| undefined` for strict null compatibility. If
+your application uses strict null checks, you may have to update the types in your app to match up
+with the more accurate types coming from Angular Material.
+* Angular Material no longer adds RxJS operators to the prototype of `Observable`. If your app
+depended on these operators being added by Angular Material, you will need to import them
+explicitly.
+
+
+### Bug Fixes
+
+* **autocomplete:** allow number zero as value ([#5364](https://github.com/angular/material2/issues/5364)) ([9137fd9](https://github.com/angular/material2/commit/9137fd9)), closes [#5363](https://github.com/angular/material2/issues/5363)
+* **autocomplete:** don't scroll panel when option is visible ([#4905](https://github.com/angular/material2/issues/4905)) ([d3af57d](https://github.com/angular/material2/commit/d3af57d))
+* **autocomplete:** not closing when tapping away on mobile ([#5260](https://github.com/angular/material2/issues/5260)) ([1dcaca7](https://github.com/angular/material2/commit/1dcaca7))
+* **autocomplete:** reopening when clicking an option in IE ([#5172](https://github.com/angular/material2/issues/5172)) ([fe31210](https://github.com/angular/material2/commit/fe31210)), closes [#5165](https://github.com/angular/material2/issues/5165)
+* **autosize:** resize when form value changes. Fixes [#4657](https://github.com/angular/material2/issues/4657) ([#5315](https://github.com/angular/material2/issues/5315)) ([8c9c11a](https://github.com/angular/material2/commit/8c9c11a))
+* **button-toggle:** fix standalone button toggle style ([#5121](https://github.com/angular/material2/issues/5121)) ([3d8c833](https://github.com/angular/material2/commit/3d8c833))
+* **datepicker:** pass layout direction to touchUi dialog ([#5052](https://github.com/angular/material2/issues/5052)) ([8b6efb1](https://github.com/angular/material2/commit/8b6efb1))
+* **datepicker:** use theme foreground color ([#5290](https://github.com/angular/material2/issues/5290)) ([51bf26e](https://github.com/angular/material2/commit/51bf26e))
+* **dialog:** set aria-labelledby based on the md-dialog-title ([#5178](https://github.com/angular/material2/issues/5178)) ([aee984a](https://github.com/angular/material2/commit/aee984a))
+* **directionality:** error on platform-server ([#5234](https://github.com/angular/material2/issues/5234)) ([49dfe60](https://github.com/angular/material2/commit/49dfe60))
+* **input:** theming mixin error ([#5254](https://github.com/angular/material2/issues/5254)) ([37efb54](https://github.com/angular/material2/commit/37efb54)), closes [#5232](https://github.com/angular/material2/issues/5232)
+* **input:** underline showing at end if text-align is set ([#5280](https://github.com/angular/material2/issues/5280)) ([5c9391d](https://github.com/angular/material2/commit/5c9391d)), closes [#5272](https://github.com/angular/material2/issues/5272)
+* **memory:** Unsubscribe event listeners when using Observable.fromEvent ([#5325](https://github.com/angular/material2/issues/5325)) ([1b351cd](https://github.com/angular/material2/commit/1b351cd))
+* **menu:** role being set on the wrong element ([#5191](https://github.com/angular/material2/issues/5191)) ([2239668](https://github.com/angular/material2/commit/2239668))
+* **overlay:** remove webkit tap highlight from backdrop ([#5258](https://github.com/angular/material2/issues/5258)) ([8feddd4](https://github.com/angular/material2/commit/8feddd4))
+* **select:** align first option to trigger when it is inside a group ([#5153](https://github.com/angular/material2/issues/5153)) ([d39cb12](https://github.com/angular/material2/commit/d39cb12))
+* **select:** expose focus method ([#5255](https://github.com/angular/material2/issues/5255)) ([7b2d4ae](https://github.com/angular/material2/commit/7b2d4ae)), closes [#5251](https://github.com/angular/material2/issues/5251)
+* **select:** md-optgroup not using typography styles ([#5193](https://github.com/angular/material2/issues/5193)) ([b5bf6f5](https://github.com/angular/material2/commit/b5bf6f5))
+* **select:** page scrolling down when selecting option with space ([#5192](https://github.com/angular/material2/issues/5192)) ([2361385](https://github.com/angular/material2/commit/2361385))
+* **snackbar:** clear timeout upon dismiss ([#4860](https://github.com/angular/material2/issues/4860)) ([146160c](https://github.com/angular/material2/commit/146160c))
+* **tabs:** server-side rendering error ([#5348](https://github.com/angular/material2/issues/5348)) ([0174377](https://github.com/angular/material2/commit/0174377))
+* **unique-selection-dispatcher:** remove listeners on destroy ([#5164](https://github.com/angular/material2/issues/5164)) ([f9bbbe7](https://github.com/angular/material2/commit/f9bbbe7))
+
+
+### Features
+
+* **data-table:** initial version. Too many commits to list.
+* **directionality:** a provider to get directionality ([#4044](https://github.com/angular/material2/issues/4044)) ([61d979e](https://github.com/angular/material2/commit/61d979e)), closes [#3600](https://github.com/angular/material2/issues/3600)
+* **input:** add custom error state matcher ([#4750](https://github.com/angular/material2/issues/4750)) ([f73cc97](https://github.com/angular/material2/commit/f73cc97))
+* **pagination:** initial pagination component ([#5156](https://github.com/angular/material2/issues/5156)) ([85fb00a](https://github.com/angular/material2/commit/85fb00a))
+* **sort:** add ability to manage and display sorting ([#5307](https://github.com/angular/material2/issues/5307)) ([b328d36](https://github.com/angular/material2/commit/b328d36))
+* **tab-nav-bar:** support disabling tab links ([#5257](https://github.com/angular/material2/issues/5257)) ([fc809ed](https://github.com/angular/material2/commit/fc809ed)), closes [#5208](https://github.com/angular/material2/issues/5208)
+* add support for strict null checks ([#5094](https://github.com/angular/material2/issues/5094)) ([2bf7024](https://github.com/angular/material2/commit/2bf7024))
+* remove uses of rxjs patch operators ([#5314](https://github.com/angular/material2/issues/5314)) ([e488e3f](https://github.com/angular/material2/commit/e488e3f)), closes [#2622](https://github.com/angular/material2/issues/2622)
+* move a11y, bidi, platform, rxjs, and portal to cdk ([#5386](https://github.com/angular/material2/issues/5386)) ([fde35e4](https://github.com/angular/material2/commit/fde35e4))
+* move observe-content to cdk ([#5438](https://github.com/angular/material2/issues/5438)) ([b00f838](https://github.com/angular/material2/commit/b00f838))
+
+
+
# [2.0.0-beta.7 glass-delicatessen](https://github.com/angular/material2/compare/2.0.0-beta.6...2.0.0-beta.7) (2017-06-19)
diff --git a/README.md b/README.md
index 229f9c66c43e..115598172a57 100644
--- a/README.md
+++ b/README.md
@@ -11,18 +11,6 @@ This is the home for the Angular team's Material Design components built for and
[Contributing](https://github.com/angular/material2/blob/master/CONTRIBUTING.md) |
[Plunker Template](http://plnkr.co/edit/o077B6uEiiIgkC0S06dd?p=preview)
-### Installation
-
-The latest release of Angular Material can be installed from npm
-
-`npm install @angular/material`
-
-A snapshot build with the latest changes from
-[master](https://github.com/angular/material2/tree/master) is also available.
-Note that this snapshot build should not be considered stable and may break between releases.
-
-`npm install --save angular/material2-builds angular/cdk-builds`
-
### Getting started
See our [Getting Started Guide][getting-started]
@@ -44,7 +32,7 @@ label.
High level stuff planned for Q3 2017 (July - September):
- As many bug fixes as humanly possible
- Additional features for data-table
-- More accessibility improvements
+- Continued accessibility improvements
- Nested menus
- All components are OnPush
- Improved documentation, guides, examples, and navigation on material.angular.io
@@ -64,6 +52,7 @@ High level stuff planned for Q3 2017 (July - September):
| cards | | [Docs][2] |
| checkbox | | [Docs][3] |
| chips | Chip-remove, integration with input in-progress | [Docs][26] |
+| data-table | Sticky headers & incremental row rendering in-progress | [Docs][28] |
| datepicker | | [Docs][25] |
| dialog | | [Docs][22] |
| expansion-panel | Needs documentation | - |
@@ -72,6 +61,7 @@ High level stuff planned for Q3 2017 (July - September):
| input | | [Docs][5] |
| list | Selection and action list planned Q3 | [Docs][8] |
| menu | Nested menu planned Q3 | [Docs][17] |
+| paginator | | [Docs][29] |
| progress-bar | | [Docs][12] |
| progress-spinner | | [Docs][11] |
| radio | | [Docs][4] |
@@ -81,6 +71,7 @@ High level stuff planned for Q3 2017 (July - September):
| slide-toggle | | [Docs][14] |
| slider | | [Docs][16] |
| snackbar / toast | | [Docs][21] |
+| sort-header | | [Docs][30] |
| tabs | | [Docs][13] |
| textarea | | [Docs][5] |
| toolbar | | [Docs][7] |
@@ -89,17 +80,16 @@ High level stuff planned for Q3 2017 (July - September):
| theming | | [Guide][20] |
| typography | | [Guide][27] |
| layout | See [angular/flex-layout][lay_rp] | [Wiki][0] |
+| cdk | Launched, documentation in-progress | |
#### In progress, planned, and non-planned features
| Feature | Status | Docs | Issue |
|------------------|-------------------------------------|--------------|----------------|
-| @angular/cdk | Coming soon | - | |
-| data-table | Coming soon | - | [#581][0581] |
-| tree | Design in-progress | - | [#3175][3175] |
-| stepper | Not started, planned Q3 2017 | - | [#508][0508] |
-| sticky-header | Not started, planned Q3 2017 | - | [#474][0474] |
+| tree | In-progress ([sneak peak][31]) | - | [#3175][3175] |
+| stepper | In-progress, planned Q3 2017 | - | [#508][0508] |
+| sticky-header | In-progress, planned Q3 2017 | - | [#474][0474] |
| virtual-repeat | Not started, planned Q4 2017 | - | [#823][0823] |
| fab speed-dial | Not started, not planned | - | [#860][0860] |
| fab toolbar | Not started, not planned | - | - |
@@ -134,6 +124,10 @@ High level stuff planned for Q3 2017 (July - September):
[25]: https://material.angular.io/components/component/datepicker
[26]: https://material.angular.io/components/component/chips
[27]: https://material.angular.io/guide/typography
+[28]: https://material.angular.io/components/component/table
+[29]: https://material.angular.io/components/component/paginator
+[30]: https://material.angular.io/components/component/sort
+[31]: https://tina-material-tree.firebaseapp.com/simple-tree
[0107]: https://github.com/angular/material2/issues/107
[0119]: https://github.com/angular/material2/issues/119
diff --git a/e2e/components/checkbox-e2e.spec.ts b/e2e/components/checkbox-e2e.spec.ts
index c42c1abbacc8..2256bf712043 100644
--- a/e2e/components/checkbox-e2e.spec.ts
+++ b/e2e/components/checkbox-e2e.spec.ts
@@ -10,7 +10,6 @@ describe('checkbox', () => {
it('should be checked when clicked, and unchecked when clicked again', async () => {
let checkboxEl = element(by.id('test-checkbox'));
let inputEl = element(by.css('input[id=input-test-checkbox]'));
- let checked: string;
screenshot('start');
checkboxEl.click();
diff --git a/e2e/components/icon-e2e.spec.ts b/e2e/components/icon-e2e.spec.ts
index 57fea20eabf5..0c17ac1ff1f2 100644
--- a/e2e/components/icon-e2e.spec.ts
+++ b/e2e/components/icon-e2e.spec.ts
@@ -1,5 +1,4 @@
import {browser, by, element} from 'protractor';
-import {screenshot} from '../screenshot';
describe('icon', () => {
diff --git a/e2e/components/input-e2e.spec.ts b/e2e/components/input-e2e.spec.ts
index cd3b05425f76..484ed708acbe 100644
--- a/e2e/components/input-e2e.spec.ts
+++ b/e2e/components/input-e2e.spec.ts
@@ -43,4 +43,14 @@ describe('input', () => {
expect(input.getAttribute('value')).toBe('0');
});
});
+
+ describe('textarea', () => {
+ beforeEach(() => browser.get('/input'));
+
+ it('should update input value when user types', () => {
+ let input = element(by.id('text-area'));
+ input.sendKeys('abc123');
+ expect(input.getAttribute('value')).toBe('abc123');
+ });
+ });
});
diff --git a/e2e/components/menu-e2e.spec.ts b/e2e/components/menu-e2e.spec.ts
index 98af13ad9180..4b57e5b93570 100644
--- a/e2e/components/menu-e2e.spec.ts
+++ b/e2e/components/menu-e2e.spec.ts
@@ -1,4 +1,4 @@
-import {Key, protractor, browser, by, element, ElementFinder} from 'protractor';
+import {Key, protractor, browser, by, element} from 'protractor';
import {screenshot} from '../screenshot';
import {
expectToExist,
diff --git a/guides/cdk-table.md b/guides/cdk-table.md
new file mode 100644
index 000000000000..0b6881d8be65
--- /dev/null
+++ b/guides/cdk-table.md
@@ -0,0 +1,126 @@
+The `` is an unopinionated, customizable data-table with a fully-templated API, dynamic
+columns, and an accessible DOM structure. This component acts as the core upon which anyone can
+build their own tailored data-table experience.
+
+The table provides a foundation upon which other features, such as sorting and pagination, can be
+built. Because it enforces no opinions on these matters, developers have full control over the
+interaction patterns associated with the table.
+
+For a Material Design styled table, see the
+[documentation for ``](https://material.angular.io/components/table) which builds on
+top of the CDK data-table.
+
+
+
+### Using the CDK data-table
+
+#### Writing your table template
+
+The first step to writing the data-table template is to define the columns.
+A column definition is specified via an `` with the `cdkColumnDef` directive, giving
+column a name. Each column definition then further defines both a header-cell template
+(`cdkHeaderCellDef`) and a data-cell template (`cdkCellDef`).
+
+
+```html
+
+ User name
+ {{row.a}}
+
+```
+
+The set of columns defined represent the columns that are _available_ to be rendered. The specific
+columns rendered in a given row, and their order, are specified on the row (see below).
+
+Note that `cdkCellDef` exports the row context such that the row data can be referenced in the cell
+template. The directive also exports the same properties as `ngFor` (index, even, odd, first,
+last).
+
+The next step is to define the table's header-row (`cdkHeaderRowDef`) and data-row (`cdkRowDef`).
+
+```html
+
+
+```
+
+These row templates accept the specific columns to be rendered via the name given to the
+`cdkColumnDef`.
+
+
+The `cdkRowDef` also exports row context, which can be used for event and property
+bindings on the row element. Any content placed _inside_ of the header row or data row template
+will be ignored, as the rendered content of the row comes from the cell templates described
+above.
+
+
+##### Example: table with three columns
+```html
+
+
+
+ User name
+ {{row.username}}
+
+
+
+
+ Age
+ {{row.age}}
+
+
+
+
+ Title
+ {{row.title}}
+
+
+
+
+
+
+```
+
+The columns given on the row determine which cells are rendered and in which order. Thus, the
+columns can be set via binding to support dynamically changing the columns shown at run-time.
+
+
+It is not required to display all the columns that are defined within the template,
+nor use the same ordering. For example, to display the table with only `age`
+and `username` and in that order, then the row and header definitions would be written as:
+
+```html
+
+```
+
+Event and property bindings can be added directly to the row element.
+
+##### Example: table with event and class binding
+```html
+
+
+
+ = 18”
+ (click)=”handleRowClick(row)”>
+
+```
+
+#### Connecting the table to a data source
+Data is provided to the table through a `DataSource`. When the table receives a data source,
+it calls the DataSource's connect function which returns an observable that emits an array of data.
+Whenever the data source emits data to this stream, the table will update.
+
+Because the _data source_ provides this stream, it bears the responsibility of triggering table
+updates. This can be based on _anything_: websocket connections, user interaction, model updates,
+time-based intervals, etc. Most commonly, updates will be triggered by user interactions like
+sorting and pagination.
+
+##### `trackBy`
+To improve performance, a trackBy function can be provided to the table similar to Angular’s
+[`ngFor` trackBy](https://angular.io/api/common/NgForOf#change-propagation). This informs the
+table how to uniquely identify rows to track how the data changes with each update.
+
+```html
+
+```
diff --git a/guides/getting-started.md b/guides/getting-started.md
index 48e4c5ddfcb9..d8de32789ceb 100644
--- a/guides/getting-started.md
+++ b/guides/getting-started.md
@@ -3,10 +3,16 @@ For help getting started with a new Angular app, check out the
For existing apps, follow these steps to begin using Angular Material.
-## Step 1: Install Angular Material
+## Step 1: Install Angular Material and Angular CDK
```bash
-npm install --save @angular/material
+npm install --save @angular/material @angular/cdk
+```
+
+A snapshot build with the latest changes from master is also available. Note that this snapshot build should not be considered stable and may break between releases.
+
+```bash
+npm install --save angular/material2-builds angular/cdk-builds
```
## Step 2: Animations
@@ -79,13 +85,14 @@ Whichever approach you use, be sure to import the Angular Material modules _afte
Including a theme is **required** to apply all of the core and theme styles to your application.
-To get started with a prebuilt theme, include the following in your app's index.html:
-
-```html
-
+To get started with a prebuilt theme, include one of Angular Material's prebuilt themes globally
+in your application. If you're using the Angular CLI, you can add this to your `styles.css`:
+```css
+@import "~@angular/material/prebuilt-themes/indigo-pink.css";
```
-Note that your app's project structure may have a different relative location for your node_modules.
+If you are not using the Angular CLI, you can include a prebuilt theme via a `` element in
+your `index.html`.
For more information on theming and instructions on how to create a custom theme, see the
[theming guide](./theming.md).
@@ -142,6 +149,6 @@ System.config({
```
-## Sample Angular Material projects
-- [Material Sample App](https://github.com/jelbourn/material2-app)
-- [Angular Connect 2016 Demo](https://github.com/kara/leashed-in)
+## Example Angular Material projects
+- [material.angular.io](https://material.angular.io) -
+We build our own documentation with Angular Material!
diff --git a/package-lock.json b/package-lock.json
index 46a7ae2b4162..8e320be01cf2 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -69,9 +69,9 @@
"dev": true
},
"@google-cloud/common": {
- "version": "0.13.3",
- "resolved": "https://registry.npmjs.org/@google-cloud/common/-/common-0.13.3.tgz",
- "integrity": "sha1-1z7j+lEfKf+8xEZniYaFcJ6f7Iw=",
+ "version": "0.13.4",
+ "resolved": "https://registry.npmjs.org/@google-cloud/common/-/common-0.13.4.tgz",
+ "integrity": "sha1-dbt/YJMc/J2U2gtdQIlQ0Lvw6Xk=",
"dev": true
},
"@google-cloud/functions-emulator": {
@@ -81,6 +81,13 @@
"dev": true,
"optional": true,
"dependencies": {
+ "@google-cloud/storage": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/@google-cloud/storage/-/storage-1.1.1.tgz",
+ "integrity": "sha1-ZZC1zm53lVbJzHBDvWRJ1rwHgd4=",
+ "dev": true,
+ "optional": true
+ },
"ajv": {
"version": "5.1.6",
"resolved": "https://registry.npmjs.org/ajv/-/ajv-5.1.6.tgz",
@@ -88,6 +95,13 @@
"dev": true,
"optional": true
},
+ "ansi-regex": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz",
+ "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=",
+ "dev": true,
+ "optional": true
+ },
"camelcase": {
"version": "4.1.0",
"resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz",
@@ -95,6 +109,13 @@
"dev": true,
"optional": true
},
+ "caseless": {
+ "version": "0.11.0",
+ "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.11.0.tgz",
+ "integrity": "sha1-cVuW6phBWTzDMGeSP17GDr2k99c=",
+ "dev": true,
+ "optional": true
+ },
"cliui": {
"version": "3.2.0",
"resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz",
@@ -125,6 +146,34 @@
"dev": true,
"optional": true
},
+ "gcp-metadata": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/gcp-metadata/-/gcp-metadata-0.1.0.tgz",
+ "integrity": "sha1-q+IfHqMk3Qs0o/BsqBdj+x7uN9k=",
+ "dev": true,
+ "optional": true
+ },
+ "gcs-resumable-upload": {
+ "version": "0.7.7",
+ "resolved": "https://registry.npmjs.org/gcs-resumable-upload/-/gcs-resumable-upload-0.7.7.tgz",
+ "integrity": "sha1-2clyWvlwu8hsvwr+8kBtwizpGGQ=",
+ "dev": true,
+ "optional": true
+ },
+ "google-auto-auth": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/google-auto-auth/-/google-auto-auth-0.6.1.tgz",
+ "integrity": "sha1-wF2CDpRUc57PKKiJLuqz0WJPLLM=",
+ "dev": true,
+ "optional": true
+ },
+ "har-validator": {
+ "version": "2.0.6",
+ "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-2.0.6.tgz",
+ "integrity": "sha1-zcvAgYgmWtEZtqWnyKtw7s+10n0=",
+ "dev": true,
+ "optional": true
+ },
"load-json-file": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-2.0.0.tgz",
@@ -146,6 +195,13 @@
"dev": true,
"optional": true
},
+ "qs": {
+ "version": "6.3.2",
+ "resolved": "https://registry.npmjs.org/qs/-/qs-6.3.2.tgz",
+ "integrity": "sha1-51vV9uJoEioqDgvaYwslUMFmUCw=",
+ "dev": true,
+ "optional": true
+ },
"read-pkg": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-2.0.0.tgz",
@@ -160,10 +216,33 @@
"dev": true,
"optional": true
},
+ "retry-request": {
+ "version": "1.3.2",
+ "resolved": "https://registry.npmjs.org/retry-request/-/retry-request-1.3.2.tgz",
+ "integrity": "sha1-Wa0k5x+K4/MS1fe0vPRnpeWle9Y=",
+ "dev": true,
+ "optional": true,
+ "dependencies": {
+ "node-uuid": {
+ "version": "1.4.8",
+ "resolved": "https://registry.npmjs.org/node-uuid/-/node-uuid-1.4.8.tgz",
+ "integrity": "sha1-sEDrCSOWivq/jTL7HxfxFn/auQc=",
+ "dev": true,
+ "optional": true
+ },
+ "request": {
+ "version": "2.76.0",
+ "resolved": "https://registry.npmjs.org/request/-/request-2.76.0.tgz",
+ "integrity": "sha1-vkRQWv73A2CgQ2lVEGvjlF2VVg4=",
+ "dev": true,
+ "optional": true
+ }
+ }
+ },
"string-width": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.0.0.tgz",
- "integrity": "sha1-Y1xUNsxypuDDh87KJ41OLuxSaH4=",
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.0.tgz",
+ "integrity": "sha1-AwZkVh/BRslCPsfZeP4kV0N/5tA=",
"dev": true,
"optional": true,
"dependencies": {
@@ -173,6 +252,13 @@
"integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=",
"dev": true,
"optional": true
+ },
+ "strip-ansi": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz",
+ "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=",
+ "dev": true,
+ "optional": true
}
}
},
@@ -190,6 +276,13 @@
"dev": true,
"optional": true
},
+ "tunnel-agent": {
+ "version": "0.4.3",
+ "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.4.3.tgz",
+ "integrity": "sha1-Y3PbdpCf5XDgjXNYM2Xtgop07us=",
+ "dev": true,
+ "optional": true
+ },
"uuid": {
"version": "3.0.1",
"resolved": "https://registry.npmjs.org/uuid/-/uuid-3.0.1.tgz",
@@ -207,9 +300,9 @@
}
},
"@google-cloud/storage": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/@google-cloud/storage/-/storage-1.1.1.tgz",
- "integrity": "sha1-ZZC1zm53lVbJzHBDvWRJ1rwHgd4=",
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/@google-cloud/storage/-/storage-1.2.0.tgz",
+ "integrity": "sha1-dO6TaJbaXkU8NBzygEQ0LBqazrc=",
"dev": true
},
"@types/chalk": {
@@ -267,9 +360,9 @@
"dev": true
},
"@types/node": {
- "version": "7.0.32",
- "resolved": "https://registry.npmjs.org/@types/node/-/node-7.0.32.tgz",
- "integrity": "sha512-7+0Ai8r8Xt6NNVM0Eo+XSqiZsBUYXg2yrCwyBhQzSfFHTGQWzFv/pk9106vPR8HWjKmGK+zzUj244POs4xfO2g==",
+ "version": "7.0.33",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-7.0.33.tgz",
+ "integrity": "sha512-8fVvl6Yyk3jZvSYxRMS9/AmZJ5RXCOP9N4xSlykyBViVESu751pxHYTN14Embn1Fem78YwEHdC7p7KGQQpwunw==",
"dev": true
},
"@types/orchestrator": {
@@ -290,12 +383,6 @@
"integrity": "sha1-atD3ODE24TklMi5p/EHbd7MLIHU=",
"dev": true
},
- "@types/rx": {
- "version": "2.5.33",
- "resolved": "https://registry.npmjs.org/@types/rx/-/rx-2.5.33.tgz",
- "integrity": "sha1-GGf0rJjldCj+grKE0agMnB9hG7c=",
- "dev": true
- },
"@types/selenium-webdriver": {
"version": "2.53.42",
"resolved": "https://registry.npmjs.org/@types/selenium-webdriver/-/selenium-webdriver-2.53.42.tgz",
@@ -526,9 +613,9 @@
"dev": true
},
"arr-flatten": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.0.3.tgz",
- "integrity": "sha1-onTthawIhJtr14R8RYB0XcUa37E=",
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz",
+ "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==",
"dev": true
},
"array-differ": {
@@ -653,9 +740,9 @@
"dev": true
},
"async": {
- "version": "2.4.1",
- "resolved": "https://registry.npmjs.org/async/-/async-2.4.1.tgz",
- "integrity": "sha1-YqVrJ5yYoR0JhwlqAcw+6463u9c=",
+ "version": "2.5.0",
+ "resolved": "https://registry.npmjs.org/async/-/async-2.5.0.tgz",
+ "integrity": "sha512-e+lJAJeNWuPCNyxZKOBdaJGyLGHugXVQtrAwtuAe2vhxTYxFTKE73p8JuTmdH0qdQZtDvI4dhJwjZc5zsfIsYw==",
"dev": true
},
"async-each": {
@@ -701,9 +788,9 @@
"dev": true
},
"axe-webdriverjs": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/axe-webdriverjs/-/axe-webdriverjs-1.1.2.tgz",
- "integrity": "sha1-YURZFaM6D2lkzSNl34FUbOlKtBs=",
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/axe-webdriverjs/-/axe-webdriverjs-1.1.3.tgz",
+ "integrity": "sha1-lIqXLk0OJSa0HGCptEBkkyu24G8=",
"dev": true
},
"babel-code-frame": {
@@ -837,15 +924,7 @@
"version": "1.17.2",
"resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.17.2.tgz",
"integrity": "sha1-+IkqvI+eYn1Crtr7yma/WrmRBO4=",
- "dev": true,
- "dependencies": {
- "qs": {
- "version": "6.4.0",
- "resolved": "https://registry.npmjs.org/qs/-/qs-6.4.0.tgz",
- "integrity": "sha1-E+JtKK1rD/qpExLNO/cI7TUecjM=",
- "dev": true
- }
- }
+ "dev": true
},
"boom": {
"version": "2.10.1",
@@ -906,9 +985,9 @@
"dev": true
},
"browserstacktunnel-wrapper": {
- "version": "1.4.2",
- "resolved": "https://registry.npmjs.org/browserstacktunnel-wrapper/-/browserstacktunnel-wrapper-1.4.2.tgz",
- "integrity": "sha1-ZZj7fXhLb/NI4998EEsNnCfqUnU=",
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/browserstacktunnel-wrapper/-/browserstacktunnel-wrapper-2.0.1.tgz",
+ "integrity": "sha1-/+GRDW45/oZhgYPoJmkAQa9T7a4=",
"dev": true
},
"buffer-crc32": {
@@ -991,9 +1070,9 @@
"dev": true
},
"caniuse-db": {
- "version": "1.0.30000693",
- "resolved": "https://registry.npmjs.org/caniuse-db/-/caniuse-db-1.0.30000693.tgz",
- "integrity": "sha1-hRDnqasErcyiOl3O+jTfnSjBziA=",
+ "version": "1.0.30000697",
+ "resolved": "https://registry.npmjs.org/caniuse-db/-/caniuse-db-1.0.30000697.tgz",
+ "integrity": "sha1-IM5qnO7vTvShXcjoDy6PuQSejXc=",
"dev": true
},
"canonical-path": {
@@ -1009,9 +1088,9 @@
"dev": true
},
"caseless": {
- "version": "0.11.0",
- "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.11.0.tgz",
- "integrity": "sha1-cVuW6phBWTzDMGeSP17GDr2k99c=",
+ "version": "0.12.0",
+ "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz",
+ "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=",
"dev": true
},
"catharsis": {
@@ -1069,9 +1148,9 @@
"dev": true
},
"clean-css": {
- "version": "4.1.4",
- "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-4.1.4.tgz",
- "integrity": "sha1-7siBHbJ0V+AHjYypIfqBty+oK/Q=",
+ "version": "4.1.5",
+ "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-4.1.5.tgz",
+ "integrity": "sha1-0JqHoCpTdRF1iXlq52oGPKzbVBo=",
"dev": true
},
"cli-boxes": {
@@ -1171,12 +1250,24 @@
"integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=",
"dev": true
},
+ "color-convert": {
+ "version": "1.9.0",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.0.tgz",
+ "integrity": "sha1-Gsz5fdc5uYO/mU1W/sj5WFNkG3o=",
+ "dev": true
+ },
"color-diff": {
"version": "0.1.7",
"resolved": "https://registry.npmjs.org/color-diff/-/color-diff-0.1.7.tgz",
"integrity": "sha1-bbeM2UgqjkWdQIIer0tQMoPcuOI=",
"dev": true
},
+ "color-name": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.2.tgz",
+ "integrity": "sha1-XIq3K2S9IhXWF66VWeuxSEdc+Y0=",
+ "dev": true
+ },
"colorguard": {
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/colorguard/-/colorguard-1.2.0.tgz",
@@ -1235,9 +1326,9 @@
"dev": true
},
"commander": {
- "version": "2.9.0",
- "resolved": "https://registry.npmjs.org/commander/-/commander-2.9.0.tgz",
- "integrity": "sha1-nJkJQXbhIkDLItbFFGCYQA/g99Q=",
+ "version": "2.11.0",
+ "resolved": "https://registry.npmjs.org/commander/-/commander-2.11.0.tgz",
+ "integrity": "sha512-b0553uYA5YAEGgyYIGYROzKQ7X5RAqedkfjiZxwi0kL1g3bOaBNNZfYkzt/CL0umgD5wc9Jec2FbB98CjkMRvQ==",
"dev": true
},
"commondir": {
@@ -2268,9 +2359,9 @@
"dev": true
},
"electron-to-chromium": {
- "version": "1.3.14",
- "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.14.tgz",
- "integrity": "sha1-ZK8Pnv08PGrNV9cfg7Scp+6cS0M=",
+ "version": "1.3.15",
+ "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.15.tgz",
+ "integrity": "sha1-CDl5NIkcvPrrvRi4KpW1pIETg2k=",
"dev": true
},
"encodeurl": {
@@ -2616,16 +2707,7 @@
"resolved": "https://registry.npmjs.org/express/-/express-4.15.3.tgz",
"integrity": "sha1-urZdDwOqgMNYQIly/HAPkWlEtmI=",
"dev": true,
- "optional": true,
- "dependencies": {
- "qs": {
- "version": "6.4.0",
- "resolved": "https://registry.npmjs.org/qs/-/qs-6.4.0.tgz",
- "integrity": "sha1-E+JtKK1rD/qpExLNO/cI7TUecjM=",
- "dev": true,
- "optional": true
- }
- }
+ "optional": true
},
"express-session": {
"version": "1.11.3",
@@ -2866,107 +2948,128 @@
"dev": true,
"dependencies": {
"base64url": {
- "version": "https://registry.npmjs.org/base64url/-/base64url-2.0.0.tgz",
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/base64url/-/base64url-2.0.0.tgz",
"integrity": "sha1-6sFuA+oUOO/5Qj1puqNiYu0fcLs=",
"dev": true
},
"buffer-equal-constant-time": {
- "version": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz",
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz",
"integrity": "sha1-+OcRMvf/5uAaXJaXpMbz5I1cyBk=",
"dev": true
},
"dom-storage": {
- "version": "https://registry.npmjs.org/dom-storage/-/dom-storage-2.0.2.tgz",
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/dom-storage/-/dom-storage-2.0.2.tgz",
"integrity": "sha1-7RfL9oq9EOCu+BgnE+KXxeS1ALA=",
"dev": true
},
"ecdsa-sig-formatter": {
- "version": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.9.tgz",
+ "version": "1.0.9",
+ "resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.9.tgz",
"integrity": "sha1-S8kmJ07Dtau1AW5+HWCSGsJisqE=",
"dev": true
},
"faye-websocket": {
- "version": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.9.3.tgz",
+ "version": "0.9.3",
+ "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.9.3.tgz",
"integrity": "sha1-SCpQWw3wrmJrlphm0710DNuWLoM=",
"dev": true
},
"hoek": {
- "version": "https://registry.npmjs.org/hoek/-/hoek-2.16.3.tgz",
+ "version": "2.16.3",
+ "resolved": "https://registry.npmjs.org/hoek/-/hoek-2.16.3.tgz",
"integrity": "sha1-ILt0A9POo5jpHcRxCo/xuCdKJe0=",
"dev": true
},
"isemail": {
- "version": "https://registry.npmjs.org/isemail/-/isemail-1.2.0.tgz",
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/isemail/-/isemail-1.2.0.tgz",
"integrity": "sha1-vgPfjMPineTSxd9lASY/H6RZXpo=",
"dev": true
},
"joi": {
- "version": "https://registry.npmjs.org/joi/-/joi-6.10.1.tgz",
+ "version": "6.10.1",
+ "resolved": "https://registry.npmjs.org/joi/-/joi-6.10.1.tgz",
"integrity": "sha1-TVDDGAeRIgAP5fFq8f+OGRe3fgY=",
"dev": true
},
"jsonwebtoken": {
- "version": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-7.4.1.tgz",
+ "version": "7.4.1",
+ "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-7.4.1.tgz",
"integrity": "sha1-fKMk9SFfi+A5zTWmxFu4y3SkSPs=",
"dev": true
},
"jwa": {
- "version": "https://registry.npmjs.org/jwa/-/jwa-1.1.5.tgz",
+ "version": "1.1.5",
+ "resolved": "https://registry.npmjs.org/jwa/-/jwa-1.1.5.tgz",
"integrity": "sha1-oFUs4CIHQs1S4VN3SjKQXDDnVuU=",
"dev": true
},
"jws": {
- "version": "https://registry.npmjs.org/jws/-/jws-3.1.4.tgz",
+ "version": "3.1.4",
+ "resolved": "https://registry.npmjs.org/jws/-/jws-3.1.4.tgz",
"integrity": "sha1-+ei5M46KhHJ31kRLFGT2GIDgUKI=",
"dev": true
},
"lodash.once": {
- "version": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz",
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz",
"integrity": "sha1-DdOXEhPHxW34gJd9UEyI+0cal6w=",
"dev": true
},
"moment": {
- "version": "https://registry.npmjs.org/moment/-/moment-2.18.1.tgz",
+ "version": "2.18.1",
+ "resolved": "https://registry.npmjs.org/moment/-/moment-2.18.1.tgz",
"integrity": "sha1-w2GT3Tzhwu7SrbfIAtu8d6gbHA8=",
"dev": true
},
"ms": {
- "version": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
"integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=",
"dev": true
},
"promise-polyfill": {
- "version": "https://registry.npmjs.org/promise-polyfill/-/promise-polyfill-6.0.2.tgz",
+ "version": "6.0.2",
+ "resolved": "https://registry.npmjs.org/promise-polyfill/-/promise-polyfill-6.0.2.tgz",
"integrity": "sha1-2chtPcTcLfkBboiUbe/Wm0m0EWI=",
"dev": true
},
"safe-buffer": {
- "version": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.0.tgz",
- "integrity": "sha1-/kyEYDl/nqqqWOc75GJzQIpF4iM=",
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.0.tgz",
+ "integrity": "sha512-aSLEDudu6OoRr/2rU609gRmnYboRLxgDG1z9o2Q0os7236FwvcqIOO8r8U5JUEwivZOhDaKlFO4SbPTJYyBEyQ==",
"dev": true
},
"topo": {
- "version": "https://registry.npmjs.org/topo/-/topo-1.1.0.tgz",
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/topo/-/topo-1.1.0.tgz",
"integrity": "sha1-6ddRYV0buH3IZdsYL6HKCl71NtU=",
"dev": true
},
"websocket-driver": {
- "version": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.6.5.tgz",
+ "version": "0.6.5",
+ "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.6.5.tgz",
"integrity": "sha1-XLJVbOuF9Dc8bYI4qmkchFThOjY=",
"dev": true
},
"websocket-extensions": {
- "version": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.1.tgz",
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.1.tgz",
"integrity": "sha1-domUmcGEtu91Q3fC27DNbLVdKec=",
"dev": true
},
"xmlhttprequest": {
- "version": "https://registry.npmjs.org/xmlhttprequest/-/xmlhttprequest-1.8.0.tgz",
+ "version": "1.8.0",
+ "resolved": "https://registry.npmjs.org/xmlhttprequest/-/xmlhttprequest-1.8.0.tgz",
"integrity": "sha1-Z/4HXFwk/vOfnWX197f+dRcZaPw=",
"dev": true
},
"xtend": {
- "version": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz",
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz",
"integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=",
"dev": true
}
@@ -2979,107 +3082,128 @@
"dev": true,
"dependencies": {
"@types/jsonwebtoken": {
- "version": "https://registry.npmjs.org/@types/jsonwebtoken/-/jsonwebtoken-7.2.0.tgz",
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/@types/jsonwebtoken/-/jsonwebtoken-7.2.0.tgz",
"integrity": "sha1-D+0yyFAdqArJg50tQDplyD13b/0=",
"dev": true
},
"@types/node": {
- "version": "https://registry.npmjs.org/@types/node/-/node-7.0.18.tgz",
+ "version": "7.0.18",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-7.0.18.tgz",
"integrity": "sha1-zWfyfT3Az7dG8L3V4IbExdVb4XM=",
"dev": true
},
"base64url": {
- "version": "https://registry.npmjs.org/base64url/-/base64url-2.0.0.tgz",
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/base64url/-/base64url-2.0.0.tgz",
"integrity": "sha1-6sFuA+oUOO/5Qj1puqNiYu0fcLs=",
"dev": true
},
"buffer-equal-constant-time": {
- "version": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz",
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz",
"integrity": "sha1-+OcRMvf/5uAaXJaXpMbz5I1cyBk=",
"dev": true
},
"ecdsa-sig-formatter": {
- "version": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.9.tgz",
+ "version": "1.0.9",
+ "resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.9.tgz",
"integrity": "sha1-S8kmJ07Dtau1AW5+HWCSGsJisqE=",
"dev": true
},
"faye-websocket": {
- "version": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.9.3.tgz",
+ "version": "0.9.3",
+ "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.9.3.tgz",
"integrity": "sha1-SCpQWw3wrmJrlphm0710DNuWLoM=",
"dev": true
},
"hoek": {
- "version": "https://registry.npmjs.org/hoek/-/hoek-2.16.3.tgz",
+ "version": "2.16.3",
+ "resolved": "https://registry.npmjs.org/hoek/-/hoek-2.16.3.tgz",
"integrity": "sha1-ILt0A9POo5jpHcRxCo/xuCdKJe0=",
"dev": true
},
"isemail": {
- "version": "https://registry.npmjs.org/isemail/-/isemail-1.2.0.tgz",
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/isemail/-/isemail-1.2.0.tgz",
"integrity": "sha1-vgPfjMPineTSxd9lASY/H6RZXpo=",
"dev": true
},
"joi": {
- "version": "https://registry.npmjs.org/joi/-/joi-6.10.1.tgz",
+ "version": "6.10.1",
+ "resolved": "https://registry.npmjs.org/joi/-/joi-6.10.1.tgz",
"integrity": "sha1-TVDDGAeRIgAP5fFq8f+OGRe3fgY=",
"dev": true
},
"jsonwebtoken": {
- "version": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-7.1.9.tgz",
+ "version": "7.1.9",
+ "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-7.1.9.tgz",
"integrity": "sha1-hHgE5SWL7FqUmajcSl56O64I1Yo=",
"dev": true
},
"jwa": {
- "version": "https://registry.npmjs.org/jwa/-/jwa-1.1.5.tgz",
+ "version": "1.1.5",
+ "resolved": "https://registry.npmjs.org/jwa/-/jwa-1.1.5.tgz",
"integrity": "sha1-oFUs4CIHQs1S4VN3SjKQXDDnVuU=",
"dev": true
},
"jws": {
- "version": "https://registry.npmjs.org/jws/-/jws-3.1.4.tgz",
+ "version": "3.1.4",
+ "resolved": "https://registry.npmjs.org/jws/-/jws-3.1.4.tgz",
"integrity": "sha1-+ei5M46KhHJ31kRLFGT2GIDgUKI=",
"dev": true
},
"lodash.once": {
- "version": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz",
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz",
"integrity": "sha1-DdOXEhPHxW34gJd9UEyI+0cal6w=",
"dev": true
},
"moment": {
- "version": "https://registry.npmjs.org/moment/-/moment-2.18.1.tgz",
+ "version": "2.18.1",
+ "resolved": "https://registry.npmjs.org/moment/-/moment-2.18.1.tgz",
"integrity": "sha1-w2GT3Tzhwu7SrbfIAtu8d6gbHA8=",
"dev": true
},
"ms": {
- "version": "https://registry.npmjs.org/ms/-/ms-0.7.3.tgz",
+ "version": "0.7.3",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.3.tgz",
"integrity": "sha1-cIFVpeROM/X9D8U+gdDUCpG+H/8=",
"dev": true
},
"node-forge": {
- "version": "https://registry.npmjs.org/node-forge/-/node-forge-0.7.1.tgz",
+ "version": "0.7.1",
+ "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-0.7.1.tgz",
"integrity": "sha1-naYR6giYL0uUIGs760zJZl8gwwA=",
"dev": true
},
"safe-buffer": {
- "version": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.0.1.tgz",
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.0.1.tgz",
"integrity": "sha1-0mPKVGls2KMGtcplUekt5XkY++c=",
"dev": true
},
"topo": {
- "version": "https://registry.npmjs.org/topo/-/topo-1.1.0.tgz",
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/topo/-/topo-1.1.0.tgz",
"integrity": "sha1-6ddRYV0buH3IZdsYL6HKCl71NtU=",
"dev": true
},
"websocket-driver": {
- "version": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.6.5.tgz",
+ "version": "0.6.5",
+ "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.6.5.tgz",
"integrity": "sha1-XLJVbOuF9Dc8bYI4qmkchFThOjY=",
"dev": true
},
"websocket-extensions": {
- "version": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.1.tgz",
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.1.tgz",
"integrity": "sha1-domUmcGEtu91Q3fC27DNbLVdKec=",
"dev": true
},
"xtend": {
- "version": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz",
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz",
"integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=",
"dev": true
}
@@ -3118,17 +3242,20 @@
"dev": true,
"dependencies": {
"faye-websocket": {
- "version": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.9.3.tgz",
+ "version": "0.9.3",
+ "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.9.3.tgz",
"integrity": "sha1-SCpQWw3wrmJrlphm0710DNuWLoM=",
"dev": true,
"dependencies": {
"websocket-driver": {
- "version": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.5.2.tgz",
+ "version": "0.5.2",
+ "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.5.2.tgz",
"integrity": "sha1-jHyF2gcTtAYFVrTXHAF3XuEmnrk=",
"dev": true,
"dependencies": {
"websocket-extensions": {
- "version": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.1.tgz",
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.1.tgz",
"integrity": "sha1-domUmcGEtu91Q3fC27DNbLVdKec=",
"dev": true
}
@@ -3168,12 +3295,6 @@
"integrity": "sha1-Wyn2qB9wcXFC4J52W76rl7T4HiE=",
"dev": true
},
- "uuid": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.1.0.tgz",
- "integrity": "sha512-DIWtzUkw04M4k3bf1IcpS2tngXEL26YUD2M0tMDUpnUrz2hgzUBlD55a4FjdLGPvfHxS6uluGWvaVEqgBcVa+g==",
- "dev": true
- },
"winston": {
"version": "1.1.2",
"resolved": "https://registry.npmjs.org/winston/-/winston-1.1.2.tgz",
@@ -3327,9 +3448,9 @@
"dev": true,
"dependencies": {
"jsonfile": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-3.0.0.tgz",
- "integrity": "sha1-kufHRE5f/V+jLmqa6LhQNN+DR9A=",
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-3.0.1.tgz",
+ "integrity": "sha1-pezG9l9T9mLEQVx2daAzHQmS7GY=",
"dev": true
}
}
@@ -4036,31 +4157,75 @@
"dev": true
},
"gcp-metadata": {
- "version": "0.1.0",
- "resolved": "https://registry.npmjs.org/gcp-metadata/-/gcp-metadata-0.1.0.tgz",
- "integrity": "sha1-q+IfHqMk3Qs0o/BsqBdj+x7uN9k=",
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/gcp-metadata/-/gcp-metadata-0.2.0.tgz",
+ "integrity": "sha1-Ytr8pl86YxvIzi7Dt3Zh9fk4ego=",
+ "dev": true
+ },
+ "gcs-resumable-upload": {
+ "version": "0.8.0",
+ "resolved": "https://registry.npmjs.org/gcs-resumable-upload/-/gcs-resumable-upload-0.8.0.tgz",
+ "integrity": "sha1-023swVIzRGCC249J4hAndE80+CQ=",
"dev": true,
"dependencies": {
- "request": {
- "version": "2.76.0",
- "resolved": "https://registry.npmjs.org/request/-/request-2.76.0.tgz",
- "integrity": "sha1-vkRQWv73A2CgQ2lVEGvjlF2VVg4=",
+ "caseless": {
+ "version": "0.11.0",
+ "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.11.0.tgz",
+ "integrity": "sha1-cVuW6phBWTzDMGeSP17GDr2k99c=",
+ "dev": true
+ },
+ "gcp-metadata": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/gcp-metadata/-/gcp-metadata-0.1.0.tgz",
+ "integrity": "sha1-q+IfHqMk3Qs0o/BsqBdj+x7uN9k=",
+ "dev": true
+ },
+ "google-auto-auth": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/google-auto-auth/-/google-auto-auth-0.6.1.tgz",
+ "integrity": "sha1-wF2CDpRUc57PKKiJLuqz0WJPLLM=",
+ "dev": true
+ },
+ "har-validator": {
+ "version": "2.0.6",
+ "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-2.0.6.tgz",
+ "integrity": "sha1-zcvAgYgmWtEZtqWnyKtw7s+10n0=",
+ "dev": true
+ },
+ "node-uuid": {
+ "version": "1.4.8",
+ "resolved": "https://registry.npmjs.org/node-uuid/-/node-uuid-1.4.8.tgz",
+ "integrity": "sha1-sEDrCSOWivq/jTL7HxfxFn/auQc=",
+ "dev": true
+ },
+ "qs": {
+ "version": "6.3.2",
+ "resolved": "https://registry.npmjs.org/qs/-/qs-6.3.2.tgz",
+ "integrity": "sha1-51vV9uJoEioqDgvaYwslUMFmUCw=",
"dev": true
},
"retry-request": {
"version": "1.3.2",
"resolved": "https://registry.npmjs.org/retry-request/-/retry-request-1.3.2.tgz",
"integrity": "sha1-Wa0k5x+K4/MS1fe0vPRnpeWle9Y=",
+ "dev": true,
+ "dependencies": {
+ "request": {
+ "version": "2.76.0",
+ "resolved": "https://registry.npmjs.org/request/-/request-2.76.0.tgz",
+ "integrity": "sha1-vkRQWv73A2CgQ2lVEGvjlF2VVg4=",
+ "dev": true
+ }
+ }
+ },
+ "tunnel-agent": {
+ "version": "0.4.3",
+ "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.4.3.tgz",
+ "integrity": "sha1-Y3PbdpCf5XDgjXNYM2Xtgop07us=",
"dev": true
}
}
},
- "gcs-resumable-upload": {
- "version": "0.7.7",
- "resolved": "https://registry.npmjs.org/gcs-resumable-upload/-/gcs-resumable-upload-0.7.7.tgz",
- "integrity": "sha1-2clyWvlwu8hsvwr+8kBtwizpGGQ=",
- "dev": true
- },
"generate-function": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/generate-function/-/generate-function-2.0.0.tgz",
@@ -4151,7 +4316,7 @@
"glob": {
"version": "7.1.2",
"resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz",
- "integrity": "sha1-wZyd+aAocC1nhhI4SmVSQExjbRU=",
+ "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==",
"dev": true
},
"glob-base": {
@@ -4363,9 +4528,9 @@
"dev": true
},
"google-auto-auth": {
- "version": "0.6.1",
- "resolved": "https://registry.npmjs.org/google-auto-auth/-/google-auto-auth-0.6.1.tgz",
- "integrity": "sha1-wF2CDpRUc57PKKiJLuqz0WJPLLM=",
+ "version": "0.7.1",
+ "resolved": "https://registry.npmjs.org/google-auto-auth/-/google-auto-auth-0.7.1.tgz",
+ "integrity": "sha1-yCYERJEt2M7szYOHYdVvRik3vQI=",
"dev": true
},
"google-closure-compiler": {
@@ -5421,9 +5586,9 @@
}
},
"gulp-clean-css": {
- "version": "3.4.2",
- "resolved": "https://registry.npmjs.org/gulp-clean-css/-/gulp-clean-css-3.4.2.tgz",
- "integrity": "sha1-BDh+F6iKoPKdiO2vyhZAPbsQbV0=",
+ "version": "3.5.0",
+ "resolved": "https://registry.npmjs.org/gulp-clean-css/-/gulp-clean-css-3.5.0.tgz",
+ "integrity": "sha1-1D50fEGVeZXsSbuWEvhitkMp8bA=",
"dev": true
},
"gulp-cli": {
@@ -5847,9 +6012,9 @@
"dev": true
},
"har-validator": {
- "version": "2.0.6",
- "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-2.0.6.tgz",
- "integrity": "sha1-zcvAgYgmWtEZtqWnyKtw7s+10n0=",
+ "version": "4.2.1",
+ "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-4.2.1.tgz",
+ "integrity": "sha1-M0gdDxu/9gDdID11gSpqX7oALio=",
"dev": true
},
"has-ansi": {
@@ -5891,16 +6056,16 @@
"dev": true
},
"has-symbol-support-x": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/has-symbol-support-x/-/has-symbol-support-x-1.2.0.tgz",
- "integrity": "sha1-5iTq1RkMNbNOTimTRN/2Q32wLOI=",
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/has-symbol-support-x/-/has-symbol-support-x-1.3.0.tgz",
+ "integrity": "sha512-kLtS+N9qwz+Buc6TUfcW5iGb59hLLr5qfxTACi/0uGpH1u5NMNWsdU57KoYRBywvPykeRmu5qfB5x0chpDSWlg==",
"dev": true,
"optional": true
},
"has-to-string-tag-x": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/has-to-string-tag-x/-/has-to-string-tag-x-1.2.0.tgz",
- "integrity": "sha1-xTbcTbvr4b6dKPYk/TIPeTEp/VM=",
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/has-to-string-tag-x/-/has-to-string-tag-x-1.3.0.tgz",
+ "integrity": "sha512-Fu9Nwv8/VNJMvKjkldzXHO+yeX+TCelwUQ9dGW2LrAfHfHi6zVqQt+Qjilf0qGHvpl6Fap6o8aDhWhMt5hY/1g==",
"dev": true,
"optional": true
},
@@ -5959,9 +6124,9 @@
"dev": true
},
"hosted-git-info": {
- "version": "2.4.2",
- "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.4.2.tgz",
- "integrity": "sha1-AHa59GonBQbduq6lZJaJdGBhKmc=",
+ "version": "2.5.0",
+ "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.5.0.tgz",
+ "integrity": "sha512-pNgbURSuab90KbTqvRPsseaTxOJCZBD0a7t+haSN33piP9cCM4l0CqdzAif2hUqm716UovKB2ROmiabGAKVXyg==",
"dev": true
},
"html-encoding-sniffer": {
@@ -5976,18 +6141,24 @@
"integrity": "sha1-1zvD/0SJQkCIGM5gm/P7DqfvTrc=",
"dev": true,
"dependencies": {
+ "commander": {
+ "version": "2.9.0",
+ "resolved": "https://registry.npmjs.org/commander/-/commander-2.9.0.tgz",
+ "integrity": "sha1-nJkJQXbhIkDLItbFFGCYQA/g99Q=",
+ "dev": true
+ },
"uglify-js": {
- "version": "3.0.19",
- "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.0.19.tgz",
- "integrity": "sha512-/MRnHKKJemMVs4iKmiUZY8S0knDRFOJI9Ein/rdn0w9hrK8ELdj+6bjWmHeBjSDPGUWxi/4960A+GAWZbzHvDA==",
+ "version": "3.0.23",
+ "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.0.23.tgz",
+ "integrity": "sha512-miLHbO2QcdQGxL/q1wLcUr6TGIRHhMnpKyywUbAdZRkJMqCeZCDmBsgYu1Wlj26xHBXN+sU5tHaWh38QsN208g==",
"dev": true
}
}
},
"html-tags": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/html-tags/-/html-tags-1.2.0.tgz",
- "integrity": "sha1-x43mW1Zjqll5id0rerSSANfk25g=",
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/html-tags/-/html-tags-2.0.0.tgz",
+ "integrity": "sha1-ELMKOGCF9Dzt41PMj6fLDe7qZos=",
"dev": true
},
"htmlparser2": {
@@ -6057,6 +6228,12 @@
"integrity": "sha1-trvgsGdLnXGXCMo43owjfLUmw9E=",
"dev": true
},
+ "commander": {
+ "version": "2.9.0",
+ "resolved": "https://registry.npmjs.org/commander/-/commander-2.9.0.tgz",
+ "integrity": "sha1-nJkJQXbhIkDLItbFFGCYQA/g99Q=",
+ "dev": true
+ },
"mkdirp": {
"version": "0.3.5",
"resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.3.5.tgz",
@@ -6151,9 +6328,9 @@
"optional": true
},
"irregular-plurals": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/irregular-plurals/-/irregular-plurals-1.2.0.tgz",
- "integrity": "sha1-OPKZg0uowAwwvpxVThNyaXUv86w=",
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/irregular-plurals/-/irregular-plurals-1.3.0.tgz",
+ "integrity": "sha512-njf5A+Mxb3kojuHd1DzISjjIl+XhyzovXEOyPPSzdQozq/Lf2tN27mOrAAsxEPZxpn6I4MGzs1oo9TxXxPFpaA==",
"dev": true
},
"is": {
@@ -6315,9 +6492,9 @@
"dev": true,
"dependencies": {
"isobject": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.0.tgz",
- "integrity": "sha1-OVZSF/NmF4nooKDAgNX35rxG4aA=",
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz",
+ "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=",
"dev": true
}
}
@@ -6523,9 +6700,9 @@
}
},
"isurl": {
- "version": "1.0.0-alpha6",
- "resolved": "https://registry.npmjs.org/isurl/-/isurl-1.0.0-alpha6.tgz",
- "integrity": "sha1-nfC4R3hmqkJdBGvo+7Qp5ktbiRU=",
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/isurl/-/isurl-1.0.0.tgz",
+ "integrity": "sha512-1P/yWsxPlDtn7QeRD+ULKQPaIaN6yF368GZ2vDfv0AL0NwpStafjWCDDdn0k8wgFMWpVAqG7oJhxHnlud42i9w==",
"dev": true,
"optional": true
},
@@ -6572,9 +6749,9 @@
"dev": true
},
"js-tokens": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.1.tgz",
- "integrity": "sha1-COnxMkhKLEWjCQfp3E1VZ7fxFNc=",
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz",
+ "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=",
"dev": true
},
"js-yaml": {
@@ -6625,9 +6802,9 @@
"dev": true
},
"json-schema-traverse": {
- "version": "0.3.0",
- "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.3.0.tgz",
- "integrity": "sha1-ABbAscoe/kbUTTdUG838Gdz64Ns=",
+ "version": "0.3.1",
+ "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz",
+ "integrity": "sha1-NJptRMU6Ud6JtAgFxdXlm0F9M0A=",
"dev": true,
"optional": true
},
@@ -6794,23 +6971,15 @@
}
},
"karma-browserstack-launcher": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/karma-browserstack-launcher/-/karma-browserstack-launcher-1.2.0.tgz",
- "integrity": "sha1-rPpTSDW6WQBB7vAJwRaaIZEgu1s=",
- "dev": true,
- "dependencies": {
- "q": {
- "version": "1.4.1",
- "resolved": "https://registry.npmjs.org/q/-/q-1.4.1.tgz",
- "integrity": "sha1-VXBbzZPF82c1MMLCy8DCs63cKG4=",
- "dev": true
- }
- }
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/karma-browserstack-launcher/-/karma-browserstack-launcher-1.3.0.tgz",
+ "integrity": "sha512-LrPf5sU/GISkEElWyoy06J8x0c8BcOjjOwf61Wqu6M0aWQu0Eoqm9yh3xON64/ByST/CEr0GsWiREQ/EIEMd4Q==",
+ "dev": true
},
"karma-chrome-launcher": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/karma-chrome-launcher/-/karma-chrome-launcher-2.1.1.tgz",
- "integrity": "sha1-IWh5xorATY1RQOmWGboEtZr9Rs8=",
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/karma-chrome-launcher/-/karma-chrome-launcher-2.2.0.tgz",
+ "integrity": "sha512-uf/ZVpAabDBPvdPdveyk1EPgbnloPvFFGgmRhYLTDH7gEB4nZdSBk8yTU47w1g/drLSx5uMOkjKk7IWKfWg/+w==",
"dev": true
},
"karma-coverage": {
@@ -7445,9 +7614,9 @@
}
},
"mathml-tag-names": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/mathml-tag-names/-/mathml-tag-names-2.0.0.tgz",
- "integrity": "sha1-7uYVESorEn5w9VjWnJ6+FAdlA9c=",
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/mathml-tag-names/-/mathml-tag-names-2.0.1.tgz",
+ "integrity": "sha1-jUEmgWi/htEQK5gQnijlMeejRXg=",
"dev": true
},
"media-typer": {
@@ -7497,9 +7666,9 @@
"dev": true
},
"merge2": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.0.3.tgz",
- "integrity": "sha1-+kT4siYmFaty8ICKQB1HinDjlNs=",
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.1.0.tgz",
+ "integrity": "sha1-mfsys16frYQBRgBOE6VrdUmlJNs=",
"dev": true
},
"methmeth": {
@@ -7877,12 +8046,6 @@
"integrity": "sha1-WuVUHQJGRdMqWPzdyc7s6nrjrC8=",
"dev": true
},
- "node-uuid": {
- "version": "1.4.8",
- "resolved": "https://registry.npmjs.org/node-uuid/-/node-uuid-1.4.8.tgz",
- "integrity": "sha1-sEDrCSOWivq/jTL7HxfxFn/auQc=",
- "dev": true
- },
"nopt": {
"version": "3.0.6",
"resolved": "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz",
@@ -7890,9 +8053,9 @@
"dev": true
},
"normalize-package-data": {
- "version": "2.3.8",
- "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.3.8.tgz",
- "integrity": "sha1-2Bntoqne29H/pWPqQHHZNngilbs=",
+ "version": "2.4.0",
+ "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.4.0.tgz",
+ "integrity": "sha512-9jjUFbTPfEy3R/ad/2oNbKtW9Hgovl5O1FvFWKkKblNXoN/Oou6+9+KKohPK13Yc3/TyunyWhJp6gvRNR/PPAw==",
"dev": true
},
"normalize-path": {
@@ -7921,9 +8084,9 @@
"optional": true
},
"npmlog": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.0.tgz",
- "integrity": "sha1-3Fm+6F9k8A7UJO+yrweD3yXRwLU=",
+ "version": "4.1.2",
+ "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz",
+ "integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==",
"dev": true
},
"null-check": {
@@ -8013,9 +8176,9 @@
"dev": true
},
"isobject": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.0.tgz",
- "integrity": "sha1-OVZSF/NmF4nooKDAgNX35rxG4aA=",
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz",
+ "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=",
"dev": true
}
}
@@ -8196,8 +8359,7 @@
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz",
"integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=",
- "dev": true,
- "optional": true
+ "dev": true
},
"p-limit": {
"version": "1.1.0",
@@ -8214,9 +8376,9 @@
"optional": true
},
"p-timeout": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-1.1.1.tgz",
- "integrity": "sha1-0o6f35bjKIhvv/B4+IatFYxTv20=",
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-1.2.0.tgz",
+ "integrity": "sha1-mCD5lDTFgXhotPNICe5SkWYNW2w=",
"dev": true,
"optional": true
},
@@ -8295,9 +8457,9 @@
"dev": true,
"dependencies": {
"@types/node": {
- "version": "6.0.78",
- "resolved": "https://registry.npmjs.org/@types/node/-/node-6.0.78.tgz",
- "integrity": "sha512-+vD6E8ixntRzzZukoF3uP1iV+ZjVN3koTcaeK+BEoc/kSfGbLDIGC7RmCaUgVpUfN6cWvfczFRERCyKM9mkvXg==",
+ "version": "6.0.79",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-6.0.79.tgz",
+ "integrity": "sha512-7F3/P6MkTPA0QxOstRqfcnoReCUy5V/QG92cyBoZSPnqdX44L8TtNELSVfN56gAttm3YWj9cEi8FRIPVq0WmeQ==",
"dev": true
}
}
@@ -8651,9 +8813,9 @@
"dev": true,
"dependencies": {
"@types/node": {
- "version": "6.0.78",
- "resolved": "https://registry.npmjs.org/@types/node/-/node-6.0.78.tgz",
- "integrity": "sha512-+vD6E8ixntRzzZukoF3uP1iV+ZjVN3koTcaeK+BEoc/kSfGbLDIGC7RmCaUgVpUfN6cWvfczFRERCyKM9mkvXg==",
+ "version": "6.0.79",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-6.0.79.tgz",
+ "integrity": "sha512-7F3/P6MkTPA0QxOstRqfcnoReCUy5V/QG92cyBoZSPnqdX44L8TtNELSVfN56gAttm3YWj9cEi8FRIPVq0WmeQ==",
"dev": true
},
"@types/q": {
@@ -8778,9 +8940,9 @@
"dev": true
},
"qs": {
- "version": "6.3.2",
- "resolved": "https://registry.npmjs.org/qs/-/qs-6.3.2.tgz",
- "integrity": "sha1-51vV9uJoEioqDgvaYwslUMFmUCw=",
+ "version": "6.4.0",
+ "resolved": "https://registry.npmjs.org/qs/-/qs-6.4.0.tgz",
+ "integrity": "sha1-E+JtKK1rD/qpExLNO/cI7TUecjM=",
"dev": true
},
"random-bytes": {
@@ -8867,9 +9029,9 @@
"dev": true
},
"readable-stream": {
- "version": "2.3.2",
- "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.2.tgz",
- "integrity": "sha1-WgTfBeT1f+Pw3Gj90R3FyXx+b00=",
+ "version": "2.3.3",
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.3.tgz",
+ "integrity": "sha512-m+qzzcn7KUxEmd1gMbchF+Y2eIUbieUaxkWtptyHywrX0rE8QEYqPC07Vuy4Wm32/xE16NcdBctb8S0Xe/5IeQ==",
"dev": true
},
"readdirp": {
@@ -8968,39 +9130,7 @@
"version": "2.81.0",
"resolved": "https://registry.npmjs.org/request/-/request-2.81.0.tgz",
"integrity": "sha1-xpKJRqDgbF+Nb4qTM0af/aRimKA=",
- "dev": true,
- "dependencies": {
- "caseless": {
- "version": "0.12.0",
- "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz",
- "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=",
- "dev": true
- },
- "har-validator": {
- "version": "4.2.1",
- "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-4.2.1.tgz",
- "integrity": "sha1-M0gdDxu/9gDdID11gSpqX7oALio=",
- "dev": true
- },
- "qs": {
- "version": "6.4.0",
- "resolved": "https://registry.npmjs.org/qs/-/qs-6.4.0.tgz",
- "integrity": "sha1-E+JtKK1rD/qpExLNO/cI7TUecjM=",
- "dev": true
- },
- "tunnel-agent": {
- "version": "0.6.0",
- "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz",
- "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=",
- "dev": true
- },
- "uuid": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.1.0.tgz",
- "integrity": "sha512-DIWtzUkw04M4k3bf1IcpS2tngXEL26YUD2M0tMDUpnUrz2hgzUBlD55a4FjdLGPvfHxS6uluGWvaVEqgBcVa+g==",
- "dev": true
- }
- }
+ "dev": true
},
"require-directory": {
"version": "2.1.1",
@@ -9182,9 +9312,9 @@
}
},
"rsvp": {
- "version": "3.5.0",
- "resolved": "https://registry.npmjs.org/rsvp/-/rsvp-3.5.0.tgz",
- "integrity": "sha1-pixXOkrk4d/QaX68YkLnnGgeqjQ=",
+ "version": "3.6.1",
+ "resolved": "https://registry.npmjs.org/rsvp/-/rsvp-3.6.1.tgz",
+ "integrity": "sha1-NPSnrChZ97rMj0l4nFYE8eJq5wI=",
"dev": true
},
"run-async": {
@@ -9206,9 +9336,9 @@
"dev": true
},
"rxjs": {
- "version": "5.4.1",
- "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-5.4.1.tgz",
- "integrity": "sha1-ti91fyeURdJloYpY+wpw3JDpFiY="
+ "version": "5.4.2",
+ "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-5.4.2.tgz",
+ "integrity": "sha1-KjI2/L8D31e64G/Wly/ZnlwI/Pc="
},
"safe-buffer": {
"version": "5.1.1",
@@ -9765,9 +9895,9 @@
"dev": true
},
"specificity": {
- "version": "0.3.0",
- "resolved": "https://registry.npmjs.org/specificity/-/specificity-0.3.0.tgz",
- "integrity": "sha1-MyRy1OXrWvIIIRcZM5mKa8Oxzm8=",
+ "version": "0.3.1",
+ "resolved": "https://registry.npmjs.org/specificity/-/specificity-0.3.1.tgz",
+ "integrity": "sha1-8bBoQkzjF64HR42V3jwhz4Xo1Wc=",
"dev": true
},
"split": {
@@ -9989,11 +10119,17 @@
}
},
"stylelint": {
- "version": "7.11.1",
- "resolved": "https://registry.npmjs.org/stylelint/-/stylelint-7.11.1.tgz",
- "integrity": "sha1-yBbGWLr32eXRZ9gic/6tN8l65J0=",
+ "version": "7.12.0",
+ "resolved": "https://registry.npmjs.org/stylelint/-/stylelint-7.12.0.tgz",
+ "integrity": "sha512-DpEYhVZnjrNIFmX7IkigvwoR0F5NLBqHOF3+ovJeKhnv+qCEOC5CI+tZ8FOCdQGytfnIa6hUItSYbwg1Dbipfw==",
"dev": true,
"dependencies": {
+ "ansi-regex": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz",
+ "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=",
+ "dev": true
+ },
"balanced-match": {
"version": "0.4.2",
"resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-0.4.2.tgz",
@@ -10025,9 +10161,15 @@
"dev": true
},
"string-width": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.0.0.tgz",
- "integrity": "sha1-Y1xUNsxypuDDh87KJ41OLuxSaH4=",
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.0.tgz",
+ "integrity": "sha1-AwZkVh/BRslCPsfZeP4kV0N/5tA=",
+ "dev": true
+ },
+ "strip-ansi": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz",
+ "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=",
"dev": true
}
}
@@ -10125,6 +10267,12 @@
"integrity": "sha1-j5LFFUgr1oMbfJMBPnD4dVLHz1o=",
"dev": true
},
+ "uuid": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/uuid/-/uuid-2.0.3.tgz",
+ "integrity": "sha1-Z+LoY3lyFVMN/zGOW/nc6/1Hsho=",
+ "dev": true
+ },
"write-file-atomic": {
"version": "1.3.4",
"resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-1.3.4.tgz",
@@ -10192,6 +10340,12 @@
"integrity": "sha1-qBFsEz+sLGH0pCCrbN9cTWHw5DU=",
"dev": true,
"dependencies": {
+ "ansi-regex": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz",
+ "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=",
+ "dev": true
+ },
"is-fullwidth-code-point": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz",
@@ -10199,9 +10353,15 @@
"dev": true
},
"string-width": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.0.0.tgz",
- "integrity": "sha1-Y1xUNsxypuDDh87KJ41OLuxSaH4=",
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.0.tgz",
+ "integrity": "sha1-AwZkVh/BRslCPsfZeP4kV0N/5tA=",
+ "dev": true
+ },
+ "strip-ansi": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz",
+ "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=",
"dev": true
}
}
@@ -10450,10 +10610,36 @@
"dev": true
},
"ts-node": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-3.1.0.tgz",
- "integrity": "sha1-p17FrrSPMFixuUXbp2XxFQuoj4w=",
- "dev": true
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-3.2.0.tgz",
+ "integrity": "sha1-mBTwwBQXhJAM8S/vEZetS39NI9E=",
+ "dev": true,
+ "dependencies": {
+ "ansi-styles": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.1.0.tgz",
+ "integrity": "sha1-CcIC1ckX7CMYjKpcnLkXnNlUd1A=",
+ "dev": true
+ },
+ "chalk": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.0.1.tgz",
+ "integrity": "sha512-Mp+FXEI+FrwY/XYV45b2YD3E8i3HwnEAoFcM0qlZzq/RZ9RwWitt2Y/c7cqRAz70U7hfekqx6qNYthuKFO6K0g==",
+ "dev": true
+ },
+ "has-flag": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-2.0.0.tgz",
+ "integrity": "sha1-6CB68cx7MNRGzHC3NLXovhj4jVE=",
+ "dev": true
+ },
+ "supports-color": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.1.0.tgz",
+ "integrity": "sha1-kswUuz2tiSjKVlbDPhmhnyCvXHo=",
+ "dev": true
+ }
+ }
},
"tsconfig": {
"version": "6.0.0",
@@ -10515,15 +10701,15 @@
"dev": true
},
"tsutils": {
- "version": "2.4.0",
- "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-2.4.0.tgz",
- "integrity": "sha1-rUzm26Dlo+2934Ymt8oEB4IYn+o=",
+ "version": "2.5.1",
+ "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-2.5.1.tgz",
+ "integrity": "sha1-wgATkMee7Bpcz6esEtWZY5aD4M8=",
"dev": true
},
"tunnel-agent": {
- "version": "0.4.3",
- "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.4.3.tgz",
- "integrity": "sha1-Y3PbdpCf5XDgjXNYM2Xtgop07us=",
+ "version": "0.6.0",
+ "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz",
+ "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=",
"dev": true
},
"tweetnacl": {
@@ -10635,6 +10821,12 @@
"resolved": "https://registry.npmjs.org/async/-/async-0.2.10.tgz",
"integrity": "sha1-trvgsGdLnXGXCMo43owjfLUmw9E=",
"dev": true
+ },
+ "node-uuid": {
+ "version": "1.4.8",
+ "resolved": "https://registry.npmjs.org/node-uuid/-/node-uuid-1.4.8.tgz",
+ "integrity": "sha1-sEDrCSOWivq/jTL7HxfxFn/auQc=",
+ "dev": true
}
}
},
@@ -10750,6 +10942,12 @@
"integrity": "sha1-84sK6B03R9YoAB9B2vxlKs5nHAo=",
"dev": true
},
+ "uuid": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/uuid/-/uuid-2.0.3.tgz",
+ "integrity": "sha1-Z+LoY3lyFVMN/zGOW/nc6/1Hsho=",
+ "dev": true
+ },
"write-file-atomic": {
"version": "1.3.4",
"resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-1.3.4.tgz",
@@ -10795,9 +10993,9 @@
"dev": true
},
"useragent": {
- "version": "2.1.13",
- "resolved": "https://registry.npmjs.org/useragent/-/useragent-2.1.13.tgz",
- "integrity": "sha1-u6Q+iqJNXOuDwpN0c+EC4h33TBA=",
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/useragent/-/useragent-2.2.0.tgz",
+ "integrity": "sha1-74X0GQPP0F4rqMEa5hJJx6a79mM=",
"dev": true,
"dependencies": {
"lru-cache": {
@@ -10837,9 +11035,9 @@
"dev": true
},
"uuid": {
- "version": "2.0.3",
- "resolved": "https://registry.npmjs.org/uuid/-/uuid-2.0.3.tgz",
- "integrity": "sha1-Z+LoY3lyFVMN/zGOW/nc6/1Hsho=",
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.1.0.tgz",
+ "integrity": "sha512-DIWtzUkw04M4k3bf1IcpS2tngXEL26YUD2M0tMDUpnUrz2hgzUBlD55a4FjdLGPvfHxS6uluGWvaVEqgBcVa+g==",
"dev": true
},
"v8flags": {
@@ -11002,6 +11200,12 @@
"integrity": "sha1-twnMAoCpw28J9FNr6CPIOKkEniU=",
"dev": true
},
+ "caseless": {
+ "version": "0.11.0",
+ "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.11.0.tgz",
+ "integrity": "sha1-cVuW6phBWTzDMGeSP17GDr2k99c=",
+ "dev": true
+ },
"compress-commons": {
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/compress-commons/-/compress-commons-1.2.0.tgz",
@@ -11020,6 +11224,12 @@
"integrity": "sha1-483TtN8xaN10494/u8t7KX/pCPQ=",
"dev": true
},
+ "har-validator": {
+ "version": "2.0.6",
+ "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-2.0.6.tgz",
+ "integrity": "sha1-zcvAgYgmWtEZtqWnyKtw7s+10n0=",
+ "dev": true
+ },
"lodash": {
"version": "4.16.2",
"resolved": "https://registry.npmjs.org/lodash/-/lodash-4.16.2.tgz",
@@ -11032,6 +11242,12 @@
"integrity": "sha1-VXBbzZPF82c1MMLCy8DCs63cKG4=",
"dev": true
},
+ "qs": {
+ "version": "6.3.2",
+ "resolved": "https://registry.npmjs.org/qs/-/qs-6.3.2.tgz",
+ "integrity": "sha1-51vV9uJoEioqDgvaYwslUMFmUCw=",
+ "dev": true
+ },
"request": {
"version": "2.79.0",
"resolved": "https://registry.npmjs.org/request/-/request-2.79.0.tgz",
@@ -11044,10 +11260,10 @@
"integrity": "sha1-NlSc8E7RrumyowwBQyUiONr5QBY=",
"dev": true
},
- "uuid": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.1.0.tgz",
- "integrity": "sha512-DIWtzUkw04M4k3bf1IcpS2tngXEL26YUD2M0tMDUpnUrz2hgzUBlD55a4FjdLGPvfHxS6uluGWvaVEqgBcVa+g==",
+ "tunnel-agent": {
+ "version": "0.4.3",
+ "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.4.3.tgz",
+ "integrity": "sha1-Y3PbdpCf5XDgjXNYM2Xtgop07us=",
"dev": true
},
"zip-stream": {
@@ -11161,7 +11377,7 @@
"wide-align": {
"version": "1.1.2",
"resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.2.tgz",
- "integrity": "sha1-Vx4PGwYEY268DfwhsDObvjE0FxA=",
+ "integrity": "sha512-ijDLlyQ7s6x1JgCLur53osjm/UXUYD9+0PbYKrBsYisYXzCxN+HC3mYDNy/dWdmf3AwqwU3CXwDCvsNgGK1S0w==",
"dev": true
},
"widest-line": {
@@ -11223,7 +11439,7 @@
"write-file-atomic": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-2.1.0.tgz",
- "integrity": "sha1-F2n0tVHu3OQZ8FBd6uLiZ2NULTc=",
+ "integrity": "sha512-0TZ20a+xcIl4u0+Mj5xDH2yOWdmQiXlKf9Hm+TgDXjTMsEYb+gDrmb8e8UNAzMCitX8NBqG4Z/FUQIyzv/R1JQ==",
"dev": true
},
"write-file-stdout": {
diff --git a/package.json b/package.json
index b94fa68f73ac..73239c656769 100644
--- a/package.json
+++ b/package.json
@@ -8,7 +8,7 @@
"url": "https://github.com/angular/material2.git"
},
"scripts": {
- "build": "gulp material:build-release:clean",
+ "build": "gulp :publish:build-releases",
"demo-app": "gulp serve:devapp",
"test": "gulp test",
"tslint": "gulp lint",
@@ -19,7 +19,7 @@
"docs": "gulp docs",
"api": "gulp api-docs"
},
- "version": "2.0.0-beta.7",
+ "version": "2.0.0-beta.8",
"license": "MIT",
"engines": {
"node": ">= 5.4.1 < 7"
@@ -55,7 +55,6 @@
"@types/minimist": "^1.2.0",
"@types/node": "^7.0.21",
"@types/run-sequence": "^0.0.29",
- "@types/rx": "2.5.33",
"autoprefixer": "^6.7.6",
"axe-core": "^2.2.1",
"axe-webdriverjs": "^1.1.1",
@@ -114,7 +113,7 @@
"stylelint": "^7.10.1",
"ts-node": "^3.0.4",
"tsconfig-paths": "^2.2.0",
- "tslint": "^5.2.0",
+ "tslint": "~5.4.3",
"typescript": "~2.2.1",
"uglify-js": "^2.8.14",
"web-animations-js": "^2.2.5"
diff --git a/scripts/ci/build-and-test.sh b/scripts/ci/build-and-test.sh
index 229a702f4a5c..f9a9fd15e932 100755
--- a/scripts/ci/build-and-test.sh
+++ b/scripts/ci/build-and-test.sh
@@ -1,5 +1,6 @@
#!/bin/bash
+# The script should immediately exit if any command in the script fails.
set -e
echo ""
diff --git a/scripts/ci/publish-artifacts.sh b/scripts/ci/publish-artifacts.sh
index b4be9e95bed1..cc7d49fd0cd5 100755
--- a/scripts/ci/publish-artifacts.sh
+++ b/scripts/ci/publish-artifacts.sh
@@ -3,6 +3,9 @@
# Script that runs after the testing stage of Travis passed.
# Build artifacts and docs content will be published to different repositories.
+# The script should immediately exit if any command in the script fails.
+set -e
+
# Go to the project root directory
cd $(dirname $0)/../..
diff --git a/scripts/deploy/deploy-dashboard.sh b/scripts/deploy/deploy-dashboard.sh
index 46203a81c362..5e499e55a0f7 100755
--- a/scripts/deploy/deploy-dashboard.sh
+++ b/scripts/deploy/deploy-dashboard.sh
@@ -1,5 +1,8 @@
#!/bin/bash
+# The script should immediately exit if any command in the script fails.
+set -e
+
# This script deploys the Dashboard App and their Cloud Functions to Firebase.
# Before the script installs all dependencies and builds the dashboard app in production.
diff --git a/scripts/deploy/deploy-screenshot-functions.sh b/scripts/deploy/deploy-screenshot-functions.sh
index 1aad23bda363..8e2f490c8ed4 100755
--- a/scripts/deploy/deploy-screenshot-functions.sh
+++ b/scripts/deploy/deploy-screenshot-functions.sh
@@ -1,5 +1,8 @@
#!/bin/bash
+# The script should immediately exit if any command in the script fails.
+set -e
+
# Go to the project root directory
cd $(dirname ${0})/../..
diff --git a/scripts/deploy/publish-build-artifacts.sh b/scripts/deploy/publish-build-artifacts.sh
index 8d3364c02eb2..77dd50d2e5e3 100755
--- a/scripts/deploy/publish-build-artifacts.sh
+++ b/scripts/deploy/publish-build-artifacts.sh
@@ -3,11 +3,18 @@
# Script to publish the build artifacts to a GitHub repository.
# Builds will be automatically published once new changes are made to the repository.
-set -e -o pipefail
+# The script should immediately exit if any command in the script fails.
+set -e
# Go to the project root directory
cd $(dirname ${0})/../..
+if [ -z ${MATERIAL2_BUILDS_TOKEN} ]; then
+ echo "Error: No access token for GitHub could be found." \
+ "Please set the environment variable 'MATERIAL2_BUILDS_TOKEN'."
+ exit 1
+fi
+
# Material packages that need to published.
PACKAGES=(cdk material)
REPOSITORIES=(cdk-builds material2-builds)
@@ -23,7 +30,7 @@ publishPackage() {
packageRepo=${2}
buildDir="dist/releases/${packageName}"
- buildVersion=$(sed -nE 's/^\s*"version": "(.*?)",$/\1/p' package.json)
+ buildVersion=$(node -pe "require('./package.json').version")
commitSha=$(git rev-parse --short HEAD)
commitAuthorName=$(git --no-pager show -s --format='%an' HEAD)
@@ -71,7 +78,7 @@ publishPackage() {
git tag "${buildVersion}-${commitSha}"
git push origin master --tags
- echo "Published artifacts for ${packageName} package."
+ echo "Published package artifacts for ${packageName}#${commitSha}."
}
for ((i = 0; i < ${#PACKAGES[@]}; i++)); do
diff --git a/scripts/deploy/publish-docs-content.sh b/scripts/deploy/publish-docs-content.sh
index 3778cc6254d9..26f3686651b2 100755
--- a/scripts/deploy/publish-docs-content.sh
+++ b/scripts/deploy/publish-docs-content.sh
@@ -3,8 +3,17 @@
# Publish material2 docs assets to the material2-docs-content repo
# material.angular.io will pull from this assets repo to get the latest docs
+# The script should immediately exit if any command in the script fails.
+set -e
+
cd "$(dirname $0)/../../"
+if [ -z ${MATERIAL2_DOCS_CONTENT_TOKEN} ]; then
+ echo "Error: No access token for GitHub could be found." \
+ "Please set the environment variable 'MATERIAL2_DOCS_CONTENT_TOKEN'."
+ exit 1
+fi
+
docsPath="./dist/docs"
packagePath="./dist/releases/material-examples"
repoPath="/tmp/material2-docs-content"
diff --git a/src/cdk/a11y/activedescendant-key-manager.ts b/src/cdk/a11y/activedescendant-key-manager.ts
new file mode 100644
index 000000000000..ec5d19235cfd
--- /dev/null
+++ b/src/cdk/a11y/activedescendant-key-manager.ts
@@ -0,0 +1,40 @@
+/**
+ * @license
+ * Copyright Google Inc. All Rights Reserved.
+ *
+ * Use of this source code is governed by an MIT-style license that can be
+ * found in the LICENSE file at https://angular.io/license
+ */
+
+import {ListKeyManager, CanDisable} from './list-key-manager';
+
+/**
+ * This is the interface for highlightable items (used by the ActiveDescendantKeyManager).
+ * Each item must know how to style itself as active or inactive and whether or not it is
+ * currently disabled.
+ */
+export interface Highlightable extends CanDisable {
+ setActiveStyles(): void;
+ setInactiveStyles(): void;
+}
+
+export class ActiveDescendantKeyManager extends ListKeyManager {
+
+ /**
+ * This method sets the active item to the item at the specified index.
+ * It also adds active styles to the newly active item and removes active
+ * styles from the previously active item.
+ */
+ setActiveItem(index: number): void {
+ Promise.resolve().then(() => {
+ if (this.activeItem) {
+ this.activeItem.setInactiveStyles();
+ }
+ super.setActiveItem(index);
+ if (this.activeItem) {
+ this.activeItem.setActiveStyles();
+ }
+ });
+ }
+
+}
diff --git a/src/cdk/a11y/fake-mousedown.ts b/src/cdk/a11y/fake-mousedown.ts
new file mode 100644
index 000000000000..87f6eb92592e
--- /dev/null
+++ b/src/cdk/a11y/fake-mousedown.ts
@@ -0,0 +1,18 @@
+/**
+ * @license
+ * Copyright Google Inc. All Rights Reserved.
+ *
+ * Use of this source code is governed by an MIT-style license that can be
+ * found in the LICENSE file at https://angular.io/license
+ */
+
+/**
+ * Screenreaders will often fire fake mousedown events when a focusable element
+ * is activated using the keyboard. We can typically distinguish between these faked
+ * mousedown events and real mousedown events using the "buttons" property. While
+ * real mousedowns will indicate the mouse button that was pressed (e.g. "1" for
+ * the left mouse button), faked mousedowns will usually set the property value to 0.
+ */
+export function isFakeMousedownFromScreenReader(event: MouseEvent): boolean {
+ return event.buttons === 0;
+}
diff --git a/src/cdk/a11y/focus-key-manager.ts b/src/cdk/a11y/focus-key-manager.ts
new file mode 100644
index 000000000000..8473b84560ea
--- /dev/null
+++ b/src/cdk/a11y/focus-key-manager.ts
@@ -0,0 +1,39 @@
+/**
+ * @license
+ * Copyright Google Inc. All Rights Reserved.
+ *
+ * Use of this source code is governed by an MIT-style license that can be
+ * found in the LICENSE file at https://angular.io/license
+ */
+
+import {QueryList} from '@angular/core';
+import {ListKeyManager, CanDisable} from './list-key-manager';
+
+/**
+ * This is the interface for focusable items (used by the FocusKeyManager).
+ * Each item must know how to focus itself and whether or not it is currently disabled.
+ */
+export interface Focusable extends CanDisable {
+ focus(): void;
+}
+
+
+export class FocusKeyManager extends ListKeyManager {
+
+ constructor(items: QueryList) {
+ super(items);
+ }
+
+ /**
+ * This method sets the active item to the item at the specified index.
+ * It also adds focuses the newly active item.
+ */
+ setActiveItem(index: number): void {
+ super.setActiveItem(index);
+
+ if (this.activeItem) {
+ this.activeItem.focus();
+ }
+ }
+
+}
diff --git a/src/cdk/a11y/focus-trap.md b/src/cdk/a11y/focus-trap.md
new file mode 100644
index 000000000000..67eb774e2c6e
--- /dev/null
+++ b/src/cdk/a11y/focus-trap.md
@@ -0,0 +1,14 @@
+### FocusTrap
+The `cdkTrapFocus` directive traps Tab key focus within an element. This is intended to
+be used to create accessible experience for components like
+[modal dialogs](https://www.w3.org/TR/wai-aria-practices-1.1/#dialog_modal), where focus must be
+constrained.
+
+This directive is declared in `A11yModule`.
+
+#### Example
+```html
+
+
+
+```
diff --git a/src/lib/core/a11y/focus-trap.spec.ts b/src/cdk/a11y/focus-trap.spec.ts
similarity index 100%
rename from src/lib/core/a11y/focus-trap.spec.ts
rename to src/cdk/a11y/focus-trap.spec.ts
diff --git a/src/cdk/a11y/focus-trap.ts b/src/cdk/a11y/focus-trap.ts
new file mode 100644
index 000000000000..60cb67ef3dfc
--- /dev/null
+++ b/src/cdk/a11y/focus-trap.ts
@@ -0,0 +1,309 @@
+/**
+ * @license
+ * Copyright Google Inc. All Rights Reserved.
+ *
+ * Use of this source code is governed by an MIT-style license that can be
+ * found in the LICENSE file at https://angular.io/license
+ */
+
+import {
+ Directive,
+ ElementRef,
+ Input,
+ NgZone,
+ OnDestroy,
+ AfterContentInit,
+ Injectable,
+} from '@angular/core';
+import {coerceBooleanProperty} from '../coercion/boolean-property';
+import {InteractivityChecker} from './interactivity-checker';
+import {Platform} from '../platform/platform';
+import {first} from '../rxjs/index';
+
+
+/**
+ * Class that allows for trapping focus within a DOM element.
+ *
+ * NOTE: This class currently uses a very simple (naive) approach to focus trapping.
+ * It assumes that the tab order is the same as DOM order, which is not necessarily true.
+ * Things like tabIndex > 0, flex `order`, and shadow roots can cause to two to misalign.
+ * This will be replaced with a more intelligent solution before the library is considered stable.
+ */
+export class FocusTrap {
+ private _startAnchor: HTMLElement | null;
+ private _endAnchor: HTMLElement | null;
+
+ /** Whether the focus trap is active. */
+ get enabled(): boolean { return this._enabled; }
+ set enabled(val: boolean) {
+ this._enabled = val;
+
+ if (this._startAnchor && this._endAnchor) {
+ this._startAnchor.tabIndex = this._endAnchor.tabIndex = this._enabled ? 0 : -1;
+ }
+ }
+ private _enabled: boolean = true;
+
+ constructor(
+ private _element: HTMLElement,
+ private _platform: Platform,
+ private _checker: InteractivityChecker,
+ private _ngZone: NgZone,
+ deferAnchors = false) {
+
+ if (!deferAnchors) {
+ this.attachAnchors();
+ }
+ }
+
+ /** Destroys the focus trap by cleaning up the anchors. */
+ destroy() {
+ if (this._startAnchor && this._startAnchor.parentNode) {
+ this._startAnchor.parentNode.removeChild(this._startAnchor);
+ }
+
+ if (this._endAnchor && this._endAnchor.parentNode) {
+ this._endAnchor.parentNode.removeChild(this._endAnchor);
+ }
+
+ this._startAnchor = this._endAnchor = null;
+ }
+
+ /**
+ * Inserts the anchors into the DOM. This is usually done automatically
+ * in the constructor, but can be deferred for cases like directives with `*ngIf`.
+ */
+ attachAnchors(): void {
+ // If we're not on the browser, there can be no focus to trap.
+ if (!this._platform.isBrowser) {
+ return;
+ }
+
+ if (!this._startAnchor) {
+ this._startAnchor = this._createAnchor();
+ }
+
+ if (!this._endAnchor) {
+ this._endAnchor = this._createAnchor();
+ }
+
+ this._ngZone.runOutsideAngular(() => {
+ this._startAnchor!.addEventListener('focus', () => this.focusLastTabbableElement());
+ this._endAnchor!.addEventListener('focus', () => this.focusFirstTabbableElement());
+
+ if (this._element.parentNode) {
+ this._element.parentNode.insertBefore(this._startAnchor!, this._element);
+ this._element.parentNode.insertBefore(this._endAnchor!, this._element.nextSibling);
+ }
+ });
+ }
+
+ /**
+ * Waits for the zone to stabilize, then either focuses the first element that the
+ * user specified, or the first tabbable element..
+ */
+ focusInitialElementWhenReady() {
+ this._executeOnStable(() => this.focusInitialElement());
+ }
+
+ /**
+ * Waits for the zone to stabilize, then focuses
+ * the first tabbable element within the focus trap region.
+ */
+ focusFirstTabbableElementWhenReady() {
+ this._executeOnStable(() => this.focusFirstTabbableElement());
+ }
+
+ /**
+ * Waits for the zone to stabilize, then focuses
+ * the last tabbable element within the focus trap region.
+ */
+ focusLastTabbableElementWhenReady() {
+ this._executeOnStable(() => this.focusLastTabbableElement());
+ }
+
+ /**
+ * Get the specified boundary element of the trapped region.
+ * @param bound The boundary to get (start or end of trapped region).
+ * @returns The boundary element.
+ */
+ private _getRegionBoundary(bound: 'start' | 'end'): HTMLElement | null {
+ // Contains the deprecated version of selector, for temporary backwards comparability.
+ let markers = this._element.querySelectorAll(`[cdk-focus-region-${bound}], ` +
+ `[cdk-focus-${bound}]`) as NodeListOf;
+
+ for (let i = 0; i < markers.length; i++) {
+ if (markers[i].hasAttribute(`cdk-focus-${bound}`)) {
+ console.warn(`Found use of deprecated attribute 'cdk-focus-${bound}',` +
+ ` use 'cdk-focus-region-${bound}' instead.`, markers[i]);
+ }
+ }
+
+ if (bound == 'start') {
+ return markers.length ? markers[0] : this._getFirstTabbableElement(this._element);
+ }
+ return markers.length ?
+ markers[markers.length - 1] : this._getLastTabbableElement(this._element);
+ }
+
+ /** Focuses the element that should be focused when the focus trap is initialized. */
+ focusInitialElement() {
+ let redirectToElement = this._element.querySelector('[cdk-focus-initial]') as HTMLElement;
+ if (redirectToElement) {
+ redirectToElement.focus();
+ } else {
+ this.focusFirstTabbableElement();
+ }
+ }
+
+ /** Focuses the first tabbable element within the focus trap region. */
+ focusFirstTabbableElement() {
+ let redirectToElement = this._getRegionBoundary('start');
+ if (redirectToElement) {
+ redirectToElement.focus();
+ }
+ }
+
+ /** Focuses the last tabbable element within the focus trap region. */
+ focusLastTabbableElement() {
+ let redirectToElement = this._getRegionBoundary('end');
+ if (redirectToElement) {
+ redirectToElement.focus();
+ }
+ }
+
+ /** Get the first tabbable element from a DOM subtree (inclusive). */
+ private _getFirstTabbableElement(root: HTMLElement): HTMLElement | null {
+ if (this._checker.isFocusable(root) && this._checker.isTabbable(root)) {
+ return root;
+ }
+
+ // Iterate in DOM order. Note that IE doesn't have `children` for SVG so we fall
+ // back to `childNodes` which includes text nodes, comments etc.
+ let children = root.children || root.childNodes;
+
+ for (let i = 0; i < children.length; i++) {
+ let tabbableChild = children[i].nodeType === Node.ELEMENT_NODE ?
+ this._getFirstTabbableElement(children[i] as HTMLElement) :
+ null;
+
+ if (tabbableChild) {
+ return tabbableChild;
+ }
+ }
+
+ return null;
+ }
+
+ /** Get the last tabbable element from a DOM subtree (inclusive). */
+ private _getLastTabbableElement(root: HTMLElement): HTMLElement | null {
+ if (this._checker.isFocusable(root) && this._checker.isTabbable(root)) {
+ return root;
+ }
+
+ // Iterate in reverse DOM order.
+ let children = root.children || root.childNodes;
+
+ for (let i = children.length - 1; i >= 0; i--) {
+ let tabbableChild = children[i].nodeType === Node.ELEMENT_NODE ?
+ this._getLastTabbableElement(children[i] as HTMLElement) :
+ null;
+
+ if (tabbableChild) {
+ return tabbableChild;
+ }
+ }
+
+ return null;
+ }
+
+ /** Creates an anchor element. */
+ private _createAnchor(): HTMLElement {
+ let anchor = document.createElement('div');
+ anchor.tabIndex = this._enabled ? 0 : -1;
+ anchor.classList.add('cdk-visually-hidden');
+ anchor.classList.add('cdk-focus-trap-anchor');
+ return anchor;
+ }
+
+ /** Executes a function when the zone is stable. */
+ private _executeOnStable(fn: () => any): void {
+ if (this._ngZone.isStable) {
+ fn();
+ } else {
+ first.call(this._ngZone.onStable).subscribe(fn);
+ }
+ }
+}
+
+
+/** Factory that allows easy instantiation of focus traps. */
+@Injectable()
+export class FocusTrapFactory {
+ constructor(
+ private _checker: InteractivityChecker,
+ private _platform: Platform,
+ private _ngZone: NgZone) { }
+
+ create(element: HTMLElement, deferAnchors = false): FocusTrap {
+ return new FocusTrap(element, this._platform, this._checker, this._ngZone, deferAnchors);
+ }
+}
+
+
+/**
+ * Directive for trapping focus within a region.
+ * @deprecated
+ */
+@Directive({
+ selector: 'cdk-focus-trap',
+})
+export class FocusTrapDeprecatedDirective implements OnDestroy, AfterContentInit {
+ focusTrap: FocusTrap;
+
+ /** Whether the focus trap is active. */
+ @Input()
+ get disabled(): boolean { return !this.focusTrap.enabled; }
+ set disabled(val: boolean) {
+ this.focusTrap.enabled = !coerceBooleanProperty(val);
+ }
+
+ constructor(private _elementRef: ElementRef, private _focusTrapFactory: FocusTrapFactory) {
+ this.focusTrap = this._focusTrapFactory.create(this._elementRef.nativeElement, true);
+ }
+
+ ngOnDestroy() {
+ this.focusTrap.destroy();
+ }
+
+ ngAfterContentInit() {
+ this.focusTrap.attachAnchors();
+ }
+}
+
+
+/** Directive for trapping focus within a region. */
+@Directive({
+ selector: '[cdkTrapFocus]',
+ exportAs: 'cdkTrapFocus',
+})
+export class FocusTrapDirective implements OnDestroy, AfterContentInit {
+ focusTrap: FocusTrap;
+
+ /** Whether the focus trap is active. */
+ @Input('cdkTrapFocus')
+ get enabled(): boolean { return this.focusTrap.enabled; }
+ set enabled(value: boolean) { this.focusTrap.enabled = coerceBooleanProperty(value); }
+
+ constructor(private _elementRef: ElementRef, private _focusTrapFactory: FocusTrapFactory) {
+ this.focusTrap = this._focusTrapFactory.create(this._elementRef.nativeElement, true);
+ }
+
+ ngOnDestroy() {
+ this.focusTrap.destroy();
+ }
+
+ ngAfterContentInit() {
+ this.focusTrap.attachAnchors();
+ }
+}
diff --git a/src/cdk/a11y/index.ts b/src/cdk/a11y/index.ts
new file mode 100644
index 000000000000..c78f2a4b0104
--- /dev/null
+++ b/src/cdk/a11y/index.ts
@@ -0,0 +1,30 @@
+/**
+ * @license
+ * Copyright Google Inc. All Rights Reserved.
+ *
+ * Use of this source code is governed by an MIT-style license that can be
+ * found in the LICENSE file at https://angular.io/license
+ */
+
+import {NgModule} from '@angular/core';
+import {FocusTrapDirective, FocusTrapDeprecatedDirective, FocusTrapFactory} from './focus-trap';
+import {LIVE_ANNOUNCER_PROVIDER} from './live-announcer';
+import {InteractivityChecker} from './interactivity-checker';
+import {CommonModule} from '@angular/common';
+import {PlatformModule} from '../platform/index';
+
+@NgModule({
+ imports: [CommonModule, PlatformModule],
+ declarations: [FocusTrapDirective, FocusTrapDeprecatedDirective],
+ exports: [FocusTrapDirective, FocusTrapDeprecatedDirective],
+ providers: [InteractivityChecker, FocusTrapFactory, LIVE_ANNOUNCER_PROVIDER]
+})
+export class A11yModule {}
+
+export * from './live-announcer';
+export * from './fake-mousedown';
+export * from './focus-trap';
+export * from './interactivity-checker';
+export * from './list-key-manager';
+export * from './activedescendant-key-manager';
+export * from './focus-key-manager';
diff --git a/src/cdk/a11y/interactivity-checker.md b/src/cdk/a11y/interactivity-checker.md
new file mode 100644
index 000000000000..07aa5fbc3273
--- /dev/null
+++ b/src/cdk/a11y/interactivity-checker.md
@@ -0,0 +1,21 @@
+### InteractivityChecker
+`InteractivityChecker` is used to check the interactivity of an element, capturing disabled,
+visible, tabbable, and focusable states for accessibility purposes.
+
+#### Methods
+
+##### `isDisabled(element: HTMLElement): boolean`
+Whether the given element is disabled.
+
+##### `isVisible(element: HTMLElement): boolean`
+Whether the given element is visible.
+
+This will capture states like `display: none` and `visibility: hidden`,
+but not things like being clipped by an `overflow: hidden` parent or being outside the viewport.
+
+##### `isFocusable(element: HTMLElement): boolean`
+Gets whether an element can be focused by the user.
+
+##### `isTabbable(element: HTMLElement): boolean`
+Gets whether an element can be reached via Tab key.
+Assumes that the element has already been checked with isFocusable.
diff --git a/src/lib/core/a11y/interactivity-checker.spec.ts b/src/cdk/a11y/interactivity-checker.spec.ts
similarity index 100%
rename from src/lib/core/a11y/interactivity-checker.spec.ts
rename to src/cdk/a11y/interactivity-checker.spec.ts
diff --git a/src/cdk/a11y/interactivity-checker.ts b/src/cdk/a11y/interactivity-checker.ts
new file mode 100644
index 000000000000..035e27001506
--- /dev/null
+++ b/src/cdk/a11y/interactivity-checker.ts
@@ -0,0 +1,244 @@
+/**
+ * @license
+ * Copyright Google Inc. All Rights Reserved.
+ *
+ * Use of this source code is governed by an MIT-style license that can be
+ * found in the LICENSE file at https://angular.io/license
+ */
+
+import {Injectable} from '@angular/core';
+import {Platform} from '../platform/platform';
+
+/**
+ * The InteractivityChecker leans heavily on the ally.js accessibility utilities.
+ * Methods like `isTabbable` are only covering specific edge-cases for the browsers which are
+ * supported.
+ */
+
+/**
+ * Utility for checking the interactivity of an element, such as whether is is focusable or
+ * tabbable.
+ */
+@Injectable()
+export class InteractivityChecker {
+
+ constructor(private _platform: Platform) {}
+
+ /**
+ * Gets whether an element is disabled.
+ *
+ * @param element Element to be checked.
+ * @returns Whether the element is disabled.
+ */
+ isDisabled(element: HTMLElement): boolean {
+ // This does not capture some cases, such as a non-form control with a disabled attribute or
+ // a form control inside of a disabled form, but should capture the most common cases.
+ return element.hasAttribute('disabled');
+ }
+
+ /**
+ * Gets whether an element is visible for the purposes of interactivity.
+ *
+ * This will capture states like `display: none` and `visibility: hidden`, but not things like
+ * being clipped by an `overflow: hidden` parent or being outside the viewport.
+ *
+ * @returns Whether the element is visible.
+ */
+ isVisible(element: HTMLElement): boolean {
+ return hasGeometry(element) && getComputedStyle(element).visibility === 'visible';
+ }
+
+ /**
+ * Gets whether an element can be reached via Tab key.
+ * Assumes that the element has already been checked with isFocusable.
+ *
+ * @param element Element to be checked.
+ * @returns Whether the element is tabbable.
+ */
+ isTabbable(element: HTMLElement): boolean {
+ // Nothing is tabbable on the the server 😎
+ if (!this._platform.isBrowser) {
+ return false;
+ }
+
+ let frameElement = getWindow(element).frameElement as HTMLElement;
+
+ if (frameElement) {
+
+ let frameType = frameElement && frameElement.nodeName.toLowerCase();
+
+ // Frame elements inherit their tabindex onto all child elements.
+ if (getTabIndexValue(frameElement) === -1) {
+ return false;
+ }
+
+ // Webkit and Blink consider anything inside of an