Examples

Simple

function simple() {
    return h("div", [
        h("p", "I am a simple view!"),
        h("p.special", [
            "I render text ",
            h("strong", "bold"),
            " and ",
            h("span", { style: { color: "red" } }, "red"),
            "."
        ])
    ]);
} 

mount(mountPoint, simple);

Simple Parent

function simple() {
    return h("div", [
        h("p", "I am a simple view!"),
        h("p.special", [
            "I render text ",
            h("strong", "bold"),
            " and ",
            h("span", { style: { color: "red" } }, "red"),
            "."
        ])
    ]);
} 

function parent() {
    return h("div", [
        h("p", "I'm the parent of the simple view"),
        simple()
    ]);
}

mount(mountPoint, parent);

List

function list(items) {
    return h("ul", items.map(
        item => h("li", `Item ${item}`)
    ));
} 

function numberList() {
    return h("div", [
        "Here is a list of numbers:",
        list([1,2,3])
    ]);
}

mount(mountPoint, numberList);

Counter

let count = signal(0);

function counter() {
  return h("div.counter", [
    "Number of clicks: ",
    count.value(),
    h(
      "button",
      {
        style: { margin: "10px" },
        on: { click: () => count.update(count => count + 1) }
      },
      "Click!"
    )
  ]);
}

mount(mountPoint, counter);

Clock

let color = signal("#000");
let now = signal(new Date());

setInterval(() => now.reset(new Date()), 1000);

function display() {
    let time = now.value().toTimeString().split(" ")[0];
    return h("h1", { style: { color: color.value() } }, time);
} 

function colorInput() {
    return h("input", {
        attrs: { type: "color", value: color.value() },
        on: { input: e => color.reset(e.target.value) },
    });
}

function clock() {
    return h("div.clock", [display(), colorInput()]);
}

mount(mountPoint, clock);

BMI calculator

let data = signal({ height: 1.8, weight: 78 });

let bmi = signalFn(
  withInputSignals(
    () => data,
    ({ height, weight }) => weight / (height * height)
  )
);

let diagnose = signalFn(
  withInputSignals(
    () => bmi,
    bmi => {
      if (bmi < 18.5) return "underweight";
      if (bmi < 25) return "healthy";
      if (bmi < 30) return "overweight";
      return "obese";
    }
  )
);

let color = signalFn(
  withInputSignals(
    () => diagnose,
    diagnose => {
      switch (diagnose) {
        case "underweight":
        case "overweight":
          return "orange";
        case "healthy":
          return "green";
        default:
          return "red";
      }
    }
  )
);

function slider(key, value, min, max, step = 1) {
  return h("input", {
    attrs: {
      type: "range",
      value,
      min,
      max,
      step
    },
    style: { width: "100%" },
    on: {
      input: function(e) {
        data.update(data => ({
          ...data,
          [key]: e.target.value
        }));
      }
    }
  });
}

function calculator([data, bmi, diagnose, color]) {
  let { height, weight } = data;

  return h("div.bmi", [
    h("h3", "BMI calculator"),
    h("div", [`Height: ${height}m`, slider("height", height, 1.0, 2.2, 0.01)]),
    h("div", [`Weight: ${weight}kg`, slider("weight", weight, 30, 200)]),
    h("p", [
      `BMI: ${Math.round(bmi)}`,
      " - ",
      h("strong", { style: { color: color } }, diagnose)
    ])
  ]);
}

mount(
  mountPoint,
  withInputSignals(() => [data, bmi, diagnose, color], calculator)
);