Appearance
Example: Many Elements 
examplejs
import { compose } from 'paintor'
import { ManyElements } from './components/ManyElements.js'
compose(
  ManyElements({ elementCounts: [0, 10, 100, 1000, 10000] })
).paint('#many-elements')js
import { state, template } from 'paintor'
const elements = state([])
function buildData(count, array) {
  array.length = count
  for (let i = count; i > 0; i--) {
    array[count - i] = i
  }
}
function Header(elementsCounts) {
  return template((x) => {
    x.div(
      {
        onClick: (event) => {
          if (!(event.target instanceof HTMLInputElement)) {
            return
          }
          buildData(Number(event.target.value), elements)
        }
      },
      x.h3('How many elements to draw?'),
      x.$each(elementsCounts, (count) => {
        const idName = `elements-${count}`
        x.div(
          x.input({
            type: 'radio',
            name: 'elements',
            id: idName,
            value: count,
            checked: (count === 0)
          }),
          x.label({for: idName}, count)
        )
      })
    )
  })
}
function ElementsContainer() {
  return template((x) => {
    x.div({id: 'elements-container'},
      x.$each(
        elements,
        (value) => {
          x.span({
            textContent: value,
            style: {width: '46px', height: '46px'},
          })
        },
        () => {
          x.div('No elements')
        }
      )
    )
  })
}
export function ManyElements({ elementCounts }) {
  return template(() => [
      Header(elementCounts),
      ElementsContainer(),
    ]
  )
}css
#many-elements {
  & label {
    margin-right: 0.5rem;
  }
  & input, label {
    cursor: pointer;
    user-select: none;
  }
  #elements-container {
    margin: 1.0rem;
    & span {
      margin: 0.1rem;
      padding: 0.3rem;
      border: 0.1rem solid deepskyblue;
      background: aliceblue;
      color: #444;
    }
  }
}html
<div id="many-elements"></div>