|
|
|
function none() { |
|
} |
|
function selector_default(selector) { |
|
return selector == null ? none : function() { |
|
return this.querySelector(selector); |
|
}; |
|
} |
|
|
|
|
|
function select_default(select) { |
|
if (typeof select !== "function") select = selector_default(select); |
|
for (var groups = this._groups, m = groups.length, subgroups = new Array(m), j = 0; j < m; ++j) { |
|
for (var group = groups[j], n = group.length, subgroup = subgroups[j] = new Array(n), node, subnode, i = 0; i < n; ++i) { |
|
if ((node = group[i]) && (subnode = select.call(node, node.__data__, i, group))) { |
|
if ("__data__" in node) subnode.__data__ = node.__data__; |
|
subgroup[i] = subnode; |
|
} |
|
} |
|
} |
|
return new Selection(subgroups, this._parents); |
|
} |
|
|
|
|
|
function array(x) { |
|
return x == null ? [] : Array.isArray(x) ? x : Array.from(x); |
|
} |
|
|
|
|
|
function empty() { |
|
return []; |
|
} |
|
function selectorAll_default(selector) { |
|
return selector == null ? empty : function() { |
|
return this.querySelectorAll(selector); |
|
}; |
|
} |
|
|
|
|
|
function arrayAll(select) { |
|
return function() { |
|
return array(select.apply(this, arguments)); |
|
}; |
|
} |
|
function selectAll_default(select) { |
|
if (typeof select === "function") select = arrayAll(select); |
|
else select = selectorAll_default(select); |
|
for (var groups = this._groups, m = groups.length, subgroups = [], parents = [], j = 0; j < m; ++j) { |
|
for (var group = groups[j], n = group.length, node, i = 0; i < n; ++i) { |
|
if (node = group[i]) { |
|
subgroups.push(select.call(node, node.__data__, i, group)); |
|
parents.push(node); |
|
} |
|
} |
|
} |
|
return new Selection(subgroups, parents); |
|
} |
|
|
|
|
|
function matcher_default(selector) { |
|
return function() { |
|
return this.matches(selector); |
|
}; |
|
} |
|
function childMatcher(selector) { |
|
return function(node) { |
|
return node.matches(selector); |
|
}; |
|
} |
|
|
|
|
|
var find = Array.prototype.find; |
|
function childFind(match) { |
|
return function() { |
|
return find.call(this.children, match); |
|
}; |
|
} |
|
function childFirst() { |
|
return this.firstElementChild; |
|
} |
|
function selectChild_default(match) { |
|
return this.select(match == null ? childFirst : childFind(typeof match === "function" ? match : childMatcher(match))); |
|
} |
|
|
|
|
|
var filter = Array.prototype.filter; |
|
function children() { |
|
return Array.from(this.children); |
|
} |
|
function childrenFilter(match) { |
|
return function() { |
|
return filter.call(this.children, match); |
|
}; |
|
} |
|
function selectChildren_default(match) { |
|
return this.selectAll(match == null ? children : childrenFilter(typeof match === "function" ? match : childMatcher(match))); |
|
} |
|
|
|
|
|
function filter_default(match) { |
|
if (typeof match !== "function") match = matcher_default(match); |
|
for (var groups = this._groups, m = groups.length, subgroups = new Array(m), j = 0; j < m; ++j) { |
|
for (var group = groups[j], n = group.length, subgroup = subgroups[j] = [], node, i = 0; i < n; ++i) { |
|
if ((node = group[i]) && match.call(node, node.__data__, i, group)) { |
|
subgroup.push(node); |
|
} |
|
} |
|
} |
|
return new Selection(subgroups, this._parents); |
|
} |
|
|
|
|
|
function sparse_default(update) { |
|
return new Array(update.length); |
|
} |
|
|
|
|
|
function enter_default() { |
|
return new Selection(this._enter || this._groups.map(sparse_default), this._parents); |
|
} |
|
function EnterNode(parent, datum2) { |
|
this.ownerDocument = parent.ownerDocument; |
|
this.namespaceURI = parent.namespaceURI; |
|
this._next = null; |
|
this._parent = parent; |
|
this.__data__ = datum2; |
|
} |
|
EnterNode.prototype = { |
|
constructor: EnterNode, |
|
appendChild: function(child) { |
|
return this._parent.insertBefore(child, this._next); |
|
}, |
|
insertBefore: function(child, next) { |
|
return this._parent.insertBefore(child, next); |
|
}, |
|
querySelector: function(selector) { |
|
return this._parent.querySelector(selector); |
|
}, |
|
querySelectorAll: function(selector) { |
|
return this._parent.querySelectorAll(selector); |
|
} |
|
}; |
|
|
|
|
|
function constant_default(x) { |
|
return function() { |
|
return x; |
|
}; |
|
} |
|
|
|
|
|
function bindIndex(parent, group, enter, update, exit, data) { |
|
var i = 0, node, groupLength = group.length, dataLength = data.length; |
|
for (; i < dataLength; ++i) { |
|
if (node = group[i]) { |
|
node.__data__ = data[i]; |
|
update[i] = node; |
|
} else { |
|
enter[i] = new EnterNode(parent, data[i]); |
|
} |
|
} |
|
for (; i < groupLength; ++i) { |
|
if (node = group[i]) { |
|
exit[i] = node; |
|
} |
|
} |
|
} |
|
function bindKey(parent, group, enter, update, exit, data, key) { |
|
var i, node, nodeByKeyValue = new Map(), groupLength = group.length, dataLength = data.length, keyValues = new Array(groupLength), keyValue; |
|
for (i = 0; i < groupLength; ++i) { |
|
if (node = group[i]) { |
|
keyValues[i] = keyValue = key.call(node, node.__data__, i, group) + ""; |
|
if (nodeByKeyValue.has(keyValue)) { |
|
exit[i] = node; |
|
} else { |
|
nodeByKeyValue.set(keyValue, node); |
|
} |
|
} |
|
} |
|
for (i = 0; i < dataLength; ++i) { |
|
keyValue = key.call(parent, data[i], i, data) + ""; |
|
if (node = nodeByKeyValue.get(keyValue)) { |
|
update[i] = node; |
|
node.__data__ = data[i]; |
|
nodeByKeyValue.delete(keyValue); |
|
} else { |
|
enter[i] = new EnterNode(parent, data[i]); |
|
} |
|
} |
|
for (i = 0; i < groupLength; ++i) { |
|
if ((node = group[i]) && nodeByKeyValue.get(keyValues[i]) === node) { |
|
exit[i] = node; |
|
} |
|
} |
|
} |
|
function datum(node) { |
|
return node.__data__; |
|
} |
|
function data_default(value, key) { |
|
if (!arguments.length) return Array.from(this, datum); |
|
var bind = key ? bindKey : bindIndex, parents = this._parents, groups = this._groups; |
|
if (typeof value !== "function") value = constant_default(value); |
|
for (var m = groups.length, update = new Array(m), enter = new Array(m), exit = new Array(m), j = 0; j < m; ++j) { |
|
var parent = parents[j], group = groups[j], groupLength = group.length, data = arraylike(value.call(parent, parent && parent.__data__, j, parents)), dataLength = data.length, enterGroup = enter[j] = new Array(dataLength), updateGroup = update[j] = new Array(dataLength), exitGroup = exit[j] = new Array(groupLength); |
|
bind(parent, group, enterGroup, updateGroup, exitGroup, data, key); |
|
for (var i0 = 0, i1 = 0, previous, next; i0 < dataLength; ++i0) { |
|
if (previous = enterGroup[i0]) { |
|
if (i0 >= i1) i1 = i0 + 1; |
|
while (!(next = updateGroup[i1]) && ++i1 < dataLength) ; |
|
previous._next = next || null; |
|
} |
|
} |
|
} |
|
update = new Selection(update, parents); |
|
update._enter = enter; |
|
update._exit = exit; |
|
return update; |
|
} |
|
function arraylike(data) { |
|
return typeof data === "object" && "length" in data ? data : Array.from(data); |
|
} |
|
|
|
|
|
function exit_default() { |
|
return new Selection(this._exit || this._groups.map(sparse_default), this._parents); |
|
} |
|
|
|
|
|
function join_default(onenter, onupdate, onexit) { |
|
var enter = this.enter(), update = this, exit = this.exit(); |
|
if (typeof onenter === "function") { |
|
enter = onenter(enter); |
|
if (enter) enter = enter.selection(); |
|
} else { |
|
enter = enter.append(onenter + ""); |
|
} |
|
if (onupdate != null) { |
|
update = onupdate(update); |
|
if (update) update = update.selection(); |
|
} |
|
if (onexit == null) exit.remove(); |
|
else onexit(exit); |
|
return enter && update ? enter.merge(update).order() : update; |
|
} |
|
|
|
|
|
function merge_default(context) { |
|
var selection2 = context.selection ? context.selection() : context; |
|
for (var groups0 = this._groups, groups1 = selection2._groups, m0 = groups0.length, m1 = groups1.length, m = Math.min(m0, m1), merges = new Array(m0), j = 0; j < m; ++j) { |
|
for (var group0 = groups0[j], group1 = groups1[j], n = group0.length, merge = merges[j] = new Array(n), node, i = 0; i < n; ++i) { |
|
if (node = group0[i] || group1[i]) { |
|
merge[i] = node; |
|
} |
|
} |
|
} |
|
for (; j < m0; ++j) { |
|
merges[j] = groups0[j]; |
|
} |
|
return new Selection(merges, this._parents); |
|
} |
|
|
|
|
|
function order_default() { |
|
for (var groups = this._groups, j = -1, m = groups.length; ++j < m; ) { |
|
for (var group = groups[j], i = group.length - 1, next = group[i], node; --i >= 0; ) { |
|
if (node = group[i]) { |
|
if (next && node.compareDocumentPosition(next) ^ 4) next.parentNode.insertBefore(node, next); |
|
next = node; |
|
} |
|
} |
|
} |
|
return this; |
|
} |
|
|
|
|
|
function sort_default(compare) { |
|
if (!compare) compare = ascending; |
|
function compareNode(a, b) { |
|
return a && b ? compare(a.__data__, b.__data__) : !a - !b; |
|
} |
|
for (var groups = this._groups, m = groups.length, sortgroups = new Array(m), j = 0; j < m; ++j) { |
|
for (var group = groups[j], n = group.length, sortgroup = sortgroups[j] = new Array(n), node, i = 0; i < n; ++i) { |
|
if (node = group[i]) { |
|
sortgroup[i] = node; |
|
} |
|
} |
|
sortgroup.sort(compareNode); |
|
} |
|
return new Selection(sortgroups, this._parents).order(); |
|
} |
|
function ascending(a, b) { |
|
return a < b ? -1 : a > b ? 1 : a >= b ? 0 : NaN; |
|
} |
|
|
|
|
|
function call_default() { |
|
var callback = arguments[0]; |
|
arguments[0] = this; |
|
callback.apply(null, arguments); |
|
return this; |
|
} |
|
|
|
|
|
function nodes_default() { |
|
return Array.from(this); |
|
} |
|
|
|
|
|
function node_default() { |
|
for (var groups = this._groups, j = 0, m = groups.length; j < m; ++j) { |
|
for (var group = groups[j], i = 0, n = group.length; i < n; ++i) { |
|
var node = group[i]; |
|
if (node) return node; |
|
} |
|
} |
|
return null; |
|
} |
|
|
|
|
|
function size_default() { |
|
let size = 0; |
|
for (const node of this) ++size; |
|
return size; |
|
} |
|
|
|
|
|
function empty_default() { |
|
return !this.node(); |
|
} |
|
|
|
|
|
function each_default(callback) { |
|
for (var groups = this._groups, j = 0, m = groups.length; j < m; ++j) { |
|
for (var group = groups[j], i = 0, n = group.length, node; i < n; ++i) { |
|
if (node = group[i]) callback.call(node, node.__data__, i, group); |
|
} |
|
} |
|
return this; |
|
} |
|
|
|
|
|
var xhtml = "http://www.w3.org/1999/xhtml"; |
|
var namespaces_default = { |
|
svg: "http://www.w3.org/2000/svg", |
|
xhtml, |
|
xlink: "http://www.w3.org/1999/xlink", |
|
xml: "http://www.w3.org/XML/1998/namespace", |
|
xmlns: "http://www.w3.org/2000/xmlns/" |
|
}; |
|
|
|
|
|
function namespace_default(name) { |
|
var prefix = name += "", i = prefix.indexOf(":"); |
|
if (i >= 0 && (prefix = name.slice(0, i)) !== "xmlns") name = name.slice(i + 1); |
|
return namespaces_default.hasOwnProperty(prefix) ? { space: namespaces_default[prefix], local: name } : name; |
|
} |
|
|
|
|
|
function attrRemove(name) { |
|
return function() { |
|
this.removeAttribute(name); |
|
}; |
|
} |
|
function attrRemoveNS(fullname) { |
|
return function() { |
|
this.removeAttributeNS(fullname.space, fullname.local); |
|
}; |
|
} |
|
function attrConstant(name, value) { |
|
return function() { |
|
this.setAttribute(name, value); |
|
}; |
|
} |
|
function attrConstantNS(fullname, value) { |
|
return function() { |
|
this.setAttributeNS(fullname.space, fullname.local, value); |
|
}; |
|
} |
|
function attrFunction(name, value) { |
|
return function() { |
|
var v = value.apply(this, arguments); |
|
if (v == null) this.removeAttribute(name); |
|
else this.setAttribute(name, v); |
|
}; |
|
} |
|
function attrFunctionNS(fullname, value) { |
|
return function() { |
|
var v = value.apply(this, arguments); |
|
if (v == null) this.removeAttributeNS(fullname.space, fullname.local); |
|
else this.setAttributeNS(fullname.space, fullname.local, v); |
|
}; |
|
} |
|
function attr_default(name, value) { |
|
var fullname = namespace_default(name); |
|
if (arguments.length < 2) { |
|
var node = this.node(); |
|
return fullname.local ? node.getAttributeNS(fullname.space, fullname.local) : node.getAttribute(fullname); |
|
} |
|
return this.each((value == null ? fullname.local ? attrRemoveNS : attrRemove : typeof value === "function" ? fullname.local ? attrFunctionNS : attrFunction : fullname.local ? attrConstantNS : attrConstant)(fullname, value)); |
|
} |
|
|
|
|
|
function window_default(node) { |
|
return node.ownerDocument && node.ownerDocument.defaultView || node.document && node || node.defaultView; |
|
} |
|
|
|
|
|
function styleRemove(name) { |
|
return function() { |
|
this.style.removeProperty(name); |
|
}; |
|
} |
|
function styleConstant(name, value, priority) { |
|
return function() { |
|
this.style.setProperty(name, value, priority); |
|
}; |
|
} |
|
function styleFunction(name, value, priority) { |
|
return function() { |
|
var v = value.apply(this, arguments); |
|
if (v == null) this.style.removeProperty(name); |
|
else this.style.setProperty(name, v, priority); |
|
}; |
|
} |
|
function style_default(name, value, priority) { |
|
return arguments.length > 1 ? this.each((value == null ? styleRemove : typeof value === "function" ? styleFunction : styleConstant)(name, value, priority == null ? "" : priority)) : styleValue(this.node(), name); |
|
} |
|
function styleValue(node, name) { |
|
return node.style.getPropertyValue(name) || window_default(node).getComputedStyle(node, null).getPropertyValue(name); |
|
} |
|
|
|
|
|
function propertyRemove(name) { |
|
return function() { |
|
delete this[name]; |
|
}; |
|
} |
|
function propertyConstant(name, value) { |
|
return function() { |
|
this[name] = value; |
|
}; |
|
} |
|
function propertyFunction(name, value) { |
|
return function() { |
|
var v = value.apply(this, arguments); |
|
if (v == null) delete this[name]; |
|
else this[name] = v; |
|
}; |
|
} |
|
function property_default(name, value) { |
|
return arguments.length > 1 ? this.each((value == null ? propertyRemove : typeof value === "function" ? propertyFunction : propertyConstant)(name, value)) : this.node()[name]; |
|
} |
|
|
|
|
|
function classArray(string) { |
|
return string.trim().split(/^|\s+/); |
|
} |
|
function classList(node) { |
|
return node.classList || new ClassList(node); |
|
} |
|
function ClassList(node) { |
|
this._node = node; |
|
this._names = classArray(node.getAttribute("class") || ""); |
|
} |
|
ClassList.prototype = { |
|
add: function(name) { |
|
var i = this._names.indexOf(name); |
|
if (i < 0) { |
|
this._names.push(name); |
|
this._node.setAttribute("class", this._names.join(" ")); |
|
} |
|
}, |
|
remove: function(name) { |
|
var i = this._names.indexOf(name); |
|
if (i >= 0) { |
|
this._names.splice(i, 1); |
|
this._node.setAttribute("class", this._names.join(" ")); |
|
} |
|
}, |
|
contains: function(name) { |
|
return this._names.indexOf(name) >= 0; |
|
} |
|
}; |
|
function classedAdd(node, names) { |
|
var list = classList(node), i = -1, n = names.length; |
|
while (++i < n) list.add(names[i]); |
|
} |
|
function classedRemove(node, names) { |
|
var list = classList(node), i = -1, n = names.length; |
|
while (++i < n) list.remove(names[i]); |
|
} |
|
function classedTrue(names) { |
|
return function() { |
|
classedAdd(this, names); |
|
}; |
|
} |
|
function classedFalse(names) { |
|
return function() { |
|
classedRemove(this, names); |
|
}; |
|
} |
|
function classedFunction(names, value) { |
|
return function() { |
|
(value.apply(this, arguments) ? classedAdd : classedRemove)(this, names); |
|
}; |
|
} |
|
function classed_default(name, value) { |
|
var names = classArray(name + ""); |
|
if (arguments.length < 2) { |
|
var list = classList(this.node()), i = -1, n = names.length; |
|
while (++i < n) if (!list.contains(names[i])) return false; |
|
return true; |
|
} |
|
return this.each((typeof value === "function" ? classedFunction : value ? classedTrue : classedFalse)(names, value)); |
|
} |
|
|
|
|
|
function textRemove() { |
|
this.textContent = ""; |
|
} |
|
function textConstant(value) { |
|
return function() { |
|
this.textContent = value; |
|
}; |
|
} |
|
function textFunction(value) { |
|
return function() { |
|
var v = value.apply(this, arguments); |
|
this.textContent = v == null ? "" : v; |
|
}; |
|
} |
|
function text_default(value) { |
|
return arguments.length ? this.each(value == null ? textRemove : (typeof value === "function" ? textFunction : textConstant)(value)) : this.node().textContent; |
|
} |
|
|
|
|
|
function htmlRemove() { |
|
this.innerHTML = ""; |
|
} |
|
function htmlConstant(value) { |
|
return function() { |
|
this.innerHTML = value; |
|
}; |
|
} |
|
function htmlFunction(value) { |
|
return function() { |
|
var v = value.apply(this, arguments); |
|
this.innerHTML = v == null ? "" : v; |
|
}; |
|
} |
|
function html_default(value) { |
|
return arguments.length ? this.each(value == null ? htmlRemove : (typeof value === "function" ? htmlFunction : htmlConstant)(value)) : this.node().innerHTML; |
|
} |
|
|
|
|
|
function raise() { |
|
if (this.nextSibling) this.parentNode.appendChild(this); |
|
} |
|
function raise_default() { |
|
return this.each(raise); |
|
} |
|
|
|
|
|
function lower() { |
|
if (this.previousSibling) this.parentNode.insertBefore(this, this.parentNode.firstChild); |
|
} |
|
function lower_default() { |
|
return this.each(lower); |
|
} |
|
|
|
|
|
function creatorInherit(name) { |
|
return function() { |
|
var document2 = this.ownerDocument, uri = this.namespaceURI; |
|
return uri === xhtml && document2.documentElement.namespaceURI === xhtml ? document2.createElement(name) : document2.createElementNS(uri, name); |
|
}; |
|
} |
|
function creatorFixed(fullname) { |
|
return function() { |
|
return this.ownerDocument.createElementNS(fullname.space, fullname.local); |
|
}; |
|
} |
|
function creator_default(name) { |
|
var fullname = namespace_default(name); |
|
return (fullname.local ? creatorFixed : creatorInherit)(fullname); |
|
} |
|
|
|
|
|
function append_default(name) { |
|
var create2 = typeof name === "function" ? name : creator_default(name); |
|
return this.select(function() { |
|
return this.appendChild(create2.apply(this, arguments)); |
|
}); |
|
} |
|
|
|
|
|
function constantNull() { |
|
return null; |
|
} |
|
function insert_default(name, before) { |
|
var create2 = typeof name === "function" ? name : creator_default(name), select = before == null ? constantNull : typeof before === "function" ? before : selector_default(before); |
|
return this.select(function() { |
|
return this.insertBefore(create2.apply(this, arguments), select.apply(this, arguments) || null); |
|
}); |
|
} |
|
|
|
|
|
function remove() { |
|
var parent = this.parentNode; |
|
if (parent) parent.removeChild(this); |
|
} |
|
function remove_default() { |
|
return this.each(remove); |
|
} |
|
|
|
|
|
function selection_cloneShallow() { |
|
var clone = this.cloneNode(false), parent = this.parentNode; |
|
return parent ? parent.insertBefore(clone, this.nextSibling) : clone; |
|
} |
|
function selection_cloneDeep() { |
|
var clone = this.cloneNode(true), parent = this.parentNode; |
|
return parent ? parent.insertBefore(clone, this.nextSibling) : clone; |
|
} |
|
function clone_default(deep) { |
|
return this.select(deep ? selection_cloneDeep : selection_cloneShallow); |
|
} |
|
|
|
|
|
function datum_default(value) { |
|
return arguments.length ? this.property("__data__", value) : this.node().__data__; |
|
} |
|
|
|
|
|
function contextListener(listener) { |
|
return function(event) { |
|
listener.call(this, event, this.__data__); |
|
}; |
|
} |
|
function parseTypenames(typenames) { |
|
return typenames.trim().split(/^|\s+/).map(function(t) { |
|
var name = "", i = t.indexOf("."); |
|
if (i >= 0) name = t.slice(i + 1), t = t.slice(0, i); |
|
return { type: t, name }; |
|
}); |
|
} |
|
function onRemove(typename) { |
|
return function() { |
|
var on = this.__on; |
|
if (!on) return; |
|
for (var j = 0, i = -1, m = on.length, o; j < m; ++j) { |
|
if (o = on[j], (!typename.type || o.type === typename.type) && o.name === typename.name) { |
|
this.removeEventListener(o.type, o.listener, o.options); |
|
} else { |
|
on[++i] = o; |
|
} |
|
} |
|
if (++i) on.length = i; |
|
else delete this.__on; |
|
}; |
|
} |
|
function onAdd(typename, value, options) { |
|
return function() { |
|
var on = this.__on, o, listener = contextListener(value); |
|
if (on) for (var j = 0, m = on.length; j < m; ++j) { |
|
if ((o = on[j]).type === typename.type && o.name === typename.name) { |
|
this.removeEventListener(o.type, o.listener, o.options); |
|
this.addEventListener(o.type, o.listener = listener, o.options = options); |
|
o.value = value; |
|
return; |
|
} |
|
} |
|
this.addEventListener(typename.type, listener, options); |
|
o = { type: typename.type, name: typename.name, value, listener, options }; |
|
if (!on) this.__on = [o]; |
|
else on.push(o); |
|
}; |
|
} |
|
function on_default(typename, value, options) { |
|
var typenames = parseTypenames(typename + ""), i, n = typenames.length, t; |
|
if (arguments.length < 2) { |
|
var on = this.node().__on; |
|
if (on) for (var j = 0, m = on.length, o; j < m; ++j) { |
|
for (i = 0, o = on[j]; i < n; ++i) { |
|
if ((t = typenames[i]).type === o.type && t.name === o.name) { |
|
return o.value; |
|
} |
|
} |
|
} |
|
return; |
|
} |
|
on = value ? onAdd : onRemove; |
|
for (i = 0; i < n; ++i) this.each(on(typenames[i], value, options)); |
|
return this; |
|
} |
|
|
|
|
|
function dispatchEvent(node, type, params) { |
|
var window2 = window_default(node), event = window2.CustomEvent; |
|
if (typeof event === "function") { |
|
event = new event(type, params); |
|
} else { |
|
event = window2.document.createEvent("Event"); |
|
if (params) event.initEvent(type, params.bubbles, params.cancelable), event.detail = params.detail; |
|
else event.initEvent(type, false, false); |
|
} |
|
node.dispatchEvent(event); |
|
} |
|
function dispatchConstant(type, params) { |
|
return function() { |
|
return dispatchEvent(this, type, params); |
|
}; |
|
} |
|
function dispatchFunction(type, params) { |
|
return function() { |
|
return dispatchEvent(this, type, params.apply(this, arguments)); |
|
}; |
|
} |
|
function dispatch_default(type, params) { |
|
return this.each((typeof params === "function" ? dispatchFunction : dispatchConstant)(type, params)); |
|
} |
|
|
|
|
|
function* iterator_default() { |
|
for (var groups = this._groups, j = 0, m = groups.length; j < m; ++j) { |
|
for (var group = groups[j], i = 0, n = group.length, node; i < n; ++i) { |
|
if (node = group[i]) yield node; |
|
} |
|
} |
|
} |
|
|
|
|
|
var root = [null]; |
|
function Selection(groups, parents) { |
|
this._groups = groups; |
|
this._parents = parents; |
|
} |
|
function selection() { |
|
return new Selection([[document.documentElement]], root); |
|
} |
|
function selection_selection() { |
|
return this; |
|
} |
|
Selection.prototype = selection.prototype = { |
|
constructor: Selection, |
|
select: select_default, |
|
selectAll: selectAll_default, |
|
selectChild: selectChild_default, |
|
selectChildren: selectChildren_default, |
|
filter: filter_default, |
|
data: data_default, |
|
enter: enter_default, |
|
exit: exit_default, |
|
join: join_default, |
|
merge: merge_default, |
|
selection: selection_selection, |
|
order: order_default, |
|
sort: sort_default, |
|
call: call_default, |
|
nodes: nodes_default, |
|
node: node_default, |
|
size: size_default, |
|
empty: empty_default, |
|
each: each_default, |
|
attr: attr_default, |
|
style: style_default, |
|
property: property_default, |
|
classed: classed_default, |
|
text: text_default, |
|
html: html_default, |
|
raise: raise_default, |
|
lower: lower_default, |
|
append: append_default, |
|
insert: insert_default, |
|
remove: remove_default, |
|
clone: clone_default, |
|
datum: datum_default, |
|
on: on_default, |
|
dispatch: dispatch_default, |
|
[Symbol.iterator]: iterator_default |
|
}; |
|
var selection_default = selection; |
|
|
|
|
|
function select_default2(selector) { |
|
return typeof selector === "string" ? new Selection([[document.querySelector(selector)]], [document.documentElement]) : new Selection([[selector]], root); |
|
} |
|
|
|
|
|
function selectAll_default2(selector) { |
|
return typeof selector === "string" ? new Selection([document.querySelectorAll(selector)], [document.documentElement]) : new Selection([array(selector)], root); |
|
} |
|
|
|
|
|
var nextId = 0; |
|
function local() { |
|
return new Local(); |
|
} |
|
function Local() { |
|
this._ = "@" + (++nextId).toString(36); |
|
} |
|
Local.prototype = local.prototype = { |
|
constructor: Local, |
|
get: function(node) { |
|
var id2 = this._; |
|
while (!(id2 in node)) if (!(node = node.parentNode)) return; |
|
return node[id2]; |
|
}, |
|
set: function(node, value) { |
|
return node[this._] = value; |
|
}, |
|
remove: function(node) { |
|
return this._ in node && delete node[this._]; |
|
}, |
|
toString: function() { |
|
return this._; |
|
} |
|
}; |
|
|
|
|
|
function sourceEvent_default(event) { |
|
let sourceEvent; |
|
while (sourceEvent = event.sourceEvent) event = sourceEvent; |
|
return event; |
|
} |
|
|
|
|
|
function pointer_default(event, node) { |
|
event = sourceEvent_default(event); |
|
if (node === void 0) node = event.currentTarget; |
|
if (node) { |
|
var svg = node.ownerSVGElement || node; |
|
if (svg.createSVGPoint) { |
|
var point = svg.createSVGPoint(); |
|
point.x = event.clientX, point.y = event.clientY; |
|
point = point.matrixTransform(node.getScreenCTM().inverse()); |
|
return [point.x, point.y]; |
|
} |
|
if (node.getBoundingClientRect) { |
|
var rect = node.getBoundingClientRect(); |
|
return [event.clientX - rect.left - node.clientLeft, event.clientY - rect.top - node.clientTop]; |
|
} |
|
} |
|
return [event.pageX, event.pageY]; |
|
} |
|
|
|
|
|
function define_default(constructor, factory, prototype) { |
|
constructor.prototype = factory.prototype = prototype; |
|
prototype.constructor = constructor; |
|
} |
|
function extend(parent, definition) { |
|
var prototype = Object.create(parent.prototype); |
|
for (var key in definition) prototype[key] = definition[key]; |
|
return prototype; |
|
} |
|
|
|
|
|
function Color() { |
|
} |
|
var darker = 0.7; |
|
var brighter = 1 / darker; |
|
var reI = "\\s*([+-]?\\d+)\\s*"; |
|
var reN = "\\s*([+-]?(?:\\d*\\.)?\\d+(?:[eE][+-]?\\d+)?)\\s*"; |
|
var reP = "\\s*([+-]?(?:\\d*\\.)?\\d+(?:[eE][+-]?\\d+)?)%\\s*"; |
|
var reHex = /^#([0-9a-f]{3,8})$/; |
|
var reRgbInteger = new RegExp(`^rgb\\(${reI},${reI},${reI}\\)$`); |
|
var reRgbPercent = new RegExp(`^rgb\\(${reP},${reP},${reP}\\)$`); |
|
var reRgbaInteger = new RegExp(`^rgba\\(${reI},${reI},${reI},${reN}\\)$`); |
|
var reRgbaPercent = new RegExp(`^rgba\\(${reP},${reP},${reP},${reN}\\)$`); |
|
var reHslPercent = new RegExp(`^hsl\\(${reN},${reP},${reP}\\)$`); |
|
var reHslaPercent = new RegExp(`^hsla\\(${reN},${reP},${reP},${reN}\\)$`); |
|
var named = { |
|
aliceblue: 15792383, |
|
antiquewhite: 16444375, |
|
aqua: 65535, |
|
aquamarine: 8388564, |
|
azure: 15794175, |
|
beige: 16119260, |
|
bisque: 16770244, |
|
black: 0, |
|
blanchedalmond: 16772045, |
|
blue: 255, |
|
blueviolet: 9055202, |
|
brown: 10824234, |
|
burlywood: 14596231, |
|
cadetblue: 6266528, |
|
chartreuse: 8388352, |
|
chocolate: 13789470, |
|
coral: 16744272, |
|
cornflowerblue: 6591981, |
|
cornsilk: 16775388, |
|
crimson: 14423100, |
|
cyan: 65535, |
|
darkblue: 139, |
|
darkcyan: 35723, |
|
darkgoldenrod: 12092939, |
|
darkgray: 11119017, |
|
darkgreen: 25600, |
|
darkgrey: 11119017, |
|
darkkhaki: 12433259, |
|
darkmagenta: 9109643, |
|
darkolivegreen: 5597999, |
|
darkorange: 16747520, |
|
darkorchid: 10040012, |
|
darkred: 9109504, |
|
darksalmon: 15308410, |
|
darkseagreen: 9419919, |
|
darkslateblue: 4734347, |
|
darkslategray: 3100495, |
|
darkslategrey: 3100495, |
|
darkturquoise: 52945, |
|
darkviolet: 9699539, |
|
deeppink: 16716947, |
|
deepskyblue: 49151, |
|
dimgray: 6908265, |
|
dimgrey: 6908265, |
|
dodgerblue: 2003199, |
|
firebrick: 11674146, |
|
floralwhite: 16775920, |
|
forestgreen: 2263842, |
|
fuchsia: 16711935, |
|
gainsboro: 14474460, |
|
ghostwhite: 16316671, |
|
gold: 16766720, |
|
goldenrod: 14329120, |
|
gray: 8421504, |
|
green: 32768, |
|
greenyellow: 11403055, |
|
grey: 8421504, |
|
honeydew: 15794160, |
|
hotpink: 16738740, |
|
indianred: 13458524, |
|
indigo: 4915330, |
|
ivory: 16777200, |
|
khaki: 15787660, |
|
lavender: 15132410, |
|
lavenderblush: 16773365, |
|
lawngreen: 8190976, |
|
lemonchiffon: 16775885, |
|
lightblue: 11393254, |
|
lightcoral: 15761536, |
|
lightcyan: 14745599, |
|
lightgoldenrodyellow: 16448210, |
|
lightgray: 13882323, |
|
lightgreen: 9498256, |
|
lightgrey: 13882323, |
|
lightpink: 16758465, |
|
lightsalmon: 16752762, |
|
lightseagreen: 2142890, |
|
lightskyblue: 8900346, |
|
lightslategray: 7833753, |
|
lightslategrey: 7833753, |
|
lightsteelblue: 11584734, |
|
lightyellow: 16777184, |
|
lime: 65280, |
|
limegreen: 3329330, |
|
linen: 16445670, |
|
magenta: 16711935, |
|
maroon: 8388608, |
|
mediumaquamarine: 6737322, |
|
mediumblue: 205, |
|
mediumorchid: 12211667, |
|
mediumpurple: 9662683, |
|
mediumseagreen: 3978097, |
|
mediumslateblue: 8087790, |
|
mediumspringgreen: 64154, |
|
mediumturquoise: 4772300, |
|
mediumvioletred: 13047173, |
|
midnightblue: 1644912, |
|
mintcream: 16121850, |
|
mistyrose: 16770273, |
|
moccasin: 16770229, |
|
navajowhite: 16768685, |
|
navy: 128, |
|
oldlace: 16643558, |
|
olive: 8421376, |
|
olivedrab: 7048739, |
|
orange: 16753920, |
|
orangered: 16729344, |
|
orchid: 14315734, |
|
palegoldenrod: 15657130, |
|
palegreen: 10025880, |
|
paleturquoise: 11529966, |
|
palevioletred: 14381203, |
|
papayawhip: 16773077, |
|
peachpuff: 16767673, |
|
peru: 13468991, |
|
pink: 16761035, |
|
plum: 14524637, |
|
powderblue: 11591910, |
|
purple: 8388736, |
|
rebeccapurple: 6697881, |
|
red: 16711680, |
|
rosybrown: 12357519, |
|
royalblue: 4286945, |
|
saddlebrown: 9127187, |
|
salmon: 16416882, |
|
sandybrown: 16032864, |
|
seagreen: 3050327, |
|
seashell: 16774638, |
|
sienna: 10506797, |
|
silver: 12632256, |
|
skyblue: 8900331, |
|
slateblue: 6970061, |
|
slategray: 7372944, |
|
slategrey: 7372944, |
|
snow: 16775930, |
|
springgreen: 65407, |
|
steelblue: 4620980, |
|
tan: 13808780, |
|
teal: 32896, |
|
thistle: 14204888, |
|
tomato: 16737095, |
|
turquoise: 4251856, |
|
violet: 15631086, |
|
wheat: 16113331, |
|
white: 16777215, |
|
whitesmoke: 16119285, |
|
yellow: 16776960, |
|
yellowgreen: 10145074 |
|
}; |
|
define_default(Color, color, { |
|
copy(channels) { |
|
return Object.assign(new this.constructor(), this, channels); |
|
}, |
|
displayable() { |
|
return this.rgb().displayable(); |
|
}, |
|
hex: color_formatHex, |
|
|
|
formatHex: color_formatHex, |
|
formatHex8: color_formatHex8, |
|
formatHsl: color_formatHsl, |
|
formatRgb: color_formatRgb, |
|
toString: color_formatRgb |
|
}); |
|
function color_formatHex() { |
|
return this.rgb().formatHex(); |
|
} |
|
function color_formatHex8() { |
|
return this.rgb().formatHex8(); |
|
} |
|
function color_formatHsl() { |
|
return hslConvert(this).formatHsl(); |
|
} |
|
function color_formatRgb() { |
|
return this.rgb().formatRgb(); |
|
} |
|
function color(format) { |
|
var m, l; |
|
format = (format + "").trim().toLowerCase(); |
|
return (m = reHex.exec(format)) ? (l = m[1].length, m = parseInt(m[1], 16), l === 6 ? rgbn(m) : l === 3 ? new Rgb(m >> 8 & 15 | m >> 4 & 240, m >> 4 & 15 | m & 240, (m & 15) << 4 | m & 15, 1) : l === 8 ? rgba(m >> 24 & 255, m >> 16 & 255, m >> 8 & 255, (m & 255) / 255) : l === 4 ? rgba(m >> 12 & 15 | m >> 8 & 240, m >> 8 & 15 | m >> 4 & 240, m >> 4 & 15 | m & 240, ((m & 15) << 4 | m & 15) / 255) : null) : (m = reRgbInteger.exec(format)) ? new Rgb(m[1], m[2], m[3], 1) : (m = reRgbPercent.exec(format)) ? new Rgb(m[1] * 255 / 100, m[2] * 255 / 100, m[3] * 255 / 100, 1) : (m = reRgbaInteger.exec(format)) ? rgba(m[1], m[2], m[3], m[4]) : (m = reRgbaPercent.exec(format)) ? rgba(m[1] * 255 / 100, m[2] * 255 / 100, m[3] * 255 / 100, m[4]) : (m = reHslPercent.exec(format)) ? hsla(m[1], m[2] / 100, m[3] / 100, 1) : (m = reHslaPercent.exec(format)) ? hsla(m[1], m[2] / 100, m[3] / 100, m[4]) : named.hasOwnProperty(format) ? rgbn(named[format]) : format === "transparent" ? new Rgb(NaN, NaN, NaN, 0) : null; |
|
} |
|
function rgbn(n) { |
|
return new Rgb(n >> 16 & 255, n >> 8 & 255, n & 255, 1); |
|
} |
|
function rgba(r, g, b, a) { |
|
if (a <= 0) r = g = b = NaN; |
|
return new Rgb(r, g, b, a); |
|
} |
|
function rgbConvert(o) { |
|
if (!(o instanceof Color)) o = color(o); |
|
if (!o) return new Rgb(); |
|
o = o.rgb(); |
|
return new Rgb(o.r, o.g, o.b, o.opacity); |
|
} |
|
function rgb(r, g, b, opacity) { |
|
return arguments.length === 1 ? rgbConvert(r) : new Rgb(r, g, b, opacity == null ? 1 : opacity); |
|
} |
|
function Rgb(r, g, b, opacity) { |
|
this.r = +r; |
|
this.g = +g; |
|
this.b = +b; |
|
this.opacity = +opacity; |
|
} |
|
define_default(Rgb, rgb, extend(Color, { |
|
brighter(k) { |
|
k = k == null ? brighter : Math.pow(brighter, k); |
|
return new Rgb(this.r * k, this.g * k, this.b * k, this.opacity); |
|
}, |
|
darker(k) { |
|
k = k == null ? darker : Math.pow(darker, k); |
|
return new Rgb(this.r * k, this.g * k, this.b * k, this.opacity); |
|
}, |
|
rgb() { |
|
return this; |
|
}, |
|
clamp() { |
|
return new Rgb(clampi(this.r), clampi(this.g), clampi(this.b), clampa(this.opacity)); |
|
}, |
|
displayable() { |
|
return -0.5 <= this.r && this.r < 255.5 && (-0.5 <= this.g && this.g < 255.5) && (-0.5 <= this.b && this.b < 255.5) && (0 <= this.opacity && this.opacity <= 1); |
|
}, |
|
hex: rgb_formatHex, |
|
|
|
formatHex: rgb_formatHex, |
|
formatHex8: rgb_formatHex8, |
|
formatRgb: rgb_formatRgb, |
|
toString: rgb_formatRgb |
|
})); |
|
function rgb_formatHex() { |
|
return `#${hex(this.r)}${hex(this.g)}${hex(this.b)}`; |
|
} |
|
function rgb_formatHex8() { |
|
return `#${hex(this.r)}${hex(this.g)}${hex(this.b)}${hex((isNaN(this.opacity) ? 1 : this.opacity) * 255)}`; |
|
} |
|
function rgb_formatRgb() { |
|
const a = clampa(this.opacity); |
|
return `${a === 1 ? "rgb(" : "rgba("}${clampi(this.r)}, ${clampi(this.g)}, ${clampi(this.b)}${a === 1 ? ")" : `, ${a})`}`; |
|
} |
|
function clampa(opacity) { |
|
return isNaN(opacity) ? 1 : Math.max(0, Math.min(1, opacity)); |
|
} |
|
function clampi(value) { |
|
return Math.max(0, Math.min(255, Math.round(value) || 0)); |
|
} |
|
function hex(value) { |
|
value = clampi(value); |
|
return (value < 16 ? "0" : "") + value.toString(16); |
|
} |
|
function hsla(h, s, l, a) { |
|
if (a <= 0) h = s = l = NaN; |
|
else if (l <= 0 || l >= 1) h = s = NaN; |
|
else if (s <= 0) h = NaN; |
|
return new Hsl(h, s, l, a); |
|
} |
|
function hslConvert(o) { |
|
if (o instanceof Hsl) return new Hsl(o.h, o.s, o.l, o.opacity); |
|
if (!(o instanceof Color)) o = color(o); |
|
if (!o) return new Hsl(); |
|
if (o instanceof Hsl) return o; |
|
o = o.rgb(); |
|
var r = o.r / 255, g = o.g / 255, b = o.b / 255, min = Math.min(r, g, b), max = Math.max(r, g, b), h = NaN, s = max - min, l = (max + min) / 2; |
|
if (s) { |
|
if (r === max) h = (g - b) / s + (g < b) * 6; |
|
else if (g === max) h = (b - r) / s + 2; |
|
else h = (r - g) / s + 4; |
|
s /= l < 0.5 ? max + min : 2 - max - min; |
|
h *= 60; |
|
} else { |
|
s = l > 0 && l < 1 ? 0 : h; |
|
} |
|
return new Hsl(h, s, l, o.opacity); |
|
} |
|
function hsl(h, s, l, opacity) { |
|
return arguments.length === 1 ? hslConvert(h) : new Hsl(h, s, l, opacity == null ? 1 : opacity); |
|
} |
|
function Hsl(h, s, l, opacity) { |
|
this.h = +h; |
|
this.s = +s; |
|
this.l = +l; |
|
this.opacity = +opacity; |
|
} |
|
define_default(Hsl, hsl, extend(Color, { |
|
brighter(k) { |
|
k = k == null ? brighter : Math.pow(brighter, k); |
|
return new Hsl(this.h, this.s, this.l * k, this.opacity); |
|
}, |
|
darker(k) { |
|
k = k == null ? darker : Math.pow(darker, k); |
|
return new Hsl(this.h, this.s, this.l * k, this.opacity); |
|
}, |
|
rgb() { |
|
var h = this.h % 360 + (this.h < 0) * 360, s = isNaN(h) || isNaN(this.s) ? 0 : this.s, l = this.l, m2 = l + (l < 0.5 ? l : 1 - l) * s, m1 = 2 * l - m2; |
|
return new Rgb( |
|
hsl2rgb(h >= 240 ? h - 240 : h + 120, m1, m2), |
|
hsl2rgb(h, m1, m2), |
|
hsl2rgb(h < 120 ? h + 240 : h - 120, m1, m2), |
|
this.opacity |
|
); |
|
}, |
|
clamp() { |
|
return new Hsl(clamph(this.h), clampt(this.s), clampt(this.l), clampa(this.opacity)); |
|
}, |
|
displayable() { |
|
return (0 <= this.s && this.s <= 1 || isNaN(this.s)) && (0 <= this.l && this.l <= 1) && (0 <= this.opacity && this.opacity <= 1); |
|
}, |
|
formatHsl() { |
|
const a = clampa(this.opacity); |
|
return `${a === 1 ? "hsl(" : "hsla("}${clamph(this.h)}, ${clampt(this.s) * 100}%, ${clampt(this.l) * 100}%${a === 1 ? ")" : `, ${a})`}`; |
|
} |
|
})); |
|
function clamph(value) { |
|
value = (value || 0) % 360; |
|
return value < 0 ? value + 360 : value; |
|
} |
|
function clampt(value) { |
|
return Math.max(0, Math.min(1, value || 0)); |
|
} |
|
function hsl2rgb(h, m1, m2) { |
|
return (h < 60 ? m1 + (m2 - m1) * h / 60 : h < 180 ? m2 : h < 240 ? m1 + (m2 - m1) * (240 - h) / 60 : m1) * 255; |
|
} |
|
|
|
|
|
var radians = Math.PI / 180; |
|
var degrees = 180 / Math.PI; |
|
|
|
|
|
var K = 18; |
|
var Xn = 0.96422; |
|
var Yn = 1; |
|
var Zn = 0.82521; |
|
var t0 = 4 / 29; |
|
var t1 = 6 / 29; |
|
var t2 = 3 * t1 * t1; |
|
var t3 = t1 * t1 * t1; |
|
function labConvert(o) { |
|
if (o instanceof Lab) return new Lab(o.l, o.a, o.b, o.opacity); |
|
if (o instanceof Hcl) return hcl2lab(o); |
|
if (!(o instanceof Rgb)) o = rgbConvert(o); |
|
var r = rgb2lrgb(o.r), g = rgb2lrgb(o.g), b = rgb2lrgb(o.b), y = xyz2lab((0.2225045 * r + 0.7168786 * g + 0.0606169 * b) / Yn), x, z; |
|
if (r === g && g === b) x = z = y; |
|
else { |
|
x = xyz2lab((0.4360747 * r + 0.3850649 * g + 0.1430804 * b) / Xn); |
|
z = xyz2lab((0.0139322 * r + 0.0971045 * g + 0.7141733 * b) / Zn); |
|
} |
|
return new Lab(116 * y - 16, 500 * (x - y), 200 * (y - z), o.opacity); |
|
} |
|
function lab(l, a, b, opacity) { |
|
return arguments.length === 1 ? labConvert(l) : new Lab(l, a, b, opacity == null ? 1 : opacity); |
|
} |
|
function Lab(l, a, b, opacity) { |
|
this.l = +l; |
|
this.a = +a; |
|
this.b = +b; |
|
this.opacity = +opacity; |
|
} |
|
define_default(Lab, lab, extend(Color, { |
|
brighter(k) { |
|
return new Lab(this.l + K * (k == null ? 1 : k), this.a, this.b, this.opacity); |
|
}, |
|
darker(k) { |
|
return new Lab(this.l - K * (k == null ? 1 : k), this.a, this.b, this.opacity); |
|
}, |
|
rgb() { |
|
var y = (this.l + 16) / 116, x = isNaN(this.a) ? y : y + this.a / 500, z = isNaN(this.b) ? y : y - this.b / 200; |
|
x = Xn * lab2xyz(x); |
|
y = Yn * lab2xyz(y); |
|
z = Zn * lab2xyz(z); |
|
return new Rgb( |
|
lrgb2rgb(3.1338561 * x - 1.6168667 * y - 0.4906146 * z), |
|
lrgb2rgb(-0.9787684 * x + 1.9161415 * y + 0.033454 * z), |
|
lrgb2rgb(0.0719453 * x - 0.2289914 * y + 1.4052427 * z), |
|
this.opacity |
|
); |
|
} |
|
})); |
|
function xyz2lab(t) { |
|
return t > t3 ? Math.pow(t, 1 / 3) : t / t2 + t0; |
|
} |
|
function lab2xyz(t) { |
|
return t > t1 ? t * t * t : t2 * (t - t0); |
|
} |
|
function lrgb2rgb(x) { |
|
return 255 * (x <= 31308e-7 ? 12.92 * x : 1.055 * Math.pow(x, 1 / 2.4) - 0.055); |
|
} |
|
function rgb2lrgb(x) { |
|
return (x /= 255) <= 0.04045 ? x / 12.92 : Math.pow((x + 0.055) / 1.055, 2.4); |
|
} |
|
function hclConvert(o) { |
|
if (o instanceof Hcl) return new Hcl(o.h, o.c, o.l, o.opacity); |
|
if (!(o instanceof Lab)) o = labConvert(o); |
|
if (o.a === 0 && o.b === 0) return new Hcl(NaN, 0 < o.l && o.l < 100 ? 0 : NaN, o.l, o.opacity); |
|
var h = Math.atan2(o.b, o.a) * degrees; |
|
return new Hcl(h < 0 ? h + 360 : h, Math.sqrt(o.a * o.a + o.b * o.b), o.l, o.opacity); |
|
} |
|
function hcl(h, c, l, opacity) { |
|
return arguments.length === 1 ? hclConvert(h) : new Hcl(h, c, l, opacity == null ? 1 : opacity); |
|
} |
|
function Hcl(h, c, l, opacity) { |
|
this.h = +h; |
|
this.c = +c; |
|
this.l = +l; |
|
this.opacity = +opacity; |
|
} |
|
function hcl2lab(o) { |
|
if (isNaN(o.h)) return new Lab(o.l, 0, 0, o.opacity); |
|
var h = o.h * radians; |
|
return new Lab(o.l, Math.cos(h) * o.c, Math.sin(h) * o.c, o.opacity); |
|
} |
|
define_default(Hcl, hcl, extend(Color, { |
|
brighter(k) { |
|
return new Hcl(this.h, this.c, this.l + K * (k == null ? 1 : k), this.opacity); |
|
}, |
|
darker(k) { |
|
return new Hcl(this.h, this.c, this.l - K * (k == null ? 1 : k), this.opacity); |
|
}, |
|
rgb() { |
|
return hcl2lab(this).rgb(); |
|
} |
|
})); |
|
|
|
|
|
var A = -0.14861; |
|
var B = 1.78277; |
|
var C = -0.29227; |
|
var D = -0.90649; |
|
var E = 1.97294; |
|
var ED = E * D; |
|
var EB = E * B; |
|
var BC_DA = B * C - D * A; |
|
function cubehelixConvert(o) { |
|
if (o instanceof Cubehelix) return new Cubehelix(o.h, o.s, o.l, o.opacity); |
|
if (!(o instanceof Rgb)) o = rgbConvert(o); |
|
var r = o.r / 255, g = o.g / 255, b = o.b / 255, l = (BC_DA * b + ED * r - EB * g) / (BC_DA + ED - EB), bl = b - l, k = (E * (g - l) - C * bl) / D, s = Math.sqrt(k * k + bl * bl) / (E * l * (1 - l)), h = s ? Math.atan2(k, bl) * degrees - 120 : NaN; |
|
return new Cubehelix(h < 0 ? h + 360 : h, s, l, o.opacity); |
|
} |
|
function cubehelix(h, s, l, opacity) { |
|
return arguments.length === 1 ? cubehelixConvert(h) : new Cubehelix(h, s, l, opacity == null ? 1 : opacity); |
|
} |
|
function Cubehelix(h, s, l, opacity) { |
|
this.h = +h; |
|
this.s = +s; |
|
this.l = +l; |
|
this.opacity = +opacity; |
|
} |
|
define_default(Cubehelix, cubehelix, extend(Color, { |
|
brighter(k) { |
|
k = k == null ? brighter : Math.pow(brighter, k); |
|
return new Cubehelix(this.h, this.s, this.l * k, this.opacity); |
|
}, |
|
darker(k) { |
|
k = k == null ? darker : Math.pow(darker, k); |
|
return new Cubehelix(this.h, this.s, this.l * k, this.opacity); |
|
}, |
|
rgb() { |
|
var h = isNaN(this.h) ? 0 : (this.h + 120) * radians, l = +this.l, a = isNaN(this.s) ? 0 : this.s * l * (1 - l), cosh2 = Math.cos(h), sinh2 = Math.sin(h); |
|
return new Rgb( |
|
255 * (l + a * (A * cosh2 + B * sinh2)), |
|
255 * (l + a * (C * cosh2 + D * sinh2)), |
|
255 * (l + a * (E * cosh2)), |
|
this.opacity |
|
); |
|
} |
|
})); |
|
|
|
|
|
var constant_default2 = (x) => () => x; |
|
|
|
|
|
function linear(a, d) { |
|
return function(t) { |
|
return a + t * d; |
|
}; |
|
} |
|
function exponential(a, b, y) { |
|
return a = Math.pow(a, y), b = Math.pow(b, y) - a, y = 1 / y, function(t) { |
|
return Math.pow(a + t * b, y); |
|
}; |
|
} |
|
function hue(a, b) { |
|
var d = b - a; |
|
return d ? linear(a, d > 180 || d < -180 ? d - 360 * Math.round(d / 360) : d) : constant_default2(isNaN(a) ? b : a); |
|
} |
|
function gamma(y) { |
|
return (y = +y) === 1 ? nogamma : function(a, b) { |
|
return b - a ? exponential(a, b, y) : constant_default2(isNaN(a) ? b : a); |
|
}; |
|
} |
|
function nogamma(a, b) { |
|
var d = b - a; |
|
return d ? linear(a, d) : constant_default2(isNaN(a) ? b : a); |
|
} |
|
|
|
|
|
function hcl2(hue2) { |
|
return function(start2, end) { |
|
var h = hue2((start2 = hcl(start2)).h, (end = hcl(end)).h), c = nogamma(start2.c, end.c), l = nogamma(start2.l, end.l), opacity = nogamma(start2.opacity, end.opacity); |
|
return function(t) { |
|
start2.h = h(t); |
|
start2.c = c(t); |
|
start2.l = l(t); |
|
start2.opacity = opacity(t); |
|
return start2 + ""; |
|
}; |
|
}; |
|
} |
|
var hcl_default = hcl2(hue); |
|
var hclLong = hcl2(nogamma); |
|
|
|
|
|
function basis(t12, v0, v1, v2, v3) { |
|
var t22 = t12 * t12, t32 = t22 * t12; |
|
return ((1 - 3 * t12 + 3 * t22 - t32) * v0 + (4 - 6 * t22 + 3 * t32) * v1 + (1 + 3 * t12 + 3 * t22 - 3 * t32) * v2 + t32 * v3) / 6; |
|
} |
|
function basis_default(values) { |
|
var n = values.length - 1; |
|
return function(t) { |
|
var i = t <= 0 ? t = 0 : t >= 1 ? (t = 1, n - 1) : Math.floor(t * n), v1 = values[i], v2 = values[i + 1], v0 = i > 0 ? values[i - 1] : 2 * v1 - v2, v3 = i < n - 1 ? values[i + 2] : 2 * v2 - v1; |
|
return basis((t - i / n) * n, v0, v1, v2, v3); |
|
}; |
|
} |
|
|
|
|
|
function basisClosed_default(values) { |
|
var n = values.length; |
|
return function(t) { |
|
var i = Math.floor(((t %= 1) < 0 ? ++t : t) * n), v0 = values[(i + n - 1) % n], v1 = values[i % n], v2 = values[(i + 1) % n], v3 = values[(i + 2) % n]; |
|
return basis((t - i / n) * n, v0, v1, v2, v3); |
|
}; |
|
} |
|
|
|
|
|
var rgb_default = function rgbGamma(y) { |
|
var color2 = gamma(y); |
|
function rgb2(start2, end) { |
|
var r = color2((start2 = rgb(start2)).r, (end = rgb(end)).r), g = color2(start2.g, end.g), b = color2(start2.b, end.b), opacity = nogamma(start2.opacity, end.opacity); |
|
return function(t) { |
|
start2.r = r(t); |
|
start2.g = g(t); |
|
start2.b = b(t); |
|
start2.opacity = opacity(t); |
|
return start2 + ""; |
|
}; |
|
} |
|
rgb2.gamma = rgbGamma; |
|
return rgb2; |
|
}(1); |
|
function rgbSpline(spline) { |
|
return function(colors) { |
|
var n = colors.length, r = new Array(n), g = new Array(n), b = new Array(n), i, color2; |
|
for (i = 0; i < n; ++i) { |
|
color2 = rgb(colors[i]); |
|
r[i] = color2.r || 0; |
|
g[i] = color2.g || 0; |
|
b[i] = color2.b || 0; |
|
} |
|
r = spline(r); |
|
g = spline(g); |
|
b = spline(b); |
|
color2.opacity = 1; |
|
return function(t) { |
|
color2.r = r(t); |
|
color2.g = g(t); |
|
color2.b = b(t); |
|
return color2 + ""; |
|
}; |
|
}; |
|
} |
|
var rgbBasis = rgbSpline(basis_default); |
|
var rgbBasisClosed = rgbSpline(basisClosed_default); |
|
|
|
|
|
function numberArray_default(a, b) { |
|
if (!b) b = []; |
|
var n = a ? Math.min(b.length, a.length) : 0, c = b.slice(), i; |
|
return function(t) { |
|
for (i = 0; i < n; ++i) c[i] = a[i] * (1 - t) + b[i] * t; |
|
return c; |
|
}; |
|
} |
|
function isNumberArray(x) { |
|
return ArrayBuffer.isView(x) && !(x instanceof DataView); |
|
} |
|
|
|
|
|
function genericArray(a, b) { |
|
var nb = b ? b.length : 0, na = a ? Math.min(nb, a.length) : 0, x = new Array(na), c = new Array(nb), i; |
|
for (i = 0; i < na; ++i) x[i] = value_default(a[i], b[i]); |
|
for (; i < nb; ++i) c[i] = b[i]; |
|
return function(t) { |
|
for (i = 0; i < na; ++i) c[i] = x[i](t); |
|
return c; |
|
}; |
|
} |
|
|
|
|
|
function date_default(a, b) { |
|
var d = new Date(); |
|
return a = +a, b = +b, function(t) { |
|
return d.setTime(a * (1 - t) + b * t), d; |
|
}; |
|
} |
|
|
|
|
|
function number_default(a, b) { |
|
return a = +a, b = +b, function(t) { |
|
return a * (1 - t) + b * t; |
|
}; |
|
} |
|
|
|
|
|
function object_default(a, b) { |
|
var i = {}, c = {}, k; |
|
if (a === null || typeof a !== "object") a = {}; |
|
if (b === null || typeof b !== "object") b = {}; |
|
for (k in b) { |
|
if (k in a) { |
|
i[k] = value_default(a[k], b[k]); |
|
} else { |
|
c[k] = b[k]; |
|
} |
|
} |
|
return function(t) { |
|
for (k in i) c[k] = i[k](t); |
|
return c; |
|
}; |
|
} |
|
|
|
|
|
var reA = /[-+]?(?:\d+\.?\d*|\.?\d+)(?:[eE][-+]?\d+)?/g; |
|
var reB = new RegExp(reA.source, "g"); |
|
function zero(b) { |
|
return function() { |
|
return b; |
|
}; |
|
} |
|
function one(b) { |
|
return function(t) { |
|
return b(t) + ""; |
|
}; |
|
} |
|
function string_default(a, b) { |
|
var bi = reA.lastIndex = reB.lastIndex = 0, am, bm, bs, i = -1, s = [], q = []; |
|
a = a + "", b = b + ""; |
|
while ((am = reA.exec(a)) && (bm = reB.exec(b))) { |
|
if ((bs = bm.index) > bi) { |
|
bs = b.slice(bi, bs); |
|
if (s[i]) s[i] += bs; |
|
else s[++i] = bs; |
|
} |
|
if ((am = am[0]) === (bm = bm[0])) { |
|
if (s[i]) s[i] += bm; |
|
else s[++i] = bm; |
|
} else { |
|
s[++i] = null; |
|
q.push({ i, x: number_default(am, bm) }); |
|
} |
|
bi = reB.lastIndex; |
|
} |
|
if (bi < b.length) { |
|
bs = b.slice(bi); |
|
if (s[i]) s[i] += bs; |
|
else s[++i] = bs; |
|
} |
|
return s.length < 2 ? q[0] ? one(q[0].x) : zero(b) : (b = q.length, function(t) { |
|
for (var i2 = 0, o; i2 < b; ++i2) s[(o = q[i2]).i] = o.x(t); |
|
return s.join(""); |
|
}); |
|
} |
|
|
|
|
|
function value_default(a, b) { |
|
var t = typeof b, c; |
|
return b == null || t === "boolean" ? constant_default2(b) : (t === "number" ? number_default : t === "string" ? (c = color(b)) ? (b = c, rgb_default) : string_default : b instanceof color ? rgb_default : b instanceof Date ? date_default : isNumberArray(b) ? numberArray_default : Array.isArray(b) ? genericArray : typeof b.valueOf !== "function" && typeof b.toString !== "function" || isNaN(b) ? object_default : number_default)(a, b); |
|
} |
|
|
|
|
|
function round_default(a, b) { |
|
return a = +a, b = +b, function(t) { |
|
return Math.round(a * (1 - t) + b * t); |
|
}; |
|
} |
|
|
|
|
|
var degrees2 = 180 / Math.PI; |
|
var identity = { |
|
translateX: 0, |
|
translateY: 0, |
|
rotate: 0, |
|
skewX: 0, |
|
scaleX: 1, |
|
scaleY: 1 |
|
}; |
|
function decompose_default(a, b, c, d, e, f) { |
|
var scaleX, scaleY, skewX; |
|
if (scaleX = Math.sqrt(a * a + b * b)) a /= scaleX, b /= scaleX; |
|
if (skewX = a * c + b * d) c -= a * skewX, d -= b * skewX; |
|
if (scaleY = Math.sqrt(c * c + d * d)) c /= scaleY, d /= scaleY, skewX /= scaleY; |
|
if (a * d < b * c) a = -a, b = -b, skewX = -skewX, scaleX = -scaleX; |
|
return { |
|
translateX: e, |
|
translateY: f, |
|
rotate: Math.atan2(b, a) * degrees2, |
|
skewX: Math.atan(skewX) * degrees2, |
|
scaleX, |
|
scaleY |
|
}; |
|
} |
|
|
|
|
|
var svgNode; |
|
function parseCss(value) { |
|
const m = new (typeof DOMMatrix === "function" ? DOMMatrix : WebKitCSSMatrix)(value + ""); |
|
return m.isIdentity ? identity : decompose_default(m.a, m.b, m.c, m.d, m.e, m.f); |
|
} |
|
function parseSvg(value) { |
|
if (value == null) return identity; |
|
if (!svgNode) svgNode = document.createElementNS("http://www.w3.org/2000/svg", "g"); |
|
svgNode.setAttribute("transform", value); |
|
if (!(value = svgNode.transform.baseVal.consolidate())) return identity; |
|
value = value.matrix; |
|
return decompose_default(value.a, value.b, value.c, value.d, value.e, value.f); |
|
} |
|
|
|
|
|
function interpolateTransform(parse, pxComma, pxParen, degParen) { |
|
function pop(s) { |
|
return s.length ? s.pop() + " " : ""; |
|
} |
|
function translate(xa, ya, xb, yb, s, q) { |
|
if (xa !== xb || ya !== yb) { |
|
var i = s.push("translate(", null, pxComma, null, pxParen); |
|
q.push({ i: i - 4, x: number_default(xa, xb) }, { i: i - 2, x: number_default(ya, yb) }); |
|
} else if (xb || yb) { |
|
s.push("translate(" + xb + pxComma + yb + pxParen); |
|
} |
|
} |
|
function rotate(a, b, s, q) { |
|
if (a !== b) { |
|
if (a - b > 180) b += 360; |
|
else if (b - a > 180) a += 360; |
|
q.push({ i: s.push(pop(s) + "rotate(", null, degParen) - 2, x: number_default(a, b) }); |
|
} else if (b) { |
|
s.push(pop(s) + "rotate(" + b + degParen); |
|
} |
|
} |
|
function skewX(a, b, s, q) { |
|
if (a !== b) { |
|
q.push({ i: s.push(pop(s) + "skewX(", null, degParen) - 2, x: number_default(a, b) }); |
|
} else if (b) { |
|
s.push(pop(s) + "skewX(" + b + degParen); |
|
} |
|
} |
|
function scale(xa, ya, xb, yb, s, q) { |
|
if (xa !== xb || ya !== yb) { |
|
var i = s.push(pop(s) + "scale(", null, ",", null, ")"); |
|
q.push({ i: i - 4, x: number_default(xa, xb) }, { i: i - 2, x: number_default(ya, yb) }); |
|
} else if (xb !== 1 || yb !== 1) { |
|
s.push(pop(s) + "scale(" + xb + "," + yb + ")"); |
|
} |
|
} |
|
return function(a, b) { |
|
var s = [], q = []; |
|
a = parse(a), b = parse(b); |
|
translate(a.translateX, a.translateY, b.translateX, b.translateY, s, q); |
|
rotate(a.rotate, b.rotate, s, q); |
|
skewX(a.skewX, b.skewX, s, q); |
|
scale(a.scaleX, a.scaleY, b.scaleX, b.scaleY, s, q); |
|
a = b = null; |
|
return function(t) { |
|
var i = -1, n = q.length, o; |
|
while (++i < n) s[(o = q[i]).i] = o.x(t); |
|
return s.join(""); |
|
}; |
|
}; |
|
} |
|
var interpolateTransformCss = interpolateTransform(parseCss, "px, ", "px)", "deg)"); |
|
var interpolateTransformSvg = interpolateTransform(parseSvg, ", ", ")", ")"); |
|
|
|
|
|
var epsilon2 = 1e-12; |
|
function cosh(x) { |
|
return ((x = Math.exp(x)) + 1 / x) / 2; |
|
} |
|
function sinh(x) { |
|
return ((x = Math.exp(x)) - 1 / x) / 2; |
|
} |
|
function tanh(x) { |
|
return ((x = Math.exp(2 * x)) - 1) / (x + 1); |
|
} |
|
var zoom_default = function zoomRho(rho, rho2, rho4) { |
|
function zoom(p0, p1) { |
|
var ux0 = p0[0], uy0 = p0[1], w0 = p0[2], ux1 = p1[0], uy1 = p1[1], w1 = p1[2], dx = ux1 - ux0, dy = uy1 - uy0, d2 = dx * dx + dy * dy, i, S; |
|
if (d2 < epsilon2) { |
|
S = Math.log(w1 / w0) / rho; |
|
i = function(t) { |
|
return [ |
|
ux0 + t * dx, |
|
uy0 + t * dy, |
|
w0 * Math.exp(rho * t * S) |
|
]; |
|
}; |
|
} else { |
|
var d1 = Math.sqrt(d2), b02 = (w1 * w1 - w0 * w0 + rho4 * d2) / (2 * w0 * rho2 * d1), b12 = (w1 * w1 - w0 * w0 - rho4 * d2) / (2 * w1 * rho2 * d1), r0 = Math.log(Math.sqrt(b02 * b02 + 1) - b02), r1 = Math.log(Math.sqrt(b12 * b12 + 1) - b12); |
|
S = (r1 - r0) / rho; |
|
i = function(t) { |
|
var s = t * S, coshr0 = cosh(r0), u = w0 / (rho2 * d1) * (coshr0 * tanh(rho * s + r0) - sinh(r0)); |
|
return [ |
|
ux0 + u * dx, |
|
uy0 + u * dy, |
|
w0 * coshr0 / cosh(rho * s + r0) |
|
]; |
|
}; |
|
} |
|
i.duration = S * 1e3 * rho / Math.SQRT2; |
|
return i; |
|
} |
|
zoom.rho = function(_) { |
|
var _1 = Math.max(1e-3, +_), _2 = _1 * _1, _4 = _2 * _2; |
|
return zoomRho(_1, _2, _4); |
|
}; |
|
return zoom; |
|
}(Math.SQRT2, 2, 4); |
|
|
|
|
|
function hsl2(hue2) { |
|
return function(start2, end) { |
|
var h = hue2((start2 = hsl(start2)).h, (end = hsl(end)).h), s = nogamma(start2.s, end.s), l = nogamma(start2.l, end.l), opacity = nogamma(start2.opacity, end.opacity); |
|
return function(t) { |
|
start2.h = h(t); |
|
start2.s = s(t); |
|
start2.l = l(t); |
|
start2.opacity = opacity(t); |
|
return start2 + ""; |
|
}; |
|
}; |
|
} |
|
var hsl_default = hsl2(hue); |
|
var hslLong = hsl2(nogamma); |
|
|
|
|
|
function cubehelix2(hue2) { |
|
return function cubehelixGamma(y) { |
|
y = +y; |
|
function cubehelix3(start2, end) { |
|
var h = hue2((start2 = cubehelix(start2)).h, (end = cubehelix(end)).h), s = nogamma(start2.s, end.s), l = nogamma(start2.l, end.l), opacity = nogamma(start2.opacity, end.opacity); |
|
return function(t) { |
|
start2.h = h(t); |
|
start2.s = s(t); |
|
start2.l = l(Math.pow(t, y)); |
|
start2.opacity = opacity(t); |
|
return start2 + ""; |
|
}; |
|
} |
|
cubehelix3.gamma = cubehelixGamma; |
|
return cubehelix3; |
|
}(1); |
|
} |
|
var cubehelix_default = cubehelix2(hue); |
|
var cubehelixLong = cubehelix2(nogamma); |
|
|
|
|
|
var noop = { value: () => { |
|
} }; |
|
function dispatch() { |
|
for (var i = 0, n = arguments.length, _ = {}, t; i < n; ++i) { |
|
if (!(t = arguments[i] + "") || t in _ || /[\s.]/.test(t)) throw new Error("illegal type: " + t); |
|
_[t] = []; |
|
} |
|
return new Dispatch(_); |
|
} |
|
function Dispatch(_) { |
|
this._ = _; |
|
} |
|
function parseTypenames2(typenames, types) { |
|
return typenames.trim().split(/^|\s+/).map(function(t) { |
|
var name = "", i = t.indexOf("."); |
|
if (i >= 0) name = t.slice(i + 1), t = t.slice(0, i); |
|
if (t && !types.hasOwnProperty(t)) throw new Error("unknown type: " + t); |
|
return { type: t, name }; |
|
}); |
|
} |
|
Dispatch.prototype = dispatch.prototype = { |
|
constructor: Dispatch, |
|
on: function(typename, callback) { |
|
var _ = this._, T = parseTypenames2(typename + "", _), t, i = -1, n = T.length; |
|
if (arguments.length < 2) { |
|
while (++i < n) if ((t = (typename = T[i]).type) && (t = get(_[t], typename.name))) return t; |
|
return; |
|
} |
|
if (callback != null && typeof callback !== "function") throw new Error("invalid callback: " + callback); |
|
while (++i < n) { |
|
if (t = (typename = T[i]).type) _[t] = set(_[t], typename.name, callback); |
|
else if (callback == null) for (t in _) _[t] = set(_[t], typename.name, null); |
|
} |
|
return this; |
|
}, |
|
copy: function() { |
|
var copy = {}, _ = this._; |
|
for (var t in _) copy[t] = _[t].slice(); |
|
return new Dispatch(copy); |
|
}, |
|
call: function(type, that) { |
|
if ((n = arguments.length - 2) > 0) for (var args = new Array(n), i = 0, n, t; i < n; ++i) args[i] = arguments[i + 2]; |
|
if (!this._.hasOwnProperty(type)) throw new Error("unknown type: " + type); |
|
for (t = this._[type], i = 0, n = t.length; i < n; ++i) t[i].value.apply(that, args); |
|
}, |
|
apply: function(type, that, args) { |
|
if (!this._.hasOwnProperty(type)) throw new Error("unknown type: " + type); |
|
for (var t = this._[type], i = 0, n = t.length; i < n; ++i) t[i].value.apply(that, args); |
|
} |
|
}; |
|
function get(type, name) { |
|
for (var i = 0, n = type.length, c; i < n; ++i) { |
|
if ((c = type[i]).name === name) { |
|
return c.value; |
|
} |
|
} |
|
} |
|
function set(type, name, callback) { |
|
for (var i = 0, n = type.length; i < n; ++i) { |
|
if (type[i].name === name) { |
|
type[i] = noop, type = type.slice(0, i).concat(type.slice(i + 1)); |
|
break; |
|
} |
|
} |
|
if (callback != null) type.push({ name, value: callback }); |
|
return type; |
|
} |
|
var dispatch_default2 = dispatch; |
|
|
|
|
|
var nonpassive = { passive: false }; |
|
var nonpassivecapture = { capture: true, passive: false }; |
|
function nopropagation(event) { |
|
event.stopImmediatePropagation(); |
|
} |
|
function noevent_default(event) { |
|
event.preventDefault(); |
|
event.stopImmediatePropagation(); |
|
} |
|
|
|
|
|
function nodrag_default(view) { |
|
var root2 = view.document.documentElement, selection2 = select_default2(view).on("dragstart.drag", noevent_default, nonpassivecapture); |
|
if ("onselectstart" in root2) { |
|
selection2.on("selectstart.drag", noevent_default, nonpassivecapture); |
|
} else { |
|
root2.__noselect = root2.style.MozUserSelect; |
|
root2.style.MozUserSelect = "none"; |
|
} |
|
} |
|
function yesdrag(view, noclick) { |
|
var root2 = view.document.documentElement, selection2 = select_default2(view).on("dragstart.drag", null); |
|
if (noclick) { |
|
selection2.on("click.drag", noevent_default, nonpassivecapture); |
|
setTimeout(function() { |
|
selection2.on("click.drag", null); |
|
}, 0); |
|
} |
|
if ("onselectstart" in root2) { |
|
selection2.on("selectstart.drag", null); |
|
} else { |
|
root2.style.MozUserSelect = root2.__noselect; |
|
delete root2.__noselect; |
|
} |
|
} |
|
|
|
|
|
var constant_default3 = (x) => () => x; |
|
|
|
|
|
function DragEvent(type, { |
|
sourceEvent, |
|
subject, |
|
target, |
|
identifier, |
|
active, |
|
x, |
|
y, |
|
dx, |
|
dy, |
|
dispatch: dispatch2 |
|
}) { |
|
Object.defineProperties(this, { |
|
type: { value: type, enumerable: true, configurable: true }, |
|
sourceEvent: { value: sourceEvent, enumerable: true, configurable: true }, |
|
subject: { value: subject, enumerable: true, configurable: true }, |
|
target: { value: target, enumerable: true, configurable: true }, |
|
identifier: { value: identifier, enumerable: true, configurable: true }, |
|
active: { value: active, enumerable: true, configurable: true }, |
|
x: { value: x, enumerable: true, configurable: true }, |
|
y: { value: y, enumerable: true, configurable: true }, |
|
dx: { value: dx, enumerable: true, configurable: true }, |
|
dy: { value: dy, enumerable: true, configurable: true }, |
|
_: { value: dispatch2 } |
|
}); |
|
} |
|
DragEvent.prototype.on = function() { |
|
var value = this._.on.apply(this._, arguments); |
|
return value === this._ ? this : value; |
|
}; |
|
|
|
|
|
function defaultFilter(event) { |
|
return !event.ctrlKey && !event.button; |
|
} |
|
function defaultContainer() { |
|
return this.parentNode; |
|
} |
|
function defaultSubject(event, d) { |
|
return d == null ? { x: event.x, y: event.y } : d; |
|
} |
|
function defaultTouchable() { |
|
return navigator.maxTouchPoints || "ontouchstart" in this; |
|
} |
|
function drag_default() { |
|
var filter2 = defaultFilter, container = defaultContainer, subject = defaultSubject, touchable = defaultTouchable, gestures = {}, listeners = dispatch_default2("start", "drag", "end"), active = 0, mousedownx, mousedowny, mousemoving, touchending, clickDistance2 = 0; |
|
function drag(selection2) { |
|
selection2.on("mousedown.drag", mousedowned).filter(touchable).on("touchstart.drag", touchstarted).on("touchmove.drag", touchmoved, nonpassive).on("touchend.drag touchcancel.drag", touchended).style("touch-action", "none").style("-webkit-tap-highlight-color", "rgba(0,0,0,0)"); |
|
} |
|
function mousedowned(event, d) { |
|
if (touchending || !filter2.call(this, event, d)) return; |
|
var gesture = beforestart(this, container.call(this, event, d), event, d, "mouse"); |
|
if (!gesture) return; |
|
select_default2(event.view).on("mousemove.drag", mousemoved, nonpassivecapture).on("mouseup.drag", mouseupped, nonpassivecapture); |
|
nodrag_default(event.view); |
|
nopropagation(event); |
|
mousemoving = false; |
|
mousedownx = event.clientX; |
|
mousedowny = event.clientY; |
|
gesture("start", event); |
|
} |
|
function mousemoved(event) { |
|
noevent_default(event); |
|
if (!mousemoving) { |
|
var dx = event.clientX - mousedownx, dy = event.clientY - mousedowny; |
|
mousemoving = dx * dx + dy * dy > clickDistance2; |
|
} |
|
gestures.mouse("drag", event); |
|
} |
|
function mouseupped(event) { |
|
select_default2(event.view).on("mousemove.drag mouseup.drag", null); |
|
yesdrag(event.view, mousemoving); |
|
noevent_default(event); |
|
gestures.mouse("end", event); |
|
} |
|
function touchstarted(event, d) { |
|
if (!filter2.call(this, event, d)) return; |
|
var touches = event.changedTouches, c = container.call(this, event, d), n = touches.length, i, gesture; |
|
for (i = 0; i < n; ++i) { |
|
if (gesture = beforestart(this, c, event, d, touches[i].identifier, touches[i])) { |
|
nopropagation(event); |
|
gesture("start", event, touches[i]); |
|
} |
|
} |
|
} |
|
function touchmoved(event) { |
|
var touches = event.changedTouches, n = touches.length, i, gesture; |
|
for (i = 0; i < n; ++i) { |
|
if (gesture = gestures[touches[i].identifier]) { |
|
noevent_default(event); |
|
gesture("drag", event, touches[i]); |
|
} |
|
} |
|
} |
|
function touchended(event) { |
|
var touches = event.changedTouches, n = touches.length, i, gesture; |
|
if (touchending) clearTimeout(touchending); |
|
touchending = setTimeout(function() { |
|
touchending = null; |
|
}, 500); |
|
for (i = 0; i < n; ++i) { |
|
if (gesture = gestures[touches[i].identifier]) { |
|
nopropagation(event); |
|
gesture("end", event, touches[i]); |
|
} |
|
} |
|
} |
|
function beforestart(that, container2, event, d, identifier, touch) { |
|
var dispatch2 = listeners.copy(), p = pointer_default(touch || event, container2), dx, dy, s; |
|
if ((s = subject.call(that, new DragEvent("beforestart", { |
|
sourceEvent: event, |
|
target: drag, |
|
identifier, |
|
active, |
|
x: p[0], |
|
y: p[1], |
|
dx: 0, |
|
dy: 0, |
|
dispatch: dispatch2 |
|
}), d)) == null) return; |
|
dx = s.x - p[0] || 0; |
|
dy = s.y - p[1] || 0; |
|
return function gesture(type, event2, touch2) { |
|
var p0 = p, n; |
|
switch (type) { |
|
case "start": |
|
gestures[identifier] = gesture, n = active++; |
|
break; |
|
case "end": |
|
delete gestures[identifier], --active; |
|
case "drag": |
|
p = pointer_default(touch2 || event2, container2), n = active; |
|
break; |
|
} |
|
dispatch2.call( |
|
type, |
|
that, |
|
new DragEvent(type, { |
|
sourceEvent: event2, |
|
subject: s, |
|
target: drag, |
|
identifier, |
|
active: n, |
|
x: p[0] + dx, |
|
y: p[1] + dy, |
|
dx: p[0] - p0[0], |
|
dy: p[1] - p0[1], |
|
dispatch: dispatch2 |
|
}), |
|
d |
|
); |
|
}; |
|
} |
|
drag.filter = function(_) { |
|
return arguments.length ? (filter2 = typeof _ === "function" ? _ : constant_default3(!!_), drag) : filter2; |
|
}; |
|
drag.container = function(_) { |
|
return arguments.length ? (container = typeof _ === "function" ? _ : constant_default3(_), drag) : container; |
|
}; |
|
drag.subject = function(_) { |
|
return arguments.length ? (subject = typeof _ === "function" ? _ : constant_default3(_), drag) : subject; |
|
}; |
|
drag.touchable = function(_) { |
|
return arguments.length ? (touchable = typeof _ === "function" ? _ : constant_default3(!!_), drag) : touchable; |
|
}; |
|
drag.on = function() { |
|
var value = listeners.on.apply(listeners, arguments); |
|
return value === listeners ? drag : value; |
|
}; |
|
drag.clickDistance = function(_) { |
|
return arguments.length ? (clickDistance2 = (_ = +_) * _, drag) : Math.sqrt(clickDistance2); |
|
}; |
|
return drag; |
|
} |
|
|
|
|
|
var frame = 0; |
|
var timeout = 0; |
|
var interval = 0; |
|
var pokeDelay = 1e3; |
|
var taskHead; |
|
var taskTail; |
|
var clockLast = 0; |
|
var clockNow = 0; |
|
var clockSkew = 0; |
|
var clock = typeof performance === "object" && performance.now ? performance : Date; |
|
var setFrame = typeof window === "object" && window.requestAnimationFrame ? window.requestAnimationFrame.bind(window) : function(f) { |
|
setTimeout(f, 17); |
|
}; |
|
function now() { |
|
return clockNow || (setFrame(clearNow), clockNow = clock.now() + clockSkew); |
|
} |
|
function clearNow() { |
|
clockNow = 0; |
|
} |
|
function Timer() { |
|
this._call = this._time = this._next = null; |
|
} |
|
Timer.prototype = timer.prototype = { |
|
constructor: Timer, |
|
restart: function(callback, delay, time) { |
|
if (typeof callback !== "function") throw new TypeError("callback is not a function"); |
|
time = (time == null ? now() : +time) + (delay == null ? 0 : +delay); |
|
if (!this._next && taskTail !== this) { |
|
if (taskTail) taskTail._next = this; |
|
else taskHead = this; |
|
taskTail = this; |
|
} |
|
this._call = callback; |
|
this._time = time; |
|
sleep(); |
|
}, |
|
stop: function() { |
|
if (this._call) { |
|
this._call = null; |
|
this._time = Infinity; |
|
sleep(); |
|
} |
|
} |
|
}; |
|
function timer(callback, delay, time) { |
|
var t = new Timer(); |
|
t.restart(callback, delay, time); |
|
return t; |
|
} |
|
function timerFlush() { |
|
now(); |
|
++frame; |
|
var t = taskHead, e; |
|
while (t) { |
|
if ((e = clockNow - t._time) >= 0) t._call.call(void 0, e); |
|
t = t._next; |
|
} |
|
--frame; |
|
} |
|
function wake() { |
|
clockNow = (clockLast = clock.now()) + clockSkew; |
|
frame = timeout = 0; |
|
try { |
|
timerFlush(); |
|
} finally { |
|
frame = 0; |
|
nap(); |
|
clockNow = 0; |
|
} |
|
} |
|
function poke() { |
|
var now2 = clock.now(), delay = now2 - clockLast; |
|
if (delay > pokeDelay) clockSkew -= delay, clockLast = now2; |
|
} |
|
function nap() { |
|
var t02, t12 = taskHead, t22, time = Infinity; |
|
while (t12) { |
|
if (t12._call) { |
|
if (time > t12._time) time = t12._time; |
|
t02 = t12, t12 = t12._next; |
|
} else { |
|
t22 = t12._next, t12._next = null; |
|
t12 = t02 ? t02._next = t22 : taskHead = t22; |
|
} |
|
} |
|
taskTail = t02; |
|
sleep(time); |
|
} |
|
function sleep(time) { |
|
if (frame) return; |
|
if (timeout) timeout = clearTimeout(timeout); |
|
var delay = time - clockNow; |
|
if (delay > 24) { |
|
if (time < Infinity) timeout = setTimeout(wake, time - clock.now() - clockSkew); |
|
if (interval) interval = clearInterval(interval); |
|
} else { |
|
if (!interval) clockLast = clock.now(), interval = setInterval(poke, pokeDelay); |
|
frame = 1, setFrame(wake); |
|
} |
|
} |
|
|
|
|
|
function timeout_default(callback, delay, time) { |
|
var t = new Timer(); |
|
delay = delay == null ? 0 : +delay; |
|
t.restart((elapsed) => { |
|
t.stop(); |
|
callback(elapsed + delay); |
|
}, delay, time); |
|
return t; |
|
} |
|
|
|
|
|
var emptyOn = dispatch_default2("start", "end", "cancel", "interrupt"); |
|
var emptyTween = []; |
|
var CREATED = 0; |
|
var SCHEDULED = 1; |
|
var STARTING = 2; |
|
var STARTED = 3; |
|
var RUNNING = 4; |
|
var ENDING = 5; |
|
var ENDED = 6; |
|
function schedule_default(node, name, id2, index, group, timing) { |
|
var schedules = node.__transition; |
|
if (!schedules) node.__transition = {}; |
|
else if (id2 in schedules) return; |
|
create(node, id2, { |
|
name, |
|
index, |
|
|
|
group, |
|
|
|
on: emptyOn, |
|
tween: emptyTween, |
|
time: timing.time, |
|
delay: timing.delay, |
|
duration: timing.duration, |
|
ease: timing.ease, |
|
timer: null, |
|
state: CREATED |
|
}); |
|
} |
|
function init(node, id2) { |
|
var schedule = get2(node, id2); |
|
if (schedule.state > CREATED) throw new Error("too late; already scheduled"); |
|
return schedule; |
|
} |
|
function set2(node, id2) { |
|
var schedule = get2(node, id2); |
|
if (schedule.state > STARTED) throw new Error("too late; already running"); |
|
return schedule; |
|
} |
|
function get2(node, id2) { |
|
var schedule = node.__transition; |
|
if (!schedule || !(schedule = schedule[id2])) throw new Error("transition not found"); |
|
return schedule; |
|
} |
|
function create(node, id2, self) { |
|
var schedules = node.__transition, tween; |
|
schedules[id2] = self; |
|
self.timer = timer(schedule, 0, self.time); |
|
function schedule(elapsed) { |
|
self.state = SCHEDULED; |
|
self.timer.restart(start2, self.delay, self.time); |
|
if (self.delay <= elapsed) start2(elapsed - self.delay); |
|
} |
|
function start2(elapsed) { |
|
var i, j, n, o; |
|
if (self.state !== SCHEDULED) return stop(); |
|
for (i in schedules) { |
|
o = schedules[i]; |
|
if (o.name !== self.name) continue; |
|
if (o.state === STARTED) return timeout_default(start2); |
|
if (o.state === RUNNING) { |
|
o.state = ENDED; |
|
o.timer.stop(); |
|
o.on.call("interrupt", node, node.__data__, o.index, o.group); |
|
delete schedules[i]; |
|
} else if (+i < id2) { |
|
o.state = ENDED; |
|
o.timer.stop(); |
|
o.on.call("cancel", node, node.__data__, o.index, o.group); |
|
delete schedules[i]; |
|
} |
|
} |
|
timeout_default(function() { |
|
if (self.state === STARTED) { |
|
self.state = RUNNING; |
|
self.timer.restart(tick, self.delay, self.time); |
|
tick(elapsed); |
|
} |
|
}); |
|
self.state = STARTING; |
|
self.on.call("start", node, node.__data__, self.index, self.group); |
|
if (self.state !== STARTING) return; |
|
self.state = STARTED; |
|
tween = new Array(n = self.tween.length); |
|
for (i = 0, j = -1; i < n; ++i) { |
|
if (o = self.tween[i].value.call(node, node.__data__, self.index, self.group)) { |
|
tween[++j] = o; |
|
} |
|
} |
|
tween.length = j + 1; |
|
} |
|
function tick(elapsed) { |
|
var t = elapsed < self.duration ? self.ease.call(null, elapsed / self.duration) : (self.timer.restart(stop), self.state = ENDING, 1), i = -1, n = tween.length; |
|
while (++i < n) { |
|
tween[i].call(node, t); |
|
} |
|
if (self.state === ENDING) { |
|
self.on.call("end", node, node.__data__, self.index, self.group); |
|
stop(); |
|
} |
|
} |
|
function stop() { |
|
self.state = ENDED; |
|
self.timer.stop(); |
|
delete schedules[id2]; |
|
for (var i in schedules) return; |
|
delete node.__transition; |
|
} |
|
} |
|
|
|
|
|
function interrupt_default(node, name) { |
|
var schedules = node.__transition, schedule, active, empty2 = true, i; |
|
if (!schedules) return; |
|
name = name == null ? null : name + ""; |
|
for (i in schedules) { |
|
if ((schedule = schedules[i]).name !== name) { |
|
empty2 = false; |
|
continue; |
|
} |
|
active = schedule.state > STARTING && schedule.state < ENDING; |
|
schedule.state = ENDED; |
|
schedule.timer.stop(); |
|
schedule.on.call(active ? "interrupt" : "cancel", node, node.__data__, schedule.index, schedule.group); |
|
delete schedules[i]; |
|
} |
|
if (empty2) delete node.__transition; |
|
} |
|
|
|
|
|
function tweenRemove(id2, name) { |
|
var tween0, tween1; |
|
return function() { |
|
var schedule = set2(this, id2), tween = schedule.tween; |
|
if (tween !== tween0) { |
|
tween1 = tween0 = tween; |
|
for (var i = 0, n = tween1.length; i < n; ++i) { |
|
if (tween1[i].name === name) { |
|
tween1 = tween1.slice(); |
|
tween1.splice(i, 1); |
|
break; |
|
} |
|
} |
|
} |
|
schedule.tween = tween1; |
|
}; |
|
} |
|
function tweenFunction(id2, name, value) { |
|
var tween0, tween1; |
|
if (typeof value !== "function") throw new Error(); |
|
return function() { |
|
var schedule = set2(this, id2), tween = schedule.tween; |
|
if (tween !== tween0) { |
|
tween1 = (tween0 = tween).slice(); |
|
for (var t = { name, value }, i = 0, n = tween1.length; i < n; ++i) { |
|
if (tween1[i].name === name) { |
|
tween1[i] = t; |
|
break; |
|
} |
|
} |
|
if (i === n) tween1.push(t); |
|
} |
|
schedule.tween = tween1; |
|
}; |
|
} |
|
function tween_default(name, value) { |
|
var id2 = this._id; |
|
name += ""; |
|
if (arguments.length < 2) { |
|
var tween = get2(this.node(), id2).tween; |
|
for (var i = 0, n = tween.length, t; i < n; ++i) { |
|
if ((t = tween[i]).name === name) { |
|
return t.value; |
|
} |
|
} |
|
return null; |
|
} |
|
return this.each((value == null ? tweenRemove : tweenFunction)(id2, name, value)); |
|
} |
|
function tweenValue(transition2, name, value) { |
|
var id2 = transition2._id; |
|
transition2.each(function() { |
|
var schedule = set2(this, id2); |
|
(schedule.value || (schedule.value = {}))[name] = value.apply(this, arguments); |
|
}); |
|
return function(node) { |
|
return get2(node, id2).value[name]; |
|
}; |
|
} |
|
|
|
|
|
function interpolate_default(a, b) { |
|
var c; |
|
return (typeof b === "number" ? number_default : b instanceof color ? rgb_default : (c = color(b)) ? (b = c, rgb_default) : string_default)(a, b); |
|
} |
|
|
|
|
|
function attrRemove2(name) { |
|
return function() { |
|
this.removeAttribute(name); |
|
}; |
|
} |
|
function attrRemoveNS2(fullname) { |
|
return function() { |
|
this.removeAttributeNS(fullname.space, fullname.local); |
|
}; |
|
} |
|
function attrConstant2(name, interpolate, value1) { |
|
var string00, string1 = value1 + "", interpolate0; |
|
return function() { |
|
var string0 = this.getAttribute(name); |
|
return string0 === string1 ? null : string0 === string00 ? interpolate0 : interpolate0 = interpolate(string00 = string0, value1); |
|
}; |
|
} |
|
function attrConstantNS2(fullname, interpolate, value1) { |
|
var string00, string1 = value1 + "", interpolate0; |
|
return function() { |
|
var string0 = this.getAttributeNS(fullname.space, fullname.local); |
|
return string0 === string1 ? null : string0 === string00 ? interpolate0 : interpolate0 = interpolate(string00 = string0, value1); |
|
}; |
|
} |
|
function attrFunction2(name, interpolate, value) { |
|
var string00, string10, interpolate0; |
|
return function() { |
|
var string0, value1 = value(this), string1; |
|
if (value1 == null) return void this.removeAttribute(name); |
|
string0 = this.getAttribute(name); |
|
string1 = value1 + ""; |
|
return string0 === string1 ? null : string0 === string00 && string1 === string10 ? interpolate0 : (string10 = string1, interpolate0 = interpolate(string00 = string0, value1)); |
|
}; |
|
} |
|
function attrFunctionNS2(fullname, interpolate, value) { |
|
var string00, string10, interpolate0; |
|
return function() { |
|
var string0, value1 = value(this), string1; |
|
if (value1 == null) return void this.removeAttributeNS(fullname.space, fullname.local); |
|
string0 = this.getAttributeNS(fullname.space, fullname.local); |
|
string1 = value1 + ""; |
|
return string0 === string1 ? null : string0 === string00 && string1 === string10 ? interpolate0 : (string10 = string1, interpolate0 = interpolate(string00 = string0, value1)); |
|
}; |
|
} |
|
function attr_default2(name, value) { |
|
var fullname = namespace_default(name), i = fullname === "transform" ? interpolateTransformSvg : interpolate_default; |
|
return this.attrTween(name, typeof value === "function" ? (fullname.local ? attrFunctionNS2 : attrFunction2)(fullname, i, tweenValue(this, "attr." + name, value)) : value == null ? (fullname.local ? attrRemoveNS2 : attrRemove2)(fullname) : (fullname.local ? attrConstantNS2 : attrConstant2)(fullname, i, value)); |
|
} |
|
|
|
|
|
function attrInterpolate(name, i) { |
|
return function(t) { |
|
this.setAttribute(name, i.call(this, t)); |
|
}; |
|
} |
|
function attrInterpolateNS(fullname, i) { |
|
return function(t) { |
|
this.setAttributeNS(fullname.space, fullname.local, i.call(this, t)); |
|
}; |
|
} |
|
function attrTweenNS(fullname, value) { |
|
var t02, i0; |
|
function tween() { |
|
var i = value.apply(this, arguments); |
|
if (i !== i0) t02 = (i0 = i) && attrInterpolateNS(fullname, i); |
|
return t02; |
|
} |
|
tween._value = value; |
|
return tween; |
|
} |
|
function attrTween(name, value) { |
|
var t02, i0; |
|
function tween() { |
|
var i = value.apply(this, arguments); |
|
if (i !== i0) t02 = (i0 = i) && attrInterpolate(name, i); |
|
return t02; |
|
} |
|
tween._value = value; |
|
return tween; |
|
} |
|
function attrTween_default(name, value) { |
|
var key = "attr." + name; |
|
if (arguments.length < 2) return (key = this.tween(key)) && key._value; |
|
if (value == null) return this.tween(key, null); |
|
if (typeof value !== "function") throw new Error(); |
|
var fullname = namespace_default(name); |
|
return this.tween(key, (fullname.local ? attrTweenNS : attrTween)(fullname, value)); |
|
} |
|
|
|
|
|
function delayFunction(id2, value) { |
|
return function() { |
|
init(this, id2).delay = +value.apply(this, arguments); |
|
}; |
|
} |
|
function delayConstant(id2, value) { |
|
return value = +value, function() { |
|
init(this, id2).delay = value; |
|
}; |
|
} |
|
function delay_default(value) { |
|
var id2 = this._id; |
|
return arguments.length ? this.each((typeof value === "function" ? delayFunction : delayConstant)(id2, value)) : get2(this.node(), id2).delay; |
|
} |
|
|
|
|
|
function durationFunction(id2, value) { |
|
return function() { |
|
set2(this, id2).duration = +value.apply(this, arguments); |
|
}; |
|
} |
|
function durationConstant(id2, value) { |
|
return value = +value, function() { |
|
set2(this, id2).duration = value; |
|
}; |
|
} |
|
function duration_default(value) { |
|
var id2 = this._id; |
|
return arguments.length ? this.each((typeof value === "function" ? durationFunction : durationConstant)(id2, value)) : get2(this.node(), id2).duration; |
|
} |
|
|
|
|
|
function easeConstant(id2, value) { |
|
if (typeof value !== "function") throw new Error(); |
|
return function() { |
|
set2(this, id2).ease = value; |
|
}; |
|
} |
|
function ease_default(value) { |
|
var id2 = this._id; |
|
return arguments.length ? this.each(easeConstant(id2, value)) : get2(this.node(), id2).ease; |
|
} |
|
|
|
|
|
function easeVarying(id2, value) { |
|
return function() { |
|
var v = value.apply(this, arguments); |
|
if (typeof v !== "function") throw new Error(); |
|
set2(this, id2).ease = v; |
|
}; |
|
} |
|
function easeVarying_default(value) { |
|
if (typeof value !== "function") throw new Error(); |
|
return this.each(easeVarying(this._id, value)); |
|
} |
|
|
|
|
|
function filter_default2(match) { |
|
if (typeof match !== "function") match = matcher_default(match); |
|
for (var groups = this._groups, m = groups.length, subgroups = new Array(m), j = 0; j < m; ++j) { |
|
for (var group = groups[j], n = group.length, subgroup = subgroups[j] = [], node, i = 0; i < n; ++i) { |
|
if ((node = group[i]) && match.call(node, node.__data__, i, group)) { |
|
subgroup.push(node); |
|
} |
|
} |
|
} |
|
return new Transition(subgroups, this._parents, this._name, this._id); |
|
} |
|
|
|
|
|
function merge_default2(transition2) { |
|
if (transition2._id !== this._id) throw new Error(); |
|
for (var groups0 = this._groups, groups1 = transition2._groups, m0 = groups0.length, m1 = groups1.length, m = Math.min(m0, m1), merges = new Array(m0), j = 0; j < m; ++j) { |
|
for (var group0 = groups0[j], group1 = groups1[j], n = group0.length, merge = merges[j] = new Array(n), node, i = 0; i < n; ++i) { |
|
if (node = group0[i] || group1[i]) { |
|
merge[i] = node; |
|
} |
|
} |
|
} |
|
for (; j < m0; ++j) { |
|
merges[j] = groups0[j]; |
|
} |
|
return new Transition(merges, this._parents, this._name, this._id); |
|
} |
|
|
|
|
|
function start(name) { |
|
return (name + "").trim().split(/^|\s+/).every(function(t) { |
|
var i = t.indexOf("."); |
|
if (i >= 0) t = t.slice(0, i); |
|
return !t || t === "start"; |
|
}); |
|
} |
|
function onFunction(id2, name, listener) { |
|
var on0, on1, sit = start(name) ? init : set2; |
|
return function() { |
|
var schedule = sit(this, id2), on = schedule.on; |
|
if (on !== on0) (on1 = (on0 = on).copy()).on(name, listener); |
|
schedule.on = on1; |
|
}; |
|
} |
|
function on_default2(name, listener) { |
|
var id2 = this._id; |
|
return arguments.length < 2 ? get2(this.node(), id2).on.on(name) : this.each(onFunction(id2, name, listener)); |
|
} |
|
|
|
|
|
function removeFunction(id2) { |
|
return function() { |
|
var parent = this.parentNode; |
|
for (var i in this.__transition) if (+i !== id2) return; |
|
if (parent) parent.removeChild(this); |
|
}; |
|
} |
|
function remove_default2() { |
|
return this.on("end.remove", removeFunction(this._id)); |
|
} |
|
|
|
|
|
function select_default3(select) { |
|
var name = this._name, id2 = this._id; |
|
if (typeof select !== "function") select = selector_default(select); |
|
for (var groups = this._groups, m = groups.length, subgroups = new Array(m), j = 0; j < m; ++j) { |
|
for (var group = groups[j], n = group.length, subgroup = subgroups[j] = new Array(n), node, subnode, i = 0; i < n; ++i) { |
|
if ((node = group[i]) && (subnode = select.call(node, node.__data__, i, group))) { |
|
if ("__data__" in node) subnode.__data__ = node.__data__; |
|
subgroup[i] = subnode; |
|
schedule_default(subgroup[i], name, id2, i, subgroup, get2(node, id2)); |
|
} |
|
} |
|
} |
|
return new Transition(subgroups, this._parents, name, id2); |
|
} |
|
|
|
|
|
function selectAll_default3(select) { |
|
var name = this._name, id2 = this._id; |
|
if (typeof select !== "function") select = selectorAll_default(select); |
|
for (var groups = this._groups, m = groups.length, subgroups = [], parents = [], j = 0; j < m; ++j) { |
|
for (var group = groups[j], n = group.length, node, i = 0; i < n; ++i) { |
|
if (node = group[i]) { |
|
for (var children2 = select.call(node, node.__data__, i, group), child, inherit2 = get2(node, id2), k = 0, l = children2.length; k < l; ++k) { |
|
if (child = children2[k]) { |
|
schedule_default(child, name, id2, k, children2, inherit2); |
|
} |
|
} |
|
subgroups.push(children2); |
|
parents.push(node); |
|
} |
|
} |
|
} |
|
return new Transition(subgroups, parents, name, id2); |
|
} |
|
|
|
|
|
var Selection2 = selection_default.prototype.constructor; |
|
function selection_default2() { |
|
return new Selection2(this._groups, this._parents); |
|
} |
|
|
|
|
|
function styleNull(name, interpolate) { |
|
var string00, string10, interpolate0; |
|
return function() { |
|
var string0 = styleValue(this, name), string1 = (this.style.removeProperty(name), styleValue(this, name)); |
|
return string0 === string1 ? null : string0 === string00 && string1 === string10 ? interpolate0 : interpolate0 = interpolate(string00 = string0, string10 = string1); |
|
}; |
|
} |
|
function styleRemove2(name) { |
|
return function() { |
|
this.style.removeProperty(name); |
|
}; |
|
} |
|
function styleConstant2(name, interpolate, value1) { |
|
var string00, string1 = value1 + "", interpolate0; |
|
return function() { |
|
var string0 = styleValue(this, name); |
|
return string0 === string1 ? null : string0 === string00 ? interpolate0 : interpolate0 = interpolate(string00 = string0, value1); |
|
}; |
|
} |
|
function styleFunction2(name, interpolate, value) { |
|
var string00, string10, interpolate0; |
|
return function() { |
|
var string0 = styleValue(this, name), value1 = value(this), string1 = value1 + ""; |
|
if (value1 == null) string1 = value1 = (this.style.removeProperty(name), styleValue(this, name)); |
|
return string0 === string1 ? null : string0 === string00 && string1 === string10 ? interpolate0 : (string10 = string1, interpolate0 = interpolate(string00 = string0, value1)); |
|
}; |
|
} |
|
function styleMaybeRemove(id2, name) { |
|
var on0, on1, listener0, key = "style." + name, event = "end." + key, remove2; |
|
return function() { |
|
var schedule = set2(this, id2), on = schedule.on, listener = schedule.value[key] == null ? remove2 || (remove2 = styleRemove2(name)) : void 0; |
|
if (on !== on0 || listener0 !== listener) (on1 = (on0 = on).copy()).on(event, listener0 = listener); |
|
schedule.on = on1; |
|
}; |
|
} |
|
function style_default2(name, value, priority) { |
|
var i = (name += "") === "transform" ? interpolateTransformCss : interpolate_default; |
|
return value == null ? this.styleTween(name, styleNull(name, i)).on("end.style." + name, styleRemove2(name)) : typeof value === "function" ? this.styleTween(name, styleFunction2(name, i, tweenValue(this, "style." + name, value))).each(styleMaybeRemove(this._id, name)) : this.styleTween(name, styleConstant2(name, i, value), priority).on("end.style." + name, null); |
|
} |
|
|
|
|
|
function styleInterpolate(name, i, priority) { |
|
return function(t) { |
|
this.style.setProperty(name, i.call(this, t), priority); |
|
}; |
|
} |
|
function styleTween(name, value, priority) { |
|
var t, i0; |
|
function tween() { |
|
var i = value.apply(this, arguments); |
|
if (i !== i0) t = (i0 = i) && styleInterpolate(name, i, priority); |
|
return t; |
|
} |
|
tween._value = value; |
|
return tween; |
|
} |
|
function styleTween_default(name, value, priority) { |
|
var key = "style." + (name += ""); |
|
if (arguments.length < 2) return (key = this.tween(key)) && key._value; |
|
if (value == null) return this.tween(key, null); |
|
if (typeof value !== "function") throw new Error(); |
|
return this.tween(key, styleTween(name, value, priority == null ? "" : priority)); |
|
} |
|
|
|
|
|
function textConstant2(value) { |
|
return function() { |
|
this.textContent = value; |
|
}; |
|
} |
|
function textFunction2(value) { |
|
return function() { |
|
var value1 = value(this); |
|
this.textContent = value1 == null ? "" : value1; |
|
}; |
|
} |
|
function text_default2(value) { |
|
return this.tween("text", typeof value === "function" ? textFunction2(tweenValue(this, "text", value)) : textConstant2(value == null ? "" : value + "")); |
|
} |
|
|
|
|
|
function textInterpolate(i) { |
|
return function(t) { |
|
this.textContent = i.call(this, t); |
|
}; |
|
} |
|
function textTween(value) { |
|
var t02, i0; |
|
function tween() { |
|
var i = value.apply(this, arguments); |
|
if (i !== i0) t02 = (i0 = i) && textInterpolate(i); |
|
return t02; |
|
} |
|
tween._value = value; |
|
return tween; |
|
} |
|
function textTween_default(value) { |
|
var key = "text"; |
|
if (arguments.length < 1) return (key = this.tween(key)) && key._value; |
|
if (value == null) return this.tween(key, null); |
|
if (typeof value !== "function") throw new Error(); |
|
return this.tween(key, textTween(value)); |
|
} |
|
|
|
|
|
function transition_default() { |
|
var name = this._name, id0 = this._id, id1 = newId(); |
|
for (var groups = this._groups, m = groups.length, j = 0; j < m; ++j) { |
|
for (var group = groups[j], n = group.length, node, i = 0; i < n; ++i) { |
|
if (node = group[i]) { |
|
var inherit2 = get2(node, id0); |
|
schedule_default(node, name, id1, i, group, { |
|
time: inherit2.time + inherit2.delay + inherit2.duration, |
|
delay: 0, |
|
duration: inherit2.duration, |
|
ease: inherit2.ease |
|
}); |
|
} |
|
} |
|
} |
|
return new Transition(groups, this._parents, name, id1); |
|
} |
|
|
|
|
|
function end_default() { |
|
var on0, on1, that = this, id2 = that._id, size = that.size(); |
|
return new Promise(function(resolve, reject) { |
|
var cancel = { value: reject }, end = { value: function() { |
|
if (--size === 0) resolve(); |
|
} }; |
|
that.each(function() { |
|
var schedule = set2(this, id2), on = schedule.on; |
|
if (on !== on0) { |
|
on1 = (on0 = on).copy(); |
|
on1._.cancel.push(cancel); |
|
on1._.interrupt.push(cancel); |
|
on1._.end.push(end); |
|
} |
|
schedule.on = on1; |
|
}); |
|
if (size === 0) resolve(); |
|
}); |
|
} |
|
|
|
|
|
var id = 0; |
|
function Transition(groups, parents, name, id2) { |
|
this._groups = groups; |
|
this._parents = parents; |
|
this._name = name; |
|
this._id = id2; |
|
} |
|
function transition(name) { |
|
return selection_default().transition(name); |
|
} |
|
function newId() { |
|
return ++id; |
|
} |
|
var selection_prototype = selection_default.prototype; |
|
Transition.prototype = transition.prototype = { |
|
constructor: Transition, |
|
select: select_default3, |
|
selectAll: selectAll_default3, |
|
selectChild: selection_prototype.selectChild, |
|
selectChildren: selection_prototype.selectChildren, |
|
filter: filter_default2, |
|
merge: merge_default2, |
|
selection: selection_default2, |
|
transition: transition_default, |
|
call: selection_prototype.call, |
|
nodes: selection_prototype.nodes, |
|
node: selection_prototype.node, |
|
size: selection_prototype.size, |
|
empty: selection_prototype.empty, |
|
each: selection_prototype.each, |
|
on: on_default2, |
|
attr: attr_default2, |
|
attrTween: attrTween_default, |
|
style: style_default2, |
|
styleTween: styleTween_default, |
|
text: text_default2, |
|
textTween: textTween_default, |
|
remove: remove_default2, |
|
tween: tween_default, |
|
delay: delay_default, |
|
duration: duration_default, |
|
ease: ease_default, |
|
easeVarying: easeVarying_default, |
|
end: end_default, |
|
[Symbol.iterator]: selection_prototype[Symbol.iterator] |
|
}; |
|
|
|
|
|
function cubicInOut(t) { |
|
return ((t *= 2) <= 1 ? t * t * t : (t -= 2) * t * t + 2) / 2; |
|
} |
|
|
|
|
|
var exponent = 3; |
|
var polyIn = function custom(e) { |
|
e = +e; |
|
function polyIn2(t) { |
|
return Math.pow(t, e); |
|
} |
|
polyIn2.exponent = custom; |
|
return polyIn2; |
|
}(exponent); |
|
var polyOut = function custom2(e) { |
|
e = +e; |
|
function polyOut2(t) { |
|
return 1 - Math.pow(1 - t, e); |
|
} |
|
polyOut2.exponent = custom2; |
|
return polyOut2; |
|
}(exponent); |
|
var polyInOut = function custom3(e) { |
|
e = +e; |
|
function polyInOut2(t) { |
|
return ((t *= 2) <= 1 ? Math.pow(t, e) : 2 - Math.pow(2 - t, e)) / 2; |
|
} |
|
polyInOut2.exponent = custom3; |
|
return polyInOut2; |
|
}(exponent); |
|
|
|
|
|
var pi = Math.PI; |
|
var halfPi = pi / 2; |
|
|
|
|
|
function tpmt(x) { |
|
return (Math.pow(2, -10 * x) - 9765625e-10) * 1.0009775171065494; |
|
} |
|
|
|
|
|
var b1 = 4 / 11; |
|
var b2 = 6 / 11; |
|
var b3 = 8 / 11; |
|
var b4 = 3 / 4; |
|
var b5 = 9 / 11; |
|
var b6 = 10 / 11; |
|
var b7 = 15 / 16; |
|
var b8 = 21 / 22; |
|
var b9 = 63 / 64; |
|
var b0 = 1 / b1 / b1; |
|
|
|
|
|
var overshoot = 1.70158; |
|
var backIn = function custom4(s) { |
|
s = +s; |
|
function backIn2(t) { |
|
return (t = +t) * t * (s * (t - 1) + t); |
|
} |
|
backIn2.overshoot = custom4; |
|
return backIn2; |
|
}(overshoot); |
|
var backOut = function custom5(s) { |
|
s = +s; |
|
function backOut2(t) { |
|
return --t * t * ((t + 1) * s + t) + 1; |
|
} |
|
backOut2.overshoot = custom5; |
|
return backOut2; |
|
}(overshoot); |
|
var backInOut = function custom6(s) { |
|
s = +s; |
|
function backInOut2(t) { |
|
return ((t *= 2) < 1 ? t * t * ((s + 1) * t - s) : (t -= 2) * t * ((s + 1) * t + s) + 2) / 2; |
|
} |
|
backInOut2.overshoot = custom6; |
|
return backInOut2; |
|
}(overshoot); |
|
|
|
|
|
var tau = 2 * Math.PI; |
|
var amplitude = 1; |
|
var period = 0.3; |
|
var elasticIn = function custom7(a, p) { |
|
var s = Math.asin(1 / (a = Math.max(1, a))) * (p /= tau); |
|
function elasticIn2(t) { |
|
return a * tpmt(- --t) * Math.sin((s - t) / p); |
|
} |
|
elasticIn2.amplitude = function(a2) { |
|
return custom7(a2, p * tau); |
|
}; |
|
elasticIn2.period = function(p2) { |
|
return custom7(a, p2); |
|
}; |
|
return elasticIn2; |
|
}(amplitude, period); |
|
var elasticOut = function custom8(a, p) { |
|
var s = Math.asin(1 / (a = Math.max(1, a))) * (p /= tau); |
|
function elasticOut2(t) { |
|
return 1 - a * tpmt(t = +t) * Math.sin((t + s) / p); |
|
} |
|
elasticOut2.amplitude = function(a2) { |
|
return custom8(a2, p * tau); |
|
}; |
|
elasticOut2.period = function(p2) { |
|
return custom8(a, p2); |
|
}; |
|
return elasticOut2; |
|
}(amplitude, period); |
|
var elasticInOut = function custom9(a, p) { |
|
var s = Math.asin(1 / (a = Math.max(1, a))) * (p /= tau); |
|
function elasticInOut2(t) { |
|
return ((t = t * 2 - 1) < 0 ? a * tpmt(-t) * Math.sin((s - t) / p) : 2 - a * tpmt(t) * Math.sin((s + t) / p)) / 2; |
|
} |
|
elasticInOut2.amplitude = function(a2) { |
|
return custom9(a2, p * tau); |
|
}; |
|
elasticInOut2.period = function(p2) { |
|
return custom9(a, p2); |
|
}; |
|
return elasticInOut2; |
|
}(amplitude, period); |
|
|
|
|
|
function interrupt_default2(name) { |
|
return this.each(function() { |
|
interrupt_default(this, name); |
|
}); |
|
} |
|
|
|
|
|
var defaultTiming = { |
|
time: null, |
|
|
|
delay: 0, |
|
duration: 250, |
|
ease: cubicInOut |
|
}; |
|
function inherit(node, id2) { |
|
var timing; |
|
while (!(timing = node.__transition) || !(timing = timing[id2])) { |
|
if (!(node = node.parentNode)) { |
|
throw new Error(`transition ${id2} not found`); |
|
} |
|
} |
|
return timing; |
|
} |
|
function transition_default2(name) { |
|
var id2, timing; |
|
if (name instanceof Transition) { |
|
id2 = name._id, name = name._name; |
|
} else { |
|
id2 = newId(), (timing = defaultTiming).time = now(), name = name == null ? null : name + ""; |
|
} |
|
for (var groups = this._groups, m = groups.length, j = 0; j < m; ++j) { |
|
for (var group = groups[j], n = group.length, node, i = 0; i < n; ++i) { |
|
if (node = group[i]) { |
|
schedule_default(node, name, id2, i, group, timing || inherit(node, id2)); |
|
} |
|
} |
|
} |
|
return new Transition(groups, this._parents, name, id2); |
|
} |
|
|
|
|
|
selection_default.prototype.interrupt = interrupt_default2; |
|
selection_default.prototype.transition = transition_default2; |
|
|
|
|
|
function Transform(k, x, y) { |
|
this.k = k; |
|
this.x = x; |
|
this.y = y; |
|
} |
|
Transform.prototype = { |
|
constructor: Transform, |
|
scale: function(k) { |
|
return k === 1 ? this : new Transform(this.k * k, this.x, this.y); |
|
}, |
|
translate: function(x, y) { |
|
return x === 0 & y === 0 ? this : new Transform(this.k, this.x + this.k * x, this.y + this.k * y); |
|
}, |
|
apply: function(point) { |
|
return [point[0] * this.k + this.x, point[1] * this.k + this.y]; |
|
}, |
|
applyX: function(x) { |
|
return x * this.k + this.x; |
|
}, |
|
applyY: function(y) { |
|
return y * this.k + this.y; |
|
}, |
|
invert: function(location) { |
|
return [(location[0] - this.x) / this.k, (location[1] - this.y) / this.k]; |
|
}, |
|
invertX: function(x) { |
|
return (x - this.x) / this.k; |
|
}, |
|
invertY: function(y) { |
|
return (y - this.y) / this.k; |
|
}, |
|
rescaleX: function(x) { |
|
return x.copy().domain(x.range().map(this.invertX, this).map(x.invert, x)); |
|
}, |
|
rescaleY: function(y) { |
|
return y.copy().domain(y.range().map(this.invertY, this).map(y.invert, y)); |
|
}, |
|
toString: function() { |
|
return "translate(" + this.x + "," + this.y + ") scale(" + this.k + ")"; |
|
} |
|
}; |
|
var identity2 = new Transform(1, 0, 0); |
|
transform.prototype = Transform.prototype; |
|
function transform(node) { |
|
while (!node.__zoom) if (!(node = node.parentNode)) return identity2; |
|
return node.__zoom; |
|
} |
|
|
|
|
|
var constant_default4 = (x) => () => x; |
|
|
|
|
|
function ZoomEvent(type, { |
|
sourceEvent, |
|
target, |
|
transform: transform2, |
|
dispatch: dispatch2 |
|
}) { |
|
Object.defineProperties(this, { |
|
type: { value: type, enumerable: true, configurable: true }, |
|
sourceEvent: { value: sourceEvent, enumerable: true, configurable: true }, |
|
target: { value: target, enumerable: true, configurable: true }, |
|
transform: { value: transform2, enumerable: true, configurable: true }, |
|
_: { value: dispatch2 } |
|
}); |
|
} |
|
|
|
|
|
function nopropagation2(event) { |
|
event.stopImmediatePropagation(); |
|
} |
|
function noevent_default2(event) { |
|
event.preventDefault(); |
|
event.stopImmediatePropagation(); |
|
} |
|
|
|
|
|
function defaultFilter2(event) { |
|
return (!event.ctrlKey || event.type === "wheel") && !event.button; |
|
} |
|
function defaultExtent() { |
|
var e = this; |
|
if (e instanceof SVGElement) { |
|
e = e.ownerSVGElement || e; |
|
if (e.hasAttribute("viewBox")) { |
|
e = e.viewBox.baseVal; |
|
return [[e.x, e.y], [e.x + e.width, e.y + e.height]]; |
|
} |
|
return [[0, 0], [e.width.baseVal.value, e.height.baseVal.value]]; |
|
} |
|
return [[0, 0], [e.clientWidth, e.clientHeight]]; |
|
} |
|
function defaultTransform() { |
|
return this.__zoom || identity2; |
|
} |
|
function defaultWheelDelta(event) { |
|
return -event.deltaY * (event.deltaMode === 1 ? 0.05 : event.deltaMode ? 1 : 2e-3) * (event.ctrlKey ? 10 : 1); |
|
} |
|
function defaultTouchable2() { |
|
return navigator.maxTouchPoints || "ontouchstart" in this; |
|
} |
|
function defaultConstrain(transform2, extent, translateExtent) { |
|
var dx0 = transform2.invertX(extent[0][0]) - translateExtent[0][0], dx1 = transform2.invertX(extent[1][0]) - translateExtent[1][0], dy0 = transform2.invertY(extent[0][1]) - translateExtent[0][1], dy1 = transform2.invertY(extent[1][1]) - translateExtent[1][1]; |
|
return transform2.translate( |
|
dx1 > dx0 ? (dx0 + dx1) / 2 : Math.min(0, dx0) || Math.max(0, dx1), |
|
dy1 > dy0 ? (dy0 + dy1) / 2 : Math.min(0, dy0) || Math.max(0, dy1) |
|
); |
|
} |
|
function zoom_default2() { |
|
var filter2 = defaultFilter2, extent = defaultExtent, constrain = defaultConstrain, wheelDelta = defaultWheelDelta, touchable = defaultTouchable2, scaleExtent = [0, Infinity], translateExtent = [[-Infinity, -Infinity], [Infinity, Infinity]], duration = 250, interpolate = zoom_default, listeners = dispatch_default2("start", "zoom", "end"), touchstarting, touchfirst, touchending, touchDelay = 500, wheelDelay = 150, clickDistance2 = 0, tapDistance = 10; |
|
function zoom(selection2) { |
|
selection2.property("__zoom", defaultTransform).on("wheel.zoom", wheeled, { passive: false }).on("mousedown.zoom", mousedowned).on("dblclick.zoom", dblclicked).filter(touchable).on("touchstart.zoom", touchstarted).on("touchmove.zoom", touchmoved).on("touchend.zoom touchcancel.zoom", touchended).style("-webkit-tap-highlight-color", "rgba(0,0,0,0)"); |
|
} |
|
zoom.transform = function(collection, transform2, point, event) { |
|
var selection2 = collection.selection ? collection.selection() : collection; |
|
selection2.property("__zoom", defaultTransform); |
|
if (collection !== selection2) { |
|
schedule(collection, transform2, point, event); |
|
} else { |
|
selection2.interrupt().each(function() { |
|
gesture(this, arguments).event(event).start().zoom(null, typeof transform2 === "function" ? transform2.apply(this, arguments) : transform2).end(); |
|
}); |
|
} |
|
}; |
|
zoom.scaleBy = function(selection2, k, p, event) { |
|
zoom.scaleTo(selection2, function() { |
|
var k0 = this.__zoom.k, k1 = typeof k === "function" ? k.apply(this, arguments) : k; |
|
return k0 * k1; |
|
}, p, event); |
|
}; |
|
zoom.scaleTo = function(selection2, k, p, event) { |
|
zoom.transform(selection2, function() { |
|
var e = extent.apply(this, arguments), t02 = this.__zoom, p0 = p == null ? centroid(e) : typeof p === "function" ? p.apply(this, arguments) : p, p1 = t02.invert(p0), k1 = typeof k === "function" ? k.apply(this, arguments) : k; |
|
return constrain(translate(scale(t02, k1), p0, p1), e, translateExtent); |
|
}, p, event); |
|
}; |
|
zoom.translateBy = function(selection2, x, y, event) { |
|
zoom.transform(selection2, function() { |
|
return constrain(this.__zoom.translate( |
|
typeof x === "function" ? x.apply(this, arguments) : x, |
|
typeof y === "function" ? y.apply(this, arguments) : y |
|
), extent.apply(this, arguments), translateExtent); |
|
}, null, event); |
|
}; |
|
zoom.translateTo = function(selection2, x, y, p, event) { |
|
zoom.transform(selection2, function() { |
|
var e = extent.apply(this, arguments), t = this.__zoom, p0 = p == null ? centroid(e) : typeof p === "function" ? p.apply(this, arguments) : p; |
|
return constrain(identity2.translate(p0[0], p0[1]).scale(t.k).translate( |
|
typeof x === "function" ? -x.apply(this, arguments) : -x, |
|
typeof y === "function" ? -y.apply(this, arguments) : -y |
|
), e, translateExtent); |
|
}, p, event); |
|
}; |
|
function scale(transform2, k) { |
|
k = Math.max(scaleExtent[0], Math.min(scaleExtent[1], k)); |
|
return k === transform2.k ? transform2 : new Transform(k, transform2.x, transform2.y); |
|
} |
|
function translate(transform2, p0, p1) { |
|
var x = p0[0] - p1[0] * transform2.k, y = p0[1] - p1[1] * transform2.k; |
|
return x === transform2.x && y === transform2.y ? transform2 : new Transform(transform2.k, x, y); |
|
} |
|
function centroid(extent2) { |
|
return [(+extent2[0][0] + +extent2[1][0]) / 2, (+extent2[0][1] + +extent2[1][1]) / 2]; |
|
} |
|
function schedule(transition2, transform2, point, event) { |
|
transition2.on("start.zoom", function() { |
|
gesture(this, arguments).event(event).start(); |
|
}).on("interrupt.zoom end.zoom", function() { |
|
gesture(this, arguments).event(event).end(); |
|
}).tween("zoom", function() { |
|
var that = this, args = arguments, g = gesture(that, args).event(event), e = extent.apply(that, args), p = point == null ? centroid(e) : typeof point === "function" ? point.apply(that, args) : point, w = Math.max(e[1][0] - e[0][0], e[1][1] - e[0][1]), a = that.__zoom, b = typeof transform2 === "function" ? transform2.apply(that, args) : transform2, i = interpolate(a.invert(p).concat(w / a.k), b.invert(p).concat(w / b.k)); |
|
return function(t) { |
|
if (t === 1) t = b; |
|
else { |
|
var l = i(t), k = w / l[2]; |
|
t = new Transform(k, p[0] - l[0] * k, p[1] - l[1] * k); |
|
} |
|
g.zoom(null, t); |
|
}; |
|
}); |
|
} |
|
function gesture(that, args, clean) { |
|
return !clean && that.__zooming || new Gesture(that, args); |
|
} |
|
function Gesture(that, args) { |
|
this.that = that; |
|
this.args = args; |
|
this.active = 0; |
|
this.sourceEvent = null; |
|
this.extent = extent.apply(that, args); |
|
this.taps = 0; |
|
} |
|
Gesture.prototype = { |
|
event: function(event) { |
|
if (event) this.sourceEvent = event; |
|
return this; |
|
}, |
|
start: function() { |
|
if (++this.active === 1) { |
|
this.that.__zooming = this; |
|
this.emit("start"); |
|
} |
|
return this; |
|
}, |
|
zoom: function(key, transform2) { |
|
if (this.mouse && key !== "mouse") this.mouse[1] = transform2.invert(this.mouse[0]); |
|
if (this.touch0 && key !== "touch") this.touch0[1] = transform2.invert(this.touch0[0]); |
|
if (this.touch1 && key !== "touch") this.touch1[1] = transform2.invert(this.touch1[0]); |
|
this.that.__zoom = transform2; |
|
this.emit("zoom"); |
|
return this; |
|
}, |
|
end: function() { |
|
if (--this.active === 0) { |
|
delete this.that.__zooming; |
|
this.emit("end"); |
|
} |
|
return this; |
|
}, |
|
emit: function(type) { |
|
var d = select_default2(this.that).datum(); |
|
listeners.call( |
|
type, |
|
this.that, |
|
new ZoomEvent(type, { |
|
sourceEvent: this.sourceEvent, |
|
target: zoom, |
|
type, |
|
transform: this.that.__zoom, |
|
dispatch: listeners |
|
}), |
|
d |
|
); |
|
} |
|
}; |
|
function wheeled(event, ...args) { |
|
if (!filter2.apply(this, arguments)) return; |
|
var g = gesture(this, args).event(event), t = this.__zoom, k = Math.max(scaleExtent[0], Math.min(scaleExtent[1], t.k * Math.pow(2, wheelDelta.apply(this, arguments)))), p = pointer_default(event); |
|
if (g.wheel) { |
|
if (g.mouse[0][0] !== p[0] || g.mouse[0][1] !== p[1]) { |
|
g.mouse[1] = t.invert(g.mouse[0] = p); |
|
} |
|
clearTimeout(g.wheel); |
|
} else if (t.k === k) return; |
|
else { |
|
g.mouse = [p, t.invert(p)]; |
|
interrupt_default(this); |
|
g.start(); |
|
} |
|
noevent_default2(event); |
|
g.wheel = setTimeout(wheelidled, wheelDelay); |
|
g.zoom("mouse", constrain(translate(scale(t, k), g.mouse[0], g.mouse[1]), g.extent, translateExtent)); |
|
function wheelidled() { |
|
g.wheel = null; |
|
g.end(); |
|
} |
|
} |
|
function mousedowned(event, ...args) { |
|
if (touchending || !filter2.apply(this, arguments)) return; |
|
var currentTarget = event.currentTarget, g = gesture(this, args, true).event(event), v = select_default2(event.view).on("mousemove.zoom", mousemoved, true).on("mouseup.zoom", mouseupped, true), p = pointer_default(event, currentTarget), x0 = event.clientX, y0 = event.clientY; |
|
nodrag_default(event.view); |
|
nopropagation2(event); |
|
g.mouse = [p, this.__zoom.invert(p)]; |
|
interrupt_default(this); |
|
g.start(); |
|
function mousemoved(event2) { |
|
noevent_default2(event2); |
|
if (!g.moved) { |
|
var dx = event2.clientX - x0, dy = event2.clientY - y0; |
|
g.moved = dx * dx + dy * dy > clickDistance2; |
|
} |
|
g.event(event2).zoom("mouse", constrain(translate(g.that.__zoom, g.mouse[0] = pointer_default(event2, currentTarget), g.mouse[1]), g.extent, translateExtent)); |
|
} |
|
function mouseupped(event2) { |
|
v.on("mousemove.zoom mouseup.zoom", null); |
|
yesdrag(event2.view, g.moved); |
|
noevent_default2(event2); |
|
g.event(event2).end(); |
|
} |
|
} |
|
function dblclicked(event, ...args) { |
|
if (!filter2.apply(this, arguments)) return; |
|
var t02 = this.__zoom, p0 = pointer_default(event.changedTouches ? event.changedTouches[0] : event, this), p1 = t02.invert(p0), k1 = t02.k * (event.shiftKey ? 0.5 : 2), t12 = constrain(translate(scale(t02, k1), p0, p1), extent.apply(this, args), translateExtent); |
|
noevent_default2(event); |
|
if (duration > 0) select_default2(this).transition().duration(duration).call(schedule, t12, p0, event); |
|
else select_default2(this).call(zoom.transform, t12, p0, event); |
|
} |
|
function touchstarted(event, ...args) { |
|
if (!filter2.apply(this, arguments)) return; |
|
var touches = event.touches, n = touches.length, g = gesture(this, args, event.changedTouches.length === n).event(event), started, i, t, p; |
|
nopropagation2(event); |
|
for (i = 0; i < n; ++i) { |
|
t = touches[i], p = pointer_default(t, this); |
|
p = [p, this.__zoom.invert(p), t.identifier]; |
|
if (!g.touch0) g.touch0 = p, started = true, g.taps = 1 + !!touchstarting; |
|
else if (!g.touch1 && g.touch0[2] !== p[2]) g.touch1 = p, g.taps = 0; |
|
} |
|
if (touchstarting) touchstarting = clearTimeout(touchstarting); |
|
if (started) { |
|
if (g.taps < 2) touchfirst = p[0], touchstarting = setTimeout(function() { |
|
touchstarting = null; |
|
}, touchDelay); |
|
interrupt_default(this); |
|
g.start(); |
|
} |
|
} |
|
function touchmoved(event, ...args) { |
|
if (!this.__zooming) return; |
|
var g = gesture(this, args).event(event), touches = event.changedTouches, n = touches.length, i, t, p, l; |
|
noevent_default2(event); |
|
for (i = 0; i < n; ++i) { |
|
t = touches[i], p = pointer_default(t, this); |
|
if (g.touch0 && g.touch0[2] === t.identifier) g.touch0[0] = p; |
|
else if (g.touch1 && g.touch1[2] === t.identifier) g.touch1[0] = p; |
|
} |
|
t = g.that.__zoom; |
|
if (g.touch1) { |
|
var p0 = g.touch0[0], l0 = g.touch0[1], p1 = g.touch1[0], l1 = g.touch1[1], dp = (dp = p1[0] - p0[0]) * dp + (dp = p1[1] - p0[1]) * dp, dl = (dl = l1[0] - l0[0]) * dl + (dl = l1[1] - l0[1]) * dl; |
|
t = scale(t, Math.sqrt(dp / dl)); |
|
p = [(p0[0] + p1[0]) / 2, (p0[1] + p1[1]) / 2]; |
|
l = [(l0[0] + l1[0]) / 2, (l0[1] + l1[1]) / 2]; |
|
} else if (g.touch0) p = g.touch0[0], l = g.touch0[1]; |
|
else return; |
|
g.zoom("touch", constrain(translate(t, p, l), g.extent, translateExtent)); |
|
} |
|
function touchended(event, ...args) { |
|
if (!this.__zooming) return; |
|
var g = gesture(this, args).event(event), touches = event.changedTouches, n = touches.length, i, t; |
|
nopropagation2(event); |
|
if (touchending) clearTimeout(touchending); |
|
touchending = setTimeout(function() { |
|
touchending = null; |
|
}, touchDelay); |
|
for (i = 0; i < n; ++i) { |
|
t = touches[i]; |
|
if (g.touch0 && g.touch0[2] === t.identifier) delete g.touch0; |
|
else if (g.touch1 && g.touch1[2] === t.identifier) delete g.touch1; |
|
} |
|
if (g.touch1 && !g.touch0) g.touch0 = g.touch1, delete g.touch1; |
|
if (g.touch0) g.touch0[1] = this.__zoom.invert(g.touch0[0]); |
|
else { |
|
g.end(); |
|
if (g.taps === 2) { |
|
t = pointer_default(t, this); |
|
if (Math.hypot(touchfirst[0] - t[0], touchfirst[1] - t[1]) < tapDistance) { |
|
var p = select_default2(this).on("dblclick.zoom"); |
|
if (p) p.apply(this, arguments); |
|
} |
|
} |
|
} |
|
} |
|
zoom.wheelDelta = function(_) { |
|
return arguments.length ? (wheelDelta = typeof _ === "function" ? _ : constant_default4(+_), zoom) : wheelDelta; |
|
}; |
|
zoom.filter = function(_) { |
|
return arguments.length ? (filter2 = typeof _ === "function" ? _ : constant_default4(!!_), zoom) : filter2; |
|
}; |
|
zoom.touchable = function(_) { |
|
return arguments.length ? (touchable = typeof _ === "function" ? _ : constant_default4(!!_), zoom) : touchable; |
|
}; |
|
zoom.extent = function(_) { |
|
return arguments.length ? (extent = typeof _ === "function" ? _ : constant_default4([[+_[0][0], +_[0][1]], [+_[1][0], +_[1][1]]]), zoom) : extent; |
|
}; |
|
zoom.scaleExtent = function(_) { |
|
return arguments.length ? (scaleExtent[0] = +_[0], scaleExtent[1] = +_[1], zoom) : [scaleExtent[0], scaleExtent[1]]; |
|
}; |
|
zoom.translateExtent = function(_) { |
|
return arguments.length ? (translateExtent[0][0] = +_[0][0], translateExtent[1][0] = +_[1][0], translateExtent[0][1] = +_[0][1], translateExtent[1][1] = +_[1][1], zoom) : [[translateExtent[0][0], translateExtent[0][1]], [translateExtent[1][0], translateExtent[1][1]]]; |
|
}; |
|
zoom.constrain = function(_) { |
|
return arguments.length ? (constrain = _, zoom) : constrain; |
|
}; |
|
zoom.duration = function(_) { |
|
return arguments.length ? (duration = +_, zoom) : duration; |
|
}; |
|
zoom.interpolate = function(_) { |
|
return arguments.length ? (interpolate = _, zoom) : interpolate; |
|
}; |
|
zoom.on = function() { |
|
var value = listeners.on.apply(listeners, arguments); |
|
return value === listeners ? zoom : value; |
|
}; |
|
zoom.clickDistance = function(_) { |
|
return arguments.length ? (clickDistance2 = (_ = +_) * _, zoom) : Math.sqrt(clickDistance2); |
|
}; |
|
zoom.tapDistance = function(_) { |
|
return arguments.length ? (tapDistance = +_, zoom) : tapDistance; |
|
}; |
|
return zoom; |
|
} |
|
|
|
export { |
|
select_default2 as select_default, |
|
pointer_default, |
|
selectAll_default2 as selectAll_default, |
|
drag_default, |
|
rgb, |
|
cubehelix, |
|
rgbBasis, |
|
number_default, |
|
value_default, |
|
round_default, |
|
hcl_default, |
|
cubehelixLong, |
|
identity2 as identity, |
|
transform, |
|
zoom_default2 as zoom_default |
|
}; |
|
|
|
|