Knockout Isotope Binding

HTML

<link rel="stylesheet" href="//cdnjs.cloudflare.com/ajax/libs/normalize/3.0.0/normalize.css">
<script src="//cdnjs.cloudflare.com/ajax/libs/knockout/3.0.0/knockout-debug.js"></script>
<script src="//cdnjs.cloudflare.com/ajax/libs/jquery.isotope/1.5.25/jquery.isotope.js"></script>
<script src="//rawgithub.com/dougludlow/knockout.isotope/master/src/knockout.isotope.js"></script>
<section id="options">
    <button class="shuffle">Shuffle</button>
</section>

<div id="container" data-bind="isotope: { data: elements, options: isotopeOptions }">
    <div class="element" data-bind="attr: { 'data-symbol': symbol }, css: $root.getTypes(type), style: { backgroundColor: '#' + color }, click: $root.remove">
        <p class="number" data-bind="text: number"></p>
        <h3 class="symbol" data-bind="text: symbol"></h3>
        <h2 class="name" data-bind="text: name"></h2>
        <p class="weight" data-bind="text: mass"></p>
    </div>
</div>

CSS

/**** Isotope CSS3 transitions ****/

.isotope,
.isotope .isotope-item {
  -webkit-transition-duration: 0.8s;
     -moz-transition-duration: 0.8s;
      -ms-transition-duration: 0.8s;
       -o-transition-duration: 0.8s;
          transition-duration: 0.8s;
}

.isotope {
  -webkit-transition-property: height, width;
     -moz-transition-property: height, width;
      -ms-transition-property: height, width;
       -o-transition-property: height, width;
          transition-property: height, width;
}

.isotope .isotope-item {
  -webkit-transition-property: -webkit-transform, opacity;
     -moz-transition-property:    -moz-transform, opacity;
      -ms-transition-property:     -ms-transform, opacity;
       -o-transition-property:      -o-transform, opacity;
          transition-property:         transform, opacity;
}

/**** disabling Isotope CSS3 transitions ****/

.isotope.no-transition,
.isotope.no-transition .isotope-item,
.isotope .isotope-item.no-transition {
  -webkit-transition-duration: 0s;
     -moz-transition-duration: 0s;
      -ms-transition-duration: 0s;
       -o-transition-duration: 0s;
          transition-duration: 0s;
}

JavaScript

function ViewModel() {
    var self = this;
    
    self.elements = ko.observableArray([]);
    self.isotopeOptions = {
        itemSelector : '.element',
        getSortData : {
            symbol : function( $elem ) {
                return $elem.attr('data-symbol');
            },
            //category : function( $elem ) {
            //    return $elem.attr('data-category');
            //},
            number : function( $elem ) {
                return parseInt( $elem.find('.number').text(), 10);
            },
            weight : function( $elem ) {
                return parseFloat( $elem.find('.weight').text().replace( /[\(\)]/g, ''));
            },
            name : function ( $elem ) {
                return $elem.find('.name').text();
            }
        }   
    }
    
    self.load = function() {
        $.getJSON('http://rawgit.com/dougludlow/chemistry/master/elements.json', function(data) {
           self.elements(data); 
        });
    };
    self.getTypes =  function(csv) {
        var types = csv.split(',');
        for (var i = 0; i < types.length; i++)
            types[i] = types[i].replace(/\s+/g, '-');
        return types.join(' ');
    };
    self.remove = function(element) {
        self.elements.remove(element);
    };
}

var vm = new ViewModel();
vm.load();
ko.applyBindings(vm);

$('button.shuffle').click(function() {
    $('#container').isotope('shuffle');
});