- 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
+import {fadeIn, fadeOut} from "../services/animations";
class Overlay {
}
}
- hide() { this.toggle(false); }
- show() { this.toggle(true); }
-
- 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));
- }
- }
+ hide(onComplete = null) { this.toggle(false, onComplete); }
+ show(onComplete = null) { this.toggle(true, onComplete); }
- requestAnimationFrame(setOpacity.bind(this));
+ toggle(show = true, onComplete) {
+ if (show) {
+ fadeIn(this.container, 240, onComplete);
+ } else {
+ fadeOut(this.container, 240, onComplete);
+ }
}
focusOnBody() {
*/
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
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
popupEditor: popupEditor,
setMode: setMode,
setContent: setContent,
+ updateLayout: updateLayout,
markdownEditor: markdownEditor,
getMetaKey: getMetaKey,
};
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();