JSFiddle - React, Tailwind, and code Playground

by cmruser

HTML

<script src="http://cmrdemo.com/websites/partnerportal/template/scripts/script.js"></script>
<script src="http://cmrdemo.com/websites/partnerportal/template/scripts/plugin.injectcss.js"></script>
<script src="https://cmrdemo.com/websites/partnerportal/template/scripts/plugin.minicolors.js"></script>
<div class="wrap">
<div class="drops"></div>
<section id="editor" class="editor">
	<nav>
		<div class="buttons"></div>
	</nav>
	<header>
		<ul>
			<li><a data-toggle="tab">Content</a></li>
			<li><a data-toggle="tab">Design</a></li>
			<li><a data-toggle="tab">Setting</a></li>
		</ul>
	</header>
	<main>
		<div id="panelContent" class="panel">
			<main>
				<div data-panel="1" class="panel">
					<div class="drags">
					    <ul>
					        <li class="dragsection" data-type="section" data-role="section">section</li>
					        <li class="dragblock" data-type="block" data-role="block">block</li>
					        <li class="dragcell" data-type="cell" data-role="cell">cell</li>
					    </ul>
					    <ul>
					        <li class="dragfield" data-type="field" data-role="text" data-content="<p>This is text</p>">text</li>
					        <li class="dragfield" data-type="field" data-role="image" data-content="<img src='' alt='image'>">image</li>
					        <li class="dragfield" data-type="field" data-role="devider" data-content="<hr>">devider</li>
					    </ul>
					</div>
				</div>
				<div data-panel="2" class="panel" style="display:none;">
					2
				</div>
				<div data-panel="3" class="panel" style="display:none;">
					3
				</div>
			</main>
		</div>
		<div id="panelDesign" class="panel">
			<main>
				<div data-panel="1" class="panel">
					<a data-toggle="collapse" data-target="#collapsePanel-1-1" data-parent="">Type</a>
					<ul id="collapsePanel-1-1" class="formfield">
						<li>
							<label class="field-label">Font Family</label>
							<div class="field-control">
								<select class="select" data-key="font_family_block"...

CSS

body   { font-family:arial; font-size:14px;}
.wrap  { overflow:hidden;}
.drops { width:80%; float:left;}
.editor { width:15%; float:left;}

.guide {
    outline: 1px dashed #777; 
    outline-offset:-2px; 
    box-shadow:inset 0 0 0 12px rgba(0,0,0,.1);
    padding:12px;
    min-height: 18px;
}
.ui-sortable-placeholder {
    outline: 1px dashed #777; 
    outline-offset:-2px; 
    box-shadow:inset 0 0 0 2px rgba(0,0,0,.1);
    padding:24px;
    background-color:#a2c4e9;
}

.drops,.dropsection,.dropblock,.dropcell,.dropfield { min-height:24px;}
.t-section:focus,
.t-block:focus,
.t-cell:focus,
.t-field:focus{
    outline:none;
    box-shadow:none;
    border:1px solid #03a9f4;
    position: relative;
}
.t-section:focus > .guide > .menu-editor,
.t-block:focus > .guide > .menu-editor,
.t-cell:focus > .guide > .menu-editor,
.t-field:focus > .guide > .menu-editor{
    display:block !important;
    position:absolute;
    top: 0;
    left: 0;
    right: 0;
    height: 0;
    z-index: 1;
}
.menu-editor .buttons { float: right}
.menu-editor .buttons a {
    display:inline-block;
    padding:12px;
    background-color:#eee;
    margin:2px 2px 0 0;
    width:12px;
    height:12px;
}
.menu-editor small {
    display:inline-block;
    padding:3px 6px;
    background-color:#03a9f4;
    color: #fff;
    float: left;
}
.t-block { visibility: none;}

.nav,
.subnav { 
	padding: 0; 
	margin: 0; 
	list-style: none;
}
.nav li {
	position: relative; 
}
.nav a {
	display: block;
	text-decoration: none;
	line-height: 0;
	outline: 0;
	white-space: nowrap;
	padding: 24px 16px;
	color: #333;
}
.nav a:hover {
	background-color: #ddd;
}
.subnav {
	background-color: #ddd;
    display:none;
}
.subnav li {
	width: 100%;
}
.subnav a {
}
.subnav a:hover {
	background-color: #ccc;
}

.dropdown > a:after,
.branch > a:after {
	display: inline-block;
	font-family: 'icon';
	speak: none;
	font-style: normal;
	font-weight: normal;
	font-variant: normal;
	text-transform: none;
	-webkit-font-smoothing:...

JavaScript

var TemplateBuilder = (function () {
    // configs
    var configs = {};
    // .dropsection
    var dragSection;
    var drops;
    // .dropblock
    var dragBlock;
    var dropSection;
    // .dropcell
    var dragCell;
    var dropBlock;
    // .field
    var dragField;
    var dropCell;

    var vars = {
        TemplateCss: {
            Settings: {
                Template: {}
            },
            Styles: {
                Template: {
                    // font
                    font_family: "",
                    font_size: "",
                    line_height: "",
                    color: ""
                }
            }
        },
        BlockCss: {
            Settings: {
                Block: {
                    Grid: "",
                    Column: "",
                    Float: ""
                }
            },
            Styles: {
                Block: {
                    // background
                    background: "",
                    background_color: "",
                    background_image: "",
                    background_repeat: "",
                    background_attachment: "",
                    background_position: "",
                    background_size: "",
                    // border
                    border_width: "",
                    border_top_width: "",
                    border_right_width: "",
                    border_bottom_width: "",
                    border_left_width: "",
                    border_style: "",
                    border_color: "",
                    // padding
                    padding: "",
                    padding_top: "",
                    padding_right: "",
                    padding_bottom: "",
                    padding_left: "",
                    // margin
                    margin: "",
                    margin_top: "",
                    margin_right: "",
                    margin_bottom: "",
                    margin_left: ""
               ...