docs: function createTag(impl, conf, innerHTML) {
        if ( impl === void 0 ) impl = {};
        if ( conf === void 0 ) conf = {};
  
        var tag = conf.context || {};
        var opts = extend({}, conf.opts);
        var parent = conf.parent;
        var isLoop = conf.isLoop;
        var isAnonymous = !!conf.isAnonymous;
        var skipAnonymous = settings.skipAnonymousTags && isAnonymous;
        var item = conf.item;
        // available only for the looped nodes
        var index = conf.index;
        // All attributes on the Tag when it's first parsed
        var instAttrs = [];
        // expressions on this type of Tag
        var implAttrs = [];
        var expressions = [];
        var root = conf.root;
        var tagName = conf.tagName || getName(root);
        var isVirtual = tagName === 'virtual';
        var isInline = !isVirtual && !impl.tmpl;
        var dom;
  
        // make this tag observable
        if (!skipAnonymous) { observable(tag); }
        // only call unmount if we have a valid __TAG_IMPL (has name property)
        if (impl.name && root._tag) { root._tag.unmount(true); }
  
        // not yet mounted
        define(tag, 'isMounted', false);
  
        define(tag, '__', {
          impl: impl,
          root: root,
          skipAnonymous: skipAnonymous,
          implAttrs: implAttrs,
          isAnonymous: isAnonymous,
          instAttrs: instAttrs,
          innerHTML: innerHTML,
          tagName: tagName,
          index: index,
          isLoop: isLoop,
          isInline: isInline,
          item: item,
          parent: parent,
          // tags having event listeners
          // it would be better to use weak maps here but we can not introduce breaking changes now
          listeners: [],
          // these vars will be needed only for the virtual tags
          virts: [],
          wasCreated: false,
          tail: null,
          head: null
        });
  
        // create a unique id to this tag
        // it could be handy to use it also to improve the virtual dom rendering speed
        define(tag, '_riot_id', uid()); // base 1 allows test !t._riot_id
        define(tag, 'root', root);
        extend(tag, { opts: opts }, item);
        // protect the "tags" and "refs" property from being overridden
        define(tag, 'parent', parent || null);
        define(tag, 'tags', {});
        define(tag, 'refs', {});
  
        if (isInline || isLoop && isAnonymous) {
          dom = root;
        } else {
          if (!isVirtual) { root.innerHTML = ''; }
          dom = mkdom(impl.tmpl, innerHTML, isSvg(root));
        }
  
        define(tag, 'update', function (data) { return componentUpdate(tag, data, expressions); });
        define(tag, 'mixin', function () {
          var mixins = [], len = arguments.length;
          while ( len-- ) mixins[ len ] = arguments[ len ];
  
          return componentMixin.apply(void 0, [ tag ].concat( mixins ));
        });
        define(tag, 'mount', function () { return componentMount(tag, dom, expressions, opts); });
        define(tag, 'unmount', function (mustKeepRoot) { return tagUnmount(tag, mustKeepRoot, expressions); });
  
        return tag
      }