Commit f8e2b720 authored by TasteBot's avatar TasteBot

update the build files for gh-pages [ci skip]

parent 5bf1e393
......@@ -30,7 +30,7 @@ _If you have other helpful links to share, or find any of the links above no lon
## Implementation
The app spec says to use bower for dependency management unless it goes against the best practices of the framework. Ampersand.js very specifically uses npm for dependency management so that's what we're using here.
The app spec says to use bower for dependency management unless it goes against the best practices of the framework. Ampersand.js is very specifically uses npm for dependency management so that's what we're using here.
## Credit
......
node_modules/.bin
node_modules/jquery
!node_modules/jquery/dist/jquery.js
node_modules/components-ember
!node_modules/components-ember/ember.js
node_modules/ember-data
!node_modules/ember-data.js
node_modules/ember-localstorage-adapter
!node_modules/ember-localstorage-adapter/localstorage_adapter.js
node_modules/handlebars
!node_modules/handlebars/dist/handlebars.js
node_modules/todomvc-app-css
!node_modules/todomvc-app-css/index.css
node_modules/todomvc-common
!node_modules/todomvc-common/base.css
!node_modules/todomvc-common/base.js
todomvc/dist/assets/
\ No newline at end of file
<?xml version="1.0"?>
<!DOCTYPE cross-domain-policy SYSTEM "http://www.adobe.com/xml/dtds/cross-domain-policy.dtd">
<cross-domain-policy>
<!-- Read this: www.adobe.com/devnet/articles/crossdomain_policy_file_spec.html -->
<!-- Most restrictive policy: -->
<site-control permitted-cross-domain-policies="none"/>
<!-- Least restrictive policy: -->
<!--
<site-control permitted-cross-domain-policies="all"/>
<allow-access-from domain="*" to-ports="*" secure="false"/>
<allow-http-request-headers-from domain="*" headers="*" secure="false"/>
-->
</cross-domain-policy>
<!doctype html>
<html lang="en" data-framework="emberjs">
<head>
<meta charset="utf-8">
<title>ember.js • TodoMVC</title>
<link rel="stylesheet" href="node_modules/todomvc-common/base.css">
<link rel="stylesheet" href="node_modules/todomvc-app-css/index.css">
</head>
<body>
<script type="text/x-handlebars" data-template-name="todo-list">
{{#if length}}
<section id="main">
{{#if canToggle}}
{{input type="checkbox" id="toggle-all" checked=allTodos.allAreDone}}
{{/if}}
<ul id="todo-list">
{{#each}}
<li {{bind-attr class="isCompleted:completed isEditing:editing"}}>
{{#if isEditing}}
{{todo-input type="text" class="edit" value=bufferedTitle focus-out="doneEditing" insert-newline="doneEditing" escape-press="cancelEditing"}}
{{else}}
{{input type="checkbox" class="toggle" checked=isCompleted}}
<label {{action "editTodo" on="doubleClick"}}>{{title}}</label>
<button {{action "removeTodo"}} class="destroy"></button>
{{/if}}
</li>
{{/each}}
</ul>
</section>
{{/if}}
</script>
<script type="text/x-handlebars" data-template-name="todos">
<section id="todoapp">
<header id="header">
<h1>todos</h1>
{{todo-input id="new-todo" type="text" value=newTitle action="createTodo" placeholder="What needs to be done?"}}
</header>
{{outlet}}
{{#if length}}
<footer id="footer">
<span id="todo-count"><strong>{{remaining.length}}</strong> {{pluralize 'item' remaining.length}} left</span>
<ul id="filters">
<li>
{{#link-to "todos.index" activeClass="selected"}}All{{/link-to}}
</li>
<li>
{{#link-to "todos.active" activeClass="selected"}}Active{{/link-to}}
</li>
<li>
{{#link-to "todos.completed" activeClass="selected"}}Completed{{/link-to}}
</li>
</ul>
{{#if completed.length}}
<button id="clear-completed" {{action "clearCompleted"}}>Clear completed</button>
{{/if}}
</footer>
{{/if}}
</section>
<footer id="info">
<p>Double-click to edit a todo</p>
<p>
Created by
<a href="http://github.com/tomdale">Tom Dale</a>,
<a href="http://github.com/addyosmani">Addy Osmani</a>
</p>
<p>
Updated by
<a href="http://github.com/bantic">Cory Forsyth</a>
</p>
<p>Part of <a href="http://todomvc.com">TodoMVC</a></p>
</footer>
</script>
<script src="node_modules/todomvc-common/base.js"></script>
<script src="node_modules/jquery/dist/jquery.js"></script>
<script src="node_modules/handlebars/dist/handlebars.js"></script>
<script src="node_modules/components-ember/ember.js"></script>
<script src="node_modules/ember-data/ember-data.js"></script>
<script src="node_modules/ember-localstorage-adapter/localstorage_adapter.js"></script>
<script src="js/app.js"></script>
<script src="js/router.js"></script>
<script src="js/models/todo.js"></script>
<script src="js/controllers/todos_controller.js"></script>
<script src="js/controllers/todos_list_controller.js"></script>
<script src="js/controllers/todo_controller.js"></script>
<script src="js/views/todo_input_component.js"></script>
<script src="js/helpers/pluralize.js"></script>
</body>
</html>
todomvc/dist/index.html
\ No newline at end of file
/*global Ember, DS, Todos:true */
window.Todos = Ember.Application.create();
Todos.ApplicationAdapter = DS.LSAdapter.extend({
namespace: 'todos-emberjs'
});
/*global Todos, Ember */
(function () {
'use strict';
Todos.TodoController = Ember.ObjectController.extend({
isEditing: false,
// We use the bufferedTitle to store the original value of
// the model's title so that we can roll it back later in the
// `cancelEditing` action.
bufferedTitle: Ember.computed.oneWay('title'),
actions: {
editTodo: function () {
this.set('isEditing', true);
},
doneEditing: function () {
var bufferedTitle = this.get('bufferedTitle').trim();
if (Ember.isEmpty(bufferedTitle)) {
// The `doneEditing` action gets sent twice when the user hits
// enter (once via 'insert-newline' and once via 'focus-out').
//
// We debounce our call to 'removeTodo' so that it only gets
// made once.
Ember.run.debounce(this, 'removeTodo', 0);
} else {
var todo = this.get('model');
todo.set('title', bufferedTitle);
todo.save();
}
// Re-set our newly edited title to persist its trimmed version
this.set('bufferedTitle', bufferedTitle);
this.set('isEditing', false);
},
cancelEditing: function () {
this.set('bufferedTitle', this.get('title'));
this.set('isEditing', false);
},
removeTodo: function () {
this.removeTodo();
}
},
removeTodo: function () {
var todo = this.get('model');
todo.deleteRecord();
todo.save();
},
saveWhenCompleted: function () {
this.get('model').save();
}.observes('isCompleted')
});
})();
/*global Todos, Ember */
(function () {
'use strict';
Todos.TodosController = Ember.ArrayController.extend({
actions: {
createTodo: function () {
var title, todo;
// Get the todo title set by the "New Todo" text field
title = this.get('newTitle').trim();
if (!title) {
return;
}
// Create the new Todo model
todo = this.store.createRecord('todo', {
title: title,
isCompleted: false
});
todo.save();
// Clear the "New Todo" text field
this.set('newTitle', '');
},
clearCompleted: function () {
var completed = this.get('completed');
completed.invoke('deleteRecord');
completed.invoke('save');
}
},
/* properties */
remaining: Ember.computed.filterBy('model', 'isCompleted', false),
completed: Ember.computed.filterBy('model', 'isCompleted', true),
allAreDone: function (key, value) {
if (value !== undefined) {
this.setEach('isCompleted', value);
return value;
} else {
var length = this.get('length');
var completedLength = this.get('completed.length');
return length > 0 && length === completedLength;
}
}.property('length', 'completed.length')
});
})();
/*global Todos, Ember */
(function () {
'use strict';
Todos.TodosListController = Ember.ArrayController.extend({
needs: ['todos'],
allTodos: Ember.computed.alias('controllers.todos'),
itemController: 'todo',
canToggle: function () {
var anyTodos = this.get('allTodos.length');
var isEditing = this.isAny('isEditing');
return anyTodos && !isEditing;
}.property('allTodos.length', '@each.isEditing')
});
})();
/*global Ember */
(function () {
'use strict';
Ember.Handlebars.helper('pluralize', function (singular, count) {
/* From Ember-Data */
var inflector = Ember.Inflector.inflector;
return count === 1 ? singular : inflector.pluralize(singular);
});
})();
/*global Todos, DS */
(function () {
'use strict';
Todos.Todo = DS.Model.extend({
title: DS.attr('string'),
isCompleted: DS.attr('boolean')
});
})();
/*global Ember, Todos */
(function () {
'use strict';
Todos.Router.map(function () {
this.resource('todos', { path: '/' }, function () {
this.route('active');
this.route('completed');
});
});
Todos.TodosRoute = Ember.Route.extend({
model: function () {
return this.store.find('todo');
}
});
Todos.TodosIndexRoute = Todos.TodosRoute.extend({
templateName: 'todo-list',
controllerName: 'todos-list'
});
Todos.TodosActiveRoute = Todos.TodosIndexRoute.extend({
model: function () {
return this.store.filter('todo', function (todo) {
return !todo.get('isCompleted');
});
}
});
Todos.TodosCompletedRoute = Todos.TodosIndexRoute.extend({
model: function () {
return this.store.filter('todo', function (todo) {
return todo.get('isCompleted');
});
}
});
})();
/*global Todos, Ember */
(function () {
'use strict';
Todos.TodoInputComponent = Ember.TextField.extend({
focusOnInsert: function () {
// Re-set input value to get rid of a redundant text selection
this.$().val(this.$().val());
this.$().focus();
}.on('didInsertElement')
});
})();
This source diff could not be displayed because it is too large. You can view the blob instead.
This source diff could not be displayed because it is too large. You can view the blob instead.
/*global Ember*/
/*global DS*/
(function () {
'use strict';
DS.LSSerializer = DS.JSONSerializer.extend({
serializeHasMany: function(record, json, relationship) {
var key = relationship.key;
var payloadKey = this.keyForRelationship ? this.keyForRelationship(key, "hasMany") : key;
var relationshipType = record.constructor.determineRelationshipType(relationship);
if (relationshipType === 'manyToNone' ||
relationshipType === 'manyToMany' ||
relationshipType === 'manyToOne') {
json[payloadKey] = record.get(key).mapBy('id');
// TODO support for polymorphic manyToNone and manyToMany relationships
}
},
/**
* Extracts whatever was returned from the adapter.
*
* If the adapter returns relationships in an embedded way, such as follows:
*
* ```js
* {
* "id": 1,
* "title": "Rails Rambo",
*
* "_embedded": {
* "comment": [{
* "id": 1,
* "comment_title": "FIRST"
* }, {
* "id": 2,
* "comment_title": "Rails is unagi"
* }]
* }
* }
*
* this method will create separated JSON for each resource and then push
* them individually to the Store.
*
* In the end, only the main resource will remain, containing the ids of its
* relationships. Given the relations are already in the Store, we will
* return a JSON with the main resource alone. The Store will sort out the
* associations by itself.
*
* @method extractSingle
* @private
* @param {DS.Store} store the returned store
* @param {DS.Model} type the type/model
* @param {Object} payload returned JSON
*/
extractSingle: function(store, type, payload) {
if (payload && payload._embedded) {
for (var relation in payload._embedded) {
var relType = type.typeForRelationship(relation);
var typeName = relType.typeKey,
embeddedPayload = payload._embedded[relation];
if (embeddedPayload) {
if (Ember.isArray(embeddedPayload)) {
store.pushMany(typeName, embeddedPayload);
} else {
store.push(typeName, embeddedPayload);
}
}
}
delete payload._embedded;
}
return this.normalize(type, payload);
},
/**
* This is exactly the same as extractSingle, but used in an array.
*
* @method extractSingle
* @private
* @param {DS.Store} store the returned store
* @param {DS.Model} type the type/model
* @param {Array} payload returned JSONs
*/
extractArray: function(store, type, payload) {
return payload.map(function(json) {
return this.extractSingle(store, type, json);
}, this);
}
});
DS.LSAdapter = DS.Adapter.extend(Ember.Evented, {
/**
This is the main entry point into finding records. The first parameter to
this method is the model's name as a string.
@method find
@param {DS.Model} type
@param {Object|String|Integer|null} id
*/
find: function(store, type, id, opts) {
var allowRecursive = true;
var namespace = this._namespaceForType(type);
var record = Ember.A(namespace.records[id]);
/**
* In the case where there are relationships, this method is called again
* for each relation. Given the relations have references to the main
* object, we use allowRecursive to avoid going further into infinite
* recursiveness.
*
* Concept from ember-indexdb-adapter
*/
if (opts && typeof opts.allowRecursive !== 'undefined') {
allowRecursive = opts.allowRecursive;
}
if (!record || !record.hasOwnProperty('id')) {
return Ember.RSVP.reject(new Error("Couldn't find record of"
+ " type '" + type.typeKey
+ "' for the id '" + id + "'."));
}
if (allowRecursive) {
return this.loadRelationships(type, record);
} else {
return Ember.RSVP.resolve(record);
}
},
findMany: function (store, type, ids, opts) {
var namespace = this._namespaceForType(type);
var adapter = this,
allowRecursive = true,
results = [], record;
/**
* In the case where there are relationships, this method is called again
* for each relation. Given the relations have references to the main
* object, we use allowRecursive to avoid going further into infinite
* recursiveness.
*
* Concept from ember-indexdb-adapter
*/
if (opts && typeof opts.allowRecursive !== 'undefined') {
allowRecursive = opts.allowRecursive;
}
for (var i = 0; i < ids.length; i++) {
record = namespace.records[ids[i]];
if (!record || !record.hasOwnProperty('id')) {
return Ember.RSVP.reject(new Error("Couldn't find record of type '" + type.typeKey
+ "' for the id '" + ids[i] + "'."));
}
results.push(Ember.copy(record));
}
if (results.get('length') && allowRecursive) {
return this.loadRelationshipsForMany(type, results);
} else {
return Ember.RSVP.resolve(results);
}
},
// Supports queries that look like this:
//
// {
// <property to query>: <value or regex (for strings) to match>,
// ...
// }
//
// Every property added to the query is an "AND" query, not "OR"
//
// Example:
//
// match records with "complete: true" and the name "foo" or "bar"
//
// { complete: true, name: /foo|bar/ }
findQuery: function (store, type, query, recordArray) {
var namespace = this._namespaceForType(type);
var results = this.query(namespace.records, query);
if (results.get('length')) {
return this.loadRelationshipsForMany(type, results);
} else {
return Ember.RSVP.reject();
}
},
query: function (records, query) {
var results = [], record;
function recordMatchesQuery(record) {
return Ember.keys(query).every(function(property) {
var test = query[property];
if (Object.prototype.toString.call(test) === '[object RegExp]') {
return test.test(record[property]);
} else {
return record[property] === test;
}
});
}
for (var id in records) {
record = records[id];
if (recordMatchesQuery(record)) {
results.push(Ember.copy(record));
}
}
return results;
},
findAll: function (store, type) {
var namespace = this._namespaceForType(type),
results = [];
for (var id in namespace.records) {
results.push(Ember.copy(namespace.records[id]));
}
return Ember.RSVP.resolve(results);
},
createRecord: function (store, type, record) {
var namespaceRecords = this._namespaceForType(type);
var recordHash = record.serialize({includeId: true});
namespaceRecords.records[recordHash.id] = recordHash;
this.persistData(type, namespaceRecords);
return Ember.RSVP.resolve();
},
updateRecord: function (store, type, record) {
var namespaceRecords = this._namespaceForType(type);
var id = record.get('id');
namespaceRecords.records[id] = record.serialize({ includeId: true });
this.persistData(type, namespaceRecords);
return Ember.RSVP.resolve();
},
deleteRecord: function (store, type, record) {
var namespaceRecords = this._namespaceForType(type);
var id = record.get('id');
delete namespaceRecords.records[id];
this.persistData(type, namespaceRecords);
return Ember.RSVP.resolve();
},
generateIdForRecord: function () {
return Math.random().toString(32).slice(2).substr(0, 5);
},
// private
adapterNamespace: function () {
return this.get('namespace') || 'DS.LSAdapter';
},
loadData: function () {
var storage = localStorage.getItem(this.adapterNamespace());
return storage ? JSON.parse(storage) : {};
},
persistData: function(type, data) {
var modelNamespace = this.modelNamespace(type);
var localStorageData = this.loadData();
localStorageData[modelNamespace] = data;
localStorage.setItem(this.adapterNamespace(), JSON.stringify(localStorageData));
},
_namespaceForType: function (type) {
var namespace = this.modelNamespace(type);
var storage = this.loadData();
return storage[namespace] || {records: {}};
},
modelNamespace: function(type) {
return type.url || type.typeKey;
},
/**
* This takes a record, then analyzes the model relationships and replaces
* ids with the actual values.
*
* Stolen from ember-indexdb-adapter
*
* Consider the following JSON is entered:
*
* ```js
* {
* "id": 1,
* "title": "Rails Rambo",
* "comments": [1, 2]
* }
*
* This will return:
*
* ```js
* {
* "id": 1,
* "title": "Rails Rambo",
* "comments": [1, 2]
*
* "_embedded": {
* "comment": [{
* "_id": 1,
* "comment_title": "FIRST"
* }, {
* "_id": 2,
* "comment_title": "Rails is unagi"
* }]
* }
* }
*
* This way, whenever a resource returned, its relationships will be also
* returned.
*
* @method loadRelationships
* @private
* @param {DS.Model} type
* @param {Object} record
*/
loadRelationships: function(type, record) {
var adapter = this,
resultJSON = {},
typeKey = type.typeKey,
relationshipNames, relationships,
relationshipPromises = [];
/**
* Create a chain of promises, so the relationships are
* loaded sequentially. Think of the variable
* `recordPromise` as of the accumulator in a left fold.
*/
var recordPromise = Ember.RSVP.resolve(record);
relationshipNames = Ember.get(type, 'relationshipNames');
relationships = relationshipNames.belongsTo
.concat(relationshipNames.hasMany);
relationships.forEach(function(relationName) {
var relationModel = type.typeForRelationship(relationName);
var relationEmbeddedId = record[relationName];
var relationProp = adapter.relationshipProperties(type, relationName);
var relationType = relationProp.kind;
var foreignAdapter = type.store.adapterFor(relationModel);
var opts = {allowRecursive: false};
/**
* embeddedIds are ids of relations that are included in the main
* payload, such as:
*
* {
* cart: {
* id: "s85fb",
* customer: "rld9u"
* }
* }
*
* In this case, cart belongsTo customer and its id is present in the
* main payload. We find each of these records and add them to _embedded.
*/
if (relationEmbeddedId && foreignAdapter === adapter)
{
recordPromise = recordPromise.then(function(recordPayload) {
var promise;
if (relationType === 'belongsTo' || relationType === 'hasOne') {
promise = adapter.find(null, relationModel, relationEmbeddedId, opts);
} else if (relationType == 'hasMany') {
promise = adapter.findMany(null, relationModel, relationEmbeddedId, opts);
}
return promise.then(function(relationRecord) {
return adapter.addEmbeddedPayload(recordPayload, relationName, relationRecord);
});
});
}
});
return recordPromise;
},
/**
* Given the following payload,
*
* {
* cart: {
* id: "1",
* customer: "2"
* }
* }
*
* With `relationshipName` being `customer` and `relationshipRecord`
*
* {id: "2", name: "Rambo"}
*
* This method returns the following payload:
*
* {
* cart: {
* id: "1",
* customer: "2"
* },
* _embedded: {
* customer: {
* id: "2",
* name: "Rambo"
* }
* }
* }
*
* which is then treated by the serializer later.
*
* @method addEmbeddedPayload
* @private
* @param {Object} payload
* @param {String} relationshipName
* @param {Object} relationshipRecord
*/
addEmbeddedPayload: function(payload, relationshipName, relationshipRecord) {
var objectHasId = (relationshipRecord && relationshipRecord.id);
var arrayHasIds = (relationshipRecord.length && relationshipRecord.everyBy("id"));
var isValidRelationship = (objectHasId || arrayHasIds);
if (isValidRelationship) {
if (!payload['_embedded']) {
payload['_embedded'] = {};
}
payload['_embedded'][relationshipName] = relationshipRecord;
if (relationshipRecord.length) {
payload[relationshipName] = relationshipRecord.mapBy('id');
} else {
payload[relationshipName] = relationshipRecord.id;
}
}
if (this.isArray(payload[relationshipName])) {
payload[relationshipName] = payload[relationshipName].filter(function(id) {
return id;
});
}
return payload;
},
isArray: function(value) {
return Object.prototype.toString.call(value) === '[object Array]';
},
/**
* Same as `loadRelationships`, but for an array of records.
*
* @method loadRelationshipsForMany
* @private
* @param {DS.Model} type
* @param {Object} recordsArray
*/
loadRelationshipsForMany: function(type, recordsArray) {
var adapter = this,
promise = Ember.RSVP.resolve([]);
/**
* Create a chain of promises, so the records are loaded sequentially.
* Think of the variable promise as of the accumulator in a left fold.
*/
recordsArray.forEach(function(record) {
promise = promise.then(function(records) {
return adapter.loadRelationships(type, record)
.then(function(loadedRecord) {
records.push(loadedRecord);
return records;
});
});
});
return promise;
},
/**
*
* @method relationshipProperties
* @private
* @param {DS.Model} type
* @param {String} relationName
*/
relationshipProperties: function(type, relationName) {
var relationships = Ember.get(type, 'relationshipsByName');
if (relationName) {
return relationships.get(relationName);
} else {
return relationships;
}
}
});
}());
This source diff could not be displayed because it is too large. You can view the blob instead.
This source diff could not be displayed because it is too large. You can view the blob instead.
/* global _ */
(function () {
'use strict';
/* jshint ignore:start */
// Underscore's Template Module
// Courtesy of underscorejs.org
var _ = (function (_) {
_.defaults = function (object) {
if (!object) {
return object;
}
for (var argsIndex = 1, argsLength = arguments.length; argsIndex < argsLength; argsIndex++) {
var iterable = arguments[argsIndex];
if (iterable) {
for (var key in iterable) {
if (object[key] == null) {
object[key] = iterable[key];
}
}
}
}
return object;
}
// By default, Underscore uses ERB-style template delimiters, change the
// following template settings to use alternative delimiters.
_.templateSettings = {
evaluate : /<%([\s\S]+?)%>/g,
interpolate : /<%=([\s\S]+?)%>/g,
escape : /<%-([\s\S]+?)%>/g
};
// When customizing `templateSettings`, if you don't want to define an
// interpolation, evaluation or escaping regex, we need one that is
// guaranteed not to match.
var noMatch = /(.)^/;
// Certain characters need to be escaped so that they can be put into a
// string literal.
var escapes = {
"'": "'",
'\\': '\\',
'\r': 'r',
'\n': 'n',
'\t': 't',
'\u2028': 'u2028',
'\u2029': 'u2029'
};
var escaper = /\\|'|\r|\n|\t|\u2028|\u2029/g;
// JavaScript micro-templating, similar to John Resig's implementation.
// Underscore templating handles arbitrary delimiters, preserves whitespace,
// and correctly escapes quotes within interpolated code.
_.template = function(text, data, settings) {
var render;
settings = _.defaults({}, settings, _.templateSettings);
// Combine delimiters into one regular expression via alternation.
var matcher = new RegExp([
(settings.escape || noMatch).source,
(settings.interpolate || noMatch).source,
(settings.evaluate || noMatch).source
].join('|') + '|$', 'g');
// Compile the template source, escaping string literals appropriately.
var index = 0;
var source = "__p+='";
text.replace(matcher, function(match, escape, interpolate, evaluate, offset) {
source += text.slice(index, offset)
.replace(escaper, function(match) { return '\\' + escapes[match]; });
if (escape) {
source += "'+\n((__t=(" + escape + "))==null?'':_.escape(__t))+\n'";
}
if (interpolate) {
source += "'+\n((__t=(" + interpolate + "))==null?'':__t)+\n'";
}
if (evaluate) {
source += "';\n" + evaluate + "\n__p+='";
}
index = offset + match.length;
return match;
});
source += "';\n";
// If a variable is not specified, place data values in local scope.
if (!settings.variable) source = 'with(obj||{}){\n' + source + '}\n';
source = "var __t,__p='',__j=Array.prototype.join," +
"print=function(){__p+=__j.call(arguments,'');};\n" +
source + "return __p;\n";
try {
render = new Function(settings.variable || 'obj', '_', source);
} catch (e) {
e.source = source;
throw e;
}
if (data) return render(data, _);
var template = function(data) {
return render.call(this, data, _);
};
// Provide the compiled function source as a convenience for precompilation.
template.source = 'function(' + (settings.variable || 'obj') + '){\n' + source + '}';
return template;
};
return _;
})({});
if (location.hostname === 'todomvc.com') {
window._gaq = [['_setAccount','UA-31081062-1'],['_trackPageview']];(function(d,t){var g=d.createElement(t),s=d.getElementsByTagName(t)[0];g.src='//www.google-analytics.com/ga.js';s.parentNode.insertBefore(g,s)}(document,'script'));
}
/* jshint ignore:end */
function redirect() {
if (location.hostname === 'tastejs.github.io') {
location.href = location.href.replace('tastejs.github.io/todomvc', 'todomvc.com');
}
}
function findRoot() {
var base = location.href.indexOf('examples/');
return location.href.substr(0, base);
}
function getFile(file, callback) {
if (!location.host) {
return console.info('Miss the info bar? Run TodoMVC from a server to avoid a cross-origin error.');
}
var xhr = new XMLHttpRequest();
xhr.open('GET', findRoot() + file, true);
xhr.send();
xhr.onload = function () {
if (xhr.status === 200 && callback) {
callback(xhr.responseText);
}
};
}
function Learn(learnJSON, config) {
if (!(this instanceof Learn)) {
return new Learn(learnJSON, config);
}
var template, framework;
if (typeof learnJSON !== 'object') {
try {
learnJSON = JSON.parse(learnJSON);
} catch (e) {
return;
}
}
if (config) {
template = config.template;
framework = config.framework;
}
if (!template && learnJSON.templates) {
template = learnJSON.templates.todomvc;
}
if (!framework && document.querySelector('[data-framework]')) {
framework = document.querySelector('[data-framework]').dataset.framework;
}
this.template = template;
if (learnJSON.backend) {
this.frameworkJSON = learnJSON.backend;
this.frameworkJSON.issueLabel = framework;
this.append({
backend: true
});
} else if (learnJSON[framework]) {
this.frameworkJSON = learnJSON[framework];
this.frameworkJSON.issueLabel = framework;
this.append();
}
this.fetchIssueCount();
}
Learn.prototype.append = function (opts) {
var aside = document.createElement('aside');
aside.innerHTML = _.template(this.template, this.frameworkJSON);
aside.className = 'learn';
if (opts && opts.backend) {
// Remove demo link
var sourceLinks = aside.querySelector('.source-links');
var heading = sourceLinks.firstElementChild;
var sourceLink = sourceLinks.lastElementChild;
// Correct link path
var href = sourceLink.getAttribute('href');
sourceLink.setAttribute('href', href.substr(href.lastIndexOf('http')));
sourceLinks.innerHTML = heading.outerHTML + sourceLink.outerHTML;
} else {
// Localize demo links
var demoLinks = aside.querySelectorAll('.demo-link');
Array.prototype.forEach.call(demoLinks, function (demoLink) {
if (demoLink.getAttribute('href').substr(0, 4) !== 'http') {
demoLink.setAttribute('href', findRoot() + demoLink.getAttribute('href'));
}
});
}
document.body.className = (document.body.className + ' learn-bar').trim();
document.body.insertAdjacentHTML('afterBegin', aside.outerHTML);
};
Learn.prototype.fetchIssueCount = function () {
var issueLink = document.getElementById('issue-count-link');
if (issueLink) {
var url = issueLink.href.replace('https://github.com', 'https://api.github.com/repos');
var xhr = new XMLHttpRequest();
xhr.open('GET', url, true);
xhr.onload = function (e) {
var parsedResponse = JSON.parse(e.target.responseText);
if (parsedResponse instanceof Array) {
var count = parsedResponse.length
if (count !== 0) {
issueLink.innerHTML = 'This app has ' + count + ' open issues';
document.getElementById('issue-count').style.display = 'inline';
}
}
};
xhr.send();
}
};
redirect();
getFile('learn.json', Learn);
})();
{
"private": true,
"dependencies": {
"todomvc-app-css": "^1.0.0",
"todomvc-common": "^1.0.1",
"jquery": "^2.1.0",
"handlebars": "^2.0.0",
"ember": "components/ember#1.10.0-beta.3",
"ember-localstorage-adapter": "^0.5.0"
}
}
# Ember.js TodoMVC Example
> A framework for creating ambitious web applications.
> _[Ember.js - emberjs.com](http://emberjs.com)_
## Learning Ember.js
The [Ember.js website](http://emberjs.com) is a great resource for getting started.
Here are some links you may find helpful:
* [Guides](http://emberjs.com/guides)
* [API Reference](http://emberjs.com/api)
* [Screencast - Building an App with Ember.js](https://www.youtube.com/watch?v=Ga99hMi7wfY)
* [Applications built with Ember.js](http://emberjs.com/ember-users)
* [Blog](http://emberjs.com/blog)
Articles and guides from the community:
* [Getting Into Ember.js](http://net.tutsplus.com/tutorials/javascript-ajax/getting-into-ember-js)
* [EmberWatch](http://emberwatch.com)
* [CodeSchool course Warming Up With Ember.js](https://www.codeschool.com/courses/warming-up-with-emberjs)
Get help from other Ember.js users:
* [Ember.js on StackOverflow](http://stackoverflow.com/questions/tagged/ember.js)
* [Ember.js on Twitter](http://twitter.com/emberjs)
* [Ember.js on Google +](https://plus.google.com/communities/106387049790387471205)
_If you have other helpful links to share, or find any of the links above no longer work, please [let us know](https://github.com/tastejs/todomvc/issues)._
# http://www.robotstxt.org
User-agent: *
Disallow:
{
"directory": "bower_components",
"analytics": false
}
# EditorConfig helps developers define and maintain consistent
# coding styles between different editors and IDEs
# editorconfig.org
root = true
[*]
end_of_line = lf
charset = utf-8
trim_trailing_whitespace = true
insert_final_newline = true
indent_style = space
indent_size = 2
[*.js]
indent_style = space
indent_size = 2
[*.hbs]
insert_final_newline = false
indent_style = space
indent_size = 2
[*.css]
indent_style = space
indent_size = 2
[*.html]
indent_style = space
indent_size = 2
[*.{diff,md}]
trim_trailing_whitespace = false
{
/**
Ember CLI sends analytics information by default. The data is completely
anonymous, but there are times when you might want to disable this behavior.
Setting `disableAnalytics` to true will prevent any data from being sent.
*/
"disableAnalytics": false
}
# See http://help.github.com/ignore-files/ for more about ignoring files.
# compiled output
# /dist
/tmp
# dependencies
/node_modules
/bower_components
# misc
/.sass-cache
/connect.lock
/coverage/*
/libpeerconnection.log
npm-debug.log
testem.log
{
"predef": [
"document",
"window",
"-Promise"
],
"browser": true,
"boss": true,
"curly": true,
"debug": false,
"devel": true,
"eqeqeq": true,
"evil": true,
"forin": false,
"immed": false,
"laxbreak": false,
"newcap": true,
"noarg": true,
"noempty": false,
"nonew": false,
"nomen": false,
"onevar": false,
"plusplus": false,
"regexp": false,
"undef": true,
"sub": true,
"strict": false,
"white": false,
"eqnull": true,
"esnext": true,
"unused": true
}
---
language: node_js
node_js:
- "4"
sudo: false
cache:
directories:
- node_modules
before_install:
- npm config set spin false
- npm install -g bower
- npm install phantomjs-prebuilt
install:
- npm install
- bower install
script:
- npm test
{
"ignore_dirs": ["tmp", "dist"]
}
# Ember.js TodoMVC Example using Ember CLI
> A framework for creating ambitious web applications.
> _[Ember.js - emberjs.com](http://emberjs.com)_
> _[Ember CLI - ember-cli.com](http://ember-cli.com)_
## Note for people updating this app.
The `index.html` and the `assets` folder in the parent folder as simlinks into the items with the
same names inside `dist`. The `dist` folder has to be checked in git and built for production.
To work on this comment `<base href="/examples/ember-cli/index.html" />` in the `app/index.html`
and uncommented it back before doing the production build.
import Ember from 'ember';
import Resolver from './resolver';
import loadInitializers from 'ember-load-initializers';
import config from './config/environment';
let App;
Ember.MODEL_FACTORY_INJECTIONS = true;
App = Ember.Application.extend({
modulePrefix: config.modulePrefix,
podModulePrefix: config.podModulePrefix,
Resolver
});
loadInitializers(App, config.modulePrefix);
export default App;
import Ember from 'ember';
export default Ember.Component.extend({
repo: Ember.inject.service(),
tagName: 'li',
editing: false,
classNameBindings: ['todo.completed', 'editing'],
actions: {
startEditing() {
this.get('onStartEdit')();
this.set('editing', true);
Ember.run.scheduleOnce('afterRender', this, 'focusInput');
},
doneEditing(todoTitle) {
if (!this.get('editing')) { return; }
if (Ember.isBlank(todoTitle)) {
this.send('removeTodo');
} else {
this.set('todo.title', todoTitle.trim());
this.set('editing', false);
this.get('onEndEdit')();
}
},
handleKeydown(e) {
if (e.keyCode === 13) {
e.target.blur();
} else if (e.keyCode === 27) {
this.set('editing', false);
}
},
toggleCompleted(e) {
let todo = this.get('todo');
Ember.set(todo, 'completed', e.target.checked);
this.get('repo').persist();
},
removeTodo() {
this.get('repo').delete(this.get('todo'));
}
},
focusInput() {
this.element.querySelector('input.edit').focus();
}
});
import Ember from 'ember';
export default Ember.Component.extend({
repo: Ember.inject.service(),
tagName: 'section',
elementId: 'main',
canToggle: true,
allCompleted: Ember.computed('todos.@each.completed', function () {
return this.get('todos').isEvery('completed');
}),
actions: {
enableToggle() {
this.set('canToggle', true);
},
disableToggle() {
this.set('canToggle', false);
},
toggleAll() {
let allCompleted = this.get('allCompleted');
this.get('todos').forEach(todo => Ember.set(todo, 'completed', !allCompleted));
this.get('repo').persist();
}
}
});
import Ember from 'ember';
export default Ember.Controller.extend({
todos: Ember.computed.filterBy('model', 'completed', false)
});
import Ember from 'ember';
export default Ember.Controller.extend({
repo: Ember.inject.service(),
remaining: Ember.computed.filterBy('model', 'completed', false),
completed: Ember.computed.filterBy('model', 'completed'),
actions: {
createTodo(e) {
if (e.keyCode === 13 && !Ember.isBlank(e.target.value)) {
this.get('repo').add({ title: e.target.value.trim(), completed: false });
e.target.value = '';
}
},
clearCompleted() {
this.get('model').removeObjects(this.get('completed'));
this.get('repo').persist();
}
}
});
import Ember from 'ember';
export default Ember.Controller.extend({
todos: Ember.computed.filterBy('model', 'completed', true)
});
import Ember from 'ember';
export function gt([n1, n2]/*, hash*/) {
return n1 > n2;
}
export default Ember.Helper.helper(gt);
import Ember from 'ember';
import { pluralize } from 'ember-inflector';
export function pluralizeHelper([singular, count]/*, hash*/) {
return count === 1 ? singular : pluralize(singular);
}
export default Ember.Helper.helper(pluralizeHelper);
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<title>Todomvc</title>
<meta name="description" content="">
<meta name="viewport" content="width=device-width, initial-scale=1">
<base href="/examples/ember-cli/index.html" />
{{content-for "head"}}
<link rel="stylesheet" href="assets/vendor.css">
<link rel="stylesheet" href="assets/todomvc.css">
{{content-for "head-footer"}}
</head>
<body>
{{content-for "body"}}
<script src="assets/vendor.js"></script>
<script src="assets/todomvc.js"></script>
{{content-for "body-footer"}}
</body>
</html>
import Resolver from 'ember-resolver';
export default Resolver;
import Ember from 'ember';
import config from './config/environment';
const Router = Ember.Router.extend({
location: config.locationType
});
Router.map(function () {
this.route('active');
this.route('completed');
});
export default Router;
import Ember from 'ember';
export default Ember.Route.extend({
repo: Ember.inject.service(),
model() {
return this.get('repo').findAll();
}
});
import Ember from 'ember';
export default Ember.Service.extend({
lastId: 0,
data: null,
findAll() {
return this.get('data') ||
this.set('data', JSON.parse(window.localStorage.getItem('todos') || '[]'));
},
add(attrs) {
let todo = Object.assign({ id: this.incrementProperty('lastId') }, attrs);
this.get('data').pushObject(todo);
this.persist();
return todo;
},
delete(todo) {
this.get('data').removeObject(todo);
this.persist();
},
persist() {
window.localStorage.setItem('todos', JSON.stringify(this.get('data')));
}
});
{{todo-list todos=todos}}
\ No newline at end of file
<section id="todoapp">
<header id="header">
<h1>todos</h1>
<input type="text" id="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">
<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>
{{/if}}
</footer>
{{/if}}
</section>
<footer id="info">
<p>Double-click to edit a todo</p>
<p>
Created by
<a href="http://github.com/cibernox">Miguel Camba</a>,
<a href="http://github.com/addyosmani">Addy Osmani</a>
</p>
<p>Part of <a href="http://todomvc.com">TodoMVC</a></p>
</footer>
\ No newline at end of file
{{todo-list todos=todos}}
\ No newline at end of file
<div class="view">
<input type="checkbox" class="toggle" checked={{todo.completed}} onchange={{action 'toggleCompleted'}}>
<label ondblclick={{action 'startEditing'}}>{{todo.title}}</label>
<button onclick={{action 'removeTodo'}} class="destroy"></button>
</div>
<input type="text" class="edit" value={{todo.title}} onblur={{action 'doneEditing' value='target.value'}} onkeydown={{action 'handleKeydown'}} autofocus>
\ No newline at end of file
{{#if todos.length}}
{{#if canToggle}}
<input type="checkbox" id="toggle-all" checked={{allCompleted}} onchange={{action 'toggleAll'}}>
{{/if}}
<ul id="todo-list" class="todo-list">
{{#each todos as |todo|}}
{{todo-item todo=todo onStartEdit=(action 'disableToggle') onEndEdit=(action 'enableToggle')}}
{{/each}}
</ul>
{{/if}}
{{#if model.length}}
{{todo-list todos=model}}
{{/if}}
{
"name": "todomvc",
"dependencies": {
"ember": "~2.6.0",
"ember-cli-shims": "0.1.1",
"ember-cli-test-loader": "0.2.2",
"ember-qunit-notifications": "0.1.0"
}
}
/* jshint node: true */
module.exports = function (environment) {
var ENV = {
modulePrefix: 'todomvc',
environment: environment,
baseURL: null,
locationType: 'auto',
EmberENV: {
FEATURES: {
// Here you can enable experimental features on an ember canary build
// e.g. 'with-controller': true
}
},
APP: {
// Here you can pass flags/options to your application instance
// when it is created
}
};
// if (environment === 'development') {
// ENV.APP.LOG_RESOLVER = true;
// ENV.APP.LOG_ACTIVE_GENERATION = true;
// ENV.APP.LOG_TRANSITIONS = true;
// ENV.APP.LOG_TRANSITIONS_INTERNAL = true;
// ENV.APP.LOG_VIEW_LOOKUPS = true;
// }
if (environment === 'test') {
// Testem prefers this...
ENV.baseURL = '/';
ENV.locationType = 'none';
// keep test console output quieter
ENV.APP.LOG_ACTIVE_GENERATION = false;
ENV.APP.LOG_VIEW_LOOKUPS = false;
ENV.APP.rootElement = '#ember-testing';
}
// if (environment === 'production') {
// }
return ENV;
};
"use strict";define("todomvc/app",["exports","ember","todomvc/resolver","ember-load-initializers","todomvc/config/environment"],function(e,t,n,r,a){var o=void 0;t["default"].MODEL_FACTORY_INJECTIONS=!0,o=t["default"].Application.extend({modulePrefix:a["default"].modulePrefix,podModulePrefix:a["default"].podModulePrefix,Resolver:n["default"]}),(0,r["default"])(o,a["default"].modulePrefix),e["default"]=o}),define("todomvc/components/app-version",["exports","ember-cli-app-version/components/app-version","todomvc/config/environment"],function(e,t,n){var r=n["default"].APP.name,a=n["default"].APP.version;e["default"]=t["default"].extend({version:a,name:r})}),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 n=this.get("todo");t["default"].set(n,"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");this.get("todos").forEach(function(n){return t["default"].set(n,"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/gt",["exports","ember"],function(e,t){function n(e){var t=r(e,2),n=t[0],a=t[1];return n>a}var r=function(){function e(e,t){var n=[],r=!0,a=!1,o=void 0;try{for(var l,i=e[Symbol.iterator]();!(r=(l=i.next()).done)&&(n.push(l.value),!t||n.length!==t);r=!0);}catch(d){a=!0,o=d}finally{try{!r&&i["return"]&&i["return"]()}finally{if(a)throw o}}return n}return function(t,n){if(Array.isArray(t))return t;if(Symbol.iterator in Object(t))return e(t,n);throw new TypeError("Invalid attempt to destructure non-iterable instance")}}();e.gt=n,e["default"]=t["default"].Helper.helper(n)}),define("todomvc/helpers/pluralize",["exports","ember","ember-inflector"],function(e,t,n){function r(e){var t=a(e,2),r=t[0],o=t[1];return 1===o?r:(0,n.pluralize)(r)}var a=function(){function e(e,t){var n=[],r=!0,a=!1,o=void 0;try{for(var l,i=e[Symbol.iterator]();!(r=(l=i.next()).done)&&(n.push(l.value),!t||n.length!==t);r=!0);}catch(d){a=!0,o=d}finally{try{!r&&i["return"]&&i["return"]()}finally{if(a)throw o}}return n}return function(t,n){if(Array.isArray(t))return t;if(Symbol.iterator in Object(t))return e(t,n);throw new TypeError("Invalid attempt to destructure non-iterable instance")}}();e.pluralizeHelper=r,e["default"]=t["default"].Helper.helper(r)}),define("todomvc/helpers/singularize",["exports","ember-inflector/lib/helpers/singularize"],function(e,t){e["default"]=t["default"]}),define("todomvc/initializers/app-version",["exports","ember-cli-app-version/initializer-factory","todomvc/config/environment"],function(e,t,n){e["default"]={name:"App Version",initialize:(0,t["default"])(n["default"].APP.name,n["default"].APP.version)}}),define("todomvc/initializers/container-debug-adapter",["exports","ember-resolver/container-debug-adapter"],function(e,t){e["default"]={name:"container-debug-adapter",initialize:function(){var e=arguments[1]||arguments[0];e.register("container-debug-adapter:main",t["default"]),e.inject("container-debug-adapter:main","namespace","application:main")}}}),define("todomvc/initializers/export-application-global",["exports","ember","todomvc/config/environment"],function(e,t,n){function r(){var e=arguments[1]||arguments[0];if(n["default"].exportApplicationGlobal!==!1){var r,a=n["default"].exportApplicationGlobal;r="string"==typeof a?a:t["default"].String.classify(n["default"].modulePrefix),window[r]||(window[r]=e,e.reopen({willDestroy:function(){this._super.apply(this,arguments),delete window[r]}}))}}e.initialize=r,e["default"]={name:"export-application-global",initialize:r}}),define("todomvc/resolver",["exports","ember-resolver"],function(e,t){e["default"]=t["default"]}),define("todomvc/router",["exports","ember","todomvc/config/environment"],function(e,t,n){var r=t["default"].Router.extend({location:n["default"].locationType});r.map(function(){this.route("active"),this.route("completed")}),e["default"]=r}),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/repo",["exports","ember"],function(e,t){e["default"]=t["default"].Service.extend({lastId:0,data:null,findAll:function(){return this.get("data")||this.set("data",JSON.parse(window.localStorage.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.localStorage.setItem("todos",JSON.stringify(this.get("data")))}})}),define("todomvc/templates/active",["exports"],function(e){e["default"]=Ember.HTMLBars.template(function(){return{meta:{fragmentReason:{name:"missing-wrapper",problems:["wrong-type"]},revision:"Ember@2.6.0",loc:{source:null,start:{line:1,column:0},end:{line:1,column:25}},moduleName:"todomvc/templates/active.hbs"},isEmpty:!1,arity:0,cachedFragment:null,hasRendered:!1,buildFragment:function(e){var t=e.createDocumentFragment(),n=e.createComment("");return e.appendChild(t,n),t},buildRenderNodes:function(e,t,n){var r=new Array(1);return r[0]=e.createMorphAt(t,0,0,n),e.insertBoundary(t,0),e.insertBoundary(t,null),r},statements:[["inline","todo-list",[],["todos",["subexpr","@mut",[["get","todos",["loc",[null,[1,18],[1,23]]]]],[],[]]],["loc",[null,[1,0],[1,25]]]]],locals:[],templates:[]}}())}),define("todomvc/templates/application",["exports"],function(e){e["default"]=Ember.HTMLBars.template(function(){var e=function(){var e=function(){return{meta:{fragmentReason:!1,revision:"Ember@2.6.0",loc:{source:null,start:{line:11,column:14},end:{line:11,column:60}},moduleName:"todomvc/templates/application.hbs"},isEmpty:!1,arity:0,cachedFragment:null,hasRendered:!1,buildFragment:function(e){var t=e.createDocumentFragment(),n=e.createTextNode("All");return e.appendChild(t,n),t},buildRenderNodes:function(){return[]},statements:[],locals:[],templates:[]}}(),t=function(){return{meta:{fragmentReason:!1,revision:"Ember@2.6.0",loc:{source:null,start:{line:12,column:14},end:{line:12,column:64}},moduleName:"todomvc/templates/application.hbs"},isEmpty:!1,arity:0,cachedFragment:null,hasRendered:!1,buildFragment:function(e){var t=e.createDocumentFragment(),n=e.createTextNode("Active");return e.appendChild(t,n),t},buildRenderNodes:function(){return[]},statements:[],locals:[],templates:[]}}(),n=function(){return{meta:{fragmentReason:!1,revision:"Ember@2.6.0",loc:{source:null,start:{line:13,column:14},end:{line:13,column:70}},moduleName:"todomvc/templates/application.hbs"},isEmpty:!1,arity:0,cachedFragment:null,hasRendered:!1,buildFragment:function(e){var t=e.createDocumentFragment(),n=e.createTextNode("Completed");return e.appendChild(t,n),t},buildRenderNodes:function(){return[]},statements:[],locals:[],templates:[]}}(),r=function(){return{meta:{fragmentReason:!1,revision:"Ember@2.6.0",loc:{source:null,start:{line:15,column:8},end:{line:17,column:8}},moduleName:"todomvc/templates/application.hbs"},isEmpty:!1,arity:0,cachedFragment:null,hasRendered:!1,buildFragment:function(e){var t=e.createDocumentFragment(),n=e.createTextNode(" ");e.appendChild(t,n);var n=e.createElement("button");e.setAttribute(n,"id","clear-completed");var r=e.createTextNode("Clear completed");e.appendChild(n,r),e.appendChild(t,n);var n=e.createTextNode("\n");return e.appendChild(t,n),t},buildRenderNodes:function(e,t,n){var r=e.childAt(t,[1]),a=new Array(1);return a[0]=e.createAttrMorph(r,"onclick"),a},statements:[["attribute","onclick",["subexpr","action",["clearCompleted"],[],["loc",[null,[16,47],[16,74]]]]]],locals:[],templates:[]}}();return{meta:{fragmentReason:!1,revision:"Ember@2.6.0",loc:{source:null,start:{line:7,column:4},end:{line:19,column:4}},moduleName:"todomvc/templates/application.hbs"},isEmpty:!1,arity:0,cachedFragment:null,hasRendered:!1,buildFragment:function(e){var t=e.createDocumentFragment(),n=e.createTextNode(" ");e.appendChild(t,n);var n=e.createElement("footer");e.setAttribute(n,"id","footer");var r=e.createTextNode("\n ");e.appendChild(n,r);var r=e.createElement("span");e.setAttribute(r,"id","todo-count");var a=e.createElement("strong"),o=e.createComment("");e.appendChild(a,o),e.appendChild(r,a);var a=e.createTextNode(" ");e.appendChild(r,a);var a=e.createComment("");e.appendChild(r,a);var a=e.createTextNode(" left");e.appendChild(r,a),e.appendChild(n,r);var r=e.createTextNode("\n ");e.appendChild(n,r);var r=e.createElement("ul");e.setAttribute(r,"id","filters");var a=e.createTextNode("\n ");e.appendChild(r,a);var a=e.createElement("li"),o=e.createComment("");e.appendChild(a,o),e.appendChild(r,a);var a=e.createTextNode("\n ");e.appendChild(r,a);var a=e.createElement("li"),o=e.createComment("");e.appendChild(a,o),e.appendChild(r,a);var a=e.createTextNode("\n ");e.appendChild(r,a);var a=e.createElement("li"),o=e.createComment("");e.appendChild(a,o),e.appendChild(r,a);var a=e.createTextNode("\n ");e.appendChild(r,a),e.appendChild(n,r);var r=e.createTextNode("\n");e.appendChild(n,r);var r=e.createComment("");e.appendChild(n,r);var r=e.createTextNode(" ");e.appendChild(n,r),e.appendChild(t,n);var n=e.createTextNode("\n");return e.appendChild(t,n),t},buildRenderNodes:function(e,t,n){var r=e.childAt(t,[1]),a=e.childAt(r,[1]),o=e.childAt(r,[3]),l=new Array(6);return l[0]=e.createMorphAt(e.childAt(a,[0]),0,0),l[1]=e.createMorphAt(a,2,2),l[2]=e.createMorphAt(e.childAt(o,[1]),0,0),l[3]=e.createMorphAt(e.childAt(o,[3]),0,0),l[4]=e.createMorphAt(e.childAt(o,[5]),0,0),l[5]=e.createMorphAt(r,5,5),l},statements:[["content","remaining.length",["loc",[null,[9,38],[9,58]]]],["inline","pluralize",["item",["get","remaining.length",["loc",[null,[9,87],[9,103]]]]],[],["loc",[null,[9,68],[9,105]]]],["block","link-to",["index"],["activeClass","selected"],0,null,["loc",[null,[11,14],[11,72]]]],["block","link-to",["active"],["activeClass","selected"],1,null,["loc",[null,[12,14],[12,76]]]],["block","link-to",["completed"],["activeClass","selected"],2,null,["loc",[null,[13,14],[13,82]]]],["block","if",[["get","completed.length",["loc",[null,[15,14],[15,30]]]]],[],3,null,["loc",[null,[15,8],[17,15]]]]],locals:[],templates:[e,t,n,r]}}();return{meta:{fragmentReason:{name:"missing-wrapper",problems:["multiple-nodes"]},revision:"Ember@2.6.0",loc:{source:null,start:{line:1,column:0},end:{line:29,column:9}},moduleName:"todomvc/templates/application.hbs"},isEmpty:!1,arity:0,cachedFragment:null,hasRendered:!1,buildFragment:function(e){var t=e.createDocumentFragment(),n=e.createElement("section");e.setAttribute(n,"id","todoapp");var r=e.createTextNode("\n ");e.appendChild(n,r);var r=e.createElement("header");e.setAttribute(r,"id","header");var a=e.createTextNode("\n ");e.appendChild(r,a);var a=e.createElement("h1"),o=e.createTextNode("todos");e.appendChild(a,o),e.appendChild(r,a);var a=e.createTextNode("\n ");e.appendChild(r,a);var a=e.createElement("input");e.setAttribute(a,"type","text"),e.setAttribute(a,"id","new-todo"),e.setAttribute(a,"placeholder","What needs to be done?"),e.setAttribute(a,"autofocus",""),e.appendChild(r,a);var a=e.createTextNode("\n ");e.appendChild(r,a),e.appendChild(n,r);var r=e.createTextNode("\n ");e.appendChild(n,r);var r=e.createComment("");e.appendChild(n,r);var r=e.createTextNode("\n");e.appendChild(n,r);var r=e.createComment("");e.appendChild(n,r),e.appendChild(t,n);var n=e.createTextNode("\n");e.appendChild(t,n);var n=e.createElement("footer");e.setAttribute(n,"id","info");var r=e.createTextNode("\n ");e.appendChild(n,r);var r=e.createElement("p"),a=e.createTextNode("Double-click to edit a todo");e.appendChild(r,a),e.appendChild(n,r);var r=e.createTextNode("\n ");e.appendChild(n,r);var r=e.createElement("p"),a=e.createTextNode("\n Created by\n ");e.appendChild(r,a);var a=e.createElement("a");e.setAttribute(a,"href","http://github.com/cibernox");var o=e.createTextNode("Miguel Camba");e.appendChild(a,o),e.appendChild(r,a);var a=e.createTextNode(",\n ");e.appendChild(r,a);var a=e.createElement("a");e.setAttribute(a,"href","http://github.com/addyosmani");var o=e.createTextNode("Addy Osmani");e.appendChild(a,o),e.appendChild(r,a);var a=e.createTextNode("\n ");e.appendChild(r,a),e.appendChild(n,r);var r=e.createTextNode("\n ");e.appendChild(n,r);var r=e.createElement("p"),a=e.createTextNode("Part of ");e.appendChild(r,a);var a=e.createElement("a");e.setAttribute(a,"href","http://todomvc.com");var o=e.createTextNode("TodoMVC");e.appendChild(a,o),e.appendChild(r,a),e.appendChild(n,r);var r=e.createTextNode("\n");return e.appendChild(n,r),e.appendChild(t,n),t},buildRenderNodes:function(e,t,n){var r=e.childAt(t,[0]),a=e.childAt(r,[1,3]),o=new Array(3);return o[0]=e.createAttrMorph(a,"onkeydown"),o[1]=e.createMorphAt(r,3,3),o[2]=e.createMorphAt(r,5,5),o},statements:[["attribute","onkeydown",["subexpr","action",["createTodo"],[],["loc",[null,[4,47],[4,70]]]]],["content","outlet",["loc",[null,[6,4],[6,14]]]],["block","if",[["subexpr","gt",[["get","model.length",["loc",[null,[7,14],[7,26]]]],0],[],["loc",[null,[7,10],[7,29]]]]],[],0,null,["loc",[null,[7,4],[19,11]]]]],locals:[],templates:[e]}}())}),define("todomvc/templates/completed",["exports"],function(e){e["default"]=Ember.HTMLBars.template(function(){return{meta:{fragmentReason:{name:"missing-wrapper",problems:["wrong-type"]},revision:"Ember@2.6.0",loc:{source:null,start:{line:1,column:0},end:{line:1,column:25}},moduleName:"todomvc/templates/completed.hbs"},isEmpty:!1,arity:0,cachedFragment:null,hasRendered:!1,buildFragment:function(e){var t=e.createDocumentFragment(),n=e.createComment("");return e.appendChild(t,n),t},buildRenderNodes:function(e,t,n){var r=new Array(1);return r[0]=e.createMorphAt(t,0,0,n),e.insertBoundary(t,0),e.insertBoundary(t,null),r},statements:[["inline","todo-list",[],["todos",["subexpr","@mut",[["get","todos",["loc",[null,[1,18],[1,23]]]]],[],[]]],["loc",[null,[1,0],[1,25]]]]],locals:[],templates:[]}}())}),define("todomvc/templates/components/todo-item",["exports"],function(e){e["default"]=Ember.HTMLBars.template(function(){return{meta:{fragmentReason:{name:"missing-wrapper",problems:["multiple-nodes"]},revision:"Ember@2.6.0",loc:{source:null,start:{line:1,column:0},end:{line:6,column:153}},moduleName:"todomvc/templates/components/todo-item.hbs"},isEmpty:!1,arity:0,cachedFragment:null,hasRendered:!1,buildFragment:function(e){var t=e.createDocumentFragment(),n=e.createElement("div");e.setAttribute(n,"class","view");var r=e.createTextNode("\n ");e.appendChild(n,r);var r=e.createElement("input");e.setAttribute(r,"type","checkbox"),e.setAttribute(r,"class","toggle"),e.appendChild(n,r);var r=e.createTextNode("\n ");e.appendChild(n,r);var r=e.createElement("label"),a=e.createComment("");e.appendChild(r,a),e.appendChild(n,r);var r=e.createTextNode("\n ");e.appendChild(n,r);var r=e.createElement("button");e.setAttribute(r,"class","destroy"),e.appendChild(n,r);var r=e.createTextNode("\n");e.appendChild(n,r),e.appendChild(t,n);var n=e.createTextNode("\n");e.appendChild(t,n);var n=e.createElement("input");return e.setAttribute(n,"type","text"),e.setAttribute(n,"class","edit"),e.setAttribute(n,"autofocus",""),e.appendChild(t,n),t},buildRenderNodes:function(e,t,n){var r=e.childAt(t,[0]),a=e.childAt(r,[1]);this.cachedFragment&&e.repairClonedNode(a,[],!0);var o=e.childAt(r,[3]),l=e.childAt(r,[5]),i=e.childAt(t,[2]),d=new Array(8);return d[0]=e.createAttrMorph(a,"checked"),d[1]=e.createAttrMorph(a,"onchange"),d[2]=e.createAttrMorph(o,"ondblclick"),d[3]=e.createMorphAt(o,0,0),d[4]=e.createAttrMorph(l,"onclick"),d[5]=e.createAttrMorph(i,"value"),d[6]=e.createAttrMorph(i,"onblur"),d[7]=e.createAttrMorph(i,"onkeydown"),d},statements:[["attribute","checked",["get","todo.completed",["loc",[null,[2,50],[2,64]]]]],["attribute","onchange",["subexpr","action",["toggleCompleted"],[],["loc",[null,[2,76],[2,104]]]]],["attribute","ondblclick",["subexpr","action",["startEditing"],[],["loc",[null,[3,20],[3,45]]]]],["content","todo.title",["loc",[null,[3,46],[3,60]]]],["attribute","onclick",["subexpr","action",["removeTodo"],[],["loc",[null,[4,18],[4,41]]]]],["attribute","value",["get","todo.title",["loc",[null,[6,40],[6,50]]]]],["attribute","onblur",["subexpr","action",["doneEditing"],["value","target.value"],["loc",[null,[6,60],[6,105]]]]],["attribute","onkeydown",["subexpr","action",["handleKeydown"],[],["loc",[null,[6,116],[6,142]]]]]],locals:[],templates:[]}}())}),define("todomvc/templates/components/todo-list",["exports"],function(e){e["default"]=Ember.HTMLBars.template(function(){var e=function(){var e=function(){return{meta:{fragmentReason:!1,revision:"Ember@2.6.0",loc:{source:null,start:{line:2,column:2},end:{line:4,column:2}},moduleName:"todomvc/templates/components/todo-list.hbs"},isEmpty:!1,arity:0,cachedFragment:null,hasRendered:!1,buildFragment:function(e){var t=e.createDocumentFragment(),n=e.createTextNode(" ");e.appendChild(t,n);var n=e.createElement("input");e.setAttribute(n,"type","checkbox"),e.setAttribute(n,"id","toggle-all"),e.appendChild(t,n);var n=e.createTextNode("\n");return e.appendChild(t,n),t},buildRenderNodes:function(e,t,n){var r=e.childAt(t,[1]);this.cachedFragment&&e.repairClonedNode(r,[],!0);var a=new Array(2);return a[0]=e.createAttrMorph(r,"checked"),a[1]=e.createAttrMorph(r,"onchange"),a},statements:[["attribute","checked",["get","allCompleted",["loc",[null,[3,53],[3,65]]]]],["attribute","onchange",["subexpr","action",["toggleAll"],[],["loc",[null,[3,77],[3,99]]]]]],locals:[],templates:[]}}(),t=function(){return{meta:{fragmentReason:!1,revision:"Ember@2.6.0",loc:{source:null,start:{line:6,column:4},end:{line:8,column:4}},moduleName:"todomvc/templates/components/todo-list.hbs"},isEmpty:!1,arity:1,cachedFragment:null,hasRendered:!1,buildFragment:function(e){var t=e.createDocumentFragment(),n=e.createTextNode(" ");e.appendChild(t,n);var n=e.createComment("");e.appendChild(t,n);var n=e.createTextNode("\n");return e.appendChild(t,n),t},buildRenderNodes:function(e,t,n){var r=new Array(1);return r[0]=e.createMorphAt(t,1,1,n),r},statements:[["inline","todo-item",[],["todo",["subexpr","@mut",[["get","todo",["loc",[null,[7,23],[7,27]]]]],[],[]],"onStartEdit",["subexpr","action",["disableToggle"],[],["loc",[null,[7,40],[7,64]]]],"onEndEdit",["subexpr","action",["enableToggle"],[],["loc",[null,[7,75],[7,98]]]]],["loc",[null,[7,6],[7,100]]]]],locals:["todo"],templates:[]}}();return{meta:{fragmentReason:{name:"missing-wrapper",problems:["wrong-type","multiple-nodes"]},revision:"Ember@2.6.0",loc:{source:null,start:{line:1,column:0},end:{line:10,column:0}},moduleName:"todomvc/templates/components/todo-list.hbs"},isEmpty:!1,arity:0,cachedFragment:null,hasRendered:!1,buildFragment:function(e){var t=e.createDocumentFragment(),n=e.createComment("");e.appendChild(t,n);var n=e.createTextNode(" ");e.appendChild(t,n);var n=e.createElement("ul");e.setAttribute(n,"id","todo-list"),e.setAttribute(n,"class","todo-list");var r=e.createTextNode("\n");e.appendChild(n,r);var r=e.createComment("");e.appendChild(n,r);var r=e.createTextNode(" ");e.appendChild(n,r),e.appendChild(t,n);var n=e.createTextNode("\n");return e.appendChild(t,n),t},buildRenderNodes:function(e,t,n){var r=new Array(2);return r[0]=e.createMorphAt(t,0,0,n),r[1]=e.createMorphAt(e.childAt(t,[2]),1,1),e.insertBoundary(t,0),r},statements:[["block","if",[["get","canToggle",["loc",[null,[2,8],[2,17]]]]],[],0,null,["loc",[null,[2,2],[4,9]]]],["block","each",[["get","todos",["loc",[null,[6,12],[6,17]]]]],[],1,null,["loc",[null,[6,4],[8,13]]]]],locals:[],templates:[e,t]}}();return{meta:{fragmentReason:{name:"missing-wrapper",problems:["wrong-type"]},revision:"Ember@2.6.0",loc:{source:null,start:{line:1,column:0},end:{line:11,column:0}},moduleName:"todomvc/templates/components/todo-list.hbs"},isEmpty:!1,arity:0,cachedFragment:null,hasRendered:!1,buildFragment:function(e){var t=e.createDocumentFragment(),n=e.createComment("");return e.appendChild(t,n),t},buildRenderNodes:function(e,t,n){var r=new Array(1);return r[0]=e.createMorphAt(t,0,0,n),e.insertBoundary(t,0),e.insertBoundary(t,null),r},statements:[["block","if",[["get","todos.length",["loc",[null,[1,6],[1,18]]]]],[],0,null,["loc",[null,[1,0],[10,7]]]]],locals:[],templates:[e]}}())}),define("todomvc/templates/index",["exports"],function(e){e["default"]=Ember.HTMLBars.template(function(){var e=function(){return{meta:{fragmentReason:{name:"missing-wrapper",problems:["wrong-type"]},revision:"Ember@2.6.0",loc:{source:null,start:{line:1,column:0},end:{line:3,column:0}},moduleName:"todomvc/templates/index.hbs"},isEmpty:!1,arity:0,cachedFragment:null,hasRendered:!1,buildFragment:function(e){var t=e.createDocumentFragment(),n=e.createTextNode(" ");e.appendChild(t,n);var n=e.createComment("");e.appendChild(t,n);var n=e.createTextNode("\n");return e.appendChild(t,n),t},buildRenderNodes:function(e,t,n){var r=new Array(1);return r[0]=e.createMorphAt(t,1,1,n),r},statements:[["inline","todo-list",[],["todos",["subexpr","@mut",[["get","model",["loc",[null,[2,20],[2,25]]]]],[],[]]],["loc",[null,[2,2],[2,27]]]]],locals:[],templates:[]}}();return{meta:{fragmentReason:{name:"missing-wrapper",problems:["wrong-type"]},revision:"Ember@2.6.0",loc:{source:null,start:{line:1,column:0},end:{line:4,column:0}},moduleName:"todomvc/templates/index.hbs"},isEmpty:!1,arity:0,cachedFragment:null,hasRendered:!1,buildFragment:function(e){var t=e.createDocumentFragment(),n=e.createComment("");return e.appendChild(t,n),t},buildRenderNodes:function(e,t,n){var r=new Array(1);return r[0]=e.createMorphAt(t,0,0,n),e.insertBoundary(t,0),e.insertBoundary(t,null),r},statements:[["block","if",[["get","model.length",["loc",[null,[1,6],[1,18]]]]],[],0,null,["loc",[null,[1,0],[3,7]]]]],locals:[],templates:[e]}}())}),define("todomvc/config/environment",["ember"],function(e){var t="todomvc";try{var n=t+"/config/environment",r=e["default"].$('meta[name="'+n+'"]').attr("content"),a=JSON.parse(unescape(r));return{"default":a}}catch(o){throw new Error('Could not read config from meta tag with name "'+n+'".')}}),runningTests||require("todomvc/app")["default"].create({name:"todomvc",version:"0.0.0+b72d5e59"});
\ No newline at end of file
#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
This source diff could not be displayed because it is too large. You can view the blob instead.
<?xml version="1.0"?>
<!DOCTYPE cross-domain-policy SYSTEM "http://www.adobe.com/xml/dtds/cross-domain-policy.dtd">
<cross-domain-policy>
<!-- Read this: www.adobe.com/devnet/articles/crossdomain_policy_file_spec.html -->
<!-- Most restrictive policy: -->
<site-control permitted-cross-domain-policies="none"/>
<!-- Least restrictive policy: -->
<!--
<site-control permitted-cross-domain-policies="all"/>
<allow-access-from domain="*" to-ports="*" secure="false"/>
<allow-http-request-headers-from domain="*" headers="*" secure="false"/>
-->
</cross-domain-policy>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<title>Todomvc</title>
<meta name="description" content="">
<meta name="viewport" content="width=device-width, initial-scale=1">
<base href="/examples/emberjs/index.html" />
<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%22auto%22%2C%22EmberENV%22%3A%7B%22FEATURES%22%3A%7B%7D%7D%2C%22APP%22%3A%7B%22name%22%3A%22todomvc%22%2C%22version%22%3A%220.0.0+b72d5e59%22%7D%2C%22exportApplicationGlobal%22%3Afalse%7D" />
<link rel="stylesheet" href="assets/vendor-7b5c98520910afa58d74e05ec86cd873.css">
<link rel="stylesheet" href="assets/todomvc-d41d8cd98f00b204e9800998ecf8427e.css">
</head>
<body>
<script src="assets/vendor-fe6aaf6bf08a00247e9bb45b00c6c98c.js"></script>
<script src="assets/todomvc-abee913429a66e32e34b282e3460218c.js"></script>
</body>
</html>
# http://www.robotstxt.org
User-agent: *
Disallow:
/*jshint node:true*/
/* global require, module */
var EmberApp = require('ember-cli/lib/broccoli/ember-app');
module.exports = function (defaults) {
var app = new EmberApp(defaults, {
// Add options here
});
app.import('vendor/base.css');
app.import('vendor/index.css');
// Use `app.import` to add additional libraries to the generated
// output files.
//
// If you need to use different assets in different
// environments, specify an object as the first parameter. That
// object's keys should be the environment name and the values
// should be the asset to use in that environment.
//
// If the library that you are including contains AMD or ES6
// modules that you would like to import into your application
// please specify an object with the list of modules as keys
// along with the exports of each module as its value.
return app.toTree();
};
{
"name": "todomvc",
"version": "0.0.0",
"description": "Small description for todomvc goes here",
"private": true,
"directories": {
"doc": "doc",
"test": "tests"
},
"scripts": {
"build": "ember build",
"start": "ember server",
"test": "ember test"
},
"repository": "",
"engines": {
"node": ">= 0.10.0"
},
"author": "",
"license": "MIT",
"devDependencies": {
"broccoli-asset-rev": "^2.4.2",
"ember-ajax": "0.7.1",
"ember-cli": "2.5.0",
"ember-cli-app-version": "^1.0.0",
"ember-cli-babel": "^5.1.6",
"ember-cli-dependency-checker": "^1.2.0",
"ember-cli-htmlbars": "^1.0.3",
"ember-cli-htmlbars-inline-precompile": "^0.3.1",
"ember-cli-inject-live-reload": "^1.4.0",
"ember-cli-jshint": "^1.0.0",
"ember-cli-qunit": "^1.4.0",
"ember-cli-release": "0.2.8",
"ember-cli-sri": "^2.1.0",
"ember-cli-uglify": "^1.2.0",
"ember-export-application-global": "^1.0.5",
"ember-inflector": "1.9.4",
"ember-load-initializers": "^0.5.1",
"ember-resolver": "^2.0.3",
"loader.js": "^4.0.1"
}
}
<?xml version="1.0"?>
<!DOCTYPE cross-domain-policy SYSTEM "http://www.adobe.com/xml/dtds/cross-domain-policy.dtd">
<cross-domain-policy>
<!-- Read this: www.adobe.com/devnet/articles/crossdomain_policy_file_spec.html -->
<!-- Most restrictive policy: -->
<site-control permitted-cross-domain-policies="none"/>
<!-- Least restrictive policy: -->
<!--
<site-control permitted-cross-domain-policies="all"/>
<allow-access-from domain="*" to-ports="*" secure="false"/>
<allow-http-request-headers-from domain="*" headers="*" secure="false"/>
-->
</cross-domain-policy>
# http://www.robotstxt.org
User-agent: *
Disallow:
/*jshint node:true*/
module.exports = {
framework: 'qunit',
test_page: 'tests/index.html?hidepassed',
disable_watching: true,
launch_in_ci: [
'PhantomJS'
],
launch_in_dev: [
'PhantomJS',
'Chrome'
]
};
{
"predef": [
"document",
"window",
"location",
"setTimeout",
"$",
"-Promise",
"define",
"console",
"visit",
"exists",
"fillIn",
"click",
"keyEvent",
"triggerEvent",
"find",
"findWithAssert",
"wait",
"DS",
"andThen",
"currentURL",
"currentPath",
"currentRouteName"
],
"node": false,
"browser": false,
"boss": true,
"curly": true,
"debug": false,
"devel": false,
"eqeqeq": true,
"evil": true,
"forin": false,
"immed": false,
"laxbreak": false,
"newcap": true,
"noarg": true,
"noempty": false,
"nonew": false,
"nomen": false,
"onevar": false,
"plusplus": false,
"regexp": false,
"undef": true,
"sub": true,
"strict": false,
"white": false,
"eqnull": true,
"esnext": true,
"unused": true
}
import Ember from 'ember';
export default function destroyApp(application) {
Ember.run(application, 'destroy');
}
import { module } from 'qunit';
import startApp from '../helpers/start-app';
import destroyApp from '../helpers/destroy-app';
export default function (name, options = {}) {
module(name, {
beforeEach() {
this.application = startApp();
if (options.beforeEach) {
options.beforeEach.apply(this, arguments);
}
},
afterEach() {
if (options.afterEach) {
options.afterEach.apply(this, arguments);
}
destroyApp(this.application);
}
});
}
import Resolver from '../../resolver';
import config from '../../config/environment';
const resolver = Resolver.create();
resolver.namespace = {
modulePrefix: config.modulePrefix,
podModulePrefix: config.podModulePrefix
};
export default resolver;
import Ember from 'ember';
import Application from '../../app';
import config from '../../config/environment';
export default function startApp(attrs) {
let application;
let attributes = Ember.merge({}, config.APP);
attributes = Ember.merge(attributes, attrs); // use defaults, but you can override;
Ember.run(() => {
application = Application.create(attributes);
application.setupForTesting();
application.injectTestHelpers();
});
return application;
}
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<title>Todomvc Tests</title>
<meta name="description" content="">
<meta name="viewport" content="width=device-width, initial-scale=1">
{{content-for "head"}}
{{content-for "test-head"}}
<link rel="stylesheet" href="assets/vendor.css">
<link rel="stylesheet" href="assets/todomvc.css">
<link rel="stylesheet" href="assets/test-support.css">
{{content-for "head-footer"}}
{{content-for "test-head-footer"}}
</head>
<body>
{{content-for "body"}}
{{content-for "test-body"}}
<script src="testem.js" integrity=""></script>
<script src="assets/vendor.js"></script>
<script src="assets/test-support.js"></script>
<script src="assets/todomvc.js"></script>
<script src="assets/tests.js"></script>
<script src="assets/test-loader.js"></script>
{{content-for "body-footer"}}
{{content-for "test-body-footer"}}
</body>
</html>
import resolver from './helpers/resolver';
import {
setResolver
} from 'ember-qunit';
setResolver(resolver);
......@@ -197,8 +197,8 @@ label[for='toggle-all'] {
}
#todo-list li label {
white-space: pre-line;
word-break: break-all;
white-space: pre;
word-break: break-word;
padding: 15px 60px 15px 15px;
margin-left: 45px;
display: block;
......
This source diff could not be displayed because it is too large. You can view the blob instead.
This source diff could not be displayed because it is too large. You can view the blob instead.
site-assets/logo-icon.png

32.7 KB | W: | H:

site-assets/logo-icon.png

32.8 KB | W: | H:

site-assets/logo-icon.png
site-assets/logo-icon.png
site-assets/logo-icon.png
site-assets/logo-icon.png
  • 2-up
  • Swipe
  • Onion skin
<svg xmlns="http://www.w3.org/2000/svg" width="500" height="85.529"><path d="M115.936 74.48v-6.71l8.744-.593c1.188-.086 1.358-.425 1.358-1.698V22.26h-8.743c-.935 0-1.19.083-1.36.933l-1.357 7.387h-9.34V13.01h54.678v17.576h-9.255l-1.35-7.388c-.17-.85-.42-.933-1.36-.933h-8.75V65.48c0 1.187.09 1.526 1.36 1.61l9.34.68v6.71h-33.96zm35.14 1.18h-36.32v-8.99L124.6 66l.244-.025.015-.495V23.444h-7.57l-.19.003-1.55 8.317h-11.49V11.83h57.03v19.935h-11.42l-1.53-8.317-.21-.003h-7.57v42.448l.25.022 10.44.76v8.984zm-33.96-2.36h31.602v-4.433l-8.246-.6c-2.264-.15-2.453-1.46-2.453-2.788v-44.4h9.92c1.08 0 2.17.14 2.51 1.88l1.18 6.44h7.09V14.19h-52.31v15.216h7.17l1.18-6.422c.35-1.753 1.43-1.898 2.52-1.898h9.92V65.48c0 1.307-.19 2.71-2.46 2.876l-7.65.517V73.3zm41.447-20.64c0-14.096 7.385-23.264 22.923-23.264 15.705 0 21.817 9.338 21.817 22.33 0 14.433-7.302 23.77-22.923 23.77-15.533 0-21.817-9.508-21.817-22.837zm31.33-.51c0-10.02-3.058-13.586-8.575-13.586-5.604 0-9.34 3.482-9.34 13.67 0 10.273 3.31 14.35 8.997 14.35 5.52 0 8.917-3.82 8.917-14.434zm-9.512 24.527c-14.82 0-22.99-8.53-22.99-24.018 0-15.54 8.79-24.45 24.11-24.45 14.83 0 23 8.35 23 23.51 0 16.09-8.56 24.95-24.1 24.95zm1.11-46.1c-14.02 0-21.74 7.842-21.74 22.082 0 9.88 3.58 21.65 20.64 21.65 17.97 0 21.75-12.29 21.75-22.59 0-9.65-3.58-21.15-20.64-21.15zm-.51 37.186c-6.75 0-10.18-5.224-10.18-15.528 0-9.854 3.54-14.85 10.52-14.85 8.74 0 9.76 8.426 9.76 14.766 0 10.51-3.3 15.62-10.09 15.62zm.34-28.02c-3.5 0-8.16 1.295-8.16 12.49 0 11.804 4.47 13.17 7.82 13.17 3.32 0 7.74-1.372 7.74-13.253 0-10.932-3.73-12.406-7.39-12.406zm59.1 34.736l-.85-4.76-.59-.09c-3.56 3.48-7.72 5.85-13.92 5.85-10.02 0-16.47-6.37-16.47-22.58 0-17.07 8.58-23.52 18.01-23.52 4.92 0 8.75 1.7 11.97 4.07v-12.9c0-.85-.34-1.44-1.1-1.7l-4.67-1.61.94-6.88h17.06v55.19c0 1.27.08 1.44 1.36 1.61l4.08.59v6.71h-15.79zm-2.38-32.69c-2.12-1.45-4.84-2.55-7.3-2.55-6.28 0-8.74 5.85-8.74 13.41 0 8.23 2.38 12.82 7.73 12.82 2.89 0 6.03-1.7 8.33-3.65V41.79zm-12.99 34.88c-11.71 0-17.65-8-17.65-23.77 0-15.47 7.17-24.7 19.18-24.7 3.87 0 7.42.99 10.79 3.04V20.56c0-.48-.14-.523-.3-.58l-5.59-1.93 1.2-8.856h19.28V65.56l.01.395.33.05 5.1.74v8.91h-17.96l-.74-4.15c-4.05 3.563-8.32 5.166-13.64 5.166zm1.53-46.1c-10.69 0-16.82 8.14-16.82 22.33 0 14.4 5.01 21.4 15.3 21.4 5.15 0 9.19-1.7 13.1-5.52l.42-.41 2.02.29.83 4.62h13.62v-4.5l-3.06-.45c-2.01-.27-2.36-1.11-2.36-2.78v-54h-14.86l-.66 4.9 3.75 1.29c1.2.4 1.9 1.43 1.9 2.81V35.8l-1.88-1.385c-3.56-2.623-7.14-3.844-11.27-3.844zm3.14 36.08c-5.9 0-8.9-4.71-8.9-14 0-9.28 3.62-14.6 9.93-14.6 2.5 0 5.4 1 7.97 2.75l.52.35v21.21l-.41.35c-1.39 1.18-5.05 3.93-9.09 3.93zm1.02-26.24c-6.58 0-7.56 7.66-7.56 12.23 0 11.64 4.93 11.64 6.55 11.64 2.13 0 4.77-1.13 7.15-3.03V42.43c-2.03-1.263-4.27-2.004-6.12-2.004zm28.36 12.24c0-14.1 7.39-23.27 22.93-23.27 15.71 0 21.82 9.34 21.82 22.33 0 14.43-7.3 23.77-22.92 23.77-15.54 0-21.82-9.51-21.82-22.84zm31.33-.51c0-10.02-3.06-13.59-8.57-13.59-5.6 0-9.33 3.48-9.33 13.67 0 10.27 3.31 14.35 9 14.35 5.52 0 8.92-3.82 8.92-14.43zm-9.51 24.52c-14.83 0-23-8.53-23-24.02 0-15.54 8.79-24.45 24.11-24.45 14.83 0 23 8.35 23 23.51 0 16.09-8.56 24.95-24.1 24.95zm1.11-46.1c-14.02 0-21.74 7.84-21.74 22.08 0 9.88 3.59 21.65 20.64 21.65 17.97 0 21.74-12.29 21.74-22.59 0-9.65-3.58-21.15-20.64-21.15zm-.51 37.18c-6.75 0-10.18-5.23-10.18-15.53 0-9.86 3.54-14.85 10.52-14.85 8.75 0 9.76 8.42 9.76 14.76 0 10.5-3.3 15.61-10.1 15.61zm.34-28.02c-3.5 0-8.16 1.29-8.16 12.49 0 11.8 4.47 13.17 7.82 13.17 3.32 0 7.74-1.37 7.74-13.26 0-10.93-3.74-12.41-7.4-12.41z" fill="#2D2D2D"/><path d="M354.554 74.48v-6.624l6.963-.594c1.188-.17 1.358-.51 1.358-1.698V33.302h-.34l-12.14 28.95h-13.843l-11.968-29.035h-.427V65.48c0 1.356.086 1.527 1.358 1.698l7.303.68v6.622h-25.81v-6.623l5.347-.594c1.19-.17 1.36-.427 1.36-1.698V22.01c0-1.274-.17-1.527-1.36-1.697l-5.347-.595V13.01h22.753l14.78 38.46h.34l15.54-38.46h22.08v6.623l-5.69.68c-1.27.17-1.36.338-1.36 1.61v43.642c0 1.104.26 1.442 1.36 1.613l5.69.68v6.622h-27.94zm29.114 1.18h-30.292v-8.886l8.04-.688.29-.06c-.02-.047-.012-.198-.012-.463v-27.21L351.177 63.43h-15.414l-10.426-25.294v27.342l.008.48.328.05 8.325.77v8.88H305.83V66.8l6.396-.712.295-.053.02-.473V22.01l-.01-.473-.33-.057-6.36-.707V11.83h24.74l14.16 36.854 14.88-36.854h24.05v8.85l-6.73.804-.31.048v44.035l.02.396.34.055 6.69.8v8.844zm-27.935-2.36h25.575v-4.396l-4.65-.556c-1.69-.26-2.397-1.093-2.397-2.784v-43.64c0-1.667.36-2.51 2.39-2.78l4.67-.557V14.19h-20.11l-15.54 38.46h-1.94l-14.77-38.46h-20.77v4.472l4.3.478c2.02.29 2.41 1.27 2.41 2.87v43.555c0 1.6-.38 2.58-2.37 2.866l-4.34.49v4.38h23.46v-4.36l-6.23-.58c-2.08-.28-2.43-1.11-2.43-2.87V32.04h2.4l11.97 29.037h12.27l12.14-28.954h2.3v33.45c0 1.56-.39 2.585-2.36 2.87l-5.95.51v4.36zm55.443 1.18L394.11 22.01c-.34-1.02-1.017-1.19-2.038-1.444l-3.82-.933.85-6.623h25.727v6.623l-6.88.763 12.73 42.45h.68l12.31-42.45-6.79-.763.85-6.623h21.98v6.623l-3.57.933c-1.02.255-1.87.595-2.12 1.612L428.5 74.48h-17.324zm18.2 1.18H410.32l-17.33-53.286c-.115-.342-.13-.396-1.197-.663l-4.844-1.18 1.11-8.7H416v8.86l-6.52.73L421 59.85l11.14-38.423-6.587-.74 1.13-8.84h24.21v8.71l-4.446 1.165c-1.077.27-1.21.484-1.275.76l-15.805 53.19zm-17.344-2.36h15.584l15.286-51.458c.45-1.788 2.148-2.217 2.965-2.42l2.675-.7V14.19h-19.77l-.566 4.403 6.99.786-12.944 44.64h-2.446l-13.392-44.64 7.235-.81v-4.39h-23.52l-.59 4.55 2.8.68c1.1.28 2.33.58 2.88 2.22l16.81 51.67zm86.79-2.47c-5.012 3.056-13.503 4.666-21.23 4.666-21.14 0-29.8-12.308-29.8-32.007 0-18.09 10.442-31.59 31.583-31.59 7.047 0 14.603 1.78 19.273 4.84v16.64l-9.338-.77-1.358-8.32c-.17-.85-.512-1.28-1.36-1.53-1.867-.6-4.753-1.02-7.554-1.02-10.785 0-17.664 7.3-17.664 21.73 0 15.02 6.54 22.33 17.07 22.33 2.8 0 6.28-.43 8.488-1.11 1.02-.26 1.273-.51 1.528-1.79l1.273-7.9h9.086v15.8zm-21.228 5.847c-20.558 0-30.98-11.167-30.98-33.188 0-20.21 12.554-32.77 32.763-32.77 7.545 0 15.18 1.93 19.92 5.03l.532.34v18.56l-11.54-.95-1.51-9.23c-.09-.43-.15-.48-.54-.59-1.86-.59-4.68-.97-7.22-.97-10.63 0-16.49 7.3-16.49 20.55 0 13.83 5.49 21.15 15.89 21.15 2.78 0 6.13-.44 8.14-1.05.41-.11.5-.16.52-.17 0-.02.08-.15.19-.72l1.43-8.84H500v17.63l-.564.34c-4.896 2.98-13.265 4.84-21.842 4.84zm1.782-63.593c-19.037 0-30.404 11.367-30.404 30.405 0 20.45 9.63 30.82 28.622 30.82 7.718 0 15.475-1.63 20.047-4.17V56.21h-6.9l-1.11 6.906c-.34 1.73-.9 2.36-2.4 2.737-2.19.67-5.74 1.134-8.78 1.134-11.77 0-18.24-8.35-18.24-23.508 0-14.57 6.87-22.92 18.84-22.92 2.8 0 5.83.41 7.92 1.07 1.23.37 1.9 1.11 2.16 2.42l1.22 7.45 7.15.58v-14.7c-4.37-2.64-11.37-4.32-18.09-4.32z" fill="#AF2F2F"/><g fill="#2D2D2D"><path d="M12.83 5.7h8.78V0h-8.78c-2.433 0-4.8.683-6.85 1.98l3.047 4.814C10.163 6.08 11.475 5.7 12.83 5.7m-7.126 7.127c0-1.042.216-2.042.646-2.98L1.172 7.46C.394 9.15 0 10.956 0 12.826V22.92h5.704V12.828zM0 28.68h5.704v14.37H0zm76.782-21.7c1.718-1.092 3.432-2.122 5.13-3.08-.97-1-2.104-1.842-3.336-2.478C76.773.492 74.74 0 72.7 0h-5.047v5.7H72.7c1.495 0 2.905.45 4.082 1.28M0 48.81h5.704v14.397H0zM27.37 0h14.37v5.7H27.37zm20.127 0h14.396v5.7H47.497zm6.358 79.824h14.367v5.705H53.855zm25.972-47.437h5.7v14.398h-5.7zm0 20.155h5.7v14.372h-5.7zM5.704 72.7v-3.74H0v3.74c0 4.667 2.54 8.975 6.63 11.235l2.76-4.99c-2.275-1.26-3.686-3.65-3.686-6.246m74.123-49.86v3.77h5.7v-8.46c-1.874 1.4-3.77 2.96-5.7 4.69"/><path d="M79.827 72.7c0 3.574-2.667 6.613-6.203 7.07l.726 5.654c3.07-.396 5.897-1.894 7.956-4.22 2.078-2.347 3.223-5.366 3.223-8.506v-.028h-5.71v.03zm-66.285 7.124H27.94v5.705H13.542zm20.154 0h14.4v5.705h-14.4z"/></g><path fill="#AF2F2F" d="M13.06 45.396L39.802 72.14S66.548 20.687 95.465 9.146L94.38 1.002C78.633 7.246 54.734 23.675 37.088 48.79l-18.6-10.997-5.428 7.603z"/></svg>
\ No newline at end of file
<svg xmlns="http://www.w3.org/2000/svg" width="500" height="85.529"><path d="M115.936 74.48v-6.71l8.744-.593c1.188-.086 1.358-.425 1.358-1.698V22.26h-8.743c-.935 0-1.19.083-1.36.933l-1.357 7.387h-9.34V13.01h54.678v17.576h-9.255l-1.35-7.388c-.17-.85-.42-.933-1.36-.933h-8.75V65.48c0 1.187.09 1.526 1.36 1.61l9.34.68v6.71h-33.96zm35.14 1.18h-36.32v-8.99L124.6 66l.244-.025.015-.495V23.444h-7.57l-.19.003-1.55 8.317h-11.49V11.83h57.03v19.935h-11.42l-1.53-8.317-.21-.003h-7.57v42.448l.25.022 10.44.76v8.984zm-33.96-2.36h31.602v-4.433l-8.246-.6c-2.264-.15-2.453-1.46-2.453-2.788v-44.4h9.92c1.08 0 2.17.14 2.51 1.88l1.18 6.44h7.09V14.19h-52.31v15.216h7.17l1.18-6.422c.35-1.753 1.43-1.898 2.52-1.898h9.92V65.48c0 1.307-.19 2.71-2.46 2.876l-7.65.517V73.3zm41.447-20.64c0-14.096 7.385-23.264 22.923-23.264 15.705 0 21.817 9.338 21.817 22.33 0 14.433-7.302 23.77-22.923 23.77-15.533 0-21.817-9.508-21.817-22.837zm31.33-.51c0-10.02-3.058-13.586-8.575-13.586-5.604 0-9.34 3.482-9.34 13.67 0 10.273 3.31 14.35 8.997 14.35 5.52 0 8.917-3.82 8.917-14.434zm-9.512 24.527c-14.82 0-22.99-8.53-22.99-24.018 0-15.54 8.79-24.45 24.11-24.45 14.83 0 23 8.35 23 23.51 0 16.09-8.56 24.95-24.1 24.95zm1.11-46.1c-14.02 0-21.74 7.842-21.74 22.082 0 9.88 3.58 21.65 20.64 21.65 17.97 0 21.75-12.29 21.75-22.59 0-9.65-3.58-21.15-20.64-21.15zm-.51 37.186c-6.75 0-10.18-5.224-10.18-15.528 0-9.854 3.54-14.85 10.52-14.85 8.74 0 9.76 8.426 9.76 14.766 0 10.51-3.3 15.62-10.09 15.62zm.34-28.02c-3.5 0-8.16 1.295-8.16 12.49 0 11.804 4.47 13.17 7.82 13.17 3.32 0 7.74-1.372 7.74-13.253 0-10.932-3.73-12.406-7.39-12.406zm59.1 34.736l-.85-4.76-.59-.09c-3.56 3.48-7.72 5.85-13.92 5.85-10.02 0-16.47-6.37-16.47-22.58 0-17.07 8.58-23.52 18.01-23.52 4.92 0 8.75 1.7 11.97 4.07v-12.9c0-.85-.34-1.44-1.1-1.7l-4.67-1.61.94-6.88h17.06v55.19c0 1.27.08 1.44 1.36 1.61l4.08.59v6.71h-15.79zm-2.38-32.69c-2.12-1.45-4.84-2.55-7.3-2.55-6.28 0-8.74 5.85-8.74 13.41 0 8.23 2.38 12.82 7.73 12.82 2.89 0 6.03-1.7 8.33-3.65V41.79zm-12.99 34.88c-11.71 0-17.65-8-17.65-23.77 0-15.47 7.17-24.7 19.18-24.7 3.87 0 7.42.99 10.79 3.04V20.56c0-.48-.14-.523-.3-.58l-5.59-1.93 1.2-8.856h19.28V65.56l.01.395.33.05 5.1.74v8.91h-17.96l-.74-4.15c-4.05 3.563-8.32 5.166-13.64 5.166zm1.53-46.1c-10.69 0-16.82 8.14-16.82 22.33 0 14.4 5.01 21.4 15.3 21.4 5.15 0 9.19-1.7 13.1-5.52l.42-.41 2.02.29.83 4.62h13.62v-4.5l-3.06-.45c-2.01-.27-2.36-1.11-2.36-2.78v-54h-14.86l-.66 4.9 3.75 1.29c1.2.4 1.9 1.43 1.9 2.81V35.8l-1.88-1.385c-3.56-2.623-7.14-3.844-11.27-3.844zm3.14 36.08c-5.9 0-8.9-4.71-8.9-14 0-9.28 3.62-14.6 9.93-14.6 2.5 0 5.4 1 7.97 2.75l.52.35v21.21l-.41.35c-1.39 1.18-5.05 3.93-9.09 3.93zm1.02-26.24c-6.58 0-7.56 7.66-7.56 12.23 0 11.64 4.93 11.64 6.55 11.64 2.13 0 4.77-1.13 7.15-3.03V42.43c-2.03-1.263-4.27-2.004-6.12-2.004zm28.36 12.24c0-14.1 7.39-23.27 22.93-23.27 15.71 0 21.82 9.34 21.82 22.33 0 14.43-7.3 23.77-22.92 23.77-15.54 0-21.82-9.51-21.82-22.84zm31.33-.51c0-10.02-3.06-13.59-8.57-13.59-5.6 0-9.33 3.48-9.33 13.67 0 10.27 3.31 14.35 9 14.35 5.52 0 8.92-3.82 8.92-14.43zm-9.51 24.52c-14.83 0-23-8.53-23-24.02 0-15.54 8.79-24.45 24.11-24.45 14.83 0 23 8.35 23 23.51 0 16.09-8.56 24.95-24.1 24.95zm1.11-46.1c-14.02 0-21.74 7.84-21.74 22.08 0 9.88 3.59 21.65 20.64 21.65 17.97 0 21.74-12.29 21.74-22.59 0-9.65-3.58-21.15-20.64-21.15zm-.51 37.18c-6.75 0-10.18-5.23-10.18-15.53 0-9.86 3.54-14.85 10.52-14.85 8.75 0 9.76 8.42 9.76 14.76 0 10.5-3.3 15.61-10.1 15.61zm.34-28.02c-3.5 0-8.16 1.29-8.16 12.49 0 11.8 4.47 13.17 7.82 13.17 3.32 0 7.74-1.37 7.74-13.26 0-10.93-3.74-12.41-7.4-12.41z" fill="#2D2D2D"/><path d="M354.554 74.48v-6.624l6.963-.594c1.188-.17 1.358-.51 1.358-1.698V33.302h-.34l-12.14 28.95h-13.843l-11.968-29.035h-.427V65.48c0 1.356.086 1.527 1.358 1.698l7.303.68v6.622h-25.81v-6.623l5.347-.594c1.19-.17 1.36-.427 1.36-1.698V22.01c0-1.274-.17-1.527-1.36-1.697l-5.347-.595V13.01h22.753l14.78 38.46h.34l15.54-38.46h22.08v6.623l-5.69.68c-1.27.17-1.36.338-1.36 1.61v43.642c0 1.104.26 1.442 1.36 1.613l5.69.68v6.622h-27.94zm29.114 1.18h-30.292v-8.886l8.04-.688.29-.06c-.02-.047-.012-.198-.012-.463v-27.21L351.177 63.43h-15.414l-10.426-25.294v27.342l.008.48.328.05 8.325.77v8.88H305.83V66.8l6.396-.712.295-.053.02-.473V22.01l-.01-.473-.33-.057-6.36-.707V11.83h24.74l14.16 36.854 14.88-36.854h24.05v8.85l-6.73.804-.31.048v44.035l.02.396.34.055 6.69.8v8.844zm-27.935-2.36h25.575v-4.396l-4.65-.556c-1.69-.26-2.397-1.093-2.397-2.784v-43.64c0-1.667.36-2.51 2.39-2.78l4.67-.557V14.19h-20.11l-15.54 38.46h-1.94l-14.77-38.46h-20.77v4.472l4.3.478c2.02.29 2.41 1.27 2.41 2.87v43.555c0 1.6-.38 2.58-2.37 2.866l-4.34.49v4.38h23.46v-4.36l-6.23-.58c-2.08-.28-2.43-1.11-2.43-2.87V32.04h2.4l11.97 29.037h12.27l12.14-28.954h2.3v33.45c0 1.56-.39 2.585-2.36 2.87l-5.95.51v4.36zm55.443 1.18L394.11 22.01c-.34-1.02-1.017-1.19-2.038-1.444l-3.82-.933.85-6.623h25.727v6.623l-6.88.763 12.73 42.45h.68l12.31-42.45-6.79-.763.85-6.623h21.98v6.623l-3.57.933c-1.02.255-1.87.595-2.12 1.612L428.5 74.48h-17.324zm18.2 1.18H410.32l-17.33-53.286c-.115-.342-.13-.396-1.197-.663l-4.844-1.18 1.11-8.7H416v8.86l-6.52.73L421 59.85l11.14-38.423-6.587-.74 1.13-8.84h24.21v8.71l-4.446 1.165c-1.077.27-1.21.484-1.275.76l-15.805 53.19zm-17.344-2.36h15.584l15.286-51.458c.45-1.788 2.148-2.217 2.965-2.42l2.675-.7V14.19h-19.77l-.566 4.403 6.99.786-12.944 44.64h-2.446l-13.392-44.64 7.235-.81v-4.39h-23.52l-.59 4.55 2.8.68c1.1.28 2.33.58 2.88 2.22l16.81 51.67zm86.79-2.47c-5.012 3.056-13.503 4.666-21.23 4.666-21.14 0-29.8-12.308-29.8-32.007 0-18.09 10.442-31.59 31.583-31.59 7.047 0 14.603 1.78 19.273 4.84v16.64l-9.338-.77-1.358-8.32c-.17-.85-.512-1.28-1.36-1.53-1.867-.6-4.753-1.02-7.554-1.02-10.785 0-17.664 7.3-17.664 21.73 0 15.02 6.54 22.33 17.07 22.33 2.8 0 6.28-.43 8.488-1.11 1.02-.26 1.273-.51 1.528-1.79l1.273-7.9h9.086v15.8zm-21.228 5.847c-20.558 0-30.98-11.167-30.98-33.188 0-20.21 12.554-32.77 32.763-32.77 7.545 0 15.18 1.93 19.92 5.03l.532.34v18.56l-11.54-.95-1.51-9.23c-.09-.43-.15-.48-.54-.59-1.86-.59-4.68-.97-7.22-.97-10.63 0-16.49 7.3-16.49 20.55 0 13.83 5.49 21.15 15.89 21.15 2.78 0 6.13-.44 8.14-1.05.41-.11.5-.16.52-.17 0-.02.08-.15.19-.72l1.43-8.84H500v17.63l-.564.34c-4.896 2.98-13.265 4.84-21.842 4.84zm1.782-63.593c-19.037 0-30.404 11.367-30.404 30.405 0 20.45 9.63 30.82 28.622 30.82 7.718 0 15.475-1.63 20.047-4.17V56.21h-6.9l-1.11 6.906c-.34 1.73-.9 2.36-2.4 2.737-2.19.67-5.74 1.134-8.78 1.134-11.77 0-18.24-8.35-18.24-23.508 0-14.57 6.87-22.92 18.84-22.92 2.8 0 5.83.41 7.92 1.07 1.23.37 1.9 1.11 2.16 2.42l1.22 7.45 7.15.58v-14.7c-4.37-2.64-11.37-4.32-18.09-4.32z" fill="#AF2F2F"/><path d="M12.83 5.7h8.78V0h-8.78c-2.433 0-4.8.683-6.85 1.98l3.047 4.814A7.13 7.13 0 0 1 12.83 5.7m-7.126 7.127a7.09 7.09 0 0 1 .646-2.98L1.172 7.46A12.743 12.743 0 0 0 0 12.826V22.92h5.704V12.828zM0 28.68h5.704v14.37H0zm76.782-21.7a114.114 114.114 0 0 1 5.13-3.08 12.92 12.92 0 0 0-3.336-2.478A12.875 12.875 0 0 0 72.7 0h-5.047v5.7H72.7c1.495 0 2.905.45 4.082 1.28M0 48.81h5.704v14.397H0zM27.37 0h14.37v5.7H27.37zm20.127 0h14.396v5.7H47.497zm6.358 79.824h14.367v5.705H53.855zm25.972-47.437h5.7v14.398h-5.7zm0 20.155h5.7v14.372h-5.7zM5.704 72.7v-3.74H0v3.74c0 4.667 2.54 8.975 6.63 11.235l2.76-4.99a7.14 7.14 0 0 1-3.686-6.246m74.123-49.86v3.77h5.7v-8.46a82.825 82.825 0 0 0-5.7 4.69m0 49.861c0 3.574-2.667 6.613-6.203 7.07l.726 5.654a12.817 12.817 0 0 0 7.956-4.22 12.817 12.817 0 0 0 3.223-8.506v-.028h-5.71v.03zm-66.285 7.124H27.94v5.705H13.542zm20.154 0h14.4v5.705h-14.4z" fill="#2D2D2D"/><path fill="#AF2F2F" d="M13.06 45.396L39.802 72.14S66.548 20.687 95.465 9.146L94.38 1.002C78.633 7.246 54.734 23.675 37.088 48.79l-18.6-10.997-5.428 7.603z"/></svg>
\ No newline at end of file
This source diff could not be displayed because it is too large. You can view the blob instead.
This source diff could not be displayed because it is too large. You can view the blob instead.
site-assets/screenshot.png

5.26 KB | W: | H:

site-assets/screenshot.png

5.26 KB | W: | H:

site-assets/screenshot.png
site-assets/screenshot.png
site-assets/screenshot.png
site-assets/screenshot.png
  • 2-up
  • Swipe
  • Onion skin
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment