diff --git a/.angular-cli.json b/.angular-cli.json
index bef2eeb..dbf4282 100644
--- a/.angular-cli.json
+++ b/.angular-cli.json
@@ -1,33 +1,7 @@
{
"$schema": "./node_modules/@nrwl/schematics/src/schema.json",
"project": {
- "name": "angular-react",
- "npmScope": "angular-react",
- "latestMigration": "20180328-add-nx-lint"
- },
- "e2e": {
- "protractor": {
- "config": "./protractor.conf.js"
- }
- },
- "lint": [
- {
- "project": "./tsconfig.spec.json",
- "exclude": "**/node_modules/**"
- },
- {
- "project": "apps/demo/src/tsconfig.app.json",
- "exclude": "**/node_modules/**"
- },
- {
- "project": "apps/demo/e2e/tsconfig.e2e.json",
- "exclude": "**/node_modules/**"
- }
- ],
- "test": {
- "karma": {
- "config": "./karma.conf.js"
- }
+ "name": "angular-react"
},
"apps": [
{
@@ -53,8 +27,7 @@
"environments": {
"dev": "environments/environment.ts",
"prod": "environments/environment.prod.ts"
- },
- "tags": []
+ }
},
{
"name": "demo-from-packages",
@@ -79,42 +52,63 @@
"environments": {
"dev": "environments/environment.ts",
"prod": "environments/environment.prod.ts"
- },
- "tags": []
+ }
},
{
"name": "core",
- "root": "libs/core/src",
- "test": "../../../test.js",
"appRoot": "",
- "tags": []
+ "root": "libs/core/src",
+ "test": "../../../test.js"
},
{
"name": "fabric",
- "root": "libs/fabric/src",
- "test": "../../../test.js",
"appRoot": "",
- "tags": []
+ "root": "libs/fabric/src",
+ "test": "../../../test.js"
},
{
"name": "material",
- "root": "libs/material/src",
- "test": "../../../test.js",
"appRoot": "",
- "tags": []
+ "root": "libs/material/src",
+ "test": "../../../test.js"
},
{
"name": "$workspaceRoot",
- "root": ".",
- "appRoot": ""
+ "appRoot": "",
+ "root": "."
}
],
+ "e2e": {
+ "protractor": {
+ "config": "./protractor.conf.js"
+ }
+ },
+ "lint": [
+ {
+ "project": "./tsconfig.spec.json",
+ "exclude": "**/node_modules/**"
+ },
+ {
+ "project": "apps/demo/src/tsconfig.app.json",
+ "exclude": "**/node_modules/**"
+ },
+ {
+ "project": "apps/demo/e2e/tsconfig.e2e.json",
+ "exclude": "**/node_modules/**"
+ }
+ ],
+ "test": {
+ "karma": {
+ "config": "./karma.conf.js"
+ }
+ },
"defaults": {
+ "styleExt": "scss",
+ "component": {
+ },
"schematics": {
"collection": "@nrwl/schematics"
- },
- "styleExt": "css",
- "component": {}
+ }
},
"warnings": {
"typescriptMismatch": false
diff --git a/apps/demo/src/app/app-routing.module.ts b/apps/demo/src/app/app-routing.module.ts
new file mode 100644
index 0000000..110d95e
--- /dev/null
+++ b/apps/demo/src/app/app-routing.module.ts
@@ -0,0 +1,33 @@
+import { NgModule } from '@angular/core';
+import { RouterModule, Routes } from '@angular/router';
+
+import { LandingComponent } from './containers/landing/landing.component';
+import { AngularPerfComponent } from './containers/angular-perf/angular-perf.component';
+import { MixedPerfComponent } from './containers/mixed-perf/mixed-perf.component';
+import { FabricComponent } from './containers/fabric/fabric.component';
+import { MaterialComponent } from './containers/material/material.component';
+
+
+const routes: Routes = [
+ { path: 'landing', redirectTo: '' },
+ { path: '', component: LandingComponent },
+ { path: 'perf', children: [
+ { path: 'angular', component: AngularPerfComponent },
+ { path: 'mixed', component: MixedPerfComponent },
+ ] },
+ { path: 'components', children: [
+ { path: 'fabric', component: FabricComponent },
+ { path: 'material', component: MaterialComponent },
+ ] },
+];
+
+@NgModule({
+ imports: [
+ RouterModule.forRoot(routes)
+ ],
+ exports: [
+ RouterModule
+ ],
+ declarations: []
+})
+export class AppRoutingModule { }
diff --git a/apps/demo/src/app/app.component.css b/apps/demo/src/app/app.component.css
deleted file mode 100644
index e69de29..0000000
diff --git a/apps/demo/src/app/app.component.html b/apps/demo/src/app/app.component.html
index 3b28e97..c2b84bf 100644
--- a/apps/demo/src/app/app.component.html
+++ b/apps/demo/src/app/app.component.html
@@ -1,24 +1,7 @@
-
Angular React Demo
+Landing
+Angular Perf
+Material Perf
+Fabric Components
+Material Components
-
-
-
-
-
+
diff --git a/apps/demo/src/app/app.component.scss b/apps/demo/src/app/app.component.scss
new file mode 100644
index 0000000..04564a9
--- /dev/null
+++ b/apps/demo/src/app/app.component.scss
@@ -0,0 +1,7 @@
+:host {
+ display: block;
+
+ a {
+ margin-right: 10px;
+ }
+}
diff --git a/apps/demo/src/app/app.component.ts b/apps/demo/src/app/app.component.ts
index 9eb0654..e7a5b89 100644
--- a/apps/demo/src/app/app.component.ts
+++ b/apps/demo/src/app/app.component.ts
@@ -4,27 +4,12 @@ import { Component, OnInit } from '@angular/core';
@Component({
selector: 'app-root',
templateUrl: './app.component.html',
- styleUrls: ['./app.component.css']
+ styleUrls: ['./app.component.scss']
})
export class AppComponent implements OnInit {
- disabled = true;
- dialogHidden = true;
-
constructor() { }
- ngOnInit() {
- }
+ ngOnInit() { }
- toggle() {
- this.disabled = !this.disabled;
- }
-
- toggleDialog() {
- this.dialogHidden = !this.dialogHidden;
- }
-
- click() {
- console.log('clicked');
- }
}
diff --git a/apps/demo/src/app/app.module.ts b/apps/demo/src/app/app.module.ts
index d8ae1ac..43179e9 100644
--- a/apps/demo/src/app/app.module.ts
+++ b/apps/demo/src/app/app.module.ts
@@ -2,9 +2,13 @@ import { NgModule } from '@angular/core';
import { BrowserModule } from '@angular/platform-browser';
import { NxModule } from '@nrwl/nx';
-import { AngularReactBrowserModule } from '@angular-react/core';
+import { AngularReactBrowserModule, registerElement } from '@angular-react/core';
import { AngularReactFabricModule } from '@angular-react/fabric';
import { AppComponent } from './app.component';
+import { ComponentsModule } from './components/components.module';
+import { ReactComponentsModule } from './react-components/react-components.module';
+import { AppRoutingModule } from './app-routing.module';
+import { ContainersModule } from './containers/containers.module';
@NgModule({
@@ -12,6 +16,11 @@ import { AppComponent } from './app.component';
AngularReactBrowserModule,
NxModule.forRoot(),
AngularReactFabricModule,
+ AppRoutingModule,
+
+ ContainersModule,
+ ComponentsModule,
+ ReactComponentsModule,
],
declarations: [AppComponent],
bootstrap: [AppComponent]
diff --git a/apps/demo/src/app/components/components.module.ts b/apps/demo/src/app/components/components.module.ts
new file mode 100644
index 0000000..1b7f91f
--- /dev/null
+++ b/apps/demo/src/app/components/components.module.ts
@@ -0,0 +1,20 @@
+import { NgModule, NO_ERRORS_SCHEMA } from '@angular/core';
+import { CommonModule } from '@angular/common';
+import { DotComponent } from './dot/dot.component';
+import { ReactComponentsModule } from '../react-components/react-components.module';
+import { TriangleComponent } from './triangle/triangle.component';
+import { AngularReactFabricModule } from '@angular-react/fabric';
+
+
+
+const components = [
+ DotComponent,
+ TriangleComponent,
+];
+
+@NgModule({
+ imports: [CommonModule, AngularReactFabricModule, ReactComponentsModule],
+ declarations: components,
+ exports: components,
+})
+export class ComponentsModule { }
diff --git a/apps/demo/src/app/components/dot/dot.component.html b/apps/demo/src/app/components/dot/dot.component.html
new file mode 100644
index 0000000..4d63c21
--- /dev/null
+++ b/apps/demo/src/app/components/dot/dot.component.html
@@ -0,0 +1,12 @@
+
+ {{ text }}
+
diff --git a/apps/demo/src/app/components/dot/dot.component.scss b/apps/demo/src/app/components/dot/dot.component.scss
new file mode 100644
index 0000000..781db9e
--- /dev/null
+++ b/apps/demo/src/app/components/dot/dot.component.scss
@@ -0,0 +1,14 @@
+:host div {
+ display: block;
+ position: absolute;
+ text-align: center;
+ background-color: #ddd;
+ color: #222;
+ border-radius: 50%;
+ cursor: pointer;
+}
+
+:host div.hover {
+ background-color: #0078D4;
+ color: #fff;
+}
diff --git a/apps/demo/src/app/components/dot/dot.component.spec.ts b/apps/demo/src/app/components/dot/dot.component.spec.ts
new file mode 100644
index 0000000..f33bcd1
--- /dev/null
+++ b/apps/demo/src/app/components/dot/dot.component.spec.ts
@@ -0,0 +1,28 @@
+/* tslint:disable:no-unused-variable */
+import { async, ComponentFixture, TestBed } from '@angular/core/testing';
+import { By } from '@angular/platform-browser';
+import { DebugElement } from '@angular/core';
+
+import { DotComponent } from './dot.component';
+
+describe('DotComponent', () => {
+ let component: DotComponent;
+ let fixture: ComponentFixture;
+
+ beforeEach(async(() => {
+ TestBed.configureTestingModule({
+ declarations: [ DotComponent ]
+ })
+ .compileComponents();
+ }));
+
+ beforeEach(() => {
+ fixture = TestBed.createComponent(DotComponent);
+ component = fixture.componentInstance;
+ fixture.detectChanges();
+ });
+
+ it('should create', () => {
+ expect(component).toBeTruthy();
+ });
+});
diff --git a/apps/demo/src/app/components/dot/dot.component.ts b/apps/demo/src/app/components/dot/dot.component.ts
new file mode 100644
index 0000000..6b86285
--- /dev/null
+++ b/apps/demo/src/app/components/dot/dot.component.ts
@@ -0,0 +1,26 @@
+import { ChangeDetectionStrategy, Component, Input, OnChanges, SimpleChanges } from '@angular/core';
+
+@Component({
+ selector: 'app-dot',
+ templateUrl: './dot.component.html',
+ styleUrls: ['./dot.component.scss'],
+ changeDetection: ChangeDetectionStrategy.OnPush,
+})
+export class DotComponent {
+
+ @Input() x: string;
+ @Input() y: string;
+ @Input() size: string;
+ @Input() text: string;
+
+ hover = false;
+
+ onMouseEnter(ev) {
+ this.hover = true;
+ }
+
+ onMouseLeave(ev) {
+ this.hover = false;
+ }
+
+}
diff --git a/apps/demo/src/app/components/triangle/triangle.component.html b/apps/demo/src/app/components/triangle/triangle.component.html
new file mode 100644
index 0000000..18ce74c
--- /dev/null
+++ b/apps/demo/src/app/components/triangle/triangle.component.html
@@ -0,0 +1,11 @@
+
+
+
diff --git a/apps/demo/src/app/components/triangle/triangle.component.scss b/apps/demo/src/app/components/triangle/triangle.component.scss
new file mode 100644
index 0000000..5cad981
--- /dev/null
+++ b/apps/demo/src/app/components/triangle/triangle.component.scss
@@ -0,0 +1,13 @@
+:host {
+ display: block;
+
+ .container {
+ position: absolute;
+ transform-origin: 0 0;
+ left: 50%;
+ top: 50%;
+ width: 10px;
+ height: 10px;
+ background: #eee;
+ }
+}
diff --git a/apps/demo/src/app/components/triangle/triangle.component.spec.ts b/apps/demo/src/app/components/triangle/triangle.component.spec.ts
new file mode 100644
index 0000000..9d6b38d
--- /dev/null
+++ b/apps/demo/src/app/components/triangle/triangle.component.spec.ts
@@ -0,0 +1,28 @@
+/* tslint:disable:no-unused-variable */
+import { async, ComponentFixture, TestBed } from '@angular/core/testing';
+import { By } from '@angular/platform-browser';
+import { DebugElement } from '@angular/core';
+
+import { TriangleComponent } from './triangle.component';
+
+describe('TriangleComponent', () => {
+ let component: TriangleComponent;
+ let fixture: ComponentFixture;
+
+ beforeEach(async(() => {
+ TestBed.configureTestingModule({
+ declarations: [ TriangleComponent ]
+ })
+ .compileComponents();
+ }));
+
+ beforeEach(() => {
+ fixture = TestBed.createComponent(TriangleComponent);
+ component = fixture.componentInstance;
+ fixture.detectChanges();
+ });
+
+ it('should create', () => {
+ expect(component).toBeTruthy();
+ });
+});
diff --git a/apps/demo/src/app/components/triangle/triangle.component.ts b/apps/demo/src/app/components/triangle/triangle.component.ts
new file mode 100644
index 0000000..3be619d
--- /dev/null
+++ b/apps/demo/src/app/components/triangle/triangle.component.ts
@@ -0,0 +1,113 @@
+import { ChangeDetectionStrategy, Component, Input, OnChanges, SimpleChanges, OnInit, ViewEncapsulation } from '@angular/core';
+import { DomSanitizer, SafeStyle } from '@angular/platform-browser';
+
+@Component({
+ selector: 'app-triangle',
+ templateUrl: './triangle.component.html',
+ styleUrls: ['./triangle.component.scss'],
+})
+export class TriangleComponent implements OnInit {
+
+ seconds = 0;
+ start;
+ elapsed;
+ scale = 3;
+ dots;
+ isActive;
+
+ callback;
+ interval;
+
+ constructor() { }
+
+ ngOnInit() {
+ this.dots = (new SierpinskiTriangle({x: 0, y: 0, s: 1000}, 25)).getDots();
+
+ this.begin();
+ }
+
+ update(elapsed) {
+ const t = (elapsed / 1000) % 10;
+ const scale = 1 + (t > 5 ? 10 - t : t) / 10;
+ this.scale = scale / 2.1;
+ }
+
+ begin() {
+ this.isActive = true;
+
+ this.interval = setInterval(() => {
+ this.seconds = (this.seconds % 10) + 1;
+ }, 1000);
+
+ this.start = new Date().getTime();
+
+ const callback = () => {
+ this.update(Date.now() - this.start);
+ if (this.isActive) {
+ requestAnimationFrame(callback);
+ }
+ }
+ callback();
+ }
+
+ stop() {
+ this.isActive = false;
+ clearInterval(this.interval);
+ }
+
+ toggle() {
+ if (this.isActive) {
+ this.stop();
+ } else {
+ this.begin();
+ }
+ }
+
+}
+
+class SierpinskiTriangle {
+
+ triangles: Array | any = [];
+ dot: SierpinskiTriangleDot;
+
+ constructor({ x, y, s }, targetSize) {
+ if (s <= targetSize) {
+ this.dot = new SierpinskiTriangleDot(
+ x - (targetSize / 2),
+ y - (targetSize / 2),
+ targetSize
+ );
+ } else {
+ const newSize = s / 2;
+ s /= 2;
+ this.triangles = [
+ new SierpinskiTriangle({x, y: y - (s / 2), s}, targetSize),
+ new SierpinskiTriangle({x: x - s, y: y + (s / 2), s}, targetSize),
+ new SierpinskiTriangle({x: x + s, y: y + (s / 2), s}, targetSize)
+ ];
+ }
+ }
+
+ getDots() {
+ return this.triangles.reduce( (acc, t) => [...acc, ...t.getDots(), ...(t.dot || [])], []);
+ }
+
+}
+
+class SierpinskiTriangleDot {
+
+ get x() {
+ return this._x + 'px';
+ }
+
+ get y() {
+ return this._y + 'px';
+ }
+
+ get size() {
+ return this._size * 0.9 + 'px';
+ }
+
+ constructor(private _x, private _y, private _size) { }
+
+}
diff --git a/apps/demo/src/app/containers/angular-perf/angular-perf.component.html b/apps/demo/src/app/containers/angular-perf/angular-perf.component.html
new file mode 100644
index 0000000..0c85891
--- /dev/null
+++ b/apps/demo/src/app/containers/angular-perf/angular-perf.component.html
@@ -0,0 +1,4 @@
+Angular Perf Demo
+Pure Angular View
+
+
diff --git a/apps/demo/src/app/containers/angular-perf/angular-perf.component.scss b/apps/demo/src/app/containers/angular-perf/angular-perf.component.scss
new file mode 100644
index 0000000..f3faac5
--- /dev/null
+++ b/apps/demo/src/app/containers/angular-perf/angular-perf.component.scss
@@ -0,0 +1,4 @@
+:host {
+ display: block;
+
+}
diff --git a/apps/demo/src/app/containers/angular-perf/angular-perf.component.spec.ts b/apps/demo/src/app/containers/angular-perf/angular-perf.component.spec.ts
new file mode 100644
index 0000000..3dcc043
--- /dev/null
+++ b/apps/demo/src/app/containers/angular-perf/angular-perf.component.spec.ts
@@ -0,0 +1,25 @@
+import { async, ComponentFixture, TestBed } from '@angular/core/testing';
+
+import { AngularPerfComponent } from './angular-perf.component';
+
+describe('AngularPerfComponent', () => {
+ let component: AngularPerfComponent;
+ let fixture: ComponentFixture;
+
+ beforeEach(async(() => {
+ TestBed.configureTestingModule({
+ declarations: [ AngularPerfComponent ]
+ })
+ .compileComponents();
+ }));
+
+ beforeEach(() => {
+ fixture = TestBed.createComponent(AngularPerfComponent);
+ component = fixture.componentInstance;
+ fixture.detectChanges();
+ });
+
+ it('should create', () => {
+ expect(component).toBeTruthy();
+ });
+});
diff --git a/apps/demo/src/app/containers/angular-perf/angular-perf.component.ts b/apps/demo/src/app/containers/angular-perf/angular-perf.component.ts
new file mode 100644
index 0000000..fb36581
--- /dev/null
+++ b/apps/demo/src/app/containers/angular-perf/angular-perf.component.ts
@@ -0,0 +1,15 @@
+import { Component, OnInit } from '@angular/core';
+
+@Component({
+ selector: 'app-angular-perf',
+ templateUrl: './angular-perf.component.html',
+ styleUrls: ['./angular-perf.component.scss']
+})
+export class AngularPerfComponent implements OnInit {
+
+ constructor() { }
+
+ ngOnInit() {
+ }
+
+}
diff --git a/apps/demo/src/app/containers/containers.module.ts b/apps/demo/src/app/containers/containers.module.ts
new file mode 100644
index 0000000..54a7bf6
--- /dev/null
+++ b/apps/demo/src/app/containers/containers.module.ts
@@ -0,0 +1,19 @@
+import { NgModule } from '@angular/core';
+import { CommonModule } from '@angular/common';
+import { AngularPerfComponent } from './angular-perf/angular-perf.component';
+import { MixedPerfComponent } from './mixed-perf/mixed-perf.component';
+import { FabricComponent } from './fabric/fabric.component';
+import { MaterialComponent } from './material/material.component';
+import { LandingComponent } from './landing/landing.component';
+import { ComponentsModule } from '../components/components.module';
+import { AngularReactFabricModule } from '@angular-react/fabric';
+
+@NgModule({
+ imports: [
+ CommonModule,
+ ComponentsModule,
+ AngularReactFabricModule,
+ ],
+ declarations: [AngularPerfComponent, MixedPerfComponent, FabricComponent, MaterialComponent, LandingComponent]
+})
+export class ContainersModule { }
diff --git a/apps/demo/src/app/containers/fabric/fabric.component.html b/apps/demo/src/app/containers/fabric/fabric.component.html
new file mode 100644
index 0000000..faac7ec
--- /dev/null
+++ b/apps/demo/src/app/containers/fabric/fabric.component.html
@@ -0,0 +1,25 @@
+Microsoft Fabric Components
+
+
+ -
+
+
+
+ -
+
+ {{ sampleContent }}
+
+ -
+
+
+
+
+
+
+
+
diff --git a/apps/demo/src/app/containers/fabric/fabric.component.scss b/apps/demo/src/app/containers/fabric/fabric.component.scss
new file mode 100644
index 0000000..40a265b
--- /dev/null
+++ b/apps/demo/src/app/containers/fabric/fabric.component.scss
@@ -0,0 +1,22 @@
+:host {
+
+ fabric-button {
+ margin-right: 20px;
+ }
+
+ ul {
+ list-style: none;
+
+ li {
+ margin-bottom: 10px;
+
+ span.button-height {
+ line-height: 30px;
+ }
+ }
+ }
+}
+:host {
+ display: block;
+
+}
diff --git a/apps/demo/src/app/containers/fabric/fabric.component.spec.ts b/apps/demo/src/app/containers/fabric/fabric.component.spec.ts
new file mode 100644
index 0000000..a5c4def
--- /dev/null
+++ b/apps/demo/src/app/containers/fabric/fabric.component.spec.ts
@@ -0,0 +1,25 @@
+import { async, ComponentFixture, TestBed } from '@angular/core/testing';
+
+import { FabricComponent } from './fabric.component';
+
+describe('FabricComponent', () => {
+ let component: FabricComponent;
+ let fixture: ComponentFixture;
+
+ beforeEach(async(() => {
+ TestBed.configureTestingModule({
+ declarations: [ FabricComponent ]
+ })
+ .compileComponents();
+ }));
+
+ beforeEach(() => {
+ fixture = TestBed.createComponent(FabricComponent);
+ component = fixture.componentInstance;
+ fixture.detectChanges();
+ });
+
+ it('should create', () => {
+ expect(component).toBeTruthy();
+ });
+});
diff --git a/apps/demo/src/app/containers/fabric/fabric.component.ts b/apps/demo/src/app/containers/fabric/fabric.component.ts
new file mode 100644
index 0000000..9e513cb
--- /dev/null
+++ b/apps/demo/src/app/containers/fabric/fabric.component.ts
@@ -0,0 +1,34 @@
+import { Component, OnInit } from '@angular/core';
+
+@Component({
+ selector: 'app-fabric',
+ templateUrl: './fabric.component.html',
+ styleUrls: ['./fabric.component.scss']
+})
+export class FabricComponent implements OnInit {
+
+ disabled = true;
+ dialogHidden = true;
+ sampleContentCounter = 0;
+
+ get sampleContent() {
+ return `Button clicked ${this.sampleContentCounter} times.`;
+ }
+
+ constructor() { }
+
+ ngOnInit() { }
+
+ toggle() {
+ this.disabled = !this.disabled;
+ }
+
+ toggleDialog() {
+ this.dialogHidden = !this.dialogHidden;
+ }
+
+ click() {
+ this.sampleContentCounter += 1;
+ }
+
+}
diff --git a/apps/demo/src/app/containers/landing/landing.component.html b/apps/demo/src/app/containers/landing/landing.component.html
new file mode 100644
index 0000000..7fb63ce
--- /dev/null
+++ b/apps/demo/src/app/containers/landing/landing.component.html
@@ -0,0 +1,3 @@
+
+ landing works!
+
diff --git a/apps/demo/src/app/containers/landing/landing.component.scss b/apps/demo/src/app/containers/landing/landing.component.scss
new file mode 100644
index 0000000..f3faac5
--- /dev/null
+++ b/apps/demo/src/app/containers/landing/landing.component.scss
@@ -0,0 +1,4 @@
+:host {
+ display: block;
+
+}
diff --git a/apps/demo/src/app/containers/landing/landing.component.spec.ts b/apps/demo/src/app/containers/landing/landing.component.spec.ts
new file mode 100644
index 0000000..fc4cff8
--- /dev/null
+++ b/apps/demo/src/app/containers/landing/landing.component.spec.ts
@@ -0,0 +1,25 @@
+import { async, ComponentFixture, TestBed } from '@angular/core/testing';
+
+import { LandingComponent } from './landing.component';
+
+describe('LandingComponent', () => {
+ let component: LandingComponent;
+ let fixture: ComponentFixture;
+
+ beforeEach(async(() => {
+ TestBed.configureTestingModule({
+ declarations: [ LandingComponent ]
+ })
+ .compileComponents();
+ }));
+
+ beforeEach(() => {
+ fixture = TestBed.createComponent(LandingComponent);
+ component = fixture.componentInstance;
+ fixture.detectChanges();
+ });
+
+ it('should create', () => {
+ expect(component).toBeTruthy();
+ });
+});
diff --git a/apps/demo/src/app/containers/landing/landing.component.ts b/apps/demo/src/app/containers/landing/landing.component.ts
new file mode 100644
index 0000000..0a884c5
--- /dev/null
+++ b/apps/demo/src/app/containers/landing/landing.component.ts
@@ -0,0 +1,15 @@
+import { Component, OnInit } from '@angular/core';
+
+@Component({
+ selector: 'app-landing',
+ templateUrl: './landing.component.html',
+ styleUrls: ['./landing.component.scss']
+})
+export class LandingComponent implements OnInit {
+
+ constructor() { }
+
+ ngOnInit() {
+ }
+
+}
diff --git a/apps/demo/src/app/containers/material/material.component.html b/apps/demo/src/app/containers/material/material.component.html
new file mode 100644
index 0000000..96a1803
--- /dev/null
+++ b/apps/demo/src/app/containers/material/material.component.html
@@ -0,0 +1 @@
+Google Material Components
diff --git a/apps/demo/src/app/containers/material/material.component.scss b/apps/demo/src/app/containers/material/material.component.scss
new file mode 100644
index 0000000..f3faac5
--- /dev/null
+++ b/apps/demo/src/app/containers/material/material.component.scss
@@ -0,0 +1,4 @@
+:host {
+ display: block;
+
+}
diff --git a/apps/demo/src/app/containers/material/material.component.spec.ts b/apps/demo/src/app/containers/material/material.component.spec.ts
new file mode 100644
index 0000000..7293b78
--- /dev/null
+++ b/apps/demo/src/app/containers/material/material.component.spec.ts
@@ -0,0 +1,25 @@
+import { async, ComponentFixture, TestBed } from '@angular/core/testing';
+
+import { MaterialComponent } from './material.component';
+
+describe('MaterialComponent', () => {
+ let component: MaterialComponent;
+ let fixture: ComponentFixture;
+
+ beforeEach(async(() => {
+ TestBed.configureTestingModule({
+ declarations: [ MaterialComponent ]
+ })
+ .compileComponents();
+ }));
+
+ beforeEach(() => {
+ fixture = TestBed.createComponent(MaterialComponent);
+ component = fixture.componentInstance;
+ fixture.detectChanges();
+ });
+
+ it('should create', () => {
+ expect(component).toBeTruthy();
+ });
+});
diff --git a/apps/demo/src/app/containers/material/material.component.ts b/apps/demo/src/app/containers/material/material.component.ts
new file mode 100644
index 0000000..0f472da
--- /dev/null
+++ b/apps/demo/src/app/containers/material/material.component.ts
@@ -0,0 +1,15 @@
+import { Component, OnInit } from '@angular/core';
+
+@Component({
+ selector: 'app-material',
+ templateUrl: './material.component.html',
+ styleUrls: ['./material.component.scss']
+})
+export class MaterialComponent implements OnInit {
+
+ constructor() { }
+
+ ngOnInit() {
+ }
+
+}
diff --git a/apps/demo/src/app/containers/mixed-perf/mixed-perf.component.html b/apps/demo/src/app/containers/mixed-perf/mixed-perf.component.html
new file mode 100644
index 0000000..0889583
--- /dev/null
+++ b/apps/demo/src/app/containers/mixed-perf/mixed-perf.component.html
@@ -0,0 +1,4 @@
+Mixed Perf Demo
+React leaf nodes rendered in an Angular View
+
+
diff --git a/apps/demo/src/app/containers/mixed-perf/mixed-perf.component.scss b/apps/demo/src/app/containers/mixed-perf/mixed-perf.component.scss
new file mode 100644
index 0000000..f3faac5
--- /dev/null
+++ b/apps/demo/src/app/containers/mixed-perf/mixed-perf.component.scss
@@ -0,0 +1,4 @@
+:host {
+ display: block;
+
+}
diff --git a/apps/demo/src/app/containers/mixed-perf/mixed-perf.component.spec.ts b/apps/demo/src/app/containers/mixed-perf/mixed-perf.component.spec.ts
new file mode 100644
index 0000000..1b91586
--- /dev/null
+++ b/apps/demo/src/app/containers/mixed-perf/mixed-perf.component.spec.ts
@@ -0,0 +1,25 @@
+import { async, ComponentFixture, TestBed } from '@angular/core/testing';
+
+import { MixedPerfComponent } from './mixed-perf.component';
+
+describe('MixedPerfComponent', () => {
+ let component: MixedPerfComponent;
+ let fixture: ComponentFixture;
+
+ beforeEach(async(() => {
+ TestBed.configureTestingModule({
+ declarations: [ MixedPerfComponent ]
+ })
+ .compileComponents();
+ }));
+
+ beforeEach(() => {
+ fixture = TestBed.createComponent(MixedPerfComponent);
+ component = fixture.componentInstance;
+ fixture.detectChanges();
+ });
+
+ it('should create', () => {
+ expect(component).toBeTruthy();
+ });
+});
diff --git a/apps/demo/src/app/containers/mixed-perf/mixed-perf.component.ts b/apps/demo/src/app/containers/mixed-perf/mixed-perf.component.ts
new file mode 100644
index 0000000..6e034c9
--- /dev/null
+++ b/apps/demo/src/app/containers/mixed-perf/mixed-perf.component.ts
@@ -0,0 +1,15 @@
+import { Component, OnInit } from '@angular/core';
+
+@Component({
+ selector: 'app-mixed-perf',
+ templateUrl: './mixed-perf.component.html',
+ styleUrls: ['./mixed-perf.component.scss']
+})
+export class MixedPerfComponent implements OnInit {
+
+ constructor() { }
+
+ ngOnInit() {
+ }
+
+}
diff --git a/apps/demo/src/app/react-components/react-components.module.ts b/apps/demo/src/app/react-components/react-components.module.ts
new file mode 100644
index 0000000..73f737b
--- /dev/null
+++ b/apps/demo/src/app/react-components/react-components.module.ts
@@ -0,0 +1,25 @@
+import { NgModule, NO_ERRORS_SCHEMA } from '@angular/core';
+import { CommonModule } from '@angular/common';
+
+import { registerElement } from '@angular-react/core';
+import { ReactDotComponent, ReactDot } from './react-dot/react-dot.component';
+
+
+const components = [
+ ReactDotComponent,
+];
+
+@NgModule({
+ imports: [CommonModule],
+ declarations: components,
+ exports: components,
+ schemas: [NO_ERRORS_SCHEMA]
+})
+export class ReactComponentsModule {
+
+ constructor() {
+ // Add any React elements to the registry (used by the renderer).
+ registerElement('ReactDot', () => ReactDot);
+ }
+
+}
diff --git a/apps/demo/src/app/react-components/react-dot/react-dot.component.spec.ts b/apps/demo/src/app/react-components/react-dot/react-dot.component.spec.ts
new file mode 100644
index 0000000..092c0d8
--- /dev/null
+++ b/apps/demo/src/app/react-components/react-dot/react-dot.component.spec.ts
@@ -0,0 +1,28 @@
+/* tslint:disable:no-unused-variable */
+import { async, ComponentFixture, TestBed } from '@angular/core/testing';
+import { By } from '@angular/platform-browser';
+import { DebugElement } from '@angular/core';
+
+import { ReactDotComponent } from './react-dot.component';
+
+describe('ReactDotComponent', () => {
+ let component: ReactDotComponent;
+ let fixture: ComponentFixture;
+
+ beforeEach(async(() => {
+ TestBed.configureTestingModule({
+ declarations: [ ReactDotComponent ]
+ })
+ .compileComponents();
+ }));
+
+ beforeEach(() => {
+ fixture = TestBed.createComponent(ReactDotComponent);
+ component = fixture.componentInstance;
+ fixture.detectChanges();
+ });
+
+ it('should create', () => {
+ expect(component).toBeTruthy();
+ });
+});
diff --git a/apps/demo/src/app/react-components/react-dot/react-dot.component.ts b/apps/demo/src/app/react-components/react-dot/react-dot.component.ts
new file mode 100644
index 0000000..c5ffb7b
--- /dev/null
+++ b/apps/demo/src/app/react-components/react-dot/react-dot.component.ts
@@ -0,0 +1,77 @@
+import { ChangeDetectionStrategy, Component, Input, OnChanges, SimpleChanges } from '@angular/core';
+import * as React from 'react';
+import * as ReactDOM from 'react-dom';
+
+@Component({
+ selector: 'app-react-dot',
+ template: `
+
+
+ `,
+ changeDetection: ChangeDetectionStrategy.OnPush,
+ styles: [ 'react-renderer' ],
+})
+export class ReactDotComponent implements OnChanges {
+
+ @Input() x: number;
+ @Input() y: number;
+ @Input() size: number;
+ @Input() text: string;
+
+ hover = false;
+ style: { [k: string]: any };
+ bgColor: string;
+
+ ngOnChanges(changes: SimpleChanges) {
+ const shapeChanged = 'x' in changes || 'y' in changes || 'size' in changes;
+
+ if (shapeChanged) {
+ this.updateStyle();
+ }
+ }
+
+ enter() {
+ this.hover = true;
+ this.bgColor = '#ff0';
+ }
+
+ leave() {
+ this.hover = false;
+ this.bgColor = undefined;
+ }
+
+ private updateStyle() {
+ const s = this.size * 1.3;
+ this.style = {
+ width: s + 'px',
+ height: s + 'px',
+ left: (this.x) + 'px',
+ top: (this.y) + 'px',
+ borderRadius: (s / 2) + 'px',
+ lineHeight: (s) + 'px',
+ };
+ }
+
+}
+
+export class ReactDot extends React.Component {
+
+ private divStyle = {
+ position: 'absolute',
+ background: '#61dafb',
+ font: 'normal 15px sans-serif',
+ textAlign: 'center',
+ cursor: 'pointer'
+ }
+
+
+ constructor(props) {
+ super(props);
+
+ }
+
+ render() {
+ return React.createElement('div', { style: this.divStyle }, [this.props['text']]);
+ }
+
+}
diff --git a/libs/fabric/src/components/fabric-button.component.css b/libs/fabric/src/components/fabric-button.component.css
new file mode 100644
index 0000000..6dec339
--- /dev/null
+++ b/libs/fabric/src/components/fabric-button.component.css
@@ -0,0 +1,4 @@
+:host {
+ background: red;
+ display: inline-block;
+}
diff --git a/libs/fabric/src/components/fabric-button.component.ts b/libs/fabric/src/components/fabric-button.component.ts
index 1a3a3bb..ac6376a 100644
--- a/libs/fabric/src/components/fabric-button.component.ts
+++ b/libs/fabric/src/components/fabric-button.component.ts
@@ -18,7 +18,11 @@ import { IButtonProps, DefaultButton } from 'office-ui-fabric-react/lib/Button';
[text]="text"
(onClick)="onClick($event)">
`,
- styles: ['react-renderer'],
+ styleUrls: ['./fabric-button.component.css'],
+ styles: [
+ 'react-renderer',
+ ':host { display: inline-block; background: red; }'
+ ],
changeDetection: ChangeDetectionStrategy.OnPush,
})
export class FabricButtonComponent {