mirror of
				https://github.com/flynx/ImageGrid.git
				synced 2025-10-30 10:50:08 +00:00 
			
		
		
		
	
		
			
	
	
		
			1668 lines
		
	
	
		
			45 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
		
		
			
		
	
	
			1668 lines
		
	
	
		
			45 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
|  | !function(e){if("object"==typeof exports&&"undefined"!=typeof module)module.exports=e();else if("function"==typeof define&&define.amd)define([],e);else{var f;"undefined"!=typeof window?f=window:"undefined"!=typeof global?f=global:"undefined"!=typeof self&&(f=self),f.virtualDom=e()}}(function(){var define,module,exports;return (function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o<r.length;o++)s(r[o]);return s})({1:[function(require,module,exports){ | ||
|  | var createElement = require("./vdom/create-element.js") | ||
|  | 
 | ||
|  | module.exports = createElement | ||
|  | 
 | ||
|  | },{"./vdom/create-element.js":15}],2:[function(require,module,exports){ | ||
|  | var diff = require("./vtree/diff.js") | ||
|  | 
 | ||
|  | module.exports = diff | ||
|  | 
 | ||
|  | },{"./vtree/diff.js":35}],3:[function(require,module,exports){ | ||
|  | var h = require("./virtual-hyperscript/index.js") | ||
|  | 
 | ||
|  | module.exports = h | ||
|  | 
 | ||
|  | },{"./virtual-hyperscript/index.js":22}],4:[function(require,module,exports){ | ||
|  | var diff = require("./diff.js") | ||
|  | var patch = require("./patch.js") | ||
|  | var h = require("./h.js") | ||
|  | var create = require("./create-element.js") | ||
|  | var VNode = require('./vnode/vnode.js') | ||
|  | var VText = require('./vnode/vtext.js') | ||
|  | 
 | ||
|  | module.exports = { | ||
|  |     diff: diff, | ||
|  |     patch: patch, | ||
|  |     h: h, | ||
|  |     create: create, | ||
|  |     VNode: VNode, | ||
|  |     VText: VText | ||
|  | } | ||
|  | 
 | ||
|  | },{"./create-element.js":1,"./diff.js":2,"./h.js":3,"./patch.js":13,"./vnode/vnode.js":31,"./vnode/vtext.js":33}],5:[function(require,module,exports){ | ||
|  | /*! | ||
|  |  * Cross-Browser Split 1.1.1 | ||
|  |  * Copyright 2007-2012 Steven Levithan <stevenlevithan.com> | ||
|  |  * Available under the MIT License | ||
|  |  * ECMAScript compliant, uniform cross-browser split method | ||
|  |  */ | ||
|  | 
 | ||
|  | /** | ||
|  |  * Splits a string into an array of strings using a regex or string separator. Matches of the | ||
|  |  * separator are not included in the result array. However, if `separator` is a regex that contains | ||
|  |  * capturing groups, backreferences are spliced into the result each time `separator` is matched. | ||
|  |  * Fixes browser bugs compared to the native `String.prototype.split` and can be used reliably | ||
|  |  * cross-browser. | ||
|  |  * @param {String} str String to split. | ||
|  |  * @param {RegExp|String} separator Regex or string to use for separating the string. | ||
|  |  * @param {Number} [limit] Maximum number of items to include in the result array. | ||
|  |  * @returns {Array} Array of substrings. | ||
|  |  * @example | ||
|  |  * | ||
|  |  * // Basic use
 | ||
|  |  * split('a b c d', ' '); | ||
|  |  * // -> ['a', 'b', 'c', 'd']
 | ||
|  |  * | ||
|  |  * // With limit
 | ||
|  |  * split('a b c d', ' ', 2); | ||
|  |  * // -> ['a', 'b']
 | ||
|  |  * | ||
|  |  * // Backreferences in result array
 | ||
|  |  * split('..word1 word2..', /([a-z]+)(\d+)/i); | ||
|  |  * // -> ['..', 'word', '1', ' ', 'word', '2', '..']
 | ||
|  |  */ | ||
|  | module.exports = (function split(undef) { | ||
|  | 
 | ||
|  |   var nativeSplit = String.prototype.split, | ||
|  |     compliantExecNpcg = /()??/.exec("")[1] === undef, | ||
|  |     // NPCG: nonparticipating capturing group
 | ||
|  |     self; | ||
|  | 
 | ||
|  |   self = function(str, separator, limit) { | ||
|  |     // If `separator` is not a regex, use `nativeSplit`
 | ||
|  |     if (Object.prototype.toString.call(separator) !== "[object RegExp]") { | ||
|  |       return nativeSplit.call(str, separator, limit); | ||
|  |     } | ||
|  |     var output = [], | ||
|  |       flags = (separator.ignoreCase ? "i" : "") + (separator.multiline ? "m" : "") + (separator.extended ? "x" : "") + // Proposed for ES6
 | ||
|  |       (separator.sticky ? "y" : ""), | ||
|  |       // Firefox 3+
 | ||
|  |       lastLastIndex = 0, | ||
|  |       // Make `global` and avoid `lastIndex` issues by working with a copy
 | ||
|  |       separator = new RegExp(separator.source, flags + "g"), | ||
|  |       separator2, match, lastIndex, lastLength; | ||
|  |     str += ""; // Type-convert
 | ||
|  |     if (!compliantExecNpcg) { | ||
|  |       // Doesn't need flags gy, but they don't hurt
 | ||
|  |       separator2 = new RegExp("^" + separator.source + "$(?!\\s)", flags); | ||
|  |     } | ||
|  |     /* Values for `limit`, per the spec: | ||
|  |      * If undefined: 4294967295 // Math.pow(2, 32) - 1
 | ||
|  |      * If 0, Infinity, or NaN: 0 | ||
|  |      * If positive number: limit = Math.floor(limit); if (limit > 4294967295) limit -= 4294967296; | ||
|  |      * If negative number: 4294967296 - Math.floor(Math.abs(limit)) | ||
|  |      * If other: Type-convert, then use the above rules | ||
|  |      */ | ||
|  |     limit = limit === undef ? -1 >>> 0 : // Math.pow(2, 32) - 1
 | ||
|  |     limit >>> 0; // ToUint32(limit)
 | ||
|  |     while (match = separator.exec(str)) { | ||
|  |       // `separator.lastIndex` is not reliable cross-browser
 | ||
|  |       lastIndex = match.index + match[0].length; | ||
|  |       if (lastIndex > lastLastIndex) { | ||
|  |         output.push(str.slice(lastLastIndex, match.index)); | ||
|  |         // Fix browsers whose `exec` methods don't consistently return `undefined` for
 | ||
|  |         // nonparticipating capturing groups
 | ||
|  |         if (!compliantExecNpcg && match.length > 1) { | ||
|  |           match[0].replace(separator2, function() { | ||
|  |             for (var i = 1; i < arguments.length - 2; i++) { | ||
|  |               if (arguments[i] === undef) { | ||
|  |                 match[i] = undef; | ||
|  |               } | ||
|  |             } | ||
|  |           }); | ||
|  |         } | ||
|  |         if (match.length > 1 && match.index < str.length) { | ||
|  |           Array.prototype.push.apply(output, match.slice(1)); | ||
|  |         } | ||
|  |         lastLength = match[0].length; | ||
|  |         lastLastIndex = lastIndex; | ||
|  |         if (output.length >= limit) { | ||
|  |           break; | ||
|  |         } | ||
|  |       } | ||
|  |       if (separator.lastIndex === match.index) { | ||
|  |         separator.lastIndex++; // Avoid an infinite loop
 | ||
|  |       } | ||
|  |     } | ||
|  |     if (lastLastIndex === str.length) { | ||
|  |       if (lastLength || !separator.test("")) { | ||
|  |         output.push(""); | ||
|  |       } | ||
|  |     } else { | ||
|  |       output.push(str.slice(lastLastIndex)); | ||
|  |     } | ||
|  |     return output.length > limit ? output.slice(0, limit) : output; | ||
|  |   }; | ||
|  | 
 | ||
|  |   return self; | ||
|  | })(); | ||
|  | 
 | ||
|  | },{}],6:[function(require,module,exports){ | ||
|  | 
 | ||
|  | },{}],7:[function(require,module,exports){ | ||
|  | 'use strict'; | ||
|  | 
 | ||
|  | var OneVersionConstraint = require('individual/one-version'); | ||
|  | 
 | ||
|  | var MY_VERSION = '7'; | ||
|  | OneVersionConstraint('ev-store', MY_VERSION); | ||
|  | 
 | ||
|  | var hashKey = '__EV_STORE_KEY@' + MY_VERSION; | ||
|  | 
 | ||
|  | module.exports = EvStore; | ||
|  | 
 | ||
|  | function EvStore(elem) { | ||
|  |     var hash = elem[hashKey]; | ||
|  | 
 | ||
|  |     if (!hash) { | ||
|  |         hash = elem[hashKey] = {}; | ||
|  |     } | ||
|  | 
 | ||
|  |     return hash; | ||
|  | } | ||
|  | 
 | ||
|  | },{"individual/one-version":9}],8:[function(require,module,exports){ | ||
|  | (function (global){ | ||
|  | 'use strict'; | ||
|  | 
 | ||
|  | /*global window, global*/ | ||
|  | 
 | ||
|  | var root = typeof window !== 'undefined' ? | ||
|  |     window : typeof global !== 'undefined' ? | ||
|  |     global : {}; | ||
|  | 
 | ||
|  | module.exports = Individual; | ||
|  | 
 | ||
|  | function Individual(key, value) { | ||
|  |     if (key in root) { | ||
|  |         return root[key]; | ||
|  |     } | ||
|  | 
 | ||
|  |     root[key] = value; | ||
|  | 
 | ||
|  |     return value; | ||
|  | } | ||
|  | 
 | ||
|  | }).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) | ||
|  | },{}],9:[function(require,module,exports){ | ||
|  | 'use strict'; | ||
|  | 
 | ||
|  | var Individual = require('./index.js'); | ||
|  | 
 | ||
|  | module.exports = OneVersion; | ||
|  | 
 | ||
|  | function OneVersion(moduleName, version, defaultValue) { | ||
|  |     var key = '__INDIVIDUAL_ONE_VERSION_' + moduleName; | ||
|  |     var enforceKey = key + '_ENFORCE_SINGLETON'; | ||
|  | 
 | ||
|  |     var versionValue = Individual(enforceKey, version); | ||
|  | 
 | ||
|  |     if (versionValue !== version) { | ||
|  |         throw new Error('Can only have one copy of ' + | ||
|  |             moduleName + '.\n' + | ||
|  |             'You already have version ' + versionValue + | ||
|  |             ' installed.\n' + | ||
|  |             'This means you cannot install version ' + version); | ||
|  |     } | ||
|  | 
 | ||
|  |     return Individual(key, defaultValue); | ||
|  | } | ||
|  | 
 | ||
|  | },{"./index.js":8}],10:[function(require,module,exports){ | ||
|  | (function (global){ | ||
|  | var topLevel = typeof global !== 'undefined' ? global : | ||
|  |     typeof window !== 'undefined' ? window : {} | ||
|  | var minDoc = require('min-document'); | ||
|  | 
 | ||
|  | if (typeof document !== 'undefined') { | ||
|  |     module.exports = document; | ||
|  | } else { | ||
|  |     var doccy = topLevel['__GLOBAL_DOCUMENT_CACHE@4']; | ||
|  | 
 | ||
|  |     if (!doccy) { | ||
|  |         doccy = topLevel['__GLOBAL_DOCUMENT_CACHE@4'] = minDoc; | ||
|  |     } | ||
|  | 
 | ||
|  |     module.exports = doccy; | ||
|  | } | ||
|  | 
 | ||
|  | }).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) | ||
|  | },{"min-document":6}],11:[function(require,module,exports){ | ||
|  | "use strict"; | ||
|  | 
 | ||
|  | module.exports = function isObject(x) { | ||
|  | 	return typeof x === "object" && x !== null; | ||
|  | }; | ||
|  | 
 | ||
|  | },{}],12:[function(require,module,exports){ | ||
|  | var nativeIsArray = Array.isArray | ||
|  | var toString = Object.prototype.toString | ||
|  | 
 | ||
|  | module.exports = nativeIsArray || isArray | ||
|  | 
 | ||
|  | function isArray(obj) { | ||
|  |     return toString.call(obj) === "[object Array]" | ||
|  | } | ||
|  | 
 | ||
|  | },{}],13:[function(require,module,exports){ | ||
|  | var patch = require("./vdom/patch.js") | ||
|  | 
 | ||
|  | module.exports = patch | ||
|  | 
 | ||
|  | },{"./vdom/patch.js":18}],14:[function(require,module,exports){ | ||
|  | var isObject = require("is-object") | ||
|  | var isHook = require("../vnode/is-vhook.js") | ||
|  | 
 | ||
|  | module.exports = applyProperties | ||
|  | 
 | ||
|  | function applyProperties(node, props, previous) { | ||
|  |     for (var propName in props) { | ||
|  |         var propValue = props[propName] | ||
|  | 
 | ||
|  |         if (propValue === undefined) { | ||
|  |             removeProperty(node, propName, propValue, previous); | ||
|  |         } else if (isHook(propValue)) { | ||
|  |             removeProperty(node, propName, propValue, previous) | ||
|  |             if (propValue.hook) { | ||
|  |                 propValue.hook(node, | ||
|  |                     propName, | ||
|  |                     previous ? previous[propName] : undefined) | ||
|  |             } | ||
|  |         } else { | ||
|  |             if (isObject(propValue)) { | ||
|  |                 patchObject(node, props, previous, propName, propValue); | ||
|  |             } else { | ||
|  |                 node[propName] = propValue | ||
|  |             } | ||
|  |         } | ||
|  |     } | ||
|  | } | ||
|  | 
 | ||
|  | function removeProperty(node, propName, propValue, previous) { | ||
|  |     if (previous) { | ||
|  |         var previousValue = previous[propName] | ||
|  | 
 | ||
|  |         if (!isHook(previousValue)) { | ||
|  |             if (propName === "attributes") { | ||
|  |                 for (var attrName in previousValue) { | ||
|  |                     node.removeAttribute(attrName) | ||
|  |                 } | ||
|  |             } else if (propName === "style") { | ||
|  |                 for (var i in previousValue) { | ||
|  |                     node.style[i] = "" | ||
|  |                 } | ||
|  |             } else if (typeof previousValue === "string") { | ||
|  |                 node[propName] = "" | ||
|  |             } else { | ||
|  |                 node[propName] = null | ||
|  |             } | ||
|  |         } else if (previousValue.unhook) { | ||
|  |             previousValue.unhook(node, propName, propValue) | ||
|  |         } | ||
|  |     } | ||
|  | } | ||
|  | 
 | ||
|  | function patchObject(node, props, previous, propName, propValue) { | ||
|  |     var previousValue = previous ? previous[propName] : undefined | ||
|  | 
 | ||
|  |     // Set attributes
 | ||
|  |     if (propName === "attributes") { | ||
|  |         for (var attrName in propValue) { | ||
|  |             var attrValue = propValue[attrName] | ||
|  | 
 | ||
|  |             if (attrValue === undefined) { | ||
|  |                 node.removeAttribute(attrName) | ||
|  |             } else { | ||
|  |                 node.setAttribute(attrName, attrValue) | ||
|  |             } | ||
|  |         } | ||
|  | 
 | ||
|  |         return | ||
|  |     } | ||
|  | 
 | ||
|  |     if(previousValue && isObject(previousValue) && | ||
|  |         getPrototype(previousValue) !== getPrototype(propValue)) { | ||
|  |         node[propName] = propValue | ||
|  |         return | ||
|  |     } | ||
|  | 
 | ||
|  |     if (!isObject(node[propName])) { | ||
|  |         node[propName] = {} | ||
|  |     } | ||
|  | 
 | ||
|  |     var replacer = propName === "style" ? "" : undefined | ||
|  | 
 | ||
|  |     for (var k in propValue) { | ||
|  |         var value = propValue[k] | ||
|  |         node[propName][k] = (value === undefined) ? replacer : value | ||
|  |     } | ||
|  | } | ||
|  | 
 | ||
|  | function getPrototype(value) { | ||
|  |     if (Object.getPrototypeOf) { | ||
|  |         return Object.getPrototypeOf(value) | ||
|  |     } else if (value.__proto__) { | ||
|  |         return value.__proto__ | ||
|  |     } else if (value.constructor) { | ||
|  |         return value.constructor.prototype | ||
|  |     } | ||
|  | } | ||
|  | 
 | ||
|  | },{"../vnode/is-vhook.js":26,"is-object":11}],15:[function(require,module,exports){ | ||
|  | var document = require("global/document") | ||
|  | 
 | ||
|  | var applyProperties = require("./apply-properties") | ||
|  | 
 | ||
|  | var isVNode = require("../vnode/is-vnode.js") | ||
|  | var isVText = require("../vnode/is-vtext.js") | ||
|  | var isWidget = require("../vnode/is-widget.js") | ||
|  | var handleThunk = require("../vnode/handle-thunk.js") | ||
|  | 
 | ||
|  | module.exports = createElement | ||
|  | 
 | ||
|  | function createElement(vnode, opts) { | ||
|  |     var doc = opts ? opts.document || document : document | ||
|  |     var warn = opts ? opts.warn : null | ||
|  | 
 | ||
|  |     vnode = handleThunk(vnode).a | ||
|  | 
 | ||
|  |     if (isWidget(vnode)) { | ||
|  |         return vnode.init() | ||
|  |     } else if (isVText(vnode)) { | ||
|  |         return doc.createTextNode(vnode.text) | ||
|  |     } else if (!isVNode(vnode)) { | ||
|  |         if (warn) { | ||
|  |             warn("Item is not a valid virtual dom node", vnode) | ||
|  |         } | ||
|  |         return null | ||
|  |     } | ||
|  | 
 | ||
|  |     var node = (vnode.namespace === null) ? | ||
|  |         doc.createElement(vnode.tagName) : | ||
|  |         doc.createElementNS(vnode.namespace, vnode.tagName) | ||
|  | 
 | ||
|  |     var props = vnode.properties | ||
|  |     applyProperties(node, props) | ||
|  | 
 | ||
|  |     var children = vnode.children | ||
|  | 
 | ||
|  |     for (var i = 0; i < children.length; i++) { | ||
|  |         var childNode = createElement(children[i], opts) | ||
|  |         if (childNode) { | ||
|  |             node.appendChild(childNode) | ||
|  |         } | ||
|  |     } | ||
|  | 
 | ||
|  |     return node | ||
|  | } | ||
|  | 
 | ||
|  | },{"../vnode/handle-thunk.js":24,"../vnode/is-vnode.js":27,"../vnode/is-vtext.js":28,"../vnode/is-widget.js":29,"./apply-properties":14,"global/document":10}],16:[function(require,module,exports){ | ||
|  | // Maps a virtual DOM tree onto a real DOM tree in an efficient manner.
 | ||
|  | // We don't want to read all of the DOM nodes in the tree so we use
 | ||
|  | // the in-order tree indexing to eliminate recursion down certain branches.
 | ||
|  | // We only recurse into a DOM node if we know that it contains a child of
 | ||
|  | // interest.
 | ||
|  | 
 | ||
|  | var noChild = {} | ||
|  | 
 | ||
|  | module.exports = domIndex | ||
|  | 
 | ||
|  | function domIndex(rootNode, tree, indices, nodes) { | ||
|  |     if (!indices || indices.length === 0) { | ||
|  |         return {} | ||
|  |     } else { | ||
|  |         indices.sort(ascending) | ||
|  |         return recurse(rootNode, tree, indices, nodes, 0) | ||
|  |     } | ||
|  | } | ||
|  | 
 | ||
|  | function recurse(rootNode, tree, indices, nodes, rootIndex) { | ||
|  |     nodes = nodes || {} | ||
|  | 
 | ||
|  | 
 | ||
|  |     if (rootNode) { | ||
|  |         if (indexInRange(indices, rootIndex, rootIndex)) { | ||
|  |             nodes[rootIndex] = rootNode | ||
|  |         } | ||
|  | 
 | ||
|  |         var vChildren = tree.children | ||
|  | 
 | ||
|  |         if (vChildren) { | ||
|  | 
 | ||
|  |             var childNodes = rootNode.childNodes | ||
|  | 
 | ||
|  |             for (var i = 0; i < tree.children.length; i++) { | ||
|  |                 rootIndex += 1 | ||
|  | 
 | ||
|  |                 var vChild = vChildren[i] || noChild | ||
|  |                 var nextIndex = rootIndex + (vChild.count || 0) | ||
|  | 
 | ||
|  |                 // skip recursion down the tree if there are no nodes down here
 | ||
|  |                 if (indexInRange(indices, rootIndex, nextIndex)) { | ||
|  |                     recurse(childNodes[i], vChild, indices, nodes, rootIndex) | ||
|  |                 } | ||
|  | 
 | ||
|  |                 rootIndex = nextIndex | ||
|  |             } | ||
|  |         } | ||
|  |     } | ||
|  | 
 | ||
|  |     return nodes | ||
|  | } | ||
|  | 
 | ||
|  | // Binary search for an index in the interval [left, right]
 | ||
|  | function indexInRange(indices, left, right) { | ||
|  |     if (indices.length === 0) { | ||
|  |         return false | ||
|  |     } | ||
|  | 
 | ||
|  |     var minIndex = 0 | ||
|  |     var maxIndex = indices.length - 1 | ||
|  |     var currentIndex | ||
|  |     var currentItem | ||
|  | 
 | ||
|  |     while (minIndex <= maxIndex) { | ||
|  |         currentIndex = ((maxIndex + minIndex) / 2) >> 0 | ||
|  |         currentItem = indices[currentIndex] | ||
|  | 
 | ||
|  |         if (minIndex === maxIndex) { | ||
|  |             return currentItem >= left && currentItem <= right | ||
|  |         } else if (currentItem < left) { | ||
|  |             minIndex = currentIndex + 1 | ||
|  |         } else  if (currentItem > right) { | ||
|  |             maxIndex = currentIndex - 1 | ||
|  |         } else { | ||
|  |             return true | ||
|  |         } | ||
|  |     } | ||
|  | 
 | ||
|  |     return false; | ||
|  | } | ||
|  | 
 | ||
|  | function ascending(a, b) { | ||
|  |     return a > b ? 1 : -1 | ||
|  | } | ||
|  | 
 | ||
|  | },{}],17:[function(require,module,exports){ | ||
|  | var applyProperties = require("./apply-properties") | ||
|  | 
 | ||
|  | var isWidget = require("../vnode/is-widget.js") | ||
|  | var VPatch = require("../vnode/vpatch.js") | ||
|  | 
 | ||
|  | var updateWidget = require("./update-widget") | ||
|  | 
 | ||
|  | module.exports = applyPatch | ||
|  | 
 | ||
|  | function applyPatch(vpatch, domNode, renderOptions) { | ||
|  |     var type = vpatch.type | ||
|  |     var vNode = vpatch.vNode | ||
|  |     var patch = vpatch.patch | ||
|  | 
 | ||
|  |     switch (type) { | ||
|  |         case VPatch.REMOVE: | ||
|  |             return removeNode(domNode, vNode) | ||
|  |         case VPatch.INSERT: | ||
|  |             return insertNode(domNode, patch, renderOptions) | ||
|  |         case VPatch.VTEXT: | ||
|  |             return stringPatch(domNode, vNode, patch, renderOptions) | ||
|  |         case VPatch.WIDGET: | ||
|  |             return widgetPatch(domNode, vNode, patch, renderOptions) | ||
|  |         case VPatch.VNODE: | ||
|  |             return vNodePatch(domNode, vNode, patch, renderOptions) | ||
|  |         case VPatch.ORDER: | ||
|  |             reorderChildren(domNode, patch) | ||
|  |             return domNode | ||
|  |         case VPatch.PROPS: | ||
|  |             applyProperties(domNode, patch, vNode.properties) | ||
|  |             return domNode | ||
|  |         case VPatch.THUNK: | ||
|  |             return replaceRoot(domNode, | ||
|  |                 renderOptions.patch(domNode, patch, renderOptions)) | ||
|  |         default: | ||
|  |             return domNode | ||
|  |     } | ||
|  | } | ||
|  | 
 | ||
|  | function removeNode(domNode, vNode) { | ||
|  |     var parentNode = domNode.parentNode | ||
|  | 
 | ||
|  |     if (parentNode) { | ||
|  |         parentNode.removeChild(domNode) | ||
|  |     } | ||
|  | 
 | ||
|  |     destroyWidget(domNode, vNode); | ||
|  | 
 | ||
|  |     return null | ||
|  | } | ||
|  | 
 | ||
|  | function insertNode(parentNode, vNode, renderOptions) { | ||
|  |     var newNode = renderOptions.render(vNode, renderOptions) | ||
|  | 
 | ||
|  |     if (parentNode) { | ||
|  |         parentNode.appendChild(newNode) | ||
|  |     } | ||
|  | 
 | ||
|  |     return parentNode | ||
|  | } | ||
|  | 
 | ||
|  | function stringPatch(domNode, leftVNode, vText, renderOptions) { | ||
|  |     var newNode | ||
|  | 
 | ||
|  |     if (domNode.nodeType === 3) { | ||
|  |         domNode.replaceData(0, domNode.length, vText.text) | ||
|  |         newNode = domNode | ||
|  |     } else { | ||
|  |         var parentNode = domNode.parentNode | ||
|  |         newNode = renderOptions.render(vText, renderOptions) | ||
|  | 
 | ||
|  |         if (parentNode && newNode !== domNode) { | ||
|  |             parentNode.replaceChild(newNode, domNode) | ||
|  |         } | ||
|  |     } | ||
|  | 
 | ||
|  |     return newNode | ||
|  | } | ||
|  | 
 | ||
|  | function widgetPatch(domNode, leftVNode, widget, renderOptions) { | ||
|  |     var updating = updateWidget(leftVNode, widget) | ||
|  |     var newNode | ||
|  | 
 | ||
|  |     if (updating) { | ||
|  |         newNode = widget.update(leftVNode, domNode) || domNode | ||
|  |     } else { | ||
|  |         newNode = renderOptions.render(widget, renderOptions) | ||
|  |     } | ||
|  | 
 | ||
|  |     var parentNode = domNode.parentNode | ||
|  | 
 | ||
|  |     if (parentNode && newNode !== domNode) { | ||
|  |         parentNode.replaceChild(newNode, domNode) | ||
|  |     } | ||
|  | 
 | ||
|  |     if (!updating) { | ||
|  |         destroyWidget(domNode, leftVNode) | ||
|  |     } | ||
|  | 
 | ||
|  |     return newNode | ||
|  | } | ||
|  | 
 | ||
|  | function vNodePatch(domNode, leftVNode, vNode, renderOptions) { | ||
|  |     var parentNode = domNode.parentNode | ||
|  |     var newNode = renderOptions.render(vNode, renderOptions) | ||
|  | 
 | ||
|  |     if (parentNode && newNode !== domNode) { | ||
|  |         parentNode.replaceChild(newNode, domNode) | ||
|  |     } | ||
|  | 
 | ||
|  |     return newNode | ||
|  | } | ||
|  | 
 | ||
|  | function destroyWidget(domNode, w) { | ||
|  |     if (typeof w.destroy === "function" && isWidget(w)) { | ||
|  |         w.destroy(domNode) | ||
|  |     } | ||
|  | } | ||
|  | 
 | ||
|  | function reorderChildren(domNode, moves) { | ||
|  |     var childNodes = domNode.childNodes | ||
|  |     var keyMap = {} | ||
|  |     var node | ||
|  |     var remove | ||
|  |     var insert | ||
|  | 
 | ||
|  |     for (var i = 0; i < moves.removes.length; i++) { | ||
|  |         remove = moves.removes[i] | ||
|  |         node = childNodes[remove.from] | ||
|  |         if (remove.key) { | ||
|  |             keyMap[remove.key] = node | ||
|  |         } | ||
|  |         domNode.removeChild(node) | ||
|  |     } | ||
|  | 
 | ||
|  |     var length = childNodes.length | ||
|  |     for (var j = 0; j < moves.inserts.length; j++) { | ||
|  |         insert = moves.inserts[j] | ||
|  |         node = keyMap[insert.key] | ||
|  |         // this is the weirdest bug i've ever seen in webkit
 | ||
|  |         domNode.insertBefore(node, insert.to >= length++ ? null : childNodes[insert.to]) | ||
|  |     } | ||
|  | } | ||
|  | 
 | ||
|  | function replaceRoot(oldRoot, newRoot) { | ||
|  |     if (oldRoot && newRoot && oldRoot !== newRoot && oldRoot.parentNode) { | ||
|  |         oldRoot.parentNode.replaceChild(newRoot, oldRoot) | ||
|  |     } | ||
|  | 
 | ||
|  |     return newRoot; | ||
|  | } | ||
|  | 
 | ||
|  | },{"../vnode/is-widget.js":29,"../vnode/vpatch.js":32,"./apply-properties":14,"./update-widget":19}],18:[function(require,module,exports){ | ||
|  | var document = require("global/document") | ||
|  | var isArray = require("x-is-array") | ||
|  | 
 | ||
|  | var render = require("./create-element") | ||
|  | var domIndex = require("./dom-index") | ||
|  | var patchOp = require("./patch-op") | ||
|  | module.exports = patch | ||
|  | 
 | ||
|  | function patch(rootNode, patches, renderOptions) { | ||
|  |     renderOptions = renderOptions || {} | ||
|  |     renderOptions.patch = renderOptions.patch && renderOptions.patch !== patch | ||
|  |         ? renderOptions.patch | ||
|  |         : patchRecursive | ||
|  |     renderOptions.render = renderOptions.render || render | ||
|  | 
 | ||
|  |     return renderOptions.patch(rootNode, patches, renderOptions) | ||
|  | } | ||
|  | 
 | ||
|  | function patchRecursive(rootNode, patches, renderOptions) { | ||
|  |     var indices = patchIndices(patches) | ||
|  | 
 | ||
|  |     if (indices.length === 0) { | ||
|  |         return rootNode | ||
|  |     } | ||
|  | 
 | ||
|  |     var index = domIndex(rootNode, patches.a, indices) | ||
|  |     var ownerDocument = rootNode.ownerDocument | ||
|  | 
 | ||
|  |     if (!renderOptions.document && ownerDocument !== document) { | ||
|  |         renderOptions.document = ownerDocument | ||
|  |     } | ||
|  | 
 | ||
|  |     for (var i = 0; i < indices.length; i++) { | ||
|  |         var nodeIndex = indices[i] | ||
|  |         rootNode = applyPatch(rootNode, | ||
|  |             index[nodeIndex], | ||
|  |             patches[nodeIndex], | ||
|  |             renderOptions) | ||
|  |     } | ||
|  | 
 | ||
|  |     return rootNode | ||
|  | } | ||
|  | 
 | ||
|  | function applyPatch(rootNode, domNode, patchList, renderOptions) { | ||
|  |     if (!domNode) { | ||
|  |         return rootNode | ||
|  |     } | ||
|  | 
 | ||
|  |     var newNode | ||
|  | 
 | ||
|  |     if (isArray(patchList)) { | ||
|  |         for (var i = 0; i < patchList.length; i++) { | ||
|  |             newNode = patchOp(patchList[i], domNode, renderOptions) | ||
|  | 
 | ||
|  |             if (domNode === rootNode) { | ||
|  |                 rootNode = newNode | ||
|  |             } | ||
|  |         } | ||
|  |     } else { | ||
|  |         newNode = patchOp(patchList, domNode, renderOptions) | ||
|  | 
 | ||
|  |         if (domNode === rootNode) { | ||
|  |             rootNode = newNode | ||
|  |         } | ||
|  |     } | ||
|  | 
 | ||
|  |     return rootNode | ||
|  | } | ||
|  | 
 | ||
|  | function patchIndices(patches) { | ||
|  |     var indices = [] | ||
|  | 
 | ||
|  |     for (var key in patches) { | ||
|  |         if (key !== "a") { | ||
|  |             indices.push(Number(key)) | ||
|  |         } | ||
|  |     } | ||
|  | 
 | ||
|  |     return indices | ||
|  | } | ||
|  | 
 | ||
|  | },{"./create-element":15,"./dom-index":16,"./patch-op":17,"global/document":10,"x-is-array":12}],19:[function(require,module,exports){ | ||
|  | var isWidget = require("../vnode/is-widget.js") | ||
|  | 
 | ||
|  | module.exports = updateWidget | ||
|  | 
 | ||
|  | function updateWidget(a, b) { | ||
|  |     if (isWidget(a) && isWidget(b)) { | ||
|  |         if ("name" in a && "name" in b) { | ||
|  |             return a.id === b.id | ||
|  |         } else { | ||
|  |             return a.init === b.init | ||
|  |         } | ||
|  |     } | ||
|  | 
 | ||
|  |     return false | ||
|  | } | ||
|  | 
 | ||
|  | },{"../vnode/is-widget.js":29}],20:[function(require,module,exports){ | ||
|  | 'use strict'; | ||
|  | 
 | ||
|  | var EvStore = require('ev-store'); | ||
|  | 
 | ||
|  | module.exports = EvHook; | ||
|  | 
 | ||
|  | function EvHook(value) { | ||
|  |     if (!(this instanceof EvHook)) { | ||
|  |         return new EvHook(value); | ||
|  |     } | ||
|  | 
 | ||
|  |     this.value = value; | ||
|  | } | ||
|  | 
 | ||
|  | EvHook.prototype.hook = function (node, propertyName) { | ||
|  |     var es = EvStore(node); | ||
|  |     var propName = propertyName.substr(3); | ||
|  | 
 | ||
|  |     es[propName] = this.value; | ||
|  | }; | ||
|  | 
 | ||
|  | EvHook.prototype.unhook = function(node, propertyName) { | ||
|  |     var es = EvStore(node); | ||
|  |     var propName = propertyName.substr(3); | ||
|  | 
 | ||
|  |     es[propName] = undefined; | ||
|  | }; | ||
|  | 
 | ||
|  | },{"ev-store":7}],21:[function(require,module,exports){ | ||
|  | 'use strict'; | ||
|  | 
 | ||
|  | module.exports = SoftSetHook; | ||
|  | 
 | ||
|  | function SoftSetHook(value) { | ||
|  |     if (!(this instanceof SoftSetHook)) { | ||
|  |         return new SoftSetHook(value); | ||
|  |     } | ||
|  | 
 | ||
|  |     this.value = value; | ||
|  | } | ||
|  | 
 | ||
|  | SoftSetHook.prototype.hook = function (node, propertyName) { | ||
|  |     if (node[propertyName] !== this.value) { | ||
|  |         node[propertyName] = this.value; | ||
|  |     } | ||
|  | }; | ||
|  | 
 | ||
|  | },{}],22:[function(require,module,exports){ | ||
|  | 'use strict'; | ||
|  | 
 | ||
|  | var isArray = require('x-is-array'); | ||
|  | 
 | ||
|  | var VNode = require('../vnode/vnode.js'); | ||
|  | var VText = require('../vnode/vtext.js'); | ||
|  | var isVNode = require('../vnode/is-vnode'); | ||
|  | var isVText = require('../vnode/is-vtext'); | ||
|  | var isWidget = require('../vnode/is-widget'); | ||
|  | var isHook = require('../vnode/is-vhook'); | ||
|  | var isVThunk = require('../vnode/is-thunk'); | ||
|  | 
 | ||
|  | var parseTag = require('./parse-tag.js'); | ||
|  | var softSetHook = require('./hooks/soft-set-hook.js'); | ||
|  | var evHook = require('./hooks/ev-hook.js'); | ||
|  | 
 | ||
|  | module.exports = h; | ||
|  | 
 | ||
|  | function h(tagName, properties, children) { | ||
|  |     var childNodes = []; | ||
|  |     var tag, props, key, namespace; | ||
|  | 
 | ||
|  |     if (!children && isChildren(properties)) { | ||
|  |         children = properties; | ||
|  |         props = {}; | ||
|  |     } | ||
|  | 
 | ||
|  |     props = props || properties || {}; | ||
|  |     tag = parseTag(tagName, props); | ||
|  | 
 | ||
|  |     // support keys
 | ||
|  |     if (props.hasOwnProperty('key')) { | ||
|  |         key = props.key; | ||
|  |         props.key = undefined; | ||
|  |     } | ||
|  | 
 | ||
|  |     // support namespace
 | ||
|  |     if (props.hasOwnProperty('namespace')) { | ||
|  |         namespace = props.namespace; | ||
|  |         props.namespace = undefined; | ||
|  |     } | ||
|  | 
 | ||
|  |     // fix cursor bug
 | ||
|  |     if (tag === 'INPUT' && | ||
|  |         !namespace && | ||
|  |         props.hasOwnProperty('value') && | ||
|  |         props.value !== undefined && | ||
|  |         !isHook(props.value) | ||
|  |     ) { | ||
|  |         props.value = softSetHook(props.value); | ||
|  |     } | ||
|  | 
 | ||
|  |     transformProperties(props); | ||
|  | 
 | ||
|  |     if (children !== undefined && children !== null) { | ||
|  |         addChild(children, childNodes, tag, props); | ||
|  |     } | ||
|  | 
 | ||
|  | 
 | ||
|  |     return new VNode(tag, props, childNodes, key, namespace); | ||
|  | } | ||
|  | 
 | ||
|  | function addChild(c, childNodes, tag, props) { | ||
|  |     if (typeof c === 'string') { | ||
|  |         childNodes.push(new VText(c)); | ||
|  |     } else if (typeof c === 'number') { | ||
|  |         childNodes.push(new VText(String(c))); | ||
|  |     } else if (isChild(c)) { | ||
|  |         childNodes.push(c); | ||
|  |     } else if (isArray(c)) { | ||
|  |         for (var i = 0; i < c.length; i++) { | ||
|  |             addChild(c[i], childNodes, tag, props); | ||
|  |         } | ||
|  |     } else if (c === null || c === undefined) { | ||
|  |         return; | ||
|  |     } else { | ||
|  |         throw UnexpectedVirtualElement({ | ||
|  |             foreignObject: c, | ||
|  |             parentVnode: { | ||
|  |                 tagName: tag, | ||
|  |                 properties: props | ||
|  |             } | ||
|  |         }); | ||
|  |     } | ||
|  | } | ||
|  | 
 | ||
|  | function transformProperties(props) { | ||
|  |     for (var propName in props) { | ||
|  |         if (props.hasOwnProperty(propName)) { | ||
|  |             var value = props[propName]; | ||
|  | 
 | ||
|  |             if (isHook(value)) { | ||
|  |                 continue; | ||
|  |             } | ||
|  | 
 | ||
|  |             if (propName.substr(0, 3) === 'ev-') { | ||
|  |                 // add ev-foo support
 | ||
|  |                 props[propName] = evHook(value); | ||
|  |             } | ||
|  |         } | ||
|  |     } | ||
|  | } | ||
|  | 
 | ||
|  | function isChild(x) { | ||
|  |     return isVNode(x) || isVText(x) || isWidget(x) || isVThunk(x); | ||
|  | } | ||
|  | 
 | ||
|  | function isChildren(x) { | ||
|  |     return typeof x === 'string' || isArray(x) || isChild(x); | ||
|  | } | ||
|  | 
 | ||
|  | function UnexpectedVirtualElement(data) { | ||
|  |     var err = new Error(); | ||
|  | 
 | ||
|  |     err.type = 'virtual-hyperscript.unexpected.virtual-element'; | ||
|  |     err.message = 'Unexpected virtual child passed to h().\n' + | ||
|  |         'Expected a VNode / Vthunk / VWidget / string but:\n' + | ||
|  |         'got:\n' + | ||
|  |         errorString(data.foreignObject) + | ||
|  |         '.\n' + | ||
|  |         'The parent vnode is:\n' + | ||
|  |         errorString(data.parentVnode) | ||
|  |         '\n' + | ||
|  |         'Suggested fix: change your `h(..., [ ... ])` callsite.'; | ||
|  |     err.foreignObject = data.foreignObject; | ||
|  |     err.parentVnode = data.parentVnode; | ||
|  | 
 | ||
|  |     return err; | ||
|  | } | ||
|  | 
 | ||
|  | function errorString(obj) { | ||
|  |     try { | ||
|  |         return JSON.stringify(obj, null, '    '); | ||
|  |     } catch (e) { | ||
|  |         return String(obj); | ||
|  |     } | ||
|  | } | ||
|  | 
 | ||
|  | },{"../vnode/is-thunk":25,"../vnode/is-vhook":26,"../vnode/is-vnode":27,"../vnode/is-vtext":28,"../vnode/is-widget":29,"../vnode/vnode.js":31,"../vnode/vtext.js":33,"./hooks/ev-hook.js":20,"./hooks/soft-set-hook.js":21,"./parse-tag.js":23,"x-is-array":12}],23:[function(require,module,exports){ | ||
|  | 'use strict'; | ||
|  | 
 | ||
|  | var split = require('browser-split'); | ||
|  | 
 | ||
|  | var classIdSplit = /([\.#]?[a-zA-Z0-9\u007F-\uFFFF_:-]+)/; | ||
|  | var notClassId = /^\.|#/; | ||
|  | 
 | ||
|  | module.exports = parseTag; | ||
|  | 
 | ||
|  | function parseTag(tag, props) { | ||
|  |     if (!tag) { | ||
|  |         return 'DIV'; | ||
|  |     } | ||
|  | 
 | ||
|  |     var noId = !(props.hasOwnProperty('id')); | ||
|  | 
 | ||
|  |     var tagParts = split(tag, classIdSplit); | ||
|  |     var tagName = null; | ||
|  | 
 | ||
|  |     if (notClassId.test(tagParts[1])) { | ||
|  |         tagName = 'DIV'; | ||
|  |     } | ||
|  | 
 | ||
|  |     var classes, part, type, i; | ||
|  | 
 | ||
|  |     for (i = 0; i < tagParts.length; i++) { | ||
|  |         part = tagParts[i]; | ||
|  | 
 | ||
|  |         if (!part) { | ||
|  |             continue; | ||
|  |         } | ||
|  | 
 | ||
|  |         type = part.charAt(0); | ||
|  | 
 | ||
|  |         if (!tagName) { | ||
|  |             tagName = part; | ||
|  |         } else if (type === '.') { | ||
|  |             classes = classes || []; | ||
|  |             classes.push(part.substring(1, part.length)); | ||
|  |         } else if (type === '#' && noId) { | ||
|  |             props.id = part.substring(1, part.length); | ||
|  |         } | ||
|  |     } | ||
|  | 
 | ||
|  |     if (classes) { | ||
|  |         if (props.className) { | ||
|  |             classes.push(props.className); | ||
|  |         } | ||
|  | 
 | ||
|  |         props.className = classes.join(' '); | ||
|  |     } | ||
|  | 
 | ||
|  |     return props.namespace ? tagName : tagName.toUpperCase(); | ||
|  | } | ||
|  | 
 | ||
|  | },{"browser-split":5}],24:[function(require,module,exports){ | ||
|  | var isVNode = require("./is-vnode") | ||
|  | var isVText = require("./is-vtext") | ||
|  | var isWidget = require("./is-widget") | ||
|  | var isThunk = require("./is-thunk") | ||
|  | 
 | ||
|  | module.exports = handleThunk | ||
|  | 
 | ||
|  | function handleThunk(a, b) { | ||
|  |     var renderedA = a | ||
|  |     var renderedB = b | ||
|  | 
 | ||
|  |     if (isThunk(b)) { | ||
|  |         renderedB = renderThunk(b, a) | ||
|  |     } | ||
|  | 
 | ||
|  |     if (isThunk(a)) { | ||
|  |         renderedA = renderThunk(a, null) | ||
|  |     } | ||
|  | 
 | ||
|  |     return { | ||
|  |         a: renderedA, | ||
|  |         b: renderedB | ||
|  |     } | ||
|  | } | ||
|  | 
 | ||
|  | function renderThunk(thunk, previous) { | ||
|  |     var renderedThunk = thunk.vnode | ||
|  | 
 | ||
|  |     if (!renderedThunk) { | ||
|  |         renderedThunk = thunk.vnode = thunk.render(previous) | ||
|  |     } | ||
|  | 
 | ||
|  |     if (!(isVNode(renderedThunk) || | ||
|  |             isVText(renderedThunk) || | ||
|  |             isWidget(renderedThunk))) { | ||
|  |         throw new Error("thunk did not return a valid node"); | ||
|  |     } | ||
|  | 
 | ||
|  |     return renderedThunk | ||
|  | } | ||
|  | 
 | ||
|  | },{"./is-thunk":25,"./is-vnode":27,"./is-vtext":28,"./is-widget":29}],25:[function(require,module,exports){ | ||
|  | module.exports = isThunk | ||
|  | 
 | ||
|  | function isThunk(t) { | ||
|  |     return t && t.type === "Thunk" | ||
|  | } | ||
|  | 
 | ||
|  | },{}],26:[function(require,module,exports){ | ||
|  | module.exports = isHook | ||
|  | 
 | ||
|  | function isHook(hook) { | ||
|  |     return hook && | ||
|  |       (typeof hook.hook === "function" && !hook.hasOwnProperty("hook") || | ||
|  |        typeof hook.unhook === "function" && !hook.hasOwnProperty("unhook")) | ||
|  | } | ||
|  | 
 | ||
|  | },{}],27:[function(require,module,exports){ | ||
|  | var version = require("./version") | ||
|  | 
 | ||
|  | module.exports = isVirtualNode | ||
|  | 
 | ||
|  | function isVirtualNode(x) { | ||
|  |     return x && x.type === "VirtualNode" && x.version === version | ||
|  | } | ||
|  | 
 | ||
|  | },{"./version":30}],28:[function(require,module,exports){ | ||
|  | var version = require("./version") | ||
|  | 
 | ||
|  | module.exports = isVirtualText | ||
|  | 
 | ||
|  | function isVirtualText(x) { | ||
|  |     return x && x.type === "VirtualText" && x.version === version | ||
|  | } | ||
|  | 
 | ||
|  | },{"./version":30}],29:[function(require,module,exports){ | ||
|  | module.exports = isWidget | ||
|  | 
 | ||
|  | function isWidget(w) { | ||
|  |     return w && w.type === "Widget" | ||
|  | } | ||
|  | 
 | ||
|  | },{}],30:[function(require,module,exports){ | ||
|  | module.exports = "2" | ||
|  | 
 | ||
|  | },{}],31:[function(require,module,exports){ | ||
|  | var version = require("./version") | ||
|  | var isVNode = require("./is-vnode") | ||
|  | var isWidget = require("./is-widget") | ||
|  | var isThunk = require("./is-thunk") | ||
|  | var isVHook = require("./is-vhook") | ||
|  | 
 | ||
|  | module.exports = VirtualNode | ||
|  | 
 | ||
|  | var noProperties = {} | ||
|  | var noChildren = [] | ||
|  | 
 | ||
|  | function VirtualNode(tagName, properties, children, key, namespace) { | ||
|  |     this.tagName = tagName | ||
|  |     this.properties = properties || noProperties | ||
|  |     this.children = children || noChildren | ||
|  |     this.key = key != null ? String(key) : undefined | ||
|  |     this.namespace = (typeof namespace === "string") ? namespace : null | ||
|  | 
 | ||
|  |     var count = (children && children.length) || 0 | ||
|  |     var descendants = 0 | ||
|  |     var hasWidgets = false | ||
|  |     var hasThunks = false | ||
|  |     var descendantHooks = false | ||
|  |     var hooks | ||
|  | 
 | ||
|  |     for (var propName in properties) { | ||
|  |         if (properties.hasOwnProperty(propName)) { | ||
|  |             var property = properties[propName] | ||
|  |             if (isVHook(property) && property.unhook) { | ||
|  |                 if (!hooks) { | ||
|  |                     hooks = {} | ||
|  |                 } | ||
|  | 
 | ||
|  |                 hooks[propName] = property | ||
|  |             } | ||
|  |         } | ||
|  |     } | ||
|  | 
 | ||
|  |     for (var i = 0; i < count; i++) { | ||
|  |         var child = children[i] | ||
|  |         if (isVNode(child)) { | ||
|  |             descendants += child.count || 0 | ||
|  | 
 | ||
|  |             if (!hasWidgets && child.hasWidgets) { | ||
|  |                 hasWidgets = true | ||
|  |             } | ||
|  | 
 | ||
|  |             if (!hasThunks && child.hasThunks) { | ||
|  |                 hasThunks = true | ||
|  |             } | ||
|  | 
 | ||
|  |             if (!descendantHooks && (child.hooks || child.descendantHooks)) { | ||
|  |                 descendantHooks = true | ||
|  |             } | ||
|  |         } else if (!hasWidgets && isWidget(child)) { | ||
|  |             if (typeof child.destroy === "function") { | ||
|  |                 hasWidgets = true | ||
|  |             } | ||
|  |         } else if (!hasThunks && isThunk(child)) { | ||
|  |             hasThunks = true; | ||
|  |         } | ||
|  |     } | ||
|  | 
 | ||
|  |     this.count = count + descendants | ||
|  |     this.hasWidgets = hasWidgets | ||
|  |     this.hasThunks = hasThunks | ||
|  |     this.hooks = hooks | ||
|  |     this.descendantHooks = descendantHooks | ||
|  | } | ||
|  | 
 | ||
|  | VirtualNode.prototype.version = version | ||
|  | VirtualNode.prototype.type = "VirtualNode" | ||
|  | 
 | ||
|  | },{"./is-thunk":25,"./is-vhook":26,"./is-vnode":27,"./is-widget":29,"./version":30}],32:[function(require,module,exports){ | ||
|  | var version = require("./version") | ||
|  | 
 | ||
|  | VirtualPatch.NONE = 0 | ||
|  | VirtualPatch.VTEXT = 1 | ||
|  | VirtualPatch.VNODE = 2 | ||
|  | VirtualPatch.WIDGET = 3 | ||
|  | VirtualPatch.PROPS = 4 | ||
|  | VirtualPatch.ORDER = 5 | ||
|  | VirtualPatch.INSERT = 6 | ||
|  | VirtualPatch.REMOVE = 7 | ||
|  | VirtualPatch.THUNK = 8 | ||
|  | 
 | ||
|  | module.exports = VirtualPatch | ||
|  | 
 | ||
|  | function VirtualPatch(type, vNode, patch) { | ||
|  |     this.type = Number(type) | ||
|  |     this.vNode = vNode | ||
|  |     this.patch = patch | ||
|  | } | ||
|  | 
 | ||
|  | VirtualPatch.prototype.version = version | ||
|  | VirtualPatch.prototype.type = "VirtualPatch" | ||
|  | 
 | ||
|  | },{"./version":30}],33:[function(require,module,exports){ | ||
|  | var version = require("./version") | ||
|  | 
 | ||
|  | module.exports = VirtualText | ||
|  | 
 | ||
|  | function VirtualText(text) { | ||
|  |     this.text = String(text) | ||
|  | } | ||
|  | 
 | ||
|  | VirtualText.prototype.version = version | ||
|  | VirtualText.prototype.type = "VirtualText" | ||
|  | 
 | ||
|  | },{"./version":30}],34:[function(require,module,exports){ | ||
|  | var isObject = require("is-object") | ||
|  | var isHook = require("../vnode/is-vhook") | ||
|  | 
 | ||
|  | module.exports = diffProps | ||
|  | 
 | ||
|  | function diffProps(a, b) { | ||
|  |     var diff | ||
|  | 
 | ||
|  |     for (var aKey in a) { | ||
|  |         if (!(aKey in b)) { | ||
|  |             diff = diff || {} | ||
|  |             diff[aKey] = undefined | ||
|  |         } | ||
|  | 
 | ||
|  |         var aValue = a[aKey] | ||
|  |         var bValue = b[aKey] | ||
|  | 
 | ||
|  |         if (aValue === bValue) { | ||
|  |             continue | ||
|  |         } else if (isObject(aValue) && isObject(bValue)) { | ||
|  |             if (getPrototype(bValue) !== getPrototype(aValue)) { | ||
|  |                 diff = diff || {} | ||
|  |                 diff[aKey] = bValue | ||
|  |             } else if (isHook(bValue)) { | ||
|  |                  diff = diff || {} | ||
|  |                  diff[aKey] = bValue | ||
|  |             } else { | ||
|  |                 var objectDiff = diffProps(aValue, bValue) | ||
|  |                 if (objectDiff) { | ||
|  |                     diff = diff || {} | ||
|  |                     diff[aKey] = objectDiff | ||
|  |                 } | ||
|  |             } | ||
|  |         } else { | ||
|  |             diff = diff || {} | ||
|  |             diff[aKey] = bValue | ||
|  |         } | ||
|  |     } | ||
|  | 
 | ||
|  |     for (var bKey in b) { | ||
|  |         if (!(bKey in a)) { | ||
|  |             diff = diff || {} | ||
|  |             diff[bKey] = b[bKey] | ||
|  |         } | ||
|  |     } | ||
|  | 
 | ||
|  |     return diff | ||
|  | } | ||
|  | 
 | ||
|  | function getPrototype(value) { | ||
|  |   if (Object.getPrototypeOf) { | ||
|  |     return Object.getPrototypeOf(value) | ||
|  |   } else if (value.__proto__) { | ||
|  |     return value.__proto__ | ||
|  |   } else if (value.constructor) { | ||
|  |     return value.constructor.prototype | ||
|  |   } | ||
|  | } | ||
|  | 
 | ||
|  | },{"../vnode/is-vhook":26,"is-object":11}],35:[function(require,module,exports){ | ||
|  | var isArray = require("x-is-array") | ||
|  | 
 | ||
|  | var VPatch = require("../vnode/vpatch") | ||
|  | var isVNode = require("../vnode/is-vnode") | ||
|  | var isVText = require("../vnode/is-vtext") | ||
|  | var isWidget = require("../vnode/is-widget") | ||
|  | var isThunk = require("../vnode/is-thunk") | ||
|  | var handleThunk = require("../vnode/handle-thunk") | ||
|  | 
 | ||
|  | var diffProps = require("./diff-props") | ||
|  | 
 | ||
|  | module.exports = diff | ||
|  | 
 | ||
|  | function diff(a, b) { | ||
|  |     var patch = { a: a } | ||
|  |     walk(a, b, patch, 0) | ||
|  |     return patch | ||
|  | } | ||
|  | 
 | ||
|  | function walk(a, b, patch, index) { | ||
|  |     if (a === b) { | ||
|  |         return | ||
|  |     } | ||
|  | 
 | ||
|  |     var apply = patch[index] | ||
|  |     var applyClear = false | ||
|  | 
 | ||
|  |     if (isThunk(a) || isThunk(b)) { | ||
|  |         thunks(a, b, patch, index) | ||
|  |     } else if (b == null) { | ||
|  | 
 | ||
|  |         // If a is a widget we will add a remove patch for it
 | ||
|  |         // Otherwise any child widgets/hooks must be destroyed.
 | ||
|  |         // This prevents adding two remove patches for a widget.
 | ||
|  |         if (!isWidget(a)) { | ||
|  |             clearState(a, patch, index) | ||
|  |             apply = patch[index] | ||
|  |         } | ||
|  | 
 | ||
|  |         apply = appendPatch(apply, new VPatch(VPatch.REMOVE, a, b)) | ||
|  |     } else if (isVNode(b)) { | ||
|  |         if (isVNode(a)) { | ||
|  |             if (a.tagName === b.tagName && | ||
|  |                 a.namespace === b.namespace && | ||
|  |                 a.key === b.key) { | ||
|  |                 var propsPatch = diffProps(a.properties, b.properties) | ||
|  |                 if (propsPatch) { | ||
|  |                     apply = appendPatch(apply, | ||
|  |                         new VPatch(VPatch.PROPS, a, propsPatch)) | ||
|  |                 } | ||
|  |                 apply = diffChildren(a, b, patch, apply, index) | ||
|  |             } else { | ||
|  |                 apply = appendPatch(apply, new VPatch(VPatch.VNODE, a, b)) | ||
|  |                 applyClear = true | ||
|  |             } | ||
|  |         } else { | ||
|  |             apply = appendPatch(apply, new VPatch(VPatch.VNODE, a, b)) | ||
|  |             applyClear = true | ||
|  |         } | ||
|  |     } else if (isVText(b)) { | ||
|  |         if (!isVText(a)) { | ||
|  |             apply = appendPatch(apply, new VPatch(VPatch.VTEXT, a, b)) | ||
|  |             applyClear = true | ||
|  |         } else if (a.text !== b.text) { | ||
|  |             apply = appendPatch(apply, new VPatch(VPatch.VTEXT, a, b)) | ||
|  |         } | ||
|  |     } else if (isWidget(b)) { | ||
|  |         if (!isWidget(a)) { | ||
|  |             applyClear = true | ||
|  |         } | ||
|  | 
 | ||
|  |         apply = appendPatch(apply, new VPatch(VPatch.WIDGET, a, b)) | ||
|  |     } | ||
|  | 
 | ||
|  |     if (apply) { | ||
|  |         patch[index] = apply | ||
|  |     } | ||
|  | 
 | ||
|  |     if (applyClear) { | ||
|  |         clearState(a, patch, index) | ||
|  |     } | ||
|  | } | ||
|  | 
 | ||
|  | function diffChildren(a, b, patch, apply, index) { | ||
|  |     var aChildren = a.children | ||
|  |     var orderedSet = reorder(aChildren, b.children) | ||
|  |     var bChildren = orderedSet.children | ||
|  | 
 | ||
|  |     var aLen = aChildren.length | ||
|  |     var bLen = bChildren.length | ||
|  |     var len = aLen > bLen ? aLen : bLen | ||
|  | 
 | ||
|  |     for (var i = 0; i < len; i++) { | ||
|  |         var leftNode = aChildren[i] | ||
|  |         var rightNode = bChildren[i] | ||
|  |         index += 1 | ||
|  | 
 | ||
|  |         if (!leftNode) { | ||
|  |             if (rightNode) { | ||
|  |                 // Excess nodes in b need to be added
 | ||
|  |                 apply = appendPatch(apply, | ||
|  |                     new VPatch(VPatch.INSERT, null, rightNode)) | ||
|  |             } | ||
|  |         } else { | ||
|  |             walk(leftNode, rightNode, patch, index) | ||
|  |         } | ||
|  | 
 | ||
|  |         if (isVNode(leftNode) && leftNode.count) { | ||
|  |             index += leftNode.count | ||
|  |         } | ||
|  |     } | ||
|  | 
 | ||
|  |     if (orderedSet.moves) { | ||
|  |         // Reorder nodes last
 | ||
|  |         apply = appendPatch(apply, new VPatch( | ||
|  |             VPatch.ORDER, | ||
|  |             a, | ||
|  |             orderedSet.moves | ||
|  |         )) | ||
|  |     } | ||
|  | 
 | ||
|  |     return apply | ||
|  | } | ||
|  | 
 | ||
|  | function clearState(vNode, patch, index) { | ||
|  |     // TODO: Make this a single walk, not two
 | ||
|  |     unhook(vNode, patch, index) | ||
|  |     destroyWidgets(vNode, patch, index) | ||
|  | } | ||
|  | 
 | ||
|  | // Patch records for all destroyed widgets must be added because we need
 | ||
|  | // a DOM node reference for the destroy function
 | ||
|  | function destroyWidgets(vNode, patch, index) { | ||
|  |     if (isWidget(vNode)) { | ||
|  |         if (typeof vNode.destroy === "function") { | ||
|  |             patch[index] = appendPatch( | ||
|  |                 patch[index], | ||
|  |                 new VPatch(VPatch.REMOVE, vNode, null) | ||
|  |             ) | ||
|  |         } | ||
|  |     } else if (isVNode(vNode) && (vNode.hasWidgets || vNode.hasThunks)) { | ||
|  |         var children = vNode.children | ||
|  |         var len = children.length | ||
|  |         for (var i = 0; i < len; i++) { | ||
|  |             var child = children[i] | ||
|  |             index += 1 | ||
|  | 
 | ||
|  |             destroyWidgets(child, patch, index) | ||
|  | 
 | ||
|  |             if (isVNode(child) && child.count) { | ||
|  |                 index += child.count | ||
|  |             } | ||
|  |         } | ||
|  |     } else if (isThunk(vNode)) { | ||
|  |         thunks(vNode, null, patch, index) | ||
|  |     } | ||
|  | } | ||
|  | 
 | ||
|  | // Create a sub-patch for thunks
 | ||
|  | function thunks(a, b, patch, index) { | ||
|  |     var nodes = handleThunk(a, b) | ||
|  |     var thunkPatch = diff(nodes.a, nodes.b) | ||
|  |     if (hasPatches(thunkPatch)) { | ||
|  |         patch[index] = new VPatch(VPatch.THUNK, null, thunkPatch) | ||
|  |     } | ||
|  | } | ||
|  | 
 | ||
|  | function hasPatches(patch) { | ||
|  |     for (var index in patch) { | ||
|  |         if (index !== "a") { | ||
|  |             return true | ||
|  |         } | ||
|  |     } | ||
|  | 
 | ||
|  |     return false | ||
|  | } | ||
|  | 
 | ||
|  | // Execute hooks when two nodes are identical
 | ||
|  | function unhook(vNode, patch, index) { | ||
|  |     if (isVNode(vNode)) { | ||
|  |         if (vNode.hooks) { | ||
|  |             patch[index] = appendPatch( | ||
|  |                 patch[index], | ||
|  |                 new VPatch( | ||
|  |                     VPatch.PROPS, | ||
|  |                     vNode, | ||
|  |                     undefinedKeys(vNode.hooks) | ||
|  |                 ) | ||
|  |             ) | ||
|  |         } | ||
|  | 
 | ||
|  |         if (vNode.descendantHooks || vNode.hasThunks) { | ||
|  |             var children = vNode.children | ||
|  |             var len = children.length | ||
|  |             for (var i = 0; i < len; i++) { | ||
|  |                 var child = children[i] | ||
|  |                 index += 1 | ||
|  | 
 | ||
|  |                 unhook(child, patch, index) | ||
|  | 
 | ||
|  |                 if (isVNode(child) && child.count) { | ||
|  |                     index += child.count | ||
|  |                 } | ||
|  |             } | ||
|  |         } | ||
|  |     } else if (isThunk(vNode)) { | ||
|  |         thunks(vNode, null, patch, index) | ||
|  |     } | ||
|  | } | ||
|  | 
 | ||
|  | function undefinedKeys(obj) { | ||
|  |     var result = {} | ||
|  | 
 | ||
|  |     for (var key in obj) { | ||
|  |         result[key] = undefined | ||
|  |     } | ||
|  | 
 | ||
|  |     return result | ||
|  | } | ||
|  | 
 | ||
|  | // List diff, naive left to right reordering
 | ||
|  | function reorder(aChildren, bChildren) { | ||
|  |     // O(M) time, O(M) memory
 | ||
|  |     var bChildIndex = keyIndex(bChildren) | ||
|  |     var bKeys = bChildIndex.keys | ||
|  |     var bFree = bChildIndex.free | ||
|  | 
 | ||
|  |     if (bFree.length === bChildren.length) { | ||
|  |         return { | ||
|  |             children: bChildren, | ||
|  |             moves: null | ||
|  |         } | ||
|  |     } | ||
|  | 
 | ||
|  |     // O(N) time, O(N) memory
 | ||
|  |     var aChildIndex = keyIndex(aChildren) | ||
|  |     var aKeys = aChildIndex.keys | ||
|  |     var aFree = aChildIndex.free | ||
|  | 
 | ||
|  |     if (aFree.length === aChildren.length) { | ||
|  |         return { | ||
|  |             children: bChildren, | ||
|  |             moves: null | ||
|  |         } | ||
|  |     } | ||
|  | 
 | ||
|  |     // O(MAX(N, M)) memory
 | ||
|  |     var newChildren = [] | ||
|  | 
 | ||
|  |     var freeIndex = 0 | ||
|  |     var freeCount = bFree.length | ||
|  |     var deletedItems = 0 | ||
|  | 
 | ||
|  |     // Iterate through a and match a node in b
 | ||
|  |     // O(N) time,
 | ||
|  |     for (var i = 0 ; i < aChildren.length; i++) { | ||
|  |         var aItem = aChildren[i] | ||
|  |         var itemIndex | ||
|  | 
 | ||
|  |         if (aItem.key) { | ||
|  |             if (bKeys.hasOwnProperty(aItem.key)) { | ||
|  |                 // Match up the old keys
 | ||
|  |                 itemIndex = bKeys[aItem.key] | ||
|  |                 newChildren.push(bChildren[itemIndex]) | ||
|  | 
 | ||
|  |             } else { | ||
|  |                 // Remove old keyed items
 | ||
|  |                 itemIndex = i - deletedItems++ | ||
|  |                 newChildren.push(null) | ||
|  |             } | ||
|  |         } else { | ||
|  |             // Match the item in a with the next free item in b
 | ||
|  |             if (freeIndex < freeCount) { | ||
|  |                 itemIndex = bFree[freeIndex++] | ||
|  |                 newChildren.push(bChildren[itemIndex]) | ||
|  |             } else { | ||
|  |                 // There are no free items in b to match with
 | ||
|  |                 // the free items in a, so the extra free nodes
 | ||
|  |                 // are deleted.
 | ||
|  |                 itemIndex = i - deletedItems++ | ||
|  |                 newChildren.push(null) | ||
|  |             } | ||
|  |         } | ||
|  |     } | ||
|  | 
 | ||
|  |     var lastFreeIndex = freeIndex >= bFree.length ? | ||
|  |         bChildren.length : | ||
|  |         bFree[freeIndex] | ||
|  | 
 | ||
|  |     // Iterate through b and append any new keys
 | ||
|  |     // O(M) time
 | ||
|  |     for (var j = 0; j < bChildren.length; j++) { | ||
|  |         var newItem = bChildren[j] | ||
|  | 
 | ||
|  |         if (newItem.key) { | ||
|  |             if (!aKeys.hasOwnProperty(newItem.key)) { | ||
|  |                 // Add any new keyed items
 | ||
|  |                 // We are adding new items to the end and then sorting them
 | ||
|  |                 // in place. In future we should insert new items in place.
 | ||
|  |                 newChildren.push(newItem) | ||
|  |             } | ||
|  |         } else if (j >= lastFreeIndex) { | ||
|  |             // Add any leftover non-keyed items
 | ||
|  |             newChildren.push(newItem) | ||
|  |         } | ||
|  |     } | ||
|  | 
 | ||
|  |     var simulate = newChildren.slice() | ||
|  |     var simulateIndex = 0 | ||
|  |     var removes = [] | ||
|  |     var inserts = [] | ||
|  |     var simulateItem | ||
|  | 
 | ||
|  |     for (var k = 0; k < bChildren.length;) { | ||
|  |         var wantedItem = bChildren[k] | ||
|  |         simulateItem = simulate[simulateIndex] | ||
|  | 
 | ||
|  |         // remove items
 | ||
|  |         while (simulateItem === null && simulate.length) { | ||
|  |             removes.push(remove(simulate, simulateIndex, null)) | ||
|  |             simulateItem = simulate[simulateIndex] | ||
|  |         } | ||
|  | 
 | ||
|  |         if (!simulateItem || simulateItem.key !== wantedItem.key) { | ||
|  |             // if we need a key in this position...
 | ||
|  |             if (wantedItem.key) { | ||
|  |                 if (simulateItem && simulateItem.key) { | ||
|  |                     // if an insert doesn't put this key in place, it needs to move
 | ||
|  |                     if (bKeys[simulateItem.key] !== k + 1) { | ||
|  |                         removes.push(remove(simulate, simulateIndex, simulateItem.key)) | ||
|  |                         simulateItem = simulate[simulateIndex] | ||
|  |                         // if the remove didn't put the wanted item in place, we need to insert it
 | ||
|  |                         if (!simulateItem || simulateItem.key !== wantedItem.key) { | ||
|  |                             inserts.push({key: wantedItem.key, to: k}) | ||
|  |                         } | ||
|  |                         // items are matching, so skip ahead
 | ||
|  |                         else { | ||
|  |                             simulateIndex++ | ||
|  |                         } | ||
|  |                     } | ||
|  |                     else { | ||
|  |                         inserts.push({key: wantedItem.key, to: k}) | ||
|  |                     } | ||
|  |                 } | ||
|  |                 else { | ||
|  |                     inserts.push({key: wantedItem.key, to: k}) | ||
|  |                 } | ||
|  |                 k++ | ||
|  |             } | ||
|  |             // a key in simulate has no matching wanted key, remove it
 | ||
|  |             else if (simulateItem && simulateItem.key) { | ||
|  |                 removes.push(remove(simulate, simulateIndex, simulateItem.key)) | ||
|  |             } | ||
|  |         } | ||
|  |         else { | ||
|  |             simulateIndex++ | ||
|  |             k++ | ||
|  |         } | ||
|  |     } | ||
|  | 
 | ||
|  |     // remove all the remaining nodes from simulate
 | ||
|  |     while(simulateIndex < simulate.length) { | ||
|  |         simulateItem = simulate[simulateIndex] | ||
|  |         removes.push(remove(simulate, simulateIndex, simulateItem && simulateItem.key)) | ||
|  |     } | ||
|  | 
 | ||
|  |     // If the only moves we have are deletes then we can just
 | ||
|  |     // let the delete patch remove these items.
 | ||
|  |     if (removes.length === deletedItems && !inserts.length) { | ||
|  |         return { | ||
|  |             children: newChildren, | ||
|  |             moves: null | ||
|  |         } | ||
|  |     } | ||
|  | 
 | ||
|  |     return { | ||
|  |         children: newChildren, | ||
|  |         moves: { | ||
|  |             removes: removes, | ||
|  |             inserts: inserts | ||
|  |         } | ||
|  |     } | ||
|  | } | ||
|  | 
 | ||
|  | function remove(arr, index, key) { | ||
|  |     arr.splice(index, 1) | ||
|  | 
 | ||
|  |     return { | ||
|  |         from: index, | ||
|  |         key: key | ||
|  |     } | ||
|  | } | ||
|  | 
 | ||
|  | function keyIndex(children) { | ||
|  |     var keys = {} | ||
|  |     var free = [] | ||
|  |     var length = children.length | ||
|  | 
 | ||
|  |     for (var i = 0; i < length; i++) { | ||
|  |         var child = children[i] | ||
|  | 
 | ||
|  |         if (child.key) { | ||
|  |             keys[child.key] = i | ||
|  |         } else { | ||
|  |             free.push(i) | ||
|  |         } | ||
|  |     } | ||
|  | 
 | ||
|  |     return { | ||
|  |         keys: keys,     // A hash of key name to index
 | ||
|  |         free: free      // An array of unkeyed item indices
 | ||
|  |     } | ||
|  | } | ||
|  | 
 | ||
|  | function appendPatch(apply, patch) { | ||
|  |     if (apply) { | ||
|  |         if (isArray(apply)) { | ||
|  |             apply.push(patch) | ||
|  |         } else { | ||
|  |             apply = [apply, patch] | ||
|  |         } | ||
|  | 
 | ||
|  |         return apply | ||
|  |     } else { | ||
|  |         return patch | ||
|  |     } | ||
|  | } | ||
|  | 
 | ||
|  | },{"../vnode/handle-thunk":24,"../vnode/is-thunk":25,"../vnode/is-vnode":27,"../vnode/is-vtext":28,"../vnode/is-widget":29,"../vnode/vpatch":32,"./diff-props":34,"x-is-array":12}]},{},[4])(4) | ||
|  | }); |