JSFiddle - React, Tailwind, and code Playground

author(s): Tao Xin

HTML

<script src="https://cdn.jsdelivr.net/gh/vanjs-org/van/public/van-0.12.4.nomodule.min.js"></script>

JavaScript

const {button, div, pre} = van.tags

const sleep = ms => new Promise(resolve => setTimeout(resolve, ms))

const Run = ({sleepMs}) => {
  const headingSpaces = van.state(40), trailingUnderscores = van.state(0)

  const animate = async () => {
    while (headingSpaces.val > 0) {
      await sleep(sleepMs)
      --headingSpaces.val, ++trailingUnderscores.val
    }
  }
  animate()

  const helloText = van.bind(headingSpaces, trailingUnderscores,
    (h, t) => `${" ".repeat(h)}๐Ÿš๐Ÿ’จHello VanJS!${"_".repeat(t)}`)
  return div(pre(helloText))
}

const Hello = () => {
  const dom = div()
  return div(
    dom,
    button({onclick: () => van.add(dom, Run({sleepMs: 2000}))}, "Hello ๐ŸŒ"),
    button({onclick: () => van.add(dom, Run({sleepMs: 500}))}, "Hello ๐Ÿข"),
    button({onclick: () => van.add(dom, Run({sleepMs: 100}))}, "Hello ๐Ÿšถโ€โ™‚๏ธ"),
    button({onclick: () => van.add(dom, Run({sleepMs: 10}))}, "Hello ๐ŸŽ๏ธ"),
    button({onclick: () => van.add(dom, Run({sleepMs: 2}))}, "Hello ๐Ÿš€"),
  )
}

van.add(document.body, Hello())