MonkeyConfig Mod

Enhanced Configuration Dialog Builder with column layout (top, bottom, left, right), custom styling, and additional input types

当前为 2025-03-06 提交的版本,查看 最新版本

此脚本不应直接安装。它是供其他脚本使用的外部库,要使用该库请加入元指令 // @require https://update.gf.qytechs.cn/scripts/528923/1548517/MonkeyConfig%20Mod.js

  1. // ==UserScript==
  2. // @name MonkeyConfig Mod
  3. // @namespace http://odyniec.net/
  4. // @description Enhanced Configuration Dialog Builder with column layout (top, bottom, left, right), custom styling, and additional input types
  5. // @version 1.5
  6. // ==/UserScript==
  7.  
  8. /*
  9. * MonkeyConfig Modern Reloaded Enhanced
  10. * Based on version 0.1.4 by Michal Wojciechowski (odyniec.net)
  11. * v0.1.4 - January 2020 - David Hosier (https://github.com/david-hosier/MonkeyConfig)
  12. * Enhanced by Bloggerpemula - March 2025
  13. * Additions: Column layout, font size/color customization, new input types (textarea, range, radio, file, button, group)
  14. * Modified: Checkbox, number, and text inputs aligned inline with labels regardless of label length - March 2025
  15. */
  16. /*jshint multistr:true*/
  17. function MonkeyConfig(data) {
  18. var cfg = this,
  19. params,
  20. values = {},
  21. storageKey,
  22. displayed,
  23. openLayer,
  24. container,
  25. overlay;
  26.  
  27. function init() {
  28. params = data.parameters || data.params;
  29. data.buttons = data.buttons === undefined ? ['save', 'defaults', 'cancel'] : data.buttons;
  30. data.fontSize = data.fontSize || '11pt';
  31. data.fontColor = data.fontColor || '#000000';
  32.  
  33. if (!data.title) {
  34. data.title = typeof GM_getMetadata === 'function' ? GM_getMetadata('name') + ' Configuration' : 'Configuration';
  35. }
  36.  
  37. var safeTitle = data.title.replace(/[^a-zA-Z0-9]/g, '_');
  38. storageKey = '_MonkeyConfig_' + safeTitle + '_cfg';
  39.  
  40. var storedValues = GM_getValue(storageKey) ? JSON.parse(GM_getValue(storageKey)) : {};
  41.  
  42. for (var paramName in params) {
  43. var param = params[paramName];
  44. if (param.value !== undefined) {
  45. set(paramName, param.value);
  46. } else if (storedValues[paramName] !== undefined) {
  47. set(paramName, storedValues[paramName]);
  48. } else if (param.default !== undefined) {
  49. set(paramName, param.default);
  50. } else {
  51. set(paramName, '');
  52. }
  53. }
  54.  
  55. if (data.menuCommand) {
  56. var caption = data.menuCommand !== true ? data.menuCommand : data.title;
  57. GM_registerMenuCommand(caption, function () { cfg.open(); });
  58. }
  59.  
  60. cfg.open = open;
  61. cfg.close = close;
  62. cfg.get = get;
  63. cfg.set = function (name, value) { set(name, value); update(); };
  64. }
  65.  
  66. function get(name) { return values[name]; }
  67. function set(name, value) { values[name] = value; }
  68. function setDefaults() {
  69. for (var paramName in params) {
  70. if (params[paramName].default !== undefined) {
  71. set(paramName, params[paramName].default);
  72. }
  73. }
  74. update();
  75. }
  76.  
  77. function render() {
  78. var html = '<div class="__MonkeyConfig_container">' +
  79. '<h1>' + data.title + '</h1>' +
  80. '<div class="__MonkeyConfig_content">';
  81.  
  82. html += '<div class="__MonkeyConfig_top">';
  83. for (var paramName in params) {
  84. if (params[paramName].column === 'top') {
  85. html += MonkeyConfig.formatters.tr(paramName, params[paramName]);
  86. }
  87. }
  88. html += '</div>';
  89.  
  90. html += '<div class="__MonkeyConfig_columns">' +
  91. '<div class="__MonkeyConfig_left_column">';
  92. for (var paramName in params) {
  93. if (params[paramName].column === 'left') {
  94. html += MonkeyConfig.formatters.tr(paramName, params[paramName]);
  95. }
  96. }
  97. html += '</div><div class="__MonkeyConfig_right_column">';
  98. for (var paramName in params) {
  99. if (params[paramName].column === 'right') {
  100. html += MonkeyConfig.formatters.tr(paramName, params[paramName]);
  101. }
  102. }
  103. html += '</div></div>';
  104.  
  105. html += '<table class="__MonkeyConfig_default">';
  106. for (var paramName in params) {
  107. if (!params[paramName].column) {
  108. html += MonkeyConfig.formatters.tr(paramName, params[paramName]);
  109. }
  110. }
  111. html += '</table>';
  112.  
  113. html += '<div class="__MonkeyConfig_bottom">';
  114. for (var paramName in params) {
  115. if (params[paramName].column === 'bottom') {
  116. html += MonkeyConfig.formatters.tr(paramName, params[paramName]);
  117. }
  118. }
  119. html += '</div></div><div class="__MonkeyConfig_buttons_container"><table><tr>';
  120.  
  121. for (var i = 0; i < data.buttons.length; i++) {
  122. html += '<td>';
  123. switch (data.buttons[i]) {
  124. case 'cancel':
  125. html += '<button type="button" id="__MonkeyConfig_button_cancel"><img src="data:image/png;base64,' + MonkeyConfig.res.icons.cancel + '" alt="Cancel"/> Cancel</button>';
  126. break;
  127. case 'defaults':
  128. html += '<button type="button" id="__MonkeyConfig_button_defaults"><img src="data:image/png;base64,' + MonkeyConfig.res.icons.arrow_undo + '" alt="Defaults"/> Set Defaults</button>';
  129. break;
  130. case 'save':
  131. html += '<button type="button" id="__MonkeyConfig_button_save"><img src="data:image/png;base64,' + MonkeyConfig.res.icons.tick + '" alt="Save"/> Save</button>';
  132. break;
  133. }
  134. html += '</td>';
  135. }
  136.  
  137. html += '</tr></table></div></div>';
  138. return html;
  139. }
  140.  
  141. function update() {
  142. if (!displayed) return;
  143.  
  144. for (var paramName in params) {
  145. var value = values[paramName];
  146. var elem = container.querySelector('[name="' + paramName + '"]');
  147. if (!elem) continue;
  148. switch (params[paramName].type) {
  149. case 'checkbox':
  150. elem.checked = !!value;
  151. break;
  152. case 'custom':
  153. if (params[paramName].set) {
  154. params[paramName].set(value, container.querySelector('#__MonkeyConfig_parent_' + paramName));
  155. }
  156. break;
  157. case 'number':
  158. case 'text':
  159. case 'color':
  160. case 'textarea':
  161. case 'range':
  162. elem.value = value;
  163. break;
  164. case 'radio':
  165. var radio = container.querySelector('[name="' + paramName + '"][value="' + value + '"]');
  166. if (radio) radio.checked = true;
  167. break;
  168. case 'file':
  169. elem.value = '';
  170. break;
  171. case 'select':
  172. if (elem.tagName.toLowerCase() === 'input' && elem.type === 'checkbox') {
  173. var checkboxes = container.querySelectorAll('input[name="' + paramName + '"]');
  174. for (var i = 0; i < checkboxes.length; i++) {
  175. checkboxes[i].checked = value.indexOf(checkboxes[i].value) > -1;
  176. }
  177. } else if (elem.multiple) {
  178. var options = container.querySelectorAll('select[name="' + paramName + '"] option');
  179. for (var i = 0; i < options.length; i++) {
  180. options[i].selected = value.indexOf(options[i].value) > -1;
  181. }
  182. } else {
  183. elem.value = value;
  184. }
  185. break;
  186. }
  187. }
  188. }
  189.  
  190. function saveClick() {
  191. for (var paramName in params) {
  192. var elem = container.querySelector('[name="' + paramName + '"]');
  193. if (!elem) continue;
  194. switch (params[paramName].type) {
  195. case 'checkbox':
  196. values[paramName] = elem.checked;
  197. break;
  198. case 'custom':
  199. if (params[paramName].get) {
  200. values[paramName] = params[paramName].get(container.querySelector('#__MonkeyConfig_parent_' + paramName));
  201. }
  202. break;
  203. case 'number':
  204. case 'text':
  205. case 'color':
  206. case 'textarea':
  207. case 'range':
  208. values[paramName] = elem.value;
  209. break;
  210. case 'radio':
  211. var checkedRadio = container.querySelector('[name="' + paramName + '"]:checked');
  212. values[paramName] = checkedRadio ? checkedRadio.value : '';
  213. break;
  214. case 'file':
  215. values[paramName] = elem.dataset.value || values[paramName];
  216. break;
  217. case 'select':
  218. if (elem.tagName.toLowerCase() === 'input' && elem.type === 'checkbox') {
  219. values[paramName] = [];
  220. var inputs = container.querySelectorAll('input[name="' + paramName + '"]');
  221. for (var i = 0; i < inputs.length; i++) {
  222. if (inputs[i].checked) values[paramName].push(inputs[i].value);
  223. }
  224. } else if (elem.multiple) {
  225. values[paramName] = [];
  226. var options = container.querySelectorAll('select[name="' + paramName + '"] option');
  227. for (var i = 0; i < options.length; i++) {
  228. if (options[i].selected) values[paramName].push(options[i].value);
  229. }
  230. } else {
  231. values[paramName] = elem.value;
  232. }
  233. break;
  234. }
  235. }
  236.  
  237. GM_setValue(storageKey, JSON.stringify(values));
  238. close();
  239. if (data.onSave) data.onSave(values);
  240. location.reload();
  241. }
  242.  
  243. function cancelClick() { close(); }
  244.  
  245. function open() {
  246. function openDone() {
  247. var saveBtn = container.querySelector('#__MonkeyConfig_button_save');
  248. var defaultsBtn = container.querySelector('#__MonkeyConfig_button_defaults');
  249. var cancelBtn = container.querySelector('#__MonkeyConfig_button_cancel');
  250.  
  251. if (saveBtn) saveBtn.addEventListener('click', saveClick, false);
  252. if (defaultsBtn) defaultsBtn.addEventListener('click', function () { setDefaults(); }, false);
  253. if (cancelBtn) cancelBtn.addEventListener('click', cancelClick, false);
  254.  
  255. displayed = true;
  256. update();
  257. }
  258.  
  259. GM_addStyle(MonkeyConfig.res.stylesheets.main.replace(/__FONT_SIZE__/g, data.fontSize).replace(/__FONT_COLOR__/g, data.fontColor));
  260. MonkeyConfig.styleAdded = true;
  261.  
  262. var body = document.querySelector('body');
  263. openLayer = document.createElement('div');
  264. openLayer.className = '__MonkeyConfig_layer';
  265. overlay = document.createElement('div');
  266. overlay.className = '__MonkeyConfig_overlay';
  267. overlay.style.cssText = 'left:0;top:0;width:100%;height:100%;z-index:9999;';
  268. openLayer.innerHTML = render();
  269. container = openLayer.querySelector('.__MonkeyConfig_container');
  270. openLayer.style.cssText = 'position:fixed;top:50%;left:50%;transform:translate(-50%,-50%);max-height:80vh;overflow-y:auto;z-index:10000;';
  271. body.appendChild(overlay);
  272. body.appendChild(openLayer);
  273. openDone();
  274.  
  275. window.addEventListener('resize', function () {
  276. overlay.style.width = window.innerWidth + 'px';
  277. overlay.style.height = window.innerHeight + 'px';
  278. });
  279. }
  280.  
  281. function close() {
  282. if (openLayer) { openLayer.parentNode.removeChild(openLayer); openLayer = undefined; }
  283. if (overlay) { overlay.parentNode.removeChild(overlay); overlay = undefined; }
  284. displayed = false;
  285. }
  286.  
  287. init();
  288. }
  289.  
  290. MonkeyConfig.esc = function (string) { return string.replace(/"/g, '&quot;'); };
  291.  
  292. MonkeyConfig.HTML = {
  293. '_field': function (name, options) {
  294. return options.type && MonkeyConfig.HTML[options.type] ? options.html ? options.html.replace(/\[FIELD\]/, MonkeyConfig.HTML[options.type](name, options)) : MonkeyConfig.HTML[options.type](name, options) : '';
  295. },
  296. '_label': function (name, options) {
  297. var label = options.label || name.substring(0, 1).toUpperCase() + name.substring(1).replace(/_/g, ' ');
  298. return '<label for="__MonkeyConfig_field_' + name + '">' + label + '</label>';
  299. },
  300. 'checkbox': function (name) { return '<input id="__MonkeyConfig_field_' + name + '" type="checkbox" name="' + name + '" />'; },
  301. 'custom': function (name, options) { return options.html || ''; },
  302. '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') + '" />'; },
  303. 'text': function (name) { return '<input id="__MonkeyConfig_field_' + name + '" type="text" class="__MonkeyConfig_field_text" name="' + name + '" />'; },
  304. 'color': function (name) { return '<input id="__MonkeyConfig_field_' + name + '" type="color" class="__MonkeyConfig_field_text" name="' + name + '" />'; },
  305. '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>'; },
  306. '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) + '" />'; },
  307. 'radio': function (name, options) {
  308. var html = '';
  309. for (var value in options.choices) {
  310. html += '<label><input type="radio" name="' + name + '" value="' + MonkeyConfig.esc(value) + '" /> ' + options.choices[value] + '</label><br/>';
  311. }
  312. return html;
  313. },
  314. 'file': function (name, options) { return '<input id="__MonkeyConfig_field_' + name + '" type="file" name="' + name + '" accept="' + (options.accept || '*/*') + '" />'; },
  315. 'button': function (name, options) { return '<button type="button" id="__MonkeyConfig_field_' + name + '" name="' + name + '">' + (options.label || 'Click') + '</button>'; },
  316. 'group': function (name, options) {
  317. var html = '<fieldset><legend>' + (options.label || name) + '</legend>';
  318. for (var subName in options.params) {
  319. html += MonkeyConfig.formatters.tr(subName, options.params[subName]);
  320. }
  321. html += '</fieldset>';
  322. return html;
  323. },
  324. 'select': function (name, options) {
  325. var choices = options.choices.constructor === Array ? options.choices.reduce(function (obj, val) { obj[val] = val; return obj; }, {}) : options.choices;
  326. var html = '<select id="__MonkeyConfig_field_' + name + '" class="__MonkeyConfig_field_select" name="' + name + '"' + (options.multiple ? ' multiple="multiple"' : '') + '>';
  327. for (var value in choices) {
  328. html += '<option value="' + MonkeyConfig.esc(value) + '">' + choices[value] + '</option>';
  329. }
  330. html += '</select>';
  331. return html;
  332. }
  333. };
  334.  
  335. MonkeyConfig.formatters = {
  336. 'tr': function (name, options) {
  337. var html = '<tr>';
  338. // Modifikasi: Checkbox, number, dan text akan sejajar dengan label dalam satu td
  339. if (options.type === 'checkbox' || options.type === 'number' || options.type === 'text') {
  340. html += '<td id="__MonkeyConfig_parent_' + name + '" colspan="2" class="__MonkeyConfig_inline">' +
  341. MonkeyConfig.HTML._label(name, options) + ' ' +
  342. MonkeyConfig.HTML._field(name, options) +
  343. '</td>';
  344. } else if (options.type === 'group') {
  345. html += '<td colspan="2">' + MonkeyConfig.HTML._field(name, options) + '</td>';
  346. } else {
  347. html += '<td>' + MonkeyConfig.HTML._label(name, options) + '</td><td id="__MonkeyConfig_parent_' + name + '">' + MonkeyConfig.HTML._field(name, options) + '</td>';
  348. }
  349. html += '</tr>';
  350. return html;
  351. }
  352. };
  353.  
  354. MonkeyConfig.styleAdded = false;
  355.  
  356. MonkeyConfig.res = {
  357. icons: {
  358. '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==',
  359. 'cancel': 'iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAAK/INwWK6QAAABl0RVh0\
  360. U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAHdSURBVDjLpZNraxpBFIb3a0ggISmmNISW\
  361. XmOboKihxpgUNGWNSpvaS6RpKL3Ry//Mh1wgf6PElaCyzq67O09nVjdVlJbSDy8Lw77PmfecMwZg\
  362. /I/GDw3DCo8HCkZl/RlgGA0e3Yfv7+DbAfLrW+SXOvLTG+SHV/gPbuMZRnsyIDL/OASziMxkkKkU\
  363. QTJJsLaGn8/iHz6nd+8mQv87Ahg2H9Th/BxZqxEkEgSrq/iVCvLsDK9awtvfxb2zjD2ARID+lVVl\
  364. babTgWYTv1rFL5fBUtHbbeTJCb3EQ3ovCnRC6xAgzJtOE+ztheYIEkqbFaS3vY2zuIj77AmtYYDu\
  365. sPy8/zuvunJkDKXM7tYWTiyGWFjAqeQnAD6+7ueNx/FLpRGAru7mcoj5ebqzszil7DggeF/DX1nB\
  366. N82rzPqrzbRayIsLhJqMPT2N83Sdy2GApwFqRN7jFPL0tF+10cDd3MTZ2AjNUkGCoyO6y9cRxfQo\
  367. wFUbpufr1ct4ZoHg+Dg067zduTmEbq4yi/UkYidDe+kaTcP4ObJIajksPd/eyx3c+N2rvPbMDPbU\
  368. FPZSLKzcGjKPrbJaDsu+dQO3msfZzeGY2TCvKGYQhdSYeeJjUt21dIcjXQ7U7Kv599f4j/oF55W4\
  369. g/2e3b8AAAAASUVORK5CYII=',
  370. 'tick': 'iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAAK/INwWK6QAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAGrSURBVDjLvZPZLkNhFIV75zjvYm7VGFNCqoZUJ+roKUUpjRuqp61Wq0NKDMelGGqOxBSUIBKXWtWGZxAvobr8lWjChRgSF//dv9be+9trCwAI/vIE/26gXmviW5bqnb8yUK028qZjPfoPWEj4Ku5HBspgAz941IXZeze8N1bottSo8BTZviVWrEh546EO03EXpuJOdG63otJbjBKHkEp/Ml6yNYYzpuezWL4s5VMtT8acCMQcb5XL3eJE8VgBlR7BeMGW9Z4yT9y1CeyucuhdTGDxfftaBO7G4L+zg91UocxVmCiy51NpiP3n2treUPujL8xhOjYOzZYsQWANyRYlU4Y9Br6oHd5bDh0bCpSOixJiWx71YY09J5pM/WEbzFcDmHvwwBu2wnikg+lEj4mwBe5bC5h1OUqcwpdC60dxegRmR06TyjCF9G9z+qM2uCJmuMJmaNZaUrCSIi6X+jJIBBYtW5Cge7cd7sgoHDfDaAvKQGAlRZYc6ltJlMxX03UzlaRlBdQrzSCwksLRbOpHUSb7pcsnxCCwngvM2Rm/ugUCi84fycr4l2t8Bb6iqTxSCgNIAAAAAElFTkSuQmCC'
  371. },
  372. stylesheets: {
  373. main: `
  374. 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;}
  375. div.__MonkeyConfig_container {display:flex !important;flex-direction:column !important;font-family:sans-serif !important;padding:1em !important;font-size:__FONT_SIZE__ !important;color:__FONT_COLOR__ !important;background:#eee linear-gradient(180deg,#f8f8f8 0,#ddd 100%) !important;border-radius:0.5em !important;box-shadow:2px 2px 16px #000 !important;max-width:90vw !important;}
  376. body.__MonkeyConfig_window div.__MonkeyConfig_container {appearance:window !important;-moz-appearance:window !important;height:100%;width:100%;}
  377. div.__MonkeyConfig_container h1 {border-bottom:solid 1px #999 !important;font-family:sans-serif !important;font-size:120% !important;margin:0 0 0.5em 0 !important;padding:0 0 0.3em 0 !important;text-align:center !important;}
  378. div.__MonkeyConfig_content {flex:1 !important;overflow-y:auto !important;max-height:60vh !important;}
  379. div.__MonkeyConfig_top, div.__MonkeyConfig_bottom {margin-bottom:1em !important;}
  380. div.__MonkeyConfig_columns {display:flex !important;justify-content:space-between !important;margin-bottom:1em !important;}
  381. div.__MonkeyConfig_left_column, div.__MonkeyConfig_right_column {width:48% !important;}
  382. div.__MonkeyConfig_container table {border-spacing:0 !important;margin:0 !important;width:100% !important;}
  383. div.__MonkeyConfig_container table td {border:none !important;line-height:100% !important;padding:0.3em !important;text-align:left !important;vertical-align:middle !important;white-space:normal !important;}
  384. /* Modifikasi: Kelas untuk tata letak inline */
  385. div.__MonkeyConfig_container td.__MonkeyConfig_inline {display:flex !important;align-items:center !important;white-space:nowrap !important;}
  386. div.__MonkeyConfig_container td.__MonkeyConfig_inline label {margin-right:0.5em !important;flex-shrink:0 !important;}
  387. div.__MonkeyConfig_container td.__MonkeyConfig_inline input[type="checkbox"],
  388. div.__MonkeyConfig_container td.__MonkeyConfig_inline input[type="number"],
  389. div.__MonkeyConfig_container td.__MonkeyConfig_inline input[type="text"] {flex-grow:1 !important;min-width:0 !important;}
  390. div.__MonkeyConfig_buttons_container {margin-top:1em !important;border-top:solid 1px #999 !important;padding-top:0.6em !important;text-align:center !important;}
  391. div.__MonkeyConfig_buttons_container table {width:auto !important;margin:0 auto !important;}
  392. div.__MonkeyConfig_buttons_container td {padding:0.3em !important;}
  393. 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;padding:3px 8px 3px 24px !important;white-space:nowrap !important;}
  394. div.__MonkeyConfig_container td.__MonkeyConfig_buttons button img {vertical-align:middle !important;}
  395. div.__MonkeyConfig_layer {display:table !important;position:fixed !important;}
  396. div.__MonkeyConfig_layer div.__MonkeyConfig_container td,
  397. div.__MonkeyConfig_layer div.__MonkeyConfig_container label,
  398. div.__MonkeyConfig_layer div.__MonkeyConfig_container input,
  399. div.__MonkeyConfig_layer div.__MonkeyConfig_container select,
  400. div.__MonkeyConfig_layer div.__MonkeyConfig_container textarea,
  401. 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;}
  402. div.__MonkeyConfig_container label {line-height:120% !important;vertical-align:middle !important;}
  403. div.__MonkeyConfig_container textarea {vertical-align:text-top !important;width:100%;}
  404. div.__MonkeyConfig_layer div.__MonkeyConfig_container input[type="text"] {appearance:textfield !important;-moz-appearance:textfield !important;background:#fff !important;}
  405. div.__MonkeyConfig_layer div.__MonkeyConfig_container td.__MonkeyConfig_buttons button:hover {background:#d2d2d2 linear-gradient(180deg,#e2e2e2 0,#d2d2d2 45%,#c2c2c2 50%,#b2b2b2 100%) !important;}
  406. div.__MonkeyConfig_overlay {background-color:#000 !important;opacity:0.6 !important;position:fixed !important;}
  407. `
  408. }
  409. };

QingJ © 2025

镜像随时可能失效,请加Q群300939539或关注我们的公众号极客氢云获取最新地址