diff --git a/FAQ.asciidoc b/FAQ.asciidoc index 734ae01eb..29f4cf5e4 100644 --- a/FAQ.asciidoc +++ b/FAQ.asciidoc @@ -1,5 +1,6 @@ Frequently asked questions ========================== +:title: Frequently asked questions The Compiler [qanda] diff --git a/MANIFEST.in b/MANIFEST.in index 1e7730676..8b987bac6 100644 --- a/MANIFEST.in +++ b/MANIFEST.in @@ -17,6 +17,7 @@ include requirements.txt include tox.ini include qutebrowser.py +prune www prune scripts/dev exclude scripts/asciidoc2html.py exclude doc/notes diff --git a/README.asciidoc b/README.asciidoc index d722f152a..bc2760d83 100644 --- a/README.asciidoc +++ b/README.asciidoc @@ -6,6 +6,7 @@ qutebrowser =========== +// QUTE_WEB_HIDE image:icons/qutebrowser-64x64.png[qutebrowser logo] *A keyboard-driven, vim-like browser based on PyQt5 and QtWebKit.* image:https://img.shields.io/pypi/l/qutebrowser.svg?style=flat["license badge",link="https://github.com/The-Compiler/qutebrowser/blob/master/COPYING"] @@ -14,6 +15,7 @@ image:https://img.shields.io/github/issues/The-Compiler/qutebrowser.svg?style=fl image:https://requires.io/github/The-Compiler/qutebrowser/requirements.svg?branch=master["requirements badge",link="https://requires.io/github/The-Compiler/qutebrowser/requirements/?branch=master"] image:https://travis-ci.org/The-Compiler/qutebrowser.svg?branch=master["Build Status", link="https://travis-ci.org/The-Compiler/qutebrowser"] image:https://ci.appveyor.com/api/projects/status/9gmnuip6i1oq7046?svg=true["AppVeyor build status", link="https://ci.appveyor.com/project/The-Compiler/qutebrowser"] +// QUTE_WEB_HIDE_END qutebrowser is a keyboard-focused browser with a minimal GUI. It's based on Python, PyQt5 and QtWebKit and free software, licensed under the GPL. @@ -24,7 +26,7 @@ Screenshots ----------- image:doc/img/main.png["screenshot 1",width=300,link="doc/img/main.png"] -image:doc/img/downloads.png["screenshot 2",width=300j,link="doc/img/downloads.png"] +image:doc/img/downloads.png["screenshot 2",width=300,link="doc/img/downloads.png"] image:doc/img/completion.png["screenshot 3",width=300,link="doc/img/completion.png"] image:doc/img/hints.png["screenshot 4",width=300,link="doc/img/hints.png"] diff --git a/scripts/asciidoc2html.py b/scripts/asciidoc2html.py index 707a780c9..b22dfd8f8 100755 --- a/scripts/asciidoc2html.py +++ b/scripts/asciidoc2html.py @@ -20,60 +20,214 @@ """Generate the html documentation based on the asciidoc files.""" +import re import os import os.path import sys import subprocess import glob +import shutil +import tempfile import argparse +import io sys.path.insert(0, os.path.join(os.path.dirname(__file__), os.pardir)) from scripts import utils -def _get_asciidoc_cmd(args): - """Try to find out what commandline to use to invoke asciidoc.""" - if args.asciidoc is not None: - return args.asciidoc +class AsciiDoc: - try: - subprocess.call(['asciidoc'], stdout=subprocess.DEVNULL, - stderr=subprocess.DEVNULL) - except OSError: - pass - else: - return ['asciidoc'] + """Abstraction of an asciidoc subprocess.""" - try: - subprocess.call(['asciidoc.py'], stdout=subprocess.DEVNULL, - stderr=subprocess.DEVNULL) - except OSError: - pass - else: - return ['asciidoc.py'] + FILES = [ + ('FAQ.asciidoc', 'qutebrowser/html/doc/FAQ.html'), + ('CHANGELOG.asciidoc', 'qutebrowser/html/doc/CHANGELOG.html'), + ('doc/quickstart.asciidoc', 'qutebrowser/html/doc/quickstart.html'), + ('doc/userscripts.asciidoc', 'qutebrowser/html/doc/userscripts.html'), + ] - raise FileNotFoundError + def __init__(self, args): + self._cmd = None + self._args = args + self._homedir = None + self._themedir = None + self._tempdir = None + self._failed = False + + def prepare(self): + """Get the asciidoc command and create the homedir to use.""" + self._cmd = self._get_asciidoc_cmd() + self._homedir = tempfile.mkdtemp() + self._themedir = os.path.join( + self._homedir, '.asciidoc', 'themes', 'qute') + self._tempdir = os.path.join(self._homedir, 'tmp') + os.makedirs(self._tempdir) + os.makedirs(self._themedir) + + def cleanup(self): + """Clean up the temporary home directory for asciidoc.""" + if self._homedir is not None and not self._failed: + shutil.rmtree(self._homedir) + + def build(self): + if self._args.website: + self._build_website() + else: + self._build_docs() + + def _build_docs(self): + """Render .asciidoc files to .html sites.""" + files = self.FILES[:] + for src in glob.glob('doc/help/*.asciidoc'): + name, _ext = os.path.splitext(os.path.basename(src)) + dst = 'qutebrowser/html/doc/{}.html'.format(name) + files.append((src, dst)) + for src, dst in files: + self.call(src, dst) -def call_asciidoc(args, src, dst): - """Call asciidoc for the given files. + def _build_website_file(self, root, filename): + """Build a single website file.""" + # pylint: disable=too-many-locals + src = os.path.join(root, filename) + src_basename = os.path.basename(src) + parts = [self._args.website[0]] + dirname = os.path.dirname(src) + if dirname: + parts.append(os.path.relpath(os.path.dirname(src))) + parts.append( + os.extsep.join((os.path.splitext(src_basename)[0], + 'html'))) + dst = os.path.join(*parts) + os.makedirs(os.path.dirname(dst), exist_ok=True) - Args: - args: The asciidoc binary to use, as a list. - src: The source .asciidoc file. - dst: The destination .html file, or None to auto-guess. - """ - print("Calling asciidoc for {}...".format(os.path.basename(src))) - args = args[:] - if dst is not None: - args += ['--out-file', dst] - args.append(src) - try: - subprocess.check_call(args) - except (subprocess.CalledProcessError, OSError) as e: - utils.print_col(str(e), 'red') - sys.exit(1) + modified_src = os.path.join(self._tempdir, src_basename) + shutil.copy('www/header.asciidoc', modified_src) + + outfp = io.StringIO() + + with open(modified_src, 'r', encoding='utf-8') as header_file: + header = header_file.read() + header += "\n\n" + + with open(src, 'r', encoding='utf-8') as infp: + outfp.write("\n\n") + hidden = False + found_title = False + title = "" + last_line = "" + + for line in infp: + if line.strip() == '// QUTE_WEB_HIDE': + assert not hidden + hidden = True + elif line.strip() == '// QUTE_WEB_HIDE_END': + assert hidden + hidden = False + elif line == "The Compiler \n": + continue + elif re.match(r'^:\w+:.*', line): + # asciidoc field + continue + + if not found_title: + if re.match(r'^=+$', line): + line = line.replace('=', '-') + found_title = True + title = last_line + "=" * (len(last_line) - 1) + elif re.match(r'^= .+', line): + line = '==' + line[1:] + found_title = True + title = last_line + "=" * (len(last_line) - 1) + + if not hidden: + outfp.write(line.replace(".asciidoc[", ".html[")) + last_line = line + + current_lines = outfp.getvalue() + outfp.close() + + with open(modified_src, 'w+', encoding='utf-8') as final_version: + final_version.write(title + "\n\n" + header + current_lines) + + self.call(modified_src, dst, '--theme=qute') + + def _build_website(self): + """Prepare and build the website.""" + theme_file = os.path.abspath(os.path.join('www', 'qute.css')) + shutil.copy(theme_file, self._themedir) + + outdir = self._args.website[0] + + for root, _dirs, files in os.walk(os.getcwd()): + for filename in files: + basename, ext = os.path.splitext(filename) + if (ext != '.asciidoc' or + basename in ('header', 'OpenSans-License')): + continue + self._build_website_file(root, filename) + + copy = {'icons': 'icons', 'doc/img': 'doc/img', 'www/media': 'media/'} + + for src, dest in copy.items(): + full_dest = os.path.join(outdir, dest) + try: + shutil.rmtree(full_dest) + except FileNotFoundError: + pass + shutil.copytree(src, full_dest) + + try: + os.symlink('README.html', os.path.join(outdir, 'index.html')) + except FileExistsError: + pass + + def _get_asciidoc_cmd(self): + """Try to find out what commandline to use to invoke asciidoc.""" + if self._args.asciidoc is not None: + return self._args.asciidoc + + try: + subprocess.call(['asciidoc'], stdout=subprocess.DEVNULL, + stderr=subprocess.DEVNULL) + except OSError: + pass + else: + return ['asciidoc'] + + try: + subprocess.call(['asciidoc.py'], stdout=subprocess.DEVNULL, + stderr=subprocess.DEVNULL) + except OSError: + pass + else: + return ['asciidoc.py'] + + raise FileNotFoundError + + def call(self, src, dst, *args): + """Call asciidoc for the given files. + + Args: + src: The source .asciidoc file. + dst: The destination .html file, or None to auto-guess. + *args: Additional arguments passed to asciidoc. + """ + print("Calling asciidoc for {}...".format(os.path.basename(src))) + cmdline = self._cmd[:] + if dst is not None: + cmdline += ['--out-file', dst] + cmdline += args + cmdline.append(src) + try: + subprocess.check_call(cmdline, env={'HOME': self._homedir}) + self._failed = True + except (subprocess.CalledProcessError, OSError) as e: + self._failed = True + utils.print_col(str(e), 'red') + print("Keeping modified sources in {}.".format(self._homedir)) + sys.exit(1) def main(colors=False): @@ -81,53 +235,31 @@ def main(colors=False): utils.change_cwd() utils.use_color = colors parser = argparse.ArgumentParser() - parser.add_argument('--all', help="Build all documentation into a given " + parser.add_argument('--website', help="Build website into a given " "directory.", nargs=1) parser.add_argument('--asciidoc', help="Full path to python and " "asciidoc.py. If not given, it's searched in PATH.", nargs=2, required=False, metavar=('PYTHON', 'ASCIIDOC')) args = parser.parse_args() - asciidoc_files = [ - ('FAQ.asciidoc', 'qutebrowser/html/doc/FAQ.html'), - ('CHANGELOG.asciidoc', 'qutebrowser/html/doc/CHANGELOG.html'), - ('doc/quickstart.asciidoc', 'qutebrowser/html/doc/quickstart.html'), - ('doc/userscripts.asciidoc', 'qutebrowser/html/doc/userscripts.html'), - ] try: os.mkdir('qutebrowser/html/doc') except FileExistsError: pass + + asciidoc = AsciiDoc(args) try: - asciidoc = _get_asciidoc_cmd(args) + asciidoc.prepare() except FileNotFoundError: utils.print_col("Could not find asciidoc! Please install it, or use " "the --asciidoc argument to point this script to the " "correct python/asciidoc.py location!", 'red') sys.exit(1) - if args.all: - for root, _dirs, files in os.walk(os.getcwd()): - for filename in files: - if os.path.splitext(filename)[1] != '.asciidoc': - continue - src = os.path.join(root, filename) - parts = [args.all[0]] - dirname = os.path.dirname(src) - if dirname: - parts.append(os.path.relpath(os.path.dirname(src))) - parts.append( - os.extsep.join((os.path.splitext(os.path.basename(src))[0], - 'html'))) - dst = os.path.join(*parts) - os.makedirs(os.path.dirname(dst), exist_ok=True) - call_asciidoc(asciidoc, src, dst) - else: - for src in glob.glob('doc/help/*.asciidoc'): - name, _ext = os.path.splitext(os.path.basename(src)) - dst = 'qutebrowser/html/doc/{}.html'.format(name) - asciidoc_files.append((src, dst)) - for src, dst in asciidoc_files: - call_asciidoc(asciidoc, src, dst) + + try: + asciidoc.build() + finally: + asciidoc.cleanup() if __name__ == '__main__': diff --git a/www/header.asciidoc b/www/header.asciidoc new file mode 100644 index 000000000..c0e8afbd2 --- /dev/null +++ b/www/header.asciidoc @@ -0,0 +1,17 @@ ++++ +
+ +
+

qutebrowser

+ A keyboard-driven browser. +
+
+ ++++ diff --git a/www/media/OpenSans-Bold.woff2 b/www/media/OpenSans-Bold.woff2 new file mode 100644 index 000000000..be4c25b42 Binary files /dev/null and b/www/media/OpenSans-Bold.woff2 differ diff --git a/www/media/OpenSans-License.asciidoc b/www/media/OpenSans-License.asciidoc new file mode 100644 index 000000000..eee8aa73c --- /dev/null +++ b/www/media/OpenSans-License.asciidoc @@ -0,0 +1,255 @@ +License notice for both OpenSans font files +=========================================== + +Open Sans font by https://www.google.com/fonts/specimen/Open+Sans[Google], licensed under the http://www.apache.org/licenses/LICENSE-2.0.html[Apache 2.0] license. + +[options="header"] +|================================================================================= +|File |Copyright +|`OpenSans-Regular.woff2` |Digitized data copyright 2010-2011, Google Corporation. +|`OpenSans-Bold.woff2` |Digitized data copyright 2010-2011, Google Corporation. +|================================================================================= + + +MANIFEST.json +------------- + +Here's an excerpt of the https://github.com/google/fonts/blob/master/apache/opensans/METADATA.json[MANIFEST.json] file +from https://github.com/google/fonts/blob/master/apache/opensans/[the offical repository]: + +---- +{ + "name": "Open Sans", + "designer": "Steve Matteson", + "license": "Apache2", + "visibility": "External", + "category": "Sans Serif", + "size": 113987, + "fonts": [ + { + "name": "Open Sans", + "style": "normal", + "weight": 400, + "filename": "OpenSans-Regular.ttf", + "postScriptName": "OpenSans", + "fullName": "Open Sans", + "copyright": "Digitized data copyright 2010-2011, Google Corporation." + }, + "name": "Open Sans", + "style": "normal", + "weight": 700, + "filename": "OpenSans-Bold.ttf", + "postScriptName": "OpenSans-Bold", + "fullName": "Open Sans Bold", + "copyright": "Digitized data copyright 2010-2011, Google Corporation." + } + ] +} +---- + +The Apache 2.0 License text +--------------------------- + +---- + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +---- \ No newline at end of file diff --git a/www/media/OpenSans-Regular.woff2 b/www/media/OpenSans-Regular.woff2 new file mode 100644 index 000000000..5287058cf Binary files /dev/null and b/www/media/OpenSans-Regular.woff2 differ diff --git a/www/media/favicon.png b/www/media/favicon.png new file mode 100644 index 000000000..7efee9a05 Binary files /dev/null and b/www/media/favicon.png differ diff --git a/www/media/font.css b/www/media/font.css new file mode 100644 index 000000000..c2f216991 --- /dev/null +++ b/www/media/font.css @@ -0,0 +1,11 @@ +@font-face { + font-family: "Open Sans"; + font-weight: normal; + src: url(OpenSans-Regular.woff2) format("woff2"); +} + +@font-face { + font-family: 'Open Sans'; + font-weight: bold; + src: url(OpenSans-Bold.woff2) format("woff2"); +} diff --git a/www/media/qutebrowser.svg b/www/media/qutebrowser.svg new file mode 100644 index 000000000..bf75e2462 --- /dev/null +++ b/www/media/qutebrowser.svg @@ -0,0 +1,211 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + diff --git a/www/qute.css b/www/qute.css new file mode 100644 index 000000000..b8384d7fc --- /dev/null +++ b/www/qute.css @@ -0,0 +1,181 @@ +* { + margin: 0px 0px; + padding: 0px 0px; +} + +body { + font-family: "Open Sans", "Helvetica Neue", Helvetica, Arial, sans-serif; + -webkit-text-size-adjust: none; + color: #333333; +} + +#header { + display: none; +} + +#headline { + background-color: #333333; + padding: 20px 20px; + overflow: auto; + color: #888; + + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; +} + +#headline .qutebrowser-logo { + display: block; + height: 70px; + float: left; +} + +#headline .text { + float: right; + text-align: right; +} + +#headline .text h1 { + color: #1e89c6; + border: none; +} + +#headline .text { + color: #666666; +} + +#menu { + padding: 0px 20px; + background-color: #555555; + color: #CCC; + overflow: auto; + margin-bottom: 10px; + + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; +} + +#menu a { + color: #CCC; + text-decoration: none; + background-color: #555555; + padding: 10px 20px; + float: left; +} + +#menu a:hover { + background-color: #1e89c6; +} + +.sect1 { + padding: 10px 40px; +} + +.sect2 { + padding: 10px 0px; +} + +div.footnote { + padding: 10px 40px; +} + +hr { + margin: 0px 40px; + color: #CCCCCC; +} + +h1, h2, h3, h4, h5, h6 { + color: #0A396E; + margin-bottom: 10px; + border-bottom: 1px solid #CCCCCC; +} + +.ulist { + padding-left: 20px; + margin-top: 10px; +} + +#footer { + padding: 20px 40px; + border-top: 1px solid #CCCCCC; + color: #888888; +} + +a { + color: #1e89c6; + text-decoration: none; +} + +a:hover { + text-decoration: underline; +} + +ol { + margin-left: 20px; + margin-top: 20px; + margin-bottom: 20px; +} + +li { + margin-bottom: 10px; +} + +.hdlist1 { + color: #0A396E; + margin-bottom: 10px; + margin-top: 10px; + border-bottom: 1px solid #CCCCCC; +} + +code { + background-color: #DDDDDD; + border-radius: 2px; +} + +.listingblock { + padding: 10px 10px; + background-color: #DDDDDD; + border-radius: 4px; +} + +table td { + padding: 10px 10px; +} + +@media screen and (max-width: 480px) { + #headline .qutebrowser-logo { + margin-left: auto; + margin-right: auto; + display: block; + width: 30%; + height: auto; + float: none; + } + + #headline .text { + display: none; + } + + #menu { + padding: 0px 0px; + background-color: #555555; + color: #CCC; + overflow: hidden; + width: 100%; + } + + #menu a { + color: #CCC; + text-decoration: none; + background-color: #555555; + width: 100%; + padding: 10px 40px; + } +} + + + + + +