JSFiddle - React, Tailwind, and code Playground

HTML

<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.23/angular.min.js"></script>
<script src="https://rawgit.com/marceljuenemann/angular-drag-and-drop-lists/master/angular-drag-and-drop-lists.min.js"></script>

<link href="//maxcdn.bootstrapcdn.com/bootstrap/3.3.1/css/bootstrap.min.css" rel="stylesheet" type="text/css" />
<div ng-app="app">
  <div ng-controller="homeCtrl" class="drop-layout">
    <h1>Grid:</h1>
    <grid htmlstring="html_string" pageelements="page_elements"></grid>
    
    <script type="text/ng-template" id="snippet.html">
      <div class="item">{{item.snippet}} {{item.position}}</div>
    </script>
    <h1>Compile dynamic HTML</h1><h5>How to live preview of filled by elements html?</h5>
    <textarea ng-model="html_string" rows="5" cols="100"></textarea>
    <p>Assign elements to .grid-cells: <pre>{{page_elements}}</pre></p>
  </div>
</div>

CSS

.item {
  min-height: 50px;
  padding-left: 0px;
}

.drop-layout .layout-grid {
  margin-bottom: 15px;
}

.drop-layout .layout-grid [class^=col-] {
  background-color: #eee;
  background-color: rgba(86, 61, 124, .15);
  border: 1px solid #ddd;
  border: 1px solid rgba(86, 61, 124, .2);
}

.drop-layout div[dnd-list], .drop-layout div[dnd-list] > div {
  position: relative;
}

.drop-layout .drop-area div[dnd-list] {
  min-height: 50px;
  padding-left: 0px;
}

.drop-layout .drop-area div {
  background-color: #eee;
  border: 1px solid #ddd;
  display: block;
  padding: 0px;
}

.drop-layout .drop-area .dndDragging {
  opacity: 0.7;
}

.drop-layout .drop-area .dndDraggingSource {
  display: none;
}

.drop-layout .drop-area .dndPlaceholder {
  background-color: #ddd;
  background-color: rgba(86, 61, 124, .2);
  min-height: 48px;
  display: block;
  position: relative;
}

JavaScript

var app = angular.module('app', ['dndLists']);
app.directive('includeReplace', function () {
    return {
        require: 'ngInclude',
        restrict: 'A', /* optional */
        link: function (scope, el, attrs) {
            el.replaceWith(el.children());
        }
    };
});
app.controller('homeCtrl', function ($scope) {
    $scope.html_string = "<div class='container'><div class='row'><div class='col-xs-12'><div class='row'><div class='col-xs-4 grid-cell'></div><div class='col-xs-4 grid-cell'></div><div class='col-xs-4 grid-cell'></div></div><div class='row'><div class='col-xs-4 grid-cell'></div><div class='col-xs-4 grid-cell'></div><div class='col-xs-4 grid-cell'></div></div></div></div></div>";

    $scope.page_elements = [{
        "grid_id": 0,
            "position": 0,
            "snippet": "<h4>First Grid 0</h4>",
        "template": "snippet"
    }, {
        "grid_id": 0,
            "position": 1,
            "snippet": "<h2>Second Grid 0</h2>",
        "template": "snippet"
    }, {
        "grid_id": 1,
            "position": 0,
            "snippet": "<h2>First Grid 1</h2>",
        "template": "snippet"
    }, {
        "grid_id": 1,
            "position": 1,
            "snippet": "<h2>Second Grid 1</h2>",
        "template": "snippet"
    }, {
        "grid_id": 2,
            "position": 0,
            "snippet": "<h1>First Grid 2</h1>",
        "template": "snippet"
    }, {
        "grid_id": 2,
            "position": 1,
            "snippet": "<h2>Second Grid 0</h2>",
        "template": "snippet"
    }, {
        "grid_id": 2,
            "position": 2,
            "snippet": "<h2>Third Grid 0</h2>",
        "template": "snippet"
    }, {
        "grid_id": 5,
            "position": 0,
            "snippet": "<h2>Before Last</h2>",
        "template": "snippet"
    }, {
        "grid_id": 5,
            "position": 1,
            "snippet": "<h2>Last</h2>",
        "template": "snippet"
    }];
    $scope.page_elements_pretty =...