You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
787 lines
22 KiB
787 lines
22 KiB
// https://d3js.org/d3-transition/ v1.1.3 Copyright 2018 Mike Bostock |
|
(function (global, factory) { |
|
typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('d3-dispatch'), require('d3-timer'), require('d3-color'), require('d3-interpolate'), require('d3-selection'), require('d3-ease')) : |
|
typeof define === 'function' && define.amd ? define(['exports', 'd3-dispatch', 'd3-timer', 'd3-color', 'd3-interpolate', 'd3-selection', 'd3-ease'], factory) : |
|
(factory((global.d3 = global.d3 || {}),global.d3,global.d3,global.d3,global.d3,global.d3,global.d3)); |
|
}(this, (function (exports,d3Dispatch,d3Timer,d3Color,d3Interpolate,d3Selection,d3Ease) { 'use strict'; |
|
|
|
var emptyOn = d3Dispatch.dispatch("start", "end", "interrupt"); |
|
var emptyTween = []; |
|
|
|
var CREATED = 0; |
|
var SCHEDULED = 1; |
|
var STARTING = 2; |
|
var STARTED = 3; |
|
var RUNNING = 4; |
|
var ENDING = 5; |
|
var ENDED = 6; |
|
|
|
function schedule(node, name, id, index, group, timing) { |
|
var schedules = node.__transition; |
|
if (!schedules) node.__transition = {}; |
|
else if (id in schedules) return; |
|
create(node, id, { |
|
name: name, |
|
index: index, // For context during callback. |
|
group: group, // For context during callback. |
|
on: emptyOn, |
|
tween: emptyTween, |
|
time: timing.time, |
|
delay: timing.delay, |
|
duration: timing.duration, |
|
ease: timing.ease, |
|
timer: null, |
|
state: CREATED |
|
}); |
|
} |
|
|
|
function init(node, id) { |
|
var schedule = get(node, id); |
|
if (schedule.state > CREATED) throw new Error("too late; already scheduled"); |
|
return schedule; |
|
} |
|
|
|
function set(node, id) { |
|
var schedule = get(node, id); |
|
if (schedule.state > STARTING) throw new Error("too late; already started"); |
|
return schedule; |
|
} |
|
|
|
function get(node, id) { |
|
var schedule = node.__transition; |
|
if (!schedule || !(schedule = schedule[id])) throw new Error("transition not found"); |
|
return schedule; |
|
} |
|
|
|
function create(node, id, self) { |
|
var schedules = node.__transition, |
|
tween; |
|
|
|
// Initialize the self timer when the transition is created. |
|
// Note the actual delay is not known until the first callback! |
|
schedules[id] = self; |
|
self.timer = d3Timer.timer(schedule, 0, self.time); |
|
|
|
function schedule(elapsed) { |
|
self.state = SCHEDULED; |
|
self.timer.restart(start, self.delay, self.time); |
|
|
|
// If the elapsed delay is less than our first sleep, start immediately. |
|
if (self.delay <= elapsed) start(elapsed - self.delay); |
|
} |
|
|
|
function start(elapsed) { |
|
var i, j, n, o; |
|
|
|
// If the state is not SCHEDULED, then we previously errored on start. |
|
if (self.state !== SCHEDULED) return stop(); |
|
|
|
for (i in schedules) { |
|
o = schedules[i]; |
|
if (o.name !== self.name) continue; |
|
|
|
// While this element already has a starting transition during this frame, |
|
// defer starting an interrupting transition until that transition has a |
|
// chance to tick (and possibly end); see d3/d3-transition#54! |
|
if (o.state === STARTED) return d3Timer.timeout(start); |
|
|
|
// Interrupt the active transition, if any. |
|
// Dispatch the interrupt event. |
|
if (o.state === RUNNING) { |
|
o.state = ENDED; |
|
o.timer.stop(); |
|
o.on.call("interrupt", node, node.__data__, o.index, o.group); |
|
delete schedules[i]; |
|
} |
|
|
|
// Cancel any pre-empted transitions. No interrupt event is dispatched |
|
// because the cancelled transitions never started. Note that this also |
|
// removes this transition from the pending list! |
|
else if (+i < id) { |
|
o.state = ENDED; |
|
o.timer.stop(); |
|
delete schedules[i]; |
|
} |
|
} |
|
|
|
// Defer the first tick to end of the current frame; see d3/d3#1576. |
|
// Note the transition may be canceled after start and before the first tick! |
|
// Note this must be scheduled before the start event; see d3/d3-transition#16! |
|
// Assuming this is successful, subsequent callbacks go straight to tick. |
|
d3Timer.timeout(function() { |
|
if (self.state === STARTED) { |
|
self.state = RUNNING; |
|
self.timer.restart(tick, self.delay, self.time); |
|
tick(elapsed); |
|
} |
|
}); |
|
|
|
// Dispatch the start event. |
|
// Note this must be done before the tween are initialized. |
|
self.state = STARTING; |
|
self.on.call("start", node, node.__data__, self.index, self.group); |
|
if (self.state !== STARTING) return; // interrupted |
|
self.state = STARTED; |
|
|
|
// Initialize the tween, deleting null tween. |
|
tween = new Array(n = self.tween.length); |
|
for (i = 0, j = -1; i < n; ++i) { |
|
if (o = self.tween[i].value.call(node, node.__data__, self.index, self.group)) { |
|
tween[++j] = o; |
|
} |
|
} |
|
tween.length = j + 1; |
|
} |
|
|
|
function tick(elapsed) { |
|
var t = elapsed < self.duration ? self.ease.call(null, elapsed / self.duration) : (self.timer.restart(stop), self.state = ENDING, 1), |
|
i = -1, |
|
n = tween.length; |
|
|
|
while (++i < n) { |
|
tween[i].call(null, t); |
|
} |
|
|
|
// Dispatch the end event. |
|
if (self.state === ENDING) { |
|
self.on.call("end", node, node.__data__, self.index, self.group); |
|
stop(); |
|
} |
|
} |
|
|
|
function stop() { |
|
self.state = ENDED; |
|
self.timer.stop(); |
|
delete schedules[id]; |
|
for (var i in schedules) return; // eslint-disable-line no-unused-vars |
|
delete node.__transition; |
|
} |
|
} |
|
|
|
function interrupt(node, name) { |
|
var schedules = node.__transition, |
|
schedule$$1, |
|
active, |
|
empty = true, |
|
i; |
|
|
|
if (!schedules) return; |
|
|
|
name = name == null ? null : name + ""; |
|
|
|
for (i in schedules) { |
|
if ((schedule$$1 = schedules[i]).name !== name) { empty = false; continue; } |
|
active = schedule$$1.state > STARTING && schedule$$1.state < ENDING; |
|
schedule$$1.state = ENDED; |
|
schedule$$1.timer.stop(); |
|
if (active) schedule$$1.on.call("interrupt", node, node.__data__, schedule$$1.index, schedule$$1.group); |
|
delete schedules[i]; |
|
} |
|
|
|
if (empty) delete node.__transition; |
|
} |
|
|
|
function selection_interrupt(name) { |
|
return this.each(function() { |
|
interrupt(this, name); |
|
}); |
|
} |
|
|
|
function tweenRemove(id, name) { |
|
var tween0, tween1; |
|
return function() { |
|
var schedule$$1 = set(this, id), |
|
tween = schedule$$1.tween; |
|
|
|
// If this node shared tween with the previous node, |
|
// just assign the updated shared tween and we’re done! |
|
// Otherwise, copy-on-write. |
|
if (tween !== tween0) { |
|
tween1 = tween0 = tween; |
|
for (var i = 0, n = tween1.length; i < n; ++i) { |
|
if (tween1[i].name === name) { |
|
tween1 = tween1.slice(); |
|
tween1.splice(i, 1); |
|
break; |
|
} |
|
} |
|
} |
|
|
|
schedule$$1.tween = tween1; |
|
}; |
|
} |
|
|
|
function tweenFunction(id, name, value) { |
|
var tween0, tween1; |
|
if (typeof value !== "function") throw new Error; |
|
return function() { |
|
var schedule$$1 = set(this, id), |
|
tween = schedule$$1.tween; |
|
|
|
// If this node shared tween with the previous node, |
|
// just assign the updated shared tween and we’re done! |
|
// Otherwise, copy-on-write. |
|
if (tween !== tween0) { |
|
tween1 = (tween0 = tween).slice(); |
|
for (var t = {name: name, value: value}, i = 0, n = tween1.length; i < n; ++i) { |
|
if (tween1[i].name === name) { |
|
tween1[i] = t; |
|
break; |
|
} |
|
} |
|
if (i === n) tween1.push(t); |
|
} |
|
|
|
schedule$$1.tween = tween1; |
|
}; |
|
} |
|
|
|
function transition_tween(name, value) { |
|
var id = this._id; |
|
|
|
name += ""; |
|
|
|
if (arguments.length < 2) { |
|
var tween = get(this.node(), id).tween; |
|
for (var i = 0, n = tween.length, t; i < n; ++i) { |
|
if ((t = tween[i]).name === name) { |
|
return t.value; |
|
} |
|
} |
|
return null; |
|
} |
|
|
|
return this.each((value == null ? tweenRemove : tweenFunction)(id, name, value)); |
|
} |
|
|
|
function tweenValue(transition, name, value) { |
|
var id = transition._id; |
|
|
|
transition.each(function() { |
|
var schedule$$1 = set(this, id); |
|
(schedule$$1.value || (schedule$$1.value = {}))[name] = value.apply(this, arguments); |
|
}); |
|
|
|
return function(node) { |
|
return get(node, id).value[name]; |
|
}; |
|
} |
|
|
|
function interpolate(a, b) { |
|
var c; |
|
return (typeof b === "number" ? d3Interpolate.interpolateNumber |
|
: b instanceof d3Color.color ? d3Interpolate.interpolateRgb |
|
: (c = d3Color.color(b)) ? (b = c, d3Interpolate.interpolateRgb) |
|
: d3Interpolate.interpolateString)(a, b); |
|
} |
|
|
|
function attrRemove(name) { |
|
return function() { |
|
this.removeAttribute(name); |
|
}; |
|
} |
|
|
|
function attrRemoveNS(fullname) { |
|
return function() { |
|
this.removeAttributeNS(fullname.space, fullname.local); |
|
}; |
|
} |
|
|
|
function attrConstant(name, interpolate$$1, value1) { |
|
var value00, |
|
interpolate0; |
|
return function() { |
|
var value0 = this.getAttribute(name); |
|
return value0 === value1 ? null |
|
: value0 === value00 ? interpolate0 |
|
: interpolate0 = interpolate$$1(value00 = value0, value1); |
|
}; |
|
} |
|
|
|
function attrConstantNS(fullname, interpolate$$1, value1) { |
|
var value00, |
|
interpolate0; |
|
return function() { |
|
var value0 = this.getAttributeNS(fullname.space, fullname.local); |
|
return value0 === value1 ? null |
|
: value0 === value00 ? interpolate0 |
|
: interpolate0 = interpolate$$1(value00 = value0, value1); |
|
}; |
|
} |
|
|
|
function attrFunction(name, interpolate$$1, value) { |
|
var value00, |
|
value10, |
|
interpolate0; |
|
return function() { |
|
var value0, value1 = value(this); |
|
if (value1 == null) return void this.removeAttribute(name); |
|
value0 = this.getAttribute(name); |
|
return value0 === value1 ? null |
|
: value0 === value00 && value1 === value10 ? interpolate0 |
|
: interpolate0 = interpolate$$1(value00 = value0, value10 = value1); |
|
}; |
|
} |
|
|
|
function attrFunctionNS(fullname, interpolate$$1, value) { |
|
var value00, |
|
value10, |
|
interpolate0; |
|
return function() { |
|
var value0, value1 = value(this); |
|
if (value1 == null) return void this.removeAttributeNS(fullname.space, fullname.local); |
|
value0 = this.getAttributeNS(fullname.space, fullname.local); |
|
return value0 === value1 ? null |
|
: value0 === value00 && value1 === value10 ? interpolate0 |
|
: interpolate0 = interpolate$$1(value00 = value0, value10 = value1); |
|
}; |
|
} |
|
|
|
function transition_attr(name, value) { |
|
var fullname = d3Selection.namespace(name), i = fullname === "transform" ? d3Interpolate.interpolateTransformSvg : interpolate; |
|
return this.attrTween(name, typeof value === "function" |
|
? (fullname.local ? attrFunctionNS : attrFunction)(fullname, i, tweenValue(this, "attr." + name, value)) |
|
: value == null ? (fullname.local ? attrRemoveNS : attrRemove)(fullname) |
|
: (fullname.local ? attrConstantNS : attrConstant)(fullname, i, value + "")); |
|
} |
|
|
|
function attrTweenNS(fullname, value) { |
|
function tween() { |
|
var node = this, i = value.apply(node, arguments); |
|
return i && function(t) { |
|
node.setAttributeNS(fullname.space, fullname.local, i(t)); |
|
}; |
|
} |
|
tween._value = value; |
|
return tween; |
|
} |
|
|
|
function attrTween(name, value) { |
|
function tween() { |
|
var node = this, i = value.apply(node, arguments); |
|
return i && function(t) { |
|
node.setAttribute(name, i(t)); |
|
}; |
|
} |
|
tween._value = value; |
|
return tween; |
|
} |
|
|
|
function transition_attrTween(name, value) { |
|
var key = "attr." + name; |
|
if (arguments.length < 2) return (key = this.tween(key)) && key._value; |
|
if (value == null) return this.tween(key, null); |
|
if (typeof value !== "function") throw new Error; |
|
var fullname = d3Selection.namespace(name); |
|
return this.tween(key, (fullname.local ? attrTweenNS : attrTween)(fullname, value)); |
|
} |
|
|
|
function delayFunction(id, value) { |
|
return function() { |
|
init(this, id).delay = +value.apply(this, arguments); |
|
}; |
|
} |
|
|
|
function delayConstant(id, value) { |
|
return value = +value, function() { |
|
init(this, id).delay = value; |
|
}; |
|
} |
|
|
|
function transition_delay(value) { |
|
var id = this._id; |
|
|
|
return arguments.length |
|
? this.each((typeof value === "function" |
|
? delayFunction |
|
: delayConstant)(id, value)) |
|
: get(this.node(), id).delay; |
|
} |
|
|
|
function durationFunction(id, value) { |
|
return function() { |
|
set(this, id).duration = +value.apply(this, arguments); |
|
}; |
|
} |
|
|
|
function durationConstant(id, value) { |
|
return value = +value, function() { |
|
set(this, id).duration = value; |
|
}; |
|
} |
|
|
|
function transition_duration(value) { |
|
var id = this._id; |
|
|
|
return arguments.length |
|
? this.each((typeof value === "function" |
|
? durationFunction |
|
: durationConstant)(id, value)) |
|
: get(this.node(), id).duration; |
|
} |
|
|
|
function easeConstant(id, value) { |
|
if (typeof value !== "function") throw new Error; |
|
return function() { |
|
set(this, id).ease = value; |
|
}; |
|
} |
|
|
|
function transition_ease(value) { |
|
var id = this._id; |
|
|
|
return arguments.length |
|
? this.each(easeConstant(id, value)) |
|
: get(this.node(), id).ease; |
|
} |
|
|
|
function transition_filter(match) { |
|
if (typeof match !== "function") match = d3Selection.matcher(match); |
|
|
|
for (var groups = this._groups, m = groups.length, subgroups = new Array(m), j = 0; j < m; ++j) { |
|
for (var group = groups[j], n = group.length, subgroup = subgroups[j] = [], node, i = 0; i < n; ++i) { |
|
if ((node = group[i]) && match.call(node, node.__data__, i, group)) { |
|
subgroup.push(node); |
|
} |
|
} |
|
} |
|
|
|
return new Transition(subgroups, this._parents, this._name, this._id); |
|
} |
|
|
|
function transition_merge(transition$$1) { |
|
if (transition$$1._id !== this._id) throw new Error; |
|
|
|
for (var groups0 = this._groups, groups1 = transition$$1._groups, m0 = groups0.length, m1 = groups1.length, m = Math.min(m0, m1), merges = new Array(m0), j = 0; j < m; ++j) { |
|
for (var group0 = groups0[j], group1 = groups1[j], n = group0.length, merge = merges[j] = new Array(n), node, i = 0; i < n; ++i) { |
|
if (node = group0[i] || group1[i]) { |
|
merge[i] = node; |
|
} |
|
} |
|
} |
|
|
|
for (; j < m0; ++j) { |
|
merges[j] = groups0[j]; |
|
} |
|
|
|
return new Transition(merges, this._parents, this._name, this._id); |
|
} |
|
|
|
function start(name) { |
|
return (name + "").trim().split(/^|\s+/).every(function(t) { |
|
var i = t.indexOf("."); |
|
if (i >= 0) t = t.slice(0, i); |
|
return !t || t === "start"; |
|
}); |
|
} |
|
|
|
function onFunction(id, name, listener) { |
|
var on0, on1, sit = start(name) ? init : set; |
|
return function() { |
|
var schedule$$1 = sit(this, id), |
|
on = schedule$$1.on; |
|
|
|
// If this node shared a dispatch with the previous node, |
|
// just assign the updated shared dispatch and we’re done! |
|
// Otherwise, copy-on-write. |
|
if (on !== on0) (on1 = (on0 = on).copy()).on(name, listener); |
|
|
|
schedule$$1.on = on1; |
|
}; |
|
} |
|
|
|
function transition_on(name, listener) { |
|
var id = this._id; |
|
|
|
return arguments.length < 2 |
|
? get(this.node(), id).on.on(name) |
|
: this.each(onFunction(id, name, listener)); |
|
} |
|
|
|
function removeFunction(id) { |
|
return function() { |
|
var parent = this.parentNode; |
|
for (var i in this.__transition) if (+i !== id) return; |
|
if (parent) parent.removeChild(this); |
|
}; |
|
} |
|
|
|
function transition_remove() { |
|
return this.on("end.remove", removeFunction(this._id)); |
|
} |
|
|
|
function transition_select(select) { |
|
var name = this._name, |
|
id = this._id; |
|
|
|
if (typeof select !== "function") select = d3Selection.selector(select); |
|
|
|
for (var groups = this._groups, m = groups.length, subgroups = new Array(m), j = 0; j < m; ++j) { |
|
for (var group = groups[j], n = group.length, subgroup = subgroups[j] = new Array(n), node, subnode, i = 0; i < n; ++i) { |
|
if ((node = group[i]) && (subnode = select.call(node, node.__data__, i, group))) { |
|
if ("__data__" in node) subnode.__data__ = node.__data__; |
|
subgroup[i] = subnode; |
|
schedule(subgroup[i], name, id, i, subgroup, get(node, id)); |
|
} |
|
} |
|
} |
|
|
|
return new Transition(subgroups, this._parents, name, id); |
|
} |
|
|
|
function transition_selectAll(select) { |
|
var name = this._name, |
|
id = this._id; |
|
|
|
if (typeof select !== "function") select = d3Selection.selectorAll(select); |
|
|
|
for (var groups = this._groups, m = groups.length, subgroups = [], parents = [], j = 0; j < m; ++j) { |
|
for (var group = groups[j], n = group.length, node, i = 0; i < n; ++i) { |
|
if (node = group[i]) { |
|
for (var children = select.call(node, node.__data__, i, group), child, inherit = get(node, id), k = 0, l = children.length; k < l; ++k) { |
|
if (child = children[k]) { |
|
schedule(child, name, id, k, children, inherit); |
|
} |
|
} |
|
subgroups.push(children); |
|
parents.push(node); |
|
} |
|
} |
|
} |
|
|
|
return new Transition(subgroups, parents, name, id); |
|
} |
|
|
|
var Selection = d3Selection.selection.prototype.constructor; |
|
|
|
function transition_selection() { |
|
return new Selection(this._groups, this._parents); |
|
} |
|
|
|
function styleRemove(name, interpolate$$1) { |
|
var value00, |
|
value10, |
|
interpolate0; |
|
return function() { |
|
var value0 = d3Selection.style(this, name), |
|
value1 = (this.style.removeProperty(name), d3Selection.style(this, name)); |
|
return value0 === value1 ? null |
|
: value0 === value00 && value1 === value10 ? interpolate0 |
|
: interpolate0 = interpolate$$1(value00 = value0, value10 = value1); |
|
}; |
|
} |
|
|
|
function styleRemoveEnd(name) { |
|
return function() { |
|
this.style.removeProperty(name); |
|
}; |
|
} |
|
|
|
function styleConstant(name, interpolate$$1, value1) { |
|
var value00, |
|
interpolate0; |
|
return function() { |
|
var value0 = d3Selection.style(this, name); |
|
return value0 === value1 ? null |
|
: value0 === value00 ? interpolate0 |
|
: interpolate0 = interpolate$$1(value00 = value0, value1); |
|
}; |
|
} |
|
|
|
function styleFunction(name, interpolate$$1, value) { |
|
var value00, |
|
value10, |
|
interpolate0; |
|
return function() { |
|
var value0 = d3Selection.style(this, name), |
|
value1 = value(this); |
|
if (value1 == null) value1 = (this.style.removeProperty(name), d3Selection.style(this, name)); |
|
return value0 === value1 ? null |
|
: value0 === value00 && value1 === value10 ? interpolate0 |
|
: interpolate0 = interpolate$$1(value00 = value0, value10 = value1); |
|
}; |
|
} |
|
|
|
function transition_style(name, value, priority) { |
|
var i = (name += "") === "transform" ? d3Interpolate.interpolateTransformCss : interpolate; |
|
return value == null ? this |
|
.styleTween(name, styleRemove(name, i)) |
|
.on("end.style." + name, styleRemoveEnd(name)) |
|
: this.styleTween(name, typeof value === "function" |
|
? styleFunction(name, i, tweenValue(this, "style." + name, value)) |
|
: styleConstant(name, i, value + ""), priority); |
|
} |
|
|
|
function styleTween(name, value, priority) { |
|
function tween() { |
|
var node = this, i = value.apply(node, arguments); |
|
return i && function(t) { |
|
node.style.setProperty(name, i(t), priority); |
|
}; |
|
} |
|
tween._value = value; |
|
return tween; |
|
} |
|
|
|
function transition_styleTween(name, value, priority) { |
|
var key = "style." + (name += ""); |
|
if (arguments.length < 2) return (key = this.tween(key)) && key._value; |
|
if (value == null) return this.tween(key, null); |
|
if (typeof value !== "function") throw new Error; |
|
return this.tween(key, styleTween(name, value, priority == null ? "" : priority)); |
|
} |
|
|
|
function textConstant(value) { |
|
return function() { |
|
this.textContent = value; |
|
}; |
|
} |
|
|
|
function textFunction(value) { |
|
return function() { |
|
var value1 = value(this); |
|
this.textContent = value1 == null ? "" : value1; |
|
}; |
|
} |
|
|
|
function transition_text(value) { |
|
return this.tween("text", typeof value === "function" |
|
? textFunction(tweenValue(this, "text", value)) |
|
: textConstant(value == null ? "" : value + "")); |
|
} |
|
|
|
function transition_transition() { |
|
var name = this._name, |
|
id0 = this._id, |
|
id1 = newId(); |
|
|
|
for (var groups = this._groups, m = groups.length, j = 0; j < m; ++j) { |
|
for (var group = groups[j], n = group.length, node, i = 0; i < n; ++i) { |
|
if (node = group[i]) { |
|
var inherit = get(node, id0); |
|
schedule(node, name, id1, i, group, { |
|
time: inherit.time + inherit.delay + inherit.duration, |
|
delay: 0, |
|
duration: inherit.duration, |
|
ease: inherit.ease |
|
}); |
|
} |
|
} |
|
} |
|
|
|
return new Transition(groups, this._parents, name, id1); |
|
} |
|
|
|
var id = 0; |
|
|
|
function Transition(groups, parents, name, id) { |
|
this._groups = groups; |
|
this._parents = parents; |
|
this._name = name; |
|
this._id = id; |
|
} |
|
|
|
function transition(name) { |
|
return d3Selection.selection().transition(name); |
|
} |
|
|
|
function newId() { |
|
return ++id; |
|
} |
|
|
|
var selection_prototype = d3Selection.selection.prototype; |
|
|
|
Transition.prototype = transition.prototype = { |
|
constructor: Transition, |
|
select: transition_select, |
|
selectAll: transition_selectAll, |
|
filter: transition_filter, |
|
merge: transition_merge, |
|
selection: transition_selection, |
|
transition: transition_transition, |
|
call: selection_prototype.call, |
|
nodes: selection_prototype.nodes, |
|
node: selection_prototype.node, |
|
size: selection_prototype.size, |
|
empty: selection_prototype.empty, |
|
each: selection_prototype.each, |
|
on: transition_on, |
|
attr: transition_attr, |
|
attrTween: transition_attrTween, |
|
style: transition_style, |
|
styleTween: transition_styleTween, |
|
text: transition_text, |
|
remove: transition_remove, |
|
tween: transition_tween, |
|
delay: transition_delay, |
|
duration: transition_duration, |
|
ease: transition_ease |
|
}; |
|
|
|
var defaultTiming = { |
|
time: null, // Set on use. |
|
delay: 0, |
|
duration: 250, |
|
ease: d3Ease.easeCubicInOut |
|
}; |
|
|
|
function inherit(node, id) { |
|
var timing; |
|
while (!(timing = node.__transition) || !(timing = timing[id])) { |
|
if (!(node = node.parentNode)) { |
|
return defaultTiming.time = d3Timer.now(), defaultTiming; |
|
} |
|
} |
|
return timing; |
|
} |
|
|
|
function selection_transition(name) { |
|
var id, |
|
timing; |
|
|
|
if (name instanceof Transition) { |
|
id = name._id, name = name._name; |
|
} else { |
|
id = newId(), (timing = defaultTiming).time = d3Timer.now(), name = name == null ? null : name + ""; |
|
} |
|
|
|
for (var groups = this._groups, m = groups.length, j = 0; j < m; ++j) { |
|
for (var group = groups[j], n = group.length, node, i = 0; i < n; ++i) { |
|
if (node = group[i]) { |
|
schedule(node, name, id, i, group, timing || inherit(node, id)); |
|
} |
|
} |
|
} |
|
|
|
return new Transition(groups, this._parents, name, id); |
|
} |
|
|
|
d3Selection.selection.prototype.interrupt = selection_interrupt; |
|
d3Selection.selection.prototype.transition = selection_transition; |
|
|
|
var root = [null]; |
|
|
|
function active(node, name) { |
|
var schedules = node.__transition, |
|
schedule$$1, |
|
i; |
|
|
|
if (schedules) { |
|
name = name == null ? null : name + ""; |
|
for (i in schedules) { |
|
if ((schedule$$1 = schedules[i]).state > SCHEDULED && schedule$$1.name === name) { |
|
return new Transition([[node]], root, name, +i); |
|
} |
|
} |
|
} |
|
|
|
return null; |
|
} |
|
|
|
exports.transition = transition; |
|
exports.active = active; |
|
exports.interrupt = interrupt; |
|
|
|
Object.defineProperty(exports, '__esModule', { value: true }); |
|
|
|
})));
|
|
|