import { createElement } from "../lib/skeleton/index.js"; import rxjs, { effect } from "../lib/rx.js"; import { animate, opacityIn } from "../lib/animate.js"; class Loader extends window.HTMLElement { constructor() { super(); this.timeout = window.setTimeout(() => { this.innerHTML = this.render({ inline: this.hasAttribute("inlined"), }); }, parseInt(this.getAttribute("delay") || "0")); } disconnectedCallback() { window.clearTimeout(this.timeout); } render({ inline }) { const fixedCss = ` position: fixed; left: 0; right: 0; top: calc(50% - 200px);`; return `
`; } } customElements.define("component-loader", Loader); export function createLoader($parent, opts = {}) { const { wait = 500 } = opts const cancel = effect(new rxjs.Observable((observer) => { const $icon = createElement(``); const id = window.setTimeout(() => { $parent.appendChild($icon); animate($icon, { time: 1000, keyframes: opacityIn() }); }, wait); return () => { clearTimeout(id); $icon.remove(); }; })); return rxjs.tap(() => cancel()); } // > after this should be deprecated export default createElement(""); export function toggle($node, show = false) { if (show === true) return rxjs.tap(() => $node.appendChild(createElement(""))); else return rxjs.tap(() => $node.querySelector("component-loader")?.remove()); }