├── .gitattributes ├── .gitignore ├── LICENSE ├── README.md ├── adminer ├── LICENSE ├── README.md ├── adminer-4.7.9.php ├── plugins │ ├── login-password-less.php │ └── plugin.php └── themes │ ├── arcs-.css │ ├── arcs-material.css │ ├── brade.css │ ├── bueltge.css │ ├── cvicebni-ubor.css │ ├── esterka.css │ ├── flat.css │ ├── galkaev.css │ ├── haeckel.css │ ├── hever.css │ ├── hydra.css │ ├── jukin.css │ ├── kahi.css │ ├── konya.css │ ├── lucas-sandery.css │ ├── mancave.css │ ├── mvt.css │ ├── nette.css │ ├── ng9.css │ ├── nicu.css │ ├── pappu687.css │ ├── paranoiq.css │ ├── pepa-linha-dark.css │ ├── pepa-linha.css │ ├── pilot.css │ ├── pokorny.css │ ├── price.css │ ├── rmsoft.css │ └── rmsoft_blue.css ├── elm.json ├── package-lock.json ├── package.json ├── resource ├── bulma │ ├── LICENSE │ └── css │ │ └── bulma.min.css ├── fontawesome │ ├── LICENSE.txt │ ├── css │ │ └── all.min.css │ └── webfonts │ │ ├── fa-brands-400.eot │ │ ├── fa-brands-400.svg │ │ ├── fa-brands-400.ttf │ │ ├── fa-brands-400.woff │ │ ├── fa-brands-400.woff2 │ │ ├── fa-regular-400.eot │ │ ├── fa-regular-400.svg │ │ ├── fa-regular-400.ttf │ │ ├── fa-regular-400.woff │ │ ├── fa-regular-400.woff2 │ │ ├── fa-solid-900.eot │ │ ├── fa-solid-900.svg │ │ ├── fa-solid-900.ttf │ │ ├── fa-solid-900.woff │ │ └── fa-solid-900.woff2 └── images │ ├── connections.png │ ├── image.gif │ └── sqlite.png ├── src ├── adminer.js ├── const.js ├── elm │ ├── Connection.elm │ ├── Home.elm │ ├── Menu.elm │ └── Settings.elm ├── index.php ├── main.js ├── php.js ├── preload.js ├── store.js └── view │ ├── home.css │ ├── home.html │ ├── home.js │ ├── menu.css │ ├── menu.html │ ├── menu.js │ ├── settings.css │ ├── settings.html │ └── settings.js └── tests └── ConnectionTest.elm /.gitattributes: -------------------------------------------------------------------------------- 1 | adminer/* linguist-vendored 2 | resource/* linguist-vendored 3 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Logs 2 | logs 3 | *.log 4 | npm-debug.log* 5 | yarn-debug.log* 6 | yarn-error.log* 7 | lerna-debug.log* 8 | 9 | # Diagnostic reports (https://nodejs.org/api/report.html) 10 | report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json 11 | 12 | # Runtime data 13 | pids 14 | *.pid 15 | *.seed 16 | *.pid.lock 17 | 18 | # Directory for instrumented libs generated by jscoverage/JSCover 19 | lib-cov 20 | 21 | # Coverage directory used by tools like istanbul 22 | coverage 23 | *.lcov 24 | 25 | # nyc test coverage 26 | .nyc_output 27 | 28 | # Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files) 29 | .grunt 30 | 31 | # Bower dependency directory (https://bower.io/) 32 | bower_components 33 | 34 | # node-waf configuration 35 | .lock-wscript 36 | 37 | # Compiled binary addons (https://nodejs.org/api/addons.html) 38 | build/Release 39 | 40 | # Dependency directories 41 | node_modules/ 42 | jspm_packages/ 43 | 44 | # Snowpack dependency directory (https://snowpack.dev/) 45 | web_modules/ 46 | 47 | # TypeScript cache 48 | *.tsbuildinfo 49 | 50 | # Optional npm cache directory 51 | .npm 52 | 53 | # Optional eslint cache 54 | .eslintcache 55 | 56 | # Microbundle cache 57 | .rpt2_cache/ 58 | .rts2_cache_cjs/ 59 | .rts2_cache_es/ 60 | .rts2_cache_umd/ 61 | 62 | # Optional REPL history 63 | .node_repl_history 64 | 65 | # Output of 'npm pack' 66 | *.tgz 67 | 68 | # Yarn Integrity file 69 | .yarn-integrity 70 | 71 | # dotenv environment variables file 72 | .env 73 | .env.test 74 | 75 | # parcel-bundler cache (https://parceljs.org/) 76 | .cache 77 | .parcel-cache 78 | 79 | # Next.js build output 80 | .next 81 | out 82 | 83 | # Nuxt.js build / generate output 84 | .nuxt 85 | dist 86 | 87 | # Gatsby files 88 | .cache/ 89 | # Comment in the public line in if your project uses Gatsby and not Next.js 90 | # https://nextjs.org/blog/next-9-1#public-directory-support 91 | # public 92 | 93 | # vuepress build output 94 | .vuepress/dist 95 | 96 | # Serverless directories 97 | .serverless/ 98 | 99 | # FuseBox cache 100 | .fusebox/ 101 | 102 | # DynamoDB Local files 103 | .dynamodb/ 104 | 105 | # TernJS port file 106 | .tern-port 107 | 108 | # Stores VSCode versions used for testing VSCode extensions 109 | .vscode-test 110 | 111 | # yarn v2 112 | .yarn/cache 113 | .yarn/unplugged 114 | .yarn/build-state.yml 115 | .yarn/install-state.gz 116 | .pnp.* 117 | 118 | # build 119 | eledminer-darwin-x64 120 | 121 | # elm 122 | elm-stuff 123 | elm.js 124 | dst -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2020 lusingander 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | eledminer 2 | ==== 3 | 4 | Desktop application for database management with [Electron](https://www.electronjs.org/) and [Adminer](https://www.adminer.org/) 5 | 6 | 7 | 8 | ## About 9 | 10 | > This app is under development... 11 | 12 | Eledminer is the Electron application to manage and connect to the Adminer launched locally. 13 | 14 | The application starts the php server as local background process and runs Adminer on it, and manage databases using Electron's BrowserView. 15 | 16 | ### Supported 17 | 18 | - MySQL 19 | - TCP/IP connection 20 | - SQLite 21 | 22 | ### Not supported yet 23 | 24 | - MySQL 25 | - using SSL 26 | - socket/pipe 27 | - over SSH 28 | - other databases 29 | - might work, but not tested 30 | 31 | ## Features / Screenshot 32 | 33 | ### Connections management 34 | 35 | Eledminer makes it easy to save and manage connections. 36 | 37 | 38 | 39 | ### SQLite 40 | 41 | You can open SQLite database by simply specifying the file path. 42 | 43 | 44 | 45 | ## Installation / Development 46 | 47 | ``` 48 | $ npm install 49 | $ npx elm install 50 | $ npm run build 51 | $ npm start 52 | ``` 53 | 54 | ## Requirements 55 | 56 | PHP 7+ 57 | -------------------------------------------------------------------------------- /adminer/LICENSE: -------------------------------------------------------------------------------- 1 | 2 | Apache License 3 | Version 2.0, January 2004 4 | http://www.apache.org/licenses/ 5 | 6 | TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 7 | 8 | 1. Definitions. 9 | 10 | "License" shall mean the terms and conditions for use, reproduction, 11 | and distribution as defined by Sections 1 through 9 of this document. 12 | 13 | "Licensor" shall mean the copyright owner or entity authorized by 14 | the copyright owner that is granting the License. 15 | 16 | "Legal Entity" shall mean the union of the acting entity and all 17 | other entities that control, are controlled by, or are under common 18 | control with that entity. For the purposes of this definition, 19 | "control" means (i) the power, direct or indirect, to cause the 20 | direction or management of such entity, whether by contract or 21 | otherwise, or (ii) ownership of fifty percent (50%) or more of the 22 | outstanding shares, or (iii) beneficial ownership of such entity. 23 | 24 | "You" (or "Your") shall mean an individual or Legal Entity 25 | exercising permissions granted by this License. 26 | 27 | "Source" form shall mean the preferred form for making modifications, 28 | including but not limited to software source code, documentation 29 | source, and configuration files. 30 | 31 | "Object" form shall mean any form resulting from mechanical 32 | transformation or translation of a Source form, including but 33 | not limited to compiled object code, generated documentation, 34 | and conversions to other media types. 35 | 36 | "Work" shall mean the work of authorship, whether in Source or 37 | Object form, made available under the License, as indicated by a 38 | copyright notice that is included in or attached to the work 39 | (an example is provided in the Appendix below). 40 | 41 | "Derivative Works" shall mean any work, whether in Source or Object 42 | form, that is based on (or derived from) the Work and for which the 43 | editorial revisions, annotations, elaborations, or other modifications 44 | represent, as a whole, an original work of authorship. For the purposes 45 | of this License, Derivative Works shall not include works that remain 46 | separable from, or merely link (or bind by name) to the interfaces of, 47 | the Work and Derivative Works thereof. 48 | 49 | "Contribution" shall mean any work of authorship, including 50 | the original version of the Work and any modifications or additions 51 | to that Work or Derivative Works thereof, that is intentionally 52 | submitted to Licensor for inclusion in the Work by the copyright owner 53 | or by an individual or Legal Entity authorized to submit on behalf of 54 | the copyright owner. For the purposes of this definition, "submitted" 55 | means any form of electronic, verbal, or written communication sent 56 | to the Licensor or its representatives, including but not limited to 57 | communication on electronic mailing lists, source code control systems, 58 | and issue tracking systems that are managed by, or on behalf of, the 59 | Licensor for the purpose of discussing and improving the Work, but 60 | excluding communication that is conspicuously marked or otherwise 61 | designated in writing by the copyright owner as "Not a Contribution." 62 | 63 | "Contributor" shall mean Licensor and any individual or Legal Entity 64 | on behalf of whom a Contribution has been received by Licensor and 65 | subsequently incorporated within the Work. 66 | 67 | 2. Grant of Copyright License. Subject to the terms and conditions of 68 | this License, each Contributor hereby grants to You a perpetual, 69 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable 70 | copyright license to reproduce, prepare Derivative Works of, 71 | publicly display, publicly perform, sublicense, and distribute the 72 | Work and such Derivative Works in Source or Object form. 73 | 74 | 3. Grant of Patent License. Subject to the terms and conditions of 75 | this License, each Contributor hereby grants to You a perpetual, 76 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable 77 | (except as stated in this section) patent license to make, have made, 78 | use, offer to sell, sell, import, and otherwise transfer the Work, 79 | where such license applies only to those patent claims licensable 80 | by such Contributor that are necessarily infringed by their 81 | Contribution(s) alone or by combination of their Contribution(s) 82 | with the Work to which such Contribution(s) was submitted. If You 83 | institute patent litigation against any entity (including a 84 | cross-claim or counterclaim in a lawsuit) alleging that the Work 85 | or a Contribution incorporated within the Work constitutes direct 86 | or contributory patent infringement, then any patent licenses 87 | granted to You under this License for that Work shall terminate 88 | as of the date such litigation is filed. 89 | 90 | 4. Redistribution. You may reproduce and distribute copies of the 91 | Work or Derivative Works thereof in any medium, with or without 92 | modifications, and in Source or Object form, provided that You 93 | meet the following conditions: 94 | 95 | (a) You must give any other recipients of the Work or 96 | Derivative Works a copy of this License; and 97 | 98 | (b) You must cause any modified files to carry prominent notices 99 | stating that You changed the files; and 100 | 101 | (c) You must retain, in the Source form of any Derivative Works 102 | that You distribute, all copyright, patent, trademark, and 103 | attribution notices from the Source form of the Work, 104 | excluding those notices that do not pertain to any part of 105 | the Derivative Works; and 106 | 107 | (d) If the Work includes a "NOTICE" text file as part of its 108 | distribution, then any Derivative Works that You distribute must 109 | include a readable copy of the attribution notices contained 110 | within such NOTICE file, excluding those notices that do not 111 | pertain to any part of the Derivative Works, in at least one 112 | of the following places: within a NOTICE text file distributed 113 | as part of the Derivative Works; within the Source form or 114 | documentation, if provided along with the Derivative Works; or, 115 | within a display generated by the Derivative Works, if and 116 | wherever such third-party notices normally appear. The contents 117 | of the NOTICE file are for informational purposes only and 118 | do not modify the License. You may add Your own attribution 119 | notices within Derivative Works that You distribute, alongside 120 | or as an addendum to the NOTICE text from the Work, provided 121 | that such additional attribution notices cannot be construed 122 | as modifying the License. 123 | 124 | You may add Your own copyright statement to Your modifications and 125 | may provide additional or different license terms and conditions 126 | for use, reproduction, or distribution of Your modifications, or 127 | for any such Derivative Works as a whole, provided Your use, 128 | reproduction, and distribution of the Work otherwise complies with 129 | the conditions stated in this License. 130 | 131 | 5. Submission of Contributions. Unless You explicitly state otherwise, 132 | any Contribution intentionally submitted for inclusion in the Work 133 | by You to the Licensor shall be under the terms and conditions of 134 | this License, without any additional terms or conditions. 135 | Notwithstanding the above, nothing herein shall supersede or modify 136 | the terms of any separate license agreement you may have executed 137 | with Licensor regarding such Contributions. 138 | 139 | 6. Trademarks. This License does not grant permission to use the trade 140 | names, trademarks, service marks, or product names of the Licensor, 141 | except as required for reasonable and customary use in describing the 142 | origin of the Work and reproducing the content of the NOTICE file. 143 | 144 | 7. Disclaimer of Warranty. Unless required by applicable law or 145 | agreed to in writing, Licensor provides the Work (and each 146 | Contributor provides its Contributions) on an "AS IS" BASIS, 147 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or 148 | implied, including, without limitation, any warranties or conditions 149 | of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A 150 | PARTICULAR PURPOSE. You are solely responsible for determining the 151 | appropriateness of using or redistributing the Work and assume any 152 | risks associated with Your exercise of permissions under this License. 153 | 154 | 8. Limitation of Liability. In no event and under no legal theory, 155 | whether in tort (including negligence), contract, or otherwise, 156 | unless required by applicable law (such as deliberate and grossly 157 | negligent acts) or agreed to in writing, shall any Contributor be 158 | liable to You for damages, including any direct, indirect, special, 159 | incidental, or consequential damages of any character arising as a 160 | result of this License or out of the use or inability to use the 161 | Work (including but not limited to damages for loss of goodwill, 162 | work stoppage, computer failure or malfunction, or any and all 163 | other commercial damages or losses), even if such Contributor 164 | has been advised of the possibility of such damages. 165 | 166 | 9. Accepting Warranty or Additional Liability. While redistributing 167 | the Work or Derivative Works thereof, You may choose to offer, 168 | and charge a fee for, acceptance of support, warranty, indemnity, 169 | or other liability obligations and/or rights consistent with this 170 | License. However, in accepting such obligations, You may act only 171 | on Your own behalf and on Your sole responsibility, not on behalf 172 | of any other Contributor, and only if You agree to indemnify, 173 | defend, and hold each Contributor harmless for any liability 174 | incurred by, or claims asserted against, such Contributor by reason 175 | of your accepting any such warranty or additional liability. 176 | 177 | END OF TERMS AND CONDITIONS 178 | 179 | APPENDIX: How to apply the Apache License to your work. 180 | 181 | To apply the Apache License to your work, attach the following 182 | boilerplate notice, with the fields enclosed by brackets "[]" 183 | replaced with your own identifying information. (Don't include 184 | the brackets!) The text should be enclosed in the appropriate 185 | comment syntax for the file format. We also recommend that a 186 | file or class name and description of purpose be included on the 187 | same "printed page" as the copyright notice for easier 188 | identification within third-party archives. 189 | 190 | Copyright [yyyy] [name of copyright owner] 191 | 192 | Licensed under the Apache License, Version 2.0 (the "License"); 193 | you may not use this file except in compliance with the License. 194 | You may obtain a copy of the License at 195 | 196 | http://www.apache.org/licenses/LICENSE-2.0 197 | 198 | Unless required by applicable law or agreed to in writing, software 199 | distributed under the License is distributed on an "AS IS" BASIS, 200 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 201 | See the License for the specific language governing permissions and 202 | limitations under the License. 203 | -------------------------------------------------------------------------------- /adminer/README.md: -------------------------------------------------------------------------------- 1 | Adminer, official themes and plugins are licensed under Apache license 2.0 2 | 3 | - https://www.adminer.org/ 4 | - https://github.com/vrana/adminer/ 5 | - https://github.com/vrana/adminer/tree/master/designs 6 | - https://github.com/vrana/adminer/tree/master/plugins -------------------------------------------------------------------------------- /adminer/adminer-4.7.9.php: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lusingander/eledminer/52d3ff9ef8ad81f6ce9c32b27033f61ec6dd4682/adminer/adminer-4.7.9.php -------------------------------------------------------------------------------- /adminer/plugins/login-password-less.php: -------------------------------------------------------------------------------- 1 | password_hash = $password_hash; 18 | } 19 | 20 | function credentials() { 21 | $password = get_password(); 22 | return array(SERVER, $_GET["username"], (password_verify($password, $this->password_hash) ? "" : $password)); 23 | } 24 | 25 | function login($login, $password) { 26 | if ($password != "") { 27 | return true; 28 | } 29 | } 30 | 31 | } 32 | -------------------------------------------------------------------------------- /adminer/plugins/plugin.php: -------------------------------------------------------------------------------- 1 | _findRootClass($class), 'Adminer')) { //! can use interface 28 | $plugins[$class] = new $class; 29 | } 30 | } 31 | } 32 | $this->plugins = $plugins; 33 | //! it is possible to use ReflectionObject to find out which plugins defines which methods at once 34 | } 35 | 36 | function _callParent($function, $args) { 37 | return call_user_func_array(array('parent', $function), $args); 38 | } 39 | 40 | function _applyPlugin($function, $args) { 41 | foreach ($this->plugins as $plugin) { 42 | if (method_exists($plugin, $function)) { 43 | switch (count($args)) { // call_user_func_array() doesn't work well with references 44 | case 0: $return = $plugin->$function(); break; 45 | case 1: $return = $plugin->$function($args[0]); break; 46 | case 2: $return = $plugin->$function($args[0], $args[1]); break; 47 | case 3: $return = $plugin->$function($args[0], $args[1], $args[2]); break; 48 | case 4: $return = $plugin->$function($args[0], $args[1], $args[2], $args[3]); break; 49 | case 5: $return = $plugin->$function($args[0], $args[1], $args[2], $args[3], $args[4]); break; 50 | case 6: $return = $plugin->$function($args[0], $args[1], $args[2], $args[3], $args[4], $args[5]); break; 51 | default: trigger_error('Too many parameters.', E_USER_WARNING); 52 | } 53 | if ($return !== null) { 54 | return $return; 55 | } 56 | } 57 | } 58 | return $this->_callParent($function, $args); 59 | } 60 | 61 | function _appendPlugin($function, $args) { 62 | $return = $this->_callParent($function, $args); 63 | foreach ($this->plugins as $plugin) { 64 | if (method_exists($plugin, $function)) { 65 | $value = call_user_func_array(array($plugin, $function), $args); 66 | if ($value) { 67 | $return += $value; 68 | } 69 | } 70 | } 71 | return $return; 72 | } 73 | 74 | // appendPlugin 75 | 76 | function dumpFormat() { 77 | $args = func_get_args(); 78 | return $this->_appendPlugin(__FUNCTION__, $args); 79 | } 80 | 81 | function dumpOutput() { 82 | $args = func_get_args(); 83 | return $this->_appendPlugin(__FUNCTION__, $args); 84 | } 85 | 86 | function editFunctions($field) { 87 | $args = func_get_args(); 88 | return $this->_appendPlugin(__FUNCTION__, $args); 89 | } 90 | 91 | // applyPlugin 92 | 93 | function name() { 94 | $args = func_get_args(); 95 | return $this->_applyPlugin(__FUNCTION__, $args); 96 | } 97 | 98 | function credentials() { 99 | $args = func_get_args(); 100 | return $this->_applyPlugin(__FUNCTION__, $args); 101 | } 102 | 103 | function connectSsl() { 104 | $args = func_get_args(); 105 | return $this->_applyPlugin(__FUNCTION__, $args); 106 | } 107 | 108 | function permanentLogin($create = false) { 109 | $args = func_get_args(); 110 | return $this->_applyPlugin(__FUNCTION__, $args); 111 | } 112 | 113 | function bruteForceKey() { 114 | $args = func_get_args(); 115 | return $this->_applyPlugin(__FUNCTION__, $args); 116 | } 117 | 118 | function serverName($server) { 119 | $args = func_get_args(); 120 | return $this->_applyPlugin(__FUNCTION__, $args); 121 | } 122 | 123 | function database() { 124 | $args = func_get_args(); 125 | return $this->_applyPlugin(__FUNCTION__, $args); 126 | } 127 | 128 | function schemas() { 129 | $args = func_get_args(); 130 | return $this->_applyPlugin(__FUNCTION__, $args); 131 | } 132 | 133 | function databases($flush = true) { 134 | $args = func_get_args(); 135 | return $this->_applyPlugin(__FUNCTION__, $args); 136 | } 137 | 138 | function queryTimeout() { 139 | $args = func_get_args(); 140 | return $this->_applyPlugin(__FUNCTION__, $args); 141 | } 142 | 143 | function headers() { 144 | $args = func_get_args(); 145 | return $this->_applyPlugin(__FUNCTION__, $args); 146 | } 147 | 148 | function csp() { 149 | $args = func_get_args(); 150 | return $this->_applyPlugin(__FUNCTION__, $args); 151 | } 152 | 153 | function head() { 154 | $args = func_get_args(); 155 | return $this->_applyPlugin(__FUNCTION__, $args); 156 | } 157 | 158 | function css() { 159 | $args = func_get_args(); 160 | return $this->_applyPlugin(__FUNCTION__, $args); 161 | } 162 | 163 | function loginForm() { 164 | $args = func_get_args(); 165 | return $this->_applyPlugin(__FUNCTION__, $args); 166 | } 167 | 168 | function loginFormField($name, $heading, $value) { 169 | $args = func_get_args(); 170 | return $this->_applyPlugin(__FUNCTION__, $args); 171 | } 172 | 173 | function login($login, $password) { 174 | $args = func_get_args(); 175 | return $this->_applyPlugin(__FUNCTION__, $args); 176 | } 177 | 178 | function tableName($tableStatus) { 179 | $args = func_get_args(); 180 | return $this->_applyPlugin(__FUNCTION__, $args); 181 | } 182 | 183 | function fieldName($field, $order = 0) { 184 | $args = func_get_args(); 185 | return $this->_applyPlugin(__FUNCTION__, $args); 186 | } 187 | 188 | function selectLinks($tableStatus, $set = "") { 189 | $args = func_get_args(); 190 | return $this->_applyPlugin(__FUNCTION__, $args); 191 | } 192 | 193 | function foreignKeys($table) { 194 | $args = func_get_args(); 195 | return $this->_applyPlugin(__FUNCTION__, $args); 196 | } 197 | 198 | function backwardKeys($table, $tableName) { 199 | $args = func_get_args(); 200 | return $this->_applyPlugin(__FUNCTION__, $args); 201 | } 202 | 203 | function backwardKeysPrint($backwardKeys, $row) { 204 | $args = func_get_args(); 205 | return $this->_applyPlugin(__FUNCTION__, $args); 206 | } 207 | 208 | function selectQuery($query, $start, $failed = false) { 209 | $args = func_get_args(); 210 | return $this->_applyPlugin(__FUNCTION__, $args); 211 | } 212 | 213 | function sqlCommandQuery($query) { 214 | $args = func_get_args(); 215 | return $this->_applyPlugin(__FUNCTION__, $args); 216 | } 217 | 218 | function rowDescription($table) { 219 | $args = func_get_args(); 220 | return $this->_applyPlugin(__FUNCTION__, $args); 221 | } 222 | 223 | function rowDescriptions($rows, $foreignKeys) { 224 | $args = func_get_args(); 225 | return $this->_applyPlugin(__FUNCTION__, $args); 226 | } 227 | 228 | function selectLink($val, $field) { 229 | $args = func_get_args(); 230 | return $this->_applyPlugin(__FUNCTION__, $args); 231 | } 232 | 233 | function selectVal($val, $link, $field, $original) { 234 | $args = func_get_args(); 235 | return $this->_applyPlugin(__FUNCTION__, $args); 236 | } 237 | 238 | function editVal($val, $field) { 239 | $args = func_get_args(); 240 | return $this->_applyPlugin(__FUNCTION__, $args); 241 | } 242 | 243 | function tableStructurePrint($fields) { 244 | $args = func_get_args(); 245 | return $this->_applyPlugin(__FUNCTION__, $args); 246 | } 247 | 248 | function tableIndexesPrint($indexes) { 249 | $args = func_get_args(); 250 | return $this->_applyPlugin(__FUNCTION__, $args); 251 | } 252 | 253 | function selectColumnsPrint($select, $columns) { 254 | $args = func_get_args(); 255 | return $this->_applyPlugin(__FUNCTION__, $args); 256 | } 257 | 258 | function selectSearchPrint($where, $columns, $indexes) { 259 | $args = func_get_args(); 260 | return $this->_applyPlugin(__FUNCTION__, $args); 261 | } 262 | 263 | function selectOrderPrint($order, $columns, $indexes) { 264 | $args = func_get_args(); 265 | return $this->_applyPlugin(__FUNCTION__, $args); 266 | } 267 | 268 | function selectLimitPrint($limit) { 269 | $args = func_get_args(); 270 | return $this->_applyPlugin(__FUNCTION__, $args); 271 | } 272 | 273 | function selectLengthPrint($text_length) { 274 | $args = func_get_args(); 275 | return $this->_applyPlugin(__FUNCTION__, $args); 276 | } 277 | 278 | function selectActionPrint($indexes) { 279 | $args = func_get_args(); 280 | return $this->_applyPlugin(__FUNCTION__, $args); 281 | } 282 | 283 | function selectCommandPrint() { 284 | $args = func_get_args(); 285 | return $this->_applyPlugin(__FUNCTION__, $args); 286 | } 287 | 288 | function selectImportPrint() { 289 | $args = func_get_args(); 290 | return $this->_applyPlugin(__FUNCTION__, $args); 291 | } 292 | 293 | function selectEmailPrint($emailFields, $columns) { 294 | $args = func_get_args(); 295 | return $this->_applyPlugin(__FUNCTION__, $args); 296 | } 297 | 298 | function selectColumnsProcess($columns, $indexes) { 299 | $args = func_get_args(); 300 | return $this->_applyPlugin(__FUNCTION__, $args); 301 | } 302 | 303 | function selectSearchProcess($fields, $indexes) { 304 | $args = func_get_args(); 305 | return $this->_applyPlugin(__FUNCTION__, $args); 306 | } 307 | 308 | function selectOrderProcess($fields, $indexes) { 309 | $args = func_get_args(); 310 | return $this->_applyPlugin(__FUNCTION__, $args); 311 | } 312 | 313 | function selectLimitProcess() { 314 | $args = func_get_args(); 315 | return $this->_applyPlugin(__FUNCTION__, $args); 316 | } 317 | 318 | function selectLengthProcess() { 319 | $args = func_get_args(); 320 | return $this->_applyPlugin(__FUNCTION__, $args); 321 | } 322 | 323 | function selectEmailProcess($where, $foreignKeys) { 324 | $args = func_get_args(); 325 | return $this->_applyPlugin(__FUNCTION__, $args); 326 | } 327 | 328 | function selectQueryBuild($select, $where, $group, $order, $limit, $page) { 329 | $args = func_get_args(); 330 | return $this->_applyPlugin(__FUNCTION__, $args); 331 | } 332 | 333 | function messageQuery($query, $time, $failed = false) { 334 | $args = func_get_args(); 335 | return $this->_applyPlugin(__FUNCTION__, $args); 336 | } 337 | 338 | function editInput($table, $field, $attrs, $value) { 339 | $args = func_get_args(); 340 | return $this->_applyPlugin(__FUNCTION__, $args); 341 | } 342 | 343 | function editHint($table, $field, $value) { 344 | $args = func_get_args(); 345 | return $this->_applyPlugin(__FUNCTION__, $args); 346 | } 347 | 348 | function processInput($field, $value, $function = "") { 349 | $args = func_get_args(); 350 | return $this->_applyPlugin(__FUNCTION__, $args); 351 | } 352 | 353 | function dumpDatabase($db) { 354 | $args = func_get_args(); 355 | return $this->_applyPlugin(__FUNCTION__, $args); 356 | } 357 | 358 | function dumpTable($table, $style, $is_view = 0) { 359 | $args = func_get_args(); 360 | return $this->_applyPlugin(__FUNCTION__, $args); 361 | } 362 | 363 | function dumpData($table, $style, $query) { 364 | $args = func_get_args(); 365 | return $this->_applyPlugin(__FUNCTION__, $args); 366 | } 367 | 368 | function dumpFilename($identifier) { 369 | $args = func_get_args(); 370 | return $this->_applyPlugin(__FUNCTION__, $args); 371 | } 372 | 373 | function dumpHeaders($identifier, $multi_table = false) { 374 | $args = func_get_args(); 375 | return $this->_applyPlugin(__FUNCTION__, $args); 376 | } 377 | 378 | function importServerPath() { 379 | $args = func_get_args(); 380 | return $this->_applyPlugin(__FUNCTION__, $args); 381 | } 382 | 383 | function homepage() { 384 | $args = func_get_args(); 385 | return $this->_applyPlugin(__FUNCTION__, $args); 386 | } 387 | 388 | function navigation($missing) { 389 | $args = func_get_args(); 390 | return $this->_applyPlugin(__FUNCTION__, $args); 391 | } 392 | 393 | function databasesPrint($missing) { 394 | $args = func_get_args(); 395 | return $this->_applyPlugin(__FUNCTION__, $args); 396 | } 397 | 398 | function tablesPrint($tables) { 399 | $args = func_get_args(); 400 | return $this->_applyPlugin(__FUNCTION__, $args); 401 | } 402 | 403 | } 404 | -------------------------------------------------------------------------------- /adminer/themes/arcs-.css: -------------------------------------------------------------------------------- 1 | /* 2 | * ARCS - Clean and Modern 3 | * By P.Stillhart [https://stillhart.biz/] 4 | */ 5 | @import url(http://fonts.googleapis.com/css?family=Roboto);body,html{height:100%}body{font-family:Roboto,sans-serif}::selection{background:#e74c3c}::-moz-selection{background:#ffb7b7}::-webkit-scrollbar{width:1em;background-color:#bdc3c7}#tables::-webkit-scrollbar{width:.5em;background-color:#bdc3c7}::-webkit-scrollbar-thumb{background-color:#34495e}select::-ms-expand{display:none}#menu #logins{padding:10px 14px 0;font-size:18px;height:100%}#menu #logins a{background:#fff;width:92%;display:inline-block;padding:14px 9px;margin:4px 0;text-decoration:none}#menu #logins a:hover{background:#F8F8F8}#menu #logins a:active{background:#E6E6E6}.select{background-color:#fff;position:absolute;right:0;border-right:1px solid #fff}.select .active{background-color:#bdc3c7}h1{margin:0;padding:0;background:0 0;border:0}h2{margin:10px 0 15px;padding:0 0 6px;background:0 0;border:0;font-family:"Segoe UI Light","Segoe UI",Arial,sans-serif;font-size:32px;font-weight:400;color:#34567c;border-bottom:1px solid #ebebeb}.rtl h2{margin:0 0 40px}h3{font-size:22px;border-bottom:1px solid #ebebeb;padding:0 0 6px;width:576px -webkit-margin-after:-10px;-webkit-box-ordinal-group:3;-moz-box-ordinal-group:3;box-ordinal-group:3}p{margin:0 0 15px}a{color:#2e84e4;text-decoration:none}a:visited{color:#2e84e4}a:link:hover,a:visited:hover{color:#2e84e4;text-decoration:underline}form{-webkit-box-ordinal-group:3;-moz-box-ordinal-group:3;box-ordinal-group:3;width:100%;max-width:1200px}fieldset:first-of-type{position:absolute;margin-top:-44px;background:0 0;max-width:734px;width:calc(100% - 923px);left:855px}fieldset:first-of-type div{float:right}fieldset:first-of-type legend{display:none}input[name=drop]:not([onmouseover]){margin-top:40px}div input[name=delete],div input[name=drop],div input[name=truncate],div input[type=button]{background:#e74c3c;border:1px solid #e74c3c;color:#fff}input[value=Save]{margin-top:40px}#tables-views,a[href*=charsets]{display:none}table{border:0;margin:15px 0 0;font-size:14px;z-index:1;width:100%}td,th{border:0;padding:6px}th{background:0 0;color:#34567c;font-weight:400}tbody tr:hover td,tbody tr:hover th{background:0 0}table:not(.checkable) th{min-width:117px}#content table:nth-of-type(2){width:500px}input[type=checkbox]{-webkit-appearance:none;padding-left:25px;height:20px;display:inline-block;line-height:20px;background-repeat:no-repeat;background-position:0 0;font-size:20px;vertical-align:middle;cursor:pointer;background-size:20px;background-image:url(https://stillhart.biz/project/adminerM/check.svg);-webkit-touch-callout:none;-webkit-user-select:none;-khtml-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;outline:0}input[type=checkbox]:checked{background-position:0 -20px}input[type=radio]{-webkit-appearance:none;padding-left:25px;height:20px;display:inline-block;line-height:20px;background-repeat:no-repeat;background-position:0 0;font-size:20px;vertical-align:middle;cursor:pointer;background-size:20px;background-image:url(https://stillhart.biz/project/adminerM/radio.svg);-webkit-touch-callout:none;-webkit-user-select:none;-khtml-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;outline:0}input[type=radio]:checked{background-position:0 -20px}thead td{background:#747a7c;text-align:right}thead td:nth-of-type(1),thead td:nth-of-type(2),thead td:nth-of-type(3),thead th{background:#747a7c;text-align:left}thead td,thead td a,thead td a:link:hover,thead td a:visited,thead td a:visited:hover,thead th,thead th a,thead th a:link:hover,thead th a:visited,thead th a:visited:hover{color:#fff;text-decoration:none}#edit-fields,h3+table,p+table,p.links+table,pre+table,table.checkable{border:1px solid #747a7c;margin-bottom:15px}table.checkable tbody tr:hover td,table.checkable tbody tr:hover th{background:#D7E6ED}thead a{text-decoration:underline}.js .checkable .checked td,.js .checkable .checked th{background:#D7E6ED}.js .checkable thead .checked td,.js .checkable thead .checked th{background:#93cf2b}.odd td,.odd th{background:#f5f5f5}fieldset{display:inline-block;padding:8px 12px 12px;margin:3px 2px 0 0;border:none;vertical-align:baseline;font-family:"Segoe UI",Arial,sans-serif}form[method=post] fieldset:nth-of-type(2){background:#E2E2E2;max-width:610px}form[method=post] fieldset:nth-of-type(2) legend{display:none}form[method=post] fieldset:nth-of-type(2) p{margin-left:4px}fieldset select{margin-right:32px}fieldset input[type=button],fieldset input[type=submit],fieldset p{margin-bottom:0}fieldset div p{margin-top:10px}legend{display:inline-block;padding:0 14px;background:#03a9f4;color:#fff;border:1px solid #03a9f4;line-height:34px}legend a{text-decoration:none!important}legend:hover{background:#fff;color:#000;text-decoration:none}fieldset input[name=limit]{position:absolute;margin-top:-36px;margin-left:61px;padding:7px 7px 8px;width:58px;outline:0;color:#000;border:3px solid #03a9f4;text-align:right}#fieldset-export,#fieldset-import,#fieldset-search,#fieldset-sort{background:#03a9f4;padding:10px 15px}.time,fieldset:nth-of-type(5),fieldset:nth-of-type(6){display:none}#form fieldset:nth-of-type(2),#form fieldset:nth-of-type(3),#form fieldset:nth-of-type(4){-webkit-padding-start:0;padding:0 1px}legend a,legend a:link:hover{color:#fff;text-decoration:underline}legend a:hover{color:#000!important}code{background:0 0}#help{display:none}p code,pre code,pre[contenteditable=true]{background-color:#DDD;padding:18px 30px;display:block;font-size:17px;margin-bottom:15px}p code+a,p code+a:link:hover,p code+a:visited:hover{margin-left:15px;position:relative;top:-20px;color:#000;font-size:12px;text-decoration:underline;text-transform:lowercase}#content{margin:0 54px 0 400px;padding:50px 0 0;max-width:1200px;display:-webkit-box;display:-moz-box;display:box;-webkit-box-orient:vertical;-moz-box-orient:vertical;box-orient:vertical}#content>p{margin-bottom:15px}.rtl #content{margin:0 400px 0 54px;padding:50px 0 0}#menu{width:320px;box-shadow:inset -1px 0 0 #fff;margin:0;padding:0;top:0;background:#03a9f4;bottom:0;position:fixed;box-sizing:border-box}#h1{color:#fff!important}#menu h1{margin:13px 0 10px 16px}#menu h1 a{font-style:normal}#menu h1 .version{color:#fff}#menu a{color:#34567c}#menu p{border:0;padding:0}#menu #dbs{background:#fff;padding:0 30px 0 20px;border-bottom:0;box-sizing:border-box;color:#fff}#menu #dbs select{outline:0;border-color:rgba(0,0,0,.1);width:100%}#menu #tables a{text-decoration:none;color:#000;padding-right:18px;font-size:14px;line-height:30px}#menu #tables a.active{background:#bdc3c7;font-weight:400}#menu #tables a:hover:not([title]){background:#aeaeae;color:#000;cursor:pointer}#menu p.links{margin:0 0 15px;background-color:#fff;border-top:0;text-align:center;display:table;width:100%;box-sizing:border-box;padding:0 30px 0 20px}#menu p.links a{padding:8px 13px;margin:0;display:inline-table;font-size:12px}#menu p.links a:hover{text-decoration:none;background:#03a9f4}#menu p.links a:nth-of-type(4){display:none}#menu p.links a:hover{color:#2e84e4}#menu p.links a.active{font-weight:400;background:#fff;color:#000}#content p.links{margin-top:25px;margin-bottom:5px;-webkit-box-ordinal-group:3;-moz-box-ordinal-group:3;box-ordinal-group:3}#content p.links a,#content p.links a:visited{padding:8px 14px;background:#03a9f4;color:#fff;border:1px solid #03a9f4;line-height:34px;margin-right:3px;transition:background .1s linear}#content p.links a:hover{background:#fff;text-decoration:none}#content p.links:hover a:hover{color:#000}#content p.links a.active:hover{background:#aeaeae!important;color:#e9e9e9;cursor:default;border:1px solid #aeaeae}#content p.links a.active{background:#aeaeae!important;color:#e9e9e9;cursor:default;border:1px solid #aeaeae;font-weight:400}#menu a:hover{color:#fff!important;background:#34495e!important}#tables{margin:0 -15px!important;position:absolute;left:15px;right:15px;bottom:0;top:190px;overflow:hidden!important;overflow-y:auto!important}.rtl #tables{overflow:hidden!important;overflow-y:auto!important}#tables a{float:right;padding:6px 15px}.rtl #tables a{float:none}#tables a[title]{float:none;display:block}.rtl #tables a:first-child,.rtl #tables br+a{float:left;display:block;margin-left:15px}#tables a.active,#tables a.active+a,#tables a:hover,#tables a:hover+a{background:#fff;color:#2e84e4}#tables br{display:none}.js .column{background:#fff;border:1px solid #000;margin-left:4px;cursor:pointer;padding:0}.js .column:hover{color:transparent;background:#bdc3c7}.js .column a{text-decoration:none!important;font-size:16px;display:block;color:transparent}.js .column a:before{content:' sort ';line-height:25px;color:#000}.js .column .text{color:#000}.js .column a:nth-of-type(2){display:none}.js .checked .column{background:#7b7105}.pages{left:400px;background:#34567c;color:#fff;font-weight:700;border:0;display:inline-block;position:static}.pages a,.pages a:link,.pages a:link:hover,.pages a:visited,.pages a:visited:hover{color:#fff;font-weight:400}#breadcrumb{margin:0;left:400px;background:0 0;padding:25px 0 0;font-size:14px}#breadcrumb a{color:#aeaeae;text-decoration:underline}#breadcrumb,#breadcrumb a:hover{color:#666}.rtl #breadcrumb{margin:0;padding:25px 0 0;right:400px}.logout,.rtl .logout{top:50px;width:calc(100% - 1054px);max-width:602px;left:1000px}.rtl .logout{right:auto;left:54px}input:not([type]),input[type=color],input[type=email],input[type=number],input[type=password],input[type=search],input[type=tel],input[type=text],input[type=url]{border:1px solid #bbb;padding:6px;margin:0;box-sizing:border-box}table:not(#table) input:not([type]),table:not(#table) input[type=color],table:not(#table) input[type=email],table:not(#table) input[type=number],table:not(#table) input[type=password],table:not(#table) input[type=search],table:not(#table) input[type=tel],table:not(#table) input[type=text],table:not(#table) input[type=url]{min-width:280px}input[type=button],input[type=submit]{padding:0 16px;background:#03a9f4;color:#fff;border:1px solid #03a9f4;line-height:27px;outline:0;box-shadow:none;cursor:pointer;transition:background .2s linear}input[type=button][disabled],input[type=submit][disabled]{background:#aeaeae!important;color:#e9e9e9;cursor:default;border:1px solid #aeaeae}input[type=button]:focus,input[type=button]:hover,input[type=submit]:focus,input[type=submit]:hover{background:#fff;color:#000;text-decoration:none}input[value=Login]{margin-left:372px;margin-top:25px;cursor:pointer}.logout input[type=submit]{background:#e74c3c;border:1px solid #e74c3c;color:#fff;float:right;outline:0}.logout input[type=submit]:hover{background:#fff;color:#000;text-decoration:none;cursor:pointer}select{box-sizing:border-box;margin:0;padding:6px 0;border:1px solid #bbb}label{cursor:pointer;margin-right:6px}.error,.message{margin:0 0 15px}#form>p{margin-bottom:15px}#schema .table{padding:6px}#schema .table a{display:block;margin:-6px -6px 6px;padding:6px;color:#fff;background:#34567c}#schema .table br{display:none}#schema .table span{display:block;margin-bottom:1px solid #f5f5f5}#lang{position:fixed;z-index:10;font-size:0;left:255px;top:23px}#lang select{font-size:12px;padding:0;text-align:right;border:0;background:0 0;-webkit-appearance:none;-moz-appearance:none;appearance:none;cursor:pointer;outline:0}#lang select option{text-align:right}.rtl #lang{margin-right:0;left:100%;margin-left:-261px;right:auto}.jush{color:#000}.jush a{color:#3939f2}.jush-mssql a,.jush-oracle a,.jush-pgsql a,.jush-simpledb a,.jush-sql a,.jush-sql_code a,.jush-sqlite a{font-weight:400}.jush-bac,.jush-bra,.jush-mssql_bra,.jush-php_bac,.jush-sqlite_quo{color:#090}.jush-apo,.jush-php_eot,.jush-php_quo,.jush-quo,.jush-quo_one,.jush-sql_apo,.jush-sql_eot,.jush-sql_quo,.jush-sqlite_apo{color:#ce7b00}.jush-clr,.jush-num{color:#000} 6 | -------------------------------------------------------------------------------- /adminer/themes/arcs-material.css: -------------------------------------------------------------------------------- 1 | /*! 2 | * Material Design for Adminer, version 1.1.4 3 | * https://github.com/arcs-/Adminer-Material-Theme 4 | */@import url(https://fonts.googleapis.com/css?family=Noto+Sans:400,700);body{display:flex;overflow:hidden;height:100vh;background:#FAFAFA;font-family:"Noto Sans",sans-serif;text-rendering:optimizeLegibility !important}*{outline-color:#1E88E5}::selection{background:#4ca0ea;color:#fff}::-moz-selection{background:#4ca0ea;color:#fff}::-webkit-scrollbar{width:9px;height:12px;background-color:#CCC}::-webkit-scrollbar-corner{background-color:#CCC}::-webkit-scrollbar-thumb{background-color:#263238}::-webkit-scrollbar-corner{background-color:#263238;width:8px;height:8px}.scrollable{overflow-x:visible}#lang{position:fixed;top:auto;bottom:0;z-index:3;padding:.8em 1em;width:245px;border-top:1px solid #ccc;background:#fff}#lang select{width:66%}#menu{position:fixed;top:0;z-index:2;display:flex;margin:0;padding:0;height:100%;background:#fff;box-shadow:0 85px 5px 0 rgba(0,0,0,0.14),0 85px 10px 0 rgba(0,0,0,0.12),0 85px 4px -1px rgba(0,0,0,0.2);flex-flow:column}#menu h1{position:fixed;right:54px;border-bottom:none;font-size:12px;background:transparent;padding:4px 0}#menu select{width:86%}#menu #logins{padding:10px 14px 0;height:100%}#menu #logins:before{content:'Saved Logins';display:block;font-size:1.2em;margin:40px 0 10px}#menu #logins a{display:inline-block;margin:4px 0;padding:6px 12px;height:36px;width:86%;border-radius:2px;color:#fff;background:#1E88E5;box-shadow:0 2px 2px 0 rgba(0,0,0,0.14),0 3px 1px -2px rgba(0,0,0,0.2),0 1px 5px 0 rgba(0,0,0,0.12);text-decoration:none;transition:all .2s;border-radius:2px;text-align:center;font-weight:bold;font-size:13px;line-height:30px}#menu #logins a:hover{background:#10538d}#menu.active{background:#1E88E5 !important;color:#fff !important;font-weight:auto}#menu .links a{display:inline-block;margin:4px 2px;padding:5px;width:42%;border-radius:2px;background:#fff;color:#1E88E5;text-align:center;text-transform:uppercase;font-weight:bold;font-size:13px;line-height:24px;transition:all .2s}#menu .links a:hover{background:#1E88E5;color:#fff;text-decoration:none;font-weight:auto}a #h1{color:#AFB3B5}.version{color:#AFB3B5}#tables{overflow-x:hidden !important;margin-bottom:47px;padding:9px 12px 0 6px;flex:1}#tables .select:hover{background:#1E88E5;color:#fff;text-decoration:none;font-weight:auto}#tables a{display:inline-block;overflow:hidden;padding:6px 0 6px 8px;width:175px;border-radius:2px;text-overflow:ellipsis;transition:all .2s;color:#000}#tables a:hover{background:#e4e5e6;color:#000;text-decoration:none}#tables a.select{position:relative;float:right;padding:5px;width:auto;border-radius:2px;background:#fff;color:#1E88E5;text-align:center;text-transform:uppercase;font-weight:bold;font-size:13px;line-height:18px}#content{display:flex;flex-direction:column;overflow-x:auto;margin:83px 0 0 19em;padding:17px 27px 100px;min-width:600px;width:100%}#content h2{position:fixed;top:0;z-index:1;margin-left:-28px;padding-top:0;padding-left:30px;width:100%;height:65px;background:#263238;color:#AFB3B5;line-height:104px}#breadcrumb{position:fixed;z-index:2;padding-top:10px;padding-left:20px;background:#263238;color:#263238}#breadcrumb a{color:#1E88E5;font-size:13px;line-height:18px;transition:all .2s}#breadcrumb a:hover{color:#10538d;text-decoration:none}#logout{position:fixed;top:21px;right:50px;z-index:2;margin:4px 2px;padding:5px;min-width:88px;outline:none;border:none;border-radius:2px;background:#1E88E5;box-shadow:0 1px 4px rgba(48,48,48,0.41),0 2px 3px rgba(0,0,0,0.26);color:#fff;text-align:center;text-transform:uppercase;font-weight:bold;font-size:13px;line-height:24px;transition:all .2s}#logout:hover{background:#10538d}select{margin:0;padding:3px;border:none;border:1px solid rgba(0,0,0,0.12);border-radius:2px;color:#666;background:#fff;cursor:pointer}a,a:link{color:#1E88E5;transition:all .2s}a:hover,a:link:hover{color:#10538d;text-decoration:none}input:not([type]),input[type=number],input[type=password],input[type=search],input[type=text]{padding:8px;border:1px solid rgba(0,0,0,0.12);border-radius:2px;font-size:15px}input[type=search]:first-child{box-shadow:0 2px 2px 0 rgba(0,0,0,0.14),0 3px 1px -2px rgba(0,0,0,0.2),0 1px 5px 0 rgba(0,0,0,0.12)}input[type=submit]{padding:0 16px;min-width:64px;height:36px;border:none;border-radius:2px;background:#1E88E5;box-shadow:0 2px 2px 0 rgba(0,0,0,0.14),0 3px 1px -2px rgba(0,0,0,0.2),0 1px 5px 0 rgba(0,0,0,0.12);color:#fff;text-transform:uppercase;font-size:14px;cursor:pointer;transition:all .2s}input[type=submit]:hover{background:#10538d}input[type=button][disabled],input[type=submit][disabled]{background:#AFB3B5 !important;color:#504c4a;cursor:no-drop}div input[name=delete],div input[name=drop],div input[name=truncate],input[value=Kill]{background:repeating-linear-gradient(-55deg, #1E88E5, #1E88E5 5px, #4ca0ea 5px, #4ca0ea 10px);transition:all .2s}div input[name=delete]:hover,div input[name=drop]:hover,div input[name=truncate]:hover,input[value=Kill]:hover{background:repeating-linear-gradient(-55deg, #10538d, #10538d 5px, #1E88E5 5px, #1E88E5 10px)}input[type=checkbox]{display:inline-block;padding-left:25px;height:20px;outline:0;background-image:url("data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjxzdmcKICAgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIgogICB4bWxuczpjYz0iaHR0cDovL2NyZWF0aXZlY29tbW9ucy5vcmcvbnMjIgogICB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiCiAgIHhtbG5zOnN2Zz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciCiAgIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIKICAgeG1sbnM6c29kaXBvZGk9Imh0dHA6Ly9zb2RpcG9kaS5zb3VyY2Vmb3JnZS5uZXQvRFREL3NvZGlwb2RpLTAuZHRkIgogICB4bWxuczppbmtzY2FwZT0iaHR0cDovL3d3dy5pbmtzY2FwZS5vcmcvbmFtZXNwYWNlcy9pbmtzY2FwZSIKICAgd2lkdGg9IjIwcHQiCiAgIGhlaWdodD0iNDBwdCIKICAgdmlld0JveD0iMCAwIDIwIDQwIgogICB2ZXJzaW9uPSIxLjEiCiAgIGlkPSJzdmcyIgogICBpbmtzY2FwZTp2ZXJzaW9uPSIwLjQ4LjUgcjEwMDQwIgogICBzb2RpcG9kaTpkb2NuYW1lPSJjaGVjay5zdmciPgogIDxtZXRhZGF0YQogICAgIGlkPSJtZXRhZGF0YTE5Ij4KICAgIDxyZGY6UkRGPgogICAgICA8Y2M6V29yawogICAgICAgICByZGY6YWJvdXQ9IiI+CiAgICAgICAgPGRjOmZvcm1hdD5pbWFnZS9zdmcreG1sPC9kYzpmb3JtYXQ+CiAgICAgICAgPGRjOnR5cGUKICAgICAgICAgICByZGY6cmVzb3VyY2U9Imh0dHA6Ly9wdXJsLm9yZy9kYy9kY21pdHlwZS9TdGlsbEltYWdlIiAvPgogICAgICA8L2NjOldvcms+CiAgICA8L3JkZjpSREY+CiAgPC9tZXRhZGF0YT4KICA8ZGVmcwogICAgIGlkPSJkZWZzMTciIC8+CiAgPHNvZGlwb2RpOm5hbWVkdmlldwogICAgIHBhZ2Vjb2xvcj0iI2ZmZmZmZiIKICAgICBib3JkZXJjb2xvcj0iIzY2NjY2NiIKICAgICBib3JkZXJvcGFjaXR5PSIxIgogICAgIG9iamVjdHRvbGVyYW5jZT0iMTAiCiAgICAgZ3JpZHRvbGVyYW5jZT0iMTAiCiAgICAgZ3VpZGV0b2xlcmFuY2U9IjEwIgogICAgIGlua3NjYXBlOnBhZ2VvcGFjaXR5PSIwIgogICAgIGlua3NjYXBlOnBhZ2VzaGFkb3c9IjIiCiAgICAgaW5rc2NhcGU6d2luZG93LXdpZHRoPSIxOTIwIgogICAgIGlua3NjYXBlOndpbmRvdy1oZWlnaHQ9IjEwMTciCiAgICAgaWQ9Im5hbWVkdmlldzE1IgogICAgIHNob3dncmlkPSJmYWxzZSIKICAgICBpbmtzY2FwZTp6b29tPSIxNiIKICAgICBpbmtzY2FwZTpjeD0iNDMuNzAyNjQ2IgogICAgIGlua3NjYXBlOmN5PSIzMS45NTE3ODMiCiAgICAgaW5rc2NhcGU6d2luZG93LXg9IjE5MTIiCiAgICAgaW5rc2NhcGU6d2luZG93LXk9Ii04IgogICAgIGlua3NjYXBlOndpbmRvdy1tYXhpbWl6ZWQ9IjEiCiAgICAgaW5rc2NhcGU6Y3VycmVudC1sYXllcj0ic3ZnMiIgLz4KICA8ZwogICAgIHN0eWxlPSJmaWxsOiMwMDAwMDAiCiAgICAgaWQ9ImczMDY4IgogICAgIHRyYW5zZm9ybT0ic2NhbGUoMC44LDAuOCkiPgogICAgPHBhdGgKICAgICAgIGlkPSJwYXRoMzA1OCIKICAgICAgIGQ9Ik0gMTksNSBWIDE5IEggNSBWIDUgSCAxOSBNIDE5LDMgSCA1IEMgMy45LDMgMywzLjkgMyw1IHYgMTQgYyAwLDEuMSAwLjksMiAyLDIgaCAxNCBjIDEuMSwwIDIsLTAuOSAyLC0yIFYgNSBDIDIxLDMuOSAyMC4xLDMgMTksMyB6IgogICAgICAgaW5rc2NhcGU6Y29ubmVjdG9yLWN1cnZhdHVyZT0iMCIgLz4KICAgIDxwYXRoCiAgICAgICBpZD0icGF0aDMwNjAiCiAgICAgICBkPSJNIDAsMCBIIDI0IFYgMjQgSCAwIHoiCiAgICAgICBpbmtzY2FwZTpjb25uZWN0b3ItY3VydmF0dXJlPSIwIgogICAgICAgc3R5bGU9ImZpbGw6bm9uZSIgLz4KICA8L2c+CiAgPGcKICAgICBzdHlsZT0iZmlsbDojMDAwMDAwIgogICAgIGlkPSJnMzA4NCIKICAgICB0cmFuc2Zvcm09Im1hdHJpeCgwLjgsMCwwLDAuOCwwLDIwKSI+CiAgICA8cGF0aAogICAgICAgaWQ9InBhdGgzMDc0IgogICAgICAgZD0iTSAwLDAgSCAyNCBWIDI0IEggMCB6IgogICAgICAgaW5rc2NhcGU6Y29ubmVjdG9yLWN1cnZhdHVyZT0iMCIKICAgICAgIHN0eWxlPSJmaWxsOm5vbmUiIC8+CiAgICA8cGF0aAogICAgICAgaWQ9InBhdGgzMDc2IgogICAgICAgZD0iTSAxOSwzIEggNSBDIDMuODksMyAzLDMuOSAzLDUgdiAxNCBjIDAsMS4xIDAuODksMiAyLDIgaCAxNCBjIDEuMTEsMCAyLC0wLjkgMiwtMiBWIDUgQyAyMSwzLjkgMjAuMTEsMyAxOSwzIHogTSAxMCwxNyA1LDEyIDYuNDEsMTAuNTkgMTAsMTQuMTcgMTcuNTksNi41OCAxOSw4IDEwLDE3IHoiCiAgICAgICBpbmtzY2FwZTpjb25uZWN0b3ItY3VydmF0dXJlPSIwIiAvPgogIDwvZz4KPC9zdmc+Cg==");background-position:0 0;background-size:20px;background-repeat:no-repeat;vertical-align:middle;font-size:20px;line-height:20px;cursor:pointer;-webkit-appearance:none;-webkit-user-select:none;user-select:none}input[type=checkbox]:checked{background-position:0 -20px}input[type=radio]{display:inline-block;padding-left:25px;height:20px;outline:0;background-image:url("data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjxzdmcKICAgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIgogICB4bWxuczpjYz0iaHR0cDovL2NyZWF0aXZlY29tbW9ucy5vcmcvbnMjIgogICB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiCiAgIHhtbG5zOnN2Zz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciCiAgIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIKICAgeG1sbnM6c29kaXBvZGk9Imh0dHA6Ly9zb2RpcG9kaS5zb3VyY2Vmb3JnZS5uZXQvRFREL3NvZGlwb2RpLTAuZHRkIgogICB4bWxuczppbmtzY2FwZT0iaHR0cDovL3d3dy5pbmtzY2FwZS5vcmcvbmFtZXNwYWNlcy9pbmtzY2FwZSIKICAgd2lkdGg9IjIwcHQiCiAgIGhlaWdodD0iNDBwdCIKICAgdmlld0JveD0iMCAwIDIwIDQwIgogICB2ZXJzaW9uPSIxLjEiCiAgIGlkPSJzdmcyIgogICBpbmtzY2FwZTp2ZXJzaW9uPSIwLjQ4LjUgcjEwMDQwIgogICBzb2RpcG9kaTpkb2NuYW1lPSJjaGVjay5zdmciPgogIDxtZXRhZGF0YQogICAgIGlkPSJtZXRhZGF0YTE5Ij4KICAgIDxyZGY6UkRGPgogICAgICA8Y2M6V29yawogICAgICAgICByZGY6YWJvdXQ9IiI+CiAgICAgICAgPGRjOmZvcm1hdD5pbWFnZS9zdmcreG1sPC9kYzpmb3JtYXQ+CiAgICAgICAgPGRjOnR5cGUKICAgICAgICAgICByZGY6cmVzb3VyY2U9Imh0dHA6Ly9wdXJsLm9yZy9kYy9kY21pdHlwZS9TdGlsbEltYWdlIiAvPgogICAgICAgIDxkYzp0aXRsZT48L2RjOnRpdGxlPgogICAgICA8L2NjOldvcms+CiAgICA8L3JkZjpSREY+CiAgPC9tZXRhZGF0YT4KICA8ZGVmcwogICAgIGlkPSJkZWZzMTciIC8+CiAgPHNvZGlwb2RpOm5hbWVkdmlldwogICAgIHBhZ2Vjb2xvcj0iI2ZmZmZmZiIKICAgICBib3JkZXJjb2xvcj0iIzY2NjY2NiIKICAgICBib3JkZXJvcGFjaXR5PSIxIgogICAgIG9iamVjdHRvbGVyYW5jZT0iMTAiCiAgICAgZ3JpZHRvbGVyYW5jZT0iMTAiCiAgICAgZ3VpZGV0b2xlcmFuY2U9IjEwIgogICAgIGlua3NjYXBlOnBhZ2VvcGFjaXR5PSIwIgogICAgIGlua3NjYXBlOnBhZ2VzaGFkb3c9IjIiCiAgICAgaW5rc2NhcGU6d2luZG93LXdpZHRoPSIxOTIwIgogICAgIGlua3NjYXBlOndpbmRvdy1oZWlnaHQ9IjEwMTciCiAgICAgaWQ9Im5hbWVkdmlldzE1IgogICAgIHNob3dncmlkPSJmYWxzZSIKICAgICBpbmtzY2FwZTp6b29tPSIyMi42Mjc0MTciCiAgICAgaW5rc2NhcGU6Y3g9IjguNzkxODMzNyIKICAgICBpbmtzY2FwZTpjeT0iMTEuODUxMjkzIgogICAgIGlua3NjYXBlOndpbmRvdy14PSItOCIKICAgICBpbmtzY2FwZTp3aW5kb3cteT0iLTgiCiAgICAgaW5rc2NhcGU6d2luZG93LW1heGltaXplZD0iMSIKICAgICBpbmtzY2FwZTpjdXJyZW50LWxheWVyPSJzdmcyIiAvPgogIDxnCiAgICAgaWQ9ImczMDE1IgogICAgIHRyYW5zZm9ybT0ic2NhbGUoMC44LDAuOCkiPgogICAgPHBhdGgKICAgICAgIGlkPSJwYXRoMzAwNSIKICAgICAgIGQ9Ik0gMTIsMiBDIDYuNDgsMiAyLDYuNDggMiwxMiAyLDE3LjUyIDYuNDgsMjIgMTIsMjIgMTcuNTIsMjIgMjIsMTcuNTIgMjIsMTIgMjIsNi40OCAxNy41MiwyIDEyLDIgeiBtIDAsMTggQyA3LjU4LDIwIDQsMTYuNDIgNCwxMiA0LDcuNTggNy41OCw0IDEyLDQgYyA0LjQyLDAgOCwzLjU4IDgsOCAwLDQuNDIgLTMuNTgsOCAtOCw4IHoiCiAgICAgICBpbmtzY2FwZTpjb25uZWN0b3ItY3VydmF0dXJlPSIwIiAvPgogICAgPHBhdGgKICAgICAgIGlkPSJwYXRoMzAwNyIKICAgICAgIGQ9Ik0gMCwwIEggMjQgViAyNCBIIDAgeiIKICAgICAgIGlua3NjYXBlOmNvbm5lY3Rvci1jdXJ2YXR1cmU9IjAiCiAgICAgICBzdHlsZT0iZmlsbDpub25lIiAvPgogIDwvZz4KICA8ZwogICAgIGlkPSJnMzA0MiIKICAgICB0cmFuc2Zvcm09Im1hdHJpeCgwLjgsMCwwLDAuOCwwLDIwLjgpIj4KICAgIDxwYXRoCiAgICAgICBpZD0icGF0aDMwMzIiCiAgICAgICBkPSJtIDEyLDcgYyAtMi43NiwwIC01LDIuMjQgLTUsNSAwLDIuNzYgMi4yNCw1IDUsNSAyLjc2LDAgNSwtMi4yNCA1LC01IEMgMTcsOS4yNCAxNC43Niw3IDEyLDcgeiBNIDEyLDIgQyA2LjQ4LDIgMiw2LjQ4IDIsMTIgMiwxNy41MiA2LjQ4LDIyIDEyLDIyIDE3LjUyLDIyIDIyLDE3LjUyIDIyLDEyIDIyLDYuNDggMTcuNTIsMiAxMiwyIHogbSAwLDE4IEMgNy41OCwyMCA0LDE2LjQyIDQsMTIgNCw3LjU4IDcuNTgsNCAxMiw0IGMgNC40MiwwIDgsMy41OCA4LDggMCw0LjQyIC0zLjU4LDggLTgsOCB6IgogICAgICAgaW5rc2NhcGU6Y29ubmVjdG9yLWN1cnZhdHVyZT0iMCIgLz4KICAgIDxwYXRoCiAgICAgICBpZD0icGF0aDMwMzQiCiAgICAgICBkPSJNIDAsMCBIIDI0IFYgMjQgSCAwIHoiCiAgICAgICBpbmtzY2FwZTpjb25uZWN0b3ItY3VydmF0dXJlPSIwIgogICAgICAgc3R5bGU9ImZpbGw6bm9uZSIgLz4KICA8L2c+Cjwvc3ZnPg==");background-position:0 0;background-size:20px;background-repeat:no-repeat;vertical-align:middle;font-size:20px;line-height:20px;cursor:pointer;-webkit-appearance:none;-webkit-user-select:none;user-select:none}input[type=radio]:checked{background-position:0 -21px}input[type=number]{padding:8px}#help{display:none}.sqlarea.jush-sql.jush{border:1px solid rgba(0,0,0,0.12) !important;background:#fff;box-shadow:0 2px 2px 0 rgba(0,0,0,0.14),0 3px 1px -2px rgba(0,0,0,0.2),0 1px 5px 0 rgba(0,0,0,0.12)}.js .column{left:-50px;margin:-6px 0 0;padding:5px 0 7px 3px;border:1px solid rgba(0,0,0,0.12);border-radius:3px;background:#fff;box-shadow:0 2px 2px 0 rgba(0,0,0,0.14),0 3px 1px -2px rgba(0,0,0,0.2),0 1px 5px 0 rgba(0,0,0,0.12)}.js .column a{padding:1px 8px 3px 5px;margin-right:3px;border-radius:2px;color:#1E88E5;transition:all .2s}.js .column a:hover{color:#fff;background:#1E88E5}table{margin-top:20px;min-width:800px;border-collapse:collapse;box-shadow:0 1px 4px rgba(88,88,88,0.01),0 2px 3px rgba(88,88,88,0.26);white-space:nowrap;font-size:13px;order:4}form table{width:100%}thead td,thead th{background:#ececec;position:sticky;top:0;z-index:2}thead td:before,thead th:before{content:'';position:absolute;background:#fafafa;top:-20px;left:-10px;width:120%;height:20px}thead td:after,thead th:after{content:'';position:absolute;left:0;bottom:0;width:100%;border-bottom:1px solid #cecece}thead th{padding:0 18px;text-align:left}th{box-sizing:border-box;padding:5px 18px !important;width:20%;border:1px solid #ececec;background:#fff;font-weight:normal;font-size:14px}td{box-sizing:border-box;padding:2px 10px 0;height:45px;border:1px solid #ececec;background:#fff;color:#000}.odd td,.odd th{background:#fafafa}td a,td a:visited,th a,th a:visited{color:#1E88E5;font-weight:700}.js .checkable .checked td,.js .checkable .checked th{background:#e0e0e0}#noindex,sup{display:none}.pages{position:absolute;padding:10px 20px 0;height:35px;border:1px solid rgba(0,0,0,0.12);background-color:#fff;box-shadow:0 2px 2px 0 rgba(0,0,0,0.14),0 3px 1px -2px rgba(0,0,0,0.2),0 1px 5px 0 rgba(0,0,0,0.12);font-size:15px}.pages a:not(:first-child){margin-top:5px;padding:5px;border:1px solid #1E88E5;border-radius:2px;color:#263238;text-align:center}.pages a:not(:first-child):hover{background:#1E88E5;color:#fff;text-decoration:none}.icon{width:24px;height:24px;border-radius:2px;background:#000;opacity:.8;-webkit-filter:contrast(125%) invert(1);filter:contrast(125%) invert(1);transition:all .2s}.icon:hover{background:#e1771a}.footer{background:none;border:none;border-color:transparent;position:relative}.footer>div{background:transparent}#content form{display:table;order:1}#content table:nth-of-type(1){order:1;margin:38px 0}#content .links,#content h3,#content h3+.error{margin:15px 0 0;order:4}#content .links:nth-of-type(2){margin-top:30px;order:1}#content .links a{display:inline-block;margin:4px;padding:6px 12px;min-width:88px;border-radius:2px;background:#fff;box-shadow:0 1px 4px rgba(88,88,88,0.41),0 2px 3px rgba(88,88,88,0.26);color:#1E88E5;text-align:center;text-transform:uppercase;font-weight:bold;font-size:13px;line-height:24px;transition:all .2s}#content .links a:hover{background:#1E88E5;color:#fff;text-decoration:none}#content .links .active{background:#1E88E5;color:#fff;cursor:default}#content form>fieldset:first-child{background-color:transparent;border:none;box-shadow:none;float:right;margin:0;padding:0;margin-bottom:4px;margin-top:-40px}#content form>fieldset:first-child legend{display:none}#content #form fieldset:nth-of-type(1){margin-bottom:10px;margin-top:0;padding-bottom:11px;min-height:57px;border:1px solid rgba(0,0,0,0.12);background-color:#fff;box-shadow:0 2px 2px 0 rgba(0,0,0,0.14),0 3px 1px -2px rgba(0,0,0,0.2),0 1px 5px 0 rgba(0,0,0,0.12);padding:.5em .8em;margin:.8em .5em 0 0;float:initial}#content #form fieldset:nth-of-type(1) legend{display:block}#content fieldset:nth-of-type(2).jsonly{float:right;margin-top:-30px;margin-right:8px;border:none}#content fieldset:nth-of-type(2).jsonly legend{display:none}#content fieldset:first-child #fieldset-import,#content fieldset:nth-of-type(1),#content fieldset:nth-of-type(2):not(.jsonly),#content fieldset:nth-of-type(3),#content fieldset:nth-of-type(4),#content fieldset:nth-of-type(5){margin-bottom:10px;padding-bottom:11px;min-height:57px;border:1px solid rgba(0,0,0,0.12);background-color:#fff;box-shadow:0 2px 2px 0 rgba(0,0,0,0.14),0 3px 1px -2px rgba(0,0,0,0.2),0 1px 5px 0 rgba(0,0,0,0.12)}#content fieldset:nth-of-type(6){border:none}#content fieldset:nth-of-type(6) legend{visibility:hidden}#content legend a{padding:5px;color:#1E88E5;font-weight:bold;font-size:13px;line-height:18px;transition:all .2s}#content legend a:hover{color:#10538d;text-decoration:none}#content fieldset:first-child #fieldset-import{margin-top:36px;padding:13px 10px 0 9px;margin-left:-12px}#content fieldset:first-child #fieldset-import:before{content:'Import';position:absolute;top:8px;left:20px;background:#fff;padding:0 7px}#content input[name=copy],#content input[name=move]{float:right;margin-right:-20px;margin-left:25px}#content input[name=copy],#content input[name=move]{float:right;margin-right:-20px;margin-left:25px}#content select{margin-bottom:2px;padding:8px} 5 | -------------------------------------------------------------------------------- /adminer/themes/brade.css: -------------------------------------------------------------------------------- 1 | /* CSS by Brade - www.bradezone.com */ 2 | *{margin:0;padding:0} 3 | body{font:13px/18px Helvetica,Arial,sans-serif;background:#fff;color:#333} 4 | /* generic */ 5 | a,a:visited{color:#06c;text-decoration:none;border-bottom:1px dotted} 6 | a:hover{border-bottom:1px solid #06c;background:#06c;color:#fff} 7 | p{padding-bottom:4px;margin-bottom:4px} 8 | h1{font-size:18px;font-weight:bold;padding-bottom:0px;height:40px;padding:0 0 8px 0;color:#666;border:0} 9 | h2{font:32px Georgia,serif;padding:10px 0 8px;margin:0;background:transparent;border:0;color:#333} 10 | h3{font-size:18px;font-weight:bold;padding:4px 0;margin:0} 11 | form#form{overflow:hidden} 12 | fieldset{float:left;min-height:48px;padding:0 4px 4px 4px;border:1px solid #ccc;margin-bottom:8px;margin-right:4px} 13 | fieldset div{margin-top:4px} 14 | input,select,textarea{font:13px Helvetica,Arial,sans-serif;color:#555;border:1px solid #999;padding:3px} 15 | input[type=submit]{background:#ccc;padding:2px;cursor:pointer;color:#333} 16 | input[type=submit]:hover{background:#bbb} 17 | input[type=image],input[type=checkbox]{border:0;padding:0} 18 | label input[type=checkbox],td input[type=radio],td span select{margin-right:4px} 19 | select{border:1px solid #999;padding:2px} 20 | fieldset select{margin-right:4px} 21 | option{padding:0 5px} 22 | optgroup{font-size:11px} 23 | code{background:#eee;padding:2px 4px;font:16px/20px Courier,monospace} 24 | code a:hover{background:transparent} 25 | table{margin:4px 0 8px;border:1px solid #ccc;font-size:inherit} 26 | tbody tr:hover td,tbody tr:hover th{background:#eee} 27 | thead tr:hover td,thead tr:hover th{background:#ddd} 28 | th,td{text-align:left;padding:2px 4px;vertical-align:top;font-weight:normal;border:1px dotted #ccc;border-width:0 0 0 1px; 29 | margin:0;background:inherit} 30 | thead th,thead td{white-space:nowrap;font-weight:bold;background:#ddd;border-color:#ddd} 31 | th:first-child,td:first-child{border-color:transparent;white-space:nowrap} 32 | td[align=right]{text-align:right} 33 | table code{font-size:13px;line-height:18px} 34 | .hidden{display:none} 35 | .error,.message{padding:0;background:transparent;font-weight:bold} 36 | .error{color:#c00} 37 | .message{color:#090} 38 | /* specific */ 39 | #content{margin:0 0 0 320px;padding:50px 20px 40px 0;height:100%} 40 | #content:after{content:'.';clear:both;height:0;overflow:hidden;display:block} 41 | #lang{background:#333;color:#fff;position:fixed;top:0;left:0;width:100%;padding:0 20px 0 40px;line-height:40px;height:40px} 42 | #lang select{border-color:#333} 43 | #menu{background:#eee;position:fixed;top:60px;bottom:20px;overflow:auto;left:20px;width:240px;padding:10px 15px; 44 | border:5px solid #ccc;margin:0} 45 | #menu a{color:#333;margin-right:4px} 46 | #menu a:hover{background:#333;color:#fff;border-color:#333} 47 | #menu a.h1,#menu a.h1:hover{display:block;height:0;width:175px;padding:40px 0 0 0;overflow:hidden;float:left;border:0;margin:0; 48 | outline:0;background:url(//www.bradezone.com/random/adminer_logo.gif) no-repeat;line-height:32px} 49 | #menu p,#logins,#tables{white-space:nowrap;border:0;padding:0 0 4px 0;margin:0 0 4px 0} 50 | #breadcrumb{background:#333;color:#fff;position:fixed;top:0;left:320px;line-height:40px;padding:0;z-index:1;margin:0} 51 | #breadcrumb a{color:#ff9} 52 | #breadcrumb a:hover{background:transparent;color:#ff9;border-color:#ff9} 53 | #schema .table{padding:4px 8px;background:#f3f3f3} 54 | /* IE hacks */ 55 | *+html th:first-child,*+html td:first-child{border-color:inherit;white-space:inherit} 56 | * html #lang,* html #menu,* html #breadcrumb{position:absolute} 57 | * html #lang{padding-top:10px;height:30px} 58 | * html form#form{height:100%} 59 | #logins a,#tables a{background: none} 60 | #logout{color:#333;text-decoration:none;border-bottom:1px dotted} 61 | #logout:hover{border-color:#333;background:#333;color:#fff} 62 | .js .column{background:#ddd} 63 | -------------------------------------------------------------------------------- /adminer/themes/bueltge.css: -------------------------------------------------------------------------------- 1 | /** 2 | * Alternative style for Adminer by Frank Bültge 3 | * 4 | * @link http://bueltge.de/ 5 | * @version 02/18/2014 6 | */ 7 | 8 | body { 9 | margin: 0; 10 | font-size: 12px; 11 | line-height: 1.4em; 12 | background: #F9F9F9; 13 | color: #333; 14 | } 15 | body, select, option, optgroup, button { 16 | font-family: "Lucida Grande",Verdana,Arial,"Bitstream Vera Sans",sans-serif; 17 | } /* IE6 */ 18 | input[type='submit'], input[type='reset'], input[type='button'], input[type='file'] { 19 | font-family: "Lucida Grande",Verdana,Arial,"Bitstream Vera Sans",sans-serif; 20 | } 21 | input, textarea, pre, code, samp, kbd, var { 22 | font-family: "Lucida Grande",Verdana,Arial,"Bitstream Vera Sans",sans-serif; 23 | font-size: 12px; 24 | } 25 | 26 | pre { 27 | white-space: pre-wrap; 28 | } 29 | 30 | p { 31 | margin: 0.8em 20px 0 5px 32 | } 33 | 34 | a { 35 | color: #21759B; 36 | background: none !important; 37 | } 38 | a:visited { 39 | color: #21759B; 40 | } 41 | a:hover, a:hover { 42 | text-decoration: none; 43 | color: #d54e21; 44 | } 45 | a:focus { 46 | background: #c7e7fd; 47 | color: #124964; 48 | } 49 | a:active { 50 | background: none; 51 | outline: thin dotted; 52 | } 53 | 54 | a.active, a.active + a { 55 | text-decoration: none; 56 | font-weight: 700; 57 | } 58 | 59 | form { 60 | margin: 0; 61 | padding: 0 0 0 5px; 62 | } 63 | table { 64 | width: 100%; 65 | clear: both; 66 | margin: 0; 67 | border-spacing: 0; 68 | border-collapse: separate; 69 | border-color: gray; 70 | } 71 | table, thead, tbody { 72 | margin: 10px 12px 0 0; 73 | border: 1px #BBB solid; 74 | font-size: 90%; 75 | } 76 | thead th, thead td { 77 | text-align: center; 78 | } 79 | td { 80 | white-space: normal; 81 | overflow: hidden; 82 | padding: 0 4px; 83 | } 84 | th { 85 | text-align: left; 86 | font-weight: 400; 87 | } 88 | td, th { 89 | background-color: #fff; 90 | padding: 1px 2px; 91 | border: 1px #DfDfDf solid; 92 | border-width: 1px 0 0 1px; 93 | } 94 | tr:first-child td, tr:first-child th { 95 | border-top-width: 0; 96 | } 97 | td:first-child, th:first-child { 98 | border-left-width: 0; 99 | } 100 | thead { 101 | display: table-header-group; 102 | vertical-align: middle; 103 | border-color: inherit; 104 | } 105 | thead td, thead th { 106 | background-color: #DFDFDF; 107 | border: none; 108 | border-bottom: 1px #BBB solid; 109 | } 110 | thead tr:hover td, thead tr:hover th { 111 | background-color: #DDD !important; 112 | } 113 | tr:nth-child(2n) td, tr:nth-child(2n) th, .odd td, .odd th, tr.odd { 114 | background-color: #F1F1F1; 115 | } 116 | tr:hover td, tr:hover th { 117 | background-color: #BCD; 118 | } 119 | 120 | 121 | fieldset { 122 | display: inline; 123 | vertical-align: top; 124 | padding: 2px 12px; 125 | margin: 25px 12px 12px 0; 126 | border: none; 127 | background-color: #F1F1F1; 128 | border: 1px solid #E3E3E3; 129 | position: relative; 130 | padding-top: 14px; 131 | } 132 | fieldset, x:-moz-any-link { 133 | padding-top: 4px; 134 | } 135 | fieldset { 136 | padding-top: 14px; 137 | } 138 | legend { 139 | font-weight: 900; 140 | color: #000; 141 | top: -1.666em; 142 | left: -1em; 143 | padding: 0 4px; 144 | } 145 | input { 146 | padding: 2px 5px 1px 5px; 147 | } 148 | input[name='limit'], input[name='length'] { 149 | width: 3em; 150 | text-align: right; 151 | } 152 | input[name='text_length'] { 153 | width: 5em; 154 | } 155 | select + input, select + select { 156 | margin-left: 2px; 157 | } 158 | textarea, input, select { 159 | border-width: 1px; 160 | border-style: solid; 161 | -moz-border-radius: 3px; 162 | -khtml-border-radius: 3px; 163 | -webkit-border-radius: 3px; 164 | border-radius: 3px; 165 | border-color: #DFDFDF; 166 | } 167 | select { 168 | margin: 0 0 1px 0; 169 | } 170 | input[type="checkbox"], input[type="radio"], input[type="image"] { 171 | border: 0 none; 172 | } 173 | input[type=button], input[type=submit] { 174 | display: inline-block; 175 | text-decoration: none; 176 | font-size: 12px; 177 | line-height: 15px; 178 | padding: 1px 0 0 0; 179 | cursor: pointer; 180 | border-width: 1px; 181 | border-style: solid; 182 | -webkit-border-radius: 3px; 183 | border-radius: 3px; 184 | -webkit-box-sizing: content-box; 185 | -moz-box-sizing: content-box; 186 | box-sizing: content-box; 187 | white-space: nowrap; 188 | border-color: #dfdfdf; 189 | background-color: #fff; 190 | color: #333; 191 | } 192 | input[type="button"]:focus, input[type=submit] { 193 | border-color: #a1a1a1; 194 | -webkit-box-shadow: 1px 1px 2px rgba(0,0,0,0.1); 195 | box-shadow: 1px 1px 2px rgba(0,0,0,0.1); 196 | } 197 | input[type=button], input[type=submit] { 198 | padding: 2px 5px 1px 5px; 199 | background: #ececec; 200 | background-image: -webkit-gradient(linear, left top, left bottom, from(#fff), to(#eee)); 201 | background-image: -webkit-linear-gradient(top, #fff, #eee); 202 | background-image: -moz-linear-gradient(top, #fff, #eee); 203 | background-image: -o-linear-gradient(top, #fff, #eee); 204 | background-image: linear-gradient(to bottom, #fff, #eee); 205 | border-color: #ccc; 206 | -webkit-box-shadow: inset 0 0 1px 1px rgba(255,255,255, 0.9); 207 | box-shadow: inset 0 0 1px 1px rgba(255,255,255, 0.9); 208 | color: #464646; 209 | text-shadow: 1px 1px 0 #fff; 210 | } 211 | input[type=button]:hover, input[type=submit]:hover, 212 | input[type=button]:focus, input[type=submit]:focus { 213 | background: #ececec; 214 | background-image: -webkit-gradient(linear, left top, left bottom, from(#fff), to(#eee)); 215 | background-image: -webkit-linear-gradient(top, #fff, #eee); 216 | background-image: -moz-linear-gradient(top, #fff, #eee); 217 | background-image: -o-linear-gradient(top, #fff, #eee); 218 | background-image: linear-gradient(to bottom, #fff, #eee); 219 | border-color: #bbb; 220 | -webkit-box-shadow: 0px 1px 1px rgba(0,0,0,.1); 221 | box-shadow: 0px 1px 1px rgba(0,0,0,.1); 222 | color: #000; 223 | } 224 | input[type=button]:active, input[type=submit]:active { 225 | background: #eee; 226 | background-image: -webkit-gradient(linear, left top, left bottom, from(#eee), to(#f9f9f9)); 227 | background-image: -webkit-linear-gradient(top, #eee, #f9f9f9); 228 | background-image: -moz-linear-gradient(top, #eee, #f9f9f9); 229 | background-image: -o-linear-gradient(top, #eee, #f9f9f9); 230 | background-image: linear-gradient(to bottom, #eee, #f9f9f9); 231 | border-color: #999 #ddd #ddd #999; 232 | color: #555; 233 | -webkit-box-shadow: inset 1px 1px 0 rgba(50,50,50,0.1); 234 | box-shadow: inset 1px 1px 0 rgba(50,50,50,0.1); 235 | } 236 | input[type=button]:focus, input[type=submit]:focus { 237 | border-color: #aaa; 238 | } 239 | input + label input, select + label input { 240 | margin-left: 4px; 241 | } 242 | td input[type='checkbox']:first-child, td input[type='radio']:first-child { 243 | margin-left: 2px; 244 | } 245 | label:hover { 246 | text-decoration: underline; 247 | } 248 | fieldset div { 249 | margin-bottom: 2px; 250 | } 251 | input[name='Comment'] { /* !!! */ 252 | width: 24em; 253 | } 254 | input[name='Auto_increment'] { /* !!! */ 255 | width: 6em; 256 | } 257 | 258 | img { 259 | vertical-align: middle; 260 | margin: 0; 261 | padding: 0; 262 | } 263 | .js .column { 264 | position: relative; 265 | background: none; 266 | padding: 0; 267 | } 268 | .error { 269 | padding: 8px; 270 | color: red; 271 | background-color: #FEE; 272 | } 273 | .message { 274 | padding: 8px; 275 | background-color: #DDD; 276 | } 277 | .char { 278 | color: #070; 279 | } 280 | .date { 281 | color: #707; 282 | } 283 | .enum { 284 | color: #077; 285 | } 286 | .binary { 287 | color: red; 288 | } 289 | .jush-sql { 290 | padding: 2px 4px; 291 | margin-right: 4px; 292 | font-size: 11px; 293 | } 294 | .time { 295 | color: #333; 296 | } 297 | 298 | #content { 299 | margin: 2px 0 0 270px; 300 | padding: 10px 20px 20px 0; 301 | } 302 | #lang { 303 | font-size:10px; 304 | height: 23px; 305 | width: 255px; 306 | display: block; 307 | padding: 1px 0; 308 | position: absolute; 309 | top: 0; 310 | left: 0; 311 | text-align: center; 312 | background-color: #f1f1f1; 313 | border: 1px solid #E3E3E3; 314 | line-height: 1.25em; 315 | } 316 | #lang select { 317 | font-size: 10px; 318 | } 319 | #breadcrumb { 320 | margin: 0; 321 | height: 21px; 322 | display: block; 323 | position: absolute; 324 | top: 0; 325 | left: 270px; 326 | background-color: #f1f1f1; 327 | border: 1px solid #E3E3E3; 328 | padding: 2px 12px; 329 | line-height: 1.25em } 330 | #menu { 331 | position: absolute; 332 | margin: 0; 333 | top: 28px; 334 | left: 0; 335 | width: 255px; 336 | background-color: #f1f1f1; 337 | border: 1px solid #E3E3E3; 338 | } 339 | #menu form { 340 | margin: 0; 341 | } 342 | #menu p, #logins, #tables { 343 | padding-left: 8px; 344 | border-bottom: none; 345 | } 346 | #dbs { 347 | padding: 0 !important; 348 | } 349 | #menu form p { 350 | padding-left: 0; 351 | text-align: left; 352 | } 353 | h1 .h1:hover { 354 | text-decoration: underline; 355 | } 356 | h1, h2 { 357 | font: italic normal normal 24px/29px Georgia, "Times New Roman", "Bitstream Charter", Times, serif; 358 | margin: 0; 359 | padding: 14px 15px 3px 10px; 360 | line-height: 35px; 361 | text-shadow: rgba(255,255,255,1) 0 1px 0px; 362 | background: none; 363 | } 364 | h1 .h1 { 365 | font-size: 12px; 366 | } 367 | h2 { 368 | padding: 22px 0 0 10px; 369 | } 370 | h3 { 371 | font: normal normal normal 18px/22px Georgia, "Times New Roman", "Bitstream Charter", Times, serif; 372 | margin: 20px 0 0 5px; 373 | } 374 | #schema { 375 | margin: 1.5em 0 0 220px; 376 | position: relative; 377 | } 378 | #schema .table { 379 | border: 1px solid #E3E3E3; 380 | background-color: #F1F1F1; 381 | padding: 0 2px; 382 | cursor: move; 383 | position: absolute; 384 | } 385 | #schema .references { 386 | position: absolute; 387 | } 388 | .js .hidden { 389 | display: hidden; 390 | } 391 | .js td.hidden, .js input.hidden { 392 | display: none; 393 | } 394 | legend a { 395 | color: #333; 396 | text-decoration: none; 397 | cursor: default; 398 | } 399 | legend a:hover { 400 | color: #333; 401 | } 402 | code { 403 | background: transparent; 404 | } 405 | fieldset, legend, table, thead, tbody, .error, .message { 406 | -moz-border-radius: 3px; 407 | -khtml-border-radius: 3px; 408 | -webkit-border-radius: 3px; 409 | border-radius: 3px; 410 | } 411 | #breadcrumb, #lang, #menu { 412 | -moz-border-radius-bottomright: 3px; 413 | -khtml-border-bottom-right-radius: 3px; 414 | -webkit-border-bottom-right-radius: 3px; 415 | border-bottom-right-radius: 3px; 416 | } 417 | #breadcrumb { 418 | -moz-border-radius-bottomleft: 3px; 419 | -khtml-border-bottom-left-radius: 3px; 420 | -webkit-border-bottom-left-radius: 3px; 421 | border-bottom-left-radius: 3px; 422 | } 423 | #menu { 424 | -moz-border-radius-topright: 5px; 425 | -khtml-border-top-right-radius: 3px; 426 | -webkit-border-top-right-radius: 3px; 427 | border-top-right-radius: 3px; 428 | } -------------------------------------------------------------------------------- /adminer/themes/esterka.css: -------------------------------------------------------------------------------- 1 | * { 2 | font: 11px/1.25 Verdana, 'Geneva CE', lucida, sans-serif; 3 | color:#333333; 4 | margin:0px; 5 | padding:0px; 6 | } 7 | 8 | a,a:visited { 9 | color:#0033ff; 10 | text-decoration:none; 11 | padding:3px 1px; 12 | } 13 | 14 | #content table thead span, #content table thead a { 15 | font-weight:bold; 16 | color:black; 17 | } 18 | 19 | #content table thead a:hover { 20 | background:none; 21 | text-decoration:underline; 22 | color:black; 23 | } 24 | 25 | a:hover { 26 | color:white; 27 | background:#0033ff; 28 | } 29 | 30 | h1 { 31 | font-size:1.5em; 32 | line-height: 2em; 33 | font-weight:bold; 34 | background:white; 35 | color:#1e5eb6; 36 | border-bottom:1px solid #f4f4f4; 37 | 38 | padding:20px; 39 | margin:0px; 40 | } 41 | 42 | #menu h1 { 43 | padding:0px 0px 5px 20px; 44 | background:none; 45 | } 46 | 47 | h2,h3 { 48 | font-size:1.5em; 49 | font-weight:normal; 50 | background:white; 51 | color:#A0522D; 52 | border-bottom:1px solid #f4f4f4; 53 | padding:5px 0px; 54 | margin:0px; 55 | } 56 | 57 | fieldset { 58 | padding:5px; 59 | border:1px solid #d0cdc4; 60 | background:#fcfaf5; 61 | } 62 | 63 | input,select,textarea { 64 | border:1px solid #e5e5e5; 65 | margin:1px; 66 | padding:3px; 67 | } 68 | 69 | input[type=submit] { 70 | color:white; 71 | background:#A0522D; 72 | padding:3px 10px; 73 | cursor:pointer; 74 | border:0px solid; 75 | } 76 | 77 | input[type=submit]:hover{ 78 | background:blue; 79 | } 80 | 81 | input[type=checkbox]{ 82 | margin-right:5px; 83 | } 84 | 85 | input[type=image] { 86 | border:1px solid #d0cdc4; 87 | } 88 | 89 | input[type=checkbox],input[type=radio]{ 90 | border:1px solid #e5e5e5; 91 | padding:2px 5px; 92 | } 93 | 94 | code{ 95 | background:#f0ffe1; 96 | border:1px dashed #d5f1b9; 97 | padding:2px 4px; 98 | font-family:"Courier New"; 99 | } 100 | code a:hover{background:transparent} 101 | 102 | table{ 103 | margin:10px 0px; 104 | border:1px solid #d0cdc4; 105 | border-collapse:collapse; 106 | } 107 | 108 | tbody tr:hover td,tbody tr:hover th{ 109 | background:#edf4ff 110 | } 111 | 112 | thead th, thead td { 113 | text-align:center; 114 | vertical-align:middle; 115 | font-weight:bold; 116 | white-space:nowrap; 117 | background:#f2eee1; 118 | color:#808080; 119 | } 120 | 121 | th,td{ 122 | border:1px solid #d0cdc4; 123 | padding:1px 4px; 124 | vertical-align:middle; 125 | } 126 | 127 | th a { 128 | font-weight:bold; 129 | padding-bottom:0px; 130 | } 131 | 132 | th { 133 | background:white; 134 | } 135 | 136 | tr.odd td { 137 | background:#fcfaf5; 138 | } 139 | 140 | #content tbody tr.checked td, tr.checked.odd td { 141 | background:#fbe2e2; 142 | color:red; 143 | } 144 | 145 | .hidden{ 146 | display:none 147 | } 148 | 149 | .error,.message{ 150 | padding:0px; 151 | background:transparent; 152 | font-weight:bold 153 | } 154 | 155 | .error{ 156 | color:#c00 157 | } 158 | 159 | .message{ 160 | color:#090 161 | } 162 | 163 | #content{ 164 | margin:0px 0px 0px 255px; 165 | padding:50px 20px 40px 0px; 166 | height:100%; 167 | } 168 | 169 | #lang { 170 | background:#f2eee1; 171 | color:#808080; 172 | position:fixed; 173 | top:0px; 174 | left:0px; 175 | width:100%; 176 | padding:10px 20px; 177 | z-index:1; 178 | } 179 | 180 | #breadcrumb { 181 | position:fixed; 182 | top:0px; 183 | left:260px; 184 | background:#f2eee1; 185 | z-index:2; 186 | width:100%; 187 | padding:10px; 188 | } 189 | 190 | #menu { 191 | background:#fcfaf5; 192 | position:fixed; 193 | top:-10px; 194 | padding:0px; 195 | padding-top:10px; 196 | bottom:0px; 197 | overflow:auto; 198 | left:0px; 199 | width:240px; 200 | border-right:5px solid #f2eee1; 201 | } 202 | 203 | #schema .table { 204 | padding:5px; 205 | background:#fcfaf5; 206 | border:1px solid #d0cdc4; 207 | } 208 | 209 | #schema .table b { 210 | color:#0033ff; 211 | font-weight:bold; 212 | text-decoration:underline; 213 | } 214 | 215 | #schema .table b:hover { 216 | color:white; 217 | } 218 | 219 | input[name=logout] { 220 | color:#fce2e2; 221 | background:#d73e3e; 222 | } 223 | 224 | input[name=logout]:hover { 225 | background:#ea0202; 226 | } 227 | 228 | #logins a, #tables a { 229 | background:none; 230 | } 231 | 232 | #logins a:hover, #tables a:hover { 233 | background:#A0522D; 234 | color:white; 235 | } 236 | 237 | #logout { 238 | color:#0033ff; 239 | text-decoration:none; 240 | } 241 | 242 | #logout:hover { 243 | color:white; 244 | background:#0033ff; 245 | } 246 | 247 | .js .column { 248 | background:#f2eee1; 249 | } 250 | 251 | #content table thead a.text:hover { 252 | text-decoration:none; 253 | } 254 | 255 | #version, .version { 256 | font-size:50%; 257 | } 258 | 259 | #h1:hover { 260 | color:white; 261 | } 262 | -------------------------------------------------------------------------------- /adminer/themes/flat.css: -------------------------------------------------------------------------------- 1 | /** 2 | * Adminer "flat" theme by Israel Viana 3 | * 4 | * Color palette from https://kuler.adobe.com/Copy-of-Flat-UI-color-theme-3785174/ 5 | * Navy: 2c3e50 6 | * Red: e74c3c 7 | * Gray: ecf0f1 8 | * Light blue: 3498db 9 | * Blue: 2980b9 10 | */ 11 | 12 | /* 13 | * Basic tags 14 | */ 15 | 16 | a { 17 | color: #2980b9; 18 | } 19 | 20 | a:visited { 21 | color: #3498db 22 | } 23 | 24 | a:link:hover, a:visited:hover { 25 | color: #e74c3c; 26 | } 27 | 28 | h1 { 29 | border-bottom: 1px solid #e74c3c; 30 | background: #ecf0f1; 31 | } 32 | 33 | h2 { 34 | border-bottom: 1px solid #e74c3c; 35 | background: #ecf0f1; 36 | } 37 | 38 | /* 39 | * Tables 40 | */ 41 | 42 | table { 43 | border-top: 0; 44 | border-left: 1px solid silver; 45 | } 46 | 47 | td, th { 48 | border-right: 1px solid silver; 49 | border-bottom: 1px solid silver; 50 | padding: .3em .5em; 51 | } 52 | 53 | thead th, thead td { 54 | background: #3498db; 55 | color: white; 56 | border-right: 1px solid white; 57 | border-bottom: 1px solid white; 58 | padding: .3em .5em; 59 | } 60 | 61 | thead th a, thead td a { 62 | color: #eee; 63 | } 64 | 65 | .js span.column { 66 | background: white; 67 | } 68 | th span.column a.text { 69 | color: #2980b9; 70 | } 71 | 72 | .js .checkable .checked td, .js .checkable .checked th { 73 | background: rgba(52, 152, 219, .3); 74 | } 75 | 76 | .pages { 77 | border: none; 78 | box-shadow: -1px -1px 4px silver; 79 | } 80 | 81 | /* 82 | * Common sections 83 | */ 84 | 85 | #breadcrumb a { 86 | color: #e74c3c; 87 | } 88 | 89 | #logout { 90 | font-weight: bold; 91 | } 92 | 93 | /* 94 | * Elements 95 | */ 96 | 97 | sup { 98 | padding: 3px 7px; 99 | background: #3498db; 100 | color: white; 101 | border-radius: 2em; 102 | } 103 | 104 | code.jush-sql { 105 | display: block; 106 | padding: .4em .7em; 107 | line-height: 1.5em; 108 | } 109 | -------------------------------------------------------------------------------- /adminer/themes/galkaev.css: -------------------------------------------------------------------------------- 1 | /** theme "easy on the eyes" for Adminer by p.galkaev@miraidenshi-tech.jp */ 2 | 3 | @import url(//fonts.googleapis.com/css?family=Source+Sans+Pro:400,900); 4 | 5 | /* reset 6 | ----------------------------------------------------------------------- */ 7 | 8 | *, 9 | *:after, 10 | *:before { 11 | margin: 0; 12 | padding: 0; 13 | outline: none; 14 | cursor: default; 15 | -webkit-appearance: none; 16 | -moz-box-sizing: border-box; 17 | -webkit-box-sizing: border-box; 18 | box-sizing: border-box; 19 | -webkit-print-color-adjust: exact; 20 | } 21 | 22 | /* for font awesome */ 23 | *:not(.fa) { 24 | font-family: 'Source Sans Pro', sans-serif; 25 | } 26 | 27 | #logins a, #tables a, #tables span { 28 | background: none; 29 | } 30 | 31 | p, 32 | form 33 | { 34 | margin: 0; 35 | margin-bottom: 20px; 36 | font-size: 14px; 37 | } 38 | 39 | p:last-child, 40 | form:last-child 41 | { 42 | margin-bottom: 0; 43 | } 44 | 45 | .type, 46 | .options select 47 | { 48 | width: 100%; 49 | } 50 | 51 | sup{ 52 | display: none; 53 | } 54 | 55 | /* js tooltip 56 | ----------------------------------------------------------------------- */ 57 | 58 | .js .column { 59 | position: absolute; 60 | padding: 0; 61 | margin-top: 0; 62 | top: 50px; 63 | z-index: 9; 64 | left: 0px; 65 | width: 100%; 66 | } 67 | 68 | .js .column:not(.hidden){ 69 | display: flex; 70 | } 71 | 72 | .js .column a{ 73 | text-align: center; 74 | color: black; 75 | font-weight: bold; 76 | flex-grow: 1; 77 | background: #fb4; 78 | height: 40px; 79 | line-height: 40px; 80 | font-size: 15px; 81 | font-weight: normal; 82 | } 83 | 84 | .js .column a:hover{ 85 | background-color: gold; 86 | color: black; 87 | } 88 | 89 | #help { 90 | position: absolute; 91 | border: none; 92 | background: #fb4; 93 | font-family: monospace; 94 | z-index: 1; 95 | font-size: 14px; 96 | line-height: 30px; 97 | padding: 0; 98 | } 99 | 100 | #help a{ 101 | color: black; 102 | height: 100%; 103 | display: block; 104 | padding: 0 10px; 105 | } 106 | 107 | #help a:hover{ 108 | background-color: gold; 109 | } 110 | 111 | #help, .js .column{ 112 | display: none; 113 | } 114 | 115 | /* error and message 116 | ----------------------------------------------------------------------- */ 117 | 118 | .error, .message { 119 | padding: 5px 15px 7px; 120 | margin: 10px 0; 121 | font-size: 14px; 122 | display: table; 123 | border-radius: 3px; 124 | color: white; 125 | } 126 | 127 | .error{ 128 | background-color: crimson; 129 | } 130 | 131 | .message{ 132 | background-color: seagreen; 133 | } 134 | 135 | /* scroll bar 136 | ----------------------------------------------------------------------- */ 137 | 138 | ::selection { 139 | background-color: #2a65ae; 140 | } 141 | /* 142 | ::-moz-selection { 143 | background-color: #333; 144 | }*/ 145 | 146 | /* scroll bar 147 | ----------------------------------------------------------------------- */ 148 | 149 | ::-webkit-scrollbar { 150 | background-color: black; 151 | cursor: pointer; 152 | } 153 | 154 | ::-webkit-scrollbar-thumb { 155 | background-color: #555; 156 | cursor: pointer; 157 | } 158 | 159 | ::-webkit-scrollbar:vertical{ 160 | width: 6px; 161 | } 162 | 163 | ::-webkit-scrollbar-thumb:vertical{ 164 | border-left: 0px solid black; 165 | width: 6px; 166 | } 167 | 168 | ::-webkit-scrollbar:horizontal{ 169 | height: 6px; 170 | } 171 | 172 | ::-webkit-scrollbar-thumb:horizontal{ 173 | border-top: 0px solid black; 174 | height: 6px; 175 | } 176 | 177 | ::-webkit-scrollbar-corner{ 178 | color: black; 179 | background-color: black; 180 | border-color: black; 181 | } 182 | 183 | ::-webkit-resizer{ 184 | background-color: #555; 185 | border-radius: 100%; 186 | } 187 | 188 | /* html and body 189 | ----------------------------------------------------------------------- */ 190 | 191 | html, 192 | body { 193 | width: 100%; 194 | height: 100%; 195 | max-height: 100%; 196 | overflow: hidden; 197 | 198 | } 199 | 200 | body{ 201 | min-height: 100%; 202 | font-size: 14px; 203 | position: relative; 204 | color: #ccc; 205 | background-color: black; 206 | overflow: hidden; 207 | display: flex; 208 | flex-wrap: nowrap; 209 | font: inherit; 210 | } 211 | 212 | /* headings 213 | ----------------------------------------------------------------------- */ 214 | 215 | h1{ 216 | font-size: 24px; 217 | margin: 0; 218 | padding: 0 18px; 219 | border-bottom: 1px solid #444; 220 | font-weight: bold; 221 | height: 70px; 222 | line-height: 70px; 223 | color: #555; 224 | background: none; 225 | } 226 | 227 | h2{ 228 | font-size: 24px; 229 | margin: 0; 230 | padding: 0; 231 | padding-left: 50px; 232 | border-bottom: 1px solid #333; 233 | color: #2CC990; 234 | font-weight: bold; 235 | background: none; 236 | height: 70px; 237 | line-height: 70px; 238 | text-transform: uppercase; 239 | } 240 | 241 | h3{ 242 | font-weight: bold; 243 | font-size: 24px; 244 | margin: 40px 0 10px; 245 | color: #2CC990; 246 | padding-bottom: 5px; 247 | } 248 | 249 | /* links 250 | ----------------------------------------------------------------------- */ 251 | 252 | a{ 253 | color: inherit; 254 | cursor: pointer; 255 | } 256 | 257 | a:hover, a:visited{ 258 | color: inherit; 259 | } 260 | 261 | a:link:hover, a:visited:hover { 262 | color: inherit; 263 | text-decoration: none; 264 | } 265 | 266 | /* table 267 | ----------------------------------------------------------------------- */ 268 | 269 | table{ 270 | margin: 0; 271 | margin-bottom: 20px; 272 | border: 0; 273 | border-collapse: collapse; 274 | font-size: 13px; 275 | width: 100%; 276 | /*table-layout: fixed;*/ 277 | } 278 | 279 | tr:hover th, 280 | .checked th 281 | { 282 | background: #333 !important; 283 | color: #ddd; 284 | border-color: none; 285 | } 286 | 287 | tr:hover td, 288 | .checked td 289 | { 290 | background: #222 !important; 291 | color: #ddd; 292 | border-color: none; 293 | } 294 | 295 | .links + table tr:hover th{ 296 | color: #ddd; 297 | background: #336f5a !important; 298 | } 299 | 300 | .links + table tr:hover td{ 301 | background: #2CC990 !important; 302 | color: #333; 303 | } 304 | 305 | p + table{ 306 | margin-top: 20px; 307 | } 308 | 309 | tr{ 310 | padding-bottom: 1px; 311 | } 312 | 313 | td, th { 314 | border: 0; 315 | border-right: 1px solid #333; 316 | padding: 0 12px; 317 | line-height: 30px; 318 | position: relative; 319 | } 320 | 321 | td:last-child, 322 | th:last-child{ 323 | border-right: none; 324 | } 325 | 326 | th{ 327 | position: relative; 328 | background: #222; 329 | font-weight: normal; 330 | width: 17%; 331 | border-left: 5px solid #336f5a; 332 | border-bottom: 1px solid rgba(255, 255, 255, .13); 333 | color: #999; 334 | } 335 | 336 | .checkable td:first-child{ 337 | background: #222; 338 | border-right-style: solid; 339 | } 340 | 341 | table.checkable th{ 342 | border-left: none; 343 | } 344 | 345 | td{ 346 | background: #000; 347 | border-bottom: 1px solid rgba(255, 255, 255, .1); 348 | } 349 | 350 | .odd th{ 351 | background: #222; 352 | } 353 | 354 | .odd td{ 355 | background: #000; 356 | } 357 | 358 | thead td, 359 | thead th 360 | { 361 | background: transparent !important; 362 | color: #ccc; 363 | border-right-style: dashed; 364 | font-weight: bold; 365 | } 366 | 367 | table#edit-fields td, 368 | table#edit-fields th 369 | { 370 | padding: 0; 371 | padding-left: 5px; 372 | } 373 | 374 | table#edit-fields thead th, 375 | table#edit-fields thead td 376 | { 377 | padding-left: 10px; 378 | } 379 | 380 | thead tr:hover th, 381 | thead tr:hover td, 382 | .links + table thead tr:hover th, 383 | .links + table thead tr:hover td, 384 | table#edit-fields thead tr:hover th, 385 | table#edit-fields thead tr:hover td 386 | { 387 | background-color: transparent !important; 388 | color: inherit !important; 389 | border-bottom: 1px solid rgba(255, 255, 255, .1) !important; 390 | } 391 | 392 | thead tr:hover th{ 393 | border-bottom: 1px solid rgba(255, 255, 255, .13) !important; 394 | } 395 | 396 | thead th { 397 | border-left-color: transparent; 398 | text-align: left; 399 | padding: 10px; 400 | } 401 | 402 | /* form 403 | ----------------------------------------------------------------------- */ 404 | 405 | input, 406 | select, 407 | textarea 408 | { 409 | color: #333; 410 | font-size: 15px; 411 | height: 30px; 412 | background-color: #ddd; 413 | border: none; 414 | border-radius: 3px; 415 | line-height: 28px; 416 | cursor: pointer; 417 | padding: 0; 418 | padding-left: 10px; 419 | -webkit-appearance: none; 420 | outline: none; 421 | } 422 | 423 | input:hover, 424 | select:hover, 425 | input:focus, 426 | select:focus 427 | { 428 | background-color: #bbb; 429 | } 430 | 431 | th input, 432 | td input, 433 | th select, 434 | td select, 435 | td textarea 436 | { 437 | background-color: transparent; 438 | color: pink; 439 | width: 100%; 440 | display: inline; 441 | border-left: 1px dashed #555; 442 | border-radius: 0; 443 | } 444 | 445 | th input:hover, 446 | th select:hover, 447 | td input:hover, 448 | td select:hover, 449 | th input:focus, 450 | th select:focus, 451 | td input:focus, 452 | td select:focus 453 | { 454 | background-color: rgba(255, 255, 255, .15); 455 | } 456 | 457 | th input[type='checkbox'], 458 | th input[type='radio'], 459 | td input[type='checkbox'], 460 | td input[type='radio']{ 461 | border-left: none; 462 | background-color: transparent !important; 463 | } 464 | 465 | 466 | td input + a, 467 | td input + a:visited 468 | { 469 | text-transform: uppercase; 470 | margin-left: 5px; 471 | color: dodgerblue; 472 | font-size: 12px; 473 | font-weight: normal; 474 | } 475 | 476 | td input + a:hover{ 477 | color: lightskyblue !important; 478 | } 479 | 480 | input.icon{ 481 | padding-left: 0; 482 | } 483 | 484 | input.icon::after{ 485 | content: ''; 486 | } 487 | 488 | th select, 489 | td select 490 | { 491 | color: lightcoral; 492 | } 493 | 494 | input[type='number'] { 495 | min-width: 55px; 496 | } 497 | 498 | /* radio */ 499 | input[type='radio']{ 500 | -webkit-appearance: radio; 501 | width: 18px; 502 | height: 18px; 503 | vertical-align: middle; 504 | margin-left: 8px; 505 | margin-right: 0; 506 | } 507 | 508 | /* checkbox */ 509 | input[type='checkbox']{ 510 | width: 30px; 511 | height: 30px; 512 | margin-right: 6px; 513 | position: relative; 514 | border-radius: 2px; 515 | margin-left: 20px; 516 | } 517 | 518 | input[type=checkbox]:hover{ 519 | border-color: white; 520 | } 521 | 522 | input[type=checkbox]::after { 523 | cursor: pointer; 524 | position: absolute; 525 | content: '×'; 526 | left: 17%; 527 | top: 4.5%; 528 | color: #ccc; 529 | font-size: 35px; 530 | font-family: sans-serif; 531 | font-weight: bold; 532 | } 533 | 534 | input[type=checkbox]:hover::after { 535 | color: #aaa; 536 | } 537 | 538 | input[type=checkbox]:checked::after { 539 | color: #333; 540 | } 541 | 542 | td input[type='checkbox'], 543 | th input[type='checkbox'] 544 | { 545 | margin-left: 10px; 546 | margin-right: 26px; 547 | } 548 | 549 | td input[type='checkbox']::after{ 550 | left: 10%; 551 | top: -2px; 552 | color: #333; 553 | } 554 | 555 | td input[type='checkbox']:hover::after{ 556 | color: #555; 557 | } 558 | 559 | td input[type='checkbox']:checked::after{ 560 | color: #ddd; 561 | } 562 | 563 | p input:first-child{ 564 | margin-left: 8px; 565 | } 566 | 567 | label{ 568 | line-height: 27px; 569 | font-size: 14px; 570 | } 571 | 572 | th label{ 573 | line-height: 35px; 574 | } 575 | 576 | label input { 577 | vertical-align: top; 578 | } 579 | 580 | /* submit */ 581 | input[type='submit']{ 582 | color: white; 583 | background-color: royalblue; 584 | padding: 0 25px; 585 | margin-right: 20px; 586 | border-radius: 2px; 587 | } 588 | 589 | input[type='submit']:hover{ 590 | background-color: #214ac5; 591 | } 592 | 593 | /* select */ 594 | select{ 595 | padding-left: 6px; 596 | } 597 | 598 | /* textarea */ 599 | textarea{ 600 | min-height: 150px; 601 | width: 100%; 602 | } 603 | 604 | /* fieldset */ 605 | fieldset { 606 | display: inline; 607 | vertical-align: top; 608 | padding: 4px 7px 7px; 609 | margin: 0 5px 10px; 610 | border: 1px dashed #555; 611 | border-radius: 2px; 612 | min-height: 60px; 613 | } 614 | 615 | fieldset > div{ 616 | display: flex; 617 | } 618 | 619 | fieldset > div * + p{ 620 | margin-left: 10px; 621 | } 622 | 623 | fieldset > div > div{ 624 | margin-left: 10px; 625 | } 626 | 627 | fieldset > div > div:first-child{ 628 | margin-left: 0; 629 | } 630 | 631 | fieldset > div input, 632 | fieldset > div select 633 | { 634 | margin-right: 5px; 635 | } 636 | 637 | fieldset > div input[type='checkbox']{ 638 | margin-left: 5px; 639 | } 640 | 641 | fieldset input{ 642 | flex-grow: 1; 643 | } 644 | 645 | fieldset input[type='submit']{ 646 | margin-right: 10px; 647 | } 648 | 649 | fieldset input[type='submit']:last-of-type{ 650 | margin-right: 0; 651 | } 652 | 653 | legend{ 654 | font-size: 14px; 655 | background-color: #000; 656 | padding: 0 3px; 657 | color: #999; 658 | } 659 | 660 | /* menu 661 | ----------------------------------------------------------------------- */ 662 | 663 | #menu{ 664 | height: 100%; 665 | width: 300px; 666 | background-color: #333; 667 | position: relative; 668 | order: 1; 669 | flex-grow: 0; 670 | flex-shrink: 0; 671 | margin: 0; 672 | padding: 0; 673 | top: 0; 674 | overflow-y: overlay; 675 | } 676 | 677 | #menu p { 678 | padding: 18px; 679 | margin: 0; 680 | border-bottom: 1px solid #444; 681 | } 682 | 683 | /* logo */ 684 | #h1{ 685 | color: #555; 686 | text-decoration: none; 687 | font-style: inherit; 688 | } 689 | 690 | .version { 691 | color: #555; 692 | font-size: inherit; 693 | } 694 | 695 | /* db select */ 696 | #dbs select{ 697 | width: 228px; 698 | margin-left: 8px; 699 | } 700 | 701 | /* links */ 702 | #menu .links{ 703 | padding-top: 0; 704 | padding-bottom: 10px; 705 | } 706 | 707 | #menu .links a:nth-child(even){ 708 | margin-left: 6px; 709 | } 710 | 711 | #menu .links a{ 712 | display: inline-block; 713 | vertical-align: top; 714 | width: 127px; 715 | height: 31px; 716 | margin: 0; 717 | margin-bottom: 10px; 718 | border: 1px solid #555; 719 | line-height: 27px; 720 | text-align: center; 721 | text-transform: uppercase; 722 | font-size: 12px; 723 | border-radius: 3px; 724 | color: #999; 725 | } 726 | 727 | #menu .links a.active, 728 | #menu .links a:hover 729 | { 730 | border: 1px solid #ccc; 731 | font-weight: normal; 732 | color: inherit; 733 | } 734 | 735 | /* tables */ 736 | #logins, #tables{ 737 | border-bottom: none; 738 | line-height: 20px; 739 | padding: 18px 0; 740 | overflow-y: auto !important; 741 | } 742 | 743 | #tables br{ 744 | display: none; 745 | } 746 | 747 | #tables a { 748 | float: right; 749 | padding: 5px 18px 9px; 750 | line-height: 17px; 751 | color: #2CC990; 752 | font-size: 13px; 753 | } 754 | 755 | #tables a[title] { 756 | float: none; 757 | display: block; 758 | color: inherit; 759 | font-size: 14px; 760 | } 761 | 762 | #logins a { 763 | display: block; 764 | padding: 5px 18px 9px; 765 | color: inherit; 766 | font-size: 14px; 767 | } 768 | 769 | #tables a.select.active, 770 | #tables a.select:hover 771 | { 772 | color: #fba; 773 | } 774 | 775 | #logins a:hover, 776 | #tables a[title]:hover, 777 | #tables a.active, 778 | #tables a.select:hover + a, 779 | #tables a.select.active + a 780 | { 781 | background-color: #555; 782 | font-weight: normal; 783 | } 784 | 785 | /* content 786 | ----------------------------------------------------------------------- */ 787 | 788 | #content{ 789 | height: 100%; 790 | width: 100%; 791 | margin: 0; 792 | padding: 0; 793 | padding-left: 50px; 794 | padding-right: 50px; 795 | padding-bottom: 30px; 796 | overflow-y: auto !important; 797 | order: 2; 798 | flex-grow: 1; 799 | } 800 | 801 | #breadcrumb{ 802 | position: relative; 803 | display: none; 804 | } 805 | 806 | #content h2{ 807 | margin-left: -50px; 808 | } 809 | 810 | /* links */ 811 | #content .links a, 812 | code.jush-sql ~ a, 813 | #fieldset-history > a:first-child 814 | { 815 | display: inline-block; 816 | height: 32px; 817 | line-height: 30px; 818 | padding: 0 10px; 819 | border: 1px solid #666; 820 | border-radius: 3px; 821 | font-size: 12px; 822 | text-transform: uppercase; 823 | } 824 | 825 | #content .links a:hover, 826 | code.jush-sql ~ a:hover, 827 | #fieldset-history > a:first-child:hover 828 | { 829 | color: #eee; 830 | border-color: #eee; 831 | } 832 | 833 | #ajaxstatus + *{ 834 | margin-top: 18px; 835 | } 836 | 837 | #ajaxstatus + *.links { 838 | margin-top: 0 !important; 839 | height: 65px; 840 | line-height: 55px; 841 | margin-bottom: 0; 842 | } 843 | 844 | #ajaxstatus + .links a{ 845 | white-space: nowrap; 846 | margin-right: 20px; 847 | padding: 0; 848 | padding-bottom: 5px; 849 | border: 0; 850 | border-radius: 0; 851 | font-size: 15px; 852 | font-weight: bold; 853 | } 854 | 855 | #ajaxstatus + .links a.active, 856 | #ajaxstatus + .links a:hover 857 | { 858 | border-bottom: 1px solid; 859 | border-color: inherit; 860 | color: inherit; 861 | } 862 | 863 | /* fieldset search */ 864 | #fieldset-search > div > *{ 865 | margin-right: 5px; 866 | margin-bottom: 5px; 867 | } 868 | 869 | /* fieldset search */ 870 | #fieldset-partition p{ 871 | margin-bottom: 0; 872 | } 873 | 874 | /* feldset history */ 875 | #fieldset-history{ 876 | flex-wrap: wrap; 877 | } 878 | 879 | #fieldset-history i{ 880 | display: none; 881 | } 882 | 883 | #fieldset-history input[type='submit']{ 884 | flex-grow: 0; 885 | order: 1; 886 | margin-top: 1px; 887 | margin-left: 17px; 888 | } 889 | 890 | #fieldset-history > div a:last-child{ 891 | order: 2; 892 | } 893 | 894 | #fieldset-history > a{ 895 | flex-grow: 0; 896 | flex-basis: 5%; 897 | min-width: 45px; 898 | text-align: center; 899 | margin-bottom: 10px; 900 | margin-left: 5px; 901 | } 902 | 903 | #fieldset-history > .time{ 904 | flex-grow: 0; 905 | flex-basis: 5%; 906 | text-align: center; 907 | line-height: 29px; 908 | } 909 | 910 | #fieldset-history > code{ 911 | flex-grow: 1; 912 | flex-basis: 89%; 913 | line-height: 29px; 914 | } 915 | 916 | #fieldset-history > .time{ 917 | flex-grow: 0; 918 | flex-basis: 5%; 919 | text-align: center; 920 | } 921 | 922 | /* sql 923 | ----------------------------------------------------------------------- */ 924 | 925 | .sqlarea{ 926 | border: 1px solid #444 !important; 927 | width: 100% !important; 928 | padding: 12px 15px !important; 929 | font-size: 15px; 930 | margin-bottom: 20px; 931 | } 932 | 933 | .jush-sql_code{ 934 | color: #fafafa !important; 935 | font-family: 'Source Sans Pro', sans-serif !important; 936 | } 937 | 938 | .jush a, .jush a:visited{ 939 | color: #fba; 940 | font-weight: normal; 941 | } 942 | 943 | .jush a:hover{ 944 | color: #fba; 945 | cursor: pointer; 946 | } 947 | 948 | .jush-php_quo, .jush-quo, .jush-quo_one, .jush-php_eot, .jush-apo, .jush-sql_apo, .jush-sqlite_apo, .jush-sql_quo, .jush-sql_eot{ 949 | color: aquamarine; 950 | } 951 | 952 | .jush-bac, .jush-php_bac, .jush-bra, .jush-mssql_bra, .jush-sqlite_quo{ 953 | color: plum; 954 | } 955 | 956 | .jush-num, .jush-clr{ 957 | color: #85E2FF; 958 | } 959 | 960 | code { 961 | background: #000; 962 | font-size: 14px; 963 | } 964 | 965 | code.jush-sql ~ a{ 966 | position: relative; 967 | margin-left: 5px; 968 | /*margin-top: 20px; 969 | margin-bottom: 20px; */ 970 | } 971 | 972 | code.jush-sql ~ a:first-of-type{ 973 | margin-left: 30px; 974 | } 975 | 976 | code.jush-sql ~ a:first-of-type::before{ 977 | content: '◀'; 978 | color: #555; 979 | position: absolute; 980 | left: -22px; 981 | font-size: 22px; 982 | top: -1px; 983 | } 984 | 985 | /* logout form 986 | ----------------------------------------------------------------------- */ 987 | 988 | body > form{ 989 | position: absolute; 990 | } 991 | -------------------------------------------------------------------------------- /adminer/themes/jukin.css: -------------------------------------------------------------------------------- 1 | /* Redesigned by Janamou - September 2008 */ 2 | 3 | body { color: #000; background-color: #fff; line-height: 1.25em; font-family: Verdana, Arial, Helvetica, sans-serif; margin: 0; font-size: 90%; } 4 | a { color: black; } 5 | a:visited { color: black; } 6 | a:hover { color: #626262; text-decoration: none; } 7 | h1 { margin: 0; padding: 5px; } 8 | h2 { margin: 0; padding: 7px 0px 7px 10px; border: 1px solid #a3a3a3; font-weight: normal; background: #FCE28E url('data:image/gif;base64,R0lGODlhEAAiAIMAAP/nnf/nn//nof/kk//llP/ab//Zav/aa/7aagAAAAAAAAAAAAAAAAAAAAAAAAAAACwAAAAAEAAiAAMERBDISSsIOOvNu/9gKI5k6VnoJKxs6wpmmsayZQ54jhN8zxfAoHBYMBiPyKTyeGg6m4iodEpFLK/YrHbL7Xq/4LB4LI4AADs=') top left repeat-x; margin-bottom: 20px; } 9 | h3 { font-weight: normal; font-size: 130%; margin: .8em 0; } 10 | table { margin: 0 20px .8em 0; border: 0; border-top: 1px solid #999; border-left: 1px solid #999; font-size: 90%; } 11 | td, th { margin-bottom: 1em; border: 0; border-right: 1px solid #999; border-bottom: 1px solid #999; padding: .2em .3em; } 12 | th { background: black; color: white; } 13 | th a, th a:visited { color: white; text-decoration: none; } 14 | th a:hover { color: #626262; } 15 | fieldset { display: inline; vertical-align: top; padding: .5em .8em; margin: 0 .5em .5em 0; border: 1px solid #999; } 16 | img { vertical-align: middle; margin: 0; padding: 0; } 17 | .error { color: red; background: #fee; padding: .5em .8em; border: 1px solid red; } 18 | .message { color: black; background: #dedede; padding: .5em .8em; border: 1px solid black; } 19 | #menu { overflow: scroll; position: absolute; top: 0; left: 0; width: 270px; white-space: nowrap; background: #FFE594 url('data:image/gif;base64,R0lGODlhXgEBAIIAAPzabPzijvzihPzefvzmnPzedPzmlPzadCwAAAAAXgEBAAIDYEi63P5wGTXJvNZew7sJBNiBwWeWaPoFbNq+cCzPs8DaeJDvuGAPOh9wIBgWAwMjMblsOpnQqHRKrRaY1+sguz1sB4esN0wulM+HtNqMZqsBafgBTp/PAfQ8fs/v+/8ACQA7') top left repeat-y; height: 100%; _height: 650px; border: 1px solid #a3a3a3; } 20 | #menu form { margin: 0; } 21 | #menu p, #logins li, #tables li { text-align: center; font-size: 11px; } 22 | #menu p a, #logins li a, #tables li a { color: black; } 23 | #menu p a:hover, #logins li a:hover, #tables li a:hover { color: #626262; text-decoration: none; } 24 | #logins a, #tables a, #tables span { background: #FFE594; } 25 | #content { margin: 1.5em 0 0 293px; padding: 10px 20px 20px 0; } 26 | #lang { margin: 0; padding: 0; text-align: center; font-size: 10px; width: 270px; background-color: #d9dadb; border-bottom: 1px solid black; } 27 | #lang a { color: black; font-weight: bold; } 28 | #breadcrumb { position: absolute; top: 0; left: 293px; background: #d9dadb; font-size: 10px; margin: 0; padding: 2px 5px 2px 5px; } 29 | #breadcrumb a { color: black; } 30 | -------------------------------------------------------------------------------- /adminer/themes/kahi.css: -------------------------------------------------------------------------------- 1 | /* 2 | Ok, it's a mess. You don't have to read it! 3 | */ 4 | 5 | body { 6 | font-family: "Segoe UI", Tahoma, sans-serif; 7 | } 8 | 9 | body a[href^="#"] { 10 | color:#000; text-decoration: none; border-bottom: 1px dotted #999; 11 | } 12 | 13 | h3 { 14 | margin-top: 2em; 15 | } 16 | 17 | .jush-bac { 18 | color:#22c !important; 19 | } 20 | 21 | a:hover { 22 | color:#000; text-decoration: none; 23 | } 24 | 25 | /* 26 | @group Headers (visually) 27 | */ 28 | 29 | #menu .logout { 30 | border-bottom:0; height:auto; padding: 0; 31 | } 32 | 33 | 34 | /* 35 | @end 36 | */ 37 | 38 | /* 39 | @group Sidebar (visually) 40 | */ 41 | 42 | #menu { 43 | margin:0; padding:0; 44 | position:static; float:left; margin-left:-100%; 45 | width:25%; padding-top:80px; 46 | line-height:1.4; 47 | } 48 | 49 | /* header "adminer 2.3.2" */ 50 | h1 { 51 | margin:0; padding:0; 52 | position: fixed; left:0; top:0; 53 | width:25%; height:60px; 54 | border-bottom: 1px solid #bbb; 55 | background-color:#efefef; background-color:rgba(240,240,240,0.9); 56 | line-height:60px; text-indent:20px; 57 | } 58 | 59 | #h1 { 60 | font-weight:bold; color:#666; font-style:normal; 61 | } 62 | 63 | #menu a { 64 | padding:1px; margin-right:4px; 65 | color:#000; font-size:small; text-decoration: none; 66 | } 67 | 68 | #menu a:hover { 69 | font-weight:bold; 70 | } 71 | 72 | #menu #tables + p a { 73 | color:green; 74 | } 75 | 76 | 77 | 78 | /* 79 | #menu form+form, #menu #tables { 80 | position: fixed; left:0; top:100px; width:25%; 81 | } 82 | 83 | #menu #tables { 84 | max-height:100%; padding-top:130px; overflow-y:auto; 85 | } 86 | */ 87 | /* @todo ev. position fixed for whole sidebar (not simple) */ 88 | 89 | /* 90 | @end 91 | */ 92 | 93 | /* 94 | @group Sidebar (based on HTML position, not visual) 95 | */ 96 | 97 | 98 | 99 | /* languages */ 100 | #lang { 101 | position: absolute; left:auto; left:120px; top:0px; z-index:3; 102 | font-size:11px; line-height:60px; text-decoration: underline; text-transform:lowercase; 103 | opacity:0.5; 104 | } 105 | 106 | #lang:hover { 107 | opacity:1; 108 | } 109 | 110 | #lang select { 111 | display:none; 112 | } 113 | 114 | #lang:hover select { 115 | display: inline-block; 116 | } 117 | 118 | /* logout */ 119 | input[name="logout"] { 120 | position:fixed; right:15px; top:22px; 121 | } 122 | 123 | /* 124 | @end 125 | */ 126 | 127 | /* 128 | @group Content: main 129 | */ 130 | 131 | 132 | #content { 133 | margin:0; padding:155px 0 50px 0; 134 | position: static; float:left; margin-left:25%; 135 | width:75%; 136 | } 137 | 138 | #content > * { 139 | margin-left:20px; margin-right:20px; 140 | } 141 | 142 | 143 | #content h2 { 144 | margin:0; padding:0; 145 | position:fixed; left:25%; top:0; margin-left:-1px; 146 | width:75%; 147 | border-bottom: 1px solid #bbb; 148 | background-color:#efefef; background-color:rgba(240,240,240,0.9); 149 | font-weight:bold; line-height:60px; text-indent:20px; 150 | } 151 | 152 | /* breadcrumbs */ 153 | #breadcrumb { 154 | margin:0; padding:0; 155 | position:absolute; top:75px; left:25%; 156 | background:url() no-repeat; 157 | text-indent: 20px; 158 | } 159 | 160 | /* Dump link */ 161 | #menu .logout a { 162 | margin:0; padding:2px 4px; 163 | position:absolute; left:25%; top:110px; 164 | border-radius:3px; 165 | background-color:#053AC0; color:#fff; margin-left:120px; text-transform: uppercase; font-size:11px; text-decoration: none; 166 | } 167 | 168 | /* SQL command link */ 169 | body #menu .logout a[href$="sql="] { 170 | margin-left: 20px; 171 | background-color:green; 172 | } 173 | 174 | 175 | /* 176 | @end 177 | */ 178 | 179 | /* 180 | @group Content: details 181 | */ 182 | 183 | 184 | 185 | #content p > a { 186 | margin-right:1ex; 187 | color: #333; 188 | } 189 | 190 | #content p > a[href$="&database="], 191 | #content p > a[href*="&edit="] { 192 | color:green !important; 193 | 194 | } 195 | 196 | /* 197 | @group Messages 198 | */ 199 | 200 | .message { 201 | background-color:#D0EE76; 202 | color:#000; 203 | } 204 | 205 | .error { 206 | background-color:#fbb; 207 | color: #000; 208 | } 209 | 210 | .message a, 211 | .error a { 212 | margin-left:1em; 213 | color:#000; opacity:0.5; font-size:smaller; 214 | } 215 | 216 | /* 217 | @end 218 | */ 219 | 220 | 221 | 222 | #menu p { 223 | padding:20px; /* wtf? */ 224 | } 225 | 226 | #menu form + form p:before { 227 | content:'DB:'; font-size:11px; 228 | } 229 | 230 | 231 | 232 | 233 | /* 234 | @group Tables 235 | */ 236 | 237 | table { 238 | border:1px solid #ccc; 239 | } 240 | 241 | table thead tr > * { 242 | padding:5px; 243 | border-color:#ccc; 244 | border-bottom:2px solid #ccc; 245 | background-color:#f2f2f2; 246 | text-align: left; font-weight:bold; 247 | } 248 | 249 | thead a { 250 | color:#333; text-decoration: none; 251 | } 252 | 253 | body thead tr:hover > * { 254 | background-color:#f2f2f2; 255 | } 256 | 257 | body tbody tr:hover > * { 258 | background-color:#f2f7ff; 259 | } 260 | 261 | /* 262 | @end 263 | */ 264 | 265 | /* 266 | @group Pagination 267 | */ 268 | 269 | #content .pages { 270 | margin:1em 0 2em; 271 | } 272 | 273 | #content .pages a { 274 | padding:3px 5px; margin:0 1px; 275 | border:1px solid #eee; 276 | text-decoration:none; color: #000; 277 | } 278 | 279 | #content .pages a:hover { 280 | background-color:#eee; 281 | border-color: #fff; 282 | } 283 | 284 | 285 | /* 286 | @end 287 | */ 288 | /* 289 | @end 290 | */ -------------------------------------------------------------------------------- /adminer/themes/ng9.css: -------------------------------------------------------------------------------- 1 | * { 2 | font: 13px/1.5 Verdana, 'Geneva CE', lucida, sans-serif; 3 | color:#333333; 4 | margin:0px; 5 | padding:0px; 6 | } 7 | 8 | a,a:visited { 9 | color:#006aeb; 10 | text-decoration:none; 11 | padding:3px 1px; 12 | } 13 | 14 | #content table thead span, #content table thead a { 15 | font-weight:bold; 16 | color:black; 17 | } 18 | 19 | #content table thead a:hover { 20 | background:none; 21 | text-decoration:underline; 22 | color:black; 23 | } 24 | 25 | a:hover { 26 | color:white; 27 | background:#006aeb; 28 | } 29 | 30 | h1 { 31 | font-size:1.9em; 32 | font-weight:normal; 33 | background:white; 34 | color:#1e5eb6; 35 | border-bottom:1px solid #f4f4f4; 36 | 37 | padding:20px; 38 | margin:0px; 39 | } 40 | 41 | #menu h1 { 42 | padding:0px 0px 5px 20px; 43 | background:none; 44 | } 45 | 46 | h2,h3 { 47 | font-size:1.5em; 48 | font-weight:normal; 49 | background:white; 50 | color:#1e5eb6; 51 | border-bottom:1px solid #f4f4f4; 52 | 53 | padding:20px 0px; 54 | margin:0px; 55 | } 56 | 57 | fieldset { 58 | padding:5px; 59 | border:1px solid #f4f4f4; 60 | } 61 | 62 | input,select,textarea { 63 | border:1px solid #e5e5e5; 64 | margin:1px; 65 | padding:3px; 66 | } 67 | 68 | input[type=submit] { 69 | color:white; 70 | background:#3390e6; 71 | padding:3px 10px; 72 | cursor:pointer; 73 | border:0px solid; 74 | } 75 | 76 | input[type=submit]:hover{ 77 | background:blue; 78 | } 79 | 80 | input[type=checkbox]{ 81 | margin-right:5px; 82 | } 83 | 84 | input[type=image] { 85 | border:1px solid #d0cdc4; 86 | } 87 | 88 | input[type=checkbox],input[type=radio]{ 89 | border:1px solid #e5e5e5; 90 | padding:2px 5px; 91 | } 92 | 93 | code{ 94 | background:#f0ffe1; 95 | border:1px dashed #d5f1b9; 96 | padding:2px 4px; 97 | font-family:"Courier New"; 98 | } 99 | code a:hover{background:transparent} 100 | 101 | table{ 102 | margin:10px 0px; 103 | border:1px solid #d0cdc4; 104 | border-collapse:collapse; 105 | } 106 | 107 | tbody tr:hover td,tbody tr:hover th{ 108 | background:#edf4ff 109 | } 110 | 111 | thead th, thead td { 112 | text-align:center; 113 | vertical-align:middle; 114 | font-weight:bold; 115 | white-space:nowrap; 116 | background:#f2eee1; 117 | color:#808080; 118 | } 119 | 120 | th,td{ 121 | border:1px solid #d0cdc4; 122 | padding:3px 6px; 123 | vertical-align:top; 124 | } 125 | 126 | th a { 127 | font-weight:bold; 128 | padding-bottom:0px; 129 | } 130 | 131 | th { 132 | background:white; 133 | } 134 | 135 | tr.odd td { 136 | background:#fcfaf5; 137 | } 138 | 139 | #content tbody tr.checked td, tr.checked.odd td { 140 | background:#fbe2e2; 141 | color:red; 142 | } 143 | 144 | .hidden{ 145 | display:none 146 | } 147 | 148 | .error,.message{ 149 | padding:0px; 150 | background:transparent; 151 | font-weight:bold 152 | } 153 | 154 | .error{ 155 | color:#c00 156 | } 157 | 158 | .message{ 159 | color:#090 160 | } 161 | 162 | #content{ 163 | margin:0px 0px 0px 320px; 164 | padding:50px 20px 40px 0px; 165 | height:100%; 166 | } 167 | 168 | #lang { 169 | background:#f2eee1; 170 | color:#808080; 171 | position:fixed; 172 | top:0px; 173 | left:0px; 174 | width:100%; 175 | padding:10px 20px; 176 | z-index:1; 177 | } 178 | 179 | #breadcrumb { 180 | position:fixed; 181 | top:0px; 182 | left:300px; 183 | background:#f2eee1; 184 | z-index:2; 185 | width:100%; 186 | padding:10px; 187 | } 188 | 189 | #menu { 190 | background:#fcfaf5; 191 | position:fixed; 192 | top:-10px; 193 | padding:20px; 194 | padding-top:40px; 195 | bottom:0px; 196 | overflow:auto; 197 | left:0px; 198 | width:240px; 199 | border-right:5px solid #f2eee1; 200 | } 201 | 202 | #schema .table { 203 | padding:5px; 204 | background:#fcfaf5; 205 | border:1px solid #d0cdc4; 206 | } 207 | 208 | #schema .table b { 209 | color:#006aeb; 210 | font-weight:bold; 211 | text-decoration:underline; 212 | } 213 | 214 | #schema .table b:hover { 215 | color:white; 216 | } 217 | 218 | input[name=logout] { 219 | color:#fce2e2; 220 | background:#d73e3e; 221 | } 222 | 223 | input[name=logout]:hover { 224 | background:#ea0202; 225 | } 226 | 227 | #logins a, #tables a { 228 | background:none; 229 | } 230 | 231 | #logins a:hover, #tables a:hover { 232 | background:#006aeb; 233 | } 234 | 235 | #logout { 236 | color:#006aeb; 237 | text-decoration:none; 238 | } 239 | 240 | #logout:hover { 241 | color:white; 242 | background:#006aeb; 243 | } 244 | 245 | .js .column { 246 | background:#f2eee1; 247 | } 248 | 249 | #content table thead a.text:hover { 250 | text-decoration:none; 251 | } 252 | 253 | #version, .version { 254 | font-size:50%; 255 | } 256 | 257 | #h1:hover { 258 | color:white; 259 | } 260 | -------------------------------------------------------------------------------- /adminer/themes/nicu.css: -------------------------------------------------------------------------------- 1 | /* CSS by Nicu I. - www.nicu.me */ 2 | @import url('//fonts.googleapis.com/css?family=Roboto:400,700,300'); 3 | body { 4 | font: 16px/1.25 'Roboto', Verdana, Arial, Helvetica, sans-serif; 5 | margin: 0; 6 | color: #000; 7 | background: #fff; 8 | } 9 | a { 10 | text-decoration: none; 11 | color: #246db3; 12 | } 13 | a:visited { 14 | color: #225584; 15 | } 16 | a:link:hover, 17 | a:visited:hover { 18 | text-decoration: underline; 19 | color: #f44; 20 | } 21 | a.text:hover { 22 | text-decoration: none; 23 | } 24 | a.jush-help:hover { 25 | color: inherit; 26 | } 27 | h1 { 28 | font-size: 150%; 29 | font-weight: normal; 30 | margin: 0; 31 | padding: .8em .7em; 32 | color: #f44; 33 | border-bottom: 0 solid #999; 34 | background: transparent; 35 | } 36 | h2 { 37 | font-size: 29px; 38 | font-weight: 300; 39 | margin: 0 0 20px -18px; 40 | padding: .5em .6em; 41 | color: #000; 42 | border-bottom: 0 solid #000; 43 | background: transparent; 44 | } 45 | h3 { 46 | font-size: 130%; 47 | font-weight: normal; 48 | margin: 1em 0 0; 49 | } 50 | form { 51 | margin: 0; 52 | } 53 | td table { 54 | width: 100%; 55 | margin: 0; 56 | } 57 | table { 58 | font-size: 90%; 59 | margin: 1em 20px 0 0; 60 | border: 0; 61 | border-top: 1px solid #d2d2d2; 62 | border-left: 0 solid #d2d2d2; 63 | } 64 | td { 65 | padding: .2em .3em; 66 | border: 0; 67 | border-right: 0 solid #d2d2d2; 68 | border-bottom: 1px solid #d2d2d2; 69 | } 70 | th { 71 | padding: .2em .3em; 72 | border: 0; 73 | border-right: 1px solid #d2d2d2; 74 | border-bottom: 1px solid #d2d2d2; 75 | } 76 | th { 77 | text-align: left; 78 | background: #eaeaea; 79 | } 80 | thead td { 81 | padding: .2em .5em; 82 | text-align: center; 83 | border-right: 1px solid #d2d2d2; 84 | border-left: 1px solid #d2d2d2; 85 | } 86 | thead td, 87 | thead th { 88 | background: #eaeaea; 89 | } 90 | fieldset { 91 | display: inline; 92 | margin: .8em .5em 0 0; 93 | padding: .5em .8em; 94 | vertical-align: top; 95 | border: 1px solid #999; 96 | } 97 | p { 98 | margin: .8em 20px 0 0; 99 | } 100 | img { 101 | vertical-align: middle; 102 | border: 0; 103 | } 104 | td img { 105 | max-width: 200px; 106 | max-height: 200px; 107 | } 108 | code { 109 | font-size: 14px; 110 | padding: 1px; 111 | background: #eee; 112 | } 113 | tbody tr:hover td, 114 | tbody tr:hover th { 115 | background: #eee; 116 | } 117 | pre { 118 | margin: 1em 0 0; 119 | } 120 | pre, 121 | textarea, 122 | input, 123 | select { 124 | font: 14px/1.25 'Roboto', Verdana, Arial, Helvetica, sans-serif; 125 | } 126 | input[type=image] { 127 | vertical-align: middle; 128 | } 129 | input.default { 130 | box-shadow: 1px 1px 1px #777; 131 | } 132 | input.required { 133 | box-shadow: 1px 1px 1px red; 134 | } 135 | .block { 136 | display: block; 137 | } 138 | .version { 139 | font-size: 67%; 140 | padding: 0 3px; 141 | color: #777; 142 | } 143 | .js .hidden, 144 | .nojs .jsonly { 145 | display: none; 146 | } 147 | .js .column { 148 | position: absolute; 149 | margin-top: -.27em; 150 | padding: .27em 1ex .3em 0; 151 | background: #ddf5ff; 152 | } 153 | .nowrap td, 154 | .nowrap th, 155 | td.nowrap { 156 | white-space: pre; 157 | } 158 | .wrap td { 159 | white-space: normal; 160 | } 161 | .error { 162 | color: red; 163 | background: #fee; 164 | } 165 | .error b { 166 | font-weight: normal; 167 | background: #fff; 168 | } 169 | .message { 170 | color: green; 171 | background: #efe; 172 | } 173 | .error, 174 | .message { 175 | margin: 1em 20px 0 0; 176 | padding: .5em .8em; 177 | } 178 | .char { 179 | color: #007f00; 180 | } 181 | .date { 182 | color: #7f007f; 183 | } 184 | .enum { 185 | color: #007f7f; 186 | } 187 | .binary { 188 | color: red; 189 | } 190 | .odd td { 191 | background: transparent; 192 | } 193 | .js .checkable .checked td, 194 | .js .checkable .checked th { 195 | background: #ddf; 196 | } 197 | .time { 198 | font-size: 70%; 199 | color: silver; 200 | } 201 | .function { 202 | text-align: right; 203 | } 204 | .number { 205 | text-align: right; 206 | } 207 | .datetime { 208 | text-align: right; 209 | } 210 | .type { 211 | width: 15ex; 212 | width: auto\9; 213 | } 214 | .options select { 215 | width: 20ex; 216 | width: auto\9; 217 | } 218 | .view { 219 | font-style: italic; 220 | } 221 | .active { 222 | font-weight: bold; 223 | } 224 | .sqlarea { 225 | width: 98%; 226 | } 227 | .icon { 228 | width: 18px; 229 | height: 18px; 230 | background-color: navy; 231 | } 232 | .icon:hover { 233 | background-color: red; 234 | } 235 | .size { 236 | width: 6ex; 237 | } 238 | .help { 239 | cursor: help; 240 | } 241 | .pages { 242 | position: fixed; 243 | bottom: 0; 244 | left: 21em; 245 | padding: 5px; 246 | border: 1px solid #999; 247 | background: #f1f1f1; 248 | } 249 | .links a { 250 | margin-right: 20px; 251 | white-space: nowrap; 252 | } 253 | .logout { 254 | position: absolute; 255 | top: 0; 256 | right: 0; 257 | margin-top: .5em; 258 | } 259 | .loadmore { 260 | margin-left: 1ex; 261 | } 262 | #menu { 263 | position: absolute; 264 | top: -1em; 265 | left: 0; 266 | width: 19em; 267 | margin: 10px 0 0; 268 | padding: 0 0 30px 0; 269 | background: #f1f1f1; 270 | } 271 | #menu p, #logins, #tables { 272 | margin: 0; 273 | padding: .8em 1em; 274 | border-bottom: 1px solid #c7c7c7; 275 | } 276 | #dbs { 277 | overflow: hidden; 278 | } 279 | #logins, 280 | #tables { 281 | overflow: auto; 282 | white-space: nowrap; 283 | } 284 | #logins a, 285 | #tables a, 286 | #tables span { 287 | background: transparent; 288 | } 289 | #content { 290 | margin: 2em 0 0 21em; 291 | padding: 10px 20px 20px 0; 292 | } 293 | #lang { 294 | line-height: 1.8em; 295 | position: absolute; 296 | top: 0; 297 | left: 0; 298 | padding: .3em 1em; 299 | } 300 | #breadcrumb { 301 | font-size: 12px; 302 | line-height: 1.8em; 303 | position: absolute; 304 | top: 8px; 305 | left: 27em; 306 | height: 2em; 307 | margin: 0 0 0 0; 308 | padding: 0 1em; 309 | white-space: nowrap; 310 | background: transparent; 311 | } 312 | #h1 { 313 | font-style: normal; 314 | text-decoration: none; 315 | color: #f44; 316 | } 317 | #version { 318 | font-size: 67%; 319 | color: red; 320 | } 321 | #schema { 322 | position: relative; 323 | margin-left: 60px; 324 | -webkit-user-select: none; 325 | -moz-user-select: none; 326 | } 327 | #schema .table { 328 | position: absolute; 329 | padding: 0 2px; 330 | cursor: move; 331 | border: 1px solid silver; 332 | } 333 | #schema .references { 334 | position: absolute; 335 | } 336 | #help { 337 | font-family: monospace; 338 | position: absolute; 339 | z-index: 1; 340 | padding: 5px; 341 | border: 1px solid #999; 342 | background: #eee; 343 | } 344 | .rtl h2 { 345 | margin: 0 -18px 20px 0; 346 | } 347 | .rtl p, 348 | .rtl table, 349 | .rtl .error, 350 | .rtl .message { 351 | margin: 1em 0 0 20px; 352 | } 353 | .rtl .logout { 354 | right: auto; 355 | left: 0; 356 | } 357 | .rtl #content { 358 | margin: 2em 21em 0 0; 359 | padding: 10px 0 20px 20px; 360 | } 361 | .rtl #breadcrumb { 362 | right: 21em; 363 | left: auto; 364 | margin: 0 -18px 0 0; 365 | } 366 | .rtl #lang, 367 | .rtl #menu { 368 | right: 0; 369 | left: auto; 370 | } 371 | @media all and (max-device-width:880px) { 372 | .pages { 373 | left: auto; 374 | } 375 | #menu { 376 | position: static; 377 | width: auto; 378 | } 379 | #content { 380 | margin-left: 10px; 381 | } 382 | #lang { 383 | position: static; 384 | border-top: 1px solid #999; 385 | } 386 | #breadcrumb { 387 | left: auto; 388 | } 389 | .rtl #content { 390 | margin-right: 10px; 391 | } 392 | .rtl #breadcrumb { 393 | right: auto; 394 | } 395 | } 396 | @media print { 397 | #lang, 398 | #menu { 399 | display: none; 400 | } 401 | #content { 402 | margin-left: 1em; 403 | } 404 | #breadcrumb { 405 | left: 1em; 406 | } 407 | .nowrap td, 408 | .nowrap th, 409 | td.nowrap { 410 | white-space: normal; 411 | } 412 | } 413 | .jush { 414 | color: black; 415 | } 416 | .jush-htm_com, 417 | .jush-com, 418 | .jush-com_code, 419 | .jush-one, 420 | .jush-php_doc, 421 | .jush-php_com, 422 | .jush-php_one, 423 | .jush-js_one, 424 | .jush-js_doc { 425 | color: gray; 426 | } 427 | .jush-php, 428 | .jush-php_new, 429 | .jush-php_fun { 430 | color: #003; 431 | background-color: #fff0f0; 432 | } 433 | .jush-php_quo, 434 | .jush-quo, 435 | .jush-quo_one, 436 | .jush-php_eot, 437 | .jush-apo, 438 | .jush-sql_apo, 439 | .jush-sqlite_apo, 440 | .jush-sql_quo, 441 | .jush-sql_eot { 442 | color: green; 443 | } 444 | .jush-php_apo { 445 | color: #009f00; 446 | } 447 | .jush-php_quo_var, 448 | .jush-php_var, 449 | .jush-sql_var { 450 | font-style: italic; 451 | } 452 | .jush-php_apo .jush-php_quo_var, 453 | .jush-php_apo .jush-php_var { 454 | font-style: normal; 455 | } 456 | .jush-php_halt2 { 457 | color: black; 458 | background-color: white; 459 | } 460 | .jush-tag_css, 461 | .jush-att_css .jush-att_quo, 462 | .jush-att_css .jush-att_apo, 463 | .jush-att_css .jush-att_val { 464 | color: black; 465 | background-color: #ffffe0; 466 | } 467 | .jush-tag_js, 468 | .jush-att_js .jush-att_quo, 469 | .jush-att_js .jush-att_apo, 470 | .jush-att_js .jush-att_val, 471 | .jush-css_js { 472 | color: black; 473 | background-color: #f0f0ff; 474 | } 475 | .jush-tag, 476 | .jush-xml_tag { 477 | color: navy; 478 | } 479 | .jush-att, 480 | .jush-xml_att, 481 | .jush-att_js, 482 | .jush-att_css, 483 | .jush-att_http { 484 | color: teal; 485 | } 486 | .jush-att_quo, 487 | .jush-att_apo, 488 | .jush-att_val { 489 | color: purple; 490 | } 491 | .jush-ent { 492 | color: purple; 493 | } 494 | .jush-js_key, 495 | .jush-js_key .jush-quo, 496 | .jush-js_key .jush-apo { 497 | color: purple; 498 | } 499 | .jush-js_reg { 500 | color: navy; 501 | } 502 | .jush-php_sql .jush-php_quo, 503 | .jush-php_sql .jush-php_apo, 504 | .jush-php_sqlite .jush-php_quo, 505 | .jush-php_sqlite .jush-php_apo, 506 | .jush-php_pgsql .jush-php_quo, 507 | .jush-php_pgsql .jush-php_apo, 508 | .jush-php_mssql .jush-php_quo, 509 | .jush-php_mssql .jush-php_apo, 510 | .jush-php_oracle .jush-php_quo, 511 | .jush-php_oracle .jush-php_apo { 512 | background-color: #ffbbb0; 513 | } 514 | .jush-bac, 515 | .jush-php_bac, 516 | .jush-bra, 517 | .jush-mssql_bra, 518 | .jush-sqlite_quo { 519 | color: red; 520 | } 521 | .jush-num, 522 | .jush-clr { 523 | color: #007f7f; 524 | } 525 | .jush a { 526 | color: navy; 527 | } 528 | .jush a.jush-help { 529 | cursor: help; 530 | } 531 | .jush-sql a, 532 | .jush-sql_code a, 533 | .jush-sqlite a, 534 | .jush-pgsql a, 535 | .jush-mssql a, 536 | .jush-oracle a, 537 | .jush-simpledb a { 538 | font-weight: bold; 539 | } 540 | .jush-php_sql .jush-php_quo a, 541 | .jush-php_sql .jush-php_apo a { 542 | font-weight: normal; 543 | } 544 | .jush-tag a, 545 | .jush-att a, 546 | .jush-apo a, 547 | .jush-quo a, 548 | .jush-php_apo a, 549 | .jush-php_quo a, 550 | .jush-php_eot2 a { 551 | color: inherit; 552 | color: expression(parentNode.currentStyle.color); 553 | } 554 | a.jush-custom:link, 555 | a.jush-custom:visited { 556 | font-weight: normal; 557 | color: inherit; 558 | color: expression(parentNode.currentStyle.color); 559 | } 560 | .jush p { 561 | margin: 0; 562 | } 563 | -------------------------------------------------------------------------------- /adminer/themes/paranoiq.css: -------------------------------------------------------------------------------- 1 | /** 2 | * Alternative style for Adminer. Zrobeno 7.4.2011 3 | * @author Vlasta Neubauer [@paranoiq] 4 | */ 5 | 6 | /* -- fonts ----------------------------------------------------------------- */ 7 | body { 8 | font-size: 11pt; } 9 | body, select, option, optgroup, button { 10 | font-family: Calibri, Arial, Helvetica, sans-serif; } /* IE6 */ 11 | input[type='submit'], input[type='reset'], input[type='button'], input[type='file'], 12 | input[name$='[comment]'], input[name='Comment'] { 13 | font-family: Calibri, Arial, Helvetica, sans-serif; } 14 | input, textarea, pre, code, samp, kbd, var { 15 | font-family: Consolas, "Courier New", monospace; 16 | font-size: 10pt; } /* FF3 */ 17 | 18 | 19 | /* -- links ----------------------------------------------------------------- */ 20 | a { 21 | color: #007; } 22 | a:visited { 23 | color: #707; } 24 | a:hover, input[name='logout']:hover { 25 | color: #700; 26 | text-decoration: none; } 27 | h1 a:visited { 28 | color: #007; } 29 | input[name='logout'] { 30 | position: absolute; 31 | bottom: 10px; 32 | left: 33%; } 33 | input[name='logout'] { /* IEx */ 34 | %position: static; 35 | %background: transparent; 36 | %text-decoration: underline; 37 | %font-weight: bold; 38 | %cursor: pointer; 39 | %border: none; 40 | %margin: 0; 41 | %padding: 0; 42 | %color: #007; 43 | } 44 | 45 | 46 | /* -- tables ---------------------------------------------------------------- */ 47 | table { 48 | margin: 12px 12px 12px 0; 49 | border: 1px #DDD solid; 50 | border-collapse: collapse; } 51 | td, th { 52 | background-color: #FFF; 53 | padding: 1px 2px; 54 | border-left: 1px #DDD dotted; 55 | border-width: 1px 0px 0px 1px; } 56 | th { 57 | text-align: left !important; } 58 | tr:first-child td, tr:first-child th { 59 | border-top-width: 0; } 60 | td:first-child, th:first-child { 61 | border-left-width: 0; } 62 | thead td, thead th { 63 | background-color: #EEE; 64 | border: none; 65 | border-bottom: 1px #DDD solid; } 66 | .nowrap tr:nth-child(2n) td, .nowrap tr:nth-child(2n) th { 67 | background-color: #DEF; } 68 | .odd td, .odd th { 69 | background-color: #DEF; } /* IEx */ 70 | tr.selected td, tr.selected th { 71 | background-color: #ABC !important; } 72 | tr:hover td, tr:hover th { 73 | background-color: #BCD !important; } /* WTF? */ 74 | thead tr:hover td, thead tr:hover th { 75 | background-color: #EEE !important; } 76 | 77 | 78 | /* -- forms ----------------------------------------------------------------- */ 79 | fieldset { 80 | background-color: #DEF; 81 | border: none; 82 | %padding-left: 8px; 83 | %border: 1px #DDD solid; /* IEx */ 84 | %background-repeat: repeat-x; /* IE8 */ 85 | %background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA8AAAAPCAIAAAC0tAIdAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAACJJREFUKFNj/P//PwPxAKiaeMBAvFKQK0ZVY4TAaJhgJgoAj5t2py3lrtoAAAAASUVORK5CYII='); } 86 | legend { 87 | color: #000; 88 | background-color: #FFF; 89 | %background-color: transparent; /* IEx */ 90 | padding: 0px 4px; } 91 | legend a:visited { 92 | color: #000; } /* IE6+7 */ 93 | input[name='limit'], input[name*='length'] { 94 | width: 3em; } 95 | input[name='text_length'] { 96 | width: 5em; } /* ~FF3 */ 97 | select + input, select + select { 98 | margin-left: 2px; } 99 | input + label input, select + label input { 100 | margin-left: 4px; } 101 | td input[type='checkbox']:first-child, td input[type='radio']:first-child { 102 | margin-left: 2px; } 103 | label:hover { 104 | text-decoration: underline; } 105 | fieldset div { 106 | margin-bottom: 2px; } 107 | input[name='Comment'] { /* !!! */ 108 | width: 24em; } 109 | input[name='Auto_increment'] { /* !!! */ 110 | width: 6em; } 111 | textarea[name='definition'] { 112 | height: 480px; } 113 | input[name$='[comment]'] { 114 | width: 24em; } 115 | input[type='text'], textarea { 116 | border: 1px #DDD solid; } 117 | input[type='submit'], input[type='reset'], input[type='submit'], button, input[type='checkbox'], label, select, option { 118 | cursor: pointer; } 119 | .minifieldset { 120 | display: inline-block; 121 | padding: 2px 4px; 122 | background-color: #DEF; 123 | -moz-border-radius: 5px; 124 | -webkit-border-radius: 5px; 125 | border-radius: 5px; } 126 | .minifieldset * { 127 | margin: 0; } 128 | 129 | 130 | /* -- other ----------------------------------------------------------------- */ 131 | .error { 132 | padding: 8px; } 133 | .message { 134 | padding: 8px; 135 | color: #000; 136 | background: #DDD; } 137 | .jush-sql { 138 | padding: 2px 4px; 139 | margin-right: 4px; 140 | outline: 1px #BBB dashed; 141 | font-size: 9pt; } 142 | code { 143 | background: transparent; } 144 | .nowrap td i { 145 | color: #AAA; } 146 | 147 | /* -- structure ------------------------------------------------------------- */ 148 | #content { 149 | margin: 28px 0 0 192px; 150 | padding: 10px 20px 20px 0; } 151 | h3 { 152 | margin: 20px 0; } 153 | 154 | #lang { 155 | height: 23px; 156 | width: 180px; 157 | display: block; 158 | padding: 1px 0px; 159 | text-align: center; 160 | background-color: #EEE; 161 | line-height: 1.25em; } 162 | #lang select { 163 | font-size: 8pt; } 164 | 165 | #breadcrumb { 166 | margin: 0; 167 | height: 21px; 168 | display: block; 169 | left: 192px; 170 | background-color: #DDD; 171 | padding: 2px 12px; 172 | line-height: 1.25em; } 173 | 174 | #menu { 175 | margin: 0; 176 | padding-bottom: 50px; 177 | top: 38px; 178 | width: 180px; 179 | background-color: #DEF; } 180 | #menu p, #logins, #tables { 181 | padding-left: 8px; 182 | font-size: 10pt; 183 | border-bottom: none; } 184 | #logins a, #tables a, #tables span { 185 | background: #DEF; 186 | } 187 | 188 | h1 { 189 | margin-top: 8px; 190 | color: #000; 191 | padding: 5px; 192 | text-align: center; 193 | font-size: 14pt; 194 | border-bottom: none; 195 | background: transparent; 196 | font-style: italic; 197 | text-shadow: #FFF 2px 2px 0px; } 198 | h1 #h1 { 199 | color: #000; 200 | font-weight: bold; } 201 | h1 #h1:hover { 202 | text-decoration: underline; } 203 | h1 #h1:visited { 204 | color: #000; } 205 | 206 | h2 { 207 | margin: 0; 208 | margin-bottom: 12px; 209 | padding: 6px 18px; 210 | background-color: #CDE; 211 | border-bottom: none; 212 | color: #000; 213 | text-shadow: #FFF 0px 0px 4px; } 214 | 215 | #schema { 216 | margin: 1.5em 0 0 220px; } 217 | #schema .table { 218 | border: 1px solid #DDD; 219 | background-color: #DEF; 220 | padding: 0 2px; } 221 | 222 | 223 | /* -- GUI adjustments ------------------------------------------------------- */ 224 | .js .hidden { 225 | display: inline; } 226 | .js td.hidden, .js input.hidden { 227 | display: none; } 228 | legend a { 229 | color: #000; 230 | text-decoration: none; 231 | cursor: default; } 232 | legend a:hover { 233 | color: black; } 234 | 235 | select[name^="columns"] optgroup:last-child option:nth-child(3)::before { 236 | content: "count "; } 237 | select[name$="[collation]"] { 238 | max-width: 120px; } 239 | 240 | .logout a:first-child, p a { 241 | margin-right: 8px; } 242 | #tables a, #breadcrumb a, p.pages a, p code + a { 243 | margin-right: 0; } 244 | .logout a::before, p a::before { 245 | content: '» '; } 246 | #tables a::before, #breadcrumb a::before, p.pages a::before, p code + a::before { 247 | content: ''; } 248 | #form + p a:first-child::before { 249 | content: ''; } 250 | 251 | 252 | /* -- eye candy ------------------------------------------------------------- */ 253 | fieldset, legend, h2, .error, .message { 254 | -moz-border-radius: 5px; 255 | border-radius: 5px; } 256 | #breadcrumb, #lang, #menu { 257 | -moz-border-radius-bottomright: 5px; 258 | border-bottom-right-radius: 5px; } 259 | #breadcrumb { 260 | -moz-border-radius-bottomleft: 5px; 261 | border-bottom-left-radius: 5px; } 262 | #menu { 263 | -moz-border-radius-topright: 5px; 264 | border-top-right-radius: 5px; } 265 | fieldset, h2, .error, #breadcrumb, #lang, #menu, #breadcrumb, #menu { 266 | x-moz-box-shadow: 1px 1px 3px #DDD; 267 | xbox-shadow: 1px 1px 3px #DDD; } 268 | fieldset table { 269 | x-moz-box-shadow: none; 270 | xbox-shadow: none; } 271 | 272 | 273 | /* -- printing -------------------------------------------------------------- */ 274 | @media print { 275 | #lang, #menu { 276 | display: none; } 277 | #content { 278 | margin-left: 1em; } 279 | #breadcrumb { 280 | left: 1em; 281 | background: none; 282 | border-bottom: 1px silver dashed; 283 | box-shadow: none; } 284 | h2 { 285 | background: none; 286 | box-shadow: none; } 287 | p.tabs { 288 | display: none; } 289 | } 290 | 291 | -------------------------------------------------------------------------------- /adminer/themes/pepa-linha.css: -------------------------------------------------------------------------------- 1 | /* 2 | * Theme by Pepa Linha [http://webdream.cz] 3 | * JUSH color syntax inspired by NetBeans 4 | * @version 0.2 (February 2014) 5 | */ 6 | 7 | html, 8 | body { 9 | height: 100%; 10 | } 11 | 12 | body { 13 | font-family: "Segoe UI", Arial, sans-serif; 14 | } 15 | 16 | h1 { 17 | margin: 0; 18 | padding: 0; 19 | background: none; 20 | border: 0; 21 | } 22 | 23 | h2 { 24 | margin: 0; 25 | padding: 0; 26 | background: none; 27 | border: 0; 28 | font-family: "Segoe UI Light", "Segoe UI", Arial, sans-serif; 29 | font-size: 32px; 30 | font-weight: normal; 31 | color: #34567c; 32 | border-bottom: 1px solid #ebebeb; 33 | padding-bottom: 6px; 34 | margin-bottom: 40px; 35 | } 36 | 37 | .rtl h2 { 38 | margin: 0; 39 | margin-bottom: 40px; 40 | } 41 | 42 | h3 { 43 | font-size: 22px; 44 | margin: 0 0 10px; 45 | border-bottom: 1px solid #ebebeb; 46 | padding: 0; 47 | padding-bottom: 6px; 48 | } 49 | 50 | p { 51 | margin: 0; 52 | margin-bottom: 15px; 53 | } 54 | 55 | a { 56 | color:#2e84e4; 57 | text-decoration:none; 58 | } 59 | 60 | a:visited { 61 | color: #34567c; 62 | } 63 | 64 | a:link:hover, 65 | a:visited:hover { 66 | color: #2e84e4; 67 | text-decoration:underline; 68 | } 69 | 70 | /* otravuje pri prochazeni formulare klavesama */ 71 | a[href*=charsets] { 72 | display: none; 73 | } 74 | 75 | table { 76 | border: 0; 77 | margin: 0; 78 | margin-top: 15px; 79 | } 80 | 81 | th, td { 82 | border: 0; 83 | padding: 6px; 84 | } 85 | 86 | th { 87 | background: none; 88 | color: #34567c; 89 | font-weight: normal; 90 | } 91 | 92 | tbody tr:hover td, 93 | tbody tr:hover th { 94 | background: none; 95 | } 96 | 97 | table:not(.checkable) th { 98 | min-width: 120px; 99 | } 100 | 101 | thead td, 102 | thead th { 103 | background: #34567c; 104 | } 105 | 106 | thead td, 107 | thead td a, 108 | thead td a:link:hover, 109 | thead td a:visited, 110 | thead td a:visited:hover, 111 | thead th, 112 | thead th a, 113 | thead th a:link:hover, 114 | thead th a:visited, 115 | thead th a:visited:hover { 116 | color: #fff; 117 | } 118 | 119 | table.checkable, 120 | p.links + table, 121 | pre + table, 122 | #edit-fields, 123 | p + table, 124 | h3 + table { 125 | border: 1px solid #bbb; 126 | margin-bottom: 15px; 127 | } 128 | 129 | table.checkable tbody tr:hover td, 130 | table.checkable tbody tr:hover th { 131 | background: #ffffd9; 132 | } 133 | 134 | .js .checkable .checked td, 135 | .js .checkable .checked th { 136 | background: #fbfabc; 137 | } 138 | 139 | .js .checkable thead .checked td, 140 | .js .checkable thead .checked th { 141 | background: #bfb008; 142 | } 143 | 144 | .odd th, 145 | .odd td { 146 | background: #f5f5f5; 147 | } 148 | 149 | fieldset { 150 | display: inline-block; 151 | padding: 15px; 152 | padding-top: 5px; 153 | margin: 0 0 15px; 154 | border: 0; 155 | background: #f5f5f5; 156 | } 157 | 158 | fieldset select { 159 | margin-right: 5px; 160 | } 161 | 162 | fieldset input[type=button], 163 | fieldset input[type=submit], 164 | fieldset p { 165 | margin-bottom: 0; 166 | } 167 | 168 | fieldset div p { 169 | margin-top: 10px; 170 | } 171 | 172 | legend { 173 | display: inline-block; 174 | padding: 6px 15px; 175 | margin: 0 0 0 -15px; 176 | background: #f5f5f5; 177 | font-family: "Segoe UI Semibold", "Segoe UI", Arial, sans-serif; 178 | } 179 | 180 | legend a, 181 | legend a:link:hover { 182 | color: #000; 183 | text-decoration: underline; 184 | } 185 | 186 | code { 187 | background: none; 188 | } 189 | 190 | p code, 191 | pre code, 192 | pre[contenteditable=true] { 193 | padding: 10px 15px; 194 | display: block; 195 | font-size: 17px; 196 | margin-bottom: 15px; 197 | } 198 | 199 | p code + a, 200 | p code + a:link:hover, 201 | p code + a:visited:hover { 202 | margin-left: 15px; 203 | position: relative; 204 | top: -20px; 205 | color: #000; 206 | font-size: 12px; 207 | text-decoration: underline; 208 | text-transform: lowercase; 209 | } 210 | 211 | #content { 212 | margin: 0; 213 | margin-left: 400px; 214 | margin-right: 54px; 215 | padding: 0; 216 | padding-top: 50px; 217 | } 218 | 219 | #content > p { 220 | margin-bottom: 15px; 221 | } 222 | 223 | .rtl #content { 224 | margin: 0; 225 | margin-left: 54px; 226 | margin-right: 400px; 227 | padding: 0; 228 | padding-top: 50px; 229 | } 230 | 231 | #menu { 232 | width: 347px; 233 | border-right: 1px solid #dae8fa; 234 | box-shadow: inset -1px 0 0 #fff; 235 | margin: 0; 236 | padding: 0; 237 | top: 0; 238 | background: #f4f8fd; 239 | bottom: 0; 240 | position: fixed; 241 | padding: 0 15px; 242 | box-sizing: border-box; 243 | } 244 | 245 | #menu h1 { 246 | background: none left top no-repeat; 247 | background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAD0AAAAyCAIAAABgVkRrAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyJpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMC1jMDYxIDY0LjE0MDk0OSwgMjAxMC8xMi8wNy0xMDo1NzowMSAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNS4xIFdpbmRvd3MiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6NTA0RDI5NkM5QkRGMTFFMzg4ODNEQjEzNjY5NzJEMEEiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6NTA0RDI5NkQ5QkRGMTFFMzg4ODNEQjEzNjY5NzJEMEEiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDo1MDREMjk2QTlCREYxMUUzODg4M0RCMTM2Njk3MkQwQSIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDo1MDREMjk2QjlCREYxMUUzODg4M0RCMTM2Njk3MkQwQSIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PnG4emkAAASXSURBVHja7Fk9aNtAFL6EDKKUoqGDySRKB1FC8dDBdCgeOmQoIUMG0yGE0EFT8dDBUwidPJQQQgcNpYROGjKI0sFDB9GhaMhgSgcPpWgqHjqYYsINJfQ7PfV0tmX9JI4Sgx+HI8f26bt3733fe6elIf/LbqwdHbJWS1wYBrMstrXJVg36ZJnNhQWBWMB9k+215gq3tDeHBH3pRseJtC8ee2ezEzd62+ncDH/DhS+ttC88qbMPDntaj952uyvXD3q7ETvyyE77pq5HFz9614r7V8C2GnBezBgp9tGNl3ffzIjvwZ9B//dA7Mz3YPLTyl29UhE+MI0KW9YKh2yjwQZichEAjsNu6WlUqNqkvwHUO+0BJeD2gn4hJFXTwAIw6jUzYxlwHkCTvWqy1+0Ct7FtsPh/3Ofc9brOJ5+8ezHr9gKMcGpWf2SK8bhKk48sA1kIOiODmzc2c8U0DLrzwhI5ypjA3fsZtNrOgPP4y5pmGJXamqHd1kQMTIkENYpwEfQHEW7GsGkYZse393ewb+Y9IwE0PJcOejQ2pFgK3Li3BI14hZM269XKaiXPVPodHUOs6l48o/+t5wO038OcQGztHzd31uPfUEgQdCQi3JkfumLLHa9LoK2tunPQtJ6v5wQ9zWoPzebupms34QKxmZNJAugIDzJE+V4rbTrDSMYtr3AD+H5WFIfZ0lIFPu50otiF7zfW2dlgquKccTFWRxYQ8wlFJOVTdc2gAChq/V99vxdgD7O5CIBO/Yi/P3vsUY2dOOxBdSrzIBm2dxJwq+hlaiId9dua5OlEv/IhH0vKvAYXfvUjvUTFB2STeinJu91Oxo3Eh58onwRXcB7zWkGj/Maa9203+9soPIyWEKBEkQdc8veo+sS4wQkYzV1Bi+A1Ee5DnhO33BxsSw1/wszGPHkXmqI7yIQzPvnvhPqEFjAWtSq7j7n2YplwSctVV8F/FXazbN76nQXu68btfe3Odmqwahl5Ca6tel0UVdnVc6pRBX/JkrgYn0RCY0cdAMhYvGYxHbEklbJ++FoqD8LTUiwTlZLEha55WKOmSybWTCXD1eJG8dnc4XAYqmdgmoRFyp/ZqqHbgMiD8qGXZeAOs1RD9YyhBgBVTgL3cMTHwKd2xyUL50qmTI5p/oK/F7jnEjeycLZTFz02SrKlaSPGbe0fOx+9mbTGcMHhe/fwuFMGn4Dy7BMPA3oBGkZrbIDgcp9JgK37YYtZjmSuqApH9yPRcTp+TM939THOpkaYroMguRuSE14tbuegif11vS58poYm7i1vn6fdxF6hMoNk4leIvTJ0B1FhPQ/PxM45eZ2HGjkY8jHXqptghGJJqqmKVHn1oCr4k93xgr8XuOcZ9zmf7dQym68Et6QFcFaBk7EsQ5fdfuteHW7xPM3asyVh05EkxFJITMHuGDUCukxwvOz3YI31mtWoX7TRXkrDjQhBLeFOHBtQQ6n/f8TDlAd/6mNBP7xO7Ecbz2qNjfrl6qoU3Mr5Qa4j9yyLHqZd7jwjL241QQFdPiJTdT7RsBuapslzi5mqVSHcKXYetcZlSelU3P8EGADW25uhkIE0mQAAAABJRU5ErkJggg==); 248 | line-height: 50px; 249 | padding-left: 50px; 250 | padding-top: 9px; 251 | text-transform: lowercase; 252 | margin: 25px 0 10px 16px; 253 | } 254 | 255 | #menu h1 a { 256 | font-style: normal; 257 | } 258 | 259 | #menu h1 .version { 260 | color: #2e84e4; 261 | } 262 | 263 | #menu a { 264 | color: #34567c; 265 | } 266 | 267 | #menu p, #tables { 268 | border: 0; 269 | padding: 0; 270 | } 271 | 272 | #menu #dbs { 273 | background: #fff; 274 | padding: 0 15px 15px; 275 | border: 1px solid #dae8fa; 276 | border-bottom: 0; 277 | box-sizing: border-box; 278 | color: #fff; 279 | } 280 | 281 | #menu #dbs select { 282 | outline: 0; 283 | border-color: rgba(0, 0, 0, 0.1); 284 | width: 100%; 285 | } 286 | 287 | #menu p.links { 288 | margin: 0 0 15px; 289 | border: 1px solid #dae8fa; 290 | border-top: 0; 291 | text-align: center; 292 | display: table; 293 | width: 100%; 294 | box-sizing: border-box; 295 | } 296 | 297 | #menu p.links a { 298 | padding: 8px; 299 | margin: 0; 300 | display: table-cell; 301 | font-size: 12px; 302 | } 303 | 304 | #menu p.links a:hover { 305 | color: #2e84e4; 306 | } 307 | 308 | #menu p.links a.active { 309 | font-weight: normal; 310 | background: #fff; 311 | color: #000; 312 | } 313 | 314 | #content p.links { 315 | margin: -10px 0 15px; 316 | } 317 | 318 | #content p.links a { 319 | padding: 8px; 320 | margin: 0; 321 | display: table-cell; 322 | border: 1px solid #fff; 323 | } 324 | 325 | #content p.links a, 326 | #content p.links a:visited, 327 | #content p.links a:hover { 328 | color: #2e84e4; 329 | } 330 | 331 | #content p.links a.active { 332 | font-weight: normal; 333 | border: 1px solid #2e84e4; 334 | background: #f4f8fd; 335 | } 336 | 337 | #tables { 338 | max-height: 100%; 339 | margin: 32px -15px !important; 340 | position: absolute; 341 | left: 15px; 342 | right: 15px; 343 | bottom: 0; 344 | top: 220px; 345 | overflow: hidden !important; 346 | overflow-y: auto !important; 347 | } 348 | 349 | .rtl #tables { 350 | overflow: hidden !important; 351 | overflow-y: auto !important; 352 | } 353 | 354 | #tables a { 355 | float: right; 356 | padding: 6px 15px; 357 | } 358 | 359 | .rtl #tables a { 360 | float: none; 361 | } 362 | 363 | #tables a[title] { 364 | float: none; 365 | display: block; 366 | } 367 | 368 | .rtl #tables a:first-child, 369 | .rtl #tables br + a { 370 | float: left; 371 | display: block; 372 | margin-left: 15px; 373 | } 374 | 375 | #tables a:hover, 376 | #tables a:hover + a, 377 | #tables a.active, 378 | #tables a.active + a { 379 | background: #fff; 380 | color: #2e84e4; 381 | } 382 | 383 | #tables br { 384 | display: none; 385 | } 386 | 387 | .js .column { 388 | background: #2e84e4; 389 | } 390 | 391 | .js .checked .column { 392 | background: #7b7105; 393 | } 394 | 395 | .pages { 396 | left: 400px; 397 | background: #34567c; 398 | color: #fff; 399 | font-weight: bold; 400 | border: 0; 401 | display: inline-block; 402 | position: static; 403 | } 404 | 405 | .pages a, 406 | .pages a:link, 407 | .pages a:link:hover, 408 | .pages a:visited, 409 | .pages a:visited:hover { 410 | color: #fff; 411 | font-weight: normal; 412 | } 413 | 414 | #breadcrumb { 415 | margin: 0; 416 | left: 400px; 417 | background: none; 418 | padding: 0; 419 | padding-top: 25px; 420 | font-size: 12px; 421 | } 422 | 423 | #breadcrumb a { 424 | color: #aeaeae; 425 | text-decoration: underline; 426 | } 427 | 428 | #breadcrumb, 429 | #breadcrumb a:hover { 430 | color: #666; 431 | } 432 | 433 | .rtl #breadcrumb { 434 | margin: 0; 435 | padding: 0; 436 | padding-top: 25px; 437 | right: 400px; 438 | } 439 | 440 | .logout, 441 | .rtl .logout { 442 | top: 30px; 443 | right: 54px; 444 | margin: 0; 445 | } 446 | 447 | .rtl .logout { 448 | right: auto; 449 | left: 54px; 450 | } 451 | 452 | input:not([type]), 453 | input[type="color"], 454 | input[type="email"], 455 | input[type="number"], 456 | input[type="password"], 457 | input[type="tel"], 458 | input[type="url"], 459 | input[type="text"], 460 | input[type="search"] { 461 | border: 1px solid #bbbbbb; 462 | padding: 6px; 463 | margin: 0; 464 | box-sizing: border-box; 465 | } 466 | 467 | table:not(#table) input:not([type]), 468 | table:not(#table) input[type="color"], 469 | table:not(#table) input[type="email"], 470 | table:not(#table) input[type="number"], 471 | table:not(#table) input[type="password"], 472 | table:not(#table) input[type="tel"], 473 | table:not(#table) input[type="url"], 474 | table:not(#table) input[type="text"], 475 | table:not(#table) input[type="search"] { 476 | min-width: 280px; 477 | } 478 | 479 | input[type=submit], 480 | input[type=button] { 481 | border: 0; 482 | padding: 7px 12px; 483 | cursor: pointer; 484 | outline: 0; 485 | box-shadow: none; 486 | background: #2e84e4; 487 | color: #fff; 488 | font-weight: bold; 489 | margin-bottom: 5px; 490 | transition: background .4s ease; 491 | } 492 | 493 | input[type=submit][disabled], 494 | input[type=button][disabled] { 495 | background: #aeaeae !important; 496 | color: #e9e9e9; 497 | cursor: not-allowed; 498 | } 499 | 500 | input[type=submit]:hover, 501 | input[type=button]:hover, 502 | input[type=submit]:focus, 503 | input[type=button]:focus { 504 | background: #34567c; 505 | } 506 | 507 | .logout input[type=submit] { 508 | background: #f40204; 509 | } 510 | 511 | .logout input[type=submit]:hover { 512 | background: #d50204; 513 | } 514 | 515 | input.default, 516 | input.default { 517 | box-shadow: none; 518 | background: #2e84e4; 519 | color: #fff; 520 | font-weight: bold; 521 | } 522 | 523 | select { 524 | box-sizing: border-box; 525 | margin: 0; 526 | padding: 6px 0; 527 | border: 1px solid #bbbbbb; 528 | } 529 | 530 | label { 531 | cursor: pointer; 532 | margin-right: 6px; 533 | } 534 | 535 | .error, 536 | .message { 537 | margin: 0; 538 | margin-bottom: 15px; 539 | } 540 | 541 | #logins a, 542 | #tables a, 543 | #tables span { 544 | background: none; 545 | } 546 | 547 | #form > p { 548 | margin-bottom: 15px; 549 | } 550 | 551 | #schema .table { 552 | padding: 6px; 553 | } 554 | 555 | #schema .table a { 556 | display: block; 557 | margin: -6px; 558 | margin-bottom: 6px; 559 | padding: 6px; 560 | color: #fff; 561 | background: #34567c; 562 | } 563 | 564 | #schema .table br { 565 | display: none; 566 | } 567 | 568 | #schema .table span { 569 | display: block; 570 | margin-bottom: 1px solid #f5f5f5; 571 | } 572 | 573 | #lang { 574 | position: fixed; 575 | top: 55px; 576 | right: 100%; 577 | z-index: 10; 578 | margin-right: -340px; 579 | line-height: normal; 580 | padding: 0; 581 | left: auto; 582 | font-size: 0; 583 | } 584 | 585 | #lang select { 586 | font-size: 12px; 587 | padding: 0; 588 | text-align: right; 589 | border: 0; 590 | background: none; 591 | -webkit-appearance: none; 592 | -moz-appearance: none; 593 | appearance: none; 594 | cursor: pointer; 595 | outline: 0; 596 | } 597 | 598 | #lang select option { 599 | text-align: right; 600 | } 601 | 602 | .rtl #lang { 603 | margin-right: 0; 604 | left: 100%; 605 | margin-left: -261px; 606 | right: auto; 607 | } 608 | 609 | .jush { 610 | color: #000; 611 | } 612 | 613 | .jush a { 614 | color: #3939f2; 615 | } 616 | 617 | .jush-sql a, 618 | .jush-sql_code a, 619 | .jush-sqlite a, 620 | .jush-pgsql a, 621 | .jush-mssql a, 622 | .jush-oracle a, 623 | .jush-simpledb a { 624 | font-weight: normal; 625 | } 626 | 627 | .jush-bac, 628 | .jush-php_bac, 629 | .jush-bra, 630 | .jush-mssql_bra, 631 | .jush-sqlite_quo { 632 | color: #009900; 633 | } 634 | 635 | .jush-php_quo, 636 | .jush-quo, 637 | .jush-quo_one, 638 | .jush-php_eot, 639 | .jush-apo, 640 | .jush-sql_apo, 641 | .jush-sqlite_apo, 642 | .jush-sql_quo, 643 | .jush-sql_eot { 644 | color: #ce7b00; 645 | } 646 | 647 | .jush-num, 648 | .jush-clr { 649 | color: #000; 650 | } 651 | 652 | @media print { 653 | .logout { 654 | display: none; 655 | } 656 | 657 | #breadcrumb { 658 | position: static; 659 | } 660 | 661 | #content { 662 | margin: 0; 663 | } 664 | } 665 | -------------------------------------------------------------------------------- /adminer/themes/pilot.css: -------------------------------------------------------------------------------- 1 | #menu { 2 | margin: 0; 3 | position: absolute; 4 | top: 0; 5 | bottom: 0; 6 | left: 0; 7 | width: 270px; 8 | padding: 0; 9 | border-right: 1px #ccc solid; 10 | } 11 | 12 | #menu p { 13 | margin: 0; 14 | padding: 4px 10px; 15 | } 16 | 17 | #menu p select { 18 | width: 100%; 19 | } 20 | 21 | #menu h1 { 22 | height: 25px; 23 | padding: 0 10px; 24 | margin: 0; 25 | line-height: 20px; 26 | display: block; 27 | } 28 | 29 | #menu h1 a { 30 | font-size: 13px; 31 | } 32 | 33 | #menu h1 .version { 34 | font-size: 9px; 35 | } 36 | 37 | #menu * { 38 | margin: 0; 39 | padding: 0; 40 | } 41 | 42 | #tables { 43 | margin: 0; 44 | position: absolute; 45 | top: 118px; 46 | bottom: 0; 47 | left: 0; 48 | padding: 0; 49 | overflow-x: hidden; 50 | overflow-y: auto; 51 | width: 270px; 52 | } 53 | 54 | #logins li, #tables li { 55 | position: relative; 56 | height: 23px; 57 | } 58 | 59 | #logins a { 60 | display: block; 61 | margin-top: 5px; 62 | padding: 0 10px; 63 | } 64 | 65 | #tables a { 66 | display: block; 67 | margin: 0; 68 | padding: 0; 69 | text-decoration: none; 70 | margin-top: 5px; 71 | } 72 | 73 | #tables a[href*="select"] { 74 | position: absolute; 75 | left: 10px; 76 | width: 50px; 77 | } 78 | 79 | #tables a[href*="table"] { 80 | position: absolute; 81 | left: 65px; 82 | width: 200px; 83 | } 84 | 85 | #lang { 86 | top: -1px; 87 | right: 2px; 88 | left: auto; 89 | margin: 0; 90 | padding: 0; 91 | z-index: 10; 92 | } 93 | 94 | #content { 95 | margin: 0; 96 | padding: 0 10px 10px 10px; 97 | position: absolute; 98 | left: 270px; 99 | right: 0; 100 | top: 82px; 101 | bottom: 0; 102 | overflow: auto; 103 | } 104 | 105 | #content h2 { 106 | display: block; 107 | margin: 0; 108 | padding: 0; 109 | height: 55px; 110 | position: fixed; 111 | left: 270px; 112 | right: 0; 113 | top: 26px; 114 | line-height: 55px; 115 | padding-left: 10px; 116 | border-bottom: 1px solid #ccc; 117 | } 118 | 119 | #breadcrumb { 120 | position: fixed; 121 | left: 270px; 122 | right: 0; 123 | top: 0; 124 | height: 25px; 125 | margin: 0; 126 | border-bottom: 1px solid #999; 127 | } -------------------------------------------------------------------------------- /adminer/themes/price.css: -------------------------------------------------------------------------------- 1 | /** 2 | * @package Adminer.css - v1.0.0 - January 08, 2013 3 | * @author James Price 4 | * @version $Id$ 5 | * @copyright Copyright � 2013 Neurotechnics Pty Ltd. http://www.neurotechnics.com/ 6 | * @license MIT: http://mit-license.org/ 7 | * Permission is hereby granted, free of charge, to any person obtaining a copy of 8 | * this software and associated documentation files (the �Software�), to deal in 9 | * the Software without restriction, including without limitation the rights to use, 10 | * copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the 11 | * Software, and to permit persons to whom the Software is furnished to do so, 12 | * subject to the following conditions: 13 | * 14 | * The above copyright notice and this permission notice shall be 15 | * included in all copies or substantial portions of the Software. 16 | * 17 | * THE SOFTWARE IS PROVIDED �AS IS�, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, 18 | * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A 19 | * PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT 20 | * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION 21 | * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE 22 | * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 23 | */ 24 | 25 | /* IE doesn't support inline images - So, we use a hack that IE cannot interpret */ 26 | html/*\*/>/*/*/body .error {background:#FFEEEE url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAAK/INwWK6QAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAIsSURBVDjLpVNLSJQBEP7+h6uu62vLVAJDW1KQTMrINQ1vPQzq1GOpa9EppGOHLh0kCEKL7JBEhVCHihAsESyJiE4FWShGRmauu7KYiv6Pma+DGoFrBQ7MzGFmPr5vmDFIYj1mr1WYfrHPovA9VVOqbC7e/1rS9ZlrAVDYHig5WB0oPtBI0TNrUiC5yhP9jeF4X8NPcWfopoY48XT39PjjXeF0vWkZqOjd7LJYrmGasHPCCJbHwhS9/F8M4s8baid764Xi0Ilfp5voorpJfn2wwx/r3l77TwZUvR+qajXVn8PnvocYfXYH6k2ioOaCpaIdf11ivDcayyiMVudsOYqFb60gARJYHG9DbqQFmSVNjaO3K2NpAeK90ZCqtgcrjkP9aUCXp0moetDFEeRXnYCKXhm+uTW0CkBFu4JlxzZkFlbASz4CQGQVBFeEwZm8geyiMuRVntzsL3oXV+YMkvjRsydC1U+lhwZsWXgHb+oWVAEzIwvzyVlk5igsi7DymmHlHsFQR50rjl+981Jy1Fw6Gu0ObTtnU+cgs28AKgDiy+Awpj5OACBAhZ/qh2HOo6i+NeA73jUAML4/qWux8mt6NjW1w599CS9xb0mSEqQBEDAtwqALUmBaG5FV3oYPnTHMjAwetlWksyByaukxQg2wQ9FlccaK/OXA3/uAEUDp3rNIDQ1ctSk6kHh1/jRFoaL4M4snEMeD73gQx4M4PsT1IZ5AfYH68tZY7zv/ApRMY9mnuVMvAAAAAElFTkSuQmCC") no-repeat scroll 0.8em center; padding-left:38px;} 27 | html/*\*/>/*/*/body .message, #menu p.message {background:#EEFFEE url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAAK/INwWK6QAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAKfSURBVDjLpZPrS1NhHMf9O3bOdmwDCWREIYKEUHsVJBI7mg3FvCxL09290jZj2EyLMnJexkgpLbPUanNOberU5taUMnHZUULMvelCtWF0sW/n7MVMEiN64AsPD8/n83uucQDi/id/DBT4Dolypw/qsz0pTMbj/WHpiDgsdSUyUmeiPt2+V7SrIM+bSss8ySGdR4abQQv6lrui6VxsRonrGCS9VEjSQ9E7CtiqdOZ4UuTqnBHO1X7YXl6Daa4yGq7vWO1D40wVDtj4kWQbn94myPGkCDPdSesczE2sCZShwl8CzcwZ6NiUs6n2nYX99T1cnKqA2EKui6+TwphA5k4yqMayopU5mANV3lNQTBdCMVUA9VQh3GuDMHiVcLCS3J4jSLhCGmKCjBEx0xlshjXYhApfMZRP5CyYD+UkG08+xt+4wLVQZA1tzxthm2tEfD3JxARH7QkbD1ZuozaggdZbxK5kAIsf5qGaKMTY2lAU/rH5HW3PLsEwUYy+YCcERmIjJpDcpzb6l7th9KtQ69fi09ePUej9l7cx2DJbD7UrG3r3afQHOyCo+V3QQzE35pvQvnAZukk5zL5qRL59jsKbPzdheXoBZc4saFhBS6AO7V4zqCpiawuptwQG+UAa7Ct3UT0hh9p9EnXT5Vh6t4C22QaUDh6HwnECOmcO7K+6kW49DKqS2DrEZCtfuI+9GrNHg4fMHVSO5kE7nAPVkAxKBxcOzsajpS4Yh4ohUPPWKTUh3PaQEptIOr6BiJjcZXCwktaAGfrRIpwblqOV3YKdhfXOIvBLeREWpnd8ynsaSJoyESFphwTtfjN6X1jRO2+FxWtCWksqBApeiFIR9K6fiTpPiigDoadqCEag5YUFKl6Yrciw0VOlhOivv/Ff8wtn0KzlebrUYwAAAABJRU5ErkJggg==") no-repeat scroll 0.8em center; padding-left:38px;} 28 | html/*\*/>/*/*/body a[href$="dump="] {background:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAAK/INwWK6QAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAHzSURBVHjajJPPS+NQEMcnaaxpdWsp6Q8vtWtdkIo9+B948SjIgruCUg8F/wGP/glePe5JcBehwl4qePGm0J6KQj30UBHEzaFLUromTfPizJMnrxhhB4bJvDfzme97SZQgCOB/be98J2AsAMYYMP81KjKg0WhMYljHtS30RSz4gjkGdot559F7OLt8vvi1bJRBURS4vr8CTTQ3m80SFv1MpVJlwzBA13XuNGUwGKyY1p+Vk9aPzWw8C7ZjQXximu+9ATA5KhQK5Uwmw+nCIpEIJBIJOLjah3Q8w7379x5urFsOUEUhTl/C6R+ef35mARzPhW6vC+q/iHvyvaYwXwIQje6j1+tBv98H13VhNBpxxyPA5tw2TI50MPQsrMbXbOo53fmtaJIC7iSZAMPhkOe+73MA5Ruz3yCfz9NlvykLBUSjUR41TQPP8zhE7JNSyj8E0CbJpkiXKRoIRFABeQcQd0DFwlVV5evUTFBZRSiATEwnp4lCAa0LI2AoQC4WimRl4qgyYOw12rYNyWSSX6L4mKiBnukDK5VKYJrmmBpZwW6r1TotFotTuVyOQwQgnU7zV9npdKDdbj+hgnXRN/Yz1ev1zwg6QP+KU2disRiXblkWOI7zhJOPce+wWq2aoQDZarXaJ2xYQGfod5VKxQ2rexFgAI4OiAKxKkWeAAAAAElFTkSuQmCC") no-repeat scroll 2px bottom; padding-left:22px;} 29 | html/*\*/>/*/*/body select[name="db"] {background:white url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAQAAAC1+jfqAAAABGdBTUEAAK/INwWK6QAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAEYSURBVBgZBcHPio5hGAfg6/2+R980k6wmJgsJ5U/ZOAqbSc2GnXOwUg7BESgLUeIQ1GSjLFnMwsKGGg1qxJRmPM97/1zXFAAAAEADdlfZzr26miup2svnelq7d2aYgt3rebl585wN6+K3I1/9fJe7O/uIePP2SypJkiRJ0vMhr55FLCA3zgIAOK9uQ4MS361ZOSX+OrTvkgINSjS/HIvhjxNNFGgQsbSmabohKDNoUGLohsls6BaiQIMSs2FYmnXdUsygQYmumy3Nhi6igwalDEOJEjPKP7CA2aFNK8Bkyy3fdNCg7r9/fW3jgpVJbDmy5+PB2IYp4MXFelQ7izPrhkPHB+P5/PjhD5gCgCenx+VR/dODEwD+A3T7nqbxwf1HAAAAAElFTkSuQmCC") no-repeat scroll left bottom; padding-left:16px;} 30 | html/*\*/>/*/*/body select[name="db"] option {padding-left:18px;} 31 | html/*\*/>/*/*/body a[href$="&create="] {background:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAAK/INwWK6QAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAIpSURBVDjLpZNPSFRRFMZ/749/Kt3IqFTSRoSMmrGIYTTbpEJtjBCCok1Em9JVG1dRC8FFEES5aGFEgRRZWq1iLKKxBiNqLDcltQgmHR9hY6LOu+feFm+YGVsZXbh8nHO53/nud8+xjDH8z3IB7r5avGgMZ8XoBq01okFpjYhGtEGJLtmCKINo/XbgVFPUBdDG9PVEq0P/UvnSvdlwQYFoHQIY/3obpRVKFL5W+OIXUVThrL91AN+XihKCwIeTu85sqPryqsJXUvRARAMwkshsiKB7fw25UgKVJwA40V7H/cl5jh+oL+RGk/P0xIqxl11dr8AXjTYG14HRNxkcx+ZhMoNlg52/ND6VAWMoc6F5+2Zy/l9PMIDrWByL1jI+tcDRaN06BaXxbDqLUnq9AqPBteHpuwUcJ0AIcgBXH93h+/wEyyuLrPk5cmv7gNY8gdIYYyhz4PDeWuIpj85IsS2ujQ2zJAk6DkZpqGnixcwYyU+PifUOX7Eh6DoAx7aIpzwA4imPeMrj+bTH+88PaNkZQWwhsrULsXxie9oAzgcESgUe2NAZCeE6AXZGQhwKh/Cyc5RZVXQ39wFwoeMmjXVhgMqiB8awe0cVP36u0Fi/iW9zvwuzkF3+xUz6Nal0gv6uWww+O02lUwGwmv8FM3l55EtLTvQWXwm+EkRpfNEoUZRXHCE5PUFbuJ0nH4cot1wSH14C3LA2Os6x3m2DwDmgGlgChpLX0/1/AIu8MA7WsWBMAAAAAElFTkSuQmCC") no-repeat scroll left bottom; padding-left:22px;} 32 | html/*\*/>/*/*/body #menu p a[href*="&select="] {background:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAAK/INwWK6QAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAHISURBVDjLpVPNK0RRFP+9D98syMwUspHkm9I0YkFZWBFKkZ0s7a3Ewh+ilChK7FgoZCJFKYlYKB8zk2+Z5t0P577He29kQU7dd+6575zf+d1zztWklPiPmOozt/U4SThjXIoyIQS4AJjSXO0lGGlvcXAm6Vzsz4xUhm0AIeX4QLig+C+ZpxbOG1wGhGYHr1zMUmZGWRgs0ha3PE1nX/8mWmdgWTzLB+DUYbhm9FfZ35IEyrhXA3VXJfPbsV8B9LQUIeUHYJ8ASobag1jcucNgW8g9W4reYSDi2YnnZDoDiwCokDANct6NwTB0LEdj0HRA/wxa2SN25JNBEdWluUhZ366gqmAaGvrCAXKOozccTGPgt8+vn8GYSGcgyTYp3dpBnBg42nbQPRBTo5bTvqYkmxL6AQhNTWQGBXY3B7BxlEBXozcW64dxRKoKUZBju+P06gl5WaaviMJBM3TNDlbypemIZgHYOnlwASsCmW7nHADGnBoQ3c76YmweJ9BR5zFYjsbRHwm4tmJg6PhWA7pCXXk+bu7fURHKweXtq/sWaksz7SC/CCGFrwtyZ3r+rCnFRZ7qr1qc6mLZj4f9OEyPL8lVpbX/PucPv5QPKHB1TdEAAAAASUVORK5CYII=") no-repeat scroll left bottom; clear:left; display:block; float:left; height:16px; margin-right:8px; padding:1px 0 0 16px; overflow:hidden; width:0; text-decoration:none; } 33 | html/*\*/>/*/*/body #menu p a[href*="&table="], html/*\*/>/*/*/body #menu p a[href*="&view="] {margin:0; line-height:18px; padding-bottom:1px; text-decoration:none;} 34 | html/*\*/>/*/*/body #content p a[href*="&create="] {padding-left:22px;} 35 | html/*\*/>/*/*/body #content p a[href$="?database="] {background:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAAK/INwWK6QAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAIkSURBVDjLpVNNiFJRFP7eU1E0KSLTMpAwYSxyaidDtChm0WYQ3NSutv2s2kwwm2igNgMtooUQEQhhA9GqhSDTQsZZFDbNDBgVg5bSw9J8rzFF33udc+HGg0ladOHj3nPe+b7zc99VbNvG/yy30yiVSl4SnCNcsixrivYEgY7WJu0faX9EKGUyGVNyFFkBkY/T+WkoFEpFIhEEAgH4/X7w916vB8Mw0Gg00G63y+S7mM1mm4LIAYxisbhSr9c5nT1pjUYju1qt2oVC4YnkqbIUMk6Ew+F/9hyNRkFJLuyaATmFoqZp8Pl88Hq98Hg8wtfv99HpdNBsNhGPx0XsRAG3241ut4vBYCDs8XgMXdcxHA7FN/b9VUD25HK5RAUczKC+hYgcNpNN05xcAQdLkqIoIlj6VFWdXIEUkAQGV8M2k2vaG3z6sYGfVR39XzsHlm/dX3h5d31xlwAHM5goBd5+LuO75z3OnU3jyP4EVrZeKGub2p309cP7VKcAQ2Znoiz3deMVTk1Nw1RNTB+ahamMkD45w7RrfwSYwFdFf6K4Quf6pmvwKHswl7wh7Jvnc4gfTPHR52zhcqVSeZZMJgOxWEyI8BC5CmOnh63WKtZbZczPPsa94hX4XCLJQHG+xnw+f5SEFghZmvhefgvcTqn2HN3gBmZSZ5CInMaHr1Wsvivjy3ZvSZn0nHO5XJDIxwgWDbW2vL10m9xXCUGCQXi49qA1/xvyq6BCh7yZeQAAAABJRU5ErkJggg==") no-repeat scroll 2px bottom; padding-left:22px;} 36 | html/*\*/>/*/*/body #content a[href*="&database="] {background:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAAK/INwWK6QAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAKRSURBVDjLhVNLTBNRFD3TTju1FCcBaxuaQEr94ydiZIHGpcFISBOi0YREZWHCVoyRxKUxxq0LXcACQyLsjO6KjSEiDfHDz0S0CLSxlFKd2g7MTDudGd+bMAQCxJucuXfuu+fcO/PeYwzDALVoNMqRuI3guq7rR4g/SEBC/Svxc8T3EUTD4bCGTcZQAUI+RvxLr9d70u/3o6KiAm63G3Qtn89DFEUkk0lks9lRkrvW3t6e2lCgRZFI5F0ikaDtjN1MVVVjYmLCGBoa6qccC7Z1kQafz4f/WSAQAGlyaXOOpQ+SNNUymQxcLhc4joPD4TBzkiRBEASkUimEQiGzdlcBlmWRy+WgKIr5Xi6XUSgUUCwWzTVN+IAzeOOde71orP0eAaOkbrDWf6Cw2+3mBLSYgny3KULXPOUY2BUB/hMd4IOn8XfhMGYjvU+2TECLLRLDMNA0zYw5JYa6Ghke/hyEn9/gZEqo3OuHp7qW3yJgESjoNPSdlb8gWCOCr29BMT0Ip5tBYnIWqlL6o8irzVsEaHcKSqQCen4cweok+FAblNRz2JxlODx1cEkzGWmVbTl7Z/jHhgCF1Z3GYjIKf+U8+ANhQn4Gm6OMUiGI9MhHg5Gl1sbu8UnKNc8B7Ui3ipxEcwvlpVFw6hz2N1xGabkXdqeBYqEOmfefEZWac4e6xz9Z22hbn+BmLBZbi8fjEBdG4NF/QdUDSM88hQ4FawKJR6cxLDZl86qzZdtdoDYwMBAkQg/2LL/ovNLVh++Dd7G0OAau9hTkrKgnnE39GW3f/Z6enpUdBSx7ePu4eq+zi4VNw+TbV0gsxFd5b9X5i4+mpnY63tsErl6okhvrfWzT0SAMR3FMXsnean08Pb/b/fgHqpjCspi90kkAAAAASUVORK5CYII=") no-repeat scroll 2px bottom; padding-left:22px;} 37 | html/*\*/>/*/*/body #content p a[href*="&schema="] {background:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAAK/INwWK6QAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAFOSURBVDjLtVK7SgNRED0b9iuM2lr4QK1DQIyk0FZsJAj+gH+ilRZb2NjaRHTLmA9QFKz9huzm7t37Hu+u7IJgQjR6YLjDzOXMmcMERIR5EE5qXA4z4sqACYWEC5wfLQXf/WtMIuDSoL0A7DZDjBj/uYI0l8jzEEJYJMkvCEZM4PqZIxlzpGk+kSCY18TGtGYcx9Tv96dOqBUMBgNyzsFaC621312Ac+59yJFlGRhj5VvVoigKvniglEK32w1mkd3r9ejPPAjOhqdknYX18p1/rzo3pYqTh0OSRkJI5UMgPn4s61sX66SkhtEGcISGsQad5gH2FvehfV5BaIF2cwet5RZyKeu68pe5ubKG7dUNP5AQGltMN57Mosgr5EIiVQmYGvtc1PVicqHY+dXpk8Dg7v22XKFo1ARe9v1bDOlXKKKCs4Sn1xdU1v3vIc2CD3bN4xJjfJWvAAAAAElFTkSuQmCC") no-repeat scroll 2px bottom; padding-left:22px;} 38 | html/*\*/>/*/*/body #content p a[href*="&tbsdesc="] {background:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAAK/INwWK6QAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAFOSURBVDjLtVK7SgNRED0b9iuM2lr4QK1DQIyk0FZsJAj+gH+ilRZb2NjaRHTLmA9QFKz9huzm7t37Hu+u7IJgQjR6YLjDzOXMmcMERIR5EE5qXA4z4sqACYWEC5wfLQXf/WtMIuDSoL0A7DZDjBj/uYI0l8jzEEJYJMkvCEZM4PqZIxlzpGk+kSCY18TGtGYcx9Tv96dOqBUMBgNyzsFaC621312Ac+59yJFlGRhj5VvVoigKvniglEK32w1mkd3r9ejPPAjOhqdknYX18p1/rzo3pYqTh0OSRkJI5UMgPn4s61sX66SkhtEGcISGsQad5gH2FvehfV5BaIF2cwet5RZyKeu68pe5ubKG7dUNP5AQGltMN57Mosgr5EIiVQmYGvtc1PVicqHY+dXpk8Dg7v22XKFo1ARe9v1bDOlXKKKCs4Sn1xdU1v3vIc2CD3bN4xJjfJWvAAAAAElFTkSuQmCC") no-repeat scroll 2px bottom; padding-left:22px;} 39 | html/*\*/>/*/*/body #content p a[href*="&sql="] {background:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAAK/INwWK6QAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAJ5SURBVHjapFNLaxNRFP4mnZmQZtKYpJ2I8ZE0NSbSWKpgBYNUhIJQUDddCaILwb34C0RcCi60vpa14sZFoSjxUWxTFEubFkxf9kFS+7Jp0yQmM5mH905SF9pSwQt3vnPnnvPNd86cA13Xsds+23XKsdMdQx//s0z/6hi54he3e8/0d3ZuK0FTFGhUJkVVhSbLUAiq5IxSCQrBEkGWOu8Lh38HGrlpWnlXCKhNSbZQo3cEE9FomYAuKZstE2wFa8RR1cpKqK2o4JhxmLVJVAlh5Df6IFj5MgENcHq9EAMBg2RucBDVLpdxVon0iXdvIf8sQHRIsNReht3XjI3ZI8iuPAOrkDyorBq3G6vT08ikUuAsFiN46HkXXL56eI41QV1/BMF+GulvCfCMDFvNXtSIHrC0KDTPhXgc7lAQdQ2thk2XIpewnkzCJvTA4T8PabEbfDWD+ZFxyEUdX94sw6QVCkZlxWAQU+8/YGZgALV+v0HgbWmBNzQMR0M7it8fg+HWwQk2cLkkcvJh5NNFsCVJMgq1ubiE5o4OI5CS8FYrya8b9saLKC48gIlTIG/6sBaLw3PpHrTEMrSXr4kPIaAKFkbjSA0PEVuFlB+DO8Ah2HoB8tITVPE6iplDWOn7jLn0CSQevoDV6TI+zEpUASkkZzaTYrLIrH3C/qMCFEbE4th9OEQexfQBrPYP44d+DuY91eBp+1dGgFVIDb729kKpdJfQtIy2yFNMdN/E5McYzAebUEhOYjZuQXaj5+9W/nOYbl9vLN26doOFScVI9BXmZ6dy9jpnpO1O5dfsRtBxxlk4Xu9mT4Z80DkpVlhZvdp+d3RmpyH7JcAAnHiAVYWMsdkAAAAASUVORK5CYII=") no-repeat scroll 2px bottom; padding-left:24px;} 40 | html/*\*/>/*/*/body table tbody input[name*="check"] {display:block; float:left;} 41 | html/*\*/>/*/*/body table a[href*="&edit="][href*="&where"] {background:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAAK/INwWK6QAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAFUSURBVDjLrZM/SAJxGIZdWwuDlnCplkAEm1zkaIiGFFpyMIwGK5KGoK2lphDKkMDg3LLUSIJsSKhIi+684CokOtTiMizCGuzEU5K3vOEgKvtBDe/2Pc8H3x8NAM1fQlx4H9M3pcOWp6TXWmM8A7j0629v1nraiAVC0IrrwATKIgs5xyG5QiE+Z4iQdoeU2oAsnqCSO1NSTu+D9VhqRLD8nIB8F0Q2MgmJDyipCzjvYJkIfpN2UBLG8MpP4dxvQ3ZzGuyyBQ2H+AnOOCBd9aL6soh81A5hyYSGWyCFvxUcerqI4S+CvYVOFPMHxLAq8I3qdHVY5LbBhJzEsCrwutpRFBlUHy6wO2tEYtWAzLELPN2P03kjfj3luqDycV2F8AgefWbEnVqEHa2IznSD6BdsVDNStB0lfh0FPoQjdx8RrAqGzC0YprSgxzsUMOY2bf37N/6Ud1Vc9yYcH50CAAAAAElFTkSuQmCC") no-repeat scroll right bottom; padding-right:18px;} 42 | html/*\*/>/*/*/body table input + a[href*="&edit="][href*="&where"] {width:0; float:left; display:block; height:16px; overflow:hidden; text-decoration:none; padding:0 0 0 18px; background-position:2px bottom; margin-left:5px;} 43 | html/*\*/>/*/*/body table tbody td:first-child {white-space:normal;} 44 | html/*\*/>/*/*/body table thead input {margin-right: 5px;} 45 | html/*\*/>/*/*/body input[name="delete"], html/*\*/>/*/*/body input[name="drop"] {background:transparent url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAAK/INwWK6QAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAHSSURBVHjapFM5bsJQEB2zSIDFJrHYpEtyAyoKJAp6CrqIkBPkNDlBAKXjBEgUpKOBCyQNijFiEZvZl8z7wsjESYpkpNFfPO/Nmz9j6Xg80n/M9fWi3W7fMOnd4XAo8qogAbvO5xKvL6lU6s0aL1kVMDjP5ye/36+Gw2FyOp3EQFqtVtTr9WixWHT5/JhOp6s2ghP4ORaLyaFQiGazGa3Xa0HgdrvJ6/WSpmk0Go0MjnvIZDLVM0Gr1brm/WskEkkA3O/3abvdQjq5XC6xgoiVka7rNB6PNT6ns9nsu+OkpODxeBLBYJAGgwHt9/uzQ8Vms6Hdbie+KYqC+ASTFrARBMx2HwgEaDKZiHqn0yktl0uxtzrMMAyKx+MCc+4Cs13hwQCC1GQy+W3Lms2mUIUygbEqEBLNun8z8zswVgUfLO0WD4Z6kekn8/l8okNM8GFVUMYDoVWQ6HA4bEAzoyzL1O12kbRsJajwhYZhiUajJEnShWSAQaqqKnU6HahEGysXg9RoNPJ8+cwZZLSKp47m8/k5Kxzg4XBocNxDLper2ka5Xq+LUeatilahJLN1mEJ+ZDHKJthGAKvVauJnYi9ysHIqQee1xOsLg3/+mf5inwIMAJMhb74NwG5wAAAAAElFTkSuQmCC") no-repeat scroll left center; padding:1px 5px 1px 18px; border:0; cursor:pointer; font-size:.9em;} 46 | html/*\*/>/*/*/body input[name="delete"]:hover, html/*\*/>/*/*/body input[name="drop"]:hover {color:red; background-image:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAAK/INwWK6QAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAJdSURBVDjLpZP7S1NhGMf9W7YfogSJboSEUVCY8zJ31trcps6zTI9bLGJpjp1hmkGNxVz4Q6ildtXKXzJNbJRaRmrXoeWx8tJOTWptnrNryre5YCYuI3rh+8vL+/m8PA/PkwIg5X+y5mJWrxfOUBXm91QZM6UluUmthntHqplxUml2lciF6wrmdHriI0Wx3xw2hAediLwZRWRkCPzdDswaSvGqkGCfq8VEUsEyPF1O8Qu3O7A09RbRvjuIttsRbT6HHzebsDjcB4/JgFFlNv9MnkmsEszodIIY7Oaut2OJcSF68Qx8dgv8tmqEL1gQaaARtp5A+N4NzB0lMXxon/uxbI8gIYjB9HytGYuusfiPIQcN71kjgnW6VeFOkgh3XcHLvAwMSDPohOADdYQJdF1FtLMZPmslvhZJk2ahkgRvq4HHUoWHRDqTEDDl2mDkfheiDgt8pw340/EocuClCuFvboQzb0cwIZgki4KhzlaE6w0InipbVzBfqoK/qRH94i0rgokSFeO11iBkp8EdV8cfJo0yD75aE2ZNRvSJ0lZKcBXLaUYmQrCzDT6tDN5SyRqYlWeDLZAg0H4JQ+Jt6M3atNLE10VSwQsN4Z6r0CBwqzXesHmV+BeoyAUri8EyMfi2FowXS5dhd7doo2DVII0V5BAjigP89GEVAtda8b2ehodU4rNaAW+dGfzlFkyo89GTlcrHYCLpKD+V7yeeHNzLjkp24Uu1Ed6G8/F8qjqGRzlbl2H2dzjpMg1KdwsHxOlmJ7GTeZC/nesXbeZ6c9OYnuxUc3fmBuFft/Ff8xMd0s65SXIb/gAAAABJRU5ErkJggg==")} 47 | body{background-color:#eee} 48 | form{margin:0;overflow:auto} 49 | #breadcrumb{position:absolute;top:0;left:0;height:2.6em;margin:0;padding:5px 5px 0 22em;width:-moz-available!important;width: -webkit-fill-available !important;width:100%;line-height:1.6em;border:1px solid #444;white-space:nowrap;color:#fff;background:#7abcff;background:-moz-linear-gradient(top,#7abcff 0,#60abf8 44%,#4096ee 100%);background:-webkit-gradient(linear,left top,left bottom,color-stop(0%,#7abcff),color-stop(44%,#60abf8),color-stop(100%,#4096ee));background:-webkit-linear-gradient(top,#7abcff 0,#60abf8 44%,#4096ee 100%);background:-o-linear-gradient(top,#7abcff 0,#60abf8 44%,#4096ee 100%);background:-ms-linear-gradient(top,#7abcff 0,#60abf8 44%,#4096ee 100%);background:linear-gradient(to bottom,#7abcff 0,#60abf8 44%,#4096ee 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#7abcff',endColorstr='#4096ee',GradientType=0)} 50 | #menu,#content{background-color:#fff;border-radius:10px;border:1px solid #444;box-shadow:0 0 5px #999;margin:5em 1em 2em 0} 51 | #menu{position:absolute;top:0;left:0;margin-left:1em;padding:0 0 30px;width:19em} 52 | #content{border:1px solid #444;margin-left:21.5em;padding:10px 10px 30px 30px} 53 | #menu h1,#content h2{line-height:44px;margin:0;padding:0 20px;border-bottom:1px solid #000;border-radius:9px 9px 0 0;display:block;color:#FFF;background:#1e5799;background:-moz-linear-gradient(top,#1e5799 0,#2989d8 50%,#207cca 51%,#7db9e8 100%);background:-webkit-gradient(linear,left top,left bottom,color-stop(0%,#1e5799),color-stop(50%,#2989d8),color-stop(51%,#207cca),color-stop(100%,#7db9e8));background:-webkit-linear-gradient(top,#1e5799 0,#2989d8 50%,#207cca 51%,#7db9e8 100%);background:-o-linear-gradient(top,#1e5799 0,#2989d8 50%,#207cca 51%,#7db9e8 100%);background:-ms-linear-gradient(top,#1e5799 0,#2989d8 50%,#207cca 51%,#7db9e8 100%);background:linear-gradient(to bottom,#1e5799 0,#2989d8 50%,#207cca 51%,#7db9e8 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#1e5799',endColorstr='#7db9e8',GradientType=0)} 54 | #menu h1,#menu h1 a,#menu h1 span{color:#fff} 55 | #menu h1{line-height:41px} 56 | #content h2{font-weight:normal;position:relative;left:-30px;top:-10px;height:44px;width:100%} 57 | table{-moz-border-bottom-colors:none;-moz-border-left-colors:none;-moz-border-right-colors:none;-moz-border-top-colors:none;border-color:#999 -moz-use-text-color -moz-use-text-color #999;border-image:none;border-right:0 none;border-style:solid none none solid;border-width:1px 0 0 1px;font-size:90%;margin:1em 20px 0 0} 58 | td,th{-moz-border-bottom-colors:none;-moz-border-left-colors:none;-moz-border-right-colors:none;-moz-border-top-colors:none;border-color:-moz-use-text-color #999 #999 -moz-use-text-color;border-image:none;border-style:none solid solid none;border-width:0 1px 1px 0;padding:.2em .3em} 59 | thead td,thead th{background:#eee;background:-moz-linear-gradient(top,#eee 0,#ccc 100%);background:-webkit-gradient(linear,left top,left bottom,color-stop(0%,#eee),color-stop(100%,#ccc));background:-webkit-linear-gradient(top,#eee 0,#ccc 100%);background:-o-linear-gradient(top,#eee 0,#ccc 100%);background:-ms-linear-gradient(top,#eee 0,#ccc 100%);background:linear-gradient(to bottom,#eee 0,#ccc 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#eeeeee',endColorstr='#cccccc',GradientType=0)} 60 | td{background-color:#f4f8ff} 61 | .odd td{background-color:#fff} 62 | tbody tr:hover td,tbody tr:hover th{background-color:#FFE} 63 | p.tabs{margin:0 20px 0 0} 64 | .jush-sql{background:0} 65 | fieldset{border:1px solid #999;border-radius:5px;display:inline;margin:.8em .5em 0 0;padding:.5em .8em;vertical-align:top} 66 | a{color:#369} 67 | a:hover{color:#28c} 68 | #logout,#logins a,#logins a:link,#breadcrumb a,#breadcrumb a:link,.logout a,.logout a:link,.tabs a,.tabs a:link{display:inline-block;border:1px solid #667eac;border-radius:4px;padding:3px 8px;margin:2px 0;vertical-align:middle;text-decoration:none;color:#fff;background:#7abcff;background:-moz-linear-gradient(top,#7abcff 0,#60abf8 44%,#4096ee 100%);background:-webkit-gradient(linear,left top,left bottom,color-stop(0%,#7abcff),color-stop(44%,#60abf8),color-stop(100%,#4096ee));background:-webkit-linear-gradient(top,#7abcff 0,#60abf8 44%,#4096ee 100%);background:-o-linear-gradient(top,#7abcff 0,#60abf8 44%,#4096ee 100%);background:-ms-linear-gradient(top,#7abcff 0,#60abf8 44%,#4096ee 100%);background:linear-gradient(to bottom,#7abcff 0,#60abf8 44%,#4096ee 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#7abcff',endColorstr='#4096ee',GradientType=0)} 69 | .logout a,.logout a:link,#logout{padding:3px 4px} 70 | #logout:hover,#logins a:hover,#tables a:hover,#breadcrumb a:hover,.logout a:hover,.tabs a:hover{color:#fff;text-decoration:none;background:#93c9ff;background:-moz-linear-gradient(top,#93c9ff 0,#79b8f7 44%,#57a2ed 100%);background:-webkit-gradient(linear,left top,left bottom,color-stop(0%,#93c9ff),color-stop(44%,#79b8f7),color-stop(100%,#57a2ed));background:-webkit-linear-gradient(top,#93c9ff 0,#79b8f7 44%,#57a2ed 100%);background:-o-linear-gradient(top,#93c9ff 0,#79b8f7 44%,#57a2ed 100%);background:-ms-linear-gradient(top,#93c9ff 0,#79b8f7 44%,#57a2ed 100%);background:linear-gradient(to bottom,#93c9ff 0,#79b8f7 44%,#57a2ed 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#93c9ff',endColorstr='#57a2ed',GradientType=0)} 71 | #breadcrumb a,#breadcrumb a:link{border:1px solid #246;padding:2px 6px;margin:1px auto;line-height:1.6em} 72 | #logins a,#tables a{background:none repeat scroll 0 0 #fff;padding:2px 6px;margin:1px 0;font-size:.8em} 73 | a[title='Show structure'],#tables a[title='Show structure']{border:0;background:0;color:#369} 74 | .jush a{border:0;background:0;margin:0;padding:0} 75 | a.active,a.active:link,a.active:hover{text-decoration:underline} 76 | -------------------------------------------------------------------------------- /elm.json: -------------------------------------------------------------------------------- 1 | { 2 | "type": "application", 3 | "source-directories": [ 4 | "src/elm" 5 | ], 6 | "elm-version": "0.19.1", 7 | "dependencies": { 8 | "direct": { 9 | "TSFoster/elm-uuid": "4.0.1", 10 | "elm/browser": "1.0.2", 11 | "elm/core": "1.0.5", 12 | "elm/html": "1.0.0", 13 | "elm/json": "1.1.3", 14 | "elm/random": "1.0.0", 15 | "elm/time": "1.0.0", 16 | "elm-community/list-extra": "8.2.4" 17 | }, 18 | "indirect": { 19 | "TSFoster/elm-bytes-extra": "1.3.0", 20 | "TSFoster/elm-md5": "2.0.0", 21 | "TSFoster/elm-sha1": "2.1.1", 22 | "danfishgold/base64-bytes": "1.0.3", 23 | "elm/bytes": "1.0.8", 24 | "elm/url": "1.0.0", 25 | "elm/virtual-dom": "1.0.2", 26 | "rtfeldman/elm-hex": "1.0.0", 27 | "zwilias/elm-utf-tools": "2.0.1" 28 | } 29 | }, 30 | "test-dependencies": { 31 | "direct": { 32 | "elm-explorations/test": "1.2.2" 33 | }, 34 | "indirect": {} 35 | } 36 | } 37 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "eledminer", 3 | "version": "1.0.0", 4 | "description": "", 5 | "main": "./src/main.js", 6 | "scripts": { 7 | "start": "npx electron .", 8 | "release": "npm run build && npm run package", 9 | "package": "npx electron-packager . eledminer --platform=darwin --arch=x64 --overwrite", 10 | "build": "npm run build:elm", 11 | "build:elm": "npm run build:elm:home && npm run build:elm:menu && npm run build:elm:settings", 12 | "build:elm:home": "npx elm make src/elm/Home.elm --output ./dst/home.js", 13 | "build:elm:menu": "npx elm make src/elm/Menu.elm --output ./dst/menu.js", 14 | "build:elm:settings": "npx elm make src/elm/Settings.elm --output ./dst/settings.js", 15 | "test": "npm run test:elm", 16 | "test:elm": "npx elm-test" 17 | }, 18 | "author": "lusingander", 19 | "license": "MIT", 20 | "devDependencies": { 21 | "electron": "^11.0.0", 22 | "electron-packager": "^15.2.0", 23 | "elm": "^0.19.1-5", 24 | "elm-test": "^0.19.1-revision6" 25 | }, 26 | "dependencies": { 27 | "electron-store": "^7.0.2", 28 | "execa": "^5.0.0", 29 | "php-server-manager": "^1.3.3" 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /resource/bulma/LICENSE: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) 2020 Jeremy Thomas 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in 13 | all copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 21 | THE SOFTWARE. 22 | -------------------------------------------------------------------------------- /resource/fontawesome/LICENSE.txt: -------------------------------------------------------------------------------- 1 | Font Awesome Free License 2 | ------------------------- 3 | 4 | Font Awesome Free is free, open source, and GPL friendly. You can use it for 5 | commercial projects, open source projects, or really almost whatever you want. 6 | Full Font Awesome Free license: https://fontawesome.com/license/free. 7 | 8 | # Icons: CC BY 4.0 License (https://creativecommons.org/licenses/by/4.0/) 9 | In the Font Awesome Free download, the CC BY 4.0 license applies to all icons 10 | packaged as SVG and JS file types. 11 | 12 | # Fonts: SIL OFL 1.1 License (https://scripts.sil.org/OFL) 13 | In the Font Awesome Free download, the SIL OFL license applies to all icons 14 | packaged as web and desktop font files. 15 | 16 | # Code: MIT License (https://opensource.org/licenses/MIT) 17 | In the Font Awesome Free download, the MIT license applies to all non-font and 18 | non-icon files. 19 | 20 | # Attribution 21 | Attribution is required by MIT, SIL OFL, and CC BY licenses. Downloaded Font 22 | Awesome Free files already contain embedded comments with sufficient 23 | attribution, so you shouldn't need to do anything additional when using these 24 | files normally. 25 | 26 | We've kept attribution comments terse, so we ask that you do not actively work 27 | to remove them from files, especially code. They're a great way for folks to 28 | learn about Font Awesome. 29 | 30 | # Brand Icons 31 | All brand icons are trademarks of their respective owners. The use of these 32 | trademarks does not indicate endorsement of the trademark holder by Font 33 | Awesome, nor vice versa. **Please do not use brand logos for any purpose except 34 | to represent the company, product, or service to which they refer.** 35 | -------------------------------------------------------------------------------- /resource/fontawesome/webfonts/fa-brands-400.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lusingander/eledminer/52d3ff9ef8ad81f6ce9c32b27033f61ec6dd4682/resource/fontawesome/webfonts/fa-brands-400.eot -------------------------------------------------------------------------------- /resource/fontawesome/webfonts/fa-brands-400.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lusingander/eledminer/52d3ff9ef8ad81f6ce9c32b27033f61ec6dd4682/resource/fontawesome/webfonts/fa-brands-400.ttf -------------------------------------------------------------------------------- /resource/fontawesome/webfonts/fa-brands-400.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lusingander/eledminer/52d3ff9ef8ad81f6ce9c32b27033f61ec6dd4682/resource/fontawesome/webfonts/fa-brands-400.woff -------------------------------------------------------------------------------- /resource/fontawesome/webfonts/fa-brands-400.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lusingander/eledminer/52d3ff9ef8ad81f6ce9c32b27033f61ec6dd4682/resource/fontawesome/webfonts/fa-brands-400.woff2 -------------------------------------------------------------------------------- /resource/fontawesome/webfonts/fa-regular-400.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lusingander/eledminer/52d3ff9ef8ad81f6ce9c32b27033f61ec6dd4682/resource/fontawesome/webfonts/fa-regular-400.eot -------------------------------------------------------------------------------- /resource/fontawesome/webfonts/fa-regular-400.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lusingander/eledminer/52d3ff9ef8ad81f6ce9c32b27033f61ec6dd4682/resource/fontawesome/webfonts/fa-regular-400.ttf -------------------------------------------------------------------------------- /resource/fontawesome/webfonts/fa-regular-400.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lusingander/eledminer/52d3ff9ef8ad81f6ce9c32b27033f61ec6dd4682/resource/fontawesome/webfonts/fa-regular-400.woff -------------------------------------------------------------------------------- /resource/fontawesome/webfonts/fa-regular-400.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lusingander/eledminer/52d3ff9ef8ad81f6ce9c32b27033f61ec6dd4682/resource/fontawesome/webfonts/fa-regular-400.woff2 -------------------------------------------------------------------------------- /resource/fontawesome/webfonts/fa-solid-900.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lusingander/eledminer/52d3ff9ef8ad81f6ce9c32b27033f61ec6dd4682/resource/fontawesome/webfonts/fa-solid-900.eot -------------------------------------------------------------------------------- /resource/fontawesome/webfonts/fa-solid-900.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lusingander/eledminer/52d3ff9ef8ad81f6ce9c32b27033f61ec6dd4682/resource/fontawesome/webfonts/fa-solid-900.ttf -------------------------------------------------------------------------------- /resource/fontawesome/webfonts/fa-solid-900.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lusingander/eledminer/52d3ff9ef8ad81f6ce9c32b27033f61ec6dd4682/resource/fontawesome/webfonts/fa-solid-900.woff -------------------------------------------------------------------------------- /resource/fontawesome/webfonts/fa-solid-900.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lusingander/eledminer/52d3ff9ef8ad81f6ce9c32b27033f61ec6dd4682/resource/fontawesome/webfonts/fa-solid-900.woff2 -------------------------------------------------------------------------------- /resource/images/connections.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lusingander/eledminer/52d3ff9ef8ad81f6ce9c32b27033f61ec6dd4682/resource/images/connections.png -------------------------------------------------------------------------------- /resource/images/image.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lusingander/eledminer/52d3ff9ef8ad81f6ce9c32b27033f61ec6dd4682/resource/images/image.gif -------------------------------------------------------------------------------- /resource/images/sqlite.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lusingander/eledminer/52d3ff9ef8ad81f6ce9c32b27033f61ec6dd4682/resource/images/sqlite.png -------------------------------------------------------------------------------- /src/adminer.js: -------------------------------------------------------------------------------- 1 | const request = require("request"); 2 | const PHPServer = require("php-server-manager"); 3 | const path = require("path"); 4 | const Const = require("./const"); 5 | const { UserSettings } = require("./store"); 6 | const { canExecutePHP } = require("./php"); 7 | 8 | class AdminerServer { 9 | constructor() { 10 | const userSettings = UserSettings.load(); 11 | this.server = new PHPServer({ 12 | port: userSettings.port, 13 | directory: path.join(__dirname, ".."), 14 | directives: { 15 | display_errors: 1, 16 | expose_php: 1, 17 | }, 18 | env: { 19 | ELEDMINER_SETTINGS_THEME: userSettings.theme, 20 | }, 21 | }); 22 | if (userSettings.php) { 23 | this.server.php = userSettings.php; 24 | } 25 | this.running = false; 26 | } 27 | 28 | run = () => { 29 | this.server.run(); 30 | this.running = true; 31 | }; 32 | 33 | close = () => { 34 | this.server.close(); 35 | this.running = false; 36 | }; 37 | 38 | host = () => this.server.host; 39 | 40 | port = () => this.server.port; 41 | 42 | canStart = () => canExecutePHP(this.server.php); 43 | } 44 | 45 | module.exports = { 46 | newServer: () => new AdminerServer(), 47 | 48 | loginAndGetConnectionInfo: (args) => { 49 | return new Promise((resolve, reject) => { 50 | const baseUrl = args.baseUrl; 51 | const driver = args.driver; 52 | const server = args.server; 53 | const username = args.username; 54 | const password = args.password; 55 | const filepath = args.filepath; 56 | 57 | let formData; 58 | if (driver === "sqlite" || driver === "sqlite2") { 59 | formData = { 60 | "auth[driver]": driver, 61 | "auth[username]": "", 62 | "auth[password]": Const.sqliteDummyPassword, 63 | "auth[db]": filepath, 64 | }; 65 | } else { 66 | formData = { 67 | "auth[driver]": driver, 68 | "auth[server]": server, 69 | "auth[username]": username, 70 | "auth[password]": password, 71 | }; 72 | } 73 | const options = { url: baseUrl, method: "POST", form: formData }; 74 | 75 | request(options, (error, response, body) => { 76 | if (error) { 77 | return reject(error); 78 | } 79 | const statusCode = response["statusCode"]; 80 | if (statusCode !== 302) { 81 | return reject(); 82 | } 83 | const cookieStr = response["headers"]["set-cookie"][0]; 84 | const location = response["headers"]["location"]; 85 | const adminerSid = cookieStr.match("adminer_sid=([^¥S;]*)")[1]; 86 | return resolve({ 87 | redirectUrl: baseUrl + location, 88 | cookie: { 89 | url: baseUrl, 90 | name: "adminer_sid", 91 | value: adminerSid, 92 | }, 93 | }); 94 | }); 95 | }); 96 | }, 97 | 98 | checkConnection: (conn) => { 99 | return new Promise((resolve, reject) => { 100 | const cookie = request.cookie(`${conn.cookie.name}=${conn.cookie.value}`); 101 | const headers = { 102 | Cookie: cookie, 103 | }; 104 | const options = { 105 | url: conn.redirectUrl, 106 | method: "GET", 107 | headers: headers, 108 | }; 109 | request(options, (error, response, body) => { 110 | if (error) { 111 | return reject(error); 112 | } 113 | const statusCode = response["statusCode"]; 114 | if (statusCode !== 200) { 115 | return reject(); 116 | } 117 | resolve(conn); 118 | }); 119 | }); 120 | }, 121 | }; 122 | -------------------------------------------------------------------------------- /src/const.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | sqliteDummyPassword: "dummy", 3 | }; 4 | -------------------------------------------------------------------------------- /src/elm/Connection.elm: -------------------------------------------------------------------------------- 1 | module Connection exposing 2 | ( Connection(..) 3 | , ConnectionFields 4 | , DefaultConnectionSetting 5 | , SqliteConnectionSetting 6 | , connectionDecoder 7 | , connectionsDecoder 8 | , defaultConnectionSettingDecoder 9 | , emptyConnection 10 | , encodeConnection 11 | , id 12 | , initConnectionFields 13 | , setPassword 14 | , sqliteConnectionSettingDecoder 15 | , system 16 | , toConnection 17 | , toConnectionFields 18 | ) 19 | 20 | import Json.Decode as JD 21 | import Json.Encode as JE 22 | 23 | 24 | type alias ConnectionFields = 25 | { id : String 26 | , system : String 27 | , name : String 28 | , hostname : String 29 | , portStr : String 30 | , username : String 31 | , password : String 32 | , savePassword : Maybe Bool 33 | , filepath : String 34 | } 35 | 36 | 37 | initConnectionFields : ConnectionFields 38 | initConnectionFields = 39 | { id = "" 40 | , system = "server" 41 | , name = "" 42 | , hostname = "" 43 | , portStr = "" 44 | , username = "" 45 | , password = "" 46 | , filepath = "" 47 | , savePassword = Just True 48 | } 49 | 50 | 51 | toConnectionFields : Connection -> ConnectionFields 52 | toConnectionFields c = 53 | case c of 54 | DefaultConnection s -> 55 | { id = s.id 56 | , system = s.system 57 | , name = s.name 58 | , hostname = s.hostname 59 | , portStr = s.portStr 60 | , username = s.username 61 | , password = s.password 62 | , savePassword = Just s.savePassword 63 | , filepath = "" 64 | } 65 | 66 | SqliteConnection s -> 67 | { id = s.id 68 | , system = s.system 69 | , name = s.name 70 | , hostname = "" 71 | , portStr = "" 72 | , username = "" 73 | , password = "" 74 | , savePassword = Nothing 75 | , filepath = s.filepath 76 | } 77 | 78 | 79 | toConnection : ConnectionFields -> Connection 80 | toConnection c = 81 | if c.system == "sqlite" || c.system == "sqlite2" then 82 | SqliteConnection 83 | { id = c.id 84 | , system = c.system 85 | , name = c.name 86 | , filepath = c.filepath 87 | } 88 | 89 | else 90 | DefaultConnection 91 | { id = c.id 92 | , system = c.system 93 | , name = c.name 94 | , hostname = c.hostname 95 | , portStr = c.portStr 96 | , username = c.username 97 | , password = c.password 98 | , savePassword = c.savePassword |> Maybe.withDefault True 99 | } 100 | 101 | 102 | type Connection 103 | = DefaultConnection DefaultConnectionSetting 104 | | SqliteConnection SqliteConnectionSetting 105 | 106 | 107 | emptyConnection : Connection 108 | emptyConnection = 109 | DefaultConnection 110 | { id = "" 111 | , system = "server" 112 | , name = "" 113 | , hostname = "" 114 | , portStr = "" 115 | , username = "" 116 | , password = "" 117 | , savePassword = True 118 | } 119 | 120 | 121 | id : Connection -> String 122 | id c = 123 | case c of 124 | DefaultConnection s -> 125 | s.id 126 | 127 | SqliteConnection s -> 128 | s.id 129 | 130 | 131 | system : Connection -> String 132 | system c = 133 | case c of 134 | DefaultConnection s -> 135 | s.system 136 | 137 | SqliteConnection s -> 138 | s.system 139 | 140 | 141 | setPassword : String -> Connection -> Connection 142 | setPassword password conn = 143 | case conn of 144 | DefaultConnection s -> 145 | DefaultConnection 146 | { s 147 | | password = password 148 | , savePassword = True 149 | } 150 | 151 | _ -> 152 | conn 153 | 154 | 155 | connectionsDecoder : JD.Decoder (List Connection) 156 | connectionsDecoder = 157 | JD.list connectionDecoder 158 | 159 | 160 | connectionDecoder : JD.Decoder Connection 161 | connectionDecoder = 162 | JD.oneOf 163 | [ JD.map DefaultConnection defaultConnectionSettingDecoder 164 | , JD.map SqliteConnection sqliteConnectionSettingDecoder 165 | ] 166 | 167 | 168 | encodeConnection : Connection -> JE.Value 169 | encodeConnection c = 170 | case c of 171 | DefaultConnection s -> 172 | encodeDefaultConnection s 173 | 174 | SqliteConnection s -> 175 | encodeSqliteConnection s 176 | 177 | 178 | type alias DefaultConnectionSetting = 179 | { id : String 180 | , system : String 181 | , name : String 182 | , hostname : String 183 | , portStr : String 184 | , username : String 185 | , password : String 186 | , savePassword : Bool 187 | } 188 | 189 | 190 | defaultConnectionSettingDecoder : JD.Decoder DefaultConnectionSetting 191 | defaultConnectionSettingDecoder = 192 | JD.map8 DefaultConnectionSetting 193 | (JD.field "id" JD.string) 194 | (JD.field "driver" JD.string) 195 | (JD.field "name" JD.string) 196 | (JD.field "hostname" JD.string) 197 | (JD.field "port" JD.string) 198 | (JD.field "username" JD.string) 199 | (JD.field "password" JD.string) 200 | (JD.field "savePassword" JD.bool) 201 | 202 | 203 | encodeDefaultConnection : DefaultConnectionSetting -> JE.Value 204 | encodeDefaultConnection c = 205 | let 206 | password = 207 | if c.savePassword then 208 | c.password 209 | 210 | else 211 | "" 212 | in 213 | JE.object 214 | [ ( "type", JE.string "default" ) 215 | , ( "id", JE.string c.id ) 216 | , ( "driver", JE.string c.system ) 217 | , ( "name", JE.string c.name ) 218 | , ( "hostname", JE.string c.hostname ) 219 | , ( "port", JE.string c.portStr ) 220 | , ( "username", JE.string c.username ) 221 | , ( "password", JE.string password ) 222 | , ( "savePassword", JE.bool c.savePassword ) 223 | ] 224 | 225 | 226 | type alias SqliteConnectionSetting = 227 | { id : String 228 | , system : String 229 | , name : String 230 | , filepath : String 231 | } 232 | 233 | 234 | sqliteConnectionSettingDecoder : JD.Decoder SqliteConnectionSetting 235 | sqliteConnectionSettingDecoder = 236 | JD.map4 SqliteConnectionSetting 237 | (JD.field "id" JD.string) 238 | (JD.field "driver" JD.string) 239 | (JD.field "name" JD.string) 240 | (JD.field "filepath" JD.string) 241 | 242 | 243 | encodeSqliteConnection : SqliteConnectionSetting -> JE.Value 244 | encodeSqliteConnection c = 245 | JE.object 246 | [ ( "type", JE.string "sqlite" ) 247 | , ( "id", JE.string c.id ) 248 | , ( "driver", JE.string c.system ) 249 | , ( "name", JE.string c.name ) 250 | , ( "filepath", JE.string c.filepath ) 251 | ] 252 | -------------------------------------------------------------------------------- /src/elm/Menu.elm: -------------------------------------------------------------------------------- 1 | port module Menu exposing (main) 2 | 3 | import Browser 4 | import Html exposing (Html, div, i, span) 5 | import Html.Attributes exposing (class) 6 | import Html.Events exposing (onClick) 7 | 8 | 9 | port home : () -> Cmd msg 10 | 11 | 12 | port settings : () -> Cmd msg 13 | 14 | 15 | main : Program () Model Msg 16 | main = 17 | Browser.element 18 | { init = init 19 | , update = update 20 | , view = view 21 | , subscriptions = subscriptions 22 | } 23 | 24 | 25 | type alias Model = 26 | {} 27 | 28 | 29 | init : () -> ( Model, Cmd msg ) 30 | init _ = 31 | ( initModel 32 | , Cmd.none 33 | ) 34 | 35 | 36 | initModel : Model 37 | initModel = 38 | {} 39 | 40 | 41 | type Msg 42 | = OnClickHome 43 | | OnClickSettings 44 | 45 | 46 | update : Msg -> Model -> ( Model, Cmd Msg ) 47 | update msg model = 48 | case msg of 49 | OnClickHome -> 50 | ( model 51 | , home () 52 | ) 53 | 54 | OnClickSettings -> 55 | ( model 56 | , settings () 57 | ) 58 | 59 | 60 | subscriptions : Model -> Sub Msg 61 | subscriptions _ = 62 | Sub.none 63 | 64 | 65 | view : Model -> Html Msg 66 | view _ = 67 | div [ class "menu-area" ] 68 | [ div [ onClick OnClickHome ] 69 | [ span [ class "icon btn-icon" ] [ i [ class "fas fa-home" ] [] ] ] 70 | , div [ onClick OnClickSettings ] 71 | [ span [ class "icon btn-icon btn-icon-bottom" ] [ i [ class "fas fa-cog" ] [] ] ] 72 | ] 73 | -------------------------------------------------------------------------------- /src/index.php: -------------------------------------------------------------------------------- 1 | ({ 36 | x: menuViewWidth, 37 | y: 0, 38 | width: w - menuViewWidth, 39 | height: h, 40 | }); 41 | const menuContentBounds = (h) => ({ 42 | x: 0, 43 | y: 0, 44 | width: menuViewWidth, 45 | height: h, 46 | }); 47 | const zeroContentBounds = () => ({ x: 0, y: 0, width: 0, height: 0 }); 48 | 49 | mainWindow = new BrowserWindow({ 50 | width: defaultWindowWidth, 51 | height: defaultWindowHeight, 52 | useContentSize: true, 53 | }); 54 | mainWindow.setMinimumSize(minWindowWidth, minWindowHeight); 55 | 56 | const newBrowserView = (preload) => { 57 | const options = preload 58 | ? { 59 | webPreferences: { 60 | nodeIntegration: false, 61 | preload: `${__dirname}/preload.js`, 62 | }, 63 | } 64 | : {}; 65 | const view = new BrowserView(options); 66 | mainWindow.addBrowserView(view); 67 | return view; 68 | }; 69 | 70 | const menuView = newBrowserView(true); 71 | menuView.setBounds(menuContentBounds(mainWindow.getContentSize()[1])); 72 | menuView.setAutoResize({ 73 | height: true, 74 | }); 75 | menuView.webContents.loadURL("file://" + __dirname + "/view/menu.html"); 76 | 77 | const homeView = newBrowserView(true); 78 | homeView.setBounds(mainContentBounds(...mainWindow.getContentSize())); 79 | homeView.setAutoResize({ 80 | width: true, 81 | height: true, 82 | }); 83 | const homeUrl = "file://" + __dirname + "/view/home.html"; 84 | homeView.webContents.loadURL(homeUrl); 85 | 86 | const mainView = newBrowserView(false); 87 | mainView.setBounds(zeroContentBounds()); 88 | mainView.setAutoResize({ 89 | width: true, 90 | height: true, 91 | }); 92 | mainView.webContents.loadURL(baseUrl); 93 | 94 | mainWindow.on("closed", function() { 95 | server.close(); 96 | mainWindow = null; 97 | }); 98 | 99 | let settingsView; 100 | const createSettingsView = () => { 101 | settingsView = newBrowserView(true); 102 | 103 | settingsView.setBounds(mainContentBounds(...mainWindow.getContentSize())); 104 | settingsView.setAutoResize({ 105 | width: true, 106 | height: true, 107 | }); 108 | settingsView.webContents.loadURL( 109 | "file://" + __dirname + "/view/settings.html" 110 | ); 111 | }; 112 | 113 | const openSettings = () => { 114 | if (!settingsView) { 115 | createSettingsView(); 116 | } 117 | mainView.setBounds(zeroContentBounds()); 118 | homeView.setBounds(zeroContentBounds()); 119 | }; 120 | 121 | const closeSettings = () => { 122 | if (settingsView) { 123 | mainWindow.removeBrowserView(settingsView); 124 | settingsView.webContents.destroy(); 125 | settingsView = null; 126 | } 127 | mainView.setBounds(zeroContentBounds()); 128 | homeView.setBounds(mainContentBounds(...mainWindow.getContentSize())); 129 | }; 130 | 131 | const openAdminerView = () => { 132 | homeView.setBounds(zeroContentBounds()); 133 | mainView.setBounds(mainContentBounds(...mainWindow.getContentSize())); 134 | }; 135 | 136 | ipcMain.on("HOME", () => { 137 | mainView.webContents.loadURL(homeUrl); 138 | closeSettings(); 139 | }); 140 | 141 | ipcMain.on("SETTINGS", () => { 142 | openSettings(); 143 | }); 144 | 145 | ipcMain.on("HOME_LOADED", (event) => { 146 | event.reply("HOME_LOADED_REPLY", Connections.load()); 147 | }); 148 | 149 | ipcMain.on("SETTINGS_LOADED", (event) => { 150 | event.reply("SETTINGS_LOADED_REPLY", UserSettings.load()); 151 | }); 152 | 153 | ipcMain.on("SETTINGS_SAVE", (event, args) => { 154 | UserSettings.save(args.settings); 155 | if (args.restart) { 156 | app.relaunch(); 157 | app.exit(); 158 | } 159 | }); 160 | 161 | ipcMain.on("SETTINGS_CANCEL", () => { 162 | closeSettings(); 163 | }); 164 | 165 | ipcMain.on("OPEN_CONNECTION", (event, args) => { 166 | if (!server.running) { 167 | event.reply("PHP_SERVER_NOT_RUNNING"); 168 | return; 169 | } 170 | Adminer.loginAndGetConnectionInfo({ 171 | baseUrl: `http://localhost:${server.port()}/src/`, 172 | driver: args.driver, 173 | server: `${args.hostname}:${args.port}`, 174 | username: args.username, 175 | password: args.password, 176 | filepath: args.filepath, 177 | }) 178 | .then(Adminer.checkConnection) 179 | .then((result) => 180 | mainWindow.webContents.session.cookies 181 | .set(result.cookie) 182 | .then(() => mainView.webContents.loadURL(result.redirectUrl)) 183 | ) 184 | .then(openAdminerView) 185 | .catch((err) => event.reply("OPEN_CONNECTION_FAILURE")) // TODO: show detail 186 | .finally(() => event.reply("OPEN_CONNECTION_COMPLETE")); 187 | }); 188 | 189 | ipcMain.on("SAVE_NEW_CONNECTION", (event, args) => { 190 | const newConnection = args; 191 | Connections.save(args); 192 | event.reply("SAVE_NEW_CONNECTION_SUCCESS", newConnection); 193 | }); 194 | 195 | ipcMain.on("SAVE_EDIT_CONNECTION", (event, args) => { 196 | const newConnection = args; 197 | Connections.update(newConnection); 198 | event.reply("SAVE_EDIT_CONNECTION_SUCCESS", newConnection); 199 | }); 200 | 201 | ipcMain.on("REMOVE_CONNECTION", (event, args) => { 202 | const id = args; 203 | Connections.removeConnection(id); 204 | event.reply("REMOVE_CONNECTION_SUCCESS", id); 205 | }); 206 | 207 | ipcMain.on("OPEN_ADMINER_HOME", (event) => { 208 | if (!server.running) { 209 | event.reply("PHP_SERVER_NOT_RUNNING"); 210 | return; 211 | } 212 | mainView.webContents.loadURL(baseUrl); 213 | openAdminerView(); 214 | }); 215 | 216 | ipcMain.on("OPEN_SQLITE_FILE_DIALOG", (event) => { 217 | const result = dialog.showOpenDialogSync(mainWindow, { 218 | properties: ["openFile"], 219 | }); 220 | if (result) { 221 | event.reply("OPEN_SQLITE_FILE_DIALOG_SUCCESS", result[0]); 222 | } 223 | }); 224 | 225 | ipcMain.on("OPEN_PHP_EXECUTABLE_PATH_FILE_DIALOG", (event) => { 226 | const result = dialog.showOpenDialogSync(mainWindow, { 227 | properties: ["openFile"], 228 | }); 229 | if (result) { 230 | event.reply("OPEN_PHP_EXECUTABLE_PATH_FILE_DIALOG_SUCCESS", result[0]); 231 | } 232 | }); 233 | 234 | ipcMain.on("VERIFY_PHP_EXECUTABLE_PATH", (event, args) => { 235 | const php = args || "php"; 236 | const ret = canExecutePHP(php); 237 | event.reply("VERIFY_PHP_EXECUTABLE_PATH_SUCCESS", ret); 238 | }); 239 | } 240 | 241 | app.on("activate", function() { 242 | if (mainWindow === null) { 243 | createWindow(); 244 | } 245 | }); 246 | 247 | app.on("ready", createWindow); 248 | -------------------------------------------------------------------------------- /src/php.js: -------------------------------------------------------------------------------- 1 | const execa = require("execa"); 2 | 3 | module.exports = { 4 | // ref: https://github.com/felixfbecker/vscode-php-intellisense/blob/master/src/extension.ts 5 | canExecutePHP: (php) => { 6 | try { 7 | const result = execa.sync(php, ["--version"]); 8 | const match = result.stdout.match(/^PHP 7/); 9 | return result.exitCode === 0 && !!match; 10 | } catch (e) { 11 | return false; 12 | } 13 | }, 14 | }; 15 | -------------------------------------------------------------------------------- /src/preload.js: -------------------------------------------------------------------------------- 1 | const home = require("../dst/home.js"); 2 | const menu = require("../dst/menu.js"); 3 | const settings = require("../dst/settings.js"); 4 | const { ipcRenderer } = require("electron"); 5 | 6 | window.home = home; 7 | window.menu = menu; 8 | window.settings = settings; 9 | window.ipcRenderer = ipcRenderer; 10 | -------------------------------------------------------------------------------- /src/store.js: -------------------------------------------------------------------------------- 1 | const Store = require("electron-store"); 2 | 3 | module.exports = { 4 | UserSettings: class UserSettings { 5 | static load() { 6 | const store = new Store(); 7 | return new UserSettings({ 8 | php: store.get("general.php", ""), 9 | port: store.get("general.port", 8000), 10 | theme: store.get("appearance.theme", "default"), 11 | }); 12 | } 13 | 14 | static save(params) { 15 | const store = new Store(); 16 | store.set("general.php", params.php); 17 | store.set("general.port", params.port); 18 | store.set("appearance.theme", params.theme); 19 | } 20 | 21 | constructor(params) { 22 | this.php = params.php; 23 | this.port = params.port; 24 | this.theme = params.theme; 25 | } 26 | }, 27 | 28 | Connections: class Connections { 29 | static load() { 30 | const store = new Store(); 31 | return store.get("connections", []); 32 | } 33 | 34 | static save(conn) { 35 | const connections = Connections.load(); 36 | connections.unshift(conn); 37 | const store = new Store(); 38 | store.set("connections", connections); 39 | } 40 | 41 | static update(conn) { 42 | const connections = Connections.load(); 43 | const newConenctions = connections.map((c) => 44 | c.id === conn.id ? conn : c 45 | ); 46 | const store = new Store(); 47 | store.set("connections", newConenctions); 48 | } 49 | 50 | static removeConnection(id) { 51 | const connections = Connections.load(); 52 | const newConnections = connections.filter((c) => c.id !== id); 53 | const store = new Store(); 54 | store.set("connections", newConnections); 55 | } 56 | }, 57 | }; 58 | -------------------------------------------------------------------------------- /src/view/home.css: -------------------------------------------------------------------------------- 1 | .card-icon-title { 2 | cursor: pointer; 3 | } 4 | 5 | .card-icon-title:hover { 6 | color: hsl(217, 71%, 53%); /* has-text-link */ 7 | } 8 | 9 | .card-icon-edit { 10 | color: hsl(0, 0%, 86%); /* has-text-grey-lighter */ 11 | cursor: pointer; 12 | } 13 | 14 | .card-icon-edit:hover { 15 | color: hsl(171, 100%, 41%); /* has-text-primary */ 16 | } 17 | 18 | .card-icon-danger { 19 | color: hsl(0, 0%, 86%); 20 | cursor: pointer; 21 | } 22 | 23 | .card-icon-danger:hover { 24 | color: hsl(348, 100%, 61%); /* has-text-danger */ 25 | } 26 | 27 | .loader-wrapper { 28 | visibility: hidden; 29 | position: absolute; 30 | top: 0; 31 | left: 0; 32 | height: 100%; 33 | width: 100%; 34 | background: #fff; 35 | opacity: 0; 36 | z-index: -1; 37 | transition: opacity .3s; 38 | display: flex; 39 | justify-content: center; 40 | align-items: center; 41 | border-radius: 6px; 42 | } 43 | 44 | .loader-wrapper .loader { 45 | height: 100px; 46 | width: 100px; 47 | } 48 | 49 | .loader-wrapper.is-active { 50 | visibility: visible; 51 | opacity: 0.7; 52 | z-index: 9999; 53 | } -------------------------------------------------------------------------------- /src/view/home.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | -------------------------------------------------------------------------------- /src/view/home.js: -------------------------------------------------------------------------------- 1 | const Elm = window.home.Elm; 2 | const ipcRenderer = window.ipcRenderer; 3 | 4 | const app = Elm.Home.init({ 5 | node: document.getElementById("elm"), 6 | }); 7 | 8 | app.ports.loaded.subscribe(() => { 9 | ipcRenderer.send("HOME_LOADED"); 10 | }); 11 | 12 | ipcRenderer.on("HOME_LOADED_REPLY", (_, args) => { 13 | app.ports.loadConnections.send(args); 14 | }); 15 | 16 | app.ports.openConnection.subscribe((data) => { 17 | ipcRenderer.send("OPEN_CONNECTION", data); 18 | }); 19 | 20 | ipcRenderer.on("OPEN_CONNECTION_COMPLETE", () => { 21 | app.ports.openConnectionComplete.send(null); 22 | }); 23 | 24 | ipcRenderer.on("OPEN_CONNECTION_FAILURE", () => { 25 | app.ports.openConnectionFailure.send(null); 26 | }); 27 | 28 | app.ports.saveNewConnection.subscribe((data) => { 29 | ipcRenderer.send("SAVE_NEW_CONNECTION", data); 30 | }); 31 | 32 | ipcRenderer.on("SAVE_NEW_CONNECTION_SUCCESS", (_, args) => { 33 | app.ports.saveNewConnectionSuccess.send(args); 34 | }); 35 | 36 | app.ports.saveEditConnection.subscribe((data) => { 37 | ipcRenderer.send("SAVE_EDIT_CONNECTION", data); 38 | }); 39 | 40 | ipcRenderer.on("SAVE_EDIT_CONNECTION_SUCCESS", (_, args) => { 41 | app.ports.saveEditConnectionSuccess.send(args); 42 | }); 43 | 44 | app.ports.removeConnection.subscribe((data) => { 45 | ipcRenderer.send("REMOVE_CONNECTION", data); 46 | }); 47 | 48 | ipcRenderer.on("REMOVE_CONNECTION_SUCCESS", (_, args) => { 49 | app.ports.removeConnectionSuccess.send(args); 50 | }); 51 | 52 | app.ports.openAdminerHome.subscribe((data) => { 53 | ipcRenderer.send("OPEN_ADMINER_HOME", data); 54 | }); 55 | 56 | app.ports.openSqliteFileDialog.subscribe((data) => { 57 | ipcRenderer.send("OPEN_SQLITE_FILE_DIALOG", data); 58 | }); 59 | 60 | ipcRenderer.on("OPEN_SQLITE_FILE_DIALOG_SUCCESS", (_, args) => { 61 | app.ports.openSqliteFileDialogSuccess.send(args); 62 | }); 63 | 64 | ipcRenderer.on("PHP_SERVER_NOT_RUNNING", () => { 65 | app.ports.phpServerNotRunning.send(null); 66 | }); 67 | -------------------------------------------------------------------------------- /src/view/menu.css: -------------------------------------------------------------------------------- 1 | body { 2 | background-color: #e2e2e2; 3 | } 4 | 5 | .menu-area { 6 | text-align: center; 7 | } 8 | 9 | .btn-icon { 10 | font-size: 28px; 11 | user-select: none; 12 | } 13 | 14 | .btn-icon:hover { 15 | cursor: pointer; 16 | opacity: 0.5; 17 | } 18 | 19 | .btn-icon-bottom { 20 | position: absolute; 21 | left: 0; 22 | right: 0; 23 | bottom: 10px; 24 | margin: auto; 25 | } 26 | -------------------------------------------------------------------------------- /src/view/menu.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | -------------------------------------------------------------------------------- /src/view/menu.js: -------------------------------------------------------------------------------- 1 | const Elm = window.menu.Elm; 2 | const ipcRenderer = window.ipcRenderer; 3 | 4 | const app = Elm.Menu.init({ 5 | node: document.getElementById("elm"), 6 | }); 7 | 8 | app.ports.home.subscribe(() => { 9 | ipcRenderer.send("HOME"); 10 | }); 11 | 12 | app.ports.settings.subscribe(() => { 13 | ipcRenderer.send("SETTINGS"); 14 | }); 15 | -------------------------------------------------------------------------------- /src/view/settings.css: -------------------------------------------------------------------------------- 1 | .buttons { 2 | position: fixed; 3 | right: 30px; 4 | bottom: 20px; 5 | } 6 | 7 | .notification { 8 | visibility: hidden; 9 | position: fixed; 10 | right: 30px; 11 | top: 20px; 12 | opacity: 0.0; 13 | transition: all 1000ms 0s linear; 14 | } 15 | 16 | .notification-visible { 17 | visibility: visible; 18 | opacity: 1.0; 19 | } -------------------------------------------------------------------------------- /src/view/settings.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | -------------------------------------------------------------------------------- /src/view/settings.js: -------------------------------------------------------------------------------- 1 | const Elm = window.settings.Elm; 2 | const ipcRenderer = window.ipcRenderer; 3 | 4 | const app = Elm.Settings.init({ 5 | node: document.getElementById("elm"), 6 | }); 7 | 8 | app.ports.documentLoaded.subscribe(() => { 9 | ipcRenderer.send("SETTINGS_LOADED"); 10 | }); 11 | 12 | ipcRenderer.on("SETTINGS_LOADED_REPLY", (_, args) => { 13 | app.ports.loadSettings.send(args); 14 | }); 15 | 16 | app.ports.cancel.subscribe(() => { 17 | ipcRenderer.send("SETTINGS_CANCEL"); 18 | }); 19 | 20 | app.ports.verifyPhpExecutablePath.subscribe((data) => { 21 | ipcRenderer.send("VERIFY_PHP_EXECUTABLE_PATH", data); 22 | }); 23 | 24 | ipcRenderer.on("VERIFY_PHP_EXECUTABLE_PATH_SUCCESS", (_, args) => { 25 | app.ports.verifyPhpExecutablePathSuccess.send(args); 26 | }); 27 | 28 | app.ports.openPhpExecutablePathFileDialog.subscribe(() => { 29 | ipcRenderer.send("OPEN_PHP_EXECUTABLE_PATH_FILE_DIALOG"); 30 | }); 31 | 32 | ipcRenderer.on("OPEN_PHP_EXECUTABLE_PATH_FILE_DIALOG_SUCCESS", (_, args) => { 33 | app.ports.openPhpExecutablePathFileDialogSuccess.send(args); 34 | }); 35 | 36 | app.ports.restart.subscribe((data) => { 37 | ipcRenderer.send("SETTINGS_SAVE", { 38 | settings: data, 39 | restart: true, 40 | }); 41 | }); 42 | 43 | app.ports.postpone.subscribe((data) => { 44 | ipcRenderer.send("SETTINGS_SAVE", { 45 | settings: data, 46 | restart: false, 47 | }); 48 | }); 49 | -------------------------------------------------------------------------------- /tests/ConnectionTest.elm: -------------------------------------------------------------------------------- 1 | module ConnectionTest exposing (suite) 2 | 3 | import Connection 4 | import Expect 5 | import Json.Decode as JD 6 | import Test exposing (Test, describe, test) 7 | 8 | 9 | suite : Test 10 | suite = 11 | describe "Connection module" 12 | [ describe "connection decoder" 13 | [ test "defaultConnectionSettingDecoder" <| 14 | \() -> 15 | let 16 | json = 17 | """ 18 | { 19 | "type": "default", 20 | "id": "73ea006d-8627-4ff0-90a9-62f2119d642b", 21 | "driver": "server", 22 | "name": "test server", 23 | "hostname": "127.0.0.1", 24 | "port": "12345", 25 | "username": "root", 26 | "password": "P@ssw0rd", 27 | "savePassword": true 28 | } 29 | """ 30 | 31 | expected = 32 | Ok 33 | { id = "73ea006d-8627-4ff0-90a9-62f2119d642b" 34 | , system = "server" 35 | , name = "test server" 36 | , hostname = "127.0.0.1" 37 | , portStr = "12345" 38 | , username = "root" 39 | , password = "P@ssw0rd" 40 | , savePassword = True 41 | } 42 | 43 | actual = 44 | JD.decodeString Connection.defaultConnectionSettingDecoder json 45 | in 46 | Expect.equal actual expected 47 | , test "sqliteConnectionSettingDecoder" <| 48 | \() -> 49 | let 50 | json = 51 | """ 52 | { 53 | "type": "sqlite", 54 | "id": "73ea006d-8627-4ff0-90a9-62f2119d642b", 55 | "driver": "sqlite", 56 | "name": "test sqlite3 server", 57 | "filepath": "/path/to/file/test.db" 58 | } 59 | """ 60 | 61 | expected = 62 | Ok 63 | { id = "73ea006d-8627-4ff0-90a9-62f2119d642b" 64 | , system = "sqlite" 65 | , name = "test sqlite3 server" 66 | , filepath = "/path/to/file/test.db" 67 | } 68 | 69 | actual = 70 | JD.decodeString Connection.sqliteConnectionSettingDecoder json 71 | in 72 | Expect.equal actual expected 73 | , test "connectionsDecoder" <| 74 | \() -> 75 | let 76 | json = 77 | """ 78 | [ 79 | { 80 | "type": "sqlite", 81 | "id": "73ea006d-8627-4ff0-90a9-62f2119d642b", 82 | "driver": "sqlite", 83 | "name": "test sqlite3 server", 84 | "filepath": "/path/to/file/test.db" 85 | }, 86 | { 87 | "type": "default", 88 | "id": "73ea006d-8627-4ff0-90a9-62f2119d642b", 89 | "driver": "server", 90 | "name": "test server", 91 | "hostname": "127.0.0.1", 92 | "port": "12345", 93 | "username": "root", 94 | "password": "P@ssw0rd", 95 | "savePassword": false 96 | } 97 | ] 98 | """ 99 | 100 | expected = 101 | Ok 102 | [ Connection.SqliteConnection 103 | { id = "73ea006d-8627-4ff0-90a9-62f2119d642b" 104 | , system = "sqlite" 105 | , name = "test sqlite3 server" 106 | , filepath = "/path/to/file/test.db" 107 | } 108 | , Connection.DefaultConnection 109 | { id = "73ea006d-8627-4ff0-90a9-62f2119d642b" 110 | , system = "server" 111 | , name = "test server" 112 | , hostname = "127.0.0.1" 113 | , portStr = "12345" 114 | , username = "root" 115 | , password = "P@ssw0rd" 116 | , savePassword = False 117 | } 118 | ] 119 | 120 | actual = 121 | JD.decodeString Connection.connectionsDecoder json 122 | in 123 | Expect.equal actual expected 124 | ] 125 | ] 126 | --------------------------------------------------------------------------------