{"version":3,"sources":["../node_modules/preact/dist/preact.esm.js","../node_modules/linkstate/dist/linkstate.es.js","../src/app/util.js","../src/app/model.js","../node_modules/classnames/index.js","../src/app/footer.js","../src/app/item.js","../src/app/index.js","../src/index.js"],"names":["VNode","h","nodeName","attributes","lastSimple","child","simple","i","children","EMPTY_CHILDREN","arguments","length","G","push","stack","pop","undefined","String","p","key","options","vnode","extend","obj","props","enqueueRender","component","_dirty","items","debounceRendering","defer","rerender","list","renderComponent","isSameNodeType","node","hydrating","splitText","_componentConstructor","isNamedNode","normalizedNodeName","toLowerCase","getNodeProps","defaultProps","createNode","isSvg","document","createElementNS","createElement","removeNode","parentNode","removeChild","setAccessor","name","old","value","style","cssText","_typeof","IS_NON_DIMENSIONAL","test","innerHTML","__html","useCapture","replace","t","substring","addEventListener","eventProxy","removeEventListener","_listeners","removeAttribute","ns","removeAttributeNS","setAttributeNS","setAttribute","className","setProperty","e","this","type","event","flushMounts","c","mounts","afterMount","componentDidMount","diff","dom","context","mountAll","parent","componentRoot","diffLevel","ownerSVGElement","ret","idiff","appendChild","out","prevSvgMode","isSvgMode","_component","nodeValue","createTextNode","replaceChild","__preactattr_","vnodeName","buildComponentFromVNode","firstChild","fc","vchildren","a","nextSibling","u","dangerouslySetInnerHTML","innerDiffNode","isHydrating","j","f","vchild","originalChildren","childNodes","keyed","keyedLen","min","len","childrenLen","vlen","_child","__key","trim","insertBefore","recollectNodeTree","unmountOnly","ref","removeChildren","lastChild","next","previousSibling","diffAttributes","attrs","collectComponent","constructor","components","createComponent","Ctor","inst","prototype","render","call","Component","doRender","o","nextBase","splice","state","setComponentProps","opts","_disable","__ref","base","componentWillMount","componentWillReceiveProps","prevContext","prevProps","syncComponentUpdates","isChild","rendered","cbase","previousProps","previousState","prevState","previousContext","isUpdate","initialBase","initialChildComponent","skip","shouldComponentUpdate","k","componentWillUpdate","getChildContext","toUnmount","childComponent","childProps","T","_parentComponent","S","E","baseParent","v","componentRef","unshift","componentDidUpdate","afterUpdate","_renderCallbacks","originalComponent","oldDom","isDirectOwner","isOwner","r","x","unmountComponent","beforeUnmount","componentWillUnmount","inner","merge","dlv","def","split","linkState","eventPath","path","target","match","checked","setState","uuid","random","Math","toString","pluralize","count","word","store","Promise","resolve","then","bind","setTimeout","callback","s","re","Object","assign","n","hasOwnProperty","TodoModel","sub","todos","onChanges","inform","forEach","cb","addTodo","title","concat","toggleAll","completed","map","todo","toggle","todoToToggle","_extends","destroy","filter","save","todoToSave","clearCompleted","classNames","classes","arg","argType","Array","isArray","apply","hasOwn","join","module","exports","define","amd","TodoFooter","nowShowing","_ref","completedCount","onClearCompleted","class","P","href","cx","selected","onClick","ESCAPE_KEY","ENTER_KEY","TodoItem","handleSubmit","_this","onSave","_this$props","onDestroy","val","editText","handleEdit","onEdit","_this$props2","_this$props3","onToggle","preventDefault","handleKeyDown","which","onCancel","handleDestroy","querySelector","focus","_ref$todo","editing","_ref2","onDblClick","onKeyDown","FILTERS","active","App","_Component","handleNewTodoKeyDown","keyCode","model","newTodo","edit","id","text","cancel","handleRoute","location","hash","_ref2$nowShowing","ALL_TODOS","shownTodos","activeTodoCount","reduce","placeholder","autoFocus","onChange","_this2"],"mappings":"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","file":"app.js","sourcesContent":["/** Virtual DOM Node */\nfunction VNode() {}\n\n/** Global options\n *\t@public\n *\t@namespace options {Object}\n */\nvar options = {\n\n\t/** If `true`, `prop` changes trigger synchronous component updates.\n  *\t@name syncComponentUpdates\n  *\t@type Boolean\n  *\t@default true\n  */\n\t//syncComponentUpdates: true,\n\n\t/** Processes all created VNodes.\n  *\t@param {VNode} vnode\tA newly-created VNode to normalize/process\n  */\n\t//vnode(vnode) { }\n\n\t/** Hook invoked after a component is mounted. */\n\t// afterMount(component) { }\n\n\t/** Hook invoked after the DOM is updated with a component's latest render. */\n\t// afterUpdate(component) { }\n\n\t/** Hook invoked immediately before a component is unmounted. */\n\t// beforeUnmount(component) { }\n};\n\nvar stack = [];\n\nvar EMPTY_CHILDREN = [];\n\n/** JSX/hyperscript reviver\n*\tBenchmarks: https://esbench.com/bench/57ee8f8e330ab09900a1a1a0\n *\t@see http://jasonformat.com/wtf-is-jsx\n *\t@public\n */\nfunction h(nodeName, attributes) {\n\tvar children = EMPTY_CHILDREN,\n\t    lastSimple,\n\t    child,\n\t    simple,\n\t    i;\n\tfor (i = arguments.length; i-- > 2;) {\n\t\tstack.push(arguments[i]);\n\t}\n\tif (attributes && attributes.children != null) {\n\t\tif (!stack.length) stack.push(attributes.children);\n\t\tdelete attributes.children;\n\t}\n\twhile (stack.length) {\n\t\tif ((child = stack.pop()) && child.pop !== undefined) {\n\t\t\tfor (i = child.length; i--;) {\n\t\t\t\tstack.push(child[i]);\n\t\t\t}\n\t\t} else {\n\t\t\tif (typeof child === 'boolean') child = null;\n\n\t\t\tif (simple = typeof nodeName !== 'function') {\n\t\t\t\tif (child == null) child = '';else if (typeof child === 'number') child = String(child);else if (typeof child !== 'string') simple = false;\n\t\t\t}\n\n\t\t\tif (simple && lastSimple) {\n\t\t\t\tchildren[children.length - 1] += child;\n\t\t\t} else if (children === EMPTY_CHILDREN) {\n\t\t\t\tchildren = [child];\n\t\t\t} else {\n\t\t\t\tchildren.push(child);\n\t\t\t}\n\n\t\t\tlastSimple = simple;\n\t\t}\n\t}\n\n\tvar p = new VNode();\n\tp.nodeName = nodeName;\n\tp.children = children;\n\tp.attributes = attributes == null ? undefined : attributes;\n\tp.key = attributes == null ? undefined : attributes.key;\n\n\t// if a \"vnode hook\" is defined, pass every created VNode to it\n\tif (options.vnode !== undefined) options.vnode(p);\n\n\treturn p;\n}\n\n/** Copy own-properties from `props` onto `obj`.\n *\t@returns obj\n *\t@private\n */\nfunction extend(obj, props) {\n  for (var i in props) {\n    obj[i] = props[i];\n  }return obj;\n}\n\n/** Call a function asynchronously, as soon as possible.\n *\t@param {Function} callback\n */\nvar defer = typeof Promise == 'function' ? Promise.resolve().then.bind(Promise.resolve()) : setTimeout;\n\nfunction cloneElement(vnode, props) {\n\treturn h(vnode.nodeName, extend(extend({}, vnode.attributes), props), arguments.length > 2 ? [].slice.call(arguments, 2) : vnode.children);\n}\n\n// DOM properties that should NOT have \"px\" added when numeric\nvar IS_NON_DIMENSIONAL = /acit|ex(?:s|g|n|p|$)|rph|ows|mnc|ntw|ine[ch]|zoo|^ord/i;\n\n/** Managed queue of dirty components to be re-rendered */\n\nvar items = [];\n\nfunction enqueueRender(component) {\n\tif (!component._dirty && (component._dirty = true) && items.push(component) == 1) {\n\t\t(options.debounceRendering || defer)(rerender);\n\t}\n}\n\nfunction rerender() {\n\tvar p,\n\t    list = items;\n\titems = [];\n\twhile (p = list.pop()) {\n\t\tif (p._dirty) renderComponent(p);\n\t}\n}\n\n/** Check if two nodes are equivalent.\n *\t@param {Element} node\n *\t@param {VNode} vnode\n *\t@private\n */\nfunction isSameNodeType(node, vnode, hydrating) {\n\tif (typeof vnode === 'string' || typeof vnode === 'number') {\n\t\treturn node.splitText !== undefined;\n\t}\n\tif (typeof vnode.nodeName === 'string') {\n\t\treturn !node._componentConstructor && isNamedNode(node, vnode.nodeName);\n\t}\n\treturn hydrating || node._componentConstructor === vnode.nodeName;\n}\n\n/** Check if an Element has a given normalized name.\n*\t@param {Element} node\n*\t@param {String} nodeName\n */\nfunction isNamedNode(node, nodeName) {\n\treturn node.normalizedNodeName === nodeName || node.nodeName.toLowerCase() === nodeName.toLowerCase();\n}\n\n/**\n * Reconstruct Component-style `props` from a VNode.\n * Ensures default/fallback values from `defaultProps`:\n * Own-properties of `defaultProps` not present in `vnode.attributes` are added.\n * @param {VNode} vnode\n * @returns {Object} props\n */\nfunction getNodeProps(vnode) {\n\tvar props = extend({}, vnode.attributes);\n\tprops.children = vnode.children;\n\n\tvar defaultProps = vnode.nodeName.defaultProps;\n\tif (defaultProps !== undefined) {\n\t\tfor (var i in defaultProps) {\n\t\t\tif (props[i] === undefined) {\n\t\t\t\tprops[i] = defaultProps[i];\n\t\t\t}\n\t\t}\n\t}\n\n\treturn props;\n}\n\n/** Create an element with the given nodeName.\n *\t@param {String} nodeName\n *\t@param {Boolean} [isSvg=false]\tIf `true`, creates an element within the SVG namespace.\n *\t@returns {Element} node\n */\nfunction createNode(nodeName, isSvg) {\n\tvar node = isSvg ? document.createElementNS('http://www.w3.org/2000/svg', nodeName) : document.createElement(nodeName);\n\tnode.normalizedNodeName = nodeName;\n\treturn node;\n}\n\n/** Remove a child node from its parent if attached.\n *\t@param {Element} node\t\tThe node to remove\n */\nfunction removeNode(node) {\n\tvar parentNode = node.parentNode;\n\tif (parentNode) parentNode.removeChild(node);\n}\n\n/** Set a named attribute on the given Node, with special behavior for some names and event handlers.\n *\tIf `value` is `null`, the attribute/handler will be removed.\n *\t@param {Element} node\tAn element to mutate\n *\t@param {string} name\tThe name/key to set, such as an event or attribute name\n *\t@param {any} old\tThe last value that was set for this name/node pair\n *\t@param {any} value\tAn attribute value, such as a function to be used as an event handler\n *\t@param {Boolean} isSvg\tAre we currently diffing inside an svg?\n *\t@private\n */\nfunction setAccessor(node, name, old, value, isSvg) {\n\tif (name === 'className') name = 'class';\n\n\tif (name === 'key') {\n\t\t// ignore\n\t} else if (name === 'ref') {\n\t\tif (old) old(null);\n\t\tif (value) value(node);\n\t} else if (name === 'class' && !isSvg) {\n\t\tnode.className = value || '';\n\t} else if (name === 'style') {\n\t\tif (!value || typeof value === 'string' || typeof old === 'string') {\n\t\t\tnode.style.cssText = value || '';\n\t\t}\n\t\tif (value && typeof value === 'object') {\n\t\t\tif (typeof old !== 'string') {\n\t\t\t\tfor (var i in old) {\n\t\t\t\t\tif (!(i in value)) node.style[i] = '';\n\t\t\t\t}\n\t\t\t}\n\t\t\tfor (var i in value) {\n\t\t\t\tnode.style[i] = typeof value[i] === 'number' && IS_NON_DIMENSIONAL.test(i) === false ? value[i] + 'px' : value[i];\n\t\t\t}\n\t\t}\n\t} else if (name === 'dangerouslySetInnerHTML') {\n\t\tif (value) node.innerHTML = value.__html || '';\n\t} else if (name[0] == 'o' && name[1] == 'n') {\n\t\tvar useCapture = name !== (name = name.replace(/Capture$/, ''));\n\t\tname = name.toLowerCase().substring(2);\n\t\tif (value) {\n\t\t\tif (!old) node.addEventListener(name, eventProxy, useCapture);\n\t\t} else {\n\t\t\tnode.removeEventListener(name, eventProxy, useCapture);\n\t\t}\n\t\t(node._listeners || (node._listeners = {}))[name] = value;\n\t} else if (name !== 'list' && name !== 'type' && !isSvg && name in node) {\n\t\tsetProperty(node, name, value == null ? '' : value);\n\t\tif (value == null || value === false) node.removeAttribute(name);\n\t} else {\n\t\tvar ns = isSvg && name !== (name = name.replace(/^xlink\\:?/, ''));\n\t\tif (value == null || value === false) {\n\t\t\tif (ns) node.removeAttributeNS('http://www.w3.org/1999/xlink', name.toLowerCase());else node.removeAttribute(name);\n\t\t} else if (typeof value !== 'function') {\n\t\t\tif (ns) node.setAttributeNS('http://www.w3.org/1999/xlink', name.toLowerCase(), value);else node.setAttribute(name, value);\n\t\t}\n\t}\n}\n\n/** Attempt to set a DOM property to the given value.\n *\tIE & FF throw for certain property-value combinations.\n */\nfunction setProperty(node, name, value) {\n\ttry {\n\t\tnode[name] = value;\n\t} catch (e) {}\n}\n\n/** Proxy an event to hooked event handlers\n *\t@private\n */\nfunction eventProxy(e) {\n\treturn this._listeners[e.type](options.event && options.event(e) || e);\n}\n\n/** Queue of components that have been mounted and are awaiting componentDidMount */\nvar mounts = [];\n\n/** Diff recursion count, used to track the end of the diff cycle. */\nvar diffLevel = 0;\n\n/** Global flag indicating if the diff is currently within an SVG */\nvar isSvgMode = false;\n\n/** Global flag indicating if the diff is performing hydration */\nvar hydrating = false;\n\n/** Invoke queued componentDidMount lifecycle methods */\nfunction flushMounts() {\n\tvar c;\n\twhile (c = mounts.pop()) {\n\t\tif (options.afterMount) options.afterMount(c);\n\t\tif (c.componentDidMount) c.componentDidMount();\n\t}\n}\n\n/** Apply differences in a given vnode (and it's deep children) to a real DOM Node.\n *\t@param {Element} [dom=null]\t\tA DOM node to mutate into the shape of the `vnode`\n *\t@param {VNode} vnode\t\t\tA VNode (with descendants forming a tree) representing the desired DOM structure\n *\t@returns {Element} dom\t\t\tThe created/mutated element\n *\t@private\n */\nfunction diff(dom, vnode, context, mountAll, parent, componentRoot) {\n\t// diffLevel having been 0 here indicates initial entry into the diff (not a subdiff)\n\tif (!diffLevel++) {\n\t\t// when first starting the diff, check if we're diffing an SVG or within an SVG\n\t\tisSvgMode = parent != null && parent.ownerSVGElement !== undefined;\n\n\t\t// hydration is indicated by the existing element to be diffed not having a prop cache\n\t\thydrating = dom != null && !('__preactattr_' in dom);\n\t}\n\n\tvar ret = idiff(dom, vnode, context, mountAll, componentRoot);\n\n\t// append the element if its a new parent\n\tif (parent && ret.parentNode !== parent) parent.appendChild(ret);\n\n\t// diffLevel being reduced to 0 means we're exiting the diff\n\tif (! --diffLevel) {\n\t\thydrating = false;\n\t\t// invoke queued componentDidMount lifecycle methods\n\t\tif (!componentRoot) flushMounts();\n\t}\n\n\treturn ret;\n}\n\n/** Internals of `diff()`, separated to allow bypassing diffLevel / mount flushing. */\nfunction idiff(dom, vnode, context, mountAll, componentRoot) {\n\tvar out = dom,\n\t    prevSvgMode = isSvgMode;\n\n\t// empty values (null, undefined, booleans) render as empty Text nodes\n\tif (vnode == null || typeof vnode === 'boolean') vnode = '';\n\n\t// Fast case: Strings & Numbers create/update Text nodes.\n\tif (typeof vnode === 'string' || typeof vnode === 'number') {\n\n\t\t// update if it's already a Text node:\n\t\tif (dom && dom.splitText !== undefined && dom.parentNode && (!dom._component || componentRoot)) {\n\t\t\t/* istanbul ignore if */ /* Browser quirk that can't be covered: https://github.com/developit/preact/commit/fd4f21f5c45dfd75151bd27b4c217d8003aa5eb9 */\n\t\t\tif (dom.nodeValue != vnode) {\n\t\t\t\tdom.nodeValue = vnode;\n\t\t\t}\n\t\t} else {\n\t\t\t// it wasn't a Text node: replace it with one and recycle the old Element\n\t\t\tout = document.createTextNode(vnode);\n\t\t\tif (dom) {\n\t\t\t\tif (dom.parentNode) dom.parentNode.replaceChild(out, dom);\n\t\t\t\trecollectNodeTree(dom, true);\n\t\t\t}\n\t\t}\n\n\t\tout['__preactattr_'] = true;\n\n\t\treturn out;\n\t}\n\n\t// If the VNode represents a Component, perform a component diff:\n\tvar vnodeName = vnode.nodeName;\n\tif (typeof vnodeName === 'function') {\n\t\treturn buildComponentFromVNode(dom, vnode, context, mountAll);\n\t}\n\n\t// Tracks entering and exiting SVG namespace when descending through the tree.\n\tisSvgMode = vnodeName === 'svg' ? true : vnodeName === 'foreignObject' ? false : isSvgMode;\n\n\t// If there's no existing element or it's the wrong type, create a new one:\n\tvnodeName = String(vnodeName);\n\tif (!dom || !isNamedNode(dom, vnodeName)) {\n\t\tout = createNode(vnodeName, isSvgMode);\n\n\t\tif (dom) {\n\t\t\t// move children into the replacement node\n\t\t\twhile (dom.firstChild) {\n\t\t\t\tout.appendChild(dom.firstChild);\n\t\t\t} // if the previous Element was mounted into the DOM, replace it inline\n\t\t\tif (dom.parentNode) dom.parentNode.replaceChild(out, dom);\n\n\t\t\t// recycle the old element (skips non-Element node types)\n\t\t\trecollectNodeTree(dom, true);\n\t\t}\n\t}\n\n\tvar fc = out.firstChild,\n\t    props = out['__preactattr_'],\n\t    vchildren = vnode.children;\n\n\tif (props == null) {\n\t\tprops = out['__preactattr_'] = {};\n\t\tfor (var a = out.attributes, i = a.length; i--;) {\n\t\t\tprops[a[i].name] = a[i].value;\n\t\t}\n\t}\n\n\t// Optimization: fast-path for elements containing a single TextNode:\n\tif (!hydrating && vchildren && vchildren.length === 1 && typeof vchildren[0] === 'string' && fc != null && fc.splitText !== undefined && fc.nextSibling == null) {\n\t\tif (fc.nodeValue != vchildren[0]) {\n\t\t\tfc.nodeValue = vchildren[0];\n\t\t}\n\t}\n\t// otherwise, if there are existing or new children, diff them:\n\telse if (vchildren && vchildren.length || fc != null) {\n\t\t\tinnerDiffNode(out, vchildren, context, mountAll, hydrating || props.dangerouslySetInnerHTML != null);\n\t\t}\n\n\t// Apply attributes/props from VNode to the DOM Element:\n\tdiffAttributes(out, vnode.attributes, props);\n\n\t// restore previous SVG mode: (in case we're exiting an SVG namespace)\n\tisSvgMode = prevSvgMode;\n\n\treturn out;\n}\n\n/** Apply child and attribute changes between a VNode and a DOM Node to the DOM.\n *\t@param {Element} dom\t\t\tElement whose children should be compared & mutated\n *\t@param {Array} vchildren\t\tArray of VNodes to compare to `dom.childNodes`\n *\t@param {Object} context\t\t\tImplicitly descendant context object (from most recent `getChildContext()`)\n *\t@param {Boolean} mountAll\n *\t@param {Boolean} isHydrating\tIf `true`, consumes externally created elements similar to hydration\n */\nfunction innerDiffNode(dom, vchildren, context, mountAll, isHydrating) {\n\tvar originalChildren = dom.childNodes,\n\t    children = [],\n\t    keyed = {},\n\t    keyedLen = 0,\n\t    min = 0,\n\t    len = originalChildren.length,\n\t    childrenLen = 0,\n\t    vlen = vchildren ? vchildren.length : 0,\n\t    j,\n\t    c,\n\t    f,\n\t    vchild,\n\t    child;\n\n\t// Build up a map of keyed children and an Array of unkeyed children:\n\tif (len !== 0) {\n\t\tfor (var i = 0; i < len; i++) {\n\t\t\tvar _child = originalChildren[i],\n\t\t\t    props = _child['__preactattr_'],\n\t\t\t    key = vlen && props ? _child._component ? _child._component.__key : props.key : null;\n\t\t\tif (key != null) {\n\t\t\t\tkeyedLen++;\n\t\t\t\tkeyed[key] = _child;\n\t\t\t} else if (props || (_child.splitText !== undefined ? isHydrating ? _child.nodeValue.trim() : true : isHydrating)) {\n\t\t\t\tchildren[childrenLen++] = _child;\n\t\t\t}\n\t\t}\n\t}\n\n\tif (vlen !== 0) {\n\t\tfor (var i = 0; i < vlen; i++) {\n\t\t\tvchild = vchildren[i];\n\t\t\tchild = null;\n\n\t\t\t// attempt to find a node based on key matching\n\t\t\tvar key = vchild.key;\n\t\t\tif (key != null) {\n\t\t\t\tif (keyedLen && keyed[key] !== undefined) {\n\t\t\t\t\tchild = keyed[key];\n\t\t\t\t\tkeyed[key] = undefined;\n\t\t\t\t\tkeyedLen--;\n\t\t\t\t}\n\t\t\t}\n\t\t\t// attempt to pluck a node of the same type from the existing children\n\t\t\telse if (!child && min < childrenLen) {\n\t\t\t\t\tfor (j = min; j < childrenLen; j++) {\n\t\t\t\t\t\tif (children[j] !== undefined && isSameNodeType(c = children[j], vchild, isHydrating)) {\n\t\t\t\t\t\t\tchild = c;\n\t\t\t\t\t\t\tchildren[j] = undefined;\n\t\t\t\t\t\t\tif (j === childrenLen - 1) childrenLen--;\n\t\t\t\t\t\t\tif (j === min) min++;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t// morph the matched/found/created DOM child to match vchild (deep)\n\t\t\tchild = idiff(child, vchild, context, mountAll);\n\n\t\t\tf = originalChildren[i];\n\t\t\tif (child && child !== dom && child !== f) {\n\t\t\t\tif (f == null) {\n\t\t\t\t\tdom.appendChild(child);\n\t\t\t\t} else if (child === f.nextSibling) {\n\t\t\t\t\tremoveNode(f);\n\t\t\t\t} else {\n\t\t\t\t\tdom.insertBefore(child, f);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t// remove unused keyed children:\n\tif (keyedLen) {\n\t\tfor (var i in keyed) {\n\t\t\tif (keyed[i] !== undefined) recollectNodeTree(keyed[i], false);\n\t\t}\n\t}\n\n\t// remove orphaned unkeyed children:\n\twhile (min <= childrenLen) {\n\t\tif ((child = children[childrenLen--]) !== undefined) recollectNodeTree(child, false);\n\t}\n}\n\n/** Recursively recycle (or just unmount) a node and its descendants.\n *\t@param {Node} node\t\t\t\t\t\tDOM node to start unmount/removal from\n *\t@param {Boolean} [unmountOnly=false]\tIf `true`, only triggers unmount lifecycle, skips removal\n */\nfunction recollectNodeTree(node, unmountOnly) {\n\tvar component = node._component;\n\tif (component) {\n\t\t// if node is owned by a Component, unmount that component (ends up recursing back here)\n\t\tunmountComponent(component);\n\t} else {\n\t\t// If the node's VNode had a ref function, invoke it with null here.\n\t\t// (this is part of the React spec, and smart for unsetting references)\n\t\tif (node['__preactattr_'] != null && node['__preactattr_'].ref) node['__preactattr_'].ref(null);\n\n\t\tif (unmountOnly === false || node['__preactattr_'] == null) {\n\t\t\tremoveNode(node);\n\t\t}\n\n\t\tremoveChildren(node);\n\t}\n}\n\n/** Recollect/unmount all children.\n *\t- we use .lastChild here because it causes less reflow than .firstChild\n *\t- it's also cheaper than accessing the .childNodes Live NodeList\n */\nfunction removeChildren(node) {\n\tnode = node.lastChild;\n\twhile (node) {\n\t\tvar next = node.previousSibling;\n\t\trecollectNodeTree(node, true);\n\t\tnode = next;\n\t}\n}\n\n/** Apply differences in attributes from a VNode to the given DOM Element.\n *\t@param {Element} dom\t\tElement with attributes to diff `attrs` against\n *\t@param {Object} attrs\t\tThe desired end-state key-value attribute pairs\n *\t@param {Object} old\t\t\tCurrent/previous attributes (from previous VNode or element's prop cache)\n */\nfunction diffAttributes(dom, attrs, old) {\n\tvar name;\n\n\t// remove attributes no longer present on the vnode by setting them to undefined\n\tfor (name in old) {\n\t\tif (!(attrs && attrs[name] != null) && old[name] != null) {\n\t\t\tsetAccessor(dom, name, old[name], old[name] = undefined, isSvgMode);\n\t\t}\n\t}\n\n\t// add new & update changed attributes\n\tfor (name in attrs) {\n\t\tif (name !== 'children' && name !== 'innerHTML' && (!(name in old) || attrs[name] !== (name === 'value' || name === 'checked' ? dom[name] : old[name]))) {\n\t\t\tsetAccessor(dom, name, old[name], old[name] = attrs[name], isSvgMode);\n\t\t}\n\t}\n}\n\n/** Retains a pool of Components for re-use, keyed on component name.\n *\tNote: since component names are not unique or even necessarily available, these are primarily a form of sharding.\n *\t@private\n */\nvar components = {};\n\n/** Reclaim a component for later re-use by the recycler. */\nfunction collectComponent(component) {\n\tvar name = component.constructor.name;\n\t(components[name] || (components[name] = [])).push(component);\n}\n\n/** Create a component. Normalizes differences between PFC's and classful Components. */\nfunction createComponent(Ctor, props, context) {\n\tvar list = components[Ctor.name],\n\t    inst;\n\n\tif (Ctor.prototype && Ctor.prototype.render) {\n\t\tinst = new Ctor(props, context);\n\t\tComponent.call(inst, props, context);\n\t} else {\n\t\tinst = new Component(props, context);\n\t\tinst.constructor = Ctor;\n\t\tinst.render = doRender;\n\t}\n\n\tif (list) {\n\t\tfor (var i = list.length; i--;) {\n\t\t\tif (list[i].constructor === Ctor) {\n\t\t\t\tinst.nextBase = list[i].nextBase;\n\t\t\t\tlist.splice(i, 1);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\treturn inst;\n}\n\n/** The `.render()` method for a PFC backing instance. */\nfunction doRender(props, state, context) {\n\treturn this.constructor(props, context);\n}\n\n/** Set a component's `props` (generally derived from JSX attributes).\n *\t@param {Object} props\n *\t@param {Object} [opts]\n *\t@param {boolean} [opts.renderSync=false]\tIf `true` and {@link options.syncComponentUpdates} is `true`, triggers synchronous rendering.\n *\t@param {boolean} [opts.render=true]\t\t\tIf `false`, no render will be triggered.\n */\nfunction setComponentProps(component, props, opts, context, mountAll) {\n\tif (component._disable) return;\n\tcomponent._disable = true;\n\n\tif (component.__ref = props.ref) delete props.ref;\n\tif (component.__key = props.key) delete props.key;\n\n\tif (!component.base || mountAll) {\n\t\tif (component.componentWillMount) component.componentWillMount();\n\t} else if (component.componentWillReceiveProps) {\n\t\tcomponent.componentWillReceiveProps(props, context);\n\t}\n\n\tif (context && context !== component.context) {\n\t\tif (!component.prevContext) component.prevContext = component.context;\n\t\tcomponent.context = context;\n\t}\n\n\tif (!component.prevProps) component.prevProps = component.props;\n\tcomponent.props = props;\n\n\tcomponent._disable = false;\n\n\tif (opts !== 0) {\n\t\tif (opts === 1 || options.syncComponentUpdates !== false || !component.base) {\n\t\t\trenderComponent(component, 1, mountAll);\n\t\t} else {\n\t\t\tenqueueRender(component);\n\t\t}\n\t}\n\n\tif (component.__ref) component.__ref(component);\n}\n\n/** Render a Component, triggering necessary lifecycle events and taking High-Order Components into account.\n *\t@param {Component} component\n *\t@param {Object} [opts]\n *\t@param {boolean} [opts.build=false]\t\tIf `true`, component will build and store a DOM node if not already associated with one.\n *\t@private\n */\nfunction renderComponent(component, opts, mountAll, isChild) {\n\tif (component._disable) return;\n\n\tvar props = component.props,\n\t    state = component.state,\n\t    context = component.context,\n\t    previousProps = component.prevProps || props,\n\t    previousState = component.prevState || state,\n\t    previousContext = component.prevContext || context,\n\t    isUpdate = component.base,\n\t    nextBase = component.nextBase,\n\t    initialBase = isUpdate || nextBase,\n\t    initialChildComponent = component._component,\n\t    skip = false,\n\t    rendered,\n\t    inst,\n\t    cbase;\n\n\t// if updating\n\tif (isUpdate) {\n\t\tcomponent.props = previousProps;\n\t\tcomponent.state = previousState;\n\t\tcomponent.context = previousContext;\n\t\tif (opts !== 2 && component.shouldComponentUpdate && component.shouldComponentUpdate(props, state, context) === false) {\n\t\t\tskip = true;\n\t\t} else if (component.componentWillUpdate) {\n\t\t\tcomponent.componentWillUpdate(props, state, context);\n\t\t}\n\t\tcomponent.props = props;\n\t\tcomponent.state = state;\n\t\tcomponent.context = context;\n\t}\n\n\tcomponent.prevProps = component.prevState = component.prevContext = component.nextBase = null;\n\tcomponent._dirty = false;\n\n\tif (!skip) {\n\t\trendered = component.render(props, state, context);\n\n\t\t// context to pass to the child, can be updated via (grand-)parent component\n\t\tif (component.getChildContext) {\n\t\t\tcontext = extend(extend({}, context), component.getChildContext());\n\t\t}\n\n\t\tvar childComponent = rendered && rendered.nodeName,\n\t\t    toUnmount,\n\t\t    base;\n\n\t\tif (typeof childComponent === 'function') {\n\t\t\t// set up high order component link\n\n\t\t\tvar childProps = getNodeProps(rendered);\n\t\t\tinst = initialChildComponent;\n\n\t\t\tif (inst && inst.constructor === childComponent && childProps.key == inst.__key) {\n\t\t\t\tsetComponentProps(inst, childProps, 1, context, false);\n\t\t\t} else {\n\t\t\t\ttoUnmount = inst;\n\n\t\t\t\tcomponent._component = inst = createComponent(childComponent, childProps, context);\n\t\t\t\tinst.nextBase = inst.nextBase || nextBase;\n\t\t\t\tinst._parentComponent = component;\n\t\t\t\tsetComponentProps(inst, childProps, 0, context, false);\n\t\t\t\trenderComponent(inst, 1, mountAll, true);\n\t\t\t}\n\n\t\t\tbase = inst.base;\n\t\t} else {\n\t\t\tcbase = initialBase;\n\n\t\t\t// destroy high order component link\n\t\t\ttoUnmount = initialChildComponent;\n\t\t\tif (toUnmount) {\n\t\t\t\tcbase = component._component = null;\n\t\t\t}\n\n\t\t\tif (initialBase || opts === 1) {\n\t\t\t\tif (cbase) cbase._component = null;\n\t\t\t\tbase = diff(cbase, rendered, context, mountAll || !isUpdate, initialBase && initialBase.parentNode, true);\n\t\t\t}\n\t\t}\n\n\t\tif (initialBase && base !== initialBase && inst !== initialChildComponent) {\n\t\t\tvar baseParent = initialBase.parentNode;\n\t\t\tif (baseParent && base !== baseParent) {\n\t\t\t\tbaseParent.replaceChild(base, initialBase);\n\n\t\t\t\tif (!toUnmount) {\n\t\t\t\t\tinitialBase._component = null;\n\t\t\t\t\trecollectNodeTree(initialBase, false);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif (toUnmount) {\n\t\t\tunmountComponent(toUnmount);\n\t\t}\n\n\t\tcomponent.base = base;\n\t\tif (base && !isChild) {\n\t\t\tvar componentRef = component,\n\t\t\t    t = component;\n\t\t\twhile (t = t._parentComponent) {\n\t\t\t\t(componentRef = t).base = base;\n\t\t\t}\n\t\t\tbase._component = componentRef;\n\t\t\tbase._componentConstructor = componentRef.constructor;\n\t\t}\n\t}\n\n\tif (!isUpdate || mountAll) {\n\t\tmounts.unshift(component);\n\t} else if (!skip) {\n\t\t// Ensure that pending componentDidMount() hooks of child components\n\t\t// are called before the componentDidUpdate() hook in the parent.\n\t\t// Note: disabled as it causes duplicate hooks, see https://github.com/developit/preact/issues/750\n\t\t// flushMounts();\n\n\t\tif (component.componentDidUpdate) {\n\t\t\tcomponent.componentDidUpdate(previousProps, previousState, previousContext);\n\t\t}\n\t\tif (options.afterUpdate) options.afterUpdate(component);\n\t}\n\n\tif (component._renderCallbacks != null) {\n\t\twhile (component._renderCallbacks.length) {\n\t\t\tcomponent._renderCallbacks.pop().call(component);\n\t\t}\n\t}\n\n\tif (!diffLevel && !isChild) flushMounts();\n}\n\n/** Apply the Component referenced by a VNode to the DOM.\n *\t@param {Element} dom\tThe DOM node to mutate\n *\t@param {VNode} vnode\tA Component-referencing VNode\n *\t@returns {Element} dom\tThe created/mutated element\n *\t@private\n */\nfunction buildComponentFromVNode(dom, vnode, context, mountAll) {\n\tvar c = dom && dom._component,\n\t    originalComponent = c,\n\t    oldDom = dom,\n\t    isDirectOwner = c && dom._componentConstructor === vnode.nodeName,\n\t    isOwner = isDirectOwner,\n\t    props = getNodeProps(vnode);\n\twhile (c && !isOwner && (c = c._parentComponent)) {\n\t\tisOwner = c.constructor === vnode.nodeName;\n\t}\n\n\tif (c && isOwner && (!mountAll || c._component)) {\n\t\tsetComponentProps(c, props, 3, context, mountAll);\n\t\tdom = c.base;\n\t} else {\n\t\tif (originalComponent && !isDirectOwner) {\n\t\t\tunmountComponent(originalComponent);\n\t\t\tdom = oldDom = null;\n\t\t}\n\n\t\tc = createComponent(vnode.nodeName, props, context);\n\t\tif (dom && !c.nextBase) {\n\t\t\tc.nextBase = dom;\n\t\t\t// passing dom/oldDom as nextBase will recycle it if unused, so bypass recycling on L229:\n\t\t\toldDom = null;\n\t\t}\n\t\tsetComponentProps(c, props, 1, context, mountAll);\n\t\tdom = c.base;\n\n\t\tif (oldDom && dom !== oldDom) {\n\t\t\toldDom._component = null;\n\t\t\trecollectNodeTree(oldDom, false);\n\t\t}\n\t}\n\n\treturn dom;\n}\n\n/** Remove a component from the DOM and recycle it.\n *\t@param {Component} component\tThe Component instance to unmount\n *\t@private\n */\nfunction unmountComponent(component) {\n\tif (options.beforeUnmount) options.beforeUnmount(component);\n\n\tvar base = component.base;\n\n\tcomponent._disable = true;\n\n\tif (component.componentWillUnmount) component.componentWillUnmount();\n\n\tcomponent.base = null;\n\n\t// recursively tear down & recollect high-order component children:\n\tvar inner = component._component;\n\tif (inner) {\n\t\tunmountComponent(inner);\n\t} else if (base) {\n\t\tif (base['__preactattr_'] && base['__preactattr_'].ref) base['__preactattr_'].ref(null);\n\n\t\tcomponent.nextBase = base;\n\n\t\tremoveNode(base);\n\t\tcollectComponent(component);\n\n\t\tremoveChildren(base);\n\t}\n\n\tif (component.__ref) component.__ref(null);\n}\n\n/** Base Component class.\n *\tProvides `setState()` and `forceUpdate()`, which trigger rendering.\n *\t@public\n *\n *\t@example\n *\tclass MyFoo extends Component {\n *\t\trender(props, state) {\n *\t\t\treturn <div />;\n *\t\t}\n *\t}\n */\nfunction Component(props, context) {\n\tthis._dirty = true;\n\n\t/** @public\n  *\t@type {object}\n  */\n\tthis.context = context;\n\n\t/** @public\n  *\t@type {object}\n  */\n\tthis.props = props;\n\n\t/** @public\n  *\t@type {object}\n  */\n\tthis.state = this.state || {};\n}\n\nextend(Component.prototype, {\n\n\t/** Returns a `boolean` indicating if the component should re-render when receiving the given `props` and `state`.\n  *\t@param {object} nextProps\n  *\t@param {object} nextState\n  *\t@param {object} nextContext\n  *\t@returns {Boolean} should the component re-render\n  *\t@name shouldComponentUpdate\n  *\t@function\n  */\n\n\t/** Update component state by copying properties from `state` to `this.state`.\n  *\t@param {object} state\t\tA hash of state properties to update with new values\n  *\t@param {function} callback\tA function to be called once component state is updated\n  */\n\tsetState: function setState(state, callback) {\n\t\tvar s = this.state;\n\t\tif (!this.prevState) this.prevState = extend({}, s);\n\t\textend(s, typeof state === 'function' ? state(s, this.props) : state);\n\t\tif (callback) (this._renderCallbacks = this._renderCallbacks || []).push(callback);\n\t\tenqueueRender(this);\n\t},\n\n\n\t/** Immediately perform a synchronous re-render of the component.\n  *\t@param {function} callback\t\tA function to be called after component is re-rendered.\n  *\t@private\n  */\n\tforceUpdate: function forceUpdate(callback) {\n\t\tif (callback) (this._renderCallbacks = this._renderCallbacks || []).push(callback);\n\t\trenderComponent(this, 2);\n\t},\n\n\n\t/** Accepts `props` and `state`, and returns a new Virtual DOM tree to build.\n  *\tVirtual DOM is generally constructed via [JSX](http://jasonformat.com/wtf-is-jsx).\n  *\t@param {object} props\t\tProps (eg: JSX attributes) received from parent element/component\n  *\t@param {object} state\t\tThe component's current state\n  *\t@param {object} context\t\tContext object (if a parent component has provided context)\n  *\t@returns VNode\n  */\n\trender: function render() {}\n});\n\n/** Render JSX into a `parent` Element.\n *\t@param {VNode} vnode\t\tA (JSX) VNode to render\n *\t@param {Element} parent\t\tDOM element to render into\n *\t@param {Element} [merge]\tAttempt to re-use an existing DOM tree rooted at `merge`\n *\t@public\n *\n *\t@example\n *\t// render a div into <body>:\n *\trender(<div id=\"hello\">hello!</div>, document.body);\n *\n *\t@example\n *\t// render a \"Thing\" component into #foo:\n *\tconst Thing = ({ name }) => <span>{ name }</span>;\n *\trender(<Thing name=\"one\" />, document.querySelector('#foo'));\n */\nfunction render(vnode, parent, merge) {\n  return diff(merge, vnode, {}, false, parent, false);\n}\n\nvar preact = {\n\th: h,\n\tcreateElement: h,\n\tcloneElement: cloneElement,\n\tComponent: Component,\n\trender: render,\n\trerender: rerender,\n\toptions: options\n};\n\nexport { h, h as createElement, cloneElement, Component, render, rerender, options };export default preact;\n//# sourceMappingURL=preact.esm.js.map\n","function dlv(obj, key, def, p) {\n\tp = 0;\n\tkey = key.split ? key.split('.') : key;\n\twhile (obj && p<key.length) { obj = obj[key[p++]]; }\n\treturn obj===undefined ? def : obj;\n}\n\n/** Create an Event handler function that sets a given state property.\n *\t@param {Component} component\tThe component whose state should be updated\n *\t@param {string} key\t\t\t\tA dot-notated key path to update in the component's state\n *\t@param {string} eventPath\t\tA dot-notated key path to the value that should be retrieved from the Event or component\n *\t@returns {function} linkedStateHandler\n */\nfunction linkState(component, key, eventPath) {\n\tvar path = key.split('.');\n\treturn function(e) {\n\t\tvar t = e && e.target || this,\n\t\t\tstate = {},\n\t\t\tobj = state,\n\t\t\tv = typeof eventPath==='string' ? dlv(e, eventPath) : t.nodeName ? (t.type.match(/^che|rad/) ? t.checked : t.value) : e,\n\t\t\ti = 0;\n\t\tfor ( ; i<path.length-1; i++) {\n\t\t\tobj = obj[path[i]] || (obj[path[i]] = !i && component.state[path[i]] || {});\n\t\t}\n\t\tobj[path[i]] = v;\n\t\tcomponent.setState(state);\n\t};\n}\n\nexport default linkState;\n//# sourceMappingURL=linkstate.es.js.map\n","export function uuid() {\n    let uuid = '';\n    for (let i = 0; i < 32; i++) {\n        let random = Math.random() * 16 | 0;\n        if (i === 8 || i === 12 || i === 16 || i === 20) {\n            uuid += '-';\n        }\n        uuid += (i === 12 ? 4 : (i === 16 ? (random & 3 | 8) : random)).toString(16);\n    }\n    return uuid;\n}\n\nexport function pluralize(count, word) {\n    return count === 1 ? word : word + 's';\n}\n\nexport function store(namespace, data) {\n    // if (data) return localStorage[namespace] = JSON.stringify(data);\n\n    // let store = localStorage[namespace];\n    // return store && JSON.parse(store) || [];\n    return [];\n}\n","import { uuid, store } from './util';\n\nexport default class TodoModel {\n    constructor(key, sub) {\n        this.key = key;\n        this.todos = store(key) || [];\n        this.onChanges = [sub];\n    }\n\n    inform() {\n        store(this.key, this.todos);\n        this.onChanges.forEach( cb => cb() );\n    }\n\n    addTodo(title) {\n        this.todos = this.todos.concat({\n            id: uuid(),\n            title,\n            completed: false\n        });\n        this.inform();\n    }\n\n    toggleAll(completed) {\n        this.todos = this.todos.map(\n            todo => ({ ...todo, completed })\n        );\n        this.inform();\n    }\n\n    toggle(todoToToggle) {\n        this.todos = this.todos.map( todo => (\n            todo !== todoToToggle ? todo : ({ ...todo, completed: !todo.completed })\n        ) );\n        this.inform();\n    }\n\n    destroy(todo) {\n        this.todos = this.todos.filter( t => t !== todo );\n        this.inform();\n    }\n\n    save(todoToSave, title) {\n        this.todos = this.todos.map( todo => (\n            todo !== todoToSave ? todo : ({ ...todo, title })\n        ));\n        this.inform();\n    }\n\n    clearCompleted() {\n        this.todos = this.todos.filter( todo => !todo.completed );\n        this.inform();\n    }\n}\n","/*!\n  Copyright (c) 2016 Jed Watson.\n  Licensed under the MIT License (MIT), see\n  http://jedwatson.github.io/classnames\n*/\n/* global define */\n\n(function () {\n\t'use strict';\n\n\tvar hasOwn = {}.hasOwnProperty;\n\n\tfunction classNames () {\n\t\tvar classes = [];\n\n\t\tfor (var i = 0; i < arguments.length; i++) {\n\t\t\tvar arg = arguments[i];\n\t\t\tif (!arg) continue;\n\n\t\t\tvar argType = typeof arg;\n\n\t\t\tif (argType === 'string' || argType === 'number') {\n\t\t\t\tclasses.push(arg);\n\t\t\t} else if (Array.isArray(arg)) {\n\t\t\t\tclasses.push(classNames.apply(null, arg));\n\t\t\t} else if (argType === 'object') {\n\t\t\t\tfor (var key in arg) {\n\t\t\t\t\tif (hasOwn.call(arg, key) && arg[key]) {\n\t\t\t\t\t\tclasses.push(key);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn classes.join(' ');\n\t}\n\n\tif (typeof module !== 'undefined' && module.exports) {\n\t\tmodule.exports = classNames;\n\t} else if (typeof define === 'function' && typeof define.amd === 'object' && define.amd) {\n\t\t// register as 'classnames', consistent with npm package name\n\t\tdefine('classnames', [], function () {\n\t\t\treturn classNames;\n\t\t});\n\t} else {\n\t\twindow.classNames = classNames;\n\t}\n}());\n","import cx from 'classnames';\nimport { h, Component } from 'preact';\nimport { pluralize } from './util';\n\nexport default class TodoFooter extends Component {\n    render({ nowShowing, count, completedCount, onClearCompleted }) {\n        return (\n            <footer class=\"footer\">\n                <span class=\"todo-count\">\n                    <strong>{count}</strong> {pluralize(count, 'item')} left\n                </span>\n                <ul class=\"filters\">\n                    <li>\n                        <a href=\"#/\" class={cx({ selected: nowShowing == 'all' })}>All</a>\n                    </li>\n                    {' '}\n                    <li>\n                        <a href=\"#/active\" class={cx({ selected: nowShowing == 'active' })}>Active</a>\n                    </li>\n                    {' '}\n                    <li>\n                        <a href=\"#/completed\" class={cx({ selected: nowShowing == 'completed' })}>Completed</a>\n                    </li>\n                </ul>\n                { completedCount > 0 && (\n                    <button class=\"clear-completed\" onClick={onClearCompleted}>\n                        Clear completed\n                    </button>\n                ) }\n            </footer>\n        );\n    }\n}\n","import cx from 'classnames';\nimport { h, Component } from 'preact';\n\nconst ESCAPE_KEY = 27;\nconst ENTER_KEY = 13;\n\nexport default class TodoItem extends Component {\n    handleSubmit = () => {\n        let { onSave, onDestroy, todo } = this.props,\n            val = this.state.editText.trim();\n        if (val) {\n            onSave(todo, val);\n            this.setState({ editText: val });\n        }\n        else {\n            onDestroy(todo);\n        }\n    };\n\n    handleEdit = () => {\n        let { onEdit, todo } = this.props;\n        onEdit(todo);\n        this.setState({ editText: todo.title });\n    };\n\n    toggle = e => {\n        let { onToggle, todo } = this.props;\n        onToggle(todo);\n        e.preventDefault();\n    };\n\n    handleKeyDown = e => {\n        if (e.which===ESCAPE_KEY) {\n            let { todo } = this.props;\n            this.setState({ editText: todo.title });\n            this.props.onCancel(todo);\n        }\n        else if (e.which===ENTER_KEY) {\n            this.handleSubmit();\n        }\n    };\n\n    handleDestroy = () => {\n        this.props.onDestroy(this.props.todo);\n    };\n\n    // shouldComponentUpdate({ todo, editing, editText }) {\n    //  return (\n    //      todo !== this.props.todo ||\n    //      editing !== this.props.editing ||\n    //      editText !== this.state.editText\n    //  );\n    // }\n\n    componentDidUpdate() {\n        let node = this.base && this.base.querySelector('.edit');\n        if (node) node.focus();\n    }\n\n    render({ todo:{ title, completed }, onToggle, onDestroy, editing }, { editText }) {\n        return (\n            <li class={cx({ completed, editing })}>\n                <div class=\"view\">\n                    <input\n                        class=\"toggle\"\n                        type=\"checkbox\"\n                        checked={completed}\n                        onChange={this.toggle}\n                    />\n                    <label onDblClick={this.handleEdit}>{title}</label>\n                    <button class=\"destroy\" onClick={this.handleDestroy} />\n                </div>\n                { editing && (\n                    <input\n                        class=\"edit\"\n                        value={editText}\n                        onBlur={this.handleSubmit}\n                        onInput={this.linkState('editText')}\n                        onKeyDown={this.handleKeyDown}\n                    />\n                ) }\n            </li>\n        );\n    }\n}\n","import { h, Component } from 'preact';\nimport linkState from 'linkstate';\n\nimport TodoModel from './model';\nimport TodoFooter from './footer';\nimport TodoItem from './item';\n\nconst ENTER_KEY = 13;\n\nconst FILTERS = {\n    all: todo => true,\n    active: todo => !todo.completed,\n    completed: todo => todo.completed\n};\n\nexport default class App extends Component {\n    constructor() {\n        super();\n        this.model = new TodoModel('preact-todos', () => this.setState({}) );\n        addEventListener('hashchange', this.handleRoute.bind(this));\n        this.handleRoute();\n    }\n\n    handleRoute() {\n        let nowShowing = String(location.hash || '').split('/').pop();\n        if (!FILTERS[nowShowing]) {\n            nowShowing = 'all';\n        }\n        this.setState({ nowShowing });\n    }\n\n    handleNewTodoKeyDown = (e) => {\n        if (e.keyCode !== ENTER_KEY) return;\n        e.preventDefault();\n\n        // let val = '';\n        // if (this.state.newTodo === undefined) {\n        //  val = e.target.value.trim();\n        // }\n\n        let val = e.target.value.trim();\n\n        if (val) {\n            this.model.addTodo(val);\n            this.setState({ newTodo: '' });\n        }\n    };\n\n    toggleAll = event => {\n        let checked = event.target.checked;\n        this.model.toggleAll(checked);\n    };\n\n    toggle = todo => {\n        this.model.toggle(todo);\n    };\n\n    destroy = todo => {\n        this.model.destroy(todo);\n    };\n\n    edit = todo => {\n        this.setState({ editing: todo.id });\n    };\n\n    save = (todoToSave, text) => {\n        this.model.save(todoToSave, text);\n        this.setState({ editing: null });\n    };\n\n    cancel = () => {\n        this.setState({ editing: null });\n    };\n\n    clearCompleted = () => {\n        this.model.clearCompleted();\n    };\n\n    render({ }, { nowShowing = ALL_TODOS, newTodo, editing }) {\n        let { todos } = this.model,\n            shownTodos = todos.filter( FILTERS[nowShowing] ),\n            activeTodoCount = todos.reduce( (a, todo) => a + (todo.completed ? 0 : 1), 0),\n            completedCount = todos.length - activeTodoCount;\n\n        return (\n            <div>\n                <header class=\"header\">\n                    <h1>todos</h1>\n                    <input\n                        class=\"new-todo\"\n                        placeholder=\"What needs to be done?\"\n                        value={newTodo}\n                        onKeyDown={this.handleNewTodoKeyDown}\n                        onInput={linkState(this, 'newTodo')}\n                        autoFocus={true}\n                    />\n                </header>\n\n                { todos.length ? (\n                    <section class=\"main\">\n                        <input\n                            class=\"toggle-all\"\n                            type=\"checkbox\"\n                            onChange={this.toggleAll}\n                            checked={activeTodoCount === 0}\n                        />\n                        <ul class=\"todo-list\">\n                            { shownTodos.map( todo => (\n                                <TodoItem\n                                    todo={todo}\n                                    onToggle={this.toggle}\n                                    onDestroy={this.destroy}\n                                    onEdit={this.edit}\n                                    editing={editing === todo.id}\n                                    onSave={this.save}\n                                    onCancel={this.cancel}\n                                />\n                            )) }\n                        </ul>\n                    </section>\n                ) : null }\n\n                { (activeTodoCount || completedCount) ? (\n                    <TodoFooter\n                        count={activeTodoCount}\n                        completedCount={completedCount}\n                        nowShowing={nowShowing}\n                        onClearCompleted={this.clearCompleted}\n                    />\n                ) : null }\n            </div>\n        );\n    }\n}\n","import { h, render } from 'preact';\nimport App from './app';\n// import 'todomvc-common';\n// import 'todomvc-common/base.css';\n// import 'todomvc-app-css/index.css';\nrender(<App />, document.querySelector('.todoapp'));\n"]}