├── .gitattributes ├── .gitignore ├── CREDITS.md ├── LICENSE.md ├── README.md ├── app ├── bootstrap │ └── darkly.css ├── demo.css ├── demo.js ├── index.html └── perl_scripts │ ├── new_file.pl │ ├── open_directory.pl │ ├── open_file.pl │ └── perl_info.pl ├── deb └── DEBIAN │ └── control ├── doc ├── application-directory.md ├── perl-scripts-api.md └── screenshot.png ├── makedeb.sh └── src ├── main.cpp ├── page.cpp ├── page.h ├── peb.pro ├── resources ├── camel.png └── peb.qrc ├── script-handler.cpp ├── script-handler.h ├── view.cpp ├── view.h ├── window.cpp └── window.h /.gitattributes: -------------------------------------------------------------------------------- 1 | src/resources/icon/* linguist-vendored 2 | app/bootstrap/*.css linguist-vendored 3 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | src/build 2 | src/tmp 3 | 4 | .qmake.stash 5 | *.autosave 6 | Makefile 7 | peb.pro.* 8 | 9 | *.deb 10 | 11 | peb 12 | 13 | backup 14 | upgit 15 | -------------------------------------------------------------------------------- /CREDITS.md: -------------------------------------------------------------------------------- 1 | # Perl Executing Browser - Thanks and Credits 2 | 3 | Amata mea Argeia - gratiam magnam tibi ago! 4 | Patientia tua in studiis meis computatoriis auxilium meum maximum! 5 | 6 | Being in debt to each and every one, 7 | who prepared the official Perl and Qt documentation or 8 | shared useful knowledge on a variety of forums, blogs and other sites, 9 | I thank them all! 10 | Their expertise, effort and good are highly appreciated! 11 | 12 | Special thanks to the staff of the Library of the New Bulgarian University, 13 | where much of the initial development effort took place! 14 | https://www.nbu.bg/en/library/library 15 | 16 | Special thanks to Stack Overflow users peppe, Piotr Dobrogost and Fèlix Galindo Allué. 17 | Their example code is no longer used in Perl Executing Browser, 18 | but their expertise and good will to help others are not forgotten! 19 | 20 | Thanks to Jennifer Maher-Bontrager, author of the Camel icon. 21 | http://www.iconarchive.com/show/animal-icons-by-jen/Camel-icon.html 22 | 23 | Thanks to Leon Anavi, Valentin Alexiev, Stefan Chekanov, Rangel Ivanov, Philip Georgiev, 24 | karaman, sisvenvet and all other members of Hackafe, the hackerspace of Plovdiv, 25 | for being welcoming host of the first public presentation of Perl Executing Browser 26 | on the 2nd of March 2014 and for their helpful proposals. 27 | 28 | Thanks to [probonopd](https://github.com/probonopd) for his 29 | knowledgeable instructions and patient cooperation 30 | in the preparation and testing of Perl Executing Browser AppImages! 31 | Perl Executing Browser currently can not be packed as an AppImage, 32 | but his knowledge and good will to help others are not forgotten! 33 | 34 | ## Qt 35 | 36 | https://github.com/OtterBrowser/otter-browser/blob/master/src/modules/backends/web/qtwebengine/QtWebEnginePage.cpp 37 | https://github.com/OtterBrowser/otter-browser/blob/master/src/modules/backends/web/qtwebengine/QtWebEnginePage.h 38 | 39 | https://doc.qt.io/qt-5/qdir.html#current 40 | https://doc.qt.io/qt-5/qfileinfo.html#isRelative 41 | https://doc.qt.io/qt-5/qtwebenginewidgets-qtwebkitportingguide.html 42 | https://doc.qt.io/qt-5/qwebenginepage.html#runJavaScript 43 | https://doc.qt.io/qt-5/qtwebengine-webenginewidgets-simplebrowser-example.html#adding-context-menu-items 44 | 45 | https://www.qtcentre.org/threads/51965-How-to-return-QString-from-function 46 | 47 | https://forum.qt.io/topic/110568/qwebengine-not-cleaning-up-chromium-processes-and-get-a-warning 48 | 49 | ## Perl 5 50 | 51 | https://github.com/skaji/relocatable-perl 52 | 53 | ## JavaScript 54 | 55 | https://www.w3schools.com/js/ 56 | https://www.w3schools.com/jsref/ 57 | 58 | ## Bootstrap 59 | 60 | https://bootswatch.com/ 61 | 62 | ## Markdown 63 | 64 | https://github.com/adam-p/markdown-here/wiki/Markdown-Cheatsheet 65 | https://github.com/IQAndreas/markdown-licenses 66 | 67 | ## Icon 68 | 69 | http://www.iconarchive.com/show/animal-icons-by-jen/Camel-icon.html 70 | -------------------------------------------------------------------------------- /LICENSE.md: -------------------------------------------------------------------------------- 1 | GNU Lesser General Public License 2 | ================================= 3 | 4 | _Version 3, 29 June 2007_ 5 | _Copyright © 2007 Free Software Foundation, Inc. <>_ 6 | 7 | Everyone is permitted to copy and distribute verbatim copies 8 | of this license document, but changing it is not allowed. 9 | 10 | 11 | This version of the GNU Lesser General Public License incorporates 12 | the terms and conditions of version 3 of the GNU General Public 13 | License, supplemented by the additional permissions listed below. 14 | 15 | ### 0. Additional Definitions 16 | 17 | As used herein, “this License” refers to version 3 of the GNU Lesser 18 | General Public License, and the “GNU GPL” refers to version 3 of the GNU 19 | General Public License. 20 | 21 | “The Library” refers to a covered work governed by this License, 22 | other than an Application or a Combined Work as defined below. 23 | 24 | An “Application” is any work that makes use of an interface provided 25 | by the Library, but which is not otherwise based on the Library. 26 | Defining a subclass of a class defined by the Library is deemed a mode 27 | of using an interface provided by the Library. 28 | 29 | A “Combined Work” is a work produced by combining or linking an 30 | Application with the Library. The particular version of the Library 31 | with which the Combined Work was made is also called the “Linked 32 | Version”. 33 | 34 | The “Minimal Corresponding Source” for a Combined Work means the 35 | Corresponding Source for the Combined Work, excluding any source code 36 | for portions of the Combined Work that, considered in isolation, are 37 | based on the Application, and not on the Linked Version. 38 | 39 | The “Corresponding Application Code” for a Combined Work means the 40 | object code and/or source code for the Application, including any data 41 | and utility programs needed for reproducing the Combined Work from the 42 | Application, but excluding the System Libraries of the Combined Work. 43 | 44 | ### 1. Exception to Section 3 of the GNU GPL 45 | 46 | You may convey a covered work under sections 3 and 4 of this License 47 | without being bound by section 3 of the GNU GPL. 48 | 49 | ### 2. Conveying Modified Versions 50 | 51 | If you modify a copy of the Library, and, in your modifications, a 52 | facility refers to a function or data to be supplied by an Application 53 | that uses the facility (other than as an argument passed when the 54 | facility is invoked), then you may convey a copy of the modified 55 | version: 56 | 57 | * **a)** under this License, provided that you make a good faith effort to 58 | ensure that, in the event an Application does not supply the 59 | function or data, the facility still operates, and performs 60 | whatever part of its purpose remains meaningful, or 61 | 62 | * **b)** under the GNU GPL, with none of the additional permissions of 63 | this License applicable to that copy. 64 | 65 | ### 3. Object Code Incorporating Material from Library Header Files 66 | 67 | The object code form of an Application may incorporate material from 68 | a header file that is part of the Library. You may convey such object 69 | code under terms of your choice, provided that, if the incorporated 70 | material is not limited to numerical parameters, data structure 71 | layouts and accessors, or small macros, inline functions and templates 72 | (ten or fewer lines in length), you do both of the following: 73 | 74 | * **a)** Give prominent notice with each copy of the object code that the 75 | Library is used in it and that the Library and its use are 76 | covered by this License. 77 | * **b)** Accompany the object code with a copy of the GNU GPL and this license 78 | document. 79 | 80 | ### 4. Combined Works 81 | 82 | You may convey a Combined Work under terms of your choice that, 83 | taken together, effectively do not restrict modification of the 84 | portions of the Library contained in the Combined Work and reverse 85 | engineering for debugging such modifications, if you also do each of 86 | the following: 87 | 88 | * **a)** Give prominent notice with each copy of the Combined Work that 89 | the Library is used in it and that the Library and its use are 90 | covered by this License. 91 | 92 | * **b)** Accompany the Combined Work with a copy of the GNU GPL and this license 93 | document. 94 | 95 | * **c)** For a Combined Work that displays copyright notices during 96 | execution, include the copyright notice for the Library among 97 | these notices, as well as a reference directing the user to the 98 | copies of the GNU GPL and this license document. 99 | 100 | * **d)** Do one of the following: 101 | - **0)** Convey the Minimal Corresponding Source under the terms of this 102 | License, and the Corresponding Application Code in a form 103 | suitable for, and under terms that permit, the user to 104 | recombine or relink the Application with a modified version of 105 | the Linked Version to produce a modified Combined Work, in the 106 | manner specified by section 6 of the GNU GPL for conveying 107 | Corresponding Source. 108 | - **1)** Use a suitable shared library mechanism for linking with the 109 | Library. A suitable mechanism is one that **(a)** uses at run time 110 | a copy of the Library already present on the user's computer 111 | system, and **(b)** will operate properly with a modified version 112 | of the Library that is interface-compatible with the Linked 113 | Version. 114 | 115 | * **e)** Provide Installation Information, but only if you would otherwise 116 | be required to provide such information under section 6 of the 117 | GNU GPL, and only to the extent that such information is 118 | necessary to install and execute a modified version of the 119 | Combined Work produced by recombining or relinking the 120 | Application with a modified version of the Linked Version. (If 121 | you use option **4d0**, the Installation Information must accompany 122 | the Minimal Corresponding Source and Corresponding Application 123 | Code. If you use option **4d1**, you must provide the Installation 124 | Information in the manner specified by section 6 of the GNU GPL 125 | for conveying Corresponding Source.) 126 | 127 | ### 5. Combined Libraries 128 | 129 | You may place library facilities that are a work based on the 130 | Library side by side in a single library together with other library 131 | facilities that are not Applications and are not covered by this 132 | License, and convey such a combined library under terms of your 133 | choice, if you do both of the following: 134 | 135 | * **a)** Accompany the combined library with a copy of the same work based 136 | on the Library, uncombined with any other library facilities, 137 | conveyed under the terms of this License. 138 | * **b)** Give prominent notice with the combined library that part of it 139 | is a work based on the Library, and explaining where to find the 140 | accompanying uncombined form of the same work. 141 | 142 | ### 6. Revised Versions of the GNU Lesser General Public License 143 | 144 | The Free Software Foundation may publish revised and/or new versions 145 | of the GNU Lesser General Public License from time to time. Such new 146 | versions will be similar in spirit to the present version, but may 147 | differ in detail to address new problems or concerns. 148 | 149 | Each version is given a distinguishing version number. If the 150 | Library as you received it specifies that a certain numbered version 151 | of the GNU Lesser General Public License “or any later version” 152 | applies to it, you have the option of following the terms and 153 | conditions either of that published version or of any later version 154 | published by the Free Software Foundation. If the Library as you 155 | received it does not specify a version number of the GNU Lesser 156 | General Public License, you may choose any version of the GNU Lesser 157 | General Public License ever published by the Free Software Foundation. 158 | 159 | If the Library as you received it specifies that a proxy can decide 160 | whether future versions of the GNU Lesser General Public License shall 161 | apply, that proxy's public statement of acceptance of any version is 162 | permanent authorization for you to choose that version for the 163 | Library. 164 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Perl Executing Browser 2 | 3 | Perl Executing Browser (PEB) is an HTML user interface for [Perl 5](https://www.perl.org/) desktop applications. 4 | It is a C++ [Qt 5](https://www.qt.io/) program running local Perl scripts as child processes without server. 5 | 6 | ![PEB Screenshot](./doc/screenshot.png "PEB Screenshot") 7 | 8 | ## Contents 9 | 10 | * [Design Objectives](#design-objectives) 11 | * [Features](#features) 12 | * [Requirements](#requirements) 13 | * [Security](#security) 14 | * [Limitations](#limitations) 15 | * [Application Directory](./doc/application-directory.md) 16 | * [Perl Scripts API](./doc/perl-scripts-api.md) 17 | * [Ubuntu Package](#ubuntu-package) 18 | * [Logging](#logging) 19 | * [History](#history) 20 | * [Thanks and Credits](./CREDITS.md) 21 | * [License](./LICENSE.md) 22 | * [Authors](#authors) 23 | 24 | The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", 25 | "SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY" and "OPTIONAL" 26 | in the documentation of this project are to be interpreted as described in [RFC 2119](https://www.ietf.org/rfc/rfc2119.txt). 27 | 28 | ## Design Objectives 29 | 30 | * **1. Easy graphical user interface for Perl 5 desktop applications** 31 | * **2. Secure solution with no server process** 32 | * **3. Maximal reuse of existing web technologies and standards** 33 | 34 | ## Features 35 | 36 | * No limitation on how long a Perl script can run 37 | * Any version of a [relocatable](https://github.com/skaji/relocatable-perl) or standard Perl 5 distribution can be used. 38 | * [Output from Perl scripts is seamlessly inserted in a web-like user interface.](./doc/perl-scripts-api.md) 39 | * [Local full paths can be selected and passed to Perl scripts.](./doc/perl-scripts-api.md) 40 | * [Optional icon](./doc/application-directory.md) 41 | 42 | ## Requirements 43 | 44 | ### Compile-Time Requirements 45 | 46 | * Qt development bundle versions 5.9 - 5.15 47 | * QtWebEngine headers and libraries 48 | 49 | Run the following commands in the root directory of the PEB project to compile PEB: 50 | 51 | ```bash 52 | cd src 53 | qmake -qt=qt5 54 | make 55 | ``` 56 | 57 | ### Runtime Requirements 58 | 59 | * QtWebEngine 5.9 - 5.15 runtime libraries 60 | * Perl 5 - any Linux Perl distribution 61 | PEB will use the first Perl on PATH if a full path to a Perl interpreter is not set. 62 | 63 | ## Security 64 | 65 | * PEB does does not implement and does not use a server process. 66 | * PEB Perl scripts are only local scripts executed with no sandbox. 67 | * PEB does not access web content. 68 | 69 | ## Limitations 70 | 71 | * No access to web content 72 | * No Perl scripting inside frames 73 | * No JavaScript Alert, Confirm and Prompt 74 | * No pop-up windows 75 | * Minimal context menu 76 | * No printing 77 | * No AppImage support 78 | 79 | ## [Application Directory](./doc/application-directory.md) 80 | 81 | ## [Perl Scripts API](./doc/perl-scripts-api.md) 82 | 83 | ## Ubuntu Package 84 | 85 | PEB can be packed as an Ubuntu .deb package and installed using the following commands: 86 | 87 | ```bash 88 | ./makedeb.sh 89 | sudo dpkg -i peb-*-x86_64.deb 90 | ``` 91 | 92 | After installation, PEB becomes a runtime for PEB-based applications and must be started with a PEB Application Directory as its only command-line argument: 93 | 94 | ```bash 95 | peb /full/path/to/application-directory 96 | peb ./relative/path/to/application-directory 97 | ``` 98 | 99 | ## Logging 100 | 101 | PEB has unified logging of all JavaScript and Perl errors in the command-line console. 102 | 103 | ## History 104 | 105 | PEB was started in 2013 as a simple user interface for personal database applications. 106 | 107 | ## [Thanks and Credits](./CREDITS.md) 108 | 109 | ## [License](./LICENSE.md) 110 | 111 | This program is free software; 112 | you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License, 113 | as published by the Free Software Foundation; 114 | either version 3 of the License, or (at your option) any later version. 115 | This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; 116 | without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 117 | 118 | ## Authors 119 | 120 | Dimitar D. Mitov, 2013 - 2024 121 | Valcho Nedelchev, 2014 - 2016 122 | -------------------------------------------------------------------------------- /app/bootstrap/darkly.css: -------------------------------------------------------------------------------- 1 | /*! 2 | * Bootswatch v3.1.1+1 3 | * Homepage: http://bootswatch.com 4 | * Copyright 2012-2014 Thomas Park 5 | * Licensed under MIT 6 | * Based on Bootstrap 7 | */ 8 | /*! normalize.css v3.0.0 | MIT License | git.io/normalize */ 9 | html { 10 | font-family: sans-serif; 11 | -ms-text-size-adjust: 100%; 12 | -webkit-text-size-adjust: 100%; 13 | } 14 | body { 15 | margin: 0; 16 | text-align: center; 17 | } 18 | aside, 19 | details, 20 | figcaption, 21 | figure, 22 | footer, 23 | header, 24 | hgroup, 25 | main, 26 | nav, 27 | section, 28 | summary { 29 | display: block; 30 | } 31 | audio, 32 | canvas, 33 | progress, 34 | video { 35 | display: inline-block; 36 | vertical-align: baseline; 37 | } 38 | audio:not([controls]) { 39 | display: none; 40 | height: 0; 41 | } 42 | [hidden], 43 | template { 44 | display: none; 45 | } 46 | a { 47 | background: transparent; 48 | } 49 | a:active, 50 | a:hover { 51 | outline: 0; 52 | } 53 | abbr[title] { 54 | border-bottom: 1px dotted; 55 | } 56 | b, 57 | strong { 58 | font-weight: bold; 59 | } 60 | dfn { 61 | font-style: italic; 62 | } 63 | h1 { 64 | font-size: 2em; 65 | margin: 0.67em 0; 66 | } 67 | mark { 68 | background: #ff0; 69 | color: #000; 70 | } 71 | small { 72 | font-size: 80%; 73 | } 74 | sub, 75 | sup { 76 | font-size: 75%; 77 | line-height: 0; 78 | position: relative; 79 | vertical-align: baseline; 80 | } 81 | sup { 82 | top: -0.5em; 83 | } 84 | sub { 85 | bottom: -0.25em; 86 | } 87 | img { 88 | border: 0; 89 | } 90 | svg:not(:root) { 91 | overflow: hidden; 92 | } 93 | figure { 94 | margin: 1em 40px; 95 | } 96 | hr { 97 | -moz-box-sizing: content-box; 98 | box-sizing: content-box; 99 | height: 0; 100 | } 101 | pre { 102 | overflow: auto; 103 | } 104 | code, 105 | kbd, 106 | pre, 107 | samp { 108 | font-family: monospace, monospace; 109 | font-size: 1em; 110 | } 111 | button, 112 | input, 113 | optgroup, 114 | select, 115 | textarea { 116 | color: inherit; 117 | font: inherit; 118 | margin: 0; 119 | } 120 | button { 121 | overflow: visible; 122 | } 123 | button, 124 | select { 125 | text-transform: none; 126 | } 127 | button, 128 | html input[type="button"], 129 | input[type="reset"], 130 | input[type="submit"] { 131 | -webkit-appearance: button; 132 | cursor: pointer; 133 | } 134 | button[disabled], 135 | html input[disabled] { 136 | cursor: default; 137 | } 138 | button::-moz-focus-inner, 139 | input::-moz-focus-inner { 140 | border: 0; 141 | padding: 0; 142 | } 143 | input { 144 | line-height: normal; 145 | } 146 | input[type="checkbox"], 147 | input[type="radio"] { 148 | box-sizing: border-box; 149 | padding: 0; 150 | } 151 | input[type="number"]::-webkit-inner-spin-button, 152 | input[type="number"]::-webkit-outer-spin-button { 153 | height: auto; 154 | } 155 | input[type="search"] { 156 | -webkit-appearance: textfield; 157 | -moz-box-sizing: content-box; 158 | -webkit-box-sizing: content-box; 159 | box-sizing: content-box; 160 | } 161 | input[type="search"]::-webkit-search-cancel-button, 162 | input[type="search"]::-webkit-search-decoration { 163 | -webkit-appearance: none; 164 | } 165 | fieldset { 166 | border: 1px solid #c0c0c0; 167 | margin: 0 2px; 168 | padding: 0.35em 0.625em 0.75em; 169 | } 170 | legend { 171 | border: 0; 172 | padding: 0; 173 | } 174 | textarea { 175 | overflow: auto; 176 | } 177 | optgroup { 178 | font-weight: bold; 179 | } 180 | table { 181 | border-collapse: collapse; 182 | border-spacing: 0; 183 | } 184 | td, 185 | th { 186 | padding: 0; 187 | } 188 | @media print { 189 | * { 190 | text-shadow: none !important; 191 | color: #000 !important; 192 | background: transparent !important; 193 | box-shadow: none !important; 194 | } 195 | a, 196 | a:visited { 197 | text-decoration: underline; 198 | } 199 | a[href]:after { 200 | content: " (" attr(href) ")"; 201 | } 202 | abbr[title]:after { 203 | content: " (" attr(title) ")"; 204 | } 205 | a[href^="javascript:"]:after, 206 | a[href^="#"]:after { 207 | content: ""; 208 | } 209 | pre, 210 | blockquote { 211 | border: 1px solid #999; 212 | page-break-inside: avoid; 213 | } 214 | thead { 215 | display: table-header-group; 216 | } 217 | tr, 218 | img { 219 | page-break-inside: avoid; 220 | } 221 | img { 222 | max-width: 100% !important; 223 | } 224 | p, 225 | h2, 226 | h3 { 227 | orphans: 3; 228 | widows: 3; 229 | } 230 | h2, 231 | h3 { 232 | page-break-after: avoid; 233 | } 234 | select { 235 | background: #fff !important; 236 | } 237 | .navbar { 238 | display: none; 239 | } 240 | .table td, 241 | .table th { 242 | background-color: #fff !important; 243 | } 244 | .btn > .caret, 245 | .dropup > .btn > .caret { 246 | border-top-color: #000 !important; 247 | } 248 | .label { 249 | border: 1px solid #000; 250 | } 251 | .table { 252 | border-collapse: collapse !important; 253 | } 254 | .table-bordered th, 255 | .table-bordered td { 256 | border: 1px solid #ddd !important; 257 | } 258 | } 259 | * { 260 | -webkit-box-sizing: border-box; 261 | -moz-box-sizing: border-box; 262 | box-sizing: border-box; 263 | } 264 | *:before, 265 | *:after { 266 | -webkit-box-sizing: border-box; 267 | -moz-box-sizing: border-box; 268 | box-sizing: border-box; 269 | } 270 | html { 271 | font-size: 62.5%; 272 | -webkit-tap-highlight-color: rgba(0, 0, 0, 0); 273 | } 274 | body { 275 | font-family: "Lato", "Helvetica Neue", Helvetica, Arial, sans-serif; 276 | font-size: 15px; 277 | line-height: 1.42857143; 278 | color: #ffffff; 279 | background-color: #222222; 280 | } 281 | input, 282 | button, 283 | select, 284 | textarea { 285 | font-family: inherit; 286 | font-size: inherit; 287 | line-height: inherit; 288 | } 289 | a { 290 | color: #0ce3ac; 291 | text-decoration: none; 292 | } 293 | a:hover, 294 | a:focus { 295 | color: #0ce3ac; 296 | text-decoration: underline; 297 | } 298 | a:focus { 299 | outline: thin dotted; 300 | outline: 5px auto -webkit-focus-ring-color; 301 | outline-offset: -2px; 302 | } 303 | figure { 304 | margin: 0; 305 | } 306 | img { 307 | vertical-align: middle; 308 | } 309 | .img-responsive, 310 | .thumbnail > img, 311 | .thumbnail a > img, 312 | .carousel-inner > .item > img, 313 | .carousel-inner > .item > a > img { 314 | display: block; 315 | max-width: 100%; 316 | height: auto; 317 | } 318 | .img-rounded { 319 | border-radius: 6px; 320 | } 321 | .img-thumbnail { 322 | padding: 2px; 323 | line-height: 1.42857143; 324 | background-color: #222222; 325 | border: 1px solid #464545; 326 | border-radius: 4px; 327 | -webkit-transition: all 0.2s ease-in-out; 328 | transition: all 0.2s ease-in-out; 329 | display: inline-block; 330 | max-width: 100%; 331 | height: auto; 332 | } 333 | .img-circle { 334 | border-radius: 50%; 335 | } 336 | hr { 337 | margin-top: 21px; 338 | margin-bottom: 21px; 339 | border: 0; 340 | border-top: 1px solid #464545; 341 | } 342 | .sr-only { 343 | position: absolute; 344 | width: 1px; 345 | height: 1px; 346 | margin: -1px; 347 | padding: 0; 348 | overflow: hidden; 349 | clip: rect(0, 0, 0, 0); 350 | border: 0; 351 | } 352 | h1, 353 | h2, 354 | h3, 355 | h4, 356 | h5, 357 | h6, 358 | .h1, 359 | .h2, 360 | .h3, 361 | .h4, 362 | .h5, 363 | .h6 { 364 | font-family: "Lato", "Helvetica Neue", Helvetica, Arial, sans-serif; 365 | font-weight: 400; 366 | line-height: 1.1; 367 | color: inherit; 368 | } 369 | h1 small, 370 | h2 small, 371 | h3 small, 372 | h4 small, 373 | h5 small, 374 | h6 small, 375 | .h1 small, 376 | .h2 small, 377 | .h3 small, 378 | .h4 small, 379 | .h5 small, 380 | .h6 small, 381 | h1 .small, 382 | h2 .small, 383 | h3 .small, 384 | h4 .small, 385 | h5 .small, 386 | h6 .small, 387 | .h1 .small, 388 | .h2 .small, 389 | .h3 .small, 390 | .h4 .small, 391 | .h5 .small, 392 | .h6 .small { 393 | font-weight: normal; 394 | line-height: 1; 395 | color: #999999; 396 | } 397 | h1, 398 | .h1, 399 | h2, 400 | .h2, 401 | h3, 402 | .h3 { 403 | margin-top: 21px; 404 | margin-bottom: 10.5px; 405 | } 406 | h1 small, 407 | .h1 small, 408 | h2 small, 409 | .h2 small, 410 | h3 small, 411 | .h3 small, 412 | h1 .small, 413 | .h1 .small, 414 | h2 .small, 415 | .h2 .small, 416 | h3 .small, 417 | .h3 .small { 418 | font-size: 65%; 419 | } 420 | h4, 421 | .h4, 422 | h5, 423 | .h5, 424 | h6, 425 | .h6 { 426 | margin-top: 10.5px; 427 | margin-bottom: 10.5px; 428 | } 429 | h4 small, 430 | .h4 small, 431 | h5 small, 432 | .h5 small, 433 | h6 small, 434 | .h6 small, 435 | h4 .small, 436 | .h4 .small, 437 | h5 .small, 438 | .h5 .small, 439 | h6 .small, 440 | .h6 .small { 441 | font-size: 75%; 442 | } 443 | h1, 444 | .h1 { 445 | font-size: 39px; 446 | } 447 | h2, 448 | .h2 { 449 | font-size: 32px; 450 | } 451 | h3, 452 | .h3 { 453 | font-size: 26px; 454 | } 455 | h4, 456 | .h4 { 457 | font-size: 19px; 458 | } 459 | h5, 460 | .h5 { 461 | font-size: 15px; 462 | } 463 | h6, 464 | .h6 { 465 | font-size: 13px; 466 | } 467 | p { 468 | margin: 0 0 10.5px; 469 | } 470 | .lead { 471 | margin-bottom: 21px; 472 | font-size: 17px; 473 | font-weight: 200; 474 | line-height: 1.4; 475 | } 476 | @media (min-width: 768px) { 477 | .lead { 478 | font-size: 22.5px; 479 | } 480 | } 481 | small, 482 | .small { 483 | font-size: 85%; 484 | } 485 | cite { 486 | font-style: normal; 487 | } 488 | .text-left { 489 | text-align: left; 490 | } 491 | .text-right { 492 | text-align: right; 493 | } 494 | .text-center { 495 | text-align: center; 496 | } 497 | .text-justify { 498 | text-align: justify; 499 | } 500 | .text-muted { 501 | color: #999999; 502 | } 503 | .text-primary { 504 | color: #375a7f; 505 | } 506 | a.text-primary:hover { 507 | color: #28415b; 508 | } 509 | .text-success { 510 | color: #ffffff; 511 | } 512 | a.text-success:hover { 513 | color: #e6e6e6; 514 | } 515 | .text-info { 516 | color: #ffffff; 517 | } 518 | a.text-info:hover { 519 | color: #e6e6e6; 520 | } 521 | .text-warning { 522 | color: #ffffff; 523 | } 524 | a.text-warning:hover { 525 | color: #e6e6e6; 526 | } 527 | .text-danger { 528 | color: #ffffff; 529 | } 530 | a.text-danger:hover { 531 | color: #e6e6e6; 532 | } 533 | .bg-primary { 534 | color: #fff; 535 | background-color: #375a7f; 536 | } 537 | a.bg-primary:hover { 538 | background-color: #28415b; 539 | } 540 | .bg-success { 541 | background-color: #00bc8c; 542 | } 543 | a.bg-success:hover { 544 | background-color: #008966; 545 | } 546 | .bg-info { 547 | background-color: #3498db; 548 | } 549 | a.bg-info:hover { 550 | background-color: #217dbb; 551 | } 552 | .bg-warning { 553 | background-color: #f39c12; 554 | } 555 | a.bg-warning:hover { 556 | background-color: #c87f0a; 557 | } 558 | .bg-danger { 559 | background-color: #e74c3c; 560 | } 561 | a.bg-danger:hover { 562 | background-color: #d62c1a; 563 | } 564 | .page-header { 565 | padding-bottom: 9.5px; 566 | margin: 42px 0 21px; 567 | border-bottom: 1px solid transparent; 568 | } 569 | ul, 570 | ol { 571 | margin-top: 0; 572 | margin-bottom: 10.5px; 573 | } 574 | ul ul, 575 | ol ul, 576 | ul ol, 577 | ol ol { 578 | margin-bottom: 0; 579 | } 580 | .list-unstyled { 581 | padding-left: 0; 582 | list-style: none; 583 | } 584 | .list-inline { 585 | padding-left: 0; 586 | list-style: none; 587 | margin-left: -5px; 588 | } 589 | .list-inline > li { 590 | display: inline-block; 591 | padding-left: 5px; 592 | padding-right: 5px; 593 | } 594 | dl { 595 | margin-top: 0; 596 | margin-bottom: 21px; 597 | } 598 | dt, 599 | dd { 600 | line-height: 1.42857143; 601 | } 602 | dt { 603 | font-weight: bold; 604 | } 605 | dd { 606 | margin-left: 0; 607 | } 608 | @media (min-width: 768px) { 609 | .dl-horizontal dt { 610 | float: left; 611 | width: 160px; 612 | clear: left; 613 | text-align: right; 614 | overflow: hidden; 615 | text-overflow: ellipsis; 616 | white-space: nowrap; 617 | } 618 | .dl-horizontal dd { 619 | margin-left: 180px; 620 | } 621 | } 622 | abbr[title], 623 | abbr[data-original-title] { 624 | cursor: help; 625 | border-bottom: 1px dotted #999999; 626 | } 627 | .initialism { 628 | font-size: 90%; 629 | text-transform: uppercase; 630 | } 631 | blockquote { 632 | padding: 10.5px 21px; 633 | margin: 0 0 21px; 634 | font-size: 18.75px; 635 | border-left: 5px solid #464545; 636 | } 637 | blockquote p:last-child, 638 | blockquote ul:last-child, 639 | blockquote ol:last-child { 640 | margin-bottom: 0; 641 | } 642 | blockquote footer, 643 | blockquote small, 644 | blockquote .small { 645 | display: block; 646 | font-size: 80%; 647 | line-height: 1.42857143; 648 | color: #999999; 649 | } 650 | blockquote footer:before, 651 | blockquote small:before, 652 | blockquote .small:before { 653 | content: '\2014 \00A0'; 654 | } 655 | .blockquote-reverse, 656 | blockquote.pull-right { 657 | padding-right: 15px; 658 | padding-left: 0; 659 | border-right: 5px solid #464545; 660 | border-left: 0; 661 | text-align: right; 662 | } 663 | .blockquote-reverse footer:before, 664 | blockquote.pull-right footer:before, 665 | .blockquote-reverse small:before, 666 | blockquote.pull-right small:before, 667 | .blockquote-reverse .small:before, 668 | blockquote.pull-right .small:before { 669 | content: ''; 670 | } 671 | .blockquote-reverse footer:after, 672 | blockquote.pull-right footer:after, 673 | .blockquote-reverse small:after, 674 | blockquote.pull-right small:after, 675 | .blockquote-reverse .small:after, 676 | blockquote.pull-right .small:after { 677 | content: '\00A0 \2014'; 678 | } 679 | blockquote:before, 680 | blockquote:after { 681 | content: ""; 682 | } 683 | address { 684 | margin-bottom: 21px; 685 | font-style: normal; 686 | line-height: 1.42857143; 687 | } 688 | code, 689 | kbd, 690 | pre, 691 | samp { 692 | font-family: Menlo, Monaco, Consolas, "Courier New", monospace; 693 | } 694 | code { 695 | padding: 2px 4px; 696 | font-size: 90%; 697 | color: #c7254e; 698 | background-color: #f9f2f4; 699 | white-space: nowrap; 700 | border-radius: 4px; 701 | } 702 | kbd { 703 | padding: 2px 4px; 704 | font-size: 90%; 705 | color: #ffffff; 706 | background-color: #333333; 707 | border-radius: 3px; 708 | box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.25); 709 | } 710 | pre { 711 | display: block; 712 | padding: 10px; 713 | margin: 0 0 10.5px; 714 | font-size: 14px; 715 | line-height: 1.42857143; 716 | word-break: break-all; 717 | word-wrap: break-word; 718 | color: #303030; 719 | background-color: #ebebeb; 720 | border: 1px solid #cccccc; 721 | border-radius: 4px; 722 | } 723 | pre code { 724 | padding: 0; 725 | font-size: inherit; 726 | color: inherit; 727 | white-space: pre-wrap; 728 | background-color: transparent; 729 | border-radius: 0; 730 | } 731 | .pre-scrollable { 732 | max-height: 340px; 733 | overflow-y: scroll; 734 | } 735 | .container { 736 | margin-right: auto; 737 | margin-left: auto; 738 | padding-left: 15px; 739 | padding-right: 15px; 740 | } 741 | @media (min-width: 768px) { 742 | .container { 743 | width: 750px; 744 | } 745 | } 746 | @media (min-width: 992px) { 747 | .container { 748 | width: 970px; 749 | } 750 | } 751 | @media (min-width: 1200px) { 752 | .container { 753 | width: 1170px; 754 | } 755 | } 756 | .container-fluid { 757 | margin-right: auto; 758 | margin-left: auto; 759 | padding-left: 15px; 760 | padding-right: 15px; 761 | } 762 | .row { 763 | margin-left: -15px; 764 | margin-right: -15px; 765 | } 766 | .col-xs-1, .col-sm-1, .col-md-1, .col-lg-1, .col-xs-2, .col-sm-2, .col-md-2, .col-lg-2, .col-xs-3, .col-sm-3, .col-md-3, .col-lg-3, .col-xs-4, .col-sm-4, .col-md-4, .col-lg-4, .col-xs-5, .col-sm-5, .col-md-5, .col-lg-5, .col-xs-6, .col-sm-6, .col-md-6, .col-lg-6, .col-xs-7, .col-sm-7, .col-md-7, .col-lg-7, .col-xs-8, .col-sm-8, .col-md-8, .col-lg-8, .col-xs-9, .col-sm-9, .col-md-9, .col-lg-9, .col-xs-10, .col-sm-10, .col-md-10, .col-lg-10, .col-xs-11, .col-sm-11, .col-md-11, .col-lg-11, .col-xs-12, .col-sm-12, .col-md-12, .col-lg-12 { 767 | position: relative; 768 | min-height: 1px; 769 | padding-left: 15px; 770 | padding-right: 15px; 771 | } 772 | .col-xs-1, .col-xs-2, .col-xs-3, .col-xs-4, .col-xs-5, .col-xs-6, .col-xs-7, .col-xs-8, .col-xs-9, .col-xs-10, .col-xs-11, .col-xs-12 { 773 | float: left; 774 | } 775 | .col-xs-12 { 776 | width: 100%; 777 | } 778 | .col-xs-11 { 779 | width: 91.66666667%; 780 | } 781 | .col-xs-10 { 782 | width: 83.33333333%; 783 | } 784 | .col-xs-9 { 785 | width: 75%; 786 | } 787 | .col-xs-8 { 788 | width: 66.66666667%; 789 | } 790 | .col-xs-7 { 791 | width: 58.33333333%; 792 | } 793 | .col-xs-6 { 794 | width: 50%; 795 | } 796 | .col-xs-5 { 797 | width: 41.66666667%; 798 | } 799 | .col-xs-4 { 800 | width: 33.33333333%; 801 | } 802 | .col-xs-3 { 803 | width: 25%; 804 | } 805 | .col-xs-2 { 806 | width: 16.66666667%; 807 | } 808 | .col-xs-1 { 809 | width: 8.33333333%; 810 | } 811 | .col-xs-pull-12 { 812 | right: 100%; 813 | } 814 | .col-xs-pull-11 { 815 | right: 91.66666667%; 816 | } 817 | .col-xs-pull-10 { 818 | right: 83.33333333%; 819 | } 820 | .col-xs-pull-9 { 821 | right: 75%; 822 | } 823 | .col-xs-pull-8 { 824 | right: 66.66666667%; 825 | } 826 | .col-xs-pull-7 { 827 | right: 58.33333333%; 828 | } 829 | .col-xs-pull-6 { 830 | right: 50%; 831 | } 832 | .col-xs-pull-5 { 833 | right: 41.66666667%; 834 | } 835 | .col-xs-pull-4 { 836 | right: 33.33333333%; 837 | } 838 | .col-xs-pull-3 { 839 | right: 25%; 840 | } 841 | .col-xs-pull-2 { 842 | right: 16.66666667%; 843 | } 844 | .col-xs-pull-1 { 845 | right: 8.33333333%; 846 | } 847 | .col-xs-pull-0 { 848 | right: 0%; 849 | } 850 | .col-xs-push-12 { 851 | left: 100%; 852 | } 853 | .col-xs-push-11 { 854 | left: 91.66666667%; 855 | } 856 | .col-xs-push-10 { 857 | left: 83.33333333%; 858 | } 859 | .col-xs-push-9 { 860 | left: 75%; 861 | } 862 | .col-xs-push-8 { 863 | left: 66.66666667%; 864 | } 865 | .col-xs-push-7 { 866 | left: 58.33333333%; 867 | } 868 | .col-xs-push-6 { 869 | left: 50%; 870 | } 871 | .col-xs-push-5 { 872 | left: 41.66666667%; 873 | } 874 | .col-xs-push-4 { 875 | left: 33.33333333%; 876 | } 877 | .col-xs-push-3 { 878 | left: 25%; 879 | } 880 | .col-xs-push-2 { 881 | left: 16.66666667%; 882 | } 883 | .col-xs-push-1 { 884 | left: 8.33333333%; 885 | } 886 | .col-xs-push-0 { 887 | left: 0%; 888 | } 889 | .col-xs-offset-12 { 890 | margin-left: 100%; 891 | } 892 | .col-xs-offset-11 { 893 | margin-left: 91.66666667%; 894 | } 895 | .col-xs-offset-10 { 896 | margin-left: 83.33333333%; 897 | } 898 | .col-xs-offset-9 { 899 | margin-left: 75%; 900 | } 901 | .col-xs-offset-8 { 902 | margin-left: 66.66666667%; 903 | } 904 | .col-xs-offset-7 { 905 | margin-left: 58.33333333%; 906 | } 907 | .col-xs-offset-6 { 908 | margin-left: 50%; 909 | } 910 | .col-xs-offset-5 { 911 | margin-left: 41.66666667%; 912 | } 913 | .col-xs-offset-4 { 914 | margin-left: 33.33333333%; 915 | } 916 | .col-xs-offset-3 { 917 | margin-left: 25%; 918 | } 919 | .col-xs-offset-2 { 920 | margin-left: 16.66666667%; 921 | } 922 | .col-xs-offset-1 { 923 | margin-left: 8.33333333%; 924 | } 925 | .col-xs-offset-0 { 926 | margin-left: 0%; 927 | } 928 | @media (min-width: 768px) { 929 | .col-sm-1, .col-sm-2, .col-sm-3, .col-sm-4, .col-sm-5, .col-sm-6, .col-sm-7, .col-sm-8, .col-sm-9, .col-sm-10, .col-sm-11, .col-sm-12 { 930 | float: left; 931 | } 932 | .col-sm-12 { 933 | width: 100%; 934 | } 935 | .col-sm-11 { 936 | width: 91.66666667%; 937 | } 938 | .col-sm-10 { 939 | width: 83.33333333%; 940 | } 941 | .col-sm-9 { 942 | width: 75%; 943 | } 944 | .col-sm-8 { 945 | width: 66.66666667%; 946 | } 947 | .col-sm-7 { 948 | width: 58.33333333%; 949 | } 950 | .col-sm-6 { 951 | width: 50%; 952 | } 953 | .col-sm-5 { 954 | width: 41.66666667%; 955 | } 956 | .col-sm-4 { 957 | width: 33.33333333%; 958 | } 959 | .col-sm-3 { 960 | width: 25%; 961 | } 962 | .col-sm-2 { 963 | width: 16.66666667%; 964 | } 965 | .col-sm-1 { 966 | width: 8.33333333%; 967 | } 968 | .col-sm-pull-12 { 969 | right: 100%; 970 | } 971 | .col-sm-pull-11 { 972 | right: 91.66666667%; 973 | } 974 | .col-sm-pull-10 { 975 | right: 83.33333333%; 976 | } 977 | .col-sm-pull-9 { 978 | right: 75%; 979 | } 980 | .col-sm-pull-8 { 981 | right: 66.66666667%; 982 | } 983 | .col-sm-pull-7 { 984 | right: 58.33333333%; 985 | } 986 | .col-sm-pull-6 { 987 | right: 50%; 988 | } 989 | .col-sm-pull-5 { 990 | right: 41.66666667%; 991 | } 992 | .col-sm-pull-4 { 993 | right: 33.33333333%; 994 | } 995 | .col-sm-pull-3 { 996 | right: 25%; 997 | } 998 | .col-sm-pull-2 { 999 | right: 16.66666667%; 1000 | } 1001 | .col-sm-pull-1 { 1002 | right: 8.33333333%; 1003 | } 1004 | .col-sm-pull-0 { 1005 | right: 0%; 1006 | } 1007 | .col-sm-push-12 { 1008 | left: 100%; 1009 | } 1010 | .col-sm-push-11 { 1011 | left: 91.66666667%; 1012 | } 1013 | .col-sm-push-10 { 1014 | left: 83.33333333%; 1015 | } 1016 | .col-sm-push-9 { 1017 | left: 75%; 1018 | } 1019 | .col-sm-push-8 { 1020 | left: 66.66666667%; 1021 | } 1022 | .col-sm-push-7 { 1023 | left: 58.33333333%; 1024 | } 1025 | .col-sm-push-6 { 1026 | left: 50%; 1027 | } 1028 | .col-sm-push-5 { 1029 | left: 41.66666667%; 1030 | } 1031 | .col-sm-push-4 { 1032 | left: 33.33333333%; 1033 | } 1034 | .col-sm-push-3 { 1035 | left: 25%; 1036 | } 1037 | .col-sm-push-2 { 1038 | left: 16.66666667%; 1039 | } 1040 | .col-sm-push-1 { 1041 | left: 8.33333333%; 1042 | } 1043 | .col-sm-push-0 { 1044 | left: 0%; 1045 | } 1046 | .col-sm-offset-12 { 1047 | margin-left: 100%; 1048 | } 1049 | .col-sm-offset-11 { 1050 | margin-left: 91.66666667%; 1051 | } 1052 | .col-sm-offset-10 { 1053 | margin-left: 83.33333333%; 1054 | } 1055 | .col-sm-offset-9 { 1056 | margin-left: 75%; 1057 | } 1058 | .col-sm-offset-8 { 1059 | margin-left: 66.66666667%; 1060 | } 1061 | .col-sm-offset-7 { 1062 | margin-left: 58.33333333%; 1063 | } 1064 | .col-sm-offset-6 { 1065 | margin-left: 50%; 1066 | } 1067 | .col-sm-offset-5 { 1068 | margin-left: 41.66666667%; 1069 | } 1070 | .col-sm-offset-4 { 1071 | margin-left: 33.33333333%; 1072 | } 1073 | .col-sm-offset-3 { 1074 | margin-left: 25%; 1075 | } 1076 | .col-sm-offset-2 { 1077 | margin-left: 16.66666667%; 1078 | } 1079 | .col-sm-offset-1 { 1080 | margin-left: 8.33333333%; 1081 | } 1082 | .col-sm-offset-0 { 1083 | margin-left: 0%; 1084 | } 1085 | } 1086 | @media (min-width: 992px) { 1087 | .col-md-1, .col-md-2, .col-md-3, .col-md-4, .col-md-5, .col-md-6, .col-md-7, .col-md-8, .col-md-9, .col-md-10, .col-md-11, .col-md-12 { 1088 | float: left; 1089 | } 1090 | .col-md-12 { 1091 | width: 100%; 1092 | } 1093 | .col-md-11 { 1094 | width: 91.66666667%; 1095 | } 1096 | .col-md-10 { 1097 | width: 83.33333333%; 1098 | } 1099 | .col-md-9 { 1100 | width: 75%; 1101 | } 1102 | .col-md-8 { 1103 | width: 66.66666667%; 1104 | } 1105 | .col-md-7 { 1106 | width: 58.33333333%; 1107 | } 1108 | .col-md-6 { 1109 | width: 50%; 1110 | } 1111 | .col-md-5 { 1112 | width: 41.66666667%; 1113 | } 1114 | .col-md-4 { 1115 | width: 33.33333333%; 1116 | } 1117 | .col-md-3 { 1118 | width: 25%; 1119 | } 1120 | .col-md-2 { 1121 | width: 16.66666667%; 1122 | } 1123 | .col-md-1 { 1124 | width: 8.33333333%; 1125 | } 1126 | .col-md-pull-12 { 1127 | right: 100%; 1128 | } 1129 | .col-md-pull-11 { 1130 | right: 91.66666667%; 1131 | } 1132 | .col-md-pull-10 { 1133 | right: 83.33333333%; 1134 | } 1135 | .col-md-pull-9 { 1136 | right: 75%; 1137 | } 1138 | .col-md-pull-8 { 1139 | right: 66.66666667%; 1140 | } 1141 | .col-md-pull-7 { 1142 | right: 58.33333333%; 1143 | } 1144 | .col-md-pull-6 { 1145 | right: 50%; 1146 | } 1147 | .col-md-pull-5 { 1148 | right: 41.66666667%; 1149 | } 1150 | .col-md-pull-4 { 1151 | right: 33.33333333%; 1152 | } 1153 | .col-md-pull-3 { 1154 | right: 25%; 1155 | } 1156 | .col-md-pull-2 { 1157 | right: 16.66666667%; 1158 | } 1159 | .col-md-pull-1 { 1160 | right: 8.33333333%; 1161 | } 1162 | .col-md-pull-0 { 1163 | right: 0%; 1164 | } 1165 | .col-md-push-12 { 1166 | left: 100%; 1167 | } 1168 | .col-md-push-11 { 1169 | left: 91.66666667%; 1170 | } 1171 | .col-md-push-10 { 1172 | left: 83.33333333%; 1173 | } 1174 | .col-md-push-9 { 1175 | left: 75%; 1176 | } 1177 | .col-md-push-8 { 1178 | left: 66.66666667%; 1179 | } 1180 | .col-md-push-7 { 1181 | left: 58.33333333%; 1182 | } 1183 | .col-md-push-6 { 1184 | left: 50%; 1185 | } 1186 | .col-md-push-5 { 1187 | left: 41.66666667%; 1188 | } 1189 | .col-md-push-4 { 1190 | left: 33.33333333%; 1191 | } 1192 | .col-md-push-3 { 1193 | left: 25%; 1194 | } 1195 | .col-md-push-2 { 1196 | left: 16.66666667%; 1197 | } 1198 | .col-md-push-1 { 1199 | left: 8.33333333%; 1200 | } 1201 | .col-md-push-0 { 1202 | left: 0%; 1203 | } 1204 | .col-md-offset-12 { 1205 | margin-left: 100%; 1206 | } 1207 | .col-md-offset-11 { 1208 | margin-left: 91.66666667%; 1209 | } 1210 | .col-md-offset-10 { 1211 | margin-left: 83.33333333%; 1212 | } 1213 | .col-md-offset-9 { 1214 | margin-left: 75%; 1215 | } 1216 | .col-md-offset-8 { 1217 | margin-left: 66.66666667%; 1218 | } 1219 | .col-md-offset-7 { 1220 | margin-left: 58.33333333%; 1221 | } 1222 | .col-md-offset-6 { 1223 | margin-left: 50%; 1224 | } 1225 | .col-md-offset-5 { 1226 | margin-left: 41.66666667%; 1227 | } 1228 | .col-md-offset-4 { 1229 | margin-left: 33.33333333%; 1230 | } 1231 | .col-md-offset-3 { 1232 | margin-left: 25%; 1233 | } 1234 | .col-md-offset-2 { 1235 | margin-left: 16.66666667%; 1236 | } 1237 | .col-md-offset-1 { 1238 | margin-left: 8.33333333%; 1239 | } 1240 | .col-md-offset-0 { 1241 | margin-left: 0%; 1242 | } 1243 | } 1244 | @media (min-width: 1200px) { 1245 | .col-lg-1, .col-lg-2, .col-lg-3, .col-lg-4, .col-lg-5, .col-lg-6, .col-lg-7, .col-lg-8, .col-lg-9, .col-lg-10, .col-lg-11, .col-lg-12 { 1246 | float: left; 1247 | } 1248 | .col-lg-12 { 1249 | width: 100%; 1250 | } 1251 | .col-lg-11 { 1252 | width: 91.66666667%; 1253 | } 1254 | .col-lg-10 { 1255 | width: 83.33333333%; 1256 | } 1257 | .col-lg-9 { 1258 | width: 75%; 1259 | } 1260 | .col-lg-8 { 1261 | width: 66.66666667%; 1262 | } 1263 | .col-lg-7 { 1264 | width: 58.33333333%; 1265 | } 1266 | .col-lg-6 { 1267 | width: 50%; 1268 | } 1269 | .col-lg-5 { 1270 | width: 41.66666667%; 1271 | } 1272 | .col-lg-4 { 1273 | width: 33.33333333%; 1274 | } 1275 | .col-lg-3 { 1276 | width: 25%; 1277 | } 1278 | .col-lg-2 { 1279 | width: 16.66666667%; 1280 | } 1281 | .col-lg-1 { 1282 | width: 8.33333333%; 1283 | } 1284 | .col-lg-pull-12 { 1285 | right: 100%; 1286 | } 1287 | .col-lg-pull-11 { 1288 | right: 91.66666667%; 1289 | } 1290 | .col-lg-pull-10 { 1291 | right: 83.33333333%; 1292 | } 1293 | .col-lg-pull-9 { 1294 | right: 75%; 1295 | } 1296 | .col-lg-pull-8 { 1297 | right: 66.66666667%; 1298 | } 1299 | .col-lg-pull-7 { 1300 | right: 58.33333333%; 1301 | } 1302 | .col-lg-pull-6 { 1303 | right: 50%; 1304 | } 1305 | .col-lg-pull-5 { 1306 | right: 41.66666667%; 1307 | } 1308 | .col-lg-pull-4 { 1309 | right: 33.33333333%; 1310 | } 1311 | .col-lg-pull-3 { 1312 | right: 25%; 1313 | } 1314 | .col-lg-pull-2 { 1315 | right: 16.66666667%; 1316 | } 1317 | .col-lg-pull-1 { 1318 | right: 8.33333333%; 1319 | } 1320 | .col-lg-pull-0 { 1321 | right: 0%; 1322 | } 1323 | .col-lg-push-12 { 1324 | left: 100%; 1325 | } 1326 | .col-lg-push-11 { 1327 | left: 91.66666667%; 1328 | } 1329 | .col-lg-push-10 { 1330 | left: 83.33333333%; 1331 | } 1332 | .col-lg-push-9 { 1333 | left: 75%; 1334 | } 1335 | .col-lg-push-8 { 1336 | left: 66.66666667%; 1337 | } 1338 | .col-lg-push-7 { 1339 | left: 58.33333333%; 1340 | } 1341 | .col-lg-push-6 { 1342 | left: 50%; 1343 | } 1344 | .col-lg-push-5 { 1345 | left: 41.66666667%; 1346 | } 1347 | .col-lg-push-4 { 1348 | left: 33.33333333%; 1349 | } 1350 | .col-lg-push-3 { 1351 | left: 25%; 1352 | } 1353 | .col-lg-push-2 { 1354 | left: 16.66666667%; 1355 | } 1356 | .col-lg-push-1 { 1357 | left: 8.33333333%; 1358 | } 1359 | .col-lg-push-0 { 1360 | left: 0%; 1361 | } 1362 | .col-lg-offset-12 { 1363 | margin-left: 100%; 1364 | } 1365 | .col-lg-offset-11 { 1366 | margin-left: 91.66666667%; 1367 | } 1368 | .col-lg-offset-10 { 1369 | margin-left: 83.33333333%; 1370 | } 1371 | .col-lg-offset-9 { 1372 | margin-left: 75%; 1373 | } 1374 | .col-lg-offset-8 { 1375 | margin-left: 66.66666667%; 1376 | } 1377 | .col-lg-offset-7 { 1378 | margin-left: 58.33333333%; 1379 | } 1380 | .col-lg-offset-6 { 1381 | margin-left: 50%; 1382 | } 1383 | .col-lg-offset-5 { 1384 | margin-left: 41.66666667%; 1385 | } 1386 | .col-lg-offset-4 { 1387 | margin-left: 33.33333333%; 1388 | } 1389 | .col-lg-offset-3 { 1390 | margin-left: 25%; 1391 | } 1392 | .col-lg-offset-2 { 1393 | margin-left: 16.66666667%; 1394 | } 1395 | .col-lg-offset-1 { 1396 | margin-left: 8.33333333%; 1397 | } 1398 | .col-lg-offset-0 { 1399 | margin-left: 0%; 1400 | } 1401 | } 1402 | table { 1403 | max-width: 100%; 1404 | background-color: transparent; 1405 | } 1406 | th { 1407 | text-align: left; 1408 | } 1409 | .table { 1410 | width: 100%; 1411 | margin-bottom: 21px; 1412 | } 1413 | .table > thead > tr > th, 1414 | .table > tbody > tr > th, 1415 | .table > tfoot > tr > th, 1416 | .table > thead > tr > td, 1417 | .table > tbody > tr > td, 1418 | .table > tfoot > tr > td { 1419 | padding: 8px; 1420 | line-height: 1.42857143; 1421 | vertical-align: top; 1422 | border-top: 1px solid #464545; 1423 | } 1424 | .table > thead > tr > th { 1425 | vertical-align: bottom; 1426 | border-bottom: 2px solid #464545; 1427 | } 1428 | .table > caption + thead > tr:first-child > th, 1429 | .table > colgroup + thead > tr:first-child > th, 1430 | .table > thead:first-child > tr:first-child > th, 1431 | .table > caption + thead > tr:first-child > td, 1432 | .table > colgroup + thead > tr:first-child > td, 1433 | .table > thead:first-child > tr:first-child > td { 1434 | border-top: 0; 1435 | } 1436 | .table > tbody + tbody { 1437 | border-top: 2px solid #464545; 1438 | } 1439 | .table .table { 1440 | background-color: #222222; 1441 | } 1442 | .table-condensed > thead > tr > th, 1443 | .table-condensed > tbody > tr > th, 1444 | .table-condensed > tfoot > tr > th, 1445 | .table-condensed > thead > tr > td, 1446 | .table-condensed > tbody > tr > td, 1447 | .table-condensed > tfoot > tr > td { 1448 | padding: 5px; 1449 | } 1450 | .table-bordered { 1451 | border: 1px solid #464545; 1452 | } 1453 | .table-bordered > thead > tr > th, 1454 | .table-bordered > tbody > tr > th, 1455 | .table-bordered > tfoot > tr > th, 1456 | .table-bordered > thead > tr > td, 1457 | .table-bordered > tbody > tr > td, 1458 | .table-bordered > tfoot > tr > td { 1459 | border: 1px solid #464545; 1460 | } 1461 | .table-bordered > thead > tr > th, 1462 | .table-bordered > thead > tr > td { 1463 | border-bottom-width: 2px; 1464 | } 1465 | .table-striped > tbody > tr:nth-child(odd) > td, 1466 | .table-striped > tbody > tr:nth-child(odd) > th { 1467 | background-color: #303030; 1468 | } 1469 | .table-hover > tbody > tr:hover > td, 1470 | .table-hover > tbody > tr:hover > th { 1471 | background-color: #464545; 1472 | } 1473 | table col[class*="col-"] { 1474 | position: static; 1475 | float: none; 1476 | display: table-column; 1477 | } 1478 | table td[class*="col-"], 1479 | table th[class*="col-"] { 1480 | position: static; 1481 | float: none; 1482 | display: table-cell; 1483 | } 1484 | .table > thead > tr > td.active, 1485 | .table > tbody > tr > td.active, 1486 | .table > tfoot > tr > td.active, 1487 | .table > thead > tr > th.active, 1488 | .table > tbody > tr > th.active, 1489 | .table > tfoot > tr > th.active, 1490 | .table > thead > tr.active > td, 1491 | .table > tbody > tr.active > td, 1492 | .table > tfoot > tr.active > td, 1493 | .table > thead > tr.active > th, 1494 | .table > tbody > tr.active > th, 1495 | .table > tfoot > tr.active > th { 1496 | background-color: #464545; 1497 | } 1498 | .table-hover > tbody > tr > td.active:hover, 1499 | .table-hover > tbody > tr > th.active:hover, 1500 | .table-hover > tbody > tr.active:hover > td, 1501 | .table-hover > tbody > tr.active:hover > th { 1502 | background-color: #393838; 1503 | } 1504 | .table > thead > tr > td.success, 1505 | .table > tbody > tr > td.success, 1506 | .table > tfoot > tr > td.success, 1507 | .table > thead > tr > th.success, 1508 | .table > tbody > tr > th.success, 1509 | .table > tfoot > tr > th.success, 1510 | .table > thead > tr.success > td, 1511 | .table > tbody > tr.success > td, 1512 | .table > tfoot > tr.success > td, 1513 | .table > thead > tr.success > th, 1514 | .table > tbody > tr.success > th, 1515 | .table > tfoot > tr.success > th { 1516 | background-color: #00bc8c; 1517 | } 1518 | .table-hover > tbody > tr > td.success:hover, 1519 | .table-hover > tbody > tr > th.success:hover, 1520 | .table-hover > tbody > tr.success:hover > td, 1521 | .table-hover > tbody > tr.success:hover > th { 1522 | background-color: #00a379; 1523 | } 1524 | .table > thead > tr > td.info, 1525 | .table > tbody > tr > td.info, 1526 | .table > tfoot > tr > td.info, 1527 | .table > thead > tr > th.info, 1528 | .table > tbody > tr > th.info, 1529 | .table > tfoot > tr > th.info, 1530 | .table > thead > tr.info > td, 1531 | .table > tbody > tr.info > td, 1532 | .table > tfoot > tr.info > td, 1533 | .table > thead > tr.info > th, 1534 | .table > tbody > tr.info > th, 1535 | .table > tfoot > tr.info > th { 1536 | background-color: #3498db; 1537 | } 1538 | .table-hover > tbody > tr > td.info:hover, 1539 | .table-hover > tbody > tr > th.info:hover, 1540 | .table-hover > tbody > tr.info:hover > td, 1541 | .table-hover > tbody > tr.info:hover > th { 1542 | background-color: #258cd1; 1543 | } 1544 | .table > thead > tr > td.warning, 1545 | .table > tbody > tr > td.warning, 1546 | .table > tfoot > tr > td.warning, 1547 | .table > thead > tr > th.warning, 1548 | .table > tbody > tr > th.warning, 1549 | .table > tfoot > tr > th.warning, 1550 | .table > thead > tr.warning > td, 1551 | .table > tbody > tr.warning > td, 1552 | .table > tfoot > tr.warning > td, 1553 | .table > thead > tr.warning > th, 1554 | .table > tbody > tr.warning > th, 1555 | .table > tfoot > tr.warning > th { 1556 | background-color: #f39c12; 1557 | } 1558 | .table-hover > tbody > tr > td.warning:hover, 1559 | .table-hover > tbody > tr > th.warning:hover, 1560 | .table-hover > tbody > tr.warning:hover > td, 1561 | .table-hover > tbody > tr.warning:hover > th { 1562 | background-color: #e08e0b; 1563 | } 1564 | .table > thead > tr > td.danger, 1565 | .table > tbody > tr > td.danger, 1566 | .table > tfoot > tr > td.danger, 1567 | .table > thead > tr > th.danger, 1568 | .table > tbody > tr > th.danger, 1569 | .table > tfoot > tr > th.danger, 1570 | .table > thead > tr.danger > td, 1571 | .table > tbody > tr.danger > td, 1572 | .table > tfoot > tr.danger > td, 1573 | .table > thead > tr.danger > th, 1574 | .table > tbody > tr.danger > th, 1575 | .table > tfoot > tr.danger > th { 1576 | background-color: #e74c3c; 1577 | } 1578 | .table-hover > tbody > tr > td.danger:hover, 1579 | .table-hover > tbody > tr > th.danger:hover, 1580 | .table-hover > tbody > tr.danger:hover > td, 1581 | .table-hover > tbody > tr.danger:hover > th { 1582 | background-color: #e43725; 1583 | } 1584 | @media (max-width: 767px) { 1585 | .table-responsive { 1586 | width: 100%; 1587 | margin-bottom: 15.75px; 1588 | overflow-y: hidden; 1589 | overflow-x: scroll; 1590 | -ms-overflow-style: -ms-autohiding-scrollbar; 1591 | border: 1px solid #464545; 1592 | -webkit-overflow-scrolling: touch; 1593 | } 1594 | .table-responsive > .table { 1595 | margin-bottom: 0; 1596 | } 1597 | .table-responsive > .table > thead > tr > th, 1598 | .table-responsive > .table > tbody > tr > th, 1599 | .table-responsive > .table > tfoot > tr > th, 1600 | .table-responsive > .table > thead > tr > td, 1601 | .table-responsive > .table > tbody > tr > td, 1602 | .table-responsive > .table > tfoot > tr > td { 1603 | white-space: nowrap; 1604 | } 1605 | .table-responsive > .table-bordered { 1606 | border: 0; 1607 | } 1608 | .table-responsive > .table-bordered > thead > tr > th:first-child, 1609 | .table-responsive > .table-bordered > tbody > tr > th:first-child, 1610 | .table-responsive > .table-bordered > tfoot > tr > th:first-child, 1611 | .table-responsive > .table-bordered > thead > tr > td:first-child, 1612 | .table-responsive > .table-bordered > tbody > tr > td:first-child, 1613 | .table-responsive > .table-bordered > tfoot > tr > td:first-child { 1614 | border-left: 0; 1615 | } 1616 | .table-responsive > .table-bordered > thead > tr > th:last-child, 1617 | .table-responsive > .table-bordered > tbody > tr > th:last-child, 1618 | .table-responsive > .table-bordered > tfoot > tr > th:last-child, 1619 | .table-responsive > .table-bordered > thead > tr > td:last-child, 1620 | .table-responsive > .table-bordered > tbody > tr > td:last-child, 1621 | .table-responsive > .table-bordered > tfoot > tr > td:last-child { 1622 | border-right: 0; 1623 | } 1624 | .table-responsive > .table-bordered > tbody > tr:last-child > th, 1625 | .table-responsive > .table-bordered > tfoot > tr:last-child > th, 1626 | .table-responsive > .table-bordered > tbody > tr:last-child > td, 1627 | .table-responsive > .table-bordered > tfoot > tr:last-child > td { 1628 | border-bottom: 0; 1629 | } 1630 | } 1631 | fieldset { 1632 | padding: 0; 1633 | margin: 0; 1634 | border: 0; 1635 | min-width: 0; 1636 | } 1637 | legend { 1638 | display: block; 1639 | width: 100%; 1640 | padding: 0; 1641 | margin-bottom: 21px; 1642 | font-size: 22.5px; 1643 | line-height: inherit; 1644 | color: #ffffff; 1645 | border: 0; 1646 | border-bottom: 1px solid transparent; 1647 | } 1648 | label { 1649 | display: inline-block; 1650 | margin-bottom: 5px; 1651 | font-weight: bold; 1652 | } 1653 | input[type="search"] { 1654 | -webkit-box-sizing: border-box; 1655 | -moz-box-sizing: border-box; 1656 | box-sizing: border-box; 1657 | } 1658 | input[type="radio"], 1659 | input[type="checkbox"] { 1660 | margin: 4px 0 0; 1661 | margin-top: 1px \9; 1662 | /* IE8-9 */ 1663 | line-height: normal; 1664 | } 1665 | input[type="file"] { 1666 | display: block; 1667 | } 1668 | input[type="range"] { 1669 | display: block; 1670 | width: 100%; 1671 | } 1672 | select[multiple], 1673 | select[size] { 1674 | height: auto; 1675 | } 1676 | input[type="file"]:focus, 1677 | input[type="radio"]:focus, 1678 | input[type="checkbox"]:focus { 1679 | outline: thin dotted; 1680 | outline: 5px auto -webkit-focus-ring-color; 1681 | outline-offset: -2px; 1682 | } 1683 | output { 1684 | display: block; 1685 | padding-top: 11px; 1686 | font-size: 15px; 1687 | line-height: 1.42857143; 1688 | color: #464545; 1689 | } 1690 | .form-control { 1691 | display: block; 1692 | width: 100%; 1693 | height: 43px; 1694 | padding: 10px 15px; 1695 | font-size: 15px; 1696 | line-height: 1.42857143; 1697 | color: #464545; 1698 | background-color: #ffffff; 1699 | background-image: none; 1700 | border: 1px solid #f1f1f1; 1701 | border-radius: 4px; 1702 | -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); 1703 | box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); 1704 | -webkit-transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s; 1705 | transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s; 1706 | } 1707 | .form-control:focus { 1708 | border-color: #ffffff; 1709 | outline: 0; 1710 | -webkit-box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(255, 255, 255, 0.6); 1711 | box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(255, 255, 255, 0.6); 1712 | } 1713 | .form-control::-moz-placeholder { 1714 | color: #999999; 1715 | opacity: 1; 1716 | } 1717 | .form-control:-ms-input-placeholder { 1718 | color: #999999; 1719 | } 1720 | .form-control::-webkit-input-placeholder { 1721 | color: #999999; 1722 | } 1723 | .form-control[disabled], 1724 | .form-control[readonly], 1725 | fieldset[disabled] .form-control { 1726 | cursor: not-allowed; 1727 | background-color: #ebebeb; 1728 | opacity: 1; 1729 | } 1730 | textarea.form-control { 1731 | height: auto; 1732 | } 1733 | input[type="search"] { 1734 | -webkit-appearance: none; 1735 | } 1736 | input[type="date"] { 1737 | line-height: 43px; 1738 | } 1739 | .form-group { 1740 | margin-bottom: 15px; 1741 | } 1742 | .radio, 1743 | .checkbox { 1744 | display: block; 1745 | min-height: 21px; 1746 | margin-top: 10px; 1747 | margin-bottom: 10px; 1748 | padding-left: 20px; 1749 | } 1750 | .radio label, 1751 | .checkbox label { 1752 | display: inline; 1753 | font-weight: normal; 1754 | cursor: pointer; 1755 | } 1756 | .radio input[type="radio"], 1757 | .radio-inline input[type="radio"], 1758 | .checkbox input[type="checkbox"], 1759 | .checkbox-inline input[type="checkbox"] { 1760 | float: left; 1761 | margin-left: -20px; 1762 | } 1763 | .radio + .radio, 1764 | .checkbox + .checkbox { 1765 | margin-top: -5px; 1766 | } 1767 | .radio-inline, 1768 | .checkbox-inline { 1769 | display: inline-block; 1770 | padding-left: 20px; 1771 | margin-bottom: 0; 1772 | vertical-align: middle; 1773 | font-weight: normal; 1774 | cursor: pointer; 1775 | } 1776 | .radio-inline + .radio-inline, 1777 | .checkbox-inline + .checkbox-inline { 1778 | margin-top: 0; 1779 | margin-left: 10px; 1780 | } 1781 | input[type="radio"][disabled], 1782 | input[type="checkbox"][disabled], 1783 | .radio[disabled], 1784 | .radio-inline[disabled], 1785 | .checkbox[disabled], 1786 | .checkbox-inline[disabled], 1787 | fieldset[disabled] input[type="radio"], 1788 | fieldset[disabled] input[type="checkbox"], 1789 | fieldset[disabled] .radio, 1790 | fieldset[disabled] .radio-inline, 1791 | fieldset[disabled] .checkbox, 1792 | fieldset[disabled] .checkbox-inline { 1793 | cursor: not-allowed; 1794 | } 1795 | .input-sm { 1796 | height: 33px; 1797 | padding: 6px 9px; 1798 | font-size: 13px; 1799 | line-height: 1.5; 1800 | border-radius: 3px; 1801 | } 1802 | select.input-sm { 1803 | height: 33px; 1804 | line-height: 33px; 1805 | } 1806 | textarea.input-sm, 1807 | select[multiple].input-sm { 1808 | height: auto; 1809 | } 1810 | .input-lg { 1811 | height: 64px; 1812 | padding: 18px 27px; 1813 | font-size: 19px; 1814 | line-height: 1.33; 1815 | border-radius: 6px; 1816 | } 1817 | select.input-lg { 1818 | height: 64px; 1819 | line-height: 64px; 1820 | } 1821 | textarea.input-lg, 1822 | select[multiple].input-lg { 1823 | height: auto; 1824 | } 1825 | .has-feedback { 1826 | position: relative; 1827 | } 1828 | .has-feedback .form-control { 1829 | padding-right: 53.75px; 1830 | } 1831 | .has-feedback .form-control-feedback { 1832 | position: absolute; 1833 | top: 26px; 1834 | right: 0; 1835 | display: block; 1836 | width: 43px; 1837 | height: 43px; 1838 | line-height: 43px; 1839 | text-align: center; 1840 | } 1841 | .has-success .help-block, 1842 | .has-success .control-label, 1843 | .has-success .radio, 1844 | .has-success .checkbox, 1845 | .has-success .radio-inline, 1846 | .has-success .checkbox-inline { 1847 | color: #ffffff; 1848 | } 1849 | .has-success .form-control { 1850 | border-color: #ffffff; 1851 | -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); 1852 | box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); 1853 | } 1854 | .has-success .form-control:focus { 1855 | border-color: #e6e6e6; 1856 | -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #ffffff; 1857 | box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #ffffff; 1858 | } 1859 | .has-success .input-group-addon { 1860 | color: #ffffff; 1861 | border-color: #ffffff; 1862 | background-color: #00bc8c; 1863 | } 1864 | .has-success .form-control-feedback { 1865 | color: #ffffff; 1866 | } 1867 | .has-warning .help-block, 1868 | .has-warning .control-label, 1869 | .has-warning .radio, 1870 | .has-warning .checkbox, 1871 | .has-warning .radio-inline, 1872 | .has-warning .checkbox-inline { 1873 | color: #ffffff; 1874 | } 1875 | .has-warning .form-control { 1876 | border-color: #ffffff; 1877 | -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); 1878 | box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); 1879 | } 1880 | .has-warning .form-control:focus { 1881 | border-color: #e6e6e6; 1882 | -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #ffffff; 1883 | box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #ffffff; 1884 | } 1885 | .has-warning .input-group-addon { 1886 | color: #ffffff; 1887 | border-color: #ffffff; 1888 | background-color: #f39c12; 1889 | } 1890 | .has-warning .form-control-feedback { 1891 | color: #ffffff; 1892 | } 1893 | .has-error .help-block, 1894 | .has-error .control-label, 1895 | .has-error .radio, 1896 | .has-error .checkbox, 1897 | .has-error .radio-inline, 1898 | .has-error .checkbox-inline { 1899 | color: #ffffff; 1900 | } 1901 | .has-error .form-control { 1902 | border-color: #ffffff; 1903 | -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); 1904 | box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); 1905 | } 1906 | .has-error .form-control:focus { 1907 | border-color: #e6e6e6; 1908 | -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #ffffff; 1909 | box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #ffffff; 1910 | } 1911 | .has-error .input-group-addon { 1912 | color: #ffffff; 1913 | border-color: #ffffff; 1914 | background-color: #e74c3c; 1915 | } 1916 | .has-error .form-control-feedback { 1917 | color: #ffffff; 1918 | } 1919 | .form-control-static { 1920 | margin-bottom: 0; 1921 | } 1922 | .help-block { 1923 | display: block; 1924 | margin-top: 5px; 1925 | margin-bottom: 10px; 1926 | color: #ffffff; 1927 | } 1928 | @media (min-width: 768px) { 1929 | .form-inline .form-group { 1930 | display: inline-block; 1931 | margin-bottom: 0; 1932 | vertical-align: middle; 1933 | } 1934 | .form-inline .form-control { 1935 | display: inline-block; 1936 | width: auto; 1937 | vertical-align: middle; 1938 | } 1939 | .form-inline .input-group > .form-control { 1940 | width: 100%; 1941 | } 1942 | .form-inline .control-label { 1943 | margin-bottom: 0; 1944 | vertical-align: middle; 1945 | } 1946 | .form-inline .radio, 1947 | .form-inline .checkbox { 1948 | display: inline-block; 1949 | margin-top: 0; 1950 | margin-bottom: 0; 1951 | padding-left: 0; 1952 | vertical-align: middle; 1953 | } 1954 | .form-inline .radio input[type="radio"], 1955 | .form-inline .checkbox input[type="checkbox"] { 1956 | float: none; 1957 | margin-left: 0; 1958 | } 1959 | .form-inline .has-feedback .form-control-feedback { 1960 | top: 0; 1961 | } 1962 | } 1963 | .form-horizontal .control-label, 1964 | .form-horizontal .radio, 1965 | .form-horizontal .checkbox, 1966 | .form-horizontal .radio-inline, 1967 | .form-horizontal .checkbox-inline { 1968 | margin-top: 0; 1969 | margin-bottom: 0; 1970 | padding-top: 11px; 1971 | } 1972 | .form-horizontal .radio, 1973 | .form-horizontal .checkbox { 1974 | min-height: 32px; 1975 | } 1976 | .form-horizontal .form-group { 1977 | margin-left: -15px; 1978 | margin-right: -15px; 1979 | } 1980 | .form-horizontal .form-control-static { 1981 | padding-top: 11px; 1982 | } 1983 | @media (min-width: 768px) { 1984 | .form-horizontal .control-label { 1985 | text-align: right; 1986 | } 1987 | } 1988 | .form-horizontal .has-feedback .form-control-feedback { 1989 | top: 0; 1990 | right: 15px; 1991 | } 1992 | .btn { 1993 | display: inline-block; 1994 | margin-bottom: 0; 1995 | font-weight: normal; 1996 | text-align: center; 1997 | vertical-align: middle; 1998 | cursor: pointer; 1999 | background-image: none; 2000 | border: 1px solid transparent; 2001 | white-space: nowrap; 2002 | padding: 10px 15px; 2003 | font-size: 15px; 2004 | line-height: 1.42857143; 2005 | border-radius: 4px; 2006 | -webkit-user-select: none; 2007 | -moz-user-select: none; 2008 | -ms-user-select: none; 2009 | user-select: none; 2010 | } 2011 | .btn:focus, 2012 | .btn:active:focus, 2013 | .btn.active:focus { 2014 | outline: thin dotted; 2015 | outline: 5px auto -webkit-focus-ring-color; 2016 | outline-offset: -2px; 2017 | } 2018 | .btn:hover, 2019 | .btn:focus { 2020 | color: #ffffff; 2021 | text-decoration: none; 2022 | } 2023 | .btn:active, 2024 | .btn.active { 2025 | outline: 0; 2026 | background-image: none; 2027 | -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); 2028 | box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); 2029 | } 2030 | .btn.disabled, 2031 | .btn[disabled], 2032 | fieldset[disabled] .btn { 2033 | cursor: not-allowed; 2034 | pointer-events: none; 2035 | opacity: 0.65; 2036 | filter: alpha(opacity=65); 2037 | -webkit-box-shadow: none; 2038 | box-shadow: none; 2039 | } 2040 | .btn-default { 2041 | color: #ffffff; 2042 | background-color: #464545; 2043 | border-color: #464545; 2044 | } 2045 | .btn-default:hover, 2046 | .btn-default:focus, 2047 | .btn-default:active, 2048 | .btn-default.active, 2049 | .open .dropdown-toggle.btn-default { 2050 | color: #ffffff; 2051 | background-color: #313131; 2052 | border-color: #272727; 2053 | } 2054 | .btn-default:active, 2055 | .btn-default.active, 2056 | .open .dropdown-toggle.btn-default { 2057 | background-image: none; 2058 | } 2059 | .btn-default.disabled, 2060 | .btn-default[disabled], 2061 | fieldset[disabled] .btn-default, 2062 | .btn-default.disabled:hover, 2063 | .btn-default[disabled]:hover, 2064 | fieldset[disabled] .btn-default:hover, 2065 | .btn-default.disabled:focus, 2066 | .btn-default[disabled]:focus, 2067 | fieldset[disabled] .btn-default:focus, 2068 | .btn-default.disabled:active, 2069 | .btn-default[disabled]:active, 2070 | fieldset[disabled] .btn-default:active, 2071 | .btn-default.disabled.active, 2072 | .btn-default[disabled].active, 2073 | fieldset[disabled] .btn-default.active { 2074 | background-color: #464545; 2075 | border-color: #464545; 2076 | } 2077 | .btn-default .badge { 2078 | color: #464545; 2079 | background-color: #ffffff; 2080 | } 2081 | .btn-primary { 2082 | color: #ffffff; 2083 | background-color: #375a7f; 2084 | border-color: #375a7f; 2085 | } 2086 | .btn-primary:hover, 2087 | .btn-primary:focus, 2088 | .btn-primary:active, 2089 | .btn-primary.active, 2090 | .open .dropdown-toggle.btn-primary { 2091 | color: #ffffff; 2092 | background-color: #2b4663; 2093 | border-color: #253c54; 2094 | } 2095 | .btn-primary:active, 2096 | .btn-primary.active, 2097 | .open .dropdown-toggle.btn-primary { 2098 | background-image: none; 2099 | } 2100 | .btn-primary.disabled, 2101 | .btn-primary[disabled], 2102 | fieldset[disabled] .btn-primary, 2103 | .btn-primary.disabled:hover, 2104 | .btn-primary[disabled]:hover, 2105 | fieldset[disabled] .btn-primary:hover, 2106 | .btn-primary.disabled:focus, 2107 | .btn-primary[disabled]:focus, 2108 | fieldset[disabled] .btn-primary:focus, 2109 | .btn-primary.disabled:active, 2110 | .btn-primary[disabled]:active, 2111 | fieldset[disabled] .btn-primary:active, 2112 | .btn-primary.disabled.active, 2113 | .btn-primary[disabled].active, 2114 | fieldset[disabled] .btn-primary.active { 2115 | background-color: #375a7f; 2116 | border-color: #375a7f; 2117 | } 2118 | .btn-primary .badge { 2119 | color: #375a7f; 2120 | background-color: #ffffff; 2121 | } 2122 | .btn-success { 2123 | color: #ffffff; 2124 | background-color: #00bc8c; 2125 | border-color: #00bc8c; 2126 | } 2127 | .btn-success:hover, 2128 | .btn-success:focus, 2129 | .btn-success:active, 2130 | .btn-success.active, 2131 | .open .dropdown-toggle.btn-success { 2132 | color: #ffffff; 2133 | background-color: #00936e; 2134 | border-color: #007f5e; 2135 | } 2136 | .btn-success:active, 2137 | .btn-success.active, 2138 | .open .dropdown-toggle.btn-success { 2139 | background-image: none; 2140 | } 2141 | .btn-success.disabled, 2142 | .btn-success[disabled], 2143 | fieldset[disabled] .btn-success, 2144 | .btn-success.disabled:hover, 2145 | .btn-success[disabled]:hover, 2146 | fieldset[disabled] .btn-success:hover, 2147 | .btn-success.disabled:focus, 2148 | .btn-success[disabled]:focus, 2149 | fieldset[disabled] .btn-success:focus, 2150 | .btn-success.disabled:active, 2151 | .btn-success[disabled]:active, 2152 | fieldset[disabled] .btn-success:active, 2153 | .btn-success.disabled.active, 2154 | .btn-success[disabled].active, 2155 | fieldset[disabled] .btn-success.active { 2156 | background-color: #00bc8c; 2157 | border-color: #00bc8c; 2158 | } 2159 | .btn-success .badge { 2160 | color: #00bc8c; 2161 | background-color: #ffffff; 2162 | } 2163 | .btn-info { 2164 | color: #ffffff; 2165 | background-color: #3498db; 2166 | border-color: #3498db; 2167 | } 2168 | .btn-info:hover, 2169 | .btn-info:focus, 2170 | .btn-info:active, 2171 | .btn-info.active, 2172 | .open .dropdown-toggle.btn-info { 2173 | color: #ffffff; 2174 | background-color: #2383c4; 2175 | border-color: #2077b2; 2176 | } 2177 | .btn-info:active, 2178 | .btn-info.active, 2179 | .open .dropdown-toggle.btn-info { 2180 | background-image: none; 2181 | } 2182 | .btn-info.disabled, 2183 | .btn-info[disabled], 2184 | fieldset[disabled] .btn-info, 2185 | .btn-info.disabled:hover, 2186 | .btn-info[disabled]:hover, 2187 | fieldset[disabled] .btn-info:hover, 2188 | .btn-info.disabled:focus, 2189 | .btn-info[disabled]:focus, 2190 | fieldset[disabled] .btn-info:focus, 2191 | .btn-info.disabled:active, 2192 | .btn-info[disabled]:active, 2193 | fieldset[disabled] .btn-info:active, 2194 | .btn-info.disabled.active, 2195 | .btn-info[disabled].active, 2196 | fieldset[disabled] .btn-info.active { 2197 | background-color: #3498db; 2198 | border-color: #3498db; 2199 | } 2200 | .btn-info .badge { 2201 | color: #3498db; 2202 | background-color: #ffffff; 2203 | } 2204 | .btn-warning { 2205 | color: #ffffff; 2206 | background-color: #f39c12; 2207 | border-color: #f39c12; 2208 | } 2209 | .btn-warning:hover, 2210 | .btn-warning:focus, 2211 | .btn-warning:active, 2212 | .btn-warning.active, 2213 | .open .dropdown-toggle.btn-warning { 2214 | color: #ffffff; 2215 | background-color: #d2850b; 2216 | border-color: #be780a; 2217 | } 2218 | .btn-warning:active, 2219 | .btn-warning.active, 2220 | .open .dropdown-toggle.btn-warning { 2221 | background-image: none; 2222 | } 2223 | .btn-warning.disabled, 2224 | .btn-warning[disabled], 2225 | fieldset[disabled] .btn-warning, 2226 | .btn-warning.disabled:hover, 2227 | .btn-warning[disabled]:hover, 2228 | fieldset[disabled] .btn-warning:hover, 2229 | .btn-warning.disabled:focus, 2230 | .btn-warning[disabled]:focus, 2231 | fieldset[disabled] .btn-warning:focus, 2232 | .btn-warning.disabled:active, 2233 | .btn-warning[disabled]:active, 2234 | fieldset[disabled] .btn-warning:active, 2235 | .btn-warning.disabled.active, 2236 | .btn-warning[disabled].active, 2237 | fieldset[disabled] .btn-warning.active { 2238 | background-color: #f39c12; 2239 | border-color: #f39c12; 2240 | } 2241 | .btn-warning .badge { 2242 | color: #f39c12; 2243 | background-color: #ffffff; 2244 | } 2245 | .btn-danger { 2246 | color: #ffffff; 2247 | background-color: #e74c3c; 2248 | border-color: #e74c3c; 2249 | } 2250 | .btn-danger:hover, 2251 | .btn-danger:focus, 2252 | .btn-danger:active, 2253 | .btn-danger.active, 2254 | .open .dropdown-toggle.btn-danger { 2255 | color: #ffffff; 2256 | background-color: #df2e1b; 2257 | border-color: #cd2a19; 2258 | } 2259 | .btn-danger:active, 2260 | .btn-danger.active, 2261 | .open .dropdown-toggle.btn-danger { 2262 | background-image: none; 2263 | } 2264 | .btn-danger.disabled, 2265 | .btn-danger[disabled], 2266 | fieldset[disabled] .btn-danger, 2267 | .btn-danger.disabled:hover, 2268 | .btn-danger[disabled]:hover, 2269 | fieldset[disabled] .btn-danger:hover, 2270 | .btn-danger.disabled:focus, 2271 | .btn-danger[disabled]:focus, 2272 | fieldset[disabled] .btn-danger:focus, 2273 | .btn-danger.disabled:active, 2274 | .btn-danger[disabled]:active, 2275 | fieldset[disabled] .btn-danger:active, 2276 | .btn-danger.disabled.active, 2277 | .btn-danger[disabled].active, 2278 | fieldset[disabled] .btn-danger.active { 2279 | background-color: #e74c3c; 2280 | border-color: #e74c3c; 2281 | } 2282 | .btn-danger .badge { 2283 | color: #e74c3c; 2284 | background-color: #ffffff; 2285 | } 2286 | .btn-link { 2287 | color: #0ce3ac; 2288 | font-weight: normal; 2289 | cursor: pointer; 2290 | border-radius: 0; 2291 | } 2292 | .btn-link, 2293 | .btn-link:active, 2294 | .btn-link[disabled], 2295 | fieldset[disabled] .btn-link { 2296 | background-color: transparent; 2297 | -webkit-box-shadow: none; 2298 | box-shadow: none; 2299 | } 2300 | .btn-link, 2301 | .btn-link:hover, 2302 | .btn-link:focus, 2303 | .btn-link:active { 2304 | border-color: transparent; 2305 | } 2306 | .btn-link:hover, 2307 | .btn-link:focus { 2308 | color: #0ce3ac; 2309 | text-decoration: underline; 2310 | background-color: transparent; 2311 | } 2312 | .btn-link[disabled]:hover, 2313 | fieldset[disabled] .btn-link:hover, 2314 | .btn-link[disabled]:focus, 2315 | fieldset[disabled] .btn-link:focus { 2316 | color: #999999; 2317 | text-decoration: none; 2318 | } 2319 | .btn-lg, 2320 | .btn-group-lg > .btn { 2321 | padding: 18px 27px; 2322 | font-size: 19px; 2323 | line-height: 1.33; 2324 | border-radius: 6px; 2325 | } 2326 | .btn-sm, 2327 | .btn-group-sm > .btn { 2328 | padding: 6px 9px; 2329 | font-size: 13px; 2330 | line-height: 1.5; 2331 | border-radius: 3px; 2332 | } 2333 | .btn-xs, 2334 | .btn-group-xs > .btn { 2335 | padding: 1px 5px; 2336 | font-size: 13px; 2337 | line-height: 1.5; 2338 | border-radius: 3px; 2339 | } 2340 | .btn-block { 2341 | display: block; 2342 | width: 100%; 2343 | padding-left: 0; 2344 | padding-right: 0; 2345 | } 2346 | .btn-block + .btn-block { 2347 | margin-top: 5px; 2348 | } 2349 | input[type="submit"].btn-block, 2350 | input[type="reset"].btn-block, 2351 | input[type="button"].btn-block { 2352 | width: 100%; 2353 | } 2354 | .fade { 2355 | opacity: 0; 2356 | -webkit-transition: opacity 0.15s linear; 2357 | transition: opacity 0.15s linear; 2358 | } 2359 | .fade.in { 2360 | opacity: 1; 2361 | } 2362 | .collapse { 2363 | display: none; 2364 | } 2365 | .collapse.in { 2366 | display: block; 2367 | } 2368 | .collapsing { 2369 | position: relative; 2370 | height: 0; 2371 | overflow: hidden; 2372 | -webkit-transition: height 0.35s ease; 2373 | transition: height 0.35s ease; 2374 | } 2375 | .caret { 2376 | display: inline-block; 2377 | width: 0; 2378 | height: 0; 2379 | margin-left: 2px; 2380 | vertical-align: middle; 2381 | border-top: 4px solid; 2382 | border-right: 4px solid transparent; 2383 | border-left: 4px solid transparent; 2384 | } 2385 | .dropdown { 2386 | position: relative; 2387 | } 2388 | .dropdown-toggle:focus { 2389 | outline: 0; 2390 | } 2391 | .dropdown-menu { 2392 | position: absolute; 2393 | top: 100%; 2394 | left: 0; 2395 | z-index: 1000; 2396 | display: none; 2397 | float: left; 2398 | min-width: 160px; 2399 | padding: 5px 0; 2400 | margin: 2px 0 0; 2401 | list-style: none; 2402 | font-size: 15px; 2403 | background-color: #ffffff; 2404 | border: 1px solid #cccccc; 2405 | border: 1px solid rgba(0, 0, 0, 0.15); 2406 | border-radius: 4px; 2407 | -webkit-box-shadow: 0 6px 12px rgba(0, 0, 0, 0.175); 2408 | box-shadow: 0 6px 12px rgba(0, 0, 0, 0.175); 2409 | background-clip: padding-box; 2410 | } 2411 | .dropdown-menu.pull-right { 2412 | right: 0; 2413 | left: auto; 2414 | } 2415 | .dropdown-menu .divider { 2416 | height: 1px; 2417 | margin: 9.5px 0; 2418 | overflow: hidden; 2419 | background-color: #e5e5e5; 2420 | } 2421 | .dropdown-menu > li > a { 2422 | display: block; 2423 | padding: 3px 20px; 2424 | clear: both; 2425 | font-weight: normal; 2426 | line-height: 1.42857143; 2427 | color: #375a7f; 2428 | white-space: nowrap; 2429 | } 2430 | .dropdown-menu > li > a:hover, 2431 | .dropdown-menu > li > a:focus { 2432 | text-decoration: none; 2433 | color: #ffffff; 2434 | background-color: #00bc8c; 2435 | } 2436 | .dropdown-menu > .active > a, 2437 | .dropdown-menu > .active > a:hover, 2438 | .dropdown-menu > .active > a:focus { 2439 | color: #ffffff; 2440 | text-decoration: none; 2441 | outline: 0; 2442 | background-color: #00bc8c; 2443 | } 2444 | .dropdown-menu > .disabled > a, 2445 | .dropdown-menu > .disabled > a:hover, 2446 | .dropdown-menu > .disabled > a:focus { 2447 | color: #999999; 2448 | } 2449 | .dropdown-menu > .disabled > a:hover, 2450 | .dropdown-menu > .disabled > a:focus { 2451 | text-decoration: none; 2452 | background-color: transparent; 2453 | background-image: none; 2454 | cursor: not-allowed; 2455 | } 2456 | .open > .dropdown-menu { 2457 | display: block; 2458 | } 2459 | .open > a { 2460 | outline: 0; 2461 | } 2462 | .dropdown-menu-right { 2463 | left: auto; 2464 | right: 0; 2465 | } 2466 | .dropdown-menu-left { 2467 | left: 0; 2468 | right: auto; 2469 | } 2470 | .dropdown-header { 2471 | display: block; 2472 | padding: 3px 20px; 2473 | font-size: 13px; 2474 | line-height: 1.42857143; 2475 | color: #999999; 2476 | } 2477 | .dropdown-backdrop { 2478 | position: fixed; 2479 | left: 0; 2480 | right: 0; 2481 | bottom: 0; 2482 | top: 0; 2483 | z-index: 990; 2484 | } 2485 | .pull-right > .dropdown-menu { 2486 | right: 0; 2487 | left: auto; 2488 | } 2489 | .dropup .caret, 2490 | .navbar-fixed-bottom .dropdown .caret { 2491 | border-top: 0; 2492 | border-bottom: 4px solid; 2493 | content: ""; 2494 | } 2495 | .dropup .dropdown-menu, 2496 | .navbar-fixed-bottom .dropdown .dropdown-menu { 2497 | top: auto; 2498 | bottom: 100%; 2499 | margin-bottom: 1px; 2500 | } 2501 | @media (min-width: 768px) { 2502 | .navbar-right .dropdown-menu { 2503 | left: auto; 2504 | right: 0; 2505 | } 2506 | .navbar-right .dropdown-menu-left { 2507 | left: 0; 2508 | right: auto; 2509 | } 2510 | } 2511 | .btn-group, 2512 | .btn-group-vertical { 2513 | position: relative; 2514 | display: inline-block; 2515 | vertical-align: middle; 2516 | } 2517 | .btn-group > .btn, 2518 | .btn-group-vertical > .btn { 2519 | position: relative; 2520 | float: left; 2521 | } 2522 | .btn-group > .btn:hover, 2523 | .btn-group-vertical > .btn:hover, 2524 | .btn-group > .btn:focus, 2525 | .btn-group-vertical > .btn:focus, 2526 | .btn-group > .btn:active, 2527 | .btn-group-vertical > .btn:active, 2528 | .btn-group > .btn.active, 2529 | .btn-group-vertical > .btn.active { 2530 | z-index: 2; 2531 | } 2532 | .btn-group > .btn:focus, 2533 | .btn-group-vertical > .btn:focus { 2534 | outline: none; 2535 | } 2536 | .btn-group .btn + .btn, 2537 | .btn-group .btn + .btn-group, 2538 | .btn-group .btn-group + .btn, 2539 | .btn-group .btn-group + .btn-group { 2540 | margin-left: -1px; 2541 | } 2542 | .btn-toolbar { 2543 | margin-left: -5px; 2544 | } 2545 | .btn-toolbar .btn-group, 2546 | .btn-toolbar .input-group { 2547 | float: left; 2548 | } 2549 | .btn-toolbar > .btn, 2550 | .btn-toolbar > .btn-group, 2551 | .btn-toolbar > .input-group { 2552 | margin-left: 5px; 2553 | } 2554 | .btn-group > .btn:not(:first-child):not(:last-child):not(.dropdown-toggle) { 2555 | border-radius: 0; 2556 | } 2557 | .btn-group > .btn:first-child { 2558 | margin-left: 0; 2559 | } 2560 | .btn-group > .btn:first-child:not(:last-child):not(.dropdown-toggle) { 2561 | border-bottom-right-radius: 0; 2562 | border-top-right-radius: 0; 2563 | } 2564 | .btn-group > .btn:last-child:not(:first-child), 2565 | .btn-group > .dropdown-toggle:not(:first-child) { 2566 | border-bottom-left-radius: 0; 2567 | border-top-left-radius: 0; 2568 | } 2569 | .btn-group > .btn-group { 2570 | float: left; 2571 | } 2572 | .btn-group > .btn-group:not(:first-child):not(:last-child) > .btn { 2573 | border-radius: 0; 2574 | } 2575 | .btn-group > .btn-group:first-child > .btn:last-child, 2576 | .btn-group > .btn-group:first-child > .dropdown-toggle { 2577 | border-bottom-right-radius: 0; 2578 | border-top-right-radius: 0; 2579 | } 2580 | .btn-group > .btn-group:last-child > .btn:first-child { 2581 | border-bottom-left-radius: 0; 2582 | border-top-left-radius: 0; 2583 | } 2584 | .btn-group .dropdown-toggle:active, 2585 | .btn-group.open .dropdown-toggle { 2586 | outline: 0; 2587 | } 2588 | .btn-group > .btn + .dropdown-toggle { 2589 | padding-left: 8px; 2590 | padding-right: 8px; 2591 | } 2592 | .btn-group > .btn-lg + .dropdown-toggle { 2593 | padding-left: 12px; 2594 | padding-right: 12px; 2595 | } 2596 | .btn-group.open .dropdown-toggle { 2597 | -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); 2598 | box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); 2599 | } 2600 | .btn-group.open .dropdown-toggle.btn-link { 2601 | -webkit-box-shadow: none; 2602 | box-shadow: none; 2603 | } 2604 | .btn .caret { 2605 | margin-left: 0; 2606 | } 2607 | .btn-lg .caret { 2608 | border-width: 5px 5px 0; 2609 | border-bottom-width: 0; 2610 | } 2611 | .dropup .btn-lg .caret { 2612 | border-width: 0 5px 5px; 2613 | } 2614 | .btn-group-vertical > .btn, 2615 | .btn-group-vertical > .btn-group, 2616 | .btn-group-vertical > .btn-group > .btn { 2617 | display: block; 2618 | float: none; 2619 | width: 100%; 2620 | max-width: 100%; 2621 | } 2622 | .btn-group-vertical > .btn-group > .btn { 2623 | float: none; 2624 | } 2625 | .btn-group-vertical > .btn + .btn, 2626 | .btn-group-vertical > .btn + .btn-group, 2627 | .btn-group-vertical > .btn-group + .btn, 2628 | .btn-group-vertical > .btn-group + .btn-group { 2629 | margin-top: -1px; 2630 | margin-left: 0; 2631 | } 2632 | .btn-group-vertical > .btn:not(:first-child):not(:last-child) { 2633 | border-radius: 0; 2634 | } 2635 | .btn-group-vertical > .btn:first-child:not(:last-child) { 2636 | border-top-right-radius: 4px; 2637 | border-bottom-right-radius: 0; 2638 | border-bottom-left-radius: 0; 2639 | } 2640 | .btn-group-vertical > .btn:last-child:not(:first-child) { 2641 | border-bottom-left-radius: 4px; 2642 | border-top-right-radius: 0; 2643 | border-top-left-radius: 0; 2644 | } 2645 | .btn-group-vertical > .btn-group:not(:first-child):not(:last-child) > .btn { 2646 | border-radius: 0; 2647 | } 2648 | .btn-group-vertical > .btn-group:first-child:not(:last-child) > .btn:last-child, 2649 | .btn-group-vertical > .btn-group:first-child:not(:last-child) > .dropdown-toggle { 2650 | border-bottom-right-radius: 0; 2651 | border-bottom-left-radius: 0; 2652 | } 2653 | .btn-group-vertical > .btn-group:last-child:not(:first-child) > .btn:first-child { 2654 | border-top-right-radius: 0; 2655 | border-top-left-radius: 0; 2656 | } 2657 | .btn-group-justified { 2658 | display: table; 2659 | width: 100%; 2660 | table-layout: fixed; 2661 | border-collapse: separate; 2662 | } 2663 | .btn-group-justified > .btn, 2664 | .btn-group-justified > .btn-group { 2665 | float: none; 2666 | display: table-cell; 2667 | width: 1%; 2668 | } 2669 | .btn-group-justified > .btn-group .btn { 2670 | width: 100%; 2671 | } 2672 | [data-toggle="buttons"] > .btn > input[type="radio"], 2673 | [data-toggle="buttons"] > .btn > input[type="checkbox"] { 2674 | display: none; 2675 | } 2676 | .input-group { 2677 | position: relative; 2678 | display: table; 2679 | border-collapse: separate; 2680 | } 2681 | .input-group[class*="col-"] { 2682 | float: none; 2683 | padding-left: 0; 2684 | padding-right: 0; 2685 | } 2686 | .input-group .form-control { 2687 | position: relative; 2688 | z-index: 2; 2689 | float: left; 2690 | width: 100%; 2691 | margin-bottom: 0; 2692 | } 2693 | .input-group-lg > .form-control, 2694 | .input-group-lg > .input-group-addon, 2695 | .input-group-lg > .input-group-btn > .btn { 2696 | height: 64px; 2697 | padding: 18px 27px; 2698 | font-size: 19px; 2699 | line-height: 1.33; 2700 | border-radius: 6px; 2701 | } 2702 | select.input-group-lg > .form-control, 2703 | select.input-group-lg > .input-group-addon, 2704 | select.input-group-lg > .input-group-btn > .btn { 2705 | height: 64px; 2706 | line-height: 64px; 2707 | } 2708 | textarea.input-group-lg > .form-control, 2709 | textarea.input-group-lg > .input-group-addon, 2710 | textarea.input-group-lg > .input-group-btn > .btn, 2711 | select[multiple].input-group-lg > .form-control, 2712 | select[multiple].input-group-lg > .input-group-addon, 2713 | select[multiple].input-group-lg > .input-group-btn > .btn { 2714 | height: auto; 2715 | } 2716 | .input-group-sm > .form-control, 2717 | .input-group-sm > .input-group-addon, 2718 | .input-group-sm > .input-group-btn > .btn { 2719 | height: 33px; 2720 | padding: 6px 9px; 2721 | font-size: 13px; 2722 | line-height: 1.5; 2723 | border-radius: 3px; 2724 | } 2725 | select.input-group-sm > .form-control, 2726 | select.input-group-sm > .input-group-addon, 2727 | select.input-group-sm > .input-group-btn > .btn { 2728 | height: 33px; 2729 | line-height: 33px; 2730 | } 2731 | textarea.input-group-sm > .form-control, 2732 | textarea.input-group-sm > .input-group-addon, 2733 | textarea.input-group-sm > .input-group-btn > .btn, 2734 | select[multiple].input-group-sm > .form-control, 2735 | select[multiple].input-group-sm > .input-group-addon, 2736 | select[multiple].input-group-sm > .input-group-btn > .btn { 2737 | height: auto; 2738 | } 2739 | .input-group-addon, 2740 | .input-group-btn, 2741 | .input-group .form-control { 2742 | display: table-cell; 2743 | } 2744 | .input-group-addon:not(:first-child):not(:last-child), 2745 | .input-group-btn:not(:first-child):not(:last-child), 2746 | .input-group .form-control:not(:first-child):not(:last-child) { 2747 | border-radius: 0; 2748 | } 2749 | .input-group-addon, 2750 | .input-group-btn { 2751 | width: 1%; 2752 | white-space: nowrap; 2753 | vertical-align: middle; 2754 | } 2755 | .input-group-addon { 2756 | padding: 10px 15px; 2757 | font-size: 15px; 2758 | font-weight: normal; 2759 | line-height: 1; 2760 | color: #464545; 2761 | text-align: center; 2762 | background-color: #303030; 2763 | border: 1px solid transparent; 2764 | border-radius: 4px; 2765 | } 2766 | .input-group-addon.input-sm { 2767 | padding: 6px 9px; 2768 | font-size: 13px; 2769 | border-radius: 3px; 2770 | } 2771 | .input-group-addon.input-lg { 2772 | padding: 18px 27px; 2773 | font-size: 19px; 2774 | border-radius: 6px; 2775 | } 2776 | .input-group-addon input[type="radio"], 2777 | .input-group-addon input[type="checkbox"] { 2778 | margin-top: 0; 2779 | } 2780 | .input-group .form-control:first-child, 2781 | .input-group-addon:first-child, 2782 | .input-group-btn:first-child > .btn, 2783 | .input-group-btn:first-child > .btn-group > .btn, 2784 | .input-group-btn:first-child > .dropdown-toggle, 2785 | .input-group-btn:last-child > .btn:not(:last-child):not(.dropdown-toggle), 2786 | .input-group-btn:last-child > .btn-group:not(:last-child) > .btn { 2787 | border-bottom-right-radius: 0; 2788 | border-top-right-radius: 0; 2789 | } 2790 | .input-group-addon:first-child { 2791 | border-right: 0; 2792 | } 2793 | .input-group .form-control:last-child, 2794 | .input-group-addon:last-child, 2795 | .input-group-btn:last-child > .btn, 2796 | .input-group-btn:last-child > .btn-group > .btn, 2797 | .input-group-btn:last-child > .dropdown-toggle, 2798 | .input-group-btn:first-child > .btn:not(:first-child), 2799 | .input-group-btn:first-child > .btn-group:not(:first-child) > .btn { 2800 | border-bottom-left-radius: 0; 2801 | border-top-left-radius: 0; 2802 | } 2803 | .input-group-addon:last-child { 2804 | border-left: 0; 2805 | } 2806 | .input-group-btn { 2807 | position: relative; 2808 | font-size: 0; 2809 | white-space: nowrap; 2810 | } 2811 | .input-group-btn > .btn { 2812 | position: relative; 2813 | } 2814 | .input-group-btn > .btn + .btn { 2815 | margin-left: -1px; 2816 | } 2817 | .input-group-btn > .btn:hover, 2818 | .input-group-btn > .btn:focus, 2819 | .input-group-btn > .btn:active { 2820 | z-index: 2; 2821 | } 2822 | .input-group-btn:first-child > .btn, 2823 | .input-group-btn:first-child > .btn-group { 2824 | margin-right: -1px; 2825 | } 2826 | .input-group-btn:last-child > .btn, 2827 | .input-group-btn:last-child > .btn-group { 2828 | margin-left: -1px; 2829 | } 2830 | .nav { 2831 | margin-bottom: 0; 2832 | padding-left: 0; 2833 | list-style: none; 2834 | } 2835 | .nav > li { 2836 | position: relative; 2837 | display: block; 2838 | } 2839 | .nav > li > a { 2840 | position: relative; 2841 | display: block; 2842 | padding: 10px 15px; 2843 | } 2844 | .nav > li > a:hover, 2845 | .nav > li > a:focus { 2846 | text-decoration: none; 2847 | background-color: #303030; 2848 | } 2849 | .nav > li.disabled > a { 2850 | color: #605e5e; 2851 | } 2852 | .nav > li.disabled > a:hover, 2853 | .nav > li.disabled > a:focus { 2854 | color: #605e5e; 2855 | text-decoration: none; 2856 | background-color: transparent; 2857 | cursor: not-allowed; 2858 | } 2859 | .nav .open > a, 2860 | .nav .open > a:hover, 2861 | .nav .open > a:focus { 2862 | background-color: #303030; 2863 | border-color: #0ce3ac; 2864 | } 2865 | .nav .nav-divider { 2866 | height: 1px; 2867 | margin: 9.5px 0; 2868 | overflow: hidden; 2869 | background-color: #e5e5e5; 2870 | } 2871 | .nav > li > a > img { 2872 | max-width: none; 2873 | } 2874 | .nav-tabs { 2875 | border-bottom: 1px solid #464545; 2876 | } 2877 | .nav-tabs > li { 2878 | float: left; 2879 | margin-bottom: -1px; 2880 | } 2881 | .nav-tabs > li > a { 2882 | margin-right: 2px; 2883 | line-height: 1.42857143; 2884 | border: 1px solid transparent; 2885 | border-radius: 4px 4px 0 0; 2886 | } 2887 | .nav-tabs > li > a:hover { 2888 | border-color: #464545 #464545 #464545; 2889 | } 2890 | .nav-tabs > li.active > a, 2891 | .nav-tabs > li.active > a:hover, 2892 | .nav-tabs > li.active > a:focus { 2893 | color: #00bc8c; 2894 | background-color: #222222; 2895 | border: 1px solid #464545; 2896 | border-bottom-color: transparent; 2897 | cursor: default; 2898 | } 2899 | .nav-tabs.nav-justified { 2900 | width: 100%; 2901 | border-bottom: 0; 2902 | } 2903 | .nav-tabs.nav-justified > li { 2904 | float: none; 2905 | } 2906 | .nav-tabs.nav-justified > li > a { 2907 | text-align: center; 2908 | margin-bottom: 5px; 2909 | } 2910 | .nav-tabs.nav-justified > .dropdown .dropdown-menu { 2911 | top: auto; 2912 | left: auto; 2913 | } 2914 | @media (min-width: 768px) { 2915 | .nav-tabs.nav-justified > li { 2916 | display: table-cell; 2917 | width: 1%; 2918 | } 2919 | .nav-tabs.nav-justified > li > a { 2920 | margin-bottom: 0; 2921 | } 2922 | } 2923 | .nav-tabs.nav-justified > li > a { 2924 | margin-right: 0; 2925 | border-radius: 4px; 2926 | } 2927 | .nav-tabs.nav-justified > .active > a, 2928 | .nav-tabs.nav-justified > .active > a:hover, 2929 | .nav-tabs.nav-justified > .active > a:focus { 2930 | border: 1px solid #ebebeb; 2931 | } 2932 | @media (min-width: 768px) { 2933 | .nav-tabs.nav-justified > li > a { 2934 | border-bottom: 1px solid #ebebeb; 2935 | border-radius: 4px 4px 0 0; 2936 | } 2937 | .nav-tabs.nav-justified > .active > a, 2938 | .nav-tabs.nav-justified > .active > a:hover, 2939 | .nav-tabs.nav-justified > .active > a:focus { 2940 | border-bottom-color: #222222; 2941 | } 2942 | } 2943 | .nav-pills > li { 2944 | float: left; 2945 | } 2946 | .nav-pills > li > a { 2947 | border-radius: 4px; 2948 | } 2949 | .nav-pills > li + li { 2950 | margin-left: 2px; 2951 | } 2952 | .nav-pills > li.active > a, 2953 | .nav-pills > li.active > a:hover, 2954 | .nav-pills > li.active > a:focus { 2955 | color: #ffffff; 2956 | background-color: #00bc8c; 2957 | } 2958 | .nav-stacked > li { 2959 | float: none; 2960 | } 2961 | .nav-stacked > li + li { 2962 | margin-top: 2px; 2963 | margin-left: 0; 2964 | } 2965 | .nav-justified { 2966 | width: 100%; 2967 | } 2968 | .nav-justified > li { 2969 | float: none; 2970 | } 2971 | .nav-justified > li > a { 2972 | text-align: center; 2973 | margin-bottom: 5px; 2974 | } 2975 | .nav-justified > .dropdown .dropdown-menu { 2976 | top: auto; 2977 | left: auto; 2978 | } 2979 | @media (min-width: 768px) { 2980 | .nav-justified > li { 2981 | display: table-cell; 2982 | width: 1%; 2983 | } 2984 | .nav-justified > li > a { 2985 | margin-bottom: 0; 2986 | } 2987 | } 2988 | .nav-tabs-justified { 2989 | border-bottom: 0; 2990 | } 2991 | .nav-tabs-justified > li > a { 2992 | margin-right: 0; 2993 | border-radius: 4px; 2994 | } 2995 | .nav-tabs-justified > .active > a, 2996 | .nav-tabs-justified > .active > a:hover, 2997 | .nav-tabs-justified > .active > a:focus { 2998 | border: 1px solid #ebebeb; 2999 | } 3000 | @media (min-width: 768px) { 3001 | .nav-tabs-justified > li > a { 3002 | border-bottom: 1px solid #ebebeb; 3003 | border-radius: 4px 4px 0 0; 3004 | } 3005 | .nav-tabs-justified > .active > a, 3006 | .nav-tabs-justified > .active > a:hover, 3007 | .nav-tabs-justified > .active > a:focus { 3008 | border-bottom-color: #222222; 3009 | } 3010 | } 3011 | .tab-content > .tab-pane { 3012 | display: none; 3013 | } 3014 | .tab-content > .active { 3015 | display: block; 3016 | } 3017 | .nav-tabs .dropdown-menu { 3018 | margin-top: -1px; 3019 | border-top-right-radius: 0; 3020 | border-top-left-radius: 0; 3021 | } 3022 | .navbar { 3023 | position: relative; 3024 | min-height: 60px; 3025 | margin-bottom: 21px; 3026 | border: 1px solid transparent; 3027 | } 3028 | @media (min-width: 768px) { 3029 | .navbar { 3030 | border-radius: 4px; 3031 | } 3032 | } 3033 | @media (min-width: 768px) { 3034 | .navbar-header { 3035 | float: left; 3036 | } 3037 | } 3038 | .navbar-collapse { 3039 | max-height: 340px; 3040 | overflow-x: visible; 3041 | padding-right: 15px; 3042 | padding-left: 15px; 3043 | border-top: 1px solid transparent; 3044 | box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1); 3045 | -webkit-overflow-scrolling: touch; 3046 | } 3047 | .navbar-collapse.in { 3048 | overflow-y: auto; 3049 | } 3050 | @media (min-width: 768px) { 3051 | .navbar-collapse { 3052 | width: auto; 3053 | border-top: 0; 3054 | box-shadow: none; 3055 | } 3056 | .navbar-collapse.collapse { 3057 | display: block !important; 3058 | height: auto !important; 3059 | padding-bottom: 0; 3060 | overflow: visible !important; 3061 | } 3062 | .navbar-collapse.in { 3063 | overflow-y: visible; 3064 | } 3065 | .navbar-fixed-top .navbar-collapse, 3066 | .navbar-static-top .navbar-collapse, 3067 | .navbar-fixed-bottom .navbar-collapse { 3068 | padding-left: 0; 3069 | padding-right: 0; 3070 | } 3071 | } 3072 | .container > .navbar-header, 3073 | .container-fluid > .navbar-header, 3074 | .container > .navbar-collapse, 3075 | .container-fluid > .navbar-collapse { 3076 | margin-right: -15px; 3077 | margin-left: -15px; 3078 | } 3079 | @media (min-width: 768px) { 3080 | .container > .navbar-header, 3081 | .container-fluid > .navbar-header, 3082 | .container > .navbar-collapse, 3083 | .container-fluid > .navbar-collapse { 3084 | margin-right: 0; 3085 | margin-left: 0; 3086 | } 3087 | } 3088 | .navbar-static-top { 3089 | z-index: 1000; 3090 | border-width: 0 0 1px; 3091 | } 3092 | @media (min-width: 768px) { 3093 | .navbar-static-top { 3094 | border-radius: 0; 3095 | } 3096 | } 3097 | .navbar-fixed-top, 3098 | .navbar-fixed-bottom { 3099 | position: fixed; 3100 | right: 0; 3101 | left: 0; 3102 | z-index: 1030; 3103 | } 3104 | @media (min-width: 768px) { 3105 | .navbar-fixed-top, 3106 | .navbar-fixed-bottom { 3107 | border-radius: 0; 3108 | } 3109 | } 3110 | .navbar-fixed-top { 3111 | top: 0; 3112 | border-width: 0 0 1px; 3113 | } 3114 | .navbar-fixed-bottom { 3115 | bottom: 0; 3116 | margin-bottom: 0; 3117 | border-width: 1px 0 0; 3118 | } 3119 | .navbar-brand { 3120 | float: left; 3121 | padding: 19.5px 15px; 3122 | font-size: 19px; 3123 | line-height: 21px; 3124 | height: 60px; 3125 | } 3126 | .navbar-brand:hover, 3127 | .navbar-brand:focus { 3128 | text-decoration: none; 3129 | } 3130 | @media (min-width: 768px) { 3131 | .navbar > .container .navbar-brand, 3132 | .navbar > .container-fluid .navbar-brand { 3133 | margin-left: -15px; 3134 | } 3135 | } 3136 | .navbar-toggle { 3137 | position: relative; 3138 | float: right; 3139 | margin-right: 15px; 3140 | padding: 9px 10px; 3141 | margin-top: 13px; 3142 | margin-bottom: 13px; 3143 | background-color: transparent; 3144 | background-image: none; 3145 | border: 1px solid transparent; 3146 | border-radius: 4px; 3147 | } 3148 | .navbar-toggle:focus { 3149 | outline: none; 3150 | } 3151 | .navbar-toggle .icon-bar { 3152 | display: block; 3153 | width: 22px; 3154 | height: 2px; 3155 | border-radius: 1px; 3156 | } 3157 | .navbar-toggle .icon-bar + .icon-bar { 3158 | margin-top: 4px; 3159 | } 3160 | @media (min-width: 768px) { 3161 | .navbar-toggle { 3162 | display: none; 3163 | } 3164 | } 3165 | .navbar-nav { 3166 | margin: 9.75px -15px; 3167 | } 3168 | .navbar-nav > li > a { 3169 | padding-top: 10px; 3170 | padding-bottom: 10px; 3171 | line-height: 21px; 3172 | } 3173 | @media (max-width: 767px) { 3174 | .navbar-nav .open .dropdown-menu { 3175 | position: static; 3176 | float: none; 3177 | width: auto; 3178 | margin-top: 0; 3179 | background-color: transparent; 3180 | border: 0; 3181 | box-shadow: none; 3182 | } 3183 | .navbar-nav .open .dropdown-menu > li > a, 3184 | .navbar-nav .open .dropdown-menu .dropdown-header { 3185 | padding: 5px 15px 5px 25px; 3186 | } 3187 | .navbar-nav .open .dropdown-menu > li > a { 3188 | line-height: 21px; 3189 | } 3190 | .navbar-nav .open .dropdown-menu > li > a:hover, 3191 | .navbar-nav .open .dropdown-menu > li > a:focus { 3192 | background-image: none; 3193 | } 3194 | } 3195 | @media (min-width: 768px) { 3196 | .navbar-nav { 3197 | float: left; 3198 | margin: 0; 3199 | } 3200 | .navbar-nav > li { 3201 | float: left; 3202 | } 3203 | .navbar-nav > li > a { 3204 | padding-top: 19.5px; 3205 | padding-bottom: 19.5px; 3206 | } 3207 | .navbar-nav.navbar-right:last-child { 3208 | margin-right: -15px; 3209 | } 3210 | } 3211 | @media (min-width: 768px) { 3212 | .navbar-left { 3213 | float: left !important; 3214 | } 3215 | .navbar-right { 3216 | float: right !important; 3217 | } 3218 | } 3219 | .navbar-form { 3220 | margin-left: -15px; 3221 | margin-right: -15px; 3222 | padding: 10px 15px; 3223 | border-top: 1px solid transparent; 3224 | border-bottom: 1px solid transparent; 3225 | -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1); 3226 | box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1); 3227 | margin-top: 8.5px; 3228 | margin-bottom: 8.5px; 3229 | } 3230 | @media (min-width: 768px) { 3231 | .navbar-form .form-group { 3232 | display: inline-block; 3233 | margin-bottom: 0; 3234 | vertical-align: middle; 3235 | } 3236 | .navbar-form .form-control { 3237 | display: inline-block; 3238 | width: auto; 3239 | vertical-align: middle; 3240 | } 3241 | .navbar-form .input-group > .form-control { 3242 | width: 100%; 3243 | } 3244 | .navbar-form .control-label { 3245 | margin-bottom: 0; 3246 | vertical-align: middle; 3247 | } 3248 | .navbar-form .radio, 3249 | .navbar-form .checkbox { 3250 | display: inline-block; 3251 | margin-top: 0; 3252 | margin-bottom: 0; 3253 | padding-left: 0; 3254 | vertical-align: middle; 3255 | } 3256 | .navbar-form .radio input[type="radio"], 3257 | .navbar-form .checkbox input[type="checkbox"] { 3258 | float: none; 3259 | margin-left: 0; 3260 | } 3261 | .navbar-form .has-feedback .form-control-feedback { 3262 | top: 0; 3263 | } 3264 | } 3265 | @media (max-width: 767px) { 3266 | .navbar-form .form-group { 3267 | margin-bottom: 5px; 3268 | } 3269 | } 3270 | @media (min-width: 768px) { 3271 | .navbar-form { 3272 | width: auto; 3273 | border: 0; 3274 | margin-left: 0; 3275 | margin-right: 0; 3276 | padding-top: 0; 3277 | padding-bottom: 0; 3278 | -webkit-box-shadow: none; 3279 | box-shadow: none; 3280 | } 3281 | .navbar-form.navbar-right:last-child { 3282 | margin-right: -15px; 3283 | } 3284 | } 3285 | .navbar-nav > li > .dropdown-menu { 3286 | margin-top: 0; 3287 | border-top-right-radius: 0; 3288 | border-top-left-radius: 0; 3289 | } 3290 | .navbar-fixed-bottom .navbar-nav > li > .dropdown-menu { 3291 | border-bottom-right-radius: 0; 3292 | border-bottom-left-radius: 0; 3293 | } 3294 | .navbar-btn { 3295 | margin-top: 8.5px; 3296 | margin-bottom: 8.5px; 3297 | } 3298 | .navbar-btn.btn-sm { 3299 | margin-top: 13.5px; 3300 | margin-bottom: 13.5px; 3301 | } 3302 | .navbar-btn.btn-xs { 3303 | margin-top: 19px; 3304 | margin-bottom: 19px; 3305 | } 3306 | .navbar-text { 3307 | margin-top: 19.5px; 3308 | margin-bottom: 19.5px; 3309 | } 3310 | @media (min-width: 768px) { 3311 | .navbar-text { 3312 | float: left; 3313 | margin-left: 15px; 3314 | margin-right: 15px; 3315 | } 3316 | .navbar-text.navbar-right:last-child { 3317 | margin-right: 0; 3318 | } 3319 | } 3320 | .navbar-default { 3321 | background-color: #375a7f; 3322 | border-color: transparent; 3323 | } 3324 | .navbar-default .navbar-brand { 3325 | color: #ffffff; 3326 | } 3327 | .navbar-default .navbar-brand:hover, 3328 | .navbar-default .navbar-brand:focus { 3329 | color: #00bc8c; 3330 | background-color: transparent; 3331 | } 3332 | .navbar-default .navbar-text { 3333 | color: #777777; 3334 | } 3335 | .navbar-default .navbar-nav > li > a { 3336 | color: #ffffff; 3337 | } 3338 | .navbar-default .navbar-nav > li > a:hover, 3339 | .navbar-default .navbar-nav > li > a:focus { 3340 | color: #00bc8c; 3341 | background-color: transparent; 3342 | } 3343 | .navbar-default .navbar-nav > .active > a, 3344 | .navbar-default .navbar-nav > .active > a:hover, 3345 | .navbar-default .navbar-nav > .active > a:focus { 3346 | color: #ffffff; 3347 | background-color: #28415b; 3348 | } 3349 | .navbar-default .navbar-nav > .disabled > a, 3350 | .navbar-default .navbar-nav > .disabled > a:hover, 3351 | .navbar-default .navbar-nav > .disabled > a:focus { 3352 | color: #cccccc; 3353 | background-color: transparent; 3354 | } 3355 | .navbar-default .navbar-toggle { 3356 | border-color: #28415b; 3357 | } 3358 | .navbar-default .navbar-toggle:hover, 3359 | .navbar-default .navbar-toggle:focus { 3360 | background-color: #28415b; 3361 | } 3362 | .navbar-default .navbar-toggle .icon-bar { 3363 | background-color: #ffffff; 3364 | } 3365 | .navbar-default .navbar-collapse, 3366 | .navbar-default .navbar-form { 3367 | border-color: transparent; 3368 | } 3369 | .navbar-default .navbar-nav > .open > a, 3370 | .navbar-default .navbar-nav > .open > a:hover, 3371 | .navbar-default .navbar-nav > .open > a:focus { 3372 | background-color: #28415b; 3373 | color: #ffffff; 3374 | } 3375 | @media (max-width: 767px) { 3376 | .navbar-default .navbar-nav .open .dropdown-menu > li > a { 3377 | color: #ffffff; 3378 | } 3379 | .navbar-default .navbar-nav .open .dropdown-menu > li > a:hover, 3380 | .navbar-default .navbar-nav .open .dropdown-menu > li > a:focus { 3381 | color: #00bc8c; 3382 | background-color: transparent; 3383 | } 3384 | .navbar-default .navbar-nav .open .dropdown-menu > .active > a, 3385 | .navbar-default .navbar-nav .open .dropdown-menu > .active > a:hover, 3386 | .navbar-default .navbar-nav .open .dropdown-menu > .active > a:focus { 3387 | color: #ffffff; 3388 | background-color: #28415b; 3389 | } 3390 | .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a, 3391 | .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a:hover, 3392 | .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a:focus { 3393 | color: #cccccc; 3394 | background-color: transparent; 3395 | } 3396 | } 3397 | .navbar-default .navbar-link { 3398 | color: #ffffff; 3399 | } 3400 | .navbar-default .navbar-link:hover { 3401 | color: #00bc8c; 3402 | } 3403 | .navbar-inverse { 3404 | background-color: #00bc8c; 3405 | border-color: transparent; 3406 | } 3407 | .navbar-inverse .navbar-brand { 3408 | color: #ffffff; 3409 | } 3410 | .navbar-inverse .navbar-brand:hover, 3411 | .navbar-inverse .navbar-brand:focus { 3412 | color: #375a7f; 3413 | background-color: transparent; 3414 | } 3415 | .navbar-inverse .navbar-text { 3416 | color: #ffffff; 3417 | } 3418 | .navbar-inverse .navbar-nav > li > a { 3419 | color: #ffffff; 3420 | } 3421 | .navbar-inverse .navbar-nav > li > a:hover, 3422 | .navbar-inverse .navbar-nav > li > a:focus { 3423 | color: #375a7f; 3424 | background-color: transparent; 3425 | } 3426 | .navbar-inverse .navbar-nav > .active > a, 3427 | .navbar-inverse .navbar-nav > .active > a:hover, 3428 | .navbar-inverse .navbar-nav > .active > a:focus { 3429 | color: #ffffff; 3430 | background-color: #00a379; 3431 | } 3432 | .navbar-inverse .navbar-nav > .disabled > a, 3433 | .navbar-inverse .navbar-nav > .disabled > a:hover, 3434 | .navbar-inverse .navbar-nav > .disabled > a:focus { 3435 | color: #aaaaaa; 3436 | background-color: transparent; 3437 | } 3438 | .navbar-inverse .navbar-toggle { 3439 | border-color: #008966; 3440 | } 3441 | .navbar-inverse .navbar-toggle:hover, 3442 | .navbar-inverse .navbar-toggle:focus { 3443 | background-color: #008966; 3444 | } 3445 | .navbar-inverse .navbar-toggle .icon-bar { 3446 | background-color: #ffffff; 3447 | } 3448 | .navbar-inverse .navbar-collapse, 3449 | .navbar-inverse .navbar-form { 3450 | border-color: #009871; 3451 | } 3452 | .navbar-inverse .navbar-nav > .open > a, 3453 | .navbar-inverse .navbar-nav > .open > a:hover, 3454 | .navbar-inverse .navbar-nav > .open > a:focus { 3455 | background-color: #00a379; 3456 | color: #ffffff; 3457 | } 3458 | @media (max-width: 767px) { 3459 | .navbar-inverse .navbar-nav .open .dropdown-menu > .dropdown-header { 3460 | border-color: transparent; 3461 | } 3462 | .navbar-inverse .navbar-nav .open .dropdown-menu .divider { 3463 | background-color: transparent; 3464 | } 3465 | .navbar-inverse .navbar-nav .open .dropdown-menu > li > a { 3466 | color: #ffffff; 3467 | } 3468 | .navbar-inverse .navbar-nav .open .dropdown-menu > li > a:hover, 3469 | .navbar-inverse .navbar-nav .open .dropdown-menu > li > a:focus { 3470 | color: #375a7f; 3471 | background-color: transparent; 3472 | } 3473 | .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a, 3474 | .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a:hover, 3475 | .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a:focus { 3476 | color: #ffffff; 3477 | background-color: #00a379; 3478 | } 3479 | .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a, 3480 | .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a:hover, 3481 | .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a:focus { 3482 | color: #aaaaaa; 3483 | background-color: transparent; 3484 | } 3485 | } 3486 | .navbar-inverse .navbar-link { 3487 | color: #ffffff; 3488 | } 3489 | .navbar-inverse .navbar-link:hover { 3490 | color: #375a7f; 3491 | } 3492 | .breadcrumb { 3493 | padding: 8px 15px; 3494 | margin-bottom: 21px; 3495 | list-style: none; 3496 | background-color: #464545; 3497 | border-radius: 4px; 3498 | } 3499 | .breadcrumb > li { 3500 | display: inline-block; 3501 | } 3502 | .breadcrumb > li + li:before { 3503 | content: "/\00a0"; 3504 | padding: 0 5px; 3505 | color: #ffffff; 3506 | } 3507 | .breadcrumb > .active { 3508 | color: #999999; 3509 | } 3510 | .pagination { 3511 | display: inline-block; 3512 | padding-left: 0; 3513 | margin: 21px 0; 3514 | border-radius: 4px; 3515 | } 3516 | .pagination > li { 3517 | display: inline; 3518 | } 3519 | .pagination > li > a, 3520 | .pagination > li > span { 3521 | position: relative; 3522 | float: left; 3523 | padding: 10px 15px; 3524 | line-height: 1.42857143; 3525 | text-decoration: none; 3526 | color: #ffffff; 3527 | background-color: #00bc8c; 3528 | border: 1px solid transparent; 3529 | margin-left: -1px; 3530 | } 3531 | .pagination > li:first-child > a, 3532 | .pagination > li:first-child > span { 3533 | margin-left: 0; 3534 | border-bottom-left-radius: 4px; 3535 | border-top-left-radius: 4px; 3536 | } 3537 | .pagination > li:last-child > a, 3538 | .pagination > li:last-child > span { 3539 | border-bottom-right-radius: 4px; 3540 | border-top-right-radius: 4px; 3541 | } 3542 | .pagination > li > a:hover, 3543 | .pagination > li > span:hover, 3544 | .pagination > li > a:focus, 3545 | .pagination > li > span:focus { 3546 | color: #ffffff; 3547 | background-color: #00dba3; 3548 | border-color: transparent; 3549 | } 3550 | .pagination > .active > a, 3551 | .pagination > .active > span, 3552 | .pagination > .active > a:hover, 3553 | .pagination > .active > span:hover, 3554 | .pagination > .active > a:focus, 3555 | .pagination > .active > span:focus { 3556 | z-index: 2; 3557 | color: #ffffff; 3558 | background-color: #00dba3; 3559 | border-color: transparent; 3560 | cursor: default; 3561 | } 3562 | .pagination > .disabled > span, 3563 | .pagination > .disabled > span:hover, 3564 | .pagination > .disabled > span:focus, 3565 | .pagination > .disabled > a, 3566 | .pagination > .disabled > a:hover, 3567 | .pagination > .disabled > a:focus { 3568 | color: #ffffff; 3569 | background-color: #007053; 3570 | border-color: transparent; 3571 | cursor: not-allowed; 3572 | } 3573 | .pagination-lg > li > a, 3574 | .pagination-lg > li > span { 3575 | padding: 18px 27px; 3576 | font-size: 19px; 3577 | } 3578 | .pagination-lg > li:first-child > a, 3579 | .pagination-lg > li:first-child > span { 3580 | border-bottom-left-radius: 6px; 3581 | border-top-left-radius: 6px; 3582 | } 3583 | .pagination-lg > li:last-child > a, 3584 | .pagination-lg > li:last-child > span { 3585 | border-bottom-right-radius: 6px; 3586 | border-top-right-radius: 6px; 3587 | } 3588 | .pagination-sm > li > a, 3589 | .pagination-sm > li > span { 3590 | padding: 6px 9px; 3591 | font-size: 13px; 3592 | } 3593 | .pagination-sm > li:first-child > a, 3594 | .pagination-sm > li:first-child > span { 3595 | border-bottom-left-radius: 3px; 3596 | border-top-left-radius: 3px; 3597 | } 3598 | .pagination-sm > li:last-child > a, 3599 | .pagination-sm > li:last-child > span { 3600 | border-bottom-right-radius: 3px; 3601 | border-top-right-radius: 3px; 3602 | } 3603 | .pager { 3604 | padding-left: 0; 3605 | margin: 21px 0; 3606 | list-style: none; 3607 | text-align: center; 3608 | } 3609 | .pager li { 3610 | display: inline; 3611 | } 3612 | .pager li > a, 3613 | .pager li > span { 3614 | display: inline-block; 3615 | padding: 5px 14px; 3616 | background-color: #00bc8c; 3617 | border: 1px solid transparent; 3618 | border-radius: 15px; 3619 | } 3620 | .pager li > a:hover, 3621 | .pager li > a:focus { 3622 | text-decoration: none; 3623 | background-color: #00dba3; 3624 | } 3625 | .pager .next > a, 3626 | .pager .next > span { 3627 | float: right; 3628 | } 3629 | .pager .previous > a, 3630 | .pager .previous > span { 3631 | float: left; 3632 | } 3633 | .pager .disabled > a, 3634 | .pager .disabled > a:hover, 3635 | .pager .disabled > a:focus, 3636 | .pager .disabled > span { 3637 | color: #dddddd; 3638 | background-color: #00bc8c; 3639 | cursor: not-allowed; 3640 | } 3641 | .label { 3642 | display: inline; 3643 | padding: .2em .6em .3em; 3644 | font-size: 75%; 3645 | font-weight: bold; 3646 | line-height: 1; 3647 | color: #ffffff; 3648 | text-align: center; 3649 | white-space: nowrap; 3650 | vertical-align: baseline; 3651 | border-radius: .25em; 3652 | } 3653 | .label[href]:hover, 3654 | .label[href]:focus { 3655 | color: #ffffff; 3656 | text-decoration: none; 3657 | cursor: pointer; 3658 | } 3659 | .label:empty { 3660 | display: none; 3661 | } 3662 | .btn .label { 3663 | position: relative; 3664 | top: -1px; 3665 | } 3666 | .label-default { 3667 | background-color: #464545; 3668 | } 3669 | .label-default[href]:hover, 3670 | .label-default[href]:focus { 3671 | background-color: #2c2c2c; 3672 | } 3673 | .label-primary { 3674 | background-color: #375a7f; 3675 | } 3676 | .label-primary[href]:hover, 3677 | .label-primary[href]:focus { 3678 | background-color: #28415b; 3679 | } 3680 | .label-success { 3681 | background-color: #00bc8c; 3682 | } 3683 | .label-success[href]:hover, 3684 | .label-success[href]:focus { 3685 | background-color: #008966; 3686 | } 3687 | .label-info { 3688 | background-color: #3498db; 3689 | } 3690 | .label-info[href]:hover, 3691 | .label-info[href]:focus { 3692 | background-color: #217dbb; 3693 | } 3694 | .label-warning { 3695 | background-color: #f39c12; 3696 | } 3697 | .label-warning[href]:hover, 3698 | .label-warning[href]:focus { 3699 | background-color: #c87f0a; 3700 | } 3701 | .label-danger { 3702 | background-color: #e74c3c; 3703 | } 3704 | .label-danger[href]:hover, 3705 | .label-danger[href]:focus { 3706 | background-color: #d62c1a; 3707 | } 3708 | .badge { 3709 | display: inline-block; 3710 | min-width: 10px; 3711 | padding: 3px 7px; 3712 | font-size: 13px; 3713 | font-weight: bold; 3714 | color: #ffffff; 3715 | line-height: 1; 3716 | vertical-align: baseline; 3717 | white-space: nowrap; 3718 | text-align: center; 3719 | background-color: #464545; 3720 | border-radius: 10px; 3721 | } 3722 | .badge:empty { 3723 | display: none; 3724 | } 3725 | .btn .badge { 3726 | position: relative; 3727 | top: -1px; 3728 | } 3729 | .btn-xs .badge { 3730 | top: 0; 3731 | padding: 1px 5px; 3732 | } 3733 | a.badge:hover, 3734 | a.badge:focus { 3735 | color: #ffffff; 3736 | text-decoration: none; 3737 | cursor: pointer; 3738 | } 3739 | a.list-group-item.active > .badge, 3740 | .nav-pills > .active > a > .badge { 3741 | color: #375a7f; 3742 | background-color: #ffffff; 3743 | } 3744 | .nav-pills > li > a > .badge { 3745 | margin-left: 3px; 3746 | } 3747 | .jumbotron { 3748 | padding: 30px; 3749 | margin-bottom: 30px; 3750 | color: inherit; 3751 | background-color: #303030; 3752 | } 3753 | .jumbotron h1, 3754 | .jumbotron .h1 { 3755 | color: inherit; 3756 | } 3757 | .jumbotron p { 3758 | margin-bottom: 15px; 3759 | font-size: 23px; 3760 | font-weight: 200; 3761 | } 3762 | .container .jumbotron { 3763 | border-radius: 6px; 3764 | } 3765 | .jumbotron .container { 3766 | max-width: 100%; 3767 | } 3768 | @media screen and (min-width: 768px) { 3769 | .jumbotron { 3770 | padding-top: 48px; 3771 | padding-bottom: 48px; 3772 | } 3773 | .container .jumbotron { 3774 | padding-left: 60px; 3775 | padding-right: 60px; 3776 | } 3777 | .jumbotron h1, 3778 | .jumbotron .h1 { 3779 | font-size: 67.5px; 3780 | } 3781 | } 3782 | .thumbnail { 3783 | display: block; 3784 | padding: 2px; 3785 | margin-bottom: 21px; 3786 | line-height: 1.42857143; 3787 | background-color: #222222; 3788 | border: 1px solid #464545; 3789 | border-radius: 4px; 3790 | -webkit-transition: all 0.2s ease-in-out; 3791 | transition: all 0.2s ease-in-out; 3792 | } 3793 | .thumbnail > img, 3794 | .thumbnail a > img { 3795 | margin-left: auto; 3796 | margin-right: auto; 3797 | } 3798 | a.thumbnail:hover, 3799 | a.thumbnail:focus, 3800 | a.thumbnail.active { 3801 | border-color: #0ce3ac; 3802 | } 3803 | .thumbnail .caption { 3804 | padding: 9px; 3805 | color: #ffffff; 3806 | } 3807 | .alert { 3808 | padding: 15px; 3809 | margin-bottom: 21px; 3810 | border: 1px solid transparent; 3811 | border-radius: 4px; 3812 | } 3813 | .alert h4 { 3814 | margin-top: 0; 3815 | color: inherit; 3816 | } 3817 | .alert .alert-link { 3818 | font-weight: bold; 3819 | } 3820 | .alert > p, 3821 | .alert > ul { 3822 | margin-bottom: 0; 3823 | } 3824 | .alert > p + p { 3825 | margin-top: 5px; 3826 | } 3827 | .alert-dismissable { 3828 | padding-right: 35px; 3829 | } 3830 | .alert-dismissable .close { 3831 | position: relative; 3832 | top: -2px; 3833 | right: -21px; 3834 | color: inherit; 3835 | } 3836 | .alert-success { 3837 | background-color: #00bc8c; 3838 | border-color: #00bc8c; 3839 | color: #ffffff; 3840 | } 3841 | .alert-success hr { 3842 | border-top-color: #00a379; 3843 | } 3844 | .alert-success .alert-link { 3845 | color: #e6e6e6; 3846 | } 3847 | .alert-info { 3848 | background-color: #3498db; 3849 | border-color: #3498db; 3850 | color: #ffffff; 3851 | } 3852 | .alert-info hr { 3853 | border-top-color: #258cd1; 3854 | } 3855 | .alert-info .alert-link { 3856 | color: #e6e6e6; 3857 | } 3858 | .alert-warning { 3859 | background-color: #f39c12; 3860 | border-color: #f39c12; 3861 | color: #ffffff; 3862 | } 3863 | .alert-warning hr { 3864 | border-top-color: #e08e0b; 3865 | } 3866 | .alert-warning .alert-link { 3867 | color: #e6e6e6; 3868 | } 3869 | .alert-danger { 3870 | background-color: #e74c3c; 3871 | border-color: #e74c3c; 3872 | color: #ffffff; 3873 | } 3874 | .alert-danger hr { 3875 | border-top-color: #e43725; 3876 | } 3877 | .alert-danger .alert-link { 3878 | color: #e6e6e6; 3879 | } 3880 | @-webkit-keyframes progress-bar-stripes { 3881 | from { 3882 | background-position: 40px 0; 3883 | } 3884 | to { 3885 | background-position: 0 0; 3886 | } 3887 | } 3888 | @keyframes progress-bar-stripes { 3889 | from { 3890 | background-position: 40px 0; 3891 | } 3892 | to { 3893 | background-position: 0 0; 3894 | } 3895 | } 3896 | .progress { 3897 | overflow: hidden; 3898 | height: 21px; 3899 | margin-bottom: 21px; 3900 | background-color: #ebebeb; 3901 | border-radius: 4px; 3902 | -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1); 3903 | box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1); 3904 | } 3905 | .progress-bar { 3906 | float: left; 3907 | width: 0%; 3908 | height: 100%; 3909 | font-size: 13px; 3910 | line-height: 21px; 3911 | color: #ffffff; 3912 | text-align: center; 3913 | background-color: #375a7f; 3914 | -webkit-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15); 3915 | box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15); 3916 | -webkit-transition: width 0.6s ease; 3917 | transition: width 0.6s ease; 3918 | } 3919 | .progress-striped .progress-bar { 3920 | background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); 3921 | background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); 3922 | background-size: 40px 40px; 3923 | } 3924 | .progress.active .progress-bar { 3925 | -webkit-animation: progress-bar-stripes 2s linear infinite; 3926 | animation: progress-bar-stripes 2s linear infinite; 3927 | } 3928 | .progress-bar-success { 3929 | background-color: #00bc8c; 3930 | } 3931 | .progress-striped .progress-bar-success { 3932 | background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); 3933 | background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); 3934 | } 3935 | .progress-bar-info { 3936 | background-color: #3498db; 3937 | } 3938 | .progress-striped .progress-bar-info { 3939 | background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); 3940 | background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); 3941 | } 3942 | .progress-bar-warning { 3943 | background-color: #f39c12; 3944 | } 3945 | .progress-striped .progress-bar-warning { 3946 | background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); 3947 | background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); 3948 | } 3949 | .progress-bar-danger { 3950 | background-color: #e74c3c; 3951 | } 3952 | .progress-striped .progress-bar-danger { 3953 | background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); 3954 | background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); 3955 | } 3956 | .media, 3957 | .media-body { 3958 | overflow: hidden; 3959 | zoom: 1; 3960 | } 3961 | .media, 3962 | .media .media { 3963 | margin-top: 15px; 3964 | } 3965 | .media:first-child { 3966 | margin-top: 0; 3967 | } 3968 | .media-object { 3969 | display: block; 3970 | } 3971 | .media-heading { 3972 | margin: 0 0 5px; 3973 | } 3974 | .media > .pull-left { 3975 | margin-right: 10px; 3976 | } 3977 | .media > .pull-right { 3978 | margin-left: 10px; 3979 | } 3980 | .media-list { 3981 | padding-left: 0; 3982 | list-style: none; 3983 | } 3984 | .list-group { 3985 | margin-bottom: 20px; 3986 | padding-left: 0; 3987 | } 3988 | .list-group-item { 3989 | position: relative; 3990 | display: block; 3991 | padding: 10px 15px; 3992 | margin-bottom: -1px; 3993 | background-color: #303030; 3994 | border: 1px solid #464545; 3995 | } 3996 | .list-group-item:first-child { 3997 | border-top-right-radius: 4px; 3998 | border-top-left-radius: 4px; 3999 | } 4000 | .list-group-item:last-child { 4001 | margin-bottom: 0; 4002 | border-bottom-right-radius: 4px; 4003 | border-bottom-left-radius: 4px; 4004 | } 4005 | .list-group-item > .badge { 4006 | float: right; 4007 | } 4008 | .list-group-item > .badge + .badge { 4009 | margin-right: 5px; 4010 | } 4011 | a.list-group-item { 4012 | color: #0ce3ac; 4013 | } 4014 | a.list-group-item .list-group-item-heading { 4015 | color: #0bcb9a; 4016 | } 4017 | a.list-group-item:hover, 4018 | a.list-group-item:focus { 4019 | text-decoration: none; 4020 | background-color: transparent; 4021 | } 4022 | a.list-group-item.active, 4023 | a.list-group-item.active:hover, 4024 | a.list-group-item.active:focus { 4025 | z-index: 2; 4026 | color: #ffffff; 4027 | background-color: #00bc8c; 4028 | border-color: #00bc8c; 4029 | } 4030 | a.list-group-item.active .list-group-item-heading, 4031 | a.list-group-item.active:hover .list-group-item-heading, 4032 | a.list-group-item.active:focus .list-group-item-heading { 4033 | color: inherit; 4034 | } 4035 | a.list-group-item.active .list-group-item-text, 4036 | a.list-group-item.active:hover .list-group-item-text, 4037 | a.list-group-item.active:focus .list-group-item-text { 4038 | color: #89ffe1; 4039 | } 4040 | .list-group-item-success { 4041 | color: #ffffff; 4042 | background-color: #00bc8c; 4043 | } 4044 | a.list-group-item-success { 4045 | color: #ffffff; 4046 | } 4047 | a.list-group-item-success .list-group-item-heading { 4048 | color: inherit; 4049 | } 4050 | a.list-group-item-success:hover, 4051 | a.list-group-item-success:focus { 4052 | color: #ffffff; 4053 | background-color: #00a379; 4054 | } 4055 | a.list-group-item-success.active, 4056 | a.list-group-item-success.active:hover, 4057 | a.list-group-item-success.active:focus { 4058 | color: #fff; 4059 | background-color: #ffffff; 4060 | border-color: #ffffff; 4061 | } 4062 | .list-group-item-info { 4063 | color: #ffffff; 4064 | background-color: #3498db; 4065 | } 4066 | a.list-group-item-info { 4067 | color: #ffffff; 4068 | } 4069 | a.list-group-item-info .list-group-item-heading { 4070 | color: inherit; 4071 | } 4072 | a.list-group-item-info:hover, 4073 | a.list-group-item-info:focus { 4074 | color: #ffffff; 4075 | background-color: #258cd1; 4076 | } 4077 | a.list-group-item-info.active, 4078 | a.list-group-item-info.active:hover, 4079 | a.list-group-item-info.active:focus { 4080 | color: #fff; 4081 | background-color: #ffffff; 4082 | border-color: #ffffff; 4083 | } 4084 | .list-group-item-warning { 4085 | color: #ffffff; 4086 | background-color: #f39c12; 4087 | } 4088 | a.list-group-item-warning { 4089 | color: #ffffff; 4090 | } 4091 | a.list-group-item-warning .list-group-item-heading { 4092 | color: inherit; 4093 | } 4094 | a.list-group-item-warning:hover, 4095 | a.list-group-item-warning:focus { 4096 | color: #ffffff; 4097 | background-color: #e08e0b; 4098 | } 4099 | a.list-group-item-warning.active, 4100 | a.list-group-item-warning.active:hover, 4101 | a.list-group-item-warning.active:focus { 4102 | color: #fff; 4103 | background-color: #ffffff; 4104 | border-color: #ffffff; 4105 | } 4106 | .list-group-item-danger { 4107 | color: #ffffff; 4108 | background-color: #e74c3c; 4109 | } 4110 | a.list-group-item-danger { 4111 | color: #ffffff; 4112 | } 4113 | a.list-group-item-danger .list-group-item-heading { 4114 | color: inherit; 4115 | } 4116 | a.list-group-item-danger:hover, 4117 | a.list-group-item-danger:focus { 4118 | color: #ffffff; 4119 | background-color: #e43725; 4120 | } 4121 | a.list-group-item-danger.active, 4122 | a.list-group-item-danger.active:hover, 4123 | a.list-group-item-danger.active:focus { 4124 | color: #fff; 4125 | background-color: #ffffff; 4126 | border-color: #ffffff; 4127 | } 4128 | .list-group-item-heading { 4129 | margin-top: 0; 4130 | margin-bottom: 5px; 4131 | } 4132 | .list-group-item-text { 4133 | margin-bottom: 0; 4134 | line-height: 1.3; 4135 | } 4136 | .panel { 4137 | margin-bottom: 21px; 4138 | background-color: #303030; 4139 | border: 1px solid transparent; 4140 | border-radius: 4px; 4141 | -webkit-box-shadow: 0 1px 1px rgba(0, 0, 0, 0.05); 4142 | box-shadow: 0 1px 1px rgba(0, 0, 0, 0.05); 4143 | } 4144 | .panel-body { 4145 | padding: 15px; 4146 | } 4147 | .panel-heading { 4148 | padding: 10px 15px; 4149 | border-bottom: 1px solid transparent; 4150 | border-top-right-radius: 3px; 4151 | border-top-left-radius: 3px; 4152 | } 4153 | .panel-heading > .dropdown .dropdown-toggle { 4154 | color: inherit; 4155 | } 4156 | .panel-title { 4157 | margin-top: 0; 4158 | margin-bottom: 0; 4159 | font-size: 17px; 4160 | color: inherit; 4161 | } 4162 | .panel-title > a { 4163 | color: inherit; 4164 | } 4165 | .panel-footer { 4166 | padding: 10px 15px; 4167 | background-color: #464545; 4168 | border-top: 1px solid #464545; 4169 | border-bottom-right-radius: 3px; 4170 | border-bottom-left-radius: 3px; 4171 | } 4172 | .panel > .list-group { 4173 | margin-bottom: 0; 4174 | } 4175 | .panel > .list-group .list-group-item { 4176 | border-width: 1px 0; 4177 | border-radius: 0; 4178 | } 4179 | .panel > .list-group:first-child .list-group-item:first-child { 4180 | border-top: 0; 4181 | border-top-right-radius: 3px; 4182 | border-top-left-radius: 3px; 4183 | } 4184 | .panel > .list-group:last-child .list-group-item:last-child { 4185 | border-bottom: 0; 4186 | border-bottom-right-radius: 3px; 4187 | border-bottom-left-radius: 3px; 4188 | } 4189 | .panel-heading + .list-group .list-group-item:first-child { 4190 | border-top-width: 0; 4191 | } 4192 | .panel > .table, 4193 | .panel > .table-responsive > .table { 4194 | margin-bottom: 0; 4195 | } 4196 | .panel > .table:first-child, 4197 | .panel > .table-responsive:first-child > .table:first-child { 4198 | border-top-right-radius: 3px; 4199 | border-top-left-radius: 3px; 4200 | } 4201 | .panel > .table:first-child > thead:first-child > tr:first-child td:first-child, 4202 | .panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child td:first-child, 4203 | .panel > .table:first-child > tbody:first-child > tr:first-child td:first-child, 4204 | .panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child td:first-child, 4205 | .panel > .table:first-child > thead:first-child > tr:first-child th:first-child, 4206 | .panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child th:first-child, 4207 | .panel > .table:first-child > tbody:first-child > tr:first-child th:first-child, 4208 | .panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child th:first-child { 4209 | border-top-left-radius: 3px; 4210 | } 4211 | .panel > .table:first-child > thead:first-child > tr:first-child td:last-child, 4212 | .panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child td:last-child, 4213 | .panel > .table:first-child > tbody:first-child > tr:first-child td:last-child, 4214 | .panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child td:last-child, 4215 | .panel > .table:first-child > thead:first-child > tr:first-child th:last-child, 4216 | .panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child th:last-child, 4217 | .panel > .table:first-child > tbody:first-child > tr:first-child th:last-child, 4218 | .panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child th:last-child { 4219 | border-top-right-radius: 3px; 4220 | } 4221 | .panel > .table:last-child, 4222 | .panel > .table-responsive:last-child > .table:last-child { 4223 | border-bottom-right-radius: 3px; 4224 | border-bottom-left-radius: 3px; 4225 | } 4226 | .panel > .table:last-child > tbody:last-child > tr:last-child td:first-child, 4227 | .panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child td:first-child, 4228 | .panel > .table:last-child > tfoot:last-child > tr:last-child td:first-child, 4229 | .panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child td:first-child, 4230 | .panel > .table:last-child > tbody:last-child > tr:last-child th:first-child, 4231 | .panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child th:first-child, 4232 | .panel > .table:last-child > tfoot:last-child > tr:last-child th:first-child, 4233 | .panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child th:first-child { 4234 | border-bottom-left-radius: 3px; 4235 | } 4236 | .panel > .table:last-child > tbody:last-child > tr:last-child td:last-child, 4237 | .panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child td:last-child, 4238 | .panel > .table:last-child > tfoot:last-child > tr:last-child td:last-child, 4239 | .panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child td:last-child, 4240 | .panel > .table:last-child > tbody:last-child > tr:last-child th:last-child, 4241 | .panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child th:last-child, 4242 | .panel > .table:last-child > tfoot:last-child > tr:last-child th:last-child, 4243 | .panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child th:last-child { 4244 | border-bottom-right-radius: 3px; 4245 | } 4246 | .panel > .panel-body + .table, 4247 | .panel > .panel-body + .table-responsive { 4248 | border-top: 1px solid #464545; 4249 | } 4250 | .panel > .table > tbody:first-child > tr:first-child th, 4251 | .panel > .table > tbody:first-child > tr:first-child td { 4252 | border-top: 0; 4253 | } 4254 | .panel > .table-bordered, 4255 | .panel > .table-responsive > .table-bordered { 4256 | border: 0; 4257 | } 4258 | .panel > .table-bordered > thead > tr > th:first-child, 4259 | .panel > .table-responsive > .table-bordered > thead > tr > th:first-child, 4260 | .panel > .table-bordered > tbody > tr > th:first-child, 4261 | .panel > .table-responsive > .table-bordered > tbody > tr > th:first-child, 4262 | .panel > .table-bordered > tfoot > tr > th:first-child, 4263 | .panel > .table-responsive > .table-bordered > tfoot > tr > th:first-child, 4264 | .panel > .table-bordered > thead > tr > td:first-child, 4265 | .panel > .table-responsive > .table-bordered > thead > tr > td:first-child, 4266 | .panel > .table-bordered > tbody > tr > td:first-child, 4267 | .panel > .table-responsive > .table-bordered > tbody > tr > td:first-child, 4268 | .panel > .table-bordered > tfoot > tr > td:first-child, 4269 | .panel > .table-responsive > .table-bordered > tfoot > tr > td:first-child { 4270 | border-left: 0; 4271 | } 4272 | .panel > .table-bordered > thead > tr > th:last-child, 4273 | .panel > .table-responsive > .table-bordered > thead > tr > th:last-child, 4274 | .panel > .table-bordered > tbody > tr > th:last-child, 4275 | .panel > .table-responsive > .table-bordered > tbody > tr > th:last-child, 4276 | .panel > .table-bordered > tfoot > tr > th:last-child, 4277 | .panel > .table-responsive > .table-bordered > tfoot > tr > th:last-child, 4278 | .panel > .table-bordered > thead > tr > td:last-child, 4279 | .panel > .table-responsive > .table-bordered > thead > tr > td:last-child, 4280 | .panel > .table-bordered > tbody > tr > td:last-child, 4281 | .panel > .table-responsive > .table-bordered > tbody > tr > td:last-child, 4282 | .panel > .table-bordered > tfoot > tr > td:last-child, 4283 | .panel > .table-responsive > .table-bordered > tfoot > tr > td:last-child { 4284 | border-right: 0; 4285 | } 4286 | .panel > .table-bordered > thead > tr:first-child > td, 4287 | .panel > .table-responsive > .table-bordered > thead > tr:first-child > td, 4288 | .panel > .table-bordered > tbody > tr:first-child > td, 4289 | .panel > .table-responsive > .table-bordered > tbody > tr:first-child > td, 4290 | .panel > .table-bordered > thead > tr:first-child > th, 4291 | .panel > .table-responsive > .table-bordered > thead > tr:first-child > th, 4292 | .panel > .table-bordered > tbody > tr:first-child > th, 4293 | .panel > .table-responsive > .table-bordered > tbody > tr:first-child > th { 4294 | border-bottom: 0; 4295 | } 4296 | .panel > .table-bordered > tbody > tr:last-child > td, 4297 | .panel > .table-responsive > .table-bordered > tbody > tr:last-child > td, 4298 | .panel > .table-bordered > tfoot > tr:last-child > td, 4299 | .panel > .table-responsive > .table-bordered > tfoot > tr:last-child > td, 4300 | .panel > .table-bordered > tbody > tr:last-child > th, 4301 | .panel > .table-responsive > .table-bordered > tbody > tr:last-child > th, 4302 | .panel > .table-bordered > tfoot > tr:last-child > th, 4303 | .panel > .table-responsive > .table-bordered > tfoot > tr:last-child > th { 4304 | border-bottom: 0; 4305 | } 4306 | .panel > .table-responsive { 4307 | border: 0; 4308 | margin-bottom: 0; 4309 | } 4310 | .panel-group { 4311 | margin-bottom: 21px; 4312 | } 4313 | .panel-group .panel { 4314 | margin-bottom: 0; 4315 | border-radius: 4px; 4316 | overflow: hidden; 4317 | } 4318 | .panel-group .panel + .panel { 4319 | margin-top: 5px; 4320 | } 4321 | .panel-group .panel-heading { 4322 | border-bottom: 0; 4323 | } 4324 | .panel-group .panel-heading + .panel-collapse .panel-body { 4325 | border-top: 1px solid #464545; 4326 | } 4327 | .panel-group .panel-footer { 4328 | border-top: 0; 4329 | } 4330 | .panel-group .panel-footer + .panel-collapse .panel-body { 4331 | border-bottom: 1px solid #464545; 4332 | } 4333 | .panel-default { 4334 | border-color: #464545; 4335 | } 4336 | .panel-default > .panel-heading { 4337 | color: #ffffff; 4338 | background-color: #303030; 4339 | border-color: #464545; 4340 | } 4341 | .panel-default > .panel-heading + .panel-collapse .panel-body { 4342 | border-top-color: #464545; 4343 | } 4344 | .panel-default > .panel-footer + .panel-collapse .panel-body { 4345 | border-bottom-color: #464545; 4346 | } 4347 | .panel-primary { 4348 | border-color: #375a7f; 4349 | } 4350 | .panel-primary > .panel-heading { 4351 | color: #ffffff; 4352 | background-color: #375a7f; 4353 | border-color: #375a7f; 4354 | } 4355 | .panel-primary > .panel-heading + .panel-collapse .panel-body { 4356 | border-top-color: #375a7f; 4357 | } 4358 | .panel-primary > .panel-footer + .panel-collapse .panel-body { 4359 | border-bottom-color: #375a7f; 4360 | } 4361 | .panel-success { 4362 | border-color: #00bc8c; 4363 | } 4364 | .panel-success > .panel-heading { 4365 | color: #ffffff; 4366 | background-color: #00bc8c; 4367 | border-color: #00bc8c; 4368 | } 4369 | .panel-success > .panel-heading + .panel-collapse .panel-body { 4370 | border-top-color: #00bc8c; 4371 | } 4372 | .panel-success > .panel-footer + .panel-collapse .panel-body { 4373 | border-bottom-color: #00bc8c; 4374 | } 4375 | .panel-info { 4376 | border-color: #3498db; 4377 | } 4378 | .panel-info > .panel-heading { 4379 | color: #ffffff; 4380 | background-color: #3498db; 4381 | border-color: #3498db; 4382 | } 4383 | .panel-info > .panel-heading + .panel-collapse .panel-body { 4384 | border-top-color: #3498db; 4385 | } 4386 | .panel-info > .panel-footer + .panel-collapse .panel-body { 4387 | border-bottom-color: #3498db; 4388 | } 4389 | .panel-warning { 4390 | border-color: #f39c12; 4391 | } 4392 | .panel-warning > .panel-heading { 4393 | color: #ffffff; 4394 | background-color: #f39c12; 4395 | border-color: #f39c12; 4396 | } 4397 | .panel-warning > .panel-heading + .panel-collapse .panel-body { 4398 | border-top-color: #f39c12; 4399 | } 4400 | .panel-warning > .panel-footer + .panel-collapse .panel-body { 4401 | border-bottom-color: #f39c12; 4402 | } 4403 | .panel-danger { 4404 | border-color: #e74c3c; 4405 | } 4406 | .panel-danger > .panel-heading { 4407 | color: #ffffff; 4408 | background-color: #e74c3c; 4409 | border-color: #e74c3c; 4410 | } 4411 | .panel-danger > .panel-heading + .panel-collapse .panel-body { 4412 | border-top-color: #e74c3c; 4413 | } 4414 | .panel-danger > .panel-footer + .panel-collapse .panel-body { 4415 | border-bottom-color: #e74c3c; 4416 | } 4417 | .well { 4418 | min-height: 20px; 4419 | padding: 19px; 4420 | margin-bottom: 20px; 4421 | background-color: #303030; 4422 | border: 1px solid transparent; 4423 | border-radius: 4px; 4424 | -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05); 4425 | box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05); 4426 | } 4427 | .well blockquote { 4428 | border-color: #ddd; 4429 | border-color: rgba(0, 0, 0, 0.15); 4430 | } 4431 | .well-lg { 4432 | padding: 24px; 4433 | border-radius: 6px; 4434 | } 4435 | .well-sm { 4436 | padding: 9px; 4437 | border-radius: 3px; 4438 | } 4439 | .close { 4440 | float: right; 4441 | font-size: 22.5px; 4442 | font-weight: bold; 4443 | line-height: 1; 4444 | color: #000000; 4445 | text-shadow: none; 4446 | opacity: 0.2; 4447 | filter: alpha(opacity=20); 4448 | } 4449 | .close:hover, 4450 | .close:focus { 4451 | color: #000000; 4452 | text-decoration: none; 4453 | cursor: pointer; 4454 | opacity: 0.5; 4455 | filter: alpha(opacity=50); 4456 | } 4457 | button.close { 4458 | padding: 0; 4459 | cursor: pointer; 4460 | background: transparent; 4461 | border: 0; 4462 | -webkit-appearance: none; 4463 | } 4464 | .modal-open { 4465 | overflow: hidden; 4466 | } 4467 | .modal { 4468 | display: none; 4469 | overflow: auto; 4470 | overflow-y: scroll; 4471 | position: fixed; 4472 | top: 0; 4473 | right: 0; 4474 | bottom: 0; 4475 | left: 0; 4476 | z-index: 1050; 4477 | -webkit-overflow-scrolling: touch; 4478 | outline: 0; 4479 | } 4480 | .modal.fade .modal-dialog { 4481 | -webkit-transform: translate(0, -25%); 4482 | -ms-transform: translate(0, -25%); 4483 | transform: translate(0, -25%); 4484 | -webkit-transition: -webkit-transform 0.3s ease-out; 4485 | -moz-transition: -moz-transform 0.3s ease-out; 4486 | -o-transition: -o-transform 0.3s ease-out; 4487 | transition: transform 0.3s ease-out; 4488 | } 4489 | .modal.in .modal-dialog { 4490 | -webkit-transform: translate(0, 0); 4491 | -ms-transform: translate(0, 0); 4492 | transform: translate(0, 0); 4493 | } 4494 | .modal-dialog { 4495 | position: relative; 4496 | width: auto; 4497 | margin: 10px; 4498 | } 4499 | .modal-content { 4500 | position: relative; 4501 | background-color: #303030; 4502 | border: 1px solid #999999; 4503 | border: 1px solid rgba(0, 0, 0, 0.2); 4504 | border-radius: 6px; 4505 | -webkit-box-shadow: 0 3px 9px rgba(0, 0, 0, 0.5); 4506 | box-shadow: 0 3px 9px rgba(0, 0, 0, 0.5); 4507 | background-clip: padding-box; 4508 | outline: none; 4509 | } 4510 | .modal-backdrop { 4511 | position: fixed; 4512 | top: 0; 4513 | right: 0; 4514 | bottom: 0; 4515 | left: 0; 4516 | z-index: 1040; 4517 | background-color: #000000; 4518 | } 4519 | .modal-backdrop.fade { 4520 | opacity: 0; 4521 | filter: alpha(opacity=0); 4522 | } 4523 | .modal-backdrop.in { 4524 | opacity: 0.7; 4525 | filter: alpha(opacity=70); 4526 | } 4527 | .modal-header { 4528 | padding: 15px; 4529 | border-bottom: 1px solid #e5e5e5; 4530 | min-height: 16.42857143px; 4531 | } 4532 | .modal-header .close { 4533 | margin-top: -2px; 4534 | } 4535 | .modal-title { 4536 | margin: 0; 4537 | line-height: 1.42857143; 4538 | } 4539 | .modal-body { 4540 | position: relative; 4541 | padding: 20px; 4542 | } 4543 | .modal-footer { 4544 | margin-top: 15px; 4545 | padding: 19px 20px 20px; 4546 | text-align: right; 4547 | border-top: 1px solid #e5e5e5; 4548 | } 4549 | .modal-footer .btn + .btn { 4550 | margin-left: 5px; 4551 | margin-bottom: 0; 4552 | } 4553 | .modal-footer .btn-group .btn + .btn { 4554 | margin-left: -1px; 4555 | } 4556 | .modal-footer .btn-block + .btn-block { 4557 | margin-left: 0; 4558 | } 4559 | @media (min-width: 768px) { 4560 | .modal-dialog { 4561 | width: 600px; 4562 | margin: 30px auto; 4563 | } 4564 | .modal-content { 4565 | -webkit-box-shadow: 0 5px 15px rgba(0, 0, 0, 0.5); 4566 | box-shadow: 0 5px 15px rgba(0, 0, 0, 0.5); 4567 | } 4568 | .modal-sm { 4569 | width: 300px; 4570 | } 4571 | } 4572 | @media (min-width: 992px) { 4573 | .modal-lg { 4574 | width: 900px; 4575 | } 4576 | } 4577 | .tooltip { 4578 | position: absolute; 4579 | z-index: 1030; 4580 | display: block; 4581 | visibility: visible; 4582 | font-size: 13px; 4583 | line-height: 1.4; 4584 | opacity: 0; 4585 | filter: alpha(opacity=0); 4586 | } 4587 | .tooltip.in { 4588 | opacity: 0.9; 4589 | filter: alpha(opacity=90); 4590 | } 4591 | .tooltip.top { 4592 | margin-top: -3px; 4593 | padding: 5px 0; 4594 | } 4595 | .tooltip.right { 4596 | margin-left: 3px; 4597 | padding: 0 5px; 4598 | } 4599 | .tooltip.bottom { 4600 | margin-top: 3px; 4601 | padding: 5px 0; 4602 | } 4603 | .tooltip.left { 4604 | margin-left: -3px; 4605 | padding: 0 5px; 4606 | } 4607 | .tooltip-inner { 4608 | max-width: 200px; 4609 | padding: 3px 8px; 4610 | color: #ffffff; 4611 | text-align: center; 4612 | text-decoration: none; 4613 | background-color: rgba(0, 0, 0, 0.9); 4614 | border-radius: 4px; 4615 | } 4616 | .tooltip-arrow { 4617 | position: absolute; 4618 | width: 0; 4619 | height: 0; 4620 | border-color: transparent; 4621 | border-style: solid; 4622 | } 4623 | .tooltip.top .tooltip-arrow { 4624 | bottom: 0; 4625 | left: 50%; 4626 | margin-left: -5px; 4627 | border-width: 5px 5px 0; 4628 | border-top-color: rgba(0, 0, 0, 0.9); 4629 | } 4630 | .tooltip.top-left .tooltip-arrow { 4631 | bottom: 0; 4632 | left: 5px; 4633 | border-width: 5px 5px 0; 4634 | border-top-color: rgba(0, 0, 0, 0.9); 4635 | } 4636 | .tooltip.top-right .tooltip-arrow { 4637 | bottom: 0; 4638 | right: 5px; 4639 | border-width: 5px 5px 0; 4640 | border-top-color: rgba(0, 0, 0, 0.9); 4641 | } 4642 | .tooltip.right .tooltip-arrow { 4643 | top: 50%; 4644 | left: 0; 4645 | margin-top: -5px; 4646 | border-width: 5px 5px 5px 0; 4647 | border-right-color: rgba(0, 0, 0, 0.9); 4648 | } 4649 | .tooltip.left .tooltip-arrow { 4650 | top: 50%; 4651 | right: 0; 4652 | margin-top: -5px; 4653 | border-width: 5px 0 5px 5px; 4654 | border-left-color: rgba(0, 0, 0, 0.9); 4655 | } 4656 | .tooltip.bottom .tooltip-arrow { 4657 | top: 0; 4658 | left: 50%; 4659 | margin-left: -5px; 4660 | border-width: 0 5px 5px; 4661 | border-bottom-color: rgba(0, 0, 0, 0.9); 4662 | } 4663 | .tooltip.bottom-left .tooltip-arrow { 4664 | top: 0; 4665 | left: 5px; 4666 | border-width: 0 5px 5px; 4667 | border-bottom-color: rgba(0, 0, 0, 0.9); 4668 | } 4669 | .tooltip.bottom-right .tooltip-arrow { 4670 | top: 0; 4671 | right: 5px; 4672 | border-width: 0 5px 5px; 4673 | border-bottom-color: rgba(0, 0, 0, 0.9); 4674 | } 4675 | .popover { 4676 | position: absolute; 4677 | top: 0; 4678 | left: 0; 4679 | z-index: 1010; 4680 | display: none; 4681 | max-width: 276px; 4682 | padding: 1px; 4683 | text-align: left; 4684 | background-color: #303030; 4685 | background-clip: padding-box; 4686 | border: 1px solid #999999; 4687 | border: 1px solid rgba(0, 0, 0, 0.2); 4688 | border-radius: 6px; 4689 | -webkit-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); 4690 | box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); 4691 | white-space: normal; 4692 | } 4693 | .popover.top { 4694 | margin-top: -10px; 4695 | } 4696 | .popover.right { 4697 | margin-left: 10px; 4698 | } 4699 | .popover.bottom { 4700 | margin-top: 10px; 4701 | } 4702 | .popover.left { 4703 | margin-left: -10px; 4704 | } 4705 | .popover-title { 4706 | margin: 0; 4707 | padding: 8px 14px; 4708 | font-size: 15px; 4709 | font-weight: normal; 4710 | line-height: 18px; 4711 | background-color: #282828; 4712 | border-bottom: 1px solid #1c1c1c; 4713 | border-radius: 5px 5px 0 0; 4714 | } 4715 | .popover-content { 4716 | padding: 9px 14px; 4717 | } 4718 | .popover > .arrow, 4719 | .popover > .arrow:after { 4720 | position: absolute; 4721 | display: block; 4722 | width: 0; 4723 | height: 0; 4724 | border-color: transparent; 4725 | border-style: solid; 4726 | } 4727 | .popover > .arrow { 4728 | border-width: 11px; 4729 | } 4730 | .popover > .arrow:after { 4731 | border-width: 10px; 4732 | content: ""; 4733 | } 4734 | .popover.top > .arrow { 4735 | left: 50%; 4736 | margin-left: -11px; 4737 | border-bottom-width: 0; 4738 | border-top-color: #666666; 4739 | border-top-color: rgba(0, 0, 0, 0.25); 4740 | bottom: -11px; 4741 | } 4742 | .popover.top > .arrow:after { 4743 | content: " "; 4744 | bottom: 1px; 4745 | margin-left: -10px; 4746 | border-bottom-width: 0; 4747 | border-top-color: #303030; 4748 | } 4749 | .popover.right > .arrow { 4750 | top: 50%; 4751 | left: -11px; 4752 | margin-top: -11px; 4753 | border-left-width: 0; 4754 | border-right-color: #666666; 4755 | border-right-color: rgba(0, 0, 0, 0.25); 4756 | } 4757 | .popover.right > .arrow:after { 4758 | content: " "; 4759 | left: 1px; 4760 | bottom: -10px; 4761 | border-left-width: 0; 4762 | border-right-color: #303030; 4763 | } 4764 | .popover.bottom > .arrow { 4765 | left: 50%; 4766 | margin-left: -11px; 4767 | border-top-width: 0; 4768 | border-bottom-color: #666666; 4769 | border-bottom-color: rgba(0, 0, 0, 0.25); 4770 | top: -11px; 4771 | } 4772 | .popover.bottom > .arrow:after { 4773 | content: " "; 4774 | top: 1px; 4775 | margin-left: -10px; 4776 | border-top-width: 0; 4777 | border-bottom-color: #303030; 4778 | } 4779 | .popover.left > .arrow { 4780 | top: 50%; 4781 | right: -11px; 4782 | margin-top: -11px; 4783 | border-right-width: 0; 4784 | border-left-color: #666666; 4785 | border-left-color: rgba(0, 0, 0, 0.25); 4786 | } 4787 | .popover.left > .arrow:after { 4788 | content: " "; 4789 | right: 1px; 4790 | border-right-width: 0; 4791 | border-left-color: #303030; 4792 | bottom: -10px; 4793 | } 4794 | .carousel { 4795 | position: relative; 4796 | } 4797 | .carousel-inner { 4798 | position: relative; 4799 | overflow: hidden; 4800 | width: 100%; 4801 | } 4802 | .carousel-inner > .item { 4803 | display: none; 4804 | position: relative; 4805 | -webkit-transition: 0.6s ease-in-out left; 4806 | transition: 0.6s ease-in-out left; 4807 | } 4808 | .carousel-inner > .item > img, 4809 | .carousel-inner > .item > a > img { 4810 | line-height: 1; 4811 | } 4812 | .carousel-inner > .active, 4813 | .carousel-inner > .next, 4814 | .carousel-inner > .prev { 4815 | display: block; 4816 | } 4817 | .carousel-inner > .active { 4818 | left: 0; 4819 | } 4820 | .carousel-inner > .next, 4821 | .carousel-inner > .prev { 4822 | position: absolute; 4823 | top: 0; 4824 | width: 100%; 4825 | } 4826 | .carousel-inner > .next { 4827 | left: 100%; 4828 | } 4829 | .carousel-inner > .prev { 4830 | left: -100%; 4831 | } 4832 | .carousel-inner > .next.left, 4833 | .carousel-inner > .prev.right { 4834 | left: 0; 4835 | } 4836 | .carousel-inner > .active.left { 4837 | left: -100%; 4838 | } 4839 | .carousel-inner > .active.right { 4840 | left: 100%; 4841 | } 4842 | .carousel-control { 4843 | position: absolute; 4844 | top: 0; 4845 | left: 0; 4846 | bottom: 0; 4847 | width: 15%; 4848 | opacity: 0.5; 4849 | filter: alpha(opacity=50); 4850 | font-size: 20px; 4851 | color: #ffffff; 4852 | text-align: center; 4853 | text-shadow: 0 1px 2px rgba(0, 0, 0, 0.6); 4854 | } 4855 | .carousel-control.left { 4856 | background-image: -webkit-linear-gradient(left, color-stop(rgba(0, 0, 0, 0.5) 0%), color-stop(rgba(0, 0, 0, 0.0001) 100%)); 4857 | background-image: linear-gradient(to right, rgba(0, 0, 0, 0.5) 0%, rgba(0, 0, 0, 0.0001) 100%); 4858 | background-repeat: repeat-x; 4859 | } 4860 | .carousel-control.right { 4861 | left: auto; 4862 | right: 0; 4863 | background-image: -webkit-linear-gradient(left, color-stop(rgba(0, 0, 0, 0.0001) 0%), color-stop(rgba(0, 0, 0, 0.5) 100%)); 4864 | background-image: linear-gradient(to right, rgba(0, 0, 0, 0.0001) 0%, rgba(0, 0, 0, 0.5) 100%); 4865 | background-repeat: repeat-x; 4866 | } 4867 | .carousel-control:hover, 4868 | .carousel-control:focus { 4869 | outline: none; 4870 | color: #ffffff; 4871 | text-decoration: none; 4872 | opacity: 0.9; 4873 | filter: alpha(opacity=90); 4874 | } 4875 | .carousel-control .icon-prev, 4876 | .carousel-control .icon-next, 4877 | .carousel-control .glyphicon-chevron-left, 4878 | .carousel-control .glyphicon-chevron-right { 4879 | position: absolute; 4880 | top: 50%; 4881 | z-index: 5; 4882 | display: inline-block; 4883 | } 4884 | .carousel-control .icon-prev, 4885 | .carousel-control .glyphicon-chevron-left { 4886 | left: 50%; 4887 | } 4888 | .carousel-control .icon-next, 4889 | .carousel-control .glyphicon-chevron-right { 4890 | right: 50%; 4891 | } 4892 | .carousel-control .icon-prev, 4893 | .carousel-control .icon-next { 4894 | width: 20px; 4895 | height: 20px; 4896 | margin-top: -10px; 4897 | margin-left: -10px; 4898 | font-family: serif; 4899 | } 4900 | .carousel-control .icon-prev:before { 4901 | content: '\2039'; 4902 | } 4903 | .carousel-control .icon-next:before { 4904 | content: '\203a'; 4905 | } 4906 | .carousel-indicators { 4907 | position: absolute; 4908 | bottom: 10px; 4909 | left: 50%; 4910 | z-index: 15; 4911 | width: 60%; 4912 | margin-left: -30%; 4913 | padding-left: 0; 4914 | list-style: none; 4915 | text-align: center; 4916 | } 4917 | .carousel-indicators li { 4918 | display: inline-block; 4919 | width: 10px; 4920 | height: 10px; 4921 | margin: 1px; 4922 | text-indent: -999px; 4923 | border: 1px solid #ffffff; 4924 | border-radius: 10px; 4925 | cursor: pointer; 4926 | background-color: #000 \9; 4927 | background-color: rgba(0, 0, 0, 0); 4928 | } 4929 | .carousel-indicators .active { 4930 | margin: 0; 4931 | width: 12px; 4932 | height: 12px; 4933 | background-color: #ffffff; 4934 | } 4935 | .carousel-caption { 4936 | position: absolute; 4937 | left: 15%; 4938 | right: 15%; 4939 | bottom: 20px; 4940 | z-index: 10; 4941 | padding-top: 20px; 4942 | padding-bottom: 20px; 4943 | color: #ffffff; 4944 | text-align: center; 4945 | text-shadow: 0 1px 2px rgba(0, 0, 0, 0.6); 4946 | } 4947 | .carousel-caption .btn { 4948 | text-shadow: none; 4949 | } 4950 | @media screen and (min-width: 768px) { 4951 | .carousel-control .glyphicon-chevron-left, 4952 | .carousel-control .glyphicon-chevron-right, 4953 | .carousel-control .icon-prev, 4954 | .carousel-control .icon-next { 4955 | width: 30px; 4956 | height: 30px; 4957 | margin-top: -15px; 4958 | margin-left: -15px; 4959 | font-size: 30px; 4960 | } 4961 | .carousel-caption { 4962 | left: 20%; 4963 | right: 20%; 4964 | padding-bottom: 30px; 4965 | } 4966 | .carousel-indicators { 4967 | bottom: 20px; 4968 | } 4969 | } 4970 | .clearfix:before, 4971 | .clearfix:after, 4972 | .container:before, 4973 | .container:after, 4974 | .container-fluid:before, 4975 | .container-fluid:after, 4976 | .row:before, 4977 | .row:after, 4978 | .form-horizontal .form-group:before, 4979 | .form-horizontal .form-group:after, 4980 | .btn-toolbar:before, 4981 | .btn-toolbar:after, 4982 | .btn-group-vertical > .btn-group:before, 4983 | .btn-group-vertical > .btn-group:after, 4984 | .nav:before, 4985 | .nav:after, 4986 | .navbar:before, 4987 | .navbar:after, 4988 | .navbar-header:before, 4989 | .navbar-header:after, 4990 | .navbar-collapse:before, 4991 | .navbar-collapse:after, 4992 | .pager:before, 4993 | .pager:after, 4994 | .panel-body:before, 4995 | .panel-body:after, 4996 | .modal-footer:before, 4997 | .modal-footer:after { 4998 | content: " "; 4999 | display: table; 5000 | } 5001 | .clearfix:after, 5002 | .container:after, 5003 | .container-fluid:after, 5004 | .row:after, 5005 | .form-horizontal .form-group:after, 5006 | .btn-toolbar:after, 5007 | .btn-group-vertical > .btn-group:after, 5008 | .nav:after, 5009 | .navbar:after, 5010 | .navbar-header:after, 5011 | .navbar-collapse:after, 5012 | .pager:after, 5013 | .panel-body:after, 5014 | .modal-footer:after { 5015 | clear: both; 5016 | } 5017 | .center-block { 5018 | display: block; 5019 | margin-left: auto; 5020 | margin-right: auto; 5021 | } 5022 | .pull-right { 5023 | float: right !important; 5024 | } 5025 | .pull-left { 5026 | float: left !important; 5027 | } 5028 | .hide { 5029 | display: none !important; 5030 | } 5031 | .show { 5032 | display: block !important; 5033 | } 5034 | .invisible { 5035 | visibility: hidden; 5036 | } 5037 | .text-hide { 5038 | font: 0/0 a; 5039 | color: transparent; 5040 | text-shadow: none; 5041 | background-color: transparent; 5042 | border: 0; 5043 | } 5044 | .hidden { 5045 | display: none !important; 5046 | visibility: hidden !important; 5047 | } 5048 | .affix { 5049 | position: fixed; 5050 | } 5051 | @-ms-viewport { 5052 | width: device-width; 5053 | } 5054 | .visible-xs, 5055 | .visible-sm, 5056 | .visible-md, 5057 | .visible-lg { 5058 | display: none !important; 5059 | } 5060 | @media (max-width: 767px) { 5061 | .visible-xs { 5062 | display: block !important; 5063 | } 5064 | table.visible-xs { 5065 | display: table; 5066 | } 5067 | tr.visible-xs { 5068 | display: table-row !important; 5069 | } 5070 | th.visible-xs, 5071 | td.visible-xs { 5072 | display: table-cell !important; 5073 | } 5074 | } 5075 | @media (min-width: 768px) and (max-width: 991px) { 5076 | .visible-sm { 5077 | display: block !important; 5078 | } 5079 | table.visible-sm { 5080 | display: table; 5081 | } 5082 | tr.visible-sm { 5083 | display: table-row !important; 5084 | } 5085 | th.visible-sm, 5086 | td.visible-sm { 5087 | display: table-cell !important; 5088 | } 5089 | } 5090 | @media (min-width: 992px) and (max-width: 1199px) { 5091 | .visible-md { 5092 | display: block !important; 5093 | } 5094 | table.visible-md { 5095 | display: table; 5096 | } 5097 | tr.visible-md { 5098 | display: table-row !important; 5099 | } 5100 | th.visible-md, 5101 | td.visible-md { 5102 | display: table-cell !important; 5103 | } 5104 | } 5105 | @media (min-width: 1200px) { 5106 | .visible-lg { 5107 | display: block !important; 5108 | } 5109 | table.visible-lg { 5110 | display: table; 5111 | } 5112 | tr.visible-lg { 5113 | display: table-row !important; 5114 | } 5115 | th.visible-lg, 5116 | td.visible-lg { 5117 | display: table-cell !important; 5118 | } 5119 | } 5120 | @media (max-width: 767px) { 5121 | .hidden-xs { 5122 | display: none !important; 5123 | } 5124 | } 5125 | @media (min-width: 768px) and (max-width: 991px) { 5126 | .hidden-sm { 5127 | display: none !important; 5128 | } 5129 | } 5130 | @media (min-width: 992px) and (max-width: 1199px) { 5131 | .hidden-md { 5132 | display: none !important; 5133 | } 5134 | } 5135 | @media (min-width: 1200px) { 5136 | .hidden-lg { 5137 | display: none !important; 5138 | } 5139 | } 5140 | .visible-print { 5141 | display: none !important; 5142 | } 5143 | @media print { 5144 | .visible-print { 5145 | display: block !important; 5146 | } 5147 | table.visible-print { 5148 | display: table; 5149 | } 5150 | tr.visible-print { 5151 | display: table-row !important; 5152 | } 5153 | th.visible-print, 5154 | td.visible-print { 5155 | display: table-cell !important; 5156 | } 5157 | } 5158 | @media print { 5159 | .hidden-print { 5160 | display: none !important; 5161 | } 5162 | } 5163 | .navbar { 5164 | border-width: 0; 5165 | } 5166 | .navbar-default .badge { 5167 | background-color: #fff; 5168 | color: #375a7f; 5169 | } 5170 | .navbar-inverse .badge { 5171 | background-color: #fff; 5172 | color: #00bc8c; 5173 | } 5174 | .navbar-brand { 5175 | padding: 18.5px 15px 20.5px; 5176 | } 5177 | .navbar-form .form-control { 5178 | background-color: white; 5179 | } 5180 | .navbar-form .form-control:focus { 5181 | border-color: white; 5182 | } 5183 | .btn:active { 5184 | -webkit-box-shadow: none; 5185 | box-shadow: none; 5186 | } 5187 | .btn-group.open .dropdown-toggle { 5188 | -webkit-box-shadow: none; 5189 | box-shadow: none; 5190 | } 5191 | .text-primary, 5192 | .text-primary:hover { 5193 | color: #4673a3; 5194 | } 5195 | .text-success, 5196 | .text-success:hover { 5197 | color: #00bc8c; 5198 | } 5199 | .text-danger, 5200 | .text-danger:hover { 5201 | color: #e74c3c; 5202 | } 5203 | .text-warning, 5204 | .text-warning:hover { 5205 | color: #f39c12; 5206 | } 5207 | .text-info, 5208 | .text-info:hover { 5209 | color: #3498db; 5210 | } 5211 | table a, 5212 | .table a { 5213 | text-decoration: underline; 5214 | } 5215 | table .success, 5216 | .table .success, 5217 | table .warning, 5218 | .table .warning, 5219 | table .danger, 5220 | .table .danger, 5221 | table .info, 5222 | .table .info { 5223 | color: #fff; 5224 | } 5225 | table .success a, 5226 | .table .success a, 5227 | table .warning a, 5228 | .table .warning a, 5229 | table .danger a, 5230 | .table .danger a, 5231 | table .info a, 5232 | .table .info a { 5233 | color: #fff; 5234 | } 5235 | table > thead > tr > th, 5236 | .table > thead > tr > th, 5237 | table > tbody > tr > th, 5238 | .table > tbody > tr > th, 5239 | table > tfoot > tr > th, 5240 | .table > tfoot > tr > th, 5241 | table > thead > tr > td, 5242 | .table > thead > tr > td, 5243 | table > tbody > tr > td, 5244 | .table > tbody > tr > td, 5245 | table > tfoot > tr > td, 5246 | .table > tfoot > tr > td { 5247 | border: none; 5248 | } 5249 | table-bordered > thead > tr > th, 5250 | .table-bordered > thead > tr > th, 5251 | table-bordered > tbody > tr > th, 5252 | .table-bordered > tbody > tr > th, 5253 | table-bordered > tfoot > tr > th, 5254 | .table-bordered > tfoot > tr > th, 5255 | table-bordered > thead > tr > td, 5256 | .table-bordered > thead > tr > td, 5257 | table-bordered > tbody > tr > td, 5258 | .table-bordered > tbody > tr > td, 5259 | table-bordered > tfoot > tr > td, 5260 | .table-bordered > tfoot > tr > td { 5261 | border: 1px solid #464545; 5262 | } 5263 | input, 5264 | textarea { 5265 | color: #464545; 5266 | } 5267 | .form-control, 5268 | input, 5269 | textarea { 5270 | border: none; 5271 | -webkit-box-shadow: none; 5272 | box-shadow: none; 5273 | } 5274 | .form-control:focus, 5275 | input:focus, 5276 | textarea:focus { 5277 | -webkit-box-shadow: none; 5278 | box-shadow: none; 5279 | } 5280 | .has-warning .help-block, 5281 | .has-warning .control-label { 5282 | color: #f39c12; 5283 | } 5284 | .has-warning .form-control, 5285 | .has-warning .form-control:focus { 5286 | -webkit-box-shadow: none; 5287 | box-shadow: none; 5288 | } 5289 | .has-error .help-block, 5290 | .has-error .control-label { 5291 | color: #e74c3c; 5292 | } 5293 | .has-error .form-control, 5294 | .has-error .form-control:focus { 5295 | -webkit-box-shadow: none; 5296 | box-shadow: none; 5297 | } 5298 | .has-success .help-block, 5299 | .has-success .control-label { 5300 | color: #00bc8c; 5301 | } 5302 | .has-success .form-control, 5303 | .has-success .form-control:focus { 5304 | -webkit-box-shadow: none; 5305 | box-shadow: none; 5306 | } 5307 | .input-group-addon { 5308 | color: #ffffff; 5309 | } 5310 | .nav .open > a, 5311 | .nav .open > a:hover, 5312 | .nav .open > a:focus { 5313 | border-color: #464545; 5314 | } 5315 | .nav-tabs > li > a, 5316 | .nav-pills > li > a { 5317 | color: #fff; 5318 | } 5319 | .pager a, 5320 | .pager a:hover { 5321 | color: #fff; 5322 | } 5323 | .pager .disabled > a, 5324 | .pager .disabled > a:hover, 5325 | .pager .disabled > a:focus, 5326 | .pager .disabled > span { 5327 | background-color: #007053; 5328 | } 5329 | .alert a, 5330 | .alert .alert-link { 5331 | color: #fff; 5332 | text-decoration: underline; 5333 | } 5334 | .progress { 5335 | height: 10px; 5336 | -webkit-box-shadow: none; 5337 | box-shadow: none; 5338 | } 5339 | .progress .progress-bar { 5340 | font-size: 10px; 5341 | line-height: 10px; 5342 | } 5343 | .well { 5344 | -webkit-box-shadow: none; 5345 | box-shadow: none; 5346 | } 5347 | .popover, 5348 | .modal { 5349 | color: #303030; 5350 | } 5351 | .breadcrumb a { 5352 | color: #fff; 5353 | } 5354 | .panel-default > .panel-heading { 5355 | background-color: #464545; 5356 | } 5357 | .modal { 5358 | color: #ffffff; 5359 | } 5360 | .modal-header, 5361 | .modal-footer { 5362 | border-color: #464545; 5363 | } 5364 | .popover { 5365 | color: #ffffff; 5366 | } -------------------------------------------------------------------------------- /app/demo.css: -------------------------------------------------------------------------------- 1 | /* 2 | Perl Executing Browser QtWebEngine Demo 3 | 4 | This program is free software; 5 | you can redistribute it and/or modify it under the terms of the 6 | GNU Lesser General Public License, 7 | as published by the Free Software Foundation; 8 | either version 3 of the License, or (at your option) any later version. 9 | This program is distributed in the hope that it will be useful, 10 | but WITHOUT ANY WARRANTY; 11 | without even the implied warranty of MERCHANTABILITY or 12 | FITNESS FOR A PARTICULAR PURPOSE. 13 | Dimitar D. Mitov, 2013 - 2024 14 | Valcho Nedelchev, 2014 - 2016 15 | https://github.com/ddmitov/perl-executing-browser 16 | */ 17 | 18 | pre { 19 | margin: 4px; 20 | text-align: left; 21 | font-size: 14px; 22 | font-family: sans-serif; 23 | } 24 | 25 | .btn { 26 | margin-top: 20px; 27 | } 28 | 29 | .tests { 30 | margin-top: 20px; 31 | } 32 | 33 | .introduction { 34 | font-size: 20px; 35 | } 36 | -------------------------------------------------------------------------------- /app/demo.js: -------------------------------------------------------------------------------- 1 | // Perl Executing Browser QtWebEngine Demo 2 | 3 | // This program is free software; 4 | // you can redistribute it and/or modify it under the terms of the 5 | // GNU Lesser General Public License, 6 | // as published by the Free Software Foundation; 7 | // either version 3 of the License, or (at your option) any later version. 8 | // This program is distributed in the hope that it will be useful, 9 | // but WITHOUT ANY WARRANTY; 10 | // without even the implied warranty of MERCHANTABILITY or 11 | // FITNESS FOR A PARTICULAR PURPOSE. 12 | // Dimitar D. Mitov, 2013 - 2024 13 | // Valcho Nedelchev, 2014 - 2016 14 | // https://github.com/ddmitov/perl-executing-browser 15 | 16 | // Settings object for perl_info.pl: 17 | const perlInfo = {} 18 | 19 | perlInfo.scriptRelativePath = 'perl_scripts/perl_info.pl' 20 | 21 | perlInfo.stdoutFunction = function (stdout) { 22 | const newElement = document.createElement('pre') 23 | newElement.innerHTML = stdout 24 | document.getElementById('perl-info-output').appendChild(newElement) 25 | 26 | document.getElementById('perl-info-button').style.display = 'none' 27 | } 28 | 29 | // Settings object for open_file.pl: 30 | const openFile = {} 31 | 32 | openFile.scriptRelativePath = 'perl_scripts/open_file.pl' 33 | 34 | openFile.scriptInput = '{"existing-file":"Select File"}' 35 | 36 | openFile.stdoutFunction = function (stdout) { 37 | displayTestResult(stdout) 38 | } 39 | 40 | // Settings object for new_file.pl: 41 | const newFile = {} 42 | 43 | newFile.scriptRelativePath = 'perl_scripts/new_file.pl' 44 | 45 | newFile.scriptInput = '{"new-file":"New File Name"}' 46 | 47 | newFile.stdoutFunction = function (stdout) { 48 | displayTestResult(stdout) 49 | } 50 | 51 | // Settings object for open_directory.pl: 52 | const openDirectory = {} 53 | 54 | openDirectory.scriptRelativePath = 'perl_scripts/open_directory.pl' 55 | 56 | openDirectory.scriptInput = '{"directory":"Select Directory"}' 57 | 58 | openDirectory.stdoutFunction = function (stdout) { 59 | displayTestResult(stdout) 60 | } 61 | 62 | // Helper functions: 63 | function displayTestResult (stdout) { 64 | clearTestData() 65 | 66 | const newElement = document.createElement('pre') 67 | newElement.innerHTML = stdout 68 | document.getElementById('filesystem-tests').appendChild(newElement) 69 | } 70 | 71 | function clearTestData () { 72 | const container = document.getElementById('filesystem-tests') 73 | 74 | while (container.firstChild) { 75 | container.removeChild(container.firstChild) 76 | } 77 | } 78 | -------------------------------------------------------------------------------- /app/index.html: -------------------------------------------------------------------------------- 1 | 2 | 18 | 19 | 20 | 21 | Perl Executing Browser Demo 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 |
33 | 34 |

Perl Executing Browser

35 | 36 |
37 |
38 | Perl Executing Browser (PEB) is an HTML user interface for Perl 5 desktop applications.
39 | It is a C++ Qt 5 program running local Perl scripts as child processes without server. 40 |
41 |
42 | 43 | 48 | 49 | 52 | 53 |
54 | 55 |
56 |
57 | 58 | 59 | 60 | -------------------------------------------------------------------------------- /app/perl_scripts/new_file.pl: -------------------------------------------------------------------------------- 1 | #!/usr/bin/perl 2 | 3 | # Perl Executing Browser QtWebEngine Demo 4 | 5 | # This program is free software; 6 | # you can redistribute it and/or modify it under the terms of the 7 | # GNU Lesser General Public License, 8 | # as published by the Free Software Foundation; 9 | # either version 3 of the License, or (at your option) any later version. 10 | # This program is distributed in the hope that it will be useful, 11 | # but WITHOUT ANY WARRANTY; 12 | # without even the implied warranty of MERCHANTABILITY or 13 | # FITNESS FOR A PARTICULAR PURPOSE. 14 | # Dimitar D. Mitov, 2013 - 2024 15 | # Valcho Nedelchev, 2014 - 2016 16 | # https://github.com/ddmitov/perl-executing-browser 17 | 18 | use strict; 19 | use warnings; 20 | 21 | my $filename = ; 22 | chomp $filename; 23 | 24 | print "Selected new filename: $filename"; 25 | -------------------------------------------------------------------------------- /app/perl_scripts/open_directory.pl: -------------------------------------------------------------------------------- 1 | #!/usr/bin/perl 2 | 3 | # Perl Executing Browser QtWebEngine Demo 4 | 5 | # This program is free software; 6 | # you can redistribute it and/or modify it under the terms of the 7 | # GNU Lesser General Public License, 8 | # as published by the Free Software Foundation; 9 | # either version 3 of the License, or (at your option) any later version. 10 | # This program is distributed in the hope that it will be useful, 11 | # but WITHOUT ANY WARRANTY; 12 | # without even the implied warranty of MERCHANTABILITY or 13 | # FITNESS FOR A PARTICULAR PURPOSE. 14 | # Dimitar D. Mitov, 2013 - 2024 15 | # Valcho Nedelchev, 2014 - 2016 16 | # https://github.com/ddmitov/perl-executing-browser 17 | 18 | use strict; 19 | use warnings; 20 | 21 | my $directory_name = ; 22 | chomp $directory_name; 23 | 24 | print "Selected directory: $directory_name"; 25 | -------------------------------------------------------------------------------- /app/perl_scripts/open_file.pl: -------------------------------------------------------------------------------- 1 | #!/usr/bin/perl 2 | 3 | # Perl Executing Browser QtWebEngine Demo 4 | 5 | # This program is free software; 6 | # you can redistribute it and/or modify it under the terms of the 7 | # GNU Lesser General Public License, 8 | # as published by the Free Software Foundation; 9 | # either version 3 of the License, or (at your option) any later version. 10 | # This program is distributed in the hope that it will be useful, 11 | # but WITHOUT ANY WARRANTY; 12 | # without even the implied warranty of MERCHANTABILITY or 13 | # FITNESS FOR A PARTICULAR PURPOSE. 14 | # Dimitar D. Mitov, 2013 - 2024 15 | # Valcho Nedelchev, 2014 - 2016 16 | # https://github.com/ddmitov/perl-executing-browser 17 | 18 | use strict; 19 | use warnings; 20 | 21 | my $input = ; 22 | chomp $input; 23 | 24 | print "Selected file: $input"; 25 | -------------------------------------------------------------------------------- /app/perl_scripts/perl_info.pl: -------------------------------------------------------------------------------- 1 | #!/usr/bin/perl 2 | 3 | # Perl Executing Browser QtWebEngine Demo 4 | 5 | # This program is free software; 6 | # you can redistribute it and/or modify it under the terms of the 7 | # GNU Lesser General Public License, 8 | # as published by the Free Software Foundation; 9 | # either version 3 of the License, or (at your option) any later version. 10 | # This program is distributed in the hope that it will be useful, 11 | # but WITHOUT ANY WARRANTY; 12 | # without even the implied warranty of MERCHANTABILITY or 13 | # FITNESS FOR A PARTICULAR PURPOSE. 14 | # Dimitar D. Mitov, 2013 - 2024 15 | # Valcho Nedelchev, 2014 - 2016 16 | # https://github.com/ddmitov/perl-executing-browser 17 | 18 | use strict; 19 | use warnings; 20 | use Cwd; 21 | use English; 22 | 23 | my $cwd = cwd(); 24 | 25 | print "Perl $PERL_VERSION
"; 26 | print "Working Directory: $cwd
"; 27 | 28 | print "
"; 29 | 30 | print "\@INC Array:
"; 31 | print join "
", @INC; 32 | -------------------------------------------------------------------------------- /deb/DEBIAN/control: -------------------------------------------------------------------------------- 1 | Section: misc 2 | Priority: optional 3 | Homepage: 4 | Package: peb 5 | Version: 2.0.0 6 | Maintainer: Ubuntu Developers 7 | Depends: libqt5webengine5 (>= 5.9), perl 8 | Architecture: amd64 9 | Description: Perl Executing Browser 10 | Perl Executing Browser is an HTML user interface for Perl 5 desktop applications. 11 | -------------------------------------------------------------------------------- /doc/application-directory.md: -------------------------------------------------------------------------------- 1 | # Perl Executing Browser - Application Directory 2 | 3 | PEB is created to work from any directory and all file paths used by PEB are relative to the PEB Application Directory. 4 | 5 | The PEB Application Directory must be one of the following: 6 | 7 | * an existing directory submitted as a full or relative path in the only command-line argument of PEB 8 | 9 | * an existing directory named ``app`` and located in the current working directory of PEB 10 | 11 | All Perl scripts started by PEB must be located within the PEB Application Directory and its subdirectories. 12 | 13 | The working directory of all PEB Perl scripts is the PEB Application Directory. 14 | 15 | When started, PEB is trying to find the following files in its Application Directory: 16 | 17 | * **Start Page:** 18 | Start page pathname must be: ``{PEB Application Directory}/index.html`` 19 | 20 | Start page is required. 21 | 22 | If start page is missing, an error message is displayed. 23 | 24 | * **Icon:** 25 | Icon pathname must be: ``{PEB Application Directory}/app.png`` 26 | 27 | Icon file is optional. 28 | 29 | If icon file is found when PEB is started, it is used as an application icon. 30 | If icon file is not found, the default icon embedded in the resources of the PEB binary is used as an application icon. 31 | -------------------------------------------------------------------------------- /doc/perl-scripts-api.md: -------------------------------------------------------------------------------- 1 | # Perl Executing Browser - Perl Scripts API 2 | 3 | Every Perl script run by PEB must have a JavaScript configuration object with an arbitrary object name and fixed-name object properties. The name of the JavaScript configuration object with a ``.script`` extension forms a pseudo link used to start the corresponding Perl script. 4 | 5 | There are two methods to start a Perl script in PEB: 6 | 7 | * **Click a pseudo link:** 8 | ```html 9 | Start Perl script 10 | ``` 11 | 12 | * **Submit a form to a pseudo link:** 13 | 14 | ```html 15 |
16 | 17 |
18 | ``` 19 | 20 | A minimal example of a JavaScript configuration object for a Perl script run by PEB: 21 | 22 | ```javascript 23 | const example = {} 24 | 25 | example.scriptRelativePath = 'relative/path/to/script.pl' 26 | 27 | example.stdoutFunction = function (stdout) { 28 | const container = document.getElementById('DOM-element-id') 29 | container.innerText = stdout 30 | } 31 | ``` 32 | 33 | A JavaScript configuration object for a Perl script run by PEB must have the following required properties: 34 | 35 | * **scriptRelativePath** 36 | ``String`` for the relative path of the Perl script run by PEB 37 | 38 | The relative path of the script is converted to a full path using the [PEB Application Directory](./doc/application-directory.md) as a root folder. PEB does not check filename extensions or shebang lines of Perl scripts. Scripts without filename extensions can also be used. 39 | 40 | * **stdoutFunction** 41 | ``function`` executed by PEB every time data is available on the STDOUT of the Perl script 42 | The only parameter passed to the ``stdoutFunction`` is the STDOUT ``String``. 43 | 44 | An example of a ``stdoutFunction`` displaying immediately STDOUT data: 45 | 46 | ```javascript 47 | example.stdoutFunction = function (stdout) { 48 | document.getElementById('DOM-element-id').textContent = stdout 49 | } 50 | ``` 51 | 52 | Please note that many Perl scripts do not give their STDOUT data in a single shot. 53 | If several chunks of output have to be combined, this must be done at JavaScript level: 54 | 55 | ```javascript 56 | let accumulatedOutput 57 | 58 | example.stdoutFunction = function (stdout) { 59 | accumulatedOutput = accumulatedOutput + stdout 60 | document.getElementById('DOM-element-id').textContent = accumulatedOutput 61 | }; 62 | ``` 63 | 64 | A JavaScript configuration object for a Perl script run by PEB may also have the following optional properties: 65 | 66 | * **perlInterpreter** 67 | ``String`` for the relative path of a [relocatable](https://github.com/skaji/relocatable-perl) Perl interpreter used by PEB 68 | 69 | The relative path of a relocatable Perl interpreter is converted to a full path using the [PEB Application Directory](./doc/application-directory.md) as a root folder. If a relocatable Perl interpreter is not configured, PEB will use the first Perl interpreter on PATH. 70 | 71 | * **scriptInput** 72 | ``String`` 73 | 74 | The ``scriptInput`` string is written to the STDIN of the Perl script. 75 | 76 | If any of the following special tags is included in the ``scriptInput`` string, a file or directory selection dialog is presented to the user and the tag is replaced with the user-selected file or folder path before starting the Perl script. Any number and combination of special tags may be included in the ``scriptInput`` string. 77 | 78 | All file or directory selection tags are JSON-compatible snippets with the dialog type as element name and the dialog title as element value. The acceptable element names are ``existing-file``, ``new-file`` and ``directory``, the element values are text labels which must match the regular expression ``[a-zA-Z0-9\\s]{1,}`` meaning that one or more instances of lowercase or uppercase letters, numbers or spaces are allowed in any combination. 79 | 80 | Special tags for file or folder selection: 81 | 82 | * ``{"existing-file":"Your Dialog Title"}`` 83 | The actual opening of an existing file is performed by the Perl script and not by PEB. 84 | 85 | * ``{"new-file":"Your Dialog Title"}`` 86 | The actual creation of a new file is performed by the Perl script and not by PEB. 87 | 88 | * ``{"directory":"Your Dialog Title"}`` 89 | When ``directory`` type of dialog is used, an existing directory may be selected or a new directory may be created and then selected. Any new directory will be immediately created by PEB. 90 | -------------------------------------------------------------------------------- /doc/screenshot.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ddmitov/perl-executing-browser/66508dc90c756228db6ce32d80187363bb9872f2/doc/screenshot.png -------------------------------------------------------------------------------- /makedeb.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | 3 | # DEB 'control' file is required: 4 | if [ ! -e "$(pwd)/deb/DEBIAN/control" ]; then 5 | printf "\\n control file is missing! \\n\\n" 6 | exit 1 7 | fi 8 | 9 | # Copy the PEB executable: 10 | if [ -e "$(pwd)/peb" ]; then 11 | mkdir -p "$(pwd)/deb/usr/local/bin" 12 | cp -f "$(pwd)/peb" "$(pwd)/deb/usr/local/bin/peb" 13 | fi 14 | 15 | # If the PEB executable is not found, 16 | # compile it and then copy it in the 'deb' folder: 17 | if [ ! -e "$(pwd)/peb" ]; then 18 | cd src 19 | qmake -qt=qt5 20 | make 21 | cd .. 22 | mkdir -p "$(pwd)/deb/usr/local/bin" 23 | cp -f "$(pwd)/peb" "$(pwd)/deb/usr/local/bin/peb" 24 | fi 25 | 26 | # DEB file generation: 27 | dpkg-deb --build --root-owner-group deb peb-2.0.0-x86_64.deb 28 | -------------------------------------------------------------------------------- /src/main.cpp: -------------------------------------------------------------------------------- 1 | /* 2 | Perl Executing Browser QtWebEngine 3 | 4 | This program is free software; 5 | you can redistribute it and/or modify it under the terms of the 6 | GNU Lesser General Public License, 7 | as published by the Free Software Foundation; 8 | either version 3 of the License, or (at your option) any later version. 9 | This program is distributed in the hope that it will be useful, 10 | but WITHOUT ANY WARRANTY; 11 | without even the implied warranty of MERCHANTABILITY or 12 | FITNESS FOR A PARTICULAR PURPOSE. 13 | Dimitar D. Mitov, 2013 - 2024 14 | Valcho Nedelchev, 2014 - 2016 15 | https://github.com/ddmitov/perl-executing-browser 16 | */ 17 | 18 | #include 19 | #include 20 | #include 21 | 22 | #include "window.h" 23 | 24 | // ============================== 25 | // APPLICATION DEFINITION 26 | // ============================== 27 | int main(int argc, char **argv) 28 | { 29 | QApplication application(argc, argv); 30 | 31 | application.setApplicationName("Perl Executing Browser"); 32 | application.setApplicationVersion("2.0.0"); 33 | 34 | // UTF-8 encoding application-wide: 35 | QTextCodec::setCodecForLocale(QTextCodec::codecForName("UTF8")); 36 | 37 | // Command-line argument: 38 | const QStringList arguments = QCoreApplication::arguments(); 39 | 40 | // Application directory: 41 | QString applicationDirectoryPath; 42 | 43 | if (arguments.length() > 1) { 44 | QFileInfo applicationDirectoryArgument(arguments.at(1)); 45 | 46 | if (applicationDirectoryArgument.isRelative()){ 47 | applicationDirectoryPath = QDir::currentPath() + "/app"; 48 | } 49 | 50 | if (!applicationDirectoryArgument.isRelative()){ 51 | applicationDirectoryPath = arguments.at(1); 52 | } 53 | 54 | } else { 55 | applicationDirectoryPath = QDir::currentPath() + "/app"; 56 | } 57 | 58 | application.setProperty("appDir", applicationDirectoryPath); 59 | 60 | // Application icon: 61 | QString iconPathName = applicationDirectoryPath + "/app.png"; 62 | 63 | QPixmap icon(32, 32); 64 | QFile iconFile(iconPathName); 65 | 66 | if (iconFile.exists()) { 67 | icon.load(iconPathName); 68 | QApplication::setWindowIcon(icon); 69 | } else { 70 | // Use the embedded default icon if no external icon file is found: 71 | icon.load(":/camel.png"); 72 | 73 | application.setWindowIcon(icon); 74 | } 75 | 76 | // Start page: 77 | QString startPageFilePath = applicationDirectoryPath + "/index.html"; 78 | QFile startPageFile(startPageFilePath); 79 | 80 | if (startPageFile.exists()) { 81 | QMainBrowserWindow mainWindow; 82 | 83 | mainWindow.mainViewWidget->setUrl( 84 | QUrl::fromLocalFile(startPageFilePath) 85 | ); 86 | 87 | return application.exec(); 88 | } 89 | 90 | if (!startPageFile.exists()) { 91 | QMessageBox msgBox; 92 | 93 | msgBox.setWindowTitle("Perl Executing Browser"); 94 | msgBox.setText("No Perl Executing Browser start page is found."); 95 | msgBox.exec(); 96 | 97 | application.exit(); 98 | } 99 | } 100 | -------------------------------------------------------------------------------- /src/page.cpp: -------------------------------------------------------------------------------- 1 | /* 2 | Perl Executing Browser QtWebEngine 3 | 4 | This program is free software; 5 | you can redistribute it and/or modify it under the terms of the 6 | GNU Lesser General Public License, 7 | as published by the Free Software Foundation; 8 | either version 3 of the License, or (at your option) any later version. 9 | This program is distributed in the hope that it will be useful, 10 | but WITHOUT ANY WARRANTY; 11 | without even the implied warranty of MERCHANTABILITY or 12 | FITNESS FOR A PARTICULAR PURPOSE. 13 | Dimitar D. Mitov, 2013 - 2024 14 | Valcho Nedelchev, 2014 - 2016 15 | https://github.com/ddmitov/perl-executing-browser 16 | */ 17 | 18 | #include 19 | 20 | #include "page.h" 21 | 22 | // ============================== 23 | // PAGE CLASS CONSTRUCTOR 24 | // ============================== 25 | QPage::QPage() 26 | : QWebEnginePage() 27 | { 28 | QWebEngineSettings::globalSettings()-> 29 | setDefaultTextEncoding(QString("utf-8")); 30 | 31 | QWebEngineSettings::globalSettings()-> 32 | setAttribute(QWebEngineSettings::JavascriptCanOpenWindows, false); 33 | 34 | QWebEngineSettings::globalSettings()-> 35 | setAttribute( 36 | QWebEngineSettings::LocalContentCanAccessRemoteUrls, false 37 | ); 38 | 39 | QWebEngineSettings::globalSettings()-> 40 | setAttribute(QWebEngineSettings::JavascriptEnabled, true); 41 | 42 | QWebEngineSettings::globalSettings()-> 43 | setAttribute(QWebEngineSettings::XSSAuditingEnabled, true); 44 | } 45 | -------------------------------------------------------------------------------- /src/page.h: -------------------------------------------------------------------------------- 1 | /* 2 | Perl Executing Browser QtWebEngine 3 | 4 | This program is free software; 5 | you can redistribute it and/or modify it under the terms of the 6 | GNU Lesser General Public License, 7 | as published by the Free Software Foundation; 8 | either version 3 of the License, or (at your option) any later version. 9 | This program is distributed in the hope that it will be useful, 10 | but WITHOUT ANY WARRANTY; 11 | without even the implied warranty of MERCHANTABILITY or 12 | FITNESS FOR A PARTICULAR PURPOSE. 13 | Dimitar D. Mitov, 2013 - 2024 14 | Valcho Nedelchev, 2014 - 2016 15 | https://github.com/ddmitov/perl-executing-browser 16 | */ 17 | 18 | #ifndef PAGE_H 19 | #define PAGE_H 20 | 21 | #include 22 | #include 23 | #include 24 | #include 25 | 26 | #include "script-handler.h" 27 | 28 | // ============================== 29 | // WEB PAGE CLASS DEFINITION 30 | // ============================== 31 | class QPage : public QWebEnginePage 32 | { 33 | Q_OBJECT 34 | 35 | public slots: 36 | 37 | // Start Perl Script: 38 | void qStartScript(QString scriptObjectName) 39 | { 40 | QPage::runJavaScript( 41 | "JSON.stringify(" + scriptObjectName + ")", 42 | 0, 43 | [=] 44 | (QVariant scriptSettings) 45 | { 46 | QJsonDocument scriptJsonDocument = 47 | QJsonDocument::fromJson(scriptSettings.toString().toUtf8()); 48 | 49 | if (!scriptJsonDocument.isEmpty()) { 50 | QJsonObject scriptJsonObject = scriptJsonDocument.object(); 51 | 52 | QScriptHandler *scriptHandler = 53 | new QScriptHandler(scriptObjectName, scriptJsonObject); 54 | 55 | QObject::connect( 56 | scriptHandler, 57 | SIGNAL(displayScriptOutputSignal(QString, QString)), 58 | this, 59 | SLOT(qDisplayScriptOutputSlot(QString, QString)) 60 | ); 61 | } 62 | } 63 | ); 64 | } 65 | 66 | // Perl script STDOUT slot: 67 | void qDisplayScriptOutputSlot(QString id, QString output) 68 | { 69 | QPage::runJavaScript(id + ".stdoutFunction('" + output + "')", 0); 70 | } 71 | 72 | protected: 73 | 74 | // Navigation: 75 | bool acceptNavigationRequest(const QUrl &url, 76 | QWebEnginePage::NavigationType navType, 77 | bool isMainFrame 78 | ) override 79 | { 80 | Q_UNUSED(isMainFrame); 81 | 82 | // No access to web pages: 83 | if (url.scheme() != "file") { 84 | return false; 85 | } 86 | 87 | // Start Perl script 88 | // when pseudo link is clicked or 89 | // when form is submitted to a pseudo link: 90 | if (url.scheme() == "file" and url.fileName().contains(".script")) { 91 | if (navType == QWebEnginePage::NavigationTypeLinkClicked) { 92 | qStartScript(url.fileName().replace(".script", "")); 93 | 94 | return false; 95 | } 96 | 97 | if (navType == QWebEnginePage::NavigationTypeFormSubmitted) { 98 | qStartScript(url.fileName().replace(".script", "")); 99 | 100 | return false; 101 | } 102 | } 103 | 104 | return true; 105 | } 106 | 107 | // Redirect JavaScript console messages to the STDERR of PEB: 108 | virtual void javaScriptConsoleMessage( 109 | QWebEnginePage::JavaScriptConsoleMessageLevel level, 110 | const QString &message, 111 | int lineNumber, 112 | const QString &sourceID) 113 | override 114 | { 115 | if (level == QWebEnginePage::InfoMessageLevel) { 116 | qInfo() << sourceID 117 | << "Line" 118 | << lineNumber 119 | << message; 120 | } 121 | 122 | if (level == QWebEnginePage::WarningMessageLevel) { 123 | qWarning() << sourceID 124 | << "Line" 125 | << lineNumber 126 | << message; 127 | } 128 | 129 | if (level == QWebEnginePage::ErrorMessageLevel) { 130 | qDebug() << sourceID 131 | << "Line" 132 | << lineNumber 133 | << message; 134 | } 135 | } 136 | 137 | // Disable JavaScript Alert: 138 | virtual void javaScriptAlert(const QUrl &url, const QString &msg) 139 | override 140 | { 141 | Q_UNUSED(url); 142 | Q_UNUSED(msg); 143 | 144 | qInfo() << "JavaScript Alert is disabled."; 145 | } 146 | 147 | // Disable JavaScript Confirm: 148 | virtual bool javaScriptConfirm(const QUrl &url, const QString &msg) 149 | override 150 | { 151 | Q_UNUSED(url); 152 | Q_UNUSED(msg); 153 | 154 | qInfo() << "JavaScript Confirm is disabled."; 155 | 156 | return false; 157 | } 158 | 159 | // Disable JavaScript Prompt: 160 | virtual bool javaScriptPrompt(const QUrl &url, 161 | const QString &msg, 162 | const QString &defaultValue, 163 | QString *result) 164 | override 165 | { 166 | Q_UNUSED(url); 167 | Q_UNUSED(msg); 168 | Q_UNUSED(defaultValue); 169 | Q_UNUSED(result); 170 | 171 | qInfo() << "JavaScript Prompt is disabled."; 172 | 173 | return false; 174 | } 175 | 176 | public: 177 | 178 | QPage(); 179 | 180 | }; 181 | 182 | #endif // PAGE_H 183 | -------------------------------------------------------------------------------- /src/peb.pro: -------------------------------------------------------------------------------- 1 | # Perl Executing Browser QtWebEngine Project File 2 | 3 | # This program is free software; 4 | # you can redistribute it and/or modify it under the terms of the 5 | # GNU Lesser General Public License, 6 | # as published by the Free Software Foundation; 7 | # either version 3 of the License, or (at your option) any later version. 8 | # This program is distributed in the hope that it will be useful, 9 | # but WITHOUT ANY WARRANTY; 10 | # without even the implied warranty of MERCHANTABILITY or 11 | # FITNESS FOR A PARTICULAR PURPOSE. 12 | # Dimitar D. Mitov, 2013 - 2024 13 | # Valcho Nedelchev, 2014 - 2016 14 | # https://github.com/ddmitov/perl-executing-browser 15 | 16 | lessThan (QT_MAJOR_VERSION, 5) { 17 | error ("Perl Executing Browser QtWebEngine requires minimal Qt version 5.9.") 18 | } 19 | 20 | lessThan (QT_MINOR_VERSION, 9) { 21 | error ("Perl Executing Browser QtWebEngine requires minimal Qt version 5.9.") 22 | } 23 | 24 | # Binary basics: 25 | CONFIG += release 26 | TEMPLATE = app 27 | TARGET = peb 28 | 29 | # HTML engine: 30 | QT += widgets webenginewidgets 31 | 32 | # Source files: 33 | SOURCES += \ 34 | main.cpp \ 35 | window.cpp \ 36 | script-handler.cpp \ 37 | page.cpp \ 38 | view.cpp 39 | 40 | # Header files: 41 | HEADERS += \ 42 | script-handler.h \ 43 | window.h \ 44 | page.h \ 45 | view.h 46 | 47 | # Resources: 48 | RESOURCES += resources/peb.qrc 49 | 50 | # Destination directory for the compiled binary: 51 | DESTDIR = $$PWD/../ 52 | 53 | # Temporary folder: 54 | MOC_DIR = tmp 55 | OBJECTS_DIR = tmp 56 | RCC_DIR = tmp 57 | -------------------------------------------------------------------------------- /src/resources/camel.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ddmitov/perl-executing-browser/66508dc90c756228db6ce32d80187363bb9872f2/src/resources/camel.png -------------------------------------------------------------------------------- /src/resources/peb.qrc: -------------------------------------------------------------------------------- 1 | 2 | 3 | camel.png 4 | 5 | 6 | -------------------------------------------------------------------------------- /src/script-handler.cpp: -------------------------------------------------------------------------------- 1 | /* 2 | Perl Executing Browser QtWebEngine 3 | 4 | This program is free software; 5 | you can redistribute it and/or modify it under the terms of the 6 | GNU Lesser General Public License, 7 | as published by the Free Software Foundation; 8 | either version 3 of the License, or (at your option) any later version. 9 | This program is distributed in the hope that it will be useful, 10 | but WITHOUT ANY WARRANTY; 11 | without even the implied warranty of MERCHANTABILITY or 12 | FITNESS FOR A PARTICULAR PURPOSE. 13 | Dimitar D. Mitov, 2013 - 2024 14 | Valcho Nedelchev, 2014 - 2016 15 | https://github.com/ddmitov/perl-executing-browser 16 | */ 17 | 18 | #include 19 | #include 20 | #include 21 | 22 | #include "script-handler.h" 23 | 24 | // ============================== 25 | // SCRIPT HANDLER CONSTRUCTOR 26 | // ============================== 27 | QScriptHandler::QScriptHandler(QString scriptId, QJsonObject scriptJsonObject) 28 | : QObject(0) 29 | { 30 | // Script ID: 31 | id = scriptId; 32 | 33 | // Script full path: 34 | QString scriptFullFilePath = 35 | qApp->property("appDir").toString() + "/" + 36 | scriptJsonObject["scriptRelativePath"].toString(); 37 | 38 | // Signals and slots for script STDOUT and STDERR: 39 | QObject::connect( 40 | &process, 41 | SIGNAL(readyReadStandardOutput()), 42 | this, 43 | SLOT(qScriptOutputSlot()) 44 | ); 45 | 46 | QObject::connect( 47 | &process, 48 | SIGNAL(readyReadStandardError()), 49 | this, 50 | SLOT(qScriptErrorsSlot()) 51 | ); 52 | 53 | // Script working directory: 54 | process.setWorkingDirectory(qApp->property("appDir").toString()); 55 | 56 | // Perl interpreter: 57 | QString perlInterpreterSetting = 58 | scriptJsonObject["perlInterpreter"].toString(); 59 | 60 | QString perlInterpreter; 61 | 62 | if (perlInterpreterSetting.length() > 0) { 63 | perlInterpreter = 64 | qApp->property("appDir").toString() + '/' + 65 | scriptJsonObject["perlInterpreter"].toString(); 66 | } 67 | 68 | if (perlInterpreterSetting.length() == 0) { 69 | perlInterpreter = "perl"; 70 | } 71 | 72 | // Start script: 73 | process.start( 74 | perlInterpreter, 75 | QStringList() << scriptFullFilePath, 76 | QProcess::Unbuffered | QProcess::ReadWrite 77 | ); 78 | 79 | // Get script input, if any: 80 | QString scriptInput = scriptJsonObject["scriptInput"].toString(); 81 | 82 | // Define regular expressions for file and directory selection tags: 83 | QStringList tags; 84 | 85 | tags.append("(\\{\"(existing-file)\":\"([a-zA-Z0-9\\s]{1,})\"\\})"); 86 | tags.append("(\\{\"(new-file)\":\"([a-zA-Z0-9\\s]{1,})\"\\})"); 87 | tags.append("(\\{\"(directory)\":\"([a-zA-Z0-9\\s]{1,})\"\\})"); 88 | 89 | // Process script input, if any: 90 | if (scriptInput.length() > 0) { 91 | // Replace file and directory selection tags 92 | // with user-selected files and directories: 93 | foreach (QString tag, tags) { 94 | QRegularExpression tagRegExp(tag); 95 | 96 | QRegularExpressionMatchIterator regExpIterator = 97 | tagRegExp.globalMatch(scriptInput); 98 | 99 | while (regExpIterator.hasNext()) { 100 | QRegularExpressionMatch match = regExpIterator.next(); 101 | 102 | QString extractedTag = match.captured(1); 103 | QString inputType = match.captured(2); 104 | QString dialogTitle = match.captured(3); 105 | 106 | QString replacement = displayInodeDialog( 107 | inputType, 108 | dialogTitle 109 | ); 110 | 111 | scriptInput.replace( 112 | scriptInput.indexOf(extractedTag), 113 | extractedTag.size(), 114 | replacement 115 | ); 116 | } 117 | } 118 | 119 | // Write script input to script STDIN: 120 | if (process.isOpen()) { 121 | process.write(scriptInput.toUtf8()); 122 | process.write(QString("\n").toLatin1()); 123 | } 124 | } 125 | } 126 | -------------------------------------------------------------------------------- /src/script-handler.h: -------------------------------------------------------------------------------- 1 | /* 2 | Perl Executing Browser QtWebEngine 3 | 4 | This program is free software; 5 | you can redistribute it and/or modify it under the terms of the 6 | GNU Lesser General Public License, 7 | as published by the Free Software Foundation; 8 | either version 3 of the License, or (at your option) any later version. 9 | This program is distributed in the hope that it will be useful, 10 | but WITHOUT ANY WARRANTY; 11 | without even the implied warranty of MERCHANTABILITY or 12 | FITNESS FOR A PARTICULAR PURPOSE. 13 | Dimitar D. Mitov, 2013 - 2024 14 | Valcho Nedelchev, 2014 - 2016 15 | https://github.com/ddmitov/perl-executing-browser 16 | */ 17 | 18 | #ifndef SCRIPT_HANDLER_H 19 | #define SCRIPT_HANDLER_H 20 | 21 | #include 22 | #include 23 | #include 24 | #include 25 | 26 | // ============================== 27 | // SCRIPT HANDLER 28 | // ============================== 29 | class QScriptHandler : public QObject 30 | { 31 | Q_OBJECT 32 | 33 | signals: 34 | 35 | void displayScriptOutputSignal(QString id, QString output); 36 | 37 | public slots: 38 | 39 | // Filesystem dialogs: 40 | QString displayInodeDialog(QString inputType, QString dialogTitle) 41 | { 42 | QFileDialog inodesDialog(qApp->activeWindow()); 43 | 44 | inodesDialog.setParent(qApp->activeWindow()); 45 | inodesDialog.setOption(QFileDialog::DontUseNativeDialog); 46 | inodesDialog.setWindowModality(Qt::WindowModal); 47 | inodesDialog.setViewMode(QFileDialog::Detail); 48 | 49 | inodesDialog.setWindowTitle(dialogTitle); 50 | 51 | if (inputType == "existing-file") { 52 | inodesDialog.setFileMode(QFileDialog::AnyFile); 53 | } 54 | 55 | if (inputType == "new-file") { 56 | inodesDialog.setAcceptMode(QFileDialog::AcceptSave); 57 | } 58 | 59 | if (inputType == "directory") { 60 | inodesDialog.setFileMode(QFileDialog::Directory); 61 | } 62 | 63 | QString selectedInode; 64 | 65 | if (inodesDialog.exec()) { 66 | QStringList selectedInodes = inodesDialog.selectedFiles(); 67 | 68 | if (selectedInodes.isEmpty()) { 69 | selectedInode = ""; 70 | } 71 | 72 | if (!selectedInodes.isEmpty()) { 73 | selectedInode = selectedInodes[0]; 74 | } 75 | } 76 | 77 | inodesDialog.close(); 78 | inodesDialog.deleteLater(); 79 | 80 | return selectedInode; 81 | } 82 | 83 | // Perl script STDOUT slot: 84 | void qScriptOutputSlot() 85 | { 86 | QString scriptOutput = process.readAllStandardOutput(); 87 | 88 | emit displayScriptOutputSignal(this->id, scriptOutput); 89 | } 90 | 91 | // Perl script STDERR slot: 92 | void qScriptErrorsSlot() 93 | { 94 | QString scriptError = process.readAllStandardError(); 95 | 96 | scriptError.replace("\"", " "); 97 | scriptError.replace("\n", " "); 98 | 99 | qDebug() << scriptError; 100 | } 101 | 102 | private: 103 | 104 | QString id; 105 | 106 | public: 107 | 108 | QScriptHandler(QString, QJsonObject); 109 | 110 | QProcess process; 111 | }; 112 | 113 | #endif // SCRIPT_HANDLER_H 114 | -------------------------------------------------------------------------------- /src/view.cpp: -------------------------------------------------------------------------------- 1 | /* 2 | Perl Executing Browser QtWebEngine 3 | 4 | This program is free software; 5 | you can redistribute it and/or modify it under the terms of the 6 | GNU Lesser General Public License, 7 | as published by the Free Software Foundation; 8 | either version 3 of the License, or (at your option) any later version. 9 | This program is distributed in the hope that it will be useful, 10 | but WITHOUT ANY WARRANTY; 11 | without even the implied warranty of MERCHANTABILITY or 12 | FITNESS FOR A PARTICULAR PURPOSE. 13 | Dimitar D. Mitov, 2013 - 2024 14 | Valcho Nedelchev, 2014 - 2016 15 | https://github.com/ddmitov/perl-executing-browser 16 | */ 17 | 18 | #include 19 | 20 | // ============================== 21 | // VIEW CLASS CONSTRUCTOR 22 | // ============================== 23 | QViewWidget::QViewWidget() 24 | : QWebEngineView(0) 25 | { 26 | mainPage = new QPage(); 27 | 28 | setPage(mainPage); 29 | } 30 | -------------------------------------------------------------------------------- /src/view.h: -------------------------------------------------------------------------------- 1 | /* 2 | Perl Executing Browser QtWebEngine 3 | 4 | This program is free software; 5 | you can redistribute it and/or modify it under the terms of the 6 | GNU Lesser General Public License, 7 | as published by the Free Software Foundation; 8 | either version 3 of the License, or (at your option) any later version. 9 | This program is distributed in the hope that it will be useful, 10 | but WITHOUT ANY WARRANTY; 11 | without even the implied warranty of MERCHANTABILITY or 12 | FITNESS FOR A PARTICULAR PURPOSE. 13 | Dimitar D. Mitov, 2013 - 2024 14 | Valcho Nedelchev, 2014 - 2016 15 | https://github.com/ddmitov/perl-executing-browser 16 | */ 17 | 18 | #ifndef VIEW_H 19 | #define VIEW_H 20 | 21 | #include 22 | #include 23 | #include 24 | #include 25 | 26 | #include "page.h" 27 | 28 | // ============================== 29 | // VIEW CLASS DEFINITION 30 | // ============================== 31 | class QViewWidget : public QWebEngineView 32 | { 33 | Q_OBJECT 34 | 35 | public slots: 36 | 37 | // Context menu: 38 | void contextMenuEvent(QContextMenuEvent *event) 39 | { 40 | QWebEngineContextMenuData contextMenuTest = 41 | QWebEngineView::page()->contextMenuData(); 42 | 43 | Q_ASSERT(contextMenuTest.isValid()); 44 | 45 | if (!contextMenuTest.isContentEditable()) { 46 | if (contextMenuTest.selectedText().length() > 0) { 47 | QMenu menu; 48 | 49 | QAction *copyAct = menu.addAction(QString("Copy")); 50 | 51 | QObject::connect( 52 | copyAct, 53 | SIGNAL(triggered()), 54 | this, 55 | SLOT(qCopyAction()) 56 | ); 57 | 58 | menu.exec(mapToGlobal(event->pos())); 59 | this->focusWidget(); 60 | } 61 | } 62 | 63 | if (contextMenuTest.isContentEditable()) { 64 | QMenu menu; 65 | 66 | QAction *cutAct = menu.addAction(QString("Cut")); 67 | 68 | QObject::connect( 69 | cutAct, 70 | SIGNAL(triggered()), 71 | this, 72 | SLOT(qCutAction()) 73 | ); 74 | 75 | QAction *copyAct = menu.addAction(QString("Copy")); 76 | 77 | QObject::connect( 78 | copyAct, 79 | SIGNAL(triggered()), 80 | this, 81 | SLOT(qCopyAction()) 82 | ); 83 | 84 | QAction *pasteAct = menu.addAction(QString("Paste")); 85 | 86 | QObject::connect( 87 | pasteAct, 88 | SIGNAL(triggered()), 89 | this, 90 | SLOT(qPasteAction()) 91 | ); 92 | 93 | QAction *selectAllAct = menu.addAction(QString("Select All")); 94 | 95 | QObject::connect( 96 | selectAllAct, 97 | SIGNAL(triggered()), 98 | this, 99 | SLOT(qSelectAllAction()) 100 | ); 101 | 102 | menu.exec(mapToGlobal(event->pos())); 103 | 104 | this->focusWidget(); 105 | } 106 | } 107 | 108 | // Context menu Cut action: 109 | void qCutAction() 110 | { 111 | QViewWidget::triggerPageAction(QWebEnginePage::Cut); 112 | } 113 | 114 | // Context menu Copy action: 115 | void qCopyAction() 116 | { 117 | QViewWidget::triggerPageAction(QWebEnginePage::Copy); 118 | } 119 | 120 | // Context menu Paste action: 121 | void qPasteAction() 122 | { 123 | QViewWidget::triggerPageAction(QWebEnginePage::Paste); 124 | } 125 | 126 | // Context menu Select All action: 127 | void qSelectAllAction() 128 | { 129 | QViewWidget::triggerPageAction(QWebEnginePage::SelectAll); 130 | } 131 | 132 | public: 133 | 134 | QViewWidget(); 135 | 136 | private: 137 | 138 | QPage *mainPage; 139 | }; 140 | 141 | #endif // VIEW_H 142 | -------------------------------------------------------------------------------- /src/window.cpp: -------------------------------------------------------------------------------- 1 | /* 2 | Perl Executing Browser QtWebEngine 3 | 4 | This program is free software; 5 | you can redistribute it and/or modify it under the terms of the 6 | GNU Lesser General Public License, 7 | as published by the Free Software Foundation; 8 | either version 3 of the License, or (at your option) any later version. 9 | This program is distributed in the hope that it will be useful, 10 | but WITHOUT ANY WARRANTY; 11 | without even the implied warranty of MERCHANTABILITY or 12 | FITNESS FOR A PARTICULAR PURPOSE. 13 | Dimitar D. Mitov, 2013 - 2024 14 | Valcho Nedelchev, 2014 - 2016 15 | https://github.com/ddmitov/perl-executing-browser 16 | */ 17 | 18 | #include "window.h" 19 | 20 | // ============================== 21 | // MAIN WINDOW CLASS CONSTRUCTOR 22 | // ============================== 23 | QMainBrowserWindow::QMainBrowserWindow(QWidget *parent) 24 | : QMainWindow(parent) 25 | { 26 | mainViewWidget = new QViewWidget(); 27 | 28 | setCentralWidget(mainViewWidget); 29 | showMaximized(); 30 | 31 | // Signal and slot for setting the title of the main window: 32 | QObject::connect( 33 | this->mainViewWidget, 34 | SIGNAL(titleChanged(QString)), 35 | this, 36 | SLOT(qSetMainWindowTitleSlot(QString)) 37 | ); 38 | } 39 | -------------------------------------------------------------------------------- /src/window.h: -------------------------------------------------------------------------------- 1 | /* 2 | Perl Executing Browser QtWebEngine 3 | 4 | This program is free software; 5 | you can redistribute it and/or modify it under the terms of the 6 | GNU Lesser General Public License, 7 | as published by the Free Software Foundation; 8 | either version 3 of the License, or (at your option) any later version. 9 | This program is distributed in the hope that it will be useful, 10 | but WITHOUT ANY WARRANTY; 11 | without even the implied warranty of MERCHANTABILITY or 12 | FITNESS FOR A PARTICULAR PURPOSE. 13 | Dimitar D. Mitov, 2013 - 2024 14 | Valcho Nedelchev, 2014 - 2016 15 | https://github.com/ddmitov/perl-executing-browser 16 | */ 17 | 18 | #ifndef MAIN_WINDOW_H 19 | #define MAIN_WINDOW_H 20 | 21 | #include 22 | 23 | #include "view.h" 24 | 25 | // ============================== 26 | // MAIN WINDOW CLASS DEFINITION 27 | // ============================== 28 | class QMainBrowserWindow : public QMainWindow 29 | { 30 | Q_OBJECT 31 | 32 | public slots: 33 | 34 | // Slot for setting the title of the main window: 35 | void qSetMainWindowTitleSlot(QString title) 36 | { 37 | setWindowTitle(title); 38 | } 39 | 40 | // Main window close event slot: 41 | void closeEvent(QCloseEvent *event) 42 | { 43 | this->mainViewWidget->page()->deleteLater(); 44 | event->accept(); 45 | } 46 | 47 | public: 48 | 49 | QWebEngineView *mainViewWidget; 50 | 51 | explicit QMainBrowserWindow(QWidget *parent = 0); 52 | }; 53 | 54 | #endif // MAIN_WINDOW_H 55 | --------------------------------------------------------------------------------