docs: function bootstrap_interactive(id, opts) {
      var el = document.getElementById(id);
  
      if (!el) {
        console.log("Whoops -- the lsv-interactive function couldn't find a <div> with the id you provided. You probably mistyped it in debug.js.");
        return;
      }
  
      // ought to already have this, but let's be sure
      if (!/\blsv-interactive\b/.test(el.className)) {
        // console.log("Warning: The <div> with the id", id, "didn't have the lsv-interactive class, which is weird.");
        el.className += " lsv-interactive";
      }
  
      if (/\blsv-interactive--rendered\b/.test(el.className)) {
        console.log("Interactive", id, "already rendered -- skipping");
        return;
      } else {
        el.className += " lsv-interactive--rendered";
        console.log("Loading interactive", id);
      }
  
      // remove screenshot
      var screenshot = el.getElementsByTagName("img");
      if (screenshot && screenshot[0]) {
        el.removeChild(screenshot[0]);
      }
  
      // get params
      var params = {};
      for (var c = 0; c < el.attributes.length; c += 1) {
        var attr = el.attributes[c];
        if (/^data-/.test(attr.nodeName)) {
          var key = attr.nodeName.split("data-")[1];
          params[key] = attr.nodeValue;
        }
      }
  
      // return the DOM object
      return {
        version: "0.4.0a",
        id: id,
        el: el,
        width: function () {
          return el.offsetWidth;
        },
        height: function () {
          return el.offsetHeight;
        },
        page_width: document.body.offsetWidth,
        page_height: document.body.offsetHeight,
        params: params,
        is_touch_device: is_touch_device(),
        onresize: function (f, delay) {
          if (!document.addEventListener) {
            console.log("onresize not supported in this browser");
            return;
          }
          delay = typeof delay != "number" ? 250 : delay;
          var resizeTimer;
  
          // shouldn't overwrite anything important
          // http://stackoverflow.com/questions/22204902/does-window-addeventlistenermessage-overwrite-other-listeners
          window.addEventListener("resize", function () {
            clearTimeout(resizeTimer);
            resizeTimer = setTimeout(function () {
              f(el.offsetWidth, el.offsetHeight);
            }, delay);
          });
        }
      };
  
    }