diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS
index acc764a6d9e..d1d965df66c 100644
--- a/.github/CODEOWNERS
+++ b/.github/CODEOWNERS
@@ -176,19 +176,26 @@
/src/e2e-app/* @jelbourn
/src/e2e-app/block-scroll-strategy/** @andrewseguin @crisbeto
/src/e2e-app/button/** @jelbourn
+/src/e2e-app/button-toggle/** @jelbourn
+/src/e2e-app/card/** @jelbourn
/src/e2e-app/checkbox/** @jelbourn @devversion
/src/e2e-app/dialog/** @jelbourn @crisbeto
/src/e2e-app/e2e-app/** @jelbourn
+/src/e2e-app/example-viewer/** @andrewseguin
+/src/e2e-app/expansion/** @josephperrott
/src/e2e-app/grid-list/** @jelbourn
/src/e2e-app/icon/** @jelbourn
/src/e2e-app/input/** @mmalerba
+/src/e2e-app/list/** @jelbourn
/src/e2e-app/menu/** @crisbeto
/src/e2e-app/progress-bar/** @jelbourn @crisbeto @josephperrott
/src/e2e-app/progress-spinner/** @jelbourn @crisbeto @josephperrott
/src/e2e-app/radio/** @jelbourn @devversion
/src/e2e-app/sidenav/** @mmalerba
/src/e2e-app/slide-toggle/** @devversion
+/src/e2e-app/stepper/** @mmalerba
/src/e2e-app/tabs/** @andrewseguin
+/src/e2e-app/toolbar/** @devversion
/src/e2e-app/virtual-scroll/** @mmalerba
# Universal app
diff --git a/packages.bzl b/packages.bzl
index ed03c6b337f..3907b0acfdb 100644
--- a/packages.bzl
+++ b/packages.bzl
@@ -123,6 +123,7 @@ ANGULAR_LIBRARY_UMDS = [
"@npm//node_modules/@angular/compiler:bundles/compiler.umd.js",
"@npm//node_modules/@angular/core:bundles/core-testing.umd.js",
"@npm//node_modules/@angular/core:bundles/core.umd.js",
+ "@npm//node_modules/@angular/elements:bundles/elements.umd.js",
"@npm//node_modules/@angular/forms:bundles/forms.umd.js",
"@npm//node_modules/@angular/platform-browser-dynamic:bundles/platform-browser-dynamic-testing.umd.js",
"@npm//node_modules/@angular/platform-browser-dynamic:bundles/platform-browser-dynamic.umd.js",
diff --git a/src/e2e-app/BUILD.bazel b/src/e2e-app/BUILD.bazel
index cbc0a77d0eb..55c4e525b31 100644
--- a/src/e2e-app/BUILD.bazel
+++ b/src/e2e-app/BUILD.bazel
@@ -10,10 +10,12 @@ ng_module(
assets = glob(["**/*.html", "**/*.css"], exclude = ["index.html"]),
deps = [
"@npm//@angular/core",
+ "@npm//@angular/elements",
"@npm//@angular/forms",
"@npm//@angular/platform-browser",
"@npm//@angular/router",
"@npm//@angular/animations",
+ "@npm//@webcomponents/custom-elements",
"//src/cdk/drag-drop",
"//src/cdk/overlay",
"//src/cdk/scrolling",
@@ -43,6 +45,7 @@ ts_devserver(
"@npm//zone.js",
"@npm//core-js",
"@npm//hammerjs",
+ "@npm//@webcomponents/custom-elements",
"//src/lib/prebuilt-themes:indigo-pink",
":index.html",
],
diff --git a/src/e2e-app/block-scroll-strategy/block-scroll-strategy-e2e-module.ts b/src/e2e-app/block-scroll-strategy/block-scroll-strategy-e2e-module.ts
new file mode 100644
index 00000000000..243ccce595f
--- /dev/null
+++ b/src/e2e-app/block-scroll-strategy/block-scroll-strategy-e2e-module.ts
@@ -0,0 +1,18 @@
+/**
+ * @license
+ * Copyright Google LLC 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 {ScrollingModule} from '@angular/cdk/scrolling';
+import {NgModule} from '@angular/core';
+import {BlockScrollStrategyE2E} from './block-scroll-strategy-e2e';
+
+@NgModule({
+ imports: [ScrollingModule],
+ declarations: [BlockScrollStrategyE2E],
+})
+export class BlockScrollStrategyE2eModule {
+}
diff --git a/src/e2e-app/button-toggle/button-toggle-e2e-module.ts b/src/e2e-app/button-toggle/button-toggle-e2e-module.ts
new file mode 100644
index 00000000000..52ab09a60cb
--- /dev/null
+++ b/src/e2e-app/button-toggle/button-toggle-e2e-module.ts
@@ -0,0 +1,20 @@
+/**
+ * @license
+ * Copyright Google LLC 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 {ExampleViewerModule} from '../example-viewer/example-viewer-module';
+import {ButtonToggleE2e} from './button-toggle-e2e';
+
+@NgModule({
+ imports: [
+ ExampleViewerModule,
+ ],
+ declarations: [ButtonToggleE2e],
+})
+export class ButtonToggleE2eModule {
+}
diff --git a/src/e2e-app/button-toggle/button-toggle-e2e.ts b/src/e2e-app/button-toggle/button-toggle-e2e.ts
new file mode 100644
index 00000000000..5e9c2d8939f
--- /dev/null
+++ b/src/e2e-app/button-toggle/button-toggle-e2e.ts
@@ -0,0 +1,18 @@
+/**
+ * @license
+ * Copyright Google LLC 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 {Component} from '@angular/core';
+
+@Component({
+ moduleId: module.id,
+ selector: 'button-toggle-demo',
+ template: ``,
+})
+export class ButtonToggleE2e {
+ examples = ['button-toggle-overview'];
+}
diff --git a/src/e2e-app/button/button-e2e-module.ts b/src/e2e-app/button/button-e2e-module.ts
new file mode 100644
index 00000000000..d6a48cc4fd5
--- /dev/null
+++ b/src/e2e-app/button/button-e2e-module.ts
@@ -0,0 +1,21 @@
+/**
+ * @license
+ * Copyright Google LLC 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 {MatButtonModule, MatIconModule} from '@angular/material';
+import {ButtonE2E} from './button-e2e';
+
+@NgModule({
+ imports: [
+ MatButtonModule,
+ MatIconModule,
+ ],
+ declarations: [ButtonE2E],
+})
+export class ButtonE2eModule {
+}
diff --git a/src/e2e-app/card/card-e2e-module.ts b/src/e2e-app/card/card-e2e-module.ts
new file mode 100644
index 00000000000..be1f46c1fc4
--- /dev/null
+++ b/src/e2e-app/card/card-e2e-module.ts
@@ -0,0 +1,20 @@
+/**
+ * @license
+ * Copyright Google LLC 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 {ExampleViewerModule} from '../example-viewer/example-viewer-module';
+import {CardE2e} from './card-e2e';
+
+@NgModule({
+ imports: [
+ ExampleViewerModule,
+ ],
+ declarations: [CardE2e],
+})
+export class CardE2eModule {
+}
diff --git a/src/e2e-app/card/card-e2e.ts b/src/e2e-app/card/card-e2e.ts
new file mode 100644
index 00000000000..98057df9892
--- /dev/null
+++ b/src/e2e-app/card/card-e2e.ts
@@ -0,0 +1,18 @@
+/**
+ * @license
+ * Copyright Google LLC 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 {Component} from '@angular/core';
+
+@Component({
+ moduleId: module.id,
+ selector: 'card-demo',
+ template: ``,
+})
+export class CardE2e {
+ examples = ['card-fancy'];
+}
diff --git a/src/e2e-app/checkbox/checkbox-e2e-module.ts b/src/e2e-app/checkbox/checkbox-e2e-module.ts
new file mode 100644
index 00000000000..08daf081308
--- /dev/null
+++ b/src/e2e-app/checkbox/checkbox-e2e-module.ts
@@ -0,0 +1,18 @@
+/**
+ * @license
+ * Copyright Google LLC 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 {MatCheckboxModule} from '@angular/material';
+import {SimpleCheckboxes} from './checkbox-e2e';
+
+@NgModule({
+ imports: [MatCheckboxModule],
+ declarations: [SimpleCheckboxes],
+})
+export class CheckboxE2eModule {
+}
diff --git a/src/e2e-app/dialog/dialog-e2e-module.ts b/src/e2e-app/dialog/dialog-e2e-module.ts
new file mode 100644
index 00000000000..4c36239708f
--- /dev/null
+++ b/src/e2e-app/dialog/dialog-e2e-module.ts
@@ -0,0 +1,19 @@
+/**
+ * @license
+ * Copyright Google LLC 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 {MatDialogModule} from '@angular/material';
+import {DialogE2E, TestDialog} from './dialog-e2e';
+
+@NgModule({
+ imports: [MatDialogModule],
+ declarations: [DialogE2E, TestDialog],
+ entryComponents: [TestDialog]
+})
+export class DialogE2eModule {
+}
diff --git a/src/e2e-app/e2e-app-module.ts b/src/e2e-app/e2e-app-module.ts
deleted file mode 100644
index 30bc6edbbd7..00000000000
--- a/src/e2e-app/e2e-app-module.ts
+++ /dev/null
@@ -1,112 +0,0 @@
-import {DialogModule} from '@angular/cdk-experimental/dialog';
-import {DragDropModule} from '@angular/cdk/drag-drop';
-import {ScrollingModule as ExperimentalScrollingModule} from '@angular/cdk-experimental/scrolling';
-import {ScrollingModule} from '@angular/cdk/scrolling';
-import {NgModule} from '@angular/core';
-import {ReactiveFormsModule} from '@angular/forms';
-import {
- MatButtonModule,
- MatCheckboxModule,
- MatDialogModule,
- MatDividerModule,
- MatFormFieldModule,
- MatGridListModule,
- MatIconModule,
- MatInputModule,
- MatListModule,
- MatMenuModule,
- MatNativeDateModule,
- MatProgressBarModule,
- MatProgressSpinnerModule,
- MatRadioModule,
- MatSidenavModule,
- MatSlideToggleModule,
- MatStepperModule,
- MatTabsModule,
-} from '@angular/material';
-import {ExampleModule} from '@angular/material-examples';
-import {BrowserModule} from '@angular/platform-browser';
-import {NoopAnimationsModule} from '@angular/platform-browser/animations';
-import {RouterModule} from '@angular/router';
-import {BlockScrollStrategyE2E} from './block-scroll-strategy/block-scroll-strategy-e2e';
-import {ButtonE2E} from './button/button-e2e';
-import {SimpleCheckboxes} from './checkbox/checkbox-e2e';
-import {DialogE2E, TestDialog} from './dialog/dialog-e2e';
-import {E2EApp, Home} from './e2e-app/e2e-app';
-import {E2E_APP_ROUTES} from './e2e-app/routes';
-import {GridListE2E} from './grid-list/grid-list-e2e';
-import {IconE2E} from './icon/icon-e2e';
-import {InputE2E} from './input/input-e2e';
-import {MenuE2E} from './menu/menu-e2e';
-import {ProgressBarE2E} from './progress-bar/progress-bar-e2e';
-import {ProgressSpinnerE2E} from './progress-spinner/progress-spinner-e2e';
-import {SimpleRadioButtons} from './radio/radio-e2e';
-import {SidenavE2E} from './sidenav/sidenav-e2e';
-import {SlideToggleE2E} from './slide-toggle/slide-toggle-e2e';
-import {BasicTabs} from './tabs/tabs-e2e';
-import {VirtualScrollE2E} from './virtual-scroll/virtual-scroll-e2e';
-
-/**
- * NgModule that contains all Material modules that are required to serve the e2e-app.
- */
-@NgModule({
- exports: [
- MatButtonModule,
- MatCheckboxModule,
- MatDialogModule,
- MatDividerModule,
- MatFormFieldModule,
- MatGridListModule,
- MatIconModule,
- MatInputModule,
- MatListModule,
- MatMenuModule,
- MatProgressBarModule,
- MatProgressSpinnerModule,
- MatRadioModule,
- MatSidenavModule,
- MatSlideToggleModule,
- MatStepperModule,
- MatTabsModule,
- MatNativeDateModule,
- ScrollingModule,
- ExperimentalScrollingModule,
- DialogModule,
- DragDropModule,
- ]
-})
-export class E2eMaterialModule {}
-
-@NgModule({
- imports: [
- BrowserModule,
- RouterModule.forRoot(E2E_APP_ROUTES),
- E2eMaterialModule,
- NoopAnimationsModule,
- ExampleModule,
- ReactiveFormsModule
- ],
- declarations: [
- BasicTabs,
- ButtonE2E,
- DialogE2E,
- E2EApp,
- GridListE2E,
- Home,
- IconE2E,
- InputE2E,
- MenuE2E,
- ProgressBarE2E,
- ProgressSpinnerE2E,
- SidenavE2E,
- SimpleCheckboxes,
- SimpleRadioButtons,
- SlideToggleE2E,
- TestDialog,
- BlockScrollStrategyE2E,
- VirtualScrollE2E,
- ],
- bootstrap: [E2EApp],
- entryComponents: [TestDialog]
-})
-export class E2eAppModule { }
diff --git a/src/e2e-app/e2e-app.ts b/src/e2e-app/e2e-app.ts
new file mode 100644
index 00000000000..1caa141bd64
--- /dev/null
+++ b/src/e2e-app/e2e-app.ts
@@ -0,0 +1,19 @@
+/**
+ * @license
+ * Copyright Google LLC 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 {Component, ViewEncapsulation} from '@angular/core';
+
+/** Root component for the e2e-app demos. */
+@Component({
+ moduleId: module.id,
+ selector: 'e2e-app',
+ template: '',
+ encapsulation: ViewEncapsulation.None,
+})
+export class E2eApp {
+}
diff --git a/src/e2e-app/e2e-app/e2e-app.html b/src/e2e-app/e2e-app/e2e-app-layout.html
similarity index 97%
rename from src/e2e-app/e2e-app/e2e-app.html
rename to src/e2e-app/e2e-app/e2e-app-layout.html
index 75c422514f4..4453a29bba4 100644
--- a/src/e2e-app/e2e-app/e2e-app.html
+++ b/src/e2e-app/e2e-app/e2e-app-layout.html
@@ -25,5 +25,5 @@
-
+
diff --git a/src/e2e-app/e2e-app/e2e-app-layout.ts b/src/e2e-app/e2e-app/e2e-app-layout.ts
new file mode 100644
index 00000000000..8d55fc60a5b
--- /dev/null
+++ b/src/e2e-app/e2e-app/e2e-app-layout.ts
@@ -0,0 +1,16 @@
+import {Component, ViewEncapsulation} from '@angular/core';
+
+
+@Component({selector: 'home', template: `
e2e website!
`})
+export class Home {
+}
+
+@Component({
+ moduleId: module.id,
+ selector: 'e2e-app-layout',
+ templateUrl: 'e2e-app-layout.html',
+ encapsulation: ViewEncapsulation.None,
+})
+export class E2eAppLayout {
+ showLinks: boolean = false;
+}
diff --git a/src/e2e-app/e2e-app/e2e-app-module.ts b/src/e2e-app/e2e-app/e2e-app-module.ts
new file mode 100644
index 00000000000..eda43f7dfe5
--- /dev/null
+++ b/src/e2e-app/e2e-app/e2e-app-module.ts
@@ -0,0 +1,30 @@
+/**
+ * @license
+ * Copyright Google LLC 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 {CommonModule} from '@angular/common';
+import {NgModule} from '@angular/core';
+import {GestureConfig, MatListModule} from '@angular/material';
+import {HAMMER_GESTURE_CONFIG} from '@angular/platform-browser';
+import {RouterModule} from '@angular/router';
+import {E2eAppLayout, Home} from './e2e-app-layout';
+
+@NgModule({
+ imports: [
+ CommonModule,
+ MatListModule,
+ RouterModule,
+ ],
+ declarations: [E2eAppLayout, Home],
+ exports: [E2eAppLayout],
+
+ // We need to pass this in here, because the gesture config currently doesn't for lazy-loaded
+ // modules. See https://github.com/angular/material2/issues/4595#issuecomment-416641018.
+ providers: [{provide: HAMMER_GESTURE_CONFIG, useClass: GestureConfig}]
+})
+export class E2eAppModule {
+}
diff --git a/src/e2e-app/e2e-app/e2e-app.ts b/src/e2e-app/e2e-app/e2e-app.ts
deleted file mode 100644
index e45bf23906e..00000000000
--- a/src/e2e-app/e2e-app/e2e-app.ts
+++ /dev/null
@@ -1,18 +0,0 @@
-import {Component, ViewEncapsulation} from '@angular/core';
-
-
-@Component({
- selector: 'home',
- template: `
e2e website!
`
-})
-export class Home {}
-
-@Component({
- moduleId: module.id,
- selector: 'e2e-app',
- templateUrl: 'e2e-app.html',
- encapsulation: ViewEncapsulation.None,
-})
-export class E2EApp {
- showLinks: boolean = false;
-}
diff --git a/src/e2e-app/e2e-app/routes.ts b/src/e2e-app/e2e-app/routes.ts
index 12c2d0c5833..775d9cdf72d 100644
--- a/src/e2e-app/e2e-app/routes.ts
+++ b/src/e2e-app/e2e-app/routes.ts
@@ -1,50 +1,48 @@
import {Routes} from '@angular/router';
-import {VirtualScrollE2E} from '../virtual-scroll/virtual-scroll-e2e';
-import {Home} from './e2e-app';
+import {BlockScrollStrategyE2E} from '../block-scroll-strategy/block-scroll-strategy-e2e';
+import {ButtonToggleE2e} from '../button-toggle/button-toggle-e2e';
import {ButtonE2E} from '../button/button-e2e';
-import {BasicTabs} from '../tabs/tabs-e2e';
-import {IconE2E} from '../icon/icon-e2e';
-import {MenuE2E} from '../menu/menu-e2e';
-import {SimpleRadioButtons} from '../radio/radio-e2e';
+import {CardE2e} from '../card/card-e2e';
import {SimpleCheckboxes} from '../checkbox/checkbox-e2e';
import {DialogE2E} from '../dialog/dialog-e2e';
+import {ExpansionE2e} from '../expansion/expansion-e2e';
import {GridListE2E} from '../grid-list/grid-list-e2e';
+import {IconE2E} from '../icon/icon-e2e';
+import {InputE2E} from '../input/input-e2e';
+import {ListE2e} from '../list/list-e2e';
+import {MenuE2E} from '../menu/menu-e2e';
import {ProgressBarE2E} from '../progress-bar/progress-bar-e2e';
import {ProgressSpinnerE2E} from '../progress-spinner/progress-spinner-e2e';
-import {SlideToggleE2E} from '../slide-toggle/slide-toggle-e2e';
-import {InputE2E} from '../input/input-e2e';
+import {SimpleRadioButtons} from '../radio/radio-e2e';
import {SidenavE2E} from '../sidenav/sidenav-e2e';
-import {BlockScrollStrategyE2E} from '../block-scroll-strategy/block-scroll-strategy-e2e';
-import {
- CardFancyExample,
- ListOverviewExample,
- ToolbarMultirowExample,
- ButtonToggleOverviewExample,
- ExpansionOverviewExample,
- StepperOverviewExample
-} from '@angular/material-examples';
+import {SlideToggleE2E} from '../slide-toggle/slide-toggle-e2e';
+import {StepperE2e} from '../stepper/stepper-e2e';
+import {BasicTabs} from '../tabs/tabs-e2e';
+import {ToolbarE2e} from '../toolbar/toolbar-e2e';
+import {VirtualScrollE2E} from '../virtual-scroll/virtual-scroll-e2e';
+import {Home} from './e2e-app-layout';
export const E2E_APP_ROUTES: Routes = [
{path: '', component: Home},
{path: 'block-scroll-strategy', component: BlockScrollStrategyE2E},
{path: 'button', component: ButtonE2E},
- {path: 'button-toggle', component: ButtonToggleOverviewExample},
+ {path: 'button-toggle', component: ButtonToggleE2e},
{path: 'checkbox', component: SimpleCheckboxes},
{path: 'dialog', component: DialogE2E},
- {path: 'expansion', component: ExpansionOverviewExample},
+ {path: 'expansion', component: ExpansionE2e},
{path: 'grid-list', component: GridListE2E},
{path: 'icon', component: IconE2E},
{path: 'input', component: InputE2E},
- {path: 'list', component: ListOverviewExample},
+ {path: 'list', component: ListE2e},
{path: 'menu', component: MenuE2E},
{path: 'progress-bar', component: ProgressBarE2E},
{path: 'progress-spinner', component: ProgressSpinnerE2E},
{path: 'radio', component: SimpleRadioButtons},
{path: 'sidenav', component: SidenavE2E},
{path: 'slide-toggle', component: SlideToggleE2E},
- {path: 'stepper', component: StepperOverviewExample},
+ {path: 'stepper', component: StepperE2e},
{path: 'tabs', component: BasicTabs},
- {path: 'cards', component: CardFancyExample},
- {path: 'toolbar', component: ToolbarMultirowExample},
+ {path: 'cards', component: CardE2e},
+ {path: 'toolbar', component: ToolbarE2e},
{path: 'virtual-scroll', component: VirtualScrollE2E},
];
diff --git a/src/e2e-app/example-viewer/example-list-viewer.component.ts b/src/e2e-app/example-viewer/example-list-viewer.component.ts
new file mode 100644
index 00000000000..dd8da6ab46a
--- /dev/null
+++ b/src/e2e-app/example-viewer/example-list-viewer.component.ts
@@ -0,0 +1,21 @@
+/**
+ * @license
+ * Copyright Google LLC 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 {Component, Input} from '@angular/core';
+
+/** Loads an example component from `@angular/material-examples`. */
+@Component({
+ selector: 'example-list-viewer',
+ template: `
+
+ `,
+})
+export class ExampleListViewer {
+ /** IDs of the examples to display. */
+ @Input() ids: string[];
+}
diff --git a/src/e2e-app/example-viewer/example-viewer-module.ts b/src/e2e-app/example-viewer/example-viewer-module.ts
new file mode 100644
index 00000000000..13eacb6ddfa
--- /dev/null
+++ b/src/e2e-app/example-viewer/example-viewer-module.ts
@@ -0,0 +1,21 @@
+/**
+ * @license
+ * Copyright Google LLC 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 {CommonModule} from '@angular/common';
+import {NgModule} from '@angular/core';
+import {ExampleModule as ExampleDataModule} from '@angular/material-examples';
+import {ExampleListViewer} from './example-list-viewer.component';
+import {ExampleViewer} from './example-viewer';
+
+@NgModule({
+ imports: [CommonModule, ExampleDataModule],
+ declarations: [ExampleViewer, ExampleListViewer],
+ exports: [ExampleViewer, ExampleListViewer]
+})
+export class ExampleViewerModule {
+}
diff --git a/src/e2e-app/example-viewer/example-viewer.ts b/src/e2e-app/example-viewer/example-viewer.ts
new file mode 100644
index 00000000000..ad8ee4185e3
--- /dev/null
+++ b/src/e2e-app/example-viewer/example-viewer.ts
@@ -0,0 +1,40 @@
+/**
+ * @license
+ * Copyright Google LLC 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 {Component, ElementRef, Injector, Input, OnInit} from '@angular/core';
+import {createCustomElement} from '@angular/elements';
+import {EXAMPLE_COMPONENTS} from '@angular/material-examples';
+
+/** Loads an example component from `@angular/material-examples` */
+@Component({
+ selector: 'example-viewer',
+ template: `
+
+ Could not find example {{id}}
+
+ `,
+})
+export class ExampleViewer implements OnInit {
+ /** ID of the material example to display. */
+ @Input() id: string;
+
+ constructor(private _elementRef: ElementRef, private _injector: Injector) {}
+
+ ngOnInit() {
+ let exampleElementCtor = customElements.get(this.id);
+
+ if (!exampleElementCtor) {
+ exampleElementCtor =
+ createCustomElement(EXAMPLE_COMPONENTS[this.id].component, {injector: this._injector});
+
+ customElements.define(this.id, exampleElementCtor);
+ }
+
+ this._elementRef.nativeElement.appendChild(new exampleElementCtor(this._injector));
+ }
+}
diff --git a/src/e2e-app/expansion/expansion-e2e-module.ts b/src/e2e-app/expansion/expansion-e2e-module.ts
new file mode 100644
index 00000000000..88d76f82b15
--- /dev/null
+++ b/src/e2e-app/expansion/expansion-e2e-module.ts
@@ -0,0 +1,20 @@
+/**
+ * @license
+ * Copyright Google LLC 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 {ExampleViewerModule} from '../example-viewer/example-viewer-module';
+import {ExpansionE2e} from './expansion-e2e';
+
+@NgModule({
+ imports: [
+ ExampleViewerModule,
+ ],
+ declarations: [ExpansionE2e],
+})
+export class ExpansionE2eModule {
+}
diff --git a/src/e2e-app/expansion/expansion-e2e.ts b/src/e2e-app/expansion/expansion-e2e.ts
new file mode 100644
index 00000000000..bc9d6a66a4c
--- /dev/null
+++ b/src/e2e-app/expansion/expansion-e2e.ts
@@ -0,0 +1,18 @@
+/**
+ * @license
+ * Copyright Google LLC 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 {Component} from '@angular/core';
+
+@Component({
+ moduleId: module.id,
+ selector: 'expansion-demo',
+ template: ``,
+})
+export class ExpansionE2e {
+ examples = ['expansion-overview'];
+}
diff --git a/src/e2e-app/grid-list/grid-list-e2e-module.ts b/src/e2e-app/grid-list/grid-list-e2e-module.ts
new file mode 100644
index 00000000000..dba3aeb2e9c
--- /dev/null
+++ b/src/e2e-app/grid-list/grid-list-e2e-module.ts
@@ -0,0 +1,18 @@
+/**
+ * @license
+ * Copyright Google LLC 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 {MatGridListModule} from '@angular/material';
+import {GridListE2E} from './grid-list-e2e';
+
+@NgModule({
+ imports: [MatGridListModule],
+ declarations: [GridListE2E],
+})
+export class GridListE2eModule {
+}
diff --git a/src/e2e-app/icon/icon-e2e-module.ts b/src/e2e-app/icon/icon-e2e-module.ts
new file mode 100644
index 00000000000..2a7271c530e
--- /dev/null
+++ b/src/e2e-app/icon/icon-e2e-module.ts
@@ -0,0 +1,18 @@
+/**
+ * @license
+ * Copyright Google LLC 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 {MatIconModule} from '@angular/material';
+import {IconE2E} from './icon-e2e';
+
+@NgModule({
+ imports: [MatIconModule],
+ declarations: [IconE2E],
+})
+export class IconE2eModule {
+}
diff --git a/src/e2e-app/index.html b/src/e2e-app/index.html
index 6b8d0b685c0..5b1eecbe38c 100644
--- a/src/e2e-app/index.html
+++ b/src/e2e-app/index.html
@@ -13,6 +13,14 @@
+
+
+
+
Loading...
diff --git a/src/e2e-app/input/input-e2e-module.ts b/src/e2e-app/input/input-e2e-module.ts
new file mode 100644
index 00000000000..3fe485be88b
--- /dev/null
+++ b/src/e2e-app/input/input-e2e-module.ts
@@ -0,0 +1,18 @@
+/**
+ * @license
+ * Copyright Google LLC 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 {MatFormFieldModule, MatInputModule} from '@angular/material';
+import {InputE2E} from './input-e2e';
+
+@NgModule({
+ imports: [MatFormFieldModule, MatInputModule],
+ declarations: [InputE2E],
+})
+export class InputE2eModule {
+}
diff --git a/src/e2e-app/list/list-e2e-module.ts b/src/e2e-app/list/list-e2e-module.ts
new file mode 100644
index 00000000000..6d3dffeba73
--- /dev/null
+++ b/src/e2e-app/list/list-e2e-module.ts
@@ -0,0 +1,20 @@
+/**
+ * @license
+ * Copyright Google LLC 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 {ExampleViewerModule} from '../example-viewer/example-viewer-module';
+import {ListE2e} from './list-e2e';
+
+@NgModule({
+ imports: [
+ ExampleViewerModule,
+ ],
+ declarations: [ListE2e],
+})
+export class ListE2eModule {
+}
diff --git a/src/e2e-app/list/list-e2e.ts b/src/e2e-app/list/list-e2e.ts
new file mode 100644
index 00000000000..41a432e4109
--- /dev/null
+++ b/src/e2e-app/list/list-e2e.ts
@@ -0,0 +1,18 @@
+/**
+ * @license
+ * Copyright Google LLC 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 {Component} from '@angular/core';
+
+@Component({
+ moduleId: module.id,
+ selector: 'list-demo',
+ template: ``,
+})
+export class ListE2e {
+ examples = ['list-overview'];
+}
diff --git a/src/e2e-app/main-module.ts b/src/e2e-app/main-module.ts
new file mode 100644
index 00000000000..673acafc103
--- /dev/null
+++ b/src/e2e-app/main-module.ts
@@ -0,0 +1,68 @@
+import {NgModule} from '@angular/core';
+import {BrowserModule} from '@angular/platform-browser';
+import {NoopAnimationsModule} from '@angular/platform-browser/animations';
+import {RouterModule} from '@angular/router';
+import {
+ BlockScrollStrategyE2eModule
+} from './block-scroll-strategy/block-scroll-strategy-e2e-module';
+import {ButtonToggleE2eModule} from './button-toggle/button-toggle-e2e-module';
+import {ButtonE2eModule} from './button/button-e2e-module';
+import {CardE2eModule} from './card/card-e2e-module';
+import {CheckboxE2eModule} from './checkbox/checkbox-e2e-module';
+import {DialogE2eModule} from './dialog/dialog-e2e-module';
+import {E2eApp} from './e2e-app';
+import {E2eAppModule} from './e2e-app/e2e-app-module';
+import {E2E_APP_ROUTES} from './e2e-app/routes';
+import {ExpansionE2eModule} from './expansion/expansion-e2e-module';
+import {GridListE2eModule} from './grid-list/grid-list-e2e-module';
+import {IconE2eModule} from './icon/icon-e2e-module';
+import {InputE2eModule} from './input/input-e2e-module';
+import {ListE2eModule} from './list/list-e2e-module';
+import {MenuE2eModule} from './menu/menu-e2e-module';
+import {ProgressBarE2eModule} from './progress-bar/progress-bar-e2e-module';
+import {ProgressSpinnerE2eModule} from './progress-spinner/progress-spinner-e2e-module';
+import {RadioE2eModule} from './radio/radio-e2e-module';
+import {SidenavE2eModule} from './sidenav/sidenav-e2e-module';
+import {SlideToggleE2eModule} from './slide-toggle/slide-toggle-e2e-module';
+import {StepperE2eModule} from './stepper/stepper-e2e-module';
+import {TabsE2eModule} from './tabs/tabs-e2e-module';
+import {ToolbarE2eModule} from './toolbar/toolbar-e2e-module';
+import {VirtualScrollE2eModule} from './virtual-scroll/virtual-scroll-e2e-module';
+
+@NgModule({
+ imports: [
+ BrowserModule,
+ E2eAppModule,
+ NoopAnimationsModule,
+ RouterModule.forRoot(E2E_APP_ROUTES),
+
+ // E2E demos
+ BlockScrollStrategyE2eModule,
+ ButtonE2eModule,
+ ButtonToggleE2eModule,
+ CardE2eModule,
+ CheckboxE2eModule,
+ DialogE2eModule,
+ ExpansionE2eModule,
+ GridListE2eModule,
+ IconE2eModule,
+ InputE2eModule,
+ ListE2eModule,
+ MenuE2eModule,
+ ProgressBarE2eModule,
+ ProgressSpinnerE2eModule,
+ RadioE2eModule,
+ SidenavE2eModule,
+ SlideToggleE2eModule,
+ StepperE2eModule,
+ TabsE2eModule,
+ ToolbarE2eModule,
+ VirtualScrollE2eModule,
+ ],
+ declarations: [
+ E2eApp,
+ ],
+ bootstrap: [E2eApp],
+})
+export class MainModule {
+}
diff --git a/src/e2e-app/main.ts b/src/e2e-app/main.ts
index 361873c20f2..3204e4f5d81 100644
--- a/src/e2e-app/main.ts
+++ b/src/e2e-app/main.ts
@@ -1,7 +1,8 @@
-import {platformBrowser} from '@angular/platform-browser';
-import {E2eAppModuleNgFactory} from './e2e-app-module.ngfactory';
import {enableProdMode} from '@angular/core';
+import {platformBrowser} from '@angular/platform-browser';
+
+import {MainModuleNgFactory} from './main-module.ngfactory';
enableProdMode();
-platformBrowser().bootstrapModuleFactory(E2eAppModuleNgFactory);
+platformBrowser().bootstrapModuleFactory(MainModuleNgFactory);
diff --git a/src/e2e-app/menu/menu-e2e-module.ts b/src/e2e-app/menu/menu-e2e-module.ts
new file mode 100644
index 00000000000..7cbac2cd904
--- /dev/null
+++ b/src/e2e-app/menu/menu-e2e-module.ts
@@ -0,0 +1,18 @@
+/**
+ * @license
+ * Copyright Google LLC 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 {MatMenuModule} from '@angular/material';
+import {MenuE2E} from './menu-e2e';
+
+@NgModule({
+ imports: [MatMenuModule],
+ declarations: [MenuE2E],
+})
+export class MenuE2eModule {
+}
diff --git a/src/e2e-app/progress-bar/progress-bar-e2e-module.ts b/src/e2e-app/progress-bar/progress-bar-e2e-module.ts
new file mode 100644
index 00000000000..78cbf8acd03
--- /dev/null
+++ b/src/e2e-app/progress-bar/progress-bar-e2e-module.ts
@@ -0,0 +1,18 @@
+/**
+ * @license
+ * Copyright Google LLC 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 {MatProgressBarModule} from '@angular/material';
+import {ProgressBarE2E} from './progress-bar-e2e';
+
+@NgModule({
+ imports: [MatProgressBarModule],
+ declarations: [ProgressBarE2E],
+})
+export class ProgressBarE2eModule {
+}
diff --git a/src/e2e-app/progress-spinner/progress-spinner-e2e-module.ts b/src/e2e-app/progress-spinner/progress-spinner-e2e-module.ts
new file mode 100644
index 00000000000..eb344719232
--- /dev/null
+++ b/src/e2e-app/progress-spinner/progress-spinner-e2e-module.ts
@@ -0,0 +1,18 @@
+/**
+ * @license
+ * Copyright Google LLC 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 {MatProgressSpinnerModule} from '@angular/material';
+import {ProgressSpinnerE2E} from './progress-spinner-e2e';
+
+@NgModule({
+ imports: [MatProgressSpinnerModule],
+ declarations: [ProgressSpinnerE2E],
+})
+export class ProgressSpinnerE2eModule {
+}
diff --git a/src/e2e-app/radio/radio-e2e-module.ts b/src/e2e-app/radio/radio-e2e-module.ts
new file mode 100644
index 00000000000..5ffe835183d
--- /dev/null
+++ b/src/e2e-app/radio/radio-e2e-module.ts
@@ -0,0 +1,18 @@
+/**
+ * @license
+ * Copyright Google LLC 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 {MatRadioModule} from '@angular/material';
+import {SimpleRadioButtons} from './radio-e2e';
+
+@NgModule({
+ imports: [MatRadioModule],
+ declarations: [SimpleRadioButtons],
+})
+export class RadioE2eModule {
+}
diff --git a/src/e2e-app/sidenav/sidenav-e2e-module.ts b/src/e2e-app/sidenav/sidenav-e2e-module.ts
new file mode 100644
index 00000000000..0f6800698b7
--- /dev/null
+++ b/src/e2e-app/sidenav/sidenav-e2e-module.ts
@@ -0,0 +1,18 @@
+/**
+ * @license
+ * Copyright Google LLC 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 {MatSidenavModule} from '@angular/material';
+import {SidenavE2E} from './sidenav-e2e';
+
+@NgModule({
+ imports: [MatSidenavModule],
+ declarations: [SidenavE2E],
+})
+export class SidenavE2eModule {
+}
diff --git a/src/e2e-app/slide-toggle/slide-toggle-e2e-module.ts b/src/e2e-app/slide-toggle/slide-toggle-e2e-module.ts
new file mode 100644
index 00000000000..e7d57b88bfa
--- /dev/null
+++ b/src/e2e-app/slide-toggle/slide-toggle-e2e-module.ts
@@ -0,0 +1,18 @@
+/**
+ * @license
+ * Copyright Google LLC 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 {MatSlideToggleModule} from '@angular/material';
+import {SlideToggleE2E} from './slide-toggle-e2e';
+
+@NgModule({
+ imports: [MatSlideToggleModule],
+ declarations: [SlideToggleE2E],
+})
+export class SlideToggleE2eModule {
+}
diff --git a/src/e2e-app/stepper/stepper-e2e-module.ts b/src/e2e-app/stepper/stepper-e2e-module.ts
new file mode 100644
index 00000000000..7a8281348f4
--- /dev/null
+++ b/src/e2e-app/stepper/stepper-e2e-module.ts
@@ -0,0 +1,20 @@
+/**
+ * @license
+ * Copyright Google LLC 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 {ExampleViewerModule} from '../example-viewer/example-viewer-module';
+import {StepperE2e} from './stepper-e2e';
+
+@NgModule({
+ imports: [
+ ExampleViewerModule,
+ ],
+ declarations: [StepperE2e],
+})
+export class StepperE2eModule {
+}
diff --git a/src/e2e-app/stepper/stepper-e2e.ts b/src/e2e-app/stepper/stepper-e2e.ts
new file mode 100644
index 00000000000..d255eaeb83c
--- /dev/null
+++ b/src/e2e-app/stepper/stepper-e2e.ts
@@ -0,0 +1,18 @@
+/**
+ * @license
+ * Copyright Google LLC 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 {Component} from '@angular/core';
+
+@Component({
+ moduleId: module.id,
+ selector: 'stepper-demo',
+ template: ``,
+})
+export class StepperE2e {
+ examples = ['stepper-overview'];
+}
diff --git a/src/e2e-app/tabs/tabs-e2e-module.ts b/src/e2e-app/tabs/tabs-e2e-module.ts
new file mode 100644
index 00000000000..0d13e724793
--- /dev/null
+++ b/src/e2e-app/tabs/tabs-e2e-module.ts
@@ -0,0 +1,18 @@
+/**
+ * @license
+ * Copyright Google LLC 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 {MatFormFieldModule, MatInputModule, MatTabsModule} from '@angular/material';
+import {BasicTabs} from './tabs-e2e';
+
+@NgModule({
+ imports: [MatTabsModule, MatFormFieldModule, MatInputModule],
+ declarations: [BasicTabs],
+})
+export class TabsE2eModule {
+}
diff --git a/src/e2e-app/toolbar/toolbar-e2e-module.ts b/src/e2e-app/toolbar/toolbar-e2e-module.ts
new file mode 100644
index 00000000000..ac81b925050
--- /dev/null
+++ b/src/e2e-app/toolbar/toolbar-e2e-module.ts
@@ -0,0 +1,20 @@
+/**
+ * @license
+ * Copyright Google LLC 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 {ExampleViewerModule} from '../example-viewer/example-viewer-module';
+import {ToolbarE2e} from './toolbar-e2e';
+
+@NgModule({
+ imports: [
+ ExampleViewerModule,
+ ],
+ declarations: [ToolbarE2e],
+})
+export class ToolbarE2eModule {
+}
diff --git a/src/e2e-app/toolbar/toolbar-e2e.ts b/src/e2e-app/toolbar/toolbar-e2e.ts
new file mode 100644
index 00000000000..89566478503
--- /dev/null
+++ b/src/e2e-app/toolbar/toolbar-e2e.ts
@@ -0,0 +1,18 @@
+/**
+ * @license
+ * Copyright Google LLC 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 {Component} from '@angular/core';
+
+@Component({
+ moduleId: module.id,
+ selector: 'toolbar-demo',
+ template: ``,
+})
+export class ToolbarE2e {
+ examples = ['toolbar-multirow'];
+}
diff --git a/src/e2e-app/virtual-scroll/virtual-scroll-e2e-module.ts b/src/e2e-app/virtual-scroll/virtual-scroll-e2e-module.ts
new file mode 100644
index 00000000000..d4579c98cc1
--- /dev/null
+++ b/src/e2e-app/virtual-scroll/virtual-scroll-e2e-module.ts
@@ -0,0 +1,19 @@
+/**
+ * @license
+ * Copyright Google LLC 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 {ScrollingModule as ExperimentalScrollingModule} from '@angular/cdk-experimental/scrolling';
+import {ScrollingModule} from '@angular/cdk/scrolling';
+import {NgModule} from '@angular/core';
+import {VirtualScrollE2E} from './virtual-scroll-e2e';
+
+@NgModule({
+ imports: [ScrollingModule, ExperimentalScrollingModule],
+ declarations: [VirtualScrollE2E],
+})
+export class VirtualScrollE2eModule {
+}