diff --git a/lib/app_component.dart b/lib/app_component.dart
new file mode 100644
index 0000000..c5d72e2
--- /dev/null
+++ b/lib/app_component.dart
@@ -0,0 +1,21 @@
+import 'package:angular/angular.dart';
+
+@Component(
+ selector: 'my-app',
+ template: '''
+
Hello {{name}}
+
+
+
+
+
+
+
+
+
+
+ ''',
+)
+class AppComponent {
+ var name = 'Darth Marty';
+}
diff --git a/pubspec.yaml b/pubspec.yaml
index 2fe07bc..9dc2faa 100644
--- a/pubspec.yaml
+++ b/pubspec.yaml
@@ -7,10 +7,12 @@ homepage: https://www.martyoehme.org/
environment:
sdk: '>=2.0.0-dev.66.0 <2.0.0'
-#dependencies:
-# path: ^1.4.1
+dependencies:
+ angular: ^5.0.0-beta
dev_dependencies:
+ angular_test: ^2.0.0-beta
build_runner: ^0.9.0
+ build_test: ^0.10.2
build_web_compilers: ^0.4.0
- test: ^1.2.0
+ test: ^1.0.0
diff --git a/test/app_test.dart b/test/app_test.dart
new file mode 100644
index 0000000..3e0614e
--- /dev/null
+++ b/test/app_test.dart
@@ -0,0 +1,32 @@
+@TestOn('browser')
+
+import 'package:rules_of_living/app_component.dart';
+import 'package:rules_of_living/app_component.template.dart' as ng;
+import 'package:angular_test/angular_test.dart';
+import 'package:test/test.dart';
+
+void main() {
+ final testBed =
+ NgTestBed.forComponent(ng.AppComponentNgFactory);
+ NgTestFixture fixture;
+
+ setUp(() async {
+ fixture = await testBed.create();
+ });
+
+ tearDown(disposeAnyRunningTest);
+
+ test('Default greeting', () {
+ expect(fixture.text, 'Hello Angular');
+ });
+
+ test('Greet world', () async {
+ await fixture.update((c) => c.name = 'World');
+ expect(fixture.text, 'Hello World');
+ });
+
+ test('Greet world HTML', () {
+ final html = fixture.rootElement.innerHtml;
+ expect(html, 'Hello Angular
');
+ });
+}
diff --git a/web/favicon.png b/web/favicon.png
new file mode 100644
index 0000000..dd18702
Binary files /dev/null and b/web/favicon.png differ
diff --git a/web/index.html b/web/index.html
index 6b86c2d..36f2b5a 100644
--- a/web/index.html
+++ b/web/index.html
@@ -1,29 +1,28 @@
-
+
-
-
-
-
- rules_of_living
-
-
-
+
+
+ Hello Angular
+
+
+
+
+
+
-
-
-
-
-
-
-
-
-
-
-
+ Loading...
+
diff --git a/web/main.dart b/web/main.dart
index 8d236aa..149766a 100644
--- a/web/main.dart
+++ b/web/main.dart
@@ -2,11 +2,15 @@ import 'dart:html' as html;
import 'package:rules_of_living/App.dart';
+import 'package:angular/angular.dart';
+import 'package:rules_of_living/app_component.template.dart' as ng;
html.CanvasElement el;
App engine;
void main() {
+ runApp(ng.AppComponentNgFactory);
+
el = new html.CanvasElement(width: 500, height: 500);
html.querySelector('#output').append(el);
engine = new App(el);
diff --git a/web/styles.css b/web/styles.css
index cc035c9..ef7a186 100644
--- a/web/styles.css
+++ b/web/styles.css
@@ -1,14 +1,117 @@
@import url(https://fonts.googleapis.com/css?family=Roboto);
+@import url(https://fonts.googleapis.com/css?family=Material+Icons);
-html, body {
- width: 100%;
- height: 100%;
- margin: 0;
+/* Master Styles */
+h1 {
+ color: #369;
+ font-family: Arial, Helvetica, sans-serif;
+ font-size: 250%;
+}
+h2, h3 {
+ color: #444;
+ font-family: Arial, Helvetica, sans-serif;
+ font-weight: lighter;
+}
+body {
+ margin: 2em;
+}
+body, input[text], button {
+ color: #888;
+ font-family: Cambria, Georgia;
+}
+a {
+ cursor: pointer;
+ cursor: hand;
+}
+button {
+ font-family: Arial;
+ background-color: #eee;
+ border: none;
+ padding: 5px 10px;
+ border-radius: 4px;
+ cursor: pointer;
+ cursor: hand;
+}
+button:hover {
+ background-color: #cfd8dc;
+}
+button:disabled {
+ background-color: #eee;
+ color: #aaa;
+ cursor: auto;
+}
+label {
+ padding-right: 0.5em;
+}
+/* Navigation link styles */
+nav a {
+ padding: 5px 10px;
+ text-decoration: none;
+ margin-right: 10px;
+ margin-top: 10px;
+ display: inline-block;
+ background-color: #eee;
+ border-radius: 4px;
+}
+nav a:visited, a:link {
+ color: #607D8B;
+}
+nav a:hover {
+ color: #039be5;
+ background-color: #CFD8DC;
+}
+nav a.active {
+ color: #039be5;
+}
+
+/* items class */
+.items {
+ margin: 0 0 2em 0;
+ list-style-type: none;
padding: 0;
- font-family: 'Roboto', sans-serif;
+ width: 24em;
}
-
-#output {
- padding: 20px;
- text-align: center;
+.items li {
+ cursor: pointer;
+ position: relative;
+ left: 0;
+ background-color: #EEE;
+ margin: .5em;
+ padding: .3em 0;
+ height: 1.6em;
+ border-radius: 4px;
+}
+.items li:hover {
+ color: #607D8B;
+ background-color: #DDD;
+ left: .1em;
+}
+.items li.selected {
+ background-color: #CFD8DC;
+ color: white;
+}
+.items li.selected:hover {
+ background-color: #BBD8DC;
+}
+.items .text {
+ position: relative;
+ top: -3px;
+}
+.items .badge {
+ display: inline-block;
+ font-size: small;
+ color: white;
+ padding: 0.8em 0.7em 0 0.7em;
+ background-color: #607D8B;
+ line-height: 1em;
+ position: relative;
+ left: -1px;
+ top: -4px;
+ height: 1.8em;
+ margin-right: .8em;
+ border-radius: 4px 0 0 4px;
+}
+/* everywhere else */
+* {
+ font-family: Arial, Helvetica, sans-serif;
}