├── .gitignore ├── .travis.yml ├── AUTHORS.rst ├── LICENSE ├── Makefile ├── Procfile ├── README.rst ├── app ├── __init__.py ├── app.py ├── assets │ └── sass │ │ ├── _bootstrap.scss │ │ ├── bootstrap │ │ ├── _alerts.scss │ │ ├── _badges.scss │ │ ├── _breadcrumbs.scss │ │ ├── _button-groups.scss │ │ ├── _buttons.scss │ │ ├── _carousel.scss │ │ ├── _close.scss │ │ ├── _code.scss │ │ ├── _component-animations.scss │ │ ├── _dropdowns.scss │ │ ├── _forms.scss │ │ ├── _glyphicons.scss │ │ ├── _grid.scss │ │ ├── _input-groups.scss │ │ ├── _jumbotron.scss │ │ ├── _labels.scss │ │ ├── _list-group.scss │ │ ├── _media.scss │ │ ├── _mixins.scss │ │ ├── _modals.scss │ │ ├── _navbar.scss │ │ ├── _navs.scss │ │ ├── _normalize.scss │ │ ├── _pager.scss │ │ ├── _pagination.scss │ │ ├── _panels.scss │ │ ├── _popovers.scss │ │ ├── _print.scss │ │ ├── _progress-bars.scss │ │ ├── _responsive-embed.scss │ │ ├── _responsive-utilities.scss │ │ ├── _scaffolding.scss │ │ ├── _tables.scss │ │ ├── _theme.scss │ │ ├── _thumbnails.scss │ │ ├── _tooltip.scss │ │ ├── _type.scss │ │ ├── _utilities.scss │ │ ├── _variables.scss │ │ ├── _wells.scss │ │ └── mixins │ │ │ ├── _alerts.scss │ │ │ ├── _background-variant.scss │ │ │ ├── _border-radius.scss │ │ │ ├── _buttons.scss │ │ │ ├── _center-block.scss │ │ │ ├── _clearfix.scss │ │ │ ├── _forms.scss │ │ │ ├── _gradients.scss │ │ │ ├── _grid-framework.scss │ │ │ ├── _grid.scss │ │ │ ├── _hide-text.scss │ │ │ ├── _image.scss │ │ │ ├── _labels.scss │ │ │ ├── _list-group.scss │ │ │ ├── _nav-divider.scss │ │ │ ├── _nav-vertical-align.scss │ │ │ ├── _opacity.scss │ │ │ ├── _pagination.scss │ │ │ ├── _panels.scss │ │ │ ├── _progress-bar.scss │ │ │ ├── _reset-filter.scss │ │ │ ├── _reset-text.scss │ │ │ ├── _resize.scss │ │ │ ├── _responsive-visibility.scss │ │ │ ├── _size.scss │ │ │ ├── _tab-focus.scss │ │ │ ├── _table-row.scss │ │ │ ├── _text-emphasis.scss │ │ │ ├── _text-overflow.scss │ │ │ └── _vendor-prefixes.scss │ │ └── screen.scss ├── backlinks.py ├── models.py ├── rst.py ├── search.py ├── settings.py ├── static │ ├── favicon.ico │ ├── fonts │ │ └── Consolas.ttf │ └── js │ │ ├── jquery-1.10.2.min.js │ │ └── typeahead.js ├── templates │ ├── _layouts │ │ ├── _base.html │ │ ├── index.html │ │ └── search.html │ ├── article.html │ └── opensearch.xml ├── views.py └── wsgi.py ├── config ├── .gitkeep └── directives.rst ├── docs └── style.rst ├── docutils.conf ├── requirements.txt ├── scripts └── compile_sass.py ├── setup.py ├── tests ├── __init__.py └── test_models.py └── tox.ini /.gitignore: -------------------------------------------------------------------------------- 1 | .DS_STORE 2 | .coverage 3 | .env 4 | .index 5 | .sass-cache/ 6 | .tox 7 | *.egg-info 8 | *.pyc 9 | MANIFEST 10 | 11 | config/index.rst 12 | env 13 | dist/ 14 | node_modules/ 15 | src 16 | src/ 17 | app/static/images 18 | app/static/images/ 19 | app/static/stylesheets/ 20 | config/inverted_index.json 21 | -------------------------------------------------------------------------------- /.travis.yml: -------------------------------------------------------------------------------- 1 | language: python 2 | python: 2.7 3 | env: 4 | - TOX_ENV=py27 5 | install: 6 | - pip install -r requirements.txt 7 | - pip install tox 8 | script: 9 | - tox -e $TOX_ENV 10 | -------------------------------------------------------------------------------- /AUTHORS.rst: -------------------------------------------------------------------------------- 1 | Encyclopedia is written and maintained by Ceasar Bautista and 2 | various contributors: 3 | 4 | Development Lead 5 | ```````````````` 6 | 7 | - Ceasar Bautista 8 | 9 | 10 | Patches and Suggestions 11 | ``````````````````````` 12 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | Copyright (c) 2014 Ceasar Bautista 2 | 3 | Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: 4 | 5 | The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. 6 | 7 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 8 | -------------------------------------------------------------------------------- /Makefile: -------------------------------------------------------------------------------- 1 | .PHONY: clean coverage stylesheets test 2 | 3 | ARCHFLAGS=-Wno-error=unused-command-line-argument-hard-error-in-future 4 | 5 | ENV=env 6 | MODULE=app 7 | # Directory containing input files 8 | SRC = src 9 | INVERTED_INDEX = config/inverted_index.json 10 | 11 | SASS_DIR = app/assets/sass/ 12 | CSS_DIR = app/static/stylesheets/ 13 | 14 | web: $(ENV) $(CSS_DIR) $(INVERTED_INDEX) 15 | . $(ENV)/bin/activate && python app/wsgi.py 16 | 17 | $(ENV): requirements.txt 18 | virtualenv $(ENV) 19 | ifeq ($(OS_NAME),Darwin) 20 | export CFLAGS=-Qunused-arguments 21 | export CPPFLAGS=-Qunused-arguments 22 | endif 23 | . $(ENV)/bin/activate && pip install -r requirements.txt 24 | 25 | $(CSS_DIR): $(SASS_DIR) $(ENV) 26 | . $(ENV)/bin/activate && python ./scripts/compile_sass.py $(SASS_DIR) $(CSS_DIR) 27 | 28 | clean: 29 | rm -r $(CSS_DIR) 30 | 31 | $(INVERTED_INDEX): $(SRC)/* 32 | . $(ENV)/bin/activate && python app/backlinks.py > $(INVERTED_INDEX) 33 | 34 | test: 35 | py.test tests/ 36 | 37 | # Generate a coverage report with line numbers of uncovered lines 38 | coverage: 39 | py.test --verbose --cov-report term-missing --cov=$(MODULE) tests 40 | -------------------------------------------------------------------------------- /Procfile: -------------------------------------------------------------------------------- 1 | web: gunicorn wsgi.py --log-file - 2 | -------------------------------------------------------------------------------- /README.rst: -------------------------------------------------------------------------------- 1 | 2 | .. _AUTHORS: https://github.com/Ceasar/Encyclopedia/blob/master/AUTHORS.rst 3 | .. _figure: http://docutils.sourceforge.net/docs/ref/rst/directives.html#figure 4 | .. _quickref: http://docutils.sourceforge.net/docs/user/rst/quickref.html 5 | .. _reStructedText: http://docutils.sourceforge.net/rst.html 6 | .. _rest: reStructedText_ 7 | .. _Homebrew: http://brew.sh/ 8 | .. _`the repository`: https://github.com/Ceasar/Encyclopedia 9 | .. _`open a fresh issue`: https://github.com/Ceasar/Encyclopedia/issues 10 | 11 | ================================================================================ 12 | Encyclopedia 13 | ================================================================================ 14 | 15 | .. image:: https://travis-ci.org/Ceasar/Encyclopedia.svg 16 | :target: https://travis-ci.org/Ceasar/Encyclopedia 17 | 18 | **Encyclopedia** is a tool that helps you write and maintain a private 19 | hypermedia encyclopedia. 20 | 21 | .. figure:: http://i.imgur.com/J8b6bX3.png 22 | 23 | Benefits 24 | ================================================================================ 25 | 26 | - Save time by eliminating redundancy 27 | 28 | Documents on the same subject tend to be mostly redundant. By writing 29 | hyper-linked notes, you can eliminate this redundancy so that future queries 30 | get straight to the point. 31 | 32 | - Refine your understanding on everything you know 33 | 34 | Encoding ideas forces you to understand them precisely, enabling you to better 35 | explain the topic to others and ask precise questions about what you don't 36 | understand. 37 | 38 | Features 39 | ================================================================================ 40 | 41 | - reStructedText_ (reST) support 42 | 43 | - Document search 44 | 45 | .. figure:: http://i.imgur.com/FXUUSNo.jpg 46 | 47 | Requirements 48 | ================================================================================ 49 | 50 | - Install Homebrew_ 51 | 52 | - Install Python and set up the virtualenv: 53 | 54 | .. code:: bash 55 | 56 | $ brew install python 57 | $ pip install virtualenv 58 | $ make env 59 | 60 | To check if everything is set up correctly, go through Quickstart and try to 61 | ``make web``. 62 | 63 | Quickstart 64 | ================================================================================ 65 | 66 | In this section, we'll go over how to get started with all the major features of 67 | Encyclopedia. 68 | 69 | First, we need to create the index: a mapping from hyperlink anchors to target 70 | HTML files. Simply ``touch config/index.rst`` and then edit it to look like 71 | this:: 72 | 73 | .. _programming language: Programming_language.html 74 | .. _Python: Python.html 75 | 76 | Next, we'll create two reST_ source files: ``src/Python.rst`` and 77 | ``src/Programming_language.rst``. 78 | 79 | ``src/Python.rst`` should look like this:: 80 | 81 | ******************************************************************************** 82 | Python 83 | ******************************************************************************** 84 | 85 | .. figure:: https://www.python.org/static/community_logos/python-logo-master-v3-TM.png 86 | 87 | :Date: 1991 88 | :Developer: Guido van Rossum 89 | :Website: http://www.python.org/ 90 | 91 | **Python** is a `programming language`_ that is interpreted and dynamically 92 | typed. 93 | 94 | .. contents:: 95 | 96 | History 97 | ******************************************************************************** 98 | 99 | Python was created by Guido van Rossum in 1991. 100 | 101 | 102 | ``src/Programming_language.rst`` should look like this:: 103 | 104 | ******************************************************************************** 105 | Programming Language 106 | ******************************************************************************** 107 | 108 | A **programming language** is a formal language for communicating instructions 109 | to a machine. 110 | 111 | For example, Python_. 112 | 113 | .. contents:: 114 | 115 | History 116 | ******************************************************************************** 117 | 118 | The first programming language was FORTRAN (1957), followed by Lisp (1958). 119 | 120 | Next, run: 121 | 122 | .. code:: bash 123 | 124 | $ make web 125 | 126 | This will both compile your source files into HTML and start a small server to 127 | view them. If you need to stop the server, hit control-C. 128 | 129 | Finally, head over to http://localhost:5001 to access the search page. 130 | 131 | .. image:: http://i.imgur.com/B3d3XYQ.png 132 | 133 | Just type in "Python" or "Programming Language" to find your pages. 134 | 135 | .. image:: http://i.imgur.com/Kcd1jhK.png 136 | 137 | At this point, you're ready to start adding your articles. 138 | 139 | Philosophy 140 | ================================================================================ 141 | 142 | This section documents why Encyclopedia is designed the way it is. 143 | 144 | .. figure:: http://i.imgur.com/toZhI3Q.jpg 145 | 146 | Why hyperlinks? 147 | -------------------------------------------------------------------------------- 148 | 149 | Before writing `Encyclopedia` I used an extensive system of Markdown documents 150 | to manage my notes. This system was deeply nested to capture relationships 151 | between ideas. At some point however, they became unmanageable. 152 | 153 | For one, a taxonomy of ideas often makes classification difficult because 154 | certain ideas sit in the intersection of two others (e.g. psycholinguistics is 155 | both a part of psychology and linguistics). To some extent, this can be fixed by 156 | linking files in the filesystem, but doing so is inflexible. 157 | 158 | Further, retrieval becomes difficult, since a file could be in a number of 159 | locations. 160 | 161 | `Encyclopedia` solves both of these problems by forcing everything into a flat 162 | structure. (This risks ambiguity, but it is expected that to a large degree this 163 | will not be the case, given that the encyclopedia is personal, and in the case 164 | that is, names can disambiguated similar to Wikipedia (which appends the domain, 165 | e.g. "Ball (mathematics)").) 166 | 167 | Why reST? 168 | -------------------------------------------------------------------------------- 169 | 170 | Encyclopedia uses reST (as opposed to other markup languages, such as HTML or 171 | Markdown) for a few reasons. 172 | 173 | 1. It is already popular in certain communities, especially the Python community 174 | where it is standard for docs. 175 | 176 | 2. It is both easier to read and write than HTML (too verbose) and Markdown 177 | (the link syntax is verbose, e.g.: ``This is [an example](http://example.com/ 178 | "Title") inline link.``). 179 | 180 | 3. It is more powerful than Markdown. Some important examples: 181 | 182 | - Directives, (e.g. ``contents`` injects a table of contents) 183 | 184 | - Multiple levels of section headers (Markdown supports only ``=`` and ``-`` 185 | and then requires ``#`` prefixes, which are hard to read. reST provides any 186 | non-alphanumeric character. e.g. ``=-`:.'"~^_*+#``) 187 | 188 | Tips 189 | ================================================================================ 190 | 191 | - Expand your knowledge of restructedtext_ with the quickref_. It will take some 192 | getting used to, but in time it should be more natural than writing Markdown. 193 | 194 | - Use the figure_ directive for rendering images; avoid using ``image`` or 195 | setting any attributes to ensure a consist style that can be changed with CSS. 196 | 197 | Contribute 198 | ================================================================================ 199 | 200 | #. Check for open issues or `open a fresh issue`_ to start a discussion 201 | around a feature idea or a bug. 202 | 203 | #. Fork `the repository`_ on GitHub to start making your changes to 204 | the **master** branch (or branch off of it). 205 | 206 | #. Send a pull request and bug the maintainer until it gets merged and 207 | published. :) Make sure to add yourself to AUTHORS_. 208 | -------------------------------------------------------------------------------- /app/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Ceasar/Encyclopedia/88069f240c8c0cb42063fe41dc638350ed9c45ba/app/__init__.py -------------------------------------------------------------------------------- /app/app.py: -------------------------------------------------------------------------------- 1 | from flask import Flask 2 | 3 | from models import Corpus 4 | from views import index, article, open_search, search_view 5 | 6 | from settings import SRC 7 | 8 | 9 | def create_app(): 10 | app = Flask(__name__) 11 | app.corpus = Corpus(SRC) 12 | app.route("/")(index) 13 | app.route("/")(article) 14 | app.route("/opensearch")(open_search) 15 | app.route("/search")(search_view) 16 | return app 17 | -------------------------------------------------------------------------------- /app/assets/sass/_bootstrap.scss: -------------------------------------------------------------------------------- 1 | /*! 2 | * Bootstrap v3.3.7 (http://getbootstrap.com) 3 | * Copyright 2011-2016 Twitter, Inc. 4 | * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) 5 | */ 6 | 7 | // Core variables and mixins 8 | @import "bootstrap/variables"; 9 | @import "bootstrap/mixins"; 10 | 11 | // Reset and dependencies 12 | @import "bootstrap/normalize"; 13 | @import "bootstrap/print"; 14 | @import "bootstrap/glyphicons"; 15 | 16 | // Core CSS 17 | @import "bootstrap/scaffolding"; 18 | @import "bootstrap/type"; 19 | @import "bootstrap/code"; 20 | @import "bootstrap/grid"; 21 | @import "bootstrap/tables"; 22 | @import "bootstrap/forms"; 23 | @import "bootstrap/buttons"; 24 | 25 | // Components 26 | @import "bootstrap/component-animations"; 27 | @import "bootstrap/dropdowns"; 28 | @import "bootstrap/button-groups"; 29 | @import "bootstrap/input-groups"; 30 | @import "bootstrap/navs"; 31 | @import "bootstrap/navbar"; 32 | @import "bootstrap/breadcrumbs"; 33 | @import "bootstrap/pagination"; 34 | @import "bootstrap/pager"; 35 | @import "bootstrap/labels"; 36 | @import "bootstrap/badges"; 37 | @import "bootstrap/jumbotron"; 38 | @import "bootstrap/thumbnails"; 39 | @import "bootstrap/alerts"; 40 | @import "bootstrap/progress-bars"; 41 | @import "bootstrap/media"; 42 | @import "bootstrap/list-group"; 43 | @import "bootstrap/panels"; 44 | @import "bootstrap/responsive-embed"; 45 | @import "bootstrap/wells"; 46 | @import "bootstrap/close"; 47 | 48 | // Components w/ JavaScript 49 | @import "bootstrap/modals"; 50 | @import "bootstrap/tooltip"; 51 | @import "bootstrap/popovers"; 52 | @import "bootstrap/carousel"; 53 | 54 | // Utility classes 55 | @import "bootstrap/utilities"; 56 | @import "bootstrap/responsive-utilities"; 57 | -------------------------------------------------------------------------------- /app/assets/sass/bootstrap/_alerts.scss: -------------------------------------------------------------------------------- 1 | // 2 | // Alerts 3 | // -------------------------------------------------- 4 | 5 | 6 | // Base styles 7 | // ------------------------- 8 | 9 | .alert { 10 | padding: $alert-padding; 11 | margin-bottom: $line-height-computed; 12 | border: 1px solid transparent; 13 | border-radius: $alert-border-radius; 14 | 15 | // Headings for larger alerts 16 | h4 { 17 | margin-top: 0; 18 | // Specified for the h4 to prevent conflicts of changing $headings-color 19 | color: inherit; 20 | } 21 | 22 | // Provide class for links that match alerts 23 | .alert-link { 24 | font-weight: $alert-link-font-weight; 25 | } 26 | 27 | // Improve alignment and spacing of inner content 28 | > p, 29 | > ul { 30 | margin-bottom: 0; 31 | } 32 | 33 | > p + p { 34 | margin-top: 5px; 35 | } 36 | } 37 | 38 | // Dismissible alerts 39 | // 40 | // Expand the right padding and account for the close button's positioning. 41 | 42 | .alert-dismissable, // The misspelled .alert-dismissable was deprecated in 3.2.0. 43 | .alert-dismissible { 44 | padding-right: ($alert-padding + 20); 45 | 46 | // Adjust close link position 47 | .close { 48 | position: relative; 49 | top: -2px; 50 | right: -21px; 51 | color: inherit; 52 | } 53 | } 54 | 55 | // Alternate styles 56 | // 57 | // Generate contextual modifier classes for colorizing the alert. 58 | 59 | .alert-success { 60 | @include alert-variant($alert-success-bg, $alert-success-border, $alert-success-text); 61 | } 62 | 63 | .alert-info { 64 | @include alert-variant($alert-info-bg, $alert-info-border, $alert-info-text); 65 | } 66 | 67 | .alert-warning { 68 | @include alert-variant($alert-warning-bg, $alert-warning-border, $alert-warning-text); 69 | } 70 | 71 | .alert-danger { 72 | @include alert-variant($alert-danger-bg, $alert-danger-border, $alert-danger-text); 73 | } 74 | -------------------------------------------------------------------------------- /app/assets/sass/bootstrap/_badges.scss: -------------------------------------------------------------------------------- 1 | // 2 | // Badges 3 | // -------------------------------------------------- 4 | 5 | 6 | // Base class 7 | .badge { 8 | display: inline-block; 9 | min-width: 10px; 10 | padding: 3px 7px; 11 | font-size: $font-size-small; 12 | font-weight: $badge-font-weight; 13 | color: $badge-color; 14 | line-height: $badge-line-height; 15 | vertical-align: middle; 16 | white-space: nowrap; 17 | text-align: center; 18 | background-color: $badge-bg; 19 | border-radius: $badge-border-radius; 20 | 21 | // Empty badges collapse automatically (not available in IE8) 22 | &:empty { 23 | display: none; 24 | } 25 | 26 | // Quick fix for badges in buttons 27 | .btn & { 28 | position: relative; 29 | top: -1px; 30 | } 31 | 32 | .btn-xs &, 33 | .btn-group-xs > .btn & { 34 | top: 0; 35 | padding: 1px 5px; 36 | } 37 | 38 | // [converter] extracted a& to a.badge 39 | 40 | // Account for badges in navs 41 | .list-group-item.active > &, 42 | .nav-pills > .active > a > & { 43 | color: $badge-active-color; 44 | background-color: $badge-active-bg; 45 | } 46 | 47 | .list-group-item > & { 48 | float: right; 49 | } 50 | 51 | .list-group-item > & + & { 52 | margin-right: 5px; 53 | } 54 | 55 | .nav-pills > li > a > & { 56 | margin-left: 3px; 57 | } 58 | } 59 | 60 | // Hover state, but only for links 61 | a.badge { 62 | &:hover, 63 | &:focus { 64 | color: $badge-link-hover-color; 65 | text-decoration: none; 66 | cursor: pointer; 67 | } 68 | } 69 | -------------------------------------------------------------------------------- /app/assets/sass/bootstrap/_breadcrumbs.scss: -------------------------------------------------------------------------------- 1 | // 2 | // Breadcrumbs 3 | // -------------------------------------------------- 4 | 5 | 6 | .breadcrumb { 7 | padding: $breadcrumb-padding-vertical $breadcrumb-padding-horizontal; 8 | margin-bottom: $line-height-computed; 9 | list-style: none; 10 | background-color: $breadcrumb-bg; 11 | border-radius: $border-radius-base; 12 | 13 | > li { 14 | display: inline-block; 15 | 16 | + li:before { 17 | // [converter] Workaround for https://github.com/sass/libsass/issues/1115 18 | $nbsp: "\00a0"; 19 | content: "#{$breadcrumb-separator}#{$nbsp}"; // Unicode space added since inline-block means non-collapsing white-space 20 | padding: 0 5px; 21 | color: $breadcrumb-color; 22 | } 23 | } 24 | 25 | > .active { 26 | color: $breadcrumb-active-color; 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /app/assets/sass/bootstrap/_button-groups.scss: -------------------------------------------------------------------------------- 1 | // 2 | // Button groups 3 | // -------------------------------------------------- 4 | 5 | // Make the div behave like a button 6 | .btn-group, 7 | .btn-group-vertical { 8 | position: relative; 9 | display: inline-block; 10 | vertical-align: middle; // match .btn alignment given font-size hack above 11 | > .btn { 12 | position: relative; 13 | float: left; 14 | // Bring the "active" button to the front 15 | &:hover, 16 | &:focus, 17 | &:active, 18 | &.active { 19 | z-index: 2; 20 | } 21 | } 22 | } 23 | 24 | // Prevent double borders when buttons are next to each other 25 | .btn-group { 26 | .btn + .btn, 27 | .btn + .btn-group, 28 | .btn-group + .btn, 29 | .btn-group + .btn-group { 30 | margin-left: -1px; 31 | } 32 | } 33 | 34 | // Optional: Group multiple button groups together for a toolbar 35 | .btn-toolbar { 36 | margin-left: -5px; // Offset the first child's margin 37 | @include clearfix; 38 | 39 | .btn, 40 | .btn-group, 41 | .input-group { 42 | float: left; 43 | } 44 | > .btn, 45 | > .btn-group, 46 | > .input-group { 47 | margin-left: 5px; 48 | } 49 | } 50 | 51 | .btn-group > .btn:not(:first-child):not(:last-child):not(.dropdown-toggle) { 52 | border-radius: 0; 53 | } 54 | 55 | // Set corners individual because sometimes a single button can be in a .btn-group and we need :first-child and :last-child to both match 56 | .btn-group > .btn:first-child { 57 | margin-left: 0; 58 | &:not(:last-child):not(.dropdown-toggle) { 59 | @include border-right-radius(0); 60 | } 61 | } 62 | // Need .dropdown-toggle since :last-child doesn't apply, given that a .dropdown-menu is used immediately after it 63 | .btn-group > .btn:last-child:not(:first-child), 64 | .btn-group > .dropdown-toggle:not(:first-child) { 65 | @include border-left-radius(0); 66 | } 67 | 68 | // Custom edits for including btn-groups within btn-groups (useful for including dropdown buttons within a btn-group) 69 | .btn-group > .btn-group { 70 | float: left; 71 | } 72 | .btn-group > .btn-group:not(:first-child):not(:last-child) > .btn { 73 | border-radius: 0; 74 | } 75 | .btn-group > .btn-group:first-child:not(:last-child) { 76 | > .btn:last-child, 77 | > .dropdown-toggle { 78 | @include border-right-radius(0); 79 | } 80 | } 81 | .btn-group > .btn-group:last-child:not(:first-child) > .btn:first-child { 82 | @include border-left-radius(0); 83 | } 84 | 85 | // On active and open, don't show outline 86 | .btn-group .dropdown-toggle:active, 87 | .btn-group.open .dropdown-toggle { 88 | outline: 0; 89 | } 90 | 91 | 92 | // Sizing 93 | // 94 | // Remix the default button sizing classes into new ones for easier manipulation. 95 | 96 | .btn-group-xs > .btn { @extend .btn-xs; } 97 | .btn-group-sm > .btn { @extend .btn-sm; } 98 | .btn-group-lg > .btn { @extend .btn-lg; } 99 | 100 | 101 | // Split button dropdowns 102 | // ---------------------- 103 | 104 | // Give the line between buttons some depth 105 | .btn-group > .btn + .dropdown-toggle { 106 | padding-left: 8px; 107 | padding-right: 8px; 108 | } 109 | .btn-group > .btn-lg + .dropdown-toggle { 110 | padding-left: 12px; 111 | padding-right: 12px; 112 | } 113 | 114 | // The clickable button for toggling the menu 115 | // Remove the gradient and set the same inset shadow as the :active state 116 | .btn-group.open .dropdown-toggle { 117 | @include box-shadow(inset 0 3px 5px rgba(0,0,0,.125)); 118 | 119 | // Show no shadow for `.btn-link` since it has no other button styles. 120 | &.btn-link { 121 | @include box-shadow(none); 122 | } 123 | } 124 | 125 | 126 | // Reposition the caret 127 | .btn .caret { 128 | margin-left: 0; 129 | } 130 | // Carets in other button sizes 131 | .btn-lg .caret { 132 | border-width: $caret-width-large $caret-width-large 0; 133 | border-bottom-width: 0; 134 | } 135 | // Upside down carets for .dropup 136 | .dropup .btn-lg .caret { 137 | border-width: 0 $caret-width-large $caret-width-large; 138 | } 139 | 140 | 141 | // Vertical button groups 142 | // ---------------------- 143 | 144 | .btn-group-vertical { 145 | > .btn, 146 | > .btn-group, 147 | > .btn-group > .btn { 148 | display: block; 149 | float: none; 150 | width: 100%; 151 | max-width: 100%; 152 | } 153 | 154 | // Clear floats so dropdown menus can be properly placed 155 | > .btn-group { 156 | @include clearfix; 157 | > .btn { 158 | float: none; 159 | } 160 | } 161 | 162 | > .btn + .btn, 163 | > .btn + .btn-group, 164 | > .btn-group + .btn, 165 | > .btn-group + .btn-group { 166 | margin-top: -1px; 167 | margin-left: 0; 168 | } 169 | } 170 | 171 | .btn-group-vertical > .btn { 172 | &:not(:first-child):not(:last-child) { 173 | border-radius: 0; 174 | } 175 | &:first-child:not(:last-child) { 176 | @include border-top-radius($btn-border-radius-base); 177 | @include border-bottom-radius(0); 178 | } 179 | &:last-child:not(:first-child) { 180 | @include border-top-radius(0); 181 | @include border-bottom-radius($btn-border-radius-base); 182 | } 183 | } 184 | .btn-group-vertical > .btn-group:not(:first-child):not(:last-child) > .btn { 185 | border-radius: 0; 186 | } 187 | .btn-group-vertical > .btn-group:first-child:not(:last-child) { 188 | > .btn:last-child, 189 | > .dropdown-toggle { 190 | @include border-bottom-radius(0); 191 | } 192 | } 193 | .btn-group-vertical > .btn-group:last-child:not(:first-child) > .btn:first-child { 194 | @include border-top-radius(0); 195 | } 196 | 197 | 198 | // Justified button groups 199 | // ---------------------- 200 | 201 | .btn-group-justified { 202 | display: table; 203 | width: 100%; 204 | table-layout: fixed; 205 | border-collapse: separate; 206 | > .btn, 207 | > .btn-group { 208 | float: none; 209 | display: table-cell; 210 | width: 1%; 211 | } 212 | > .btn-group .btn { 213 | width: 100%; 214 | } 215 | 216 | > .btn-group .dropdown-menu { 217 | left: auto; 218 | } 219 | } 220 | 221 | 222 | // Checkbox and radio options 223 | // 224 | // In order to support the browser's form validation feedback, powered by the 225 | // `required` attribute, we have to "hide" the inputs via `clip`. We cannot use 226 | // `display: none;` or `visibility: hidden;` as that also hides the popover. 227 | // Simply visually hiding the inputs via `opacity` would leave them clickable in 228 | // certain cases which is prevented by using `clip` and `pointer-events`. 229 | // This way, we ensure a DOM element is visible to position the popover from. 230 | // 231 | // See https://github.com/twbs/bootstrap/pull/12794 and 232 | // https://github.com/twbs/bootstrap/pull/14559 for more information. 233 | 234 | [data-toggle="buttons"] { 235 | > .btn, 236 | > .btn-group > .btn { 237 | input[type="radio"], 238 | input[type="checkbox"] { 239 | position: absolute; 240 | clip: rect(0,0,0,0); 241 | pointer-events: none; 242 | } 243 | } 244 | } 245 | -------------------------------------------------------------------------------- /app/assets/sass/bootstrap/_buttons.scss: -------------------------------------------------------------------------------- 1 | // 2 | // Buttons 3 | // -------------------------------------------------- 4 | 5 | 6 | // Base styles 7 | // -------------------------------------------------- 8 | 9 | .btn { 10 | display: inline-block; 11 | margin-bottom: 0; // For input.btn 12 | font-weight: $btn-font-weight; 13 | text-align: center; 14 | vertical-align: middle; 15 | touch-action: manipulation; 16 | cursor: pointer; 17 | background-image: none; // Reset unusual Firefox-on-Android default style; see https://github.com/necolas/normalize.css/issues/214 18 | border: 1px solid transparent; 19 | white-space: nowrap; 20 | @include button-size($padding-base-vertical, $padding-base-horizontal, $font-size-base, $line-height-base, $btn-border-radius-base); 21 | @include user-select(none); 22 | 23 | &, 24 | &:active, 25 | &.active { 26 | &:focus, 27 | &.focus { 28 | @include tab-focus; 29 | } 30 | } 31 | 32 | &:hover, 33 | &:focus, 34 | &.focus { 35 | color: $btn-default-color; 36 | text-decoration: none; 37 | } 38 | 39 | &:active, 40 | &.active { 41 | outline: 0; 42 | background-image: none; 43 | @include box-shadow(inset 0 3px 5px rgba(0,0,0,.125)); 44 | } 45 | 46 | &.disabled, 47 | &[disabled], 48 | fieldset[disabled] & { 49 | cursor: $cursor-disabled; 50 | @include opacity(.65); 51 | @include box-shadow(none); 52 | } 53 | 54 | // [converter] extracted a& to a.btn 55 | } 56 | 57 | a.btn { 58 | &.disabled, 59 | fieldset[disabled] & { 60 | pointer-events: none; // Future-proof disabling of clicks on `` elements 61 | } 62 | } 63 | 64 | 65 | // Alternate buttons 66 | // -------------------------------------------------- 67 | 68 | .btn-default { 69 | @include button-variant($btn-default-color, $btn-default-bg, $btn-default-border); 70 | } 71 | .btn-primary { 72 | @include button-variant($btn-primary-color, $btn-primary-bg, $btn-primary-border); 73 | } 74 | // Success appears as green 75 | .btn-success { 76 | @include button-variant($btn-success-color, $btn-success-bg, $btn-success-border); 77 | } 78 | // Info appears as blue-green 79 | .btn-info { 80 | @include button-variant($btn-info-color, $btn-info-bg, $btn-info-border); 81 | } 82 | // Warning appears as orange 83 | .btn-warning { 84 | @include button-variant($btn-warning-color, $btn-warning-bg, $btn-warning-border); 85 | } 86 | // Danger and error appear as red 87 | .btn-danger { 88 | @include button-variant($btn-danger-color, $btn-danger-bg, $btn-danger-border); 89 | } 90 | 91 | 92 | // Link buttons 93 | // ------------------------- 94 | 95 | // Make a button look and behave like a link 96 | .btn-link { 97 | color: $link-color; 98 | font-weight: normal; 99 | border-radius: 0; 100 | 101 | &, 102 | &:active, 103 | &.active, 104 | &[disabled], 105 | fieldset[disabled] & { 106 | background-color: transparent; 107 | @include box-shadow(none); 108 | } 109 | &, 110 | &:hover, 111 | &:focus, 112 | &:active { 113 | border-color: transparent; 114 | } 115 | &:hover, 116 | &:focus { 117 | color: $link-hover-color; 118 | text-decoration: $link-hover-decoration; 119 | background-color: transparent; 120 | } 121 | &[disabled], 122 | fieldset[disabled] & { 123 | &:hover, 124 | &:focus { 125 | color: $btn-link-disabled-color; 126 | text-decoration: none; 127 | } 128 | } 129 | } 130 | 131 | 132 | // Button Sizes 133 | // -------------------------------------------------- 134 | 135 | .btn-lg { 136 | // line-height: ensure even-numbered height of button next to large input 137 | @include button-size($padding-large-vertical, $padding-large-horizontal, $font-size-large, $line-height-large, $btn-border-radius-large); 138 | } 139 | .btn-sm { 140 | // line-height: ensure proper height of button next to small input 141 | @include button-size($padding-small-vertical, $padding-small-horizontal, $font-size-small, $line-height-small, $btn-border-radius-small); 142 | } 143 | .btn-xs { 144 | @include button-size($padding-xs-vertical, $padding-xs-horizontal, $font-size-small, $line-height-small, $btn-border-radius-small); 145 | } 146 | 147 | 148 | // Block button 149 | // -------------------------------------------------- 150 | 151 | .btn-block { 152 | display: block; 153 | width: 100%; 154 | } 155 | 156 | // Vertically space out multiple block buttons 157 | .btn-block + .btn-block { 158 | margin-top: 5px; 159 | } 160 | 161 | // Specificity overrides 162 | input[type="submit"], 163 | input[type="reset"], 164 | input[type="button"] { 165 | &.btn-block { 166 | width: 100%; 167 | } 168 | } 169 | -------------------------------------------------------------------------------- /app/assets/sass/bootstrap/_carousel.scss: -------------------------------------------------------------------------------- 1 | // 2 | // Carousel 3 | // -------------------------------------------------- 4 | 5 | 6 | // Wrapper for the slide container and indicators 7 | .carousel { 8 | position: relative; 9 | } 10 | 11 | .carousel-inner { 12 | position: relative; 13 | overflow: hidden; 14 | width: 100%; 15 | 16 | > .item { 17 | display: none; 18 | position: relative; 19 | @include transition(.6s ease-in-out left); 20 | 21 | // Account for jankitude on images 22 | > img, 23 | > a > img { 24 | @include img-responsive; 25 | line-height: 1; 26 | } 27 | 28 | // WebKit CSS3 transforms for supported devices 29 | @media all and (transform-3d), (-webkit-transform-3d) { 30 | @include transition-transform(0.6s ease-in-out); 31 | @include backface-visibility(hidden); 32 | @include perspective(1000px); 33 | 34 | &.next, 35 | &.active.right { 36 | @include translate3d(100%, 0, 0); 37 | left: 0; 38 | } 39 | &.prev, 40 | &.active.left { 41 | @include translate3d(-100%, 0, 0); 42 | left: 0; 43 | } 44 | &.next.left, 45 | &.prev.right, 46 | &.active { 47 | @include translate3d(0, 0, 0); 48 | left: 0; 49 | } 50 | } 51 | } 52 | 53 | > .active, 54 | > .next, 55 | > .prev { 56 | display: block; 57 | } 58 | 59 | > .active { 60 | left: 0; 61 | } 62 | 63 | > .next, 64 | > .prev { 65 | position: absolute; 66 | top: 0; 67 | width: 100%; 68 | } 69 | 70 | > .next { 71 | left: 100%; 72 | } 73 | > .prev { 74 | left: -100%; 75 | } 76 | > .next.left, 77 | > .prev.right { 78 | left: 0; 79 | } 80 | 81 | > .active.left { 82 | left: -100%; 83 | } 84 | > .active.right { 85 | left: 100%; 86 | } 87 | 88 | } 89 | 90 | // Left/right controls for nav 91 | // --------------------------- 92 | 93 | .carousel-control { 94 | position: absolute; 95 | top: 0; 96 | left: 0; 97 | bottom: 0; 98 | width: $carousel-control-width; 99 | @include opacity($carousel-control-opacity); 100 | font-size: $carousel-control-font-size; 101 | color: $carousel-control-color; 102 | text-align: center; 103 | text-shadow: $carousel-text-shadow; 104 | background-color: rgba(0, 0, 0, 0); // Fix IE9 click-thru bug 105 | // We can't have this transition here because WebKit cancels the carousel 106 | // animation if you trip this while in the middle of another animation. 107 | 108 | // Set gradients for backgrounds 109 | &.left { 110 | @include gradient-horizontal($start-color: rgba(0,0,0,.5), $end-color: rgba(0,0,0,.0001)); 111 | } 112 | &.right { 113 | left: auto; 114 | right: 0; 115 | @include gradient-horizontal($start-color: rgba(0,0,0,.0001), $end-color: rgba(0,0,0,.5)); 116 | } 117 | 118 | // Hover/focus state 119 | &:hover, 120 | &:focus { 121 | outline: 0; 122 | color: $carousel-control-color; 123 | text-decoration: none; 124 | @include opacity(.9); 125 | } 126 | 127 | // Toggles 128 | .icon-prev, 129 | .icon-next, 130 | .glyphicon-chevron-left, 131 | .glyphicon-chevron-right { 132 | position: absolute; 133 | top: 50%; 134 | margin-top: -10px; 135 | z-index: 5; 136 | display: inline-block; 137 | } 138 | .icon-prev, 139 | .glyphicon-chevron-left { 140 | left: 50%; 141 | margin-left: -10px; 142 | } 143 | .icon-next, 144 | .glyphicon-chevron-right { 145 | right: 50%; 146 | margin-right: -10px; 147 | } 148 | .icon-prev, 149 | .icon-next { 150 | width: 20px; 151 | height: 20px; 152 | line-height: 1; 153 | font-family: serif; 154 | } 155 | 156 | 157 | .icon-prev { 158 | &:before { 159 | content: '\2039';// SINGLE LEFT-POINTING ANGLE QUOTATION MARK (U+2039) 160 | } 161 | } 162 | .icon-next { 163 | &:before { 164 | content: '\203a';// SINGLE RIGHT-POINTING ANGLE QUOTATION MARK (U+203A) 165 | } 166 | } 167 | } 168 | 169 | // Optional indicator pips 170 | // 171 | // Add an unordered list with the following class and add a list item for each 172 | // slide your carousel holds. 173 | 174 | .carousel-indicators { 175 | position: absolute; 176 | bottom: 10px; 177 | left: 50%; 178 | z-index: 15; 179 | width: 60%; 180 | margin-left: -30%; 181 | padding-left: 0; 182 | list-style: none; 183 | text-align: center; 184 | 185 | li { 186 | display: inline-block; 187 | width: 10px; 188 | height: 10px; 189 | margin: 1px; 190 | text-indent: -999px; 191 | border: 1px solid $carousel-indicator-border-color; 192 | border-radius: 10px; 193 | cursor: pointer; 194 | 195 | // IE8-9 hack for event handling 196 | // 197 | // Internet Explorer 8-9 does not support clicks on elements without a set 198 | // `background-color`. We cannot use `filter` since that's not viewed as a 199 | // background color by the browser. Thus, a hack is needed. 200 | // See https://developer.mozilla.org/en-US/docs/Web/Events/click#Internet_Explorer 201 | // 202 | // For IE8, we set solid black as it doesn't support `rgba()`. For IE9, we 203 | // set alpha transparency for the best results possible. 204 | background-color: #000 \9; // IE8 205 | background-color: rgba(0,0,0,0); // IE9 206 | } 207 | .active { 208 | margin: 0; 209 | width: 12px; 210 | height: 12px; 211 | background-color: $carousel-indicator-active-bg; 212 | } 213 | } 214 | 215 | // Optional captions 216 | // ----------------------------- 217 | // Hidden by default for smaller viewports 218 | .carousel-caption { 219 | position: absolute; 220 | left: 15%; 221 | right: 15%; 222 | bottom: 20px; 223 | z-index: 10; 224 | padding-top: 20px; 225 | padding-bottom: 20px; 226 | color: $carousel-caption-color; 227 | text-align: center; 228 | text-shadow: $carousel-text-shadow; 229 | & .btn { 230 | text-shadow: none; // No shadow for button elements in carousel-caption 231 | } 232 | } 233 | 234 | 235 | // Scale up controls for tablets and up 236 | @media screen and (min-width: $screen-sm-min) { 237 | 238 | // Scale up the controls a smidge 239 | .carousel-control { 240 | .glyphicon-chevron-left, 241 | .glyphicon-chevron-right, 242 | .icon-prev, 243 | .icon-next { 244 | width: ($carousel-control-font-size * 1.5); 245 | height: ($carousel-control-font-size * 1.5); 246 | margin-top: ($carousel-control-font-size / -2); 247 | font-size: ($carousel-control-font-size * 1.5); 248 | } 249 | .glyphicon-chevron-left, 250 | .icon-prev { 251 | margin-left: ($carousel-control-font-size / -2); 252 | } 253 | .glyphicon-chevron-right, 254 | .icon-next { 255 | margin-right: ($carousel-control-font-size / -2); 256 | } 257 | } 258 | 259 | // Show and left align the captions 260 | .carousel-caption { 261 | left: 20%; 262 | right: 20%; 263 | padding-bottom: 30px; 264 | } 265 | 266 | // Move up the indicators 267 | .carousel-indicators { 268 | bottom: 20px; 269 | } 270 | } 271 | -------------------------------------------------------------------------------- /app/assets/sass/bootstrap/_close.scss: -------------------------------------------------------------------------------- 1 | // 2 | // Close icons 3 | // -------------------------------------------------- 4 | 5 | 6 | .close { 7 | float: right; 8 | font-size: ($font-size-base * 1.5); 9 | font-weight: $close-font-weight; 10 | line-height: 1; 11 | color: $close-color; 12 | text-shadow: $close-text-shadow; 13 | @include opacity(.2); 14 | 15 | &:hover, 16 | &:focus { 17 | color: $close-color; 18 | text-decoration: none; 19 | cursor: pointer; 20 | @include opacity(.5); 21 | } 22 | 23 | // [converter] extracted button& to button.close 24 | } 25 | 26 | // Additional properties for button version 27 | // iOS requires the button element instead of an anchor tag. 28 | // If you want the anchor version, it requires `href="#"`. 29 | // See https://developer.mozilla.org/en-US/docs/Web/Events/click#Safari_Mobile 30 | button.close { 31 | padding: 0; 32 | cursor: pointer; 33 | background: transparent; 34 | border: 0; 35 | -webkit-appearance: none; 36 | } 37 | -------------------------------------------------------------------------------- /app/assets/sass/bootstrap/_code.scss: -------------------------------------------------------------------------------- 1 | // 2 | // Code (inline and block) 3 | // -------------------------------------------------- 4 | 5 | 6 | // Inline and block code styles 7 | code, 8 | kbd, 9 | pre, 10 | samp { 11 | font-family: $font-family-monospace; 12 | } 13 | 14 | // Inline code 15 | code { 16 | padding: 2px 4px; 17 | font-size: 90%; 18 | color: $code-color; 19 | background-color: $code-bg; 20 | border-radius: $border-radius-base; 21 | } 22 | 23 | // User input typically entered via keyboard 24 | kbd { 25 | padding: 2px 4px; 26 | font-size: 90%; 27 | color: $kbd-color; 28 | background-color: $kbd-bg; 29 | border-radius: $border-radius-small; 30 | box-shadow: inset 0 -1px 0 rgba(0,0,0,.25); 31 | 32 | kbd { 33 | padding: 0; 34 | font-size: 100%; 35 | font-weight: bold; 36 | box-shadow: none; 37 | } 38 | } 39 | 40 | // Blocks of code 41 | pre { 42 | display: block; 43 | padding: (($line-height-computed - 1) / 2); 44 | margin: 0 0 ($line-height-computed / 2); 45 | font-size: ($font-size-base - 1); // 14px to 13px 46 | line-height: $line-height-base; 47 | word-break: break-all; 48 | word-wrap: break-word; 49 | color: $pre-color; 50 | background-color: $pre-bg; 51 | border: 1px solid $pre-border-color; 52 | border-radius: $border-radius-base; 53 | 54 | // Account for some code outputs that place code tags in pre tags 55 | code { 56 | padding: 0; 57 | font-size: inherit; 58 | color: inherit; 59 | white-space: pre-wrap; 60 | background-color: transparent; 61 | border-radius: 0; 62 | } 63 | } 64 | 65 | // Enable scrollable blocks of code 66 | .pre-scrollable { 67 | max-height: $pre-scrollable-max-height; 68 | overflow-y: scroll; 69 | } 70 | -------------------------------------------------------------------------------- /app/assets/sass/bootstrap/_component-animations.scss: -------------------------------------------------------------------------------- 1 | // 2 | // Component animations 3 | // -------------------------------------------------- 4 | 5 | // Heads up! 6 | // 7 | // We don't use the `.opacity()` mixin here since it causes a bug with text 8 | // fields in IE7-8. Source: https://github.com/twbs/bootstrap/pull/3552. 9 | 10 | .fade { 11 | opacity: 0; 12 | @include transition(opacity .15s linear); 13 | &.in { 14 | opacity: 1; 15 | } 16 | } 17 | 18 | .collapse { 19 | display: none; 20 | 21 | &.in { display: block; } 22 | // [converter] extracted tr&.in to tr.collapse.in 23 | // [converter] extracted tbody&.in to tbody.collapse.in 24 | } 25 | 26 | tr.collapse.in { display: table-row; } 27 | 28 | tbody.collapse.in { display: table-row-group; } 29 | 30 | .collapsing { 31 | position: relative; 32 | height: 0; 33 | overflow: hidden; 34 | @include transition-property(height, visibility); 35 | @include transition-duration(.35s); 36 | @include transition-timing-function(ease); 37 | } 38 | -------------------------------------------------------------------------------- /app/assets/sass/bootstrap/_dropdowns.scss: -------------------------------------------------------------------------------- 1 | // 2 | // Dropdown menus 3 | // -------------------------------------------------- 4 | 5 | 6 | // Dropdown arrow/caret 7 | .caret { 8 | display: inline-block; 9 | width: 0; 10 | height: 0; 11 | margin-left: 2px; 12 | vertical-align: middle; 13 | border-top: $caret-width-base dashed; 14 | border-top: $caret-width-base solid \9; // IE8 15 | border-right: $caret-width-base solid transparent; 16 | border-left: $caret-width-base solid transparent; 17 | } 18 | 19 | // The dropdown wrapper (div) 20 | .dropup, 21 | .dropdown { 22 | position: relative; 23 | } 24 | 25 | // Prevent the focus on the dropdown toggle when closing dropdowns 26 | .dropdown-toggle:focus { 27 | outline: 0; 28 | } 29 | 30 | // The dropdown menu (ul) 31 | .dropdown-menu { 32 | position: absolute; 33 | top: 100%; 34 | left: 0; 35 | z-index: $zindex-dropdown; 36 | display: none; // none by default, but block on "open" of the menu 37 | float: left; 38 | min-width: 160px; 39 | padding: 5px 0; 40 | margin: 2px 0 0; // override default ul 41 | list-style: none; 42 | font-size: $font-size-base; 43 | text-align: left; // Ensures proper alignment if parent has it changed (e.g., modal footer) 44 | background-color: $dropdown-bg; 45 | border: 1px solid $dropdown-fallback-border; // IE8 fallback 46 | border: 1px solid $dropdown-border; 47 | border-radius: $border-radius-base; 48 | @include box-shadow(0 6px 12px rgba(0,0,0,.175)); 49 | background-clip: padding-box; 50 | 51 | // Aligns the dropdown menu to right 52 | // 53 | // Deprecated as of 3.1.0 in favor of `.dropdown-menu-[dir]` 54 | &.pull-right { 55 | right: 0; 56 | left: auto; 57 | } 58 | 59 | // Dividers (basically an hr) within the dropdown 60 | .divider { 61 | @include nav-divider($dropdown-divider-bg); 62 | } 63 | 64 | // Links within the dropdown menu 65 | > li > a { 66 | display: block; 67 | padding: 3px 20px; 68 | clear: both; 69 | font-weight: normal; 70 | line-height: $line-height-base; 71 | color: $dropdown-link-color; 72 | white-space: nowrap; // prevent links from randomly breaking onto new lines 73 | } 74 | } 75 | 76 | // Hover/Focus state 77 | .dropdown-menu > li > a { 78 | &:hover, 79 | &:focus { 80 | text-decoration: none; 81 | color: $dropdown-link-hover-color; 82 | background-color: $dropdown-link-hover-bg; 83 | } 84 | } 85 | 86 | // Active state 87 | .dropdown-menu > .active > a { 88 | &, 89 | &:hover, 90 | &:focus { 91 | color: $dropdown-link-active-color; 92 | text-decoration: none; 93 | outline: 0; 94 | background-color: $dropdown-link-active-bg; 95 | } 96 | } 97 | 98 | // Disabled state 99 | // 100 | // Gray out text and ensure the hover/focus state remains gray 101 | 102 | .dropdown-menu > .disabled > a { 103 | &, 104 | &:hover, 105 | &:focus { 106 | color: $dropdown-link-disabled-color; 107 | } 108 | 109 | // Nuke hover/focus effects 110 | &:hover, 111 | &:focus { 112 | text-decoration: none; 113 | background-color: transparent; 114 | background-image: none; // Remove CSS gradient 115 | @include reset-filter; 116 | cursor: $cursor-disabled; 117 | } 118 | } 119 | 120 | // Open state for the dropdown 121 | .open { 122 | // Show the menu 123 | > .dropdown-menu { 124 | display: block; 125 | } 126 | 127 | // Remove the outline when :focus is triggered 128 | > a { 129 | outline: 0; 130 | } 131 | } 132 | 133 | // Menu positioning 134 | // 135 | // Add extra class to `.dropdown-menu` to flip the alignment of the dropdown 136 | // menu with the parent. 137 | .dropdown-menu-right { 138 | left: auto; // Reset the default from `.dropdown-menu` 139 | right: 0; 140 | } 141 | // With v3, we enabled auto-flipping if you have a dropdown within a right 142 | // aligned nav component. To enable the undoing of that, we provide an override 143 | // to restore the default dropdown menu alignment. 144 | // 145 | // This is only for left-aligning a dropdown menu within a `.navbar-right` or 146 | // `.pull-right` nav component. 147 | .dropdown-menu-left { 148 | left: 0; 149 | right: auto; 150 | } 151 | 152 | // Dropdown section headers 153 | .dropdown-header { 154 | display: block; 155 | padding: 3px 20px; 156 | font-size: $font-size-small; 157 | line-height: $line-height-base; 158 | color: $dropdown-header-color; 159 | white-space: nowrap; // as with > li > a 160 | } 161 | 162 | // Backdrop to catch body clicks on mobile, etc. 163 | .dropdown-backdrop { 164 | position: fixed; 165 | left: 0; 166 | right: 0; 167 | bottom: 0; 168 | top: 0; 169 | z-index: ($zindex-dropdown - 10); 170 | } 171 | 172 | // Right aligned dropdowns 173 | .pull-right > .dropdown-menu { 174 | right: 0; 175 | left: auto; 176 | } 177 | 178 | // Allow for dropdowns to go bottom up (aka, dropup-menu) 179 | // 180 | // Just add .dropup after the standard .dropdown class and you're set, bro. 181 | // TODO: abstract this so that the navbar fixed styles are not placed here? 182 | 183 | .dropup, 184 | .navbar-fixed-bottom .dropdown { 185 | // Reverse the caret 186 | .caret { 187 | border-top: 0; 188 | border-bottom: $caret-width-base dashed; 189 | border-bottom: $caret-width-base solid \9; // IE8 190 | content: ""; 191 | } 192 | // Different positioning for bottom up menu 193 | .dropdown-menu { 194 | top: auto; 195 | bottom: 100%; 196 | margin-bottom: 2px; 197 | } 198 | } 199 | 200 | 201 | // Component alignment 202 | // 203 | // Reiterate per navbar.less and the modified component alignment there. 204 | 205 | @media (min-width: $grid-float-breakpoint) { 206 | .navbar-right { 207 | .dropdown-menu { 208 | right: 0; left: auto; 209 | } 210 | // Necessary for overrides of the default right aligned menu. 211 | // Will remove come v4 in all likelihood. 212 | .dropdown-menu-left { 213 | left: 0; right: auto; 214 | } 215 | } 216 | } 217 | -------------------------------------------------------------------------------- /app/assets/sass/bootstrap/_grid.scss: -------------------------------------------------------------------------------- 1 | // 2 | // Grid system 3 | // -------------------------------------------------- 4 | 5 | 6 | // Container widths 7 | // 8 | // Set the container width, and override it for fixed navbars in media queries. 9 | 10 | .container { 11 | @include container-fixed; 12 | 13 | @media (min-width: $screen-sm-min) { 14 | width: $container-sm; 15 | } 16 | @media (min-width: $screen-md-min) { 17 | width: $container-md; 18 | } 19 | @media (min-width: $screen-lg-min) { 20 | width: $container-lg; 21 | } 22 | } 23 | 24 | 25 | // Fluid container 26 | // 27 | // Utilizes the mixin meant for fixed width containers, but without any defined 28 | // width for fluid, full width layouts. 29 | 30 | .container-fluid { 31 | @include container-fixed; 32 | } 33 | 34 | 35 | // Row 36 | // 37 | // Rows contain and clear the floats of your columns. 38 | 39 | .row { 40 | @include make-row; 41 | } 42 | 43 | 44 | // Columns 45 | // 46 | // Common styles for small and large grid columns 47 | 48 | @include make-grid-columns; 49 | 50 | 51 | // Extra small grid 52 | // 53 | // Columns, offsets, pushes, and pulls for extra small devices like 54 | // smartphones. 55 | 56 | @include make-grid(xs); 57 | 58 | 59 | // Small grid 60 | // 61 | // Columns, offsets, pushes, and pulls for the small device range, from phones 62 | // to tablets. 63 | 64 | @media (min-width: $screen-sm-min) { 65 | @include make-grid(sm); 66 | } 67 | 68 | 69 | // Medium grid 70 | // 71 | // Columns, offsets, pushes, and pulls for the desktop device range. 72 | 73 | @media (min-width: $screen-md-min) { 74 | @include make-grid(md); 75 | } 76 | 77 | 78 | // Large grid 79 | // 80 | // Columns, offsets, pushes, and pulls for the large desktop device range. 81 | 82 | @media (min-width: $screen-lg-min) { 83 | @include make-grid(lg); 84 | } 85 | -------------------------------------------------------------------------------- /app/assets/sass/bootstrap/_input-groups.scss: -------------------------------------------------------------------------------- 1 | // 2 | // Input groups 3 | // -------------------------------------------------- 4 | 5 | // Base styles 6 | // ------------------------- 7 | .input-group { 8 | position: relative; // For dropdowns 9 | display: table; 10 | border-collapse: separate; // prevent input groups from inheriting border styles from table cells when placed within a table 11 | 12 | // Undo padding and float of grid classes 13 | &[class*="col-"] { 14 | float: none; 15 | padding-left: 0; 16 | padding-right: 0; 17 | } 18 | 19 | .form-control { 20 | // Ensure that the input is always above the *appended* addon button for 21 | // proper border colors. 22 | position: relative; 23 | z-index: 2; 24 | 25 | // IE9 fubars the placeholder attribute in text inputs and the arrows on 26 | // select elements in input groups. To fix it, we float the input. Details: 27 | // https://github.com/twbs/bootstrap/issues/11561#issuecomment-28936855 28 | float: left; 29 | 30 | width: 100%; 31 | margin-bottom: 0; 32 | 33 | &:focus { 34 | z-index: 3; 35 | } 36 | } 37 | } 38 | 39 | // Sizing options 40 | // 41 | // Remix the default form control sizing classes into new ones for easier 42 | // manipulation. 43 | 44 | .input-group-lg > .form-control, 45 | .input-group-lg > .input-group-addon, 46 | .input-group-lg > .input-group-btn > .btn { 47 | @extend .input-lg; 48 | } 49 | .input-group-sm > .form-control, 50 | .input-group-sm > .input-group-addon, 51 | .input-group-sm > .input-group-btn > .btn { 52 | @extend .input-sm; 53 | } 54 | 55 | 56 | // Display as table-cell 57 | // ------------------------- 58 | .input-group-addon, 59 | .input-group-btn, 60 | .input-group .form-control { 61 | display: table-cell; 62 | 63 | &:not(:first-child):not(:last-child) { 64 | border-radius: 0; 65 | } 66 | } 67 | // Addon and addon wrapper for buttons 68 | .input-group-addon, 69 | .input-group-btn { 70 | width: 1%; 71 | white-space: nowrap; 72 | vertical-align: middle; // Match the inputs 73 | } 74 | 75 | // Text input groups 76 | // ------------------------- 77 | .input-group-addon { 78 | padding: $padding-base-vertical $padding-base-horizontal; 79 | font-size: $font-size-base; 80 | font-weight: normal; 81 | line-height: 1; 82 | color: $input-color; 83 | text-align: center; 84 | background-color: $input-group-addon-bg; 85 | border: 1px solid $input-group-addon-border-color; 86 | border-radius: $input-border-radius; 87 | 88 | // Sizing 89 | &.input-sm { 90 | padding: $padding-small-vertical $padding-small-horizontal; 91 | font-size: $font-size-small; 92 | border-radius: $input-border-radius-small; 93 | } 94 | &.input-lg { 95 | padding: $padding-large-vertical $padding-large-horizontal; 96 | font-size: $font-size-large; 97 | border-radius: $input-border-radius-large; 98 | } 99 | 100 | // Nuke default margins from checkboxes and radios to vertically center within. 101 | input[type="radio"], 102 | input[type="checkbox"] { 103 | margin-top: 0; 104 | } 105 | } 106 | 107 | // Reset rounded corners 108 | .input-group .form-control:first-child, 109 | .input-group-addon:first-child, 110 | .input-group-btn:first-child > .btn, 111 | .input-group-btn:first-child > .btn-group > .btn, 112 | .input-group-btn:first-child > .dropdown-toggle, 113 | .input-group-btn:last-child > .btn:not(:last-child):not(.dropdown-toggle), 114 | .input-group-btn:last-child > .btn-group:not(:last-child) > .btn { 115 | @include border-right-radius(0); 116 | } 117 | .input-group-addon:first-child { 118 | border-right: 0; 119 | } 120 | .input-group .form-control:last-child, 121 | .input-group-addon:last-child, 122 | .input-group-btn:last-child > .btn, 123 | .input-group-btn:last-child > .btn-group > .btn, 124 | .input-group-btn:last-child > .dropdown-toggle, 125 | .input-group-btn:first-child > .btn:not(:first-child), 126 | .input-group-btn:first-child > .btn-group:not(:first-child) > .btn { 127 | @include border-left-radius(0); 128 | } 129 | .input-group-addon:last-child { 130 | border-left: 0; 131 | } 132 | 133 | // Button input groups 134 | // ------------------------- 135 | .input-group-btn { 136 | position: relative; 137 | // Jankily prevent input button groups from wrapping with `white-space` and 138 | // `font-size` in combination with `inline-block` on buttons. 139 | font-size: 0; 140 | white-space: nowrap; 141 | 142 | // Negative margin for spacing, position for bringing hovered/focused/actived 143 | // element above the siblings. 144 | > .btn { 145 | position: relative; 146 | + .btn { 147 | margin-left: -1px; 148 | } 149 | // Bring the "active" button to the front 150 | &:hover, 151 | &:focus, 152 | &:active { 153 | z-index: 2; 154 | } 155 | } 156 | 157 | // Negative margin to only have a 1px border between the two 158 | &:first-child { 159 | > .btn, 160 | > .btn-group { 161 | margin-right: -1px; 162 | } 163 | } 164 | &:last-child { 165 | > .btn, 166 | > .btn-group { 167 | z-index: 2; 168 | margin-left: -1px; 169 | } 170 | } 171 | } 172 | -------------------------------------------------------------------------------- /app/assets/sass/bootstrap/_jumbotron.scss: -------------------------------------------------------------------------------- 1 | // 2 | // Jumbotron 3 | // -------------------------------------------------- 4 | 5 | 6 | .jumbotron { 7 | padding-top: $jumbotron-padding; 8 | padding-bottom: $jumbotron-padding; 9 | margin-bottom: $jumbotron-padding; 10 | color: $jumbotron-color; 11 | background-color: $jumbotron-bg; 12 | 13 | h1, 14 | .h1 { 15 | color: $jumbotron-heading-color; 16 | } 17 | 18 | p { 19 | margin-bottom: ($jumbotron-padding / 2); 20 | font-size: $jumbotron-font-size; 21 | font-weight: 200; 22 | } 23 | 24 | > hr { 25 | border-top-color: darken($jumbotron-bg, 10%); 26 | } 27 | 28 | .container &, 29 | .container-fluid & { 30 | border-radius: $border-radius-large; // Only round corners at higher resolutions if contained in a container 31 | padding-left: ($grid-gutter-width / 2); 32 | padding-right: ($grid-gutter-width / 2); 33 | } 34 | 35 | .container { 36 | max-width: 100%; 37 | } 38 | 39 | @media screen and (min-width: $screen-sm-min) { 40 | padding-top: ($jumbotron-padding * 1.6); 41 | padding-bottom: ($jumbotron-padding * 1.6); 42 | 43 | .container &, 44 | .container-fluid & { 45 | padding-left: ($jumbotron-padding * 2); 46 | padding-right: ($jumbotron-padding * 2); 47 | } 48 | 49 | h1, 50 | .h1 { 51 | font-size: $jumbotron-heading-font-size; 52 | } 53 | } 54 | } 55 | -------------------------------------------------------------------------------- /app/assets/sass/bootstrap/_labels.scss: -------------------------------------------------------------------------------- 1 | // 2 | // Labels 3 | // -------------------------------------------------- 4 | 5 | .label { 6 | display: inline; 7 | padding: .2em .6em .3em; 8 | font-size: 75%; 9 | font-weight: bold; 10 | line-height: 1; 11 | color: $label-color; 12 | text-align: center; 13 | white-space: nowrap; 14 | vertical-align: baseline; 15 | border-radius: .25em; 16 | 17 | // [converter] extracted a& to a.label 18 | 19 | // Empty labels collapse automatically (not available in IE8) 20 | &:empty { 21 | display: none; 22 | } 23 | 24 | // Quick fix for labels in buttons 25 | .btn & { 26 | position: relative; 27 | top: -1px; 28 | } 29 | } 30 | 31 | // Add hover effects, but only for links 32 | a.label { 33 | &:hover, 34 | &:focus { 35 | color: $label-link-hover-color; 36 | text-decoration: none; 37 | cursor: pointer; 38 | } 39 | } 40 | 41 | // Colors 42 | // Contextual variations (linked labels get darker on :hover) 43 | 44 | .label-default { 45 | @include label-variant($label-default-bg); 46 | } 47 | 48 | .label-primary { 49 | @include label-variant($label-primary-bg); 50 | } 51 | 52 | .label-success { 53 | @include label-variant($label-success-bg); 54 | } 55 | 56 | .label-info { 57 | @include label-variant($label-info-bg); 58 | } 59 | 60 | .label-warning { 61 | @include label-variant($label-warning-bg); 62 | } 63 | 64 | .label-danger { 65 | @include label-variant($label-danger-bg); 66 | } 67 | -------------------------------------------------------------------------------- /app/assets/sass/bootstrap/_list-group.scss: -------------------------------------------------------------------------------- 1 | // 2 | // List groups 3 | // -------------------------------------------------- 4 | 5 | 6 | // Base class 7 | // 8 | // Easily usable on