Belle-Ve Bricks

Your Imagination

Lego Stormtrooper picture creditted to Daniel Cheung.

LEGO Blog – Starting Our Blogging Journey

Create Your

We help you from start to finish to create and deliver your tailor-made custom model.
Custom model
Continue

A bit about me and how I ended up here

Let’s start with the pleasantries, my name is Matthew Mitchell, I live in the United Kingdom and am at the ripe old age of 32 (although I feel closer to 40 these days). I have two children who keep my wife and me busy, if only I could have even just an ounce of their energy, I would have written this blog in 5 minutes!

Around a year or so ago I decided to create the original Belle-Ve brand and started dabbling in selling on eBay.
I sold whatever I could get my hands on, if it was on offer at the local supermarkets I was jumping at it. The thrill of finding something you could buy and resell for 25% profit was amazing, at that point I was hooked and it only escalated until I found myself unable to find anything to sell for a few weeks, panic set in that I couldn’t maintain business with it like this and with the time I had available, that and there were only so many shops around me that I could go bargain hunting in!

Now let’s jump forward a few weeks…

One day I was just pottering around the house, I wandered past my son’s ever-messy bedroom and I saw his LEGO® sets sitting there, some made up, some in pieces being built, and some in pieces because his little sister was ‘helping’ him.

This made me think of how much money parents had spent on LEGO® so I looked into it more and I was amazed at how massive the adult LEGO® community was! I had to get more involved.

I started my own Facebook group called Brick Deals & LEGO® Bargains where I found the best LEGO® deals on the market and shared them with the group members. This is still going strong with over 1300 members as of writing this.

Jumping forward a few months this time…

Over this time I made some good contacts and some even better friends from buying and selling LEGO® sets, not only did I manage to get my fix for buying and selling but I found whole new respect and appreciation for Lego.

We had always encouraged our son to build, play and use his imagination but until now I hadn’t even thought of the possibilities that people with creative skills could accomplish. I mean, I didn’t even know what a MOC or AFOL was at this point.

Some of the MOC designer’s engineering skills could seriously be put to good use in the real world!

This led to where I am today, I decided to stop selling physical LEGO® and dedicate my time to building a website where I could partner with these talented people and help them monetize their work.

The final result of my website (hopefully you have seen or heard of it) is called Belle-Ve Bricks. If you haven’t seen it you really should check it out, it’s amazing. Sure I am biased, but I know you will love it

We currently have over 200 MOC designs and 17 designers, we now do commission-based builds and have an amazing social media network that is ever-expanding.

I wanted to keep the momentum going in 2020 so thought I would start a LEGO® blog and here we are!

Facebook
Instagram

What you can expect to see in the LEGO® blogs

This one is simple… if you think of something that involves LEGO® then I will probably create a blog about it at some point.

I have ideas of what I want the LEGO® blog to be about but I want to also be led by all of you, it’s a two-way street after all, not everything I find interesting may be what you do. If you give me topics I will create the content that you will hopefully enjoy!

In all seriousness, LEGO® blog topics that you can expect to see here are:

  • We offer custom LEGO® Models
  • Overviews and reviews from the MOCs on Belle-Ve Bricks website
  • Overviews and reviews from MOCs around the world
  • Interviews with Belle-Ve Bricks designers
  • Interviews with my contacts who sell on BrickLink
  • Looking at the commission builds we do with customers and our designer input
  • General LEGO® news and updates
  • The one I am most excited about… I will be getting my 12-year-old son to share his opinions, loves, hates, etc on Lego.

You are not just the audience but the critics of the LEGO® blog, one comment will help me so much!

I mentioned earlier that your involvement will help massively, but this couldn’t be any closer to the truth, I need you to lead where the LEGO® blogs go, to let me know when blogs are good, and point out when they need improving.

Feel free to comment on any of these LEGO® blogs, I am committing myself to read and respond to every single comment or if it’s easier you can drop me an email at support@bellevebricks.com and I will get back to you ASAP.

<div class="badge-base LI-profile-badge" data-locale="en_US" data-size="large" data-theme="dark" data-type="HORIZONTAL" data-vanity="ferdi-vol" data-version="v1"><a class="badge-base__link LI-simple-link" href="https://www.linkedin.com/in/%E2%9C%85-ferdi-vol-corporate-gifts/?trk=profile-badge"></a></div>
/* Auto generated, hash = 5dceu9kevqjdyuy2uw1atqrsu */
//TODO: Break this file down so that we can actually unit test it.
(function(window) {
  /**
  * Renders all unrendred LinkedIn Badges on the page
  */
  window.LIRenderAll = function () {
    var CALLBACK_NAME     = 'LIBadgeCallback', //Must match callback on helpers.js
        BADGE_NAMES       = '.LI-profile-badge, .LI-entity-badge',
        // TODO -- tracking param for other badge types
        TRACKING_PARAM    = 'profile-badge',
        responsesReceived = 0, //Keeps track of number of responses recieved for proper cleanup when finished
        expectedResponses = 0, //Keeps track of number of responses to expect
        scripts           = [ ], //Keeps track of scripts added for proper cleanup when finished
        childScripts      = {}, //Keeps track of child scripts to render
        badges            = Array.prototype.slice.call(document.querySelectorAll(BADGE_NAMES));

    var i, len, badge, rendered;
    for (i = 0, len = badges.length;  i < len; i++) {
      badge    = badges[i];
      rendered =  badge.getAttribute('data-rendered');
      if (!rendered) {
        expectedResponses++;
        badge.setAttribute('data-rendered', true);
        renderBadge(badge);
      }
    }

    function isCNDomain() {
      if (typeof window !== "undefined") {
        var hostName = window.location && window.location.hostname ||  '';
        return (/linkedin(-ei)?.cn$/).test(hostName);
      }

      return false;
    }

    function generateUrl(isEI) {
      var domainPrefix = isEI ? 'https://badges.linkedin-ei' : 'https://badges.linkedin';
      if (isCNDomain()) {
        return domainPrefix + ".cn/";
      }

      return domainPrefix + ".com/";
    }

    function getBadgeKeyQueryParams(badge) {
      return Array.prototype.slice.call(badge.attributes).filter(function (attr) {
        return attr.name.lastIndexOf('data-key-', 0) !== -1;
      }).map(function (attr) {
        // Most browsers automatically lowercase the attribute name when its being read
        // We are calling lowercase on it again to ensure consistency for any browsers that are lagging behind.
        return encodeURIComponent(attr.name.replace('data-', '').toLowerCase()) + '=' + encodeURIComponent(attr.value);
      });
    }

    /*
    * Renders a single badge on the page
    * @param badge: div element of badge to render
    */
    function renderBadge(badge) {
      var size       = badge.getAttribute('data-size'),
          locale     = badge.getAttribute('data-locale'),
          type       = badge.getAttribute('data-type'),
          theme      = badge.getAttribute('data-theme'),
          vanity     = badge.getAttribute('data-vanity'),
          version    = badge.getAttribute('data-version'),
          isEI       = badge.hasAttribute('data-ei'),
          entity     = badge.getAttribute('data-entity'),
          isCreatePage = badge.hasAttribute('data-iscreate'),
          uid        = Math.round(1000000 * Math.random()),
          baseUrl = generateUrl(isEI),
          queryParams = [
            'locale=' + encodeURIComponent(locale),
            'badgetype=' + encodeURIComponent(type),
            'badgetheme=' + encodeURIComponent(theme),
            'uid=' + encodeURIComponent(uid),
            'version=' + encodeURIComponent(version)
          ],
          url;

      if (version === 'v2') {
        baseUrl += 'view';
        queryParams.push('badgesize=' + encodeURIComponent(size));
        queryParams.push('entity=' + encodeURIComponent(entity));
        queryParams = queryParams.concat(getBadgeKeyQueryParams(badge));
      } else {
        baseUrl += 'profile';
        queryParams.push('maxsize=' + encodeURIComponent(size));
        queryParams.push('trk=' + encodeURIComponent(TRACKING_PARAM));
        queryParams.push('vanityname=' + encodeURIComponent(vanity));
      }

      if (isCreatePage) {
        queryParams.push('fromCreate=true');
      }

      url = baseUrl + '?' + queryParams.join('&');
      badge.setAttribute('data-uid' , uid);
      jsonp(url); //Calls responseHandler when done
    }

    /**
    * Handles a response from the server. Finds badge matching badgeUid and inserts badgeHtml there
    * @param badgeHtml: String representing contents of the badge
    * @param badgeUid: UID of the badge to target
    **/
    function responseHandler(badgeHtml, badgeUid) {
      responsesReceived ++;

      var i, badge, uid, isCreate;
      var defaultWidth = 330 // max possible width
      var defaultHeight = 300 // max possible height

      for (i = 0, len = badges.length; i < len; i++) {
        badge = badges[i];
        // isCreate needed to prevent reloading artdeco script tag
        isCreate = badge.getAttribute('data-iscreate');
        uid   = parseInt(badge.getAttribute('data-uid'), 10);
        if (uid === badgeUid) {
          var badgeMarkup = `<body>${badgeHtml}</body>`
          var iframe = document.createElement('iframe');
          iframe.onload = function() {
            var iframeBody = iframe.contentWindow.document.body;
            // 5 px buffer to avoid the badge border being cut off.
            iframe.setAttribute('height', (iframeBody.scrollHeight || defaultHeight) + 5);
            iframe.setAttribute('width', (iframeBody.scrollWidth || defaultWidth) + 5);
          };
          iframe.setAttribute('frameBorder', '0');
          iframe.style.display = 'block';
          badge.appendChild(iframe);
          iframe.contentWindow.document.open();
          iframe.contentWindow.document.write(badgeMarkup);
          iframe.contentWindow.document.close();
          replaceScriptTags(badge, isCreate);
        }
      }
      tryClean();
    }

  // These functions are needed because badge markup is added via innerHtml property which does not run script tags
  function replaceScriptTags(node, isCreate) {
    if (shouldReplaceNode(node, isCreate)) {
      node.parentNode.replaceChild(cloneScriptNode(node), node);
      childScripts[node.src] = true;
    } else {
      var i = 0,
          children = node.childNodes;
      while (i < children.length) {
        replaceScriptTags(children[i++], isCreate);
      }
    }
    return node;
  }

  function shouldReplaceNode(node, isCreate) {
    return isScriptNode(node) && !childScripts[node.src] && (!isCreate || (isCreate && !node.getAttribute('data-isartdeco')));
  }

  function isScriptNode(node) {
    return node.tagName === 'SCRIPT';
  }

  function cloneScriptNode(node){
    var script  = document.createElement("script");
    for( var i = node.attributes.length-1; i >= 0; i-- ) {
      script.setAttribute( node.attributes[i].name, node.attributes[i].value );
    }
    return script;
  }

    // Gets all incoming responses
    window[CALLBACK_NAME] = responseHandler;

    /**
    * Tries to clean added tags
    **/
    function tryClean() {
      //Clean up after all requests are done..
      //Accounts for people including script more than once
      var done = (responsesReceived >= expectedResponses && expectedResponses > 0) || responsesReceived >= badges.length;
      if (done) {
        delete window[CALLBACK_NAME];

        // remove all script tags
        scripts.map(function(script){
          document.body.removeChild(script);
        });

      }
    }

    /*
    * Makes Jsonp request, responses handles by CALLBACK_NAME
    * @param url String: url of server to make request to
    */
    function jsonp(url) {
      var script = document.createElement('script');
      script.src = url;
      scripts.push(script);
      document.body.appendChild(script);
    }
  };

  if (document.readyState === 'complete') {
    window.LIRenderAll();
  } else {
    window.addEventListener('load', window.LIRenderAll, false);
  }

})(window);
Popular Posts