all repos — h3 @ 56a6ad8b0ffac6a74a0f4624bb5ae08230b29f59

A tiny, extremely minimalist JavaScript microframework.

docs/js/app.js

 1
 2
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
import h3 from "./h3.js";
import marked from "./vendor/marked.js";
import DOMPurify from "./vendor/purify.js";

const labels = {
  overview: "Overview",
  "quick-start": "Quick Start",
  "key-concepts": "Key Concepts",
  usage: "Usage",
  api: "API",
  about: "About",
};

const pages = (store) => {
  store.on("$init", () => ({ pages: {} }));
  store.on("pages/set", (state, data) => ({
    pages: { [data.id]: data.content, ...state.pages },
  }));
};

const Page = () => {
  const id = h3.route.path.slice(1);
  const ids = Object.keys(labels);
  const md = ids.includes(id) ? `md/${id}.md` : `md/overview.md`;
  if (!h3.state.pages[id]) {
    (async () => {
      const response = await fetch(md);
      const text = await response.text();
      h3.dispatch("pages/set", {
        id,
        content: marked(DOMPurify.sanitize(text)),
      });
      h3.redraw();
    })();
  }
  const menu = ids.map((p) => h3("a", { href: `#/${p}` }, labels[p]));
  const html = h3.state.pages[id];
  const content = html ? h3("div.content", { $html:  html}) : h3("div.empty", {style: "text-align: center; margin: auto;"}, h3("span.spinner"));
  return h3("div.page", [
    h3("header.row", [
      h3("a.logo.col-sm", { href: "#/" }, "H3"),
      h3("label.drawer-toggle.button.col-sm-last", { for: "drawer-control" }),
    ]),
    h3("div.row", [
      h3("input#drawer-control.drawer", { type: "checkbox" }),
      h3("nav#navigation.col-md-3", [
        h3("label.drawer-close", { for: "drawer-control" }),
        ...menu,
      ]),
      h3("main.col-sm-12.col-md-9", [
        h3("div.card.fluid", h3("div.section", content))
      ]),
      h3("footer", h3("div", "© 2020 Fabio Cevasco")),
    ]),
  ]);
};

h3.init({
  element: document.getElementById("app"),
  modules: [pages],
  routes: {
    "/": Page,
  },
});