> DUEL is a dual-side templating engine using HTML for layout and 100% pure JavaScript as the binding language. The same views may be executed both directly in the browser (client-side template) and on the server (server-side template).
*[DUEL on BitBucket](https://bitbucket.org/mckamey/duel/src)
_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)._
*Let us [know](https://github.com/tastejs/todomvc/issues) if you discover anything worth sharing.*
## Implementation
...
...
@@ -44,4 +40,8 @@ To run a debug-able version using Tomcat 7 as the web server, use this Maven com
mvn tomcat7:run
Then navigate your browser to http://localhost:8080/
Then navigate your browser to <http://localhost:8080/>
v(f);if(cinstanceofp)returnc.toDOM(a||d);d=m.createTextNode(""+c)}a&&a.parentNode&&a.parentNode.replaceChild(d,a);returnd};p.prototype.reload=function(){vara=m;try{varb=this.toDOM();a.replaceChild(b,a.documentElement);if(a.createStyleSheet){for(vard=b.firstChild;d&&"HEAD"!==(d.tagName||"");)d=d.nextSibling;for(varf=d&&d.firstChild;f;){if("LINK"===(f.tagName||""))f.href=f.href;f=f.nextSibling}}}catch(c){a=a.open("text/html"),a.write(""+this),a.close()}};returnx}(document,window.ScriptEngineMajorVersion);vartodos=todos||{};todos.views=todos.views||{};todos.views.Stats=duel(["","",["$if",{test:function(a){returna.total}},["footer",{"class":"footer"},"",["span",{"class":"todo-count"},["strong",function(a){returna.active}],"",function(a){return1===a.active?"item":"items"}," left"],"","",["!"," Hidden if no completed items are left \u2193 "],"",["$if",{test:function(a){returna.completed}},["button",{"class":"clear-completed",onclick:function(){returntodos.actions.clear_click}},"Clear completed"]]]]]);vartodos=todos||{};todos.views=todos.views||{};
todos.views.Tasks=duel(["","",["$if",{test:function(a){returna.tasks&&a.tasks.length}},["section",{"class":"main"},"",["input",{"class":"toggle-all",type:"checkbox",checked:function(a){return!a.stats.active},onchange:function(){returntodos.actions.toggle_change}}],"",["label",{"for":"toggle-all"},"Mark all as complete"],"",["ul",{"class":"todo-list"},"",["$for",{each:function(a){returna.tasks}},"",["$call",{view:function(){returntodos.views.Task}}]],""]]]]);vartodos=todos||{};todos.views=todos.views||{};todos.views.TodoApp=duel(["section",{"class":"todoapp"},"",["header",{"class":"header"},"",["h1","todos"],"",["input",{"class":"new-todo",placeholder:"What needs to be done?",autofocus:!0,onblur:function(){returntodos.actions.add_blur},onkeydown:function(){returntodos.actions.add_keypress}}],""],"",["$call",{view:function(){returntodos.views.Tasks},data:function(a){returna}}],"",["$call",{view:function(){returntodos.views.Stats},data:function(a){returna.stats}}]]);vartodos=todos||{};
document.body.className=(document.body.className+" learn-bar").trim();document.body.insertAdjacentHTML("afterBegin",b.outerHTML)};if("tastejs.github.io"===location.hostname)location.href=location.href.replace("tastejs.github.io/todomvc","todomvc.com");(function(a,b){if(!location.host)returnconsole.info("Miss the info bar? Run TodoMVC from a server to avoid a cross-origin error.");varc=newXMLHttpRequest;c.open("GET",i()+a,!0);c.send();c.onload=function(){200===c.status&&b&&b(c.responseText)}})("learn.json",
{"class":"edit",type:"text",value:function(a){returna.title},onblur:function(a){returntodos.actions.edit_blur(a.id)},onkeypress:function(a){returntodos.actions.edit_keypress(a.id)}}]]]);vartodos=todos||{};todos.views=todos.views||{};todos.views.Tasks=duel(["","",["$if",{test:function(a){returna.tasks.length}},["section",{id:"main"},"",["input",{id:"toggle-all",type:"checkbox",checked:function(a){return!a.stats.active},onchange:function(){returntodos.actions.toggle_change}}],"",["label",{"for":"toggle-all"},"Mark all as complete"],"",["ul",{id:"todo-list"},"",["$for",{each:function(a){returna.tasks}},"",["$call",{view:function(){returntodos.views.Task}}]],""]]]]);vartodos=todos||{};todos.views=todos.views||{};todos.views.TodoApp=duel(["section",{id:"todoapp"},"",["header",{id:"header"},"",["h1","todos"],"",["input",{id:"new-todo",placeholder:"What needs to be done?",autofocus:null,onblur:function(){returntodos.actions.add_blur},onkeypress:function(){returntodos.actions.add_keypress}}],""],"",["$call",{view:function(){returntodos.views.Tasks},data:function(a){returna}}],"",["$call",{view:function(){returntodos.views.Stats},data:function(a){returna.stats}}]]);vartodos=todos||{};