Skip to content

Commit 4c62d22

Browse files
committed
allow transition functions to return a function (#1431)
1 parent b5931b9 commit 4c62d22

File tree

3 files changed

+75
-11
lines changed

3 files changed

+75
-11
lines changed

src/shared/transitions.js

Lines changed: 40 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -27,19 +27,12 @@ export function hash(str) {
2727
}
2828

2929
export function wrapTransition(component, node, fn, params, intro) {
30-
const obj = fn(node, params);
31-
const duration = obj.duration || 300;
32-
const ease = obj.easing || linear;
30+
let obj = fn(node, params);
31+
let duration;
32+
let ease;
3333
let cssText;
3434

35-
if (intro) {
36-
if (obj.css && obj.delay) {
37-
cssText = node.style.cssText;
38-
node.style.cssText += obj.css(0, 1);
39-
}
40-
41-
if (obj.tick) obj.tick(0, 1);
42-
}
35+
let initialised = false;
4336

4437
return {
4538
t: intro ? 0 : 1,
@@ -48,12 +41,36 @@ export function wrapTransition(component, node, fn, params, intro) {
4841
pending: null,
4942

5043
run(b, callback) {
44+
if (typeof obj === 'function') {
45+
transitionManager.wait().then(() => {
46+
obj = obj();
47+
this._run(b, callback);
48+
});
49+
} else {
50+
this._run(b, callback);
51+
}
52+
},
53+
54+
_run(b, callback) {
55+
duration = obj.duration || 300;
56+
ease = obj.easing || linear;
57+
5158
const program = {
5259
start: window.performance.now() + (obj.delay || 0),
5360
b,
5461
callback: callback || noop
5562
};
5663

64+
if (intro && !initialised) {
65+
if (obj.css && obj.delay) {
66+
cssText = node.style.cssText;
67+
node.style.cssText += obj.css(0, 1);
68+
}
69+
70+
if (obj.tick) obj.tick(0, 1);
71+
initialised = true;
72+
}
73+
5774
if (!b) {
5875
program.group = transitionManager.outros;
5976
transitionManager.outros.remaining += 1;
@@ -154,6 +171,7 @@ export var transitionManager = {
154171
bound: null,
155172
stylesheet: null,
156173
activeRules: {},
174+
promise: null,
157175

158176
add(transition) {
159177
this.transitions.push(transition);
@@ -223,5 +241,16 @@ export var transitionManager = {
223241
remaining: 0,
224242
callbacks: []
225243
};
244+
},
245+
246+
wait() {
247+
if (!transitionManager.promise) {
248+
transitionManager.promise = Promise.resolve();
249+
transitionManager.promise.then(() => {
250+
transitionManager.promise = null;
251+
});
252+
}
253+
254+
return transitionManager.promise;
226255
}
227256
};
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
export default {
2+
skipIntroByDefault: true,
3+
4+
test(assert, component, target, window, raf) {
5+
component.set({ visible: true });
6+
7+
return Promise.resolve().then(() => {
8+
const div = target.querySelector('div');
9+
assert.equal(div.foo, 0);
10+
11+
raf.tick(50);
12+
assert.equal(div.foo, 0.5);
13+
});
14+
},
15+
};
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
{#if visible}
2+
<div transition:foo></div>
3+
{/if}
4+
5+
<script>
6+
export default {
7+
transitions: {
8+
foo(node, params) {
9+
return () => {
10+
return {
11+
duration: 100,
12+
tick: t => {
13+
node.foo = t;
14+
}
15+
};
16+
};
17+
}
18+
}
19+
};
20+
</script>

0 commit comments

Comments
 (0)