MonkeyConfig Mod

Enhanced configuration dialog builder with column layout, custom styling, and additional input types

Tính đến 05-03-2025. Xem phiên bản mới nhất.

Script này sẽ không được không được cài đặt trực tiếp. Nó là một thư viện cho các script khác để bao gồm các chỉ thị meta // @require https://update.greasyfork.org/scripts/528923/1548139/MonkeyConfig%20Mod.js

// ==UserScript==
// @name           MonkeyConfig Mod
// @namespace      http://odyniec.net/
// @description    Enhanced configuration dialog builder with column layout, custom styling, and additional input types
// @version        1.0
// ==/UserScript==

/*
 * MonkeyConfig Modern Reloaded Enhanced
 * Based on version 0.1.4 by Michal Wojciechowski (odyniec.net)
 * v0.1.4 - January 2020 - David Hosier (https://github.com/david-hosier/MonkeyConfig)
 * Enhanced by Bloggerpemula - March 2025
 * Additions: Column layout, font size/color customization, new input types (textarea, range, radio, file, button, group)
 */

function MonkeyConfig() {
    var cfg = this,
        data,
        params,
        values = {},
        storageKey,
        displayed,
        openWin, openLayer,
        container,
        overlay;

    function init(newData) {
        data = newData;

        if (data) {
            params = data.parameters || data.params;
            data.buttons = data.buttons === undefined ? ['save', 'defaults', 'cancel'] : data.buttons;
            data.fontSize = data.fontSize || '11pt'; // Default font size
            data.fontColor = data.fontColor || '#000000'; // Default font color

            if (data.title === undefined) {
                if (typeof GM_getMetadata == 'function') {
                    var scriptName = GM_getMetadata('name');
                    data.title = scriptName + ' Configuration';
                } else {
                    data.title = 'Configuration';
                }
            }
        }

        var safeTitle = data && data.title ? data.title.replace(/[^a-zA-Z0-9]/g, '_') : '';
        storageKey = '_MonkeyConfig_' + safeTitle + '_cfg';

        var storedValues = GM_getValue(storageKey) ? JSON.parse(GM_getValue(storageKey)) : {};

        for (var name in params) {
            if (params[name]['value'] !== undefined) {
                set(name, params[name].value);
            } else if (storedValues[name] !== undefined) {
                set(name, storedValues[name]);
            } else if (params[name]['default'] !== undefined) {
                set(name, params[name]['default']);
            } else {
                set(name, '');
            }
        }

        if (data.menuCommand) {
            var caption = data.menuCommand !== true ? data.menuCommand : data.title;
            GM_registerMenuCommand(caption, function () { cfg.open(); });
        }

        cfg.open = open;
        cfg.close = close;
        cfg.get = get;
        cfg.set = function (name, value) { set(name, value); update(); };
    }

    function get(name) { return values[name]; }
    function set(name, value) { values[name] = value; }
    function setDefaults() {
        for (var name in params) {
            if (typeof params[name]['default'] !== 'undefined') {
                set(name, params[name]['default']);
            }
        }
    }

    function render() {
        var html = '<div class="__MonkeyConfig_container">' +
            '<h1>' + data.title + '</h1>' +
            '<div class="__MonkeyConfig_columns">' +
            '<div class="__MonkeyConfig_left_column">';
        
        // Kolom kiri
        for (var name in params) {
            if (params[name].column === 'left') {
                html += MonkeyConfig.formatters['tr'](name, params[name]);
            }
        }
        html += '</div><div class="__MonkeyConfig_right_column">';

        // Kolom kanan
        for (var name in params) {
            if (params[name].column === 'right') {
                html += MonkeyConfig.formatters['tr'](name, params[name]);
            }
        }
        html += '</div></div><table class="__MonkeyConfig_default">';

        // Elemen tanpa kolom (default)
        for (var name in params) {
            if (!params[name].column) {
                html += MonkeyConfig.formatters['tr'](name, params[name]);
            }
        }

        html += '<tr><td colspan="2" class="__MonkeyConfig_buttons">' +
                '<table><tr>';

        for (var button in data.buttons) {
            html += '<td>';
            switch (data.buttons[button]) {
                case 'cancel':
                    html += '<button type="button" id="__MonkeyConfig_button_cancel">' +
                        '<img src="data:image/png;base64,' + MonkeyConfig.res.icons.cancel + '" />&nbsp;Cancel</button>';
                    break;
                case 'defaults':
                    html += '<button type="button" id="__MonkeyConfig_button_defaults">' +
                        '<img src="data:image/png;base64,' + MonkeyConfig.res.icons.arrow_undo + '" />&nbsp;Set&nbsp;Defaults</button>';
                    break;
                case 'save':
                    html += '<button type="button" id="__MonkeyConfig_button_save">' +
                        '<img src="data:image/png;base64,' + MonkeyConfig.res.icons.tick + '" />&nbsp;Save</button>';
                    break;
            }
            html += '</td>';
        }

        html += '</tr></table></td></tr></table></div>';
        return html;
    }

    function update() {
        if (!displayed) return;

        for (var name in params) {
            var value = values[name];
            var elem = container.querySelector('[name="' + name + '"]');
            switch (params[name].type) {
                case 'checkbox':
                    elem.checked = !!value;
                    break;
                case 'custom':
                    params[name].set(value, container.querySelector('#__MonkeyConfig_parent_' + name));
                    break;
                case 'number':
                case 'text':
                case 'color':
                case 'textarea':
                case 'range':
                    elem.value = value;
                    break;
                case 'radio':
                    elem = container.querySelector('[name="' + name + '"][value="' + value + '"]');
                    if (elem) elem.checked = true;
                    break;
                case 'file':
                    elem.value = ''; // File input tidak bisa di-set langsung
                    break;
                case 'select':
                    if (elem.tagName.toLowerCase() == 'input' && elem.type == 'checkbox') {
                        var checkboxes = container.querySelectorAll('input[name="' + name + '"]');
                        for (var i = 0; i < checkboxes.length; i++) {
                            checkboxes[i].checked = value.indexOf(checkboxes[i].value) > -1;
                        }
                    } else if (elem.multiple) {
                        var options = container.querySelectorAll('select[name="' + name + '"] option');
                        for (var i = 0; i < options.length; i++) {
                            options[i].selected = value.indexOf(options[i].value) > -1;
                        }
                    } else {
                        elem.value = value;
                    }
                    break;
            }
        }
    }

    function saveClick() {
        for (var name in params) {
            var elem = container.querySelector('[name="' + name + '"]');
            switch (params[name].type) {
                case 'checkbox':
                    values[name] = elem.checked;
                    break;
                case 'custom':
                    values[name] = params[name].get(container.querySelector('#__MonkeyConfig_parent_' + name));
                    break;
                case 'number':
                case 'text':
                case 'color':
                case 'textarea':
                case 'range':
                    values[name] = elem.value;
                    break;
                case 'radio':
                    values[name] = container.querySelector('[name="' + name + '"]:checked')?.value || '';
                    break;
                case 'file':
                    values[name] = elem.dataset.value || values[name]; // Simpan nilai dari file yang diunggah
                    break;
                case 'select':
                    if (elem.tagName.toLowerCase() == 'input' && elem.type == 'checkbox') {
                        values[name] = [];
                        var inputs = container.querySelectorAll('input[name="' + name + '"]');
                        for (var i = 0; i < inputs.length; i++) {
                            if (inputs[i].checked) values[name].push(inputs[i].value);
                        }
                    } else if (elem.multiple) {
                        values[name] = [];
                        var options = container.querySelectorAll('select[name="' + name + '"] option');
                        for (var i = 0; i < options.length; i++) {
                            if (options[i].selected) values[name].push(options[i].value);
                        }
                    } else {
                        values[name] = elem.value;
                    }
                    break;
            }
        }

        GM_setValue(storageKey, JSON.stringify(values));
        close();
        if (data.onSave) data.onSave(values);
        location.reload();
    }

    function cancelClick() { close(); }
    function defaultsClick() { setDefaults(); update(); }

    function open(mode, options) {
        function openDone() {
            var button;
            if (button = container.querySelector('#__MonkeyConfig_button_save')) button.addEventListener('click', saveClick, true);
            if (button = container.querySelector('#__MonkeyConfig_button_cancel')) button.addEventListener('click', cancelClick, true);
            if (button = container.querySelector('#__MonkeyConfig_button_defaults')) button.addEventListener('click', defaultsClick, true);
            displayed = true;
            update();
        }

        GM_addStyle(MonkeyConfig.res.stylesheets.main.replace(/__FONT_SIZE__/g, data.fontSize).replace(/__FONT_COLOR__/g, data.fontColor));
        MonkeyConfig.styleAdded = true;

        switch (mode) {
            case 'window':
                var win = window.open('', data.title, 'location=no,status=no');
                win.document.head.innerHTML = '<title>' + data.title + '</title><style>' + MonkeyConfig.res.stylesheets.main + '</style>';
                win.document.body.className = '__MonkeyConfig_window';
                win.document.body.innerHTML = render();
                container = win.document.querySelector('.__MonkeyConfig_container');
                win.innerWidth = container.clientWidth;
                win.resizeBy(0, -win.innerHeight + container.clientHeight);
                win.moveBy(Math.round((window.outerWidth - win.outerWidth) / 2), Math.round((window.outerHeight - win.outerHeight) / 2));
                openWin = win;
                openDone();
                break;
            case 'layer':
            case 'iframe':
            default:
                var body = document.querySelector('body');
                openLayer = document.createElement('div');
                openLayer.className = '__MonkeyConfig_layer';
                overlay = document.createElement('div');
                overlay.className = '__MonkeyConfig_overlay';
                overlay.style.cssText = 'left:0;top:0;width:' + window.innerWidth + 'px;height:' + window.innerHeight + 'px;z-index:9999;';
                openLayer.innerHTML = render();
                openLayer.style.cssText = 'left:' + Math.round((window.innerWidth - openLayer.clientWidth) / 2) + 'px;top:' + Math.round((window.innerHeight - openLayer.clientHeight) / 2) + 'px;z-index:9999;';
                body.appendChild(overlay);
                body.appendChild(openLayer);
                container = document.querySelector('.__MonkeyConfig_container');
                openDone();
                break;
        }
    }

    function close() {
        if (openWin) { openWin.close(); openWin = undefined; }
        if (openLayer) { openLayer.parentNode.removeChild(openLayer); openLayer = undefined; }
        if (overlay) { overlay.parentNode.removeChild(overlay); overlay = undefined; }
        displayed = false;
    }

    init(arguments[0]);
}

MonkeyConfig.esc = function (string) { return string.replace(/"/g, '&quot;'); };

MonkeyConfig.HTML = {
    '_field': function (name, options, data) {
        return options.type && MonkeyConfig.HTML[options.type] ? options.html ? options.html.replace(/\[FIELD\]/, MonkeyConfig.HTML[options.type](name, options, data)) : MonkeyConfig.HTML[options.type](name, options, data) : '';
    },
    '_label': function (name, options, data) {
        var label = options['label'] || name.substring(0, 1).toUpperCase() + name.substring(1).replace(/_/g, '&nbsp;');
        return '<label for="__MonkeyConfig_field_' + name + '">' + label + '</label>';
    },
    'checkbox': function (name, options) { return '<input id="__MonkeyConfig_field_' + name + '" type="checkbox" name="' + name + '" />'; },
    'custom': function (name, options) { return options.html || ''; },
    'number': function (name, options) { return '<input id="__MonkeyConfig_field_' + name + '" type="number" class="__MonkeyConfig_field_number" name="' + name + '" min="' + (options.min || '') + '" max="' + (options.max || '') + '" step="' + (options.step || '1') + '" />'; },
    'text': function (name, options) { return '<input id="__MonkeyConfig_field_' + name + '" type="text" class="__MonkeyConfig_field_text" name="' + name + '" />'; },
    'color': function (name, options) { return '<input id="__MonkeyConfig_field_' + name + '" type="color" class="__MonkeyConfig_field_text" name="' + name + '" />'; },
    'textarea': function (name, options) { return '<textarea id="__MonkeyConfig_field_' + name + '" class="__MonkeyConfig_field_text" name="' + name + '" rows="' + (options.rows || 4) + '" cols="' + (options.cols || 20) + '"></textarea>'; },
    'range': function (name, options) { return '<input id="__MonkeyConfig_field_' + name + '" type="range" name="' + name + '" min="' + (options.min || 0) + '" max="' + (options.max || 100) + '" step="' + (options.step || 1) + '" />'; },
    'radio': function (name, options) {
        var html = '';
        for (var value in options.choices) {
            html += '<label><input type="radio" name="' + name + '" value="' + MonkeyConfig.esc(value) + '" /> ' + options.choices[value] + '</label><br/>';
        }
        return html;
    },
    'file': function (name, options) { return '<input id="__MonkeyConfig_field_' + name + '" type="file" name="' + name + '" accept="' + (options.accept || '*/*') + '" />'; },
    'button': function (name, options) { return '<button type="button" id="__MonkeyConfig_field_' + name + '" name="' + name + '">' + (options.label || 'Click') + '</button>'; },
    'group': function (name, options) {
        var html = '<fieldset><legend>' + (options.label || name) + '</legend>';
        for (var subName in options.params) {
            html += MonkeyConfig.formatters['tr'](subName, options.params[subName]);
        }
        html += '</fieldset>';
        return html;
    },
    'select': function (name, options) {
        var choices = options.choices.constructor == Array ? options.choices.reduce((obj, val) => { obj[val] = val; return obj; }, {}) : options.choices;
        var html = '<select id="__MonkeyConfig_field_' + name + '" class="__MonkeyConfig_field_select" name="' + name + '"' + (options.multiple ? ' multiple="multiple"' : '') + '>';
        for (var value in choices) {
            html += '<option value="' + MonkeyConfig.esc(value) + '">' + choices[value] + '</option>';
        }
        html += '</select>';
        return html;
    }
};

MonkeyConfig.formatters = {
    'tr': function (name, options, data) {
        var html = '<tr>';
        if (options.type === 'checkbox') {
            html += '<td id="__MonkeyConfig_parent_' + name + '" colspan="2">' + MonkeyConfig.HTML['_field'](name, options, data) + ' ' + MonkeyConfig.HTML['_label'](name, options, data) + '</td>';
        } else if (options.type === 'group') {
            html += '<td colspan="2">' + MonkeyConfig.HTML['_field'](name, options, data) + '</td>';
        } else {
            html += '<td>' + MonkeyConfig.HTML['_label'](name, options, data) + '</td><td id="__MonkeyConfig_parent_' + name + '">' + MonkeyConfig.HTML['_field'](name, options, data) + '</td>';
        }
        html += '</tr>';
        return html;
    }
};

MonkeyConfig.styleAdded = false;

MonkeyConfig.res = {
    icons: {
        'arrow_undo': 'iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAAK/INwWK6QAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAIJSURBVDjLpVM9aJNRFD35GsRSoUKKzQ/B0NJJF3EQlKrVgijSCBmC4NBFKihIcXBwEZdSHVoUwUInFUEkQ1DQ4CKiFsQsTrb5xNpgaZHw2Uog5t5zn0NJNFaw0guX97hwzuPcc17IOYfNlIdNVrhxufR6xJkZjAbSQGXjNAorqixSWFDV3KPhJ+UGLtSQMPryrDscPwLnAHOEOQc6gkbUpIagGmApWIb/pZRX4fjj889nWiSQtgYyBZ1BTUEj6AjPa0P71nb0Jfqwa+futIheHrzRn2yRQCUK/lOQhApBJVQJChHfnkCqOwWEQ+iORJHckUyX5ksvAEyGNuJC+s6xCRXNHNxzKMmQ4luwgjfvZp69uvr2+IZcyJ8rjIporrxURggetnV0QET3rrPxzMNM2+n7p678jUTrCiWhphAjVHR9DlR0WkSzf4IHxg5MSF0zXZEuVKWKSlCBCostS8zeG7oV64wPqxInbw86lbVXKEQ8mkAqmUJ4SxieeVhcnANFC02C7N2h69HO2IXeWC8MDj2JnqaFNAMd8f3HKjx6+LxQRmnOz1OZaxKIaF1VISYwB9ARZoQaYY6o1WpYCVYxt+zDn/XzVBv/MOWXW5J44ubRyVgkelFpmF/4BJVfOVDlVyqLVBZI5manPjajDOdcswfG9k/3X9v3/vfZv7rFBanriIo++J/f+BMT+YWS6hXl7QAAAABJRU5ErkJggg==',
        'cancel': 'iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAAK/INwWK6QAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAHdSURBVDjLpZNraxpBFIb3a0ggISmmNISWXmOboKihxpgUNGWNSpvaS6RpKL3Ry//Mh1wgf6PElaCyzq67O09nVjdVlJbSDy8Lw77PmfecMwZg/I/GDw3DCo8HCkZl/RlgGA0e3Yfv7+DbAfLrW+SXOvLTG+SHV/gPbuMZRnsyIDL/OASziMxkkKkUQTJJsLaGn8/iHz6nd+8mQv87Ahg2H9Th/BxZqxEkEgSrq/iVCvLsDK9awtvfxb2zjD2ARID+lVVlabTgWYTv1rFL5fBUtHbbeTJCb3EQ3ovCnRC6xAgzJtOE+ztheYIEkqbFaS3vY2zuIj77AmtYYDusPy8/zuvunJkDKXM7tYWTiyGWFjAqeQnAD6+7ueNx/FLpRGAru7mcoj5ebqzszil7DggeF/DX1BN82rzPqrzbRayIsLhJqMPT2N83Sdy2GApwFqRN7jFPL0tF+10cDd3MTZ2AjNUkGCoyO6y9cRxfQowFUbpufr1ct4ZoHg+Dg067zduTmEbq4yi/UkYidDe+kaTcP4ObJIajksPd/eyx3c+N2rvPbMDPbUFPZSLKzcGjKPrbJaDsu+dQO3msfZzeGY2TCvKGYQhdSYeeJjUt21dIcjXQ7U7Kv599f4j/oF55W4g/2e3b8AAAAASUVORK5CYII=',
        'tick': 'iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAAK/INwWK6QAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAGrSURBVDjLvZPZLkNhFIV75zjvYm7VGFNCqoZUJ+roKUUpjRuqp61Wq0NKDMelGGqOxBSUIBKXWtWGZxAvobr8lWjChRgSF//dv9be+9trCwAI/vIE/26gXmviW5bqnb8yUK028qZjPfoPWEj4Ku5HBspgAz941IXZeze8N1bottSo8BTZviVWrEh546EO03EXpuJOdG63otJbjBKHkEp/Ml6yNYYzpuezWL4s5VMtT8acCMQcb5XL3eJE8VgBlR7BeMGW9Z4yT9y1CeyucuhdTGDxfftaBO7G4L+zg91UocxVmCiy51NpiP3n2treUPujL8xhOjYOzZYsQWANyRYlU4Y9Br6oHd5bDh0bCpSOixJiWx71YY09J5pM/WEbzFcDmHvwwBu2wnikg+lEj4mwBe5bC5h1OUqcwpdC60dxegRmR06TyjCF9G9z+qM2uCJmuMJmaNZaUrCSIi6X+jJIBBYtW5Cge7cd7sgoHDfDaAvKQGAlRZYc6ltJlMxX03UzlaRlBdQrzSCwksLRbOpHUSb7pcsnxCCwngvM2Rm/ugUCi84fycr4l2t8Bb6iqTxSCgNIAAAAAElFTkSuQmCC'
    },
    stylesheets: {
        'main': '\
body.__MonkeyConfig_window { appearance: window !important; -moz-appearance: window !important; background: auto; font-family: sans-serif !important; height: 100% !important; margin: 0 !important; padding: 0 !important; width: 100% !important; }\
div.__MonkeyConfig_container { display: table !important; font-family: sans-serif !important; padding: 0.3em !important; font-size: __FONT_SIZE__ !important; color: __FONT_COLOR__ !important; }\
body.__MonkeyConfig_window div.__MonkeyConfig_container { appearance: window !important; -moz-appearance: window !important; height: 100%; width: 100%; }\
div.__MonkeyConfig_container h1 { border-bottom: solid 1px #999 !important; font-family: sans-serif !important; font-size: 120% !important; margin: 0 !important; padding: 0 0 0.3em 0 !important; }\
div.__MonkeyConfig_columns { display: flex !important; justify-content: space-between !important; margin-bottom: 1em !important; }\
div.__MonkeyConfig_left_column, div.__MonkeyConfig_right_column { width: 48% !important; }\
div.__MonkeyConfig_container table { border-spacing: 0 !important; margin: 0 !important; width: 100% !important; }\
div.__MonkeyConfig_container table td { border: none !important; line-height: 100% !important; padding: 0.3em !important; text-align: left !important; vertical-align: top !important; white-space: nowrap !important; }\
div.__MonkeyConfig_container table td.__MonkeyConfig_buttons { padding: 0.2em 0 !important; }\
.__MonkeyConfig_field_number { width: 5em !important; }\
div.__MonkeyConfig_container td.__MonkeyConfig_buttons table { border-top: solid 1px #999 !important; width: 100% !important; }\
div.__MonkeyConfig_container td.__MonkeyConfig_buttons td { padding: 0.6em 0.3em 0.1em 0.3em !important; text-align: center !important; vertical-align: top; }\
div.__MonkeyConfig_container td.__MonkeyConfig_buttons button { appearance: button !important; -moz-appearance: button !important; background-position: 8px 50% !important; background-repeat: no-repeat !important; padding: 3px 8px 3px 24px !important; white-space: nowrap !important; }\
div.__MonkeyConfig_container td.__MonkeyConfig_buttons button img { vertical-align: middle !important; }\
div.__MonkeyConfig_layer { display: table !important; position: fixed !important; }\
div.__MonkeyConfig_layer div.__MonkeyConfig_container, body.__MonkeyConfig_body > div.__MonkeyConfig_container { background: #eee linear-gradient(180deg, #f8f8f8 0, #ddd 100%) !important; border-radius: 0.5em !important; box-shadow: 2px 2px 16px #000 !important; color: __FONT_COLOR__ !important; font-family: sans-serif !important; font-size: __FONT_SIZE__ !important; padding: 1em 1em 0.4em 1em !important; }\
div.__MonkeyConfig_layer div.__MonkeyConfig_container td, div.__MonkeyConfig_layer div.__MonkeyConfig_container label, div.__MonkeyConfig_layer div.__MonkeyConfig_container input, div.__MonkeyConfig_layer div.__MonkeyConfig_container select, div.__MonkeyConfig_layer div.__MonkeyConfig_container textarea, div.__MonkeyConfig_layer div.__MonkeyConfig_container button { color: __FONT_COLOR__ !important; font-family: sans-serif !important; font-size: __FONT_SIZE__ !important; line-height: 100% !important; margin: 0 !important; vertical-align: baseline !important; }\
div.__MonkeyConfig_container label { line-height: 120% !important; vertical-align: baseline !important; }\
div.__MonkeyConfig_container textarea { vertical-align: text-top !important; width: 100%; }\
div.__MonkeyConfig_layer div.__MonkeyConfig_container input[type="text"] { appearance: textfield !important; -moz-appearance: textfield !important; background: #fff !important; }\
div.__MonkeyConfig_layer div.__MonkeyConfig_container h1 { font-weight: bold !important; text-align: left !important; }\
div.__MonkeyConfig_layer div.__MonkeyConfig_container td.__MonkeyConfig_buttons button, body > div.__MonkeyConfig_container td.__MonkeyConfig_buttons button { appearance: button !important; -moz-appearance: button !important; background: #ccc linear-gradient(180deg, #ddd 0, #ccc 45%, #bbb 50%, #aaa 100%) !important; border-style: solid !important; border-width: 1px !important; border-radius: 0.5em !important; box-shadow: 0 0 1px #000 !important; color: __FONT_COLOR__ !important; font-size: __FONT_SIZE__ !important; }\
div.__MonkeyConfig_layer div.__MonkeyConfig_container td.__MonkeyConfig_buttons button:hover, body > div.__MonkeyConfig_container td.__MonkeyConfig_buttons button:hover { background: #d2d2d2 linear-gradient(180deg, #e2e2e2 0, #d2d2d2 45%, #c2c2c2 50%, #b2b2b2 100%) !important; }\
div.__MonkeyConfig_overlay { background-color: #000 !important; opacity: 0.6 !important; position: fixed !important; }\
iframe#__MonkeyConfig_frame { border: none !important; box-shadow: 2px 2px 16px #000 !important; }\
body.__MonkeyConfig_body { margin: 0 !important; padding: 0 !important; }\
'
    }
};