├── .DS_Store
├── .bowerrc
├── .editorconfig
├── .gitignore
├── .jscsrc
├── .jshintrc
├── .yo-rc.json
├── LICENSE
├── README.md
├── app
├── .DS_Store
├── 404.html
├── favicon.ico
├── images
│ ├── .DS_Store
│ ├── arrow.png
│ └── flat-avatar.png
├── index.html
├── menu.html
├── robots.txt
├── scripts
│ ├── app.js
│ └── controllers
│ │ ├── dashboard.js
│ │ └── login.js
├── styles
│ ├── base.less
│ ├── fonts
│ │ ├── glyphicons-halflings-regular.eot
│ │ ├── glyphicons-halflings-regular.svg
│ │ ├── glyphicons-halflings-regular.ttf
│ │ ├── glyphicons-halflings-regular.woff
│ │ └── glyphicons-halflings-regular.woff2
│ ├── less
│ │ ├── .csscomb.json
│ │ ├── .csslintrc
│ │ ├── alerts.less
│ │ ├── badges.less
│ │ ├── bootstrap.less
│ │ ├── breadcrumbs.less
│ │ ├── button-groups.less
│ │ ├── buttons.less
│ │ ├── carousel.less
│ │ ├── close.less
│ │ ├── code.less
│ │ ├── component-animations.less
│ │ ├── dropdowns.less
│ │ ├── forms.less
│ │ ├── glyphicons.less
│ │ ├── grid.less
│ │ ├── input-groups.less
│ │ ├── jumbotron.less
│ │ ├── labels.less
│ │ ├── list-group.less
│ │ ├── media.less
│ │ ├── mixins.less
│ │ ├── mixins
│ │ │ ├── alerts.less
│ │ │ ├── background-variant.less
│ │ │ ├── border-radius.less
│ │ │ ├── buttons.less
│ │ │ ├── center-block.less
│ │ │ ├── clearfix.less
│ │ │ ├── forms.less
│ │ │ ├── gradients.less
│ │ │ ├── grid-framework.less
│ │ │ ├── grid.less
│ │ │ ├── hide-text.less
│ │ │ ├── image.less
│ │ │ ├── labels.less
│ │ │ ├── list-group.less
│ │ │ ├── nav-divider.less
│ │ │ ├── nav-vertical-align.less
│ │ │ ├── opacity.less
│ │ │ ├── pagination.less
│ │ │ ├── panels.less
│ │ │ ├── progress-bar.less
│ │ │ ├── reset-filter.less
│ │ │ ├── resize.less
│ │ │ ├── responsive-visibility.less
│ │ │ ├── size.less
│ │ │ ├── tab-focus.less
│ │ │ ├── table-row.less
│ │ │ ├── text-emphasis.less
│ │ │ ├── text-overflow.less
│ │ │ └── vendor-prefixes.less
│ │ ├── modals.less
│ │ ├── navbar.less
│ │ ├── navs.less
│ │ ├── normalize.less
│ │ ├── pager.less
│ │ ├── pagination.less
│ │ ├── panels.less
│ │ ├── popovers.less
│ │ ├── print.less
│ │ ├── progress-bars.less
│ │ ├── responsive-embed.less
│ │ ├── responsive-utilities.less
│ │ ├── scaffolding.less
│ │ ├── tables.less
│ │ ├── theme.less
│ │ ├── thumbnails.less
│ │ ├── tooltip.less
│ │ ├── type.less
│ │ ├── utilities.less
│ │ ├── variables.less
│ │ └── wells.less
│ ├── main.less
│ ├── pages
│ │ ├── dashboard.less
│ │ └── login.less
│ ├── transitions
│ │ ├── all.less
│ │ ├── animations.less
│ │ ├── avatar.less
│ │ └── pages.less
│ └── widgets
│ │ ├── checkbox.less
│ │ └── input-underline.less
└── views
│ ├── base.html
│ ├── dashboard.html
│ ├── dashboard
│ ├── overview.html
│ └── reports.html
│ ├── login.html
│ └── main-content.html
├── bower.json
├── dist
├── .DS_Store
├── .htaccess
├── 404.html
├── favicon.ico
├── fonts
│ ├── fontawesome-webfont.eot
│ ├── fontawesome-webfont.svg
│ ├── fontawesome-webfont.ttf
│ ├── fontawesome-webfont.woff
│ ├── fontawesome-webfont.woff2
│ ├── glyphicons-halflings-regular.eot
│ ├── glyphicons-halflings-regular.svg
│ ├── glyphicons-halflings-regular.ttf
│ ├── glyphicons-halflings-regular.woff
│ └── glyphicons-halflings-regular.woff2
├── images
│ ├── arrow.png
│ └── flat-avatar.png
├── index.html
├── robots.txt
├── scripts
│ ├── oldieshim.js
│ ├── scripts.js
│ └── vendor.js
├── styles
│ ├── main.css
│ └── vendor.css
└── views
│ ├── base.html
│ ├── dashboard.html
│ ├── dashboard
│ ├── overview.html
│ └── reports.html
│ ├── login.html
│ └── main-content.html
├── examples
└── preview.png
├── gulpfile.js
├── package.json
└── test
├── karma.conf.js
└── spec
└── controllers
└── main.js
/.DS_Store:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/start-angular/versatile-dashboard-theme/df56dc775568d567a51a5aa61a425d8ad1d07f62/.DS_Store
--------------------------------------------------------------------------------
/.bowerrc:
--------------------------------------------------------------------------------
1 | {
2 | "directory": "bower_components"
3 | }
4 |
--------------------------------------------------------------------------------
/.editorconfig:
--------------------------------------------------------------------------------
1 | # EditorConfig helps developers define and maintain consistent
2 | # coding styles between different editors and IDEs
3 | # editorconfig.org
4 |
5 | root = true
6 |
7 |
8 | [*]
9 |
10 | # Change these settings to your own preference
11 | indent_style = space
12 | indent_size = 2
13 |
14 | # We recommend you to keep these unchanged
15 | end_of_line = lf
16 | charset = utf-8
17 | trim_trailing_whitespace = true
18 | insert_final_newline = true
19 |
20 | [*.md]
21 | trim_trailing_whitespace = false
22 |
23 | [*.html]
24 | indent_size = 4
25 |
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | node_modules/
2 | bower_components/
3 | .tmp/
4 | gen/
5 | docs/
6 |
--------------------------------------------------------------------------------
/.jscsrc:
--------------------------------------------------------------------------------
1 | {
2 | "requireCurlyBraces": [
3 | "if",
4 | "else",
5 | "for",
6 | "while",
7 | "do",
8 | "try",
9 | "catch"
10 | ],
11 | "requireOperatorBeforeLineBreak": true,
12 | "requireCamelCaseOrUpperCaseIdentifiers": true,
13 | "maximumLineLength": {
14 | "value": 80,
15 | "allowComments": true,
16 | "allowRegex": true
17 | },
18 | "validateIndentation": 2,
19 | "validateQuoteMarks": "'",
20 |
21 | "disallowMultipleLineStrings": true,
22 | "disallowMixedSpacesAndTabs": true,
23 | "disallowTrailingWhitespace": true,
24 | "disallowSpaceAfterPrefixUnaryOperators": true,
25 | "disallowMultipleVarDecl": true,
26 | "disallowKeywordsOnNewLine": ["else"],
27 |
28 | "requireSpaceAfterKeywords": [
29 | "if",
30 | "else",
31 | "for",
32 | "while",
33 | "do",
34 | "switch",
35 | "return",
36 | "try",
37 | "catch"
38 | ],
39 | "requireSpaceBeforeBinaryOperators": [
40 | "=", "+=", "-=", "*=", "/=", "%=", "<<=", ">>=", ">>>=",
41 | "&=", "|=", "^=", "+=",
42 |
43 | "+", "-", "*", "/", "%", "<<", ">>", ">>>", "&",
44 | "|", "^", "&&", "||", "===", "==", ">=",
45 | "<=", "<", ">", "!=", "!=="
46 | ],
47 | "requireSpaceAfterBinaryOperators": true,
48 | "requireSpacesInConditionalExpression": true,
49 | "requireSpaceBeforeBlockStatements": true,
50 | "requireSpacesInForStatement": true,
51 | "requireLineFeedAtFileEnd": true,
52 | "requireSpacesInFunctionExpression": {
53 | "beforeOpeningCurlyBrace": true
54 | },
55 | "disallowSpacesInAnonymousFunctionExpression": {
56 | "beforeOpeningRoundBrace": true
57 | },
58 | "disallowSpacesInsideObjectBrackets": "all",
59 | "disallowSpacesInsideArrayBrackets": "all",
60 | "disallowSpacesInsideParentheses": true,
61 |
62 | "disallowMultipleLineBreaks": true,
63 | "disallowNewlineBeforeBlockStatements": true
64 | }
--------------------------------------------------------------------------------
/.jshintrc:
--------------------------------------------------------------------------------
1 | {
2 | "node": true,
3 | "browser": true,
4 | "esnext": true,
5 | "bitwise": true,
6 | "camelcase": true,
7 | "curly": true,
8 | "eqeqeq": true,
9 | "immed": true,
10 | "indent": 2,
11 | "latedef": true,
12 | "newcap": true,
13 | "noarg": true,
14 | "quotmark": "single",
15 | "undef": true,
16 | "unused": true,
17 | "strict": true,
18 | "trailing": true,
19 | "smarttabs": true,
20 | "jasmine": true,
21 | "globals": {
22 | "angular": false,
23 | "inject": false
24 | }
25 | }
26 |
--------------------------------------------------------------------------------
/.yo-rc.json:
--------------------------------------------------------------------------------
1 | {
2 | "generator-yangular": {
3 | "scriptsDir": "app/scripts/",
4 | "viewsDir": "app/views/"
5 | }
6 | }
--------------------------------------------------------------------------------
/LICENSE:
--------------------------------------------------------------------------------
1 | The MIT License (MIT)
2 |
3 | Copyright (c) 2015 GeekyAnts
4 | http://geekyants.com/
5 |
6 | Permission is hereby granted, free of charge, to any person obtaining a copy
7 | of this software and associated documentation files (the "Software"), to deal
8 | in the Software without restriction, including without limitation the rights
9 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
10 | copies of the Software, and to permit persons to whom the Software is
11 | furnished to do so, subject to the following conditions:
12 |
13 | The above copyright notice and this permission notice shall be included in all
14 | copies or substantial portions of the Software.
15 |
16 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
19 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
22 | SOFTWARE.
23 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | ## NOTICE: This repo has been deprecated
2 |
3 | ## [DEPRECATED] Versatile Dashboard - Free AngularJS Admin Starter Theme
4 |
5 | ### Note: This project is no longer maintained.
6 |
7 | ## [Demo](http://rawgit.com/start-angular/versatile-dashboard-theme/master/dist/index.html)
8 |
9 | Versatile Admin Theme is a Boilerplate for Animated AngularJS Starter Theme written with Bootstrap LESS. Powered by Gulp.
10 | 
11 |
12 | Find out more [Free Angular Themes at StartAngular.com](http://www.startangular.com/).
13 |
14 | ## Installation
15 | 1. Clone this project or Download that ZIP file
16 | 2. Make sure you have [bower](http://bower.io/), [gulp](https://www.npmjs.com/package/gulp) and [npm](https://www.npmjs.org/) installed globally
17 | 3. On the command prompt run the following commands
18 | - cd `project-directory`
19 | - `bower install`
20 | - `npm install`
21 | - `gulp serve` - For development mode
22 | - `gulp build` - concat, minify and generate the files for deployment
23 |
24 |
25 | ### Goodness of Bootstrap Less
26 | In the source, we have the less files of Bootstrap attached and the variables have been updated to create this theme. You can change the variable in the less file. Animation and Transitions are in separate less file.
27 |
28 | ### Automation tools
29 |
30 | - [Gulp](http://gulpjs.com/)
31 |
--------------------------------------------------------------------------------
/app/.DS_Store:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/start-angular/versatile-dashboard-theme/df56dc775568d567a51a5aa61a425d8ad1d07f62/app/.DS_Store
--------------------------------------------------------------------------------
/app/404.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | Page Not Found :(
6 |
141 |
142 |
143 |
144 |
Not found :(
145 |
Sorry, but the page you were trying to view does not exist.
146 |
It looks like this was the result of either:
147 |
148 | a mistyped address
149 | an out-of-date link
150 |
151 |
154 |
155 |
156 |
157 |
158 |
--------------------------------------------------------------------------------
/app/favicon.ico:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/start-angular/versatile-dashboard-theme/df56dc775568d567a51a5aa61a425d8ad1d07f62/app/favicon.ico
--------------------------------------------------------------------------------
/app/images/.DS_Store:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/start-angular/versatile-dashboard-theme/df56dc775568d567a51a5aa61a425d8ad1d07f62/app/images/.DS_Store
--------------------------------------------------------------------------------
/app/images/arrow.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/start-angular/versatile-dashboard-theme/df56dc775568d567a51a5aa61a425d8ad1d07f62/app/images/arrow.png
--------------------------------------------------------------------------------
/app/images/flat-avatar.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/start-angular/versatile-dashboard-theme/df56dc775568d567a51a5aa61a425d8ad1d07f62/app/images/flat-avatar.png
--------------------------------------------------------------------------------
/app/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | Versatile Metro-UI Angular Theme
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
23 |
24 |
25 |
28 |
29 |
30 |
39 |
40 |
41 |
45 |
46 |
47 |
48 |
49 |
50 |
51 |
52 |
53 |
54 |
55 |
56 |
57 |
58 |
59 |
60 |
61 |
62 |
63 |
64 |
65 |
--------------------------------------------------------------------------------
/app/menu.html:
--------------------------------------------------------------------------------
1 |
2 |
13 |
14 |
--------------------------------------------------------------------------------
/app/robots.txt:
--------------------------------------------------------------------------------
1 | # robotstxt.org
2 |
3 | User-agent: *
4 |
--------------------------------------------------------------------------------
/app/scripts/app.js:
--------------------------------------------------------------------------------
1 | 'use strict';
2 |
3 | /**
4 | * @ngdoc overview
5 | * @name yapp
6 | * @description
7 | * # yapp
8 | *
9 | * Main module of the application.
10 | */
11 | var states = [
12 | { name: 'base', state: { abstract: true, url: '', templateUrl: 'views/base.html', data: {text: "Base", visible: false } } },
13 | { name: 'login', state: { url: '/login', parent: 'base', templateUrl: 'views/login.html', controller: 'LoginCtrl', data: {text: "Login", visible: false } } },
14 | { name: 'dashboard', state: { url: '/dashboard', parent: 'base', templateUrl: 'views/dashboard.html', controller: 'DashboardCtrl', data: {text: "Dashboard", visible: false } } },
15 | { name: 'overview', state: { url: '/overview', parent: 'dashboard', templateUrl: 'views/dashboard/overview.html', data: {text: "Overview", visible: true } } },
16 | { name: 'reports', state: { url: '/reports', parent: 'dashboard', templateUrl: 'views/dashboard/reports.html', data: {text: "Reports", visible: true } } },
17 | { name: 'logout', state: { url: '/login', data: {text: "Logout", visible: true }} }
18 | ];
19 |
20 | angular.module('yapp', [
21 | 'ui.router',
22 | 'snap',
23 | 'ngAnimate'
24 | ])
25 | .config(function($stateProvider, $urlRouterProvider) {
26 | $urlRouterProvider.when('/dashboard', '/dashboard/overview');
27 | $urlRouterProvider.otherwise('/login');
28 |
29 | angular.forEach(states, function (state) {
30 | $stateProvider.state(state.name, state.state);
31 | });
32 | });
33 |
--------------------------------------------------------------------------------
/app/scripts/controllers/dashboard.js:
--------------------------------------------------------------------------------
1 | 'use strict';
2 |
3 | /**
4 | * @ngdoc function
5 | * @name yapp.controller:MainCtrl
6 | * @description
7 | * # MainCtrl
8 | * Controller of yapp
9 | */
10 | angular.module('yapp')
11 | .controller('DashboardCtrl', function($scope, $state) {
12 | $scope.$state = $state;
13 |
14 | $scope.menuItems = [];
15 | angular.forEach($state.get(), function (item) {
16 | if (item.data && item.data.visible) {
17 | $scope.menuItems.push({name: item.name, text: item.data.text});
18 | }
19 | });
20 | });
21 |
--------------------------------------------------------------------------------
/app/scripts/controllers/login.js:
--------------------------------------------------------------------------------
1 | 'use strict';
2 |
3 | /**
4 | * @ngdoc function
5 | * @name yapp.controller:MainCtrl
6 | * @description
7 | * # MainCtrl
8 | * Controller of yapp
9 | */
10 | angular.module('yapp')
11 | .controller('LoginCtrl', function($scope, $location) {
12 |
13 | $scope.submit = function() {
14 |
15 | $location.path('/dashboard');
16 |
17 | return false;
18 | }
19 |
20 | });
21 |
--------------------------------------------------------------------------------
/app/styles/base.less:
--------------------------------------------------------------------------------
1 | .ui-base {
2 | position: absolute;
3 | top: 0;
4 | left: 0;
5 | right: 0;
6 | bottom: 0;
7 | background: #585858;
8 | // overflow: auto;
9 | }
10 |
11 |
--------------------------------------------------------------------------------
/app/styles/fonts/glyphicons-halflings-regular.eot:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/start-angular/versatile-dashboard-theme/df56dc775568d567a51a5aa61a425d8ad1d07f62/app/styles/fonts/glyphicons-halflings-regular.eot
--------------------------------------------------------------------------------
/app/styles/fonts/glyphicons-halflings-regular.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/start-angular/versatile-dashboard-theme/df56dc775568d567a51a5aa61a425d8ad1d07f62/app/styles/fonts/glyphicons-halflings-regular.ttf
--------------------------------------------------------------------------------
/app/styles/fonts/glyphicons-halflings-regular.woff:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/start-angular/versatile-dashboard-theme/df56dc775568d567a51a5aa61a425d8ad1d07f62/app/styles/fonts/glyphicons-halflings-regular.woff
--------------------------------------------------------------------------------
/app/styles/fonts/glyphicons-halflings-regular.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/start-angular/versatile-dashboard-theme/df56dc775568d567a51a5aa61a425d8ad1d07f62/app/styles/fonts/glyphicons-halflings-regular.woff2
--------------------------------------------------------------------------------
/app/styles/less/.csslintrc:
--------------------------------------------------------------------------------
1 | {
2 | "adjoining-classes": false,
3 | "box-sizing": false,
4 | "box-model": false,
5 | "compatible-vendor-prefixes": false,
6 | "floats": false,
7 | "font-sizes": false,
8 | "gradients": false,
9 | "important": false,
10 | "known-properties": false,
11 | "outline-none": false,
12 | "qualified-headings": false,
13 | "regex-selectors": false,
14 | "shorthand": false,
15 | "text-indent": false,
16 | "unique-headings": false,
17 | "universal-selector": false,
18 | "unqualified-attributes": false
19 | }
20 |
--------------------------------------------------------------------------------
/app/styles/less/alerts.less:
--------------------------------------------------------------------------------
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 | .alert-variant(@alert-success-bg; @alert-success-border; @alert-success-text);
61 | }
62 |
63 | .alert-info {
64 | .alert-variant(@alert-info-bg; @alert-info-border; @alert-info-text);
65 | }
66 |
67 | .alert-warning {
68 | .alert-variant(@alert-warning-bg; @alert-warning-border; @alert-warning-text);
69 | }
70 |
71 | .alert-danger {
72 | .alert-variant(@alert-danger-bg; @alert-danger-border; @alert-danger-text);
73 | }
74 |
--------------------------------------------------------------------------------
/app/styles/less/badges.less:
--------------------------------------------------------------------------------
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: baseline;
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 | // Hover state, but only for links
39 | a& {
40 | &:hover,
41 | &:focus {
42 | color: @badge-link-hover-color;
43 | text-decoration: none;
44 | cursor: pointer;
45 | }
46 | }
47 |
48 | // Account for badges in navs
49 | .list-group-item.active > &,
50 | .nav-pills > .active > a > & {
51 | color: @badge-active-color;
52 | background-color: @badge-active-bg;
53 | }
54 |
55 | .list-group-item > & {
56 | float: right;
57 | }
58 |
59 | .list-group-item > & + & {
60 | margin-right: 5px;
61 | }
62 |
63 | .nav-pills > li > a > & {
64 | margin-left: 3px;
65 | }
66 | }
67 |
--------------------------------------------------------------------------------
/app/styles/less/bootstrap.less:
--------------------------------------------------------------------------------
1 | // Core variables and mixins
2 | @import "variables.less";
3 | @import "mixins.less";
4 |
5 | // Reset and dependencies
6 | @import "normalize.less";
7 | @import "print.less";
8 | @import "glyphicons.less";
9 |
10 | // Core CSS
11 | @import "scaffolding.less";
12 | @import "type.less";
13 | @import "code.less";
14 | @import "grid.less";
15 | @import "tables.less";
16 | @import "forms.less";
17 | @import "buttons.less";
18 |
19 | // Components
20 | @import "component-animations.less";
21 | @import "dropdowns.less";
22 | @import "button-groups.less";
23 | @import "input-groups.less";
24 | @import "navs.less";
25 | @import "navbar.less";
26 | @import "breadcrumbs.less";
27 | @import "pagination.less";
28 | @import "pager.less";
29 | @import "labels.less";
30 | @import "badges.less";
31 | @import "jumbotron.less";
32 | @import "thumbnails.less";
33 | @import "alerts.less";
34 | @import "progress-bars.less";
35 | @import "media.less";
36 | @import "list-group.less";
37 | @import "panels.less";
38 | @import "responsive-embed.less";
39 | @import "wells.less";
40 | @import "close.less";
41 |
42 | // Components w/ JavaScript
43 | @import "modals.less";
44 | @import "tooltip.less";
45 | @import "popovers.less";
46 | @import "carousel.less";
47 |
48 | // Utility classes
49 | @import "utilities.less";
50 | @import "responsive-utilities.less";
51 |
--------------------------------------------------------------------------------
/app/styles/less/breadcrumbs.less:
--------------------------------------------------------------------------------
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 | content: "@{breadcrumb-separator}\00a0"; // Unicode space added since inline-block means non-collapsing white-space
18 | padding: 0 5px;
19 | color: @breadcrumb-color;
20 | }
21 | }
22 |
23 | > .active {
24 | color: @breadcrumb-active-color;
25 | }
26 | }
27 |
--------------------------------------------------------------------------------
/app/styles/less/button-groups.less:
--------------------------------------------------------------------------------
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 | &:extend(.clearfix all);
38 |
39 | .btn-group,
40 | .input-group {
41 | float: left;
42 | }
43 | > .btn,
44 | > .btn-group,
45 | > .input-group {
46 | margin-left: 5px;
47 | }
48 | }
49 |
50 | .btn-group > .btn:not(:first-child):not(:last-child):not(.dropdown-toggle) {
51 | border-radius: 0;
52 | }
53 |
54 | // 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
55 | .btn-group > .btn:first-child {
56 | margin-left: 0;
57 | &:not(:last-child):not(.dropdown-toggle) {
58 | .border-right-radius(0);
59 | }
60 | }
61 | // Need .dropdown-toggle since :last-child doesn't apply given a .dropdown-menu immediately after it
62 | .btn-group > .btn:last-child:not(:first-child),
63 | .btn-group > .dropdown-toggle:not(:first-child) {
64 | .border-left-radius(0);
65 | }
66 |
67 | // Custom edits for including btn-groups within btn-groups (useful for including dropdown buttons within a btn-group)
68 | .btn-group > .btn-group {
69 | float: left;
70 | }
71 | .btn-group > .btn-group:not(:first-child):not(:last-child) > .btn {
72 | border-radius: 0;
73 | }
74 | .btn-group > .btn-group:first-child:not(:last-child) {
75 | > .btn:last-child,
76 | > .dropdown-toggle {
77 | .border-right-radius(0);
78 | }
79 | }
80 | .btn-group > .btn-group:last-child:not(:first-child) > .btn:first-child {
81 | .border-left-radius(0);
82 | }
83 |
84 | // On active and open, don't show outline
85 | .btn-group .dropdown-toggle:active,
86 | .btn-group.open .dropdown-toggle {
87 | outline: 0;
88 | }
89 |
90 |
91 | // Sizing
92 | //
93 | // Remix the default button sizing classes into new ones for easier manipulation.
94 |
95 | .btn-group-xs > .btn { &:extend(.btn-xs); }
96 | .btn-group-sm > .btn { &:extend(.btn-sm); }
97 | .btn-group-lg > .btn { &:extend(.btn-lg); }
98 |
99 |
100 | // Split button dropdowns
101 | // ----------------------
102 |
103 | // Give the line between buttons some depth
104 | .btn-group > .btn + .dropdown-toggle {
105 | padding-left: 8px;
106 | padding-right: 8px;
107 | }
108 | .btn-group > .btn-lg + .dropdown-toggle {
109 | padding-left: 12px;
110 | padding-right: 12px;
111 | }
112 |
113 | // The clickable button for toggling the menu
114 | // Remove the gradient and set the same inset shadow as the :active state
115 | .btn-group.open .dropdown-toggle {
116 | .box-shadow(inset 0 3px 5px rgba(0,0,0,.125));
117 |
118 | // Show no shadow for `.btn-link` since it has no other button styles.
119 | &.btn-link {
120 | .box-shadow(none);
121 | }
122 | }
123 |
124 |
125 | // Reposition the caret
126 | .btn .caret {
127 | margin-left: 0;
128 | }
129 | // Carets in other button sizes
130 | .btn-lg .caret {
131 | border-width: @caret-width-large @caret-width-large 0;
132 | border-bottom-width: 0;
133 | }
134 | // Upside down carets for .dropup
135 | .dropup .btn-lg .caret {
136 | border-width: 0 @caret-width-large @caret-width-large;
137 | }
138 |
139 |
140 | // Vertical button groups
141 | // ----------------------
142 |
143 | .btn-group-vertical {
144 | > .btn,
145 | > .btn-group,
146 | > .btn-group > .btn {
147 | display: block;
148 | float: none;
149 | width: 100%;
150 | max-width: 100%;
151 | }
152 |
153 | // Clear floats so dropdown menus can be properly placed
154 | > .btn-group {
155 | &:extend(.clearfix all);
156 | > .btn {
157 | float: none;
158 | }
159 | }
160 |
161 | > .btn + .btn,
162 | > .btn + .btn-group,
163 | > .btn-group + .btn,
164 | > .btn-group + .btn-group {
165 | margin-top: -1px;
166 | margin-left: 0;
167 | }
168 | }
169 |
170 | .btn-group-vertical > .btn {
171 | &:not(:first-child):not(:last-child) {
172 | border-radius: 0;
173 | }
174 | &:first-child:not(:last-child) {
175 | border-top-right-radius: @border-radius-base;
176 | .border-bottom-radius(0);
177 | }
178 | &:last-child:not(:first-child) {
179 | border-bottom-left-radius: @border-radius-base;
180 | .border-top-radius(0);
181 | }
182 | }
183 | .btn-group-vertical > .btn-group:not(:first-child):not(:last-child) > .btn {
184 | border-radius: 0;
185 | }
186 | .btn-group-vertical > .btn-group:first-child:not(:last-child) {
187 | > .btn:last-child,
188 | > .dropdown-toggle {
189 | .border-bottom-radius(0);
190 | }
191 | }
192 | .btn-group-vertical > .btn-group:last-child:not(:first-child) > .btn:first-child {
193 | .border-top-radius(0);
194 | }
195 |
196 |
197 | // Justified button groups
198 | // ----------------------
199 |
200 | .btn-group-justified {
201 | display: table;
202 | width: 100%;
203 | table-layout: fixed;
204 | border-collapse: separate;
205 | > .btn,
206 | > .btn-group {
207 | float: none;
208 | display: table-cell;
209 | width: 1%;
210 | }
211 | > .btn-group .btn {
212 | width: 100%;
213 | }
214 |
215 | > .btn-group .dropdown-menu {
216 | left: auto;
217 | }
218 | }
219 |
220 |
221 | // Checkbox and radio options
222 | //
223 | // In order to support the browser's form validation feedback, powered by the
224 | // `required` attribute, we have to "hide" the inputs via `clip`. We cannot use
225 | // `display: none;` or `visibility: hidden;` as that also hides the popover.
226 | // Simply visually hiding the inputs via `opacity` would leave them clickable in
227 | // certain cases which is prevented by using `clip` and `pointer-events`.
228 | // This way, we ensure a DOM element is visible to position the popover from.
229 | //
230 | // See https://github.com/twbs/bootstrap/pull/12794 and
231 | // https://github.com/twbs/bootstrap/pull/14559 for more information.
232 |
233 | [data-toggle="buttons"] {
234 | > .btn,
235 | > .btn-group > .btn {
236 | input[type="radio"],
237 | input[type="checkbox"] {
238 | position: absolute;
239 | clip: rect(0,0,0,0);
240 | pointer-events: none;
241 | }
242 | }
243 | }
244 |
--------------------------------------------------------------------------------
/app/styles/less/buttons.less:
--------------------------------------------------------------------------------
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 | .button-size(@padding-base-vertical; @padding-base-horizontal; @font-size-base; @line-height-base; @border-radius-base);
21 | .user-select(none);
22 |
23 | &,
24 | &:active,
25 | &.active {
26 | &:focus,
27 | &.focus {
28 | .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 | .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 | pointer-events: none; // Future-proof disabling of clicks
51 | .opacity(.65);
52 | .box-shadow(none);
53 | }
54 | }
55 |
56 |
57 | // Alternate buttons
58 | // --------------------------------------------------
59 |
60 | .btn-default {
61 | .button-variant(@btn-default-color; @btn-default-bg; @btn-default-border);
62 | }
63 | .btn-primary {
64 | .button-variant(@btn-primary-color; @btn-primary-bg; @btn-primary-border);
65 | }
66 | // Success appears as green
67 | .btn-success {
68 | .button-variant(@btn-success-color; @btn-success-bg; @btn-success-border);
69 | }
70 | // Info appears as blue-green
71 | .btn-info {
72 | .button-variant(@btn-info-color; @btn-info-bg; @btn-info-border);
73 | }
74 | // Warning appears as orange
75 | .btn-warning {
76 | .button-variant(@btn-warning-color; @btn-warning-bg; @btn-warning-border);
77 | }
78 | // Danger and error appear as red
79 | .btn-danger {
80 | .button-variant(@btn-danger-color; @btn-danger-bg; @btn-danger-border);
81 | }
82 |
83 |
84 | // Link buttons
85 | // -------------------------
86 |
87 | // Make a button look and behave like a link
88 | .btn-link {
89 | color: @link-color;
90 | font-weight: normal;
91 | border-radius: 0;
92 |
93 | &,
94 | &:active,
95 | &.active,
96 | &[disabled],
97 | fieldset[disabled] & {
98 | background-color: transparent;
99 | .box-shadow(none);
100 | }
101 | &,
102 | &:hover,
103 | &:focus,
104 | &:active {
105 | border-color: transparent;
106 | }
107 | &:hover,
108 | &:focus {
109 | color: @link-hover-color;
110 | text-decoration: @link-hover-decoration;
111 | background-color: transparent;
112 | }
113 | &[disabled],
114 | fieldset[disabled] & {
115 | &:hover,
116 | &:focus {
117 | color: @btn-link-disabled-color;
118 | text-decoration: none;
119 | }
120 | }
121 | }
122 |
123 |
124 | // Button Sizes
125 | // --------------------------------------------------
126 |
127 | .btn-lg {
128 | // line-height: ensure even-numbered height of button next to large input
129 | .button-size(@padding-large-vertical; @padding-large-horizontal; @font-size-large; @line-height-large; @border-radius-large);
130 | }
131 | .btn-sm {
132 | // line-height: ensure proper height of button next to small input
133 | .button-size(@padding-small-vertical; @padding-small-horizontal; @font-size-small; @line-height-small; @border-radius-small);
134 | }
135 | .btn-xs {
136 | .button-size(@padding-xs-vertical; @padding-xs-horizontal; @font-size-small; @line-height-small; @border-radius-small);
137 | }
138 |
139 |
140 | // Block button
141 | // --------------------------------------------------
142 |
143 | .btn-block {
144 | display: block;
145 | width: 100%;
146 | }
147 |
148 | // Vertically space out multiple block buttons
149 | .btn-block + .btn-block {
150 | margin-top: 5px;
151 | }
152 |
153 | // Specificity overrides
154 | input[type="submit"],
155 | input[type="reset"],
156 | input[type="button"] {
157 | &.btn-block {
158 | width: 100%;
159 | }
160 | }
161 |
--------------------------------------------------------------------------------
/app/styles/less/carousel.less:
--------------------------------------------------------------------------------
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 | .transition(.6s ease-in-out left);
20 |
21 | // Account for jankitude on images
22 | > img,
23 | > a > img {
24 | &:extend(.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 | .transition-transform(~'0.6s ease-in-out');
31 | .backface-visibility(~'hidden');
32 | .perspective(1000);
33 |
34 | &.next,
35 | &.active.right {
36 | .translate3d(100%, 0, 0);
37 | left: 0;
38 | }
39 | &.prev,
40 | &.active.left {
41 | .translate3d(-100%, 0, 0);
42 | left: 0;
43 | }
44 | &.next.left,
45 | &.prev.right,
46 | &.active {
47 | .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 | .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 | // We can't have this transition here because WebKit cancels the carousel
105 | // animation if you trip this while in the middle of another animation.
106 |
107 | // Set gradients for backgrounds
108 | &.left {
109 | #gradient > .horizontal(@start-color: rgba(0,0,0,.5); @end-color: rgba(0,0,0,.0001));
110 | }
111 | &.right {
112 | left: auto;
113 | right: 0;
114 | #gradient > .horizontal(@start-color: rgba(0,0,0,.0001); @end-color: rgba(0,0,0,.5));
115 | }
116 |
117 | // Hover/focus state
118 | &:hover,
119 | &:focus {
120 | outline: 0;
121 | color: @carousel-control-color;
122 | text-decoration: none;
123 | .opacity(.9);
124 | }
125 |
126 | // Toggles
127 | .icon-prev,
128 | .icon-next,
129 | .glyphicon-chevron-left,
130 | .glyphicon-chevron-right {
131 | position: absolute;
132 | top: 50%;
133 | z-index: 5;
134 | display: inline-block;
135 | }
136 | .icon-prev,
137 | .glyphicon-chevron-left {
138 | left: 50%;
139 | margin-left: -10px;
140 | }
141 | .icon-next,
142 | .glyphicon-chevron-right {
143 | right: 50%;
144 | margin-right: -10px;
145 | }
146 | .icon-prev,
147 | .icon-next {
148 | width: 20px;
149 | height: 20px;
150 | margin-top: -10px;
151 | line-height: 1;
152 | font-family: serif;
153 | }
154 |
155 |
156 | .icon-prev {
157 | &:before {
158 | content: '\2039';// SINGLE LEFT-POINTING ANGLE QUOTATION MARK (U+2039)
159 | }
160 | }
161 | .icon-next {
162 | &:before {
163 | content: '\203a';// SINGLE RIGHT-POINTING ANGLE QUOTATION MARK (U+203A)
164 | }
165 | }
166 | }
167 |
168 | // Optional indicator pips
169 | //
170 | // Add an unordered list with the following class and add a list item for each
171 | // slide your carousel holds.
172 |
173 | .carousel-indicators {
174 | position: absolute;
175 | bottom: 10px;
176 | left: 50%;
177 | z-index: 15;
178 | width: 60%;
179 | margin-left: -30%;
180 | padding-left: 0;
181 | list-style: none;
182 | text-align: center;
183 |
184 | li {
185 | display: inline-block;
186 | width: 10px;
187 | height: 10px;
188 | margin: 1px;
189 | text-indent: -999px;
190 | border: 1px solid @carousel-indicator-border-color;
191 | border-radius: 10px;
192 | cursor: pointer;
193 |
194 | // IE8-9 hack for event handling
195 | //
196 | // Internet Explorer 8-9 does not support clicks on elements without a set
197 | // `background-color`. We cannot use `filter` since that's not viewed as a
198 | // background color by the browser. Thus, a hack is needed.
199 | // See https://developer.mozilla.org/en-US/docs/Web/Events/click#Internet_Explorer
200 | //
201 | // For IE8, we set solid black as it doesn't support `rgba()`. For IE9, we
202 | // set alpha transparency for the best results possible.
203 | background-color: #000 \9; // IE8
204 | background-color: rgba(0,0,0,0); // IE9
205 | }
206 | .active {
207 | margin: 0;
208 | width: 12px;
209 | height: 12px;
210 | background-color: @carousel-indicator-active-bg;
211 | }
212 | }
213 |
214 | // Optional captions
215 | // -----------------------------
216 | // Hidden by default for smaller viewports
217 | .carousel-caption {
218 | position: absolute;
219 | left: 15%;
220 | right: 15%;
221 | bottom: 20px;
222 | z-index: 10;
223 | padding-top: 20px;
224 | padding-bottom: 20px;
225 | color: @carousel-caption-color;
226 | text-align: center;
227 | text-shadow: @carousel-text-shadow;
228 | & .btn {
229 | text-shadow: none; // No shadow for button elements in carousel-caption
230 | }
231 | }
232 |
233 |
234 | // Scale up controls for tablets and up
235 | @media screen and (min-width: @screen-sm-min) {
236 |
237 | // Scale up the controls a smidge
238 | .carousel-control {
239 | .glyphicon-chevron-left,
240 | .glyphicon-chevron-right,
241 | .icon-prev,
242 | .icon-next {
243 | width: 30px;
244 | height: 30px;
245 | margin-top: -15px;
246 | font-size: 30px;
247 | }
248 | .glyphicon-chevron-left,
249 | .icon-prev {
250 | margin-left: -15px;
251 | }
252 | .glyphicon-chevron-right,
253 | .icon-next {
254 | margin-right: -15px;
255 | }
256 | }
257 |
258 | // Show and left align the captions
259 | .carousel-caption {
260 | left: 20%;
261 | right: 20%;
262 | padding-bottom: 30px;
263 | }
264 |
265 | // Move up the indicators
266 | .carousel-indicators {
267 | bottom: 20px;
268 | }
269 | }
270 |
--------------------------------------------------------------------------------
/app/styles/less/close.less:
--------------------------------------------------------------------------------
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 | .opacity(.2);
14 |
15 | &:hover,
16 | &:focus {
17 | color: @close-color;
18 | text-decoration: none;
19 | cursor: pointer;
20 | .opacity(.5);
21 | }
22 |
23 | // Additional properties for button version
24 | // iOS requires the button element instead of an anchor tag.
25 | // If you want the anchor version, it requires `href="#"`.
26 | // See https://developer.mozilla.org/en-US/docs/Web/Events/click#Safari_Mobile
27 | button& {
28 | padding: 0;
29 | cursor: pointer;
30 | background: transparent;
31 | border: 0;
32 | -webkit-appearance: none;
33 | }
34 | }
35 |
--------------------------------------------------------------------------------
/app/styles/less/code.less:
--------------------------------------------------------------------------------
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/styles/less/component-animations.less:
--------------------------------------------------------------------------------
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 | .transition(opacity .15s linear);
13 | &.in {
14 | opacity: 1;
15 | }
16 | }
17 |
18 | .collapse {
19 | display: none;
20 |
21 | &.in { display: block; }
22 | tr&.in { display: table-row; }
23 | tbody&.in { display: table-row-group; }
24 | }
25 |
26 | .collapsing {
27 | position: relative;
28 | height: 0;
29 | overflow: hidden;
30 | .transition-property(~"height, visibility");
31 | .transition-duration(.35s);
32 | .transition-timing-function(ease);
33 | }
34 |
--------------------------------------------------------------------------------
/app/styles/less/dropdowns.less:
--------------------------------------------------------------------------------
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-right: @caret-width-base solid transparent;
15 | border-left: @caret-width-base solid transparent;
16 | }
17 |
18 | // The dropdown wrapper (div)
19 | .dropup,
20 | .dropdown {
21 | position: relative;
22 | }
23 |
24 | // Prevent the focus on the dropdown toggle when closing dropdowns
25 | .dropdown-toggle:focus {
26 | outline: 0;
27 | }
28 |
29 | // The dropdown menu (ul)
30 | .dropdown-menu {
31 | position: absolute;
32 | top: 100%;
33 | left: 0;
34 | z-index: @zindex-dropdown;
35 | display: none; // none by default, but block on "open" of the menu
36 | float: left;
37 | min-width: 160px;
38 | padding: 5px 0;
39 | margin: 2px 0 0; // override default ul
40 | list-style: none;
41 | font-size: @font-size-base;
42 | text-align: left; // Ensures proper alignment if parent has it changed (e.g., modal footer)
43 | background-color: @dropdown-bg;
44 | border: 1px solid @dropdown-fallback-border; // IE8 fallback
45 | border: 1px solid @dropdown-border;
46 | border-radius: @border-radius-base;
47 | .box-shadow(0 6px 12px rgba(0,0,0,.175));
48 | background-clip: padding-box;
49 |
50 | // Aligns the dropdown menu to right
51 | //
52 | // Deprecated as of 3.1.0 in favor of `.dropdown-menu-[dir]`
53 | &.pull-right {
54 | right: 0;
55 | left: auto;
56 | }
57 |
58 | // Dividers (basically an hr) within the dropdown
59 | .divider {
60 | .nav-divider(@dropdown-divider-bg);
61 | }
62 |
63 | // Links within the dropdown menu
64 | > li > a {
65 | display: block;
66 | padding: 3px 20px;
67 | clear: both;
68 | font-weight: normal;
69 | line-height: @line-height-base;
70 | color: @dropdown-link-color;
71 | white-space: nowrap; // prevent links from randomly breaking onto new lines
72 | }
73 | }
74 |
75 | // Hover/Focus state
76 | .dropdown-menu > li > a {
77 | &:hover,
78 | &:focus {
79 | text-decoration: none;
80 | color: @dropdown-link-hover-color;
81 | background-color: @dropdown-link-hover-bg;
82 | }
83 | }
84 |
85 | // Active state
86 | .dropdown-menu > .active > a {
87 | &,
88 | &:hover,
89 | &:focus {
90 | color: @dropdown-link-active-color;
91 | text-decoration: none;
92 | outline: 0;
93 | background-color: @dropdown-link-active-bg;
94 | }
95 | }
96 |
97 | // Disabled state
98 | //
99 | // Gray out text and ensure the hover/focus state remains gray
100 |
101 | .dropdown-menu > .disabled > a {
102 | &,
103 | &:hover,
104 | &:focus {
105 | color: @dropdown-link-disabled-color;
106 | }
107 |
108 | // Nuke hover/focus effects
109 | &:hover,
110 | &:focus {
111 | text-decoration: none;
112 | background-color: transparent;
113 | background-image: none; // Remove CSS gradient
114 | .reset-filter();
115 | cursor: @cursor-disabled;
116 | }
117 | }
118 |
119 | // Open state for the dropdown
120 | .open {
121 | // Show the menu
122 | > .dropdown-menu {
123 | display: block;
124 | }
125 |
126 | // Remove the outline when :focus is triggered
127 | > a {
128 | outline: 0;
129 | }
130 | }
131 |
132 | // Menu positioning
133 | //
134 | // Add extra class to `.dropdown-menu` to flip the alignment of the dropdown
135 | // menu with the parent.
136 | .dropdown-menu-right {
137 | left: auto; // Reset the default from `.dropdown-menu`
138 | right: 0;
139 | }
140 | // With v3, we enabled auto-flipping if you have a dropdown within a right
141 | // aligned nav component. To enable the undoing of that, we provide an override
142 | // to restore the default dropdown menu alignment.
143 | //
144 | // This is only for left-aligning a dropdown menu within a `.navbar-right` or
145 | // `.pull-right` nav component.
146 | .dropdown-menu-left {
147 | left: 0;
148 | right: auto;
149 | }
150 |
151 | // Dropdown section headers
152 | .dropdown-header {
153 | display: block;
154 | padding: 3px 20px;
155 | font-size: @font-size-small;
156 | line-height: @line-height-base;
157 | color: @dropdown-header-color;
158 | white-space: nowrap; // as with > li > a
159 | }
160 |
161 | // Backdrop to catch body clicks on mobile, etc.
162 | .dropdown-backdrop {
163 | position: fixed;
164 | left: 0;
165 | right: 0;
166 | bottom: 0;
167 | top: 0;
168 | z-index: (@zindex-dropdown - 10);
169 | }
170 |
171 | // Right aligned dropdowns
172 | .pull-right > .dropdown-menu {
173 | right: 0;
174 | left: auto;
175 | }
176 |
177 | // Allow for dropdowns to go bottom up (aka, dropup-menu)
178 | //
179 | // Just add .dropup after the standard .dropdown class and you're set, bro.
180 | // TODO: abstract this so that the navbar fixed styles are not placed here?
181 |
182 | .dropup,
183 | .navbar-fixed-bottom .dropdown {
184 | // Reverse the caret
185 | .caret {
186 | border-top: 0;
187 | border-bottom: @caret-width-base solid;
188 | content: "";
189 | }
190 | // Different positioning for bottom up menu
191 | .dropdown-menu {
192 | top: auto;
193 | bottom: 100%;
194 | margin-bottom: 2px;
195 | }
196 | }
197 |
198 |
199 | // Component alignment
200 | //
201 | // Reiterate per navbar.less and the modified component alignment there.
202 |
203 | @media (min-width: @grid-float-breakpoint) {
204 | .navbar-right {
205 | .dropdown-menu {
206 | .dropdown-menu-right();
207 | }
208 | // Necessary for overrides of the default right aligned menu.
209 | // Will remove come v4 in all likelihood.
210 | .dropdown-menu-left {
211 | .dropdown-menu-left();
212 | }
213 | }
214 | }
215 |
--------------------------------------------------------------------------------
/app/styles/less/grid.less:
--------------------------------------------------------------------------------
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 | .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 | .container-fixed();
32 | }
33 |
34 |
35 | // Row
36 | //
37 | // Rows contain and clear the floats of your columns.
38 |
39 | .row {
40 | .make-row();
41 | }
42 |
43 |
44 | // Columns
45 | //
46 | // Common styles for small and large grid columns
47 |
48 | .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 | .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 | .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 | .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 | .make-grid(lg);
84 | }
85 |
--------------------------------------------------------------------------------
/app/styles/less/input-groups.less:
--------------------------------------------------------------------------------
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 | }
34 |
35 | // Sizing options
36 | //
37 | // Remix the default form control sizing classes into new ones for easier
38 | // manipulation.
39 |
40 | .input-group-lg > .form-control,
41 | .input-group-lg > .input-group-addon,
42 | .input-group-lg > .input-group-btn > .btn {
43 | .input-lg();
44 | }
45 | .input-group-sm > .form-control,
46 | .input-group-sm > .input-group-addon,
47 | .input-group-sm > .input-group-btn > .btn {
48 | .input-sm();
49 | }
50 |
51 |
52 | // Display as table-cell
53 | // -------------------------
54 | .input-group-addon,
55 | .input-group-btn,
56 | .input-group .form-control {
57 | display: table-cell;
58 |
59 | &:not(:first-child):not(:last-child) {
60 | border-radius: 0;
61 | }
62 | }
63 | // Addon and addon wrapper for buttons
64 | .input-group-addon,
65 | .input-group-btn {
66 | width: 1%;
67 | white-space: nowrap;
68 | vertical-align: middle; // Match the inputs
69 | }
70 |
71 | // Text input groups
72 | // -------------------------
73 | .input-group-addon {
74 | padding: @padding-base-vertical @padding-base-horizontal;
75 | font-size: @font-size-base;
76 | font-weight: normal;
77 | line-height: 1;
78 | color: @input-color;
79 | text-align: center;
80 | background-color: @input-group-addon-bg;
81 | border: 1px solid @input-group-addon-border-color;
82 | border-radius: @border-radius-base;
83 |
84 | // Sizing
85 | &.input-sm {
86 | padding: @padding-small-vertical @padding-small-horizontal;
87 | font-size: @font-size-small;
88 | border-radius: @border-radius-small;
89 | }
90 | &.input-lg {
91 | padding: @padding-large-vertical @padding-large-horizontal;
92 | font-size: @font-size-large;
93 | border-radius: @border-radius-large;
94 | }
95 |
96 | // Nuke default margins from checkboxes and radios to vertically center within.
97 | input[type="radio"],
98 | input[type="checkbox"] {
99 | margin-top: 0;
100 | }
101 | }
102 |
103 | // Reset rounded corners
104 | .input-group .form-control:first-child,
105 | .input-group-addon:first-child,
106 | .input-group-btn:first-child > .btn,
107 | .input-group-btn:first-child > .btn-group > .btn,
108 | .input-group-btn:first-child > .dropdown-toggle,
109 | .input-group-btn:last-child > .btn:not(:last-child):not(.dropdown-toggle),
110 | .input-group-btn:last-child > .btn-group:not(:last-child) > .btn {
111 | .border-right-radius(0);
112 | }
113 | .input-group-addon:first-child {
114 | border-right: 0;
115 | }
116 | .input-group .form-control:last-child,
117 | .input-group-addon:last-child,
118 | .input-group-btn:last-child > .btn,
119 | .input-group-btn:last-child > .btn-group > .btn,
120 | .input-group-btn:last-child > .dropdown-toggle,
121 | .input-group-btn:first-child > .btn:not(:first-child),
122 | .input-group-btn:first-child > .btn-group:not(:first-child) > .btn {
123 | .border-left-radius(0);
124 | }
125 | .input-group-addon:last-child {
126 | border-left: 0;
127 | }
128 |
129 | // Button input groups
130 | // -------------------------
131 | .input-group-btn {
132 | position: relative;
133 | // Jankily prevent input button groups from wrapping with `white-space` and
134 | // `font-size` in combination with `inline-block` on buttons.
135 | font-size: 0;
136 | white-space: nowrap;
137 |
138 | // Negative margin for spacing, position for bringing hovered/focused/actived
139 | // element above the siblings.
140 | > .btn {
141 | position: relative;
142 | + .btn {
143 | margin-left: -1px;
144 | }
145 | // Bring the "active" button to the front
146 | &:hover,
147 | &:focus,
148 | &:active {
149 | z-index: 2;
150 | }
151 | }
152 |
153 | // Negative margin to only have a 1px border between the two
154 | &:first-child {
155 | > .btn,
156 | > .btn-group {
157 | margin-right: -1px;
158 | }
159 | }
160 | &:last-child {
161 | > .btn,
162 | > .btn-group {
163 | margin-left: -1px;
164 | }
165 | }
166 | }
167 |
--------------------------------------------------------------------------------
/app/styles/less/jumbotron.less:
--------------------------------------------------------------------------------
1 | //
2 | // Jumbotron
3 | // --------------------------------------------------
4 |
5 |
6 | .jumbotron {
7 | padding: @jumbotron-padding (@jumbotron-padding / 2);
8 | margin-bottom: @jumbotron-padding;
9 | color: @jumbotron-color;
10 | background-color: @jumbotron-bg;
11 |
12 | h1,
13 | .h1 {
14 | color: @jumbotron-heading-color;
15 | }
16 |
17 | p {
18 | margin-bottom: (@jumbotron-padding / 2);
19 | font-size: @jumbotron-font-size;
20 | font-weight: 200;
21 | }
22 |
23 | > hr {
24 | border-top-color: darken(@jumbotron-bg, 10%);
25 | }
26 |
27 | .container &,
28 | .container-fluid & {
29 | border-radius: @border-radius-large; // Only round corners at higher resolutions if contained in a container
30 | }
31 |
32 | .container {
33 | max-width: 100%;
34 | }
35 |
36 | @media screen and (min-width: @screen-sm-min) {
37 | padding: (@jumbotron-padding * 1.6) 0;
38 |
39 | .container &,
40 | .container-fluid & {
41 | padding-left: (@jumbotron-padding * 2);
42 | padding-right: (@jumbotron-padding * 2);
43 | }
44 |
45 | h1,
46 | .h1 {
47 | font-size: (@font-size-base * 4.5);
48 | }
49 | }
50 | }
51 |
--------------------------------------------------------------------------------
/app/styles/less/labels.less:
--------------------------------------------------------------------------------
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 | // Add hover effects, but only for links
18 | a& {
19 | &:hover,
20 | &:focus {
21 | color: @label-link-hover-color;
22 | text-decoration: none;
23 | cursor: pointer;
24 | }
25 | }
26 |
27 | // Empty labels collapse automatically (not available in IE8)
28 | &:empty {
29 | display: none;
30 | }
31 |
32 | // Quick fix for labels in buttons
33 | .btn & {
34 | position: relative;
35 | top: -1px;
36 | }
37 | }
38 |
39 | // Colors
40 | // Contextual variations (linked labels get darker on :hover)
41 |
42 | .label-default {
43 | .label-variant(@label-default-bg);
44 | }
45 |
46 | .label-primary {
47 | .label-variant(@label-primary-bg);
48 | }
49 |
50 | .label-success {
51 | .label-variant(@label-success-bg);
52 | }
53 |
54 | .label-info {
55 | .label-variant(@label-info-bg);
56 | }
57 |
58 | .label-warning {
59 | .label-variant(@label-warning-bg);
60 | }
61 |
62 | .label-danger {
63 | .label-variant(@label-danger-bg);
64 | }
65 |
--------------------------------------------------------------------------------
/app/styles/less/list-group.less:
--------------------------------------------------------------------------------
1 | //
2 | // List groups
3 | // --------------------------------------------------
4 |
5 |
6 | // Base class
7 | //
8 | // Easily usable on , , or .
9 |
10 | .list-group {
11 | // No need to set list-style: none; since .list-group-item is block level
12 | margin-bottom: 20px;
13 | padding-left: 0; // reset padding because ul and ol
14 | }
15 |
16 |
17 | // Individual list items
18 | //
19 | // Use on `li`s or `div`s within the `.list-group` parent.
20 |
21 | .list-group-item {
22 | position: relative;
23 | display: block;
24 | padding: 10px 15px;
25 | // Place the border on the list items and negative margin up for better styling
26 | margin-bottom: -1px;
27 | background-color: @list-group-bg;
28 | border: 1px solid @list-group-border;
29 |
30 | // Round the first and last items
31 | &:first-child {
32 | .border-top-radius(@list-group-border-radius);
33 | }
34 | &:last-child {
35 | margin-bottom: 0;
36 | .border-bottom-radius(@list-group-border-radius);
37 | }
38 | }
39 |
40 |
41 | // Linked list items
42 | //
43 | // Use anchor elements instead of `li`s or `div`s to create linked list items.
44 | // Includes an extra `.active` modifier class for showing selected items.
45 |
46 | a.list-group-item {
47 | color: @list-group-link-color;
48 |
49 | .list-group-item-heading {
50 | color: @list-group-link-heading-color;
51 | }
52 |
53 | // Hover state
54 | &:hover,
55 | &:focus {
56 | text-decoration: none;
57 | color: @list-group-link-hover-color;
58 | background-color: @list-group-hover-bg;
59 | }
60 | }
61 |
62 | .list-group-item {
63 | // Disabled state
64 | &.disabled,
65 | &.disabled:hover,
66 | &.disabled:focus {
67 | background-color: @list-group-disabled-bg;
68 | color: @list-group-disabled-color;
69 | cursor: @cursor-disabled;
70 |
71 | // Force color to inherit for custom content
72 | .list-group-item-heading {
73 | color: inherit;
74 | }
75 | .list-group-item-text {
76 | color: @list-group-disabled-text-color;
77 | }
78 | }
79 |
80 | // Active class on item itself, not parent
81 | &.active,
82 | &.active:hover,
83 | &.active:focus {
84 | z-index: 2; // Place active items above their siblings for proper border styling
85 | color: @list-group-active-color;
86 | background-color: @list-group-active-bg;
87 | border-color: @list-group-active-border;
88 |
89 | // Force color to inherit for custom content
90 | .list-group-item-heading,
91 | .list-group-item-heading > small,
92 | .list-group-item-heading > .small {
93 | color: inherit;
94 | }
95 | .list-group-item-text {
96 | color: @list-group-active-text-color;
97 | }
98 | }
99 | }
100 |
101 |
102 | // Contextual variants
103 | //
104 | // Add modifier classes to change text and background color on individual items.
105 | // Organizationally, this must come after the `:hover` states.
106 |
107 | .list-group-item-variant(success; @state-success-bg; @state-success-text);
108 | .list-group-item-variant(info; @state-info-bg; @state-info-text);
109 | .list-group-item-variant(warning; @state-warning-bg; @state-warning-text);
110 | .list-group-item-variant(danger; @state-danger-bg; @state-danger-text);
111 |
112 |
113 | // Custom content options
114 | //
115 | // Extra classes for creating well-formatted content within `.list-group-item`s.
116 |
117 | .list-group-item-heading {
118 | margin-top: 0;
119 | margin-bottom: 5px;
120 | }
121 | .list-group-item-text {
122 | margin-bottom: 0;
123 | line-height: 1.3;
124 | }
125 |
--------------------------------------------------------------------------------
/app/styles/less/media.less:
--------------------------------------------------------------------------------
1 | .media {
2 | // Proper spacing between instances of .media
3 | margin-top: 15px;
4 |
5 | &:first-child {
6 | margin-top: 0;
7 | }
8 | }
9 |
10 | .media,
11 | .media-body {
12 | zoom: 1;
13 | overflow: hidden;
14 | }
15 |
16 | .media-body {
17 | width: 10000px;
18 | }
19 |
20 | .media-object {
21 | display: block;
22 | }
23 |
24 | .media-right,
25 | .media > .pull-right {
26 | padding-left: 10px;
27 | }
28 |
29 | .media-left,
30 | .media > .pull-left {
31 | padding-right: 10px;
32 | }
33 |
34 | .media-left,
35 | .media-right,
36 | .media-body {
37 | display: table-cell;
38 | vertical-align: top;
39 | }
40 |
41 | .media-middle {
42 | vertical-align: middle;
43 | }
44 |
45 | .media-bottom {
46 | vertical-align: bottom;
47 | }
48 |
49 | // Reset margins on headings for tighter default spacing
50 | .media-heading {
51 | margin-top: 0;
52 | margin-bottom: 5px;
53 | }
54 |
55 | // Media list variation
56 | //
57 | // Undo default ul/ol styles
58 | .media-list {
59 | padding-left: 0;
60 | list-style: none;
61 | }
62 |
--------------------------------------------------------------------------------
/app/styles/less/mixins.less:
--------------------------------------------------------------------------------
1 | // Mixins
2 | // --------------------------------------------------
3 |
4 | // Utilities
5 | @import "mixins/hide-text.less";
6 | @import "mixins/opacity.less";
7 | @import "mixins/image.less";
8 | @import "mixins/labels.less";
9 | @import "mixins/reset-filter.less";
10 | @import "mixins/resize.less";
11 | @import "mixins/responsive-visibility.less";
12 | @import "mixins/size.less";
13 | @import "mixins/tab-focus.less";
14 | @import "mixins/text-emphasis.less";
15 | @import "mixins/text-overflow.less";
16 | @import "mixins/vendor-prefixes.less";
17 |
18 | // Components
19 | @import "mixins/alerts.less";
20 | @import "mixins/buttons.less";
21 | @import "mixins/panels.less";
22 | @import "mixins/pagination.less";
23 | @import "mixins/list-group.less";
24 | @import "mixins/nav-divider.less";
25 | @import "mixins/forms.less";
26 | @import "mixins/progress-bar.less";
27 | @import "mixins/table-row.less";
28 |
29 | // Skins
30 | @import "mixins/background-variant.less";
31 | @import "mixins/border-radius.less";
32 | @import "mixins/gradients.less";
33 |
34 | // Layout
35 | @import "mixins/clearfix.less";
36 | @import "mixins/center-block.less";
37 | @import "mixins/nav-vertical-align.less";
38 | @import "mixins/grid-framework.less";
39 | @import "mixins/grid.less";
40 |
--------------------------------------------------------------------------------
/app/styles/less/mixins/alerts.less:
--------------------------------------------------------------------------------
1 | // Alerts
2 |
3 | .alert-variant(@background; @border; @text-color) {
4 | background-color: @background;
5 | border-color: @border;
6 | color: @text-color;
7 |
8 | hr {
9 | border-top-color: darken(@border, 5%);
10 | }
11 | .alert-link {
12 | color: darken(@text-color, 10%);
13 | }
14 | }
15 |
--------------------------------------------------------------------------------
/app/styles/less/mixins/background-variant.less:
--------------------------------------------------------------------------------
1 | // Contextual backgrounds
2 |
3 | .bg-variant(@color) {
4 | background-color: @color;
5 | a&:hover {
6 | background-color: darken(@color, 10%);
7 | }
8 | }
9 |
--------------------------------------------------------------------------------
/app/styles/less/mixins/border-radius.less:
--------------------------------------------------------------------------------
1 | // Single side border-radius
2 |
3 | .border-top-radius(@radius) {
4 | border-top-right-radius: @radius;
5 | border-top-left-radius: @radius;
6 | }
7 | .border-right-radius(@radius) {
8 | border-bottom-right-radius: @radius;
9 | border-top-right-radius: @radius;
10 | }
11 | .border-bottom-radius(@radius) {
12 | border-bottom-right-radius: @radius;
13 | border-bottom-left-radius: @radius;
14 | }
15 | .border-left-radius(@radius) {
16 | border-bottom-left-radius: @radius;
17 | border-top-left-radius: @radius;
18 | }
19 |
--------------------------------------------------------------------------------
/app/styles/less/mixins/buttons.less:
--------------------------------------------------------------------------------
1 | // Button variants
2 | //
3 | // Easily pump out default styles, as well as :hover, :focus, :active,
4 | // and disabled options for all buttons
5 |
6 | .button-variant(@color; @background; @border) {
7 | color: @color;
8 | background-color: @background;
9 | border-color: @border;
10 |
11 | &:hover,
12 | &:focus,
13 | &.focus,
14 | &:active,
15 | &.active,
16 | .open > .dropdown-toggle& {
17 | color: @color;
18 | background-color: darken(@background, 10%);
19 | border-color: darken(@border, 12%);
20 | }
21 | &:active,
22 | &.active,
23 | .open > .dropdown-toggle& {
24 | background-image: none;
25 | }
26 | &.disabled,
27 | &[disabled],
28 | fieldset[disabled] & {
29 | &,
30 | &:hover,
31 | &:focus,
32 | &.focus,
33 | &:active,
34 | &.active {
35 | background-color: @background;
36 | border-color: @border;
37 | }
38 | }
39 |
40 | .badge {
41 | color: @background;
42 | background-color: @color;
43 | }
44 | }
45 |
46 | // Button sizes
47 | .button-size(@padding-vertical; @padding-horizontal; @font-size; @line-height; @border-radius) {
48 | padding: @padding-vertical @padding-horizontal;
49 | font-size: @font-size;
50 | line-height: @line-height;
51 | border-radius: @border-radius;
52 | }
53 |
--------------------------------------------------------------------------------
/app/styles/less/mixins/center-block.less:
--------------------------------------------------------------------------------
1 | // Center-align a block level element
2 |
3 | .center-block() {
4 | display: block;
5 | margin-left: auto;
6 | margin-right: auto;
7 | }
8 |
--------------------------------------------------------------------------------
/app/styles/less/mixins/clearfix.less:
--------------------------------------------------------------------------------
1 | // Clearfix
2 | //
3 | // For modern browsers
4 | // 1. The space content is one way to avoid an Opera bug when the
5 | // contenteditable attribute is included anywhere else in the document.
6 | // Otherwise it causes space to appear at the top and bottom of elements
7 | // that are clearfixed.
8 | // 2. The use of `table` rather than `block` is only necessary if using
9 | // `:before` to contain the top-margins of child elements.
10 | //
11 | // Source: http://nicolasgallagher.com/micro-clearfix-hack/
12 |
13 | .clearfix() {
14 | &:before,
15 | &:after {
16 | content: " "; // 1
17 | display: table; // 2
18 | }
19 | &:after {
20 | clear: both;
21 | }
22 | }
23 |
--------------------------------------------------------------------------------
/app/styles/less/mixins/forms.less:
--------------------------------------------------------------------------------
1 | // Form validation states
2 | //
3 | // Used in forms.less to generate the form validation CSS for warnings, errors,
4 | // and successes.
5 |
6 | .form-control-validation(@text-color: #555; @border-color: #ccc; @background-color: #f5f5f5) {
7 | // Color the label and help text
8 | .help-block,
9 | .control-label,
10 | .radio,
11 | .checkbox,
12 | .radio-inline,
13 | .checkbox-inline,
14 | &.radio label,
15 | &.checkbox label,
16 | &.radio-inline label,
17 | &.checkbox-inline label {
18 | color: @text-color;
19 | }
20 | // Set the border and box shadow on specific inputs to match
21 | .form-control {
22 | border-color: @border-color;
23 | .box-shadow(inset 0 1px 1px rgba(0,0,0,.075)); // Redeclare so transitions work
24 | &:focus {
25 | border-color: darken(@border-color, 10%);
26 | @shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 6px lighten(@border-color, 20%);
27 | .box-shadow(@shadow);
28 | }
29 | }
30 | // Set validation states also for addons
31 | .input-group-addon {
32 | color: @text-color;
33 | border-color: @border-color;
34 | background-color: @background-color;
35 | }
36 | // Optional feedback icon
37 | .form-control-feedback {
38 | color: @text-color;
39 | }
40 | }
41 |
42 |
43 | // Form control focus state
44 | //
45 | // Generate a customized focus state and for any input with the specified color,
46 | // which defaults to the `@input-border-focus` variable.
47 | //
48 | // We highly encourage you to not customize the default value, but instead use
49 | // this to tweak colors on an as-needed basis. This aesthetic change is based on
50 | // WebKit's default styles, but applicable to a wider range of browsers. Its
51 | // usability and accessibility should be taken into account with any change.
52 | //
53 | // Example usage: change the default blue border and shadow to white for better
54 | // contrast against a dark gray background.
55 | .form-control-focus(@color: @input-border-focus) {
56 | @color-rgba: rgba(red(@color), green(@color), blue(@color), .6);
57 | &:focus {
58 | border-color: @color;
59 | outline: 0;
60 | .box-shadow(~"inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px @{color-rgba}");
61 | }
62 | }
63 |
64 | // Form control sizing
65 | //
66 | // Relative text size, padding, and border-radii changes for form controls. For
67 | // horizontal sizing, wrap controls in the predefined grid classes. `
`
68 | // element gets special love because it's special, and that's a fact!
69 | .input-size(@input-height; @padding-vertical; @padding-horizontal; @font-size; @line-height; @border-radius) {
70 | height: @input-height;
71 | padding: @padding-vertical @padding-horizontal;
72 | font-size: @font-size;
73 | line-height: @line-height;
74 | border-radius: @border-radius;
75 |
76 | select& {
77 | height: @input-height;
78 | line-height: @input-height;
79 | }
80 |
81 | textarea&,
82 | select[multiple]& {
83 | height: auto;
84 | }
85 | }
86 |
--------------------------------------------------------------------------------
/app/styles/less/mixins/gradients.less:
--------------------------------------------------------------------------------
1 | // Gradients
2 |
3 | #gradient {
4 |
5 | // Horizontal gradient, from left to right
6 | //
7 | // Creates two color stops, start and end, by specifying a color and position for each color stop.
8 | // Color stops are not available in IE9 and below.
9 | .horizontal(@start-color: #555; @end-color: #333; @start-percent: 0%; @end-percent: 100%) {
10 | background-image: -webkit-linear-gradient(left, @start-color @start-percent, @end-color @end-percent); // Safari 5.1-6, Chrome 10+
11 | background-image: -o-linear-gradient(left, @start-color @start-percent, @end-color @end-percent); // Opera 12
12 | background-image: linear-gradient(to right, @start-color @start-percent, @end-color @end-percent); // Standard, IE10, Firefox 16+, Opera 12.10+, Safari 7+, Chrome 26+
13 | background-repeat: repeat-x;
14 | filter: e(%("progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=1)",argb(@start-color),argb(@end-color))); // IE9 and down
15 | }
16 |
17 | // Vertical gradient, from top to bottom
18 | //
19 | // Creates two color stops, start and end, by specifying a color and position for each color stop.
20 | // Color stops are not available in IE9 and below.
21 | .vertical(@start-color: #555; @end-color: #333; @start-percent: 0%; @end-percent: 100%) {
22 | background-image: -webkit-linear-gradient(top, @start-color @start-percent, @end-color @end-percent); // Safari 5.1-6, Chrome 10+
23 | background-image: -o-linear-gradient(top, @start-color @start-percent, @end-color @end-percent); // Opera 12
24 | background-image: linear-gradient(to bottom, @start-color @start-percent, @end-color @end-percent); // Standard, IE10, Firefox 16+, Opera 12.10+, Safari 7+, Chrome 26+
25 | background-repeat: repeat-x;
26 | filter: e(%("progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=0)",argb(@start-color),argb(@end-color))); // IE9 and down
27 | }
28 |
29 | .directional(@start-color: #555; @end-color: #333; @deg: 45deg) {
30 | background-repeat: repeat-x;
31 | background-image: -webkit-linear-gradient(@deg, @start-color, @end-color); // Safari 5.1-6, Chrome 10+
32 | background-image: -o-linear-gradient(@deg, @start-color, @end-color); // Opera 12
33 | background-image: linear-gradient(@deg, @start-color, @end-color); // Standard, IE10, Firefox 16+, Opera 12.10+, Safari 7+, Chrome 26+
34 | }
35 | .horizontal-three-colors(@start-color: #00b3ee; @mid-color: #7a43b6; @color-stop: 50%; @end-color: #c3325f) {
36 | background-image: -webkit-linear-gradient(left, @start-color, @mid-color @color-stop, @end-color);
37 | background-image: -o-linear-gradient(left, @start-color, @mid-color @color-stop, @end-color);
38 | background-image: linear-gradient(to right, @start-color, @mid-color @color-stop, @end-color);
39 | background-repeat: no-repeat;
40 | filter: e(%("progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=1)",argb(@start-color),argb(@end-color))); // IE9 and down, gets no color-stop at all for proper fallback
41 | }
42 | .vertical-three-colors(@start-color: #00b3ee; @mid-color: #7a43b6; @color-stop: 50%; @end-color: #c3325f) {
43 | background-image: -webkit-linear-gradient(@start-color, @mid-color @color-stop, @end-color);
44 | background-image: -o-linear-gradient(@start-color, @mid-color @color-stop, @end-color);
45 | background-image: linear-gradient(@start-color, @mid-color @color-stop, @end-color);
46 | background-repeat: no-repeat;
47 | filter: e(%("progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=0)",argb(@start-color),argb(@end-color))); // IE9 and down, gets no color-stop at all for proper fallback
48 | }
49 | .radial(@inner-color: #555; @outer-color: #333) {
50 | background-image: -webkit-radial-gradient(circle, @inner-color, @outer-color);
51 | background-image: radial-gradient(circle, @inner-color, @outer-color);
52 | background-repeat: no-repeat;
53 | }
54 | .striped(@color: rgba(255,255,255,.15); @angle: 45deg) {
55 | background-image: -webkit-linear-gradient(@angle, @color 25%, transparent 25%, transparent 50%, @color 50%, @color 75%, transparent 75%, transparent);
56 | background-image: -o-linear-gradient(@angle, @color 25%, transparent 25%, transparent 50%, @color 50%, @color 75%, transparent 75%, transparent);
57 | background-image: linear-gradient(@angle, @color 25%, transparent 25%, transparent 50%, @color 50%, @color 75%, transparent 75%, transparent);
58 | }
59 | }
60 |
--------------------------------------------------------------------------------
/app/styles/less/mixins/grid-framework.less:
--------------------------------------------------------------------------------
1 | // Framework grid generation
2 | //
3 | // Used only by Bootstrap to generate the correct number of grid classes given
4 | // any value of `@grid-columns`.
5 |
6 | .make-grid-columns() {
7 | // Common styles for all sizes of grid columns, widths 1-12
8 | .col(@index) { // initial
9 | @item: ~".col-xs-@{index}, .col-sm-@{index}, .col-md-@{index}, .col-lg-@{index}";
10 | .col((@index + 1), @item);
11 | }
12 | .col(@index, @list) when (@index =< @grid-columns) { // general; "=<" isn't a typo
13 | @item: ~".col-xs-@{index}, .col-sm-@{index}, .col-md-@{index}, .col-lg-@{index}";
14 | .col((@index + 1), ~"@{list}, @{item}");
15 | }
16 | .col(@index, @list) when (@index > @grid-columns) { // terminal
17 | @{list} {
18 | position: relative;
19 | // Prevent columns from collapsing when empty
20 | min-height: 1px;
21 | // Inner gutter via padding
22 | padding-left: (@grid-gutter-width / 2);
23 | padding-right: (@grid-gutter-width / 2);
24 | }
25 | }
26 | .col(1); // kickstart it
27 | }
28 |
29 | .float-grid-columns(@class) {
30 | .col(@index) { // initial
31 | @item: ~".col-@{class}-@{index}";
32 | .col((@index + 1), @item);
33 | }
34 | .col(@index, @list) when (@index =< @grid-columns) { // general
35 | @item: ~".col-@{class}-@{index}";
36 | .col((@index + 1), ~"@{list}, @{item}");
37 | }
38 | .col(@index, @list) when (@index > @grid-columns) { // terminal
39 | @{list} {
40 | float: left;
41 | }
42 | }
43 | .col(1); // kickstart it
44 | }
45 |
46 | .calc-grid-column(@index, @class, @type) when (@type = width) and (@index > 0) {
47 | .col-@{class}-@{index} {
48 | width: percentage((@index / @grid-columns));
49 | }
50 | }
51 | .calc-grid-column(@index, @class, @type) when (@type = push) and (@index > 0) {
52 | .col-@{class}-push-@{index} {
53 | left: percentage((@index / @grid-columns));
54 | }
55 | }
56 | .calc-grid-column(@index, @class, @type) when (@type = push) and (@index = 0) {
57 | .col-@{class}-push-0 {
58 | left: auto;
59 | }
60 | }
61 | .calc-grid-column(@index, @class, @type) when (@type = pull) and (@index > 0) {
62 | .col-@{class}-pull-@{index} {
63 | right: percentage((@index / @grid-columns));
64 | }
65 | }
66 | .calc-grid-column(@index, @class, @type) when (@type = pull) and (@index = 0) {
67 | .col-@{class}-pull-0 {
68 | right: auto;
69 | }
70 | }
71 | .calc-grid-column(@index, @class, @type) when (@type = offset) {
72 | .col-@{class}-offset-@{index} {
73 | margin-left: percentage((@index / @grid-columns));
74 | }
75 | }
76 |
77 | // Basic looping in LESS
78 | .loop-grid-columns(@index, @class, @type) when (@index >= 0) {
79 | .calc-grid-column(@index, @class, @type);
80 | // next iteration
81 | .loop-grid-columns((@index - 1), @class, @type);
82 | }
83 |
84 | // Create grid for specific class
85 | .make-grid(@class) {
86 | .float-grid-columns(@class);
87 | .loop-grid-columns(@grid-columns, @class, width);
88 | .loop-grid-columns(@grid-columns, @class, pull);
89 | .loop-grid-columns(@grid-columns, @class, push);
90 | .loop-grid-columns(@grid-columns, @class, offset);
91 | }
92 |
--------------------------------------------------------------------------------
/app/styles/less/mixins/grid.less:
--------------------------------------------------------------------------------
1 | // Grid system
2 | //
3 | // Generate semantic grid columns with these mixins.
4 |
5 | // Centered container element
6 | .container-fixed(@gutter: @grid-gutter-width) {
7 | margin-right: auto;
8 | margin-left: auto;
9 | padding-left: (@gutter / 2);
10 | padding-right: (@gutter / 2);
11 | &:extend(.clearfix all);
12 | }
13 |
14 | // Creates a wrapper for a series of columns
15 | .make-row(@gutter: @grid-gutter-width) {
16 | margin-left: (@gutter / -2);
17 | margin-right: (@gutter / -2);
18 | &:extend(.clearfix all);
19 | }
20 |
21 | // Generate the extra small columns
22 | .make-xs-column(@columns; @gutter: @grid-gutter-width) {
23 | position: relative;
24 | float: left;
25 | width: percentage((@columns / @grid-columns));
26 | min-height: 1px;
27 | padding-left: (@gutter / 2);
28 | padding-right: (@gutter / 2);
29 | }
30 | .make-xs-column-offset(@columns) {
31 | margin-left: percentage((@columns / @grid-columns));
32 | }
33 | .make-xs-column-push(@columns) {
34 | left: percentage((@columns / @grid-columns));
35 | }
36 | .make-xs-column-pull(@columns) {
37 | right: percentage((@columns / @grid-columns));
38 | }
39 |
40 | // Generate the small columns
41 | .make-sm-column(@columns; @gutter: @grid-gutter-width) {
42 | position: relative;
43 | min-height: 1px;
44 | padding-left: (@gutter / 2);
45 | padding-right: (@gutter / 2);
46 |
47 | @media (min-width: @screen-sm-min) {
48 | float: left;
49 | width: percentage((@columns / @grid-columns));
50 | }
51 | }
52 | .make-sm-column-offset(@columns) {
53 | @media (min-width: @screen-sm-min) {
54 | margin-left: percentage((@columns / @grid-columns));
55 | }
56 | }
57 | .make-sm-column-push(@columns) {
58 | @media (min-width: @screen-sm-min) {
59 | left: percentage((@columns / @grid-columns));
60 | }
61 | }
62 | .make-sm-column-pull(@columns) {
63 | @media (min-width: @screen-sm-min) {
64 | right: percentage((@columns / @grid-columns));
65 | }
66 | }
67 |
68 | // Generate the medium columns
69 | .make-md-column(@columns; @gutter: @grid-gutter-width) {
70 | position: relative;
71 | min-height: 1px;
72 | padding-left: (@gutter / 2);
73 | padding-right: (@gutter / 2);
74 |
75 | @media (min-width: @screen-md-min) {
76 | float: left;
77 | width: percentage((@columns / @grid-columns));
78 | }
79 | }
80 | .make-md-column-offset(@columns) {
81 | @media (min-width: @screen-md-min) {
82 | margin-left: percentage((@columns / @grid-columns));
83 | }
84 | }
85 | .make-md-column-push(@columns) {
86 | @media (min-width: @screen-md-min) {
87 | left: percentage((@columns / @grid-columns));
88 | }
89 | }
90 | .make-md-column-pull(@columns) {
91 | @media (min-width: @screen-md-min) {
92 | right: percentage((@columns / @grid-columns));
93 | }
94 | }
95 |
96 | // Generate the large columns
97 | .make-lg-column(@columns; @gutter: @grid-gutter-width) {
98 | position: relative;
99 | min-height: 1px;
100 | padding-left: (@gutter / 2);
101 | padding-right: (@gutter / 2);
102 |
103 | @media (min-width: @screen-lg-min) {
104 | float: left;
105 | width: percentage((@columns / @grid-columns));
106 | }
107 | }
108 | .make-lg-column-offset(@columns) {
109 | @media (min-width: @screen-lg-min) {
110 | margin-left: percentage((@columns / @grid-columns));
111 | }
112 | }
113 | .make-lg-column-push(@columns) {
114 | @media (min-width: @screen-lg-min) {
115 | left: percentage((@columns / @grid-columns));
116 | }
117 | }
118 | .make-lg-column-pull(@columns) {
119 | @media (min-width: @screen-lg-min) {
120 | right: percentage((@columns / @grid-columns));
121 | }
122 | }
123 |
--------------------------------------------------------------------------------
/app/styles/less/mixins/hide-text.less:
--------------------------------------------------------------------------------
1 | // CSS image replacement
2 | //
3 | // Heads up! v3 launched with with only `.hide-text()`, but per our pattern for
4 | // mixins being reused as classes with the same name, this doesn't hold up. As
5 | // of v3.0.1 we have added `.text-hide()` and deprecated `.hide-text()`.
6 | //
7 | // Source: https://github.com/h5bp/html5-boilerplate/commit/aa0396eae757
8 |
9 | // Deprecated as of v3.0.1 (will be removed in v4)
10 | .hide-text() {
11 | font: ~"0/0" a;
12 | color: transparent;
13 | text-shadow: none;
14 | background-color: transparent;
15 | border: 0;
16 | }
17 |
18 | // New mixin to use as of v3.0.1
19 | .text-hide() {
20 | .hide-text();
21 | }
22 |
--------------------------------------------------------------------------------
/app/styles/less/mixins/image.less:
--------------------------------------------------------------------------------
1 | // Image Mixins
2 | // - Responsive image
3 | // - Retina image
4 |
5 |
6 | // Responsive image
7 | //
8 | // Keep images from scaling beyond the width of their parents.
9 | .img-responsive(@display: block) {
10 | display: @display;
11 | max-width: 100%; // Part 1: Set a maximum relative to the parent
12 | height: auto; // Part 2: Scale the height according to the width, otherwise you get stretching
13 | }
14 |
15 |
16 | // Retina image
17 | //
18 | // Short retina mixin for setting background-image and -size. Note that the
19 | // spelling of `min--moz-device-pixel-ratio` is intentional.
20 | .img-retina(@file-1x; @file-2x; @width-1x; @height-1x) {
21 | background-image: url("@{file-1x}");
22 |
23 | @media
24 | only screen and (-webkit-min-device-pixel-ratio: 2),
25 | only screen and ( min--moz-device-pixel-ratio: 2),
26 | only screen and ( -o-min-device-pixel-ratio: 2/1),
27 | only screen and ( min-device-pixel-ratio: 2),
28 | only screen and ( min-resolution: 192dpi),
29 | only screen and ( min-resolution: 2dppx) {
30 | background-image: url("@{file-2x}");
31 | background-size: @width-1x @height-1x;
32 | }
33 | }
34 |
--------------------------------------------------------------------------------
/app/styles/less/mixins/labels.less:
--------------------------------------------------------------------------------
1 | // Labels
2 |
3 | .label-variant(@color) {
4 | background-color: @color;
5 |
6 | &[href] {
7 | &:hover,
8 | &:focus {
9 | background-color: darken(@color, 10%);
10 | }
11 | }
12 | }
13 |
--------------------------------------------------------------------------------
/app/styles/less/mixins/list-group.less:
--------------------------------------------------------------------------------
1 | // List Groups
2 |
3 | .list-group-item-variant(@state; @background; @color) {
4 | .list-group-item-@{state} {
5 | color: @color;
6 | background-color: @background;
7 |
8 | a& {
9 | color: @color;
10 |
11 | .list-group-item-heading {
12 | color: inherit;
13 | }
14 |
15 | &:hover,
16 | &:focus {
17 | color: @color;
18 | background-color: darken(@background, 5%);
19 | }
20 | &.active,
21 | &.active:hover,
22 | &.active:focus {
23 | color: #fff;
24 | background-color: @color;
25 | border-color: @color;
26 | }
27 | }
28 | }
29 | }
30 |
--------------------------------------------------------------------------------
/app/styles/less/mixins/nav-divider.less:
--------------------------------------------------------------------------------
1 | // Horizontal dividers
2 | //
3 | // Dividers (basically an hr) within dropdowns and nav lists
4 |
5 | .nav-divider(@color: #e5e5e5) {
6 | height: 1px;
7 | margin: ((@line-height-computed / 2) - 1) 0;
8 | overflow: hidden;
9 | background-color: @color;
10 | }
11 |
--------------------------------------------------------------------------------
/app/styles/less/mixins/nav-vertical-align.less:
--------------------------------------------------------------------------------
1 | // Navbar vertical align
2 | //
3 | // Vertically center elements in the navbar.
4 | // Example: an element has a height of 30px, so write out `.navbar-vertical-align(30px);` to calculate the appropriate top margin.
5 |
6 | .navbar-vertical-align(@element-height) {
7 | margin-top: ((@navbar-height - @element-height) / 2);
8 | margin-bottom: ((@navbar-height - @element-height) / 2);
9 | }
10 |
--------------------------------------------------------------------------------
/app/styles/less/mixins/opacity.less:
--------------------------------------------------------------------------------
1 | // Opacity
2 |
3 | .opacity(@opacity) {
4 | opacity: @opacity;
5 | // IE8 filter
6 | @opacity-ie: (@opacity * 100);
7 | filter: ~"alpha(opacity=@{opacity-ie})";
8 | }
9 |
--------------------------------------------------------------------------------
/app/styles/less/mixins/pagination.less:
--------------------------------------------------------------------------------
1 | // Pagination
2 |
3 | .pagination-size(@padding-vertical; @padding-horizontal; @font-size; @border-radius) {
4 | > li {
5 | > a,
6 | > span {
7 | padding: @padding-vertical @padding-horizontal;
8 | font-size: @font-size;
9 | }
10 | &:first-child {
11 | > a,
12 | > span {
13 | .border-left-radius(@border-radius);
14 | }
15 | }
16 | &:last-child {
17 | > a,
18 | > span {
19 | .border-right-radius(@border-radius);
20 | }
21 | }
22 | }
23 | }
24 |
--------------------------------------------------------------------------------
/app/styles/less/mixins/panels.less:
--------------------------------------------------------------------------------
1 | // Panels
2 |
3 | .panel-variant(@border; @heading-text-color; @heading-bg-color; @heading-border) {
4 | border-color: @border;
5 |
6 | & > .panel-heading {
7 | color: @heading-text-color;
8 | background-color: @heading-bg-color;
9 | border-color: @heading-border;
10 |
11 | + .panel-collapse > .panel-body {
12 | border-top-color: @border;
13 | }
14 | .badge {
15 | color: @heading-bg-color;
16 | background-color: @heading-text-color;
17 | }
18 | }
19 | & > .panel-footer {
20 | + .panel-collapse > .panel-body {
21 | border-bottom-color: @border;
22 | }
23 | }
24 | }
25 |
--------------------------------------------------------------------------------
/app/styles/less/mixins/progress-bar.less:
--------------------------------------------------------------------------------
1 | // Progress bars
2 |
3 | .progress-bar-variant(@color) {
4 | background-color: @color;
5 |
6 | // Deprecated parent class requirement as of v3.2.0
7 | .progress-striped & {
8 | #gradient > .striped();
9 | }
10 | }
11 |
--------------------------------------------------------------------------------
/app/styles/less/mixins/reset-filter.less:
--------------------------------------------------------------------------------
1 | // Reset filters for IE
2 | //
3 | // When you need to remove a gradient background, do not forget to use this to reset
4 | // the IE filter for IE9 and below.
5 |
6 | .reset-filter() {
7 | filter: e(%("progid:DXImageTransform.Microsoft.gradient(enabled = false)"));
8 | }
9 |
--------------------------------------------------------------------------------
/app/styles/less/mixins/resize.less:
--------------------------------------------------------------------------------
1 | // Resize anything
2 |
3 | .resizable(@direction) {
4 | resize: @direction; // Options: horizontal, vertical, both
5 | overflow: auto; // Per CSS3 UI, `resize` only applies when `overflow` isn't `visible`
6 | }
7 |
--------------------------------------------------------------------------------
/app/styles/less/mixins/responsive-visibility.less:
--------------------------------------------------------------------------------
1 | // Responsive utilities
2 |
3 | //
4 | // More easily include all the states for responsive-utilities.less.
5 | .responsive-visibility() {
6 | display: block !important;
7 | table& { display: table; }
8 | tr& { display: table-row !important; }
9 | th&,
10 | td& { display: table-cell !important; }
11 | }
12 |
13 | .responsive-invisibility() {
14 | display: none !important;
15 | }
16 |
--------------------------------------------------------------------------------
/app/styles/less/mixins/size.less:
--------------------------------------------------------------------------------
1 | // Sizing shortcuts
2 |
3 | .size(@width; @height) {
4 | width: @width;
5 | height: @height;
6 | }
7 |
8 | .square(@size) {
9 | .size(@size; @size);
10 | }
11 |
--------------------------------------------------------------------------------
/app/styles/less/mixins/tab-focus.less:
--------------------------------------------------------------------------------
1 | // WebKit-style focus
2 |
3 | .tab-focus() {
4 | // Default
5 | outline: thin dotted;
6 | // WebKit
7 | outline: 5px auto -webkit-focus-ring-color;
8 | outline-offset: -2px;
9 | }
10 |
--------------------------------------------------------------------------------
/app/styles/less/mixins/table-row.less:
--------------------------------------------------------------------------------
1 | // Tables
2 |
3 | .table-row-variant(@state; @background) {
4 | // Exact selectors below required to override `.table-striped` and prevent
5 | // inheritance to nested tables.
6 | .table > thead > tr,
7 | .table > tbody > tr,
8 | .table > tfoot > tr {
9 | > td.@{state},
10 | > th.@{state},
11 | &.@{state} > td,
12 | &.@{state} > th {
13 | background-color: @background;
14 | }
15 | }
16 |
17 | // Hover states for `.table-hover`
18 | // Note: this is not available for cells or rows within `thead` or `tfoot`.
19 | .table-hover > tbody > tr {
20 | > td.@{state}:hover,
21 | > th.@{state}:hover,
22 | &.@{state}:hover > td,
23 | &:hover > .@{state},
24 | &.@{state}:hover > th {
25 | background-color: darken(@background, 5%);
26 | }
27 | }
28 | }
29 |
--------------------------------------------------------------------------------
/app/styles/less/mixins/text-emphasis.less:
--------------------------------------------------------------------------------
1 | // Typography
2 |
3 | .text-emphasis-variant(@color) {
4 | color: @color;
5 | a&:hover {
6 | color: darken(@color, 10%);
7 | }
8 | }
9 |
--------------------------------------------------------------------------------
/app/styles/less/mixins/text-overflow.less:
--------------------------------------------------------------------------------
1 | // Text overflow
2 | // Requires inline-block or block for proper styling
3 |
4 | .text-overflow() {
5 | overflow: hidden;
6 | text-overflow: ellipsis;
7 | white-space: nowrap;
8 | }
9 |
--------------------------------------------------------------------------------
/app/styles/less/mixins/vendor-prefixes.less:
--------------------------------------------------------------------------------
1 | // Vendor Prefixes
2 | //
3 | // All vendor mixins are deprecated as of v3.2.0 due to the introduction of
4 | // Autoprefixer in our Gruntfile. They will be removed in v4.
5 |
6 | // - Animations
7 | // - Backface visibility
8 | // - Box shadow
9 | // - Box sizing
10 | // - Content columns
11 | // - Hyphens
12 | // - Placeholder text
13 | // - Transformations
14 | // - Transitions
15 | // - User Select
16 |
17 |
18 | // Animations
19 | .animation(@animation) {
20 | -webkit-animation: @animation;
21 | -o-animation: @animation;
22 | animation: @animation;
23 | }
24 | .animation-name(@name) {
25 | -webkit-animation-name: @name;
26 | animation-name: @name;
27 | }
28 | .animation-duration(@duration) {
29 | -webkit-animation-duration: @duration;
30 | animation-duration: @duration;
31 | }
32 | .animation-timing-function(@timing-function) {
33 | -webkit-animation-timing-function: @timing-function;
34 | animation-timing-function: @timing-function;
35 | }
36 | .animation-delay(@delay) {
37 | -webkit-animation-delay: @delay;
38 | animation-delay: @delay;
39 | }
40 | .animation-iteration-count(@iteration-count) {
41 | -webkit-animation-iteration-count: @iteration-count;
42 | animation-iteration-count: @iteration-count;
43 | }
44 | .animation-direction(@direction) {
45 | -webkit-animation-direction: @direction;
46 | animation-direction: @direction;
47 | }
48 | .animation-fill-mode(@fill-mode) {
49 | -webkit-animation-fill-mode: @fill-mode;
50 | animation-fill-mode: @fill-mode;
51 | }
52 |
53 | // Backface visibility
54 | // Prevent browsers from flickering when using CSS 3D transforms.
55 | // Default value is `visible`, but can be changed to `hidden`
56 |
57 | .backface-visibility(@visibility){
58 | -webkit-backface-visibility: @visibility;
59 | -moz-backface-visibility: @visibility;
60 | backface-visibility: @visibility;
61 | }
62 |
63 | // Drop shadows
64 | //
65 | // Note: Deprecated `.box-shadow()` as of v3.1.0 since all of Bootstrap's
66 | // supported browsers that have box shadow capabilities now support it.
67 |
68 | .box-shadow(@shadow) {
69 | -webkit-box-shadow: @shadow; // iOS <4.3 & Android <4.1
70 | box-shadow: @shadow;
71 | }
72 |
73 | // Box sizing
74 | .box-sizing(@boxmodel) {
75 | -webkit-box-sizing: @boxmodel;
76 | -moz-box-sizing: @boxmodel;
77 | box-sizing: @boxmodel;
78 | }
79 |
80 | // CSS3 Content Columns
81 | .content-columns(@column-count; @column-gap: @grid-gutter-width) {
82 | -webkit-column-count: @column-count;
83 | -moz-column-count: @column-count;
84 | column-count: @column-count;
85 | -webkit-column-gap: @column-gap;
86 | -moz-column-gap: @column-gap;
87 | column-gap: @column-gap;
88 | }
89 |
90 | // Optional hyphenation
91 | .hyphens(@mode: auto) {
92 | word-wrap: break-word;
93 | -webkit-hyphens: @mode;
94 | -moz-hyphens: @mode;
95 | -ms-hyphens: @mode; // IE10+
96 | -o-hyphens: @mode;
97 | hyphens: @mode;
98 | }
99 |
100 | // Placeholder text
101 | .placeholder(@color: @input-color-placeholder) {
102 | // Firefox
103 | &::-moz-placeholder {
104 | color: @color;
105 | opacity: 1; // Override Firefox's unusual default opacity; see https://github.com/twbs/bootstrap/pull/11526
106 | }
107 | &:-ms-input-placeholder { color: @color; } // Internet Explorer 10+
108 | &::-webkit-input-placeholder { color: @color; } // Safari and Chrome
109 | }
110 |
111 | // Transformations
112 | .scale(@ratio) {
113 | -webkit-transform: scale(@ratio);
114 | -ms-transform: scale(@ratio); // IE9 only
115 | -o-transform: scale(@ratio);
116 | transform: scale(@ratio);
117 | }
118 | .scale(@ratioX; @ratioY) {
119 | -webkit-transform: scale(@ratioX, @ratioY);
120 | -ms-transform: scale(@ratioX, @ratioY); // IE9 only
121 | -o-transform: scale(@ratioX, @ratioY);
122 | transform: scale(@ratioX, @ratioY);
123 | }
124 | .scaleX(@ratio) {
125 | -webkit-transform: scaleX(@ratio);
126 | -ms-transform: scaleX(@ratio); // IE9 only
127 | -o-transform: scaleX(@ratio);
128 | transform: scaleX(@ratio);
129 | }
130 | .scaleY(@ratio) {
131 | -webkit-transform: scaleY(@ratio);
132 | -ms-transform: scaleY(@ratio); // IE9 only
133 | -o-transform: scaleY(@ratio);
134 | transform: scaleY(@ratio);
135 | }
136 | .skew(@x; @y) {
137 | -webkit-transform: skewX(@x) skewY(@y);
138 | -ms-transform: skewX(@x) skewY(@y); // See https://github.com/twbs/bootstrap/issues/4885; IE9+
139 | -o-transform: skewX(@x) skewY(@y);
140 | transform: skewX(@x) skewY(@y);
141 | }
142 | .translate(@x; @y) {
143 | -webkit-transform: translate(@x, @y);
144 | -ms-transform: translate(@x, @y); // IE9 only
145 | -o-transform: translate(@x, @y);
146 | transform: translate(@x, @y);
147 | }
148 | .translate3d(@x; @y; @z) {
149 | -webkit-transform: translate3d(@x, @y, @z);
150 | transform: translate3d(@x, @y, @z);
151 | }
152 | .rotate(@degrees) {
153 | -webkit-transform: rotate(@degrees);
154 | -ms-transform: rotate(@degrees); // IE9 only
155 | -o-transform: rotate(@degrees);
156 | transform: rotate(@degrees);
157 | }
158 | .rotateX(@degrees) {
159 | -webkit-transform: rotateX(@degrees);
160 | -ms-transform: rotateX(@degrees); // IE9 only
161 | -o-transform: rotateX(@degrees);
162 | transform: rotateX(@degrees);
163 | }
164 | .rotateY(@degrees) {
165 | -webkit-transform: rotateY(@degrees);
166 | -ms-transform: rotateY(@degrees); // IE9 only
167 | -o-transform: rotateY(@degrees);
168 | transform: rotateY(@degrees);
169 | }
170 | .perspective(@perspective) {
171 | -webkit-perspective: @perspective;
172 | -moz-perspective: @perspective;
173 | perspective: @perspective;
174 | }
175 | .perspective-origin(@perspective) {
176 | -webkit-perspective-origin: @perspective;
177 | -moz-perspective-origin: @perspective;
178 | perspective-origin: @perspective;
179 | }
180 | .transform-origin(@origin) {
181 | -webkit-transform-origin: @origin;
182 | -moz-transform-origin: @origin;
183 | -ms-transform-origin: @origin; // IE9 only
184 | transform-origin: @origin;
185 | }
186 |
187 |
188 | // Transitions
189 |
190 | .transition(@transition) {
191 | -webkit-transition: @transition;
192 | -o-transition: @transition;
193 | transition: @transition;
194 | }
195 | .transition-property(@transition-property) {
196 | -webkit-transition-property: @transition-property;
197 | transition-property: @transition-property;
198 | }
199 | .transition-delay(@transition-delay) {
200 | -webkit-transition-delay: @transition-delay;
201 | transition-delay: @transition-delay;
202 | }
203 | .transition-duration(@transition-duration) {
204 | -webkit-transition-duration: @transition-duration;
205 | transition-duration: @transition-duration;
206 | }
207 | .transition-timing-function(@timing-function) {
208 | -webkit-transition-timing-function: @timing-function;
209 | transition-timing-function: @timing-function;
210 | }
211 | .transition-transform(@transition) {
212 | -webkit-transition: -webkit-transform @transition;
213 | -moz-transition: -moz-transform @transition;
214 | -o-transition: -o-transform @transition;
215 | transition: transform @transition;
216 | }
217 |
218 |
219 | // User select
220 | // For selecting text on the page
221 |
222 | .user-select(@select) {
223 | -webkit-user-select: @select;
224 | -moz-user-select: @select;
225 | -ms-user-select: @select; // IE10+
226 | user-select: @select;
227 | }
228 |
--------------------------------------------------------------------------------
/app/styles/less/modals.less:
--------------------------------------------------------------------------------
1 | //
2 | // Modals
3 | // --------------------------------------------------
4 |
5 | // .modal-open - body class for killing the scroll
6 | // .modal - container to scroll within
7 | // .modal-dialog - positioning shell for the actual modal
8 | // .modal-content - actual modal w/ bg and corners and shit
9 |
10 | // Kill the scroll on the body
11 | .modal-open {
12 | overflow: hidden;
13 | }
14 |
15 | // Container that the modal scrolls within
16 | .modal {
17 | display: none;
18 | overflow: hidden;
19 | position: fixed;
20 | top: 0;
21 | right: 0;
22 | bottom: 0;
23 | left: 0;
24 | z-index: @zindex-modal;
25 | -webkit-overflow-scrolling: touch;
26 |
27 | // Prevent Chrome on Windows from adding a focus outline. For details, see
28 | // https://github.com/twbs/bootstrap/pull/10951.
29 | outline: 0;
30 |
31 | // When fading in the modal, animate it to slide down
32 | &.fade .modal-dialog {
33 | .translate(0, -25%);
34 | .transition-transform(~"0.3s ease-out");
35 | }
36 | &.in .modal-dialog { .translate(0, 0) }
37 | }
38 | .modal-open .modal {
39 | overflow-x: hidden;
40 | overflow-y: auto;
41 | }
42 |
43 | // Shell div to position the modal with bottom padding
44 | .modal-dialog {
45 | position: relative;
46 | width: auto;
47 | margin: 10px;
48 | }
49 |
50 | // Actual modal
51 | .modal-content {
52 | position: relative;
53 | background-color: @modal-content-bg;
54 | border: 1px solid @modal-content-fallback-border-color; //old browsers fallback (ie8 etc)
55 | border: 1px solid @modal-content-border-color;
56 | border-radius: @border-radius-large;
57 | .box-shadow(0 3px 9px rgba(0,0,0,.5));
58 | background-clip: padding-box;
59 | // Remove focus outline from opened modal
60 | outline: 0;
61 | }
62 |
63 | // Modal background
64 | .modal-backdrop {
65 | position: fixed;
66 | top: 0;
67 | right: 0;
68 | bottom: 0;
69 | left: 0;
70 | z-index: @zindex-modal-background;
71 | background-color: @modal-backdrop-bg;
72 | // Fade for backdrop
73 | &.fade { .opacity(0); }
74 | &.in { .opacity(@modal-backdrop-opacity); }
75 | }
76 |
77 | // Modal header
78 | // Top section of the modal w/ title and dismiss
79 | .modal-header {
80 | padding: @modal-title-padding;
81 | border-bottom: 1px solid @modal-header-border-color;
82 | min-height: (@modal-title-padding + @modal-title-line-height);
83 | }
84 | // Close icon
85 | .modal-header .close {
86 | margin-top: -2px;
87 | }
88 |
89 | // Title text within header
90 | .modal-title {
91 | margin: 0;
92 | line-height: @modal-title-line-height;
93 | }
94 |
95 | // Modal body
96 | // Where all modal content resides (sibling of .modal-header and .modal-footer)
97 | .modal-body {
98 | position: relative;
99 | padding: @modal-inner-padding;
100 | }
101 |
102 | // Footer (for actions)
103 | .modal-footer {
104 | padding: @modal-inner-padding;
105 | text-align: right; // right align buttons
106 | border-top: 1px solid @modal-footer-border-color;
107 | &:extend(.clearfix all); // clear it in case folks use .pull-* classes on buttons
108 |
109 | // Properly space out buttons
110 | .btn + .btn {
111 | margin-left: 5px;
112 | margin-bottom: 0; // account for input[type="submit"] which gets the bottom margin like all other inputs
113 | }
114 | // but override that for button groups
115 | .btn-group .btn + .btn {
116 | margin-left: -1px;
117 | }
118 | // and override it for block buttons as well
119 | .btn-block + .btn-block {
120 | margin-left: 0;
121 | }
122 | }
123 |
124 | // Measure scrollbar width for padding body during modal show/hide
125 | .modal-scrollbar-measure {
126 | position: absolute;
127 | top: -9999px;
128 | width: 50px;
129 | height: 50px;
130 | overflow: scroll;
131 | }
132 |
133 | // Scale up the modal
134 | @media (min-width: @screen-sm-min) {
135 | // Automatically set modal's width for larger viewports
136 | .modal-dialog {
137 | width: @modal-md;
138 | margin: 30px auto;
139 | }
140 | .modal-content {
141 | .box-shadow(0 5px 15px rgba(0,0,0,.5));
142 | }
143 |
144 | // Modal sizes
145 | .modal-sm { width: @modal-sm; }
146 | }
147 |
148 | @media (min-width: @screen-md-min) {
149 | .modal-lg { width: @modal-lg; }
150 | }
151 |
--------------------------------------------------------------------------------
/app/styles/less/navs.less:
--------------------------------------------------------------------------------
1 | //
2 | // Navs
3 | // --------------------------------------------------
4 |
5 |
6 | // Base class
7 | // --------------------------------------------------
8 |
9 | .nav {
10 | margin-bottom: 0;
11 | padding-left: 0; // Override default ul/ol
12 | list-style: none;
13 | &:extend(.clearfix all);
14 |
15 | > li {
16 | position: relative;
17 | display: block;
18 |
19 | > a {
20 | position: relative;
21 | display: block;
22 | padding: @nav-link-padding;
23 | &:hover,
24 | &:focus {
25 | text-decoration: none;
26 | background-color: @nav-link-hover-bg;
27 | }
28 | }
29 |
30 | // Disabled state sets text to gray and nukes hover/tab effects
31 | &.disabled > a {
32 | color: @nav-disabled-link-color;
33 |
34 | &:hover,
35 | &:focus {
36 | color: @nav-disabled-link-hover-color;
37 | text-decoration: none;
38 | background-color: transparent;
39 | cursor: @cursor-disabled;
40 | }
41 | }
42 | }
43 |
44 | // Open dropdowns
45 | .open > a {
46 | &,
47 | &:hover,
48 | &:focus {
49 | background-color: @nav-link-hover-bg;
50 | border-color: @link-color;
51 | }
52 | }
53 |
54 | // Nav dividers (deprecated with v3.0.1)
55 | //
56 | // This should have been removed in v3 with the dropping of `.nav-list`, but
57 | // we missed it. We don't currently support this anywhere, but in the interest
58 | // of maintaining backward compatibility in case you use it, it's deprecated.
59 | .nav-divider {
60 | .nav-divider();
61 | }
62 |
63 | // Prevent IE8 from misplacing imgs
64 | //
65 | // See https://github.com/h5bp/html5-boilerplate/issues/984#issuecomment-3985989
66 | > li > a > img {
67 | max-width: none;
68 | }
69 | }
70 |
71 |
72 | // Tabs
73 | // -------------------------
74 |
75 | // Give the tabs something to sit on
76 | .nav-tabs {
77 | border-bottom: 1px solid @nav-tabs-border-color;
78 | > li {
79 | float: left;
80 | // Make the list-items overlay the bottom border
81 | margin-bottom: -1px;
82 |
83 | // Actual tabs (as links)
84 | > a {
85 | margin-right: 2px;
86 | line-height: @line-height-base;
87 | border: 1px solid transparent;
88 | border-radius: @border-radius-base @border-radius-base 0 0;
89 | &:hover {
90 | border-color: @nav-tabs-link-hover-border-color @nav-tabs-link-hover-border-color @nav-tabs-border-color;
91 | }
92 | }
93 |
94 | // Active state, and its :hover to override normal :hover
95 | &.active > a {
96 | &,
97 | &:hover,
98 | &:focus {
99 | color: @nav-tabs-active-link-hover-color;
100 | background-color: @nav-tabs-active-link-hover-bg;
101 | border: 1px solid @nav-tabs-active-link-hover-border-color;
102 | border-bottom-color: transparent;
103 | cursor: default;
104 | }
105 | }
106 | }
107 | // pulling this in mainly for less shorthand
108 | &.nav-justified {
109 | .nav-justified();
110 | .nav-tabs-justified();
111 | }
112 | }
113 |
114 |
115 | // Pills
116 | // -------------------------
117 | .nav-pills {
118 | > li {
119 | float: left;
120 |
121 | // Links rendered as pills
122 | > a {
123 | border-radius: @nav-pills-border-radius;
124 | }
125 | + li {
126 | margin-left: 2px;
127 | }
128 |
129 | // Active state
130 | &.active > a {
131 | &,
132 | &:hover,
133 | &:focus {
134 | color: @nav-pills-active-link-hover-color;
135 | background-color: @nav-pills-active-link-hover-bg;
136 | }
137 | }
138 | }
139 | }
140 |
141 |
142 | // Stacked pills
143 | .nav-stacked {
144 | > li {
145 | float: none;
146 | + li {
147 | margin-top: 2px;
148 | margin-left: 0; // no need for this gap between nav items
149 | }
150 | }
151 | }
152 |
153 |
154 | // Nav variations
155 | // --------------------------------------------------
156 |
157 | // Justified nav links
158 | // -------------------------
159 |
160 | .nav-justified {
161 | width: 100%;
162 |
163 | > li {
164 | float: none;
165 | > a {
166 | text-align: center;
167 | margin-bottom: 5px;
168 | }
169 | }
170 |
171 | > .dropdown .dropdown-menu {
172 | top: auto;
173 | left: auto;
174 | }
175 |
176 | @media (min-width: @screen-sm-min) {
177 | > li {
178 | display: table-cell;
179 | width: 1%;
180 | > a {
181 | margin-bottom: 0;
182 | }
183 | }
184 | }
185 | }
186 |
187 | // Move borders to anchors instead of bottom of list
188 | //
189 | // Mixin for adding on top the shared `.nav-justified` styles for our tabs
190 | .nav-tabs-justified {
191 | border-bottom: 0;
192 |
193 | > li > a {
194 | // Override margin from .nav-tabs
195 | margin-right: 0;
196 | border-radius: @border-radius-base;
197 | }
198 |
199 | > .active > a,
200 | > .active > a:hover,
201 | > .active > a:focus {
202 | border: 1px solid @nav-tabs-justified-link-border-color;
203 | }
204 |
205 | @media (min-width: @screen-sm-min) {
206 | > li > a {
207 | border-bottom: 1px solid @nav-tabs-justified-link-border-color;
208 | border-radius: @border-radius-base @border-radius-base 0 0;
209 | }
210 | > .active > a,
211 | > .active > a:hover,
212 | > .active > a:focus {
213 | border-bottom-color: @nav-tabs-justified-active-link-border-color;
214 | }
215 | }
216 | }
217 |
218 |
219 | // Tabbable tabs
220 | // -------------------------
221 |
222 | // Hide tabbable panes to start, show them when `.active`
223 | .tab-content {
224 | > .tab-pane {
225 | display: none;
226 | }
227 | > .active {
228 | display: block;
229 | }
230 | }
231 |
232 |
233 | // Dropdowns
234 | // -------------------------
235 |
236 | // Specific dropdowns
237 | .nav-tabs .dropdown-menu {
238 | // make dropdown border overlap tab border
239 | margin-top: -1px;
240 | // Remove the top rounded corners here since there is a hard edge above the menu
241 | .border-top-radius(0);
242 | }
243 |
--------------------------------------------------------------------------------
/app/styles/less/pager.less:
--------------------------------------------------------------------------------
1 | //
2 | // Pager pagination
3 | // --------------------------------------------------
4 |
5 |
6 | .pager {
7 | padding-left: 0;
8 | margin: @line-height-computed 0;
9 | list-style: none;
10 | text-align: center;
11 | &:extend(.clearfix all);
12 | li {
13 | display: inline;
14 | > a,
15 | > span {
16 | display: inline-block;
17 | padding: 5px 14px;
18 | background-color: @pager-bg;
19 | border: 1px solid @pager-border;
20 | border-radius: @pager-border-radius;
21 | }
22 |
23 | > a:hover,
24 | > a:focus {
25 | text-decoration: none;
26 | background-color: @pager-hover-bg;
27 | }
28 | }
29 |
30 | .next {
31 | > a,
32 | > span {
33 | float: right;
34 | }
35 | }
36 |
37 | .previous {
38 | > a,
39 | > span {
40 | float: left;
41 | }
42 | }
43 |
44 | .disabled {
45 | > a,
46 | > a:hover,
47 | > a:focus,
48 | > span {
49 | color: @pager-disabled-color;
50 | background-color: @pager-bg;
51 | cursor: @cursor-disabled;
52 | }
53 | }
54 | }
55 |
--------------------------------------------------------------------------------
/app/styles/less/pagination.less:
--------------------------------------------------------------------------------
1 | //
2 | // Pagination (multiple pages)
3 | // --------------------------------------------------
4 | .pagination {
5 | display: inline-block;
6 | padding-left: 0;
7 | margin: @line-height-computed 0;
8 | border-radius: @border-radius-base;
9 |
10 | > li {
11 | display: inline; // Remove list-style and block-level defaults
12 | > a,
13 | > span {
14 | position: relative;
15 | float: left; // Collapse white-space
16 | padding: @padding-base-vertical @padding-base-horizontal;
17 | line-height: @line-height-base;
18 | text-decoration: none;
19 | color: @pagination-color;
20 | background-color: @pagination-bg;
21 | border: 1px solid @pagination-border;
22 | margin-left: -1px;
23 | }
24 | &:first-child {
25 | > a,
26 | > span {
27 | margin-left: 0;
28 | .border-left-radius(@border-radius-base);
29 | }
30 | }
31 | &:last-child {
32 | > a,
33 | > span {
34 | .border-right-radius(@border-radius-base);
35 | }
36 | }
37 | }
38 |
39 | > li > a,
40 | > li > span {
41 | &:hover,
42 | &:focus {
43 | color: @pagination-hover-color;
44 | background-color: @pagination-hover-bg;
45 | border-color: @pagination-hover-border;
46 | }
47 | }
48 |
49 | > .active > a,
50 | > .active > span {
51 | &,
52 | &:hover,
53 | &:focus {
54 | z-index: 2;
55 | color: @pagination-active-color;
56 | background-color: @pagination-active-bg;
57 | border-color: @pagination-active-border;
58 | cursor: default;
59 | }
60 | }
61 |
62 | > .disabled {
63 | > span,
64 | > span:hover,
65 | > span:focus,
66 | > a,
67 | > a:hover,
68 | > a:focus {
69 | color: @pagination-disabled-color;
70 | background-color: @pagination-disabled-bg;
71 | border-color: @pagination-disabled-border;
72 | cursor: @cursor-disabled;
73 | }
74 | }
75 | }
76 |
77 | // Sizing
78 | // --------------------------------------------------
79 |
80 | // Large
81 | .pagination-lg {
82 | .pagination-size(@padding-large-vertical; @padding-large-horizontal; @font-size-large; @border-radius-large);
83 | }
84 |
85 | // Small
86 | .pagination-sm {
87 | .pagination-size(@padding-small-vertical; @padding-small-horizontal; @font-size-small; @border-radius-small);
88 | }
89 |
--------------------------------------------------------------------------------
/app/styles/less/panels.less:
--------------------------------------------------------------------------------
1 | //
2 | // Panels
3 | // --------------------------------------------------
4 |
5 |
6 | // Base class
7 | .panel {
8 | margin-bottom: @line-height-computed;
9 | background-color: @panel-bg;
10 | border: 1px solid transparent;
11 | border-radius: @panel-border-radius;
12 | .box-shadow(0 1px 1px rgba(0,0,0,.05));
13 | }
14 |
15 | // Panel contents
16 | .panel-body {
17 | padding: @panel-body-padding;
18 | &:extend(.clearfix all);
19 | }
20 |
21 | // Optional heading
22 | .panel-heading {
23 | padding: @panel-heading-padding;
24 | border-bottom: 1px solid transparent;
25 | .border-top-radius((@panel-border-radius - 1));
26 |
27 | > .dropdown .dropdown-toggle {
28 | color: inherit;
29 | }
30 | }
31 |
32 | // Within heading, strip any `h*` tag of its default margins for spacing.
33 | .panel-title {
34 | margin-top: 0;
35 | margin-bottom: 0;
36 | font-size: ceil((@font-size-base * 1.125));
37 | color: inherit;
38 |
39 | > a,
40 | > small,
41 | > .small,
42 | > small > a,
43 | > .small > a {
44 | color: inherit;
45 | }
46 | }
47 |
48 | // Optional footer (stays gray in every modifier class)
49 | .panel-footer {
50 | padding: @panel-footer-padding;
51 | background-color: @panel-footer-bg;
52 | border-top: 1px solid @panel-inner-border;
53 | .border-bottom-radius((@panel-border-radius - 1));
54 | }
55 |
56 |
57 | // List groups in panels
58 | //
59 | // By default, space out list group content from panel headings to account for
60 | // any kind of custom content between the two.
61 |
62 | .panel {
63 | > .list-group,
64 | > .panel-collapse > .list-group {
65 | margin-bottom: 0;
66 |
67 | .list-group-item {
68 | border-width: 1px 0;
69 | border-radius: 0;
70 | }
71 |
72 | // Add border top radius for first one
73 | &:first-child {
74 | .list-group-item:first-child {
75 | border-top: 0;
76 | .border-top-radius((@panel-border-radius - 1));
77 | }
78 | }
79 | // Add border bottom radius for last one
80 | &:last-child {
81 | .list-group-item:last-child {
82 | border-bottom: 0;
83 | .border-bottom-radius((@panel-border-radius - 1));
84 | }
85 | }
86 | }
87 | }
88 | // Collapse space between when there's no additional content.
89 | .panel-heading + .list-group {
90 | .list-group-item:first-child {
91 | border-top-width: 0;
92 | }
93 | }
94 | .list-group + .panel-footer {
95 | border-top-width: 0;
96 | }
97 |
98 | // Tables in panels
99 | //
100 | // Place a non-bordered `.table` within a panel (not within a `.panel-body`) and
101 | // watch it go full width.
102 |
103 | .panel {
104 | > .table,
105 | > .table-responsive > .table,
106 | > .panel-collapse > .table {
107 | margin-bottom: 0;
108 |
109 | caption {
110 | padding-left: @panel-body-padding;
111 | padding-right: @panel-body-padding;
112 | }
113 | }
114 | // Add border top radius for first one
115 | > .table:first-child,
116 | > .table-responsive:first-child > .table:first-child {
117 | .border-top-radius((@panel-border-radius - 1));
118 |
119 | > thead:first-child,
120 | > tbody:first-child {
121 | > tr:first-child {
122 | border-top-left-radius: (@panel-border-radius - 1);
123 | border-top-right-radius: (@panel-border-radius - 1);
124 |
125 | td:first-child,
126 | th:first-child {
127 | border-top-left-radius: (@panel-border-radius - 1);
128 | }
129 | td:last-child,
130 | th:last-child {
131 | border-top-right-radius: (@panel-border-radius - 1);
132 | }
133 | }
134 | }
135 | }
136 | // Add border bottom radius for last one
137 | > .table:last-child,
138 | > .table-responsive:last-child > .table:last-child {
139 | .border-bottom-radius((@panel-border-radius - 1));
140 |
141 | > tbody:last-child,
142 | > tfoot:last-child {
143 | > tr:last-child {
144 | border-bottom-left-radius: (@panel-border-radius - 1);
145 | border-bottom-right-radius: (@panel-border-radius - 1);
146 |
147 | td:first-child,
148 | th:first-child {
149 | border-bottom-left-radius: (@panel-border-radius - 1);
150 | }
151 | td:last-child,
152 | th:last-child {
153 | border-bottom-right-radius: (@panel-border-radius - 1);
154 | }
155 | }
156 | }
157 | }
158 | > .panel-body + .table,
159 | > .panel-body + .table-responsive,
160 | > .table + .panel-body,
161 | > .table-responsive + .panel-body {
162 | border-top: 1px solid @table-border-color;
163 | }
164 | > .table > tbody:first-child > tr:first-child th,
165 | > .table > tbody:first-child > tr:first-child td {
166 | border-top: 0;
167 | }
168 | > .table-bordered,
169 | > .table-responsive > .table-bordered {
170 | border: 0;
171 | > thead,
172 | > tbody,
173 | > tfoot {
174 | > tr {
175 | > th:first-child,
176 | > td:first-child {
177 | border-left: 0;
178 | }
179 | > th:last-child,
180 | > td:last-child {
181 | border-right: 0;
182 | }
183 | }
184 | }
185 | > thead,
186 | > tbody {
187 | > tr:first-child {
188 | > td,
189 | > th {
190 | border-bottom: 0;
191 | }
192 | }
193 | }
194 | > tbody,
195 | > tfoot {
196 | > tr:last-child {
197 | > td,
198 | > th {
199 | border-bottom: 0;
200 | }
201 | }
202 | }
203 | }
204 | > .table-responsive {
205 | border: 0;
206 | margin-bottom: 0;
207 | }
208 | }
209 |
210 |
211 | // Collapsable panels (aka, accordion)
212 | //
213 | // Wrap a series of panels in `.panel-group` to turn them into an accordion with
214 | // the help of our collapse JavaScript plugin.
215 |
216 | .panel-group {
217 | margin-bottom: @line-height-computed;
218 |
219 | // Tighten up margin so it's only between panels
220 | .panel {
221 | margin-bottom: 0;
222 | border-radius: @panel-border-radius;
223 |
224 | + .panel {
225 | margin-top: 5px;
226 | }
227 | }
228 |
229 | .panel-heading {
230 | border-bottom: 0;
231 |
232 | + .panel-collapse > .panel-body,
233 | + .panel-collapse > .list-group {
234 | border-top: 1px solid @panel-inner-border;
235 | }
236 | }
237 |
238 | .panel-footer {
239 | border-top: 0;
240 | + .panel-collapse .panel-body {
241 | border-bottom: 1px solid @panel-inner-border;
242 | }
243 | }
244 | }
245 |
246 |
247 | // Contextual variations
248 | .panel-default {
249 | .panel-variant(@panel-default-border; @panel-default-text; @panel-default-heading-bg; @panel-default-border);
250 | }
251 | .panel-primary {
252 | .panel-variant(@panel-primary-border; @panel-primary-text; @panel-primary-heading-bg; @panel-primary-border);
253 | }
254 | .panel-success {
255 | .panel-variant(@panel-success-border; @panel-success-text; @panel-success-heading-bg; @panel-success-border);
256 | }
257 | .panel-info {
258 | .panel-variant(@panel-info-border; @panel-info-text; @panel-info-heading-bg; @panel-info-border);
259 | }
260 | .panel-warning {
261 | .panel-variant(@panel-warning-border; @panel-warning-text; @panel-warning-heading-bg; @panel-warning-border);
262 | }
263 | .panel-danger {
264 | .panel-variant(@panel-danger-border; @panel-danger-text; @panel-danger-heading-bg; @panel-danger-border);
265 | }
266 |
--------------------------------------------------------------------------------
/app/styles/less/popovers.less:
--------------------------------------------------------------------------------
1 | //
2 | // Popovers
3 | // --------------------------------------------------
4 |
5 |
6 | .popover {
7 | position: absolute;
8 | top: 0;
9 | left: 0;
10 | z-index: @zindex-popover;
11 | display: none;
12 | max-width: @popover-max-width;
13 | padding: 1px;
14 | // Reset font and text properties given new insertion method
15 | font-family: @font-family-base;
16 | font-size: @font-size-base;
17 | font-weight: normal;
18 | line-height: @line-height-base;
19 | text-align: left;
20 | background-color: @popover-bg;
21 | background-clip: padding-box;
22 | border: 1px solid @popover-fallback-border-color;
23 | border: 1px solid @popover-border-color;
24 | border-radius: @border-radius-large;
25 | .box-shadow(0 5px 10px rgba(0,0,0,.2));
26 |
27 | // Overrides for proper insertion
28 | white-space: normal;
29 |
30 | // Offset the popover to account for the popover arrow
31 | &.top { margin-top: -@popover-arrow-width; }
32 | &.right { margin-left: @popover-arrow-width; }
33 | &.bottom { margin-top: @popover-arrow-width; }
34 | &.left { margin-left: -@popover-arrow-width; }
35 | }
36 |
37 | .popover-title {
38 | margin: 0; // reset heading margin
39 | padding: 8px 14px;
40 | font-size: @font-size-base;
41 | background-color: @popover-title-bg;
42 | border-bottom: 1px solid darken(@popover-title-bg, 5%);
43 | border-radius: (@border-radius-large - 1) (@border-radius-large - 1) 0 0;
44 | }
45 |
46 | .popover-content {
47 | padding: 9px 14px;
48 | }
49 |
50 | // Arrows
51 | //
52 | // .arrow is outer, .arrow:after is inner
53 |
54 | .popover > .arrow {
55 | &,
56 | &:after {
57 | position: absolute;
58 | display: block;
59 | width: 0;
60 | height: 0;
61 | border-color: transparent;
62 | border-style: solid;
63 | }
64 | }
65 | .popover > .arrow {
66 | border-width: @popover-arrow-outer-width;
67 | }
68 | .popover > .arrow:after {
69 | border-width: @popover-arrow-width;
70 | content: "";
71 | }
72 |
73 | .popover {
74 | &.top > .arrow {
75 | left: 50%;
76 | margin-left: -@popover-arrow-outer-width;
77 | border-bottom-width: 0;
78 | border-top-color: @popover-arrow-outer-fallback-color; // IE8 fallback
79 | border-top-color: @popover-arrow-outer-color;
80 | bottom: -@popover-arrow-outer-width;
81 | &:after {
82 | content: " ";
83 | bottom: 1px;
84 | margin-left: -@popover-arrow-width;
85 | border-bottom-width: 0;
86 | border-top-color: @popover-arrow-color;
87 | }
88 | }
89 | &.right > .arrow {
90 | top: 50%;
91 | left: -@popover-arrow-outer-width;
92 | margin-top: -@popover-arrow-outer-width;
93 | border-left-width: 0;
94 | border-right-color: @popover-arrow-outer-fallback-color; // IE8 fallback
95 | border-right-color: @popover-arrow-outer-color;
96 | &:after {
97 | content: " ";
98 | left: 1px;
99 | bottom: -@popover-arrow-width;
100 | border-left-width: 0;
101 | border-right-color: @popover-arrow-color;
102 | }
103 | }
104 | &.bottom > .arrow {
105 | left: 50%;
106 | margin-left: -@popover-arrow-outer-width;
107 | border-top-width: 0;
108 | border-bottom-color: @popover-arrow-outer-fallback-color; // IE8 fallback
109 | border-bottom-color: @popover-arrow-outer-color;
110 | top: -@popover-arrow-outer-width;
111 | &:after {
112 | content: " ";
113 | top: 1px;
114 | margin-left: -@popover-arrow-width;
115 | border-top-width: 0;
116 | border-bottom-color: @popover-arrow-color;
117 | }
118 | }
119 |
120 | &.left > .arrow {
121 | top: 50%;
122 | right: -@popover-arrow-outer-width;
123 | margin-top: -@popover-arrow-outer-width;
124 | border-right-width: 0;
125 | border-left-color: @popover-arrow-outer-fallback-color; // IE8 fallback
126 | border-left-color: @popover-arrow-outer-color;
127 | &:after {
128 | content: " ";
129 | right: 1px;
130 | border-right-width: 0;
131 | border-left-color: @popover-arrow-color;
132 | bottom: -@popover-arrow-width;
133 | }
134 | }
135 | }
136 |
--------------------------------------------------------------------------------
/app/styles/less/print.less:
--------------------------------------------------------------------------------
1 | /*! Source: https://github.com/h5bp/html5-boilerplate/blob/master/src/css/main.css */
2 |
3 | // ==========================================================================
4 | // Print styles.
5 | // Inlined to avoid the additional HTTP request: h5bp.com/r
6 | // ==========================================================================
7 |
8 | @media print {
9 | *,
10 | *:before,
11 | *:after {
12 | background: transparent !important;
13 | color: #000 !important; // Black prints faster: h5bp.com/s
14 | box-shadow: none !important;
15 | text-shadow: none !important;
16 | }
17 |
18 | a,
19 | a:visited {
20 | text-decoration: underline;
21 | }
22 |
23 | a[href]:after {
24 | content: " (" attr(href) ")";
25 | }
26 |
27 | abbr[title]:after {
28 | content: " (" attr(title) ")";
29 | }
30 |
31 | // Don't show links that are fragment identifiers,
32 | // or use the `javascript:` pseudo protocol
33 | a[href^="#"]:after,
34 | a[href^="javascript:"]:after {
35 | content: "";
36 | }
37 |
38 | pre,
39 | blockquote {
40 | border: 1px solid #999;
41 | page-break-inside: avoid;
42 | }
43 |
44 | thead {
45 | display: table-header-group; // h5bp.com/t
46 | }
47 |
48 | tr,
49 | img {
50 | page-break-inside: avoid;
51 | }
52 |
53 | img {
54 | max-width: 100% !important;
55 | }
56 |
57 | p,
58 | h2,
59 | h3 {
60 | orphans: 3;
61 | widows: 3;
62 | }
63 |
64 | h2,
65 | h3 {
66 | page-break-after: avoid;
67 | }
68 |
69 | // Bootstrap specific changes start
70 | //
71 | // Chrome (OSX) fix for https://github.com/twbs/bootstrap/issues/11245
72 | // Once fixed, we can just straight up remove this.
73 | select {
74 | background: #fff !important;
75 | }
76 |
77 | // Bootstrap components
78 | .navbar {
79 | display: none;
80 | }
81 | .btn,
82 | .dropup > .btn {
83 | > .caret {
84 | border-top-color: #000 !important;
85 | }
86 | }
87 | .label {
88 | border: 1px solid #000;
89 | }
90 |
91 | .table {
92 | border-collapse: collapse !important;
93 |
94 | td,
95 | th {
96 | background-color: #fff !important;
97 | }
98 | }
99 | .table-bordered {
100 | th,
101 | td {
102 | border: 1px solid #ddd !important;
103 | }
104 | }
105 |
106 | // Bootstrap specific changes end
107 | }
108 |
--------------------------------------------------------------------------------
/app/styles/less/progress-bars.less:
--------------------------------------------------------------------------------
1 | //
2 | // Progress bars
3 | // --------------------------------------------------
4 |
5 |
6 | // Bar animations
7 | // -------------------------
8 |
9 | // WebKit
10 | @-webkit-keyframes progress-bar-stripes {
11 | from { background-position: 40px 0; }
12 | to { background-position: 0 0; }
13 | }
14 |
15 | // Spec and IE10+
16 | @keyframes progress-bar-stripes {
17 | from { background-position: 40px 0; }
18 | to { background-position: 0 0; }
19 | }
20 |
21 |
22 | // Bar itself
23 | // -------------------------
24 |
25 | // Outer container
26 | .progress {
27 | overflow: hidden;
28 | height: @line-height-computed;
29 | margin-bottom: @line-height-computed;
30 | background-color: @progress-bg;
31 | border-radius: @progress-border-radius;
32 | .box-shadow(inset 0 1px 2px rgba(0,0,0,.1));
33 | }
34 |
35 | // Bar of progress
36 | .progress-bar {
37 | float: left;
38 | width: 0%;
39 | height: 100%;
40 | font-size: @font-size-small;
41 | line-height: @line-height-computed;
42 | color: @progress-bar-color;
43 | text-align: center;
44 | background-color: @progress-bar-bg;
45 | .box-shadow(inset 0 -1px 0 rgba(0,0,0,.15));
46 | .transition(width .6s ease);
47 | }
48 |
49 | // Striped bars
50 | //
51 | // `.progress-striped .progress-bar` is deprecated as of v3.2.0 in favor of the
52 | // `.progress-bar-striped` class, which you just add to an existing
53 | // `.progress-bar`.
54 | .progress-striped .progress-bar,
55 | .progress-bar-striped {
56 | #gradient > .striped();
57 | background-size: 40px 40px;
58 | }
59 |
60 | // Call animation for the active one
61 | //
62 | // `.progress.active .progress-bar` is deprecated as of v3.2.0 in favor of the
63 | // `.progress-bar.active` approach.
64 | .progress.active .progress-bar,
65 | .progress-bar.active {
66 | .animation(progress-bar-stripes 2s linear infinite);
67 | }
68 |
69 |
70 | // Variations
71 | // -------------------------
72 |
73 | .progress-bar-success {
74 | .progress-bar-variant(@progress-bar-success-bg);
75 | }
76 |
77 | .progress-bar-info {
78 | .progress-bar-variant(@progress-bar-info-bg);
79 | }
80 |
81 | .progress-bar-warning {
82 | .progress-bar-variant(@progress-bar-warning-bg);
83 | }
84 |
85 | .progress-bar-danger {
86 | .progress-bar-variant(@progress-bar-danger-bg);
87 | }
88 |
--------------------------------------------------------------------------------
/app/styles/less/responsive-embed.less:
--------------------------------------------------------------------------------
1 | // Embeds responsive
2 | //
3 | // Credit: Nicolas Gallagher and SUIT CSS.
4 |
5 | .embed-responsive {
6 | position: relative;
7 | display: block;
8 | height: 0;
9 | padding: 0;
10 | overflow: hidden;
11 |
12 | .embed-responsive-item,
13 | iframe,
14 | embed,
15 | object,
16 | video {
17 | position: absolute;
18 | top: 0;
19 | left: 0;
20 | bottom: 0;
21 | height: 100%;
22 | width: 100%;
23 | border: 0;
24 | }
25 | }
26 |
27 | // Modifier class for 16:9 aspect ratio
28 | .embed-responsive-16by9 {
29 | padding-bottom: 56.25%;
30 | }
31 |
32 | // Modifier class for 4:3 aspect ratio
33 | .embed-responsive-4by3 {
34 | padding-bottom: 75%;
35 | }
36 |
--------------------------------------------------------------------------------
/app/styles/less/responsive-utilities.less:
--------------------------------------------------------------------------------
1 | //
2 | // Responsive: Utility classes
3 | // --------------------------------------------------
4 |
5 |
6 | // IE10 in Windows (Phone) 8
7 | //
8 | // Support for responsive views via media queries is kind of borked in IE10, for
9 | // Surface/desktop in split view and for Windows Phone 8. This particular fix
10 | // must be accompanied by a snippet of JavaScript to sniff the user agent and
11 | // apply some conditional CSS to *only* the Surface/desktop Windows 8. Look at
12 | // our Getting Started page for more information on this bug.
13 | //
14 | // For more information, see the following:
15 | //
16 | // Issue: https://github.com/twbs/bootstrap/issues/10497
17 | // Docs: http://getbootstrap.com/getting-started/#support-ie10-width
18 | // Source: http://timkadlec.com/2013/01/windows-phone-8-and-device-width/
19 | // Source: http://timkadlec.com/2012/10/ie10-snap-mode-and-responsive-design/
20 |
21 | @-ms-viewport {
22 | width: device-width;
23 | }
24 |
25 |
26 | // Visibility utilities
27 | // Note: Deprecated .visible-xs, .visible-sm, .visible-md, and .visible-lg as of v3.2.0
28 | .visible-xs,
29 | .visible-sm,
30 | .visible-md,
31 | .visible-lg {
32 | .responsive-invisibility();
33 | }
34 |
35 | .visible-xs-block,
36 | .visible-xs-inline,
37 | .visible-xs-inline-block,
38 | .visible-sm-block,
39 | .visible-sm-inline,
40 | .visible-sm-inline-block,
41 | .visible-md-block,
42 | .visible-md-inline,
43 | .visible-md-inline-block,
44 | .visible-lg-block,
45 | .visible-lg-inline,
46 | .visible-lg-inline-block {
47 | display: none !important;
48 | }
49 |
50 | .visible-xs {
51 | @media (max-width: @screen-xs-max) {
52 | .responsive-visibility();
53 | }
54 | }
55 | .visible-xs-block {
56 | @media (max-width: @screen-xs-max) {
57 | display: block !important;
58 | }
59 | }
60 | .visible-xs-inline {
61 | @media (max-width: @screen-xs-max) {
62 | display: inline !important;
63 | }
64 | }
65 | .visible-xs-inline-block {
66 | @media (max-width: @screen-xs-max) {
67 | display: inline-block !important;
68 | }
69 | }
70 |
71 | .visible-sm {
72 | @media (min-width: @screen-sm-min) and (max-width: @screen-sm-max) {
73 | .responsive-visibility();
74 | }
75 | }
76 | .visible-sm-block {
77 | @media (min-width: @screen-sm-min) and (max-width: @screen-sm-max) {
78 | display: block !important;
79 | }
80 | }
81 | .visible-sm-inline {
82 | @media (min-width: @screen-sm-min) and (max-width: @screen-sm-max) {
83 | display: inline !important;
84 | }
85 | }
86 | .visible-sm-inline-block {
87 | @media (min-width: @screen-sm-min) and (max-width: @screen-sm-max) {
88 | display: inline-block !important;
89 | }
90 | }
91 |
92 | .visible-md {
93 | @media (min-width: @screen-md-min) and (max-width: @screen-md-max) {
94 | .responsive-visibility();
95 | }
96 | }
97 | .visible-md-block {
98 | @media (min-width: @screen-md-min) and (max-width: @screen-md-max) {
99 | display: block !important;
100 | }
101 | }
102 | .visible-md-inline {
103 | @media (min-width: @screen-md-min) and (max-width: @screen-md-max) {
104 | display: inline !important;
105 | }
106 | }
107 | .visible-md-inline-block {
108 | @media (min-width: @screen-md-min) and (max-width: @screen-md-max) {
109 | display: inline-block !important;
110 | }
111 | }
112 |
113 | .visible-lg {
114 | @media (min-width: @screen-lg-min) {
115 | .responsive-visibility();
116 | }
117 | }
118 | .visible-lg-block {
119 | @media (min-width: @screen-lg-min) {
120 | display: block !important;
121 | }
122 | }
123 | .visible-lg-inline {
124 | @media (min-width: @screen-lg-min) {
125 | display: inline !important;
126 | }
127 | }
128 | .visible-lg-inline-block {
129 | @media (min-width: @screen-lg-min) {
130 | display: inline-block !important;
131 | }
132 | }
133 |
134 | .hidden-xs {
135 | @media (max-width: @screen-xs-max) {
136 | .responsive-invisibility();
137 | }
138 | }
139 | .hidden-sm {
140 | @media (min-width: @screen-sm-min) and (max-width: @screen-sm-max) {
141 | .responsive-invisibility();
142 | }
143 | }
144 | .hidden-md {
145 | @media (min-width: @screen-md-min) and (max-width: @screen-md-max) {
146 | .responsive-invisibility();
147 | }
148 | }
149 | .hidden-lg {
150 | @media (min-width: @screen-lg-min) {
151 | .responsive-invisibility();
152 | }
153 | }
154 |
155 |
156 | // Print utilities
157 | //
158 | // Media queries are placed on the inside to be mixin-friendly.
159 |
160 | // Note: Deprecated .visible-print as of v3.2.0
161 | .visible-print {
162 | .responsive-invisibility();
163 |
164 | @media print {
165 | .responsive-visibility();
166 | }
167 | }
168 | .visible-print-block {
169 | display: none !important;
170 |
171 | @media print {
172 | display: block !important;
173 | }
174 | }
175 | .visible-print-inline {
176 | display: none !important;
177 |
178 | @media print {
179 | display: inline !important;
180 | }
181 | }
182 | .visible-print-inline-block {
183 | display: none !important;
184 |
185 | @media print {
186 | display: inline-block !important;
187 | }
188 | }
189 |
190 | .hidden-print {
191 | @media print {
192 | .responsive-invisibility();
193 | }
194 | }
195 |
--------------------------------------------------------------------------------
/app/styles/less/scaffolding.less:
--------------------------------------------------------------------------------
1 | //
2 | // Scaffolding
3 | // --------------------------------------------------
4 |
5 |
6 | // Reset the box-sizing
7 | //
8 | // Heads up! This reset may cause conflicts with some third-party widgets.
9 | // For recommendations on resolving such conflicts, see
10 | // http://getbootstrap.com/getting-started/#third-box-sizing
11 | * {
12 | .box-sizing(border-box);
13 | }
14 | *:before,
15 | *:after {
16 | .box-sizing(border-box);
17 | }
18 |
19 |
20 | // Body reset
21 |
22 | html {
23 | font-size: 10px;
24 | -webkit-tap-highlight-color: rgba(0,0,0,0);
25 | }
26 |
27 | body {
28 | font-family: @font-family-base;
29 | font-size: @font-size-base;
30 | line-height: @line-height-base;
31 | color: @text-color;
32 | background-color: @body-bg;
33 | }
34 |
35 | // Reset fonts for relevant elements
36 | input,
37 | button,
38 | select,
39 | textarea {
40 | font-family: inherit;
41 | font-size: inherit;
42 | line-height: inherit;
43 | }
44 |
45 |
46 | // Links
47 |
48 | a {
49 | color: @link-color;
50 | text-decoration: none;
51 |
52 | &:hover,
53 | &:focus {
54 | color: @link-hover-color;
55 | text-decoration: @link-hover-decoration;
56 | }
57 |
58 | &:focus {
59 | .tab-focus();
60 | }
61 | }
62 |
63 |
64 | // Figures
65 | //
66 | // We reset this here because previously Normalize had no `figure` margins. This
67 | // ensures we don't break anyone's use of the element.
68 |
69 | figure {
70 | margin: 0;
71 | }
72 |
73 |
74 | // Images
75 |
76 | img {
77 | vertical-align: middle;
78 | }
79 |
80 | // Responsive images (ensure images don't scale beyond their parents)
81 | .img-responsive {
82 | .img-responsive();
83 | }
84 |
85 | // Rounded corners
86 | .img-rounded {
87 | border-radius: @border-radius-large;
88 | }
89 |
90 | // Image thumbnails
91 | //
92 | // Heads up! This is mixin-ed into thumbnails.less for `.thumbnail`.
93 | .img-thumbnail {
94 | padding: @thumbnail-padding;
95 | line-height: @line-height-base;
96 | background-color: @thumbnail-bg;
97 | border: 1px solid @thumbnail-border;
98 | border-radius: @thumbnail-border-radius;
99 | .transition(all .2s ease-in-out);
100 |
101 | // Keep them at most 100% wide
102 | .img-responsive(inline-block);
103 | }
104 |
105 | // Perfect circle
106 | .img-circle {
107 | border-radius: 50%; // set radius in percents
108 | }
109 |
110 |
111 | // Horizontal rules
112 |
113 | hr {
114 | margin-top: @line-height-computed;
115 | margin-bottom: @line-height-computed;
116 | border: 0;
117 | border-top: 1px solid @hr-border;
118 | }
119 |
120 |
121 | // Only display content to screen readers
122 | //
123 | // See: http://a11yproject.com/posts/how-to-hide-content/
124 |
125 | .sr-only {
126 | position: absolute;
127 | width: 1px;
128 | height: 1px;
129 | margin: -1px;
130 | padding: 0;
131 | overflow: hidden;
132 | clip: rect(0,0,0,0);
133 | border: 0;
134 | }
135 |
136 | // Use in conjunction with .sr-only to only display content when it's focused.
137 | // Useful for "Skip to main content" links; see http://www.w3.org/TR/2013/NOTE-WCAG20-TECHS-20130905/G1
138 | // Credit: HTML5 Boilerplate
139 |
140 | .sr-only-focusable {
141 | &:active,
142 | &:focus {
143 | position: static;
144 | width: auto;
145 | height: auto;
146 | margin: 0;
147 | overflow: visible;
148 | clip: auto;
149 | }
150 | }
151 |
152 |
153 | // iOS "clickable elements" fix for role="button"
154 | //
155 | // Fixes "clickability" issue (and more generally, the firing of events such as focus as well)
156 | // for traditionally non-focusable elements with role="button"
157 | // see https://developer.mozilla.org/en-US/docs/Web/Events/click#Safari_Mobile
158 | // Upstream patch for normalize.css submitted: https://github.com/necolas/normalize.css/pull/379 - remove this fix once that is merged
159 |
160 | [role="button"] {
161 | cursor: pointer;
162 | }
--------------------------------------------------------------------------------
/app/styles/less/tables.less:
--------------------------------------------------------------------------------
1 | //
2 | // Tables
3 | // --------------------------------------------------
4 |
5 |
6 | table {
7 | background-color: @table-bg;
8 | }
9 | caption {
10 | padding-top: @table-cell-padding;
11 | padding-bottom: @table-cell-padding;
12 | color: @text-muted;
13 | text-align: left;
14 | }
15 | th {
16 | text-align: left;
17 | }
18 |
19 |
20 | // Baseline styles
21 |
22 | .table {
23 | width: 100%;
24 | max-width: 100%;
25 | margin-bottom: @line-height-computed;
26 | // Cells
27 | > thead,
28 | > tbody,
29 | > tfoot {
30 | > tr {
31 | > th,
32 | > td {
33 | padding: @table-cell-padding;
34 | line-height: @line-height-base;
35 | vertical-align: top;
36 | border-top: 1px solid @table-border-color;
37 | }
38 | }
39 | }
40 | // Bottom align for column headings
41 | > thead > tr > th {
42 | vertical-align: bottom;
43 | border-bottom: 2px solid @table-border-color;
44 | }
45 | // Remove top border from thead by default
46 | > caption + thead,
47 | > colgroup + thead,
48 | > thead:first-child {
49 | > tr:first-child {
50 | > th,
51 | > td {
52 | border-top: 0;
53 | }
54 | }
55 | }
56 | // Account for multiple tbody instances
57 | > tbody + tbody {
58 | border-top: 2px solid @table-border-color;
59 | }
60 |
61 | // Nesting
62 | .table {
63 | background-color: @body-bg;
64 | }
65 | }
66 |
67 |
68 | // Condensed table w/ half padding
69 |
70 | .table-condensed {
71 | > thead,
72 | > tbody,
73 | > tfoot {
74 | > tr {
75 | > th,
76 | > td {
77 | padding: @table-condensed-cell-padding;
78 | }
79 | }
80 | }
81 | }
82 |
83 |
84 | // Bordered version
85 | //
86 | // Add borders all around the table and between all the columns.
87 |
88 | .table-bordered {
89 | border: 1px solid @table-border-color;
90 | > thead,
91 | > tbody,
92 | > tfoot {
93 | > tr {
94 | > th,
95 | > td {
96 | border: 1px solid @table-border-color;
97 | }
98 | }
99 | }
100 | > thead > tr {
101 | > th,
102 | > td {
103 | border-bottom-width: 2px;
104 | }
105 | }
106 | }
107 |
108 |
109 | // Zebra-striping
110 | //
111 | // Default zebra-stripe styles (alternating gray and transparent backgrounds)
112 |
113 | .table-striped {
114 | > tbody > tr:nth-of-type(odd) {
115 | background-color: @table-bg-accent;
116 | }
117 | }
118 |
119 |
120 | // Hover effect
121 | //
122 | // Placed here since it has to come after the potential zebra striping
123 |
124 | .table-hover {
125 | > tbody > tr:hover {
126 | background-color: @table-bg-hover;
127 | }
128 | }
129 |
130 |
131 | // Table cell sizing
132 | //
133 | // Reset default table behavior
134 |
135 | table col[class*="col-"] {
136 | position: static; // Prevent border hiding in Firefox and IE9-11 (see https://github.com/twbs/bootstrap/issues/11623)
137 | float: none;
138 | display: table-column;
139 | }
140 | table {
141 | td,
142 | th {
143 | &[class*="col-"] {
144 | position: static; // Prevent border hiding in Firefox and IE9-11 (see https://github.com/twbs/bootstrap/issues/11623)
145 | float: none;
146 | display: table-cell;
147 | }
148 | }
149 | }
150 |
151 |
152 | // Table backgrounds
153 | //
154 | // Exact selectors below required to override `.table-striped` and prevent
155 | // inheritance to nested tables.
156 |
157 | // Generate the contextual variants
158 | .table-row-variant(active; @table-bg-active);
159 | .table-row-variant(success; @state-success-bg);
160 | .table-row-variant(info; @state-info-bg);
161 | .table-row-variant(warning; @state-warning-bg);
162 | .table-row-variant(danger; @state-danger-bg);
163 |
164 |
165 | // Responsive tables
166 | //
167 | // Wrap your tables in `.table-responsive` and we'll make them mobile friendly
168 | // by enabling horizontal scrolling. Only applies <768px. Everything above that
169 | // will display normally.
170 |
171 | .table-responsive {
172 | overflow-x: auto;
173 | min-height: 0.01%; // Workaround for IE9 bug (see https://github.com/twbs/bootstrap/issues/14837)
174 |
175 | @media screen and (max-width: @screen-xs-max) {
176 | width: 100%;
177 | margin-bottom: (@line-height-computed * 0.75);
178 | overflow-y: hidden;
179 | -ms-overflow-style: -ms-autohiding-scrollbar;
180 | border: 1px solid @table-border-color;
181 |
182 | // Tighten up spacing
183 | > .table {
184 | margin-bottom: 0;
185 |
186 | // Ensure the content doesn't wrap
187 | > thead,
188 | > tbody,
189 | > tfoot {
190 | > tr {
191 | > th,
192 | > td {
193 | white-space: nowrap;
194 | }
195 | }
196 | }
197 | }
198 |
199 | // Special overrides for the bordered tables
200 | > .table-bordered {
201 | border: 0;
202 |
203 | // Nuke the appropriate borders so that the parent can handle them
204 | > thead,
205 | > tbody,
206 | > tfoot {
207 | > tr {
208 | > th:first-child,
209 | > td:first-child {
210 | border-left: 0;
211 | }
212 | > th:last-child,
213 | > td:last-child {
214 | border-right: 0;
215 | }
216 | }
217 | }
218 |
219 | // Only nuke the last row's bottom-border in `tbody` and `tfoot` since
220 | // chances are there will be only one `tr` in a `thead` and that would
221 | // remove the border altogether.
222 | > tbody,
223 | > tfoot {
224 | > tr:last-child {
225 | > th,
226 | > td {
227 | border-bottom: 0;
228 | }
229 | }
230 | }
231 |
232 | }
233 | }
234 | }
235 |
--------------------------------------------------------------------------------
/app/styles/less/theme.less:
--------------------------------------------------------------------------------
1 |
2 | //
3 | // Load core variables and mixins
4 | // --------------------------------------------------
5 |
6 | @import "variables.less";
7 | @import "mixins.less";
8 |
9 |
10 | //
11 | // Buttons
12 | // --------------------------------------------------
13 |
14 | // Common styles
15 | .btn-default,
16 | .btn-primary,
17 | .btn-success,
18 | .btn-info,
19 | .btn-warning,
20 | .btn-danger {
21 | text-shadow: 0 -1px 0 rgba(0,0,0,.2);
22 | @shadow: inset 0 1px 0 rgba(255,255,255,.15), 0 1px 1px rgba(0,0,0,.075);
23 | .box-shadow(@shadow);
24 |
25 | // Reset the shadow
26 | &:active,
27 | &.active {
28 | .box-shadow(inset 0 3px 5px rgba(0,0,0,.125));
29 | }
30 |
31 | .badge {
32 | text-shadow: none;
33 | }
34 | }
35 |
36 | // Mixin for generating new styles
37 | .btn-styles(@btn-color: #555) {
38 | #gradient > .vertical(@start-color: @btn-color; @end-color: darken(@btn-color, 12%));
39 | .reset-filter(); // Disable gradients for IE9 because filter bleeds through rounded corners; see https://github.com/twbs/bootstrap/issues/10620
40 | background-repeat: repeat-x;
41 | border-color: darken(@btn-color, 14%);
42 |
43 | &:hover,
44 | &:focus {
45 | background-color: darken(@btn-color, 12%);
46 | background-position: 0 -15px;
47 | }
48 |
49 | &:active,
50 | &.active {
51 | background-color: darken(@btn-color, 12%);
52 | border-color: darken(@btn-color, 14%);
53 | }
54 |
55 | &.disabled,
56 | &:disabled,
57 | &[disabled] {
58 | background-color: darken(@btn-color, 12%);
59 | background-image: none;
60 | }
61 | }
62 |
63 | // Common styles
64 | .btn {
65 | // Remove the gradient for the pressed/active state
66 | &:active,
67 | &.active {
68 | background-image: none;
69 | }
70 | }
71 |
72 | // Apply the mixin to the buttons
73 | .btn-default { .btn-styles(@btn-default-bg); text-shadow: 0 1px 0 #fff; border-color: #ccc; }
74 | .btn-primary { .btn-styles(@btn-primary-bg); }
75 | .btn-success { .btn-styles(@btn-success-bg); }
76 | .btn-info { .btn-styles(@btn-info-bg); }
77 | .btn-warning { .btn-styles(@btn-warning-bg); }
78 | .btn-danger { .btn-styles(@btn-danger-bg); }
79 |
80 |
81 | //
82 | // Images
83 | // --------------------------------------------------
84 |
85 | .thumbnail,
86 | .img-thumbnail {
87 | .box-shadow(0 1px 2px rgba(0,0,0,.075));
88 | }
89 |
90 |
91 | //
92 | // Dropdowns
93 | // --------------------------------------------------
94 |
95 | .dropdown-menu > li > a:hover,
96 | .dropdown-menu > li > a:focus {
97 | #gradient > .vertical(@start-color: @dropdown-link-hover-bg; @end-color: darken(@dropdown-link-hover-bg, 5%));
98 | background-color: darken(@dropdown-link-hover-bg, 5%);
99 | }
100 | .dropdown-menu > .active > a,
101 | .dropdown-menu > .active > a:hover,
102 | .dropdown-menu > .active > a:focus {
103 | #gradient > .vertical(@start-color: @dropdown-link-active-bg; @end-color: darken(@dropdown-link-active-bg, 5%));
104 | background-color: darken(@dropdown-link-active-bg, 5%);
105 | }
106 |
107 |
108 | //
109 | // Navbar
110 | // --------------------------------------------------
111 |
112 | // Default navbar
113 | .navbar-default {
114 | #gradient > .vertical(@start-color: lighten(@navbar-default-bg, 10%); @end-color: @navbar-default-bg);
115 | .reset-filter(); // Remove gradient in IE<10 to fix bug where dropdowns don't get triggered
116 | border-radius: @navbar-border-radius;
117 | @shadow: inset 0 1px 0 rgba(255,255,255,.15), 0 1px 5px rgba(0,0,0,.075);
118 | .box-shadow(@shadow);
119 |
120 | .navbar-nav > .open > a,
121 | .navbar-nav > .active > a {
122 | #gradient > .vertical(@start-color: darken(@navbar-default-link-active-bg, 5%); @end-color: darken(@navbar-default-link-active-bg, 2%));
123 | .box-shadow(inset 0 3px 9px rgba(0,0,0,.075));
124 | }
125 | }
126 | .navbar-brand,
127 | .navbar-nav > li > a {
128 | text-shadow: 0 1px 0 rgba(255,255,255,.25);
129 | }
130 |
131 | // Inverted navbar
132 | .navbar-inverse {
133 | #gradient > .vertical(@start-color: lighten(@navbar-inverse-bg, 10%); @end-color: @navbar-inverse-bg);
134 | .reset-filter(); // Remove gradient in IE<10 to fix bug where dropdowns don't get triggered; see https://github.com/twbs/bootstrap/issues/10257
135 |
136 | .navbar-nav > .open > a,
137 | .navbar-nav > .active > a {
138 | #gradient > .vertical(@start-color: @navbar-inverse-link-active-bg; @end-color: lighten(@navbar-inverse-link-active-bg, 2.5%));
139 | .box-shadow(inset 0 3px 9px rgba(0,0,0,.25));
140 | }
141 |
142 | .navbar-brand,
143 | .navbar-nav > li > a {
144 | text-shadow: 0 -1px 0 rgba(0,0,0,.25);
145 | }
146 | }
147 |
148 | // Undo rounded corners in static and fixed navbars
149 | .navbar-static-top,
150 | .navbar-fixed-top,
151 | .navbar-fixed-bottom {
152 | border-radius: 0;
153 | }
154 |
155 | // Fix active state of dropdown items in collapsed mode
156 | @media (max-width: @grid-float-breakpoint-max) {
157 | .navbar .navbar-nav .open .dropdown-menu > .active > a {
158 | &,
159 | &:hover,
160 | &:focus {
161 | color: #fff;
162 | #gradient > .vertical(@start-color: @dropdown-link-active-bg; @end-color: darken(@dropdown-link-active-bg, 5%));
163 | }
164 | }
165 | }
166 |
167 |
168 | //
169 | // Alerts
170 | // --------------------------------------------------
171 |
172 | // Common styles
173 | .alert {
174 | text-shadow: 0 1px 0 rgba(255,255,255,.2);
175 | @shadow: inset 0 1px 0 rgba(255,255,255,.25), 0 1px 2px rgba(0,0,0,.05);
176 | .box-shadow(@shadow);
177 | }
178 |
179 | // Mixin for generating new styles
180 | .alert-styles(@color) {
181 | #gradient > .vertical(@start-color: @color; @end-color: darken(@color, 7.5%));
182 | border-color: darken(@color, 15%);
183 | }
184 |
185 | // Apply the mixin to the alerts
186 | .alert-success { .alert-styles(@alert-success-bg); }
187 | .alert-info { .alert-styles(@alert-info-bg); }
188 | .alert-warning { .alert-styles(@alert-warning-bg); }
189 | .alert-danger { .alert-styles(@alert-danger-bg); }
190 |
191 |
192 | //
193 | // Progress bars
194 | // --------------------------------------------------
195 |
196 | // Give the progress background some depth
197 | .progress {
198 | #gradient > .vertical(@start-color: darken(@progress-bg, 4%); @end-color: @progress-bg)
199 | }
200 |
201 | // Mixin for generating new styles
202 | .progress-bar-styles(@color) {
203 | #gradient > .vertical(@start-color: @color; @end-color: darken(@color, 10%));
204 | }
205 |
206 | // Apply the mixin to the progress bars
207 | .progress-bar { .progress-bar-styles(@progress-bar-bg); }
208 | .progress-bar-success { .progress-bar-styles(@progress-bar-success-bg); }
209 | .progress-bar-info { .progress-bar-styles(@progress-bar-info-bg); }
210 | .progress-bar-warning { .progress-bar-styles(@progress-bar-warning-bg); }
211 | .progress-bar-danger { .progress-bar-styles(@progress-bar-danger-bg); }
212 |
213 | // Reset the striped class because our mixins don't do multiple gradients and
214 | // the above custom styles override the new `.progress-bar-striped` in v3.2.0.
215 | .progress-bar-striped {
216 | #gradient > .striped();
217 | }
218 |
219 |
220 | //
221 | // List groups
222 | // --------------------------------------------------
223 |
224 | .list-group {
225 | border-radius: @border-radius-base;
226 | .box-shadow(0 1px 2px rgba(0,0,0,.075));
227 | }
228 | .list-group-item.active,
229 | .list-group-item.active:hover,
230 | .list-group-item.active:focus {
231 | text-shadow: 0 -1px 0 darken(@list-group-active-bg, 10%);
232 | #gradient > .vertical(@start-color: @list-group-active-bg; @end-color: darken(@list-group-active-bg, 7.5%));
233 | border-color: darken(@list-group-active-border, 7.5%);
234 |
235 | .badge {
236 | text-shadow: none;
237 | }
238 | }
239 |
240 |
241 | //
242 | // Panels
243 | // --------------------------------------------------
244 |
245 | // Common styles
246 | .panel {
247 | .box-shadow(0 1px 2px rgba(0,0,0,.05));
248 | }
249 |
250 | // Mixin for generating new styles
251 | .panel-heading-styles(@color) {
252 | #gradient > .vertical(@start-color: @color; @end-color: darken(@color, 5%));
253 | }
254 |
255 | // Apply the mixin to the panel headings only
256 | .panel-default > .panel-heading { .panel-heading-styles(@panel-default-heading-bg); }
257 | .panel-primary > .panel-heading { .panel-heading-styles(@panel-primary-heading-bg); }
258 | .panel-success > .panel-heading { .panel-heading-styles(@panel-success-heading-bg); }
259 | .panel-info > .panel-heading { .panel-heading-styles(@panel-info-heading-bg); }
260 | .panel-warning > .panel-heading { .panel-heading-styles(@panel-warning-heading-bg); }
261 | .panel-danger > .panel-heading { .panel-heading-styles(@panel-danger-heading-bg); }
262 |
263 |
264 | //
265 | // Wells
266 | // --------------------------------------------------
267 |
268 | .well {
269 | #gradient > .vertical(@start-color: darken(@well-bg, 5%); @end-color: @well-bg);
270 | border-color: darken(@well-bg, 10%);
271 | @shadow: inset 0 1px 3px rgba(0,0,0,.05), 0 1px 0 rgba(255,255,255,.1);
272 | .box-shadow(@shadow);
273 | }
274 |
--------------------------------------------------------------------------------
/app/styles/less/thumbnails.less:
--------------------------------------------------------------------------------
1 | //
2 | // Thumbnails
3 | // --------------------------------------------------
4 |
5 |
6 | // Mixin and adjust the regular image class
7 | .thumbnail {
8 | display: block;
9 | padding: @thumbnail-padding;
10 | margin-bottom: @line-height-computed;
11 | line-height: @line-height-base;
12 | background-color: @thumbnail-bg;
13 | border: 1px solid @thumbnail-border;
14 | border-radius: @thumbnail-border-radius;
15 | .transition(border .2s ease-in-out);
16 |
17 | > img,
18 | a > img {
19 | &:extend(.img-responsive);
20 | margin-left: auto;
21 | margin-right: auto;
22 | }
23 |
24 | // Add a hover state for linked versions only
25 | a&:hover,
26 | a&:focus,
27 | a&.active {
28 | border-color: @link-color;
29 | }
30 |
31 | // Image captions
32 | .caption {
33 | padding: @thumbnail-caption-padding;
34 | color: @thumbnail-caption-color;
35 | }
36 | }
37 |
--------------------------------------------------------------------------------
/app/styles/less/tooltip.less:
--------------------------------------------------------------------------------
1 | //
2 | // Tooltips
3 | // --------------------------------------------------
4 |
5 |
6 | // Base class
7 | .tooltip {
8 | position: absolute;
9 | z-index: @zindex-tooltip;
10 | display: block;
11 | // Reset font and text properties given new insertion method
12 | font-family: @font-family-base;
13 | font-size: @font-size-small;
14 | font-weight: normal;
15 | line-height: 1.4;
16 | .opacity(0);
17 |
18 | &.in { .opacity(@tooltip-opacity); }
19 | &.top { margin-top: -3px; padding: @tooltip-arrow-width 0; }
20 | &.right { margin-left: 3px; padding: 0 @tooltip-arrow-width; }
21 | &.bottom { margin-top: 3px; padding: @tooltip-arrow-width 0; }
22 | &.left { margin-left: -3px; padding: 0 @tooltip-arrow-width; }
23 | }
24 |
25 | // Wrapper for the tooltip content
26 | .tooltip-inner {
27 | max-width: @tooltip-max-width;
28 | padding: 3px 8px;
29 | color: @tooltip-color;
30 | text-align: center;
31 | text-decoration: none;
32 | background-color: @tooltip-bg;
33 | border-radius: @border-radius-base;
34 | }
35 |
36 | // Arrows
37 | .tooltip-arrow {
38 | position: absolute;
39 | width: 0;
40 | height: 0;
41 | border-color: transparent;
42 | border-style: solid;
43 | }
44 | // Note: Deprecated .top-left, .top-right, .bottom-left, and .bottom-right as of v3.3.1
45 | .tooltip {
46 | &.top .tooltip-arrow {
47 | bottom: 0;
48 | left: 50%;
49 | margin-left: -@tooltip-arrow-width;
50 | border-width: @tooltip-arrow-width @tooltip-arrow-width 0;
51 | border-top-color: @tooltip-arrow-color;
52 | }
53 | &.top-left .tooltip-arrow {
54 | bottom: 0;
55 | right: @tooltip-arrow-width;
56 | margin-bottom: -@tooltip-arrow-width;
57 | border-width: @tooltip-arrow-width @tooltip-arrow-width 0;
58 | border-top-color: @tooltip-arrow-color;
59 | }
60 | &.top-right .tooltip-arrow {
61 | bottom: 0;
62 | left: @tooltip-arrow-width;
63 | margin-bottom: -@tooltip-arrow-width;
64 | border-width: @tooltip-arrow-width @tooltip-arrow-width 0;
65 | border-top-color: @tooltip-arrow-color;
66 | }
67 | &.right .tooltip-arrow {
68 | top: 50%;
69 | left: 0;
70 | margin-top: -@tooltip-arrow-width;
71 | border-width: @tooltip-arrow-width @tooltip-arrow-width @tooltip-arrow-width 0;
72 | border-right-color: @tooltip-arrow-color;
73 | }
74 | &.left .tooltip-arrow {
75 | top: 50%;
76 | right: 0;
77 | margin-top: -@tooltip-arrow-width;
78 | border-width: @tooltip-arrow-width 0 @tooltip-arrow-width @tooltip-arrow-width;
79 | border-left-color: @tooltip-arrow-color;
80 | }
81 | &.bottom .tooltip-arrow {
82 | top: 0;
83 | left: 50%;
84 | margin-left: -@tooltip-arrow-width;
85 | border-width: 0 @tooltip-arrow-width @tooltip-arrow-width;
86 | border-bottom-color: @tooltip-arrow-color;
87 | }
88 | &.bottom-left .tooltip-arrow {
89 | top: 0;
90 | right: @tooltip-arrow-width;
91 | margin-top: -@tooltip-arrow-width;
92 | border-width: 0 @tooltip-arrow-width @tooltip-arrow-width;
93 | border-bottom-color: @tooltip-arrow-color;
94 | }
95 | &.bottom-right .tooltip-arrow {
96 | top: 0;
97 | left: @tooltip-arrow-width;
98 | margin-top: -@tooltip-arrow-width;
99 | border-width: 0 @tooltip-arrow-width @tooltip-arrow-width;
100 | border-bottom-color: @tooltip-arrow-color;
101 | }
102 | }
103 |
--------------------------------------------------------------------------------
/app/styles/less/type.less:
--------------------------------------------------------------------------------
1 | //
2 | // Typography
3 | // --------------------------------------------------
4 |
5 |
6 | // Headings
7 | // -------------------------
8 |
9 | h1, h2, h3, h4, h5, h6,
10 | .h1, .h2, .h3, .h4, .h5, .h6 {
11 | font-family: @headings-font-family;
12 | font-weight: @headings-font-weight;
13 | line-height: @headings-line-height;
14 | color: @headings-color;
15 |
16 | small,
17 | .small {
18 | font-weight: normal;
19 | line-height: 1;
20 | color: @headings-small-color;
21 | }
22 | }
23 |
24 | h1, .h1,
25 | h2, .h2,
26 | h3, .h3 {
27 | margin-top: @line-height-computed;
28 | margin-bottom: (@line-height-computed / 2);
29 |
30 | small,
31 | .small {
32 | font-size: 65%;
33 | }
34 | }
35 | h4, .h4,
36 | h5, .h5,
37 | h6, .h6 {
38 | margin-top: (@line-height-computed / 2);
39 | margin-bottom: (@line-height-computed / 2);
40 |
41 | small,
42 | .small {
43 | font-size: 75%;
44 | }
45 | }
46 |
47 | h1, .h1 { font-size: @font-size-h1; }
48 | h2, .h2 { font-size: @font-size-h2; }
49 | h3, .h3 { font-size: @font-size-h3; }
50 | h4, .h4 { font-size: @font-size-h4; }
51 | h5, .h5 { font-size: @font-size-h5; }
52 | h6, .h6 { font-size: @font-size-h6; }
53 |
54 |
55 | // Body text
56 | // -------------------------
57 |
58 | p {
59 | margin: 0 0 (@line-height-computed / 2);
60 | }
61 |
62 | .lead {
63 | margin-bottom: @line-height-computed;
64 | font-size: floor((@font-size-base * 1.15));
65 | font-weight: 300;
66 | line-height: 1.4;
67 |
68 | @media (min-width: @screen-sm-min) {
69 | font-size: (@font-size-base * 1.5);
70 | }
71 | }
72 |
73 |
74 | // Emphasis & misc
75 | // -------------------------
76 |
77 | // Ex: (12px small font / 14px base font) * 100% = about 85%
78 | small,
79 | .small {
80 | font-size: floor((100% * @font-size-small / @font-size-base));
81 | }
82 |
83 | mark,
84 | .mark {
85 | background-color: @state-warning-bg;
86 | padding: .2em;
87 | }
88 |
89 | // Alignment
90 | .text-left { text-align: left; }
91 | .text-right { text-align: right; }
92 | .text-center { text-align: center; }
93 | .text-justify { text-align: justify; }
94 | .text-nowrap { white-space: nowrap; }
95 |
96 | // Transformation
97 | .text-lowercase { text-transform: lowercase; }
98 | .text-uppercase { text-transform: uppercase; }
99 | .text-capitalize { text-transform: capitalize; }
100 |
101 | // Contextual colors
102 | .text-muted {
103 | color: @text-muted;
104 | }
105 | .text-primary {
106 | .text-emphasis-variant(@brand-primary);
107 | }
108 | .text-success {
109 | .text-emphasis-variant(@state-success-text);
110 | }
111 | .text-info {
112 | .text-emphasis-variant(@state-info-text);
113 | }
114 | .text-warning {
115 | .text-emphasis-variant(@state-warning-text);
116 | }
117 | .text-danger {
118 | .text-emphasis-variant(@state-danger-text);
119 | }
120 |
121 | // Contextual backgrounds
122 | // For now we'll leave these alongside the text classes until v4 when we can
123 | // safely shift things around (per SemVer rules).
124 | .bg-primary {
125 | // Given the contrast here, this is the only class to have its color inverted
126 | // automatically.
127 | color: #fff;
128 | .bg-variant(@brand-primary);
129 | }
130 | .bg-success {
131 | .bg-variant(@state-success-bg);
132 | }
133 | .bg-info {
134 | .bg-variant(@state-info-bg);
135 | }
136 | .bg-warning {
137 | .bg-variant(@state-warning-bg);
138 | }
139 | .bg-danger {
140 | .bg-variant(@state-danger-bg);
141 | }
142 |
143 |
144 | // Page header
145 | // -------------------------
146 |
147 | .page-header {
148 | padding-bottom: ((@line-height-computed / 2) - 1);
149 | margin: (@line-height-computed * 2) 0 @line-height-computed;
150 | border-bottom: 1px solid @page-header-border-color;
151 | }
152 |
153 |
154 | // Lists
155 | // -------------------------
156 |
157 | // Unordered and Ordered lists
158 | ul,
159 | ol {
160 | margin-top: 0;
161 | margin-bottom: (@line-height-computed / 2);
162 | ul,
163 | ol {
164 | margin-bottom: 0;
165 | }
166 | }
167 |
168 | // List options
169 |
170 | // Unstyled keeps list items block level, just removes default browser padding and list-style
171 | .list-unstyled {
172 | padding-left: 0;
173 | list-style: none;
174 | }
175 |
176 | // Inline turns list items into inline-block
177 | .list-inline {
178 | .list-unstyled();
179 | margin-left: -5px;
180 |
181 | > li {
182 | display: inline-block;
183 | padding-left: 5px;
184 | padding-right: 5px;
185 | }
186 | }
187 |
188 | // Description Lists
189 | dl {
190 | margin-top: 0; // Remove browser default
191 | margin-bottom: @line-height-computed;
192 | }
193 | dt,
194 | dd {
195 | line-height: @line-height-base;
196 | }
197 | dt {
198 | font-weight: bold;
199 | }
200 | dd {
201 | margin-left: 0; // Undo browser default
202 | }
203 |
204 | // Horizontal description lists
205 | //
206 | // Defaults to being stacked without any of the below styles applied, until the
207 | // grid breakpoint is reached (default of ~768px).
208 |
209 | .dl-horizontal {
210 | dd {
211 | &:extend(.clearfix all); // Clear the floated `dt` if an empty `dd` is present
212 | }
213 |
214 | @media (min-width: @grid-float-breakpoint) {
215 | dt {
216 | float: left;
217 | width: (@dl-horizontal-offset - 20);
218 | clear: left;
219 | text-align: right;
220 | .text-overflow();
221 | }
222 | dd {
223 | margin-left: @dl-horizontal-offset;
224 | }
225 | }
226 | }
227 |
228 |
229 | // Misc
230 | // -------------------------
231 |
232 | // Abbreviations and acronyms
233 | abbr[title],
234 | // Add data-* attribute to help out our tooltip plugin, per https://github.com/twbs/bootstrap/issues/5257
235 | abbr[data-original-title] {
236 | cursor: help;
237 | border-bottom: 1px dotted @abbr-border-color;
238 | }
239 | .initialism {
240 | font-size: 90%;
241 | .text-uppercase();
242 | }
243 |
244 | // Blockquotes
245 | blockquote {
246 | padding: (@line-height-computed / 2) @line-height-computed;
247 | margin: 0 0 @line-height-computed;
248 | font-size: @blockquote-font-size;
249 | border-left: 5px solid @blockquote-border-color;
250 |
251 | p,
252 | ul,
253 | ol {
254 | &:last-child {
255 | margin-bottom: 0;
256 | }
257 | }
258 |
259 | // Note: Deprecated small and .small as of v3.1.0
260 | // Context: https://github.com/twbs/bootstrap/issues/11660
261 | footer,
262 | small,
263 | .small {
264 | display: block;
265 | font-size: 80%; // back to default font-size
266 | line-height: @line-height-base;
267 | color: @blockquote-small-color;
268 |
269 | &:before {
270 | content: '\2014 \00A0'; // em dash, nbsp
271 | }
272 | }
273 | }
274 |
275 | // Opposite alignment of blockquote
276 | //
277 | // Heads up: `blockquote.pull-right` has been deprecated as of v3.1.0.
278 | .blockquote-reverse,
279 | blockquote.pull-right {
280 | padding-right: 15px;
281 | padding-left: 0;
282 | border-right: 5px solid @blockquote-border-color;
283 | border-left: 0;
284 | text-align: right;
285 |
286 | // Account for citation
287 | footer,
288 | small,
289 | .small {
290 | &:before { content: ''; }
291 | &:after {
292 | content: '\00A0 \2014'; // nbsp, em dash
293 | }
294 | }
295 | }
296 |
297 | // Addresses
298 | address {
299 | margin-bottom: @line-height-computed;
300 | font-style: normal;
301 | line-height: @line-height-base;
302 | }
303 |
--------------------------------------------------------------------------------
/app/styles/less/utilities.less:
--------------------------------------------------------------------------------
1 | //
2 | // Utility classes
3 | // --------------------------------------------------
4 |
5 |
6 | // Floats
7 | // -------------------------
8 |
9 | .clearfix {
10 | .clearfix();
11 | }
12 | .center-block {
13 | .center-block();
14 | }
15 | .pull-right {
16 | float: right !important;
17 | }
18 | .pull-left {
19 | float: left !important;
20 | }
21 |
22 |
23 | // Toggling content
24 | // -------------------------
25 |
26 | // Note: Deprecated .hide in favor of .hidden or .sr-only (as appropriate) in v3.0.1
27 | .hide {
28 | display: none !important;
29 | }
30 | .show {
31 | display: block !important;
32 | }
33 | .invisible {
34 | visibility: hidden;
35 | }
36 | .text-hide {
37 | .text-hide();
38 | }
39 |
40 |
41 | // Hide from screenreaders and browsers
42 | //
43 | // Credit: HTML5 Boilerplate
44 |
45 | .hidden {
46 | display: none !important;
47 | }
48 |
49 |
50 | // For Affix plugin
51 | // -------------------------
52 |
53 | .affix {
54 | position: fixed;
55 | }
56 |
--------------------------------------------------------------------------------
/app/styles/less/wells.less:
--------------------------------------------------------------------------------
1 | //
2 | // Wells
3 | // --------------------------------------------------
4 |
5 |
6 | // Base class
7 | .well {
8 | min-height: 20px;
9 | padding: 19px;
10 | margin-bottom: 20px;
11 | background-color: @well-bg;
12 | border: 1px solid @well-border;
13 | border-radius: @border-radius-base;
14 | .box-shadow(inset 0 1px 1px rgba(0,0,0,.05));
15 | blockquote {
16 | border-color: #ddd;
17 | border-color: rgba(0,0,0,.15);
18 | }
19 | }
20 |
21 | // Sizes
22 | .well-lg {
23 | padding: 24px;
24 | border-radius: @border-radius-large;
25 | }
26 | .well-sm {
27 | padding: 9px;
28 | border-radius: @border-radius-small;
29 | }
30 |
--------------------------------------------------------------------------------
/app/styles/main.less:
--------------------------------------------------------------------------------
1 | // wiredep-removed:bower:less
2 | // wiredep-removed:endbower
3 |
4 | @import "less/bootstrap.less";
5 | // Base
6 | @import "base.less";
7 |
8 | // Pages
9 | @import "pages/login.less";
10 | @import "pages/dashboard.less";
11 |
12 | // Widgets and Effects
13 | @import "widgets/input-underline.less";
14 | @import "widgets/checkbox.less";
15 | @import "../../bower_components/bootstrap-btn-outline-rounded/index.less";
16 | @import "transitions/all.less";
17 | @import "transitions/animations.less";
18 |
19 | // Other
20 | .browsehappy {
21 | margin: 0.2em 0;
22 | background: #ccc;
23 | color: #000;
24 | padding: 0.2em 0;
25 | }
26 |
27 | html,body {
28 | overflow: hidden;
29 | }
--------------------------------------------------------------------------------
/app/styles/pages/dashboard.less:
--------------------------------------------------------------------------------
1 | .dashboard-page {
2 |
3 | position: absolute;
4 | top: 0;
5 | left: 0;
6 | right: 0;
7 | bottom: 0;
8 |
9 | background: @brand-primary;
10 | color: white;
11 |
12 | /*
13 | * Base structure
14 | */
15 |
16 |
17 | /*
18 | * Global add-ons
19 | */
20 |
21 | .sub-header {
22 | padding-bottom: 10px;
23 | border-bottom: 1px solid #eee;
24 | }
25 |
26 | /*
27 | * Top navigation
28 | * Hide default border to remove 1px line.
29 | */
30 | .navbar-fixed-top {
31 | border: 0;
32 | }
33 |
34 |
35 | h2 {
36 | font-weight: 300;
37 | small {
38 | color: #fff;
39 | }
40 | }
41 |
42 |
43 | /*
44 | * Main content
45 | */
46 |
47 | .main {
48 | padding: 20px;
49 | position: absolute;
50 | top: 0px;
51 | bottom: 0px;
52 | overflow-x: hidden;
53 | overflow-y: auto;
54 | .jumbotron {
55 | background: inherit;
56 | margin-top: 20px;
57 | }
58 | }
59 | @media (min-width: 768px) {
60 | .main {
61 | padding-right: 40px;
62 | padding-left: 40px;
63 | }
64 | }
65 | .main .page-header {
66 | margin-top: 0;
67 | }
68 |
69 |
70 | /*
71 | * Placeholder dashboard ideas
72 | */
73 |
74 | .placeholders {
75 | margin-bottom: 30px;
76 | text-align: center;
77 | }
78 | .placeholders h4 {
79 | margin-bottom: 0;
80 | }
81 | .placeholder {
82 | margin-bottom: 20px;
83 | }
84 | .placeholder img {
85 | display: inline-block;
86 | border-radius: 50%;
87 | }
88 |
89 |
90 | .bg-fade {
91 | font-size: 500px;
92 | color: rgba(0,0,0,0.1);
93 | position: absolute;
94 | right: -100px;
95 | top: 180px;
96 | overflow: hidden;
97 | }
98 |
99 | .jumbotron {
100 | background: @brand-primary;
101 | }
102 | .fr {
103 | padding-left: 60px;
104 | }
105 |
106 | }
107 | .btn-white {
108 | border-color: white;
109 | border-radius: 0 !important;
110 | border: 3px solid;
111 | background: none;
112 | &:hover, &:focus {
113 | border-color: white;
114 | color: #797979;
115 | background: white;
116 | }
117 | }
118 | .snap-content, snap-content {
119 | overflow-x: hidden;
120 | }
121 | snap-content {
122 | background: @brand-primary;
123 | a {
124 | color: white;
125 | &:hover,&:active,&:focus {
126 | color: white;
127 | }
128 | }
129 | .menutoggle {
130 | .fa {
131 | position: absolute;
132 | left: 15px;
133 | top: 25px;
134 | }
135 | }
136 | }
137 | snap-drawer {
138 | background: darken(@brand-primary, 4%);
139 | a {
140 | color: white;
141 | &:hover,&:active,&:focus {
142 | color: white;
143 | }
144 | }
145 | .sidebar-header {
146 | margin-top: 40px;
147 | .sidebar-img {
148 | width: 140px;
149 | border: 3px solid white;
150 | }
151 | }
152 | ul.snap-ul {
153 | list-style-type: none;
154 | padding-left: 0px;
155 | margin-top: 20px;
156 | li.active {
157 | background: @brand-primary;
158 | }
159 | li {
160 | height: 40px;
161 | padding: 11px;
162 | padding-left: 28px;
163 | font-size: 13px;
164 | font-weight: 600;
165 | margin-bottom: 1px;
166 | &:hover {
167 | background: @brand-primary;
168 | }
169 | a {
170 | display: block;
171 | height: 35px;
172 | &:hover {
173 | text-decoration: none;
174 |
175 | }
176 | }
177 | }
178 | }
179 | }
180 | .bg-dark {
181 | background:#34495e;
182 | }
183 |
184 | * {
185 | a:hover {
186 | cursor: pointer;
187 | }
188 | }
--------------------------------------------------------------------------------
/app/styles/pages/login.less:
--------------------------------------------------------------------------------
1 | .login-page {
2 | overflow: auto;
3 | display: table;
4 | width: 100%;
5 | height: 100%;
6 | background: @brand-primary;
7 | color: #fff;
8 | padding: 3em;
9 | position: relative;
10 | &:before {
11 | content: '';
12 | background-color: rgba(255,255,255,0.15);
13 | position: absolute;
14 | left: 0;
15 | right: 0;
16 | top: 0;
17 | bottom: 0;
18 | width: 40%;
19 | border-right: solid 120px @brand-primary;
20 | }
21 |
22 | h1 {
23 | font-weight: 700;
24 | line-height: 32px;
25 | font-size: 34px;
26 | span {
27 | font-size: 27px;
28 | }
29 | small {
30 | color: #FFFFFF;
31 | opacity: 0.7;
32 | padding-right: 5px;
33 | font-size: 16px;
34 | display: block;
35 | margin-top: 8px;
36 | }
37 | }
38 |
39 | .form-group {
40 | padding: 8px 0;
41 | margin-bottom: 0;
42 | }
43 |
44 | .form-content {
45 | padding: 40px 0;
46 | }
47 | .user-avatar {
48 | max-width: 230px;
49 | width: 100%;
50 | border: 3px solid white;
51 | }
52 | .img-container, .form-content {
53 | display: table-cell;
54 | vertical-align: middle;
55 | padding: 15px;
56 | }
57 | .img-container {
58 | text-align: right;
59 | width: 40%;
60 | position: relative;
61 |
62 | }
63 | .form-content {
64 | position: relative;
65 | .pro-link {
66 | a {
67 | color: white;
68 | position: absolute;
69 | right: 0;
70 | top: 0;
71 | font-weight: 600;
72 | &:hover {
73 | text-decoration: none;
74 | }
75 | }
76 | }
77 | .table-form {
78 | display: table;
79 | width: 100%;
80 | .form-groups, .button-container {
81 | display: table-cell;
82 | vertical-align: middle;
83 | }
84 | .button-container {
85 | width: 100px;
86 | }
87 | }
88 | .bottom-75 {
89 | margin-bottom: 75px;
90 | max-width: 400px;
91 | }
92 | .input-lg {
93 | border-radius: 0;
94 | }
95 | .form-control {
96 | background: darken(@brand-primary, 3%);
97 | border-color: darken(@brand-primary, 3%);
98 | box-shadow: none;
99 | color: white;
100 | font-weight: 600;
101 | }
102 | ::-webkit-input-placeholder {
103 | color: rgba(255,255,255,0.7);
104 | font-weight: 700;
105 | font-size: 16px;
106 | padding-top: 2px;
107 | }
108 |
109 | :-moz-placeholder { /* Firefox 18- */
110 | color: rgba(255,255,255,0.7);
111 | font-weight: 700;
112 | font-size: 16px;
113 | padding-top: 2px;
114 | }
115 |
116 | ::-moz-placeholder { /* Firefox 19+ */
117 | color: rgba(255,255,255,0.7);
118 | font-weight: 700;
119 | font-size: 16px;
120 | padding-top: 2px;
121 | }
122 |
123 | :-ms-input-placeholder {
124 | color: rgba(255,255,255,0.7);
125 | font-weight: 700;
126 | font-size: 16px;
127 | padding-top: 2px;
128 | }
129 | .login {
130 | height: 110px;
131 | width: 100px;
132 | border-radius: 0;
133 | background: orange;
134 | border-color: orange;
135 | box-shadow: none;
136 | margin-left: 15px;
137 | color: white;
138 | &:focus {
139 | outline: none;
140 | outline-offset: none;
141 | }
142 | }
143 | }
144 | .remember {
145 | margin-top: 8px;
146 | .checkbox1 {
147 | padding-right: 5px;
148 | }
149 | span.pass {
150 | float: right;
151 | padding-top: 2px;
152 | }
153 | }
154 | }
155 |
156 | .user-avatar2 {
157 | width: 120px;
158 | border: 2px solid white;
159 | margin-bottom: 5px;
160 | }
161 | .login2 {
162 | height: 38px;
163 | border-radius: 0;
164 | width: 46px;
165 | margin-right: 12px;
166 | background: orange;
167 | border-color: orange;
168 | box-shadow: none;
169 | color: white;
170 | &:focus {
171 | outline: none;
172 | outline-offset: none;
173 | }
174 | &:hover {
175 | color: orange;
176 | background: white;
177 | border-color: white;
178 | }
179 | }
180 |
181 | @media (max-width: 768px) {
182 | .login-page {
183 | &:before {
184 | content: '';
185 | background-color: rgba(255,255,255,0.15);
186 | position: absolute;
187 | left: 0;
188 | right: 0;
189 | top: 0;
190 | // bottom: 0;
191 | width: 100%;
192 | border-right:none;
193 | }
194 | }
195 | .login-page, .img-content, .form-content {
196 | display: block !important;
197 | }
198 | .img-container {
199 | .pull-right {
200 | float: none !important;
201 | }
202 | .img-responsive {
203 | display: initial;
204 | }
205 | }
206 | .form-content {
207 |
208 | .remember {
209 | width: 100% !important;
210 | }
211 | }
212 | .pro-link {
213 | display: none !important;
214 | }
215 | .login-page .form-content .bottom-75 {
216 | margin: 0 auto;
217 | }
218 | .login-page {
219 | padding: 15px;
220 | }
221 | .login-page .img-container {
222 | display: block;
223 | width: 100%;
224 | }
225 | }
226 |
227 | @media (max-width: 400px) {
228 | .login-page .form-content .table-form {
229 | display: block;
230 | .form-groups, .button-container {
231 | display: block;
232 | width: 100%;
233 | .login {
234 | width: 100%;
235 | height: 46px;
236 | margin: 8px 0 0 0;
237 | img {
238 | max-width: 26px;
239 | }
240 | }
241 | }
242 | }
243 | .login-page .user-avatar {
244 | max-width: 200px;
245 | }
246 | }
247 |
248 |
--------------------------------------------------------------------------------
/app/styles/transitions/all.less:
--------------------------------------------------------------------------------
1 | @import "avatar.less";
2 | @import "pages.less";
--------------------------------------------------------------------------------
/app/styles/transitions/avatar.less:
--------------------------------------------------------------------------------
1 | .user-avatar {
2 | /* cursor: pointer;
3 | transition: all .2s ease-in-out;
4 | -webkit-transition: all .2s ease-in-out;
5 | &:hover {
6 | transform: scale(1.1);
7 | -webkit-transform: scale(1.1);
8 | }
9 | */
10 | }
--------------------------------------------------------------------------------
/app/styles/transitions/pages.less:
--------------------------------------------------------------------------------
1 | /* Have to set height explicity on ui-view
2 | to prevent collapsing during animation*/
3 | /*.well[ui-view]{
4 | height: 65px;
5 | }*/
6 |
7 | [ui-view] {
8 | position: absolute;
9 | left: 0;
10 | right: 0;
11 | bottom: 0;
12 | top: 0;
13 | }
14 |
15 | .ui-view-container {
16 | position: relative;
17 | }
18 |
19 |
20 |
21 | [ui-view].ng-leave {
22 | -webkit-animation: scaleDown .7s ease both;
23 | animation: scaleDown .7s ease both;
24 | }
25 | [ui-view].ng-enter {
26 | -webkit-animation: moveFromBottom .9s ease both;
27 | animation: moveFromBottom .9s ease both;
28 | }
29 |
30 |
31 |
32 | @-webkit-keyframes scaleDown {
33 | from { }
34 | to { opacity: 0; -webkit-transform: scale(.8); }
35 | }
36 | @keyframes scaleDown {
37 | from { }
38 | to { opacity: 0; -webkit-transform: scale(.8); transform: scale(.8); }
39 | }
40 |
41 | @-webkit-keyframes moveFromLeft {
42 | from { }
43 | to { -webkit-transform: translateX(-100%); }
44 | }
45 | @keyframes moveFromLeft {
46 | from { }
47 | to { -webkit-transform: translateX(-100%); transform: translateX(-100%); }
48 | }
--------------------------------------------------------------------------------
/app/styles/widgets/checkbox.less:
--------------------------------------------------------------------------------
1 | .checkbox1 {
2 | position: relative;
3 | padding-right: 15px;
4 | display: inline-block;
5 | vertical-align: middle;
6 | cursor: pointer;
7 |
8 | input[type=checkbox] {
9 | position: absolute;
10 | height: inherit;
11 | width: inherit;
12 | opacity: 0;
13 | left: 0;
14 | }
15 | span {
16 | cursor: pointer;
17 | position: relative;
18 | margin-right: 5px;
19 | display: inline-block;
20 | height: 20px;
21 | width: 20px;
22 | vertical-align: middle;
23 | &:before {
24 | position: absolute;
25 | top: 0;
26 | left: 0;
27 | right: 0;
28 | bottom: 0;
29 | content: " ";
30 | color: @brand-primary;
31 | text-align: center;
32 | font-size: 22px;
33 | border: solid 2px #ddd;
34 | line-height: 16px;
35 | }
36 | }
37 | }
38 | .checkbox1{
39 | input:checked + span:before {
40 | background: white;
41 | border-color: white;
42 | content: "\2713";
43 | }
44 | }
45 | .radio1 {
46 | position: relative;
47 | padding-right: 15px;
48 | display: inline-block;
49 | vertical-align: middle;
50 | cursor: pointer;
51 |
52 | input[type=radio] {
53 | position: absolute;
54 | height: inherit;
55 | width: inherit;
56 | opacity: 0;
57 | left: 0;
58 | }
59 | span {
60 | cursor: pointer;
61 | position: relative;
62 | margin-right: 5px;
63 | display: inline-block;
64 | height: 20px;
65 | width: 20px;
66 | vertical-align: middle;
67 | &:before {
68 | position: absolute;
69 | top: 0;
70 | left: 0;
71 | right: 0;
72 | bottom: 0;
73 | content: " ";
74 | color: #fff;
75 | text-align: center;
76 | font-size: 22px;
77 | border: solid 2px #ddd;
78 | line-height: 16px;
79 | border-radius: 30px;
80 | }
81 | }
82 | }
83 | .radio1{
84 | input:checked + span:before {
85 | height: 20px;
86 | width: 20px;
87 | background: @brand-primary;
88 | border-color: #ddd;
89 | // content: "\2713";
90 | }
91 | }
92 | table.white {
93 | tbody {
94 | color: white;
95 | }
96 | }
--------------------------------------------------------------------------------
/app/styles/widgets/input-underline.less:
--------------------------------------------------------------------------------
1 | .input-underline {
2 | background: none;
3 | border: none;
4 | box-shadow: none;
5 | border-bottom: 2px solid rgba(255, 255, 255, 0.4);
6 | color: #FFF;
7 | border-radius: 0;
8 |
9 | &::-moz-placeholder {
10 | color: rgba(255, 255, 255, 0.7);
11 | }
12 | &::-ms-input-placeholder {
13 | color: rgba(255, 255, 255, 0.7);
14 | }
15 | &::-webkit-input-placeholder {
16 | color: rgba(255, 255, 255, 0.7);
17 | }
18 |
19 | &:focus {
20 | border-bottom: 2px solid rgba(255, 255, 255, 1);
21 | box-shadow: none;
22 | }
23 |
24 | }
--------------------------------------------------------------------------------
/app/views/base.html:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/app/views/dashboard.html:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/app/views/dashboard/overview.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
11 |
12 |
13 |
14 |
Overview Why is Versatile Theme so awesome?
15 |
16 |
17 |
18 |
Welcome!
19 | I don't want to bloat this Versatile Theme Free Edition AngularJS Admin theme with a lot of plugins. To install plugins we have bower. Let's keep it real clean!
20 |
21 | Logout
22 |
23 |
24 |
25 |
26 |
27 |
28 |
--------------------------------------------------------------------------------
/app/views/dashboard/reports.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
10 |
11 |
12 |
13 |
Reports Work with Chart.js and D3
14 |
15 |
16 |
17 |
18 |
Add Charts here
19 |
You can use C3.js or Chart.js
20 |
21 | Back to Overview
22 |
23 |
24 |
25 |
26 |
27 |
--------------------------------------------------------------------------------
/app/views/login.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
VERSATILE DASHBOARD Free Version
6 |
7 |
8 |
9 |
39 |
40 |
--------------------------------------------------------------------------------
/app/views/main-content.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
Yeoman generator for AngularJS built with Gulp , Bootstrap and LESS
6 |
7 | Tasks
8 |
11 |
--------------------------------------------------------------------------------
/bower.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "yapp",
3 | "version": "0.0.0",
4 | "dependencies": {
5 | "angular": "^1.3.0",
6 | "json3": "^3.3.0",
7 | "es5-shim": "^4.0.0",
8 | "bootstrap": "^3.2.0",
9 | "angular-mocks": "~1.3.14",
10 | "ui-router": "~0.2.13",
11 | "bootstrap-btn-outline-rounded": "~0.0.3",
12 | "angular-animate": "~1.3.15",
13 | "components-font-awesome": "~4.3.0",
14 | "angular-snap": "~1.8.1"
15 | },
16 | "devDependencies": {
17 | "angular-mocks": "~1.3.0"
18 | },
19 | "resolutions": {
20 | "angular": "1.3.14"
21 | }
22 | }
23 |
--------------------------------------------------------------------------------
/dist/.DS_Store:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/start-angular/versatile-dashboard-theme/df56dc775568d567a51a5aa61a425d8ad1d07f62/dist/.DS_Store
--------------------------------------------------------------------------------
/dist/404.html:
--------------------------------------------------------------------------------
1 | Page Not Found :( Not found :( Sorry, but the page you were trying to view does not exist.
It looks like this was the result of either:
a mistyped address an out-of-date link
--------------------------------------------------------------------------------
/dist/favicon.ico:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/start-angular/versatile-dashboard-theme/df56dc775568d567a51a5aa61a425d8ad1d07f62/dist/favicon.ico
--------------------------------------------------------------------------------
/dist/fonts/fontawesome-webfont.eot:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/start-angular/versatile-dashboard-theme/df56dc775568d567a51a5aa61a425d8ad1d07f62/dist/fonts/fontawesome-webfont.eot
--------------------------------------------------------------------------------
/dist/fonts/fontawesome-webfont.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/start-angular/versatile-dashboard-theme/df56dc775568d567a51a5aa61a425d8ad1d07f62/dist/fonts/fontawesome-webfont.ttf
--------------------------------------------------------------------------------
/dist/fonts/fontawesome-webfont.woff:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/start-angular/versatile-dashboard-theme/df56dc775568d567a51a5aa61a425d8ad1d07f62/dist/fonts/fontawesome-webfont.woff
--------------------------------------------------------------------------------
/dist/fonts/fontawesome-webfont.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/start-angular/versatile-dashboard-theme/df56dc775568d567a51a5aa61a425d8ad1d07f62/dist/fonts/fontawesome-webfont.woff2
--------------------------------------------------------------------------------
/dist/fonts/glyphicons-halflings-regular.eot:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/start-angular/versatile-dashboard-theme/df56dc775568d567a51a5aa61a425d8ad1d07f62/dist/fonts/glyphicons-halflings-regular.eot
--------------------------------------------------------------------------------
/dist/fonts/glyphicons-halflings-regular.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/start-angular/versatile-dashboard-theme/df56dc775568d567a51a5aa61a425d8ad1d07f62/dist/fonts/glyphicons-halflings-regular.ttf
--------------------------------------------------------------------------------
/dist/fonts/glyphicons-halflings-regular.woff:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/start-angular/versatile-dashboard-theme/df56dc775568d567a51a5aa61a425d8ad1d07f62/dist/fonts/glyphicons-halflings-regular.woff
--------------------------------------------------------------------------------
/dist/fonts/glyphicons-halflings-regular.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/start-angular/versatile-dashboard-theme/df56dc775568d567a51a5aa61a425d8ad1d07f62/dist/fonts/glyphicons-halflings-regular.woff2
--------------------------------------------------------------------------------
/dist/images/arrow.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/start-angular/versatile-dashboard-theme/df56dc775568d567a51a5aa61a425d8ad1d07f62/dist/images/arrow.png
--------------------------------------------------------------------------------
/dist/images/flat-avatar.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/start-angular/versatile-dashboard-theme/df56dc775568d567a51a5aa61a425d8ad1d07f62/dist/images/flat-avatar.png
--------------------------------------------------------------------------------
/dist/index.html:
--------------------------------------------------------------------------------
1 | Versatile Metro-UI Angular Theme
--------------------------------------------------------------------------------
/dist/robots.txt:
--------------------------------------------------------------------------------
1 | # robotstxt.org
2 |
3 | User-agent: *
4 |
--------------------------------------------------------------------------------
/dist/scripts/scripts.js:
--------------------------------------------------------------------------------
1 | "use strict";angular.module("yapp",["ui.router","snap","ngAnimate"]).config(["$stateProvider","$urlRouterProvider",function(r,t){t.when("/dashboard","/dashboard/overview"),t.otherwise("/login"),r.state("base",{"abstract":!0,url:"",templateUrl:"views/base.html"}).state("login",{url:"/login",parent:"base",templateUrl:"views/login.html",controller:"LoginCtrl"}).state("dashboard",{url:"/dashboard",parent:"base",templateUrl:"views/dashboard.html",controller:"DashboardCtrl"}).state("overview",{url:"/overview",parent:"dashboard",templateUrl:"views/dashboard/overview.html"}).state("reports",{url:"/reports",parent:"dashboard",templateUrl:"views/dashboard/reports.html"})}]),angular.module("yapp").controller("LoginCtrl",["$scope","$location",function(r,t){r.submit=function(){return t.path("/dashboard"),!1}}]),angular.module("yapp").controller("DashboardCtrl",["$scope","$state",function(r,t){r.$state=t}]);
--------------------------------------------------------------------------------
/dist/views/base.html:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/dist/views/dashboard.html:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/dist/views/dashboard/overview.html:
--------------------------------------------------------------------------------
1 |
Overview Why is Versatile Theme so awesome? Welcome! I don't want to bloat this Versatile Theme Free Edition AngularJS Admin theme with a lot of plugins. To install plugins we have bower. Let's keep it real clean!
Logout
--------------------------------------------------------------------------------
/dist/views/dashboard/reports.html:
--------------------------------------------------------------------------------
1 |
Reports Work with Chart.js and D3
--------------------------------------------------------------------------------
/dist/views/login.html:
--------------------------------------------------------------------------------
1 | VERSATILE DASHBOARD Free Version
--------------------------------------------------------------------------------
/dist/views/main-content.html:
--------------------------------------------------------------------------------
1 | Tasks
--------------------------------------------------------------------------------
/examples/preview.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/start-angular/versatile-dashboard-theme/df56dc775568d567a51a5aa61a425d8ad1d07f62/examples/preview.png
--------------------------------------------------------------------------------
/gulpfile.js:
--------------------------------------------------------------------------------
1 | /* jshint node:true */
2 | 'use strict';
3 |
4 | var gulp = require('gulp');
5 | var karma = require('karma').server;
6 | var argv = require('yargs').argv;
7 | var $ = require('gulp-load-plugins')();
8 |
9 | gulp.task('styles', function() {
10 | return gulp.src('app/styles/main.less')
11 | .pipe($.plumber())
12 | .pipe($.less())
13 | .pipe($.autoprefixer({browsers: ['last 1 version']}))
14 | .pipe(gulp.dest('.tmp/styles'));
15 | });
16 |
17 | gulp.task('jshint', function() {
18 | return gulp.src('app/scripts/**/*.js')
19 | .pipe($.jshint())
20 | //.pipe($.jshint.reporter('jshint-stylish'))
21 | //.pipe($.jshint.reporter('fail'));
22 | });
23 |
24 | // gulp.task('jscs', function() {
25 | // return gulp.src('app/scripts/**/*.js')
26 | // .pipe($.jscs());
27 | // });
28 |
29 | gulp.task('html', ['styles'], function() {
30 | var lazypipe = require('lazypipe');
31 | var cssChannel = lazypipe()
32 | .pipe($.csso)
33 | .pipe($.replace, 'bower_components/bootstrap/fonts', 'fonts');
34 |
35 | var assets = $.useref.assets({searchPath: '{.tmp,app}'});
36 |
37 | return gulp.src('app/**/*.html')
38 | .pipe(assets)
39 | .pipe($.if('*.js', $.ngAnnotate()))
40 | .pipe($.if('*.js', $.uglify()))
41 | .pipe($.if('*.css', cssChannel()))
42 | .pipe(assets.restore())
43 | .pipe($.useref())
44 | .pipe($.if('*.html', $.htmlmin({collapseWhitespace: true})))
45 | .pipe(gulp.dest('dist'));
46 | });
47 |
48 | gulp.task('images', function() {
49 | return gulp.src('app/images/**/*')
50 | // .pipe($.cache($.imagemin({
51 | // progressive: true,
52 | // interlaced: true
53 | // })))
54 | .pipe(gulp.dest('dist/images'));
55 | });
56 |
57 | gulp.task('fonts', function() {
58 | return gulp.src(require('main-bower-files')().concat('app/fonts/**/*')
59 | .concat('bower_components/bootstrap/fonts/*'))
60 | .pipe($.filter('**/*.{eot,svg,ttf,woff,woff2}'))
61 | .pipe($.flatten())
62 | .pipe(gulp.dest('dist/fonts'))
63 | .pipe(gulp.dest('.tmp/fonts'));
64 | });
65 |
66 | gulp.task('extras', function() {
67 | return gulp.src([
68 | 'app/*.*',
69 | '!app/*.html',
70 | 'node_modules/apache-server-configs/dist/.htaccess'
71 | ], {
72 | dot: true
73 | }).pipe(gulp.dest('dist'));
74 | });
75 |
76 | gulp.task('clean', require('del').bind(null, ['.tmp', 'dist']));
77 |
78 | gulp.task('connect', ['styles'], function() {
79 | var serveStatic = require('serve-static');
80 | var serveIndex = require('serve-index');
81 | var app = require('connect')()
82 | .use(require('connect-livereload')({port: 35729}))
83 | .use(serveStatic('.tmp'))
84 | .use(serveStatic('app'))
85 | // paths to bower_components should be relative to the current file
86 | // e.g. in app/index.html you should use ../bower_components
87 | .use('/bower_components', serveStatic('bower_components'))
88 | .use(serveIndex('app'));
89 |
90 | require('http').createServer(app)
91 | .listen(8000)
92 | .on('listening', function() {
93 | console.log('Started connect web server on http://localhost:8000');
94 | });
95 | });
96 |
97 | gulp.task('serve', ['wiredep', 'connect', 'fonts', 'watch'], function() {
98 | if (argv.open) {
99 | require('opn')('http://localhost:8000');
100 | }
101 | });
102 |
103 | gulp.task('test', function(done) {
104 | karma.start({
105 | configFile: __dirname + '/test/karma.conf.js',
106 | singleRun: true
107 | }, done);
108 | });
109 |
110 | // inject bower components
111 | gulp.task('wiredep', function() {
112 | var wiredep = require('wiredep').stream;
113 | var exclude = [
114 | 'bootstrap',
115 | 'jquery',
116 | 'es5-shim',
117 | 'json3',
118 | 'angular-scenario'
119 | ];
120 |
121 | gulp.src('app/styles/*.less')
122 | .pipe(wiredep())
123 | .pipe(gulp.dest('app/styles'));
124 |
125 | gulp.src('app/*.html')
126 | .pipe(wiredep({exclude: exclude}))
127 | .pipe(gulp.dest('app'));
128 |
129 | gulp.src('test/*.js')
130 | .pipe(wiredep({exclude: exclude, devDependencies: true}))
131 | .pipe(gulp.dest('test'));
132 | });
133 |
134 | gulp.task('watch', ['connect'], function() {
135 | $.livereload.listen();
136 |
137 | // watch for changes
138 | gulp.watch([
139 | 'app/**/*.html',
140 | '.tmp/styles/**/*.css',
141 | 'app/scripts/**/*.js',
142 | 'app/images/**/*'
143 | ]).on('change', $.livereload.changed);
144 |
145 | gulp.watch('app/styles/**/*.less', ['styles']);
146 | gulp.watch('bower.json', ['wiredep']);
147 | });
148 |
149 | gulp.task('builddist', ['jshint', 'html', 'images', 'fonts', 'extras'],
150 | function() {
151 | return gulp.src('dist/**/*').pipe($.size({title: 'build', gzip: true}));
152 | });
153 |
154 | gulp.task('build', ['clean'], function() {
155 | gulp.start('builddist');
156 | });
157 |
158 | gulp.task('docs', [], function() {
159 | return gulp.src('app/scripts/**/**')
160 | .pipe($.ngdocs.process())
161 | .pipe(gulp.dest('./docs'));
162 | });
163 |
--------------------------------------------------------------------------------
/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "private": true,
3 | "engines": {
4 | "node": ">=0.10.0"
5 | },
6 | "scripts": {
7 | "test": "gulp test"
8 | },
9 | "devDependencies": {
10 | "apache-server-configs": "^2.11.0",
11 | "chai": "^2.1.0",
12 | "connect": "^3.3.4",
13 | "connect-livereload": "^0.5.3",
14 | "del": "^1.1.1",
15 | "gulp": "^3.8.11",
16 | "gulp-autoprefixer": "^2.1.0",
17 | "gulp-cache": "^0.2.8",
18 | "gulp-csso": "^1.0.0",
19 | "gulp-filter": "^2.0.2",
20 | "gulp-flatten": "^0.0.4",
21 | "gulp-if": "^1.2.5",
22 | "gulp-inject": "^1.2.0",
23 | "gulp-jscs": "^1.4.0",
24 | "gulp-jshint": "^1.9.2",
25 | "gulp-less": "^3.0.1",
26 | "gulp-livereload": "^3.8.0",
27 | "gulp-load-plugins": "^0.8.0",
28 | "gulp-ng-annotate": "^0.5.2",
29 | "gulp-ngdocs": "^0.2.10",
30 | "gulp-plumber": "^0.6.6",
31 | "gulp-rename": "^1.2.0",
32 | "gulp-replace": "^0.5.3",
33 | "gulp-size": "^1.2.1",
34 | "gulp-uglify": "^1.1.0",
35 | "gulp-useref": "^1.1.1",
36 | "jshint-stylish": "^1.0.1",
37 | "karma": "^0.12.31",
38 | "karma-jasmine": "^0.3.5",
39 | "karma-phantomjs-launcher": "^0.1.4",
40 | "lazypipe": "^0.2.2",
41 | "main-bower-files": "^2.5.0",
42 | "mocha": "^2.1.0",
43 | "mock-gulp-dest": "^0.1.1",
44 | "opn": "^1.0.1",
45 | "serve-index": "^1.6.2",
46 | "serve-static": "^1.9.1",
47 | "wiredep": "^2.2.2",
48 | "yargs": "^3.3.1",
49 | "gulp-htmlmin": "~1.3.0"
50 | },
51 | "dependencies": {}
52 | }
53 |
--------------------------------------------------------------------------------
/test/karma.conf.js:
--------------------------------------------------------------------------------
1 | // Karma configuration
2 | module.exports = function(config) {
3 | 'use strict';
4 |
5 | config.set({
6 | // enable / disable watching file and executing tests whenever any file changes
7 | autoWatch: true,
8 |
9 | // base path, that will be used to resolve files and exclude
10 | //basePath: '../',
11 |
12 | // testing framework to use (jasmine/mocha/qunit/...)
13 | frameworks: ['jasmine'],
14 |
15 | // list of files / patterns to load in the browser
16 | files: [
17 | // bower:js
18 | '../bower_components/angular/angular.js',
19 | '../bower_components/angular-mocks/angular-mocks.js',
20 | '../bower_components/ui-router/release/angular-ui-router.js',
21 | '../bower_components/angular-animate/angular-animate.js',
22 | '../bower_components/snapjs/snap.js',
23 | '../bower_components/angular-snap/angular-snap.js',
24 | // endbower
25 | '../app/scripts/**/*.js',
26 | //'../test/mock/**/*.js',
27 | '../test/spec/**/*.js'
28 | ],
29 |
30 | // list of files / patterns to exclude
31 | exclude: [
32 | ],
33 |
34 | // web server port
35 | port: 8080,
36 |
37 | // Start these browsers, currently available:
38 | // - Chrome
39 | // - ChromeCanary
40 | // - Firefox
41 | // - Opera
42 | // - Safari (only Mac)
43 | // - PhantomJS
44 | // - IE (only Windows)
45 | browsers: [
46 | 'PhantomJS'
47 | ],
48 |
49 | // Which plugins to enable
50 | plugins: [
51 | 'karma-phantomjs-launcher',
52 | 'karma-jasmine'
53 | ],
54 |
55 | // Continuous Integration mode
56 | // if true, it capture browsers, run tests and exit
57 | singleRun: false,
58 |
59 | colors: true,
60 |
61 | // level of logging
62 | // possible values: LOG_DISABLE || LOG_ERROR || LOG_WARN || LOG_INFO || LOG_DEBUG
63 | logLevel: config.LOG_INFO,
64 |
65 | // Uncomment the following lines if you are using grunt's server to run the tests
66 | // proxies: {
67 | // '/': 'http://localhost:9000/'
68 | // },
69 | // URL root prevent conflicts with the site root
70 | // urlRoot: '_karma_'
71 | });
72 | };
73 |
--------------------------------------------------------------------------------
/test/spec/controllers/main.js:
--------------------------------------------------------------------------------
1 | 'use strict';
2 |
3 | describe('Controller: MainCtrl', function() {
4 | // load the controller's module
5 | beforeEach(module('yapp'));
6 |
7 | var MainCtrl;
8 | var scope;
9 |
10 | // Initialize the controller and a mock scope
11 | beforeEach(inject(function($controller, $rootScope) {
12 | scope = $rootScope.$new();
13 | MainCtrl = $controller('MainCtrl', {
14 | $scope: scope
15 | });
16 | }));
17 |
18 | it('should attach a list of tasks', function() {
19 | expect(scope.tasks.length).toBe(8);
20 | });
21 | });
22 |
--------------------------------------------------------------------------------