', {
+ 'class': 'rld-link',
+ 'href': '#' + id,
+ 'text': size + 'px'
+ })
+ .data('RLD/Step', step)
+ )
+ );
+ }
+ // Attach behaviors.
+ this.$stepContainer.delegate('a', 'click.RLD.StepManager', {'manager': this}, this.activateStep);
+ // Attach the steps and layouts to the $editor and return it.
+ return this.$editor
+ .append(this.$stepContainer);
+ };
+ /**
+ *
+ */
+ StepManager.prototype.addItem = function (step) {
+ this.steps.push(step);
+ };
+ /**
+ *
+ */
+ StepManager.prototype.activateStep = function (event) {
+ event.preventDefault();
+ var $stepLink = $(this);
+ var manager = event.data.manager;
+ var step = $stepLink.data('RLD/Step');
+ if (step === undefined) {
+ step = manager.steps[0];
+ }
+ manager.activeStep = step;
+ manager.info('$editor').find('a').removeClass('rld-active');
+ $stepLink.addClass('rld-active');
+ manager.topic('stepActivated').publish(event, step);
+ };
+
+ return StepManager;
+
+ }());
+}(ResponsiveLayoutDesigner, jQuery));
\ No newline at end of file
diff --git a/core/modules/rlayout/designer/app/libs/Utils/Utils.js b/core/modules/rlayout/designer/app/libs/Utils/Utils.js
new file mode 100644
index 0000000..5dde78b
--- /dev/null
+++ b/core/modules/rlayout/designer/app/libs/Utils/Utils.js
@@ -0,0 +1,84 @@
+(function (RLD, $) {
+
+ function mapKeyToChar(isShifted, keyCode) {
+ if (keyCode === 27
+ || keyCode === 8
+ || keyCode === 9
+ || keyCode === 20
+ || keyCode === 16
+ || keyCode === 17
+ || keyCode === 91
+ || keyCode === 13
+ || keyCode === 92
+ || keyCode === 18) {
+ return false;
+ }
+ if (typeof isShifted != "boolean" || typeof keyCode != "number") {
+ return false;
+ }
+ var charMap = [];
+ charMap[192] = "~";
+ charMap[49] = "!";
+ charMap[50] = "@";
+ charMap[51] = "#";
+ charMap[52] = "$";
+ charMap[53] = "%";
+ charMap[54] = "^";
+ charMap[55] = "&";
+ charMap[56] = "*";
+ charMap[57] = "(";
+ charMap[48] = ")";
+ charMap[109] = "_";
+ charMap[107] = "+";
+ charMap[219] = "{";
+ charMap[221] = "}";
+ charMap[220] = "|";
+ charMap[59] = ":";
+ charMap[222] = "\"";
+ charMap[188] = "<";
+ charMap[190] = ">";
+ charMap[191] = "?";
+ charMap[32] = " ";
+ var character = "";
+ if (isShifted) {
+ if (keyCode >= 65 && keyCode <= 90) {
+ character = String.fromCharCode(keyCode);
+ }
+ else {
+ character = charMap[keyCode];
+ }
+ }
+ else {
+ if (keyCode >= 65 && keyCode <= 90) {
+ character = String.fromCharCode(keyCode).toLowerCase();
+ }
+ else {
+ character = String.fromCharCode(keyCode);
+ }
+ }
+ return character;
+ }
+
+ RLD['Utils'] = {};
+ /**
+ * Keymanager
+ */
+ RLD['Utils'].keyManager = function (event) {
+ var pattern = event.data.pattern;
+ var callback = event.data.callback;
+ // Get the key.
+ var key = mapKeyToChar(event.shiftKey, event.keyCode);
+ if (key && typeof pattern === 'object' && 'exec' in pattern && typeof callback === 'function') {
+ // Invoke callback if the key is allowed or the delete key is pressed.
+ if (pattern.exec(key) || $.inArray(key, [8]) > -1) {
+ event.key = key;
+ callback.apply(this, arguments);
+ }
+ else {
+ console.log(event.keyCode);
+ // The key(s) are illegal, do nothing.
+ event.preventDefault();
+ }
+ }
+ };
+}(ResponsiveLayoutDesigner, jQuery));
\ No newline at end of file
diff --git a/core/modules/rlayout/designer/app/main.js b/core/modules/rlayout/designer/app/main.js
new file mode 100644
index 0000000..ed88af4
--- /dev/null
+++ b/core/modules/rlayout/designer/app/main.js
@@ -0,0 +1,314 @@
+(function (window, $) {
+ var RLD = (function(){
+ /**
+ * Extend jQuery to smooth out version differences.
+ */
+ $.Event.prototype.getDelegator = function () {
+ if ('delegateTarget' in this) {
+ return this.delegateTarget;
+ }
+ if ('liveFired' in this) {
+ return this.liveFired;
+ }
+ return null;
+ };
+ // Identify jQuery events from other objects.
+ $.Event.prototype.__marker = 'jQueryEvent';
+ /**
+ * Create the InitClass object that all other objects will extend.
+ */
+ var InitClass = (function () {
+
+ var plugin = 'InitClass';
+
+ function InitClass() {
+ // Don't set anything in here, or all objects will inherit these values.
+ }
+ /**
+ * Safe logging function.
+ */
+ InitClass.prototype.log = function (message, type) {
+ if ('console' in window) {
+ var type = type || 'log';
+ if (type in console) {
+ console[type](message);
+ }
+ }
+ };
+ /**
+ *
+ */
+ InitClass.prototype.init = function (opts) {
+ // Create a topics property for pub/sub event handling.
+ this.topics = {};
+ // Process the options for this instance.
+ var prop;
+ var options = ('options' in this) ? this.options : {};
+ options = $.extend({}, options, opts);
+ for (prop in options) {
+ if (options.hasOwnProperty(prop)) {
+ this[prop] = options[prop];
+ }
+ }
+ // Delete the options.
+ if ('options' in this) {
+ delete this.options;
+ }
+ // Call the object's setup method.
+ this.setup.apply(this);
+ };
+ /**
+ *
+ */
+ InitClass.prototype.setup = function () {};
+ /**
+ *
+ */
+ InitClass.prototype.info = function (property, value) {
+ if (value !== undefined) {
+ this[property] = value;
+ return;
+ }
+ if (property in this) {
+ return this[property];
+ }
+ return;
+ };
+ /**
+ *
+ */
+ InitClass.prototype.build = function (options) {
+ return this.$editor;
+ };
+ /**
+ *
+ */
+ InitClass.prototype.addItem = function (item) {
+ this.items.push(item);
+ };
+ /**
+ *
+ */
+ InitClass.prototype.getItem = function (index) {
+ var i;
+ for (i = 0; i < this.items.length; i++) {
+ for (property in this.items[i]) {
+ if ('machine_name' in this.items[i] && this.items[i]['machine_name'] === index) {
+ return this.items[i];
+ }
+ }
+ }
+ this.log('[RLD | ' + plugin + '] Item not found in this set.', 'info');
+ return null;
+ };
+ /**
+ *
+ */
+ InitClass.prototype.snapshot = function (index) {
+ var snapshot = {};
+ var prop;
+ for (prop in this) {
+ if (this.hasOwnProperty(prop)) {
+ snapshot[prop] = this[prop];
+ }
+ }
+ return snapshot;
+ };
+ /**
+ *
+ */
+ InitClass.prototype.topic = function(id) {
+ var callbacks;
+ var topic = id && this.topics[id];
+ if (!topic) {
+ callbacks = jQuery.Callbacks('unique');
+ topic = {
+ publish: function () {
+ // Create a jQuery Event for consistency and shift it into the arguments.
+ if (!(arguments.length > 0 && typeof arguments[0] === 'object' && '__marker' in arguments[0] && arguments[0].__marker === 'jQueryEvent')) {
+ var e = $.Event(id);
+ // Unshift in the original target for reference if this event bubbles.
+ e.type = id;
+ Array.prototype.unshift.call(arguments, e);
+ }
+ callbacks.fireWith(this, arguments);
+ },
+ subscribe: callbacks.add,
+ unsubscribe: callbacks.remove
+ };
+ if (id) {
+ this.topics[id] = topic;
+ }
+ }
+ return topic;
+ };
+ /**
+ *
+ */
+ InitClass.prototype.transferSubscriptions = function (subscribers) {
+ var subs = subscribers;
+ var topics = this.topics;
+ var i, k, top, id, sub;
+ if (!('length' in subscribers && subscribers.length > 0)) {
+ subs = [subscribers];
+ }
+ for (i = 0; i < subs.length; i++) {
+ sub = subs[i];
+ if ('topic' in sub) {
+ for (top in topics) {
+ if (topics.hasOwnProperty(top)) {
+ sub.topic(top).subscribe(this.topic(top).publish);
+ }
+ }
+ }
+ }
+ };
+
+ return InitClass;
+ }());
+
+ /**
+ * The ResponsiveLayoutDesigner is a facade for a set of sub-systems that manage
+ * the configuration of a responsive layout through a browser.
+ */
+ function ResponsiveLayoutDesigner() {
+ var options = {};
+ var plugin = 'ResponsiveLayoutDesigner';
+ this.steps = {};
+ this.regions = {};
+ this.grids = {};
+ // Initialize the object.
+ this.init.apply(this, arguments);
+ }
+ /**
+ * Extend the RLD with the InitClass.
+ */
+ ResponsiveLayoutDesigner.prototype = new InitClass();
+ /**
+ * Provide the InitClass for all other Classes to extend.
+ */
+ ResponsiveLayoutDesigner.InitClass = InitClass;
+ /**
+ * Implement the init() interface.
+ */
+ ResponsiveLayoutDesigner.prototype.setup = function () {
+ // Merge in user options.
+ var regionList, availableRegionList, stepList, gridList;
+ // Create the application root node.
+ this.$editor = $('', {
+ 'class': 'rld-application'
+ });
+ // Instansiate the LayoutManager.
+ // this.regions is a simple object. The RegionList provides methods to
+ // manipulate this simple set.
+ regionList = new RLD.RegionList();
+ availableRegionList = new RLD.RegionList();
+ if ('regions' in this) {
+ if ('active' in this.regions) {
+ regionList.addItem(this.regions.active);
+ }
+ if ('available' in this.regions) {
+ availableRegionList.addItem(this.regions.available);
+ }
+ delete this.regions;
+ }
+ else {
+ this.log('[RLD | ' + plugin + '] No regions provided.');
+ }
+ if ('steps' in this) {
+ stepList = new RLD.StepList({
+ 'steps': this.steps
+ });
+ delete this.steps;
+ }
+ else {
+ this.log('[RLD | ' + plugin + '] No steps provided.');
+ }
+ if ('grids' in this) {
+ gridList = new RLD.GridList({
+ 'grids': this.grids
+ });
+ delete this.grids;
+ }
+ else {
+ this.log('[RLD | ' + plugin + '] No grids provided.');
+ }
+ // Create a layout manager.
+ this.layoutManager = new RLD.LayoutManager({
+ 'stepList': stepList,
+ 'regionList': regionList,
+ 'availableRegionList': availableRegionList,
+ 'gridList': gridList
+ });
+ // Create a layoutPreviewer.
+ this.layoutPreviewer = new RLD.LayoutPreviewer({
+ 'stepList': stepList,
+ 'gridList': gridList
+ });
+ // Define topics that will pass-through.
+ this.topic('stepActivated');
+ this.transferSubscriptions(this.layoutPreviewer);
+ this.topic('regionOrderUpdated');
+ this.topic('layoutSaved');
+ this.topic('regionAdded');
+ this.topic('regionRemoved');
+ this.topic('regionResized');
+ this.topic('regionResizing');
+ this.topic('regionResizeStarted');
+ // Transfer pass-through subscriptions.
+ this.transferSubscriptions(this.layoutManager);
+ };
+ /**
+ * Generate a view of the class instance.
+ *
+ * Returns a DOM fragment.
+ */
+ ResponsiveLayoutDesigner.prototype.build = function () {
+ // Build the layoutManager and attach it to the $editor.
+ this.layoutManager.build().appendTo(this.$editor);
+ // Activate the first step.
+ var firstStep = this.layoutManager.stepList.info('items')[0];
+ var simpleClick = $.Event('click');
+ simpleClick.data = {'manager': this.layoutManager.stepManager};
+ this.layoutManager.stepManager.activateStep.call(this.layoutManager.stepManager.info('$editor').find('a:first').get(0), simpleClick);
+ return this.$editor;
+ };
+
+ ResponsiveLayoutDesigner.prototype.snapshot = function () {
+ return this.layoutManager;
+ };
+
+ return ResponsiveLayoutDesigner;
+
+ }());
+
+ // Expose ResponsiveLayoutDesigner to the global object
+ return (window.ResponsiveLayoutDesigner = RLD);
+}(window, jQuery));
+/**
+ * supplantClass() jQuery plugin
+ *
+ * Adds the replacement class string to each element.
+ *
+ * If a class or classes contain the needle, they are removed from the element.
+ */
+(function ($) {
+ // Add the plugin as a property of the jQuery fn object.
+ $.fn['supplantClass'] = function (needle, replacement) {
+ return this.each(function (index, element) {
+ var $this = $(this);
+ var cl = [];
+ // Get an array of classes the excludes any that contain the needle.
+ var classes = ($this.attr('class') || '').split(' ');
+ for (var i = 0; i < classes.length; i++) {
+ if (classes[i].indexOf(needle) === -1) {
+ cl.push(classes[i]);
+ }
+ }
+ // Push the replacement in all cases.
+ $.merge(cl, replacement.split(' '));
+ // Create a string and assign it to the object.
+ $this.removeAttr('class').addClass(cl.join(' '));
+ });
+ };
+}(jQuery));
diff --git a/core/modules/rlayout/designer/assets/css/application.css b/core/modules/rlayout/designer/assets/css/application.css
new file mode 100644
index 0000000..d821310
--- /dev/null
+++ b/core/modules/rlayout/designer/assets/css/application.css
@@ -0,0 +1,311 @@
+/* @group This styling needs to be removed eventually. It's presentation and it doesn't belong here. */
+.rld-steps a {
+ font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
+}
+/* @end */
+.clearfix::after {
+ clear: both;
+ content: ' ';
+ display: block;
+ height: 0;
+ visibility: hidden;
+ width: 100%;
+}
+.rld-screen {
+ margin: 0 auto;
+ max-width: 1024px;
+ text-align: center;
+}
+.rld-iframe {
+ margin: 0 auto;
+}
+
+/* @group Layout */
+
+/* @group StepManager */
+.rld-layout-manager,
+.rld-layout-previewer {
+ text-align: center;
+}
+.rld-layout-manager .rld-stepmanager,
+.rld-layout-previewer .rld-stepmanager {
+ margin: 0 auto;
+}
+.rld-steps {
+ list-style: none;
+ margin: 0;
+ padding: 0;
+}
+.rld-steps .rld-tab {
+ display: inline-block;
+ margin-left: 1em;
+ margin-right: 1em;
+ position: relative;
+ vertical-align: middle;
+}
+.rld-steps .rld-tab::before,
+.rld-steps .rld-tab::after {
+ background-attachment: scroll;
+ background-color: transparent;
+ background-repeat: no-repeat;
+ content: ' ';
+ display: block;
+ position: absolute;
+}
+.rld-steps .rld-tab::before {
+ background-color: #7d7d7d;
+ height: 1px;
+ left: -22px;
+ top: 1.2em;
+ width: 20px;
+}
+.rld-steps .rld-tab:first-child::before {
+ background-color: transparent;
+ background-image: url("../images/small-screen.png");
+ background-position: left center;
+ height: 22px;
+ left: -28px;
+ top: 6px;
+ width: 25px;
+}
+.rld-steps .rld-tab:last-child::after {
+ background-image: url("../images/large-screen.png");
+ background-position: right center;
+ height: 22px;
+ right: -39px;
+ top: 6px;
+ width: 35px;
+}
+.rld-steps .rld-tab .rld-link {
+ -moz-border-radius: 4px;
+ -webkit-border-radius: 4px;
+ border-radius: 4px;
+ display: inline-block;
+ line-height: 1.8em;
+ padding: 5px;
+}
+.rld-layout-previewer .rld-tab .rld-link {
+ color: #ccc;
+}
+.rld-layout-manager .rld-tab .rld-link {
+ color: #484848;
+}
+.rld-link.rld-active::after {
+ border-style: solid;
+ border-width: 6px 4px;
+ bottom: 2px;
+ content: ' ';
+ display: block;
+ height: 0px;
+ left: 40%;
+ position: absolute;
+ width: 0px;
+}
+.rld-layout-previewer .rld-link.rld-active::after {
+ border-color: transparent transparent #ccc transparent;
+}
+.rld-layout-manager .rld-link.rld-active::after {
+ border-color: transparent transparent #484848 transparent;
+}
+.rld-layouts {
+ margin-top: 0.5em;
+ padding: 1em;
+}
+
+/* @end */
+
+/* @end */
+
+/* @group Region and row styles */
+
+.rld-layouts {
+ position: relative;
+}
+.rld-layout {
+ position: relative;
+}
+.rld-row {
+ -webkit-user-select: none;
+ cursor: move;
+}
+.rld-placeholder,
+.rld-region {
+ -moz-box-sizing: border-box;
+ -webkit-box-sizing: border-box;
+ box-sizing: border-box;
+ float: left;
+ margin-bottom: 15px;
+ position: relative;
+}
+.rld-region {
+ width: 100%; /* splitter def: 960px */
+}
+.rld-region > .rld-inner {
+ background-color: #555;
+ -moz-border-radius: 5px;
+ -webkit-border-radius: 5px;
+ border-radius: 5px;
+ color: white;
+ height: 4em;
+ margin: 0 2px;
+ padding: 0 1em;
+}
+.rld-placeholder {
+ background-color: white;
+ background-color: rgba(255,255,255,0.6667);
+ color: #ccc;
+ height: 4em;
+ outline: 1px dashed #31cbff;
+ outline-offset: -5px;
+ overflow: hidden;
+ width: 0;
+}
+.rld-region .rld-region-close {
+ position: absolute;
+ right: 14px;
+ top: 7px;
+ background-color: #cdcdcd;
+ border-radius: 10px;
+ color: #484848;
+ padding: 4px;
+ cursor: default;
+ font-size: 0.8em;
+ line-height: 0.8em;
+ text-decoration: none;
+}
+.rld-col.rld-region {
+ padding: 0;
+}
+.rld-grid-underlay {
+ bottom: 24px;
+ height: auto;
+ margin: 0.25em 0;
+ min-height: 20px;
+ position: absolute;
+ top: 24px;
+ width: 100%;
+}
+.rld-grid-underlay + * {
+ margin-top: 24px;
+}
+.rld-grid-col {
+ background-color: #E0E3E8;
+ border-color: white;
+ border-style: solid;
+ border-width: 0 2px;
+ height: 100%;
+ min-height: 1em;
+ outline: 1px solid #B8B8B8;
+ outline-offset: -3px;
+}
+.rld-layoutstep-controls {
+ margin-bottom: 5px;
+}
+.rld-splitter {
+ background-attachment: scroll;
+ background-image: url('../images/grippie.png');
+ background-position: center center;
+ background-repeat: no-repeat;
+ bottom: 0;
+ cursor: e-resize; /* in case col-resize isn't supported */
+ cursor: col-resize;
+ height: 100%;
+ position: absolute;
+ top: 0;
+ width: 12px;
+ z-index: 1;
+}
+.rld-splitter:hover {
+ background-color: rgba(0, 0, 0, 0.3333);
+}
+.rld-splitter-left {
+ background-position: left center;
+ left: 3px;
+ -moz-border-radius: 5px 0 0 5px;
+ -webkit-border-radius: 5px 0 0 5px;
+ border-radius: 5px 0 0 5px;
+}
+.rld-splitter-right {
+ background-position: right center;
+ right: 3px;
+ -moz-border-radius: 0 5px 5px 0;
+ -webkit-border-radius: 0 5px 5px 0;
+ border-radius: 0 5px 5px 0;
+}
+.rld-splitter-active {
+ background: url('../images/grippie-active.png') 0 -3px;
+}
+
+/* @end */
+
+/* @grid */
+
+/* @group Sortable */
+
+.ui-sortable .ui-state-highlight {
+ height: 50px;
+ padding: 10px;
+ margin: 1em 0;
+}
+.ui-sortable .region .drag-icon {
+ font-size: 2em;
+ margin-right: 1em;
+}
+.ui-sortable .region .remove-icon {
+ position: absolute;
+ right: 5px;
+ top: 20px;
+ background-color: #cdcdcd;
+ border-radius: 10px;
+ color: #484848;
+ padding: 4px;
+ cursor: default;
+}
+
+/* @end */
+
+/* @end */
+
+/* @group Previewer */
+
+.rld-previewer {
+ border: 1px solid #484848;
+ position: absolute;
+ top: 100px;
+}
+@media (max-width:600px) {
+ .rld-layout-previewer {
+ display: none;
+ }
+}
+.rld-modal-screen {
+ background-color: white;
+ bottom: 0;
+ height: 100%;
+ opacity: 0.9;
+ position: absolute;
+ top: 0;
+ width: 100%;
+}
+.rld-modal-close {
+ position: absolute;
+ margin-top: 5px;
+ right: 10px;
+}
+.rld-modal-close a {
+ background-color: #59a;
+ border: 1px solid #3F3F3F;
+ border-radius: 7px;
+ box-sizing: border-box;
+ color: white;
+ display: inline-block;
+ letter-spacing: 1.5pt;
+ padding: 0.08333em 0.3333em;
+}
+.rld-modal-close a:hover {
+ background-color: #666666;
+ color: white;
+ text-decoration: none;
+}
+
+/* @end */
\ No newline at end of file
diff --git a/core/modules/rlayout/designer/assets/css/grid.css b/core/modules/rlayout/designer/assets/css/grid.css
new file mode 100644
index 0000000..18c93b2
--- /dev/null
+++ b/core/modules/rlayout/designer/assets/css/grid.css
@@ -0,0 +1,117 @@
+/* Generic column setup */
+.rld-col {
+ -webkit-box-sizing:border-box;
+ -moz-box-sizing:border-box;
+ box-sizing:border-box;
+ float:left;
+}
+
+
+
+/* 1. 3 Column Grid 0px - 349px
+----------------------------------------------------------------------------- */
+
+.rld-container-3 .rld-span_1 {
+ width:33.3333333333%;
+}
+.rld-container-3 .rld-span_2 {
+ width:66.6666666667%;
+}
+.rld-container-3 .rld-span_3 {
+ width:100%;
+}
+
+/* 2. 6 Column Grid 350px - 759px
+----------------------------------------------------------------------------- */
+
+.rld-container-6 .rld-span_1 {
+ width:16.6666666667%;
+}
+.rld-container-6 .rld-span_2 {
+ width:33.3333333333%;
+}
+.rld-container-6 .rld-span_3 {
+ width:50%;
+}
+.rld-container-6 .rld-span_4 {
+ width:66.6666666667%;
+}
+.rld-container-6 .rld-span_5 {
+ width:83.3333333333%;
+}
+.rld-container-6 .rld-span_6 {
+ width:100%;
+}
+
+/* 3. 10 Column Grid 760px - 959px
+----------------------------------------------------------------------------- */
+.rld-container-10 .rld-span_1 {
+ width:10%;
+}
+.rld-container-10 .rld-span_2 {
+ width:20%;
+}
+.rld-container-10 .rld-span_3 {
+ width:30%;
+}
+.rld-container-10 .rld-span_4 {
+ width:40%;
+}
+.rld-container-10 .rld-span_5 {
+ width:50%;
+}
+.rld-container-10 .rld-span_6 {
+ width:60%;
+}
+.rld-container-10 .rld-span_7 {
+ width:70%;
+}
+.rld-container-10 .rld-span_8 {
+ width:80%;
+}
+.rld-container-10 .rld-span_9 {
+ width:90%;
+}
+.rld-container-10 .rld-span_10 {
+ width:100%;
+}
+
+/* 4. 12 Column Grid 960px - Infinity
+----------------------------------------------------------------------------- */
+
+.rld-container-12 .rld-span_1 {
+ width:8.3333333333%;
+}
+.rld-container-12 .rld-span_2 {
+ width:16.6666666667%;
+}
+.rld-container-12 .rld-span_3 {
+ width:25%;
+}
+.rld-container-12 .rld-span_4 {
+ width:33.3333333333%;
+}
+.rld-container-12 .rld-span_5 {
+ width:41.6666666667%;
+}
+.rld-container-12 .rld-span_6 {
+ width:50%;
+}
+.rld-container-12 .rld-span_7 {
+ width:58.3333333333%;
+}
+.rld-container-12 .rld-span_8 {
+ width:66.6666666667%;
+}
+.rld-container-12 .rld-span_9 {
+ width:75%;
+}
+.rld-container-12 .rld-span_10 {
+ width:83.3333333333%;
+}
+.rld-container-12 .rld-span_11 {
+ width:91.6666666667%;
+}
+.rld-container-12 .rld-span_12 {
+ width:100%;
+}
\ No newline at end of file
diff --git a/core/modules/rlayout/designer/assets/images/grippie-active.png b/core/modules/rlayout/designer/assets/images/grippie-active.png
new file mode 100644
index 0000000..5f5e75d
--- /dev/null
+++ b/core/modules/rlayout/designer/assets/images/grippie-active.png
@@ -0,0 +1,14 @@
+PNG
+
+
IHDR = eF% pHYs ~
+OiCCPPhotoshop ICC profile xڝSgTS=BKKoR RB&*! J!QEEȠQ,
+!{kּ>H3Q5B.@
+$p d!s# ~<<+" x M0B\t8K @zB @F&S