newbeg
clone your own copy | download snapshot

Snapshots | iceberg

Inside this repository

index.html
text/html

Download raw (3.4 KB)

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
  <style>

    body {
      height: 100vh;
      overflow: auto;
      display: grid;
      grid-template-columns: 1fr 400px;
      font-size: 16px;
      font-family: sans-serif;
      padding: 2rem;
      column-gap: 2rem;
      margin: 0;
      box-sizing: border-box;
    }

    label {
      display: block;
      margin: .5rem 0;
    }

    main {
      font-family: 'stroke';
      padding: 10px;
      font-size: 10vh;
    }

    #downloadLink {
      word-break: break-all;
      margin: .5rem 0;
    }

    #fontPublicStyles {
      width: 100%;
      height: 9rem;
      margin: .5rem 0;
    }

  </style>
</head>
<body>
  <main contenteditable>
      A quiver in the spine of the R.
  </main>
  <aside>
    <label>Skeleton: <select name="skeleton">{% for skeleton in skeletons %}<option value="{{ skeleton }}">{{ skeleton }}</option>{% endfor %}</select></label>
    <label>Scale X: <input type="number" name="scaleX" min="0" max="2" value="1" step=".1"></label>
    <label>Scale Y: <input type="number" name="scaleY" min="0" max="2" value="1" step=".1"></label>
    <label>Skew: <input type="number" name="skew" min="-70" max="70" value="0"></label>
    <label>Pen: <select name="pen"><option value="elliptical">elliptical</option></select></label>
    <label>Pen width: <input type="number" name="penWidth" min="10" max="1000" value="20"></label>
    <label>Pen minor width: <input type="number" name="penMinorWidth" min="10" max="1000" value="20"></label>
    <label>Pen angle: <input type="number" name="penAngle" min="0" max="90" value="30"></label>
    <a id="downloadLink" download></a>
    <textarea id="fontPublicStyles" rows="5"></textarea>
  </aside>
  <style id="fontStyles">
  </style>
  <script>
    const elements = document.querySelectorAll('input, select');
    const state = {};

    // Add listeneres for fields changing
    for (let i = 0; i < elements.length; i++) {
      const field = elements[i];
      state[field.name] = field.value;
      field.addEventListener('change', function () {
        // Update state
        state[this.name] = this.value;
        // Refresh font
        loadFont();
      })
    }

    function loadFont () {
      // const url = new URL(document.location.host + '/font');
      // url.protocol = document.location.protocol;
      // // Extract data from state and add to url
      // for (key in state) {
      //   url.searchParams.set(key, state[key]);
      // }

      const searchParams = new URLSearchParams(state),
            fontURL = '/font?' + searchParams.toString(),
            downloadLink = document.getElementById('downloadLink'),
            fontStyles = document.getElementById('fontStyles'),
            fontPublicStyles = document.getElementById('fontPublicStyles'),
            fontName = `stroke-${state.skeleton}-${state.scaleX}-${state.scaleY}-${state.skew}-${state.pen}-${state.penWidth}-${state.penMinorWidth}-${state.penAngle}`;
      
      console.log(fontURL);

      downloadLink.href = fontURL;
      downloadLink.innerText = '↓ ' + fontURL;

      fontPublicStyles.textContent = `@font-face {\n  font-family: "${ fontName }";\n  src: url("${fontURL}");\n}`;

      fontStyles.innerHTML = `@font-face { font-family: "stroke"; src: url("${fontURL}")}`;
    }

    loadFont();
  </script>
</body>
</html>