Files

1150 lines
38 KiB
JavaScript

(function (global, factory) {
typeof exports === 'object' && typeof module !== 'undefined' ? factory() :
typeof define === 'function' && define.amd ? define(factory) :
(factory());
}(this, (function () { 'use strict';
function isDef(s) { return s !== undefined && s !== null; }
function isUndef(s) { return s === undefined; }
const isArray = Array.isArray;
function isPrimitive(s) {
return isString(s) || isNumber(s);
}
function isString(val) { return typeof val === 'string'; }
function isNumber(val) { return typeof val === 'number'; }
function toCamelCase(str) {
return str.replace(/-([a-z])/g, (g) => g[1].toUpperCase());
}
function defineElements(win, elements) {
const tags = Object.keys(elements);
for (var i = 0, l = tags.length; i < l; i++) {
win.customElements.define(tags[i], elements[tags[i]]);
}
}
const $annotations = '$annotations';
const Component = function (opts) {
return function (target) {
if (opts) {
const annotations = target[$annotations] = target[$annotations] || {};
annotations.tag = opts.tag;
annotations.styleUrl = opts.styleUrl;
}
};
};
const Prop = function (opts) {
return function (target, propKey) {
const annotations = target[$annotations] = target[$annotations] || {};
annotations.props = annotations.props || {};
annotations.props[propKey] = opts || {};
annotations.obsAttrs = annotations.obsAttrs || [];
annotations.obsAttrs.push(propKey);
};
};
class Config {
constructor(config) {
this.c = config;
}
get(key, fallback = null) {
if (key === 'mode') {
return 'md';
}
return fallback;
}
}
class PlatformClient {
constructor(d) {
this.d = d;
this.css = {};
}
createElement(tagName) {
return this.d.createElement(tagName);
}
createElementNS(namespaceURI, qualifiedName) {
return this.d.createElementNS(namespaceURI, qualifiedName);
}
createTextNode(text) {
return this.d.createTextNode(text);
}
createComment(text) {
return this.d.createComment(text);
}
insertBefore(parentNode, newNode, referenceNode) {
parentNode.insertBefore(newNode, referenceNode);
}
removeChild(node, child) {
node.removeChild(child);
}
appendChild(node, child) {
node.appendChild(child);
}
parentNode(node) {
return node.parentNode;
}
nextSibling(node) {
return node.nextSibling;
}
tag(elm) {
return (elm.tagName || '').toLowerCase();
}
setTextContent(node, text) {
node.textContent = text;
}
getTextContent(node) {
return node.textContent;
}
getAttribute(elm, attrName) {
return elm.getAttribute(attrName);
}
getProperty(node, propName) {
return node[propName];
}
getPropOrAttr(elm, name) {
const val = elm[toCamelCase(name)];
return isDef(val) ? val : elm.getAttribute(name);
}
setStyle(elm, styleName, styleValue) {
elm.style[toCamelCase(styleName)] = styleValue;
}
isElement(node) {
return node.nodeType === 1;
}
isText(node) {
return node.nodeType === 3;
}
isComment(node) {
return node.nodeType === 8;
}
hasElementCss(tag) {
return !!this.css[tag];
}
appendElementCss(tag, styleUrl) {
this.css[tag] = true;
if (styleUrl) {
const cssId = `css-${tag}`;
const head = this.d.getElementsByTagName('head')[0];
if (!head.querySelector(`#${cssId}`)) {
const linkEle = this.createElement('link');
linkEle.id = cssId;
linkEle.href = styleUrl;
linkEle.rel = 'stylesheet';
head.insertBefore(linkEle, head.firstChild);
}
}
}
nextTick(cb) {
const obs = new MutationObserver(() => {
cb && cb();
});
const textNode = this.createTextNode('');
obs.observe(textNode, { characterData: true });
textNode.data = '1';
}
}
function vnode(sel, data, children, text, elm) {
let key = data === undefined ? undefined : data.key;
return { sel: sel, data: data, children: children,
text: text, elm: elm, key: key };
}
const NamespaceURIs = {
"xlink": "http://www.w3.org/1999/xlink"
};
const booleanAttrs = ["allowfullscreen", "async", "autofocus", "autoplay", "checked", "compact", "controls", "declare",
"default", "defaultchecked", "defaultmuted", "defaultselected", "defer", "disabled", "draggable",
"enabled", "formnovalidate", "hidden", "indeterminate", "inert", "ismap", "itemscope", "loop", "multiple",
"muted", "nohref", "noresize", "noshade", "novalidate", "nowrap", "open", "pauseonexit", "readonly",
"required", "reversed", "scoped", "seamless", "selected", "sortable", "spellcheck", "translate",
"truespeed", "typemustmatch", "visible"];
const booleanAttrsDict = Object.create(null);
for (let i = 0, len = booleanAttrs.length; i < len; i++) {
booleanAttrsDict[booleanAttrs[i]] = true;
}
function updateAttrs(oldVnode, vnode) {
var key, cur, old, elm = vnode.elm, oldAttrs = oldVnode.data.attrs, attrs = vnode.data.attrs, namespaceSplit;
if (!oldAttrs && !attrs)
return;
if (oldAttrs === attrs)
return;
oldAttrs = oldAttrs || {};
attrs = attrs || {};
// update modified attributes, add new attributes
for (key in attrs) {
cur = attrs[key];
old = oldAttrs[key];
if (old !== cur) {
if (!cur && booleanAttrsDict[key])
elm.removeAttribute(key);
else {
namespaceSplit = key.split(":");
if (namespaceSplit.length > 1 && NamespaceURIs.hasOwnProperty(namespaceSplit[0]))
elm.setAttributeNS(NamespaceURIs[namespaceSplit[0]], key, cur);
else
elm.setAttribute(key, cur);
}
}
}
//remove removed attributes
// use `in` operator since the previous `for` iteration uses it (.i.e. add even attributes with undefined value)
// the other option is to remove all attributes with value == undefined
for (key in oldAttrs) {
if (!(key in attrs)) {
elm.removeAttribute(key);
}
}
}
const attributesModule = { create: updateAttrs, update: updateAttrs };
function updateClass(oldVnode, vnode) {
var cur, name, elm = vnode.elm, oldClass = oldVnode.data.class, klass = vnode.data.class;
if (!oldClass && !klass)
return;
if (oldClass === klass)
return;
oldClass = oldClass || {};
klass = klass || {};
for (name in oldClass) {
if (!klass[name]) {
elm.classList.remove(name);
}
}
for (name in klass) {
cur = klass[name];
if (cur !== oldClass[name]) {
elm.classList[cur ? 'add' : 'remove'](name);
}
}
}
const classModule = { create: updateClass, update: updateClass };
function invokeHandler(handler, vnode, event) {
if (typeof handler === "function") {
// call function handler
handler.call(vnode, event, vnode);
}
else if (typeof handler === "object") {
// call handler with arguments
if (typeof handler[0] === "function") {
// special case for single argument for performance
if (handler.length === 2) {
handler[0].call(vnode, handler[1], event, vnode);
}
else {
var args = handler.slice(1);
args.push(event);
args.push(vnode);
handler[0].apply(vnode, args);
}
}
else {
// call multiple handlers
for (var i = 0; i < handler.length; i++) {
invokeHandler(handler[i]);
}
}
}
}
function handleEvent(event, vnode) {
var name = event.type, on = vnode.data.on;
// call event handler(s) if exists
if (on && on[name]) {
invokeHandler(on[name], vnode, event);
}
}
function createListener() {
return function handler(event) {
handleEvent(event, handler.vnode);
};
}
function updateEventListeners(oldVnode, vnode) {
var oldOn = oldVnode.data.on, oldListener = oldVnode.listener, oldElm = oldVnode.elm, on = vnode && vnode.data.on, elm = (vnode && vnode.elm), name;
// optimization for reused immutable handlers
if (oldOn === on) {
return;
}
// remove existing listeners which no longer used
if (oldOn && oldListener) {
// if element changed or deleted we remove all existing listeners unconditionally
if (!on) {
for (name in oldOn) {
// remove listener if element was changed or existing listeners removed
oldElm.removeEventListener(name, oldListener, false);
}
}
else {
for (name in oldOn) {
// remove listener if existing listener removed
if (!on[name]) {
oldElm.removeEventListener(name, oldListener, false);
}
}
}
}
// add new listeners which has not already attached
if (on) {
// reuse existing listener or create new
var listener = vnode.listener = oldVnode.listener || createListener();
// update vnode for listener
listener.vnode = vnode;
// if element changed or added we add all needed listeners unconditionally
if (!oldOn) {
for (name in on) {
// add listener if element was changed or new listeners added
elm.addEventListener(name, listener, false);
}
}
else {
for (name in on) {
// add listener if new listener added
if (!oldOn[name]) {
elm.addEventListener(name, listener, false);
}
}
}
}
}
const eventListenersModule = {
create: updateEventListeners,
update: updateEventListeners,
destroy: updateEventListeners
};
function updateStyle(oldVnode, vnode) {
var cur, name, elm = vnode.elm, oldStyle = oldVnode.data.style, style = vnode.data.style;
if (!oldStyle && !style)
return;
if (oldStyle === style)
return;
oldStyle = oldStyle || {};
style = style || {};
for (name in oldStyle) {
if (!style[name]) {
if (name[0] === '-' && name[1] === '-') {
elm.style.removeProperty(name);
}
else {
elm.style[name] = '';
}
}
}
for (name in style) {
cur = style[name];
if (name !== 'remove' && cur !== oldStyle[name]) {
if (name[0] === '-' && name[1] === '-') {
elm.style.setProperty(name, cur);
}
else {
elm.style[name] = cur;
}
}
}
}
function applyDestroyStyle(vnode) {
var style, name, elm = vnode.elm, s = vnode.data.style;
if (!s || !(style = s.destroy))
return;
for (name in style) {
elm.style[name] = style[name];
}
}
function applyRemoveStyle(vnode, rm) {
var s = vnode.data.style;
if (!s || !s.remove) {
rm();
return;
}
var name, elm = vnode.elm, i = 0, compStyle, style = s.remove, amount = 0, applied = [];
for (name in style) {
applied.push(name);
elm.style[name] = style[name];
}
compStyle = getComputedStyle(elm);
var props = compStyle['transition-property'].split(', ');
for (; i < props.length; ++i) {
if (applied.indexOf(props[i]) !== -1)
amount++;
}
elm.addEventListener('transitionend', function (ev) {
if (ev.target === elm)
--amount;
if (amount === 0)
rm();
});
}
const styleModule = {
create: updateStyle,
update: updateStyle,
destroy: applyDestroyStyle,
remove: applyRemoveStyle
};
function addNS(data, children, sel) {
data.ns = 'http://www.w3.org/2000/svg';
if (sel !== 'foreignObject' && children !== undefined) {
for (let i = 0; i < children.length; ++i) {
let childData = children[i].data;
if (childData !== undefined) {
addNS(childData, children[i].children, children[i].sel);
}
}
}
}
function h(sel, b, c) {
var data = {}, children, text, i;
var elm = undefined;
if (sel.nodeType) {
elm = sel;
}
if (c !== undefined) {
data = b;
if (isArray(c)) {
children = c;
}
else if (isPrimitive(c)) {
text = c;
}
else if (c && c.sel) {
children = [c];
}
}
else if (b !== undefined) {
if (isArray(b)) {
children = b;
}
else if (isPrimitive(b)) {
text = b;
}
else if (b && b.sel) {
children = [b];
}
else {
data = b;
}
}
if (isArray(children)) {
for (i = 0; i < children.length; ++i) {
if (isPrimitive(children[i]))
children[i] = vnode(undefined, undefined, undefined, children[i]);
}
}
if (sel[0] === 's' && sel[1] === 'v' && sel[2] === 'g' &&
(sel.length === 3 || sel[3] === '.' || sel[3] === '#')) {
addNS(data, children, sel);
}
return vnode(sel, data, children, text, elm);
}
const emptyNode = vnode('', {}, [], undefined, undefined);
function sameVnode(vnode1, vnode2) {
return vnode1.key === vnode2.key && vnode1.sel === vnode2.sel;
}
function isVnode(vnode$$1) {
return vnode$$1.sel !== undefined || vnode$$1.elm !== undefined;
}
function createKeyToOldIdx(children, beginIdx, endIdx) {
let i, map = {}, key, ch;
for (i = beginIdx; i <= endIdx; ++i) {
ch = children[i];
if (ch != null) {
key = ch.key;
if (key !== undefined)
map[key] = i;
}
}
return map;
}
const hooks = ['create', 'update', 'remove', 'destroy', 'pre', 'post'];
function initRenderer(modules, api) {
let i, j, cbs = {};
for (i = 0; i < hooks.length; ++i) {
cbs[hooks[i]] = [];
for (j = 0; j < modules.length; ++j) {
const hook = modules[j][hooks[i]];
if (hook !== undefined) {
cbs[hooks[i]].push(hook);
}
}
}
function emptyNodeAt(elm) {
const id = elm.id ? '#' + elm.id : '';
const c = elm.className ? '.' + elm.className.split(' ').join('.') : '';
return vnode(api.tag(elm) + id + c, {}, [], undefined, elm);
}
function createRmCb(childElm, listeners) {
return function rmCb() {
if (--listeners === 0) {
const parent = api.parentNode(childElm);
api.removeChild(parent, childElm);
}
};
}
function createElm(parentElm, vnode$$1, insertedVnodeQueue, slotContentNodes) {
let i, data = vnode$$1.data;
if (data !== undefined) {
if (isDef(i = data.hook) && isDef(i = i.init)) {
i(vnode$$1);
data = vnode$$1.data;
}
}
let children = vnode$$1.children, sel = vnode$$1.sel;
if (sel === 'slot') {
if (slotContentNodes) {
const contentNodes = vnode$$1.data.select ? slotContentNodes.selected[vnode$$1.data.select] : slotContentNodes.$;
let contentNode;
while (contentNode = contentNodes.shift()) {
// remove the host content node from it's original parent node
api.removeChild(contentNode.parentNode, contentNode);
if (!contentNodes.length) {
// return the last node that gets appended
// like any other Node that was created
return contentNode;
}
// relocate the node to it's new home
api.appendChild(parentElm, contentNode);
}
return api.createComment('');
}
}
else if (sel === '!') {
if (isUndef(vnode$$1.text)) {
vnode$$1.text = '';
}
vnode$$1.elm = api.createComment(vnode$$1.text);
}
else if (sel !== undefined) {
// Parse selector
const hashIdx = sel.indexOf('#');
const dotIdx = sel.indexOf('.', hashIdx);
const hash = hashIdx > 0 ? hashIdx : sel.length;
const dot = dotIdx > 0 ? dotIdx : sel.length;
const tag = hashIdx !== -1 || dotIdx !== -1 ? sel.slice(0, Math.min(hash, dot)) : sel;
const elm = vnode$$1.elm = isDef(data) && isDef(i = data.ns) ? api.createElementNS(i, tag)
: api.createElement(tag);
if (hash < dot)
elm.id = sel.slice(hash + 1, dot);
if (dotIdx > 0)
elm.className = sel.slice(dot + 1).replace(/\./g, ' ');
for (i = 0; i < cbs.create.length; ++i)
cbs.create[i](emptyNode, vnode$$1);
if (isArray(children)) {
for (i = 0; i < children.length; ++i) {
const ch = children[i];
if (ch != null) {
api.appendChild(elm, createElm(elm, ch, insertedVnodeQueue, slotContentNodes));
}
}
}
else if (isPrimitive(vnode$$1.text)) {
api.appendChild(elm, api.createTextNode(vnode$$1.text));
}
i = vnode$$1.data.hook; // Reuse variable
if (isDef(i)) {
if (i.create)
i.create(emptyNode, vnode$$1);
if (i.insert)
insertedVnodeQueue.push(vnode$$1);
}
}
else {
vnode$$1.elm = api.createTextNode(vnode$$1.text);
}
return vnode$$1.elm;
}
function addVnodes(parentElm, before, vnodes, startIdx, endIdx, insertedVnodeQueue, slotContentNodes) {
for (; startIdx <= endIdx; ++startIdx) {
const ch = vnodes[startIdx];
if (ch != null) {
api.insertBefore(parentElm, createElm(parentElm, ch, insertedVnodeQueue, slotContentNodes), before);
}
}
}
function invokeDestroyHook(vnode$$1) {
let i, j, data = vnode$$1.data;
if (data !== undefined) {
if (isDef(i = data.hook) && isDef(i = i.destroy))
i(vnode$$1);
for (i = 0; i < cbs.destroy.length; ++i)
cbs.destroy[i](vnode$$1);
if (vnode$$1.children !== undefined) {
for (j = 0; j < vnode$$1.children.length; ++j) {
i = vnode$$1.children[j];
if (i != null && typeof i !== "string") {
invokeDestroyHook(i);
}
}
}
}
}
function removeVnodes(parentElm, vnodes, startIdx, endIdx) {
for (; startIdx <= endIdx; ++startIdx) {
let i, listeners, rm, ch = vnodes[startIdx];
if (ch != null) {
if (isDef(ch.sel)) {
invokeDestroyHook(ch);
listeners = cbs.remove.length + 1;
rm = createRmCb(ch.elm, listeners);
for (i = 0; i < cbs.remove.length; ++i)
cbs.remove[i](ch, rm);
if (isDef(i = ch.data) && isDef(i = i.hook) && isDef(i = i.remove)) {
i(ch, rm);
}
else {
rm();
}
}
else {
api.removeChild(parentElm, ch.elm);
}
}
}
}
function updateChildren(parentElm, oldCh, newCh, insertedVnodeQueue, slotContentNodes) {
let oldStartIdx = 0, newStartIdx = 0;
let oldEndIdx = oldCh.length - 1;
let oldStartVnode = oldCh[0];
let oldEndVnode = oldCh[oldEndIdx];
let newEndIdx = newCh.length - 1;
let newStartVnode = newCh[0];
let newEndVnode = newCh[newEndIdx];
let oldKeyToIdx;
let idxInOld;
let elmToMove;
let before;
while (oldStartIdx <= oldEndIdx && newStartIdx <= newEndIdx) {
if (oldStartVnode == null) {
oldStartVnode = oldCh[++oldStartIdx]; // Vnode might have been moved left
}
else if (oldEndVnode == null) {
oldEndVnode = oldCh[--oldEndIdx];
}
else if (newStartVnode == null) {
newStartVnode = newCh[++newStartIdx];
}
else if (newEndVnode == null) {
newEndVnode = newCh[--newEndIdx];
}
else if (sameVnode(oldStartVnode, newStartVnode)) {
patchVnode(oldStartVnode, newStartVnode, insertedVnodeQueue, slotContentNodes);
oldStartVnode = oldCh[++oldStartIdx];
newStartVnode = newCh[++newStartIdx];
}
else if (sameVnode(oldEndVnode, newEndVnode)) {
patchVnode(oldEndVnode, newEndVnode, insertedVnodeQueue, slotContentNodes);
oldEndVnode = oldCh[--oldEndIdx];
newEndVnode = newCh[--newEndIdx];
}
else if (sameVnode(oldStartVnode, newEndVnode)) {
patchVnode(oldStartVnode, newEndVnode, insertedVnodeQueue, slotContentNodes);
api.insertBefore(parentElm, oldStartVnode.elm, api.nextSibling(oldEndVnode.elm));
oldStartVnode = oldCh[++oldStartIdx];
newEndVnode = newCh[--newEndIdx];
}
else if (sameVnode(oldEndVnode, newStartVnode)) {
patchVnode(oldEndVnode, newStartVnode, insertedVnodeQueue, slotContentNodes);
api.insertBefore(parentElm, oldEndVnode.elm, oldStartVnode.elm);
oldEndVnode = oldCh[--oldEndIdx];
newStartVnode = newCh[++newStartIdx];
}
else {
if (oldKeyToIdx === undefined) {
oldKeyToIdx = createKeyToOldIdx(oldCh, oldStartIdx, oldEndIdx);
}
idxInOld = oldKeyToIdx[newStartVnode.key];
if (isUndef(idxInOld)) {
api.insertBefore(parentElm, createElm(parentElm, newStartVnode, insertedVnodeQueue, slotContentNodes), oldStartVnode.elm);
newStartVnode = newCh[++newStartIdx];
}
else {
elmToMove = oldCh[idxInOld];
if (elmToMove.sel !== newStartVnode.sel) {
api.insertBefore(parentElm, createElm(parentElm, newStartVnode, insertedVnodeQueue, slotContentNodes), oldStartVnode.elm);
}
else {
patchVnode(elmToMove, newStartVnode, insertedVnodeQueue, slotContentNodes);
oldCh[idxInOld] = undefined;
api.insertBefore(parentElm, elmToMove.elm, oldStartVnode.elm);
}
newStartVnode = newCh[++newStartIdx];
}
}
}
if (oldStartIdx > oldEndIdx) {
before = newCh[newEndIdx + 1] == null ? null : newCh[newEndIdx + 1].elm;
addVnodes(parentElm, before, newCh, newStartIdx, newEndIdx, insertedVnodeQueue, slotContentNodes);
}
else if (newStartIdx > newEndIdx) {
removeVnodes(parentElm, oldCh, oldStartIdx, oldEndIdx);
}
}
function patchVnode(oldVnode, vnode$$1, insertedVnodeQueue, slotContentNodes) {
if (!slotContentNodes && oldVnode.sel === 'slot') {
return;
}
let i, hook;
if (isDef(i = vnode$$1.data) && isDef(hook = i.hook) && isDef(i = hook.prepatch)) {
i(oldVnode, vnode$$1);
}
const elm = vnode$$1.elm = oldVnode.elm;
let oldCh = oldVnode.children;
let ch = vnode$$1.children;
if (oldVnode === vnode$$1)
return;
if (vnode$$1.data !== undefined) {
for (i = 0; i < cbs.update.length; ++i)
cbs.update[i](oldVnode, vnode$$1);
i = vnode$$1.data.hook;
if (isDef(i) && isDef(i = i.update))
i(oldVnode, vnode$$1);
}
if (isUndef(vnode$$1.text)) {
if (isDef(oldCh) && isDef(ch)) {
if (oldCh !== ch) {
updateChildren(elm, oldCh, ch, insertedVnodeQueue, slotContentNodes);
}
}
else if (isDef(ch)) {
if (isDef(oldVnode.text))
api.setTextContent(elm, '');
addVnodes(elm, null, ch, 0, ch.length - 1, insertedVnodeQueue, null);
}
else if (isDef(oldCh)) {
removeVnodes(elm, oldCh, 0, oldCh.length - 1);
}
else if (isDef(oldVnode.text)) {
api.setTextContent(elm, '');
}
}
else if (oldVnode.text !== vnode$$1.text) {
api.setTextContent(elm, vnode$$1.text);
}
if (isDef(hook) && isDef(i = hook.postpatch)) {
i(oldVnode, vnode$$1);
}
}
function collectSlots(vnode$$1, slotContentNodes) {
if (vnode$$1.sel === 'slot') {
if (vnode$$1.data && vnode$$1.data.select) {
slotContentNodes.selectNames.push(vnode$$1.data.select);
slotContentNodes.selected[vnode$$1.data.select] = [];
}
else {
slotContentNodes.$ = [];
}
}
else if (vnode$$1.children) {
for (var i = 0; i < vnode$$1.children.length; i++) {
if (isVnode(vnode$$1.children[i])) {
collectSlots(vnode$$1.children[i], slotContentNodes);
}
}
}
}
return function patch(oldVnode, vnode$$1, slotProjection) {
let i, elm, parent;
const insertedVnodeQueue = [];
for (i = 0; i < cbs.pre.length; ++i)
cbs.pre[i]();
if (!isVnode(oldVnode)) {
oldVnode = emptyNodeAt(oldVnode);
}
if (vnode$$1.isHost || sameVnode(oldVnode, vnode$$1)) {
let slotContentNodes;
if (slotProjection && isArray(vnode$$1.children)) {
slotContentNodes = {
selectNames: [],
selected: {},
$: []
};
collectSlots(vnode$$1, slotContentNodes);
let j;
let selected;
let childNodes = oldVnode.elm.childNodes;
for (i = 0; i < childNodes.length; i++) {
selected = false;
if (childNodes[i].nodeType === 1) {
for (j = 0; j < slotContentNodes.selectNames.length; j++) {
if (childNodes[i].matches(slotContentNodes.selectNames[j])) {
slotContentNodes.selected[slotContentNodes.selectNames[j]].push(oldVnode.elm.childNodes[i]);
selected = true;
break;
}
}
}
if (!selected) {
slotContentNodes.$.push(oldVnode.elm.childNodes[i]);
}
}
}
patchVnode(oldVnode, vnode$$1, insertedVnodeQueue, slotContentNodes);
}
else {
elm = oldVnode.elm;
parent = api.parentNode(elm);
createElm(parent, vnode$$1, insertedVnodeQueue, null);
if (parent !== null) {
api.insertBefore(parent, vnode$$1.elm, api.nextSibling(elm));
removeVnodes(parent, [oldVnode], 0, 0);
}
}
for (i = 0; i < insertedVnodeQueue.length; ++i) {
insertedVnodeQueue[i].data.hook.insert(insertedVnodeQueue[i]);
}
for (i = 0; i < cbs.post.length; ++i)
cbs.post[i]();
return vnode$$1;
};
}
function Ionic(opts) {
const GLOBAL = typeof global !== 'undefined' ? global : typeof self !== 'undefined' ? self : Function('return this;')();
const ionic = (GLOBAL.ionic = GLOBAL.ionic || {});
if (opts) {
if (opts.api) {
ionic.api = opts.api;
}
if (opts.config) {
ionic.config = opts.config;
}
}
if (!ionic.api) {
ionic.api = new PlatformClient(document);
}
if (!ionic.renderer) {
ionic.renderer = initRenderer([
attributesModule,
classModule,
eventListenersModule,
styleModule
], ionic.api);
}
if (!ionic.config) {
ionic.config = new Config();
}
return ionic;
}
function initProperties(elm, props) {
props = props || {};
// all components have mode and color props
props.mode = true;
props.color = true;
const propValues = {};
Object.keys(props).forEach(propName => {
propName = toCamelCase(propName);
Object.defineProperty(elm, propName, {
get: () => {
return propValues[propName];
},
set: (value) => {
value = getValue(props[propName], value);
if (propValues[propName] !== value) {
propValues[propName] = value;
elm.update();
}
}
});
});
}
function getValue(propOpts, value) {
if (propOpts.type === 'boolean') {
if (isString(value)) {
return true;
}
return !!value;
}
else if (propOpts.type === 'number') {
if (isNumber(value)) {
return value;
}
return parseFloat(value);
}
return value;
}
function patchHostElement(config, api, renderer, elm) {
elm.mode = getValue$1('mode', config, api, elm);
elm.color = getValue$1('color', config, api, elm);
const newVnode = elm.render();
if (!newVnode) {
return;
}
newVnode.elm = elm;
newVnode.isHost = true;
const hostCss = newVnode.data.class = newVnode.data.class || {};
let componentPrefix;
const cssClasses = newVnode.sel.split('.');
if (cssClasses.length > 1) {
componentPrefix = cssClasses[1] + '-';
for (var i = 1; i < cssClasses.length; i++) {
hostCss[cssClasses[i]] = true;
}
}
else {
componentPrefix = '';
}
newVnode.sel = undefined;
hostCss[`${componentPrefix}${elm.mode}`] = true;
if (elm.color) {
hostCss[`${componentPrefix}${elm.mode}-${elm.color}`] = true;
}
// if we already have a vnode then use it
// otherwise, elm is the initial patch and
// we need it to pass it the actual host element
if (!elm._vnode) {
elm._vnode = renderer(elm, newVnode, true);
}
else {
elm._vnode = renderer(elm._vnode, newVnode, false);
}
}
function getValue$1(name, config, api, elm, fallback = null) {
const val = api.getPropOrAttr(elm, name);
return isDef(val) ? val : config.get(name, fallback);
}
class IonElement extends getBaseElement() {
constructor() {
super();
/** @internal */
this._q = true;
const ctorPrototype = this.constructor.prototype;
initProperties(this, ctorPrototype[$annotations]);
const styleUrl = ctorPrototype.styleUrl;
if (styleUrl) {
const api = Ionic().api;
const tag = ctorPrototype.tag || api.tag(this);
if (!api.hasElementCss(tag)) {
api.appendElementCss(tag, styleUrl);
}
}
}
connectedCallback() {
this._q = false;
this.update();
}
static get observedAttributes() {
const annotations = this.prototype[$annotations] = this.prototype[$annotations] || {};
annotations.obsAttrs = annotations.obsAttrs || [];
// all components have mode and color props
annotations.obsAttrs.push('mode', 'color');
return annotations.obsAttrs;
}
static set observedAttributes(attrs) {
const annotations = this.prototype[$annotations] = this.prototype[$annotations] || {};
if (annotations.obsAttrs) {
Array.prototype.push.apply(annotations.obsAttrs, attrs);
}
else {
annotations.obsAttrs = attrs;
}
}
update() {
const elm = this;
// only run patch if it isn't queued already
if (!elm._q) {
elm._q = true;
// run the patch in the next tick
const ionic = Ionic();
ionic.api.nextTick(() => {
// vdom diff and patch the host element for differences
patchHostElement(ionic.config, ionic.api, ionic.renderer, elm);
// no longer queued
elm._q = false;
});
}
}
attributeChangedCallback(attrName, oldVal, newVal) {
if (oldVal !== newVal) {
this[toCamelCase(attrName)] = newVal;
}
}
render() { return null; }
;
}
function getBaseElement() {
if (typeof HTMLElement !== 'function') {
const BaseElement = function () { };
BaseElement.prototype = Ionic().api.createElement('div');
return BaseElement;
}
return HTMLElement;
}
class IonApp extends IonElement {
render() {
return h('.app');
}
}
IonApp.annotations = {
tag: 'ion-app'
};
class IonBadge extends IonElement {
render() {
return h('.badge');
}
}
var __decorate = (undefined && undefined.__decorate) || function (decorators, target, key, desc) {
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
return c > 3 && r && Object.defineProperty(target, key, r), r;
};
let IonButton = class IonButton extends IonElement {
constructor() {
super(...arguments);
this.role = 'button';
}
render() {
const vnodeData = { class: {} };
const hostCss = vnodeData.class;
const host = this;
const role = host.role;
const mode = host.mode;
function setCssClass(type) {
if (type) {
type = type.toLocaleLowerCase();
hostCss[`${role}-${type}`] = true;
hostCss[`${role}-${type}-${mode}`] = true;
}
}
hostCss[role] = true;
hostCss[`${role}-${mode}`] = true;
let size = host.large ? 'large' : host.small ? 'small' : 'default';
setCssClass(size);
let style = host.outline ? 'outline' : host.clear ? 'clear' : host.solid ? 'solid' : null;
style = (role !== 'bar-button' && style === 'solid' ? 'default' : style);
setCssClass(style);
let display = host.block ? 'block' : host.full ? 'full' : null;
setCssClass(display);
if (host.round) {
setCssClass('round');
}
if (host.strong) {
setCssClass('strong');
}
return h('.button', vnodeData, [
h('span.button-inner', [
h('slot')
]),
h('div.button-effect')
]);
}
};
__decorate([
Prop()
], IonButton.prototype, "role", void 0);
__decorate([
Prop({ type: 'boolean' })
], IonButton.prototype, "large", void 0);
__decorate([
Prop({ type: 'boolean' })
], IonButton.prototype, "small", void 0);
__decorate([
Prop({ type: 'boolean' })
], IonButton.prototype, "default", void 0);
__decorate([
Prop({ type: 'boolean' })
], IonButton.prototype, "outline", void 0);
__decorate([
Prop({ type: 'boolean' })
], IonButton.prototype, "clear", void 0);
__decorate([
Prop({ type: 'boolean' })
], IonButton.prototype, "solid", void 0);
__decorate([
Prop({ type: 'boolean' })
], IonButton.prototype, "round", void 0);
__decorate([
Prop({ type: 'boolean' })
], IonButton.prototype, "block", void 0);
__decorate([
Prop({ type: 'boolean' })
], IonButton.prototype, "full", void 0);
__decorate([
Prop({ type: 'boolean' })
], IonButton.prototype, "strong", void 0);
IonButton = __decorate([
Component({
tag: 'ion-button',
styleUrl: 'button.css',
preprocessStyles: [
'button.scss'
]
})
], IonButton);
class IonContent extends IonElement {
render() {
return h('.content');
}
}
class IonHeader extends IonElement {
render() {
return h('.header');
}
}
class IonItem extends IonElement {
render() {
return h('.item', [
h('slot', { select: '[item-left],ion-checkbox:not([item-right])' }),
h('div.item-inner', [
h('div.input-wrapper', [
h('ion-label', [
h('slot')
]),
h('slot', { select: 'ion-select,ion-input,ion-textarea,ion-datetime,ion-range,[item-content]' })
]),
h('slot', { select: '[item-right],ion-radio,ion-toggle' }),
h('ion-reorder')
]),
h('button-effect')
]);
}
}
class IonList extends IonElement {
render() {
return h('.list');
}
}
class IonTitle extends IonElement {
render() {
return h('.title');
}
}
class IonToolbar extends IonElement {
render() {
return h('.toolbar');
}
}
if (!customElements) {
throw new Error('Ionic requires custom element support');
}
defineElements(window, {
'ion-app': IonApp,
'ion-badge': IonBadge,
'ion-button': IonButton,
'ion-content': IonContent,
'ion-header': IonHeader,
'ion-icon': IonIcon,
'ion-item': IonItem,
'ion-list': IonList,
'ion-scroll': IonScroll,
'ion-title': IonTitle,
'ion-toolbar': IonToolbar
});
})));