From 27b8fbe71c8fc9e52e25835cb1dee606432cde9b Mon Sep 17 00:00:00 2001 From: Saksham Gupta Date: Tue, 29 Jan 2019 19:58:19 +0530 Subject: [PATCH] Add automated theme generator (#14293) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Google Summer of Code 2018 project Signed-off-by: Saksham Gupta Signed-off-by: MaurĂ­cio Meneghini Fauth --- config.sample.inc.php | 7 + doc/config.rst | 11 +- doc/theme_generator.rst | 43 + doc/user.rst | 1 + index.php | 13 + js/theme_generator/color_picker.js | 1981 +++++++++ js/theme_generator/preview.js | 103 + libraries/classes/Theme.php | 1 + libraries/classes/ThemeGenerator.php | 170 + libraries/classes/ThemeGenerator/Common.php | 3643 +++++++++++++++++ libraries/classes/ThemeGenerator/Layout.php | 113 + .../classes/ThemeGenerator/Navigation.php | 432 ++ libraries/config.default.php | 7 + templates/theme_generator/color_picker.twig | 9 + templates/theme_generator/form.twig | 40 + templates/theme_generator/group_preview.twig | 20 + templates/theme_generator/table_preview.twig | 75 + test/classes/ThemeGenerator/LayoutTest.php | 35 + test/classes/ThemeGeneratorTest.php | 133 + theme_generator.php | 42 + themes/pmahomme/css/theme_generator.css.php | 725 ++++ themes/pmahomme/img/theme_generator/alpha.png | Bin 0 -> 105 bytes .../img/theme_generator/alpha_mask.png | Bin 0 -> 1152 bytes themes/pmahomme/img/theme_generator/arrow.png | Bin 0 -> 1062 bytes .../pmahomme/img/theme_generator/arrows.png | Bin 0 -> 1249 bytes themes/pmahomme/img/theme_generator/grain.png | Bin 0 -> 7327 bytes themes/pmahomme/img/theme_generator/hue.png | Bin 0 -> 610 bytes .../img/theme_generator/picker_mask_200.png | Bin 0 -> 66665 bytes 28 files changed, 7602 insertions(+), 2 deletions(-) create mode 100644 doc/theme_generator.rst create mode 100644 js/theme_generator/color_picker.js create mode 100644 js/theme_generator/preview.js create mode 100644 libraries/classes/ThemeGenerator.php create mode 100644 libraries/classes/ThemeGenerator/Common.php create mode 100644 libraries/classes/ThemeGenerator/Layout.php create mode 100644 libraries/classes/ThemeGenerator/Navigation.php create mode 100644 templates/theme_generator/color_picker.twig create mode 100644 templates/theme_generator/form.twig create mode 100644 templates/theme_generator/group_preview.twig create mode 100644 templates/theme_generator/table_preview.twig create mode 100644 test/classes/ThemeGenerator/LayoutTest.php create mode 100644 test/classes/ThemeGeneratorTest.php create mode 100644 theme_generator.php create mode 100644 themes/pmahomme/css/theme_generator.css.php create mode 100644 themes/pmahomme/img/theme_generator/alpha.png create mode 100644 themes/pmahomme/img/theme_generator/alpha_mask.png create mode 100644 themes/pmahomme/img/theme_generator/arrow.png create mode 100644 themes/pmahomme/img/theme_generator/arrows.png create mode 100644 themes/pmahomme/img/theme_generator/grain.png create mode 100644 themes/pmahomme/img/theme_generator/hue.png create mode 100644 themes/pmahomme/img/theme_generator/picker_mask_200.png diff --git a/config.sample.inc.php b/config.sample.inc.php index c4f4df6f80..44d30785d4 100644 --- a/config.sample.inc.php +++ b/config.sample.inc.php @@ -149,6 +149,13 @@ $cfg['SaveDir'] = ''; */ //$cfg['SendErrorReports'] = 'always'; +/** + * Enabling or disabling Theme Generator + * + * default = 'false' + */ +//$cfg['ThemeGenerator'] = 'false'; + /** * You can find more configuration options in the documentation * in the doc/ folder or at . diff --git a/doc/config.rst b/doc/config.rst index 05a197fa58..8959cd2aba 100644 --- a/doc/config.rst +++ b/doc/config.rst @@ -217,8 +217,8 @@ Basic settings Setting this to ``true`` allows phpMyAdmin to be included inside a frame, and is a potential security hole allowing cross-frame scripting attacks or - clickjacking. Setting this to 'sameorigin' prevents phpMyAdmin to be - included from another document in a frame, unless that document belongs + clickjacking. Setting this to 'sameorigin' prevents phpMyAdmin to be + included from another document in a frame, unless that document belongs to the same domain. Server connection settings @@ -3265,6 +3265,13 @@ Theme manager settings Whether to allow different theme for each server. +.. config:option:: $cfg['ThemeGenerator'] + + :type: boolean + :default: false + + Whether to enable theme generator. + .. config:option:: $cfg['FontSize'] :type: string diff --git a/doc/theme_generator.rst b/doc/theme_generator.rst new file mode 100644 index 0000000000..d303c1540a --- /dev/null +++ b/doc/theme_generator.rst @@ -0,0 +1,43 @@ +Create Own Custom Themes +======================== + +You can create your own themes using Theme Generator tool present on page index.php. +Choose a Base Colour using the colour picker tool. + +Colour schemes +-------------- + +The colour schemes are: + +* Triadic +* Complementary +* Adjacent +* Monochrome + +You can choose any one of the four schemes using the dropdown menu. +Each element's colour can be customised by clicking on a particular colour box. +Upon hovering the colour box it would display the element the colour corresponds to. +On clicking Go button the program would create the necessary theme files. +Now you can choose the theme you created from the Theme drop-down on page index.php. + +Automatic text colours for better visibility +++++++++++++++++++++++++++++++++++++++++++++ + +A checkbox can be found stating Automatically set text colours for best visibility. +On using this option the text colour would be chosen for best visibility. +You would not be able to change the text colours manually, when using this option. + +Preview panels +++++++++++++++ + +On clicking Preview button the view would change to how the theme would look after +being saved. This is a temporary view and would not generate any files, and upon going on any +other page the view would return back to the original view. For better visualisation, +some elements such as tables and group would popup. + +Saving the theme +++++++++++++++++ + +To save the theme, you need to specify a theme name. All other parameters are optional. +Note that if another theme already exists, it would be overwritten to save the new theme. +After the theme saved you can change the theme from the index.php page. diff --git a/doc/user.rst b/doc/user.rst index a98e2cb894..06843709b3 100644 --- a/doc/user.rst +++ b/doc/user.rst @@ -13,4 +13,5 @@ User Guide charts import_export themes + theme_generator other diff --git a/index.php b/index.php index 6ab209e1a8..39ae8785d1 100644 --- a/index.php +++ b/index.php @@ -293,6 +293,19 @@ if ($GLOBALS['cfg']['ThemeManager']) { echo Util::getImage('s_theme') , " " , ThemeManager::getInstance()->getHtmlSelectBox(); echo ''; + if ($GLOBALS['cfg']['ThemeGenerator']) { + Core::printListItem( + Util::getImage('s_theme') . " " . __( + 'Theme Generator' + ), + 'li_theme_generator', + 'theme_generator.php' . $common_url_query, + null, + null, + null, + "no_bullets" + ); + } } echo ''; diff --git a/js/theme_generator/color_picker.js b/js/theme_generator/color_picker.js new file mode 100644 index 0000000000..4044d9dba0 --- /dev/null +++ b/js/theme_generator/color_picker.js @@ -0,0 +1,1981 @@ +/* vim: set expandtab sw=4 ts=4 sts=4: */ +/** + * Library for the Color Picker Tool + */ +'use strict'; +var globalChange = 0; +var UIColorPicker = (function UIColorPicker () { + function getElemById (id) { + return document.getElementById(id); + } + + var subscribers = []; + var pickers = []; + + /** + * RGBA Color class + * + * HSV/HSB and HSL (hue, saturation, value / brightness, lightness) + * @param hue 0-360 + * @param saturation 0-100 + * @param value 0-100 + * @param lightness 0-100 + */ + + function Color (color) { + if (color instanceof Color === true) { + this.copy(color); + return; + } + + this.r = 0; + this.g = 0; + this.b = 0; + this.a = 1; + this.hue = 0; + this.saturation = 0; + this.value = 100; + this.lightness = 0; + this.format = 'HSB'; + } + + function RGBColor (r, g, b) { + var color = new Color(); + color.setRGBA(r, g, b, 1); + return color; + } + + function RGBAColor (r, g, b, a) { + var color = new Color(); + color.setRGBA(r, g, b, a); + return color; + } + + function HSBColor (h, s, v) { + var color = new Color(); + color.setHSB(h, s, v); + return color; + } + + function HSBAColor (h, s, v, a) { + var color = new Color(); + color.setHSB(h, s, v); + color.a = a; + return color; + } + + function HSLColor (h, s, l) { + var color = new Color(); + color.setHSL(h, s, l); + return color; + } + + function HSLAColor (h, s, l, a) { + var color = new Color(); + color.setHSL(h, s, l); + color.a = a; + return color; + } + + Color.prototype.copy = function copy (obj) { + if (obj instanceof Color !== true) { + console.log('Typeof parameter not Color'); + return; + } + + this.r = obj.r; + this.g = obj.g; + this.b = obj.b; + this.a = obj.a; + this.hue = obj.hue; + this.saturation = obj.saturation; + this.value = obj.value; + this.format = '' + obj.format; + this.lightness = obj.lightness; + }; + + Color.prototype.setFormat = function setFormat (format) { + if (format === 'HSB') { + this.format = 'HSB'; + } + if (format === 'HSL') { + this.format = 'HSL'; + } + }; + + /* ========== Methods to set Color Properties ========== */ + + Color.prototype.isValidRGBValue = function isValidRGBValue (value) { + return (typeof(value) === 'number' && isNaN(value) === false && + value >= 0 && value <= 255); + }; + + Color.prototype.setRGBA = function setRGBA (red, green, blue, alpha) { + if (this.isValidRGBValue(red) === false || + this.isValidRGBValue(green) === false || + this.isValidRGBValue(blue) === false) { + return; + } + + this.r = red | 0; + this.g = green | 0; + this.b = blue | 0; + + if (this.isValidRGBValue(alpha) === true) { + this.a = alpha | 0; + } + }; + + Color.prototype.setByName = function setByName (name, value) { + if (name === 'r' || name === 'g' || name === 'b') { + if (this.isValidRGBValue(value) === false) { + return; + } + + this[name] = value; + this.updateHSX(); + } + }; + + Color.prototype.setHSB = function setHSB (hue, saturation, value) { + this.hue = hue; + this.saturation = saturation; + this.value = value; + this.HSBtoRGB(); + }; + + Color.prototype.setHSL = function setHSL (hue, saturation, lightness) { + this.hue = hue; + this.saturation = saturation; + this.lightness = lightness; + this.HSLtoRGB(); + }; + + Color.prototype.setHue = function setHue (value) { + if (typeof(value) !== 'number' || isNaN(value) === true || + value < 0 || value > 359) { + return; + } + this.hue = value; + this.updateRGB(); + }; + + Color.prototype.setSaturation = function setSaturation (value) { + if (typeof(value) !== 'number' || isNaN(value) === true || + value < 0 || value > 100) { + return; + } + this.saturation = value; + this.updateRGB(); + }; + + Color.prototype.setValue = function setValue (value) { + if (typeof(value) !== 'number' || isNaN(value) === true || + value < 0 || value > 100) { + return; + } + this.value = value; + this.HSBtoRGB(); + }; + + Color.prototype.setLightness = function setLightness (value) { + if (typeof(value) !== 'number' || isNaN(value) === true || + value < 0 || value > 100) { + return; + } + this.lightness = value; + this.HSLtoRGB(); + }; + + Color.prototype.setHexa = function setHexa (value) { + var valid = /(^#{0,1}[0-9A-F]{6}$)|(^#{0,1}[0-9A-F]{3}$)/i.test(value); + + if (valid !== true) { + return; + } + if (value[0] === '#') { + value = value.slice(1, value.length); + } + if (value.length === 3) { + value = value.replace(/([0-9A-F])([0-9A-F])([0-9A-F])/i,'$1$1$2$2$3$3'); + } + + this.r = parseInt(value.substr(0, 2), 16); + this.g = parseInt(value.substr(2, 2), 16); + this.b = parseInt(value.substr(4, 2), 16); + + this.alpha = 1; + this.RGBtoHSB(); + }; + + /* ========== Conversion Methods ========== */ + + Color.prototype.convertToHSL = function convertToHSL () { + if (this.format === 'HSL') { + return; + } + + this.setFormat('HSL'); + this.RGBtoHSL(); + }; + + Color.prototype.convertToHSB = function convertToHSB () { + if (this.format === 'HSB') { + return; + } + + this.setFormat('HSB'); + this.RGBtoHSB(); + }; + + /* ========== Update Methods ========== */ + + Color.prototype.updateRGB = function updateRGB () { + if (this.format === 'HSB') { + this.HSBtoRGB(); + return; + } + + if (this.format === 'HSL') { + this.HSLtoRGB(); + return; + } + }; + + Color.prototype.updateHSX = function updateHSX () { + if (this.format === 'HSB') { + this.RGBtoHSB(); + return; + } + + if (this.format === 'HSL') { + this.RGBtoHSL(); + return; + } + }; + + Color.prototype.HSBtoRGB = function HSBtoRGB () { + var sat = this.saturation / 100; + var value = this.value / 100; + var C = sat * value; + var H = this.hue / 60; + var X = C * (1 - Math.abs(H % 2 - 1)); + var m = value - C; + var precision = 255; + + C = (C + m) * precision | 0; + X = (X + m) * precision | 0; + m = m * precision | 0; + + if (H >= 0 && H < 1) { + this.setRGBA(C, X, m); + return; + } + if (H >= 1 && H < 2) { + this.setRGBA(X, C, m); + return; + } + if (H >= 2 && H < 3) { + this.setRGBA(m, C, X); + return; + } + if (H >= 3 && H < 4) { + this.setRGBA(m, X, C); + return; + } + if (H >= 4 && H < 5) { + this.setRGBA(X, m, C); + return; + } + if (H >= 5 && H < 6) { + this.setRGBA(C, m, X); + return; + } + }; + + Color.prototype.HSLtoRGB = function HSLtoRGB () { + var sat = this.saturation / 100; + var light = this.lightness / 100; + var C = sat * (1 - Math.abs(2 * light - 1)); + var H = this.hue / 60; + var X = C * (1 - Math.abs(H % 2 - 1)); + var m = light - C / 2; + var precision = 255; + + C = (C + m) * precision | 0; + X = (X + m) * precision | 0; + m = m * precision | 0; + + if (H >= 0 && H < 1) { + this.setRGBA(C, X, m); + return; + } + if (H >= 1 && H < 2) { + this.setRGBA(X, C, m); + return; + } + if (H >= 2 && H < 3) { + this.setRGBA(m, C, X); + return; + } + if (H >= 3 && H < 4) { + this.setRGBA(m, X, C); + return; + } + if (H >= 4 && H < 5) { + this.setRGBA(X, m, C); + return; + } + if (H >= 5 && H < 6) { + this.setRGBA(C, m, X); + return; + } + }; + + Color.prototype.RGBtoHSB = function RGBtoHSB () { + var red = this.r / 255; + var green = this.g / 255; + var blue = this.b / 255; + + var cmax = Math.max(red, green, blue); + var cmin = Math.min(red, green, blue); + var delta = cmax - cmin; + var hue = 0; + var saturation = 0; + + if (delta) { + if (cmax === red) { + hue = (green - blue) / delta; + } + if (cmax === green) { + hue = 2 + (blue - red) / delta; + } + if (cmax === blue) { + hue = 4 + (red - green) / delta; + } + if (cmax) { + saturation = delta / cmax; + } + } + + this.hue = 60 * hue | 0; + if (this.hue < 0) { + this.hue += 360; + } + this.saturation = (saturation * 100) | 0; + this.value = (cmax * 100) | 0; + }; + + Color.prototype.RGBtoHSL = function RGBtoHSL () { + var red = this.r / 255; + var green = this.g / 255; + var blue = this.b / 255; + + var cmax = Math.max(red, green, blue); + var cmin = Math.min(red, green, blue); + var delta = cmax - cmin; + var hue = 0; + var saturation = 0; + var lightness = (cmax + cmin) / 2; + var X = (1 - Math.abs(2 * lightness - 1)); + + if (delta) { + if (cmax === red) { + hue = ((green - blue) / delta); + } + if (cmax === green) { + hue = 2 + (blue - red) / delta; + } + if (cmax === blue) { + hue = 4 + (red - green) / delta; + } + if (cmax) { + saturation = delta / X; + } + } + + this.hue = 60 * hue | 0; + if (this.hue < 0) { + this.hue += 360; + } + this.saturation = (saturation * 100) | 0; + this.lightness = (lightness * 100) | 0; + }; + + /* ========== Get Methods ========== */ + + Color.prototype.getHexa = function getHexa () { + var r = this.r.toString(16); + var g = this.g.toString(16); + var b = this.b.toString(16); + if (this.r < 16) { + r = '0' + r; + } + if (this.g < 16) { + g = '0' + g; + } + if (this.b < 16) { + b = '0' + b; + } + var value = '#' + r + g + b; + return value.toUpperCase(); + }; + + Color.prototype.getRGBA = function getRGBA () { + var rgb = '(' + this.r + ', ' + this.g + ', ' + this.b; + var a = ''; + var v = ''; + var x = parseFloat(this.a); + if (x !== 1) { + a = 'a'; + v = ', ' + x; + } + + var value = 'rgb' + a + rgb + v + ')'; + return value; + }; + + Color.prototype.getColor = function getColor () { + if (this.a | 0 === 1) { + return this.getHexa(); + } + return this.getRGBA(); + }; + + /* ========== Capture Mouse Movement ========== */ + + var setMouseTracking = function setMouseTracking (elem, callback) { + elem.addEventListener('mousedown', function (e) { + callback(e); + document.addEventListener('mousemove', callback); + }); + + document.addEventListener('mouseup', function (e) { + document.removeEventListener('mousemove', callback); + }); + }; + + /* ==================== */ + // Color Picker Class + /* ==================== */ + + function ColorPicker (node) { + this.color = new Color(); + this.node = node; + this.subscribers = []; + + var type = this.node.getAttribute('data-mode'); + var topic = this.node.getAttribute('data-topic'); + + this.topic = topic; + this.picker_mode = (type === 'HSL') ? 'HSL' : 'HSB'; + this.color.setFormat(this.picker_mode); + + this.createPickingArea(); + this.createHueArea(); + + this.newInputComponent('H', 'hue', this.inputChangeHue.bind(this)); + this.newInputComponent('S', 'saturation', this.inputChangeSaturation.bind(this)); + this.newInputComponent('B', 'value', this.inputChangeValue.bind(this)); + this.newInputComponent('L', 'lightness', this.inputChangeLightness.bind(this)); + + this.newInputComponent('R', 'red', this.inputChangeRed.bind(this)); + this.newInputComponent('G', 'green', this.inputChangeGreen.bind(this)); + this.newInputComponent('B', 'blue', this.inputChangeBlue.bind(this)); + + this.createPreviewBox(); + + this.newInputComponent('hexa', 'hexa', this.inputChangeHexa.bind(this)); + + this.setColor(this.color); + pickers[topic] = this; + } + + /** ********************************************************************* **/ + // Function for generating the color-picker + /** ********************************************************************* **/ + + ColorPicker.prototype.createPickingArea = function createPickingArea () { + var area = document.createElement('div'); + var picker = document.createElement('div'); + + area.className = 'picking-area'; + picker.className = 'picker'; + + this.picking_area = area; + this.color_picker = picker; + setMouseTracking(area, this.updateColor.bind(this)); + + area.appendChild(picker); + this.node.appendChild(area); + }; + + ColorPicker.prototype.createHueArea = function createHueArea () { + var area = document.createElement('div'); + var picker = document.createElement('div'); + + area.className = 'hue'; + picker.className = 'slider-picker'; + + this.hue_area = area; + this.hue_picker = picker; + setMouseTracking(area, this.updateHueSlider.bind(this)); + + area.appendChild(picker); + this.node.appendChild(area); + }; + + ColorPicker.prototype.createPreviewBox = function createPreviewBox (e) { + var preview_box = document.createElement('div'); + var preview_color = document.createElement('div'); + + preview_box.className = 'preview'; + preview_color.className = 'preview-color'; + + this.preview_color = preview_color; + + preview_box.appendChild(preview_color); + this.node.appendChild(preview_box); + }; + + ColorPicker.prototype.newInputComponent = function newInputComponent (title, topic, onChangeFunc) { + var wrapper = document.createElement('div'); + var input = document.createElement('input'); + var info = document.createElement('span'); + + wrapper.className = 'input'; + wrapper.setAttribute('data-topic', topic); + info.textContent = title; + info.className = 'name'; + input.setAttribute('type', 'text'); + + wrapper.appendChild(info); + wrapper.appendChild(input); + this.node.appendChild(wrapper); + + input.addEventListener('change', onChangeFunc); + input.addEventListener('click', function () { + this.select(); + }); + + this.subscribe(topic, function (value) { + input.value = value; + }); + }; + + /** ********************************************************************* **/ + // Updates properties of UI elements + /** ********************************************************************* **/ + + ColorPicker.prototype.updateColor = function updateColor (e) { + var x = e.pageX - this.picking_area.offsetLeft; + var y = e.pageY - this.picking_area.offsetTop; + var picker_offset = 5; + + // width and height should be the same + var size = this.picking_area.clientWidth; + + if (x > size) { + x = size; + } + if (y > size) { + y = size; + } + if (x < 0) { + x = 0; + } + if (y < 0) { + y = 0; + } + + var value = 100 - (y * 100 / size) | 0; + var saturation = x * 100 / size | 0; + + if (this.picker_mode === 'HSB') { + this.color.setHSB(this.color.hue, saturation, value); + } + if (this.picker_mode === 'HSL') { + this.color.setHSL(this.color.hue, saturation, value); + } + + this.color_picker.style.left = x - picker_offset + 'px'; + this.color_picker.style.top = y - picker_offset + 'px'; + + this.updatePreviewColor(); + + this.notify('value', value); + this.notify('lightness', value); + this.notify('saturation', saturation); + + this.notify('red', this.color.r); + this.notify('green', this.color.g); + this.notify('blue', this.color.b); + this.notify('hexa', this.color.getHexa()); + + notify(this.topic, this.color); + }; + + ColorPicker.prototype.updateHueSlider = function updateHueSlider (e) { + var x = e.pageX - this.hue_area.offsetLeft; + var width = this.hue_area.clientWidth; + + if (x < 0) { + x = 0; + } + if (x > width) { + x = width; + } + + // TODO 360 => 359 + var hue = ((359 * x) / width) | 0; + // if (hue === 360) hue = 359; + + this.updateSliderPosition(this.hue_picker, x); + this.setHue(hue); + }; + + ColorPicker.prototype.updateAlphaSlider = function updateAlphaSlider (e) { + var x = e.pageX - this.alpha_area.offsetLeft; + var width = this.alpha_area.clientWidth; + + if (x < 0) { + x = 0; + } + if (x > width) { + x = width; + } + + this.color.a = (x / width).toFixed(2); + + this.updateSliderPosition(this.alpha_picker, x); + this.updatePreviewColor(); + + this.notify('alpha', this.color.a); + notify(this.topic, this.color); + }; + + ColorPicker.prototype.setHue = function setHue (value) { + this.color.setHue(value); + + this.updatePickerBackground(); + this.updatePreviewColor(); + + this.notify('red', this.color.r); + this.notify('green', this.color.g); + this.notify('blue', this.color.b); + this.notify('hexa', this.color.getHexa()); + this.notify('hue', this.color.hue); + + notify(this.topic, this.color); + }; + + // Updates when one of Saturation/Value/Lightness changes + ColorPicker.prototype.updateSLV = function updateSLV () { + this.updatePickerPosition(); + this.updateAlphaGradient(); + this.updatePreviewColor(); + + this.notify('red', this.color.r); + this.notify('green', this.color.g); + this.notify('blue', this.color.b); + this.notify('hexa', this.color.getHexa()); + + notify(this.topic, this.color); + }; + + /** ********************************************************************* **/ + // Update positions of various UI elements + /** ********************************************************************* **/ + + ColorPicker.prototype.updatePickerPosition = function updatePickerPosition () { + var size = this.picking_area.clientWidth; + var value = 0; + var offset = 5; + + if (this.picker_mode === 'HSB') { + value = this.color.value; + } + if (this.picker_mode === 'HSL') { + value = this.color.lightness; + } + + var x = (this.color.saturation * size / 100) | 0; + var y = size - (value * size / 100) | 0; + + this.color_picker.style.left = x - offset + 'px'; + this.color_picker.style.top = y - offset + 'px'; + }; + + ColorPicker.prototype.updateSliderPosition = function updateSliderPosition (elem, pos) { + elem.style.left = Math.max(pos - 3, -2) + 'px'; + }; + + ColorPicker.prototype.updateHuePicker = function updateHuePicker () { + var size = this.hue_area.clientWidth; + var offset = 1; + var pos = (this.color.hue * size / 360) | 0; + this.hue_picker.style.left = pos - offset + 'px'; + }; + + /** ********************************************************************* **/ + // Update background colors + /** ********************************************************************* **/ + + ColorPicker.prototype.updatePickerBackground = function updatePickerBackground () { + var nc = new Color(this.color); + nc.setHSB(nc.hue, 100, 100); + this.picking_area.style.backgroundColor = nc.getHexa(); + }; + + ColorPicker.prototype.updatePreviewColor = function updatePreviewColor () { + this.preview_color.style.backgroundColor = this.color.getColor(); + }; + + /** ********************************************************************* **/ + // Update input elements + /** ********************************************************************* **/ + + ColorPicker.prototype.inputChangeHue = function inputChangeHue (e) { + var value = parseInt(e.target.value); + this.setHue(value); + this.updateHuePicker(); + }; + + ColorPicker.prototype.inputChangeSaturation = function inputChangeSaturation (e) { + var value = parseInt(e.target.value); + this.color.setSaturation(value); + e.target.value = this.color.saturation; + this.updateSLV(); + }; + + ColorPicker.prototype.inputChangeValue = function inputChangeValue (e) { + var value = parseInt(e.target.value); + this.color.setValue(value); + e.target.value = this.color.value; + this.updateSLV(); + }; + + ColorPicker.prototype.inputChangeLightness = function inputChangeLightness (e) { + var value = parseInt(e.target.value); + this.color.setLightness(value); + e.target.value = this.color.lightness; + this.updateSLV(); + }; + + ColorPicker.prototype.inputChangeRed = function inputChangeRed (e) { + var value = parseInt(e.target.value); + this.color.setByName('r', value); + e.target.value = this.color.r; + this.setColor(this.color); + }; + + ColorPicker.prototype.inputChangeGreen = function inputChangeGreen (e) { + var value = parseInt(e.target.value); + this.color.setByName('g', value); + e.target.value = this.color.g; + this.setColor(this.color); + }; + + ColorPicker.prototype.inputChangeBlue = function inputChangeBlue (e) { + var value = parseInt(e.target.value); + this.color.setByName('b', value); + e.target.value = this.color.b; + this.setColor(this.color); + }; + + ColorPicker.prototype.inputChangeHexa = function inputChangeHexa (e) { + var value = e.target.value; + this.color.setHexa(value); + this.setColor(this.color); + }; + + /** ********************************************************************* **/ + // Internal Pub/Sub + /** ********************************************************************* **/ + + ColorPicker.prototype.subscribe = function subscribe (topic, callback) { + this.subscribers[topic] = callback; + }; + + ColorPicker.prototype.notify = function notify (topic, value) { + if (this.subscribers[topic]) { + this.subscribers[topic](value); + } + }; + + /** ********************************************************************* **/ + // Set Picker Properties + /** ********************************************************************* **/ + + ColorPicker.prototype.setColor = function setColor (color) { + if (color.format !== this.picker_mode) { + color.setFormat(this.picker_mode); + color.updateHSX(); + } + + this.color.copy(color); + this.updateHuePicker(); + this.updatePickerPosition(); + this.updatePickerBackground(); + this.updatePreviewColor(); + + this.notify('red', this.color.r); + this.notify('green', this.color.g); + this.notify('blue', this.color.b); + + this.notify('hue', this.color.hue); + this.notify('saturation', this.color.saturation); + this.notify('value', this.color.value); + this.notify('lightness', this.color.lightness); + + this.notify('alpha', this.color.a); + this.notify('hexa', this.color.getHexa()); + }; + + ColorPicker.prototype.setPickerMode = function setPickerMode (mode) { + if (mode !== 'HSB' && mode !== 'HSL') { + return; + } + + this.picker_mode = mode; + this.node.setAttribute('data-mode', this.picker_mode); + this.setColor(this.color); + }; + + /** ********************************************************************* **/ + // UNUSED + /** ********************************************************************* **/ + + var setPickerMode = function setPickerMode (topic, mode) { + if (pickers[topic]) { + pickers[topic].setPickerMode(mode); + } + }; + + var setColor = function setColor (topic, color) { + if (pickers[topic]) { + pickers[topic].setColor(color); + } + }; + + var getColor = function getColor (topic) { + if (pickers[topic]) { + return new Color(pickers[topic].color); + } + }; + + var subscribe = function subscribe (topic, callback) { + if (subscribers[topic] === undefined) { + subscribers[topic] = []; + } + + subscribers[topic].push(callback); + }; + + var unsubscribe = function unsubscribe (callback) { + subscribers.indexOf(callback); + subscribers.splice(index, 1); + }; + + var notify = function notify (topic, value) { + if (subscribers[topic] === undefined || subscribers[topic].length === 0) { + return; + } + + var color = new Color(value); + for (var i in subscribers[topic]) { + subscribers[topic][i](color); + } + }; + + var init = function init () { + var elem = document.querySelectorAll('.ui-color-picker'); + var size = elem.length; + for (var i = 0; i < size; i++) { + new ColorPicker(elem[i]); + } + }; + + return { + init : init, + Color : Color, + RGBColor : RGBColor, + RGBAColor : RGBAColor, + HSBColor : HSBColor, + HSBAColor : HSBAColor, + HSLColor : HSLColor, + HSLAColor : HSLAColor, + setColor : setColor, + getColor : getColor, + subscribe : subscribe, + unsubscribe : unsubscribe, + setPickerMode : setPickerMode + }; +}()); + +/** + * UI-SlidersManager + */ + +var InputSliderManager = (function InputSliderManager () { + var subscribers = {}; + var sliders = []; + + var InputComponent = function InputComponent (obj) { + var input = document.createElement('input'); + input.setAttribute('type', 'text'); + input.style.width = 50 + obj.precision * 10 + 'px'; + + input.addEventListener('click', function (e) { + this.select(); + }); + + input.addEventListener('change', function (e) { + var value = parseFloat(e.target.value); + + if (isNaN(value) === true) { + setValue(obj.topic, obj.value); + } else { + setValue(obj.topic, value); + } + }); + + return input; + }; + + var SliderComponent = function SliderComponent (obj, sign) { + var slider = document.createElement('div'); + var startX = null; + var start_value = 0; + + slider.addEventListener('click', function (e) { + document.removeEventListener('mousemove', sliderMotion); + setValue(obj.topic, obj.value + obj.step * sign); + }); + + slider.addEventListener('mousedown', function (e) { + startX = e.clientX; + start_value = obj.value; + document.body.style.cursor = 'e-resize'; + + document.addEventListener('mouseup', slideEnd); + document.addEventListener('mousemove', sliderMotion); + }); + + var slideEnd = function slideEnd (e) { + document.removeEventListener('mousemove', sliderMotion); + document.body.style.cursor = 'auto'; + slider.style.cursor = 'pointer'; + }; + + var sliderMotion = function sliderMotion (e) { + slider.style.cursor = 'e-resize'; + var delta = (e.clientX - startX) / obj.sensivity | 0; + var value = delta * obj.step + start_value; + setValue(obj.topic, value); + }; + + return slider; + }; + + var InputSlider = function (node) { + var min = parseFloat(node.getAttribute('data-min')); + var max = parseFloat(node.getAttribute('data-max')); + var step = parseFloat(node.getAttribute('data-step')); + var value = parseFloat(node.getAttribute('data-value')); + var topic = node.getAttribute('data-topic'); + var unit = node.getAttribute('data-unit'); + var name = node.getAttribute('data-info'); + var sensivity = node.getAttribute('data-sensivity') | 0; + var precision = node.getAttribute('data-precision') | 0; + + this.min = isNaN(min) ? 0 : min; + this.max = isNaN(max) ? 100 : max; + this.precision = precision >= 0 ? precision : 0; + this.step = step < 0 || isNaN(step) ? 1 : step.toFixed(precision); + this.topic = topic; + this.node = node; + this.unit = unit === null ? '' : unit; + this.sensivity = sensivity > 0 ? sensivity : 5; + value = isNaN(value) ? this.min : value; + + var input = new InputComponent(this); + var slider_left = new SliderComponent(this, -1); + var slider_right = new SliderComponent(this, 1); + + slider_left.className = 'ui-input-slider-left'; + slider_right.className = 'ui-input-slider-right'; + + if (name) { + var info = document.createElement('span'); + info.className = 'ui-input-slider-info'; + info.textContent = name; + node.appendChild(info); + } + + node.appendChild(slider_left); + node.appendChild(input); + node.appendChild(slider_right); + + this.input = input; + sliders[topic] = this; + setValue(topic, value); + }; + + InputSlider.prototype.setInputValue = function setInputValue () { + this.input.value = this.value.toFixed(this.precision) + this.unit; + }; + + var setValue = function setValue (topic, value, send_notify) { + var slider = sliders[topic]; + if (slider === undefined) { + return; + } + + value = parseFloat(value.toFixed(slider.precision)); + + if (value > slider.max) { + value = slider.max; + } + if (value < slider.min) { + value = slider.min; + } + + slider.value = value; + slider.node.setAttribute('data-value', value); + + slider.setInputValue(); + + if (send_notify === false) { + return; + } + + notify.call(slider); + }; + + var setMax = function setMax (topic, value) { + var slider = sliders[topic]; + if (slider === undefined) { + return; + } + + slider.max = value; + setValue(topic, slider.value); + }; + + var setMin = function setMin (topic, value) { + var slider = sliders[topic]; + if (slider === undefined) { + return; + } + + slider.min = value; + setValue(topic, slider.value); + }; + + var setUnit = function setUnit (topic, unit) { + var slider = sliders[topic]; + if (slider === undefined) { + return; + } + + slider.unit = unit; + setValue(topic, slider.value); + }; + + var setStep = function setStep (topic, value) { + var slider = sliders[topic]; + if (slider === undefined) { + return; + } + + slider.step = parseFloat(value); + setValue(topic, slider.value); + }; + + var setPrecision = function setPrecision (topic, value) { + var slider = sliders[topic]; + if (slider === undefined) { + return; + } + + value = value | 0; + slider.precision = value; + + var step = parseFloat(slider.step.toFixed(value)); + if (step === 0) { + slider.step = 1 / Math.pow(10, value); + } + + setValue(topic, slider.value); + }; + + var setSensivity = function setSensivity (topic, value) { + var slider = sliders[topic]; + if (slider === undefined) { + return; + } + + value = value | 0; + + slider.sensivity = value > 0 ? value : 5; + }; + + var getNode = function getNode (topic) { + return sliders[topic].node; + }; + + var getPrecision = function getPrecision (topic) { + return sliders[topic].precision; + }; + + var getStep = function getStep (topic) { + return sliders[topic].step; + }; + + var subscribe = function subscribe (topic, callback) { + if (subscribers[topic] === undefined) { + subscribers[topic] = []; + } + subscribers[topic].push(callback); + }; + + var unsubscribe = function unsubscribe (topic, callback) { + subscribers[topic].indexOf(callback); + subscribers[topic].splice(index, 1); + }; + + var notify = function notify () { + if (subscribers[this.topic] === undefined) { + return; + } + for (var i = 0; i < subscribers[this.topic].length; i++) { + subscribers[this.topic][i](this.value); + } + }; + + var createSlider = function createSlider (topic, label) { + var slider = document.createElement('div'); + slider.className = 'ui-input-slider'; + slider.setAttribute('data-topic', topic); + + if (label !== undefined) { + slider.setAttribute('data-info', label); + } + + new InputSlider(slider); + return slider; + }; + + var init = function init () { + var elem = document.querySelectorAll('.ui-input-slider'); + var size = elem.length; + for (var i = 0; i < size; i++) { + new InputSlider(elem[i]); + } + }; + + return { + init : init, + setMax : setMax, + setMin : setMin, + setUnit : setUnit, + setStep : setStep, + getNode : getNode, + getStep : getStep, + setValue : setValue, + subscribe : subscribe, + unsubscribe : unsubscribe, + setPrecision : setPrecision, + setSensivity : setSensivity, + getPrecision : getPrecision, + createSlider : createSlider, + }; +}()); + + +'use strict'; + +var ColorPickerTool = (function ColorPickerTool () { + /* ========== Get DOM Element By ID ========== */ + + function getElemById (id) { + return document.getElementById(id); + } + + function allowDropEvent (e) { + e.preventDefault(); + } + + /* ========== Make an element resizable relative to it's parent ========== */ + + var UIComponent = (function UIComponent () { + function makeResizable (elem, axis) { + var valueX = 0; + var valueY = 0; + var action = 0; + + var resizeStart = function resizeStart (e) { + e.stopPropagation(); + e.preventDefault(); + if (e.button !== 0) { + return; + } + + valueX = e.clientX - elem.clientWidth; + valueY = e.clientY - elem.clientHeight; + + document.body.setAttribute('data-resize', axis); + document.addEventListener('mousemove', mouseMove); + document.addEventListener('mouseup', resizeEnd); + }; + + var mouseMove = function mouseMove (e) { + if (action >= 0) { + elem.style.width = e.clientX - valueX + 'px'; + } + if (action <= 0) { + elem.style.height = e.clientY - valueY + 'px'; + } + }; + + var resizeEnd = function resizeEnd (e) { + if (e.button !== 0) { + return; + } + + document.body.removeAttribute('data-resize', axis); + document.removeEventListener('mousemove', mouseMove); + document.removeEventListener('mouseup', resizeEnd); + }; + + var handle = document.createElement('div'); + handle.className = 'resize-handle'; + + if (axis === 'width') { + action = 1; + } else if (axis === 'height') { + action = -1; + } else { + axis = 'both'; + } + + handle.className = 'resize-handle'; + handle.setAttribute('data-resize', axis); + handle.addEventListener('mousedown', resizeStart); + elem.appendChild(handle); + }; + + /* ========== Make an element draggable relative to it's parent ========== */ + + var makeDraggable = function makeDraggable (elem, endFunction) { + var offsetTop; + var offsetLeft; + + elem.setAttribute('data-draggable', 'true'); + + var dragStart = function dragStart (e) { + e.preventDefault(); + e.stopPropagation(); + + if (e.target.getAttribute('data-draggable') !== 'true' || + e.target !== elem || e.button !== 0) { + return; + } + + offsetLeft = e.clientX - elem.offsetLeft; + offsetTop = e.clientY - elem.offsetTop; + + document.addEventListener('mousemove', mouseDrag); + document.addEventListener('mouseup', dragEnd); + }; + + var dragEnd = function dragEnd (e) { + if (e.button !== 0) { + return; + } + + document.removeEventListener('mousemove', mouseDrag); + document.removeEventListener('mouseup', dragEnd); + }; + + var mouseDrag = function mouseDrag (e) { + elem.style.left = e.clientX - offsetLeft + 'px'; + elem.style.top = e.clientY - offsetTop + 'px'; + }; + + elem.addEventListener('mousedown', dragStart, false); + }; + + return { + makeResizable : makeResizable, + makeDraggable : makeDraggable + }; + }()); + + /* ========== Color Class ========== */ + + var Color = UIColorPicker.Color; + var HSLColor = UIColorPicker.HSLColor; + + /** + * ColorPalette + */ + var ColorPalette = (function ColorPalette () { + var samples = []; + var color_palette; + var complementary; + var pallete_size = 13; + + var hideNode = function (node) { + node.setAttribute('data-hidden', 'true'); + }; + + var ColorSample = function ColorSample (id) { + var title = ['Base Colour','Group Background','Background Colour','Navigation Panel','Navigation Hover','Hyperlink Text','Table Row Hover and Selected','Table Header and Footer Text Colour','Table Header and Footer Background', + 'Table Row Background','Table Row Alternate Background','Header','Text Colour']; + var node = document.createElement('div'); + node.className = 'sample'; + + this.uid = samples.length; + var index = this.uid % pallete_size; + this.node = node; + this.color = new Color(); + + node.setAttribute('sample-id', this.uid); + node.setAttribute('draggable', 'true'); + node.setAttribute('title', title[index]); + node.addEventListener('dragstart', this.dragStart.bind(this)); + node.addEventListener('click', this.pickColor.bind(this)); + + samples.push(this); + }; + + ColorSample.prototype.updateBgColor = function updateBgColor () { + this.node.style.backgroundColor = this.color.getColor(); + }; + + ColorSample.prototype.updateColor = function updateColor (color) { + this.color.copy(color); + this.updateBgColor(); + }; + + ColorSample.prototype.updateTriadic = function updateTriadic (color, size, steps) { + var h = color.hue; + if ((steps * 3 / size) < 1 || globalChange) { + var hue = h; + } else if ((steps * 3 / size) < 2) { + if (h - 120 < 0) { + var hue = 240 + h; + } else { + var hue = h - 120; + } + } else { + if (h + 120 >= 360) { + var hue = h - 240; + } else { + var hue = h + 120; + } + } + + if (globalChange) { + var saturation = color.saturation; + var brightness = color.value; + } else { + var saturation = this.updateSaturation(color.saturation, size / 3, steps % (size / 3)); + var brightness = this.updateBrightness(color.value, size / 3, steps % (size / 3)); + } + + if (saturation > 100 || brightness > 100) { + var saturation = 0; + var brightness = 100; + } + this.node.removeAttribute('data-hidden'); + this.color.copy(color); + this.color.setValue(brightness); + this.color.setSaturation(saturation); + this.color.setHue(hue); + this.updateBgColor(); + }; + + ColorSample.prototype.updateSaturation = function updateSaturation (s, size, steps) { + if (steps) { + if (s < 20) { + var saturation = 100 - ((100 / size) * steps); + } else if (3 * s / 2 >= 100) { + var saturation = (((200 - s) * steps) + (s * (size - 1) - 200)) / (2 * (size - 2)); + } else { + var saturation = ((s / (size - 2)) * (steps - 1)) + (s / 2); + } + } else { + var saturation = s; + } + return saturation; + }; + + ColorSample.prototype.updateBrightness = function updateBrightness (b, size, steps) { + if (steps) { + if (b < 20) { + var brightness = (100 / (size - 1)) * steps; + } else if (3 * b / 2 >= 100) { + var brightness = (((200 - b) * (size - steps)) + (b * (size - 1) - 200)) / (2 * (size - 2)); + } else { + var brightness = ((b / (size - 2)) * ((size - steps) - 1)) + (b / 2); + } + } else { + var brightness = b; + } + return brightness; + }; + + ColorSample.prototype.updateLightness = function updateLightness (color, value, steps) { + var lightness = color.lightness + value * steps; + if (lightness <= 0) { + this.node.setAttribute('data-hidden', 'true'); + return; + } + this.node.removeAttribute('data-hidden'); + this.color.copy(color); + this.color.setLightness(lightness); + this.updateBgColor(); + }; + + ColorSample.prototype.updateAdjacent = function updateAdjacent (color, size, steps) { + var h = color.hue; + if ((steps * 3 / size) < 1 || globalChange) { + var hue = h; + } else if ((steps * 3 / size) < 2) { + if (h - 60 < 0) { + var hue = 300 + h; + } else { + var hue = h - 60; + } + } else { + if (h + 60 >= 360) { + var hue = h - 300; + } else { + var hue = h + 60; + } + } + + if (globalChange) { + var saturation = color.saturation; + var brightness = color.value; + } else { + var saturation = this.updateSaturation(color.saturation, size / 3, steps % (size / 3)); + var brightness = this.updateBrightness(color.value, size / 3, steps % (size / 3)); + } + + if (saturation > 100 || brightness > 100) { + var saturation = 0; + var brightness = 100; + } + + this.node.removeAttribute('data-hidden'); + this.color.copy(color); + this.color.setValue(brightness); + this.color.setSaturation(saturation); + this.color.setHue(hue); + this.updateBgColor(); + }; + + ColorSample.prototype.updateMonochrome = function updateMonochrome (color, size, steps) { + if (globalChange) { + var saturation = color.saturation; + var brightness = color.value; + } else { + var saturation = this.updateSaturation(color.saturation, size, steps % (size)); + var brightness = this.updateBrightness(color.value, size, steps % (size)); + } + + if (saturation > 100 || brightness > 100) { + var saturation = 0; + var brightness = 100; + } + this.node.removeAttribute('data-hidden'); + this.color.copy(color); + this.color.setValue(brightness); + this.color.setSaturation(saturation); + this.updateBgColor(); + }; + + ColorSample.prototype.updateComplementary = function updateComplementary (color, size, steps) { + var h = color.hue; + if ((steps * 2 / size) < 1 || globalChange) { + var hue = h; + } else { + if (h < 180) { + var hue = h + 180; + } else { + var hue = h - 180; + } + } + + if (globalChange) { + var saturation = color.saturation; + var brightness = color.value; + } else { + var saturation = this.updateSaturation(color.saturation, size / 2, steps % (size / 2)); + var brightness = this.updateBrightness(color.value, size / 2, steps % (size / 2)); + } + + if (saturation > 100 || brightness > 100) { + var saturation = 0; + var brightness = 100; + } + this.node.removeAttribute('data-hidden'); + this.color.copy(color); + this.color.setValue(brightness); + this.color.setSaturation(saturation); + this.color.setHue(hue); + this.updateBgColor(); + }; + + ColorSample.prototype.pickColor = function pickColor () { + if (this.uid % pallete_size === 0) { + globalChange = 0; + } else { + globalChange = this.uid; + } + UIColorPicker.setColor('picker', this.color); + }; + + ColorSample.prototype.dragStart = function dragStart (e) { + e.dataTransfer.setData('sampleID', this.uid); + e.dataTransfer.setData('location', 'palette-samples'); + }; + + ColorSample.prototype.improveContrastRatio = function improveContrastRatio (group , background) { + var brightness = 50; + var saturation = 50; + var max1 = 1; + var max2 = 1; + var maxBrightness = brightness; + var maxSaturation = saturation; + for (var i = 0 ; i < 11 ; i ++) { + var contrast1 = getColorContrast(this.color,group); + var contrast2 = getColorContrast(this.color,background); + if (contrast1 > 4.5 && contrast2 > 4.5) { + this.updateBgColor(); + return; + } + if (max1 < contrast1 && max2 < contrast2 && i > 0) { + max1 = contrast1; + max2 = contrast2; + maxBrightness = this.color.value; + maxBrightness = this.color.saturation; + } + if (i % 2 === 1) { + saturation += i * 10; + } else { + saturation = brightness; + } + brightness = 100 - saturation; + this.color.setSaturation(saturation); + this.color.setValue(brightness); + } + this.color.setValue(maxBrightness); + this.color.setValue(maxSaturation); + this.updateBgColor(); + }; + + var Palette = function Palette (text, size) { + this.samples = []; + + var palette = document.createElement('div'); + var title = document.createElement('div'); + var container = document.createElement('div'); + + container.className = 'container'; + title.className = 'title'; + palette.className = 'palette'; + title.textContent = text; + + container.appendChild(title); + container.appendChild(palette); + + for (var i = 0; i < size; i++) { + var sample = new ColorSample(); + this.samples.push(sample); + palette.appendChild(sample.node); + } + + this.container = container; + this.title = title; + }; + + var paletteTextUpdate = function paletteTextUpdate (palette) { + if (document.getElementsByName('text_contrast')[0].checked) { + for (var i = 0; i < pallete_size; i++) { + var title = palette.samples[i].node.title; + if (title === 'Group Background') { + var group = palette.samples[i].color; + } if (title === 'Background Colour') { + var background = palette.samples[i].color; + } + } + for (var i = 0; i < pallete_size; i++) { + var title = palette.samples[i].node.title; + if (title === 'Text Colour' || title === 'Hyperlink Text') { + palette.samples[i].improveContrastRatio(group , background); + } + } + } + }; + + var createTriadicPalette = function createTriadicPalette () { + var palette = new Palette('Triadic', pallete_size); + + UIColorPicker.subscribe('picker', function (color) { + if (globalChange / pallete_size > 0 && globalChange / pallete_size < 1) { + var i = globalChange % pallete_size; + palette.samples[i].updateTriadic(color, pallete_size, i); + } else if (globalChange === 0) { + for (var i = 0; i < pallete_size; i++) { + palette.samples[i].updateTriadic(color, pallete_size, i); + } + } + paletteTextUpdate (palette); + }); + var checkbox = document.getElementsByName('text_contrast')[0]; + checkbox.addEventListener('click', function () { + paletteTextUpdate (palette); + }); + + color_palette.appendChild(palette.container); + }; + + var createComplementaryPalette = function createComplementaryPalette () { + var palette = new Palette('Complementary', pallete_size); + + UIColorPicker.subscribe('picker', function (color) { + if (globalChange / pallete_size > 1 && globalChange / pallete_size < 2) { + var i = globalChange % pallete_size; + palette.samples[i].updateComplementary(color, pallete_size, i); + } else if (globalChange === 0) { + for (var i = 0; i < pallete_size; i++) { + palette.samples[i].updateComplementary(color, pallete_size, i); + } + } + paletteTextUpdate (palette); + }); + var checkbox = document.getElementsByName('text_contrast')[0]; + checkbox.addEventListener('click', function () { + paletteTextUpdate (palette); + }); + + color_palette.appendChild(palette.container); + }; + + /* Brightness or Lightness - depends on the picker mode */ + var createAdjacentPalette = function createAdjacentPalette () { + var palette = new Palette('Adjacent', pallete_size); + + UIColorPicker.subscribe('picker', function (color) { + if (globalChange / pallete_size > 2 && globalChange / pallete_size < 3) { + var i = globalChange % pallete_size; + palette.samples[i].updateAdjacent(color, pallete_size, i); + } else if (globalChange === 0) { + for (var i = 0; i < pallete_size; i++) { + palette.samples[i].updateAdjacent(color, pallete_size, i); + } + } + paletteTextUpdate (palette); + }); + var checkbox = document.getElementsByName('text_contrast')[0]; + checkbox.addEventListener('click', function () { + paletteTextUpdate (palette); + }); + + color_palette.appendChild(palette.container); + }; + + var isBlankPalette = function isBlankPalette (container, value) { + if (value === 0) { + container.setAttribute('data-collapsed', 'true'); + return true; + } + + container.removeAttribute('data-collapsed'); + return false; + }; + + var createMonochromePalette = function createMonochromePalette () { + var palette = new Palette('Monochrome', pallete_size); + + UIColorPicker.subscribe('picker', function (color) { + if (globalChange / pallete_size > 3) { + var i = globalChange % pallete_size; + palette.samples[i].updateMonochrome(color, pallete_size, i); + } else if (globalChange === 0) { + for (var i = 0; i < pallete_size; i++) { + palette.samples[i].updateMonochrome(color, pallete_size, i); + } + } + paletteTextUpdate (palette); + }); + var checkbox = document.getElementsByName('text_contrast')[0]; + checkbox.addEventListener('click', function () { + paletteTextUpdate (palette); + }); + + color_palette.appendChild(palette.container); + }; + + var getSampleColor = function getSampleColor (id) { + if (samples[id] !== undefined && samples[id] !== null) { + return new Color(samples[id].color); + } + }; + + var getColorContrast = function getColorContrast (c1 , c2) { + var lum1 = luminance(c1.r , c1.g , c1.b) + 0.05; + var lum2 = luminance(c2.r , c2.g , c2.b) + 0.05; + if (lum1 / lum2 > 1) { + return lum1 / lum2; + } else { + return lum2 / lum1; + } + }; + + var luminance = function luminanace (r, g, b) { + var a = [r, g, b].map(function (v) { + v /= 255; + return v <= 0.03928 + ? v / 12.92 + : Math.pow((v + 0.055) / 1.055, 2.4); + }); + return a[0] * 0.2126 + a[1] * 0.7152 + a[2] * 0.0722; + }; + + var init = function init () { + color_palette = getElemById('color-palette'); + + createTriadicPalette(); + createComplementaryPalette(); + createAdjacentPalette(); + createMonochromePalette(); + }; + + return { + init : init, + getSampleColor : getSampleColor + }; + }()); + + /** + * Canvas Samples + */ + var CanvasSamples = (function CanvasSamples () { + var active = null; + var canvas = null; + var samples = []; + var zindex = null; + var tutorial = true; + + var CanvasSample = function CanvasSample (color, posX, posY) { + var node = document.createElement('div'); + var pick = document.createElement('div'); + var delete_btn = document.createElement('div'); + node.className = 'sample'; + pick.className = 'pick'; + delete_btn.className = 'delete'; + + this.uid = samples.length; + this.node = node; + this.color = color; + this.updateBgColor(); + this.zIndex = 1; + + node.style.top = posY - 50 + 'px'; + node.style.left = posX - 50 + 'px'; + node.setAttribute('sample-id', this.uid); + + node.appendChild(pick); + node.appendChild(delete_btn); + + var activate = function activate () { + setActiveSample(this); + }.bind(this); + + node.addEventListener('dblclick', activate); + pick.addEventListener('click', activate); + delete_btn.addEventListener('click', this.deleteSample.bind(this)); + + UIComponent.makeDraggable(node); + UIComponent.makeResizable(node); + + samples.push(this); + canvas.appendChild(node); + return this; + }; + + CanvasSample.prototype.updateBgColor = function updateBgColor () { + this.node.style.backgroundColor = this.color.getColor(); + }; + + CanvasSample.prototype.updateColor = function updateColor (color) { + this.color.copy(color); + this.updateBgColor(); + }; + + CanvasSample.prototype.updateZIndex = function updateZIndex (value) { + this.zIndex = value; + this.node.style.zIndex = value; + }; + + CanvasSample.prototype.activate = function activate () { + this.node.setAttribute('data-active', 'true'); + zindex.setAttribute('data-active', 'true'); + + UIColorPicker.setColor('picker', this.color); + InputSliderManager.setValue('z-index', this.zIndex); + }; + + CanvasSample.prototype.deactivate = function deactivate () { + this.node.removeAttribute('data-active'); + zindex.removeAttribute('data-active'); + }; + + CanvasSample.prototype.deleteSample = function deleteSample () { + if (active === this) { + unsetActiveSample(); + } + canvas.removeChild(this.node); + samples[this.uid] = null; + }; + + CanvasSample.prototype.updatePosition = function updatePosition (posX, posY) { + this.node.style.top = posY - this.startY + 'px'; + this.node.style.left = posX - this.startX + 'px'; + }; + + var canvasDropEvent = function canvasDropEvent (e) { + var color = Tool.getSampleColorFrom(e); + + if (color) { + var offsetX = e.pageX - canvas.offsetLeft; + var offsetY = e.pageY - canvas.offsetTop; + var sample = new CanvasSample(color, offsetX, offsetY); + if (tutorial) { + tutorial = false; + canvas.removeAttribute('data-tutorial'); + var info = new CanvasSample(new Color(), 100, 100); + info.node.setAttribute('data-tutorial', 'dblclick'); + } + } + }; + + var setActiveSample = function setActiveSample (sample) { + ColorPickerSamples.unsetActiveSample(); + unsetActiveSample(); + active = sample; + active.activate(); + }; + + var unsetActiveSample = function unsetActiveSample () { + if (active) { + active.deactivate(); + } + active = null; + }; + + return { + unsetActiveSample : unsetActiveSample + }; + }()); + + var StateButton = function StateButton (node, state) { + this.state = false; + this.callback = null; + + node.addEventListener('click', function () { + this.state = !this.state; + if (typeof this.callback === 'function') { + this.callback(this.state); + } + }.bind(this)); + }; + + StateButton.prototype.set = function set () { + this.state = true; + if (typeof this.callback === 'function') { + this.callback(this.state); + } + }; + + StateButton.prototype.unset = function unset () { + this.state = false; + if (typeof this.callback === 'function') { + this.callback(this.state); + } + }; + + StateButton.prototype.subscribe = function subscribe (func) { + this.callback = func; + }; + + var init = function init () { + UIColorPicker.init(); + InputSliderManager.init(); + ColorPalette.init(); + }; + + return { + init : init + }; +}()); + +AJAX.registerOnload('theme_generator/color_picker.js', function () { + $('#save').submit(function (event) { + event.preventDefault(); + var selected = document.getElementById('theme').options.selectedIndex; + var palette = document.getElementsByClassName('palette')[selected]; + var paletteLength = palette.childNodes.length; + var container = document.getElementById('save'); + + for (var i = 0; i < paletteLength; i++) { + var temp = palette.childNodes[i].style.backgroundColor; + var tempHex = rgbToHex(temp); + var input = document.createElement('input'); + input.type = 'hidden'; + input.name = palette.childNodes[i].title; + input.value = tempHex; + container.appendChild(input); + } + $.ajax({ + url: 'theme_generator.php', + type: 'POST', + data: $(this).serialize(), + success: function (result) { + } + }); + }); + + function rgbToHex (col) { + if (col.charAt(0) === 'r') { + col = col.replace('rgb(','').replace(')','').split(','); + var r = parseInt(col[0], 10).toString(16); + var g = parseInt(col[1], 10).toString(16); + var b = parseInt(col[2], 10).toString(16); + r = r.length === 1 ? '0' + r : r; + g = g.length === 1 ? '0' + g : g; + b = b.length === 1 ? '0' + b : b; + var colHex = '#' + r + g + b; + return colHex; + } + } + ColorPickerTool.init(); + var paletteList = document.getElementsByClassName('palette'); + var titleList = document.getElementsByClassName('title'); + for (var i = 0; i < paletteList.length; i++) { + (function (i) { + paletteList[i].onclick = function () { + document.getElementById('theme').options.selectedIndex = i; + }; + titleList[i].onclick = function () { + document.getElementById('theme').options.selectedIndex = i; + }; + }(i)); + } +}); diff --git a/js/theme_generator/preview.js b/js/theme_generator/preview.js new file mode 100644 index 0000000000..dbf6d23b33 --- /dev/null +++ b/js/theme_generator/preview.js @@ -0,0 +1,103 @@ +/* vim: set expandtab sw=4 ts=4 sts=4: */ +/** + * Used for generating previews + */ + +AJAX.registerTeardown('theme_generator/preview.js',function () { + document.getElementById('pma_navigation').style.background = ''; + document.getElementById('serverinfo').style.background = ''; + document.getElementById('lock_page_icon').style.background = ''; + document.getElementById('page_settings_icon').style.background = ''; + document.getElementById('goto_pagetop').style.background = ''; + document.getElementsByTagName('body')[0].style.background = ''; + document.getElementsByTagName('body')[0].style.color = ''; + $(document).on( + 'mouseover', + '#pma_navigation_tree.highlight li:not(.fast_filter)', + function () { + if ($('li:visible', this).length === 0) { + $(this).css('background-color',''); + } + } + ); + var head = document.getElementsByTagName('head')[0]; + head.removeChild(head.lastChild); +}); + +$(document).on('click', '#preview' ,function () { + var id = document.getElementById('theme').options.selectedIndex; + tablePreview(id); + navigationPreview(id); + bodyPreview(id); + headerPreview(id); + groupPreview(id); +}); + +var tablePreview = function (id) { + var tableRow = document.querySelectorAll('[title="Table Row Background"]')[id].style.backgroundColor; + var tableAlternateRow = document.querySelectorAll('[title="Table Row Alternate Background"]')[id].style.backgroundColor; + var hoverRow = document.querySelectorAll('[title="Table Row Hover and Selected"]')[id].style.backgroundColor; + var tableHeader = document.querySelectorAll('[title="Table Header and Footer Background"]')[id].style.backgroundColor; + $('.row_preview').css('background',tableRow); + $('.row_alternate_preview').css('background',tableAlternateRow); + document.getElementById('table_preview').style.display = 'block'; + var head = document.getElementsByTagName('head')[0]; + var style = document.createElement('style'); + var cssText = 'tr.row_preview:not(.nopointer):hover, tr.row_alternate_preview:not(.nopointer):hover , tr.marked:not(.nomarker) td { background:' + hoverRow + '!important }'; + var hoverDeclarations = document.createTextNode(cssText); + var cssText = 'th { background: ' + tableHeader + ' !important}'; + var headerDeclarations = document.createTextNode(cssText); + style.type = 'text/css'; + if (style.styleSheet) { + style.styleSheet.cssText = hoverDeclarations.nodeValue; + style.styleSheet.cssText += headerDeclarations.nodeValue; + } else { + style.appendChild(hoverDeclarations); + style.appendChild(headerDeclarations); + } + head.appendChild(style); +}; + +var navigationPreview = function (id) { + var navColor = document.querySelectorAll('[title="Navigation Panel"]')[id].style.backgroundColor; + var navHover = document.querySelectorAll('[title="Navigation Hover"]')[id].style.backgroundColor; + var backgroundColor = document.querySelectorAll('[title="Background Colour"]')[id].style.backgroundColor; + document.getElementById('pma_navigation').style.background = 'linear-gradient(to right, ' + navColor + ',' + backgroundColor + ')'; + $(document).on( + 'mouseover', + '#pma_navigation_tree.highlight li:not(.fast_filter)', + function () { + if ($('li:visible', this).length === 0) { + $(this).css('background-color',navHover); + } + } + ); + $(document).on( + 'mouseout', + '#pma_navigation_tree.highlight li:not(.fast_filter)', + function () { + $(this).css('background-color','transparent'); + } + ); +}; + +var bodyPreview = function (id) { + var backgroundColor = document.querySelectorAll('[title="Background Colour"]')[id].style.backgroundColor; + var textColor = document.querySelectorAll('[title="Text Colour"]')[id].style.backgroundColor; + document.getElementsByTagName('body')[0].style.background = backgroundColor; + document.getElementsByTagName('body')[0].style.color = textColor; +}; + +var headerPreview = function (id) { + var headerColor = document.querySelectorAll('[title="Header"]')[id].style.backgroundColor; + document.getElementById('serverinfo').style.background = headerColor; + document.getElementById('lock_page_icon').style.background = headerColor; + document.getElementById('page_settings_icon').style.background = headerColor; + document.getElementById('goto_pagetop').style.background = headerColor; +}; + +var groupPreview = function (id) { + var groupColor = document.querySelectorAll('[title="Group Background"]')[id].style.backgroundColor; + document.getElementById('group_preview').style.display = 'block'; + document.getElementById('group_preview').style.background = groupColor; +}; diff --git a/libraries/classes/Theme.php b/libraries/classes/Theme.php index f8e67d0714..de02021f09 100644 --- a/libraries/classes/Theme.php +++ b/libraries/classes/Theme.php @@ -83,6 +83,7 @@ class Theme 'jqplot', 'resizable-menu', 'icons', + 'theme_generator', ]; /** diff --git a/libraries/classes/ThemeGenerator.php b/libraries/classes/ThemeGenerator.php new file mode 100644 index 0000000000..c49dca25fe --- /dev/null +++ b/libraries/classes/ThemeGenerator.php @@ -0,0 +1,170 @@ +template = new Template(); + } + + /** + * Colour Picker HTML file + * + * @return string HTML for the color picker tool + */ + public function colorPicker() + { + $output = $this->template->render('theme_generator/color_picker'); + return $output; + } + + /** + * File creation form + * + * @return string HTML for the form submission + */ + public function form() + { + $output = $this->template->render('theme_generator/form'); + return $output; + } + + /** + * Preview panel for Table + * + * @return string HTML for the preview panels + */ + public function tablePreview() + { + $output = $this->template->render('theme_generator/table_preview'); + return $output; + } + + /** + * Preview panel for Groups + * + * @return string HTML for the preview panels + */ + public function groupPreview() + { + $output = $this->template->render('theme_generator/group_preview'); + return $output; + } + + /** + * Creates file structure + * + * @param array $post POST form data + * + * @return array $out generated file data + */ + public function createFileStructure(array $post) + { + $out = array(); + $nav = new Navigation(); + $layout = new Layout(); + $common = new Common(); + $post['theme_name'] = Sanitize::sanitizeFilename($post['theme_name'], true); + $name = $post['theme_name']; + if (!is_dir("themes/" . $name)) { + @mkdir("themes/" . $name); + @mkdir("themes/" . $name . "/css"); + } + if (is_dir("themes/" . $name)) { + $out['json'] = $this->createJsonFile($post); + $common->createCommonFile($name); + $out['layout'] = $layout->createLayoutFile($post); + $nav->createNavigationFile($name); + } + return $out; + } + + /** + * Checks whether the theme directory is writable + * + * @return null + */ + public function testWritableThemeDirectory() + { + clearstatcache(); + if (! is_writable('themes')) { + trigger_error(__("The 'themes' directory is not writable by the webserver process. You must change permissions for the theme generator to be able to write the generated theme."), E_USER_WARNING); + } + return; + } + + /** + * Creates theme.json + * + * @param array $post POST data + * + * @return string $txt JSON file data + */ + public function createJsonFile($post) + { + $name = $post['theme_name']; + $file = fopen("themes/" . $name . "/theme.json", "w"); + $txt = '{'; + $txt .= '"name": "' . $name . '",'; + if ($post['version'] != "") { + $txt .= '"version": "' . $post['version'] . '",'; + } else { + $txt .= '"version": "5.0",'; + } + if ($post['description'] != "") { + $txt .= '"description": "' . $post['description'] . '",'; + } else { + $txt .= '"description": "Theme Generated by Automated Theme Generator",'; + } + if ($post['author'] != "") { + $txt .= '"author": "' . $post['author'] . '",'; + } else { + $txt .= '"author": "",'; + } + if ($post['url'] != "") { + $txt .= '"url": "' . $post['url'] . '",'; + } else { + $txt .= '"url": "https://www.phpmyadmin.net/",'; + } + $version = str_split(PMA_VERSION); + $trimmed_version = array_slice($version, 0, 3); + $txt .= '"supports": ["' . implode($trimmed_version) . '"]'; + $txt .= '}'; + // Check if the file is writable as this condition would only occur if files are overwritten. + if ($file) { + fwrite($file, $txt); + fclose($file); + return $txt; + } else { + trigger_error(__("The theme.json file is not writable by the webserver process. You must change permissions for the theme generator to be able to write the generated theme."), E_USER_ERROR); + return; + } + } +} + diff --git a/libraries/classes/ThemeGenerator/Common.php b/libraries/classes/ThemeGenerator/Common.php new file mode 100644 index 0000000000..e395209adb --- /dev/null +++ b/libraries/classes/ThemeGenerator/Common.php @@ -0,0 +1,3643 @@ +'; + + /******************************************************************************/ + /* general tags */ + $txt .= 'html {'; + $txt .= ' font-size: 82%;'; + $txt .= '}'; + + $txt .= 'input,'; + $txt .= 'select,'; + $txt .= 'textarea {'; + $txt .= ' font-size: 1em;'; + $txt .= '}'; + + $txt .= 'body {'; + $txt .= ''; + $txt .= ' font-family: ;'; + $txt .= ''; + $txt .= ' padding: 0;'; + $txt .= ' margin: 0;'; + $txt .= ' margin-: 240px;'; + $txt .= ' color: ;'; + $txt .= ' background: ;'; + $txt .= '}'; + + $txt .= 'body#loginform {'; + $txt .= ' margin: 0;'; + $txt .= '}'; + + $txt .= '#page_content {'; + $txt .= ' margin: 0 .5em;'; + $txt .= '}'; + + $txt .= '.desktop50 {'; + $txt .= ' width: 50%;'; + $txt .= '}'; + + $txt .= '.all100 {'; + $txt .= ' width: 100%;'; + $txt .= '}'; + + $txt .= '.all85{'; + $txt .= ' width: 85%;'; + $txt .= '}'; + + $txt .= '.auth_config_tbl{'; + $txt .= ' margin: 0 auto;'; + $txt .= '}'; + + $txt .= ''; + $txt .= ' textarea,'; + $txt .= ' tt,'; + $txt .= ' pre,'; + $txt .= ' code {'; + $txt .= ' font-family: ;'; + $txt .= ' }'; + $txt .= ''; + + $txt .= 'h1 {'; + $txt .= ' font-size: 140%;'; + $txt .= ' font-weight: bold;'; + $txt .= '}'; + + $txt .= 'h2 {'; + $txt .= ' font-size: 2em;'; + $txt .= ' font-weight: normal;'; + $txt .= ' text-shadow: 0 1px 0 #fff;'; + $txt .= ' padding: 10px 0 10px;'; + $txt .= ' padding-: 3px;'; + $txt .= ' color: #777;'; + $txt .= '}'; + + /* Hiding icons in the page titles */ + $txt .= 'h2 img {'; + $txt .= ' display: none;'; + $txt .= '}'; + + $txt .= 'h2 a img {'; + $txt .= ' display: inline;'; + $txt .= '}'; + + $txt .= '.data,'; + $txt .= '.data_full_width {'; + $txt .= ' margin: 0 0 12px;'; + $txt .= '}'; + + $txt .= '.data_full_width {'; + $txt .= ' width: 100%;'; + $txt .= '}'; + + $txt .= 'h3 {'; + $txt .= ' font-weight: bold;'; + $txt .= '}'; + + $txt .= 'a,'; + $txt .= 'a:link,'; + $txt .= 'a:visited,'; + $txt .= 'a:active,'; + $txt .= 'button.mult_submit,'; + $txt .= '.checkall_box+label {'; + $txt .= ' text-decoration: none;'; + $txt .= ' color: ;'; + $txt .= ' cursor: pointer;'; + $txt .= ' outline: none;'; + $txt .= '}'; + + $txt .= 'a:hover,'; + $txt .= 'button.mult_submit:hover,'; + $txt .= 'button.mult_submit:focus,'; + $txt .= '.checkall_box+label:hover {'; + $txt .= ' text-decoration: underline;'; + $txt .= ' color: #235a81;'; + $txt .= '}'; + + $txt .= '#initials_table {'; + $txt .= ' background: ;'; + $txt .= ' border: 1px solid #aaa;'; + $txt .= ' margin-bottom: 10px;'; + $txt .= ' -moz-border-radius: 5px;'; + $txt .= ' -webkit-border-radius: 5px;'; + $txt .= ' border-radius: 5px;'; + $txt .= '}'; + + $txt .= '#initials_table td {'; + $txt .= ' padding: 8px !important;'; + $txt .= '}'; + + $txt .= '#initials_table a {'; + $txt .= ' border: 1px solid #aaa;'; + $txt .= ' background: #fff;'; + $txt .= ' padding: 4px 8px;'; + $txt .= ' -moz-border-radius: 5px;'; + $txt .= ' -webkit-border-radius: 5px;'; + $txt .= ' border-radius: 5px;'; + $txt .= ' getCssGradient(\'ffffff\', \'e0e0e0\'); ?>'; + $txt .= '}'; + + $txt .= '#initials_table a.active {'; + $txt .= ' border: 1px solid #666;'; + $txt .= ' box-shadow: 0 0 2px #999;'; + $txt .= ' getCssGradient(\'bbbbbb\', \'ffffff\'); ?>'; + $txt .= '}'; + + $txt .= 'dfn {'; + $txt .= ' font-style: normal;'; + $txt .= '}'; + + $txt .= 'dfn:hover {'; + $txt .= ' font-style: normal;'; + $txt .= ' cursor: help;'; + $txt .= '}'; + + $txt .= 'th {'; + $txt .= ' font-weight: bold;'; + $txt .= ' color: ;'; + $txt .= ' background: ;'; + $txt .= '}'; + + $txt .= 'a img {'; + $txt .= ' border: 0;'; + $txt .= '}'; + + $txt .= 'hr {'; + $txt .= ' color: ;'; + $txt .= ' background-color: ;'; + $txt .= ' border: 0;'; + $txt .= ' height: 1px;'; + $txt .= '}'; + + $txt .= 'form {'; + $txt .= ' padding: 0;'; + $txt .= ' margin: 0;'; + $txt .= ' display: inline;'; + $txt .= '}'; + + $txt .= 'input,'; + $txt .= 'select {'; + $txt .= ' outline: none;'; + $txt .= '}'; + + $txt .= 'input[type=text],'; + $txt .= 'input[type=password],'; + $txt .= 'input[type=number],'; + $txt .= 'input[type=date] {'; + $txt .= ' border-radius: 2px;'; + $txt .= ' -moz-border-radius: 2px;'; + $txt .= ' -webkit-border-radius: 2px;'; + + $txt .= ' background: white;'; + $txt .= ' border: 1px solid #aaa;'; + $txt .= ' color: #555;'; + $txt .= ' padding: 4px;'; + $txt .= '}'; + + $txt .= 'input[type=text],'; + $txt .= 'input[type=password],'; + $txt .= 'input[type=number],'; + $txt .= 'input[type=date],'; + $txt .= 'input[type=checkbox],'; + $txt .= 'select {'; + $txt .= ' margin: 6px;'; + $txt .= '}'; + + $txt .= 'input[type=number] {'; + $txt .= ' width: 50px;'; + $txt .= '}'; + + $txt .= 'input[type=text],'; + $txt .= 'input[type=password],'; + $txt .= 'input[type=number],'; + $txt .= 'input[type=date],'; + $txt .= 'select {'; + $txt .= ' transition: all 0.2s;'; + $txt .= ' -ms-transition: all 0.2s;'; + $txt .= ' -webkit-transition: all 0.2s;'; + $txt .= ' -moz-transition: all 0.2s;'; + $txt .= '}'; + + $txt .= 'input[type=text][disabled],'; + $txt .= 'input[type=text][disabled]:hover,'; + $txt .= 'input[type=password][disabled],'; + $txt .= 'input[type=password][disabled]:hover,'; + $txt .= 'input[type=number][disabled],'; + $txt .= 'input[type=number][disabled]:hover,'; + $txt .= 'input[type=date][disabled],'; + $txt .= 'input[type=date][disabled]:hover,'; + $txt .= 'select[disabled],'; + $txt .= 'select[disabled]:hover {'; + $txt .= ' background: #e8e8e8;'; + $txt .= ' box-shadow: none;'; + $txt .= ' -webkit-box-shadow: none;'; + $txt .= ' -moz-box-shadow: none;'; + $txt .= '}'; + + $txt .= 'input[type=text]:hover,'; + $txt .= 'input[type=text]:focus,'; + $txt .= 'input[type=password]:hover,'; + $txt .= 'input[type=password]:focus,'; + $txt .= 'input[type=number]:hover,'; + $txt .= 'input[type=number]:focus,'; + $txt .= 'input[type=date]:hover,'; + $txt .= 'input[type=date]:focus,'; + $txt .= 'select:focus {'; + $txt .= ' border: 1px solid #7c7c7c;'; + $txt .= ' background: #fff;'; + $txt .= '}'; + + $txt .= 'input[type=text]:hover,'; + $txt .= 'input[type=password]:hover,'; + $txt .= 'input[type=number]:hover,'; + $txt .= 'input[type=date]:hover {'; + $txt .= ' box-shadow: 0 1px 3px #aaa;'; + $txt .= ' -webkit-box-shadow: 0 1px 3px #aaa;'; + $txt .= ' -moz-box-shadow: 0 1px 3px #aaa;'; + $txt .= '}'; + + $txt .= 'input[type=submit],'; + $txt .= 'input[type=button],'; + $txt .= 'button[type=submit]:not(.mult_submit) {'; + $txt .= ' font-weight: bold !important;'; + $txt .= '}'; + + $txt .= 'input[type=submit],'; + $txt .= 'input[type=button],'; + $txt .= 'button[type=submit]:not(.mult_submit),'; + $txt .= 'input[type=reset],'; + $txt .= 'input[name=submit_reset],'; + $txt .= 'input.button {'; + $txt .= ' margin: 6px 14px;'; + $txt .= ' border: 1px solid #aaa;'; + $txt .= ' padding: 3px 7px;'; + $txt .= ' color: #111;'; + $txt .= ' text-decoration: none;'; + $txt .= ' background: #ddd;'; + + $txt .= ' border-radius: 12px;'; + $txt .= ' -webkit-border-radius: 12px;'; + $txt .= ' -moz-border-radius: 12px;'; + + $txt .= ' text-shadow: 0 1px 0 #fff;'; + + $txt .= ' getCssGradient(\'f8f8f8\', \'d8d8d8\'); ?>'; + $txt .= '}'; + + $txt .= 'input[type=submit]:hover,'; + $txt .= 'input[type=button]:hover,'; + $txt .= 'button[type=submit]:not(.mult_submit):hover,'; + $txt .= 'input[type=reset]:hover,'; + $txt .= 'input[name=submit_reset]:hover,'; + $txt .= 'input.button:hover {'; + $txt .= ' position: relative;'; + $txt .= ' getCssGradient(\'fff\', \'ddd\'); ?>'; + $txt .= ' cursor: pointer;'; + $txt .= '}'; + + $txt .= 'input[type=submit]:active,'; + $txt .= 'input[type=button]:active,'; + $txt .= 'button[type=submit]:not(.mult_submit):active,'; + $txt .= 'input[type=reset]:active,'; + $txt .= 'input[name=submit_reset]:active,'; + $txt .= 'input.button:active {'; + $txt .= ' position: relative;'; + $txt .= ' getCssGradient(\'eee\', \'ddd\'); ?>'; + $txt .= ' box-shadow: 0 1px 6px -2px #333 inset;'; + $txt .= ' text-shadow: none;'; + $txt .= '}'; + + $txt .= 'input[type=submit]:disabled,'; + $txt .= 'input[type=button]:disabled,'; + $txt .= 'button[type=submit]:not(.mult_submit):disabled,'; + $txt .= 'input[type=reset]:disabled,'; + $txt .= 'input[name=submit_reset]:disabled,'; + $txt .= 'input.button:disabled {'; + $txt .= ' background: #ccc;'; + $txt .= ' color: #666;'; + $txt .= ' text-shadow: none;'; + $txt .= '}'; + + $txt .= 'textarea {'; + $txt .= ' overflow: visible;'; + $txt .= ' margin: 6px;'; + $txt .= '}'; + + $txt .= 'textarea.char {'; + $txt .= ' margin: 6px;'; + $txt .= '}'; + + $txt .= 'fieldset, .preview_sql {'; + $txt .= ' margin-top: 1em;'; + $txt .= ' border-radius: 4px 4px 0 0;'; + $txt .= ' -moz-border-radius: 4px 4px 0 0;'; + $txt .= ' -webkit-border-radius: 4px 4px 0 0;'; + $txt .= ' border: #aaa solid 1px;'; + $txt .= ' padding: 0.5em;'; + $txt .= ' background: #eee;'; + $txt .= ' text-shadow: 1px 1px 2px #fff inset;'; + $txt .= ' -moz-box-shadow: 1px 1px 2px #fff inset;'; + $txt .= ' -webkit-box-shadow: 1px 1px 2px #fff inset;'; + $txt .= ' box-shadow: 1px 1px 2px #fff inset;'; + $txt .= '}'; + + $txt .= 'fieldset fieldset {'; + $txt .= ' margin: .8em;'; + $txt .= ' background: #fff;'; + $txt .= ' border: 1px solid #aaa;'; + $txt .= ' background: #E8E8E8;'; + + $txt .= '}'; + + $txt .= 'fieldset legend {'; + $txt .= ' font-weight: bold;'; + $txt .= ' color: #444;'; + $txt .= ' padding: 5px 10px;'; + $txt .= ' border-radius: 2px;'; + $txt .= ' -moz-border-radius: 2px;'; + $txt .= ' -webkit-border-radius: 2px;'; + $txt .= ' border: 1px solid #aaa;'; + $txt .= ' background-color: #fff;'; + $txt .= ' -moz-box-shadow: 3px 3px 15px #bbb;'; + $txt .= ' -webkit-box-shadow: 3px 3px 15px #bbb;'; + $txt .= ' box-shadow: 3px 3px 15px #bbb;'; + $txt .= ' max-width: 100%;'; + $txt .= '}'; + + $txt .= '.some-margin {'; + $txt .= ' margin: 1.5em;'; + $txt .= '}'; + + /* buttons in some browsers (eg. Konqueror) are block elements, this breaks design */ + $txt .= 'button {'; + $txt .= ' display: inline;'; + $txt .= '}'; + + $txt .= 'table caption,'; + $txt .= 'table th,'; + $txt .= 'table td {'; + $txt .= ' padding: .1em .3em;'; + $txt .= ' margin: .1em;'; + $txt .= ' vertical-align: middle;'; + // $txt .= ' text-shadow: 0 1px 0 #fff;'; + $txt .= '}'; + + /* 3.4 */ + $txt .= '.datatable{'; + $txt .= ' table-layout: fixed;'; + $txt .= '}'; + + $txt .= 'table {'; + $txt .= ' border-collapse: collapse;'; + $txt .= '}'; + + $txt .= 'thead th {'; + $txt .= ' border-right: 1px solid #fff;'; + $txt .= '}'; + + $txt .= 'th {'; + $txt .= ' text-align: left;'; + $txt .= '}'; + + $txt .= 'img,'; + $txt .= 'button {'; + $txt .= ' vertical-align: middle;'; + $txt .= '}'; + + $txt .= 'input[type="checkbox"],'; + $txt .= 'input[type="radio"] {'; + $txt .= ' vertical-align: -11%;'; + $txt .= '}'; + + $txt .= 'select {'; + $txt .= ' -moz-border-radius: 2px;'; + $txt .= ' -webkit-border-radius: 2px;'; + $txt .= ' border-radius: 2px;'; + + $txt .= ' border: 1px solid #bbb;'; + $txt .= ' color: #333;'; + $txt .= ' padding: 3px;'; + $txt .= ' background: white;'; + $txt .= ' margin:6px;'; + $txt .= '}'; + + $txt .= 'select[multiple] {'; + $txt .= ' getCssGradient(\'ffffff\', \'f2f2f2\'); ?>'; + $txt .= '}'; + + /******************************************************************************/ + /* classes */ + $txt .= '.clearfloat {'; + $txt .= ' clear: both;'; + $txt .= '}'; + + $txt .= '.floatleft {'; + $txt .= ' float: ;'; + $txt .= ' margin-: 1em;'; + $txt .= '}'; + + $txt .= '.floatright {'; + $txt .= ' float: ;'; + $txt .= '}'; + + $txt .= '.center {'; + $txt .= ' text-align: center;'; + $txt .= '}'; + + $txt .= '.displayblock {'; + $txt .= ' display: block;'; + $txt .= '}'; + + $txt .= 'table.nospacing {'; + $txt .= ' border-spacing: 0;'; + $txt .= '}'; + + $txt .= 'table.nopadding tr th, table.nopadding tr td {'; + $txt .= ' padding: 0;'; + $txt .= '}'; + + $txt .= 'th.left, td.left {'; + $txt .= ' text-align: left;'; + $txt .= '}'; + + $txt .= 'th.center, td.center {'; + $txt .= ' text-align: center;'; + $txt .= '}'; + + $txt .= 'th.right, td.right {'; + $txt .= ' text-align: right;'; + $txt .= ' padding-right: 1em;'; + $txt .= '}'; + + $txt .= 'tr.vtop th, tr.vtop td, th.vtop, td.vtop {'; + $txt .= ' vertical-align: top;'; + $txt .= '}'; + + $txt .= 'tr.vmiddle th, tr.vmiddle td, th.vmiddle, td.vmiddle {'; + $txt .= ' vertical-align: middle;'; + $txt .= '}'; + + $txt .= 'tr.vbottom th, tr.vbottom td, th.vbottom, td.vbottom {'; + $txt .= ' vertical-align: bottom;'; + $txt .= '}'; + + $txt .= '.paddingtop {'; + $txt .= ' padding-top: 1em;'; + $txt .= '}'; + + $txt .= '.separator {'; + $txt .= ' color: #fff;'; + $txt .= ' text-shadow: 0 1px 0 #000;'; + $txt .= '}'; + + $txt .= 'div.tools {'; + $txt .= ' /* border: 1px solid #000; */'; + $txt .= ' padding: .2em;'; + $txt .= '}'; + + $txt .= 'div.tools a {'; + $txt .= ' color: #3a7ead !important;'; + $txt .= '}'; + + $txt .= 'div.tools,'; + $txt .= 'fieldset.tblFooters {'; + $txt .= ' margin-top: 0;'; + $txt .= ' margin-bottom: .5em;'; + $txt .= ' border-top: 0;'; + $txt .= ' text-align: ;'; + $txt .= ' float: none;'; + $txt .= ' clear: both;'; + $txt .= ' -webkit-border-radius: 0 0 4px 4px;'; + $txt .= ' -moz-border-radius: 0 0 4px 4px;'; + $txt .= ' border-radius: 0 0 4px 5px;'; + $txt .= '}'; + + $txt .= 'div.null_div {'; + $txt .= ' height: 20px;'; + $txt .= ' text-align: center;'; + $txt .= ' font-style: normal;'; + $txt .= ' min-width: 50px;'; + $txt .= '}'; + + $txt .= 'fieldset .formelement {'; + $txt .= ' float: ;'; + $txt .= ' margin-: .5em;'; + $txt .= ' white-space: nowrap;'; + $txt .= '}'; + + /* revert for Gecko */ + $txt .= 'fieldset div[class=formelement] {'; + $txt .= ' white-space: normal;'; + $txt .= '}'; + + $txt .= 'button.mult_submit {'; + $txt .= ' border: none;'; + $txt .= ' background-color: transparent;'; + $txt .= '}'; + + /* odd items 1,3,5,7,... */ + $txt .= 'table tbody:first-of-type tr:nth-child(odd),'; + $txt .= 'table tbody:first-of-type tr:nth-child(odd) th,'; + $txt .= '#table_index tbody:nth-of-type(odd) tr,'; + $txt .= '#table_index tbody:nth-of-type(odd) th {'; + $txt .= ' background: ;'; + $txt .= '}'; + + /* even items 2,4,6,8,... */ + $txt .= 'table tbody:first-of-type tr:nth-child(even),'; + $txt .= 'table tbody:first-of-type tr:nth-child(even) th,'; + $txt .= '#table_index tbody:nth-of-type(even) tr,'; + $txt .= '#table_index tbody:nth-of-type(even) th {'; + $txt .= ' background: ;'; + $txt .= '}'; + + $txt .= 'table tr th,'; + $txt .= 'table tr {'; + $txt .= ' text-align: ;'; + $txt .= '}'; + + /* marked table rows */ + $txt .= 'td.marked:not(.nomarker),'; + $txt .= 'table tr.marked:not(.nomarker) td,'; + $txt .= 'table tbody:first-of-type tr.marked:not(.nomarker) th,'; + $txt .= 'table tr.marked:not(.nomarker) {'; + $txt .= ' background: ;'; + $txt .= ' color: ;'; + $txt .= '}'; + + /* hovered items */ + $txt .= 'table tbody:first-of-type tr:not(.nopointer):hover,'; + $txt .= 'table tbody:first-of-type tr:not(.nopointer):hover th,'; + $txt .= '.hover:not(.nopointer) {'; + $txt .= ' background: ;'; + $txt .= ' color: ;'; + $txt .= '}'; + + /* hovered table rows */ + $txt .= '#table_index tbody:hover tr,'; + $txt .= '#table_index tbody:hover th,'; + $txt .= 'table tr.hover:not(.nopointer) th {'; + $txt .= ' background: ;'; + $txt .= ' color: ;'; + $txt .= '}'; + + /** + * marks table rows/cells if the db field is in a where condition + */ + $txt .= '.condition {'; + $txt .= ' border-color: !important;'; + $txt .= '}'; + + $txt .= 'th.condition {'; + $txt .= ' border-width: 1px 1px 0 1px;'; + $txt .= ' border-style: solid;'; + $txt .= '}'; + + $txt .= 'td.condition {'; + $txt .= ' border-width: 0 1px 0 1px;'; + $txt .= ' border-style: solid;'; + $txt .= '}'; + + $txt .= 'tr:last-child td.condition {'; + $txt .= ' border-width: 0 1px 1px 1px;'; + $txt .= '}'; + + $txt .= ''; + $txt .= ' /* for first th which must have right border set (ltr only) */'; + $txt .= ' .before-condition {'; + $txt .= ' border-right: 1px solid ;'; + $txt .= ' }'; + $txt .= ''; + + /** + * cells with the value NULL + */ + $txt .= 'td.null {'; + $txt .= ' font-style: italic;'; + $txt .= ' color: #7d7d7d;'; + $txt .= '}'; + + $txt .= 'table .valueHeader {'; + $txt .= ' text-align: ;'; + $txt .= ' white-space: normal;'; + $txt .= '}'; + $txt .= 'table .value {'; + $txt .= ' text-align: ;'; + $txt .= ' white-space: normal;'; + $txt .= '}'; + /* IE doesnt handles 'pre' right */ + $txt .= 'table [class=value] {'; + $txt .= ' white-space: normal;'; + $txt .= '}'; + + $txt .= ''; + $txt .= ' .value {'; + $txt .= ' font-family: ;'; + $txt .= ' }'; + $txt .= ''; + $txt .= '.attention {'; + $txt .= ' color: red;'; + $txt .= ' font-weight: bold;'; + $txt .= '}'; + $txt .= '.allfine {'; + $txt .= ' color: green;'; + $txt .= '}'; + + $txt .= 'img.lightbulb {'; + $txt .= ' cursor: pointer;'; + $txt .= '}'; + + $txt .= '.pdflayout {'; + $txt .= ' overflow: hidden;'; + $txt .= ' clip: inherit;'; + $txt .= ' background-color: #fff;'; + $txt .= ' display: none;'; + $txt .= ' border: 1px solid #000;'; + $txt .= ' position: relative;'; + $txt .= '}'; + + $txt .= '.pdflayout_table {'; + $txt .= ' background: #D3DCE3;'; + $txt .= ' color: #000;'; + $txt .= ' overflow: hidden;'; + $txt .= ' clip: inherit;'; + $txt .= ' z-index: 2;'; + $txt .= ' display: inline;'; + $txt .= ' visibility: inherit;'; + $txt .= ' cursor: move;'; + $txt .= ' position: absolute;'; + $txt .= ' font-size: 80%;'; + $txt .= ' border: 1px dashed #000;'; + $txt .= '}'; + + /* Doc links in SQL */ + $txt .= '.cm-sql-doc {'; + $txt .= ' text-decoration: none;'; + $txt .= ' border-bottom: 1px dotted #000;'; + $txt .= ' color: inherit !important;'; + $txt .= '}'; + + /* no extra space in table cells */ + $txt .= 'td .icon {'; + $txt .= ' image-rendering: pixelated;'; + $txt .= ' margin: 0;'; + $txt .= '}'; + + $txt .= '.selectallarrow {'; + $txt .= ' margin-: .3em;'; + $txt .= ' margin-: .6em;'; + $txt .= '}'; + + /* message boxes: error, confirmation */ + $txt .= '#pma_errors, #pma_demo, #pma_footer {'; + $txt .= ' padding: 0 0.5em;'; + $txt .= '}'; + + $txt .= '.success h1,'; + $txt .= '.notice h1,'; + $txt .= 'div.error h1 {'; + $txt .= ' border-bottom: 2px solid;'; + $txt .= ' font-weight: bold;'; + $txt .= ' text-align: ;'; + $txt .= ' margin: 0 0 .2em 0;'; + $txt .= '}'; + + $txt .= 'div.success,'; + $txt .= 'div.notice,'; + $txt .= 'div.error {'; + $txt .= ' margin: .5em 0 0.5em;'; + $txt .= ' border: 1px solid;'; + $txt .= ' background-repeat: no-repeat;'; + $txt .= ' '; + $txt .= ' background-position: 10px 50%;'; + $txt .= ' padding: 10px 10px 10px 10px;'; + $txt .= ' '; + $txt .= ' background-position: 99% 50%;'; + $txt .= ' padding: 10px 35px 10px 10px;'; + $txt .= ' '; + + $txt .= ' -moz-border-radius: 5px;'; + $txt .= ' -webkit-border-radius: 5px;'; + $txt .= ' border-radius: 5px;'; + + $txt .= ' -moz-box-shadow: 0 1px 1px #fff inset;'; + $txt .= ' -webkit-box-shadow: 0 1px 1px #fff inset;'; + $txt .= ' box-shadow: 0 1px 1px #fff inset;'; + $txt .= '}'; + + $txt .= '.success a,'; + $txt .= '.notice a,'; + $txt .= '.error a {'; + $txt .= ' text-decoration: underline;'; + $txt .= '}'; + + $txt .= '.success {'; + $txt .= ' color: #000;'; + $txt .= ' background-color: #ebf8a4;'; + $txt .= '}'; + + $txt .= 'h1.success,'; + $txt .= 'div.success {'; + $txt .= ' border-color: #a2d246;'; + $txt .= '}'; + $txt .= '.success h1 {'; + $txt .= ' border-color: #00FF00;'; + $txt .= '}'; + + $txt .= '.notice {'; + $txt .= ' color: #000;'; + $txt .= ' background-color: #e8eef1;'; + $txt .= '}'; + + $txt .= 'h1.notice,'; + $txt .= 'div.notice {'; + $txt .= ' border-color: #3a6c7e;'; + $txt .= '}'; + + $txt .= '.notice h1 {'; + $txt .= ' border-color: #ffb10a;'; + $txt .= '}'; + + $txt .= '.error {'; + $txt .= ' border: 1px solid maroon !important;'; + $txt .= ' color: #000;'; + $txt .= ' background: pink;'; + $txt .= '}'; + + $txt .= 'h1.error,'; + $txt .= 'div.error {'; + $txt .= ' border-color: #333;'; + $txt .= '}'; + + $txt .= 'div.error h1 {'; + $txt .= ' border-color: #ff0000;'; + $txt .= '}'; + + $txt .= '.confirmation {'; + $txt .= ' color: #000;'; + $txt .= ' background-color: pink;'; + $txt .= '}'; + + $txt .= 'fieldset.confirmation {'; + $txt .= '}'; + + $txt .= 'fieldset.confirmation legend {'; + $txt .= '}'; + + /* end messageboxes */ + + $txt .= '.new_central_col{'; + $txt .= ' width: 100%;'; + $txt .= '}'; + + $txt .= '.tblcomment {'; + $txt .= ' font-size: 70%;'; + $txt .= ' font-weight: normal;'; + $txt .= ' color: #000099;'; + $txt .= '}'; + + $txt .= '.tblHeaders {'; + $txt .= ' font-weight: bold;'; + $txt .= ' color: ;'; + $txt .= ' background: ;'; + $txt .= '}'; + + $txt .= 'div.tools,'; + $txt .= '.tblFooters {'; + $txt .= ' font-weight: normal;'; + $txt .= ' color: ;'; + $txt .= ' background: ;'; + $txt .= '}'; + + $txt .= '.tblHeaders a:link,'; + $txt .= '.tblHeaders a:active,'; + $txt .= '.tblHeaders a:visited,'; + $txt .= 'div.tools a:link,'; + $txt .= 'div.tools a:visited,'; + $txt .= 'div.tools a:active,'; + $txt .= '.tblFooters a:link,'; + $txt .= '.tblFooters a:active,'; + $txt .= '.tblFooters a:visited {'; + $txt .= ' color: #0000FF;'; + $txt .= '}'; + + $txt .= '.tblHeaders a:hover,'; + $txt .= 'div.tools a:hover,'; + $txt .= '.tblFooters a:hover {'; + $txt .= ' color: #FF0000;'; + $txt .= '}'; + + /* forbidden, no privileges */ + $txt .= '.noPrivileges {'; + $txt .= ' color: #FF0000;'; + $txt .= ' font-weight: bold;'; + $txt .= '}'; + + /* disabled text */ + $txt .= '.disabled,'; + $txt .= '.disabled a:link,'; + $txt .= '.disabled a:active,'; + $txt .= '.disabled a:visited {'; + $txt .= ' color: #666;'; + $txt .= '}'; + + $txt .= '.disabled a:hover {'; + $txt .= ' color: #666;'; + $txt .= ' text-decoration: none;'; + $txt .= '}'; + + $txt .= 'tr.disabled td,'; + $txt .= 'td.disabled {'; + $txt .= ' background-color: ;'; + $txt .= ' color: #aaa;'; + $txt .= '}'; + + $txt .= '.nowrap {'; + $txt .= ' white-space: nowrap;'; + $txt .= '}'; + + /** + * login form + */ + $txt .= 'body#loginform h1,'; + $txt .= 'body#loginform a.logo {'; + $txt .= ' display: block;'; + $txt .= ' text-align: center;'; + $txt .= '}'; + + $txt .= 'body#loginform {'; + $txt .= ' margin-top: 1em;'; + $txt .= ' text-align: center;'; + $txt .= '}'; + + $txt .= 'body#loginform div.container {'; + $txt .= ' text-align: ;'; + $txt .= ' width: 30em;'; + $txt .= ' margin: 0 auto;'; + $txt .= '}'; + + $txt .= 'form.login label {'; + $txt .= ' float: ;'; + $txt .= ' width: 10em;'; + $txt .= ' font-weight: bolder;'; + $txt .= '}'; + + $txt .= 'form.login input[type=text],'; + $txt .= 'form.login input[type=password],'; + $txt .= 'form.login select {'; + $txt .= ' box-sizing: border-box;'; + $txt .= ' width: 14em;'; + $txt .= '}'; + + $txt .= '.commented_column {'; + $txt .= ' border-bottom: 1px dashed #000;'; + $txt .= '}'; + + $txt .= '.column_attribute {'; + $txt .= ' font-size: 70%;'; + $txt .= '}'; + + $txt .= '.cfg_dbg_demo{'; + $txt .= ' margin: 0.5em 1em 0.5em 1em;'; + $txt .= '}'; + + $txt .= '.central_columns_navigation{'; + $txt .= ' padding:1.5% 0em !important;'; + $txt .= '}'; + + $txt .= '.central_columns_add_column{'; + $txt .= ' display:inline-block;'; + $txt .= ' margin-left:1%;'; + $txt .= ' max-width:50%'; + $txt .= '}'; + + $txt .= '.message_errors_found{'; + $txt .= ' margin-top: 20px;'; + $txt .= '}'; + + $txt .= '.repl_gui_skip_err_cnt{'; + $txt .= ' width: 30px;'; + $txt .= '}'; + + $txt .= '.font_weight_bold{'; + $txt .= ' font-weight: bold;'; + $txt .= '}'; + + $txt .= '.color_gray{'; + $txt .= ' color: gray;'; + $txt .= '}'; + + $txt .= '.pma_sliding_message{'; + $txt .= ' display: inline-block;'; + $txt .= '}'; + + /******************************************************************************/ + /* specific elements */ + + /* topmenu */ + $txt .= '#topmenu a {'; + $txt .= ' text-shadow: 0 1px 0 #fff;'; + $txt .= '}'; + + $txt .= '#topmenu .error {'; + $txt .= ' background: #eee;border: 0 !important;color: #aaa;'; + $txt .= '}'; + + $txt .= 'ul#topmenu,'; + $txt .= 'ul#topmenu2,'; + $txt .= 'ul.tabs {'; + $txt .= ' font-weight: bold;'; + $txt .= ' list-style-type: none;'; + $txt .= ' margin: 0;'; + $txt .= ' padding: 0;'; + $txt .= '}'; + + $txt .= 'ul#topmenu2 {'; + $txt .= ' margin: .25em .5em 0;'; + $txt .= ' height: 2em;'; + $txt .= ' clear: both;'; + $txt .= '}'; + + $txt .= 'ul#topmenu li,'; + $txt .= 'ul#topmenu2 li {'; + $txt .= ' float: ;'; + $txt .= ' margin: 0;'; + $txt .= ' vertical-align: middle;'; + $txt .= '}'; + + $txt .= '#topmenu img,'; + $txt .= '#topmenu2 img {'; + $txt .= ' margin-right: .5em;'; + $txt .= ' vertical-align: -3px;'; + $txt .= '}'; + + $txt .= '.menucontainer {'; + $txt .= ' getCssGradient(\'dddddd\', \'dcdcdc\'); ?>'; + $txt .= ' border-top: 1px solid #aaa;'; + $txt .= '}'; + + $txt .= '.scrollindicator {'; + $txt .= ' display: none;'; + $txt .= '}'; + + /* default tab styles */ + $txt .= '.tabactive {'; + $txt .= ' background: #fff !important;'; + $txt .= '}'; + + $txt .= 'ul#topmenu2 a {'; + $txt .= ' display: block;'; + $txt .= ' margin: 7px 6px 7px;'; + $txt .= ' margin-: 0;'; + $txt .= ' padding: 4px 10px;'; + $txt .= ' white-space: nowrap;'; + $txt .= ' border: 1px solid #ddd;'; + $txt .= ' border-radius: 20px;'; + $txt .= ' -moz-border-radius: 20px;'; + $txt .= ' -webkit-border-radius: 20px;'; + $txt .= ' background: #f2f2f2;'; + + $txt .= '}'; + + $txt .= 'span.caution {'; + $txt .= ' color: #FF0000;'; + $txt .= '}'; + $txt .= 'span.success {'; + $txt .= ' color: green;'; + $txt .= '}'; + $txt .= 'fieldset.caution a {'; + $txt .= ' color: #FF0000;'; + $txt .= '}'; + $txt .= 'fieldset.caution a:hover {'; + $txt .= ' color: #fff;'; + $txt .= ' background-color: #FF0000;'; + $txt .= '}'; + + $txt .= '#topmenu {'; + $txt .= ' margin-top: .5em;'; + $txt .= ' padding: .1em .3em;'; + $txt .= '}'; + + $txt .= 'ul#topmenu ul {'; + $txt .= ' -moz-box-shadow: 1px 1px 6px #ddd;'; + $txt .= ' -webkit-box-shadow: 2px 2px 3px #666;'; + $txt .= ' box-shadow: 2px 2px 3px #666;'; + $txt .= '}'; + + $txt .= 'ul#topmenu ul.only {'; + $txt .= ' : 0;'; + $txt .= '}'; + + $txt .= 'ul#topmenu > li {'; + $txt .= ' border-right: 1px solid #fff;'; + $txt .= ' border-left: 1px solid #ccc;'; + $txt .= ' border-bottom: 1px solid #ccc;'; + $txt .= '}'; + + $txt .= 'ul#topmenu > li:first-child {'; + $txt .= ' border-left: 0;'; + $txt .= '}'; + + /* default tab styles */ + $txt .= 'ul#topmenu a,'; + $txt .= 'ul#topmenu span {'; + $txt .= ' padding: .6em;'; + $txt .= '}'; + + $txt .= 'ul#topmenu ul a {'; + $txt .= ' border-width: 1pt 0 0 0;'; + $txt .= ' -moz-border-radius: 0;'; + $txt .= ' -webkit-border-radius: 0;'; + $txt .= ' border-radius: 0;'; + $txt .= '}'; + + $txt .= 'ul#topmenu ul li:first-child a {'; + $txt .= ' border-width: 0;'; + $txt .= '}'; + + /* enabled hover/active tabs */ + $txt .= 'ul#topmenu > li > a:hover,'; + $txt .= 'ul#topmenu > li > .tabactive {'; + $txt .= ' text-decoration: none;'; + $txt .= '}'; + + $txt .= 'ul#topmenu ul a:hover,'; + $txt .= 'ul#topmenu ul .tabactive {'; + $txt .= ' text-decoration: none;'; + $txt .= '}'; + + $txt .= 'ul#topmenu a.tab:hover,'; + $txt .= 'ul#topmenu .tabactive {'; + $txt .= ' /* background-color: ; */'; + $txt .= '}'; + + $txt .= 'ul#topmenu2 a.tab:hover,'; + $txt .= 'ul#topmenu2 a.tabactive {'; + $txt .= ' background-color: ;'; + $txt .= ' border-radius: .3em;'; + $txt .= ' -moz-border-radius: .3em;'; + $txt .= ' -webkit-border-radius: .3em;'; + $txt .= ' text-decoration: none;'; + $txt .= '}'; + + /* to be able to cancel the bottom border, use
  • */ + $txt .= 'ul#topmenu > li.active {'; + $txt .= ' /* border-bottom: 0pt solid ; */'; + $txt .= ' border-right: 0;'; + $txt .= ' border-bottom-color: #fff;'; + $txt .= '}'; + /* end topmenu */ + + /* zoom search */ + $txt .= 'div#dataDisplay input,'; + $txt .= 'div#dataDisplay select {'; + $txt .= ' margin: 0;'; + $txt .= ' margin-: .5em;'; + $txt .= '}'; + $txt .= 'div#dataDisplay th {'; + $txt .= ' line-height: 2em;'; + $txt .= '}'; + $txt .= 'table#tableFieldsId {'; + $txt .= ' width: 100%;'; + $txt .= '}'; + + /* Calendar */ + $txt .= 'table.calendar {'; + $txt .= ' width: 100%;'; + $txt .= '}'; + $txt .= 'table.calendar td {'; + $txt .= ' text-align: center;'; + $txt .= '}'; + $txt .= 'table.calendar td a {'; + $txt .= ' display: block;'; + $txt .= '}'; + + $txt .= 'table.calendar td a:hover {'; + $txt .= ' background-color: #CCFFCC;'; + $txt .= '}'; + + $txt .= 'table.calendar th {'; + $txt .= ' background-color: #D3DCE3;'; + $txt .= '}'; + + $txt .= 'table.calendar td.selected {'; + $txt .= ' background-color: #FFCC99;'; + $txt .= '}'; + + $txt .= 'img.calendar {'; + $txt .= ' border: none;'; + $txt .= '}'; + $txt .= 'form.clock {'; + $txt .= ' text-align: center;'; + $txt .= '}'; + /* end Calendar */ + + /* table stats */ + $txt .= 'div#tablestatistics table {'; + $txt .= ' float: ;'; + $txt .= ' margin-bottom: .5em;'; + $txt .= ' margin-: 1.5em;'; + $txt .= ' margin-top: .5em;'; + $txt .= ' min-width: 16em;'; + $txt .= '}'; + + /* end table stats */ + + /* server privileges */ + $txt .= '#tableuserrights td,'; + $txt .= '#tablespecificuserrights td,'; + $txt .= '#tabledatabases td {'; + $txt .= ' vertical-align: middle;'; + $txt .= '}'; + /* end server privileges */ + + /* Heading */ + $txt .= '#topmenucontainer {'; + $txt .= ' padding-: 1em;'; + $txt .= ' width: 100%;'; + $txt .= '}'; + + $txt .= '#serverinfo {'; + $txt .= ' background: ;'; + $txt .= ' padding: .3em .9em;'; + $txt .= ' padding-: 2.2em;'; + // $txt .= ' text-shadow: 0 1px 0 #000;'; + $txt .= ' max-width: 100%;'; + $txt .= ' max-height: 16px;'; + $txt .= ' overflow: hidden;'; + $txt .= '}'; + + $txt .= '#serverinfo .item {'; + $txt .= ' white-space: nowrap;'; + $txt .= ' color: #fff;'; + $txt .= '}'; + + $txt .= '#page_nav_icons {'; + $txt .= ' position: fixed;'; + $txt .= ' top: 0;'; + $txt .= ' : 0;'; + $txt .= ' z-index: 99;'; + $txt .= ' padding: .25em 0;'; + $txt .= '}'; + + $txt .= '#goto_pagetop, #lock_page_icon, #page_settings_icon {'; + $txt .= ' padding: .25em;'; + $txt .= ' background: ;;'; + $txt .= '}'; + + $txt .= '#page_settings_icon {'; + $txt .= ' cursor: pointer;'; + $txt .= ' display: none;'; + $txt .= '}'; + + $txt .= '#page_settings_modal {'; + $txt .= ' display: none;'; + $txt .= '}'; + + $txt .= '#pma_navigation_settings {'; + $txt .= ' display: none;'; + $txt .= '}'; + + $txt .= '#span_table_comment {'; + $txt .= ' font-weight: bold;'; + $txt .= ' font-style: italic;'; + $txt .= ' white-space: nowrap;'; + $txt .= ' margin-left: 10px;'; + $txt .= ' color: #D6D6D6;'; + $txt .= ' text-shadow: none;'; + $txt .= '}'; + + $txt .= '#serverinfo img {'; + $txt .= ' margin: 0 .1em 0;'; + $txt .= ' margin-: .2em;'; + $txt .= '}'; + + $txt .= '#textSQLDUMP {'; + $txt .= ' width: 95%;'; + $txt .= ' height: 95%;'; + $txt .= ' font-family: Consolas, "Courier New", Courier, mono;'; + $txt .= ' font-size: 110%;'; + $txt .= '}'; + + $txt .= '#TooltipContainer {'; + $txt .= ' position: absolute;'; + $txt .= ' z-index: 99;'; + $txt .= ' width: 20em;'; + $txt .= ' height: auto;'; + $txt .= ' overflow: visible;'; + $txt .= ' visibility: hidden;'; + $txt .= ' background-color: #ffffcc;'; + $txt .= ' color: #006600;'; + $txt .= ' border: .1em solid #000;'; + $txt .= ' padding: .5em;'; + $txt .= '}'; + + /* user privileges */ + $txt .= '#fieldset_add_user_login div.item {'; + $txt .= ' border-bottom: 1px solid silver;'; + $txt .= ' padding-bottom: .3em;'; + $txt .= ' margin-bottom: .3em;'; + $txt .= '}'; + + $txt .= '#fieldset_add_user_login label {'; + $txt .= ' float: ;'; + $txt .= ' display: block;'; + $txt .= ' width: 10em;'; + $txt .= ' max-width: 100%;'; + $txt .= ' text-align: ;'; + $txt .= ' padding-: .5em;'; + $txt .= '}'; + + $txt .= '#fieldset_add_user_login span.options #select_pred_username,'; + $txt .= '#fieldset_add_user_login span.options #select_pred_hostname,'; + $txt .= '#fieldset_add_user_login span.options #select_pred_password {'; + $txt .= ' width: 100%;'; + $txt .= ' max-width: 100%;'; + $txt .= '}'; + + $txt .= '#fieldset_add_user_login span.options {'; + $txt .= ' float: ;'; + $txt .= ' display: block;'; + $txt .= ' width: 12em;'; + $txt .= ' max-width: 100%;'; + $txt .= ' padding-: .5em;'; + $txt .= '}'; + + $txt .= '#fieldset_add_user_login input {'; + $txt .= ' width: 12em;'; + $txt .= ' clear: ;'; + $txt .= ' max-width: 100%;'; + $txt .= '}'; + + $txt .= '#fieldset_add_user_login span.options input {'; + $txt .= ' width: auto;'; + $txt .= '}'; + + $txt .= '#fieldset_user_priv div.item {'; + $txt .= ' float: ;'; + $txt .= ' width: 9em;'; + $txt .= ' max-width: 100%;'; + $txt .= '}'; + + $txt .= '#fieldset_user_priv div.item div.item {'; + $txt .= ' float: none;'; + $txt .= '}'; + + $txt .= '#fieldset_user_priv div.item label {'; + $txt .= ' white-space: nowrap;'; + $txt .= '}'; + + $txt .= '#fieldset_user_priv div.item select {'; + $txt .= ' width: 100%;'; + $txt .= '}'; + + $txt .= '#fieldset_user_global_rights fieldset {'; + $txt .= ' float: ;'; + $txt .= '}'; + + $txt .= '#fieldset_user_group_rights fieldset {'; + $txt .= ' float: ;'; + $txt .= '}'; + + $txt .= '#fieldset_user_global_rights>legend input {'; + $txt .= ' margin-: 2em;'; + $txt .= '}'; + /* end user privileges */ + + /* serverstatus */ + + $txt .= '.linkElem:hover {'; + $txt .= ' text-decoration: underline;'; + $txt .= ' color: #235a81;'; + $txt .= ' cursor: pointer;'; + $txt .= '}'; + + $txt .= 'h3#serverstatusqueries span {'; + $txt .= ' font-size: 60%;'; + $txt .= ' display: inline;'; + $txt .= '}'; + + $txt .= '.buttonlinks {'; + $txt .= ' float: ;'; + $txt .= ' white-space: nowrap;'; + $txt .= '}'; + + /* Also used for the variables page */ + $txt .= 'fieldset#tableFilter {'; + $txt .= ' padding: 0.1em 1em;'; + $txt .= '}'; + + $txt .= 'div#serverStatusTabs {'; + $txt .= ' margin-top: 1em;'; + $txt .= '}'; + + $txt .= 'caption a.top {'; + $txt .= ' float: ;'; + $txt .= '}'; + + $txt .= 'div#serverstatusquerieschart {'; + $txt .= ' float: ;'; + $txt .= ' width: 500px;'; + $txt .= ' height: 350px;'; + $txt .= ' margin-: 50px;'; + $txt .= '}'; + + $txt .= 'table#serverstatusqueriesdetails,'; + $txt .= 'table#serverstatustraffic {'; + $txt .= ' float: ;'; + $txt .= '}'; + + $txt .= 'table#serverstatusqueriesdetails th {'; + $txt .= ' min-width: 35px;'; + $txt .= '}'; + + $txt .= 'table#serverstatusvariables {'; + $txt .= ' width: 100%;'; + $txt .= ' margin-bottom: 1em;'; + $txt .= '}'; + $txt .= 'table#serverstatusvariables .name {'; + $txt .= ' width: 18em;'; + $txt .= ' white-space: nowrap;'; + $txt .= '}'; + $txt .= 'table#serverstatusvariables .value {'; + $txt .= ' width: 6em;'; + $txt .= '}'; + $txt .= 'table#serverstatusconnections {'; + $txt .= ' float: ;'; + $txt .= ' margin-: 30px;'; + $txt .= '}'; + + $txt .= 'div#serverstatus table tbody td.descr a,'; + $txt .= 'div#serverstatus table .tblFooters a {'; + $txt .= ' white-space: nowrap;'; + $txt .= '}'; + + $txt .= 'div.liveChart {'; + $txt .= ' clear: both;'; + $txt .= ' min-width: 500px;'; + $txt .= ' height: 400px;'; + $txt .= ' padding-bottom: 80px;'; + $txt .= '}'; + + $txt .= '#addChartDialog input[type="text"] {'; + $txt .= ' margin: 0;'; + $txt .= ' padding: 3px;'; + $txt .= '}'; + + $txt .= 'div#chartVariableSettings {'; + $txt .= ' border: 1px solid #ddd;'; + $txt .= ' background-color: #E6E6E6;'; + $txt .= ' margin-left: 10px;'; + $txt .= '}'; + + $txt .= 'table#chartGrid td {'; + $txt .= ' padding: 3px;'; + $txt .= ' margin: 0;'; + $txt .= '}'; + + $txt .= 'table#chartGrid div.monitorChart {'; + $txt .= ' background: #EBEBEB;'; + $txt .= ' overflow: hidden;'; + $txt .= ' border: none;'; + $txt .= '}'; + + $txt .= 'div.tabLinks {'; + $txt .= ' margin-left: 0.3em;'; + $txt .= ' float: ;'; + $txt .= ' padding: 5px 0;'; + $txt .= '}'; + + $txt .= 'div.tabLinks a, div.tabLinks label {'; + $txt .= ' margin-right: 7px;'; + $txt .= '}'; + + $txt .= 'div.tabLinks .icon {'; + $txt .= ' margin: -0.2em 0.3em 0 0;'; + $txt .= '}'; + + $txt .= '.popupContent {'; + $txt .= ' display: none;'; + $txt .= ' position: absolute;'; + $txt .= ' border: 1px solid #CCC;'; + $txt .= ' margin: 0;'; + $txt .= ' padding: 3px;'; + $txt .= ' -moz-box-shadow: 2px 2px 3px #666;'; + $txt .= ' -webkit-box-shadow: 2px 2px 3px #666;'; + $txt .= ' box-shadow: 2px 2px 3px #666;'; + $txt .= ' background-color: #fff;'; + $txt .= ' z-index: 2;'; + $txt .= '}'; + + $txt .= 'div#logTable {'; + $txt .= ' padding-top: 10px;'; + $txt .= ' clear: both;'; + $txt .= '}'; + + $txt .= 'div#logTable table {'; + $txt .= ' width: 100%;'; + $txt .= '}'; + + $txt .= 'div#queryAnalyzerDialog {'; + $txt .= ' min-width: 700px;'; + $txt .= '}'; + + $txt .= 'div#queryAnalyzerDialog div.CodeMirror-scroll {'; + $txt .= ' height: auto;'; + $txt .= '}'; + + $txt .= 'div#queryAnalyzerDialog div#queryProfiling {'; + $txt .= ' height: 300px;'; + $txt .= '}'; + + $txt .= 'div#queryAnalyzerDialog td.explain {'; + $txt .= ' width: 250px;'; + $txt .= '}'; + + $txt .= 'div#queryAnalyzerDialog table.queryNums {'; + $txt .= ' display: none;'; + $txt .= ' border: 0;'; + $txt .= ' text-align: left;'; + $txt .= '}'; + + $txt .= '.smallIndent {'; + $txt .= ' padding-: 7px;'; + $txt .= '}'; + + /* end serverstatus */ + + /* server variables */ + $txt .= '#serverVariables {'; + $txt .= ' width: 100%;'; + $txt .= '}'; + $txt .= '#serverVariables .var-row > td {'; + $txt .= ' line-height: 2em;'; + $txt .= '}'; + $txt .= '#serverVariables .var-header {'; + $txt .= ' color: ;'; + $txt .= ' background: ;'; + $txt .= ' font-weight: bold;'; + $txt .= ' text-align: ;'; + $txt .= '}'; + $txt .= '#serverVariables .var-row {'; + $txt .= ' padding: 0.5em;'; + $txt .= ' min-height: 18px;'; + $txt .= '}'; + $txt .= '#serverVariables .var-name {'; + $txt .= ' font-weight: bold;'; + $txt .= '}'; + $txt .= '#serverVariables .var-name.session {'; + $txt .= ' font-weight: normal;'; + $txt .= ' font-style: italic;'; + $txt .= '}'; + $txt .= '#serverVariables .var-value {'; + $txt .= ' float: ;'; + $txt .= ' text-align: ;'; + $txt .= '}'; + $txt .= '#serverVariables .var-doc {'; + $txt .= ' overflow:visible;'; + $txt .= ' float: ;'; + $txt .= '}'; + + /* server variables editor */ + $txt .= '#serverVariables .editLink {'; + $txt .= ' padding-: 1em;'; + $txt .= ' font-family: sans-serif;'; + $txt .= '}'; + $txt .= '#serverVariables .serverVariableEditor {'; + $txt .= ' width: 100%;'; + $txt .= ' overflow: hidden;'; + $txt .= '}'; + $txt .= '#serverVariables .serverVariableEditor input {'; + $txt .= ' width: 100%;'; + $txt .= ' margin: 0 0.5em;'; + $txt .= ' box-sizing: border-box;'; + $txt .= ' -ms-box-sizing: border-box;'; + $txt .= ' -moz-box-sizing: border-box;'; + $txt .= ' -webkit-box-sizing: border-box;'; + $txt .= ' height: 2.2em;'; + $txt .= '}'; + $txt .= '#serverVariables .serverVariableEditor div {'; + $txt .= ' display: block;'; + $txt .= ' overflow: hidden;'; + $txt .= ' padding-: 1em;'; + $txt .= '}'; + $txt .= '#serverVariables .serverVariableEditor a {'; + $txt .= ' margin: 0 0.5em;'; + $txt .= ' line-height: 2em;'; + $txt .= '}'; + /* end server variables */ + + $txt .= 'p.notice {'; + $txt .= ' margin: 1.5em 0;'; + $txt .= ' border: 1px solid #000;'; + $txt .= ' background-repeat: no-repeat;'; + $txt .= ' '; + $txt .= ' background-position: 10px 50%;'; + $txt .= ' padding: 10px 10px 10px 25px;'; + $txt .= ' '; + $txt .= ' background-position: 99% 50%;'; + $txt .= ' padding: 25px 10px 10px 10px'; + $txt .= ' '; + $txt .= ' -moz-border-radius: 5px;'; + $txt .= ' -webkit-border-radius: 5px;'; + $txt .= ' border-radius: 5px;'; + $txt .= ' -moz-box-shadow: 0 1px 2px #fff inset;'; + $txt .= ' -webkit-box-shadow: 0 1px 2px #fff inset;'; + $txt .= ' box-shadow: 0 1px 2px #fff inset;'; + $txt .= ' background: #555;'; + $txt .= ' color: #d4fb6a;'; + $txt .= '}'; + + $txt .= 'p.notice a {'; + $txt .= ' color: #fff;'; + $txt .= ' text-decoration: underline;'; + $txt .= '}'; + + /* profiling */ + + $txt .= 'div#profilingchart {'; + $txt .= ' width: 850px;'; + $txt .= ' height: 370px;'; + $txt .= ' float: ;'; + $txt .= '}'; + + $txt .= '#profilingchart .jqplot-highlighter-tooltip{'; + $txt .= ' top: auto !important;'; + $txt .= ' left: 11px;'; + $txt .= ' bottom:24px;'; + $txt .= '}'; + /* end profiling */ + + /* table charting */ + $txt .= '#resizer {'; + $txt .= ' border: 1px solid silver;'; + $txt .= '}'; + $txt .= '#inner-resizer { /* make room for the resize handle */'; + $txt .= ' padding: 10px;'; + $txt .= '}'; + $txt .= '.chartOption {'; + $txt .= ' float: ;'; + $txt .= ' margin-: 40px;'; + $txt .= '}'; + /* end table charting */ + + /* querybox */ + + $txt .= '#togglequerybox {'; + $txt .= ' margin: 0 10px;'; + $txt .= '}'; + + $txt .= '#serverstatus h3'; + $txt .= '{'; + $txt .= ' margin: 15px 0;'; + $txt .= ' font-weight: normal;'; + $txt .= ' color: #999;'; + $txt .= ' font-size: 1.7em;'; + $txt .= '}'; + $txt .= '#sectionlinks {'; + $txt .= ' margin-bottom: 15px;'; + $txt .= ' padding: 16px;'; + $txt .= ' background: ;'; + $txt .= ' border: 1px solid #aaa;'; + $txt .= ' border-radius: 5px;'; + $txt .= ' -webkit-border-radius: 5px;'; + $txt .= ' -moz-border-radius: 5px;'; + $txt .= ' box-shadow: 0 1px 1px #fff inset;'; + $txt .= ' -webkit-box-shadow: 0 1px 1px #fff inset;'; + $txt .= ' -moz-box-shadow: 0 1px 1px #fff inset;'; + $txt .= '}'; + $txt .= '#sectionlinks a,'; + $txt .= '.buttonlinks a,'; + $txt .= 'a.button {'; + $txt .= ' font-weight: bold;'; + $txt .= ' text-shadow: 0 1px 0 #fff;'; + $txt .= ' line-height: 35px;'; + $txt .= ' margin-: 7px;'; + $txt .= ' border: 1px solid #aaa;'; + $txt .= ' padding: 3px 7px;'; + $txt .= ' color: #111 !important;'; + $txt .= ' text-decoration: none;'; + $txt .= ' background: #ddd;'; + $txt .= ' white-space: nowrap;'; + $txt .= ' border-radius: 20px;'; + $txt .= ' -webkit-border-radius: 20px;'; + $txt .= ' -moz-border-radius: 20px;'; + $txt .= ' getCssGradient(\'f8f8f8\', \'d8d8d8\'); ?>'; + $txt .= '}'; + $txt .= '#sectionlinks a:hover,'; + $txt .= '.buttonlinks a:hover,'; + $txt .= 'a.button:hover {'; + $txt .= ' getCssGradient(\'ffffff\', \'dddddd\'); ?>'; + $txt .= '}'; + + $txt .= 'div#sqlquerycontainer {'; + $txt .= ' float: ;'; + $txt .= ' width: 69%;'; + $txt .= ' /* height: 15em; */'; + $txt .= '}'; + + $txt .= 'div#tablefieldscontainer {'; + $txt .= ' float: ;'; + $txt .= ' width: 29%;'; + $txt .= ' margin-top: -20px;'; + $txt .= ' /* height: 15em; */'; + $txt .= '}'; + + $txt .= 'div#tablefieldscontainer select {'; + $txt .= ' width: 100%;'; + $txt .= ' background: #fff;'; + $txt .= ' /* height: 12em; */'; + $txt .= '}'; + + $txt .= 'textarea#sqlquery {'; + $txt .= ' width: 100%;'; + $txt .= ' /* height: 100%; */'; + $txt .= ' -moz-border-radius: 4px;'; + $txt .= ' -webkit-border-radius: 4px;'; + $txt .= ' border-radius: 4px;'; + $txt .= ' border: 1px solid #aaa;'; + $txt .= ' padding: 5px;'; + $txt .= ' font-family: inherit;'; + $txt .= '}'; + $txt .= 'textarea#sql_query_edit {'; + $txt .= ' height: 7em;'; + $txt .= ' width: 95%;'; + $txt .= ' display: block;'; + $txt .= '}'; + $txt .= 'div#queryboxcontainer div#bookmarkoptions {'; + $txt .= ' margin-top: .5em;'; + $txt .= '}'; + /* end querybox */ + + /* main page */ + $txt .= '#maincontainer {'; + $txt .= ' /* background-image: url(getImgPath(\'logo_right.png\');?>); */'; + $txt .= ' /* background-position: bottom; */'; + $txt .= ' /* background-repeat: no-repeat; */'; + $txt .= '}'; + + $txt .= '#mysqlmaininformation,'; + $txt .= '#pmamaininformation {'; + $txt .= ' float: ;'; + $txt .= ' width: 49%;'; + $txt .= '}'; + + $txt .= '#maincontainer ul {'; + $txt .= ' list-style-type: disc;'; + $txt .= ' vertical-align: middle;'; + $txt .= '}'; + + $txt .= '#maincontainer li {'; + $txt .= ' margin-bottom: .3em;'; + $txt .= '}'; + + $txt .= '#full_name_layer {'; + $txt .= ' position: absolute;'; + $txt .= ' padding: 2px;'; + $txt .= ' margin-top: -3px;'; + $txt .= ' z-index: 801;'; + + $txt .= ' border-radius: 3px;'; + $txt .= ' border: solid 1px ;;'; + $txt .= ' background: #fff;'; + + $txt .= '}'; + /* end main page */ + + /* iconic view for ul items */ + + $txt .= 'li.no_bullets {'; + $txt .= ' list-style-type:none !important;'; + $txt .= ' margin-left: -25px !important; //align with other list items which have bullets'; + $txt .= '}'; + + /* end iconic view for ul items */ + + $txt .= '#body_browse_foreigners {'; + $txt .= ' background: ;'; + $txt .= ' margin: .5em .5em 0 .5em;'; + $txt .= '}'; + + $txt .= '#bodythemes {'; + $txt .= ' width: 500px;'; + $txt .= ' margin: auto;'; + $txt .= ' text-align: center;'; + $txt .= '}'; + + $txt .= '#bodythemes img {'; + $txt .= ' border: .1em solid #000;'; + $txt .= '}'; + + $txt .= '#bodythemes a:hover img {'; + $txt .= ' border: .1em solid red;'; + $txt .= '}'; + + $txt .= '#fieldset_select_fields {'; + $txt .= ' float: ;'; + $txt .= '}'; + + $txt .= '#selflink {'; + $txt .= ' clear: both;'; + $txt .= ' display: block;'; + $txt .= ' margin-top: 1em;'; + $txt .= ' margin-bottom: 1em;'; + $txt .= ' width: 98%;'; + $txt .= ' margin-: 1%;'; + $txt .= ' border-top: .1em solid silver;'; + $txt .= ' text-align: ;'; + $txt .= '}'; + + $txt .= '#table_innodb_bufferpool_usage,'; + $txt .= '#table_innodb_bufferpool_activity {'; + $txt .= ' float: ;'; + $txt .= '}'; + + $txt .= '#div_mysql_charset_collations table {'; + $txt .= ' float: ;'; + $txt .= '}'; + + $txt .= '#div_mysql_charset_collations table th,'; + $txt .= '#div_mysql_charset_collations table td {'; + $txt .= ' padding: 0.4em;'; + $txt .= '}'; + + $txt .= '#div_mysql_charset_collations table th#collationHeader {'; + $txt .= ' width: 35%;'; + $txt .= '}'; + + $txt .= '#qbe_div_table_list {'; + $txt .= ' float: ;'; + $txt .= '}'; + + $txt .= '#qbe_div_sql_query {'; + $txt .= ' float: ;'; + $txt .= '}'; + + $txt .= 'label.desc {'; + $txt .= ' width: 30em;'; + $txt .= ' float: ;'; + $txt .= '}'; + + $txt .= 'label.desc sup {'; + $txt .= ' position: absolute;'; + $txt .= '}'; + + $txt .= 'code.php {'; + $txt .= ' display: block;'; + $txt .= ' padding-left: 1em;'; + $txt .= ' margin-top: 0;'; + $txt .= ' margin-bottom: 0;'; + $txt .= ' max-height: 10em;'; + $txt .= ' overflow: auto;'; + $txt .= ' direction: ltr;'; + $txt .= '}'; + + $txt .= 'code.sql,'; + $txt .= 'div.sqlvalidate {'; + $txt .= ' display: block;'; + $txt .= ' padding: 1em;'; + $txt .= ' margin-top: 0;'; + $txt .= ' margin-bottom: 0;'; + $txt .= ' max-height: 10em;'; + $txt .= ' overflow: auto;'; + $txt .= ' direction: ltr;'; + $txt .= '}'; + + $txt .= '.result_query div.sqlOuter {'; + $txt .= ' background: ;'; + $txt .= ' text-align: ;'; + $txt .= '}'; + + $txt .= '.result_query .success, .result_query .error {'; + $txt .= ' margin-bottom: 0;'; + $txt .= ' border-bottom: none !important;'; + $txt .= ' border-bottom-left-radius: 0;'; + $txt .= ' border-bottom-right-radius: 0;'; + $txt .= ' padding-bottom: 5px;'; + $txt .= '}'; + + $txt .= '#PMA_slidingMessage code.sql,'; + $txt .= 'div.sqlvalidate {'; + $txt .= ' background: ;'; + $txt .= '}'; + + $txt .= '#main_pane_left {'; + $txt .= ' width: 60%;'; + $txt .= ' min-width: 260px;'; + $txt .= ' float: ;'; + $txt .= ' padding-top: 1em;'; + $txt .= '}'; + + $txt .= '#main_pane_right {'; + $txt .= ' overflow: hidden;'; + $txt .= ' min-width: 160px;'; + $txt .= ' padding-top: 1em;'; + $txt .= ' padding-: 1em;'; + $txt .= ' padding-: .5em;'; + $txt .= '}'; + + $txt .= '.group {'; + + $txt .= ' border: 1px solid #999;'; + $txt .= ' background: ;'; + $txt .= ' -moz-border-radius: 4px;'; + $txt .= ' -webkit-border-radius: 4px;'; + $txt .= ' border-radius: 4px;'; + $txt .= ' margin-bottom: 1em;'; + $txt .= ' padding-bottom: 1em;'; + $txt .= '}'; + + $txt .= '.group h2 {'; + $txt .= ' background-color: #bbb;'; + $txt .= ' padding: .1em .3em;'; + $txt .= ' margin-top: 0;'; + $txt .= ' color: #fff;'; + $txt .= ' font-size: 1.6em;'; + $txt .= ' font-weight: normal;'; + $txt .= ' text-shadow: 0 1px 0 #777;'; + $txt .= ' -moz-box-shadow: 1px 1px 15px #999 inset;'; + $txt .= ' -webkit-box-shadow: 1px 1px 15px #999 inset;'; + $txt .= ' box-shadow: 1px 1px 15px #999 inset;'; + $txt .= '}'; + + $txt .= '.group-cnt {'; + $txt .= ' padding: 0;'; + $txt .= ' padding-: .5em;'; + $txt .= ' display: inline-block;'; + $txt .= ' width: 98%;'; + $txt .= '}'; + + $txt .= 'textarea#partitiondefinition {'; + $txt .= ' height: 3em;'; + $txt .= '}'; + + /* for elements that should be revealed only via js */ + $txt .= '.hide {'; + $txt .= ' display: none;'; + $txt .= '}'; + + $txt .= '#list_server {'; + $txt .= ' list-style-type: none;'; + $txt .= ' padding: 0;'; + $txt .= '}'; + + /**'; + $txt .= ' * Progress bar styles'; + $txt .= ' */ + $txt .= 'div.upload_progress'; + $txt .= '{'; + $txt .= ' width: 400px;'; + $txt .= ' margin: 3em auto;'; + $txt .= ' text-align: center;'; + $txt .= '}'; + + $txt .= 'div.upload_progress_bar_outer'; + $txt .= '{'; + $txt .= ' border: 1px solid #000;'; + $txt .= ' width: 202px;'; + $txt .= ' position: relative;'; + $txt .= ' margin: 0 auto 1em;'; + $txt .= ' color: ;'; + $txt .= '}'; + + $txt .= 'div.upload_progress_bar_inner'; + $txt .= '{'; + $txt .= ' background-color: ;'; + $txt .= ' width: 0;'; + $txt .= ' height: 12px;'; + $txt .= ' margin: 1px;'; + $txt .= ' overflow: hidden;'; + $txt .= ' color: ;'; + $txt .= ' position: relative;'; + $txt .= '}'; + + $txt .= 'div.upload_progress_bar_outer div.percentage'; + $txt .= '{'; + $txt .= ' position: absolute;'; + $txt .= ' top: 0;'; + $txt .= ' : 0;'; + $txt .= ' width: 202px;'; + $txt .= '}'; + + $txt .= 'div.upload_progress_bar_inner div.percentage'; + $txt .= '{'; + $txt .= ' top: -1px;'; + $txt .= ' : -1px;'; + $txt .= '}'; + + $txt .= 'div#statustext {'; + $txt .= ' margin-top: .5em;'; + $txt .= '}'; + + $txt .= 'table#serverconnection_src_remote,'; + $txt .= 'table#serverconnection_trg_remote,'; + $txt .= 'table#serverconnection_src_local,'; + $txt .= 'table#serverconnection_trg_local {'; + $txt .= ' float: ;'; + $txt .= '}'; + /** + * Validation error message styles + */ + $txt .= 'input[type=text].invalid_value,'; + $txt .= 'input[type=password].invalid_value,'; + $txt .= 'input[type=number].invalid_value,'; + $txt .= 'input[type=date].invalid_value,'; + $txt .= 'select.invalid_value,'; + $txt .= '.invalid_value {'; + $txt .= ' background: #FFCCCC;'; + $txt .= '}'; + + /** + * Ajax notification styling + */ + $txt .= '.ajax_notification {'; + $txt .= ' top: 0; /** The notification needs to be shown on the top of the page */'; + $txt .= ' position: fixed;'; + $txt .= ' margin-top: 0;'; + $txt .= ' margin-right: auto;'; + $txt .= ' margin-bottom: 0;'; + $txt .= ' margin-: auto;'; + $txt .= ' padding: 5px; /** Keep a little space on the sides of the text */'; + $txt .= ' width: 350px;'; + + $txt .= ' z-index: 1100; /** If this is not kept at a high z-index, the jQueryUI modal dialogs (z-index: 1000) might hide this */'; + $txt .= ' text-align: center;'; + $txt .= ' display: inline;'; + $txt .= ' left: 0;'; + $txt .= ' right: 0;'; + $txt .= ' background-image: url(getImgPath(\'ajax_clock_small.gif\');?>);'; + $txt .= ' background-repeat: no-repeat;'; + $txt .= ' background-position: 2%;'; + $txt .= ' border: 1px solid #e2b709;'; + $txt .= '}'; + + /* additional styles */ + $txt .= '.ajax_notification {'; + $txt .= ' margin-top: 200px;'; + $txt .= ' background: #ffe57e;'; + $txt .= ' border-radius: 5px;'; + $txt .= ' -moz-border-radius: 5px;'; + $txt .= ' -webkit-border-radius: 5px;'; + $txt .= ' box-shadow: 0 5px 90px ;;'; + $txt .= ' -moz-box-shadow: 0 5px 90px ;;'; + $txt .= ' -webkit-box-shadow: 0 5px 90px ;;'; + $txt .= '}'; + + $txt .= '#loading_parent {'; + $txt .= ' /** Need this parent to properly center the notification division */'; + $txt .= ' position: relative;'; + $txt .= ' width: 100%;'; + $txt .= ' }'; + /** + * Export and Import styles + */ + + $txt .= '.export_table_list_container {'; + $txt .= ' display: inline-block;'; + $txt .= ' max-height: 20em;'; + $txt .= ' overflow-y: scroll;'; + $txt .= '}'; + + $txt .= '.export_table_select th {'; + $txt .= ' text-align: center;'; + $txt .= ' vertical-align: middle;'; + $txt .= '}'; + + $txt .= '.export_table_select .all {'; + $txt .= ' font-weight: bold;'; + $txt .= ' border-bottom: 1px solid black;'; + $txt .= '}'; + + $txt .= '.export_structure, .export_data {'; + $txt .= ' text-align: center;'; + $txt .= '}'; + + $txt .= '.export_table_name {'; + $txt .= ' vertical-align: middle;'; + $txt .= '}'; + + $txt .= '.exportoptions h2 {'; + $txt .= ' word-wrap: break-word;'; + $txt .= '}'; + + $txt .= '.exportoptions h3,'; + $txt .= '.importoptions h3 {'; + $txt .= ' border-bottom: 1px #999 solid;'; + $txt .= ' font-size: 110%;'; + $txt .= '}'; + + $txt .= '.exportoptions ul,'; + $txt .= '.importoptions ul,'; + $txt .= '.format_specific_options ul {'; + $txt .= ' list-style-type: none;'; + $txt .= ' margin-bottom: 15px;'; + $txt .= '}'; + + $txt .= '.exportoptions li,'; + $txt .= '.importoptions li {'; + $txt .= ' margin: 7px;'; + $txt .= '}'; + $txt .= '.exportoptions label,'; + $txt .= '.importoptions label,'; + $txt .= '.exportoptions p,'; + $txt .= '.importoptions p {'; + $txt .= ' margin: 5px;'; + $txt .= ' float: none;'; + $txt .= '}'; + + $txt .= '#csv_options label.desc,'; + $txt .= '#ldi_options label.desc,'; + $txt .= '#latex_options label.desc,'; + $txt .= '#output label.desc {'; + $txt .= ' float: ;'; + $txt .= ' width: 15em;'; + $txt .= '}'; + + $txt .= '.exportoptions,'; + $txt .= '.importoptions {'; + $txt .= ' margin: 20px 30px 30px;'; + $txt .= ' margin-: 10px;'; + $txt .= '}'; + + $txt .= '.exportoptions #buttonGo,'; + $txt .= '.importoptions #buttonGo {'; + $txt .= ' font-weight: bold;'; + $txt .= ' margin-: 14px;'; + $txt .= ' border: 1px solid #aaa;'; + $txt .= ' padding: 5px 12px;'; + $txt .= ' color: #111;'; + $txt .= ' text-decoration: none;'; + + $txt .= ' border-radius: 12px;'; + $txt .= ' -webkit-border-radius: 12px;'; + $txt .= ' -moz-border-radius: 12px;'; + + $txt .= ' text-shadow: 0 1px 0 #fff;'; + + $txt .= ' getCssGradient(\'ffffff\', \'cccccc\'); ?>'; + $txt .= ' cursor: pointer;'; + $txt .= '}'; + + $txt .= '.format_specific_options h3 {'; + $txt .= ' margin: 10px 0 0;'; + $txt .= ' margin-: 10px;'; + $txt .= ' border: 0;'; + $txt .= '}'; + + $txt .= '.format_specific_options {'; + $txt .= ' border: 1px solid #999;'; + $txt .= ' margin: 7px 0;'; + $txt .= ' padding: 3px;'; + $txt .= '}'; + + $txt .= 'p.desc {'; + $txt .= ' margin: 5px;'; + $txt .= '}'; + + /** + * Export styles only + */ + $txt .= 'select#db_select,'; + $txt .= 'select#table_select {'; + $txt .= ' width: 400px;'; + $txt .= '}'; + + $txt .= '.export_sub_options {'; + $txt .= ' margin: 20px 0 0;'; + $txt .= ' margin-: 30px;'; + $txt .= '}'; + + $txt .= '.export_sub_options h4 {'; + $txt .= ' border-bottom: 1px #999 solid;'; + $txt .= '}'; + + $txt .= '.export_sub_options li.subgroup {'; + $txt .= ' display: inline-block;'; + $txt .= ' margin-top: 0;'; + $txt .= '}'; + + $txt .= '.export_sub_options li {'; + $txt .= ' margin-bottom: 0;'; + $txt .= '}'; + $txt .= '#export_refresh_form {'; + $txt .= ' margin-left: 20px;'; + $txt .= '}'; + $txt .= '#export_back_button {'; + $txt .= ' display: inline;'; + $txt .= '}'; + $txt .= '#output_quick_export {'; + $txt .= ' display: none;'; + $txt .= '}'; + /** + * Import styles only + */ + + $txt .= '.importoptions #import_notification {'; + $txt .= ' margin: 10px 0;'; + $txt .= ' font-style: italic;'; + $txt .= '}'; + + $txt .= 'input#input_import_file {'; + $txt .= ' margin: 5px;'; + $txt .= '}'; + + $txt .= '.formelementrow {'; + $txt .= ' margin: 5px 0 5px 0;'; + $txt .= '}'; + + $txt .= '#filterText {'; + $txt .= ' vertical-align: baseline;'; + $txt .= '}'; + + $txt .= '#popup_background {'; + $txt .= ' display: none;'; + $txt .= ' position: fixed;'; + $txt .= ' _position: absolute; /* hack for IE6 */'; + $txt .= ' width: 100%;'; + $txt .= ' height: 100%;'; + $txt .= ' top: 0;'; + $txt .= ' : 0;'; + $txt .= ' background: #000;'; + $txt .= ' z-index: 1000;'; + $txt .= ' overflow: hidden;'; + $txt .= '}'; + + /** + * Table structure styles + */ + $txt .= '#fieldsForm ul.table-structure-actions {'; + $txt .= ' margin: 0;'; + $txt .= ' padding: 0;'; + $txt .= ' list-style: none;'; + $txt .= '}'; + $txt .= '#fieldsForm ul.table-structure-actions li {'; + $txt .= ' float: ;'; + $txt .= ' margin-: 0.3em; /* same as padding of "table td" */'; + $txt .= '}'; + $txt .= '#fieldsForm ul.table-structure-actions .submenu li {'; + $txt .= ' padding: 0;'; + $txt .= ' margin: 0;'; + $txt .= '}'; + $txt .= '#fieldsForm ul.table-structure-actions .submenu li span {'; + $txt .= ' padding: 0.3em;'; + $txt .= ' margin: 0.1em;'; + $txt .= '}'; + $txt .= '#structure-action-links a {'; + $txt .= ' margin-: 1em;'; + $txt .= '}'; + $txt .= '#addColumns input[type="radio"] {'; + $txt .= ' margin: 3px 0 0;'; + $txt .= ' margin-: 1em;'; + $txt .= '}'; + /** + * Indexes + */ + $txt .= '#index_frm .index_info input[type="text"],'; + $txt .= '#index_frm .index_info select {'; + $txt .= ' width: 100%;'; + $txt .= ' margin: 0;'; + $txt .= ' box-sizing: border-box;'; + $txt .= ' -ms-box-sizing: border-box;'; + $txt .= ' -moz-box-sizing: border-box;'; + $txt .= ' -webkit-box-sizing: border-box;'; + $txt .= '}'; + + $txt .= '#index_frm .index_info div {'; + $txt .= ' padding: .2em 0;'; + $txt .= '}'; + + $txt .= '#index_frm .index_info .label {'; + $txt .= ' float: ;'; + $txt .= ' min-width: 12em;'; + $txt .= '}'; + + $txt .= '#index_frm .slider {'; + $txt .= ' width: 10em;'; + $txt .= ' margin: .6em;'; + $txt .= ' float: ;'; + $txt .= '}'; + + $txt .= '#index_frm .add_fields {'; + $txt .= ' float: ;'; + $txt .= '}'; + + $txt .= '#index_frm .add_fields input {'; + $txt .= ' margin-: 1em;'; + $txt .= '}'; + + $txt .= '#index_frm input {'; + $txt .= ' margin: 0;'; + $txt .= '}'; + + $txt .= '#index_frm td {'; + $txt .= ' vertical-align: middle;'; + $txt .= '}'; + + $txt .= 'table#index_columns {'; + $txt .= ' width: 100%;'; + $txt .= '}'; + + $txt .= 'table#index_columns select {'; + $txt .= ' width: 85%;'; + $txt .= ' float: ;'; + $txt .= '}'; + + $txt .= '#move_columns_dialog div {'; + $txt .= ' padding: 1em;'; + $txt .= '}'; + + $txt .= '#move_columns_dialog ul {'; + $txt .= ' list-style: none;'; + $txt .= ' margin: 0;'; + $txt .= ' padding: 0;'; + $txt .= '}'; + + $txt .= '#move_columns_dialog li {'; + $txt .= ' background: ;'; + $txt .= ' border: 1px solid #aaa;'; + $txt .= ' color: ;'; + $txt .= ' font-weight: bold;'; + $txt .= ' margin: .4em;'; + $txt .= ' padding: .2em;'; + $txt .= ' -webkit-border-radius: 2px;'; + $txt .= ' -moz-border-radius: 2px;'; + $txt .= ' border-radius: 2px;'; + $txt .= '}'; + + /* config forms */ + $txt .= '.config-form ul.tabs {'; + $txt .= ' margin: 1.1em .2em 0;'; + $txt .= ' padding: 0 0 .3em 0;'; + $txt .= ' list-style: none;'; + $txt .= ' font-weight: bold;'; + $txt .= '}'; + + $txt .= '.config-form ul.tabs li {'; + $txt .= ' float: ;'; + $txt .= ' margin-bottom: -1px;'; + $txt .= '}'; + + $txt .= '.config-form ul.tabs li a {'; + $txt .= ' display: block;'; + $txt .= ' margin: .1em .2em 0;'; + $txt .= ' white-space: nowrap;'; + $txt .= ' text-decoration: none;'; + $txt .= ' border: 1px solid ;'; + $txt .= ' border-bottom: 1px solid #aaa;'; + $txt .= '}'; + + $txt .= '.config-form ul.tabs li a {'; + $txt .= ' padding: 7px 10px;'; + $txt .= ' -webkit-border-radius: 5px 5px 0 0;'; + $txt .= ' -moz-border-radius: 5px 5px 0 0;'; + $txt .= ' border-radius: 5px 5px 0 0;'; + $txt .= ' background: #f2f2f2;'; + $txt .= ' color: #555;'; + $txt .= ' text-shadow: 0 1px 0 #fff;'; + $txt .= '}'; + + $txt .= '.config-form ul.tabs li a:hover,'; + $txt .= '.config-form ul.tabs li a:active {'; + $txt .= ' background: #e5e5e5;'; + $txt .= '}'; + + $txt .= '.config-form ul.tabs li.active a {'; + $txt .= ' background-color: #fff;'; + $txt .= ' margin-top: 1px;'; + $txt .= ' color: #000;'; + $txt .= ' text-shadow: none;'; + $txt .= ' border-color: #aaa;'; + $txt .= ' border-bottom: 1px solid #fff;'; + $txt .= '}'; + + $txt .= '.config-form fieldset {'; + $txt .= ' margin-top: 0;'; + $txt .= ' padding: 0;'; + $txt .= ' clear: both;'; + $txt .= ' -webkit-border-radius: 0;'; + $txt .= ' -moz-border-radius: 0;'; + $txt .= ' border-radius: 0;'; + $txt .= '}'; + + $txt .= '.config-form legend {'; + $txt .= ' display: none;'; + $txt .= '}'; + + $txt .= '.config-form fieldset p {'; + $txt .= ' margin: 0;'; + $txt .= ' padding: .5em;'; + $txt .= ' background: #fff;'; + $txt .= ' border-top: 0;'; + $txt .= '}'; + + $txt .= '.config-form fieldset .errors { /* form error list */'; + $txt .= ' margin: 0 -2px 1em;'; + $txt .= ' padding: .5em 1.5em;'; + $txt .= ' background: #FBEAD9;'; + $txt .= ' border: 0 #C83838 solid;'; + $txt .= ' border-width: 1px 0;'; + $txt .= ' list-style: none;'; + $txt .= ' font-family: sans-serif;'; + $txt .= ' font-size: small;'; + $txt .= '}'; + + $txt .= '.config-form fieldset .inline_errors { /* field error list */'; + $txt .= ' margin: .3em .3em .3em;'; + $txt .= ' margin-: 0;'; + $txt .= ' padding: 0;'; + $txt .= ' list-style: none;'; + $txt .= ' color: #9A0000;'; + $txt .= ' font-size: small;'; + $txt .= '}'; + + $txt .= '.config-form fieldset th {'; + $txt .= ' padding: .3em .3em .3em;'; + $txt .= ' padding-: .5em;'; + $txt .= ' text-align: ;'; + $txt .= ' vertical-align: top;'; + $txt .= ' width: 40%;'; + $txt .= ' background: transparent;'; + $txt .= ' filter: none;'; + $txt .= '}'; + + $txt .= '.config-form fieldset .doc,'; + $txt .= '.config-form fieldset .disabled-notice {'; + $txt .= ' margin-: 1em;'; + $txt .= '}'; + + $txt .= '.config-form fieldset .disabled-notice {'; + $txt .= ' font-size: 80%;'; + $txt .= ' text-transform: uppercase;'; + $txt .= ' color: #E00;'; + $txt .= ' cursor: help;'; + $txt .= '}'; + + $txt .= '.config-form fieldset td {'; + $txt .= ' padding-top: .3em;'; + $txt .= ' padding-bottom: .3em;'; + $txt .= ' vertical-align: top;'; + $txt .= '}'; + + $txt .= '.config-form fieldset th small {'; + $txt .= ' display: block;'; + $txt .= ' font-weight: normal;'; + $txt .= ' font-family: sans-serif;'; + $txt .= ' font-size: x-small;'; + $txt .= ' color: #444;'; + $txt .= '}'; + + $txt .= '.config-form fieldset th,'; + $txt .= '.config-form fieldset td {'; + $txt .= ' border-top: 1px solid;'; + $txt .= ' border-: none;'; + $txt .= '}'; + + $txt .= 'fieldset .group-header th {'; + $txt .= ' background: ;'; + $txt .= '}'; + + $txt .= 'fieldset .group-header + tr th {'; + $txt .= ' padding-top: .6em;'; + $txt .= '}'; + + $txt .= 'fieldset .group-field-1 th,'; + $txt .= 'fieldset .group-header-2 th {'; + $txt .= ' padding-: 1.5em;'; + $txt .= '}'; + + $txt .= 'fieldset .group-field-2 th,'; + $txt .= 'fieldset .group-header-3 th {'; + $txt .= ' padding-: 3em;'; + $txt .= '}'; + + $txt .= 'fieldset .group-field-3 th {'; + $txt .= ' padding-: 4.5em;'; + $txt .= '}'; + + $txt .= 'fieldset .disabled-field th,'; + $txt .= 'fieldset .disabled-field th small,'; + $txt .= 'fieldset .disabled-field td {'; + $txt .= ' color: #666;'; + $txt .= ' background-color: #ddd;'; + $txt .= '}'; + + $txt .= '.config-form .lastrow {'; + $txt .= ' border-top: 1px #000 solid;'; + $txt .= '}'; + + $txt .= '.config-form .lastrow {'; + $txt .= ' background: ;'; + $txt .= ' padding: .5em;'; + $txt .= ' text-align: center;'; + $txt .= '}'; + + $txt .= '.config-form .lastrow input {'; + $txt .= ' font-weight: bold;'; + $txt .= '}'; + + /* form elements */ + + $txt .= '.config-form span.checkbox {'; + $txt .= ' padding: 2px;'; + $txt .= ' display: inline-block;'; + $txt .= '}'; + + $txt .= '.config-form .custom { /* customized field */'; + $txt .= ' background: #FFC;'; + $txt .= '}'; + + $txt .= '.config-form span.checkbox.custom {'; + $txt .= ' padding: 1px;'; + $txt .= ' border: 1px #EDEC90 solid;'; + $txt .= ' background: #FFC;'; + $txt .= '}'; + + $txt .= '.config-form .field-error {'; + $txt .= ' border-color: #A11 !important;'; + $txt .= '}'; + + $txt .= '.config-form input[type="text"],'; + $txt .= '.config-form input[type="password"],'; + $txt .= '.config-form input[type="number"],'; + $txt .= '.config-form select,'; + $txt .= '.config-form textarea {'; + $txt .= ' border: 1px #A7A6AA solid;'; + $txt .= ' height: auto;'; + $txt .= '}'; + + $txt .= '.config-form input[type="text"]:focus,'; + $txt .= '.config-form input[type="password"]:focus,'; + $txt .= '.config-form input[type="number"]:focus,'; + $txt .= '.config-form select:focus,'; + $txt .= '.config-form textarea:focus {'; + $txt .= ' border: 1px #6676FF solid;'; + $txt .= ' background: #F7FBFF;'; + $txt .= '}'; + + $txt .= '.config-form .field-comment-mark {'; + $txt .= ' font-family: serif;'; + $txt .= ' color: #007;'; + $txt .= ' cursor: help;'; + $txt .= ' padding: 0 .2em;'; + $txt .= ' font-weight: bold;'; + $txt .= ' font-style: italic;'; + $txt .= '}'; + + $txt .= '.config-form .field-comment-warning {'; + $txt .= ' color: #A00;'; + $txt .= '}'; + + /* error list */ + $txt .= '.config-form dd {'; + $txt .= ' margin-: .5em;'; + $txt .= '}'; + + $txt .= '.config-form dd:before {'; + $txt .= ' content: "\25B8 ";'; + $txt .= '}'; + + $txt .= '.click-hide-message {'; + $txt .= ' cursor: pointer;'; + $txt .= '}'; + + $txt .= '.prefsmanage_opts {'; + $txt .= ' margin-: 2em;'; + $txt .= '}'; + + $txt .= '#prefs_autoload {'; + $txt .= ' margin-bottom: .5em;'; + $txt .= ' margin-left: .5em;'; + $txt .= '}'; + + $txt .= '#placeholder .button {'; + $txt .= ' position: absolute;'; + $txt .= ' cursor: pointer;'; + $txt .= '}'; + + $txt .= '#placeholder div.button {'; + $txt .= ' font-size: smaller;'; + $txt .= ' color: #999;'; + $txt .= ' background-color: #eee;'; + $txt .= ' padding: 2px;'; + $txt .= '}'; + + $txt .= '.wrapper {'; + $txt .= ' float: ;'; + $txt .= ' margin-bottom: 1.5em;'; + $txt .= '}'; + $txt .= '.toggleButton {'; + $txt .= ' position: relative;'; + $txt .= ' cursor: pointer;'; + $txt .= ' font-size: .8em;'; + $txt .= ' text-align: center;'; + $txt .= ' line-height: 1.4em;'; + $txt .= ' height: 1.55em;'; + $txt .= ' overflow: hidden;'; + $txt .= ' border-right: .1em solid ;;'; + $txt .= ' border-left: .1em solid ;;'; + $txt .= ' -webkit-border-radius: .3em;'; + $txt .= ' -moz-border-radius: .3em;'; + $txt .= ' border-radius: .3em;'; + $txt .= '}'; + $txt .= '.toggleButton table,'; + $txt .= '.toggleButton td,'; + $txt .= '.toggleButton img {'; + $txt .= ' padding: 0;'; + $txt .= ' position: relative;'; + $txt .= '}'; + $txt .= '.toggleButton .container {'; + $txt .= ' position: absolute;'; + $txt .= '}'; + $txt .= '.toggleButton .container td,'; + $txt .= '.toggleButton .container tr {'; + $txt .= ' background-image: none;'; + $txt .= ' background: none !important;'; + $txt .= '}'; + $txt .= '.toggleButton .toggleOn {'; + $txt .= ' color: #fff;'; + $txt .= ' padding: 0 1em;'; + $txt .= ' text-shadow: 0 0 .2em #000;'; + $txt .= '}'; + $txt .= '.toggleButton .toggleOff {'; + $txt .= ' padding: 0 1em;'; + $txt .= '}'; + + $txt .= '.doubleFieldset fieldset {'; + $txt .= ' width: 48%;'; + $txt .= ' float: ;'; + $txt .= ' padding: 0;'; + $txt .= '}'; + $txt .= '.doubleFieldset fieldset.left {'; + $txt .= ' margin-: 1%;'; + $txt .= '}'; + $txt .= '.doubleFieldset fieldset.right {'; + $txt .= ' margin-: 1%;'; + $txt .= '}'; + $txt .= '.doubleFieldset legend {'; + $txt .= ' margin-: 1.5em;'; + $txt .= '}'; + $txt .= '.doubleFieldset div.wrap {'; + $txt .= ' padding: 1.5em;'; + $txt .= '}'; + + $txt .= '#table_name_col_no_outer {'; + $txt .= ' margin-top: 45px;'; + $txt .= '}'; + + $txt .= '#table_name_col_no {'; + $txt .= ' position: fixed;'; + $txt .= ' top: 55px;'; + $txt .= ' width: 100%;'; + $txt .= ' background: #ffffff;'; + $txt .= '}'; + + $txt .= '#table_columns input[type="text"],'; + $txt .= '#table_columns input[type="password"],'; + $txt .= '#table_columns input[type="number"],'; + $txt .= '#table_columns select {'; + $txt .= ' width: 10em;'; + $txt .= ' box-sizing: border-box;'; + $txt .= ' -ms-box-sizing: border-box;'; + $txt .= ' -moz-box-sizing: border-box;'; + $txt .= ' -webkit-box-sizing: border-box;'; + $txt .= '}'; + + $txt .= '#placeholder {'; + $txt .= ' position: relative;'; + $txt .= ' border: 1px solid #aaa;'; + $txt .= ' float: ;'; + $txt .= ' overflow: hidden;'; + $txt .= ' width: 450px;'; + $txt .= ' height: 300px;'; + $txt .= '}'; + + $txt .= '#openlayersmap{'; + $txt .= ' width: 450px;'; + $txt .= ' height: 300px;'; + $txt .= '}'; + + $txt .= '.placeholderDrag {'; + $txt .= ' cursor: move;'; + $txt .= '}'; + + $txt .= '#placeholder .button {'; + $txt .= ' position: absolute;'; + $txt .= '}'; + + $txt .= '#left_arrow {'; + $txt .= ' left: 8px;'; + $txt .= ' top: 26px;'; + $txt .= '}'; + + $txt .= '#right_arrow {'; + $txt .= ' left: 26px;'; + $txt .= ' top: 26px;'; + $txt .= '}'; + + $txt .= '#up_arrow {'; + $txt .= ' left: 17px;'; + $txt .= ' top: 8px;'; + $txt .= '}'; + + $txt .= '#down_arrow {'; + $txt .= ' left: 17px;'; + $txt .= ' top: 44px;'; + $txt .= '}'; + + $txt .= '#zoom_in {'; + $txt .= ' left: 17px;'; + $txt .= ' top: 67px;'; + $txt .= '}'; + + $txt .= '#zoom_world {'; + $txt .= ' left: 17px;'; + $txt .= ' top: 85px;'; + $txt .= '}'; + + $txt .= '#zoom_out {'; + $txt .= ' left: 17px;'; + $txt .= ' top: 103px;'; + $txt .= '}'; + + $txt .= '.colborder {'; + $txt .= ' cursor: col-resize;'; + $txt .= ' height: 100%;'; + $txt .= ' margin-: -6px;'; + $txt .= ' position: absolute;'; + $txt .= ' width: 5px;'; + $txt .= '}'; + + $txt .= '.colborder_active {'; + $txt .= ' border-: 2px solid #a44;'; + $txt .= '}'; + + $txt .= '.pma_table td {'; + $txt .= ' position: static;'; + $txt .= '}'; + + $txt .= '.pma_table th.draggable span,'; + $txt .= '.pma_table tbody td span {'; + $txt .= ' display: block;'; + $txt .= ' overflow: hidden;'; + $txt .= '}'; + + $txt .= '.pma_table tbody td span code span {'; + $txt .= ' display: inline;'; + $txt .= '}'; + + $txt .= '.pma_table th.draggable.right span {'; + $txt .= ' margin-: 0px;'; + $txt .= '}'; + + $txt .= '.pma_table th.draggable span {'; + $txt .= ' margin-: 10px;'; + $txt .= '}'; + + $txt .= '.modal-copy input {'; + $txt .= ' display: block;'; + $txt .= ' width: 100%;'; + $txt .= ' margin-top: 1.5em;'; + $txt .= ' padding: .3em 0;'; + $txt .= '}'; + + $txt .= '.cRsz {'; + $txt .= ' position: absolute;'; + $txt .= '}'; + + $txt .= '.cCpy {'; + $txt .= ' background: #333;'; + $txt .= ' color: #FFF;'; + $txt .= ' font-weight: bold;'; + $txt .= ' margin: .1em;'; + $txt .= ' padding: .3em;'; + $txt .= ' position: absolute;'; + $txt .= ' text-shadow: -1px -1px #000;'; + + $txt .= ' -moz-box-shadow: 0 0 .7em #000;'; + $txt .= ' -webkit-box-shadow: 0 0 .7em #000;'; + $txt .= ' box-shadow: 0 0 .7em #000;'; + $txt .= ' -moz-border-radius: .3em;'; + $txt .= ' -webkit-border-radius: .3em;'; + $txt .= ' border-radius: .3em;'; + $txt .= '}'; + + $txt .= '.cPointer {'; + $txt .= ' background: url(getImgPath(\'col_pointer.png\');?>);'; + $txt .= ' height: 20px;'; + $txt .= ' margin-: -5px; /* must be minus half of its width */'; + $txt .= ' margin-top: -10px;'; + $txt .= ' position: absolute;'; + $txt .= ' width: 10px;'; + $txt .= '}'; + + $txt .= '.tooltip {'; + $txt .= ' background: #333 !important;'; + $txt .= ' opacity: .8 !important;'; + $txt .= ' border: 1px solid #000 !important;'; + $txt .= ' -moz-border-radius: .3em !important;'; + $txt .= ' -webkit-border-radius: .3em !important;'; + $txt .= ' border-radius: .3em !important;'; + $txt .= ' text-shadow: -1px -1px #000 !important;'; + $txt .= ' font-size: .8em !important;'; + $txt .= ' font-weight: bold !important;'; + $txt .= ' padding: 1px 3px !important;'; + $txt .= '}'; + + $txt .= '.tooltip * {'; + $txt .= ' background: none !important;'; + $txt .= ' color: #FFF !important;'; + $txt .= '}'; + + $txt .= '.cDrop {'; + $txt .= ' left: 0;'; + $txt .= ' position: absolute;'; + $txt .= ' top: 0;'; + $txt .= '}'; + + $txt .= '.coldrop {'; + $txt .= ' background: url(getImgPath(\'col_drop.png\');?>);'; + $txt .= ' cursor: pointer;'; + $txt .= ' height: 16px;'; + $txt .= ' margin-: .3em;'; + $txt .= ' margin-top: .3em;'; + $txt .= ' position: absolute;'; + $txt .= ' width: 16px;'; + $txt .= '}'; + + $txt .= '.coldrop:hover,'; + $txt .= '.coldrop-hover {'; + $txt .= ' background-color: #999;'; + $txt .= '}'; + + $txt .= '.cList {'; + $txt .= ' background: #EEE;'; + $txt .= ' border: solid 1px #999;'; + $txt .= ' position: absolute;'; + $txt .= ' -moz-box-shadow: 0 .2em .5em #333;'; + $txt .= ' -webkit-box-shadow: 0 .2em .5em #333;'; + $txt .= ' box-shadow: 0 .2em .5em #333;'; + $txt .= '}'; + + $txt .= '.cList .lDiv div {'; + $txt .= ' padding: .2em .5em .2em;'; + $txt .= ' padding-: .2em;'; + $txt .= '}'; + + $txt .= '.cList .lDiv div:hover {'; + $txt .= ' background: #DDD;'; + $txt .= ' cursor: pointer;'; + $txt .= '}'; + + $txt .= '.cList .lDiv div input {'; + $txt .= ' cursor: pointer;'; + $txt .= '}'; + + $txt .= '.showAllColBtn {'; + $txt .= ' border-bottom: solid 1px #999;'; + $txt .= ' border-top: solid 1px #999;'; + $txt .= ' cursor: pointer;'; + $txt .= ' font-size: .9em;'; + $txt .= ' font-weight: bold;'; + $txt .= ' padding: .35em 1em;'; + $txt .= ' text-align: center;'; + $txt .= '}'; + + $txt .= '.showAllColBtn:hover {'; + $txt .= ' background: #DDD;'; + $txt .= '}'; + + $txt .= '.turnOffSelect {'; + $txt .= ' -moz-user-select: none;'; + $txt .= ' -khtml-user-select: none;'; + $txt .= ' -webkit-user-select: none;'; + $txt .= ' user-select: none;'; + $txt .= '}'; + + $txt .= '.navigation {'; + $txt .= ' margin: .8em 0;'; + + $txt .= ' border-radius: 5px;'; + $txt .= ' -webkit-border-radius: 5px;'; + $txt .= ' -moz-border-radius: 5px;'; + + $txt .= ' getCssGradient(\'eeeeee\', \'cccccc\'); ?>'; + $txt .= '}'; + + $txt .= '.navigation td {'; + $txt .= ' margin: 0;'; + $txt .= ' padding: 0;'; + $txt .= ' vertical-align: middle;'; + $txt .= ' white-space: nowrap;'; + $txt .= '}'; + + $txt .= '.navigation_separator {'; + $txt .= ' color: #999;'; + $txt .= ' display: inline-block;'; + $txt .= ' font-size: 1.5em;'; + $txt .= ' text-align: center;'; + $txt .= ' height: 1.4em;'; + $txt .= ' width: 1.2em;'; + $txt .= ' text-shadow: 1px 0 #FFF;'; + $txt .= '}'; + + $txt .= '.navigation input[type=submit] {'; + $txt .= ' background: none;'; + $txt .= ' border: 0;'; + $txt .= ' filter: none;'; + $txt .= ' margin: 0;'; + $txt .= ' padding: .8em .5em;'; + + $txt .= ' border-radius: 0;'; + $txt .= ' -webkit-border-radius: 0;'; + $txt .= ' -moz-border-radius: 0;'; + $txt .= '}'; + + $txt .= '.navigation input[type=submit]:hover,'; + $txt .= '.navigation input.edit_mode_active {'; + $txt .= ' color: #fff;'; + $txt .= ' cursor: pointer;'; + $txt .= ' text-shadow: none;'; + + $txt .= ' getCssGradient(\'333333\', \'555555\'); ?>'; + $txt .= '}'; + + $txt .= '.navigation select {'; + $txt .= ' margin: 0 .8em;'; + $txt .= '}'; + + $txt .= '.cEdit {'; + $txt .= ' margin: 0;'; + $txt .= ' padding: 0;'; + $txt .= ' position: absolute;'; + $txt .= '}'; + + $txt .= '.cEdit input[type=text] {'; + $txt .= ' background: #FFF;'; + $txt .= ' height: 100%;'; + $txt .= ' margin: 0;'; + $txt .= ' padding: 0;'; + $txt .= '}'; + + $txt .= '.cEdit .edit_area {'; + $txt .= ' background: #FFF;'; + $txt .= ' border: 1px solid #999;'; + $txt .= ' min-width: 10em;'; + $txt .= ' padding: .3em .5em;'; + $txt .= '}'; + + $txt .= '.cEdit .edit_area select,'; + $txt .= '.cEdit .edit_area textarea {'; + $txt .= ' width: 97%;'; + $txt .= '}'; + + $txt .= '.cEdit .cell_edit_hint {'; + $txt .= ' color: #555;'; + $txt .= ' font-size: .8em;'; + $txt .= ' margin: .3em .2em;'; + $txt .= '}'; + + $txt .= '.cEdit .edit_box {'; + $txt .= ' overflow-x: hidden;'; + $txt .= ' overflow-y: scroll;'; + $txt .= ' padding: 0;'; + $txt .= ' margin: 0;'; + $txt .= '}'; + + $txt .= '.cEdit .edit_box_posting {'; + $txt .= ' background: #FFF url(getImgPath(\'ajax_clock_small.gif\');?>) no-repeat right center;'; + $txt .= ' padding-: 1.5em;'; + $txt .= '}'; + + $txt .= '.cEdit .edit_area_loading {'; + $txt .= ' background: #FFF url(getImgPath(\'ajax_clock_small.gif\');?>) no-repeat center;'; + $txt .= ' height: 10em;'; + $txt .= '}'; + + $txt .= '.cEdit .goto_link {'; + $txt .= ' background: #EEE;'; + $txt .= ' color: #555;'; + $txt .= ' padding: .2em .3em;'; + $txt .= '}'; + + $txt .= '.saving_edited_data {'; + $txt .= ' background: url(getImgPath(\'ajax_clock_small.gif\');?>) no-repeat left;'; + $txt .= ' padding-: 20px;'; + $txt .= '}'; + + $txt .= '.relationalTable td {'; + $txt .= ' vertical-align: top;'; + $txt .= '}'; + + $txt .= '.relationalTable select {'; + $txt .= ' width: 125px;'; + $txt .= ' margin-right: 5px;'; + $txt .= '}'; + + /* css for timepicker */ + $txt .= '.ui-timepicker-div .ui-widget-header { margin-bottom: 8px; }'; + $txt .= '.ui-timepicker-div dl { text-align: ; }'; + $txt .= '.ui-timepicker-div dl dt { height: 25px; margin-bottom: -25px; }'; + $txt .= '.ui-timepicker-div dl dd { margin: 0 10px 10px 85px; }'; + $txt .= '.ui-timepicker-div td { font-size: 90%; }'; + $txt .= '.ui-tpicker-grid-label { background: none; border: none; margin: 0; padding: 0; }'; + $txt .= '.ui-timepicker-rtl { direction: rtl; }'; + $txt .= '.ui-timepicker-rtl dl { text-align: right; }'; + $txt .= '.ui-timepicker-rtl dl dd { margin: 0 65px 10px 10px; }'; + + $txt .= 'input.btn {'; + $txt .= ' color: #333;'; + $txt .= ' background-color: #D0DCE0;'; + $txt .= '}'; + + $txt .= 'body .ui-widget {'; + $txt .= ' font-size: 1em;'; + $txt .= '}'; + $txt .= '.ui-dialog fieldset legend a {'; + $txt .= ' color: #235A81;'; + $txt .= '}'; + $txt .= '.ui-draggable {'; + $txt .= ' z-index: 801;'; + $txt .= '}'; + /* over-riding jqplot-yaxis class */ + $txt .= '.jqplot-yaxis {'; + $txt .= ' left:0 !important;'; + $txt .= ' min-width:25px;'; + $txt .= ' width:auto;'; + $txt .= '}'; + $txt .= '.jqplot-axis {'; + $txt .= ' overflow:hidden;'; + $txt .= '}'; + $txt .= '.report-data {'; + $txt .= ' height:13em;'; + $txt .= ' overflow:scroll;'; + $txt .= ' width:570px;'; + $txt .= ' border: solid 1px;'; + $txt .= ' background: white;'; + $txt .= ' padding: 2px;'; + $txt .= '}'; + $txt .= '.report-description {'; + $txt .= ' height:10em;'; + $txt .= ' width:570px;'; + $txt .= '}'; + $txt .= 'div#page_content div#tableslistcontainer table.data {'; + $txt .= ' border-top: 0.1px solid #EEEEEE;'; + $txt .= '}'; + $txt .= 'div#page_content div#tableslistcontainer, div#page_content div.notice, div#page_content div.result_query {'; + $txt .= ' margin-top: 1em;'; + $txt .= '}'; + $txt .= 'table.show_create {'; + $txt .= ' margin-top: 1em;'; + $txt .= '}'; + $txt .= 'table.show_create td {'; + $txt .= ' border-right: 1px solid #bbb;'; + $txt .= '}'; + $txt .= '#alias_modal table {'; + $txt .= ' width: 100%;'; + $txt .= '}'; + $txt .= '#alias_modal label {'; + $txt .= ' font-weight: bold;'; + $txt .= '}'; + $txt .= '.ui-dialog {'; + $txt .= ' position: fixed;'; + $txt .= '}'; + $txt .= '.small_font {'; + $txt .= ' font-size: smaller;'; + $txt .= '}'; + /* Console styles */ + $txt .= '#pma_console_container {'; + $txt .= ' width: 100%;'; + $txt .= ' position: fixed;'; + $txt .= ' bottom: 0;'; + $txt .= ' : 0;'; + $txt .= ' z-index: 100;'; + $txt .= '}'; + $txt .= '#pma_console {'; + $txt .= ' position: relative;'; + $txt .= ' margin-: 240px;'; + $txt .= '}'; + $txt .= '#pma_console .templates {'; + $txt .= ' display: none;'; + $txt .= '}'; + $txt .= '#pma_console .mid_text,'; + $txt .= '#pma_console .toolbar span {'; + $txt .= ' vertical-align: middle;'; + $txt .= '}'; + $txt .= '#pma_console .toolbar {'; + $txt .= ' position: relative;'; + $txt .= ' background: #ccc;'; + $txt .= ' border-top: solid 1px #aaa;'; + $txt .= ' cursor: n-resize;'; + $txt .= '}'; + $txt .= '#pma_console .toolbar.collapsed:not(:hover) {'; + $txt .= ' display: inline-block;'; + $txt .= ' border-top--radius: 3px;'; + $txt .= ' border-: solid 1px #aaa;'; + $txt .= '}'; + $txt .= '#pma_console .toolbar.collapsed {'; + $txt .= ' cursor: default;'; + $txt .= '}'; + $txt .= '#pma_console .toolbar.collapsed>.button {'; + $txt .= ' display: none;'; + $txt .= '}'; + $txt .= '#pma_console .message span.text,'; + $txt .= '#pma_console .message span.action,'; + $txt .= '#pma_console .toolbar .button,'; + $txt .= '#pma_console .toolbar .text,'; + $txt .= '#pma_console .switch_button {'; + $txt .= ' padding: 0 3px;'; + $txt .= ' display: inline-block;'; + $txt .= '}'; + $txt .= '#pma_console .message span.action,'; + $txt .= '#pma_console .toolbar .button,'; + $txt .= '#pma_console .switch_button {'; + $txt .= ' cursor: pointer;'; + $txt .= '}'; + $txt .= '#pma_console .message span.action:hover,'; + $txt .= '#pma_console .toolbar .button:hover,'; + $txt .= '#pma_console .switch_button:hover,'; + $txt .= '#pma_console .toolbar .button.active {'; + $txt .= ' background: #ddd;'; + $txt .= '}'; + $txt .= '#pma_console .toolbar .text {'; + $txt .= ' font-weight: bold;'; + $txt .= '}'; + $txt .= '#pma_console .toolbar .button,'; + $txt .= '#pma_console .toolbar .text {'; + $txt .= ' margin-: .4em;'; + $txt .= '}'; + $txt .= '#pma_console .toolbar .button,'; + $txt .= '#pma_console .toolbar .text {'; + $txt .= ' float: ;'; + $txt .= '}'; + $txt .= '#pma_console .content {'; + $txt .= ' overflow-x: hidden;'; + $txt .= ' overflow-y: auto;'; + $txt .= ' margin-bottom: -65px;'; + $txt .= ' border-top: solid 1px #aaa;'; + $txt .= ' background: #fff;'; + $txt .= ' padding-top: .4em;'; + $txt .= '}'; + $txt .= '#pma_console .content.console_dark_theme {'; + $txt .= ' background: #000;'; + $txt .= ' color: #fff;'; + $txt .= '}'; + $txt .= '#pma_console .content.console_dark_theme .CodeMirror-wrap {'; + $txt .= ' background: #000;'; + $txt .= ' color: #fff;'; + $txt .= '}'; + $txt .= '#pma_console .content.console_dark_theme .action_content {'; + $txt .= ' color: #000;'; + $txt .= '}'; + $txt .= '#pma_console .content.console_dark_theme .message {'; + $txt .= ' border-color: #373B41;'; + $txt .= '}'; + $txt .= '#pma_console .content.console_dark_theme .CodeMirror-cursor {'; + $txt .= ' border-color: #fff;'; + $txt .= '}'; + $txt .= '#pma_console .content.console_dark_theme .cm-keyword {'; + $txt .= ' color: #de935f;'; + $txt .= '}'; + $txt .= '#pma_console .message,'; + $txt .= '#pma_console .query_input {'; + $txt .= ' position: relative;'; + $txt .= ' font-family: Monaco, Consolas, monospace;'; + $txt .= ' cursor: text;'; + $txt .= ' margin: 0 10px .2em 1.4em;'; + $txt .= '}'; + $txt .= '#pma_console .message {'; + $txt .= ' border-bottom: solid 1px #ccc;'; + $txt .= ' padding-bottom: .2em;'; + $txt .= '}'; + $txt .= '#pma_console .message.expanded>.action_content {'; + $txt .= ' position: relative;'; + $txt .= '}'; + $txt .= '#pma_console .message:before,'; + $txt .= '#pma_console .query_input:before {'; + $txt .= ' left: -0.7em;'; + $txt .= ' position: absolute;'; + $txt .= ' content: ">";'; + $txt .= '}'; + $txt .= '#pma_console .query_input:before {'; + $txt .= ' top: -2px;'; + $txt .= '}'; + $txt .= '#pma_console .query_input textarea {'; + $txt .= ' width: 100%;'; + $txt .= ' height: 4em;'; + $txt .= ' resize: vertical;'; + $txt .= '}'; + $txt .= '#pma_console .message:hover:before {'; + $txt .= ' color: #7cf;'; + $txt .= ' font-weight: bold;'; + $txt .= '}'; + $txt .= '#pma_console .message.expanded:before {'; + $txt .= ' content: "]";'; + $txt .= '}'; + $txt .= '#pma_console .message.welcome:before {'; + $txt .= ' display: none;'; + $txt .= '}'; + $txt .= '#pma_console .message.failed:before,'; + $txt .= '#pma_console .message.failed.expanded:before,'; + $txt .= '#pma_console .message.failed:hover:before {'; + $txt .= ' content: "=";'; + $txt .= ' color: #944;'; + $txt .= '}'; + $txt .= '#pma_console .message.pending:before {'; + $txt .= ' opacity: .3;'; + $txt .= '}'; + $txt .= '#pma_console .message.collapsed>.query {'; + $txt .= ' white-space: nowrap;'; + $txt .= ' text-overflow: ellipsis;'; + $txt .= ' overflow: hidden;'; + $txt .= '}'; + $txt .= '#pma_console .message.expanded>.query {'; + $txt .= ' display: block;'; + $txt .= ' white-space: pre;'; + $txt .= ' word-wrap: break-word;'; + $txt .= '}'; + $txt .= '#pma_console .message .text.targetdb,'; + $txt .= '#pma_console .message.collapsed .action.collapse,'; + $txt .= '#pma_console .message.expanded .action.expand,'; + $txt .= '#pma_console .message .action.requery,'; + $txt .= '#pma_console .message .action.profiling,'; + $txt .= '#pma_console .message .action.explain,'; + $txt .= '#pma_console .message .action.bookmark {'; + $txt .= ' display: none;'; + $txt .= '}'; + $txt .= '#pma_console .message.select .action.profiling,'; + $txt .= '#pma_console .message.select .action.explain,'; + $txt .= '#pma_console .message.history .text.targetdb,'; + $txt .= '#pma_console .message.successed .text.targetdb,'; + $txt .= '#pma_console .message.history .action.requery,'; + $txt .= '#pma_console .message.history .action.bookmark,'; + $txt .= '#pma_console .message.bookmark .action.requery,'; + $txt .= '#pma_console .message.bookmark .action.bookmark,'; + $txt .= '#pma_console .message.successed .action.requery,'; + $txt .= '#pma_console .message.successed .action.bookmark {'; + $txt .= ' display: inline-block;'; + $txt .= '}'; + $txt .= '#pma_console .message .action_content {'; + $txt .= ' position: absolute;'; + $txt .= ' bottom: 100%;'; + $txt .= ' background: #ccc;'; + $txt .= ' border: solid 1px #aaa;'; + $txt .= ' border-top--radius: 3px;'; + $txt .= '}'; + $txt .= 'html.ie8 #pma_console .message .action_content {'; + $txt .= ' position: relative!important;'; + $txt .= '}'; + $txt .= '#pma_console .message.bookmark .text.targetdb,'; + $txt .= '#pma_console .message .text.query_time {'; + $txt .= ' margin: 0;'; + $txt .= ' display: inline-block;'; + $txt .= '}'; + $txt .= '#pma_console .message.failed .text.query_time,'; + $txt .= '#pma_console .message .text.failed {'; + $txt .= ' display: none;'; + $txt .= '}'; + $txt .= '#pma_console .message.failed .text.failed {'; + $txt .= ' display: inline-block;'; + $txt .= '}'; + $txt .= '#pma_console .message .text {'; + $txt .= ' background: #fff;'; + $txt .= '}'; + $txt .= '#pma_console .message.collapsed>.action_content {'; + $txt .= ' display: none;'; + $txt .= '}'; + $txt .= '#pma_console .message.collapsed:hover>.action_content {'; + $txt .= ' display: block;'; + $txt .= '}'; + $txt .= '#pma_console .message .bookmark_label {'; + $txt .= ' padding: 0 4px;'; + $txt .= ' top: 0;'; + $txt .= ' background: #369;'; + $txt .= ' color: #fff;'; + $txt .= ' border-radius: 3px;'; + $txt .= '}'; + $txt .= '#pma_console .message .bookmark_label.shared {'; + $txt .= ' background: #396;'; + $txt .= '}'; + $txt .= '#pma_console .message.expanded .bookmark_label {'; + $txt .= ' border-top-left-radius: 0;'; + $txt .= ' border-top-right-radius: 0;'; + $txt .= '}'; + $txt .= '#pma_console .query_input {'; + $txt .= ' position: relative;'; + $txt .= '}'; + $txt .= '#pma_console .mid_layer {'; + $txt .= ' height: 100%;'; + $txt .= ' width: 100%;'; + $txt .= ' position: absolute;'; + $txt .= ' top: 0;'; + /* For support IE8, this layer doesn't use filter:opacity or opacity + js code will fade this layer opacity to 0.18(using animation) */ + $txt .= ' background: #666;'; + $txt .= ' display: none;'; + $txt .= ' cursor: pointer;'; + $txt .= ' z-index: 200;'; + $txt .= '}'; + $txt .= '#pma_console .card {'; + $txt .= ' position: absolute;'; + $txt .= ' width: 94%;'; + $txt .= ' height: 100%;'; + $txt .= ' min-height: 48px;'; + $txt .= ' : 100%;'; + $txt .= ' top: 0;'; + $txt .= ' border-: solid 1px #999;'; + $txt .= ' z-index: 300;'; + $txt .= ' transition: 0.2s;'; + $txt .= ' -ms-transition: 0.2s;'; + $txt .= ' -webkit-transition: 0.2s;'; + $txt .= ' -moz-transition: 0.2s;'; + $txt .= '}'; + $txt .= '#pma_console .card.show {'; + $txt .= ' : 6%;'; + $txt .= ' box-shadow: -2px 1px 4px -1px #999;'; + $txt .= '}'; + $txt .= 'html.ie7 #pma_console .query_input {'; + $txt .= ' display: none;'; + $txt .= '}'; + $txt .= '#pma_bookmarks .content.add_bookmark,'; + $txt .= '#pma_console_options .content {'; + $txt .= ' padding: 4px 6px;'; + $txt .= '}'; + $txt .= '#pma_bookmarks .content.add_bookmark .options {'; + $txt .= ' margin-: 1.4em;'; + $txt .= ' padding-bottom: .4em;'; + $txt .= ' margin-bottom: .4em;'; + $txt .= ' border-bottom: solid 1px #ccc;'; + $txt .= '}'; + $txt .= '#pma_bookmarks .content.add_bookmark .options button {'; + $txt .= ' margin: 0 7px;'; + $txt .= ' vertical-align: bottom;'; + $txt .= '}'; + $txt .= '#pma_bookmarks .content.add_bookmark input[type=text] {'; + $txt .= ' margin: 0;'; + $txt .= ' padding: 2px 4px;'; + $txt .= '}'; + $txt .= '#pma_console .button.hide,'; + $txt .= '#pma_console .message span.text.hide {'; + $txt .= ' display: none;'; + $txt .= '}'; + $txt .= '#debug_console.grouped .ungroup_queries,'; + $txt .= '#debug_console.ungrouped .group_queries {'; + $txt .= ' display: inline-block;'; + $txt .= '}'; + $txt .= '#debug_console.ungrouped .ungroup_queries,'; + $txt .= '#debug_console.ungrouped .sort_count,'; + $txt .= '#debug_console.grouped .group_queries {'; + $txt .= ' display: none;'; + $txt .= '}'; + $txt .= '#debug_console .count {'; + $txt .= ' margin-right: 8px;'; + $txt .= '}'; + $txt .= '#debug_console .show_trace .trace,'; + $txt .= '#debug_console .show_args .args {'; + $txt .= ' display: block;'; + $txt .= '}'; + $txt .= '#debug_console .hide_trace .trace,'; + $txt .= '#debug_console .hide_args .args,'; + $txt .= '#debug_console .show_trace .action.dbg_show_trace,'; + $txt .= '#debug_console .hide_trace .action.dbg_hide_trace,'; + $txt .= '#debug_console .traceStep.hide_args .action.dbg_hide_args,'; + $txt .= '#debug_console .traceStep.show_args .action.dbg_show_args {'; + $txt .= ' display: none;'; + $txt .= '}'; + $txt .= '#debug_console .traceStep:after,'; + $txt .= '#debug_console .trace.welcome:after,'; + $txt .= '#debug_console .debug>.welcome:after {'; + $txt .= ' content: "";'; + $txt .= ' display: table;'; + $txt .= ' clear: both;'; + $txt .= '}'; + $txt .= '#debug_console .debug_summary {'; + $txt .= ' float: left;'; + $txt .= '}'; + $txt .= '#debug_console .trace.welcome .time {'; + $txt .= ' float: right;'; + $txt .= '}'; + $txt .= '#debug_console .traceStep .file,'; + $txt .= '#debug_console .script_name {'; + $txt .= ' float: right;'; + $txt .= '}'; + $txt .= '#debug_console .traceStep .args pre {'; + $txt .= ' margin: 0;'; + $txt .= '}'; + /* Code mirror console style*/ + $txt .= '.cm-s-pma .CodeMirror-code pre,'; + $txt .= '.cm-s-pma .CodeMirror-code {'; + $txt .= ' font-family: Monaco, Consolas, monospace;'; + $txt .= '}'; + $txt .= '.cm-s-pma .CodeMirror-measure>pre,'; + $txt .= '.cm-s-pma .CodeMirror-code>pre,'; + $txt .= '.cm-s-pma .CodeMirror-lines {'; + $txt .= ' padding: 0;'; + $txt .= '}'; + $txt .= '.cm-s-pma.CodeMirror {'; + $txt .= ' resize: none;'; + $txt .= ' height: auto;'; + $txt .= ' width: 100%;'; + $txt .= ' min-height: initial;'; + $txt .= ' max-height: initial;'; + $txt .= '}'; + $txt .= '.cm-s-pma .CodeMirror-scroll {'; + $txt .= ' cursor: text;'; + $txt .= '}'; + /* PMA drop-improt style */ + $txt .= '.pma_drop_handler {'; + $txt .= ' display: none;'; + $txt .= ' position: fixed;'; + $txt .= ' top: 0;'; + $txt .= ' left: 0;'; + $txt .= ' width: 100%;'; + $txt .= ' background: rgba(0, 0, 0, 0.6);'; + $txt .= ' height: 100%;'; + $txt .= ' z-index: 999;'; + $txt .= ' color: white;'; + $txt .= ' font-size: 30pt;'; + $txt .= ' text-align: center;'; + $txt .= ' padding-top: 20%;'; + $txt .= '}'; + $txt .= '.pma_sql_import_status {'; + $txt .= ' display: none;'; + $txt .= ' position: fixed;'; + $txt .= ' bottom: 0;'; + $txt .= ' right: 25px;'; + $txt .= ' width: 400px;'; + $txt .= ' border: 1px solid #999;'; + $txt .= ' background: ;'; + $txt .= ' -moz-border-radius: 4px;'; + $txt .= ' -webkit-border-radius: 4px;'; + $txt .= ' border-radius: 4px;'; + $txt .= ' -moz-box-shadow: 2px 2px 5px #ccc;'; + $txt .= ' -webkit-box-shadow: 2px 2px 5px #ccc;'; + $txt .= ' box-shadow: 2px 2px 5px #ccc;'; + $txt .= '}'; + $txt .= '.pma_sql_import_status h2,'; + $txt .= '.pma_drop_result h2 {'; + $txt .= ' background-color: #bbb;'; + $txt .= ' padding: .1em .3em;'; + $txt .= ' margin-top: 0;'; + $txt .= ' margin-bottom: 0;'; + $txt .= ' color: #fff;'; + $txt .= ' font-size: 1.6em;'; + $txt .= ' font-weight: normal;'; + $txt .= ' text-shadow: 0 1px 0 #777;'; + $txt .= ' -moz-box-shadow: 1px 1px 15px #999 inset;'; + $txt .= ' -webkit-box-shadow: 1px 1px 15px #999 inset;'; + $txt .= ' box-shadow: 1px 1px 15px #999 inset;'; + $txt .= '}'; + $txt .= '.pma_sql_import_status div {'; + $txt .= ' height: 270px;'; + $txt .= ' overflow-y:auto;'; + $txt .= ' overflow-x:hidden;'; + $txt .= ' list-style-type: none;'; + $txt .= '}'; + $txt .= '.pma_sql_import_status div li {'; + $txt .= ' padding: 8px 10px;'; + $txt .= ' border-bottom: 1px solid #bbb;'; + $txt .= ' color: rgb(148, 14, 14);'; + $txt .= ' background: white;'; + $txt .= '}'; + $txt .= '.pma_sql_import_status div li .filesize {'; + $txt .= ' float: right;'; + $txt .= '}'; + $txt .= '.pma_sql_import_status h2 .minimize {'; + $txt .= ' float: right;'; + $txt .= ' margin-right: 5px;'; + $txt .= ' padding: 0 10px;'; + $txt .= '}'; + $txt .= '.pma_sql_import_status h2 .close {'; + $txt .= ' float: right;'; + $txt .= ' margin-right: 5px;'; + $txt .= ' padding: 0 10px;'; + $txt .= ' display: none;'; + $txt .= '}'; + $txt .= '.pma_sql_import_status h2 .minimize:hover,'; + $txt .= '.pma_sql_import_status h2 .close:hover,'; + $txt .= '.pma_drop_result h2 .close:hover {'; + $txt .= ' background: rgba(155, 149, 149, 0.78);'; + $txt .= ' cursor: pointer;'; + $txt .= '}'; + $txt .= '.pma_drop_file_status {'; + $txt .= ' color: #235a81;'; + $txt .= '}'; + $txt .= '.pma_drop_file_status span.underline:hover {'; + $txt .= ' cursor: pointer;'; + $txt .= ' text-decoration: underline;'; + $txt .= '}'; + $txt .= '.pma_drop_result {'; + $txt .= ' position: fixed;'; + $txt .= ' top: 10%;'; + $txt .= ' left: 20%;'; + $txt .= ' width: 60%;'; + $txt .= ' background: white;'; + $txt .= ' min-height: 300px;'; + $txt .= ' z-index: 800;'; + $txt .= ' -webkit-box-shadow: 0 0 15px #999;'; + $txt .= ' border-radius: 10px;'; + $txt .= ' cursor: move;'; + $txt .= '}'; + $txt .= '.pma_drop_result h2 .close {'; + $txt .= ' float: right;'; + $txt .= ' margin-right: 5px;'; + $txt .= ' padding: 0 10px;'; + $txt .= '}'; + $txt .= '.dependencies_box {'; + $txt .= ' background-color: white;'; + $txt .= ' border: 3px ridge black;'; + $txt .= '}'; + $txt .= '#composite_index_list {'; + $txt .= ' list-style-type: none;'; + $txt .= ' list-style-position: inside;'; + $txt .= '}'; + $txt .= 'span.drag_icon {'; + $txt .= ' display: inline-block;'; + $txt .= ' background-image: url(\'getImgPath(\'s_sortable.png\');?>\');'; + $txt .= ' background-position: center center;'; + $txt .= ' background-repeat: no-repeat;'; + $txt .= ' width: 1em;'; + $txt .= ' height: 3em;'; + $txt .= ' cursor: move;'; + $txt .= '}'; + $txt .= '.topmargin {'; + $txt .= ' margin-top: 1em;'; + $txt .= '}'; + $txt .= 'meter[value="1"]::-webkit-meter-optimum-value {'; + $txt .= ' background: linear-gradient(white 3%, #E32929 5%, transparent 10%, #E32929);'; + $txt .= '}'; + $txt .= 'meter[value="2"]::-webkit-meter-optimum-value {'; + $txt .= ' background: linear-gradient(white 3%, #FF6600 5%, transparent 10%, #FF6600);'; + $txt .= '}'; + $txt .= 'meter[value="3"]::-webkit-meter-optimum-value {'; + $txt .= ' background: linear-gradient(white 3%, #FFD700 5%, transparent 10%, #FFD700);'; + $txt .= '}'; + /* styles for sortable tables created with tablesorter jquery plugin */ + $txt .= 'th.header {'; + $txt .= ' cursor: pointer;'; + $txt .= ' color: #235a81;'; + $txt .= '}'; + $txt .= 'th.header:hover {'; + $txt .= ' text-decoration: underline;'; + $txt .= '}'; + $txt .= 'th.header .sorticon {'; + $txt .= ' width: 16px;'; + $txt .= ' height: 16px;'; + $txt .= ' background-repeat: no-repeat;'; + $txt .= ' background-position: right center;'; + $txt .= ' display: inline-table;'; + $txt .= ' vertical-align: middle;'; + $txt .= ' float: right;'; + $txt .= '}'; + $txt .= 'th.headerSortUp .sorticon, th.headerSortDown:hover .sorticon {'; + $txt .= ' background-image: url(getImgPath(\'s_desc.png\');?>);'; + $txt .= '}'; + $txt .= 'th.headerSortDown .sorticon, th.headerSortUp:hover .sorticon {'; + $txt .= ' background-image: url(getImgPath(\'s_asc.png\');?>);'; + $txt .= '}'; + /* end of styles of sortable tables */ + /* styles for jQuery-ui to support rtl languages */ + $txt .= 'body .ui-dialog .ui-dialog-titlebar-close {'; + $txt .= ' : .3em;'; + $txt .= ' : initial;'; + $txt .= '}'; + $txt .= 'body .ui-dialog .ui-dialog-title {'; + $txt .= ' float: ;'; + $txt .= '}'; + $txt .= 'body .ui-dialog .ui-dialog-buttonpane .ui-dialog-buttonset {'; + $txt .= ' float: ;'; + $txt .= '}'; + /* end of styles for jQuery-ui to support rtl languages */ + $txt .= '@media only screen and (max-width: 768px) {'; + $txt .= ' #main_pane_left {'; + $txt .= ' width: 100%;'; + $txt .= ' }'; + $txt .= ' #main_pane_right {'; + $txt .= ' padding-top: 0;'; + $txt .= ' padding-: 1px;'; + $txt .= ' padding-: 1px;'; + $txt .= ' }'; + + $txt .= ' ul#topmenu,'; + $txt .= ' ul.tabs {'; + $txt .= ' display: flex;'; + $txt .= ' }'; + + $txt .= ' .navigationbar {'; + $txt .= ' display: inline-flex;'; + $txt .= ' margin: 0 !important;'; + $txt .= ' border-radius: 0 !important;'; + $txt .= ' overflow: auto;'; + $txt .= ' }'; + + $txt .= ' .scrollindicator {'; + $txt .= ' padding: 5px;'; + $txt .= ' cursor: pointer;'; + $txt .= ' display: inline;'; + $txt .= ' }'; + + $txt .= ' .responsivetable {'; + $txt .= ' overflow-x: auto;'; + $txt .= ' }'; + + $txt .= ' body#loginform div.container {'; + $txt .= ' width: 100%;'; + $txt .= ' }'; + + $txt .= ' .largescreenonly {'; + $txt .= ' display: none;'; + $txt .= ' }'; + + $txt .= ' .width100, .desktop50 {'; + $txt .= ' width: 100%;'; + $txt .= ' }'; + + $txt .= ' .width96 {'; + $txt .= ' width: 96% !important;'; + $txt .= ' }'; + + $txt .= ' #page_nav_icons {'; + $txt .= ' display: none;'; + $txt .= ' }'; + + $txt .= ' table#serverstatusconnections {'; + $txt .= ' margin-left: 0;'; + $txt .= ' }'; + + $txt .= ' #table_name_col_no {'; + $txt .= ' top: 62px'; + $txt .= ' }'; + + $txt .= ' .tdblock tr td {'; + $txt .= ' display: block;'; + $txt .= ' }'; + + $txt .= ' #table_columns {'; + $txt .= ' margin-top: 60px;'; + $txt .= ' }'; + + $txt .= ' #table_columns .tablesorter {'; + $txt .= ' min-width: 100%;'; + $txt .= ' }'; + + $txt .= ' .doubleFieldset fieldset {'; + $txt .= ' width: 98%;'; + $txt .= ' }'; + + $txt .= ' div#serverstatusquerieschart {'; + $txt .= ' width: 100%;'; + $txt .= ' height: 450px;'; + $txt .= ' }'; + + $txt .= ' .ui-dialog {'; + $txt .= ' margin: 1%;'; + $txt .= ' width: 95% !important;'; + $txt .= ' }'; + $txt .= '}'; + /* templates/database/designer */ + /* side menu */ + $txt .= '#name-panel {'; + $txt .= ' overflow:hidden;'; + $txt .= '}'; + + // Check if the file is writable as this condition would only occur if files are overwritten. + if ($file) { + fwrite($file, $txt); + fclose($file); + } else { + trigger_error("The common.css.php file is not writable by the webserver process. You must change permissions for the theme generator to be able to write the generated theme.", E_USER_ERROR); + } + return null; + } +} diff --git a/libraries/classes/ThemeGenerator/Layout.php b/libraries/classes/ThemeGenerator/Layout.php new file mode 100644 index 0000000000..1f2044388f --- /dev/null +++ b/libraries/classes/ThemeGenerator/Layout.php @@ -0,0 +1,113 @@ +\n"; + $txt .= '#pma_navigation {'; + $txt .= ' width: px;'; + $txt .= ' position: fixed;'; + $txt .= ' top: 0;'; + $txt .= ' : 0;'; + $txt .= ' height: 100vh;'; + $txt .= ' background: linear-gradient(to right, , );'; + $txt .= ' color: ;'; + $txt .= ' z-index: 800;'; + $txt .= '}'; + $txt .= '#pma_navigation_header {'; + $txt .= ' overflow: hidden;'; + $txt .= '}'; + $txt .= '#pma_navigation_content {'; + $txt .= ' width: 100%;'; + $txt .= ' height: 100%;'; + $txt .= ' position: absolute;'; + $txt .= ' top: 0;'; + $txt .= ' : 0;'; + $txt .= ' z-index: 0;'; + $txt .= '}'; + $txt .= '#pma_navigation ul {'; + $txt .= ' margin: 0;'; + $txt .= '}'; + $txt .= '#pma_navigation form {'; + $txt .= ' margin: 0;'; + $txt .= ' padding: 0;'; + $txt .= ' display: inline;'; + $txt .= '}'; + $txt .= '#pma_navigation select#select_server,'; + $txt .= '#pma_navigation select#lightm_db {'; + $txt .= ' width: 100%;'; + $txt .= '}'; + $txt .= '#pma_navigation div.pageselector {'; + $txt .= ' text-align: center;'; + $txt .= ' margin: 0;'; + $txt .= ' margin-: 0.75em;'; + $txt .= ' border-: 1px solid #666;'; + $txt .= '}'; + $txt .= '#pma_navigation div#pmalogo {'; + $txt .= ' '; + $txt .= '}'; + $txt .= '#pma_navigation #pmalogo,'; + $txt .= '#pma_navigation #serverChoice,'; + $txt .= '#pma_navigation #navipanellinks,'; + $txt .= '#pma_navigation #recentTableList,'; + $txt .= '#pma_navigation #favoriteTableList,'; + $txt .= '#pma_navigation #databaseList,'; + $txt .= '#pma_navigation div.pageselector.dbselector {'; + $txt .= ' text-align: center;'; + $txt .= ' padding: 5px 10px 0;'; + $txt .= ' border: 0;'; + $txt .= '}'; + $txt .= '#pma_navigation #recentTable,'; + $txt .= '#pma_navigation #favoriteTable {'; + $txt .= ' width: 200px;'; + $txt .= '}'; + $txt .= '#pma_navigation #favoriteTableList select,'; + $txt .= '#pma_navigation #serverChoice select'; + $txt .= ' {'; + $txt .= ' width: 80%;'; + $txt .= '}'; + $txt .= '#pma_navigation_content > img.throbber {'; + $txt .= ' display: none;'; + $txt .= ' margin: .3em auto 0;'; + $txt .= '}'; + $txt .= '#pma_navigation_tree {'; + $txt .= ' margin: 0;'; + $txt .= ' margin-: 5px;'; + $txt .= ' overflow: hidden;'; + $txt .= ' color: #444;'; + $txt .= ' height: 74%;'; + $txt .= ' position: relative;'; + $txt .= '}'; + $txt .= '#pma_navigation_select_database {'; + $txt .= ' text-align: left;'; + $txt .= ' padding: 0 0 0;'; + $txt .= ' border: 0;'; + $txt .= ' margin: 0;'; + $txt .= '}'; + $txt .= '#pma_navigation_db_select {'; + $txt .= ' margin-top: 0.5em;'; + $txt .= ' margin-: 0.75em;'; + $txt .= '}'; + $txt .= '#pma_navigation_db_select select {'; + $txt .= ' background: url("./themes/pmahomme/img/select_bg.png") repeat scroll 0 0;'; + $txt .= ' -webkit-border-radius: 2px;'; + $txt .= ' border-radius: 2px;'; + $txt .= ' border: 1px solid #bbb;'; + $txt .= ' border-top: 1px solid #bbb;'; + $txt .= ' color: #333;'; + $txt .= ' padding: 4px 6px;'; + $txt .= ' margin: 0 0 0;'; + $txt .= ' width: 92%;'; + $txt .= ' font-size: 1.11em;'; + $txt .= '}'; + $txt .= '#pma_navigation_tree_content {'; + $txt .= ' width: 100%;'; + $txt .= ' overflow: hidden;'; + $txt .= ' overflow-y: auto;'; + $txt .= ' position: absolute;'; + $txt .= ' height: 100%;'; + $txt .= '}'; + $txt .= '#pma_navigation_tree_content a.hover_show_full {'; + $txt .= ' position: relative;'; + $txt .= ' z-index: 100;'; + $txt .= ' vertical-align: sub;'; + $txt .= '}'; + $txt .= '#pma_navigation_tree a {'; + $txt .= ' color: ;'; + $txt .= '}'; + $txt .= '#pma_navigation_tree a:hover {'; + $txt .= ' text-decoration: underline;'; + $txt .= '}'; + $txt .= '#pma_navigation_tree li.activePointer {'; + $txt .= ' color: ;'; + $txt .= ' background-color: ;'; + $txt .= '}'; + $txt .= '#pma_navigation_tree li.selected {'; + $txt .= ' color: ;'; + $txt .= ' background-color: ;'; + $txt .= '}'; + $txt .= '#pma_navigation_tree li .dbItemControls {'; + $txt .= ' padding-left: 4px;'; + $txt .= '}'; + $txt .= '#pma_navigation_tree li .navItemControls {'; + $txt .= ' display: none;'; + $txt .= ' padding-left: 4px;'; + $txt .= '}'; + $txt .= '#pma_navigation_tree li.activePointer .navItemControls {'; + $txt .= ' display: inline;'; + $txt .= ' opacity: 0.5;'; + $txt .= '}'; + $txt .= '#pma_navigation_tree li.activePointer .navItemControls:hover {'; + $txt .= ' display: inline;'; + $txt .= ' opacity: 1.0;'; + $txt .= '}'; + $txt .= '#pma_navigation_tree ul {'; + $txt .= ' clear: both;'; + $txt .= ' padding: 0;'; + $txt .= ' list-style-type: none;'; + $txt .= ' margin: 0;'; + $txt .= '}'; + $txt .= '#pma_navigation_tree ul ul {'; + $txt .= ' position: relative;'; + $txt .= '}'; + $txt .= '#pma_navigation_tree li,'; + $txt .= '#pma_navigation_tree li.fast_filter {'; + $txt .= ' white-space: nowrap;'; + $txt .= ' clear: both;'; + $txt .= ' min-height: 16px;'; + $txt .= '}'; + $txt .= '#pma_navigation_tree img {'; + $txt .= ' margin: 0;'; + $txt .= '}'; + $txt .= '#pma_navigation_tree i {'; + $txt .= ' display: block;'; + $txt .= '}'; + $txt .= '#pma_navigation_tree div.block {'; + $txt .= ' position: relative;'; + $txt .= ' width: 1.5em;'; + $txt .= ' height: 1.5em;'; + $txt .= ' min-width: 16px;'; + $txt .= ' min-height: 16px;'; + $txt .= ' float: ;'; + $txt .= '}'; + $txt .= '#pma_navigation_tree div.block.double {'; + $txt .= ' width: 2.5em;'; + $txt .= '}'; + $txt .= '#pma_navigation_tree div.block i,'; + $txt .= '#pma_navigation_tree div.block b {'; + $txt .= ' width: 1.5em;'; + $txt .= ' height: 1.7em;'; + $txt .= ' min-width: 16px;'; + $txt .= ' min-height: 8px;'; + $txt .= ' position: absolute;'; + $txt .= ' bottom: 0.7em;'; + $txt .= ' : 0.75em;'; + $txt .= ' z-index: 0;'; + $txt .= '}'; + $txt .= '#pma_navigation_tree div.block i { /* Top and right segments for the tree element connections */'; + $txt .= ' display: block;'; + $txt .= ' border-: 1px solid #666;'; + $txt .= ' border-bottom: 1px solid #666;'; + $txt .= ' position: relative;'; + $txt .= ' z-index: 0;'; + $txt .= '}'; + $txt .= '#pma_navigation_tree div.block i.first { /* Removes top segment */'; + $txt .= ' border-: 0;'; + $txt .= '}'; + $txt .= '#pma_navigation_tree div.block b { /* Bottom segment for the tree element connections */'; + $txt .= ' display: block;'; + $txt .= ' height: 0.75em;'; + $txt .= ' bottom: 0;'; + $txt .= ' : 0.75em;'; + $txt .= ' border-: 1px solid #666;'; + $txt .= '}'; + $txt .= '#pma_navigation_tree div.block a,'; + $txt .= '#pma_navigation_tree div.block u {'; + $txt .= ' position: absolute;'; + $txt .= ' : 50%;'; + $txt .= ' top: 50%;'; + $txt .= ' z-index: 10;'; + $txt .= '}'; + $txt .= '#pma_navigation_tree div.block a + a {'; + $txt .= ' : 100%;'; + $txt .= '}'; + $txt .= '#pma_navigation_tree div.block.double a,'; + $txt .= '#pma_navigation_tree div.block.double u {'; + $txt .= ' : 33%;'; + $txt .= '}'; + $txt .= '#pma_navigation_tree div.block.double a + a {'; + $txt .= ' : 85%;'; + $txt .= '}'; + $txt .= '#pma_navigation_tree div.block img {'; + $txt .= ' position: relative;'; + $txt .= ' top: -0.6em;'; + $txt .= ' : 0;'; + $txt .= ' margin-: -7px;'; + $txt .= '}'; + $txt .= '#pma_navigation_tree div.throbber img {'; + $txt .= ' top: 2px;'; + $txt .= ' : 2px;'; + $txt .= '}'; + $txt .= '#pma_navigation_tree li.last > ul {'; + $txt .= ' background: none;'; + $txt .= '}'; + $txt .= '#pma_navigation_tree li > a, #pma_navigation_tree li > i {'; + $txt .= ' line-height: 1.5em;'; + $txt .= ' height: 1.5em;'; + $txt .= ' padding-: 0.3em;'; + $txt .= '}'; + $txt .= '#pma_navigation_tree .list_container {'; + $txt .= ' border-: 1px solid #666;'; + $txt .= ' margin-: 0.75em;'; + $txt .= ' padding-: 0.75em;'; + $txt .= '}'; + $txt .= '#pma_navigation_tree .last > .list_container {'; + $txt .= ' border-: 0 solid #666;'; + $txt .= '}'; + $txt .= ''; + $txt .= 'li.fast_filter {'; + $txt .= ' padding-: 0.75em;'; + $txt .= ' margin-: 0.75em;'; + $txt .= ' padding-: 35px;'; + $txt .= ' border-: 1px solid #666;'; + $txt .= ' list-style: none;'; + $txt .= '}'; + $txt .= 'li.fast_filter input {'; + $txt .= ' margin: 3px 0 0 0;'; + $txt .= ' font-size: 0.7em;'; + $txt .= ' padding-top: 2px;'; + $txt .= ' padding-bottom: 2px;'; + $txt .= ' padding-: 4px;'; + $txt .= ' padding-: 1.7em;'; + $txt .= ' width: 100%;'; + $txt .= '}'; + $txt .= 'li.fast_filter span {'; + $txt .= ' position: relative;'; + $txt .= ' : 1.5em;'; + $txt .= ' padding: 0.2em;'; + $txt .= ' cursor: pointer;'; + $txt .= ' font-weight: bold;'; + $txt .= ' color: #800;'; + $txt .= ' font-size: 0.7em;'; + $txt .= '}'; + /* IE10+ has its own reset X */ + $txt .= 'html.ie li.fast_filter span {'; + $txt .= ' display: none;'; + $txt .= '}'; + $txt .= 'html.ie.ie9 li.fast_filter span,'; + $txt .= 'html.ie.ie8 li.fast_filter span {'; + $txt .= ' display: auto;'; + $txt .= '}'; + $txt .= 'html.ie li.fast_filter input {'; + $txt .= ' padding-: .2em;'; + $txt .= '}'; + $txt .= 'html.ie.ie9 li.fast_filter input,'; + $txt .= 'html.ie.ie8 li.fast_filter input {'; + $txt .= ' padding-: 1.7em;'; + $txt .= '}'; + $txt .= 'li.fast_filter.db_fast_filter {'; + $txt .= ' border: 0;'; + $txt .= ' margin-left: 0;'; + $txt .= ' margin-right: 10px;'; + $txt .= '}'; + $txt .= '#navigation_controls_outer {'; + $txt .= ' min-height: 21px !important;'; + $txt .= '}'; + $txt .= '#navigation_controls_outer.activePointer {'; + $txt .= ' background-color: transparent !important;'; + $txt .= '}'; + $txt .= '#navigation_controls {'; + $txt .= ' float: right;'; + $txt .= ' padding-right: 23px;'; + $txt .= '}'; + $txt .= '#pma_navigation_resizer {'; + $txt .= ' width: 3px;'; + $txt .= ' height: 100%;'; + $txt .= ' background-color: #aaa;'; + $txt .= ' cursor: col-resize;'; + $txt .= ' position: fixed;'; + $txt .= ' top: 0;'; + $txt .= ' : 240px;'; + $txt .= ' z-index: 801;'; + $txt .= '}'; + $txt .= '#pma_navigation_collapser {'; + $txt .= ' width: 20px;'; + $txt .= ' height: 22px;'; + $txt .= ' line-height: 22px;'; + $txt .= ' background: #eee;'; + $txt .= ' color: #555;'; + $txt .= ' font-weight: bold;'; + $txt .= ' position: fixed;'; + $txt .= ' top: 0;'; + $txt .= ' : px;'; + $txt .= ' text-align: center;'; + $txt .= ' cursor: pointer;'; + $txt .= ' z-index: 800;'; + $txt .= ' text-shadow: 0 1px 0 #fff;'; + $txt .= ' filter: dropshadow(color=#fff, offx=0, offy=1);'; + $txt .= ' border: 1px solid #888;'; + $txt .= '}'; + $txt .= '.pma_quick_warp {'; + $txt .= ' margin-top: 5px;'; + $txt .= ' margin-: 2px;'; + $txt .= ' position: relative;'; + $txt .= '}'; + $txt .= '.pma_quick_warp .drop_list {'; + $txt .= ' float: ;'; + $txt .= ' margin-: 3px;'; + $txt .= ' padding: 2px 0;'; + $txt .= '}'; + $txt .= '.pma_quick_warp .drop_button {'; + $txt .= ' padding: 0 .3em;'; + $txt .= ' border: 1px solid #ddd;'; + $txt .= ' border-radius: .3em;'; + $txt .= ' background: #f2f2f2;'; + $txt .= ' cursor: pointer;'; + $txt .= '}'; + $txt .= '.pma_quick_warp .drop_list:hover .drop_button {'; + $txt .= ' background: #fff;'; + $txt .= '}'; + $txt .= '.pma_quick_warp .drop_list ul {'; + $txt .= ' position: absolute;'; + $txt .= ' margin: 0;'; + $txt .= ' padding: 0;'; + $txt .= ' overflow: hidden;'; + $txt .= ' overflow-y: auto;'; + $txt .= ' list-style: none;'; + $txt .= ' background: #fff;'; + $txt .= ' border: 1px solid #ddd;'; + $txt .= ' border-radius: .3em;'; + $txt .= ' border-top--radius: 0;'; + $txt .= ' border-bottom--radius: 0;'; + $txt .= ' box-shadow: 0 0 5px #ccc;'; + $txt .= ' top: 100%;'; + $txt .= ' : 3px;'; + $txt .= ' : 0;'; + $txt .= ' display: none;'; + $txt .= ' z-index: 802;'; + $txt .= '}'; + $txt .= '.pma_quick_warp .drop_list:hover ul {'; + $txt .= ' display: block;'; + $txt .= '}'; + $txt .= '.pma_quick_warp .drop_list li {'; + $txt .= ' white-space: nowrap;'; + $txt .= ' padding: 0;'; + $txt .= ' border-radius: 0;'; + $txt .= '}'; + $txt .= '.pma_quick_warp .drop_list li img {'; + $txt .= ' vertical-align: sub;'; + $txt .= '}'; + $txt .= '.pma_quick_warp .drop_list li:hover {'; + $txt .= ' background: #f2f2f2;'; + $txt .= '}'; + $txt .= '.pma_quick_warp .drop_list a {'; + $txt .= ' display: block;'; + $txt .= ' padding: .2em .3em;'; + $txt .= '}'; + $txt .= '.pma_quick_warp .drop_list a.favorite_table_anchor {'; + $txt .= ' clear: left;'; + $txt .= ' float: left;'; + $txt .= ' padding: .1em .3em 0;'; + $txt .= '}'; + + // Check if the file is writable as this condition would only occur if files are overwritten. + if ($file) { + fwrite($file, $txt); + fclose($file); + } else { + trigger_error("The navigation.css.php file is not writable by the webserver process. You must change permissions for the theme generator to be able to write the generated theme.", E_USER_ERROR); + } + return null; + } +} diff --git a/libraries/config.default.php b/libraries/config.default.php index 6aa368f95a..478878b891 100644 --- a/libraries/config.default.php +++ b/libraries/config.default.php @@ -2894,6 +2894,13 @@ $cfg['ThemeDefault'] = 'pmahomme'; */ $cfg['ThemePerServer'] = false; +/** + * Enabling theme generator + * + * @global boolean $cfg['ThemeGenerator'] + */ +$cfg['ThemeGenerator'] = false; + /******************************************************************************* * */ diff --git a/templates/theme_generator/color_picker.twig b/templates/theme_generator/color_picker.twig new file mode 100644 index 0000000000..1c11568773 --- /dev/null +++ b/templates/theme_generator/color_picker.twig @@ -0,0 +1,9 @@ +
    +
    +
    +
    +
    +
    +
    +
    +
    diff --git a/templates/theme_generator/form.twig b/templates/theme_generator/form.twig new file mode 100644 index 0000000000..e3e862fc5e --- /dev/null +++ b/templates/theme_generator/form.twig @@ -0,0 +1,40 @@ +
    + +
    +   Font :
    + +
    +   {% trans 'Theme Name' %} :
    +
    +
    +   {% trans 'Version' %} :
    +
    +
    +   {% trans 'Description' %} :
    +
    +
    +   {% trans 'Author' %} :
    +
    +
    +   {% trans 'URL' %} :
    +
    + {% trans 'Automatically set text colours for best visibility' %}
    +

    + + +
    diff --git a/templates/theme_generator/group_preview.twig b/templates/theme_generator/group_preview.twig new file mode 100644 index 0000000000..54ef07deb9 --- /dev/null +++ b/templates/theme_generator/group_preview.twig @@ -0,0 +1,20 @@ +
    +

    Preview Panel

    + +
    diff --git a/templates/theme_generator/table_preview.twig b/templates/theme_generator/table_preview.twig new file mode 100644 index 0000000000..0e037ef908 --- /dev/null +++ b/templates/theme_generator/table_preview.twig @@ -0,0 +1,75 @@ +
    +
    +
    +
    +
    +
    +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Full textsDname Ascending 1
    Row 1
    Row 2
    Row 3
    + + +
    +
    +
    + + + +
    +
    diff --git a/test/classes/ThemeGenerator/LayoutTest.php b/test/classes/ThemeGenerator/LayoutTest.php new file mode 100644 index 0000000000..88adbf22f4 --- /dev/null +++ b/test/classes/ThemeGenerator/LayoutTest.php @@ -0,0 +1,35 @@ +setUp(); + $output = $theme->getLayoutData(); + $this->assertFileIsReadable('themes/' . $post['theme_name'] . '/layout.inc.php'); + $this->assertContains('$GLOBALS[\'cfg\'][\'NaviBackground\'] = \'' . $post['Navigation_Panel'] . '\';' , $output); + } +} diff --git a/test/classes/ThemeGeneratorTest.php b/test/classes/ThemeGeneratorTest.php new file mode 100644 index 0000000000..7f4cfbeafe --- /dev/null +++ b/test/classes/ThemeGeneratorTest.php @@ -0,0 +1,133 @@ +theme = new ThemeGenerator(); + $this->output = $this->theme->createFileStructure($_POST); + return $_POST; + } + + /** + * Test for ThemeGenerator::colorPicker + * + * @return void + */ + public function testColorPicker() + { + if ($GLOBALS['cfg']['ThemeGenerator']) { + $output = $this->theme->colorPicker(); + $this->assertContains('
    ' , $output); + $this->assertContains('
    ' , $output); + $this->assertContains('
    ' , $output); + $this->assertContains('
    ' , $output); + $this->assertContains('
    ' , $output); + $this->assertContains('
    ' , $output); + } + } + + /** + * Test for ThemeGenerator::form + * + * @return void + */ + public function testForm() + { + if ($GLOBALS['cfg']['ThemeGenerator']) { + $output = $this->theme->form(); + $this->assertContains('
    ' , $output); + $this->assertContains('' , $output); + } + } + + /** + * Test for ThemeGenerator::createJsonFile + * + * @return void + */ + public function testCreateJsonFile() + { + $name = $_POST['theme_name']; + $this->assertFileIsReadable('themes/' . $name . '/theme.json'); + $this->assertContains('"name": "' . $name . '",' , $this->output['json']); + $this->assertContains('"version": "' . $_POST['version'] . '",' , $this->output['json']); + $this->assertContains('"description": "' . $_POST['description'] . '",' , $this->output['json']); + $this->assertContains('"author": "' . $_POST['author'] . '",' , $this->output['json']); + $this->assertContains('"url": "' . $_POST['url'] . '",' , $this->output['json']); + } + + /** + * Return Layout file data + * + * @return string $this->output['layout'] layout.inc.php data string + */ + public function getLayoutData() + { + return $this->output['layout']; + } + + /** + * Tears down the fixture, for example, closes a network connection. + * This method is called after a test is executed. + * + * @return void + */ + protected function tearDown() + { + $name = $_POST['theme_name']; + unlink('themes/' . $name . '/theme.json'); + unlink('themes/' . $name . '/layout.inc.php'); + unlink('themes/' . $name . '/css/common.css.php'); + unlink('themes/' . $name . '/css/navigation.css.php'); + rmdir('themes/' . $name . '/css'); + rmdir('themes/' . $name); + } +} diff --git a/theme_generator.php b/theme_generator.php new file mode 100644 index 0000000000..362f8ba052 --- /dev/null +++ b/theme_generator.php @@ -0,0 +1,42 @@ +getHeader(); +$scripts = $header->getScripts(); +if ($GLOBALS['cfg']['ThemeGenerator']) { + $scripts->addFile('theme_generator/color_picker.js'); + $scripts->addFile('theme_generator/preview.js'); + + $theme = new ThemeGenerator(); + + $response->addHTML($theme->testWritableThemeDirectory()); + $response->addHTML($theme->colorPicker()); + $response->addHTML($theme->form()); + $response->addHTML($theme->tablePreview()); + $response->addHTML($theme->groupPreview()); + if (isset($_POST['Base_Colour'])) { + $output = $theme->createFileStructure($_POST); + if ($output['json'] && $output['layout']) { + $response->addHTML( + Message::success( + sprintf( + __('Theme saved, go to the %smain page%s to try it'), + '', + '' + ) + ) + ); + } + } +} diff --git a/themes/pmahomme/css/theme_generator.css.php b/themes/pmahomme/css/theme_generator.css.php new file mode 100644 index 0000000000..79f9d4ca33 --- /dev/null +++ b/themes/pmahomme/css/theme_generator.css.php @@ -0,0 +1,725 @@ +getImgPath('theme_generator/picker_mask_200.png'); +$arrow = $theme->getImgPath('theme_generator/arrow.png'); +$arrows = $theme->getImgPath('theme_generator/arrows.png'); +$hue = $theme->getImgPath('theme_generator/hue.png'); +$alpha = $theme->getImgPath('theme_generator/alpha.png'); +$alphaMask = $theme->getImgPath('theme_generator/alpha_mask.png'); +$grain = $theme->getImgPath('theme_generator/grain.png'); +?> + +.ui-color-picker { + width: 420px; + margin: 0; + border: 1px solid #DDD; + background-color: #FFF; + display: table; + + -moz-user-select: none; + -webkit-user-select: none; + -ms-user-select: none; + user-select: none; +} + +.ui-color-picker .picking-area { + width: 198px; + height: 198px; + margin: 5px; + border: 1px solid #DDD; + position: relative; + float: left; + display: table; +} + +.ui-color-picker .picking-area:hover { + cursor: default; +} + +/* HSB format - Hue-Saturation-Value(Brightness) */ +.ui-color-picker .picking-area { + background: url() center center; + + background: -moz-linear-gradient(bottom, #000 0%, rgba(0, 0, 0, 0) 100%), + -moz-linear-gradient(left, #FFF 0%, rgba(255, 255, 255, 0) 100%); + background: -webkit-linear-gradient(bottom, #000 0%, rgba(0, 0, 0, 0) 100%), + -webkit-linear-gradient(left, #FFF 0%, rgba(255, 255, 255, 0) 100%); + background: -ms-linear-gradient(bottom, #000 0%, rgba(0, 0, 0, 0) 100%), + -ms-linear-gradient(left, #FFF 0%, rgba(255, 255, 255, 0) 100%); + background: -o-linear-gradient(bottom, #000 0%, rgba(0, 0, 0, 0) 100%), + -o-linear-gradient(left, #FFF 0%, rgba(255, 255, 255, 0) 100%); + + background-color: #F00; +} + +/* HSL format - Hue-Saturation-Lightness */ +.ui-color-picker[data-mode='HSL'] .picking-area { + background: -moz-linear-gradient(top, hsl(0, 0%, 100%) 0%, hsla(0, 0%, 100%, 0) 50%, + hsla(0, 0%, 0%, 0) 50%, hsl(0, 0%, 0%) 100%), + -moz-linear-gradient(left, hsl(0, 0%, 50%) 0%, hsla(0, 0%, 50%, 0) 100%); + background: -webkit-linear-gradient(top, hsl(0, 0%, 100%) 0%, hsla(0, 0%, 100%, 0) 50%, + hsla(0, 0%, 0%, 0) 50%, hsl(0, 0%, 0%) 100%), + -webkit-linear-gradient(left, hsl(0, 0%, 50%) 0%, hsla(0, 0%, 50%, 0) 100%); + background: -ms-linear-gradient(top, hsl(0, 0%, 100%) 0%, hsla(0, 0%, 100%, 0) 50%, + hsla(0, 0%, 0%, 0) 50%, hsl(0, 0%, 0%) 100%), + -ms-linear-gradient(left, hsl(0, 0%, 50%) 0%, hsla(0, 0%, 50%, 0) 100%); + background: -o-linear-gradient(top, hsl(0, 0%, 100%) 0%, hsla(0, 0%, 100%, 0) 50%, + hsla(0, 0%, 0%, 0) 50%, hsl(0, 0%, 0%) 100%), + -o-linear-gradient(left, hsl(0, 0%, 50%) 0%, hsla(0, 0%, 50%, 0) 100%); + background-color: #F00; +} + +.ui-color-picker .picker { + width: 10px; + height: 10px; + border-radius: 50%; + border: 1px solid #FFF; + position: absolute; + top: 45%; + left: 45%; +} + +.ui-color-picker .picker:before { + width: 8px; + height: 8px; + content: ""; + position: absolute; + border: 1px solid #999; + border-radius: 50%; +} + +.ui-color-picker .hue, +.ui-color-picker .alpha { + width: 198px; + height: 28px; + margin: 5px; + border: 1px solid #FFF; + float: left; +} + +.ui-color-picker .hue { + background: url() center; + background: -moz-linear-gradient(left, #F00 0%, #FF0 16.66%, #0F0 33.33%, #0FF 50%, + #00F 66.66%, #F0F 83.33%, #F00 100%); + background: -webkit-linear-gradient(left, #F00 0%, #FF0 16.66%, #0F0 33.33%, #0FF 50%, + #00F 66.66%, #F0F 83.33%, #F00 100%); + background: -ms-linear-gradient(left, #F00 0%, #FF0 16.66%, #0F0 33.33%, #0FF 50%, + #00F 66.66%, #F0F 83.33%, #F00 100%); + background: -o-linear-gradient(left, #F00 0%, #FF0 16.66%, #0F0 33.33%, #0FF 50%, + #00F 66.66%, #F0F 83.33%, #F00 100%); +} + +.ui-color-picker .alpha { + border: 1px solid #CCC; + background: url(); +} + +.ui-color-picker .alpha-mask { + width: 100%; + height: 100%; + background: url(); +} + +.ui-color-picker .slider-picker { + width: 2px; + height: 100%; + border: 1px solid #777; + background-color: #FFF; + position: relative; + top: -1px; +} + +/* input HSB and RGB */ + +.ui-color-picker .info { + width: 200px; + margin: 5px; + float: left; +} + +.ui-color-picker .info * { + float: left; +} + +.ui-color-picker .input { + width: 64px; + margin: 5px 2px; + float: left; +} + +.ui-color-picker .input .name { + height: 20px; + width: 30px; + text-align: center; + font-size: 14px; + line-height: 18px; + float: left; +} + +.ui-color-picker .input input { + width: 30px; + height: 18px; + margin: 0; + padding: 0; + border: 1px solid #DDD; + text-align: center; + float: right; + + -moz-user-select: text; + -webkit-user-select: text; + -ms-user-select: text; +} + +.ui-color-picker .input[data-topic="lightness"] { + display: none; +} + +.ui-color-picker[data-mode='HSL'] .input[data-topic="value"] { + display: none; +} + +.ui-color-picker[data-mode='HSL'] .input[data-topic="lightness"] { + display: block; +} + +.ui-color-picker .input[data-topic="alpha"] { + margin-top: 10px; + width: 93px; +} + +.ui-color-picker .input[data-topic="alpha"] > .name { + width: 60px; +} + +.ui-color-picker .input[data-topic="alpha"] > input { + float: right; +} + +.ui-color-picker .input[data-topic="hexa"] { + width: auto; + float: right; + margin: 6px 8px 0 0; +} + +.ui-color-picker .input[data-topic="hexa"] > .name { + display: none; +} + +.ui-color-picker .input[data-topic="hexa"] > input { + width: 90px; + height: 24px; + padding: 2px 0; + -moz-box-sizing: border-box; + -webkit-box-sizing: border-box; + box-sizing: border-box; +} + +/* Preview color */ +.ui-color-picker .preview { + width: 95px; + height: 53px; + margin: 5px; + margin-top: 10px; + border: 1px solid #DDD; + background-image: url(); + float: left; + position: relative; +} + +.ui-color-picker .preview:before { + height: 100%; + width: 50%; + left: 50%; + top: 0; + content: ""; + background: #FFF; + position: absolute; + z-index: 1; +} + +.ui-color-picker .preview-color { + width: 100%; + height: 100%; + background-color: rgba(255, 0, 0, 0.5); + position: absolute; + z-index: 1; +} + +.ui-color-picker .switch_mode { + width: 10px; + height: 20px; + position: relative; + border-radius: 5px 0 0 5px; + border: 1px solid #DDD; + background-color: #EEE; + left: -12px; + top: -1px; + z-index: 1; + transition: all 0.5s; +} + +.ui-color-picker .switch_mode:hover { + background-color: #CCC; + cursor: pointer; +} + +/* + * UI Component + */ + +.ui-input-slider { + height: 20px; + font-family: "Segoe UI", Arial, Helvetica, sans-serif; + -moz-user-select: none; + user-select: none; +} + +.ui-input-slider * { + float: left; + height: 100%; + line-height: 100%; +} + +/* Input Slider */ + +.ui-input-slider > input { + margin: 0; + padding: 0; + width: 50px; + text-align: center; + + -moz-box-sizing: border-box; + -webkit-box-sizing: border-box; + box-sizing: border-box; +} + +.ui-input-slider-info { + width: 90px; + padding: 0px 10px 0px 0px; + text-align: right; + text-transform: lowercase; +} + +.ui-input-slider-left, .ui-input-slider-right { + width: 16px; + cursor: pointer; + background: url() center left no-repeat; +} + +.ui-input-slider-right { + background: url() center right no-repeat; +} + +.ui-input-slider-name { + width: 90px; + padding: 0 10px 0 0; + text-align: right; + text-transform: lowercase; +} + +.ui-input-slider-btn-set { + width: 25px; + background-color: #2C9FC9; + border-radius: 5px; + color: #FFF; + font-weight: bold; + line-height: 14px; + text-align: center; +} + +.ui-input-slider-btn-set:hover { + background-color: #379B4A; + cursor: pointer; +} + +/** + * Container + */ +#container { + width: 100%; + + -moz-box-sizing: border-box; + -webkit-box-sizing: border-box; + box-sizing: border-box; + + display: table; +} + +/** + * Picker Zone + */ + +#picker { + padding: 10px; + width: 980px; +} + +.ui-color-picker { + padding: 3px 5px; + float: left; + border-color: #FFF; +} + +.ui-color-picker .switch_mode { + display: none; +} + +.ui-color-picker .preview-color:hover { + cursor: move; +} + +/** + * Picker Container + */ + +#picker-samples { + width: 375px; + height: 114px; + max-height: 218px; + margin: 0 10px 0 30px; + overflow: hidden; + position: relative; + float: left; + + transition: all 0.2s; +} + +#picker-samples .sample { + width: 40px; + height: 40px; + margin: 5px; + border: 1px solid #DDD; + position: absolute; + float: left; + transition: all 0.2s; +} + +#picker-samples .sample:hover { + cursor: pointer; + border-color: #BBB; + transform: scale(1.15); + border-radius: 3px; +} + +#picker-samples .sample[data-active='true'] { + border-color: #999; +} + +#picker-samples .sample[data-active='true']:after { + content: ""; + position: absolute; + background: url() center no-repeat; + width: 100%; + height: 12px; + top: -12px; + z-index: 2; +} + +#picker-samples #add-icon { + width: 100%; + height: 100%; + position: relative; + box-shadow: inset 0px 0px 2px 0px #DDD; +} + +#picker-samples #add-icon:hover { + cursor: pointer; + border-color: #DDD; + box-shadow: inset 0px 0px 5px 0px #CCC; +} + +#picker-samples #add-icon:before, +#picker-samples #add-icon:after { + content: ""; + position: absolute; + background-color: #EEE; + box-shadow: 0 0 1px 0 #EEE; +} + +#picker-samples #add-icon:before { + width: 70%; + height: 16%; + top: 42%; + left: 15%; +} + +#picker-samples #add-icon:after { + width: 16%; + height: 70%; + top: 15%; + left: 42%; +} + +#picker-samples #add-icon:hover:before, +#picker-samples #add-icon:hover:after { + background-color: #DDD; + box-shadow: 0 0 1px 0 #DDD; +} + +/** + * Controls + */ + +#controls { + width: 110px; + padding: 10px; + float: right; +} + +#controls #picker-switch { + text-align: center; + float: left; +} + +#controls .icon { + width: 48px; + height: 48px; + margin: 10px 0; + background-repeat: no-repeat; + background-position: center; + border: 1px solid #DDD; + display: table; + float: left; +} + +#controls .icon:hover { + cursor: pointer; +} + +#controls .switch { + width: 106px; + padding: 1px; + border: 1px solid #CCC; + font-size: 14px; + text-align: center; + line-height: 24px; + overflow: hidden; + float: left; +} + +#controls .switch:hover { + cursor: pointer; +} + +#controls .switch > * { + width: 50%; + padding: 2px 0; + background-color: #EEE; + float: left; +} + +#controls .switch [data-active='true'] { + color: #FFF; + background-image: url(); + background-color: #777; +} + +/** + * Color Theme + */ + +#color-theme { + margin: 0 8px 0 0; + border: 1px solid #EEE; + display: inline-block; + float: right; +} + +#color-theme .box { + width: 80px; + height: 92px; + float: left; +} + +/** + * Color info box + */ +#color-info { + width: 360px; + float: left; +} + +#color-info .title { + width: 100%; + padding: 15px; + font-size: 18px; + text-align: center; +} + +#color-info .copy-container { + position: absolute; + top: -100%; +} + +#color-info .property { + min-width: 280px; + height: 30px; + margin: 10px 0; + text-align: center; + line-height: 30px; +} + +#color-info .property > * { + float: left; +} + +#color-info .property .type { + width: 60px; + height: 100%; + padding: 0 16px 0 0; + text-align: right; +} + +#color-info .property .value { + width: 200px; + height: 100%; + padding: 0 10px; + font-family: "Segoe UI", Arial, Helvetica, sans-serif; + font-size: 16px; + color: #777; + text-align: center; + background-color: #FFF; + border: none; +} + +#color-info .property .value:hover { + color: #37994A; +} + +#color-info .property .value:hover + .copy { + background-position: center right; +} + +/** + * Color Palette + */ + +#palette { + width: 675px; + height: 220px; + padding: 10px 0; + background-image: url(); + background-repeat: repeat; + background-color: #EEE; + color: #777; + + -moz-box-sizing: border-box; + -webkit-box-sizing: border-box; + box-sizing: border-box; +} + +#color-palette { + width: 1000px; + font-family: Arial, Helvetica, sans-serif; + color: #777; + float: left; +} + +#color-palette .container { + width: 100%; + height: 50px; + line-height: 50px; + overflow: hidden; + float: left; + transition: all 0.5s; +} + +#color-palette .container > * { + float: left; +} + +#color-palette .title { + width: 100px; + padding: 0 10px; + text-align: right; + line-height: inherit; +} + +#color-palette .palette { + width: 494px; + height: 38px; + margin: 3px; + padding: 3px; + display: table; + background-color: #FFF; +} + +#color-palette .palette .sample { + width: 30px; + height: 30px; + margin: 3px; + position: relative; + border: 1px solid #DDD; + float: left; + transition: all 0.2s; +} + +#color-palette .palette .sample:hover { + cursor: pointer; + border-color: #BBB; + transform: scale(1.15); + border-radius: 3px; +} + +#zindex { + height: 20px; + margin: 5px; + font-size: 16px; + position: absolute; + opacity: 0; + top: -10000px; + left: 0; + color: #777; + float: left; + transition: opacity 1s; +} + +#zindex input { + border: 1px solid #DDD; + font-size: 16px; + color: #777; +} + +#zindex .ui-input-slider-info { + width: 60px; +} + +#zindex[data-active='true'] { + top: 0; + opacity: 1; +} + +.title:hover { + text-decoration: underline; + color: #235a81; +} + +#group_preview { + display: none; + position: relative; + left: 523px; + bottom: 700px; +} + +#group_preview.group { + width: 294px; +} + +#table_preview { + display: none; + position: relative; + left: 523px; + bottom: 718px; +} diff --git a/themes/pmahomme/img/theme_generator/alpha.png b/themes/pmahomme/img/theme_generator/alpha.png new file mode 100644 index 0000000000000000000000000000000000000000..a28b929a4adde81339fca7295d680bfc3e6cd6ff GIT binary patch literal 105 zcmeAS@N?(olHy`uVBq!ia0vp^93afW1|*O0@9PFqoCO|{#S9F5M?jcysy3fAP*B>_ y#WAGfR< literal 0 HcmV?d00001 diff --git a/themes/pmahomme/img/theme_generator/alpha_mask.png b/themes/pmahomme/img/theme_generator/alpha_mask.png new file mode 100644 index 0000000000000000000000000000000000000000..8863bb615050eb500c0fcec570348453c71a52bc GIT binary patch literal 1152 zcmah}TWHfz7|s|@nVTpIZXz~BAF9}$=%=u4=~Y3hRTQS#s88TXJG@X4@%l z2;LqP@ok$o1O*WlLA)S3P!z<=oG60G2HvV{;KSw}oG05_eXtsmoD1Lg{g?A4`y1-l z78folBnYB7T*pW7co#p*<`m#};KZ z>oP!NSAA6KYL|R66{sRBlN=UM0TRii+M$_T(oaq4a(HfS(-b)cLG6BOI;oh@Kn9@! zNUzi5kX#HyvaFLS^Rg_nnsmDuH|@eV>tM<_FUz^h$(f77(G0nTi}1BGvGB@IwIZZ* zG@VE!oC%K;8gZKO`Fxg!+wH&zhndolm~?37@{9rxOvzAmq(F_d6vbxPiTo7Kbh-pp z&&q1%Oq+1S=%lFAjMHV6lmQCDzoDv{MVlxBe&_pFVKbW20UZG*>@*~Na4pNNP&yYh zfQXVZvNFg%<=ateHsEBoOBP6jpF5ip;U)EMLRA z-At$qcRl2(s43@bLqWc_%oFtbyul2Yhf=2sG?d}Wzqy{AT+0fojwAEHP__ZN)_^KG zRWhgK&c&5eZ-y)9&IOl{qYfG;Lt6*?$3bVduzRd&*0y+&H9pX=+YM~%lD+S(k76Rs z*F=*q#-4ASx63s@G}QKT!H*36J9TN(+*HY) z=jpe7r_a1I@1*N(#kRAbE{+eyY_qGDjY^40xMS?mmEnQQJG*aweH{3*`NzYZ2gcXF z{ zBEH9qdJm`9Uyz8Ci%z(DewGGLzxnoLw4}#A%U*P%`|hEYshbmA0l6-(F#r8=MqYP} g{vWk^_jMwl2;ExTX&!jxxBdy?P(6Qs&6Zui0I_G0uK)l5 literal 0 HcmV?d00001 diff --git a/themes/pmahomme/img/theme_generator/arrow.png b/themes/pmahomme/img/theme_generator/arrow.png new file mode 100644 index 0000000000000000000000000000000000000000..0010bca5d8ddd287ae8b098e11dc7f9808e9b7b9 GIT binary patch literal 1062 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 d@?YUUqeNvw_<^(EBY2 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
      P~1zI@gu1o~=2+<&G1#Ssgz!x}x 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 literal 0 HcmV?d00001