Improved redactor integration, inherits WCF style and appearances
authorAlexander Ebert <ebert@woltlab.com>
Sun, 6 Jul 2014 15:06:59 +0000 (17:06 +0200)
committerAlexander Ebert <ebert@woltlab.com>
Sun, 6 Jul 2014 15:06:59 +0000 (17:06 +0200)
com.woltlab.wcf/templates/wysiwyg.tpl
wcfsetup/install/files/js/3rdParty/redactor/plugins/wbbcode.js
wcfsetup/install/files/js/3rdParty/redactor/plugins/wfontcolor.js
wcfsetup/install/files/js/3rdParty/redactor/plugins/wfontfamily.js
wcfsetup/install/files/js/3rdParty/redactor/plugins/wfontsize.js
wcfsetup/install/files/js/3rdParty/redactor/plugins/wmonkeypatch.js
wcfsetup/install/files/style/message.less
wcfsetup/install/files/style/redactor.less [new file with mode: 0644]

index a109ef820251042eb3f6a853c12ca4418eb14671..648c0ce74838d08eedced49d26222e3add3d9773 100644 (file)
@@ -1,5 +1,5 @@
 {if !$wysiwygEnableUpload|isset}{assign var=wysiwygEnableUpload value=false}{/if}
-<link rel="stylesheet" type="text/css" href="{@$__wcf->getPath()}js/3rdParty/redactor/redactor.css" />
+{*<link rel="stylesheet" type="text/css" href="{@$__wcf->getPath()}js/3rdParty/redactor/redactor.css" />*}
 <script data-relocate="true">
 var __REDACTOR_ICON_PATH = '{@$__wcf->getPath()}icon/';
 var __REDACTOR_BUTTONS = [ {implode from=$__wcf->getBBCodeHandler()->getButtonBBCodes() item=__bbcode}{ icon: '{$__bbcode->wysiwygIcon}', label: '{$__bbcode->buttonLabel|language}', name: '{$__bbcode->bbcodeTag}' }{/implode} ];
index bfdf05cfe8fc7278d6114d1169eb3d9f28e7cfbf..20ee49384d28f9d50e34903b397d6263a4e4a82f 100644 (file)
@@ -41,6 +41,49 @@ RedactorPlugins.wbbcode = {
                        this._saveTextToStorage();
                        delete this.opts.wAutosaveOnce;
                }
+               
+               // we do not support table heads
+               var $tableButton = this.buttonGet('table');
+               if ($tableButton.length) {
+                       var $addHead = $tableButton.data('dropdown').children('a.redactor_dropdown_add_head');
+                       
+                       // drop divider
+                       $addHead.prev().remove();
+                       
+                       // drop 'delete head'
+                       $addHead.next().remove();
+                       
+                       // drop 'add head'
+                       $addHead.remove();
+                       
+                       // toggle dropdown options
+                       $tableButton.click($.proxy(this._tableButtonClick, this));
+               }
+       },
+       
+       /**
+        * Toggles features within the table dropdown.
+        * 
+        * @param       object          event
+        */
+       _tableButtonClick: function(event) {
+               var $button = $(event.currentTarget);
+               if (!$button.hasClass('dropact')) {
+                       return;
+               }
+               
+               var $current = this.getBlock() || this.getCurrent();
+               var $dropdown = $button.data('dropdown');
+               
+               // within table
+               $dropdown.children('li').show();
+               var $insertTable = $dropdown.find('> li > .redactor_dropdown_insert_table').parent();
+               if ($current.tagName == 'TD') {
+                       $insertTable.hide().next().hide();
+               }
+               else {
+                       $insertTable.nextAll().hide();
+               }
        },
        
        /**
@@ -334,7 +377,7 @@ RedactorPlugins.wbbcode = {
                html = html.replace(/<td style="text-align: ?(left|center|right|justify);? ?">([\s\S]*?)<\/td>/gi, "[td][align=$1]$2[/align][/td]");
                
                // [td]
-               html = html.replace(/(\t)*<td>/gi, '[td]');
+               html = html.replace(/(\t)*<td>(\t)*/gi, '[td]');
                html = html.replace(/(\t)*<\/td>/gi, '[/td]\n');
                
                // cache redactor's selection markers
@@ -503,7 +546,13 @@ RedactorPlugins.wbbcode = {
                
                // trim whitespaces within <td>
                data = data.replace(/<td>([\S\s]*?)<\/td>/gi, function(match, p1) {
-                       return '<td>' + $.trim(p1) + '</td>';
+                       var $tdContent = $.trim(p1);
+                       if (!$tdContent.length) {
+                               // unicode zero-width space
+                               $tdContent = '&#8203;';
+                       }
+                       
+                       return '<td>' + $tdContent + '</td>';
                });
                
                // smileys
index 7598404c4a34ff56fc7db98d602195f87f526a38..c54efce60e4c9dd158e53fd369c97f2c9456684d 100644 (file)
@@ -21,10 +21,10 @@ RedactorPlugins.wfontcolor = {
        },
        
        /**
-        * Creates the color dropdown.
+        * Creates the font color dropdown.
         */
        _createFontColorDropdown: function() {
-               var $dropdown = $('<div class="redactor_dropdown redactor_dropdown_box_fontcolor" style="display: none;">');
+               var $dropdown = $('<div class="redactor_dropdown redactor_dropdown_box_fontcolor dropdownMenu" style="display: none;">');
                var $colors = [
                        '#000000', '#800000', '#8B4513', '#2F4F4F', '#008080', '#000080', '#4B0082', '#696969',
                        '#B22222', '#A52A2A', '#DAA520', '#006400', '#40E0D0', '#0000CD', '#800080', '#808080',
@@ -33,18 +33,23 @@ RedactorPlugins.wfontcolor = {
                        '#FFF0F5', '#FAEBD7', '#FFFFE0', '#F0FFF0', '#F0FFFF', '#F0F8FF', '#E6E6FA', '#FFFFFF'
                ];
                
+               var $container = $('<li class="redactorColorPallet" />');
                for (var $i = 0, $length = $colors.length; $i < $length; $i++) {
                        var $color = $colors[$i];
                        
                        var $swatch = $('<a href="#" />').data('color', $color).css('background-color', $color);
-                       $dropdown.append($swatch);
+                       $container.append($swatch);
                        $swatch.click($.proxy(this._onColorPick, this));
                }
                
                var $elNone = $('<a href="#" />').html(this.opts.curLang.none).data('color', 'none');
                $elNone.click($.proxy(this._onColorPick, this));
                
+               $dropdown.append($container);
+               $dropdown.append($('<li class="dropdownDivider" />'));
                $dropdown.append($elNone);
+               $elNone.wrap('<li />');
+               
                $(this.$toolbar).append($dropdown);
                
                return $dropdown;
index 88a1e1cc7583e01f027578a12731da6aec4bec02..00d4976183e60eeaa2533408d1d2cdfea7396bbd 100644 (file)
@@ -8,7 +8,23 @@ if (!RedactorPlugins) var RedactorPlugins = {};
  * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
  */
 RedactorPlugins.wfontfamily = {
+       /**
+        * Initializes the RedactorPlugins.wfontsize plugin.
+        */
        init: function () {
+               var $dropdown = this._createFontFamilyDropdown();
+               
+               this.buttonReplace('fontfamily', 'wfontfamily', this.opts.curLang.fontfamily, $.proxy(function(btnName, $button, btnObject, e) {
+                       this.dropdownShow(e, btnName);
+               }, this));
+               this.buttonGet('wfontfamily').addClass('re-fontfamily').data('dropdown', $dropdown);
+       },
+       
+       /**
+        * Creates the font family dropdown.
+        */
+       _createFontFamilyDropdown: function() {
+               var $dropdown = $('<div class="redactor_dropdown redactor_dropdown_box_wfontfamily dropdownMenu" style="display: none;">');
                var $fonts = {
                        'Arial': "Arial, Helvetica, sans-serif",
                        'Comic Sans MS': "Comic Sans MS, cursive",
@@ -20,38 +36,27 @@ RedactorPlugins.wfontfamily = {
                        'Trebuchet MS': "Trebuchet MS, Helvetica, sans-serif",
                        'Verdana': "Verdana, Geneva, sans-serif"
                };
-               
-               var $dropdown = { };
-               var $i = 0;
                var self = this;
-               $.each($fonts, function(title, value) {
-                       $dropdown['fontFamily' + $i] = {
-                               title: title,
-                               className: 'wfontfamily-' + $i,
-                               callback: function() {
-                                       self.inlineSetStyle('font-family', value);
-                               }
-                       };
+               $.each($fonts, function(title, fontFamily) {
+                       var $listItem = $('<li><a href="#">' + title + '</a></li>').appendTo($dropdown);
+                       var $item = $listItem.children('a').data('fontFamily', fontFamily).css('font-family', fontFamily);
+                       $item.click(function() {
+                               event.preventDefault();
+                               
+                               self.inlineSetStyle('font-family', $(this).data('fontFamily'));
+                       });
+               });
+               
+               $('<li class="dropdownDivider" />').appendTo($dropdown);
+               var $listItem = $('<li><a href="#">None</a></li>').appendTo($dropdown);
+               $listItem.children('a').click(function() {
+                       event.preventDefault();
                        
-                       $i++;
+                       self.inlineRemoveStyle('font-family');
                });
-               $dropdown['separator'] = { name: 'separator' };
-               $dropdown['remove'] = {
-                       title: 'remove font',
-                       callback: function() {
-                               this.inlineRemoveStyle('font-family');
-                       }
-               };
                
-               this.buttonReplace('fontfamily', 'wfontfamily', 'Change font family', false, $dropdown);
-               this.buttonGet('wfontfamily').addClass('re-fontfamily');
+               $(this.$toolbar).append($dropdown);
                
-               // modify dropdown to reflect each font family
-               $dropdown = this.$toolbar.find('.redactor_dropdown_box_wfontfamily');
-               $i = 0;
-               $.each($fonts, function(title, value) {
-                       $dropdown.children('.wfontfamily-' + $i).removeClass('wfontfamily-' + $i).css('font-family', value);
-                       $i++;
-               });
+               return $dropdown;
        }
 };
\ No newline at end of file
index a8144b3e6730c85fd6e9f393e182eb349d4ba21f..a17338d57de41efb76fab7aeb7fbcb251458966b 100644 (file)
@@ -8,44 +8,50 @@ if (!RedactorPlugins) var RedactorPlugins = {};
  * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
  */
 RedactorPlugins.wfontsize = {
+       /**
+        * Initializes the RedactorPlugins.wfontsize plugin.
+        */
        init: function () {
-               var $fontSizes = [ 8, 10, 12, 14, 18, 24, 36 ];
+               var $dropdown = this._createFontSizeDropdown();
                
-               var $dropdown = { };
+               this.buttonReplace('fontsize', 'wfontsize', this.opts.curLang.fontsize, $.proxy(function(btnName, $button, btnObject, e) {
+                       this.dropdownShow(e, btnName);
+               }, this));
+               this.buttonGet('wfontsize').addClass('re-fontsize').data('dropdown', $dropdown);
+       },
+       
+       /**
+        * Creates the font size dropdown.
+        */
+       _createFontSizeDropdown: function() {
+               var $dropdown = $('<div class="redactor_dropdown redactor_dropdown_box_wfontsize dropdownMenu" style="display: none;">');
+               var $fontSizes = [ 8, 10, 12, 14, 18, 24, 36 ];
                var self = this;
-               for (var $i = 0, $length = $fontSizes.length; $i < $length; $i++) {
+               for (var $i = 0; $i < $fontSizes.length; $i++) {
                        var $fontSize = $fontSizes[$i];
+                       var $listItem = $('<li><a href="#">' + $fontSize + '</a></li>').appendTo($dropdown);
+                       var $item = $listItem.children('a').data('fontSize', $fontSize).css('font-size', $fontSize + 'pt');
+                       if ($fontSize > 18) {
+                               $item.css('line-height', '1em');
+                       }
                        
-                       $dropdown['fontSize' + $i] = {
-                               title: $fontSize,
-                               className: 'wfontsize-' + $fontSize,
-                               fontSize: $fontSize,
-                               callback: function(name, button, object, event) {
-                                       self.inlineSetStyle('font-size', object.fontSize + 'pt');
-                               }
-                       };
+                       $item.click(function() {
+                               event.preventDefault();
+                               
+                               self.inlineSetStyle('font-size', $(this).data('fontSize') + 'pt');
+                       });
                }
                
-               $dropdown['separator'] = { name: 'separator' };
-               $dropdown['remove'] = {
-                       title: 'remove font size',
-                       callback: function() {
-                               this.inlineRemoveStyle('font-size');
-                       }
-               };
+               $('<li class="dropdownDivider" />').appendTo($dropdown);
+               var $listItem = $('<li><a href="#">None</a></li>').appendTo($dropdown);
+               $listItem.children('a').click(function() {
+                       event.preventDefault();
+                       
+                       self.inlineRemoveStyle('font-size');
+               });
                
-               this.buttonReplace('fontsize', 'wfontsize', 'Change font size', false, $dropdown);
-               this.buttonGet('wfontsize').addClass('re-fontsize');
+               $(this.$toolbar).append($dropdown);
                
-               // modify dropdown to reflect each font family
-               $dropdown = this.$toolbar.find('.redactor_dropdown_box_wfontsize');
-               for (var $i = 0, $length = $fontSizes.length; $i < $length; $i++) {
-                       var $fontSize = $fontSizes[$i];
-                       
-                       var $listItem = $dropdown.children('a.wfontsize-' + $fontSize).removeClass('wfontsize-' + $fontSizes).css('font-size', $fontSize + 'pt');
-                       if ($fontSize > 18) {
-                               $listItem.css('line-height', '1em');
-                       }
-               }
+               return $dropdown;
        }
 };
index a5e406f3a014be4c8932a5457acceb02a9165513..5ae8ce6016d9803b18154c346704e7091bd11ed2 100644 (file)
@@ -78,6 +78,7 @@ RedactorPlugins.wmonkeypatch = {
                this.$toolbar.find('a.re-indent, a.re-outdent').addClass('redactor_button_disabled');
                
                this.setOption('modalOpenedCallback', $.proxy(this.modalOpenedCallback, this));
+               this.setOption('dropdownShowCallback', $.proxy(this.dropdownShowCallback, this));
                
                this.modalTemplatesInit();
        },
@@ -256,82 +257,6 @@ RedactorPlugins.wmonkeypatch = {
                this.$modal.children('.dialogContent').removeClass('dialogForm');
        },
        
-       tableInsert: function()
-       {
-               this.bufferSet(false);
-
-               var rows = $('#redactor_table_rows').val(),
-                       columns = $('#redactor_table_columns').val(),
-                       $table_box = $('<div></div>'),
-                       tableId = Math.floor(Math.random() * 99999),
-                       $table = $('<table id="table' + tableId + '"><tbody></tbody></table>'),
-                       i, $row, z, $column;
-
-               for (i = 0; i < rows; i++)
-               {
-                       $row = $('<tr></tr>');
-
-                       for (z = 0; z < columns; z++)
-                       {
-                               $column = $('<td>' + this.opts.invisibleSpace + '</td>');
-
-                               // set the focus to the first td
-                               if (i === 0 && z === 0)
-                               {
-                                       $column.append('<span id="selection-marker-1">' + this.opts.invisibleSpace + '</span>');
-                               }
-
-                               $($row).append($column);
-                       }
-
-                       $table.append($row);
-               }
-
-               $table_box.append($table);
-               var html = $table_box.html();
-
-               if (this.opts.linebreaks === false && this.browser('mozilla'))
-               {
-                       html += '<p>' + this.opts.invisibleSpace + '</p>';
-               }
-
-               this.modalClose();
-               this.selectionRestore();
-
-               var current = this.getBlock() || this.getCurrent();
-
-               if (current && current.tagName != 'BODY')
-               {
-                       // WoltLab fix for nested tables
-                       if (current.tagName == 'TD') {
-                               $(current).append(html);
-                       }
-                       else {
-                               if (current.tagName == 'LI')
-                               {
-                                       var current = $(current).closest('ul, ol');
-                               }
-       
-                               $(current).after(html);
-                       }
-                       // WoltLab fix for nested tables
-               }
-               else
-               {
-                       this.insertHtmlAdvanced(html, false);
-               }
-
-               this.selectionRestore();
-
-               var table = this.$editor.find('#table' + tableId);
-               this.buttonActiveObserver();
-
-               table.find('span#selection-marker-1, inline#selection-marker-1').remove();
-               table.removeAttr('id');
-
-               this.sync();
-       },
-       
        modalOpenedCallback: function() {
                // handle positioning of form submit controls
                var $heightDifference = 0;
@@ -352,6 +277,14 @@ RedactorPlugins.wmonkeypatch = {
                });
        },
        
+       dropdownShowCallback: function(data) {
+               if (!data.dropdown.hasClass('dropdownMenu')) {
+                       data.dropdown.addClass('dropdownMenu');
+                       data.dropdown.children('.redactor_separator_drop').replaceWith('<li class="dropdownDivider" />');
+                       data.dropdown.children('a').wrap('<li />');
+               }
+       },
+       
        /**
         * Overwrites $.Redactor.inlineEachNodes(), the original method compares "selectionHtml"
         * and "parentHtml" to check if the callback should be invoked. In some cases the "parentHtml"
index 640ba898926d3689489e0df04d99706edb19d306..081a7f8a8e6ad90fbfece58dfe42833e4e0bb0ae 100644 (file)
@@ -946,166 +946,6 @@ li:nth-child(2n+1) .message {
        }
 }
 
-/* redactor fixes */
-.redactor_editor {
-       padding: 10px !important;
-       
-       & + textarea {
-               background-color: rgba(255, 255, 255, 1) !important;
-               border: 1px solid rgba(238, 238, 238, 1) !important;
-               color: @wcfColor !important;
-               padding: 10px !important;
-               z-index: 1 !important;
-       }
-       
-       ul,
-       ol {
-               .nativeList;
-       }
-       
-       ul {
-               list-style-type: disc;
-       }
-       
-       ol {
-               list-style-type: decimal;
-       }
-}
-
-.redactor_toolbar {
-       background-color: @wcfButtonBackgroundColor !important;
-       
-       &:after {
-               display: inline !important;
-       }
-       
-       > li {
-               &:last-of-type,
-               &.separator {
-                       border-right: 1px solid @wcfButtonBorderColor;
-               }
-               
-               > a {
-                       background-color: @wcfButtonBackgroundColor;
-                       color: rgba(51, 51, 51, 1) !important;
-                       
-                       .textShadow(@wcfButtonBackgroundColor);
-                       
-                       &> i {
-                               height: 14px;
-                               width: 12px;
-                               
-                               &:before {
-                                       color: rgba(51, 51, 51, 1) !important;
-                               }
-                       }
-                       
-                       &:not(.redactor_button_disabled):hover {
-                               background-color: rgba(204, 204, 204, 1) !important;
-                               color: rgba(51, 51, 51, 1) !important;
-                               
-                               .textShadow(@wcfButtonHoverBackgroundColor);
-                               
-                               > i:before {
-                                       color: rgba(51, 51, 51, 1) !important;
-                               }
-                       }
-                       
-                       &.fa-redactor-btn:before {
-                               content: "";
-                       }
-               }
-       }
-}
-
-.redactorAttachmentContainer {
-       background-color: rgba(255, 255, 255, 1);
-       border: 1px solid rgba(238, 238, 238, 1);
-       border-top-width: 0;
-       padding: 7px 14px 7px;
-}
-
-.redactorMessageOptions {
-       border: 1px solid rgba(238, 238, 238, 1);
-       border-top-width: 0;
-       
-       > nav {
-               > ul {
-                       background-color: rgba(244, 244, 244, 1);
-                       
-                       > li {
-                               display: inline-block;
-                               
-                               > a {
-                                       border-right: 1px solid rgba(238, 238, 238, 1);
-                                       border-bottom: 1px solid transparent;
-                                       color: rgba(51, 51, 51, 1);
-                                       display: block;
-                                       margin-bottom: -1px;
-                                       padding: 7px 14px 8px 14px;
-                                       text-decoration: none;
-                                       
-                                       -webkit-touch-callout: none;
-                                       -webkit-user-select: none;
-                                       -khtml-user-select: none;
-                                       -moz-user-select: none;
-                                       -ms-user-select: none;
-                                       user-select: none;
-                                       
-                                       &:hover {
-                                               background-color: @wcfButtonBackgroundColor;
-                                       }
-                               }
-                               
-                               &.active {
-                                       > a {
-                                               background-color: rgba(255, 255, 255, 1);
-                                               
-                                               color: rgba(102, 102, 102, 1);
-                                               /*margin-bottom: -1px;
-                                               padding-bottom: 8px;*/
-                                       }
-                               }
-                       }
-               }
-       }
-       
-       > div {
-               background-color: rgba(255, 255, 255, 1);
-               border-top: 1px solid rgba(238, 238, 238, 1);
-               margin-top: -1px;
-               padding: 14px 7px;
-       }
-}
-
-.redactor_dropdown_box_wsmiley > ul > li:not(:last-child) {
-       margin-right: 3px !important;
-}
-
-.redactor_dropdown_box_fontcolor {
-       width: 192px !important;
-       
-       > a:not(:last-child) {
-               border: 2px solid rgba(255, 255, 255, 1);
-               float: left;
-               font-size: 0;
-               height: 20px;
-               padding: 0 !important;
-               margin: 0;
-               width: 20px;
-       }
-       
-       > a:last-child {
-               border: 2px solid rgba(255, 255, 255, 1);
-               border-bottom-width: 0;
-               clear: both;
-               display: block;
-               font-size: .85rem;
-               padding: 2px 4px;
-               text-align: center;
-       }
-}
-
 @media screen and (max-width: 800px), print {
        .message.messageSidebarOrientationLeft,
        .message.messageSidebarOrientationRight {
diff --git a/wcfsetup/install/files/style/redactor.less b/wcfsetup/install/files/style/redactor.less
new file mode 100644 (file)
index 0000000..4d7d225
--- /dev/null
@@ -0,0 +1,311 @@
+@font-face {
+       font-family: 'RedactorFont';
+       src: url(data:application/x-font-ttf;charset=utf-8;base64,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) format('truetype'), url(data:application/font-woff;charset=utf-8;base64,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) format('woff');
+       font-weight: normal;
+       font-style: normal;
+}
+.re-icon {
+       font-family: 'RedactorFont';
+       
+       > i:before {
+               position: relative;
+               font-size: 14px;
+       }
+}
+
+.re-video:before { content: "\e600"; }
+.re-unorderedlist:before { content: "\e601"; }
+.re-undo:before { content: "\e602"; }
+.re-underline:before { content: "\e603"; }
+.re-textdirection:before { content: "\e604"; }
+.re-fontcolor:before { content: "\e605"; }
+.re-table:before { content: "\e606"; }
+.re-redo:before { content: "\e607"; }
+.re-quote:before { content: "\e608"; }
+.re-outdent:before { content: "\e609"; }
+.re-orderedlist:before { content: "\e60a"; }
+.re-link:before { content: "\e60b"; }
+.re-horizontalrule:before { content: "\e60c"; }
+.re-italic:before { content: "\e60d"; }
+.re-indent:before { content: "\e60e"; }
+.re-image:before { content: "\e60f"; }
+.re-fullscreen:before { content: "\e610"; }
+.re-normalscreen:before { content: "\e611"; }
+.re-formatting:before { content: "\e612"; }
+.re-fontsize:before { content: "\e613"; }
+.re-fontfamily:before { content: "\e614"; }
+.re-deleted:before { content: "\e615"; }
+.re-html:before { content: "\e616"; }
+.re-clips:before { content: "\e617"; }
+.re-bold:before { content: "\e618"; }
+.re-backcolor:before { content: "\e619"; }
+.re-file:before { content: "\e61a"; }
+.re-alignright:before { content: "\e61b"; }
+.re-alignment:before, .re-alignleft:before { content: "\e61c"; }
+.re-alignjustify:before { content: "\e61d"; }
+.re-aligncenter:before { content: "\e61e"; }
+.re-gallery:before { content: "\e61f"; }
+
+/* redactor fixes */
+.redactor_box {
+       border: 1px solid @wcfContainerBorderColor;
+       font-size: 0;
+}
+
+.redactor_editor {
+       font-size: 1rem;
+       padding: 10px;
+       position: relative;
+       outline: none;
+       
+       & + textarea {
+               border-width: 0;
+               box-shadow: none;
+               font-size: 1rem;
+               outline: none;
+               padding: 10px;
+               
+               &:focus {
+                       box-shadow: none;
+               }
+       }
+       
+       ul,
+       ol {
+               .nativeList;
+       }
+       
+       ul {
+               list-style-type: disc;
+       }
+       
+       ol {
+               list-style-type: decimal;
+       }
+       
+       table {
+               border-collapse: collapse;
+               font-size: 14px;
+               line-height: 1.6em;
+               
+               td {
+                       border: 1px solid #ddd;
+                       padding: 5px;
+                       vertical-align: top;
+               }
+       }
+}
+
+.redactor_toolbar {
+       border-bottom: 1px solid @wcfContainerBorderColor;
+       
+       .linearGradient(@wcfContainerBackgroundColor, @wcfContainerBackgroundColor, @wcfContainerAccentBackgroundColor);
+       
+       > li {
+               display: inline-block;
+               
+               &:last-of-type,
+               &.separator {
+                       border-right: 1px solid @wcfContainerBorderColor;
+               }
+               
+               > a {
+                       color: @wcfButtonColor;
+                       display: block;
+                       font-size: 14px;
+                       outline: none;
+                       padding: 9px 10px;
+                       text-decoration: none;
+                       
+                       .textShadow(@wcfButtonBackgroundColor);
+                       
+                       &.redactor_button_disabled,
+                       &.redactor_button_disabled:before,
+                       &.redactor_button_disabled > i:before {
+                               color: @wcfButtonBackgroundColor;
+                               cursor: default;
+                       }
+                       
+                       &:before {
+                               color: @wcfColor;
+                       }
+                       
+                       > i {
+                               height: 14px;
+                               width: 12px;
+                               
+                               &:before {
+                                       color: @wcfColor;
+                               }
+                       }
+                       
+                       &:not(.redactor_button_disabled):hover,
+                       &.redactor_act,
+                       &.dropact {
+                               background-color: @wcfContainerHoverBackgroundColor;
+                               
+                               .textShadow(@wcfButtonHoverBackgroundColor);*/
+                               
+                               > i {
+                                       text-shadow: none;
+                               }
+                       }
+                       
+                       &.fa-redactor-btn:before {
+                               content: "";
+                       }
+               }
+       }
+}
+
+.redactorAttachmentContainer {
+       background-color: rgba(255, 255, 255, 1);
+       border: 1px solid rgba(238, 238, 238, 1);
+       border-top-width: 0;
+       padding: 7px 14px 7px;
+}
+
+.messageTabMenu {
+       border: 1px solid @wcfContainerBorderColor;
+       border-top-width: 0;
+       
+       > nav.messageTabMenuNavigation {
+               > ul {
+                       background-color: @wcfContainerBackgroundColor;
+                       font-size: 0;
+                       white-space: nowrap;
+                       
+                       > li {
+                               display: inline-block;
+                               
+                               > a {
+                                       border-right: 1px solid @wcfContainerBorderColor;
+                                       border-bottom: 1px solid transparent;
+                                       color: @wcfButtonColor;
+                                       display: block;
+                                       font-size: @wcfBaseFontSize;
+                                       padding: 7px 14px;
+                                       text-decoration: none;
+                                       
+                                       -webkit-touch-callout: none;
+                                       -webkit-user-select: none;
+                                       -khtml-user-select: none;
+                                       -moz-user-select: none;
+                                       -ms-user-select: none;
+                                       user-select: none;
+                                       
+                                       &:hover {
+                                               color: @wcfLinkColor;
+                                       }
+                               }
+                               
+                               &.active {
+                                       > a {
+                                               background-color: @wcfContainerBackgroundColor;
+                                               color: @wcfLinkColor;
+                                       }
+                               }
+                       }
+               }
+       }
+       
+       > div,
+       > fieldset{
+               background-color: @wcfContainerBackgroundColor;
+               border-width: 0;
+               border-radius: 0;
+               border-top: 1px solid @wcfContainerBorderColor;
+               display: none;
+               margin-top: -1px;
+               padding: 14px 7px;
+               position: static;
+               
+               &.active {
+                       display: block;
+               }
+       }
+       
+       > div {
+               > nav {
+                       background-color: @wcfContainerBackgroundColor;
+                       border-bottom: 1px solid @wcfContainerBorderColor;
+                       margin: -14px -7px 7px -7px !important;
+                       padding: @wcfGapTiny @wcfGapSmall;
+                       
+                       ul {
+                               display: inline-block;
+                               font-size: 0;
+                               white-space: nowrap;
+                               
+                               li {
+                                       display: inline-block;
+                                       outline: 0;
+                                       vertical-align: bottom;
+                                       
+                                       &.active a,
+                                       &.active a:hover {
+                                               color: @wcfButtonPrimaryColor;
+                                               cursor: default;
+                                       }
+                                       
+                                       a {
+                                               color: @wcfButtonColor;
+                                               display: block;
+                                               font-size: @wcfSmallFontSize;
+                                               outline: 0;
+                                               padding: 0 @wcfGapSmall;
+                                               
+                                               -webkit-touch-callout: none;
+                                               -webkit-user-select: none;
+                                               -khtml-user-select: none;
+                                               -moz-user-select: none;
+                                               -ms-user-select: none;
+                                               user-select: none;
+                                               
+                                               &:hover {
+                                                       color: @wcfButtonHoverColor;
+                                                       text-decoration: none;
+                                               }
+                                       }
+                                       
+                                       &:not(:last-child) {
+                                               padding-right: @wcfGapTiny;
+                                       }
+                                       
+                                       &.dropdown > a {
+                                               font-size: 1.0rem;
+                                               padding: 4px 7px 2px;
+                                       }
+                               }
+                       }
+               }
+               
+               > div,
+               > fieldset {
+                       border-top-width: 0;
+               }
+       }
+}
+
+.redactor_dropdown_box_fontcolor {
+       width: 200px;
+       
+       > li.redactorColorPallet {
+               padding: 0 4px;
+               
+               &:hover {
+                       background-color: @wcfDropdownBackgroundColor !important;
+               }
+               
+               > a {
+                       border: 2px solid rgba(255, 255, 255, 1);
+                       border-bottom-width: 0;
+                       display: inline-block;
+                       font-size: 0;
+                       height: 20px;
+                       padding: 0;
+                       margin: 0;
+                       width: 20px;
+               }
+       }
+}
\ No newline at end of file