|
|
@ -211,7 +211,7 @@ export interface CrossfadeParams {
|
|
|
|
easing?: EasingFunction;
|
|
|
|
easing?: EasingFunction;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
type ClientRectMap = Map<any, { rect: ClientRect }>;
|
|
|
|
type ClientRectMap = Map<any, Element>;
|
|
|
|
|
|
|
|
|
|
|
|
export function crossfade({ fallback, ...defaults }: CrossfadeParams & {
|
|
|
|
export function crossfade({ fallback, ...defaults }: CrossfadeParams & {
|
|
|
|
fallback?: (node: Element, params: CrossfadeParams, intro: boolean) => TransitionConfig;
|
|
|
|
fallback?: (node: Element, params: CrossfadeParams, intro: boolean) => TransitionConfig;
|
|
|
@ -232,13 +232,14 @@ export function crossfade({ fallback, ...defaults }: CrossfadeParams & {
|
|
|
|
const to_receive: ClientRectMap = new Map();
|
|
|
|
const to_receive: ClientRectMap = new Map();
|
|
|
|
const to_send: ClientRectMap = new Map();
|
|
|
|
const to_send: ClientRectMap = new Map();
|
|
|
|
|
|
|
|
|
|
|
|
function crossfade(from: ClientRect, node: Element, params: CrossfadeParams): TransitionConfig {
|
|
|
|
function crossfade(from_node: Element, node: Element, params: CrossfadeParams): TransitionConfig {
|
|
|
|
const {
|
|
|
|
const {
|
|
|
|
delay = 0,
|
|
|
|
delay = 0,
|
|
|
|
duration = d => Math.sqrt(d) * 30,
|
|
|
|
duration = d => Math.sqrt(d) * 30,
|
|
|
|
easing = cubicOut
|
|
|
|
easing = cubicOut
|
|
|
|
} = assign(assign({}, defaults), params);
|
|
|
|
} = assign(assign({}, defaults), params);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
const from = from_node.getBoundingClientRect();
|
|
|
|
const to = node.getBoundingClientRect();
|
|
|
|
const to = node.getBoundingClientRect();
|
|
|
|
const dx = from.left - to.left;
|
|
|
|
const dx = from.left - to.left;
|
|
|
|
const dy = from.top - to.top;
|
|
|
|
const dy = from.top - to.top;
|
|
|
@ -264,16 +265,14 @@ export function crossfade({ fallback, ...defaults }: CrossfadeParams & {
|
|
|
|
|
|
|
|
|
|
|
|
function transition(items: ClientRectMap, counterparts: ClientRectMap, intro: boolean) {
|
|
|
|
function transition(items: ClientRectMap, counterparts: ClientRectMap, intro: boolean) {
|
|
|
|
return (node: Element, params: CrossfadeParams & { key: any }) => {
|
|
|
|
return (node: Element, params: CrossfadeParams & { key: any }) => {
|
|
|
|
items.set(params.key, {
|
|
|
|
items.set(params.key, node);
|
|
|
|
rect: node.getBoundingClientRect()
|
|
|
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
return () => {
|
|
|
|
return () => {
|
|
|
|
if (counterparts.has(params.key)) {
|
|
|
|
if (counterparts.has(params.key)) {
|
|
|
|
const { rect } = counterparts.get(params.key);
|
|
|
|
const other_node = counterparts.get(params.key);
|
|
|
|
counterparts.delete(params.key);
|
|
|
|
counterparts.delete(params.key);
|
|
|
|
|
|
|
|
|
|
|
|
return crossfade(rect, node, params);
|
|
|
|
return crossfade(other_node, node, params);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// if the node is disappearing altogether
|
|
|
|
// if the node is disappearing altogether
|
|
|
|