mars 0.0.2

A data science notebook
import { LitElement, html, css } from "lit";
import { customElement } from "lit/decorators.js";
import { getCurrentNotebookId, setCurrentNotebookId } from "./Notebook";
import anime from "animejs";

@customElement("loading-screen")
class LoadingScreen extends LitElement {
  static get styles() {
    return css`
      :host {
        position: absolute;
        background: black;
        color: #555;
        display: flex;
        align-items: center;
        justify-items: center;
        width: 100%;
        height: -webkit-fill-available;
        z-index: 9999;
        transition: opacity 1s ease-in-out;
        opacity: 1;
      }

      :host > div {
        text-align: center;
        width: 100%;
      }

      .loader,
      .loader:after {
        border-radius: 50%;
        width: 10em;
        height: 10em;
      }
      .loader {
        margin: 60px auto;
        font-size: 10px;
        position: relative;
        text-indent: -9999em;
        border-top: 0.1em solid rgba(255, 255, 255, 0.2);
        border-right: 0.1em solid rgba(255, 255, 255, 0.2);
        border-bottom: 0.1em solid rgba(255, 255, 255, 0.2);
        border-left: 0.1em solid #ffffff;
        -webkit-transform: translateZ(0);
        -ms-transform: translateZ(0);
        transform: translateZ(0);
        -webkit-animation: load8 1.1s infinite linear;
        animation: load8 1.1s infinite linear;
      }
      @-webkit-keyframes load8 {
        0% {
          -webkit-transform: rotate(0deg);
          transform: rotate(0deg);
        }
        100% {
          -webkit-transform: rotate(360deg);
          transform: rotate(360deg);
        }
      }
      @keyframes load8 {
        0% {
          -webkit-transform: rotate(0deg);
          transform: rotate(0deg);
        }
        100% {
          -webkit-transform: rotate(360deg);
          transform: rotate(360deg);
        }
      }
    `;
  }

  constructor() {
    super();
    (async () => {
      let result = await fetch(
        `http://127.0.0.1:8080/notebook/start`
      ).then((_) => _.json());
      console.log(result);
      setCurrentNotebookId(result.id);
      const intervalHandle = window.setInterval(async () => {
        try {
          let currentId = getCurrentNotebookId();
          if (!currentId) {
            return;
          }
          let result = await fetch(
            `http://127.0.0.1:8080/notebook/${currentId}/ready`
          ).then((_) => _.json());
          if (result.ready) {
            window.clearInterval(intervalHandle);
            anime
              .timeline({
                easing: "easeOutExpo",
                duration: 1000,
              })
              .add({
                targets: this,
                opacity: 0,
              })
              .add({
                targets: document.querySelector(".layout"),
                opacity: 1,
                changeComplete: () => {
                  this.remove();
                },
              });
            return;
          }
        } catch (e) {
          console.log(e);
        }
      }, 1000);
    })();
  }

  render() {
    return html` <div><div class="loader" /></div> `;
  }
}