JSFiddle - React, Tailwind, and code Playground

HTML

<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min.js"></script>
<script src="http://ajax.googleapis.com/ajax/libs/angularjs/1.1.5/angular.min.js"></script>
<div data-ng-app="customPage">
  <script id='/form.html' type='text/ng-template'>
    <form data-ng-show='pageState.showAdminControls' data-ng-submit='submit()' id='page-form'>
      <i>the text input below is read-only</i><br />
      <input type='text' ng-model="widget.name"/>
      <input type='submit' value='Submit'>
    </form>
    <hr/>
  </script>

  <!-- form for CMS -->
  <div data-ng-view></div>
  
  <!-- dynamic CMS-driven content -->
  <div data-ng-controller='CustomPageCtrl'>
    <div data-ng-show='pageState.showAdminControls'>
      <a href="#/widget/new">New Widget</a>
    </div>
    <div id='page-content'>
      <div data-widget='1'>
        <h1>Widget 1</h1>
        <ul data-ng-show='pageState.showAdminControls'>
          <li><a href='#/widget/1/edit'>Edit</a></li>
          <li><a href='javascript:void(0)' data-delete-widget='1'>Delete</a></li>
        </ul>
      </div>
      <div data-widget='2'>
        <h1>Widget 2</h1>
        <ul data-widget='2' data-ng-show='pageState.showAdminControls'>
          <li><a href='#/widget/2/edit'>Edit</a></li>
          <li><a href='javascript:void(0)' data-delete-widget='2'>Delete</a></li>
        </ul>
      </div>
    </div>

    <div>
      <a href="javascript:void(0)" data-ng-click='pageState.showAdminControls = !pageState.showAdminControls'>
        {{ pageState.showAdminControls ? 'Hide' : 'Show' }} Admin Controls
      </a>
    </div>
  </div>
</div>

JavaScript

(function() {
  var customPage, genHtml, widgetCount = 2;

  genHtml = function() {
    var html = '', id;
    html += "<div>Reloaded " + Date() + "</div>";
    for (id = 1; id <= widgetCount; ++id) {
      html += "<div data-widget='" + id + "'><h1>Widget " + id + "</h1><ul data-ng-show='pageState.showAdminControls'><li><a href='#/widget/" + id + "/edit'>Edit</a></li><li><a href='javascript:void(0)' data-delete-widget='" + id + "'>Delete</a></li></ul></div>";
    }
    return html;
  };

  customPage = angular.module('customPage', []);

  customPage.config(function($routeProvider) {
    $routeProvider.when('/', {
      controller: 'CustomPageCtrl',
      template: ''
    }).when('/widget/new', {
      controller: 'PageEditCtrl',
      templateUrl: '/form.html'
    }).when('/widget/:id/edit', {
      controller: 'PageEditCtrl',
      templateUrl: '/form.html'
    });
  });

  customPage.factory('PageState', function() {
    return {
      showAdminControls: false
    };
  });

  customPage.controller('CustomPageCtrl', function($scope, $http, $location, PageState) {
    $scope.pageState = PageState;
  });

  customPage.directive('deleteWidget', function($http, $location) {
    return function(scope, element, attrs) {
      var id = attrs.deleteWidget;
      return element.bind('click', function() {
        setTimeout(function() {
          var widget_element;
          widget_element = angular.element('[data-widget=' + id + ']');
          widget_element.remove();
          widgetCount -= 1;
          $location.path('/');
        }, 100);
        scope.$digest();
      });
    };
  });

  customPage.controller('PageEditCtrl', function($scope, $http, $routeParams, $location, $route, $compile, PageState) {
    var widgetId = $routeParams.id || widgetCount + 1;

    $scope.pageState = PageState;
    $scope.widget = { id: widgetId, name: 'Widget ' + widgetId };
    $scope.submit = function() {
      if ($scope.widget.id > widgetCount) widgetCount += 1;
     ...