JSFiddle - React, Tailwind, and code Playground

by D4V1D

HTML

<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.5/css/bootstrap.min.css">
<div class="row" style="margin-top: 10px;">
    <div class="col-xs-12">
        <div class="col-xs-4 text-right" style="line-height: 34px;">Filtering options:</div>
        <div class="col-xs-8 text-left">
            <button class="btn btn-xl btn-primary sorter" data-filter="food">Food</button>
            <button class="btn btn-xl btn-primary sorter" data-filter="sports">Sports</button>
            <button class="btn btn-xl btn-primary sorter" data-filter="business">Business</button>
            <button class="btn btn-xl btn-primary sorter" data-filter="nature">Nature</button>
            |
            <button class="btn btn-xl btn-primary sorter" data-filter="*">All</button>
        </div>
    </div>
    <hr/>
    <div class="col-xs-12">
        <div class="col-xs-4 text-right" style="line-height: 34px;">Ordering options:</div>
        <div class="col-xs-8 text-left">
            <button class="btn btn-xl btn-primary orderer" data-order="asc">ASC</button>
            <button class="btn btn-xl btn-primary orderer" data-order="desc">DESC</button>
        </div>
    </div>
</div>
<hr/>

<ul id="sort-me">
    <li class="food" data-title="2" data-order="2" data-link="http://www.google.com/">
        <img src="http://lorempixel.com/200/200/food/1"/>
    </li>
    <li class="sports" data-title="5" data-order="5">
        <img src="http://lorempixel.com/200/200/sports/1"/>
    </li>
    <li class="sports" data-title="6" data-order="6">
        <img src="http://lorempixel.com/200/200/sports/3"/>
    </li>
    <li class="business" data-title="1" data-order="1">
        <img src="http://lorempixel.com/200/200/business/4"/>
    </li>
    <li class="food" data-title="4" data-order="4">
        <img src="http://lorempixel.com/200/200/food/5"/>
    </li>
    <li class="food" data-title="3" data-order="3">
        <img src="http://lorempixel.com/200/200/food/6"/>
    </li>
   ...

JavaScript

/*!
 jQuery.sdFilterMe v0.1
 (c) 2015 Steve David <http://www.steve-david.com>

 MIT-style license.
 */

;(function($) {

    $.fn.extend({
        sdFilterMe: function(options) {
            if (options && typeof(options) == 'object') {
                options = $.extend({}, $.sdFilterMe.defaults, options);
            }

            if($(this).length == 1) {
                new $.sdFilterMe(this, options);
            }

            return this;
        }
    });

    $.layout = [];

    $.sdFilterMe = function(el, options) {
        var $el = $(el);

        $(window).on('load', function() {

            $el = $.sdFilterMe.buildLayout(el, options);
            $.layout = $.sdFilterMe.storeCoordinates($el);

            $(window).on('resize', function() {
                $.layout = $.sdFilterMe.storeCoordinates($el);
            });

            var $boxes = $el.find('> .sdfm-inner-wrapper');

            // Triggering events


            $(options.filterSelector).css('cursor', 'pointer').on('click', function(e) {
                e.preventDefault();
                $.sdFilterMe.filterBoxes($el, $(this).attr('data-filter'), options);
            });

            $(options.orderSelector).css('cursor', 'pointer').on('click', function(e) {
                e.preventDefault();
                $.sdFilterMe.sortBoxes($boxes, $(this).attr('data-order'), options);
            });

            if(options.hoverEffect) {
                $.sdFilterMe.hoverEffect($el, options);
            }
        });
    };

    $.sdFilterMe.buildLayout = function(el, options) {

        var $el = $(el)
            , $lis = $el.find('> li')
            , widths = []
            , heights = []
            , clones = []
            , maxWidth
            , maxHeight
            , outerWrapperId = 'sdfm-wrapper'
            , $outerWrapper = $('<div />')
                .attr('id', outerWrapperId)
                .css({
                    'vertical-align': 'top',
                   ...