.
9 |
10 | .list-group {
11 | // No need to set list-style: none; since .list-group-item is block level
12 | margin-bottom: 20px;
13 | padding-left: 0; // reset padding because ul and ol
14 | }
15 |
16 |
17 | // Individual list items
18 | //
19 | // Use on `li`s or `div`s within the `.list-group` parent.
20 |
21 | .list-group-item {
22 | position: relative;
23 | display: block;
24 | padding: 10px 15px;
25 | // Place the border on the list items and negative margin up for better styling
26 | margin-bottom: -1px;
27 | background-color: $list-group-bg;
28 | border: 1px solid $list-group-border;
29 |
30 | // Round the first and last items
31 | &:first-child {
32 | @include border-top-radius($list-group-border-radius);
33 | }
34 | &:last-child {
35 | margin-bottom: 0;
36 | @include border-bottom-radius($list-group-border-radius);
37 | }
38 | }
39 |
40 |
41 | // Interactive list items
42 | //
43 | // Use anchor or button elements instead of `li`s or `div`s to create interactive items.
44 | // Includes an extra `.active` modifier class for showing selected items.
45 |
46 | a.list-group-item,
47 | button.list-group-item {
48 | color: $list-group-link-color;
49 |
50 | .list-group-item-heading {
51 | color: $list-group-link-heading-color;
52 | }
53 |
54 | // Hover state
55 | &:hover,
56 | &:focus {
57 | text-decoration: none;
58 | color: $list-group-link-hover-color;
59 | background-color: $list-group-hover-bg;
60 | }
61 | }
62 |
63 | button.list-group-item {
64 | width: 100%;
65 | text-align: left;
66 | }
67 |
68 | .list-group-item {
69 | // Disabled state
70 | &.disabled,
71 | &.disabled:hover,
72 | &.disabled:focus {
73 | background-color: $list-group-disabled-bg;
74 | color: $list-group-disabled-color;
75 | cursor: $cursor-disabled;
76 |
77 | // Force color to inherit for custom content
78 | .list-group-item-heading {
79 | color: inherit;
80 | }
81 | .list-group-item-text {
82 | color: $list-group-disabled-text-color;
83 | }
84 | }
85 |
86 | // Active class on item itself, not parent
87 | &.active,
88 | &.active:hover,
89 | &.active:focus {
90 | z-index: 2; // Place active items above their siblings for proper border styling
91 | color: $list-group-active-color;
92 | background-color: $list-group-active-bg;
93 | border-color: $list-group-active-border;
94 |
95 | // Force color to inherit for custom content
96 | .list-group-item-heading,
97 | .list-group-item-heading > small,
98 | .list-group-item-heading > .small {
99 | color: inherit;
100 | }
101 | .list-group-item-text {
102 | color: $list-group-active-text-color;
103 | }
104 | }
105 | }
106 |
107 |
108 | // Contextual variants
109 | //
110 | // Add modifier classes to change text and background color on individual items.
111 | // Organizationally, this must come after the `:hover` states.
112 |
113 | @include list-group-item-variant(success, $state-success-bg, $state-success-text);
114 | @include list-group-item-variant(info, $state-info-bg, $state-info-text);
115 | @include list-group-item-variant(warning, $state-warning-bg, $state-warning-text);
116 | @include list-group-item-variant(danger, $state-danger-bg, $state-danger-text);
117 |
118 |
119 | // Custom content options
120 | //
121 | // Extra classes for creating well-formatted content within `.list-group-item`s.
122 |
123 | .list-group-item-heading {
124 | margin-top: 0;
125 | margin-bottom: 5px;
126 | }
127 | .list-group-item-text {
128 | margin-bottom: 0;
129 | line-height: 1.3;
130 | }
131 |
--------------------------------------------------------------------------------
/scss/vendor/bootstrap/bootstrap/_media.scss:
--------------------------------------------------------------------------------
1 | .media {
2 | // Proper spacing between instances of .media
3 | margin-top: 15px;
4 |
5 | &:first-child {
6 | margin-top: 0;
7 | }
8 | }
9 |
10 | .media,
11 | .media-body {
12 | zoom: 1;
13 | overflow: hidden;
14 | }
15 |
16 | .media-body {
17 | width: 10000px;
18 | }
19 |
20 | .media-object {
21 | display: block;
22 |
23 | // Fix collapse in webkit from max-width: 100% and display: table-cell.
24 | &.img-thumbnail {
25 | max-width: none;
26 | }
27 | }
28 |
29 | .media-right,
30 | .media > .pull-right {
31 | padding-left: 10px;
32 | }
33 |
34 | .media-left,
35 | .media > .pull-left {
36 | padding-right: 10px;
37 | }
38 |
39 | .media-left,
40 | .media-right,
41 | .media-body {
42 | display: table-cell;
43 | vertical-align: top;
44 | }
45 |
46 | .media-middle {
47 | vertical-align: middle;
48 | }
49 |
50 | .media-bottom {
51 | vertical-align: bottom;
52 | }
53 |
54 | // Reset margins on headings for tighter default spacing
55 | .media-heading {
56 | margin-top: 0;
57 | margin-bottom: 5px;
58 | }
59 |
60 | // Media list variation
61 | //
62 | // Undo default ul/ol styles
63 | .media-list {
64 | padding-left: 0;
65 | list-style: none;
66 | }
67 |
--------------------------------------------------------------------------------
/scss/vendor/bootstrap/bootstrap/_mixins.scss:
--------------------------------------------------------------------------------
1 | // Mixins
2 | // --------------------------------------------------
3 |
4 | // Utilities
5 | @import "mixins/hide-text";
6 | @import "mixins/opacity";
7 | @import "mixins/image";
8 | @import "mixins/labels";
9 | @import "mixins/reset-filter";
10 | @import "mixins/resize";
11 | @import "mixins/responsive-visibility";
12 | @import "mixins/size";
13 | @import "mixins/tab-focus";
14 | @import "mixins/reset-text";
15 | @import "mixins/text-emphasis";
16 | @import "mixins/text-overflow";
17 | @import "mixins/vendor-prefixes";
18 |
19 | // Components
20 | @import "mixins/alerts";
21 | @import "mixins/buttons";
22 | @import "mixins/panels";
23 | @import "mixins/pagination";
24 | @import "mixins/list-group";
25 | @import "mixins/nav-divider";
26 | @import "mixins/forms";
27 | @import "mixins/progress-bar";
28 | @import "mixins/table-row";
29 |
30 | // Skins
31 | @import "mixins/background-variant";
32 | @import "mixins/border-radius";
33 | @import "mixins/gradients";
34 |
35 | // Layout
36 | @import "mixins/clearfix";
37 | @import "mixins/center-block";
38 | @import "mixins/nav-vertical-align";
39 | @import "mixins/grid-framework";
40 | @import "mixins/grid";
41 |
--------------------------------------------------------------------------------
/scss/vendor/bootstrap/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 | // Container that the modal scrolls within
16 | .modal {
17 | display: none;
18 | overflow: hidden;
19 | position: fixed;
20 | top: 0;
21 | right: 0;
22 | bottom: 0;
23 | left: 0;
24 | z-index: $zindex-modal;
25 | -webkit-overflow-scrolling: touch;
26 |
27 | // Prevent Chrome on Windows from adding a focus outline. For details, see
28 | // https://github.com/twbs/bootstrap/pull/10951.
29 | outline: 0;
30 |
31 | // When fading in the modal, animate it to slide down
32 | &.fade .modal-dialog {
33 | @include translate(0, -25%);
34 | @include transition-transform(0.3s ease-out);
35 | }
36 | &.in .modal-dialog { @include translate(0, 0) }
37 | }
38 | .modal-open .modal {
39 | overflow-x: hidden;
40 | overflow-y: auto;
41 | }
42 |
43 | // Shell div to position the modal with bottom padding
44 | .modal-dialog {
45 | position: relative;
46 | width: auto;
47 | margin: 10px;
48 | }
49 |
50 | // Actual modal
51 | .modal-content {
52 | position: relative;
53 | background-color: $modal-content-bg;
54 | border: 1px solid $modal-content-fallback-border-color; //old browsers fallback (ie8 etc)
55 | border: 1px solid $modal-content-border-color;
56 | border-radius: $border-radius-large;
57 | @include box-shadow(0 3px 9px rgba(0,0,0,.5));
58 | background-clip: padding-box;
59 | // Remove focus outline from opened modal
60 | outline: 0;
61 | }
62 |
63 | // Modal background
64 | .modal-backdrop {
65 | position: fixed;
66 | top: 0;
67 | right: 0;
68 | bottom: 0;
69 | left: 0;
70 | z-index: $zindex-modal-background;
71 | background-color: $modal-backdrop-bg;
72 | // Fade for backdrop
73 | &.fade { @include opacity(0); }
74 | &.in { @include opacity($modal-backdrop-opacity); }
75 | }
76 |
77 | // Modal header
78 | // Top section of the modal w/ title and dismiss
79 | .modal-header {
80 | padding: $modal-title-padding;
81 | border-bottom: 1px solid $modal-header-border-color;
82 | @include clearfix;
83 | }
84 | // Close icon
85 | .modal-header .close {
86 | margin-top: -2px;
87 | }
88 |
89 | // Title text within header
90 | .modal-title {
91 | margin: 0;
92 | line-height: $modal-title-line-height;
93 | }
94 |
95 | // Modal body
96 | // Where all modal content resides (sibling of .modal-header and .modal-footer)
97 | .modal-body {
98 | position: relative;
99 | padding: $modal-inner-padding;
100 | }
101 |
102 | // Footer (for actions)
103 | .modal-footer {
104 | padding: $modal-inner-padding;
105 | text-align: right; // right align buttons
106 | border-top: 1px solid $modal-footer-border-color;
107 | @include clearfix; // clear it in case folks use .pull-* classes on buttons
108 |
109 | // Properly space out buttons
110 | .btn + .btn {
111 | margin-left: 5px;
112 | margin-bottom: 0; // account for input[type="submit"] which gets the bottom margin like all other inputs
113 | }
114 | // but override that for button groups
115 | .btn-group .btn + .btn {
116 | margin-left: -1px;
117 | }
118 | // and override it for block buttons as well
119 | .btn-block + .btn-block {
120 | margin-left: 0;
121 | }
122 | }
123 |
124 | // Measure scrollbar width for padding body during modal show/hide
125 | .modal-scrollbar-measure {
126 | position: absolute;
127 | top: -9999px;
128 | width: 50px;
129 | height: 50px;
130 | overflow: scroll;
131 | }
132 |
133 | // Scale up the modal
134 | @media (min-width: $screen-sm-min) {
135 | // Automatically set modal's width for larger viewports
136 | .modal-dialog {
137 | width: $modal-md;
138 | margin: 30px auto;
139 | }
140 | .modal-content {
141 | @include box-shadow(0 5px 15px rgba(0,0,0,.5));
142 | }
143 |
144 | // Modal sizes
145 | .modal-sm { width: $modal-sm; }
146 | }
147 |
148 | @media (min-width: $screen-md-min) {
149 | .modal-lg { width: $modal-lg; }
150 | }
151 |
--------------------------------------------------------------------------------
/scss/vendor/bootstrap/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: $pager-bg;
19 | border: 1px solid $pager-border;
20 | border-radius: $pager-border-radius;
21 | }
22 |
23 | > a:hover,
24 | > a:focus {
25 | text-decoration: none;
26 | background-color: $pager-hover-bg;
27 | }
28 | }
29 |
30 | .next {
31 | > a,
32 | > span {
33 | float: right;
34 | }
35 | }
36 |
37 | .previous {
38 | > a,
39 | > span {
40 | float: left;
41 | }
42 | }
43 |
44 | .disabled {
45 | > a,
46 | > a:hover,
47 | > a:focus,
48 | > span {
49 | color: $pager-disabled-color;
50 | background-color: $pager-bg;
51 | cursor: $cursor-disabled;
52 | }
53 | }
54 | }
55 |
--------------------------------------------------------------------------------
/scss/vendor/bootstrap/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 | color: $pagination-color;
20 | background-color: $pagination-bg;
21 | border: 1px solid $pagination-border;
22 | margin-left: -1px;
23 | }
24 | &:first-child {
25 | > a,
26 | > span {
27 | margin-left: 0;
28 | @include border-left-radius($border-radius-base);
29 | }
30 | }
31 | &:last-child {
32 | > a,
33 | > span {
34 | @include border-right-radius($border-radius-base);
35 | }
36 | }
37 | }
38 |
39 | > li > a,
40 | > li > span {
41 | &:hover,
42 | &:focus {
43 | z-index: 2;
44 | color: $pagination-hover-color;
45 | background-color: $pagination-hover-bg;
46 | border-color: $pagination-hover-border;
47 | }
48 | }
49 |
50 | > .active > a,
51 | > .active > span {
52 | &,
53 | &:hover,
54 | &:focus {
55 | z-index: 3;
56 | color: $pagination-active-color;
57 | background-color: $pagination-active-bg;
58 | border-color: $pagination-active-border;
59 | cursor: default;
60 | }
61 | }
62 |
63 | > .disabled {
64 | > span,
65 | > span:hover,
66 | > span:focus,
67 | > a,
68 | > a:hover,
69 | > a:focus {
70 | color: $pagination-disabled-color;
71 | background-color: $pagination-disabled-bg;
72 | border-color: $pagination-disabled-border;
73 | cursor: $cursor-disabled;
74 | }
75 | }
76 | }
77 |
78 | // Sizing
79 | // --------------------------------------------------
80 |
81 | // Large
82 | .pagination-lg {
83 | @include pagination-size($padding-large-vertical, $padding-large-horizontal, $font-size-large, $line-height-large, $border-radius-large);
84 | }
85 |
86 | // Small
87 | .pagination-sm {
88 | @include pagination-size($padding-small-vertical, $padding-small-horizontal, $font-size-small, $line-height-small, $border-radius-small);
89 | }
90 |
--------------------------------------------------------------------------------
/scss/vendor/bootstrap/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 | // Our parent element can be arbitrary since popovers are by default inserted as a sibling of their target element.
15 | // So reset our font and text properties to avoid inheriting weird values.
16 | @include reset-text;
17 | font-size: $font-size-base;
18 |
19 | background-color: $popover-bg;
20 | background-clip: padding-box;
21 | border: 1px solid $popover-fallback-border-color;
22 | border: 1px solid $popover-border-color;
23 | border-radius: $border-radius-large;
24 | @include box-shadow(0 5px 10px rgba(0,0,0,.2));
25 |
26 | // Offset the popover to account for the popover arrow
27 | &.top { margin-top: -$popover-arrow-width; }
28 | &.right { margin-left: $popover-arrow-width; }
29 | &.bottom { margin-top: $popover-arrow-width; }
30 | &.left { margin-left: -$popover-arrow-width; }
31 | }
32 |
33 | .popover-title {
34 | margin: 0; // reset heading margin
35 | padding: 8px 14px;
36 | font-size: $font-size-base;
37 | background-color: $popover-title-bg;
38 | border-bottom: 1px solid darken($popover-title-bg, 5%);
39 | border-radius: ($border-radius-large - 1) ($border-radius-large - 1) 0 0;
40 | }
41 |
42 | .popover-content {
43 | padding: 9px 14px;
44 | }
45 |
46 | // Arrows
47 | //
48 | // .arrow is outer, .arrow:after is inner
49 |
50 | .popover > .arrow {
51 | &,
52 | &:after {
53 | position: absolute;
54 | display: block;
55 | width: 0;
56 | height: 0;
57 | border-color: transparent;
58 | border-style: solid;
59 | }
60 | }
61 | .popover > .arrow {
62 | border-width: $popover-arrow-outer-width;
63 | }
64 | .popover > .arrow:after {
65 | border-width: $popover-arrow-width;
66 | content: "";
67 | }
68 |
69 | .popover {
70 | &.top > .arrow {
71 | left: 50%;
72 | margin-left: -$popover-arrow-outer-width;
73 | border-bottom-width: 0;
74 | border-top-color: $popover-arrow-outer-fallback-color; // IE8 fallback
75 | border-top-color: $popover-arrow-outer-color;
76 | bottom: -$popover-arrow-outer-width;
77 | &:after {
78 | content: " ";
79 | bottom: 1px;
80 | margin-left: -$popover-arrow-width;
81 | border-bottom-width: 0;
82 | border-top-color: $popover-arrow-color;
83 | }
84 | }
85 | &.right > .arrow {
86 | top: 50%;
87 | left: -$popover-arrow-outer-width;
88 | margin-top: -$popover-arrow-outer-width;
89 | border-left-width: 0;
90 | border-right-color: $popover-arrow-outer-fallback-color; // IE8 fallback
91 | border-right-color: $popover-arrow-outer-color;
92 | &:after {
93 | content: " ";
94 | left: 1px;
95 | bottom: -$popover-arrow-width;
96 | border-left-width: 0;
97 | border-right-color: $popover-arrow-color;
98 | }
99 | }
100 | &.bottom > .arrow {
101 | left: 50%;
102 | margin-left: -$popover-arrow-outer-width;
103 | border-top-width: 0;
104 | border-bottom-color: $popover-arrow-outer-fallback-color; // IE8 fallback
105 | border-bottom-color: $popover-arrow-outer-color;
106 | top: -$popover-arrow-outer-width;
107 | &:after {
108 | content: " ";
109 | top: 1px;
110 | margin-left: -$popover-arrow-width;
111 | border-top-width: 0;
112 | border-bottom-color: $popover-arrow-color;
113 | }
114 | }
115 |
116 | &.left > .arrow {
117 | top: 50%;
118 | right: -$popover-arrow-outer-width;
119 | margin-top: -$popover-arrow-outer-width;
120 | border-right-width: 0;
121 | border-left-color: $popover-arrow-outer-fallback-color; // IE8 fallback
122 | border-left-color: $popover-arrow-outer-color;
123 | &:after {
124 | content: " ";
125 | right: 1px;
126 | border-right-width: 0;
127 | border-left-color: $popover-arrow-color;
128 | bottom: -$popover-arrow-width;
129 | }
130 | }
131 | }
132 |
--------------------------------------------------------------------------------
/scss/vendor/bootstrap/bootstrap/_print.scss:
--------------------------------------------------------------------------------
1 | /*! Source: https://github.com/h5bp/html5-boilerplate/blob/master/src/css/main.css */
2 |
3 | // ==========================================================================
4 | // Print styles.
5 | // Inlined to avoid the additional HTTP request: h5bp.com/r
6 | // ==========================================================================
7 |
8 | @media print {
9 | *,
10 | *:before,
11 | *:after {
12 | background: transparent !important;
13 | color: #000 !important; // Black prints faster: h5bp.com/s
14 | box-shadow: none !important;
15 | text-shadow: none !important;
16 | }
17 |
18 | a,
19 | a:visited {
20 | text-decoration: underline;
21 | }
22 |
23 | a[href]:after {
24 | content: " (" attr(href) ")";
25 | }
26 |
27 | abbr[title]:after {
28 | content: " (" attr(title) ")";
29 | }
30 |
31 | // Don't show links that are fragment identifiers,
32 | // or use the `javascript:` pseudo protocol
33 | a[href^="#"]:after,
34 | a[href^="javascript:"]:after {
35 | content: "";
36 | }
37 |
38 | pre,
39 | blockquote {
40 | border: 1px solid #999;
41 | page-break-inside: avoid;
42 | }
43 |
44 | thead {
45 | display: table-header-group; // h5bp.com/t
46 | }
47 |
48 | tr,
49 | img {
50 | page-break-inside: avoid;
51 | }
52 |
53 | img {
54 | max-width: 100% !important;
55 | }
56 |
57 | p,
58 | h2,
59 | h3 {
60 | orphans: 3;
61 | widows: 3;
62 | }
63 |
64 | h2,
65 | h3 {
66 | page-break-after: avoid;
67 | }
68 |
69 | // Bootstrap specific changes start
70 |
71 | // Bootstrap components
72 | .navbar {
73 | display: none;
74 | }
75 | .btn,
76 | .dropup > .btn {
77 | > .caret {
78 | border-top-color: #000 !important;
79 | }
80 | }
81 | .label {
82 | border: 1px solid #000;
83 | }
84 |
85 | .table {
86 | border-collapse: collapse !important;
87 |
88 | td,
89 | th {
90 | background-color: #fff !important;
91 | }
92 | }
93 | .table-bordered {
94 | th,
95 | td {
96 | border: 1px solid #ddd !important;
97 | }
98 | }
99 |
100 | // Bootstrap specific changes end
101 | }
102 |
--------------------------------------------------------------------------------
/scss/vendor/bootstrap/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 | // Spec and IE10+
16 | @keyframes progress-bar-stripes {
17 | from { background-position: 40px 0; }
18 | to { background-position: 0 0; }
19 | }
20 |
21 |
22 | // Bar itself
23 | // -------------------------
24 |
25 | // Outer container
26 | .progress {
27 | overflow: hidden;
28 | height: $line-height-computed;
29 | margin-bottom: $line-height-computed;
30 | background-color: $progress-bg;
31 | border-radius: $progress-border-radius;
32 | @include box-shadow(inset 0 1px 2px rgba(0,0,0,.1));
33 | }
34 |
35 | // Bar of progress
36 | .progress-bar {
37 | float: left;
38 | width: 0%;
39 | height: 100%;
40 | font-size: $font-size-small;
41 | line-height: $line-height-computed;
42 | color: $progress-bar-color;
43 | text-align: center;
44 | background-color: $progress-bar-bg;
45 | @include box-shadow(inset 0 -1px 0 rgba(0,0,0,.15));
46 | @include transition(width .6s ease);
47 | }
48 |
49 | // Striped bars
50 | //
51 | // `.progress-striped .progress-bar` is deprecated as of v3.2.0 in favor of the
52 | // `.progress-bar-striped` class, which you just add to an existing
53 | // `.progress-bar`.
54 | .progress-striped .progress-bar,
55 | .progress-bar-striped {
56 | @include gradient-striped;
57 | background-size: 40px 40px;
58 | }
59 |
60 | // Call animation for the active one
61 | //
62 | // `.progress.active .progress-bar` is deprecated as of v3.2.0 in favor of the
63 | // `.progress-bar.active` approach.
64 | .progress.active .progress-bar,
65 | .progress-bar.active {
66 | @include animation(progress-bar-stripes 2s linear infinite);
67 | }
68 |
69 |
70 | // Variations
71 | // -------------------------
72 |
73 | .progress-bar-success {
74 | @include progress-bar-variant($progress-bar-success-bg);
75 | }
76 |
77 | .progress-bar-info {
78 | @include progress-bar-variant($progress-bar-info-bg);
79 | }
80 |
81 | .progress-bar-warning {
82 | @include progress-bar-variant($progress-bar-warning-bg);
83 | }
84 |
85 | .progress-bar-danger {
86 | @include progress-bar-variant($progress-bar-danger-bg);
87 | }
88 |
--------------------------------------------------------------------------------
/scss/vendor/bootstrap/bootstrap/_responsive-embed.scss:
--------------------------------------------------------------------------------
1 | // Embeds responsive
2 | //
3 | // Credit: Nicolas Gallagher and SUIT CSS.
4 |
5 | .embed-responsive {
6 | position: relative;
7 | display: block;
8 | height: 0;
9 | padding: 0;
10 | overflow: hidden;
11 |
12 | .embed-responsive-item,
13 | iframe,
14 | embed,
15 | object,
16 | video {
17 | position: absolute;
18 | top: 0;
19 | left: 0;
20 | bottom: 0;
21 | height: 100%;
22 | width: 100%;
23 | border: 0;
24 | }
25 | }
26 |
27 | // Modifier class for 16:9 aspect ratio
28 | .embed-responsive-16by9 {
29 | padding-bottom: 56.25%;
30 | }
31 |
32 | // Modifier class for 4:3 aspect ratio
33 | .embed-responsive-4by3 {
34 | padding-bottom: 75%;
35 | }
36 |
--------------------------------------------------------------------------------
/scss/vendor/bootstrap/bootstrap/_responsive-utilities.scss:
--------------------------------------------------------------------------------
1 | //
2 | // Responsive: Utility classes
3 | // --------------------------------------------------
4 |
5 |
6 | // IE10 in Windows (Phone) 8
7 | //
8 | // Support for responsive views via media queries is kind of borked in IE10, for
9 | // Surface/desktop in split view and for Windows Phone 8. This particular fix
10 | // must be accompanied by a snippet of JavaScript to sniff the user agent and
11 | // apply some conditional CSS to *only* the Surface/desktop Windows 8. Look at
12 | // our Getting Started page for more information on this bug.
13 | //
14 | // For more information, see the following:
15 | //
16 | // Issue: https://github.com/twbs/bootstrap/issues/10497
17 | // Docs: http://getbootstrap.com/getting-started/#support-ie10-width
18 | // Source: http://timkadlec.com/2013/01/windows-phone-8-and-device-width/
19 | // Source: http://timkadlec.com/2012/10/ie10-snap-mode-and-responsive-design/
20 |
21 | @at-root {
22 | @-ms-viewport {
23 | width: device-width;
24 | }
25 | }
26 |
27 |
28 | // Visibility utilities
29 | // Note: Deprecated .visible-xs, .visible-sm, .visible-md, and .visible-lg as of v3.2.0
30 |
31 | @include responsive-invisibility('.visible-xs');
32 | @include responsive-invisibility('.visible-sm');
33 | @include responsive-invisibility('.visible-md');
34 | @include responsive-invisibility('.visible-lg');
35 |
36 | .visible-xs-block,
37 | .visible-xs-inline,
38 | .visible-xs-inline-block,
39 | .visible-sm-block,
40 | .visible-sm-inline,
41 | .visible-sm-inline-block,
42 | .visible-md-block,
43 | .visible-md-inline,
44 | .visible-md-inline-block,
45 | .visible-lg-block,
46 | .visible-lg-inline,
47 | .visible-lg-inline-block {
48 | display: none !important;
49 | }
50 |
51 | @media (max-width: $screen-xs-max) {
52 | @include responsive-visibility('.visible-xs');
53 | }
54 | .visible-xs-block {
55 | @media (max-width: $screen-xs-max) {
56 | display: block !important;
57 | }
58 | }
59 | .visible-xs-inline {
60 | @media (max-width: $screen-xs-max) {
61 | display: inline !important;
62 | }
63 | }
64 | .visible-xs-inline-block {
65 | @media (max-width: $screen-xs-max) {
66 | display: inline-block !important;
67 | }
68 | }
69 |
70 | @media (min-width: $screen-sm-min) and (max-width: $screen-sm-max) {
71 | @include responsive-visibility('.visible-sm');
72 | }
73 | .visible-sm-block {
74 | @media (min-width: $screen-sm-min) and (max-width: $screen-sm-max) {
75 | display: block !important;
76 | }
77 | }
78 | .visible-sm-inline {
79 | @media (min-width: $screen-sm-min) and (max-width: $screen-sm-max) {
80 | display: inline !important;
81 | }
82 | }
83 | .visible-sm-inline-block {
84 | @media (min-width: $screen-sm-min) and (max-width: $screen-sm-max) {
85 | display: inline-block !important;
86 | }
87 | }
88 |
89 | @media (min-width: $screen-md-min) and (max-width: $screen-md-max) {
90 | @include responsive-visibility('.visible-md');
91 | }
92 | .visible-md-block {
93 | @media (min-width: $screen-md-min) and (max-width: $screen-md-max) {
94 | display: block !important;
95 | }
96 | }
97 | .visible-md-inline {
98 | @media (min-width: $screen-md-min) and (max-width: $screen-md-max) {
99 | display: inline !important;
100 | }
101 | }
102 | .visible-md-inline-block {
103 | @media (min-width: $screen-md-min) and (max-width: $screen-md-max) {
104 | display: inline-block !important;
105 | }
106 | }
107 |
108 | @media (min-width: $screen-lg-min) {
109 | @include responsive-visibility('.visible-lg');
110 | }
111 | .visible-lg-block {
112 | @media (min-width: $screen-lg-min) {
113 | display: block !important;
114 | }
115 | }
116 | .visible-lg-inline {
117 | @media (min-width: $screen-lg-min) {
118 | display: inline !important;
119 | }
120 | }
121 | .visible-lg-inline-block {
122 | @media (min-width: $screen-lg-min) {
123 | display: inline-block !important;
124 | }
125 | }
126 |
127 | @media (max-width: $screen-xs-max) {
128 | @include responsive-invisibility('.hidden-xs');
129 | }
130 |
131 | @media (min-width: $screen-sm-min) and (max-width: $screen-sm-max) {
132 | @include responsive-invisibility('.hidden-sm');
133 | }
134 |
135 | @media (min-width: $screen-md-min) and (max-width: $screen-md-max) {
136 | @include responsive-invisibility('.hidden-md');
137 | }
138 |
139 | @media (min-width: $screen-lg-min) {
140 | @include responsive-invisibility('.hidden-lg');
141 | }
142 |
143 |
144 | // Print utilities
145 | //
146 | // Media queries are placed on the inside to be mixin-friendly.
147 |
148 | // Note: Deprecated .visible-print as of v3.2.0
149 |
150 | @include responsive-invisibility('.visible-print');
151 |
152 | @media print {
153 | @include responsive-visibility('.visible-print');
154 | }
155 | .visible-print-block {
156 | display: none !important;
157 |
158 | @media print {
159 | display: block !important;
160 | }
161 | }
162 | .visible-print-inline {
163 | display: none !important;
164 |
165 | @media print {
166 | display: inline !important;
167 | }
168 | }
169 | .visible-print-inline-block {
170 | display: none !important;
171 |
172 | @media print {
173 | display: inline-block !important;
174 | }
175 | }
176 |
177 | @media print {
178 | @include responsive-invisibility('.hidden-print');
179 | }
180 |
--------------------------------------------------------------------------------
/scss/vendor/bootstrap/bootstrap/_scaffolding.scss:
--------------------------------------------------------------------------------
1 | //
2 | // Scaffolding
3 | // --------------------------------------------------
4 |
5 |
6 | // Reset the box-sizing
7 | //
8 | // Heads up! This reset may cause conflicts with some third-party widgets.
9 | // For recommendations on resolving such conflicts, see
10 | // http://getbootstrap.com/getting-started/#third-box-sizing
11 | * {
12 | @include box-sizing(border-box);
13 | }
14 | *:before,
15 | *:after {
16 | @include box-sizing(border-box);
17 | }
18 |
19 |
20 | // Body reset
21 |
22 | html {
23 | font-size: 10px;
24 | -webkit-tap-highlight-color: rgba(0,0,0,0);
25 | }
26 |
27 | body {
28 | font-family: $font-family-base;
29 | font-size: $font-size-base;
30 | line-height: $line-height-base;
31 | color: $text-color;
32 | background-color: $body-bg;
33 | }
34 |
35 | // Reset fonts for relevant elements
36 | input,
37 | button,
38 | select,
39 | textarea {
40 | font-family: inherit;
41 | font-size: inherit;
42 | line-height: inherit;
43 | }
44 |
45 |
46 | // Links
47 |
48 | a {
49 | color: $link-color;
50 | text-decoration: none;
51 |
52 | &:hover,
53 | &:focus {
54 | color: $link-hover-color;
55 | text-decoration: $link-hover-decoration;
56 | }
57 |
58 | &:focus {
59 | @include tab-focus;
60 | }
61 | }
62 |
63 |
64 | // Figures
65 | //
66 | // We reset this here because previously Normalize had no `figure` margins. This
67 | // ensures we don't break anyone's use of the element.
68 |
69 | figure {
70 | margin: 0;
71 | }
72 |
73 |
74 | // Images
75 |
76 | img {
77 | vertical-align: middle;
78 | }
79 |
80 | // Responsive images (ensure images don't scale beyond their parents)
81 | .img-responsive {
82 | @include img-responsive;
83 | }
84 |
85 | // Rounded corners
86 | .img-rounded {
87 | border-radius: $border-radius-large;
88 | }
89 |
90 | // Image thumbnails
91 | //
92 | // Heads up! This is mixin-ed into thumbnails.less for `.thumbnail`.
93 | .img-thumbnail {
94 | padding: $thumbnail-padding;
95 | line-height: $line-height-base;
96 | background-color: $thumbnail-bg;
97 | border: 1px solid $thumbnail-border;
98 | border-radius: $thumbnail-border-radius;
99 | @include transition(all .2s ease-in-out);
100 |
101 | // Keep them at most 100% wide
102 | @include img-responsive(inline-block);
103 | }
104 |
105 | // Perfect circle
106 | .img-circle {
107 | border-radius: 50%; // set radius in percents
108 | }
109 |
110 |
111 | // Horizontal rules
112 |
113 | hr {
114 | margin-top: $line-height-computed;
115 | margin-bottom: $line-height-computed;
116 | border: 0;
117 | border-top: 1px solid $hr-border;
118 | }
119 |
120 |
121 | // Only display content to screen readers
122 | //
123 | // See: http://a11yproject.com/posts/how-to-hide-content
124 |
125 | .sr-only {
126 | position: absolute;
127 | width: 1px;
128 | height: 1px;
129 | margin: -1px;
130 | padding: 0;
131 | overflow: hidden;
132 | clip: rect(0,0,0,0);
133 | border: 0;
134 | }
135 |
136 | // Use in conjunction with .sr-only to only display content when it's focused.
137 | // Useful for "Skip to main content" links; see http://www.w3.org/TR/2013/NOTE-WCAG20-TECHS-20130905/G1
138 | // Credit: HTML5 Boilerplate
139 |
140 | .sr-only-focusable {
141 | &:active,
142 | &:focus {
143 | position: static;
144 | width: auto;
145 | height: auto;
146 | margin: 0;
147 | overflow: visible;
148 | clip: auto;
149 | }
150 | }
151 |
152 |
153 | // iOS "clickable elements" fix for role="button"
154 | //
155 | // Fixes "clickability" issue (and more generally, the firing of events such as focus as well)
156 | // for traditionally non-focusable elements with role="button"
157 | // see https://developer.mozilla.org/en-US/docs/Web/Events/click#Safari_Mobile
158 |
159 | [role="button"] {
160 | cursor: pointer;
161 | }
162 |
--------------------------------------------------------------------------------
/scss/vendor/bootstrap/bootstrap/_tables.scss:
--------------------------------------------------------------------------------
1 | //
2 | // Tables
3 | // --------------------------------------------------
4 |
5 |
6 | table {
7 | background-color: $table-bg;
8 | }
9 | caption {
10 | padding-top: $table-cell-padding;
11 | padding-bottom: $table-cell-padding;
12 | color: $text-muted;
13 | text-align: left;
14 | }
15 | th {
16 | text-align: left;
17 | }
18 |
19 |
20 | // Baseline styles
21 |
22 | .table {
23 | width: 100%;
24 | max-width: 100%;
25 | margin-bottom: $line-height-computed;
26 | // Cells
27 | > thead,
28 | > tbody,
29 | > tfoot {
30 | > tr {
31 | > th,
32 | > td {
33 | padding: $table-cell-padding;
34 | line-height: $line-height-base;
35 | vertical-align: top;
36 | border-top: 1px solid $table-border-color;
37 | }
38 | }
39 | }
40 | // Bottom align for column headings
41 | > thead > tr > th {
42 | vertical-align: bottom;
43 | border-bottom: 2px solid $table-border-color;
44 | }
45 | // Remove top border from thead by default
46 | > caption + thead,
47 | > colgroup + thead,
48 | > thead:first-child {
49 | > tr:first-child {
50 | > th,
51 | > td {
52 | border-top: 0;
53 | }
54 | }
55 | }
56 | // Account for multiple tbody instances
57 | > tbody + tbody {
58 | border-top: 2px solid $table-border-color;
59 | }
60 |
61 | // Nesting
62 | .table {
63 | background-color: $body-bg;
64 | }
65 | }
66 |
67 |
68 | // Condensed table w/ half padding
69 |
70 | .table-condensed {
71 | > thead,
72 | > tbody,
73 | > tfoot {
74 | > tr {
75 | > th,
76 | > td {
77 | padding: $table-condensed-cell-padding;
78 | }
79 | }
80 | }
81 | }
82 |
83 |
84 | // Bordered version
85 | //
86 | // Add borders all around the table and between all the columns.
87 |
88 | .table-bordered {
89 | border: 1px solid $table-border-color;
90 | > thead,
91 | > tbody,
92 | > tfoot {
93 | > tr {
94 | > th,
95 | > td {
96 | border: 1px solid $table-border-color;
97 | }
98 | }
99 | }
100 | > thead > tr {
101 | > th,
102 | > td {
103 | border-bottom-width: 2px;
104 | }
105 | }
106 | }
107 |
108 |
109 | // Zebra-striping
110 | //
111 | // Default zebra-stripe styles (alternating gray and transparent backgrounds)
112 |
113 | .table-striped {
114 | > tbody > tr:nth-of-type(odd) {
115 | background-color: $table-bg-accent;
116 | }
117 | }
118 |
119 |
120 | // Hover effect
121 | //
122 | // Placed here since it has to come after the potential zebra striping
123 |
124 | .table-hover {
125 | > tbody > tr:hover {
126 | background-color: $table-bg-hover;
127 | }
128 | }
129 |
130 |
131 | // Table cell sizing
132 | //
133 | // Reset default table behavior
134 |
135 | table col[class*="col-"] {
136 | position: static; // Prevent border hiding in Firefox and IE9-11 (see https://github.com/twbs/bootstrap/issues/11623)
137 | float: none;
138 | display: table-column;
139 | }
140 | table {
141 | td,
142 | th {
143 | &[class*="col-"] {
144 | position: static; // Prevent border hiding in Firefox and IE9-11 (see https://github.com/twbs/bootstrap/issues/11623)
145 | float: none;
146 | display: table-cell;
147 | }
148 | }
149 | }
150 |
151 |
152 | // Table backgrounds
153 | //
154 | // Exact selectors below required to override `.table-striped` and prevent
155 | // inheritance to nested tables.
156 |
157 | // Generate the contextual variants
158 | @include table-row-variant('active', $table-bg-active);
159 | @include table-row-variant('success', $state-success-bg);
160 | @include table-row-variant('info', $state-info-bg);
161 | @include table-row-variant('warning', $state-warning-bg);
162 | @include table-row-variant('danger', $state-danger-bg);
163 |
164 |
165 | // Responsive tables
166 | //
167 | // Wrap your tables in `.table-responsive` and we'll make them mobile friendly
168 | // by enabling horizontal scrolling. Only applies <768px. Everything above that
169 | // will display normally.
170 |
171 | .table-responsive {
172 | overflow-x: auto;
173 | min-height: 0.01%; // Workaround for IE9 bug (see https://github.com/twbs/bootstrap/issues/14837)
174 |
175 | @media screen and (max-width: $screen-xs-max) {
176 | width: 100%;
177 | margin-bottom: ($line-height-computed * 0.75);
178 | overflow-y: hidden;
179 | -ms-overflow-style: -ms-autohiding-scrollbar;
180 | border: 1px solid $table-border-color;
181 |
182 | // Tighten up spacing
183 | > .table {
184 | margin-bottom: 0;
185 |
186 | // Ensure the content doesn't wrap
187 | > thead,
188 | > tbody,
189 | > tfoot {
190 | > tr {
191 | > th,
192 | > td {
193 | white-space: nowrap;
194 | }
195 | }
196 | }
197 | }
198 |
199 | // Special overrides for the bordered tables
200 | > .table-bordered {
201 | border: 0;
202 |
203 | // Nuke the appropriate borders so that the parent can handle them
204 | > thead,
205 | > tbody,
206 | > tfoot {
207 | > tr {
208 | > th:first-child,
209 | > td:first-child {
210 | border-left: 0;
211 | }
212 | > th:last-child,
213 | > td:last-child {
214 | border-right: 0;
215 | }
216 | }
217 | }
218 |
219 | // Only nuke the last row's bottom-border in `tbody` and `tfoot` since
220 | // chances are there will be only one `tr` in a `thead` and that would
221 | // remove the border altogether.
222 | > tbody,
223 | > tfoot {
224 | > tr:last-child {
225 | > th,
226 | > td {
227 | border-bottom: 0;
228 | }
229 | }
230 | }
231 |
232 | }
233 | }
234 | }
235 |
--------------------------------------------------------------------------------
/scss/vendor/bootstrap/bootstrap/_thumbnails.scss:
--------------------------------------------------------------------------------
1 | //
2 | // Thumbnails
3 | // --------------------------------------------------
4 |
5 |
6 | // Mixin and adjust the regular image class
7 | .thumbnail {
8 | display: block;
9 | padding: $thumbnail-padding;
10 | margin-bottom: $line-height-computed;
11 | line-height: $line-height-base;
12 | background-color: $thumbnail-bg;
13 | border: 1px solid $thumbnail-border;
14 | border-radius: $thumbnail-border-radius;
15 | @include transition(border .2s ease-in-out);
16 |
17 | > img,
18 | a > img {
19 | @include img-responsive;
20 | margin-left: auto;
21 | margin-right: auto;
22 | }
23 |
24 | // [converter] extracted a&:hover, a&:focus, a&.active to a.thumbnail:hover, a.thumbnail:focus, a.thumbnail.active
25 |
26 | // Image captions
27 | .caption {
28 | padding: $thumbnail-caption-padding;
29 | color: $thumbnail-caption-color;
30 | }
31 | }
32 |
33 | // Add a hover state for linked versions only
34 | a.thumbnail:hover,
35 | a.thumbnail:focus,
36 | a.thumbnail.active {
37 | border-color: $link-color;
38 | }
39 |
--------------------------------------------------------------------------------
/scss/vendor/bootstrap/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 | // Our parent element can be arbitrary since tooltips are by default inserted as a sibling of their target element.
12 | // So reset our font and text properties to avoid inheriting weird values.
13 | @include reset-text;
14 | font-size: $font-size-small;
15 |
16 | @include opacity(0);
17 |
18 | &.in { @include opacity($tooltip-opacity); }
19 | &.top { margin-top: -3px; padding: $tooltip-arrow-width 0; }
20 | &.right { margin-left: 3px; padding: 0 $tooltip-arrow-width; }
21 | &.bottom { margin-top: 3px; padding: $tooltip-arrow-width 0; }
22 | &.left { margin-left: -3px; padding: 0 $tooltip-arrow-width; }
23 | }
24 |
25 | // Wrapper for the tooltip content
26 | .tooltip-inner {
27 | max-width: $tooltip-max-width;
28 | padding: 3px 8px;
29 | color: $tooltip-color;
30 | text-align: center;
31 | background-color: $tooltip-bg;
32 | border-radius: $border-radius-base;
33 | }
34 |
35 | // Arrows
36 | .tooltip-arrow {
37 | position: absolute;
38 | width: 0;
39 | height: 0;
40 | border-color: transparent;
41 | border-style: solid;
42 | }
43 | // Note: Deprecated .top-left, .top-right, .bottom-left, and .bottom-right as of v3.3.1
44 | .tooltip {
45 | &.top .tooltip-arrow {
46 | bottom: 0;
47 | left: 50%;
48 | margin-left: -$tooltip-arrow-width;
49 | border-width: $tooltip-arrow-width $tooltip-arrow-width 0;
50 | border-top-color: $tooltip-arrow-color;
51 | }
52 | &.top-left .tooltip-arrow {
53 | bottom: 0;
54 | right: $tooltip-arrow-width;
55 | margin-bottom: -$tooltip-arrow-width;
56 | border-width: $tooltip-arrow-width $tooltip-arrow-width 0;
57 | border-top-color: $tooltip-arrow-color;
58 | }
59 | &.top-right .tooltip-arrow {
60 | bottom: 0;
61 | left: $tooltip-arrow-width;
62 | margin-bottom: -$tooltip-arrow-width;
63 | border-width: $tooltip-arrow-width $tooltip-arrow-width 0;
64 | border-top-color: $tooltip-arrow-color;
65 | }
66 | &.right .tooltip-arrow {
67 | top: 50%;
68 | left: 0;
69 | margin-top: -$tooltip-arrow-width;
70 | border-width: $tooltip-arrow-width $tooltip-arrow-width $tooltip-arrow-width 0;
71 | border-right-color: $tooltip-arrow-color;
72 | }
73 | &.left .tooltip-arrow {
74 | top: 50%;
75 | right: 0;
76 | margin-top: -$tooltip-arrow-width;
77 | border-width: $tooltip-arrow-width 0 $tooltip-arrow-width $tooltip-arrow-width;
78 | border-left-color: $tooltip-arrow-color;
79 | }
80 | &.bottom .tooltip-arrow {
81 | top: 0;
82 | left: 50%;
83 | margin-left: -$tooltip-arrow-width;
84 | border-width: 0 $tooltip-arrow-width $tooltip-arrow-width;
85 | border-bottom-color: $tooltip-arrow-color;
86 | }
87 | &.bottom-left .tooltip-arrow {
88 | top: 0;
89 | right: $tooltip-arrow-width;
90 | margin-top: -$tooltip-arrow-width;
91 | border-width: 0 $tooltip-arrow-width $tooltip-arrow-width;
92 | border-bottom-color: $tooltip-arrow-color;
93 | }
94 | &.bottom-right .tooltip-arrow {
95 | top: 0;
96 | left: $tooltip-arrow-width;
97 | margin-top: -$tooltip-arrow-width;
98 | border-width: 0 $tooltip-arrow-width $tooltip-arrow-width;
99 | border-bottom-color: $tooltip-arrow-color;
100 | }
101 | }
102 |
--------------------------------------------------------------------------------
/scss/vendor/bootstrap/bootstrap/_utilities.scss:
--------------------------------------------------------------------------------
1 | //
2 | // Utility classes
3 | // --------------------------------------------------
4 |
5 |
6 | // Floats
7 | // -------------------------
8 |
9 | .clearfix {
10 | @include clearfix;
11 | }
12 | .center-block {
13 | @include center-block;
14 | }
15 | .pull-right {
16 | float: right !important;
17 | }
18 | .pull-left {
19 | float: left !important;
20 | }
21 |
22 |
23 | // Toggling content
24 | // -------------------------
25 |
26 | // Note: Deprecated .hide in favor of .hidden or .sr-only (as appropriate) in v3.0.1
27 | .hide {
28 | display: none !important;
29 | }
30 | .show {
31 | display: block !important;
32 | }
33 | .invisible {
34 | visibility: hidden;
35 | }
36 | .text-hide {
37 | @include text-hide;
38 | }
39 |
40 |
41 | // Hide from screenreaders and browsers
42 | //
43 | // Credit: HTML5 Boilerplate
44 |
45 | .hidden {
46 | display: none !important;
47 | }
48 |
49 |
50 | // For Affix plugin
51 | // -------------------------
52 |
53 | .affix {
54 | position: fixed;
55 | }
56 |
--------------------------------------------------------------------------------
/scss/vendor/bootstrap/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 $well-border;
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 |
--------------------------------------------------------------------------------
/scss/vendor/bootstrap/bootstrap/mixins/_alerts.scss:
--------------------------------------------------------------------------------
1 | // Alerts
2 |
3 | @mixin alert-variant($background, $border, $text-color) {
4 | background-color: $background;
5 | border-color: $border;
6 | color: $text-color;
7 |
8 | hr {
9 | border-top-color: darken($border, 5%);
10 | }
11 | .alert-link {
12 | color: darken($text-color, 10%);
13 | }
14 | }
15 |
--------------------------------------------------------------------------------
/scss/vendor/bootstrap/bootstrap/mixins/_background-variant.scss:
--------------------------------------------------------------------------------
1 | // Contextual backgrounds
2 |
3 | // [converter] $parent hack
4 | @mixin bg-variant($parent, $color) {
5 | #{$parent} {
6 | background-color: $color;
7 | }
8 | a#{$parent}:hover,
9 | a#{$parent}:focus {
10 | background-color: darken($color, 10%);
11 | }
12 | }
13 |
--------------------------------------------------------------------------------
/scss/vendor/bootstrap/bootstrap/mixins/_border-radius.scss:
--------------------------------------------------------------------------------
1 | // Single side border-radius
2 |
3 | @mixin border-top-radius($radius) {
4 | border-top-right-radius: $radius;
5 | border-top-left-radius: $radius;
6 | }
7 | @mixin border-right-radius($radius) {
8 | border-bottom-right-radius: $radius;
9 | border-top-right-radius: $radius;
10 | }
11 | @mixin border-bottom-radius($radius) {
12 | border-bottom-right-radius: $radius;
13 | border-bottom-left-radius: $radius;
14 | }
15 | @mixin border-left-radius($radius) {
16 | border-bottom-left-radius: $radius;
17 | border-top-left-radius: $radius;
18 | }
19 |
--------------------------------------------------------------------------------
/scss/vendor/bootstrap/bootstrap/mixins/_buttons.scss:
--------------------------------------------------------------------------------
1 | // Button variants
2 | //
3 | // Easily pump out default styles, as well as :hover, :focus, :active,
4 | // and disabled options for all buttons
5 |
6 | @mixin button-variant($color, $background, $border) {
7 | color: $color;
8 | background-color: $background;
9 | border-color: $border;
10 |
11 | &:focus,
12 | &.focus {
13 | color: $color;
14 | background-color: darken($background, 10%);
15 | border-color: darken($border, 25%);
16 | }
17 | &:hover {
18 | color: $color;
19 | background-color: darken($background, 10%);
20 | border-color: darken($border, 12%);
21 | }
22 | &:active,
23 | &.active,
24 | .open > &.dropdown-toggle {
25 | color: $color;
26 | background-color: darken($background, 10%);
27 | border-color: darken($border, 12%);
28 |
29 | &:hover,
30 | &:focus,
31 | &.focus {
32 | color: $color;
33 | background-color: darken($background, 17%);
34 | border-color: darken($border, 25%);
35 | }
36 | }
37 | &:active,
38 | &.active,
39 | .open > &.dropdown-toggle {
40 | background-image: none;
41 | }
42 | &.disabled,
43 | &[disabled],
44 | fieldset[disabled] & {
45 | &:hover,
46 | &:focus,
47 | &.focus {
48 | background-color: $background;
49 | border-color: $border;
50 | }
51 | }
52 |
53 | .badge {
54 | color: $background;
55 | background-color: $color;
56 | }
57 | }
58 |
59 | // Button sizes
60 | @mixin button-size($padding-vertical, $padding-horizontal, $font-size, $line-height, $border-radius) {
61 | padding: $padding-vertical $padding-horizontal;
62 | font-size: $font-size;
63 | line-height: $line-height;
64 | border-radius: $border-radius;
65 | }
66 |
--------------------------------------------------------------------------------
/scss/vendor/bootstrap/bootstrap/mixins/_center-block.scss:
--------------------------------------------------------------------------------
1 | // Center-align a block level element
2 |
3 | @mixin center-block() {
4 | display: block;
5 | margin-left: auto;
6 | margin-right: auto;
7 | }
8 |
--------------------------------------------------------------------------------
/scss/vendor/bootstrap/bootstrap/mixins/_clearfix.scss:
--------------------------------------------------------------------------------
1 | // Clearfix
2 | //
3 | // For modern browsers
4 | // 1. The space content is one way to avoid an Opera bug when the
5 | // contenteditable attribute is included anywhere else in the document.
6 | // Otherwise it causes space to appear at the top and bottom of elements
7 | // that are clearfixed.
8 | // 2. The use of `table` rather than `block` is only necessary if using
9 | // `:before` to contain the top-margins of child elements.
10 | //
11 | // Source: http://nicolasgallagher.com/micro-clearfix-hack/
12 |
13 | @mixin clearfix() {
14 | &:before,
15 | &:after {
16 | content: " "; // 1
17 | display: table; // 2
18 | }
19 | &:after {
20 | clear: both;
21 | }
22 | }
23 |
--------------------------------------------------------------------------------
/scss/vendor/bootstrap/bootstrap/mixins/_forms.scss:
--------------------------------------------------------------------------------
1 | // Form validation states
2 | //
3 | // Used in forms.less to generate the form validation CSS for warnings, errors,
4 | // and successes.
5 |
6 | @mixin form-control-validation($text-color: #555, $border-color: #ccc, $background-color: #f5f5f5) {
7 | // Color the label and help text
8 | .help-block,
9 | .control-label,
10 | .radio,
11 | .checkbox,
12 | .radio-inline,
13 | .checkbox-inline,
14 | &.radio label,
15 | &.checkbox label,
16 | &.radio-inline label,
17 | &.checkbox-inline label {
18 | color: $text-color;
19 | }
20 | // Set the border and box shadow on specific inputs to match
21 | .form-control {
22 | border-color: $border-color;
23 | @include box-shadow(inset 0 1px 1px rgba(0,0,0,.075)); // Redeclare so transitions work
24 | &:focus {
25 | border-color: darken($border-color, 10%);
26 | $shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 6px lighten($border-color, 20%);
27 | @include box-shadow($shadow);
28 | }
29 | }
30 | // Set validation states also for addons
31 | .input-group-addon {
32 | color: $text-color;
33 | border-color: $border-color;
34 | background-color: $background-color;
35 | }
36 | // Optional feedback icon
37 | .form-control-feedback {
38 | color: $text-color;
39 | }
40 | }
41 |
42 |
43 | // Form control focus state
44 | //
45 | // Generate a customized focus state and for any input with the specified color,
46 | // which defaults to the `$input-border-focus` variable.
47 | //
48 | // We highly encourage you to not customize the default value, but instead use
49 | // this to tweak colors on an as-needed basis. This aesthetic change is based on
50 | // WebKit's default styles, but applicable to a wider range of browsers. Its
51 | // usability and accessibility should be taken into account with any change.
52 | //
53 | // Example usage: change the default blue border and shadow to white for better
54 | // contrast against a dark gray background.
55 | @mixin form-control-focus($color: $input-border-focus) {
56 | $color-rgba: rgba(red($color), green($color), blue($color), .1);
57 | &:focus {
58 | border-color: $color;
59 | outline: 0;
60 | @include box-shadow(inset 0 1px 1px rgba(0,0,0,0.075), 0 0 0 3px $color-rgba);
61 | }
62 | }
63 |
64 | // Form control sizing
65 | //
66 | // Relative text size, padding, and border-radii changes for form controls. For
67 | // horizontal sizing, wrap controls in the predefined grid classes. `
`
68 | // element gets special love because it's special, and that's a fact!
69 | // [converter] $parent hack
70 | @mixin input-size($parent, $input-height, $padding-vertical, $padding-horizontal, $font-size, $line-height, $border-radius) {
71 | #{$parent} {
72 | height: $input-height;
73 | padding: $padding-vertical $padding-horizontal;
74 | font-size: $font-size;
75 | line-height: $line-height;
76 | border-radius: $border-radius;
77 | }
78 |
79 | select#{$parent} {
80 | height: $input-height;
81 | line-height: $input-height;
82 | }
83 |
84 | textarea#{$parent},
85 | select[multiple]#{$parent} {
86 | height: auto;
87 | }
88 | }
89 |
--------------------------------------------------------------------------------
/scss/vendor/bootstrap/bootstrap/mixins/_gradients.scss:
--------------------------------------------------------------------------------
1 | // Gradients
2 |
3 |
4 |
5 | // Horizontal gradient, from left to right
6 | //
7 | // Creates two color stops, start and end, by specifying a color and position for each color stop.
8 | // Color stops are not available in IE9 and below.
9 | @mixin gradient-horizontal($start-color: #555, $end-color: #333, $start-percent: 0%, $end-percent: 100%) {
10 | background-image: -webkit-linear-gradient(left, $start-color $start-percent, $end-color $end-percent); // Safari 5.1-6, Chrome 10+
11 | background-image: -o-linear-gradient(left, $start-color $start-percent, $end-color $end-percent); // Opera 12
12 | background-image: linear-gradient(to right, $start-color $start-percent, $end-color $end-percent); // Standard, IE10, Firefox 16+, Opera 12.10+, Safari 7+, Chrome 26+
13 | background-repeat: repeat-x;
14 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#{ie-hex-str($start-color)}', endColorstr='#{ie-hex-str($end-color)}', GradientType=1); // IE9 and down
15 | }
16 |
17 | // Vertical gradient, from top to bottom
18 | //
19 | // Creates two color stops, start and end, by specifying a color and position for each color stop.
20 | // Color stops are not available in IE9 and below.
21 | @mixin gradient-vertical($start-color: #555, $end-color: #333, $start-percent: 0%, $end-percent: 100%) {
22 | background-image: -webkit-linear-gradient(top, $start-color $start-percent, $end-color $end-percent); // Safari 5.1-6, Chrome 10+
23 | background-image: -o-linear-gradient(top, $start-color $start-percent, $end-color $end-percent); // Opera 12
24 | background-image: linear-gradient(to bottom, $start-color $start-percent, $end-color $end-percent); // Standard, IE10, Firefox 16+, Opera 12.10+, Safari 7+, Chrome 26+
25 | background-repeat: repeat-x;
26 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#{ie-hex-str($start-color)}', endColorstr='#{ie-hex-str($end-color)}', GradientType=0); // IE9 and down
27 | }
28 |
29 | @mixin gradient-directional($start-color: #555, $end-color: #333, $deg: 45deg) {
30 | background-repeat: repeat-x;
31 | background-image: -webkit-linear-gradient($deg, $start-color, $end-color); // Safari 5.1-6, Chrome 10+
32 | background-image: -o-linear-gradient($deg, $start-color, $end-color); // Opera 12
33 | background-image: linear-gradient($deg, $start-color, $end-color); // Standard, IE10, Firefox 16+, Opera 12.10+, Safari 7+, Chrome 26+
34 | }
35 | @mixin gradient-horizontal-three-colors($start-color: #00b3ee, $mid-color: #7a43b6, $color-stop: 50%, $end-color: #c3325f) {
36 | background-image: -webkit-linear-gradient(left, $start-color, $mid-color $color-stop, $end-color);
37 | background-image: -o-linear-gradient(left, $start-color, $mid-color $color-stop, $end-color);
38 | background-image: linear-gradient(to right, $start-color, $mid-color $color-stop, $end-color);
39 | background-repeat: no-repeat;
40 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#{ie-hex-str($start-color)}', endColorstr='#{ie-hex-str($end-color)}', GradientType=1); // IE9 and down, gets no color-stop at all for proper fallback
41 | }
42 | @mixin gradient-vertical-three-colors($start-color: #00b3ee, $mid-color: #7a43b6, $color-stop: 50%, $end-color: #c3325f) {
43 | background-image: -webkit-linear-gradient($start-color, $mid-color $color-stop, $end-color);
44 | background-image: -o-linear-gradient($start-color, $mid-color $color-stop, $end-color);
45 | background-image: linear-gradient($start-color, $mid-color $color-stop, $end-color);
46 | background-repeat: no-repeat;
47 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#{ie-hex-str($start-color)}', endColorstr='#{ie-hex-str($end-color)}', GradientType=0); // IE9 and down, gets no color-stop at all for proper fallback
48 | }
49 | @mixin gradient-radial($inner-color: #555, $outer-color: #333) {
50 | background-image: -webkit-radial-gradient(circle, $inner-color, $outer-color);
51 | background-image: radial-gradient(circle, $inner-color, $outer-color);
52 | background-repeat: no-repeat;
53 | }
54 | @mixin gradient-striped($color: rgba(255,255,255,.15), $angle: 45deg) {
55 | background-image: -webkit-linear-gradient($angle, $color 25%, transparent 25%, transparent 50%, $color 50%, $color 75%, transparent 75%, transparent);
56 | background-image: -o-linear-gradient($angle, $color 25%, transparent 25%, transparent 50%, $color 50%, $color 75%, transparent 75%, transparent);
57 | background-image: linear-gradient($angle, $color 25%, transparent 25%, transparent 50%, $color 50%, $color 75%, transparent 75%, transparent);
58 | }
59 |
--------------------------------------------------------------------------------
/scss/vendor/bootstrap/bootstrap/mixins/_grid-framework.scss:
--------------------------------------------------------------------------------
1 | // Framework grid generation
2 | //
3 | // Used only by Bootstrap to generate the correct number of grid classes given
4 | // any value of `$grid-columns`.
5 |
6 | // [converter] This is defined recursively in LESS, but Sass supports real loops
7 | @mixin make-grid-columns($i: 1, $list: ".col-xs-#{$i}, .col-sm-#{$i}, .col-md-#{$i}, .col-lg-#{$i}") {
8 | @for $i from (1 + 1) through $grid-columns {
9 | $list: "#{$list}, .col-xs-#{$i}, .col-sm-#{$i}, .col-md-#{$i}, .col-lg-#{$i}";
10 | }
11 | #{$list} {
12 | position: relative;
13 | // Prevent columns from collapsing when empty
14 | min-height: 1px;
15 | // Inner gutter via padding
16 | padding-left: ceil(($grid-gutter-width / 2));
17 | padding-right: floor(($grid-gutter-width / 2));
18 | }
19 | }
20 |
21 |
22 | // [converter] This is defined recursively in LESS, but Sass supports real loops
23 | @mixin float-grid-columns($class, $i: 1, $list: ".col-#{$class}-#{$i}") {
24 | @for $i from (1 + 1) through $grid-columns {
25 | $list: "#{$list}, .col-#{$class}-#{$i}";
26 | }
27 | #{$list} {
28 | float: left;
29 | }
30 | }
31 |
32 |
33 | @mixin calc-grid-column($index, $class, $type) {
34 | @if ($type == width) and ($index > 0) {
35 | .col-#{$class}-#{$index} {
36 | width: percentage(($index / $grid-columns));
37 | }
38 | }
39 | @if ($type == push) and ($index > 0) {
40 | .col-#{$class}-push-#{$index} {
41 | left: percentage(($index / $grid-columns));
42 | }
43 | }
44 | @if ($type == push) and ($index == 0) {
45 | .col-#{$class}-push-0 {
46 | left: auto;
47 | }
48 | }
49 | @if ($type == pull) and ($index > 0) {
50 | .col-#{$class}-pull-#{$index} {
51 | right: percentage(($index / $grid-columns));
52 | }
53 | }
54 | @if ($type == pull) and ($index == 0) {
55 | .col-#{$class}-pull-0 {
56 | right: auto;
57 | }
58 | }
59 | @if ($type == offset) {
60 | .col-#{$class}-offset-#{$index} {
61 | margin-left: percentage(($index / $grid-columns));
62 | }
63 | }
64 | }
65 |
66 | // [converter] This is defined recursively in LESS, but Sass supports real loops
67 | @mixin loop-grid-columns($columns, $class, $type) {
68 | @for $i from 0 through $columns {
69 | @include calc-grid-column($i, $class, $type);
70 | }
71 | }
72 |
73 |
74 | // Create grid for specific class
75 | @mixin make-grid($class) {
76 | @include float-grid-columns($class);
77 | @include loop-grid-columns($grid-columns, $class, width);
78 | @include loop-grid-columns($grid-columns, $class, pull);
79 | @include loop-grid-columns($grid-columns, $class, push);
80 | @include loop-grid-columns($grid-columns, $class, offset);
81 | }
82 |
--------------------------------------------------------------------------------
/scss/vendor/bootstrap/bootstrap/mixins/_grid.scss:
--------------------------------------------------------------------------------
1 | // Grid system
2 | //
3 | // Generate semantic grid columns with these mixins.
4 |
5 | // Centered container element
6 | @mixin container-fixed($gutter: $grid-gutter-width) {
7 | margin-right: auto;
8 | margin-left: auto;
9 | padding-left: floor(($gutter / 2));
10 | padding-right: ceil(($gutter / 2));
11 | @include clearfix;
12 | }
13 |
14 | // Creates a wrapper for a series of columns
15 | @mixin make-row($gutter: $grid-gutter-width) {
16 | margin-left: ceil(($gutter / -2));
17 | margin-right: floor(($gutter / -2));
18 | @include clearfix;
19 | }
20 |
21 | // Generate the extra small columns
22 | @mixin make-xs-column($columns, $gutter: $grid-gutter-width) {
23 | position: relative;
24 | float: left;
25 | width: percentage(($columns / $grid-columns));
26 | min-height: 1px;
27 | padding-left: ($gutter / 2);
28 | padding-right: ($gutter / 2);
29 | }
30 | @mixin make-xs-column-offset($columns) {
31 | margin-left: percentage(($columns / $grid-columns));
32 | }
33 | @mixin make-xs-column-push($columns) {
34 | left: percentage(($columns / $grid-columns));
35 | }
36 | @mixin make-xs-column-pull($columns) {
37 | right: percentage(($columns / $grid-columns));
38 | }
39 |
40 | // Generate the small columns
41 | @mixin make-sm-column($columns, $gutter: $grid-gutter-width) {
42 | position: relative;
43 | min-height: 1px;
44 | padding-left: ($gutter / 2);
45 | padding-right: ($gutter / 2);
46 |
47 | @media (min-width: $screen-sm-min) {
48 | float: left;
49 | width: percentage(($columns / $grid-columns));
50 | }
51 | }
52 | @mixin make-sm-column-offset($columns) {
53 | @media (min-width: $screen-sm-min) {
54 | margin-left: percentage(($columns / $grid-columns));
55 | }
56 | }
57 | @mixin make-sm-column-push($columns) {
58 | @media (min-width: $screen-sm-min) {
59 | left: percentage(($columns / $grid-columns));
60 | }
61 | }
62 | @mixin make-sm-column-pull($columns) {
63 | @media (min-width: $screen-sm-min) {
64 | right: percentage(($columns / $grid-columns));
65 | }
66 | }
67 |
68 | // Generate the medium columns
69 | @mixin make-md-column($columns, $gutter: $grid-gutter-width) {
70 | position: relative;
71 | min-height: 1px;
72 | padding-left: ($gutter / 2);
73 | padding-right: ($gutter / 2);
74 |
75 | @media (min-width: $screen-md-min) {
76 | float: left;
77 | width: percentage(($columns / $grid-columns));
78 | }
79 | }
80 | @mixin make-md-column-offset($columns) {
81 | @media (min-width: $screen-md-min) {
82 | margin-left: percentage(($columns / $grid-columns));
83 | }
84 | }
85 | @mixin make-md-column-push($columns) {
86 | @media (min-width: $screen-md-min) {
87 | left: percentage(($columns / $grid-columns));
88 | }
89 | }
90 | @mixin make-md-column-pull($columns) {
91 | @media (min-width: $screen-md-min) {
92 | right: percentage(($columns / $grid-columns));
93 | }
94 | }
95 |
96 | // Generate the large columns
97 | @mixin make-lg-column($columns, $gutter: $grid-gutter-width) {
98 | position: relative;
99 | min-height: 1px;
100 | padding-left: ($gutter / 2);
101 | padding-right: ($gutter / 2);
102 |
103 | @media (min-width: $screen-lg-min) {
104 | float: left;
105 | width: percentage(($columns / $grid-columns));
106 | }
107 | }
108 | @mixin make-lg-column-offset($columns) {
109 | @media (min-width: $screen-lg-min) {
110 | margin-left: percentage(($columns / $grid-columns));
111 | }
112 | }
113 | @mixin make-lg-column-push($columns) {
114 | @media (min-width: $screen-lg-min) {
115 | left: percentage(($columns / $grid-columns));
116 | }
117 | }
118 | @mixin make-lg-column-pull($columns) {
119 | @media (min-width: $screen-lg-min) {
120 | right: percentage(($columns / $grid-columns));
121 | }
122 | }
123 |
--------------------------------------------------------------------------------
/scss/vendor/bootstrap/bootstrap/mixins/_hide-text.scss:
--------------------------------------------------------------------------------
1 | // CSS image replacement
2 | //
3 | // Heads up! v3 launched with only `.hide-text()`, but per our pattern for
4 | // mixins being reused as classes with the same name, this doesn't hold up. As
5 | // of v3.0.1 we have added `.text-hide()` and deprecated `.hide-text()`.
6 | //
7 | // Source: https://github.com/h5bp/html5-boilerplate/commit/aa0396eae757
8 |
9 | // Deprecated as of v3.0.1 (has been removed in v4)
10 | @mixin hide-text() {
11 | font: 0/0 a;
12 | color: transparent;
13 | text-shadow: none;
14 | background-color: transparent;
15 | border: 0;
16 | }
17 |
18 | // New mixin to use as of v3.0.1
19 | @mixin text-hide() {
20 | @include hide-text;
21 | }
22 |
--------------------------------------------------------------------------------
/scss/vendor/bootstrap/bootstrap/mixins/_image.scss:
--------------------------------------------------------------------------------
1 | // Image Mixins
2 | // - Responsive image
3 | // - Retina image
4 |
5 |
6 | // Responsive image
7 | //
8 | // Keep images from scaling beyond the width of their parents.
9 | @mixin img-responsive($display: block) {
10 | display: $display;
11 | max-width: 100%; // Part 1: Set a maximum relative to the parent
12 | height: auto; // Part 2: Scale the height according to the width, otherwise you get stretching
13 | }
14 |
15 |
16 | // Retina image
17 | //
18 | // Short retina mixin for setting background-image and -size. Note that the
19 | // spelling of `min--moz-device-pixel-ratio` is intentional.
20 | @mixin img-retina($file-1x, $file-2x, $width-1x, $height-1x) {
21 | background-image: url(if($bootstrap-sass-asset-helper, twbs-image-path("#{$file-1x}"), "#{$file-1x}"));
22 |
23 | @media
24 | only screen and (-webkit-min-device-pixel-ratio: 2),
25 | only screen and ( min--moz-device-pixel-ratio: 2),
26 | only screen and ( -o-min-device-pixel-ratio: 2/1),
27 | only screen and ( min-device-pixel-ratio: 2),
28 | only screen and ( min-resolution: 192dpi),
29 | only screen and ( min-resolution: 2dppx) {
30 | background-image: url(if($bootstrap-sass-asset-helper, twbs-image-path("#{$file-2x}"), "#{$file-2x}"));
31 | background-size: $width-1x $height-1x;
32 | }
33 | }
34 |
--------------------------------------------------------------------------------
/scss/vendor/bootstrap/bootstrap/mixins/_labels.scss:
--------------------------------------------------------------------------------
1 | // Labels
2 |
3 | @mixin label-variant($color) {
4 | background-color: $color;
5 |
6 | &[href] {
7 | &:hover,
8 | &:focus {
9 | background-color: darken($color, 10%);
10 | }
11 | }
12 | }
13 |
--------------------------------------------------------------------------------
/scss/vendor/bootstrap/bootstrap/mixins/_list-group.scss:
--------------------------------------------------------------------------------
1 | // List Groups
2 |
3 | @mixin list-group-item-variant($state, $background, $color) {
4 | .list-group-item-#{$state} {
5 | color: $color;
6 | background-color: $background;
7 |
8 | // [converter] extracted a&, button& to a.list-group-item-#{$state}, button.list-group-item-#{$state}
9 | }
10 |
11 | a.list-group-item-#{$state},
12 | button.list-group-item-#{$state} {
13 | color: $color;
14 |
15 | .list-group-item-heading {
16 | color: inherit;
17 | }
18 |
19 | &:hover,
20 | &:focus {
21 | color: $color;
22 | background-color: darken($background, 5%);
23 | }
24 | &.active,
25 | &.active:hover,
26 | &.active:focus {
27 | color: #fff;
28 | background-color: $color;
29 | border-color: $color;
30 | }
31 | }
32 | }
33 |
--------------------------------------------------------------------------------
/scss/vendor/bootstrap/bootstrap/mixins/_nav-divider.scss:
--------------------------------------------------------------------------------
1 | // Horizontal dividers
2 | //
3 | // Dividers (basically an hr) within dropdowns and nav lists
4 |
5 | @mixin nav-divider($color: #e5e5e5) {
6 | height: 1px;
7 | margin: (($line-height-computed / 2) - 1) 0;
8 | overflow: hidden;
9 | background-color: $color;
10 | }
11 |
--------------------------------------------------------------------------------
/scss/vendor/bootstrap/bootstrap/mixins/_nav-vertical-align.scss:
--------------------------------------------------------------------------------
1 | // Navbar vertical align
2 | //
3 | // Vertically center elements in the navbar.
4 | // Example: an element has a height of 30px, so write out `.navbar-vertical-align(30px);` to calculate the appropriate top margin.
5 |
6 | @mixin navbar-vertical-align($element-height) {
7 | margin-top: (($navbar-height - $element-height) / 2);
8 | margin-bottom: (($navbar-height - $element-height) / 2);
9 | }
10 |
--------------------------------------------------------------------------------
/scss/vendor/bootstrap/bootstrap/mixins/_opacity.scss:
--------------------------------------------------------------------------------
1 | // Opacity
2 |
3 | @mixin opacity($opacity) {
4 | opacity: $opacity;
5 | // IE8 filter
6 | $opacity-ie: ($opacity * 100);
7 | filter: alpha(opacity=$opacity-ie);
8 | }
9 |
--------------------------------------------------------------------------------
/scss/vendor/bootstrap/bootstrap/mixins/_pagination.scss:
--------------------------------------------------------------------------------
1 | // Pagination
2 |
3 | @mixin pagination-size($padding-vertical, $padding-horizontal, $font-size, $line-height, $border-radius) {
4 | > li {
5 | > a,
6 | > span {
7 | padding: $padding-vertical $padding-horizontal;
8 | font-size: $font-size;
9 | line-height: $line-height;
10 | }
11 | &:first-child {
12 | > a,
13 | > span {
14 | @include border-left-radius($border-radius);
15 | }
16 | }
17 | &:last-child {
18 | > a,
19 | > span {
20 | @include border-right-radius($border-radius);
21 | }
22 | }
23 | }
24 | }
25 |
--------------------------------------------------------------------------------
/scss/vendor/bootstrap/bootstrap/mixins/_panels.scss:
--------------------------------------------------------------------------------
1 | // Panels
2 |
3 | @mixin panel-variant($border, $heading-text-color, $heading-bg-color, $heading-border) {
4 | border-color: $border;
5 |
6 | & > .panel-heading {
7 | color: $heading-text-color;
8 | background-color: $heading-bg-color;
9 | border-color: $heading-border;
10 |
11 | + .panel-collapse > .panel-body {
12 | border-top-color: $border;
13 | }
14 | .badge {
15 | color: $heading-bg-color;
16 | background-color: $heading-text-color;
17 | }
18 | }
19 | & > .panel-footer {
20 | + .panel-collapse > .panel-body {
21 | border-bottom-color: $border;
22 | }
23 | }
24 | }
25 |
--------------------------------------------------------------------------------
/scss/vendor/bootstrap/bootstrap/mixins/_progress-bar.scss:
--------------------------------------------------------------------------------
1 | // Progress bars
2 |
3 | @mixin progress-bar-variant($color) {
4 | background-color: $color;
5 |
6 | // Deprecated parent class requirement as of v3.2.0
7 | .progress-striped & {
8 | @include gradient-striped;
9 | }
10 | }
11 |
--------------------------------------------------------------------------------
/scss/vendor/bootstrap/bootstrap/mixins/_reset-filter.scss:
--------------------------------------------------------------------------------
1 | // Reset filters for IE
2 | //
3 | // When you need to remove a gradient background, do not forget to use this to reset
4 | // the IE filter for IE9 and below.
5 |
6 | @mixin reset-filter() {
7 | filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);
8 | }
9 |
--------------------------------------------------------------------------------
/scss/vendor/bootstrap/bootstrap/mixins/_reset-text.scss:
--------------------------------------------------------------------------------
1 | @mixin reset-text() {
2 | font-family: $font-family-base;
3 | // We deliberately do NOT reset font-size.
4 | font-style: normal;
5 | font-weight: normal;
6 | letter-spacing: normal;
7 | line-break: auto;
8 | line-height: $line-height-base;
9 | text-align: left; // Fallback for where `start` is not supported
10 | text-align: start;
11 | text-decoration: none;
12 | text-shadow: none;
13 | text-transform: none;
14 | white-space: normal;
15 | word-break: normal;
16 | word-spacing: normal;
17 | word-wrap: normal;
18 | }
19 |
--------------------------------------------------------------------------------
/scss/vendor/bootstrap/bootstrap/mixins/_resize.scss:
--------------------------------------------------------------------------------
1 | // Resize anything
2 |
3 | @mixin resizable($direction) {
4 | resize: $direction; // Options: horizontal, vertical, both
5 | overflow: auto; // Per CSS3 UI, `resize` only applies when `overflow` isn't `visible`
6 | }
7 |
--------------------------------------------------------------------------------
/scss/vendor/bootstrap/bootstrap/mixins/_responsive-visibility.scss:
--------------------------------------------------------------------------------
1 | // Responsive utilities
2 |
3 | //
4 | // More easily include all the states for responsive-utilities.less.
5 | // [converter] $parent hack
6 | @mixin responsive-visibility($parent) {
7 | #{$parent} {
8 | display: block !important;
9 | }
10 | table#{$parent} { display: table !important; }
11 | tr#{$parent} { display: table-row !important; }
12 | th#{$parent},
13 | td#{$parent} { display: table-cell !important; }
14 | }
15 |
16 | // [converter] $parent hack
17 | @mixin responsive-invisibility($parent) {
18 | #{$parent} {
19 | display: none !important;
20 | }
21 | }
22 |
--------------------------------------------------------------------------------
/scss/vendor/bootstrap/bootstrap/mixins/_size.scss:
--------------------------------------------------------------------------------
1 | // Sizing shortcuts
2 |
3 | @mixin size($width, $height) {
4 | width: $width;
5 | height: $height;
6 | }
7 |
8 | @mixin square($size) {
9 | @include size($size, $size);
10 | }
11 |
--------------------------------------------------------------------------------
/scss/vendor/bootstrap/bootstrap/mixins/_tab-focus.scss:
--------------------------------------------------------------------------------
1 | // WebKit-style focus
2 |
3 | @mixin tab-focus() {
4 | // WebKit-specific. Other browsers will keep their default outline style.
5 | // (Initially tried to also force default via `outline: initial`,
6 | // but that seems to erroneously remove the outline in Firefox altogether.)
7 | outline: 5px auto -webkit-focus-ring-color;
8 | outline-offset: -2px;
9 | }
10 |
--------------------------------------------------------------------------------
/scss/vendor/bootstrap/bootstrap/mixins/_table-row.scss:
--------------------------------------------------------------------------------
1 | // Tables
2 |
3 | @mixin table-row-variant($state, $background) {
4 | // Exact selectors below required to override `.table-striped` and prevent
5 | // inheritance to nested tables.
6 | .table > thead > tr,
7 | .table > tbody > tr,
8 | .table > tfoot > tr {
9 | > td.#{$state},
10 | > th.#{$state},
11 | &.#{$state} > td,
12 | &.#{$state} > th {
13 | background-color: $background;
14 | }
15 | }
16 |
17 | // Hover states for `.table-hover`
18 | // Note: this is not available for cells or rows within `thead` or `tfoot`.
19 | .table-hover > tbody > tr {
20 | > td.#{$state}:hover,
21 | > th.#{$state}:hover,
22 | &.#{$state}:hover > td,
23 | &:hover > .#{$state},
24 | &.#{$state}:hover > th {
25 | background-color: darken($background, 5%);
26 | }
27 | }
28 | }
29 |
--------------------------------------------------------------------------------
/scss/vendor/bootstrap/bootstrap/mixins/_text-emphasis.scss:
--------------------------------------------------------------------------------
1 | // Typography
2 |
3 | // [converter] $parent hack
4 | @mixin text-emphasis-variant($parent, $color) {
5 | #{$parent} {
6 | color: $color;
7 | }
8 | a#{$parent}:hover,
9 | a#{$parent}:focus {
10 | color: darken($color, 10%);
11 | }
12 | }
13 |
--------------------------------------------------------------------------------
/scss/vendor/bootstrap/bootstrap/mixins/_text-overflow.scss:
--------------------------------------------------------------------------------
1 | // Text overflow
2 | // Requires inline-block or block for proper styling
3 |
4 | @mixin text-overflow() {
5 | overflow: hidden;
6 | text-overflow: ellipsis;
7 | white-space: nowrap;
8 | }
9 |
--------------------------------------------------------------------------------
/scss/vendor/graphiql/_doc-explorer.scss:
--------------------------------------------------------------------------------
1 | .DocumentationPanel .doc-explorer {
2 | background: #f7f7f7;
3 | }
4 |
5 | .DocumentationPanel .doc-explorer-title-bar {
6 | cursor: default;
7 | display: -webkit-flex;
8 | display: flex;
9 | height: 46px;
10 | line-height: 14px;
11 | padding: 3px 3px 5px;
12 | position: relative;
13 | -webkit-user-select: none;
14 | user-select: none;
15 | }
16 |
17 | .DocumentationPanel .doc-explorer-title {
18 | padding: 13px 0;
19 | font-weight: 200;
20 | text-align: center;
21 | text-overflow: ellipsis;
22 | white-space: nowrap;
23 | overflow-x: hidden;
24 | -webkit-flex: 1;
25 | flex: 1;
26 | height: 40px;
27 | }
28 |
29 | .DocumentationPanel .doc-explorer-back {
30 | color: #222222;
31 | cursor: pointer;
32 | margin: -7px 0 -6px -8px;
33 | overflow: hidden;
34 | padding: 21px 12px 21px 16px;
35 | text-overflow: ellipsis;
36 | white-space: nowrap;
37 | }
38 |
39 | .DocumentationPanel .doc-explorer-back:before {
40 | border-left: 2px solid #222222;
41 | border-top: 2px solid #222222;
42 | content: '';
43 | display: inline-block;
44 | height: 9px;
45 | margin: 0 3px 0 0;
46 | position: relative;
47 | width: 9px;
48 | -webkit-transform: rotate(-45deg);
49 | transform: rotate(-45deg);
50 | }
51 |
52 | .DocumentationPanel .doc-explorer-rhs {
53 | position: relative;
54 | }
55 |
56 | .DocumentationPanel .doc-explorer-contents {
57 | background-color: #ffffff;
58 | border-top: 1px solid $border-color;
59 | bottom: 0;
60 | left: 0;
61 | min-width: 300px;
62 | overflow-y: auto;
63 | padding: 20px 15px;
64 | position: absolute;
65 | right: 0;
66 | top: 46px;
67 | }
68 |
69 | .DocumentationPanel .doc-type-description p:first-child ,
70 | .DocumentationPanel .doc-type-description blockquote:first-child {
71 | margin-top: 0;
72 | }
73 |
74 | .DocumentationPanel .doc-explorer-contents a {
75 | cursor: pointer;
76 | text-decoration: none;
77 | }
78 |
79 | .DocumentationPanel .doc-explorer-contents a:hover {
80 | text-decoration: underline;
81 | }
82 |
83 | .DocumentationPanel .doc-value-description {
84 | padding: 4px 0 8px 12px;
85 | }
86 |
87 | .DocumentationPanel .doc-category {
88 | margin: 20px 0;
89 | }
90 |
91 | .DocumentationPanel .doc-category-title {
92 | border-bottom: 1px solid #e0e0e0;
93 | color: #777;
94 | cursor: default;
95 | font-size: 14px;
96 | font-variant: small-caps;
97 | font-weight: bold;
98 | letter-spacing: 1px;
99 | margin: 0 -15px 10px 0;
100 | padding: 10px 0;
101 | -webkit-user-select: none;
102 | user-select: none;
103 | }
104 |
105 | .DocumentationPanel .doc-category-item {
106 | margin: 12px 0;
107 | color: #555;
108 | }
109 |
110 | .DocumentationPanel .keyword {
111 | color: #B11A04;
112 | }
113 |
114 | .DocumentationPanel .type-name {
115 | color: #CA9800;
116 | }
117 |
118 | .DocumentationPanel .field-name {
119 | color: #1F61A0;
120 | }
121 |
122 | .DocumentationPanel .value-name {
123 | color: #0B7FC7;
124 | }
125 |
126 | .DocumentationPanel .arg-name {
127 | color: #8B2BB9;
128 | }
129 |
130 | .DocumentationPanel .arg:after {
131 | content: ', ';
132 | }
133 |
134 | .DocumentationPanel .arg:last-child:after {
135 | content: '';
136 | }
137 |
138 | .DocumentationPanel .doc-alert-text {
139 | color: #F00F00;
140 | font-family: 'Consolas', 'Inconsolata', 'Droid Sans Mono', 'Monaco', monospace;
141 | font-size: 13px;
142 | }
143 |
144 | .DocumentationPanel .search-box-outer {
145 | border: 1px solid #d3d6db;
146 | box-sizing: border-box;
147 | display: inline-block;
148 | font-size: 12px;
149 | height: 24px;
150 | margin-bottom: 12px;
151 | padding: 3px 8px 5px;
152 | vertical-align: middle;
153 | width: 100%;
154 | }
155 |
156 | .DocumentationPanel .search-box-input {
157 | border: 0;
158 | font-size: 12px;
159 | margin: 0;
160 | outline: 0;
161 | padding: 0;
162 | width: 100%;
163 | }
--------------------------------------------------------------------------------
/scss/vendor/graphiql/_foldgutter.scss:
--------------------------------------------------------------------------------
1 | .CodeMirror-foldmarker {
2 | color: blue;
3 | text-shadow: #b9f 1px 1px 2px, #b9f -1px -1px 2px, #b9f 1px -1px 2px, #b9f -1px 1px 2px;
4 | font-family: arial;
5 | line-height: .3;
6 | cursor: pointer;
7 | }
8 | .CodeMirror-foldgutter {
9 | width: .7em;
10 | }
11 | .CodeMirror-foldgutter-open,
12 | .CodeMirror-foldgutter-folded {
13 | cursor: pointer;
14 | }
15 | .CodeMirror-foldgutter-open:after {
16 | content: "\25BE";
17 | }
18 | .CodeMirror-foldgutter-folded:after {
19 | content: "\25B8";
20 | }
--------------------------------------------------------------------------------
/scss/vendor/graphiql/_graphiql.scss:
--------------------------------------------------------------------------------
1 | @import "app";
2 | @import "codemirror";
3 | @import "doc-explorer";
4 | @import "foldgutter";
5 | @import "lint";
6 | @import "loading";
7 | @import "show-hint";
--------------------------------------------------------------------------------
/scss/vendor/graphiql/_lint.scss:
--------------------------------------------------------------------------------
1 | /* The lint marker gutter */
2 | .CodeMirror-lint-markers {
3 | width: 16px;
4 | }
5 |
6 | .CodeMirror-lint-tooltip {
7 | background-color: infobackground;
8 | border: 1px solid black;
9 | border-radius: 4px 4px 4px 4px;
10 | color: infotext;
11 | font-family: monospace;
12 | font-size: 10pt;
13 | overflow: hidden;
14 | padding: 2px 5px;
15 | position: fixed;
16 | white-space: pre;
17 | white-space: pre-wrap;
18 | z-index: 100;
19 | max-width: 600px;
20 | opacity: 0;
21 | transition: opacity .4s;
22 | -moz-transition: opacity .4s;
23 | -webkit-transition: opacity .4s;
24 | -o-transition: opacity .4s;
25 | -ms-transition: opacity .4s;
26 | }
27 |
28 | .CodeMirror-lint-mark-error, .CodeMirror-lint-mark-warning {
29 | background-position: left bottom;
30 | background-repeat: repeat-x;
31 | }
32 |
33 | .CodeMirror-lint-mark-error {
34 | background-image:
35 | url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAQAAAADCAYAAAC09K7GAAAAAXNSR0IArs4c6QAAAAZiS0dEAP8A/wD/oL2nkwAAAAlwSFlzAAALEwAACxMBAJqcGAAAAAd0SU1FB9sJDw4cOCW1/KIAAAAZdEVYdENvbW1lbnQAQ3JlYXRlZCB3aXRoIEdJTVBXgQ4XAAAAHElEQVQI12NggIL/DAz/GdA5/xkY/qPKMDAwAADLZwf5rvm+LQAAAABJRU5ErkJggg==")
36 | ;
37 | }
38 |
39 | .CodeMirror-lint-mark-warning {
40 | background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAQAAAADCAYAAAC09K7GAAAAAXNSR0IArs4c6QAAAAZiS0dEAP8A/wD/oL2nkwAAAAlwSFlzAAALEwAACxMBAJqcGAAAAAd0SU1FB9sJFhQXEbhTg7YAAAAZdEVYdENvbW1lbnQAQ3JlYXRlZCB3aXRoIEdJTVBXgQ4XAAAAMklEQVQI12NkgIIvJ3QXMjAwdDN+OaEbysDA4MPAwNDNwMCwiOHLCd1zX07o6kBVGQEAKBANtobskNMAAAAASUVORK5CYII=");
41 | }
42 |
43 | .CodeMirror-lint-marker-error, .CodeMirror-lint-marker-warning {
44 | background-position: center center;
45 | background-repeat: no-repeat;
46 | cursor: pointer;
47 | display: inline-block;
48 | height: 16px;
49 | width: 16px;
50 | vertical-align: middle;
51 | position: relative;
52 | }
53 |
54 | .CodeMirror-lint-message-error, .CodeMirror-lint-message-warning {
55 | padding-left: 18px;
56 | background-position: top left;
57 | background-repeat: no-repeat;
58 | }
59 |
60 | .CodeMirror-lint-marker-error, .CodeMirror-lint-message-error {
61 | background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAAHlBMVEW7AAC7AACxAAC7AAC7AAAAAAC4AAC5AAD///+7AAAUdclpAAAABnRSTlMXnORSiwCK0ZKSAAAATUlEQVR42mWPOQ7AQAgDuQLx/z8csYRmPRIFIwRGnosRrpamvkKi0FTIiMASR3hhKW+hAN6/tIWhu9PDWiTGNEkTtIOucA5Oyr9ckPgAWm0GPBog6v4AAAAASUVORK5CYII=");
62 | }
63 |
64 | .CodeMirror-lint-marker-warning, .CodeMirror-lint-message-warning {
65 | background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAANlBMVEX/uwDvrwD/uwD/uwD/uwD/uwD/uwD/uwD/uwD6twD/uwAAAADurwD2tQD7uAD+ugAAAAD/uwDhmeTRAAAADHRSTlMJ8mN1EYcbmiixgACm7WbuAAAAVklEQVR42n3PUQqAIBBFUU1LLc3u/jdbOJoW1P08DA9Gba8+YWJ6gNJoNYIBzAA2chBth5kLmG9YUoG0NHAUwFXwO9LuBQL1giCQb8gC9Oro2vp5rncCIY8L8uEx5ZkAAAAASUVORK5CYII=");
66 | }
67 |
68 | .CodeMirror-lint-marker-multiple {
69 | background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAcAAAAHCAMAAADzjKfhAAAACVBMVEUAAAAAAAC/v7914kyHAAAAAXRSTlMAQObYZgAAACNJREFUeNo1ioEJAAAIwmz/H90iFFSGJgFMe3gaLZ0od+9/AQZ0ADosbYraAAAAAElFTkSuQmCC");
70 | background-repeat: no-repeat;
71 | background-position: right bottom;
72 | width: 100%; height: 100%;
73 | }
--------------------------------------------------------------------------------
/scss/vendor/graphiql/_loading.scss:
--------------------------------------------------------------------------------
1 | .graphiql-container .spinner-container {
2 | position: absolute;
3 | top: 50%;
4 | height: 36px;
5 | width: 36px;
6 | left: 50%;
7 | transform: translate(-50%, -50%);
8 | z-index: 10;
9 | }
10 |
11 | .graphiql-container .spinner {
12 | vertical-align: middle;
13 | display: inline-block;
14 | height: 24px;
15 | width: 24px;
16 | position: absolute;
17 | -webkit-animation: rotation .6s infinite linear;
18 | -moz-animation: rotation .6s infinite linear;
19 | -o-animation: rotation .6s infinite linear;
20 | animation: rotation .6s infinite linear;
21 | border-left: 6px solid rgba(150, 150, 150, .15);
22 | border-right: 6px solid rgba(150, 150, 150, .15);
23 | border-bottom: 6px solid rgba(150, 150, 150, .15);
24 | border-top: 6px solid rgba(150, 150, 150, .8);
25 | border-radius: 100%;
26 | }
27 |
28 | @-webkit-keyframes rotation {
29 | from { -webkit-transform: rotate(0deg); }
30 | to { -webkit-transform: rotate(359deg); }
31 | }
32 |
33 | @-moz-keyframes rotation {
34 | from { -moz-transform: rotate(0deg); }
35 | to { -moz-transform: rotate(359deg); }
36 | }
37 |
38 | @-o-keyframes rotation {
39 | from { -o-transform: rotate(0deg); }
40 | to { -o-transform: rotate(359deg); }
41 | }
42 |
43 | @keyframes rotation {
44 | from { transform: rotate(0deg); }
45 | to { transform: rotate(359deg); }
46 | }
--------------------------------------------------------------------------------
/scss/vendor/graphiql/_show-hint.scss:
--------------------------------------------------------------------------------
1 | .CodeMirror-hints {
2 | background: white;
3 | -webkit-box-shadow: 0 1px 3px rgba(0, 0, 0, 0.45);
4 | -moz-box-shadow: 0 1px 3px rgba(0, 0, 0, 0.45);
5 | box-shadow: 0 1px 3px rgba(0, 0, 0, 0.45);
6 | font-family: 'Consolas', 'Inconsolata', 'Droid Sans Mono', 'Monaco', monospace;
7 | font-size: 13px;
8 | list-style: none;
9 | margin: 0;
10 | margin-left: -6px;
11 | max-height: 14.5em;
12 | overflow-y: auto;
13 | overflow: hidden;
14 | padding: 0;
15 | position: absolute;
16 | z-index: 10;
17 | }
18 |
19 | .CodeMirror-hints-wrapper {
20 | background: white;
21 | -webkit-box-shadow: 0 1px 3px rgba(0, 0, 0, 0.45);
22 | -moz-box-shadow: 0 1px 3px rgba(0, 0, 0, 0.45);
23 | box-shadow: 0 1px 3px rgba(0, 0, 0, 0.45);
24 | margin-left: -6px;
25 | position: absolute;
26 | z-index: 10;
27 | }
28 |
29 | .CodeMirror-hints-wrapper .CodeMirror-hints {
30 | -webkit-box-shadow: none;
31 | -moz-box-shadow: none;
32 | box-shadow: none;
33 | position: relative;
34 | margin-left: 0;
35 | z-index: 0;
36 | }
37 |
38 | .CodeMirror-hint {
39 | border-top: solid 1px #f7f7f7;
40 | color: #141823;
41 | cursor: pointer;
42 | margin: 0;
43 | max-width: 300px;
44 | overflow: hidden;
45 | padding: 2px 6px;
46 | white-space: pre;
47 | }
48 |
49 | li.CodeMirror-hint-active {
50 | background-color: #08f;
51 | border-top-color: white;
52 | color: white;
53 | }
54 |
55 | .CodeMirror-hint-information {
56 | border-top: solid 1px #c0c0c0;
57 | max-width: 300px;
58 | padding: 4px 6px;
59 | position: relative;
60 | z-index: 1;
61 | }
62 |
63 | .CodeMirror-hint-information:first-child {
64 | border-bottom: solid 1px #c0c0c0;
65 | border-top: none;
66 | margin-bottom: -1px;
67 | }
--------------------------------------------------------------------------------
/src/app/components/graphiql/utils/get-operation-name.js:
--------------------------------------------------------------------------------
1 | import get from "lodash/get"
2 |
3 | export default function getOperationName(queryFacts) {
4 | return get(queryFacts, 'operations[0].name.value')
5 | }
--------------------------------------------------------------------------------
/src/app/components/graphiql/utils/get-operation-type.js:
--------------------------------------------------------------------------------
1 | import get from "lodash/get"
2 |
3 | export default function getOperationType(queryFacts) {
4 | return get(queryFacts, 'operations[0].operation')
5 | }
--------------------------------------------------------------------------------
/src/app/components/graphiql/utils/get-query-facts.js:
--------------------------------------------------------------------------------
1 | import {parse, typeFromAST} from 'graphql'
2 |
3 | /**
4 | * Provided previous "queryFacts", a GraphQL schema, and a query document
5 | * string, return a set of facts about that query useful for GraphiQL features.
6 | *
7 | * If the query cannot be parsed, returns undefined.
8 | */
9 | export default function getQueryFacts(schema, documentStr) {
10 | if (!documentStr) {
11 | return
12 | }
13 |
14 | let documentAST
15 | try {
16 | documentAST = parse(documentStr)
17 | } catch (e) {
18 | return
19 | }
20 |
21 | const variableToType = schema ? collectVariables(schema, documentAST) : null
22 |
23 | // Collect operations by their names.
24 | const operations = []
25 | documentAST.definitions.forEach(def => {
26 | if (def.kind === 'OperationDefinition') {
27 | operations.push(def)
28 | }
29 | })
30 |
31 | return {variableToType, operations}
32 | }
33 |
34 | /**
35 | * Provided a schema and a document, produces a `variableToType` Object.
36 | */
37 | export function collectVariables(schema, documentAST) {
38 | const variableToType = Object.create(null)
39 | documentAST.definitions.forEach(definition => {
40 | if (definition.kind === 'OperationDefinition') {
41 | const variableDefinitions = definition.variableDefinitions
42 | if (variableDefinitions) {
43 | variableDefinitions.forEach(({variable, type}) => {
44 | const inputType = typeFromAST(schema, type)
45 | if (inputType) {
46 | variableToType[variable.name.value] = inputType
47 | }
48 | })
49 | }
50 | }
51 | })
52 | return variableToType
53 | }
--------------------------------------------------------------------------------
/src/app/components/layout-view.jsx:
--------------------------------------------------------------------------------
1 | import React from 'react'
2 |
3 | export default () => {
4 |
5 | return class LayoutView extends React.Component {
6 |
7 | render() {
8 | return (
9 |
10 | {this.props.children}
11 |
12 | )
13 | }
14 | }
15 | }
--------------------------------------------------------------------------------
/src/app/components/layout/layout.jsx:
--------------------------------------------------------------------------------
1 | import React from "react"
2 |
3 | export default () => {
4 |
5 | return class Layout extends React.Component {
6 |
7 | state = {
8 | width: 0,
9 | height: 0
10 | }
11 |
12 | componentDidMount() {
13 | window.addEventListener('resize', this.handleWindowResize)
14 | this.handleWindowResize()
15 | }
16 |
17 | render() {
18 | return this.props.children({
19 | width: this.state.width,
20 | height: this.state.height
21 | })
22 | }
23 |
24 | handleWindowResize = () => {
25 | this.setState({
26 | width: window.innerWidth,
27 | height: window.innerHeight
28 | })
29 | }
30 | }
31 | }
--------------------------------------------------------------------------------
/src/app/components/loader/loader.jsx:
--------------------------------------------------------------------------------
1 | import React from "react"
2 |
3 | export default () => {
4 |
5 | return (props) => (
6 |
7 |
8 |
9 |
10 | {props.message}
11 |
12 |
13 |
14 | )
15 | }
--------------------------------------------------------------------------------
/src/app/components/map-editor/map-editor.jsx:
--------------------------------------------------------------------------------
1 | import React from "react"
2 | import {Map} from "immutable"
3 |
4 | export default (MapItem) => {
5 |
6 | return class MapEditor extends React.Component {
7 |
8 | state = {
9 | value: Map()
10 | }
11 |
12 | componentDidMount() {
13 | this.computeValue(this.props)
14 | }
15 |
16 | componentWillUpdate(nextProps) {
17 |
18 | if (this.props.value !== nextProps.value) {
19 | this.computeValue(nextProps)
20 | }
21 | }
22 |
23 | computeValue(props) {
24 | this.setState({
25 | value: props.value
26 | })
27 | }
28 |
29 | render() {
30 |
31 | return (
32 |
40 | {this.state.value.size ? (
41 |
42 | {this.state.value.map((value, key, map) => {
43 |
44 | const index = map.keySeq().indexOf(key)
45 |
46 | return (
47 |
55 | )
56 | }).toArray()}
57 |
58 | ) : (
59 |
60 |
61 |
62 | {this.props.noContentMessage}
63 |
64 |
65 |
66 | )}
67 |
87 |
88 | )
89 | }
90 |
91 | handleAddClick = e => {
92 |
93 | if (this.state.value.has('')) {
94 | return
95 | }
96 |
97 | this.setState({
98 | value: this.state.value.set('', '')
99 | }, () => this.emitChanges())
100 | }
101 |
102 | handleKeyChange = ({id, key}) => {
103 |
104 | const value = this.state.value.get(id)
105 |
106 | this.setState({
107 | value: this.state.value
108 | .remove(id)
109 | .set(key, value)
110 | }, () => this.emitChanges())
111 | }
112 |
113 | handleValueChange = ({id, value}) => {
114 |
115 | this.setState({
116 | value: this.state.value
117 | .set(id, value)
118 | }, () => this.emitChanges())
119 | }
120 |
121 | handleRemove = ({id}) => {
122 |
123 | this.setState({
124 | value: this.state.value.remove(id)
125 | }, () => this.emitChanges())
126 | }
127 |
128 | handleClearClick = e => {
129 |
130 | this.setState({
131 | value: Map()
132 | }, () => this.emitChanges())
133 | }
134 |
135 | emitChanges() {
136 |
137 | this.props.onChange({
138 | value: this.state.value
139 | })
140 | }
141 | }
142 | }
--------------------------------------------------------------------------------
/src/app/components/map-editor/map-item.jsx:
--------------------------------------------------------------------------------
1 | import React from "react"
2 | import ReactDOM from "react-dom"
3 | import cn from "classnames"
4 | import {FormGroup, FormControl, ControlLabel} from "react-bootstrap"
5 |
6 | export default () => {
7 |
8 | return class MapItem extends React.Component {
9 |
10 | componentDidMount() {
11 |
12 | if (this.refs.key) {
13 | ReactDOM.findDOMNode(this.refs.key).focus()
14 | }
15 | }
16 |
17 | render() {
18 |
19 | return (
20 |
21 |
24 |
31 |
32 |
35 |
42 |
43 |
51 |
52 | )
53 | }
54 |
55 | handleKeyChange = e => {
56 |
57 | this.props.onKeyChange({
58 | e,
59 | id: this.props.id,
60 | key: e.target.value
61 | })
62 | }
63 |
64 | handleValueChange = e => {
65 |
66 | this.props.onValueChange({
67 | e,
68 | id: this.props.id,
69 | value: e.target.value
70 | })
71 | }
72 |
73 | handleRemove = e => {
74 |
75 | this.props.onRemove({
76 | id: this.props.id
77 | })
78 | }
79 | }
80 | }
--------------------------------------------------------------------------------
/src/app/components/panel/panel-body.jsx:
--------------------------------------------------------------------------------
1 | import React from "react"
2 | import cn from "classnames"
3 |
4 | export default () => {
5 |
6 | return class PanelBody extends React.Component {
7 |
8 | render() {
9 |
10 | return (
11 |
17 | {this.props.children}
18 |
19 | )
20 | }
21 | }
22 | }
--------------------------------------------------------------------------------
/src/app/components/panel/panel-footer.jsx:
--------------------------------------------------------------------------------
1 | import React from "react"
2 |
3 | export default () => {
4 |
5 | return class PanelFooter extends React.Component {
6 |
7 | render() {
8 |
9 | return (
10 |
11 | {this.props.children}
12 |
13 | )
14 | }
15 | }
16 | }
--------------------------------------------------------------------------------
/src/app/components/panel/panel-header.jsx:
--------------------------------------------------------------------------------
1 | import React from "react"
2 |
3 | export default () => {
4 |
5 | return class PanelHeader extends React.Component {
6 |
7 | render() {
8 |
9 | return (
10 |
11 | {this.props.children}
12 |
13 | )
14 | }
15 | }
16 | }
--------------------------------------------------------------------------------
/src/app/components/panel/panel.jsx:
--------------------------------------------------------------------------------
1 | import React from "react"
2 |
3 | export default () => {
4 |
5 | return class Panel extends React.Component {
6 |
7 | render() {
8 |
9 | return (
10 |
17 | {this.props.children}
18 |
19 | )
20 | }
21 | }
22 | }
--------------------------------------------------------------------------------
/src/app/components/project-list/project-list-item.jsx:
--------------------------------------------------------------------------------
1 | import React from "react"
2 | import ReactDOM from "react-dom"
3 | import {remote} from "electron"
4 | const {Menu, MenuItem} = remote
5 |
6 | export default () => {
7 |
8 | return class ProjectListItem extends React.Component {
9 |
10 | state = {
11 | menu: null
12 | }
13 |
14 | componentWillMount() {
15 |
16 | const menu = new Menu()
17 | const items = [
18 | new MenuItem({
19 | label: 'Export Project',
20 | click: this.handleExport
21 | }),
22 | new MenuItem({
23 | label: 'Export Project (version 1.0)',
24 | click: this.handleVersionOneExport
25 | }),
26 | new MenuItem({
27 | type: 'separator',
28 | }),
29 | new MenuItem({
30 | label: 'Delete Project',
31 | click: this.handleRemove
32 | })
33 | ]
34 |
35 | items.forEach(item => menu.append(item))
36 |
37 | this.setState({
38 | menu
39 | })
40 | }
41 |
42 | componentDidMount() {
43 |
44 | const el = ReactDOM.findDOMNode(this)
45 | el.addEventListener('contextmenu', this.handleContextMenu)
46 | }
47 |
48 | componentWillUnmount() {
49 |
50 | const el = ReactDOM.findDOMNode(this)
51 | el.removeEventListener('contextmenu', this.handleContextMenu)
52 | }
53 |
54 | render() {
55 |
56 | return (
57 |
58 |
59 |
66 | {this.props.shortname}
67 |
68 |
69 | {this.props.title}
70 |
71 |
72 | {this.props.description}
73 |
74 |
75 | {this.props.meta}
76 |
77 |
78 |
79 | )
80 | }
81 |
82 | handleContextMenu = e => {
83 | e.preventDefault()
84 |
85 | if (this.props.onRemove) {
86 | this.state.menu.popup(remote.getCurrentWindow())
87 | }
88 | }
89 |
90 | handleVersionOneExport = e => {
91 | this.props.onVersionOneExport({
92 | id: this.props.id,
93 | e
94 | })
95 | }
96 |
97 | handleExport = e => {
98 | this.props.onExport({
99 | id: this.props.id,
100 | e
101 | })
102 | }
103 |
104 | handleRemove = e => {
105 | this.props.onRemove({
106 | id: this.props.id,
107 | e
108 | })
109 | }
110 |
111 | handleClick = e => {
112 | this.props.onClick({
113 | id: this.props.id,
114 | e
115 | })
116 | }
117 | }
118 | }
--------------------------------------------------------------------------------
/src/app/components/query-list/query-list-item.jsx:
--------------------------------------------------------------------------------
1 | import cn from "classnames"
2 | import React from "react"
3 | import ReactDOM from "react-dom"
4 | import {remote} from "electron"
5 | const {Menu, MenuItem} = remote
6 |
7 | export default () => {
8 |
9 | return class QueryListItem extends React.Component {
10 |
11 | componentWillMount() {
12 |
13 | const menu = new Menu()
14 | const menuItem = new MenuItem({
15 | label: 'Delete Query',
16 | click: this.handleRemove
17 | })
18 | menu.append(menuItem)
19 |
20 | this.setState({
21 | menu
22 | })
23 | }
24 |
25 | componentDidMount() {
26 |
27 | const el = ReactDOM.findDOMNode(this)
28 | el.addEventListener('contextmenu', this.handleContextMenu)
29 | }
30 |
31 | componentWillUnmount() {
32 |
33 | const el = ReactDOM.findDOMNode(this)
34 | el.removeEventListener('contextmenu', this.handleContextMenu)
35 | }
36 |
37 | render() {
38 |
39 | return (
40 |
46 |
47 |
48 |
49 | {this.props.shortname}
50 |
51 |
52 |
53 |
54 |
55 |
56 |
57 | {this.props.title}
58 |
59 |
60 |
61 |
62 | {this.props.meta}
63 |
64 |
65 |
66 |
67 |
68 | {this.props.subTitle}
69 |
70 |
71 | {this.props.subMeta}
72 |
73 |
74 |
75 |
76 | )
77 | }
78 |
79 | handleClick = e => {
80 |
81 | this.props.onClick({
82 | e,
83 | id: this.props.id
84 | })
85 | }
86 |
87 | handleRemove = e => {
88 |
89 | this.props.onRemove({
90 | e,
91 | id: this.props.id
92 | })
93 | }
94 |
95 | handleContextMenu = e => {
96 | e.preventDefault()
97 |
98 | if (this.props.onRemove) {
99 | this.state.menu.popup(remote.getCurrentWindow())
100 | }
101 | }
102 | }
103 | }
--------------------------------------------------------------------------------
/src/app/components/query-list/query-list.jsx:
--------------------------------------------------------------------------------
1 | import React from "react"
2 | import ReactList from "react-list"
3 |
4 | export default (QueryListItem) => {
5 |
6 | return class QueryList extends React.Component {
7 |
8 | state = {
9 | query: ''
10 | }
11 |
12 | componentWillMount() {
13 |
14 | this.filterData({
15 | query: this.state.query,
16 | props: this.props
17 | })
18 | }
19 |
20 | componentWillUpdate(nextProps) {
21 |
22 | if (this.props.data !== nextProps.data) {
23 | this.filterData({
24 | query: this.state.query,
25 | props: nextProps
26 | })
27 | }
28 | }
29 |
30 | filterData({props, query}) {
31 |
32 | const filterFn = item => {
33 | return item.get('title').toLowerCase().indexOf(query.toLowerCase()) !== -1
34 | }
35 |
36 | this.setState({
37 | data: props.data.filter(item => filterFn(item))
38 | })
39 | }
40 |
41 | render() {
42 |
43 | return (
44 |
59 | )
60 | }
61 |
62 | handleQueryChange = e => {
63 |
64 | this.setState({
65 | query: e.target.value
66 | }, () => this.filterData({
67 | props: this.props,
68 | query: this.state.query
69 | }))
70 | }
71 |
72 | handleItemRender = (index, key) => {
73 |
74 | const item = this.state.data.get(index)
75 |
76 | return (
77 |
89 | )
90 | }
91 |
92 | handleClick = ({e, id}) => {
93 |
94 | this.props.onItemClick({
95 | e,
96 | id
97 | })
98 | }
99 |
100 | handleRemove = ({e, id}) => {
101 |
102 | this.props.onItemRemove({
103 | e,
104 | id
105 | })
106 | }
107 | }
108 | }
--------------------------------------------------------------------------------
/src/app/components/root-view.jsx:
--------------------------------------------------------------------------------
1 | import React from 'react'
2 | import {Provider} from "react-redux"
3 |
4 | export default (store, RouterView) => {
5 |
6 | return class RootView extends React.Component {
7 |
8 | render() {
9 | return (
10 |
15 | )
16 | }
17 | }
18 | }
--------------------------------------------------------------------------------
/src/app/components/router-view.jsx:
--------------------------------------------------------------------------------
1 | import React from "react"
2 | import {Router, Route, IndexRedirect} from "react-router"
3 |
4 | export default (history, LayoutView, ProjectList, ProjectDetail) => {
5 |
6 | return class RouterView extends React.Component {
7 |
8 | render() {
9 |
10 | return (
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 | )
19 | }
20 | }
21 | }
--------------------------------------------------------------------------------
/src/app/components/tabs/tab-add-button.jsx:
--------------------------------------------------------------------------------
1 | import React from "react"
2 |
3 | export default () => {
4 |
5 | return class TabAddButton extends React.Component {
6 |
7 | render() {
8 |
9 | return (
10 |
17 |
18 |
19 | )
20 | }
21 |
22 | handleClick = (e) => {
23 | this.props.onClick({
24 | e
25 | })
26 | }
27 | }
28 | }
--------------------------------------------------------------------------------
/src/app/components/tabs/tab-item.jsx:
--------------------------------------------------------------------------------
1 | import React from "react"
2 | import cn from "classnames"
3 |
4 | export default () => {
5 |
6 | return class TabItem extends React.Component {
7 |
8 | render() {
9 |
10 | return (
11 |
21 |
22 | {this.props.title}
23 |
24 |
28 |
29 |
30 | )
31 | }
32 |
33 | handleClick = (e) => {
34 |
35 | this.props.onClick({
36 | id: this.props.id,
37 | e
38 | })
39 | }
40 |
41 | handleRemove = (e) => {
42 |
43 | e.stopPropagation()
44 |
45 | this.props.onRemove({
46 | id: this.props.id,
47 | e
48 | })
49 | }
50 | }
51 | }
--------------------------------------------------------------------------------
/src/app/components/tabs/tabs.jsx:
--------------------------------------------------------------------------------
1 | import React from "react"
2 |
3 | export default (TabItem, TabAddButton) => {
4 |
5 | return class Tabs extends React.Component {
6 |
7 | render() {
8 |
9 | const ADD_TAB_SIZE = this.props.height
10 |
11 | const tabMaxWidth = (this.props.width - ADD_TAB_SIZE) / this.props.tabs.size
12 |
13 | return (
14 |
21 | {this.props.tabs.map((tab, index) => (
22 |
32 | )).toArray()}
33 |
37 |
38 | )
39 | }
40 |
41 | handleAdd = (e) => {
42 | this.props.onAdd({
43 | e
44 | })
45 | }
46 |
47 | handleClick = (params) => {
48 | this.props.onClick(params)
49 | }
50 |
51 | handleRemove = (params) => {
52 | this.props.onRemove(params)
53 | }
54 | }
55 | }
--------------------------------------------------------------------------------
/src/app/components/view.jsx:
--------------------------------------------------------------------------------
1 | import React from "react"
2 | import map from "lodash/map"
3 | import reduce from "lodash/reduce"
4 | import extend from "lodash/extend"
5 |
6 | export default (Loader) => {
7 |
8 | return (mapQueriesToProps, mapMutationsToProps) => {
9 |
10 | return (Component) => {
11 |
12 | return class View extends React.Component {
13 |
14 | state = {
15 | props: null
16 | }
17 |
18 | componentDidMount() {
19 | this.reload()
20 | }
21 |
22 | render() {
23 |
24 | if (!this.state.props) {
25 | return (
26 |
29 | )
30 | }
31 |
32 | return (
33 |
34 | )
35 | }
36 |
37 | reload = () => {
38 |
39 | const promises = map(mapQueriesToProps(this.props), (resolver, key) => resolver.then(value => ({
40 | key,
41 | value
42 | })))
43 |
44 | Promise.all(promises).then(results => {
45 |
46 | this.setState({
47 | props: reduce(results, (result, entry) => {
48 | result[entry.key] = entry.value
49 | return result
50 | }, extend({}, mapMutationsToProps))
51 | })
52 | })
53 | }
54 | }
55 | }
56 | }
57 | }
--------------------------------------------------------------------------------
/src/app/components/workspace/menu-item.jsx:
--------------------------------------------------------------------------------
1 | import React from "react"
2 | import cn from "classnames"
3 |
4 | export default () => {
5 |
6 | return class MenuItem extends React.Component {
7 |
8 | render() {
9 |
10 | return (
11 |
14 |
21 |
22 | {this.props.description}
23 |
24 |
25 |
26 | )
27 | }
28 | }
29 | }
--------------------------------------------------------------------------------
/src/app/components/workspace/workspace-header.jsx:
--------------------------------------------------------------------------------
1 | import React from "react"
2 |
3 | export default () => {
4 |
5 | return class WorkspaceHeader extends React.Component {
6 |
7 | render() {
8 |
9 | return (
10 |
17 |
18 | {this.props.left}
19 |
20 |
21 | {this.props.center}
22 |
23 |
24 | {this.props.right}
25 |
26 |
27 | )
28 | }
29 | }
30 | }
--------------------------------------------------------------------------------
/src/app/config.js:
--------------------------------------------------------------------------------
1 | import {Map} from "immutable"
2 |
3 | export default () => {
4 |
5 | return Map({
6 | version: "1.0"
7 | })
8 | }
--------------------------------------------------------------------------------
/src/app/data/data-collection.js:
--------------------------------------------------------------------------------
1 | import {List, Map, fromJS} from "immutable"
2 |
3 | function hydrateReducer(type) {
4 |
5 | return (state, action) => {
6 |
7 | let ids = List()
8 | let records = Map()
9 |
10 | action.payload.forEach(entity => {
11 | records = records.set(entity.get('id'), entity)
12 | ids = ids.push(entity.get('id'))
13 | })
14 |
15 | return state
16 | .update(type + 'ById', cache => cache.merge(records))
17 | .update(type, () => ids)
18 | }
19 | }
20 |
21 | function createReducer(type) {
22 |
23 | return (state, action) => {
24 |
25 | let record = state.getIn([type + 'ById', action.payload.id])
26 |
27 | if (!record) {
28 | state = state.update(type + 'ById', cache => {
29 | return cache.set(action.payload.id, fromJS(action.payload.data))
30 | })
31 | }
32 |
33 | const ids = state.get(type)
34 |
35 | if (!ids.includes(action.payload.id)) {
36 | state = state.update(type, entities => entities.push(action.payload.id))
37 | }
38 |
39 | return state
40 | }
41 | }
42 |
43 | function updateReducer(type) {
44 |
45 | return (state, action) => {
46 |
47 | if (state.hasIn([type + 'ById', action.payload.id])) {
48 | return state.updateIn([type + 'ById', action.payload.id], record => {
49 | return record.merge(action.payload.data)
50 | })
51 | }
52 |
53 | return state
54 | }
55 | }
56 |
57 | function removeReducer(type) {
58 |
59 | return (state, action) => {
60 |
61 | if (state.hasIn([type + 'ById', action.payload.id])) {
62 | state = state.deleteIn([type + 'ById', action.payload.id])
63 | }
64 |
65 | const ids = state.get(type)
66 |
67 | if (ids.includes(action.payload.id)) {
68 | state = state.update(type, entities => entities.filter(id => id !== action.payload.id))
69 | }
70 |
71 | return state
72 | }
73 | }
74 |
75 | function clearReducer(type) {
76 |
77 | return (state, action) => {
78 |
79 | return state
80 | .update(type + 'ById', cache => {
81 | state.get(type).forEach(id => {
82 | cache = cache.remove(id)
83 | })
84 | return cache
85 | })
86 | .update(type, () => List())
87 | }
88 | }
89 |
90 | export default class DataCollection {
91 |
92 | constructor(name) {
93 | this.name = name
94 | this.actions = Map()
95 | }
96 |
97 | action(name, handler) {
98 | this.actions = this.actions.set(name, handler)
99 | return this
100 | }
101 |
102 | createAction() {
103 | return this.action('CREATE', createReducer(this.name))
104 | }
105 |
106 | updateAction() {
107 | return this.action('UPDATE', updateReducer(this.name))
108 | }
109 |
110 | removeAction() {
111 | return this.action('REMOVE', removeReducer(this.name))
112 | }
113 | }
114 |
--------------------------------------------------------------------------------
/src/app/data/data-store.js:
--------------------------------------------------------------------------------
1 | import {List, Map} from "immutable"
2 | import camelCase from "camel-case"
3 | import set from "lodash/set"
4 | import toUpper from "lodash/toUpper"
5 | import snakeCase from "snake-case"
6 |
7 |
8 | export default class DataStore {
9 |
10 | constructor() {
11 | this.collections = Map()
12 | }
13 |
14 | collection(collection) {
15 | this.collections = this.collections.set(collection.name, collection)
16 | return this
17 | }
18 |
19 | getInitialState() {
20 |
21 | return this.collections.reduce((result, collection) => {
22 |
23 | return result
24 | .set(`${collection.name}ById`, Map())
25 | .set(`${collection.name}`, List())
26 |
27 | }, Map())
28 | }
29 |
30 | getActions() {
31 |
32 | return this.collections.reduce((result, collection) => {
33 |
34 | const prefix = toUpper(snakeCase(collection.name))
35 |
36 | collection.actions.forEach((handler, action) => {
37 | result = result.set(prefix + '_' + action, handler)
38 | })
39 |
40 | return result
41 | }, Map())
42 | }
43 |
44 | getActionCreators() {
45 |
46 | return this.collections.reduce((result, collection) => {
47 |
48 | const prefix = toUpper(snakeCase(collection.name))
49 |
50 | collection.actions.forEach((handler, action) => {
51 | set(result, [collection.name, camelCase(action)], payload => ({
52 | type: prefix + '_' + action,
53 | payload
54 | }))
55 | })
56 |
57 | return result
58 | }, {})
59 | }
60 |
61 | getFlatActionCreators() {
62 |
63 | const actions = this.getActions()
64 |
65 | return actions.reduce((result, handler, type) => {
66 |
67 | const name = camelCase(type)
68 |
69 | result[name] = (payload) => {
70 |
71 | return {
72 | type,
73 | payload
74 | }
75 | }
76 | return result
77 | }, {})
78 | }
79 | }
--------------------------------------------------------------------------------
/src/app/di.js:
--------------------------------------------------------------------------------
1 | import reduce from "lodash/reduce"
2 | import isEmpty from "lodash/isEmpty"
3 |
4 | function createDependencyObject(dependencies) {
5 |
6 | return reduce(dependencies, (result, dependency, name) => {
7 |
8 | const depName = name.split('/').pop()
9 |
10 | if (!isEmpty(depName)) {
11 | result[depName] = dependency
12 | return result
13 | }
14 |
15 | return result
16 |
17 | }, {})
18 | }
19 |
20 | export default () => {
21 |
22 | let factories = {}
23 | let cache = {}
24 |
25 | function register(options) {
26 | factories[options.name] = Object.assign({}, {
27 | dependencies: [],
28 | namedParams: false
29 | }, options)
30 | }
31 |
32 | function get(name) {
33 |
34 | let instance = cache[name]
35 |
36 | if (!instance && factories[name]) {
37 |
38 | const {factory, dependencies, namedParams} = factories[name]
39 |
40 | let resolvedDeps = dependencies.reduce((result, depName) => {
41 |
42 | const factoryObj = factories[depName]
43 |
44 | if (!factoryObj) {
45 | throw `Could not resolve ${depName} on ${name}`
46 | }
47 |
48 | if (factoryObj.dependencies.indexOf(name) !== -1) {
49 | throw `No circular dependencies allowed: '${name}' -> '${depName}' -> '${name}'`
50 | }
51 |
52 | result[depName] = get(depName)
53 |
54 | return result
55 |
56 | }, {})
57 |
58 | if (!factory) {
59 | throw `No factory defined for ${name}`
60 | }
61 |
62 | if (namedParams) {
63 | resolvedDeps = [createDependencyObject(resolvedDeps)]
64 | } else {
65 | resolvedDeps = Object.keys(resolvedDeps).map(key => resolvedDeps[key])
66 | }
67 |
68 | instance = factory.apply(factory, resolvedDeps)
69 | cache[name] = instance
70 | }
71 |
72 | return instance
73 | }
74 |
75 | return {
76 | register,
77 | get
78 | }
79 | }
--------------------------------------------------------------------------------
/src/app/index.jsx:
--------------------------------------------------------------------------------
1 | import React from "react"
2 | import ReactDOM from "react-dom"
3 |
4 | export default (RootView) => {
5 |
6 | function renderApplicationRoot() {
7 | return new Promise((resolve) => {
8 | ReactDOM.render( , document.getElementById('root'), resolve)
9 | })
10 | }
11 |
12 | function removeApplicationLoader() {
13 | document.getElementById('app-loader').remove()
14 | }
15 |
16 | function run() {
17 | renderApplicationRoot()
18 | .then(() => removeApplicationLoader())
19 | }
20 |
21 | return {
22 | run
23 | }
24 | }
--------------------------------------------------------------------------------
/src/app/reducers/app.js:
--------------------------------------------------------------------------------
1 | import {Map} from "immutable"
2 |
3 | export default () => {
4 |
5 | const INITIAL_STATE = Map({
6 | version: "1.0"
7 | })
8 |
9 | return (state = INITIAL_STATE) => {
10 | return state
11 | }
12 | }
--------------------------------------------------------------------------------
/src/app/reducers/data-store.js:
--------------------------------------------------------------------------------
1 | function importReducer(state, action) {
2 |
3 | const {payload} = action
4 |
5 | const types = ['projects', 'environments', 'queries']
6 |
7 | types.forEach(type => {
8 |
9 | state = state
10 | .update(type + 'ById', cache => {
11 | return cache.merge(payload.get(type + 'ById'))
12 | })
13 | .update(type, cache => {
14 | return cache.concat(payload.get(type))
15 | })
16 | })
17 |
18 | return state
19 | }
20 |
21 | export default (dataStore) => {
22 |
23 | const initialState = dataStore.getInitialState()
24 | const actions = dataStore.getActions()
25 |
26 | return (state = initialState, action) => {
27 |
28 | const handler = actions.get(action.type)
29 |
30 | if (handler) {
31 | return handler(state, action)
32 | }
33 |
34 | switch (action.type) {
35 |
36 | case 'IMPORT':
37 | return importReducer(state, action)
38 | }
39 |
40 | return state
41 | }
42 | }
--------------------------------------------------------------------------------
/src/app/reducers/root.js:
--------------------------------------------------------------------------------
1 | import {combineReducers} from "redux-immutable"
2 |
3 | export default (app, dataStore) => {
4 |
5 | return combineReducers({
6 | app,
7 | dataStore
8 | })
9 | }
--------------------------------------------------------------------------------
/src/app/services/actions.js:
--------------------------------------------------------------------------------
1 | import uuid from "uuid"
2 | import moment from "moment"
3 | import {fromJS, Map} from "immutable"
4 |
5 | export default (store, selectors) => {
6 | return {
7 | createProject: ({data}) => {
8 |
9 | const id = uuid.v4()
10 |
11 | return {
12 | type: 'CREATE_PROJECT',
13 | payload: {
14 | id: id,
15 | data: fromJS({
16 | id: id,
17 | updatedAt: moment().utc().toISOString(),
18 | createdAt: moment().utc().toISOString(),
19 | variables: [],
20 | headers: [],
21 | selectedEnvironmentId: null,
22 | environments: [],
23 | selectedTabId: null,
24 | tabs: [],
25 | settings: {
26 | queryMethod: 'POST',
27 | topPane: {
28 | state: null
29 | },
30 | leftPane: {
31 | state: null
32 | },
33 | rightPane: {
34 | state: null
35 | }
36 | }
37 | }).merge(data)
38 | }
39 | }
40 | },
41 | updateProject: (payload) => ({
42 | type: 'UPDATE_PROJECT',
43 | payload
44 | }),
45 | projectUpdateTab: ({projectId, tabId, updateFn}) => {
46 |
47 | const project = selectors.findProject(store.getState(), {projectId})
48 |
49 | return {
50 | type: 'UPDATE_PROJECT',
51 | payload: {
52 | id: projectId,
53 | data: project.get('source').update('tabs', tabs => {
54 | return tabs.map(tab => {
55 | if (tab.get('id') === tabId) {
56 | return updateFn(tab)
57 | }
58 | return tab
59 | })
60 | })
61 | }
62 | }
63 | },
64 | projectAddTab: ({projectId}) => {
65 |
66 | const project = selectors.findProject(store.getState(), {projectId})
67 |
68 | const tabId = uuid.v4()
69 |
70 | return {
71 | type: 'UPDATE_PROJECT',
72 | payload: {
73 | id: projectId,
74 | data: project.get('source').update('tabs', tabs => {
75 | return tabs.push(Map({
76 | id: tabId,
77 | title: 'New query',
78 | request: Map({
79 | id: uuid.v4(),
80 | query: '',
81 | operationName: '',
82 | variables: '',
83 | loading: false
84 | })
85 | }))
86 | })
87 | .merge({
88 | selectedTabId: tabId
89 | })
90 | }
91 | }
92 | }
93 | }
94 | }
--------------------------------------------------------------------------------
/src/app/services/actualize-state.js:
--------------------------------------------------------------------------------
1 | import {Map} from "immutable"
2 |
3 | export default () => {
4 |
5 | return (state) => {
6 |
7 | const version = state.getIn(['app', 'version'])
8 |
9 | if (version && version === "1.0") {
10 |
11 | state = state.setIn(['app', 'version'], "1.1")
12 |
13 | state = state.updateIn(['dataStore', 'environmentsById'], environments => {
14 | return environments.map(environment => {
15 | if (!environment.has('headers')) {
16 | return environment.set('headers', Map())
17 | }
18 | return environment
19 | })
20 | })
21 | }
22 |
23 | return state
24 | }
25 | }
--------------------------------------------------------------------------------
/src/app/services/data-store.js:
--------------------------------------------------------------------------------
1 | import DataStore from "app/data/data-store"
2 | import DataCollection from "app/data/data-collection"
3 |
4 | function attachReducer({type, listProperty, localKey, foreignKey}) {
5 |
6 | return (state, action) => {
7 |
8 | const localId = action.payload[localKey]
9 | const foreignId = action.payload[foreignKey]
10 |
11 | let item = state.getIn([type + 'ById', localId])
12 |
13 | if (item) {
14 |
15 | item = item.update(listProperty, ids => {
16 |
17 | if (!ids.includes(foreignId)) {
18 | return ids.push(foreignId)
19 | }
20 | return ids
21 | })
22 |
23 | state = state.setIn([type + 'ById', localId], item)
24 | }
25 |
26 | return state
27 | }
28 | }
29 |
30 | function detachReducer({type, listProperty, localKey, foreignKey}) {
31 |
32 | return (state, action) => {
33 |
34 | const localId = action.payload[localKey]
35 | const foreignId = action.payload[foreignKey]
36 |
37 | let item = state.getIn([type + 'ById', localId])
38 |
39 | if (item) {
40 |
41 | item = item.update(listProperty, ids => {
42 | return ids.filter(id => id !== foreignId)
43 | })
44 |
45 | state = state.setIn([type + 'ById', localId], item)
46 | }
47 |
48 | return state
49 | }
50 | }
51 |
52 | export default () => {
53 |
54 | return new DataStore()
55 | .collection(new DataCollection('projects')
56 | .createAction()
57 | .updateAction()
58 | .removeAction()
59 | .action('ATTACH_TAB', attachReducer({
60 | type: 'projects',
61 | listProperty: 'tabIds',
62 | localKey: 'projectId',
63 | foreignKey: 'tabId'
64 | }))
65 | .action('DETACH_TAB', detachReducer({
66 | type: 'projects',
67 | listProperty: 'tabIds',
68 | localKey: 'projectId',
69 | foreignKey: 'tabId'
70 | }))
71 | .action('ATTACH_ENVIRONMENT', attachReducer({
72 | type: 'projects',
73 | listProperty: 'environmentIds',
74 | localKey: 'projectId',
75 | foreignKey: 'environmentId'
76 | }))
77 | .action('DETACH_ENVIRONMENT', detachReducer({
78 | type: 'projects',
79 | listProperty: 'environmentIds',
80 | localKey: 'projectId',
81 | foreignKey: 'environmentId'
82 | }))
83 | .action('ATTACH_HISTORY_QUERY', attachReducer({
84 | type: 'projects',
85 | listProperty: 'historyQueryIds',
86 | localKey: 'projectId',
87 | foreignKey: 'queryId'
88 | }))
89 | .action('DETACH_HISTORY_QUERY', detachReducer({
90 | type: 'projects',
91 | listProperty: 'historyQueryIds',
92 | localKey: 'projectId',
93 | foreignKey: 'queryId'
94 | }))
95 | .action('ATTACH_COLLECTION_QUERY', attachReducer({
96 | type: 'projects',
97 | listProperty: 'collectionQueryIds',
98 | localKey: 'projectId',
99 | foreignKey: 'queryId'
100 | }))
101 | .action('DETACH_COLLECTION_QUERY', detachReducer({
102 | type: 'projects',
103 | listProperty: 'collectionQueryIds',
104 | localKey: 'projectId',
105 | foreignKey: 'queryId'
106 | }))
107 | )
108 | .collection(new DataCollection('tabs')
109 | .createAction()
110 | .updateAction()
111 | .removeAction()
112 | )
113 | .collection(new DataCollection('environments')
114 | .createAction()
115 | .updateAction()
116 | .removeAction()
117 | )
118 | .collection(new DataCollection('queries')
119 | .createAction()
120 | .updateAction()
121 | .removeAction()
122 | )
123 | }
--------------------------------------------------------------------------------
/src/app/services/database.js:
--------------------------------------------------------------------------------
1 | import Datastore from "nedb"
2 | import electron from "electron"
3 |
4 | export default () => {
5 |
6 | const dataPath = electron.remote.app.getPath('userData')
7 |
8 | return {
9 | projects: new Datastore({ filename: dataPath + '/projects', autoload: true }),
10 | queries: new Datastore({ filename: dataPath + '/queries', autoload: true })
11 | }
12 | }
--------------------------------------------------------------------------------
/src/app/services/factories.js:
--------------------------------------------------------------------------------
1 | import {Map, List} from "immutable"
2 | import uuid from "uuid"
3 | import moment from "moment"
4 |
5 | export default () => {
6 |
7 | return {
8 | createQuery() {
9 |
10 | return Map({
11 | id: uuid.v4(),
12 | type: null,
13 | title: null,
14 | operationName: null,
15 | operationType: null,
16 | query: null,
17 | variables: null,
18 | response: null,
19 | duration: null,
20 | headers: Map({}),
21 | updatedAt: moment().utc().toISOString(),
22 | createdAt: moment().utc().toISOString()
23 | })
24 | },
25 | createEnvironment() {
26 |
27 | return Map({
28 | id: uuid.v4(),
29 | title: 'Default',
30 | url: '',
31 | queryMethod: 'POST',
32 | variables: Map({}),
33 | headers: Map({}),
34 | schemaResponse: null,
35 | schemaUpdatedAt: null
36 | })
37 | },
38 | createProject() {
39 |
40 | return Map({
41 | id: uuid.v4(),
42 | title: '',
43 | description: '',
44 | activeEnvironmentId: null,
45 | activeTabId: null,
46 | leftPanel: null,
47 | rightPanel: null,
48 | bottomPanel: null,
49 | bottomPanelHeight: 200,
50 | headers: Map(),
51 | tabIds: List(),
52 | environmentIds: List(),
53 | historyQueryIds: List(),
54 | collectionQueryIds: List()
55 | })
56 | },
57 | createTab() {
58 |
59 | return Map({
60 | id: uuid.v4(),
61 | queryId: '',
62 | loading: false
63 | })
64 | }
65 | }
66 | }
--------------------------------------------------------------------------------
/src/app/services/history.js:
--------------------------------------------------------------------------------
1 | import {hashHistory} from "react-router"
2 |
3 | export default () => {
4 | return hashHistory
5 | }
--------------------------------------------------------------------------------
/src/app/services/queries.js:
--------------------------------------------------------------------------------
1 | import omitBy from "lodash/omitBy"
2 | import isEmpty from "lodash/isEmpty"
3 | import isNil from "lodash/isNil"
4 | import merge from "lodash/merge"
5 | import querystring from "querystring"
6 | import {introspectionQuery} from "graphql"
7 |
8 | export default (db) => {
9 |
10 | function fetchSchema({url, method, headers}) {
11 |
12 | return fetchQuery({
13 | url,
14 | method,
15 | headers,
16 | params: {
17 | query: introspectionQuery
18 | }
19 | })
20 | }
21 |
22 | function fetchQuery({params, url, method, headers}) {
23 |
24 | params = omitBy(params, isNil)
25 | params = omitBy(params, isEmpty)
26 |
27 | let options = {
28 | method,
29 | credentials: 'include'
30 | }
31 |
32 | if (method == "GET") {
33 |
34 | options.headers = merge({}, headers)
35 |
36 | url += url.indexOf('?') == -1 ? "?" : "&"
37 |
38 | url += querystring.stringify(params)
39 | }
40 |
41 | else {
42 |
43 | options.headers = merge({
44 | 'content-type': 'application/json'
45 | }, headers)
46 |
47 | options.body = JSON.stringify(params)
48 | }
49 |
50 | return fetch(url, options)
51 | .then(res => res.text())
52 | .then(res => {
53 |
54 | try {
55 | return JSON.parse(res)
56 | } catch (e) {
57 | return {
58 | data: null,
59 | errors: [{
60 | message: res
61 | }]
62 | }
63 | }
64 | })
65 | }
66 |
67 | return {
68 | fetchSchema,
69 | fetchQuery
70 | }
71 | }
--------------------------------------------------------------------------------
/src/app/services/selectors.js:
--------------------------------------------------------------------------------
1 | import moment from "moment"
2 | import {List} from "immutable"
3 |
4 | export default () => {
5 |
6 | function findQuery(state, {id}) {
7 | return state.getIn(['dataStore', 'queriesById', id])
8 | }
9 |
10 | function findEnvironment(state, {id}) {
11 | return state.getIn(['dataStore', 'environmentsById', id])
12 | }
13 |
14 | function findTab(state, {id}) {
15 | const tab = state.getIn(['dataStore', 'tabsById', id])
16 | return tab ? readTab(state, tab) : null
17 | }
18 |
19 | function findProject(state, {id}) {
20 | const project = state.getIn(['dataStore', 'projectsById', id])
21 | return project ? readProject(state, project) : null
22 | }
23 |
24 | function allProjects(state) {
25 | return state.getIn(['dataStore', 'projects'])
26 | .map(id => findProject(state, {id}))
27 | }
28 |
29 | function readTab(state, tab) {
30 |
31 | const queryId = tab.get('collectionQueryId') || tab.get('historyQueryId')
32 |
33 | return tab.merge({
34 | queryId: queryId,
35 | query: findQuery(state, {id: queryId}),
36 | collectionQuery: findQuery(state, {id: tab.get('collectionQueryId')}),
37 | historyQuery: findQuery(state, {id: tab.get('historyQueryId')})
38 | })
39 | }
40 |
41 | function readProject(state, project) {
42 |
43 | const historyQueries = project.get('historyQueryIds').map(id => {
44 | return findQuery(state, {id})
45 | })
46 |
47 | const collectionQueries = project.get('collectionQueryIds').map(id => {
48 | return findQuery(state, {id})
49 | })
50 |
51 | let queries = List()
52 |
53 | switch (project.get('leftPanel')) {
54 | case 'COLLECTION':
55 | queries = collectionQueries
56 | break
57 | case 'HISTORY':
58 | queries = historyQueries
59 | break
60 | }
61 |
62 | queries = queries.sort((a, b) => {
63 | return b.get('updatedAt').localeCompare(a.get('updatedAt'))
64 | })
65 |
66 | queries = queries.map(query => query.merge({
67 | title: query.get('operationName') || '',
68 | shortname: (query.get('operationType') || "").substring(0, 2),
69 | meta: moment(query.get('updatedAt')).from(moment()),
70 | subMeta: query.get('duration') ? query.get('duration') + 'ms' : null,
71 | }))
72 |
73 | return project.merge({
74 | activeEnvironment: findEnvironment(state, {
75 | id: project.get('activeEnvironmentId')
76 | }),
77 | activeTab: findTab(state, {
78 | id: project.get('activeTabId')
79 | }),
80 | tabs: project.get('tabIds').map(id => {
81 | return findTab(state, {id})
82 | }),
83 | collectionQueries,
84 | historyQueries,
85 | queries,
86 | environments: project.get('environmentIds').map(id => {
87 | return findEnvironment(state, {id})
88 | })
89 | })
90 | }
91 |
92 | return {
93 | allProjects,
94 | findProject,
95 | findEnvironment,
96 | findQuery,
97 | findTab
98 | }
99 | }
--------------------------------------------------------------------------------
/src/app/services/store.js:
--------------------------------------------------------------------------------
1 | import electron from "electron"
2 | import {fromJS, Map} from "immutable"
3 | import {createStore, applyMiddleware, compose} from "redux"
4 | import thunk from "redux-thunk"
5 | import createLogger from "redux-logger"
6 | import isEmpty from "lodash/isEmpty"
7 | import fs from "fs"
8 |
9 | export default (rootReducer, dataStore, actualizeState) => {
10 |
11 | const dataPath = electron.remote.app.getPath('userData')
12 | const filePath = dataPath + '/state.json'
13 |
14 | function writeState(state) {
15 | fs.writeFileSync(filePath, JSON.stringify(state, null, 4), 'utf-8')
16 | }
17 |
18 | let state = Map()
19 |
20 | if (fs.existsSync(filePath)) {
21 | let storedState = fs.readFileSync(filePath, 'utf-8')
22 |
23 | if (!isEmpty(storedState)) {
24 | storedState = JSON.parse(storedState)
25 | }
26 |
27 | if (storedState) {
28 | state = fromJS(storedState)
29 | }
30 | }
31 |
32 |
33 | const initialState = actualizeState(state)
34 |
35 | if (initialState !== state) {
36 | writeState(initialState)
37 | }
38 |
39 | const logger = createLogger()
40 |
41 | const createStoreWithMiddleware = applyMiddleware(thunk, logger)(createStore)
42 |
43 | const store = createStoreWithMiddleware(rootReducer, initialState, window.__REDUX_DEVTOOLS_EXTENSION__ && window.__REDUX_DEVTOOLS_EXTENSION__({
44 | actionCreators: dataStore.getFlatActionCreators()
45 | }))
46 |
47 | store.subscribe(() => {
48 | const state = store.getState().toJSON()
49 | writeState(state)
50 | })
51 |
52 | return store
53 | }
--------------------------------------------------------------------------------
/src/app/utils/apply-variables-to-headers.js:
--------------------------------------------------------------------------------
1 | export default function applyVariablesToHeaders(variables, headers) {
2 |
3 | return headers.reduce((result, headerValue, headerKey) => {
4 |
5 | variables.forEach((varValue, varKey) => {
6 | headerValue = headerValue.replace(`{{${varKey}}}`, varValue)
7 | })
8 |
9 | result[headerKey] = headerValue
10 |
11 | return result
12 | }, {})
13 | }
--------------------------------------------------------------------------------
/src/app/utils/create-modal.jsx:
--------------------------------------------------------------------------------
1 | import React from "react"
2 |
3 | export default (Component) => {
4 |
5 | return class Modal extends React.Component {
6 |
7 | state = {
8 | open: false,
9 | additionalProps: null
10 | }
11 |
12 | render() {
13 |
14 | return (
15 |
16 | {this.state.open ? (
17 |
23 | ) : null}
24 |
25 | )
26 | }
27 |
28 | open(additionalProps) {
29 |
30 | return new Promise((resolve, reject) => {
31 | this.reject = reject
32 | this.resolve = resolve
33 |
34 | this.setState({
35 | open: true,
36 | additionalProps
37 | })
38 | })
39 | }
40 |
41 | close = (status, payload) => {
42 |
43 | this.setState({
44 | open: false,
45 | additionalProps: null
46 | }, () => {
47 |
48 | if (this.resolve) {
49 | this.resolve({
50 | status: status || 'CLOSED',
51 | payload
52 | })
53 | }
54 | })
55 | }
56 |
57 | dismiss = (err) => {
58 |
59 | this.setState({
60 | open: false,
61 | additionalProps: null
62 | }, () => {
63 |
64 | if (this.reject) {
65 | this.reject(err)
66 | }
67 | })
68 | }
69 | }
70 | }
--------------------------------------------------------------------------------
/src/app/utils/get-defined.js:
--------------------------------------------------------------------------------
1 | import isUndefined from "lodash/isUndefined"
2 | import reduce from "lodash/reduce"
3 |
4 | export default function getDefined(input, whitelist) {
5 |
6 | return reduce(whitelist, (result, key) => {
7 |
8 | if (isUndefined(input[key])) {
9 | return result
10 | }
11 |
12 | result[key] = input[key]
13 |
14 | return result
15 | }, {})
16 | }
--------------------------------------------------------------------------------
/src/index.jsx:
--------------------------------------------------------------------------------
1 | import createDi from "app/di"
2 | import bootstrap from "app/bootstrap"
3 |
4 | const di = createDi()
5 |
6 | bootstrap(di)
7 |
8 | const app = di.get('app')
9 |
10 | app.run()
--------------------------------------------------------------------------------
/webpack.config.js:
--------------------------------------------------------------------------------
1 | var path = require('path')
2 | var webpack = require('webpack')
3 |
4 | var options = {
5 | // devtool: 'eval-source-map',
6 | entry: {
7 | vendor: [
8 | 'babel-polyfill',
9 | 'react',
10 | 'react-dom',
11 | 'react-router',
12 | 'sweetalert/dist/sweetalert.css'
13 | ],
14 | app: './src/index.jsx'
15 | },
16 | target: 'electron-renderer',
17 | output: {
18 | filename: "[name].js",
19 | path: path.resolve(__dirname, 'dist')
20 | },
21 | resolve: {
22 | modules: [
23 | path.resolve(__dirname) + '/src',
24 | 'node_modules'
25 | ],
26 | extensions: ['.webpack.js', '.web.js', '.js', '.jsx']
27 | },
28 | module: {
29 | rules: [
30 | {
31 | test: /\.jsx?$/,
32 | exclude: /node_modules/,
33 | loader: require.resolve('babel-loader'),
34 | options: {
35 | presets: [
36 | require.resolve('babel-preset-es2015'),
37 | require.resolve('babel-preset-react')
38 | ],
39 | plugins: [
40 | require.resolve('babel-plugin-transform-class-properties'),
41 | require.resolve('babel-plugin-syntax-async-functions'),
42 | require.resolve('babel-plugin-transform-regenerator'),
43 | require.resolve('babel-plugin-transform-object-rest-spread')
44 | ]
45 | }
46 | },
47 | {
48 | test: /\.css$/,
49 | use: [
50 | "style-loader",
51 | "css-loader"
52 | ]
53 | },
54 | {
55 | test: /\.png$/,
56 | loader: "url-loader",
57 | options: {
58 | limit: '100000'
59 | }
60 | },
61 | {
62 | test: /\.jpg$/,
63 | loader: "file-loader"
64 | }
65 | ]
66 | },
67 | plugins: [
68 | new webpack.ContextReplacementPlugin(/moment[\\\/]locale$/, /^\.\/(en|nl)$/),
69 | new webpack.optimize.CommonsChunkPlugin({
70 | name: 'vendor',
71 | filename: "[name].js"
72 | }),
73 | new webpack.ProvidePlugin({
74 | $: "jquery",
75 | jQuery: "jquery",
76 | "window.jQuery": "jquery"
77 | }),
78 | new webpack.DefinePlugin({
79 | 'process.env.NODE_ENV': JSON.stringify(process.env.NODE_ENV || 'development')
80 | })
81 | ]
82 | }
83 |
84 | module.exports = options
85 |
--------------------------------------------------------------------------------