Updated codeblock editor to work with fade animation
- Added fadeIn to animation JS service. - Updated overlay to use anim service and to recieve a callback for after-anim actions. - Updated code editor popup to refresh Codemirror instance layout after animation has completed. Fixes #1672
This commit is contained in:
parent
a6bbe46987
commit
5a533fff8b
4 changed files with 37 additions and 23 deletions
|
@ -1,3 +1,4 @@
|
|||
import {fadeIn, fadeOut} from "../services/animations";
|
||||
|
||||
class Overlay {
|
||||
|
||||
|
@ -19,29 +20,15 @@ class Overlay {
|
|||
}
|
||||
}
|
||||
|
||||
hide() { this.toggle(false); }
|
||||
show() { this.toggle(true); }
|
||||
hide(onComplete = null) { this.toggle(false, onComplete); }
|
||||
show(onComplete = null) { this.toggle(true, onComplete); }
|
||||
|
||||
toggle(show = true) {
|
||||
let start = Date.now();
|
||||
let duration = 240;
|
||||
|
||||
function setOpacity() {
|
||||
let elapsedTime = (Date.now() - start);
|
||||
let targetOpacity = show ? (elapsedTime / duration) : 1-(elapsedTime / duration);
|
||||
this.container.style.opacity = targetOpacity;
|
||||
if (elapsedTime > duration) {
|
||||
this.container.style.display = show ? 'flex' : 'none';
|
||||
if (show) {
|
||||
this.focusOnBody();
|
||||
}
|
||||
this.container.style.opacity = '';
|
||||
} else {
|
||||
requestAnimationFrame(setOpacity.bind(this));
|
||||
}
|
||||
toggle(show = true, onComplete) {
|
||||
if (show) {
|
||||
fadeIn(this.container, 240, onComplete);
|
||||
} else {
|
||||
fadeOut(this.container, 240, onComplete);
|
||||
}
|
||||
|
||||
requestAnimationFrame(setOpacity.bind(this));
|
||||
}
|
||||
|
||||
focusOnBody() {
|
||||
|
|
|
@ -5,6 +5,22 @@
|
|||
*/
|
||||
const animateStylesCleanupMap = new WeakMap();
|
||||
|
||||
/**
|
||||
* Fade in the given element.
|
||||
* @param {Element} element
|
||||
* @param {Number} animTime
|
||||
* @param {Function|null} onComplete
|
||||
*/
|
||||
export function fadeIn(element, animTime = 400, onComplete = null) {
|
||||
cleanupExistingElementAnimation(element);
|
||||
element.style.display = 'block';
|
||||
animateStyles(element, {
|
||||
opacity: ['0', '1']
|
||||
}, animTime, () => {
|
||||
if (onComplete) onComplete();
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Fade out the given element.
|
||||
* @param {Element} element
|
||||
|
|
|
@ -258,10 +258,18 @@ function setMode(cmInstance, modeSuggestion, content) {
|
|||
function setContent(cmInstance, codeContent) {
|
||||
cmInstance.setValue(codeContent);
|
||||
setTimeout(() => {
|
||||
cmInstance.refresh();
|
||||
updateLayout(cmInstance);
|
||||
}, 10);
|
||||
}
|
||||
|
||||
/**
|
||||
* Update the layout (codemirror refresh) of a cm instance.
|
||||
* @param cmInstance
|
||||
*/
|
||||
function updateLayout(cmInstance) {
|
||||
cmInstance.refresh();
|
||||
}
|
||||
|
||||
/**
|
||||
* Get a CodeMirror instance to use for the markdown editor.
|
||||
* @param {HTMLElement} elem
|
||||
|
@ -301,6 +309,7 @@ export default {
|
|||
popupEditor: popupEditor,
|
||||
setMode: setMode,
|
||||
setContent: setContent,
|
||||
updateLayout: updateLayout,
|
||||
markdownEditor: markdownEditor,
|
||||
getMetaKey: getMetaKey,
|
||||
};
|
||||
|
|
|
@ -3,7 +3,9 @@ import codeLib from "../services/code";
|
|||
const methods = {
|
||||
show() {
|
||||
if (!this.editor) this.editor = codeLib.popupEditor(this.$refs.editor, this.language);
|
||||
this.$refs.overlay.components.overlay.show();
|
||||
this.$refs.overlay.components.overlay.show(() => {
|
||||
codeLib.updateLayout(this.editor);
|
||||
});
|
||||
},
|
||||
hide() {
|
||||
this.$refs.overlay.components.overlay.hide();
|
||||
|
|
Loading…
Reference in a new issue