| !function() { |
| 'use strict'; |
| function VNode() {} |
| function h(nodeName, attributes) { |
| var lastSimple, child, simple, i, children = EMPTY_CHILDREN; |
| for (i = arguments.length; i-- > 2; ) stack.push(arguments[i]); |
| if (attributes && null != attributes.children) { |
| if (!stack.length) stack.push(attributes.children); |
| delete attributes.children; |
| } |
| while (stack.length) if ((child = stack.pop()) && void 0 !== child.pop) for (i = child.length; i--; ) stack.push(child[i]); else { |
| if ('boolean' == typeof child) child = null; |
| if (simple = 'function' != typeof nodeName) if (null == child) child = ''; else if ('number' == typeof child) child = String(child); else if ('string' != typeof child) simple = !1; |
| if (simple && lastSimple) children[children.length - 1] += child; else if (children === EMPTY_CHILDREN) children = [ child ]; else children.push(child); |
| lastSimple = simple; |
| } |
| var p = new VNode(); |
| p.nodeName = nodeName; |
| p.children = children; |
| p.attributes = null == attributes ? void 0 : attributes; |
| p.key = null == attributes ? void 0 : attributes.key; |
| if (void 0 !== options.vnode) options.vnode(p); |
| return p; |
| } |
| function extend(obj, props) { |
| for (var i in props) obj[i] = props[i]; |
| return obj; |
| } |
| function cloneElement(vnode, props) { |
| return h(vnode.nodeName, extend(extend({}, vnode.attributes), props), arguments.length > 2 ? [].slice.call(arguments, 2) : vnode.children); |
| } |
| function enqueueRender(component) { |
| if (!component.__d && (component.__d = !0) && 1 == items.push(component)) (options.debounceRendering || defer)(rerender); |
| } |
| function rerender() { |
| var p, list = items; |
| items = []; |
| while (p = list.pop()) if (p.__d) renderComponent(p); |
| } |
| function isSameNodeType(node, vnode, hydrating) { |
| if ('string' == typeof vnode || 'number' == typeof vnode) return void 0 !== node.splitText; |
| if ('string' == typeof vnode.nodeName) return !node._componentConstructor && isNamedNode(node, vnode.nodeName); else return hydrating || node._componentConstructor === vnode.nodeName; |
| } |
| function isNamedNode(node, nodeName) { |
| return node.__n === nodeName || node.nodeName.toLowerCase() === nodeName.toLowerCase(); |
| } |
| function getNodeProps(vnode) { |
| var props = extend({}, vnode.attributes); |
| props.children = vnode.children; |
| var defaultProps = vnode.nodeName.defaultProps; |
| if (void 0 !== defaultProps) for (var i in defaultProps) if (void 0 === props[i]) props[i] = defaultProps[i]; |
| return props; |
| } |
| function createNode(nodeName, isSvg) { |
| var node = isSvg ? document.createElementNS('http://www.w3.org/2000/svg', nodeName) : document.createElement(nodeName); |
| node.__n = nodeName; |
| return node; |
| } |
| function removeNode(node) { |
| var parentNode = node.parentNode; |
| if (parentNode) parentNode.removeChild(node); |
| } |
| function setAccessor(node, name, old, value, isSvg) { |
| if ('className' === name) name = 'class'; |
| if ('key' === name) ; else if ('ref' === name) { |
| if (old) old(null); |
| if (value) value(node); |
| } else if ('class' === name && !isSvg) node.className = value || ''; else if ('style' === name) { |
| if (!value || 'string' == typeof value || 'string' == typeof old) node.style.cssText = value || ''; |
| if (value && 'object' == typeof value) { |
| if ('string' != typeof old) for (var i in old) if (!(i in value)) node.style[i] = ''; |
| for (var i in value) node.style[i] = 'number' == typeof value[i] && !1 === IS_NON_DIMENSIONAL.test(i) ? value[i] + 'px' : value[i]; |
| } |
| } else if ('dangerouslySetInnerHTML' === name) { |
| if (value) node.innerHTML = value.__html || ''; |
| } else if ('o' == name[0] && 'n' == name[1]) { |
| var useCapture = name !== (name = name.replace(/Capture$/, '')); |
| name = name.toLowerCase().substring(2); |
| if (value) { |
| if (!old) node.addEventListener(name, eventProxy, useCapture); |
| } else node.removeEventListener(name, eventProxy, useCapture); |
| (node.__l || (node.__l = {}))[name] = value; |
| } else if ('list' !== name && 'type' !== name && !isSvg && name in node) { |
| setProperty(node, name, null == value ? '' : value); |
| if (null == value || !1 === value) node.removeAttribute(name); |
| } else { |
| var ns = isSvg && name !== (name = name.replace(/^xlink\:?/, '')); |
| if (null == value || !1 === value) if (ns) node.removeAttributeNS('http://www.w3.org/1999/xlink', name.toLowerCase()); else node.removeAttribute(name); else if ('function' != typeof value) if (ns) node.setAttributeNS('http://www.w3.org/1999/xlink', name.toLowerCase(), value); else node.setAttribute(name, value); |
| } |
| } |
| function setProperty(node, name, value) { |
| try { |
| node[name] = value; |
| } catch (e) {} |
| } |
| function eventProxy(e) { |
| return this.__l[e.type](options.event && options.event(e) || e); |
| } |
| function flushMounts() { |
| var c; |
| while (c = mounts.pop()) { |
| if (options.afterMount) options.afterMount(c); |
| if (c.componentDidMount) c.componentDidMount(); |
| } |
| } |
| function diff(dom, vnode, context, mountAll, parent, componentRoot) { |
| if (!diffLevel++) { |
| isSvgMode = null != parent && void 0 !== parent.ownerSVGElement; |
| hydrating = null != dom && !('__preactattr_' in dom); |
| } |
| var ret = idiff(dom, vnode, context, mountAll, componentRoot); |
| if (parent && ret.parentNode !== parent) parent.appendChild(ret); |
| if (!--diffLevel) { |
| hydrating = !1; |
| if (!componentRoot) flushMounts(); |
| } |
| return ret; |
| } |
| function idiff(dom, vnode, context, mountAll, componentRoot) { |
| var out = dom, prevSvgMode = isSvgMode; |
| if (null == vnode || 'boolean' == typeof vnode) vnode = ''; |
| if ('string' == typeof vnode || 'number' == typeof vnode) { |
| if (dom && void 0 !== dom.splitText && dom.parentNode && (!dom._component || componentRoot)) { |
| if (dom.nodeValue != vnode) dom.nodeValue = vnode; |
| } else { |
| out = document.createTextNode(vnode); |
| if (dom) { |
| if (dom.parentNode) dom.parentNode.replaceChild(out, dom); |
| recollectNodeTree(dom, !0); |
| } |
| } |
| out.__preactattr_ = !0; |
| return out; |
| } |
| var vnodeName = vnode.nodeName; |
| if ('function' == typeof vnodeName) return buildComponentFromVNode(dom, vnode, context, mountAll); |
| isSvgMode = 'svg' === vnodeName ? !0 : 'foreignObject' === vnodeName ? !1 : isSvgMode; |
| vnodeName = String(vnodeName); |
| if (!dom || !isNamedNode(dom, vnodeName)) { |
| out = createNode(vnodeName, isSvgMode); |
| if (dom) { |
| while (dom.firstChild) out.appendChild(dom.firstChild); |
| if (dom.parentNode) dom.parentNode.replaceChild(out, dom); |
| recollectNodeTree(dom, !0); |
| } |
| } |
| var fc = out.firstChild, props = out.__preactattr_, vchildren = vnode.children; |
| if (null == props) { |
| props = out.__preactattr_ = {}; |
| for (var a = out.attributes, i = a.length; i--; ) props[a[i].name] = a[i].value; |
| } |
| if (!hydrating && vchildren && 1 === vchildren.length && 'string' == typeof vchildren[0] && null != fc && void 0 !== fc.splitText && null == fc.nextSibling) { |
| if (fc.nodeValue != vchildren[0]) fc.nodeValue = vchildren[0]; |
| } else if (vchildren && vchildren.length || null != fc) innerDiffNode(out, vchildren, context, mountAll, hydrating || null != props.dangerouslySetInnerHTML); |
| diffAttributes(out, vnode.attributes, props); |
| isSvgMode = prevSvgMode; |
| return out; |
| } |
| function innerDiffNode(dom, vchildren, context, mountAll, isHydrating) { |
| var j, c, f, vchild, child, originalChildren = dom.childNodes, children = [], keyed = {}, keyedLen = 0, min = 0, len = originalChildren.length, childrenLen = 0, vlen = vchildren ? vchildren.length : 0; |
| if (0 !== len) for (var i = 0; i < len; i++) { |
| var _child = originalChildren[i], props = _child.__preactattr_, key = vlen && props ? _child._component ? _child._component.__k : props.key : null; |
| if (null != key) { |
| keyedLen++; |
| keyed[key] = _child; |
| } else if (props || (void 0 !== _child.splitText ? isHydrating ? _child.nodeValue.trim() : !0 : isHydrating)) children[childrenLen++] = _child; |
| } |
| if (0 !== vlen) for (var i = 0; i < vlen; i++) { |
| vchild = vchildren[i]; |
| child = null; |
| var key = vchild.key; |
| if (null != key) { |
| if (keyedLen && void 0 !== keyed[key]) { |
| child = keyed[key]; |
| keyed[key] = void 0; |
| keyedLen--; |
| } |
| } else if (!child && min < childrenLen) for (j = min; j < childrenLen; j++) if (void 0 !== children[j] && isSameNodeType(c = children[j], vchild, isHydrating)) { |
| child = c; |
| children[j] = void 0; |
| if (j === childrenLen - 1) childrenLen--; |
| if (j === min) min++; |
| break; |
| } |
| child = idiff(child, vchild, context, mountAll); |
| f = originalChildren[i]; |
| if (child && child !== dom && child !== f) if (null == f) dom.appendChild(child); else if (child === f.nextSibling) removeNode(f); else dom.insertBefore(child, f); |
| } |
| if (keyedLen) for (var i in keyed) if (void 0 !== keyed[i]) recollectNodeTree(keyed[i], !1); |
| while (min <= childrenLen) if (void 0 !== (child = children[childrenLen--])) recollectNodeTree(child, !1); |
| } |
| function recollectNodeTree(node, unmountOnly) { |
| var component = node._component; |
| if (component) unmountComponent(component); else { |
| if (null != node.__preactattr_ && node.__preactattr_.ref) node.__preactattr_.ref(null); |
| if (!1 === unmountOnly || null == node.__preactattr_) removeNode(node); |
| removeChildren(node); |
| } |
| } |
| function removeChildren(node) { |
| node = node.lastChild; |
| while (node) { |
| var next = node.previousSibling; |
| recollectNodeTree(node, !0); |
| node = next; |
| } |
| } |
| function diffAttributes(dom, attrs, old) { |
| var name; |
| for (name in old) if ((!attrs || null == attrs[name]) && null != old[name]) setAccessor(dom, name, old[name], old[name] = void 0, isSvgMode); |
| for (name in attrs) if (!('children' === name || 'innerHTML' === name || name in old && attrs[name] === ('value' === name || 'checked' === name ? dom[name] : old[name]))) setAccessor(dom, name, old[name], old[name] = attrs[name], isSvgMode); |
| } |
| function collectComponent(component) { |
| var name = component.constructor.name; |
| (components[name] || (components[name] = [])).push(component); |
| } |
| function createComponent(Ctor, props, context) { |
| var inst, list = components[Ctor.name]; |
| if (Ctor.prototype && Ctor.prototype.render) { |
| inst = new Ctor(props, context); |
| Component.call(inst, props, context); |
| } else { |
| inst = new Component(props, context); |
| inst.constructor = Ctor; |
| inst.render = doRender; |
| } |
| if (list) for (var i = list.length; i--; ) if (list[i].constructor === Ctor) { |
| inst.__b = list[i].__b; |
| list.splice(i, 1); |
| break; |
| } |
| return inst; |
| } |
| function doRender(props, state, context) { |
| return this.constructor(props, context); |
| } |
| function setComponentProps(component, props, opts, context, mountAll) { |
| if (!component.__x) { |
| component.__x = !0; |
| if (component.__r = props.ref) delete props.ref; |
| if (component.__k = props.key) delete props.key; |
| if (!component.base || mountAll) { |
| if (component.componentWillMount) component.componentWillMount(); |
| } else if (component.componentWillReceiveProps) component.componentWillReceiveProps(props, context); |
| if (context && context !== component.context) { |
| if (!component.__c) component.__c = component.context; |
| component.context = context; |
| } |
| if (!component.__p) component.__p = component.props; |
| component.props = props; |
| component.__x = !1; |
| if (0 !== opts) if (1 === opts || !1 !== options.syncComponentUpdates || !component.base) renderComponent(component, 1, mountAll); else enqueueRender(component); |
| if (component.__r) component.__r(component); |
| } |
| } |
| function renderComponent(component, opts, mountAll, isChild) { |
| if (!component.__x) { |
| var rendered, inst, cbase, props = component.props, state = component.state, context = component.context, previousProps = component.__p || props, previousState = component.__s || state, previousContext = component.__c || context, isUpdate = component.base, nextBase = component.__b, initialBase = isUpdate || nextBase, initialChildComponent = component._component, skip = !1; |
| if (isUpdate) { |
| component.props = previousProps; |
| component.state = previousState; |
| component.context = previousContext; |
| if (2 !== opts && component.shouldComponentUpdate && !1 === component.shouldComponentUpdate(props, state, context)) skip = !0; else if (component.componentWillUpdate) component.componentWillUpdate(props, state, context); |
| component.props = props; |
| component.state = state; |
| component.context = context; |
| } |
| component.__p = component.__s = component.__c = component.__b = null; |
| component.__d = !1; |
| if (!skip) { |
| rendered = component.render(props, state, context); |
| if (component.getChildContext) context = extend(extend({}, context), component.getChildContext()); |
| var toUnmount, base, childComponent = rendered && rendered.nodeName; |
| if ('function' == typeof childComponent) { |
| var childProps = getNodeProps(rendered); |
| inst = initialChildComponent; |
| if (inst && inst.constructor === childComponent && childProps.key == inst.__k) setComponentProps(inst, childProps, 1, context, !1); else { |
| toUnmount = inst; |
| component._component = inst = createComponent(childComponent, childProps, context); |
| inst.__b = inst.__b || nextBase; |
| inst.__u = component; |
| setComponentProps(inst, childProps, 0, context, !1); |
| renderComponent(inst, 1, mountAll, !0); |
| } |
| base = inst.base; |
| } else { |
| cbase = initialBase; |
| toUnmount = initialChildComponent; |
| if (toUnmount) cbase = component._component = null; |
| if (initialBase || 1 === opts) { |
| if (cbase) cbase._component = null; |
| base = diff(cbase, rendered, context, mountAll || !isUpdate, initialBase && initialBase.parentNode, !0); |
| } |
| } |
| if (initialBase && base !== initialBase && inst !== initialChildComponent) { |
| var baseParent = initialBase.parentNode; |
| if (baseParent && base !== baseParent) { |
| baseParent.replaceChild(base, initialBase); |
| if (!toUnmount) { |
| initialBase._component = null; |
| recollectNodeTree(initialBase, !1); |
| } |
| } |
| } |
| if (toUnmount) unmountComponent(toUnmount); |
| component.base = base; |
| if (base && !isChild) { |
| var componentRef = component, t = component; |
| while (t = t.__u) (componentRef = t).base = base; |
| base._component = componentRef; |
| base._componentConstructor = componentRef.constructor; |
| } |
| } |
| if (!isUpdate || mountAll) mounts.unshift(component); else if (!skip) { |
| if (component.componentDidUpdate) component.componentDidUpdate(previousProps, previousState, previousContext); |
| if (options.afterUpdate) options.afterUpdate(component); |
| } |
| if (null != component.__h) while (component.__h.length) component.__h.pop().call(component); |
| if (!diffLevel && !isChild) flushMounts(); |
| } |
| } |
| function buildComponentFromVNode(dom, vnode, context, mountAll) { |
| var c = dom && dom._component, originalComponent = c, oldDom = dom, isDirectOwner = c && dom._componentConstructor === vnode.nodeName, isOwner = isDirectOwner, props = getNodeProps(vnode); |
| while (c && !isOwner && (c = c.__u)) isOwner = c.constructor === vnode.nodeName; |
| if (c && isOwner && (!mountAll || c._component)) { |
| setComponentProps(c, props, 3, context, mountAll); |
| dom = c.base; |
| } else { |
| if (originalComponent && !isDirectOwner) { |
| unmountComponent(originalComponent); |
| dom = oldDom = null; |
| } |
| c = createComponent(vnode.nodeName, props, context); |
| if (dom && !c.__b) { |
| c.__b = dom; |
| oldDom = null; |
| } |
| setComponentProps(c, props, 1, context, mountAll); |
| dom = c.base; |
| if (oldDom && dom !== oldDom) { |
| oldDom._component = null; |
| recollectNodeTree(oldDom, !1); |
| } |
| } |
| return dom; |
| } |
| function unmountComponent(component) { |
| if (options.beforeUnmount) options.beforeUnmount(component); |
| var base = component.base; |
| component.__x = !0; |
| if (component.componentWillUnmount) component.componentWillUnmount(); |
| component.base = null; |
| var inner = component._component; |
| if (inner) unmountComponent(inner); else if (base) { |
| if (base.__preactattr_ && base.__preactattr_.ref) base.__preactattr_.ref(null); |
| component.__b = base; |
| removeNode(base); |
| collectComponent(component); |
| removeChildren(base); |
| } |
| if (component.__r) component.__r(null); |
| } |
| function Component(props, context) { |
| this.__d = !0; |
| this.context = context; |
| this.props = props; |
| this.state = this.state || {}; |
| } |
| function render(vnode, parent, merge) { |
| return diff(merge, vnode, {}, !1, parent, !1); |
| } |
| var options = {}; |
| var stack = []; |
| var EMPTY_CHILDREN = []; |
| var defer = 'function' == typeof Promise ? Promise.resolve().then.bind(Promise.resolve()) : setTimeout; |
| var IS_NON_DIMENSIONAL = /acit|ex(?:s|g|n|p|$)|rph|ows|mnc|ntw|ine[ch]|zoo|^ord/i; |
| var items = []; |
| var mounts = []; |
| var diffLevel = 0; |
| var isSvgMode = !1; |
| var hydrating = !1; |
| var components = {}; |
| extend(Component.prototype, { |
| setState: function(state, callback) { |
| var s = this.state; |
| if (!this.__s) this.__s = extend({}, s); |
| extend(s, 'function' == typeof state ? state(s, this.props) : state); |
| if (callback) (this.__h = this.__h || []).push(callback); |
| enqueueRender(this); |
| }, |
| forceUpdate: function(callback) { |
| if (callback) (this.__h = this.__h || []).push(callback); |
| renderComponent(this, 2); |
| }, |
| render: function() {} |
| }); |
| var preact = { |
| h: h, |
| createElement: h, |
| cloneElement: cloneElement, |
| Component: Component, |
| render: render, |
| rerender: rerender, |
| options: options |
| }; |
| if ('undefined' != typeof module) module.exports = preact; else self.preact = preact; |
| }(); |
| //# sourceMappingURL=preact.js.map |