theophile
Version:
A templating module that transforms a web page into a (Powerpoint-like) presentation
85 lines (80 loc) • 2.88 kB
JavaScript
import Transition from "./Transition.js";
export default class TransitionBlur extends Transition {
constructor(original, replacement, type) {
super(original, replacement, type);
this.blur = this.value(this.blur, 0, 10, 1);
}
get filter() {
return `blur(${this.blur}em) contrast(0.5) saturate(2) brightness(.6)`;
}
cancel() {
this.replacement.style.transition = "none";
this.original.style.transition = "none";
}
prepare(resolve) {
super.prepare();
this.replacement.style.position = "absolute";
this.replacement.style.zIndex = "0";
this.replacement.style.filter = this.filter;
this.replacement.style.opacity = 0;
this.original.style.position = "absolute";
this.original.style.zIndex = "100";
this.original.style.transitionDuration = (this.duration / 2) + "ms";
this.original.style.transitionTimingFunction = "linear";
this.original.style.transitionProperty = "filter";
this.replacement.style.transitionDuration = (this.duration / 2) + "ms";
this.replacement.style.transitionTimingFunction = "linear";
this.replacement.style.transitionProperty = "filter";
this.evt_transitionend_on = e => {
if (e.propertyName === "filter") {
this.original.style.opacity = 0;
this.replacement.style.opacity = 1;
this.replacement.style.filter = "none";
if (e.type === "transitioncancel") {
resolve();
}
}
};
["transitionend", "transitioncancel"].forEach(evt => {
this.original.addEventListener(evt, this.evt_transitionend_on);
});
this.evt_transitionend_off = e => {
if (e.propertyName === "filter") {
resolve();
}
};
["transitionend", "transitioncancel"].forEach(evt => {
this.replacement.addEventListener(evt, this.evt_transitionend_off);
});
}
clean() {
super.clean();
this.replacement.style.removeProperty("position");
this.replacement.style.removeProperty("z-index");
this.replacement.style.removeProperty("transition");
this.replacement.style.removeProperty("filter");
this.replacement.style.removeProperty("opacity");
this.original.style.removeProperty("position");
this.original.style.removeProperty("z-index");
this.original.style.removeProperty("transition");
this.original.style.removeProperty("filter");
this.original.style.removeProperty("opacity");
["transitionend", "transitioncancel"].forEach(evt => {
this.original.removeEventListener(evt, this.evt_transitionend_on);
this.replacement.removeEventListener(evt, this.evt_transitionend_off);
});
}
async go() {
this.Object.animations[this.id] = this;
return (this.promise = new Promise(resolve => {
this.prepare(resolve);
setTimeout(() => {
this.original.style.filter = this.filter;
}, 10);
}).then(e => {
this.clean();
delete this.Object.animations[this.id];
return e;
}));
}
}