.
8 | .list-group {
9 | // No need to set list-style: none; since .list-group-item is block level
10 | margin-bottom: 20px;
11 | padding-left: 0; // reset padding because ul and ol
12 | }
13 |
14 | // Individual list items
15 | // -------------------------
16 |
17 | .list-group-item {
18 | position: relative;
19 | display: block;
20 | padding: 10px 15px;
21 | // Place the border on the list items and negative margin up for better styling
22 | margin-bottom: -1px;
23 | background-color: @list-group-bg;
24 | border: 1px solid @list-group-border;
25 |
26 | // Round the first and last items
27 | &:first-child {
28 | .border-top-radius(@list-group-border-radius);
29 | }
30 | &:last-child {
31 | margin-bottom: 0;
32 | .border-bottom-radius(@list-group-border-radius);
33 | }
34 |
35 | // Align badges within list items
36 | > .badge {
37 | float: right;
38 | }
39 | > .badge + .badge {
40 | margin-right: 5px;
41 | }
42 |
43 | // Linked list items
44 | a& {
45 | color: @list-group-link-color;
46 |
47 | .list-group-item-heading {
48 | color: @list-group-link-heading-color;
49 | }
50 |
51 | // Hover state
52 | &:hover,
53 | &:focus {
54 | text-decoration: none;
55 | background-color: @list-group-hover-bg;
56 | }
57 | }
58 |
59 | // Active class on item itself, not parent
60 | &.active,
61 | &.active:hover,
62 | &.active:focus {
63 | z-index: 2; // Place active items above their siblings for proper border styling
64 | color: @list-group-active-color;
65 | background-color: @list-group-active-bg;
66 | border-color: @list-group-active-border;
67 |
68 | // Force color to inherit for custom content
69 | .list-group-item-heading {
70 | color: inherit;
71 | }
72 | .list-group-item-text {
73 | color: lighten(@list-group-active-bg, 40%);
74 | }
75 | }
76 | }
77 |
78 | // Custom content options
79 | // -------------------------
80 |
81 | .list-group-item-heading {
82 | margin-top: 0;
83 | margin-bottom: 5px;
84 | }
85 | .list-group-item-text {
86 | margin-bottom: 0;
87 | line-height: 1.3;
88 | }
89 |
--------------------------------------------------------------------------------
/static/css/less/media.less:
--------------------------------------------------------------------------------
1 | // Media objects
2 | // Source: http://stubbornella.org/content/?p=497
3 | // --------------------------------------------------
4 |
5 |
6 | // Common styles
7 | // -------------------------
8 |
9 | // Clear the floats
10 | .media,
11 | .media-body {
12 | overflow: hidden;
13 | zoom: 1;
14 | }
15 |
16 | // Proper spacing between instances of .media
17 | .media,
18 | .media .media {
19 | margin-top: 15px;
20 | }
21 | .media:first-child {
22 | margin-top: 0;
23 | }
24 |
25 | // For images and videos, set to block
26 | .media-object {
27 | display: block;
28 | }
29 |
30 | // Reset margins on headings for tighter default spacing
31 | .media-heading {
32 | margin: 0 0 5px;
33 | }
34 |
35 |
36 | // Media image alignment
37 | // -------------------------
38 |
39 | .media {
40 | > .pull-left {
41 | margin-right: 10px;
42 | }
43 | > .pull-right {
44 | margin-left: 10px;
45 | }
46 | }
47 |
48 |
49 | // Media list variation
50 | // -------------------------
51 |
52 | // Undo default ul/ol styles
53 | .media-list {
54 | padding-left: 0;
55 | list-style: none;
56 | }
57 |
--------------------------------------------------------------------------------
/static/css/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 | // Account for hiding of scrollbar
16 | body&,
17 | .navbar-fixed-top,
18 | .navbar-fixed-bottom {
19 | margin-right: 15px
20 | }
21 | }
22 |
23 | // Container that the modal scrolls within
24 | .modal {
25 | display: none;
26 | overflow: auto;
27 | overflow-y: scroll;
28 | position: fixed;
29 | top: 0;
30 | right: 0;
31 | bottom: 0;
32 | left: 0;
33 | z-index: @zindex-modal-background;
34 |
35 | // When fading in the modal, animate it to slide down
36 | &.fade .modal-dialog {
37 | .translate(0, -25%);
38 | .transition-transform(~"0.3s ease-out");
39 | }
40 | &.in .modal-dialog { .translate(0, 0)}
41 | }
42 |
43 | // Shell div to position the modal with bottom padding
44 | .modal-dialog {
45 | margin-left: auto;
46 | margin-right: auto;
47 | width: auto;
48 | padding: 10px;
49 | z-index: (@zindex-modal-background + 10);
50 | }
51 |
52 | // Actual modal
53 | .modal-content {
54 | position: relative;
55 | background-color: @modal-content-bg;
56 | border: 1px solid @modal-content-fallback-border-color; //old browsers fallback (ie8 etc)
57 | border: 1px solid @modal-content-border-color;
58 | border-radius: @border-radius-large;
59 | .box-shadow(0 3px 9px rgba(0,0,0,.5));
60 | background-clip: padding-box;
61 | // Remove focus outline from opened modal
62 | outline: none;
63 | }
64 |
65 | // Modal background
66 | .modal-backdrop {
67 | position: fixed;
68 | top: 0;
69 | right: 0;
70 | bottom: 0;
71 | left: 0;
72 | z-index: (@zindex-modal-background - 10);
73 | background-color: @modal-backdrop-bg;
74 | // Fade for backdrop
75 | &.fade { .opacity(0); }
76 | &.in { .opacity(.5); }
77 | }
78 |
79 | // Modal header
80 | // Top section of the modal w/ title and dismiss
81 | .modal-header {
82 | padding: @modal-title-padding;
83 | border-bottom: 1px solid @modal-header-border-color;
84 | min-height: (@modal-title-padding + @modal-title-line-height);
85 | }
86 | // Close icon
87 | .modal-header .close {
88 | margin-top: -2px;
89 | }
90 |
91 | // Title text within header
92 | .modal-title {
93 | margin: 0;
94 | line-height: @modal-title-line-height;
95 | }
96 |
97 | // Modal body
98 | // Where all modal content resides (sibling of .modal-header and .modal-footer)
99 | .modal-body {
100 | position: relative;
101 | padding: @modal-inner-padding;
102 | }
103 |
104 | // Footer (for actions)
105 | .modal-footer {
106 | margin-top: 15px;
107 | padding: (@modal-inner-padding - 1) @modal-inner-padding @modal-inner-padding;
108 | text-align: right; // right align buttons
109 | border-top: 1px solid @modal-footer-border-color;
110 | .clearfix(); // clear it in case folks use .pull-* classes on buttons
111 |
112 | // Properly space out buttons
113 | .btn + .btn {
114 | margin-left: 5px;
115 | margin-bottom: 0; // account for input[type="submit"] which gets the bottom margin like all other inputs
116 | }
117 | // but override that for button groups
118 | .btn-group .btn + .btn {
119 | margin-left: -1px;
120 | }
121 | // and override it for block buttons as well
122 | .btn-block + .btn-block {
123 | margin-left: 0;
124 | }
125 | }
126 |
127 | // Scale up the modal
128 | @media screen and (min-width: @screen-tablet) {
129 |
130 | .modal-dialog {
131 | left: 50%;
132 | right: auto;
133 | width: 600px;
134 | padding-top: 30px;
135 | padding-bottom: 30px;
136 | }
137 | .modal-content {
138 | .box-shadow(0 5px 15px rgba(0,0,0,.5));
139 | }
140 |
141 | }
142 |
--------------------------------------------------------------------------------
/static/css/less/navbar.less:
--------------------------------------------------------------------------------
1 | //
2 | // Navbars
3 | // --------------------------------------------------
4 |
5 |
6 | // Wrapper and base class
7 | //
8 | // Provide a static navbar from which we expand to create full-width, fixed, and
9 | // other navbar variations.
10 |
11 | .navbar {
12 | position: relative;
13 | z-index: @zindex-navbar;
14 | min-height: @navbar-height; // Ensure a navbar always shows (e.g., without a .navbar-brand in collapsed mode)
15 | margin-bottom: @navbar-margin-bottom;
16 | border: 1px solid transparent;
17 |
18 | // Prevent floats from breaking the navbar
19 | .clearfix();
20 |
21 | @media (min-width: @grid-float-breakpoint) {
22 | border-radius: @navbar-border-radius;
23 | }
24 | }
25 |
26 |
27 | // Navbar heading
28 | //
29 | // Groups `.navbar-brand` and `.navbar-toggle` into a single component for easy
30 | // styling of responsive aspects.
31 |
32 | .navbar-header {
33 | .clearfix();
34 |
35 | @media (min-width: @grid-float-breakpoint) {
36 | float: left;
37 | }
38 | }
39 |
40 |
41 | // Navbar collapse (body)
42 | //
43 | // Group your navbar content into this for easy collapsing and expanding across
44 | // various device sizes. By default, this content is collapsed when <768px, but
45 | // will expand past that for a horizontal display.
46 | //
47 | // To start (on mobile devices) the navbar links, forms, and buttons are stacked
48 | // vertically and include a `max-height` to overflow in case you have too much
49 | // content for the user's viewport.
50 |
51 | .navbar-collapse {
52 | max-height: 340px;
53 | overflow-x: visible;
54 | padding-right: @navbar-padding-horizontal;
55 | padding-left: @navbar-padding-horizontal;
56 | border-top: 1px solid transparent;
57 | box-shadow: inset 0 1px 0 rgba(255,255,255,.1);
58 | .clearfix();
59 | -webkit-overflow-scrolling: touch;
60 |
61 | &.in {
62 | overflow-y: auto;
63 | }
64 |
65 | @media (min-width: @grid-float-breakpoint) {
66 | width: auto;
67 | border-top: 0;
68 | box-shadow: none;
69 |
70 | &.collapse {
71 | display: block !important;
72 | height: auto !important;
73 | padding-bottom: 0; // Override default setting
74 | overflow: visible !important;
75 | }
76 |
77 | &.in {
78 | overflow-y: visible;
79 | }
80 |
81 | // Account for first and last children spacing
82 | .navbar-nav.navbar-left:first-child {
83 | margin-left: -@navbar-padding-horizontal;
84 | }
85 | .navbar-nav.navbar-right:last-child {
86 | margin-right: -@navbar-padding-horizontal;
87 | }
88 | .navbar-text:last-child {
89 | margin-right: 0;
90 | }
91 | }
92 | }
93 |
94 |
95 | // Both navbar header and collapse
96 | //
97 | // When a container is present, change the behavior of the header and collapse.
98 |
99 | .container > .navbar-header,
100 | .container > .navbar-collapse {
101 | margin-right: -@navbar-padding-horizontal;
102 | margin-left: -@navbar-padding-horizontal;
103 |
104 | @media (min-width: @grid-float-breakpoint) {
105 | margin-right: 0;
106 | margin-left: 0;
107 | }
108 | }
109 |
110 |
111 | //
112 | // Navbar alignment options
113 | //
114 | // Display the navbar across the entirity of the page or fixed it to the top or
115 | // bottom of the page.
116 |
117 | // Static top (unfixed, but 100% wide) navbar
118 | .navbar-static-top {
119 | border-width: 0 0 1px;
120 | @media (min-width: @grid-float-breakpoint) {
121 | border-radius: 0;
122 | }
123 | }
124 |
125 | // Fix the top/bottom navbars when screen real estate supports it
126 | .navbar-fixed-top,
127 | .navbar-fixed-bottom {
128 | position: fixed;
129 | right: 0;
130 | left: 0;
131 | border-width: 0 0 1px;
132 |
133 | // Undo the rounded corners
134 | @media (min-width: @grid-float-breakpoint) {
135 | border-radius: 0;
136 | }
137 | }
138 | .navbar-fixed-top {
139 | z-index: @zindex-navbar-fixed;
140 | top: 0;
141 | }
142 | .navbar-fixed-bottom {
143 | bottom: 0;
144 | margin-bottom: 0; // override .navbar defaults
145 | }
146 |
147 |
148 | // Brand/project name
149 |
150 | .navbar-brand {
151 | float: left;
152 | padding: @navbar-padding-vertical @navbar-padding-horizontal;
153 | font-size: @font-size-large;
154 | line-height: @line-height-computed;
155 | &:hover,
156 | &:focus {
157 | text-decoration: none;
158 | }
159 |
160 | @media (min-width: @grid-float-breakpoint) {
161 | .navbar > .container & {
162 | margin-left: -@navbar-padding-horizontal;
163 | }
164 | }
165 | }
166 |
167 |
168 | // Navbar toggle
169 | //
170 | // Custom button for toggling the `.navbar-collapse`, powered by the collapse
171 | // JavaScript plugin.
172 |
173 | .navbar-toggle {
174 | position: relative;
175 | float: right;
176 | margin-right: @navbar-padding-horizontal;
177 | padding: 9px 10px;
178 | .navbar-vertical-align(34px);
179 | background-color: transparent;
180 | border: 1px solid transparent;
181 | border-radius: @border-radius-base;
182 |
183 | // Bars
184 | .icon-bar {
185 | display: block;
186 | width: 22px;
187 | height: 2px;
188 | border-radius: 1px;
189 | }
190 | .icon-bar + .icon-bar {
191 | margin-top: 4px;
192 | }
193 |
194 | @media (min-width: @grid-float-breakpoint) {
195 | display: none;
196 | }
197 | }
198 |
199 |
200 | // Navbar nav links
201 | //
202 | // Builds on top of the `.nav` components with it's own modifier class to make
203 | // the nav the full height of the horizontal nav (above 768px).
204 |
205 | .navbar-nav {
206 | margin: (@navbar-padding-vertical / 2) -@navbar-padding-horizontal;
207 |
208 | > li > a {
209 | padding-top: 10px;
210 | padding-bottom: 10px;
211 | line-height: @line-height-computed;
212 | }
213 |
214 | @media (max-width: @screen-xs-max) {
215 | // Dropdowns get custom display when collapsed
216 | .open .dropdown-menu {
217 | position: static;
218 | float: none;
219 | width: auto;
220 | margin-top: 0;
221 | background-color: transparent;
222 | border: 0;
223 | box-shadow: none;
224 | > li > a,
225 | .dropdown-header {
226 | padding: 5px 15px 5px 25px;
227 | }
228 | > li > a {
229 | line-height: @line-height-computed;
230 | &:hover,
231 | &:focus {
232 | background-image: none;
233 | }
234 | }
235 | }
236 | }
237 |
238 | // Uncollapse the nav
239 | @media (min-width: @grid-float-breakpoint) {
240 | float: left;
241 | margin: 0;
242 |
243 | > li {
244 | float: left;
245 | > a {
246 | padding-top: ((@navbar-height - @line-height-computed) / 2);
247 | padding-bottom: ((@navbar-height - @line-height-computed) / 2);
248 | }
249 | }
250 | }
251 |
252 | }
253 |
254 |
255 | // Component alignment
256 | //
257 | // Repurpose the pull utilities as their own navbar utilities to avoid specifity
258 | // issues with parents and chaining. Only do this when the navbar is uncollapsed
259 | // though so that navbar contents properly stack and align in mobile.
260 |
261 | @media (min-width: @grid-float-breakpoint) {
262 | .navbar-left { .pull-left(); }
263 | .navbar-right { .pull-right(); }
264 | }
265 |
266 |
267 | // Navbar form
268 | //
269 | // Extension of the `.form-inline` with some extra flavor for optimum display in
270 | // our navbars.
271 |
272 | .navbar-form {
273 | margin-left: -@navbar-padding-horizontal;
274 | margin-right: -@navbar-padding-horizontal;
275 | padding: 10px @navbar-padding-horizontal;
276 | border-top: 1px solid transparent;
277 | border-bottom: 1px solid transparent;
278 | @shadow: inset 0 1px 0 rgba(255,255,255,.1), 0 1px 0 rgba(255,255,255,.1);
279 | .box-shadow(@shadow);
280 |
281 | // Mixin behavior for optimum display
282 | .form-inline();
283 |
284 | .form-group {
285 | @media (max-width: @screen-xs-max) {
286 | margin-bottom: 5px;
287 | }
288 | }
289 |
290 | // Vertically center in expanded, horizontal navbar
291 | .navbar-vertical-align(@input-height-base);
292 |
293 | // Undo 100% width for pull classes
294 | @media (min-width: @grid-float-breakpoint) {
295 | width: auto;
296 | border: 0;
297 | margin-left: 0;
298 | margin-right: 0;
299 | padding-top: 0;
300 | padding-bottom: 0;
301 | .box-shadow(none);
302 | }
303 | }
304 |
305 |
306 | // Dropdown menus
307 |
308 | // Menu position and menu carets
309 | .navbar-nav > li > .dropdown-menu {
310 | margin-top: 0;
311 | .border-top-radius(0);
312 | }
313 | // Menu position and menu caret support for dropups via extra dropup class
314 | .navbar-fixed-bottom .navbar-nav > li > .dropdown-menu {
315 | .border-bottom-radius(0);
316 | }
317 |
318 | // Right aligned menus need alt position
319 | .navbar-nav.pull-right > li > .dropdown-menu,
320 | .navbar-nav > li > .dropdown-menu.pull-right {
321 | left: auto;
322 | right: 0;
323 | }
324 |
325 |
326 | // Buttons in navbars
327 | //
328 | // Vertically center a button within a navbar (when *not* in a form).
329 |
330 | .navbar-btn {
331 | .navbar-vertical-align(@input-height-base);
332 | }
333 |
334 |
335 | // Text in navbars
336 | //
337 | // Add a class to make any element properly align itself vertically within the navbars.
338 |
339 | .navbar-text {
340 | float: left;
341 | .navbar-vertical-align(@line-height-computed);
342 |
343 | @media (min-width: @grid-float-breakpoint) {
344 | margin-left: @navbar-padding-horizontal;
345 | margin-right: @navbar-padding-horizontal;
346 | }
347 | }
348 |
349 | // Alternate navbars
350 | // --------------------------------------------------
351 |
352 | // Default navbar
353 | .navbar-default {
354 | background-color: @navbar-default-bg;
355 | border-color: @navbar-default-border;
356 |
357 | .navbar-brand {
358 | color: @navbar-default-brand-color;
359 | &:hover,
360 | &:focus {
361 | color: @navbar-default-brand-hover-color;
362 | background-color: @navbar-default-brand-hover-bg;
363 | }
364 | }
365 |
366 | .navbar-text {
367 | color: @navbar-default-color;
368 | }
369 |
370 | .navbar-nav {
371 | > li > a {
372 | color: @navbar-default-link-color;
373 |
374 | &:hover,
375 | &:focus {
376 | color: @navbar-default-link-hover-color;
377 | background-color: @navbar-default-link-hover-bg;
378 | }
379 | }
380 | > .active > a {
381 | &,
382 | &:hover,
383 | &:focus {
384 | color: @navbar-default-link-active-color;
385 | background-color: @navbar-default-link-active-bg;
386 | }
387 | }
388 | > .disabled > a {
389 | &,
390 | &:hover,
391 | &:focus {
392 | color: @navbar-default-link-disabled-color;
393 | background-color: @navbar-default-link-disabled-bg;
394 | }
395 | }
396 | }
397 |
398 | .navbar-toggle {
399 | border-color: @navbar-default-toggle-border-color;
400 | &:hover,
401 | &:focus {
402 | background-color: @navbar-default-toggle-hover-bg;
403 | }
404 | .icon-bar {
405 | background-color: @navbar-default-toggle-icon-bar-bg;
406 | }
407 | }
408 |
409 | .navbar-collapse,
410 | .navbar-form {
411 | border-color: darken(@navbar-default-bg, 7%);
412 | }
413 |
414 | // Dropdown menu items and carets
415 | .navbar-nav {
416 | // Caret should match text color on hover
417 | > .dropdown > a:hover .caret,
418 | > .dropdown > a:focus .caret {
419 | border-top-color: @navbar-default-link-hover-color;
420 | border-bottom-color: @navbar-default-link-hover-color;
421 | }
422 |
423 | // Remove background color from open dropdown
424 | > .open > a {
425 | &,
426 | &:hover,
427 | &:focus {
428 | background-color: @navbar-default-link-active-bg;
429 | color: @navbar-default-link-active-color;
430 | .caret {
431 | border-top-color: @navbar-default-link-active-color;
432 | border-bottom-color: @navbar-default-link-active-color;
433 | }
434 | }
435 | }
436 | > .dropdown > a .caret {
437 | border-top-color: @navbar-default-link-color;
438 | border-bottom-color: @navbar-default-link-color;
439 | }
440 |
441 |
442 | @media (max-width: @screen-xs-max) {
443 | // Dropdowns get custom display when collapsed
444 | .open .dropdown-menu {
445 | > li > a {
446 | color: @navbar-default-link-color;
447 | &:hover,
448 | &:focus {
449 | color: @navbar-default-link-hover-color;
450 | background-color: @navbar-default-link-hover-bg;
451 | }
452 | }
453 | > .active > a {
454 | &,
455 | &:hover,
456 | &:focus {
457 | color: @navbar-default-link-active-color;
458 | background-color: @navbar-default-link-active-bg;
459 | }
460 | }
461 | > .disabled > a {
462 | &,
463 | &:hover,
464 | &:focus {
465 | color: @navbar-default-link-disabled-color;
466 | background-color: @navbar-default-link-disabled-bg;
467 | }
468 | }
469 | }
470 | }
471 | }
472 |
473 |
474 | // Links in navbars
475 | //
476 | // Add a class to ensure links outside the navbar nav are colored correctly.
477 |
478 | .navbar-link {
479 | color: @navbar-default-link-color;
480 | &:hover {
481 | color: @navbar-default-link-hover-color;
482 | }
483 | }
484 |
485 | }
486 |
487 | // Inverse navbar
488 |
489 | .navbar-inverse {
490 | background-color: @navbar-inverse-bg;
491 | border-color: @navbar-inverse-border;
492 |
493 | .navbar-brand {
494 | color: @navbar-inverse-brand-color;
495 | &:hover,
496 | &:focus {
497 | color: @navbar-inverse-brand-hover-color;
498 | background-color: @navbar-inverse-brand-hover-bg;
499 | }
500 | }
501 |
502 | .navbar-text {
503 | color: @navbar-inverse-color;
504 | }
505 |
506 | .navbar-nav {
507 | > li > a {
508 | color: @navbar-inverse-link-color;
509 |
510 | &:hover,
511 | &:focus {
512 | color: @navbar-inverse-link-hover-color;
513 | background-color: @navbar-inverse-link-hover-bg;
514 | }
515 | }
516 | > .active > a {
517 | &,
518 | &:hover,
519 | &:focus {
520 | color: @navbar-inverse-link-active-color;
521 | background-color: @navbar-inverse-link-active-bg;
522 | }
523 | }
524 | > .disabled > a {
525 | &,
526 | &:hover,
527 | &:focus {
528 | color: @navbar-inverse-link-disabled-color;
529 | background-color: @navbar-inverse-link-disabled-bg;
530 | }
531 | }
532 | }
533 |
534 | // Darken the responsive nav toggle
535 | .navbar-toggle {
536 | border-color: @navbar-inverse-toggle-border-color;
537 | &:hover,
538 | &:focus {
539 | background-color: @navbar-inverse-toggle-hover-bg;
540 | }
541 | .icon-bar {
542 | background-color: @navbar-inverse-toggle-icon-bar-bg;
543 | }
544 | }
545 |
546 | .navbar-collapse,
547 | .navbar-form {
548 | border-color: darken(@navbar-inverse-bg, 7%);
549 | }
550 |
551 | // Dropdowns
552 | .navbar-nav {
553 | > .open > a {
554 | &,
555 | &:hover,
556 | &:focus {
557 | background-color: @navbar-inverse-link-active-bg;
558 | color: @navbar-inverse-link-active-color;
559 | }
560 | }
561 | > .dropdown > a:hover .caret {
562 | border-top-color: @navbar-inverse-link-hover-color;
563 | border-bottom-color: @navbar-inverse-link-hover-color;
564 | }
565 | > .dropdown > a .caret {
566 | border-top-color: @navbar-inverse-link-color;
567 | border-bottom-color: @navbar-inverse-link-color;
568 | }
569 | > .open > a {
570 | &,
571 | &:hover,
572 | &:focus {
573 | .caret {
574 | border-top-color: @navbar-inverse-link-active-color;
575 | border-bottom-color: @navbar-inverse-link-active-color;
576 | }
577 | }
578 | }
579 |
580 | @media (max-width: @screen-xs-max) {
581 | // Dropdowns get custom display
582 | .open .dropdown-menu {
583 | > .dropdown-header {
584 | border-color: @navbar-inverse-border;
585 | }
586 | > li > a {
587 | color: @navbar-inverse-link-color;
588 | &:hover,
589 | &:focus {
590 | color: @navbar-inverse-link-hover-color;
591 | background-color: @navbar-inverse-link-hover-bg;
592 | }
593 | }
594 | > .active > a {
595 | &,
596 | &:hover,
597 | &:focus {
598 | color: @navbar-inverse-link-active-color;
599 | background-color: @navbar-inverse-link-active-bg;
600 | }
601 | }
602 | > .disabled > a {
603 | &,
604 | &:hover,
605 | &:focus {
606 | color: @navbar-inverse-link-disabled-color;
607 | background-color: @navbar-inverse-link-disabled-bg;
608 | }
609 | }
610 | }
611 | }
612 | }
613 |
614 | .navbar-link {
615 | color: @navbar-inverse-link-color;
616 | &:hover {
617 | color: @navbar-inverse-link-hover-color;
618 | }
619 | }
620 |
621 | }
622 |
--------------------------------------------------------------------------------
/static/css/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 | .clearfix();
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: not-allowed;
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 | // Dividers (basically an hr) within the dropdown
55 | .nav-divider {
56 | .nav-divider();
57 | }
58 |
59 | // Prevent IE8 from misplacing imgs
60 | // See https://github.com/h5bp/html5-boilerplate/issues/984#issuecomment-3985989
61 | > li > a > img {
62 | max-width: none;
63 | }
64 | }
65 |
66 |
67 | // Tabs
68 | // -------------------------
69 |
70 | // Give the tabs something to sit on
71 | .nav-tabs {
72 | border-bottom: 1px solid @nav-tabs-border-color;
73 | > li {
74 | float: left;
75 | // Make the list-items overlay the bottom border
76 | margin-bottom: -1px;
77 |
78 | // Actual tabs (as links)
79 | > a {
80 | margin-right: 2px;
81 | line-height: @line-height-base;
82 | border: 1px solid transparent;
83 | border-radius: @border-radius-base @border-radius-base 0 0;
84 | &:hover {
85 | border-color: @nav-tabs-link-hover-border-color @nav-tabs-link-hover-border-color @nav-tabs-border-color;
86 | }
87 | }
88 |
89 | // Active state, and it's :hover to override normal :hover
90 | &.active > a {
91 | &,
92 | &:hover,
93 | &:focus {
94 | color: @nav-tabs-active-link-hover-color;
95 | background-color: @nav-tabs-active-link-hover-bg;
96 | border: 1px solid @nav-tabs-active-link-hover-border-color;
97 | border-bottom-color: transparent;
98 | cursor: default;
99 | }
100 | }
101 | }
102 | // pulling this in mainly for less shorthand
103 | &.nav-justified {
104 | .nav-justified();
105 | .nav-tabs-justified();
106 | }
107 | }
108 |
109 |
110 | // Pills
111 | // -------------------------
112 | .nav-pills {
113 | > li {
114 | float: left;
115 |
116 | // Links rendered as pills
117 | > a {
118 | border-radius: 5px;
119 | }
120 | + li {
121 | margin-left: 2px;
122 | }
123 |
124 | // Active state
125 | &.active > a {
126 | &,
127 | &:hover,
128 | &:focus {
129 | color: @nav-pills-active-link-hover-color;
130 | background-color: @nav-pills-active-link-hover-bg;
131 | }
132 | }
133 | }
134 | }
135 |
136 |
137 | // Stacked pills
138 | .nav-stacked {
139 | > li {
140 | float: none;
141 | + li {
142 | margin-top: 2px;
143 | margin-left: 0; // no need for this gap between nav items
144 | }
145 | }
146 | }
147 |
148 |
149 | // Nav variations
150 | // --------------------------------------------------
151 |
152 | // Justified nav links
153 | // -------------------------
154 |
155 | .nav-justified {
156 | width: 100%;
157 |
158 | > li {
159 | float: none;
160 | > a {
161 | text-align: center;
162 | }
163 | }
164 |
165 | @media (min-width: @screen-sm) {
166 | > li {
167 | display: table-cell;
168 | width: 1%;
169 | }
170 | }
171 | }
172 |
173 | // Move borders to anchors instead of bottom of list
174 | .nav-tabs-justified {
175 | border-bottom: 0;
176 | > li > a {
177 | border-bottom: 1px solid @nav-tabs-justified-link-border-color;
178 |
179 | // Override margin from .nav-tabs
180 | margin-right: 0;
181 | }
182 | > .active > a {
183 | border-bottom-color: @nav-tabs-justified-active-link-border-color;
184 | }
185 | }
186 |
187 |
188 | // Tabbable tabs
189 | // -------------------------
190 |
191 | // Clear any floats
192 | .tabbable {
193 | .clearfix();
194 | }
195 |
196 | // Show/hide tabbable areas
197 | .tab-content > .tab-pane,
198 | .pill-content > .pill-pane {
199 | display: none;
200 | }
201 | .tab-content,
202 | .pill-content {
203 | > .active {
204 | display: block;
205 | }
206 | }
207 |
208 |
209 |
210 | // Dropdowns
211 | // -------------------------
212 |
213 | // Make dropdown carets use link color in navs
214 | .nav .caret {
215 | border-top-color: @link-color;
216 | border-bottom-color: @link-color;
217 | }
218 | .nav a:hover .caret {
219 | border-top-color: @link-hover-color;
220 | border-bottom-color: @link-hover-color;
221 | }
222 |
223 | // Specific dropdowns
224 | .nav-tabs .dropdown-menu {
225 | // make dropdown border overlap tab border
226 | margin-top: -1px;
227 | // Remove the top rounded corners here since there is a hard edge above the menu
228 | .border-top-radius(0);
229 | }
230 |
--------------------------------------------------------------------------------
/static/css/less/normalize.less:
--------------------------------------------------------------------------------
1 | /*! normalize.css v2.1.0 | MIT License | git.io/normalize */
2 |
3 | // ==========================================================================
4 | // HTML5 display definitions
5 | // ==========================================================================
6 |
7 | //
8 | // Correct `block` display not defined in IE 8/9.
9 | //
10 |
11 | article,
12 | aside,
13 | details,
14 | figcaption,
15 | figure,
16 | footer,
17 | header,
18 | hgroup,
19 | main,
20 | nav,
21 | section,
22 | summary {
23 | display: block;
24 | }
25 |
26 | //
27 | // Correct `inline-block` display not defined in IE 8/9.
28 | //
29 |
30 | audio,
31 | canvas,
32 | video {
33 | display: inline-block;
34 | }
35 |
36 | //
37 | // Prevent modern browsers from displaying `audio` without controls.
38 | // Remove excess height in iOS 5 devices.
39 | //
40 |
41 | audio:not([controls]) {
42 | display: none;
43 | height: 0;
44 | }
45 |
46 | //
47 | // Address styling not present in IE 8/9.
48 | //
49 |
50 | [hidden] {
51 | display: none;
52 | }
53 |
54 | // ==========================================================================
55 | // Base
56 | // ==========================================================================
57 |
58 | //
59 | // 1. Set default font family to sans-serif.
60 | // 2. Prevent iOS text size adjust after orientation change, without disabling
61 | // user zoom.
62 | //
63 |
64 | html {
65 | font-family: sans-serif; // 1
66 | -webkit-text-size-adjust: 100%; // 2
67 | -ms-text-size-adjust: 100%; // 2
68 | }
69 |
70 | //
71 | // Remove default margin.
72 | //
73 |
74 | body {
75 | margin: 0;
76 | }
77 |
78 | // ==========================================================================
79 | // Links
80 | // ==========================================================================
81 |
82 | //
83 | // Address `outline` inconsistency between Chrome and other browsers.
84 | //
85 |
86 | a:focus {
87 | outline: thin dotted;
88 | }
89 |
90 | //
91 | // Improve readability when focused and also mouse hovered in all browsers.
92 | //
93 |
94 | a:active,
95 | a:hover {
96 | outline: 0;
97 | }
98 |
99 | // ==========================================================================
100 | // Typography
101 | // ==========================================================================
102 |
103 | //
104 | // Address variable `h1` font-size and margin within `section` and `article`
105 | // contexts in Firefox 4+, Safari 5, and Chrome.
106 | //
107 |
108 | h1 {
109 | font-size: 2em;
110 | margin: 0.67em 0;
111 | }
112 |
113 | //
114 | // Address styling not present in IE 8/9, Safari 5, and Chrome.
115 | //
116 |
117 | abbr[title] {
118 | border-bottom: 1px dotted;
119 | }
120 |
121 | //
122 | // Address style set to `bolder` in Firefox 4+, Safari 5, and Chrome.
123 | //
124 |
125 | b,
126 | strong {
127 | font-weight: bold;
128 | }
129 |
130 | //
131 | // Address styling not present in Safari 5 and Chrome.
132 | //
133 |
134 | dfn {
135 | font-style: italic;
136 | }
137 |
138 | //
139 | // Address differences between Firefox and other browsers.
140 | //
141 |
142 | hr {
143 | -moz-box-sizing: content-box;
144 | box-sizing: content-box;
145 | height: 0;
146 | }
147 |
148 | //
149 | // Address styling not present in IE 8/9.
150 | //
151 |
152 | mark {
153 | background: #ff0;
154 | color: #000;
155 | }
156 |
157 | //
158 | // Correct font family set oddly in Safari 5 and Chrome.
159 | //
160 |
161 | code,
162 | kbd,
163 | pre,
164 | samp {
165 | font-family: monospace, serif;
166 | font-size: 1em;
167 | }
168 |
169 | //
170 | // Improve readability of pre-formatted text in all browsers.
171 | //
172 |
173 | pre {
174 | white-space: pre-wrap;
175 | }
176 |
177 | //
178 | // Set consistent quote types.
179 | //
180 |
181 | q {
182 | quotes: "\201C" "\201D" "\2018" "\2019";
183 | }
184 |
185 | //
186 | // Address inconsistent and variable font size in all browsers.
187 | //
188 |
189 | small {
190 | font-size: 80%;
191 | }
192 |
193 | //
194 | // Prevent `sub` and `sup` affecting `line-height` in all browsers.
195 | //
196 |
197 | sub,
198 | sup {
199 | font-size: 75%;
200 | line-height: 0;
201 | position: relative;
202 | vertical-align: baseline;
203 | }
204 |
205 | sup {
206 | top: -0.5em;
207 | }
208 |
209 | sub {
210 | bottom: -0.25em;
211 | }
212 |
213 | // ==========================================================================
214 | // Embedded content
215 | // ==========================================================================
216 |
217 | //
218 | // Remove border when inside `a` element in IE 8/9.
219 | //
220 |
221 | img {
222 | border: 0;
223 | }
224 |
225 | //
226 | // Correct overflow displayed oddly in IE 9.
227 | //
228 |
229 | svg:not(:root) {
230 | overflow: hidden;
231 | }
232 |
233 | // ==========================================================================
234 | // Figures
235 | // ==========================================================================
236 |
237 | //
238 | // Address margin not present in IE 8/9 and Safari 5.
239 | //
240 |
241 | figure {
242 | margin: 0;
243 | }
244 |
245 | // ==========================================================================
246 | // Forms
247 | // ==========================================================================
248 |
249 | //
250 | // Define consistent border, margin, and padding.
251 | //
252 |
253 | fieldset {
254 | border: 1px solid #c0c0c0;
255 | margin: 0 2px;
256 | padding: 0.35em 0.625em 0.75em;
257 | }
258 |
259 | //
260 | // 1. Correct `color` not being inherited in IE 8/9.
261 | // 2. Remove padding so people aren't caught out if they zero out fieldsets.
262 | //
263 |
264 | legend {
265 | border: 0; // 1
266 | padding: 0; // 2
267 | }
268 |
269 | //
270 | // 1. Correct font family not being inherited in all browsers.
271 | // 2. Correct font size not being inherited in all browsers.
272 | // 3. Address margins set differently in Firefox 4+, Safari 5, and Chrome.
273 | //
274 |
275 | button,
276 | input,
277 | select,
278 | textarea {
279 | font-family: inherit; // 1
280 | font-size: 100%; // 2
281 | margin: 0; // 3
282 | }
283 |
284 | //
285 | // Address Firefox 4+ setting `line-height` on `input` using `!important` in
286 | // the UA stylesheet.
287 | //
288 |
289 | button,
290 | input {
291 | line-height: normal;
292 | }
293 |
294 | //
295 | // Address inconsistent `text-transform` inheritance for `button` and `select`.
296 | // All other form control elements do not inherit `text-transform` values.
297 | // Correct `button` style inheritance in Chrome, Safari 5+, and IE 8+.
298 | // Correct `select` style inheritance in Firefox 4+ and Opera.
299 | //
300 |
301 | button,
302 | select {
303 | text-transform: none;
304 | }
305 |
306 | //
307 | // 1. Avoid the WebKit bug in Android 4.0.* where (2) destroys native `audio`
308 | // and `video` controls.
309 | // 2. Correct inability to style clickable `input` types in iOS.
310 | // 3. Improve usability and consistency of cursor style between image-type
311 | // `input` and others.
312 | //
313 |
314 | button,
315 | html input[type="button"], // 1
316 | input[type="reset"],
317 | input[type="submit"] {
318 | -webkit-appearance: button; // 2
319 | cursor: pointer; // 3
320 | }
321 |
322 | //
323 | // Re-set default cursor for disabled elements.
324 | //
325 |
326 | button[disabled],
327 | html input[disabled] {
328 | cursor: default;
329 | }
330 |
331 | //
332 | // 1. Address box sizing set to `content-box` in IE 8/9.
333 | // 2. Remove excess padding in IE 8/9.
334 | //
335 |
336 | input[type="checkbox"],
337 | input[type="radio"] {
338 | box-sizing: border-box; // 1
339 | padding: 0; // 2
340 | }
341 |
342 | //
343 | // 1. Address `appearance` set to `searchfield` in Safari 5 and Chrome.
344 | // 2. Address `box-sizing` set to `border-box` in Safari 5 and Chrome
345 | // (include `-moz` to future-proof).
346 | //
347 |
348 | input[type="search"] {
349 | -webkit-appearance: textfield; // 1
350 | -moz-box-sizing: content-box;
351 | -webkit-box-sizing: content-box; // 2
352 | box-sizing: content-box;
353 | }
354 |
355 | //
356 | // Remove inner padding and search cancel button in Safari 5 and Chrome
357 | // on OS X.
358 | //
359 |
360 | input[type="search"]::-webkit-search-cancel-button,
361 | input[type="search"]::-webkit-search-decoration {
362 | -webkit-appearance: none;
363 | }
364 |
365 | //
366 | // Remove inner padding and border in Firefox 4+.
367 | //
368 |
369 | button::-moz-focus-inner,
370 | input::-moz-focus-inner {
371 | border: 0;
372 | padding: 0;
373 | }
374 |
375 | //
376 | // 1. Remove default vertical scrollbar in IE 8/9.
377 | // 2. Improve readability and alignment in all browsers.
378 | //
379 |
380 | textarea {
381 | overflow: auto; // 1
382 | vertical-align: top; // 2
383 | }
384 |
385 | // ==========================================================================
386 | // Tables
387 | // ==========================================================================
388 |
389 | //
390 | // Remove most spacing between table cells.
391 | //
392 |
393 | table {
394 | border-collapse: collapse;
395 | border-spacing: 0;
396 | }
397 |
--------------------------------------------------------------------------------
/static/css/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 | .clearfix();
12 | li {
13 | display: inline;
14 | > a,
15 | > span {
16 | display: inline-block;
17 | padding: 5px 14px;
18 | background-color: @pagination-bg;
19 | border: 1px solid @pagination-border;
20 | border-radius: @pager-border-radius;
21 | }
22 |
23 | > a:hover,
24 | > a:focus {
25 | text-decoration: none;
26 | background-color: @pagination-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: @pagination-bg;
51 | cursor: not-allowed;
52 | }
53 | }
54 |
55 | }
56 |
--------------------------------------------------------------------------------
/static/css/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 | background-color: @pagination-bg;
20 | border: 1px solid @pagination-border;
21 | margin-left: -1px;
22 | }
23 | &:first-child {
24 | > a,
25 | > span {
26 | margin-left: 0;
27 | .border-left-radius(@border-radius-base);
28 | }
29 | }
30 | &:last-child {
31 | > a,
32 | > span {
33 | .border-right-radius(@border-radius-base);
34 | }
35 | }
36 | }
37 |
38 | > li > a,
39 | > li > span {
40 | &:hover,
41 | &:focus {
42 | background-color: @pagination-hover-bg;
43 | }
44 | }
45 |
46 | > .active > a,
47 | > .active > span {
48 | &,
49 | &:hover,
50 | &:focus {
51 | z-index: 2;
52 | color: @pagination-active-color;
53 | background-color: @pagination-active-bg;
54 | border-color: @pagination-active-bg;
55 | cursor: default;
56 | }
57 | }
58 |
59 | > .disabled {
60 | > span,
61 | > a,
62 | > a:hover,
63 | > a:focus {
64 | color: @pagination-disabled-color;
65 | background-color: @pagination-bg;
66 | border-color: @pagination-border;
67 | cursor: not-allowed;
68 | }
69 | }
70 | }
71 |
72 | // Sizing
73 | // --------------------------------------------------
74 |
75 | // Large
76 | .pagination-lg {
77 | .pagination-size(@padding-large-vertical; @padding-large-horizontal; @font-size-large; @border-radius-large);
78 | }
79 |
80 | // Small
81 | .pagination-sm {
82 | .pagination-size(@padding-small-vertical; @padding-small-horizontal; @font-size-small; @border-radius-small);
83 | }
84 |
--------------------------------------------------------------------------------
/static/css/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: 15px;
18 | .clearfix();
19 | }
20 |
21 |
22 | // List groups in panels
23 | //
24 | // By default, space out list group content from panel headings to account for
25 | // any kind of custom content between the two.
26 |
27 | .panel {
28 | > .list-group {
29 | margin-bottom: 0;
30 |
31 | .list-group-item {
32 | border-width: 1px 0;
33 |
34 | // Remove border radius for top one
35 | &:first-child {
36 | .border-top-radius(0);
37 | }
38 | // But keep it for the last one
39 | &:last-child {
40 | border-bottom: 0;
41 | }
42 | }
43 | }
44 | }
45 | // Collapse space between when there's no additional content.
46 | .panel-heading + .list-group {
47 | .list-group-item:first-child {
48 | border-top-width: 0;
49 | }
50 | }
51 |
52 |
53 | // Tables in panels
54 | //
55 | // Place a non-bordered `.table` within a panel (not within a `.panel-body`) and
56 | // watch it go full width.
57 |
58 | .panel {
59 | > .table {
60 | margin-bottom: 0;
61 | }
62 | > .panel-body + .table {
63 | border-top: 1px solid @table-border-color;
64 | }
65 | }
66 |
67 |
68 | // Optional heading
69 | .panel-heading {
70 | padding: 10px 15px;
71 | border-bottom: 1px solid transparent;
72 | .border-top-radius(@panel-border-radius - 1);
73 | }
74 |
75 | // Within heading, strip any `h*` tag of it's default margins for spacing.
76 | .panel-title {
77 | margin-top: 0;
78 | margin-bottom: 0;
79 | font-size: ceil((@font-size-base * 1.125));
80 | > a {
81 | color: inherit;
82 | }
83 | }
84 |
85 | // Optional footer (stays gray in every modifier class)
86 | .panel-footer {
87 | padding: 10px 15px;
88 | background-color: @panel-footer-bg;
89 | border-top: 1px solid @panel-inner-border;
90 | .border-bottom-radius(@panel-border-radius - 1);
91 | }
92 |
93 |
94 | // Collapsable panels (aka, accordion)
95 | //
96 | // Wrap a series of panels in `.panel-group` to turn them into an accordion with
97 | // the help of our collapse JavaScript plugin.
98 |
99 | .panel-group {
100 | // Tighten up margin so it's only between panels
101 | .panel {
102 | margin-bottom: 0;
103 | border-radius: @panel-border-radius;
104 | overflow: hidden; // crop contents when collapsed
105 | + .panel {
106 | margin-top: 5px;
107 | }
108 | }
109 |
110 | .panel-heading {
111 | border-bottom: 0;
112 | + .panel-collapse .panel-body {
113 | border-top: 1px solid @panel-inner-border;
114 | }
115 | }
116 | .panel-footer {
117 | border-top: 0;
118 | + .panel-collapse .panel-body {
119 | border-bottom: 1px solid @panel-inner-border;
120 | }
121 | }
122 |
123 | // New subcomponent for wrapping collapsable content for proper animations
124 | .panel-collapse {
125 |
126 | }
127 | }
128 |
129 |
130 | // Contextual variations
131 | .panel-default {
132 | .panel-variant(@panel-default-border; @panel-default-text; @panel-default-heading-bg; @panel-default-border);
133 | }
134 | .panel-primary {
135 | .panel-variant(@panel-primary-border; @panel-primary-text; @panel-primary-heading-bg; @panel-primary-border);
136 | }
137 | .panel-success {
138 | .panel-variant(@panel-success-border; @panel-success-text; @panel-success-heading-bg; @panel-success-border);
139 | }
140 | .panel-warning {
141 | .panel-variant(@panel-warning-border; @panel-warning-text; @panel-warning-heading-bg; @panel-warning-border);
142 | }
143 | .panel-danger {
144 | .panel-variant(@panel-danger-border; @panel-danger-text; @panel-danger-heading-bg; @panel-danger-border);
145 | }
146 | .panel-info {
147 | .panel-variant(@panel-info-border; @panel-info-text; @panel-info-heading-bg; @panel-info-border);
148 | }
149 |
--------------------------------------------------------------------------------
/static/css/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 | text-align: left; // Reset given new insertion method
15 | background-color: @popover-bg;
16 | background-clip: padding-box;
17 | border: 1px solid @popover-fallback-border-color;
18 | border: 1px solid @popover-border-color;
19 | border-radius: @border-radius-large;
20 | .box-shadow(0 5px 10px rgba(0,0,0,.2));
21 |
22 | // Overrides for proper insertion
23 | white-space: normal;
24 |
25 | // Offset the popover to account for the popover arrow
26 | &.top { margin-top: -10px; }
27 | &.right { margin-left: 10px; }
28 | &.bottom { margin-top: 10px; }
29 | &.left { margin-left: -10px; }
30 | }
31 |
32 | .popover-title {
33 | margin: 0; // reset heading margin
34 | padding: 8px 14px;
35 | font-size: @font-size-base;
36 | font-weight: normal;
37 | line-height: 18px;
38 | background-color: @popover-title-bg;
39 | border-bottom: 1px solid darken(@popover-title-bg, 5%);
40 | border-radius: 5px 5px 0 0;
41 | }
42 |
43 | .popover-content {
44 | padding: 9px 14px;
45 | }
46 |
47 | // Arrows
48 | //
49 | // .arrow is outer, .arrow:after is inner
50 |
51 | .popover .arrow {
52 | &,
53 | &:after {
54 | position: absolute;
55 | display: block;
56 | width: 0;
57 | height: 0;
58 | border-color: transparent;
59 | border-style: solid;
60 | }
61 | }
62 | .popover .arrow {
63 | border-width: @popover-arrow-outer-width;
64 | }
65 | .popover .arrow:after {
66 | border-width: @popover-arrow-width;
67 | content: "";
68 | }
69 |
70 | .popover {
71 | &.top .arrow {
72 | left: 50%;
73 | margin-left: -@popover-arrow-outer-width;
74 | border-bottom-width: 0;
75 | border-top-color: @popover-arrow-outer-fallback-color; // IE8 fallback
76 | border-top-color: @popover-arrow-outer-color;
77 | bottom: -@popover-arrow-outer-width;
78 | &:after {
79 | content: " ";
80 | bottom: 1px;
81 | margin-left: -@popover-arrow-width;
82 | border-bottom-width: 0;
83 | border-top-color: @popover-arrow-color;
84 | }
85 | }
86 | &.right .arrow {
87 | top: 50%;
88 | left: -@popover-arrow-outer-width;
89 | margin-top: -@popover-arrow-outer-width;
90 | border-left-width: 0;
91 | border-right-color: @popover-arrow-outer-fallback-color; // IE8 fallback
92 | border-right-color: @popover-arrow-outer-color;
93 | &:after {
94 | content: " ";
95 | left: 1px;
96 | bottom: -@popover-arrow-width;
97 | border-left-width: 0;
98 | border-right-color: @popover-arrow-color;
99 | }
100 | }
101 | &.bottom .arrow {
102 | left: 50%;
103 | margin-left: -@popover-arrow-outer-width;
104 | border-top-width: 0;
105 | border-bottom-color: @popover-arrow-outer-fallback-color; // IE8 fallback
106 | border-bottom-color: @popover-arrow-outer-color;
107 | top: -@popover-arrow-outer-width;
108 | &:after {
109 | content: " ";
110 | top: 1px;
111 | margin-left: -@popover-arrow-width;
112 | border-top-width: 0;
113 | border-bottom-color: @popover-arrow-color;
114 | }
115 | }
116 |
117 | &.left .arrow {
118 | top: 50%;
119 | right: -@popover-arrow-outer-width;
120 | margin-top: -@popover-arrow-outer-width;
121 | border-right-width: 0;
122 | border-left-color: @popover-arrow-outer-fallback-color; // IE8 fallback
123 | border-left-color: @popover-arrow-outer-color;
124 | &:after {
125 | content: " ";
126 | right: 1px;
127 | border-right-width: 0;
128 | border-left-color: @popover-arrow-color;
129 | bottom: -@popover-arrow-width;
130 | }
131 | }
132 |
133 | }
134 |
--------------------------------------------------------------------------------
/static/css/less/print.less:
--------------------------------------------------------------------------------
1 | //
2 | // Basic print styles
3 | // --------------------------------------------------
4 | // Source: https://github.com/h5bp/html5-boilerplate/blob/master/css/main.css
5 |
6 | @media print {
7 |
8 | * {
9 | text-shadow: none !important;
10 | color: #000 !important; // Black prints faster: h5bp.com/s
11 | background: transparent !important;
12 | box-shadow: none !important;
13 | }
14 |
15 | a,
16 | a:visited {
17 | text-decoration: underline;
18 | }
19 |
20 | a[href]:after {
21 | content: " (" attr(href) ")";
22 | }
23 |
24 | abbr[title]:after {
25 | content: " (" attr(title) ")";
26 | }
27 |
28 | // Don't show links for images, or javascript/internal links
29 | .ir a:after,
30 | a[href^="javascript:"]:after,
31 | a[href^="#"]:after {
32 | content: "";
33 | }
34 |
35 | pre,
36 | blockquote {
37 | border: 1px solid #999;
38 | page-break-inside: avoid;
39 | }
40 |
41 | thead {
42 | display: table-header-group; // h5bp.com/t
43 | }
44 |
45 | tr,
46 | img {
47 | page-break-inside: avoid;
48 | }
49 |
50 | img {
51 | max-width: 100% !important;
52 | }
53 |
54 | @page {
55 | margin: 2cm .5cm;
56 | }
57 |
58 | p,
59 | h2,
60 | h3 {
61 | orphans: 3;
62 | widows: 3;
63 | }
64 |
65 | h2,
66 | h3 {
67 | page-break-after: avoid;
68 | }
69 |
70 | // Bootstrap components
71 | .navbar {
72 | display: none;
73 | }
74 | .table {
75 | td,
76 | th {
77 | background-color: #fff !important;
78 | }
79 | }
80 | .btn,
81 | .dropup > .btn {
82 | > .caret {
83 | border-top-color: #000 !important;
84 | }
85 | }
86 | .label {
87 | border: 1px solid #000;
88 | }
89 |
90 | .table {
91 | border-collapse: collapse !important;
92 | }
93 | .table-bordered {
94 | th,
95 | td {
96 | border: 1px solid #ddd !important;
97 | }
98 | }
99 |
100 | }
101 |
--------------------------------------------------------------------------------
/static/css/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 | // Firefox
16 | @-moz-keyframes progress-bar-stripes {
17 | from { background-position: 40px 0; }
18 | to { background-position: 0 0; }
19 | }
20 |
21 | // Opera
22 | @-o-keyframes progress-bar-stripes {
23 | from { background-position: 0 0; }
24 | to { background-position: 40px 0; }
25 | }
26 |
27 | // Spec and IE10+
28 | @keyframes progress-bar-stripes {
29 | from { background-position: 40px 0; }
30 | to { background-position: 0 0; }
31 | }
32 |
33 |
34 |
35 | // Bar itself
36 | // -------------------------
37 |
38 | // Outer container
39 | .progress {
40 | overflow: hidden;
41 | height: @line-height-computed;
42 | margin-bottom: @line-height-computed;
43 | background-color: @progress-bg;
44 | border-radius: @border-radius-base;
45 | .box-shadow(inset 0 1px 2px rgba(0,0,0,.1));
46 | }
47 |
48 | // Bar of progress
49 | .progress-bar {
50 | float: left;
51 | width: 0%;
52 | height: 100%;
53 | font-size: @font-size-small;
54 | color: @progress-bar-color;
55 | text-align: center;
56 | background-color: @progress-bar-bg;
57 | .box-shadow(inset 0 -1px 0 rgba(0,0,0,.15));
58 | .transition(width .6s ease);
59 | }
60 |
61 | // Striped bars
62 | .progress-striped .progress-bar {
63 | #gradient > .striped(@progress-bar-bg);
64 | background-size: 40px 40px;
65 | }
66 |
67 | // Call animation for the active one
68 | .progress.active .progress-bar {
69 | -webkit-animation: progress-bar-stripes 2s linear infinite;
70 | -moz-animation: progress-bar-stripes 2s linear infinite;
71 | -ms-animation: progress-bar-stripes 2s linear infinite;
72 | -o-animation: progress-bar-stripes 2s linear infinite;
73 | animation: progress-bar-stripes 2s linear infinite;
74 | }
75 |
76 |
77 |
78 | // Variations
79 | // -------------------------
80 |
81 | .progress-bar-success {
82 | .progress-bar-variant(@progress-bar-success-bg);
83 | }
84 |
85 | .progress-bar-info {
86 | .progress-bar-variant(@progress-bar-info-bg);
87 | }
88 |
89 | .progress-bar-warning {
90 | .progress-bar-variant(@progress-bar-warning-bg);
91 | }
92 |
93 | .progress-bar-danger {
94 | .progress-bar-variant(@progress-bar-danger-bg);
95 | }
96 |
--------------------------------------------------------------------------------
/static/css/less/responsive-utilities.less:
--------------------------------------------------------------------------------
1 | //
2 | // Responsive: Utility classes
3 | // --------------------------------------------------
4 |
5 |
6 | // IE10 Metro responsive
7 | // Required for Windows 8 Metro split-screen snapping with IE10
8 | //
9 | // Source: http://timkadlec.com/2012/10/ie10-snap-mode-and-responsive-design/
10 | @-ms-viewport{
11 | width: device-width;
12 | }
13 |
14 | // IE10 on Windows Phone 8
15 | // IE10 on WP8 doesn't report CSS pixels, but actual device pixels. In
16 | // other words, say on a Lumia, you'll get 768px as the device width,
17 | // meaning users will see the tablet styles and not phone styles.
18 | //
19 | // Alternatively you can override this with JS (see source below), but
20 | // we won't be doing that here given our limited scope.
21 | //
22 | // Source: http://timkadlec.com/2013/01/windows-phone-8-and-device-width/
23 | @media screen and (max-width: 400px) {
24 | @-ms-viewport{
25 | width: 320px;
26 | }
27 | }
28 |
29 | // Hide from screenreaders and browsers
30 | // Credit: HTML5 Boilerplate
31 | .hidden {
32 | display: none !important;
33 | visibility: hidden !important;
34 | }
35 |
36 | // Visibility utilities
37 |
38 | .visible-xs {
39 | .responsive-invisibility();
40 | @media (max-width: @screen-xs-max) {
41 | .responsive-visibility();
42 | }
43 | &.visible-sm {
44 | @media (min-width: @screen-sm) and (max-width: @screen-sm-max) {
45 | .responsive-visibility();
46 | }
47 | }
48 | &.visible-md {
49 | @media (min-width: @screen-md) and (max-width: @screen-md-max) {
50 | .responsive-visibility();
51 | }
52 | }
53 | &.visible-lg {
54 | @media (min-width: @screen-lg) {
55 | .responsive-visibility();
56 | }
57 | }
58 | }
59 | .visible-sm {
60 | .responsive-invisibility();
61 | &.visible-xs {
62 | @media (max-width: @screen-xs-max) {
63 | .responsive-visibility();
64 | }
65 | }
66 | @media (min-width: @screen-sm) and (max-width: @screen-sm-max) {
67 | .responsive-visibility();
68 | }
69 | &.visible-md {
70 | @media (min-width: @screen-md) and (max-width: @screen-md-max) {
71 | .responsive-visibility();
72 | }
73 | }
74 | &.visible-lg {
75 | @media (min-width: @screen-lg) {
76 | .responsive-visibility();
77 | }
78 | }
79 | }
80 | .visible-md {
81 | .responsive-invisibility();
82 | &.visible-xs {
83 | @media (max-width: @screen-xs-max) {
84 | .responsive-visibility();
85 | }
86 | }
87 | &.visible-sm {
88 | @media (min-width: @screen-sm) and (max-width: @screen-sm-max) {
89 | .responsive-visibility();
90 | }
91 | }
92 | @media (min-width: @screen-md) and (max-width: @screen-md-max) {
93 | .responsive-visibility();
94 | }
95 | &.visible-lg {
96 | @media (min-width: @screen-lg) {
97 | .responsive-visibility();
98 | }
99 | }
100 | }
101 | .visible-lg {
102 | .responsive-invisibility();
103 | &.visible-xs {
104 | @media (max-width: @screen-xs-max) {
105 | .responsive-visibility();
106 | }
107 | }
108 | &.visible-sm {
109 | @media (min-width: @screen-sm) and (max-width: @screen-sm-max) {
110 | .responsive-visibility();
111 | }
112 | }
113 | &.visible-md {
114 | @media (min-width: @screen-md) and (max-width: @screen-md-max) {
115 | .responsive-visibility();
116 | }
117 | }
118 | @media (min-width: @screen-lg) {
119 | .responsive-visibility();
120 | }
121 | }
122 |
123 | .hidden-xs {
124 | .responsive-visibility();
125 | @media (max-width: @screen-xs-max) {
126 | .responsive-invisibility();
127 | }
128 | &.hidden-sm {
129 | @media (min-width: @screen-sm) and (max-width: @screen-sm-max) {
130 | .responsive-invisibility();
131 | }
132 | }
133 | &.hidden-md {
134 | @media (min-width: @screen-md) and (max-width: @screen-md-max) {
135 | .responsive-invisibility();
136 | }
137 | }
138 | &.hidden-lg {
139 | @media (min-width: @screen-lg) {
140 | .responsive-invisibility();
141 | }
142 | }
143 | }
144 | .hidden-sm {
145 | .responsive-visibility();
146 | &.hidden-xs {
147 | @media (max-width: @screen-xs-max) {
148 | .responsive-invisibility();
149 | }
150 | }
151 | @media (min-width: @screen-sm) and (max-width: @screen-sm-max) {
152 | .responsive-invisibility();
153 | }
154 | &.hidden-md {
155 | @media (min-width: @screen-md) and (max-width: @screen-md-max) {
156 | .responsive-invisibility();
157 | }
158 | }
159 | &.hidden-lg {
160 | @media (min-width: @screen-lg) {
161 | .responsive-invisibility();
162 | }
163 | }
164 | }
165 | .hidden-md {
166 | .responsive-visibility();
167 | &.hidden-xs {
168 | @media (max-width: @screen-xs-max) {
169 | .responsive-invisibility();
170 | }
171 | }
172 | &.hidden-sm {
173 | @media (min-width: @screen-sm) and (max-width: @screen-sm-max) {
174 | .responsive-invisibility();
175 | }
176 | }
177 | @media (min-width: @screen-md) and (max-width: @screen-md-max) {
178 | .responsive-invisibility();
179 | }
180 | &.hidden-lg {
181 | @media (min-width: @screen-lg) {
182 | .responsive-invisibility();
183 | }
184 | }
185 | }
186 | .hidden-lg {
187 | .responsive-visibility();
188 | &.hidden-xs {
189 | @media (max-width: @screen-xs-max) {
190 | .responsive-invisibility();
191 | }
192 | }
193 | &.hidden-sm {
194 | @media (min-width: @screen-sm) and (max-width: @screen-sm-max) {
195 | .responsive-invisibility();
196 | }
197 | }
198 | &.hidden-md {
199 | @media (min-width: @screen-md) and (max-width: @screen-md-max) {
200 | .responsive-invisibility();
201 | }
202 | }
203 | @media (min-width: @screen-lg) {
204 | .responsive-invisibility();
205 | }
206 | }
207 |
208 | // Print utilities
209 | .visible-print {
210 | .responsive-invisibility();
211 | }
212 |
213 | @media print {
214 | .visible-print {
215 | .responsive-visibility();
216 | }
217 | .hidden-print {
218 | .responsive-invisibility();
219 | }
220 | }
221 |
--------------------------------------------------------------------------------
/static/css/less/scaffolding.less:
--------------------------------------------------------------------------------
1 | //
2 | // Scaffolding
3 | // --------------------------------------------------
4 |
5 |
6 | // Reset the box-sizing
7 |
8 | *,
9 | *:before,
10 | *:after {
11 | .box-sizing(border-box);
12 | }
13 |
14 |
15 | // Body reset
16 |
17 | html {
18 | font-size: 62.5%;
19 | -webkit-tap-highlight-color: rgba(0,0,0,0);
20 | }
21 |
22 | body {
23 | font-family: @font-family-base;
24 | font-size: @font-size-base;
25 | line-height: @line-height-base;
26 | color: @text-color;
27 | background-color: @body-bg;
28 | }
29 |
30 | // Reset fonts for relevant elements
31 | input,
32 | button,
33 | select,
34 | textarea {
35 | font-family: inherit;
36 | font-size: inherit;
37 | line-height: inherit;
38 | }
39 |
40 | // Reset unusual Firefox-on-Android default style.
41 | //
42 | // See https://github.com/necolas/normalize.css/issues/214
43 |
44 | button,
45 | input,
46 | select[multiple],
47 | textarea {
48 | background-image: none;
49 | }
50 |
51 |
52 | // Links
53 |
54 | a {
55 | color: @link-color;
56 | text-decoration: none;
57 |
58 | &:hover,
59 | &:focus {
60 | color: @link-hover-color;
61 | text-decoration: underline;
62 | }
63 |
64 | &:focus {
65 | .tab-focus();
66 | }
67 | }
68 |
69 |
70 | // Images
71 |
72 | img {
73 | vertical-align: middle;
74 | }
75 |
76 | // Responsive images (ensure images don't scale beyond their parents)
77 | .img-responsive {
78 | .img-responsive();
79 | }
80 |
81 | // Rounded corners
82 | .img-rounded {
83 | border-radius: @border-radius-large;
84 | }
85 |
86 | // Image thumbnails
87 | //
88 | // Heads up! This is mixin-ed into thumbnails.less for `.thumbnail`.
89 | .img-thumbnail {
90 | padding: @thumbnail-padding;
91 | line-height: @line-height-base;
92 | background-color: @thumbnail-bg;
93 | border: 1px solid @thumbnail-border;
94 | border-radius: @thumbnail-border-radius;
95 | .transition(all .2s ease-in-out);
96 |
97 | // Keep them at most 100% wide
98 | .img-responsive(inline-block);
99 | }
100 |
101 | // Perfect circle
102 | .img-circle {
103 | border-radius: 50%; // set radius in percents
104 | }
105 |
106 |
107 | // Horizontal rules
108 |
109 | hr {
110 | margin-top: @line-height-computed;
111 | margin-bottom: @line-height-computed;
112 | border: 0;
113 | border-top: 1px solid @hr-border;
114 | }
115 |
116 |
117 | // Only display content to screen readers
118 | //
119 | // See: http://a11yproject.com/posts/how-to-hide-content/
120 |
121 | .sr-only {
122 | position: absolute;
123 | width: 1px;
124 | height: 1px;
125 | margin: -1px;
126 | padding: 0;
127 | overflow: hidden;
128 | clip: rect(0 0 0 0);
129 | border: 0;
130 | }
131 |
--------------------------------------------------------------------------------
/static/css/less/tables.less:
--------------------------------------------------------------------------------
1 | //
2 | // Tables
3 | // --------------------------------------------------
4 |
5 |
6 | table {
7 | max-width: 100%;
8 | background-color: @table-bg;
9 | }
10 | th {
11 | text-align: left;
12 | }
13 |
14 |
15 | // Baseline styles
16 |
17 | .table {
18 | width: 100%;
19 | margin-bottom: @line-height-computed;
20 | // Cells
21 | thead,
22 | tbody,
23 | tfoot {
24 | > tr {
25 | > th,
26 | > td {
27 | padding: @table-cell-padding;
28 | line-height: @line-height-base;
29 | vertical-align: top;
30 | border-top: 1px solid @table-border-color;
31 | }
32 | }
33 | }
34 | // Bottom align for column headings
35 | thead > tr > th {
36 | vertical-align: bottom;
37 | border-bottom: 2px solid @table-border-color;
38 | }
39 | // Remove top border from thead by default
40 | caption + thead,
41 | colgroup + thead,
42 | thead:first-child {
43 | tr:first-child {
44 | th, td {
45 | border-top: 0;
46 | }
47 | }
48 | }
49 | // Account for multiple tbody instances
50 | tbody + tbody {
51 | border-top: 2px solid @table-border-color;
52 | }
53 |
54 | // Nesting
55 | .table {
56 | background-color: @body-bg;
57 | }
58 | }
59 |
60 |
61 | // Condensed table w/ half padding
62 |
63 | .table-condensed {
64 | thead,
65 | tbody,
66 | tfoot {
67 | > tr {
68 | > th,
69 | > td {
70 | padding: @table-condensed-cell-padding;
71 | }
72 | }
73 | }
74 | }
75 |
76 |
77 | // Bordered version
78 | //
79 | // Add borders all around the table and between all the columns.
80 |
81 | .table-bordered {
82 | border: 1px solid @table-border-color;
83 | > thead,
84 | > tbody,
85 | > tfoot {
86 | > tr {
87 | > th,
88 | > td {
89 | border: 1px solid @table-border-color;
90 | }
91 | }
92 | }
93 | > thead {
94 | > tr {
95 | > th,
96 | > td {
97 | border-bottom-width: 2px;
98 | }
99 | }
100 | }
101 | }
102 |
103 |
104 | // Zebra-striping
105 | //
106 | // Default zebra-stripe styles (alternating gray and transparent backgrounds)
107 |
108 | .table-striped {
109 | > tbody {
110 | > tr:nth-child(odd) {
111 | > td,
112 | > th {
113 | background-color: @table-bg-accent;
114 | }
115 | }
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 {
126 | > tr:hover {
127 | > td,
128 | > th {
129 | background-color: @table-bg-hover;
130 | }
131 | }
132 | }
133 | }
134 |
135 |
136 | // Table cell sizing
137 | //
138 | // Reset default table behavior
139 |
140 | table col[class*="col-"] {
141 | float: none;
142 | display: table-column;
143 | }
144 | table {
145 | td,
146 | th {
147 | &[class*="col-"] {
148 | float: none;
149 | display: table-cell;
150 | }
151 | }
152 | }
153 |
154 |
155 | // Table backgrounds
156 | //
157 | // Exact selectors below required to override `.table-striped` and prevent
158 | // inheritance to nested tables.
159 |
160 | .table > thead > tr,
161 | .table > tbody > tr,
162 | .table > tfoot > tr {
163 | > td.active,
164 | > th.active,
165 | &.active > td,
166 | &.active > th {
167 | background-color: @table-bg-active;
168 | }
169 | }
170 |
171 | // Generate the contextual variants
172 | .table-row-variant(success; @state-success-bg; @state-success-border);
173 | .table-row-variant(danger; @state-danger-bg; @state-danger-border);
174 | .table-row-variant(warning; @state-warning-bg; @state-warning-border);
175 |
176 |
177 | // Responsive tables
178 | //
179 | // Wrap your tables in `.table-scrollable` and we'll make them mobile friendly
180 | // by enabling horizontal scrolling. Only applies <768px. Everything above that
181 | // will display normally.
182 |
183 | @media (max-width: @screen-sm) {
184 | .table-responsive {
185 | width: 100%;
186 | margin-bottom: 15px;
187 | overflow-y: hidden;
188 | overflow-x: scroll;
189 | border: 1px solid @table-border-color;
190 |
191 | // Tighten up spacing and give a background color
192 | > .table {
193 | margin-bottom: 0;
194 | background-color: #fff;
195 |
196 | // Ensure the content doesn't wrap
197 | > thead,
198 | > tbody,
199 | > tfoot {
200 | > tr {
201 | > th,
202 | > td {
203 | white-space: nowrap;
204 | }
205 | }
206 | }
207 | }
208 |
209 | // Special overrides for the bordered tables
210 | > .table-bordered {
211 | border: 0;
212 |
213 | // Nuke the appropriate borders so that the parent can handle them
214 | > thead,
215 | > tbody,
216 | > tfoot {
217 | > tr {
218 | > th:first-child,
219 | > td:first-child {
220 | border-left: 0;
221 | }
222 | > th:last-child,
223 | > td:last-child {
224 | border-right: 0;
225 | }
226 | }
227 | > tr:last-child {
228 | > th,
229 | > td {
230 | border-bottom: 0;
231 | }
232 | }
233 | }
234 | }
235 | }
236 | }
237 |
--------------------------------------------------------------------------------
/static/css/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 | //
12 | // Buttons
13 | // --------------------------------------------------
14 |
15 | // Common styles
16 | .btn-default,
17 | .btn-primary,
18 | .btn-success,
19 | .btn-info,
20 | .btn-warning,
21 | .btn-danger {
22 | text-shadow: 0 -1px 0 rgba(0,0,0,.2);
23 | @shadow: inset 0 1px 0 rgba(255,255,255,.15), 0 1px 1px rgba(0,0,0,.075);
24 | .box-shadow(@shadow);
25 |
26 | // Reset the shadow
27 | &:active,
28 | &.active {
29 | .box-shadow(inset 0 3px 5px rgba(0,0,0,.125));
30 | }
31 | }
32 |
33 | // Mixin for generating new styles
34 | .btn-styles(@btn-color: #555;) {
35 | #gradient > .vertical(@start-color: @btn-color; @end-color: darken(@btn-color, 10%));
36 | border-color: darken(@btn-color, 12%);
37 |
38 | &:active,
39 | &.active {
40 | background-color: darken(@btn-color, 10%);
41 | border-color: darken(@btn-color, 12%);
42 | }
43 | }
44 |
45 | // Common styles
46 | .btn {
47 | // Remove the gradient for the pressed/active state
48 | &:active,
49 | &.active {
50 | background-image: none;
51 | }
52 | }
53 |
54 | // Apply the mixin to the buttons
55 | .btn-default { .btn-styles(@btn-default-bg;); text-shadow: 0 1px 0 #fff; border-color: #ccc; }
56 | .btn-primary { .btn-styles(@btn-primary-bg); }
57 | .btn-success { .btn-styles(@btn-success-bg); }
58 | .btn-warning { .btn-styles(@btn-warning-bg); }
59 | .btn-danger { .btn-styles(@btn-danger-bg); }
60 | .btn-info { .btn-styles(@btn-info-bg); }
61 |
62 |
63 |
64 | //
65 | // Images
66 | // --------------------------------------------------
67 |
68 | .thumbnail,
69 | .img-thumbnail {
70 | .box-shadow(0 1px 2px rgba(0,0,0,.075));
71 | }
72 |
73 |
74 |
75 | //
76 | // Dropdowns
77 | // --------------------------------------------------
78 |
79 | .dropdown-menu > li > a:hover,
80 | .dropdown-menu > li > a:focus,
81 | .dropdown-menu > .active > a,
82 | .dropdown-menu > .active > a:hover,
83 | .dropdown-menu > .active > a:focus {
84 | #gradient > .vertical(@start-color: @dropdown-link-hover-bg; @end-color: darken(@dropdown-link-hover-bg, 5%));
85 | background-color: darken(@dropdown-link-hover-bg, 5%);
86 | }
87 |
88 |
89 |
90 | //
91 | // Navbar
92 | // --------------------------------------------------
93 |
94 | // Basic navbar
95 | .navbar {
96 | #gradient > .vertical(@start-color: lighten(@navbar-default-bg, 10%); @end-color: @navbar-default-bg;);
97 | border-radius: @navbar-border-radius;
98 | @shadow: inset 0 1px 0 rgba(255,255,255,.15), 0 1px 5px rgba(0,0,0,.075);
99 | .box-shadow(@shadow);
100 |
101 | .navbar-nav > .active > a {
102 | background-color: @navbar-default-bg;
103 | }
104 | }
105 | .navbar-brand,
106 | .navbar-nav > li > a {
107 | text-shadow: 0 1px 0 rgba(255,255,255,.25);
108 | }
109 |
110 | // Inverted navbar
111 | .navbar-inverse {
112 | #gradient > .vertical(@start-color: lighten(@navbar-inverse-bg, 10%); @end-color: @navbar-inverse-bg;);
113 |
114 | .navbar-nav > .active > a {
115 | background-color: @navbar-inverse-bg;
116 | }
117 |
118 | .navbar-brand,
119 | .navbar-nav > li > a {
120 | text-shadow: 0 -1px 0 rgba(0,0,0,.25);
121 | }
122 | }
123 |
124 | // Undo rounded corners in static and fixed navbars
125 | .navbar-static-top,
126 | .navbar-fixed-top,
127 | .navbar-fixed-bottom {
128 | border-radius: 0;
129 | }
130 |
131 |
132 |
133 | //
134 | // Alerts
135 | // --------------------------------------------------
136 |
137 | // Common styles
138 | .alert {
139 | text-shadow: 0 1px 0 rgba(255,255,255,.2);
140 | @shadow: inset 0 1px 0 rgba(255,255,255,.25), 0 1px 2px rgba(0,0,0,.05);
141 | .box-shadow(@shadow);
142 | }
143 |
144 | // Mixin for generating new styles
145 | .alert-styles(@color) {
146 | #gradient > .vertical(@start-color: @color; @end-color: darken(@color, 7.5%));
147 | border-color: darken(@color, 15%);
148 | }
149 |
150 | // Apply the mixin to the alerts
151 | .alert-success { .alert-styles(@alert-success-bg); }
152 | .alert-info { .alert-styles(@alert-info-bg); }
153 | .alert-warning { .alert-styles(@alert-warning-bg); }
154 | .alert-danger { .alert-styles(@alert-danger-bg); }
155 |
156 |
157 |
158 | //
159 | // Progress bars
160 | // --------------------------------------------------
161 |
162 | // Give the progress background some depth
163 | .progress {
164 | #gradient > .vertical(@start-color: darken(@progress-bg, 4%); @end-color: @progress-bg;)
165 | }
166 |
167 | // Mixin for generating new styles
168 | .progress-bar-styles(@color) {
169 | #gradient > .vertical(@start-color: @color; @end-color: darken(@color, 10%));
170 | }
171 |
172 | // Apply the mixin to the progress bars
173 | .progress-bar { .progress-bar-styles(@progress-bar-bg); }
174 | .progress-bar-success { .progress-bar-styles(@progress-bar-success-bg); }
175 | .progress-bar-info { .progress-bar-styles(@progress-bar-info-bg); }
176 | .progress-bar-warning { .progress-bar-styles(@progress-bar-warning-bg); }
177 | .progress-bar-danger { .progress-bar-styles(@progress-bar-danger-bg); }
178 |
179 |
180 |
181 | //
182 | // List groups
183 | // --------------------------------------------------
184 |
185 | .list-group {
186 | border-radius: @border-radius-base;
187 | .box-shadow(0 1px 2px rgba(0,0,0,.075));
188 | }
189 | .list-group-item.active,
190 | .list-group-item.active:hover,
191 | .list-group-item.active:focus {
192 | text-shadow: 0 -1px 0 darken(@list-group-active-bg, 10%);
193 | #gradient > .vertical(@start-color: @list-group-active-bg; @end-color: darken(@list-group-active-bg, 7.5%));
194 | border-color: darken(@list-group-active-border, 7.5%);
195 | }
196 |
197 |
198 |
199 | //
200 | // Panels
201 | // --------------------------------------------------
202 |
203 | // Common styles
204 | .panel {
205 | .box-shadow(0 1px 2px rgba(0,0,0,.05));
206 | }
207 |
208 | // Mixin for generating new styles
209 | .panel-heading-styles(@color) {
210 | #gradient > .vertical(@start-color: @color; @end-color: darken(@color, 5%));
211 | }
212 |
213 | // Apply the mixin to the panel headings only
214 | .panel-default > .panel-heading { .panel-heading-styles(@panel-default-heading-bg); }
215 | .panel-primary > .panel-heading { .panel-heading-styles(@panel-primary-heading-bg); }
216 | .panel-success > .panel-heading { .panel-heading-styles(@panel-success-heading-bg); }
217 | .panel-info > .panel-heading { .panel-heading-styles(@panel-info-heading-bg); }
218 | .panel-warning > .panel-heading { .panel-heading-styles(@panel-warning-heading-bg); }
219 | .panel-danger > .panel-heading { .panel-heading-styles(@panel-danger-heading-bg); }
220 |
221 |
222 |
223 | //
224 | // Wells
225 | // --------------------------------------------------
226 |
227 | .well {
228 | #gradient > .vertical(@start-color: darken(@well-bg, 5%); @end-color: @well-bg;);
229 | border-color: darken(@well-bg, 10%);
230 | @shadow: inset 0 1px 3px rgba(0,0,0,.05), 0 1px 0 rgba(255,255,255,.1);
231 | .box-shadow(@shadow);
232 | }
233 |
--------------------------------------------------------------------------------
/static/css/less/thumbnails.less:
--------------------------------------------------------------------------------
1 | //
2 | // Thumbnails
3 | // --------------------------------------------------
4 |
5 |
6 | // Mixin and adjust the regular image class
7 | .thumbnail {
8 | .img-thumbnail();
9 | display: block; // Override the inline-block from `.img-thumbnail`
10 |
11 | > img {
12 | .img-responsive();
13 | }
14 | }
15 |
16 |
17 | // Add a hover state for linked versions only
18 | a.thumbnail:hover,
19 | a.thumbnail:focus {
20 | border-color: @link-color;
21 | }
22 |
23 | // Images and captions
24 | .thumbnail > img {
25 | margin-left: auto;
26 | margin-right: auto;
27 | }
28 | .thumbnail .caption {
29 | padding: @thumbnail-caption-padding;
30 | color: @thumbnail-caption-color;
31 | }
32 |
--------------------------------------------------------------------------------
/static/css/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 | visibility: visible;
12 | font-size: @font-size-small;
13 | line-height: 1.4;
14 | .opacity(0);
15 |
16 | &.in { .opacity(.9); }
17 | &.top { margin-top: -3px; padding: 5px 0; }
18 | &.right { margin-left: 3px; padding: 0 5px; }
19 | &.bottom { margin-top: 3px; padding: 5px 0; }
20 | &.left { margin-left: -3px; padding: 0 5px; }
21 | }
22 |
23 | // Wrapper for the tooltip content
24 | .tooltip-inner {
25 | max-width: @tooltip-max-width;
26 | padding: 3px 8px;
27 | color: @tooltip-color;
28 | text-align: center;
29 | text-decoration: none;
30 | background-color: @tooltip-bg;
31 | border-radius: @border-radius-base;
32 | }
33 |
34 | // Arrows
35 | .tooltip-arrow {
36 | position: absolute;
37 | width: 0;
38 | height: 0;
39 | border-color: transparent;
40 | border-style: solid;
41 | }
42 | .tooltip {
43 | &.top .tooltip-arrow {
44 | bottom: 0;
45 | left: 50%;
46 | margin-left: -@tooltip-arrow-width;
47 | border-width: @tooltip-arrow-width @tooltip-arrow-width 0;
48 | border-top-color: @tooltip-arrow-color;
49 | }
50 | &.top-left .tooltip-arrow {
51 | bottom: 0;
52 | left: 5px;
53 | border-width: @tooltip-arrow-width @tooltip-arrow-width 0;
54 | border-top-color: @tooltip-arrow-color;
55 | }
56 | &.top-right .tooltip-arrow {
57 | bottom: 0;
58 | right: 5px;
59 | border-width: @tooltip-arrow-width @tooltip-arrow-width 0;
60 | border-top-color: @tooltip-arrow-color;
61 | }
62 | &.right .tooltip-arrow {
63 | top: 50%;
64 | left: 0;
65 | margin-top: -@tooltip-arrow-width;
66 | border-width: @tooltip-arrow-width @tooltip-arrow-width @tooltip-arrow-width 0;
67 | border-right-color: @tooltip-arrow-color;
68 | }
69 | &.left .tooltip-arrow {
70 | top: 50%;
71 | right: 0;
72 | margin-top: -@tooltip-arrow-width;
73 | border-width: @tooltip-arrow-width 0 @tooltip-arrow-width @tooltip-arrow-width;
74 | border-left-color: @tooltip-arrow-color;
75 | }
76 | &.bottom .tooltip-arrow {
77 | top: 0;
78 | left: 50%;
79 | margin-left: -@tooltip-arrow-width;
80 | border-width: 0 @tooltip-arrow-width @tooltip-arrow-width;
81 | border-bottom-color: @tooltip-arrow-color;
82 | }
83 | &.bottom-left .tooltip-arrow {
84 | top: 0;
85 | left: 5px;
86 | border-width: 0 @tooltip-arrow-width @tooltip-arrow-width;
87 | border-bottom-color: @tooltip-arrow-color;
88 | }
89 | &.bottom-right .tooltip-arrow {
90 | top: 0;
91 | right: 5px;
92 | border-width: 0 @tooltip-arrow-width @tooltip-arrow-width;
93 | border-bottom-color: @tooltip-arrow-color;
94 | }
95 | }
96 |
--------------------------------------------------------------------------------
/static/css/less/type.less:
--------------------------------------------------------------------------------
1 | //
2 | // Typography
3 | // --------------------------------------------------
4 |
5 |
6 | // Body text
7 | // -------------------------
8 |
9 | p {
10 | margin: 0 0 (@line-height-computed / 2);
11 | }
12 | .lead {
13 | margin-bottom: @line-height-computed;
14 | font-size: (@font-size-base * 1.15);
15 | font-weight: 200;
16 | line-height: 1.4;
17 |
18 | @media (min-width: 768px) {
19 | font-size: (@font-size-base * 1.5);
20 | }
21 | }
22 |
23 |
24 | // Emphasis & misc
25 | // -------------------------
26 |
27 | // Ex: 14px base font * 85% = about 12px
28 | small { font-size: 85%; }
29 |
30 | // Undo browser default styling
31 | cite { font-style: normal; }
32 |
33 | // Contextual emphasis
34 | .text-muted { color: @text-muted; }
35 | .text-primary { color: @brand-primary; }
36 | .text-warning { color: @state-warning-text; }
37 | .text-danger { color: @state-danger-text; }
38 | .text-success { color: @state-success-text; }
39 | .text-info { color: @state-info-text; }
40 |
41 | // Alignment
42 | .text-left { text-align: left; }
43 | .text-right { text-align: right; }
44 | .text-center { text-align: center; }
45 |
46 |
47 | // Headings
48 | // -------------------------
49 |
50 | h1, h2, h3, h4, h5, h6,
51 | .h1, .h2, .h3, .h4, .h5, .h6 {
52 | font-family: @headings-font-family;
53 | font-weight: @headings-font-weight;
54 | line-height: @headings-line-height;
55 | small {
56 | font-weight: normal;
57 | line-height: 1;
58 | color: @headings-small-color;
59 | }
60 | }
61 |
62 | h1,
63 | h2,
64 | h3 {
65 | margin-top: @line-height-computed;
66 | margin-bottom: (@line-height-computed / 2);
67 | }
68 | h4,
69 | h5,
70 | h6 {
71 | margin-top: (@line-height-computed / 2);
72 | margin-bottom: (@line-height-computed / 2);
73 | }
74 |
75 | h1, .h1 { font-size: floor(@font-size-base * 2.60); } // ~36px
76 | h2, .h2 { font-size: floor(@font-size-base * 2.15); } // ~30px
77 | h3, .h3 { font-size: ceil(@font-size-base * 1.70); } // ~24px
78 | h4, .h4 { font-size: ceil(@font-size-base * 1.25); } // ~18px
79 | h5, .h5 { font-size: @font-size-base; }
80 | h6, .h6 { font-size: ceil(@font-size-base * 0.85); } // ~12px
81 |
82 | h1 small, .h1 small { font-size: ceil(@font-size-base * 1.70); } // ~24px
83 | h2 small, .h2 small { font-size: ceil(@font-size-base * 1.25); } // ~18px
84 | h3 small, .h3 small,
85 | h4 small, .h4 small { font-size: @font-size-base; }
86 |
87 |
88 | // Page header
89 | // -------------------------
90 |
91 | .page-header {
92 | padding-bottom: ((@line-height-computed / 2) - 1);
93 | margin: (@line-height-computed * 2) 0 @line-height-computed;
94 | border-bottom: 1px solid @page-header-border-color;
95 | }
96 |
97 |
98 |
99 | // Lists
100 | // --------------------------------------------------
101 |
102 | // Unordered and Ordered lists
103 | ul,
104 | ol {
105 | margin-top: 0;
106 | margin-bottom: (@line-height-computed / 2);
107 | ul,
108 | ol{
109 | margin-bottom: 0;
110 | }
111 | }
112 |
113 | // List options
114 |
115 | // Unstyled keeps list items block level, just removes default browser padding and list-style
116 | .list-unstyled {
117 | padding-left: 0;
118 | list-style: none;
119 | }
120 | // Inline turns list items into inline-block
121 | .list-inline {
122 | .list-unstyled();
123 | > li {
124 | display: inline-block;
125 | padding-left: 5px;
126 | padding-right: 5px;
127 | }
128 | }
129 |
130 | // Description Lists
131 | dl {
132 | margin-bottom: @line-height-computed;
133 | }
134 | dt,
135 | dd {
136 | line-height: @line-height-base;
137 | }
138 | dt {
139 | font-weight: bold;
140 | }
141 | dd {
142 | margin-left: 0; // Undo browser default
143 | }
144 |
145 | // Horizontal description lists
146 | //
147 | // Defaults to being stacked without any of the below styles applied, until the
148 | // grid breakpoint is reached (default of ~768px).
149 |
150 | @media (min-width: @grid-float-breakpoint) {
151 | .dl-horizontal {
152 | dt {
153 | float: left;
154 | width: (@component-offset-horizontal - 20);
155 | clear: left;
156 | text-align: right;
157 | .text-overflow();
158 | }
159 | dd {
160 | margin-left: @component-offset-horizontal;
161 | .clearfix(); // Clear the floated `dt` if an empty `dd` is present
162 | }
163 | }
164 | }
165 |
166 | // MISC
167 | // ----
168 |
169 | // Abbreviations and acronyms
170 | abbr[title],
171 | // Added data-* attribute to help out our tooltip plugin, per https://github.com/twbs/bootstrap/issues/5257
172 | abbr[data-original-title] {
173 | cursor: help;
174 | border-bottom: 1px dotted @abbr-border-color;
175 | }
176 | abbr.initialism {
177 | font-size: 90%;
178 | text-transform: uppercase;
179 | }
180 |
181 | // Blockquotes
182 | blockquote {
183 | padding: (@line-height-computed / 2) @line-height-computed;
184 | margin: 0 0 @line-height-computed;
185 | border-left: 5px solid @blockquote-border-color;
186 | p {
187 | font-size: (@font-size-base * 1.25);
188 | font-weight: 300;
189 | line-height: 1.25;
190 | }
191 | p:last-child {
192 | margin-bottom: 0;
193 | }
194 | small {
195 | display: block;
196 | line-height: @line-height-base;
197 | color: @blockquote-small-color;
198 | &:before {
199 | content: '\2014 \00A0';// EM DASH, NBSP
200 | }
201 | }
202 |
203 | // Float right with text-align: right
204 | &.pull-right {
205 | padding-right: 15px;
206 | padding-left: 0;
207 | border-right: 5px solid @blockquote-border-color;
208 | border-left: 0;
209 | p,
210 | small {
211 | text-align: right;
212 | }
213 | small {
214 | &:before {
215 | content: '';
216 | }
217 | &:after {
218 | content: '\00A0 \2014';// NBSP, EM DASH
219 | }
220 | }
221 | }
222 | }
223 |
224 | // Quotes
225 | q:before,
226 | q:after,
227 | blockquote:before,
228 | blockquote:after {
229 | content: "";
230 | }
231 |
232 | // Addresses
233 | address {
234 | display: block;
235 | margin-bottom: @line-height-computed;
236 | font-style: normal;
237 | line-height: @line-height-base;
238 | }
239 |
--------------------------------------------------------------------------------
/static/css/less/utilities.less:
--------------------------------------------------------------------------------
1 | //
2 | // Utility classes
3 | // --------------------------------------------------
4 |
5 |
6 | // Floats
7 | // -------------------------
8 |
9 | .clearfix {
10 | .clearfix();
11 | }
12 | .pull-right {
13 | float: right !important;
14 | }
15 | .pull-left {
16 | float: left !important;
17 | }
18 |
19 |
20 | // Toggling content
21 | // -------------------------
22 |
23 | .hide {
24 | display: none !important;
25 | }
26 | .show {
27 | display: block !important;
28 | }
29 | .invisible {
30 | visibility: hidden;
31 | }
32 | .text-hide {
33 | .hide-text();
34 | }
35 |
36 |
37 | // For Affix plugin
38 | // -------------------------
39 |
40 | .affix {
41 | position: fixed;
42 | }
43 |
--------------------------------------------------------------------------------
/static/css/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 darken(@well-bg, 7%);
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 |
--------------------------------------------------------------------------------
/static/css/main.less:
--------------------------------------------------------------------------------
1 | @import "less/mixins.less";
2 |
3 | @pink: #be1a8d;
4 |
5 | .custom-highlight{
6 | background: @pink;
7 | color: #fff;
8 | text-shadow: -1px 1px 1px darken(@pink, 15%);
9 | }
10 |
11 | /* Apply custom highlight */
12 | ::-moz-selection{ .custom-highlight; }
13 | ::selection { .custom-highlight; }
14 |
--------------------------------------------------------------------------------
/static/favicon.ico:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/zachwill/flask_heroku/5214a74c3711bf9759192f873b62b025317932d7/static/favicon.ico
--------------------------------------------------------------------------------
/static/fonts/glyphicons-halflings-regular.eot:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/zachwill/flask_heroku/5214a74c3711bf9759192f873b62b025317932d7/static/fonts/glyphicons-halflings-regular.eot
--------------------------------------------------------------------------------
/static/fonts/glyphicons-halflings-regular.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/zachwill/flask_heroku/5214a74c3711bf9759192f873b62b025317932d7/static/fonts/glyphicons-halflings-regular.ttf
--------------------------------------------------------------------------------
/static/fonts/glyphicons-halflings-regular.woff:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/zachwill/flask_heroku/5214a74c3711bf9759192f873b62b025317932d7/static/fonts/glyphicons-halflings-regular.woff
--------------------------------------------------------------------------------
/static/img/octocat.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/zachwill/flask_heroku/5214a74c3711bf9759192f873b62b025317932d7/static/img/octocat.png
--------------------------------------------------------------------------------
/static/robots.txt:
--------------------------------------------------------------------------------
1 | # www.robotstxt.org/
2 | # www.google.com/support/webmasters/bin/answer.py?hl=en&answer=156449
3 |
4 | User-agent: *
5 |
--------------------------------------------------------------------------------
/templates/404.html:
--------------------------------------------------------------------------------
1 | {% extends "base.html" %}
2 |
3 | {% block title %}Page Not Found{% endblock %}
4 |
5 | {% block css %}
6 |
22 | {% endblock %}
23 |
24 | {% block main %}
25 |
404
26 |
That page doesn't even exist.
27 |
Why don't you just go back home ?
28 | {% endblock %}
29 |
--------------------------------------------------------------------------------
/templates/_form_helpers.html:
--------------------------------------------------------------------------------
1 | {% macro render_field(field) %}
2 |
3 | {{ field.label }}
4 |
5 | {{ field(**kwargs)|safe }}
6 | {% if field.errors %}
7 |
8 |
9 | {% for error in field.errors %}
10 | {{ error }}
11 | {% endfor %}
12 |
13 | {% endif %}
14 |
15 | {% endmacro %}
16 |
--------------------------------------------------------------------------------
/templates/about.html:
--------------------------------------------------------------------------------
1 | {% extends "base.html" %}
2 |
3 |
4 | {% block js %}
5 | {% endblock %}
6 |
7 |
8 | {% block main %}
9 | {% endblock %}
10 |
--------------------------------------------------------------------------------
/templates/base.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
{% block title %}yoursite.com{% endblock %}
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
17 |
18 |
19 |
20 |
21 | {% block css %}{% endblock %}
22 |
23 |
24 |
25 |
26 |
27 |
28 |
29 |
30 |
31 |
32 |
33 |
34 |
35 | {% include "header.html" %}
36 |
37 |
38 |
39 | {% block main %}{% endblock %}
40 |
41 |
42 |
43 | {% include "footer.html" %}
44 |
45 |
46 |
47 |
48 |
49 |
50 |
51 |
52 |
53 |
54 |
55 | {% block js %}{% endblock %}
56 |
57 |
58 |
59 |
65 |
66 |
67 |
68 |
72 |
73 |
74 |
75 |
--------------------------------------------------------------------------------
/templates/footer.html:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/zachwill/flask_heroku/5214a74c3711bf9759192f873b62b025317932d7/templates/footer.html
--------------------------------------------------------------------------------
/templates/header.html:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/zachwill/flask_heroku/5214a74c3711bf9759192f873b62b025317932d7/templates/header.html
--------------------------------------------------------------------------------
/templates/home.html:
--------------------------------------------------------------------------------
1 | {% extends "base.html" %}
2 |
3 |
4 | {% block js %}
5 | {% endblock %}
6 |
7 |
8 | {% block main %}
9 | {% endblock %}
10 |
--------------------------------------------------------------------------------
/test.py:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env python
2 |
3 | """Tests for the Flask Heroku template."""
4 |
5 | import unittest
6 | from app import app
7 |
8 |
9 | class TestApp(unittest.TestCase):
10 |
11 | def setUp(self):
12 | self.app = app.test_client()
13 |
14 | def test_home_page_works(self):
15 | rv = self.app.get('/')
16 | self.assertTrue(rv.data)
17 | self.assertEqual(rv.status_code, 200)
18 |
19 | def test_about_page_works(self):
20 | rv = self.app.get('/about/')
21 | self.assertTrue(rv.data)
22 | self.assertEqual(rv.status_code, 200)
23 |
24 | def test_default_redirecting(self):
25 | rv = self.app.get('/about')
26 | self.assertEqual(rv.status_code, 301)
27 |
28 | def test_404_page(self):
29 | rv = self.app.get('/i-am-not-found/')
30 | self.assertEqual(rv.status_code, 404)
31 |
32 | def test_static_text_file_request(self):
33 | rv = self.app.get('/robots.txt')
34 | self.assertTrue(rv.data)
35 | self.assertEqual(rv.status_code, 200)
36 | rv.close()
37 |
38 |
39 | if __name__ == '__main__':
40 | unittest.main()
41 |
--------------------------------------------------------------------------------