.
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 | @include border-top-radius($list-group-border-radius);
29 | }
30 | &:last-child {
31 | margin-bottom: 0;
32 | @include 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 | // [converter] extracted a& to a.list-group-item
44 |
45 | // Active class on item itself, not parent
46 | &.active,
47 | &.active:hover,
48 | &.active:focus {
49 | z-index: 2; // Place active items above their siblings for proper border styling
50 | color: $list-group-active-color;
51 | background-color: $list-group-active-bg;
52 | border-color: $list-group-active-border;
53 |
54 | // Force color to inherit for custom content
55 | .list-group-item-heading {
56 | color: inherit;
57 | }
58 | .list-group-item-text {
59 | color: lighten($list-group-active-bg, 40%);
60 | }
61 | }
62 | }
63 |
64 | // Linked list items
65 | a.list-group-item {
66 | color: $list-group-link-color;
67 |
68 | .list-group-item-heading {
69 | color: $list-group-link-heading-color;
70 | }
71 |
72 | // Hover state
73 | &:hover,
74 | &:focus {
75 | text-decoration: none;
76 | background-color: $list-group-hover-bg;
77 | }
78 | }
79 |
80 | // Custom content options
81 | // -------------------------
82 |
83 | .list-group-item-heading {
84 | margin-top: 0;
85 | margin-bottom: 5px;
86 | }
87 | .list-group-item-text {
88 | margin-bottom: 0;
89 | line-height: 1.3;
90 | }
91 |
--------------------------------------------------------------------------------
/client/styles/bootstrap/_media.scss:
--------------------------------------------------------------------------------
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 |
--------------------------------------------------------------------------------
/client/styles/bootstrap/_modals.scss:
--------------------------------------------------------------------------------
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 |
17 | .navbar-fixed-top,
18 | .navbar-fixed-bottom {
19 | margin-right: 15px
20 | }
21 | // [converter] extracted body& to body.modal-open
22 | }
23 |
24 | body.modal-open {
25 | margin-right: 15px
26 | }
27 |
28 | // Container that the modal scrolls within
29 | .modal {
30 | display: none;
31 | overflow: auto;
32 | overflow-y: scroll;
33 | position: fixed;
34 | top: 0;
35 | right: 0;
36 | bottom: 0;
37 | left: 0;
38 | z-index: $zindex-modal-background;
39 |
40 | // When fading in the modal, animate it to slide down
41 | &.fade .modal-dialog {
42 | @include translate(0, -25%);
43 | @include transition-transform(0.3s ease-out);
44 | }
45 | &.in .modal-dialog { @include translate(0, 0)}
46 | }
47 |
48 | // Shell div to position the modal with bottom padding
49 | .modal-dialog {
50 | margin-left: auto;
51 | margin-right: auto;
52 | width: auto;
53 | padding: 10px;
54 | z-index: ($zindex-modal-background + 10);
55 | }
56 |
57 | // Actual modal
58 | .modal-content {
59 | position: relative;
60 | background-color: $modal-content-bg;
61 | border: 1px solid $modal-content-fallback-border-color; //old browsers fallback (ie8 etc)
62 | border: 1px solid $modal-content-border-color;
63 | border-radius: $border-radius-large;
64 | @include box-shadow(0 3px 9px rgba(0,0,0,.5));
65 | background-clip: padding-box;
66 | // Remove focus outline from opened modal
67 | outline: none;
68 | }
69 |
70 | // Modal background
71 | .modal-backdrop {
72 | position: fixed;
73 | top: 0;
74 | right: 0;
75 | bottom: 0;
76 | left: 0;
77 | z-index: ($zindex-modal-background - 10);
78 | background-color: $modal-backdrop-bg;
79 | // Fade for backdrop
80 | &.fade { @include opacity(0); }
81 | &.in { @include opacity(.5); }
82 | }
83 |
84 | // Modal header
85 | // Top section of the modal w/ title and dismiss
86 | .modal-header {
87 | padding: $modal-title-padding;
88 | border-bottom: 1px solid $modal-header-border-color;
89 | min-height: ($modal-title-padding + $modal-title-line-height);
90 | }
91 | // Close icon
92 | .modal-header .close {
93 | margin-top: -2px;
94 | }
95 |
96 | // Title text within header
97 | .modal-title {
98 | margin: 0;
99 | line-height: $modal-title-line-height;
100 | }
101 |
102 | // Modal body
103 | // Where all modal content resides (sibling of .modal-header and .modal-footer)
104 | .modal-body {
105 | position: relative;
106 | padding: $modal-inner-padding;
107 | }
108 |
109 | // Footer (for actions)
110 | .modal-footer {
111 | margin-top: 15px;
112 | padding: ($modal-inner-padding - 1) $modal-inner-padding $modal-inner-padding;
113 | text-align: right; // right align buttons
114 | border-top: 1px solid $modal-footer-border-color;
115 | @include clearfix(); // clear it in case folks use .pull-* classes on buttons
116 |
117 | // Properly space out buttons
118 | .btn + .btn {
119 | margin-left: 5px;
120 | margin-bottom: 0; // account for input[type="submit"] which gets the bottom margin like all other inputs
121 | }
122 | // but override that for button groups
123 | .btn-group .btn + .btn {
124 | margin-left: -1px;
125 | }
126 | // and override it for block buttons as well
127 | .btn-block + .btn-block {
128 | margin-left: 0;
129 | }
130 | }
131 |
132 | // Scale up the modal
133 | @media screen and (min-width: $screen-tablet) {
134 |
135 | .modal-dialog {
136 | left: 50%;
137 | right: auto;
138 | width: 600px;
139 | padding-top: 30px;
140 | padding-bottom: 30px;
141 | }
142 | .modal-content {
143 | @include box-shadow(0 5px 15px rgba(0,0,0,.5));
144 | }
145 |
146 | }
147 |
--------------------------------------------------------------------------------
/client/styles/bootstrap/_navbar.scss:
--------------------------------------------------------------------------------
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 | box-shadow: 0 -5px 5px rgba(0,0,0,.9);
18 |
19 | // Prevent floats from breaking the navbar
20 | @include clearfix();
21 |
22 | @media (min-width: $grid-float-breakpoint) {
23 | border-radius: $navbar-border-radius;
24 | }
25 | }
26 |
27 |
28 | // Navbar heading
29 | //
30 | // Groups `.navbar-brand` and `.navbar-toggle` into a single component for easy
31 | // styling of responsive aspects.
32 |
33 | .navbar-header {
34 | @include clearfix();
35 |
36 | @media (min-width: $grid-float-breakpoint) {
37 | float: left;
38 | }
39 | }
40 |
41 |
42 | // Navbar collapse (body)
43 | //
44 | // Group your navbar content into this for easy collapsing and expanding across
45 | // various device sizes. By default, this content is collapsed when <768px, but
46 | // will expand past that for a horizontal display.
47 | //
48 | // To start (on mobile devices) the navbar links, forms, and buttons are stacked
49 | // vertically and include a `max-height` to overflow in case you have too much
50 | // content for the user's viewport.
51 |
52 | .navbar-collapse {
53 | max-height: 340px;
54 | overflow-x: visible;
55 | padding-right: $navbar-padding-horizontal;
56 | padding-left: $navbar-padding-horizontal;
57 | border-top: 1px solid transparent;
58 | box-shadow: inset 0 1px 0 rgba(255,255,255,.1);
59 | @include clearfix();
60 | -webkit-overflow-scrolling: touch;
61 |
62 | &.in {
63 | overflow-y: auto;
64 | }
65 |
66 | @media (min-width: $grid-float-breakpoint) {
67 | width: auto;
68 | border-top: 0;
69 | box-shadow: none;
70 |
71 | &.collapse {
72 | display: block !important;
73 | height: auto !important;
74 | padding-bottom: 0; // Override default setting
75 | overflow: visible !important;
76 | }
77 |
78 | &.in {
79 | overflow-y: visible;
80 | }
81 |
82 | // Account for first and last children spacing
83 | .navbar-nav.navbar-left:first-child {
84 | margin-left: -$navbar-padding-horizontal;
85 | }
86 | .navbar-nav.navbar-right:last-child {
87 | margin-right: -$navbar-padding-horizontal;
88 | }
89 | .navbar-text:last-child {
90 | margin-right: 0;
91 | }
92 | }
93 | }
94 |
95 |
96 | // Both navbar header and collapse
97 | //
98 | // When a container is present, change the behavior of the header and collapse.
99 |
100 | .container > .navbar-header,
101 | .container > .navbar-collapse {
102 | margin-right: -$navbar-padding-horizontal;
103 | margin-left: -$navbar-padding-horizontal;
104 |
105 | @media (min-width: $grid-float-breakpoint) {
106 | margin-right: 0;
107 | margin-left: 0;
108 | }
109 | }
110 |
111 |
112 | //
113 | // Navbar alignment options
114 | //
115 | // Display the navbar across the entirity of the page or fixed it to the top or
116 | // bottom of the page.
117 |
118 | // Static top (unfixed, but 100% wide) navbar
119 | .navbar-static-top {
120 | border-width: 0 0 1px;
121 | @media (min-width: $grid-float-breakpoint) {
122 | border-radius: 0;
123 | }
124 | }
125 |
126 | // Fix the top/bottom navbars when screen real estate supports it
127 | .navbar-fixed-top,
128 | .navbar-fixed-bottom {
129 | position: fixed;
130 | right: 0;
131 | left: 0;
132 | border-width: 0 0 1px;
133 |
134 | // Undo the rounded corners
135 | @media (min-width: $grid-float-breakpoint) {
136 | border-radius: 0;
137 | }
138 | }
139 | .navbar-fixed-top {
140 | z-index: $zindex-navbar-fixed;
141 | top: 0;
142 | }
143 | .navbar-fixed-bottom {
144 | bottom: 0;
145 | margin-bottom: 0; // override .navbar defaults
146 | }
147 |
148 |
149 | // Brand/project name
150 |
151 | .navbar-brand {
152 | float: left;
153 | padding: $navbar-padding-vertical $navbar-padding-horizontal;
154 | font-size: $font-size-large;
155 | line-height: $line-height-computed;
156 | &:hover,
157 | &:focus {
158 | text-decoration: none;
159 | }
160 |
161 | @media (min-width: $grid-float-breakpoint) {
162 | .navbar > .container & {
163 | margin-left: -$navbar-padding-horizontal;
164 | }
165 | }
166 | }
167 |
168 |
169 | // Navbar toggle
170 | //
171 | // Custom button for toggling the `.navbar-collapse`, powered by the collapse
172 | // JavaScript plugin.
173 |
174 | .navbar-toggle {
175 | position: relative;
176 | float: right;
177 | margin-right: $navbar-padding-horizontal;
178 | padding: 9px 10px;
179 | @include navbar-vertical-align(34px);
180 | background-color: transparent;
181 | border: 1px solid transparent;
182 | border-radius: $border-radius-base;
183 |
184 | // Bars
185 | .icon-bar {
186 | display: block;
187 | width: 22px;
188 | height: 2px;
189 | border-radius: 1px;
190 | }
191 | .icon-bar + .icon-bar {
192 | margin-top: 4px;
193 | }
194 |
195 | @media (min-width: $grid-float-breakpoint) {
196 | display: none;
197 | }
198 | }
199 |
200 |
201 | // Navbar nav links
202 | //
203 | // Builds on top of the `.nav` components with it's own modifier class to make
204 | // the nav the full height of the horizontal nav (above 768px).
205 |
206 | .navbar-nav {
207 | margin: ($navbar-padding-vertical / 2) (-$navbar-padding-horizontal);
208 |
209 | > li > a {
210 | padding-top: 10px;
211 | padding-bottom: 10px;
212 | line-height: $line-height-computed;
213 | }
214 |
215 | @media (max-width: $screen-xs-max) {
216 | // Dropdowns get custom display when collapsed
217 | .open .dropdown-menu {
218 | position: static;
219 | float: none;
220 | width: auto;
221 | margin-top: 0;
222 | background-color: transparent;
223 | border: 0;
224 | box-shadow: none;
225 | > li > a,
226 | .dropdown-header {
227 | padding: 5px 15px 5px 25px;
228 | }
229 | > li > a {
230 | line-height: $line-height-computed;
231 | &:hover,
232 | &:focus {
233 | background-image: none;
234 | }
235 | }
236 | }
237 | }
238 |
239 | // Uncollapse the nav
240 | @media (min-width: $grid-float-breakpoint) {
241 | float: left;
242 | margin: 0;
243 |
244 | > li {
245 | float: left;
246 | > a {
247 | padding-top: (($navbar-height - $line-height-computed) / 2);
248 | padding-bottom: (($navbar-height - $line-height-computed) / 2);
249 | }
250 | }
251 | }
252 |
253 | }
254 |
255 |
256 | // Component alignment
257 | //
258 | // Repurpose the pull utilities as their own navbar utilities to avoid specifity
259 | // issues with parents and chaining. Only do this when the navbar is uncollapsed
260 | // though so that navbar contents properly stack and align in mobile.
261 |
262 | @media (min-width: $grid-float-breakpoint) {
263 | .navbar-left {
264 | float: left !important;
265 | }
266 | .navbar-right {
267 | float: right !important;
268 | }
269 | }
270 |
271 |
272 | // Navbar form
273 | //
274 | // Extension of the `.form-inline` with some extra flavor for optimum display in
275 | // our navbars.
276 |
277 | .navbar-form {
278 | margin-left: -$navbar-padding-horizontal;
279 | margin-right: -$navbar-padding-horizontal;
280 | padding: 10px $navbar-padding-horizontal;
281 | border-top: 1px solid transparent;
282 | border-bottom: 1px solid transparent;
283 | $shadow: inset 0 1px 0 rgba(255,255,255,.1), 0 1px 0 rgba(255,255,255,.1);
284 | @include box-shadow($shadow);
285 |
286 | // Mixin behavior for optimum display
287 | @extend .form-inline;
288 |
289 | .form-group {
290 | @media (max-width: $screen-xs-max) {
291 | margin-bottom: 5px;
292 | }
293 | }
294 |
295 | // Vertically center in expanded, horizontal navbar
296 | @include navbar-vertical-align($input-height-base);
297 |
298 | // Undo 100% width for pull classes
299 | @media (min-width: $grid-float-breakpoint) {
300 | width: auto;
301 | border: 0;
302 | margin-left: 0;
303 | margin-right: 0;
304 | padding-top: 0;
305 | padding-bottom: 0;
306 | @include box-shadow(none);
307 | }
308 | }
309 |
310 |
311 | // Dropdown menus
312 |
313 | // Menu position and menu carets
314 | .navbar-nav > li > .dropdown-menu {
315 | margin-top: 0;
316 | @include border-top-radius(0);
317 | }
318 | // Menu position and menu caret support for dropups via extra dropup class
319 | .navbar-fixed-bottom .navbar-nav > li > .dropdown-menu {
320 | @include border-bottom-radius(0);
321 | }
322 |
323 | // Right aligned menus need alt position
324 | .navbar-nav.pull-right > li > .dropdown-menu,
325 | .navbar-nav > li > .dropdown-menu.pull-right {
326 | left: auto;
327 | right: 0;
328 | }
329 |
330 |
331 | // Buttons in navbars
332 | //
333 | // Vertically center a button within a navbar (when *not* in a form).
334 |
335 | .navbar-btn {
336 | @include navbar-vertical-align($input-height-base);
337 | }
338 |
339 |
340 | // Text in navbars
341 | //
342 | // Add a class to make any element properly align itself vertically within the navbars.
343 |
344 | .navbar-text {
345 | float: left;
346 | @include navbar-vertical-align($line-height-computed);
347 |
348 | @media (min-width: $grid-float-breakpoint) {
349 | margin-left: $navbar-padding-horizontal;
350 | margin-right: $navbar-padding-horizontal;
351 | }
352 | }
353 |
354 | // Alternate navbars
355 | // --------------------------------------------------
356 |
357 | // Default navbar
358 | .navbar-default {
359 | background-color: $navbar-default-bg;
360 | border-color: $navbar-default-border;
361 |
362 | .navbar-brand {
363 | color: $navbar-default-brand-color;
364 | &:hover,
365 | &:focus {
366 | color: $navbar-default-brand-hover-color;
367 | background-color: $navbar-default-brand-hover-bg;
368 | }
369 | }
370 |
371 | .navbar-text {
372 | color: $navbar-default-color;
373 | }
374 |
375 | .navbar-nav {
376 | > li > a {
377 | color: $navbar-default-link-color;
378 |
379 | &:hover,
380 | &:focus {
381 | color: $navbar-default-link-hover-color;
382 | background-color: $navbar-default-link-hover-bg;
383 | }
384 | }
385 | > .active > a {
386 | &,
387 | &:hover,
388 | &:focus {
389 | color: $navbar-default-link-active-color;
390 | background-color: $navbar-default-link-active-bg;
391 | }
392 | }
393 | > .disabled > a {
394 | &,
395 | &:hover,
396 | &:focus {
397 | color: $navbar-default-link-disabled-color;
398 | background-color: $navbar-default-link-disabled-bg;
399 | }
400 | }
401 | }
402 |
403 | .navbar-toggle {
404 | border-color: $navbar-default-toggle-border-color;
405 | &:hover,
406 | &:focus {
407 | background-color: $navbar-default-toggle-hover-bg;
408 | }
409 | .icon-bar {
410 | background-color: $navbar-default-toggle-icon-bar-bg;
411 | }
412 | }
413 |
414 | .navbar-collapse,
415 | .navbar-form {
416 | border-color: darken($navbar-default-bg, 7%);
417 | }
418 |
419 | // Dropdown menu items and carets
420 | .navbar-nav {
421 | // Caret should match text color on hover
422 | > .dropdown > a:hover .caret,
423 | > .dropdown > a:focus .caret {
424 | border-top-color: $navbar-default-link-hover-color;
425 | border-bottom-color: $navbar-default-link-hover-color;
426 | }
427 |
428 | // Remove background color from open dropdown
429 | > .open > a {
430 | &,
431 | &:hover,
432 | &:focus {
433 | background-color: $navbar-default-link-active-bg;
434 | color: $navbar-default-link-active-color;
435 | .caret {
436 | border-top-color: $navbar-default-link-active-color;
437 | border-bottom-color: $navbar-default-link-active-color;
438 | }
439 | }
440 | }
441 | > .dropdown > a .caret {
442 | border-top-color: $navbar-default-link-color;
443 | border-bottom-color: $navbar-default-link-color;
444 | }
445 |
446 |
447 | @media (max-width: $screen-xs-max) {
448 | // Dropdowns get custom display when collapsed
449 | .open .dropdown-menu {
450 | > li > a {
451 | color: $navbar-default-link-color;
452 | &:hover,
453 | &:focus {
454 | color: $navbar-default-link-hover-color;
455 | background-color: $navbar-default-link-hover-bg;
456 | }
457 | }
458 | > .active > a {
459 | &,
460 | &:hover,
461 | &:focus {
462 | color: $navbar-default-link-active-color;
463 | background-color: $navbar-default-link-active-bg;
464 | }
465 | }
466 | > .disabled > a {
467 | &,
468 | &:hover,
469 | &:focus {
470 | color: $navbar-default-link-disabled-color;
471 | background-color: $navbar-default-link-disabled-bg;
472 | }
473 | }
474 | }
475 | }
476 | }
477 |
478 |
479 | // Links in navbars
480 | //
481 | // Add a class to ensure links outside the navbar nav are colored correctly.
482 |
483 | .navbar-link {
484 | color: $navbar-default-link-color;
485 | &:hover {
486 | color: $navbar-default-link-hover-color;
487 | }
488 | }
489 |
490 | }
491 |
492 | // Inverse navbar
493 |
494 | .navbar-inverse {
495 | background-color: $navbar-inverse-bg;
496 | border-color: $navbar-inverse-border;
497 |
498 | .navbar-brand {
499 | color: $navbar-inverse-brand-color;
500 | &:hover,
501 | &:focus {
502 | color: $navbar-inverse-brand-hover-color;
503 | background-color: $navbar-inverse-brand-hover-bg;
504 | }
505 | }
506 |
507 | .navbar-text {
508 | color: $navbar-inverse-color;
509 | }
510 |
511 | .navbar-nav {
512 | > li > a {
513 | color: $navbar-inverse-link-color;
514 |
515 | &:hover,
516 | &:focus {
517 | color: $navbar-inverse-link-hover-color;
518 | background-color: $navbar-inverse-link-hover-bg;
519 | }
520 | }
521 | > .active > a {
522 | &,
523 | &:hover,
524 | &:focus {
525 | color: $navbar-inverse-link-active-color;
526 | background-color: $navbar-inverse-link-active-bg;
527 | }
528 | }
529 | > .disabled > a {
530 | &,
531 | &:hover,
532 | &:focus {
533 | color: $navbar-inverse-link-disabled-color;
534 | background-color: $navbar-inverse-link-disabled-bg;
535 | }
536 | }
537 | }
538 |
539 | // Darken the responsive nav toggle
540 | .navbar-toggle {
541 | border-color: $navbar-inverse-toggle-border-color;
542 | &:hover,
543 | &:focus {
544 | background-color: $navbar-inverse-toggle-hover-bg;
545 | }
546 | .icon-bar {
547 | background-color: $navbar-inverse-toggle-icon-bar-bg;
548 | }
549 | }
550 |
551 | .navbar-collapse,
552 | .navbar-form {
553 | border-color: darken($navbar-inverse-bg, 7%);
554 | }
555 |
556 | // Dropdowns
557 | .navbar-nav {
558 | > .open > a {
559 | &,
560 | &:hover,
561 | &:focus {
562 | background-color: $navbar-inverse-link-active-bg;
563 | color: $navbar-inverse-link-active-color;
564 | }
565 | }
566 | > .dropdown > a:hover .caret {
567 | border-top-color: $navbar-inverse-link-hover-color;
568 | border-bottom-color: $navbar-inverse-link-hover-color;
569 | }
570 | > .dropdown > a .caret {
571 | border-top-color: $navbar-inverse-link-color;
572 | border-bottom-color: $navbar-inverse-link-color;
573 | }
574 | > .open > a {
575 | &,
576 | &:hover,
577 | &:focus {
578 | .caret {
579 | border-top-color: $navbar-inverse-link-active-color;
580 | border-bottom-color: $navbar-inverse-link-active-color;
581 | }
582 | }
583 | }
584 |
585 | @media (max-width: $screen-xs-max) {
586 | // Dropdowns get custom display
587 | .open .dropdown-menu {
588 | > .dropdown-header {
589 | border-color: $navbar-inverse-border;
590 | }
591 | > li > a {
592 | color: $navbar-inverse-link-color;
593 | &:hover,
594 | &:focus {
595 | color: $navbar-inverse-link-hover-color;
596 | background-color: $navbar-inverse-link-hover-bg;
597 | }
598 | }
599 | > .active > a {
600 | &,
601 | &:hover,
602 | &:focus {
603 | color: $navbar-inverse-link-active-color;
604 | background-color: $navbar-inverse-link-active-bg;
605 | }
606 | }
607 | > .disabled > a {
608 | &,
609 | &:hover,
610 | &:focus {
611 | color: $navbar-inverse-link-disabled-color;
612 | background-color: $navbar-inverse-link-disabled-bg;
613 | }
614 | }
615 | }
616 | }
617 | }
618 |
619 | .navbar-link {
620 | color: $navbar-inverse-link-color;
621 | &:hover {
622 | color: $navbar-inverse-link-hover-color;
623 | }
624 | }
625 |
626 | }
627 |
--------------------------------------------------------------------------------
/client/styles/bootstrap/_navs.scss:
--------------------------------------------------------------------------------
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 | @include 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 | @include 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 | @extend .nav-justified;
105 | @extend .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 | @include 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 | @include border-top-radius(0);
229 | }
230 |
--------------------------------------------------------------------------------
/client/styles/bootstrap/_normalize.scss:
--------------------------------------------------------------------------------
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 |
--------------------------------------------------------------------------------
/client/styles/bootstrap/_pager.scss:
--------------------------------------------------------------------------------
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 | @include 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 |
--------------------------------------------------------------------------------
/client/styles/bootstrap/_pagination.scss:
--------------------------------------------------------------------------------
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 | @include border-left-radius($border-radius-base);
28 | }
29 | }
30 | &:last-child {
31 | > a,
32 | > span {
33 | @include 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 | @include pagination-size($padding-large-vertical, $padding-large-horizontal, $font-size-large, $border-radius-large);
78 | }
79 |
80 | // Small
81 | .pagination-sm {
82 | @include pagination-size($padding-small-vertical, $padding-small-horizontal, $font-size-small, $border-radius-small);
83 | }
84 |
--------------------------------------------------------------------------------
/client/styles/bootstrap/_panels.scss:
--------------------------------------------------------------------------------
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 | @include box-shadow(0 1px 1px rgba(0,0,0,.05));
13 | }
14 |
15 | // Panel contents
16 | .panel-body {
17 | padding: 15px;
18 | @include 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 | @include 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 | @include 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 | @include 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 | @include panel-variant($panel-default-border, $panel-default-text, $panel-default-heading-bg, $panel-default-border);
133 | }
134 | .panel-primary {
135 | @include panel-variant($panel-primary-border, $panel-primary-text, $panel-primary-heading-bg, $panel-primary-border);
136 | }
137 | .panel-success {
138 | @include panel-variant($panel-success-border, $panel-success-text, $panel-success-heading-bg, $panel-success-border);
139 | }
140 | .panel-warning {
141 | @include panel-variant($panel-warning-border, $panel-warning-text, $panel-warning-heading-bg, $panel-warning-border);
142 | }
143 | .panel-danger {
144 | @include panel-variant($panel-danger-border, $panel-danger-text, $panel-danger-heading-bg, $panel-danger-border);
145 | }
146 | .panel-info {
147 | @include panel-variant($panel-info-border, $panel-info-text, $panel-info-heading-bg, $panel-info-border);
148 | }
149 |
--------------------------------------------------------------------------------
/client/styles/bootstrap/_popovers.scss:
--------------------------------------------------------------------------------
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 | @include 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 |
--------------------------------------------------------------------------------
/client/styles/bootstrap/_print.scss:
--------------------------------------------------------------------------------
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 |
--------------------------------------------------------------------------------
/client/styles/bootstrap/_progress-bars.scss:
--------------------------------------------------------------------------------
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 | @include 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 | @include box-shadow(inset 0 -1px 0 rgba(0,0,0,.15));
58 | @include transition(width .6s ease);
59 | }
60 |
61 | // Striped bars
62 | .progress-striped .progress-bar {
63 | @include 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 | @include progress-bar-variant($progress-bar-success-bg);
83 | }
84 |
85 | .progress-bar-info {
86 | @include progress-bar-variant($progress-bar-info-bg);
87 | }
88 |
89 | .progress-bar-warning {
90 | @include progress-bar-variant($progress-bar-warning-bg);
91 | }
92 |
93 | .progress-bar-danger {
94 | @include progress-bar-variant($progress-bar-danger-bg);
95 | }
96 |
--------------------------------------------------------------------------------
/client/styles/bootstrap/_responsive-utilities.scss:
--------------------------------------------------------------------------------
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 | @include responsive-invisibility('.visible-xs');
39 | @media (max-width: $screen-xs-max) {
40 | @include responsive-visibility('.visible-xs');
41 | }
42 |
43 | @media (min-width: $screen-sm) and (max-width: $screen-sm-max) {
44 | @include responsive-visibility('.visible-xs.visible-sm');
45 | }
46 |
47 |
48 | @media (min-width: $screen-md) and (max-width: $screen-md-max) {
49 | @include responsive-visibility('.visible-xs.visible-md');
50 | }
51 |
52 |
53 | @media (min-width: $screen-lg) {
54 | @include responsive-visibility('.visible-xs.visible-lg');
55 | }
56 |
57 |
58 | @include responsive-invisibility('.visible-sm');
59 |
60 | @media (max-width: $screen-xs-max) {
61 | @include responsive-visibility('.visible-sm.visible-xs');
62 | }
63 |
64 | @media (min-width: $screen-sm) and (max-width: $screen-sm-max) {
65 | @include responsive-visibility('.visible-sm');
66 | }
67 |
68 | @media (min-width: $screen-md) and (max-width: $screen-md-max) {
69 | @include responsive-visibility('.visible-sm.visible-md');
70 | }
71 |
72 |
73 | @media (min-width: $screen-lg) {
74 | @include responsive-visibility('.visible-sm.visible-lg');
75 | }
76 |
77 |
78 | @include responsive-invisibility('.visible-md');
79 |
80 | @media (max-width: $screen-xs-max) {
81 | @include responsive-visibility('.visible-md.visible-xs');
82 | }
83 |
84 |
85 | @media (min-width: $screen-sm) and (max-width: $screen-sm-max) {
86 | @include responsive-visibility('.visible-md.visible-sm');
87 | }
88 |
89 | @media (min-width: $screen-md) and (max-width: $screen-md-max) {
90 | @include responsive-visibility('.visible-md');
91 | }
92 |
93 | @media (min-width: $screen-lg) {
94 | @include responsive-visibility('.visible-md.visible-lg');
95 | }
96 |
97 |
98 | @include responsive-invisibility('.visible-lg');
99 |
100 | @media (max-width: $screen-xs-max) {
101 | @include responsive-visibility('.visible-lg.visible-xs');
102 | }
103 |
104 |
105 | @media (min-width: $screen-sm) and (max-width: $screen-sm-max) {
106 | @include responsive-visibility('.visible-lg.visible-sm');
107 | }
108 |
109 |
110 | @media (min-width: $screen-md) and (max-width: $screen-md-max) {
111 | @include responsive-visibility('.visible-lg.visible-md');
112 | }
113 |
114 | @media (min-width: $screen-lg) {
115 | @include responsive-visibility('.visible-lg');
116 | }
117 |
118 | @include responsive-visibility('.hidden-xs');
119 | @media (max-width: $screen-xs-max) {
120 | @include responsive-invisibility('.hidden-xs');
121 | }
122 |
123 | @media (min-width: $screen-sm) and (max-width: $screen-sm-max) {
124 | @include responsive-invisibility('.hidden-xs.hidden-sm');
125 | }
126 |
127 |
128 | @media (min-width: $screen-md) and (max-width: $screen-md-max) {
129 | @include responsive-invisibility('.hidden-xs.hidden-md');
130 | }
131 |
132 |
133 | @media (min-width: $screen-lg) {
134 | @include responsive-invisibility('.hidden-xs.hidden-lg');
135 | }
136 |
137 |
138 | @include responsive-visibility('.hidden-sm');
139 |
140 | @media (max-width: $screen-xs-max) {
141 | @include responsive-invisibility('.hidden-sm.hidden-xs');
142 | }
143 |
144 | @media (min-width: $screen-sm) and (max-width: $screen-sm-max) {
145 | @include responsive-invisibility('.hidden-sm');
146 | }
147 |
148 | @media (min-width: $screen-md) and (max-width: $screen-md-max) {
149 | @include responsive-invisibility('.hidden-sm.hidden-md');
150 | }
151 |
152 |
153 | @media (min-width: $screen-lg) {
154 | @include responsive-invisibility('.hidden-sm.hidden-lg');
155 | }
156 |
157 |
158 | @include responsive-visibility('.hidden-md');
159 |
160 | @media (max-width: $screen-xs-max) {
161 | @include responsive-invisibility('.hidden-md.hidden-xs');
162 | }
163 |
164 |
165 | @media (min-width: $screen-sm) and (max-width: $screen-sm-max) {
166 | @include responsive-invisibility('.hidden-md.hidden-sm');
167 | }
168 |
169 | @media (min-width: $screen-md) and (max-width: $screen-md-max) {
170 | @include responsive-invisibility('.hidden-md');
171 | }
172 |
173 | @media (min-width: $screen-lg) {
174 | @include responsive-invisibility('.hidden-md.hidden-lg');
175 | }
176 |
177 |
178 | @include responsive-visibility('.hidden-lg');
179 |
180 | @media (max-width: $screen-xs-max) {
181 | @include responsive-invisibility('.hidden-lg.hidden-xs');
182 | }
183 |
184 |
185 | @media (min-width: $screen-sm) and (max-width: $screen-sm-max) {
186 | @include responsive-invisibility('.hidden-lg.hidden-sm');
187 | }
188 |
189 |
190 | @media (min-width: $screen-md) and (max-width: $screen-md-max) {
191 | @include responsive-invisibility('.hidden-lg.hidden-md');
192 | }
193 |
194 | @media (min-width: $screen-lg) {
195 | @include responsive-invisibility('.hidden-lg');
196 | }
197 |
198 | // Print utilities
199 |
200 | @include responsive-invisibility('.visible-print');
201 |
202 | @media print {
203 |
204 | @include responsive-visibility('.visible-print');
205 |
206 |
207 | @include responsive-invisibility('.hidden-print');
208 |
209 | }
210 |
--------------------------------------------------------------------------------
/client/styles/bootstrap/_scaffolding.scss:
--------------------------------------------------------------------------------
1 | //
2 | // Scaffolding
3 | // --------------------------------------------------
4 |
5 |
6 | // Reset the box-sizing
7 |
8 | *,
9 | *:before,
10 | *:after {
11 | @include 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 | @include 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 | @include 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 | @include transition(all .2s ease-in-out);
96 |
97 | // Keep them at most 100% wide
98 | @include 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 |
--------------------------------------------------------------------------------
/client/styles/bootstrap/_tables.scss:
--------------------------------------------------------------------------------
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 | @include table-row-variant('success', $state-success-bg, $state-success-border);
173 | @include table-row-variant('danger', $state-danger-bg, $state-danger-border);
174 | @include 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 |
--------------------------------------------------------------------------------
/client/styles/bootstrap/_theme.scss:
--------------------------------------------------------------------------------
1 |
2 | //
3 | // Load core variables and mixins
4 | // --------------------------------------------------
5 |
6 | @import "bootstrap/variables";
7 | @import "bootstrap/mixins";
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 | @include box-shadow($shadow);
25 |
26 | // Reset the shadow
27 | &:active,
28 | &.active {
29 | @include box-shadow(inset 0 3px 5px rgba(0,0,0,.125));
30 | }
31 | }
32 |
33 | // Mixin for generating new styles
34 | @mixin btn-styles($btn-color: #555) {
35 | @include 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 { @include btn-styles($btn-default-bg); text-shadow: 0 1px 0 #fff; border-color: #ccc; }
56 | .btn-primary { @include btn-styles($btn-primary-bg); }
57 | .btn-success { @include btn-styles($btn-success-bg); }
58 | .btn-warning { @include btn-styles($btn-warning-bg); }
59 | .btn-danger { @include btn-styles($btn-danger-bg); }
60 | .btn-info { @include btn-styles($btn-info-bg); }
61 |
62 |
63 |
64 | //
65 | // Images
66 | // --------------------------------------------------
67 |
68 | .thumbnail,
69 | .img-thumbnail {
70 | @include 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 | @include 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 | @include 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 | @include 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 | @include 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 | @include box-shadow($shadow);
142 | }
143 |
144 | // Mixin for generating new styles
145 | @mixin alert-styles($color) {
146 | @include 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 { @include alert-styles($alert-success-bg); }
152 | .alert-info { @include alert-styles($alert-info-bg); }
153 | .alert-warning { @include alert-styles($alert-warning-bg); }
154 | .alert-danger { @include alert-styles($alert-danger-bg); }
155 |
156 |
157 |
158 | //
159 | // Progress bars
160 | // --------------------------------------------------
161 |
162 | // Give the progress background some depth
163 | .progress {
164 | @include gradient-vertical($start-color: darken($progress-bg, 4%), $end-color: $progress-bg)
165 | }
166 |
167 | // Mixin for generating new styles
168 | @mixin progress-bar-styles($color) {
169 | @include gradient-vertical($start-color: $color, $end-color: darken($color, 10%));
170 | }
171 |
172 | // Apply the mixin to the progress bars
173 | .progress-bar { @include progress-bar-styles($progress-bar-bg); }
174 | .progress-bar-success { @include progress-bar-styles($progress-bar-success-bg); }
175 | .progress-bar-info { @include progress-bar-styles($progress-bar-info-bg); }
176 | .progress-bar-warning { @include progress-bar-styles($progress-bar-warning-bg); }
177 | .progress-bar-danger { @include 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 | @include 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 | @include 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 | @include box-shadow(0 1px 2px rgba(0,0,0,.05));
206 | }
207 |
208 | // Mixin for generating new styles
209 | @mixin panel-heading-styles($color) {
210 | @include 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 { @include panel-heading-styles($panel-default-heading-bg); }
215 | .panel-primary > .panel-heading { @include panel-heading-styles($panel-primary-heading-bg); }
216 | .panel-success > .panel-heading { @include panel-heading-styles($panel-success-heading-bg); }
217 | .panel-info > .panel-heading { @include panel-heading-styles($panel-info-heading-bg); }
218 | .panel-warning > .panel-heading { @include panel-heading-styles($panel-warning-heading-bg); }
219 | .panel-danger > .panel-heading { @include panel-heading-styles($panel-danger-heading-bg); }
220 |
221 |
222 |
223 | //
224 | // Wells
225 | // --------------------------------------------------
226 |
227 | .well {
228 | @include 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 | @include box-shadow($shadow);
232 | }
233 |
--------------------------------------------------------------------------------
/client/styles/bootstrap/_thumbnails.scss:
--------------------------------------------------------------------------------
1 | //
2 | // Thumbnails
3 | // --------------------------------------------------
4 |
5 |
6 | // Mixin and adjust the regular image class
7 | .thumbnail {
8 | @extend .img-thumbnail;
9 | display: block; // Override the inline-block from `.img-thumbnail`
10 |
11 | > img {
12 | @include 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 |
--------------------------------------------------------------------------------
/client/styles/bootstrap/_tooltip.scss:
--------------------------------------------------------------------------------
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 | @include opacity(0);
15 |
16 | &.in { @include 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 |
--------------------------------------------------------------------------------
/client/styles/bootstrap/_type.scss:
--------------------------------------------------------------------------------
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 | @extend .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 | @include text-overflow();
158 | }
159 | dd {
160 | margin-left: $component-offset-horizontal;
161 | @include 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 |
--------------------------------------------------------------------------------
/client/styles/bootstrap/_utilities.scss:
--------------------------------------------------------------------------------
1 | //
2 | // Utility classes
3 | // --------------------------------------------------
4 |
5 |
6 | // Floats
7 | // -------------------------
8 |
9 | .clearfix {
10 | @include 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 | @include hide-text();
34 | }
35 |
36 |
37 | // For Affix plugin
38 | // -------------------------
39 |
40 | .affix {
41 | position: fixed;
42 | }
43 |
--------------------------------------------------------------------------------
/client/styles/bootstrap/_wells.scss:
--------------------------------------------------------------------------------
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 | @include 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 |
--------------------------------------------------------------------------------
/client/styles/main.scss:
--------------------------------------------------------------------------------
1 | /*!
2 | * Bootstrap v3.0.0
3 | *
4 | * Copyright 2013 Twitter, Inc
5 | * Licensed under the Apache License v2.0
6 | * http://www.apache.org/licenses/LICENSE-2.0
7 | *
8 | * Designed and built with all the love in the world by @mdo and @fat.
9 | */
10 |
11 | // Core variables and mixins
12 | @import "bootstrap/variables";
13 | @import "bootstrap/mixins";
14 |
15 | // Reset
16 | @import "bootstrap/normalize";
17 | @import "bootstrap/print";
18 |
19 | // Core CSS
20 | @import "bootstrap/scaffolding";
21 | @import "bootstrap/type";
22 | @import "bootstrap/code";
23 | @import "bootstrap/grid";
24 | @import "bootstrap/tables";
25 | @import "bootstrap/forms";
26 | @import "bootstrap/buttons";
27 |
28 | // Components
29 | @import "bootstrap/component-animations";
30 | // @import "bootstrap/glyphicons";
31 | @import "bootstrap/dropdowns";
32 | @import "bootstrap/button-groups";
33 | @import "bootstrap/input-groups";
34 | @import "bootstrap/navs";
35 | @import "bootstrap/navbar";
36 | @import "bootstrap/breadcrumbs";
37 | @import "bootstrap/pagination";
38 | @import "bootstrap/pager";
39 | @import "bootstrap/labels";
40 | @import "bootstrap/badges";
41 | @import "bootstrap/jumbotron";
42 | @import "bootstrap/thumbnails";
43 | @import "bootstrap/alerts";
44 | @import "bootstrap/progress-bars";
45 | @import "bootstrap/media";
46 | @import "bootstrap/list-group";
47 | @import "bootstrap/panels";
48 | @import "bootstrap/wells";
49 | @import "bootstrap/close";
50 |
51 | // Components w/ JavaScript
52 | @import "bootstrap/modals";
53 | @import "bootstrap/tooltip";
54 | @import "bootstrap/popovers";
55 | @import "bootstrap/carousel";
56 |
57 | // test
58 | // Utility classes
59 | @import "bootstrap/utilities";
60 | @import "bootstrap/responsive-utilities";
61 |
62 |
63 | // Custom scss
64 | @import "feedly"
65 |
--------------------------------------------------------------------------------
/client/templates/aggregated-feed.html:
--------------------------------------------------------------------------------
1 |
2 |
3 | {{#each activities}}
4 | {{#if equals verb 'pin'}}
5 | {{> aggregated_pin}}
6 | {{else}}
7 | {{> aggregated_follow}}
8 | {{/if}}
9 | {{/each}}
10 |
11 |
12 |
13 |
14 |
77 |
78 |
79 |
80 |
116 |
--------------------------------------------------------------------------------
/client/templates/app-body.html:
--------------------------------------------------------------------------------
1 |
2 | {{> nav}}
3 |
4 |
5 |
6 |
7 |
8 |
Stream in action
9 |
10 | Welcome to the Pinterest esque example app.
11 |
12 | When you pin items on this trending page, you'll see them appear in the feeds of your followers.
13 | Pin a few items, follow some user from the People page and have a look at the Flat and Aggregated feed pages.
14 |
15 |
16 |
17 | GetStream
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 | {{> yield}}
28 |
29 |
30 |
--------------------------------------------------------------------------------
/client/templates/app-body.js:
--------------------------------------------------------------------------------
1 | Accounts.ui.config({
2 | passwordSignupFields: 'USERNAME_ONLY',
3 | requestPermissions: {
4 | github: ['user']
5 | },
6 | });
--------------------------------------------------------------------------------
/client/templates/feed.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | {{#each activities}}
5 | {{#if equals verb 'pin'}}
6 | {{> pin}}
7 | {{else}}
8 | {{> follow}}
9 | {{/if}}
10 | {{/each}}
11 |
12 |
13 |
14 |
15 |
16 | {{#if item}}
17 |
18 |
19 |
20 |
21 |
22 | {{#if item.message}}
23 |
24 | {{ item.message }}
25 |
26 | {{/if}}
27 |
28 |
51 |
55 |
56 | {{else}}
57 |
58 |
59 |
60 |
61 |
62 | Not enriched activity
63 |
64 |
65 |
75 |
76 | by ...
77 | ...
78 |
79 |
80 | {{/if}}
81 |
82 |
83 |
84 |
85 |
86 |
87 |
88 |
89 |
90 |
91 | {{ username actor }} followed {{ username target }}
92 |
93 |
94 |
98 |
99 |
100 |
--------------------------------------------------------------------------------
/client/templates/feed.js:
--------------------------------------------------------------------------------
1 | Template.pin.events({
2 | 'submit': function(event, template) {
3 | event.preventDefault();
4 |
5 | Meteor.call('pin', this.object.item._id);
6 | },
7 | });
8 |
--------------------------------------------------------------------------------
/client/templates/nav.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
40 |
41 |
42 |
43 |
44 | {{#if currentUser}}
45 |
46 |
47 | {{ username currentUser }}
48 |
49 |
53 |
54 | {{else}}
55 | {{> loginButtons}}
56 | {{/if}}
57 |
58 |
59 |
60 |
61 |
62 |
63 |
64 |
65 |
66 |
67 | {{ username lastFollower.actor }}{{#if more}} and {{ count }} more {{/if}} followed you
68 | {{ fromNow lastFollower.time}}
69 |
70 |
71 |
72 |
73 |
74 |
75 |
--------------------------------------------------------------------------------
/client/templates/nav.js:
--------------------------------------------------------------------------------
1 | Template.login.events({
2 | 'click #logout': function(e) {
3 | e.preventDefault();
4 |
5 | Meteor.logout();
6 | }
7 | });
8 |
9 | // Helper method to retrieve the reactive var set in the onCreated handler
10 | // notice that we can not access this.notification within the template's data context
11 | Template.nav.helpers({
12 | getNotification: function() {
13 | return Template.instance().notification.get();
14 | }
15 | });
16 |
17 | Template.nav.onCreated(function() {
18 | // Here we manage a subscription to a Stream feed not tied to one route
19 | // This subscription is made on each page including the 'nav' template
20 |
21 | this.notification = new ReactiveVar(); // Use reactive var to store value retrieved from the feed
22 |
23 | // To ensure the template is rerendered once a new notification is pushed to the server
24 | // we have to run the following code block in an autorun wrapper
25 | this.autorun(() => {
26 | // Subscribe to the feed we are interested in
27 | var sub = Meteor.subscribe('Stream.feeds.notification');
28 |
29 | if(sub.ready()) { // Check if the subscription is ready
30 | var notifications = Stream.feeds.notification.find().fetch();
31 |
32 | var notificationCount = Stream.feedManager.getNotificationFeedStats(Meteor.userId());
33 |
34 | if(notifications.length > 0 && notifications[0].activities) {
35 | // Update/set the reactive var (this will rerender the template)
36 | this.notification.set({
37 | lastFollower: notifications[0].activities[0],
38 | count: notifications.length - 1,
39 | more: notifications.length > 1,
40 | unread: notificationCount.unread,
41 | unseen: notificationCount.unseen,
42 | });
43 | }
44 | }
45 | });
46 | });
--------------------------------------------------------------------------------
/client/templates/people.html:
--------------------------------------------------------------------------------
1 |
2 | {{#each this}}
3 | {{> profile}}
4 | {{/each}}
5 |
6 |
7 |
8 |
9 |
10 |
11 |
Duis mollis, est non commodo luctus, nisi erat porttitor ligula, eget lacinia odio sem nec elit. Cras mattis consectetur purus sit amet fermentum. Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh.
12 | {{#unless showFeed}}
13 |
24 | {{/unless}}
25 |
26 | {{#if showFeed}}
27 |
28 |
29 | {{#each activities }}
30 | {{#if equals this.verb 'pin' }}
31 | {{> pin}}
32 | {{else}}
33 | {{> follow}}
34 | {{/if}}
35 | {{/each}}
36 |
37 |
38 | {{/if}}
39 |
--------------------------------------------------------------------------------
/client/templates/people.js:
--------------------------------------------------------------------------------
1 | Template.profile.events({
2 | 'submit': function(event, template) {
3 | event.preventDefault();
4 |
5 | Meteor.call('follow', this._id);
6 | },
7 | });
8 |
--------------------------------------------------------------------------------
/client/templates/trending.html:
--------------------------------------------------------------------------------
1 |
2 |
3 | {{#each this}}
4 | {{> item}}
5 | {{/each}}
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
33 |
36 |
37 |
--------------------------------------------------------------------------------
/client/templates/trending.js:
--------------------------------------------------------------------------------
1 | Template.item.events({
2 | 'submit': function(event, template) {
3 | event.preventDefault();
4 |
5 | Meteor.call('pin', this._id);
6 | },
7 | });
8 |
--------------------------------------------------------------------------------
/lib/collections.js:
--------------------------------------------------------------------------------
1 | // Create three monog collections to hold our app's data
2 | Items = new Mongo.Collection('items');
3 | Pins = new Mongo.Collection('pins');
4 | Follows = new Mongo.Collection('follows');
5 |
6 | // Register the Pins collection as an activity
7 | // This ensures that a message is send to the getstream.io api
8 | // on creation of new follow items in the database
9 | Stream.registerActivity(Pins, {
10 | activityVerb: 'pin', // Verb of the activity send to getstream.io
11 | activityActorProp: 'user', // The property that holds the user id to be used for activities actor property
12 | activityExtraData: function() { // Extra data set on activity send to getstream.io
13 | return { // this is used to setup the right publications on
14 | item: `items:${this.item}`, // subscription on a feed
15 | };
16 | },
17 | activityForeignId: function() { // Foreign id send to getsteam.io
18 | return this.user + ':' + this.item;
19 | },
20 | });
21 |
22 |
23 | // Register the Follow Mongo Collection as an activity
24 | // This ensures that a message is send to the getstream.io api
25 | // on creation of new follow items in the database
26 | Stream.registerActivity(Follows, {
27 | activityVerb: 'follow',
28 | activityActorProp: 'user',
29 |
30 | activityExtraData: function() {
31 | return {
32 | target: `users:${this.target}`,
33 | };
34 | },
35 |
36 | activityForeignId: function() {
37 | return this.user + ':' + this.target;
38 | },
39 |
40 | activityNotify: function() { // return a list of feed identifiers with this method
41 | if(Meteor.isServer) { // to automatically notify those feeds on an added
42 | // activity.
43 | targetFeed = Stream.feedManager.getNotificationFeed(this.target);
44 | return [targetFeed];
45 | }
46 | },
47 | });
48 |
49 | if (Meteor.isServer) {
50 |
51 | // When a new user is created the user automatically follows their own feed
52 | Meteor.users.after.insert(function(userId, doc) {
53 | var followData = {user: doc._id, target: doc._id};
54 |
55 | if (Follows.find(followData).count() === 0) {
56 | var record = Follows.insert(followData);
57 | }
58 | });
59 |
60 | // After a follow relation is created in our MongoDB signal the getstream.io
61 | // api to also create the follow relation between the feeds
62 | Follows.after.insert(function(userId, doc) {
63 | Stream.feedManager.followUser(doc.user, doc.target);
64 | });
65 |
66 | // After a follow relation is removed from the MongoDB signal the getstream.io
67 | // api to remove the follow relation
68 | Follows.before.remove(function(user, doc) {
69 | Stream.feedManager.unfollowUser(doc.user, doc.target);
70 | });
71 | }
72 |
73 |
--------------------------------------------------------------------------------
/lib/methods.js:
--------------------------------------------------------------------------------
1 | // Methods to pin an item or create a follow relation
2 | // these methods are run/(simulated) on the server and the client
3 | Meteor.methods({
4 | pin: function(itemId) {
5 | if (!this.userId) {
6 | throw new Error('not-authorized');
7 | }
8 |
9 | if (Pins.find({ user: this.userId, item: itemId }).count() > 0) {
10 | Pins.remove({ user: this.userId, item: itemId });
11 | } else {
12 | var item = Items.findOne({_id: itemId});
13 |
14 | if (item) {
15 | var pinData = {user: this.userId, item: itemId};
16 |
17 | Pins.insert(pinData);
18 | }
19 | }
20 | },
21 |
22 | follow: function(userId) {
23 | if (!this.userId) {
24 | throw new Error('not-authorized');
25 | }
26 |
27 | if (Follows.find({ user: this.userId, target: userId }).count() > 0) {
28 | Follows.remove({ user: this.userId, target: userId });
29 | } else {
30 | Follows.insert({ user: this.userId, target: userId });
31 | }
32 | },
33 | });
34 |
--------------------------------------------------------------------------------
/lib/router.js:
--------------------------------------------------------------------------------
1 | Router.configure({
2 | layoutTemplate: 'appBody',
3 | notFoundTemplate: 'appNotFound',
4 | });
5 |
6 | // Routes setup for this application the following routes use the getstream.io API:
7 | // - /flat
8 | // - /profile
9 | // - /profile/:_user
10 | // - /aggregated_feed
11 |
12 | // All routes use the notification feed, the code managing this feed can be found in
13 | // client/templates/nav.js
14 |
15 | Router.route('/', {
16 | name: 'trending',
17 | waitOn: function() {
18 | return [
19 | Meteor.subscribe('items'),
20 | Meteor.subscribe('pins'),
21 | ];
22 | },
23 |
24 | data: function() {
25 | var items = Items.find({}).map(item => {
26 | item.pinned = Pins.find({ user: Meteor.userId(), item: item._id }).count() > 0;
27 | return item;
28 | });
29 |
30 | return items;
31 | },
32 | });
33 |
34 | Router.route('/flat', {
35 | name: 'flat',
36 | template: 'feed',
37 |
38 | waitOn: function() {
39 | // All feed groups defined in your settings file have their own publication, by default:
40 | // feed group: 'flat', with feed type: flat
41 | // feed group: 'notification', with feed type: notification
42 | // feed group: 'user', with feed type: flat
43 | // feed group: 'aggregated', with feed type: aggregated
44 |
45 | // They are named Stream.feeds.feedGroupName
46 | // where feedGroupName is the name of a feed group
47 | return Meteor.subscribe('Stream.feeds.flat');
48 | },
49 |
50 | data: function() {
51 | // Check if all cursors published by the subscription to the flat feed are retrieved
52 | if(this.ready()) {
53 | // Publications add a feed activities to a collection stored in Stream.feeds
54 | // they are named by their feed group name (same as publications)
55 | var activities = Stream.feeds.flat.find().fetch();
56 |
57 | // The activities in the collection are automatically 'enriched' once retrieved from
58 | // the collection (i.e. fields on the activity referencing a MongoDB collection item are
59 | // automatically populated with the document retrieved from the database)
60 |
61 | return { activities };
62 | }
63 | },
64 | });
65 |
66 | Router.route('/profile', {
67 | name: 'profile',
68 | waitOn: function() {
69 | return Meteor.subscribe('Stream.feeds.user');
70 | },
71 |
72 | data: function() {
73 | if(this.ready()) {
74 | var user = Meteor.users.findOne(Meteor.userId());
75 |
76 | if(user) {
77 | user.showFeed = true;
78 | user.activities = Stream.feeds.user.find().fetch();
79 | }
80 |
81 | return user;
82 | }
83 | }
84 | });
85 |
86 | Router.route('/profile/:_user', {
87 | subscriptions: function() {
88 | return [
89 | Meteor.subscribe('users'),
90 | Meteor.subscribe('follows'),
91 | ];
92 | },
93 |
94 | onBeforeAction: function() {
95 | var username = this.params._user;
96 | var user = Meteor.users.findOne({ $or: [{username: username}, {"services.github.username": username}] });
97 |
98 | if(user) {
99 | // By default a subscription to a news feed subscribes to the feed of the current user
100 | // if we want to subscribe to a feed of a different user we can supply a user id as the
101 | // second parameter (the first parameter is amount of activities to retrieve from the feed
102 | // i.e. limit)
103 | this.subscribe('Stream.feeds.user', 20, user._id).wait();
104 | }
105 |
106 | this.next();
107 | },
108 |
109 | action: function() {
110 | var username = this.params._user;
111 | var user = Meteor.users.findOne({ $or: [{username: username}, {"services.github.username": username}] });
112 |
113 | if(user) {
114 | user.followed = Follows.find({ user: Meteor.userId(), target: user._id }).count() > 0;
115 | user.showFeed = true;
116 | user.activities = Stream.feeds.user.find().fetch();
117 | }
118 |
119 | this.render('profile', { data: user });
120 | },
121 |
122 | });
123 |
124 | Router.route('/people', {
125 | name: 'people',
126 | waitOn: function() {
127 | return [
128 | Meteor.subscribe('users', 100),
129 | Meteor.subscribe('follows'),
130 | ];
131 | },
132 |
133 | data: function() {
134 | var users = Meteor.users.find({}).fetch();
135 |
136 | for (var user of users) {
137 | user.followed = Follows.find({ user: Meteor.userId(), target: user._id }).count() > 0;
138 | }
139 |
140 | return users;
141 | },
142 | });
143 |
144 | Router.route('/aggregated_feed', {
145 | name: 'aggregated_feed',
146 | template: 'aggregated_feed',
147 |
148 | waitOn: function() {
149 | return Meteor.subscribe('Stream.feeds.aggregated');
150 | },
151 |
152 | data: function() {
153 | if(this.ready()) {
154 | var activities = Stream.feeds.aggregated.find().fetch();
155 |
156 | return { activities };
157 | }
158 | },
159 | });
160 |
--------------------------------------------------------------------------------
/public/fonts/glyphicons-halflings-regular.eot:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/GetStream/Stream-Example-Meteor/3a2639ac7814d19706a8fd1356aa51a96dcef02e/public/fonts/glyphicons-halflings-regular.eot
--------------------------------------------------------------------------------
/public/fonts/glyphicons-halflings-regular.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/GetStream/Stream-Example-Meteor/3a2639ac7814d19706a8fd1356aa51a96dcef02e/public/fonts/glyphicons-halflings-regular.ttf
--------------------------------------------------------------------------------
/public/fonts/glyphicons-halflings-regular.woff:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/GetStream/Stream-Example-Meteor/3a2639ac7814d19706a8fd1356aa51a96dcef02e/public/fonts/glyphicons-halflings-regular.woff
--------------------------------------------------------------------------------
/public/media/011.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/GetStream/Stream-Example-Meteor/3a2639ac7814d19706a8fd1356aa51a96dcef02e/public/media/011.jpg
--------------------------------------------------------------------------------
/public/media/144568575661705981_4ade117f9005.jpeg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/GetStream/Stream-Example-Meteor/3a2639ac7814d19706a8fd1356aa51a96dcef02e/public/media/144568575661705981_4ade117f9005.jpeg
--------------------------------------------------------------------------------
/public/media/164471358120532732_a3ae9498ad97.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/GetStream/Stream-Example-Meteor/3a2639ac7814d19706a8fd1356aa51a96dcef02e/public/media/164471358120532732_a3ae9498ad97.jpg
--------------------------------------------------------------------------------
/public/media/167111313523218252_a6046175bb32.jpeg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/GetStream/Stream-Example-Meteor/3a2639ac7814d19706a8fd1356aa51a96dcef02e/public/media/167111313523218252_a6046175bb32.jpeg
--------------------------------------------------------------------------------
/public/media/184290639033145973_71e492dacec6.jpeg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/GetStream/Stream-Example-Meteor/3a2639ac7814d19706a8fd1356aa51a96dcef02e/public/media/184290639033145973_71e492dacec6.jpeg
--------------------------------------------------------------------------------
/public/media/1addc6292e97f5f796cf368df5d4b322.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/GetStream/Stream-Example-Meteor/3a2639ac7814d19706a8fd1356aa51a96dcef02e/public/media/1addc6292e97f5f796cf368df5d4b322.jpg
--------------------------------------------------------------------------------
/public/media/261379381_d8fde25053fa.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/GetStream/Stream-Example-Meteor/3a2639ac7814d19706a8fd1356aa51a96dcef02e/public/media/261379381_d8fde25053fa.jpg
--------------------------------------------------------------------------------
/public/media/272236897059737539_c4806e0b14c4.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/GetStream/Stream-Example-Meteor/3a2639ac7814d19706a8fd1356aa51a96dcef02e/public/media/272236897059737539_c4806e0b14c4.jpg
--------------------------------------------------------------------------------
/public/media/275088534757448505_4f85768f71ec.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/GetStream/Stream-Example-Meteor/3a2639ac7814d19706a8fd1356aa51a96dcef02e/public/media/275088534757448505_4f85768f71ec.jpg
--------------------------------------------------------------------------------
/public/media/281485446934954481_c04cfc76c018.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/GetStream/Stream-Example-Meteor/3a2639ac7814d19706a8fd1356aa51a96dcef02e/public/media/281485446934954481_c04cfc76c018.png
--------------------------------------------------------------------------------
/public/media/293704645_b4c6dab8ed99.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/GetStream/Stream-Example-Meteor/3a2639ac7814d19706a8fd1356aa51a96dcef02e/public/media/293704645_b4c6dab8ed99.jpg
--------------------------------------------------------------------------------
/public/media/389230669370236857_335b7c698687.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/GetStream/Stream-Example-Meteor/3a2639ac7814d19706a8fd1356aa51a96dcef02e/public/media/389230669370236857_335b7c698687.jpg
--------------------------------------------------------------------------------
/public/media/6fb3f77d22ddc23305fcd1a2fd8c4e80.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/GetStream/Stream-Example-Meteor/3a2639ac7814d19706a8fd1356aa51a96dcef02e/public/media/6fb3f77d22ddc23305fcd1a2fd8c4e80.jpg
--------------------------------------------------------------------------------
/public/media/70602b9d4f965eee1d0345d99622798f.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/GetStream/Stream-Example-Meteor/3a2639ac7814d19706a8fd1356aa51a96dcef02e/public/media/70602b9d4f965eee1d0345d99622798f.jpg
--------------------------------------------------------------------------------
/public/media/73f98aae32e30a729bdf1031a78db65a.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/GetStream/Stream-Example-Meteor/3a2639ac7814d19706a8fd1356aa51a96dcef02e/public/media/73f98aae32e30a729bdf1031a78db65a.jpg
--------------------------------------------------------------------------------
/public/media/admin.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/GetStream/Stream-Example-Meteor/3a2639ac7814d19706a8fd1356aa51a96dcef02e/public/media/admin.jpg
--------------------------------------------------------------------------------
/public/media/e2110e4545f1cc11043659fdd9c07b43.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/GetStream/Stream-Example-Meteor/3a2639ac7814d19706a8fd1356aa51a96dcef02e/public/media/e2110e4545f1cc11043659fdd9c07b43.jpg
--------------------------------------------------------------------------------
/public/media/e315a43813c5533b9f47754406019e24.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/GetStream/Stream-Example-Meteor/3a2639ac7814d19706a8fd1356aa51a96dcef02e/public/media/e315a43813c5533b9f47754406019e24.jpg
--------------------------------------------------------------------------------
/server/bootstrap.js:
--------------------------------------------------------------------------------
1 | // Setup the initial data for our MongoDB
2 | Meteor.startup(function() {
3 | var Users = Meteor.users;
4 |
5 | if (Users.find().count() === 0) {
6 | var users = [
7 | {
8 | username: 'Andrew',
9 | profile: {
10 | avatar_url: 'https://github.com/identicons/jasonlong.png',
11 | name: 'Andrew',
12 | }
13 | },
14 | {
15 | username: 'Sergey',
16 | profile: {
17 | avatar_url: 'https://avatars0.githubusercontent.com/u/4436860?v=3&s=96',
18 | name: 'Sergey',
19 | },
20 | },
21 | {
22 | username: 'Thomas',
23 | profile: {
24 | avatar_url: 'https://avatars0.githubusercontent.com/u/125464?v=3&s=96',
25 | name: 'Thomas',
26 | },
27 | },
28 | ];
29 |
30 | for (var user of users) {
31 | Users.insert(user);
32 | }
33 |
34 | Users.insert({
35 | username: 'admin',
36 | profile: {
37 | name: 'admin',
38 | },
39 | avatar_url: 'https://avatars0.githubusercontent.com/u/4336861?v=3&s=96',
40 | }, function(err, _id) {
41 | if (Items.find().count() === 0) {
42 | var fs = Npm.require('fs'),
43 | path = Npm.require('path');
44 | var mediaFiles = fs.readdirSync(path.join(process.env.PWD, '/public/media/'));
45 |
46 | mediaFiles.forEach(function(fileName) {
47 | Items.insert({
48 | username: 'admin',
49 | image_url: fileName,
50 | });
51 | });
52 | }
53 | });
54 | }
55 |
56 | });
57 |
--------------------------------------------------------------------------------
/server/methods.js:
--------------------------------------------------------------------------------
1 | // Write server methods here
--------------------------------------------------------------------------------
/server/publish.js:
--------------------------------------------------------------------------------
1 | Meteor.publish('items', function(limit=20) {
2 | return Items.find({}, { limit: limit });
3 | });
4 |
5 | Meteor.publish('follows', function() {
6 | return Follows.find({ user: this.userId });
7 | });
8 |
9 | Meteor.publish('users', function(limit=20) {
10 | return Meteor.users.find({}, {
11 | limit: limit,
12 | fields: {
13 | 'services.github.username': 1,
14 | profile: 1,
15 | username: 1,
16 | emails: 1,
17 | }
18 | });
19 | });
20 |
21 | Meteor.publish('pins', function() {
22 | return Pins.find({ user: this.userId });
23 | });
--------------------------------------------------------------------------------
/settings.json:
--------------------------------------------------------------------------------
1 | {
2 | "streamApiSecret": "",
3 |
4 | "public" : {
5 | "streamApiKey": "",
6 |
7 | "streamApiAppId": ""
8 | }
9 | }
--------------------------------------------------------------------------------