Sub-optimal

Details

Description

Yeah, yeah... it's silly.

Here's the code.

The HTML

<bitty-1-3 data-connect="PageContent">
  <div class="ocean">
    [! include "/svgs/sub.svg" !]
    [! include "/svgs/waves.svg" !]
  </div>
</bitty-1-3>

The CSS

:root {
  --sub-color-dark: lch(80% 70 120);
  --sub-color-light: lch(30% 70 120);
  --sub-left: 50vw;
  --sub-top: 0px;
  --time: 4000ms;
  --waves-color-dark: lch(80% 30 230);
  --waves-color-light: lch(30% 30 230);
}

.ocean {
  position: relative;
  height: 60vh;
  overflow: clip;
}

.sub {
  position: absolute;
  top: var(--sub-top);
  left: var(--sub-left);
  width: 30vw;
  transition: 
    left var(--time) linear,
    top var(--time) linear
    ;
}

.sub-color {
  stroke: var(--sub-color-light);
  fill: var(--sub-color-light);
}

.sub-letter {
  stroke: var(--sub-color-light);
  fill: none;
}

.waves {
  width: 100%;
}

.waves-color {
  stroke: var(--waves-color-light);
  fill: var(--waves-color-light);
}

@media (prefers-color-scheme: dark) {
  .sub-color {
    stroke: var(--sub-color-dark);
    fill: var(--sub-color-dark);
  }

  .sub-letter{
    stroke: var(--sub-color-dark);
    fill: none;
  }

  .waves-color {
    stroke: var(--waves-color-dark);
    fill: var(--waves-color-dark);
  }
}

The JavaScript

function randInt(min, max) {
  return Math.floor(Math.random() * (max - min + 1)) + min;
}

function sleep(ms) {
  return new Promise((resolve) => setTimeout(resolve, ms));
}

function setProp(key, value) {
  document.documentElement.style.setProperty(
    key,
    value,
  );
}

window.PageContent = class {
  bittyInit() {
    this.moveSub();
  }

  async moveSub() {
    const startTop = randInt(0, 40);
    const endTop = randInt(0, 40);
    const time = randInt(2000, 8000);
    const c = randInt(10, 120);
    const h = randInt(0, 360);
    setProp("--sub-color-light", `lch(20% ${c} ${h})`);
    setProp("--sub-color-dark", `lch(85% ${c} ${h})`);
    setProp("--time", "0ms");
    await sleep(100);
    setProp("--sub-top", `${startTop}vh`);
    setProp("--sub-left", "130vw");
    await sleep(100);
    setProp("--time", `${time}ms`);
    await sleep(100);
    setProp("--sub-top", `${endTop}vh`);
    setProp("--sub-left", "-50vw");
    await sleep(time + 200);
    this.moveSub();
  }
};