Speedometer: ensure all TodoMVC tests use the complete latest CSS
authorcommit-queue@webkit.org <commit-queue@webkit.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Tue, 26 Sep 2017 23:48:14 +0000 (23:48 +0000)
committercommit-queue@webkit.org <commit-queue@webkit.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Tue, 26 Sep 2017 23:48:14 +0000 (23:48 +0000)
https://bugs.webkit.org/show_bug.cgi?id=177358

Patch by Mathias Bynens <mathias@qiwi.be> on 2017-09-26
Reviewed by Ryosuke Niwa.

* Speedometer/resources/todomvc/architecture-examples/angular/dist/*: Updated per build instructions.
* Speedometer/resources/todomvc/architecture-examples/angular/src/assets/css/todomvc-app.css: Updated to latest version.
* Speedometer/resources/todomvc/architecture-examples/angularjs/node_modules/*: Updated to latest TodoMVC CSS.
* Speedometer/resources/todomvc/architecture-examples/angularjs/package-lock.json: Added.
* Speedometer/resources/todomvc/architecture-examples/angularjs/package.json: Updated to latest TodoMVC CSS.
* Speedometer/resources/todomvc/architecture-examples/angularjs/todomvc-index.html: Updated to match new CSS classnames.
* Speedometer/resources/todomvc/architecture-examples/emberjs-debug/assets/vendor.css: Manually updated to latest TodoMVC CSS, except with IDs instead of classes. (Build steps unknown.)
* Speedometer/resources/todomvc/architecture-examples/emberjs/app/components/todo-list.js: Updated to match new CSS classnames.
* Speedometer/resources/todomvc/architecture-examples/emberjs/app/templates/application.hbs: Updated to match new CSS classnames.
* Speedometer/resources/todomvc/architecture-examples/emberjs/app/templates/components/todo-list.hbs: Updated to match new CSS classnames.
* Speedometer/resources/todomvc/architecture-examples/emberjs/dist/*: Updated per build instructions.
* Speedometer/resources/todomvc/architecture-examples/emberjs/vendor/index.css: Updated to latest TodoMVC CSS.
* Speedometer/resources/todomvc/architecture-examples/inferno/node_modules/*: Updated TodoMVC CSS.
* Speedometer/resources/todomvc/architecture-examples/inferno/package.json: Updated TodoMVC CSS.
* Speedometer/resources/todomvc/architecture-examples/jquery/index.html: Updated to match new CSS classnames.
* Speedometer/resources/todomvc/architecture-examples/jquery/node_modules/*: Updated TodoMVC CSS.
* Speedometer/resources/todomvc/architecture-examples/jquery/package.json: Updated to latest TodoMVC CSS.
* Speedometer/resources/todomvc/dependency-examples/flight/flight/app/templates/stats.html: Updated to match new CSS classnames.
* Speedometer/resources/todomvc/dependency-examples/flight/flight/index.html: Updated to match new CSS classnames.
* Speedometer/resources/todomvc/dependency-examples/flight/flight/node_modules/todomvc-app-css/index.css: Updated to latest TodoMVC CSS.
* Speedometer/resources/todomvc/dependency-examples/flight/flight/node_modules/todomvc-app-css/package.json: Updated to latest TodoMVC CSS.
* Speedometer/resources/todomvc/dependency-examples/flight/flight/node_modules/todomvc-common/*: Updated to latest version.
* Speedometer/resources/todomvc/dependency-examples/flight/flight/package.json: Updated to latest TodoMVC CSS.
* Speedometer/resources/todomvc/functional-prog-examples/elm/node_modules/todomvc-app-css/index.css: Updated to latest TodoMVC CSS.
* Speedometer/resources/todomvc/functional-prog-examples/elm/node_modules/todomvc-common/base.js: Updated to latest version.
* Speedometer/resources/todomvc/functional-prog-examples/elm/package.json: Updated to latest TodoMVC CSS.
* Speedometer/resources/todomvc/vanilla-examples/es2015-babel-webpack/dist/*: Updated per build instructions.
* Speedometer/resources/todomvc/vanilla-examples/es2015-babel-webpack/package-lock.json: Updated to latest TodoMVC CSS.
* Speedometer/resources/todomvc/vanilla-examples/es2015-babel-webpack/package.json: Updated to latest TodoMVC CSS.
* Speedometer/resources/todomvc/vanilla-examples/es2015/node_modules/todomvc-app-css/index.css: Updated to latest TodoMVC CSS.
* Speedometer/resources/todomvc/vanilla-examples/es2015/node_modules/todomvc-app-css/package.json: Updated to latest TodoMVC CSS.
* Speedometer/resources/todomvc/vanilla-examples/es2015/node_modules/todomvc-app-css/readme.md: Updated to latest TodoMVC CSS.
* Speedometer/resources/todomvc/vanilla-examples/es2015/node_modules/todomvc-common/*: Updated to latest version.
* Speedometer/resources/todomvc/vanilla-examples/es2015/package.json: Updated to latest TodoMVC CSS.
* Speedometer/resources/todomvc/vanilla-examples/vanillajs/node_modules/todomvc-app-css/index.css: Updated to latest TodoMVC CSS.
* Speedometer/resources/todomvc/vanilla-examples/vanillajs/node_modules/todomvc-common/*: Updated to latest version.
* Speedometer/resources/todomvc/vanilla-examples/vanillajs/package.json: Updated to latest TodoMVC CSS.

git-svn-id: https://svn.webkit.org/repository/webkit/trunk@222534 268f45cc-cd09-0410-ab3c-d52691b4dbfc

67 files changed:
PerformanceTests/ChangeLog
PerformanceTests/Speedometer/resources/todomvc/architecture-examples/angular/dist/assets/css/todomvc-app.css
PerformanceTests/Speedometer/resources/todomvc/architecture-examples/angular/dist/index.html
PerformanceTests/Speedometer/resources/todomvc/architecture-examples/angular/dist/inline.3b7f8ce2e6bc2f77dd83.bundle.js [moved from PerformanceTests/Speedometer/resources/todomvc/architecture-examples/angular/dist/inline.28efc571905d42a672b0.bundle.js with 92% similarity]
PerformanceTests/Speedometer/resources/todomvc/architecture-examples/angular/dist/main.f1c5d33a6950c335064d.bundle.js [moved from PerformanceTests/Speedometer/resources/todomvc/architecture-examples/angular/dist/main.c82799edffc751aa6590.bundle.js with 100% similarity]
PerformanceTests/Speedometer/resources/todomvc/architecture-examples/angular/src/assets/css/todomvc-app.css
PerformanceTests/Speedometer/resources/todomvc/architecture-examples/angularjs/node_modules/todomvc-app-css/index.css
PerformanceTests/Speedometer/resources/todomvc/architecture-examples/angularjs/node_modules/todomvc-app-css/package.json
PerformanceTests/Speedometer/resources/todomvc/architecture-examples/angularjs/node_modules/todomvc-common/base.js
PerformanceTests/Speedometer/resources/todomvc/architecture-examples/angularjs/node_modules/todomvc-common/package.json
PerformanceTests/Speedometer/resources/todomvc/architecture-examples/angularjs/package-lock.json
PerformanceTests/Speedometer/resources/todomvc/architecture-examples/angularjs/package.json
PerformanceTests/Speedometer/resources/todomvc/architecture-examples/angularjs/todomvc-index.html
PerformanceTests/Speedometer/resources/todomvc/architecture-examples/emberjs-debug/assets/vendor.css
PerformanceTests/Speedometer/resources/todomvc/architecture-examples/emberjs/app/components/todo-list.js
PerformanceTests/Speedometer/resources/todomvc/architecture-examples/emberjs/app/templates/application.hbs
PerformanceTests/Speedometer/resources/todomvc/architecture-examples/emberjs/app/templates/components/todo-list.hbs
PerformanceTests/Speedometer/resources/todomvc/architecture-examples/emberjs/dist/assets/todomvc-5d3e8eb3d5b3740a33185edcb11eeb57.js [moved from PerformanceTests/Speedometer/resources/todomvc/architecture-examples/emberjs/dist/assets/todomvc-677491ba42e10b5fa16875d8bcaf1c6c.js with 56% similarity]
PerformanceTests/Speedometer/resources/todomvc/architecture-examples/emberjs/dist/assets/vendor-7b5c98520910afa58d74e05ec86cd873.css [deleted file]
PerformanceTests/Speedometer/resources/todomvc/architecture-examples/emberjs/dist/assets/vendor-a45c44bc56b4692cca4a96b6916c0fde.css [new file with mode: 0644]
PerformanceTests/Speedometer/resources/todomvc/architecture-examples/emberjs/dist/index.html
PerformanceTests/Speedometer/resources/todomvc/architecture-examples/emberjs/vendor/index.css
PerformanceTests/Speedometer/resources/todomvc/architecture-examples/inferno/node_modules/todomvc-app-css/index.css
PerformanceTests/Speedometer/resources/todomvc/architecture-examples/inferno/node_modules/todomvc-app-css/package.json
PerformanceTests/Speedometer/resources/todomvc/architecture-examples/inferno/node_modules/todomvc-common/base.js
PerformanceTests/Speedometer/resources/todomvc/architecture-examples/inferno/node_modules/todomvc-common/package.json
PerformanceTests/Speedometer/resources/todomvc/architecture-examples/inferno/package.json
PerformanceTests/Speedometer/resources/todomvc/architecture-examples/jquery/index.html
PerformanceTests/Speedometer/resources/todomvc/architecture-examples/jquery/node_modules/todomvc-app-css/index.css
PerformanceTests/Speedometer/resources/todomvc/architecture-examples/jquery/node_modules/todomvc-app-css/package.json
PerformanceTests/Speedometer/resources/todomvc/architecture-examples/jquery/node_modules/todomvc-common/base.js
PerformanceTests/Speedometer/resources/todomvc/architecture-examples/jquery/node_modules/todomvc-common/package.json
PerformanceTests/Speedometer/resources/todomvc/architecture-examples/jquery/package.json
PerformanceTests/Speedometer/resources/todomvc/dependency-examples/flight/flight/app/templates/stats.html
PerformanceTests/Speedometer/resources/todomvc/dependency-examples/flight/flight/index.html
PerformanceTests/Speedometer/resources/todomvc/dependency-examples/flight/flight/node_modules/todomvc-app-css/index.css
PerformanceTests/Speedometer/resources/todomvc/dependency-examples/flight/flight/node_modules/todomvc-app-css/package.json
PerformanceTests/Speedometer/resources/todomvc/dependency-examples/flight/flight/node_modules/todomvc-common/base.js
PerformanceTests/Speedometer/resources/todomvc/dependency-examples/flight/flight/node_modules/todomvc-common/package.json
PerformanceTests/Speedometer/resources/todomvc/dependency-examples/flight/flight/package.json
PerformanceTests/Speedometer/resources/todomvc/functional-prog-examples/elm/node_modules/todomvc-app-css/index.css
PerformanceTests/Speedometer/resources/todomvc/functional-prog-examples/elm/node_modules/todomvc-common/base.js
PerformanceTests/Speedometer/resources/todomvc/functional-prog-examples/elm/package.json
PerformanceTests/Speedometer/resources/todomvc/vanilla-examples/es2015-babel-webpack/dist/bundle.app.930ad8b83126862d7445.js [moved from PerformanceTests/Speedometer/resources/todomvc/vanilla-examples/es2015-babel-webpack/dist/bundle.app.71bb1f671e4e65604d05.js with 98% similarity]
PerformanceTests/Speedometer/resources/todomvc/vanilla-examples/es2015-babel-webpack/dist/bundle.app.930ad8b83126862d7445.js.map [moved from PerformanceTests/Speedometer/resources/todomvc/vanilla-examples/es2015-babel-webpack/dist/bundle.app.71bb1f671e4e65604d05.js.map with 99% similarity]
PerformanceTests/Speedometer/resources/todomvc/vanilla-examples/es2015-babel-webpack/dist/bundle.manifest.e81199b00da2921d9c94.js [moved from PerformanceTests/Speedometer/resources/todomvc/vanilla-examples/es2015-babel-webpack/dist/bundle.manifest.2102040c9a6e04cc046e.js with 91% similarity]
PerformanceTests/Speedometer/resources/todomvc/vanilla-examples/es2015-babel-webpack/dist/bundle.manifest.e81199b00da2921d9c94.js.map [moved from PerformanceTests/Speedometer/resources/todomvc/vanilla-examples/es2015-babel-webpack/dist/bundle.manifest.2102040c9a6e04cc046e.js.map with 95% similarity]
PerformanceTests/Speedometer/resources/todomvc/vanilla-examples/es2015-babel-webpack/dist/bundle.vendor.577c6bc09319b27fed34.js [moved from PerformanceTests/Speedometer/resources/todomvc/vanilla-examples/es2015-babel-webpack/dist/bundle.vendor.b16cc08e016d07886f5f.js with 89% similarity]
PerformanceTests/Speedometer/resources/todomvc/vanilla-examples/es2015-babel-webpack/dist/bundle.vendor.577c6bc09319b27fed34.js.map [moved from PerformanceTests/Speedometer/resources/todomvc/vanilla-examples/es2015-babel-webpack/dist/bundle.vendor.b16cc08e016d07886f5f.js.map with 93% similarity]
PerformanceTests/Speedometer/resources/todomvc/vanilla-examples/es2015-babel-webpack/dist/index.html
PerformanceTests/Speedometer/resources/todomvc/vanilla-examples/es2015-babel-webpack/dist/styles.app.930ad8b83126862d7445.css [moved from PerformanceTests/Speedometer/resources/todomvc/vanilla-examples/es2015-babel-webpack/dist/styles.app.71bb1f671e4e65604d05.css with 80% similarity]
PerformanceTests/Speedometer/resources/todomvc/vanilla-examples/es2015-babel-webpack/dist/styles.app.930ad8b83126862d7445.css.map [moved from PerformanceTests/Speedometer/resources/todomvc/vanilla-examples/es2015-babel-webpack/dist/styles.app.71bb1f671e4e65604d05.css.map with 57% similarity]
PerformanceTests/Speedometer/resources/todomvc/vanilla-examples/es2015-babel-webpack/dist/styles.vendor.577c6bc09319b27fed34.css [new file with mode: 0644]
PerformanceTests/Speedometer/resources/todomvc/vanilla-examples/es2015-babel-webpack/dist/styles.vendor.577c6bc09319b27fed34.css.map [moved from PerformanceTests/Speedometer/resources/todomvc/vanilla-examples/es2015-babel-webpack/dist/styles.vendor.b16cc08e016d07886f5f.css.map with 55% similarity]
PerformanceTests/Speedometer/resources/todomvc/vanilla-examples/es2015-babel-webpack/dist/styles.vendor.b16cc08e016d07886f5f.css [deleted file]
PerformanceTests/Speedometer/resources/todomvc/vanilla-examples/es2015-babel-webpack/package-lock.json
PerformanceTests/Speedometer/resources/todomvc/vanilla-examples/es2015-babel-webpack/package.json
PerformanceTests/Speedometer/resources/todomvc/vanilla-examples/es2015/node_modules/todomvc-app-css/index.css
PerformanceTests/Speedometer/resources/todomvc/vanilla-examples/es2015/node_modules/todomvc-app-css/package.json [changed mode: 0755->0644]
PerformanceTests/Speedometer/resources/todomvc/vanilla-examples/es2015/node_modules/todomvc-app-css/readme.md [changed mode: 0755->0644]
PerformanceTests/Speedometer/resources/todomvc/vanilla-examples/es2015/node_modules/todomvc-common/base.js
PerformanceTests/Speedometer/resources/todomvc/vanilla-examples/es2015/node_modules/todomvc-common/package.json [changed mode: 0755->0644]
PerformanceTests/Speedometer/resources/todomvc/vanilla-examples/es2015/node_modules/todomvc-common/readme.md [changed mode: 0755->0644]
PerformanceTests/Speedometer/resources/todomvc/vanilla-examples/es2015/package.json
PerformanceTests/Speedometer/resources/todomvc/vanilla-examples/vanillajs/node_modules/todomvc-app-css/index.css
PerformanceTests/Speedometer/resources/todomvc/vanilla-examples/vanillajs/node_modules/todomvc-common/base.js
PerformanceTests/Speedometer/resources/todomvc/vanilla-examples/vanillajs/package.json

index b73c141..2cab909 100644 (file)
@@ -1,3 +1,48 @@
+2017-09-26  Mathias Bynens  <mathias@qiwi.be>
+
+        Speedometer: ensure all TodoMVC tests use the complete latest CSS
+        https://bugs.webkit.org/show_bug.cgi?id=177358
+
+        Reviewed by Ryosuke Niwa.
+
+        * Speedometer/resources/todomvc/architecture-examples/angular/dist/*: Updated per build instructions.
+        * Speedometer/resources/todomvc/architecture-examples/angular/src/assets/css/todomvc-app.css: Updated to latest version.
+        * Speedometer/resources/todomvc/architecture-examples/angularjs/node_modules/*: Updated to latest TodoMVC CSS.
+        * Speedometer/resources/todomvc/architecture-examples/angularjs/package-lock.json: Added.
+        * Speedometer/resources/todomvc/architecture-examples/angularjs/package.json: Updated to latest TodoMVC CSS.
+        * Speedometer/resources/todomvc/architecture-examples/angularjs/todomvc-index.html: Updated to match new CSS classnames.
+        * Speedometer/resources/todomvc/architecture-examples/emberjs-debug/assets/vendor.css: Manually updated to latest TodoMVC CSS, except with IDs instead of classes. (Build steps unknown.)
+        * Speedometer/resources/todomvc/architecture-examples/emberjs/app/components/todo-list.js: Updated to match new CSS classnames.
+        * Speedometer/resources/todomvc/architecture-examples/emberjs/app/templates/application.hbs: Updated to match new CSS classnames.
+        * Speedometer/resources/todomvc/architecture-examples/emberjs/app/templates/components/todo-list.hbs: Updated to match new CSS classnames.
+        * Speedometer/resources/todomvc/architecture-examples/emberjs/dist/*: Updated per build instructions.
+        * Speedometer/resources/todomvc/architecture-examples/emberjs/vendor/index.css: Updated to latest TodoMVC CSS.
+        * Speedometer/resources/todomvc/architecture-examples/inferno/node_modules/*: Updated TodoMVC CSS.
+        * Speedometer/resources/todomvc/architecture-examples/inferno/package.json: Updated TodoMVC CSS.
+        * Speedometer/resources/todomvc/architecture-examples/jquery/index.html: Updated to match new CSS classnames.
+        * Speedometer/resources/todomvc/architecture-examples/jquery/node_modules/*: Updated TodoMVC CSS.
+        * Speedometer/resources/todomvc/architecture-examples/jquery/package.json: Updated to latest TodoMVC CSS.
+        * Speedometer/resources/todomvc/dependency-examples/flight/flight/app/templates/stats.html: Updated to match new CSS classnames.
+        * Speedometer/resources/todomvc/dependency-examples/flight/flight/index.html: Updated to match new CSS classnames.
+        * Speedometer/resources/todomvc/dependency-examples/flight/flight/node_modules/todomvc-app-css/index.css: Updated to latest TodoMVC CSS.
+        * Speedometer/resources/todomvc/dependency-examples/flight/flight/node_modules/todomvc-app-css/package.json: Updated to latest TodoMVC CSS.
+        * Speedometer/resources/todomvc/dependency-examples/flight/flight/node_modules/todomvc-common/*: Updated to latest version.
+        * Speedometer/resources/todomvc/dependency-examples/flight/flight/package.json: Updated to latest TodoMVC CSS.
+        * Speedometer/resources/todomvc/functional-prog-examples/elm/node_modules/todomvc-app-css/index.css: Updated to latest TodoMVC CSS.
+        * Speedometer/resources/todomvc/functional-prog-examples/elm/node_modules/todomvc-common/base.js: Updated to latest version.
+        * Speedometer/resources/todomvc/functional-prog-examples/elm/package.json: Updated to latest TodoMVC CSS.
+        * Speedometer/resources/todomvc/vanilla-examples/es2015-babel-webpack/dist/*: Updated per build instructions.
+        * Speedometer/resources/todomvc/vanilla-examples/es2015-babel-webpack/package-lock.json: Updated to latest TodoMVC CSS.
+        * Speedometer/resources/todomvc/vanilla-examples/es2015-babel-webpack/package.json: Updated to latest TodoMVC CSS.
+        * Speedometer/resources/todomvc/vanilla-examples/es2015/node_modules/todomvc-app-css/index.css: Updated to latest TodoMVC CSS.
+        * Speedometer/resources/todomvc/vanilla-examples/es2015/node_modules/todomvc-app-css/package.json: Updated to latest TodoMVC CSS.
+        * Speedometer/resources/todomvc/vanilla-examples/es2015/node_modules/todomvc-app-css/readme.md: Updated to latest TodoMVC CSS.
+        * Speedometer/resources/todomvc/vanilla-examples/es2015/node_modules/todomvc-common/*: Updated to latest version.
+        * Speedometer/resources/todomvc/vanilla-examples/es2015/package.json: Updated to latest TodoMVC CSS.
+        * Speedometer/resources/todomvc/vanilla-examples/vanillajs/node_modules/todomvc-app-css/index.css: Updated to latest TodoMVC CSS.
+        * Speedometer/resources/todomvc/vanilla-examples/vanillajs/node_modules/todomvc-common/*: Updated to latest version.
+        * Speedometer/resources/todomvc/vanilla-examples/vanillajs/package.json: Updated to latest TodoMVC CSS.
+
 2017-09-25  Mathias Bynens  <mathias@qiwi.be>
 
         Speedometer: Add missing build scripts for Vue.js example
index 10e3d2f..e04fbdb 100644 (file)
@@ -112,28 +112,32 @@ body {
     border-top: 1px solid #e6e6e6;
 }
 
-label[for='toggle-all'] {
-    display: none;
-}
-
 .toggle-all {
+    text-align: center;
+    border: none; /* Mobile Safari */
+    opacity: 0;
     position: absolute;
-    top: -55px;
-    left: -12px;
+}
+
+.toggle-all + label {
     width: 60px;
     height: 34px;
-    text-align: center;
-    border: none; /* Mobile Safari */
+    font-size: 0;
+    position: absolute;
+    top: -52px;
+    left: -13px;
+    -webkit-transform: rotate(90deg);
+    transform: rotate(90deg);
 }
 
-.toggle-all:before {
+.toggle-all + label:before {
     content: '❯';
     font-size: 22px;
     color: #e6e6e6;
     padding: 10px 27px 10px 27px;
 }
 
-.toggle-all:checked:before {
+.toggle-all:checked + label:before {
     color: #737373;
 }
 
@@ -183,18 +187,27 @@ label[for='toggle-all'] {
     appearance: none;
 }
 
-.todo-list li .toggle:after {
-    content: url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" width="40" height="40" viewBox="-10 -18 100 135"><circle cx="50" cy="50" r="50" fill="none" stroke="#ededed" stroke-width="3"/></svg>');
+.todo-list li .toggle {
+    opacity: 0;
 }
 
-.todo-list li .toggle:checked:after {
-    content: url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" width="40" height="40" viewBox="-10 -18 100 135"><circle cx="50" cy="50" r="50" fill="none" stroke="#bddad5" stroke-width="3"/><path fill="#5dc2af" d="M72 25L42 71 27 56l-4 4 20 20 34-52z"/></svg>');
+.todo-list li .toggle + label {
+    /*
+        Firefox requires `#` to be escaped - https://bugzilla.mozilla.org/show_bug.cgi?id=922433
+        IE and Edge requires *everything* to be escaped to render, so we do that instead of just the `#` - https://developer.microsoft.com/en-us/microsoft-edge/platform/issues/7157459/
+    */
+    background-image: url('data:image/svg+xml;utf8,%3Csvg%20xmlns%3D%22http%3A//www.w3.org/2000/svg%22%20width%3D%2240%22%20height%3D%2240%22%20viewBox%3D%22-10%20-18%20100%20135%22%3E%3Ccircle%20cx%3D%2250%22%20cy%3D%2250%22%20r%3D%2250%22%20fill%3D%22none%22%20stroke%3D%22%23ededed%22%20stroke-width%3D%223%22/%3E%3C/svg%3E');
+    background-repeat: no-repeat;
+    background-position: center left;
+}
+
+.todo-list li .toggle:checked + label {
+    background-image: url('data:image/svg+xml;utf8,%3Csvg%20xmlns%3D%22http%3A//www.w3.org/2000/svg%22%20width%3D%2240%22%20height%3D%2240%22%20viewBox%3D%22-10%20-18%20100%20135%22%3E%3Ccircle%20cx%3D%2250%22%20cy%3D%2250%22%20r%3D%2250%22%20fill%3D%22none%22%20stroke%3D%22%23bddad5%22%20stroke-width%3D%223%22/%3E%3Cpath%20fill%3D%22%235dc2af%22%20d%3D%22M72%2025L42%2071%2027%2056l-4%204%2020%2020%2034-52z%22/%3E%3C/svg%3E');
 }
 
 .todo-list li label {
     word-break: break-all;
-    padding: 15px 60px 15px 15px;
-    margin-left: 45px;
+    padding: 15px 15px 15px 60px;
     display: block;
     line-height: 1.2;
     transition: color 0.4s;
@@ -350,13 +363,6 @@ html .clear-completed:active {
     .todo-list li .toggle {
         height: 40px;
     }
-
-    .toggle-all {
-        -webkit-transform: rotate(90deg);
-        transform: rotate(90deg);
-        -webkit-appearance: none;
-        appearance: none;
-    }
 }
 
 @media (max-width: 430px) {
index a2f2f4a..dacbe04 100644 (file)
@@ -11,5 +11,5 @@
 <body>
   <app-root>Loading...</app-root>
   <!-- Credits: Addy Osmani -->
-<script type="text/javascript" src="inline.28efc571905d42a672b0.bundle.js"></script><script type="text/javascript" src="polyfills.3a2aed82a0c9b24e6585.bundle.js"></script><script type="text/javascript" src="vendor.9a296bbc1909830a9106.bundle.js"></script><script type="text/javascript" src="main.c82799edffc751aa6590.bundle.js"></script></body>
+<script type="text/javascript" src="inline.3b7f8ce2e6bc2f77dd83.bundle.js"></script><script type="text/javascript" src="polyfills.3a2aed82a0c9b24e6585.bundle.js"></script><script type="text/javascript" src="vendor.9a296bbc1909830a9106.bundle.js"></script><script type="text/javascript" src="main.f1c5d33a6950c335064d.bundle.js"></script></body>
 </html>
@@ -1 +1 @@
-!function(e){function r(n){if(t[n])return t[n].exports;var o=t[n]={i:n,l:!1,exports:{}};return e[n].call(o.exports,o,o.exports,r),o.l=!0,o.exports}var n=window.webpackJsonp;window.webpackJsonp=function(t,c,a){for(var u,i,f,l=0,s=[];l<t.length;l++)i=t[l],o[i]&&s.push(o[i][0]),o[i]=0;for(u in c)Object.prototype.hasOwnProperty.call(c,u)&&(e[u]=c[u]);for(n&&n(t,c,a);s.length;)s.shift()();if(a)for(l=0;l<a.length;l++)f=r(r.s=a[l]);return f};var t={},o={4:0};r.e=function(e){function n(){c.onerror=c.onload=null,clearTimeout(a);var r=o[e];0!==r&&(r&&r[1](new Error("Loading chunk "+e+" failed.")),o[e]=void 0)}if(0===o[e])return Promise.resolve();if(o[e])return o[e][2];var t=document.getElementsByTagName("head")[0],c=document.createElement("script");c.type="text/javascript",c.charset="utf-8",c.async=!0,c.timeout=12e4,r.nc&&c.setAttribute("nonce",r.nc),c.src=r.p+""+e+"."+{0:"3a2aed82a0c9b24e6585",1:"c82799edffc751aa6590",2:"a63205ae4b55b180b58c"}[e]+".chunk.js";var a=setTimeout(n,12e4);c.onerror=c.onload=n;var u=new Promise(function(r,n){o[e]=[r,n]});return o[e][2]=u,t.appendChild(c),u},r.m=e,r.c=t,r.i=function(e){return e},r.d=function(e,n,t){r.o(e,n)||Object.defineProperty(e,n,{configurable:!1,enumerable:!0,get:t})},r.n=function(e){var n=e&&e.__esModule?function(){return e.default}:function(){return e};return r.d(n,"a",n),n},r.o=function(e,r){return Object.prototype.hasOwnProperty.call(e,r)},r.p="",r.oe=function(e){throw console.error(e),e}}([]);
\ No newline at end of file
+!function(e){function r(n){if(t[n])return t[n].exports;var o=t[n]={i:n,l:!1,exports:{}};return e[n].call(o.exports,o,o.exports,r),o.l=!0,o.exports}var n=window.webpackJsonp;window.webpackJsonp=function(t,c,a){for(var u,i,f,l=0,s=[];l<t.length;l++)i=t[l],o[i]&&s.push(o[i][0]),o[i]=0;for(u in c)Object.prototype.hasOwnProperty.call(c,u)&&(e[u]=c[u]);for(n&&n(t,c,a);s.length;)s.shift()();if(a)for(l=0;l<a.length;l++)f=r(r.s=a[l]);return f};var t={},o={4:0};r.e=function(e){function n(){c.onerror=c.onload=null,clearTimeout(a);var r=o[e];0!==r&&(r&&r[1](new Error("Loading chunk "+e+" failed.")),o[e]=void 0)}if(0===o[e])return Promise.resolve();if(o[e])return o[e][2];var t=document.getElementsByTagName("head")[0],c=document.createElement("script");c.type="text/javascript",c.charset="utf-8",c.async=!0,c.timeout=12e4,r.nc&&c.setAttribute("nonce",r.nc),c.src=r.p+""+e+"."+{0:"3a2aed82a0c9b24e6585",1:"f1c5d33a6950c335064d",2:"a63205ae4b55b180b58c"}[e]+".chunk.js";var a=setTimeout(n,12e4);c.onerror=c.onload=n;var u=new Promise(function(r,n){o[e]=[r,n]});return o[e][2]=u,t.appendChild(c),u},r.m=e,r.c=t,r.i=function(e){return e},r.d=function(e,n,t){r.o(e,n)||Object.defineProperty(e,n,{configurable:!1,enumerable:!0,get:t})},r.n=function(e){var n=e&&e.__esModule?function(){return e.default}:function(){return e};return r.d(n,"a",n),n},r.o=function(e,r){return Object.prototype.hasOwnProperty.call(e,r)},r.p="",r.oe=function(e){throw console.error(e),e}}([]);
\ No newline at end of file
index 10e3d2f..e04fbdb 100644 (file)
@@ -112,28 +112,32 @@ body {
     border-top: 1px solid #e6e6e6;
 }
 
-label[for='toggle-all'] {
-    display: none;
-}
-
 .toggle-all {
+    text-align: center;
+    border: none; /* Mobile Safari */
+    opacity: 0;
     position: absolute;
-    top: -55px;
-    left: -12px;
+}
+
+.toggle-all + label {
     width: 60px;
     height: 34px;
-    text-align: center;
-    border: none; /* Mobile Safari */
+    font-size: 0;
+    position: absolute;
+    top: -52px;
+    left: -13px;
+    -webkit-transform: rotate(90deg);
+    transform: rotate(90deg);
 }
 
-.toggle-all:before {
+.toggle-all + label:before {
     content: '❯';
     font-size: 22px;
     color: #e6e6e6;
     padding: 10px 27px 10px 27px;
 }
 
-.toggle-all:checked:before {
+.toggle-all:checked + label:before {
     color: #737373;
 }
 
@@ -183,18 +187,27 @@ label[for='toggle-all'] {
     appearance: none;
 }
 
-.todo-list li .toggle:after {
-    content: url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" width="40" height="40" viewBox="-10 -18 100 135"><circle cx="50" cy="50" r="50" fill="none" stroke="#ededed" stroke-width="3"/></svg>');
+.todo-list li .toggle {
+    opacity: 0;
 }
 
-.todo-list li .toggle:checked:after {
-    content: url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" width="40" height="40" viewBox="-10 -18 100 135"><circle cx="50" cy="50" r="50" fill="none" stroke="#bddad5" stroke-width="3"/><path fill="#5dc2af" d="M72 25L42 71 27 56l-4 4 20 20 34-52z"/></svg>');
+.todo-list li .toggle + label {
+    /*
+        Firefox requires `#` to be escaped - https://bugzilla.mozilla.org/show_bug.cgi?id=922433
+        IE and Edge requires *everything* to be escaped to render, so we do that instead of just the `#` - https://developer.microsoft.com/en-us/microsoft-edge/platform/issues/7157459/
+    */
+    background-image: url('data:image/svg+xml;utf8,%3Csvg%20xmlns%3D%22http%3A//www.w3.org/2000/svg%22%20width%3D%2240%22%20height%3D%2240%22%20viewBox%3D%22-10%20-18%20100%20135%22%3E%3Ccircle%20cx%3D%2250%22%20cy%3D%2250%22%20r%3D%2250%22%20fill%3D%22none%22%20stroke%3D%22%23ededed%22%20stroke-width%3D%223%22/%3E%3C/svg%3E');
+    background-repeat: no-repeat;
+    background-position: center left;
+}
+
+.todo-list li .toggle:checked + label {
+    background-image: url('data:image/svg+xml;utf8,%3Csvg%20xmlns%3D%22http%3A//www.w3.org/2000/svg%22%20width%3D%2240%22%20height%3D%2240%22%20viewBox%3D%22-10%20-18%20100%20135%22%3E%3Ccircle%20cx%3D%2250%22%20cy%3D%2250%22%20r%3D%2250%22%20fill%3D%22none%22%20stroke%3D%22%23bddad5%22%20stroke-width%3D%223%22/%3E%3Cpath%20fill%3D%22%235dc2af%22%20d%3D%22M72%2025L42%2071%2027%2056l-4%204%2020%2020%2034-52z%22/%3E%3C/svg%3E');
 }
 
 .todo-list li label {
     word-break: break-all;
-    padding: 15px 60px 15px 15px;
-    margin-left: 45px;
+    padding: 15px 15px 15px 60px;
     display: block;
     line-height: 1.2;
     transition: color 0.4s;
@@ -350,13 +363,6 @@ html .clear-completed:active {
     .todo-list li .toggle {
         height: 40px;
     }
-
-    .toggle-all {
-        -webkit-transform: rotate(90deg);
-        transform: rotate(90deg);
-        -webkit-appearance: none;
-        appearance: none;
-    }
 }
 
 @media (max-width: 430px) {
index 17ea180..e04fbdb 100644 (file)
@@ -17,8 +17,7 @@ button {
     -webkit-appearance: none;
     appearance: none;
     -webkit-font-smoothing: antialiased;
-    -moz-font-smoothing: antialiased;
-    font-smoothing: antialiased;
+    -moz-osx-font-smoothing: grayscale;
 }
 
 body {
@@ -30,21 +29,19 @@ body {
     max-width: 550px;
     margin: 0 auto;
     -webkit-font-smoothing: antialiased;
-    -moz-font-smoothing: antialiased;
-    font-smoothing: antialiased;
+    -moz-osx-font-smoothing: grayscale;
     font-weight: 300;
 }
 
-button,
-input[type="checkbox"] {
-    outline: none;
+:focus {
+    outline: 0;
 }
 
 .hidden {
     display: none;
 }
 
-#todoapp {
+.todoapp {
     background: #fff;
     margin: 130px 0 40px 0;
     position: relative;
@@ -52,25 +49,25 @@ input[type="checkbox"] {
                 0 25px 50px 0 rgba(0, 0, 0, 0.1);
 }
 
-#todoapp input::-webkit-input-placeholder {
+.todoapp input::-webkit-input-placeholder {
     font-style: italic;
     font-weight: 300;
     color: #e6e6e6;
 }
 
-#todoapp input::-moz-placeholder {
+.todoapp input::-moz-placeholder {
     font-style: italic;
     font-weight: 300;
     color: #e6e6e6;
 }
 
-#todoapp input::input-placeholder {
+.todoapp input::input-placeholder {
     font-style: italic;
     font-weight: 300;
     color: #e6e6e6;
 }
 
-#todoapp h1 {
+.todoapp h1 {
     position: absolute;
     top: -155px;
     width: 100%;
@@ -83,7 +80,7 @@ input[type="checkbox"] {
     text-rendering: optimizeLegibility;
 }
 
-#new-todo,
+.new-todo,
 .edit {
     position: relative;
     margin: 0;
@@ -93,88 +90,90 @@ input[type="checkbox"] {
     font-weight: inherit;
     line-height: 1.4em;
     border: 0;
-    outline: none;
     color: inherit;
     padding: 6px;
     border: 1px solid #999;
     box-shadow: inset 0 -1px 5px 0 rgba(0, 0, 0, 0.2);
     box-sizing: border-box;
     -webkit-font-smoothing: antialiased;
-    -moz-font-smoothing: antialiased;
-    font-smoothing: antialiased;
+    -moz-osx-font-smoothing: grayscale;
 }
 
-#new-todo {
+.new-todo {
     padding: 16px 16px 16px 60px;
     border: none;
     background: rgba(0, 0, 0, 0.003);
     box-shadow: inset 0 -2px 1px rgba(0,0,0,0.03);
 }
 
-#main {
+.main {
     position: relative;
     z-index: 2;
     border-top: 1px solid #e6e6e6;
 }
 
-label[for='toggle-all'] {
-    display: none;
+.toggle-all {
+    text-align: center;
+    border: none; /* Mobile Safari */
+    opacity: 0;
+    position: absolute;
 }
 
-#toggle-all {
-    position: absolute;
-    top: -55px;
-    left: -12px;
+.toggle-all + label {
     width: 60px;
     height: 34px;
-    text-align: center;
-    border: none; /* Mobile Safari */
+    font-size: 0;
+    position: absolute;
+    top: -52px;
+    left: -13px;
+    -webkit-transform: rotate(90deg);
+    transform: rotate(90deg);
 }
 
-#toggle-all:before {
+.toggle-all + label:before {
     content: '❯';
     font-size: 22px;
     color: #e6e6e6;
     padding: 10px 27px 10px 27px;
 }
 
-#toggle-all:checked:before {
+.toggle-all:checked + label:before {
     color: #737373;
 }
 
-#todo-list {
+.todo-list {
     margin: 0;
     padding: 0;
     list-style: none;
 }
 
-#todo-list li {
+.todo-list li {
     position: relative;
     font-size: 24px;
     border-bottom: 1px solid #ededed;
 }
 
-#todo-list li:last-child {
+.todo-list li:last-child {
     border-bottom: none;
 }
 
-#todo-list li.editing {
+.todo-list li.editing {
     border-bottom: none;
     padding: 0;
 }
 
-#todo-list li.editing .edit {
+.todo-list li.editing .edit {
     display: block;
     width: 506px;
-    padding: 13px 17px 12px 17px;
+    padding: 12px 16px;
     margin: 0 0 0 43px;
 }
 
-#todo-list li.editing .view {
+.todo-list li.editing .view {
     display: none;
 }
 
-#todo-list li .toggle {
+.todo-list li .toggle {
     text-align: center;
     width: 40px;
     /* auto, since non-WebKit browsers doesn't support input styling */
@@ -188,30 +187,38 @@ label[for='toggle-all'] {
     appearance: none;
 }
 
-#todo-list li .toggle:after {
-    content: url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" width="40" height="40" viewBox="-10 -18 100 135"><circle cx="50" cy="50" r="50" fill="none" stroke="#ededed" stroke-width="3"/></svg>');
+.todo-list li .toggle {
+    opacity: 0;
+}
+
+.todo-list li .toggle + label {
+    /*
+        Firefox requires `#` to be escaped - https://bugzilla.mozilla.org/show_bug.cgi?id=922433
+        IE and Edge requires *everything* to be escaped to render, so we do that instead of just the `#` - https://developer.microsoft.com/en-us/microsoft-edge/platform/issues/7157459/
+    */
+    background-image: url('data:image/svg+xml;utf8,%3Csvg%20xmlns%3D%22http%3A//www.w3.org/2000/svg%22%20width%3D%2240%22%20height%3D%2240%22%20viewBox%3D%22-10%20-18%20100%20135%22%3E%3Ccircle%20cx%3D%2250%22%20cy%3D%2250%22%20r%3D%2250%22%20fill%3D%22none%22%20stroke%3D%22%23ededed%22%20stroke-width%3D%223%22/%3E%3C/svg%3E');
+    background-repeat: no-repeat;
+    background-position: center left;
 }
 
-#todo-list li .toggle:checked:after {
-    content: url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" width="40" height="40" viewBox="-10 -18 100 135"><circle cx="50" cy="50" r="50" fill="none" stroke="#bddad5" stroke-width="3"/><path fill="#5dc2af" d="M72 25L42 71 27 56l-4 4 20 20 34-52z"/></svg>');
+.todo-list li .toggle:checked + label {
+    background-image: url('data:image/svg+xml;utf8,%3Csvg%20xmlns%3D%22http%3A//www.w3.org/2000/svg%22%20width%3D%2240%22%20height%3D%2240%22%20viewBox%3D%22-10%20-18%20100%20135%22%3E%3Ccircle%20cx%3D%2250%22%20cy%3D%2250%22%20r%3D%2250%22%20fill%3D%22none%22%20stroke%3D%22%23bddad5%22%20stroke-width%3D%223%22/%3E%3Cpath%20fill%3D%22%235dc2af%22%20d%3D%22M72%2025L42%2071%2027%2056l-4%204%2020%2020%2034-52z%22/%3E%3C/svg%3E');
 }
 
-#todo-list li label {
-    white-space: pre;
-    word-break: break-word;
-    padding: 15px 60px 15px 15px;
-    margin-left: 45px;
+.todo-list li label {
+    word-break: break-all;
+    padding: 15px 15px 15px 60px;
     display: block;
     line-height: 1.2;
     transition: color 0.4s;
 }
 
-#todo-list li.completed label {
+.todo-list li.completed label {
     color: #d9d9d9;
     text-decoration: line-through;
 }
 
-#todo-list li .destroy {
+.todo-list li .destroy {
     display: none;
     position: absolute;
     top: 0;
@@ -226,27 +233,27 @@ label[for='toggle-all'] {
     transition: color 0.2s ease-out;
 }
 
-#todo-list li .destroy:hover {
+.todo-list li .destroy:hover {
     color: #af5b5e;
 }
 
-#todo-list li .destroy:after {
+.todo-list li .destroy:after {
     content: '×';
 }
 
-#todo-list li:hover .destroy {
+.todo-list li:hover .destroy {
     display: block;
 }
 
-#todo-list li .edit {
+.todo-list li .edit {
     display: none;
 }
 
-#todo-list li.editing:last-child {
+.todo-list li.editing:last-child {
     margin-bottom: -1px;
 }
 
-#footer {
+.footer {
     color: #777;
     padding: 10px 15px;
     height: 20px;
@@ -254,7 +261,7 @@ label[for='toggle-all'] {
     border-top: 1px solid #e6e6e6;
 }
 
-#footer:before {
+.footer:before {
     content: '';
     position: absolute;
     right: 0;
@@ -269,16 +276,16 @@ label[for='toggle-all'] {
                 0 17px 2px -6px rgba(0, 0, 0, 0.2);
 }
 
-#todo-count {
+.todo-count {
     float: left;
     text-align: left;
 }
 
-#todo-count strong {
+.todo-count strong {
     font-weight: 300;
 }
 
-#filters {
+.filters {
     margin: 0;
     padding: 0;
     list-style: none;
@@ -287,11 +294,11 @@ label[for='toggle-all'] {
     left: 0;
 }
 
-#filters li {
+.filters li {
     display: inline;
 }
 
-#filters li a {
+.filters li a {
     color: inherit;
     margin: 3px;
     padding: 3px 7px;
@@ -300,30 +307,28 @@ label[for='toggle-all'] {
     border-radius: 3px;
 }
 
-#filters li a.selected,
-#filters li a:hover {
+.filters li a:hover {
     border-color: rgba(175, 47, 47, 0.1);
 }
 
-#filters li a.selected {
+.filters li a.selected {
     border-color: rgba(175, 47, 47, 0.2);
 }
 
-#clear-completed,
-html #clear-completed:active {
+.clear-completed,
+html .clear-completed:active {
     float: right;
     position: relative;
     line-height: 20px;
     text-decoration: none;
     cursor: pointer;
-    position: relative;
 }
 
-#clear-completed:hover {
+.clear-completed:hover {
     text-decoration: underline;
 }
 
-#info {
+.info {
     margin: 65px auto 0;
     color: #bfbfbf;
     font-size: 10px;
@@ -331,17 +336,17 @@ html #clear-completed:active {
     text-align: center;
 }
 
-#info p {
+.info p {
     line-height: 1;
 }
 
-#info a {
+.info a {
     color: inherit;
     text-decoration: none;
     font-weight: 400;
 }
 
-#info a:hover {
+.info a:hover {
     text-decoration: underline;
 }
 
@@ -350,29 +355,22 @@ html #clear-completed:active {
     Can't use it globally since it destroys checkboxes in Firefox
 */
 @media screen and (-webkit-min-device-pixel-ratio:0) {
-    #toggle-all,
-    #todo-list li .toggle {
+    .toggle-all,
+    .todo-list li .toggle {
         background: none;
     }
 
-    #todo-list li .toggle {
+    .todo-list li .toggle {
         height: 40px;
     }
-
-    #toggle-all {
-        -webkit-transform: rotate(90deg);
-        transform: rotate(90deg);
-        -webkit-appearance: none;
-        appearance: none;
-    }
 }
 
 @media (max-width: 430px) {
-    #footer {
+    .footer {
         height: 50px;
     }
 
-    #filters {
+    .filters {
         bottom: 10px;
     }
 }
index 0a6c760..1183655 100644 (file)
@@ -1,27 +1,27 @@
 {
-  "_from": "todomvc-app-css@^1.0.1",
-  "_id": "todomvc-app-css@1.0.4",
+  "_from": "todomvc-app-css@^2.1.0",
+  "_id": "todomvc-app-css@2.1.0",
   "_inBundle": false,
-  "_integrity": "sha1-0lKSeabaW++wa1XAwyTF/P2U1lY=",
+  "_integrity": "sha1-tvJxbTOa+i5feZNH0qSLBTliQqU=",
   "_location": "/todomvc-app-css",
   "_phantomChildren": {},
   "_requested": {
     "type": "range",
     "registry": true,
-    "raw": "todomvc-app-css@^1.0.1",
+    "raw": "todomvc-app-css@^2.1.0",
     "name": "todomvc-app-css",
     "escapedName": "todomvc-app-css",
-    "rawSpec": "^1.0.1",
+    "rawSpec": "^2.1.0",
     "saveSpec": null,
-    "fetchSpec": "^1.0.1"
+    "fetchSpec": "^2.1.0"
   },
   "_requiredBy": [
     "/"
   ],
-  "_resolved": "https://registry.npmjs.org/todomvc-app-css/-/todomvc-app-css-1.0.4.tgz",
-  "_shasum": "d2529279a6da5befb06b55c0c324c5fcfd94d656",
-  "_spec": "todomvc-app-css@^1.0.1",
-  "_where": "/Users/mathiasb/projects/WebKit-Git/PerformanceTests/Speedometer/resources/todomvc/architecture-examples/angularjs",
+  "_resolved": "https://registry.npmjs.org/todomvc-app-css/-/todomvc-app-css-2.1.0.tgz",
+  "_shasum": "b6f2716d339afa2e5f799347d2a48b05396242a5",
+  "_spec": "todomvc-app-css@^2.1.0",
+  "_where": "/Users/mathiasb/projects/WebKit/PerformanceTests/Speedometer/resources/todomvc/architecture-examples/angularjs",
   "author": {
     "name": "Sindre Sorhus",
     "email": "sindresorhus@gmail.com",
@@ -53,5 +53,6 @@
     "type": "git",
     "url": "git+https://github.com/tastejs/todomvc-app-css.git"
   },
-  "version": "1.0.4"
+  "style": "index.css",
+  "version": "2.1.0"
 }
index 81e006b..e1676db 100644 (file)
@@ -21,7 +21,7 @@
                 }
             }
             return object;
-        }
+        };
 
         // By default, Underscore uses ERB-style template delimiters, change the
         // following template settings to use alternative delimiters.
index 5020df4..2d242a3 100644 (file)
@@ -1,27 +1,27 @@
 {
-  "_from": "todomvc-common@^1.0.0",
-  "_id": "todomvc-common@1.0.3",
+  "_from": "todomvc-common@^1.0.4",
+  "_id": "todomvc-common@1.0.4",
   "_inBundle": false,
-  "_integrity": "sha1-y6GGgQnKpAG5COv3d5TMEBS3SHM=",
+  "_integrity": "sha512-AA0Z4exovEqubhbZCrzzn9roVT4zvOncS319p2zIc4CsNe5B9TLL7Sei1NIV6d+WrgR5rOi+y0I9Y6GE7xgNOw==",
   "_location": "/todomvc-common",
   "_phantomChildren": {},
   "_requested": {
     "type": "range",
     "registry": true,
-    "raw": "todomvc-common@^1.0.0",
+    "raw": "todomvc-common@^1.0.4",
     "name": "todomvc-common",
     "escapedName": "todomvc-common",
-    "rawSpec": "^1.0.0",
+    "rawSpec": "^1.0.4",
     "saveSpec": null,
-    "fetchSpec": "^1.0.0"
+    "fetchSpec": "^1.0.4"
   },
   "_requiredBy": [
     "/"
   ],
-  "_resolved": "https://registry.npmjs.org/todomvc-common/-/todomvc-common-1.0.3.tgz",
-  "_shasum": "cba1868109caa401b908ebf77794cc1014b74873",
-  "_spec": "todomvc-common@^1.0.0",
-  "_where": "/Users/mathiasb/projects/WebKit-Git/PerformanceTests/Speedometer/resources/todomvc/architecture-examples/angularjs",
+  "_resolved": "https://registry.npmjs.org/todomvc-common/-/todomvc-common-1.0.4.tgz",
+  "_shasum": "23099af886c2f0525bfd4537e078f12d0074309e",
+  "_spec": "todomvc-common@^1.0.4",
+  "_where": "/Users/mathiasb/projects/WebKit/PerformanceTests/Speedometer/resources/todomvc/architecture-examples/angularjs",
   "author": {
     "name": "TasteJS"
   },
@@ -50,5 +50,5 @@
     "url": "git+https://github.com/tastejs/todomvc-common.git"
   },
   "style": "base.css",
-  "version": "1.0.3"
+  "version": "1.0.4"
 }
index 457fed4..ecba40a 100644 (file)
       "integrity": "sha1-r0VZMpn1WHTQJhAYrbEVIKOBfSo="
     },
     "todomvc-app-css": {
-      "version": "1.0.4",
-      "resolved": "https://registry.npmjs.org/todomvc-app-css/-/todomvc-app-css-1.0.4.tgz",
-      "integrity": "sha1-0lKSeabaW++wa1XAwyTF/P2U1lY="
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/todomvc-app-css/-/todomvc-app-css-2.1.0.tgz",
+      "integrity": "sha1-tvJxbTOa+i5feZNH0qSLBTliQqU="
     },
     "todomvc-common": {
-      "version": "1.0.3",
-      "resolved": "https://registry.npmjs.org/todomvc-common/-/todomvc-common-1.0.3.tgz",
-      "integrity": "sha1-y6GGgQnKpAG5COv3d5TMEBS3SHM="
+      "version": "1.0.4",
+      "resolved": "https://registry.npmjs.org/todomvc-common/-/todomvc-common-1.0.4.tgz",
+      "integrity": "sha512-AA0Z4exovEqubhbZCrzzn9roVT4zvOncS319p2zIc4CsNe5B9TLL7Sei1NIV6d+WrgR5rOi+y0I9Y6GE7xgNOw=="
     }
   }
 }
index ec48b84..7aef1a4 100644 (file)
@@ -7,7 +7,7 @@
     "angular": "1.6.5",
     "angular-resource": "1.6.5",
     "angular-route": "1.6.5",
-    "todomvc-app-css": "^1.0.1",
-    "todomvc-common": "^1.0.0"
+    "todomvc-app-css": "^2.1.0",
+    "todomvc-common": "^1.0.4"
   }
 }
index d6e3b1c..b3cbbb2 100644 (file)
@@ -1,14 +1,14 @@
-<section id="todoapp">
+<section id="todoapp" class="todoapp">
     <header id="header">
         <h1>todos</h1>
-        <form id="todo-form" ng-submit="addTodo()">
-            <input id="new-todo" placeholder="What needs to be done?" ng-model="newTodo" ng-disabled="saving" autofocus>
+        <form id="todo-form" class="todo-form" ng-submit="addTodo()">
+            <input id="new-todo" class="new-todo" placeholder="What needs to be done?" ng-model="newTodo" ng-disabled="saving" autofocus>
         </form>
     </header>
-    <section id="main" ng-show="todos.length" ng-cloak>
-        <input id="toggle-all" type="checkbox" ng-model="allChecked" ng-click="markAll(allChecked)">
+    <section id="main" class="main" ng-show="todos.length" ng-cloak>
+        <input id="toggle-all" class="toggle-all" type="checkbox" ng-model="allChecked" ng-click="markAll(allChecked)">
         <label for="toggle-all">Mark all as complete</label>
-        <ul id="todo-list">
+        <ul id="todo-list" class="todo-list">
             <li ng-repeat="todo in todos | filter:statusFilter track by $index" ng-class="{completed: todo.completed, editing: todo == editedTodo}">
                 <div class="view">
                     <input class="toggle" type="checkbox" ng-model="todo.completed" ng-change="toggleCompleted(todo)">
             </li>
         </ul>
     </section>
-    <footer id="footer" ng-show="todos.length" ng-cloak>
-        <span id="todo-count"><strong>{{remainingCount}}</strong>
-                        <ng-pluralize count="remainingCount" when="{ one: 'item left', other: 'items left' }"></ng-pluralize>
-                    </span>
-        <ul id="filters">
+    <footer id="footer" class="footer" ng-show="todos.length" ng-cloak>
+        <span id="todo-count" class="todo-count"><strong>{{remainingCount}}</strong>
+            <ng-pluralize count="remainingCount" when="{ one: 'item left', other: 'items left' }"></ng-pluralize>
+        </span>
+        <ul id="filters" class="filters">
             <li>
                 <a ng-class="{selected: status == ''} " href="#/">All</a>
             </li>
                 <a ng-class="{selected: status == 'completed'}" href="#/completed">Completed</a>
             </li>
         </ul>
-        <button id="clear-completed" ng-click="clearCompletedTodos()" ng-show="completedCount">Clear completed</button>
+        <button id="clear-completed" class="clear-completed" ng-click="clearCompletedTodos()" ng-show="completedCount">Clear completed</button>
     </footer>
 </section>
-<footer id="info">
+<footer id="info" class="info">
     <p>Double-click to edit a todo</p>
     <p>Credits:
-        <a href="http://twitter.com/cburgdorf">Christoph Burgdorf</a>,
+        <a href="https://twitter.com/cburgdorf">Christoph Burgdorf</a>,
         <a href="http://ericbidelman.com">Eric Bidelman</a>,
         <a href="http://jacobmumm.com">Jacob Mumm</a> and
         <a href="http://blog.igorminar.com">Igor Minar</a>
     </p>
     <p>Part of <a href="http://todomvc.com">TodoMVC</a></p>
-</footer>
\ No newline at end of file
+</footer>
index 5e4645d..bc9cc1b 100644 (file)
@@ -1,145 +1,3 @@
-hr {
-    margin: 20px 0;
-    border: 0;
-    border-top: 1px dashed #c5c5c5;
-    border-bottom: 1px dashed #f7f7f7;
-}
-
-.learn a {
-    font-weight: normal;
-    text-decoration: none;
-    color: #b83f45;
-}
-
-.learn a:hover {
-    text-decoration: underline;
-    color: #787e7e;
-}
-
-.learn h3,
-.learn h4,
-.learn h5 {
-    margin: 10px 0;
-    font-weight: 500;
-    line-height: 1.2;
-    color: #000;
-}
-
-.learn h3 {
-    font-size: 24px;
-}
-
-.learn h4 {
-    font-size: 18px;
-}
-
-.learn h5 {
-    margin-bottom: 0;
-    font-size: 14px;
-}
-
-.learn ul {
-    padding: 0;
-    margin: 0 0 30px 25px;
-}
-
-.learn li {
-    line-height: 20px;
-}
-
-.learn p {
-    font-size: 15px;
-    font-weight: 300;
-    line-height: 1.3;
-    margin-top: 0;
-    margin-bottom: 0;
-}
-
-#issue-count {
-    display: none;
-}
-
-.quote {
-    border: none;
-    margin: 20px 0 60px 0;
-}
-
-.quote p {
-    font-style: italic;
-}
-
-.quote p:before {
-    content: '“';
-    font-size: 50px;
-    opacity: .15;
-    position: absolute;
-    top: -20px;
-    left: 3px;
-}
-
-.quote p:after {
-    content: '”';
-    font-size: 50px;
-    opacity: .15;
-    position: absolute;
-    bottom: -42px;
-    right: 3px;
-}
-
-.quote footer {
-    position: absolute;
-    bottom: -40px;
-    right: 0;
-}
-
-.quote footer img {
-    border-radius: 3px;
-}
-
-.quote footer a {
-    margin-left: 5px;
-    vertical-align: middle;
-}
-
-.speech-bubble {
-    position: relative;
-    padding: 10px;
-    background: rgba(0, 0, 0, .04);
-    border-radius: 5px;
-}
-
-.speech-bubble:after {
-    content: '';
-    position: absolute;
-    top: 100%;
-    right: 30px;
-    border: 13px solid transparent;
-    border-top-color: rgba(0, 0, 0, .04);
-}
-
-.learn-bar > .learn {
-    position: absolute;
-    width: 272px;
-    top: 8px;
-    left: -300px;
-    padding: 10px;
-    border-radius: 5px;
-    background-color: rgba(255, 255, 255, .6);
-    transition-property: left;
-    transition-duration: 500ms;
-}
-
-@media (min-width: 899px) {
-    .learn-bar {
-        width: auto;
-        padding-left: 300px;
-    }
-
-    .learn-bar > .learn {
-        left: 8px;
-    }
-}
-
 html,
 body {
     margin: 0;
@@ -159,8 +17,7 @@ button {
     -webkit-appearance: none;
     appearance: none;
     -webkit-font-smoothing: antialiased;
-    -moz-font-smoothing: antialiased;
-    font-smoothing: antialiased;
+    -moz-osx-font-smoothing: grayscale;
 }
 
 body {
@@ -172,14 +29,12 @@ body {
     max-width: 550px;
     margin: 0 auto;
     -webkit-font-smoothing: antialiased;
-    -moz-font-smoothing: antialiased;
-    font-smoothing: antialiased;
+    -moz-osx-font-smoothing: grayscale;
     font-weight: 300;
 }
 
-button,
-input[type="checkbox"] {
-    outline: none;
+:focus {
+    outline: 0;
 }
 
 .hidden {
@@ -235,15 +90,13 @@ input[type="checkbox"] {
     font-weight: inherit;
     line-height: 1.4em;
     border: 0;
-    outline: none;
     color: inherit;
     padding: 6px;
     border: 1px solid #999;
     box-shadow: inset 0 -1px 5px 0 rgba(0, 0, 0, 0.2);
     box-sizing: border-box;
     -webkit-font-smoothing: antialiased;
-    -moz-font-smoothing: antialiased;
-    font-smoothing: antialiased;
+    -moz-osx-font-smoothing: grayscale;
 }
 
 #new-todo {
@@ -259,28 +112,32 @@ input[type="checkbox"] {
     border-top: 1px solid #e6e6e6;
 }
 
-label[for='toggle-all'] {
-    display: none;
-}
-
 #toggle-all {
+    text-align: center;
+    border: none; /* Mobile Safari */
+    opacity: 0;
     position: absolute;
-    top: -55px;
-    left: -12px;
+}
+
+#toggle-all + label {
     width: 60px;
     height: 34px;
-    text-align: center;
-    border: none; /* Mobile Safari */
+    font-size: 0;
+    position: absolute;
+    top: -52px;
+    left: -13px;
+    -webkit-transform: rotate(90deg);
+    transform: rotate(90deg);
 }
 
-#toggle-all:before {
+#toggle-all + label:before {
     content: '❯';
     font-size: 22px;
     color: #e6e6e6;
     padding: 10px 27px 10px 27px;
 }
 
-#toggle-all:checked:before {
+#toggle-all:checked + label:before {
     color: #737373;
 }
 
@@ -308,7 +165,7 @@ label[for='toggle-all'] {
 #todo-list li.editing .edit {
     display: block;
     width: 506px;
-    padding: 13px 17px 12px 17px;
+    padding: 12px 16px;
     margin: 0 0 0 43px;
 }
 
@@ -330,19 +187,27 @@ label[for='toggle-all'] {
     appearance: none;
 }
 
-#todo-list li .toggle:after {
-    content: url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" width="40" height="40" viewBox="-10 -18 100 135"><circle cx="50" cy="50" r="50" fill="none" stroke="#ededed" stroke-width="3"/></svg>');
+#todo-list li .toggle {
+    opacity: 0;
+}
+
+#todo-list li .toggle + label {
+    /*
+        Firefox requires `#` to be escaped - https://bugzilla.mozilla.org/show_bug.cgi?id=922433
+        IE and Edge requires *everything* to be escaped to render, so we do that instead of just the `#` - https://developer.microsoft.com/en-us/microsoft-edge/platform/issues/7157459/
+    */
+    background-image: url('data:image/svg+xml;utf8,%3Csvg%20xmlns%3D%22http%3A//www.w3.org/2000/svg%22%20width%3D%2240%22%20height%3D%2240%22%20viewBox%3D%22-10%20-18%20100%20135%22%3E%3Ccircle%20cx%3D%2250%22%20cy%3D%2250%22%20r%3D%2250%22%20fill%3D%22none%22%20stroke%3D%22%23ededed%22%20stroke-width%3D%223%22/%3E%3C/svg%3E');
+    background-repeat: no-repeat;
+    background-position: center left;
 }
 
-#todo-list li .toggle:checked:after {
-    content: url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" width="40" height="40" viewBox="-10 -18 100 135"><circle cx="50" cy="50" r="50" fill="none" stroke="#bddad5" stroke-width="3"/><path fill="#5dc2af" d="M72 25L42 71 27 56l-4 4 20 20 34-52z"/></svg>');
+#todo-list li .toggle:checked + label {
+    background-image: url('data:image/svg+xml;utf8,%3Csvg%20xmlns%3D%22http%3A//www.w3.org/2000/svg%22%20width%3D%2240%22%20height%3D%2240%22%20viewBox%3D%22-10%20-18%20100%20135%22%3E%3Ccircle%20cx%3D%2250%22%20cy%3D%2250%22%20r%3D%2250%22%20fill%3D%22none%22%20stroke%3D%22%23bddad5%22%20stroke-width%3D%223%22/%3E%3Cpath%20fill%3D%22%235dc2af%22%20d%3D%22M72%2025L42%2071%2027%2056l-4%204%2020%2020%2034-52z%22/%3E%3C/svg%3E');
 }
 
 #todo-list li label {
-    white-space: pre;
-    word-break: break-word;
-    padding: 15px 60px 15px 15px;
-    margin-left: 45px;
+    word-break: break-all;
+    padding: 15px 15px 15px 60px;
     display: block;
     line-height: 1.2;
     transition: color 0.4s;
@@ -442,7 +307,6 @@ label[for='toggle-all'] {
     border-radius: 3px;
 }
 
-#filters li a.selected,
 #filters li a:hover {
     border-color: rgba(175, 47, 47, 0.1);
 }
@@ -458,7 +322,6 @@ html #clear-completed:active {
     line-height: 20px;
     text-decoration: none;
     cursor: pointer;
-    position: relative;
 }
 
 #clear-completed:hover {
@@ -500,13 +363,6 @@ html #clear-completed:active {
     #todo-list li .toggle {
         height: 40px;
     }
-
-    #toggle-all {
-        -webkit-transform: rotate(90deg);
-        transform: rotate(90deg);
-        -webkit-appearance: none;
-        appearance: none;
-    }
 }
 
 @media (max-width: 430px) {
@@ -518,4 +374,3 @@ html #clear-completed:active {
         bottom: 10px;
     }
 }
-
index d84e0e3..cd8183c 100644 (file)
@@ -4,6 +4,7 @@ export default Ember.Component.extend({
     repo: Ember.inject.service(),
     tagName: 'section',
     elementId: 'main',
+    classNames: ['main'],
     canToggle: true,
     allCompleted: Ember.computed('todos.@each.completed', function () {
         return this.get('todos').isEvery('completed');
index 519b620..70bf119 100644 (file)
@@ -1,24 +1,24 @@
-<section id="todoapp">
-  <header id="header">
+<section id="todoapp" class="todoapp">
+  <header id="header" class="header">
     <h1>todos</h1>
-    <input type="text" id="new-todo" onkeydown={{action 'createTodo'}} placeholder="What needs to be done?" autofocus>
+    <input type="text" id="new-todo" class="new-todo" onkeydown={{action 'createTodo'}} placeholder="What needs to be done?" autofocus>
   </header>
     {{outlet}}
     {{#if (gt model.length 0)}}
-      <footer id="footer">
-        <span id="todo-count"><strong>{{remaining.length}}</strong> {{pluralize 'item' remaining.length}} left</span>
-        <ul id="filters">
+      <footer id="footer" class="footer">
+        <span id="todo-count" class="todo-count"><strong>{{remaining.length}}</strong> {{pluralize 'item' remaining.length}} left</span>
+        <ul id="filters" class="filters">
           <li>{{#link-to "index" activeClass="selected"}}All{{/link-to}}</li>
           <li>{{#link-to "active" activeClass="selected"}}Active{{/link-to}}</li>
           <li>{{#link-to "completed" activeClass="selected"}}Completed{{/link-to}}</li>
         </ul>
         {{#if completed.length}}
-          <button id="clear-completed" onclick={{action 'clearCompleted'}}>Clear completed</button>
+          <button id="clear-completed" class="clear-completed" onclick={{action 'clearCompleted'}}>Clear completed</button>
         {{/if}}
       </footer>
     {{/if}}
 </section>
-<footer id="info">
+<footer id="info" class="info">
   <p>Double-click to edit a todo</p>
   <p>
     Created by
index 309d07a..4e3c2b2 100644 (file)
@@ -1,6 +1,6 @@
 {{#if todos.length}}
   {{#if canToggle}}
-    <input type="checkbox" id="toggle-all" checked={{allCompleted}} onchange={{action 'toggleAll'}}>
+    <input type="checkbox" id="toggle-all" class="toggle-all" checked={{allCompleted}} onchange={{action 'toggleAll'}}>
   {{/if}}
   <ul id="todo-list" class="todo-list">
     {{#each todos as |todo|}}
@@ -1,7 +1,7 @@
 "use strict"
 define("todomvc/app",["exports","ember","todomvc/resolver","ember-load-initializers","todomvc/config/environment"],function(e,t,o,n,l){var i=void 0
 t.default.MODEL_FACTORY_INJECTIONS=!0,i=t.default.Application.extend({modulePrefix:l.default.modulePrefix,podModulePrefix:l.default.podModulePrefix,Resolver:o.default}),(0,n.default)(i,l.default.modulePrefix),e.default=i}),define("todomvc/components/todo-item",["exports","ember"],function(e,t){e.default=t.default.Component.extend({repo:t.default.inject.service(),tagName:"li",editing:!1,classNameBindings:["todo.completed","editing"],actions:{startEditing:function(){this.get("onStartEdit")(),this.set("editing",!0),t.default.run.scheduleOnce("afterRender",this,"focusInput")},doneEditing:function(e){this.get("editing")&&(t.default.isBlank(e)?this.send("removeTodo"):(this.set("todo.title",e.trim()),this.set("editing",!1),this.get("onEndEdit")()))},handleKeydown:function(e){13===e.keyCode?e.target.blur():27===e.keyCode&&this.set("editing",!1)},toggleCompleted:function(e){var o=this.get("todo")
-t.default.set(o,"completed",e.target.checked),this.get("repo").persist()},removeTodo:function(){this.get("repo").delete(this.get("todo"))}},focusInput:function(){this.element.querySelector("input.edit").focus()}})}),define("todomvc/components/todo-list",["exports","ember"],function(e,t){e.default=t.default.Component.extend({repo:t.default.inject.service(),tagName:"section",elementId:"main",canToggle:!0,allCompleted:t.default.computed("todos.@each.completed",function(){return this.get("todos").isEvery("completed")}),actions:{enableToggle:function(){this.set("canToggle",!0)},disableToggle:function(){this.set("canToggle",!1)},toggleAll:function(){var e=this.get("allCompleted")
+t.default.set(o,"completed",e.target.checked),this.get("repo").persist()},removeTodo:function(){this.get("repo").delete(this.get("todo"))}},focusInput:function(){this.element.querySelector("input.edit").focus()}})}),define("todomvc/components/todo-list",["exports","ember"],function(e,t){e.default=t.default.Component.extend({repo:t.default.inject.service(),tagName:"section",elementId:"main",classNames:["main"],canToggle:!0,allCompleted:t.default.computed("todos.@each.completed",function(){return this.get("todos").isEvery("completed")}),actions:{enableToggle:function(){this.set("canToggle",!0)},disableToggle:function(){this.set("canToggle",!1)},toggleAll:function(){var e=this.get("allCompleted")
 this.get("todos").forEach(function(o){return t.default.set(o,"completed",!e)}),this.get("repo").persist()}}})}),define("todomvc/controllers/active",["exports","ember"],function(e,t){e.default=t.default.Controller.extend({todos:t.default.computed.filterBy("model","completed",!1)})}),define("todomvc/controllers/application",["exports","ember"],function(e,t){e.default=t.default.Controller.extend({repo:t.default.inject.service(),remaining:t.default.computed.filterBy("model","completed",!1),completed:t.default.computed.filterBy("model","completed"),actions:{createTodo:function(e){13!==e.keyCode||t.default.isBlank(e.target.value)||(this.get("repo").add({title:e.target.value.trim(),completed:!1}),e.target.value="")},clearCompleted:function(){this.get("model").removeObjects(this.get("completed")),this.get("repo").persist()}}})}),define("todomvc/controllers/completed",["exports","ember"],function(e,t){e.default=t.default.Controller.extend({todos:t.default.computed.filterBy("model","completed",!0)})}),define("todomvc/helpers/app-version",["exports","ember","todomvc/config/environment","ember-cli-app-version/utils/regexp"],function(e,t,o,n){function l(e){var t=arguments.length<=1||void 0===arguments[1]?{}:arguments[1]
 return t.hideSha?i.match(n.versionRegExp)[0]:t.hideVersion?i.match(n.shaRegExp)[0]:i}e.appVersion=l
 var i=o.default.APP.version
@@ -26,5 +26,5 @@ n=self}var l,i=o.default.exportApplicationGlobal
 l="string"==typeof i?i:t.default.String.classify(o.default.modulePrefix),n[l]||(n[l]=e,e.reopen({willDestroy:function(){this._super.apply(this,arguments),delete n[l]}}))}}e.initialize=n,e.default={name:"export-application-global",initialize:n}}),define("todomvc/resolver",["exports","ember-resolver"],function(e,t){e.default=t.default}),define("todomvc/router",["exports","ember","todomvc/config/environment"],function(e,t,o){var n=t.default.Router.extend({location:o.default.locationType,rootURL:o.default.rootURL})
 n.map(function(){this.route("active"),this.route("completed")}),e.default=n}),define("todomvc/routes/application",["exports","ember"],function(e,t){e.default=t.default.Route.extend({repo:t.default.inject.service(),model:function(){return this.get("repo").findAll()}})}),define("todomvc/services/ajax",["exports","ember-ajax/services/ajax"],function(e,t){Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}})}),define("todomvc/services/memory",["exports"],function(e){(function(e){var t={},o={}
 t.length=0,t.getItem=function(e){return o[e]||null},t.setItem=function(e,n){void 0===n?t.removeItem(e):(o.hasOwnProperty(e)||t.length++,o[e]=""+n)},t.removeItem=function(e){o.hasOwnProperty(e)&&(delete o[e],t.length--)},t.key=function(e){return Object.keys(o)[e]||null},t.clear=function(){o={},t.length=0},e.localStorageMemory=t})(window)}),define("todomvc/services/repo",["exports","ember","todomvc/services/memory"],function(e,t,o){e.default=t.default.Service.extend({lastId:0,data:null,findAll:function(){return this.get("data")||this.set("data",JSON.parse(window.localStorageMemory.getItem("todos")||"[]"))},add:function(e){var t=Object.assign({id:this.incrementProperty("lastId")},e)
-return this.get("data").pushObject(t),this.persist(),t},delete:function(e){this.get("data").removeObject(e),this.persist()},persist:function(){window.localStorageMemory.setItem("todos",JSON.stringify(this.get("data")))}})}),define("todomvc/templates/active",["exports"],function(e){e.default=Ember.HTMLBars.template({id:"aAsc4Lt8",block:'{"statements":[[1,[33,["todo-list"],null,[["todos"],[[28,["todos"]]]]],false]],"locals":[],"named":[],"yields":[],"hasPartials":false}',meta:{moduleName:"todomvc/templates/active.hbs"}})}),define("todomvc/templates/application",["exports"],function(e){e.default=Ember.HTMLBars.template({id:"BYnyz5ON",block:'{"statements":[[11,"section",[]],[15,"id","todoapp"],[13],[0,"\\n  "],[11,"header",[]],[15,"id","header"],[13],[0,"\\n    "],[11,"h1",[]],[13],[0,"todos"],[14],[0,"\\n    "],[11,"input",[]],[15,"type","text"],[15,"id","new-todo"],[16,"onkeydown",[33,["action"],[[28,[null]],"createTodo"],null],null],[15,"placeholder","What needs to be done?"],[15,"autofocus",""],[13],[14],[0,"\\n  "],[14],[0,"\\n    "],[1,[26,["outlet"]],false],[0,"\\n"],[6,["if"],[[33,["gt"],[[28,["model","length"]],0],null]],null,{"statements":[[0,"      "],[11,"footer",[]],[15,"id","footer"],[13],[0,"\\n        "],[11,"span",[]],[15,"id","todo-count"],[13],[11,"strong",[]],[13],[1,[28,["remaining","length"]],false],[14],[0," "],[1,[33,["pluralize"],["item",[28,["remaining","length"]]],null],false],[0," left"],[14],[0,"\\n        "],[11,"ul",[]],[15,"id","filters"],[13],[0,"\\n          "],[11,"li",[]],[13],[6,["link-to"],["index"],[["activeClass"],["selected"]],{"statements":[[0,"All"]],"locals":[]},null],[14],[0,"\\n          "],[11,"li",[]],[13],[6,["link-to"],["active"],[["activeClass"],["selected"]],{"statements":[[0,"Active"]],"locals":[]},null],[14],[0,"\\n          "],[11,"li",[]],[13],[6,["link-to"],["completed"],[["activeClass"],["selected"]],{"statements":[[0,"Completed"]],"locals":[]},null],[14],[0,"\\n        "],[14],[0,"\\n"],[6,["if"],[[28,["completed","length"]]],null,{"statements":[[0,"          "],[11,"button",[]],[15,"id","clear-completed"],[16,"onclick",[33,["action"],[[28,[null]],"clearCompleted"],null],null],[13],[0,"Clear completed"],[14],[0,"\\n"]],"locals":[]},null],[0,"      "],[14],[0,"\\n"]],"locals":[]},null],[14],[0,"\\n"],[11,"footer",[]],[15,"id","info"],[13],[0,"\\n  "],[11,"p",[]],[13],[0,"Double-click to edit a todo"],[14],[0,"\\n  "],[11,"p",[]],[13],[0,"\\n    Created by\\n    "],[11,"a",[]],[15,"href","http://github.com/cibernox"],[13],[0,"Miguel Camba"],[14],[0,",\\n    "],[11,"a",[]],[15,"href","http://github.com/addyosmani"],[13],[0,"Addy Osmani"],[14],[0,"\\n  "],[14],[0,"\\n  "],[11,"p",[]],[13],[0,"Part of "],[11,"a",[]],[15,"href","http://todomvc.com"],[13],[0,"TodoMVC"],[14],[14],[0,"\\n"],[14]],"locals":[],"named":[],"yields":[],"hasPartials":false}',meta:{moduleName:"todomvc/templates/application.hbs"}})}),define("todomvc/templates/completed",["exports"],function(e){e.default=Ember.HTMLBars.template({id:"F4la9wtb",block:'{"statements":[[1,[33,["todo-list"],null,[["todos"],[[28,["todos"]]]]],false]],"locals":[],"named":[],"yields":[],"hasPartials":false}',meta:{moduleName:"todomvc/templates/completed.hbs"}})}),define("todomvc/templates/components/todo-item",["exports"],function(e){e.default=Ember.HTMLBars.template({id:"dQ3+cK5E",block:'{"statements":[[11,"div",[]],[15,"class","view"],[13],[0,"\\n  "],[11,"input",[]],[15,"type","checkbox"],[15,"class","toggle"],[16,"checked",[28,["todo","completed"]],null],[16,"onchange",[33,["action"],[[28,[null]],"toggleCompleted"],null],null],[13],[14],[0,"\\n  "],[11,"label",[]],[16,"ondblclick",[33,["action"],[[28,[null]],"startEditing"],null],null],[13],[1,[28,["todo","title"]],false],[14],[0,"\\n  "],[11,"button",[]],[16,"onclick",[33,["action"],[[28,[null]],"removeTodo"],null],null],[15,"class","destroy"],[13],[14],[0,"\\n"],[14],[0,"\\n"],[11,"input",[]],[15,"type","text"],[15,"class","edit"],[16,"value",[28,["todo","title"]],null],[16,"onblur",[33,["action"],[[28,[null]],"doneEditing"],[["value"],["target.value"]]],null],[16,"onkeydown",[33,["action"],[[28,[null]],"handleKeydown"],null],null],[15,"autofocus",""],[13],[14]],"locals":[],"named":[],"yields":[],"hasPartials":false}',meta:{moduleName:"todomvc/templates/components/todo-item.hbs"}})}),define("todomvc/templates/components/todo-list",["exports"],function(e){e.default=Ember.HTMLBars.template({id:"XGmWWD63",block:'{"statements":[[6,["if"],[[28,["todos","length"]]],null,{"statements":[[6,["if"],[[28,["canToggle"]]],null,{"statements":[[0,"    "],[11,"input",[]],[15,"type","checkbox"],[15,"id","toggle-all"],[16,"checked",[26,["allCompleted"]],null],[16,"onchange",[33,["action"],[[28,[null]],"toggleAll"],null],null],[13],[14],[0,"\\n"]],"locals":[]},null],[0,"  "],[11,"ul",[]],[15,"id","todo-list"],[15,"class","todo-list"],[13],[0,"\\n"],[6,["each"],[[28,["todos"]]],null,{"statements":[[0,"      "],[1,[33,["todo-item"],null,[["todo","onStartEdit","onEndEdit"],[[28,["todo"]],[33,["action"],[[28,[null]],"disableToggle"],null],[33,["action"],[[28,[null]],"enableToggle"],null]]]],false],[0,"\\n"]],"locals":["todo"]},null],[0,"  "],[14],[0,"\\n"]],"locals":[]},null]],"locals":[],"named":[],"yields":[],"hasPartials":false}',meta:{moduleName:"todomvc/templates/components/todo-list.hbs"}})}),define("todomvc/templates/index",["exports"],function(e){e.default=Ember.HTMLBars.template({id:"hBadNIpo",block:'{"statements":[[6,["if"],[[28,["model","length"]]],null,{"statements":[[0,"  "],[1,[33,["todo-list"],null,[["todos"],[[28,["model"]]]]],false],[0,"\\n"]],"locals":[]},null]],"locals":[],"named":[],"yields":[],"hasPartials":false}',meta:{moduleName:"todomvc/templates/index.hbs"}})}),define("todomvc/config/environment",["ember"],function(e){try{var t="todomvc/config/environment",o=document.querySelector('meta[name="'+t+'"]').getAttribute("content"),n=JSON.parse(unescape(o)),l={default:n}
-return Object.defineProperty(l,"__esModule",{value:!0}),l}catch(e){throw new Error('Could not read config from meta tag with name "'+t+'".')}}),runningTests||require("todomvc/app").default.create({name:"todomvc",version:"0.0.0+64a7cfcd"})
+return this.get("data").pushObject(t),this.persist(),t},delete:function(e){this.get("data").removeObject(e),this.persist()},persist:function(){window.localStorageMemory.setItem("todos",JSON.stringify(this.get("data")))}})}),define("todomvc/templates/active",["exports"],function(e){e.default=Ember.HTMLBars.template({id:"aAsc4Lt8",block:'{"statements":[[1,[33,["todo-list"],null,[["todos"],[[28,["todos"]]]]],false]],"locals":[],"named":[],"yields":[],"hasPartials":false}',meta:{moduleName:"todomvc/templates/active.hbs"}})}),define("todomvc/templates/application",["exports"],function(e){e.default=Ember.HTMLBars.template({id:"LO5Br/dD",block:'{"statements":[[11,"section",[]],[15,"id","todoapp"],[15,"class","todoapp"],[13],[0,"\\n  "],[11,"header",[]],[15,"id","header"],[15,"class","header"],[13],[0,"\\n    "],[11,"h1",[]],[13],[0,"todos"],[14],[0,"\\n    "],[11,"input",[]],[15,"type","text"],[15,"id","new-todo"],[15,"class","new-todo"],[16,"onkeydown",[33,["action"],[[28,[null]],"createTodo"],null],null],[15,"placeholder","What needs to be done?"],[15,"autofocus",""],[13],[14],[0,"\\n  "],[14],[0,"\\n    "],[1,[26,["outlet"]],false],[0,"\\n"],[6,["if"],[[33,["gt"],[[28,["model","length"]],0],null]],null,{"statements":[[0,"      "],[11,"footer",[]],[15,"id","footer"],[15,"class","footer"],[13],[0,"\\n        "],[11,"span",[]],[15,"id","todo-count"],[15,"class","todo-count"],[13],[11,"strong",[]],[13],[1,[28,["remaining","length"]],false],[14],[0," "],[1,[33,["pluralize"],["item",[28,["remaining","length"]]],null],false],[0," left"],[14],[0,"\\n        "],[11,"ul",[]],[15,"id","filters"],[15,"class","filters"],[13],[0,"\\n          "],[11,"li",[]],[13],[6,["link-to"],["index"],[["activeClass"],["selected"]],{"statements":[[0,"All"]],"locals":[]},null],[14],[0,"\\n          "],[11,"li",[]],[13],[6,["link-to"],["active"],[["activeClass"],["selected"]],{"statements":[[0,"Active"]],"locals":[]},null],[14],[0,"\\n          "],[11,"li",[]],[13],[6,["link-to"],["completed"],[["activeClass"],["selected"]],{"statements":[[0,"Completed"]],"locals":[]},null],[14],[0,"\\n        "],[14],[0,"\\n"],[6,["if"],[[28,["completed","length"]]],null,{"statements":[[0,"          "],[11,"button",[]],[15,"id","clear-completed"],[15,"class","clear-completed"],[16,"onclick",[33,["action"],[[28,[null]],"clearCompleted"],null],null],[13],[0,"Clear completed"],[14],[0,"\\n"]],"locals":[]},null],[0,"      "],[14],[0,"\\n"]],"locals":[]},null],[14],[0,"\\n"],[11,"footer",[]],[15,"id","info"],[15,"class","info"],[13],[0,"\\n  "],[11,"p",[]],[13],[0,"Double-click to edit a todo"],[14],[0,"\\n  "],[11,"p",[]],[13],[0,"\\n    Created by\\n    "],[11,"a",[]],[15,"href","http://github.com/cibernox"],[13],[0,"Miguel Camba"],[14],[0,",\\n    "],[11,"a",[]],[15,"href","http://github.com/addyosmani"],[13],[0,"Addy Osmani"],[14],[0,"\\n  "],[14],[0,"\\n  "],[11,"p",[]],[13],[0,"Part of "],[11,"a",[]],[15,"href","http://todomvc.com"],[13],[0,"TodoMVC"],[14],[14],[0,"\\n"],[14]],"locals":[],"named":[],"yields":[],"hasPartials":false}',meta:{moduleName:"todomvc/templates/application.hbs"}})}),define("todomvc/templates/completed",["exports"],function(e){e.default=Ember.HTMLBars.template({id:"F4la9wtb",block:'{"statements":[[1,[33,["todo-list"],null,[["todos"],[[28,["todos"]]]]],false]],"locals":[],"named":[],"yields":[],"hasPartials":false}',meta:{moduleName:"todomvc/templates/completed.hbs"}})}),define("todomvc/templates/components/todo-item",["exports"],function(e){e.default=Ember.HTMLBars.template({id:"dQ3+cK5E",block:'{"statements":[[11,"div",[]],[15,"class","view"],[13],[0,"\\n  "],[11,"input",[]],[15,"type","checkbox"],[15,"class","toggle"],[16,"checked",[28,["todo","completed"]],null],[16,"onchange",[33,["action"],[[28,[null]],"toggleCompleted"],null],null],[13],[14],[0,"\\n  "],[11,"label",[]],[16,"ondblclick",[33,["action"],[[28,[null]],"startEditing"],null],null],[13],[1,[28,["todo","title"]],false],[14],[0,"\\n  "],[11,"button",[]],[16,"onclick",[33,["action"],[[28,[null]],"removeTodo"],null],null],[15,"class","destroy"],[13],[14],[0,"\\n"],[14],[0,"\\n"],[11,"input",[]],[15,"type","text"],[15,"class","edit"],[16,"value",[28,["todo","title"]],null],[16,"onblur",[33,["action"],[[28,[null]],"doneEditing"],[["value"],["target.value"]]],null],[16,"onkeydown",[33,["action"],[[28,[null]],"handleKeydown"],null],null],[15,"autofocus",""],[13],[14]],"locals":[],"named":[],"yields":[],"hasPartials":false}',meta:{moduleName:"todomvc/templates/components/todo-item.hbs"}})}),define("todomvc/templates/components/todo-list",["exports"],function(e){e.default=Ember.HTMLBars.template({id:"UPycDhZO",block:'{"statements":[[6,["if"],[[28,["todos","length"]]],null,{"statements":[[6,["if"],[[28,["canToggle"]]],null,{"statements":[[0,"    "],[11,"input",[]],[15,"type","checkbox"],[15,"id","toggle-all"],[15,"class","toggle-all"],[16,"checked",[26,["allCompleted"]],null],[16,"onchange",[33,["action"],[[28,[null]],"toggleAll"],null],null],[13],[14],[0,"\\n"]],"locals":[]},null],[0,"  "],[11,"ul",[]],[15,"id","todo-list"],[15,"class","todo-list"],[13],[0,"\\n"],[6,["each"],[[28,["todos"]]],null,{"statements":[[0,"      "],[1,[33,["todo-item"],null,[["todo","onStartEdit","onEndEdit"],[[28,["todo"]],[33,["action"],[[28,[null]],"disableToggle"],null],[33,["action"],[[28,[null]],"enableToggle"],null]]]],false],[0,"\\n"]],"locals":["todo"]},null],[0,"  "],[14],[0,"\\n"]],"locals":[]},null]],"locals":[],"named":[],"yields":[],"hasPartials":false}',meta:{moduleName:"todomvc/templates/components/todo-list.hbs"}})}),define("todomvc/templates/index",["exports"],function(e){e.default=Ember.HTMLBars.template({id:"hBadNIpo",block:'{"statements":[[6,["if"],[[28,["model","length"]]],null,{"statements":[[0,"  "],[1,[33,["todo-list"],null,[["todos"],[[28,["model"]]]]],false],[0,"\\n"]],"locals":[]},null]],"locals":[],"named":[],"yields":[],"hasPartials":false}',meta:{moduleName:"todomvc/templates/index.hbs"}})}),define("todomvc/config/environment",["ember"],function(e){try{var t="todomvc/config/environment",o=document.querySelector('meta[name="'+t+'"]').getAttribute("content"),n=JSON.parse(unescape(o)),l={default:n}
+return Object.defineProperty(l,"__esModule",{value:!0}),l}catch(e){throw new Error('Could not read config from meta tag with name "'+t+'".')}}),runningTests||require("todomvc/app").default.create({name:"todomvc",version:"0.0.0+bc37752f"})
diff --git a/PerformanceTests/Speedometer/resources/todomvc/architecture-examples/emberjs/dist/assets/vendor-7b5c98520910afa58d74e05ec86cd873.css b/PerformanceTests/Speedometer/resources/todomvc/architecture-examples/emberjs/dist/assets/vendor-7b5c98520910afa58d74e05ec86cd873.css
deleted file mode 100644 (file)
index 3f5cff9..0000000
+++ /dev/null
@@ -1 +0,0 @@
-#issue-count,.hidden,label[for=toggle-all]{display:none}#footer,#info,#todoapp h1,#toggle-all{text-align:center}hr{margin:20px 0;border:0;border-top:1px dashed #c5c5c5;border-bottom:1px dashed #f7f7f7}.learn a{font-weight:400;text-decoration:none;color:#b83f45}.learn a:hover{text-decoration:underline;color:#787e7e}.learn h3,.learn h4,.learn h5{margin:10px 0;font-weight:500;line-height:1.2;color:#000}.learn h3{font-size:24px}.learn h4{font-size:18px}.learn h5{margin-bottom:0;font-size:14px}.learn ul{padding:0;margin:0 0 30px 25px}.learn li{line-height:20px}.learn p{font-size:15px;font-weight:300;line-height:1.3;margin-top:0;margin-bottom:0}.quote p:after,.quote p:before{font-size:50px;opacity:.15;position:absolute}.quote{border:none;margin:20px 0 60px}.quote p{font-style:italic}.quote p:before{content:'“';top:-20px;left:3px}.quote p:after{content:'”';bottom:-42px;right:3px}.quote footer{position:absolute;bottom:-40px;right:0}.quote footer img{border-radius:3px}.quote footer a{margin-left:5px;vertical-align:middle}.speech-bubble{position:relative;padding:10px;background:rgba(0,0,0,.04);border-radius:5px}.speech-bubble:after{content:'';position:absolute;top:100%;right:30px;border:13px solid transparent;border-top-color:rgba(0,0,0,.04)}.learn-bar>.learn{position:absolute;width:272px;top:8px;left:-300px;padding:10px;border-radius:5px;background-color:rgba(255,255,255,.6);transition-property:left;transition-duration:.5s}#main,#new-todo,#todo-list li,#todoapp,.edit{position:relative}@media (min-width:899px){.learn-bar{width:auto;padding-left:300px}.learn-bar>.learn{left:8px}}body,button,html{padding:0;margin:0}button{border:0;background:0 0;font-size:100%;vertical-align:baseline;font-family:inherit;font-weight:inherit;color:inherit;-webkit-appearance:none;appearance:none;-webkit-font-smoothing:antialiased;-moz-font-smoothing:antialiased;font-smoothing:antialiased}body{font:14px 'Helvetica Neue',Helvetica,Arial,sans-serif;line-height:1.4em;background:#f5f5f5;color:#4d4d4d;min-width:230px;max-width:550px;margin:0 auto;-webkit-font-smoothing:antialiased;-moz-font-smoothing:antialiased;font-smoothing:antialiased;font-weight:300}button,input[type=checkbox]{outline:0}#todoapp{background:#fff;margin:130px 0 40px;box-shadow:0 2px 4px 0 rgba(0,0,0,.2),0 25px 50px 0 rgba(0,0,0,.1)}#todoapp input::-webkit-input-placeholder{font-style:italic;font-weight:300;color:#e6e6e6}#todoapp input::-moz-placeholder{font-style:italic;font-weight:300;color:#e6e6e6}#todoapp input::input-placeholder{font-style:italic;font-weight:300;color:#e6e6e6}#todoapp h1{position:absolute;top:-155px;width:100%;font-size:100px;font-weight:100;color:rgba(175,47,47,.15);-webkit-text-rendering:optimizeLegibility;-moz-text-rendering:optimizeLegibility;text-rendering:optimizeLegibility}#new-todo,.edit{margin:0;width:100%;font-size:24px;font-family:inherit;font-weight:inherit;line-height:1.4em;outline:0;color:inherit;padding:6px;border:1px solid #999;box-shadow:inset 0 -1px 5px 0 rgba(0,0,0,.2);box-sizing:border-box;-webkit-font-smoothing:antialiased;-moz-font-smoothing:antialiased;font-smoothing:antialiased}#new-todo{padding:16px 16px 16px 60px;border:none;background:rgba(0,0,0,.003);box-shadow:inset 0 -2px 1px rgba(0,0,0,.03)}#main{z-index:2;border-top:1px solid #e6e6e6}#toggle-all{position:absolute;top:-55px;left:-12px;width:60px;height:34px;border:none}#toggle-all:before{content:'❯';font-size:22px;color:#e6e6e6;padding:10px 27px}#toggle-all:checked:before{color:#737373}#todo-list{margin:0;padding:0;list-style:none}#todo-list li{font-size:24px;border-bottom:1px solid #ededed}#todo-list li:last-child{border-bottom:none}#todo-list li.editing{border-bottom:none;padding:0}#todo-list li.editing .edit{display:block;width:506px;padding:13px 17px 12px;margin:0 0 0 43px}#todo-list li.editing .view{display:none}#todo-list li .toggle{text-align:center;width:40px;height:auto;position:absolute;top:0;bottom:0;margin:auto 0;border:none;-webkit-appearance:none;appearance:none}#todo-list li .toggle:after{content:url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" width="40" height="40" viewBox="-10 -18 100 135"><circle cx="50" cy="50" r="50" fill="none" stroke="#ededed" stroke-width="3"/></svg>')}#todo-list li .toggle:checked:after{content:url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" width="40" height="40" viewBox="-10 -18 100 135"><circle cx="50" cy="50" r="50" fill="none" stroke="#bddad5" stroke-width="3"/><path fill="#5dc2af" d="M72 25L42 71 27 56l-4 4 20 20 34-52z"/></svg>')}#todo-list li label{white-space:pre;word-break:break-word;padding:15px 60px 15px 15px;margin-left:45px;display:block;line-height:1.2;transition:color .4s}#todo-list li.completed label{color:#d9d9d9;text-decoration:line-through}#todo-list li .destroy{display:none;position:absolute;top:0;right:10px;bottom:0;width:40px;height:40px;margin:auto 0 11px;font-size:30px;color:#cc9a9a;transition:color .2s ease-out}#filters,#footer:before{position:absolute;right:0;left:0}#todo-list li .destroy:hover{color:#af5b5e}#filters li a,#info a{color:inherit;text-decoration:none}#todo-list li .destroy:after{content:'×'}#todo-list li:hover .destroy{display:block}#todo-list li .edit{display:none}#todo-list li.editing:last-child{margin-bottom:-1px}#footer{color:#777;padding:10px 15px;height:20px;border-top:1px solid #e6e6e6}#footer:before{content:'';bottom:0;height:50px;overflow:hidden;box-shadow:0 1px 1px rgba(0,0,0,.2),0 8px 0 -3px #f6f6f6,0 9px 1px -3px rgba(0,0,0,.2),0 16px 0 -6px #f6f6f6,0 17px 2px -6px rgba(0,0,0,.2)}#todo-count{float:left;text-align:left}#todo-count strong{font-weight:300}#filters{margin:0;padding:0;list-style:none}#filters li{display:inline}#filters li a{margin:3px;padding:3px 7px;border:1px solid transparent;border-radius:3px}#filters li a.selected,#filters li a:hover{border-color:rgba(175,47,47,.1)}#filters li a.selected{border-color:rgba(175,47,47,.2)}#clear-completed,html #clear-completed:active{float:right;line-height:20px;text-decoration:none;cursor:pointer;position:relative}#clear-completed:hover,#info a:hover{text-decoration:underline}#info{margin:65px auto 0;color:#bfbfbf;font-size:10px;text-shadow:0 1px 0 rgba(255,255,255,.5)}#info p{line-height:1}#info a{font-weight:400}@media screen and (-webkit-min-device-pixel-ratio:0){#todo-list li .toggle,#toggle-all{background:0 0}#todo-list li .toggle{height:40px}#toggle-all{-webkit-transform:rotate(90deg);transform:rotate(90deg);-webkit-appearance:none;appearance:none}}@media (max-width:430px){#footer{height:50px}#filters{bottom:10px}}
\ No newline at end of file
diff --git a/PerformanceTests/Speedometer/resources/todomvc/architecture-examples/emberjs/dist/assets/vendor-a45c44bc56b4692cca4a96b6916c0fde.css b/PerformanceTests/Speedometer/resources/todomvc/architecture-examples/emberjs/dist/assets/vendor-a45c44bc56b4692cca4a96b6916c0fde.css
new file mode 100644 (file)
index 0000000..6329fa1
--- /dev/null
@@ -0,0 +1 @@
+#issue-count,.hidden{display:none}.edit,.new-todo,body,button{-moz-osx-font-smoothing:grayscale}.footer,.todoapp h1,.toggle-all{text-align:center}hr{margin:20px 0;border:0;border-top:1px dashed #c5c5c5;border-bottom:1px dashed #f7f7f7}.learn a{font-weight:400;text-decoration:none;color:#b83f45}.learn a:hover{text-decoration:underline;color:#787e7e}.learn h3,.learn h4,.learn h5{margin:10px 0;font-weight:500;line-height:1.2;color:#000}.learn h3{font-size:24px}.learn h4{font-size:18px}.learn h5{margin-bottom:0;font-size:14px}.learn ul{padding:0;margin:0 0 30px 25px}.learn li{line-height:20px}.learn p{font-size:15px;font-weight:300;line-height:1.3;margin-top:0;margin-bottom:0}.quote p:after,.quote p:before{font-size:50px;opacity:.15;position:absolute}.quote{border:none;margin:20px 0 60px}.quote p{font-style:italic}.quote p:before{content:'“';top:-20px;left:3px}.quote p:after{content:'”';bottom:-42px;right:3px}.quote footer{position:absolute;bottom:-40px;right:0}.quote footer img{border-radius:3px}.quote footer a{margin-left:5px;vertical-align:middle}.speech-bubble{position:relative;padding:10px;background:rgba(0,0,0,.04);border-radius:5px}.speech-bubble:after{content:'';position:absolute;top:100%;right:30px;border:13px solid transparent;border-top-color:rgba(0,0,0,.04)}.learn-bar>.learn{position:absolute;width:272px;top:8px;left:-300px;padding:10px;border-radius:5px;background-color:rgba(255,255,255,.6);transition-property:left;transition-duration:.5s}@media (min-width:899px){.learn-bar{width:auto;padding-left:300px}.learn-bar>.learn{left:8px}}body,button,html{margin:0;padding:0}button{border:0;background:0 0;font-size:100%;vertical-align:baseline;font-family:inherit;font-weight:inherit;color:inherit;-webkit-appearance:none;appearance:none;-webkit-font-smoothing:antialiased}body{font:14px 'Helvetica Neue',Helvetica,Arial,sans-serif;line-height:1.4em;background:#f5f5f5;color:#4d4d4d;min-width:230px;max-width:550px;margin:0 auto;-webkit-font-smoothing:antialiased;font-weight:300}:focus{outline:0}.todoapp{background:#fff;margin:130px 0 40px;position:relative;box-shadow:0 2px 4px 0 rgba(0,0,0,.2),0 25px 50px 0 rgba(0,0,0,.1)}.todoapp input::-webkit-input-placeholder{font-style:italic;font-weight:300;color:#e6e6e6}.todoapp input::-moz-placeholder{font-style:italic;font-weight:300;color:#e6e6e6}.todoapp input::input-placeholder{font-style:italic;font-weight:300;color:#e6e6e6}.todoapp h1{position:absolute;top:-155px;width:100%;font-size:100px;font-weight:100;color:rgba(175,47,47,.15);-webkit-text-rendering:optimizeLegibility;-moz-text-rendering:optimizeLegibility;text-rendering:optimizeLegibility}.edit,.new-todo{position:relative;margin:0;width:100%;font-size:24px;font-family:inherit;font-weight:inherit;line-height:1.4em;color:inherit;padding:6px;border:1px solid #999;box-shadow:inset 0 -1px 5px 0 rgba(0,0,0,.2);box-sizing:border-box;-webkit-font-smoothing:antialiased}.new-todo{padding:16px 16px 16px 60px;border:none;background:rgba(0,0,0,.003);box-shadow:inset 0 -2px 1px rgba(0,0,0,.03)}.main{position:relative;z-index:2;border-top:1px solid #e6e6e6}.toggle-all{border:none;opacity:0;position:absolute}.toggle-all+label{width:60px;height:34px;font-size:0;position:absolute;top:-52px;left:-13px;-webkit-transform:rotate(90deg);transform:rotate(90deg)}.toggle-all+label:before{content:'❯';font-size:22px;color:#e6e6e6;padding:10px 27px}.toggle-all:checked+label:before{color:#737373}.todo-list{margin:0;padding:0;list-style:none}.todo-list li{position:relative;font-size:24px;border-bottom:1px solid #ededed}.todo-list li:last-child{border-bottom:none}.todo-list li.editing{border-bottom:none;padding:0}.todo-list li.editing .edit{display:block;width:506px;padding:12px 16px;margin:0 0 0 43px}.todo-list li.editing .view{display:none}.todo-list li .toggle{text-align:center;width:40px;height:auto;position:absolute;top:0;bottom:0;margin:auto 0;border:none;-webkit-appearance:none;appearance:none;opacity:0}.todo-list li .toggle+label{background-image:url(data:image/svg+xml;utf8,%3Csvg%20xmlns%3D%22http%3A//www.w3.org/2000/svg%22%20width%3D%2240%22%20height%3D%2240%22%20viewBox%3D%22-10%20-18%20100%20135%22%3E%3Ccircle%20cx%3D%2250%22%20cy%3D%2250%22%20r%3D%2250%22%20fill%3D%22none%22%20stroke%3D%22%23ededed%22%20stroke-width%3D%223%22/%3E%3C/svg%3E);background-repeat:no-repeat;background-position:center left}.todo-list li .toggle:checked+label{background-image:url(data:image/svg+xml;utf8,%3Csvg%20xmlns%3D%22http%3A//www.w3.org/2000/svg%22%20width%3D%2240%22%20height%3D%2240%22%20viewBox%3D%22-10%20-18%20100%20135%22%3E%3Ccircle%20cx%3D%2250%22%20cy%3D%2250%22%20r%3D%2250%22%20fill%3D%22none%22%20stroke%3D%22%23bddad5%22%20stroke-width%3D%223%22/%3E%3Cpath%20fill%3D%22%235dc2af%22%20d%3D%22M72%2025L42%2071%2027%2056l-4%204%2020%2020%2034-52z%22/%3E%3C/svg%3E)}.todo-list li label{word-break:break-all;padding:15px 15px 15px 60px;display:block;line-height:1.2;transition:color .4s}.todo-list li.completed label{color:#d9d9d9;text-decoration:line-through}.todo-list li .destroy{display:none;position:absolute;top:0;right:10px;bottom:0;width:40px;height:40px;margin:auto 0 11px;font-size:30px;color:#cc9a9a;transition:color .2s ease-out}.filters,.footer:before{position:absolute;right:0;left:0}.todo-list li .destroy:hover{color:#af5b5e}.todo-list li .destroy:after{content:'×'}.todo-list li:hover .destroy{display:block}.todo-list li .edit{display:none}.todo-list li.editing:last-child{margin-bottom:-1px}.footer{color:#777;padding:10px 15px;height:20px;border-top:1px solid #e6e6e6}.footer:before{content:'';bottom:0;height:50px;overflow:hidden;box-shadow:0 1px 1px rgba(0,0,0,.2),0 8px 0 -3px #f6f6f6,0 9px 1px -3px rgba(0,0,0,.2),0 16px 0 -6px #f6f6f6,0 17px 2px -6px rgba(0,0,0,.2)}.todo-count{float:left;text-align:left}.todo-count strong{font-weight:300}.filters{margin:0;padding:0;list-style:none}.filters li{display:inline}.filters li a{color:inherit;margin:3px;padding:3px 7px;text-decoration:none;border:1px solid transparent;border-radius:3px}.filters li a:hover{border-color:rgba(175,47,47,.1)}.filters li a.selected{border-color:rgba(175,47,47,.2)}.clear-completed,html .clear-completed:active{float:right;position:relative;line-height:20px;text-decoration:none;cursor:pointer}.clear-completed:hover{text-decoration:underline}.info{margin:65px auto 0;color:#bfbfbf;font-size:10px;text-shadow:0 1px 0 rgba(255,255,255,.5);text-align:center}.info p{line-height:1}.info a{color:inherit;text-decoration:none;font-weight:400}.info a:hover{text-decoration:underline}@media screen and (-webkit-min-device-pixel-ratio:0){.todo-list li .toggle,.toggle-all{background:0 0}.todo-list li .toggle{height:40px}}@media (max-width:430px){.footer{height:50px}.filters{bottom:10px}}
\ No newline at end of file
index 656d198..1f8097d 100644 (file)
@@ -7,14 +7,14 @@
     <meta name="description" content="">
     <meta name="viewport" content="width=device-width, initial-scale=1">
     
-<meta name="todomvc/config/environment" content="%7B%22modulePrefix%22%3A%22todomvc%22%2C%22environment%22%3A%22production%22%2C%22baseURL%22%3Anull%2C%22locationType%22%3A%22hash%22%2C%22EmberENV%22%3A%7B%22FEATURES%22%3A%7B%7D%2C%22EXTEND_PROTOTYPES%22%3A%7B%22Date%22%3Afalse%7D%7D%2C%22APP%22%3A%7B%22name%22%3A%22todomvc%22%2C%22version%22%3A%220.0.0+64a7cfcd%22%7D%2C%22exportApplicationGlobal%22%3Afalse%7D" />
-    <link rel="stylesheet" href="assets/vendor-7b5c98520910afa58d74e05ec86cd873.css" integrity="sha256-bsagGHduhay9QPLUFpddcZFq7Kmr2ScM3VKnWhdX8oM= sha512-eNsGN2aLecWPvoqNVH8oXK8o/IJ7rO5ti0zgS8lF8LiwmKUHdEIuFduwcDL1VLAt2r+3YjgDzoSNYK6c57pJzw==" >
+<meta name="todomvc/config/environment" content="%7B%22modulePrefix%22%3A%22todomvc%22%2C%22environment%22%3A%22production%22%2C%22baseURL%22%3Anull%2C%22locationType%22%3A%22hash%22%2C%22EmberENV%22%3A%7B%22FEATURES%22%3A%7B%7D%2C%22EXTEND_PROTOTYPES%22%3A%7B%22Date%22%3Afalse%7D%7D%2C%22APP%22%3A%7B%22name%22%3A%22todomvc%22%2C%22version%22%3A%220.0.0+bc37752f%22%7D%2C%22exportApplicationGlobal%22%3Afalse%7D" />
+    <link rel="stylesheet" href="assets/vendor-a45c44bc56b4692cca4a96b6916c0fde.css" integrity="sha256-wri71NgRSS8Ri2MYmuencXvYL+yQDweqc4LX9yrCstw= sha512-Quz1uKZ8tcCIvB9safdsFiWlRSunJyK+8elapH+Mx4qLx2+1CzYOAbjpaQDpmlMttL+Nra1P361yZrIyRhPDDA==" >
     
   </head>
   <body>
     
     <script src="assets/vendor-820919567eb7bd4d9fac358a90a5aac4.js" integrity="sha256-BZHBbf1U21+kgPYmoIK7gLkqHu88v5cwEVFfwUPXojs= sha512-2YWrAbR45p8fk3/y4Qhbok/KUfLE/v6yMSUqIWncTmWqfJbyJj0+AiTkJL03k0oPUMZbFYyQx9SuL6XoXp4sgg==" ></script>
-    <script src="assets/todomvc-677491ba42e10b5fa16875d8bcaf1c6c.js" integrity="sha256-GshnmIB2kQAujHPhB44P5QbEHERBTybuBrnUuTZ4+ho= sha512-zzAFfLKLXLZazJBBznOzzQoYSJEtdLYY+zeWxkbH3+lCwo07DbpNT37fspq+OQrgCprOl2jdPverSxgr2vd75A==" ></script>
+    <script src="assets/todomvc-5d3e8eb3d5b3740a33185edcb11eeb57.js" integrity="sha256-TlR3MSC0+pEW7ypWHo2KbKJ8aGi7ebK3AAyXVdGlGJk= sha512-VrNV9WfIGB3sR8fm1qhLQwIISD4AQbarc5PqrKAddfNg+eNY/NynTA3N/eW0SHWQtOmNxSMOtP+aZlKfLi3r2A==" ></script>
     
   </body>
 </html>
index 17ea180..e04fbdb 100644 (file)
@@ -17,8 +17,7 @@ button {
     -webkit-appearance: none;
     appearance: none;
     -webkit-font-smoothing: antialiased;
-    -moz-font-smoothing: antialiased;
-    font-smoothing: antialiased;
+    -moz-osx-font-smoothing: grayscale;
 }
 
 body {
@@ -30,21 +29,19 @@ body {
     max-width: 550px;
     margin: 0 auto;
     -webkit-font-smoothing: antialiased;
-    -moz-font-smoothing: antialiased;
-    font-smoothing: antialiased;
+    -moz-osx-font-smoothing: grayscale;
     font-weight: 300;
 }
 
-button,
-input[type="checkbox"] {
-    outline: none;
+:focus {
+    outline: 0;
 }
 
 .hidden {
     display: none;
 }
 
-#todoapp {
+.todoapp {
     background: #fff;
     margin: 130px 0 40px 0;
     position: relative;
@@ -52,25 +49,25 @@ input[type="checkbox"] {
                 0 25px 50px 0 rgba(0, 0, 0, 0.1);
 }
 
-#todoapp input::-webkit-input-placeholder {
+.todoapp input::-webkit-input-placeholder {
     font-style: italic;
     font-weight: 300;
     color: #e6e6e6;
 }
 
-#todoapp input::-moz-placeholder {
+.todoapp input::-moz-placeholder {
     font-style: italic;
     font-weight: 300;
     color: #e6e6e6;
 }
 
-#todoapp input::input-placeholder {
+.todoapp input::input-placeholder {
     font-style: italic;
     font-weight: 300;
     color: #e6e6e6;
 }
 
-#todoapp h1 {
+.todoapp h1 {
     position: absolute;
     top: -155px;
     width: 100%;
@@ -83,7 +80,7 @@ input[type="checkbox"] {
     text-rendering: optimizeLegibility;
 }
 
-#new-todo,
+.new-todo,
 .edit {
     position: relative;
     margin: 0;
@@ -93,88 +90,90 @@ input[type="checkbox"] {
     font-weight: inherit;
     line-height: 1.4em;
     border: 0;
-    outline: none;
     color: inherit;
     padding: 6px;
     border: 1px solid #999;
     box-shadow: inset 0 -1px 5px 0 rgba(0, 0, 0, 0.2);
     box-sizing: border-box;
     -webkit-font-smoothing: antialiased;
-    -moz-font-smoothing: antialiased;
-    font-smoothing: antialiased;
+    -moz-osx-font-smoothing: grayscale;
 }
 
-#new-todo {
+.new-todo {
     padding: 16px 16px 16px 60px;
     border: none;
     background: rgba(0, 0, 0, 0.003);
     box-shadow: inset 0 -2px 1px rgba(0,0,0,0.03);
 }
 
-#main {
+.main {
     position: relative;
     z-index: 2;
     border-top: 1px solid #e6e6e6;
 }
 
-label[for='toggle-all'] {
-    display: none;
+.toggle-all {
+    text-align: center;
+    border: none; /* Mobile Safari */
+    opacity: 0;
+    position: absolute;
 }
 
-#toggle-all {
-    position: absolute;
-    top: -55px;
-    left: -12px;
+.toggle-all + label {
     width: 60px;
     height: 34px;
-    text-align: center;
-    border: none; /* Mobile Safari */
+    font-size: 0;
+    position: absolute;
+    top: -52px;
+    left: -13px;
+    -webkit-transform: rotate(90deg);
+    transform: rotate(90deg);
 }
 
-#toggle-all:before {
+.toggle-all + label:before {
     content: '❯';
     font-size: 22px;
     color: #e6e6e6;
     padding: 10px 27px 10px 27px;
 }
 
-#toggle-all:checked:before {
+.toggle-all:checked + label:before {
     color: #737373;
 }
 
-#todo-list {
+.todo-list {
     margin: 0;
     padding: 0;
     list-style: none;
 }
 
-#todo-list li {
+.todo-list li {
     position: relative;
     font-size: 24px;
     border-bottom: 1px solid #ededed;
 }
 
-#todo-list li:last-child {
+.todo-list li:last-child {
     border-bottom: none;
 }
 
-#todo-list li.editing {
+.todo-list li.editing {
     border-bottom: none;
     padding: 0;
 }
 
-#todo-list li.editing .edit {
+.todo-list li.editing .edit {
     display: block;
     width: 506px;
-    padding: 13px 17px 12px 17px;
+    padding: 12px 16px;
     margin: 0 0 0 43px;
 }
 
-#todo-list li.editing .view {
+.todo-list li.editing .view {
     display: none;
 }
 
-#todo-list li .toggle {
+.todo-list li .toggle {
     text-align: center;
     width: 40px;
     /* auto, since non-WebKit browsers doesn't support input styling */
@@ -188,30 +187,38 @@ label[for='toggle-all'] {
     appearance: none;
 }
 
-#todo-list li .toggle:after {
-    content: url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" width="40" height="40" viewBox="-10 -18 100 135"><circle cx="50" cy="50" r="50" fill="none" stroke="#ededed" stroke-width="3"/></svg>');
+.todo-list li .toggle {
+    opacity: 0;
+}
+
+.todo-list li .toggle + label {
+    /*
+        Firefox requires `#` to be escaped - https://bugzilla.mozilla.org/show_bug.cgi?id=922433
+        IE and Edge requires *everything* to be escaped to render, so we do that instead of just the `#` - https://developer.microsoft.com/en-us/microsoft-edge/platform/issues/7157459/
+    */
+    background-image: url('data:image/svg+xml;utf8,%3Csvg%20xmlns%3D%22http%3A//www.w3.org/2000/svg%22%20width%3D%2240%22%20height%3D%2240%22%20viewBox%3D%22-10%20-18%20100%20135%22%3E%3Ccircle%20cx%3D%2250%22%20cy%3D%2250%22%20r%3D%2250%22%20fill%3D%22none%22%20stroke%3D%22%23ededed%22%20stroke-width%3D%223%22/%3E%3C/svg%3E');
+    background-repeat: no-repeat;
+    background-position: center left;
 }
 
-#todo-list li .toggle:checked:after {
-    content: url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" width="40" height="40" viewBox="-10 -18 100 135"><circle cx="50" cy="50" r="50" fill="none" stroke="#bddad5" stroke-width="3"/><path fill="#5dc2af" d="M72 25L42 71 27 56l-4 4 20 20 34-52z"/></svg>');
+.todo-list li .toggle:checked + label {
+    background-image: url('data:image/svg+xml;utf8,%3Csvg%20xmlns%3D%22http%3A//www.w3.org/2000/svg%22%20width%3D%2240%22%20height%3D%2240%22%20viewBox%3D%22-10%20-18%20100%20135%22%3E%3Ccircle%20cx%3D%2250%22%20cy%3D%2250%22%20r%3D%2250%22%20fill%3D%22none%22%20stroke%3D%22%23bddad5%22%20stroke-width%3D%223%22/%3E%3Cpath%20fill%3D%22%235dc2af%22%20d%3D%22M72%2025L42%2071%2027%2056l-4%204%2020%2020%2034-52z%22/%3E%3C/svg%3E');
 }
 
-#todo-list li label {
-    white-space: pre;
-    word-break: break-word;
-    padding: 15px 60px 15px 15px;
-    margin-left: 45px;
+.todo-list li label {
+    word-break: break-all;
+    padding: 15px 15px 15px 60px;
     display: block;
     line-height: 1.2;
     transition: color 0.4s;
 }
 
-#todo-list li.completed label {
+.todo-list li.completed label {
     color: #d9d9d9;
     text-decoration: line-through;
 }
 
-#todo-list li .destroy {
+.todo-list li .destroy {
     display: none;
     position: absolute;
     top: 0;
@@ -226,27 +233,27 @@ label[for='toggle-all'] {
     transition: color 0.2s ease-out;
 }
 
-#todo-list li .destroy:hover {
+.todo-list li .destroy:hover {
     color: #af5b5e;
 }
 
-#todo-list li .destroy:after {
+.todo-list li .destroy:after {
     content: '×';
 }
 
-#todo-list li:hover .destroy {
+.todo-list li:hover .destroy {
     display: block;
 }
 
-#todo-list li .edit {
+.todo-list li .edit {
     display: none;
 }
 
-#todo-list li.editing:last-child {
+.todo-list li.editing:last-child {
     margin-bottom: -1px;
 }
 
-#footer {
+.footer {
     color: #777;
     padding: 10px 15px;
     height: 20px;
@@ -254,7 +261,7 @@ label[for='toggle-all'] {
     border-top: 1px solid #e6e6e6;
 }
 
-#footer:before {
+.footer:before {
     content: '';
     position: absolute;
     right: 0;
@@ -269,16 +276,16 @@ label[for='toggle-all'] {
                 0 17px 2px -6px rgba(0, 0, 0, 0.2);
 }
 
-#todo-count {
+.todo-count {
     float: left;
     text-align: left;
 }
 
-#todo-count strong {
+.todo-count strong {
     font-weight: 300;
 }
 
-#filters {
+.filters {
     margin: 0;
     padding: 0;
     list-style: none;
@@ -287,11 +294,11 @@ label[for='toggle-all'] {
     left: 0;
 }
 
-#filters li {
+.filters li {
     display: inline;
 }
 
-#filters li a {
+.filters li a {
     color: inherit;
     margin: 3px;
     padding: 3px 7px;
@@ -300,30 +307,28 @@ label[for='toggle-all'] {
     border-radius: 3px;
 }
 
-#filters li a.selected,
-#filters li a:hover {
+.filters li a:hover {
     border-color: rgba(175, 47, 47, 0.1);
 }
 
-#filters li a.selected {
+.filters li a.selected {
     border-color: rgba(175, 47, 47, 0.2);
 }
 
-#clear-completed,
-html #clear-completed:active {
+.clear-completed,
+html .clear-completed:active {
     float: right;
     position: relative;
     line-height: 20px;
     text-decoration: none;
     cursor: pointer;
-    position: relative;
 }
 
-#clear-completed:hover {
+.clear-completed:hover {
     text-decoration: underline;
 }
 
-#info {
+.info {
     margin: 65px auto 0;
     color: #bfbfbf;
     font-size: 10px;
@@ -331,17 +336,17 @@ html #clear-completed:active {
     text-align: center;
 }
 
-#info p {
+.info p {
     line-height: 1;
 }
 
-#info a {
+.info a {
     color: inherit;
     text-decoration: none;
     font-weight: 400;
 }
 
-#info a:hover {
+.info a:hover {
     text-decoration: underline;
 }
 
@@ -350,29 +355,22 @@ html #clear-completed:active {
     Can't use it globally since it destroys checkboxes in Firefox
 */
 @media screen and (-webkit-min-device-pixel-ratio:0) {
-    #toggle-all,
-    #todo-list li .toggle {
+    .toggle-all,
+    .todo-list li .toggle {
         background: none;
     }
 
-    #todo-list li .toggle {
+    .todo-list li .toggle {
         height: 40px;
     }
-
-    #toggle-all {
-        -webkit-transform: rotate(90deg);
-        transform: rotate(90deg);
-        -webkit-appearance: none;
-        appearance: none;
-    }
 }
 
 @media (max-width: 430px) {
-    #footer {
+    .footer {
         height: 50px;
     }
 
-    #filters {
+    .filters {
         bottom: 10px;
     }
 }
index 10e3d2f..e04fbdb 100644 (file)
@@ -112,28 +112,32 @@ body {
     border-top: 1px solid #e6e6e6;
 }
 
-label[for='toggle-all'] {
-    display: none;
-}
-
 .toggle-all {
+    text-align: center;
+    border: none; /* Mobile Safari */
+    opacity: 0;
     position: absolute;
-    top: -55px;
-    left: -12px;
+}
+
+.toggle-all + label {
     width: 60px;
     height: 34px;
-    text-align: center;
-    border: none; /* Mobile Safari */
+    font-size: 0;
+    position: absolute;
+    top: -52px;
+    left: -13px;
+    -webkit-transform: rotate(90deg);
+    transform: rotate(90deg);
 }
 
-.toggle-all:before {
+.toggle-all + label:before {
     content: '❯';
     font-size: 22px;
     color: #e6e6e6;
     padding: 10px 27px 10px 27px;
 }
 
-.toggle-all:checked:before {
+.toggle-all:checked + label:before {
     color: #737373;
 }
 
@@ -183,18 +187,27 @@ label[for='toggle-all'] {
     appearance: none;
 }
 
-.todo-list li .toggle:after {
-    content: url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" width="40" height="40" viewBox="-10 -18 100 135"><circle cx="50" cy="50" r="50" fill="none" stroke="#ededed" stroke-width="3"/></svg>');
+.todo-list li .toggle {
+    opacity: 0;
 }
 
-.todo-list li .toggle:checked:after {
-    content: url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" width="40" height="40" viewBox="-10 -18 100 135"><circle cx="50" cy="50" r="50" fill="none" stroke="#bddad5" stroke-width="3"/><path fill="#5dc2af" d="M72 25L42 71 27 56l-4 4 20 20 34-52z"/></svg>');
+.todo-list li .toggle + label {
+    /*
+        Firefox requires `#` to be escaped - https://bugzilla.mozilla.org/show_bug.cgi?id=922433
+        IE and Edge requires *everything* to be escaped to render, so we do that instead of just the `#` - https://developer.microsoft.com/en-us/microsoft-edge/platform/issues/7157459/
+    */
+    background-image: url('data:image/svg+xml;utf8,%3Csvg%20xmlns%3D%22http%3A//www.w3.org/2000/svg%22%20width%3D%2240%22%20height%3D%2240%22%20viewBox%3D%22-10%20-18%20100%20135%22%3E%3Ccircle%20cx%3D%2250%22%20cy%3D%2250%22%20r%3D%2250%22%20fill%3D%22none%22%20stroke%3D%22%23ededed%22%20stroke-width%3D%223%22/%3E%3C/svg%3E');
+    background-repeat: no-repeat;
+    background-position: center left;
+}
+
+.todo-list li .toggle:checked + label {
+    background-image: url('data:image/svg+xml;utf8,%3Csvg%20xmlns%3D%22http%3A//www.w3.org/2000/svg%22%20width%3D%2240%22%20height%3D%2240%22%20viewBox%3D%22-10%20-18%20100%20135%22%3E%3Ccircle%20cx%3D%2250%22%20cy%3D%2250%22%20r%3D%2250%22%20fill%3D%22none%22%20stroke%3D%22%23bddad5%22%20stroke-width%3D%223%22/%3E%3Cpath%20fill%3D%22%235dc2af%22%20d%3D%22M72%2025L42%2071%2027%2056l-4%204%2020%2020%2034-52z%22/%3E%3C/svg%3E');
 }
 
 .todo-list li label {
     word-break: break-all;
-    padding: 15px 60px 15px 15px;
-    margin-left: 45px;
+    padding: 15px 15px 15px 60px;
     display: block;
     line-height: 1.2;
     transition: color 0.4s;
@@ -350,13 +363,6 @@ html .clear-completed:active {
     .todo-list li .toggle {
         height: 40px;
     }
-
-    .toggle-all {
-        -webkit-transform: rotate(90deg);
-        transform: rotate(90deg);
-        -webkit-appearance: none;
-        appearance: none;
-    }
 }
 
 @media (max-width: 430px) {
index 46531c5..63b81a8 100644 (file)
@@ -1,18 +1,43 @@
 {
-  "name": "todomvc-app-css",
-  "style": "index.css",
-  "version": "2.0.6",
-  "description": "CSS for TodoMVC apps",
-  "license": "CC-BY-4.0",
-  "repository": "tastejs/todomvc-app-css",
+  "_from": "todomvc-app-css@^2.1.0",
+  "_id": "todomvc-app-css@2.1.0",
+  "_inBundle": false,
+  "_integrity": "sha1-tvJxbTOa+i5feZNH0qSLBTliQqU=",
+  "_location": "/todomvc-app-css",
+  "_phantomChildren": {},
+  "_requested": {
+    "type": "range",
+    "registry": true,
+    "raw": "todomvc-app-css@^2.1.0",
+    "name": "todomvc-app-css",
+    "escapedName": "todomvc-app-css",
+    "rawSpec": "^2.1.0",
+    "saveSpec": null,
+    "fetchSpec": "^2.1.0"
+  },
+  "_requiredBy": [
+    "#USER",
+    "/"
+  ],
+  "_resolved": "https://registry.npmjs.org/todomvc-app-css/-/todomvc-app-css-2.1.0.tgz",
+  "_shasum": "b6f2716d339afa2e5f799347d2a48b05396242a5",
+  "_spec": "todomvc-app-css@^2.1.0",
+  "_where": "/Users/mathiasb/projects/WebKit/PerformanceTests/Speedometer/resources/todomvc/architecture-examples/inferno",
   "author": {
     "name": "Sindre Sorhus",
     "email": "sindresorhus@gmail.com",
     "url": "sindresorhus.com"
   },
+  "bugs": {
+    "url": "https://github.com/tastejs/todomvc-app-css/issues"
+  },
+  "bundleDependencies": false,
+  "deprecated": false,
+  "description": "CSS for TodoMVC apps",
   "files": [
     "index.css"
   ],
+  "homepage": "https://github.com/tastejs/todomvc-app-css#readme",
   "keywords": [
     "todomvc",
     "tastejs",
     "css",
     "style",
     "stylesheet"
-  ]
+  ],
+  "license": "CC-BY-4.0",
+  "name": "todomvc-app-css",
+  "repository": {
+    "type": "git",
+    "url": "git+https://github.com/tastejs/todomvc-app-css.git"
+  },
+  "style": "index.css",
+  "version": "2.1.0"
 }
index 81e006b..e1676db 100644 (file)
@@ -21,7 +21,7 @@
                 }
             }
             return object;
-        }
+        };
 
         // By default, Underscore uses ERB-style template delimiters, change the
         // following template settings to use alternative delimiters.
index 57c6c5f..4018c19 100644 (file)
@@ -1,20 +1,55 @@
 {
-  "name": "todomvc-common",
-  "version": "1.0.3",
+  "_from": "todomvc-common@^1.0.4",
+  "_id": "todomvc-common@1.0.4",
+  "_inBundle": false,
+  "_integrity": "sha512-AA0Z4exovEqubhbZCrzzn9roVT4zvOncS319p2zIc4CsNe5B9TLL7Sei1NIV6d+WrgR5rOi+y0I9Y6GE7xgNOw==",
+  "_location": "/todomvc-common",
+  "_phantomChildren": {},
+  "_requested": {
+    "type": "range",
+    "registry": true,
+    "raw": "todomvc-common@^1.0.4",
+    "name": "todomvc-common",
+    "escapedName": "todomvc-common",
+    "rawSpec": "^1.0.4",
+    "saveSpec": null,
+    "fetchSpec": "^1.0.4"
+  },
+  "_requiredBy": [
+    "#USER",
+    "/"
+  ],
+  "_resolved": "https://registry.npmjs.org/todomvc-common/-/todomvc-common-1.0.4.tgz",
+  "_shasum": "23099af886c2f0525bfd4537e078f12d0074309e",
+  "_spec": "todomvc-common@^1.0.4",
+  "_where": "/Users/mathiasb/projects/WebKit/PerformanceTests/Speedometer/resources/todomvc/architecture-examples/inferno",
+  "author": {
+    "name": "TasteJS"
+  },
+  "bugs": {
+    "url": "https://github.com/tastejs/todomvc-common/issues"
+  },
+  "bundleDependencies": false,
+  "deprecated": false,
   "description": "Common TodoMVC utilities used by our apps",
-  "license": "MIT",
-  "repository": "tastejs/todomvc-common",
-  "author": "TasteJS",
-  "main": "base.js",
-  "style": "base.css",
   "files": [
     "base.js",
     "base.css"
   ],
+  "homepage": "https://github.com/tastejs/todomvc-common#readme",
   "keywords": [
     "todomvc",
     "tastejs",
     "util",
     "utilities"
-  ]
+  ],
+  "license": "MIT",
+  "main": "base.js",
+  "name": "todomvc-common",
+  "repository": {
+    "type": "git",
+    "url": "git+https://github.com/tastejs/todomvc-common.git"
+  },
+  "style": "base.css",
+  "version": "1.0.4"
 }
index 075ed52..4eae839 100644 (file)
@@ -8,8 +8,8 @@
   "dependencies": {
     "inferno": "beta32",
     "inferno-component": "beta32",
-    "todomvc-app-css": "^2.0.0",
-    "todomvc-common": "^1.0.0"
+    "todomvc-app-css": "^2.1.0",
+    "todomvc-common": "^1.0.4"
   },
   "devDependencies": {
     "babel-core": "^6.5.2",
index 1cf803e..63610b2 100644 (file)
@@ -8,19 +8,19 @@
         <link rel="stylesheet" href="css/app.css">
     </head>
     <body>
-        <section id="todoapp">
-            <header id="header">
+        <section id="todoapp" class="todoapp">
+            <header id="header" class="header">
                 <h1>todos</h1>
-                <input id="new-todo" placeholder="What needs to be done?" autofocus>
+                <input id="new-todo" class="new-todo" placeholder="What needs to be done?" autofocus>
             </header>
-            <section id="main">
-                <input id="toggle-all" type="checkbox">
+            <section id="main" class="main">
+                <input id="toggle-all" class="toggle-all" type="checkbox">
                 <label for="toggle-all">Mark all as complete</label>
-                <ul id="todo-list"></ul>
+                <ul id="todo-list" class="todo-list"></ul>
             </section>
-            <footer id="footer"></footer>
+            <footer id="footer" class="footer"></footer>
         </section>
-        <footer id="info">
+        <footer id="info" class="info">
             <p>Double-click to edit a todo</p>
             <p>Created by <a href="http://sindresorhus.com">Sindre Sorhus</a></p>
             <p>Part of <a href="http://todomvc.com">TodoMVC</a></p>
@@ -38,8 +38,8 @@
         {{/this}}
         </script>
         <script id="footer-template" type="text/x-handlebars-template">
-            <span id="todo-count"><strong>{{activeTodoCount}}</strong> {{activeTodoWord}} left</span>
-            <ul id="filters">
+            <span id="todo-count" class="todo-count"><strong>{{activeTodoCount}}</strong> {{activeTodoWord}} left</span>
+            <ul id="filters" class="filters">
                 <li>
                     <a {{#eq filter 'all'}}class="selected"{{/eq}} href="#/all">All</a>
                 </li>
index 17ea180..e04fbdb 100644 (file)
@@ -17,8 +17,7 @@ button {
     -webkit-appearance: none;
     appearance: none;
     -webkit-font-smoothing: antialiased;
-    -moz-font-smoothing: antialiased;
-    font-smoothing: antialiased;
+    -moz-osx-font-smoothing: grayscale;
 }
 
 body {
@@ -30,21 +29,19 @@ body {
     max-width: 550px;
     margin: 0 auto;
     -webkit-font-smoothing: antialiased;
-    -moz-font-smoothing: antialiased;
-    font-smoothing: antialiased;
+    -moz-osx-font-smoothing: grayscale;
     font-weight: 300;
 }
 
-button,
-input[type="checkbox"] {
-    outline: none;
+:focus {
+    outline: 0;
 }
 
 .hidden {
     display: none;
 }
 
-#todoapp {
+.todoapp {
     background: #fff;
     margin: 130px 0 40px 0;
     position: relative;
@@ -52,25 +49,25 @@ input[type="checkbox"] {
                 0 25px 50px 0 rgba(0, 0, 0, 0.1);
 }
 
-#todoapp input::-webkit-input-placeholder {
+.todoapp input::-webkit-input-placeholder {
     font-style: italic;
     font-weight: 300;
     color: #e6e6e6;
 }
 
-#todoapp input::-moz-placeholder {
+.todoapp input::-moz-placeholder {
     font-style: italic;
     font-weight: 300;
     color: #e6e6e6;
 }
 
-#todoapp input::input-placeholder {
+.todoapp input::input-placeholder {
     font-style: italic;
     font-weight: 300;
     color: #e6e6e6;
 }
 
-#todoapp h1 {
+.todoapp h1 {
     position: absolute;
     top: -155px;
     width: 100%;
@@ -83,7 +80,7 @@ input[type="checkbox"] {
     text-rendering: optimizeLegibility;
 }
 
-#new-todo,
+.new-todo,
 .edit {
     position: relative;
     margin: 0;
@@ -93,88 +90,90 @@ input[type="checkbox"] {
     font-weight: inherit;
     line-height: 1.4em;
     border: 0;
-    outline: none;
     color: inherit;
     padding: 6px;
     border: 1px solid #999;
     box-shadow: inset 0 -1px 5px 0 rgba(0, 0, 0, 0.2);
     box-sizing: border-box;
     -webkit-font-smoothing: antialiased;
-    -moz-font-smoothing: antialiased;
-    font-smoothing: antialiased;
+    -moz-osx-font-smoothing: grayscale;
 }
 
-#new-todo {
+.new-todo {
     padding: 16px 16px 16px 60px;
     border: none;
     background: rgba(0, 0, 0, 0.003);
     box-shadow: inset 0 -2px 1px rgba(0,0,0,0.03);
 }
 
-#main {
+.main {
     position: relative;
     z-index: 2;
     border-top: 1px solid #e6e6e6;
 }
 
-label[for='toggle-all'] {
-    display: none;
+.toggle-all {
+    text-align: center;
+    border: none; /* Mobile Safari */
+    opacity: 0;
+    position: absolute;
 }
 
-#toggle-all {
-    position: absolute;
-    top: -55px;
-    left: -12px;
+.toggle-all + label {
     width: 60px;
     height: 34px;
-    text-align: center;
-    border: none; /* Mobile Safari */
+    font-size: 0;
+    position: absolute;
+    top: -52px;
+    left: -13px;
+    -webkit-transform: rotate(90deg);
+    transform: rotate(90deg);
 }
 
-#toggle-all:before {
+.toggle-all + label:before {
     content: '❯';
     font-size: 22px;
     color: #e6e6e6;
     padding: 10px 27px 10px 27px;
 }
 
-#toggle-all:checked:before {
+.toggle-all:checked + label:before {
     color: #737373;
 }
 
-#todo-list {
+.todo-list {
     margin: 0;
     padding: 0;
     list-style: none;
 }
 
-#todo-list li {
+.todo-list li {
     position: relative;
     font-size: 24px;
     border-bottom: 1px solid #ededed;
 }
 
-#todo-list li:last-child {
+.todo-list li:last-child {
     border-bottom: none;
 }
 
-#todo-list li.editing {
+.todo-list li.editing {
     border-bottom: none;
     padding: 0;
 }
 
-#todo-list li.editing .edit {
+.todo-list li.editing .edit {
     display: block;
     width: 506px;
-    padding: 13px 17px 12px 17px;
+    padding: 12px 16px;
     margin: 0 0 0 43px;
 }
 
-#todo-list li.editing .view {
+.todo-list li.editing .view {
     display: none;
 }
 
-#todo-list li .toggle {
+.todo-list li .toggle {
     text-align: center;
     width: 40px;
     /* auto, since non-WebKit browsers doesn't support input styling */
@@ -188,30 +187,38 @@ label[for='toggle-all'] {
     appearance: none;
 }
 
-#todo-list li .toggle:after {
-    content: url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" width="40" height="40" viewBox="-10 -18 100 135"><circle cx="50" cy="50" r="50" fill="none" stroke="#ededed" stroke-width="3"/></svg>');
+.todo-list li .toggle {
+    opacity: 0;
+}
+
+.todo-list li .toggle + label {
+    /*
+        Firefox requires `#` to be escaped - https://bugzilla.mozilla.org/show_bug.cgi?id=922433
+        IE and Edge requires *everything* to be escaped to render, so we do that instead of just the `#` - https://developer.microsoft.com/en-us/microsoft-edge/platform/issues/7157459/
+    */
+    background-image: url('data:image/svg+xml;utf8,%3Csvg%20xmlns%3D%22http%3A//www.w3.org/2000/svg%22%20width%3D%2240%22%20height%3D%2240%22%20viewBox%3D%22-10%20-18%20100%20135%22%3E%3Ccircle%20cx%3D%2250%22%20cy%3D%2250%22%20r%3D%2250%22%20fill%3D%22none%22%20stroke%3D%22%23ededed%22%20stroke-width%3D%223%22/%3E%3C/svg%3E');
+    background-repeat: no-repeat;
+    background-position: center left;
 }
 
-#todo-list li .toggle:checked:after {
-    content: url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" width="40" height="40" viewBox="-10 -18 100 135"><circle cx="50" cy="50" r="50" fill="none" stroke="#bddad5" stroke-width="3"/><path fill="#5dc2af" d="M72 25L42 71 27 56l-4 4 20 20 34-52z"/></svg>');
+.todo-list li .toggle:checked + label {
+    background-image: url('data:image/svg+xml;utf8,%3Csvg%20xmlns%3D%22http%3A//www.w3.org/2000/svg%22%20width%3D%2240%22%20height%3D%2240%22%20viewBox%3D%22-10%20-18%20100%20135%22%3E%3Ccircle%20cx%3D%2250%22%20cy%3D%2250%22%20r%3D%2250%22%20fill%3D%22none%22%20stroke%3D%22%23bddad5%22%20stroke-width%3D%223%22/%3E%3Cpath%20fill%3D%22%235dc2af%22%20d%3D%22M72%2025L42%2071%2027%2056l-4%204%2020%2020%2034-52z%22/%3E%3C/svg%3E');
 }
 
-#todo-list li label {
-    white-space: pre;
-    word-break: break-word;
-    padding: 15px 60px 15px 15px;
-    margin-left: 45px;
+.todo-list li label {
+    word-break: break-all;
+    padding: 15px 15px 15px 60px;
     display: block;
     line-height: 1.2;
     transition: color 0.4s;
 }
 
-#todo-list li.completed label {
+.todo-list li.completed label {
     color: #d9d9d9;
     text-decoration: line-through;
 }
 
-#todo-list li .destroy {
+.todo-list li .destroy {
     display: none;
     position: absolute;
     top: 0;
@@ -226,27 +233,27 @@ label[for='toggle-all'] {
     transition: color 0.2s ease-out;
 }
 
-#todo-list li .destroy:hover {
+.todo-list li .destroy:hover {
     color: #af5b5e;
 }
 
-#todo-list li .destroy:after {
+.todo-list li .destroy:after {
     content: '×';
 }
 
-#todo-list li:hover .destroy {
+.todo-list li:hover .destroy {
     display: block;
 }
 
-#todo-list li .edit {
+.todo-list li .edit {
     display: none;
 }
 
-#todo-list li.editing:last-child {
+.todo-list li.editing:last-child {
     margin-bottom: -1px;
 }
 
-#footer {
+.footer {
     color: #777;
     padding: 10px 15px;
     height: 20px;
@@ -254,7 +261,7 @@ label[for='toggle-all'] {
     border-top: 1px solid #e6e6e6;
 }
 
-#footer:before {
+.footer:before {
     content: '';
     position: absolute;
     right: 0;
@@ -269,16 +276,16 @@ label[for='toggle-all'] {
                 0 17px 2px -6px rgba(0, 0, 0, 0.2);
 }
 
-#todo-count {
+.todo-count {
     float: left;
     text-align: left;
 }
 
-#todo-count strong {
+.todo-count strong {
     font-weight: 300;
 }
 
-#filters {
+.filters {
     margin: 0;
     padding: 0;
     list-style: none;
@@ -287,11 +294,11 @@ label[for='toggle-all'] {
     left: 0;
 }
 
-#filters li {
+.filters li {
     display: inline;
 }
 
-#filters li a {
+.filters li a {
     color: inherit;
     margin: 3px;
     padding: 3px 7px;
@@ -300,30 +307,28 @@ label[for='toggle-all'] {
     border-radius: 3px;
 }
 
-#filters li a.selected,
-#filters li a:hover {
+.filters li a:hover {
     border-color: rgba(175, 47, 47, 0.1);
 }
 
-#filters li a.selected {
+.filters li a.selected {
     border-color: rgba(175, 47, 47, 0.2);
 }
 
-#clear-completed,
-html #clear-completed:active {
+.clear-completed,
+html .clear-completed:active {
     float: right;
     position: relative;
     line-height: 20px;
     text-decoration: none;
     cursor: pointer;
-    position: relative;
 }
 
-#clear-completed:hover {
+.clear-completed:hover {
     text-decoration: underline;
 }
 
-#info {
+.info {
     margin: 65px auto 0;
     color: #bfbfbf;
     font-size: 10px;
@@ -331,17 +336,17 @@ html #clear-completed:active {
     text-align: center;
 }
 
-#info p {
+.info p {
     line-height: 1;
 }
 
-#info a {
+.info a {
     color: inherit;
     text-decoration: none;
     font-weight: 400;
 }
 
-#info a:hover {
+.info a:hover {
     text-decoration: underline;
 }
 
@@ -350,29 +355,22 @@ html #clear-completed:active {
     Can't use it globally since it destroys checkboxes in Firefox
 */
 @media screen and (-webkit-min-device-pixel-ratio:0) {
-    #toggle-all,
-    #todo-list li .toggle {
+    .toggle-all,
+    .todo-list li .toggle {
         background: none;
     }
 
-    #todo-list li .toggle {
+    .todo-list li .toggle {
         height: 40px;
     }
-
-    #toggle-all {
-        -webkit-transform: rotate(90deg);
-        transform: rotate(90deg);
-        -webkit-appearance: none;
-        appearance: none;
-    }
 }
 
 @media (max-width: 430px) {
-    #footer {
+    .footer {
         height: 50px;
     }
 
-    #filters {
+    .filters {
         bottom: 10px;
     }
 }
index 550efa6..abff9e6 100644 (file)
@@ -1,46 +1,27 @@
 {
-  "_args": [
-    [
-      {
-        "raw": "todomvc-app-css@~1.0.1",
-        "scope": null,
-        "escapedName": "todomvc-app-css",
-        "name": "todomvc-app-css",
-        "rawSpec": "~1.0.1",
-        "spec": ">=1.0.1 <1.1.0",
-        "type": "range"
-      },
-      "/Users/addyo/projects/speedometer/resources/todomvc/architecture-examples/jquery"
-    ]
-  ],
-  "_from": "todomvc-app-css@>=1.0.1 <1.1.0",
-  "_id": "todomvc-app-css@1.0.4",
-  "_inCache": true,
+  "_from": "todomvc-app-css@^2.1.0",
+  "_id": "todomvc-app-css@2.1.0",
+  "_inBundle": false,
+  "_integrity": "sha1-tvJxbTOa+i5feZNH0qSLBTliQqU=",
   "_location": "/todomvc-app-css",
-  "_nodeVersion": "0.12.0",
-  "_npmUser": {
-    "name": "sindresorhus",
-    "email": "sindresorhus@gmail.com"
-  },
-  "_npmVersion": "2.5.1",
   "_phantomChildren": {},
   "_requested": {
-    "raw": "todomvc-app-css@~1.0.1",
-    "scope": null,
-    "escapedName": "todomvc-app-css",
+    "type": "range",
+    "registry": true,
+    "raw": "todomvc-app-css@^2.1.0",
     "name": "todomvc-app-css",
-    "rawSpec": "~1.0.1",
-    "spec": ">=1.0.1 <1.1.0",
-    "type": "range"
+    "escapedName": "todomvc-app-css",
+    "rawSpec": "^2.1.0",
+    "saveSpec": null,
+    "fetchSpec": "^2.1.0"
   },
   "_requiredBy": [
     "/"
   ],
-  "_resolved": "https://registry.npmjs.org/todomvc-app-css/-/todomvc-app-css-1.0.4.tgz",
-  "_shasum": "d2529279a6da5befb06b55c0c324c5fcfd94d656",
-  "_shrinkwrap": null,
-  "_spec": "todomvc-app-css@~1.0.1",
-  "_where": "/Users/addyo/projects/speedometer/resources/todomvc/architecture-examples/jquery",
+  "_resolved": "https://registry.npmjs.org/todomvc-app-css/-/todomvc-app-css-2.1.0.tgz",
+  "_shasum": "b6f2716d339afa2e5f799347d2a48b05396242a5",
+  "_spec": "todomvc-app-css@^2.1.0",
+  "_where": "/Users/mathiasb/projects/WebKit/PerformanceTests/Speedometer/resources/todomvc/architecture-examples/jquery",
   "author": {
     "name": "Sindre Sorhus",
     "email": "sindresorhus@gmail.com",
   "bugs": {
     "url": "https://github.com/tastejs/todomvc-app-css/issues"
   },
-  "dependencies": {},
+  "bundleDependencies": false,
+  "deprecated": false,
   "description": "CSS for TodoMVC apps",
-  "devDependencies": {},
-  "directories": {},
-  "dist": {
-    "shasum": "d2529279a6da5befb06b55c0c324c5fcfd94d656",
-    "tarball": "https://registry.npmjs.org/todomvc-app-css/-/todomvc-app-css-1.0.4.tgz"
-  },
   "files": [
     "index.css"
   ],
-  "gitHead": "1e4e38884a35193eaf1808a5ba44421832867184",
-  "homepage": "https://github.com/tastejs/todomvc-app-css",
+  "homepage": "https://github.com/tastejs/todomvc-app-css#readme",
   "keywords": [
     "todomvc",
     "tastejs",
     "stylesheet"
   ],
   "license": "CC-BY-4.0",
-  "maintainers": [
-    {
-      "name": "sindresorhus",
-      "email": "sindresorhus@gmail.com"
-    },
-    {
-      "name": "addyosmani",
-      "email": "addyosmani@gmail.com"
-    },
-    {
-      "name": "passy",
-      "email": "phartig@rdrei.net"
-    },
-    {
-      "name": "stephenplusplus",
-      "email": "sawchuk@gmail.com"
-    }
-  ],
   "name": "todomvc-app-css",
-  "optionalDependencies": {},
-  "readme": "ERROR: No README data found!",
   "repository": {
     "type": "git",
     "url": "git+https://github.com/tastejs/todomvc-app-css.git"
   },
-  "scripts": {},
-  "version": "1.0.4"
+  "style": "index.css",
+  "version": "2.1.0"
 }
index 81e006b..e1676db 100644 (file)
@@ -21,7 +21,7 @@
                 }
             }
             return object;
-        }
+        };
 
         // By default, Underscore uses ERB-style template delimiters, change the
         // following template settings to use alternative delimiters.
index 5525d43..5200ebd 100644 (file)
@@ -1,69 +1,40 @@
 {
-  "_args": [
-    [
-      {
-        "raw": "todomvc-common@~1.0.1",
-        "scope": null,
-        "escapedName": "todomvc-common",
-        "name": "todomvc-common",
-        "rawSpec": "~1.0.1",
-        "spec": ">=1.0.1 <1.1.0",
-        "type": "range"
-      },
-      "/Users/addyo/projects/speedometer/resources/todomvc/architecture-examples/jquery"
-    ]
-  ],
-  "_from": "todomvc-common@>=1.0.1 <1.1.0",
-  "_id": "todomvc-common@1.0.3",
-  "_inCache": true,
+  "_from": "todomvc-common@^1.0.4",
+  "_id": "todomvc-common@1.0.4",
+  "_inBundle": false,
+  "_integrity": "sha512-AA0Z4exovEqubhbZCrzzn9roVT4zvOncS319p2zIc4CsNe5B9TLL7Sei1NIV6d+WrgR5rOi+y0I9Y6GE7xgNOw==",
   "_location": "/todomvc-common",
-  "_nodeVersion": "7.1.0",
-  "_npmOperationalInternal": {
-    "host": "packages-18-east.internal.npmjs.com",
-    "tmp": "tmp/todomvc-common-1.0.3.tgz_1479276361227_0.51124880136922"
-  },
-  "_npmUser": {
-    "name": "sindresorhus",
-    "email": "sindresorhus@gmail.com"
-  },
-  "_npmVersion": "3.10.9",
   "_phantomChildren": {},
   "_requested": {
-    "raw": "todomvc-common@~1.0.1",
-    "scope": null,
-    "escapedName": "todomvc-common",
+    "type": "range",
+    "registry": true,
+    "raw": "todomvc-common@^1.0.4",
     "name": "todomvc-common",
-    "rawSpec": "~1.0.1",
-    "spec": ">=1.0.1 <1.1.0",
-    "type": "range"
+    "escapedName": "todomvc-common",
+    "rawSpec": "^1.0.4",
+    "saveSpec": null,
+    "fetchSpec": "^1.0.4"
   },
   "_requiredBy": [
     "/"
   ],
-  "_resolved": "https://registry.npmjs.org/todomvc-common/-/todomvc-common-1.0.3.tgz",
-  "_shasum": "cba1868109caa401b908ebf77794cc1014b74873",
-  "_shrinkwrap": null,
-  "_spec": "todomvc-common@~1.0.1",
-  "_where": "/Users/addyo/projects/speedometer/resources/todomvc/architecture-examples/jquery",
+  "_resolved": "https://registry.npmjs.org/todomvc-common/-/todomvc-common-1.0.4.tgz",
+  "_shasum": "23099af886c2f0525bfd4537e078f12d0074309e",
+  "_spec": "todomvc-common@^1.0.4",
+  "_where": "/Users/mathiasb/projects/WebKit/PerformanceTests/Speedometer/resources/todomvc/architecture-examples/jquery",
   "author": {
     "name": "TasteJS"
   },
   "bugs": {
     "url": "https://github.com/tastejs/todomvc-common/issues"
   },
-  "dependencies": {},
+  "bundleDependencies": false,
+  "deprecated": false,
   "description": "Common TodoMVC utilities used by our apps",
-  "devDependencies": {},
-  "directories": {},
-  "dist": {
-    "shasum": "cba1868109caa401b908ebf77794cc1014b74873",
-    "tarball": "https://registry.npmjs.org/todomvc-common/-/todomvc-common-1.0.3.tgz"
-  },
   "files": [
     "base.js",
     "base.css"
   ],
-  "gitHead": "e7425bafb9561d766b769844810e0496734ffe8c",
   "homepage": "https://github.com/tastejs/todomvc-common#readme",
   "keywords": [
     "todomvc",
   ],
   "license": "MIT",
   "main": "base.js",
-  "maintainers": [
-    {
-      "name": "sindresorhus",
-      "email": "sindresorhus@gmail.com"
-    },
-    {
-      "name": "addyosmani",
-      "email": "addyosmani@gmail.com"
-    },
-    {
-      "name": "passy",
-      "email": "phartig@rdrei.net"
-    },
-    {
-      "name": "stephenplusplus",
-      "email": "sawchuk@gmail.com"
-    }
-  ],
   "name": "todomvc-common",
-  "optionalDependencies": {},
-  "readme": "ERROR: No README data found!",
   "repository": {
     "type": "git",
     "url": "git+https://github.com/tastejs/todomvc-common.git"
   },
-  "scripts": {},
   "style": "base.css",
-  "version": "1.0.3"
+  "version": "1.0.4"
 }
index 097c85f..acccc09 100644 (file)
@@ -4,7 +4,7 @@
     "director": "~1.2.2",
     "handlebars": "^4.0.6",
     "jquery": "^3.1.1",
-    "todomvc-app-css": "~1.0.1",
-    "todomvc-common": "~1.0.1"
+    "todomvc-app-css": "^2.1.0",
+    "todomvc-common": "^1.0.4"
   }
 }
index c7cba9e..a1ddf1f 100644 (file)
@@ -1,7 +1,7 @@
-<span id="todo-count">
+<span id="todo-count" class="todo-count">
     <strong><%= remaining %></strong> <%= remaining == 1 ? 'item' : 'items' %> left
 </span>
-<ul id="filters">
+<ul id="filters" class="filters">
     <li>
         <a href="#/">All</a>
     </li>
@@ -13,5 +13,5 @@
     </li>
 </ul>
 <% if (completed) { %>
-<button id="clear-completed">Clear completed</button>
+<button id="clear-completed" class="clear-completed">Clear completed</button>
 <% } %>
index 600fbb0..4b480b7 100644 (file)
@@ -7,22 +7,22 @@
         <link rel="stylesheet" href="node_modules/todomvc-app-css/index.css">
     </head>
     <body>
-        <section id="todoapp">
-            <header id="header">
+        <section id="todoapp" class="todoapp">
+            <header id="header" class="header">
                 <h1>todos</h1>
-                <input id="new-todo" placeholder="What needs to be done?" autofocus>
+                <input id="new-todo" class="new-todo" placeholder="What needs to be done?" autofocus>
             </header>
-            <section id="main">
-                <input id="toggle-all" type="checkbox">
+            <section id="main" class="main">
+                <input id="toggle-all" class="toggle-all" type="checkbox">
                 <label for="toggle-all">Mark all as complete</label>
-                <ul id="todo-list"></ul>
+                <ul id="todo-list" class="todo-list"></ul>
             </section>
-            <footer id="footer"></footer>
+            <footer id="footer" class="footer"></footer>
         </section>
-        <footer id="info">
+        <footer id="info" class="info">
             <p>Double-click to edit a todo</p>
             <p>Speedometer version by Addy Osmani</p>
-            <p>Created by <a href="http://github.com/mkuklis">Michal Kuklis</a></p>
+            <p>Created by <a href="https://github.com/mkuklis">Michal Kuklis</a></p>
             <p>Part of <a href="http://todomvc.com">TodoMVC</a></p>
         </footer>
         <script data-main="app/js/main" src="node_modules/requirejs/require.js"></script>
index 17ea180..e04fbdb 100644 (file)
@@ -17,8 +17,7 @@ button {
     -webkit-appearance: none;
     appearance: none;
     -webkit-font-smoothing: antialiased;
-    -moz-font-smoothing: antialiased;
-    font-smoothing: antialiased;
+    -moz-osx-font-smoothing: grayscale;
 }
 
 body {
@@ -30,21 +29,19 @@ body {
     max-width: 550px;
     margin: 0 auto;
     -webkit-font-smoothing: antialiased;
-    -moz-font-smoothing: antialiased;
-    font-smoothing: antialiased;
+    -moz-osx-font-smoothing: grayscale;
     font-weight: 300;
 }
 
-button,
-input[type="checkbox"] {
-    outline: none;
+:focus {
+    outline: 0;
 }
 
 .hidden {
     display: none;
 }
 
-#todoapp {
+.todoapp {
     background: #fff;
     margin: 130px 0 40px 0;
     position: relative;
@@ -52,25 +49,25 @@ input[type="checkbox"] {
                 0 25px 50px 0 rgba(0, 0, 0, 0.1);
 }
 
-#todoapp input::-webkit-input-placeholder {
+.todoapp input::-webkit-input-placeholder {
     font-style: italic;
     font-weight: 300;
     color: #e6e6e6;
 }
 
-#todoapp input::-moz-placeholder {
+.todoapp input::-moz-placeholder {
     font-style: italic;
     font-weight: 300;
     color: #e6e6e6;
 }
 
-#todoapp input::input-placeholder {
+.todoapp input::input-placeholder {
     font-style: italic;
     font-weight: 300;
     color: #e6e6e6;
 }
 
-#todoapp h1 {
+.todoapp h1 {
     position: absolute;
     top: -155px;
     width: 100%;
@@ -83,7 +80,7 @@ input[type="checkbox"] {
     text-rendering: optimizeLegibility;
 }
 
-#new-todo,
+.new-todo,
 .edit {
     position: relative;
     margin: 0;
@@ -93,88 +90,90 @@ input[type="checkbox"] {
     font-weight: inherit;
     line-height: 1.4em;
     border: 0;
-    outline: none;
     color: inherit;
     padding: 6px;
     border: 1px solid #999;
     box-shadow: inset 0 -1px 5px 0 rgba(0, 0, 0, 0.2);
     box-sizing: border-box;
     -webkit-font-smoothing: antialiased;
-    -moz-font-smoothing: antialiased;
-    font-smoothing: antialiased;
+    -moz-osx-font-smoothing: grayscale;
 }
 
-#new-todo {
+.new-todo {
     padding: 16px 16px 16px 60px;
     border: none;
     background: rgba(0, 0, 0, 0.003);
     box-shadow: inset 0 -2px 1px rgba(0,0,0,0.03);
 }
 
-#main {
+.main {
     position: relative;
     z-index: 2;
     border-top: 1px solid #e6e6e6;
 }
 
-label[for='toggle-all'] {
-    display: none;
+.toggle-all {
+    text-align: center;
+    border: none; /* Mobile Safari */
+    opacity: 0;
+    position: absolute;
 }
 
-#toggle-all {
-    position: absolute;
-    top: -55px;
-    left: -12px;
+.toggle-all + label {
     width: 60px;
     height: 34px;
-    text-align: center;
-    border: none; /* Mobile Safari */
+    font-size: 0;
+    position: absolute;
+    top: -52px;
+    left: -13px;
+    -webkit-transform: rotate(90deg);
+    transform: rotate(90deg);
 }
 
-#toggle-all:before {
+.toggle-all + label:before {
     content: '❯';
     font-size: 22px;
     color: #e6e6e6;
     padding: 10px 27px 10px 27px;
 }
 
-#toggle-all:checked:before {
+.toggle-all:checked + label:before {
     color: #737373;
 }
 
-#todo-list {
+.todo-list {
     margin: 0;
     padding: 0;
     list-style: none;
 }
 
-#todo-list li {
+.todo-list li {
     position: relative;
     font-size: 24px;
     border-bottom: 1px solid #ededed;
 }
 
-#todo-list li:last-child {
+.todo-list li:last-child {
     border-bottom: none;
 }
 
-#todo-list li.editing {
+.todo-list li.editing {
     border-bottom: none;
     padding: 0;
 }
 
-#todo-list li.editing .edit {
+.todo-list li.editing .edit {
     display: block;
     width: 506px;
-    padding: 13px 17px 12px 17px;
+    padding: 12px 16px;
     margin: 0 0 0 43px;
 }
 
-#todo-list li.editing .view {
+.todo-list li.editing .view {
     display: none;
 }
 
-#todo-list li .toggle {
+.todo-list li .toggle {
     text-align: center;
     width: 40px;
     /* auto, since non-WebKit browsers doesn't support input styling */
@@ -188,30 +187,38 @@ label[for='toggle-all'] {
     appearance: none;
 }
 
-#todo-list li .toggle:after {
-    content: url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" width="40" height="40" viewBox="-10 -18 100 135"><circle cx="50" cy="50" r="50" fill="none" stroke="#ededed" stroke-width="3"/></svg>');
+.todo-list li .toggle {
+    opacity: 0;
+}
+
+.todo-list li .toggle + label {
+    /*
+        Firefox requires `#` to be escaped - https://bugzilla.mozilla.org/show_bug.cgi?id=922433
+        IE and Edge requires *everything* to be escaped to render, so we do that instead of just the `#` - https://developer.microsoft.com/en-us/microsoft-edge/platform/issues/7157459/
+    */
+    background-image: url('data:image/svg+xml;utf8,%3Csvg%20xmlns%3D%22http%3A//www.w3.org/2000/svg%22%20width%3D%2240%22%20height%3D%2240%22%20viewBox%3D%22-10%20-18%20100%20135%22%3E%3Ccircle%20cx%3D%2250%22%20cy%3D%2250%22%20r%3D%2250%22%20fill%3D%22none%22%20stroke%3D%22%23ededed%22%20stroke-width%3D%223%22/%3E%3C/svg%3E');
+    background-repeat: no-repeat;
+    background-position: center left;
 }
 
-#todo-list li .toggle:checked:after {
-    content: url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" width="40" height="40" viewBox="-10 -18 100 135"><circle cx="50" cy="50" r="50" fill="none" stroke="#bddad5" stroke-width="3"/><path fill="#5dc2af" d="M72 25L42 71 27 56l-4 4 20 20 34-52z"/></svg>');
+.todo-list li .toggle:checked + label {
+    background-image: url('data:image/svg+xml;utf8,%3Csvg%20xmlns%3D%22http%3A//www.w3.org/2000/svg%22%20width%3D%2240%22%20height%3D%2240%22%20viewBox%3D%22-10%20-18%20100%20135%22%3E%3Ccircle%20cx%3D%2250%22%20cy%3D%2250%22%20r%3D%2250%22%20fill%3D%22none%22%20stroke%3D%22%23bddad5%22%20stroke-width%3D%223%22/%3E%3Cpath%20fill%3D%22%235dc2af%22%20d%3D%22M72%2025L42%2071%2027%2056l-4%204%2020%2020%2034-52z%22/%3E%3C/svg%3E');
 }
 
-#todo-list li label {
-    white-space: pre;
-    word-break: break-word;
-    padding: 15px 60px 15px 15px;
-    margin-left: 45px;
+.todo-list li label {
+    word-break: break-all;
+    padding: 15px 15px 15px 60px;
     display: block;
     line-height: 1.2;
     transition: color 0.4s;
 }
 
-#todo-list li.completed label {
+.todo-list li.completed label {
     color: #d9d9d9;
     text-decoration: line-through;
 }
 
-#todo-list li .destroy {
+.todo-list li .destroy {
     display: none;
     position: absolute;
     top: 0;
@@ -226,27 +233,27 @@ label[for='toggle-all'] {
     transition: color 0.2s ease-out;
 }
 
-#todo-list li .destroy:hover {
+.todo-list li .destroy:hover {
     color: #af5b5e;
 }
 
-#todo-list li .destroy:after {
+.todo-list li .destroy:after {
     content: '×';
 }
 
-#todo-list li:hover .destroy {
+.todo-list li:hover .destroy {
     display: block;
 }
 
-#todo-list li .edit {
+.todo-list li .edit {
     display: none;
 }
 
-#todo-list li.editing:last-child {
+.todo-list li.editing:last-child {
     margin-bottom: -1px;
 }
 
-#footer {
+.footer {
     color: #777;
     padding: 10px 15px;
     height: 20px;
@@ -254,7 +261,7 @@ label[for='toggle-all'] {
     border-top: 1px solid #e6e6e6;
 }
 
-#footer:before {
+.footer:before {
     content: '';
     position: absolute;
     right: 0;
@@ -269,16 +276,16 @@ label[for='toggle-all'] {
                 0 17px 2px -6px rgba(0, 0, 0, 0.2);
 }
 
-#todo-count {
+.todo-count {
     float: left;
     text-align: left;
 }
 
-#todo-count strong {
+.todo-count strong {
     font-weight: 300;
 }
 
-#filters {
+.filters {
     margin: 0;
     padding: 0;
     list-style: none;
@@ -287,11 +294,11 @@ label[for='toggle-all'] {
     left: 0;
 }
 
-#filters li {
+.filters li {
     display: inline;
 }
 
-#filters li a {
+.filters li a {
     color: inherit;
     margin: 3px;
     padding: 3px 7px;
@@ -300,30 +307,28 @@ label[for='toggle-all'] {
     border-radius: 3px;
 }
 
-#filters li a.selected,
-#filters li a:hover {
+.filters li a:hover {
     border-color: rgba(175, 47, 47, 0.1);
 }
 
-#filters li a.selected {
+.filters li a.selected {
     border-color: rgba(175, 47, 47, 0.2);
 }
 
-#clear-completed,
-html #clear-completed:active {
+.clear-completed,
+html .clear-completed:active {
     float: right;
     position: relative;
     line-height: 20px;
     text-decoration: none;
     cursor: pointer;
-    position: relative;
 }
 
-#clear-completed:hover {
+.clear-completed:hover {
     text-decoration: underline;
 }
 
-#info {
+.info {
     margin: 65px auto 0;
     color: #bfbfbf;
     font-size: 10px;
@@ -331,17 +336,17 @@ html #clear-completed:active {
     text-align: center;
 }
 
-#info p {
+.info p {
     line-height: 1;
 }
 
-#info a {
+.info a {
     color: inherit;
     text-decoration: none;
     font-weight: 400;
 }
 
-#info a:hover {
+.info a:hover {
     text-decoration: underline;
 }
 
@@ -350,29 +355,22 @@ html #clear-completed:active {
     Can't use it globally since it destroys checkboxes in Firefox
 */
 @media screen and (-webkit-min-device-pixel-ratio:0) {
-    #toggle-all,
-    #todo-list li .toggle {
+    .toggle-all,
+    .todo-list li .toggle {
         background: none;
     }
 
-    #todo-list li .toggle {
+    .todo-list li .toggle {
         height: 40px;
     }
-
-    #toggle-all {
-        -webkit-transform: rotate(90deg);
-        transform: rotate(90deg);
-        -webkit-appearance: none;
-        appearance: none;
-    }
 }
 
 @media (max-width: 430px) {
-    #footer {
+    .footer {
         height: 50px;
     }
 
-    #filters {
+    .filters {
         bottom: 10px;
     }
 }
index 5fc1d0d..7c4898f 100644 (file)
@@ -1,46 +1,27 @@
 {
-  "_args": [
-    [
-      {
-        "raw": "todomvc-app-css@^1.0.0",
-        "scope": null,
-        "escapedName": "todomvc-app-css",
-        "name": "todomvc-app-css",
-        "rawSpec": "^1.0.0",
-        "spec": ">=1.0.0 <2.0.0",
-        "type": "range"
-      },
-      "/Users/addyo/Desktop/Speedometer-a/resources/todomvc/dependency-examples/flight"
-    ]
-  ],
-  "_from": "todomvc-app-css@>=1.0.0 <2.0.0",
-  "_id": "todomvc-app-css@1.0.4",
-  "_inCache": true,
+  "_from": "todomvc-app-css@^2.1.0",
+  "_id": "todomvc-app-css@2.1.0",
+  "_inBundle": false,
+  "_integrity": "sha1-tvJxbTOa+i5feZNH0qSLBTliQqU=",
   "_location": "/todomvc-app-css",
-  "_nodeVersion": "0.12.0",
-  "_npmUser": {
-    "name": "sindresorhus",
-    "email": "sindresorhus@gmail.com"
-  },
-  "_npmVersion": "2.5.1",
   "_phantomChildren": {},
   "_requested": {
-    "raw": "todomvc-app-css@^1.0.0",
-    "scope": null,
-    "escapedName": "todomvc-app-css",
+    "type": "range",
+    "registry": true,
+    "raw": "todomvc-app-css@^2.1.0",
     "name": "todomvc-app-css",
-    "rawSpec": "^1.0.0",
-    "spec": ">=1.0.0 <2.0.0",
-    "type": "range"
+    "escapedName": "todomvc-app-css",
+    "rawSpec": "^2.1.0",
+    "saveSpec": null,
+    "fetchSpec": "^2.1.0"
   },
   "_requiredBy": [
     "/"
   ],
-  "_resolved": "https://registry.npmjs.org/todomvc-app-css/-/todomvc-app-css-1.0.4.tgz",
-  "_shasum": "d2529279a6da5befb06b55c0c324c5fcfd94d656",
-  "_shrinkwrap": null,
-  "_spec": "todomvc-app-css@^1.0.0",
-  "_where": "/Users/addyo/Desktop/Speedometer-a/resources/todomvc/dependency-examples/flight",
+  "_resolved": "https://registry.npmjs.org/todomvc-app-css/-/todomvc-app-css-2.1.0.tgz",
+  "_shasum": "b6f2716d339afa2e5f799347d2a48b05396242a5",
+  "_spec": "todomvc-app-css@^2.1.0",
+  "_where": "/Users/mathiasb/projects/WebKit/PerformanceTests/Speedometer/resources/todomvc/dependency-examples/flight/flight",
   "author": {
     "name": "Sindre Sorhus",
     "email": "sindresorhus@gmail.com",
   "bugs": {
     "url": "https://github.com/tastejs/todomvc-app-css/issues"
   },
-  "dependencies": {},
+  "bundleDependencies": false,
+  "deprecated": false,
   "description": "CSS for TodoMVC apps",
-  "devDependencies": {},
-  "directories": {},
-  "dist": {
-    "shasum": "d2529279a6da5befb06b55c0c324c5fcfd94d656",
-    "tarball": "https://registry.npmjs.org/todomvc-app-css/-/todomvc-app-css-1.0.4.tgz"
-  },
   "files": [
     "index.css"
   ],
-  "gitHead": "1e4e38884a35193eaf1808a5ba44421832867184",
-  "homepage": "https://github.com/tastejs/todomvc-app-css",
+  "homepage": "https://github.com/tastejs/todomvc-app-css#readme",
   "keywords": [
     "todomvc",
     "tastejs",
     "stylesheet"
   ],
   "license": "CC-BY-4.0",
-  "maintainers": [
-    {
-      "name": "sindresorhus",
-      "email": "sindresorhus@gmail.com"
-    },
-    {
-      "name": "addyosmani",
-      "email": "addyosmani@gmail.com"
-    },
-    {
-      "name": "passy",
-      "email": "phartig@rdrei.net"
-    },
-    {
-      "name": "stephenplusplus",
-      "email": "sawchuk@gmail.com"
-    }
-  ],
   "name": "todomvc-app-css",
-  "optionalDependencies": {},
-  "readme": "ERROR: No README data found!",
   "repository": {
     "type": "git",
     "url": "git+https://github.com/tastejs/todomvc-app-css.git"
   },
-  "scripts": {},
-  "version": "1.0.4"
+  "style": "index.css",
+  "version": "2.1.0"
 }
index 81e006b..e1676db 100644 (file)
@@ -21,7 +21,7 @@
                 }
             }
             return object;
-        }
+        };
 
         // By default, Underscore uses ERB-style template delimiters, change the
         // following template settings to use alternative delimiters.
index 89f9a8b..1710d89 100644 (file)
@@ -1,69 +1,40 @@
 {
-  "_args": [
-    [
-      {
-        "raw": "todomvc-common@^1.0.1",
-        "scope": null,
-        "escapedName": "todomvc-common",
-        "name": "todomvc-common",
-        "rawSpec": "^1.0.1",
-        "spec": ">=1.0.1 <2.0.0",
-        "type": "range"
-      },
-      "/Users/addyo/Desktop/Speedometer-a/resources/todomvc/dependency-examples/flight"
-    ]
-  ],
-  "_from": "todomvc-common@>=1.0.1 <2.0.0",
-  "_id": "todomvc-common@1.0.3",
-  "_inCache": true,
+  "_from": "todomvc-common@^1.0.4",
+  "_id": "todomvc-common@1.0.4",
+  "_inBundle": false,
+  "_integrity": "sha512-AA0Z4exovEqubhbZCrzzn9roVT4zvOncS319p2zIc4CsNe5B9TLL7Sei1NIV6d+WrgR5rOi+y0I9Y6GE7xgNOw==",
   "_location": "/todomvc-common",
-  "_nodeVersion": "7.1.0",
-  "_npmOperationalInternal": {
-    "host": "packages-18-east.internal.npmjs.com",
-    "tmp": "tmp/todomvc-common-1.0.3.tgz_1479276361227_0.51124880136922"
-  },
-  "_npmUser": {
-    "name": "sindresorhus",
-    "email": "sindresorhus@gmail.com"
-  },
-  "_npmVersion": "3.10.9",
   "_phantomChildren": {},
   "_requested": {
-    "raw": "todomvc-common@^1.0.1",
-    "scope": null,
-    "escapedName": "todomvc-common",
+    "type": "range",
+    "registry": true,
+    "raw": "todomvc-common@^1.0.4",
     "name": "todomvc-common",
-    "rawSpec": "^1.0.1",
-    "spec": ">=1.0.1 <2.0.0",
-    "type": "range"
+    "escapedName": "todomvc-common",
+    "rawSpec": "^1.0.4",
+    "saveSpec": null,
+    "fetchSpec": "^1.0.4"
   },
   "_requiredBy": [
     "/"
   ],
-  "_resolved": "https://registry.npmjs.org/todomvc-common/-/todomvc-common-1.0.3.tgz",
-  "_shasum": "cba1868109caa401b908ebf77794cc1014b74873",
-  "_shrinkwrap": null,
-  "_spec": "todomvc-common@^1.0.1",
-  "_where": "/Users/addyo/Desktop/Speedometer-a/resources/todomvc/dependency-examples/flight",
+  "_resolved": "https://registry.npmjs.org/todomvc-common/-/todomvc-common-1.0.4.tgz",
+  "_shasum": "23099af886c2f0525bfd4537e078f12d0074309e",
+  "_spec": "todomvc-common@^1.0.4",
+  "_where": "/Users/mathiasb/projects/WebKit/PerformanceTests/Speedometer/resources/todomvc/dependency-examples/flight/flight",
   "author": {
     "name": "TasteJS"
   },
   "bugs": {
     "url": "https://github.com/tastejs/todomvc-common/issues"
   },
-  "dependencies": {},
+  "bundleDependencies": false,
+  "deprecated": false,
   "description": "Common TodoMVC utilities used by our apps",
-  "devDependencies": {},
-  "directories": {},
-  "dist": {
-    "shasum": "cba1868109caa401b908ebf77794cc1014b74873",
-    "tarball": "https://registry.npmjs.org/todomvc-common/-/todomvc-common-1.0.3.tgz"
-  },
   "files": [
     "base.js",
     "base.css"
   ],
-  "gitHead": "e7425bafb9561d766b769844810e0496734ffe8c",
   "homepage": "https://github.com/tastejs/todomvc-common#readme",
   "keywords": [
     "todomvc",
   ],
   "license": "MIT",
   "main": "base.js",
-  "maintainers": [
-    {
-      "name": "sindresorhus",
-      "email": "sindresorhus@gmail.com"
-    },
-    {
-      "name": "addyosmani",
-      "email": "addyosmani@gmail.com"
-    },
-    {
-      "name": "passy",
-      "email": "phartig@rdrei.net"
-    },
-    {
-      "name": "stephenplusplus",
-      "email": "sawchuk@gmail.com"
-    }
-  ],
   "name": "todomvc-common",
-  "optionalDependencies": {},
-  "readme": "ERROR: No README data found!",
   "repository": {
     "type": "git",
     "url": "git+https://github.com/tastejs/todomvc-common.git"
   },
-  "scripts": {},
   "style": "base.css",
-  "version": "1.0.3"
+  "version": "1.0.4"
 }
index 846784d..ae19004 100644 (file)
@@ -7,7 +7,7 @@
                "jquery": "^2.1.0",
                "requirejs": "^2.1.15",
                "requirejs-text": "^2.0.12",
-               "todomvc-app-css": "^1.0.0",
-               "todomvc-common": "^1.0.1"
+               "todomvc-app-css": "^2.1.0",
+               "todomvc-common": "^1.0.4"
        }
-}
\ No newline at end of file
+}
index 10e3d2f..e04fbdb 100644 (file)
@@ -112,28 +112,32 @@ body {
     border-top: 1px solid #e6e6e6;
 }
 
-label[for='toggle-all'] {
-    display: none;
-}
-
 .toggle-all {
+    text-align: center;
+    border: none; /* Mobile Safari */
+    opacity: 0;
     position: absolute;
-    top: -55px;
-    left: -12px;
+}
+
+.toggle-all + label {
     width: 60px;
     height: 34px;
-    text-align: center;
-    border: none; /* Mobile Safari */
+    font-size: 0;
+    position: absolute;
+    top: -52px;
+    left: -13px;
+    -webkit-transform: rotate(90deg);
+    transform: rotate(90deg);
 }
 
-.toggle-all:before {
+.toggle-all + label:before {
     content: '❯';
     font-size: 22px;
     color: #e6e6e6;
     padding: 10px 27px 10px 27px;
 }
 
-.toggle-all:checked:before {
+.toggle-all:checked + label:before {
     color: #737373;
 }
 
@@ -183,18 +187,27 @@ label[for='toggle-all'] {
     appearance: none;
 }
 
-.todo-list li .toggle:after {
-    content: url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" width="40" height="40" viewBox="-10 -18 100 135"><circle cx="50" cy="50" r="50" fill="none" stroke="#ededed" stroke-width="3"/></svg>');
+.todo-list li .toggle {
+    opacity: 0;
 }
 
-.todo-list li .toggle:checked:after {
-    content: url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" width="40" height="40" viewBox="-10 -18 100 135"><circle cx="50" cy="50" r="50" fill="none" stroke="#bddad5" stroke-width="3"/><path fill="#5dc2af" d="M72 25L42 71 27 56l-4 4 20 20 34-52z"/></svg>');
+.todo-list li .toggle + label {
+    /*
+        Firefox requires `#` to be escaped - https://bugzilla.mozilla.org/show_bug.cgi?id=922433
+        IE and Edge requires *everything* to be escaped to render, so we do that instead of just the `#` - https://developer.microsoft.com/en-us/microsoft-edge/platform/issues/7157459/
+    */
+    background-image: url('data:image/svg+xml;utf8,%3Csvg%20xmlns%3D%22http%3A//www.w3.org/2000/svg%22%20width%3D%2240%22%20height%3D%2240%22%20viewBox%3D%22-10%20-18%20100%20135%22%3E%3Ccircle%20cx%3D%2250%22%20cy%3D%2250%22%20r%3D%2250%22%20fill%3D%22none%22%20stroke%3D%22%23ededed%22%20stroke-width%3D%223%22/%3E%3C/svg%3E');
+    background-repeat: no-repeat;
+    background-position: center left;
+}
+
+.todo-list li .toggle:checked + label {
+    background-image: url('data:image/svg+xml;utf8,%3Csvg%20xmlns%3D%22http%3A//www.w3.org/2000/svg%22%20width%3D%2240%22%20height%3D%2240%22%20viewBox%3D%22-10%20-18%20100%20135%22%3E%3Ccircle%20cx%3D%2250%22%20cy%3D%2250%22%20r%3D%2250%22%20fill%3D%22none%22%20stroke%3D%22%23bddad5%22%20stroke-width%3D%223%22/%3E%3Cpath%20fill%3D%22%235dc2af%22%20d%3D%22M72%2025L42%2071%2027%2056l-4%204%2020%2020%2034-52z%22/%3E%3C/svg%3E');
 }
 
 .todo-list li label {
     word-break: break-all;
-    padding: 15px 60px 15px 15px;
-    margin-left: 45px;
+    padding: 15px 15px 15px 60px;
     display: block;
     line-height: 1.2;
     transition: color 0.4s;
@@ -350,13 +363,6 @@ html .clear-completed:active {
     .todo-list li .toggle {
         height: 40px;
     }
-
-    .toggle-all {
-        -webkit-transform: rotate(90deg);
-        transform: rotate(90deg);
-        -webkit-appearance: none;
-        appearance: none;
-    }
 }
 
 @media (max-width: 430px) {
index 81e006b..e1676db 100644 (file)
@@ -21,7 +21,7 @@
                 }
             }
             return object;
-        }
+        };
 
         // By default, Underscore uses ERB-style template delimiters, change the
         // following template settings to use alternative delimiters.
index 0f17aec..7e58330 100644 (file)
@@ -1,7 +1,7 @@
 {
   "private": true,
   "dependencies": {
-    "todomvc-app-css": "^2.0.6",
-    "todomvc-common": "^1.0.2"
+    "todomvc-app-css": "^2.1.0",
+    "todomvc-common": "^1.0.4"
   }
 }
@@ -1,2 +1,2 @@
-webpackJsonp([0,2],[function(t,e,i){"use strict";function o(t,e){return(e||document).querySelector(t)}function n(t,e){return(e||document).querySelectorAll(t)}function r(t,e,i,o){t.addEventListener(e,i,!!o)}function c(t,e,i,o){function c(i){var r=i.target,c=n(e,t),l=Array.prototype.indexOf.call(c,r)>=0;l&&o.call(r,i)}var l="blur"===i||"focus"===i;r(t,i,c,l)}function l(t,e){if(t.parentNode)return t.parentNode.tagName.toLowerCase()===e.toLowerCase()?t.parentNode:l(t.parentNode,e)}function a(t,e){var i=t.indexOf(e);return i===-1?t:void t.splice(i,1)}i.d(e,"a",function(){return o}),i.d(e,"b",function(){return n}),i.d(e,"d",function(){return r}),i.d(e,"c",function(){return c}),i.d(e,"e",function(){return l}),i.d(e,"f",function(){return a}),NodeList.prototype.forEach=Array.prototype.forEach},,function(t,e,i){"use strict";function o(){i.i(c.a)()}var n=i(1),r=(i.n(n),i(10)),c=(i.n(r),i(0),i(8));e.a=o},function(t,e,i){"use strict";function o(t,e){var i=this;i.model=t,i.view=e,i.view.bind("newTodo",function(t){i.addItem(t)}),i.view.bind("itemEdit",function(t){i.editItem(t.id)}),i.view.bind("itemEditDone",function(t){i.editItemSave(t.id,t.title)}),i.view.bind("itemEditCancel",function(t){i.editItemCancel(t.id)}),i.view.bind("itemRemove",function(t){i.removeItem(t.id)}),i.view.bind("itemToggle",function(t){i.toggleComplete(t.id,t.completed)}),i.view.bind("removeCompleted",function(){i.removeCompletedItems()}),i.view.bind("toggleAll",function(t){i.toggleAll(t.completed)})}e.a=o,o.prototype.setView=function(t){var e=t.split("/")[1],i=e||"";this._updateFilterState(i)},o.prototype.showAll=function(){var t=this;t.model.read(function(e){t.view.render("showEntries",e)})},o.prototype.showActive=function(){var t=this;t.model.read({completed:!1},function(e){t.view.render("showEntries",e)})},o.prototype.showCompleted=function(){var t=this;t.model.read({completed:!0},function(e){t.view.render("showEntries",e)})},o.prototype.addItem=function(t){var e=this;""!==t.trim()&&e.model.create(t,function(){e.view.render("clearNewTodo"),e._filter(!0)})},o.prototype.editItem=function(t){var e=this;e.model.read(t,function(i){e.view.render("editItem",{id:t,title:i[0].title})})},o.prototype.editItemSave=function(t,e){var i=this;e.trim()?i.model.update(t,{title:e},function(){i.view.render("editItemDone",{id:t,title:e})}):i.removeItem(t)},o.prototype.editItemCancel=function(t){var e=this;e.model.read(t,function(i){e.view.render("editItemDone",{id:t,title:i[0].title})})},o.prototype.removeItem=function(t){var e=this;e.model.remove(t,function(){e.view.render("removeItem",t)}),e._filter()},o.prototype.removeCompletedItems=function(){var t=this;t.model.read({completed:!0},function(e){e.forEach(function(e){t.removeItem(e.id)})}),t._filter()},o.prototype.toggleComplete=function(t,e,i){var o=this;o.model.update(t,{completed:e},function(){o.view.render("elementComplete",{id:t,completed:e})}),i||o._filter()},o.prototype.toggleAll=function(t){var e=this;e.model.read({completed:!t},function(i){i.forEach(function(i){e.toggleComplete(i.id,t,!0)})}),e._filter()},o.prototype._updateCount=function(){var t=this;t.model.getCount(function(e){t.view.render("updateElementCount",e.active),t.view.render("clearCompletedButton",{completed:e.completed,visible:e.completed>0}),t.view.render("toggleAll",{checked:e.completed===e.total}),t.view.render("contentBlockVisibility",{visible:e.total>0})})},o.prototype._filter=function(t){var e=this._activeRoute.charAt(0).toUpperCase()+this._activeRoute.substr(1);this._updateCount(),(t||"All"!==this._lastActiveRoute||this._lastActiveRoute!==e)&&this["show"+e](),this._lastActiveRoute=e},o.prototype._updateFilterState=function(t){t=t.split("?")[0],this._activeRoute=t,""===t&&(this._activeRoute="All"),this._filter(),this.view.render("setFilter",t)}},function(t,e,i){var o="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t};!function(i){var n={},r={};n.length=0,n.getItem=function(t){return r[t]||null},n.setItem=function(t,e){"undefined"==typeof e?n.removeItem(t):(r.hasOwnProperty(t)||n.length++,r[t]=""+e)},n.removeItem=function(t){r.hasOwnProperty(t)&&(delete r[t],n.length--)},n.key=function(t){return Object.keys(r)[t]||null},n.clear=function(){r={},n.length=0},"object"===o(e)?t.exports=n:i.localStorageMemory=n}(this)},function(t,e,i){"use strict";function o(t){this.storage=t}var n="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t};e.a=o,o.prototype.create=function(t,e){t=t||"",e=e||function(){};var i={title:t.trim(),completed:!1};this.storage.save(i,e)},o.prototype.read=function(t,e){var i="undefined"==typeof t?"undefined":n(t);return e=e||function(){},"function"===i?(e=t,this.storage.findAll(e)):void("string"===i||"number"===i?(t=parseInt(t,10),this.storage.find({id:t},e)):this.storage.find(t,e))},o.prototype.update=function(t,e,i){this.storage.save(e,i,t)},o.prototype.remove=function(t,e){this.storage.remove(t,e)},o.prototype.removeAll=function(t){this.storage.drop(t)},o.prototype.getCount=function(t){var e={active:0,completed:0,total:0};this.storage.findAll(function(i){i.forEach(function(t){t.completed?e.completed++:e.active++,e.total++}),t(e)})}},function(t,e,i){"use strict";function o(t,e){if(e=e||function(){},this._dbName=t,!r[t]){var i={todos:[]};r[t]=JSON.stringify(i)}e.call(this,JSON.parse(r[t])),this.subscribers=[]}var n=i(0),r=i(4);i.n(r);e.a=o;var c=0;o.prototype.subscribe=function(t){var e=this;return this.subscribers.push(t),function(){return i.i(n.f)(e.subscribers,t)}},o.prototype._notify=function(){this.subscribers.forEach(function(t){return t()})},o.prototype.find=function(t,e){if(e){var i=JSON.parse(r[this._dbName]).todos;e.call(this,i.filter(function(e){for(var i in t)if(t[i]!==e[i])return!1;return!0}))}},o.prototype.findAll=function(t){t=t||function(){},t.call(this,JSON.parse(r[this._dbName]).todos)},o.prototype.save=function(t,e,i){var o=JSON.parse(r[this._dbName]),n=o.todos;if(e=e||function(){},i){for(var l=0;l<n.length;l++)if(n[l].id===i){for(var a in t)n[l][a]=t[a];break}r[this._dbName]=JSON.stringify(o),e.call(this,JSON.parse(r[this._dbName]).todos)}else t.id=c++,n.push(t),r[this._dbName]=JSON.stringify(o),e.call(this,[t]);this._notify()},o.prototype.remove=function(t,e){for(var i=JSON.parse(r[this._dbName]),o=i.todos,n=0;n<o.length;n++)if(o[n].id===t){o.splice(n,1);break}r[this._dbName]=JSON.stringify(i),e.call(this,JSON.parse(r[this._dbName]).todos),this._notify()},o.prototype.drop=function(t){r[this._dbName]=JSON.stringify({todos:[]}),t.call(this,JSON.parse(r[this._dbName]).todos),this._notify()}},function(t,e,i){"use strict";function o(){this.defaultTemplate='\n    <li data-id="{{id}}" class="{{completed}}">\n      <div class="view">\n        <input class="toggle" type="checkbox" {{checked}} />\n        <label>{{title}}</label>\n        <button class="destroy"></button>\n      </div>\n    </li>\n  '}e.a=o;var n={"&":"&amp;","<":"&lt;",">":"&gt;",'"':"&quot;","'":"&#x27;","`":"&#x60;"},r=function(t){return n[t]},c=/[&<>"'`]/g,l=new RegExp(c.source),a=function(t){return t&&l.test(t)?t.replace(c,r):t};o.prototype.show=function(t){var e,i,o="";for(e=0,i=t.length;e<i;e++){var n=this.defaultTemplate,r="",c="";t[e].completed&&(r="completed",c="checked"),n=n.replace("{{id}}",t[e].id),n=n.replace("{{title}}",a(t[e].title)),n=n.replace("{{completed}}",r),n=n.replace("{{checked}}",c),o+=n}return o},o.prototype.itemCounter=function(t){var e=1===t?"":"s";return"<strong>"+t+"</strong> item"+e+" left"},o.prototype.clearCompletedButton=function(t){return t>0?"Clear completed":""}},function(t,e,i){"use strict";function o(t){this.storage=new a.a(t),this.model=new l.a(this.storage),this.template=new d.a,this.view=new r.a(this.template),this.controller=new c.a(this.model,this.view)}function n(){s=new o("todos-vanillajs"),s.controller.setView(document.location.hash),u.forEach(function(t){return t()})}var r=i(9),c=i(3),l=i(5),a=i(6),d=i(7);i(0);i.d(e,"a",function(){return n});var s=void 0,u=[]},function(t,e,i){"use strict";function o(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function n(t){i.i(a.a)(".filters .selected").className="",i.i(a.a)('.filters [href="#/'+t+'"]').className="selected"}function r(t,e){var o=i.i(a.a)('[data-id="'+t+'"]');o&&(o.className=e?"completed":"",i.i(a.a)("input",o).checked=e)}function c(t,e){var o=i.i(a.a)('[data-id="'+t+'"]');if(o){o.className=o.className+" editing";var n=document.createElement("input");n.className="edit",o.appendChild(n),n.focus(),n.value=e}}function l(t){var e=i.i(a.e)(t,"li");return parseInt(e.dataset.id,10)}var a=i(0),d=function(){function t(t,e){for(var i=0;i<e.length;i++){var o=e[i];o.enumerable=o.enumerable||!1,o.configurable=!0,"value"in o&&(o.writable=!0),Object.defineProperty(t,o.key,o)}}return function(e,i,o){return i&&t(e.prototype,i),o&&t(e,o),e}}(),s=function(){function t(e){o(this,t),this.template=e,this.ENTER_KEY=13,this.ESCAPE_KEY=27,this.$todoList=i.i(a.a)(".todo-list"),this.$todoItemCounter=i.i(a.a)(".todo-count"),this.$clearCompleted=i.i(a.a)(".clear-completed"),this.$main=i.i(a.a)(".main"),this.$footer=i.i(a.a)(".footer"),this.$toggleAll=i.i(a.a)(".toggle-all"),this.$newTodo=i.i(a.a)(".new-todo")}return d(t,[{key:"_removeItem",value:function(t){var e=i.i(a.a)('[data-id="'+t+'"]');e&&this.$todoList.removeChild(e)}},{key:"_clearCompletedButton",value:function(t,e){this.$clearCompleted.innerHTML=this.template.clearCompletedButton(t),this.$clearCompleted.style.display=e?"block":"none"}},{key:"_editItemDone",value:function(t,e){var o=i.i(a.a)('[data-id="'+t+'"]');if(o){var n=i.i(a.a)("input.edit",o);o.removeChild(n),o.className=o.className.replace("editing",""),i.i(a.b)("label",o).forEach(function(t){t.textContent=e})}}},{key:"render",value:function(t,e){var i=this,o={showEntries:function(){i.$todoList.innerHTML=i.template.show(e)},removeItem:function(){i._removeItem(e)},updateElementCount:function(){i.$todoItemCounter.innerHTML=i.template.itemCounter(e)},clearCompletedButton:function(){i._clearCompletedButton(e.completed,e.visible)},contentBlockVisibility:function(){i.$main.style.display=i.$footer.style.display=e.visible?"block":"none"},toggleAll:function(){i.$toggleAll.checked=e.checked},setFilter:function(){n(e)},clearNewTodo:function(){i.$newTodo.value=""},elementComplete:function(){r(e.id,e.completed)},editItem:function(){c(e.id,e.title)},editItemDone:function(){i._editItemDone(e.id,e.title)}};o[t]()}},{key:"_bindItemEditDone",value:function(t){var e=this;i.i(a.c)(e.$todoList,"li .edit","blur",function(){this.dataset.iscanceled||t({id:l(this),title:this.value})}),i.i(a.c)(e.$todoList,"li .edit","keypress",function(t){t.keyCode===e.ENTER_KEY&&this.blur()})}},{key:"_bindItemEditCancel",value:function(t){var e=this;i.i(a.c)(e.$todoList,"li .edit","keyup",function(i){i.keyCode===e.ESCAPE_KEY&&(this.dataset.iscanceled=!0,this.blur(),t({id:l(this)}))})}},{key:"bind",value:function(t,e){var o=this;"newTodo"===t?i.i(a.d)(o.$newTodo,"change",function(){e(o.$newTodo.value)}):"removeCompleted"===t?i.i(a.d)(o.$clearCompleted,"click",function(){e()}):"toggleAll"===t?i.i(a.d)(o.$toggleAll,"click",function(){e({completed:this.checked})}):"itemEdit"===t?i.i(a.c)(o.$todoList,"li label","dblclick",function(){e({id:l(this)})}):"itemRemove"===t?i.i(a.c)(o.$todoList,".destroy","click",function(){e({id:l(this)})}):"itemToggle"===t?i.i(a.c)(o.$todoList,".toggle","click",function(){e({id:l(this),completed:this.checked})}):"itemEditDone"===t?o._bindItemEditDone(e):"itemEditCancel"===t&&o._bindItemEditCancel(e)}}]),t}();e.a=s},function(t,e){},function(t,e,i){"use strict";function o(){i.i(r.d)(window,"load",n.a),i.i(r.d)(window,"hashchange",n.a)}var n=i(2),r=i(0);"complete"===document.readyState;o()}],[11]);
-//# sourceMappingURL=bundle.app.71bb1f671e4e65604d05.js.map
\ No newline at end of file
+webpackJsonp([0,2],[function(t,e,i){"use strict";function o(t,e){return(e||document).querySelector(t)}function n(t,e){return(e||document).querySelectorAll(t)}function r(t,e,i,o){t.addEventListener(e,i,!!o)}function c(t,e,i,o){function c(i){var r=i.target,c=n(e,t),l=Array.prototype.indexOf.call(c,r)>=0;l&&o.call(r,i)}var l="blur"===i||"focus"===i;r(t,i,c,l)}function l(t,e){if(t.parentNode)return t.parentNode.tagName.toLowerCase()===e.toLowerCase()?t.parentNode:l(t.parentNode,e)}function a(t,e){var i=t.indexOf(e);return i===-1?t:void t.splice(i,1)}i.d(e,"a",function(){return o}),i.d(e,"b",function(){return n}),i.d(e,"d",function(){return r}),i.d(e,"c",function(){return c}),i.d(e,"e",function(){return l}),i.d(e,"f",function(){return a}),NodeList.prototype.forEach=Array.prototype.forEach},,function(t,e,i){"use strict";function o(){i.i(c.a)()}var n=i(1),r=(i.n(n),i(10)),c=(i.n(r),i(0),i(8));e.a=o},function(t,e,i){"use strict";function o(t,e){var i=this;i.model=t,i.view=e,i.view.bind("newTodo",function(t){i.addItem(t)}),i.view.bind("itemEdit",function(t){i.editItem(t.id)}),i.view.bind("itemEditDone",function(t){i.editItemSave(t.id,t.title)}),i.view.bind("itemEditCancel",function(t){i.editItemCancel(t.id)}),i.view.bind("itemRemove",function(t){i.removeItem(t.id)}),i.view.bind("itemToggle",function(t){i.toggleComplete(t.id,t.completed)}),i.view.bind("removeCompleted",function(){i.removeCompletedItems()}),i.view.bind("toggleAll",function(t){i.toggleAll(t.completed)})}e.a=o,o.prototype.setView=function(t){var e=t.split("/")[1],i=e||"";this._updateFilterState(i)},o.prototype.showAll=function(){var t=this;t.model.read(function(e){t.view.render("showEntries",e)})},o.prototype.showActive=function(){var t=this;t.model.read({completed:!1},function(e){t.view.render("showEntries",e)})},o.prototype.showCompleted=function(){var t=this;t.model.read({completed:!0},function(e){t.view.render("showEntries",e)})},o.prototype.addItem=function(t){var e=this;""!==t.trim()&&e.model.create(t,function(){e.view.render("clearNewTodo"),e._filter(!0)})},o.prototype.editItem=function(t){var e=this;e.model.read(t,function(i){e.view.render("editItem",{id:t,title:i[0].title})})},o.prototype.editItemSave=function(t,e){var i=this;e.trim()?i.model.update(t,{title:e},function(){i.view.render("editItemDone",{id:t,title:e})}):i.removeItem(t)},o.prototype.editItemCancel=function(t){var e=this;e.model.read(t,function(i){e.view.render("editItemDone",{id:t,title:i[0].title})})},o.prototype.removeItem=function(t){var e=this;e.model.remove(t,function(){e.view.render("removeItem",t)}),e._filter()},o.prototype.removeCompletedItems=function(){var t=this;t.model.read({completed:!0},function(e){e.forEach(function(e){t.removeItem(e.id)})}),t._filter()},o.prototype.toggleComplete=function(t,e,i){var o=this;o.model.update(t,{completed:e},function(){o.view.render("elementComplete",{id:t,completed:e})}),i||o._filter()},o.prototype.toggleAll=function(t){var e=this;e.model.read({completed:!t},function(i){i.forEach(function(i){e.toggleComplete(i.id,t,!0)})}),e._filter()},o.prototype._updateCount=function(){var t=this;t.model.getCount(function(e){t.view.render("updateElementCount",e.active),t.view.render("clearCompletedButton",{completed:e.completed,visible:e.completed>0}),t.view.render("toggleAll",{checked:e.completed===e.total}),t.view.render("contentBlockVisibility",{visible:e.total>0})})},o.prototype._filter=function(t){var e=this._activeRoute.charAt(0).toUpperCase()+this._activeRoute.substr(1);this._updateCount(),(t||"All"!==this._lastActiveRoute||this._lastActiveRoute!==e)&&this["show"+e](),this._lastActiveRoute=e},o.prototype._updateFilterState=function(t){t=t.split("?")[0],this._activeRoute=t,""===t&&(this._activeRoute="All"),this._filter(),this.view.render("setFilter",t)}},function(t,e,i){var o="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t};!function(i){var n={},r={};n.length=0,n.getItem=function(t){return r[t]||null},n.setItem=function(t,e){"undefined"==typeof e?n.removeItem(t):(r.hasOwnProperty(t)||n.length++,r[t]=""+e)},n.removeItem=function(t){r.hasOwnProperty(t)&&(delete r[t],n.length--)},n.key=function(t){return Object.keys(r)[t]||null},n.clear=function(){r={},n.length=0},"object"===o(e)?t.exports=n:i.localStorageMemory=n}(this)},function(t,e,i){"use strict";function o(t){this.storage=t}var n="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t};e.a=o,o.prototype.create=function(t,e){t=t||"",e=e||function(){};var i={title:t.trim(),completed:!1};this.storage.save(i,e)},o.prototype.read=function(t,e){var i="undefined"==typeof t?"undefined":n(t);return e=e||function(){},"function"===i?(e=t,this.storage.findAll(e)):void("string"===i||"number"===i?(t=parseInt(t,10),this.storage.find({id:t},e)):this.storage.find(t,e))},o.prototype.update=function(t,e,i){this.storage.save(e,i,t)},o.prototype.remove=function(t,e){this.storage.remove(t,e)},o.prototype.removeAll=function(t){this.storage.drop(t)},o.prototype.getCount=function(t){var e={active:0,completed:0,total:0};this.storage.findAll(function(i){i.forEach(function(t){t.completed?e.completed++:e.active++,e.total++}),t(e)})}},function(t,e,i){"use strict";function o(t,e){if(e=e||function(){},this._dbName=t,!r[t]){var i={todos:[]};r[t]=JSON.stringify(i)}e.call(this,JSON.parse(r[t])),this.subscribers=[]}var n=i(0),r=i(4);i.n(r);e.a=o;var c=1;o.prototype.subscribe=function(t){var e=this;return this.subscribers.push(t),function(){return i.i(n.f)(e.subscribers,t)}},o.prototype._notify=function(){this.subscribers.forEach(function(t){return t()})},o.prototype.find=function(t,e){if(e){var i=JSON.parse(r[this._dbName]).todos;e.call(this,i.filter(function(e){for(var i in t)if(t[i]!==e[i])return!1;return!0}))}},o.prototype.findAll=function(t){t=t||function(){},t.call(this,JSON.parse(r[this._dbName]).todos)},o.prototype.save=function(t,e,i){var o=JSON.parse(r[this._dbName]),n=o.todos;if(e=e||function(){},i){for(var l=0;l<n.length;l++)if(n[l].id===i){for(var a in t)n[l][a]=t[a];break}r[this._dbName]=JSON.stringify(o),e.call(this,JSON.parse(r[this._dbName]).todos)}else t.id=c++,n.push(t),r[this._dbName]=JSON.stringify(o),e.call(this,[t]);this._notify()},o.prototype.remove=function(t,e){for(var i=JSON.parse(r[this._dbName]),o=i.todos,n=0;n<o.length;n++)if(o[n].id===t){o.splice(n,1);break}r[this._dbName]=JSON.stringify(i),e.call(this,JSON.parse(r[this._dbName]).todos),this._notify()},o.prototype.drop=function(t){r[this._dbName]=JSON.stringify({todos:[]}),t.call(this,JSON.parse(r[this._dbName]).todos),this._notify()}},function(t,e,i){"use strict";function o(){this.defaultTemplate='\n    <li data-id="{{id}}" class="{{completed}}">\n      <div class="view">\n        <input class="toggle" type="checkbox" {{checked}} />\n        <label>{{title}}</label>\n        <button class="destroy"></button>\n      </div>\n    </li>\n  '}e.a=o;var n={"&":"&amp;","<":"&lt;",">":"&gt;",'"':"&quot;","'":"&#x27;","`":"&#x60;"},r=function(t){return n[t]},c=/[&<>"'`]/g,l=new RegExp(c.source),a=function(t){return t&&l.test(t)?t.replace(c,r):t};o.prototype.show=function(t){var e,i,o="";for(e=0,i=t.length;e<i;e++){var n=this.defaultTemplate,r="",c="";t[e].completed&&(r="completed",c="checked"),n=n.replace("{{id}}",t[e].id),n=n.replace("{{title}}",a(t[e].title)),n=n.replace("{{completed}}",r),n=n.replace("{{checked}}",c),o+=n}return o},o.prototype.itemCounter=function(t){var e=1===t?"":"s";return"<strong>"+t+"</strong> item"+e+" left"},o.prototype.clearCompletedButton=function(t){return t>0?"Clear completed":""}},function(t,e,i){"use strict";function o(t){this.storage=new a.a(t),this.model=new l.a(this.storage),this.template=new d.a,this.view=new r.a(this.template),this.controller=new c.a(this.model,this.view)}function n(){s=new o("todos-vanillajs"),s.controller.setView(document.location.hash),u.forEach(function(t){return t()})}var r=i(9),c=i(3),l=i(5),a=i(6),d=i(7);i(0);i.d(e,"a",function(){return n});var s=void 0,u=[]},function(t,e,i){"use strict";function o(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function n(t){i.i(a.a)(".filters .selected").className="",i.i(a.a)('.filters [href="#/'+t+'"]').className="selected"}function r(t,e){var o=i.i(a.a)('[data-id="'+t+'"]');o&&(o.className=e?"completed":"",i.i(a.a)("input",o).checked=e)}function c(t,e){var o=i.i(a.a)('[data-id="'+t+'"]');if(o){o.className=o.className+" editing";var n=document.createElement("input");n.className="edit",o.appendChild(n),n.focus(),n.value=e}}function l(t){var e=i.i(a.e)(t,"li");return parseInt(e.dataset.id,10)}var a=i(0),d=function(){function t(t,e){for(var i=0;i<e.length;i++){var o=e[i];o.enumerable=o.enumerable||!1,o.configurable=!0,"value"in o&&(o.writable=!0),Object.defineProperty(t,o.key,o)}}return function(e,i,o){return i&&t(e.prototype,i),o&&t(e,o),e}}(),s=function(){function t(e){o(this,t),this.template=e,this.ENTER_KEY=13,this.ESCAPE_KEY=27,this.$todoList=i.i(a.a)(".todo-list"),this.$todoItemCounter=i.i(a.a)(".todo-count"),this.$clearCompleted=i.i(a.a)(".clear-completed"),this.$main=i.i(a.a)(".main"),this.$footer=i.i(a.a)(".footer"),this.$toggleAll=i.i(a.a)(".toggle-all"),this.$newTodo=i.i(a.a)(".new-todo")}return d(t,[{key:"_removeItem",value:function(t){var e=i.i(a.a)('[data-id="'+t+'"]');e&&this.$todoList.removeChild(e)}},{key:"_clearCompletedButton",value:function(t,e){this.$clearCompleted.innerHTML=this.template.clearCompletedButton(t),this.$clearCompleted.style.display=e?"block":"none"}},{key:"_editItemDone",value:function(t,e){var o=i.i(a.a)('[data-id="'+t+'"]');if(o){var n=i.i(a.a)("input.edit",o);o.removeChild(n),o.className=o.className.replace("editing",""),i.i(a.b)("label",o).forEach(function(t){t.textContent=e})}}},{key:"render",value:function(t,e){var i=this,o={showEntries:function(){i.$todoList.innerHTML=i.template.show(e)},removeItem:function(){i._removeItem(e)},updateElementCount:function(){i.$todoItemCounter.innerHTML=i.template.itemCounter(e)},clearCompletedButton:function(){i._clearCompletedButton(e.completed,e.visible)},contentBlockVisibility:function(){i.$main.style.display=i.$footer.style.display=e.visible?"block":"none"},toggleAll:function(){i.$toggleAll.checked=e.checked},setFilter:function(){n(e)},clearNewTodo:function(){i.$newTodo.value=""},elementComplete:function(){r(e.id,e.completed)},editItem:function(){c(e.id,e.title)},editItemDone:function(){i._editItemDone(e.id,e.title)}};o[t]()}},{key:"_bindItemEditDone",value:function(t){var e=this;i.i(a.c)(e.$todoList,"li .edit","blur",function(){this.dataset.iscanceled||t({id:l(this),title:this.value})}),i.i(a.c)(e.$todoList,"li .edit","keypress",function(t){t.keyCode===e.ENTER_KEY&&this.blur()})}},{key:"_bindItemEditCancel",value:function(t){var e=this;i.i(a.c)(e.$todoList,"li .edit","keyup",function(i){i.keyCode===e.ESCAPE_KEY&&(this.dataset.iscanceled=!0,this.blur(),t({id:l(this)}))})}},{key:"bind",value:function(t,e){var o=this;"newTodo"===t?i.i(a.d)(o.$newTodo,"change",function(){e(o.$newTodo.value)}):"removeCompleted"===t?i.i(a.d)(o.$clearCompleted,"click",function(){e()}):"toggleAll"===t?i.i(a.d)(o.$toggleAll,"click",function(){e({completed:this.checked})}):"itemEdit"===t?i.i(a.c)(o.$todoList,"li label","dblclick",function(){e({id:l(this)})}):"itemRemove"===t?i.i(a.c)(o.$todoList,".destroy","click",function(){e({id:l(this)})}):"itemToggle"===t?i.i(a.c)(o.$todoList,".toggle","click",function(){e({id:l(this),completed:this.checked})}):"itemEditDone"===t?o._bindItemEditDone(e):"itemEditCancel"===t&&o._bindItemEditCancel(e)}}]),t}();e.a=s},function(t,e){},function(t,e,i){"use strict";function o(){i.i(r.d)(window,"load",n.a),i.i(r.d)(window,"hashchange",n.a)}var n=i(2),r=i(0);"complete"===document.readyState;o()}],[11]);
+//# sourceMappingURL=bundle.app.930ad8b83126862d7445.js.map
\ No newline at end of file
@@ -1 +1 @@
-{"version":3,"sources":["webpack:///bundle.app.71bb1f671e4e65604d05.js","webpack:///./helpers.js","webpack:///./app.js","webpack:///./controller.js","webpack:///./memory.js","webpack:///./model.js","webpack:///./store.js","webpack:///./template.js","webpack:///./todo.js","webpack:///./view.js","webpack:///./bootstrap.js"],"names":["webpackJsonp","module","exports","__webpack_require__","qs","selector","scope","document","querySelector","qsa","querySelectorAll","$on","target","type","callback","useCapture","addEventListener","$delegate","handler","dispatchEvent","event","targetElement","potentialElements","hasMatch","Array","prototype","indexOf","call","$parent","element","tagName","parentNode","toLowerCase","remove","array","thing","index","splice","d","NodeList","forEach","onLoad","i","__WEBPACK_IMPORTED_MODULE_3__todo__","__WEBPACK_IMPORTED_MODULE_0_todomvc_app_css_index_css__","__WEBPACK_IMPORTED_MODULE_1__app_css__","n","Controller","model","view","that","this","bind","title","addItem","item","editItem","id","editItemSave","editItemCancel","removeItem","toggleComplete","completed","removeCompletedItems","status","toggleAll","setView","locationHash","route","split","page","_updateFilterState","showAll","read","data","render","showActive","showCompleted","trim","create","_filter","update","silent","_updateCount","getCount","todos","active","visible","checked","total","force","activeRoute","_activeRoute","charAt","toUpperCase","substr","_lastActiveRoute","currentPage","_typeof","Symbol","iterator","obj","constructor","root","localStorageMemory","cache","length","getItem","key","setItem","value","hasOwnProperty","Object","keys","clear","Model","storage","newItem","save","query","queryType","findAll","parseInt","find","removeAll","drop","todo","Store","name","_dbName","__WEBPACK_IMPORTED_MODULE_1__memory__","JSON","stringify","parse","subscribers","__WEBPACK_IMPORTED_MODULE_0__helpers__","uniqueID","subscribe","subscriber","_this","push","_notify","s","filter","q","updateData","Template","defaultTemplate","htmlEscapes","&","<",">","\"","'","`","escapeHtmlChar","chr","reUnescapedHtml","reHasUnescapedHtml","RegExp","source","escape","string","test","replace","show","l","template","itemCounter","activeTodos","plural","clearCompletedButton","completedTodos","Todo","__WEBPACK_IMPORTED_MODULE_3__store__","__WEBPACK_IMPORTED_MODULE_2__model__","__WEBPACK_IMPORTED_MODULE_4__template__","__WEBPACK_IMPORTED_MODULE_0__view__","controller","__WEBPACK_IMPORTED_MODULE_1__controller__","updateTodo","location","hash","_classCallCheck","instance","Constructor","TypeError","_setFilter","className","_elementComplete","listItem","_editItem","input","createElement","appendChild","focus","_itemId","li","dataset","_createClass","defineProperties","props","descriptor","enumerable","configurable","writable","defineProperty","protoProps","staticProps","View","ENTER_KEY","ESCAPE_KEY","$todoList","$todoItemCounter","$clearCompleted","$main","$footer","$toggleAll","$newTodo","elem","removeChild","completedCount","innerHTML","style","display","label","textContent","viewCmd","parameter","viewCommands","showEntries","_removeItem","updateElementCount","_clearCompletedButton","contentBlockVisibility","setFilter","clearNewTodo","elementComplete","editItemDone","_editItemDone","iscanceled","keyCode","blur","_bindItemEditDone","_bindItemEditCancel","bootstrap","__WEBPACK_IMPORTED_MODULE_1__helpers__","window","__WEBPACK_IMPORTED_MODULE_0__app__","readyState"],"mappings":"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","file":"bundle.app.71bb1f671e4e65604d05.js","sourcesContent":["webpackJsonp([0,2],[\n/* 0 */\n/***/ function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n/* harmony export */ __webpack_require__.d(exports, \"a\", function() { return qs; });\n/* harmony export */ __webpack_require__.d(exports, \"b\", function() { return qsa; });\n/* harmony export */ __webpack_require__.d(exports, \"d\", function() { return $on; });\n/* harmony export */ __webpack_require__.d(exports, \"c\", function() { return $delegate; });\n/* harmony export */ __webpack_require__.d(exports, \"e\", function() { return $parent; });\n/* harmony export */ __webpack_require__.d(exports, \"f\", function() { return remove; });\n\n// Get element(s) by CSS selector:\nfunction qs(selector, scope) {\n  return (scope || document).querySelector(selector);\n}\n\nfunction qsa(selector, scope) {\n  return (scope || document).querySelectorAll(selector);\n}\n\n// addEventListener wrapper:\nfunction $on(target, type, callback, useCapture) {\n  target.addEventListener(type, callback, !!useCapture);\n}\n\n// Attach a handler to event for all elements that match the selector,\n// now or in the future, based on a root element\nfunction $delegate(target, selector, type, handler) {\n  // https://developer.mozilla.org/en-US/docs/Web/Events/blur\n  var useCapture = type === 'blur' || type === 'focus';\n  $on(target, type, dispatchEvent, useCapture);\n\n  function dispatchEvent(event) {\n    var targetElement = event.target;\n    var potentialElements = qsa(selector, target);\n    var hasMatch = Array.prototype.indexOf.call(potentialElements, targetElement) >= 0;\n\n    if (hasMatch) {\n      handler.call(targetElement, event);\n    }\n  }\n}\n\n// Find the element's parent with the given tag name:\n// $parent(qs('a'), 'div');\nfunction $parent(element, tagName) {\n  if (!element.parentNode) {\n    return undefined;\n  }\n  if (element.parentNode.tagName.toLowerCase() === tagName.toLowerCase()) {\n    return element.parentNode;\n  }\n  return $parent(element.parentNode, tagName);\n}\n\n// removes an element from an array\n// const x = [1,2,3]\n// remove(x, 2)\n// x ~== [1,3]\nfunction remove(array, thing) {\n  var index = array.indexOf(thing);\n  if (index === -1) {\n    return array;\n  }\n  array.splice(index, 1);\n}\n\n// Allow for looping on nodes by chaining:\n// qsa('.foo').forEach(function () {})\nNodeList.prototype.forEach = Array.prototype.forEach;\n\n/***/ },\n/* 1 */,\n/* 2 */\n/***/ function(module, exports, __webpack_require__) {\n\n\"use strict\";\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_todomvc_app_css_index_css__ = __webpack_require__(1);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_todomvc_app_css_index_css___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_0_todomvc_app_css_index_css__);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__app_css__ = __webpack_require__(10);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__app_css___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_1__app_css__);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__helpers__ = __webpack_require__(0);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__todo__ = __webpack_require__(8);\n/* harmony export */ exports[\"a\"] = onLoad;\n\n\n\n\n\nfunction onLoad() {\n  // eslint-disable-line import/prefer-default-export\n  __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_3__todo__[\"a\" /* updateTodo */])();\n}\n\n/***/ },\n/* 3 */\n/***/ function(module, exports, __webpack_require__) {\n\n\"use strict\";\n/* harmony default export */ exports[\"a\"] = Controller;\n\n/**\n* Takes a model and view and acts as the controller between them\n*\n* @constructor\n* @param {object} model The model instance\n* @param {object} view The view instance\n*/\nfunction Controller(model, view) {\n  var that = this;\n  that.model = model;\n  that.view = view;\n\n  that.view.bind('newTodo', function (title) {\n    that.addItem(title);\n  });\n\n  that.view.bind('itemEdit', function (item) {\n    that.editItem(item.id);\n  });\n\n  that.view.bind('itemEditDone', function (item) {\n    that.editItemSave(item.id, item.title);\n  });\n\n  that.view.bind('itemEditCancel', function (item) {\n    that.editItemCancel(item.id);\n  });\n\n  that.view.bind('itemRemove', function (item) {\n    that.removeItem(item.id);\n  });\n\n  that.view.bind('itemToggle', function (item) {\n    that.toggleComplete(item.id, item.completed);\n  });\n\n  that.view.bind('removeCompleted', function () {\n    that.removeCompletedItems();\n  });\n\n  that.view.bind('toggleAll', function (status) {\n    that.toggleAll(status.completed);\n  });\n}\n\n/**\n* Loads and initialises the view\n*\n* @param {string} '' | 'active' | 'completed'\n*/\nController.prototype.setView = function (locationHash) {\n  var route = locationHash.split('/')[1];\n  var page = route || '';\n  this._updateFilterState(page);\n};\n\n/**\n* An event to fire on load. Will get all items and display them in the\n* todo-list\n*/\nController.prototype.showAll = function () {\n  var that = this;\n  that.model.read(function (data) {\n    that.view.render('showEntries', data);\n  });\n};\n\n/**\n* Renders all active tasks\n*/\nController.prototype.showActive = function () {\n  var that = this;\n  that.model.read({ completed: false }, function (data) {\n    that.view.render('showEntries', data);\n  });\n};\n\n/**\n* Renders all completed tasks\n*/\nController.prototype.showCompleted = function () {\n  var that = this;\n  that.model.read({ completed: true }, function (data) {\n    that.view.render('showEntries', data);\n  });\n};\n\n/**\n* An event to fire whenever you want to add an item. Simply pass in the event\n* object and it'll handle the DOM insertion and saving of the new item.\n*/\nController.prototype.addItem = function (title) {\n  var that = this;\n\n  if (title.trim() === '') {\n    return;\n  }\n\n  that.model.create(title, function () {\n    that.view.render('clearNewTodo');\n    that._filter(true);\n  });\n};\n\n/*\n* Triggers the item editing mode.\n*/\nController.prototype.editItem = function (id) {\n  var that = this;\n  that.model.read(id, function (data) {\n    that.view.render('editItem', { id: id, title: data[0].title });\n  });\n};\n\n/*\n* Finishes the item editing mode successfully.\n*/\nController.prototype.editItemSave = function (id, title) {\n  var that = this;\n  if (title.trim()) {\n    that.model.update(id, { title: title }, function () {\n      that.view.render('editItemDone', { id: id, title: title });\n    });\n  } else {\n    that.removeItem(id);\n  }\n};\n\n/*\n* Cancels the item editing mode.\n*/\nController.prototype.editItemCancel = function (id) {\n  var that = this;\n  that.model.read(id, function (data) {\n    that.view.render('editItemDone', { id: id, title: data[0].title });\n  });\n};\n\n/**\n* By giving it an ID it'll find the DOM element matching that ID,\n* remove it from the DOM and also remove it from storage.\n*\n* @param {number} id The ID of the item to remove from the DOM and\n* storage\n*/\nController.prototype.removeItem = function (id) {\n  var that = this;\n  that.model.remove(id, function () {\n    that.view.render('removeItem', id);\n  });\n\n  that._filter();\n};\n\n/**\n* Will remove all completed items from the DOM and storage.\n*/\nController.prototype.removeCompletedItems = function () {\n  var that = this;\n  that.model.read({ completed: true }, function (data) {\n    data.forEach(function (item) {\n      that.removeItem(item.id);\n    });\n  });\n\n  that._filter();\n};\n\n/**\n* Give it an ID of a model and a checkbox and it will update the item\n* in storage based on the checkbox's state.\n*\n* @param {number} id The ID of the element to complete or uncomplete\n* @param {object} checkbox The checkbox to check the state of complete\n*                          or not\n* @param {boolean|undefined} silent Prevent re-filtering the todo items\n*/\nController.prototype.toggleComplete = function (id, completed, silent) {\n  var that = this;\n  that.model.update(id, { completed: completed }, function () {\n    that.view.render('elementComplete', {\n      id: id,\n      completed: completed\n    });\n  });\n\n  if (!silent) {\n    that._filter();\n  }\n};\n\n/**\n* Will toggle ALL checkboxes' on/off state and completeness of models.\n* Just pass in the event object.\n*/\nController.prototype.toggleAll = function (completed) {\n  var that = this;\n  that.model.read({ completed: !completed }, function (data) {\n    data.forEach(function (item) {\n      that.toggleComplete(item.id, completed, true);\n    });\n  });\n\n  that._filter();\n};\n\n/**\n* Updates the pieces of the page which change depending on the remaining\n* number of todos.\n*/\nController.prototype._updateCount = function () {\n  var that = this;\n  that.model.getCount(function (todos) {\n    that.view.render('updateElementCount', todos.active);\n    that.view.render('clearCompletedButton', {\n      completed: todos.completed,\n      visible: todos.completed > 0\n    });\n\n    that.view.render('toggleAll', { checked: todos.completed === todos.total });\n    that.view.render('contentBlockVisibility', { visible: todos.total > 0 });\n  });\n};\n\n/**\n* Re-filters the todo items, based on the active route.\n* @param {boolean|undefined} force  forces a re-painting of todo items.\n*/\nController.prototype._filter = function (force) {\n  var activeRoute = this._activeRoute.charAt(0).toUpperCase() + this._activeRoute.substr(1);\n\n  // Update the elements on the page, which change with each completed todo\n  this._updateCount();\n\n  // If the last active route isn't \"All\", or we're switching routes, we\n  // re-create the todo item elements, calling:\n  //   this.show[All|Active|Completed]();\n  if (force || this._lastActiveRoute !== 'All' || this._lastActiveRoute !== activeRoute) {\n    this['show' + activeRoute]();\n  }\n\n  this._lastActiveRoute = activeRoute;\n};\n\n/**\n* Simply updates the filter nav's selected states\n*/\nController.prototype._updateFilterState = function (currentPage) {\n  // Store a reference to the active route, allowing us to re-filter todo\n  // items as they are marked complete or incomplete.\n  currentPage = currentPage.split('?')[0];\n  this._activeRoute = currentPage;\n\n  if (currentPage === '') {\n    this._activeRoute = 'All';\n  }\n\n  this._filter();\n\n  this.view.render('setFilter', currentPage);\n};\n\n/***/ },\n/* 4 */\n/***/ function(module, exports, __webpack_require__) {\n\nvar _typeof = typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; };\n\n(function (root) {\n  var localStorageMemory = {};\n  var cache = {};\n\n  /**\n   * number of stored items.\n   */\n  localStorageMemory.length = 0;\n\n  /**\n   * returns item for passed key, or null\n   *\n   * @para {String} key\n   *       name of item to be returned\n   * @returns {String|null}\n   */\n  localStorageMemory.getItem = function (key) {\n    return cache[key] || null;\n  };\n\n  /**\n   * sets item for key to passed value, as String\n   *\n   * @para {String} key\n   *       name of item to be set\n   * @para {String} value\n   *       value, will always be turned into a String\n   * @returns {undefined}\n   */\n  localStorageMemory.setItem = function (key, value) {\n    if (typeof value === 'undefined') {\n      localStorageMemory.removeItem(key);\n    } else {\n      if (!cache.hasOwnProperty(key)) {\n        localStorageMemory.length++;\n      }\n\n      cache[key] = '' + value;\n    }\n  };\n\n  /**\n   * removes item for passed key\n   *\n   * @para {String} key\n   *       name of item to be removed\n   * @returns {undefined}\n   */\n  localStorageMemory.removeItem = function (key) {\n    if (cache.hasOwnProperty(key)) {\n      delete cache[key];\n      localStorageMemory.length--;\n    }\n  };\n\n  /**\n   * returns name of key at passed index\n   *\n   * @para {Number} index\n   *       Position for key to be returned (starts at 0)\n   * @returns {String|null}\n   */\n  localStorageMemory.key = function (index) {\n    return Object.keys(cache)[index] || null;\n  };\n\n  /**\n   * removes all stored items and sets length to 0\n   *\n   * @returns {undefined}\n   */\n  localStorageMemory.clear = function () {\n    cache = {};\n    localStorageMemory.length = 0;\n  };\n\n  if (( false ? 'undefined' : _typeof(exports)) === 'object') {\n    module.exports = localStorageMemory;\n  } else {\n    root.localStorageMemory = localStorageMemory;\n  }\n})(this);\n\n/***/ },\n/* 5 */\n/***/ function(module, exports, __webpack_require__) {\n\n\"use strict\";\nvar _typeof = typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; };\n\n/* harmony default export */ exports[\"a\"] = Model;\n\n/**\n* Creates a new Model instance and hooks up the storage.\n*\n* @constructor\n* @param {object} storage A reference to the client side storage class\n*/\nfunction Model(storage) {\n  this.storage = storage;\n}\n\n/**\n* Creates a new todo model\n*\n* @param {string} [title] The title of the task\n* @param {function} [callback] The callback to fire after the model is created\n*/\nModel.prototype.create = function (title, callback) {\n  title = title || '';\n  callback = callback || function () {};\n\n  var newItem = {\n    title: title.trim(),\n    completed: false\n  };\n\n  this.storage.save(newItem, callback);\n};\n\n/**\n * Finds and returns a model in storage. If no query is given it'll simply\n * return everything. If you pass in a string or number it'll look that up as\n * the ID of the model to find. Lastly, you can pass it an object to match against.\n *\n * @param {string|number|object} [query] A query to match models against\n * @param {function} [callback] The callback to fire after the model is found\n *\n * @example\n * model.read(1, func); // Will find the model with an ID of 1\n * model.read('1'); // Same as above\n * //Below will find a model with foo equalling bar and hello equalling world.\n * model.read({ foo: 'bar', hello: 'world' });\n */\nModel.prototype.read = function (query, callback) {\n  var queryType = typeof query === 'undefined' ? 'undefined' : _typeof(query);\n  callback = callback || function () {};\n\n  if (queryType === 'function') {\n    callback = query;\n    return this.storage.findAll(callback);\n  } else if (queryType === 'string' || queryType === 'number') {\n    query = parseInt(query, 10);\n    this.storage.find({ id: query }, callback);\n  } else {\n    this.storage.find(query, callback);\n  }\n  return undefined;\n};\n\n/**\n* Updates a model by giving it an ID, data to update, and a callback to fire when\n* the update is complete.\n*\n* @param {number} id The id of the model to update\n* @param {object} data The properties to update and their new value\n* @param {function} callback The callback to fire when the update is complete.\n*/\nModel.prototype.update = function (id, data, callback) {\n  this.storage.save(data, callback, id);\n};\n\n/**\n* Removes a model from storage\n*\n* @param {number} id The ID of the model to remove\n* @param {function} callback The callback to fire when the removal is complete.\n*/\nModel.prototype.remove = function (id, callback) {\n  this.storage.remove(id, callback);\n};\n\n/**\n* WARNING: Will remove ALL data from storage.\n*\n* @param {function} callback The callback to fire when the storage is wiped.\n*/\nModel.prototype.removeAll = function (callback) {\n  this.storage.drop(callback);\n};\n\n/**\n* Returns a count of all todos\n*/\nModel.prototype.getCount = function (callback) {\n  var todos = {\n    active: 0,\n    completed: 0,\n    total: 0\n  };\n\n  this.storage.findAll(function (data) {\n    data.forEach(function (todo) {\n      if (todo.completed) {\n        todos.completed++;\n      } else {\n        todos.active++;\n      }\n\n      todos.total++;\n    });\n    callback(todos);\n  });\n};\n\n/***/ },\n/* 6 */\n/***/ function(module, exports, __webpack_require__) {\n\n\"use strict\";\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__helpers__ = __webpack_require__(0);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__memory__ = __webpack_require__(4);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__memory___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_1__memory__);\n\n\n/* harmony default export */ exports[\"a\"] = Store;\n\nvar uniqueID = 0;\n\n/**\n * Creates a new client side storage object and will create an empty\n * collection if no collection already exists.\n *\n * @param {string} name The name of our DB we want to use\n * @param {function} callback Our fake DB uses callbacks because in\n * real life you probably would be making AJAX calls\n */\nfunction Store(name, callback) {\n  callback = callback || function () {};\n\n  this._dbName = name;\n\n  if (!__WEBPACK_IMPORTED_MODULE_1__memory__[name]) {\n    var data = {\n      todos: []\n    };\n\n    __WEBPACK_IMPORTED_MODULE_1__memory__[name] = JSON.stringify(data);\n  }\n\n  callback.call(this, JSON.parse(__WEBPACK_IMPORTED_MODULE_1__memory__[name]));\n  this.subscribers = [];\n}\n\nStore.prototype.subscribe = function (subscriber) {\n  var _this = this;\n\n  this.subscribers.push(subscriber);\n  return function () {\n    return __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0__helpers__[\"f\" /* remove */])(_this.subscribers, subscriber);\n  };\n};\n\nStore.prototype._notify = function () {\n  this.subscribers.forEach(function (s) {\n    return s();\n  });\n};\n\n/**\n* Finds items based on a query given as a JS object\n*\n* @param {object} query The query to match against (i.e. {foo: 'bar'})\n* @param {function} callback   The callback to fire when the query has\n* completed running\n*\n* @example\n* db.find({foo: 'bar', hello: 'world'}, function (data) {\n*   // data will return any items that have foo: bar and\n*   // hello: world in their properties\n* });\n*/\nStore.prototype.find = function (query, callback) {\n  if (!callback) {\n    return;\n  }\n\n  var todos = JSON.parse(__WEBPACK_IMPORTED_MODULE_1__memory__[this._dbName]).todos;\n\n  callback.call(this, todos.filter(function (todo) {\n    for (var q in query) {\n      if (query[q] !== todo[q]) {\n        return false;\n      }\n    }\n    return true;\n  }));\n};\n\n/**\n* Will retrieve all data from the collection\n*\n* @param {function} callback The callback to fire upon retrieving data\n*/\nStore.prototype.findAll = function (callback) {\n  callback = callback || function () {};\n  callback.call(this, JSON.parse(__WEBPACK_IMPORTED_MODULE_1__memory__[this._dbName]).todos);\n};\n\n/**\n* Will save the given data to the DB. If no item exists it will create a new\n* item, otherwise it'll simply update an existing item's properties\n*\n* @param {object} updateData The data to save back into the DB\n* @param {function} callback The callback to fire after saving\n* @param {number} id An optional param to enter an ID of an item to update\n*/\nStore.prototype.save = function (updateData, callback, id) {\n  var data = JSON.parse(__WEBPACK_IMPORTED_MODULE_1__memory__[this._dbName]);\n  var todos = data.todos;\n\n  callback = callback || function () {};\n\n  // If an ID was actually given, find the item and update each property\n  if (id) {\n    for (var i = 0; i < todos.length; i++) {\n      if (todos[i].id === id) {\n        for (var key in updateData) {\n          // eslint-disable-line guard-for-in\n          todos[i][key] = updateData[key];\n        }\n        break;\n      }\n    }\n\n    __WEBPACK_IMPORTED_MODULE_1__memory__[this._dbName] = JSON.stringify(data);\n    callback.call(this, JSON.parse(__WEBPACK_IMPORTED_MODULE_1__memory__[this._dbName]).todos);\n  } else {\n    // Generate an ID\n    updateData.id = uniqueID++;\n\n    todos.push(updateData);\n    __WEBPACK_IMPORTED_MODULE_1__memory__[this._dbName] = JSON.stringify(data);\n    callback.call(this, [updateData]);\n  }\n  this._notify();\n};\n\n/**\n* Will remove an item from the Store based on its ID\n*\n* @param {number} id The ID of the item you want to remove\n* @param {function} callback The callback to fire after saving\n*/\nStore.prototype.remove = function (id, callback) {\n  var data = JSON.parse(__WEBPACK_IMPORTED_MODULE_1__memory__[this._dbName]);\n  var todos = data.todos;\n\n  for (var i = 0; i < todos.length; i++) {\n    if (todos[i].id === id) {\n      todos.splice(i, 1);\n      break;\n    }\n  }\n\n  __WEBPACK_IMPORTED_MODULE_1__memory__[this._dbName] = JSON.stringify(data);\n  callback.call(this, JSON.parse(__WEBPACK_IMPORTED_MODULE_1__memory__[this._dbName]).todos);\n  this._notify();\n};\n\n/**\n* Will drop all storage and start fresh\n*\n* @param {function} callback The callback to fire after dropping the data\n*/\nStore.prototype.drop = function (callback) {\n  __WEBPACK_IMPORTED_MODULE_1__memory__[this._dbName] = JSON.stringify({ todos: [] });\n  callback.call(this, JSON.parse(__WEBPACK_IMPORTED_MODULE_1__memory__[this._dbName]).todos);\n  this._notify();\n};\n\n/***/ },\n/* 7 */\n/***/ function(module, exports, __webpack_require__) {\n\n\"use strict\";\n/* harmony default export */ exports[\"a\"] = Template;\n\nvar htmlEscapes = {\n  '&': '&amp;',\n  '<': '&lt;',\n  '>': '&gt;',\n  '\"': '&quot;',\n  '\\'': '&#x27;',\n  '`': '&#x60;'\n};\n\nvar escapeHtmlChar = function escapeHtmlChar(chr) {\n  return htmlEscapes[chr];\n};\n\nvar reUnescapedHtml = /[&<>\"'`]/g;\nvar reHasUnescapedHtml = new RegExp(reUnescapedHtml.source);\n\nvar escape = function escape(string) {\n  if (string && reHasUnescapedHtml.test(string)) {\n    return string.replace(reUnescapedHtml, escapeHtmlChar);\n  } else {\n    return string;\n  }\n};\n\n/**\n* Sets up defaults for all the Template methods such as a default template\n*\n* @constructor\n*/\nfunction Template() {\n  this.defaultTemplate = '\\n    <li data-id=\"{{id}}\" class=\"{{completed}}\">\\n      <div class=\"view\">\\n        <input class=\"toggle\" type=\"checkbox\" {{checked}} />\\n        <label>{{title}}</label>\\n        <button class=\"destroy\"></button>\\n      </div>\\n    </li>\\n  ';\n}\n\n/**\n * Creates an <li> HTML string and returns it for placement in your app.\n *\n * NOTE: In real life you should be using a templating engine such as Mustache\n * or Handlebars, however, this is a vanilla JS example.\n *\n * @param {object} data The object containing keys you want to find in the\n *                      template to replace.\n * @returns {string} HTML String of an <li> element\n *\n * @example\n * view.show({\n *  id: 1,\n *  title: \"Hello World\",\n *  completed: 0,\n * });\n */\nTemplate.prototype.show = function (data) {\n  var i, l;\n  var view = '';\n\n  for (i = 0, l = data.length; i < l; i++) {\n    var template = this.defaultTemplate;\n    var completed = '';\n    var checked = '';\n\n    if (data[i].completed) {\n      completed = 'completed';\n      checked = 'checked';\n    }\n\n    template = template.replace('{{id}}', data[i].id);\n    template = template.replace('{{title}}', escape(data[i].title));\n    template = template.replace('{{completed}}', completed);\n    template = template.replace('{{checked}}', checked);\n\n    view = view + template;\n  }\n\n  return view;\n};\n\n/**\n * Displays a counter of how many to dos are left to complete\n *\n * @param {number} activeTodos The number of active todos.\n * @returns {string} String containing the count\n */\nTemplate.prototype.itemCounter = function (activeTodos) {\n  var plural = activeTodos === 1 ? '' : 's';\n\n  return '<strong>' + activeTodos + '</strong> item' + plural + ' left';\n};\n\n/**\n * Updates the text within the \"Clear completed\" button\n *\n * @param  {[type]} completedTodos The number of completed todos.\n * @returns {string} String containing the count\n */\nTemplate.prototype.clearCompletedButton = function (completedTodos) {\n  if (completedTodos > 0) {\n    return 'Clear completed';\n  } else {\n    return '';\n  }\n};\n\n/***/ },\n/* 8 */\n/***/ function(module, exports, __webpack_require__) {\n\n\"use strict\";\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__view__ = __webpack_require__(9);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__controller__ = __webpack_require__(3);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__model__ = __webpack_require__(5);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__store__ = __webpack_require__(6);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__template__ = __webpack_require__(7);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_5__helpers__ = __webpack_require__(0);\n\n/* harmony export */ __webpack_require__.d(exports, \"a\", function() { return updateTodo; });/* unused harmony export getTodo *//* unused harmony export subscribe */\n\n\n\n\n\n\n\n\nvar todo = void 0;\nvar subscribers = [];\n\n/**\n * Sets up a brand new Todo list.\n *\n * @param {string} name The name of your new to do list.\n */\nfunction Todo(name) {\n  this.storage = new __WEBPACK_IMPORTED_MODULE_3__store__[\"a\" /* default */](name);\n  this.model = new __WEBPACK_IMPORTED_MODULE_2__model__[\"a\" /* default */](this.storage);\n  this.template = new __WEBPACK_IMPORTED_MODULE_4__template__[\"a\" /* default */]();\n  this.view = new __WEBPACK_IMPORTED_MODULE_0__view__[\"a\" /* default */](this.template);\n  this.controller = new __WEBPACK_IMPORTED_MODULE_1__controller__[\"a\" /* default */](this.model, this.view);\n}\n\nfunction updateTodo() {\n  todo = new Todo('todos-vanillajs');\n  todo.controller.setView(document.location.hash);\n  subscribers.forEach(function (s) {\n    return s();\n  });\n}\n\nfunction getTodo() {\n  return todo;\n}\n\nfunction subscribe(cb) {\n  subscribers.push(cb);\n  return function unsubscribe() {\n    __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_5__helpers__[\"f\" /* remove */])(subscribers, cb);\n  };\n}\n\n/***/ },\n/* 9 */\n/***/ function(module, exports, __webpack_require__) {\n\n\"use strict\";\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__helpers__ = __webpack_require__(0);\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\n/* eslint no-invalid-this: 0, complexity:[2, 9] */\n\n\n/**\n * View that abstracts away the browser's DOM completely.\n * It has two simple entry points:\n *\n *   - bind(eventName, handler)\n *     Takes a todo application event and registers the handler\n *   - render(command, parameterObject)\n *     Renders the given command with the options\n */\n\nvar View = function () {\n  function View(template) {\n    _classCallCheck(this, View);\n\n    this.template = template;\n\n    this.ENTER_KEY = 13;\n    this.ESCAPE_KEY = 27;\n\n    this.$todoList = __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0__helpers__[\"a\" /* qs */])('.todo-list');\n    this.$todoItemCounter = __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0__helpers__[\"a\" /* qs */])('.todo-count');\n    this.$clearCompleted = __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0__helpers__[\"a\" /* qs */])('.clear-completed');\n    this.$main = __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0__helpers__[\"a\" /* qs */])('.main');\n    this.$footer = __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0__helpers__[\"a\" /* qs */])('.footer');\n    this.$toggleAll = __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0__helpers__[\"a\" /* qs */])('.toggle-all');\n    this.$newTodo = __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0__helpers__[\"a\" /* qs */])('.new-todo');\n  }\n\n  _createClass(View, [{\n    key: '_removeItem',\n    value: function _removeItem(id) {\n      var elem = __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0__helpers__[\"a\" /* qs */])('[data-id=\"' + id + '\"]');\n\n      if (elem) {\n        this.$todoList.removeChild(elem);\n      }\n    }\n  }, {\n    key: '_clearCompletedButton',\n    value: function _clearCompletedButton(completedCount, visible) {\n      this.$clearCompleted.innerHTML = this.template.clearCompletedButton(completedCount);\n      this.$clearCompleted.style.display = visible ? 'block' : 'none';\n    }\n  }, {\n    key: '_editItemDone',\n    value: function _editItemDone(id, title) {\n      var listItem = __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0__helpers__[\"a\" /* qs */])('[data-id=\"' + id + '\"]');\n\n      if (!listItem) {\n        return;\n      }\n\n      var input = __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0__helpers__[\"a\" /* qs */])('input.edit', listItem);\n      listItem.removeChild(input);\n\n      listItem.className = listItem.className.replace('editing', '');\n\n      __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0__helpers__[\"b\" /* qsa */])('label', listItem).forEach(function (label) {\n        label.textContent = title;\n      });\n    }\n  }, {\n    key: 'render',\n    value: function render(viewCmd, parameter) {\n      var that = this;\n      var viewCommands = {\n        showEntries: function showEntries() {\n          that.$todoList.innerHTML = that.template.show(parameter);\n        },\n        removeItem: function removeItem() {\n          that._removeItem(parameter);\n        },\n        updateElementCount: function updateElementCount() {\n          that.$todoItemCounter.innerHTML = that.template.itemCounter(parameter);\n        },\n        clearCompletedButton: function clearCompletedButton() {\n          that._clearCompletedButton(parameter.completed, parameter.visible);\n        },\n        contentBlockVisibility: function contentBlockVisibility() {\n          that.$main.style.display = that.$footer.style.display = parameter.visible ? 'block' : 'none';\n        },\n        toggleAll: function toggleAll() {\n          that.$toggleAll.checked = parameter.checked;\n        },\n        setFilter: function setFilter() {\n          _setFilter(parameter);\n        },\n        clearNewTodo: function clearNewTodo() {\n          that.$newTodo.value = '';\n        },\n        elementComplete: function elementComplete() {\n          _elementComplete(parameter.id, parameter.completed);\n        },\n        editItem: function editItem() {\n          _editItem(parameter.id, parameter.title);\n        },\n        editItemDone: function editItemDone() {\n          that._editItemDone(parameter.id, parameter.title);\n        }\n      };\n\n      viewCommands[viewCmd]();\n    }\n  }, {\n    key: '_bindItemEditDone',\n    value: function _bindItemEditDone(handler) {\n      var that = this;\n      __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0__helpers__[\"c\" /* $delegate */])(that.$todoList, 'li .edit', 'blur', function () {\n        if (!this.dataset.iscanceled) {\n          handler({\n            id: _itemId(this),\n            title: this.value\n          });\n        }\n      });\n\n      __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0__helpers__[\"c\" /* $delegate */])(that.$todoList, 'li .edit', 'keypress', function (event) {\n        if (event.keyCode === that.ENTER_KEY) {\n          // Remove the cursor from the input when you hit enter just like if it\n          // were a real form\n          this.blur();\n        }\n      });\n    }\n  }, {\n    key: '_bindItemEditCancel',\n    value: function _bindItemEditCancel(handler) {\n      var that = this;\n      __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0__helpers__[\"c\" /* $delegate */])(that.$todoList, 'li .edit', 'keyup', function (event) {\n        if (event.keyCode === that.ESCAPE_KEY) {\n          this.dataset.iscanceled = true;\n          this.blur();\n\n          handler({ id: _itemId(this) });\n        }\n      });\n    }\n  }, {\n    key: 'bind',\n    value: function bind(event, handler) {\n      var that = this;\n      if (event === 'newTodo') {\n        __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0__helpers__[\"d\" /* $on */])(that.$newTodo, 'change', function () {\n          handler(that.$newTodo.value);\n        });\n      } else if (event === 'removeCompleted') {\n        __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0__helpers__[\"d\" /* $on */])(that.$clearCompleted, 'click', function () {\n          handler();\n        });\n      } else if (event === 'toggleAll') {\n        __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0__helpers__[\"d\" /* $on */])(that.$toggleAll, 'click', function () {\n          handler({ completed: this.checked });\n        });\n      } else if (event === 'itemEdit') {\n        __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0__helpers__[\"c\" /* $delegate */])(that.$todoList, 'li label', 'dblclick', function () {\n          handler({ id: _itemId(this) });\n        });\n      } else if (event === 'itemRemove') {\n        __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0__helpers__[\"c\" /* $delegate */])(that.$todoList, '.destroy', 'click', function () {\n          handler({ id: _itemId(this) });\n        });\n      } else if (event === 'itemToggle') {\n        __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0__helpers__[\"c\" /* $delegate */])(that.$todoList, '.toggle', 'click', function () {\n          handler({\n            id: _itemId(this),\n            completed: this.checked\n          });\n        });\n      } else if (event === 'itemEditDone') {\n        that._bindItemEditDone(handler);\n      } else if (event === 'itemEditCancel') {\n        that._bindItemEditCancel(handler);\n      }\n    }\n  }]);\n\n  return View;\n}();\n\n/* harmony default export */ exports[\"a\"] = View;\n\n\nfunction _setFilter(currentPage) {\n  __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0__helpers__[\"a\" /* qs */])('.filters .selected').className = '';\n  __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0__helpers__[\"a\" /* qs */])('.filters [href=\"#/' + currentPage + '\"]').className = 'selected';\n}\n\nfunction _elementComplete(id, completed) {\n  var listItem = __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0__helpers__[\"a\" /* qs */])('[data-id=\"' + id + '\"]');\n\n  if (!listItem) {\n    return;\n  }\n\n  listItem.className = completed ? 'completed' : '';\n\n  // In case it was toggled from an event and not by clicking the checkbox\n  __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0__helpers__[\"a\" /* qs */])('input', listItem).checked = completed;\n}\n\nfunction _editItem(id, title) {\n  var listItem = __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0__helpers__[\"a\" /* qs */])('[data-id=\"' + id + '\"]');\n\n  if (!listItem) {\n    return;\n  }\n\n  listItem.className = listItem.className + ' editing';\n\n  var input = document.createElement('input');\n  input.className = 'edit';\n\n  listItem.appendChild(input);\n  input.focus();\n  input.value = title;\n}\n\nfunction _itemId(element) {\n  var li = __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0__helpers__[\"e\" /* $parent */])(element, 'li');\n  return parseInt(li.dataset.id, 10);\n}\n\n/***/ },\n/* 10 */\n/***/ function(module, exports) {\n\n// removed by extract-text-webpack-plugin\n\n/***/ },\n/* 11 */\n/***/ function(module, exports, __webpack_require__) {\n\n\"use strict\";\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__app__ = __webpack_require__(2);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__helpers__ = __webpack_require__(0);\n/* eslint no-console:0 */\n\n\n\n// this is only relevant when using `hot` mode with webpack\n// special thanks to Eric Clemmons: https://github.com/ericclemmons/webpack-hot-server-example\nvar reloading = document.readyState === 'complete';\nif (false) {\n  module.hot.accept(function (err) {});\n  if (reloading) {\n    onLoad();\n  } else {\n    bootstrap();\n  }\n} else {\n  bootstrap();\n}\n\nfunction bootstrap() {\n  __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_1__helpers__[\"d\" /* $on */])(window, 'load', __WEBPACK_IMPORTED_MODULE_0__app__[\"a\" /* onLoad */]);\n  __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_1__helpers__[\"d\" /* $on */])(window, 'hashchange', __WEBPACK_IMPORTED_MODULE_0__app__[\"a\" /* onLoad */]);\n}\n\n/***/ }\n],[11]);\n\n\n// WEBPACK FOOTER //\n// bundle.app.71bb1f671e4e65604d05.js","export {qs, qsa, $on, $delegate, $parent, remove}\n\n// Get element(s) by CSS selector:\nfunction qs(selector, scope) {\n  return (scope || document).querySelector(selector)\n}\n\nfunction qsa(selector, scope) {\n  return (scope || document).querySelectorAll(selector)\n}\n\n// addEventListener wrapper:\nfunction $on(target, type, callback, useCapture) {\n  target.addEventListener(type, callback, !!useCapture)\n}\n\n// Attach a handler to event for all elements that match the selector,\n// now or in the future, based on a root element\nfunction $delegate(target, selector, type, handler) {\n  // https://developer.mozilla.org/en-US/docs/Web/Events/blur\n  var useCapture = type === 'blur' || type === 'focus'\n  $on(target, type, dispatchEvent, useCapture)\n\n  function dispatchEvent(event) {\n    var targetElement = event.target\n    var potentialElements = qsa(selector, target)\n    var hasMatch = Array.prototype.indexOf.call(potentialElements, targetElement) >= 0\n\n    if (hasMatch) {\n      handler.call(targetElement, event)\n    }\n  }\n}\n\n// Find the element's parent with the given tag name:\n// $parent(qs('a'), 'div');\nfunction $parent(element, tagName) {\n  if (!element.parentNode) {\n    return undefined\n  }\n  if (element.parentNode.tagName.toLowerCase() === tagName.toLowerCase()) {\n    return element.parentNode\n  }\n  return $parent(element.parentNode, tagName)\n}\n\n// removes an element from an array\n// const x = [1,2,3]\n// remove(x, 2)\n// x ~== [1,3]\nfunction remove(array, thing) {\n  const index = array.indexOf(thing)\n  if (index === -1) {\n    return array\n  }\n  array.splice(index, 1)\n}\n\n// Allow for looping on nodes by chaining:\n// qsa('.foo').forEach(function () {})\nNodeList.prototype.forEach = Array.prototype.forEach\n\n\n\n// WEBPACK FOOTER //\n// ./helpers.js","import 'todomvc-app-css/index.css'\nimport './app.css'\n\nimport {$on} from './helpers'\nimport {updateTodo} from './todo'\n\nexport function onLoad() { // eslint-disable-line import/prefer-default-export\n  updateTodo()\n}\n\n\n\n// WEBPACK FOOTER //\n// ./app.js","export default Controller\n\n/**\n* Takes a model and view and acts as the controller between them\n*\n* @constructor\n* @param {object} model The model instance\n* @param {object} view The view instance\n*/\nfunction Controller(model, view) {\n  var that = this\n  that.model = model\n  that.view = view\n\n  that.view.bind('newTodo', function(title) {\n    that.addItem(title)\n  })\n\n  that.view.bind('itemEdit', function(item) {\n    that.editItem(item.id)\n  })\n\n  that.view.bind('itemEditDone', function(item) {\n    that.editItemSave(item.id, item.title)\n  })\n\n  that.view.bind('itemEditCancel', function(item) {\n    that.editItemCancel(item.id)\n  })\n\n  that.view.bind('itemRemove', function(item) {\n    that.removeItem(item.id)\n  })\n\n  that.view.bind('itemToggle', function(item) {\n    that.toggleComplete(item.id, item.completed)\n  })\n\n  that.view.bind('removeCompleted', function() {\n    that.removeCompletedItems()\n  })\n\n  that.view.bind('toggleAll', function(status) {\n    that.toggleAll(status.completed)\n  })\n}\n\n/**\n* Loads and initialises the view\n*\n* @param {string} '' | 'active' | 'completed'\n*/\nController.prototype.setView = function(locationHash) {\n  var route = locationHash.split('/')[1]\n  var page = route || ''\n  this._updateFilterState(page)\n}\n\n/**\n* An event to fire on load. Will get all items and display them in the\n* todo-list\n*/\nController.prototype.showAll = function() {\n  var that = this\n  that.model.read(function(data) {\n    that.view.render('showEntries', data)\n  })\n}\n\n/**\n* Renders all active tasks\n*/\nController.prototype.showActive = function() {\n  var that = this\n  that.model.read({completed: false}, function(data) {\n    that.view.render('showEntries', data)\n  })\n}\n\n/**\n* Renders all completed tasks\n*/\nController.prototype.showCompleted = function() {\n  var that = this\n  that.model.read({completed: true}, function(data) {\n    that.view.render('showEntries', data)\n  })\n}\n\n/**\n* An event to fire whenever you want to add an item. Simply pass in the event\n* object and it'll handle the DOM insertion and saving of the new item.\n*/\nController.prototype.addItem = function(title) {\n  var that = this\n\n  if (title.trim() === '') {\n    return\n  }\n\n  that.model.create(title, function() {\n    that.view.render('clearNewTodo')\n    that._filter(true)\n  })\n}\n\n/*\n* Triggers the item editing mode.\n*/\nController.prototype.editItem = function(id) {\n  var that = this\n  that.model.read(id, function(data) {\n    that.view.render('editItem', {id, title: data[0].title})\n  })\n}\n\n/*\n* Finishes the item editing mode successfully.\n*/\nController.prototype.editItemSave = function(id, title) {\n  var that = this\n  if (title.trim()) {\n    that.model.update(id, {title}, function() {\n      that.view.render('editItemDone', {id, title})\n    })\n  } else {\n    that.removeItem(id)\n  }\n}\n\n/*\n* Cancels the item editing mode.\n*/\nController.prototype.editItemCancel = function(id) {\n  var that = this\n  that.model.read(id, function(data) {\n    that.view.render('editItemDone', {id, title: data[0].title})\n  })\n}\n\n/**\n* By giving it an ID it'll find the DOM element matching that ID,\n* remove it from the DOM and also remove it from storage.\n*\n* @param {number} id The ID of the item to remove from the DOM and\n* storage\n*/\nController.prototype.removeItem = function(id) {\n  var that = this\n  that.model.remove(id, function() {\n    that.view.render('removeItem', id)\n  })\n\n  that._filter()\n}\n\n/**\n* Will remove all completed items from the DOM and storage.\n*/\nController.prototype.removeCompletedItems = function() {\n  var that = this\n  that.model.read({completed: true}, function(data) {\n    data.forEach(function(item) {\n      that.removeItem(item.id)\n    })\n  })\n\n  that._filter()\n}\n\n/**\n* Give it an ID of a model and a checkbox and it will update the item\n* in storage based on the checkbox's state.\n*\n* @param {number} id The ID of the element to complete or uncomplete\n* @param {object} checkbox The checkbox to check the state of complete\n*                          or not\n* @param {boolean|undefined} silent Prevent re-filtering the todo items\n*/\nController.prototype.toggleComplete = function(id, completed, silent) {\n  var that = this\n  that.model.update(id, {completed}, function() {\n    that.view.render('elementComplete', {\n      id,\n      completed,\n    })\n  })\n\n  if (!silent) {\n    that._filter()\n  }\n}\n\n/**\n* Will toggle ALL checkboxes' on/off state and completeness of models.\n* Just pass in the event object.\n*/\nController.prototype.toggleAll = function(completed) {\n  var that = this\n  that.model.read({completed: !completed}, function(data) {\n    data.forEach(function(item) {\n      that.toggleComplete(item.id, completed, true)\n    })\n  })\n\n  that._filter()\n}\n\n/**\n* Updates the pieces of the page which change depending on the remaining\n* number of todos.\n*/\nController.prototype._updateCount = function() {\n  var that = this\n  that.model.getCount(function(todos) {\n    that.view.render('updateElementCount', todos.active)\n    that.view.render('clearCompletedButton', {\n      completed: todos.completed,\n      visible: todos.completed > 0\n    })\n\n    that.view.render('toggleAll', {checked: todos.completed === todos.total})\n    that.view.render('contentBlockVisibility', {visible: todos.total > 0})\n  })\n}\n\n/**\n* Re-filters the todo items, based on the active route.\n* @param {boolean|undefined} force  forces a re-painting of todo items.\n*/\nController.prototype._filter = function(force) {\n  var activeRoute = this._activeRoute.charAt(0).toUpperCase() + this._activeRoute.substr(1)\n\n  // Update the elements on the page, which change with each completed todo\n  this._updateCount()\n\n  // If the last active route isn't \"All\", or we're switching routes, we\n  // re-create the todo item elements, calling:\n  //   this.show[All|Active|Completed]();\n  if (force || this._lastActiveRoute !== 'All' || this._lastActiveRoute !== activeRoute) {\n    this['show' + activeRoute]()\n  }\n\n  this._lastActiveRoute = activeRoute\n}\n\n/**\n* Simply updates the filter nav's selected states\n*/\nController.prototype._updateFilterState = function(currentPage) {\n  // Store a reference to the active route, allowing us to re-filter todo\n  // items as they are marked complete or incomplete.\n  currentPage = currentPage.split('?')[0]\n  this._activeRoute = currentPage\n\n  if (currentPage === '') {\n    this._activeRoute = 'All'\n  }\n\n  this._filter()\n\n  this.view.render('setFilter', currentPage)\n}\n\n\n\n// WEBPACK FOOTER //\n// ./controller.js","(function(root) {\n  var localStorageMemory = {};\n  var cache = {};\n\n  /**\n   * number of stored items.\n   */\n  localStorageMemory.length = 0;\n\n  /**\n   * returns item for passed key, or null\n   *\n   * @para {String} key\n   *       name of item to be returned\n   * @returns {String|null}\n   */\n  localStorageMemory.getItem = function(key) {\n    return cache[key] || null;\n  };\n\n  /**\n   * sets item for key to passed value, as String\n   *\n   * @para {String} key\n   *       name of item to be set\n   * @para {String} value\n   *       value, will always be turned into a String\n   * @returns {undefined}\n   */\n  localStorageMemory.setItem = function(key, value) {\n    if (typeof value === 'undefined') {\n      localStorageMemory.removeItem(key);\n    } else {\n      if (!(cache.hasOwnProperty(key))) {\n        localStorageMemory.length++;\n      }\n\n      cache[key] = '' + value;\n    }\n  };\n\n  /**\n   * removes item for passed key\n   *\n   * @para {String} key\n   *       name of item to be removed\n   * @returns {undefined}\n   */\n  localStorageMemory.removeItem = function(key) {\n    if (cache.hasOwnProperty(key)) {\n      delete cache[key];\n      localStorageMemory.length--;\n    }\n  };\n\n  /**\n   * returns name of key at passed index\n   *\n   * @para {Number} index\n   *       Position for key to be returned (starts at 0)\n   * @returns {String|null}\n   */\n  localStorageMemory.key = function(index) {\n    return Object.keys(cache)[index] || null;\n  };\n\n  /**\n   * removes all stored items and sets length to 0\n   *\n   * @returns {undefined}\n   */\n  localStorageMemory.clear = function() {\n    cache = {};\n    localStorageMemory.length = 0;\n  };\n\n  if (typeof exports === 'object') {\n    module.exports = localStorageMemory;\n  } else {\n    root.localStorageMemory = localStorageMemory;\n  }\n})(this);\n\n\n// WEBPACK FOOTER //\n// ./memory.js","export default Model\n\n/**\n* Creates a new Model instance and hooks up the storage.\n*\n* @constructor\n* @param {object} storage A reference to the client side storage class\n*/\nfunction Model(storage) {\n  this.storage = storage\n}\n\n/**\n* Creates a new todo model\n*\n* @param {string} [title] The title of the task\n* @param {function} [callback] The callback to fire after the model is created\n*/\nModel.prototype.create = function(title, callback) {\n  title = title || ''\n  callback = callback || function() {\n  }\n\n  var newItem = {\n    title: title.trim(),\n    completed: false\n  }\n\n  this.storage.save(newItem, callback)\n}\n\n/**\n * Finds and returns a model in storage. If no query is given it'll simply\n * return everything. If you pass in a string or number it'll look that up as\n * the ID of the model to find. Lastly, you can pass it an object to match against.\n *\n * @param {string|number|object} [query] A query to match models against\n * @param {function} [callback] The callback to fire after the model is found\n *\n * @example\n * model.read(1, func); // Will find the model with an ID of 1\n * model.read('1'); // Same as above\n * //Below will find a model with foo equalling bar and hello equalling world.\n * model.read({ foo: 'bar', hello: 'world' });\n */\nModel.prototype.read = function(query, callback) {\n  var queryType = typeof query\n  callback = callback || function() {\n  }\n\n  if (queryType === 'function') {\n    callback = query\n    return this.storage.findAll(callback)\n  } else if (queryType === 'string' || queryType === 'number') {\n    query = parseInt(query, 10)\n    this.storage.find({id: query}, callback)\n  } else {\n    this.storage.find(query, callback)\n  }\n  return undefined\n}\n\n/**\n* Updates a model by giving it an ID, data to update, and a callback to fire when\n* the update is complete.\n*\n* @param {number} id The id of the model to update\n* @param {object} data The properties to update and their new value\n* @param {function} callback The callback to fire when the update is complete.\n*/\nModel.prototype.update = function(id, data, callback) {\n  this.storage.save(data, callback, id)\n}\n\n/**\n* Removes a model from storage\n*\n* @param {number} id The ID of the model to remove\n* @param {function} callback The callback to fire when the removal is complete.\n*/\nModel.prototype.remove = function(id, callback) {\n  this.storage.remove(id, callback)\n}\n\n/**\n* WARNING: Will remove ALL data from storage.\n*\n* @param {function} callback The callback to fire when the storage is wiped.\n*/\nModel.prototype.removeAll = function(callback) {\n  this.storage.drop(callback)\n}\n\n/**\n* Returns a count of all todos\n*/\nModel.prototype.getCount = function(callback) {\n  var todos = {\n    active: 0,\n    completed: 0,\n    total: 0\n  }\n\n  this.storage.findAll(function(data) {\n    data.forEach(function(todo) {\n      if (todo.completed) {\n        todos.completed++\n      } else {\n        todos.active++\n      }\n\n      todos.total++\n    })\n    callback(todos)\n  })\n}\n\n\n\n// WEBPACK FOOTER //\n// ./model.js","import {remove} from './helpers'\nimport * as localStorageMemory from './memory'\nexport default Store\n\nvar uniqueID = 0;\n\n/**\n * Creates a new client side storage object and will create an empty\n * collection if no collection already exists.\n *\n * @param {string} name The name of our DB we want to use\n * @param {function} callback Our fake DB uses callbacks because in\n * real life you probably would be making AJAX calls\n */\nfunction Store(name, callback) {\n  callback = callback || function() {\n  }\n\n  this._dbName = name\n\n  if (!localStorageMemory[name]) {\n    var data = {\n      todos: []\n    }\n\n    localStorageMemory[name] = JSON.stringify(data)\n  }\n\n  callback.call(this, JSON.parse(localStorageMemory[name]))\n  this.subscribers = []\n}\n\nStore.prototype.subscribe = function(subscriber) {\n  this.subscribers.push(subscriber)\n  return () => remove(this.subscribers, subscriber)\n}\n\nStore.prototype._notify = function() {\n  this.subscribers.forEach(s => s())\n}\n\n/**\n* Finds items based on a query given as a JS object\n*\n* @param {object} query The query to match against (i.e. {foo: 'bar'})\n* @param {function} callback   The callback to fire when the query has\n* completed running\n*\n* @example\n* db.find({foo: 'bar', hello: 'world'}, function (data) {\n*   // data will return any items that have foo: bar and\n*   // hello: world in their properties\n* });\n*/\nStore.prototype.find = function(query, callback) {\n  if (!callback) {\n    return\n  }\n\n  var todos = JSON.parse(localStorageMemory[this._dbName]).todos\n\n  callback.call(this, todos.filter(function(todo) {\n    for (var q in query) {\n      if (query[q] !== todo[q]) {\n        return false\n      }\n    }\n    return true\n  }))\n}\n\n/**\n* Will retrieve all data from the collection\n*\n* @param {function} callback The callback to fire upon retrieving data\n*/\nStore.prototype.findAll = function(callback) {\n  callback = callback || function() {\n  }\n  callback.call(this, JSON.parse(localStorageMemory[this._dbName]).todos)\n}\n\n/**\n* Will save the given data to the DB. If no item exists it will create a new\n* item, otherwise it'll simply update an existing item's properties\n*\n* @param {object} updateData The data to save back into the DB\n* @param {function} callback The callback to fire after saving\n* @param {number} id An optional param to enter an ID of an item to update\n*/\nStore.prototype.save = function(updateData, callback, id) {\n  var data = JSON.parse(localStorageMemory[this._dbName])\n  var todos = data.todos\n\n  callback = callback || function() {\n  }\n\n  // If an ID was actually given, find the item and update each property\n  if (id) {\n    for (var i = 0; i < todos.length; i++) {\n      if (todos[i].id === id) {\n        for (var key in updateData) { // eslint-disable-line guard-for-in\n          todos[i][key] = updateData[key]\n        }\n        break\n      }\n    }\n\n    localStorageMemory[this._dbName] = JSON.stringify(data)\n    callback.call(this, JSON.parse(localStorageMemory[this._dbName]).todos)\n  } else {\n    // Generate an ID\n    updateData.id = uniqueID++;\n\n    todos.push(updateData)\n    localStorageMemory[this._dbName] = JSON.stringify(data)\n    callback.call(this, [updateData])\n  }\n  this._notify()\n}\n\n/**\n* Will remove an item from the Store based on its ID\n*\n* @param {number} id The ID of the item you want to remove\n* @param {function} callback The callback to fire after saving\n*/\nStore.prototype.remove = function(id, callback) {\n  var data = JSON.parse(localStorageMemory[this._dbName])\n  var todos = data.todos\n\n  for (var i = 0; i < todos.length; i++) {\n    if (todos[i].id === id) {\n      todos.splice(i, 1)\n      break\n    }\n  }\n\n  localStorageMemory[this._dbName] = JSON.stringify(data)\n  callback.call(this, JSON.parse(localStorageMemory[this._dbName]).todos)\n  this._notify()\n}\n\n/**\n* Will drop all storage and start fresh\n*\n* @param {function} callback The callback to fire after dropping the data\n*/\nStore.prototype.drop = function(callback) {\n  localStorageMemory[this._dbName] = JSON.stringify({todos: []})\n  callback.call(this, JSON.parse(localStorageMemory[this._dbName]).todos)\n  this._notify()\n}\n\n\n\n// WEBPACK FOOTER //\n// ./store.js","export default Template\n\nvar htmlEscapes = {\n  '&': '&amp;',\n  '<': '&lt;',\n  '>': '&gt;',\n  '\"': '&quot;',\n  '\\'': '&#x27;',\n  '`': '&#x60;'\n}\n\nvar escapeHtmlChar = function(chr) {\n  return htmlEscapes[chr]\n}\n\nvar reUnescapedHtml = /[&<>\"'`]/g\nvar reHasUnescapedHtml = new RegExp(reUnescapedHtml.source)\n\nvar escape = function(string) {\n  if (string && reHasUnescapedHtml.test(string)) {\n    return string.replace(reUnescapedHtml, escapeHtmlChar)\n  } else {\n    return string\n  }\n}\n\n/**\n* Sets up defaults for all the Template methods such as a default template\n*\n* @constructor\n*/\nfunction Template() {\n  this.defaultTemplate = `\n    <li data-id=\"{{id}}\" class=\"{{completed}}\">\n      <div class=\"view\">\n        <input class=\"toggle\" type=\"checkbox\" {{checked}} />\n        <label>{{title}}</label>\n        <button class=\"destroy\"></button>\n      </div>\n    </li>\n  `\n}\n\n/**\n * Creates an <li> HTML string and returns it for placement in your app.\n *\n * NOTE: In real life you should be using a templating engine such as Mustache\n * or Handlebars, however, this is a vanilla JS example.\n *\n * @param {object} data The object containing keys you want to find in the\n *                      template to replace.\n * @returns {string} HTML String of an <li> element\n *\n * @example\n * view.show({\n *  id: 1,\n *  title: \"Hello World\",\n *  completed: 0,\n * });\n */\nTemplate.prototype.show = function(data) {\n  var i, l\n  var view = ''\n\n  for (i = 0, l = data.length; i < l; i++) {\n    var template = this.defaultTemplate\n    var completed = ''\n    var checked = ''\n\n    if (data[i].completed) {\n      completed = 'completed'\n      checked = 'checked'\n    }\n\n    template = template.replace('{{id}}', data[i].id)\n    template = template.replace('{{title}}', escape(data[i].title))\n    template = template.replace('{{completed}}', completed)\n    template = template.replace('{{checked}}', checked)\n\n    view = view + template\n  }\n\n  return view\n}\n\n/**\n * Displays a counter of how many to dos are left to complete\n *\n * @param {number} activeTodos The number of active todos.\n * @returns {string} String containing the count\n */\nTemplate.prototype.itemCounter = function(activeTodos) {\n  var plural = activeTodos === 1 ? '' : 's'\n\n  return '<strong>' + activeTodos + '</strong> item' + plural + ' left'\n}\n\n/**\n * Updates the text within the \"Clear completed\" button\n *\n * @param  {[type]} completedTodos The number of completed todos.\n * @returns {string} String containing the count\n */\nTemplate.prototype.clearCompletedButton = function(completedTodos) {\n  if (completedTodos > 0) {\n    return 'Clear completed'\n  } else {\n    return ''\n  }\n}\n\n\n\n// WEBPACK FOOTER //\n// ./template.js","import View from './view'\nimport Controller from './controller'\nimport Model from './model'\nimport Store from './store'\nimport Template from './template'\nimport {remove} from './helpers'\n\nexport {updateTodo, getTodo, subscribe}\n\nlet todo\nconst subscribers = []\n\n/**\n * Sets up a brand new Todo list.\n *\n * @param {string} name The name of your new to do list.\n */\nfunction Todo(name) {\n  this.storage = new Store(name)\n  this.model = new Model(this.storage)\n  this.template = new Template()\n  this.view = new View(this.template)\n  this.controller = new Controller(this.model, this.view)\n}\n\nfunction updateTodo() {\n  todo = new Todo('todos-vanillajs')\n  todo.controller.setView(document.location.hash)\n  subscribers.forEach(s => s())\n}\n\nfunction getTodo() {\n  return todo\n}\n\nfunction subscribe(cb) {\n  subscribers.push(cb)\n  return function unsubscribe() {\n    remove(subscribers, cb)\n  }\n}\n\n\n\n// WEBPACK FOOTER //\n// ./todo.js","/* eslint no-invalid-this: 0, complexity:[2, 9] */\nimport {qs, qsa, $on, $parent, $delegate} from './helpers'\n\n/**\n * View that abstracts away the browser's DOM completely.\n * It has two simple entry points:\n *\n *   - bind(eventName, handler)\n *     Takes a todo application event and registers the handler\n *   - render(command, parameterObject)\n *     Renders the given command with the options\n */\nexport default class View {\n  constructor(template) {\n    this.template = template\n\n    this.ENTER_KEY = 13\n    this.ESCAPE_KEY = 27\n\n    this.$todoList = qs('.todo-list')\n    this.$todoItemCounter = qs('.todo-count')\n    this.$clearCompleted = qs('.clear-completed')\n    this.$main = qs('.main')\n    this.$footer = qs('.footer')\n    this.$toggleAll = qs('.toggle-all')\n    this.$newTodo = qs('.new-todo')\n  }\n\n  _removeItem(id) {\n    var elem = qs('[data-id=\"' + id + '\"]')\n\n    if (elem) {\n      this.$todoList.removeChild(elem)\n    }\n  }\n\n  _clearCompletedButton(completedCount, visible) {\n    this.$clearCompleted.innerHTML = this.template.clearCompletedButton(completedCount)\n    this.$clearCompleted.style.display = visible ? 'block' : 'none'\n  }\n\n  _editItemDone(id, title) {\n    var listItem = qs('[data-id=\"' + id + '\"]')\n\n    if (!listItem) {\n      return\n    }\n\n    var input = qs('input.edit', listItem)\n    listItem.removeChild(input)\n\n    listItem.className = listItem.className.replace('editing', '')\n\n    qsa('label', listItem).forEach(function(label) {\n      label.textContent = title\n    })\n  }\n\n  render(viewCmd, parameter) {\n    var that = this\n    var viewCommands = {\n      showEntries: function() {\n        that.$todoList.innerHTML = that.template.show(parameter)\n      },\n      removeItem: function() {\n        that._removeItem(parameter)\n      },\n      updateElementCount: function() {\n        that.$todoItemCounter.innerHTML = that.template.itemCounter(parameter)\n      },\n      clearCompletedButton: function() {\n        that._clearCompletedButton(parameter.completed, parameter.visible)\n      },\n      contentBlockVisibility: function() {\n        that.$main.style.display = that.$footer.style.display = parameter.visible ? 'block' : 'none'\n      },\n      toggleAll: function() {\n        that.$toggleAll.checked = parameter.checked\n      },\n      setFilter: function() {\n        _setFilter(parameter)\n      },\n      clearNewTodo: function() {\n        that.$newTodo.value = ''\n      },\n      elementComplete: function() {\n        _elementComplete(parameter.id, parameter.completed)\n      },\n      editItem: function() {\n        _editItem(parameter.id, parameter.title)\n      },\n      editItemDone: function() {\n        that._editItemDone(parameter.id, parameter.title)\n      }\n    }\n\n    viewCommands[viewCmd]()\n  }\n\n  _bindItemEditDone(handler) {\n    var that = this\n    $delegate(that.$todoList, 'li .edit', 'blur', function() {\n      if (!this.dataset.iscanceled) {\n        handler({\n          id: _itemId(this),\n          title: this.value\n        })\n      }\n    })\n\n    $delegate(that.$todoList, 'li .edit', 'keypress', function(event) {\n      if (event.keyCode === that.ENTER_KEY) {\n        // Remove the cursor from the input when you hit enter just like if it\n        // were a real form\n        this.blur()\n      }\n    })\n  }\n\n  _bindItemEditCancel(handler) {\n    var that = this\n    $delegate(that.$todoList, 'li .edit', 'keyup', function(event) {\n      if (event.keyCode === that.ESCAPE_KEY) {\n        this.dataset.iscanceled = true\n        this.blur()\n\n        handler({id: _itemId(this)})\n      }\n    })\n  }\n\n  bind(event, handler) {\n    var that = this\n    if (event === 'newTodo') {\n      $on(that.$newTodo, 'change', function() {\n        handler(that.$newTodo.value)\n      })\n\n    } else if (event === 'removeCompleted') {\n      $on(that.$clearCompleted, 'click', function() {\n        handler()\n      })\n\n    } else if (event === 'toggleAll') {\n      $on(that.$toggleAll, 'click', function() {\n        handler({completed: this.checked})\n      })\n\n    } else if (event === 'itemEdit') {\n      $delegate(that.$todoList, 'li label', 'dblclick', function() {\n        handler({id: _itemId(this)})\n      })\n\n    } else if (event === 'itemRemove') {\n      $delegate(that.$todoList, '.destroy', 'click', function() {\n        handler({id: _itemId(this)})\n      })\n\n    } else if (event === 'itemToggle') {\n      $delegate(that.$todoList, '.toggle', 'click', function() {\n        handler({\n          id: _itemId(this),\n          completed: this.checked\n        })\n      })\n\n    } else if (event === 'itemEditDone') {\n      that._bindItemEditDone(handler)\n\n    } else if (event === 'itemEditCancel') {\n      that._bindItemEditCancel(handler)\n    }\n  }\n}\n\nfunction _setFilter(currentPage) {\n  qs('.filters .selected').className = ''\n  qs('.filters [href=\"#/' + currentPage + '\"]').className = 'selected'\n}\n\nfunction _elementComplete(id, completed) {\n  var listItem = qs('[data-id=\"' + id + '\"]')\n\n  if (!listItem) {\n    return\n  }\n\n  listItem.className = completed ? 'completed' : ''\n\n  // In case it was toggled from an event and not by clicking the checkbox\n  qs('input', listItem).checked = completed\n}\n\nfunction _editItem(id, title) {\n  var listItem = qs('[data-id=\"' + id + '\"]')\n\n  if (!listItem) {\n    return\n  }\n\n  listItem.className = listItem.className + ' editing'\n\n  var input = document.createElement('input')\n  input.className = 'edit'\n\n  listItem.appendChild(input)\n  input.focus()\n  input.value = title\n}\n\nfunction _itemId(element) {\n  var li = $parent(element, 'li')\n  return parseInt(li.dataset.id, 10)\n}\n\n\n\n// WEBPACK FOOTER //\n// ./view.js","/* eslint no-console:0 */\nimport {onLoad} from './app'\nimport {$on} from './helpers'\n\n// this is only relevant when using `hot` mode with webpack\n// special thanks to Eric Clemmons: https://github.com/ericclemmons/webpack-hot-server-example\nconst reloading = document.readyState === 'complete'\nif (module.hot) {\n  module.hot.accept(function(err) {\n  })\n  if (reloading) {\n    onLoad()\n  } else {\n    bootstrap()\n  }\n} else {\n  bootstrap()\n}\n\nfunction bootstrap() {\n  $on(window, 'load', onLoad)\n  $on(window, 'hashchange', onLoad)\n}\n\n\n\n// WEBPACK FOOTER //\n// ./bootstrap.js"],"sourceRoot":""}
\ No newline at end of file
+{"version":3,"sources":["webpack:///bundle.app.930ad8b83126862d7445.js","webpack:///./helpers.js","webpack:///./app.js","webpack:///./controller.js","webpack:///./memory.js","webpack:///./model.js","webpack:///./store.js","webpack:///./template.js","webpack:///./todo.js","webpack:///./view.js","webpack:///./bootstrap.js"],"names":["webpackJsonp","module","exports","__webpack_require__","qs","selector","scope","document","querySelector","qsa","querySelectorAll","$on","target","type","callback","useCapture","addEventListener","$delegate","handler","dispatchEvent","event","targetElement","potentialElements","hasMatch","Array","prototype","indexOf","call","$parent","element","tagName","parentNode","toLowerCase","remove","array","thing","index","splice","d","NodeList","forEach","onLoad","i","__WEBPACK_IMPORTED_MODULE_3__todo__","__WEBPACK_IMPORTED_MODULE_0_todomvc_app_css_index_css__","__WEBPACK_IMPORTED_MODULE_1__app_css__","n","Controller","model","view","that","this","bind","title","addItem","item","editItem","id","editItemSave","editItemCancel","removeItem","toggleComplete","completed","removeCompletedItems","status","toggleAll","setView","locationHash","route","split","page","_updateFilterState","showAll","read","data","render","showActive","showCompleted","trim","create","_filter","update","silent","_updateCount","getCount","todos","active","visible","checked","total","force","activeRoute","_activeRoute","charAt","toUpperCase","substr","_lastActiveRoute","currentPage","_typeof","Symbol","iterator","obj","constructor","root","localStorageMemory","cache","length","getItem","key","setItem","value","hasOwnProperty","Object","keys","clear","Model","storage","newItem","save","query","queryType","findAll","parseInt","find","removeAll","drop","todo","Store","name","_dbName","__WEBPACK_IMPORTED_MODULE_1__memory__","JSON","stringify","parse","subscribers","__WEBPACK_IMPORTED_MODULE_0__helpers__","uniqueID","subscribe","subscriber","_this","push","_notify","s","filter","q","updateData","Template","defaultTemplate","htmlEscapes","&","<",">","\"","'","`","escapeHtmlChar","chr","reUnescapedHtml","reHasUnescapedHtml","RegExp","source","escape","string","test","replace","show","l","template","itemCounter","activeTodos","plural","clearCompletedButton","completedTodos","Todo","__WEBPACK_IMPORTED_MODULE_3__store__","__WEBPACK_IMPORTED_MODULE_2__model__","__WEBPACK_IMPORTED_MODULE_4__template__","__WEBPACK_IMPORTED_MODULE_0__view__","controller","__WEBPACK_IMPORTED_MODULE_1__controller__","updateTodo","location","hash","_classCallCheck","instance","Constructor","TypeError","_setFilter","className","_elementComplete","listItem","_editItem","input","createElement","appendChild","focus","_itemId","li","dataset","_createClass","defineProperties","props","descriptor","enumerable","configurable","writable","defineProperty","protoProps","staticProps","View","ENTER_KEY","ESCAPE_KEY","$todoList","$todoItemCounter","$clearCompleted","$main","$footer","$toggleAll","$newTodo","elem","removeChild","completedCount","innerHTML","style","display","label","textContent","viewCmd","parameter","viewCommands","showEntries","_removeItem","updateElementCount","_clearCompletedButton","contentBlockVisibility","setFilter","clearNewTodo","elementComplete","editItemDone","_editItemDone","iscanceled","keyCode","blur","_bindItemEditDone","_bindItemEditCancel","bootstrap","__WEBPACK_IMPORTED_MODULE_1__helpers__","window","__WEBPACK_IMPORTED_MODULE_0__app__","readyState"],"mappings":"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","file":"bundle.app.930ad8b83126862d7445.js","sourcesContent":["webpackJsonp([0,2],[\n/* 0 */\n/***/ function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n/* harmony export */ __webpack_require__.d(exports, \"a\", function() { return qs; });\n/* harmony export */ __webpack_require__.d(exports, \"b\", function() { return qsa; });\n/* harmony export */ __webpack_require__.d(exports, \"d\", function() { return $on; });\n/* harmony export */ __webpack_require__.d(exports, \"c\", function() { return $delegate; });\n/* harmony export */ __webpack_require__.d(exports, \"e\", function() { return $parent; });\n/* harmony export */ __webpack_require__.d(exports, \"f\", function() { return remove; });\n\n// Get element(s) by CSS selector:\nfunction qs(selector, scope) {\n  return (scope || document).querySelector(selector);\n}\n\nfunction qsa(selector, scope) {\n  return (scope || document).querySelectorAll(selector);\n}\n\n// addEventListener wrapper:\nfunction $on(target, type, callback, useCapture) {\n  target.addEventListener(type, callback, !!useCapture);\n}\n\n// Attach a handler to event for all elements that match the selector,\n// now or in the future, based on a root element\nfunction $delegate(target, selector, type, handler) {\n  // https://developer.mozilla.org/en-US/docs/Web/Events/blur\n  var useCapture = type === 'blur' || type === 'focus';\n  $on(target, type, dispatchEvent, useCapture);\n\n  function dispatchEvent(event) {\n    var targetElement = event.target;\n    var potentialElements = qsa(selector, target);\n    var hasMatch = Array.prototype.indexOf.call(potentialElements, targetElement) >= 0;\n\n    if (hasMatch) {\n      handler.call(targetElement, event);\n    }\n  }\n}\n\n// Find the element's parent with the given tag name:\n// $parent(qs('a'), 'div');\nfunction $parent(element, tagName) {\n  if (!element.parentNode) {\n    return undefined;\n  }\n  if (element.parentNode.tagName.toLowerCase() === tagName.toLowerCase()) {\n    return element.parentNode;\n  }\n  return $parent(element.parentNode, tagName);\n}\n\n// removes an element from an array\n// const x = [1,2,3]\n// remove(x, 2)\n// x ~== [1,3]\nfunction remove(array, thing) {\n  var index = array.indexOf(thing);\n  if (index === -1) {\n    return array;\n  }\n  array.splice(index, 1);\n}\n\n// Allow for looping on nodes by chaining:\n// qsa('.foo').forEach(function () {})\nNodeList.prototype.forEach = Array.prototype.forEach;\n\n/***/ },\n/* 1 */,\n/* 2 */\n/***/ function(module, exports, __webpack_require__) {\n\n\"use strict\";\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_todomvc_app_css_index_css__ = __webpack_require__(1);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_todomvc_app_css_index_css___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_0_todomvc_app_css_index_css__);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__app_css__ = __webpack_require__(10);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__app_css___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_1__app_css__);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__helpers__ = __webpack_require__(0);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__todo__ = __webpack_require__(8);\n/* harmony export */ exports[\"a\"] = onLoad;\n\n\n\n\n\nfunction onLoad() {\n  // eslint-disable-line import/prefer-default-export\n  __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_3__todo__[\"a\" /* updateTodo */])();\n}\n\n/***/ },\n/* 3 */\n/***/ function(module, exports, __webpack_require__) {\n\n\"use strict\";\n/* harmony default export */ exports[\"a\"] = Controller;\n\n/**\n* Takes a model and view and acts as the controller between them\n*\n* @constructor\n* @param {object} model The model instance\n* @param {object} view The view instance\n*/\nfunction Controller(model, view) {\n  var that = this;\n  that.model = model;\n  that.view = view;\n\n  that.view.bind('newTodo', function (title) {\n    that.addItem(title);\n  });\n\n  that.view.bind('itemEdit', function (item) {\n    that.editItem(item.id);\n  });\n\n  that.view.bind('itemEditDone', function (item) {\n    that.editItemSave(item.id, item.title);\n  });\n\n  that.view.bind('itemEditCancel', function (item) {\n    that.editItemCancel(item.id);\n  });\n\n  that.view.bind('itemRemove', function (item) {\n    that.removeItem(item.id);\n  });\n\n  that.view.bind('itemToggle', function (item) {\n    that.toggleComplete(item.id, item.completed);\n  });\n\n  that.view.bind('removeCompleted', function () {\n    that.removeCompletedItems();\n  });\n\n  that.view.bind('toggleAll', function (status) {\n    that.toggleAll(status.completed);\n  });\n}\n\n/**\n* Loads and initialises the view\n*\n* @param {string} '' | 'active' | 'completed'\n*/\nController.prototype.setView = function (locationHash) {\n  var route = locationHash.split('/')[1];\n  var page = route || '';\n  this._updateFilterState(page);\n};\n\n/**\n* An event to fire on load. Will get all items and display them in the\n* todo-list\n*/\nController.prototype.showAll = function () {\n  var that = this;\n  that.model.read(function (data) {\n    that.view.render('showEntries', data);\n  });\n};\n\n/**\n* Renders all active tasks\n*/\nController.prototype.showActive = function () {\n  var that = this;\n  that.model.read({ completed: false }, function (data) {\n    that.view.render('showEntries', data);\n  });\n};\n\n/**\n* Renders all completed tasks\n*/\nController.prototype.showCompleted = function () {\n  var that = this;\n  that.model.read({ completed: true }, function (data) {\n    that.view.render('showEntries', data);\n  });\n};\n\n/**\n* An event to fire whenever you want to add an item. Simply pass in the event\n* object and it'll handle the DOM insertion and saving of the new item.\n*/\nController.prototype.addItem = function (title) {\n  var that = this;\n\n  if (title.trim() === '') {\n    return;\n  }\n\n  that.model.create(title, function () {\n    that.view.render('clearNewTodo');\n    that._filter(true);\n  });\n};\n\n/*\n* Triggers the item editing mode.\n*/\nController.prototype.editItem = function (id) {\n  var that = this;\n  that.model.read(id, function (data) {\n    that.view.render('editItem', { id: id, title: data[0].title });\n  });\n};\n\n/*\n* Finishes the item editing mode successfully.\n*/\nController.prototype.editItemSave = function (id, title) {\n  var that = this;\n  if (title.trim()) {\n    that.model.update(id, { title: title }, function () {\n      that.view.render('editItemDone', { id: id, title: title });\n    });\n  } else {\n    that.removeItem(id);\n  }\n};\n\n/*\n* Cancels the item editing mode.\n*/\nController.prototype.editItemCancel = function (id) {\n  var that = this;\n  that.model.read(id, function (data) {\n    that.view.render('editItemDone', { id: id, title: data[0].title });\n  });\n};\n\n/**\n* By giving it an ID it'll find the DOM element matching that ID,\n* remove it from the DOM and also remove it from storage.\n*\n* @param {number} id The ID of the item to remove from the DOM and\n* storage\n*/\nController.prototype.removeItem = function (id) {\n  var that = this;\n  that.model.remove(id, function () {\n    that.view.render('removeItem', id);\n  });\n\n  that._filter();\n};\n\n/**\n* Will remove all completed items from the DOM and storage.\n*/\nController.prototype.removeCompletedItems = function () {\n  var that = this;\n  that.model.read({ completed: true }, function (data) {\n    data.forEach(function (item) {\n      that.removeItem(item.id);\n    });\n  });\n\n  that._filter();\n};\n\n/**\n* Give it an ID of a model and a checkbox and it will update the item\n* in storage based on the checkbox's state.\n*\n* @param {number} id The ID of the element to complete or uncomplete\n* @param {object} checkbox The checkbox to check the state of complete\n*                          or not\n* @param {boolean|undefined} silent Prevent re-filtering the todo items\n*/\nController.prototype.toggleComplete = function (id, completed, silent) {\n  var that = this;\n  that.model.update(id, { completed: completed }, function () {\n    that.view.render('elementComplete', {\n      id: id,\n      completed: completed\n    });\n  });\n\n  if (!silent) {\n    that._filter();\n  }\n};\n\n/**\n* Will toggle ALL checkboxes' on/off state and completeness of models.\n* Just pass in the event object.\n*/\nController.prototype.toggleAll = function (completed) {\n  var that = this;\n  that.model.read({ completed: !completed }, function (data) {\n    data.forEach(function (item) {\n      that.toggleComplete(item.id, completed, true);\n    });\n  });\n\n  that._filter();\n};\n\n/**\n* Updates the pieces of the page which change depending on the remaining\n* number of todos.\n*/\nController.prototype._updateCount = function () {\n  var that = this;\n  that.model.getCount(function (todos) {\n    that.view.render('updateElementCount', todos.active);\n    that.view.render('clearCompletedButton', {\n      completed: todos.completed,\n      visible: todos.completed > 0\n    });\n\n    that.view.render('toggleAll', { checked: todos.completed === todos.total });\n    that.view.render('contentBlockVisibility', { visible: todos.total > 0 });\n  });\n};\n\n/**\n* Re-filters the todo items, based on the active route.\n* @param {boolean|undefined} force  forces a re-painting of todo items.\n*/\nController.prototype._filter = function (force) {\n  var activeRoute = this._activeRoute.charAt(0).toUpperCase() + this._activeRoute.substr(1);\n\n  // Update the elements on the page, which change with each completed todo\n  this._updateCount();\n\n  // If the last active route isn't \"All\", or we're switching routes, we\n  // re-create the todo item elements, calling:\n  //   this.show[All|Active|Completed]();\n  if (force || this._lastActiveRoute !== 'All' || this._lastActiveRoute !== activeRoute) {\n    this['show' + activeRoute]();\n  }\n\n  this._lastActiveRoute = activeRoute;\n};\n\n/**\n* Simply updates the filter nav's selected states\n*/\nController.prototype._updateFilterState = function (currentPage) {\n  // Store a reference to the active route, allowing us to re-filter todo\n  // items as they are marked complete or incomplete.\n  currentPage = currentPage.split('?')[0];\n  this._activeRoute = currentPage;\n\n  if (currentPage === '') {\n    this._activeRoute = 'All';\n  }\n\n  this._filter();\n\n  this.view.render('setFilter', currentPage);\n};\n\n/***/ },\n/* 4 */\n/***/ function(module, exports, __webpack_require__) {\n\nvar _typeof = typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; };\n\n(function (root) {\n  var localStorageMemory = {};\n  var cache = {};\n\n  /**\n   * number of stored items.\n   */\n  localStorageMemory.length = 0;\n\n  /**\n   * returns item for passed key, or null\n   *\n   * @para {String} key\n   *       name of item to be returned\n   * @returns {String|null}\n   */\n  localStorageMemory.getItem = function (key) {\n    return cache[key] || null;\n  };\n\n  /**\n   * sets item for key to passed value, as String\n   *\n   * @para {String} key\n   *       name of item to be set\n   * @para {String} value\n   *       value, will always be turned into a String\n   * @returns {undefined}\n   */\n  localStorageMemory.setItem = function (key, value) {\n    if (typeof value === 'undefined') {\n      localStorageMemory.removeItem(key);\n    } else {\n      if (!cache.hasOwnProperty(key)) {\n        localStorageMemory.length++;\n      }\n\n      cache[key] = '' + value;\n    }\n  };\n\n  /**\n   * removes item for passed key\n   *\n   * @para {String} key\n   *       name of item to be removed\n   * @returns {undefined}\n   */\n  localStorageMemory.removeItem = function (key) {\n    if (cache.hasOwnProperty(key)) {\n      delete cache[key];\n      localStorageMemory.length--;\n    }\n  };\n\n  /**\n   * returns name of key at passed index\n   *\n   * @para {Number} index\n   *       Position for key to be returned (starts at 0)\n   * @returns {String|null}\n   */\n  localStorageMemory.key = function (index) {\n    return Object.keys(cache)[index] || null;\n  };\n\n  /**\n   * removes all stored items and sets length to 0\n   *\n   * @returns {undefined}\n   */\n  localStorageMemory.clear = function () {\n    cache = {};\n    localStorageMemory.length = 0;\n  };\n\n  if (( false ? 'undefined' : _typeof(exports)) === 'object') {\n    module.exports = localStorageMemory;\n  } else {\n    root.localStorageMemory = localStorageMemory;\n  }\n})(this);\n\n/***/ },\n/* 5 */\n/***/ function(module, exports, __webpack_require__) {\n\n\"use strict\";\nvar _typeof = typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; };\n\n/* harmony default export */ exports[\"a\"] = Model;\n\n/**\n* Creates a new Model instance and hooks up the storage.\n*\n* @constructor\n* @param {object} storage A reference to the client side storage class\n*/\nfunction Model(storage) {\n  this.storage = storage;\n}\n\n/**\n* Creates a new todo model\n*\n* @param {string} [title] The title of the task\n* @param {function} [callback] The callback to fire after the model is created\n*/\nModel.prototype.create = function (title, callback) {\n  title = title || '';\n  callback = callback || function () {};\n\n  var newItem = {\n    title: title.trim(),\n    completed: false\n  };\n\n  this.storage.save(newItem, callback);\n};\n\n/**\n * Finds and returns a model in storage. If no query is given it'll simply\n * return everything. If you pass in a string or number it'll look that up as\n * the ID of the model to find. Lastly, you can pass it an object to match against.\n *\n * @param {string|number|object} [query] A query to match models against\n * @param {function} [callback] The callback to fire after the model is found\n *\n * @example\n * model.read(1, func); // Will find the model with an ID of 1\n * model.read('1'); // Same as above\n * //Below will find a model with foo equalling bar and hello equalling world.\n * model.read({ foo: 'bar', hello: 'world' });\n */\nModel.prototype.read = function (query, callback) {\n  var queryType = typeof query === 'undefined' ? 'undefined' : _typeof(query);\n  callback = callback || function () {};\n\n  if (queryType === 'function') {\n    callback = query;\n    return this.storage.findAll(callback);\n  } else if (queryType === 'string' || queryType === 'number') {\n    query = parseInt(query, 10);\n    this.storage.find({ id: query }, callback);\n  } else {\n    this.storage.find(query, callback);\n  }\n  return undefined;\n};\n\n/**\n* Updates a model by giving it an ID, data to update, and a callback to fire when\n* the update is complete.\n*\n* @param {number} id The id of the model to update\n* @param {object} data The properties to update and their new value\n* @param {function} callback The callback to fire when the update is complete.\n*/\nModel.prototype.update = function (id, data, callback) {\n  this.storage.save(data, callback, id);\n};\n\n/**\n* Removes a model from storage\n*\n* @param {number} id The ID of the model to remove\n* @param {function} callback The callback to fire when the removal is complete.\n*/\nModel.prototype.remove = function (id, callback) {\n  this.storage.remove(id, callback);\n};\n\n/**\n* WARNING: Will remove ALL data from storage.\n*\n* @param {function} callback The callback to fire when the storage is wiped.\n*/\nModel.prototype.removeAll = function (callback) {\n  this.storage.drop(callback);\n};\n\n/**\n* Returns a count of all todos\n*/\nModel.prototype.getCount = function (callback) {\n  var todos = {\n    active: 0,\n    completed: 0,\n    total: 0\n  };\n\n  this.storage.findAll(function (data) {\n    data.forEach(function (todo) {\n      if (todo.completed) {\n        todos.completed++;\n      } else {\n        todos.active++;\n      }\n\n      todos.total++;\n    });\n    callback(todos);\n  });\n};\n\n/***/ },\n/* 6 */\n/***/ function(module, exports, __webpack_require__) {\n\n\"use strict\";\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__helpers__ = __webpack_require__(0);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__memory__ = __webpack_require__(4);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__memory___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_1__memory__);\n\n\n/* harmony default export */ exports[\"a\"] = Store;\n\nvar uniqueID = 1;\n\n/**\n * Creates a new client side storage object and will create an empty\n * collection if no collection already exists.\n *\n * @param {string} name The name of our DB we want to use\n * @param {function} callback Our fake DB uses callbacks because in\n * real life you probably would be making AJAX calls\n */\nfunction Store(name, callback) {\n  callback = callback || function () {};\n\n  this._dbName = name;\n\n  if (!__WEBPACK_IMPORTED_MODULE_1__memory__[name]) {\n    var data = {\n      todos: []\n    };\n\n    __WEBPACK_IMPORTED_MODULE_1__memory__[name] = JSON.stringify(data);\n  }\n\n  callback.call(this, JSON.parse(__WEBPACK_IMPORTED_MODULE_1__memory__[name]));\n  this.subscribers = [];\n}\n\nStore.prototype.subscribe = function (subscriber) {\n  var _this = this;\n\n  this.subscribers.push(subscriber);\n  return function () {\n    return __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0__helpers__[\"f\" /* remove */])(_this.subscribers, subscriber);\n  };\n};\n\nStore.prototype._notify = function () {\n  this.subscribers.forEach(function (s) {\n    return s();\n  });\n};\n\n/**\n* Finds items based on a query given as a JS object\n*\n* @param {object} query The query to match against (i.e. {foo: 'bar'})\n* @param {function} callback   The callback to fire when the query has\n* completed running\n*\n* @example\n* db.find({foo: 'bar', hello: 'world'}, function (data) {\n*   // data will return any items that have foo: bar and\n*   // hello: world in their properties\n* });\n*/\nStore.prototype.find = function (query, callback) {\n  if (!callback) {\n    return;\n  }\n\n  var todos = JSON.parse(__WEBPACK_IMPORTED_MODULE_1__memory__[this._dbName]).todos;\n\n  callback.call(this, todos.filter(function (todo) {\n    for (var q in query) {\n      if (query[q] !== todo[q]) {\n        return false;\n      }\n    }\n    return true;\n  }));\n};\n\n/**\n* Will retrieve all data from the collection\n*\n* @param {function} callback The callback to fire upon retrieving data\n*/\nStore.prototype.findAll = function (callback) {\n  callback = callback || function () {};\n  callback.call(this, JSON.parse(__WEBPACK_IMPORTED_MODULE_1__memory__[this._dbName]).todos);\n};\n\n/**\n* Will save the given data to the DB. If no item exists it will create a new\n* item, otherwise it'll simply update an existing item's properties\n*\n* @param {object} updateData The data to save back into the DB\n* @param {function} callback The callback to fire after saving\n* @param {number} id An optional param to enter an ID of an item to update\n*/\nStore.prototype.save = function (updateData, callback, id) {\n  var data = JSON.parse(__WEBPACK_IMPORTED_MODULE_1__memory__[this._dbName]);\n  var todos = data.todos;\n\n  callback = callback || function () {};\n\n  // If an ID was actually given, find the item and update each property\n  if (id) {\n    for (var i = 0; i < todos.length; i++) {\n      if (todos[i].id === id) {\n        for (var key in updateData) {\n          // eslint-disable-line guard-for-in\n          todos[i][key] = updateData[key];\n        }\n        break;\n      }\n    }\n\n    __WEBPACK_IMPORTED_MODULE_1__memory__[this._dbName] = JSON.stringify(data);\n    callback.call(this, JSON.parse(__WEBPACK_IMPORTED_MODULE_1__memory__[this._dbName]).todos);\n  } else {\n    // Generate an ID\n    updateData.id = uniqueID++;\n\n    todos.push(updateData);\n    __WEBPACK_IMPORTED_MODULE_1__memory__[this._dbName] = JSON.stringify(data);\n    callback.call(this, [updateData]);\n  }\n  this._notify();\n};\n\n/**\n* Will remove an item from the Store based on its ID\n*\n* @param {number} id The ID of the item you want to remove\n* @param {function} callback The callback to fire after saving\n*/\nStore.prototype.remove = function (id, callback) {\n  var data = JSON.parse(__WEBPACK_IMPORTED_MODULE_1__memory__[this._dbName]);\n  var todos = data.todos;\n\n  for (var i = 0; i < todos.length; i++) {\n    if (todos[i].id === id) {\n      todos.splice(i, 1);\n      break;\n    }\n  }\n\n  __WEBPACK_IMPORTED_MODULE_1__memory__[this._dbName] = JSON.stringify(data);\n  callback.call(this, JSON.parse(__WEBPACK_IMPORTED_MODULE_1__memory__[this._dbName]).todos);\n  this._notify();\n};\n\n/**\n* Will drop all storage and start fresh\n*\n* @param {function} callback The callback to fire after dropping the data\n*/\nStore.prototype.drop = function (callback) {\n  __WEBPACK_IMPORTED_MODULE_1__memory__[this._dbName] = JSON.stringify({ todos: [] });\n  callback.call(this, JSON.parse(__WEBPACK_IMPORTED_MODULE_1__memory__[this._dbName]).todos);\n  this._notify();\n};\n\n/***/ },\n/* 7 */\n/***/ function(module, exports, __webpack_require__) {\n\n\"use strict\";\n/* harmony default export */ exports[\"a\"] = Template;\n\nvar htmlEscapes = {\n  '&': '&amp;',\n  '<': '&lt;',\n  '>': '&gt;',\n  '\"': '&quot;',\n  '\\'': '&#x27;',\n  '`': '&#x60;'\n};\n\nvar escapeHtmlChar = function escapeHtmlChar(chr) {\n  return htmlEscapes[chr];\n};\n\nvar reUnescapedHtml = /[&<>\"'`]/g;\nvar reHasUnescapedHtml = new RegExp(reUnescapedHtml.source);\n\nvar escape = function escape(string) {\n  if (string && reHasUnescapedHtml.test(string)) {\n    return string.replace(reUnescapedHtml, escapeHtmlChar);\n  } else {\n    return string;\n  }\n};\n\n/**\n* Sets up defaults for all the Template methods such as a default template\n*\n* @constructor\n*/\nfunction Template() {\n  this.defaultTemplate = '\\n    <li data-id=\"{{id}}\" class=\"{{completed}}\">\\n      <div class=\"view\">\\n        <input class=\"toggle\" type=\"checkbox\" {{checked}} />\\n        <label>{{title}}</label>\\n        <button class=\"destroy\"></button>\\n      </div>\\n    </li>\\n  ';\n}\n\n/**\n * Creates an <li> HTML string and returns it for placement in your app.\n *\n * NOTE: In real life you should be using a templating engine such as Mustache\n * or Handlebars, however, this is a vanilla JS example.\n *\n * @param {object} data The object containing keys you want to find in the\n *                      template to replace.\n * @returns {string} HTML String of an <li> element\n *\n * @example\n * view.show({\n *  id: 1,\n *  title: \"Hello World\",\n *  completed: 0,\n * });\n */\nTemplate.prototype.show = function (data) {\n  var i, l;\n  var view = '';\n\n  for (i = 0, l = data.length; i < l; i++) {\n    var template = this.defaultTemplate;\n    var completed = '';\n    var checked = '';\n\n    if (data[i].completed) {\n      completed = 'completed';\n      checked = 'checked';\n    }\n\n    template = template.replace('{{id}}', data[i].id);\n    template = template.replace('{{title}}', escape(data[i].title));\n    template = template.replace('{{completed}}', completed);\n    template = template.replace('{{checked}}', checked);\n\n    view = view + template;\n  }\n\n  return view;\n};\n\n/**\n * Displays a counter of how many to dos are left to complete\n *\n * @param {number} activeTodos The number of active todos.\n * @returns {string} String containing the count\n */\nTemplate.prototype.itemCounter = function (activeTodos) {\n  var plural = activeTodos === 1 ? '' : 's';\n\n  return '<strong>' + activeTodos + '</strong> item' + plural + ' left';\n};\n\n/**\n * Updates the text within the \"Clear completed\" button\n *\n * @param  {[type]} completedTodos The number of completed todos.\n * @returns {string} String containing the count\n */\nTemplate.prototype.clearCompletedButton = function (completedTodos) {\n  if (completedTodos > 0) {\n    return 'Clear completed';\n  } else {\n    return '';\n  }\n};\n\n/***/ },\n/* 8 */\n/***/ function(module, exports, __webpack_require__) {\n\n\"use strict\";\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__view__ = __webpack_require__(9);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__controller__ = __webpack_require__(3);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__model__ = __webpack_require__(5);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__store__ = __webpack_require__(6);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__template__ = __webpack_require__(7);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_5__helpers__ = __webpack_require__(0);\n\n/* harmony export */ __webpack_require__.d(exports, \"a\", function() { return updateTodo; });/* unused harmony export getTodo *//* unused harmony export subscribe */\n\n\n\n\n\n\n\n\nvar todo = void 0;\nvar subscribers = [];\n\n/**\n * Sets up a brand new Todo list.\n *\n * @param {string} name The name of your new to do list.\n */\nfunction Todo(name) {\n  this.storage = new __WEBPACK_IMPORTED_MODULE_3__store__[\"a\" /* default */](name);\n  this.model = new __WEBPACK_IMPORTED_MODULE_2__model__[\"a\" /* default */](this.storage);\n  this.template = new __WEBPACK_IMPORTED_MODULE_4__template__[\"a\" /* default */]();\n  this.view = new __WEBPACK_IMPORTED_MODULE_0__view__[\"a\" /* default */](this.template);\n  this.controller = new __WEBPACK_IMPORTED_MODULE_1__controller__[\"a\" /* default */](this.model, this.view);\n}\n\nfunction updateTodo() {\n  todo = new Todo('todos-vanillajs');\n  todo.controller.setView(document.location.hash);\n  subscribers.forEach(function (s) {\n    return s();\n  });\n}\n\nfunction getTodo() {\n  return todo;\n}\n\nfunction subscribe(cb) {\n  subscribers.push(cb);\n  return function unsubscribe() {\n    __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_5__helpers__[\"f\" /* remove */])(subscribers, cb);\n  };\n}\n\n/***/ },\n/* 9 */\n/***/ function(module, exports, __webpack_require__) {\n\n\"use strict\";\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__helpers__ = __webpack_require__(0);\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\n/* eslint no-invalid-this: 0, complexity:[2, 9] */\n\n\n/**\n * View that abstracts away the browser's DOM completely.\n * It has two simple entry points:\n *\n *   - bind(eventName, handler)\n *     Takes a todo application event and registers the handler\n *   - render(command, parameterObject)\n *     Renders the given command with the options\n */\n\nvar View = function () {\n  function View(template) {\n    _classCallCheck(this, View);\n\n    this.template = template;\n\n    this.ENTER_KEY = 13;\n    this.ESCAPE_KEY = 27;\n\n    this.$todoList = __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0__helpers__[\"a\" /* qs */])('.todo-list');\n    this.$todoItemCounter = __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0__helpers__[\"a\" /* qs */])('.todo-count');\n    this.$clearCompleted = __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0__helpers__[\"a\" /* qs */])('.clear-completed');\n    this.$main = __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0__helpers__[\"a\" /* qs */])('.main');\n    this.$footer = __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0__helpers__[\"a\" /* qs */])('.footer');\n    this.$toggleAll = __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0__helpers__[\"a\" /* qs */])('.toggle-all');\n    this.$newTodo = __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0__helpers__[\"a\" /* qs */])('.new-todo');\n  }\n\n  _createClass(View, [{\n    key: '_removeItem',\n    value: function _removeItem(id) {\n      var elem = __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0__helpers__[\"a\" /* qs */])('[data-id=\"' + id + '\"]');\n\n      if (elem) {\n        this.$todoList.removeChild(elem);\n      }\n    }\n  }, {\n    key: '_clearCompletedButton',\n    value: function _clearCompletedButton(completedCount, visible) {\n      this.$clearCompleted.innerHTML = this.template.clearCompletedButton(completedCount);\n      this.$clearCompleted.style.display = visible ? 'block' : 'none';\n    }\n  }, {\n    key: '_editItemDone',\n    value: function _editItemDone(id, title) {\n      var listItem = __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0__helpers__[\"a\" /* qs */])('[data-id=\"' + id + '\"]');\n\n      if (!listItem) {\n        return;\n      }\n\n      var input = __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0__helpers__[\"a\" /* qs */])('input.edit', listItem);\n      listItem.removeChild(input);\n\n      listItem.className = listItem.className.replace('editing', '');\n\n      __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0__helpers__[\"b\" /* qsa */])('label', listItem).forEach(function (label) {\n        label.textContent = title;\n      });\n    }\n  }, {\n    key: 'render',\n    value: function render(viewCmd, parameter) {\n      var that = this;\n      var viewCommands = {\n        showEntries: function showEntries() {\n          that.$todoList.innerHTML = that.template.show(parameter);\n        },\n        removeItem: function removeItem() {\n          that._removeItem(parameter);\n        },\n        updateElementCount: function updateElementCount() {\n          that.$todoItemCounter.innerHTML = that.template.itemCounter(parameter);\n        },\n        clearCompletedButton: function clearCompletedButton() {\n          that._clearCompletedButton(parameter.completed, parameter.visible);\n        },\n        contentBlockVisibility: function contentBlockVisibility() {\n          that.$main.style.display = that.$footer.style.display = parameter.visible ? 'block' : 'none';\n        },\n        toggleAll: function toggleAll() {\n          that.$toggleAll.checked = parameter.checked;\n        },\n        setFilter: function setFilter() {\n          _setFilter(parameter);\n        },\n        clearNewTodo: function clearNewTodo() {\n          that.$newTodo.value = '';\n        },\n        elementComplete: function elementComplete() {\n          _elementComplete(parameter.id, parameter.completed);\n        },\n        editItem: function editItem() {\n          _editItem(parameter.id, parameter.title);\n        },\n        editItemDone: function editItemDone() {\n          that._editItemDone(parameter.id, parameter.title);\n        }\n      };\n\n      viewCommands[viewCmd]();\n    }\n  }, {\n    key: '_bindItemEditDone',\n    value: function _bindItemEditDone(handler) {\n      var that = this;\n      __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0__helpers__[\"c\" /* $delegate */])(that.$todoList, 'li .edit', 'blur', function () {\n        if (!this.dataset.iscanceled) {\n          handler({\n            id: _itemId(this),\n            title: this.value\n          });\n        }\n      });\n\n      __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0__helpers__[\"c\" /* $delegate */])(that.$todoList, 'li .edit', 'keypress', function (event) {\n        if (event.keyCode === that.ENTER_KEY) {\n          // Remove the cursor from the input when you hit enter just like if it\n          // were a real form\n          this.blur();\n        }\n      });\n    }\n  }, {\n    key: '_bindItemEditCancel',\n    value: function _bindItemEditCancel(handler) {\n      var that = this;\n      __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0__helpers__[\"c\" /* $delegate */])(that.$todoList, 'li .edit', 'keyup', function (event) {\n        if (event.keyCode === that.ESCAPE_KEY) {\n          this.dataset.iscanceled = true;\n          this.blur();\n\n          handler({ id: _itemId(this) });\n        }\n      });\n    }\n  }, {\n    key: 'bind',\n    value: function bind(event, handler) {\n      var that = this;\n      if (event === 'newTodo') {\n        __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0__helpers__[\"d\" /* $on */])(that.$newTodo, 'change', function () {\n          handler(that.$newTodo.value);\n        });\n      } else if (event === 'removeCompleted') {\n        __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0__helpers__[\"d\" /* $on */])(that.$clearCompleted, 'click', function () {\n          handler();\n        });\n      } else if (event === 'toggleAll') {\n        __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0__helpers__[\"d\" /* $on */])(that.$toggleAll, 'click', function () {\n          handler({ completed: this.checked });\n        });\n      } else if (event === 'itemEdit') {\n        __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0__helpers__[\"c\" /* $delegate */])(that.$todoList, 'li label', 'dblclick', function () {\n          handler({ id: _itemId(this) });\n        });\n      } else if (event === 'itemRemove') {\n        __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0__helpers__[\"c\" /* $delegate */])(that.$todoList, '.destroy', 'click', function () {\n          handler({ id: _itemId(this) });\n        });\n      } else if (event === 'itemToggle') {\n        __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0__helpers__[\"c\" /* $delegate */])(that.$todoList, '.toggle', 'click', function () {\n          handler({\n            id: _itemId(this),\n            completed: this.checked\n          });\n        });\n      } else if (event === 'itemEditDone') {\n        that._bindItemEditDone(handler);\n      } else if (event === 'itemEditCancel') {\n        that._bindItemEditCancel(handler);\n      }\n    }\n  }]);\n\n  return View;\n}();\n\n/* harmony default export */ exports[\"a\"] = View;\n\n\nfunction _setFilter(currentPage) {\n  __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0__helpers__[\"a\" /* qs */])('.filters .selected').className = '';\n  __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0__helpers__[\"a\" /* qs */])('.filters [href=\"#/' + currentPage + '\"]').className = 'selected';\n}\n\nfunction _elementComplete(id, completed) {\n  var listItem = __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0__helpers__[\"a\" /* qs */])('[data-id=\"' + id + '\"]');\n\n  if (!listItem) {\n    return;\n  }\n\n  listItem.className = completed ? 'completed' : '';\n\n  // In case it was toggled from an event and not by clicking the checkbox\n  __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0__helpers__[\"a\" /* qs */])('input', listItem).checked = completed;\n}\n\nfunction _editItem(id, title) {\n  var listItem = __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0__helpers__[\"a\" /* qs */])('[data-id=\"' + id + '\"]');\n\n  if (!listItem) {\n    return;\n  }\n\n  listItem.className = listItem.className + ' editing';\n\n  var input = document.createElement('input');\n  input.className = 'edit';\n\n  listItem.appendChild(input);\n  input.focus();\n  input.value = title;\n}\n\nfunction _itemId(element) {\n  var li = __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0__helpers__[\"e\" /* $parent */])(element, 'li');\n  return parseInt(li.dataset.id, 10);\n}\n\n/***/ },\n/* 10 */\n/***/ function(module, exports) {\n\n// removed by extract-text-webpack-plugin\n\n/***/ },\n/* 11 */\n/***/ function(module, exports, __webpack_require__) {\n\n\"use strict\";\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__app__ = __webpack_require__(2);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__helpers__ = __webpack_require__(0);\n/* eslint no-console:0 */\n\n\n\n// this is only relevant when using `hot` mode with webpack\n// special thanks to Eric Clemmons: https://github.com/ericclemmons/webpack-hot-server-example\nvar reloading = document.readyState === 'complete';\nif (false) {\n  module.hot.accept(function (err) {});\n  if (reloading) {\n    onLoad();\n  } else {\n    bootstrap();\n  }\n} else {\n  bootstrap();\n}\n\nfunction bootstrap() {\n  __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_1__helpers__[\"d\" /* $on */])(window, 'load', __WEBPACK_IMPORTED_MODULE_0__app__[\"a\" /* onLoad */]);\n  __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_1__helpers__[\"d\" /* $on */])(window, 'hashchange', __WEBPACK_IMPORTED_MODULE_0__app__[\"a\" /* onLoad */]);\n}\n\n/***/ }\n],[11]);\n\n\n// WEBPACK FOOTER //\n// bundle.app.930ad8b83126862d7445.js","export {qs, qsa, $on, $delegate, $parent, remove}\n\n// Get element(s) by CSS selector:\nfunction qs(selector, scope) {\n  return (scope || document).querySelector(selector)\n}\n\nfunction qsa(selector, scope) {\n  return (scope || document).querySelectorAll(selector)\n}\n\n// addEventListener wrapper:\nfunction $on(target, type, callback, useCapture) {\n  target.addEventListener(type, callback, !!useCapture)\n}\n\n// Attach a handler to event for all elements that match the selector,\n// now or in the future, based on a root element\nfunction $delegate(target, selector, type, handler) {\n  // https://developer.mozilla.org/en-US/docs/Web/Events/blur\n  var useCapture = type === 'blur' || type === 'focus'\n  $on(target, type, dispatchEvent, useCapture)\n\n  function dispatchEvent(event) {\n    var targetElement = event.target\n    var potentialElements = qsa(selector, target)\n    var hasMatch = Array.prototype.indexOf.call(potentialElements, targetElement) >= 0\n\n    if (hasMatch) {\n      handler.call(targetElement, event)\n    }\n  }\n}\n\n// Find the element's parent with the given tag name:\n// $parent(qs('a'), 'div');\nfunction $parent(element, tagName) {\n  if (!element.parentNode) {\n    return undefined\n  }\n  if (element.parentNode.tagName.toLowerCase() === tagName.toLowerCase()) {\n    return element.parentNode\n  }\n  return $parent(element.parentNode, tagName)\n}\n\n// removes an element from an array\n// const x = [1,2,3]\n// remove(x, 2)\n// x ~== [1,3]\nfunction remove(array, thing) {\n  const index = array.indexOf(thing)\n  if (index === -1) {\n    return array\n  }\n  array.splice(index, 1)\n}\n\n// Allow for looping on nodes by chaining:\n// qsa('.foo').forEach(function () {})\nNodeList.prototype.forEach = Array.prototype.forEach\n\n\n\n// WEBPACK FOOTER //\n// ./helpers.js","import 'todomvc-app-css/index.css'\nimport './app.css'\n\nimport {$on} from './helpers'\nimport {updateTodo} from './todo'\n\nexport function onLoad() { // eslint-disable-line import/prefer-default-export\n  updateTodo()\n}\n\n\n\n// WEBPACK FOOTER //\n// ./app.js","export default Controller\n\n/**\n* Takes a model and view and acts as the controller between them\n*\n* @constructor\n* @param {object} model The model instance\n* @param {object} view The view instance\n*/\nfunction Controller(model, view) {\n  var that = this\n  that.model = model\n  that.view = view\n\n  that.view.bind('newTodo', function(title) {\n    that.addItem(title)\n  })\n\n  that.view.bind('itemEdit', function(item) {\n    that.editItem(item.id)\n  })\n\n  that.view.bind('itemEditDone', function(item) {\n    that.editItemSave(item.id, item.title)\n  })\n\n  that.view.bind('itemEditCancel', function(item) {\n    that.editItemCancel(item.id)\n  })\n\n  that.view.bind('itemRemove', function(item) {\n    that.removeItem(item.id)\n  })\n\n  that.view.bind('itemToggle', function(item) {\n    that.toggleComplete(item.id, item.completed)\n  })\n\n  that.view.bind('removeCompleted', function() {\n    that.removeCompletedItems()\n  })\n\n  that.view.bind('toggleAll', function(status) {\n    that.toggleAll(status.completed)\n  })\n}\n\n/**\n* Loads and initialises the view\n*\n* @param {string} '' | 'active' | 'completed'\n*/\nController.prototype.setView = function(locationHash) {\n  var route = locationHash.split('/')[1]\n  var page = route || ''\n  this._updateFilterState(page)\n}\n\n/**\n* An event to fire on load. Will get all items and display them in the\n* todo-list\n*/\nController.prototype.showAll = function() {\n  var that = this\n  that.model.read(function(data) {\n    that.view.render('showEntries', data)\n  })\n}\n\n/**\n* Renders all active tasks\n*/\nController.prototype.showActive = function() {\n  var that = this\n  that.model.read({completed: false}, function(data) {\n    that.view.render('showEntries', data)\n  })\n}\n\n/**\n* Renders all completed tasks\n*/\nController.prototype.showCompleted = function() {\n  var that = this\n  that.model.read({completed: true}, function(data) {\n    that.view.render('showEntries', data)\n  })\n}\n\n/**\n* An event to fire whenever you want to add an item. Simply pass in the event\n* object and it'll handle the DOM insertion and saving of the new item.\n*/\nController.prototype.addItem = function(title) {\n  var that = this\n\n  if (title.trim() === '') {\n    return\n  }\n\n  that.model.create(title, function() {\n    that.view.render('clearNewTodo')\n    that._filter(true)\n  })\n}\n\n/*\n* Triggers the item editing mode.\n*/\nController.prototype.editItem = function(id) {\n  var that = this\n  that.model.read(id, function(data) {\n    that.view.render('editItem', {id, title: data[0].title})\n  })\n}\n\n/*\n* Finishes the item editing mode successfully.\n*/\nController.prototype.editItemSave = function(id, title) {\n  var that = this\n  if (title.trim()) {\n    that.model.update(id, {title}, function() {\n      that.view.render('editItemDone', {id, title})\n    })\n  } else {\n    that.removeItem(id)\n  }\n}\n\n/*\n* Cancels the item editing mode.\n*/\nController.prototype.editItemCancel = function(id) {\n  var that = this\n  that.model.read(id, function(data) {\n    that.view.render('editItemDone', {id, title: data[0].title})\n  })\n}\n\n/**\n* By giving it an ID it'll find the DOM element matching that ID,\n* remove it from the DOM and also remove it from storage.\n*\n* @param {number} id The ID of the item to remove from the DOM and\n* storage\n*/\nController.prototype.removeItem = function(id) {\n  var that = this\n  that.model.remove(id, function() {\n    that.view.render('removeItem', id)\n  })\n\n  that._filter()\n}\n\n/**\n* Will remove all completed items from the DOM and storage.\n*/\nController.prototype.removeCompletedItems = function() {\n  var that = this\n  that.model.read({completed: true}, function(data) {\n    data.forEach(function(item) {\n      that.removeItem(item.id)\n    })\n  })\n\n  that._filter()\n}\n\n/**\n* Give it an ID of a model and a checkbox and it will update the item\n* in storage based on the checkbox's state.\n*\n* @param {number} id The ID of the element to complete or uncomplete\n* @param {object} checkbox The checkbox to check the state of complete\n*                          or not\n* @param {boolean|undefined} silent Prevent re-filtering the todo items\n*/\nController.prototype.toggleComplete = function(id, completed, silent) {\n  var that = this\n  that.model.update(id, {completed}, function() {\n    that.view.render('elementComplete', {\n      id,\n      completed,\n    })\n  })\n\n  if (!silent) {\n    that._filter()\n  }\n}\n\n/**\n* Will toggle ALL checkboxes' on/off state and completeness of models.\n* Just pass in the event object.\n*/\nController.prototype.toggleAll = function(completed) {\n  var that = this\n  that.model.read({completed: !completed}, function(data) {\n    data.forEach(function(item) {\n      that.toggleComplete(item.id, completed, true)\n    })\n  })\n\n  that._filter()\n}\n\n/**\n* Updates the pieces of the page which change depending on the remaining\n* number of todos.\n*/\nController.prototype._updateCount = function() {\n  var that = this\n  that.model.getCount(function(todos) {\n    that.view.render('updateElementCount', todos.active)\n    that.view.render('clearCompletedButton', {\n      completed: todos.completed,\n      visible: todos.completed > 0\n    })\n\n    that.view.render('toggleAll', {checked: todos.completed === todos.total})\n    that.view.render('contentBlockVisibility', {visible: todos.total > 0})\n  })\n}\n\n/**\n* Re-filters the todo items, based on the active route.\n* @param {boolean|undefined} force  forces a re-painting of todo items.\n*/\nController.prototype._filter = function(force) {\n  var activeRoute = this._activeRoute.charAt(0).toUpperCase() + this._activeRoute.substr(1)\n\n  // Update the elements on the page, which change with each completed todo\n  this._updateCount()\n\n  // If the last active route isn't \"All\", or we're switching routes, we\n  // re-create the todo item elements, calling:\n  //   this.show[All|Active|Completed]();\n  if (force || this._lastActiveRoute !== 'All' || this._lastActiveRoute !== activeRoute) {\n    this['show' + activeRoute]()\n  }\n\n  this._lastActiveRoute = activeRoute\n}\n\n/**\n* Simply updates the filter nav's selected states\n*/\nController.prototype._updateFilterState = function(currentPage) {\n  // Store a reference to the active route, allowing us to re-filter todo\n  // items as they are marked complete or incomplete.\n  currentPage = currentPage.split('?')[0]\n  this._activeRoute = currentPage\n\n  if (currentPage === '') {\n    this._activeRoute = 'All'\n  }\n\n  this._filter()\n\n  this.view.render('setFilter', currentPage)\n}\n\n\n\n// WEBPACK FOOTER //\n// ./controller.js","(function(root) {\n  var localStorageMemory = {};\n  var cache = {};\n\n  /**\n   * number of stored items.\n   */\n  localStorageMemory.length = 0;\n\n  /**\n   * returns item for passed key, or null\n   *\n   * @para {String} key\n   *       name of item to be returned\n   * @returns {String|null}\n   */\n  localStorageMemory.getItem = function(key) {\n    return cache[key] || null;\n  };\n\n  /**\n   * sets item for key to passed value, as String\n   *\n   * @para {String} key\n   *       name of item to be set\n   * @para {String} value\n   *       value, will always be turned into a String\n   * @returns {undefined}\n   */\n  localStorageMemory.setItem = function(key, value) {\n    if (typeof value === 'undefined') {\n      localStorageMemory.removeItem(key);\n    } else {\n      if (!(cache.hasOwnProperty(key))) {\n        localStorageMemory.length++;\n      }\n\n      cache[key] = '' + value;\n    }\n  };\n\n  /**\n   * removes item for passed key\n   *\n   * @para {String} key\n   *       name of item to be removed\n   * @returns {undefined}\n   */\n  localStorageMemory.removeItem = function(key) {\n    if (cache.hasOwnProperty(key)) {\n      delete cache[key];\n      localStorageMemory.length--;\n    }\n  };\n\n  /**\n   * returns name of key at passed index\n   *\n   * @para {Number} index\n   *       Position for key to be returned (starts at 0)\n   * @returns {String|null}\n   */\n  localStorageMemory.key = function(index) {\n    return Object.keys(cache)[index] || null;\n  };\n\n  /**\n   * removes all stored items and sets length to 0\n   *\n   * @returns {undefined}\n   */\n  localStorageMemory.clear = function() {\n    cache = {};\n    localStorageMemory.length = 0;\n  };\n\n  if (typeof exports === 'object') {\n    module.exports = localStorageMemory;\n  } else {\n    root.localStorageMemory = localStorageMemory;\n  }\n})(this);\n\n\n// WEBPACK FOOTER //\n// ./memory.js","export default Model\n\n/**\n* Creates a new Model instance and hooks up the storage.\n*\n* @constructor\n* @param {object} storage A reference to the client side storage class\n*/\nfunction Model(storage) {\n  this.storage = storage\n}\n\n/**\n* Creates a new todo model\n*\n* @param {string} [title] The title of the task\n* @param {function} [callback] The callback to fire after the model is created\n*/\nModel.prototype.create = function(title, callback) {\n  title = title || ''\n  callback = callback || function() {\n  }\n\n  var newItem = {\n    title: title.trim(),\n    completed: false\n  }\n\n  this.storage.save(newItem, callback)\n}\n\n/**\n * Finds and returns a model in storage. If no query is given it'll simply\n * return everything. If you pass in a string or number it'll look that up as\n * the ID of the model to find. Lastly, you can pass it an object to match against.\n *\n * @param {string|number|object} [query] A query to match models against\n * @param {function} [callback] The callback to fire after the model is found\n *\n * @example\n * model.read(1, func); // Will find the model with an ID of 1\n * model.read('1'); // Same as above\n * //Below will find a model with foo equalling bar and hello equalling world.\n * model.read({ foo: 'bar', hello: 'world' });\n */\nModel.prototype.read = function(query, callback) {\n  var queryType = typeof query\n  callback = callback || function() {\n  }\n\n  if (queryType === 'function') {\n    callback = query\n    return this.storage.findAll(callback)\n  } else if (queryType === 'string' || queryType === 'number') {\n    query = parseInt(query, 10)\n    this.storage.find({id: query}, callback)\n  } else {\n    this.storage.find(query, callback)\n  }\n  return undefined\n}\n\n/**\n* Updates a model by giving it an ID, data to update, and a callback to fire when\n* the update is complete.\n*\n* @param {number} id The id of the model to update\n* @param {object} data The properties to update and their new value\n* @param {function} callback The callback to fire when the update is complete.\n*/\nModel.prototype.update = function(id, data, callback) {\n  this.storage.save(data, callback, id)\n}\n\n/**\n* Removes a model from storage\n*\n* @param {number} id The ID of the model to remove\n* @param {function} callback The callback to fire when the removal is complete.\n*/\nModel.prototype.remove = function(id, callback) {\n  this.storage.remove(id, callback)\n}\n\n/**\n* WARNING: Will remove ALL data from storage.\n*\n* @param {function} callback The callback to fire when the storage is wiped.\n*/\nModel.prototype.removeAll = function(callback) {\n  this.storage.drop(callback)\n}\n\n/**\n* Returns a count of all todos\n*/\nModel.prototype.getCount = function(callback) {\n  var todos = {\n    active: 0,\n    completed: 0,\n    total: 0\n  }\n\n  this.storage.findAll(function(data) {\n    data.forEach(function(todo) {\n      if (todo.completed) {\n        todos.completed++\n      } else {\n        todos.active++\n      }\n\n      todos.total++\n    })\n    callback(todos)\n  })\n}\n\n\n\n// WEBPACK FOOTER //\n// ./model.js","import {remove} from './helpers'\nimport * as localStorageMemory from './memory'\nexport default Store\n\nvar uniqueID = 1;\n\n/**\n * Creates a new client side storage object and will create an empty\n * collection if no collection already exists.\n *\n * @param {string} name The name of our DB we want to use\n * @param {function} callback Our fake DB uses callbacks because in\n * real life you probably would be making AJAX calls\n */\nfunction Store(name, callback) {\n  callback = callback || function() {\n  }\n\n  this._dbName = name\n\n  if (!localStorageMemory[name]) {\n    var data = {\n      todos: []\n    }\n\n    localStorageMemory[name] = JSON.stringify(data)\n  }\n\n  callback.call(this, JSON.parse(localStorageMemory[name]))\n  this.subscribers = []\n}\n\nStore.prototype.subscribe = function(subscriber) {\n  this.subscribers.push(subscriber)\n  return () => remove(this.subscribers, subscriber)\n}\n\nStore.prototype._notify = function() {\n  this.subscribers.forEach(s => s())\n}\n\n/**\n* Finds items based on a query given as a JS object\n*\n* @param {object} query The query to match against (i.e. {foo: 'bar'})\n* @param {function} callback   The callback to fire when the query has\n* completed running\n*\n* @example\n* db.find({foo: 'bar', hello: 'world'}, function (data) {\n*   // data will return any items that have foo: bar and\n*   // hello: world in their properties\n* });\n*/\nStore.prototype.find = function(query, callback) {\n  if (!callback) {\n    return\n  }\n\n  var todos = JSON.parse(localStorageMemory[this._dbName]).todos\n\n  callback.call(this, todos.filter(function(todo) {\n    for (var q in query) {\n      if (query[q] !== todo[q]) {\n        return false\n      }\n    }\n    return true\n  }))\n}\n\n/**\n* Will retrieve all data from the collection\n*\n* @param {function} callback The callback to fire upon retrieving data\n*/\nStore.prototype.findAll = function(callback) {\n  callback = callback || function() {\n  }\n  callback.call(this, JSON.parse(localStorageMemory[this._dbName]).todos)\n}\n\n/**\n* Will save the given data to the DB. If no item exists it will create a new\n* item, otherwise it'll simply update an existing item's properties\n*\n* @param {object} updateData The data to save back into the DB\n* @param {function} callback The callback to fire after saving\n* @param {number} id An optional param to enter an ID of an item to update\n*/\nStore.prototype.save = function(updateData, callback, id) {\n  var data = JSON.parse(localStorageMemory[this._dbName])\n  var todos = data.todos\n\n  callback = callback || function() {\n  }\n\n  // If an ID was actually given, find the item and update each property\n  if (id) {\n    for (var i = 0; i < todos.length; i++) {\n      if (todos[i].id === id) {\n        for (var key in updateData) { // eslint-disable-line guard-for-in\n          todos[i][key] = updateData[key]\n        }\n        break\n      }\n    }\n\n    localStorageMemory[this._dbName] = JSON.stringify(data)\n    callback.call(this, JSON.parse(localStorageMemory[this._dbName]).todos)\n  } else {\n    // Generate an ID\n    updateData.id = uniqueID++;\n\n    todos.push(updateData)\n    localStorageMemory[this._dbName] = JSON.stringify(data)\n    callback.call(this, [updateData])\n  }\n  this._notify()\n}\n\n/**\n* Will remove an item from the Store based on its ID\n*\n* @param {number} id The ID of the item you want to remove\n* @param {function} callback The callback to fire after saving\n*/\nStore.prototype.remove = function(id, callback) {\n  var data = JSON.parse(localStorageMemory[this._dbName])\n  var todos = data.todos\n\n  for (var i = 0; i < todos.length; i++) {\n    if (todos[i].id === id) {\n      todos.splice(i, 1)\n      break\n    }\n  }\n\n  localStorageMemory[this._dbName] = JSON.stringify(data)\n  callback.call(this, JSON.parse(localStorageMemory[this._dbName]).todos)\n  this._notify()\n}\n\n/**\n* Will drop all storage and start fresh\n*\n* @param {function} callback The callback to fire after dropping the data\n*/\nStore.prototype.drop = function(callback) {\n  localStorageMemory[this._dbName] = JSON.stringify({todos: []})\n  callback.call(this, JSON.parse(localStorageMemory[this._dbName]).todos)\n  this._notify()\n}\n\n\n\n// WEBPACK FOOTER //\n// ./store.js","export default Template\n\nvar htmlEscapes = {\n  '&': '&amp;',\n  '<': '&lt;',\n  '>': '&gt;',\n  '\"': '&quot;',\n  '\\'': '&#x27;',\n  '`': '&#x60;'\n}\n\nvar escapeHtmlChar = function(chr) {\n  return htmlEscapes[chr]\n}\n\nvar reUnescapedHtml = /[&<>\"'`]/g\nvar reHasUnescapedHtml = new RegExp(reUnescapedHtml.source)\n\nvar escape = function(string) {\n  if (string && reHasUnescapedHtml.test(string)) {\n    return string.replace(reUnescapedHtml, escapeHtmlChar)\n  } else {\n    return string\n  }\n}\n\n/**\n* Sets up defaults for all the Template methods such as a default template\n*\n* @constructor\n*/\nfunction Template() {\n  this.defaultTemplate = `\n    <li data-id=\"{{id}}\" class=\"{{completed}}\">\n      <div class=\"view\">\n        <input class=\"toggle\" type=\"checkbox\" {{checked}} />\n        <label>{{title}}</label>\n        <button class=\"destroy\"></button>\n      </div>\n    </li>\n  `\n}\n\n/**\n * Creates an <li> HTML string and returns it for placement in your app.\n *\n * NOTE: In real life you should be using a templating engine such as Mustache\n * or Handlebars, however, this is a vanilla JS example.\n *\n * @param {object} data The object containing keys you want to find in the\n *                      template to replace.\n * @returns {string} HTML String of an <li> element\n *\n * @example\n * view.show({\n *  id: 1,\n *  title: \"Hello World\",\n *  completed: 0,\n * });\n */\nTemplate.prototype.show = function(data) {\n  var i, l\n  var view = ''\n\n  for (i = 0, l = data.length; i < l; i++) {\n    var template = this.defaultTemplate\n    var completed = ''\n    var checked = ''\n\n    if (data[i].completed) {\n      completed = 'completed'\n      checked = 'checked'\n    }\n\n    template = template.replace('{{id}}', data[i].id)\n    template = template.replace('{{title}}', escape(data[i].title))\n    template = template.replace('{{completed}}', completed)\n    template = template.replace('{{checked}}', checked)\n\n    view = view + template\n  }\n\n  return view\n}\n\n/**\n * Displays a counter of how many to dos are left to complete\n *\n * @param {number} activeTodos The number of active todos.\n * @returns {string} String containing the count\n */\nTemplate.prototype.itemCounter = function(activeTodos) {\n  var plural = activeTodos === 1 ? '' : 's'\n\n  return '<strong>' + activeTodos + '</strong> item' + plural + ' left'\n}\n\n/**\n * Updates the text within the \"Clear completed\" button\n *\n * @param  {[type]} completedTodos The number of completed todos.\n * @returns {string} String containing the count\n */\nTemplate.prototype.clearCompletedButton = function(completedTodos) {\n  if (completedTodos > 0) {\n    return 'Clear completed'\n  } else {\n    return ''\n  }\n}\n\n\n\n// WEBPACK FOOTER //\n// ./template.js","import View from './view'\nimport Controller from './controller'\nimport Model from './model'\nimport Store from './store'\nimport Template from './template'\nimport {remove} from './helpers'\n\nexport {updateTodo, getTodo, subscribe}\n\nlet todo\nconst subscribers = []\n\n/**\n * Sets up a brand new Todo list.\n *\n * @param {string} name The name of your new to do list.\n */\nfunction Todo(name) {\n  this.storage = new Store(name)\n  this.model = new Model(this.storage)\n  this.template = new Template()\n  this.view = new View(this.template)\n  this.controller = new Controller(this.model, this.view)\n}\n\nfunction updateTodo() {\n  todo = new Todo('todos-vanillajs')\n  todo.controller.setView(document.location.hash)\n  subscribers.forEach(s => s())\n}\n\nfunction getTodo() {\n  return todo\n}\n\nfunction subscribe(cb) {\n  subscribers.push(cb)\n  return function unsubscribe() {\n    remove(subscribers, cb)\n  }\n}\n\n\n\n// WEBPACK FOOTER //\n// ./todo.js","/* eslint no-invalid-this: 0, complexity:[2, 9] */\nimport {qs, qsa, $on, $parent, $delegate} from './helpers'\n\n/**\n * View that abstracts away the browser's DOM completely.\n * It has two simple entry points:\n *\n *   - bind(eventName, handler)\n *     Takes a todo application event and registers the handler\n *   - render(command, parameterObject)\n *     Renders the given command with the options\n */\nexport default class View {\n  constructor(template) {\n    this.template = template\n\n    this.ENTER_KEY = 13\n    this.ESCAPE_KEY = 27\n\n    this.$todoList = qs('.todo-list')\n    this.$todoItemCounter = qs('.todo-count')\n    this.$clearCompleted = qs('.clear-completed')\n    this.$main = qs('.main')\n    this.$footer = qs('.footer')\n    this.$toggleAll = qs('.toggle-all')\n    this.$newTodo = qs('.new-todo')\n  }\n\n  _removeItem(id) {\n    var elem = qs('[data-id=\"' + id + '\"]')\n\n    if (elem) {\n      this.$todoList.removeChild(elem)\n    }\n  }\n\n  _clearCompletedButton(completedCount, visible) {\n    this.$clearCompleted.innerHTML = this.template.clearCompletedButton(completedCount)\n    this.$clearCompleted.style.display = visible ? 'block' : 'none'\n  }\n\n  _editItemDone(id, title) {\n    var listItem = qs('[data-id=\"' + id + '\"]')\n\n    if (!listItem) {\n      return\n    }\n\n    var input = qs('input.edit', listItem)\n    listItem.removeChild(input)\n\n    listItem.className = listItem.className.replace('editing', '')\n\n    qsa('label', listItem).forEach(function(label) {\n      label.textContent = title\n    })\n  }\n\n  render(viewCmd, parameter) {\n    var that = this\n    var viewCommands = {\n      showEntries: function() {\n        that.$todoList.innerHTML = that.template.show(parameter)\n      },\n      removeItem: function() {\n        that._removeItem(parameter)\n      },\n      updateElementCount: function() {\n        that.$todoItemCounter.innerHTML = that.template.itemCounter(parameter)\n      },\n      clearCompletedButton: function() {\n        that._clearCompletedButton(parameter.completed, parameter.visible)\n      },\n      contentBlockVisibility: function() {\n        that.$main.style.display = that.$footer.style.display = parameter.visible ? 'block' : 'none'\n      },\n      toggleAll: function() {\n        that.$toggleAll.checked = parameter.checked\n      },\n      setFilter: function() {\n        _setFilter(parameter)\n      },\n      clearNewTodo: function() {\n        that.$newTodo.value = ''\n      },\n      elementComplete: function() {\n        _elementComplete(parameter.id, parameter.completed)\n      },\n      editItem: function() {\n        _editItem(parameter.id, parameter.title)\n      },\n      editItemDone: function() {\n        that._editItemDone(parameter.id, parameter.title)\n      }\n    }\n\n    viewCommands[viewCmd]()\n  }\n\n  _bindItemEditDone(handler) {\n    var that = this\n    $delegate(that.$todoList, 'li .edit', 'blur', function() {\n      if (!this.dataset.iscanceled) {\n        handler({\n          id: _itemId(this),\n          title: this.value\n        })\n      }\n    })\n\n    $delegate(that.$todoList, 'li .edit', 'keypress', function(event) {\n      if (event.keyCode === that.ENTER_KEY) {\n        // Remove the cursor from the input when you hit enter just like if it\n        // were a real form\n        this.blur()\n      }\n    })\n  }\n\n  _bindItemEditCancel(handler) {\n    var that = this\n    $delegate(that.$todoList, 'li .edit', 'keyup', function(event) {\n      if (event.keyCode === that.ESCAPE_KEY) {\n        this.dataset.iscanceled = true\n        this.blur()\n\n        handler({id: _itemId(this)})\n      }\n    })\n  }\n\n  bind(event, handler) {\n    var that = this\n    if (event === 'newTodo') {\n      $on(that.$newTodo, 'change', function() {\n        handler(that.$newTodo.value)\n      })\n\n    } else if (event === 'removeCompleted') {\n      $on(that.$clearCompleted, 'click', function() {\n        handler()\n      })\n\n    } else if (event === 'toggleAll') {\n      $on(that.$toggleAll, 'click', function() {\n        handler({completed: this.checked})\n      })\n\n    } else if (event === 'itemEdit') {\n      $delegate(that.$todoList, 'li label', 'dblclick', function() {\n        handler({id: _itemId(this)})\n      })\n\n    } else if (event === 'itemRemove') {\n      $delegate(that.$todoList, '.destroy', 'click', function() {\n        handler({id: _itemId(this)})\n      })\n\n    } else if (event === 'itemToggle') {\n      $delegate(that.$todoList, '.toggle', 'click', function() {\n        handler({\n          id: _itemId(this),\n          completed: this.checked\n        })\n      })\n\n    } else if (event === 'itemEditDone') {\n      that._bindItemEditDone(handler)\n\n    } else if (event === 'itemEditCancel') {\n      that._bindItemEditCancel(handler)\n    }\n  }\n}\n\nfunction _setFilter(currentPage) {\n  qs('.filters .selected').className = ''\n  qs('.filters [href=\"#/' + currentPage + '\"]').className = 'selected'\n}\n\nfunction _elementComplete(id, completed) {\n  var listItem = qs('[data-id=\"' + id + '\"]')\n\n  if (!listItem) {\n    return\n  }\n\n  listItem.className = completed ? 'completed' : ''\n\n  // In case it was toggled from an event and not by clicking the checkbox\n  qs('input', listItem).checked = completed\n}\n\nfunction _editItem(id, title) {\n  var listItem = qs('[data-id=\"' + id + '\"]')\n\n  if (!listItem) {\n    return\n  }\n\n  listItem.className = listItem.className + ' editing'\n\n  var input = document.createElement('input')\n  input.className = 'edit'\n\n  listItem.appendChild(input)\n  input.focus()\n  input.value = title\n}\n\nfunction _itemId(element) {\n  var li = $parent(element, 'li')\n  return parseInt(li.dataset.id, 10)\n}\n\n\n\n// WEBPACK FOOTER //\n// ./view.js","/* eslint no-console:0 */\nimport {onLoad} from './app'\nimport {$on} from './helpers'\n\n// this is only relevant when using `hot` mode with webpack\n// special thanks to Eric Clemmons: https://github.com/ericclemmons/webpack-hot-server-example\nconst reloading = document.readyState === 'complete'\nif (module.hot) {\n  module.hot.accept(function(err) {\n  })\n  if (reloading) {\n    onLoad()\n  } else {\n    bootstrap()\n  }\n} else {\n  bootstrap()\n}\n\nfunction bootstrap() {\n  $on(window, 'load', onLoad)\n  $on(window, 'hashchange', onLoad)\n}\n\n\n\n// WEBPACK FOOTER //\n// ./bootstrap.js"],"sourceRoot":""}
\ No newline at end of file
@@ -1,2 +1,2 @@
-!function(e){function r(n){if(t[n])return t[n].exports;var o=t[n]={i:n,l:!1,exports:{}};return e[n].call(o.exports,o,o.exports,r),o.l=!0,o.exports}var n=window.webpackJsonp;window.webpackJsonp=function(t,u,c){for(var i,a,f,l=0,s=[];l<t.length;l++)a=t[l],o[a]&&s.push(o[a][0]),o[a]=0;for(i in u)Object.prototype.hasOwnProperty.call(u,i)&&(e[i]=u[i]);for(n&&n(t,u,c);s.length;)s.shift()();if(c)for(l=0;l<c.length;l++)f=r(r.s=c[l]);return f};var t={},o={2:0};r.e=function(e){function n(){u.onerror=u.onload=null,clearTimeout(c);var r=o[e];0!==r&&(r&&r[1](new Error("Loading chunk "+e+" failed.")),o[e]=void 0)}if(0===o[e])return Promise.resolve();if(o[e])return o[e][2];var t=document.getElementsByTagName("head")[0],u=document.createElement("script");u.type="text/javascript",u.charset="utf-8",u.async=!0,u.timeout=12e4,u.src=r.p+"bundle."+e+"."+{0:"71bb1f671e4e65604d05",1:"b16cc08e016d07886f5f"}[e]+".js";var c=setTimeout(n,12e4);u.onerror=u.onload=n,t.appendChild(u);var i=new Promise(function(r,n){o[e]=[r,n]});return o[e][2]=i},r.m=e,r.c=t,r.i=function(e){return e},r.d=function(e,r,n){Object.defineProperty(e,r,{configurable:!1,enumerable:!0,get:n})},r.n=function(e){var n=e&&e.__esModule?function(){return e["default"]}:function(){return e};return r.d(n,"a",n),n},r.o=function(e,r){return Object.prototype.hasOwnProperty.call(e,r)},r.p="",r.oe=function(e){throw console.error(e),e}}([]);
-//# sourceMappingURL=bundle.manifest.2102040c9a6e04cc046e.js.map
\ No newline at end of file
+!function(e){function r(n){if(t[n])return t[n].exports;var o=t[n]={i:n,l:!1,exports:{}};return e[n].call(o.exports,o,o.exports,r),o.l=!0,o.exports}var n=window.webpackJsonp;window.webpackJsonp=function(t,u,c){for(var i,a,f,l=0,s=[];l<t.length;l++)a=t[l],o[a]&&s.push(o[a][0]),o[a]=0;for(i in u)Object.prototype.hasOwnProperty.call(u,i)&&(e[i]=u[i]);for(n&&n(t,u,c);s.length;)s.shift()();if(c)for(l=0;l<c.length;l++)f=r(r.s=c[l]);return f};var t={},o={2:0};r.e=function(e){function n(){u.onerror=u.onload=null,clearTimeout(c);var r=o[e];0!==r&&(r&&r[1](new Error("Loading chunk "+e+" failed.")),o[e]=void 0)}if(0===o[e])return Promise.resolve();if(o[e])return o[e][2];var t=document.getElementsByTagName("head")[0],u=document.createElement("script");u.type="text/javascript",u.charset="utf-8",u.async=!0,u.timeout=12e4,u.src=r.p+"bundle."+e+"."+{0:"930ad8b83126862d7445",1:"577c6bc09319b27fed34"}[e]+".js";var c=setTimeout(n,12e4);u.onerror=u.onload=n,t.appendChild(u);var i=new Promise(function(r,n){o[e]=[r,n]});return o[e][2]=i},r.m=e,r.c=t,r.i=function(e){return e},r.d=function(e,r,n){Object.defineProperty(e,r,{configurable:!1,enumerable:!0,get:n})},r.n=function(e){var n=e&&e.__esModule?function(){return e["default"]}:function(){return e};return r.d(n,"a",n),n},r.o=function(e,r){return Object.prototype.hasOwnProperty.call(e,r)},r.p="",r.oe=function(e){throw console.error(e),e}}([]);
+//# sourceMappingURL=bundle.manifest.e81199b00da2921d9c94.js.map
\ No newline at end of file
@@ -1 +1 @@
-{"version":3,"sources":["webpack:///bundle.manifest.2102040c9a6e04cc046e.js","webpack:///webpack/bootstrap 804f84253e20e8eee8a8"],"names":["modules","__webpack_require__","moduleId","installedModules","exports","module","i","l","call","parentJsonpFunction","window","chunkIds","moreModules","executeModules","chunkId","result","resolves","length","installedChunks","push","Object","prototype","hasOwnProperty","shift","s","2","e","onScriptComplete","script","onerror","onload","clearTimeout","timeout","chunk","Error","undefined","Promise","resolve","head","document","getElementsByTagName","createElement","type","charset","async","src","p","0","1","setTimeout","appendChild","promise","reject","m","c","value","d","name","getter","defineProperty","configurable","enumerable","get","n","__esModule","o","object","property","oe","err","console","error"],"mappings":"CAAS,SAAUA,GCqCnB,QAAAC,GAAAC,GAGA,GAAAC,EAAAD,GACA,MAAAC,GAAAD,GAAAE,OAGA,IAAAC,GAAAF,EAAAD,IACAI,EAAAJ,EACAK,GAAA,EACAH,WAUA,OANAJ,GAAAE,GAAAM,KAAAH,EAAAD,QAAAC,IAAAD,QAAAH,GAGAI,EAAAE,GAAA,EAGAF,EAAAD,QAxDA,GAAAK,GAAAC,OAAA,YACAA,QAAA,sBAAAC,EAAAC,EAAAC,GAIA,IADA,GAAAX,GAAAY,EAAAC,EAAAT,EAAA,EAAAU,KACQV,EAAAK,EAAAM,OAAoBX,IAC5BQ,EAAAH,EAAAL,GACAY,EAAAJ,IACAE,EAAAG,KAAAD,EAAAJ,GAAA,IACAI,EAAAJ,GAAA,CAEA,KAAAZ,IAAAU,GACAQ,OAAAC,UAAAC,eAAAd,KAAAI,EAAAV,KACAF,EAAAE,GAAAU,EAAAV,GAIA,KADAO,KAAAE,EAAAC,EAAAC,GACAG,EAAAC,QACAD,EAAAO,SACA,IAAAV,EACA,IAAAP,EAAA,EAAYA,EAAAO,EAAAI,OAA2BX,IACvCS,EAAAd,IAAAuB,EAAAX,EAAAP,GAGA,OAAAS,GAIA,IAAAZ,MAGAe,GACAO,EAAA,EA6BAxB,GAAAyB,EAAA,SAAAZ,GAmBA,QAAAa,KAEAC,EAAAC,QAAAD,EAAAE,OAAA,KACAC,aAAAC,EACA,IAAAC,GAAAf,EAAAJ,EACA,KAAAmB,IACAA,KAAA,MAAAC,OAAA,iBAAApB,EAAA,aACAI,EAAAJ,GAAAqB,QAzBA,OAAAjB,EAAAJ,GACA,MAAAsB,SAAAC,SAGA,IAAAnB,EAAAJ,GACA,MAAAI,GAAAJ,GAAA,EAGA,IAAAwB,GAAAC,SAAAC,qBAAA,WACAZ,EAAAW,SAAAE,cAAA,SACAb,GAAAc,KAAA,kBACAd,EAAAe,QAAA,QACAf,EAAAgB,OAAA,EACAhB,EAAAI,QAAA,KAEAJ,EAAAiB,IAAA5C,EAAA6C,EAAA,UAAAhC,EAAA,KAAqEiC,EAAA,uBAAAC,EAAA,wBAAsDlC,GAAA,KAC3H,IAAAkB,GAAAiB,WAAAtB,EAAA,KACAC,GAAAC,QAAAD,EAAAE,OAAAH,EAWAW,EAAAY,YAAAtB,EAEA,IAAAuB,GAAA,GAAAf,SAAA,SAAAC,EAAAe,GACAlC,EAAAJ,IAAAuB,EAAAe,IAEA,OAAAlC,GAAAJ,GAAA,GAAAqC,GAIAlD,EAAAoD,EAAArD,EAGAC,EAAAqD,EAAAnD,EAGAF,EAAAK,EAAA,SAAAiD,GAA2C,MAAAA,IAG3CtD,EAAAuD,EAAA,SAAApD,EAAAqD,EAAAC,GACAtC,OAAAuC,eAAAvD,EAAAqD,GACAG,cAAA,EACAC,YAAA,EACAC,IAAAJ,KAKAzD,EAAA8D,EAAA,SAAA1D,GACA,GAAAqD,GAAArD,KAAA2D,WACA,WAA2B,MAAA3D,GAAA,YAC3B,WAAiC,MAAAA,GAEjC,OADAJ,GAAAuD,EAAAE,EAAA,IAAAA,GACAA,GAIAzD,EAAAgE,EAAA,SAAAC,EAAAC,GAAsD,MAAA/C,QAAAC,UAAAC,eAAAd,KAAA0D,EAAAC,IAGtDlE,EAAA6C,EAAA,GAGA7C,EAAAmE,GAAA,SAAAC,GAA8D,KAApBC,SAAAC,MAAAF,GAAoBA","file":"bundle.manifest.2102040c9a6e04cc046e.js","sourcesContent":["/******/ (function(modules) { // webpackBootstrap\n/******/ \t// install a JSONP callback for chunk loading\n/******/ \tvar parentJsonpFunction = window[\"webpackJsonp\"];\n/******/ \twindow[\"webpackJsonp\"] = function webpackJsonpCallback(chunkIds, moreModules, executeModules) {\n/******/ \t\t// add \"moreModules\" to the modules object,\n/******/ \t\t// then flag all \"chunkIds\" as loaded and fire callback\n/******/ \t\tvar moduleId, chunkId, i = 0, resolves = [], result;\n/******/ \t\tfor(;i < chunkIds.length; i++) {\n/******/ \t\t\tchunkId = chunkIds[i];\n/******/ \t\t\tif(installedChunks[chunkId])\n/******/ \t\t\t\tresolves.push(installedChunks[chunkId][0]);\n/******/ \t\t\tinstalledChunks[chunkId] = 0;\n/******/ \t\t}\n/******/ \t\tfor(moduleId in moreModules) {\n/******/ \t\t\tif(Object.prototype.hasOwnProperty.call(moreModules, moduleId)) {\n/******/ \t\t\t\tmodules[moduleId] = moreModules[moduleId];\n/******/ \t\t\t}\n/******/ \t\t}\n/******/ \t\tif(parentJsonpFunction) parentJsonpFunction(chunkIds, moreModules, executeModules);\n/******/ \t\twhile(resolves.length)\n/******/ \t\t\tresolves.shift()();\n/******/ \t\tif(executeModules) {\n/******/ \t\t\tfor(i=0; i < executeModules.length; i++) {\n/******/ \t\t\t\tresult = __webpack_require__(__webpack_require__.s = executeModules[i]);\n/******/ \t\t\t}\n/******/ \t\t}\n/******/ \t\treturn result;\n/******/ \t};\n/******/\n/******/ \t// The module cache\n/******/ \tvar installedModules = {};\n/******/\n/******/ \t// objects to store loaded and loading chunks\n/******/ \tvar installedChunks = {\n/******/ \t\t2: 0\n/******/ \t};\n/******/\n/******/ \t// The require function\n/******/ \tfunction __webpack_require__(moduleId) {\n/******/\n/******/ \t\t// Check if module is in cache\n/******/ \t\tif(installedModules[moduleId])\n/******/ \t\t\treturn installedModules[moduleId].exports;\n/******/\n/******/ \t\t// Create a new module (and put it into the cache)\n/******/ \t\tvar module = installedModules[moduleId] = {\n/******/ \t\t\ti: moduleId,\n/******/ \t\t\tl: false,\n/******/ \t\t\texports: {}\n/******/ \t\t};\n/******/\n/******/ \t\t// Execute the module function\n/******/ \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n/******/\n/******/ \t\t// Flag the module as loaded\n/******/ \t\tmodule.l = true;\n/******/\n/******/ \t\t// Return the exports of the module\n/******/ \t\treturn module.exports;\n/******/ \t}\n/******/\n/******/ \t// This file contains only the entry chunk.\n/******/ \t// The chunk loading function for additional chunks\n/******/ \t__webpack_require__.e = function requireEnsure(chunkId) {\n/******/ \t\tif(installedChunks[chunkId] === 0)\n/******/ \t\t\treturn Promise.resolve();\n/******/\n/******/ \t\t// an Promise means \"currently loading\".\n/******/ \t\tif(installedChunks[chunkId]) {\n/******/ \t\t\treturn installedChunks[chunkId][2];\n/******/ \t\t}\n/******/ \t\t// start chunk loading\n/******/ \t\tvar head = document.getElementsByTagName('head')[0];\n/******/ \t\tvar script = document.createElement('script');\n/******/ \t\tscript.type = 'text/javascript';\n/******/ \t\tscript.charset = 'utf-8';\n/******/ \t\tscript.async = true;\n/******/ \t\tscript.timeout = 120000;\n/******/\n/******/ \t\tscript.src = __webpack_require__.p + \"bundle.\" + chunkId + \".\" + {\"0\":\"71bb1f671e4e65604d05\",\"1\":\"b16cc08e016d07886f5f\"}[chunkId] + \".js\";\n/******/ \t\tvar timeout = setTimeout(onScriptComplete, 120000);\n/******/ \t\tscript.onerror = script.onload = onScriptComplete;\n/******/ \t\tfunction onScriptComplete() {\n/******/ \t\t\t// avoid mem leaks in IE.\n/******/ \t\t\tscript.onerror = script.onload = null;\n/******/ \t\t\tclearTimeout(timeout);\n/******/ \t\t\tvar chunk = installedChunks[chunkId];\n/******/ \t\t\tif(chunk !== 0) {\n/******/ \t\t\t\tif(chunk) chunk[1](new Error('Loading chunk ' + chunkId + ' failed.'));\n/******/ \t\t\t\tinstalledChunks[chunkId] = undefined;\n/******/ \t\t\t}\n/******/ \t\t};\n/******/ \t\thead.appendChild(script);\n/******/\n/******/ \t\tvar promise = new Promise(function(resolve, reject) {\n/******/ \t\t\tinstalledChunks[chunkId] = [resolve, reject];\n/******/ \t\t});\n/******/ \t\treturn installedChunks[chunkId][2] = promise;\n/******/ \t};\n/******/\n/******/ \t// expose the modules object (__webpack_modules__)\n/******/ \t__webpack_require__.m = modules;\n/******/\n/******/ \t// expose the module cache\n/******/ \t__webpack_require__.c = installedModules;\n/******/\n/******/ \t// identity function for calling harmory imports with the correct context\n/******/ \t__webpack_require__.i = function(value) { return value; };\n/******/\n/******/ \t// define getter function for harmory exports\n/******/ \t__webpack_require__.d = function(exports, name, getter) {\n/******/ \t\tObject.defineProperty(exports, name, {\n/******/ \t\t\tconfigurable: false,\n/******/ \t\t\tenumerable: true,\n/******/ \t\t\tget: getter\n/******/ \t\t});\n/******/ \t};\n/******/\n/******/ \t// getDefaultExport function for compatibility with non-harmony modules\n/******/ \t__webpack_require__.n = function(module) {\n/******/ \t\tvar getter = module && module.__esModule ?\n/******/ \t\t\tfunction getDefault() { return module['default']; } :\n/******/ \t\t\tfunction getModuleExports() { return module; };\n/******/ \t\t__webpack_require__.d(getter, 'a', getter);\n/******/ \t\treturn getter;\n/******/ \t};\n/******/\n/******/ \t// Object.prototype.hasOwnProperty.call\n/******/ \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n/******/\n/******/ \t// __webpack_public_path__\n/******/ \t__webpack_require__.p = \"\";\n/******/\n/******/ \t// on error function for async loading\n/******/ \t__webpack_require__.oe = function(err) { console.error(err); throw err; };\n/******/ })\n/************************************************************************/\n/******/ ([]);\n\n\n// WEBPACK FOOTER //\n// bundle.manifest.2102040c9a6e04cc046e.js"," \t// install a JSONP callback for chunk loading\n \tvar parentJsonpFunction = window[\"webpackJsonp\"];\n \twindow[\"webpackJsonp\"] = function webpackJsonpCallback(chunkIds, moreModules, executeModules) {\n \t\t// add \"moreModules\" to the modules object,\n \t\t// then flag all \"chunkIds\" as loaded and fire callback\n \t\tvar moduleId, chunkId, i = 0, resolves = [], result;\n \t\tfor(;i < chunkIds.length; i++) {\n \t\t\tchunkId = chunkIds[i];\n \t\t\tif(installedChunks[chunkId])\n \t\t\t\tresolves.push(installedChunks[chunkId][0]);\n \t\t\tinstalledChunks[chunkId] = 0;\n \t\t}\n \t\tfor(moduleId in moreModules) {\n \t\t\tif(Object.prototype.hasOwnProperty.call(moreModules, moduleId)) {\n \t\t\t\tmodules[moduleId] = moreModules[moduleId];\n \t\t\t}\n \t\t}\n \t\tif(parentJsonpFunction) parentJsonpFunction(chunkIds, moreModules, executeModules);\n \t\twhile(resolves.length)\n \t\t\tresolves.shift()();\n \t\tif(executeModules) {\n \t\t\tfor(i=0; i < executeModules.length; i++) {\n \t\t\t\tresult = __webpack_require__(__webpack_require__.s = executeModules[i]);\n \t\t\t}\n \t\t}\n \t\treturn result;\n \t};\n\n \t// The module cache\n \tvar installedModules = {};\n\n \t// objects to store loaded and loading chunks\n \tvar installedChunks = {\n \t\t2: 0\n \t};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId])\n \t\t\treturn installedModules[moduleId].exports;\n\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n \t// This file contains only the entry chunk.\n \t// The chunk loading function for additional chunks\n \t__webpack_require__.e = function requireEnsure(chunkId) {\n \t\tif(installedChunks[chunkId] === 0)\n \t\t\treturn Promise.resolve();\n\n \t\t// an Promise means \"currently loading\".\n \t\tif(installedChunks[chunkId]) {\n \t\t\treturn installedChunks[chunkId][2];\n \t\t}\n \t\t// start chunk loading\n \t\tvar head = document.getElementsByTagName('head')[0];\n \t\tvar script = document.createElement('script');\n \t\tscript.type = 'text/javascript';\n \t\tscript.charset = 'utf-8';\n \t\tscript.async = true;\n \t\tscript.timeout = 120000;\n\n \t\tscript.src = __webpack_require__.p + \"bundle.\" + chunkId + \".\" + {\"0\":\"71bb1f671e4e65604d05\",\"1\":\"b16cc08e016d07886f5f\"}[chunkId] + \".js\";\n \t\tvar timeout = setTimeout(onScriptComplete, 120000);\n \t\tscript.onerror = script.onload = onScriptComplete;\n \t\tfunction onScriptComplete() {\n \t\t\t// avoid mem leaks in IE.\n \t\t\tscript.onerror = script.onload = null;\n \t\t\tclearTimeout(timeout);\n \t\t\tvar chunk = installedChunks[chunkId];\n \t\t\tif(chunk !== 0) {\n \t\t\t\tif(chunk) chunk[1](new Error('Loading chunk ' + chunkId + ' failed.'));\n \t\t\t\tinstalledChunks[chunkId] = undefined;\n \t\t\t}\n \t\t};\n \t\thead.appendChild(script);\n\n \t\tvar promise = new Promise(function(resolve, reject) {\n \t\t\tinstalledChunks[chunkId] = [resolve, reject];\n \t\t});\n \t\treturn installedChunks[chunkId][2] = promise;\n \t};\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// identity function for calling harmory imports with the correct context\n \t__webpack_require__.i = function(value) { return value; };\n\n \t// define getter function for harmory exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tObject.defineProperty(exports, name, {\n \t\t\tconfigurable: false,\n \t\t\tenumerable: true,\n \t\t\tget: getter\n \t\t});\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n \t// on error function for async loading\n \t__webpack_require__.oe = function(err) { console.error(err); throw err; };\n\n\n\n// WEBPACK FOOTER //\n// webpack/bootstrap 804f84253e20e8eee8a8"],"sourceRoot":""}
\ No newline at end of file
+{"version":3,"sources":["webpack:///bundle.manifest.e81199b00da2921d9c94.js","webpack:///webpack/bootstrap 4cbd3e80684bd77082b0"],"names":["modules","__webpack_require__","moduleId","installedModules","exports","module","i","l","call","parentJsonpFunction","window","chunkIds","moreModules","executeModules","chunkId","result","resolves","length","installedChunks","push","Object","prototype","hasOwnProperty","shift","s","2","e","onScriptComplete","script","onerror","onload","clearTimeout","timeout","chunk","Error","undefined","Promise","resolve","head","document","getElementsByTagName","createElement","type","charset","async","src","p","0","1","setTimeout","appendChild","promise","reject","m","c","value","d","name","getter","defineProperty","configurable","enumerable","get","n","__esModule","o","object","property","oe","err","console","error"],"mappings":"CAAS,SAAUA,GCqCnB,QAAAC,GAAAC,GAGA,GAAAC,EAAAD,GACA,MAAAC,GAAAD,GAAAE,OAGA,IAAAC,GAAAF,EAAAD,IACAI,EAAAJ,EACAK,GAAA,EACAH,WAUA,OANAJ,GAAAE,GAAAM,KAAAH,EAAAD,QAAAC,IAAAD,QAAAH,GAGAI,EAAAE,GAAA,EAGAF,EAAAD,QAxDA,GAAAK,GAAAC,OAAA,YACAA,QAAA,sBAAAC,EAAAC,EAAAC,GAIA,IADA,GAAAX,GAAAY,EAAAC,EAAAT,EAAA,EAAAU,KACQV,EAAAK,EAAAM,OAAoBX,IAC5BQ,EAAAH,EAAAL,GACAY,EAAAJ,IACAE,EAAAG,KAAAD,EAAAJ,GAAA,IACAI,EAAAJ,GAAA,CAEA,KAAAZ,IAAAU,GACAQ,OAAAC,UAAAC,eAAAd,KAAAI,EAAAV,KACAF,EAAAE,GAAAU,EAAAV,GAIA,KADAO,KAAAE,EAAAC,EAAAC,GACAG,EAAAC,QACAD,EAAAO,SACA,IAAAV,EACA,IAAAP,EAAA,EAAYA,EAAAO,EAAAI,OAA2BX,IACvCS,EAAAd,IAAAuB,EAAAX,EAAAP,GAGA,OAAAS,GAIA,IAAAZ,MAGAe,GACAO,EAAA,EA6BAxB,GAAAyB,EAAA,SAAAZ,GAmBA,QAAAa,KAEAC,EAAAC,QAAAD,EAAAE,OAAA,KACAC,aAAAC,EACA,IAAAC,GAAAf,EAAAJ,EACA,KAAAmB,IACAA,KAAA,MAAAC,OAAA,iBAAApB,EAAA,aACAI,EAAAJ,GAAAqB,QAzBA,OAAAjB,EAAAJ,GACA,MAAAsB,SAAAC,SAGA,IAAAnB,EAAAJ,GACA,MAAAI,GAAAJ,GAAA,EAGA,IAAAwB,GAAAC,SAAAC,qBAAA,WACAZ,EAAAW,SAAAE,cAAA,SACAb,GAAAc,KAAA,kBACAd,EAAAe,QAAA,QACAf,EAAAgB,OAAA,EACAhB,EAAAI,QAAA,KAEAJ,EAAAiB,IAAA5C,EAAA6C,EAAA,UAAAhC,EAAA,KAAqEiC,EAAA,uBAAAC,EAAA,wBAAsDlC,GAAA,KAC3H,IAAAkB,GAAAiB,WAAAtB,EAAA,KACAC,GAAAC,QAAAD,EAAAE,OAAAH,EAWAW,EAAAY,YAAAtB,EAEA,IAAAuB,GAAA,GAAAf,SAAA,SAAAC,EAAAe,GACAlC,EAAAJ,IAAAuB,EAAAe,IAEA,OAAAlC,GAAAJ,GAAA,GAAAqC,GAIAlD,EAAAoD,EAAArD,EAGAC,EAAAqD,EAAAnD,EAGAF,EAAAK,EAAA,SAAAiD,GAA2C,MAAAA,IAG3CtD,EAAAuD,EAAA,SAAApD,EAAAqD,EAAAC,GACAtC,OAAAuC,eAAAvD,EAAAqD,GACAG,cAAA,EACAC,YAAA,EACAC,IAAAJ,KAKAzD,EAAA8D,EAAA,SAAA1D,GACA,GAAAqD,GAAArD,KAAA2D,WACA,WAA2B,MAAA3D,GAAA,YAC3B,WAAiC,MAAAA,GAEjC,OADAJ,GAAAuD,EAAAE,EAAA,IAAAA,GACAA,GAIAzD,EAAAgE,EAAA,SAAAC,EAAAC,GAAsD,MAAA/C,QAAAC,UAAAC,eAAAd,KAAA0D,EAAAC,IAGtDlE,EAAA6C,EAAA,GAGA7C,EAAAmE,GAAA,SAAAC,GAA8D,KAApBC,SAAAC,MAAAF,GAAoBA","file":"bundle.manifest.e81199b00da2921d9c94.js","sourcesContent":["/******/ (function(modules) { // webpackBootstrap\n/******/ \t// install a JSONP callback for chunk loading\n/******/ \tvar parentJsonpFunction = window[\"webpackJsonp\"];\n/******/ \twindow[\"webpackJsonp\"] = function webpackJsonpCallback(chunkIds, moreModules, executeModules) {\n/******/ \t\t// add \"moreModules\" to the modules object,\n/******/ \t\t// then flag all \"chunkIds\" as loaded and fire callback\n/******/ \t\tvar moduleId, chunkId, i = 0, resolves = [], result;\n/******/ \t\tfor(;i < chunkIds.length; i++) {\n/******/ \t\t\tchunkId = chunkIds[i];\n/******/ \t\t\tif(installedChunks[chunkId])\n/******/ \t\t\t\tresolves.push(installedChunks[chunkId][0]);\n/******/ \t\t\tinstalledChunks[chunkId] = 0;\n/******/ \t\t}\n/******/ \t\tfor(moduleId in moreModules) {\n/******/ \t\t\tif(Object.prototype.hasOwnProperty.call(moreModules, moduleId)) {\n/******/ \t\t\t\tmodules[moduleId] = moreModules[moduleId];\n/******/ \t\t\t}\n/******/ \t\t}\n/******/ \t\tif(parentJsonpFunction) parentJsonpFunction(chunkIds, moreModules, executeModules);\n/******/ \t\twhile(resolves.length)\n/******/ \t\t\tresolves.shift()();\n/******/ \t\tif(executeModules) {\n/******/ \t\t\tfor(i=0; i < executeModules.length; i++) {\n/******/ \t\t\t\tresult = __webpack_require__(__webpack_require__.s = executeModules[i]);\n/******/ \t\t\t}\n/******/ \t\t}\n/******/ \t\treturn result;\n/******/ \t};\n/******/\n/******/ \t// The module cache\n/******/ \tvar installedModules = {};\n/******/\n/******/ \t// objects to store loaded and loading chunks\n/******/ \tvar installedChunks = {\n/******/ \t\t2: 0\n/******/ \t};\n/******/\n/******/ \t// The require function\n/******/ \tfunction __webpack_require__(moduleId) {\n/******/\n/******/ \t\t// Check if module is in cache\n/******/ \t\tif(installedModules[moduleId])\n/******/ \t\t\treturn installedModules[moduleId].exports;\n/******/\n/******/ \t\t// Create a new module (and put it into the cache)\n/******/ \t\tvar module = installedModules[moduleId] = {\n/******/ \t\t\ti: moduleId,\n/******/ \t\t\tl: false,\n/******/ \t\t\texports: {}\n/******/ \t\t};\n/******/\n/******/ \t\t// Execute the module function\n/******/ \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n/******/\n/******/ \t\t// Flag the module as loaded\n/******/ \t\tmodule.l = true;\n/******/\n/******/ \t\t// Return the exports of the module\n/******/ \t\treturn module.exports;\n/******/ \t}\n/******/\n/******/ \t// This file contains only the entry chunk.\n/******/ \t// The chunk loading function for additional chunks\n/******/ \t__webpack_require__.e = function requireEnsure(chunkId) {\n/******/ \t\tif(installedChunks[chunkId] === 0)\n/******/ \t\t\treturn Promise.resolve();\n/******/\n/******/ \t\t// an Promise means \"currently loading\".\n/******/ \t\tif(installedChunks[chunkId]) {\n/******/ \t\t\treturn installedChunks[chunkId][2];\n/******/ \t\t}\n/******/ \t\t// start chunk loading\n/******/ \t\tvar head = document.getElementsByTagName('head')[0];\n/******/ \t\tvar script = document.createElement('script');\n/******/ \t\tscript.type = 'text/javascript';\n/******/ \t\tscript.charset = 'utf-8';\n/******/ \t\tscript.async = true;\n/******/ \t\tscript.timeout = 120000;\n/******/\n/******/ \t\tscript.src = __webpack_require__.p + \"bundle.\" + chunkId + \".\" + {\"0\":\"930ad8b83126862d7445\",\"1\":\"577c6bc09319b27fed34\"}[chunkId] + \".js\";\n/******/ \t\tvar timeout = setTimeout(onScriptComplete, 120000);\n/******/ \t\tscript.onerror = script.onload = onScriptComplete;\n/******/ \t\tfunction onScriptComplete() {\n/******/ \t\t\t// avoid mem leaks in IE.\n/******/ \t\t\tscript.onerror = script.onload = null;\n/******/ \t\t\tclearTimeout(timeout);\n/******/ \t\t\tvar chunk = installedChunks[chunkId];\n/******/ \t\t\tif(chunk !== 0) {\n/******/ \t\t\t\tif(chunk) chunk[1](new Error('Loading chunk ' + chunkId + ' failed.'));\n/******/ \t\t\t\tinstalledChunks[chunkId] = undefined;\n/******/ \t\t\t}\n/******/ \t\t};\n/******/ \t\thead.appendChild(script);\n/******/\n/******/ \t\tvar promise = new Promise(function(resolve, reject) {\n/******/ \t\t\tinstalledChunks[chunkId] = [resolve, reject];\n/******/ \t\t});\n/******/ \t\treturn installedChunks[chunkId][2] = promise;\n/******/ \t};\n/******/\n/******/ \t// expose the modules object (__webpack_modules__)\n/******/ \t__webpack_require__.m = modules;\n/******/\n/******/ \t// expose the module cache\n/******/ \t__webpack_require__.c = installedModules;\n/******/\n/******/ \t// identity function for calling harmory imports with the correct context\n/******/ \t__webpack_require__.i = function(value) { return value; };\n/******/\n/******/ \t// define getter function for harmory exports\n/******/ \t__webpack_require__.d = function(exports, name, getter) {\n/******/ \t\tObject.defineProperty(exports, name, {\n/******/ \t\t\tconfigurable: false,\n/******/ \t\t\tenumerable: true,\n/******/ \t\t\tget: getter\n/******/ \t\t});\n/******/ \t};\n/******/\n/******/ \t// getDefaultExport function for compatibility with non-harmony modules\n/******/ \t__webpack_require__.n = function(module) {\n/******/ \t\tvar getter = module && module.__esModule ?\n/******/ \t\t\tfunction getDefault() { return module['default']; } :\n/******/ \t\t\tfunction getModuleExports() { return module; };\n/******/ \t\t__webpack_require__.d(getter, 'a', getter);\n/******/ \t\treturn getter;\n/******/ \t};\n/******/\n/******/ \t// Object.prototype.hasOwnProperty.call\n/******/ \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n/******/\n/******/ \t// __webpack_public_path__\n/******/ \t__webpack_require__.p = \"\";\n/******/\n/******/ \t// on error function for async loading\n/******/ \t__webpack_require__.oe = function(err) { console.error(err); throw err; };\n/******/ })\n/************************************************************************/\n/******/ ([]);\n\n\n// WEBPACK FOOTER //\n// bundle.manifest.e81199b00da2921d9c94.js"," \t// install a JSONP callback for chunk loading\n \tvar parentJsonpFunction = window[\"webpackJsonp\"];\n \twindow[\"webpackJsonp\"] = function webpackJsonpCallback(chunkIds, moreModules, executeModules) {\n \t\t// add \"moreModules\" to the modules object,\n \t\t// then flag all \"chunkIds\" as loaded and fire callback\n \t\tvar moduleId, chunkId, i = 0, resolves = [], result;\n \t\tfor(;i < chunkIds.length; i++) {\n \t\t\tchunkId = chunkIds[i];\n \t\t\tif(installedChunks[chunkId])\n \t\t\t\tresolves.push(installedChunks[chunkId][0]);\n \t\t\tinstalledChunks[chunkId] = 0;\n \t\t}\n \t\tfor(moduleId in moreModules) {\n \t\t\tif(Object.prototype.hasOwnProperty.call(moreModules, moduleId)) {\n \t\t\t\tmodules[moduleId] = moreModules[moduleId];\n \t\t\t}\n \t\t}\n \t\tif(parentJsonpFunction) parentJsonpFunction(chunkIds, moreModules, executeModules);\n \t\twhile(resolves.length)\n \t\t\tresolves.shift()();\n \t\tif(executeModules) {\n \t\t\tfor(i=0; i < executeModules.length; i++) {\n \t\t\t\tresult = __webpack_require__(__webpack_require__.s = executeModules[i]);\n \t\t\t}\n \t\t}\n \t\treturn result;\n \t};\n\n \t// The module cache\n \tvar installedModules = {};\n\n \t// objects to store loaded and loading chunks\n \tvar installedChunks = {\n \t\t2: 0\n \t};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId])\n \t\t\treturn installedModules[moduleId].exports;\n\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n \t// This file contains only the entry chunk.\n \t// The chunk loading function for additional chunks\n \t__webpack_require__.e = function requireEnsure(chunkId) {\n \t\tif(installedChunks[chunkId] === 0)\n \t\t\treturn Promise.resolve();\n\n \t\t// an Promise means \"currently loading\".\n \t\tif(installedChunks[chunkId]) {\n \t\t\treturn installedChunks[chunkId][2];\n \t\t}\n \t\t// start chunk loading\n \t\tvar head = document.getElementsByTagName('head')[0];\n \t\tvar script = document.createElement('script');\n \t\tscript.type = 'text/javascript';\n \t\tscript.charset = 'utf-8';\n \t\tscript.async = true;\n \t\tscript.timeout = 120000;\n\n \t\tscript.src = __webpack_require__.p + \"bundle.\" + chunkId + \".\" + {\"0\":\"930ad8b83126862d7445\",\"1\":\"577c6bc09319b27fed34\"}[chunkId] + \".js\";\n \t\tvar timeout = setTimeout(onScriptComplete, 120000);\n \t\tscript.onerror = script.onload = onScriptComplete;\n \t\tfunction onScriptComplete() {\n \t\t\t// avoid mem leaks in IE.\n \t\t\tscript.onerror = script.onload = null;\n \t\t\tclearTimeout(timeout);\n \t\t\tvar chunk = installedChunks[chunkId];\n \t\t\tif(chunk !== 0) {\n \t\t\t\tif(chunk) chunk[1](new Error('Loading chunk ' + chunkId + ' failed.'));\n \t\t\t\tinstalledChunks[chunkId] = undefined;\n \t\t\t}\n \t\t};\n \t\thead.appendChild(script);\n\n \t\tvar promise = new Promise(function(resolve, reject) {\n \t\t\tinstalledChunks[chunkId] = [resolve, reject];\n \t\t});\n \t\treturn installedChunks[chunkId][2] = promise;\n \t};\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// identity function for calling harmory imports with the correct context\n \t__webpack_require__.i = function(value) { return value; };\n\n \t// define getter function for harmory exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tObject.defineProperty(exports, name, {\n \t\t\tconfigurable: false,\n \t\t\tenumerable: true,\n \t\t\tget: getter\n \t\t});\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n \t// on error function for async loading\n \t__webpack_require__.oe = function(err) { console.error(err); throw err; };\n\n\n\n// WEBPACK FOOTER //\n// webpack/bootstrap 4cbd3e80684bd77082b0"],"sourceRoot":""}
\ No newline at end of file
@@ -1,2 +1,2 @@
 webpackJsonp([1,2],{1:function(n,t){},12:function(n,t,r){n.exports=r(1)},13:function(n,t){n.exports=function(){var n=[];return n.toString=function(){for(var n=[],t=0;t<this.length;t++){var r=this[t];r[2]?n.push("@media "+r[2]+"{"+r[1]+"}"):n.push(r[1])}return n.join("")},n.i=function(t,r){"string"==typeof t&&(t=[[null,t,""]]);for(var o={},i=0;i<this.length;i++){var e=this[i][0];"number"==typeof e&&(o[e]=!0)}for(i=0;i<t.length;i++){var u=t[i];"number"==typeof u[0]&&o[u[0]]||(r&&!u[2]?u[2]=r:r&&(u[2]="("+u[2]+") and ("+r+")"),n.push(u))}},n}}},[12]);
-//# sourceMappingURL=bundle.vendor.b16cc08e016d07886f5f.js.map
\ No newline at end of file
+//# sourceMappingURL=bundle.vendor.577c6bc09319b27fed34.js.map
\ No newline at end of file
@@ -1 +1 @@
-{"version":3,"sources":["webpack:///bundle.vendor.b16cc08e016d07886f5f.js","webpack:///../~/css-loader/lib/css-base.js"],"names":["webpackJsonp","1","module","exports","12","__webpack_require__","13","list","toString","result","i","this","length","item","push","join","modules","mediaQuery","alreadyImportedModules","id"],"mappings":"AAAAA,cAAc,EAAE,IAEVC,EACA,SAASC,EAAQC,KAMjBC,GACA,SAASF,EAAQC,EAASE,GAEhCH,EAAOC,QAAUE,EAAoB,IAK/BC,GACA,SAASJ,EAAQC,GCbvBD,EAAAC,QAAA,WACA,GAAAI,KA0CA,OAvCAA,GAAAC,SAAA,WAEA,OADAC,MACAC,EAAA,EAAgBA,EAAAC,KAAAC,OAAiBF,IAAA,CACjC,GAAAG,GAAAF,KAAAD,EACAG,GAAA,GACAJ,EAAAK,KAAA,UAAAD,EAAA,OAAwCA,EAAA,QAExCJ,EAAAK,KAAAD,EAAA,IAGA,MAAAJ,GAAAM,KAAA,KAIAR,EAAAG,EAAA,SAAAM,EAAAC,GACA,gBAAAD,KACAA,IAAA,KAAAA,EAAA,KAEA,QADAE,MACAR,EAAA,EAAgBA,EAAAC,KAAAC,OAAiBF,IAAA,CACjC,GAAAS,GAAAR,KAAAD,GAAA,EACA,iBAAAS,KACAD,EAAAC,IAAA,GAEA,IAAAT,EAAA,EAAYA,EAAAM,EAAAJ,OAAoBF,IAAA,CAChC,GAAAG,GAAAG,EAAAN,EAKA,iBAAAG,GAAA,IAAAK,EAAAL,EAAA,MACAI,IAAAJ,EAAA,GACAA,EAAA,GAAAI,EACKA,IACLJ,EAAA,OAAAA,EAAA,aAAAI,EAAA,KAEAV,EAAAO,KAAAD,MAIAN,MD0BG","file":"bundle.vendor.b16cc08e016d07886f5f.js","sourcesContent":["webpackJsonp([1,2],{\n\n/***/ 1:\n/***/ function(module, exports) {\n\n// removed by extract-text-webpack-plugin\n\n/***/ },\n\n/***/ 12:\n/***/ function(module, exports, __webpack_require__) {\n\nmodule.exports = __webpack_require__(1);\n\n\n/***/ },\n\n/***/ 13:\n/***/ function(module, exports) {\n\n/*\r\n\tMIT License http://www.opensource.org/licenses/mit-license.php\r\n\tAuthor Tobias Koppers @sokra\r\n*/\r\n// css base code, injected by the css-loader\r\nmodule.exports = function() {\r\n\tvar list = [];\r\n\r\n\t// return the list of modules as css string\r\n\tlist.toString = function toString() {\r\n\t\tvar result = [];\r\n\t\tfor(var i = 0; i < this.length; i++) {\r\n\t\t\tvar item = this[i];\r\n\t\t\tif(item[2]) {\r\n\t\t\t\tresult.push(\"@media \" + item[2] + \"{\" + item[1] + \"}\");\r\n\t\t\t} else {\r\n\t\t\t\tresult.push(item[1]);\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn result.join(\"\");\r\n\t};\r\n\r\n\t// import a list of modules into the list\r\n\tlist.i = function(modules, mediaQuery) {\r\n\t\tif(typeof modules === \"string\")\r\n\t\t\tmodules = [[null, modules, \"\"]];\r\n\t\tvar alreadyImportedModules = {};\r\n\t\tfor(var i = 0; i < this.length; i++) {\r\n\t\t\tvar id = this[i][0];\r\n\t\t\tif(typeof id === \"number\")\r\n\t\t\t\talreadyImportedModules[id] = true;\r\n\t\t}\r\n\t\tfor(i = 0; i < modules.length; i++) {\r\n\t\t\tvar item = modules[i];\r\n\t\t\t// skip already imported module\r\n\t\t\t// this implementation is not 100% perfect for weird media query combinations\r\n\t\t\t//  when a module is imported multiple times with different media queries.\r\n\t\t\t//  I hope this will never occur (Hey this way we have smaller bundles)\r\n\t\t\tif(typeof item[0] !== \"number\" || !alreadyImportedModules[item[0]]) {\r\n\t\t\t\tif(mediaQuery && !item[2]) {\r\n\t\t\t\t\titem[2] = mediaQuery;\r\n\t\t\t\t} else if(mediaQuery) {\r\n\t\t\t\t\titem[2] = \"(\" + item[2] + \") and (\" + mediaQuery + \")\";\r\n\t\t\t\t}\r\n\t\t\t\tlist.push(item);\r\n\t\t\t}\r\n\t\t}\r\n\t};\r\n\treturn list;\r\n};\r\n\n\n/***/ }\n\n},[12]);\n\n\n// WEBPACK FOOTER //\n// bundle.vendor.b16cc08e016d07886f5f.js","/*\r\n\tMIT License http://www.opensource.org/licenses/mit-license.php\r\n\tAuthor Tobias Koppers @sokra\r\n*/\r\n// css base code, injected by the css-loader\r\nmodule.exports = function() {\r\n\tvar list = [];\r\n\r\n\t// return the list of modules as css string\r\n\tlist.toString = function toString() {\r\n\t\tvar result = [];\r\n\t\tfor(var i = 0; i < this.length; i++) {\r\n\t\t\tvar item = this[i];\r\n\t\t\tif(item[2]) {\r\n\t\t\t\tresult.push(\"@media \" + item[2] + \"{\" + item[1] + \"}\");\r\n\t\t\t} else {\r\n\t\t\t\tresult.push(item[1]);\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn result.join(\"\");\r\n\t};\r\n\r\n\t// import a list of modules into the list\r\n\tlist.i = function(modules, mediaQuery) {\r\n\t\tif(typeof modules === \"string\")\r\n\t\t\tmodules = [[null, modules, \"\"]];\r\n\t\tvar alreadyImportedModules = {};\r\n\t\tfor(var i = 0; i < this.length; i++) {\r\n\t\t\tvar id = this[i][0];\r\n\t\t\tif(typeof id === \"number\")\r\n\t\t\t\talreadyImportedModules[id] = true;\r\n\t\t}\r\n\t\tfor(i = 0; i < modules.length; i++) {\r\n\t\t\tvar item = modules[i];\r\n\t\t\t// skip already imported module\r\n\t\t\t// this implementation is not 100% perfect for weird media query combinations\r\n\t\t\t//  when a module is imported multiple times with different media queries.\r\n\t\t\t//  I hope this will never occur (Hey this way we have smaller bundles)\r\n\t\t\tif(typeof item[0] !== \"number\" || !alreadyImportedModules[item[0]]) {\r\n\t\t\t\tif(mediaQuery && !item[2]) {\r\n\t\t\t\t\titem[2] = mediaQuery;\r\n\t\t\t\t} else if(mediaQuery) {\r\n\t\t\t\t\titem[2] = \"(\" + item[2] + \") and (\" + mediaQuery + \")\";\r\n\t\t\t\t}\r\n\t\t\t\tlist.push(item);\r\n\t\t\t}\r\n\t\t}\r\n\t};\r\n\treturn list;\r\n};\r\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ../~/css-loader/lib/css-base.js\n// module id = 13\n// module chunks = 1"],"sourceRoot":""}
\ No newline at end of file
+{"version":3,"sources":["webpack:///bundle.vendor.577c6bc09319b27fed34.js","webpack:///../~/css-loader/lib/css-base.js"],"names":["webpackJsonp","1","module","exports","12","__webpack_require__","13","list","toString","result","i","this","length","item","push","join","modules","mediaQuery","alreadyImportedModules","id"],"mappings":"AAAAA,cAAc,EAAE,IAEVC,EACA,SAASC,EAAQC,KAMjBC,GACA,SAASF,EAAQC,EAASE,GAEhCH,EAAOC,QAAUE,EAAoB,IAK/BC,GACA,SAASJ,EAAQC,GCbvBD,EAAAC,QAAA,WACA,GAAAI,KA0CA,OAvCAA,GAAAC,SAAA,WAEA,OADAC,MACAC,EAAA,EAAgBA,EAAAC,KAAAC,OAAiBF,IAAA,CACjC,GAAAG,GAAAF,KAAAD,EACAG,GAAA,GACAJ,EAAAK,KAAA,UAAAD,EAAA,OAAwCA,EAAA,QAExCJ,EAAAK,KAAAD,EAAA,IAGA,MAAAJ,GAAAM,KAAA,KAIAR,EAAAG,EAAA,SAAAM,EAAAC,GACA,gBAAAD,KACAA,IAAA,KAAAA,EAAA,KAEA,QADAE,MACAR,EAAA,EAAgBA,EAAAC,KAAAC,OAAiBF,IAAA,CACjC,GAAAS,GAAAR,KAAAD,GAAA,EACA,iBAAAS,KACAD,EAAAC,IAAA,GAEA,IAAAT,EAAA,EAAYA,EAAAM,EAAAJ,OAAoBF,IAAA,CAChC,GAAAG,GAAAG,EAAAN,EAKA,iBAAAG,GAAA,IAAAK,EAAAL,EAAA,MACAI,IAAAJ,EAAA,GACAA,EAAA,GAAAI,EACKA,IACLJ,EAAA,OAAAA,EAAA,aAAAI,EAAA,KAEAV,EAAAO,KAAAD,MAIAN,MD0BG","file":"bundle.vendor.577c6bc09319b27fed34.js","sourcesContent":["webpackJsonp([1,2],{\n\n/***/ 1:\n/***/ function(module, exports) {\n\n// removed by extract-text-webpack-plugin\n\n/***/ },\n\n/***/ 12:\n/***/ function(module, exports, __webpack_require__) {\n\nmodule.exports = __webpack_require__(1);\n\n\n/***/ },\n\n/***/ 13:\n/***/ function(module, exports) {\n\n/*\r\n\tMIT License http://www.opensource.org/licenses/mit-license.php\r\n\tAuthor Tobias Koppers @sokra\r\n*/\r\n// css base code, injected by the css-loader\r\nmodule.exports = function() {\r\n\tvar list = [];\r\n\r\n\t// return the list of modules as css string\r\n\tlist.toString = function toString() {\r\n\t\tvar result = [];\r\n\t\tfor(var i = 0; i < this.length; i++) {\r\n\t\t\tvar item = this[i];\r\n\t\t\tif(item[2]) {\r\n\t\t\t\tresult.push(\"@media \" + item[2] + \"{\" + item[1] + \"}\");\r\n\t\t\t} else {\r\n\t\t\t\tresult.push(item[1]);\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn result.join(\"\");\r\n\t};\r\n\r\n\t// import a list of modules into the list\r\n\tlist.i = function(modules, mediaQuery) {\r\n\t\tif(typeof modules === \"string\")\r\n\t\t\tmodules = [[null, modules, \"\"]];\r\n\t\tvar alreadyImportedModules = {};\r\n\t\tfor(var i = 0; i < this.length; i++) {\r\n\t\t\tvar id = this[i][0];\r\n\t\t\tif(typeof id === \"number\")\r\n\t\t\t\talreadyImportedModules[id] = true;\r\n\t\t}\r\n\t\tfor(i = 0; i < modules.length; i++) {\r\n\t\t\tvar item = modules[i];\r\n\t\t\t// skip already imported module\r\n\t\t\t// this implementation is not 100% perfect for weird media query combinations\r\n\t\t\t//  when a module is imported multiple times with different media queries.\r\n\t\t\t//  I hope this will never occur (Hey this way we have smaller bundles)\r\n\t\t\tif(typeof item[0] !== \"number\" || !alreadyImportedModules[item[0]]) {\r\n\t\t\t\tif(mediaQuery && !item[2]) {\r\n\t\t\t\t\titem[2] = mediaQuery;\r\n\t\t\t\t} else if(mediaQuery) {\r\n\t\t\t\t\titem[2] = \"(\" + item[2] + \") and (\" + mediaQuery + \")\";\r\n\t\t\t\t}\r\n\t\t\t\tlist.push(item);\r\n\t\t\t}\r\n\t\t}\r\n\t};\r\n\treturn list;\r\n};\r\n\n\n/***/ }\n\n},[12]);\n\n\n// WEBPACK FOOTER //\n// bundle.vendor.577c6bc09319b27fed34.js","/*\r\n\tMIT License http://www.opensource.org/licenses/mit-license.php\r\n\tAuthor Tobias Koppers @sokra\r\n*/\r\n// css base code, injected by the css-loader\r\nmodule.exports = function() {\r\n\tvar list = [];\r\n\r\n\t// return the list of modules as css string\r\n\tlist.toString = function toString() {\r\n\t\tvar result = [];\r\n\t\tfor(var i = 0; i < this.length; i++) {\r\n\t\t\tvar item = this[i];\r\n\t\t\tif(item[2]) {\r\n\t\t\t\tresult.push(\"@media \" + item[2] + \"{\" + item[1] + \"}\");\r\n\t\t\t} else {\r\n\t\t\t\tresult.push(item[1]);\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn result.join(\"\");\r\n\t};\r\n\r\n\t// import a list of modules into the list\r\n\tlist.i = function(modules, mediaQuery) {\r\n\t\tif(typeof modules === \"string\")\r\n\t\t\tmodules = [[null, modules, \"\"]];\r\n\t\tvar alreadyImportedModules = {};\r\n\t\tfor(var i = 0; i < this.length; i++) {\r\n\t\t\tvar id = this[i][0];\r\n\t\t\tif(typeof id === \"number\")\r\n\t\t\t\talreadyImportedModules[id] = true;\r\n\t\t}\r\n\t\tfor(i = 0; i < modules.length; i++) {\r\n\t\t\tvar item = modules[i];\r\n\t\t\t// skip already imported module\r\n\t\t\t// this implementation is not 100% perfect for weird media query combinations\r\n\t\t\t//  when a module is imported multiple times with different media queries.\r\n\t\t\t//  I hope this will never occur (Hey this way we have smaller bundles)\r\n\t\t\tif(typeof item[0] !== \"number\" || !alreadyImportedModules[item[0]]) {\r\n\t\t\t\tif(mediaQuery && !item[2]) {\r\n\t\t\t\t\titem[2] = mediaQuery;\r\n\t\t\t\t} else if(mediaQuery) {\r\n\t\t\t\t\titem[2] = \"(\" + item[2] + \") and (\" + mediaQuery + \")\";\r\n\t\t\t\t}\r\n\t\t\t\tlist.push(item);\r\n\t\t\t}\r\n\t\t}\r\n\t};\r\n\treturn list;\r\n};\r\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ../~/css-loader/lib/css-base.js\n// module id = 13\n// module chunks = 1"],"sourceRoot":""}
\ No newline at end of file
index 6affc13..203f604 100644 (file)
@@ -3,9 +3,9 @@
   <head>
     <meta charset="utf-8">
     <title>ES2015 + Babel + Webpack TodoMVC example</title>
-    <script>!function(e){function r(n){if(t[n])return t[n].exports;var o=t[n]={i:n,l:!1,exports:{}};return e[n].call(o.exports,o,o.exports,r),o.l=!0,o.exports}var n=window.webpackJsonp;window.webpackJsonp=function(t,u,c){for(var i,a,f,l=0,s=[];l<t.length;l++)a=t[l],o[a]&&s.push(o[a][0]),o[a]=0;for(i in u)Object.prototype.hasOwnProperty.call(u,i)&&(e[i]=u[i]);for(n&&n(t,u,c);s.length;)s.shift()();if(c)for(l=0;l<c.length;l++)f=r(r.s=c[l]);return f};var t={},o={2:0};r.e=function(e){function n(){u.onerror=u.onload=null,clearTimeout(c);var r=o[e];0!==r&&(r&&r[1](new Error("Loading chunk "+e+" failed.")),o[e]=void 0)}if(0===o[e])return Promise.resolve();if(o[e])return o[e][2];var t=document.getElementsByTagName("head")[0],u=document.createElement("script");u.type="text/javascript",u.charset="utf-8",u.async=!0,u.timeout=12e4,u.src=r.p+"bundle."+e+"."+{0:"71bb1f671e4e65604d05",1:"b16cc08e016d07886f5f"}[e]+".js";var c=setTimeout(n,12e4);u.onerror=u.onload=n,t.appendChild(u);var i=new Promise(function(r,n){o[e]=[r,n]});return o[e][2]=i},r.m=e,r.c=t,r.i=function(e){return e},r.d=function(e,r,n){Object.defineProperty(e,r,{configurable:!1,enumerable:!0,get:n})},r.n=function(e){var n=e&&e.__esModule?function(){return e["default"]}:function(){return e};return r.d(n,"a",n),n},r.o=function(e,r){return Object.prototype.hasOwnProperty.call(e,r)},r.p="",r.oe=function(e){throw console.error(e),e}}([]);
+    <script>!function(e){function r(n){if(t[n])return t[n].exports;var o=t[n]={i:n,l:!1,exports:{}};return e[n].call(o.exports,o,o.exports,r),o.l=!0,o.exports}var n=window.webpackJsonp;window.webpackJsonp=function(t,u,c){for(var i,a,f,l=0,s=[];l<t.length;l++)a=t[l],o[a]&&s.push(o[a][0]),o[a]=0;for(i in u)Object.prototype.hasOwnProperty.call(u,i)&&(e[i]=u[i]);for(n&&n(t,u,c);s.length;)s.shift()();if(c)for(l=0;l<c.length;l++)f=r(r.s=c[l]);return f};var t={},o={2:0};r.e=function(e){function n(){u.onerror=u.onload=null,clearTimeout(c);var r=o[e];0!==r&&(r&&r[1](new Error("Loading chunk "+e+" failed.")),o[e]=void 0)}if(0===o[e])return Promise.resolve();if(o[e])return o[e][2];var t=document.getElementsByTagName("head")[0],u=document.createElement("script");u.type="text/javascript",u.charset="utf-8",u.async=!0,u.timeout=12e4,u.src=r.p+"bundle."+e+"."+{0:"930ad8b83126862d7445",1:"577c6bc09319b27fed34"}[e]+".js";var c=setTimeout(n,12e4);u.onerror=u.onload=n,t.appendChild(u);var i=new Promise(function(r,n){o[e]=[r,n]});return o[e][2]=i},r.m=e,r.c=t,r.i=function(e){return e},r.d=function(e,r,n){Object.defineProperty(e,r,{configurable:!1,enumerable:!0,get:n})},r.n=function(e){var n=e&&e.__esModule?function(){return e["default"]}:function(){return e};return r.d(n,"a",n),n},r.o=function(e,r){return Object.prototype.hasOwnProperty.call(e,r)},r.p="",r.oe=function(e){throw console.error(e),e}}([]);
 </script>
-  <link href="styles.vendor.b16cc08e016d07886f5f.css" rel="stylesheet"><link href="styles.app.71bb1f671e4e65604d05.css" rel="stylesheet"><script type="text/javascript" src="bundle.vendor.b16cc08e016d07886f5f.js"></script><script type="text/javascript" src="bundle.app.71bb1f671e4e65604d05.js"></script></head>
+  <link href="styles.vendor.577c6bc09319b27fed34.css" rel="stylesheet"><link href="styles.app.930ad8b83126862d7445.css" rel="stylesheet"><script type="text/javascript" src="bundle.vendor.577c6bc09319b27fed34.js"></script><script type="text/javascript" src="bundle.app.930ad8b83126862d7445.js"></script></head>
   <body>
     <section class="todoapp">
       <header class="header">
@@ -1,2 +1,2 @@
 .toggle-graph{float:left;margin-left:16px;cursor:pointer;position:relative;z-index:1}.toggle-graph svg{height:20px;width:20px}.toggle-graph svg path{fill:#777}.toggle-graph.active svg path,.toggle-graph:focus svg path,.toggle-graph:hover svg path{fill:#000}
-/*# sourceMappingURL=styles.app.71bb1f671e4e65604d05.css.map*/
\ No newline at end of file
+/*# sourceMappingURL=styles.app.930ad8b83126862d7445.css.map*/
\ No newline at end of file
diff --git a/PerformanceTests/Speedometer/resources/todomvc/vanilla-examples/es2015-babel-webpack/dist/styles.vendor.577c6bc09319b27fed34.css b/PerformanceTests/Speedometer/resources/todomvc/vanilla-examples/es2015-babel-webpack/dist/styles.vendor.577c6bc09319b27fed34.css
new file mode 100644 (file)
index 0000000..d353b18
--- /dev/null
@@ -0,0 +1,2 @@
+body,button,html{margin:0;padding:0}button{border:0;background:none;font-size:100%;vertical-align:baseline;font-family:inherit;font-weight:inherit;color:inherit;-webkit-appearance:none;appearance:none;-webkit-font-smoothing:antialiased}body,button{-moz-osx-font-smoothing:grayscale}body{font:14px Helvetica Neue,Helvetica,Arial,sans-serif;line-height:1.4em;background:#f5f5f5;color:#4d4d4d;min-width:230px;max-width:550px;margin:0 auto;-webkit-font-smoothing:antialiased;font-weight:300}:focus{outline:0}.hidden{display:none}.todoapp{background:#fff;margin:130px 0 40px;position:relative;box-shadow:0 2px 4px 0 rgba(0,0,0,.2),0 25px 50px 0 rgba(0,0,0,.1)}.todoapp input::-webkit-input-placeholder{font-style:italic;font-weight:300;color:#e6e6e6}.todoapp input::-moz-placeholder{font-style:italic;font-weight:300;color:#e6e6e6}.todoapp input::input-placeholder{font-style:italic;font-weight:300;color:#e6e6e6}.todoapp h1{position:absolute;top:-155px;width:100%;font-size:100px;font-weight:100;text-align:center;color:rgba(175,47,47,.15);-webkit-text-rendering:optimizeLegibility;-moz-text-rendering:optimizeLegibility;text-rendering:optimizeLegibility}.edit,.new-todo{position:relative;margin:0;width:100%;font-size:24px;font-family:inherit;font-weight:inherit;line-height:1.4em;border:0;color:inherit;padding:6px;border:1px solid #999;box-shadow:inset 0 -1px 5px 0 rgba(0,0,0,.2);box-sizing:border-box;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.new-todo{padding:16px 16px 16px 60px;border:none;background:rgba(0,0,0,.003);box-shadow:inset 0 -2px 1px rgba(0,0,0,.03)}.main{position:relative;z-index:2;border-top:1px solid #e6e6e6}.toggle-all{text-align:center;border:none;opacity:0;position:absolute}.toggle-all+label{width:60px;height:34px;font-size:0;position:absolute;top:-52px;left:-13px;-webkit-transform:rotate(90deg);transform:rotate(90deg)}.toggle-all+label:before{content:"\276F";font-size:22px;color:#e6e6e6;padding:10px 27px}.toggle-all:checked+label:before{color:#737373}.todo-list{margin:0;padding:0;list-style:none}.todo-list li{position:relative;font-size:24px;border-bottom:1px solid #ededed}.todo-list li:last-child{border-bottom:none}.todo-list li.editing{border-bottom:none;padding:0}.todo-list li.editing .edit{display:block;width:506px;padding:12px 16px;margin:0 0 0 43px}.todo-list li.editing .view{display:none}.todo-list li .toggle{text-align:center;width:40px;height:auto;position:absolute;top:0;bottom:0;margin:auto 0;border:none;-webkit-appearance:none;appearance:none;opacity:0}.todo-list li .toggle+label{background-image:url("data:image/svg+xml;utf8,%3Csvg%20xmlns%3D%22http%3A//www.w3.org/2000/svg%22%20width%3D%2240%22%20height%3D%2240%22%20viewBox%3D%22-10%20-18%20100%20135%22%3E%3Ccircle%20cx%3D%2250%22%20cy%3D%2250%22%20r%3D%2250%22%20fill%3D%22none%22%20stroke%3D%22%23ededed%22%20stroke-width%3D%223%22/%3E%3C/svg%3E");background-repeat:no-repeat;background-position:0}.todo-list li .toggle:checked+label{background-image:url("data:image/svg+xml;utf8,%3Csvg%20xmlns%3D%22http%3A//www.w3.org/2000/svg%22%20width%3D%2240%22%20height%3D%2240%22%20viewBox%3D%22-10%20-18%20100%20135%22%3E%3Ccircle%20cx%3D%2250%22%20cy%3D%2250%22%20r%3D%2250%22%20fill%3D%22none%22%20stroke%3D%22%23bddad5%22%20stroke-width%3D%223%22/%3E%3Cpath%20fill%3D%22%235dc2af%22%20d%3D%22M72%2025L42%2071%2027%2056l-4%204%2020%2020%2034-52z%22/%3E%3C/svg%3E")}.todo-list li label{word-break:break-all;padding:15px 15px 15px 60px;display:block;line-height:1.2;transition:color .4s}.todo-list li.completed label{color:#d9d9d9;text-decoration:line-through}.todo-list li .destroy{display:none;position:absolute;top:0;right:10px;bottom:0;width:40px;height:40px;margin:auto 0;font-size:30px;color:#cc9a9a;margin-bottom:11px;transition:color .2s ease-out}.todo-list li .destroy:hover{color:#af5b5e}.todo-list li .destroy:after{content:"\D7"}.todo-list li:hover .destroy{display:block}.todo-list li .edit{display:none}.todo-list li.editing:last-child{margin-bottom:-1px}.footer{color:#777;padding:10px 15px;height:20px;text-align:center;border-top:1px solid #e6e6e6}.footer:before{content:"";position:absolute;right:0;bottom:0;left:0;height:50px;overflow:hidden;box-shadow:0 1px 1px rgba(0,0,0,.2),0 8px 0 -3px #f6f6f6,0 9px 1px -3px rgba(0,0,0,.2),0 16px 0 -6px #f6f6f6,0 17px 2px -6px rgba(0,0,0,.2)}.todo-count{float:left;text-align:left}.todo-count strong{font-weight:300}.filters{margin:0;padding:0;list-style:none;position:absolute;right:0;left:0}.filters li{display:inline}.filters li a{color:inherit;margin:3px;padding:3px 7px;text-decoration:none;border:1px solid transparent;border-radius:3px}.filters li a:hover{border-color:rgba(175,47,47,.1)}.filters li a.selected{border-color:rgba(175,47,47,.2)}.clear-completed,html .clear-completed:active{float:right;position:relative;line-height:20px;text-decoration:none;cursor:pointer}.clear-completed:hover{text-decoration:underline}.info{margin:65px auto 0;color:#bfbfbf;font-size:10px;text-shadow:0 1px 0 hsla(0,0%,100%,.5);text-align:center}.info p{line-height:1}.info a{color:inherit;text-decoration:none;font-weight:400}.info a:hover{text-decoration:underline}@media screen and (-webkit-min-device-pixel-ratio:0){.todo-list li .toggle,.toggle-all{background:none}.todo-list li .toggle{height:40px}}@media (max-width:430px){.footer{height:50px}.filters{bottom:10px}}
+/*# sourceMappingURL=styles.vendor.577c6bc09319b27fed34.css.map*/
\ No newline at end of file
diff --git a/PerformanceTests/Speedometer/resources/todomvc/vanilla-examples/es2015-babel-webpack/dist/styles.vendor.b16cc08e016d07886f5f.css b/PerformanceTests/Speedometer/resources/todomvc/vanilla-examples/es2015-babel-webpack/dist/styles.vendor.b16cc08e016d07886f5f.css
deleted file mode 100644 (file)
index 3e9251e..0000000
+++ /dev/null
@@ -1,2 +0,0 @@
-body,button,html{margin:0;padding:0}button{border:0;background:none;font-size:100%;vertical-align:baseline;font-family:inherit;font-weight:inherit;color:inherit;-webkit-appearance:none;appearance:none;-webkit-font-smoothing:antialiased}body,button{-moz-osx-font-smoothing:grayscale}body{font:14px Helvetica Neue,Helvetica,Arial,sans-serif;line-height:1.4em;background:#f5f5f5;color:#4d4d4d;min-width:230px;max-width:550px;margin:0 auto;-webkit-font-smoothing:antialiased;font-weight:300}:focus{outline:0}.hidden{display:none}.todoapp{background:#fff;margin:130px 0 40px;position:relative;box-shadow:0 2px 4px 0 rgba(0,0,0,.2),0 25px 50px 0 rgba(0,0,0,.1)}.todoapp input::-webkit-input-placeholder{font-style:italic;font-weight:300;color:#e6e6e6}.todoapp input::-moz-placeholder{font-style:italic;font-weight:300;color:#e6e6e6}.todoapp input::input-placeholder{font-style:italic;font-weight:300;color:#e6e6e6}.todoapp h1{position:absolute;top:-155px;width:100%;font-size:100px;font-weight:100;text-align:center;color:rgba(175,47,47,.15);-webkit-text-rendering:optimizeLegibility;-moz-text-rendering:optimizeLegibility;text-rendering:optimizeLegibility}.edit,.new-todo{position:relative;margin:0;width:100%;font-size:24px;font-family:inherit;font-weight:inherit;line-height:1.4em;border:0;color:inherit;padding:6px;border:1px solid #999;box-shadow:inset 0 -1px 5px 0 rgba(0,0,0,.2);box-sizing:border-box;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.new-todo{padding:16px 16px 16px 60px;border:none;background:rgba(0,0,0,.003);box-shadow:inset 0 -2px 1px rgba(0,0,0,.03)}.main{position:relative;z-index:2;border-top:1px solid #e6e6e6}label[for=toggle-all]{display:none}.toggle-all{position:absolute;top:-55px;left:-12px;width:60px;height:34px;text-align:center;border:none}.toggle-all:before{content:"\276F";font-size:22px;color:#e6e6e6;padding:10px 27px}.toggle-all:checked:before{color:#737373}.todo-list{margin:0;padding:0;list-style:none}.todo-list li{position:relative;font-size:24px;border-bottom:1px solid #ededed}.todo-list li:last-child{border-bottom:none}.todo-list li.editing{border-bottom:none;padding:0}.todo-list li.editing .edit{display:block;width:506px;padding:12px 16px;margin:0 0 0 43px}.todo-list li.editing .view{display:none}.todo-list li .toggle{text-align:center;width:40px;height:auto;position:absolute;top:0;bottom:0;margin:auto 0;border:none;-webkit-appearance:none;appearance:none}.todo-list li .toggle:after{content:url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" width="40" height="40" viewBox="-10 -18 100 135"><circle cx="50" cy="50" r="50" fill="none" stroke="#ededed" stroke-width="3"/></svg>')}.todo-list li .toggle:checked:after{content:url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" width="40" height="40" viewBox="-10 -18 100 135"><circle cx="50" cy="50" r="50" fill="none" stroke="#bddad5" stroke-width="3"/><path fill="#5dc2af" d="M72 25L42 71 27 56l-4 4 20 20 34-52z"/></svg>')}.todo-list li label{word-break:break-all;padding:15px 60px 15px 15px;margin-left:45px;display:block;line-height:1.2;transition:color .4s}.todo-list li.completed label{color:#d9d9d9;text-decoration:line-through}.todo-list li .destroy{display:none;position:absolute;top:0;right:10px;bottom:0;width:40px;height:40px;margin:auto 0;font-size:30px;color:#cc9a9a;margin-bottom:11px;transition:color .2s ease-out}.todo-list li .destroy:hover{color:#af5b5e}.todo-list li .destroy:after{content:"\D7"}.todo-list li:hover .destroy{display:block}.todo-list li .edit{display:none}.todo-list li.editing:last-child{margin-bottom:-1px}.footer{color:#777;padding:10px 15px;height:20px;text-align:center;border-top:1px solid #e6e6e6}.footer:before{content:"";position:absolute;right:0;bottom:0;left:0;height:50px;overflow:hidden;box-shadow:0 1px 1px rgba(0,0,0,.2),0 8px 0 -3px #f6f6f6,0 9px 1px -3px rgba(0,0,0,.2),0 16px 0 -6px #f6f6f6,0 17px 2px -6px rgba(0,0,0,.2)}.todo-count{float:left;text-align:left}.todo-count strong{font-weight:300}.filters{margin:0;padding:0;list-style:none;position:absolute;right:0;left:0}.filters li{display:inline}.filters li a{color:inherit;margin:3px;padding:3px 7px;text-decoration:none;border:1px solid transparent;border-radius:3px}.filters li a:hover{border-color:rgba(175,47,47,.1)}.filters li a.selected{border-color:rgba(175,47,47,.2)}.clear-completed,html .clear-completed:active{float:right;position:relative;line-height:20px;text-decoration:none;cursor:pointer}.clear-completed:hover{text-decoration:underline}.info{margin:65px auto 0;color:#bfbfbf;font-size:10px;text-shadow:0 1px 0 hsla(0,0%,100%,.5);text-align:center}.info p{line-height:1}.info a{color:inherit;text-decoration:none;font-weight:400}.info a:hover{text-decoration:underline}@media screen and (-webkit-min-device-pixel-ratio:0){.todo-list li .toggle,.toggle-all{background:none}.todo-list li .toggle{height:40px}.toggle-all{-webkit-transform:rotate(90deg);transform:rotate(90deg);-webkit-appearance:none;appearance:none}}@media (max-width:430px){.footer{height:50px}.filters{bottom:10px}}
-/*# sourceMappingURL=styles.vendor.b16cc08e016d07886f5f.css.map*/
\ No newline at end of file
index 5fa2af7..7f2faeb 100644 (file)
       "dev": true
     },
     "todomvc-app-css": {
-      "version": "2.0.6",
-      "resolved": "https://registry.npmjs.org/todomvc-app-css/-/todomvc-app-css-2.0.6.tgz",
-      "integrity": "sha1-CzZnxeGJ8VaNmpv3lH69koQGlh0="
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/todomvc-app-css/-/todomvc-app-css-2.1.0.tgz",
+      "integrity": "sha1-tvJxbTOa+i5feZNH0qSLBTliQqU="
     },
     "topo": {
       "version": "2.0.2",
index 8867d99..574cd20 100644 (file)
@@ -6,7 +6,7 @@
     "rd3": "0.7.0",
     "react": "15.3.0",
     "react-dom": "15.3.0",
-    "todomvc-app-css": "2.0.6"
+    "todomvc-app-css": "2.1.0"
   },
   "devDependencies": {
     "babel-core": "6.13.2",
index c819b47..e04fbdb 100644 (file)
@@ -17,8 +17,7 @@ button {
     -webkit-appearance: none;
     appearance: none;
     -webkit-font-smoothing: antialiased;
-    -moz-font-smoothing: antialiased;
-    font-smoothing: antialiased;
+    -moz-osx-font-smoothing: grayscale;
 }
 
 body {
@@ -30,14 +29,12 @@ body {
     max-width: 550px;
     margin: 0 auto;
     -webkit-font-smoothing: antialiased;
-    -moz-font-smoothing: antialiased;
-    font-smoothing: antialiased;
+    -moz-osx-font-smoothing: grayscale;
     font-weight: 300;
 }
 
-button,
-input[type="checkbox"] {
-    outline: none;
+:focus {
+    outline: 0;
 }
 
 .hidden {
@@ -93,15 +90,13 @@ input[type="checkbox"] {
     font-weight: inherit;
     line-height: 1.4em;
     border: 0;
-    outline: none;
     color: inherit;
     padding: 6px;
     border: 1px solid #999;
     box-shadow: inset 0 -1px 5px 0 rgba(0, 0, 0, 0.2);
     box-sizing: border-box;
     -webkit-font-smoothing: antialiased;
-    -moz-font-smoothing: antialiased;
-    font-smoothing: antialiased;
+    -moz-osx-font-smoothing: grayscale;
 }
 
 .new-todo {
@@ -117,28 +112,32 @@ input[type="checkbox"] {
     border-top: 1px solid #e6e6e6;
 }
 
-label[for='toggle-all'] {
-    display: none;
-}
-
 .toggle-all {
+    text-align: center;
+    border: none; /* Mobile Safari */
+    opacity: 0;
     position: absolute;
-    top: -55px;
-    left: -12px;
+}
+
+.toggle-all + label {
     width: 60px;
     height: 34px;
-    text-align: center;
-    border: none; /* Mobile Safari */
+    font-size: 0;
+    position: absolute;
+    top: -52px;
+    left: -13px;
+    -webkit-transform: rotate(90deg);
+    transform: rotate(90deg);
 }
 
-.toggle-all:before {
+.toggle-all + label:before {
     content: '❯';
     font-size: 22px;
     color: #e6e6e6;
     padding: 10px 27px 10px 27px;
 }
 
-.toggle-all:checked:before {
+.toggle-all:checked + label:before {
     color: #737373;
 }
 
@@ -166,7 +165,7 @@ label[for='toggle-all'] {
 .todo-list li.editing .edit {
     display: block;
     width: 506px;
-    padding: 13px 17px 12px 17px;
+    padding: 12px 16px;
     margin: 0 0 0 43px;
 }
 
@@ -188,19 +187,27 @@ label[for='toggle-all'] {
     appearance: none;
 }
 
-.todo-list li .toggle:after {
-    content: url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" width="40" height="40" viewBox="-10 -18 100 135"><circle cx="50" cy="50" r="50" fill="none" stroke="#ededed" stroke-width="3"/></svg>');
+.todo-list li .toggle {
+    opacity: 0;
 }
 
-.todo-list li .toggle:checked:after {
-    content: url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" width="40" height="40" viewBox="-10 -18 100 135"><circle cx="50" cy="50" r="50" fill="none" stroke="#bddad5" stroke-width="3"/><path fill="#5dc2af" d="M72 25L42 71 27 56l-4 4 20 20 34-52z"/></svg>');
+.todo-list li .toggle + label {
+    /*
+        Firefox requires `#` to be escaped - https://bugzilla.mozilla.org/show_bug.cgi?id=922433
+        IE and Edge requires *everything* to be escaped to render, so we do that instead of just the `#` - https://developer.microsoft.com/en-us/microsoft-edge/platform/issues/7157459/
+    */
+    background-image: url('data:image/svg+xml;utf8,%3Csvg%20xmlns%3D%22http%3A//www.w3.org/2000/svg%22%20width%3D%2240%22%20height%3D%2240%22%20viewBox%3D%22-10%20-18%20100%20135%22%3E%3Ccircle%20cx%3D%2250%22%20cy%3D%2250%22%20r%3D%2250%22%20fill%3D%22none%22%20stroke%3D%22%23ededed%22%20stroke-width%3D%223%22/%3E%3C/svg%3E');
+    background-repeat: no-repeat;
+    background-position: center left;
+}
+
+.todo-list li .toggle:checked + label {
+    background-image: url('data:image/svg+xml;utf8,%3Csvg%20xmlns%3D%22http%3A//www.w3.org/2000/svg%22%20width%3D%2240%22%20height%3D%2240%22%20viewBox%3D%22-10%20-18%20100%20135%22%3E%3Ccircle%20cx%3D%2250%22%20cy%3D%2250%22%20r%3D%2250%22%20fill%3D%22none%22%20stroke%3D%22%23bddad5%22%20stroke-width%3D%223%22/%3E%3Cpath%20fill%3D%22%235dc2af%22%20d%3D%22M72%2025L42%2071%2027%2056l-4%204%2020%2020%2034-52z%22/%3E%3C/svg%3E');
 }
 
 .todo-list li label {
-    white-space: pre;
-    word-break: break-word;
-    padding: 15px 60px 15px 15px;
-    margin-left: 45px;
+    word-break: break-all;
+    padding: 15px 15px 15px 60px;
     display: block;
     line-height: 1.2;
     transition: color 0.4s;
@@ -300,7 +307,6 @@ label[for='toggle-all'] {
     border-radius: 3px;
 }
 
-.filters li a.selected,
 .filters li a:hover {
     border-color: rgba(175, 47, 47, 0.1);
 }
@@ -357,13 +363,6 @@ html .clear-completed:active {
     .todo-list li .toggle {
         height: 40px;
     }
-
-    .toggle-all {
-        -webkit-transform: rotate(90deg);
-        transform: rotate(90deg);
-        -webkit-appearance: none;
-        appearance: none;
-    }
 }
 
 @media (max-width: 430px) {