@grunwaldlab/heat-tree 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +250 -0
- package/dist/heat-tree.es.js +5083 -0
- package/dist/heat-tree.es.js.map +1 -0
- package/dist/heat-tree.umd.js +20 -0
- package/dist/heat-tree.umd.js.map +1 -0
- package/package.json +53 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"heat-tree.umd.js","sources":["../node_modules/d3-array/src/ascending.js","../node_modules/d3-dispatch/src/dispatch.js","../node_modules/d3-selection/src/namespaces.js","../node_modules/d3-selection/src/namespace.js","../node_modules/d3-selection/src/creator.js","../node_modules/d3-selection/src/selector.js","../node_modules/d3-selection/src/selection/select.js","../node_modules/d3-selection/src/array.js","../node_modules/d3-selection/src/selectorAll.js","../node_modules/d3-selection/src/selection/selectAll.js","../node_modules/d3-selection/src/matcher.js","../node_modules/d3-selection/src/selection/selectChild.js","../node_modules/d3-selection/src/selection/selectChildren.js","../node_modules/d3-selection/src/selection/filter.js","../node_modules/d3-selection/src/selection/sparse.js","../node_modules/d3-selection/src/selection/enter.js","../node_modules/d3-selection/src/constant.js","../node_modules/d3-selection/src/selection/data.js","../node_modules/d3-selection/src/selection/exit.js","../node_modules/d3-selection/src/selection/join.js","../node_modules/d3-selection/src/selection/merge.js","../node_modules/d3-selection/src/selection/order.js","../node_modules/d3-selection/src/selection/sort.js","../node_modules/d3-selection/src/selection/call.js","../node_modules/d3-selection/src/selection/nodes.js","../node_modules/d3-selection/src/selection/node.js","../node_modules/d3-selection/src/selection/size.js","../node_modules/d3-selection/src/selection/empty.js","../node_modules/d3-selection/src/selection/each.js","../node_modules/d3-selection/src/selection/attr.js","../node_modules/d3-selection/src/window.js","../node_modules/d3-selection/src/selection/style.js","../node_modules/d3-selection/src/selection/property.js","../node_modules/d3-selection/src/selection/classed.js","../node_modules/d3-selection/src/selection/text.js","../node_modules/d3-selection/src/selection/html.js","../node_modules/d3-selection/src/selection/raise.js","../node_modules/d3-selection/src/selection/lower.js","../node_modules/d3-selection/src/selection/append.js","../node_modules/d3-selection/src/selection/insert.js","../node_modules/d3-selection/src/selection/remove.js","../node_modules/d3-selection/src/selection/clone.js","../node_modules/d3-selection/src/selection/datum.js","../node_modules/d3-selection/src/selection/on.js","../node_modules/d3-selection/src/selection/dispatch.js","../node_modules/d3-selection/src/selection/iterator.js","../node_modules/d3-selection/src/selection/index.js","../node_modules/d3-selection/src/select.js","../node_modules/d3-selection/src/sourceEvent.js","../node_modules/d3-selection/src/pointer.js","../node_modules/d3-drag/src/noevent.js","../node_modules/d3-drag/src/nodrag.js","../node_modules/d3-color/src/define.js","../node_modules/d3-color/src/color.js","../node_modules/d3-interpolate/src/constant.js","../node_modules/d3-interpolate/src/color.js","../node_modules/d3-interpolate/src/rgb.js","../node_modules/d3-interpolate/src/number.js","../node_modules/d3-interpolate/src/string.js","../node_modules/d3-interpolate/src/transform/decompose.js","../node_modules/d3-interpolate/src/transform/parse.js","../node_modules/d3-interpolate/src/transform/index.js","../node_modules/d3-interpolate/src/zoom.js","../node_modules/d3-timer/src/timer.js","../node_modules/d3-timer/src/timeout.js","../node_modules/d3-transition/src/transition/schedule.js","../node_modules/d3-transition/src/interrupt.js","../node_modules/d3-transition/src/selection/interrupt.js","../node_modules/d3-transition/src/transition/tween.js","../node_modules/d3-transition/src/transition/interpolate.js","../node_modules/d3-transition/src/transition/attr.js","../node_modules/d3-transition/src/transition/attrTween.js","../node_modules/d3-transition/src/transition/delay.js","../node_modules/d3-transition/src/transition/duration.js","../node_modules/d3-transition/src/transition/ease.js","../node_modules/d3-transition/src/transition/easeVarying.js","../node_modules/d3-transition/src/transition/filter.js","../node_modules/d3-transition/src/transition/merge.js","../node_modules/d3-transition/src/transition/on.js","../node_modules/d3-transition/src/transition/remove.js","../node_modules/d3-transition/src/transition/select.js","../node_modules/d3-transition/src/transition/selectAll.js","../node_modules/d3-transition/src/transition/selection.js","../node_modules/d3-transition/src/transition/style.js","../node_modules/d3-transition/src/transition/styleTween.js","../node_modules/d3-transition/src/transition/text.js","../node_modules/d3-transition/src/transition/textTween.js","../node_modules/d3-transition/src/transition/transition.js","../node_modules/d3-transition/src/transition/end.js","../node_modules/d3-transition/src/transition/index.js","../node_modules/d3-ease/src/cubic.js","../node_modules/d3-transition/src/selection/transition.js","../node_modules/d3-transition/src/selection/index.js","../node_modules/d3-path/src/path.js","../node_modules/d3-hierarchy/src/cluster.js","../node_modules/d3-hierarchy/src/hierarchy/count.js","../node_modules/d3-hierarchy/src/hierarchy/each.js","../node_modules/d3-hierarchy/src/hierarchy/eachBefore.js","../node_modules/d3-hierarchy/src/hierarchy/eachAfter.js","../node_modules/d3-hierarchy/src/hierarchy/find.js","../node_modules/d3-hierarchy/src/hierarchy/sum.js","../node_modules/d3-hierarchy/src/hierarchy/sort.js","../node_modules/d3-hierarchy/src/hierarchy/path.js","../node_modules/d3-hierarchy/src/hierarchy/ancestors.js","../node_modules/d3-hierarchy/src/hierarchy/descendants.js","../node_modules/d3-hierarchy/src/hierarchy/leaves.js","../node_modules/d3-hierarchy/src/hierarchy/links.js","../node_modules/d3-hierarchy/src/hierarchy/iterator.js","../node_modules/d3-hierarchy/src/hierarchy/index.js","../node_modules/d3-shape/src/constant.js","../node_modules/d3-shape/src/math.js","../node_modules/d3-shape/src/path.js","../node_modules/d3-shape/src/symbol/circle.js","../node_modules/d3-shape/src/symbol/triangle.js","../node_modules/d3-shape/src/symbol.js","../node_modules/d3-zoom/src/constant.js","../node_modules/d3-zoom/src/event.js","../node_modules/d3-zoom/src/transform.js","../node_modules/d3-zoom/src/noevent.js","../node_modules/d3-zoom/src/zoom.js","../src/utils.js","../src/parsers.js","../src/scales.js","../src/aesthetic.js","../src/treeData.js","../src/scaling.js","../src/textAspectRatioPrediction.js","../src/treeState.js","../src/icons.js","../src/legends.js","../src/treeView.js","../src/toolbar.js","../src/index.js"],"sourcesContent":["export default function ascending(a, b) {\n return a == null || b == null ? NaN : a < b ? -1 : a > b ? 1 : a >= b ? 0 : NaN;\n}\n","var noop = {value: () => {}};\n\nfunction dispatch() {\n for (var i = 0, n = arguments.length, _ = {}, t; i < n; ++i) {\n if (!(t = arguments[i] + \"\") || (t in _) || /[\\s.]/.test(t)) throw new Error(\"illegal type: \" + t);\n _[t] = [];\n }\n return new Dispatch(_);\n}\n\nfunction Dispatch(_) {\n this._ = _;\n}\n\nfunction parseTypenames(typenames, types) {\n return typenames.trim().split(/^|\\s+/).map(function(t) {\n var name = \"\", i = t.indexOf(\".\");\n if (i >= 0) name = t.slice(i + 1), t = t.slice(0, i);\n if (t && !types.hasOwnProperty(t)) throw new Error(\"unknown type: \" + t);\n return {type: t, name: name};\n });\n}\n\nDispatch.prototype = dispatch.prototype = {\n constructor: Dispatch,\n on: function(typename, callback) {\n var _ = this._,\n T = parseTypenames(typename + \"\", _),\n t,\n i = -1,\n n = T.length;\n\n // If no callback was specified, return the callback of the given type and name.\n if (arguments.length < 2) {\n while (++i < n) if ((t = (typename = T[i]).type) && (t = get(_[t], typename.name))) return t;\n return;\n }\n\n // If a type was specified, set the callback for the given type and name.\n // Otherwise, if a null callback was specified, remove callbacks of the given name.\n if (callback != null && typeof callback !== \"function\") throw new Error(\"invalid callback: \" + callback);\n while (++i < n) {\n if (t = (typename = T[i]).type) _[t] = set(_[t], typename.name, callback);\n else if (callback == null) for (t in _) _[t] = set(_[t], typename.name, null);\n }\n\n return this;\n },\n copy: function() {\n var copy = {}, _ = this._;\n for (var t in _) copy[t] = _[t].slice();\n return new Dispatch(copy);\n },\n call: function(type, that) {\n if ((n = arguments.length - 2) > 0) for (var args = new Array(n), i = 0, n, t; i < n; ++i) args[i] = arguments[i + 2];\n if (!this._.hasOwnProperty(type)) throw new Error(\"unknown type: \" + type);\n for (t = this._[type], i = 0, n = t.length; i < n; ++i) t[i].value.apply(that, args);\n },\n apply: function(type, that, args) {\n if (!this._.hasOwnProperty(type)) throw new Error(\"unknown type: \" + type);\n for (var t = this._[type], i = 0, n = t.length; i < n; ++i) t[i].value.apply(that, args);\n }\n};\n\nfunction get(type, name) {\n for (var i = 0, n = type.length, c; i < n; ++i) {\n if ((c = type[i]).name === name) {\n return c.value;\n }\n }\n}\n\nfunction set(type, name, callback) {\n for (var i = 0, n = type.length; i < n; ++i) {\n if (type[i].name === name) {\n type[i] = noop, type = type.slice(0, i).concat(type.slice(i + 1));\n break;\n }\n }\n if (callback != null) type.push({name: name, value: callback});\n return type;\n}\n\nexport default dispatch;\n","export var xhtml = \"http://www.w3.org/1999/xhtml\";\n\nexport default {\n svg: \"http://www.w3.org/2000/svg\",\n xhtml: xhtml,\n xlink: \"http://www.w3.org/1999/xlink\",\n xml: \"http://www.w3.org/XML/1998/namespace\",\n xmlns: \"http://www.w3.org/2000/xmlns/\"\n};\n","import namespaces from \"./namespaces.js\";\n\nexport default function(name) {\n var prefix = name += \"\", i = prefix.indexOf(\":\");\n if (i >= 0 && (prefix = name.slice(0, i)) !== \"xmlns\") name = name.slice(i + 1);\n return namespaces.hasOwnProperty(prefix) ? {space: namespaces[prefix], local: name} : name; // eslint-disable-line no-prototype-builtins\n}\n","import namespace from \"./namespace.js\";\nimport {xhtml} from \"./namespaces.js\";\n\nfunction creatorInherit(name) {\n return function() {\n var document = this.ownerDocument,\n uri = this.namespaceURI;\n return uri === xhtml && document.documentElement.namespaceURI === xhtml\n ? document.createElement(name)\n : document.createElementNS(uri, name);\n };\n}\n\nfunction creatorFixed(fullname) {\n return function() {\n return this.ownerDocument.createElementNS(fullname.space, fullname.local);\n };\n}\n\nexport default function(name) {\n var fullname = namespace(name);\n return (fullname.local\n ? creatorFixed\n : creatorInherit)(fullname);\n}\n","function none() {}\n\nexport default function(selector) {\n return selector == null ? none : function() {\n return this.querySelector(selector);\n };\n}\n","import {Selection} from \"./index.js\";\nimport selector from \"../selector.js\";\n\nexport default function(select) {\n if (typeof select !== \"function\") select = selector(select);\n\n for (var groups = this._groups, m = groups.length, subgroups = new Array(m), j = 0; j < m; ++j) {\n for (var group = groups[j], n = group.length, subgroup = subgroups[j] = new Array(n), node, subnode, i = 0; i < n; ++i) {\n if ((node = group[i]) && (subnode = select.call(node, node.__data__, i, group))) {\n if (\"__data__\" in node) subnode.__data__ = node.__data__;\n subgroup[i] = subnode;\n }\n }\n }\n\n return new Selection(subgroups, this._parents);\n}\n","// Given something array like (or null), returns something that is strictly an\n// array. This is used to ensure that array-like objects passed to d3.selectAll\n// or selection.selectAll are converted into proper arrays when creating a\n// selection; we don’t ever want to create a selection backed by a live\n// HTMLCollection or NodeList. However, note that selection.selectAll will use a\n// static NodeList as a group, since it safely derived from querySelectorAll.\nexport default function array(x) {\n return x == null ? [] : Array.isArray(x) ? x : Array.from(x);\n}\n","function empty() {\n return [];\n}\n\nexport default function(selector) {\n return selector == null ? empty : function() {\n return this.querySelectorAll(selector);\n };\n}\n","import {Selection} from \"./index.js\";\nimport array from \"../array.js\";\nimport selectorAll from \"../selectorAll.js\";\n\nfunction arrayAll(select) {\n return function() {\n return array(select.apply(this, arguments));\n };\n}\n\nexport default function(select) {\n if (typeof select === \"function\") select = arrayAll(select);\n else select = selectorAll(select);\n\n for (var groups = this._groups, m = groups.length, subgroups = [], parents = [], j = 0; j < m; ++j) {\n for (var group = groups[j], n = group.length, node, i = 0; i < n; ++i) {\n if (node = group[i]) {\n subgroups.push(select.call(node, node.__data__, i, group));\n parents.push(node);\n }\n }\n }\n\n return new Selection(subgroups, parents);\n}\n","export default function(selector) {\n return function() {\n return this.matches(selector);\n };\n}\n\nexport function childMatcher(selector) {\n return function(node) {\n return node.matches(selector);\n };\n}\n\n","import {childMatcher} from \"../matcher.js\";\n\nvar find = Array.prototype.find;\n\nfunction childFind(match) {\n return function() {\n return find.call(this.children, match);\n };\n}\n\nfunction childFirst() {\n return this.firstElementChild;\n}\n\nexport default function(match) {\n return this.select(match == null ? childFirst\n : childFind(typeof match === \"function\" ? match : childMatcher(match)));\n}\n","import {childMatcher} from \"../matcher.js\";\n\nvar filter = Array.prototype.filter;\n\nfunction children() {\n return Array.from(this.children);\n}\n\nfunction childrenFilter(match) {\n return function() {\n return filter.call(this.children, match);\n };\n}\n\nexport default function(match) {\n return this.selectAll(match == null ? children\n : childrenFilter(typeof match === \"function\" ? match : childMatcher(match)));\n}\n","import {Selection} from \"./index.js\";\nimport matcher from \"../matcher.js\";\n\nexport default function(match) {\n if (typeof match !== \"function\") match = matcher(match);\n\n for (var groups = this._groups, m = groups.length, subgroups = new Array(m), j = 0; j < m; ++j) {\n for (var group = groups[j], n = group.length, subgroup = subgroups[j] = [], node, i = 0; i < n; ++i) {\n if ((node = group[i]) && match.call(node, node.__data__, i, group)) {\n subgroup.push(node);\n }\n }\n }\n\n return new Selection(subgroups, this._parents);\n}\n","export default function(update) {\n return new Array(update.length);\n}\n","import sparse from \"./sparse.js\";\nimport {Selection} from \"./index.js\";\n\nexport default function() {\n return new Selection(this._enter || this._groups.map(sparse), this._parents);\n}\n\nexport function EnterNode(parent, datum) {\n this.ownerDocument = parent.ownerDocument;\n this.namespaceURI = parent.namespaceURI;\n this._next = null;\n this._parent = parent;\n this.__data__ = datum;\n}\n\nEnterNode.prototype = {\n constructor: EnterNode,\n appendChild: function(child) { return this._parent.insertBefore(child, this._next); },\n insertBefore: function(child, next) { return this._parent.insertBefore(child, next); },\n querySelector: function(selector) { return this._parent.querySelector(selector); },\n querySelectorAll: function(selector) { return this._parent.querySelectorAll(selector); }\n};\n","export default function(x) {\n return function() {\n return x;\n };\n}\n","import {Selection} from \"./index.js\";\nimport {EnterNode} from \"./enter.js\";\nimport constant from \"../constant.js\";\n\nfunction bindIndex(parent, group, enter, update, exit, data) {\n var i = 0,\n node,\n groupLength = group.length,\n dataLength = data.length;\n\n // Put any non-null nodes that fit into update.\n // Put any null nodes into enter.\n // Put any remaining data into enter.\n for (; i < dataLength; ++i) {\n if (node = group[i]) {\n node.__data__ = data[i];\n update[i] = node;\n } else {\n enter[i] = new EnterNode(parent, data[i]);\n }\n }\n\n // Put any non-null nodes that don’t fit into exit.\n for (; i < groupLength; ++i) {\n if (node = group[i]) {\n exit[i] = node;\n }\n }\n}\n\nfunction bindKey(parent, group, enter, update, exit, data, key) {\n var i,\n node,\n nodeByKeyValue = new Map,\n groupLength = group.length,\n dataLength = data.length,\n keyValues = new Array(groupLength),\n keyValue;\n\n // Compute the key for each node.\n // If multiple nodes have the same key, the duplicates are added to exit.\n for (i = 0; i < groupLength; ++i) {\n if (node = group[i]) {\n keyValues[i] = keyValue = key.call(node, node.__data__, i, group) + \"\";\n if (nodeByKeyValue.has(keyValue)) {\n exit[i] = node;\n } else {\n nodeByKeyValue.set(keyValue, node);\n }\n }\n }\n\n // Compute the key for each datum.\n // If there a node associated with this key, join and add it to update.\n // If there is not (or the key is a duplicate), add it to enter.\n for (i = 0; i < dataLength; ++i) {\n keyValue = key.call(parent, data[i], i, data) + \"\";\n if (node = nodeByKeyValue.get(keyValue)) {\n update[i] = node;\n node.__data__ = data[i];\n nodeByKeyValue.delete(keyValue);\n } else {\n enter[i] = new EnterNode(parent, data[i]);\n }\n }\n\n // Add any remaining nodes that were not bound to data to exit.\n for (i = 0; i < groupLength; ++i) {\n if ((node = group[i]) && (nodeByKeyValue.get(keyValues[i]) === node)) {\n exit[i] = node;\n }\n }\n}\n\nfunction datum(node) {\n return node.__data__;\n}\n\nexport default function(value, key) {\n if (!arguments.length) return Array.from(this, datum);\n\n var bind = key ? bindKey : bindIndex,\n parents = this._parents,\n groups = this._groups;\n\n if (typeof value !== \"function\") value = constant(value);\n\n for (var m = groups.length, update = new Array(m), enter = new Array(m), exit = new Array(m), j = 0; j < m; ++j) {\n var parent = parents[j],\n group = groups[j],\n groupLength = group.length,\n data = arraylike(value.call(parent, parent && parent.__data__, j, parents)),\n dataLength = data.length,\n enterGroup = enter[j] = new Array(dataLength),\n updateGroup = update[j] = new Array(dataLength),\n exitGroup = exit[j] = new Array(groupLength);\n\n bind(parent, group, enterGroup, updateGroup, exitGroup, data, key);\n\n // Now connect the enter nodes to their following update node, such that\n // appendChild can insert the materialized enter node before this node,\n // rather than at the end of the parent node.\n for (var i0 = 0, i1 = 0, previous, next; i0 < dataLength; ++i0) {\n if (previous = enterGroup[i0]) {\n if (i0 >= i1) i1 = i0 + 1;\n while (!(next = updateGroup[i1]) && ++i1 < dataLength);\n previous._next = next || null;\n }\n }\n }\n\n update = new Selection(update, parents);\n update._enter = enter;\n update._exit = exit;\n return update;\n}\n\n// Given some data, this returns an array-like view of it: an object that\n// exposes a length property and allows numeric indexing. Note that unlike\n// selectAll, this isn’t worried about “live” collections because the resulting\n// array will only be used briefly while data is being bound. (It is possible to\n// cause the data to change while iterating by using a key function, but please\n// don’t; we’d rather avoid a gratuitous copy.)\nfunction arraylike(data) {\n return typeof data === \"object\" && \"length\" in data\n ? data // Array, TypedArray, NodeList, array-like\n : Array.from(data); // Map, Set, iterable, string, or anything else\n}\n","import sparse from \"./sparse.js\";\nimport {Selection} from \"./index.js\";\n\nexport default function() {\n return new Selection(this._exit || this._groups.map(sparse), this._parents);\n}\n","export default function(onenter, onupdate, onexit) {\n var enter = this.enter(), update = this, exit = this.exit();\n if (typeof onenter === \"function\") {\n enter = onenter(enter);\n if (enter) enter = enter.selection();\n } else {\n enter = enter.append(onenter + \"\");\n }\n if (onupdate != null) {\n update = onupdate(update);\n if (update) update = update.selection();\n }\n if (onexit == null) exit.remove(); else onexit(exit);\n return enter && update ? enter.merge(update).order() : update;\n}\n","import {Selection} from \"./index.js\";\n\nexport default function(context) {\n var selection = context.selection ? context.selection() : context;\n\n for (var groups0 = this._groups, groups1 = selection._groups, m0 = groups0.length, m1 = groups1.length, m = Math.min(m0, m1), merges = new Array(m0), j = 0; j < m; ++j) {\n for (var group0 = groups0[j], group1 = groups1[j], n = group0.length, merge = merges[j] = new Array(n), node, i = 0; i < n; ++i) {\n if (node = group0[i] || group1[i]) {\n merge[i] = node;\n }\n }\n }\n\n for (; j < m0; ++j) {\n merges[j] = groups0[j];\n }\n\n return new Selection(merges, this._parents);\n}\n","export default function() {\n\n for (var groups = this._groups, j = -1, m = groups.length; ++j < m;) {\n for (var group = groups[j], i = group.length - 1, next = group[i], node; --i >= 0;) {\n if (node = group[i]) {\n if (next && node.compareDocumentPosition(next) ^ 4) next.parentNode.insertBefore(node, next);\n next = node;\n }\n }\n }\n\n return this;\n}\n","import {Selection} from \"./index.js\";\n\nexport default function(compare) {\n if (!compare) compare = ascending;\n\n function compareNode(a, b) {\n return a && b ? compare(a.__data__, b.__data__) : !a - !b;\n }\n\n for (var groups = this._groups, m = groups.length, sortgroups = new Array(m), j = 0; j < m; ++j) {\n for (var group = groups[j], n = group.length, sortgroup = sortgroups[j] = new Array(n), node, i = 0; i < n; ++i) {\n if (node = group[i]) {\n sortgroup[i] = node;\n }\n }\n sortgroup.sort(compareNode);\n }\n\n return new Selection(sortgroups, this._parents).order();\n}\n\nfunction ascending(a, b) {\n return a < b ? -1 : a > b ? 1 : a >= b ? 0 : NaN;\n}\n","export default function() {\n var callback = arguments[0];\n arguments[0] = this;\n callback.apply(null, arguments);\n return this;\n}\n","export default function() {\n return Array.from(this);\n}\n","export default function() {\n\n for (var groups = this._groups, j = 0, m = groups.length; j < m; ++j) {\n for (var group = groups[j], i = 0, n = group.length; i < n; ++i) {\n var node = group[i];\n if (node) return node;\n }\n }\n\n return null;\n}\n","export default function() {\n let size = 0;\n for (const node of this) ++size; // eslint-disable-line no-unused-vars\n return size;\n}\n","export default function() {\n return !this.node();\n}\n","export default function(callback) {\n\n for (var groups = this._groups, j = 0, m = groups.length; j < m; ++j) {\n for (var group = groups[j], i = 0, n = group.length, node; i < n; ++i) {\n if (node = group[i]) callback.call(node, node.__data__, i, group);\n }\n }\n\n return this;\n}\n","import namespace from \"../namespace.js\";\n\nfunction attrRemove(name) {\n return function() {\n this.removeAttribute(name);\n };\n}\n\nfunction attrRemoveNS(fullname) {\n return function() {\n this.removeAttributeNS(fullname.space, fullname.local);\n };\n}\n\nfunction attrConstant(name, value) {\n return function() {\n this.setAttribute(name, value);\n };\n}\n\nfunction attrConstantNS(fullname, value) {\n return function() {\n this.setAttributeNS(fullname.space, fullname.local, value);\n };\n}\n\nfunction attrFunction(name, value) {\n return function() {\n var v = value.apply(this, arguments);\n if (v == null) this.removeAttribute(name);\n else this.setAttribute(name, v);\n };\n}\n\nfunction attrFunctionNS(fullname, value) {\n return function() {\n var v = value.apply(this, arguments);\n if (v == null) this.removeAttributeNS(fullname.space, fullname.local);\n else this.setAttributeNS(fullname.space, fullname.local, v);\n };\n}\n\nexport default function(name, value) {\n var fullname = namespace(name);\n\n if (arguments.length < 2) {\n var node = this.node();\n return fullname.local\n ? node.getAttributeNS(fullname.space, fullname.local)\n : node.getAttribute(fullname);\n }\n\n return this.each((value == null\n ? (fullname.local ? attrRemoveNS : attrRemove) : (typeof value === \"function\"\n ? (fullname.local ? attrFunctionNS : attrFunction)\n : (fullname.local ? attrConstantNS : attrConstant)))(fullname, value));\n}\n","export default function(node) {\n return (node.ownerDocument && node.ownerDocument.defaultView) // node is a Node\n || (node.document && node) // node is a Window\n || node.defaultView; // node is a Document\n}\n","import defaultView from \"../window.js\";\n\nfunction styleRemove(name) {\n return function() {\n this.style.removeProperty(name);\n };\n}\n\nfunction styleConstant(name, value, priority) {\n return function() {\n this.style.setProperty(name, value, priority);\n };\n}\n\nfunction styleFunction(name, value, priority) {\n return function() {\n var v = value.apply(this, arguments);\n if (v == null) this.style.removeProperty(name);\n else this.style.setProperty(name, v, priority);\n };\n}\n\nexport default function(name, value, priority) {\n return arguments.length > 1\n ? this.each((value == null\n ? styleRemove : typeof value === \"function\"\n ? styleFunction\n : styleConstant)(name, value, priority == null ? \"\" : priority))\n : styleValue(this.node(), name);\n}\n\nexport function styleValue(node, name) {\n return node.style.getPropertyValue(name)\n || defaultView(node).getComputedStyle(node, null).getPropertyValue(name);\n}\n","function propertyRemove(name) {\n return function() {\n delete this[name];\n };\n}\n\nfunction propertyConstant(name, value) {\n return function() {\n this[name] = value;\n };\n}\n\nfunction propertyFunction(name, value) {\n return function() {\n var v = value.apply(this, arguments);\n if (v == null) delete this[name];\n else this[name] = v;\n };\n}\n\nexport default function(name, value) {\n return arguments.length > 1\n ? this.each((value == null\n ? propertyRemove : typeof value === \"function\"\n ? propertyFunction\n : propertyConstant)(name, value))\n : this.node()[name];\n}\n","function classArray(string) {\n return string.trim().split(/^|\\s+/);\n}\n\nfunction classList(node) {\n return node.classList || new ClassList(node);\n}\n\nfunction ClassList(node) {\n this._node = node;\n this._names = classArray(node.getAttribute(\"class\") || \"\");\n}\n\nClassList.prototype = {\n add: function(name) {\n var i = this._names.indexOf(name);\n if (i < 0) {\n this._names.push(name);\n this._node.setAttribute(\"class\", this._names.join(\" \"));\n }\n },\n remove: function(name) {\n var i = this._names.indexOf(name);\n if (i >= 0) {\n this._names.splice(i, 1);\n this._node.setAttribute(\"class\", this._names.join(\" \"));\n }\n },\n contains: function(name) {\n return this._names.indexOf(name) >= 0;\n }\n};\n\nfunction classedAdd(node, names) {\n var list = classList(node), i = -1, n = names.length;\n while (++i < n) list.add(names[i]);\n}\n\nfunction classedRemove(node, names) {\n var list = classList(node), i = -1, n = names.length;\n while (++i < n) list.remove(names[i]);\n}\n\nfunction classedTrue(names) {\n return function() {\n classedAdd(this, names);\n };\n}\n\nfunction classedFalse(names) {\n return function() {\n classedRemove(this, names);\n };\n}\n\nfunction classedFunction(names, value) {\n return function() {\n (value.apply(this, arguments) ? classedAdd : classedRemove)(this, names);\n };\n}\n\nexport default function(name, value) {\n var names = classArray(name + \"\");\n\n if (arguments.length < 2) {\n var list = classList(this.node()), i = -1, n = names.length;\n while (++i < n) if (!list.contains(names[i])) return false;\n return true;\n }\n\n return this.each((typeof value === \"function\"\n ? classedFunction : value\n ? classedTrue\n : classedFalse)(names, value));\n}\n","function textRemove() {\n this.textContent = \"\";\n}\n\nfunction textConstant(value) {\n return function() {\n this.textContent = value;\n };\n}\n\nfunction textFunction(value) {\n return function() {\n var v = value.apply(this, arguments);\n this.textContent = v == null ? \"\" : v;\n };\n}\n\nexport default function(value) {\n return arguments.length\n ? this.each(value == null\n ? textRemove : (typeof value === \"function\"\n ? textFunction\n : textConstant)(value))\n : this.node().textContent;\n}\n","function htmlRemove() {\n this.innerHTML = \"\";\n}\n\nfunction htmlConstant(value) {\n return function() {\n this.innerHTML = value;\n };\n}\n\nfunction htmlFunction(value) {\n return function() {\n var v = value.apply(this, arguments);\n this.innerHTML = v == null ? \"\" : v;\n };\n}\n\nexport default function(value) {\n return arguments.length\n ? this.each(value == null\n ? htmlRemove : (typeof value === \"function\"\n ? htmlFunction\n : htmlConstant)(value))\n : this.node().innerHTML;\n}\n","function raise() {\n if (this.nextSibling) this.parentNode.appendChild(this);\n}\n\nexport default function() {\n return this.each(raise);\n}\n","function lower() {\n if (this.previousSibling) this.parentNode.insertBefore(this, this.parentNode.firstChild);\n}\n\nexport default function() {\n return this.each(lower);\n}\n","import creator from \"../creator.js\";\n\nexport default function(name) {\n var create = typeof name === \"function\" ? name : creator(name);\n return this.select(function() {\n return this.appendChild(create.apply(this, arguments));\n });\n}\n","import creator from \"../creator.js\";\nimport selector from \"../selector.js\";\n\nfunction constantNull() {\n return null;\n}\n\nexport default function(name, before) {\n var create = typeof name === \"function\" ? name : creator(name),\n select = before == null ? constantNull : typeof before === \"function\" ? before : selector(before);\n return this.select(function() {\n return this.insertBefore(create.apply(this, arguments), select.apply(this, arguments) || null);\n });\n}\n","function remove() {\n var parent = this.parentNode;\n if (parent) parent.removeChild(this);\n}\n\nexport default function() {\n return this.each(remove);\n}\n","function selection_cloneShallow() {\n var clone = this.cloneNode(false), parent = this.parentNode;\n return parent ? parent.insertBefore(clone, this.nextSibling) : clone;\n}\n\nfunction selection_cloneDeep() {\n var clone = this.cloneNode(true), parent = this.parentNode;\n return parent ? parent.insertBefore(clone, this.nextSibling) : clone;\n}\n\nexport default function(deep) {\n return this.select(deep ? selection_cloneDeep : selection_cloneShallow);\n}\n","export default function(value) {\n return arguments.length\n ? this.property(\"__data__\", value)\n : this.node().__data__;\n}\n","function contextListener(listener) {\n return function(event) {\n listener.call(this, event, this.__data__);\n };\n}\n\nfunction parseTypenames(typenames) {\n return typenames.trim().split(/^|\\s+/).map(function(t) {\n var name = \"\", i = t.indexOf(\".\");\n if (i >= 0) name = t.slice(i + 1), t = t.slice(0, i);\n return {type: t, name: name};\n });\n}\n\nfunction onRemove(typename) {\n return function() {\n var on = this.__on;\n if (!on) return;\n for (var j = 0, i = -1, m = on.length, o; j < m; ++j) {\n if (o = on[j], (!typename.type || o.type === typename.type) && o.name === typename.name) {\n this.removeEventListener(o.type, o.listener, o.options);\n } else {\n on[++i] = o;\n }\n }\n if (++i) on.length = i;\n else delete this.__on;\n };\n}\n\nfunction onAdd(typename, value, options) {\n return function() {\n var on = this.__on, o, listener = contextListener(value);\n if (on) for (var j = 0, m = on.length; j < m; ++j) {\n if ((o = on[j]).type === typename.type && o.name === typename.name) {\n this.removeEventListener(o.type, o.listener, o.options);\n this.addEventListener(o.type, o.listener = listener, o.options = options);\n o.value = value;\n return;\n }\n }\n this.addEventListener(typename.type, listener, options);\n o = {type: typename.type, name: typename.name, value: value, listener: listener, options: options};\n if (!on) this.__on = [o];\n else on.push(o);\n };\n}\n\nexport default function(typename, value, options) {\n var typenames = parseTypenames(typename + \"\"), i, n = typenames.length, t;\n\n if (arguments.length < 2) {\n var on = this.node().__on;\n if (on) for (var j = 0, m = on.length, o; j < m; ++j) {\n for (i = 0, o = on[j]; i < n; ++i) {\n if ((t = typenames[i]).type === o.type && t.name === o.name) {\n return o.value;\n }\n }\n }\n return;\n }\n\n on = value ? onAdd : onRemove;\n for (i = 0; i < n; ++i) this.each(on(typenames[i], value, options));\n return this;\n}\n","import defaultView from \"../window.js\";\n\nfunction dispatchEvent(node, type, params) {\n var window = defaultView(node),\n event = window.CustomEvent;\n\n if (typeof event === \"function\") {\n event = new event(type, params);\n } else {\n event = window.document.createEvent(\"Event\");\n if (params) event.initEvent(type, params.bubbles, params.cancelable), event.detail = params.detail;\n else event.initEvent(type, false, false);\n }\n\n node.dispatchEvent(event);\n}\n\nfunction dispatchConstant(type, params) {\n return function() {\n return dispatchEvent(this, type, params);\n };\n}\n\nfunction dispatchFunction(type, params) {\n return function() {\n return dispatchEvent(this, type, params.apply(this, arguments));\n };\n}\n\nexport default function(type, params) {\n return this.each((typeof params === \"function\"\n ? dispatchFunction\n : dispatchConstant)(type, params));\n}\n","export default function*() {\n for (var groups = this._groups, j = 0, m = groups.length; j < m; ++j) {\n for (var group = groups[j], i = 0, n = group.length, node; i < n; ++i) {\n if (node = group[i]) yield node;\n }\n }\n}\n","import selection_select from \"./select.js\";\nimport selection_selectAll from \"./selectAll.js\";\nimport selection_selectChild from \"./selectChild.js\";\nimport selection_selectChildren from \"./selectChildren.js\";\nimport selection_filter from \"./filter.js\";\nimport selection_data from \"./data.js\";\nimport selection_enter from \"./enter.js\";\nimport selection_exit from \"./exit.js\";\nimport selection_join from \"./join.js\";\nimport selection_merge from \"./merge.js\";\nimport selection_order from \"./order.js\";\nimport selection_sort from \"./sort.js\";\nimport selection_call from \"./call.js\";\nimport selection_nodes from \"./nodes.js\";\nimport selection_node from \"./node.js\";\nimport selection_size from \"./size.js\";\nimport selection_empty from \"./empty.js\";\nimport selection_each from \"./each.js\";\nimport selection_attr from \"./attr.js\";\nimport selection_style from \"./style.js\";\nimport selection_property from \"./property.js\";\nimport selection_classed from \"./classed.js\";\nimport selection_text from \"./text.js\";\nimport selection_html from \"./html.js\";\nimport selection_raise from \"./raise.js\";\nimport selection_lower from \"./lower.js\";\nimport selection_append from \"./append.js\";\nimport selection_insert from \"./insert.js\";\nimport selection_remove from \"./remove.js\";\nimport selection_clone from \"./clone.js\";\nimport selection_datum from \"./datum.js\";\nimport selection_on from \"./on.js\";\nimport selection_dispatch from \"./dispatch.js\";\nimport selection_iterator from \"./iterator.js\";\n\nexport var root = [null];\n\nexport function Selection(groups, parents) {\n this._groups = groups;\n this._parents = parents;\n}\n\nfunction selection() {\n return new Selection([[document.documentElement]], root);\n}\n\nfunction selection_selection() {\n return this;\n}\n\nSelection.prototype = selection.prototype = {\n constructor: Selection,\n select: selection_select,\n selectAll: selection_selectAll,\n selectChild: selection_selectChild,\n selectChildren: selection_selectChildren,\n filter: selection_filter,\n data: selection_data,\n enter: selection_enter,\n exit: selection_exit,\n join: selection_join,\n merge: selection_merge,\n selection: selection_selection,\n order: selection_order,\n sort: selection_sort,\n call: selection_call,\n nodes: selection_nodes,\n node: selection_node,\n size: selection_size,\n empty: selection_empty,\n each: selection_each,\n attr: selection_attr,\n style: selection_style,\n property: selection_property,\n classed: selection_classed,\n text: selection_text,\n html: selection_html,\n raise: selection_raise,\n lower: selection_lower,\n append: selection_append,\n insert: selection_insert,\n remove: selection_remove,\n clone: selection_clone,\n datum: selection_datum,\n on: selection_on,\n dispatch: selection_dispatch,\n [Symbol.iterator]: selection_iterator\n};\n\nexport default selection;\n","import {Selection, root} from \"./selection/index.js\";\n\nexport default function(selector) {\n return typeof selector === \"string\"\n ? new Selection([[document.querySelector(selector)]], [document.documentElement])\n : new Selection([[selector]], root);\n}\n","export default function(event) {\n let sourceEvent;\n while (sourceEvent = event.sourceEvent) event = sourceEvent;\n return event;\n}\n","import sourceEvent from \"./sourceEvent.js\";\n\nexport default function(event, node) {\n event = sourceEvent(event);\n if (node === undefined) node = event.currentTarget;\n if (node) {\n var svg = node.ownerSVGElement || node;\n if (svg.createSVGPoint) {\n var point = svg.createSVGPoint();\n point.x = event.clientX, point.y = event.clientY;\n point = point.matrixTransform(node.getScreenCTM().inverse());\n return [point.x, point.y];\n }\n if (node.getBoundingClientRect) {\n var rect = node.getBoundingClientRect();\n return [event.clientX - rect.left - node.clientLeft, event.clientY - rect.top - node.clientTop];\n }\n }\n return [event.pageX, event.pageY];\n}\n","// These are typically used in conjunction with noevent to ensure that we can\n// preventDefault on the event.\nexport const nonpassive = {passive: false};\nexport const nonpassivecapture = {capture: true, passive: false};\n\nexport function nopropagation(event) {\n event.stopImmediatePropagation();\n}\n\nexport default function(event) {\n event.preventDefault();\n event.stopImmediatePropagation();\n}\n","import {select} from \"d3-selection\";\nimport noevent, {nonpassivecapture} from \"./noevent.js\";\n\nexport default function(view) {\n var root = view.document.documentElement,\n selection = select(view).on(\"dragstart.drag\", noevent, nonpassivecapture);\n if (\"onselectstart\" in root) {\n selection.on(\"selectstart.drag\", noevent, nonpassivecapture);\n } else {\n root.__noselect = root.style.MozUserSelect;\n root.style.MozUserSelect = \"none\";\n }\n}\n\nexport function yesdrag(view, noclick) {\n var root = view.document.documentElement,\n selection = select(view).on(\"dragstart.drag\", null);\n if (noclick) {\n selection.on(\"click.drag\", noevent, nonpassivecapture);\n setTimeout(function() { selection.on(\"click.drag\", null); }, 0);\n }\n if (\"onselectstart\" in root) {\n selection.on(\"selectstart.drag\", null);\n } else {\n root.style.MozUserSelect = root.__noselect;\n delete root.__noselect;\n }\n}\n","export default function(constructor, factory, prototype) {\n constructor.prototype = factory.prototype = prototype;\n prototype.constructor = constructor;\n}\n\nexport function extend(parent, definition) {\n var prototype = Object.create(parent.prototype);\n for (var key in definition) prototype[key] = definition[key];\n return prototype;\n}\n","import define, {extend} from \"./define.js\";\n\nexport function Color() {}\n\nexport var darker = 0.7;\nexport var brighter = 1 / darker;\n\nvar reI = \"\\\\s*([+-]?\\\\d+)\\\\s*\",\n reN = \"\\\\s*([+-]?(?:\\\\d*\\\\.)?\\\\d+(?:[eE][+-]?\\\\d+)?)\\\\s*\",\n reP = \"\\\\s*([+-]?(?:\\\\d*\\\\.)?\\\\d+(?:[eE][+-]?\\\\d+)?)%\\\\s*\",\n reHex = /^#([0-9a-f]{3,8})$/,\n reRgbInteger = new RegExp(`^rgb\\\\(${reI},${reI},${reI}\\\\)$`),\n reRgbPercent = new RegExp(`^rgb\\\\(${reP},${reP},${reP}\\\\)$`),\n reRgbaInteger = new RegExp(`^rgba\\\\(${reI},${reI},${reI},${reN}\\\\)$`),\n reRgbaPercent = new RegExp(`^rgba\\\\(${reP},${reP},${reP},${reN}\\\\)$`),\n reHslPercent = new RegExp(`^hsl\\\\(${reN},${reP},${reP}\\\\)$`),\n reHslaPercent = new RegExp(`^hsla\\\\(${reN},${reP},${reP},${reN}\\\\)$`);\n\nvar named = {\n aliceblue: 0xf0f8ff,\n antiquewhite: 0xfaebd7,\n aqua: 0x00ffff,\n aquamarine: 0x7fffd4,\n azure: 0xf0ffff,\n beige: 0xf5f5dc,\n bisque: 0xffe4c4,\n black: 0x000000,\n blanchedalmond: 0xffebcd,\n blue: 0x0000ff,\n blueviolet: 0x8a2be2,\n brown: 0xa52a2a,\n burlywood: 0xdeb887,\n cadetblue: 0x5f9ea0,\n chartreuse: 0x7fff00,\n chocolate: 0xd2691e,\n coral: 0xff7f50,\n cornflowerblue: 0x6495ed,\n cornsilk: 0xfff8dc,\n crimson: 0xdc143c,\n cyan: 0x00ffff,\n darkblue: 0x00008b,\n darkcyan: 0x008b8b,\n darkgoldenrod: 0xb8860b,\n darkgray: 0xa9a9a9,\n darkgreen: 0x006400,\n darkgrey: 0xa9a9a9,\n darkkhaki: 0xbdb76b,\n darkmagenta: 0x8b008b,\n darkolivegreen: 0x556b2f,\n darkorange: 0xff8c00,\n darkorchid: 0x9932cc,\n darkred: 0x8b0000,\n darksalmon: 0xe9967a,\n darkseagreen: 0x8fbc8f,\n darkslateblue: 0x483d8b,\n darkslategray: 0x2f4f4f,\n darkslategrey: 0x2f4f4f,\n darkturquoise: 0x00ced1,\n darkviolet: 0x9400d3,\n deeppink: 0xff1493,\n deepskyblue: 0x00bfff,\n dimgray: 0x696969,\n dimgrey: 0x696969,\n dodgerblue: 0x1e90ff,\n firebrick: 0xb22222,\n floralwhite: 0xfffaf0,\n forestgreen: 0x228b22,\n fuchsia: 0xff00ff,\n gainsboro: 0xdcdcdc,\n ghostwhite: 0xf8f8ff,\n gold: 0xffd700,\n goldenrod: 0xdaa520,\n gray: 0x808080,\n green: 0x008000,\n greenyellow: 0xadff2f,\n grey: 0x808080,\n honeydew: 0xf0fff0,\n hotpink: 0xff69b4,\n indianred: 0xcd5c5c,\n indigo: 0x4b0082,\n ivory: 0xfffff0,\n khaki: 0xf0e68c,\n lavender: 0xe6e6fa,\n lavenderblush: 0xfff0f5,\n lawngreen: 0x7cfc00,\n lemonchiffon: 0xfffacd,\n lightblue: 0xadd8e6,\n lightcoral: 0xf08080,\n lightcyan: 0xe0ffff,\n lightgoldenrodyellow: 0xfafad2,\n lightgray: 0xd3d3d3,\n lightgreen: 0x90ee90,\n lightgrey: 0xd3d3d3,\n lightpink: 0xffb6c1,\n lightsalmon: 0xffa07a,\n lightseagreen: 0x20b2aa,\n lightskyblue: 0x87cefa,\n lightslategray: 0x778899,\n lightslategrey: 0x778899,\n lightsteelblue: 0xb0c4de,\n lightyellow: 0xffffe0,\n lime: 0x00ff00,\n limegreen: 0x32cd32,\n linen: 0xfaf0e6,\n magenta: 0xff00ff,\n maroon: 0x800000,\n mediumaquamarine: 0x66cdaa,\n mediumblue: 0x0000cd,\n mediumorchid: 0xba55d3,\n mediumpurple: 0x9370db,\n mediumseagreen: 0x3cb371,\n mediumslateblue: 0x7b68ee,\n mediumspringgreen: 0x00fa9a,\n mediumturquoise: 0x48d1cc,\n mediumvioletred: 0xc71585,\n midnightblue: 0x191970,\n mintcream: 0xf5fffa,\n mistyrose: 0xffe4e1,\n moccasin: 0xffe4b5,\n navajowhite: 0xffdead,\n navy: 0x000080,\n oldlace: 0xfdf5e6,\n olive: 0x808000,\n olivedrab: 0x6b8e23,\n orange: 0xffa500,\n orangered: 0xff4500,\n orchid: 0xda70d6,\n palegoldenrod: 0xeee8aa,\n palegreen: 0x98fb98,\n paleturquoise: 0xafeeee,\n palevioletred: 0xdb7093,\n papayawhip: 0xffefd5,\n peachpuff: 0xffdab9,\n peru: 0xcd853f,\n pink: 0xffc0cb,\n plum: 0xdda0dd,\n powderblue: 0xb0e0e6,\n purple: 0x800080,\n rebeccapurple: 0x663399,\n red: 0xff0000,\n rosybrown: 0xbc8f8f,\n royalblue: 0x4169e1,\n saddlebrown: 0x8b4513,\n salmon: 0xfa8072,\n sandybrown: 0xf4a460,\n seagreen: 0x2e8b57,\n seashell: 0xfff5ee,\n sienna: 0xa0522d,\n silver: 0xc0c0c0,\n skyblue: 0x87ceeb,\n slateblue: 0x6a5acd,\n slategray: 0x708090,\n slategrey: 0x708090,\n snow: 0xfffafa,\n springgreen: 0x00ff7f,\n steelblue: 0x4682b4,\n tan: 0xd2b48c,\n teal: 0x008080,\n thistle: 0xd8bfd8,\n tomato: 0xff6347,\n turquoise: 0x40e0d0,\n violet: 0xee82ee,\n wheat: 0xf5deb3,\n white: 0xffffff,\n whitesmoke: 0xf5f5f5,\n yellow: 0xffff00,\n yellowgreen: 0x9acd32\n};\n\ndefine(Color, color, {\n copy(channels) {\n return Object.assign(new this.constructor, this, channels);\n },\n displayable() {\n return this.rgb().displayable();\n },\n hex: color_formatHex, // Deprecated! Use color.formatHex.\n formatHex: color_formatHex,\n formatHex8: color_formatHex8,\n formatHsl: color_formatHsl,\n formatRgb: color_formatRgb,\n toString: color_formatRgb\n});\n\nfunction color_formatHex() {\n return this.rgb().formatHex();\n}\n\nfunction color_formatHex8() {\n return this.rgb().formatHex8();\n}\n\nfunction color_formatHsl() {\n return hslConvert(this).formatHsl();\n}\n\nfunction color_formatRgb() {\n return this.rgb().formatRgb();\n}\n\nexport default function color(format) {\n var m, l;\n format = (format + \"\").trim().toLowerCase();\n return (m = reHex.exec(format)) ? (l = m[1].length, m = parseInt(m[1], 16), l === 6 ? rgbn(m) // #ff0000\n : l === 3 ? new Rgb((m >> 8 & 0xf) | (m >> 4 & 0xf0), (m >> 4 & 0xf) | (m & 0xf0), ((m & 0xf) << 4) | (m & 0xf), 1) // #f00\n : l === 8 ? rgba(m >> 24 & 0xff, m >> 16 & 0xff, m >> 8 & 0xff, (m & 0xff) / 0xff) // #ff000000\n : l === 4 ? rgba((m >> 12 & 0xf) | (m >> 8 & 0xf0), (m >> 8 & 0xf) | (m >> 4 & 0xf0), (m >> 4 & 0xf) | (m & 0xf0), (((m & 0xf) << 4) | (m & 0xf)) / 0xff) // #f000\n : null) // invalid hex\n : (m = reRgbInteger.exec(format)) ? new Rgb(m[1], m[2], m[3], 1) // rgb(255, 0, 0)\n : (m = reRgbPercent.exec(format)) ? new Rgb(m[1] * 255 / 100, m[2] * 255 / 100, m[3] * 255 / 100, 1) // rgb(100%, 0%, 0%)\n : (m = reRgbaInteger.exec(format)) ? rgba(m[1], m[2], m[3], m[4]) // rgba(255, 0, 0, 1)\n : (m = reRgbaPercent.exec(format)) ? rgba(m[1] * 255 / 100, m[2] * 255 / 100, m[3] * 255 / 100, m[4]) // rgb(100%, 0%, 0%, 1)\n : (m = reHslPercent.exec(format)) ? hsla(m[1], m[2] / 100, m[3] / 100, 1) // hsl(120, 50%, 50%)\n : (m = reHslaPercent.exec(format)) ? hsla(m[1], m[2] / 100, m[3] / 100, m[4]) // hsla(120, 50%, 50%, 1)\n : named.hasOwnProperty(format) ? rgbn(named[format]) // eslint-disable-line no-prototype-builtins\n : format === \"transparent\" ? new Rgb(NaN, NaN, NaN, 0)\n : null;\n}\n\nfunction rgbn(n) {\n return new Rgb(n >> 16 & 0xff, n >> 8 & 0xff, n & 0xff, 1);\n}\n\nfunction rgba(r, g, b, a) {\n if (a <= 0) r = g = b = NaN;\n return new Rgb(r, g, b, a);\n}\n\nexport function rgbConvert(o) {\n if (!(o instanceof Color)) o = color(o);\n if (!o) return new Rgb;\n o = o.rgb();\n return new Rgb(o.r, o.g, o.b, o.opacity);\n}\n\nexport function rgb(r, g, b, opacity) {\n return arguments.length === 1 ? rgbConvert(r) : new Rgb(r, g, b, opacity == null ? 1 : opacity);\n}\n\nexport function Rgb(r, g, b, opacity) {\n this.r = +r;\n this.g = +g;\n this.b = +b;\n this.opacity = +opacity;\n}\n\ndefine(Rgb, rgb, extend(Color, {\n brighter(k) {\n k = k == null ? brighter : Math.pow(brighter, k);\n return new Rgb(this.r * k, this.g * k, this.b * k, this.opacity);\n },\n darker(k) {\n k = k == null ? darker : Math.pow(darker, k);\n return new Rgb(this.r * k, this.g * k, this.b * k, this.opacity);\n },\n rgb() {\n return this;\n },\n clamp() {\n return new Rgb(clampi(this.r), clampi(this.g), clampi(this.b), clampa(this.opacity));\n },\n displayable() {\n return (-0.5 <= this.r && this.r < 255.5)\n && (-0.5 <= this.g && this.g < 255.5)\n && (-0.5 <= this.b && this.b < 255.5)\n && (0 <= this.opacity && this.opacity <= 1);\n },\n hex: rgb_formatHex, // Deprecated! Use color.formatHex.\n formatHex: rgb_formatHex,\n formatHex8: rgb_formatHex8,\n formatRgb: rgb_formatRgb,\n toString: rgb_formatRgb\n}));\n\nfunction rgb_formatHex() {\n return `#${hex(this.r)}${hex(this.g)}${hex(this.b)}`;\n}\n\nfunction rgb_formatHex8() {\n return `#${hex(this.r)}${hex(this.g)}${hex(this.b)}${hex((isNaN(this.opacity) ? 1 : this.opacity) * 255)}`;\n}\n\nfunction rgb_formatRgb() {\n const a = clampa(this.opacity);\n return `${a === 1 ? \"rgb(\" : \"rgba(\"}${clampi(this.r)}, ${clampi(this.g)}, ${clampi(this.b)}${a === 1 ? \")\" : `, ${a})`}`;\n}\n\nfunction clampa(opacity) {\n return isNaN(opacity) ? 1 : Math.max(0, Math.min(1, opacity));\n}\n\nfunction clampi(value) {\n return Math.max(0, Math.min(255, Math.round(value) || 0));\n}\n\nfunction hex(value) {\n value = clampi(value);\n return (value < 16 ? \"0\" : \"\") + value.toString(16);\n}\n\nfunction hsla(h, s, l, a) {\n if (a <= 0) h = s = l = NaN;\n else if (l <= 0 || l >= 1) h = s = NaN;\n else if (s <= 0) h = NaN;\n return new Hsl(h, s, l, a);\n}\n\nexport function hslConvert(o) {\n if (o instanceof Hsl) return new Hsl(o.h, o.s, o.l, o.opacity);\n if (!(o instanceof Color)) o = color(o);\n if (!o) return new Hsl;\n if (o instanceof Hsl) return o;\n o = o.rgb();\n var r = o.r / 255,\n g = o.g / 255,\n b = o.b / 255,\n min = Math.min(r, g, b),\n max = Math.max(r, g, b),\n h = NaN,\n s = max - min,\n l = (max + min) / 2;\n if (s) {\n if (r === max) h = (g - b) / s + (g < b) * 6;\n else if (g === max) h = (b - r) / s + 2;\n else h = (r - g) / s + 4;\n s /= l < 0.5 ? max + min : 2 - max - min;\n h *= 60;\n } else {\n s = l > 0 && l < 1 ? 0 : h;\n }\n return new Hsl(h, s, l, o.opacity);\n}\n\nexport function hsl(h, s, l, opacity) {\n return arguments.length === 1 ? hslConvert(h) : new Hsl(h, s, l, opacity == null ? 1 : opacity);\n}\n\nfunction Hsl(h, s, l, opacity) {\n this.h = +h;\n this.s = +s;\n this.l = +l;\n this.opacity = +opacity;\n}\n\ndefine(Hsl, hsl, extend(Color, {\n brighter(k) {\n k = k == null ? brighter : Math.pow(brighter, k);\n return new Hsl(this.h, this.s, this.l * k, this.opacity);\n },\n darker(k) {\n k = k == null ? darker : Math.pow(darker, k);\n return new Hsl(this.h, this.s, this.l * k, this.opacity);\n },\n rgb() {\n var h = this.h % 360 + (this.h < 0) * 360,\n s = isNaN(h) || isNaN(this.s) ? 0 : this.s,\n l = this.l,\n m2 = l + (l < 0.5 ? l : 1 - l) * s,\n m1 = 2 * l - m2;\n return new Rgb(\n hsl2rgb(h >= 240 ? h - 240 : h + 120, m1, m2),\n hsl2rgb(h, m1, m2),\n hsl2rgb(h < 120 ? h + 240 : h - 120, m1, m2),\n this.opacity\n );\n },\n clamp() {\n return new Hsl(clamph(this.h), clampt(this.s), clampt(this.l), clampa(this.opacity));\n },\n displayable() {\n return (0 <= this.s && this.s <= 1 || isNaN(this.s))\n && (0 <= this.l && this.l <= 1)\n && (0 <= this.opacity && this.opacity <= 1);\n },\n formatHsl() {\n const a = clampa(this.opacity);\n return `${a === 1 ? \"hsl(\" : \"hsla(\"}${clamph(this.h)}, ${clampt(this.s) * 100}%, ${clampt(this.l) * 100}%${a === 1 ? \")\" : `, ${a})`}`;\n }\n}));\n\nfunction clamph(value) {\n value = (value || 0) % 360;\n return value < 0 ? value + 360 : value;\n}\n\nfunction clampt(value) {\n return Math.max(0, Math.min(1, value || 0));\n}\n\n/* From FvD 13.37, CSS Color Module Level 3 */\nfunction hsl2rgb(h, m1, m2) {\n return (h < 60 ? m1 + (m2 - m1) * h / 60\n : h < 180 ? m2\n : h < 240 ? m1 + (m2 - m1) * (240 - h) / 60\n : m1) * 255;\n}\n","export default x => () => x;\n","import constant from \"./constant.js\";\n\nfunction linear(a, d) {\n return function(t) {\n return a + t * d;\n };\n}\n\nfunction exponential(a, b, y) {\n return a = Math.pow(a, y), b = Math.pow(b, y) - a, y = 1 / y, function(t) {\n return Math.pow(a + t * b, y);\n };\n}\n\nexport function hue(a, b) {\n var d = b - a;\n return d ? linear(a, d > 180 || d < -180 ? d - 360 * Math.round(d / 360) : d) : constant(isNaN(a) ? b : a);\n}\n\nexport function gamma(y) {\n return (y = +y) === 1 ? nogamma : function(a, b) {\n return b - a ? exponential(a, b, y) : constant(isNaN(a) ? b : a);\n };\n}\n\nexport default function nogamma(a, b) {\n var d = b - a;\n return d ? linear(a, d) : constant(isNaN(a) ? b : a);\n}\n","import {rgb as colorRgb} from \"d3-color\";\nimport basis from \"./basis.js\";\nimport basisClosed from \"./basisClosed.js\";\nimport nogamma, {gamma} from \"./color.js\";\n\nexport default (function rgbGamma(y) {\n var color = gamma(y);\n\n function rgb(start, end) {\n var r = color((start = colorRgb(start)).r, (end = colorRgb(end)).r),\n g = color(start.g, end.g),\n b = color(start.b, end.b),\n opacity = nogamma(start.opacity, end.opacity);\n return function(t) {\n start.r = r(t);\n start.g = g(t);\n start.b = b(t);\n start.opacity = opacity(t);\n return start + \"\";\n };\n }\n\n rgb.gamma = rgbGamma;\n\n return rgb;\n})(1);\n\nfunction rgbSpline(spline) {\n return function(colors) {\n var n = colors.length,\n r = new Array(n),\n g = new Array(n),\n b = new Array(n),\n i, color;\n for (i = 0; i < n; ++i) {\n color = colorRgb(colors[i]);\n r[i] = color.r || 0;\n g[i] = color.g || 0;\n b[i] = color.b || 0;\n }\n r = spline(r);\n g = spline(g);\n b = spline(b);\n color.opacity = 1;\n return function(t) {\n color.r = r(t);\n color.g = g(t);\n color.b = b(t);\n return color + \"\";\n };\n };\n}\n\nexport var rgbBasis = rgbSpline(basis);\nexport var rgbBasisClosed = rgbSpline(basisClosed);\n","export default function(a, b) {\n return a = +a, b = +b, function(t) {\n return a * (1 - t) + b * t;\n };\n}\n","import number from \"./number.js\";\n\nvar reA = /[-+]?(?:\\d+\\.?\\d*|\\.?\\d+)(?:[eE][-+]?\\d+)?/g,\n reB = new RegExp(reA.source, \"g\");\n\nfunction zero(b) {\n return function() {\n return b;\n };\n}\n\nfunction one(b) {\n return function(t) {\n return b(t) + \"\";\n };\n}\n\nexport default function(a, b) {\n var bi = reA.lastIndex = reB.lastIndex = 0, // scan index for next number in b\n am, // current match in a\n bm, // current match in b\n bs, // string preceding current number in b, if any\n i = -1, // index in s\n s = [], // string constants and placeholders\n q = []; // number interpolators\n\n // Coerce inputs to strings.\n a = a + \"\", b = b + \"\";\n\n // Interpolate pairs of numbers in a & b.\n while ((am = reA.exec(a))\n && (bm = reB.exec(b))) {\n if ((bs = bm.index) > bi) { // a string precedes the next number in b\n bs = b.slice(bi, bs);\n if (s[i]) s[i] += bs; // coalesce with previous string\n else s[++i] = bs;\n }\n if ((am = am[0]) === (bm = bm[0])) { // numbers in a & b match\n if (s[i]) s[i] += bm; // coalesce with previous string\n else s[++i] = bm;\n } else { // interpolate non-matching numbers\n s[++i] = null;\n q.push({i: i, x: number(am, bm)});\n }\n bi = reB.lastIndex;\n }\n\n // Add remains of b.\n if (bi < b.length) {\n bs = b.slice(bi);\n if (s[i]) s[i] += bs; // coalesce with previous string\n else s[++i] = bs;\n }\n\n // Special optimization for only a single match.\n // Otherwise, interpolate each of the numbers and rejoin the string.\n return s.length < 2 ? (q[0]\n ? one(q[0].x)\n : zero(b))\n : (b = q.length, function(t) {\n for (var i = 0, o; i < b; ++i) s[(o = q[i]).i] = o.x(t);\n return s.join(\"\");\n });\n}\n","var degrees = 180 / Math.PI;\n\nexport var identity = {\n translateX: 0,\n translateY: 0,\n rotate: 0,\n skewX: 0,\n scaleX: 1,\n scaleY: 1\n};\n\nexport default function(a, b, c, d, e, f) {\n var scaleX, scaleY, skewX;\n if (scaleX = Math.sqrt(a * a + b * b)) a /= scaleX, b /= scaleX;\n if (skewX = a * c + b * d) c -= a * skewX, d -= b * skewX;\n if (scaleY = Math.sqrt(c * c + d * d)) c /= scaleY, d /= scaleY, skewX /= scaleY;\n if (a * d < b * c) a = -a, b = -b, skewX = -skewX, scaleX = -scaleX;\n return {\n translateX: e,\n translateY: f,\n rotate: Math.atan2(b, a) * degrees,\n skewX: Math.atan(skewX) * degrees,\n scaleX: scaleX,\n scaleY: scaleY\n };\n}\n","import decompose, {identity} from \"./decompose.js\";\n\nvar svgNode;\n\n/* eslint-disable no-undef */\nexport function parseCss(value) {\n const m = new (typeof DOMMatrix === \"function\" ? DOMMatrix : WebKitCSSMatrix)(value + \"\");\n return m.isIdentity ? identity : decompose(m.a, m.b, m.c, m.d, m.e, m.f);\n}\n\nexport function parseSvg(value) {\n if (value == null) return identity;\n if (!svgNode) svgNode = document.createElementNS(\"http://www.w3.org/2000/svg\", \"g\");\n svgNode.setAttribute(\"transform\", value);\n if (!(value = svgNode.transform.baseVal.consolidate())) return identity;\n value = value.matrix;\n return decompose(value.a, value.b, value.c, value.d, value.e, value.f);\n}\n","import number from \"../number.js\";\nimport {parseCss, parseSvg} from \"./parse.js\";\n\nfunction interpolateTransform(parse, pxComma, pxParen, degParen) {\n\n function pop(s) {\n return s.length ? s.pop() + \" \" : \"\";\n }\n\n function translate(xa, ya, xb, yb, s, q) {\n if (xa !== xb || ya !== yb) {\n var i = s.push(\"translate(\", null, pxComma, null, pxParen);\n q.push({i: i - 4, x: number(xa, xb)}, {i: i - 2, x: number(ya, yb)});\n } else if (xb || yb) {\n s.push(\"translate(\" + xb + pxComma + yb + pxParen);\n }\n }\n\n function rotate(a, b, s, q) {\n if (a !== b) {\n if (a - b > 180) b += 360; else if (b - a > 180) a += 360; // shortest path\n q.push({i: s.push(pop(s) + \"rotate(\", null, degParen) - 2, x: number(a, b)});\n } else if (b) {\n s.push(pop(s) + \"rotate(\" + b + degParen);\n }\n }\n\n function skewX(a, b, s, q) {\n if (a !== b) {\n q.push({i: s.push(pop(s) + \"skewX(\", null, degParen) - 2, x: number(a, b)});\n } else if (b) {\n s.push(pop(s) + \"skewX(\" + b + degParen);\n }\n }\n\n function scale(xa, ya, xb, yb, s, q) {\n if (xa !== xb || ya !== yb) {\n var i = s.push(pop(s) + \"scale(\", null, \",\", null, \")\");\n q.push({i: i - 4, x: number(xa, xb)}, {i: i - 2, x: number(ya, yb)});\n } else if (xb !== 1 || yb !== 1) {\n s.push(pop(s) + \"scale(\" + xb + \",\" + yb + \")\");\n }\n }\n\n return function(a, b) {\n var s = [], // string constants and placeholders\n q = []; // number interpolators\n a = parse(a), b = parse(b);\n translate(a.translateX, a.translateY, b.translateX, b.translateY, s, q);\n rotate(a.rotate, b.rotate, s, q);\n skewX(a.skewX, b.skewX, s, q);\n scale(a.scaleX, a.scaleY, b.scaleX, b.scaleY, s, q);\n a = b = null; // gc\n return function(t) {\n var i = -1, n = q.length, o;\n while (++i < n) s[(o = q[i]).i] = o.x(t);\n return s.join(\"\");\n };\n };\n}\n\nexport var interpolateTransformCss = interpolateTransform(parseCss, \"px, \", \"px)\", \"deg)\");\nexport var interpolateTransformSvg = interpolateTransform(parseSvg, \", \", \")\", \")\");\n","var epsilon2 = 1e-12;\n\nfunction cosh(x) {\n return ((x = Math.exp(x)) + 1 / x) / 2;\n}\n\nfunction sinh(x) {\n return ((x = Math.exp(x)) - 1 / x) / 2;\n}\n\nfunction tanh(x) {\n return ((x = Math.exp(2 * x)) - 1) / (x + 1);\n}\n\nexport default (function zoomRho(rho, rho2, rho4) {\n\n // p0 = [ux0, uy0, w0]\n // p1 = [ux1, uy1, w1]\n function zoom(p0, p1) {\n var ux0 = p0[0], uy0 = p0[1], w0 = p0[2],\n ux1 = p1[0], uy1 = p1[1], w1 = p1[2],\n dx = ux1 - ux0,\n dy = uy1 - uy0,\n d2 = dx * dx + dy * dy,\n i,\n S;\n\n // Special case for u0 ≅ u1.\n if (d2 < epsilon2) {\n S = Math.log(w1 / w0) / rho;\n i = function(t) {\n return [\n ux0 + t * dx,\n uy0 + t * dy,\n w0 * Math.exp(rho * t * S)\n ];\n }\n }\n\n // General case.\n else {\n var d1 = Math.sqrt(d2),\n b0 = (w1 * w1 - w0 * w0 + rho4 * d2) / (2 * w0 * rho2 * d1),\n b1 = (w1 * w1 - w0 * w0 - rho4 * d2) / (2 * w1 * rho2 * d1),\n r0 = Math.log(Math.sqrt(b0 * b0 + 1) - b0),\n r1 = Math.log(Math.sqrt(b1 * b1 + 1) - b1);\n S = (r1 - r0) / rho;\n i = function(t) {\n var s = t * S,\n coshr0 = cosh(r0),\n u = w0 / (rho2 * d1) * (coshr0 * tanh(rho * s + r0) - sinh(r0));\n return [\n ux0 + u * dx,\n uy0 + u * dy,\n w0 * coshr0 / cosh(rho * s + r0)\n ];\n }\n }\n\n i.duration = S * 1000 * rho / Math.SQRT2;\n\n return i;\n }\n\n zoom.rho = function(_) {\n var _1 = Math.max(1e-3, +_), _2 = _1 * _1, _4 = _2 * _2;\n return zoomRho(_1, _2, _4);\n };\n\n return zoom;\n})(Math.SQRT2, 2, 4);\n","var frame = 0, // is an animation frame pending?\n timeout = 0, // is a timeout pending?\n interval = 0, // are any timers active?\n pokeDelay = 1000, // how frequently we check for clock skew\n taskHead,\n taskTail,\n clockLast = 0,\n clockNow = 0,\n clockSkew = 0,\n clock = typeof performance === \"object\" && performance.now ? performance : Date,\n setFrame = typeof window === \"object\" && window.requestAnimationFrame ? window.requestAnimationFrame.bind(window) : function(f) { setTimeout(f, 17); };\n\nexport function now() {\n return clockNow || (setFrame(clearNow), clockNow = clock.now() + clockSkew);\n}\n\nfunction clearNow() {\n clockNow = 0;\n}\n\nexport function Timer() {\n this._call =\n this._time =\n this._next = null;\n}\n\nTimer.prototype = timer.prototype = {\n constructor: Timer,\n restart: function(callback, delay, time) {\n if (typeof callback !== \"function\") throw new TypeError(\"callback is not a function\");\n time = (time == null ? now() : +time) + (delay == null ? 0 : +delay);\n if (!this._next && taskTail !== this) {\n if (taskTail) taskTail._next = this;\n else taskHead = this;\n taskTail = this;\n }\n this._call = callback;\n this._time = time;\n sleep();\n },\n stop: function() {\n if (this._call) {\n this._call = null;\n this._time = Infinity;\n sleep();\n }\n }\n};\n\nexport function timer(callback, delay, time) {\n var t = new Timer;\n t.restart(callback, delay, time);\n return t;\n}\n\nexport function timerFlush() {\n now(); // Get the current time, if not already set.\n ++frame; // Pretend we’ve set an alarm, if we haven’t already.\n var t = taskHead, e;\n while (t) {\n if ((e = clockNow - t._time) >= 0) t._call.call(undefined, e);\n t = t._next;\n }\n --frame;\n}\n\nfunction wake() {\n clockNow = (clockLast = clock.now()) + clockSkew;\n frame = timeout = 0;\n try {\n timerFlush();\n } finally {\n frame = 0;\n nap();\n clockNow = 0;\n }\n}\n\nfunction poke() {\n var now = clock.now(), delay = now - clockLast;\n if (delay > pokeDelay) clockSkew -= delay, clockLast = now;\n}\n\nfunction nap() {\n var t0, t1 = taskHead, t2, time = Infinity;\n while (t1) {\n if (t1._call) {\n if (time > t1._time) time = t1._time;\n t0 = t1, t1 = t1._next;\n } else {\n t2 = t1._next, t1._next = null;\n t1 = t0 ? t0._next = t2 : taskHead = t2;\n }\n }\n taskTail = t0;\n sleep(time);\n}\n\nfunction sleep(time) {\n if (frame) return; // Soonest alarm already set, or will be.\n if (timeout) timeout = clearTimeout(timeout);\n var delay = time - clockNow; // Strictly less than if we recomputed clockNow.\n if (delay > 24) {\n if (time < Infinity) timeout = setTimeout(wake, time - clock.now() - clockSkew);\n if (interval) interval = clearInterval(interval);\n } else {\n if (!interval) clockLast = clock.now(), interval = setInterval(poke, pokeDelay);\n frame = 1, setFrame(wake);\n }\n}\n","import {Timer} from \"./timer.js\";\n\nexport default function(callback, delay, time) {\n var t = new Timer;\n delay = delay == null ? 0 : +delay;\n t.restart(elapsed => {\n t.stop();\n callback(elapsed + delay);\n }, delay, time);\n return t;\n}\n","import {dispatch} from \"d3-dispatch\";\nimport {timer, timeout} from \"d3-timer\";\n\nvar emptyOn = dispatch(\"start\", \"end\", \"cancel\", \"interrupt\");\nvar emptyTween = [];\n\nexport var CREATED = 0;\nexport var SCHEDULED = 1;\nexport var STARTING = 2;\nexport var STARTED = 3;\nexport var RUNNING = 4;\nexport var ENDING = 5;\nexport var ENDED = 6;\n\nexport default function(node, name, id, index, group, timing) {\n var schedules = node.__transition;\n if (!schedules) node.__transition = {};\n else if (id in schedules) return;\n create(node, id, {\n name: name,\n index: index, // For context during callback.\n group: group, // For context during callback.\n on: emptyOn,\n tween: emptyTween,\n time: timing.time,\n delay: timing.delay,\n duration: timing.duration,\n ease: timing.ease,\n timer: null,\n state: CREATED\n });\n}\n\nexport function init(node, id) {\n var schedule = get(node, id);\n if (schedule.state > CREATED) throw new Error(\"too late; already scheduled\");\n return schedule;\n}\n\nexport function set(node, id) {\n var schedule = get(node, id);\n if (schedule.state > STARTED) throw new Error(\"too late; already running\");\n return schedule;\n}\n\nexport function get(node, id) {\n var schedule = node.__transition;\n if (!schedule || !(schedule = schedule[id])) throw new Error(\"transition not found\");\n return schedule;\n}\n\nfunction create(node, id, self) {\n var schedules = node.__transition,\n tween;\n\n // Initialize the self timer when the transition is created.\n // Note the actual delay is not known until the first callback!\n schedules[id] = self;\n self.timer = timer(schedule, 0, self.time);\n\n function schedule(elapsed) {\n self.state = SCHEDULED;\n self.timer.restart(start, self.delay, self.time);\n\n // If the elapsed delay is less than our first sleep, start immediately.\n if (self.delay <= elapsed) start(elapsed - self.delay);\n }\n\n function start(elapsed) {\n var i, j, n, o;\n\n // If the state is not SCHEDULED, then we previously errored on start.\n if (self.state !== SCHEDULED) return stop();\n\n for (i in schedules) {\n o = schedules[i];\n if (o.name !== self.name) continue;\n\n // While this element already has a starting transition during this frame,\n // defer starting an interrupting transition until that transition has a\n // chance to tick (and possibly end); see d3/d3-transition#54!\n if (o.state === STARTED) return timeout(start);\n\n // Interrupt the active transition, if any.\n if (o.state === RUNNING) {\n o.state = ENDED;\n o.timer.stop();\n o.on.call(\"interrupt\", node, node.__data__, o.index, o.group);\n delete schedules[i];\n }\n\n // Cancel any pre-empted transitions.\n else if (+i < id) {\n o.state = ENDED;\n o.timer.stop();\n o.on.call(\"cancel\", node, node.__data__, o.index, o.group);\n delete schedules[i];\n }\n }\n\n // Defer the first tick to end of the current frame; see d3/d3#1576.\n // Note the transition may be canceled after start and before the first tick!\n // Note this must be scheduled before the start event; see d3/d3-transition#16!\n // Assuming this is successful, subsequent callbacks go straight to tick.\n timeout(function() {\n if (self.state === STARTED) {\n self.state = RUNNING;\n self.timer.restart(tick, self.delay, self.time);\n tick(elapsed);\n }\n });\n\n // Dispatch the start event.\n // Note this must be done before the tween are initialized.\n self.state = STARTING;\n self.on.call(\"start\", node, node.__data__, self.index, self.group);\n if (self.state !== STARTING) return; // interrupted\n self.state = STARTED;\n\n // Initialize the tween, deleting null tween.\n tween = new Array(n = self.tween.length);\n for (i = 0, j = -1; i < n; ++i) {\n if (o = self.tween[i].value.call(node, node.__data__, self.index, self.group)) {\n tween[++j] = o;\n }\n }\n tween.length = j + 1;\n }\n\n function tick(elapsed) {\n var t = elapsed < self.duration ? self.ease.call(null, elapsed / self.duration) : (self.timer.restart(stop), self.state = ENDING, 1),\n i = -1,\n n = tween.length;\n\n while (++i < n) {\n tween[i].call(node, t);\n }\n\n // Dispatch the end event.\n if (self.state === ENDING) {\n self.on.call(\"end\", node, node.__data__, self.index, self.group);\n stop();\n }\n }\n\n function stop() {\n self.state = ENDED;\n self.timer.stop();\n delete schedules[id];\n for (var i in schedules) return; // eslint-disable-line no-unused-vars\n delete node.__transition;\n }\n}\n","import {STARTING, ENDING, ENDED} from \"./transition/schedule.js\";\n\nexport default function(node, name) {\n var schedules = node.__transition,\n schedule,\n active,\n empty = true,\n i;\n\n if (!schedules) return;\n\n name = name == null ? null : name + \"\";\n\n for (i in schedules) {\n if ((schedule = schedules[i]).name !== name) { empty = false; continue; }\n active = schedule.state > STARTING && schedule.state < ENDING;\n schedule.state = ENDED;\n schedule.timer.stop();\n schedule.on.call(active ? \"interrupt\" : \"cancel\", node, node.__data__, schedule.index, schedule.group);\n delete schedules[i];\n }\n\n if (empty) delete node.__transition;\n}\n","import interrupt from \"../interrupt.js\";\n\nexport default function(name) {\n return this.each(function() {\n interrupt(this, name);\n });\n}\n","import {get, set} from \"./schedule.js\";\n\nfunction tweenRemove(id, name) {\n var tween0, tween1;\n return function() {\n var schedule = set(this, id),\n tween = schedule.tween;\n\n // If this node shared tween with the previous node,\n // just assign the updated shared tween and we’re done!\n // Otherwise, copy-on-write.\n if (tween !== tween0) {\n tween1 = tween0 = tween;\n for (var i = 0, n = tween1.length; i < n; ++i) {\n if (tween1[i].name === name) {\n tween1 = tween1.slice();\n tween1.splice(i, 1);\n break;\n }\n }\n }\n\n schedule.tween = tween1;\n };\n}\n\nfunction tweenFunction(id, name, value) {\n var tween0, tween1;\n if (typeof value !== \"function\") throw new Error;\n return function() {\n var schedule = set(this, id),\n tween = schedule.tween;\n\n // If this node shared tween with the previous node,\n // just assign the updated shared tween and we’re done!\n // Otherwise, copy-on-write.\n if (tween !== tween0) {\n tween1 = (tween0 = tween).slice();\n for (var t = {name: name, value: value}, i = 0, n = tween1.length; i < n; ++i) {\n if (tween1[i].name === name) {\n tween1[i] = t;\n break;\n }\n }\n if (i === n) tween1.push(t);\n }\n\n schedule.tween = tween1;\n };\n}\n\nexport default function(name, value) {\n var id = this._id;\n\n name += \"\";\n\n if (arguments.length < 2) {\n var tween = get(this.node(), id).tween;\n for (var i = 0, n = tween.length, t; i < n; ++i) {\n if ((t = tween[i]).name === name) {\n return t.value;\n }\n }\n return null;\n }\n\n return this.each((value == null ? tweenRemove : tweenFunction)(id, name, value));\n}\n\nexport function tweenValue(transition, name, value) {\n var id = transition._id;\n\n transition.each(function() {\n var schedule = set(this, id);\n (schedule.value || (schedule.value = {}))[name] = value.apply(this, arguments);\n });\n\n return function(node) {\n return get(node, id).value[name];\n };\n}\n","import {color} from \"d3-color\";\nimport {interpolateNumber, interpolateRgb, interpolateString} from \"d3-interpolate\";\n\nexport default function(a, b) {\n var c;\n return (typeof b === \"number\" ? interpolateNumber\n : b instanceof color ? interpolateRgb\n : (c = color(b)) ? (b = c, interpolateRgb)\n : interpolateString)(a, b);\n}\n","import {interpolateTransformSvg as interpolateTransform} from \"d3-interpolate\";\nimport {namespace} from \"d3-selection\";\nimport {tweenValue} from \"./tween.js\";\nimport interpolate from \"./interpolate.js\";\n\nfunction attrRemove(name) {\n return function() {\n this.removeAttribute(name);\n };\n}\n\nfunction attrRemoveNS(fullname) {\n return function() {\n this.removeAttributeNS(fullname.space, fullname.local);\n };\n}\n\nfunction attrConstant(name, interpolate, value1) {\n var string00,\n string1 = value1 + \"\",\n interpolate0;\n return function() {\n var string0 = this.getAttribute(name);\n return string0 === string1 ? null\n : string0 === string00 ? interpolate0\n : interpolate0 = interpolate(string00 = string0, value1);\n };\n}\n\nfunction attrConstantNS(fullname, interpolate, value1) {\n var string00,\n string1 = value1 + \"\",\n interpolate0;\n return function() {\n var string0 = this.getAttributeNS(fullname.space, fullname.local);\n return string0 === string1 ? null\n : string0 === string00 ? interpolate0\n : interpolate0 = interpolate(string00 = string0, value1);\n };\n}\n\nfunction attrFunction(name, interpolate, value) {\n var string00,\n string10,\n interpolate0;\n return function() {\n var string0, value1 = value(this), string1;\n if (value1 == null) return void this.removeAttribute(name);\n string0 = this.getAttribute(name);\n string1 = value1 + \"\";\n return string0 === string1 ? null\n : string0 === string00 && string1 === string10 ? interpolate0\n : (string10 = string1, interpolate0 = interpolate(string00 = string0, value1));\n };\n}\n\nfunction attrFunctionNS(fullname, interpolate, value) {\n var string00,\n string10,\n interpolate0;\n return function() {\n var string0, value1 = value(this), string1;\n if (value1 == null) return void this.removeAttributeNS(fullname.space, fullname.local);\n string0 = this.getAttributeNS(fullname.space, fullname.local);\n string1 = value1 + \"\";\n return string0 === string1 ? null\n : string0 === string00 && string1 === string10 ? interpolate0\n : (string10 = string1, interpolate0 = interpolate(string00 = string0, value1));\n };\n}\n\nexport default function(name, value) {\n var fullname = namespace(name), i = fullname === \"transform\" ? interpolateTransform : interpolate;\n return this.attrTween(name, typeof value === \"function\"\n ? (fullname.local ? attrFunctionNS : attrFunction)(fullname, i, tweenValue(this, \"attr.\" + name, value))\n : value == null ? (fullname.local ? attrRemoveNS : attrRemove)(fullname)\n : (fullname.local ? attrConstantNS : attrConstant)(fullname, i, value));\n}\n","import {namespace} from \"d3-selection\";\n\nfunction attrInterpolate(name, i) {\n return function(t) {\n this.setAttribute(name, i.call(this, t));\n };\n}\n\nfunction attrInterpolateNS(fullname, i) {\n return function(t) {\n this.setAttributeNS(fullname.space, fullname.local, i.call(this, t));\n };\n}\n\nfunction attrTweenNS(fullname, value) {\n var t0, i0;\n function tween() {\n var i = value.apply(this, arguments);\n if (i !== i0) t0 = (i0 = i) && attrInterpolateNS(fullname, i);\n return t0;\n }\n tween._value = value;\n return tween;\n}\n\nfunction attrTween(name, value) {\n var t0, i0;\n function tween() {\n var i = value.apply(this, arguments);\n if (i !== i0) t0 = (i0 = i) && attrInterpolate(name, i);\n return t0;\n }\n tween._value = value;\n return tween;\n}\n\nexport default function(name, value) {\n var key = \"attr.\" + name;\n if (arguments.length < 2) return (key = this.tween(key)) && key._value;\n if (value == null) return this.tween(key, null);\n if (typeof value !== \"function\") throw new Error;\n var fullname = namespace(name);\n return this.tween(key, (fullname.local ? attrTweenNS : attrTween)(fullname, value));\n}\n","import {get, init} from \"./schedule.js\";\n\nfunction delayFunction(id, value) {\n return function() {\n init(this, id).delay = +value.apply(this, arguments);\n };\n}\n\nfunction delayConstant(id, value) {\n return value = +value, function() {\n init(this, id).delay = value;\n };\n}\n\nexport default function(value) {\n var id = this._id;\n\n return arguments.length\n ? this.each((typeof value === \"function\"\n ? delayFunction\n : delayConstant)(id, value))\n : get(this.node(), id).delay;\n}\n","import {get, set} from \"./schedule.js\";\n\nfunction durationFunction(id, value) {\n return function() {\n set(this, id).duration = +value.apply(this, arguments);\n };\n}\n\nfunction durationConstant(id, value) {\n return value = +value, function() {\n set(this, id).duration = value;\n };\n}\n\nexport default function(value) {\n var id = this._id;\n\n return arguments.length\n ? this.each((typeof value === \"function\"\n ? durationFunction\n : durationConstant)(id, value))\n : get(this.node(), id).duration;\n}\n","import {get, set} from \"./schedule.js\";\n\nfunction easeConstant(id, value) {\n if (typeof value !== \"function\") throw new Error;\n return function() {\n set(this, id).ease = value;\n };\n}\n\nexport default function(value) {\n var id = this._id;\n\n return arguments.length\n ? this.each(easeConstant(id, value))\n : get(this.node(), id).ease;\n}\n","import {set} from \"./schedule.js\";\n\nfunction easeVarying(id, value) {\n return function() {\n var v = value.apply(this, arguments);\n if (typeof v !== \"function\") throw new Error;\n set(this, id).ease = v;\n };\n}\n\nexport default function(value) {\n if (typeof value !== \"function\") throw new Error;\n return this.each(easeVarying(this._id, value));\n}\n","import {matcher} from \"d3-selection\";\nimport {Transition} from \"./index.js\";\n\nexport default function(match) {\n if (typeof match !== \"function\") match = matcher(match);\n\n for (var groups = this._groups, m = groups.length, subgroups = new Array(m), j = 0; j < m; ++j) {\n for (var group = groups[j], n = group.length, subgroup = subgroups[j] = [], node, i = 0; i < n; ++i) {\n if ((node = group[i]) && match.call(node, node.__data__, i, group)) {\n subgroup.push(node);\n }\n }\n }\n\n return new Transition(subgroups, this._parents, this._name, this._id);\n}\n","import {Transition} from \"./index.js\";\n\nexport default function(transition) {\n if (transition._id !== this._id) throw new Error;\n\n for (var groups0 = this._groups, groups1 = transition._groups, m0 = groups0.length, m1 = groups1.length, m = Math.min(m0, m1), merges = new Array(m0), j = 0; j < m; ++j) {\n for (var group0 = groups0[j], group1 = groups1[j], n = group0.length, merge = merges[j] = new Array(n), node, i = 0; i < n; ++i) {\n if (node = group0[i] || group1[i]) {\n merge[i] = node;\n }\n }\n }\n\n for (; j < m0; ++j) {\n merges[j] = groups0[j];\n }\n\n return new Transition(merges, this._parents, this._name, this._id);\n}\n","import {get, set, init} from \"./schedule.js\";\n\nfunction start(name) {\n return (name + \"\").trim().split(/^|\\s+/).every(function(t) {\n var i = t.indexOf(\".\");\n if (i >= 0) t = t.slice(0, i);\n return !t || t === \"start\";\n });\n}\n\nfunction onFunction(id, name, listener) {\n var on0, on1, sit = start(name) ? init : set;\n return function() {\n var schedule = sit(this, id),\n on = schedule.on;\n\n // If this node shared a dispatch with the previous node,\n // just assign the updated shared dispatch and we’re done!\n // Otherwise, copy-on-write.\n if (on !== on0) (on1 = (on0 = on).copy()).on(name, listener);\n\n schedule.on = on1;\n };\n}\n\nexport default function(name, listener) {\n var id = this._id;\n\n return arguments.length < 2\n ? get(this.node(), id).on.on(name)\n : this.each(onFunction(id, name, listener));\n}\n","function removeFunction(id) {\n return function() {\n var parent = this.parentNode;\n for (var i in this.__transition) if (+i !== id) return;\n if (parent) parent.removeChild(this);\n };\n}\n\nexport default function() {\n return this.on(\"end.remove\", removeFunction(this._id));\n}\n","import {selector} from \"d3-selection\";\nimport {Transition} from \"./index.js\";\nimport schedule, {get} from \"./schedule.js\";\n\nexport default function(select) {\n var name = this._name,\n id = this._id;\n\n if (typeof select !== \"function\") select = selector(select);\n\n for (var groups = this._groups, m = groups.length, subgroups = new Array(m), j = 0; j < m; ++j) {\n for (var group = groups[j], n = group.length, subgroup = subgroups[j] = new Array(n), node, subnode, i = 0; i < n; ++i) {\n if ((node = group[i]) && (subnode = select.call(node, node.__data__, i, group))) {\n if (\"__data__\" in node) subnode.__data__ = node.__data__;\n subgroup[i] = subnode;\n schedule(subgroup[i], name, id, i, subgroup, get(node, id));\n }\n }\n }\n\n return new Transition(subgroups, this._parents, name, id);\n}\n","import {selectorAll} from \"d3-selection\";\nimport {Transition} from \"./index.js\";\nimport schedule, {get} from \"./schedule.js\";\n\nexport default function(select) {\n var name = this._name,\n id = this._id;\n\n if (typeof select !== \"function\") select = selectorAll(select);\n\n for (var groups = this._groups, m = groups.length, subgroups = [], parents = [], j = 0; j < m; ++j) {\n for (var group = groups[j], n = group.length, node, i = 0; i < n; ++i) {\n if (node = group[i]) {\n for (var children = select.call(node, node.__data__, i, group), child, inherit = get(node, id), k = 0, l = children.length; k < l; ++k) {\n if (child = children[k]) {\n schedule(child, name, id, k, children, inherit);\n }\n }\n subgroups.push(children);\n parents.push(node);\n }\n }\n }\n\n return new Transition(subgroups, parents, name, id);\n}\n","import {selection} from \"d3-selection\";\n\nvar Selection = selection.prototype.constructor;\n\nexport default function() {\n return new Selection(this._groups, this._parents);\n}\n","import {interpolateTransformCss as interpolateTransform} from \"d3-interpolate\";\nimport {style} from \"d3-selection\";\nimport {set} from \"./schedule.js\";\nimport {tweenValue} from \"./tween.js\";\nimport interpolate from \"./interpolate.js\";\n\nfunction styleNull(name, interpolate) {\n var string00,\n string10,\n interpolate0;\n return function() {\n var string0 = style(this, name),\n string1 = (this.style.removeProperty(name), style(this, name));\n return string0 === string1 ? null\n : string0 === string00 && string1 === string10 ? interpolate0\n : interpolate0 = interpolate(string00 = string0, string10 = string1);\n };\n}\n\nfunction styleRemove(name) {\n return function() {\n this.style.removeProperty(name);\n };\n}\n\nfunction styleConstant(name, interpolate, value1) {\n var string00,\n string1 = value1 + \"\",\n interpolate0;\n return function() {\n var string0 = style(this, name);\n return string0 === string1 ? null\n : string0 === string00 ? interpolate0\n : interpolate0 = interpolate(string00 = string0, value1);\n };\n}\n\nfunction styleFunction(name, interpolate, value) {\n var string00,\n string10,\n interpolate0;\n return function() {\n var string0 = style(this, name),\n value1 = value(this),\n string1 = value1 + \"\";\n if (value1 == null) string1 = value1 = (this.style.removeProperty(name), style(this, name));\n return string0 === string1 ? null\n : string0 === string00 && string1 === string10 ? interpolate0\n : (string10 = string1, interpolate0 = interpolate(string00 = string0, value1));\n };\n}\n\nfunction styleMaybeRemove(id, name) {\n var on0, on1, listener0, key = \"style.\" + name, event = \"end.\" + key, remove;\n return function() {\n var schedule = set(this, id),\n on = schedule.on,\n listener = schedule.value[key] == null ? remove || (remove = styleRemove(name)) : undefined;\n\n // If this node shared a dispatch with the previous node,\n // just assign the updated shared dispatch and we’re done!\n // Otherwise, copy-on-write.\n if (on !== on0 || listener0 !== listener) (on1 = (on0 = on).copy()).on(event, listener0 = listener);\n\n schedule.on = on1;\n };\n}\n\nexport default function(name, value, priority) {\n var i = (name += \"\") === \"transform\" ? interpolateTransform : interpolate;\n return value == null ? this\n .styleTween(name, styleNull(name, i))\n .on(\"end.style.\" + name, styleRemove(name))\n : typeof value === \"function\" ? this\n .styleTween(name, styleFunction(name, i, tweenValue(this, \"style.\" + name, value)))\n .each(styleMaybeRemove(this._id, name))\n : this\n .styleTween(name, styleConstant(name, i, value), priority)\n .on(\"end.style.\" + name, null);\n}\n","function styleInterpolate(name, i, priority) {\n return function(t) {\n this.style.setProperty(name, i.call(this, t), priority);\n };\n}\n\nfunction styleTween(name, value, priority) {\n var t, i0;\n function tween() {\n var i = value.apply(this, arguments);\n if (i !== i0) t = (i0 = i) && styleInterpolate(name, i, priority);\n return t;\n }\n tween._value = value;\n return tween;\n}\n\nexport default function(name, value, priority) {\n var key = \"style.\" + (name += \"\");\n if (arguments.length < 2) return (key = this.tween(key)) && key._value;\n if (value == null) return this.tween(key, null);\n if (typeof value !== \"function\") throw new Error;\n return this.tween(key, styleTween(name, value, priority == null ? \"\" : priority));\n}\n","import {tweenValue} from \"./tween.js\";\n\nfunction textConstant(value) {\n return function() {\n this.textContent = value;\n };\n}\n\nfunction textFunction(value) {\n return function() {\n var value1 = value(this);\n this.textContent = value1 == null ? \"\" : value1;\n };\n}\n\nexport default function(value) {\n return this.tween(\"text\", typeof value === \"function\"\n ? textFunction(tweenValue(this, \"text\", value))\n : textConstant(value == null ? \"\" : value + \"\"));\n}\n","function textInterpolate(i) {\n return function(t) {\n this.textContent = i.call(this, t);\n };\n}\n\nfunction textTween(value) {\n var t0, i0;\n function tween() {\n var i = value.apply(this, arguments);\n if (i !== i0) t0 = (i0 = i) && textInterpolate(i);\n return t0;\n }\n tween._value = value;\n return tween;\n}\n\nexport default function(value) {\n var key = \"text\";\n if (arguments.length < 1) return (key = this.tween(key)) && key._value;\n if (value == null) return this.tween(key, null);\n if (typeof value !== \"function\") throw new Error;\n return this.tween(key, textTween(value));\n}\n","import {Transition, newId} from \"./index.js\";\nimport schedule, {get} from \"./schedule.js\";\n\nexport default function() {\n var name = this._name,\n id0 = this._id,\n id1 = newId();\n\n for (var groups = this._groups, m = groups.length, j = 0; j < m; ++j) {\n for (var group = groups[j], n = group.length, node, i = 0; i < n; ++i) {\n if (node = group[i]) {\n var inherit = get(node, id0);\n schedule(node, name, id1, i, group, {\n time: inherit.time + inherit.delay + inherit.duration,\n delay: 0,\n duration: inherit.duration,\n ease: inherit.ease\n });\n }\n }\n }\n\n return new Transition(groups, this._parents, name, id1);\n}\n","import {set} from \"./schedule.js\";\n\nexport default function() {\n var on0, on1, that = this, id = that._id, size = that.size();\n return new Promise(function(resolve, reject) {\n var cancel = {value: reject},\n end = {value: function() { if (--size === 0) resolve(); }};\n\n that.each(function() {\n var schedule = set(this, id),\n on = schedule.on;\n\n // If this node shared a dispatch with the previous node,\n // just assign the updated shared dispatch and we’re done!\n // Otherwise, copy-on-write.\n if (on !== on0) {\n on1 = (on0 = on).copy();\n on1._.cancel.push(cancel);\n on1._.interrupt.push(cancel);\n on1._.end.push(end);\n }\n\n schedule.on = on1;\n });\n\n // The selection was empty, resolve end immediately\n if (size === 0) resolve();\n });\n}\n","import {selection} from \"d3-selection\";\nimport transition_attr from \"./attr.js\";\nimport transition_attrTween from \"./attrTween.js\";\nimport transition_delay from \"./delay.js\";\nimport transition_duration from \"./duration.js\";\nimport transition_ease from \"./ease.js\";\nimport transition_easeVarying from \"./easeVarying.js\";\nimport transition_filter from \"./filter.js\";\nimport transition_merge from \"./merge.js\";\nimport transition_on from \"./on.js\";\nimport transition_remove from \"./remove.js\";\nimport transition_select from \"./select.js\";\nimport transition_selectAll from \"./selectAll.js\";\nimport transition_selection from \"./selection.js\";\nimport transition_style from \"./style.js\";\nimport transition_styleTween from \"./styleTween.js\";\nimport transition_text from \"./text.js\";\nimport transition_textTween from \"./textTween.js\";\nimport transition_transition from \"./transition.js\";\nimport transition_tween from \"./tween.js\";\nimport transition_end from \"./end.js\";\n\nvar id = 0;\n\nexport function Transition(groups, parents, name, id) {\n this._groups = groups;\n this._parents = parents;\n this._name = name;\n this._id = id;\n}\n\nexport default function transition(name) {\n return selection().transition(name);\n}\n\nexport function newId() {\n return ++id;\n}\n\nvar selection_prototype = selection.prototype;\n\nTransition.prototype = transition.prototype = {\n constructor: Transition,\n select: transition_select,\n selectAll: transition_selectAll,\n selectChild: selection_prototype.selectChild,\n selectChildren: selection_prototype.selectChildren,\n filter: transition_filter,\n merge: transition_merge,\n selection: transition_selection,\n transition: transition_transition,\n call: selection_prototype.call,\n nodes: selection_prototype.nodes,\n node: selection_prototype.node,\n size: selection_prototype.size,\n empty: selection_prototype.empty,\n each: selection_prototype.each,\n on: transition_on,\n attr: transition_attr,\n attrTween: transition_attrTween,\n style: transition_style,\n styleTween: transition_styleTween,\n text: transition_text,\n textTween: transition_textTween,\n remove: transition_remove,\n tween: transition_tween,\n delay: transition_delay,\n duration: transition_duration,\n ease: transition_ease,\n easeVarying: transition_easeVarying,\n end: transition_end,\n [Symbol.iterator]: selection_prototype[Symbol.iterator]\n};\n","export function cubicIn(t) {\n return t * t * t;\n}\n\nexport function cubicOut(t) {\n return --t * t * t + 1;\n}\n\nexport function cubicInOut(t) {\n return ((t *= 2) <= 1 ? t * t * t : (t -= 2) * t * t + 2) / 2;\n}\n","import {Transition, newId} from \"../transition/index.js\";\nimport schedule from \"../transition/schedule.js\";\nimport {easeCubicInOut} from \"d3-ease\";\nimport {now} from \"d3-timer\";\n\nvar defaultTiming = {\n time: null, // Set on use.\n delay: 0,\n duration: 250,\n ease: easeCubicInOut\n};\n\nfunction inherit(node, id) {\n var timing;\n while (!(timing = node.__transition) || !(timing = timing[id])) {\n if (!(node = node.parentNode)) {\n throw new Error(`transition ${id} not found`);\n }\n }\n return timing;\n}\n\nexport default function(name) {\n var id,\n timing;\n\n if (name instanceof Transition) {\n id = name._id, name = name._name;\n } else {\n id = newId(), (timing = defaultTiming).time = now(), name = name == null ? null : name + \"\";\n }\n\n for (var groups = this._groups, m = groups.length, j = 0; j < m; ++j) {\n for (var group = groups[j], n = group.length, node, i = 0; i < n; ++i) {\n if (node = group[i]) {\n schedule(node, name, id, i, group, timing || inherit(node, id));\n }\n }\n }\n\n return new Transition(groups, this._parents, name, id);\n}\n","import {selection} from \"d3-selection\";\nimport selection_interrupt from \"./interrupt.js\";\nimport selection_transition from \"./transition.js\";\n\nselection.prototype.interrupt = selection_interrupt;\nselection.prototype.transition = selection_transition;\n","const pi = Math.PI,\n tau = 2 * pi,\n epsilon = 1e-6,\n tauEpsilon = tau - epsilon;\n\nfunction append(strings) {\n this._ += strings[0];\n for (let i = 1, n = strings.length; i < n; ++i) {\n this._ += arguments[i] + strings[i];\n }\n}\n\nfunction appendRound(digits) {\n let d = Math.floor(digits);\n if (!(d >= 0)) throw new Error(`invalid digits: ${digits}`);\n if (d > 15) return append;\n const k = 10 ** d;\n return function(strings) {\n this._ += strings[0];\n for (let i = 1, n = strings.length; i < n; ++i) {\n this._ += Math.round(arguments[i] * k) / k + strings[i];\n }\n };\n}\n\nexport class Path {\n constructor(digits) {\n this._x0 = this._y0 = // start of current subpath\n this._x1 = this._y1 = null; // end of current subpath\n this._ = \"\";\n this._append = digits == null ? append : appendRound(digits);\n }\n moveTo(x, y) {\n this._append`M${this._x0 = this._x1 = +x},${this._y0 = this._y1 = +y}`;\n }\n closePath() {\n if (this._x1 !== null) {\n this._x1 = this._x0, this._y1 = this._y0;\n this._append`Z`;\n }\n }\n lineTo(x, y) {\n this._append`L${this._x1 = +x},${this._y1 = +y}`;\n }\n quadraticCurveTo(x1, y1, x, y) {\n this._append`Q${+x1},${+y1},${this._x1 = +x},${this._y1 = +y}`;\n }\n bezierCurveTo(x1, y1, x2, y2, x, y) {\n this._append`C${+x1},${+y1},${+x2},${+y2},${this._x1 = +x},${this._y1 = +y}`;\n }\n arcTo(x1, y1, x2, y2, r) {\n x1 = +x1, y1 = +y1, x2 = +x2, y2 = +y2, r = +r;\n\n // Is the radius negative? Error.\n if (r < 0) throw new Error(`negative radius: ${r}`);\n\n let x0 = this._x1,\n y0 = this._y1,\n x21 = x2 - x1,\n y21 = y2 - y1,\n x01 = x0 - x1,\n y01 = y0 - y1,\n l01_2 = x01 * x01 + y01 * y01;\n\n // Is this path empty? Move to (x1,y1).\n if (this._x1 === null) {\n this._append`M${this._x1 = x1},${this._y1 = y1}`;\n }\n\n // Or, is (x1,y1) coincident with (x0,y0)? Do nothing.\n else if (!(l01_2 > epsilon));\n\n // Or, are (x0,y0), (x1,y1) and (x2,y2) collinear?\n // Equivalently, is (x1,y1) coincident with (x2,y2)?\n // Or, is the radius zero? Line to (x1,y1).\n else if (!(Math.abs(y01 * x21 - y21 * x01) > epsilon) || !r) {\n this._append`L${this._x1 = x1},${this._y1 = y1}`;\n }\n\n // Otherwise, draw an arc!\n else {\n let x20 = x2 - x0,\n y20 = y2 - y0,\n l21_2 = x21 * x21 + y21 * y21,\n l20_2 = x20 * x20 + y20 * y20,\n l21 = Math.sqrt(l21_2),\n l01 = Math.sqrt(l01_2),\n l = r * Math.tan((pi - Math.acos((l21_2 + l01_2 - l20_2) / (2 * l21 * l01))) / 2),\n t01 = l / l01,\n t21 = l / l21;\n\n // If the start tangent is not coincident with (x0,y0), line to.\n if (Math.abs(t01 - 1) > epsilon) {\n this._append`L${x1 + t01 * x01},${y1 + t01 * y01}`;\n }\n\n this._append`A${r},${r},0,0,${+(y01 * x20 > x01 * y20)},${this._x1 = x1 + t21 * x21},${this._y1 = y1 + t21 * y21}`;\n }\n }\n arc(x, y, r, a0, a1, ccw) {\n x = +x, y = +y, r = +r, ccw = !!ccw;\n\n // Is the radius negative? Error.\n if (r < 0) throw new Error(`negative radius: ${r}`);\n\n let dx = r * Math.cos(a0),\n dy = r * Math.sin(a0),\n x0 = x + dx,\n y0 = y + dy,\n cw = 1 ^ ccw,\n da = ccw ? a0 - a1 : a1 - a0;\n\n // Is this path empty? Move to (x0,y0).\n if (this._x1 === null) {\n this._append`M${x0},${y0}`;\n }\n\n // Or, is (x0,y0) not coincident with the previous point? Line to (x0,y0).\n else if (Math.abs(this._x1 - x0) > epsilon || Math.abs(this._y1 - y0) > epsilon) {\n this._append`L${x0},${y0}`;\n }\n\n // Is this arc empty? We’re done.\n if (!r) return;\n\n // Does the angle go the wrong way? Flip the direction.\n if (da < 0) da = da % tau + tau;\n\n // Is this a complete circle? Draw two arcs to complete the circle.\n if (da > tauEpsilon) {\n this._append`A${r},${r},0,1,${cw},${x - dx},${y - dy}A${r},${r},0,1,${cw},${this._x1 = x0},${this._y1 = y0}`;\n }\n\n // Is this arc non-empty? Draw an arc!\n else if (da > epsilon) {\n this._append`A${r},${r},0,${+(da >= pi)},${cw},${this._x1 = x + r * Math.cos(a1)},${this._y1 = y + r * Math.sin(a1)}`;\n }\n }\n rect(x, y, w, h) {\n this._append`M${this._x0 = this._x1 = +x},${this._y0 = this._y1 = +y}h${w = +w}v${+h}h${-w}Z`;\n }\n toString() {\n return this._;\n }\n}\n\nexport function path() {\n return new Path;\n}\n\n// Allow instanceof d3.path\npath.prototype = Path.prototype;\n\nexport function pathRound(digits = 3) {\n return new Path(+digits);\n}\n","function defaultSeparation(a, b) {\n return a.parent === b.parent ? 1 : 2;\n}\n\nfunction meanX(children) {\n return children.reduce(meanXReduce, 0) / children.length;\n}\n\nfunction meanXReduce(x, c) {\n return x + c.x;\n}\n\nfunction maxY(children) {\n return 1 + children.reduce(maxYReduce, 0);\n}\n\nfunction maxYReduce(y, c) {\n return Math.max(y, c.y);\n}\n\nfunction leafLeft(node) {\n var children;\n while (children = node.children) node = children[0];\n return node;\n}\n\nfunction leafRight(node) {\n var children;\n while (children = node.children) node = children[children.length - 1];\n return node;\n}\n\nexport default function() {\n var separation = defaultSeparation,\n dx = 1,\n dy = 1,\n nodeSize = false;\n\n function cluster(root) {\n var previousNode,\n x = 0;\n\n // First walk, computing the initial x & y values.\n root.eachAfter(function(node) {\n var children = node.children;\n if (children) {\n node.x = meanX(children);\n node.y = maxY(children);\n } else {\n node.x = previousNode ? x += separation(node, previousNode) : 0;\n node.y = 0;\n previousNode = node;\n }\n });\n\n var left = leafLeft(root),\n right = leafRight(root),\n x0 = left.x - separation(left, right) / 2,\n x1 = right.x + separation(right, left) / 2;\n\n // Second walk, normalizing x & y to the desired size.\n return root.eachAfter(nodeSize ? function(node) {\n node.x = (node.x - root.x) * dx;\n node.y = (root.y - node.y) * dy;\n } : function(node) {\n node.x = (node.x - x0) / (x1 - x0) * dx;\n node.y = (1 - (root.y ? node.y / root.y : 1)) * dy;\n });\n }\n\n cluster.separation = function(x) {\n return arguments.length ? (separation = x, cluster) : separation;\n };\n\n cluster.size = function(x) {\n return arguments.length ? (nodeSize = false, dx = +x[0], dy = +x[1], cluster) : (nodeSize ? null : [dx, dy]);\n };\n\n cluster.nodeSize = function(x) {\n return arguments.length ? (nodeSize = true, dx = +x[0], dy = +x[1], cluster) : (nodeSize ? [dx, dy] : null);\n };\n\n return cluster;\n}\n","function count(node) {\n var sum = 0,\n children = node.children,\n i = children && children.length;\n if (!i) sum = 1;\n else while (--i >= 0) sum += children[i].value;\n node.value = sum;\n}\n\nexport default function() {\n return this.eachAfter(count);\n}\n","export default function(callback, that) {\n let index = -1;\n for (const node of this) {\n callback.call(that, node, ++index, this);\n }\n return this;\n}\n","export default function(callback, that) {\n var node = this, nodes = [node], children, i, index = -1;\n while (node = nodes.pop()) {\n callback.call(that, node, ++index, this);\n if (children = node.children) {\n for (i = children.length - 1; i >= 0; --i) {\n nodes.push(children[i]);\n }\n }\n }\n return this;\n}\n","export default function(callback, that) {\n var node = this, nodes = [node], next = [], children, i, n, index = -1;\n while (node = nodes.pop()) {\n next.push(node);\n if (children = node.children) {\n for (i = 0, n = children.length; i < n; ++i) {\n nodes.push(children[i]);\n }\n }\n }\n while (node = next.pop()) {\n callback.call(that, node, ++index, this);\n }\n return this;\n}\n","export default function(callback, that) {\n let index = -1;\n for (const node of this) {\n if (callback.call(that, node, ++index, this)) {\n return node;\n }\n }\n}\n","export default function(value) {\n return this.eachAfter(function(node) {\n var sum = +value(node.data) || 0,\n children = node.children,\n i = children && children.length;\n while (--i >= 0) sum += children[i].value;\n node.value = sum;\n });\n}\n","export default function(compare) {\n return this.eachBefore(function(node) {\n if (node.children) {\n node.children.sort(compare);\n }\n });\n}\n","export default function(end) {\n var start = this,\n ancestor = leastCommonAncestor(start, end),\n nodes = [start];\n while (start !== ancestor) {\n start = start.parent;\n nodes.push(start);\n }\n var k = nodes.length;\n while (end !== ancestor) {\n nodes.splice(k, 0, end);\n end = end.parent;\n }\n return nodes;\n}\n\nfunction leastCommonAncestor(a, b) {\n if (a === b) return a;\n var aNodes = a.ancestors(),\n bNodes = b.ancestors(),\n c = null;\n a = aNodes.pop();\n b = bNodes.pop();\n while (a === b) {\n c = a;\n a = aNodes.pop();\n b = bNodes.pop();\n }\n return c;\n}\n","export default function() {\n var node = this, nodes = [node];\n while (node = node.parent) {\n nodes.push(node);\n }\n return nodes;\n}\n","export default function() {\n return Array.from(this);\n}\n","export default function() {\n var leaves = [];\n this.eachBefore(function(node) {\n if (!node.children) {\n leaves.push(node);\n }\n });\n return leaves;\n}\n","export default function() {\n var root = this, links = [];\n root.each(function(node) {\n if (node !== root) { // Don’t include the root’s parent, if any.\n links.push({source: node.parent, target: node});\n }\n });\n return links;\n}\n","export default function*() {\n var node = this, current, next = [node], children, i, n;\n do {\n current = next.reverse(), next = [];\n while (node = current.pop()) {\n yield node;\n if (children = node.children) {\n for (i = 0, n = children.length; i < n; ++i) {\n next.push(children[i]);\n }\n }\n }\n } while (next.length);\n}\n","import node_count from \"./count.js\";\nimport node_each from \"./each.js\";\nimport node_eachBefore from \"./eachBefore.js\";\nimport node_eachAfter from \"./eachAfter.js\";\nimport node_find from \"./find.js\";\nimport node_sum from \"./sum.js\";\nimport node_sort from \"./sort.js\";\nimport node_path from \"./path.js\";\nimport node_ancestors from \"./ancestors.js\";\nimport node_descendants from \"./descendants.js\";\nimport node_leaves from \"./leaves.js\";\nimport node_links from \"./links.js\";\nimport node_iterator from \"./iterator.js\";\n\nexport default function hierarchy(data, children) {\n if (data instanceof Map) {\n data = [undefined, data];\n if (children === undefined) children = mapChildren;\n } else if (children === undefined) {\n children = objectChildren;\n }\n\n var root = new Node(data),\n node,\n nodes = [root],\n child,\n childs,\n i,\n n;\n\n while (node = nodes.pop()) {\n if ((childs = children(node.data)) && (n = (childs = Array.from(childs)).length)) {\n node.children = childs;\n for (i = n - 1; i >= 0; --i) {\n nodes.push(child = childs[i] = new Node(childs[i]));\n child.parent = node;\n child.depth = node.depth + 1;\n }\n }\n }\n\n return root.eachBefore(computeHeight);\n}\n\nfunction node_copy() {\n return hierarchy(this).eachBefore(copyData);\n}\n\nfunction objectChildren(d) {\n return d.children;\n}\n\nfunction mapChildren(d) {\n return Array.isArray(d) ? d[1] : null;\n}\n\nfunction copyData(node) {\n if (node.data.value !== undefined) node.value = node.data.value;\n node.data = node.data.data;\n}\n\nexport function computeHeight(node) {\n var height = 0;\n do node.height = height;\n while ((node = node.parent) && (node.height < ++height));\n}\n\nexport function Node(data) {\n this.data = data;\n this.depth =\n this.height = 0;\n this.parent = null;\n}\n\nNode.prototype = hierarchy.prototype = {\n constructor: Node,\n count: node_count,\n each: node_each,\n eachAfter: node_eachAfter,\n eachBefore: node_eachBefore,\n find: node_find,\n sum: node_sum,\n sort: node_sort,\n path: node_path,\n ancestors: node_ancestors,\n descendants: node_descendants,\n leaves: node_leaves,\n links: node_links,\n copy: node_copy,\n [Symbol.iterator]: node_iterator\n};\n","export default function(x) {\n return function constant() {\n return x;\n };\n}\n","export const abs = Math.abs;\nexport const atan2 = Math.atan2;\nexport const cos = Math.cos;\nexport const max = Math.max;\nexport const min = Math.min;\nexport const sin = Math.sin;\nexport const sqrt = Math.sqrt;\n\nexport const epsilon = 1e-12;\nexport const pi = Math.PI;\nexport const halfPi = pi / 2;\nexport const tau = 2 * pi;\n\nexport function acos(x) {\n return x > 1 ? 0 : x < -1 ? pi : Math.acos(x);\n}\n\nexport function asin(x) {\n return x >= 1 ? halfPi : x <= -1 ? -halfPi : Math.asin(x);\n}\n","import {Path} from \"d3-path\";\n\nexport function withPath(shape) {\n let digits = 3;\n\n shape.digits = function(_) {\n if (!arguments.length) return digits;\n if (_ == null) {\n digits = null;\n } else {\n const d = Math.floor(_);\n if (!(d >= 0)) throw new RangeError(`invalid digits: ${_}`);\n digits = d;\n }\n return shape;\n };\n\n return () => new Path(digits);\n}\n","import {pi, sqrt, tau} from \"../math.js\";\n\nexport default {\n draw(context, size) {\n const r = sqrt(size / pi);\n context.moveTo(r, 0);\n context.arc(0, 0, r, 0, tau);\n }\n};\n","import {sqrt} from \"../math.js\";\n\nconst sqrt3 = sqrt(3);\n\nexport default {\n draw(context, size) {\n const y = -sqrt(size / (sqrt3 * 3));\n context.moveTo(0, y * 2);\n context.lineTo(-sqrt3 * y, -y);\n context.lineTo(sqrt3 * y, -y);\n context.closePath();\n }\n};\n","import constant from \"./constant.js\";\nimport {withPath} from \"./path.js\";\nimport asterisk from \"./symbol/asterisk.js\";\nimport circle from \"./symbol/circle.js\";\nimport cross from \"./symbol/cross.js\";\nimport diamond from \"./symbol/diamond.js\";\nimport diamond2 from \"./symbol/diamond2.js\";\nimport plus from \"./symbol/plus.js\";\nimport square from \"./symbol/square.js\";\nimport square2 from \"./symbol/square2.js\";\nimport star from \"./symbol/star.js\";\nimport triangle from \"./symbol/triangle.js\";\nimport triangle2 from \"./symbol/triangle2.js\";\nimport wye from \"./symbol/wye.js\";\nimport times from \"./symbol/times.js\";\n\n// These symbols are designed to be filled.\nexport const symbolsFill = [\n circle,\n cross,\n diamond,\n square,\n star,\n triangle,\n wye\n];\n\n// These symbols are designed to be stroked (with a width of 1.5px and round caps).\nexport const symbolsStroke = [\n circle,\n plus,\n times,\n triangle2,\n asterisk,\n square2,\n diamond2\n];\n\nexport default function Symbol(type, size) {\n let context = null,\n path = withPath(symbol);\n\n type = typeof type === \"function\" ? type : constant(type || circle);\n size = typeof size === \"function\" ? size : constant(size === undefined ? 64 : +size);\n\n function symbol() {\n let buffer;\n if (!context) context = buffer = path();\n type.apply(this, arguments).draw(context, +size.apply(this, arguments));\n if (buffer) return context = null, buffer + \"\" || null;\n }\n\n symbol.type = function(_) {\n return arguments.length ? (type = typeof _ === \"function\" ? _ : constant(_), symbol) : type;\n };\n\n symbol.size = function(_) {\n return arguments.length ? (size = typeof _ === \"function\" ? _ : constant(+_), symbol) : size;\n };\n\n symbol.context = function(_) {\n return arguments.length ? (context = _ == null ? null : _, symbol) : context;\n };\n\n return symbol;\n}\n","export default x => () => x;\n","export default function ZoomEvent(type, {\n sourceEvent,\n target,\n transform,\n dispatch\n}) {\n Object.defineProperties(this, {\n type: {value: type, enumerable: true, configurable: true},\n sourceEvent: {value: sourceEvent, enumerable: true, configurable: true},\n target: {value: target, enumerable: true, configurable: true},\n transform: {value: transform, enumerable: true, configurable: true},\n _: {value: dispatch}\n });\n}\n","export function Transform(k, x, y) {\n this.k = k;\n this.x = x;\n this.y = y;\n}\n\nTransform.prototype = {\n constructor: Transform,\n scale: function(k) {\n return k === 1 ? this : new Transform(this.k * k, this.x, this.y);\n },\n translate: function(x, y) {\n return x === 0 & y === 0 ? this : new Transform(this.k, this.x + this.k * x, this.y + this.k * y);\n },\n apply: function(point) {\n return [point[0] * this.k + this.x, point[1] * this.k + this.y];\n },\n applyX: function(x) {\n return x * this.k + this.x;\n },\n applyY: function(y) {\n return y * this.k + this.y;\n },\n invert: function(location) {\n return [(location[0] - this.x) / this.k, (location[1] - this.y) / this.k];\n },\n invertX: function(x) {\n return (x - this.x) / this.k;\n },\n invertY: function(y) {\n return (y - this.y) / this.k;\n },\n rescaleX: function(x) {\n return x.copy().domain(x.range().map(this.invertX, this).map(x.invert, x));\n },\n rescaleY: function(y) {\n return y.copy().domain(y.range().map(this.invertY, this).map(y.invert, y));\n },\n toString: function() {\n return \"translate(\" + this.x + \",\" + this.y + \") scale(\" + this.k + \")\";\n }\n};\n\nexport var identity = new Transform(1, 0, 0);\n\ntransform.prototype = Transform.prototype;\n\nexport default function transform(node) {\n while (!node.__zoom) if (!(node = node.parentNode)) return identity;\n return node.__zoom;\n}\n","export function nopropagation(event) {\n event.stopImmediatePropagation();\n}\n\nexport default function(event) {\n event.preventDefault();\n event.stopImmediatePropagation();\n}\n","import {dispatch} from \"d3-dispatch\";\nimport {dragDisable, dragEnable} from \"d3-drag\";\nimport {interpolateZoom} from \"d3-interpolate\";\nimport {select, pointer} from \"d3-selection\";\nimport {interrupt} from \"d3-transition\";\nimport constant from \"./constant.js\";\nimport ZoomEvent from \"./event.js\";\nimport {Transform, identity} from \"./transform.js\";\nimport noevent, {nopropagation} from \"./noevent.js\";\n\n// Ignore right-click, since that should open the context menu.\n// except for pinch-to-zoom, which is sent as a wheel+ctrlKey event\nfunction defaultFilter(event) {\n return (!event.ctrlKey || event.type === 'wheel') && !event.button;\n}\n\nfunction defaultExtent() {\n var e = this;\n if (e instanceof SVGElement) {\n e = e.ownerSVGElement || e;\n if (e.hasAttribute(\"viewBox\")) {\n e = e.viewBox.baseVal;\n return [[e.x, e.y], [e.x + e.width, e.y + e.height]];\n }\n return [[0, 0], [e.width.baseVal.value, e.height.baseVal.value]];\n }\n return [[0, 0], [e.clientWidth, e.clientHeight]];\n}\n\nfunction defaultTransform() {\n return this.__zoom || identity;\n}\n\nfunction defaultWheelDelta(event) {\n return -event.deltaY * (event.deltaMode === 1 ? 0.05 : event.deltaMode ? 1 : 0.002) * (event.ctrlKey ? 10 : 1);\n}\n\nfunction defaultTouchable() {\n return navigator.maxTouchPoints || (\"ontouchstart\" in this);\n}\n\nfunction defaultConstrain(transform, extent, translateExtent) {\n var dx0 = transform.invertX(extent[0][0]) - translateExtent[0][0],\n dx1 = transform.invertX(extent[1][0]) - translateExtent[1][0],\n dy0 = transform.invertY(extent[0][1]) - translateExtent[0][1],\n dy1 = transform.invertY(extent[1][1]) - translateExtent[1][1];\n return transform.translate(\n dx1 > dx0 ? (dx0 + dx1) / 2 : Math.min(0, dx0) || Math.max(0, dx1),\n dy1 > dy0 ? (dy0 + dy1) / 2 : Math.min(0, dy0) || Math.max(0, dy1)\n );\n}\n\nexport default function() {\n var filter = defaultFilter,\n extent = defaultExtent,\n constrain = defaultConstrain,\n wheelDelta = defaultWheelDelta,\n touchable = defaultTouchable,\n scaleExtent = [0, Infinity],\n translateExtent = [[-Infinity, -Infinity], [Infinity, Infinity]],\n duration = 250,\n interpolate = interpolateZoom,\n listeners = dispatch(\"start\", \"zoom\", \"end\"),\n touchstarting,\n touchfirst,\n touchending,\n touchDelay = 500,\n wheelDelay = 150,\n clickDistance2 = 0,\n tapDistance = 10;\n\n function zoom(selection) {\n selection\n .property(\"__zoom\", defaultTransform)\n .on(\"wheel.zoom\", wheeled, {passive: false})\n .on(\"mousedown.zoom\", mousedowned)\n .on(\"dblclick.zoom\", dblclicked)\n .filter(touchable)\n .on(\"touchstart.zoom\", touchstarted)\n .on(\"touchmove.zoom\", touchmoved)\n .on(\"touchend.zoom touchcancel.zoom\", touchended)\n .style(\"-webkit-tap-highlight-color\", \"rgba(0,0,0,0)\");\n }\n\n zoom.transform = function(collection, transform, point, event) {\n var selection = collection.selection ? collection.selection() : collection;\n selection.property(\"__zoom\", defaultTransform);\n if (collection !== selection) {\n schedule(collection, transform, point, event);\n } else {\n selection.interrupt().each(function() {\n gesture(this, arguments)\n .event(event)\n .start()\n .zoom(null, typeof transform === \"function\" ? transform.apply(this, arguments) : transform)\n .end();\n });\n }\n };\n\n zoom.scaleBy = function(selection, k, p, event) {\n zoom.scaleTo(selection, function() {\n var k0 = this.__zoom.k,\n k1 = typeof k === \"function\" ? k.apply(this, arguments) : k;\n return k0 * k1;\n }, p, event);\n };\n\n zoom.scaleTo = function(selection, k, p, event) {\n zoom.transform(selection, function() {\n var e = extent.apply(this, arguments),\n t0 = this.__zoom,\n p0 = p == null ? centroid(e) : typeof p === \"function\" ? p.apply(this, arguments) : p,\n p1 = t0.invert(p0),\n k1 = typeof k === \"function\" ? k.apply(this, arguments) : k;\n return constrain(translate(scale(t0, k1), p0, p1), e, translateExtent);\n }, p, event);\n };\n\n zoom.translateBy = function(selection, x, y, event) {\n zoom.transform(selection, function() {\n return constrain(this.__zoom.translate(\n typeof x === \"function\" ? x.apply(this, arguments) : x,\n typeof y === \"function\" ? y.apply(this, arguments) : y\n ), extent.apply(this, arguments), translateExtent);\n }, null, event);\n };\n\n zoom.translateTo = function(selection, x, y, p, event) {\n zoom.transform(selection, function() {\n var e = extent.apply(this, arguments),\n t = this.__zoom,\n p0 = p == null ? centroid(e) : typeof p === \"function\" ? p.apply(this, arguments) : p;\n return constrain(identity.translate(p0[0], p0[1]).scale(t.k).translate(\n typeof x === \"function\" ? -x.apply(this, arguments) : -x,\n typeof y === \"function\" ? -y.apply(this, arguments) : -y\n ), e, translateExtent);\n }, p, event);\n };\n\n function scale(transform, k) {\n k = Math.max(scaleExtent[0], Math.min(scaleExtent[1], k));\n return k === transform.k ? transform : new Transform(k, transform.x, transform.y);\n }\n\n function translate(transform, p0, p1) {\n var x = p0[0] - p1[0] * transform.k, y = p0[1] - p1[1] * transform.k;\n return x === transform.x && y === transform.y ? transform : new Transform(transform.k, x, y);\n }\n\n function centroid(extent) {\n return [(+extent[0][0] + +extent[1][0]) / 2, (+extent[0][1] + +extent[1][1]) / 2];\n }\n\n function schedule(transition, transform, point, event) {\n transition\n .on(\"start.zoom\", function() { gesture(this, arguments).event(event).start(); })\n .on(\"interrupt.zoom end.zoom\", function() { gesture(this, arguments).event(event).end(); })\n .tween(\"zoom\", function() {\n var that = this,\n args = arguments,\n g = gesture(that, args).event(event),\n e = extent.apply(that, args),\n p = point == null ? centroid(e) : typeof point === \"function\" ? point.apply(that, args) : point,\n w = Math.max(e[1][0] - e[0][0], e[1][1] - e[0][1]),\n a = that.__zoom,\n b = typeof transform === \"function\" ? transform.apply(that, args) : transform,\n i = interpolate(a.invert(p).concat(w / a.k), b.invert(p).concat(w / b.k));\n return function(t) {\n if (t === 1) t = b; // Avoid rounding error on end.\n else { var l = i(t), k = w / l[2]; t = new Transform(k, p[0] - l[0] * k, p[1] - l[1] * k); }\n g.zoom(null, t);\n };\n });\n }\n\n function gesture(that, args, clean) {\n return (!clean && that.__zooming) || new Gesture(that, args);\n }\n\n function Gesture(that, args) {\n this.that = that;\n this.args = args;\n this.active = 0;\n this.sourceEvent = null;\n this.extent = extent.apply(that, args);\n this.taps = 0;\n }\n\n Gesture.prototype = {\n event: function(event) {\n if (event) this.sourceEvent = event;\n return this;\n },\n start: function() {\n if (++this.active === 1) {\n this.that.__zooming = this;\n this.emit(\"start\");\n }\n return this;\n },\n zoom: function(key, transform) {\n if (this.mouse && key !== \"mouse\") this.mouse[1] = transform.invert(this.mouse[0]);\n if (this.touch0 && key !== \"touch\") this.touch0[1] = transform.invert(this.touch0[0]);\n if (this.touch1 && key !== \"touch\") this.touch1[1] = transform.invert(this.touch1[0]);\n this.that.__zoom = transform;\n this.emit(\"zoom\");\n return this;\n },\n end: function() {\n if (--this.active === 0) {\n delete this.that.__zooming;\n this.emit(\"end\");\n }\n return this;\n },\n emit: function(type) {\n var d = select(this.that).datum();\n listeners.call(\n type,\n this.that,\n new ZoomEvent(type, {\n sourceEvent: this.sourceEvent,\n target: zoom,\n type,\n transform: this.that.__zoom,\n dispatch: listeners\n }),\n d\n );\n }\n };\n\n function wheeled(event, ...args) {\n if (!filter.apply(this, arguments)) return;\n var g = gesture(this, args).event(event),\n t = this.__zoom,\n k = Math.max(scaleExtent[0], Math.min(scaleExtent[1], t.k * Math.pow(2, wheelDelta.apply(this, arguments)))),\n p = pointer(event);\n\n // If the mouse is in the same location as before, reuse it.\n // If there were recent wheel events, reset the wheel idle timeout.\n if (g.wheel) {\n if (g.mouse[0][0] !== p[0] || g.mouse[0][1] !== p[1]) {\n g.mouse[1] = t.invert(g.mouse[0] = p);\n }\n clearTimeout(g.wheel);\n }\n\n // If this wheel event won’t trigger a transform change, ignore it.\n else if (t.k === k) return;\n\n // Otherwise, capture the mouse point and location at the start.\n else {\n g.mouse = [p, t.invert(p)];\n interrupt(this);\n g.start();\n }\n\n noevent(event);\n g.wheel = setTimeout(wheelidled, wheelDelay);\n g.zoom(\"mouse\", constrain(translate(scale(t, k), g.mouse[0], g.mouse[1]), g.extent, translateExtent));\n\n function wheelidled() {\n g.wheel = null;\n g.end();\n }\n }\n\n function mousedowned(event, ...args) {\n if (touchending || !filter.apply(this, arguments)) return;\n var currentTarget = event.currentTarget,\n g = gesture(this, args, true).event(event),\n v = select(event.view).on(\"mousemove.zoom\", mousemoved, true).on(\"mouseup.zoom\", mouseupped, true),\n p = pointer(event, currentTarget),\n x0 = event.clientX,\n y0 = event.clientY;\n\n dragDisable(event.view);\n nopropagation(event);\n g.mouse = [p, this.__zoom.invert(p)];\n interrupt(this);\n g.start();\n\n function mousemoved(event) {\n noevent(event);\n if (!g.moved) {\n var dx = event.clientX - x0, dy = event.clientY - y0;\n g.moved = dx * dx + dy * dy > clickDistance2;\n }\n g.event(event)\n .zoom(\"mouse\", constrain(translate(g.that.__zoom, g.mouse[0] = pointer(event, currentTarget), g.mouse[1]), g.extent, translateExtent));\n }\n\n function mouseupped(event) {\n v.on(\"mousemove.zoom mouseup.zoom\", null);\n dragEnable(event.view, g.moved);\n noevent(event);\n g.event(event).end();\n }\n }\n\n function dblclicked(event, ...args) {\n if (!filter.apply(this, arguments)) return;\n var t0 = this.__zoom,\n p0 = pointer(event.changedTouches ? event.changedTouches[0] : event, this),\n p1 = t0.invert(p0),\n k1 = t0.k * (event.shiftKey ? 0.5 : 2),\n t1 = constrain(translate(scale(t0, k1), p0, p1), extent.apply(this, args), translateExtent);\n\n noevent(event);\n if (duration > 0) select(this).transition().duration(duration).call(schedule, t1, p0, event);\n else select(this).call(zoom.transform, t1, p0, event);\n }\n\n function touchstarted(event, ...args) {\n if (!filter.apply(this, arguments)) return;\n var touches = event.touches,\n n = touches.length,\n g = gesture(this, args, event.changedTouches.length === n).event(event),\n started, i, t, p;\n\n nopropagation(event);\n for (i = 0; i < n; ++i) {\n t = touches[i], p = pointer(t, this);\n p = [p, this.__zoom.invert(p), t.identifier];\n if (!g.touch0) g.touch0 = p, started = true, g.taps = 1 + !!touchstarting;\n else if (!g.touch1 && g.touch0[2] !== p[2]) g.touch1 = p, g.taps = 0;\n }\n\n if (touchstarting) touchstarting = clearTimeout(touchstarting);\n\n if (started) {\n if (g.taps < 2) touchfirst = p[0], touchstarting = setTimeout(function() { touchstarting = null; }, touchDelay);\n interrupt(this);\n g.start();\n }\n }\n\n function touchmoved(event, ...args) {\n if (!this.__zooming) return;\n var g = gesture(this, args).event(event),\n touches = event.changedTouches,\n n = touches.length, i, t, p, l;\n\n noevent(event);\n for (i = 0; i < n; ++i) {\n t = touches[i], p = pointer(t, this);\n if (g.touch0 && g.touch0[2] === t.identifier) g.touch0[0] = p;\n else if (g.touch1 && g.touch1[2] === t.identifier) g.touch1[0] = p;\n }\n t = g.that.__zoom;\n if (g.touch1) {\n var p0 = g.touch0[0], l0 = g.touch0[1],\n p1 = g.touch1[0], l1 = g.touch1[1],\n dp = (dp = p1[0] - p0[0]) * dp + (dp = p1[1] - p0[1]) * dp,\n dl = (dl = l1[0] - l0[0]) * dl + (dl = l1[1] - l0[1]) * dl;\n t = scale(t, Math.sqrt(dp / dl));\n p = [(p0[0] + p1[0]) / 2, (p0[1] + p1[1]) / 2];\n l = [(l0[0] + l1[0]) / 2, (l0[1] + l1[1]) / 2];\n }\n else if (g.touch0) p = g.touch0[0], l = g.touch0[1];\n else return;\n\n g.zoom(\"touch\", constrain(translate(t, p, l), g.extent, translateExtent));\n }\n\n function touchended(event, ...args) {\n if (!this.__zooming) return;\n var g = gesture(this, args).event(event),\n touches = event.changedTouches,\n n = touches.length, i, t;\n\n nopropagation(event);\n if (touchending) clearTimeout(touchending);\n touchending = setTimeout(function() { touchending = null; }, touchDelay);\n for (i = 0; i < n; ++i) {\n t = touches[i];\n if (g.touch0 && g.touch0[2] === t.identifier) delete g.touch0;\n else if (g.touch1 && g.touch1[2] === t.identifier) delete g.touch1;\n }\n if (g.touch1 && !g.touch0) g.touch0 = g.touch1, delete g.touch1;\n if (g.touch0) g.touch0[1] = this.__zoom.invert(g.touch0[0]);\n else {\n g.end();\n // If this was a dbltap, reroute to the (optional) dblclick.zoom handler.\n if (g.taps === 2) {\n t = pointer(t, this);\n if (Math.hypot(touchfirst[0] - t[0], touchfirst[1] - t[1]) < tapDistance) {\n var p = select(this).on(\"dblclick.zoom\");\n if (p) p.apply(this, arguments);\n }\n }\n }\n }\n\n zoom.wheelDelta = function(_) {\n return arguments.length ? (wheelDelta = typeof _ === \"function\" ? _ : constant(+_), zoom) : wheelDelta;\n };\n\n zoom.filter = function(_) {\n return arguments.length ? (filter = typeof _ === \"function\" ? _ : constant(!!_), zoom) : filter;\n };\n\n zoom.touchable = function(_) {\n return arguments.length ? (touchable = typeof _ === \"function\" ? _ : constant(!!_), zoom) : touchable;\n };\n\n zoom.extent = function(_) {\n return arguments.length ? (extent = typeof _ === \"function\" ? _ : constant([[+_[0][0], +_[0][1]], [+_[1][0], +_[1][1]]]), zoom) : extent;\n };\n\n zoom.scaleExtent = function(_) {\n return arguments.length ? (scaleExtent[0] = +_[0], scaleExtent[1] = +_[1], zoom) : [scaleExtent[0], scaleExtent[1]];\n };\n\n zoom.translateExtent = function(_) {\n 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]]];\n };\n\n zoom.constrain = function(_) {\n return arguments.length ? (constrain = _, zoom) : constrain;\n };\n\n zoom.duration = function(_) {\n return arguments.length ? (duration = +_, zoom) : duration;\n };\n\n zoom.interpolate = function(_) {\n return arguments.length ? (interpolate = _, zoom) : interpolate;\n };\n\n zoom.on = function() {\n var value = listeners.on.apply(listeners, arguments);\n return value === listeners ? zoom : value;\n };\n\n zoom.clickDistance = function(_) {\n return arguments.length ? (clickDistance2 = (_ = +_) * _, zoom) : Math.sqrt(clickDistance2);\n };\n\n zoom.tapDistance = function(_) {\n return arguments.length ? (tapDistance = +_, zoom) : tapDistance;\n };\n\n return zoom;\n}\n","import { interpolateViridis } from \"d3\";\n\n// helper to choose a \"nice\" rounded scale bar length\nexport function niceNumber(n) {\n const exponent = Math.floor(Math.log10(n));\n const fraction = n / Math.pow(10, exponent);\n let niceFraction;\n if (fraction <= 1) niceFraction = 1;\n else if (fraction <= 2) niceFraction = 2;\n else if (fraction <= 5) niceFraction = 5;\n else niceFraction = 10;\n return niceFraction * Math.pow(10, exponent);\n}\n\nexport function triangleSideFromArea(area) {\n return Math.sqrt(2.309401 * area); // 2.309401 = 4 / sqrt(3)\n}\n\nexport function triangleAreaFromSide(side) {\n return 0.4330127 * side * side; // 0.4330127 == sqrt(3) / 4\n}\n\nexport function calculateTreeBounds(displayedRoot, isCircularLayout, getLabelWidth, getLabelXOffset, fontSizeForNode, collapsedRootLineLength = 0) {\n let minX = Infinity;\n let maxX = -Infinity;\n let minY = Infinity;\n let maxY = -Infinity;\n\n displayedRoot.each(d => {\n const labelWidth = getLabelWidth(d);\n const labelOffset = getLabelXOffset(d);\n const fontSize = fontSizeForNode(d);\n\n if (isCircularLayout) {\n // For circular layout, calculate the x/y extent of label ends\n const labelEndRadius = d.radius + labelOffset + labelWidth;\n const labelEndX = labelEndRadius * d.cos;\n const labelEndY = labelEndRadius * d.sin;\n\n // Consider label end position\n if (labelEndX < minX) minX = labelEndX;\n if (labelEndX > maxX) maxX = labelEndX;\n if (labelEndY < minY) minY = labelEndY;\n if (labelEndY > maxY) maxY = labelEndY;\n } else {\n // For rectangular layout\n // Consider collapsed root line (extends left)\n const leftExtent = d.x - (d.collapsedParent ? collapsedRootLineLength : 0);\n if (leftExtent < minX) minX = leftExtent;\n\n // Consider node position and right-pointing labels\n const rightExtent = d.x + labelOffset + labelWidth;\n if (rightExtent > maxX) maxX = rightExtent;\n\n // Consider vertical extent (y ± fontSize)\n const topExtent = d.y - fontSize;\n const bottomExtent = d.y + fontSize;\n if (topExtent < minY) minY = topExtent;\n if (bottomExtent > maxY) maxY = bottomExtent;\n }\n });\n\n return { minX, maxX, minY, maxY };\n}\n\nexport function createDashArray(repeatLen, width, nDash) {\n const totalUnits = (nDash * 2) - 1; // This works for the 3-dash case\n const summedDashLength = repeatLen - (nDash - 1) * width\n let sum = 0;\n for (let i = 1; i <= nDash; i++) {\n sum += i;\n }\n const smallestDashLength = summedDashLength / sum\n const pattern = [];\n for (let i = 0; i < totalUnits; i++) {\n if (i % 2 === 0) {\n pattern.push(smallestDashLength * (nDash - i / 2));\n } else {\n pattern.push(width);\n }\n }\n return pattern.join(',');\n}\n\nexport function columnToHeader(columnName, options = {}) {\n const {\n capitalizeFirstOnly = true,\n preserveAcronyms = true\n } = options;\n\n let result = columnName;\n result = result.replace(/[_]/g, ' ');\n\n if (preserveAcronyms) {\n result = result.replace(/([a-z])([A-Z])/g, '$1 $2');\n } else {\n result = result.replace(/([A-Z])/g, ' $1');\n }\n\n if (capitalizeFirstOnly) {\n result = result.charAt(0).toUpperCase() + result.slice(1).toLowerCase();\n } else {\n result = result.replace(/\\b\\w/g, char => char.toUpperCase());\n }\n\n return result.trim().replace(/\\s+/g, ' ');\n}\n\nexport function generateNiceTicks(min, max, targetCount = 5) {\n const range = max - min;\n\n if (range === 0) {\n return [min];\n }\n\n // Calculate rough step size\n const roughStep = range / (targetCount - 1);\n\n // Find the magnitude (power of 10)\n const magnitude = Math.pow(10, Math.floor(Math.log10(roughStep)));\n\n // Normalize the step to be between 1 and 10\n const normalizedStep = roughStep / magnitude;\n\n // Choose a nice step size (1, 2, 5, or 10)\n let niceStep;\n if (normalizedStep <= 1) {\n niceStep = 1;\n } else if (normalizedStep <= 2) {\n niceStep = 2;\n } else if (normalizedStep <= 5) {\n niceStep = 5;\n } else {\n niceStep = 10;\n }\n\n // Scale back to original magnitude\n const step = niceStep * magnitude;\n\n // Find the first tick (round down to nearest step)\n const firstTick = Math.floor(min / step) * step;\n\n // Generate ticks\n const ticks = [];\n let tick = firstTick;\n\n // Include ticks from before min to after max\n while (tick <= max + step * 0.001) { // small epsilon for floating point\n if (tick >= min - step * 0.001) {\n ticks.push(tick);\n }\n tick += step;\n }\n\n // Ensure we have at least min and max\n if (ticks.length === 0 || ticks[0] > min) {\n ticks.unshift(min);\n }\n if (ticks[ticks.length - 1] < max) {\n ticks.push(max);\n }\n\n return ticks;\n}\n\nexport function formatTickLabel(value, allTicks) {\n // Determine appropriate precision based on the range and step size\n const range = Math.max(...allTicks) - Math.min(...allTicks);\n const step = allTicks.length > 1 ? Math.abs(allTicks[1] - allTicks[0]) : range;\n\n if (range === 0) {\n return value.toPrecision(3);\n }\n\n // Calculate how many significant figures we need\n const magnitude = Math.floor(Math.log10(Math.abs(step)));\n\n if (magnitude >= 0) {\n // For large numbers, use no decimal places\n return Math.round(value).toString();\n } else {\n // For small numbers, use appropriate decimal places\n const decimals = Math.min(3, -magnitude);\n return value.toFixed(decimals);\n }\n}\n\nexport function interpolateViridisSubset(t, start = 0.1, end = 0.9) {\n return interpolateViridis(start + t * (end - start));\n}\n\n/**\n * Base class for objects that support pub/sub pattern\n */\nexport class Subscribable {\n constructor() {\n this.subscribers = new Map();\n }\n\n subscribe(event, callback) {\n if (!this.subscribers.has(event)) {\n this.subscribers.set(event, new Set());\n }\n this.subscribers.get(event).add(callback);\n\n return () => this.unsubscribe(event, callback);\n }\n\n unsubscribe(event, callback) {\n if (this.subscribers.has(event)) {\n this.subscribers.get(event).delete(callback);\n }\n }\n\n notify(event, data) {\n if (this.subscribers.has(event)) {\n this.subscribers.get(event).forEach(callback => {\n callback(data);\n });\n }\n }\n}\n","import {\n scaleLinear, scaleOrdinal\n} from \"d3\";\nimport { interpolateViridisSubset } from \"./utils.js\"\n\n/**\n * Parse a Newick formatted string.\n * @param {string} newickStr - The Newick formatted string.\n * @returns {object} Parsed tree object.\n */\nexport function parseNewick(newickStr) {\n newickStr = newickStr.trim();\n if (newickStr[newickStr.length - 1] === ';') {\n newickStr = newickStr.slice(0, -1);\n }\n let index = 0;\n\n function parseTree() {\n let node = {};\n if (newickStr[index] === '(') {\n index++; // skip '('\n node.children = [];\n while (true) {\n let child = parseTree();\n node.children.push(child);\n if (newickStr[index] === ',') {\n index++;\n } else if (newickStr[index] === ')') {\n index++;\n break;\n } else {\n break;\n }\n }\n }\n let label = '';\n while (index < newickStr.length && newickStr[index] !== ',' && newickStr[index] !== ')') {\n label += newickStr[index++];\n }\n label = label.trim();\n if (label) {\n let parts = label.split(\":\");\n node.name = parts[0] || \"\";\n if (parts.length > 1) {\n node.length = parseFloat(parts[1]);\n }\n }\n return node;\n }\n\n const result = parseTree();\n if (index !== newickStr.length) {\n throw new Error(`Unexpected character at position ${index}: '${newickStr[index]}'`);\n }\n return result;\n}\n\n\nexport function parseTable(tsvStr, sep = '\\t') {\n\n let metadataMap = new Map();\n let metadataColumns = [];\n let columnTypes = new Map(); // Track whether each column is continuous or categorical\n\n const lines = tsvStr.trim().split('\\n');\n if (lines.length == 0) {\n console.error('Empty metatdata table');\n } else {\n const headers = lines[0].split(sep);\n const nodeIdIndex = headers.indexOf('node_id');\n\n if (nodeIdIndex === -1) {\n console.warn('Metadata table must contain a \"node_id\" column');\n } else {\n // Get column names (excluding node_id)\n metadataColumns = headers.filter((h, i) => i !== nodeIdIndex);\n\n // Initialize column type detection\n const columnValues = new Map();\n metadataColumns.forEach(col => columnValues.set(col, []));\n\n // Parse metadata rows\n for (let i = 1; i < lines.length; i++) {\n const values = lines[i].split(sep);\n const nodeId = values[nodeIdIndex];\n const metadata = {};\n\n for (let j = 0; j < headers.length; j++) {\n if (j !== nodeIdIndex) {\n const colName = headers[j];\n const value = values[j];\n metadata[colName] = value;\n columnValues.get(colName).push(value);\n }\n }\n\n metadataMap.set(nodeId, metadata);\n }\n\n // Determine column types (continuous vs categorical)\n metadataColumns.forEach(col => {\n const values = columnValues.get(col);\n const numericValues = values.map(v => parseFloat(v)).filter(v => !isNaN(v));\n\n // If all non-empty values can be converted to numbers, treat as continuous\n const isContinuous = numericValues.length > 0 &&\n numericValues.length === values.filter(v => v !== '').length;\n\n columnTypes.set(col, isContinuous ? 'continuous' : 'categorical');\n });\n }\n }\n\n return {\n metadataMap: metadataMap,\n columnTypes: columnTypes\n }\n}\n\n\nexport function parseMetadata(tsvStr, sep = '\\t') {\n const { metadataMap, columnTypes } = parseTable(tsvStr, sep);\n let colorScales = new Map();\n\n for (const [columnName, columnType] of columnTypes.entries()) {\n\n const values = [];\n\n // Collect all values for this column\n metadataMap.forEach(metadata => {\n if (metadata[columnName] !== undefined && metadata[columnName] !== '') {\n values.push(metadata[columnName]);\n }\n });\n\n if (columnType === 'continuous') {\n // Continuous scale using viridis\n const numericValues = values.map(v => parseFloat(v));\n const minVal = Math.min(...numericValues);\n const maxVal = Math.max(...numericValues);\n\n // Usage with scale\n colorScales.set(columnName, scaleLinear()\n .domain([minVal, maxVal])\n .range([0, 1])\n .interpolate(() => (t) => interpolateViridisSubset(t)));\n } else {\n // Categorical scale using colors sampled from viridis\n const uniqueValues = [...new Set(values)];\n const numCategories = uniqueValues.length;\n\n // Sample colors evenly from viridis palette\n const colors = [];\n for (let i = 0; i < numCategories; i++) {\n const t = i / Math.max(1, numCategories - 1);\n colors.push(interpolateViridisSubset(t));\n }\n\n colorScales.set(columnName, scaleOrdinal()\n .domain(uniqueValues)\n .range(colors));\n }\n }\n\n return {\n metadataMap: metadataMap,\n columnTypes: columnTypes,\n colorScales: colorScales\n }\n}\n\n\n\n","import { max } from \"d3\";\n\n/**\n * Placeholder scale for contant output when a mapping variable is not used\n */\nexport class NullScale {\n defaultValue;\n constructor(defaultValue) {\n if (defaultValue === undefined) {\n console.error('A defualt value for a NullScale is needed.');\n } else {\n this.defaultValue = defaultValue;\n }\n }\n\n getValue() {\n return this.defaultValue;\n }\n}\n\n/**\n * Identity scale that passes through filtered text values\n * Can optionally apply a custom transformation function and validate against a list of valid values\n */\nexport class IdentityScale {\n constructor(defaultValue = null, validValues = null, transformFn = null) {\n this.validValues = validValues ? new Set(validValues) : null;\n this.transformFn = transformFn;\n this.defaultValue = defaultValue;\n }\n\n /**\n * Get the value, optionally transformed and validated\n * @param {*} value - The input value\n * @returns {*} The output value, or null if invalid\n */\n getValue(value) {\n // Apply transformation if provided\n let result = this.transformFn ? this.transformFn(value) : value;\n\n // Validate against valid values if provided\n if (this.validValues !== null && !this.validValues.has(result)) {\n result = null;\n }\n\n // Handle null/undefined/empty values\n if (result === null || result === undefined || result === '') {\n result = this.defaultValue;\n }\n\n return result;\n }\n}\n\n/**\n * Scale for mapping categorical data to text outputs\n */\nexport class CategoricalTextScale {\n constructor(values, outputCategories, defaultValue) {\n if (!Array.isArray(values) || values.length === 0) {\n throw new Error('values must be a non-empty array');\n }\n\n this.outputCategories = outputCategories;\n this.defaultValue = defaultValue;\n\n // Sort categories by frequency (descending)\n const frequencyMap = new Map();\n for (const category of values) {\n if (category === null || category === undefined || category === '') {\n continue;\n }\n if (frequencyMap.has(category)) {\n frequencyMap.set(category, frequencyMap.get(category) + 1);\n } else {\n frequencyMap.set(category, 1);\n }\n }\n const sortedCategories = new Map(\n [...frequencyMap.entries()].sort((a, b) => a[0] - b[0])\n );\n\n if (sortedCategories.length > outputCategories.length) {\n this.otheredCategories = sortedCategories.keys().slice(outputCategories.length - 2, sortedCategories.length);\n } else {\n this.otheredCategories = [];\n }\n\n // Map input categories to output categories\n this.categoryMap = new Map();\n const sortedCategoriesKeys = [...sortedCategories.keys()];\n for (let i = 0; i < sortedCategoriesKeys.length; i++) {\n if (i < outputCategories.length) {\n this.categoryMap.set(sortedCategoriesKeys[i], outputCategories[i]);\n } else {\n this.categoryMap.set(sortedCategoriesKeys[i], outputCategories[outputCategories.length - 1]);\n }\n }\n }\n\n /**\n * Get the text corresponding to the given category\n * @param {*} category - The category value to map\n * @returns {string} The corresponding text category\n */\n getValue(category) {\n // Handle null/undefined/empty values\n if (category === null || category === undefined || category === '') {\n return this.defaultValue;\n }\n return this.categoryMap.get(category);\n }\n}\n\n/**\n * Scale for mapping continuous numeric values to sizes\n */\nexport class ContinuousSizeScale {\n constructor(dataMin, dataMax, sizeMin, sizeMax) {\n this.dataMin = dataMin;\n this.dataMax = dataMax;\n this.sizeMin = sizeMin;\n this.sizeMax = sizeMax;\n }\n\n /**\n * Get the size corresponding to the given value\n * @param {number} value - The data value to map\n * @returns {number} The corresponding size, clamped to min/max\n */\n getValue(value) {\n // Clamp value to data range\n const clampedValue = Math.max(this.dataMin, Math.min(this.dataMax, value));\n\n // Handle edge case where dataMin === dataMax\n if (this.dataMin === this.dataMax) {\n if (value === this.dataMax) {\n return (this.sizeMin + this.sizeMax) / 2;\n } else if (value < this.dataMin) {\n return this.sizeMin\n } else {\n return this.sizeMax;\n }\n }\n\n // Linear interpolation\n const t = (clampedValue - this.dataMin) / (this.dataMax - this.dataMin);\n return this.sizeMin + t * (this.sizeMax - this.sizeMin);\n }\n}\n\n/**\n * Scale for mapping continuous numeric values to colors\n */\nexport class ContinuousColorScale {\n constructor(dataMin, dataMax, transformMin = 0, transformMax = 1, colors = null, colorPositions = null) {\n this.dataMin = dataMin;\n this.dataMax = dataMax;\n this.transformMin = transformMin;\n this.transformMax = transformMax;\n this.nullColor = \"#808080\"; // Default grey for null/empty values\n\n // Default to viridis-like color scheme if not provided\n if (colors === null) {\n this.colors = ['#440154', '#31688e', '#35b779', '#fde724'].map(c => this._hexToRgb(c));\n } else {\n if (colors.length < 1) {\n throw new Error('At least 1 color is required');\n }\n this.colors = colors.map(c => this._hexToRgb(c));\n }\n\n // Handle single color case\n if (this.colors.length === 1) {\n this.colorPositions = [0];\n return;\n }\n\n // Default to equally spaced positions if not provided\n if (colorPositions === null) {\n this.colorPositions = this.colors.map((_, i) => i / (this.colors.length - 1));\n } else {\n if (colorPositions.length !== this.colors.length) {\n throw new Error('colorPositions must have the same length as colors');\n }\n\n // Sort colorPositions and reorder colors to match\n const paired = colorPositions.map((pos, i) => ({ pos, color: this.colors[i] }));\n paired.sort((a, b) => a.pos - b.pos);\n\n this.colorPositions = paired.map(p => p.pos);\n this.colors = paired.map(p => p.color);\n\n // Normalize positions to [0, 1] range\n const minPos = this.colorPositions[0];\n const maxPos = this.colorPositions[this.colorPositions.length - 1];\n\n if (minPos === maxPos) {\n // All positions are the same, normalize to 0\n this.colorPositions = this.colorPositions.map(() => 0);\n } else {\n this.colorPositions = this.colorPositions.map(pos => (pos - minPos) / (maxPos - minPos));\n }\n }\n }\n\n /**\n * Get the color corresponding to the given value\n * @param {number} value - The data value to map\n * @returns {string} The corresponding color as a hex string\n */\n getValue(value) {\n // Handle null/undefined/empty values\n if (value === null || value === undefined || value === '') {\n return this.nullColor;\n }\n\n // Handle single color case\n if (this.colors.length === 1) {\n return this._rgbToHex(this.colors[0].r, this.colors[0].g, this.colors[0].b);\n }\n\n // Handle edge case where dataMin === dataMax\n if (this.dataMin === this.dataMax) {\n if (value < this.dataMin) {\n return this._rgbToHex(this.colors[0].r, this.colors[0].g, this.colors[0].b);\n } else if (value > this.dataMax) {\n const lastColor = this.colors[this.colors.length - 1];\n return this._rgbToHex(lastColor.r, lastColor.g, lastColor.b);\n } else {\n // value === dataMin === dataMax, return middle color\n const midIdx = Math.floor(this.colors.length / 2);\n const midColor = this.colors[midIdx];\n return this._rgbToHex(midColor.r, midColor.g, midColor.b);\n }\n }\n\n // Clamp value to data range\n const clampedValue = Math.max(this.dataMin, Math.min(this.dataMax, value));\n\n // Map to [0, 1] range\n const dataT = (clampedValue - this.dataMin) / (this.dataMax - this.dataMin);\n\n // Transform to [transformMin, transformMax] range\n const transformedT = this.transformMin + dataT * (this.transformMax - this.transformMin);\n\n // Clamp to [0, 1] and handle values outside colorPositions range\n const clampedT = Math.max(0, Math.min(1, transformedT));\n\n // If transformedT is below the first position, return first color\n if (clampedT <= this.colorPositions[0]) {\n return this._rgbToHex(this.colors[0].r, this.colors[0].g, this.colors[0].b);\n }\n\n // If transformedT is above the last position, return last color\n if (clampedT >= this.colorPositions[this.colorPositions.length - 1]) {\n const lastColor = this.colors[this.colors.length - 1];\n return this._rgbToHex(lastColor.r, lastColor.g, lastColor.b);\n }\n\n // Find the two colors to interpolate between\n let lowerIdx = 0;\n for (let i = 0; i < this.colorPositions.length - 1; i++) {\n if (clampedT >= this.colorPositions[i]) {\n lowerIdx = i;\n }\n }\n\n const upperIdx = Math.min(lowerIdx + 1, this.colors.length - 1);\n\n // Handle edge case where we're exactly at a color position\n if (clampedT === this.colorPositions[lowerIdx]) {\n const color = this.colors[lowerIdx];\n return this._rgbToHex(color.r, color.g, color.b);\n }\n if (clampedT === this.colorPositions[upperIdx]) {\n const color = this.colors[upperIdx];\n return this._rgbToHex(color.r, color.g, color.b);\n }\n\n // Interpolate between the two colors\n const segmentT = (clampedT - this.colorPositions[lowerIdx]) /\n (this.colorPositions[upperIdx] - this.colorPositions[lowerIdx]);\n\n return this._interpolateColor(this.colors[lowerIdx], this.colors[upperIdx], segmentT);\n }\n\n /**\n * Interpolate between two RGB colors\n * @private\n */\n _interpolateColor(color1, color2, t) {\n const r = Math.round(color1.r + (color2.r - color1.r) * t);\n const g = Math.round(color1.g + (color2.g - color1.g) * t);\n const b = Math.round(color1.b + (color2.b - color1.b) * t);\n\n return this._rgbToHex(r, g, b);\n }\n\n /**\n * Convert hex color to RGB\n * @private\n */\n _hexToRgb(hex) {\n const result = /^#?([a-f\\d]{2})([a-f\\d]{2})([a-f\\d]{2})$/i.exec(hex);\n return result ? {\n r: parseInt(result[1], 16),\n g: parseInt(result[2], 16),\n b: parseInt(result[3], 16)\n } : null;\n }\n\n /**\n * Convert RGB to hex color\n * @private\n */\n _rgbToHex(r, g, b) {\n return '#' + [r, g, b].map(x => {\n const hex = x.toString(16);\n return hex.length === 1 ? '0' + hex : hex;\n }).join('');\n }\n}\n\n/**\n * Scale for mapping categorical values to colors\n */\nexport class CategoricalColorScale {\n\n defaultPalette = ['#440154', '#31688e', '#35b779', '#fde724'];\n\n constructor(categoryData, transformMin = 0, transformMax = 1, colors = null, colorPositions = null, maxColors = 10) {\n if (!Array.isArray(categoryData) || categoryData.length === 0) {\n throw new Error('categoryData must be a non-empty array');\n }\n\n this.transformMin = transformMin;\n this.transformMax = transformMax;\n this.nullColor = \"#808080\"; // Default grey for null/empty values\n this.maxColors = maxColors;\n\n // Calculate unique categories and their frequencies\n this.frequencyMap = new Map();\n for (const category of categoryData) {\n if (this.frequencyMap.has(category)) {\n this.frequencyMap.set(category, this.frequencyMap.get(category) + 1);\n } else {\n this.frequencyMap.set(category, 1);\n }\n }\n\n // Store categories in order of descending frequency\n this.categories = [...this.frequencyMap.entries()]\n .sort((a, b) => b[1] - a[1])\n .map(entry => entry[0]);\n\n // Default to viridis-like color scheme if not provided\n if (colors === null) {\n this.colors = this.defaultPalette.map(c => this._hexToRgb(c));\n } else {\n if (colors.length < 1) {\n throw new Error('At least 1 color is required');\n }\n this.colors = colors.map(c => this._hexToRgb(c));\n }\n\n // Handle single color case\n if (this.colors.length === 1) {\n this.colorPositions = [0];\n this._assignColors();\n return;\n }\n\n // Default to equally spaced positions if not provided\n if (colorPositions === null) {\n this.colorPositions = this.colors.map((_, i) => i / (this.colors.length - 1));\n } else {\n if (colorPositions.length !== this.colors.length) {\n throw new Error('colorPositions must have the same length as colors');\n }\n\n // Sort colorPositions and reorder colors to match\n const paired = colorPositions.map((pos, i) => ({ pos, color: this.colors[i] }));\n paired.sort((a, b) => a.pos - b.pos);\n\n this.colorPositions = paired.map(p => p.pos);\n this.colors = paired.map(p => p.color);\n\n // Normalize positions to [0, 1] range\n const minPos = this.colorPositions[0];\n const maxPos = this.colorPositions[this.colorPositions.length - 1];\n\n if (minPos === maxPos) {\n // All positions are the same, normalize to 0\n this.colorPositions = this.colorPositions.map(() => 0);\n } else {\n this.colorPositions = this.colorPositions.map(pos => (pos - minPos) / (maxPos - minPos));\n }\n }\n\n // Assign colors to categories\n this._assignColors();\n }\n\n /**\n * Assign colors to categories based on frequency\n * @private\n */\n _assignColors() {\n this.categoryColorMap = new Map();\n\n // Handle single color case\n if (this.colors.length === 1) {\n const hexColor = this._rgbToHex(this.colors[0].r, this.colors[0].g, this.colors[0].b);\n for (const category of this.categories) {\n this.categoryColorMap.set(category, hexColor);\n }\n return;\n }\n\n if (this.categories.length === 1) {\n // Single category gets the first color\n const color = this._getColorAtPosition(this.transformMin);\n this.categoryColorMap.set(this.categories[0], color);\n } else {\n const nCategories = this.categories.length > this.maxColors ? this.maxColors : this.categories.length;\n\n // Multiple categories spread across the transform range\n for (let i = 0; i < this.categories.length; i++) {\n const t = i >= nCategories ? 1 : i / (nCategories - 1);\n const transformedT = this.transformMin + t * (this.transformMax - this.transformMin);\n const color = this._getColorAtPosition(transformedT);\n this.categoryColorMap.set(this.categories[i], color);\n }\n }\n }\n\n /**\n * Get color at a specific position in the color scale\n * @private\n */\n _getColorAtPosition(t) {\n // Clamp t to [0, 1]\n t = Math.max(0, Math.min(1, t));\n\n // Handle single color case\n if (this.colors.length === 1) {\n return this._rgbToHex(this.colors[0].r, this.colors[0].g, this.colors[0].b);\n }\n\n // If t is below the first position, return first color\n if (t <= this.colorPositions[0]) {\n return this._rgbToHex(this.colors[0].r, this.colors[0].g, this.colors[0].b);\n }\n\n // If t is above the last position, return last color\n if (t >= this.colorPositions[this.colorPositions.length - 1]) {\n const lastColor = this.colors[this.colors.length - 1];\n return this._rgbToHex(lastColor.r, lastColor.g, lastColor.b);\n }\n\n // Find the two colors to interpolate between\n let lowerIdx = 0;\n for (let i = 0; i < this.colorPositions.length - 1; i++) {\n if (t >= this.colorPositions[i]) {\n lowerIdx = i;\n }\n }\n\n const upperIdx = Math.min(lowerIdx + 1, this.colors.length - 1);\n\n // Handle edge cases\n if (t === this.colorPositions[lowerIdx]) {\n const color = this.colors[lowerIdx];\n return this._rgbToHex(color.r, color.g, color.b);\n }\n if (t === this.colorPositions[upperIdx]) {\n const color = this.colors[upperIdx];\n return this._rgbToHex(color.r, color.g, color.b);\n }\n\n // Interpolate between the two colors\n const segmentT = (t - this.colorPositions[lowerIdx]) /\n (this.colorPositions[upperIdx] - this.colorPositions[lowerIdx]);\n\n return this._interpolateColor(this.colors[lowerIdx], this.colors[upperIdx], segmentT);\n }\n\n /**\n * Get the color corresponding to the given category\n * @param {*} category - The category value to map\n * @returns {string} The corresponding color as a hex string\n */\n getValue(category) {\n // Handle null/undefined/empty values\n if (category === null || category === undefined || category === '') {\n return this.nullColor;\n }\n\n if (this.categoryColorMap.has(category)) {\n return this.categoryColorMap.get(category);\n }\n\n // Error for unknown categories\n throw new Error(`Unknown category: ${category}`);\n }\n\n /**\n * Interpolate between two RGB colors\n * @private\n */\n _interpolateColor(color1, color2, t) {\n const r = Math.round(color1.r + (color2.r - color1.r) * t);\n const g = Math.round(color1.g + (color2.g - color1.g) * t);\n const b = Math.round(color1.b + (color2.b - color1.b) * t);\n\n return this._rgbToHex(r, g, b);\n }\n\n /**\n * Convert hex color to RGB\n * @private\n */\n _hexToRgb(hex) {\n const result = /^#?([a-f\\d]{2})([a-f\\d]{2})([a-f\\d]{2})$/i.exec(hex);\n return result ? {\n r: parseInt(result[1], 16),\n g: parseInt(result[2], 16),\n b: parseInt(result[3], 16)\n } : null;\n }\n\n /**\n * Convert RGB to hex color\n * @private\n */\n _rgbToHex(r, g, b) {\n return '#' + [r, g, b].map(x => {\n const hex = x.toString(16);\n return hex.length === 1 ? '0' + hex : hex;\n }).join('');\n }\n}\n","import {\n NullScale,\n IdentityScale,\n CategoricalTextScale,\n ContinuousSizeScale,\n ContinuousColorScale,\n CategoricalColorScale\n} from \"./scales.js\";\n\n/**\n * Manages the configuration and scale for a single aesthetic mapping\n * (e.g., tip label color mapped to a metadata column)\n */\nexport class Aesthetic {\n state; // Object containing all configuration used to infer the scale\n scale; // the actual scale instance\n\n constructor(values, options = {}) {\n // Required options\n if (!options.scaleType) {\n throw new Error('scaleType is required');\n }\n if (options.default === undefined) {\n throw new Error('default is required');\n }\n\n // Initialize state with all configuration variables\n this.state = {\n scaleType: undefined,\n default: undefined,\n isCategorical: undefined,\n outputValues: null,\n outputRegex: null,\n colorPalette: null,\n outputRange: null,\n inputUnits: null,\n title: null,\n maxCategories: 7,\n otherCategory: \"#888888\",\n otherLabel: \"Other\",\n transformMin: 0,\n transformMax: 1,\n transformFn: null,\n colorPositions: null,\n ...options\n };\n\n // Initialize the scale\n this.updateScale(values);\n }\n\n /**\n * Set the scale instance for this aesthetic\n * @param {object} scale - The scale instance\n */\n setScale(scale) {\n this.scale = scale;\n }\n\n /**\n * Get the output value for a given input value\n * Wraps the scale's getValue() function\n * @param {*} value - The input value\n * @returns {*} The output value\n */\n getValue(value) {\n return this.scale.getValue(value);\n }\n\n /**\n * Update the scale based on current state\n * Uses the stored state to create an appropriate scale\n */\n updateScale(values) {\n const { scaleType, isCategorical } = this.state;\n let scale;\n\n // Handle null scale\n if (scaleType === 'null') {\n scale = new NullScale(this.state.default);\n this.setScale(scale);\n return;\n }\n\n // Handle identity scales and data already in the output format\n let isAlreadyOutputFormat = true;\n if (isCategorical && (this.state.outputValues || this.state.outputRegex)) {\n if (this.state.outputValues) {\n for (let i = 0; i < values.length; i++) {\n if (values[i] && !this.state.outputValues.includes(values[i])) {\n isAlreadyOutputFormat = false;\n break;\n }\n }\n }\n if (this.state.outputRegex) {\n for (let i = 0; i < values.length; i++) {\n if (values[i] && !this.state.outputRegex.test(values[i])) {\n isAlreadyOutputFormat = false;\n break;\n }\n }\n }\n } else {\n isAlreadyOutputFormat = false;\n }\n if (scaleType === 'identity' || isAlreadyOutputFormat) {\n scale = new IdentityScale(\n this.state.default,\n this.state.outputValues,\n this.state.transformFn\n );\n this.setScale(scale);\n return;\n }\n\n // Handle text scales (only for categorical data)\n if (scaleType === 'text') {\n if (!isCategorical) {\n throw new Error('Text scales can only be used with categorical data');\n }\n scale = new CategoricalTextScale(values, this.state.outputValues, this.state.default);\n this.setScale(scale);\n return;\n }\n\n // Handle size scales (only for continuous data)\n if (scaleType === 'size') {\n if (isCategorical) {\n throw new Error('Size scales can only be used with continuous data');\n }\n\n const numericValues = values.map(v => Number(v)).filter(v => !isNaN(v));\n if (numericValues.length === 0) {\n console.warn('No numeric values found for size scale, using NullScale');\n scale = new NullScale(this.state.default);\n } else {\n const min = Math.min(...numericValues);\n const max = Math.max(...numericValues);\n const range = this.state.outputRange || [0.5, 2];\n scale = new ContinuousSizeScale(min, max, range[0], range[1]);\n }\n this.setScale(scale);\n return;\n }\n\n // Handle color scales\n if (scaleType === 'color') {\n if (isCategorical) {\n scale = new CategoricalColorScale(\n values,\n this.state.transformMin,\n this.state.transformMax,\n this.state.colorPalette,\n this.state.colorPositions,\n this.state.maxCategories\n );\n } else {\n const numericValues = values.map(v => Number(v)).filter(v => !isNaN(v));\n if (numericValues.length === 0) {\n console.warn('No numeric values found for color scale, using NullScale');\n scale = new NullScale(this.state.default);\n } else {\n const min = Math.min(...numericValues);\n const max = Math.max(...numericValues);\n scale = new ContinuousColorScale(\n min,\n max,\n this.state.transformMin,\n this.state.transformMax,\n this.state.colorPalette,\n this.state.colorPositions\n );\n }\n }\n this.setScale(scale);\n return;\n }\n\n throw new Error(`Unknown scale type: ${scaleType}`);\n }\n}\n","import { hierarchy, ascending } from \"d3\";\nimport { parseNewick, parseTable } from \"./parsers.js\";\nimport { Subscribable, columnToHeader } from \"./utils.js\";\nimport { Aesthetic } from \"./aesthetic.js\";\n\n/**\n * Manages tree data and metadata tables\n * Handles parsing, storage, and attachment of metadata to tree nodes\n */\nexport class TreeData extends Subscribable {\n\n tree;\n metadata = new Map();\n metadataTableNames = new Map(); // Map of table ID to display name\n columnType = new Map(); // e.g. 'continuous' or 'categorical', keyed by unique column ID\n columnName = new Map(); // Original column name, keyed by unique column ID\n columnDisplayName = new Map(); // Display-friendly column name, keyed by unique column ID\n columnAesthetic = new Map(); // Map of columnId -> Map of aestheticId -> Aesthetic\n #nextTableId = 0;\n\n constructor(newickStr, metadataTables = [], metadataTableNames = []) {\n super();\n\n this.tree = this.parseTree(newickStr);\n\n if (Array.isArray(metadataTables)) {\n metadataTables.forEach((tableStr, index) => {\n const tableName = metadataTableNames[index] || `Metadata ${index + 1}`;\n this.addTable(tableStr, tableName);\n });\n }\n }\n\n /**\n * Parse a Newick string and create a hierarchy\n * @param {string} newickStr - Newick formatted string\n * @returns {object} D3 hierarchy object\n */\n parseTree(newickStr) {\n const treeData = parseNewick(newickStr);\n\n // Create a D3 hierarchy from the tree data and sort by size of subtree and branch length\n const root = hierarchy(treeData, d => d.children)\n .sum(d => d.children ? 0 : 1)\n .each(function(d) {\n d.leafCount = d.value;\n delete d.value;\n delete d.data.children;\n })\n .sort((a, b) => (a.leafCount - b.leafCount) || ascending(a.data.length, b.data.length));\n\n // Assign a stable, unique id to every node so D3 can track elements across updates\n let nodeId = 0;\n root.each(d => { d.id = ++nodeId; });\n\n return root;\n }\n\n /**\n * Parse and set the tree data\n * @param {string} newickStr - Newick formatted string or path\n */\n setTree(newickStr) {\n this.tree = this.parseTree(newickStr);\n this.metadata.keys().forEach(this.#attachTable);\n this.notify('treeUpdated', this);\n }\n\n /**\n * Get metadata table names\n * @returns {Array<string>} Array of metadata table names\n */\n getMetadataTableNames() {\n return Array.from(this.metadataTableNames.values());\n }\n\n /**\n * Add a metadata table\n * @param {string} tableStr - TSV formatted string or path\n * @param {string} tableName - Display name for the table\n * @param {string} sep - Column separator (default: '\\t')\n * @returns {string} The table ID\n */\n addTable(tableStr, tableName = null, sep = '\\t') {\n // Parse table string\n const { metadataMap, columnTypes } = parseTable(tableStr, sep);\n\n // Generate unique column IDs for this table\n const id = `table_${this.#nextTableId++}`;\n\n // Set table name\n if (!tableName) {\n tableName = `Metadata ${this.#nextTableId}`;\n }\n this.metadataTableNames.set(id, tableName);\n\n const columnIdMap = new Map();\n for (const [originalName, columnType] of columnTypes) {\n const uniqueId = `${id}_${originalName}`;\n columnIdMap.set(originalName, uniqueId);\n this.columnType.set(uniqueId, columnType);\n this.columnName.set(uniqueId, originalName);\n this.columnDisplayName.set(uniqueId, columnToHeader(originalName));\n }\n\n // Transform metadata to use unique column IDs\n const transformedMetadata = new Map();\n for (const [nodeName, nodeData] of metadataMap) {\n const transformedNodeData = {};\n for (const [originalColumnName, value] of Object.entries(nodeData)) {\n const uniqueId = columnIdMap.get(originalColumnName);\n if (uniqueId) {\n transformedNodeData[uniqueId] = value;\n }\n }\n transformedMetadata.set(nodeName, transformedNodeData);\n }\n\n this.metadata.set(id, transformedMetadata);\n this.#attachTable(id);\n this.notify('metadataAdded', {\n tableId: id,\n columnIds: columnIdMap.values()\n });\n\n return id;\n }\n\n /**\n * Remove a metadata table\n * @param {string} tableId - ID of the table to remove\n */\n deleteTable(tableId) {\n const table = this.metadata.get(tableId);\n if (!table) {\n console.warn(`Table ${tableId} does not exist`);\n return;\n }\n const keys = Object.keys(table.values().next().value);\n\n // Remove data associated with columns in the table\n for (const uniqueId of keys) {\n this.columnType.delete(uniqueId);\n this.columnName.delete(uniqueId);\n this.columnDisplayName.delete(uniqueId);\n this.columnAesthetic.delete(uniqueId);\n }\n\n this.#detachTable(tableId);\n this.metadata.delete(tableId);\n this.metadataTableNames.delete(tableId);\n this.notify('metadataRemoved', {\n tableId,\n columnIds: keys\n });\n }\n\n /**\n * Get the aesthetic for a column and aesthetic ID combination, creating it if needed\n * @param {string} columnId - The unique column ID\n * @param {string} aestheticId - The aesthetic ID (user-defined)\n * @param {object} defaultState - Default state to initialize the Aesthetic if it doesn't exist\n * @returns {Aesthetic} The aesthetic instance\n */\n getAesthetic(columnId, aestheticId, defaultState = {}) {\n // Ensure the column has an aesthetic map\n if (!this.columnAesthetic.has(columnId)) {\n this.columnAesthetic.set(columnId, new Map());\n }\n\n const aestheticMap = this.columnAesthetic.get(columnId);\n\n // Return existing aesthetic if available\n if (aestheticMap.has(aestheticId)) {\n return aestheticMap.get(aestheticId);\n }\n\n // Create new aesthetic based on column type and default state\n const aesthetic = this.#createAesthetic(columnId, defaultState);\n aestheticMap.set(aestheticId, aesthetic);\n return aesthetic;\n }\n\n /**\n * Set the aesthetic for a column and aesthetic ID combination\n * @param {string} columnId - The unique column ID\n * @param {string} aestheticId - The aesthetic ID (user-defined)\n * @param {Aesthetic} aesthetic - The aesthetic instance to set\n */\n setAesthetic(columnId, aestheticId, aesthetic) {\n // Ensure the column has an aesthetic map\n if (!this.columnAesthetic.has(columnId)) {\n this.columnAesthetic.set(columnId, new Map());\n }\n\n this.columnAesthetic.get(columnId).set(aestheticId, aesthetic);\n }\n\n /**\n * Create an aesthetic for a column based on its type and provided state\n * @private\n * @param {string} columnId - The unique column ID\n * @param {object} state - State options for the aesthetic\n * @returns {Aesthetic} The created aesthetic instance\n */\n #createAesthetic(columnId, state = {}) {\n const columnType = this.columnType.get(columnId);\n const isCategorical = columnType === 'categorical';\n\n if (!columnType) {\n console.error(`Column ${columnId} not found`);\n }\n\n // Collect all values for this column from the tree\n let values = [];\n this.tree.each(node => {\n if (node.metadata && node.metadata[columnId] !== undefined) {\n values.push(node.metadata[columnId]);\n }\n });\n\n if (values.length === 0) {\n console.error(`No values found for column ${columnId}`);\n }\n\n // Get display name for titles\n const displayName = this.columnDisplayName.get(columnId) || columnId;\n\n // Create aesthetic with provided state, filling in defaults\n const aesthetic = new Aesthetic(values, {\n isCategorical: isCategorical,\n inputUnits: displayName,\n ...state\n });\n\n return aesthetic;\n }\n\n /**\n * Add metadata to tree nodes\n */\n #attachTable(tableId) {\n const table = this.metadata.get(tableId);\n this.tree.each(d => {\n const nodeName = d.data.name;\n if (nodeName && table.has(nodeName)) {\n const tableMetadata = table.get(nodeName);\n d.metadata = { ...d.metadata, ...tableMetadata };\n }\n });\n }\n\n /**\n * Remove metadata from tree nodes\n */\n #detachTable(tableId) {\n const table = this.metadata.get(tableId);\n const keys = Object.keys(table.values().next().value);\n this.tree.each(d => {\n keys.forEach(key => {\n delete d[key];\n });\n });\n }\n\n}\n","// Calculate optimal scaling factors using constraint-based approach for rectangular layouts\nexport function calculateScalingFactors(root, options) {\n // Calculate leaf annotation dimensions for each node\n const leafData = root.leaves().map(node => {\n return {\n x: node.x, // x-axis position in branch length units\n width: (node.tipLabelBounds.width + options.nodeLabelOffset) * node.tipLabelSize,\n height: node.tipLabelBounds.height * node.tipLabelSize,\n labelScale: node.tipLabelSize\n };\n });\n\n // Initialize constraint ranges\n let branchLenToPxFactor_min = 0;\n let branchLenToPxFactor_max = Infinity;\n let labelSizeToPxFactor_min = 0;\n let labelSizeToPxFactor_max = Infinity;\n\n function applyBranchMax(newMax) {\n if (newMax < branchLenToPxFactor_max) {\n if (newMax < branchLenToPxFactor_min) {\n branchLenToPxFactor_max = branchLenToPxFactor_min;\n } else {\n branchLenToPxFactor_max = newMax;\n }\n }\n }\n\n function applyBranchMin(newMin) {\n if (newMin > branchLenToPxFactor_min) {\n if (newMin > branchLenToPxFactor_max) {\n branchLenToPxFactor_min = branchLenToPxFactor_max;\n } else {\n branchLenToPxFactor_min = newMin;\n }\n }\n }\n\n function applyLabelMax(newMax) {\n if (newMax < labelSizeToPxFactor_max) {\n if (newMax < labelSizeToPxFactor_min) {\n labelSizeToPxFactor_max = labelSizeToPxFactor_min;\n } else {\n labelSizeToPxFactor_max = newMax;\n }\n }\n }\n\n function applyLabelMin(newMin) {\n if (newMin > labelSizeToPxFactor_min) {\n if (newMin > labelSizeToPxFactor_max) {\n labelSizeToPxFactor_min = labelSizeToPxFactor_max;\n } else {\n labelSizeToPxFactor_min = newMin;\n }\n }\n }\n\n const minLabelScale = Math.min(...leafData.map(a => a.labelScale));\n const maxBranchX = Math.max(...leafData.map(a => a.x));\n const nonZeroBranches = root.descendants().filter(a => a.data.length > 0 && a.children);\n const minbranchLength = nonZeroBranches.length > 0 ? Math.min(...nonZeroBranches.map(a => a.data.length)) : Infinity;\n\n // Text should be readable at 100% zoom\n applyLabelMin(options.minFontPx / minLabelScale);\n\n // Branches should take up minimum proportion of tree space\n applyBranchMin(Math.max(...leafData.map(a =>\n (a.width * labelSizeToPxFactor_min) / ((maxBranchX / options.minBranchLenProp) - a.x)\n )));\n\n // Tree width should fit into viewing window\n applyBranchMax(Math.min(...leafData.map(a =>\n (options.viewWidth - a.width * labelSizeToPxFactor_min) / a.x\n )));\n applyLabelMax(Math.min(...leafData.map(a =>\n (options.viewWidth - a.x * branchLenToPxFactor_min) / a.width\n )));\n\n // Tree height should fit into viewing window\n if (labelSizeToPxFactor_min != labelSizeToPxFactor_max) {\n applyLabelMax(options.viewHeight / leafData.reduce((sum, a) => sum + a.height, 0));\n }\n\n // Text should be large and easy to read\n if (labelSizeToPxFactor_min != labelSizeToPxFactor_max) {\n applyLabelMin(options.idealFontPx / minLabelScale);\n }\n\n // Tree width should fit into viewing window (recalculate since labelSizeToPxFactor_min changed)\n if (branchLenToPxFactor_min != branchLenToPxFactor_max) {\n applyBranchMax(Math.min(...leafData.map(a =>\n (options.viewWidth - a.width * labelSizeToPxFactor_min) / a.x\n )));\n }\n\n // Shortest non-zero branches should be longer than branch thickness\n if (isFinite(minbranchLength)) {\n if (branchLenToPxFactor_min != branchLenToPxFactor_max) {\n applyBranchMin(options.minBranchThicknessPx / minbranchLength);\n }\n // Tree width should fit into viewing window (recalculate since branchLenToPxFactor_min changed)\n if (labelSizeToPxFactor_min != labelSizeToPxFactor_max) {\n applyLabelMax(Math.min(...leafData.map(a =>\n (options.viewWidth - a.x * branchLenToPxFactor_min) / a.width\n )));\n }\n }\n\n // Text should be less than maximum size\n if (labelSizeToPxFactor_min != labelSizeToPxFactor_max) {\n applyLabelMax(options.maxFontPx / minLabelScale);\n }\n\n return {\n branchLenToPxFactor_min: branchLenToPxFactor_min,\n branchLenToPxFactor_max: branchLenToPxFactor_max,\n labelSizeToPxFactor_min: labelSizeToPxFactor_min,\n labelSizeToPxFactor_max: labelSizeToPxFactor_max\n };\n}\n\n// Calculate optimal scaling factors using constraint-based approach for circular layouts\nexport function calculateCircularScalingFactors(root, options) {\n const leaves = root.leaves();\n\n // Calculate leaf annotation dimensions for each node\n const leafData = leaves.map((node, i) => {\n return {\n radius: node.radius, // x-axis position in branch length units (radius)\n angle: node.angle,\n cos: node.cos,\n sin: node.sin,\n width: (node.tipLabelBounds.width + options.nodeLabelOffset) * node.tipLabelSize,\n height: node.tipLabelBounds.height * node.tipLabelSize,\n labelScale: node.tipLabelSize\n };\n });\n\n // Initialize constraint ranges\n let branchLenToPxFactor_min = 0;\n let branchLenToPxFactor_max = Infinity;\n let labelSizeToPxFactor_min = 0;\n let labelSizeToPxFactor_max = Infinity;\n\n function applyBranchMax(newMax) {\n if (newMax < branchLenToPxFactor_max) {\n if (newMax < branchLenToPxFactor_min) {\n branchLenToPxFactor_max = branchLenToPxFactor_min;\n } else {\n branchLenToPxFactor_max = newMax;\n }\n }\n }\n\n function applyBranchMin(newMin) {\n if (newMin > branchLenToPxFactor_min) {\n if (newMin > branchLenToPxFactor_max) {\n branchLenToPxFactor_min = branchLenToPxFactor_max;\n } else {\n branchLenToPxFactor_min = newMin;\n }\n }\n }\n\n function applyLabelMax(newMax) {\n if (newMax < labelSizeToPxFactor_max) {\n if (newMax < labelSizeToPxFactor_min) {\n labelSizeToPxFactor_max = labelSizeToPxFactor_min;\n } else {\n labelSizeToPxFactor_max = newMax;\n }\n }\n }\n\n function applyLabelMin(newMin) {\n if (newMin > labelSizeToPxFactor_min) {\n if (newMin > labelSizeToPxFactor_max) {\n labelSizeToPxFactor_min = labelSizeToPxFactor_max;\n } else {\n labelSizeToPxFactor_min = newMin;\n }\n }\n }\n\n const minLabelScale = Math.min(...leafData.map(a => a.labelScale));\n const maxBranchX = Math.max(...leafData.map(a => a.radius));\n const minBranchX = Math.min(...leafData.map(a => a.radius));\n const nonZeroBranches = root.descendants().filter(a => a.data.length > 0 && a.children);\n const minBranchLength = nonZeroBranches.length > 0 ? Math.min(...nonZeroBranches.map(a => a.data.length)) : Infinity;\n\n // Text should be readable at 100% zoom\n applyLabelMin(options.minFontPx / minLabelScale);\n\n // Branches should take up minimum proportion of tree space\n if (branchLenToPxFactor_min !== branchLenToPxFactor_max) {\n applyBranchMin(\n Math.max(...leafData.map(a =>\n (a.width * labelSizeToPxFactor_min) / ((maxBranchX / options.minBranchLenProp) - a.radius)\n ))\n );\n }\n\n // Tree should fit into viewing window\n function applyBranchViewConstraint() {\n const rightBranchFactor = Math.min(...leafData.filter(a => a.cos > 0).map(a => (options.viewWidth / 2 - a.width * a.cos * labelSizeToPxFactor_min) / (a.radius * a.cos)));\n const leftBranchFactor = Math.min(...leafData.filter(a => a.cos < 0).map(a => (options.viewWidth / 2 - a.width * -a.cos * labelSizeToPxFactor_min) / (a.radius * -a.cos)));\n const bottomBranchFactor = Math.min(...leafData.filter(a => a.sin > 0).map(a => (options.viewHeight / 2 - a.width * a.sin * labelSizeToPxFactor_min) / (a.radius * a.sin)));\n const topBranchFactor = Math.min(...leafData.filter(a => a.sin < 0).map(a => (options.viewHeight / 2 - a.width * -a.sin * labelSizeToPxFactor_min) / (a.radius * -a.sin)));\n applyBranchMax(Math.min(\n (rightBranchFactor + leftBranchFactor) / 2,\n (topBranchFactor + bottomBranchFactor) / 2\n ));\n }\n function applyLabelViewConstraint() {\n const rightLabelFactor = Math.min(...leafData.filter(a => a.cos > 0).map(a => (options.viewWidth / 2 - a.radius * a.cos * branchLenToPxFactor_min) / (a.width * a.cos)));\n const leftLabelFactor = Math.min(...leafData.filter(a => a.cos < 0).map(a => (options.viewWidth / 2 - a.radius * -a.cos * branchLenToPxFactor_min) / (a.width * -a.cos)));\n const bottomLabelFactor = Math.min(...leafData.filter(a => a.sin > 0).map(a => (options.viewHeight / 2 - a.radius * a.sin * branchLenToPxFactor_min) / (a.width * a.sin)));\n const topLabelFactor = Math.min(...leafData.filter(a => a.sin < 0).map(a => (options.viewHeight / 2 - a.radius * -a.sin * branchLenToPxFactor_min) / (a.width * -a.sin)));\n applyLabelMax(Math.min(\n (rightLabelFactor + leftLabelFactor) / 2,\n (topLabelFactor + bottomLabelFactor) / 2\n ));\n }\n applyBranchViewConstraint();\n applyLabelViewConstraint();\n\n // Leaf annotations should not overlap when used in a circular layout\n const totalAnnotationHeight = leafData.reduce((sum, a) => sum + a.height, 0);\n if (totalAnnotationHeight > 0 && minBranchX > 0) {\n if (branchLenToPxFactor_min !== branchLenToPxFactor_max) {\n applyBranchMin((totalAnnotationHeight * labelSizeToPxFactor_min) / (minBranchX * 2 * Math.PI));\n }\n if (labelSizeToPxFactor_min !== labelSizeToPxFactor_max) {\n applyLabelMax((maxBranchX * branchLenToPxFactor_max * 2 * Math.PI) / totalAnnotationHeight);\n }\n }\n\n // Tree should fit into viewing window (recalculate since branch limits might have changed)\n if (labelSizeToPxFactor_min !== labelSizeToPxFactor_max) {\n applyLabelViewConstraint();\n }\n\n // Text should be large and easy to read\n if (labelSizeToPxFactor_min !== labelSizeToPxFactor_max) {\n applyLabelMin(options.idealFontPx / minLabelScale);\n }\n\n // Tree should fit into viewing window (recalculate since label limits might have changed)\n if (branchLenToPxFactor_min !== branchLenToPxFactor_max) {\n applyBranchViewConstraint();\n }\n\n // Shortest non-zero branches should be longer than branch thickness\n if (isFinite(minBranchLength) && minBranchLength > 0) {\n if (branchLenToPxFactor_min !== branchLenToPxFactor_max) {\n applyBranchMin(options.minBranchThicknessPx / minBranchLength);\n }\n }\n\n // Tree should fit into viewing window (recalculate since branch limits might have changed)\n if (labelSizeToPxFactor_min !== labelSizeToPxFactor_max) {\n applyLabelViewConstraint();\n }\n\n // Text should be less than maximum size\n if (labelSizeToPxFactor_min !== labelSizeToPxFactor_max) {\n applyLabelMax(options.maxFontPx / minLabelScale);\n }\n\n return {\n branchLenToPxFactor_min: branchLenToPxFactor_min,\n branchLenToPxFactor_max: branchLenToPxFactor_max,\n labelSizeToPxFactor_min: labelSizeToPxFactor_min,\n labelSizeToPxFactor_max: labelSizeToPxFactor_max\n };\n}\n","import { select } from \"d3\";\n\nexport class TextSizeEstimator {\n constructor() {\n this.metricsCache = new Map();\n this.setupHiddenEnvironment();\n }\n\n setupHiddenEnvironment() {\n // Create a dedicated hidden container\n this.hiddenContainer = document.createElement('div');\n this.hiddenContainer.style.cssText = `\n position: absolute;\n top: -9999px;\n left: -9999px;\n visibility: hidden;\n width: 5000px;\n height: 5000px;\n overflow: hidden;\n `;\n\n // Create SVG with namespace\n this.hiddenSVG = document.createElementNS(\"http://www.w3.org/2000/svg\", \"svg\");\n this.hiddenSVG.setAttribute('width', '5000');\n this.hiddenSVG.setAttribute('height', '5000');\n this.hiddenSVG.setAttribute('viewBox', '0 0 5000 5000');\n\n this.hiddenContainer.appendChild(this.hiddenSVG);\n document.body.appendChild(this.hiddenContainer);\n\n // Create D3 reference\n this.hiddenD3SVG = select(this.hiddenSVG);\n\n // Create a reusable text group for better performance\n this.textGroup = this.hiddenD3SVG.append('g')\n .attr('id', 'text-measurement-group');\n }\n\n getRelativeTextSize(text, styles = {}) {\n const cacheKey = `${text}-${JSON.stringify(styles)}`;\n\n if (this.metricsCache.has(cacheKey)) {\n return this.metricsCache.get(cacheKey);\n }\n\n const tempText = this.textGroup.append(\"text\")\n .attr(\"x\", 1000)\n .attr(\"y\", 2500)\n .text(text);\n\n // Apply all styles\n Object.keys(styles).forEach(key => {\n tempText.style(key, styles[key]);\n });\n\n // Force DOM rendering\n this.hiddenSVG.getBoundingClientRect();\n\n const bbox = tempText.node().getBBox();\n const computedStyle = window.getComputedStyle(tempText.node());\n const fontSize = parseFloat(computedStyle.fontSize);\n\n tempText.remove();\n\n const result = {\n width: bbox.width / fontSize,\n height: bbox.height / fontSize\n };\n\n this.metricsCache.set(cacheKey, result);\n return result;\n }\n\n getTextSize(text, fontSize, styles = {}) {\n const result = this.getRelativeTextSize(text, styles);\n return {\n width: result.width,\n height: result.height,\n widthPx: result.width * fontSize,\n heightPx: result.height * fontSize\n };\n }\n\n // Clear cache if needed\n clearCache() {\n this.metricsCache.clear();\n }\n\n // Proper cleanup\n destroy() {\n if (this.hiddenContainer && this.hiddenContainer.parentNode) {\n this.hiddenContainer.parentNode.removeChild(this.hiddenContainer);\n }\n this.metricsCache.clear();\n }\n}\n","import { Subscribable } from './utils.js';\nimport { calculateScalingFactors, calculateCircularScalingFactors } from './scaling.js';\nimport { NullScale } from './scales.js';\nimport { TextSizeEstimator } from './textAspectRatioPrediction.js'\nimport { cluster } from 'd3';\n\nexport class TreeState extends Subscribable {\n\n #AESTHETICS = {\n tipLabelText: {\n title: 'Tip label text',\n scaleType: 'identity',\n default: '',\n downstream: ['updateTipLabelText', 'updateCoordinates'],\n hasLegend: false,\n },\n tipLabelColor: {\n title: 'Tip label color',\n scaleType: 'color',\n default: '#000000',\n otherCategory: \"#555555\",\n downstream: [],\n hasLegend: true,\n },\n tipLabelSize: {\n title: 'Tip label size',\n scaleType: 'size',\n default: 1,\n isCategorical: false,\n outputRange: [0.5, 2],\n downstream: ['updateCoordinates'],\n hasLegend: true,\n },\n tipLabelFont: {\n title: 'Tip label font',\n scaleType: 'identity',\n default: 'sans-serif',\n downstream: ['updateCoordinates'],\n hasLegend: false,\n },\n tipLabelStyle: {\n title: 'Tip label font style',\n scaleType: 'text',\n outputValues: ['normal', 'bold', 'italic', 'bold italic'],\n default: 'normal',\n otherCategory: 'italic',\n downstream: ['updateCoordinates'],\n hasLegend: false,\n },\n nodeLabelText: {\n title: 'Node label text',\n scaleType: 'identity',\n default: '',\n downstream: ['updateNodeLabelText'],\n hasLegend: false,\n },\n nodeLabelSize: {\n title: 'Node label size',\n scaleType: 'size',\n default: 1,\n isCategorical: false,\n outputRange: [0.5, 2],\n downstream: ['updateCoordinates'],\n hasLegend: false,\n },\n }\n\n state = {\n treeData: null,\n layout: 'rectangular',\n aesthetics: Object.fromEntries(Object.keys(this.#AESTHETICS).map(key => [key, undefined])),\n viewWidth: 800,\n viewHeight: 600,\n labelSpacing: 0.1,\n nodeLabelSizeScale: 0.67,\n nodeLabelOffset: 0.3,\n maxLabelWidthProportion: 0.03,\n branchThicknessProp: 0.15,\n minFontPx: 12,\n idealFontPx: 18,\n maxFontPx: 32,\n minBranchThicknessPx: 1,\n minBranchLenProp: 0.5,\n collapsedRootLineProp: 0.05,\n branchLengthScale: 1,\n treeHeightScale: 1,\n }\n\n textSizeEstimator;\n displayedRoot;\n occupiedWidth;\n occupiedHeight;\n branchLenToPxFactor;\n labelSizeToPxFactor;\n aestheticsScales = {};\n legends = [];\n\n\n constructor(state = {}, textSizeEstimator = new TextSizeEstimator()) {\n super();\n\n // Check input parameters\n if (!state.treeData || !state.treeData.tree) {\n console.error('TreeState initialized without valid tree data');\n return;\n }\n if (!textSizeEstimator) {\n console.error('TreeState initialized without textSizeEstimator');\n return;\n }\n\n // Apply received state by overwriting defualt values\n state.aesthetics = { ...this.state.aesthetics, ...state.aesthetics };\n this.state = { ...this.state, ...state };\n\n // Initialize values derived from state\n this.textSizeEstimator = textSizeEstimator;\n this.#initalize();\n\n // Watch for changes to the upderlying tree data or settings\n this.state.treeData.subscribe('treeUpdate', () => {\n this.#initalize();\n })\n this.state.treeData.subscribe('metadataRemoved', (info) => {\n this.setAesthetics(Object.fromEntries(info.columnIds.map(key => [key, undefined])));\n })\n }\n\n #initalize() {\n this.displayedRoot = this.state.treeData.tree;\n this.updateLayout();\n this.setAesthetics(this.state.aesthetics, true);\n }\n\n setLayout(layout, force = false) {\n const validLayoutTypes = ['circular', 'rectangular'];\n if (!validLayoutTypes.includes(layout)) {\n console.warn(`Invalid layout type: ${layout}`);\n return;\n }\n\n if (force || this.state.layout !== layout) {\n this.state.layout = layout;\n this.update();\n this.notify('layoutChange', { layout });\n }\n }\n\n setBranchLengthScale(scale) {\n if (scale < 0.01 || scale > 100) {\n console.warn(`Branch length scale out of range: ${scale}`);\n return;\n }\n\n this.state.branchLengthScale = scale;\n this.updateCoordinates();\n this.notify('branchLengthScaleChange', { scale });\n }\n\n setTreeHeightScale(scale) {\n if (scale < 0.1 || scale > 10) {\n console.warn(`Tree height scale out of range: ${scale}`);\n return;\n }\n\n this.state.treeHeightScale = scale;\n this.updateCoordinates();\n this.notify('treeHeightScaleChange', { scale });\n }\n\n setAesthetics(values, force = false) {\n const downstreams = new Set();\n let legendsChanged = false;\n\n for (const [aestheticId, columnId] of Object.entries(values)) {\n const aesData = this.#AESTHETICS[aestheticId];\n if (!aesData) {\n console.warn(`Unknown aesthetic: ${aestheticId}`);\n continue;\n }\n\n if (force || columnId !== this.state.aesthetics[aestheticId]) {\n // Record the name of the defined aesthetic\n this.state.aesthetics[aestheticId] = columnId;\n\n // Update the aesthetic for the column\n if (!columnId) {\n this.aestheticsScales[aestheticId] = new NullScale(aesData.default);\n } else {\n // Get or create the aesthetic with default state from #AESTHETICS\n this.aestheticsScales[aestheticId] = this.state.treeData.getAesthetic(columnId, aestheticId, aesData);\n }\n\n // Update the tree data directly modified by the aesthetic\n this.state.treeData.tree.each(d => {\n if (columnId && columnId !== null && columnId !== undefined) {\n if (d.metadata && d.metadata[columnId] !== undefined) {\n d[aestheticId] = this.aestheticsScales[aestheticId].getValue(d.metadata[columnId]);\n } else {\n d[aestheticId] = aesData.default;\n }\n } else {\n d[aestheticId] = this.aestheticsScales[aestheticId].getValue();\n }\n });\n\n // Record any functions to call later in a unique list\n for (const methodName of aesData.downstream) {\n downstreams.add(methodName);\n }\n\n // Check if this aesthetic has a legend\n if (aesData.hasLegend) {\n legendsChanged = true;\n }\n }\n\n // notify subscribers of change to aesthetic\n this.notify(`${aestheticId}Change`);\n }\n\n // Update legends if any aesthetic with a legend changed\n if (legendsChanged) {\n this.#updateLegends();\n }\n\n // Call all unique functions needed to update downstream data from all the aesthetics applied\n for (const methodName of downstreams) {\n this[methodName]();\n }\n\n }\n\n #updateLegends() {\n // Clear existing legends\n this.legends = [];\n\n // Create legends for each aesthetic that has one and is not using the default\n for (const [aestheticId, columnId] of Object.entries(this.state.aesthetics)) {\n const aesData = this.#AESTHETICS[aestheticId];\n\n // Skip if no legend for this aesthetic or using default (undefined/null)\n if (!aesData.hasLegend || !columnId) {\n continue;\n }\n\n // Get the aesthetic scale\n const aesthetic = this.aestheticsScales[aestheticId];\n if (!aesthetic) {\n continue;\n }\n\n this.legends.push({\n aestheticId,\n aesthetic,\n type: aesData.scaleType\n });\n }\n\n // Notify that legends have changed\n this.notify('legendsChange');\n }\n\n setTargetTreeDimensions(width, height) {\n this.state.viewWidth = width;\n this.state.viewHeight = height;\n this.updateCoordinates();\n }\n\n collapseSubtree(node) {\n if (!node) {\n console.warn('Tried to collapse non-existant node');\n return;\n }\n if (!node.children) {\n console.warn('Tried to collapse node with no children');\n return;\n }\n\n node.collapsedChildren = node.children;\n delete node.children;\n\n this.update();\n }\n\n expandSubtree(node) {\n if (!node || !node.collapsedChildren) return;\n\n node.children = node.collapsedChildren;\n delete node.collapsedChildren;\n\n this.update();\n }\n\n hideSubtree(node) {\n if (!node) {\n console.warn('Tried to hide non-existent node');\n return;\n }\n if (!node.parent) {\n console.warn('Cannot hide the root node');\n return;\n }\n\n // Mark the node as hidden\n node.hidden = true;\n\n // Remove from parent's children array\n const parent = node.parent;\n if (parent.children) {\n parent.hiddenChildren = parent.hiddenChildren || [];\n parent.hiddenChildren.push(node);\n parent.children = parent.children.filter(child => child !== node);\n\n // If parent has no more visible children, delete the children property\n if (parent.children.length === 0) {\n delete parent.children;\n\n // Recursively hide the parent if it now has no children\n this.hideSubtree(parent);\n }\n }\n\n this.update();\n }\n\n showSubtree(node) {\n if (!node || !node.hidden) return;\n\n const parent = node.parent;\n if (!parent || !parent.hiddenChildren) return;\n\n // Remove from hiddenChildren array\n parent.hiddenChildren = parent.hiddenChildren.filter(child => child !== node);\n if (parent.hiddenChildren.length === 0) {\n delete parent.hiddenChildren;\n }\n\n // Add back to children array\n if (!parent.children) {\n parent.children = [];\n }\n parent.children.push(node);\n\n // Sort children to maintain original order (by data index if available)\n parent.children.sort((a, b) => {\n const aIndex = parent.data.children ? parent.data.children.indexOf(a.data) : 0;\n const bIndex = parent.data.children ? parent.data.children.indexOf(b.data) : 0;\n return aIndex - bIndex;\n });\n\n // Unmark as hidden\n delete node.hidden;\n\n this.update();\n }\n\n showAllHidden() {\n // Collect all hidden nodes\n const hiddenNodes = [];\n this.state.treeData.tree.each(d => {\n if (d.hiddenChildren) {\n hiddenNodes.push(...d.hiddenChildren);\n }\n });\n\n // Show each hidden node\n for (const node of hiddenNodes) {\n this.showSubtree(node);\n }\n }\n\n collapseRoot(node) {\n if (!node || node === this.displayedRoot) return;\n\n this.displayedRoot = node;\n this.displayedRoot.collapsedParent = this.displayedRoot.parent;\n delete this.displayedRoot.parent;\n\n this.update();\n }\n\n expandRoot() {\n if (!this.displayedRoot || !this.displayedRoot.collapsedParent) return;\n\n this.displayedRoot.parent = this.displayedRoot.collapsedParent;\n delete this.displayedRoot.collapsedParent;\n\n // Find the new root (the topmost ancestor without a collapsed parent)\n let newRoot = this.displayedRoot;\n while (newRoot.parent && !newRoot.collapsedParent) {\n newRoot = newRoot.parent;\n }\n\n this.displayedRoot = newRoot;\n\n this.update();\n }\n\n updateTipLabelText() {\n this.state.treeData.tree.each(d => {\n // If tipLabelText aesthetic is set to null (None), don't show any labels\n if (this.state.aesthetics.tipLabelText === null) {\n d.tipLabelText = '';\n } else if ((d.children || d.collapsedChildren) && (this.state.aesthetics.tipLabelText === undefined || !d.tipLabelText)) {\n // For internal nodes with default or no aesthetic set\n d.tipLabelText = `Clade with ${d.leafCount} tips`;\n } else if (!d.tipLabelText) {\n // For leaf nodes with no label set\n d.tipLabelText = d.data.name || '';\n }\n })\n }\n\n updateNodeLabelText() {\n this.state.treeData.tree.each(d => {\n if (d.children || d.collapsedChildren) {\n d.nodeLabelText = d.data.name || '';\n } else if (!d.nodeLabelText) {\n d.tipLabel = d.data.name || '';\n }\n })\n }\n\n update() {\n this.updateLayout();\n this.updateCoordinates();\n }\n\n updateLayout() {\n // Apply D3 cluster layout to compute base positions\n const treeLayout = cluster().separation((a, b) => 1);\n treeLayout(this.displayedRoot);\n\n // Apply branch lengths\n this.displayedRoot.each(d => {\n if (d.parent) {\n d.branchLen = d.data.length ? d.data.length : 0;\n d.y = d.parent.y + d.branchLen;\n } else {\n d.y = 0;\n }\n });\n\n // Save original coordinates and prepare for layout transformation\n this.displayedRoot.each(d => {\n const originalX = d.x;\n const originalY = d.y;\n d.x = originalY; // D3 uses y for what is the x axis in our case\n d.y = originalX;\n });\n if (this.state.layout === 'circular') {\n this.displayedRoot.each(d => {\n d.angle = d.y * Math.PI * 2 + Math.PI;\n d.cos = Math.cos(d.angle);\n d.sin = Math.sin(d.angle);\n d.radius = d.x;\n });\n }\n\n // Move tree so root is at 0,0\n this.displayedRoot.eachAfter(d => {\n d.x = d.x - this.displayedRoot.x;\n d.y = d.y - this.displayedRoot.y;\n });\n }\n\n getCollapsedTriangleHeight(d) {\n return d.tipLabelSizePx + 1.1;\n }\n\n getCollapsedTriangleOffset(d) {\n return this.getCollapsedTriangleHeight(d) * 0.52;\n }\n\n updateCoordinates() {\n // Estimate label dimensions\n this.displayedRoot.each(d => {\n d.tipLabelBounds = this.textSizeEstimator.getRelativeTextSize(\n d.tipLabelText,\n { 'font-family': d.tipLabelFont, 'font-style': d.tipLabelStyle }\n );\n d.nodeLabelBounds = this.textSizeEstimator.getRelativeTextSize(\n d.nodeLabelText,\n { 'font-family': d.nodeLabelFont, 'font-style': d.nodeLabelStyle }\n );\n })\n\n // Calculate scaling factors\n let scalingFactors;\n if (this.state.layout === 'circular') {\n scalingFactors = calculateCircularScalingFactors(this.displayedRoot, this.state);\n } else {\n scalingFactors = calculateScalingFactors(this.displayedRoot, this.state);\n }\n\n this.branchLenToPxFactor = scalingFactors.branchLenToPxFactor_max * this.state.branchLengthScale;\n this.labelSizeToPxFactor = scalingFactors.labelSizeToPxFactor_min;\n\n // Calculate pixel coordinates and sizes based on scaling factors\n this.displayedRoot.each(d => {\n d.branchLenPx = d.branchLen * this.branchLenToPxFactor;\n d.tipLabelSizePx = d.tipLabelSize * this.labelSizeToPxFactor;\n d.nodeLabelSizePx = d.nodeLabelSize * this.labelSizeToPxFactor * this.state.nodeLabelSizeScale;\n\n // Calculate tip label offset, incorporating collapsed triangle if present\n let tipLabelXOffset = d.tipLabelSizePx * this.state.nodeLabelOffset;\n if (d.collapsedChildren) {\n tipLabelXOffset += this.getCollapsedTriangleOffset(d) * 1.3;\n }\n d.tipLabelXOffsetPx = tipLabelXOffset;\n\n d.nodeLabelXOffsetPx = d.nodeLabelSizePx * this.state.nodeLabelOffset;\n d.tipLabelYOffsetPx = d.tipLabelSizePx * d.tipLabelBounds.height / 2;\n d.nodeLabelYOffsetPx = d.nodeLabelSizePx * d.nodeLabelBounds.height / 2;\n d.tipLabelBounds.widthPx = d.tipLabelBounds.width * d.tipLabelSizePx;\n d.tipLabelBounds.heightPx = d.tipLabelBounds.height * d.tipLabelSizePx;\n });\n if (this.state.layout === 'circular') {\n this.displayedRoot.each(d => {\n d.radiusPx = d.radius * this.branchLenToPxFactor;\n d.xPx = d.radiusPx * d.cos;\n d.yPx = d.radiusPx * d.sin;\n });\n } else {\n this.displayedRoot.each(d => {\n d.xPx = d.x * this.branchLenToPxFactor;\n d.yPx = d.y * this.displayedRoot.leaves().length * this.labelSizeToPxFactor * (1 + this.state.labelSpacing) * this.state.treeHeightScale;\n });\n }\n\n // Update bounds\n if (this.state.layout === 'circular') {\n this.state.treeData.tree.eachAfter(d => {\n if (d.children) {\n d.bounds = {\n minRadius: d.radiusPx,\n maxRadius: Math.max(...d.children.map(k => k.bounds.maxRadius)),\n minAngle: Math.min(...d.children.map(k => k.bounds.minAngle)),\n maxAngle: Math.max(...d.children.map(k => k.bounds.maxAngle)),\n minX: Math.min(...d.children.map(k => k.bounds.minX)),\n maxX: Math.max(...d.children.map(k => k.bounds.maxX)),\n minY: Math.min(...d.children.map(k => k.bounds.minY)),\n maxY: Math.max(...d.children.map(k => k.bounds.maxY))\n };\n } else {\n const minRadius = d.radiusPx;\n const maxRadius = minRadius + d.tipLabelXOffsetPx + d.tipLabelBounds.widthPx;\n const angleLabelOffset = Math.atan(d.tipLabelYOffsetPx / d.radiusPx);\n const minAngle = d.angle - angleLabelOffset;\n const maxAngle = d.angle + angleLabelOffset;\n const xValues = [\n minRadius * Math.cos(minAngle),\n minRadius * Math.cos(maxAngle),\n maxRadius * Math.cos(maxAngle),\n maxRadius * Math.cos(minAngle),\n ]\n const yValues = [\n minRadius * Math.sin(minAngle),\n minRadius * Math.sin(maxAngle),\n maxRadius * Math.sin(maxAngle),\n maxRadius * Math.sin(minAngle),\n ]\n d.bounds = {\n minRadius,\n maxRadius,\n minAngle,\n maxAngle,\n minX: Math.min(...xValues),\n maxX: Math.max(...xValues),\n minY: Math.min(...yValues),\n maxY: Math.max(...yValues)\n };\n }\n });\n } else {\n this.state.treeData.tree.eachAfter(d => {\n if (d.children) {\n d.bounds = {\n minX: d.xPx,\n maxX: Math.max(...d.children.map(k => k.bounds.maxX)),\n minY: Math.min(...d.children.map(k => k.bounds.minY)),\n maxY: Math.max(...d.children.map(k => k.bounds.maxY))\n };\n } else {\n d.bounds = {\n minX: d.xPx,\n maxX: d.xPx + d.tipLabelXOffsetPx + d.tipLabelBounds.widthPx,\n minY: d.yPx - d.tipLabelYOffsetPx,\n maxY: d.yPx + d.tipLabelYOffsetPx\n };\n }\n });\n }\n\n this.notify('coordinateChange');\n }\n\n}\n","// Icon library & helpers\nconst ICONS = {\n refresh: [\n \"m 16,7 h 5 V 2\",\n \"M 22,12 A 10,10 0 0 1 13.58,21.9 10,10 0 0 1 2.5,15.2 10,10 0 0 1 7.4,3.14 10,10 0 0 1 20,6\"\n ],\n outwardArrows: [\n \"m 9,19 3,3 3,-3\",\n \"M 12,22 V 15\",\n \"m 9,5 3,-3 3,3\",\n \"M 12,2 V 9\",\n \"m 5,9 -3,3 3,3\",\n \"M 2,12 H 9\",\n \"M 19,15 22,12 19,9\",\n \"M 22,12 H 15\"\n ],\n compress: [\n \"M 5,12 H 19\",\n \"m 9,18 3,-3 3,3\",\n \"m 12,15 v 7\",\n \"m 9,6 3,3 3,-3\",\n \"M 12,9 V 2\"\n ],\n expand: [\n \"M 5,2 H 19\",\n \"M 5,22 H 19\",\n \"m 9,8 3,-3 3,3\",\n \"m 9,16 3,3 3,-3\",\n \"M 12,5 V 19\"\n ],\n circle: [\n \"M 12,2 A 10,10 0 1 1 12,22 A 10,10 0 1 1 12,2\"\n ],\n trash: [\n \"M 3,6 H 21\",\n \"M 19,6 V 20 A 2,2 0 0 1 17,22 H 7 A 2,2 0 0 1 5,20 V 6\",\n \"M 8,6 V 4 A 2,2 0 0 1 10,2 H 14 A 2,2 0 0 1 16,4 V 6\",\n \"M 10,11 V 17\",\n \"M 14,11 V 17\"\n ]\n};\n\n// Append an icon to the given SVG button, automatically scaling and\n// centring it. Returns the appended <g>.\nexport function appendIcon(svgSel, name, size, padding = 2) {\n const iconPathData = ICONS[name];\n const scale = (size - padding * 2) / 24;\n\n const button = svgSel.append(\"rect\")\n .attr(\"width\", \"100%\")\n .attr(\"height\", \"100%\")\n .attr(\"rx\", \"5px\")\n .attr(\"ry\", \"5px\")\n .attr(\"fill\", \"#CCC\");\n\n const paths = svgSel.append(\"g\")\n .attr(\"transform\", `translate(${padding}, ${padding}) scale(${scale})`)\n .attr(\"stroke\", \"#555\")\n .attr(\"fill\", \"none\")\n .attr(\"stroke-linecap\", \"round\")\n .attr(\"stroke-linejoin\", \"round\")\n .attr(\"stroke-width\", 2);\n\n iconPathData.forEach(p => {\n paths.append(\"path\").attr(\"d\", p);\n });\n\n return button;\n}\n","import { niceNumber, columnToHeader, generateNiceTicks, formatTickLabel, interpolateViridisSubset } from \"./utils.js\";\nimport { TextSizeEstimator } from './textAspectRatioPrediction.js'\nimport { interpolateViridis } from \"d3\";\n\n/**\n * Base class for all legend types\n * Manages common legend functionality like positioning and rendering\n */\nexport class LegendBase {\n constructor(options = {}) {\n this.state = {\n aesthetic: null,\n x: 0,\n y: 0,\n origin: \"top left\",\n maxX: Infinity,\n maxY: Infinity,\n titleFontSize: 16,\n labelFontSize: 14,\n ...options\n };\n\n this.coordinates = {};\n this.group = null;\n this.textSizeEstimator = this.state.treeState.textSizeEstimator;\n }\n\n /**\n * Render the legend in the specified SVG element\n * @param {Selection} svg - D3 selection of the SVG element\n */\n render(svg) {\n // Create main group for this legend\n this.group = svg.append(\"g\")\n .attr(\"class\", \"ht-legend\");\n\n // Update coordinates and position\n this.updateCoordinates();\n this.updatePosition();\n }\n\n /**\n * Calculate the size and location of legend elements\n * Must be implemented by subclasses\n */\n updateCoordinates() {\n throw new Error(\"updateCoordinates must be implemented by subclass\");\n }\n\n /**\n * Update the position of the rendered legend\n */\n updatePosition() {\n if (!this.group) return;\n\n let translateX = this.state.x;\n let translateY = this.state.y;\n\n // Adjust based on origin\n const { width, height } = this.coordinates;\n\n if (this.state.origin.includes(\"right\")) {\n translateX -= width;\n }\n if (this.state.origin.includes(\"bottom\")) {\n translateY -= height;\n }\n\n this.group.attr(\"transform\", `translate(${translateX}, ${translateY})`);\n }\n\n /**\n * Render the legend title\n * @param {string} title - The title text\n * @returns {Selection} The title text element\n */\n renderTitle(title) {\n const titleText = this.group.append(\"text\")\n .attr(\"class\", \"legend-title\")\n .attr(\"x\", 0)\n .attr(\"y\", 0)\n .attr(\"text-anchor\", \"start\")\n .style(\"font-size\", `${this.state.titleFontSize}px`)\n // .style(\"font-weight\", \"bold\")\n .style(\"text-decoration\", \"underline\")\n .text(title);\n\n return titleText;\n }\n}\n\n/**\n * Legend for branch length scale bar\n * Shows the relationship between branch length units and visual distance\n */\nexport class BranchLengthLegend extends LegendBase {\n constructor(options = {}) {\n super(options);\n this.scaleBarEdgeHeight = 6;\n this.titleSpacing = 10;\n this.unitLabelSpacing = 2;\n this.minBarLength = 80;\n this.maxBarLength = 160;\n this.lineThickness = 2;\n this.showTitle = false;\n this.title = 'Branch length';\n }\n\n /**\n * Calculate the size and location of legend elements\n */\n updateCoordinates() {\n // Choose an initial \"nice\" distance then adjust to keep bar within limits\n let units = niceNumber(1);\n let barWidth = units * this.state.treeState.branchLenToPxFactor;\n\n // Expand/shrink until within [min,max] pixels\n if (barWidth < this.minBarLength || barWidth > this.maxBarLength) {\n units = niceNumber(this.minBarLength / this.state.treeState.branchLenToPxFactor);\n barWidth = units * this.state.treeState.branchLenToPxFactor;\n }\n while (barWidth < this.minBarLength) {\n units *= 2;\n barWidth = units * this.state.treeState.branchLenToPxFactor;\n }\n while (barWidth > this.maxBarLength) {\n units /= 2;\n barWidth = units * this.state.treeState.branchLenToPxFactor;\n }\n\n units = units.toPrecision(3);\n\n const unitLabelSize = this.textSizeEstimator.getTextSize(units, this.state.labelFontSize);\n const titleSize = this.textSizeEstimator.getTextSize(this.title, this.state.titleFontSize);\n let titleHeightOffset = 0;\n if (this.showTitle) {\n titleHeightOffset = this.state.titleFontSize + this.titleSpacing;\n }\n const barY = titleHeightOffset + this.unitLabelSpacing + unitLabelSize.heightPx + 10;\n\n this.coordinates = {\n width: barWidth + this.lineThickness,\n height: barY + this.scaleBarEdgeHeight,\n title: {\n x: 0,\n y: this.state.titleFontSize,\n text: \"Branch Length\"\n },\n bar: {\n x1: 0,\n y1: barY,\n x2: barWidth,\n y2: barY,\n },\n leftTick: {\n x1: 0,\n y1: barY - this.scaleBarEdgeHeight,\n x2: 0,\n y2: barY + this.scaleBarEdgeHeight\n },\n rightTick: {\n x1: barWidth,\n y1: barY - this.scaleBarEdgeHeight,\n x2: barWidth,\n y2: barY + this.scaleBarEdgeHeight\n },\n label: {\n x: barWidth / 2,\n y: barY - this.unitLabelSpacing,\n text: units\n }\n };\n }\n\n /**\n * Render the legend in the specified SVG element\n * @param {Selection} svg - D3 selection of the SVG element\n */\n render(svg) {\n super.render(svg);\n\n // Render title\n if (this.showTitle) {\n this.renderTitle(this.coordinates.title.text)\n .attr(\"x\", this.coordinates.title.x)\n .attr(\"y\", this.coordinates.title.y);\n }\n\n // Render bar\n this.group.append(\"line\")\n .attr(\"class\", \"bar\")\n .attr(\"x1\", this.coordinates.bar.x1)\n .attr(\"y1\", this.coordinates.bar.y1)\n .attr(\"x2\", this.coordinates.bar.x2)\n .attr(\"y2\", this.coordinates.bar.y2)\n .attr(\"stroke\", \"#000\")\n .attr(\"stroke-width\", this.lineThickness);\n\n // Render left tick\n this.group.append(\"line\")\n .attr(\"class\", \"left-tick\")\n .attr(\"x1\", this.coordinates.leftTick.x1)\n .attr(\"y1\", this.coordinates.leftTick.y1)\n .attr(\"x2\", this.coordinates.leftTick.x2)\n .attr(\"y2\", this.coordinates.leftTick.y2)\n .attr(\"stroke\", \"#000\")\n .attr(\"stroke-width\", this.lineThickness);\n\n // Render right tick\n this.group.append(\"line\")\n .attr(\"class\", \"right-tick\")\n .attr(\"x1\", this.coordinates.rightTick.x1)\n .attr(\"y1\", this.coordinates.rightTick.y1)\n .attr(\"x2\", this.coordinates.rightTick.x2)\n .attr(\"y2\", this.coordinates.rightTick.y2)\n .attr(\"stroke\", \"#000\")\n .attr(\"stroke-width\", this.lineThickness);\n\n // Render label\n this.group.append(\"text\")\n .attr(\"class\", \"label\")\n .attr(\"x\", this.coordinates.label.x)\n .attr(\"y\", this.coordinates.label.y)\n .attr(\"text-anchor\", \"middle\")\n .attr(\"dominant-baseline\", \"ideographic\")\n .style(\"font-size\", `${this.state.labelFontSize}px`)\n .text(this.coordinates.label.text);\n }\n}\n\n/**\n * Legend for text size mappings\n * Shows how numeric input values map to text size in labels\n */\nexport class TextSizeLegend extends LegendBase {\n constructor(options = {}) {\n super(options);\n this.padding = 10;\n this.exampleLetter = 'A';\n this.tickHeight = 5;\n this.verticalSpacing = 5;\n this.showTitle = true;\n }\n\n /**\n * Calculate the size and location of legend elements\n */\n updateCoordinates() {\n // Get the data range from the scale\n const minValue = this.state.aesthetic.scale.dataMin;\n const maxValue = this.state.aesthetic.scale.dataMax;\n const minSize = this.state.aesthetic.scale.sizeMin;\n const maxSize = this.state.aesthetic.scale.sizeMax;\n\n // Generate nice tick values\n const ticks = generateNiceTicks(minValue, maxValue, 5);\n\n // Calculate dimensions\n const maxLetterFont = maxSize * this.state.treeState.labelSizeToPxFactor * 0.7; // The 0.7 is because the full font height is not the height of most letters\n const minLetterFont = minSize * this.state.treeState.labelSizeToPxFactor * 0.7;\n const titleSize = this.textSizeEstimator.getTextSize(this.state.aesthetic.state.title, this.state.titleFontSize);\n\n // Calculate width based on number of ticks\n const letterSpacing = 30;\n const baseWidth = Math.max(ticks.length * letterSpacing, 100);\n\n // Calculate tick label sizes to account for overhang\n const tickLabelSizes = ticks.map(tickValue => {\n const labelText = formatTickLabel(tickValue, ticks);\n return this.textSizeEstimator.getTextSize(labelText, this.state.labelFontSize);\n });\n\n // Calculate overhang on left (first tick label)\n const leftOverhang = tickLabelSizes[0].widthPx / 2;\n\n // Calculate overhang on right (last tick label)\n const rightOverhang = tickLabelSizes[tickLabelSizes.length - 1].widthPx / 2;\n\n // Total width includes base width plus overhangs\n const width = baseWidth + leftOverhang + rightOverhang;\n\n // Calculate title height offset\n let titleHeightOffset = 0;\n if (this.showTitle) {\n titleHeightOffset = this.state.titleFontSize + this.verticalSpacing;\n }\n\n // Calculate total height\n const rampBaseY = titleHeightOffset + maxLetterFont;\n const unitsSize = this.textSizeEstimator.getTextSize(this.state.aesthetic.state.inputUnits || \"\", this.state.labelFontSize);\n const height = rampBaseY + this.tickHeight + this.state.labelFontSize + unitsSize.heightPx;\n\n // Store coordinates for each element\n this.coordinates = {\n width,\n height,\n leftOverhang,\n title: {\n x: leftOverhang,\n y: this.state.titleFontSize,\n text: this.state.aesthetic.state.title\n },\n polygon: [],\n ticks: [],\n labels: [],\n units: {\n x: width / 2,\n y: height,\n text: this.state.aesthetic.state.inputUnits || \"\"\n }\n };\n\n // Calculate polygon and tick positions (offset by leftOverhang)\n ticks.forEach((tickValue, i) => {\n const x = leftOverhang + (i / (ticks.length - 1)) * baseWidth;\n\n // Tick marks\n this.coordinates.ticks.push({\n x1: x,\n y1: rampBaseY,\n x2: x,\n y2: rampBaseY + this.tickHeight\n });\n\n // Labels\n this.coordinates.labels.push({\n x,\n y: rampBaseY + this.tickHeight,\n text: formatTickLabel(tickValue, ticks)\n });\n });\n\n // Calculate polygon points (background shape) - offset by leftOverhang\n this.coordinates.polygon = [\n { x: leftOverhang, y: rampBaseY },\n { x: leftOverhang, y: rampBaseY - minLetterFont },\n { x: leftOverhang + baseWidth, y: rampBaseY - maxLetterFont },\n { x: leftOverhang + baseWidth, y: rampBaseY }\n ];\n }\n\n /**\n * Render the legend in the specified SVG element\n * @param {Selection} svg - D3 selection of the SVG element\n */\n render(svg) {\n super.render(svg);\n\n // Render title\n if (this.showTitle) {\n this.renderTitle(this.coordinates.title.text)\n .attr(\"x\", this.coordinates.title.x)\n .attr(\"y\", this.coordinates.title.y);\n }\n\n // Render background polygon\n const polygonPoints = this.coordinates.polygon\n .map(p => `${p.x},${p.y}`)\n .join(\" \");\n\n this.group.append(\"polygon\")\n .attr(\"points\", polygonPoints)\n .attr(\"fill\", \"#f0f0f0\")\n .attr(\"stroke\", \"#ccc\")\n .attr(\"stroke-width\", 1);\n\n // Render tick marks\n this.coordinates.ticks.forEach(tick => {\n this.group.append(\"line\")\n .attr(\"x1\", tick.x1)\n .attr(\"y1\", tick.y1)\n .attr(\"x2\", tick.x2)\n .attr(\"y2\", tick.y2)\n .attr(\"stroke\", \"#000\")\n .attr(\"stroke-width\", 1);\n });\n\n // Render labels\n this.coordinates.labels.forEach(label => {\n this.group.append(\"text\")\n .attr(\"x\", label.x)\n .attr(\"y\", label.y)\n .attr(\"text-anchor\", \"middle\")\n .attr(\"dominant-baseline\", \"hanging\")\n .style(\"font-size\", `${this.state.labelFontSize}px`)\n .text(label.text);\n });\n\n // Render units label\n if (this.coordinates.units.text) {\n this.group.append(\"text\")\n .attr(\"x\", this.coordinates.units.x)\n .attr(\"y\", this.coordinates.units.y)\n .attr(\"text-anchor\", \"middle\")\n .attr(\"dominant-baseline\", \"ideographic\")\n .style(\"font-size\", `${this.state.labelFontSize}px`)\n .style(\"font-style\", \"italic\")\n .text(this.coordinates.units.text);\n }\n }\n}\n\n/**\n * Legend for text color mappings\n * Shows how categorical or continuous input values map to text color in labels\n */\nexport class TextColorLegend extends LegendBase {\n constructor(options = {}) {\n super(options);\n this.exampleLetter = 'A';\n this.verticalSpacing = 5;\n this.horizontalSpacing = 10;\n this.showTitle = true;\n\n // Categorical-specific settings\n this.squareSize = 12;\n this.itemLabelGap = 5;\n this.itemGap = 15;\n this.maxCategoriesPerRow = 5;\n\n // Continuous-specific settings\n this.gradientHeight = 20;\n this.tickHeight = 5;\n this.numGradientStops = 20;\n }\n\n /**\n * Calculate the size and location of legend elements\n */\n updateCoordinates() {\n const aesthetic = this.state.aesthetic;\n const isCategorical = aesthetic.state.isCategorical;\n const titleSize = this.textSizeEstimator.getTextSize(aesthetic.state.title, this.state.titleFontSize);\n\n let titleHeightOffset = 0;\n if (this.showTitle) {\n titleHeightOffset = this.state.titleFontSize + this.verticalSpacing;\n }\n\n if (isCategorical) {\n this.#updateCoordinatesCategorical(titleHeightOffset, titleSize);\n } else {\n this.#updateCoordinatesContinuous(titleHeightOffset, titleSize);\n }\n }\n\n /**\n * Calculate coordinates for categorical color legend\n */\n #updateCoordinatesCategorical(titleHeightOffset, titleSize) {\n const aesthetic = this.state.aesthetic;\n const categories = aesthetic.scale.categories;\n const maxWidth = this.state.maxX - this.state.x;\n\n this.coordinates = {\n width: 0,\n height: titleHeightOffset,\n title: {\n x: 0,\n y: this.state.titleFontSize,\n text: aesthetic.state.title\n },\n items: [],\n isCategorical: true\n };\n\n let currentX = 0;\n let currentY = titleHeightOffset + this.verticalSpacing + this.squareSize / 2;\n let rowHeight = this.squareSize;\n\n categories.slice(0, aesthetic.scale.maxColors).forEach((category, i) => {\n const color = aesthetic.scale.getValue(category);\n const labelSize = this.textSizeEstimator.getTextSize(category, this.state.labelFontSize);\n const itemWidth = this.squareSize + this.itemLabelGap + labelSize.widthPx;\n\n // Check if we need to wrap to next row\n if (currentX > 0 && currentX + itemWidth > maxWidth) {\n currentX = 0;\n currentY += rowHeight + this.verticalSpacing;\n rowHeight = this.squareSize;\n }\n\n this.coordinates.items.push({\n x: currentX,\n y: currentY,\n color: color,\n label: i < aesthetic.scale.maxColors - 1 ? category : aesthetic.state.otherLabel,\n squareX: currentX,\n squareY: currentY - this.squareSize / 2,\n labelX: currentX + this.squareSize + this.itemLabelGap,\n labelY: currentY\n });\n\n currentX += itemWidth + this.itemGap;\n this.coordinates.width = Math.max(this.coordinates.width, currentX - this.itemGap);\n });\n\n this.coordinates.height = currentY + this.squareSize / 2;\n }\n\n /**\n * Calculate coordinates for continuous color legend\n */\n #updateCoordinatesContinuous(titleHeightOffset, titleSize) {\n const aesthetic = this.state.aesthetic;\n const minValue = aesthetic.scale.dataMin;\n const maxValue = aesthetic.scale.dataMax;\n\n // Generate nice tick values\n const ticks = generateNiceTicks(minValue, maxValue, 5);\n\n // Calculate width based on number of ticks\n const letterSpacing = 30;\n const baseWidth = Math.max(ticks.length * letterSpacing, 120);\n\n // Calculate tick label sizes to account for overhang\n const tickLabelSizes = ticks.map(tickValue => {\n const labelText = formatTickLabel(tickValue, ticks);\n return this.textSizeEstimator.getTextSize(labelText, this.state.labelFontSize);\n });\n\n // Calculate overhang on left (first tick label)\n const leftOverhang = tickLabelSizes[0].widthPx / 2;\n\n // Calculate overhang on right (last tick label)\n const rightOverhang = tickLabelSizes[tickLabelSizes.length - 1].widthPx / 2;\n\n // Total width includes base width plus overhangs\n const width = baseWidth + leftOverhang + rightOverhang;\n\n // Calculate positions\n const gradientY = titleHeightOffset + this.verticalSpacing;\n const ticksY = gradientY + this.gradientHeight;\n const labelsY = ticksY + this.tickHeight;\n\n // Calculate total height\n const unitsSize = this.textSizeEstimator.getTextSize(aesthetic.state.inputUnits || \"\", this.state.labelFontSize);\n const height = labelsY + this.state.labelFontSize + unitsSize.heightPx;\n\n this.coordinates = {\n width,\n height,\n leftOverhang,\n isCategorical: false,\n title: {\n x: leftOverhang,\n y: this.state.titleFontSize,\n text: aesthetic.state.title\n },\n gradient: {\n x: leftOverhang,\n y: gradientY,\n width: baseWidth,\n height: this.gradientHeight\n },\n ticks: [],\n labels: [],\n units: {\n x: width / 2,\n y: height,\n text: aesthetic.state.inputUnits || \"\"\n }\n };\n\n // Calculate tick positions\n ticks.forEach((tickValue, i) => {\n const x = leftOverhang + (i / (ticks.length - 1)) * baseWidth;\n\n // Tick marks\n this.coordinates.ticks.push({\n x1: x,\n y1: ticksY,\n x2: x,\n y2: ticksY + this.tickHeight\n });\n\n // Labels\n this.coordinates.labels.push({\n x,\n y: labelsY,\n text: formatTickLabel(tickValue, ticks)\n });\n });\n }\n\n /**\n * Render the legend in the specified SVG element\n * @param {Selection} svg - D3 selection of the SVG element\n */\n render(svg) {\n super.render(svg);\n\n // Render title\n if (this.showTitle) {\n this.renderTitle(this.coordinates.title.text)\n .attr(\"x\", this.coordinates.title.x)\n .attr(\"y\", this.coordinates.title.y);\n }\n\n if (this.coordinates.isCategorical) {\n this.#renderCategorical();\n } else {\n this.#renderContinuous();\n }\n }\n\n /**\n * Render categorical color legend\n */\n #renderCategorical() {\n // Render each category item\n this.coordinates.items.forEach(item => {\n // Color square\n this.group.append(\"rect\")\n .attr(\"x\", item.squareX)\n .attr(\"y\", item.squareY)\n .attr(\"width\", this.squareSize)\n .attr(\"height\", this.squareSize)\n .attr(\"fill\", item.color)\n .attr(\"stroke\", \"#000\")\n .attr(\"stroke-width\", 1);\n\n // Category label\n this.group.append(\"text\")\n .attr(\"x\", item.labelX)\n .attr(\"y\", item.labelY)\n .attr(\"text-anchor\", \"start\")\n .attr(\"dominant-baseline\", \"central\")\n .style(\"font-size\", `${this.state.labelFontSize}px`)\n .text(item.label);\n });\n }\n\n /**\n * Render continuous color legend\n */\n #renderContinuous() {\n const aesthetic = this.state.aesthetic;\n const minValue = aesthetic.scale.dataMin;\n const maxValue = aesthetic.scale.dataMax;\n\n // Create gradient definition\n const gradientId = `color-gradient-${Math.random().toString(36).substr(2, 9)}`;\n const defs = this.group.append(\"defs\");\n const gradient = defs.append(\"linearGradient\")\n .attr(\"id\", gradientId)\n .attr(\"x1\", \"0%\")\n .attr(\"x2\", \"100%\")\n .attr(\"y1\", \"0%\")\n .attr(\"y2\", \"0%\");\n\n // Add color stops\n for (let i = 0; i <= this.numGradientStops; i++) {\n const t = i / this.numGradientStops;\n const value = minValue + t * (maxValue - minValue);\n const color = aesthetic.scale.getValue(value);\n gradient.append(\"stop\")\n .attr(\"offset\", `${t * 100}%`)\n .attr(\"stop-color\", color);\n }\n\n // Draw gradient rectangle\n this.group.append(\"rect\")\n .attr(\"x\", this.coordinates.gradient.x)\n .attr(\"y\", this.coordinates.gradient.y)\n .attr(\"width\", this.coordinates.gradient.width)\n .attr(\"height\", this.coordinates.gradient.height)\n .style(\"fill\", `url(#${gradientId})`)\n .style(\"stroke\", \"#000\")\n .style(\"stroke-width\", 1);\n\n // Render tick marks\n this.coordinates.ticks.forEach(tick => {\n this.group.append(\"line\")\n .attr(\"x1\", tick.x1)\n .attr(\"y1\", tick.y1)\n .attr(\"x2\", tick.x2)\n .attr(\"y2\", tick.y2)\n .attr(\"stroke\", \"#000\")\n .attr(\"stroke-width\", 1);\n });\n\n // Render tick labels\n this.coordinates.labels.forEach(label => {\n this.group.append(\"text\")\n .attr(\"x\", label.x)\n .attr(\"y\", label.y)\n .attr(\"text-anchor\", \"middle\")\n .attr(\"dominant-baseline\", \"hanging\")\n .style(\"font-size\", `${this.state.labelFontSize}px`)\n .text(label.text);\n });\n\n // Render units label\n if (this.coordinates.units.text) {\n this.group.append(\"text\")\n .attr(\"x\", this.coordinates.units.x)\n .attr(\"y\", this.coordinates.units.y)\n .attr(\"text-anchor\", \"middle\")\n .attr(\"dominant-baseline\", \"ideographic\")\n .style(\"font-size\", `${this.state.labelFontSize}px`)\n .style(\"font-style\", \"italic\")\n .text(this.coordinates.units.text);\n }\n }\n}\n\n/**\n * Initialize the zoom indicator legend element\n * @param {Selection} legendDiv - D3 selection of the legend container\n * @param {Object} options - Configuration options\n * @returns {Object} Object containing the SVG and text elements, plus update function\n */\nexport function initZoomIndicator(legendDiv, options) {\n const zoomIndicatorDiv = legendDiv.append(\"div\")\n .attr(\"class\", \"ht-zoom-indicator\")\n .style(\"height\", `${options.legendElementHeight}px`)\n .style(\"flex\", \"0 0 auto\");\n const zoomIndicatorSvg = zoomIndicatorDiv.append(\"svg\")\n .attr(\"width\", 100)\n .attr(\"height\", options.legendElementHeight);\n const zoomIndicatorText = zoomIndicatorSvg.append(\"text\")\n .attr(\"x\", \"50%\")\n .attr(\"y\", \"50%\")\n .attr(\"text-anchor\", \"middle\")\n .attr(\"dominant-baseline\", \"central\")\n .style(\"font-size\", \"16px\")\n .style(\"fill\", \"#999\")\n .text(\"100%\");\n\n return {\n svg: zoomIndicatorSvg,\n text: zoomIndicatorText,\n update: (zoomLevel) => updateZoomIndicator(zoomIndicatorText, zoomLevel)\n };\n}\n\n/**\n * Update the zoom indicator text and color\n * @param {Selection} zoomIndicatorText - D3 selection of the text element\n * @param {number} zoomLevel - Current zoom level (1.0 = 100%)\n */\nfunction updateZoomIndicator(zoomIndicatorText, zoomLevel) {\n const percentage = Math.round(zoomLevel * 100);\n zoomIndicatorText\n .text(`Zoom: ${percentage}%`)\n .style(\"fill\", percentage === 100 ? \"#999\" : \"#000\");\n}\n\n/**\n * Initialize the scale bar legend element\n * @param {Selection} legendDiv - D3 selection of the legend container\n * @param {Object} options - Configuration options\n * @returns {Object} Object containing the SVG and group elements, plus update function\n */\nexport function initScaleBar(scaleBarSvg, options) {\n const scaleBarEdgeHeight = 6;\n const scaleBarGroup = scaleBarSvg.append(\"g\")\n const scaleBarLineGroup = scaleBarGroup.append(\"g\")\n .attr(\"stroke\", \"#000\")\n .attr(\"stroke-width\", 2)\n .attr(\"fill\", \"none\");\n scaleBarLineGroup.append(\"line\").attr(\"class\", \"bar\");\n scaleBarLineGroup.append(\"line\").attr(\"class\", \"left-tick\");\n scaleBarLineGroup.append(\"line\").attr(\"class\", \"right-tick\");\n scaleBarGroup.append(\"text\")\n .attr(\"class\", \"label\")\n .attr(\"dy\", -scaleBarEdgeHeight)\n .attr(\"text-anchor\", \"middle\")\n .style(\"font-size\", \"14px\");\n\n return {\n group: scaleBarGroup,\n update: (pxPerUnit) => updateScaleBar(scaleBarGroup, pxPerUnit, options)\n };\n}\n\nfunction updateScaleBar(scaleBarGroup, pxPerUnit, options) {\n if (!isFinite(pxPerUnit) || pxPerUnit <= 0) return;\n\n // choose an initial \"nice\" distance then adjust to keep bar within limits\n let units = niceNumber(1); // start from 1 unit\n let barPx = units * pxPerUnit;\n\n // expand / shrink until within [min,max] pixels\n if (barPx < options.scaleBarSize.min || barPx > options.scaleBarSize.max) {\n // estimate a closer starting length\n units = niceNumber(options.scaleBarSize.min / pxPerUnit);\n barPx = units * pxPerUnit;\n }\n while (barPx < options.scaleBarSize.min) {\n units *= 2;\n barPx = units * pxPerUnit;\n }\n while (barPx > options.scaleBarSize.max) {\n units /= 2;\n barPx = units * pxPerUnit;\n }\n\n // bar & ticks\n scaleBarGroup.select(\".bar\")\n .attr(\"x1\", 0).attr(\"y1\", 0)\n .attr(\"x2\", barPx).attr(\"y2\", 0);\n\n scaleBarGroup.select(\".left-tick\")\n .attr(\"x1\", 0).attr(\"y1\", -5)\n .attr(\"x2\", 0).attr(\"y2\", 5);\n\n scaleBarGroup.select(\".right-tick\")\n .attr(\"x1\", barPx).attr(\"y1\", -5)\n .attr(\"x2\", barPx).attr(\"y2\", 5);\n\n // centre label\n scaleBarGroup.select(\".label\")\n .attr(\"x\", barPx / 2)\n .text(units.toPrecision(3));\n}\n\n/**\n * Initialize the scale bar in the tree SVG (for export)\n * @param {Selection} treeSvg - D3 selection of the tree SVG group\n * @param {Object} options - Configuration options\n * @returns {Object} Object containing the group element and update function\n */\nexport function initTreeScaleBar(treeSvg, options) {\n const scaleBarEdgeHeight = 6;\n const scaleBarGroup = treeSvg.append(\"g\")\n .attr(\"class\", \"tree-scale-bar\")\n .attr(\"stroke\", \"#000\")\n .attr(\"stroke-width\", 2)\n .attr(\"fill\", \"none\");\n\n scaleBarGroup.append(\"line\").attr(\"class\", \"bar\");\n scaleBarGroup.append(\"line\").attr(\"class\", \"left-tick\");\n scaleBarGroup.append(\"line\").attr(\"class\", \"right-tick\");\n scaleBarGroup.append(\"text\")\n .attr(\"class\", \"label\")\n .attr(\"dy\", -scaleBarEdgeHeight)\n .attr(\"text-anchor\", \"middle\")\n .style(\"font-size\", \"14px\");\n\n return {\n group: scaleBarGroup,\n update: (pxPerUnit, bounds, options) => updateTreeScaleBar(scaleBarGroup, pxPerUnit, bounds, options)\n };\n}\n\n/**\n * Update the tree scale bar graphics and position\n * @param {Selection} scaleBarGroup - D3 selection of the scale bar group\n * @param {number} pxPerUnit - Current pixels per unit of branch length\n * @param {Object} bounds - Tree bounds object with minX, maxX, minY, maxY\n * @param {Object} options - Configuration options\n */\nfunction updateTreeScaleBar(scaleBarGroup, pxPerUnit, bounds, options) {\n if (!isFinite(pxPerUnit) || pxPerUnit <= 0) return;\n\n const scaleBarEdgeHeight = 6;\n const padding = 20;\n\n // choose an initial \"nice\" distance then adjust to keep bar within limits\n let units = niceNumber(1);\n let barPx = units * pxPerUnit;\n\n // expand / shrink until within [min,max] pixels\n if (barPx < options.scaleBarSize.min || barPx > options.scaleBarSize.max) {\n units = niceNumber(options.scaleBarSize.min / pxPerUnit);\n barPx = units * pxPerUnit;\n }\n while (barPx < options.scaleBarSize.min) {\n units *= 2;\n barPx = units * pxPerUnit;\n }\n while (barPx > options.scaleBarSize.max) {\n units /= 2;\n barPx = units * pxPerUnit;\n }\n\n // Position scale bar below and to the left of the tree\n const xPos = bounds.minX + padding;\n const yPos = bounds.maxY + padding + options.legendElementHeight;\n\n scaleBarGroup.attr(\"transform\", `translate(${xPos}, ${yPos})`);\n\n // bar & ticks\n scaleBarGroup.select(\".bar\")\n .attr(\"x1\", 0).attr(\"y1\", 0)\n .attr(\"x2\", barPx).attr(\"y2\", 0);\n\n scaleBarGroup.select(\".left-tick\")\n .attr(\"x1\", 0).attr(\"y1\", -5)\n .attr(\"x2\", 0).attr(\"y2\", 5);\n\n scaleBarGroup.select(\".right-tick\")\n .attr(\"x1\", barPx).attr(\"y1\", -5)\n .attr(\"x2\", barPx).attr(\"y2\", 5);\n\n // centre label\n scaleBarGroup.select(\".label\")\n .attr(\"x\", barPx / 2)\n .text(units.toPrecision(3));\n}\n\n/**\n * Initialize the leaf count legend element\n * @param {Selection} legendDiv - D3 selection of the legend container\n * @param {Object} options - Configuration options\n * @returns {Object} Object containing the SVG and text elements, plus update function\n */\nexport function initLeafCount(legendDiv, options) {\n const leafCountDiv = legendDiv.append(\"div\")\n .attr(\"class\", \"ht-leaf-count\")\n .style(\"height\", `${options.legendElementHeight}px`)\n .style(\"flex\", \"0 0 auto\");\n const leafCountSvg = leafCountDiv.append(\"svg\")\n .attr(\"width\", 100)\n .attr(\"height\", options.legendElementHeight);\n const leafCountText = leafCountSvg.append(\"text\")\n .attr(\"x\", \"50%\")\n .attr(\"y\", \"50%\")\n .attr(\"text-anchor\", \"middle\")\n .attr(\"dominant-baseline\", \"central\")\n .style(\"font-size\", \"16px\")\n .style(\"fill\", \"#000\")\n .text(\"Leaves: 0\");\n\n return {\n svg: leafCountSvg,\n text: leafCountText,\n update: (visibleLeaves, totalLeaves) => updateLeafCount(leafCountSvg, leafCountText, visibleLeaves, totalLeaves)\n };\n}\n\n/**\n * Update the leaf count text\n * @param {Selection} leafCountSvg - D3 selection of the SVG element\n * @param {Selection} leafCountText - D3 selection of the text element\n * @param {number} visibleLeaves - Number of currently visible leaves (excluding collapsed placeholders)\n * @param {number} totalLeaves - Total number of leaves in the full tree\n */\nfunction updateLeafCount(leafCountSvg, leafCountText, visibleLeaves, totalLeaves) {\n let text;\n if (visibleLeaves === totalLeaves) {\n text = `Leaves: ${totalLeaves}`;\n } else {\n text = `Leaves: ${visibleLeaves}/${totalLeaves}`;\n }\n\n leafCountText.text(text);\n\n //Adjust SVG width to fit text\n const bbox = leafCountText.node().getBBox();\n leafCountSvg.attr(\"width\", bbox.width + 20);\n}\n\n/**\n * Initialize the color legend element\n * @param {Selection} parentSvg - D3 selection of the parent SVG\n * @param {Object} options - Configuration options\n * @returns {Object} Object containing the group element and update function\n */\nexport function initColorLegend(parentSvg, options) {\n const colorLegendGroup = parentSvg.append(\"g\")\n .attr(\"class\", \"ht-color-legend\")\n .style(\"display\", \"none\");\n\n return {\n group: colorLegendGroup,\n update: (colorScale, columnName, columnType) => updateColorLegend(colorLegendGroup, colorScale, columnName, columnType, options)\n };\n}\n\n/**\n * Update the color legend based on the current color scale\n * @param {Selection} colorLegendGroup - D3 selection of the legend group\n * @param {Function} colorScale - D3 color scale (linear or ordinal)\n * @param {string} columnName - Name of the metadata column being visualized\n * @param {string} columnType - Type of column ('continuous' or 'categorical')\n * @param {Object} options - Configuration options\n */\nfunction updateColorLegend(colorLegendGroup, colorScale, columnName, columnType, options) {\n // Clear existing content\n colorLegendGroup.selectAll(\"*\").remove();\n\n // Hide if no color scale\n if (!colorScale || !columnName) {\n colorLegendGroup.style(\"display\", \"none\");\n return;\n }\n\n colorLegendGroup.style(\"display\", \"block\");\n\n let currentX = 0;\n const verticalCenter = options.legendElementHeight / 2;\n\n // Add column name label\n const columnLabel = colorLegendGroup.append(\"text\")\n .attr(\"x\", currentX)\n .attr(\"y\", verticalCenter)\n .attr(\"dominant-baseline\", \"central\")\n .style(\"font-size\", `${this.state.labelFontSize}px`)\n .text(columnToHeader(columnName) + \":\");\n\n const columnLabelBBox = columnLabel.node().getBBox();\n currentX += columnLabelBBox.width + 5;\n\n if (columnType === 'continuous') {\n // Create continuous gradient legend\n const legendWidth = 150;\n const tickHeight = 4;\n const tickLabelFontSize = 10;\n const labelPadding = 2;\n const barHeight = options.legendElementHeight - tickHeight - tickLabelFontSize - labelPadding;\n const leftMargin = 15;\n\n const legendGroup = colorLegendGroup.append(\"g\")\n .attr(\"transform\", `translate(${currentX}, 0)`);\n\n // Get domain values\n const domain = colorScale.domain();\n const minVal = domain[0];\n const maxVal = domain[1];\n\n // Generate nice tick values\n const ticks = generateNiceTicks(minVal, maxVal, 4);\n\n // Create gradient definition\n const defs = colorLegendGroup.append(\"defs\");\n const gradient = defs.append(\"linearGradient\")\n .attr(\"id\", \"color-gradient\")\n .attr(\"x1\", \"0%\")\n .attr(\"x2\", \"100%\");\n\n // Add color stops\n const numStops = 10;\n for (let i = 0; i <= numStops; i++) {\n const t = i / numStops;\n gradient.append(\"stop\")\n .attr(\"offset\", `${t * 100}%`)\n .attr(\"stop-color\", interpolateViridisSubset(t));\n }\n\n // Draw gradient rectangle\n legendGroup.append(\"rect\")\n .attr(\"x\", leftMargin)\n .attr(\"y\", 0)\n .attr(\"width\", legendWidth)\n .attr(\"height\", barHeight)\n .style(\"fill\", \"url(#color-gradient)\")\n .style(\"stroke\", \"#000\")\n .style(\"stroke-width\", 1);\n\n // Add tick marks and labels\n ticks.forEach(tickValue => {\n // Calculate position along the bar (0 to 1)\n const t = (tickValue - minVal) / (maxVal - minVal);\n const x = leftMargin + t * legendWidth;\n\n // Draw tick mark\n legendGroup.append(\"line\")\n .attr(\"x1\", x)\n .attr(\"y1\", barHeight)\n .attr(\"x2\", x)\n .attr(\"y2\", barHeight + tickHeight)\n .attr(\"stroke\", \"#000\")\n .attr(\"stroke-width\", 1);\n\n // Draw label\n legendGroup.append(\"text\")\n .attr(\"x\", x)\n .attr(\"y\", barHeight + tickHeight + labelPadding)\n .attr(\"text-anchor\", \"middle\")\n .attr(\"dominant-baseline\", \"hanging\")\n .style(\"font-size\", `${tickLabelFontSize}px`)\n .text(formatTickLabel(tickValue, ticks));\n });\n\n } else {\n // Create categorical legend\n const categories = colorScale.domain();\n const maxCategoriesToShow = 10;\n const categoriesToShow = categories.slice(0, maxCategoriesToShow);\n\n const itemGap = 8;\n const squareSize = 12;\n const itemLabelGap = 3;\n const itemFontSize = 12;\n const maxWidth = 500;\n\n let currentY = verticalCenter;\n\n categoriesToShow.forEach(category => {\n const itemGroup = colorLegendGroup.append(\"g\")\n .attr(\"transform\", `translate(${currentX}, ${currentY})`);\n\n // Color square\n itemGroup.append(\"rect\")\n .attr(\"x\", 0)\n .attr(\"y\", -squareSize / 2)\n .attr(\"width\", squareSize)\n .attr(\"height\", squareSize)\n .style(\"fill\", colorScale(category))\n .style(\"stroke\", \"#000\")\n .style(\"stroke-width\", 1);\n\n // Category label\n const label = itemGroup.append(\"text\")\n .attr(\"x\", squareSize + itemLabelGap)\n .attr(\"y\", 0)\n .attr(\"dominant-baseline\", \"central\")\n .style(\"font-size\", `${itemFontSize}px`)\n .text(category);\n\n const itemGroupExtent = itemGroup.node().getBBox().width + itemGap;\n\n if (itemGroupExtent + currentX > maxWidth) {\n currentX = columnLabelBBox.width + 5;\n currentY = currentY + options.legendElementHeight;\n }\n\n itemGroup.attr(\"transform\", `translate(${currentX}, ${currentY})`);\n currentX += itemGroupExtent;\n });\n\n if (categories.length > maxCategoriesToShow) {\n const moreText = colorLegendGroup.append(\"text\")\n .attr(\"dominant-baseline\", \"central\")\n .style(\"font-size\", `${itemFontSize}px`)\n .style(\"font-style\", \"italic\")\n .text(`(+${categories.length - maxCategoriesToShow} more)`);\n\n const moreTextExtent = moreText.node().getBBox().width + itemGap;\n if (moreTextExtent + currentX > maxWidth) {\n currentX = columnLabelBBox.width + 5;\n currentY = currentY + options.legendElementHeight;\n }\n\n moreText.attr(\"transform\", `translate(${currentX}, ${currentY})`);\n }\n }\n}\n","import { select, symbol, symbolTriangle, zoom, zoomIdentity } from 'd3';\nimport { triangleAreaFromSide, calculateTreeBounds, createDashArray } from './utils.js';\nimport { appendIcon } from './icons.js';\nimport { TextSizeLegend, TextColorLegend, BranchLengthLegend } from './legends.js';\n\nexport class TreeView {\n constructor(treeState, svgContainer, options = {}) {\n // Validate inputs\n if (!treeState) {\n throw new Error('TreeView requires a TreeState instance');\n }\n if (!svgContainer) {\n throw new Error('TreeView requires an SVG container element');\n }\n\n // Store reference to the TreeState instance\n this.treeState = treeState;\n\n // Store reference to the main SVG container\n this.svg = select(svgContainer);\n\n // Store options\n this.options = {\n buttonSize: 25,\n controlsMargin: 3,\n buttonPadding: 2,\n manualZoomAndPanEnabled: true,\n autoZoom: 'Default',\n autoPan: 'Default',\n transitionDuration: 500,\n legendSpacing: 10,\n legendPadding: 10,\n ...options\n };\n\n // Object containing references to SVG layers\n this.layers = {};\n\n // Object containing D3 selections for reusable elements\n this.selections = {};\n\n // Array of legend instances\n this.legendInstances = [];\n\n // Current zoom/pan transform\n this.currentTransform = { x: 0, y: 0, k: 1 };\n\n // Flag to prevent overlapping transitions\n this.isTransitioning = false;\n\n // Track previous layout state to detect transitions\n this.wasCircularLayout = this.treeState.state.layout === 'circular';\n\n // Track if we're expanding a subtree (for delayed fade-in)\n this.isExpanding = false;\n\n // Store references to active transitions for cancellation\n this.activeTransitions = new Set();\n\n // Currently selected node (can be subtree or tip)\n this.selectedNode = null;\n\n // Define selection buttons configuration\n this.selectionButtons = [\n {\n id: 'collapse-subtree',\n icon: 'compress',\n isVisible: (node) => {\n return node && node !== this.treeState.displayedRoot && (node.children || node.collapsedChildren);\n },\n onClick: (node) => {\n if (node && node !== this.treeState.displayedRoot && node.children) {\n this.treeState.collapseSubtree(node);\n this.#clearSelection();\n }\n }\n },\n {\n id: 'collapse-root',\n icon: 'expand',\n isVisible: (node) => {\n return node && node !== this.treeState.displayedRoot && (node.children || node.collapsedChildren);\n },\n onClick: (node) => {\n if (node && node !== this.treeState.displayedRoot && node.children) {\n this.treeState.collapseRoot(node);\n this.#clearSelection();\n }\n }\n },\n {\n id: 'hide',\n icon: 'trash',\n isVisible: (node) => {\n return node && node !== this.treeState.displayedRoot;\n },\n onClick: (node) => {\n if (node && node !== this.treeState.displayedRoot) {\n this.treeState.hideSubtree(node);\n this.#clearSelection();\n }\n }\n }\n ];\n\n // Initialize SVG layers\n this.#initializeLayers();\n\n // Initialize zoom behavior\n this.initializeZoom();\n\n // Subscribe to TreeState events\n this.#subscribeToStateChanges();\n\n // Perform initial render\n this.#initialRender();\n }\n\n /**\n * Destroy the TreeView and clean up DOM elements\n */\n destroy() {\n // Clear all SVG content\n this.svg.selectAll('*').remove();\n\n // Clear references\n this.layers = {};\n this.selections = {};\n this.selectedNode = null;\n this.legendInstances = [];\n }\n\n /**\n * Reattach the TreeView to a new SVG container\n * @param {SVGElement} svgContainer - New SVG container element\n */\n reattach(svgContainer) {\n // Update SVG reference\n this.svg = select(svgContainer);\n\n // Reinitialize layers\n this.#initializeLayers();\n\n // Reinitialize zoom behavior\n this.initializeZoom();\n\n // Re-render without transition\n this.#updateBranches(false);\n this.#updateNodes(false);\n this.#updateHitAreas(false);\n this.#updateLegends(false);\n this.fitToView({ transition: false, forcePanToTop: true });\n }\n\n /**\n * Initialize SVG layers for branches, nodes, hit areas, and UI overlays\n */\n #initializeLayers() {\n const treeGroup = this.svg.append('g')\n .attr('class', 'tree-elements');\n this.layers.branchLayer = treeGroup.append('g')\n .attr('class', 'branch-layer');\n this.layers.nodeLayer = treeGroup.append('g')\n .attr('class', 'node-layer');\n this.layers.hitLayer = treeGroup.append('g')\n .attr('class', 'hit-layer');\n this.layers.legendLayer = treeGroup.append('g')\n .attr('class', 'legend-layer');\n this.layers.treeGroup = treeGroup;\n\n // Selection rectangle (shown when a subtree or tip is selected)\n this.layers.selectionRect = treeGroup.append('path')\n .attr('class', 'selection-rect')\n .attr('fill', 'none')\n .attr('stroke', 'grey')\n .attr('stroke-width', 2)\n .attr('stroke-dasharray', '5,5')\n .attr('pointer-events', 'none')\n .style('display', 'none');\n\n // Floating button group for subtree/tip actions (added to outer SVG so it ignores zoom)\n this.layers.selectionBtns = this.svg.append('g')\n .attr('class', 'selection-btns')\n .style('display', 'none');\n\n // Create selection buttons\n this.#createSelectionButtons();\n }\n\n #clearSelection() {\n this.selectedNode = null;\n this.layers.selectionRect.style('display', 'none');\n this.layers.selectionBtns.style('display', 'none');\n }\n\n /**\n * Create floating buttons for subtree/tip actions\n */\n #createSelectionButtons() {\n const btnGroup = this.layers.selectionBtns;\n\n // Create buttons from configuration\n this.selectionButtons.forEach((buttonConfig) => {\n const btn = btnGroup.append('svg')\n .attr('class', `btn-${buttonConfig.id}`)\n .attr('width', this.options.buttonSize)\n .attr('height', this.options.buttonSize)\n .style('cursor', 'pointer')\n .on('click', () => {\n buttonConfig.onClick(this.selectedNode);\n });\n\n appendIcon(btn, buttonConfig.icon, this.options.buttonSize);\n\n // Store reference to button element in config\n buttonConfig.element = btn;\n });\n }\n\n /**\n * Initialize zoom and pan behavior\n */\n initializeZoom() {\n this.treeZoom = zoom()\n .filter(event => {\n if (!this.options.manualZoomAndPanEnabled) return false;\n if (event.type === 'dblclick') return false;\n return true;\n })\n .on('zoom', (event) => {\n this.currentTransform = event.transform;\n this.layers.treeGroup.attr('transform', event.transform);\n this.#updateSelectionButtons(event.sourceEvent === null);\n });\n\n this.svg.call(this.treeZoom);\n }\n\n /**\n * Subscribe to TreeState events and set up event handlers\n */\n #subscribeToStateChanges() {\n // Subscribe to coordinate changes (position updates)\n this.treeState.subscribe('coordinateChange', () => {\n this.#handleCoordinateChange();\n });\n\n // Subscribe to layout changes (rectangular <-> circular)\n this.treeState.subscribe('layoutChange', () => {\n this.#handleCoordinateChange();\n });\n\n // Subscribe to legend changes\n this.treeState.subscribe('legendsChange', () => {\n this.#updateLegends(true);\n });\n\n // Subscribe to aesthetic changes\n this.treeState.subscribe('tipLabelTextChange', () => {\n this.#updateTipLabelText();\n });\n\n this.treeState.subscribe('tipLabelColorChange', () => {\n this.#updateTipLabelColor();\n });\n\n this.treeState.subscribe('tipLabelSizeChange', () => {\n this.#updateTipLabelSize();\n this.#updateLegends(true);\n });\n\n this.treeState.subscribe('tipLabelFontChange', () => {\n this.#updateTipLabelFont();\n });\n\n this.treeState.subscribe('tipLabelStyleChange', () => {\n this.#updateTipLabelStyle();\n });\n\n this.treeState.subscribe('nodeLabelTextChange', () => {\n this.#updateNodeLabelText();\n });\n }\n\n /**\n * Perform initial render without transitions\n */\n #initialRender() {\n this.#updateBranches(false);\n this.#updateNodes(false);\n this.#updateHitAreas(false);\n this.#updateLegends(false);\n this.fitToView({ transition: false, forcePanToTop: true });\n }\n\n /**\n * Handle coordinate changes from TreeState\n */\n #handleCoordinateChange() {\n\n // Update branches, nodes, and hit areas with transition\n const branchGroupsEnter = this.#updateBranches(true);\n const nodeGroupsEnter = this.#updateNodes(true);\n this.#updateHitAreas(true);\n this.#updateLegends(true);\n\n // Update selection rectangle if a node is selected\n if (this.selectedNode) {\n this.#updateSelectionRect(true);\n }\n\n // Handle delayed fade-in for expanded subtrees\n if (this.isExpanding && branchGroupsEnter && nodeGroupsEnter) {\n // Wait for the main transition to complete, then fade in\n setTimeout(() => {\n branchGroupsEnter\n .transition('branch group fade in')\n .duration(150)\n .attr('opacity', 1);\n\n nodeGroupsEnter\n .transition('node group fade in')\n .duration(150)\n .attr('opacity', 1);\n\n this.layers.selectionBtns\n .attr('opacity', 0)\n .transition('fade in selection buttons')\n .duration(150)\n .attr('opacity', 1);\n\n // Reset expanding flag after fade-in completes\n setTimeout(() => {\n this.isExpanding = false;\n }, 150);\n }, this.options.transitionDuration);\n }\n\n // Auto-fit if enabled\n this.fitToView();\n }\n\n /**\n * Update tip label text attribute\n */\n #updateTipLabelText() {\n if (!this.selections.nodes) return;\n\n this.selections.nodes.selectAll('.tip-label')\n .text(d => d.tipLabelText || '');\n }\n\n /**\n * Update tip label color attribute\n */\n #updateTipLabelColor() {\n if (!this.selections.nodes) return;\n\n this.selections.nodes.selectAll('.tip-label')\n .style('fill', d => d.tipLabelColor || '#000');\n }\n\n /**\n * Update tip label size attribute\n */\n #updateTipLabelSize() {\n if (!this.selections.nodes) return;\n\n this.selections.nodes.selectAll('.tip-label')\n .style('font-size', d => `${d.tipLabelSizePx || 12}px`);\n }\n\n /**\n * Update tip label font attributes\n * This function handles font-family\n */\n #updateTipLabelFont() {\n if (!this.selections.nodes) return;\n\n this.selections.nodes.selectAll('.tip-label')\n .style('font-family', d => d.tipLabelFont || 'sans-serif');\n }\n\n /**\n * Update tip label style attributes\n * This function handles font-style\n */\n #updateTipLabelStyle() {\n if (!this.selections.nodes) return;\n\n this.selections.nodes.selectAll('.tip-label')\n .style('font-style', d => d.tipLabelStyle.includes('italic') ? 'italic' : 'normal')\n .style('font-weight', d => d.tipLabelStyle.includes('bold') ? 'bold' : 'normal');\n }\n\n /**\n * Update node label text attribute\n */\n #updateNodeLabelText() {\n if (!this.selections.nodes) return;\n\n this.selections.nodes.selectAll('.node-label')\n .text(d => d.nodeLabelText || '');\n }\n\n /**\n * Update legends based on current TreeState\n * @param {boolean} transition - Whether to animate the update\n */\n #updateLegends(transition = true) {\n // Clear existing legend instances\n this.layers.legendLayer.selectAll('*').remove();\n this.legendInstances = [];\n\n // Get tree bounds\n const treeBounds = this.#getCurrentBounds();\n if (!treeBounds) return;\n\n // Get available width (tree width)\n const availableWidth = treeBounds.maxX - treeBounds.minX;\n\n // Starting position for legends (below tree)\n let currentX = treeBounds.minX;\n let currentY = treeBounds.maxY + this.options.legendSpacing;\n\n // Always add branch length legend first\n const branchLengthLegend = new BranchLengthLegend({\n treeState: this.treeState,\n x: currentX,\n y: currentY,\n origin: 'top left',\n maxX: treeBounds.maxX,\n maxY: Infinity\n });\n\n branchLengthLegend.render(this.layers.legendLayer);\n this.legendInstances.push(branchLengthLegend);\n\n // Update position for next legend\n currentX += branchLengthLegend.coordinates.width + this.options.legendSpacing;\n\n // Process each legend from TreeState\n for (const legendData of this.treeState.legends) {\n\n // Create appropriate legend type\n let legend;\n if (legendData.type === 'size') {\n legend = new TextSizeLegend({\n treeState: this.treeState,\n aesthetic: legendData.aesthetic,\n x: currentX,\n y: currentY,\n origin: 'top left',\n maxX: treeBounds.maxX,\n maxY: Infinity\n });\n } else if (legendData.type === 'color') {\n legend = new TextColorLegend({\n treeState: this.treeState,\n aesthetic: legendData.aesthetic,\n x: currentX,\n y: currentY,\n origin: 'top left',\n maxX: treeBounds.maxX,\n maxY: Infinity\n });\n }\n\n if (currentX + legend.coordinates.width + this.options.legendSpacing > treeBounds.maxX) {\n currentX = treeBounds.minX;\n currentY += Math.max(...this.legendInstances.map(x => x.coordinates.height));\n }\n\n if (legend) {\n // Render the legend\n legend.render(this.layers.legendLayer);\n this.legendInstances.push(legend);\n\n // Update position for next legend\n currentX += legend.coordinates.width + this.options.legendSpacing;\n }\n }\n this.fitToView({ transition });\n }\n\n /**\n * Fit the tree to the view with optional transition\n * @param {boolean} transition - Whether to animate the fit\n */\n fitToView(input) {\n input = {\n transition: true,\n padding: 5,\n autoZoom: this.options.autoZoom,\n autoPan: this.options.autoPan,\n forcePanToTop: false,\n ...input\n }\n\n if ((!input.autoZoom || input.autoZoom == \"None\") && (!input.autoPan || input.autoPan == \"None\")) {\n return;\n }\n\n const { width: viewW, height: viewH } = this.svg.node().getBoundingClientRect();\n\n // Calculate bounds of all tree elements (including legends)\n const bounds = this.getCurrentBoundsWithLegends();\n if (!bounds) return;\n\n // Apply padding\n bounds.minX -= input.padding;\n bounds.maxX += input.padding;\n bounds.minY -= input.padding;\n bounds.maxY += input.padding;\n\n const treeWidth = bounds.maxX - bounds.minX;\n const treeHeight = bounds.maxY - bounds.minY;\n\n // Left margin for control buttons\n const marginLeft = 0;\n\n // Available space\n const availableWidth = viewW - marginLeft;\n const availableHeight = viewH;\n\n // Calculate scale to fit tree within available space\n let scale = this.currentTransform.k;\n let tx = this.currentTransform.x;\n let ty = this.currentTransform.y;\n\n // Apply auto-zoom if enabled\n const scaleX = availableWidth / treeWidth;\n const scaleY = availableHeight / treeHeight;\n if (input.autoZoom == 'Default') {\n if (this.treeState.state.layout == 'circular' || scaleY >= 1 || !this.options.manualZoomAndPanEnabled) {\n input.autoZoom = 'Both';\n } else {\n input.autoZoom = 'X';\n }\n }\n if (input.autoZoom && input.autoZoom != \"None\") {\n if (input.autoZoom == \"X\") {\n scale = Math.min(1, scaleX);\n } else if (input.autoZoom == \"Y\") {\n scale = Math.min(1, scaleY);\n } else if (input.autoZoom == \"Both\") {\n scale = Math.min(scaleX, scaleY);\n } else {\n console.error(`Value of ${input.autoZoom} is invalid for input.autoZoom.`);\n }\n }\n\n // Apply auto-pan if enabled\n if (input.autoPan == 'Default') {\n input.autoPan = 'Both';\n }\n if (input.autoPan && input.autoPan != \"None\") {\n if (input.autoPan == 'Both' || input.autoPan == 'X') {\n const scaledTreeWidth = treeWidth * scale;\n if (scaledTreeWidth <= availableWidth) {\n // Tree fits horizontally - center it\n tx = marginLeft + (availableWidth - scaledTreeWidth) / 2 - bounds.minX * scale;\n } else {\n // Tree doesn't fit - minimize unused space\n const leftSpace = -bounds.minX * scale - marginLeft;\n const rightSpace = viewW - bounds.maxX * scale;\n\n if (leftSpace > 0) {\n // Unused space on left - shift right\n tx = marginLeft - bounds.minX * scale;\n } else if (rightSpace > 0) {\n // Unused space on right - shift left\n tx = viewW - bounds.maxX * scale;\n } else {\n // No unused space - keep current pan or center\n tx = marginLeft + availableWidth / 2 - (bounds.minX + bounds.maxX) / 2 * scale;\n }\n }\n }\n\n if (input.autoPan == 'Both' || input.autoPan == 'Y') {\n const scaledTreeHeight = treeHeight * scale;\n if (scaledTreeHeight <= availableHeight) {\n // Tree fits vertically - center it\n ty = (availableHeight - scaledTreeHeight) / 2 - bounds.minY * scale;\n } else {\n // Tree doesn't fit - minimize unused space\n const topSpace = -bounds.minY * scale;\n const bottomSpace = viewH - bounds.maxY * scale;\n if (ty > topSpace || input.forcePanToTop) {\n ty = topSpace;\n } else if (ty < bottomSpace) {\n ty = bottomSpace;\n }\n }\n }\n\n }\n\n const transform = zoomIdentity.translate(tx, ty).scale(scale);\n\n // Apply through zoom behavior\n if (input.transition) {\n this.svg.transition('zoom')\n .duration(this.options.transitionDuration)\n .call(this.treeZoom.transform, transform);\n } else {\n this.svg.call(this.treeZoom.transform, transform);\n }\n }\n\n /**\n * Get current tree bounds\n * @returns {Object} Bounds object with minX, maxX, minY, maxY\n */\n #getCurrentBounds() {\n const root = this.treeState.displayedRoot;\n return {\n minX: root.bounds.minX,\n maxX: root.bounds.maxX,\n minY: root.bounds.minY,\n maxY: root.bounds.maxY\n };\n }\n\n /**\n * Get current bounds including legends\n * @returns {Object} Bounds object with minX, maxX, minY, maxY\n */\n getCurrentBoundsWithLegends() {\n const treeBounds = this.#getCurrentBounds();\n if (!treeBounds) return null;\n\n let maxY = treeBounds.maxY;\n let minX = treeBounds.minX;\n\n // Add legend heights\n for (const legend of this.legendInstances) {\n if (legend.coordinates) {\n maxY = Math.max(maxY, legend.state.y + legend.coordinates.height);\n }\n }\n\n // Add width of collapsed parent branch line\n if (this.treeState.state.layout !== 'circular' && this.treeState.displayedRoot.collapsedParent) {\n minX -= this.#getCollapsedRootLineLength();\n }\n\n return {\n minX,\n maxX: treeBounds.maxX,\n minY: treeBounds.minY,\n maxY\n };\n }\n\n /**\n * Select or deselect a node (subtree or tip)\n * @param {Object} node - Tree node to select\n */\n #selectNode(node) {\n if (this.selectedNode === node) {\n this.#clearSelection();\n } else {\n // Select\n this.selectedNode = node;\n this.layers.selectionRect\n .attr('d', this.#generateSelectionPath(node))\n .style('display', 'block');\n this.#updateSelectionButtons(false);\n }\n }\n\n /**\n * Update selection rectangle with optional transition\n * @param {boolean} transition - Whether to animate the update\n */\n #updateSelectionRect(transition = false) {\n if (!this.selectedNode) {\n return;\n }\n\n if (transition) {\n this.layers.selectionRect\n .transition('update selection rect')\n .duration(this.options.transitionDuration)\n .attr('d', this.#generateSelectionPath(this.selectedNode));\n } else {\n this.layers.selectionRect\n .attr('d', this.#generateSelectionPath(this.selectedNode));\n }\n }\n\n /**\n * Generate selection rectangle path for a node (subtree or tip)\n * @param {Object} node - Tree node\n * @returns {string} SVG path string\n */\n #generateSelectionPath(node) {\n if (!node) return '';\n\n const isCircular = this.treeState.state.layout === 'circular';\n\n if (isCircular) {\n const innerStart = {\n x: node.bounds.minRadius * Math.cos(node.bounds.minAngle),\n y: node.bounds.minRadius * Math.sin(node.bounds.minAngle)\n };\n const innerEnd = {\n x: node.bounds.minRadius * Math.cos(node.bounds.maxAngle),\n y: node.bounds.minRadius * Math.sin(node.bounds.maxAngle)\n };\n const outerStart = {\n x: node.bounds.maxRadius * Math.cos(node.bounds.minAngle),\n y: node.bounds.maxRadius * Math.sin(node.bounds.minAngle)\n };\n const outerEnd = {\n x: node.bounds.maxRadius * Math.cos(node.bounds.maxAngle),\n y: node.bounds.maxRadius * Math.sin(node.bounds.maxAngle)\n };\n\n const largeArcFlag = (node.bounds.maxAngle - node.bounds.minAngle) > Math.PI ? 1 : 0;\n\n return `M${innerStart.x},${innerStart.y} L${outerStart.x},${outerStart.y} A${node.bounds.maxRadius},${node.bounds.maxRadius} 0 ${largeArcFlag},1 ${outerEnd.x},${outerEnd.y} L${innerEnd.x},${innerEnd.y} A${node.bounds.minRadius},${node.bounds.minRadius} 0 ${largeArcFlag},0 ${innerStart.x},${innerStart.y} Z`;\n } else {\n const topLeft = { x: node.bounds.minX, y: node.bounds.minY };\n const topRight = { x: node.bounds.maxX, y: node.bounds.minY };\n const bottomRight = { x: node.bounds.maxX, y: node.bounds.maxY };\n const bottomLeft = { x: node.bounds.minX, y: node.bounds.maxY };\n\n return `M${topLeft.x},${topLeft.y} L${topRight.x},${topRight.y} L${bottomRight.x},${bottomRight.y} L${bottomLeft.x},${bottomLeft.y} L${topLeft.x},${topLeft.y} Z`;\n }\n }\n\n /**\n * Update selection buttons position and visibility\n * @param {boolean} transition - Whether to animate the update\n */\n #updateSelectionButtons(transition = true, controlsMarginFactor = 1.1) {\n if (!this.selectedNode) {\n this.layers.selectionBtns.style('display', 'none');\n return;\n }\n\n const isCircular = this.treeState.state.layout === 'circular';\n let x, y;\n\n if (isCircular) {\n // For circular layout, find the leftmost point\n const minAngle = this.selectedNode.bounds.minAngle;\n const maxAngle = this.selectedNode.bounds.maxAngle;\n const minRadius = this.selectedNode.bounds.minRadius;\n const maxRadius = this.selectedNode.bounds.maxRadius;\n\n const numSamples = 20;\n let minX = Infinity;\n let minXY = 0;\n\n for (let i = 0; i <= numSamples; i++) {\n const angle = minAngle + (maxAngle - minAngle) * i / numSamples;\n\n const innerX = minRadius * Math.cos(angle);\n const innerY = minRadius * Math.sin(angle);\n const outerX = maxRadius * Math.cos(angle);\n const outerY = maxRadius * Math.sin(angle);\n\n if (innerX < minX) {\n minX = innerX;\n minXY = innerY;\n }\n if (outerX < minX) {\n minX = outerX;\n minXY = outerY;\n }\n }\n\n x = minX;\n y = minXY;\n } else {\n x = this.selectedNode.bounds.minX;\n y = this.selectedNode.bounds.minY;\n }\n\n // Update button visibility and positions based on configuration\n let visibleButtonIndex = 0;\n this.selectionButtons.forEach((buttonConfig) => {\n const isVisible = buttonConfig.isVisible(this.selectedNode);\n\n if (isVisible) {\n // Calculate position for this visible button\n const yOffset = visibleButtonIndex * (this.options.buttonSize * controlsMarginFactor);\n buttonConfig.element\n .style('display', 'block')\n .attr('transform', `translate(0, ${yOffset})`);\n visibleButtonIndex++;\n } else {\n buttonConfig.element.style('display', 'none');\n }\n });\n\n // Calculate total height of visible buttons\n const totalButtonHeight = visibleButtonIndex * this.options.buttonSize +\n (visibleButtonIndex - 1) * this.options.buttonSize * (controlsMarginFactor - 1);\n\n // Calculate screen position\n let screenX = x * this.currentTransform.k + this.currentTransform.x - this.options.buttonSize * controlsMarginFactor;\n let screenY = y * this.currentTransform.k + this.currentTransform.y - this.options.buttonSize * (controlsMarginFactor - 1);\n\n // Keep within viewable area\n const { width: viewW, height: viewH } = this.svg.node().getBoundingClientRect();\n screenX = Math.max(screenX, 0);\n screenX = Math.min(screenX, viewW - this.options.buttonSize);\n screenY = Math.max(screenY, 0);\n screenY = Math.min(screenY, viewH - totalButtonHeight);\n\n if (transition) {\n // Hide buttons immediately, then move and fade in after transition\n this.layers.selectionBtns\n .attr('opacity', 0)\n .attr('transform', `translate(${screenX},${screenY})`);\n } else {\n this.layers.selectionBtns\n .attr('transform', `translate(${screenX},${screenY})`)\n .attr('opacity', 1)\n .style('display', 'block');\n }\n }\n\n /**\n * Update hit areas for interaction\n */\n #updateHitAreas() {\n const root = this.treeState.displayedRoot;\n if (!root) return;\n\n const isCircular = this.treeState.state.layout === 'circular';\n const branchWidth = this.treeState.labelSizeToPxFactor * this.treeState.state.branchThicknessProp;\n const collapsedRootLineLength = this.#getCollapsedRootLineLength();\n\n // Update hit areas for subtree selection (internal nodes with children and more than one visible child)\n const hits = this.layers.hitLayer.selectAll('.hit')\n .data(root.descendants().filter(d => {\n if (!d.children) return false;\n // Count visible children (not hidden)\n const visibleChildCount = d.children.filter(child => !child.hidden).length;\n return visibleChildCount > 1;\n }), d => d.id);\n\n hits.exit().remove();\n\n const hitsEnter = hits.enter().append('path')\n .attr('class', 'hit')\n .attr('fill', 'transparent')\n .style('cursor', 'pointer')\n .on('click', (event, d) => {\n this.#selectNode(d);\n event.stopPropagation();\n });\n\n hitsEnter.merge(hits)\n .attr('d', d => this.#generateSelectionPath(d));\n\n // Sort by depth so deeper nodes are on top\n this.layers.hitLayer.selectAll('.hit').sort((a, b) => a.depth - b.depth);\n\n // Update hit areas for tip selection (nodes without children or collapsed children)\n const tipHits = this.layers.hitLayer.selectAll('.tip-hit')\n .data(root.descendants().filter(d => !d.children && !d.collapsedChildren), d => d.id);\n\n tipHits.exit().remove();\n\n const tipHitsEnter = tipHits.enter().append('path')\n .attr('class', 'tip-hit')\n .attr('fill', 'transparent')\n .style('cursor', 'pointer')\n .on('click', (event, d) => {\n this.#selectNode(d);\n event.stopPropagation();\n });\n\n tipHitsEnter.merge(tipHits)\n .attr('d', d => this.#generateSelectionPath(d));\n\n // Update hit areas for collapsed subtrees\n const collapsedHits = this.layers.hitLayer.selectAll('.collapsed-hit')\n .data(root.descendants().filter(d => d.collapsedChildren), d => d.id);\n\n collapsedHits.exit().remove();\n\n const collapsedHitsEnter = collapsedHits.enter().append('rect')\n .attr('class', 'collapsed-hit')\n .attr('fill', 'transparent')\n .style('cursor', 'pointer')\n .on('click', (event, d) => {\n if (d.collapsedChildren) {\n this.isExpanding = true;\n this.treeState.expandSubtree(d);\n }\n event.stopPropagation();\n });\n\n collapsedHitsEnter.merge(collapsedHits)\n .attr('transform', d => `translate(${d.xPx}, ${d.yPx}) rotate(${this.#getLabelRotation(d)})`)\n .attr('x', d => {\n return this.#isLeftSide(d) ? -(this.treeState.getCollapsedTriangleHeight(d) + d.tipLabelBounds.width * this.treeState.labelSizeToPxFactor) : 0;\n })\n .attr('y', d => -d.tipLabelYOffsetPx * 1.5)\n .attr('width', d => this.treeState.getCollapsedTriangleHeight(d) + d.tipLabelBounds.width * this.treeState.labelSizeToPxFactor)\n .attr('height', d => Math.max(d.tipLabelSizePx, this.treeState.getCollapsedTriangleHeight(d)));\n\n // Update hit areas for collapsed roots\n const collapsedRootHits = this.layers.hitLayer.selectAll('.collapsed-root-hit')\n .data(root.collapsedParent ? [root] : [], d => d.id);\n\n collapsedRootHits.exit().remove();\n\n const collapsedRootHitsEnter = collapsedRootHits.enter().append('rect')\n .attr('class', 'collapsed-root-hit')\n .attr('fill', 'transparent')\n .style('cursor', 'pointer')\n .on('click', (event, d) => {\n if (d.collapsedParent) {\n this.isExpanding = true;\n this.treeState.expandRoot();\n }\n event.stopPropagation();\n });\n\n collapsedRootHitsEnter.merge(collapsedRootHits)\n .attr('transform', d => {\n if (!d.collapsedParent) return `translate(${d.xPx}, ${d.yPx})`;\n\n let rotationAngle = 0;\n if (isCircular) {\n const children = d.children || [];\n if (children.length > 0) {\n const avgAngle = children.reduce((sum, child) => sum + child.angle, 0) / children.length;\n rotationAngle = avgAngle * (180 / Math.PI);\n }\n }\n\n return `translate(${d.xPx}, ${d.yPx}) rotate(${rotationAngle})`;\n })\n .attr('x', -collapsedRootLineLength)\n .attr('y', -branchWidth * 5)\n .attr('width', collapsedRootLineLength)\n .attr('height', branchWidth * 10);\n }\n\n /**\n * Main method to update all branches\n * @param {boolean} transition - Whether to animate the update\n */\n #updateBranches(transition = true) {\n const root = this.treeState.displayedRoot;\n if (!root) return;\n\n // Get all links (parent-child connections) from the tree\n const links = root.links();\n\n // Calculate branch thickness\n const branchWidth = this.treeState.labelSizeToPxFactor * this.treeState.state.branchThicknessProp;\n\n // DATA JOIN: bind links to branch groups using stable target node ID\n const branchGroups = this.layers.branchLayer\n .selectAll('.branch-group')\n .data(links, d => d.target.id);\n\n // EXIT: Remove branches that no longer exist\n if (transition) {\n branchGroups.exit()\n .attr('opacity', 0)\n .remove();\n } else {\n branchGroups.exit().remove();\n }\n\n // ENTER: Create new branch groups\n const branchGroupsEnter = branchGroups.enter()\n .append('g')\n .attr('class', 'branch-group');\n\n // Create branch groups with offset and extension paths\n this.#createBranchGroup(branchGroupsEnter);\n\n // If expanding, hide new elements initially for delayed fade-in\n if (this.isExpanding && transition) {\n branchGroupsEnter.attr('opacity', 0);\n }\n\n // UPDATE + ENTER: Merge and update all branches\n const branchGroupsUpdate = branchGroupsEnter.merge(branchGroups);\n\n // Update branch paths based on current layout\n this.#updateBranchPaths(branchGroupsUpdate, transition, branchWidth);\n\n // Store the selection for future updates\n this.selections.branches = branchGroupsUpdate;\n\n return branchGroupsEnter;\n }\n\n /**\n * Create initial branch group with offset and extension paths\n * @param {Selection} selection -D3 selection of entering branch groups\n */\n #createBranchGroup(selection) {\n // Append offset path (the part that separates branches along y-axis or angle)\n selection.append('path')\n .attr('class', 'offset')\n .attr('fill', 'none')\n .attr('stroke', '#000')\n .attr('stroke-opacity', 1)\n .attr('stroke-linecap', 'round');\n\n // Append extension path (the part that extends along x-axis or radius)\n selection.append('path')\n .attr('class', 'extension')\n .attr('fill', 'none')\n .attr('stroke', '#000')\n .attr('stroke-opacity', 1)\n .attr('stroke-linecap', 'round');\n }\n\n /**\n * Update branch paths based on layout\n * @param {Selection} selection - D3 selection of branch groups\n * @param {boolean} transition - Whether to animate the update\n * @param {number} branchWidth - Width of branch strokes\n */\n #updateBranchPaths(selection, transition, branchWidth) {\n const isCircular = this.treeState.state.layout === 'circular';\n\n // Select offset and extension paths\n const offsetPaths = selection.select('.offset');\n const extensionPaths = selection.select('.extension');\n\n if (transition) {\n // Animate path changes\n offsetPaths\n .transition()\n .duration(this.options.transitionDuration)\n .attr('stroke-width', branchWidth)\n .attr('d', d => this.#getBranchPath(d, 'offset'));\n\n extensionPaths\n .transition()\n .duration(this.options.transitionDuration)\n .attr('stroke-width', branchWidth)\n .attr('d', d => this.#getBranchPath(d, 'extension'));\n } else {\n // Update immediately without animation\n offsetPaths\n .attr('stroke-width', branchWidth)\n .attr('d', d => this.#getBranchPath(d, 'offset'));\n\n extensionPaths\n .attr('stroke-width', branchWidth)\n .attr('d', d => this.#getBranchPath(d, 'extension'));\n }\n }\n\n /**\n * Generate SVG path string for a branch segment\n * @param {Object} link - D3 link object with source and target nodes\n * @param {string} pathType - Either 'offset' or 'extension'\n * @returns {string} SVG path string\n */\n #getBranchPath(link, pathType) {\n const isCircular = this.treeState.state.layout === 'circular';\n\n if (isCircular) {\n if (pathType === 'offset') {\n // Radial offset: arc from source to point at source radius but target angle\n const arcEnd = {\n x: link.source.radiusPx * link.target.cos,\n y: link.source.radiusPx * link.target.sin\n };\n const sweepFlag = link.target.angle > link.source.angle ? 1 : 0;\n return `M${link.source.xPx},${link.source.yPx} A${link.source.radiusPx},${link.source.radiusPx} 0 0,${sweepFlag} ${arcEnd.x},${arcEnd.y}`;\n } else {\n // Radial extension: straight line from arc end to target\n const arcEnd = {\n x: link.source.radiusPx * link.target.cos,\n y: link.source.radiusPx * link.target.sin\n };\n return `M${arcEnd.x},${arcEnd.y} L${link.target.xPx},${link.target.yPx}`;\n }\n } else {\n if (pathType === 'offset') {\n // Rectangular offset: arc from source to point at source x but target y\n const sweepFlag = link.target.angle > link.source.angle ? 1 : 0;\n // return `M${link.source.xPx},${link.source.yPx} A2000,2000 0 0,${sweepFlag} ${link.source.xPx},${link.target.yPx}`;\n return `M${link.source.xPx},${link.source.yPx} L${link.source.xPx},${link.target.yPx}`;\n } else {\n // Rectangular extension: horizontal line from offset end to target\n return `M${link.source.xPx},${link.target.yPx} L${link.target.xPx},${link.target.yPx}`;\n }\n }\n }\n\n #getCollapsedTrianglePath(d) {\n const triangleArea = triangleAreaFromSide(this.treeState.getCollapsedTriangleHeight(d));\n return symbol().type(symbolTriangle).size(triangleArea)();\n }\n\n /**\n * Main method to update all nodes\n * @param {boolean} transition - Whether to animate the update\n */\n #updateNodes(transition = true) {\n const root = this.treeState.displayedRoot;\n if (!root) return;\n\n // Detect if we're transitioning between layouts\n const isCircular = this.treeState.state.layout === 'circular';\n const layoutChanged = this.wasCircularLayout !== isCircular;\n\n // Get all nodes from the tree, excluding hidden nodes\n const nodes = root.descendants().filter(d => !d.hidden);\n\n // Calculate branch width for collapsed root lines\n const branchWidth = this.treeState.labelSizeToPxFactor * this.treeState.state.branchThicknessProp;\n\n // Calculate collapsed root line length\n const collapsedRootLineLength = this.#getCollapsedRootLineLength();\n\n // DATA JOIN: bind nodes to node groups using stable node ID\n const nodeGroups = this.layers.nodeLayer\n .selectAll('.node')\n .data(nodes, d => d.id);\n\n // EXIT: Remove nodes that no longer exist\n if (transition) {\n nodeGroups.exit()\n .attr('opacity', 0)\n .remove();\n } else {\n nodeGroups.exit().remove();\n }\n\n // ENTER: Create new node groups\n const nodeGroupsEnter = nodeGroups.enter()\n .append('g')\n .attr('class', 'node')\n .attr('transform', d => `translate(${d.xPx}, ${d.yPx})`);\n\n // Create node groups with shapes and labels\n this.#createNodeGroup(nodeGroupsEnter, branchWidth);\n\n // If expanding, hide new elements initially for delayed fade-in\n if (this.isExpanding && transition) {\n nodeGroupsEnter.attr('opacity', 0);\n }\n\n // UPDATE + ENTER: Merge and update all nodes\n const nodeGroupsUpdate = nodeGroupsEnter.merge(nodeGroups);\n\n // Update node positions\n this.#updateNodePositions(nodeGroupsUpdate, transition);\n\n // Update node labels (text, colors, sizes)\n this.#updateNodeLabels(nodeGroupsUpdate, transition);\n\n // Update node shapes (triangles for collapsed nodes)\n this.#updateNodeShapes(nodeGroupsUpdate, transition);\n\n // Update collapsed indicators (root lines and labels)\n this.#updateCollapsedIndicators(nodeGroupsUpdate, transition, branchWidth, collapsedRootLineLength);\n\n // Store the selection for future updates\n this.selections.nodes = nodeGroupsUpdate;\n\n // Update the previous layout state for next transition\n this.wasCircularLayout = isCircular;\n\n return nodeGroupsEnter;\n }\n\n /**\n * Create initial node group with shape and labels\n * @param {Selection} selection - D3 selection of entering node groups\n * @param {string} trianglePath - SVG path for triangle symbol\n * @param {number} branchWidth - Width of branch strokes\n */\n #createNodeGroup(selection, branchWidth) {\n // Append a path for collapsed subtree triangle\n selection.append('path')\n .attr('class', 'node-shape')\n .attr('d', d => d.collapsedChildren ? this.#getCollapsedTrianglePath(d) : null)\n .attr('fill', '#000')\n .style('display', d => d.collapsedChildren ? null : 'none');\n\n // Append line for collapsed root\n selection.append('line')\n .attr('class', 'collapsed-root-line')\n .attr('stroke', '#000')\n .attr('stroke-width', branchWidth)\n .style('display', d => d.collapsedParent ? null : 'none');\n\n // Append text label for tips\n selection\n .filter(d => d.tipLabelText && d.tipLabelText.trim() !== '')\n .append('text')\n .attr('class', 'tip-label')\n .style('text-anchor', d => this.#getTipLabelAnchor(d))\n .style('font-size', d => `${d.tipLabelSizePx}px`)\n .style('font-family', d => d.tipLabelFont || 'sans-serif')\n .style('font-style', d => d.tipLabelStyle || 'normal')\n .style('font-weight', d => d.tipLabelStyle === 'bold' ? 'bold' : 'normal')\n .style('fill', d => d.tipLabelColor || '#000')\n .style('display', d => (d.children) ? 'none' : null)\n .text(d => d.tipLabelText || '');\n\n // Append text label for interior nodes (only if they have more than one visible child)\n selection\n .filter(d => {\n if (!d.nodeLabelText || d.nodeLabelText.trim() === '') return false;\n if (!d.children) return false;\n // Count visible children\n const visibleChildCount = d.children.filter(child => !child.hidden).length;\n return visibleChildCount > 1;\n })\n .append('text')\n .attr('class', 'node-label')\n .style('text-anchor', d => this.#getNodeLabelAnchor(d))\n .style('font-size', d => `${d.nodeLabelSizePx}px`)\n .style('fill', '#000')\n .style('display', d => (d.children || d.collapsedChildren) ? null : 'none')\n .text(d => d.nodeLabelText || '');\n }\n\n /**\n * Update node positions\n * @param {Selection} selection - D3 selection of node groups\n * @param {boolean} transition - Whether to animate the update\n */\n #updateNodePositions(selection, transition) {\n if (transition) {\n selection\n .transition('update node positions')\n .duration(this.options.transitionDuration)\n .attr('transform', d => `translate(${d.xPx}, ${d.yPx})`);\n } else {\n selection.attr('transform', d => `translate(${d.xPx}, ${d.yPx})`);\n }\n }\n\n /**\n * Update node labels (text, colors, sizes, positions)\n * @param {Selection} selection - D3 selection of node groups\n * @param {boolean} transition - Whether to animate the update\n */\n #updateNodeLabels(selection, transition) {\n const isCircular = this.treeState.state.layout === 'circular';\n\n // Update tip labels\n const tipLabels = selection.selectAll('.tip-label');\n\n if (transition) {\n tipLabels\n .attr('x', d => this.#isLeftSide(d) ? -d.tipLabelXOffsetPx : d.tipLabelXOffsetPx)\n tipLabels\n .transition('update tip labels')\n .duration(this.options.transitionDuration)\n .attr('dy', d => d.tipLabelSizePx / 2.5)\n .attr('transform', d => `rotate(${this.#getLabelRotation(d)})`)\n .style('text-anchor', d => this.#getTipLabelAnchor(d))\n .style('font-size', d => `${d.tipLabelSizePx}px`);\n } else {\n tipLabels\n .attr('dy', d => d.tipLabelSizePx / 2.5)\n .attr('x', d => this.#isLeftSide(d) ? -d.tipLabelXOffsetPx : d.tipLabelXOffsetPx)\n .attr('transform', d => `rotate(${this.#getLabelRotation(d)})`)\n .style('text-anchor', d => this.#getTipLabelAnchor(d))\n .style('font-size', d => `${d.tipLabelSizePx}px`);\n }\n\n // Update text and color without transition\n tipLabels\n .text(d => d.tipLabelText || '')\n .style('fill', d => d.tipLabelColor || '#000')\n .style('font-family', d => d.tipLabelFont || 'sans-serif')\n .style('font-style', d => d.tipLabelStyle || 'normal')\n .style('display', d => (d.children) ? 'none' : null);\n\n // Update node labels (interior nodes)\n const nodeLabels = selection.selectAll('.node-label');\n\n if (transition) {\n nodeLabels\n .transition('update node labels')\n .duration(this.options.transitionDuration)\n .attr('dy', d => this.#getNodeLabelDy(d))\n .attr('x', d => this.#isLeftSide(d) ? d.nodeLabelXOffsetPx : -d.nodeLabelXOffsetPx)\n .attr('transform', d => `rotate(${this.#getLabelRotation(d)})`)\n .style('text-anchor', d => this.#getNodeLabelAnchor(d))\n .style('font-size', d => `${d.nodeLabelSizePx}px`);\n } else {\n nodeLabels\n .attr('dy', d => this.#getNodeLabelDy(d))\n .attr('x', d => this.#isLeftSide(d) ? d.nodeLabelXOffsetPx : -d.nodeLabelXOffsetPx)\n .attr('transform', d => `rotate(${this.#getLabelRotation(d)})`)\n .style('text-anchor', d => this.#getNodeLabelAnchor(d))\n .style('font-size', d => `${d.nodeLabelSizePx}px`);\n }\n\n // Update text and visibility without transition\n nodeLabels\n .text(d => d.nodeLabelText || '')\n .style('display', d => {\n // Hide if no children or collapsed children\n if (!d.children && !d.collapsedChildren) return 'none';\n // Hide if only one visible child\n if (d.children) {\n const visibleChildCount = d.children.filter(child => !child.hidden).length;\n if (visibleChildCount <= 1) return 'none';\n }\n return null;\n });\n }\n\n /**\n * Update node shapes (triangles for collapsed nodes)\n * @param {Selection} selection - D3 selection of node groups\n * @param {boolean} transition - Whether to animate the update\n * @param {string} trianglePath - SVG path for triangle symbol\n */\n #updateNodeShapes(selection, transition) {\n const nodeShapes = selection.selectAll('.node-shape');\n\n // Set translate offset immediately (no transition)\n nodeShapes\n .attr('transform', d => `rotate(${this.#getTriangleRotation(d)}) translate(0, ${this.treeState.getCollapsedTriangleOffset(d)})`)\n .style('display', d => d.collapsedChildren ? null : 'none');\n\n // Animate only the shape/path changes\n if (transition) {\n nodeShapes\n .transition()\n .duration(this.options.transitionDuration)\n .attr('d', d => d.collapsedChildren ? this.#getCollapsedTrianglePath(d) : null)\n .attr('transform', d => `rotate(${this.#getTriangleRotation(d)}) translate(0, ${this.treeState.getCollapsedTriangleOffset(d)})`);\n } else {\n nodeShapes.attr('d', d => d.collapsedChildren ? this.#getCollapsedTrianglePath(d) : null);\n }\n }\n\n /**\n * Update collapsed indicators (root lines and labels)\n * @param {Selection} selection - D3 selection of node groups\n * @param {boolean} transition - Whether to animate the update\n * @param {number} branchWidth - Width of branch strokes\n * @param {number} collapsedRootLineLength - Length of collapsed root line\n */\n #updateCollapsedIndicators(selection, transition, branchWidth, collapsedRootLineLength) {\n const isCircular = this.treeState.state.layout === 'circular';\n\n // Update collapsed root lines\n const collapsedRootLines = selection.selectAll('.collapsed-root-line');\n\n if (transition) {\n collapsedRootLines\n .transition()\n .duration(this.options.transitionDuration)\n .attr('x2', d => this.#getCollapsedRootLineEnd(d, collapsedRootLineLength).x)\n .attr('y2', d => this.#getCollapsedRootLineEnd(d, collapsedRootLineLength).y)\n .attr('stroke-width', branchWidth)\n .attr('stroke-dasharray', d => d.collapsedParent ? createDashArray(collapsedRootLineLength, branchWidth, 4) : null);\n } else {\n collapsedRootLines\n .attr('x2', d => this.#getCollapsedRootLineEnd(d, collapsedRootLineLength).x)\n .attr('y2', d => this.#getCollapsedRootLineEnd(d, collapsedRootLineLength).y)\n .attr('stroke-width', branchWidth)\n .attr('stroke-dasharray', d => d.collapsedParent ? createDashArray(collapsedRootLineLength, branchWidth, 4) : null);\n }\n\n collapsedRootLines\n .attr('x1', 0)\n .attr('y1', 0)\n .style('display', d => d.collapsedParent ? null : 'none');\n\n }\n\n /**\n * Get label rotation angle\n * @param {Object} node - Tree node\n * @returns {number} Rotation angle in degrees\n */\n #getLabelRotation(node) {\n const isCircular = this.treeState.state.layout === 'circular';\n if (!isCircular) return 0;\n\n const angleDeg = node.angle * (180 / Math.PI);\n // Flip labels on the left side so they're readable\n return this.#isLeftSide(node) ? angleDeg + 180 : angleDeg;\n }\n\n /**\n * Get triangle rotation angle\n * @param {Object} node - Tree node\n * @returns {number} Rotation angle in degrees\n */\n #getTriangleRotation(node) {\n const isCircular = this.treeState.state.layout === 'circular';\n if (!isCircular) return -90;\n return node.angle * (180 / Math.PI) - 90;\n }\n\n /**\n * Get text anchor based on node type and position\n * @param {Object} node - Tree node\n * @returns {string} Text anchor value ('start', 'end', 'middle')\n */\n #getTipLabelAnchor(node) {\n if (this.treeState.state.layout === 'circular' && this.#isLeftSide(node)) {\n return node.children ? 'start' : 'end';\n } else {\n return node.children ? 'end' : 'start';\n }\n }\n\n /**\n * Get text anchor based on node type and position\n * @param {Object} node - Tree node\n * @returns {string} Text anchor value ('start', 'end', 'middle')\n */\n #getNodeLabelAnchor(node) {\n if (this.treeState.state.layout === 'circular' && this.#isLeftSide(node)) {\n return node.children || node.collapsedChildren ? 'start' : 'end';\n } else {\n return node.children || node.collapsedChildren ? 'end' : 'start';\n }\n }\n\n /**\n * Get label dy offset for vertical positioning\n * @param {Object} node - Tree node\n * @returns {number} Vertical offset value\n */\n #getNodeLabelDy(node) {\n // Interior node labels\n if (node.collapsedParent) {\n return this.treeState.labelSizeToPxFactor * 1.2;\n } else {\n const parentBelow = node.parent && node.parent.yPx > node.yPx;\n const size = node.nodeLabelSizePx;\n return parentBelow ? -size * 0.3 : size * 1;\n }\n }\n\n /**\n * Determine if a node is on the left side in circular layout\n * @param {Object} node - Tree node\n * @returns {boolean} True if node is on left side\n */\n #isLeftSide(node) {\n const isCircular = this.treeState.state.layout === 'circular';\n if (!isCircular) return false;\n return node.angle < Math.PI * 1.5 || node.angle > Math.PI * 2.5;\n }\n\n /**\n * Get collapsed root line end coordinates\n * @param {Object} node - Tree node\n * @param {number} lineLength - Length of the line\n * @returns {Object} Object with x and y coordinates\n */\n #getCollapsedRootLineEnd(node, lineLength) {\n if (!node.collapsedParent) return { x: 0, y: 0 };\n\n const isCircular = this.treeState.state.layout === 'circular';\n\n if (isCircular) {\n // Calculate average angle of children\n const children = node.children || [];\n if (children.length === 0) return { x: -lineLength, y: 0 };\n\n const avgAngle = children.reduce((sum, child) => sum + child.angle, 0) / children.length;\n return {\n x: -lineLength * Math.cos(avgAngle),\n y: -lineLength * Math.sin(avgAngle)\n };\n }\n\n return { x: -lineLength, y: 0 };\n }\n\n /**\n * Calculate collapsed root line length\n * @returns {number} Line length in pixels\n */\n #getCollapsedRootLineLength() {\n const root = this.treeState.displayedRoot;\n if (!root) return 0;\n\n const isCircular = this.treeState.state.layout === 'circular';\n\n if (isCircular) {\n const maxRadius = Math.max(...root.leaves().map(d => d.radiusPx));\n return maxRadius * this.treeState.state.collapsedRootLineProp * 2;\n } else {\n const maxX = Math.max(...root.leaves().map(d => d.xPx));\n return maxX * this.treeState.state.collapsedRootLineProp;\n }\n }\n}\n","/**\n * Create and manage the toolbar with tabs and controls\n * @param {HTMLElement} toolbarDiv - Container for the toolbar\n * @param {Map} treeDataInstances - Map of tree names to TreeData instances\n * @param {Function} getCurrentTreeState - Function that returns the current TreeState\n * @param {Function} getCurrentTreeView - Function that returns the current TreeView\n * @param {Function} switchToTree - Function to switch to a different tree\n * @param {Function} addNewTree - Function to add a new tree\n * @param {Object} options - Configuration options\n * @param {Function} onDimensionsChange - Callback when toolbar dimensions change\n * @returns {Function} Function to refresh the current tab's controls\n */\nexport function createToolbar(\n toolbarDiv,\n treeDataInstances,\n getCurrentTreeState,\n getCurrentTreeView,\n switchToTree,\n addNewTree,\n options,\n onDimensionsChange\n) {\n const CONTROL_HEIGHT = 24; // Standard height for all controls\n let currentTab = null;\n let selectedMetadata = null; // Track which metadata table is \"selected\" for future controls\n\n // Store references to buttons that need to be updated dynamically\n let expandSubtreesBtn = null;\n let expandRootBtn = null;\n let showHiddenBtn = null;\n let currentTreeStateSubscription = null;\n\n // Track control panel visibility\n let controlPanelVisible = true;\n\n // Create toggle button container (separate from collapsible content)\n const toggleContainer = document.createElement('div');\n toggleContainer.className = 'ht-toggle-container';\n\n // Create toggle button for control panel\n const toggleButton = document.createElement('button');\n toggleButton.className = 'ht-control-panel-toggle';\n toggleButton.innerHTML = `\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" class=\"ht-toggle-arrow\">\n <path d=\"M8 4 L12 8 L8 12\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" transform=\"rotate(-90 8 8)\"/>\n </svg>\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" class=\"ht-hamburger-icon\">\n <line x1=\"2\" y1=\"4\" x2=\"14\" y2=\"4\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\"/>\n <line x1=\"2\" y1=\"8\" x2=\"14\" y2=\"8\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\"/>\n <line x1=\"2\" y1=\"12\" x2=\"14\" y2=\"12\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\"/>\n </svg>\n `;\n toggleButton.title = 'Toggle control panel';\n\n toggleContainer.appendChild(toggleButton);\n\n // Create collapsible panel container\n const collapsiblePanel = document.createElement('div');\n collapsiblePanel.className = 'ht-collapsible-panel';\n\n // Create tabs container\n const tabsContainer = document.createElement('div');\n tabsContainer.className = 'ht-tabs';\n\n // Create controls container\n const controlsContainer = document.createElement('div');\n controlsContainer.className = 'ht-controls hidden';\n\n // Define tabs\n const tabs = [\n { id: 'data', label: 'Data', requiresTree: false },\n { id: 'controls', label: 'Controls', requiresTree: true },\n { id: 'tree-manipulation', label: 'Tree Manipulation', requiresTree: true },\n { id: 'tip-label-settings', label: 'Tip Label Settings', requiresTree: true },\n { id: 'export', label: 'Export', requiresTree: true }\n ];\n\n // Create tab elements\n const tabElements = {};\n tabs.forEach(tab => {\n const tabDiv = document.createElement('div');\n tabDiv.className = 'ht-tab';\n tabDiv.textContent = tab.label;\n\n // Click handler\n tabDiv.addEventListener('click', () => {\n // Check if tab is disabled\n if (tabDiv.classList.contains('disabled')) {\n return;\n }\n\n if (currentTab === tab.id) {\n // Clicking the same tab closes it\n closeTab();\n } else {\n // Open the new tab\n openTab(tab.id);\n }\n });\n\n tabElements[tab.id] = tabDiv;\n tabsContainer.appendChild(tabDiv);\n });\n\n // Function to update tab states based on whether a tree is loaded\n function updateTabStates() {\n const hasTree = getCurrentTreeState() !== null;\n\n tabs.forEach(tab => {\n const tabElement = tabElements[tab.id];\n if (tab.requiresTree && !hasTree) {\n tabElement.classList.add('disabled');\n } else {\n tabElement.classList.remove('disabled');\n }\n });\n\n // If current tab requires a tree and no tree is loaded, close it and open Data tab\n if (currentTab) {\n const currentTabDef = tabs.find(t => t.id === currentTab);\n if (currentTabDef && currentTabDef.requiresTree && !hasTree) {\n openTab('data');\n }\n }\n }\n\n // Add transition end listener to notify when dimensions change\n collapsiblePanel.addEventListener('transitionend', (e) => {\n // Only trigger on max-height transitions (not other properties)\n if (e.propertyName === 'max-height' && onDimensionsChange) {\n onDimensionsChange();\n }\n });\n\n controlsContainer.addEventListener('transitionend', (e) => {\n // Only trigger on max-height transitions (not other properties)\n if (e.propertyName === 'max-height' && onDimensionsChange) {\n onDimensionsChange();\n }\n });\n\n // Toggle button click handler\n toggleButton.addEventListener('click', () => {\n controlPanelVisible = !controlPanelVisible;\n\n if (controlPanelVisible) {\n // Show the control panel\n collapsiblePanel.classList.remove('ht-panel-collapsed');\n toggleButton.classList.remove('collapsed');\n } else {\n // Hide the control panel\n collapsiblePanel.classList.add('ht-panel-collapsed');\n toggleButton.classList.add('collapsed');\n }\n });\n\n // Function to get metadata table names for the current tree\n function getCurrentMetadataNames() {\n const treeState = getCurrentTreeState();\n if (!treeState || !treeState.state.treeData) return [];\n return treeState.state.treeData.getMetadataTableNames();\n }\n\n // Function to get the currently selected metadata table name\n function getSelectedMetadata() {\n return selectedMetadata;\n }\n\n // Function to set the currently selected metadata table\n function setSelectedMetadata(metadataName) {\n const metadataNames = getCurrentMetadataNames();\n if (metadataNames.includes(metadataName)) {\n selectedMetadata = metadataName;\n } else {\n console.warn(`Metadata table not found: ${metadataName}`);\n }\n }\n\n // Function to reset selected metadata when switching trees\n function resetSelectedMetadata() {\n const metadataNames = getCurrentMetadataNames();\n selectedMetadata = metadataNames.length > 0 ? metadataNames[0] : null;\n }\n\n // Function to update expand button states\n function updateExpandButtonStates() {\n const treeState = getCurrentTreeState();\n if (!treeState) return;\n\n // Update expand subtrees button\n if (expandSubtreesBtn) {\n let hasCollapsedSubtrees = false;\n treeState.displayedRoot.each(node => {\n if (node !== treeState.displayedRoot && node.collapsedChildren) {\n hasCollapsedSubtrees = true;\n }\n });\n expandSubtreesBtn.disabled = !hasCollapsedSubtrees;\n }\n\n // Update expand root button\n if (expandRootBtn) {\n expandRootBtn.disabled = !treeState.displayedRoot.collapsedParent;\n }\n\n // Update show hidden button\n if (showHiddenBtn) {\n let hasHiddenNodes = false;\n treeState.state.treeData.tree.each(node => {\n if (node.hiddenChildren && node.hiddenChildren.length > 0) {\n hasHiddenNodes = true;\n }\n });\n showHiddenBtn.disabled = !hasHiddenNodes;\n }\n }\n\n // Function to get current tree name\n function getCurrentTreeName() {\n const treeState = getCurrentTreeState();\n if (!treeState) return 'tree';\n\n // Find the tree name by matching the treeData instance\n for (const [name, data] of treeDataInstances.entries()) {\n if (data === treeState.state.treeData) {\n return name;\n }\n }\n return 'tree';\n }\n\n // Function to open a tab\n function openTab(tabId) {\n // Check if tab requires a tree and no tree is loaded\n const tabDef = tabs.find(t => t.id === tabId);\n if (tabDef && tabDef.requiresTree && !getCurrentTreeState()) {\n return;\n }\n\n // Update current tab\n currentTab = tabId;\n\n // Update tab styles\n Object.keys(tabElements).forEach(id => {\n if (id === tabId) {\n tabElements[id].classList.add('active');\n } else {\n tabElements[id].classList.remove('active');\n }\n });\n\n // Show controls and populate with tab content\n controlsContainer.classList.remove('hidden');\n populateControls(tabId);\n }\n\n // Function to close the current tab\n function closeTab() {\n currentTab = null;\n\n // Reset all tab styles\n Object.keys(tabElements).forEach(id => {\n tabElements[id].classList.remove('active');\n });\n\n // Hide controls\n controlsContainer.classList.add('hidden');\n controlsContainer.innerHTML = '';\n }\n\n // Function to populate controls based on selected tab\n function populateControls(tabId) {\n controlsContainer.innerHTML = '';\n\n switch (tabId) {\n case 'data':\n populateDataControls(\n controlsContainer,\n treeDataInstances,\n getCurrentTreeState,\n switchToTree,\n addNewTree,\n getCurrentMetadataNames,\n getSelectedMetadata,\n setSelectedMetadata,\n resetSelectedMetadata,\n refreshCurrentTab,\n options,\n CONTROL_HEIGHT\n );\n break;\n case 'controls':\n populateControlsTab(\n controlsContainer,\n getCurrentTreeState,\n getCurrentTreeView,\n options,\n CONTROL_HEIGHT\n );\n break;\n case 'tree-manipulation':\n populateTreeManipulationControls(\n controlsContainer,\n getCurrentTreeState,\n refreshCurrentTab,\n updateExpandButtonStates,\n options,\n CONTROL_HEIGHT,\n (btn) => { expandSubtreesBtn = btn; },\n (btn) => { expandRootBtn = btn; },\n (btn) => { showHiddenBtn = btn; }\n );\n break;\n case 'tip-label-settings':\n populateTipLabelSettingsControls(controlsContainer, getCurrentTreeState, options, CONTROL_HEIGHT);\n break;\n case 'export':\n populateExportControls(controlsContainer, getCurrentTreeState, getCurrentTreeView, getCurrentTreeName, options, CONTROL_HEIGHT);\n break;\n }\n }\n\n // Function to refresh the current tab (used when tree changes)\n function refreshCurrentTab() {\n resetSelectedMetadata();\n\n // Unsubscribe from previous tree state\n if (currentTreeStateSubscription) {\n currentTreeStateSubscription();\n currentTreeStateSubscription = null;\n }\n\n // Reset button references when switching trees\n expandSubtreesBtn = null;\n expandRootBtn = null;\n showHiddenBtn = null;\n\n // Subscribe to coordinate changes in the new tree state\n const treeState = getCurrentTreeState();\n if (treeState) {\n currentTreeStateSubscription = treeState.subscribe('coordinateChange', updateExpandButtonStates);\n }\n\n // Update tab states based on whether a tree is loaded\n updateTabStates();\n\n if (currentTab) {\n populateControls(currentTab);\n }\n }\n\n // Assemble the collapsible panel\n collapsiblePanel.appendChild(tabsContainer);\n collapsiblePanel.appendChild(controlsContainer);\n\n // Append toggle container and collapsible panel to toolbar\n toolbarDiv.appendChild(toggleContainer);\n toolbarDiv.appendChild(collapsiblePanel);\n\n // Update tab states initially\n updateTabStates();\n\n // Open the first tab by default\n openTab(tabs[0].id);\n\n // Initialize selected metadata (will be set properly after first tree loads)\n resetSelectedMetadata();\n\n // Return the refresh function so it can be called from outside\n return refreshCurrentTab;\n}\n\n/**\n * Populate Data tab controls\n */\nfunction populateDataControls(\n container,\n treeDataInstances,\n getCurrentTreeState,\n switchToTree,\n addNewTree,\n getCurrentMetadataNames,\n getSelectedMetadata,\n setSelectedMetadata,\n resetSelectedMetadata,\n refreshCurrentTab,\n options,\n controlHeight\n) {\n container.innerHTML = '';\n\n // Select tree control\n const treeLabel = createLabel('Select tree:', controlHeight);\n container.appendChild(treeLabel);\n\n const treeSelect = document.createElement('select');\n treeSelect.className = 'ht-select';\n treeSelect.style.height = `${controlHeight}px`;\n\n // Populate tree options\n const treeNames = Array.from(treeDataInstances.keys());\n const currentTreeState = getCurrentTreeState();\n const currentTreeName = currentTreeState ? Array.from(treeDataInstances.entries()).find(([name, data]) => data === currentTreeState.state.treeData)?.[0] : null;\n\n if (treeNames.length === 0) {\n const option = document.createElement('option');\n option.textContent = 'No trees loaded';\n option.value = '';\n treeSelect.appendChild(option);\n treeSelect.disabled = true;\n } else {\n treeNames.forEach((treeName) => {\n const option = document.createElement('option');\n option.value = treeName;\n option.textContent = treeName;\n if (treeName === currentTreeName) {\n option.selected = true;\n }\n treeSelect.appendChild(option);\n });\n\n // Handle tree selection change\n treeSelect.addEventListener('change', (e) => {\n switchToTree(e.target.value);\n });\n }\n\n container.appendChild(treeSelect);\n\n // Create hidden file input for tree upload\n const treeFileInput = document.createElement('input');\n treeFileInput.type = 'file';\n treeFileInput.accept = '.nwk,.newick,.tree,.tre,.treefile';\n treeFileInput.style.display = 'none';\n\n // Handle file selection\n treeFileInput.addEventListener('change', async (e) => {\n const file = e.target.files[0];\n if (!file) return;\n\n try {\n const newickStr = await file.text();\n\n // Derive tree name from filename (remove extension)\n let treeName = file.name.replace(/\\.(nwk|newick|tree|tre)$/i, '');\n\n // Ensure unique name\n let uniqueName = treeName;\n let counter = 1;\n while (treeDataInstances.has(uniqueName)) {\n uniqueName = `${treeName} (${counter})`;\n counter++;\n }\n\n // Add the new tree\n addNewTree(uniqueName, newickStr);\n\n // Reset the file input so the same file can be selected again\n treeFileInput.value = '';\n\n // Refresh the controls to show the new tree\n refreshCurrentTab();\n\n // Switch to the newly added tree\n switchToTree(uniqueName);\n } catch (error) {\n console.error('Error loading tree file:', error);\n alert(`Error loading tree file: ${error.message}`);\n }\n });\n\n container.appendChild(treeFileInput);\n\n const addTreeBtn = createButton('+', 'Add tree from Newick file', controlHeight);\n addTreeBtn.addEventListener('click', () => {\n treeFileInput.click();\n });\n container.appendChild(addTreeBtn);\n\n // Only show metadata controls if a tree is loaded\n if (!currentTreeState) {\n return;\n }\n\n // Select metadata control\n const metadataLabel = createLabel('Available metadata:', controlHeight);\n container.appendChild(metadataLabel);\n\n const metadataSelect = document.createElement('select');\n metadataSelect.className = 'ht-select';\n metadataSelect.style.height = `${controlHeight}px`;\n\n // Populate metadata options\n const metadataNames = getCurrentMetadataNames();\n const selectedMetadata = getSelectedMetadata();\n\n if (metadataNames.length === 0) {\n const option = document.createElement('option');\n option.textContent = 'No metadata';\n option.value = '';\n metadataSelect.appendChild(option);\n metadataSelect.disabled = true;\n } else {\n metadataNames.forEach((metadataName) => {\n const option = document.createElement('option');\n option.value = metadataName;\n option.textContent = metadataName;\n if (metadataName === selectedMetadata) {\n option.selected = true;\n }\n metadataSelect.appendChild(option);\n });\n\n // Handle metadata selection change\n metadataSelect.addEventListener('change', (e) => {\n setSelectedMetadata(e.target.value);\n });\n }\n\n container.appendChild(metadataSelect);\n\n // Create hidden file input for metadata upload\n const metadataFileInput = document.createElement('input');\n metadataFileInput.type = 'file';\n metadataFileInput.accept = '.tsv,.csv,.txt';\n metadataFileInput.style.display = 'none';\n\n // Handle metadata file selection\n metadataFileInput.addEventListener('change', async (e) => {\n const file = e.target.files[0];\n if (!file) return;\n\n const treeState = getCurrentTreeState();\n if (!treeState || !treeState.state.treeData) {\n alert('No tree selected. Please select a tree first.');\n metadataFileInput.value = '';\n return;\n }\n\n try {\n const metadataStr = await file.text();\n\n // Derive metadata table name from filename (remove extension)\n let metadataName = file.name.replace(/\\.(tsv|csv|txt)$/i, '');\n\n // Determine separator based on file extension\n let separator = '\\t'; // default to tab\n if (file.name.toLowerCase().endsWith('.csv')) {\n separator = ',';\n }\n\n // Add the metadata table to the current tree\n const tableId = treeState.state.treeData.addTable(metadataStr, metadataName, separator);\n\n // Get the display name that was actually used (might be modified for uniqueness)\n const actualName = treeState.state.treeData.metadataTableNames.get(tableId);\n\n // Reset the file input so the same file can be selected again\n metadataFileInput.value = '';\n\n // Set this as the selected metadata\n setSelectedMetadata(actualName);\n\n // Refresh the controls to show the new metadata table\n refreshCurrentTab();\n } catch (error) {\n console.error('Error loading metadata file:', error);\n alert(`Error loading metadata file: ${error.message}`);\n metadataFileInput.value = '';\n }\n });\n\n container.appendChild(metadataFileInput);\n\n const addMetadataBtn = createButton('+', 'Add metadata table', controlHeight);\n addMetadataBtn.addEventListener('click', () => {\n const treeState = getCurrentTreeState();\n if (!treeState || !treeState.state.treeData) {\n alert('No tree selected. Please select a tree first.');\n return;\n }\n metadataFileInput.click();\n });\n container.appendChild(addMetadataBtn);\n}\n\n/**\n * Populate Controls tab\n */\nfunction populateControlsTab(\n container,\n getCurrentTreeState,\n getCurrentTreeView,\n options,\n controlHeight\n) {\n container.innerHTML = '';\n\n const treeState = getCurrentTreeState();\n const treeView = getCurrentTreeView();\n\n if (!treeState || !treeView) {\n container.textContent = 'No tree selected';\n return;\n }\n\n // Fit to view button\n const fitToViewBtn = createButton('Fit to view', 'Fit the tree to the current view window', controlHeight);\n fitToViewBtn.addEventListener('click', () => {\n treeView.fitToView({ transition: true, autoPan: 'Both', autoZoom: 'Both' });\n });\n container.appendChild(fitToViewBtn);\n\n // Manual zoom/pan toggle\n const manualZoomPanLabel = createLabel('Manual zoom/pan:', controlHeight);\n container.appendChild(manualZoomPanLabel);\n\n const manualZoomPanToggle = createToggle(treeView.options.manualZoomAndPanEnabled, controlHeight);\n\n manualZoomPanToggle.addEventListener('click', () => {\n treeView.options.manualZoomAndPanEnabled = !treeView.options.manualZoomAndPanEnabled;\n\n // Update toggle visual state\n if (treeView.options.manualZoomAndPanEnabled) {\n manualZoomPanToggle.classList.add('active');\n } else {\n manualZoomPanToggle.classList.remove('active');\n }\n\n // Reinitialize zoom behavior with new filter\n treeView.initializeZoom();\n });\n\n container.appendChild(manualZoomPanToggle);\n\n // Auto-zoom dropdown\n const autoZoomLabel = createLabel('Auto-zoom:', controlHeight);\n container.appendChild(autoZoomLabel);\n\n const autoZoomSelect = document.createElement('select');\n autoZoomSelect.className = 'ht-select';\n autoZoomSelect.style.height = `${controlHeight}px`;\n\n const zoomOptions = ['Default', 'Both', 'X', 'Y', 'None'];\n zoomOptions.forEach(option => {\n const optionElement = document.createElement('option');\n optionElement.value = option;\n optionElement.textContent = option;\n if (option === treeView.options.autoZoom) {\n optionElement.selected = true;\n }\n autoZoomSelect.appendChild(optionElement);\n });\n\n autoZoomSelect.addEventListener('change', (e) => {\n treeView.options.autoZoom = e.target.value;\n });\n\n container.appendChild(autoZoomSelect);\n\n // Auto-pan dropdown\n const autoPanLabel = createLabel('Auto-pan:', controlHeight);\n container.appendChild(autoPanLabel);\n\n const autoPanSelect = document.createElement('select');\n autoPanSelect.className = 'ht-select';\n autoPanSelect.style.height = `${controlHeight}px`;\n\n const panOptions = ['Default', 'Both', 'X', 'Y', 'None'];\n panOptions.forEach(option => {\n const optionElement = document.createElement('option');\n optionElement.value = option;\n optionElement.textContent = option;\n if (option === treeView.options.autoPan) {\n optionElement.selected = true;\n }\n autoPanSelect.appendChild(optionElement);\n });\n\n autoPanSelect.addEventListener('change', (e) => {\n treeView.options.autoPan = e.target.value;\n });\n\n container.appendChild(autoPanSelect);\n}\n\n/**\n * Populate Tree Manipulation tab controls\n */\nfunction populateTreeManipulationControls(\n container,\n getCurrentTreeState,\n refreshCurrentTab,\n updateExpandButtonStates,\n options,\n controlHeight,\n setExpandSubtreesBtn,\n setExpandRootBtn,\n setShowHiddenBtn\n) {\n container.innerHTML = '';\n\n const treeState = getCurrentTreeState();\n if (!treeState) {\n container.textContent = 'No tree selected';\n return;\n }\n\n // Expand subtrees button\n const expandSubtreesBtn = createButton('Expand subtrees', 'Expand all collapsed subtrees', controlHeight);\n\n // Check if there are any collapsed subtrees (excluding root)\n const hasCollapsedSubtrees = () => {\n let foundCollapsed = false;\n\n treeState.displayedRoot.each(node => {\n if (node !== treeState.displayedRoot && node.collapsedChildren) {\n foundCollapsed = true;\n }\n });\n\n return foundCollapsed;\n };\n\n // Set initial disabled state\n expandSubtreesBtn.disabled = !hasCollapsedSubtrees();\n\n expandSubtreesBtn.addEventListener('click', () => {\n const nodesToExpand = [];\n\n // Find all currently visible collapsed nodes (excluding root)\n treeState.displayedRoot.each(node => {\n if (node !== treeState.displayedRoot && node.collapsedChildren) {\n // Check if this node is visible (i.e., none of its ancestors are collapsed)\n let isVisible = true;\n let ancestor = node.parent;\n while (ancestor && ancestor !== treeState.displayedRoot) {\n if (ancestor.collapsedChildren) {\n isVisible = false;\n break;\n }\n ancestor = ancestor.parent;\n }\n\n if (isVisible) {\n nodesToExpand.push(node);\n }\n }\n });\n\n // Expand all visible collapsed nodes\n nodesToExpand.forEach(node => {\n treeState.expandSubtree(node);\n });\n\n // Update button states immediately\n updateExpandButtonStates();\n });\n\n // Store reference to button\n setExpandSubtreesBtn(expandSubtreesBtn);\n\n container.appendChild(expandSubtreesBtn);\n\n // Expand root button\n const expandRootBtn = createButton('Expand root', 'Expand the collapsed root', controlHeight);\n\n // Set initial disabled state based on whether root is collapsed\n expandRootBtn.disabled = !treeState.displayedRoot.collapsedParent;\n\n expandRootBtn.addEventListener('click', () => {\n if (treeState.displayedRoot.collapsedParent) {\n treeState.expandRoot();\n // Update button states immediately\n updateExpandButtonStates();\n }\n });\n\n // Store reference to button\n setExpandRootBtn(expandRootBtn);\n\n container.appendChild(expandRootBtn);\n\n // Show hidden button\n const showHiddenBtn = createButton('Show hidden', 'Show all hidden nodes', controlHeight);\n\n // Check if there are any hidden nodes\n const hasHiddenNodes = () => {\n let foundHidden = false;\n treeState.state.treeData.tree.each(node => {\n if (node.hiddenChildren && node.hiddenChildren.length > 0) {\n foundHidden = true;\n }\n });\n return foundHidden;\n };\n\n // Set initial disabled state\n showHiddenBtn.disabled = !hasHiddenNodes();\n\n showHiddenBtn.addEventListener('click', () => {\n treeState.showAllHidden();\n // Update button states immediately\n updateExpandButtonStates();\n });\n\n // Store reference to button\n setShowHiddenBtn(showHiddenBtn);\n\n container.appendChild(showHiddenBtn);\n\n // Scale branch length\n const branchLengthLabel = createLabel('Branch length:', controlHeight);\n container.appendChild(branchLengthLabel);\n\n // Convert actual scale value to slider position (logarithmic)\n const scaleToSlider = (scale, max = 10) => {\n const logMin = Math.log10(1 / max);\n const logMax = Math.log10(max);\n const logScale = Math.log10(scale);\n return ((logScale - logMin) / (logMax - logMin)) * 100;\n };\n\n // Convert slider position to actual scale value (logarithmic)\n const sliderToScale = (sliderValue, max = 10) => {\n const logMin = Math.log10(1 / max);\n const logMax = Math.log10(max);\n const logScale = logMin + (sliderValue / 100) * (logMax - logMin);\n return Math.pow(10, logScale);\n };\n\n const branchLengthSlider = createSlider(0, 100, scaleToSlider(treeState.state.branchLengthScale), 0.1, controlHeight);\n\n branchLengthSlider.addEventListener('input', (e) => {\n const sliderValue = parseFloat(e.target.value);\n const scale = sliderToScale(sliderValue);\n treeState.setBranchLengthScale(scale);\n });\n\n container.appendChild(branchLengthSlider);\n\n // Scale tree height\n const treeHeightLabel = createLabel('Tree height:', controlHeight);\n container.appendChild(treeHeightLabel);\n\n const treeHeightSlider = createSlider(0, 100, scaleToSlider(treeState.state.treeHeightScale), 0.1, controlHeight);\n\n treeHeightSlider.addEventListener('input', (e) => {\n const sliderValue = parseFloat(e.target.value);\n const scale = sliderToScale(sliderValue);\n treeState.setTreeHeightScale(scale);\n });\n\n container.appendChild(treeHeightSlider);\n\n // Radial layout toggle\n const radialLayoutLabel = createLabel('Radial layout:', controlHeight);\n container.appendChild(radialLayoutLabel);\n\n const isCircular = treeState.state.layout === 'circular';\n const radialLayoutToggle = createToggle(isCircular, controlHeight);\n\n // Update toggle state based on layout changes\n const updateToggleState = () => {\n const currentLayout = treeState.state.layout;\n if (currentLayout === 'circular') {\n radialLayoutToggle.classList.add('active');\n } else {\n radialLayoutToggle.classList.remove('active');\n }\n };\n\n // Subscribe to layout changes\n treeState.subscribe('layoutChange', updateToggleState);\n\n // Handle click - switch layout based on current state\n radialLayoutToggle.addEventListener('click', () => {\n const currentLayout = treeState.state.layout;\n treeState.setLayout(currentLayout === 'circular' ? 'rectangular' : 'circular');\n });\n\n container.appendChild(radialLayoutToggle);\n}\n\n/**\n * Populate Tip Label Settings tab controls\n */\nfunction populateTipLabelSettingsControls(container, getCurrentTreeState, options, controlHeight) {\n container.innerHTML = '';\n\n const treeState = getCurrentTreeState();\n if (!treeState) {\n container.textContent = 'No tree selected';\n return;\n }\n\n // Tip label text\n const tipLabelTextLabel = createLabel('Text:', controlHeight);\n container.appendChild(tipLabelTextLabel);\n\n const tipLabelTextContainer = document.createElement('div');\n tipLabelTextContainer.style.display = 'flex';\n\n const tipLabelTextSelect = createMetadataColumnSelect(\n treeState,\n 'tipLabelText',\n 'Default',\n controlHeight,\n true,\n null\n );\n tipLabelTextContainer.appendChild(tipLabelTextSelect);\n\n // const tipLabelTextEditBtn = createButton('✎', 'Edit scale settings', controlHeight);\n // tipLabelTextEditBtn.style.width = `${controlHeight}px`;\n // tipLabelTextEditBtn.style.flexShrink = '0';\n // tipLabelTextContainer.appendChild(tipLabelTextEditBtn);\n\n container.appendChild(tipLabelTextContainer);\n\n // Tip label color\n const tipLabelColorLabel = createLabel('Color:', controlHeight);\n container.appendChild(tipLabelColorLabel);\n\n const tipLabelColorContainer = document.createElement('div');\n tipLabelColorContainer.style.display = 'flex';\n\n const tipLabelColorSelect = createMetadataColumnSelect(\n treeState,\n 'tipLabelColor',\n 'Default',\n controlHeight,\n false,\n null\n );\n tipLabelColorContainer.appendChild(tipLabelColorSelect);\n\n // const tipLabelColorEditBtn = createButton('✎', 'Edit scale settings', controlHeight);\n // tipLabelColorEditBtn.style.width = `${controlHeight}px`;\n // tipLabelColorEditBtn.style.flexShrink = '0';\n // tipLabelColorContainer.appendChild(tipLabelColorEditBtn);\n\n container.appendChild(tipLabelColorContainer);\n\n // Tip label size\n const tipLabelSizeLabel = createLabel('Size:', controlHeight);\n container.appendChild(tipLabelSizeLabel);\n\n const tipLabelSizeContainer = document.createElement('div');\n tipLabelSizeContainer.style.display = 'flex';\n\n const tipLabelSizeSelect = createMetadataColumnSelect(\n treeState,\n 'tipLabelSize',\n 'Default',\n controlHeight,\n false,\n true\n );\n tipLabelSizeContainer.appendChild(tipLabelSizeSelect);\n\n // const tipLabelSizeEditBtn = createButton('✎', 'Edit scale settings', controlHeight);\n // tipLabelSizeEditBtn.style.width = `${controlHeight}px`;\n // tipLabelSizeEditBtn.style.flexShrink = '0';\n // tipLabelSizeContainer.appendChild(tipLabelSizeEditBtn);\n\n container.appendChild(tipLabelSizeContainer);\n\n // Tip label style\n const tipLabelStyleLabel = createLabel('Style:', controlHeight);\n container.appendChild(tipLabelStyleLabel);\n\n const tipLabelStyleContainer = document.createElement('div');\n tipLabelStyleContainer.style.display = 'flex';\n\n const tipLabelStyleSelect = createMetadataColumnSelect(\n treeState,\n 'tipLabelStyle',\n 'Default',\n controlHeight,\n false,\n false\n );\n tipLabelStyleContainer.appendChild(tipLabelStyleSelect);\n\n // const tipLabelStyleEditBtn = createButton('✎', 'Edit scale settings', controlHeight);\n // tipLabelStyleEditBtn.style.width = `${controlHeight}px`;\n // tipLabelStyleEditBtn.style.flexShrink = '0';\n // tipLabelStyleContainer.appendChild(tipLabelStyleEditBtn);\n\n container.appendChild(tipLabelStyleContainer);\n\n // Tip label font\n const tipLabelFontLabel = createLabel('Font:', controlHeight);\n container.appendChild(tipLabelFontLabel);\n\n const tipLabelFontSelect = document.createElement('select');\n tipLabelFontSelect.className = 'ht-select';\n tipLabelFontSelect.style.height = `${controlHeight}px`;\n\n const fonts = ['sans-serif', 'serif', 'monospace'];\n\n // Get current font value - check if it's set via aesthetic or use default\n const currentFont = treeState.state.aesthetics.tipLabelFont !== undefined\n ? treeState.aestheticsScales.tipLabelFont.getValue()\n : 'sans-serif';\n\n fonts.forEach(font => {\n const option = document.createElement('option');\n option.value = font;\n option.textContent = font;\n if (font === currentFont) {\n option.selected = true;\n }\n tipLabelFontSelect.appendChild(option);\n });\n\n // Handle font selection change\n tipLabelFontSelect.addEventListener('change', (e) => {\n const selectedFont = e.target.value;\n // Set the font as a direct value (not from metadata)\n treeState.setAesthetics({ tipLabelFont: undefined });\n // Then update all nodes to use this font\n treeState.state.treeData.tree.each(d => {\n d.tipLabelFont = selectedFont;\n });\n // Trigger coordinate update since font affects text size\n treeState.updateCoordinates();\n });\n\n container.appendChild(tipLabelFontSelect);\n}\n\n/**\n * Create a metadata column select dropdown\n */\nfunction createMetadataColumnSelect(treeState, aesthetic, defaultLabel, controlHeight, includeNone = false, continuous = null) {\n const select = document.createElement('select');\n select.className = 'ht-select';\n select.style.height = `${controlHeight}px`;\n select.style.flex = '1';\n\n // Add \"None\" option if requested (for disabling the aesthetic)\n if (includeNone) {\n const noneOption = document.createElement('option');\n noneOption.value = 'none';\n noneOption.textContent = 'None';\n select.appendChild(noneOption);\n }\n\n // Add default option\n const defaultOption = document.createElement('option');\n defaultOption.value = '';\n defaultOption.textContent = defaultLabel;\n select.appendChild(defaultOption);\n\n // Get all metadata columns\n const treeData = treeState.state.treeData;\n const columnIds = Array.from(treeData.columnDisplayName.keys());\n\n // Filter columns for continuous/categorical metadata\n let filteredColumnIds = columnIds;\n if (continuous !== null) {\n if (continuous) {\n filteredColumnIds = columnIds.filter(columnId => treeData.columnType.get(columnId) === 'continuous')\n } else {\n filteredColumnIds = columnIds.filter(columnId => treeData.columnType.get(columnId) === 'categorical')\n }\n }\n\n // Add options for each metadata column\n filteredColumnIds.forEach(columnId => {\n const option = document.createElement('option');\n option.value = columnId;\n option.textContent = treeData.columnDisplayName.get(columnId);\n\n // Check if this column is currently selected for this aesthetic\n if (treeState.state.aesthetics[aesthetic] === columnId) {\n option.selected = true;\n }\n\n select.appendChild(option);\n });\n\n // Set the selected option based on current aesthetic value\n const currentValue = treeState.state.aesthetics[aesthetic];\n if (currentValue === null) {\n select.value = 'none';\n } else if (currentValue === undefined || currentValue === '') {\n select.value = '';\n } else {\n select.value = currentValue;\n }\n\n // Handle selection change\n select.addEventListener('change', (e) => {\n let columnId;\n if (e.target.value === 'none') {\n // Special handling for \"None\" - set aesthetic to null to disable it\n columnId = null;\n } else if (e.target.value === '') {\n // Empty string means use default behavior\n columnId = undefined;\n } else {\n columnId = e.target.value;\n }\n const aestheticUpdate = {};\n aestheticUpdate[aesthetic] = columnId;\n treeState.setAesthetics(aestheticUpdate);\n });\n\n return select;\n}\n\n/**\n * Populate Export tab controls\n */\nfunction populateExportControls(container, getCurrentTreeState, getCurrentTreeView, getCurrentTreeName, options, controlHeight) {\n container.innerHTML = '';\n\n const treeState = getCurrentTreeState();\n const treeView = getCurrentTreeView();\n\n if (!treeState || !treeView) {\n container.textContent = 'No tree selected';\n return;\n }\n\n // Get tree bounds including legends\n const bounds = treeView.getCurrentBoundsWithLegends();\n const treeWidth = bounds.maxX - bounds.minX;\n const treeHeight = bounds.maxY - bounds.minY;\n\n // State for export settings\n const exportState = {\n format: 'svg',\n width: treeWidth,\n height: treeHeight,\n margin: 18,\n maintainAspectRatio: true\n };\n\n // Calculate aspect ratio\n const aspectRatio = treeWidth / treeHeight;\n\n // PPI for conversion\n const PPI = 300;\n const CM_PER_INCH = 2.54;\n\n // Conversion functions\n const pxToCm = (px) => (px / PPI) * CM_PER_INCH;\n const cmToPx = (cm) => (cm / CM_PER_INCH) * PPI;\n\n // Get display value based on format\n const getDisplayValue = (px, format) => {\n if (format === 'png') {\n return Math.round(px);\n } else {\n return Math.round(pxToCm(px) * 100) / 100;\n }\n };\n\n // Get actual pixel value from display value\n const getPixelValue = (displayValue, format) => {\n if (format === 'png') {\n return displayValue;\n } else {\n return cmToPx(displayValue);\n }\n };\n\n // Function to update dimensions based on current tree bounds\n const updateDimensions = () => {\n const newBounds = treeView.getCurrentBoundsWithLegends();\n const newWidth = newBounds.maxX - newBounds.minX;\n const newHeight = newBounds.maxY - newBounds.minY;\n\n exportState.width = newWidth;\n exportState.height = newHeight;\n\n widthInput.value = getDisplayValue(newWidth, exportState.format);\n heightInput.value = getDisplayValue(newHeight, exportState.format);\n };\n\n // Subscribe to coordinate changes to update dimensions\n const coordinateChangeUnsubscribe = treeState.subscribe('coordinateChange', updateDimensions);\n\n // Subscribe to legend changes to update dimensions\n const legendsChangeUnsubscribe = treeState.subscribe('legendsChange', updateDimensions);\n\n // Clean up subscriptions when the tab is closed or changed\n // We'll store the cleanup function on the container element\n container.dataset.cleanup = () => {\n coordinateChangeUnsubscribe();\n legendsChangeUnsubscribe();\n };\n\n // Export button\n const exportBtn = createButton('Export', 'Export the tree to a file', controlHeight);\n exportBtn.classList.add('primary');\n exportBtn.addEventListener('click', () => {\n // Get current tree name and sanitize it for use as filename\n const treeName = getCurrentTreeName();\n const sanitizedName = treeName.replace(/[^a-z0-9_-]/gi, '_');\n const extension = exportState.format === 'svg' ? 'svg' : 'png';\n const filename = `${sanitizedName}.${extension}`;\n\n exportTree(treeView, exportState, filename);\n });\n container.appendChild(exportBtn);\n\n // Output format\n const formatLabel = createLabel('Output format:', controlHeight);\n container.appendChild(formatLabel);\n\n const formatSelect = document.createElement('select');\n formatSelect.className = 'ht-select';\n formatSelect.style.height = `${controlHeight}px`;\n\n ['SVG', 'PNG'].forEach(format => {\n const option = document.createElement('option');\n option.value = format.toLowerCase();\n option.textContent = format;\n if (format.toLowerCase() === exportState.format) {\n option.selected = true;\n }\n formatSelect.appendChild(option);\n });\n\n formatSelect.addEventListener('change', (e) => {\n const oldFormat = exportState.format;\n exportState.format = e.target.value;\n\n // Update input values and units when format changes\n widthInput.value = getDisplayValue(exportState.width, exportState.format);\n heightInput.value = getDisplayValue(exportState.height, exportState.format);\n marginInput.value = getDisplayValue(exportState.margin, exportState.format);\n\n // Update unit labels\n const unit = exportState.format === 'png' ? 'px' : 'cm';\n widthLabel.textContent = `Width (${unit}):`;\n heightLabel.textContent = `Height (${unit}):`;\n marginLabel.textContent = `Margin (${unit}):`;\n });\n\n container.appendChild(formatSelect);\n\n // Width input\n const widthLabel = createLabel(`Width (${exportState.format === 'png' ? 'px' : 'cm'}):`, controlHeight);\n container.appendChild(widthLabel);\n\n const widthInput = createNumberInput(\n getDisplayValue(exportState.width, exportState.format),\n 0.1,\n 10000,\n 0.1,\n controlHeight\n );\n\n widthInput.addEventListener('input', (e) => {\n const displayValue = parseFloat(e.target.value);\n if (isNaN(displayValue) || displayValue <= 0) return;\n\n exportState.width = getPixelValue(displayValue, exportState.format);\n\n if (exportState.maintainAspectRatio) {\n exportState.height = exportState.width / aspectRatio;\n heightInput.value = getDisplayValue(exportState.height, exportState.format);\n }\n });\n\n container.appendChild(widthInput);\n\n // Height input\n const heightLabel = createLabel(`Height (${exportState.format === 'png' ? 'px' : 'cm'}):`, controlHeight);\n container.appendChild(heightLabel);\n\n const heightInput = createNumberInput(\n getDisplayValue(exportState.height, exportState.format),\n 0.1,\n 10000,\n 0.1,\n controlHeight\n );\n\n heightInput.addEventListener('input', (e) => {\n const displayValue = parseFloat(e.target.value);\n if (isNaN(displayValue) || displayValue <= 0) return;\n\n exportState.height = getPixelValue(displayValue, exportState.format);\n\n if (exportState.maintainAspectRatio) {\n exportState.width = exportState.height * aspectRatio;\n widthInput.value = getDisplayValue(exportState.width, exportState.format);\n }\n });\n\n container.appendChild(heightInput);\n\n // Margin input\n const marginLabel = createLabel(`Margin (${exportState.format === 'png' ? 'px' : 'cm'}):`, controlHeight);\n container.appendChild(marginLabel);\n\n const marginInput = createNumberInput(\n getDisplayValue(exportState.margin, exportState.format),\n 0,\n 100,\n 0.1,\n controlHeight\n );\n\n marginInput.addEventListener('input', (e) => {\n const displayValue = parseFloat(e.target.value);\n if (isNaN(displayValue) || displayValue < 0) return;\n\n exportState.margin = getPixelValue(displayValue, exportState.format);\n });\n\n container.appendChild(marginInput);\n}\n\n/**\n * Export tree to file\n */\nfunction exportTree(treeView, exportState, filename) {\n const bounds = treeView.getCurrentBoundsWithLegends();\n\n // Calculate dimensions\n const contentWidth = bounds.maxX - bounds.minX;\n const contentHeight = bounds.maxY - bounds.minY;\n\n // Calculate scale to fit content into export dimensions\n const scaleX = exportState.width / contentWidth;\n const scaleY = exportState.height / contentHeight;\n const scale = Math.min(scaleX, scaleY);\n\n // Calculate final dimensions with margin\n const finalWidth = exportState.width + 2 * exportState.margin;\n const finalHeight = exportState.height + 2 * exportState.margin;\n\n // Calculate translation to center content and add margin\n const translateX = exportState.margin - bounds.minX * scale;\n const translateY = exportState.margin - bounds.minY * scale;\n\n // Create a new SVG element for export\n const exportSvg = document.createElementNS('http://www.w3.org/2000/svg', 'svg');\n exportSvg.setAttribute('width', finalWidth);\n exportSvg.setAttribute('height', finalHeight);\n exportSvg.setAttribute('xmlns', 'http://www.w3.org/2000/svg');\n\n // Create a group for the transformed content\n const contentGroup = document.createElementNS('http://www.w3.org/2000/svg', 'g');\n contentGroup.setAttribute('transform', `translate(${translateX}, ${translateY}) scale(${scale})`);\n\n // Clone the tree elements from the view\n const treeGroup = treeView.layers.treeGroup.node();\n const clonedTreeGroup = treeGroup.cloneNode(true);\n\n // Remove the transform attribute from the cloned group (we'll apply our own)\n clonedTreeGroup.removeAttribute('transform');\n\n // Remove selection rectangle and buttons from export\n const selectionRect = clonedTreeGroup.querySelector('.selection-rect');\n if (selectionRect) {\n selectionRect.remove();\n }\n\n contentGroup.appendChild(clonedTreeGroup);\n exportSvg.appendChild(contentGroup);\n\n // Serialize the SVG\n const serializer = new XMLSerializer();\n const svgString = serializer.serializeToString(exportSvg);\n\n if (exportState.format === 'svg') {\n // Download as SVG\n downloadFile(svgString, filename, 'image/svg+xml');\n } else if (exportState.format === 'png') {\n // Convert to PNG\n convertSvgToPng(svgString, finalWidth, finalHeight, filename);\n }\n}\n\n/**\n * Download a file\n */\nfunction downloadFile(content, filename, mimeType) {\n const blob = new Blob([content], { type: mimeType });\n const url = URL.createObjectURL(blob);\n const link = document.createElement('a');\n link.href = url;\n link.download = filename;\n document.body.appendChild(link);\n link.click();\n document.body.removeChild(link);\n URL.revokeObjectURL(url);\n}\n\n/**\n * Convert SVG to PNG\n */\nfunction convertSvgToPng(svgString, width, height, filename) {\n const canvas = document.createElement('canvas');\n canvas.width = width;\n canvas.height = height;\n const ctx = canvas.getContext('2d');\n\n const img = new Image();\n const svgBlob = new Blob([svgString], { type: 'image/svg+xml;charset=utf-8' });\n const url = URL.createObjectURL(svgBlob);\n\n img.onload = () => {\n ctx.fillStyle = 'white';\n ctx.fillRect(0, 0, width, height);\n ctx.drawImage(img, 0, 0);\n\n canvas.toBlob((blob) => {\n const pngUrl = URL.createObjectURL(blob);\n const link = document.createElement('a');\n link.href = pngUrl;\n link.download = filename;\n document.body.appendChild(link);\n link.click();\n document.body.removeChild(link);\n URL.revokeObjectURL(pngUrl);\n URL.revokeObjectURL(url);\n });\n };\n\n img.src = url;\n}\n\n/**\n * Helper function to create a label\n */\nfunction createLabel(text, height) {\n const label = document.createElement('label');\n label.className = 'ht-control-label';\n label.textContent = text;\n label.style.height = `${height}px`;\n return label;\n}\n\n/**\n * Helper function to create a button\n */\nfunction createButton(text, title = '', height) {\n const button = document.createElement('button');\n button.className = 'ht-button';\n button.textContent = text;\n button.title = title;\n button.style.height = `${height}px`;\n return button;\n}\n\n/**\n * Helper function to create a slider\n */\nfunction createSlider(min, max, value, step, height) {\n const slider = document.createElement('input');\n slider.type = 'range';\n slider.className = 'ht-slider';\n slider.min = min;\n slider.max = max;\n slider.value = value;\n slider.step = step;\n slider.style.height = `${height}px`;\n return slider;\n}\n\n/**\n * Helper function to create a toggle switch\n */\nfunction createToggle(initialState, height) {\n const toggleHeight = Math.min(24, height - 4);\n const knobSize = toggleHeight - 4;\n\n const toggle = document.createElement('div');\n toggle.className = initialState ? 'ht-toggle active' : 'ht-toggle';\n toggle.style.height = `${toggleHeight}px`;\n\n const knob = document.createElement('div');\n knob.className = 'ht-toggle-knob';\n knob.style.width = `${knobSize}px`;\n knob.style.height = `${knobSize}px`;\n\n toggle.appendChild(knob);\n\n // Note: Click handler should be added by the caller, not here\n // This allows the caller to control the toggle state explicitly\n\n return toggle;\n}\n\n/**\n * Helper function to create a number input\n */\nfunction createNumberInput(value, min, max, step, height) {\n const input = document.createElement('input');\n input.type = 'number';\n input.className = 'ht-number-input';\n input.value = value;\n input.min = min;\n input.max = max;\n input.step = step;\n input.style.height = `${height}px`;\n return input;\n}\n","import { TreeData } from './treeData.js';\nimport { TreeState } from './treeState.js';\nimport { TreeView } from './treeView.js';\nimport { TextSizeEstimator } from './textAspectRatioPrediction.js';\nimport { createToolbar } from './toolbar.js';\nimport styles from './styles.css?inline';\n\n/**\n * Inject styles into the document if not already present\n */\nfunction injectStyles() {\n const styleId = 'heat-tree-styles';\n if (!document.getElementById(styleId)) {\n const styleElement = document.createElement('style');\n styleElement.id = styleId;\n styleElement.textContent = styles;\n document.head.appendChild(styleElement);\n }\n}\n\n/**\n * Create a heat tree visualization\n * @param {Object|string} treesConfig - Configuration object with trees array, or container selector string\n * @param {Array} treesConfig.trees - Array of tree objects, each with newick, name, and metadata (optional)\n * @param {string} containerSelector - CSS selector for container element (required if first arg is config object)\n * @param {Object} options - Configuration options\n * @returns {Object} Object containing references to tree components\n */\nexport function heatTree(treesConfig, containerSelector, options = {}) {\n // Handle different argument patterns\n if (typeof treesConfig === 'string') {\n // Pattern: heatTree('#container') or heatTree('#container', options)\n // First argument is the container selector\n options = containerSelector || {};\n containerSelector = treesConfig;\n treesConfig = { trees: [] };\n } else if (treesConfig && typeof treesConfig === 'object') {\n // Pattern: heatTree({ trees: [...] }, '#container', options)\n // First argument is config object\n if (!containerSelector || typeof containerSelector !== 'string') {\n throw new Error('heatTree requires a container selector as the second argument when first argument is a config object');\n }\n // Ensure trees array exists\n if (!treesConfig.trees) {\n treesConfig.trees = [];\n }\n } else {\n // Invalid first argument\n throw new Error('heatTree requires either a container selector string or a configuration object as the first argument');\n }\n\n // Ensure trees is an array\n if (!Array.isArray(treesConfig.trees)) {\n throw new Error('treesConfig.trees must be an array');\n }\n\n injectStyles();\n\n // Set default options\n options = {\n buttonSize: 25,\n transitionDuration: 500,\n manualZoomAndPanEnabled: true,\n autoZoom: 'Default',\n autoPan: 'Default',\n ...options\n };\n\n // Initialize text size estimator (shared across all trees)\n const textSizeEstimator = new TextSizeEstimator();\n\n // Create TreeData instances for each tree\n const treeDataInstances = new Map();\n const treeConfigAesthetics = new Map();\n\n treesConfig.trees.forEach((treeConfig, index) => {\n if (!treeConfig.newick) {\n throw new Error(`Tree at index ${index} is missing newick string`);\n }\n\n const treeName = treeConfig.name || `Tree ${index + 1}`;\n\n // Process metadata tables - can be array of objects with name and data, or just data objects\n let metadataTables = [];\n let metadataNames = [];\n\n if (treeConfig.metadata) {\n const metadataArray = Array.isArray(treeConfig.metadata) ? treeConfig.metadata : [treeConfig.metadata];\n\n metadataArray.forEach((metadataItem, metaIndex) => {\n if (metadataItem.name && metadataItem.data) {\n // Named metadata table\n metadataTables.push(metadataItem.data);\n metadataNames.push(metadataItem.name);\n } else {\n // Unnamed metadata table - use as-is\n metadataTables.push(metadataItem);\n metadataNames.push(`Metadata ${metaIndex + 1}`);\n }\n });\n }\n\n const treeData = new TreeData(treeConfig.newick, metadataTables, metadataNames);\n let treeAesthetics;\n if (treeConfig.aesthetics) {\n treeAesthetics = Object.fromEntries(\n Object.entries(treeConfig.aesthetics).map(([aes, col]) => {\n for (const [assignedColId, originalName] of treeData.columnName.entries()) {\n if (originalName === col) {\n return [aes, assignedColId];\n }\n }\n return undefined;\n })\n )\n } else {\n treeAesthetics = undefined;\n }\n treeDataInstances.set(treeName, treeData);\n treeConfigAesthetics.set(treeName, treeAesthetics);\n });\n\n // Cache for TreeState and TreeView instances\n const treeStateCache = new Map();\n const treeViewCache = new Map();\n\n // Get container element\n const container = document.querySelector(containerSelector);\n if (!container) {\n throw new Error(`Container element not found: ${containerSelector}`);\n }\n\n // Create main widget structure\n const widgetDiv = document.createElement('div');\n widgetDiv.className = 'ht-widget';\n const toolbarDiv = document.createElement('div');\n toolbarDiv.className = 'ht-toolbar';\n const treeDiv = document.createElement('div');\n treeDiv.className = 'ht-tree';\n const treeSvg = document.createElementNS('http://www.w3.org/2000/svg', 'svg');\n treeSvg.setAttribute('width', '100%');\n treeSvg.setAttribute('height', '100%');\n\n // Assemble widget structure\n treeDiv.appendChild(treeSvg);\n widgetDiv.appendChild(toolbarDiv);\n widgetDiv.appendChild(treeDiv);\n container.appendChild(widgetDiv);\n\n // Track current tree\n let currentTreeName = null;\n let currentTreeState = null;\n let currentTreeView = null;\n\n // Store toolbar refresh function\n let refreshToolbar = null;\n\n /**\n * Callback for when toolbar dimensions change\n */\n function onToolbarDimensionsChange() {\n if (currentTreeView) {\n currentTreeView.fitToView();\n }\n }\n\n /**\n * Add a new tree to the visualization\n * @param {string} treeName - Name for the new tree\n * @param {string} newickStr - Newick string for the tree\n * @param {Array} metadataTables - Optional array of metadata table strings\n * @param {Array} metadataNames - Optional array of metadata table names\n */\n function addNewTree(treeName, newickStr, metadataTables = [], metadataNames = []) {\n // Ensure unique name\n let uniqueName = treeName;\n let counter = 1;\n while (treeDataInstances.has(uniqueName)) {\n uniqueName = `${treeName} (${counter})`;\n counter++;\n }\n\n // Create new TreeData instance\n const treeData = new TreeData(newickStr, metadataTables, metadataNames);\n treeDataInstances.set(uniqueName, treeData);\n\n return uniqueName;\n }\n\n /**\n * Switch to a different tree\n * @param {string} treeName - Name of the tree to switch to\n */\n function switchToTree(treeName) {\n if (!treeDataInstances.has(treeName)) {\n console.error(`Tree not found: ${treeName}`);\n return;\n }\n\n // If switching to the same tree, do nothing\n if (currentTreeName === treeName && currentTreeView) {\n return;\n }\n\n // Clear the SVG before switching trees\n while (treeSvg.firstChild) {\n treeSvg.removeChild(treeSvg.firstChild);\n }\n\n // Get or create TreeState for this tree\n if (!treeStateCache.has(treeName)) {\n const treeState = new TreeState({\n treeData: treeDataInstances.get(treeName),\n aesthetics: treeConfigAesthetics.get(treeName),\n ...options\n }, textSizeEstimator);\n treeStateCache.set(treeName, treeState);\n }\n\n // Get or create TreeView for this tree\n if (!treeViewCache.has(treeName)) {\n const treeState = treeStateCache.get(treeName);\n const treeView = new TreeView(treeState, treeSvg, options);\n treeViewCache.set(treeName, treeView);\n } else {\n // Reattach existing TreeView to the SVG\n const treeView = treeViewCache.get(treeName);\n treeView.reattach(treeSvg);\n }\n\n // Update current references\n currentTreeName = treeName;\n currentTreeState = treeStateCache.get(treeName);\n currentTreeView = treeViewCache.get(treeName);\n\n // Refresh toolbar if the refresh function is available\n if (refreshToolbar) {\n refreshToolbar();\n }\n }\n\n // Create toolbar with tree switching capability\n refreshToolbar = createToolbar(\n toolbarDiv,\n treeDataInstances,\n () => currentTreeState,\n () => currentTreeView,\n switchToTree,\n addNewTree,\n options,\n onToolbarDimensionsChange\n );\n\n // Display the first tree initially (if any trees exist)\n if (treeDataInstances.size > 0) {\n const firstTreeName = Array.from(treeDataInstances.keys())[0];\n switchToTree(firstTreeName);\n }\n\n // Return references to components\n return {\n treeDataInstances,\n treeStateCache,\n treeViewCache,\n getCurrentTreeState: () => currentTreeState,\n getCurrentTreeView: () => currentTreeView,\n getCurrentTreeName: () => currentTreeName,\n switchToTree,\n addNewTree,\n container: widgetDiv\n };\n}\n"],"names":["ascending","a","b","noop","dispatch","i","n","_","t","Dispatch","parseTypenames","typenames","types","name","typename","callback","T","get","set","copy","type","that","args","c","xhtml","namespaces","namespace","prefix","creatorInherit","document","uri","creatorFixed","fullname","creator","none","selector","selection_select","select","groups","m","subgroups","j","group","subgroup","node","subnode","Selection","array","x","empty","selectorAll","arrayAll","selection_selectAll","parents","matcher","childMatcher","find","childFind","match","childFirst","selection_selectChild","filter","children","childrenFilter","selection_selectChildren","selection_filter","sparse","update","selection_enter","EnterNode","parent","datum","child","next","constant$3","bindIndex","enter","exit","data","groupLength","dataLength","bindKey","key","nodeByKeyValue","keyValues","keyValue","selection_data","value","bind","constant","arraylike","enterGroup","updateGroup","exitGroup","i0","i1","previous","selection_exit","selection_join","onenter","onupdate","onexit","selection_merge","context","selection","groups0","groups1","m0","m1","merges","group0","group1","merge","selection_order","selection_sort","compare","compareNode","sortgroups","sortgroup","selection_call","selection_nodes","selection_node","selection_size","size","selection_empty","selection_each","attrRemove","attrRemoveNS","attrConstant","attrConstantNS","attrFunction","v","attrFunctionNS","selection_attr","defaultView","styleRemove","styleConstant","priority","styleFunction","selection_style","styleValue","propertyRemove","propertyConstant","propertyFunction","selection_property","classArray","string","classList","ClassList","classedAdd","names","list","classedRemove","classedTrue","classedFalse","classedFunction","selection_classed","textRemove","textConstant","textFunction","selection_text","htmlRemove","htmlConstant","htmlFunction","selection_html","raise","selection_raise","lower","selection_lower","selection_append","create","constantNull","selection_insert","before","remove","selection_remove","selection_cloneShallow","clone","selection_cloneDeep","selection_clone","deep","selection_datum","contextListener","listener","event","onRemove","on","o","onAdd","options","selection_on","dispatchEvent","params","window","dispatchConstant","dispatchFunction","selection_dispatch","selection_iterator","root","selection_selection","sourceEvent","pointer","svg","point","rect","nonpassivecapture","noevent$1","dragDisable","view","noevent","yesdrag","noclick","define","constructor","factory","prototype","extend","definition","Color","darker","brighter","reI","reN","reP","reHex","reRgbInteger","reRgbPercent","reRgbaInteger","reRgbaPercent","reHslPercent","reHslaPercent","named","color","channels","color_formatHex","color_formatHex8","color_formatHsl","color_formatRgb","hslConvert","format","l","rgbn","Rgb","rgba","hsla","r","g","rgbConvert","rgb","opacity","k","clampi","clampa","rgb_formatHex","rgb_formatHex8","rgb_formatRgb","hex","h","s","Hsl","min","max","hsl","m2","hsl2rgb","clamph","clampt","constant$2","linear","d","exponential","y","gamma","nogamma","interpolateRgb","rgbGamma","start","end","colorRgb","interpolateNumber","reA","reB","zero","one","interpolateString","bi","am","bm","bs","q","number","degrees","identity","decompose","e","f","scaleX","scaleY","skewX","svgNode","parseCss","parseSvg","interpolateTransform","parse","pxComma","pxParen","degParen","pop","translate","xa","ya","xb","yb","rotate","scale","interpolateTransformCss","interpolateTransformSvg","epsilon2","cosh","sinh","tanh","interpolateZoom","zoomRho","rho","rho2","rho4","zoom","p0","p1","ux0","uy0","w0","ux1","uy1","w1","dx","dy","d2","S","d1","b0","b1","r0","r1","coshr0","u","_1","_2","_4","frame","timeout","interval","pokeDelay","taskHead","taskTail","clockLast","clockNow","clockSkew","clock","setFrame","now","clearNow","Timer","timer","delay","time","sleep","timerFlush","wake","nap","poke","t0","t1","t2","elapsed","emptyOn","emptyTween","CREATED","SCHEDULED","STARTING","STARTED","RUNNING","ENDING","ENDED","schedule","id","index","timing","schedules","init","self","tween","stop","tick","interrupt","active","selection_interrupt","tweenRemove","tween0","tween1","tweenFunction","transition_tween","tweenValue","transition","interpolate","value1","string00","string1","interpolate0","string0","string10","transition_attr","attrInterpolate","attrInterpolateNS","attrTweenNS","attrTween","transition_attrTween","delayFunction","delayConstant","transition_delay","durationFunction","durationConstant","transition_duration","easeConstant","transition_ease","easeVarying","transition_easeVarying","transition_filter","Transition","transition_merge","onFunction","on0","on1","sit","transition_on","removeFunction","transition_remove","transition_select","transition_selectAll","inherit","transition_selection","styleNull","style","styleMaybeRemove","listener0","transition_style","styleInterpolate","styleTween","transition_styleTween","transition_text","textInterpolate","textTween","transition_textTween","transition_transition","id0","id1","newId","transition_end","resolve","reject","cancel","selection_prototype","cubicInOut","defaultTiming","easeCubicInOut","selection_transition","pi","tau","epsilon","tauEpsilon","append","strings","appendRound","digits","Path","x1","y1","x2","y2","x0","y0","x21","y21","x01","y01","l01_2","x20","y20","l21_2","l20_2","l21","l01","t01","t21","a0","a1","ccw","cw","da","w","defaultSeparation","meanX","meanXReduce","maxY","maxYReduce","leafLeft","leafRight","cluster","separation","nodeSize","previousNode","left","right","count","sum","node_count","node_each","node_eachBefore","nodes","node_eachAfter","node_find","node_sum","node_sort","node_path","ancestor","leastCommonAncestor","aNodes","bNodes","node_ancestors","node_descendants","node_leaves","leaves","node_links","links","node_iterator","current","hierarchy","mapChildren","objectChildren","Node","childs","computeHeight","node_copy","copyData","height","constant$1","sqrt","withPath","shape","circle","sqrt3","symbolTriangle","Symbol","path","symbol","buffer","ZoomEvent","target","transform","Transform","location","nopropagation","defaultFilter","defaultExtent","defaultTransform","defaultWheelDelta","defaultTouchable","defaultConstrain","extent","translateExtent","dx0","dx1","dy0","dy1","constrain","wheelDelta","touchable","scaleExtent","duration","listeners","touchstarting","touchfirst","touchending","touchDelay","wheelDelay","clickDistance2","tapDistance","wheeled","mousedowned","dblclicked","touchstarted","touchmoved","touchended","collection","gesture","p","k0","k1","centroid","clean","Gesture","wheelidled","currentTarget","mousemoved","mouseupped","dragEnable","touches","started","l0","l1","dp","dl","niceNumber","exponent","fraction","niceFraction","triangleAreaFromSide","side","createDashArray","repeatLen","width","nDash","totalUnits","summedDashLength","smallestDashLength","pattern","columnToHeader","columnName","capitalizeFirstOnly","preserveAcronyms","result","char","generateNiceTicks","targetCount","range","roughStep","magnitude","normalizedStep","niceStep","step","firstTick","ticks","formatTickLabel","allTicks","decimals","Subscribable","parseNewick","newickStr","parseTree","label","parts","parseTable","tsvStr","sep","metadataMap","metadataColumns","columnTypes","lines","headers","nodeIdIndex","columnValues","col","values","nodeId","metadata","colName","numericValues","isContinuous","NullScale","defaultValue","IdentityScale","validValues","transformFn","CategoricalTextScale","outputCategories","frequencyMap","category","sortedCategories","sortedCategoriesKeys","ContinuousSizeScale","dataMin","dataMax","sizeMin","sizeMax","clampedValue","ContinuousColorScale","transformMin","transformMax","colors","colorPositions","paired","pos","minPos","maxPos","lastColor","midIdx","midColor","dataT","transformedT","clampedT","lowerIdx","upperIdx","segmentT","color1","color2","CategoricalColorScale","categoryData","maxColors","entry","hexColor","nCategories","Aesthetic","scaleType","isCategorical","isAlreadyOutputFormat","TreeData","#nextTableId","metadataTables","metadataTableNames","tableStr","tableName","treeData","#attachTable","columnIdMap","originalName","columnType","uniqueId","transformedMetadata","nodeName","nodeData","transformedNodeData","originalColumnName","tableId","table","keys","#detachTable","columnId","aestheticId","defaultState","aestheticMap","aesthetic","#createAesthetic","state","displayName","tableMetadata","calculateScalingFactors","leafData","branchLenToPxFactor_min","branchLenToPxFactor_max","labelSizeToPxFactor_min","labelSizeToPxFactor_max","applyBranchMax","newMax","applyBranchMin","newMin","applyLabelMax","applyLabelMin","minLabelScale","maxBranchX","nonZeroBranches","minbranchLength","calculateCircularScalingFactors","minBranchX","minBranchLength","applyBranchViewConstraint","rightBranchFactor","leftBranchFactor","bottomBranchFactor","topBranchFactor","applyLabelViewConstraint","rightLabelFactor","leftLabelFactor","bottomLabelFactor","topLabelFactor","totalAnnotationHeight","TextSizeEstimator","text","styles","cacheKey","tempText","bbox","computedStyle","fontSize","TreeState","#AESTHETICS","textSizeEstimator","#initalize","info","layout","force","downstreams","legendsChanged","aesData","methodName","#updateLegends","aIndex","bIndex","hiddenNodes","newRoot","originalX","originalY","scalingFactors","tipLabelXOffset","minRadius","maxRadius","angleLabelOffset","minAngle","maxAngle","xValues","yValues","ICONS","appendIcon","svgSel","padding","iconPathData","button","paths","LegendBase","translateX","translateY","title","BranchLengthLegend","units","barWidth","unitLabelSize","titleHeightOffset","barY","TextSizeLegend","minValue","maxValue","minSize","maxSize","maxLetterFont","minLetterFont","baseWidth","tickLabelSizes","tickValue","labelText","leftOverhang","rightOverhang","rampBaseY","unitsSize","polygonPoints","TextColorLegend","titleSize","#updateCoordinatesCategorical","#updateCoordinatesContinuous","categories","maxWidth","currentX","currentY","rowHeight","labelSize","itemWidth","gradientY","ticksY","labelsY","#renderCategorical","#renderContinuous","item","gradientId","gradient","TreeView","treeState","svgContainer","#clearSelection","#initializeLayers","#subscribeToStateChanges","#initialRender","#updateBranches","#updateNodes","#updateHitAreas","treeGroup","#createSelectionButtons","btnGroup","buttonConfig","btn","#updateSelectionButtons","#handleCoordinateChange","#updateTipLabelText","#updateTipLabelColor","#updateTipLabelSize","#updateTipLabelFont","#updateTipLabelStyle","#updateNodeLabelText","branchGroupsEnter","nodeGroupsEnter","#updateSelectionRect","treeBounds","#getCurrentBounds","branchLengthLegend","legendData","legend","input","viewW","viewH","bounds","treeWidth","treeHeight","marginLeft","availableWidth","availableHeight","tx","ty","scaledTreeWidth","leftSpace","rightSpace","scaledTreeHeight","topSpace","bottomSpace","zoomIdentity","minX","#getCollapsedRootLineLength","#selectNode","#generateSelectionPath","innerStart","innerEnd","outerStart","outerEnd","largeArcFlag","topLeft","topRight","bottomRight","bottomLeft","controlsMarginFactor","isCircular","numSamples","minXY","angle","innerX","innerY","outerX","outerY","visibleButtonIndex","yOffset","totalButtonHeight","screenX","screenY","branchWidth","collapsedRootLineLength","hits","tipHits","collapsedHits","#getLabelRotation","#isLeftSide","collapsedRootHits","rotationAngle","branchGroups","#createBranchGroup","branchGroupsUpdate","#updateBranchPaths","offsetPaths","extensionPaths","#getBranchPath","link","pathType","arcEnd","sweepFlag","#getCollapsedTrianglePath","triangleArea","nodeGroups","#createNodeGroup","nodeGroupsUpdate","#updateNodePositions","#updateNodeLabels","#updateNodeShapes","#updateCollapsedIndicators","#getTipLabelAnchor","#getNodeLabelAnchor","tipLabels","nodeLabels","#getNodeLabelDy","nodeShapes","#getTriangleRotation","collapsedRootLines","#getCollapsedRootLineEnd","angleDeg","parentBelow","lineLength","avgAngle","createToolbar","toolbarDiv","treeDataInstances","getCurrentTreeState","getCurrentTreeView","switchToTree","addNewTree","onDimensionsChange","currentTab","selectedMetadata","expandSubtreesBtn","expandRootBtn","showHiddenBtn","currentTreeStateSubscription","controlPanelVisible","toggleContainer","toggleButton","collapsiblePanel","tabsContainer","controlsContainer","tabs","tabElements","tab","tabDiv","closeTab","openTab","updateTabStates","hasTree","tabElement","currentTabDef","getCurrentMetadataNames","getSelectedMetadata","setSelectedMetadata","metadataName","resetSelectedMetadata","metadataNames","updateExpandButtonStates","hasCollapsedSubtrees","hasHiddenNodes","getCurrentTreeName","tabId","tabDef","populateControls","populateDataControls","refreshCurrentTab","populateControlsTab","populateTreeManipulationControls","populateTipLabelSettingsControls","populateExportControls","container","controlHeight","treeLabel","createLabel","treeSelect","treeNames","currentTreeState","currentTreeName","option","treeName","treeFileInput","file","uniqueName","counter","error","addTreeBtn","createButton","metadataLabel","metadataSelect","metadataFileInput","metadataStr","separator","actualName","addMetadataBtn","treeView","fitToViewBtn","manualZoomPanLabel","manualZoomPanToggle","createToggle","autoZoomLabel","autoZoomSelect","optionElement","autoPanLabel","autoPanSelect","setExpandSubtreesBtn","setExpandRootBtn","setShowHiddenBtn","foundCollapsed","nodesToExpand","isVisible","foundHidden","branchLengthLabel","scaleToSlider","logMin","logMax","sliderToScale","sliderValue","logScale","branchLengthSlider","createSlider","treeHeightLabel","treeHeightSlider","radialLayoutLabel","radialLayoutToggle","updateToggleState","currentLayout","tipLabelTextLabel","tipLabelTextContainer","tipLabelTextSelect","createMetadataColumnSelect","tipLabelColorLabel","tipLabelColorContainer","tipLabelColorSelect","tipLabelSizeLabel","tipLabelSizeContainer","tipLabelSizeSelect","tipLabelStyleLabel","tipLabelStyleContainer","tipLabelStyleSelect","tipLabelFontLabel","tipLabelFontSelect","fonts","currentFont","font","selectedFont","defaultLabel","includeNone","continuous","noneOption","defaultOption","columnIds","filteredColumnIds","currentValue","aestheticUpdate","exportState","aspectRatio","PPI","CM_PER_INCH","pxToCm","px","cmToPx","cm","getDisplayValue","getPixelValue","displayValue","updateDimensions","newBounds","newWidth","newHeight","widthInput","heightInput","coordinateChangeUnsubscribe","legendsChangeUnsubscribe","exportBtn","sanitizedName","extension","filename","exportTree","formatLabel","formatSelect","marginInput","unit","widthLabel","heightLabel","marginLabel","createNumberInput","contentWidth","contentHeight","finalWidth","finalHeight","exportSvg","contentGroup","clonedTreeGroup","selectionRect","svgString","downloadFile","convertSvgToPng","content","mimeType","blob","url","canvas","ctx","img","svgBlob","pngUrl","slider","initialState","toggleHeight","knobSize","toggle","knob","injectStyles","styleId","styleElement","heatTree","treesConfig","containerSelector","treeConfigAesthetics","treeConfig","metadataItem","metaIndex","treeAesthetics","aes","assignedColId","treeStateCache","treeViewCache","widgetDiv","treeDiv","treeSvg","currentTreeView","refreshToolbar","onToolbarDimensionsChange","firstTreeName"],"mappings":"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","x_google_ignoreList":[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119]}
|